[SCM] eclipse-mylyn - Plug-in for eclipse - Debian package. branch, master, updated. 0b3d2ace754172cabf07fe09c4daef33103c64a9
Benjamin Drung
bdrung-guest at alioth.debian.org
Mon Oct 19 21:29:19 UTC 2009
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "eclipse-mylyn - Plug-in for eclipse - Debian package.".
The branch, master has been updated
via 0b3d2ace754172cabf07fe09c4daef33103c64a9 (commit)
via 7eb9690c07ebfa38d5df73adcf03cb1f260a0d97 (commit)
from e340a7b5498067097170e792da38e515a4a2cc4f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 0b3d2ace754172cabf07fe09c4daef33103c64a9
Merge: e340a7b5498067097170e792da38e515a4a2cc4f 7eb9690c07ebfa38d5df73adcf03cb1f260a0d97
Author: Benjamin Drung <bdrung at ubuntu.com>
Date: Mon Oct 19 23:28:28 2009 +0200
Merge branch 'upstream'
-----------------------------------------------------------------------
Summary of changes:
org.eclipse.mylyn-feature/.project | 17 +
.../.refactorings/2007/3/12/refactorings.history | 4 +
.../.refactorings/2007/3/12/refactorings.index | 1 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn-feature/about.html | 27 +
org.eclipse.mylyn-feature/build.properties | 19 +
org.eclipse.mylyn-feature/epl-v10.html | 328 +
.../feature-compatibility.xml | 459 +
org.eclipse.mylyn-feature/feature.properties | 50 +
org.eclipse.mylyn-feature/feature.xml | 174 +
org.eclipse.mylyn-feature/license.html | 79 +
org.eclipse.mylyn.bugzilla-feature/.project | 17 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.bugzilla-feature/about.html | 27 +
.../build.properties | 17 +
org.eclipse.mylyn.bugzilla-feature/epl-v10.html | 328 +
.../feature.properties | 48 +
org.eclipse.mylyn.bugzilla-feature/feature.xml | 58 +
org.eclipse.mylyn.bugzilla-feature/license.html | 79 +
org.eclipse.mylyn.bugzilla.core/.classpath | 15 +
org.eclipse.mylyn.bugzilla.core/.cvsignore | 3 +
org.eclipse.mylyn.bugzilla.core/.project | 34 +
.../.refactorings/2006/10/41/refactorings.history | 14 +
.../.refactorings/2006/10/41/refactorings.index | 11 +
.../.refactorings/2006/10/43/refactorings.history | 10 +
.../.refactorings/2006/10/43/refactorings.index | 7 +
.../.refactorings/2006/10/44/refactorings.history | 4 +
.../.refactorings/2006/10/44/refactorings.index | 1 +
.../.refactorings/2006/11/44/refactorings.history | 29 +
.../.refactorings/2006/11/44/refactorings.index | 26 +
.../.refactorings/2006/11/46/refactorings.history | 6 +
.../.refactorings/2006/11/46/refactorings.index | 3 +
.../.refactorings/2006/11/47/refactorings.history | 4 +
.../.refactorings/2006/11/47/refactorings.index | 1 +
.../.refactorings/2006/11/48/refactorings.history | 12 +
.../.refactorings/2006/11/48/refactorings.index | 8 +
.../.refactorings/2006/12/49/refactorings.history | 9 +
.../.refactorings/2006/12/49/refactorings.index | 6 +
.../.refactorings/2006/12/50/refactorings.history | 4 +
.../.refactorings/2006/12/50/refactorings.index | 1 +
.../.refactorings/2006/2/7/refactorings.history | 4 +
.../.refactorings/2006/2/7/refactorings.index | 1 +
.../.refactorings/2006/2/8/refactorings.history | 7 +
.../.refactorings/2006/2/8/refactorings.index | 4 +
.../.refactorings/2006/3/13/refactorings.history | 6 +
.../.refactorings/2006/3/13/refactorings.index | 3 +
.../.refactorings/2006/4/17/refactorings.history | 6 +
.../.refactorings/2006/4/17/refactorings.index | 3 +
.../.refactorings/2006/5/19/refactorings.history | 9 +
.../.refactorings/2006/5/19/refactorings.index | 6 +
.../.refactorings/2006/6/22/refactorings.history | 5 +
.../.refactorings/2006/6/22/refactorings.index | 2 +
.../.refactorings/2006/6/25/refactorings.history | 5 +
.../.refactorings/2006/6/25/refactorings.index | 2 +
.../.refactorings/2006/7/27/refactorings.history | 4 +
.../.refactorings/2006/7/27/refactorings.index | 1 +
.../.refactorings/2006/7/28/refactorings.history | 7 +
.../.refactorings/2006/7/28/refactorings.index | 4 +
.../.refactorings/2006/7/29/refactorings.history | 4 +
.../.refactorings/2006/7/29/refactorings.index | 1 +
.../.refactorings/2006/7/30/refactorings.history | 4 +
.../.refactorings/2006/7/30/refactorings.index | 1 +
.../.refactorings/2006/8/31/refactorings.history | 5 +
.../.refactorings/2006/8/31/refactorings.index | 2 +
.../.refactorings/2006/8/32/refactorings.history | 6 +
.../.refactorings/2006/8/32/refactorings.index | 3 +
.../.refactorings/2006/8/34/refactorings.history | 4 +
.../.refactorings/2006/8/34/refactorings.index | 1 +
.../.refactorings/2006/9/38/refactorings.history | 4 +
.../.refactorings/2006/9/38/refactorings.index | 1 +
.../.refactorings/2006/9/39/refactorings.history | 5 +
.../.refactorings/2006/9/39/refactorings.index | 2 +
.../.refactorings/2007/1/2/refactorings.history | 14 +
.../.refactorings/2007/1/2/refactorings.index | 11 +
.../.refactorings/2007/1/4/refactorings.history | 7 +
.../.refactorings/2007/1/4/refactorings.index | 4 +
.../.refactorings/2007/10/40/refactorings.history | 3 +
.../.refactorings/2007/10/40/refactorings.index | 2 +
.../.refactorings/2007/10/41/refactorings.history | 4 +
.../.refactorings/2007/10/41/refactorings.index | 1 +
.../.refactorings/2007/12/49/refactorings.history | 3 +
.../.refactorings/2007/12/49/refactorings.index | 2 +
.../.refactorings/2007/2/6/refactorings.history | 5 +
.../.refactorings/2007/2/6/refactorings.index | 2 +
.../.refactorings/2007/2/7/refactorings.history | 11 +
.../.refactorings/2007/2/7/refactorings.index | 8 +
.../.refactorings/2007/2/8/refactorings.history | 4 +
.../.refactorings/2007/2/8/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 4 +
.../.refactorings/2007/5/22/refactorings.index | 1 +
.../.refactorings/2007/6/22/refactorings.history | 4 +
.../.refactorings/2007/6/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.refactorings/2007/6/24/refactorings.history | 5 +
.../.refactorings/2007/6/24/refactorings.index | 2 +
.../.refactorings/2007/6/25/refactorings.history | 5 +
.../.refactorings/2007/6/25/refactorings.index | 2 +
.../.refactorings/2007/8/32/refactorings.history | 5 +
.../.refactorings/2007/8/32/refactorings.index | 2 +
.../.refactorings/2008/12/51/refactorings.history | 3 +
.../.refactorings/2008/12/51/refactorings.index | 11 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 2 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 3 +
.../.refactorings/2008/5/20/refactorings.history | 3 +
.../.refactorings/2008/5/20/refactorings.index | 4 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 2 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 15 +
.../.refactorings/2008/6/23/refactorings.history | 3 +
.../.refactorings/2008/6/23/refactorings.index | 2 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 13 +
.../.refactorings/2008/9/37/refactorings.history | 4 +
.../.refactorings/2008/9/37/refactorings.index | 1 +
.../.refactorings/2009/2/6/refactorings.history | 3 +
.../.refactorings/2009/2/6/refactorings.index | 7 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 18 +
org.eclipse.mylyn.bugzilla.core/about.html | 27 +
org.eclipse.mylyn.bugzilla.core/build-user.xml | 3 +
org.eclipse.mylyn.bugzilla.core/build.properties | 16 +
org.eclipse.mylyn.bugzilla.core/plugin.properties | 3 +
org.eclipse.mylyn.bugzilla.core/plugin.xml | 13 +
.../schema/languages.exsd | 116 +
.../bugzilla/core/AbstractReportFactory.java | 134 +
.../bugzilla/core/BugzillaAttachmentMapper.java | 102 +
.../internal/bugzilla/core/BugzillaAttribute.java | 233 +
.../bugzilla/core/BugzillaAttributeMapper.java | 400 +
.../internal/bugzilla/core/BugzillaClient.java | 1999 +++
.../bugzilla/core/BugzillaClientFactory.java | 40 +
.../bugzilla/core/BugzillaClientManager.java | 85 +
.../internal/bugzilla/core/BugzillaCorePlugin.java | 447 +
.../bugzilla/core/BugzillaCustomField.java | 101 +
.../mylyn/internal/bugzilla/core/BugzillaFlag.java | 116 +
.../internal/bugzilla/core/BugzillaFlagMapper.java | 136 +
.../bugzilla/core/BugzillaLanguageSettings.java | 107 +
.../internal/bugzilla/core/BugzillaOperation.java | 67 +
.../bugzilla/core/BugzillaRepositoryConnector.java | 569 +
.../bugzilla/core/BugzillaRepositoryResponse.java | 53 +
.../internal/bugzilla/core/BugzillaStatus.java | 111 +
.../core/BugzillaTaskAttachmentHandler.java | 101 +
.../bugzilla/core/BugzillaTaskDataHandler.java | 693 +
.../internal/bugzilla/core/BugzillaVersion.java | 127 +
.../internal/bugzilla/core/GzipGetMethod.java | 70 +
.../internal/bugzilla/core/GzipPostMethod.java | 69 +
.../internal/bugzilla/core/IBugzillaConstants.java | 273 +
.../internal/bugzilla/core/KeywordParser.java | 7 +
.../mylyn/internal/bugzilla/core/Messages.java | 255 +
.../bugzilla/core/MultiBugReportFactory.java | 62 +
.../bugzilla/core/RepositoryConfiguration.java | 710 +
.../core/RepositoryConfigurationFactory.java | 57 +
.../core/RepositoryQueryResultsFactory.java | 42 +
.../core/SaxBugzillaQueryContentHandler.java | 106 +
.../core/SaxConfigurationContentHandler.java | 593 +
.../core/SaxMultiBugReportContentHandler.java | 653 +
.../core/UnrecognizedReponseException.java | 26 +
.../mylyn/internal/bugzilla/core/XmlCleaner.java | 71 +
.../bugzilla/core/history/AssignmentEvent.java | 38 +
.../bugzilla/core/history/AttachmentEvent.java | 160 +
.../bugzilla/core/history/AttachmentFlag.java | 48 +
.../bugzilla/core/history/AttachmentFlagState.java | 19 +
.../core/history/AttachmentFlagStatus.java | 19 +
.../core/history/BugzillaTaskHistoryParser.java | 236 +
.../internal/bugzilla/core/history/Messages.java | 31 +
.../bugzilla/core/history/ResolutionEvent.java | 42 +
.../bugzilla/core/history/ResolutionType.java | 98 +
.../bugzilla/core/history/StatusEvent.java | 37 +
.../internal/bugzilla/core/history/StatusType.java | 101 +
.../bugzilla/core/history/TaskHistory.java | 118 +
.../bugzilla/core/history/TaskRevision.java | 118 +
.../bugzilla/core/history/messages.properties | 2 +
.../internal/bugzilla/core/messages.properties | 122 +
.../mylyn/internal/bugzilla/core/service/temp.txt | 1 +
org.eclipse.mylyn.bugzilla.ide/.classpath | 14 +
org.eclipse.mylyn.bugzilla.ide/.cvsignore | 1 +
org.eclipse.mylyn.bugzilla.ide/.project | 34 +
.../.refactorings/2007/11/46/refactorings.history | 3 +
.../.refactorings/2007/11/46/refactorings.index | 2 +
.../.refactorings/2008/1/2/refactorings.history | 4 +
.../.refactorings/2008/1/2/refactorings.index | 1 +
.../.refactorings/2008/12/51/refactorings.history | 3 +
.../.refactorings/2008/12/51/refactorings.index | 3 +
.../.refactorings/2008/2/8/refactorings.history | 3 +
.../.refactorings/2008/2/8/refactorings.index | 4 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 3 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 11 +
org.eclipse.mylyn.bugzilla.ide/about.html | 27 +
org.eclipse.mylyn.bugzilla.ide/build.properties | 17 +
.../icons/branding32/eclipse.png | Bin 0 -> 4594 bytes
org.eclipse.mylyn.bugzilla.ide/plugin.properties | 10 +
org.eclipse.mylyn.bugzilla.ide/plugin.xml | 83 +
org.eclipse.mylyn.bugzilla.tests/.classpath | 15 +
org.eclipse.mylyn.bugzilla.tests/.cvsignore | 2 +
org.eclipse.mylyn.bugzilla.tests/.project | 34 +
.../.refactorings/2006/11/44/refactorings.history | 5 +
.../.refactorings/2006/11/44/refactorings.index | 2 +
.../.refactorings/2006/12/49/refactorings.history | 7 +
.../.refactorings/2006/12/49/refactorings.index | 4 +
.../.refactorings/2006/2/8/refactorings.history | 4 +
.../.refactorings/2006/2/8/refactorings.index | 1 +
.../.refactorings/2006/3/9/refactorings.history | 4 +
.../.refactorings/2006/3/9/refactorings.index | 1 +
.../.refactorings/2006/6/23/refactorings.history | 5 +
.../.refactorings/2006/6/23/refactorings.index | 2 +
.../.refactorings/2006/6/24/refactorings.index | 9 +
.../.refactorings/2006/7/28/refactorings.history | 8 +
.../.refactorings/2006/7/28/refactorings.index | 5 +
.../.refactorings/2006/7/30/refactorings.history | 4 +
.../.refactorings/2006/7/30/refactorings.index | 1 +
.../.refactorings/2006/8/31/refactorings.history | 7 +
.../.refactorings/2006/8/31/refactorings.index | 4 +
.../.refactorings/2006/8/33/refactorings.history | 4 +
.../.refactorings/2006/8/33/refactorings.index | 1 +
.../.refactorings/2006/8/34/refactorings.history | 6 +
.../.refactorings/2006/8/34/refactorings.index | 3 +
.../.refactorings/2007/1/3/refactorings.history | 5 +
.../.refactorings/2007/1/3/refactorings.index | 2 +
.../.refactorings/2007/2/7/refactorings.history | 5 +
.../.refactorings/2007/2/7/refactorings.index | 2 +
.../.refactorings/2007/2/8/refactorings.history | 5 +
.../.refactorings/2007/2/8/refactorings.index | 2 +
.../.refactorings/2007/2/9/refactorings.history | 5 +
.../.refactorings/2007/2/9/refactorings.index | 2 +
.../.refactorings/2007/4/14/refactorings.history | 5 +
.../.refactorings/2007/4/14/refactorings.index | 2 +
.../.refactorings/2007/6/23/refactorings.history | 4 +
.../.refactorings/2007/6/23/refactorings.index | 1 +
.../.refactorings/2008/10/40/refactorings.history | 3 +
.../.refactorings/2008/10/40/refactorings.index | 7 +
.../.refactorings/2008/12/49/refactorings.history | 4 +
.../.refactorings/2008/12/49/refactorings.index | 1 +
.../.refactorings/2008/4/16/refactorings.history | 4 +
.../.refactorings/2008/4/16/refactorings.index | 1 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 2 +
.../.refactorings/2008/5/21/refactorings.history | 4 +
.../.refactorings/2008/5/21/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 3 +
.../.refactorings/2008/9/38/refactorings.history | 4 +
.../.refactorings/2008/9/38/refactorings.index | 1 +
.../.refactorings/2008/9/39/refactorings.history | 3 +
.../.refactorings/2008/9/39/refactorings.index | 3 +
.../.refactorings/2009/5/19/refactorings.history | 4 +
.../.refactorings/2009/5/19/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.api.tools.prefs | 145 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 35 +
org.eclipse.mylyn.bugzilla.tests/about.html | 27 +
org.eclipse.mylyn.bugzilla.tests/build.properties | 17 +
.../mylyn/bugzilla/tests/AbstractBugzillaTest.java | 187 +
.../mylyn/bugzilla/tests/AllBugzillaTests.java | 50 +
.../bugzilla/tests/BugzillaConfigurationTest.java | 260 +
.../bugzilla/tests/BugzillaDateTimeTests.java | 182 +
.../bugzilla/tests/BugzillaProductParserTest.java | 88 +
.../bugzilla/tests/BugzillaRepository32Test.java | 532 +
.../tests/BugzillaRepositoryConnectorTest.java | 1307 ++
.../bugzilla/tests/BugzillaSearchDialogTest.java | 71 +
.../mylyn/bugzilla/tests/BugzillaSearchTest.java | 119 +
.../bugzilla/tests/BugzillaTaskCompletionTest.java | 107 +
.../tests/BugzillaTaskDataHandlerTest.java | 182 +
.../tests/BugzillaTaskHyperlinkDetectorTest.java | 284 +
.../mylyn/bugzilla/tests/BugzillaTaskListTest.java | 172 +
.../mylyn/bugzilla/tests/BugzillaTestPlugin.java | 100 +
.../mylyn/bugzilla/tests/BugzillaTestUtil.java | 54 +
.../mylyn/bugzilla/tests/BugzillaVersionTest.java | 74 +
.../eclipse/mylyn/bugzilla/tests/EncodingTest.java | 100 +
.../bugzilla/tests/IBugzillaTestConstants.java | 39 +
.../bugzilla/tests/RepositoryEditorWizardTest.java | 189 +
.../tests/RepositoryReportFactoryTest.java | 463 +
.../bugzilla/tests/RepositoryTaskHandleTest.java | 59 +
.../mylyn/bugzilla/tests/TaskEditorTest.java | 119 +
.../bugzilla/tests/TaskListStandaloneTest.java | 190 +
.../bugzilla/tests/headless/BugzillaQueryTest.java | 236 +
.../tests/headless/BugzillaTaskHistoryTest.java | 146 +
.../testdata/configuration/rdfconfig218.txt | 461 +
.../testdata/contexts/.cvsignore | 1 +
.../testdata/pages/bug-1-full.html | 719 +
.../testdata/pages/bug-not-found-eclipse.html | 158 +
.../testdata/pages/bug-not-found-hipikat.html | 142 +
.../testdata/pages/cdt-page.html | 184 +
.../testdata/pages/enter-bug220.html | 441 +
.../testdata/pages/enter-bug2201.html | 493 +
.../testdata/pages/equinox-page.html | 177 +
.../testdata/pages/gmt-page.html | 175 +
.../testdata/pages/hipikat-copy-bug-1-full.html | 157 +
.../testdata/pages/platform-page.html | 299 +
.../pages/product-page-1-product-hipikat.html | 256 +
.../testdata/pages/test-report-220.html | 667 +
.../testdata/pages/test-report-2201.html | 859 ++
.../testdata/pages/test-report-222attachment.html | 859 ++
.../testdata/pages/ve-page.html | 178 +
.../testdata/reports-stacktrace/1.html | 377 +
.../testdata/reports-stacktrace/2.html | 406 +
.../testdata/reports-stacktrace/40152.html | 1228 ++
.../testdata/reports-stacktrace/4548.html | 377 +
.../testdata/reports-stacktrace/4862.html | 401 +
.../testdata/reports-stacktrace/67395.html | 390 +
.../testdata/reports-stacktrace/76146.html | 406 +
.../testdata/reports-stacktrace/76388.html | 426 +
org.eclipse.mylyn.bugzilla.ui/.classpath | 17 +
org.eclipse.mylyn.bugzilla.ui/.cvsignore | 1 +
org.eclipse.mylyn.bugzilla.ui/.project | 34 +
.../.refactorings/2006/10/39/refactorings.history | 5 +
.../.refactorings/2006/10/39/refactorings.index | 2 +
.../.refactorings/2006/10/41/refactorings.history | 4 +
.../.refactorings/2006/10/41/refactorings.index | 1 +
.../.refactorings/2006/10/42/refactorings.history | 4 +
.../.refactorings/2006/10/42/refactorings.index | 1 +
.../.refactorings/2006/10/43/refactorings.history | 10 +
.../.refactorings/2006/10/43/refactorings.index | 6 +
.../.refactorings/2006/11/45/refactorings.history | 5 +
.../.refactorings/2006/11/45/refactorings.index | 2 +
.../.refactorings/2006/11/48/refactorings.history | 7 +
.../.refactorings/2006/11/48/refactorings.index | 4 +
.../.refactorings/2006/12/49/refactorings.history | 4 +
.../.refactorings/2006/12/49/refactorings.index | 1 +
.../.refactorings/2006/2/6/refactorings.history | 13 +
.../.refactorings/2006/2/6/refactorings.index | 10 +
.../.refactorings/2006/2/7/refactorings.history | 16 +
.../.refactorings/2006/2/7/refactorings.index | 13 +
.../.refactorings/2006/2/8/refactorings.history | 5 +
.../.refactorings/2006/2/8/refactorings.index | 2 +
.../.refactorings/2006/3/11/refactorings.history | 6 +
.../.refactorings/2006/3/11/refactorings.index | 3 +
.../.refactorings/2006/3/13/refactorings.history | 5 +
.../.refactorings/2006/3/13/refactorings.index | 2 +
.../.refactorings/2006/3/9/refactorings.history | 6 +
.../.refactorings/2006/3/9/refactorings.index | 3 +
.../.refactorings/2006/4/13/refactorings.history | 4 +
.../.refactorings/2006/4/13/refactorings.index | 1 +
.../.refactorings/2006/4/14/refactorings.history | 4 +
.../.refactorings/2006/4/14/refactorings.index | 1 +
.../.refactorings/2006/5/19/refactorings.history | 8 +
.../.refactorings/2006/5/19/refactorings.index | 5 +
.../.refactorings/2006/5/20/refactorings.history | 6 +
.../.refactorings/2006/5/20/refactorings.index | 3 +
.../.refactorings/2006/6/22/refactorings.history | 5 +
.../.refactorings/2006/6/22/refactorings.index | 2 +
.../.refactorings/2006/6/23/refactorings.history | 8 +
.../.refactorings/2006/6/23/refactorings.index | 5 +
.../.refactorings/2006/6/24/refactorings.history | 5 +
.../.refactorings/2006/6/24/refactorings.index | 2 +
.../.refactorings/2006/6/25/refactorings.history | 10 +
.../.refactorings/2006/6/25/refactorings.index | 7 +
.../.refactorings/2006/6/26/refactorings.history | 6 +
.../.refactorings/2006/6/26/refactorings.index | 3 +
.../.refactorings/2006/7/27/refactorings.history | 5 +
.../.refactorings/2006/7/27/refactorings.index | 2 +
.../.refactorings/2006/7/28/refactorings.history | 5 +
.../.refactorings/2006/7/28/refactorings.index | 2 +
.../.refactorings/2006/7/30/refactorings.history | 6 +
.../.refactorings/2006/7/30/refactorings.index | 3 +
.../.refactorings/2006/8/32/refactorings.history | 18 +
.../.refactorings/2006/8/32/refactorings.index | 15 +
.../.refactorings/2006/8/34/refactorings.history | 10 +
.../.refactorings/2006/8/34/refactorings.index | 7 +
.../.refactorings/2006/8/35/refactorings.history | 6 +
.../.refactorings/2006/8/35/refactorings.index | 2 +
.../.refactorings/2006/9/36/refactorings.history | 6 +
.../.refactorings/2006/9/36/refactorings.index | 3 +
.../.refactorings/2006/9/38/refactorings.history | 5 +
.../.refactorings/2006/9/38/refactorings.index | 2 +
.../.refactorings/2006/9/39/refactorings.history | 4 +
.../.refactorings/2006/9/39/refactorings.index | 1 +
.../.refactorings/2007/1/2/refactorings.history | 5 +
.../.refactorings/2007/1/2/refactorings.index | 1 +
.../.refactorings/2007/1/3/refactorings.history | 4 +
.../.refactorings/2007/1/3/refactorings.index | 1 +
.../.refactorings/2007/1/4/refactorings.history | 5 +
.../.refactorings/2007/1/4/refactorings.index | 2 +
.../.refactorings/2007/11/47/refactorings.history | 3 +
.../.refactorings/2007/11/47/refactorings.index | 2 +
.../.refactorings/2007/2/7/refactorings.history | 8 +
.../.refactorings/2007/2/7/refactorings.index | 5 +
.../.refactorings/2007/2/8/refactorings.history | 5 +
.../.refactorings/2007/2/8/refactorings.index | 2 +
.../.refactorings/2007/3/10/refactorings.history | 5 +
.../.refactorings/2007/3/10/refactorings.index | 2 +
.../.refactorings/2007/3/11/refactorings.history | 7 +
.../.refactorings/2007/3/11/refactorings.index | 4 +
.../.refactorings/2007/3/13/refactorings.history | 5 +
.../.refactorings/2007/3/13/refactorings.index | 2 +
.../.refactorings/2007/4/16/refactorings.history | 4 +
.../.refactorings/2007/4/16/refactorings.index | 1 +
.../.refactorings/2007/5/18/refactorings.history | 6 +
.../.refactorings/2007/5/18/refactorings.index | 3 +
.../.refactorings/2007/5/19/refactorings.history | 5 +
.../.refactorings/2007/5/19/refactorings.index | 2 +
.../.refactorings/2007/5/20/refactorings.history | 4 +
.../.refactorings/2007/5/20/refactorings.index | 1 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 5 +
.../.refactorings/2007/6/25/refactorings.index | 2 +
.../.refactorings/2007/7/28/refactorings.history | 8 +
.../.refactorings/2007/7/28/refactorings.index | 5 +
.../.refactorings/2007/8/35/refactorings.history | 8 +
.../.refactorings/2007/8/35/refactorings.index | 5 +
.../.refactorings/2007/9/39/refactorings.history | 4 +
.../.refactorings/2007/9/39/refactorings.index | 1 +
.../.refactorings/2008/1/2/refactorings.history | 3 +
.../.refactorings/2008/1/2/refactorings.index | 2 +
.../.refactorings/2008/1/5/refactorings.history | 4 +
.../.refactorings/2008/1/5/refactorings.index | 1 +
.../.refactorings/2008/11/45/refactorings.history | 3 +
.../.refactorings/2008/11/45/refactorings.index | 2 +
.../.refactorings/2008/12/50/refactorings.history | 4 +
.../.refactorings/2008/12/50/refactorings.index | 1 +
.../.refactorings/2008/12/51/refactorings.history | 3 +
.../.refactorings/2008/12/51/refactorings.index | 3 +
.../.refactorings/2008/3/13/refactorings.history | 3 +
.../.refactorings/2008/3/13/refactorings.index | 2 +
.../.refactorings/2008/4/15/refactorings.history | 4 +
.../.refactorings/2008/4/15/refactorings.index | 1 +
.../.refactorings/2008/4/17/refactorings.history | 4 +
.../.refactorings/2008/4/17/refactorings.index | 1 +
.../.refactorings/2008/4/18/refactorings.history | 4 +
.../.refactorings/2008/4/18/refactorings.index | 1 +
.../.refactorings/2008/5/20/refactorings.history | 4 +
.../.refactorings/2008/5/20/refactorings.index | 1 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 12 +
.../.refactorings/2008/6/22/refactorings.history | 3 +
.../.refactorings/2008/6/22/refactorings.index | 3 +
.../.refactorings/2008/6/23/refactorings.history | 4 +
.../.refactorings/2008/6/23/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 10 +
.../.refactorings/2009/1/1/refactorings.history | 3 +
.../.refactorings/2009/1/1/refactorings.index | 4 +
.../.refactorings/2009/1/2/refactorings.history | 4 +
.../.refactorings/2009/1/2/refactorings.index | 1 +
.../.refactorings/2009/2/8/refactorings.history | 3 +
.../.refactorings/2009/2/8/refactorings.index | 3 +
.../.refactorings/2009/6/25/refactorings.history | 3 +
.../.refactorings/2009/6/25/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.bugzilla.ui/META-INF/MANIFEST.MF | 31 +
org.eclipse.mylyn.bugzilla.ui/about.html | 27 +
org.eclipse.mylyn.bugzilla.ui/build-user.xml | 3 +
org.eclipse.mylyn.bugzilla.ui/build.properties | 18 +
.../icons/elcl16/bug-comment.gif | Bin 0 -> 343 bytes
.../icons/elcl16/bug-dirty.gif | Bin 0 -> 237 bytes
.../icons/elcl16/bug-favorite.gif | Bin 0 -> 358 bytes
.../icons/elcl16/bug-new.gif | Bin 0 -> 233 bytes
.../icons/elcl16/bug-search-new.gif | Bin 0 -> 596 bytes
.../icons/elcl16/bug-search.gif | Bin 0 -> 583 bytes
.../icons/elcl16/bug-small.gif | Bin 0 -> 132 bytes
org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug.gif | Bin 0 -> 159 bytes
.../icons/elcl16/overlay-conflicting.gif | Bin 0 -> 187 bytes
.../icons/elcl16/overlay-incoming.gif | Bin 0 -> 114 bytes
.../icons/elcl16/overlay-outgoing.gif | Bin 0 -> 64 bytes
.../icons/etool16/task-bug-new.gif | Bin 0 -> 359 bytes
.../icons/etool16/task-bug-refresh.gif | Bin 0 -> 362 bytes
.../icons/etool16/task-bug.gif | Bin 0 -> 339 bytes
.../icons/etool16/task-remote.gif | Bin 0 -> 89 bytes
.../icons/etool16/task-repository-new.gif | Bin 0 -> 339 bytes
.../icons/etool16/task-repository.gif | Bin 0 -> 216 bytes
.../icons/eview16/bugzilla-logo.gif | Bin 0 -> 1026 bytes
.../icons/eview16/overlay-bug.gif | Bin 0 -> 77 bytes
.../icons/eview16/overlay-bugzilla.gif | Bin 0 -> 275 bytes
.../icons/eview16/overlay-critical.gif | Bin 0 -> 105 bytes
.../icons/eview16/overlay-enhancement.gif | Bin 0 -> 81 bytes
.../icons/eview16/overlay-feature.gif | Bin 0 -> 78 bytes
.../icons/eview16/overlay-major.gif | Bin 0 -> 77 bytes
.../icons/eview16/overlay-minor.gif | Bin 0 -> 77 bytes
.../icons/eview16/overlay-normal.gif | Bin 0 -> 78 bytes
org.eclipse.mylyn.bugzilla.ui/icons/find.gif | Bin 0 -> 157 bytes
.../icons/wizban/bug-wizard.gif | Bin 0 -> 3895 bytes
org.eclipse.mylyn.bugzilla.ui/plugin.properties | 7 +
org.eclipse.mylyn.bugzilla.ui/plugin.xml | 106 +
.../mylyn/internal/bugzilla/ui/BugzillaImages.java | 100 +
.../bugzilla/ui/BugzillaSearchHandler.java | 48 +
.../bugzilla/ui/BugzillaUiExtensionReader.java | 93 +
.../internal/bugzilla/ui/BugzillaUiPlugin.java | 242 +
.../BugzillaNotObsoleteAttachmentAction.java | 24 +
.../action/BugzillaObsoleteAttachmentAction.java | 23 +
.../ui/action/BugzillaUpdateAttachmentAction.java | 115 +
.../internal/bugzilla/ui/action/Messages.java | 32 +
.../bugzilla/ui/action/UpdateAttachmentJob.java | 156 +
.../bugzilla/ui/action/messages.properties | 2 +
.../ui/editor/BugzillaCcAttributeEditor.java | 96 +
.../ui/editor/BugzillaKeywordAttributeEditor.java | 115 +
.../bugzilla/ui/editor/BugzillaPeoplePart.java | 209 +
.../ui/editor/BugzillaPlanningEditorPart.java | 168 +
.../bugzilla/ui/editor/BugzillaTaskEditorPage.java | 409 +
.../ui/editor/BugzillaTaskEditorPageFactory.java | 64 +
.../bugzilla/ui/editor/BugzillaVotesEditor.java | 116 +
.../bugzilla/ui/editor/FlagAttributeEditor.java | 181 +
.../bugzilla/ui/editor/KeywordsDialog.java | 160 +
.../internal/bugzilla/ui/editor/Messages.java | 57 +
.../bugzilla/ui/editor/messages.properties | 20 +
.../bugzilla/ui/search/BugzillaSearchPage.java | 1948 +++
.../ui/search/BugzillaSeveritySearchSorter.java | 79 +
.../ui/search/BugzillaStateSearchSorter.java | 96 +
.../internal/bugzilla/ui/search/Messages.java | 107 +
.../bugzilla/ui/search/messages.properties | 40 +
.../bugzilla/ui/tasklist/BugzillaConnectorUi.java | 221 +
.../ui/tasklist/BugzillaCustomQueryDialog.java | 116 +
.../ui/tasklist/BugzillaCustomQueryWizardPage.java | 126 +
.../ui/tasklist/BugzillaQueryTypeWizardPage.java | 88 +
.../tasklist/BugzillaRepositorySettingsPage.java | 348 +
.../ui/tasklist/BugzillaTaskAttachmentPage.java | 188 +
.../ui/tasklist/BugzillaTaskListMigrator.java | 77 +
.../internal/bugzilla/ui/tasklist/Messages.java | 83 +
.../internal/bugzilla/ui/tasklist/StackTrace.java | 373 +
.../bugzilla/ui/tasklist/messages.properties | 31 +
.../bugzilla/ui/wizard/NewBugzillaTaskWizard.java | 150 +
org.eclipse.mylyn.commons.core/.classpath | 11 +
org.eclipse.mylyn.commons.core/.cvsignore | 1 +
org.eclipse.mylyn.commons.core/.project | 34 +
.../.refactorings/2007/2/5/refactorings.history | 4 +
.../.refactorings/2007/2/5/refactorings.index | 1 +
.../.refactorings/2007/2/6/refactorings.history | 16 +
.../.refactorings/2007/2/6/refactorings.index | 13 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 7 +
.../.refactorings/2007/6/25/refactorings.index | 4 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 4 +
.../.refactorings/2008/4/15/refactorings.index | 1 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 10 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 5 +
.../.refactorings/2008/9/37/refactorings.history | 3 +
.../.refactorings/2008/9/37/refactorings.index | 57 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 69 +
org.eclipse.mylyn.commons.core/about.html | 27 +
org.eclipse.mylyn.commons.core/build.properties | 17 +
org.eclipse.mylyn.commons.core/plugin.properties | 3 +
org.eclipse.mylyn.commons.core/plugin.xml | 5 +
.../schema/errorReporters.exsd | 115 +
.../mylyn/commons/core/AbstractErrorReporter.java | 54 +
.../org/eclipse/mylyn/commons/core/CoreUtil.java | 37 +
.../org/eclipse/mylyn/commons/core/DateUtil.java | 145 +
.../commons/core/DelegatingProgressMonitor.java | 144 +
.../commons/core/IDelegatingProgressMonitor.java | 43 +
.../eclipse/mylyn/commons/core/StatusHandler.java | 96 +
.../commons/core/ErrorReporterManager.java | 121 +
.../commons/core/ICommonsCoreConstants.java | 21 +
.../internal/commons/core/XmlStringConverter.java | 141 +
.../mylyn/internal/commons/core/ZipFileUtil.java | 228 +
.../provisional/commons/core/CommonMessages.java | 43 +
.../provisional/commons/core/messages.properties | 7 +
org.eclipse.mylyn.commons.net/.classpath | 7 +
org.eclipse.mylyn.commons.net/.cvsignore | 1 +
org.eclipse.mylyn.commons.net/.project | 34 +
.../.refactorings/2007/11/48/refactorings.history | 3 +
.../.refactorings/2007/11/48/refactorings.index | 3 +
.../.refactorings/2007/7/27/refactorings.history | 4 +
.../.refactorings/2007/7/27/refactorings.index | 1 +
.../.refactorings/2007/9/37/refactorings.history | 4 +
.../.refactorings/2007/9/37/refactorings.index | 1 +
.../.refactorings/2008/1/4/refactorings.history | 4 +
.../.refactorings/2008/1/4/refactorings.index | 1 +
.../.refactorings/2008/12/50/refactorings.history | 3 +
.../.refactorings/2008/12/50/refactorings.index | 2 +
.../.refactorings/2008/3/10/refactorings.history | 3 +
.../.refactorings/2008/3/10/refactorings.index | 2 +
.../.refactorings/2008/3/9/refactorings.history | 3 +
.../.refactorings/2008/3/9/refactorings.index | 4 +
.../.refactorings/2008/4/14/refactorings.history | 3 +
.../.refactorings/2008/4/14/refactorings.index | 14 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 2 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 4 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 2 +
.../.refactorings/2008/6/23/refactorings.history | 3 +
.../.refactorings/2008/6/23/refactorings.index | 4 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.commons.net/META-INF/MANIFEST.MF | 19 +
org.eclipse.mylyn.commons.net/about.html | 27 +
org.eclipse.mylyn.commons.net/build.properties | 15 +
org.eclipse.mylyn.commons.net/plugin.properties | 3 +
.../mylyn/commons/net/AbstractWebLocation.java | 67 +
.../commons/net/AuthenticationCredentials.java | 91 +
.../mylyn/commons/net/AuthenticationType.java | 30 +
.../mylyn/commons/net/HtmlStreamTokenizer.java | 1143 ++
.../src/org/eclipse/mylyn/commons/net/HtmlTag.java | 374 +
.../eclipse/mylyn/commons/net/IProxyProvider.java | 27 +
.../src/org/eclipse/mylyn/commons/net/Policy.java | 139 +
.../commons/net/UnsupportedRequestException.java | 39 +
.../org/eclipse/mylyn/commons/net/WebLocation.java | 72 +
.../org/eclipse/mylyn/commons/net/WebRequest.java | 27 +
.../src/org/eclipse/mylyn/commons/net/WebUtil.java | 745 +
.../internal/commons/net/AuthenticatedProxy.java | 43 +
.../commons/net/CloneableHostConfiguration.java | 58 +
.../internal/commons/net/CommonsNetPlugin.java | 106 +
.../commons/net/InfiniteSubProgressMonitor.java | 99 +
.../mylyn/internal/commons/net/Messages.java | 35 +
.../internal/commons/net/PollingInputStream.java | 258 +
.../internal/commons/net/PollingOutputStream.java | 238 +
.../commons/net/PollingProtocolSocketFactory.java | 64 +
.../net/PollingSslProtocolSocketFactory.java | 67 +
.../commons/net/ProgressMonitorInputStream.java | 163 +
.../commons/net/SslProtocolSocketFactory.java | 131 +
.../internal/commons/net/TimeoutInputStream.java | 390 +
.../internal/commons/net/TimeoutOutputStream.java | 333 +
.../internal/commons/net/TrustAllTrustManager.java | 36 +
.../mylyn/internal/commons/net/messages.properties | 18 +
org.eclipse.mylyn.commons.ui/.classpath | 12 +
org.eclipse.mylyn.commons.ui/.project | 34 +
.../.refactorings/2008/10/40/refactorings.history | 3 +
.../.refactorings/2008/10/40/refactorings.index | 3 +
.../.refactorings/2008/11/46/refactorings.history | 4 +
.../.refactorings/2008/11/46/refactorings.index | 1 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 60 +
.../.refactorings/2008/5/18/refactorings.history | 4 +
.../.refactorings/2008/5/18/refactorings.index | 1 +
.../.refactorings/2008/5/20/refactorings.history | 5 +
.../.refactorings/2008/5/20/refactorings.index | 2 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 2 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 3 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 2 +
.../.refactorings/2009/1/2/refactorings.history | 4 +
.../.refactorings/2009/1/2/refactorings.index | 1 +
.../.refactorings/2009/2/9/refactorings.history | 4 +
.../.refactorings/2009/2/9/refactorings.index | 1 +
.../.refactorings/2009/4/16/refactorings.history | 4 +
.../.refactorings/2009/4/16/refactorings.index | 1 +
.../.refactorings/2009/4/18/refactorings.history | 3 +
.../.refactorings/2009/4/18/refactorings.index | 5 +
.../.refactorings/2009/5/21/refactorings.history | 4 +
.../.refactorings/2009/5/21/refactorings.index | 1 +
.../.refactorings/2009/5/22/refactorings.history | 4 +
.../.refactorings/2009/5/22/refactorings.index | 1 +
.../.refactorings/2009/6/23/refactorings.history | 4 +
.../.refactorings/2009/6/23/refactorings.index | 1 +
.../.refactorings/2009/6/24/refactorings.history | 4 +
.../.refactorings/2009/6/24/refactorings.index | 1 +
.../.refactorings/2009/6/25/refactorings.history | 3 +
.../.refactorings/2009/6/25/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 344 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.commons.ui/META-INF/MANIFEST.MF | 126 +
org.eclipse.mylyn.commons.ui/about.html | 27 +
org.eclipse.mylyn.commons.ui/build.properties | 8 +
.../icons/draw16/edit_arrow1.gif | Bin 0 -> 857 bytes
.../icons/draw16/edit_arrow2.gif | Bin 0 -> 859 bytes
.../icons/draw16/edit_box.gif | Bin 0 -> 864 bytes
.../icons/draw16/edit_fill_box.gif | Bin 0 -> 857 bytes
.../icons/draw16/edit_fill_oval.gif | Bin 0 -> 857 bytes
.../icons/draw16/edit_fill_rbox.gif | Bin 0 -> 857 bytes
.../icons/draw16/edit_free.gif | Bin 0 -> 855 bytes
.../icons/draw16/edit_line.gif | Bin 0 -> 849 bytes
.../icons/draw16/edit_oval.gif | Bin 0 -> 867 bytes
.../icons/draw16/edit_rbox.gif | Bin 0 -> 864 bytes
.../icons/draw16/line_bold1.gif | Bin 0 -> 848 bytes
.../icons/draw16/line_bold2.gif | Bin 0 -> 851 bytes
.../icons/draw16/line_bold4.gif | Bin 0 -> 859 bytes
.../icons/draw16/line_bold8.gif | Bin 0 -> 866 bytes
.../icons/draw16/line_dash.gif | Bin 0 -> 846 bytes
.../icons/draw16/line_dash1d.gif | Bin 0 -> 848 bytes
.../icons/draw16/line_dash2d.gif | Bin 0 -> 849 bytes
.../icons/draw16/line_dot.gif | Bin 0 -> 848 bytes
.../icons/draw16/line_sold.gif | Bin 0 -> 843 bytes
.../icons/elcl16/blank.gif | Bin 0 -> 55 bytes
.../icons/elcl16/clearDot.gif | Bin 0 -> 43 bytes
.../icons/elcl16/collapseall-small.png | Bin 0 -> 227 bytes
.../icons/elcl16/collapseall.png | Bin 0 -> 192 bytes
.../icons/elcl16/delete.gif | Bin 0 -> 351 bytes
.../icons/elcl16/expandall-small.png | Bin 0 -> 265 bytes
.../icons/elcl16/expandall.gif | Bin 0 -> 164 bytes
.../icons/elcl16/filter-complete.gif | Bin 0 -> 135 bytes
.../icons/elcl16/filter-priority.gif | Bin 0 -> 192 bytes
.../icons/elcl16/refresh-small.gif | Bin 0 -> 146 bytes
.../icons/elcl16/refresh.gif | Bin 0 -> 216 bytes
.../icons/elcl16/remove.gif | Bin 0 -> 163 bytes
.../icons/elcl16/warning.gif | Bin 0 -> 322 bytes
.../icons/etool16/calendar.gif | Bin 0 -> 594 bytes
.../icons/etool16/capture-fit.png | Bin 0 -> 469 bytes
.../icons/etool16/capture-screen-bold.png | Bin 0 -> 699 bytes
.../icons/etool16/capture-screen.png | Bin 0 -> 725 bytes
.../icons/etool16/clear.gif | Bin 0 -> 545 bytes
.../icons/etool16/clipboard_obj.gif | Bin 0 -> 961 bytes
.../icons/etool16/content-assist-separator.gif | Bin 0 -> 85 bytes
.../icons/etool16/copy.png | Bin 0 -> 413 bytes
org.eclipse.mylyn.commons.ui/icons/etool16/cut.gif | Bin 0 -> 212 bytes
.../icons/etool16/discovery.png | Bin 0 -> 596 bytes
.../icons/etool16/edit.gif | Bin 0 -> 533 bytes
.../icons/etool16/file_obj.gif | Bin 0 -> 354 bytes
.../icons/etool16/find-clear-disabled.gif | Bin 0 -> 314 bytes
.../icons/etool16/find-clear.gif | Bin 0 -> 322 bytes
.../icons/etool16/find.gif | Bin 0 -> 553 bytes
.../icons/etool16/go-into.gif | Bin 0 -> 357 bytes
.../icons/etool16/go-up.gif | Bin 0 -> 562 bytes
.../icons/etool16/grouping.gif | Bin 0 -> 572 bytes
.../icons/etool16/link-editor.gif | Bin 0 -> 160 bytes
.../icons/etool16/maximize.png | Bin 0 -> 248 bytes
.../icons/etool16/monitor_obj.gif | Bin 0 -> 572 bytes
.../icons/etool16/open-browser.gif | Bin 0 -> 565 bytes
.../icons/etool16/overlay-repository.gif | Bin 0 -> 80 bytes
.../icons/etool16/person-me-narrow.gif | Bin 0 -> 293 bytes
.../icons/etool16/person-me.gif | Bin 0 -> 307 bytes
.../icons/etool16/person-narrow.gif | Bin 0 -> 294 bytes
.../icons/etool16/person.gif | Bin 0 -> 308 bytes
.../icons/etool16/presentation.gif | Bin 0 -> 101 bytes
.../icons/etool16/preview-web.png | Bin 0 -> 503 bytes
.../icons/etool16/redo_edit.gif | Bin 0 -> 356 bytes
.../icons/etool16/save.gif | Bin 0 -> 639 bytes
.../icons/etool16/schedule-day.png | Bin 0 -> 501 bytes
.../icons/etool16/schedule-week.png | Bin 0 -> 483 bytes
.../icons/etool16/select_rect.gif | Bin 0 -> 880 bytes
.../icons/etool16/sort-down-gray.gif | Bin 0 -> 275 bytes
.../icons/etool16/sort-down.gif | Bin 0 -> 350 bytes
.../icons/etool16/sort-up-gray.gif | Bin 0 -> 275 bytes
.../icons/etool16/sort-up.gif | Bin 0 -> 350 bytes
.../icons/etool16/toolbar-arrow-down.gif | Bin 0 -> 165 bytes
.../icons/etool16/toolbar-arrow-right.gif | Bin 0 -> 167 bytes
.../icons/etool16/undo_edit.gif | Bin 0 -> 355 bytes
.../icons/etool16/view-filter.gif | Bin 0 -> 219 bytes
org.eclipse.mylyn.commons.ui/icons/etool16/web.png | Bin 0 -> 3338 bytes
.../icons/eview16/focus-view.gif | Bin 0 -> 357 bytes
.../icons/eview16/more.png | Bin 0 -> 191 bytes
.../icons/eview16/notification-close-active.gif | Bin 0 -> 88 bytes
.../icons/eview16/notification-close.gif | Bin 0 -> 88 bytes
.../icons/eview16/overlay-completed.gif | Bin 0 -> 106 bytes
.../icons/eview16/overlay-conflict.gif | Bin 0 -> 187 bytes
.../icons/eview16/overlay-has-context.gif | Bin 0 -> 162 bytes
.../icons/eview16/overlay-has-due.gif | Bin 0 -> 179 bytes
.../icons/eview16/overlay-incoming-multiple.gif | Bin 0 -> 301 bytes
.../icons/eview16/overlay-incoming-new.gif | Bin 0 -> 190 bytes
.../icons/eview16/overlay-incoming.gif | Bin 0 -> 178 bytes
.../icons/eview16/overlay-outgoing-new.gif | Bin 0 -> 297 bytes
.../icons/eview16/overlay-outgoing.gif | Bin 0 -> 190 bytes
.../icons/eview16/overlay-overdue.gif | Bin 0 -> 178 bytes
.../icons/eview16/overlay-synch-incoming-new.gif | Bin 0 -> 189 bytes
.../icons/eview16/overlay-synch-incoming.gif | Bin 0 -> 187 bytes
.../icons/eview16/overlay-synch-outgoing.gif | Bin 0 -> 190 bytes
.../icons/eview16/progress/1.png | Bin 0 -> 3410 bytes
.../icons/eview16/progress/2.png | Bin 0 -> 3414 bytes
.../icons/eview16/progress/3.png | Bin 0 -> 3414 bytes
.../icons/eview16/progress/4.png | Bin 0 -> 3414 bytes
.../icons/eview16/progress/5.png | Bin 0 -> 3405 bytes
.../icons/eview16/progress/6.png | Bin 0 -> 3406 bytes
.../icons/eview16/progress/7.png | Bin 0 -> 3401 bytes
.../icons/eview16/progress/8.png | Bin 0 -> 3407 bytes
.../icons/eview16/status-conflict.gif | Bin 0 -> 202 bytes
.../icons/eview16/status-normal.gif | Bin 0 -> 55 bytes
.../icons/eview16/status-server-context.gif | Bin 0 -> 175 bytes
.../icons/obj16/browser-small.gif | Bin 0 -> 519 bytes
.../icons/obj16/calendar-small.gif | Bin 0 -> 318 bytes
.../icons/obj16/complete.gif | Bin 0 -> 116 bytes
.../icons/obj16/file-image.gif | Bin 0 -> 597 bytes
.../icons/obj16/file-plain.png | Bin 0 -> 317 bytes
.../icons/obj16/message_info.gif | Bin 0 -> 267 bytes
.../icons/obj16/priority-1.gif | Bin 0 -> 136 bytes
.../icons/obj16/priority-2.gif | Bin 0 -> 123 bytes
.../icons/obj16/priority-3.gif | Bin 0 -> 50 bytes
.../icons/obj16/priority-4.gif | Bin 0 -> 179 bytes
.../icons/obj16/priority-5.gif | Bin 0 -> 186 bytes
.../icons/obj16/question.gif | Bin 0 -> 373 bytes
.../icons/obj32/priority-critical.png | Bin 0 -> 1400 bytes
.../icons/obj32/priority-high.png | Bin 0 -> 820 bytes
.../icons/obj32/priority-low.png | Bin 0 -> 765 bytes
.../icons/obj32/priority-none.png | Bin 0 -> 305 bytes
.../icons/obj32/priority-normal.png | Bin 0 -> 284 bytes
.../icons/obj32/priority-very-low.png | Bin 0 -> 765 bytes
.../icons/ovr16/overlay-blank.gif | Bin 0 -> 51 bytes
.../icons/ovr16/overlay-complete.gif | Bin 0 -> 106 bytes
.../icons/ovr16/overlay-local-task.gif | Bin 0 -> 162 bytes
.../icons/ovr16/overlay-warning.gif | Bin 0 -> 180 bytes
.../icons/ovr16/solid-white.gif | Bin 0 -> 58 bytes
.../icons/wizban/banner-discovery.png | Bin 0 -> 4291 bytes
.../icons/wizban/banner-export.gif | Bin 0 -> 3220 bytes
.../icons/wizban/banner-import.gif | Bin 0 -> 3247 bytes
.../icons/wizban/banner-screenshot.png | Bin 0 -> 2548 bytes
.../icons/wizban/keylock.gif | Bin 0 -> 1501 bytes
org.eclipse.mylyn.commons.ui/plugin.properties | 3 +
.../mylyn/internal/commons/ui/ColorCanvas.java | 53 +
.../internal/commons/ui/ColorSelectionWindow.java | 120 +
.../mylyn/internal/commons/ui/CommonsUiPlugin.java | 41 +
.../ui/CompositeContainerImageDescriptor.java | 63 +
.../ui/CompositeElementImageDescriptor.java | 70 +
.../commons/ui/CompositeSyncImageDescriptor.java | 63 +
.../mylyn/internal/commons/ui/ControlListItem.java | 267 +
.../internal/commons/ui/ControlListViewer.java | 487 +
.../mylyn/internal/commons/ui/Messages.java | 157 +
.../commons/ui/NotificationPopupColors.java | 189 +
.../internal/commons/ui/ScreenshotImages.java | 99 +
.../internal/commons/ui/SelectToolAction.java | 907 ++
.../eclipse/mylyn/internal/commons/ui/SwtUtil.java | 234 +
.../commons/ui/TaskListImageDescriptor.java | 83 +
.../mylyn/internal/commons/ui/messages.properties | 74 +
.../commons/ui/AbstractFilteredTree.java | 272 +
.../commons/ui/AbstractNotification.java | 43 +
.../commons/ui/AbstractNotificationPopup.java | 627 +
.../commons/ui/AdaptiveRefreshPolicy.java | 129 +
.../provisional/commons/ui/CommonColors.java | 43 +
.../provisional/commons/ui/CommonFonts.java | 106 +
.../provisional/commons/ui/CommonFormUtil.java | 57 +
.../provisional/commons/ui/CommonImages.java | 380 +
.../provisional/commons/ui/CommonTextSupport.java | 313 +
.../provisional/commons/ui/CommonThemes.java | 54 +
.../provisional/commons/ui/CommonUiUtil.java | 222 +
.../provisional/commons/ui/CommonsUiUtil.java | 143 +
.../provisional/commons/ui/DatePicker.java | 295 +
.../provisional/commons/ui/DatePickerPanel.java | 203 +
.../commons/ui/DateSelectionDialog.java | 102 +
.../provisional/commons/ui/DelayedRefreshJob.java | 103 +
.../commons/ui/EnhancedFilteredTree.java | 58 +
.../provisional/commons/ui/GradientCanvas.java | 350 +
.../provisional/commons/ui/GradientToolTip.java | 88 +
.../provisional/commons/ui/ICoreRunnable.java | 23 +
.../commons/ui/IFilteredTreeListener.java | 21 +
.../provisional/commons/ui/ScalingHyperlink.java | 105 +
.../commons/ui/ScreenshotCreationPage.java | 1737 +++
.../commons/ui/SelectionProviderAdapter.java | 78 +
.../commons/ui/SubstringPatternFilter.java | 29 +
.../commons/ui/WorkbenchActionSupport.java | 255 +
.../provisional/commons/ui/WorkbenchUtil.java | 239 +
.../commons/ui/editor/EditorBusyIndicator.java | 139 +
.../provisional/commons/ui/editor/IBusyEditor.java | 39 +
org.eclipse.mylyn.compatibility/.classpath | 7 +
org.eclipse.mylyn.compatibility/.cvsignore | 1 +
org.eclipse.mylyn.compatibility/.project | 34 +
.../.refactorings/2007/6/23/refactorings.history | 4 +
.../.refactorings/2007/6/23/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 8 +
.../.refactorings/2007/6/25/refactorings.index | 5 +
.../.settings/org.eclipse.jdt.core.prefs | 331 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 12 +
org.eclipse.mylyn.compatibility/about.html | 27 +
org.eclipse.mylyn.compatibility/build.properties | 16 +
org.eclipse.mylyn.compatibility/plugin.properties | 3 +
org.eclipse.mylyn.compatibility/plugin.xml | 10 +
.../compatibility/JavaRuntimeVersionChecker.java | 70 +
.../mylyn/internal/compatibility/Messages.java | 31 +
.../internal/compatibility/messages.properties | 3 +
org.eclipse.mylyn.context-feature/.project | 17 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.context-feature/about.html | 27 +
org.eclipse.mylyn.context-feature/build.properties | 6 +
org.eclipse.mylyn.context-feature/epl-v10.html | 328 +
.../feature.properties | 48 +
org.eclipse.mylyn.context-feature/feature.xml | 60 +
org.eclipse.mylyn.context-feature/license.html | 79 +
org.eclipse.mylyn.context.core/.classpath | 11 +
org.eclipse.mylyn.context.core/.cvsignore | 2 +
org.eclipse.mylyn.context.core/.project | 34 +
.../.refactorings/2006/11/46/refactorings.history | 4 +
.../.refactorings/2006/11/46/refactorings.index | 1 +
.../.refactorings/2006/11/47/refactorings.history | 11 +
.../.refactorings/2006/11/47/refactorings.index | 8 +
.../.refactorings/2006/11/48/refactorings.history | 6 +
.../.refactorings/2006/11/48/refactorings.index | 3 +
.../.refactorings/2006/12/48/refactorings.history | 6 +
.../.refactorings/2006/12/48/refactorings.index | 3 +
.../.refactorings/2006/12/49/refactorings.history | 8 +
.../.refactorings/2006/12/49/refactorings.index | 5 +
.../.refactorings/2006/2/8/refactorings.history | 4 +
.../.refactorings/2006/2/8/refactorings.index | 1 +
.../.refactorings/2006/3/9/refactorings.history | 6 +
.../.refactorings/2006/3/9/refactorings.index | 3 +
.../.refactorings/2006/4/14/refactorings.history | 20 +
.../.refactorings/2006/4/14/refactorings.index | 16 +
.../.refactorings/2006/4/16/refactorings.history | 4 +
.../.refactorings/2006/4/16/refactorings.index | 1 +
.../.refactorings/2006/5/21/refactorings.history | 7 +
.../.refactorings/2006/5/21/refactorings.index | 4 +
.../.refactorings/2006/6/23/refactorings.history | 6 +
.../.refactorings/2006/6/23/refactorings.index | 3 +
.../.refactorings/2006/6/26/refactorings.history | 4 +
.../.refactorings/2006/6/26/refactorings.index | 1 +
.../.refactorings/2006/7/27/refactorings.history | 7 +
.../.refactorings/2006/7/27/refactorings.index | 4 +
.../.refactorings/2006/7/28/refactorings.history | 11 +
.../.refactorings/2006/7/28/refactorings.index | 8 +
.../.refactorings/2006/7/29/refactorings.history | 5 +
.../.refactorings/2006/7/29/refactorings.index | 2 +
.../.refactorings/2006/8/31/refactorings.history | 5 +
.../.refactorings/2006/8/31/refactorings.index | 2 +
.../.refactorings/2007/1/3/refactorings.history | 4 +
.../.refactorings/2007/1/3/refactorings.index | 1 +
.../.refactorings/2007/1/4/refactorings.history | 4 +
.../.refactorings/2007/1/4/refactorings.index | 1 +
.../.refactorings/2007/10/42/refactorings.history | 3 +
.../.refactorings/2007/10/42/refactorings.index | 24 +
.../.refactorings/2007/10/43/refactorings.history | 4 +
.../.refactorings/2007/10/43/refactorings.index | 1 +
.../.refactorings/2007/10/44/refactorings.history | 4 +
.../.refactorings/2007/10/44/refactorings.index | 1 +
.../.refactorings/2007/11/45/refactorings.history | 3 +
.../.refactorings/2007/11/45/refactorings.index | 2 +
.../.refactorings/2007/12/49/refactorings.history | 3 +
.../.refactorings/2007/12/49/refactorings.index | 2 +
.../.refactorings/2007/12/51/refactorings.history | 3 +
.../.refactorings/2007/12/51/refactorings.index | 2 +
.../.refactorings/2007/2/5/refactorings.history | 11 +
.../.refactorings/2007/2/5/refactorings.index | 8 +
.../.refactorings/2007/2/6/refactorings.history | 9 +
.../.refactorings/2007/2/6/refactorings.index | 6 +
.../.refactorings/2007/2/8/refactorings.history | 5 +
.../.refactorings/2007/2/8/refactorings.index | 2 +
.../.refactorings/2007/3/13/refactorings.history | 4 +
.../.refactorings/2007/3/13/refactorings.index | 1 +
.../.refactorings/2007/4/15/refactorings.history | 7 +
.../.refactorings/2007/4/15/refactorings.index | 4 +
.../.refactorings/2007/4/17/refactorings.history | 5 +
.../.refactorings/2007/4/17/refactorings.index | 2 +
.../.refactorings/2007/5/18/refactorings.history | 5 +
.../.refactorings/2007/5/18/refactorings.index | 2 +
.../.refactorings/2007/5/21/refactorings.history | 25 +
.../.refactorings/2007/5/21/refactorings.index | 19 +
.../.refactorings/2007/5/22/refactorings.history | 12 +
.../.refactorings/2007/5/22/refactorings.index | 9 +
.../.refactorings/2007/6/24/refactorings.history | 7 +
.../.refactorings/2007/6/24/refactorings.index | 4 +
.../.refactorings/2007/6/25/refactorings.history | 6 +
.../.refactorings/2007/6/25/refactorings.index | 3 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2007/8/33/refactorings.history | 7 +
.../.refactorings/2007/8/33/refactorings.index | 4 +
.../.refactorings/2007/8/34/refactorings.history | 7 +
.../.refactorings/2007/8/34/refactorings.index | 4 +
.../.refactorings/2007/9/39/refactorings.history | 4 +
.../.refactorings/2007/9/39/refactorings.index | 1 +
.../.refactorings/2008/1/2/refactorings.history | 3 +
.../.refactorings/2008/1/2/refactorings.index | 2 +
.../.refactorings/2008/10/44/refactorings.history | 4 +
.../.refactorings/2008/10/44/refactorings.index | 1 +
.../.refactorings/2008/4/14/refactorings.history | 4 +
.../.refactorings/2008/4/14/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 2 +
.../.refactorings/2008/4/15/refactorings.index | 15 +
.../.refactorings/2008/4/16/refactorings.history | 4 +
.../.refactorings/2008/4/16/refactorings.index | 1 +
.../.refactorings/2008/4/18/refactorings.history | 4 +
.../.refactorings/2008/4/18/refactorings.index | 1 +
.../.refactorings/2008/5/20/refactorings.history | 3 +
.../.refactorings/2008/5/20/refactorings.index | 6 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 43 +
.../.refactorings/2008/6/23/refactorings.history | 4 +
.../.refactorings/2008/6/23/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 7 +
.../.refactorings/2008/9/36/refactorings.history | 3 +
.../.refactorings/2008/9/36/refactorings.index | 3 +
.../.refactorings/2009/5/18/refactorings.history | 3 +
.../.refactorings/2009/5/18/refactorings.index | 8 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 16 +
org.eclipse.mylyn.context.core/about.html | 27 +
org.eclipse.mylyn.context.core/build-user.xml | 3 +
org.eclipse.mylyn.context.core/build.properties | 17 +
org.eclipse.mylyn.context.core/plugin.properties | 2 +
org.eclipse.mylyn.context.core/plugin.xml | 7 +
org.eclipse.mylyn.context.core/schema/bridges.exsd | 102 +
.../schema/internalBridges.exsd | 89 +
.../schema/relationProviders.exsd | 116 +
.../context/core/AbstractContextListener.java | 150 +
.../core/AbstractContextStructureBridge.java | 104 +
.../mylyn/context/core/ContextChangeEvent.java | 90 +
.../eclipse/mylyn/context/core/ContextCore.java | 60 +
.../eclipse/mylyn/context/core/IContextStore.java | 51 +
.../mylyn/context/core/IDegreeOfInterest.java | 43 +
.../mylyn/context/core/IImplicitlyIntersting.java | 22 +
.../mylyn/context/core/IInteractionContext.java | 121 +
.../context/core/IInteractionContextManager.java | 75 +
.../context/core/IInteractionContextScaling.java | 35 +
.../mylyn/context/core/IInteractionElement.java | 42 +
.../mylyn/context/core/IInteractionObject.java | 28 +
.../mylyn/context/core/IInteractionRelation.java | 32 +
.../mylyn/context/core/InterestComparator.java | 39 +
.../context/core/AbstractRelationProvider.java | 165 +
.../context/core/AggregateInteractionEvent.java | 65 +
.../context/core/CompositeContextElement.java | 165 +
.../context/core/CompositeDegreeOfInterest.java | 134 +
.../context/core/CompositeInteractionContext.java | 191 +
.../internal/context/core/ContextCorePlugin.java | 474 +
.../internal/context/core/DegreeOfInterest.java | 195 +
.../internal/context/core/DegreeOfSeparation.java | 36 +
.../context/core/IActiveSearchListener.java | 31 +
.../context/core/IActiveSearchOperation.java | 27 +
.../context/core/IContextStoreListener.java | 30 +
.../internal/context/core/IDegreeOfSeparation.java | 26 +
.../context/core/IInteractionContextReader.java | 24 +
.../context/core/IInteractionContextWriter.java | 28 +
.../internal/context/core/IRelationsListener.java | 23 +
.../internal/context/core/InteractionContext.java | 319 +
.../context/core/InteractionContextElement.java | 130 +
.../core/InteractionContextExternalizer.java | 186 +
.../context/core/InteractionContextManager.java | 1451 ++
.../context/core/InteractionContextRelation.java | 73 +
.../context/core/InteractionContextScaling.java | 112 +
.../context/core/LegacyActivityAdaptor.java | 68 +
.../internal/context/core/LocalContextStore.java | 252 +
.../context/core/SaxContextContentHandler.java | 134 +
.../internal/context/core/SaxContextReader.java | 93 +
.../internal/context/core/SaxContextWriter.java | 219 +
org.eclipse.mylyn.context.tests/.classpath | 15 +
org.eclipse.mylyn.context.tests/.cvsignore | 2 +
org.eclipse.mylyn.context.tests/.project | 34 +
.../.refactorings/2006/7/29/refactorings.history | 4 +
.../.refactorings/2006/7/29/refactorings.index | 1 +
.../.refactorings/2006/9/36/refactorings.history | 4 +
.../.refactorings/2006/9/36/refactorings.index | 1 +
.../.refactorings/2007/10/42/refactorings.history | 4 +
.../.refactorings/2007/10/42/refactorings.index | 1 +
.../.refactorings/2007/12/51/refactorings.history | 3 +
.../.refactorings/2007/12/51/refactorings.index | 2 +
.../.refactorings/2007/4/17/refactorings.history | 4 +
.../.refactorings/2007/4/17/refactorings.index | 1 +
.../.refactorings/2007/5/21/refactorings.history | 5 +
.../.refactorings/2007/5/21/refactorings.index | 2 +
.../.refactorings/2007/6/23/refactorings.history | 7 +
.../.refactorings/2007/6/23/refactorings.index | 4 +
.../.refactorings/2007/8/35/refactorings.history | 4 +
.../.refactorings/2007/8/35/refactorings.index | 1 +
.../.refactorings/2007/9/39/refactorings.history | 4 +
.../.refactorings/2007/9/39/refactorings.index | 1 +
.../.refactorings/2008/12/49/refactorings.history | 4 +
.../.refactorings/2008/12/49/refactorings.index | 1 +
.../.refactorings/2008/12/52/refactorings.history | 3 +
.../.refactorings/2008/12/52/refactorings.index | 4 +
.../.refactorings/2008/4/16/refactorings.history | 4 +
.../.refactorings/2008/4/16/refactorings.index | 1 +
.../.refactorings/2008/9/39/refactorings.history | 3 +
.../.refactorings/2008/9/39/refactorings.index | 5 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 26 +
org.eclipse.mylyn.context.tests/about.html | 27 +
org.eclipse.mylyn.context.tests/build.properties | 18 +
.../mylyn/context/tests/AbstractContextTest.java | 86 +
.../mylyn/context/tests/AllContextTests.java | 42 +
.../context/tests/ContextExternalizerTest.java | 301 +
.../eclipse/mylyn/context/tests/ContextTest.java | 121 +
.../mylyn/context/tests/ContextTestsPlugin.java | 52 +
.../mylyn/context/tests/DegreeOfInterestTest.java | 94 +
.../tests/InteractionContextListeningTest.java | 84 +
.../context/tests/InteractionContextTest.java | 75 +
.../mylyn/context/tests/InteractionEventTest.java | 27 +
.../mylyn/context/tests/ScalingFactorsTest.java | 29 +
.../mylyn/context/tests/ShadowsBridgeTest.java | 274 +
.../eclipse/mylyn/context/tests/UiTestUtil.java | 69 +
.../context/tests/support/DomContextReader.java | 152 +
.../context/tests/support/DomContextWriter.java | 172 +
.../mylyn/context/tests/support/FileTool.java | 268 +
.../context/tests/support/ResourceHelper.java | 140 +
.../mylyn/context/tests/support/TestMonitor.java | 63 +
.../mylyn/context/tests/support/TestUtil.java | 146 +
.../tests/support/search/ISearchPluginTest.java | 25 +
.../support/search/TestActiveSearchListener.java | 58 +
.../testdata/externalizer/testcontext.xml.zip | Bin 0 -> 5334 bytes
.../testdata/projects/project1.zip | Bin 0 -> 21933 bytes
.../testdata/projects/project2.zip | Bin 0 -> 19943 bytes
org.eclipse.mylyn.context.ui/.classpath | 15 +
org.eclipse.mylyn.context.ui/.cvsignore | 2 +
org.eclipse.mylyn.context.ui/.project | 34 +
.../.refactorings/2006/10/42/refactorings.history | 6 +
.../.refactorings/2006/10/42/refactorings.index | 3 +
.../.refactorings/2006/11/47/refactorings.history | 6 +
.../.refactorings/2006/11/47/refactorings.index | 3 +
.../.refactorings/2006/11/48/refactorings.history | 4 +
.../.refactorings/2006/11/48/refactorings.index | 1 +
.../.refactorings/2006/12/48/refactorings.history | 6 +
.../.refactorings/2006/12/48/refactorings.index | 3 +
.../.refactorings/2006/12/49/refactorings.history | 17 +
.../.refactorings/2006/12/49/refactorings.index | 12 +
.../.refactorings/2006/2/8/refactorings.history | 4 +
.../.refactorings/2006/2/8/refactorings.index | 1 +
.../.refactorings/2006/3/10/refactorings.history | 7 +
.../.refactorings/2006/3/10/refactorings.index | 4 +
.../.refactorings/2006/3/11/refactorings.history | 7 +
.../.refactorings/2006/3/11/refactorings.index | 4 +
.../.refactorings/2006/3/9/refactorings.history | 9 +
.../.refactorings/2006/3/9/refactorings.index | 6 +
.../.refactorings/2006/4/14/refactorings.history | 4 +
.../.refactorings/2006/4/14/refactorings.index | 1 +
.../.refactorings/2006/4/16/refactorings.history | 5 +
.../.refactorings/2006/4/16/refactorings.index | 2 +
.../.refactorings/2006/4/17/refactorings.history | 4 +
.../.refactorings/2006/4/17/refactorings.index | 1 +
.../.refactorings/2006/5/20/refactorings.history | 6 +
.../.refactorings/2006/5/20/refactorings.index | 3 +
.../.refactorings/2006/5/21/refactorings.history | 5 +
.../.refactorings/2006/5/21/refactorings.index | 2 +
.../.refactorings/2006/6/22/refactorings.history | 8 +
.../.refactorings/2006/6/22/refactorings.index | 5 +
.../.refactorings/2006/6/24/refactorings.history | 4 +
.../.refactorings/2006/6/24/refactorings.index | 1 +
.../.refactorings/2006/6/26/refactorings.history | 4 +
.../.refactorings/2006/6/26/refactorings.index | 1 +
.../.refactorings/2006/7/28/refactorings.history | 10 +
.../.refactorings/2006/7/28/refactorings.index | 7 +
.../.refactorings/2006/7/29/refactorings.history | 5 +
.../.refactorings/2006/7/29/refactorings.index | 2 +
.../.refactorings/2006/7/30/refactorings.history | 4 +
.../.refactorings/2006/7/30/refactorings.index | 1 +
.../.refactorings/2006/8/31/refactorings.history | 5 +
.../.refactorings/2006/8/31/refactorings.index | 2 +
.../.refactorings/2006/8/33/refactorings.history | 4 +
.../.refactorings/2006/8/33/refactorings.index | 1 +
.../.refactorings/2006/9/38/refactorings.history | 4 +
.../.refactorings/2006/9/38/refactorings.index | 1 +
.../.refactorings/2007/1/1/refactorings.history | 8 +
.../.refactorings/2007/1/1/refactorings.index | 5 +
.../.refactorings/2007/10/41/refactorings.history | 3 +
.../.refactorings/2007/10/41/refactorings.index | 3 +
.../.refactorings/2007/10/44/refactorings.history | 3 +
.../.refactorings/2007/10/44/refactorings.index | 6 +
.../.refactorings/2007/11/45/refactorings.history | 4 +
.../.refactorings/2007/11/45/refactorings.index | 1 +
.../.refactorings/2007/11/46/refactorings.history | 4 +
.../.refactorings/2007/11/46/refactorings.index | 1 +
.../.refactorings/2007/12/49/refactorings.history | 3 +
.../.refactorings/2007/12/49/refactorings.index | 2 +
.../.refactorings/2007/12/50/refactorings.history | 4 +
.../.refactorings/2007/12/50/refactorings.index | 1 +
.../.refactorings/2007/2/7/refactorings.history | 17 +
.../.refactorings/2007/2/7/refactorings.index | 14 +
.../.refactorings/2007/3/10/refactorings.history | 4 +
.../.refactorings/2007/3/10/refactorings.index | 1 +
.../.refactorings/2007/3/12/refactorings.history | 11 +
.../.refactorings/2007/3/12/refactorings.index | 7 +
.../.refactorings/2007/3/13/refactorings.history | 9 +
.../.refactorings/2007/3/13/refactorings.index | 6 +
.../.refactorings/2007/5/21/refactorings.history | 4 +
.../.refactorings/2007/5/21/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 5 +
.../.refactorings/2007/5/22/refactorings.index | 2 +
.../.refactorings/2007/6/23/refactorings.history | 8 +
.../.refactorings/2007/6/23/refactorings.index | 5 +
.../.refactorings/2007/6/24/refactorings.history | 11 +
.../.refactorings/2007/6/24/refactorings.index | 8 +
.../.refactorings/2007/6/25/refactorings.history | 14 +
.../.refactorings/2007/6/25/refactorings.index | 11 +
.../.refactorings/2007/6/26/refactorings.history | 4 +
.../.refactorings/2007/6/26/refactorings.index | 1 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2007/8/35/refactorings.history | 4 +
.../.refactorings/2007/8/35/refactorings.index | 1 +
.../.refactorings/2007/9/39/refactorings.history | 3 +
.../.refactorings/2007/9/39/refactorings.index | 15 +
.../.refactorings/2008/1/2/refactorings.history | 3 +
.../.refactorings/2008/1/2/refactorings.index | 5 +
.../.refactorings/2008/1/3/refactorings.history | 3 +
.../.refactorings/2008/1/3/refactorings.index | 2 +
.../.refactorings/2008/10/42/refactorings.history | 3 +
.../.refactorings/2008/10/42/refactorings.index | 2 +
.../.refactorings/2008/11/46/refactorings.history | 4 +
.../.refactorings/2008/11/46/refactorings.index | 1 +
.../.refactorings/2008/12/52/refactorings.history | 3 +
.../.refactorings/2008/12/52/refactorings.index | 2 +
.../.refactorings/2008/2/7/refactorings.history | 3 +
.../.refactorings/2008/2/7/refactorings.index | 4 +
.../.refactorings/2008/4/14/refactorings.history | 4 +
.../.refactorings/2008/4/14/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 10 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 6 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 4 +
.../.refactorings/2008/5/20/refactorings.history | 3 +
.../.refactorings/2008/5/20/refactorings.index | 34 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 12 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 3 +
.../.refactorings/2008/6/23/refactorings.history | 4 +
.../.refactorings/2008/6/23/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 2 +
.../.refactorings/2008/9/37/refactorings.history | 4 +
.../.refactorings/2008/9/37/refactorings.index | 1 +
.../.refactorings/2009/2/7/refactorings.history | 6 +
.../.refactorings/2009/2/7/refactorings.index | 3 +
.../.refactorings/2009/3/10/refactorings.history | 4 +
.../.refactorings/2009/3/10/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.context.ui/META-INF/MANIFEST.MF | 33 +
org.eclipse.mylyn.context.ui/about.html | 27 +
org.eclipse.mylyn.context.ui/build-user.xml | 3 +
org.eclipse.mylyn.context.ui/build.properties | 17 +
.../icons/elcl16/blank.gif | Bin 0 -> 55 bytes
.../icons/elcl16/bug-refresh.gif | Bin 0 -> 362 bytes
org.eclipse.mylyn.context.ui/icons/elcl16/bug.gif | Bin 0 -> 159 bytes
.../icons/elcl16/capture-pause.gif | Bin 0 -> 212 bytes
.../icons/elcl16/capture-resume.gif | Bin 0 -> 198 bytes
.../icons/elcl16/color-palette.gif | Bin 0 -> 252 bytes
.../icons/elcl16/context-clear.gif | Bin 0 -> 316 bytes
.../icons/elcl16/context-transfer.gif | Bin 0 -> 325 bytes
.../icons/elcl16/delete.gif | Bin 0 -> 351 bytes
.../icons/elcl16/edge-inheritance.gif | Bin 0 -> 219 bytes
.../icons/elcl16/edge-read.gif | Bin 0 -> 244 bytes
.../icons/elcl16/edge-reference.gif | Bin 0 -> 226 bytes
.../icons/elcl16/edge-write.gif | Bin 0 -> 336 bytes
.../icons/elcl16/file-xml.gif | Bin 0 -> 360 bytes
.../icons/elcl16/file_obj.gif | Bin 0 -> 354 bytes
.../icons/elcl16/fldr_obj.gif | Bin 0 -> 216 bytes
.../icons/elcl16/focus-disabled.gif | Bin 0 -> 354 bytes
.../icons/elcl16/focus.gif | Bin 0 -> 357 bytes
.../icons/elcl16/import-zip.gif | Bin 0 -> 572 bytes
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-folding.gif | Bin 0 -> 360 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
.../icons/elcl16/interest-landmark.gif | Bin 0 -> 199 bytes
.../icons/elcl16/interest-working-set.gif | Bin 0 -> 352 bytes
.../icons/elcl16/link-with-editor.gif | Bin 0 -> 158 bytes
.../icons/elcl16/mylyn-overlay.gif | Bin 0 -> 276 bytes
.../icons/elcl16/refresh.gif | Bin 0 -> 958 bytes
.../icons/elcl16/remove.gif | Bin 0 -> 163 bytes
.../icons/elcl16/stop_all-color.gif | Bin 0 -> 364 bytes
.../icons/elcl16/stop_all.gif | Bin 0 -> 364 bytes
.../icons/elcl16/synched.gif | Bin 0 -> 160 bytes
.../icons/elcl16/web-document.gif | Bin 0 -> 596 bytes
.../icons/etool16/content-assist-separator.gif | Bin 0 -> 85 bytes
.../icons/etool16/context-attach.gif | Bin 0 -> 355 bytes
.../icons/etool16/context-retrieve.gif | Bin 0 -> 361 bytes
.../icons/etool16/qualify-names.gif | Bin 0 -> 134 bytes
.../icons/etool16/wizard-feedback.gif | Bin 0 -> 339 bytes
.../icons/etool16/wizard-study.gif | Bin 0 -> 617 bytes
.../icons/eview16/active-search.gif | Bin 0 -> 1028 bytes
.../icons/eview16/focus-disabled.gif | Bin 0 -> 354 bytes
.../icons/eview16/focus-tasklist.gif | Bin 0 -> 357 bytes
.../icons/eview16/focus.gif | Bin 0 -> 357 bytes
.../icons/eview16/overlay-mylyn.gif | Bin 0 -> 276 bytes
.../icons/wizban/banner-prefs.gif | Bin 0 -> 2974 bytes
org.eclipse.mylyn.context.ui/plugin.properties | 54 +
org.eclipse.mylyn.context.ui/plugin.xml | 557 +
org.eclipse.mylyn.context.ui/schema/bridges.exsd | 202 +
org.eclipse.mylyn.context.ui/schema/startup.exsd | 96 +
.../context/ui/AbstractAutoFocusViewAction.java | 102 +
.../mylyn/context/ui/AbstractContextUiBridge.java | 49 +
.../mylyn/context/ui/AbstractFocusViewAction.java | 577 +
.../org/eclipse/mylyn/context/ui/ContextUi.java | 75 +
.../mylyn/context/ui/IContextAwareEditor.java | 26 +
.../mylyn/context/ui/IContextUiStartup.java | 27 +
.../eclipse/mylyn/context/ui/InterestFilter.java | 170 +
.../eclipse/mylyn/context/ui/InterestSorter.java | 52 +
.../context/ui/AbstractContextLabelProvider.java | 78 +
.../context/ui/ActiveViewSelectionDragAdapter.java | 62 +
.../context/ui/BrowseFilteredListener.java | 184 +
.../mylyn/internal/context/ui/ColorMap.java | 129 +
.../internal/context/ui/ContentOutlineManager.java | 55 +
.../internal/context/ui/ContextEditorManager.java | 444 +
.../context/ui/ContextPerspectiveManager.java | 200 +
.../mylyn/internal/context/ui/ContextUiImages.java | 110 +
.../mylyn/internal/context/ui/ContextUiPlugin.java | 652 +
.../context/ui/ContextWorkingSetManager.java | 136 +
.../mylyn/internal/context/ui/DoiOrderSorter.java | 28 +
.../internal/context/ui/FocusedViewerManager.java | 334 +
.../context/ui/HighlighterImageDescriptor.java | 245 +
.../context/ui/IContextUiPreferenceContstants.java | 35 +
.../internal/context/ui/InterestDecorator.java | 94 +
.../context/ui/InterestDecoratorLightweight.java | 97 +
.../mylyn/internal/context/ui/Messages.java | 51 +
.../context/ui/TaskContextWorkingSetPage.java | 130 +
.../internal/context/ui/TaskStructureBridge.java | 96 +
.../mylyn/internal/context/ui/TaskUiBridge.java | 64 +
.../eclipse/mylyn/internal/context/ui/UiUtil.java | 47 +
.../AbstractInterestManipulationAction.java | 139 +
.../ui/actions/ContextActiveActionFilter.java | 26 +
.../context/ui/actions/ContextAttachAction.java | 105 +
.../context/ui/actions/ContextClearAction.java | 74 +
.../context/ui/actions/ContextCopyAction.java | 98 +
.../context/ui/actions/ContextRetrieveAction.java | 91 +
.../context/ui/actions/FocusOutlineAction.java | 115 +
.../context/ui/actions/FocusTaskListAction.java | 186 +
.../ui/actions/InterestDecrementAction.java | 24 +
.../ui/actions/InterestIncrementAction.java | 23 +
.../internal/context/ui/actions/Messages.java | 73 +
.../context/ui/actions/OpenPrefsAction.java | 39 +
.../actions/OpenQuickContextPopupDialogAction.java | 51 +
.../context/ui/actions/TaskContextAction.java | 53 +
.../actions/ToggleDecorateInterestLevelAction.java | 47 +
.../context/ui/actions/messages.properties | 29 +
.../AbstractTaskAttachmentCommandHandler.java | 46 +
.../context/ui/commands/AttachContextHandler.java | 40 +
.../context/ui/commands/ClearContextHandler.java | 42 +
.../context/ui/commands/CopyContextHandler.java | 76 +
.../context/ui/commands/FocusViewHandler.java | 55 +
.../internal/context/ui/commands/Messages.java | 46 +
.../commands/RetrieveContextAttachmentHandler.java | 29 +
.../ui/commands/RetrieveContextHandler.java | 40 +
.../context/ui/commands/messages.properties | 10 +
.../context/ui/editors/ContextEditorFormPage.java | 552 +
.../context/ui/editors/ContextPageFactory.java | 54 +
.../ui/editors/InvisibleContextElementsPart.java | 421 +
.../internal/context/ui/editors/Messages.java | 67 +
.../context/ui/editors/ScalableInterestFilter.java | 37 +
.../context/ui/editors/messages.properties | 21 +
.../mylyn/internal/context/ui/messages.properties | 16 +
.../ui/preferences/ContextUiPreferencePage.java | 186 +
.../internal/context/ui/preferences/Messages.java | 49 +
.../context/ui/preferences/messages.properties | 11 +
.../context/ui/views/ContextNodeOpenListener.java | 81 +
.../mylyn/internal/context/ui/views/Messages.java | 29 +
.../context/ui/views/QuickContextPopupDialog.java | 473 +
.../QuickOutlinePatternAndInterestFilter.java | 85 +
.../internal/context/ui/views/messages.properties | 1 +
.../context/ui/wizards/ContextAttachWizard.java | 55 +
.../ui/wizards/ContextAttachWizardPage.java | 81 +
.../context/ui/wizards/ContextRetrieveWizard.java | 58 +
.../ui/wizards/ContextRetrieveWizardPage.java | 178 +
.../internal/context/ui/wizards/Messages.java | 53 +
.../context/ui/wizards/messages.properties | 17 +
org.eclipse.mylyn.discovery.core/.classpath | 7 +
org.eclipse.mylyn.discovery.core/.cvsignore | 1 +
org.eclipse.mylyn.discovery.core/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
.../META-INF/MANIFEST.MF | 13 +
.../OSGI-INF/l10n/bundle.properties | 4 +
org.eclipse.mylyn.discovery.core/about.html | 28 +
org.eclipse.mylyn.discovery.core/build.properties | 22 +
org.eclipse.mylyn.discovery.core/plugin.xml | 15 +
.../schema/connectorDiscovery.exsd | 391 +
.../internal/discovery/core/DiscoveryCore.java | 23 +
.../core/model/AbstractDiscoverySource.java | 42 +
.../core/model/AbstractDiscoveryStrategy.java | 56 +
.../core/model/BundleDiscoverySource.java | 41 +
.../core/model/BundleDiscoveryStrategy.java | 115 +
.../discovery/core/model/ConnectorCategory.java | 133 +
.../discovery/core/model/ConnectorDescriptor.java | 227 +
.../core/model/ConnectorDescriptorKind.java | 55 +
.../discovery/core/model/ConnectorDiscovery.java | 391 +
.../model/ConnectorDiscoveryExtensionReader.java | 190 +
.../internal/discovery/core/model/Directory.java | 70 +
.../discovery/core/model/DirectoryParser.java | 135 +
.../discovery/core/model/DiscoveryCategory.java | 36 +
.../discovery/core/model/DiscoveryConnector.java | 107 +
.../core/model/DiscoveryRegistryStrategy.java | 215 +
.../discovery/core/model/FeatureFilter.java | 69 +
.../mylyn/internal/discovery/core/model/Group.java | 51 +
.../mylyn/internal/discovery/core/model/Icon.java | 93 +
.../discovery/core/model/JarDiscoverySource.java | 51 +
.../internal/discovery/core/model/Messages.java | 110 +
.../internal/discovery/core/model/Overview.java | 84 +
.../internal/discovery/core/model/Policy.java | 41 +
.../core/model/RemoteBundleDiscoveryStrategy.java | 344 +
.../discovery/core/model/ValidationException.java | 30 +
.../discovery/core/model/messages.properties | 41 +
.../core/util/DefaultSaxErrorHandler.java | 35 +
.../core/util/DiscoveryCategoryComparator.java | 50 +
.../core/util/DiscoveryConnectorComparator.java | 83 +
.../discovery/core/util/IOWithCauseException.java | 40 +
.../internal/discovery/core/util/Messages.java | 35 +
.../internal/discovery/core/util/WebUtil.java | 220 +
.../discovery/core/util/messages.properties | 3 +
org.eclipse.mylyn.discovery.core/xsd/directory.xsd | 46 +
org.eclipse.mylyn.discovery.ui/.classpath | 11 +
org.eclipse.mylyn.discovery.ui/.cvsignore | 1 +
org.eclipse.mylyn.discovery.ui/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 339 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
.../META-INF/MANIFEST.MF | 26 +
.../OSGI-INF/l10n/bundle.properties | 5 +
org.eclipse.mylyn.discovery.ui/about.html | 28 +
org.eclipse.mylyn.discovery.ui/build.properties | 19 +
.../icons/obj16/message_info.gif | Bin 0 -> 267 bytes
.../icons/ovr32/message_warning.gif | Bin 0 -> 591 bytes
org.eclipse.mylyn.discovery.ui/plugin.xml | 24 +
.../internal/discovery/ui/DiscoveryImages.java | 56 +
.../mylyn/internal/discovery/ui/DiscoveryUi.java | 23 +
...ShowConnectorDiscoveryWizardCommandHandler.java | 35 +
.../discovery/ui/util/DiscoveryUiUtil.java | 156 +
.../mylyn/internal/discovery/ui/util/Messages.java | 31 +
.../internal/discovery/ui/util/messages.properties | 1 +
.../ui/wizards/ConnectorDiscoveryWizard.java | 199 +
.../wizards/ConnectorDiscoveryWizardMainPage.java | 1251 ++
.../internal/discovery/ui/wizards/Messages.java | 103 +
.../discovery/ui/wizards/OverviewToolTip.java | 197 +
.../ui/wizards/PrepareInstallProfileJob.java | 367 +
.../discovery/ui/wizards/messages.properties | 39 +
org.eclipse.mylyn.help.ui/.classpath | 7 +
org.eclipse.mylyn.help.ui/.cvsignore | 2 +
.../org.eclipse.jdt.core.javabuilder.launch | 7 +
org.eclipse.mylyn.help.ui/.project | 34 +
.../.refactorings/2006/10/42/refactorings.history | 5 +
.../.refactorings/2006/10/42/refactorings.index | 2 +
.../.refactorings/2006/11/48/refactorings.history | 5 +
.../.refactorings/2006/11/48/refactorings.index | 2 +
.../.refactorings/2006/4/14/refactorings.history | 7 +
.../.refactorings/2006/4/14/refactorings.index | 4 +
.../.refactorings/2006/4/15/refactorings.history | 4 +
.../.refactorings/2006/4/15/refactorings.index | 1 +
.../.refactorings/2006/4/17/refactorings.history | 5 +
.../.refactorings/2006/4/17/refactorings.index | 2 +
.../.refactorings/2006/5/20/refactorings.history | 7 +
.../.refactorings/2006/5/20/refactorings.index | 4 +
.../.refactorings/2006/5/22/refactorings.history | 4 +
.../.refactorings/2006/5/22/refactorings.index | 1 +
.../.refactorings/2006/6/24/refactorings.history | 5 +
.../.refactorings/2006/6/24/refactorings.index | 2 +
.../.refactorings/2006/7/29/refactorings.history | 4 +
.../.refactorings/2006/7/29/refactorings.index | 1 +
.../.refactorings/2006/7/31/refactorings.history | 4 +
.../.refactorings/2006/7/31/refactorings.index | 1 +
.../.refactorings/2006/8/34/refactorings.history | 8 +
.../.refactorings/2006/8/34/refactorings.index | 5 +
.../.refactorings/2006/9/36/refactorings.history | 4 +
.../.refactorings/2006/9/36/refactorings.index | 1 +
.../.refactorings/2006/9/39/refactorings.history | 4 +
.../.refactorings/2006/9/39/refactorings.index | 1 +
.../.refactorings/2007/2/7/refactorings.history | 4 +
.../.refactorings/2007/2/7/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 4 +
.../.refactorings/2007/5/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2007/6/26/refactorings.history | 5 +
.../.refactorings/2007/6/26/refactorings.index | 2 +
.../.refactorings/2008/5/20/refactorings.history | 4 +
.../.refactorings/2008/5/20/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 5 +
.../.refactorings/2008/8/32/refactorings.history | 3 +
.../.refactorings/2008/8/32/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.help.ui/META-INF/MANIFEST.MF | 17 +
org.eclipse.mylyn.help.ui/about.html | 27 +
org.eclipse.mylyn.help.ui/build-helper.xml | 130 +
org.eclipse.mylyn.help.ui/build.properties | 25 +
org.eclipse.mylyn.help.ui/cheatsheets/Query.xml | 44 +
.../cheatsheets/TaskFocus.xml | 86 +
org.eclipse.mylyn.help.ui/customBuildCallbacks.xml | 161 +
org.eclipse.mylyn.help.ui/doc/book.css | 1 +
.../doc/images/2.0/ui-legend.gif | Bin 0 -> 7738 bytes
.../doc/images/2.0/welcome.gif | Bin 0 -> 17920 bytes
.../doc/images/2.0/working-sets-edit.gif | Bin 0 -> 15823 bytes
.../doc/images/2.0/working-sets-switch.gif | Bin 0 -> 30522 bytes
.../doc/images/2.0M1/bugzilla-local-users.gif | Bin 0 -> 3279 bytes
.../doc/images/2.0M1/bugzilla-time-tracking.gif | Bin 0 -> 1896 bytes
.../doc/images/2.0M1/java-editor-hyperlink.gif | Bin 0 -> 5524 bytes
.../doc/images/2.0M1/jira-editor-hyperlink.gif | Bin 0 -> 10720 bytes
.../doc/images/2.0M1/task-context-editor.gif | Bin 0 -> 12677 bytes
.../doc/images/2.0M1/task-editor-progress.gif | Bin 0 -> 9620 bytes
.../doc/images/2.0M2/bugzilla-due-dates.gif | Bin 0 -> 8738 bytes
.../doc/images/2.0M2/context-apply-attachments.gif | Bin 0 -> 12514 bytes
.../doc/images/2.0M2/context-quick-view.gif | Bin 0 -> 7497 bytes
.../doc/images/2.0M2/hyperlinks-text.gif | Bin 0 -> 6654 bytes
.../doc/images/2.0M2/jira-java-hyperlinks.gif | Bin 0 -> 4832 bytes
.../doc/images/2.0M2/repository-settings-proxy.gif | Bin 0 -> 15317 bytes
.../doc/images/2.0M2/synchronize-view-add.gif | Bin 0 -> 14914 bytes
.../doc/images/2.0M2/task-editor-warning.gif | Bin 0 -> 17173 bytes
.../doc/images/2.0M2/tasklist-schedule.gif | Bin 0 -> 14850 bytes
.../doc/images/2.0M2/trac-hyperlinks.gif | Bin 0 -> 8249 bytes
.../doc/images/2.0M3/annotation-hyperlinks.gif | Bin 0 -> 11069 bytes
.../doc/images/2.0M3/bugzilla-subtasks.gif | Bin 0 -> 4984 bytes
.../doc/images/2.0M3/jira-attachments.gif | Bin 0 -> 15929 bytes
.../doc/images/2.0M3/task-editor-error.gif | Bin 0 -> 12088 bytes
.../doc/images/2.0M3/task-tooltip-incoming.gif | Bin 0 -> 4985 bytes
.../doc/images/2.0M3/tasklist-tree.gif | Bin 0 -> 33885 bytes
.../doc/images/2.0M3/tasks-content-assist.gif | Bin 0 -> 10482 bytes
.../doc/images/2.0M3/tasks-working-sets.gif | Bin 0 -> 5930 bytes
.../images/2.0M3/team-hyperlinks-annotations.gif | Bin 0 -> 9012 bytes
.../doc/images/2.0M3/team-hyperlinks-history.gif | Bin 0 -> 15470 bytes
.../doc/images/2.0M3/ui-legend-connectors.gif | Bin 0 -> 8274 bytes
.../doc/images/2.0M3/ui-usage-report.gif | Bin 0 -> 23692 bytes
.../doc/images/2.1M1/bugzilla-cached-config.png | Bin 0 -> 7777 bytes
.../images/2.1M1/bugzilla-custom-resolutions.png | Bin 0 -> 11383 bytes
.../doc/images/2.1M1/bugzilla-search-keywords.png | Bin 0 -> 14166 bytes
.../doc/images/2.1M1/screenshot-capture.png | Bin 0 -> 61453 bytes
.../doc/images/2.1M1/spelling-corrections.png | Bin 0 -> 16739 bytes
.../doc/images/2.1M1/task-editor-hyperlinks.png | Bin 0 -> 5562 bytes
.../doc/images/2.1M1/tasklist-search.png | Bin 0 -> 26440 bytes
org.eclipse.mylyn.help.ui/doc/images/mylyn-2.0.png | Bin 0 -> 166436 bytes
org.eclipse.mylyn.help.ui/doc/new.html | 916 ++
org.eclipse.mylyn.help.ui/doc/notices.html | 22 +
org.eclipse.mylyn.help.ui/doc/overview.html | 63 +
org.eclipse.mylyn.help.ui/extract-markup.xsl | 9 +
.../icons/etool16/icons-legend.gif | Bin 0 -> 200 bytes
.../images/mylyn-overview-small.gif | Bin 0 -> 84098 bytes
.../images/mylyn-overview.gif | Bin 0 -> 60126 bytes
.../images/topiclabel/ov_legend48.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/ov_legend48_hov.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/ov_mylyn48.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/ov_mylyn48_hov.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/tu_query48.gif | Bin 0 -> 2245 bytes
.../images/topiclabel/tu_query48_hov.gif | Bin 0 -> 2245 bytes
.../images/topiclabel/tu_task48.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/tu_task48_hov.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/wn_mylyn48.gif | Bin 0 -> 2362 bytes
.../images/topiclabel/wn_mylyn48_hov.gif | Bin 0 -> 2362 bytes
org.eclipse.mylyn.help.ui/intro/css/overview.css | 15 +
.../intro/css/overview.properties | 4 +
org.eclipse.mylyn.help.ui/intro/css/tutorials.css | 15 +
.../intro/css/tutorials.properties | 4 +
org.eclipse.mylyn.help.ui/intro/css/whatsnew.css | 7 +
.../intro/css/whatsnew.properties | 2 +
.../intro/overviewExtensionContent.xml | 20 +
.../intro/tutorialsExtensionContent.xml | 26 +
.../intro/whatsnewExtensionContent.xml | 19 +
org.eclipse.mylyn.help.ui/plugin.properties | 9 +
org.eclipse.mylyn.help.ui/plugin.xml | 59 +
.../help/ui/anttask/MediaWikiImageFetcher.java | 147 +
.../internal/help/ui/anttask/tasks.properties | 1 +
org.eclipse.mylyn.help.ui/toc.xml | 17 +
.../userguide/Mylyn Reference-toc.xml | 55 +
.../userguide/Mylyn Reference.html | 409 +
.../userguide/Preferences.html | 143 +
org.eclipse.mylyn.help.ui/userguide/Shortcuts.html | 95 +
.../userguide/Task-Editor.html | 217 +
.../userguide/Task-Focused-Interface.html | 107 +
.../userguide/Task-Repositories.html | 76 +
.../userguide/Task-Repository-Connectors.html | 200 +
.../userguide/Team-Support.html | 106 +
.../userguide/Updating-This-Document.html | 54 +
org.eclipse.mylyn.help.ui/userguide/book.css | 1 +
.../images/Feature-Guide-3.0-Focused-Editor.png | Bin 0 -> 25330 bytes
.../images/Feature-Guide-3.0-Local-Task.png | Bin 0 -> 24367 bytes
.../Feature-Guide-3.0-Package-Explorer-Focused.png | Bin 0 -> 14930 bytes
.../Feature-Reference-3.0-Add-Task-Repository.png | Bin 0 -> 63168 bytes
.../Feature-Reference-3.0-Add-To-Context.png | Bin 0 -> 17025 bytes
.../Feature-Reference-3.0-Category-Progress.png | Bin 0 -> 23926 bytes
.../images/Feature-Reference-3.0-Change-Sets.png | Bin 0 -> 26006 bytes
.../images/Feature-Reference-3.0-Context-Tab.png | Bin 0 -> 44388 bytes
.../images/Feature-Reference-3.0-Error-Log.png | Bin 0 -> 38789 bytes
.../Feature-Reference-3.0-New-Query-Combined.png | Bin 0 -> 60615 bytes
.../images/Feature-Reference-3.0-New-Task.png | Bin 0 -> 7873 bytes
.../images/Feature-Reference-3.0-Open-Task.png | Bin 0 -> 45630 bytes
.../images/Feature-Reference-3.0-Planning-Tab.png | Bin 0 -> 21151 bytes
.../Feature-Reference-3.0-Task-Editor-Bottom.png | Bin 0 -> 50812 bytes
.../Feature-Reference-3.0-Task-Editor-Top.png | Bin 0 -> 50018 bytes
...Feature-Reference-3.0-Task-List-Categorized.png | Bin 0 -> 36082 bytes
...Reference-3.0-Task-List-Presentation-Select.png | Bin 0 -> 13294 bytes
.../Feature-Reference-3.0-Task-List-Tooltip.png | Bin 0 -> 31517 bytes
.../images/Feature-Reference-3.0-UI-Legend.png | Bin 0 -> 32583 bytes
.../Feature-Reference-3.0-Weekly-Progress.png | Bin 0 -> 20747 bytes
.../images/Generic-web-repository-settings.gif | Bin 0 -> 20696 bytes
.../userguide/images/XPlannerTaskEditor.gif | Bin 0 -> 44656 bytes
.../userguide/images/XPlannerUserStoryEditor.gif | Bin 0 -> 34610 bytes
.../userguide/images/images/home.gif | Bin 0 -> 582 bytes
.../userguide/images/images/next.gif | Bin 0 -> 327 bytes
.../userguide/images/images/prev.gif | Bin 0 -> 327 bytes
.../userguide/images/mylyn-overview-small.gif | Bin 0 -> 84098 bytes
.../userguide/images/mylyn-overview.gif | Bin 0 -> 60126 bytes
org.eclipse.mylyn.ide-feature/.project | 17 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.ide-feature/about.html | 27 +
org.eclipse.mylyn.ide-feature/build.properties | 6 +
org.eclipse.mylyn.ide-feature/epl-v10.html | 328 +
org.eclipse.mylyn.ide-feature/feature.properties | 48 +
org.eclipse.mylyn.ide-feature/feature.xml | 87 +
org.eclipse.mylyn.ide-feature/license.html | 79 +
org.eclipse.mylyn.ide.ant/.classpath | 13 +
org.eclipse.mylyn.ide.ant/.cvsignore | 1 +
org.eclipse.mylyn.ide.ant/.project | 34 +
.../.refactorings/2007/12/50/refactorings.history | 4 +
.../.refactorings/2007/12/50/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 7 +
.../.refactorings/2007/6/23/refactorings.index | 4 +
.../.refactorings/2008/5/20/refactorings.history | 4 +
.../.refactorings/2008/5/20/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.ide.ant/META-INF/MANIFEST.MF | 26 +
org.eclipse.mylyn.ide.ant/about.html | 27 +
org.eclipse.mylyn.ide.ant/build.properties | 17 +
.../icons/elcl16/edge-ref-xml.gif | Bin 0 -> 209 bytes
.../icons/elcl16/file-xml.gif | Bin 0 -> 360 bytes
.../icons/elcl16/focus-disabled.gif | Bin 0 -> 354 bytes
org.eclipse.mylyn.ide.ant/icons/elcl16/focus.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
org.eclipse.mylyn.ide.ant/plugin.properties | 6 +
org.eclipse.mylyn.ide.ant/plugin.xml | 20 +
.../internal/ide/ant/AntContextLabelProvider.java | 63 +
.../mylyn/internal/ide/ant/AntEditingMonitor.java | 133 +
.../mylyn/internal/ide/ant/AntStructureBridge.java | 352 +
.../mylyn/internal/ide/ant/AntUiBridge.java | 194 +
.../mylyn/internal/ide/ant/AntUiBridgePlugin.java | 66 +
.../eclipse/mylyn/internal/ide/ant/Messages.java | 29 +
.../mylyn/internal/ide/ant/messages.properties | 1 +
org.eclipse.mylyn.ide.tests/.classpath | 16 +
org.eclipse.mylyn.ide.tests/.cvsignore | 1 +
org.eclipse.mylyn.ide.tests/.project | 34 +
.../.refactorings/2006/10/41/refactorings.history | 5 +
.../.refactorings/2006/10/41/refactorings.index | 2 +
.../.refactorings/2006/10/42/refactorings.history | 4 +
.../.refactorings/2006/10/42/refactorings.index | 1 +
.../.refactorings/2006/5/21/refactorings.history | 4 +
.../.refactorings/2006/5/21/refactorings.index | 1 +
.../.refactorings/2006/7/29/refactorings.history | 6 +
.../.refactorings/2006/7/29/refactorings.index | 3 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.ide.tests/META-INF/MANIFEST.MF | 16 +
org.eclipse.mylyn.ide.tests/about.html | 27 +
org.eclipse.mylyn.ide.tests/build.properties | 7 +
.../org/eclipse/mylyn/ide/tests/AllIdeTests.java | 33 +
.../mylyn/ide/tests/IdePreferencesTest.java | 41 +
.../eclipse/mylyn/ide/tests/IdeStartupTest.java | 44 +
.../ide/tests/OpenCorrespondingTaskActionTest.java | 47 +
org.eclipse.mylyn.ide.ui/.classpath | 16 +
org.eclipse.mylyn.ide.ui/.cvsignore | 2 +
org.eclipse.mylyn.ide.ui/.project | 34 +
.../.refactorings/2006/10/42/refactorings.history | 4 +
.../.refactorings/2006/10/42/refactorings.index | 1 +
.../.refactorings/2006/11/45/refactorings.history | 4 +
.../.refactorings/2006/11/45/refactorings.index | 1 +
.../.refactorings/2006/12/49/refactorings.history | 6 +
.../.refactorings/2006/12/49/refactorings.index | 3 +
.../.refactorings/2006/12/51/refactorings.history | 5 +
.../.refactorings/2006/12/51/refactorings.index | 2 +
.../.refactorings/2006/3/13/refactorings.history | 8 +
.../.refactorings/2006/3/13/refactorings.index | 5 +
.../.refactorings/2006/3/9/refactorings.history | 6 +
.../.refactorings/2006/3/9/refactorings.index | 3 +
.../.refactorings/2006/4/13/refactorings.history | 4 +
.../.refactorings/2006/4/13/refactorings.index | 1 +
.../.refactorings/2006/4/14/refactorings.history | 5 +
.../.refactorings/2006/4/14/refactorings.index | 2 +
.../.refactorings/2006/4/17/refactorings.history | 4 +
.../.refactorings/2006/4/17/refactorings.index | 1 +
.../.refactorings/2006/5/18/refactorings.history | 4 +
.../.refactorings/2006/5/18/refactorings.index | 1 +
.../.refactorings/2006/5/20/refactorings.history | 4 +
.../.refactorings/2006/5/20/refactorings.index | 1 +
.../.refactorings/2006/5/21/refactorings.history | 4 +
.../.refactorings/2006/5/21/refactorings.index | 1 +
.../.refactorings/2006/6/23/refactorings.history | 4 +
.../.refactorings/2006/6/23/refactorings.index | 1 +
.../.refactorings/2006/6/24/refactorings.history | 12 +
.../.refactorings/2006/6/24/refactorings.index | 9 +
.../.refactorings/2006/6/25/refactorings.history | 9 +
.../.refactorings/2006/6/25/refactorings.index | 6 +
.../.refactorings/2006/7/29/refactorings.history | 5 +
.../.refactorings/2006/7/29/refactorings.index | 2 +
.../.refactorings/2006/9/38/refactorings.history | 11 +
.../.refactorings/2006/9/38/refactorings.index | 8 +
.../.refactorings/2007/1/1/refactorings.history | 7 +
.../.refactorings/2007/1/1/refactorings.index | 3 +
.../.refactorings/2007/3/12/refactorings.history | 4 +
.../.refactorings/2007/3/12/refactorings.index | 1 +
.../.refactorings/2007/4/15/refactorings.history | 8 +
.../.refactorings/2007/4/15/refactorings.index | 5 +
.../.refactorings/2007/5/22/refactorings.history | 5 +
.../.refactorings/2007/5/22/refactorings.index | 2 +
.../.refactorings/2007/6/23/refactorings.history | 14 +
.../.refactorings/2007/6/23/refactorings.index | 11 +
.../.refactorings/2007/6/26/refactorings.history | 5 +
.../.refactorings/2007/6/26/refactorings.index | 2 +
.../.refactorings/2008/4/15/refactorings.history | 4 +
.../.refactorings/2008/4/15/refactorings.index | 1 +
.../.refactorings/2008/5/20/refactorings.history | 3 +
.../.refactorings/2008/5/20/refactorings.index | 2 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 2 +
.../.refactorings/2008/6/24/refactorings.history | 4 +
.../.refactorings/2008/6/24/refactorings.index | 1 +
.../.refactorings/2009/2/9/refactorings.history | 3 +
.../.refactorings/2009/2/9/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
org.eclipse.mylyn.ide.ui/META-INF/MANIFEST.MF | 24 +
org.eclipse.mylyn.ide.ui/about.html | 27 +
org.eclipse.mylyn.ide.ui/build-user.xml | 3 +
org.eclipse.mylyn.ide.ui/build.properties | 17 +
org.eclipse.mylyn.ide.ui/doc/book.css | 1 +
org.eclipse.mylyn.ide.ui/doc/concepts.html | 31 +
org.eclipse.mylyn.ide.ui/doc/navigation.html | 22 +
org.eclipse.mylyn.ide.ui/doc/toc.xml | 11 +
.../icons/elcl16/edge-ref-xml.gif | Bin 0 -> 209 bytes
org.eclipse.mylyn.ide.ui/icons/elcl16/file-xml.gif | Bin 0 -> 360 bytes
.../icons/elcl16/focus-disabled.gif | Bin 0 -> 354 bytes
org.eclipse.mylyn.ide.ui/icons/elcl16/focus.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
.../icons/elcl16/task-repository.gif | Bin 0 -> 216 bytes
.../icons/etool16/task-repository-new.gif | Bin 0 -> 339 bytes
org.eclipse.mylyn.ide.ui/plugin.properties | 17 +
org.eclipse.mylyn.ide.ui/plugin.xml | 149 +
.../ide/ui/AbstractFocusMarkerViewAction.java | 110 +
.../mylyn/ide/ui/AbstractMarkerInterestFilter.java | 41 +
.../mylyn/internal/ide/ui/IdeUiBridgePlugin.java | 67 +
.../eclipse/mylyn/internal/ide/ui/IdeUiUtil.java | 71 +
.../internal/ide/ui/MarkerInterestFilter.java | 81 +
.../internal/ide/ui/MarkerViewLabelProvider.java | 101 +
.../ide/ui/MarkerViewerInterestSorter.java | 54 +
.../mylyn/internal/ide/ui/XmlNodeHelper.java | 238 +
.../ide/ui/actions/FocusAllMarkersViewAction.java | 24 +
.../ui/actions/FocusBookmarkMarkersViewAction.java | 24 +
.../ide/ui/actions/FocusProblemsListAction.java | 24 +
.../ide/ui/actions/FocusProjectExplorerAction.java | 48 +
.../ui/actions/FocusResourceNavigatorAction.java | 151 +
.../ide/ui/actions/FocusTaskMarkersViewAction.java | 24 +
org.eclipse.mylyn.java-feature/.project | 17 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.java-feature/about.html | 27 +
org.eclipse.mylyn.java-feature/build.properties | 6 +
org.eclipse.mylyn.java-feature/epl-v10.html | 328 +
org.eclipse.mylyn.java-feature/feature.properties | 48 +
org.eclipse.mylyn.java-feature/feature.xml | 88 +
org.eclipse.mylyn.java-feature/license.html | 79 +
org.eclipse.mylyn.java.tasks/.classpath | 12 +
org.eclipse.mylyn.java.tasks/.cvsignore | 1 +
org.eclipse.mylyn.java.tasks/.project | 34 +
.../.refactorings/2008/10/42/refactorings.history | 4 +
.../.refactorings/2008/10/42/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.java.tasks/META-INF/MANIFEST.MF | 20 +
org.eclipse.mylyn.java.tasks/about.html | 27 +
org.eclipse.mylyn.java.tasks/build.properties | 17 +
.../icons/etool16/task-new.gif | Bin 0 -> 334 bytes
org.eclipse.mylyn.java.tasks/plugin.properties | 7 +
org.eclipse.mylyn.java.tasks/plugin.xml | 27 +
.../java/tasks/JavaStackTraceFileHyperlink.java | 234 +
.../tasks/JavaStackTraceHyperlinkDetector.java | 82 +
.../mylyn/internal/java/tasks/Messages.java | 36 +
.../tasks/NewTaskFromJunitResultViewAction.java | 91 +
.../mylyn/internal/java/tasks/messages.properties | 6 +
org.eclipse.mylyn.java.tests/.classpath | 16 +
org.eclipse.mylyn.java.tests/.cvsignore | 1 +
org.eclipse.mylyn.java.tests/.project | 34 +
.../.refactorings/2006/4/17/refactorings.history | 5 +
.../.refactorings/2006/4/17/refactorings.index | 2 +
.../.refactorings/2006/5/19/refactorings.history | 4 +
.../.refactorings/2006/5/19/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 5 +
.../.refactorings/2007/5/22/refactorings.index | 2 +
.../.refactorings/2007/9/39/refactorings.history | 3 +
.../.refactorings/2007/9/39/refactorings.index | 2 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 5 +
.../.refactorings/2008/4/16/refactorings.history | 4 +
.../.refactorings/2008/4/16/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 2 +
.../.refactorings/2008/9/37/refactorings.history | 4 +
.../.refactorings/2008/9/37/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.api.tools.prefs | 145 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF | 44 +
org.eclipse.mylyn.java.tests/about.html | 27 +
org.eclipse.mylyn.java.tests/build.properties | 16 +
.../mylyn/java/tests/AbstractJavaContextTest.java | 159 +
.../org/eclipse/mylyn/java/tests/AllJavaTests.java | 57 +
.../java/tests/ContentOutlineRefreshTest.java | 95 +
.../java/tests/ContentSpecificContextTest.java | 79 +
.../mylyn/java/tests/EditorManagerTest.java | 285 +
.../mylyn/java/tests/FocusViewActionTest.java | 106 +
.../java/tests/InteractionContextManagerTest.java | 454 +
.../mylyn/java/tests/InterestFilterTest.java | 111 +
.../mylyn/java/tests/InterestManipulationTest.java | 194 +
.../mylyn/java/tests/JavaEditingMonitorTest.java | 150 +
.../mylyn/java/tests/JavaStructureTest.java | 110 +
.../java/tests/PackageExplorerRefreshTest.java | 100 +
.../eclipse/mylyn/java/tests/ProblemsListTest.java | 74 +
.../eclipse/mylyn/java/tests/RefactoringTest.java | 120 +
.../java/tests/ResourceStructureMappingTest.java | 41 +
.../eclipse/mylyn/java/tests/TestJavaProject.java | 172 +
.../org/eclipse/mylyn/java/tests/TestProject.java | 37 +
.../mylyn/java/tests/TypeHistoryManagerTest.java | 56 +
.../java/tests/search/ActiveSearchNotifier.java | 89 +
.../search/JUnitReferencesSearchPluginTest.java | 68 +
.../search/JavaImplementorsSearchPluginTest.java | 74 +
.../search/JavaReadAccessSearchPluginTest.java | 65 +
.../tests/search/JavaReferencesSearchTest.java | 310 +
.../search/JavaWriteAccessSearchPluginTest.java | 62 +
.../java/tests/search/SearchPluginTestHelper.java | 116 +
.../java/tests/search/WorkspaceSetupHelper.java | 154 +
.../mylyn/java/tests/xml/ResultUpdaterTest.java | 142 +
.../tests/xml/XmlResultUpdaterSearchListener.java | 121 +
.../mylyn/java/tests/xml/XmlSearchPluginTest.java | 334 +
.../tests/xml/XmlTestActiveSearchListener.java | 91 +
org.eclipse.mylyn.java.ui/.classpath | 21 +
org.eclipse.mylyn.java.ui/.cvsignore | 2 +
org.eclipse.mylyn.java.ui/.project | 34 +
.../.refactorings/2006/12/48/refactorings.history | 4 +
.../.refactorings/2006/12/48/refactorings.index | 1 +
.../.refactorings/2006/12/49/refactorings.history | 8 +
.../.refactorings/2006/12/49/refactorings.index | 5 +
.../.refactorings/2006/12/51/refactorings.history | 4 +
.../.refactorings/2006/12/51/refactorings.index | 1 +
.../.refactorings/2006/2/8/refactorings.history | 6 +
.../.refactorings/2006/2/8/refactorings.index | 3 +
.../.refactorings/2006/4/16/refactorings.history | 7 +
.../.refactorings/2006/4/16/refactorings.index | 4 +
.../.refactorings/2006/5/19/refactorings.history | 4 +
.../.refactorings/2006/5/19/refactorings.index | 1 +
.../.refactorings/2006/5/20/refactorings.history | 4 +
.../.refactorings/2006/5/20/refactorings.index | 1 +
.../.refactorings/2006/6/26/refactorings.history | 4 +
.../.refactorings/2006/6/26/refactorings.index | 1 +
.../.refactorings/2006/7/28/refactorings.history | 4 +
.../.refactorings/2006/7/28/refactorings.index | 1 +
.../.refactorings/2006/7/29/refactorings.history | 4 +
.../.refactorings/2006/7/29/refactorings.index | 1 +
.../.refactorings/2006/7/30/refactorings.history | 4 +
.../.refactorings/2006/7/30/refactorings.index | 1 +
.../.refactorings/2006/7/31/refactorings.history | 4 +
.../.refactorings/2006/7/31/refactorings.index | 1 +
.../.refactorings/2006/9/38/refactorings.history | 8 +
.../.refactorings/2006/9/38/refactorings.index | 5 +
.../.refactorings/2007/1/3/refactorings.history | 4 +
.../.refactorings/2007/1/3/refactorings.index | 1 +
.../.refactorings/2007/10/44/refactorings.history | 3 +
.../.refactorings/2007/10/44/refactorings.index | 2 +
.../.refactorings/2007/12/51/refactorings.history | 4 +
.../.refactorings/2007/12/51/refactorings.index | 1 +
.../.refactorings/2007/4/15/refactorings.history | 4 +
.../.refactorings/2007/4/15/refactorings.index | 1 +
.../.refactorings/2007/5/21/refactorings.history | 4 +
.../.refactorings/2007/5/21/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 32 +
.../.refactorings/2007/6/23/refactorings.index | 29 +
.../.refactorings/2007/6/24/refactorings.history | 5 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 9 +
.../.refactorings/2007/6/25/refactorings.index | 6 +
.../.refactorings/2007/7/28/refactorings.history | 8 +
.../.refactorings/2007/7/28/refactorings.index | 5 +
.../.refactorings/2007/9/39/refactorings.history | 3 +
.../.refactorings/2007/9/39/refactorings.index | 5 +
.../.refactorings/2008/1/2/refactorings.history | 4 +
.../.refactorings/2008/1/2/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 7 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 8 +
.../.refactorings/2008/5/20/refactorings.history | 4 +
.../.refactorings/2008/5/20/refactorings.index | 1 +
.../.refactorings/2008/5/21/refactorings.history | 4 +
.../.refactorings/2008/5/21/refactorings.index | 1 +
.../.refactorings/2008/5/22/refactorings.history | 4 +
.../.refactorings/2008/5/22/refactorings.index | 1 +
.../.refactorings/2009/2/9/refactorings.history | 3 +
.../.refactorings/2009/2/9/refactorings.index | 4 +
.../.refactorings/2009/5/18/refactorings.history | 4 +
.../.refactorings/2009/5/18/refactorings.index | 1 +
org.eclipse.mylyn.java.ui/.settings/.api_filters | 27 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
org.eclipse.mylyn.java.ui/META-INF/MANIFEST.MF | 40 +
org.eclipse.mylyn.java.ui/about.html | 27 +
org.eclipse.mylyn.java.ui/build-user.xml | 3 +
org.eclipse.mylyn.java.ui/build.properties | 18 +
org.eclipse.mylyn.java.ui/doc/active-views.html | 27 +
org.eclipse.mylyn.java.ui/doc/book.css | 1 +
org.eclipse.mylyn.java.ui/doc/editing.html | 37 +
.../doc/images/active-hierarchy.gif | Bin 0 -> 6216 bytes
.../doc/images/active-search.gif | Bin 0 -> 11276 bytes
.../doc/images/interest-error.gif | Bin 0 -> 4373 bytes
org.eclipse.mylyn.java.ui/doc/java.html | 16 +
org.eclipse.mylyn.java.ui/doc/navigation.html | 48 +
org.eclipse.mylyn.java.ui/doc/toc.xml | 12 +
.../icons/elcl16/edge-ref-java.gif | Bin 0 -> 201 bytes
.../icons/elcl16/edge-ref-junit.gif | Bin 0 -> 221 bytes
.../icons/elcl16/focus-browsing.gif | Bin 0 -> 1030 bytes
.../icons/elcl16/focus-disabled.gif | Bin 0 -> 354 bytes
org.eclipse.mylyn.java.ui/icons/elcl16/focus.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-folding.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
.../icons/elcl16/mylyn-overlay.gif | Bin 0 -> 272 bytes
.../icons/elcl16/proposals-other.gif | Bin 0 -> 624 bytes
.../icons/elcl16/proposals-type.gif | Bin 0 -> 1045 bytes
.../icons/elcl16/templateprop_co.gif | Bin 0 -> 359 bytes
.../icons/etool16/browse-filtered.gif | Bin 0 -> 133 bytes
.../icons/etool16/junit-tab.gif | Bin 0 -> 362 bytes
.../icons/etool16/launch-junit-pde.gif | Bin 0 -> 587 bytes
.../icons/etool16/launch-junit.gif | Bin 0 -> 559 bytes
.../icons/etool16/link-with-editor.gif | Bin 0 -> 158 bytes
.../icons/etool16/no-scroll.gif | Bin 0 -> 614 bytes
.../icons/etool16/wizard-prefs.gif | Bin 0 -> 372 bytes
.../icons/eview16/active-hierarchy.gif | Bin 0 -> 592 bytes
.../icons/wizban/banner-prefs.gif | Bin 0 -> 2974 bytes
org.eclipse.mylyn.java.ui/plugin.properties | 51 +
org.eclipse.mylyn.java.ui/plugin.xml | 529 +
.../schema/javaEditorContributor.exsd | 122 +
.../java/ui/ActiveFoldingEditorTracker.java | 72 +
.../java/ui/BreakpointsInterestFilter.java | 43 +
.../java/ui/InterestUpdateDeltaListener.java | 119 +
.../internal/java/ui/JavaDebugStructureBridge.java | 150 +
.../internal/java/ui/JavaDeclarationsFilter.java | 29 +
.../mylyn/internal/java/ui/JavaEditingMonitor.java | 168 +
.../internal/java/ui/JavaStructureBridge.java | 395 +
.../mylyn/internal/java/ui/JavaUiBridge.java | 152 +
.../mylyn/internal/java/ui/JavaUiBridgePlugin.java | 218 +
.../eclipse/mylyn/internal/java/ui/JavaUiUtil.java | 107 +
.../internal/java/ui/LandmarkMarkerManager.java | 174 +
.../mylyn/internal/java/ui/TypeHistoryManager.java | 110 +
.../java/ui/actions/FilterMembersAction.java | 77 +
.../ui/actions/FocusBreakpointsViewAction.java | 44 +
.../ui/actions/FocusBrowsingPerspectiveAction.java | 108 +
.../java/ui/actions/FocusDebugViewAction.java | 43 +
.../ui/actions/FocusPackageExplorerAction.java | 163 +
.../mylyn/internal/java/ui/actions/Messages.java | 29 +
.../ui/actions/ShowFilteredChildrenAction.java | 64 +
.../java/ui/actions/ToggleActiveFoldingAction.java | 94 +
.../internal/java/ui/actions/messages.properties | 1 +
.../ui/editor/AbstractEditorHyperlinkDetector.java | 37 +
.../java/ui/editor/ActiveFoldingListener.java | 203 +
.../java/ui/editor/AutoFoldPreferenceBlock.java | 146 +
.../ui/editor/FocusedJavaAllProposalComputer.java | 178 +
.../editor/FocusedJavaNoTypeProposalComputer.java | 48 +
.../ui/editor/FocusedJavaProposalProcessor.java | 162 +
.../FocusedJavaSourceViewerConfiguration.java | 30 +
.../ui/editor/FocusedJavaTypeProposalComputer.java | 41 +
.../mylyn/internal/java/ui/editor/Messages.java | 29 +
.../internal/java/ui/editor/messages.properties | 1 +
.../java/ui/junit/InteractionContextTestUtil.java | 132 +
.../mylyn/internal/java/ui/junit/Messages.java | 33 +
.../junit/TaskContextJUnitLaunchConfiguration.java | 47 +
.../java/ui/junit/TaskContextJUnitMainTab.java | 106 +
.../java/ui/junit/TaskContextJUnitTabGroup.java | 43 +
.../internal/java/ui/junit/messages.properties | 4 +
.../ui/search/AbstractJavaRelationProvider.java | 431 +
.../java/ui/search/JUnitReferencesProvider.java | 62 +
.../ui/search/JavaActiveSearchResultUpdater.java | 170 +
.../java/ui/search/JavaImplementorsProvider.java | 45 +
.../java/ui/search/JavaReadAccessProvider.java | 45 +
.../java/ui/search/JavaReferencesProvider.java | 57 +
.../java/ui/search/JavaWriteAccessProvider.java | 45 +
.../mylyn/internal/java/ui/search/Messages.java | 31 +
.../java/ui/search/XmlActiveSearchUpdater.java | 105 +
.../internal/java/ui/search/messages.properties | 2 +
org.eclipse.mylyn.monitor-feature/.project | 17 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.monitor-feature/about.html | 27 +
org.eclipse.mylyn.monitor-feature/build.properties | 6 +
org.eclipse.mylyn.monitor-feature/epl-v10.html | 328 +
.../feature.properties | 48 +
org.eclipse.mylyn.monitor-feature/feature.xml | 93 +
org.eclipse.mylyn.monitor-feature/license.html | 79 +
org.eclipse.mylyn.monitor.core/.classpath | 11 +
org.eclipse.mylyn.monitor.core/.cvsignore | 1 +
org.eclipse.mylyn.monitor.core/.project | 34 +
.../.refactorings/2007/2/5/refactorings.history | 4 +
.../.refactorings/2007/2/5/refactorings.index | 1 +
.../.refactorings/2007/2/6/refactorings.history | 16 +
.../.refactorings/2007/2/6/refactorings.index | 13 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 7 +
.../.refactorings/2007/6/25/refactorings.index | 4 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2008/10/40/refactorings.history | 4 +
.../.refactorings/2008/10/40/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 4 +
.../.refactorings/2008/4/15/refactorings.index | 1 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 4 +
.../.refactorings/2008/5/19/refactorings.history | 3 +
.../.refactorings/2008/5/19/refactorings.index | 2 +
.../.refactorings/2008/6/23/refactorings.history | 4 +
.../.refactorings/2008/6/23/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 14 +
org.eclipse.mylyn.monitor.core/about.html | 27 +
org.eclipse.mylyn.monitor.core/build.properties | 15 +
org.eclipse.mylyn.monitor.core/plugin.properties | 3 +
.../monitor/core/IMonitorCoreConstants.java | 21 +
.../core/collection/CommandUsageCollector.java | 60 +
.../core/collection/DataOverviewCollector.java | 228 +
.../core/collection/DelegatingUsageCollector.java | 77 +
.../monitor/core/collection/IUsageCollector.java | 49 +
.../monitor/core/collection/IUsageScanner.java | 31 +
.../core/collection/InteractionByTypeSummary.java | 85 +
.../collection/InteractionEventClassifier.java | 85 +
.../collection/InteractionEventComparator.java | 34 +
.../core/collection/InteractionEventSummary.java | 140 +
.../core/collection/InteractionEventUtil.java | 42 +
.../internal/monitor/core/collection/Messages.java | 69 +
.../core/collection/PercentUsageComparator.java | 33 +
.../monitor/core/collection/SummaryCollector.java | 92 +
.../core/collection/ViewUsageCollector.java | 150 +
.../monitor/core/collection/messages.properties | 24 +
.../mylyn/monitor/core/AbstractMonitorLog.java | 98 +
.../monitor/core/IInteractionEventListener.java | 27 +
.../mylyn/monitor/core/InteractionEvent.java | 381 +
org.eclipse.mylyn.monitor.tests/.classpath | 16 +
org.eclipse.mylyn.monitor.tests/.cvsignore | 1 +
org.eclipse.mylyn.monitor.tests/.project | 34 +
.../.refactorings/2006/11/46/refactorings.history | 13 +
.../.refactorings/2006/11/46/refactorings.index | 10 +
.../.refactorings/2007/5/21/refactorings.history | 4 +
.../.refactorings/2007/5/21/refactorings.index | 1 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2008/5/21/refactorings.history | 4 +
.../.refactorings/2008/5/21/refactorings.index | 1 +
.../.refactorings/2008/6/23/refactorings.history | 4 +
.../.refactorings/2008/6/23/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.api.tools.prefs | 145 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 28 +
org.eclipse.mylyn.monitor.tests/about.html | 27 +
org.eclipse.mylyn.monitor.tests/build.properties | 17 +
.../reports/tests/AllMonitorReportTests.java | 34 +
.../monitor/reports/tests/ContextParsingTest.java | 93 +
.../reports/tests/DataOverviewCollectorTest.java | 108 +
.../mylyn/monitor/reports/tests/FileTool.java | 270 +
.../mylyn/monitor/tests/AllMonitorTests.java | 38 +
.../mylyn/monitor/tests/CheckActivityJobTest.java | 207 +
.../tests/InteractionEventExternalizationTest.java | 77 +
.../mylyn/monitor/tests/InteractionLoggerTest.java | 51 +
.../mylyn/monitor/tests/MockSelectionMonitor.java | 27 +
.../mylyn/monitor/tests/MonitorPackagingTest.java | 89 +
.../eclipse/mylyn/monitor/tests/MonitorTest.java | 192 +
.../mylyn/monitor/tests/MonitorTestsPlugin.java | 52 +
.../monitor/tests/MultiWindowMonitorTest.java | 236 +
.../mylyn/monitor/tests/StatisticsLoggingTest.java | 86 +
.../tests/usage/tests/AllMonitorUsageTests.java | 29 +
.../usage/tests/DefaultPreferenceConfigTest.java | 29 +
.../tests/usage/tests/FileDisplayDialogTest.java | 52 +
org.eclipse.mylyn.monitor.tests/test-log.xml | 1100 ++
.../USAGE-1.1.1-usage-1-2005-12-05-1-1-1.zip | Bin 0 -> 1384 bytes
.../USAGE-1.1.1-usage-2-2005-12-05-1-1-1.zip | Bin 0 -> 1384 bytes
.../testdata/monitor-log.xml |14476 ++++++++++++++++++++
.../testdata/usage-parsing.zip | Bin 0 -> 107286 bytes
org.eclipse.mylyn.monitor.ui/.classpath | 11 +
org.eclipse.mylyn.monitor.ui/.cvsignore | 1 +
org.eclipse.mylyn.monitor.ui/.project | 34 +
.../.refactorings/2006/4/14/refactorings.history | 11 +
.../.refactorings/2006/4/14/refactorings.index | 8 +
.../.refactorings/2006/6/23/refactorings.history | 7 +
.../.refactorings/2006/6/23/refactorings.index | 4 +
.../.refactorings/2006/7/27/refactorings.history | 5 +
.../.refactorings/2006/7/27/refactorings.index | 2 +
.../.refactorings/2006/7/28/refactorings.history | 5 +
.../.refactorings/2006/7/28/refactorings.index | 2 +
.../.refactorings/2007/10/41/refactorings.history | 3 +
.../.refactorings/2007/10/41/refactorings.index | 3 +
.../.refactorings/2007/2/5/refactorings.history | 20 +
.../.refactorings/2007/2/5/refactorings.index | 17 +
.../.refactorings/2007/2/6/refactorings.history | 6 +
.../.refactorings/2007/2/6/refactorings.index | 3 +
.../.refactorings/2007/3/13/refactorings.history | 4 +
.../.refactorings/2007/3/13/refactorings.index | 1 +
.../.refactorings/2007/4/14/refactorings.history | 5 +
.../.refactorings/2007/4/14/refactorings.index | 2 +
.../.refactorings/2007/5/19/refactorings.history | 5 +
.../.refactorings/2007/5/19/refactorings.index | 2 +
.../.refactorings/2007/5/21/refactorings.history | 4 +
.../.refactorings/2007/5/21/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 10 +
.../.refactorings/2007/6/25/refactorings.index | 7 +
.../.refactorings/2007/8/34/refactorings.history | 4 +
.../.refactorings/2007/8/34/refactorings.index | 1 +
.../.refactorings/2008/1/5/refactorings.history | 4 +
.../.refactorings/2008/1/5/refactorings.index | 1 +
.../.refactorings/2008/10/41/refactorings.history | 3 +
.../.refactorings/2008/10/41/refactorings.index | 3 +
.../.refactorings/2008/10/42/refactorings.history | 3 +
.../.refactorings/2008/10/42/refactorings.index | 3 +
.../.refactorings/2008/11/45/refactorings.history | 4 +
.../.refactorings/2008/11/45/refactorings.index | 1 +
.../.refactorings/2008/2/8/refactorings.history | 3 +
.../.refactorings/2008/2/8/refactorings.index | 3 +
.../.refactorings/2008/3/13/refactorings.history | 4 +
.../.refactorings/2008/3/13/refactorings.index | 1 +
.../.refactorings/2008/4/14/refactorings.history | 4 +
.../.refactorings/2008/4/14/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 4 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 3 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 2 +
.../.refactorings/2008/6/23/refactorings.history | 3 +
.../.refactorings/2008/6/23/refactorings.index | 4 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.monitor.ui/META-INF/MANIFEST.MF | 18 +
org.eclipse.mylyn.monitor.ui/about.html | 27 +
org.eclipse.mylyn.monitor.ui/build-user.xml | 3 +
org.eclipse.mylyn.monitor.ui/build.properties | 17 +
org.eclipse.mylyn.monitor.ui/plugin.properties | 3 +
org.eclipse.mylyn.monitor.ui/plugin.xml | 5 +
org.eclipse.mylyn.monitor.ui/schema/user.exsd | 110 +
.../monitor/ui/ActionExecutionMonitor.java | 27 +
.../internal/monitor/ui/ActivityChangeMonitor.java | 34 +
.../monitor/ui/ActivityContextManager.java | 221 +
.../mylyn/internal/monitor/ui/BrowserMonitor.java | 167 +
.../internal/monitor/ui/CheckActivityJob.java | 136 +
.../monitor/ui/IActivityManagerCallback.java | 24 +
.../internal/monitor/ui/IMonitoredWindow.java | 25 +
.../monitor/ui/KeybindingCommandMonitor.java | 31 +
.../internal/monitor/ui/MenuCommandMonitor.java | 108 +
.../mylyn/internal/monitor/ui/Messages.java | 29 +
.../mylyn/internal/monitor/ui/MonitorUiPlugin.java | 434 +
.../monitor/ui/PerspectiveChangeMonitor.java | 128 +
.../monitor/ui/PreferenceChangeMonitor.java | 36 +
.../monitor/ui/ShellLifecycleListener.java | 75 +
.../internal/monitor/ui/WindowChangeMonitor.java | 66 +
.../monitor/ui/WorkbenchUserActivityMonitor.java | 50 +
.../mylyn/internal/monitor/ui/messages.properties | 1 +
.../mylyn/monitor/ui/AbstractCommandMonitor.java | 76 +
.../mylyn/monitor/ui/AbstractEditorTracker.java | 61 +
.../mylyn/monitor/ui/AbstractPartTracker.java | 45 +
.../monitor/ui/AbstractUserActivityMonitor.java | 68 +
.../monitor/ui/AbstractUserInteractionMonitor.java | 166 +
.../mylyn/monitor/ui/IActionExecutionListener.java | 26 +
.../mylyn/monitor/ui/IActivityContextManager.java | 28 +
.../monitor/ui/IMonitorLifecycleListener.java | 26 +
.../mylyn/monitor/ui/IUserAttentionListener.java | 26 +
.../org/eclipse/mylyn/monitor/ui/MonitorUi.java | 78 +
org.eclipse.mylyn.monitor.usage/.classpath | 14 +
org.eclipse.mylyn.monitor.usage/.cvsignore | 1 +
org.eclipse.mylyn.monitor.usage/.project | 34 +
.../.refactorings/2006/10/42/refactorings.history | 5 +
.../.refactorings/2006/10/42/refactorings.index | 2 +
.../.refactorings/2006/11/44/refactorings.history | 4 +
.../.refactorings/2006/11/44/refactorings.index | 1 +
.../.refactorings/2006/11/48/refactorings.history | 4 +
.../.refactorings/2006/11/48/refactorings.index | 1 +
.../.refactorings/2006/12/48/refactorings.history | 13 +
.../.refactorings/2006/12/48/refactorings.index | 10 +
.../.refactorings/2006/7/28/refactorings.history | 5 +
.../.refactorings/2006/7/28/refactorings.index | 2 +
.../.refactorings/2006/8/31/refactorings.history | 6 +
.../.refactorings/2006/8/31/refactorings.index | 3 +
.../.refactorings/2007/1/3/refactorings.history | 6 +
.../.refactorings/2007/1/3/refactorings.index | 3 +
.../.refactorings/2007/1/4/refactorings.history | 5 +
.../.refactorings/2007/1/4/refactorings.index | 2 +
.../.refactorings/2007/2/5/refactorings.history | 5 +
.../.refactorings/2007/2/5/refactorings.index | 2 +
.../.refactorings/2007/2/6/refactorings.history | 40 +
.../.refactorings/2007/2/6/refactorings.index | 36 +
.../.refactorings/2007/3/12/refactorings.history | 14 +
.../.refactorings/2007/3/12/refactorings.index | 10 +
.../.refactorings/2007/3/13/refactorings.history | 4 +
.../.refactorings/2007/3/13/refactorings.index | 1 +
.../.refactorings/2007/4/16/refactorings.history | 10 +
.../.refactorings/2007/4/16/refactorings.index | 7 +
.../.refactorings/2007/5/19/refactorings.history | 7 +
.../.refactorings/2007/5/19/refactorings.index | 4 +
.../.refactorings/2007/5/20/refactorings.history | 5 +
.../.refactorings/2007/5/20/refactorings.index | 2 +
.../.refactorings/2007/5/21/refactorings.history | 4 +
.../.refactorings/2007/5/21/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 4 +
.../.refactorings/2007/6/23/refactorings.index | 1 +
.../.refactorings/2007/6/25/refactorings.history | 8 +
.../.refactorings/2007/6/25/refactorings.index | 5 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 4 +
.../.refactorings/2008/4/15/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 33 +
org.eclipse.mylyn.monitor.usage/about.html | 27 +
org.eclipse.mylyn.monitor.usage/build-user.xml | 3 +
org.eclipse.mylyn.monitor.usage/build.properties | 16 +
org.eclipse.mylyn.monitor.usage/doc/book.css | 1 +
.../doc/images/logo-ubc.gif | Bin 0 -> 3109 bytes
org.eclipse.mylyn.monitor.usage/doc/index.html | 18 +
org.eclipse.mylyn.monitor.usage/doc/readme.html | 160 +
org.eclipse.mylyn.monitor.usage/doc/toc.xml | 8 +
.../icons/etool16/monitor.gif | Bin 0 -> 362 bytes
.../icons/eview16/editor-usage.gif | Bin 0 -> 226 bytes
.../icons/wizban/banner-submission.gif | Bin 0 -> 3054 bytes
.../icons/wizban/banner-usage.gif | Bin 0 -> 3168 bytes
.../icons/wizban/banner-user.gif | Bin 0 -> 2759 bytes
org.eclipse.mylyn.monitor.usage/plugin.xml | 49 +
org.eclipse.mylyn.monitor.usage/schema/study.exsd | 214 +
.../internal/monitor/usage/FileDisplayDialog.java | 133 +
.../monitor/usage/InteractionEventLogger.java | 364 +
.../monitor/usage/InteractionEventObfuscator.java | 91 +
.../usage/InteractionEventSummarySorter.java | 120 +
.../monitor/usage/MonitorFileRolloverJob.java | 290 +
.../monitor/usage/MonitorPreferenceConstants.java | 39 +
.../internal/monitor/usage/ReportGenerator.java | 382 +
.../internal/monitor/usage/StudyParameters.java | 141 +
.../monitor/usage/UiUsageMonitorPlugin.java | 813 ++
.../internal/monitor/usage/UsageMonitorImages.java | 84 +
.../monitor/usage/UsageStatisticsSummary.java | 50 +
.../internal/monitor/usage/WebBrowserDialog.java | 77 +
.../collectors/PerspectiveUsageCollector.java | 152 +
.../usage/editors/UsageCountContentProvider.java | 52 +
.../usage/editors/UsageCountLabelProvider.java | 59 +
.../monitor/usage/editors/UsageEditorPart.java | 271 +
.../usage/editors/UsageStatsEditorInput.java | 88 +
.../editors/UsageSummaryReportEditorPart.java | 286 +
.../monitor/usage/editors/UserStudyEditorPart.java | 195 +
.../usage/preferences/UsageDataPreferencePage.java | 246 +
.../monitor/usage/wizards/GetNewUserIdPage.java | 557 +
.../usage/wizards/NewUsageSummaryEditorWizard.java | 80 +
.../wizards/UsageFileSelectionWizardPage.java | 165 +
.../usage/wizards/UsageSubmissionWizard.java | 740 +
.../wizards/UsageSummaryEditorWizardPage.java | 108 +
.../usage/wizards/UsageUploadWizardPage.java | 134 +
.../monitor/usage/AbstractStudyBackgroundPage.java | 29 +
.../usage/AbstractStudyQuestionnairePage.java | 31 +
org.eclipse.mylyn.pde-feature/.project | 17 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.pde-feature/about.html | 27 +
org.eclipse.mylyn.pde-feature/build.properties | 6 +
org.eclipse.mylyn.pde-feature/epl-v10.html | 328 +
org.eclipse.mylyn.pde-feature/feature.properties | 48 +
org.eclipse.mylyn.pde-feature/feature.xml | 61 +
org.eclipse.mylyn.pde-feature/license.html | 79 +
org.eclipse.mylyn.pde.ui/.classpath | 14 +
org.eclipse.mylyn.pde.ui/.cvsignore | 1 +
org.eclipse.mylyn.pde.ui/.project | 34 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.pde.ui/META-INF/MANIFEST.MF | 40 +
org.eclipse.mylyn.pde.ui/about.html | 27 +
org.eclipse.mylyn.pde.ui/build.properties | 18 +
.../icons/elcl16/edge-ref-xml.gif | Bin 0 -> 209 bytes
org.eclipse.mylyn.pde.ui/icons/elcl16/file-xml.gif | Bin 0 -> 360 bytes
.../icons/elcl16/focus-disabled.gif | Bin 0 -> 354 bytes
org.eclipse.mylyn.pde.ui/icons/elcl16/focus.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
org.eclipse.mylyn.pde.ui/plugin.properties | 11 +
org.eclipse.mylyn.pde.ui/plugin.xml | 73 +
...dApiToolsJavadocCompletionProposalComputer.java | 46 +
.../eclipse/mylyn/internal/pde/ui/Messages.java | 31 +
.../internal/pde/ui/PdeContextLabelProvider.java | 62 +
.../mylyn/internal/pde/ui/PdeEditingMonitor.java | 287 +
.../mylyn/internal/pde/ui/PdeStructureBridge.java | 361 +
.../eclipse/mylyn/internal/pde/ui/PdeUiBridge.java | 313 +
.../mylyn/internal/pde/ui/PdeUiBridgePlugin.java | 71 +
.../internal/pde/ui/XmlJavaRelationProvider.java | 443 +
.../mylyn/internal/pde/ui/junit/Messages.java | 31 +
.../TaskContextPdeJUnitLaunchConfiguration.java | 49 +
.../pde/ui/junit/TaskContextPdeJUnitTabGroup.java | 45 +
.../internal/pde/ui/junit/messages.properties | 2 +
.../mylyn/internal/pde/ui/messages.properties | 3 +
org.eclipse.mylyn.resources.tests/.classpath | 16 +
org.eclipse.mylyn.resources.tests/.cvsignore | 1 +
org.eclipse.mylyn.resources.tests/.project | 34 +
.../.refactorings/2006/7/29/refactorings.history | 5 +
.../.refactorings/2006/7/29/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 26 +
org.eclipse.mylyn.resources.tests/about.html | 27 +
org.eclipse.mylyn.resources.tests/build.properties | 15 +
.../tests/AbstractResourceContextTest.java | 71 +
.../mylyn/resources/tests/AllResourcesTests.java | 33 +
.../resources/tests/ResourceChangeMonitorTest.java | 246 +
.../mylyn/resources/tests/ResourceContextTest.java | 167 +
.../mylyn/resources/tests/ResourceTestUtil.java | 71 +
.../eclipse/mylyn/resources/tests/TestProject.java | 45 +
org.eclipse.mylyn.resources.ui/.classpath | 19 +
org.eclipse.mylyn.resources.ui/.cvsignore | 1 +
org.eclipse.mylyn.resources.ui/.project | 34 +
.../.refactorings/2006/11/47/refactorings.history | 4 +
.../.refactorings/2006/11/47/refactorings.index | 1 +
.../.refactorings/2006/7/29/refactorings.history | 5 +
.../.refactorings/2006/7/29/refactorings.index | 2 +
.../.refactorings/2007/1/1/refactorings.history | 4 +
.../.refactorings/2007/1/1/refactorings.index | 1 +
.../.refactorings/2007/1/4/refactorings.history | 4 +
.../.refactorings/2007/1/4/refactorings.index | 1 +
.../.refactorings/2007/10/41/refactorings.history | 4 +
.../.refactorings/2007/10/41/refactorings.index | 1 +
.../.refactorings/2007/2/8/refactorings.history | 4 +
.../.refactorings/2007/2/8/refactorings.index | 1 +
.../.refactorings/2007/3/13/refactorings.history | 10 +
.../.refactorings/2007/3/13/refactorings.index | 7 +
.../.refactorings/2007/4/16/refactorings.history | 5 +
.../.refactorings/2007/4/16/refactorings.index | 2 +
.../.refactorings/2007/4/17/refactorings.history | 4 +
.../.refactorings/2007/4/17/refactorings.index | 1 +
.../.refactorings/2007/5/18/refactorings.history | 6 +
.../.refactorings/2007/5/18/refactorings.index | 3 +
.../.refactorings/2007/5/19/refactorings.history | 4 +
.../.refactorings/2007/5/19/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 14 +
.../.refactorings/2007/6/23/refactorings.index | 11 +
.../.refactorings/2007/6/26/refactorings.history | 4 +
.../.refactorings/2007/6/26/refactorings.index | 1 +
.../.refactorings/2008/10/40/refactorings.history | 4 +
.../.refactorings/2008/10/40/refactorings.index | 1 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 4 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 3 +
.../.refactorings/2008/5/20/refactorings.history | 4 +
.../.refactorings/2008/5/20/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 4 +
.../.refactorings/2008/6/24/refactorings.index | 1 +
.../.refactorings/2009/1/5/refactorings.history | 4 +
.../.refactorings/2009/1/5/refactorings.index | 1 +
.../.refactorings/2009/2/7/refactorings.history | 3 +
.../.refactorings/2009/2/7/refactorings.index | 5 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 26 +
org.eclipse.mylyn.resources.ui/about.html | 27 +
org.eclipse.mylyn.resources.ui/build-user.xml | 3 +
org.eclipse.mylyn.resources.ui/build.properties | 18 +
org.eclipse.mylyn.resources.ui/doc/ant.html | 18 +
org.eclipse.mylyn.resources.ui/doc/book.css | 1 +
org.eclipse.mylyn.resources.ui/doc/pde.html | 16 +
org.eclipse.mylyn.resources.ui/doc/toc.xml | 11 +
org.eclipse.mylyn.resources.ui/doc/xml.html | 17 +
.../icons/elcl16/edge-ref-xml.gif | Bin 0 -> 209 bytes
.../icons/elcl16/focus-disabled.gif | Bin 0 -> 354 bytes
.../icons/elcl16/focus.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
org.eclipse.mylyn.resources.ui/plugin.properties | 14 +
org.eclipse.mylyn.resources.ui/plugin.xml | 108 +
.../schema/changeMonitoring.exsd | 67 +
.../resources/ui/EditorInteractionMonitor.java | 170 +
.../mylyn/internal/resources/ui/Messages.java | 29 +
.../resources/ui/ResourceChangeMonitor.java | 210 +
.../resources/ui/ResourceContextLabelProvider.java | 71 +
.../resources/ui/ResourceInteractionMonitor.java | 73 +
.../resources/ui/ResourceInterestUpdater.java | 102 +
.../resources/ui/ResourceStructureBridge.java | 236 +
.../internal/resources/ui/ResourceUiBridge.java | 135 +
.../resources/ui/ResourcesUiBridgePlugin.java | 208 +
.../ui/ResourcesUiExtensionPointReader.java | 70 +
.../ui/ResourcesUiPreferenceInitializer.java | 86 +
.../internal/resources/ui/messages.properties | 3 +
.../FocusedResourcesPreferencePage.java | 198 +
.../resources/ui/preferences/Messages.java | 35 +
.../resources/ui/preferences/messages.properties | 7 +
.../resources/ui/FocusCommonNavigatorAction.java | 259 +
.../eclipse/mylyn/resources/ui/ResourcesUi.java | 30 +
org.eclipse.mylyn.tasks.bugs/.classpath | 16 +
org.eclipse.mylyn.tasks.bugs/.cvsignore | 1 +
org.eclipse.mylyn.tasks.bugs/.project | 34 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 8 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 8 +
.../.refactorings/2008/6/23/refactorings.history | 2 +
.../.refactorings/2008/6/23/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.tasks.bugs/META-INF/MANIFEST.MF | 24 +
org.eclipse.mylyn.tasks.bugs/about.html | 27 +
org.eclipse.mylyn.tasks.bugs/build.properties | 18 +
.../icons/etool16/report-bug.gif | Bin 0 -> 580 bytes
.../icons/etool16/task-bug-new.gif | Bin 0 -> 359 bytes
.../icons/etool16/task-new.gif | Bin 0 -> 334 bytes
.../icons/etool16/task-repository-new.gif | Bin 0 -> 339 bytes
org.eclipse.mylyn.tasks.bugs/plugin.properties | 17 +
org.eclipse.mylyn.tasks.bugs/plugin.xml | 104 +
.../schema/pluginRepositoryMappings.exsd | 181 +
org.eclipse.mylyn.tasks.bugs/schema/support.exsd | 348 +
.../schema/taskContributors.exsd | 109 +
.../tasks/bugs/AbstractSupportHandler.java | 40 +
.../tasks/bugs/AbstractTaskContributor.java | 69 +
.../internal/provisional/tasks/bugs/IProduct.java | 30 +
.../internal/provisional/tasks/bugs/IProvider.java | 28 +
.../provisional/tasks/bugs/ISupportRequest.java | 30 +
.../provisional/tasks/bugs/ISupportResponse.java | 31 +
.../provisional/tasks/bugs/ITaskContribution.java | 41 +
.../tasks/bugs/AbstractSupportElement.java | 68 +
.../internal/tasks/bugs/AttributeTaskMapper.java | 119 +
.../internal/tasks/bugs/DefaultSupportHandler.java | 229 +
.../internal/tasks/bugs/IRepositoryConstants.java | 57 +
.../mylyn/internal/tasks/bugs/KeyValueMapping.java | 90 +
.../mylyn/internal/tasks/bugs/Messages.java | 69 +
.../tasks/bugs/ProductRepositoryMapping.java | 53 +
.../mylyn/internal/tasks/bugs/SupportCategory.java | 60 +
.../internal/tasks/bugs/SupportHandlerManager.java | 151 +
.../mylyn/internal/tasks/bugs/SupportProduct.java | 137 +
.../mylyn/internal/tasks/bugs/SupportProvider.java | 57 +
.../tasks/bugs/SupportProviderManager.java | 378 +
.../mylyn/internal/tasks/bugs/SupportRequest.java | 125 +
.../internal/tasks/bugs/TaskErrorReporter.java | 116 +
.../mylyn/internal/tasks/bugs/TasksBugsPlugin.java | 87 +
.../internal/tasks/bugs/actions/Messages.java | 47 +
.../tasks/bugs/actions/NewTaskFromErrorAction.java | 136 +
.../bugs/actions/NewTaskFromMarkerHandler.java | 81 +
.../tasks/bugs/actions/ReportBugAction.java | 44 +
.../tasks/bugs/actions/messages.properties | 11 +
.../mylyn/internal/tasks/bugs/messages.properties | 21 +
.../tasks/bugs/wizards/ErrorLogStatus.java | 59 +
.../internal/tasks/bugs/wizards/Messages.java | 57 +
.../internal/tasks/bugs/wizards/ProductStatus.java | 34 +
.../bugs/wizards/ReportBugOrEnhancementWizard.java | 131 +
.../tasks/bugs/wizards/ReportErrorPage.java | 177 +
.../tasks/bugs/wizards/ReportErrorWizard.java | 67 +
.../bugs/wizards/SelectSupportElementPage.java | 404 +
.../tasks/bugs/wizards/messages.properties | 18 +
org.eclipse.mylyn.tasks.core/.classpath | 12 +
org.eclipse.mylyn.tasks.core/.cvsignore | 2 +
org.eclipse.mylyn.tasks.core/.project | 34 +
.../.refactorings/2006/10/41/refactorings.history | 5 +
.../.refactorings/2006/10/41/refactorings.index | 2 +
.../.refactorings/2006/10/42/refactorings.history | 8 +
.../.refactorings/2006/10/42/refactorings.index | 5 +
.../.refactorings/2006/10/43/refactorings.history | 5 +
.../.refactorings/2006/10/43/refactorings.index | 2 +
.../.refactorings/2006/10/44/refactorings.history | 7 +
.../.refactorings/2006/10/44/refactorings.index | 4 +
.../.refactorings/2006/11/44/refactorings.history | 5 +
.../.refactorings/2006/11/44/refactorings.index | 2 +
.../.refactorings/2006/11/46/refactorings.history | 10 +
.../.refactorings/2006/11/46/refactorings.index | 7 +
.../.refactorings/2006/11/47/refactorings.history | 6 +
.../.refactorings/2006/11/47/refactorings.index | 3 +
.../.refactorings/2006/11/48/refactorings.history | 9 +
.../.refactorings/2006/11/48/refactorings.index | 6 +
.../.refactorings/2006/12/49/refactorings.history | 10 +
.../.refactorings/2006/12/49/refactorings.index | 7 +
.../.refactorings/2006/3/13/refactorings.history | 4 +
.../.refactorings/2006/3/13/refactorings.index | 1 +
.../.refactorings/2006/6/22/refactorings.history | 4 +
.../.refactorings/2006/6/22/refactorings.index | 1 +
.../.refactorings/2006/7/28/refactorings.history | 5 +
.../.refactorings/2006/7/28/refactorings.index | 2 +
.../.refactorings/2006/7/29/refactorings.history | 9 +
.../.refactorings/2006/7/29/refactorings.index | 6 +
.../.refactorings/2006/7/30/refactorings.history | 5 +
.../.refactorings/2006/7/30/refactorings.index | 2 +
.../.refactorings/2006/8/31/refactorings.history | 4 +
.../.refactorings/2006/8/31/refactorings.index | 1 +
.../.refactorings/2006/9/36/refactorings.history | 15 +
.../.refactorings/2006/9/36/refactorings.index | 12 +
.../.refactorings/2006/9/37/refactorings.history | 4 +
.../.refactorings/2006/9/37/refactorings.index | 1 +
.../.refactorings/2006/9/38/refactorings.history | 6 +
.../.refactorings/2006/9/38/refactorings.index | 3 +
.../.refactorings/2007/1/2/refactorings.history | 15 +
.../.refactorings/2007/1/2/refactorings.index | 12 +
.../.refactorings/2007/1/3/refactorings.history | 4 +
.../.refactorings/2007/1/3/refactorings.index | 1 +
.../.refactorings/2007/1/4/refactorings.history | 4 +
.../.refactorings/2007/1/4/refactorings.index | 1 +
.../.refactorings/2007/1/5/refactorings.history | 21 +
.../.refactorings/2007/1/5/refactorings.index | 18 +
.../.refactorings/2007/12/49/refactorings.history | 3 +
.../.refactorings/2007/12/49/refactorings.index | 5 +
.../.refactorings/2007/12/50/refactorings.history | 3 +
.../.refactorings/2007/12/50/refactorings.index | 2 +
.../.refactorings/2007/2/5/refactorings.history | 4 +
.../.refactorings/2007/2/5/refactorings.index | 1 +
.../.refactorings/2007/2/6/refactorings.history | 26 +
.../.refactorings/2007/2/6/refactorings.index | 23 +
.../.refactorings/2007/2/7/refactorings.history | 14 +
.../.refactorings/2007/2/7/refactorings.index | 10 +
.../.refactorings/2007/2/8/refactorings.history | 6 +
.../.refactorings/2007/2/8/refactorings.index | 3 +
.../.refactorings/2007/3/12/refactorings.history | 5 +
.../.refactorings/2007/3/12/refactorings.index | 2 +
.../.refactorings/2007/3/13/refactorings.history | 5 +
.../.refactorings/2007/3/13/refactorings.index | 2 +
.../.refactorings/2007/4/14/refactorings.history | 4 +
.../.refactorings/2007/4/14/refactorings.index | 1 +
.../.refactorings/2007/4/16/refactorings.history | 5 +
.../.refactorings/2007/4/16/refactorings.index | 2 +
.../.refactorings/2007/4/17/refactorings.history | 6 +
.../.refactorings/2007/4/17/refactorings.index | 3 +
.../.refactorings/2007/5/19/refactorings.history | 7 +
.../.refactorings/2007/5/19/refactorings.index | 4 +
.../.refactorings/2007/5/20/refactorings.history | 4 +
.../.refactorings/2007/5/20/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 7 +
.../.refactorings/2007/5/22/refactorings.index | 3 +
.../.refactorings/2007/6/22/refactorings.history | 4 +
.../.refactorings/2007/6/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 25 +
.../.refactorings/2007/6/23/refactorings.index | 22 +
.../.refactorings/2007/6/24/refactorings.history | 42 +
.../.refactorings/2007/6/24/refactorings.index | 38 +
.../.refactorings/2007/6/25/refactorings.history | 114 +
.../.refactorings/2007/6/25/refactorings.index | 110 +
.../.refactorings/2007/6/26/refactorings.history | 46 +
.../.refactorings/2007/6/26/refactorings.index | 43 +
.../.refactorings/2007/8/35/refactorings.history | 6 +
.../.refactorings/2007/8/35/refactorings.index | 3 +
.../.refactorings/2007/9/36/refactorings.history | 4 +
.../.refactorings/2007/9/36/refactorings.index | 1 +
.../.refactorings/2007/9/37/refactorings.history | 4 +
.../.refactorings/2007/9/37/refactorings.index | 1 +
.../.refactorings/2007/9/38/refactorings.history | 4 +
.../.refactorings/2007/9/38/refactorings.index | 1 +
.../.refactorings/2007/9/39/refactorings.history | 4 +
.../.refactorings/2007/9/39/refactorings.index | 1 +
.../.refactorings/2008/1/4/refactorings.history | 3 +
.../.refactorings/2008/1/4/refactorings.index | 6 +
.../.refactorings/2008/1/5/refactorings.history | 3 +
.../.refactorings/2008/1/5/refactorings.index | 2 +
.../.refactorings/2008/10/40/refactorings.history | 3 +
.../.refactorings/2008/10/40/refactorings.index | 3 +
.../.refactorings/2008/11/45/refactorings.history | 3 +
.../.refactorings/2008/11/45/refactorings.index | 2 +
.../.refactorings/2008/2/7/refactorings.history | 3 +
.../.refactorings/2008/2/7/refactorings.index | 2 +
.../.refactorings/2008/3/13/refactorings.history | 3 +
.../.refactorings/2008/3/13/refactorings.index | 3 +
.../.refactorings/2008/3/14/refactorings.history | 4 +
.../.refactorings/2008/3/14/refactorings.index | 1 +
.../.refactorings/2008/4/14/refactorings.history | 3 +
.../.refactorings/2008/4/14/refactorings.index | 12 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 39 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 48 +
.../.refactorings/2008/4/17/refactorings.history | 27 +
.../.refactorings/2008/4/17/refactorings.index | 24 +
.../.refactorings/2008/4/18/refactorings.history | 26 +
.../.refactorings/2008/4/18/refactorings.index | 23 +
.../.refactorings/2008/5/18/refactorings.history | 3 +
.../.refactorings/2008/5/18/refactorings.index | 51 +
.../.refactorings/2008/5/19/refactorings.history | 38 +
.../.refactorings/2008/5/19/refactorings.index | 35 +
.../.refactorings/2008/5/20/refactorings.history | 3 +
.../.refactorings/2008/5/20/refactorings.index | 14 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 30 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 21 +
.../.refactorings/2008/6/22/refactorings.history | 3 +
.../.refactorings/2008/6/22/refactorings.index | 3 +
.../.refactorings/2008/6/23/refactorings.history | 3 +
.../.refactorings/2008/6/23/refactorings.index | 17 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 2 +
.../.refactorings/2008/7/27/refactorings.history | 3 +
.../.refactorings/2008/7/27/refactorings.index | 5 +
.../.refactorings/2008/9/37/refactorings.history | 4 +
.../.refactorings/2008/9/37/refactorings.index | 1 +
.../.refactorings/2009/3/14/refactorings.history | 3 +
.../.refactorings/2009/3/14/refactorings.index | 2 +
.../.refactorings/2009/5/19/refactorings.history | 3 +
.../.refactorings/2009/5/19/refactorings.index | 2 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF | 21 +
org.eclipse.mylyn.tasks.core/about.html | 27 +
org.eclipse.mylyn.tasks.core/build-user.xml | 3 +
org.eclipse.mylyn.tasks.core/build.properties | 16 +
.../icons/elcl16/edge-ref-bug.gif | Bin 0 -> 572 bytes
org.eclipse.mylyn.tasks.core/plugin.properties | 3 +
org.eclipse.mylyn.tasks.core/plugin.xml | 30 +
org.eclipse.mylyn.tasks.core/schema/templates.exsd | 194 +
.../tasks/core/RepositoryClientManager.java | 166 +
.../internal/provisional/tasks/core/TasksUtil.java | 67 +
.../internal/tasks/core/AbstractSearchHandler.java | 32 +
.../mylyn/internal/tasks/core/AbstractTask.java | 513 +
.../internal/tasks/core/AbstractTaskCategory.java | 26 +
.../internal/tasks/core/AbstractTaskContainer.java | 183 +
.../mylyn/internal/tasks/core/AttributeMap.java | 47 +
.../core/AutomaticRepositoryTaskContainer.java | 60 +
.../mylyn/internal/tasks/core/CommentQuoter.java | 98 +
.../mylyn/internal/tasks/core/DateRange.java | 170 +
.../mylyn/internal/tasks/core/DayDateRange.java | 88 +
.../internal/tasks/core/DefaultTaskMapping.java | 45 +
.../internal/tasks/core/IRepositoryConstants.java | 40 +
.../tasks/core/IRepositoryModelListener.java | 24 +
.../mylyn/internal/tasks/core/ITaskJobFactory.java | 50 +
.../mylyn/internal/tasks/core/ITaskList.java | 85 +
.../tasks/core/ITaskListChangeListener.java | 26 +
.../internal/tasks/core/ITaskListRunnable.java | 23 +
.../tasks/core/ITaskRepositoryElement.java | 23 +
.../internal/tasks/core/ITaskRepositoryFilter.java | 58 +
.../internal/tasks/core/ITasksCoreConstants.java | 146 +
.../mylyn/internal/tasks/core/ITransferList.java | 46 +
.../tasks/core/LocalRepositoryConnector.java | 118 +
.../mylyn/internal/tasks/core/LocalTask.java | 55 +
.../mylyn/internal/tasks/core/Messages.java | 64 +
.../eclipse/mylyn/internal/tasks/core/Person.java | 36 +
.../core/RepositoryExternalizationParticipant.java | 105 +
.../mylyn/internal/tasks/core/RepositoryModel.java | 137 +
.../internal/tasks/core/RepositoryPerson.java | 66 +
.../mylyn/internal/tasks/core/RepositoryQuery.java | 144 +
.../tasks/core/RepositoryTaskHandleUtil.java | 57 +
.../tasks/core/RepositoryTemplateManager.java | 60 +
.../tasks/core/SaxRepositoriesContentHandler.java | 59 +
.../internal/tasks/core/SaxRepositoriesWriter.java | 193 +
.../tasks/core/ScheduledTaskContainer.java | 221 +
.../internal/tasks/core/TaskActivationHistory.java | 127 +
.../internal/tasks/core/TaskActivityManager.java | 849 ++
.../internal/tasks/core/TaskActivityUtil.java | 263 +
.../mylyn/internal/tasks/core/TaskAttachment.java | 163 +
.../mylyn/internal/tasks/core/TaskCategory.java | 57 +
.../mylyn/internal/tasks/core/TaskComment.java | 115 +
.../internal/tasks/core/TaskContainerDelta.java | 116 +
.../tasks/core/TaskExternalizationException.java | 30 +
.../mylyn/internal/tasks/core/TaskGroup.java | 46 +
.../mylyn/internal/tasks/core/TaskList.java | 723 +
.../tasks/core/TaskRepositoriesExternalizer.java | 134 +
.../internal/tasks/core/TaskRepositoryAdapter.java | 39 +
.../tasks/core/TaskRepositoryLocation.java | 62 +
.../internal/tasks/core/TaskRepositoryManager.java | 413 +
.../mylyn/internal/tasks/core/TaskTask.java | 42 +
.../mylyn/internal/tasks/core/TransferList.java | 108 +
.../tasks/core/UncategorizedTaskContainer.java | 51 +
.../tasks/core/UnmatchedTaskContainer.java | 33 +
.../tasks/core/UnsubmittedTaskContainer.java | 31 +
.../mylyn/internal/tasks/core/WeekDateRange.java | 168 +
.../internal/tasks/core/data/ElementHandler.java | 123 +
.../tasks/core/data/FileTaskAttachmentSource.java | 157 +
.../tasks/core/data/ITaskDataConstants.java | 102 +
.../tasks/core/data/ITaskDataManagerListener.java | 23 +
.../tasks/core/data/TaskDataExternalizer.java | 127 +
.../internal/tasks/core/data/TaskDataManager.java | 548 +
.../tasks/core/data/TaskDataManagerEvent.java | 93 +
.../internal/tasks/core/data/TaskDataState.java | 205 +
.../tasks/core/data/TaskDataStateReader.java | 626 +
.../tasks/core/data/TaskDataStateWriter.java | 124 +
.../internal/tasks/core/data/TaskDataStore.java | 166 +
.../tasks/core/data/TextTaskAttachmentSource.java | 59 +
.../AbstractExternalizationParticipant.java | 109 +
.../DelegatingTaskExternalizer.java | 805 ++
.../externalization/ExternalizationManager.java | 244 +
.../externalization/IExternalizationContext.java | 26 +
.../IExternalizationParticipant.java | 31 +
.../tasks/core/externalization/Messages.java | 35 +
.../TaskListExternalizationParticipant.java | 183 +
.../core/externalization/TaskListExternalizer.java | 320 +
.../tasks/core/externalization/messages.properties | 5 +
.../mylyn/internal/tasks/core/messages.properties | 26 +
.../mylyn/internal/tasks/core/sync/Messages.java | 69 +
.../tasks/core/sync/SubmitTaskAttachmentJob.java | 114 +
.../internal/tasks/core/sync/SubmitTaskJob.java | 134 +
.../tasks/core/sync/SynchronizationSession.java | 143 +
.../tasks/core/sync/SynchronizeQueriesJob.java | 331 +
.../core/sync/SynchronizeRepositoriesJob.java | 195 +
.../tasks/core/sync/SynchronizeTasksJob.java | 339 +
.../internal/tasks/core/sync/messages.properties | 24 +
.../tasks/core/AbstractDuplicateDetector.java | 54 +
.../tasks/core/AbstractRepositoryConnector.java | 281 +
.../mylyn/tasks/core/AbstractTaskListMigrator.java | 40 +
.../mylyn/tasks/core/IAttributeContainer.java | 30 +
.../mylyn/tasks/core/IRepositoryElement.java | 42 +
.../mylyn/tasks/core/IRepositoryListener.java | 50 +
.../mylyn/tasks/core/IRepositoryManager.java | 42 +
.../eclipse/mylyn/tasks/core/IRepositoryModel.java | 50 +
.../mylyn/tasks/core/IRepositoryPerson.java | 52 +
.../eclipse/mylyn/tasks/core/IRepositoryQuery.java | 51 +
.../src/org/eclipse/mylyn/tasks/core/ITask.java | 338 +
.../mylyn/tasks/core/ITaskActivationListener.java | 40 +
.../mylyn/tasks/core/ITaskActivityListener.java | 37 +
.../mylyn/tasks/core/ITaskActivityManager.java | 85 +
.../eclipse/mylyn/tasks/core/ITaskAttachment.java | 146 +
.../org/eclipse/mylyn/tasks/core/ITaskComment.java | 103 +
.../eclipse/mylyn/tasks/core/ITaskContainer.java | 33 +
.../org/eclipse/mylyn/tasks/core/ITaskMapping.java | 81 +
.../mylyn/tasks/core/RepositoryResponse.java | 47 +
.../eclipse/mylyn/tasks/core/RepositoryStatus.java | 198 +
.../mylyn/tasks/core/RepositoryTemplate.java | 75 +
.../mylyn/tasks/core/TaskActivationAdapter.java | 32 +
.../mylyn/tasks/core/TaskActivityAdapter.java | 26 +
.../org/eclipse/mylyn/tasks/core/TaskMapping.java | 219 +
.../eclipse/mylyn/tasks/core/TaskRepository.java | 926 ++
.../tasks/core/TaskRepositoryLocationFactory.java | 30 +
.../core/data/AbstractTaskAttachmentHandler.java | 39 +
.../core/data/AbstractTaskAttachmentSource.java | 39 +
.../tasks/core/data/AbstractTaskDataHandler.java | 96 +
.../mylyn/tasks/core/data/ITaskDataManager.java | 56 +
.../tasks/core/data/ITaskDataWorkingCopy.java | 82 +
.../tasks/core/data/TaskAttachmentMapper.java | 298 +
.../mylyn/tasks/core/data/TaskAttachmentModel.java | 90 +
.../tasks/core/data/TaskAttachmentPartSource.java | 56 +
.../mylyn/tasks/core/data/TaskAttribute.java | 563 +
.../mylyn/tasks/core/data/TaskAttributeMapper.java | 276 +
.../tasks/core/data/TaskAttributeMetaData.java | 142 +
.../mylyn/tasks/core/data/TaskCommentMapper.java | 181 +
.../eclipse/mylyn/tasks/core/data/TaskData.java | 107 +
.../mylyn/tasks/core/data/TaskDataCollector.java | 29 +
.../mylyn/tasks/core/data/TaskDataModel.java | 180 +
.../mylyn/tasks/core/data/TaskDataModelEvent.java | 50 +
.../tasks/core/data/TaskDataModelListener.java | 25 +
.../eclipse/mylyn/tasks/core/data/TaskMapper.java | 465 +
.../mylyn/tasks/core/data/TaskOperation.java | 162 +
.../mylyn/tasks/core/data/TaskRelation.java | 117 +
.../tasks/core/sync/ISynchronizationSession.java | 97 +
.../eclipse/mylyn/tasks/core/sync/SubmitJob.java | 142 +
.../mylyn/tasks/core/sync/SubmitJobEvent.java | 38 +
.../mylyn/tasks/core/sync/SubmitJobListener.java | 38 +
.../mylyn/tasks/core/sync/SynchronizationJob.java | 56 +
.../org/eclipse/mylyn/tasks/core/sync/TaskJob.java | 36 +
org.eclipse.mylyn.tasks.tests/.classpath | 16 +
org.eclipse.mylyn.tasks.tests/.cvsignore | 1 +
org.eclipse.mylyn.tasks.tests/.project | 34 +
.../.refactorings/2006/10/42/refactorings.history | 4 +
.../.refactorings/2006/10/42/refactorings.index | 1 +
.../.refactorings/2006/11/44/refactorings.history | 4 +
.../.refactorings/2006/11/44/refactorings.index | 1 +
.../.refactorings/2006/11/47/refactorings.history | 4 +
.../.refactorings/2006/11/47/refactorings.index | 1 +
.../.refactorings/2006/12/49/refactorings.history | 6 +
.../.refactorings/2006/12/49/refactorings.index | 2 +
.../.refactorings/2006/2/8/refactorings.history | 10 +
.../.refactorings/2006/2/8/refactorings.index | 7 +
.../.refactorings/2006/3/10/refactorings.history | 5 +
.../.refactorings/2006/3/10/refactorings.index | 2 +
.../.refactorings/2006/3/9/refactorings.history | 4 +
.../.refactorings/2006/3/9/refactorings.index | 1 +
.../.refactorings/2006/5/20/refactorings.history | 5 +
.../.refactorings/2006/5/20/refactorings.index | 2 +
.../.refactorings/2006/6/24/refactorings.history | 4 +
.../.refactorings/2006/6/24/refactorings.index | 1 +
.../.refactorings/2006/6/25/refactorings.history | 12 +
.../.refactorings/2006/6/25/refactorings.index | 9 +
.../.refactorings/2006/6/26/refactorings.history | 5 +
.../.refactorings/2006/6/26/refactorings.index | 2 +
.../.refactorings/2006/7/28/refactorings.history | 8 +
.../.refactorings/2006/7/28/refactorings.index | 5 +
.../.refactorings/2006/7/29/refactorings.history | 5 +
.../.refactorings/2006/7/29/refactorings.index | 2 +
.../.refactorings/2006/7/30/refactorings.history | 4 +
.../.refactorings/2006/7/30/refactorings.index | 1 +
.../.refactorings/2006/8/33/refactorings.history | 4 +
.../.refactorings/2006/8/33/refactorings.index | 1 +
.../.refactorings/2006/8/34/refactorings.history | 5 +
.../.refactorings/2006/8/34/refactorings.index | 2 +
.../.refactorings/2006/9/37/refactorings.history | 4 +
.../.refactorings/2006/9/37/refactorings.index | 1 +
.../.refactorings/2006/9/38/refactorings.history | 5 +
.../.refactorings/2006/9/38/refactorings.index | 2 +
.../.refactorings/2007/1/3/refactorings.history | 5 +
.../.refactorings/2007/1/3/refactorings.index | 2 +
.../.refactorings/2007/11/47/refactorings.history | 4 +
.../.refactorings/2007/11/47/refactorings.index | 1 +
.../.refactorings/2007/12/51/refactorings.history | 4 +
.../.refactorings/2007/12/51/refactorings.index | 1 +
.../.refactorings/2007/2/6/refactorings.history | 4 +
.../.refactorings/2007/2/6/refactorings.index | 1 +
.../.refactorings/2007/3/13/refactorings.history | 4 +
.../.refactorings/2007/3/13/refactorings.index | 1 +
.../.refactorings/2007/4/15/refactorings.history | 4 +
.../.refactorings/2007/4/15/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 4 +
.../.refactorings/2007/5/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 4 +
.../.refactorings/2007/6/23/refactorings.index | 1 +
.../.refactorings/2007/6/24/refactorings.history | 5 +
.../.refactorings/2007/6/24/refactorings.index | 2 +
.../.refactorings/2007/6/25/refactorings.history | 11 +
.../.refactorings/2007/6/25/refactorings.index | 8 +
.../.refactorings/2007/8/33/refactorings.history | 7 +
.../.refactorings/2007/8/33/refactorings.index | 4 +
.../.refactorings/2007/8/34/refactorings.history | 3 +
.../.refactorings/2007/8/34/refactorings.index | 3 +
.../.refactorings/2007/8/35/refactorings.history | 4 +
.../.refactorings/2007/8/35/refactorings.index | 1 +
.../.refactorings/2007/9/38/refactorings.history | 3 +
.../.refactorings/2007/9/38/refactorings.index | 7 +
.../.refactorings/2008/10/40/refactorings.history | 3 +
.../.refactorings/2008/10/40/refactorings.index | 4 +
.../.refactorings/2008/12/52/refactorings.history | 4 +
.../.refactorings/2008/12/52/refactorings.index | 1 +
.../.refactorings/2008/3/9/refactorings.history | 4 +
.../.refactorings/2008/3/9/refactorings.index | 1 +
.../.refactorings/2008/4/14/refactorings.history | 3 +
.../.refactorings/2008/4/14/refactorings.index | 2 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 2 +
.../.refactorings/2008/4/17/refactorings.history | 3 +
.../.refactorings/2008/4/17/refactorings.index | 2 +
.../.refactorings/2008/4/18/refactorings.history | 3 +
.../.refactorings/2008/4/18/refactorings.index | 5 +
.../.refactorings/2008/5/19/refactorings.history | 2 +
.../.refactorings/2008/5/19/refactorings.index | 2 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 3 +
.../.refactorings/2008/6/23/refactorings.history | 3 +
.../.refactorings/2008/6/23/refactorings.index | 2 +
.../.refactorings/2008/9/38/refactorings.history | 3 +
.../.refactorings/2008/9/38/refactorings.index | 16 +
.../.refactorings/2008/9/39/refactorings.history | 3 +
.../.refactorings/2008/9/39/refactorings.index | 4 +
.../.refactorings/2009/1/2/refactorings.history | 3 +
.../.refactorings/2009/1/2/refactorings.index | 4 +
.../.refactorings/2009/7/30/refactorings.history | 4 +
.../.refactorings/2009/7/30/refactorings.index | 1 +
.../.settings/.api_filters | 19 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.api.tools.prefs | 151 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF | 43 +
org.eclipse.mylyn.tasks.tests/about.html | 27 +
org.eclipse.mylyn.tasks.tests/build.properties | 17 +
org.eclipse.mylyn.tasks.tests/plugin.xml | 39 +
.../tasks/tests/AllTasksPerformanceTests.java | 29 +
.../eclipse/mylyn/tasks/tests/AllTasksTests.java | 104 +
.../tasks/tests/AttachmentSizeFormatterTest.java | 76 +
.../mylyn/tasks/tests/BackgroundSaveTest.java | 49 +
.../tasks/tests/CommentGroupStrategyTest.java | 240 +
.../mylyn/tasks/tests/CommentQuoterTest.java | 73 +
.../mylyn/tasks/tests/CopyDetailsActionTest.java | 30 +
.../eclipse/mylyn/tasks/tests/DateRangeTest.java | 173 +
.../mylyn/tasks/tests/LinkProviderTest.java | 101 +
.../tests/NewTaskFromSelectionActionTest.java | 68 +
.../NewTaskWizardRepositorySelectionTest.java | 93 +
.../tasks/tests/PersonProposalProviderTest.java | 206 +
.../tests/ProjectRepositoryAssociationTest.java | 77 +
.../mylyn/tasks/tests/QueryExportImportTest.java | 290 +
.../tests/RefactorRepositoryUrlOperationTest.java | 206 +
.../tasks/tests/RepositorySettingsPageTest.java | 268 +
.../tasks/tests/RepositoryTemplateManagerTest.java | 47 +
.../tasks/tests/ScheduledPresentationTest.java | 181 +
.../tests/StackTraceDuplicateDetectorTest.java | 100 +
.../tasks/tests/TaskActivationActionTest.java | 50 +
.../tasks/tests/TaskActivationHistoryTest.java | 328 +
.../mylyn/tasks/tests/TaskActivityManagerTest.java | 224 +
.../mylyn/tasks/tests/TaskActivityTimingTest.java | 1331 ++
.../mylyn/tasks/tests/TaskAttachmentTest.java | 112 +
.../mylyn/tasks/tests/TaskContainerTest.java | 39 +
.../mylyn/tasks/tests/TaskDataExportTest.java | 204 +
.../mylyn/tasks/tests/TaskDataImportTest.java | 124 +
.../mylyn/tasks/tests/TaskDataManagerTest.java | 293 +
.../mylyn/tasks/tests/TaskDataStoreTest.java | 196 +
.../mylyn/tasks/tests/TaskDiffUtilTest.java | 56 +
.../mylyn/tasks/tests/TaskExportImportTest.java | 117 +
.../mylyn/tasks/tests/TaskKeyComparatorTest.java | 69 +
.../tasks/tests/TaskListBackupManagerTest.java | 69 +
.../tasks/tests/TaskListContentProviderTest.java | 70 +
.../mylyn/tasks/tests/TaskListDropAdapterTest.java | 66 +
.../tasks/tests/TaskListExternalizationTest.java | 384 +
.../tasks/tests/TaskListPresentationTest.java | 33 +
.../mylyn/tasks/tests/TaskListSaveManagerTest.java | 109 +
.../mylyn/tasks/tests/TaskListSorterTest.java | 301 +
.../eclipse/mylyn/tasks/tests/TaskListTest.java | 555 +
.../eclipse/mylyn/tasks/tests/TaskListUiTest.java | 361 +
.../eclipse/mylyn/tasks/tests/TaskMapperTest.java | 186 +
.../mylyn/tasks/tests/TaskPlanningEditorTest.java | 110 +
.../tests/TaskRepositoriesExternalizerTest.java | 111 +
.../tasks/tests/TaskRepositoryFilterTests.java | 81 +
.../tasks/tests/TaskRepositoryManagerTest.java | 329 +
.../tasks/tests/TaskRepositorySorterTest.java | 75 +
.../mylyn/tasks/tests/TaskRepositoryTest.java | 163 +
.../org/eclipse/mylyn/tasks/tests/TaskTest.java | 78 +
.../eclipse/mylyn/tasks/tests/TaskTestUtil.java | 149 +
.../mylyn/tasks/tests/TaskWorkingSetTest.java | 158 +
.../mylyn/tasks/tests/TasksTestsPlugin.java | 47 +
.../eclipse/mylyn/tasks/tests/TasksUiUtilTest.java | 175 +
.../eclipse/mylyn/tasks/tests/TasksUtilTest.java | 47 +
.../tests/connector/MockAttachmentHandler.java | 57 +
.../tests/connector/MockRepositoryConnector.java | 173 +
.../tests/connector/MockRepositoryConnectorUi.java | 74 +
.../tasks/tests/connector/MockRepositoryQuery.java | 39 +
.../mylyn/tasks/tests/connector/MockTask.java | 65 +
.../tests/core/FileTaskAttachmentSourceTest.java | 30 +
.../tasks/tests/core/ITasksCoreConstantsTest.java | 41 +
.../tests/core/TaskListUnmatchedContainerTest.java | 296 +
.../tests/core/TaskRepositoryLocationTest.java | 106 +
.../tasks/tests/data/TaskDataExternalizerTest.java | 193 +
.../tasks/tests/performance/TaskContainerTest.java | 49 +
.../tests/performance/TaskListPerformanceTest.java | 74 +
.../tests/ui/ContextPerspectiveManagerTest.java | 97 +
.../mylyn/tasks/tests/ui/MarkTaskHandlerTest.java | 90 +
.../tasks/tests/ui/RetrieveTitleFromUrlTest.java | 47 +
.../tests/ui/TaskAttachmentPropertyTesterTest.java | 46 +
.../tasks/tests/ui/TaskHyperlinkDetectorTest.java | 95 +
.../mylyn/tasks/tests/ui/TaskListFilterTest.java | 180 +
.../ui/TaskRelationHyperlinkDetectorTest.java | 35 +
.../tasks/tests/ui/editor/EditorUtilTest.java | 116 +
.../ui/editor/TaskEditorPartDescriptorTest.java | 62 +
.../ui/editor/TaskUrlHyperlinkDetectorTest.java | 116 +
.../tasks/tests/util/TestTaskDataCollector.java | 53 +
.../testdata/activityTests/.activity.xml.zip | Bin 0 -> 342 bytes
.../testdata/activityTests/activity.xml.zip | Bin 0 -> 339 bytes
.../testdata/legacy/tasklist_0_4_8.xml | 1 +
.../testdata/performance/tasklist-4000.xml.zip | Bin 0 -> 284854 bytes
.../testdata/taskdata-1.0-bug-219897.zip | Bin 0 -> 4526 bytes
.../taskdataimporttest/context-history.xml | 1 +
.../testdata/taskdataimporttest/local-69.xml | 1 +
.../testdata/taskdataimporttest/local-70.xml | 1 +
.../taskdataimporttest/mylardata-2006-02-16.zip | Bin 0 -> 2670 bytes
.../taskdataimporttest/mylardata-2007-01-19.zip | Bin 0 -> 3275 bytes
.../testdata/taskdataimporttest/repositories.xml | 4 +
.../testdata/taskdataimporttest/tasklist.xml | 1 +
org.eclipse.mylyn.tasks.ui/.classpath | 18 +
org.eclipse.mylyn.tasks.ui/.cvsignore | 2 +
org.eclipse.mylyn.tasks.ui/.options | 1 +
org.eclipse.mylyn.tasks.ui/.project | 34 +
.../.refactorings/2006/10/39/refactorings.history | 5 +
.../.refactorings/2006/10/39/refactorings.index | 2 +
.../.refactorings/2006/10/41/refactorings.history | 9 +
.../.refactorings/2006/10/41/refactorings.index | 6 +
.../.refactorings/2006/10/42/refactorings.history | 25 +
.../.refactorings/2006/10/42/refactorings.index | 23 +
.../.refactorings/2006/10/43/refactorings.history | 11 +
.../.refactorings/2006/10/43/refactorings.index | 8 +
.../.refactorings/2006/10/44/refactorings.history | 6 +
.../.refactorings/2006/10/44/refactorings.index | 3 +
.../.refactorings/2006/11/44/refactorings.history | 8 +
.../.refactorings/2006/11/44/refactorings.index | 5 +
.../.refactorings/2006/11/45/refactorings.history | 12 +
.../.refactorings/2006/11/45/refactorings.index | 8 +
.../.refactorings/2006/11/46/refactorings.history | 10 +
.../.refactorings/2006/11/46/refactorings.index | 7 +
.../.refactorings/2006/11/47/refactorings.history | 26 +
.../.refactorings/2006/11/47/refactorings.index | 23 +
.../.refactorings/2006/11/48/refactorings.history | 14 +
.../.refactorings/2006/11/48/refactorings.index | 11 +
.../.refactorings/2006/12/48/refactorings.history | 6 +
.../.refactorings/2006/12/48/refactorings.index | 3 +
.../.refactorings/2006/12/49/refactorings.history | 44 +
.../.refactorings/2006/12/49/refactorings.index | 39 +
.../.refactorings/2006/12/50/refactorings.history | 4 +
.../.refactorings/2006/12/50/refactorings.index | 1 +
.../.refactorings/2006/2/6/refactorings.history | 13 +
.../.refactorings/2006/2/6/refactorings.index | 10 +
.../.refactorings/2006/2/7/refactorings.history | 53 +
.../.refactorings/2006/2/7/refactorings.index | 50 +
.../.refactorings/2006/2/8/refactorings.history | 21 +
.../.refactorings/2006/2/8/refactorings.index | 18 +
.../.refactorings/2006/3/10/refactorings.history | 27 +
.../.refactorings/2006/3/10/refactorings.index | 23 +
.../.refactorings/2006/3/11/refactorings.history | 32 +
.../.refactorings/2006/3/11/refactorings.index | 29 +
.../.refactorings/2006/3/13/refactorings.history | 5 +
.../.refactorings/2006/3/13/refactorings.index | 2 +
.../.refactorings/2006/3/9/refactorings.history | 42 +
.../.refactorings/2006/3/9/refactorings.index | 39 +
.../.refactorings/2006/4/13/refactorings.history | 7 +
.../.refactorings/2006/4/13/refactorings.index | 4 +
.../.refactorings/2006/4/14/refactorings.history | 27 +
.../.refactorings/2006/4/14/refactorings.index | 23 +
.../.refactorings/2006/4/16/refactorings.history | 5 +
.../.refactorings/2006/4/16/refactorings.index | 2 +
.../.refactorings/2006/4/17/refactorings.history | 10 +
.../.refactorings/2006/4/17/refactorings.index | 7 +
.../.refactorings/2006/5/18/refactorings.history | 5 +
.../.refactorings/2006/5/18/refactorings.index | 2 +
.../.refactorings/2006/5/19/refactorings.history | 8 +
.../.refactorings/2006/5/19/refactorings.index | 4 +
.../.refactorings/2006/5/20/refactorings.history | 13 +
.../.refactorings/2006/5/20/refactorings.index | 10 +
.../.refactorings/2006/5/21/refactorings.history | 8 +
.../.refactorings/2006/5/21/refactorings.index | 5 +
.../.refactorings/2006/5/22/refactorings.history | 5 +
.../.refactorings/2006/5/22/refactorings.index | 2 +
.../.refactorings/2006/6/22/refactorings.history | 48 +
.../.refactorings/2006/6/22/refactorings.index | 45 +
.../.refactorings/2006/6/23/refactorings.history | 22 +
.../.refactorings/2006/6/23/refactorings.index | 19 +
.../.refactorings/2006/6/24/refactorings.history | 30 +
.../.refactorings/2006/6/24/refactorings.index | 27 +
.../.refactorings/2006/6/25/refactorings.history | 23 +
.../.refactorings/2006/6/25/refactorings.index | 20 +
.../.refactorings/2006/6/26/refactorings.history | 33 +
.../.refactorings/2006/6/26/refactorings.index | 29 +
.../.refactorings/2006/7/27/refactorings.history | 10 +
.../.refactorings/2006/7/27/refactorings.index | 6 +
.../.refactorings/2006/7/28/refactorings.history | 25 +
.../.refactorings/2006/7/28/refactorings.index | 23 +
.../.refactorings/2006/7/29/refactorings.history | 13 +
.../.refactorings/2006/7/29/refactorings.index | 10 +
.../.refactorings/2006/7/30/refactorings.history | 10 +
.../.refactorings/2006/7/30/refactorings.index | 7 +
.../.refactorings/2006/7/31/refactorings.history | 7 +
.../.refactorings/2006/7/31/refactorings.index | 4 +
.../.refactorings/2006/8/31/refactorings.history | 6 +
.../.refactorings/2006/8/31/refactorings.index | 2 +
.../.refactorings/2006/8/32/refactorings.history | 24 +
.../.refactorings/2006/8/32/refactorings.index | 21 +
.../.refactorings/2006/8/33/refactorings.history | 7 +
.../.refactorings/2006/8/33/refactorings.index | 2 +
.../.refactorings/2006/8/34/refactorings.history | 34 +
.../.refactorings/2006/8/34/refactorings.index | 30 +
.../.refactorings/2006/8/35/refactorings.history | 5 +
.../.refactorings/2006/8/35/refactorings.index | 2 +
.../.refactorings/2006/9/36/refactorings.history | 7 +
.../.refactorings/2006/9/36/refactorings.index | 4 +
.../.refactorings/2006/9/37/refactorings.history | 7 +
.../.refactorings/2006/9/37/refactorings.index | 4 +
.../.refactorings/2006/9/38/refactorings.history | 10 +
.../.refactorings/2006/9/38/refactorings.index | 9 +
.../.refactorings/2006/9/39/refactorings.history | 7 +
.../.refactorings/2006/9/39/refactorings.index | 4 +
.../.refactorings/2007/1/1/refactorings.history | 4 +
.../.refactorings/2007/1/1/refactorings.index | 1 +
.../.refactorings/2007/1/2/refactorings.history | 6 +
.../.refactorings/2007/1/2/refactorings.index | 3 +
.../.refactorings/2007/1/3/refactorings.history | 7 +
.../.refactorings/2007/1/3/refactorings.index | 3 +
.../.refactorings/2007/1/4/refactorings.history | 13 +
.../.refactorings/2007/1/4/refactorings.index | 10 +
.../.refactorings/2007/1/5/refactorings.history | 7 +
.../.refactorings/2007/1/5/refactorings.index | 4 +
.../.refactorings/2007/10/40/refactorings.history | 4 +
.../.refactorings/2007/10/40/refactorings.index | 1 +
.../.refactorings/2007/10/41/refactorings.history | 3 +
.../.refactorings/2007/10/41/refactorings.index | 15 +
.../.refactorings/2007/10/43/refactorings.history | 3 +
.../.refactorings/2007/10/43/refactorings.index | 9 +
.../.refactorings/2007/10/44/refactorings.history | 3 +
.../.refactorings/2007/10/44/refactorings.index | 4 +
.../.refactorings/2007/11/44/refactorings.history | 4 +
.../.refactorings/2007/11/44/refactorings.index | 1 +
.../.refactorings/2007/11/45/refactorings.history | 3 +
.../.refactorings/2007/11/45/refactorings.index | 9 +
.../.refactorings/2007/11/46/refactorings.history | 3 +
.../.refactorings/2007/11/46/refactorings.index | 2 +
.../.refactorings/2007/11/47/refactorings.history | 3 +
.../.refactorings/2007/11/47/refactorings.index | 16 +
.../.refactorings/2007/11/48/refactorings.history | 27 +
.../.refactorings/2007/11/48/refactorings.index | 24 +
.../.refactorings/2007/12/48/refactorings.history | 4 +
.../.refactorings/2007/12/48/refactorings.index | 1 +
.../.refactorings/2007/12/49/refactorings.history | 3 +
.../.refactorings/2007/12/49/refactorings.index | 16 +
.../.refactorings/2007/12/50/refactorings.history | 4 +
.../.refactorings/2007/12/50/refactorings.index | 1 +
.../.refactorings/2007/12/51/refactorings.history | 3 +
.../.refactorings/2007/12/51/refactorings.index | 6 +
.../.refactorings/2007/2/5/refactorings.history | 7 +
.../.refactorings/2007/2/5/refactorings.index | 4 +
.../.refactorings/2007/2/6/refactorings.history | 11 +
.../.refactorings/2007/2/6/refactorings.index | 8 +
.../.refactorings/2007/2/7/refactorings.history | 5 +
.../.refactorings/2007/2/7/refactorings.index | 2 +
.../.refactorings/2007/2/8/refactorings.history | 8 +
.../.refactorings/2007/2/8/refactorings.index | 5 +
.../.refactorings/2007/2/9/refactorings.history | 7 +
.../.refactorings/2007/2/9/refactorings.index | 4 +
.../.refactorings/2007/3/10/refactorings.history | 5 +
.../.refactorings/2007/3/10/refactorings.index | 2 +
.../.refactorings/2007/3/11/refactorings.history | 9 +
.../.refactorings/2007/3/11/refactorings.index | 6 +
.../.refactorings/2007/3/12/refactorings.history | 27 +
.../.refactorings/2007/3/12/refactorings.index | 24 +
.../.refactorings/2007/3/13/refactorings.history | 18 +
.../.refactorings/2007/3/13/refactorings.index | 15 +
.../.refactorings/2007/3/9/refactorings.history | 6 +
.../.refactorings/2007/3/9/refactorings.index | 3 +
.../.refactorings/2007/4/15/refactorings.history | 7 +
.../.refactorings/2007/4/15/refactorings.index | 4 +
.../.refactorings/2007/4/16/refactorings.history | 5 +
.../.refactorings/2007/4/16/refactorings.index | 2 +
.../.refactorings/2007/4/17/refactorings.history | 15 +
.../.refactorings/2007/4/17/refactorings.index | 12 +
.../.refactorings/2007/4/18/refactorings.history | 10 +
.../.refactorings/2007/4/18/refactorings.index | 7 +
.../.refactorings/2007/5/18/refactorings.history | 20 +
.../.refactorings/2007/5/18/refactorings.index | 17 +
.../.refactorings/2007/5/19/refactorings.history | 28 +
.../.refactorings/2007/5/19/refactorings.index | 25 +
.../.refactorings/2007/5/20/refactorings.history | 5 +
.../.refactorings/2007/5/20/refactorings.index | 2 +
.../.refactorings/2007/5/21/refactorings.history | 14 +
.../.refactorings/2007/5/21/refactorings.index | 11 +
.../.refactorings/2007/5/22/refactorings.history | 7 +
.../.refactorings/2007/5/22/refactorings.index | 4 +
.../.refactorings/2007/6/22/refactorings.history | 4 +
.../.refactorings/2007/6/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 28 +
.../.refactorings/2007/6/23/refactorings.index | 25 +
.../.refactorings/2007/6/24/refactorings.history | 42 +
.../.refactorings/2007/6/24/refactorings.index | 38 +
.../.refactorings/2007/6/25/refactorings.history | 81 +
.../.refactorings/2007/6/25/refactorings.index | 77 +
.../.refactorings/2007/6/26/refactorings.history | 16 +
.../.refactorings/2007/6/26/refactorings.index | 13 +
.../.refactorings/2007/7/27/refactorings.history | 5 +
.../.refactorings/2007/7/27/refactorings.index | 2 +
.../.refactorings/2007/7/28/refactorings.history | 6 +
.../.refactorings/2007/7/28/refactorings.index | 3 +
.../.refactorings/2007/7/29/refactorings.history | 7 +
.../.refactorings/2007/7/29/refactorings.index | 4 +
.../.refactorings/2007/8/33/refactorings.history | 16 +
.../.refactorings/2007/8/33/refactorings.index | 12 +
.../.refactorings/2007/8/34/refactorings.history | 15 +
.../.refactorings/2007/8/34/refactorings.index | 12 +
.../.refactorings/2007/8/35/refactorings.history | 20 +
.../.refactorings/2007/8/35/refactorings.index | 17 +
.../.refactorings/2007/9/36/refactorings.history | 4 +
.../.refactorings/2007/9/36/refactorings.index | 1 +
.../.refactorings/2007/9/37/refactorings.history | 3 +
.../.refactorings/2007/9/37/refactorings.index | 3 +
.../.refactorings/2007/9/38/refactorings.history | 8 +
.../.refactorings/2007/9/38/refactorings.index | 5 +
.../.refactorings/2007/9/39/refactorings.history | 3 +
.../.refactorings/2007/9/39/refactorings.index | 10 +
.../.refactorings/2008/1/1/refactorings.history | 4 +
.../.refactorings/2008/1/1/refactorings.index | 1 +
.../.refactorings/2008/1/2/refactorings.history | 3 +
.../.refactorings/2008/1/2/refactorings.index | 23 +
.../.refactorings/2008/1/3/refactorings.history | 3 +
.../.refactorings/2008/1/3/refactorings.index | 9 +
.../.refactorings/2008/1/4/refactorings.history | 3 +
.../.refactorings/2008/1/4/refactorings.index | 2 +
.../.refactorings/2008/1/5/refactorings.history | 3 +
.../.refactorings/2008/1/5/refactorings.index | 6 +
.../.refactorings/2008/10/40/refactorings.history | 3 +
.../.refactorings/2008/10/40/refactorings.index | 34 +
.../.refactorings/2008/10/41/refactorings.history | 3 +
.../.refactorings/2008/10/41/refactorings.index | 10 +
.../.refactorings/2008/10/42/refactorings.history | 3 +
.../.refactorings/2008/10/42/refactorings.index | 6 +
.../.refactorings/2008/10/43/refactorings.history | 3 +
.../.refactorings/2008/10/43/refactorings.index | 4 +
.../.refactorings/2008/10/44/refactorings.history | 3 +
.../.refactorings/2008/10/44/refactorings.index | 2 +
.../.refactorings/2008/11/45/refactorings.history | 3 +
.../.refactorings/2008/11/45/refactorings.index | 4 +
.../.refactorings/2008/11/48/refactorings.history | 3 +
.../.refactorings/2008/11/48/refactorings.index | 3 +
.../.refactorings/2008/12/50/refactorings.history | 3 +
.../.refactorings/2008/12/50/refactorings.index | 36 +
.../.refactorings/2008/2/5/refactorings.history | 4 +
.../.refactorings/2008/2/5/refactorings.index | 1 +
.../.refactorings/2008/2/6/refactorings.history | 3 +
.../.refactorings/2008/2/6/refactorings.index | 3 +
.../.refactorings/2008/2/7/refactorings.history | 3 +
.../.refactorings/2008/2/7/refactorings.index | 2 +
.../.refactorings/2008/2/8/refactorings.history | 3 +
.../.refactorings/2008/2/8/refactorings.index | 5 +
.../.refactorings/2008/3/10/refactorings.history | 3 +
.../.refactorings/2008/3/10/refactorings.index | 15 +
.../.refactorings/2008/3/11/refactorings.history | 4 +
.../.refactorings/2008/3/11/refactorings.index | 1 +
.../.refactorings/2008/3/13/refactorings.history | 3 +
.../.refactorings/2008/3/13/refactorings.index | 13 +
.../.refactorings/2008/4/14/refactorings.history | 3 +
.../.refactorings/2008/4/14/refactorings.index | 10 +
.../.refactorings/2008/4/15/refactorings.history | 3 +
.../.refactorings/2008/4/15/refactorings.index | 32 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 14 +
.../.refactorings/2008/4/17/refactorings.history | 29 +
.../.refactorings/2008/4/17/refactorings.index | 26 +
.../.refactorings/2008/4/18/refactorings.history | 80 +
.../.refactorings/2008/4/18/refactorings.index | 77 +
.../.refactorings/2008/5/18/refactorings.history | 3 +
.../.refactorings/2008/5/18/refactorings.index | 42 +
.../.refactorings/2008/5/19/refactorings.history | 28 +
.../.refactorings/2008/5/19/refactorings.index | 25 +
.../.refactorings/2008/5/20/refactorings.history | 39 +
.../.refactorings/2008/5/20/refactorings.index | 36 +
.../.refactorings/2008/5/21/refactorings.history | 3 +
.../.refactorings/2008/5/21/refactorings.index | 31 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 29 +
.../.refactorings/2008/6/22/refactorings.history | 3 +
.../.refactorings/2008/6/22/refactorings.index | 18 +
.../.refactorings/2008/6/23/refactorings.history | 21 +
.../.refactorings/2008/6/23/refactorings.index | 18 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 21 +
.../.refactorings/2008/7/27/refactorings.history | 4 +
.../.refactorings/2008/7/27/refactorings.index | 1 +
.../.refactorings/2008/7/28/refactorings.history | 3 +
.../.refactorings/2008/7/28/refactorings.index | 2 +
.../.refactorings/2008/7/29/refactorings.history | 4 +
.../.refactorings/2008/7/29/refactorings.index | 1 +
.../.refactorings/2008/8/32/refactorings.history | 3 +
.../.refactorings/2008/8/32/refactorings.index | 2 +
.../.refactorings/2008/8/33/refactorings.history | 4 +
.../.refactorings/2008/8/33/refactorings.index | 1 +
.../.refactorings/2008/9/36/refactorings.history | 3 +
.../.refactorings/2008/9/36/refactorings.index | 5 +
.../.refactorings/2008/9/37/refactorings.history | 3 +
.../.refactorings/2008/9/37/refactorings.index | 15 +
.../.refactorings/2008/9/39/refactorings.history | 3 +
.../.refactorings/2008/9/39/refactorings.index | 2 +
.../.refactorings/2008/9/40/refactorings.history | 4 +
.../.refactorings/2008/9/40/refactorings.index | 1 +
.../.refactorings/2009/1/1/refactorings.history | 4 +
.../.refactorings/2009/1/1/refactorings.index | 1 +
.../.refactorings/2009/1/2/refactorings.history | 4 +
.../.refactorings/2009/1/2/refactorings.index | 1 +
.../.refactorings/2009/1/4/refactorings.history | 3 +
.../.refactorings/2009/1/4/refactorings.index | 6 +
.../.refactorings/2009/1/5/refactorings.history | 3 +
.../.refactorings/2009/1/5/refactorings.index | 12 +
.../.refactorings/2009/2/6/refactorings.history | 3 +
.../.refactorings/2009/2/6/refactorings.index | 2 +
.../.refactorings/2009/2/7/refactorings.history | 3 +
.../.refactorings/2009/2/7/refactorings.index | 2 +
.../.refactorings/2009/2/8/refactorings.history | 3 +
.../.refactorings/2009/2/8/refactorings.index | 6 +
.../.refactorings/2009/2/9/refactorings.history | 2 +
.../.refactorings/2009/2/9/refactorings.index | 2 +
.../.refactorings/2009/3/10/refactorings.history | 3 +
.../.refactorings/2009/3/10/refactorings.index | 2 +
.../.refactorings/2009/3/11/refactorings.history | 4 +
.../.refactorings/2009/3/11/refactorings.index | 1 +
.../.refactorings/2009/3/13/refactorings.history | 4 +
.../.refactorings/2009/3/13/refactorings.index | 1 +
.../.refactorings/2009/4/16/refactorings.history | 3 +
.../.refactorings/2009/4/16/refactorings.index | 2 +
.../.refactorings/2009/4/17/refactorings.history | 3 +
.../.refactorings/2009/4/17/refactorings.index | 7 +
.../.refactorings/2009/4/18/refactorings.history | 3 +
.../.refactorings/2009/4/18/refactorings.index | 12 +
.../.refactorings/2009/5/20/refactorings.history | 3 +
.../.refactorings/2009/5/20/refactorings.index | 4 +
.../.refactorings/2009/5/21/refactorings.history | 4 +
.../.refactorings/2009/5/21/refactorings.index | 1 +
.../.refactorings/2009/5/22/refactorings.history | 9 +
.../.refactorings/2009/5/22/refactorings.index | 6 +
.../.refactorings/2009/6/23/refactorings.history | 3 +
.../.refactorings/2009/6/23/refactorings.index | 3 +
.../.refactorings/2009/6/24/refactorings.history | 4 +
.../.refactorings/2009/6/24/refactorings.index | 1 +
.../.refactorings/2009/6/25/refactorings.history | 2 +
.../.refactorings/2009/6/25/refactorings.index | 2 +
.../.refactorings/2009/7/30/refactorings.history | 3 +
.../.refactorings/2009/7/30/refactorings.index | 2 +
org.eclipse.mylyn.tasks.ui/.settings/.api_filters | 19 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF | 50 +
org.eclipse.mylyn.tasks.ui/about.html | 27 +
org.eclipse.mylyn.tasks.ui/build.properties | 18 +
org.eclipse.mylyn.tasks.ui/doc/book.css | 1 +
org.eclipse.mylyn.tasks.ui/doc/bugzilla.html | 46 +
.../doc/images/tasklist-overview.gif | Bin 0 -> 9719 bytes
org.eclipse.mylyn.tasks.ui/doc/planning.html | 21 +
org.eclipse.mylyn.tasks.ui/doc/tasklist.html | 141 +
org.eclipse.mylyn.tasks.ui/doc/toc.xml | 13 +
.../icons/archive/bug-search.gif | Bin 0 -> 583 bytes
.../icons/archive/filter-archive.gif | Bin 0 -> 350 bytes
org.eclipse.mylyn.tasks.ui/icons/archive/find.gif | Bin 0 -> 157 bytes
.../icons/archive/overlay-due.gif | Bin 0 -> 108 bytes
.../icons/archive/overlay-offline.gif | Bin 0 -> 895 bytes
.../icons/archive/overlay-repository-context.gif | Bin 0 -> 166 bytes
.../icons/archive/overlay-repository.gif | Bin 0 -> 79 bytes
.../icons/archive/overlay-web.gif | Bin 0 -> 167 bytes
.../icons/archive/task-activity.gif | Bin 0 -> 581 bytes
.../icons/archive/task-bug.gif | Bin 0 -> 341 bytes
.../icons/archive/task-items.gif | Bin 0 -> 218 bytes
.../icons/archive/task-repository-completed.gif | Bin 0 -> 343 bytes
.../icons/archive/task-repository-notes.gif | Bin 0 -> 337 bytes
.../icons/archive/task-server.gif | Bin 0 -> 339 bytes
.../icons/elcl16/bug-search.gif | Bin 0 -> 583 bytes
org.eclipse.mylyn.tasks.ui/icons/etool12/reply.gif | Bin 0 -> 183 bytes
.../icons/etool12/repository-synchronize-small.png | Bin 0 -> 463 bytes
.../icons/etool12/task-narrow.gif | Bin 0 -> 209 bytes
.../icons/etool16/bug-report.gif | Bin 0 -> 159 bytes
.../icons/etool16/calendar.gif | Bin 0 -> 594 bytes
.../icons/etool16/capture-pause.gif | Bin 0 -> 212 bytes
.../icons/etool16/category-archive.gif | Bin 0 -> 354 bytes
.../icons/etool16/category-new.gif | Bin 0 -> 343 bytes
.../icons/etool16/category.gif | Bin 0 -> 213 bytes
.../icons/etool16/comment.gif | Bin 0 -> 309 bytes
.../icons/etool16/compare.png | Bin 0 -> 410 bytes
.../icons/etool16/context-add.gif | Bin 0 -> 331 bytes
.../icons/etool16/context-attach.gif | Bin 0 -> 355 bytes
.../icons/etool16/context-clear.gif | Bin 0 -> 316 bytes
.../icons/etool16/context-retrieve.gif | Bin 0 -> 361 bytes
.../icons/etool16/context-transfer.gif | Bin 0 -> 325 bytes
.../icons/etool16/export.gif | Bin 0 -> 329 bytes
.../icons/etool16/icons-legend.gif | Bin 0 -> 200 bytes
.../icons/etool16/import.gif | Bin 0 -> 327 bytes
.../icons/etool16/navigate-next.gif | Bin 0 -> 319 bytes
.../icons/etool16/navigate-previous-active.gif | Bin 0 -> 333 bytes
.../icons/etool16/navigate-previous-pause.gif | Bin 0 -> 325 bytes
.../icons/etool16/navigate-previous.gif | Bin 0 -> 317 bytes
.../icons/etool16/open-repository-task.gif | Bin 0 -> 227 bytes
.../icons/etool16/open-task.gif | Bin 0 -> 343 bytes
.../icons/etool16/person.gif | Bin 0 -> 308 bytes
.../icons/etool16/presentation-categorized.png | Bin 0 -> 361 bytes
.../icons/etool16/presentation-scheduled.png | Bin 0 -> 344 bytes
.../icons/etool16/query-new.gif | Bin 0 -> 349 bytes
.../icons/etool16/query-unmatched.png | Bin 0 -> 485 bytes
org.eclipse.mylyn.tasks.ui/icons/etool16/query.gif | Bin 0 -> 332 bytes
org.eclipse.mylyn.tasks.ui/icons/etool16/reply.gif | Bin 0 -> 188 bytes
.../icons/etool16/repository-new.gif | Bin 0 -> 342 bytes
.../icons/etool16/repository-submit.gif | Bin 0 -> 569 bytes
.../etool16/repository-synchronize-attributes.png | Bin 0 -> 514 bytes
.../icons/etool16/repository-synchronize.gif | Bin 0 -> 362 bytes
.../icons/etool16/sub-task-new.gif | Bin 0 -> 381 bytes
.../icons/etool16/task-active-centered.gif | Bin 0 -> 896 bytes
.../icons/etool16/task-active.gif | Bin 0 -> 199 bytes
.../icons/etool16/task-complete.gif | Bin 0 -> 343 bytes
.../icons/etool16/task-completed.gif | Bin 0 -> 333 bytes
.../icons/etool16/task-context.gif | Bin 0 -> 197 bytes
.../icons/etool16/task-inactive-centered.gif | Bin 0 -> 132 bytes
.../icons/etool16/task-inactive.gif | Bin 0 -> 132 bytes
.../icons/etool16/task-incomplete.gif | Bin 0 -> 148 bytes
.../icons/etool16/task-new.gif | Bin 0 -> 334 bytes
.../icons/etool16/task-notes.gif | Bin 0 -> 220 bytes
.../icons/etool16/task-remote.gif | Bin 0 -> 90 bytes
.../icons/etool16/task-repository-history.gif | Bin 0 -> 561 bytes
.../icons/etool16/task-repository-new.gif | Bin 0 -> 339 bytes
.../icons/etool16/task-repository.gif | Bin 0 -> 224 bytes
.../icons/etool16/task-retrieve.gif | Bin 0 -> 343 bytes
org.eclipse.mylyn.tasks.ui/icons/etool16/task.gif | Bin 0 -> 216 bytes
.../icons/etool16/tasklist-export.png | Bin 0 -> 430 bytes
.../icons/etool16/tasklist-import.png | Bin 0 -> 410 bytes
org.eclipse.mylyn.tasks.ui/icons/eview16/focus.gif | Bin 0 -> 357 bytes
.../icons/eview16/overlay-due.gif | Bin 0 -> 108 bytes
.../icons/eview16/perspective-planning.png | Bin 0 -> 782 bytes
.../icons/eview16/repositories-blue.gif | Bin 0 -> 367 bytes
.../icons/eview16/repositories.gif | Bin 0 -> 587 bytes
.../icons/eview16/repository-middle.gif | Bin 0 -> 325 bytes
.../icons/eview16/repository.gif | Bin 0 -> 328 bytes
.../icons/eview16/task-list.gif | Bin 0 -> 337 bytes
.../icons/eview16/task-search.gif | Bin 0 -> 587 bytes
.../icons/obj16/attachment-patch.gif | Bin 0 -> 342 bytes
.../icons/obj16/repository-small-top.gif | Bin 0 -> 908 bytes
.../icons/obj16/repository-small.gif | Bin 0 -> 310 bytes
.../icons/obj16/resource_obj.gif | Bin 0 -> 588 bytes
.../icons/obj16/workingSet.gif | Bin 0 -> 363 bytes
.../icons/ovr16/overlay-local.gif | Bin 0 -> 169 bytes
.../icons/wizban/banner-repository-context.gif | Bin 0 -> 2866 bytes
.../icons/wizban/banner-repository-settings.gif | Bin 0 -> 3345 bytes
.../icons/wizban/banner-repository.gif | Bin 0 -> 2749 bytes
.../icons/wizban/bug-wizard.gif | Bin 0 -> 3895 bytes
.../icons/wizban/secur_role_wiz.gif | Bin 0 -> 3153 bytes
.../icons/wizban/workset_wiz.png | Bin 0 -> 6602 bytes
org.eclipse.mylyn.tasks.ui/plugin.properties | 194 +
org.eclipse.mylyn.tasks.ui/plugin.xml | 1932 +++
org.eclipse.mylyn.tasks.ui/schema/actions.exsd | 94 +
.../schema/duplicateDetectors.exsd | 119 +
org.eclipse.mylyn.tasks.ui/schema/editors.exsd | 109 +
.../schema/presentations.exsd | 133 +
.../schema/projectLinkProviders.exsd | 126 +
.../schema/repositories.exsd | 203 +
.../schema/taskEditorExtensions.exsd | 173 +
.../schema/taskEditorPageContribution.exsd | 107 +
.../schema/taskRepositoryPageContribution.exsd | 119 +
.../ui/wizards/AbstractRepositoryQueryPage2.java | 269 +
.../provisional/tasks/ui/wizards/Messages.java | 41 +
.../tasks/ui/wizards/messages.properties | 7 +
.../internal/tasks/ui/AbstractTaskListFilter.java | 89 +
.../ui/ActivityExternalizationParticipant.java | 114 +
.../internal/tasks/ui/AddExistingTaskJob.java | 127 +
.../internal/tasks/ui/CategorizedPresentation.java | 35 +
.../tasks/ui/ChangeActivityHandleOperation.java | 72 +
.../internal/tasks/ui/ComboSelectionDialog.java | 109 +
.../internal/tasks/ui/DialogErrorReporter.java | 59 +
.../tasks/ui/IDynamicSubMenuContributor.java | 27 +
.../mylyn/internal/tasks/ui/ITaskCommandIds.java | 31 +
.../mylyn/internal/tasks/ui/ITaskHighlighter.java | 23 +
.../tasks/ui/ITaskListNotificationProvider.java | 25 +
.../tasks/ui/ITasksUiPreferenceConstants.java | 86 +
.../tasks/ui/LocalRepositoryConnectorUi.java | 62 +
.../eclipse/mylyn/internal/tasks/ui/Messages.java | 130 +
.../tasks/ui/MoveToCategoryMenuContributor.java | 122 +
.../internal/tasks/ui/OpenRepositoryTaskJob.java | 118 +
.../internal/tasks/ui/PersonContentProposal.java | 82 +
.../tasks/ui/PersonProposalLabelProvider.java | 37 +
.../internal/tasks/ui/PersonProposalProvider.java | 200 +
.../tasks/ui/PlanningPerspectiveFactory.java | 69 +
.../tasks/ui/RefactorRepositoryUrlOperation.java | 157 +
.../internal/tasks/ui/ScheduleDatePicker.java | 187 +
.../tasks/ui/ScheduleTaskMenuContributor.java | 272 +
.../internal/tasks/ui/ScheduledPresentation.java | 35 +
.../internal/tasks/ui/TaskActivityMonitor.java | 145 +
.../mylyn/internal/tasks/ui/TaskArchiveFilter.java | 37 +
.../internal/tasks/ui/TaskCompletionFilter.java | 45 +
.../internal/tasks/ui/TaskEditorBloatMonitor.java | 84 +
.../internal/tasks/ui/TaskHistoryDropDown.java | 209 +
.../internal/tasks/ui/TaskHistoryHandler.java | 93 +
.../mylyn/internal/tasks/ui/TaskHyperlink.java | 60 +
.../mylyn/internal/tasks/ui/TaskJobFactory.java | 183 +
.../internal/tasks/ui/TaskLabelDecorator.java | 95 +
.../internal/tasks/ui/TaskListBackupManager.java | 278 +
.../internal/tasks/ui/TaskListModifyOperation.java | 78 +
.../tasks/ui/TaskListNotificationManager.java | 194 +
.../tasks/ui/TaskListSynchronizationScheduler.java | 93 +
.../internal/tasks/ui/TaskPriorityFilter.java | 53 +
.../tasks/ui/TaskRepositoryAdapterFactory.java | 63 +
.../tasks/ui/TaskRepositoryComparator.java | 34 +
.../tasks/ui/TaskRepositoryLocationUi.java | 159 +
.../internal/tasks/ui/TaskRepositoryUtil.java | 72 +
.../mylyn/internal/tasks/ui/TaskSearchPage.java | 624 +
.../mylyn/internal/tasks/ui/TaskTrimWidget.java | 292 +
.../internal/tasks/ui/TaskWorkingSetFilter.java | 138 +
.../internal/tasks/ui/TasksAdapterFactory.java | 57 +
.../internal/tasks/ui/TasksReminderDialog.java | 265 +
.../mylyn/internal/tasks/ui/TasksUiFactory.java | 40 +
.../mylyn/internal/tasks/ui/TasksUiPlugin.java | 1254 ++
.../ui/actions/AbstractChangeCompletionAction.java | 60 +
.../tasks/ui/actions/AbstractTaskAction.java | 61 +
.../tasks/ui/actions/AbstractTaskEditorAction.java | 56 +
.../ui/actions/AbstractTaskRepositoryAction.java | 84 +
.../tasks/ui/actions/ActivateTaskDialogAction.java | 57 +
.../actions/ActivateTaskHistoryDropDownAction.java | 103 +
.../tasks/ui/actions/AddRepositoryAction.java | 121 +
.../tasks/ui/actions/AutoUpdateQueryAction.java | 70 +
.../tasks/ui/actions/ClearOutgoingAction.java | 96 +
.../internal/tasks/ui/actions/CloneTaskAction.java | 113 +
.../tasks/ui/actions/CollapseAllAction.java | 42 +
.../tasks/ui/actions/CommentActionGroup.java | 61 +
.../tasks/ui/actions/CompareAttachmentsAction.java | 178 +
.../tasks/ui/actions/CopyCommentDetailsAction.java | 47 +
.../tasks/ui/actions/CopyTaskDetailsAction.java | 124 +
.../tasks/ui/actions/DeactivateAllTasksAction.java | 34 +
.../internal/tasks/ui/actions/DeleteAction.java | 204 +
.../tasks/ui/actions/DeleteTaskEditorAction.java | 37 +
.../ui/actions/DeleteTaskRepositoryAction.java | 157 +
.../ui/actions/DisconnectRepositoryAction.java | 73 +
.../ui/actions/EditRepositoryPropertiesAction.java | 61 +
.../internal/tasks/ui/actions/ExpandAllAction.java | 41 +
.../internal/tasks/ui/actions/ExportAction.java | 84 +
.../ui/actions/FilterCompletedTasksAction.java | 50 +
.../internal/tasks/ui/actions/GoIntoAction.java | 55 +
.../internal/tasks/ui/actions/GoUpAction.java | 39 +
.../tasks/ui/actions/GroupSubTasksAction.java | 57 +
.../internal/tasks/ui/actions/ImportAction.java | 138 +
.../tasks/ui/actions/LinkWithEditorAction.java | 37 +
.../mylyn/internal/tasks/ui/actions/Messages.java | 275 +
.../tasks/ui/actions/NewCategoryAction.java | 93 +
.../internal/tasks/ui/actions/NewQueryAction.java | 123 +
.../tasks/ui/actions/NewSubTaskAction.java | 197 +
.../internal/tasks/ui/actions/NewTaskAction.java | 239 +
.../ui/actions/NewTaskFromSelectionAction.java | 147 +
.../tasks/ui/actions/OpenRepositoryTaskAction.java | 119 +
.../internal/tasks/ui/actions/OpenTaskAction.java | 59 +
.../ui/actions/OpenTaskListElementAction.java | 66 +
.../tasks/ui/actions/OpenTaskSearchAction.java | 53 +
.../ui/actions/OpenTasksUiPreferencesAction.java | 40 +
.../tasks/ui/actions/OpenWithBrowserAction.java | 84 +
.../PresentationDropDownSelectionAction.java | 151 +
.../tasks/ui/actions/QueryCloneAction.java | 107 +
.../ui/actions/RefreshRepositoryTasksAction.java | 74 +
.../tasks/ui/actions/RemoveFromCategoryAction.java | 52 +
.../internal/tasks/ui/actions/RenameAction.java | 61 +
.../ui/actions/RepositoryElementActionGroup.java | 373 +
.../tasks/ui/actions/RestoreTaskListAction.java | 76 +
.../tasks/ui/actions/SaveAttachmentsAction.java | 205 +
.../tasks/ui/actions/SearchForRepositoryTask.java | 46 +
.../tasks/ui/actions/ShowInSearchViewAction.java | 68 +
.../tasks/ui/actions/ShowInTaskListAction.java | 46 +
.../ui/actions/ShowTaskRepositoriesViewAction.java | 36 +
.../tasks/ui/actions/ShowTasksUiLegendAction.java | 65 +
.../tasks/ui/actions/SynchronizeAllAction.java | 38 +
.../ui/actions/SynchronizeAutomaticallyAction.java | 38 +
.../tasks/ui/actions/SynchronizeEditorAction.java | 98 +
.../ui/actions/SynchronizeSelectedAction.java | 159 +
.../tasks/ui/actions/TaskActivateAction.java | 74 +
.../tasks/ui/actions/TaskDeactivateAction.java | 42 +
.../tasks/ui/actions/TaskEditorActionGroup.java | 82 +
.../tasks/ui/actions/TaskEditorCopyAction.java | 33 +
.../tasks/ui/actions/TaskEditorScheduleAction.java | 75 +
.../tasks/ui/actions/TaskListSortAction.java | 43 +
.../tasks/ui/actions/TaskListViewActionGroup.java | 96 +
.../tasks/ui/actions/TaskSelectionDialog.java | 741 +
.../ui/actions/TaskSelectionDialogWithRandom.java | 117 +
.../tasks/ui/actions/TaskWorkingSetAction.java | 360 +
.../ui/actions/ToggleAllWorkingSetsAction.java | 56 +
.../ui/actions/ToggleTaskActivationAction.java | 86 +
.../tasks/ui/actions/ToggleWorkingSetAction.java | 88 +
.../internal/tasks/ui/actions/messages.properties | 165 +
.../tasks/ui/commands/AbstractTaskHandler.java | 71 +
.../ui/commands/AbstractTaskListViewHandler.java | 59 +
.../ui/commands/AddTaskRepositoryHandler.java | 53 +
.../tasks/ui/commands/CollapseAllHandler.java | 40 +
.../tasks/ui/commands/GoToUnreadTaskHandler.java | 113 +
.../tasks/ui/commands/MarkTaskHandler.java | 102 +
.../tasks/ui/commands/MaximizePartHandler.java | 52 +
.../mylyn/internal/tasks/ui/commands/Messages.java | 51 +
.../tasks/ui/commands/NewLocalTaskHandler.java | 52 +
.../tasks/ui/commands/NewSubTaskHandler.java | 47 +
.../ui/commands/OpenRepositoryTaskHandler.java | 29 +
.../tasks/ui/commands/OpenSelectedTaskHandler.java | 33 +
.../OpenTaskAttachmentInBrowserHandler.java | 43 +
.../OpenTaskAttachmentInDefaultEditorHandler.java | 78 +
.../OpenTaskListElementPropertiesHandler.java | 33 +
.../OpenTaskRepositoryPropertiesHandler.java | 39 +
.../ui/commands/RemoteTaskSelectionDialog.java | 340 +
.../tasks/ui/commands/SubmitTaskHandler.java | 44 +
.../tasks/ui/commands/TaskListToolTipHandler.java | 42 +
.../ui/commands/TaskRepositoryParameterValues.java | 38 +
.../tasks/ui/commands/ViewSourceHandler.java | 102 +
.../internal/tasks/ui/commands/messages.properties | 15 +
.../ui/dialogs/AbstractWorkingSetDialogCOPY.java | 410 +
.../mylyn/internal/tasks/ui/dialogs/Messages.java | 127 +
.../tasks/ui/dialogs/TaskCompareDialog.java | 312 +
.../tasks/ui/dialogs/TaskListSortDialog.java | 91 +
.../dialogs/TaskRepositoryCredentialsDialog.java | 298 +
.../internal/tasks/ui/dialogs/UiLegendControl.java | 573 +
.../internal/tasks/ui/dialogs/UiLegendDialog.java | 105 +
.../internal/tasks/ui/dialogs/messages.properties | 53 +
.../AbstractHyperlinkTextPresentationManager.java | 172 +
.../tasks/ui/editors/AbstractLocalEditorPart.java | 115 +
.../ui/editors/AbstractReplyToCommentAction.java | 58 +
.../tasks/ui/editors/AttachmentSizeFormatter.java | 101 +
.../ui/editors/AttachmentTableLabelProvider.java | 195 +
.../internal/tasks/ui/editors/AttributePart.java | 258 +
.../tasks/ui/editors/BooleanAttributeEditor.java | 80 +
.../tasks/ui/editors/BrowserPreviewViewer.java | 178 +
.../internal/tasks/ui/editors/CategoryEditor.java | 131 +
.../tasks/ui/editors/CategoryEditorInput.java | 74 +
.../tasks/ui/editors/CommentGroupStrategy.java | 171 +
.../tasks/ui/editors/DateAttributeEditor.java | 164 +
.../tasks/ui/editors/EditorBusyIndicator.java | 137 +
.../internal/tasks/ui/editors/EditorUtil.java | 495 +
.../internal/tasks/ui/editors/FillWidthLayout.java | 244 +
.../internal/tasks/ui/editors/FocusTracker.java | 77 +
...ghlightingHyperlinkTextPresentationManager.java | 30 +
.../internal/tasks/ui/editors/IBusyEditor.java | 27 +
.../LocalTaskEditorContributionDescriptor.java | 42 +
.../tasks/ui/editors/LongTextAttributeEditor.java | 84 +
.../mylyn/internal/tasks/ui/editors/Messages.java | 253 +
.../ui/editors/MultiSelectionAttributeEditor.java | 113 +
.../tasks/ui/editors/PersonAttributeEditor.java | 43 +
.../tasks/ui/editors/PlanningPageFactory.java | 48 +
.../internal/tasks/ui/editors/PlanningPart.java | 576 +
.../tasks/ui/editors/PriorityAttributeEditor.java | 104 +
.../internal/tasks/ui/editors/PriorityEditor.java | 224 +
.../ui/editors/RepositoryCompletionProcessor.java | 326 +
.../editors/RepositoryTextViewerConfiguration.java | 231 +
.../tasks/ui/editors/RichTextAttributeEditor.java | 175 +
.../internal/tasks/ui/editors/RichTextEditor.java | 557 +
.../ui/editors/SingleSelectionAttributeEditor.java | 163 +
.../internal/tasks/ui/editors/SummaryPart.java | 313 +
.../ui/editors/TaskAttachmentDropListener.java | 106 +
.../ui/editors/TaskAttachmentEditorInput.java | 59 +
.../tasks/ui/editors/TaskAttachmentStorage.java | 122 +
.../ui/editors/TaskEditorActionContributor.java | 203 +
.../tasks/ui/editors/TaskEditorActionPart.java | 433 +
.../tasks/ui/editors/TaskEditorAttachmentPart.java | 263 +
.../tasks/ui/editors/TaskEditorAttributePart.java | 291 +
.../tasks/ui/editors/TaskEditorCommentPart.java | 748 +
.../TaskEditorContributionExtensionReader.java | 107 +
.../ui/editors/TaskEditorDescriptionPart.java | 191 +
.../editors/TaskEditorExtensionPartDescriptor.java | 46 +
.../ui/editors/TaskEditorExtensionReader.java | 82 +
.../TaskEditorExtensionSettingsContribution.java | 138 +
.../tasks/ui/editors/TaskEditorExtensions.java | 216 +
.../tasks/ui/editors/TaskEditorInputFactory.java | 60 +
.../tasks/ui/editors/TaskEditorNewCommentPart.java | 35 +
.../tasks/ui/editors/TaskEditorNotesPart.java | 133 +
.../tasks/ui/editors/TaskEditorOutlineNode.java | 186 +
.../tasks/ui/editors/TaskEditorOutlinePage.java | 156 +
.../tasks/ui/editors/TaskEditorPeoplePart.java | 66 +
.../tasks/ui/editors/TaskEditorPlanningPart.java | 69 +
.../tasks/ui/editors/TaskEditorRichTextPart.java | 273 +
.../tasks/ui/editors/TaskEditorSummaryPart.java | 251 +
.../tasks/ui/editors/TaskHyperlinkDetector.java | 68 +
.../TaskHyperlinkTextPresentationManager.java | 52 +
.../tasks/ui/editors/TaskListChangeAdapter.java | 24 +
.../internal/tasks/ui/editors/TaskMigrator.java | 187 +
.../tasks/ui/editors/TaskPlanningEditor.java | 326 +
.../ui/editors/TaskRelationHyperlinkDetector.java | 128 +
.../tasks/ui/editors/TaskUrlHyperlink.java | 32 +
.../tasks/ui/editors/TaskUrlHyperlinkDetector.java | 98 +
.../tasks/ui/editors/TextAttributeEditor.java | 75 +
.../ui/editors/ToolBarButtonContribution.java | 62 +
.../tasks/ui/editors/TraverseOnTabKeyListener.java | 27 +
.../internal/tasks/ui/editors/messages.properties | 135 +
.../mylyn/internal/tasks/ui/messages.properties | 74 +
.../internal/tasks/ui/notifications/Messages.java | 41 +
.../tasks/ui/notifications/TaskAttributeDiff.java | 127 +
.../tasks/ui/notifications/TaskDataDiff.java | 169 +
.../tasks/ui/notifications/TaskDiffUtil.java | 188 +
.../ui/notifications/TaskListNotification.java | 178 +
.../notifications/TaskListNotificationPopup.java | 169 +
.../TaskListNotificationReminder.java | 32 +
.../tasks/ui/notifications/TaskListNotifier.java | 116 +
.../tasks/ui/notifications/messages.properties | 10 +
.../internal/tasks/ui/preferences/Messages.java | 87 +
.../ui/preferences/TasksUiPreferencePage.java | 772 ++
.../tasks/ui/preferences/messages.properties | 30 +
.../internal/tasks/ui/properties/Messages.java | 29 +
.../properties/ProjectPropertiesLinkProvider.java | 92 +
.../ui/properties/ProjectTaskRepositoryPage.java | 183 +
.../tasks/ui/properties/messages.properties | 1 +
.../ui/search/CreateQueryFromSearchAction.java | 91 +
.../mylyn/internal/tasks/ui/search/Messages.java | 71 +
.../tasks/ui/search/OpenSearchResultAction.java | 64 +
.../tasks/ui/search/RepositorySearchResult.java | 97 +
.../ui/search/RepositorySearchResultView.java | 434 +
.../tasks/ui/search/SearchHitCollector.java | 138 +
.../ui/search/SearchResultContentProvider.java | 63 +
.../tasks/ui/search/SearchResultSortAction.java | 38 +
.../tasks/ui/search/SearchResultSorter.java | 50 +
.../ui/search/SearchResultTreeContentProvider.java | 144 +
.../ui/search/SearchResultsLabelProvider.java | 67 +
.../search/SearchScoreComputerAdapterFactory.java | 55 +
.../ui/search/StackTraceDuplicateDetector.java | 111 +
.../internal/tasks/ui/search/messages.properties | 26 +
.../ui/util/AbstractRetrieveTitleFromUrlJob.java | 72 +
.../internal/tasks/ui/util/AttachmentUtil.java | 310 +
.../internal/tasks/ui/util/ClipboardCopier.java | 82 +
.../ui/util/CopyAttachmentToClipboardJob.java | 67 +
.../tasks/ui/util/DownloadAttachmentJob.java | 68 +
.../internal/tasks/ui/util/ImportExportUtil.java | 60 +
.../mylyn/internal/tasks/ui/util/Messages.java | 105 +
.../mylyn/internal/tasks/ui/util/PlatformUtil.java | 147 +
.../tasks/ui/util/SelectionProviderAdapter.java | 60 +
.../internal/tasks/ui/util/SortCriterion.java | 126 +
.../ui/util/TaskAttachmentPropertyTester.java | 45 +
.../internal/tasks/ui/util/TaskComparator.java | 161 +
.../tasks/ui/util/TaskContainerComparator.java | 34 +
.../tasks/ui/util/TaskDataExportOperation.java | 118 +
.../tasks/ui/util/TaskDataSnapshotOperation.java | 34 +
.../tasks/ui/util/TaskDragSourceListener.java | 116 +
.../internal/tasks/ui/util/TaskPropertyTester.java | 73 +
.../ui/util/TaskRepositoryPropertyTester.java | 49 +
.../tasks/ui/util/TasksUiExtensionReader.java | 437 +
.../internal/tasks/ui/util/TasksUiInternal.java | 933 ++
.../mylyn/internal/tasks/ui/util/TasksUiMenus.java | 65 +
.../mylyn/internal/tasks/ui/util/TreeWalker.java | 198 +
.../internal/tasks/ui/util/WebBrowserDialog.java | 65 +
.../internal/tasks/ui/util/messages.properties | 45 +
.../ui/views/AbstractTaskListContentProvider.java | 28 +
.../ui/views/AbstractTaskListPresentation.java | 98 +
.../ui/views/CustomTaskListDecorationDrawer.java | 309 +
.../mylyn/internal/tasks/ui/views/Messages.java | 113 +
.../tasks/ui/views/PriorityDropDownAction.java | 194 +
.../ui/views/TableDecoratingLabelProvider.java | 72 +
.../tasks/ui/views/TaskDetailLabelProvider.java | 61 +
.../internal/tasks/ui/views/TaskInputDialog.java | 290 +
.../internal/tasks/ui/views/TaskKeyComparator.java | 128 +
.../tasks/ui/views/TaskListCellModifier.java | 133 +
.../tasks/ui/views/TaskListContentProvider.java | 207 +
.../tasks/ui/views/TaskListDropAdapter.java | 245 +
.../tasks/ui/views/TaskListFilteredTree.java | 572 +
.../tasks/ui/views/TaskListInterestFilter.java | 190 +
.../tasks/ui/views/TaskListInterestSorter.java | 178 +
.../internal/tasks/ui/views/TaskListSorter.java | 246 +
.../internal/tasks/ui/views/TaskListToolTip.java | 663 +
.../internal/tasks/ui/views/TaskListView.java | 1661 +++
.../tasks/ui/views/TaskRepositoriesSorter.java | 57 +
.../tasks/ui/views/TaskRepositoriesView.java | 313 +
.../ui/views/TaskRepositoryLabelProvider.java | 94 +
.../ui/views/TaskScheduleContentProvider.java | 219 +
.../tasks/ui/views/TaskTableLabelProvider.java | 92 +
.../views/UpdateRepositoryConfigurationAction.java | 94 +
.../tasks/ui/views/WorkweekProgressBar.java | 173 +
.../internal/tasks/ui/views/messages.properties | 51 +
.../tasks/ui/wizards/AttachmentPreviewPage.java | 317 +
.../tasks/ui/wizards/AttachmentSourcePage.java | 644 +
.../tasks/ui/wizards/EditRepositoryWizard.java | 116 +
.../ui/wizards/LocalRepositorySettingsPage.java | 66 +
.../mylyn/internal/tasks/ui/wizards/Messages.java | 271 +
.../ui/wizards/MultiRepositoryAwareWizard.java | 55 +
.../ui/wizards/NewAttachmentWizardDialog.java | 51 +
.../tasks/ui/wizards/NewLocalCategoryWizard.java | 40 +
.../tasks/ui/wizards/NewLocalTaskWizard.java | 71 +
.../internal/tasks/ui/wizards/NewQueryWizard.java | 43 +
.../tasks/ui/wizards/NewRepositoryWizard.java | 119 +
.../internal/tasks/ui/wizards/NewTaskPage.java | 41 +
.../tasks/ui/wizards/NewTaskWizardInternal.java | 40 +
.../internal/tasks/ui/wizards/NewWebTaskPage.java | 48 +
.../ui/wizards/SelectRepositoryConnectorPage.java | 159 +
.../tasks/ui/wizards/SelectRepositoryPage.java | 322 +
.../tasks/ui/wizards/TaskAttachmentWizard.java | 428 +
.../tasks/ui/wizards/TaskDataExportWizard.java | 105 +
.../tasks/ui/wizards/TaskDataExportWizardPage.java | 173 +
.../tasks/ui/wizards/TaskDataImportWizard.java | 224 +
.../tasks/ui/wizards/TaskDataImportWizardPage.java | 248 +
.../internal/tasks/ui/wizards/messages.properties | 141 +
.../internal/tasks/ui/workingsets/Messages.java | 47 +
.../workingsets/TaskWorkingSetAdapterFactory.java | 64 +
.../workingsets/TaskWorkingSetElementAdapter.java | 54 +
.../workingsets/TaskWorkingSetElementFactory.java | 76 +
.../tasks/ui/workingsets/TaskWorkingSetPage.java | 582 +
.../ui/workingsets/TaskWorkingSetUpdater.java | 344 +
.../ui/workingsets/WorkingSetLabelComparator.java | 28 +
.../tasks/ui/workingsets/messages.properties | 10 +
.../tasks/ui/AbstractRepositoryConnectorUi.java | 251 +
.../tasks/ui/AbstractTaskHyperlinkDetector.java | 171 +
.../ui/AbstractTaskRepositoryLinkProvider.java | 74 +
.../mylyn/tasks/ui/IHighlightingHyperlink.java | 24 +
.../eclipse/mylyn/tasks/ui/ITasksUiConstants.java | 57 +
.../eclipse/mylyn/tasks/ui/ITasksUiFactory.java | 52 +
.../org/eclipse/mylyn/tasks/ui/LegendElement.java | 61 +
.../mylyn/tasks/ui/TaskElementLabelProvider.java | 302 +
.../org/eclipse/mylyn/tasks/ui/TaskHyperlink.java | 76 +
.../mylyn/tasks/ui/TaskHyperlinkPresenter.java | 169 +
.../tasks/ui/TaskRepositoryLocationUiFactory.java | 33 +
.../src/org/eclipse/mylyn/tasks/ui/TasksUi.java | 79 +
.../org/eclipse/mylyn/tasks/ui/TasksUiImages.java | 252 +
.../org/eclipse/mylyn/tasks/ui/TasksUiUtil.java | 475 +
.../tasks/ui/editors/AbstractAttributeEditor.java | 231 +
.../tasks/ui/editors/AbstractRenderingEngine.java | 32 +
.../ui/editors/AbstractTaskEditorExtension.java | 64 +
.../tasks/ui/editors/AbstractTaskEditorPage.java | 1586 +++
.../ui/editors/AbstractTaskEditorPageFactory.java | 88 +
.../tasks/ui/editors/AbstractTaskEditorPart.java | 166 +
.../tasks/ui/editors/AttributeEditorFactory.java | 146 +
.../tasks/ui/editors/AttributeEditorToolkit.java | 224 +
.../mylyn/tasks/ui/editors/BrowserFormPage.java | 118 +
.../eclipse/mylyn/tasks/ui/editors/LayoutHint.java | 105 +
.../eclipse/mylyn/tasks/ui/editors/TaskEditor.java | 1175 ++
.../mylyn/tasks/ui/editors/TaskEditorInput.java | 218 +
.../tasks/ui/editors/TaskEditorPartDescriptor.java | 86 +
.../mylyn/tasks/ui/editors/TaskFormPage.java | 43 +
.../ui/wizards/AbstractRepositoryQueryPage.java | 169 +
.../ui/wizards/AbstractRepositorySettingsPage.java | 1686 +++
.../ui/wizards/AbstractTaskRepositoryPage.java | 410 +
.../AbstractTaskRepositoryPageContribution.java | 224 +
.../tasks/ui/wizards/ITaskRepositoryPage.java | 29 +
.../mylyn/tasks/ui/wizards/ITaskSearchPage.java | 28 +
.../tasks/ui/wizards/ITaskSearchPageContainer.java | 26 +
.../mylyn/tasks/ui/wizards/NewTaskWizard.java | 140 +
.../mylyn/tasks/ui/wizards/NewWebTaskWizard.java | 94 +
.../tasks/ui/wizards/RepositoryQueryWizard.java | 92 +
.../mylyn/tasks/ui/wizards/TaskAttachmentPage.java | 360 +
.../ui/wizards/TaskRepositoryWizardDialog.java | 173 +
org.eclipse.mylyn.team-feature/.project | 17 +
.../.refactorings/2008/4/16/refactorings.history | 4 +
.../.refactorings/2008/4/16/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.team-feature/about.html | 27 +
org.eclipse.mylyn.team-feature/build.properties | 6 +
org.eclipse.mylyn.team-feature/epl-v10.html | 328 +
org.eclipse.mylyn.team-feature/feature.properties | 48 +
org.eclipse.mylyn.team-feature/feature.xml | 53 +
org.eclipse.mylyn.team-feature/license.html | 79 +
org.eclipse.mylyn.team.cvs/.classpath | 12 +
org.eclipse.mylyn.team.cvs/.project | 34 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.refactorings/2008/11/45/refactorings.history | 4 +
.../.refactorings/2008/11/45/refactorings.index | 1 +
.../.refactorings/2008/4/16/refactorings.history | 4 +
.../.refactorings/2008/4/16/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF | 24 +
org.eclipse.mylyn.team.cvs/about.html | 27 +
org.eclipse.mylyn.team.cvs/build.properties | 16 +
org.eclipse.mylyn.team.cvs/plugin.properties | 3 +
org.eclipse.mylyn.team.cvs/plugin.xml | 82 +
.../internal/team/ccvs/CommitContextWizard.java | 33 +
.../team/ccvs/CvsActiveChangeSetProvider.java | 33 +
.../team/ccvs/CvsChangeSetAdapterFactory.java | 27 +
.../CvsChangeSetResourceMappingAdapterFactory.java | 39 +
.../team/ccvs/CvsCommitWorkflowProvider.java | 59 +
.../internal/team/ccvs/CvsContextChangeSet.java | 228 +
.../team/ccvs/CvsLinkedTaskInfoAdapterFactory.java | 104 +
.../eclipse/mylyn/internal/team/ccvs/Messages.java | 31 +
.../mylyn/internal/team/ccvs/messages.properties | 1 +
org.eclipse.mylyn.team.tests/.classpath | 12 +
org.eclipse.mylyn.team.tests/.project | 34 +
.../.refactorings/2007/6/23/refactorings.history | 4 +
.../.refactorings/2007/6/23/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.api.tools.prefs | 145 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.team.tests/META-INF/MANIFEST.MF | 31 +
org.eclipse.mylyn.team.tests/about.html | 27 +
org.eclipse.mylyn.team.tests/build.properties | 14 +
.../org/eclipse/mylyn/team/tests/AllTeamTests.java | 33 +
.../mylyn/team/tests/ChangeSetManagerTest.java | 138 +
.../mylyn/team/tests/CommitTemplateTest.java | 82 +
.../team/tests/TeamPropertiesLinkProviderTest.java | 182 +
.../mylyn/team/tests/TestSyncViewRefresh.java | 50 +
org.eclipse.mylyn.team.ui/.classpath | 12 +
org.eclipse.mylyn.team.ui/.cvsignore | 1 +
org.eclipse.mylyn.team.ui/.project | 34 +
.../.refactorings/2006/12/49/refactorings.history | 17 +
.../.refactorings/2006/12/49/refactorings.index | 14 +
.../.refactorings/2007/3/13/refactorings.history | 7 +
.../.refactorings/2007/3/13/refactorings.index | 3 +
.../.refactorings/2007/6/23/refactorings.history | 20 +
.../.refactorings/2007/6/23/refactorings.index | 17 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2008/10/43/refactorings.history | 4 +
.../.refactorings/2008/10/43/refactorings.index | 1 +
.../.refactorings/2008/2/5/refactorings.history | 4 +
.../.refactorings/2008/2/5/refactorings.index | 1 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 3 +
.../.refactorings/2008/5/22/refactorings.history | 3 +
.../.refactorings/2008/5/22/refactorings.index | 4 +
.../.refactorings/2008/6/23/refactorings.history | 3 +
.../.refactorings/2008/6/23/refactorings.index | 2 +
.../.refactorings/2008/6/24/refactorings.history | 4 +
.../.refactorings/2008/6/24/refactorings.index | 1 +
.../.refactorings/2008/8/34/refactorings.history | 4 +
.../.refactorings/2008/8/34/refactorings.index | 1 +
.../.refactorings/2008/9/37/refactorings.history | 4 +
.../.refactorings/2008/9/37/refactorings.index | 1 +
org.eclipse.mylyn.team.ui/.settings/.api_filters | 12 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.team.ui/META-INF/MANIFEST.MF | 34 +
org.eclipse.mylyn.team.ui/about.html | 27 +
org.eclipse.mylyn.team.ui/build.properties | 17 +
.../icons/elcl16/apply-patch.gif | Bin 0 -> 578 bytes
.../icons/elcl16/context-add.gif | Bin 0 -> 331 bytes
.../icons/elcl16/context-commit.gif | Bin 0 -> 545 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
.../icons/elcl16/task-repository.gif | Bin 0 -> 216 bytes
org.eclipse.mylyn.team.ui/plugin.properties | 44 +
org.eclipse.mylyn.team.ui/plugin.xml | 267 +
org.eclipse.mylyn.team.ui/schema/changeSets.exsd | 121 +
.../schema/commitTemplates.exsd | 122 +
.../team/ui/AbstractCommitWorkflowProvider.java | 49 +
.../team/ui/ContextActiveChangeSetManager.java | 333 +
.../mylyn/internal/team/ui/ContextChangeSet.java | 279 +
.../team/ui/ContextChangeSetDecorator.java | 50 +
.../team/ui/FocusedTeamExtensionPointReader.java | 79 +
.../internal/team/ui/FocusedTeamUiPlugin.java | 148 +
.../mylyn/internal/team/ui/LinkedTaskInfo.java | 82 +
.../team/ui/LinkedTaskInfoAdapterFactory.java | 136 +
.../eclipse/mylyn/internal/team/ui/Messages.java | 30 +
.../team/ui/actions/AddToTaskContextAction.java | 122 +
.../internal/team/ui/actions/ApplyPatchAction.java | 75 +
.../team/ui/actions/CommitContextAction.java | 54 +
.../mylyn/internal/team/ui/actions/Messages.java | 41 +
.../ui/actions/OpenCorrespondingTaskAction.java | 341 +
.../actions/TaskResourceMappingActionProvider.java | 38 +
.../internal/team/ui/actions/messages.properties | 13 +
.../mylyn/internal/team/ui/messages.properties | 2 +
.../ui/preferences/FocusedTeamPreferencePage.java | 137 +
.../internal/team/ui/preferences/Messages.java | 31 +
.../team/ui/preferences/messages.properties | 3 +
.../internal/team/ui/properties/Messages.java | 31 +
.../team/ui/properties/ProjectTeamPage.java | 228 +
.../ui/properties/TeamPropertiesLinkProvider.java | 81 +
.../team/ui/properties/messages.properties | 3 +
.../team/ui/templates/CommitTemplateManager.java | 262 +
.../team/ui/templates/CommitTemplateVariables.java | 331 +
.../mylyn/internal/team/ui/templates/Messages.java | 33 +
.../TemplateHandlerContentProposalProvider.java | 130 +
.../internal/team/ui/templates/messages.properties | 3 +
.../team/ui/AbstractActiveChangeSetProvider.java | 56 +
.../team/ui/AbstractCommitTemplateVariable.java | 52 +
.../team/ui/AbstractContextChangeSetManager.java | 87 +
.../mylyn/team/ui/AbstractTaskReference.java | 30 +
.../eclipse/mylyn/team/ui/IContextChangeSet.java | 34 +
org.eclipse.mylyn.tests/.classpath | 16 +
org.eclipse.mylyn.tests/.cvsignore | 3 +
org.eclipse.mylyn.tests/.project | 34 +
.../.refactorings/2006/4/13/refactorings.history | 4 +
.../.refactorings/2006/4/13/refactorings.index | 1 +
.../.refactorings/2006/6/22/refactorings.history | 4 +
.../.refactorings/2006/6/22/refactorings.index | 1 +
.../.refactorings/2007/11/48/refactorings.history | 3 +
.../.refactorings/2007/11/48/refactorings.index | 2 +
.../.refactorings/2007/2/6/refactorings.history | 8 +
.../.refactorings/2007/2/6/refactorings.index | 5 +
.../.refactorings/2007/2/8/refactorings.history | 4 +
.../.refactorings/2007/2/8/refactorings.index | 1 +
.../.refactorings/2007/3/12/refactorings.history | 5 +
.../.refactorings/2007/3/12/refactorings.index | 2 +
.../.refactorings/2007/5/22/refactorings.history | 4 +
.../.refactorings/2007/5/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 5 +
.../.refactorings/2007/6/23/refactorings.index | 2 +
.../.refactorings/2008/10/40/refactorings.history | 3 +
.../.refactorings/2008/10/40/refactorings.index | 3 +
.../.refactorings/2008/4/14/refactorings.history | 3 +
.../.refactorings/2008/4/14/refactorings.index | 2 +
.../.refactorings/2008/4/16/refactorings.history | 3 +
.../.refactorings/2008/4/16/refactorings.index | 2 +
.../.refactorings/2008/5/18/refactorings.history | 3 +
.../.refactorings/2008/5/18/refactorings.index | 2 +
.../.refactorings/2008/5/21/refactorings.history | 4 +
.../.refactorings/2008/5/21/refactorings.index | 1 +
.../.refactorings/2008/5/22/refactorings.history | 4 +
.../.refactorings/2008/5/22/refactorings.index | 1 +
.../.refactorings/2008/6/23/refactorings.history | 4 +
.../.refactorings/2008/6/23/refactorings.index | 1 +
.../.refactorings/2008/9/38/refactorings.history | 3 +
.../.refactorings/2008/9/38/refactorings.index | 2 +
.../.refactorings/2008/9/39/refactorings.history | 4 +
.../.refactorings/2008/9/39/refactorings.index | 1 +
.../.refactorings/2009/4/15/refactorings.history | 3 +
.../.refactorings/2009/4/15/refactorings.index | 3 +
.../.refactorings/2009/6/26/refactorings.history | 4 +
.../.refactorings/2009/6/26/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.api.tools.prefs | 145 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.tests/META-INF/MANIFEST.MF | 33 +
org.eclipse.mylyn.tests/about.html | 27 +
org.eclipse.mylyn.tests/build.properties | 16 +
.../org/eclipse/mylyn/tests/AllConnectorTests.java | 36 +
.../mylyn/tests/AllHeadlessStandaloneTests.java | 68 +
.../eclipse/mylyn/tests/AllNonConnectorTests.java | 51 +
.../eclipse/mylyn/tests/AllPerformanceTests.java | 30 +
.../src/org/eclipse/mylyn/tests/AllTests.java | 29 +
.../tests/integration/AllIntegrationTests.java | 29 +
.../mylyn/tests/integration/ChangeDataDirTest.java | 94 +
.../integration/RepositoryConnectorsTest.java | 50 +
.../org/eclipse/mylyn/tests/misc/AllMiscTests.java | 28 +
.../mylyn/tests/misc/AssertionsEnabledTest.java | 33 +
org.eclipse.mylyn.tests/test.xml | 71 +
org.eclipse.mylyn.trac-feature/.project | 17 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.trac-feature/about.html | 27 +
org.eclipse.mylyn.trac-feature/build.properties | 6 +
org.eclipse.mylyn.trac-feature/epl-v10.html | 328 +
org.eclipse.mylyn.trac-feature/feature.properties | 48 +
org.eclipse.mylyn.trac-feature/feature.xml | 77 +
org.eclipse.mylyn.trac-feature/license.html | 79 +
org.eclipse.mylyn.trac.core/.classpath | 7 +
org.eclipse.mylyn.trac.core/.cvsignore | 1 +
org.eclipse.mylyn.trac.core/.options | 6 +
org.eclipse.mylyn.trac.core/.project | 34 +
.../.refactorings/2006/10/44/refactorings.history | 4 +
.../.refactorings/2006/10/44/refactorings.index | 1 +
.../.refactorings/2006/11/46/refactorings.history | 4 +
.../.refactorings/2006/11/46/refactorings.index | 1 +
.../.refactorings/2006/11/47/refactorings.history | 4 +
.../.refactorings/2006/11/47/refactorings.index | 1 +
.../.refactorings/2006/12/49/refactorings.history | 7 +
.../.refactorings/2006/12/49/refactorings.index | 4 +
.../.refactorings/2006/8/34/refactorings.history | 4 +
.../.refactorings/2006/8/34/refactorings.index | 1 +
.../.refactorings/2006/8/35/refactorings.history | 4 +
.../.refactorings/2006/8/35/refactorings.index | 1 +
.../.refactorings/2007/1/3/refactorings.history | 4 +
.../.refactorings/2007/1/3/refactorings.index | 1 +
.../.refactorings/2007/2/8/refactorings.history | 7 +
.../.refactorings/2007/2/8/refactorings.index | 4 +
.../.refactorings/2007/5/19/refactorings.history | 6 +
.../.refactorings/2007/5/19/refactorings.index | 3 +
.../.refactorings/2007/5/22/refactorings.history | 4 +
.../.refactorings/2007/5/22/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 4 +
.../.refactorings/2007/6/23/refactorings.index | 1 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2007/7/31/refactorings.history | 11 +
.../.refactorings/2007/7/31/refactorings.index | 8 +
.../.refactorings/2008/1/4/refactorings.history | 4 +
.../.refactorings/2008/1/4/refactorings.index | 1 +
.../.refactorings/2008/10/42/refactorings.history | 3 +
.../.refactorings/2008/10/42/refactorings.index | 2 +
.../.refactorings/2008/4/14/refactorings.history | 3 +
.../.refactorings/2008/4/14/refactorings.index | 29 +
.../.refactorings/2008/4/17/refactorings.history | 3 +
.../.refactorings/2008/4/17/refactorings.index | 2 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 20 +
.../.refactorings/2008/6/25/refactorings.history | 3 +
.../.refactorings/2008/6/25/refactorings.index | 8 +
.../.refactorings/2008/6/26/refactorings.history | 4 +
.../.refactorings/2008/6/26/refactorings.index | 1 +
.../.refactorings/2008/6/27/refactorings.history | 4 +
.../.refactorings/2008/6/27/refactorings.index | 1 +
.../.refactorings/2008/7/27/refactorings.history | 3 +
.../.refactorings/2008/7/27/refactorings.index | 4 +
.../.refactorings/2009/6/24/refactorings.history | 4 +
.../.refactorings/2009/6/24/refactorings.index | 1 +
.../.refactorings/2009/6/25/refactorings.history | 4 +
.../.refactorings/2009/6/25/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.trac.core/META-INF/MANIFEST.MF | 20 +
org.eclipse.mylyn.trac.core/about.html | 27 +
org.eclipse.mylyn.trac.core/build.properties | 15 +
org.eclipse.mylyn.trac.core/plugin.properties | 3 +
.../eclipse/mylyn/internal/trac/core/Messages.java | 99 +
.../internal/trac/core/TracAttachmentHandler.java | 119 +
.../mylyn/internal/trac/core/TracAttribute.java | 140 +
.../internal/trac/core/TracAttributeMapper.java | 125 +
.../internal/trac/core/TracClientFactory.java | 66 +
.../internal/trac/core/TracClientManager.java | 168 +
.../mylyn/internal/trac/core/TracCorePlugin.java | 114 +
.../trac/core/TracRepositoryConnector.java | 699 +
.../internal/trac/core/TracTaskDataHandler.java | 663 +
.../mylyn/internal/trac/core/TracTaskMapper.java | 142 +
.../mylyn/internal/trac/core/TracWikiHandler.java | 117 +
.../trac/core/client/AbstractTracClient.java | 235 +
.../trac/core/client/AbstractWikiHandler.java | 38 +
.../internal/trac/core/client/ITracClient.java | 212 +
.../internal/trac/core/client/ITracWikiClient.java | 270 +
.../trac/core/client/InvalidTicketException.java | 30 +
.../trac/core/client/InvalidWikiPageException.java | 38 +
.../mylyn/internal/trac/core/client/Messages.java | 35 +
.../internal/trac/core/client/TracClientData.java | 54 +
.../internal/trac/core/client/TracException.java | 38 +
.../trac/core/client/TracLoginException.java | 30 +
.../core/client/TracNoSuchMethodException.java | 24 +
.../core/client/TracPermissionDeniedException.java | 30 +
.../client/TracProxyAuthenticationException.java | 25 +
.../trac/core/client/TracRemoteException.java | 38 +
.../internal/trac/core/client/TracWebClient.java | 820 ++
.../trac/core/client/TracXmlRpcClient.java | 1149 ++
.../internal/trac/core/client/messages.properties | 5 +
.../mylyn/internal/trac/core/messages.properties | 40 +
.../mylyn/internal/trac/core/model/TracAction.java | 79 +
.../internal/trac/core/model/TracAttachment.java | 80 +
.../internal/trac/core/model/TracComment.java | 89 +
.../internal/trac/core/model/TracComponent.java | 45 +
.../internal/trac/core/model/TracMilestone.java | 58 +
.../internal/trac/core/model/TracPriority.java | 25 +
.../trac/core/model/TracRepositoryAttribute.java | 46 +
.../trac/core/model/TracRepositoryInfo.java | 111 +
.../mylyn/internal/trac/core/model/TracSearch.java | 216 +
.../internal/trac/core/model/TracSearchFilter.java | 108 +
.../internal/trac/core/model/TracSeverity.java | 25 +
.../mylyn/internal/trac/core/model/TracTicket.java | 225 +
.../trac/core/model/TracTicketAttribute.java | 49 +
.../internal/trac/core/model/TracTicketField.java | 155 +
.../trac/core/model/TracTicketResolution.java | 25 +
.../internal/trac/core/model/TracTicketStatus.java | 25 +
.../internal/trac/core/model/TracTicketType.java | 25 +
.../internal/trac/core/model/TracVersion.java | 47 +
.../internal/trac/core/model/TracWikiPage.java | 67 +
.../internal/trac/core/model/TracWikiPageInfo.java | 81 +
.../trac/core/util/HttpMethodInterceptor.java | 25 +
.../mylyn/internal/trac/core/util/Messages.java | 31 +
.../core/util/TracHttpClientTransportFactory.java | 273 +
.../mylyn/internal/trac/core/util/TracUtil.java | 132 +
.../trac/core/util/TracXmlRpcClientRequest.java | 35 +
.../internal/trac/core/util/messages.properties | 1 +
org.eclipse.mylyn.trac.tests/.classpath | 11 +
org.eclipse.mylyn.trac.tests/.cvsignore | 3 +
org.eclipse.mylyn.trac.tests/.project | 34 +
.../.refactorings/2006/10/44/refactorings.history | 4 +
.../.refactorings/2006/10/44/refactorings.index | 1 +
.../.refactorings/2006/6/24/refactorings.history | 4 +
.../.refactorings/2006/6/24/refactorings.index | 1 +
.../.refactorings/2006/6/25/refactorings.history | 9 +
.../.refactorings/2006/6/25/refactorings.index | 6 +
.../.refactorings/2006/7/27/refactorings.history | 4 +
.../.refactorings/2006/7/27/refactorings.index | 1 +
.../.refactorings/2006/7/30/refactorings.history | 8 +
.../.refactorings/2006/7/30/refactorings.index | 5 +
.../.refactorings/2007/12/51/refactorings.history | 4 +
.../.refactorings/2007/12/51/refactorings.index | 1 +
.../.refactorings/2007/2/7/refactorings.history | 4 +
.../.refactorings/2007/2/7/refactorings.index | 1 +
.../.refactorings/2007/2/8/refactorings.history | 5 +
.../.refactorings/2007/2/8/refactorings.index | 2 +
.../.refactorings/2007/3/11/refactorings.history | 4 +
.../.refactorings/2007/3/11/refactorings.index | 1 +
.../.refactorings/2007/5/22/refactorings.history | 4 +
.../.refactorings/2007/5/22/refactorings.index | 1 +
.../.refactorings/2007/6/24/refactorings.history | 4 +
.../.refactorings/2007/6/24/refactorings.index | 1 +
.../.refactorings/2007/7/28/refactorings.history | 4 +
.../.refactorings/2007/7/28/refactorings.index | 1 +
.../.refactorings/2008/10/43/refactorings.history | 4 +
.../.refactorings/2008/10/43/refactorings.index | 1 +
.../.refactorings/2008/12/51/refactorings.history | 3 +
.../.refactorings/2008/12/51/refactorings.index | 3 +
.../.refactorings/2008/4/14/refactorings.history | 4 +
.../.refactorings/2008/4/14/refactorings.index | 1 +
.../.refactorings/2008/6/25/refactorings.history | 3 +
.../.refactorings/2008/6/25/refactorings.index | 22 +
.../.refactorings/2009/7/27/refactorings.history | 3 +
.../.refactorings/2009/7/27/refactorings.index | 6 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF | 28 +
org.eclipse.mylyn.trac.tests/about.html | 27 +
org.eclipse.mylyn.trac.tests/build.properties | 13 +
.../trac/ui/TracHyperlinkUtilStandaloneTest.java | 65 +
.../trac/tests/AllTracHeadlessStandaloneTests.java | 47 +
.../org/eclipse/mylyn/trac/tests/AllTracTests.java | 47 +
.../client/AbstractTracClientRepositoryTest.java | 323 +
.../trac/tests/client/AbstractTracClientTest.java | 126 +
.../trac/tests/client/TracClientFactoryTest.java | 102 +
.../trac/tests/client/TracClientProxyTest.java | 82 +
.../trac/tests/client/TracRepositoryInfoTest.java | 50 +
.../mylyn/trac/tests/client/TracSearchTest.java | 136 +
.../mylyn/trac/tests/client/TracTicketTest.java | 70 +
.../mylyn/trac/tests/client/TracWebClientTest.java | 115 +
.../trac/tests/client/TracXmlRpcClientTest.java | 432 +
.../mylyn/trac/tests/client/TracXmlRpcTest.java | 509 +
.../trac/tests/core/RepositorySearchTest.java | 90 +
.../trac/tests/core/TracAttachmentHandlerTest.java | 165 +
.../trac/tests/core/TracClientManagerTest.java | 83 +
.../tests/core/TracRepositoryConnectorTest.java | 385 +
.../trac/tests/core/TracRepositoryQueryTest.java | 58 +
.../trac/tests/core/TracTaskDataHandlerTest.java | 511 +
.../mylyn/trac/tests/core/TracUtilTest.java | 78 +
.../mylyn/trac/tests/support/TestFixture.java | 94 +
.../mylyn/trac/tests/support/TestProxy.java | 238 +
.../trac/tests/support/TracTestCleanupUtil.java | 62 +
.../trac/tests/support/TracTestConstants.java | 35 +
.../mylyn/trac/tests/support/TracTestUtil.java | 93 +
.../mylyn/trac/tests/support/XmlRpcServer.java | 367 +
.../mylyn/trac/tests/ui/TracHyperlinkUtilTest.java | 273 +
.../tests/ui/TracRepositorySettingsPageTest.java | 105 +
.../mylyn/trac/tests/ui/TracTaskEditorTest.java | 54 +
org.eclipse.mylyn.trac.ui/.classpath | 7 +
org.eclipse.mylyn.trac.ui/.cvsignore | 1 +
org.eclipse.mylyn.trac.ui/.project | 34 +
.../.refactorings/2006/10/39/refactorings.history | 4 +
.../.refactorings/2006/10/39/refactorings.index | 1 +
.../.refactorings/2006/10/41/refactorings.history | 5 +
.../.refactorings/2006/10/41/refactorings.index | 2 +
.../.refactorings/2006/10/42/refactorings.history | 7 +
.../.refactorings/2006/10/42/refactorings.index | 4 +
.../.refactorings/2006/10/43/refactorings.history | 6 +
.../.refactorings/2006/10/43/refactorings.index | 3 +
.../.refactorings/2006/11/45/refactorings.history | 4 +
.../.refactorings/2006/11/45/refactorings.index | 1 +
.../.refactorings/2006/11/46/refactorings.history | 4 +
.../.refactorings/2006/11/46/refactorings.index | 1 +
.../.refactorings/2006/12/50/refactorings.history | 5 +
.../.refactorings/2006/12/50/refactorings.index | 2 +
.../.refactorings/2006/6/25/refactorings.history | 7 +
.../.refactorings/2006/6/25/refactorings.index | 4 +
.../.refactorings/2006/7/27/refactorings.history | 4 +
.../.refactorings/2006/7/27/refactorings.index | 1 +
.../.refactorings/2006/7/28/refactorings.history | 4 +
.../.refactorings/2006/7/28/refactorings.index | 1 +
.../.refactorings/2006/7/30/refactorings.history | 4 +
.../.refactorings/2006/7/30/refactorings.index | 1 +
.../.refactorings/2006/8/34/refactorings.history | 5 +
.../.refactorings/2006/8/34/refactorings.index | 2 +
.../.refactorings/2006/8/35/refactorings.history | 6 +
.../.refactorings/2006/8/35/refactorings.index | 3 +
.../.refactorings/2006/9/36/refactorings.history | 4 +
.../.refactorings/2006/9/36/refactorings.index | 1 +
.../.refactorings/2007/11/46/refactorings.history | 4 +
.../.refactorings/2007/11/46/refactorings.index | 1 +
.../.refactorings/2007/3/10/refactorings.history | 5 +
.../.refactorings/2007/3/10/refactorings.index | 2 +
.../.refactorings/2007/3/11/refactorings.history | 5 +
.../.refactorings/2007/3/11/refactorings.index | 2 +
.../.refactorings/2007/6/25/refactorings.history | 5 +
.../.refactorings/2007/6/25/refactorings.index | 2 +
.../.refactorings/2008/3/13/refactorings.history | 4 +
.../.refactorings/2008/3/13/refactorings.index | 1 +
.../.refactorings/2008/4/17/refactorings.history | 4 +
.../.refactorings/2008/4/17/refactorings.index | 1 +
.../.refactorings/2008/6/24/refactorings.history | 3 +
.../.refactorings/2008/6/24/refactorings.index | 10 +
.../.refactorings/2008/6/26/refactorings.history | 4 +
.../.refactorings/2008/6/26/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF | 23 +
org.eclipse.mylyn.trac.ui/about.html | 27 +
org.eclipse.mylyn.trac.ui/build.properties | 16 +
.../icons/etool16/task-repository.gif | Bin 0 -> 216 bytes
.../icons/eview16/overlay-critical.gif | Bin 0 -> 105 bytes
.../icons/eview16/overlay-enhancement.gif | Bin 0 -> 81 bytes
.../icons/eview16/overlay-trac.gif | Bin 0 -> 275 bytes
.../icons/eview16/trac-icon.gif | Bin 0 -> 176 bytes
org.eclipse.mylyn.trac.ui/plugin.properties | 9 +
org.eclipse.mylyn.trac.ui/plugin.xml | 49 +
.../eclipse/mylyn/internal/trac/ui/Messages.java | 37 +
.../mylyn/internal/trac/ui/TracConnectorUi.java | 133 +
.../internal/trac/ui/TracHyperlinkDetector.java | 39 +
.../mylyn/internal/trac/ui/TracHyperlinkUtil.java | 310 +
.../eclipse/mylyn/internal/trac/ui/TracImages.java | 55 +
.../mylyn/internal/trac/ui/TracSearchHandler.java | 53 +
.../internal/trac/ui/TracTaskListMigrator.java | 71 +
.../mylyn/internal/trac/ui/TracUiPlugin.java | 55 +
.../mylyn/internal/trac/ui/WebHyperlink.java | 57 +
.../mylyn/internal/trac/ui/editor/Messages.java | 32 +
.../trac/ui/editor/TracCcAttributeEditor.java | 90 +
.../internal/trac/ui/editor/TracPeoplePart.java | 109 +
.../trac/ui/editor/TracRenderingEngine.java | 75 +
.../trac/ui/editor/TracTaskEditorPage.java | 82 +
.../trac/ui/editor/TracTaskEditorPageFactory.java | 79 +
.../internal/trac/ui/editor/messages.properties | 4 +
.../mylyn/internal/trac/ui/messages.properties | 6 +
.../mylyn/internal/trac/ui/wizard/Messages.java | 113 +
.../trac/ui/wizard/TracFilterQueryPage.java | 449 +
.../internal/trac/ui/wizard/TracQueryPage.java | 760 +
.../trac/ui/wizard/TracRepositorySettingsPage.java | 272 +
.../internal/trac/ui/wizard/messages.properties | 45 +
org.eclipse.mylyn.web.tasks-feature/.project | 17 +
.../.refactorings/2008/5/19/refactorings.history | 4 +
.../.refactorings/2008/5/19/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.web.tasks-feature/about.html | 27 +
.../build.properties | 6 +
org.eclipse.mylyn.web.tasks-feature/epl-v10.html | 328 +
.../feature.properties | 48 +
org.eclipse.mylyn.web.tasks-feature/feature.xml | 60 +
org.eclipse.mylyn.web.tasks-feature/license.html | 79 +
org.eclipse.mylyn.web.tasks/.classpath | 7 +
org.eclipse.mylyn.web.tasks/.cvsignore | 1 +
org.eclipse.mylyn.web.tasks/.project | 34 +
.../.refactorings/2006/11/45/refactorings.history | 5 +
.../.refactorings/2006/11/45/refactorings.index | 2 +
.../.refactorings/2006/11/46/refactorings.history | 4 +
.../.refactorings/2006/11/46/refactorings.index | 1 +
.../.refactorings/2007/6/23/refactorings.history | 8 +
.../.refactorings/2007/6/23/refactorings.index | 5 +
.../.refactorings/2007/6/24/refactorings.history | 6 +
.../.refactorings/2007/6/24/refactorings.index | 2 +
.../.refactorings/2007/6/25/refactorings.history | 5 +
.../.refactorings/2007/6/25/refactorings.index | 2 +
.../.refactorings/2008/3/13/refactorings.history | 3 +
.../.refactorings/2008/3/13/refactorings.index | 2 +
.../.refactorings/2008/5/21/refactorings.history | 4 +
.../.refactorings/2008/5/21/refactorings.index | 1 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF | 20 +
org.eclipse.mylyn.web.tasks/about.html | 27 +
org.eclipse.mylyn.web.tasks/build.properties | 15 +
.../icons/eview16/folder.gif | Bin 0 -> 216 bytes
.../icons/eview16/icons-task-jira.gif | Bin 0 -> 218 bytes
.../icons/eview16/monitor.gif | Bin 0 -> 362 bytes
.../icons/eview16/task-list.gif | Bin 0 -> 337 bytes
.../icons/obj16/overlay-web.gif | Bin 0 -> 167 bytes
.../icons/obj16/repository-web.gif | Bin 0 -> 587 bytes
org.eclipse.mylyn.web.tasks/plugin.xml | 234 +
.../mylyn/internal/web/tasks/NamedPattern.java | 64 +
.../internal/web/tasks/ParameterEditorDialog.java | 151 +
.../mylyn/internal/web/tasks/ParametersEditor.java | 159 +
.../mylyn/internal/web/tasks/TasksWebPlugin.java | 45 +
.../org/eclipse/mylyn/internal/web/tasks/Util.java | 29 +
.../mylyn/internal/web/tasks/WebConnectorUi.java | 72 +
.../web/tasks/WebContentProposalProvider.java | 158 +
.../mylyn/internal/web/tasks/WebImages.java | 75 +
.../internal/web/tasks/WebQueryWizardPage.java | 520 +
.../internal/web/tasks/WebRepositoryConnector.java | 682 +
.../web/tasks/WebRepositorySettingsPage.java | 387 +
.../web/tasks/WebTaskEditorPageFactory.java | 58 +
.../internal/web/tasks/WebTaskListMigrator.java | 103 +
org.eclipse.mylyn.wikitext-feature/.project | 17 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn.wikitext-feature/about.html | 27 +
.../build.properties | 16 +
org.eclipse.mylyn.wikitext-feature/epl-v10.html | 328 +
.../feature.properties | 58 +
org.eclipse.mylyn.wikitext-feature/feature.xml | 152 +
org.eclipse.mylyn.wikitext-feature/license.html | 79 +
.../.classpath | 7 +
.../.cvsignore | 1 +
.../.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 16 +
...ylyn.wikitext.core.parser.markup.MarkupLanguage | 1 +
.../about.html | 28 +
.../build.properties | 19 +
.../plugin.properties | 15 +
.../plugin.xml | 47 +
.../block/AbstractConfluenceDelimitedBlock.java | 100 +
.../wikitext/confluence/core/block/CodeBlock.java | 78 +
.../wikitext/confluence/core/block/ColorBlock.java | 134 +
.../core/block/ExtendedPreformattedBlock.java | 54 +
.../confluence/core/block/ExtendedQuoteBlock.java | 121 +
.../confluence/core/block/HeadingBlock.java | 81 +
.../wikitext/confluence/core/block/ListBlock.java | 173 +
.../confluence/core/block/ParagraphBlock.java | 96 +
.../confluence/core/block/ParameterizedBlock.java | 60 +
.../wikitext/confluence/core/block/QuoteBlock.java | 79 +
.../wikitext/confluence/core/block/TableBlock.java | 108 +
.../core/block/TableOfContentsBlock.java | 119 +
.../confluence/core/block/TextBoxBlock.java | 129 +
.../phrase/ConfluenceWrappedPhraseModifier.java | 109 +
.../core/phrase/ImagePhraseModifier.java | 94 +
.../core/phrase/SimplePhraseModifier.java | 26 +
.../core/phrase/SimpleWrappedPhraseModifier.java | 111 +
.../core/token/AnchorReplacementToken.java | 52 +
.../core/token/HyperlinkReplacementToken.java | 68 +
.../wikitext/confluence/core/util/Options.java | 64 +
.../ConfluenceReferenceValidationRule.java | 25 +
.../confluence/core/ConfluenceLanguage.java | 147 +
.../.classpath | 7 +
org.eclipse.mylyn.wikitext.confluence.ui/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
.../META-INF/MANIFEST.MF | 12 +
.../about.html | 28 +
.../build.properties | 20 +
.../help/cheatSheet/Confluence.confluence | 39 +
.../plugin.properties | 45 +
.../plugin.xml | 68 +
.../wikitext/confluence/ui/package-info.java | 15 +
org.eclipse.mylyn.wikitext.core/.classpath | 7 +
org.eclipse.mylyn.wikitext.core/.cvsignore | 1 +
org.eclipse.mylyn.wikitext.core/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../.settings/org.eclipse.wst.validation.prefs | 9 +
.../META-INF/MANIFEST.MF | 29 +
org.eclipse.mylyn.wikitext.core/about.html | 52 +
org.eclipse.mylyn.wikitext.core/about.ini | 9 +
.../about_files/LICENSE | 203 +
org.eclipse.mylyn.wikitext.core/about_files/NOTICE | 7 +
org.eclipse.mylyn.wikitext.core/build.properties | 46 +
org.eclipse.mylyn.wikitext.core/icons/ds.xcf | Bin 0 -> 5836 bytes
.../icons/wikitext-32.gif | Bin 0 -> 1547 bytes
org.eclipse.mylyn.wikitext.core/plugin.properties | 15 +
org.eclipse.mylyn.wikitext.core/plugin.xml | 29 +
.../schema/markupLanguage.exsd | 157 +
.../schema/markupValidationRule.exsd | 112 +
org.eclipse.mylyn.wikitext.core/since.xml | 23 +
.../mylyn/internal/wikitext/core/Messages.java | 32 +
.../internal/wikitext/core/WikiTextPlugin.java | 397 +
.../internal/wikitext/core/messages.properties | 19 +
.../parser/builder/DefaultSplittingStrategy.java | 99 +
.../parser/builder/DitaTopicDocumentBuilder.java | 645 +
.../wikitext/core/parser/builder/Messages.java | 32 +
.../core/parser/builder/NoSplittingStrategy.java | 34 +
.../core/parser/builder/SplitOutlineItem.java | 102 +
.../builder/SplittingHtmlDocumentBuilder.java | 410 +
.../builder/SplittingMarkupToEclipseToc.java | 31 +
.../parser/builder/SplittingOutlineParser.java | 60 +
.../core/parser/builder/SplittingStrategy.java | 26 +
.../core/parser/builder/messages.properties | 16 +
.../wikitext/core/util/EclipseServiceLocator.java | 61 +
.../internal/wikitext/core/util/Messages.java | 32 +
.../internal/wikitext/core/util/XML11Char.java | 272 +
.../wikitext/core/util/css/AnySelector.java | 26 +
.../internal/wikitext/core/util/css/Block.java | 44 +
.../wikitext/core/util/css/CompositeSelector.java | 59 +
.../wikitext/core/util/css/CssClassSelector.java | 36 +
.../internal/wikitext/core/util/css/CssParser.java | 257 +
.../internal/wikitext/core/util/css/CssRule.java | 59 +
.../wikitext/core/util/css/DescendantSelector.java | 43 +
.../wikitext/core/util/css/ElementInfo.java | 41 +
.../wikitext/core/util/css/IdSelector.java | 36 +
.../wikitext/core/util/css/NameSelector.java | 34 +
.../internal/wikitext/core/util/css/Selector.java | 22 +
.../wikitext/core/util/css/SparseCharSequence.java | 141 +
.../wikitext/core/util/css/Stylesheet.java | 49 +
.../wikitext/core/util/messages.properties | 13 +
.../core/validation/StandaloneMarkupValidator.java | 217 +
.../wikitext/core/validation/ValidationRules.java | 59 +
.../org/eclipse/mylyn/wikitext/core/WikiText.java | 118 +
.../eclipse/mylyn/wikitext/core/package-info.java | 15 +
.../mylyn/wikitext/core/parser/Attributes.java | 85 +
.../wikitext/core/parser/DocumentBuilder.java | 285 +
.../wikitext/core/parser/HeadingAttributes.java | 37 +
.../mylyn/wikitext/core/parser/IdGenerator.java | 113 +
.../wikitext/core/parser/ImageAttributes.java | 74 +
.../mylyn/wikitext/core/parser/LinkAttributes.java | 69 +
.../mylyn/wikitext/core/parser/ListAttributes.java | 31 +
.../mylyn/wikitext/core/parser/Locator.java | 57 +
.../mylyn/wikitext/core/parser/MarkupParser.java | 127 +
.../wikitext/core/parser/QuoteAttributes.java | 31 +
.../wikitext/core/parser/TableAttributes.java | 103 +
.../wikitext/core/parser/TableCellAttributes.java | 73 +
.../wikitext/core/parser/TableRowAttributes.java | 52 +
.../parser/builder/AbstractXmlDocumentBuilder.java | 126 +
.../parser/builder/DitaBookMapDocumentBuilder.java | 392 +
.../parser/builder/DocBookDocumentBuilder.java | 623 +
.../builder/EventLoggingDocumentBuilder.java | 113 +
.../core/parser/builder/HtmlDocumentBuilder.java | 1214 ++
.../wikitext/core/parser/builder/Messages.java | 32 +
.../builder/MultiplexingDocumentBuilder.java | 159 +
.../core/parser/builder/NoOpDocumentBuilder.java | 121 +
.../core/parser/builder/XslfoDocumentBuilder.java | 1146 ++
.../core/parser/builder/messages.properties | 22 +
.../wikitext/core/parser/builder/package-info.java | 15 +
.../core/parser/markup/AbstractMarkupLanguage.java | 144 +
.../mylyn/wikitext/core/parser/markup/Block.java | 131 +
.../wikitext/core/parser/markup/ContentState.java | 170 +
.../parser/markup/DefaultIdGenerationStrategy.java | 32 +
.../core/parser/markup/IdGenerationStrategy.java | 29 +
.../core/parser/markup/MarkupLanguage.java | 642 +
.../parser/markup/MarkupLanguageConfiguration.java | 203 +
.../core/parser/markup/PatternBasedElement.java | 53 +
.../markup/PatternBasedElementProcessor.java | 147 +
.../wikitext/core/parser/markup/Processor.java | 91 +
.../markup/block/EclipseErrorDetailsBlock.java | 70 +
.../core/parser/markup/block/GlossaryBlock.java | 89 +
.../parser/markup/block/JavaStackTraceBlock.java | 82 +
.../core/parser/markup/block/package-info.java | 15 +
.../wikitext/core/parser/markup/package-info.java | 15 +
.../markup/phrase/HtmlCommentPhraseModifier.java | 39 +
.../markup/phrase/HtmlEndTagPhraseModifier.java | 59 +
.../markup/phrase/HtmlStartTagPhraseModifier.java | 59 +
.../phrase/LimitedHtmlEndTagPhraseModifier.java | 63 +
.../phrase/LimitedHtmlStartTagPhraseModifier.java | 63 +
.../phrase/LiteralPhraseModifierProcessor.java | 61 +
.../core/parser/markup/phrase/package-info.java | 16 +
.../markup/token/AcronymReplacementToken.java | 51 +
.../token/EntityReferenceReplacementToken.java | 27 +
.../token/EntityReplacementTokenProcessor.java | 41 +
.../token/EntityWrappingReplacementToken.java | 76 +
.../token/ImpliedHyperlinkReplacementToken.java | 51 +
.../token/LineBreakReplacementTokenProcessor.java | 31 +
.../token/LiteralReplacementTokenProcessor.java | 36 +
.../PatternEntityReferenceReplacementToken.java | 50 +
.../token/PatternLineBreakReplacementToken.java | 47 +
.../token/PatternLiteralReplacementToken.java | 50 +
.../core/parser/markup/token/package-info.java | 16 +
.../wikitext/core/parser/outline/OutlineItem.java | 422 +
.../core/parser/outline/OutlineParser.java | 268 +
.../wikitext/core/parser/outline/package-info.java | 16 +
.../mylyn/wikitext/core/parser/package-info.java | 19 +
.../wikitext/core/parser/util/MarkupToDocbook.java | 75 +
.../core/parser/util/MarkupToEclipseToc.java | 157 +
.../mylyn/wikitext/core/parser/util/Matcher.java | 26 +
.../wikitext/core/parser/util/MatcherAdaper.java | 39 +
.../wikitext/core/parser/util/package-info.java | 15 +
.../wikitext/core/util/DefaultXmlStreamWriter.java | 446 +
.../core/util/FormattingXMLStreamWriter.java | 290 +
.../core/util/IgnoreDtdEntityResolver.java | 39 +
.../wikitext/core/util/LocationTrackingReader.java | 199 +
.../mylyn/wikitext/core/util/LocatorImpl.java | 68 +
.../eclipse/mylyn/wikitext/core/util/Messages.java | 32 +
.../mylyn/wikitext/core/util/ServiceLocator.java | 181 +
.../mylyn/wikitext/core/util/XmlStreamWriter.java | 89 +
.../wikitext/core/util/anttask/MarkupTask.java | 245 +
.../core/util/anttask/MarkupToDitaTask.java | 348 +
.../core/util/anttask/MarkupToDocbookTask.java | 240 +
.../core/util/anttask/MarkupToEclipseHelpTask.java | 135 +
.../core/util/anttask/MarkupToHtmlTask.java | 509 +
.../core/util/anttask/MarkupToXslfoTask.java | 344 +
.../mylyn/wikitext/core/util/anttask/Messages.java | 32 +
.../wikitext/core/util/anttask/messages.properties | 63 +
.../wikitext/core/util/anttask/package-info.java | 15 +
.../wikitext/core/util/anttask/tasks.properties | 15 +
.../mylyn/wikitext/core/util/messages.properties | 15 +
.../mylyn/wikitext/core/util/package-info.java | 15 +
.../DocumentLocalReferenceValidationRule.java | 145 +
.../wikitext/core/validation/MarkupValidator.java | 66 +
.../mylyn/wikitext/core/validation/Messages.java | 32 +
.../core/validation/ValidationProblem.java | 164 +
.../wikitext/core/validation/ValidationRule.java | 79 +
.../wikitext/core/validation/messages.properties | 12 +
.../wikitext/core/validation/package-info.java | 15 +
org.eclipse.mylyn.wikitext.help.ui/.classpath | 7 +
.../Documentation Builder.launch | 20 +
org.eclipse.mylyn.wikitext.help.ui/.project | 50 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
.../META-INF/MANIFEST.MF | 10 +
org.eclipse.mylyn.wikitext.help.ui/about.html | 28 +
.../build-helper.xml | 105 +
.../build.properties | 24 +
org.eclipse.mylyn.wikitext.help.ui/contextHelp.xml | 25 +
.../customBuildCallbacks.xml | 170 +
.../docs/new/images/wikitext-cheatsheet.png | Bin 0 -> 49103 bytes
.../docs/new/images/wikitext-content-assist.png | Bin 0 -> 22097 bytes
.../docs/new/images/wikitext-editor.png | Bin 0 -> 87182 bytes
.../docs/new/images/wikitext-generate-menu.png | Bin 0 -> 27499 bytes
.../docs/new/images/wikitext-preferences.png | Bin 0 -> 85306 bytes
.../docs/new/new-3.1.html | 68 +
.../docs/new/new-3.1.xml | 87 +
.../docs/new/new.xsl | 88 +
org.eclipse.mylyn.wikitext.help.ui/help/.cvsignore | 4 +
.../help/Mylyn WikiText User Guide.textile | 619 +
org.eclipse.mylyn.wikitext.help.ui/help/book.css | 9 +
.../help/devguide/.cvsignore | 4 +
.../help/devguide/WikiText Developer Guide.textile | 259 +
.../help/devguide/book.css | 9 +
.../help/devguide/images/home.gif | Bin 0 -> 582 bytes
.../help/devguide/images/markup-blocks.png | Bin 0 -> 16438 bytes
.../help/devguide/images/markup-phrases.png | Bin 0 -> 6649 bytes
.../help/devguide/images/markup-plain.png | Bin 0 -> 16087 bytes
.../help/devguide/images/markup-tokens.png | Bin 0 -> 2830 bytes
.../help/devguide/images/next.gif | Bin 0 -> 327 bytes
.../help/devguide/images/prev.gif | Bin 0 -> 327 bytes
.../help/examples/build-wikitext-to-dita.xml | 54 +
.../help/images/editor-assist-proposals.png | Bin 0 -> 7891 bytes
.../editor-assist-selection-proposal-completed.png | Bin 0 -> 2821 bytes
.../images/editor-assist-selection-proposal.png | Bin 0 -> 3942 bytes
.../editor-assist-template-proposal-selection.png | Bin 0 -> 15345 bytes
.../images/editor-assist-template-proposal.png | Bin 0 -> 2346 bytes
.../help/images/editor-cheat-sheet.png | Bin 0 -> 39942 bytes
.../help/images/editor-command-help.png | Bin 0 -> 38701 bytes
.../help/images/editor-folding-menu.png | Bin 0 -> 21284 bytes
.../help/images/editor-folding.png | Bin 0 -> 38323 bytes
.../help/images/editor-outline.png | Bin 0 -> 21998 bytes
.../help/images/editor-overview.png | Bin 0 -> 140563 bytes
.../help/images/editor-preferences-appearance.png | Bin 0 -> 115327 bytes
.../help/images/editor-preferences.png | Bin 0 -> 106089 bytes
.../help/images/editor-quick-outline.png | Bin 0 -> 37851 bytes
.../help/images/editor-spelling.png | Bin 0 -> 11379 bytes
.../help/images/editor-switch-language.png | Bin 0 -> 15970 bytes
.../help/images/editor-tabs.png | Bin 0 -> 6283 bytes
.../help/images/editor-toggle-active-folding.png | Bin 0 -> 8517 bytes
.../help/images/home.gif | Bin 0 -> 582 bytes
.../help/images/next.gif | Bin 0 -> 327 bytes
.../help/images/prev.gif | Bin 0 -> 327 bytes
.../help/images/project-settings.png | Bin 0 -> 76076 bytes
.../repository-settings-task-editor-extension.png | Bin 0 -> 96138 bytes
.../help/images/resource-conversion-menu.png | Bin 0 -> 27499 bytes
.../help/images/task-editor-bugzilla-quote.png | Bin 0 -> 10564 bytes
.../help/images/task-editor-bugzilla-text.png | Bin 0 -> 9083 bytes
.../help/images/task-editor-font-preferences.png | Bin 0 -> 68685 bytes
.../help/styles/main.css | 8 +
.../plugin.properties | 13 +
org.eclipse.mylyn.wikitext.help.ui/plugin.xml | 24 +
org.eclipse.mylyn.wikitext.help.ui/toc-sdk.xml | 14 +
.../.classpath | 7 +
.../.cvsignore | 1 +
org.eclipse.mylyn.wikitext.mediawiki.core/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 16 +
...ylyn.wikitext.core.parser.markup.MarkupLanguage | 1 +
.../about.html | 28 +
.../build.properties | 19 +
.../plugin.properties | 14 +
.../plugin.xml | 48 +
.../core/MediaWikiIdGenerationStrategy.java | 62 +
.../mediawiki/core/block/HeadingBlock.java | 67 +
.../wikitext/mediawiki/core/block/ListBlock.java | 266 +
.../mediawiki/core/block/ParagraphBlock.java | 130 +
.../mediawiki/core/block/PreformattedBlock.java | 56 +
.../wikitext/mediawiki/core/block/TableBlock.java | 271 +
.../core/phrase/EscapePhraseModifier.java | 40 +
.../core/phrase/SimplePhraseModifier.java | 37 +
.../core/phrase/SimpleWrappedPhraseModifier.java | 97 +
.../token/EntityReferenceReplacementToken.java | 55 +
.../token/HyperlinkExternalReplacementToken.java | 52 +
.../token/HyperlinkInternalReplacementToken.java | 69 +
.../core/token/HyperlinkReplacementToken.java | 53 +
.../core/token/ImageReplacementToken.java | 95 +
.../mediawiki/core/token/LineBreakToken.java | 44 +
.../core/token/TemplateReplacementToken.java | 90 +
.../core/validation/CommentValidationRule.java | 49 +
.../MediaWikiReferenceValidationRule.java | 25 +
.../mediawiki/core/validation/Messages.java | 32 +
.../mediawiki/core/validation/messages.properties | 11 +
.../wikitext/mediawiki/core/MediaWikiLanguage.java | 177 +
org.eclipse.mylyn.wikitext.mediawiki.ui/.classpath | 7 +
org.eclipse.mylyn.wikitext.mediawiki.ui/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 339 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
.../META-INF/MANIFEST.MF | 12 +
org.eclipse.mylyn.wikitext.mediawiki.ui/about.html | 28 +
.../build.properties | 21 +
.../help/cheatSheet/MediaWiki.mediawiki | 103 +
.../plugin.properties | 30 +
org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.xml | 51 +
.../wikitext/mediawiki/ui/package-info.java | 15 +
org.eclipse.mylyn.wikitext.tasks.ui/.classpath | 7 +
org.eclipse.mylyn.wikitext.tasks.ui/.cvsignore | 2 +
org.eclipse.mylyn.wikitext.tasks.ui/.project | 34 +
.../.settings/.api_filters | 38 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 44 +
org.eclipse.mylyn.wikitext.tasks.ui/about.html | 28 +
.../build.properties | 20 +
.../icons/elcl16/interest-decrease.gif | Bin 0 -> 194 bytes
.../icons/elcl16/interest-folding.gif | Bin 0 -> 357 bytes
.../icons/elcl16/interest-increase.gif | Bin 0 -> 334 bytes
.../plugin.properties | 40 +
org.eclipse.mylyn.wikitext.tasks.ui/plugin.xml | 208 +
.../tasks/ui/ActiveFoldingEditorTracker.java | 79 +
.../wikitext/tasks/ui/ActiveFoldingListener.java | 145 +
.../tasks/ui/WikiTextContextStructureBridge.java | 292 +
.../wikitext/tasks/ui/WikiTextContextUiBridge.java | 152 +
.../tasks/ui/WikiTextContextUiStartup.java | 25 +
.../wikitext/tasks/ui/WikiTextTasksUiPlugin.java | 117 +
.../tasks/ui/WikiTextUserInteractionMonitor.java | 47 +
.../ToggleActiveFoldingEditorActionDelegate.java | 44 +
.../ConfluenceMarkupTaskEditorExtension.java | 22 +
.../editor/MediaWikiMarkupTaskEditorExtension.java | 22 +
.../ui/editor/TWikiMarkupTaskEditorExtension.java | 21 +
.../editor/TextileMarkupTaskEditorExtension.java | 28 +
.../editor/TracWikiMarkupTaskEditorExtension.java | 126 +
.../ui/preferences/MarkupViewerPreferencePage.java | 227 +
.../wikitext/tasks/ui/preferences/Messages.java | 39 +
.../tasks/ui/preferences/messages.properties | 15 +
.../tasks/ui/util/PlatformUrlHyperlink.java | 35 +
.../internal/wikitext/tasks/ui/util/Util.java | 45 +
.../bugzilla/BugzillaGeneratedCommentBlock.java | 55 +
.../tasks/ui/util/bugzilla/BugzillaQuoteBlock.java | 67 +
.../tasks/ui/editor/MarkupTaskEditorExtension.java | 409 +
.../wikitext/tasks/ui/editor/package-info.java | 20 +
org.eclipse.mylyn.wikitext.tests/.classpath | 11 +
org.eclipse.mylyn.wikitext.tests/.cvsignore | 2 +
org.eclipse.mylyn.wikitext.tests/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 60 +
org.eclipse.mylyn.wikitext.tests/about.html | 28 +
org.eclipse.mylyn.wikitext.tests/build.properties | 16 +
org.eclipse.mylyn.wikitext.tests/plugin.properties | 14 +
.../builder/DitaTopicDocumentBuilderTest.java | 62 +
.../wikitext/core/util/css/CssParserTest.java | 227 +
.../wikitext/core/util/css/CssParserTest_0.css | 138 +
.../core/util/css/SparseCharSequenceTest.java | 91 +
.../validation/StandaloneMarkupValidatorTest.java | 82 +
.../core/validation/TestMarkupValidationRule.java | 48 +
.../wikitext/core/validation/test-plugin.xml | 23 +
.../core/MediaWikiIdGenerationStrategyTest.java | 36 +
.../core/validation/CommentValidationRuleTest.java | 56 +
.../wikitext/textile/core/TextileTest.java | 185 +
.../core/validation/BlockWhitespaceRuleTest.java | 88 +
.../TextileReferenceValidationRuleTest.java | 71 +
.../ListWhitespaceValidationRuleTest.java | 89 +
.../wikitext/twiki/tests/TWikiLanguageTest.java | 249 +
.../ui/editor/syntax/AbstractDocumentTest.java | 48 +
.../editor/syntax/DialectDocumentProviderTest.java | 58 +
.../editor/syntax/FastMarkupPartitionerTest.java | 162 +
.../ui/editor/syntax/resources/large.textile | 2167 +++
.../ui/util/OutlineItemAdapterFactoryTest.java | 34 +
.../ui/util/OutlineItemWorkbenchAdapterTest.java | 64 +
.../wikitext/ui/viewer/CssStyleManagerTest.java | 110 +
.../ui/viewer/HtmlTextPresentationParserTest.java | 149 +
.../confluence/core/ConfluenceLanguageTest.java | 612 +
.../mylyn/wikitext/confluence/core/Main.java | 41 +
.../core/parser/HtmlDocumentBuilderTest.java | 68 +
.../parser/builder/DocBookDocumentBuilderTest.java | 179 +
.../parser/builder/HtmlDocumentBuilderTest.java | 364 +
.../parser/builder/RecordingDocumentBuilder.java | 188 +
.../core/parser/builder/resources/test.css | 3 +
.../token/EntityWrappingReplacementTokenTest.java | 42 +
.../ImpliedHyperlinkReplacementTokenTest.java | 105 +
.../core/parser/outline/OutlineItemTest.java | 55 +
.../core/parser/outline/OutlineParserTest.java | 103 +
.../core/parser/util/TextileToDocbookTest.java | 135 +
.../core/parser/util/TextileToEclipseTocTest.java | 40 +
.../core/util/LocationTrackingReaderTest.java | 95 +
.../wikitext/core/util/ServiceLocatorTest.java | 60 +
.../core/util/anttask/AbstractTestAntTask.java | 92 +
.../core/util/anttask/MarkupToDitaTaskTest.java | 301 +
.../core/util/anttask/MarkupToDocbookTaskTest.java | 112 +
.../util/anttask/MarkupToEclipseHelpTaskTest.java | 124 +
.../core/util/anttask/MarkupToHtmlTaskTest.java | 136 +
.../core/util/anttask/MarkupToXslfoTaskTest.java | 72 +
.../mediawiki/core/MediaWikiLanguageTest.java | 526 +
.../wikitext/tests/AbstractTestApplication.java | 230 +
.../wikitext/tests/AbstractTestInWorkspace.java | 102 +
.../eclipse/mylyn/wikitext/tests/ClassFilter.java | 30 +
.../mylyn/wikitext/tests/ClassTraversal.java | 137 +
.../mylyn/wikitext/tests/DiscoveryTestSuite.java | 71 +
.../wikitext/tests/EclipseRuntimeRequired.java | 28 +
.../eclipse/mylyn/wikitext/tests/HeadRequired.java | 28 +
.../wikitext/tests/HeadlessStandaloneTests.java | 51 +
.../mylyn/wikitext/tests/HeadlessTests.java | 55 +
.../eclipse/mylyn/wikitext/tests/NoDiscovery.java | 28 +
.../org/eclipse/mylyn/wikitext/tests/UITests.java | 43 +
.../textile/core/BugzillaTextileLanguageTest.java | 154 +
.../eclipse/mylyn/wikitext/textile/core/Main.java | 41 +
.../textile/core/TextileLanguageTasksTest.java | 74 +
.../wikitext/textile/core/TextileLanguageTest.java | 1176 ++
.../core/resources/subversive-bug-report.txt | 57 +
.../eclipse/mylyn/wikitext/tracwiki/core/Main.java | 41 +
.../tracwiki/core/TracWikiLanguageTest.java | 556 +
.../core/WikiWordReplacementTokenTest.java | 99 +
.../eclipse/mylyn/wikitext/ui/FileTypesTest.java | 134 +
.../ui/annotation/AnchorHrefAnnotationTest.java | 31 +
.../ui/annotation/AnchorNameAnnotationTest.java | 30 +
.../ui/annotation/ClassAnnotationTest.java | 30 +
.../wikitext/ui/annotation/IdAnnotationTest.java | 30 +
.../ui/annotation/TitleAnnotationTest.java | 31 +
.../styles/junit-noframes.xsl | 154 +
org.eclipse.mylyn.wikitext.tests/test.xml | 76 +
org.eclipse.mylyn.wikitext.textile.core/.classpath | 7 +
org.eclipse.mylyn.wikitext.textile.core/.cvsignore | 2 +
org.eclipse.mylyn.wikitext.textile.core/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 16 +
...ylyn.wikitext.core.parser.markup.MarkupLanguage | 1 +
org.eclipse.mylyn.wikitext.textile.core/about.html | 28 +
.../build.properties | 19 +
.../plugin.properties | 15 +
org.eclipse.mylyn.wikitext.textile.core/plugin.xml | 47 +
.../internal/wikitext/textile/core/Textile.java | 136 +
.../wikitext/textile/core/TextileContentState.java | 85 +
.../wikitext/textile/core/block/CodeBlock.java | 91 +
.../wikitext/textile/core/block/FootnoteBlock.java | 98 +
.../wikitext/textile/core/block/HeadingBlock.java | 89 +
.../wikitext/textile/core/block/ListBlock.java | 171 +
.../textile/core/block/ParagraphBlock.java | 121 +
.../textile/core/block/PreformattedBlock.java | 89 +
.../wikitext/textile/core/block/QuoteBlock.java | 119 +
.../wikitext/textile/core/block/TableBlock.java | 153 +
.../textile/core/block/TableOfContentsBlock.java | 124 +
.../textile/core/block/TextileGlossaryBlock.java | 61 +
.../core/phrase/EscapeTextilePhraseModifier.java | 44 +
.../core/phrase/ImageTextilePhraseModifier.java | 86 +
.../core/phrase/SimpleTextilePhraseModifier.java | 150 +
.../token/FootnoteReferenceReplacementToken.java | 67 +
.../core/token/HyperlinkReplacementToken.java | 59 +
.../core/validation/BlockWhitespaceRule.java | 60 +
.../wikitext/textile/core/validation/Messages.java | 32 +
.../validation/TextileReferenceValidationRule.java | 25 +
.../textile/core/validation/messages.properties | 11 +
.../wikitext/textile/core/TextileLanguage.java | 224 +
org.eclipse.mylyn.wikitext.textile.ui/.classpath | 7 +
org.eclipse.mylyn.wikitext.textile.ui/.cvsignore | 1 +
org.eclipse.mylyn.wikitext.textile.ui/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
.../META-INF/MANIFEST.MF | 12 +
org.eclipse.mylyn.wikitext.textile.ui/about.html | 28 +
.../build.properties | 20 +
.../help/cheatSheet/Textile.textile | 119 +
.../plugin.properties | 49 +
org.eclipse.mylyn.wikitext.textile.ui/plugin.xml | 74 +
.../internal/wikitext/textile/ui/package-info.java | 15 +
.../.classpath | 7 +
.../.cvsignore | 1 +
org.eclipse.mylyn.wikitext.tracwiki.core/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 15 +
...ylyn.wikitext.core.parser.markup.MarkupLanguage | 1 +
.../about.html | 28 +
.../build.properties | 19 +
.../plugin.properties | 15 +
.../plugin.xml | 48 +
.../wikitext/tracwiki/core/block/HeadingBlock.java | 71 +
.../wikitext/tracwiki/core/block/ListBlock.java | 180 +
.../tracwiki/core/block/ParagraphBlock.java | 76 +
.../tracwiki/core/block/PreformattedBlock.java | 74 +
.../wikitext/tracwiki/core/block/QuoteBlock.java | 122 +
.../wikitext/tracwiki/core/block/TableBlock.java | 104 +
.../core/phrase/DeletedPhraseModifier.java | 26 +
.../tracwiki/core/phrase/EscapePhraseModifier.java | 62 +
.../core/phrase/MonospacePhraseModifier.java | 50 +
.../tracwiki/core/phrase/SimplePhraseModifier.java | 37 +
.../core/phrase/SimpleWrappedPhraseModifier.java | 98 +
.../tracwiki/core/token/BangEscapeToken.java | 41 +
.../core/token/ChangesetLinkReplacementToken.java | 61 +
.../core/token/HyperlinkReplacementToken.java | 60 +
.../tracwiki/core/token/LineBreakToken.java | 44 +
.../core/token/MilestoneLinkReplacementToken.java | 50 +
.../core/token/ReportLinkReplacementToken.java | 53 +
.../core/token/RevisionLogReplacementToken.java | 64 +
.../core/token/SourceLinkReplacementToken.java | 52 +
.../TicketAttachmentLinkReplacementToken.java | 51 +
.../core/token/TicketLinkReplacementToken.java | 50 +
.../core/token/WikiWordReplacementToken.java | 68 +
.../TracWikiReferenceValidationRule.java | 25 +
.../wikitext/tracwiki/core/TracWikiLanguage.java | 303 +
org.eclipse.mylyn.wikitext.tracwiki.ui/.classpath | 7 +
org.eclipse.mylyn.wikitext.tracwiki.ui/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 12 +
org.eclipse.mylyn.wikitext.tracwiki.ui/about.html | 28 +
.../build.properties | 19 +
.../plugin.properties | 37 +
org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.xml | 54 +
org.eclipse.mylyn.wikitext.twiki.core/.classpath | 15 +
org.eclipse.mylyn.wikitext.twiki.core/.cvsignore | 2 +
org.eclipse.mylyn.wikitext.twiki.core/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 15 +
...ylyn.wikitext.core.parser.markup.MarkupLanguage | 1 +
org.eclipse.mylyn.wikitext.twiki.core/about.html | 28 +
.../build.properties | 19 +
.../plugin.properties | 13 +
org.eclipse.mylyn.wikitext.twiki.core/plugin.xml | 51 +
.../twiki/core/block/DefinitionListBlock.java | 82 +
.../wikitext/twiki/core/block/HeadingBlock.java | 66 +
.../twiki/core/block/HorizontalRuleBlock.java | 47 +
.../wikitext/twiki/core/block/ListBlock.java | 203 +
.../wikitext/twiki/core/block/LiteralBlock.java | 77 +
.../wikitext/twiki/core/block/ParagraphBlock.java | 75 +
.../twiki/core/block/TableOfContentsBlock.java | 81 +
.../wikitext/twiki/core/block/VerbatimBlock.java | 74 +
.../core/phrase/AutoLinkSwitchPhraseModifier.java | 42 +
.../twiki/core/phrase/SimplePhraseModifier.java | 38 +
.../core/phrase/SimpleWrappedPhraseModifier.java | 97 +
.../twiki/core/token/IconReplacementToken.java | 52 +
.../token/ImpliedEmailLinkReplacementToken.java | 43 +
.../twiki/core/token/LinkReplacementToken.java | 103 +
.../twiki/core/token/WikiWordReplacementToken.java | 66 +
.../validation/ListWhitespaceValidationRule.java | 66 +
.../wikitext/twiki/core/validation/Messages.java | 32 +
.../validation/TWikiReferenceValidationRule.java | 25 +
.../twiki/core/validation/messages.properties | 12 +
.../mylyn/wikitext/twiki/core/TWikiLanguage.java | 223 +
org.eclipse.mylyn.wikitext.twiki.ui/.classpath | 15 +
org.eclipse.mylyn.wikitext.twiki.ui/.cvsignore | 1 +
org.eclipse.mylyn.wikitext.twiki.ui/.project | 34 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 18 +
.../META-INF/MANIFEST.MF | 12 +
org.eclipse.mylyn.wikitext.twiki.ui/about.html | 27 +
.../build.properties | 19 +
.../plugin.properties | 33 +
org.eclipse.mylyn.wikitext.twiki.ui/plugin.xml | 48 +
.../internal/wikitext/twiki/ui/package-info.java | 15 +
org.eclipse.mylyn.wikitext.ui/.classpath | 7 +
org.eclipse.mylyn.wikitext.ui/.cvsignore | 2 +
org.eclipse.mylyn.wikitext.ui/.project | 34 +
.../.settings/.api_filters | 48 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 64 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
.../.settings/org.eclipse.pde.prefs | 24 +
org.eclipse.mylyn.wikitext.ui/META-INF/MANIFEST.MF | 45 +
org.eclipse.mylyn.wikitext.ui/about.html | 28 +
org.eclipse.mylyn.wikitext.ui/build.properties | 41 +
.../icons/editor-icon.gif | Bin 0 -> 363 bytes
org.eclipse.mylyn.wikitext.ui/icons/help.gif | Bin 0 -> 618 bytes
org.eclipse.mylyn.wikitext.ui/plugin.properties | 43 +
org.eclipse.mylyn.wikitext.ui/plugin.xml | 274 +
.../schema/cheatSheet.exsd | 138 +
.../schema/contentAssist.exsd | 166 +
.../mylyn/internal/wikitext/ui/Messages.java | 49 +
.../mylyn/internal/wikitext/ui/WikiTextNature.java | 135 +
.../internal/wikitext/ui/WikiTextUiPlugin.java | 320 +
.../wikitext/ui/editor/FoldingStructure.java | 245 +
.../ui/editor/HeadingProjectionAnnotation.java | 30 +
.../wikitext/ui/editor/IFoldingStructure.java | 78 +
.../internal/wikitext/ui/editor/MarkupEditor.java | 1211 ++
.../editor/MarkupEditorActionBarContributor.java | 22 +
.../wikitext/ui/editor/MarkupEditorOutline.java | 267 +
.../wikitext/ui/editor/MarkupProjectionViewer.java | 69 +
.../internal/wikitext/ui/editor/Messages.java | 52 +
.../actions/CollapseAllFoldingRulerAction.java | 35 +
.../ui/editor/actions/ContextHelpAction.java | 52 +
.../actions/ExpandAllFoldingRulerAction.java | 35 +
.../wikitext/ui/editor/actions/Messages.java | 44 +
.../ui/editor/actions/SetMarkupLanguageAction.java | 46 +
.../editor/actions/ToggleFoldingRulerAction.java | 63 +
.../wikitext/ui/editor/actions/messages.properties | 17 +
.../editor/assist/AnchorCompletionProcessor.java | 220 +
.../assist/MarkupTemplateCompletionProcessor.java | 181 +
.../wikitext/ui/editor/assist/Messages.java | 31 +
.../assist/MultiplexingContentAssistProcessor.java | 126 +
.../wikitext/ui/editor/assist/Templates.java | 78 +
.../wikitext/ui/editor/assist/messages.properties | 11 +
.../wikitext/ui/editor/commands/Messages.java | 33 +
.../ui/editor/commands/ShowCheatSheetCommand.java | 110 +
.../editor/commands/ShowQuickOutlineCommand.java | 48 +
.../ui/editor/commands/messages.properties | 12 +
.../ui/editor/dnd/DndConfigurationStrategy.java | 62 +
.../internal/wikitext/ui/editor/dnd/Messages.java | 37 +
.../ui/editor/dnd/OutlineDragSourceListener.java | 45 +
.../ui/editor/dnd/OutlineDropTargetListener.java | 184 +
.../wikitext/ui/editor/dnd/messages.properties | 14 +
.../wikitext/ui/editor/help/CheatSheetContent.java | 43 +
.../wikitext/ui/editor/help/HelpContent.java | 170 +
.../internal/wikitext/ui/editor/help/Messages.java | 35 +
.../wikitext/ui/editor/help/messages.properties | 13 +
.../wikitext/ui/editor/messages.properties | 24 +
.../editor/operations/AbstractDocumentCommand.java | 71 +
.../ui/editor/operations/CommandManager.java | 30 +
.../ui/editor/operations/InsertLocation.java | 21 +
.../wikitext/ui/editor/operations/Messages.java | 31 +
.../ui/editor/operations/MoveSectionsCommand.java | 178 +
.../ui/editor/operations/messages.properties | 11 +
.../wikitext/ui/editor/outline/Messages.java | 31 +
.../ui/editor/outline/QuickOutlinePopupDialog.java | 245 +
.../wikitext/ui/editor/outline/messages.properties | 12 +
.../ui/editor/preferences/CssStyleFieldEditor.java | 98 +
.../editor/preferences/EditorPreferencePage.java | 138 +
.../wikitext/ui/editor/preferences/Messages.java | 43 +
.../editor/preferences/PreferenceInitializer.java | 31 +
.../ui/editor/preferences/Preferences.java | 319 +
.../ui/editor/preferences/messages.properties | 17 +
.../ui/editor/reconciler/MarkupMonoReconciler.java | 35 +
.../MarkupValidationReconcilingStrategy.java | 110 +
.../reconciler/MultiReconcilingStrategy.java | 84 +
.../internal/wikitext/ui/editor/syntax/Block.java | 124 +
.../ui/editor/syntax/FastMarkupPartitioner.java | 548 +
.../ui/editor/syntax/MarkupDamagerRepairer.java | 35 +
.../ui/editor/syntax/MarkupDocumentProvider.java | 138 +
.../ui/editor/syntax/MarkupTokenScanner.java | 436 +
.../wikitext/ui/editor/syntax/Messages.java | 41 +
.../wikitext/ui/editor/syntax/Segment.java | 126 +
.../wikitext/ui/editor/syntax/Segments.java | 62 +
.../internal/wikitext/ui/editor/syntax/Span.java | 43 +
.../wikitext/ui/editor/syntax/messages.properties | 16 +
.../validation/AnnotationMarkupValidator.java | 99 +
.../editor/validation/DocumentRegionValidator.java | 159 +
.../wikitext/ui/editor/validation/Messages.java | 39 +
.../validation/ResourceMarkerMarkupValidator.java | 148 +
.../validation/ValidationProblemAnnotation.java | 47 +
.../ui/editor/validation/messages.properties | 15 +
.../mylyn/internal/wikitext/ui/messages.properties | 20 +
.../internal/wikitext/ui/properties/Messages.java | 45 +
.../ui/properties/ProjectPropertyPage.java | 138 +
.../wikitext/ui/properties/messages.properties | 18 +
.../wikitext/ui/util/FilePropertyTester.java | 60 +
.../ui/util/HyperlinkDetectorDelegate.java | 96 +
.../internal/wikitext/ui/util/ImageCache.java | 120 +
.../wikitext/ui/util/InformationPresenterUtil.java | 197 +
.../wikitext/ui/util/NlsResourceBundle.java | 61 +
.../ui/util/OutlineItemAdapterFactory.java | 39 +
.../ui/util/OutlineItemWorkbenchAdapter.java | 71 +
.../wikitext/ui/util/PreferenceStoreFacade.java | 203 +
.../wikitext/ui/util/WikiTextUiResources.java | 59 +
.../wikitext/ui/util/css/editor/Colors.java | 58 +
.../ui/util/css/editor/CommentDamagerRepairer.java | 101 +
.../wikitext/ui/util/css/editor/CommentRule.java | 93 +
.../ui/util/css/editor/CssBlockScanner.java | 35 +
.../ui/util/css/editor/CssConfiguration.java | 76 +
.../ui/util/css/editor/CssPartitionScanner.java | 36 +
.../ui/util/css/editor/CssPartitioner.java | 27 +
.../wikitext/ui/util/css/editor/CssScanner.java | 33 +
.../ui/util/css/editor/CssWhitespaceDetector.java | 24 +
.../ui/util/css/editor/PropertyNameRule.java | 97 +
.../ui/util/css/editor/PropertyValueRule.java | 97 +
.../wikitext/ui/util/css/editor/SelectorRule.java | 96 +
.../wikitext/ui/util/css/editor/package-info.java | 32 +
.../wikitext/ui/util/resources/missing-image.png | Bin 0 -> 450 bytes
.../internal/wikitext/ui/validation/Messages.java | 29 +
.../ui/validation/ValidationProjectBuilder.java | 270 +
.../wikitext/ui/validation/messages.properties | 12 +
.../ui/viewer/AnnotationHyperlinkDetector.java | 181 +
.../wikitext/ui/viewer/CssStyleManager.java | 660 +
.../internal/wikitext/ui/viewer/FontState.java | 206 +
.../ui/viewer/HtmlTextPresentationParser.java | 1105 ++
.../internal/wikitext/ui/viewer/ImageManager.java | 520 +
.../internal/wikitext/ui/viewer/Messages.java | 37 +
.../internal/wikitext/ui/viewer/TextHover.java | 157 +
.../mylyn/internal/wikitext/ui/viewer/Util.java | 46 +
.../ui/viewer/annotation/BulletAnnotation.java | 30 +
.../viewer/annotation/BulletDrawingStrategy.java | 93 +
.../annotation/HorizontalRuleAnnotation.java | 32 +
.../annotation/HorizontalRuleDrawingStrategy.java | 71 +
.../ui/viewer/annotation/ImageAnnotation.java | 67 +
.../ui/viewer/annotation/ImageDrawingStrategy.java | 81 +
.../mylyn/internal/wikitext/ui/viewer/default.css | 127 +
.../wikitext/ui/viewer/messages.properties | 14 +
.../ui/annotation/AnchorHrefAnnotation.java | 33 +
.../ui/annotation/AnchorNameAnnotation.java | 33 +
.../wikitext/ui/annotation/ClassAnnotation.java | 32 +
.../mylyn/wikitext/ui/annotation/IdAnnotation.java | 32 +
.../wikitext/ui/annotation/TitleAnnotation.java | 45 +
.../ui/commands/AbstractMarkupResourceHandler.java | 142 +
.../ui/commands/ConvertMarkupToDocbook.java | 104 +
.../ui/commands/ConvertMarkupToEclipseHelp.java | 119 +
.../wikitext/ui/commands/ConvertMarkupToHtml.java | 116 +
.../mylyn/wikitext/ui/commands/Messages.java | 63 +
.../mylyn/wikitext/ui/commands/messages.properties | 27 +
.../wikitext/ui/editor/MarkupSourceViewer.java | 101 +
.../ui/editor/MarkupSourceViewerConfiguration.java | 407 +
.../wikitext/ui/editor/ShowInTargetBridge.java | 55 +
.../AbstractTextSourceViewerConfiguration.java | 140 +
.../DefaultHyperlinkDetectorDescriptorFilter.java | 39 +
.../wikitext/ui/viewer/HtmlTextPresenter.java | 74 +
.../mylyn/wikitext/ui/viewer/HtmlViewer.java | 286 +
.../ui/viewer/HtmlViewerConfiguration.java | 237 +
.../wikitext/ui/viewer/MarkupTextPresenter.java | 60 +
.../mylyn/wikitext/ui/viewer/MarkupViewer.java | 102 +
.../ui/viewer/MarkupViewerConfiguration.java | 31 +
.../eclipse/mylyn/wikitext/ui/viewer/Messages.java | 31 +
.../mylyn/wikitext/ui/viewer/messages.properties | 11 +
org.eclipse.mylyn/.classpath | 10 +
org.eclipse.mylyn/.cvsignore | 1 +
org.eclipse.mylyn/.project | 34 +
.../.refactorings/2006/10/44/refactorings.history | 4 +
.../.refactorings/2006/10/44/refactorings.index | 1 +
.../.refactorings/2006/11/44/refactorings.history | 5 +
.../.refactorings/2006/11/44/refactorings.index | 2 +
.../.refactorings/2006/12/49/refactorings.history | 4 +
.../.refactorings/2006/12/49/refactorings.index | 1 +
.../.refactorings/2006/3/10/refactorings.history | 4 +
.../.refactorings/2006/3/10/refactorings.index | 1 +
.../.refactorings/2006/3/12/refactorings.history | 4 +
.../.refactorings/2006/3/12/refactorings.index | 1 +
.../.refactorings/2006/5/19/refactorings.history | 5 +
.../.refactorings/2006/5/19/refactorings.index | 2 +
.../.refactorings/2006/5/22/refactorings.history | 5 +
.../.refactorings/2006/5/22/refactorings.index | 2 +
.../.refactorings/2006/7/31/refactorings.history | 4 +
.../.refactorings/2006/7/31/refactorings.index | 1 +
.../.refactorings/2006/9/37/refactorings.history | 7 +
.../.refactorings/2006/9/37/refactorings.index | 4 +
.../.refactorings/2007/12/51/refactorings.history | 3 +
.../.refactorings/2007/12/51/refactorings.index | 2 +
.../.refactorings/2007/2/6/refactorings.history | 13 +
.../.refactorings/2007/2/6/refactorings.index | 10 +
.../.refactorings/2007/2/8/refactorings.history | 4 +
.../.refactorings/2007/2/8/refactorings.index | 1 +
.../.refactorings/2007/4/14/refactorings.history | 5 +
.../.refactorings/2007/4/14/refactorings.index | 2 +
.../.refactorings/2007/5/22/refactorings.history | 43 +
.../.refactorings/2007/5/22/refactorings.index | 40 +
.../.refactorings/2007/6/23/refactorings.history | 9 +
.../.refactorings/2007/6/23/refactorings.index | 6 +
.../.refactorings/2007/6/24/refactorings.history | 7 +
.../.refactorings/2007/6/24/refactorings.index | 3 +
.../.refactorings/2007/6/26/refactorings.history | 6 +
.../.refactorings/2007/6/26/refactorings.index | 3 +
.../.refactorings/2008/10/40/refactorings.history | 4 +
.../.refactorings/2008/10/40/refactorings.index | 1 +
.../.refactorings/2008/12/50/refactorings.history | 4 +
.../.refactorings/2008/12/50/refactorings.index | 1 +
.../.settings/org.eclipse.core.resources.prefs | 5 +
.../.settings/org.eclipse.jdt.core.prefs | 342 +
.../.settings/org.eclipse.jdt.ui.prefs | 63 +
.../org.eclipse.ltk.core.refactoring.prefs | 3 +
.../.settings/org.eclipse.mylyn.tasks.ui.prefs | 4 +
org.eclipse.mylyn/.settings/org.eclipse.pde.prefs | 18 +
org.eclipse.mylyn/META-INF/MANIFEST.MF | 9 +
org.eclipse.mylyn/about.html | 27 +
org.eclipse.mylyn/about.ini | 17 +
org.eclipse.mylyn/build.properties | 17 +
.../developer/archive/contributors.html | 156 +
.../developer/archive/issue-trackers.html | 205 +
.../developer/archive/tests-manual.html | 226 +
.../developer/mylar-settings-templates.xml | 18 +
.../developer/mylyn-settings-formatter.xml | 251 +
.../src-old/AbstractHyperlinkDetector.java | 37 +
.../developer/src-old/AbstractQueryHit.java | 193 +
.../developer/src-old/AwtExample.java | 229 +
.../src-old/BugzillaHyperLinkDetector.java | 202 +
.../developer/src-old/BugzillaReportElement.java | 118 +
.../developer/src-old/BugzillaTaskHandler.java | 272 +
.../developer/src-old/BugzillaTaskListManager.java | 84 +
org.eclipse.mylyn/developer/src-old/ChartTest.java | 69 +
.../developer/src-old/CommitContextAction.java | 64 +
.../src-old/DoiDecoratingTableLabelProvider.java | 88 +
.../developer/src-old/EditorListener.java | 48 +
.../developer/src-old/EditorPageListener.java | 43 +
.../developer/src-old/ExplorerFilteredTree.java | 68 +
.../developer/src-old/FilteringNavigatorView.java | 44 +
.../developer/src-old/FluidPrototyping.java | 41 +
.../developer/src-old/IMapListener.java | 23 +
org.eclipse.mylyn/developer/src-old/Interest.java | 32 +
.../src-old/JavaStackTraceHyperlinkAdapter.java | 144 +
.../src-old/MylarJavaElementDescriptor.java | 82 +
.../developer/src-old/NewLocalTaskAction.java | 109 +
.../developer/src-old/PackageExplorerManager.java | 164 +
.../src-old/ProblemsListInterestSorter.java | 88 +
.../developer/src-old/RelativePathUtil.java | 41 +
.../developer/src-old/RemoveFromContextAction.java | 105 +
.../src-old/RepositoryAwareStatusHandler.java | 79 +
org.eclipse.mylyn/developer/src-old/Scatch.jpage | 179 +
.../src-old/SynchronizeChangedTasksJob.java | 89 +
.../developer/src-old/TaskActivityTimer.java | 129 +
.../developer/src-old/TaskActivityTimingTest.java | 176 +
.../developer/src-old/TaskListBackupManager.java | 350 +
.../developer/src-old/TaskListDataMigration.java | 261 +
.../developer/src-old/TaskListSaveManager.java | 352 +
.../TaskRepositoriesTableLabelProvider.java | 73 +
org.eclipse.mylyn/developer/src-old/TaskTest.java | 139 +
.../developer/src-old/TaskscapeVizView.java | 195 +
.../developer/src-old/TimingStuff.jpage | 16 +
.../developer/src-old/UserSelectionMonitor.java | 94 +
.../src-old/bugs/BugzillaActiveSearchTest.java | 339 +
.../src-old/bugs/BugzillaContextLabelProvider.java | 71 +
.../src-old/bugs/BugzillaEditingMonitor.java | 46 +
.../src-old/bugs/BugzillaMylynSearch.java | 188 +
.../src-old/bugs/BugzillaMylynSearchJob.java | 104 +
.../src-old/bugs/BugzillaMylynSearchOperation.java | 540 +
.../src-old/bugs/BugzillaReferencesProvider.java | 199 +
.../developer/src-old/bugs/BugzillaReportInfo.java | 189 +
.../src-old/bugs/BugzillaSearchEngine.java | 545 +
.../src-old/bugs/BugzillaSearchManager.java | 152 +
.../src-old/bugs/BugzillaStructureBridge.java | 140 +
.../developer/src-old/bugs/BugzillaUiBridge.java | 139 +
.../src-old/bugs/IBugzillaSearchOperation.java | 53 +
.../developer/src-old/bugs/MylynBugsManager.java | 96 +
.../src-old/bugs/ProgressQueryHitCollector.java | 152 +
org.eclipse.mylyn/developer/src-old/bugs/Util.java | 220 +
.../bugzilla/AbstractBugzillaReportWizard.java | 238 +
.../bugzilla/AbstractBugzillaWizardPage.java | 780 ++
.../src-old/bugzilla/AbstractFavoritesAction.java | 53 +
.../bugzilla/AbstractOfflineReportsAction.java | 54 +
.../src-old/bugzilla/AbstractWizardListPage.java | 200 +
.../src-old/bugzilla/AddFavoriteAction.java | 123 +
.../src-old/bugzilla/AttachmentPartSource.java | 43 +
.../developer/src-old/bugzilla/BugParser.java | 1107 ++
.../src-old/bugzilla/BugSubmissionHandler.java | 186 +
.../src-old/bugzilla/Bugzilla220ParserTest.java | 92 +
.../src-old/bugzilla/BugzillaAttributeFactory.java | 161 +
.../bugzilla/BugzillaCategorySearchOperation.java | 163 +
.../src-old/bugzilla/BugzillaCompareInput.java | 121 +
.../src-old/bugzilla/BugzillaCompareNode.java | 284 +
.../bugzilla/BugzillaCompareStructureCreator.java | 76 +
.../src-old/bugzilla/BugzillaException.java | 67 +
.../src-old/bugzilla/BugzillaHyperLink.java | 74 +
.../src-old/bugzilla/BugzillaLabelProvider.java | 84 +
.../bugzilla/BugzillaNewBugParserTestCDT.java | 213 +
.../bugzilla/BugzillaNewBugParserTestEquinox.java | 219 +
.../bugzilla/BugzillaNewBugParserTestGMT.java | 219 +
.../bugzilla/BugzillaNewBugParserTestPlatform.java | 246 +
.../bugzilla/BugzillaNewBugParserTestVE.java | 225 +
.../src-old/bugzilla/BugzillaParserTest.java | 196 +
.../src-old/bugzilla/BugzillaParserTestNoBug.java | 47 +
.../src-old/bugzilla/BugzillaPreferencePage.java | 235 +
.../src-old/bugzilla/BugzillaProductPage.java | 472 +
.../src-old/bugzilla/BugzillaQueryHit.java | 53 +
.../src-old/bugzilla/BugzillaQueryPageParser.java | 540 +
.../src-old/bugzilla/BugzillaReportSubmitForm.java | 738 +
.../src-old/bugzilla/BugzillaRepositoryQuery.java | 44 +
.../bugzilla/BugzillaResultMatchAdapter.java | 71 +
.../src-old/bugzilla/BugzillaSearchHit.java | 215 +
.../src-old/bugzilla/BugzillaSearchOperation.java | 103 +
.../src-old/bugzilla/BugzillaSearchQuery.java | 85 +
.../BugzillaStackTraceDuplicateDetector.java | 64 +
.../src-old/bugzilla/BugzillaStackTraceTest.java | 196 +
.../developer/src-old/bugzilla/BugzillaTask.java | 73 +
.../src-old/bugzilla/BugzillaTaskEditor.java | 822 ++
.../bugzilla/BugzillaTaskEditorFactory.java | 85 +
.../src-old/bugzilla/BugzillaTaskEditorInput.java | 81 +
.../bugzilla/BugzillaTaskHyperlinkDetector.java | 91 +
.../src-old/bugzilla/BugzillaTaskListFactory.java | 104 +
.../src-old/bugzilla/CreateBugzillaTaskAction.java | 113 +
.../src-old/bugzilla/DeleteFavoriteAction.java | 70 +
.../src-old/bugzilla/DummySearchHitProvider.java | 33 +
.../developer/src-old/bugzilla/Favorite.java | 113 +
.../developer/src-old/bugzilla/FavoritesFile.java | 316 +
.../developer/src-old/bugzilla/FavoritesView.java | 574 +
.../developer/src-old/bugzilla/GetQueryDialog.java | 201 +
.../bugzilla/IBugzillaSearchResultCollector.java | 76 +
.../developer/src-old/bugzilla/KeywordParser.java | 155 +
.../developer/src-old/bugzilla/NewBugParser.java | 427 +
.../src-old/bugzilla/NewBugWizardTest.java | 98 +
.../src-old/bugzilla/NewBugzillaTaskData.java | 183 +
.../src-old/bugzilla/NewBugzillaTaskEditor.java | 252 +
.../src-old/bugzilla/OpenBugzillaReportJob.java | 48 +
.../bugzilla/RegularExpressionMatchTest.java | 87 +
.../src-old/bugzilla/RepositoryConfiguration.java | 407 +
.../src-old/bugzilla/RepositoryReportFactory.java | 53 +
.../src-old/bugzilla/SaveQueryDialog.java | 90 +
.../developer/src-old/bugzilla/SavedQueryFile.java | 256 +
.../bugzilla/SaxBugReportContentHandler.java | 291 +
.../bugzilla/SaxConfigurationContentHandler.java | 437 +
.../SaxConfigurationContentHandlerOLD.java | 399 +
.../bugzilla/TaskListNotificationManagerTest.java | 137 +
.../src-old/bugzilla/ViewBugzillaAction.java | 68 +
.../src-old/bugzilla/ViewFavoriteAction.java | 58 +
.../src-old/bugzilla/ViewOfflineReportAction.java | 88 +
.../src-old/bugzilla/WizardAttributesPage.java | 33 +
.../editors/AbstractNewRepositoryTaskEditor.java | 534 +
.../editors/AbstractRepositoryQueryWizard.java | 74 +
.../editors/AbstractRepositoryTaskEditor.java | 4051 ++++++
.../editors/AbstractRepositoryTaskEditorInput.java | 133 +
.../src-old/editors/AbstractTaskEditorFactory.java | 53 +
.../editors/AutoFoldingStructureProvider.java | 944 ++
.../src-old/editors/ContentOutlineTools.java | 69 +
.../src-old/editors/MylarClassFileEditor.java | 148 +
.../src-old/editors/NewTaskEditorInput.java | 54 +
.../editors/RepositoryTaskEditorCopyAction.java | 48 +
.../editors/RepositoryTaskEditorDropListener.java | 167 +
.../src-old/editors/RepositoryTaskEditorInput.java | 109 +
.../editors/RepositoryTaskOutlineComparer.java | 45 +
.../src-old/editors/RepositoryTaskOutlineNode.java | 338 +
.../src-old/editors/RepositoryTaskOutlinePage.java | 208 +
.../editors/TaskEditorUrlHyperlinkDetector.java | 113 +
.../developer/src-old/editors/TaskFactory.java | 183 +
.../editors/TaskSpellingReconcileStrategy.java | 193 +
.../developer/src-old/editors/plugin-scraps.xml | 8 +
.../developer/src-old/hypertext/RelatedLinks.java | 46 +
.../src-old/hypertext/WebElementsEditor.java | 480 +
.../hypertext/WebElementsEditorFactory.java | 51 +
.../src-old/hypertext/WebElementsEditorInput.java | 55 +
.../hypertext/WebResourceContentProvider.java | 104 +
.../hypertext/WebResourceLabelProvider.java | 59 +
.../src-old/jira/JiraIssueContentOutlinePage.java | 136 +
.../src-old/jira/JiraIssueEditorInput.java | 99 +
.../developer/src-old/jira/JiraTaskEditor.java | 419 +
.../src-old/monitor/CardinalStatistic.java | 66 +
.../developer/src-old/monitor/PassiveTimer.java | 34 +
.../src-old/monitor/SelectionMonitor.java | 174 +
.../src-old/monitor/TemporalStatistic.java | 61 +
.../developer/src-old/monitor/UsageCountView.java | 62 +
.../developer/src-old/monitor/UsageSession.java | 337 +
.../developer/src-old/monitor/UsageStatistic.java | 53 +
.../src-old/tasks/AbstractTaskListFactory.java | 184 +
.../developer/src-old/tasks/ITaskDataStorage.java | 54 +
.../src-old/tasks/OfflineCachingStorage.java | 324 +
.../developer/src-old/tasks/OfflineDataStore.java | 69 +
.../src-old/tasks/OfflineFileStorage.java | 726 +
.../src-old/tasks/TaskDataStorageManager.java | 357 +
.../tests/BugzillaTaskDataMigrationTest.java | 35 +
org.eclipse.mylyn/developer/src-old/tests/Job.java | 87 +
.../developer/src-old/tests/People.java | 67 +
.../developer/src-old/tests/Person.java | 107 +
.../src-old/trac/RepositorySearchQuery.java | 88 +
.../src-old/views/ActiveTaskscapeView.java | 207 +
.../developer/src-old/views/DoiViewerFilter.java | 123 +
.../src-old/views/ImageTableCellEditor.java | 215 +
.../MylarFontDecoratingJavaLabelProvider.java | 47 +
.../src-old/views/MylarJavaOutlinePage.java | 1433 ++
.../developer/src-old/views/MylarMonitorView.java | 178 +
.../src-old/views/MylarPackageExplorer.java | 174 +
.../developer/src-old/views/MylarProblemView.java | 289 +
.../src-old/views/NextTaskDropDownAction.java | 59 +
.../developer/src-old/views/ProblemsFieldDoi.java | 90 +
.../src-old/views/ProblemsFieldJavaElement.java | 109 +
.../src-old/views/ProblemsListFilter.java | 39 +
.../src-old/views/TaskListDropTargetListener.java | 73 +
.../src-old/views/TaskListToolTipHandler.java | 569 +
.../views/ToggleAutoManagerExplorerAction.java | 59 +
.../views/ToggleAutoManagerProblemsAction.java | 61 +
.../views/ToggleFilterDeclarationsAction.java | 64 +
.../src-old/views/UsageStatisticsView.java | 123 +
.../developer/src-old/views/pugin-scraps.xml | 361 +
.../developer/task-hierarchy-diagram.vsd | Bin 0 -> 52736 bytes
org.eclipse.mylyn/feature.gif | Bin 0 -> 1689 bytes
org.eclipse.mylyn/plugin.properties | 3 +
5377 files changed, 389870 insertions(+), 0 deletions(-)
diff --git a/org.eclipse.mylyn-feature/.project b/org.eclipse.mylyn-feature/.project
new file mode 100644
index 0000000..3a69cb6
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn-feature/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn-feature/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..24994c7
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 2 elements(s) to 'org.eclipse.mylar.monitor-feature' - Original project: 'org.eclipse.mylar-feature' - Destination element: 'org.eclipse.mylar.monitor-feature' - Original elements: about.html license.html" description="Copy files" element1="about.html" element2="license.html" files="2" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="license.html	true	false about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1174699142148" target="/org.eclipse.mylar.monitor-feature" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn-feature/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn-feature/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..c3594f6
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1 @@
+1174699142148 Copy files
diff --git a/org.eclipse.mylyn-feature/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn-feature/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..a23e0b9
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn-feature' - Original project: 'org.eclipse.mylyn-feature' - Destination element: 'org.eclipse.mylyn-feature' - Original element: 'feature.xml'" description="Copy file" element1="feature.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="feature.xml	true	true	feature-compatibility.xml" policy="org.eclipse.jdt.ui.copyResources" stamp="1184356151210" target="/org.eclipse.mylyn-feature" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn-feature/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn-feature/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..57580bf
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184356151210 Copy file
diff --git a/org.eclipse.mylyn-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..ea51698
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:29:46 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..96a7c9d
--- /dev/null
+++ b/org.eclipse.mylyn-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:07:53 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn-feature/about.html b/org.eclipse.mylyn-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn-feature/build.properties b/org.eclipse.mylyn-feature/build.properties
new file mode 100644
index 0000000..9b0ffd2
--- /dev/null
+++ b/org.eclipse.mylyn-feature/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Mylyn project committers 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
+###############################################################################
+bin.includes = feature.properties,\
+ feature.xml,\
+ about.ini,\
+ about.properties,\
+ eclipse32.gif,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = eclipse32.gif,\
+ about.properties,\
+ about.ini,\
+ about.html
diff --git a/org.eclipse.mylyn-feature/epl-v10.html b/org.eclipse.mylyn-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn-feature/feature-compatibility.xml b/org.eclipse.mylyn-feature/feature-compatibility.xml
new file mode 100644
index 0000000..aebb0b4
--- /dev/null
+++ b/org.eclipse.mylyn-feature/feature-compatibility.xml
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn_feature"
+ label="Mylyn Task List (Required)"
+ version="2.0.0.v20070706-2000"
+ provider-name="Eclipse.org"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ Provides the Task List for task and time management.
+ </description>
+
+ <copyright>
+ Copyright (c) 2004 - 2007 Mylyn project committers and others.
+ </copyright>
+
+ <license url="http://www.eclipse.org/legal/epl-v10.html">
+ Eclipse Public License - v 1.0
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS
+ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.
+1. DEFINITIONS
+"Contribution" means:
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i) changes to the Program, and
+ii) additions to the Program;
+where such changes and/or additions to the Program originate
+from and are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program
+by such Contributor itself or anyone acting on such Contributor's
+behalf. Contributions do not include additions to the Program
+which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.
+"Contributor" means any person or entity that distributes the
+Program.
+"Licensed Patents " mean patent claims licensable by a Contributor
+which are necessarily infringed by the use or sale of its Contribution
+alone or when combined with the Program.
+"Program" means the Contributions distributed in accordance with
+this Agreement.
+"Recipient" means anyone who receives the Program under this
+Agreement, including all Contributors.
+2. GRANT OF RIGHTS
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution
+of such Contributor, if any, and such derivative works, in source
+code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent
+license under Licensed Patents to make, use, sell, offer to sell,
+import and otherwise transfer the Contribution of such Contributor,
+if any, in source code and object code form. This patent license
+shall apply to the combination of the Contribution and the Program
+if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to
+be covered by the Licensed Patents. The patent license shall
+not apply to any other combinations which include the Contribution.
+No hardware per se is licensed hereunder.
+c) Recipient understands that although each Contributor grants
+the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe
+the patent or other intellectual property rights of any other
+entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement
+of intellectual property rights or otherwise. As a condition
+to exercising the rights and licenses granted hereunder, each
+Recipient hereby assumes sole responsibility to secure any other
+intellectual property rights needed, if any. For example, if
+a third party patent license is required to allow Recipient to
+distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+3. REQUIREMENTS
+A Contributor may choose to distribute the Program in object
+code form under its own license agreement, provided that:
+a) it complies with the terms and conditions of this Agreement;
+and
+b) its license agreement:
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or
+conditions of title and non-infringement, and implied warranties
+or conditions of merchantability and fitness for a particular
+purpose;
+ii) effectively excludes on behalf of all Contributors all liability
+for damages, including direct, indirect, special, incidental
+and consequential damages, such as lost profits;
+iii) states that any provisions which differ from this Agreement
+are offered by that Contributor alone and not by any other party;
+and
+iv) states that source code for the Program is available from
+such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for
+software exchange.
+When the Program is made available in source code form:
+a) it must be made available under this Agreement; and
+b) a copy of this Agreement must be included with each copy of
+the Program.
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+4. COMMERCIAL DISTRIBUTION
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While
+this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any
+losses, damages and costs (collectively "Losses") arising from
+claims, lawsuits and other legal actions brought by a third party
+against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection
+with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any
+claims or Losses relating to any actual or alleged intellectual
+property infringement. In order to qualify, an Indemnified Contributor
+must: a) promptly notify the Commercial Contributor in writing
+of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense
+and any related settlement negotiations. The Indemnified Contributor
+may participate in any such claim at its own expense.
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have
+to defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any
+other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+5. NO WARRANTY
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM
+IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with
+its exercise of rights under this Agreement , including but not
+limited to the risks and costs of program errors, compliance
+with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations.
+6. DISCLAIMER OF LIABILITY
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE
+OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGES.
+7. GENERAL
+If any provision of this Agreement is invalid or unenforceable
+under applicable law, it shall not affect the validity or enforceability
+of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be
+reformed to the minimum extent necessary to make such provision
+valid and enforceable.
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging
+that the Program itself (excluding combinations of the Program
+with other software or hardware) infringes such Recipient's patent(s),
+then such Recipient's rights granted under Section 2(b) shall
+terminate as of the date such litigation is filed.
+All Recipient's rights under this Agreement shall terminate if
+it fails to comply with any of the material terms or conditions
+of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If
+all Recipient's rights under this Agreement terminate, Recipient
+agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under
+this Agreement and any licenses granted by Recipient relating
+to the Program shall continue and survive.
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted
+and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other
+than the Agreement Steward has the right to modify this Agreement.
+The Eclipse Foundation is the initial Agreement Steward. The
+Eclipse Foundation may assign the responsibility to serve as
+the Agreement Steward to a suitable separate entity. Each new
+version of the Agreement will be given a distinguishing version
+number. The Program (including Contributions) may always be distributed
+subject to the version of the Agreement under which it was received.
+In addition, after a new version of the Agreement is published,
+Contributor may elect to distribute the Program (including its
+Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights
+or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under
+this Agreement are reserved.
+This Agreement is governed by the laws of the State of New York
+and the intellectual property laws of the United States of America.
+No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose.
+Each party waives its rights to a jury trial in any resulting
+litigation.
+ </license>
+
+ <url>
+ <update label="Mylyn for Eclipse 3.3" url="http://download.eclipse.org/tools/mylyn/update/e3.3"/>
+ <discovery label="Mylyn Extras" url="http://download.eclipse.org/tools/mylyn/update/extras"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.ui" version="3.3.0.I20070503" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.mylyn.tasks.core"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui"/>
+ <import plugin="org.eclipse.mylyn"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.ui.cheatsheets"/>
+ <import plugin="org.eclipse.ui.intro"/>
+ <import plugin="org.eclipse.help.webapp"/>
+ <import plugin="org.eclipse.mylyn.monitor.core"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.mylyn.context.core"/>
+ <import plugin="org.eclipse.update.core"/>
+ <import plugin="org.eclipse.ui.browser"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.mylyn.monitor.ui"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.search"/>
+ <import plugin="org.eclipse.ui.net"/>
+ <import plugin="org.eclipse.mylyn.web.core"/>
+ <import plugin="org.eclipse.core.net"/>
+ <import plugin="org.eclipse.mylar" version="2.0.0.v20070614-1800"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.help.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.context.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.tasks.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.tasks.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.web.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.bugzilla.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.bugzilla.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.context.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.context.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.doc"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.ide"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.java"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.jira.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.jira.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.monitor.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.monitor.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.monitor.usage"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.resources"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.tasks.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.tasks.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.tasks.web"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.team"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.trac.core"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.trac.ui"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylar.web"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070615-compatibility"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.compatibility"
+ download-size="0"
+ install-size="0"
+ version="2.0.0.v20070706-2000"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn-feature/feature.properties b/org.eclipse.mylyn-feature/feature.properties
new file mode 100644
index 0000000..bf2fb44
--- /dev/null
+++ b/org.eclipse.mylyn-feature/feature.properties
@@ -0,0 +1,50 @@
+featureName=Mylyn Task List (Required)
+description=Provides the Task List for task and time management.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+discovery_Mylyn_Extras=Mylyn Extras
+discovery_Mylyn=Mylyn
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0\n\)
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn-feature/feature.xml b/org.eclipse.mylyn-feature/feature.xml
new file mode 100644
index 0000000..ab4f21b
--- /dev/null
+++ b/org.eclipse.mylyn-feature/feature.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ <discovery label="%discovery_Mylyn_Extras" url="http://download.eclipse.org/tools/mylyn/update/extras"/>
+ <discovery label="%discovery_Mylyn" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.ui" version="3.4.0.I20070918" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.compare"/>
+ <import plugin="org.eclipse.core.expressions"/>
+ <import plugin="org.eclipse.core.net"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.search"/>
+ <import plugin="org.eclipse.ui.browser"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.net" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.apache.commons.logging" version="1.0.4" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.codec" version="1.3.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.httpclient" version="3.1.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.lang" version="2.3.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.core.runtime" version="3.3.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.1.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.mylyn.commons.net" version="3.1.0" match="greaterOrEqual"/>
+ <import feature="org.eclipse.rcp" version="3.4.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.discovery.core" version="3.2.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.2.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.2.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.context.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.tasks.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.tasks.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.compatibility"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.logging"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.codec"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.httpclient"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.lang"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.commons.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.commons.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.commons.net"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.discovery.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.discovery.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn-feature/license.html b/org.eclipse.mylyn-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.bugzilla-feature/.project b/org.eclipse.mylyn.bugzilla-feature/.project
new file mode 100644
index 0000000..91e2a5a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.bugzilla-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.bugzilla-feature/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.bugzilla-feature/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..eee4ae1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla-feature' - Original project: 'org.eclipse.mylyn.bugzilla-feature' - Original element: 'org.eclipse.jdt.ui.prefs'" description="Delete element" element1="org.eclipse.jdt.ui.prefs" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1184356324572" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla-feature/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.bugzilla-feature/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..e2345cb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184356324572 Delete element
diff --git a/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..0f7b2e1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:21 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..a4b9fa9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:08:45 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.bugzilla-feature/about.html b/org.eclipse.mylyn.bugzilla-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla-feature/build.properties b/org.eclipse.mylyn.bugzilla-feature/build.properties
new file mode 100644
index 0000000..afcbe3f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = feature.properties,\
+ feature.xml,\
+ license.html,\
+ epl-v10.html,\
+ about.html
+src.includes = about.html,\
+ epl-v10.html,\
+ license.html
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.bugzilla-feature/epl-v10.html b/org.eclipse.mylyn.bugzilla-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla-feature/feature.properties b/org.eclipse.mylyn.bugzilla-feature/feature.properties
new file mode 100644
index 0000000..33107d5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Connector: Bugzilla
+description=Provides Task List integration, offline support and rich editing for the open source Bugzilla bug tracker.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.bugzilla-feature/feature.xml b/org.eclipse.mylyn.bugzilla-feature/feature.xml
new file mode 100644
index 0000000..c3fcc1e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/feature.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.bugzilla_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://www.bugzilla.org">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.core.net"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.compare"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import feature="org.eclipse.mylyn_feature" version="3.2.1.qualifier" match="perfect"/>
+ <import plugin="org.eclipse.mylyn.commons.net" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.bugzilla.core"
+ download-size="0"
+ install-size="0"
+ version="3.2.1.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.bugzilla.ui"
+ download-size="0"
+ install-size="0"
+ version="3.2.1.qualifier"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.bugzilla-feature/license.html b/org.eclipse.mylyn.bugzilla-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.bugzilla.core/.classpath b/org.eclipse.mylyn.bugzilla.core/.classpath
new file mode 100644
index 0000000..6fe1981
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="**/System"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.bugzilla.core/.cvsignore b/org.eclipse.mylyn.bugzilla.core/.cvsignore
new file mode 100644
index 0000000..bc8b2d4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.cvsignore
@@ -0,0 +1,3 @@
+bin
+bugzilla.jar
+doc.zip
diff --git a/org.eclipse.mylyn.bugzilla.core/.project b/org.eclipse.mylyn.bugzilla.core/.project
new file mode 100644
index 0000000..ffdfd20
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.bugzilla.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/41/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/41/refactorings.history
new file mode 100644
index 0000000..a8f8de8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/41/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaCorePlugin.ENCODING_UTF_8' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaCorePlugin.ENCODING_UTF_8' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'ENCODING_UTF_8'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaCorePlugin.java[BugzillaCorePlugin^ENCODING_UTF_8" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1160618346984" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.UnrecognizedReponseException.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.internal.bugzilla.core{UnrecognizedReponseException.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1160700972796" units="1" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.XML_ERROR_NOTFOUND' from expression '"notfound"' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'XML_ERROR_NOTFOUND' - Constant expression: '"notfound"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'XML_ERROR_NOTFOUND'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java" name="XML_ERROR_NOTFOUND" qualify="false" replace="true" selection="2146 10" stamp="1160704176578" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.XML_ERROR_INVALIDBUGID' from expression '"invalidbugid"' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'XML_ERROR_INVALIDBUGID' - Constant expression: '"invalidbugid"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'XML_ERROR_INVALIDBUGID'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java" name="XML_ERROR_INVALIDBUGID" qualify="false" replace="true" selection="2255 14" stamp="1160704190078" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.XML_ERROR_INVALIDBUGID' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.XML_ERROR_INVALIDBUGID' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'XML_ERROR_INVALIDBUGID'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java[RepositoryReportFactory^XML_ERROR_INVALIDBUGID" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1160704208390" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.XML_ERROR_NOTFOUND' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.XML_ERROR_NOTFOUND' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'XML_ERROR_NOTFOUND'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java[RepositoryReportFactory^XML_ERROR_NOTFOUND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1160704219015" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.SHOW_BUG_CGI_XML' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.SHOW_BUG_CGI_XML' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'SHOW_BUG_CGI_XML'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java[RepositoryReportFactory^SHOW_BUG_CGI_XML" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1160704256984" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.ERROR_MSG_INVALID_BUG_ID' from expression '"Invalid Bug ID. The requested bug id does not exist."' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'ERROR_MSG_INVALID_BUG_ID' - Constant expression: '"Invalid Bug ID. The requested bug id does not exist."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ERROR_MSG_INVALID_BUG_ID'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java" name="ERROR_MSG_INVALID_BUG_ID" qualify="false" replace="true" selection="2225 54" stamp="1160704768187" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.ERROR_MSG_OP_NOT_PERMITTED' from expression '"The requested operation is not permitted."' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'ERROR_MSG_OP_NOT_PERMITTED' - Constant expression: '"The requested operation is not permitted."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ERROR_MSG_OP_NOT_PERMITTED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java" name="ERROR_MSG_OP_NOT_PERMITTED" qualify="false" replace="true" selection="2474 43" stamp="1160704799859" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.ERROR_MSG_OP_NOT_PERMITTED' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.ERROR_MSG_OP_NOT_PERMITTED' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'ERROR_MSG_OP_NOT_PERMITTED'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java[RepositoryReportFactory^ERROR_MSG_OP_NOT_PERMITTED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1160704821187" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.ERROR_MSG_INVALID_BUG_ID' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryReportFactory.ERROR_MSG_INVALID_BUG_ID' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'ERROR_MSG_INVALID_BUG_ID'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryReportFactory.java[RepositoryReportFactory^ERROR_MSG_INVALID_BUG_ID" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1160704826781" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/41/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/41/refactorings.index
new file mode 100644
index 0000000..f0fc3a0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/41/refactorings.index
@@ -0,0 +1,11 @@
+1160618346984 Move member 'ENCODING_UTF_8'
+1160700972796 Move compilation unit
+1160704176578 Extract constant 'XML_ERROR_NOTFOUND'
+1160704190078 Extract constant 'XML_ERROR_INVALIDBUGID'
+1160704208390 Move member 'XML_ERROR_INVALIDBUGID'
+1160704219015 Move member 'XML_ERROR_NOTFOUND'
+1160704256984 Move member 'SHOW_BUG_CGI_XML'
+1160704768187 Extract constant 'ERROR_MSG_INVALID_BUG_ID'
+1160704799859 Extract constant 'ERROR_MSG_OP_NOT_PERMITTED'
+1160704821187 Move member 'ERROR_MSG_OP_NOT_PERMITTED'
+1160704826781 Move member 'ERROR_MSG_INVALID_BUG_ID'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/43/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/43/refactorings.history
new file mode 100644
index 0000000..f3a036f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/43/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade' to 'BugzillaClient' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaServerFacade'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaServerFacade.java[BugzillaServerFacade" matchStrategy="1" name="BugzillaClient" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161899202765" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryConfiguration.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryConfiguration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1161923557906" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler.updateBugAttributeOptions(...)' to 'updateAttributeOptions' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler.updateBugAttributeOptions(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler.updateAttributeOptions(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'updateBugAttributeOptions'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaOfflineTaskHandler.java[BugzillaOfflineTaskHandler~updateBugAttributeOptions~QTaskRepository;~QRepositoryTaskData;" name="updateAttributeOptions" references="true" stamp="1161987378750" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.RepositoryConfiguration.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{RepositoryConfiguration.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161996705796" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.internal.bugzilla.core.XmlCleaner.java' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.internal.bugzilla.core.XmlCleaner.java' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.SaxConfigurationContentHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.core{XmlCleaner.java" element1="/src<org.eclipse.mylar.internal.bugzilla.core{SaxConfigurationContentHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.core{SaxConfigurationContentHandler.java	true	true	CopyOfSaxConfigurationContentHandler.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1161998963468" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.CopyOfSaxConfigurationContentHandler.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{CopyOfSaxConfigurationContentHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161998981390" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.SaxConfigurationContentHandler.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{SaxConfigurationContentHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/SaxConfigurationContentHandler.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1161998999609" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/43/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/43/refactorings.index
new file mode 100644
index 0000000..d6ed806
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/43/refactorings.index
@@ -0,0 +1,7 @@
+1161899202765 Rename type 'BugzillaServerFacade'
+1161923557906 Move compilation unit
+1161987378750 Rename method 'updateBugAttributeOptions'
+1161996705796 Delete element
+1161998963468 Copy compilation unit
+1161998981390 Delete element
+1161998999609 Copy compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/44/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/44/refactorings.history
new file mode 100644
index 0000000..712246a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original elements: org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaOfflineTaskHandler.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1162336475812" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/44/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/44/refactorings.index
new file mode 100644
index 0000000..b25c7bb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/10/44/refactorings.index
@@ -0,0 +1 @@
+1162336475812 Infer generic type arguments
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..19b5b51
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.uploadAttachment(...)' to 'postAttachment' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.uploadAttachment(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.postAttachment(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'uploadAttachment'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~uploadAttachment~QString;~QString;~QString;~QFile;~QString;~Z" name="postAttachment" references="true" stamp="1162406862187" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.search(...)' to 'getSearchHits' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.search(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.getSearchHits(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'search'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~search~QAbstractRepositoryQuery;~QQueryHitCollector;~QTaskList;" name="getSearchHits" references="true" stamp="1162406936140" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_BUGZILLA_LOGIN' from expression '"Bugzilla_login"' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'POST_INPUT_BUGZILLA_LOGIN' - Constant expression: '"Bugzilla_login"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'POST_INPUT_BUGZILLA_LOGIN'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="POST_INPUT_BUGZILLA_LOGIN" qualify="false" replace="true" selection="9281 16" stamp="1162420215768" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_BUGZILLA_PASSWORD' from expression '"Bugzilla_password"' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'POST_INPUT_BUGZILLA_PASSWORD' - Constant expression: '"Bugzilla_password"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'POST_INPUT_BUGZILLA_PASSWORD'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="POST_INPUT_BUGZILLA_PASSWORD" qualify="false" replace="true" selection="9441 19" stamp="1162420231284" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_BUGZILLA_PASSWORD' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_BUGZILLA_PASSWORD' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'POST_INPUT_BUGZILLA_PASSWORD'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^POST_INPUT_BUGZILLA_PASSWORD" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1162420247487" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_BUGID' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'POST_INPUT_BUGID' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.ATTRIBUTE_BUGID' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_BUGID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTRIBUTE_BUGID'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^ATTRIBUTE_BUGID" name="POST_INPUT_BUGID" references="true" setter="false" stamp="1162420821456" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'BUG_ACTIVITY_URL' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_BUG_ACTIVITY' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.BUG_ACTIVITY_URL' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_BUG_ACTIVITY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'BUG_ACTIVITY_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^BUG_ACTIVITY_URL" name="URL_BUG_ACTIVITY" references="true" setter="false" stamp="1162421499768" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'SHOW_VOTES_URL' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_SHOW_VOTES' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.SHOW_VOTES_URL' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_SHOW_VOTES' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'SHOW_VOTES_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^SHOW_VOTES_URL" name="URL_SHOW_VOTES" references="true" setter="false" stamp="1162421511737" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'VOTE_URL' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_VOTE' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.VOTE_URL' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_VOTE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'VOTE_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^VOTE_URL" name="URL_VOTE" references="true" setter="false" stamp="1162421531096" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'DEPENDENCY_TREE_URL' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_DEPENDENCY_TREE' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.DEPENDENCY_TREE_URL' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_DEPENDENCY_TREE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'DEPENDENCY_TREE_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^DEPENDENCY_TREE_URL" name="URL_DEPENDENCY_TREE" references="true" setter="false" stamp="1162421540674" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'DEPENDENCY_GRAPH_URL' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_DEPENDENCY_GRAPH' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.DEPENDENCY_GRAPH_URL' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_DEPENDENCY_GRAPH' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'DEPENDENCY_GRAPH_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^DEPENDENCY_GRAPH_URL" name="URL_DEPENDENCY_GRAPH" references="true" setter="false" stamp="1162421552565" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'POST_ARGS_SHOW_BUG' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_GET_SHOW_BUG' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.POST_ARGS_SHOW_BUG' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_GET_SHOW_BUG' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'POST_ARGS_SHOW_BUG'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^POST_ARGS_SHOW_BUG" name="URL_GET_SHOW_BUG" references="true" setter="false" stamp="1162421694190" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'CGI_LOGIN' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_POST_LOGIN' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.CGI_LOGIN' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_POST_LOGIN' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'CGI_LOGIN'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^CGI_LOGIN" name="URL_POST_LOGIN" references="true" setter="false" stamp="1162421719377" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTACHMENT_URL_SUFFIX' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_GET_ATTACHMENT_SUFFIX' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.ATTACHMENT_URL_SUFFIX' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_GET_ATTACHMENT_SUFFIX' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTACHMENT_URL_SUFFIX'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^ATTACHMENT_URL_SUFFIX" name="URL_GET_ATTACHMENT_SUFFIX" references="true" setter="false" stamp="1162421768987" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'POST_CONFIG_RDF_URL' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_GET_CONFIG_RDF' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.POST_CONFIG_RDF_URL' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_GET_CONFIG_RDF' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'POST_CONFIG_RDF_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^POST_CONFIG_RDF_URL" name="URL_GET_CONFIG_RDF" references="true" setter="false" stamp="1162421815815" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'SHOW_BUG_CGI_XML' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'URL_GET_SHOW_BUG_XML' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.SHOW_BUG_CGI_XML' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.URL_GET_SHOW_BUG_XML' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'SHOW_BUG_CGI_XML'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^SHOW_BUG_CGI_XML" name="URL_GET_SHOW_BUG_XML" references="true" setter="false" stamp="1162421856487" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_ACTION' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'POST_INPUT_ACTION' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.ATTRIBUTE_ACTION' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_ACTION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTRIBUTE_ACTION'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^ATTRIBUTE_ACTION" name="POST_INPUT_ACTION" references="true" setter="false" stamp="1162422002987" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_DESCRIPTION' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'POST_INPUT_DESCRIPTION' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.ATTRIBUTE_DESCRIPTION' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_DESCRIPTION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTRIBUTE_DESCRIPTION'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^ATTRIBUTE_DESCRIPTION" name="POST_INPUT_DESCRIPTION" references="true" setter="false" stamp="1162422142549" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_COMMENT' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'POST_INPUT_COMMENT' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.ATTRIBUTE_COMMENT' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_COMMENT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTRIBUTE_COMMENT'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^ATTRIBUTE_COMMENT" name="POST_INPUT_COMMENT" references="true" setter="false" stamp="1162422154284" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_DATA' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'POST_INPUT_DATA' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.ATTRIBUTE_DATA' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_INPUT_DATA' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTRIBUTE_DATA'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^ATTRIBUTE_DATA" name="POST_INPUT_DATA" references="true" setter="false" stamp="1162422206877" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.connect(...)' to 'getConnect' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.connect(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.getConnect(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'connect'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~connect~QString;" name="getConnect" references="true" stamp="1162422966284" version="1.0"/>
+<refactoring comment="Rename field 'POST_ARGS_ATTACHMENT_DOWNLOAD' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'URL_GET_ATTACHMENT_DOWNLOAD' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_ARGS_ATTACHMENT_DOWNLOAD' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.URL_GET_ATTACHMENT_DOWNLOAD' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'POST_ARGS_ATTACHMENT_DOWNLOAD'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^POST_ARGS_ATTACHMENT_DOWNLOAD" name="URL_GET_ATTACHMENT_DOWNLOAD" references="true" setter="false" stamp="1162423004940" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'POST_ARGS_ATTACHMENT_UPLOAD' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'URL_GET_ATTACHMENT_UPLOAD' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.POST_ARGS_ATTACHMENT_UPLOAD' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.URL_GET_ATTACHMENT_UPLOAD' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'POST_ARGS_ATTACHMENT_UPLOAD'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^POST_ARGS_ATTACHMENT_UPLOAD" name="URL_GET_ATTACHMENT_UPLOAD" references="true" setter="false" stamp="1162423019331" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'URL_GET_ATTACHMENT_UPLOAD' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' to 'URL_POST_ATTACHMENT_UPLOAD' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.URL_GET_ATTACHMENT_UPLOAD' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.URL_POST_ATTACHMENT_UPLOAD' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'URL_GET_ATTACHMENT_UPLOAD'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^URL_GET_ATTACHMENT_UPLOAD" name="URL_POST_ATTACHMENT_UPLOAD" references="true" setter="false" stamp="1162423064487" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.SaxBugReportContentHandler.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{SaxBugReportContentHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/SaxBugReportContentHandler.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1162518030671" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.SaxConfigurationContentHandler.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{SaxConfigurationContentHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/SaxConfigurationContentHandler.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1162518103468" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..f79505b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1,26 @@
+1162406862187 Rename method 'uploadAttachment'
+1162406936140 Rename method 'search'
+1162420215768 Extract constant 'POST_INPUT_BUGZILLA_LOGIN'
+1162420231284 Extract constant 'POST_INPUT_BUGZILLA_PASSWORD'
+1162420247487 Move member 'POST_INPUT_BUGZILLA_PASSWORD'
+1162420821456 Rename field 'ATTRIBUTE_BUGID'
+1162421499768 Rename field 'BUG_ACTIVITY_URL'
+1162421511737 Rename field 'SHOW_VOTES_URL'
+1162421531096 Rename field 'VOTE_URL'
+1162421540674 Rename field 'DEPENDENCY_TREE_URL'
+1162421552565 Rename field 'DEPENDENCY_GRAPH_URL'
+1162421694190 Rename field 'POST_ARGS_SHOW_BUG'
+1162421719377 Rename field 'CGI_LOGIN'
+1162421768987 Rename field 'ATTACHMENT_URL_SUFFIX'
+1162421815815 Rename field 'POST_CONFIG_RDF_URL'
+1162421856487 Rename field 'SHOW_BUG_CGI_XML'
+1162422002987 Rename field 'ATTRIBUTE_ACTION'
+1162422142549 Rename field 'ATTRIBUTE_DESCRIPTION'
+1162422154284 Rename field 'ATTRIBUTE_COMMENT'
+1162422206877 Rename field 'ATTRIBUTE_DATA'
+1162422966284 Rename method 'connect'
+1162423004940 Rename field 'POST_ARGS_ATTACHMENT_DOWNLOAD'
+1162423019331 Rename field 'POST_ARGS_ATTACHMENT_UPLOAD'
+1162423064487 Rename field 'URL_GET_ATTACHMENT_UPLOAD'
+1162518030671 Copy compilation unit
+1162518103468 Copy compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..5f2578c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'public static BugzillaReportSubmitForm org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.makeExistingBugPost(RepositoryTaskData model, String repositoryUrl, String userName, String password, Proxy proxySettings, List<String> removeCC, String characterEncoding) throws UnsupportedEncodingException' to 'public static BugzillaReportSubmitForm makeExistingBugPost(RepositoryTaskData model, String repositoryUrl, String userName, String password, Proxy proxySettings, String characterEncoding) throws UnsupportedEncodingException' - Original project: 'org.eclipse.mylar.bugzilla.core' - Removed parameters: List<String> removeCC" delegate="false" deprecate="true" description="Change method 'makeExistingBugPost'" element1="/C:\/Program Files\/Java\/jdk1.5.0_09\/jre\/lib\/rt.jar<java.io(UnsupportedEncodingException.class[UnsupportedEncodingException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java[BugzillaReportSubmitForm~makeExistingBugPost~QRepositoryTaskData;~QString;~QString;~QString;~QProxy;~QList\<QString;>;~QString;" kind1="0" name="makeExistingBugPost" parameter1="RepositoryTaskData model 0 RepositoryTaskData model false" parameter2="String repositoryUrl 1 String repositoryUrl false" parameter3="String userName 2 String userName false" parameter4="String password 3 String password false" parameter5="Proxy proxySettings 4 Proxy proxySettings false" parameter6="List<String> removeCC 5 List<String> removeCC true" parameter7="String characterEncoding 6 String characterEncoding false" stamp="1163645722104" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.MAX_RETRY' from expression '3' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'MAX_RETRY' - Constant expression: '3' - Declared visibility: 'private'" description="Extract constant 'MAX_RETRY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="MAX_RETRY" qualify="false" replace="false" selection="6878 1" stamp="1163791248750" version="1.0" visibility="2"/>
+<refactoring comment="Change method 'private void org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler.queryForChanged(TaskRepository repository, Set<AbstractRepositoryTask> changedTasks, String urlQueryString, Proxy proxySettings) throws UnsupportedEncodingException, CoreException' to 'private void queryForChanged(TaskRepository repository, Set<AbstractRepositoryTask> changedTasks, String urlQueryString) throws UnsupportedEncodingException, CoreException' - Original project: 'org.eclipse.mylar.bugzilla.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'queryForChanged'" element1="/C:\/Program Files\/Java\/jdk1.5.0_09\/jre\/lib\/rt.jar<java.io(UnsupportedEncodingException.class[UnsupportedEncodingException" element2="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaOfflineTaskHandler.java[BugzillaOfflineTaskHandler~queryForChanged~QTaskRepository;~QSet\<QAbstractRepositoryTask;>;~QString;~QProxy;" kind1="0" kind2="0" name="queryForChanged" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Set<AbstractRepositoryTask> changedTasks 1 Set<AbstractRepositoryTask> changedTasks false" parameter3="String urlQueryString 2 String urlQueryString false" parameter4="Proxy proxySettings 3 Proxy proxySettings true" stamp="1163810957000" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..201f54e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1,3 @@
+1163645722104 Change method 'makeExistingBugPost'
+1163791248750 Extract constant 'MAX_RETRY'
+1163810957000 Change method 'queryForChanged'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..e5e06eb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.LOGIN_REQUIRED' from expression '"goaheadandlogin=1"' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'LOGIN_REQUIRED' - Constant expression: '"goaheadandlogin=1"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LOGIN_REQUIRED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="LOGIN_REQUIRED" qualify="false" replace="true" selection="13080 19" stamp="1164403208625" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..17613b5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1 @@
+1164403208625 Extract constant 'LOGIN_REQUIRED'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..5315946
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler' to 'BugzillaTaskDataHandler' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaOfflineTaskHandler' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTaskDataHandler' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaOfflineTaskHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaOfflineTaskHandler.java[BugzillaOfflineTaskHandler" matchStrategy="1" name="BugzillaTaskDataHandler" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1164558752093" textual="false" version="1.0"/>
+
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_PREFIX_BUG_218' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_PREFIX_BUG_218' - Keep original element as delegate to refactored element - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="true" deprecate="false" description="Move member 'FORM_PREFIX_BUG_218'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java[BugzillaReportSubmitForm^FORM_PREFIX_BUG_218" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1164570746765" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_PREFIX_BUG_220' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_PREFIX_BUG_220' - Keep original element as delegate to refactored element - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="true" deprecate="false" description="Move member 'FORM_PREFIX_BUG_220'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java[BugzillaReportSubmitForm^FORM_PREFIX_BUG_220" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1164570755625" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_POSTFIX_216' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_POSTFIX_216' - Keep original element as delegate to refactored element - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="true" deprecate="false" description="Move member 'FORM_POSTFIX_216'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java[BugzillaReportSubmitForm^FORM_POSTFIX_216" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1164570766812" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_POSTFIX_218' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.FORM_POSTFIX_218' - Keep original element as delegate to refactored element - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="true" deprecate="false" description="Move member 'FORM_POSTFIX_218'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java[BugzillaReportSubmitForm^FORM_POSTFIX_218" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1164570774265" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/BugzillaReportSubmitForm.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1164571054671" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1164571065593" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.QUERY_DELIMITER' from expression '"?"' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'QUERY_DELIMITER' - Constant expression: '"?"' - Declared visibility: 'private'" description="Extract constant 'QUERY_DELIMITER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="QUERY_DELIMITER" qualify="false" replace="false" selection="8612 3" stamp="1164846357743" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..f8345e9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1,8 @@
+1164558752093 Rename type 'BugzillaOfflineTaskHandler'
+1164570746765 Move member 'FORM_PREFIX_BUG_218'
+1164570755625 Move member 'FORM_PREFIX_BUG_220'
+1164570766812 Move member 'FORM_POSTFIX_216'
+1164570774265 Move member 'FORM_POSTFIX_218'
+1164571054671 Copy compilation unit
+1164571065593 Delete element
+1164846357743 Extract constant 'QUERY_DELIMITER'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..ec5d274
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryQuery.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.bugzilla.core" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaRepositoryQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462321750" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportElement.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.bugzilla.core" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportElement.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462350203" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.bugzilla.core" element1="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462365359" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.NewBugzillaReport' to 'NewBugzillaTaskData' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.NewBugzillaReport' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.NewBugzillaTaskData' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'NewBugzillaReport'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core{NewBugzillaReport.java[NewBugzillaReport" matchStrategy="1" name="NewBugzillaTaskData" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165462404968" textual="true" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original elements: org.eclipse.mylar.bugzilla.core.BugzillaReportElement.java org.eclipse.mylar.bugzilla.core.BugzillaRepositoryQuery.java org.eclipse.mylar.bugzilla.core.IBugzillaConstants.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.bugzilla.core" element1="/src<org.eclipse.mylar.bugzilla.core{BugzillaReportElement.java" element2="/src<org.eclipse.mylar.bugzilla.core{BugzillaRepositoryQuery.java" element3="/src<org.eclipse.mylar.bugzilla.core{IBugzillaConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462426828" units="3" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.core" element2="/src<org.eclipse.mylar.bugzilla" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165462434437" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..ebb79f8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,6 @@
+1165462321750 Move compilation unit
+1165462350203 Move compilation unit
+1165462365359 Move compilation unit
+1165462404968 Rename type 'NewBugzillaReport'
+1165462426828 Move compilation units
+1165462434437 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/50/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/50/refactorings.history
new file mode 100644
index 0000000..1281015
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.AbstractReportFactory.copyByteStream(...)' to 'copyAndCleanByteStream' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.AbstractReportFactory.copyByteStream(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.AbstractReportFactory.copyAndCleanByteStream(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'copyByteStream'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{AbstractReportFactory.java[AbstractReportFactory~copyByteStream~QInputStream;~QOutputStream;" name="copyAndCleanByteStream" references="true" stamp="1166128757671" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/50/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/50/refactorings.index
new file mode 100644
index 0000000..bbbe683
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/12/50/refactorings.index
@@ -0,0 +1 @@
+1166128757671 Rename method 'copyByteStream'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/7/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/7/refactorings.history
new file mode 100644
index 0000000..3b0eb43
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/7/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Extract local variable 'OLD_PREF_SERVER' from expression '"BUGZILLA_SERVER"'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java" name="OLD_PREF_SERVER" project="org.eclipse.mylar.bugzilla.core" replace="true" selection="4428 17" stamp="1140105385961"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/7/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/7/refactorings.index
new file mode 100644
index 0000000..2c84ea3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/7/refactorings.index
@@ -0,0 +1 @@
+1140105385961 Extract local variable 'OLD_PREF_SERVER' from expression '"BUGZILLA_SERVER"'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..1083435
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_NAME' from expression '"name"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.internal.bugzilla.core.internal{BugParser.java" name="KEY_NAME" project="org.eclipse.mylar.bugzilla.core" qualify="false" replace="true" selection="9948 6" stamp="1140641583126" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_VALUE' from expression '"value"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.internal.bugzilla.core.internal{BugParser.java" name="KEY_VALUE" project="org.eclipse.mylar.bugzilla.core" qualify="false" replace="true" selection="10093 7" stamp="1140641607942" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_RESOLUTION' from expression '"resolution"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.internal.bugzilla.core.internal{BugParser.java" name="KEY_RESOLUTION" project="org.eclipse.mylar.bugzilla.core" qualify="false" replace="true" selection="4345 12" stamp="1140642016049" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_BUG_NUM' from expression '"Bug#"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.internal.bugzilla.core.internal{BugParser.java" name="KEY_BUG_NUM" project="org.eclipse.mylar.bugzilla.core" qualify="false" replace="true" selection="3486 6" stamp="1140642329970" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..d55cbb6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1,4 @@
+1140641583126 Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_NAME' from expression '"name"'
+1140641607942 Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_VALUE' from expression '"value"'
+1140642016049 Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_RESOLUTION' from expression '"resolution"'
+1140642329970 Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.BugParser.KEY_BUG_NUM' from expression '"Bug#"'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/3/13/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/3/13/refactorings.history
new file mode 100644
index 0000000..85fca81
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/3/13/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Extract constant 'org.eclipse.mylar.bugzilla.core.BugReport.ATTR_ASSIGNED_TO' from expression '"Assigned To"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/bugzilla/core/BugReport.java" name="ATTR_ASSIGNED_TO" qualify="false" replace="true" selection="8850 13" stamp="1143846784417" version="1.0" visibility="2"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.bugzilla.core.BugReport.ATTR_RESOLUTION' from expression '"Resolution"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/bugzilla/core/BugReport.java" name="ATTR_RESOLUTION" qualify="false" replace="true" selection="9101 12" stamp="1143846798387" version="1.0" visibility="2"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.bugzilla.core.BugReport.ATTR_REPORTER' from expression '"Reporter"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/bugzilla/core/BugReport.java" name="ATTR_REPORTER" qualify="false" replace="true" selection="8774 10" stamp="1143846810805" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/3/13/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/3/13/refactorings.index
new file mode 100644
index 0000000..7bcfecd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/3/13/refactorings.index
@@ -0,0 +1,3 @@
+1143846784417 Extract constant 'org.eclipse.mylar.bugzilla.core.BugReport.ATTR_ASSIGNED_TO' from expression '"Assigned To"'
+1143846810805 Extract constant 'org.eclipse.mylar.bugzilla.core.BugReport.ATTR_REPORTER' from expression '"Reporter"'
+1143846798387 Extract constant 'org.eclipse.mylar.bugzilla.core.BugReport.ATTR_RESOLUTION' from expression '"Resolution"'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/4/17/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/4/17/refactorings.history
new file mode 100644
index 0000000..db057bf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/4/17/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.internal.ProductConfiguration' to 'RepositoryConfiguration' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.internal.ProductConfiguration' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.internal.RepositoryConfiguration' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'ProductConfiguration'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core.internal{ProductConfiguration.java[ProductConfiguration" matchStrategy="1" name="RepositoryConfiguration" qualified="false" references="true" similarDeclarations="true" stamp="1145928733333" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'bugzillaVersion' in 'org.eclipse.mylar.internal.bugzilla.core.internal.RepositoryConfiguration' to 'version' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.internal.RepositoryConfiguration.bugzillaVersion' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.internal.RepositoryConfiguration.version' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'bugzillaVersion'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core.internal{RepositoryConfiguration.java[RepositoryConfiguration^bugzillaVersion" name="version" references="true" setter="false" stamp="1145928787982" textual="false" version="1.0"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.RepositoryConfiguration.VERSION_UNKNOWN' from expression '"unknown"'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core.internal{RepositoryConfiguration.java" name="VERSION_UNKNOWN" qualify="false" replace="true" selection="1748 9" stamp="1145928799829" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/4/17/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/4/17/refactorings.index
new file mode 100644
index 0000000..9ace366
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/4/17/refactorings.index
@@ -0,0 +1,3 @@
+1145928733333 Rename type 'ProductConfiguration'
+1145928799829 Extract constant 'org.eclipse.mylar.internal.bugzilla.core.internal.RepositoryConfiguration.VERSION_UNKNOWN' from expression '"unknown"'
+1145928787982 Rename field 'bugzillaVersion'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/5/19/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/5/19/refactorings.history
new file mode 100644
index 0000000..11cd752
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/5/19/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.search.BugzillaSearchQuery.MESSAGE_LOGIN_FAILURE' from expression '"Bugzilla could not log you in to get the information you requested since login name or password is incorrect.\nPlease check your settings in the bugzilla preferences. "' - Constant name: 'MESSAGE_LOGIN_FAILURE' - Constant expression: '"Bugzilla could not log you in to get the information you requested since login name or password is incorrect.\nPlease check your settings in the bugzilla preferences. "' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MESSAGE_LOGIN_FAILURE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core.search{BugzillaSearchQuery.java" name="MESSAGE_LOGIN_FAILURE" qualify="false" replace="true" selection="3527 169" stamp="1147391479110" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.setURL(...)' to 'setConnectionsSettings' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.setURL(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaReportSubmitForm.setConnectionsSettings(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setURL'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaReportSubmitForm.java[BugzillaReportSubmitForm~setURL~QBugzillaReportSubmitForm;~QTaskRepository;~QString;" name="setConnectionsSettings" references="true" stamp="1147393024452" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.compare.BugzillaStructureCreator' to 'BugzillaCompareStructureCreator' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.compare.BugzillaStructureCreator' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.compare.BugzillaCompareStructureCreator' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'BugzillaStructureCreator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core.compare{BugzillaStructureCreator.java[BugzillaStructureCreator" matchStrategy="1" name="BugzillaCompareStructureCreator" qualified="false" references="true" similarDeclarations="true" stamp="1147462865172" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.bugzilla.core' to 'org.eclipse.mylar.provisional.bugzilla.core' - Original element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.bugzilla.core' - Renamed element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.provisional.bugzilla.core' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylar.bugzilla.core'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.bugzilla.core" name="org.eclipse.mylar.provisional.bugzilla.core" qualified="false" references="true" stamp="1147463137734" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.PLUGIN_ID' to 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.PLUGIN_ID' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin'" delegate="false" deprecate="true" description="Move member 'PLUGIN_ID'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^PLUGIN_ID" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin" stamp="1147465971299" version="1.0"/>
+<refactoring comment="Rename field 'ID' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin' to 'PLUGIN_ID' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.ID' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.PLUGIN_ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin^ID" name="PLUGIN_ID" references="true" setter="false" stamp="1147474458132" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/5/19/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/5/19/refactorings.index
new file mode 100644
index 0000000..cc8f531
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/5/19/refactorings.index
@@ -0,0 +1,6 @@
+1147391479110 Extract constant 'MESSAGE_LOGIN_FAILURE'
+1147474458132 Rename field 'ID'
+1147465971299 Move member 'PLUGIN_ID'
+1147463137734 Rename package 'org.eclipse.mylar.bugzilla.core'
+1147462865172 Rename type 'BugzillaStructureCreator'
+1147393024452 Rename method 'setURL'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/22/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/22/refactorings.history
new file mode 100644
index 0000000..6550bf0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.SaxBugReportContentHandler.makeNewAttribute(...)' to 'org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.SaxBugReportContentHandler.makeNewAttribute(...)' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil'" delegate="false" deprecate="true" description="Move member 'makeNewAttribute'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{SaxBugReportContentHandler.java[SaxBugReportContentHandler~makeNewAttribute~Qorg.eclipse.mylar.internal.bugzilla.core.BugzillaReportElement;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaRepositoryUtil.java[BugzillaRepositoryUtil" stamp="1149296147858" version="1.0"/>
+<refactoring comment="Use super type 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTaskData' instead of 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTaskData' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTaskData' - Super type: 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTaskData'" description="Use super type 'AbstractRepositoryTaskData'" element1="/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTaskData.java[AbstractRepositoryTaskData" flags="589830" id="org.eclipse.jdt.ui.use.supertype" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaTaskData.java[BugzillaTaskData" instanceof="false" stamp="1149298583230" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/22/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/22/refactorings.index
new file mode 100644
index 0000000..92eb189
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/22/refactorings.index
@@ -0,0 +1,2 @@
+1149296147858 Move member 'makeNewAttribute'
+1149298583230 Use super type 'AbstractRepositoryTaskData'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..a0d6676
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.TrustAllSSLProtocolSocketFactory' to 'TrustAllSslProtocolSocketFactory' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.TrustAllSSLProtocolSocketFactory' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.TrustAllSslProtocolSocketFactory' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TrustAllSSLProtocolSocketFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core{TrustAllSSLProtocolSocketFactory.java[TrustAllSSLProtocolSocketFactory" matchStrategy="1" name="TrustAllSslProtocolSocketFactory" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1151018694593" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.TrustAllSslProtocolSocketFactory.getSSLContext()' to 'getSslContext' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.TrustAllSslProtocolSocketFactory.getSSLContext()' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.TrustAllSslProtocolSocketFactory.getSslContext()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getSSLContext'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{TrustAllSslProtocolSocketFactory.java[TrustAllSslProtocolSocketFactory~getSSLContext" name="getSslContext" references="true" stamp="1151019226062" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..5beb2cc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1151018694593 Rename type 'TrustAllSSLProtocolSocketFactory'
+1151019226062 Rename method 'getSSLContext'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..bf7de7b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.ERROR_DELETING_CONFIGURATION' from expression '"Error removing corrupt repository configuration file."' - Constant name: 'ERROR_DELETING_CONFIGURATION' - Constant expression: '"Error removing corrupt repository configuration file."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ERROR_DELETING_CONFIGURATION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java" name="ERROR_DELETING_CONFIGURATION" qualify="false" replace="true" selection="5350 55" stamp="1152291953905" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..8017f26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1 @@
+1152291953905 Extract constant 'ERROR_DELETING_CONFIGURATION'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..149d00d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.AbstractReportFactory.ENCODING_GZIP' from expression '"gzip"' - Constant name: 'ENCODING_GZIP' - Constant expression: '"gzip"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ENCODING_GZIP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{AbstractReportFactory.java" name="ENCODING_GZIP" qualify="false" replace="true" selection="3141 6" stamp="1152646062953" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.setConfigurationLocation(...)' to 'setConfigurationCachFile' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.setConfigurationLocation(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.setConfigurationCachFile(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setConfigurationLocation'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin~setConfigurationLocation~QFile;" name="setConfigurationCachFile" references="true" stamp="1152831589906" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.setConfigurationCachFile(...)' to 'setConfigurationCacheFile' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.setConfigurationCachFile(...)' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.setConfigurationCacheFile(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setConfigurationCachFile'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin~setConfigurationCachFile~QFile;" name="setConfigurationCacheFile" references="true" stamp="1152831605296" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil' to 'BugzillaServerFacade' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaRepositoryUtil' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaRepositoryUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaRepositoryUtil.java[BugzillaRepositoryUtil" matchStrategy="1" name="BugzillaServerFacade" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152838055812" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..9b56996
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,4 @@
+1152646062953 Extract constant 'ENCODING_GZIP'
+1152838055812 Rename type 'BugzillaRepositoryUtil'
+1152831605296 Rename method 'setConfigurationCachFile'
+1152831589906 Rename method 'setConfigurationLocation'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..171d1ed
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.getUrlConnection(...)' to 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.getUrlConnection(...)' - Destination type: 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil'" delegate="false" deprecate="true" description="Move member 'getUrlConnection'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin~getUrlConnection~QURL;~QProxy;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{UrlConnectionUtil.java[UrlConnectionUtil" stamp="1153449354765" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..6825bfd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1 @@
+1153449354765 Move member 'getUrlConnection'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..ade8783
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 4 members to 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil' - Original elements: org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler.getSslPort(...) org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler.getRequestPath(...) org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler.repositoryUsesHttps(...) org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler.getDomain(...) - Destination type: 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaAttachmentHandler.java[BugzillaAttachmentHandler~getSslPort~QString;" element2="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaAttachmentHandler.java[BugzillaAttachmentHandler~getRequestPath~QString;" element3="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaAttachmentHandler.java[BugzillaAttachmentHandler~repositoryUsesHttps~QString;" element4="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaAttachmentHandler.java[BugzillaAttachmentHandler~getDomain~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{UrlConnectionUtil.java[UrlConnectionUtil" stamp="1154018787194" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..a65db28
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1 @@
+1154018787194 Move members
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..dd70843
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin' to 'BugzillaCorePlugin' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaCorePlugin' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin" matchStrategy="1" name="BugzillaCorePlugin" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154577914212" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'plugin' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin' to 'INSTANCE' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.plugin' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaPlugin.INSTANCE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'plugin'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaPlugin.java[BugzillaPlugin^plugin" name="INSTANCE" references="true" setter="false" stamp="1154577887352" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..078ebe0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1,2 @@
+1154577914212 Rename type 'BugzillaPlugin'
+1154577887352 Rename field 'plugin'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/32/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/32/refactorings.history
new file mode 100644
index 0000000..0827371
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/32/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler.CHANGES_SUBMITTED' from expression '"Changes Submitted"' - Constant name: 'CHANGES_SUBMITTED' - Constant expression: '"Changes Submitted"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CHANGES_SUBMITTED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaAttachmentHandler.java" name="CHANGES_SUBMITTED" qualify="false" replace="true" selection="8796 19" stamp="1155259430787" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaAttachmentHandler.CONNECT_TIMEOUT_5000' from expression '5000' - Constant name: 'CONNECT_TIMEOUT_5000' - Constant expression: '5000' - Declared visibility: 'private'" description="Extract constant 'CONNECT_TIMEOUT_5000'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaAttachmentHandler.java" name="CONNECT_TIMEOUT_5000" qualify="false" replace="false" selection="7074 4" stamp="1155259950849" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'ERROR_MIDAIR_COLLISION' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'ERROR_MSG_MIDAIR_COLLISION' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.ERROR_MIDAIR_COLLISION' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.ERROR_MSG_MIDAIR_COLLISION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ERROR_MIDAIR_COLLISION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^ERROR_MIDAIR_COLLISION" name="ERROR_MSG_MIDAIR_COLLISION" references="true" setter="false" stamp="1155403121343" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/32/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/32/refactorings.index
new file mode 100644
index 0000000..a64c1f5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/32/refactorings.index
@@ -0,0 +1,3 @@
+1155259430787 Extract constant 'CHANGES_SUBMITTED'
+1155259950849 Extract constant 'CONNECT_TIMEOUT_5000'
+1155403121343 Rename field 'ERROR_MIDAIR_COLLISION'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..b95679e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTaskData.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaTaskData.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1156468754718" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..8ef0e2e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1 @@
+1156468754718 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..ed9fea0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade.POST_ARGS_SHOW_BUG' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade.POST_ARGS_SHOW_BUG' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'POST_ARGS_SHOW_BUG'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaServerFacade.java[BugzillaServerFacade^POST_ARGS_SHOW_BUG" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1158972779828" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..5a7bee4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1 @@
+1158972779828 Move member 'POST_ARGS_SHOW_BUG'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/39/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/39/refactorings.history
new file mode 100644
index 0000000..3115d41
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/39/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade.POST_ARGS_PASSWORD' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade.POST_ARGS_PASSWORD' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'POST_ARGS_PASSWORD'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaServerFacade.java[BugzillaServerFacade^POST_ARGS_PASSWORD" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1159219312734" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade.POST_ARGS_LOGIN' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaServerFacade.POST_ARGS_LOGIN' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'POST_ARGS_LOGIN'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaServerFacade.java[BugzillaServerFacade^POST_ARGS_LOGIN" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1159219320750" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/39/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/39/refactorings.index
new file mode 100644
index 0000000..7ba6c36
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2006/9/39/refactorings.index
@@ -0,0 +1,2 @@
+1159219312734 Move member 'POST_ARGS_PASSWORD'
+1159219320750 Move member 'POST_ARGS_LOGIN'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/2/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/2/refactorings.history
new file mode 100644
index 0000000..50e82a8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/2/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.NewBugzillaTaskData.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{NewBugzillaTaskData.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/NewBugzillaTaskData.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1168284159171" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.NewBugzillaTaskData.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{NewBugzillaTaskData.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1168284266031" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.INVALID_CREDENTIALS' from expression '"Invalid credentials."' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'INVALID_CREDENTIALS' - Constant expression: '"Invalid credentials."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'INVALID_CREDENTIALS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="INVALID_CREDENTIALS" qualify="false" replace="true" selection="14839 22" stamp="1168479918703" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.INVALID_CREDENTIALS' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.INVALID_CREDENTIALS' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="false" description="Move member 'INVALID_CREDENTIALS'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^INVALID_CREDENTIALS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1168479960578" version="1.0"/>
+<refactoring comment="Extract method 'private void checkAuthenticated(CoreException e)' from 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.getTaskData()' to 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' - Original project: 'org.eclipse.mylar.bugzilla.core' - Method name: 'checkAuthenticated' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' - Declared visibility: 'private'" comments="false" description="Extract method 'checkAuthenticated'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="checkAuthenticated" replace="false" selection="18594 188" stamp="1168556117515" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.CHANGES_SUBMITTED' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.CHANGES_SUBMITTED' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="false" description="Move member 'CHANGES_SUBMITTED'" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^CHANGES_SUBMITTED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1168562060484" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaException.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaException.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/BugzillaException.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1168646641875" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaException.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaException.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1168646651734" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.PossibleBugzillaFailureException.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{PossibleBugzillaFailureException.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1168646719953" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.KeywordParser.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.core{KeywordParser.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/core/KeywordParser.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1168646781203" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.KeywordParser.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.core{KeywordParser.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1168646800843" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/2/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/2/refactorings.index
new file mode 100644
index 0000000..fba6449
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/2/refactorings.index
@@ -0,0 +1,11 @@
+1168284159171 Copy compilation unit
+1168284266031 Delete element
+1168479918703 Extract constant 'INVALID_CREDENTIALS'
+1168479960578 Move member 'INVALID_CREDENTIALS'
+1168556117515 Extract method 'checkAuthenticated'
+1168562060484 Move member 'CHANGES_SUBMITTED'
+1168646641875 Copy compilation unit
+1168646651734 Delete element
+1168646719953 Delete element
+1168646781203 Copy compilation unit
+1168646800843 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..26abd1b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'BugzillaClient.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/bugzilla/core/BugzillaClient.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169838912000" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'BugzillaRepositoryConnector.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/bugzilla/core/BugzillaRepositoryConnector.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169839041593" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'KeywordParser.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/bugzilla/core/KeywordParser.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169839095203" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'RepositoryReportFactory.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/bugzilla/core/RepositoryReportFactory.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169839503796" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..2e45179
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1,4 @@
+1169838912000 Delete element
+1169839041593 Delete element
+1169839095203 Delete element
+1169839503796 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/40/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/40/refactorings.history
new file mode 100644
index 0000000..4c29977
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.CONTENT_ENCODING_GZIP' from expression '"gzip"'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Constant name: 'CONTENT_ENCODING_GZIP'
- Constant expression: '"gzip"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'CONTENT_ENCODING_GZIP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java" name="CONTENT_ENCODING_GZIP" qualify="false" replace="true" selection="24649 6" stamp="1191519206343" version="1.0" visibility="2"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.CONTENT_ENCODING_GZIP' to 'org.eclipse.mylyn.web.core.WebClientUtil'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.CONTENT_ENCODING_GZIP'
- Destination type: 'org.eclipse.mylyn.web.core.WebClientUtil'" delegate="false" deprecate="false" description="Move member 'CONTENT_ENCODING_GZIP'" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java[BugzillaClient^CONTENT_ENCODING_GZIP" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.web.core/src<org.eclipse.mylyn.web.core{WebClientUtil.java[WebClientUtil" stamp="1191519261984" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/40/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/40/refactorings.index
new file mode 100644
index 0000000..9c18da2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/40/refactorings.index
@@ -0,0 +1,2 @@
+1191519206343 Extract constant 'CONTENT_ENCODING_GZIP'
+1191519261984 Move member 'CONTENT_ENCODING_GZIP'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/41/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/41/refactorings.history
new file mode 100644
index 0000000..0ab87b9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/41/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler.ATTRIBUTE_NAME' from expression '"name"'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Constant name: 'ATTRIBUTE_NAME'
- Constant expression: '"name"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ATTRIBUTE_NAME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.core{SaxMultiBugReportContentHandler.java" name="ATTRIBUTE_NAME" qualify="false" replace="true" selection="3604 6" stamp="1191814742281" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/41/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/41/refactorings.index
new file mode 100644
index 0000000..54b8dfc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/10/41/refactorings.index
@@ -0,0 +1 @@
+1191814742281 Extract constant 'ATTRIBUTE_NAME'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/12/49/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/12/49/refactorings.history
new file mode 100644
index 0000000..1195355
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/12/49/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector.DEFAULT_LANG' from expression '"en (default)"'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Constant name: 'DEFAULT_LANG'
- Constant expression: '"en (default)"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'DEFAULT_LANG'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaRepositoryConnector.java" name="DEFAULT_LANG" qualify="false" replace="true" selection="3200 14" stamp="1196818685985" version="1.0" visibility="2"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector.DEFAULT_LANG' to 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector.DEFAULT_LANG'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="false" description="Move member 'DEFAULT_LANG'" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector^DEFAULT_LANG" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1196818704580" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/12/49/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/12/49/refactorings.index
new file mode 100644
index 0000000..3489aee
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/12/49/refactorings.index
@@ -0,0 +1,2 @@
+1196818685985 Extract constant 'DEFAULT_LANG'
+1196818704580 Move member 'DEFAULT_LANG'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..5f7dc6b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTask.initFromHandle()' to 'initUrl' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTask.initFromHandle()' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTask.initUrl()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'initFromHandle'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaTask.java[BugzillaTask~initFromHandle" name="initUrl" references="true" stamp="1171078405523" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTask.initUrl()' to 'initTaskUrl' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTask.initUrl()' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaTask.initTaskUrl()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'initUrl'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaTask.java[BugzillaTask~initUrl" name="initTaskUrl" references="true" stamp="1171078409704" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..78528f9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,2 @@
+1171078405523 Rename method 'initFromHandle'
+1171078409704 Rename method 'initUrl'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..e1de1d1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 10 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core.activity' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core.activity' - Original elements: org.eclipse.mylar.tasks.core.activity.events.AttachmentFlagState.java org.eclipse.mylar.tasks.core.activity.events.ResolutionType.java org.eclipse.mylar.tasks.core.activity.events.TaskActivityEvent.java org.eclipse.mylar.tasks.core.activity.events.StatusType.java org.eclipse.mylar.tasks.core.activity.events.StatusEvent.java org.eclipse.mylar.tasks.core.activity.events.AttachmentEvent.java org.eclipse.mylar.tasks.core.activity.events.AttachmentFlagStatus.java org.eclipse.mylar.tasks.core.activity.events.AttachmentFlag.java org.eclipse.mylar.tasks.core.activity.events.AssignmentEvent.java org.eclipse.mylar.tasks.core.activity.events.ResolutionEvent.java - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.bugzilla.core.activity" element1="/src<org.eclipse.mylar.tasks.core.activity.events{AttachmentFlagState.java" element10="/src<org.eclipse.mylar.tasks.core.activity.events{ResolutionEvent.java" element2="/src<org.eclipse.mylar.tasks.core.activity.events{ResolutionType.java" element3="/src<org.eclipse.mylar.tasks.core.activity.events{TaskActivityEvent.java" element4="/src<org.eclipse.mylar.tasks.core.activity.events{StatusType.java" element5="/src<org.eclipse.mylar.tasks.core.activity.events{StatusEvent.java" element6="/src<org.eclipse.mylar.tasks.core.activity.events{AttachmentEvent.java" element7="/src<org.eclipse.mylar.tasks.core.activity.events{AttachmentFlagStatus.java" element8="/src<org.eclipse.mylar.tasks.core.activity.events{AttachmentFlag.java" element9="/src<org.eclipse.mylar.tasks.core.activity.events{AssignmentEvent.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1171328287937" units="10" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.tasks.core.activity.events'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.core.activity.events" element2="/src<org.eclipse.mylar.tasks.core.activity" element3="/src<org.eclipse.mylar.tasks.core" element4="/src<org.eclipse.mylar.tasks" elements="4" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1171328292000" subPackages="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.bugzilla.core.activity' to 'org.eclipse.mylar.internal.bugzilla.core.history' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core.activity' - Renamed element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core.history' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.bugzilla.core.activity'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.bugzilla.core.activity" name="org.eclipse.mylar.internal.bugzilla.core.history" patterns="*.xml" qualified="true" references="true" stamp="1171329980921" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.history.TaskActivity' to 'TaskHistory' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.history.TaskActivity' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.history.TaskHistory' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskActivity'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core.history{TaskActivity.java[TaskActivity" matchStrategy="1" name="TaskHistory" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1171330005500" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.history.TaskActivityEvent' to 'TaskRevision' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.history.TaskActivityEvent' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.history.TaskRevision' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskActivityEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core.history{TaskActivityEvent.java[TaskActivityEvent" matchStrategy="1" name="TaskRevision" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1171330173906" textual="true" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.core.history.BugzillaActivityParser.SHOW_ACTIVITY' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.history.BugzillaActivityParser.SHOW_ACTIVITY' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="false" description="Move member 'SHOW_ACTIVITY'" element1="/src<org.eclipse.mylar.internal.bugzilla.core.history{BugzillaActivityParser.java[BugzillaActivityParser^SHOW_ACTIVITY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1171339444484" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.core.history.BugzillaActivityParser' to 'BugzillaTaskHistoryParser' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.history.BugzillaActivityParser' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.history.BugzillaTaskHistoryParser' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaActivityParser'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.core.history{BugzillaActivityParser.java[BugzillaActivityParser" matchStrategy="1" name="BugzillaTaskHistoryParser" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1171349421703" textual="true" version="1.0"/>
+<refactoring comment="Extract method 'private void cleanQAContact(RepositoryTaskAttribute a)' from 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.getPairsForNew()' to 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' - Original project: 'org.eclipse.mylar.bugzilla.core' - Method name: 'cleanQAContact' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient' - Declared visibility: 'private'" comments="false" description="Extract method 'cleanQAContact'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="cleanQAContact" replace="false" selection="32888 364" stamp="1171654005062" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..f934f86
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1,8 @@
+1171328287937 Move compilation units
+1171328292000 Delete element
+1171329980921 Rename package 'org.eclipse.mylar.internal.bugzilla.core.activity'
+1171330005500 Rename type 'TaskActivity'
+1171330173906 Rename type 'TaskActivityEvent'
+1171339444484 Move member 'SHOW_ACTIVITY'
+1171349421703 Rename type 'BugzillaActivityParser'
+1171654005062 Extract method 'cleanQAContact'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..c5b2b6b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'BUGZILL_TASK_KIND' in 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' to 'BUGZILLA_TASK_KIND' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.BUGZILL_TASK_KIND' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants.BUGZILLA_TASK_KIND' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'BUGZILL_TASK_KIND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^BUGZILL_TASK_KIND" name="BUGZILLA_TASK_KIND" references="true" setter="false" stamp="1172004418421" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..2a5f360
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1 @@
+1172004418421 Rename field 'BUGZILL_TASK_KIND'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..a6ac2cf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'mySearchString' in 'org.eclipse.mylar.internal.bugzilla.core.BugzillaCorePlugin.setPlatformOptions(...)' to 'searchOSString' - Original project: 'org.eclipse.mylar.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaCorePlugin.setPlatformOptions(RepositoryTaskData).mySearchString' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.core.BugzillaCorePlugin.setPlatformOptions(RepositoryTaskData).searchOSString' - Update references to refactored element" description="Rename local variable 'mySearchString'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaCorePlugin.java" name="searchOSString" references="true" selection="8992 14" stamp="1180496939450" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..263b4a0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1 @@
+1180496939450 Rename local variable 'mySearchString'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/22/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/22/refactorings.history
new file mode 100644
index 0000000..15fc7bd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.core.BugzillaClient.MAX_RETRIEVED_PER_QUERY' from expression '100' - Original project: 'org.eclipse.mylar.bugzilla.core' - Constant name: 'MAX_RETRIEVED_PER_QUERY' - Constant expression: '100' - Declared visibility: 'private'" description="Extract constant 'MAX_RETRIEVED_PER_QUERY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.core{BugzillaClient.java" name="MAX_RETRIEVED_PER_QUERY" qualify="false" replace="false" selection="41109 3" stamp="1180726527843" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/22/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/22/refactorings.index
new file mode 100644
index 0000000..9449c80
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/22/refactorings.index
@@ -0,0 +1 @@
+1180726527843 Extract constant 'MAX_RETRIEVED_PER_QUERY'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..1c30ffb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira.core/src/org.eclipse.mylar.internal.jira.core.service.soap' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.jira.core/src/org.eclipse.mylar.internal.jira.core.service.soap' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.AttachmentPartSource.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.jira.core.service.soap" element1="/src<org.eclipse.mylar.internal.bugzilla.core{AttachmentPartSource.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.core{AttachmentPartSource.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180843463499" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.ui' - Original project: 'org.eclipse.mylar.bugzilla.core' - Destination element: 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.core.AttachmentPartSource.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.jira.ui" element1="/src<org.eclipse.mylar.internal.bugzilla.core{AttachmentPartSource.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.core{AttachmentPartSource.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180843478335" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..df5cfd9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1180843463499 Copy compilation unit
+1180843478335 Copy compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..99924ec
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.bugzilla.ide' - Original project: 'org.eclipse.mylyn.bugzilla.core' - Destination element: 'org.eclipse.mylyn.bugzilla.ide' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.bugzilla.ide" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181623193507" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.bugzilla.ide' - Original project: 'org.eclipse.mylyn.bugzilla.core' - Destination element: 'org.eclipse.mylyn.bugzilla.ide' - Original element: 'META-INF'" description="Copy folder" destination="=org.eclipse.mylyn.bugzilla.ide" element1="META-INF" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log="META-INF	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181623215434" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..8be0873
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1181623193507 Copy file
+1181623215434 Copy folder
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..4057e98
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/MylarMessages.properties' to 'BugzillaMessages.properties' - Original project: 'org.eclipse.mylyn.bugzilla.core' - Original element: 'MylarMessages.properties'" description="Rename resource 'MylarMessages.properties'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="src/org/eclipse/mylyn/internal/bugzilla/core/MylarMessages.properties" name="BugzillaMessages.properties" stamp="1182561185334" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.core.TasksMessages' to 'BugzillaMessages' - Original project: 'org.eclipse.mylyn.bugzilla.core' - Original element: 'org.eclipse.mylyn.internal.bugzilla.core.TasksMessages' - Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaMessages' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TasksMessages'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.core{TasksMessages.java[TasksMessages" matchStrategy="1" name="BugzillaMessages" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182561203793" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..6f75066
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1182561185334 Rename resource 'MylarMessages.properties'
+1182561203793 Rename type 'TasksMessages'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/8/32/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/8/32/refactorings.history
new file mode 100644
index 0000000..4342a42
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/8/32/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 2 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylyn.bugzilla.core' - Destination element: 'bugzilla' - Original elements: org.eclipse.mylyn.internal.bugzilla.core.SaxBugReportContentHandler.java org.eclipse.mylyn.internal.bugzilla.core.RepositoryReportFactory.java" description="Copy compilation units" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{SaxBugReportContentHandler.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.core{RepositoryReportFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugReportContentHandler.java	true	false src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryReportFactory.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1186712895796" target="/org.eclipse.mylyn/developer/src-old/bugzilla" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.bugzilla.core' - Original project: 'org.eclipse.mylyn.bugzilla.core' - Original elements: org.eclipse.mylyn.internal.bugzilla.core.RepositoryReportFactory.java org.eclipse.mylyn.internal.bugzilla.core.SaxBugReportContentHandler.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{SaxBugReportContentHandler.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.core{RepositoryReportFactory.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1186712911953" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/8/32/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/8/32/refactorings.index
new file mode 100644
index 0000000..183b3e2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2007/8/32/refactorings.index
@@ -0,0 +1,2 @@
+1186712895796 Copy compilation units
+1186712911953 Delete elements
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/12/51/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/12/51/refactorings.history
new file mode 100644
index 0000000..793368e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaAttribute.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttribute.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229379301964" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaClient.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229380619072" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaFlag.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlag.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229380689973" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaRepositoryConnector.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229380836204" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaTaskAttachmentHandler.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskAttachmentHandler.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229380886796" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'IBugzillaConstants.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229381305690" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'RepositoryConfiguration.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfiguration.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229381416589" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'SaxConfigurationContentHandler.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/SaxConfigurationContentHandler.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229381446630" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'XmlCleaner.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/XmlCleaner.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229381542875" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaMessages'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaMessages.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1229455743692" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaMessages.properties'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaMessages.properties" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229455750962" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/12/51/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/12/51/refactorings.index
new file mode 100644
index 0000000..547a6ce
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/12/51/refactorings.index
@@ -0,0 +1,11 @@
+1229379301964 Delete element
+1229380619072 Delete element
+1229380689973 Delete element
+1229380836204 Delete element
+1229380886796 Delete element
+1229381305690 Delete element
+1229381416589 Delete element
+1229381446630 Delete element
+1229381542875 Delete element
+1229455743692 Delete element
+1229455750962 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..18781a3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaClientManager.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientManager.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1207693314153" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'SaxMultiBugReportContentHandler.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1207693862538" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..e018104
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,2 @@
+1207693314153 Delete element
+1207693862538 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..f0b9401
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Change method 'private void org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.addOperation(RepositoryConfiguration config, RepositoryTaskData bugReport, BUGZILLA_OPERATION opcode, String userName)' to 'private void addOperation(RepositoryTaskData bugReport, BUGZILLA_OPERATION opcode)'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.addOperation(...)'
- Removed parameters:
 RepositoryConfiguration config
 String userName" delegate="false" deprecate="true" description="Change method 'addOperation'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~addOperation~QRepositoryConfiguration;~QRepositoryTaskData;~QBUGZILLA_OPERATION;~QString;" name="addOperation" parameter1="RepositoryConfiguration config 0 {deleted} {deleted} true" parameter2="RepositoryTaskData bugReport 1 RepositoryTaskData bugReport false" parameter3="BUGZILLA_OPERATION opcode 2 BUGZILLA_OPERATION opcode false" parameter4="String userName 3 {deleted} {deleted} true" stamp="1208149470989" version="1.0"/>
<refactoring comment="Extract local variable 'responseBodyAsStream' from expression 'WebUtil.getResponseBodyAsStream(method,monitor)'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Variable name: 'responseBodyAsStream'
- Destination method: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.getHistory()'
- Variable expression: 'WebUtil.getResponseBodyAsStream(method,monitor)'
- Replace occurrences of expression with variable" description="Extract local variable 'responseBodyAsStream'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java" name="responseBodyAsStream" replace="true" selection="45044 48" stamp="1208386302499" version="1.0"/>
<refactoring comment="Extract local variable 'responseBodyAsStream' from expression 'WebUtil.getResponseBodyAsStream(method,monitor)'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Variable name: 'responseBodyAsStream'
- Destination method: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.logout()'
- Variable expression: 'WebUtil.getResponseBodyAsStream(method,monitor)'
- Replace occurrences of expression with variable" description="Extract local variable 'responseBodyAsStream'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java" name="responseBodyAsStream" replace="true" selection="11720 48" stamp="1208386490957" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..364faee
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,3 @@
+1208149470989 Change method 'addOperation'
+1208386302499 Extract local variable 'responseBodyAsStream'
+1208386490957 Extract local variable 'responseBodyAsStream'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..7948299
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.core.StackTraceDuplicateDetector' to 'BugzillaStackTraceDuplicateDetector'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.StackTraceDuplicateDetector'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaStackTraceDuplicateDetector'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'StackTraceDuplicateDetector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.core{StackTraceDuplicateDetector.java[StackTraceDuplicateDetector" matchStrategy="1" name="BugzillaStackTraceDuplicateDetector" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1210734328587" textual="false" version="1.0"/>
<refactoring comment="Rename field 'REPOSITORY_KIND' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin' to 'CONNECTOR_KIND'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.REPOSITORY_KIND'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.CONNECTOR_KIND'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_KIND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaCorePlugin.java[BugzillaCorePlugin^REPOSITORY_KIND" name="CONNECTOR_KIND" references="true" setter="false" stamp="1210971188860" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'BugzillaRepositoryConnector.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1210973071627" subPackages="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement.getKeyString()' to 'getKey'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement.getKeyString()'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement.getKey()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getKeyString'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaReportElement.java[BugzillaReportElement~getKeyString" name="getKey" references="true" stamp="1210976615822" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..a938be5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,4 @@
+1210734328587 Rename type 'StackTraceDuplicateDetector'
+1210971188860 Rename field 'REPOSITORY_KIND'
+1210973071627 Delete element
+1210976615822 Rename method 'getKeyString'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..c044db0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataColector.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaTaskDataColector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211318360569" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataCollector.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaTaskDataCollector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211340231944" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..a5b057f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1211318360569 Delete element
+1211340231944 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..cb8f332
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'WARNING_CONFIGURATION_WRONG_VERSION' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin' to 'ERROR_INCOMPATIBLE_CONFIGURATION'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.WARNING_CONFIGURATION_WRONG_VERSION'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.ERROR_INCOMPATIBLE_CONFIGURATION'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'WARNING_CONFIGURATION_WRONG_VERSION'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaCorePlugin.java[BugzillaCorePlugin^WARNING_CONFIGURATION_WRONG_VERSION" name="ERROR_INCOMPATIBLE_CONFIGURATION" references="true" setter="false" stamp="1211739281213" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttachmentHandler' to 'BugzillaTaskAttachmentHandler'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttachmentHandler'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskAttachmentHandler'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaAttachmentHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaAttachmentHandler.java[BugzillaAttachmentHandler" matchStrategy="1" name="BugzillaTaskAttachmentHandler" qualified="false" references="true" similarDeclarations="false" stamp="1211860142992" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttachmentHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaAttachmentHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211860262392" subPackages="false" version="1.0"/>
<refactoring comment="Rename local variable 'fieldName' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement.BugzillaReportElement(...)' to 'idKey'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement.BugzillaReportElement(String, String, String, boolean, boolean).fieldName'
- Renamed element: 'fieldName'
- Update references to refactored element" description="Rename local variable 'fieldName'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaReportElement.java[BugzillaReportElement~BugzillaReportElement~QString;~QString;~QString;~Z~Z at fieldName!7155!7170!7162!7170!QString;" name="idKey" references="true" stamp="1211923497968" version="1.0"/>
<refactoring comment="Rename field 'EDITOR_TYPE_CC' in 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants' to 'EDITOR_TYPE_REMOVECC'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.EDITOR_TYPE_CC'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.EDITOR_TYPE_REMOVECC'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'EDITOR_TYPE_CC'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^EDITOR_TYPE_CC" name="EDITOR_TYPE_REMOVECC" references="true" setter="false" stamp="1211932059485" textual="false" version="1.0"/>
<refactoring comment="Rename field 'ATTRIBUTE_LAST_READ_DATE' in 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants' to 'KEY_LAST_READ_DATE'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.ATTRIBUTE_LAST_READ_DATE'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.KEY_LAST_READ_DATE'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ATTRIBUTE_LAST_READ_DATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants^ATTRIBUTE_LAST_READ_DATE" name="KEY_LAST_READ_DATE" references="true" setter="false" stamp="1212180300200" textual="false" version="1.0"/>
<refactoring comment="Extract method 'private void updateExtendedAttributes(ITask task,TaskData taskData)' from 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector.updateTaskFromTaskData()' to 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Method name: 'updateExtendedAttributes'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateExtendedAttributes'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaRepositoryConnector.java" name="updateExtendedAttributes" replace="false" selection="7524 370" stamp="1212182318802" version="1.0" visibility="2"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement' to 'BugzillaAttribute'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaReportElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaReportElement.java[BugzillaReportElement" matchStrategy="1" name="BugzillaAttribute" qualified="false" references="true" similarDeclarations="false" stamp="1212183524359" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BUGZILLA_OPERATION' to 'BugzillaOperation'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BUGZILLA_OPERATION'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BugzillaOperation'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BUGZILLA_OPERATION'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants[BUGZILLA_OPERATION" matchStrategy="1" name="BugzillaOperation" qualified="false" references="true" similarDeclarations="false" stamp="1212183778730" textual="false" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BugzillaOperation' in 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants' to top level type
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BugzillaOperation'
- Field name: 'bugzillaConstants'
- Declare field 'final'" description="Convert member type 'BugzillaOperation' to top level" field="false" fieldName="bugzillaConstants" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants[BugzillaOperation" mandatory="false" possible="false" stamp="1212183815102" version="1.0"/>
<refactoring comment="Rename field 'type' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation' to 'inputType'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation.type'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation.inputType'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'type'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaOperation.java[BugzillaOperation^type" name="inputType" references="true" setter="false" stamp="1212183932415" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation.getType()' to 'getInputType'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation.getType()'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation.getInputType()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getType'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaOperation.java[BugzillaOperation~getType" name="getInputType" references="true" stamp="1212183972225" version="1.0"/>
<refactoring comment="Extract method 'private void addCommentsAndDescription()' from 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler.endElement()' to 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Method name: 'addCommentsAndDescription'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler'
- Declared visibility: 'private'" comments="false" description="Extract method 'addCommentsAndDescription'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{SaxMultiBugReportContentHandler.java" name="addCommentsAndDescription" replace="false" selection="9252 1824" stamp="1212190531807" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler.addCommentsAndDescription()' to 'addDescriptionAndComments'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler.addCommentsAndDescription()'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler.addDescriptionAndComments()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addCommentsAndDescription'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{SaxMultiBugReportContentHandler.java[SaxMultiBugReportContentHandler~addCommentsAndDescription" name="addDescriptionAndComments" references="true" stamp="1212191338766" version="1.0"/>
<refactoring comment="Extract method 'private void updateAttachmentMetaData()' from 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler.endElement()' to 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Method name: 'updateAttachmentMetaData'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.SaxMultiBugReportContentHandler'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateAttachmentMetaData'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{SaxMultiBugReportContentHandler.java" name="updateAttachmentMetaData" replace="false" selection="9687 818" stamp="1212191402085" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..498d5ee
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,15 @@
+1211739281213 Rename field 'WARNING_CONFIGURATION_WRONG_VERSION'
+1211860142992 Rename type 'BugzillaAttachmentHandler'
+1211860262392 Delete element
+1211923497968 Rename local variable 'fieldName'
+1211932059485 Rename field 'EDITOR_TYPE_CC'
+1212180300200 Rename field 'ATTRIBUTE_LAST_READ_DATE'
+1212182318802 Extract method 'updateExtendedAttributes'
+1212183524359 Rename type 'BugzillaReportElement'
+1212183778730 Rename type 'BUGZILLA_OPERATION'
+1212183815102 Convert member type 'BugzillaOperation' to top level
+1212183932415 Rename field 'type'
+1212183972225 Rename method 'getType'
+1212190531807 Extract method 'addCommentsAndDescription'
+1212191338766 Rename method 'addCommentsAndDescription'
+1212191402085 Extract method 'updateAttachmentMetaData'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..d40c06f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler.TaskDataVersion.upgrade(...)' to 'migrate'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler.TaskDataVersion.upgrade(...)'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler.TaskDataVersion.migrate(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'upgrade'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaTaskDataHandler.java[BugzillaTaskDataHandler[TaskDataVersion~upgrade~QTaskData;" name="migrate" references="true" stamp="1212455609477" version="1.0"/>
<refactoring comment="Change method 'void org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler.TaskDataVersion.migrate(TaskData data)' to 'void migrate(TaskRepository repository, TaskData data)'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler.TaskDataVersion.migrate(...)'
- Added parameters:
 TaskRepository repository" default1="null" delegate="false" deprecate="true" description="Change method 'migrate'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaTaskDataHandler.java[BugzillaTaskDataHandler[TaskDataVersion~migrate~QTaskData;" name="migrate" parameter1="{added} {added} -1 TaskRepository repository false" parameter2="TaskData data 0 TaskData data false" stamp="1212455897010" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..4ffac09
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1212455609477 Rename method 'upgrade'
+1212455897010 Change method 'migrate'
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..3ed0494
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin' to 'ID_PLUGIn'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.ID_PLUGIn'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaCorePlugin.java[BugzillaCorePlugin^PLUGIN_ID" name="ID_PLUGIn" references="true" setter="true" stamp="1213246210733" textual="false" version="1.0"/>
<refactoring comment="Rename field 'ID_PLUGIn' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.ID_PLUGIn'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_PLUGIn'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaCorePlugin.java[BugzillaCorePlugin^ID_PLUGIn" name="ID_PLUGIN" references="true" setter="true" stamp="1213246218543" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttributeFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaAttributeFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213374284546" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.AttachmentPartSource.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{AttachmentPartSource.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213374842476" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.AttachmentPartSource.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{AttachmentPartSource.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213374849423" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaStackTraceDuplicateDetector.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaStackTraceDuplicateDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213375027508" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaStackTraceDuplicateDetector.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaStackTraceDuplicateDetector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213375064627" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaTask.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213385142296" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryQuery.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaRepositoryQuery.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213386115494" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaTask.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213386786300" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryQuery.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaRepositoryQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213386854387" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaComment.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaComment.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213389649619" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaComment.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaComment.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213389687097" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..9b5745a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,13 @@
+1213246210733 Rename field 'PLUGIN_ID'
+1213246218543 Rename field 'ID_PLUGIn'
+1213374284546 Move compilation unit
+1213374842476 Copy compilation unit
+1213374849423 Delete element
+1213375027508 Copy compilation unit
+1213375064627 Delete element
+1213385142296 Delete element
+1213386115494 Delete element
+1213386786300 Move compilation unit
+1213386854387 Move compilation unit
+1213389649619 Delete element
+1213389687097 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..f4f80d4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.KeywordParser.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{KeywordParser.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221038911575" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..64fbe0d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1 @@
+1221038911575 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2009/2/6/refactorings.history b/org.eclipse.mylyn.bugzilla.core/.refactorings/2009/2/6/refactorings.history
new file mode 100644
index 0000000..b6872eb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2009/2/6/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.getGroupSecurityInformation(...)' to 'getHtmlOnlyInformation'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.getGroupSecurityInformation(...)'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.getHtmlOnlyInformation(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getGroupSecurityInformation'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~getGroupSecurityInformation~QTaskData;~QIProgressMonitor;" name="getHtmlOnlyInformation" references="true" stamp="1233871586564" version="1.0"/>
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.HtmlInformation.token' in 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.HtmlInformation'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.HtmlInformation.token'
- Getter method name: 'getToken'
- Setter method name: 'setToken'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'token'" flags="589830" getter="getToken" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java[BugzillaClient[HtmlInformation^token" insertion="1" setter="setToken" stamp="1233874608909" version="1.0" visibility="1"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.authenticate(...)' to 'login'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.authenticate(...)'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.login(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'authenticate'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~authenticate~QIProgressMonitor;" name="login" references="true" stamp="1233963345955" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.bugzilla.core" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1233965212293" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233965404432" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.core.CopyOfBugzillaClient' to 'BugzillaClient'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.CopyOfBugzillaClient'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'CopyOfBugzillaClient'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.core{CopyOfBugzillaClient.java[CopyOfBugzillaClient" matchStrategy="1" name="BugzillaClient" qualified="false" references="true" similarDeclarations="false" stamp="1233965419784" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.login(...)' to 'authenticate'
- Original project: 'org.eclipse.mylyn.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.login(...)'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient.authenticate(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'login'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.core{BugzillaClient.java[BugzillaClient~login~QIProgressMonitor;" name="authenticate" references="true" stamp="1233971260332" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/.refactorings/2009/2/6/refactorings.index b/org.eclipse.mylyn.bugzilla.core/.refactorings/2009/2/6/refactorings.index
new file mode 100644
index 0000000..b09b0fa
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.refactorings/2009/2/6/refactorings.index
@@ -0,0 +1,7 @@
+1233871586564 Rename method 'getGroupSecurityInformation'
+1233874608909 Encapsulate field 'token'
+1233963345955 Rename method 'authenticate'
+1233965212293 Copy compilation unit
+1233965404432 Delete element
+1233965419784 Rename type 'CopyOfBugzillaClient'
+1233971260332 Rename method 'login'
diff --git a/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.bugzilla.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.bugzilla.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2c1aa2c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.bugzilla.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.core.net
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Bundle-ClassPath: .
+Export-Package: org.eclipse.mylyn.internal.bugzilla.core;x-friends:="org.eclipse.mylyn.bugzilla.ide,org.eclipse.mylyn.bugzilla.ui",
+ org.eclipse.mylyn.internal.bugzilla.core.history;x-friends:="org.eclipse.mylyn.bugzilla.ide,org.eclipse.mylyn.bugzilla.ui"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.bugzilla.core/about.html b/org.eclipse.mylyn.bugzilla.core/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/build-user.xml b/org.eclipse.mylyn.bugzilla.core/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/build.properties b/org.eclipse.mylyn.bugzilla.core/build.properties
new file mode 100644
index 0000000..0130a60
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = META-INF/,\
+ about.html,\
+ .,\
+ plugin.xml,\
+ plugin.properties
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.bugzilla.core/plugin.properties b/org.eclipse.mylyn.bugzilla.core/plugin.properties
new file mode 100644
index 0000000..5af8dbf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.bugzilla.core
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Bugzilla Connector Core
diff --git a/org.eclipse.mylyn.bugzilla.core/plugin.xml b/org.eclipse.mylyn.bugzilla.core/plugin.xml
new file mode 100644
index 0000000..a60c3b2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/plugin.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="languages" name="languages" schema="schema/languages.exsd"/>
+<!--<extension
+ point="org.eclipse.mylyn.tasks.ui.duplicateDetectors">
+ <detector
+ class="org.eclipse.mylyn.internal.bugzilla.core.BugzillaStackTraceDuplicateDetector"
+ kind="bugzilla"
+ name="Stack Trace">
+ </detector>
+ </extension>-->
+</plugin>
diff --git a/org.eclipse.mylyn.bugzilla.core/schema/languages.exsd b/org.eclipse.mylyn.bugzilla.core/schema/languages.exsd
new file mode 100644
index 0000000..d175012
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/schema/languages.exsd
@@ -0,0 +1,116 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.bugzilla.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.bugzilla.core" id="languages" name="languages"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="language" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="language">
+ <complexType>
+ <sequence>
+ <element ref="languageAttribute" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="languageAttribute">
+ <complexType>
+ <attribute name="command" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="response" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java
new file mode 100644
index 0000000..d20c4f4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/AbstractReportFactory.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.security.GeneralSecurityException;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Rob Elves
+ */
+public class AbstractReportFactory {
+
+ public static final int RETURN_ALL_HITS = -1;
+
+ private final InputStream inStream;
+
+ private final String characterEncoding;
+
+ public AbstractReportFactory(InputStream inStream, String encoding) {
+ this.inStream = inStream;
+ this.characterEncoding = encoding;
+ }
+
+ /**
+ * expects rdf returned from repository (ctype=rdf in url)
+ *
+ * @throws GeneralSecurityException
+ */
+ protected void collectResults(DefaultHandler contentHandler, boolean clean) throws IOException {
+ File tempFile = null;
+
+ if (inStream == null) {
+ return;
+ }
+
+ final BufferedInputStream is = new BufferedInputStream(inStream, 1024);
+
+ InputStream iis = new InputStream() {
+ @SuppressWarnings( { "restriction" })
+ @Override
+ public int read() throws IOException {
+ int c;
+ while ((c = is.read()) != -1) {
+ if (org.eclipse.mylyn.internal.commons.core.XmlStringConverter.isValid((char) c)) {
+ return c;
+ }
+ }
+ return -1;
+ }
+ };
+
+ Reader in;
+ if (characterEncoding != null) {
+ in = new InputStreamReader(iis, characterEncoding);
+ } else {
+ in = new InputStreamReader(iis);
+ }
+
+ if (clean) {
+ tempFile = File.createTempFile("XmlCleaner-", "tmp"); //$NON-NLS-1$//$NON-NLS-2$
+ tempFile.deleteOnExit();
+ in = XmlCleaner.clean(in, tempFile);
+ }
+
+ try {
+ final XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setFeature("http://xml.org/sax/features/validation", false); //$NON-NLS-1$
+ reader.setContentHandler(contentHandler);
+
+ EntityResolver resolver = new EntityResolver() {
+
+ public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+ // The default resolver will try to resolve the dtd via
+ // URLConnection. Since we
+ // don't have need of entity resolving
+ // currently, we just supply a dummy (empty) resource for
+ // each request...
+ InputSource source = new InputSource();
+ source.setCharacterStream(new StringReader("")); //$NON-NLS-1$
+ return source;
+ }
+ };
+
+ reader.setEntityResolver(resolver);
+ reader.setErrorHandler(new ErrorHandler() {
+
+ public void error(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ public void fatalError(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ public void warning(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+ });
+ reader.parse(new InputSource(in));
+ } catch (SAXException e) {
+ throw new IOException(e.getMessage());
+ }
+
+ finally {
+ if (tempFile != null) {
+ tempFile.delete();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttachmentMapper.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttachmentMapper.java
new file mode 100644
index 0000000..ea607d4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttachmentMapper.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaAttachmentMapper extends TaskAttachmentMapper {
+ private String token;
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ @Override
+ public void applyTo(TaskAttribute taskAttribute) {
+ // ignore
+ super.applyTo(taskAttribute);
+
+ Assert.isNotNull(taskAttribute);
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskAttributeMapper mapper = taskData.getAttributeMapper();
+
+ if (getToken() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(BugzillaAttribute.TOKEN.getKey());
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ mapper.setValue(child, getToken());
+ }
+
+ }
+
+ public static BugzillaAttachmentMapper createFrom(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskAttributeMapper mapper = taskAttribute.getTaskData().getAttributeMapper();
+ BugzillaAttachmentMapper attachment = new BugzillaAttachmentMapper();
+ attachment.setAttachmentId(mapper.getValue(taskAttribute));
+ TaskAttribute child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_AUTHOR);
+ if (child != null) {
+ attachment.setAuthor(mapper.getRepositoryPerson(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_CONTENT_TYPE);
+ if (child != null) {
+ attachment.setContentType(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_DATE);
+ if (child != null) {
+ attachment.setCreationDate(mapper.getDateValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_DESCRIPTION);
+ if (child != null) {
+ attachment.setDescription(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_FILENAME);
+ if (child != null) {
+ attachment.setFileName(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ if (child != null) {
+ attachment.setDeprecated(mapper.getBooleanValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_PATCH);
+ if (child != null) {
+ attachment.setPatch(mapper.getBooleanValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_SIZE);
+ if (child != null) {
+ Long value = mapper.getLongValue(child);
+ if (value != null) {
+ attachment.setLength(value);
+ }
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_URL);
+ if (child != null) {
+ attachment.setUrl(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(BugzillaAttribute.TOKEN.getKey());
+ if (child != null) {
+ attachment.setToken(mapper.getValue(child));
+ }
+ return attachment;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttribute.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttribute.java
new file mode 100644
index 0000000..62275a8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttribute.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Rob Elves
+ */
+public enum BugzillaAttribute {
+
+ STATUS_WHITEBOARD(Messages.BugzillaAttribute_Status_Whiteboard,
+ "status_whiteboard", TaskAttribute.TYPE_LONG_RICH_TEXT, false, false), //$NON-NLS-1$
+
+ ACTUAL_TIME(Messages.BugzillaAttribute_Worked, "actual_time", TaskAttribute.TYPE_SHORT_TEXT, true, true), //$NON-NLS-1$
+
+ ADD_COMMENT(Messages.BugzillaAttribute_Additional_Comments, "comment", TaskAttribute.TYPE_LONG_TEXT, true, false), //$NON-NLS-1$
+
+ ASSIGNED_TO(Messages.BugzillaAttribute_Assigned_to, "assigned_to", TaskAttribute.TYPE_PERSON, true, true), //$NON-NLS-1$
+
+ ASSIGNED_TO_NAME(Messages.BugzillaAttribute_Assigned_to_NAME,
+ "assigned_to_name", TaskAttribute.TYPE_PERSON, true, true), //$NON-NLS-1$
+
+ ATTACHID(Messages.BugzillaAttribute_ATTACH_ID, "attachid", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ ATTACHMENT(Messages.BugzillaAttribute_attachment, "attachment", TaskAttribute.TYPE_ATTACHMENT, false, false), //$NON-NLS-1$
+
+ BLOCKED(Messages.BugzillaAttribute_Blocks, "blocked", TaskAttribute.TYPE_TASK_DEPENDENCY, false, false), //$NON-NLS-1$
+
+ BUG(Messages.BugzillaAttribute_bug, "bug", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ BUG_FILE_LOC(Messages.BugzillaAttribute_URL, "bug_file_loc", TaskAttribute.TYPE_URL, false, false), //$NON-NLS-1$
+
+ BUG_ID(Messages.BugzillaAttribute_Bug_ID, "bug_id", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ BUG_SEVERITY(Messages.BugzillaAttribute_Severity, "bug_severity", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ BUG_STATUS(Messages.BugzillaAttribute_Status, "bug_status", TaskAttribute.TYPE_SHORT_TEXT, true, true), //$NON-NLS-1$
+
+ BUG_WHEN(Messages.BugzillaAttribute_bug_when, "bug_when", TaskAttribute.TYPE_DATE, true, true), //$NON-NLS-1$
+
+ BUGZILLA(Messages.BugzillaAttribute_bugzilla, "bugzilla", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ CC(Messages.BugzillaAttribute_CC, "cc", IBugzillaConstants.EDITOR_TYPE_REMOVECC, true, true), //$NON-NLS-1$
+
+ REMOVECC(Messages.BugzillaAttribute_Remove_CC, "removecc", IBugzillaConstants.EDITOR_TYPE_REMOVECC, true, true), //$NON-NLS-1$
+
+ CCLIST_ACCESSIBLE(Messages.BugzillaAttribute_CC_List, "cclist_accessible", TaskAttribute.TYPE_BOOLEAN, true, false), //$NON-NLS-1$
+
+ CLASSIFICATION(Messages.BugzillaAttribute_Classification,
+ "classification", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ CLASSIFICATION_ID(Messages.BugzillaAttribute_Classification_ID,
+ "classification_id", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ COMPONENT(Messages.BugzillaAttribute_Component, "component", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ CONFIRM_PRODUCT_CHANGE("confirm_product_change", "confirm_product_change", TaskAttribute.TYPE_BOOLEAN, true, false), //$NON-NLS-1$ //$NON-NLS-2$
+
+ CREATION_TS(Messages.BugzillaAttribute_Opened, "creation_ts", TaskAttribute.TYPE_DATE, true, false), //$NON-NLS-1$
+
+ CTYPE(Messages.BugzillaAttribute_Content_Type, "ctype", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ DATA(Messages.BugzillaAttribute_data, "data", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ DATE(Messages.BugzillaAttribute_Date, "date", TaskAttribute.TYPE_DATE, false, false), //$NON-NLS-1$
+
+ DEADLINE(Messages.BugzillaAttribute_Due, "deadline", TaskAttribute.TYPE_DATE, true, false), //$NON-NLS-1$
+
+ DELTA_TS(Messages.BugzillaAttribute_Modified, "delta_ts", TaskAttribute.TYPE_DATE, true, false), //$NON-NLS-1$
+
+ DEPENDSON(Messages.BugzillaAttribute_Depends_on__Subtasks_,
+ "dependson", TaskAttribute.TYPE_TASK_DEPENDENCY, false, false), //$NON-NLS-1$
+
+ DESC(Messages.BugzillaAttribute_desc, "desc", TaskAttribute.TYPE_LONG_TEXT, true, true), //$NON-NLS-1$
+
+ EVERCONFIRMED(Messages.BugzillaAttribute_everconfirmed, "everconfirmed", TaskAttribute.TYPE_BOOLEAN, true, false), //$NON-NLS-1$
+
+ ESTIMATED_TIME(Messages.BugzillaAttribute_Estimated_Time,
+ "estimated_time", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ FILENAME(Messages.BugzillaAttribute_filename, "filename", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ FLAG(Messages.BugzillaAttribute_flag, "flag", IBugzillaConstants.EDITOR_TYPE_FLAG, false, false), //$NON-NLS-1$
+
+ GROUP(Messages.BugzillaAttribute_Group, "group", TaskAttribute.TYPE_BOOLEAN, true, true), //$NON-NLS-1$
+
+ IS_OBSOLETE(Messages.BugzillaAttribute_Obsolete, "isobsolete", TaskAttribute.TYPE_BOOLEAN, true, false), //$NON-NLS-1$
+
+ IS_PATCH(Messages.BugzillaAttribute_Patch, "ispatch", TaskAttribute.TYPE_BOOLEAN, true, false), //$NON-NLS-1$
+
+ KEYWORDS(Messages.BugzillaAttribute_Keywords, "keywords", IBugzillaConstants.EDITOR_TYPE_KEYWORDS, false, false), //$NON-NLS-1$
+
+ LONG_DESC(Messages.BugzillaAttribute_Description, "long_desc", TaskAttribute.TYPE_LONG_RICH_TEXT, true, true), //$NON-NLS-1$
+
+ LONGDESCLENGTH(Messages.BugzillaAttribute_Number_of_comments,
+ "longdesclength", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ NEWCC(Messages.BugzillaAttribute_Add_CC, "newcc", TaskAttribute.TYPE_PERSON, true, false), //$NON-NLS-1$
+
+ OP_SYS(Messages.BugzillaAttribute_OS, "op_sys", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ PRIORITY(Messages.BugzillaAttribute_Priority, "priority", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ PRODUCT(Messages.BugzillaAttribute_Product, "product", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ REP_PLATFORM(Messages.BugzillaAttribute_Platform, "rep_platform", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ REPORTER(Messages.BugzillaAttribute_Reporter, "reporter", TaskAttribute.TYPE_PERSON, true, true), //$NON-NLS-1$
+
+ REPORTER_NAME(Messages.BugzillaAttribute_REPORT_NAME, "reporter_name", TaskAttribute.TYPE_PERSON, true, true), //$NON-NLS-1$
+
+ REPORTER_ACCESSIBLE(Messages.BugzillaAttribute_REPORT_ACCESSIBLE, "reporter_accessible", //$NON-NLS-1$
+ TaskAttribute.TYPE_BOOLEAN, true, false),
+
+ RESOLUTION(Messages.BugzillaAttribute_Resolution, "resolution", TaskAttribute.TYPE_SHORT_TEXT, false, true), //$NON-NLS-1$
+
+ REMAINING_TIME(Messages.BugzillaAttribute_Remaining, "remaining_time", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ SET_DEFAULT_ASSIGNEE(Messages.BugzillaAttribute_Reassign_to_default_assignee,
+ "set_default_assignee", TaskAttribute.TYPE_BOOLEAN, true, //$NON-NLS-1$
+ false),
+
+ SHORT_DESC(Messages.BugzillaAttribute_Summary, "short_desc", TaskAttribute.TYPE_SHORT_RICH_TEXT, true, false), //$NON-NLS-1$
+
+ SIZE(Messages.BugzillaAttribute_Size, "size", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ TARGET_MILESTONE(Messages.BugzillaAttribute_Target_milestone,
+ "target_milestone", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ THETEXT(Messages.BugzillaAttribute_thetext, "thetext", TaskAttribute.TYPE_SHORT_TEXT, false, true), //$NON-NLS-1$
+
+ TYPE(Messages.BugzillaAttribute_type, "type", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ UNKNOWN(Messages.BugzillaAttribute_UNKNOWN, "UNKNOWN", TaskAttribute.TYPE_SHORT_TEXT, false, false), //$NON-NLS-1$
+
+ VERSION(Messages.BugzillaAttribute_Version, "version", TaskAttribute.TYPE_SINGLE_SELECT, false, false), //$NON-NLS-1$
+
+ INSTALL_VERSION(Messages.BugzillaAttribute_version_of_bugzilla_installed, "install_version", null, true, false), //$NON-NLS-1$
+
+ VOTES(Messages.BugzillaAttribute_Votes, "votes", IBugzillaConstants.EDITOR_TYPE_VOTES, false, true), //$NON-NLS-1$
+
+ WORK_TIME(Messages.BugzillaAttribute_Add, "work_time", TaskAttribute.TYPE_SHORT_TEXT, true, false), //$NON-NLS-1$
+
+ WHO(Messages.BugzillaAttribute_who, "who", TaskAttribute.TYPE_PERSON, false, false), //$NON-NLS-1$
+
+ WHO_NAME(Messages.BugzillaAttribute_who_name, "who_name", TaskAttribute.TYPE_SHORT_TEXT, true, true), //$NON-NLS-1$
+
+ QA_CONTACT(Messages.BugzillaAttribute_QA_Contact, "qa_contact", TaskAttribute.TYPE_PERSON, true, false), //$NON-NLS-1$
+
+ QA_CONTACT_NAME(Messages.BugzillaAttribute_QA_Contact_NAME,
+ "qa_contact_name", TaskAttribute.TYPE_SHORT_TEXT, true, true), //$NON-NLS-1$
+
+ ADDSELFCC(Messages.BugzillaAttribute_Add_self_to_CC, "addselfcc", TaskAttribute.TYPE_BOOLEAN, true, false), //$NON-NLS-1$
+
+ STATUS_OPEN(Messages.BugzillaAttribute_open_status_values, "status_open", null, true, true), //$NON-NLS-1$
+
+ NEW_COMMENT(Messages.BugzillaAttribute_new_comment, "new_comment", TaskAttribute.TYPE_LONG_RICH_TEXT, true, false), //$NON-NLS-1$
+
+ TOKEN("token", "token", null, true, true), //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Used by search engine
+ LI(Messages.BugzillaAttribute_used_by_search_engine_li, "li", null, true, false), //$NON-NLS-1$
+
+ ID(Messages.BugzillaAttribute_used_by_search_engine_id, "id", null, true, false), //$NON-NLS-1$
+
+ SHORT_SHORT_DESC(Messages.BugzillaAttribute_used_by_search_engine_desc, "short_short_desc", null, false, false), //$NON-NLS-1$
+
+ SEQ(Messages.BugzillaAttribute_used_by_search_engine_seq, "seq", null, false, false), //$NON-NLS-1$
+
+ RESULT(Messages.BugzillaAttribute_used_by_search_engine_result, "result", null, false, false), //$NON-NLS-1$
+
+ RDF(Messages.BugzillaAttribute_used_by_search_engine_rdf, "rdf", null, false, false), //$NON-NLS-1$
+
+ INSTALLATION(Messages.BugzillaAttribute_used_by_search_engine_installation, "installation", null, false, false), //$NON-NLS-1$
+
+ BUGS(Messages.BugzillaAttribute_used_by_search_engine_bugs, "bugs", null, false, false); //$NON-NLS-1$
+
+ private final boolean isHidden;
+
+ private final boolean isReadOnly;
+
+ private final String keyString;
+
+ private final String prettyName;
+
+ private final String type;
+
+ public static final BugzillaAttribute[] EXTENDED_ATTRIBUTES = { DELTA_TS, BUG_SEVERITY, PRODUCT };
+
+ BugzillaAttribute(String prettyName, String idKey, String type, boolean hidden, boolean readonly) {
+ this.prettyName = prettyName;
+ this.keyString = idKey;
+ this.type = type;
+ this.isHidden = hidden;
+ this.isReadOnly = readonly;
+ }
+
+ public String getKey() {
+ return keyString;
+ }
+
+ public boolean isHidden() {
+ return isHidden;
+ }
+
+ public boolean isReadOnly() {
+ return isReadOnly;
+ }
+
+ @Override
+ public String toString() {
+ return prettyName;
+ }
+
+ public String getKind() {
+ return isHidden() ? null : TaskAttribute.KIND_DEFAULT;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttributeMapper.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttributeMapper.java
new file mode 100644
index 0000000..bdea263
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaAttributeMapper.java
@@ -0,0 +1,400 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+
+/**
+ * @author Rob Elves
+ * @author Frank Becker
+ */
+public class BugzillaAttributeMapper extends TaskAttributeMapper {
+
+ private final String dateFormat_1 = "yyyy-MM-dd HH:mm:ss"; //$NON-NLS-1$
+
+ private final String dateFormat_2 = "yyyy-MM-dd HH:mm"; //$NON-NLS-1$
+
+ private final String dateFormat_3 = "yyyy-MM-dd"; //$NON-NLS-1$
+
+ private final String dateFormat_1_TimeZone = "yyyy-MM-dd HH:mm:ss zzz"; //$NON-NLS-1$
+
+ private final String dateFormat_2_TimeZone = "yyyy-MM-dd HH:mm zzz"; //$NON-NLS-1$
+
+ private final String dateFormat_3_TimeZone = "yyyy-MM-dd zzz"; //$NON-NLS-1$
+
+ public BugzillaAttributeMapper(TaskRepository taskRepository) {
+ super(taskRepository);
+ }
+
+ @Override
+ public Date getDateValue(TaskAttribute attribute) {
+ if (attribute == null) {
+ return null;
+ }
+ String dateString = attribute.getValue();
+ String id = attribute.getId();
+ Date parsedDate = getDate(id, dateString);
+ if (parsedDate == null) {
+ parsedDate = super.getDateValue(attribute);
+ }
+ return parsedDate;
+ }
+
+ @Override
+ public boolean getBooleanValue(TaskAttribute attribute) {
+ if (attribute.getValue().equals("1")) { //$NON-NLS-1$
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void setBooleanValue(TaskAttribute attribute, Boolean value) {
+ if (value == null) {
+ attribute.setValue("0"); //$NON-NLS-1$
+ } else if (value) {
+ attribute.setValue("1"); //$NON-NLS-1$
+ } else {
+ attribute.setValue("0"); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Note: Date formatters constructed within method for thread safety
+ */
+ private Date getDate(String attributeId, String dateString) {
+ Date parsedDate = null;
+
+ /**
+ * Bugzilla < 2.22 uses "yyyy-MM-dd HH:mm" but later versions use "yyyy-MM-dd HH:mm:ss" Using lowest common
+ * denominator "yyyy-MM-dd HH:mm"
+ */
+
+ RepositoryConfiguration repositoryConfiguration;
+ BugzillaVersion bugzillaVersion = null;
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(getTaskRepository().getUrl());
+ if (repositoryConfiguration != null) {
+ bugzillaVersion = repositoryConfiguration.getInstallVersion();
+ } else {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+
+ SimpleDateFormat comment_creation_ts_Format;
+ SimpleDateFormat attachment_creation_ts_Format;
+
+ SimpleDateFormat comment_creation_ts_Format_Timezone;
+ SimpleDateFormat attachment_creation_ts_Format_Timezone;
+
+ try {
+ if (attributeId.equals(BugzillaAttribute.DELTA_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(dateFormat_1_TimeZone).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.CREATION_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(dateFormat_2_TimeZone).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.BUG_WHEN.getKey())) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_22) < 0) {
+ comment_creation_ts_Format_Timezone = new SimpleDateFormat(dateFormat_2_TimeZone);
+ } else {
+ comment_creation_ts_Format_Timezone = new SimpleDateFormat(dateFormat_1_TimeZone);
+ }
+ parsedDate = comment_creation_ts_Format_Timezone.parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.DATE.getKey())) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_22) < 0) {
+ attachment_creation_ts_Format_Timezone = new SimpleDateFormat(dateFormat_2_TimeZone);
+ } else {
+ attachment_creation_ts_Format_Timezone = new SimpleDateFormat(dateFormat_1_TimeZone);
+ }
+ parsedDate = attachment_creation_ts_Format_Timezone.parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.DEADLINE.getKey())) {
+ parsedDate = new SimpleDateFormat(dateFormat_3_TimeZone).parse(dateString);
+ } else if (attributeId.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ parsedDate = new SimpleDateFormat(dateFormat_1_TimeZone).parse(dateString);
+ }
+ } catch (ParseException e) {
+ try {
+ if (attributeId.equals(BugzillaAttribute.DELTA_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(dateFormat_1).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.CREATION_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(dateFormat_2).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.BUG_WHEN.getKey())) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_22) < 0) {
+ comment_creation_ts_Format = new SimpleDateFormat(dateFormat_2);
+ } else {
+ comment_creation_ts_Format = new SimpleDateFormat(dateFormat_1);
+ }
+ parsedDate = comment_creation_ts_Format.parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.DATE.getKey())) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_22) < 0) {
+ attachment_creation_ts_Format = new SimpleDateFormat(dateFormat_2);
+ } else {
+ attachment_creation_ts_Format = new SimpleDateFormat(dateFormat_1);
+ }
+ parsedDate = attachment_creation_ts_Format.parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.DEADLINE.getKey())) {
+ parsedDate = new SimpleDateFormat(dateFormat_3).parse(dateString);
+ } else if (attributeId.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ parsedDate = new SimpleDateFormat(dateFormat_1).parse(dateString);
+ }
+ } catch (ParseException e1) {
+
+ try {
+ // Fall back to legacy formats
+ String delta_ts_format = dateFormat_1;
+ String creation_ts_format = dateFormat_2;
+ String deadline_format = dateFormat_3;
+ String customAttribute_format = dateFormat_1;
+ String comment_creation_ts_format = dateFormat_2;
+ String attachment_creation_ts_format = dateFormat_2;
+ if (attributeId.equals(BugzillaAttribute.DELTA_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(delta_ts_format).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.CREATION_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(creation_ts_format).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.BUG_WHEN.getKey())) {
+ parsedDate = new SimpleDateFormat(comment_creation_ts_format).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.DATE.getKey())) {
+ parsedDate = new SimpleDateFormat(attachment_creation_ts_format).parse(dateString);
+ } else if (attributeId.equals(BugzillaAttribute.DEADLINE.getKey())) {
+ parsedDate = new SimpleDateFormat(deadline_format).parse(dateString);
+ } else if (attributeId.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ parsedDate = new SimpleDateFormat(customAttribute_format).parse(dateString);
+ }
+ } catch (ParseException e2) {
+ }
+ }
+ } catch (NumberFormatException e) {
+ }
+ return parsedDate;
+ }
+
+ @Override
+ public void setDateValue(TaskAttribute attribute, Date date) {
+ if (date != null) {
+
+ RepositoryConfiguration repositoryConfiguration;
+ BugzillaVersion bugzillaVersion = null;
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(getTaskRepository().getUrl());
+ if (repositoryConfiguration != null) {
+ bugzillaVersion = repositoryConfiguration.getInstallVersion();
+ } else {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+
+ SimpleDateFormat comment_creation_ts_Format;
+ SimpleDateFormat attachment_creation_ts_Format;
+
+ String dateString = null;
+ String attributeId = attribute.getId();
+
+ if (attributeId.equals(BugzillaAttribute.DELTA_TS.getKey())) {
+ dateString = new SimpleDateFormat(dateFormat_1).format(date);
+ } else if (attributeId.equals(BugzillaAttribute.CREATION_TS.getKey())) {
+ dateString = new SimpleDateFormat(dateFormat_2).format(date);
+ } else if (attributeId.equals(BugzillaAttribute.BUG_WHEN.getKey())) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_22) < 0) {
+ comment_creation_ts_Format = new SimpleDateFormat(dateFormat_2);
+ } else {
+ comment_creation_ts_Format = new SimpleDateFormat(dateFormat_1);
+ }
+ dateString = comment_creation_ts_Format.format(date);
+ } else if (attributeId.equals(BugzillaAttribute.DATE.getKey())) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_22) < 0) {
+ attachment_creation_ts_Format = new SimpleDateFormat(dateFormat_2);
+ } else {
+ attachment_creation_ts_Format = new SimpleDateFormat(dateFormat_1);
+ }
+ dateString = attachment_creation_ts_Format.format(date);
+ } else if (attributeId.equals(BugzillaAttribute.DEADLINE.getKey())) {
+ dateString = new SimpleDateFormat(dateFormat_3).format(date);
+ } else if (attributeId.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ dateString = new SimpleDateFormat(dateFormat_1).format(date);
+ }
+
+ if (dateString == null) {
+ super.setDateValue(attribute, date);
+ } else {
+ attribute.setValue(dateString);
+ }
+
+ } else {
+ attribute.clearValues();
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public String mapToRepositoryKey(TaskAttribute parent, String key) {
+ /*if (key.equals(TaskAttribute.NEW_CC)) {
+ return BugzillaReportElement.NEWCC.getKey();
+ } else*/if (key.equals(TaskAttribute.COMMENT_DATE)) {
+ return BugzillaAttribute.BUG_WHEN.getKey();
+ } else if (key.equals(TaskAttribute.COMMENT_AUTHOR)) {
+ return BugzillaAttribute.WHO.getKey();
+ } else if (key.equals(TaskAttribute.COMMENT_AUTHOR_NAME)) {
+ return BugzillaAttribute.WHO_NAME.getKey();
+ } else if (key.equals(TaskAttribute.USER_CC)) {
+ return BugzillaAttribute.CC.getKey();
+ } else if (key.equals(TaskAttribute.COMMENT_TEXT)) {
+ return BugzillaAttribute.THETEXT.getKey();
+ } else if (key.equals(TaskAttribute.DATE_CREATION)) {
+ return BugzillaAttribute.CREATION_TS.getKey();
+ } else if (key.equals(TaskAttribute.DESCRIPTION)) {
+ return BugzillaAttribute.LONG_DESC.getKey();
+ } else if (key.equals(TaskAttribute.ATTACHMENT_ID)) {
+ return BugzillaAttribute.ATTACHID.getKey();
+ } else if (key.equals(TaskAttribute.ATTACHMENT_DESCRIPTION)) {
+ return BugzillaAttribute.DESC.getKey();
+ } else if (key.equals(TaskAttribute.ATTACHMENT_CONTENT_TYPE)) {
+ return BugzillaAttribute.CTYPE.getKey();
+ //return BugzillaReportElement.TYPE.getKey();*/
+ } else if (key.equals(TaskAttribute.USER_ASSIGNED)) {
+ return BugzillaAttribute.ASSIGNED_TO.getKey();
+ } else if (key.equals(TaskAttribute.USER_ASSIGNED_NAME)) {
+ return BugzillaAttribute.ASSIGNED_TO_NAME.getKey();
+ } else if (key.equals(TaskAttribute.RESOLUTION)) {
+ return BugzillaAttribute.RESOLUTION.getKey();
+ } else if (key.equals(TaskAttribute.STATUS)) {
+ return BugzillaAttribute.BUG_STATUS.getKey();
+ } else if (key.equals(TaskAttribute.DATE_MODIFICATION)) {
+ return BugzillaAttribute.DELTA_TS.getKey();
+ } else if (key.equals(TaskAttribute.USER_REPORTER)) {
+ return BugzillaAttribute.REPORTER.getKey();
+ } else if (key.equals(TaskAttribute.USER_REPORTER_NAME)) {
+ return BugzillaAttribute.REPORTER_NAME.getKey();
+ } else if (key.equals(TaskAttribute.SUMMARY)) {
+ return BugzillaAttribute.SHORT_DESC.getKey();
+ } else if (key.equals(TaskAttribute.PRODUCT)) {
+ return BugzillaAttribute.PRODUCT.getKey();
+ } else if (key.equals(TaskAttribute.KEYWORDS)) {
+ return BugzillaAttribute.KEYWORDS.getKey();
+ } else if (key.equals(TaskAttribute.ATTACHMENT_DATE)) {
+ return BugzillaAttribute.DATE.getKey();
+ } else if (key.equals(TaskAttribute.ATTACHMENT_SIZE)) {
+ return BugzillaAttribute.SIZE.getKey();
+ } else if (key.equals(TaskAttribute.ADD_SELF_CC)) {
+ return BugzillaAttribute.ADDSELFCC.getKey();
+ } else if (key.equals(TaskAttribute.PRIORITY)) {
+ return BugzillaAttribute.PRIORITY.getKey();
+ } else if (key.equals(TaskAttribute.COMMENT_NEW)) {
+ return BugzillaAttribute.NEW_COMMENT.getKey();
+ } else if (key.equals(TaskAttribute.COMPONENT)) {
+ return BugzillaAttribute.COMPONENT.getKey();
+ } else if (key.equals(TaskAttribute.TASK_KEY)) {
+ return BugzillaAttribute.BUG_ID.getKey();
+ } else if (key.equals(TaskAttribute.DATE_DUE)) {
+ return BugzillaAttribute.DEADLINE.getKey();
+ } else if (key.equals(TaskAttribute.SEVERITY)) {
+ return BugzillaAttribute.BUG_SEVERITY.getKey();
+ } else if (key.equals(TaskAttribute.VERSION)) {
+ return BugzillaAttribute.VERSION.getKey();
+ }
+ return super.mapToRepositoryKey(parent, key);
+ }
+
+ @Override
+ public TaskAttribute getAssoctiatedAttribute(TaskAttribute taskAttribute) {
+ String id = taskAttribute.getMetaData().getValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID);
+ if (id != null) {
+ // operation associated input attributes are stored on the root attribute
+ if (TaskAttribute.TYPE_OPERATION.equals(taskAttribute.getMetaData().getType())) {
+ return taskAttribute.getTaskData().getRoot().getMappedAttribute(id);
+ }
+ return taskAttribute.getMappedAttribute(id);
+ }
+ return null;
+ }
+
+ @Override
+ public IRepositoryPerson getRepositoryPerson(TaskAttribute taskAttribute) {
+
+ IRepositoryPerson person = super.getRepositoryPerson(taskAttribute);
+ if (person.getName() == null) {
+ if (taskAttribute.getId().equals(BugzillaAttribute.ASSIGNED_TO.getKey())) {
+ TaskAttribute attrAssigned = taskAttribute.getTaskData().getRoot().getAttribute(
+ BugzillaAttribute.ASSIGNED_TO_NAME.getKey());
+ if (attrAssigned != null) {
+ person.setName(attrAssigned.getValue());
+ }
+ } else if (taskAttribute.getId().equals(BugzillaAttribute.REPORTER.getKey())) {
+ TaskAttribute attrReporter = taskAttribute.getTaskData().getRoot().getAttribute(
+ BugzillaAttribute.REPORTER_NAME.getKey());
+ if (attrReporter != null) {
+ person.setName(attrReporter.getValue());
+ }
+ } else if (taskAttribute.getId().equals(BugzillaAttribute.QA_CONTACT.getKey())) {
+ TaskAttribute attrReporter = taskAttribute.getTaskData().getRoot().getAttribute(
+ BugzillaAttribute.QA_CONTACT_NAME.getKey());
+ if (attrReporter != null) {
+ person.setName(attrReporter.getValue());
+ }
+ }
+ }
+ return person;
+ }
+
+ @Override
+ public Map<String, String> getOptions(TaskAttribute attribute) {
+ RepositoryConfiguration configuration = BugzillaCorePlugin.getRepositoryConfiguration(getTaskRepository().getRepositoryUrl());
+ if (configuration != null) {
+ TaskAttribute attributeProduct = attribute.getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.PRODUCT.getKey());
+ if (attributeProduct != null && attributeProduct.getValue().length() > 0) {
+ List<String> options = configuration.getAttributeOptions(attributeProduct.getValue(), attribute);
+ if (options.size() == 0 && attribute.getId().equals(BugzillaOperation.resolve.getInputId())) {
+ options = configuration.getOptionValues(BugzillaAttribute.RESOLUTION, attributeProduct.getValue());
+ // DUPLICATE and MOVED have special meanings so do not show as resolution
+ // TODO: COPIED FUNCTIONALITY from RepositoryConfiguration.addOperation() refactor.
+ options.remove("DUPLICATE"); //$NON-NLS-1$
+ options.remove("MOVED"); //$NON-NLS-1$
+ }
+ Map<String, String> newOptions = new LinkedHashMap<String, String>();
+ for (String option : options) {
+ newOptions.put(option, option);
+ }
+ return newOptions;
+ }
+ }
+ return super.getOptions(attribute);
+ }
+
+ @Override
+ public boolean equals(TaskAttribute newAttribute, TaskAttribute oldAttribute) {
+ if (oldAttribute.getId().startsWith(TaskAttribute.PREFIX_ATTACHMENT)) {
+ TaskAttachmentMapper oldAttachment;
+ oldAttachment = TaskAttachmentMapper.createFrom(oldAttribute);
+ TaskAttachmentMapper newAttachment;
+ newAttachment = TaskAttachmentMapper.createFrom(newAttribute);
+ return newAttachment.equals(oldAttachment);
+ }
+ return super.equals(newAttribute, oldAttribute);
+ }
+
+ @Override
+ public String getLabel(TaskAttribute taskAttribute) {
+ if (taskAttribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ return super.getLabel(taskAttribute) + ":"; //$NON-NLS-1$
+ } else {
+ return super.getLabel(taskAttribute);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java
new file mode 100644
index 0000000..2577f19
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClient.java
@@ -0,0 +1,1999 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - fixes for bug 165072
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.Proxy;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.nio.charset.Charset;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.security.auth.login.LoginException;
+import javax.swing.text.html.HTML.Tag;
+
+import org.apache.commons.httpclient.Cookie;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.RedirectException;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.commons.httpclient.methods.multipart.FilePart;
+import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
+import org.apache.commons.httpclient.methods.multipart.Part;
+import org.apache.commons.httpclient.methods.multipart.PartBase;
+import org.apache.commons.httpclient.methods.multipart.StringPart;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+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.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer;
+import org.eclipse.mylyn.commons.net.HtmlTag;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.internal.bugzilla.core.history.BugzillaTaskHistoryParser;
+import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentPartSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class BugzillaClient {
+
+ private static final String COOKIE_BUGZILLA_LOGIN = "Bugzilla_login"; //$NON-NLS-1$
+
+ protected static final String USER_AGENT = "BugzillaConnector"; //$NON-NLS-1$
+
+ private static final int MAX_RETRIEVED_PER_QUERY = 50;
+
+ private static final String QUERY_DELIMITER = "?"; //$NON-NLS-1$
+
+ private static final String KEY_ID = "id"; //$NON-NLS-1$
+
+ private static final String VAL_TRUE = "true"; //$NON-NLS-1$
+
+ private static final String KEY_CC = "cc"; //$NON-NLS-1$
+
+ private static final String POST_BUG_CGI = "/post_bug.cgi"; //$NON-NLS-1$
+
+ private static final String PROCESS_BUG_CGI = "/process_bug.cgi"; //$NON-NLS-1$
+
+ private static final String PROCESS_ATTACHMENT_CGI = "/attachment.cgi"; //$NON-NLS-1$
+
+ public static final int WRAP_LENGTH = 80;
+
+ private static final String VAL_PROCESS_BUG = "process_bug"; //$NON-NLS-1$
+
+ private static final String KEY_FORM_NAME = "form_name"; //$NON-NLS-1$
+
+ private static final String VAL_NONE = "none"; //$NON-NLS-1$
+
+ private static final String KEY_KNOB = "knob"; //$NON-NLS-1$
+
+ // TODO change to BugzillaReportElement.ADD_COMMENT
+ private static final String KEY_COMMENT = "comment"; //$NON-NLS-1$
+
+ private static final String KEY_SHORT_DESC = "short_desc"; //$NON-NLS-1$
+
+ private static final String VALUE_CONTENTTYPEMETHOD_MANUAL = "manual"; //$NON-NLS-1$
+
+ private static final String VALUE_ISPATCH = "1"; //$NON-NLS-1$
+
+ private static final String VALUE_ACTION_INSERT = "insert"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_CONTENTTYPEENTRY = "contenttypeentry"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_CONTENTTYPEMETHOD = "contenttypemethod"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_ISPATCH = "ispatch"; //$NON-NLS-1$
+
+ private static final String CONTENT_TYPE_APP_RDF_XML = "application/rdf+xml"; //$NON-NLS-1$
+
+ private static final String CONTENT_TYPE_APP_XML = "application/xml"; //$NON-NLS-1$
+
+ private static final String CONTENT_TYPE_TEXT_XML = "text/xml"; //$NON-NLS-1$
+
+ private static final String[] VALID_CONFIG_CONTENT_TYPES = { CONTENT_TYPE_APP_RDF_XML, CONTENT_TYPE_APP_XML,
+ CONTENT_TYPE_TEXT_XML };
+
+ private static final String ATTR_CHARSET = "charset"; //$NON-NLS-1$
+
+ protected Proxy proxy = Proxy.NO_PROXY;
+
+ protected URL repositoryUrl;
+
+ protected String characterEncoding;
+
+ private boolean loggedIn;
+
+ private final Map<String, String> configParameters;
+
+ private final HttpClient httpClient = new HttpClient(WebUtil.getConnectionManager());
+
+ private boolean lastModifiedSupported = true;
+
+ private final BugzillaLanguageSettings bugzillaLanguageSettings;
+
+ private RepositoryConfiguration repositoryConfiguration;
+
+ private HostConfiguration hostConfiguration;
+
+ private final AbstractWebLocation location;
+
+ public BugzillaClient(AbstractWebLocation location, String characterEncoding, Map<String, String> configParameters,
+ BugzillaLanguageSettings languageSettings) throws MalformedURLException {
+ this.repositoryUrl = new URL(location.getUrl());
+ this.location = location;
+ this.characterEncoding = characterEncoding;
+ this.configParameters = configParameters;
+ this.bugzillaLanguageSettings = languageSettings;
+ this.proxy = location.getProxyForHost(location.getUrl(), IProxyData.HTTP_PROXY_TYPE);
+ WebUtil.configureHttpClient(httpClient, USER_AGENT);
+
+ }
+
+ public void validate(IProgressMonitor monitor) throws IOException, CoreException {
+ monitor = Policy.monitorFor(monitor);
+ GzipGetMethod method = null;
+ try {
+ logout(monitor);
+ method = getConnect(repositoryUrl + "/", monitor); //$NON-NLS-1$
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ }
+
+ protected boolean hasAuthenticationCredentials() {
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ return (credentials != null && credentials.getUserName() != null && credentials.getUserName().length() > 0);
+ }
+
+ private GzipGetMethod getConnect(String serverURL, IProgressMonitor monitor) throws IOException, CoreException {
+
+ return connectInternal(serverURL, false, monitor);
+
+ }
+
+ /**
+ * in order to provide an even better solution for bug 196056 the size of the bugzilla configuration downloaded must
+ * be reduced. By using a cached version of the config.cgi this can reduce traffic considerably:
+ * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.phoenix/infra-scripts/bugzilla/?root=Technology_Project
+ *
+ * @param serverURL
+ * @return a GetMethod with possibly gzip encoded response body, so caller MUST check with
+ * "gzip".equals(method.getResponseHeader("Content-encoding") or use the utility method
+ * getResponseBodyAsUnzippedStream().
+ * @throws IOException
+ * @throws CoreException
+ */
+ protected GzipGetMethod getConnectGzip(String serverURL, IProgressMonitor monitor) throws IOException,
+ CoreException {
+
+ return connectInternal(serverURL, true, monitor);
+
+ }
+
+ private GzipGetMethod connectInternal(String requestURL, boolean gzip, IProgressMonitor monitor)
+ throws IOException, CoreException {
+ monitor = Policy.monitorFor(monitor);
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+
+ for (int attempt = 0; attempt < 2; attempt++) {
+ // force authentication
+ authenticate(monitor);
+
+ GzipGetMethod getMethod = new GzipGetMethod(WebUtil.getRequestPath(requestURL), gzip);
+ if (requestURL.contains(QUERY_DELIMITER)) {
+ getMethod.setQueryString(requestURL.substring(requestURL.indexOf(QUERY_DELIMITER)));
+ }
+
+ getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" //$NON-NLS-1$ //$NON-NLS-2$
+ + getCharacterEncoding());
+
+ // Resolves bug#195113
+ httpClient.getParams().setParameter("http.protocol.single-cookie-header", true); //$NON-NLS-1$
+
+ // WARNING!! Setting browser compatibility breaks Bugzilla
+ // authentication
+ // getMethod.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
+ // getMethod.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
+
+ getMethod.setDoAuthentication(true);
+
+ int code;
+ try {
+ code = WebUtil.execute(httpClient, hostConfiguration, getMethod, monitor);
+ } catch (IOException e) {
+ getMethod.getResponseBodyNoop();
+ getMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repositoryUrl.toString(), e));
+ }
+
+ if (code == HttpURLConnection.HTTP_OK) {
+ return getMethod;
+ } else if (code == HttpURLConnection.HTTP_UNAUTHORIZED || code == HttpURLConnection.HTTP_FORBIDDEN) {
+ getMethod.getResponseBodyNoop();
+ // login or reauthenticate due to an expired session
+ getMethod.releaseConnection();
+ loggedIn = false;
+ authenticate(monitor);
+ } else if (code == HttpURLConnection.HTTP_PROXY_AUTH) {
+ loggedIn = false;
+ getMethod.getResponseBodyNoop();
+ getMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+ "Proxy authentication required")); //$NON-NLS-1$
+ } else {
+ getMethod.getResponseBodyNoop();
+ getMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_NETWORK, "Http error: " + HttpStatus.getStatusText(code))); //$NON-NLS-1$
+ }
+ }
+
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "All connection attempts to " + repositoryUrl.toString() //$NON-NLS-1$
+ + " failed. Please verify connection and authentication information.")); //$NON-NLS-1$
+ }
+
+ public void logout(IProgressMonitor monitor) throws IOException, CoreException {
+ monitor = Policy.monitorFor(monitor);
+ String loginUrl = repositoryUrl + "/relogin.cgi"; //$NON-NLS-1$
+ GzipGetMethod method = null;
+ try {
+ method = getConnect(loginUrl, monitor);
+ loggedIn = false;
+ httpClient.getState().clearCookies();
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ }
+
+ protected InputStream getResponseStream(HttpMethodBase method, IProgressMonitor monitor) throws IOException {
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ if (isZippedReply(method)) {
+ in = new java.util.zip.GZIPInputStream(in);
+ }
+ return in;
+ }
+
+ private boolean isZippedReply(HttpMethodBase method) {
+ // content-encoding:gzip can be set by a dedicated perl script or mod_gzip
+ boolean zipped = (null != method.getResponseHeader("Content-encoding") && method.getResponseHeader( //$NON-NLS-1$
+ "Content-encoding").getValue().equals(IBugzillaConstants.CONTENT_ENCODING_GZIP)) //$NON-NLS-1$
+ ||
+ // content-type: application/x-gzip can be set by any apache after 302 redirect, based on .gz suffix
+ (null != method.getResponseHeader("Content-Type") && method.getResponseHeader("Content-Type") //$NON-NLS-1$ //$NON-NLS-2$
+ .getValue()
+ .equals("application/x-gzip")); //$NON-NLS-1$
+ return zipped;
+ }
+
+ public void authenticate(IProgressMonitor monitor) throws CoreException {
+ if (loggedIn || !hasAuthenticationCredentials()) {
+ return;
+// throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+// RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+// "Authentication credentials missing.")); //$NON-NLS-1$
+ }
+
+ monitor = Policy.monitorFor(monitor);
+
+ GzipPostMethod postMethod = null;
+
+ try {
+
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+
+ NameValuePair[] formData = new NameValuePair[2];
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ if (credentials == null) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+ "Authentication credentials from location missing.")); //$NON-NLS-1$
+ }
+ formData[0] = new NameValuePair(IBugzillaConstants.POST_INPUT_BUGZILLA_LOGIN, credentials.getUserName());
+ formData[1] = new NameValuePair(IBugzillaConstants.POST_INPUT_BUGZILLA_PASSWORD, credentials.getPassword());
+
+ postMethod = new GzipPostMethod(WebUtil.getRequestPath(repositoryUrl.toString()
+ + IBugzillaConstants.URL_POST_LOGIN), true);
+
+ postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" //$NON-NLS-1$ //$NON-NLS-2$
+ + getCharacterEncoding());
+
+ postMethod.setRequestBody(formData);
+ postMethod.setDoAuthentication(true);
+ postMethod.setFollowRedirects(false);
+ httpClient.getState().clearCookies();
+
+ AuthenticationCredentials httpAuthCredentials = location.getCredentials(AuthenticationType.HTTP);
+
+ if (httpAuthCredentials != null && httpAuthCredentials.getUserName() != null
+ && httpAuthCredentials.getUserName().length() > 0) {
+ httpClient.getParams().setAuthenticationPreemptive(true);
+ }
+
+ int code = WebUtil.execute(httpClient, hostConfiguration, postMethod, monitor);
+ if (code == HttpURLConnection.HTTP_UNAUTHORIZED || code == HttpURLConnection.HTTP_FORBIDDEN) {
+ loggedIn = false;
+ postMethod.getResponseBodyNoop();
+ postMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+ "HTTP authentication failed.")); //$NON-NLS-1$
+
+ } else if (code == HttpURLConnection.HTTP_PROXY_AUTH) {
+ loggedIn = false;
+ postMethod.getResponseBodyNoop();
+ postMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+ "Proxy authentication required")); //$NON-NLS-1$
+
+ } else if (code != HttpURLConnection.HTTP_OK) {
+ loggedIn = false;
+ postMethod.getResponseBodyNoop();
+ postMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_NETWORK, "Http error: " + HttpStatus.getStatusText(code))); //$NON-NLS-1$
+ }
+
+ if (hasAuthenticationCredentials()) {
+ for (Cookie cookie : httpClient.getState().getCookies()) {
+ if (cookie.getName().equals(COOKIE_BUGZILLA_LOGIN)) {
+ loggedIn = true;
+ break;
+ }
+ }
+
+ if (!loggedIn) {
+ InputStream input = getResponseStream(postMethod, monitor);
+ try {
+ parseHtmlError(input);
+ } finally {
+ input.close();
+ }
+ }
+ } else {
+ // anonymous login
+ loggedIn = true;
+ }
+ } catch (IOException e) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repositoryUrl.toString(), e));
+ } finally {
+ if (postMethod != null) {
+ postMethod.releaseConnection();
+ }
+ httpClient.getParams().setAuthenticationPreemptive(false);
+ }
+ }
+
+ public boolean getSearchHits(IRepositoryQuery query, TaskDataCollector collector, TaskAttributeMapper mapper,
+ IProgressMonitor monitor) throws IOException, CoreException {
+ HttpMethodBase postMethod = null;
+
+ try {
+ authenticate(new SubProgressMonitor(monitor, 1));
+ String queryUrl = query.getUrl();
+ int start = queryUrl.indexOf('?');
+
+ List<NameValuePair> pairs = new ArrayList<NameValuePair>();
+ if (start != -1) {
+ queryUrl = queryUrl.substring(start + 1);
+ String[] result = queryUrl.split("&"); //$NON-NLS-1$
+ if (result.length > 0) {
+ for (String string : result) {
+ String[] nameValue = string.split("="); //$NON-NLS-1$
+ if (nameValue.length == 1) {
+ pairs.add(new NameValuePair(nameValue[0].trim(), "")); //$NON-NLS-1$
+ } else if (nameValue.length == 2 && nameValue[0] != null && nameValue[1] != null) {
+ pairs.add(new NameValuePair(nameValue[0].trim(), URLDecoder.decode(nameValue[1].trim(),
+ getCharacterEncoding())));
+ }
+ }
+ }
+ }
+
+ NameValuePair ctypePair = new NameValuePair("ctype", "rdf"); //$NON-NLS-1$ //$NON-NLS-2$
+ // Test that we don't specify content type twice.
+ if (!pairs.contains(ctypePair)) {
+ pairs.add(ctypePair);
+ }
+
+ try {
+ postMethod = postFormData(IBugzillaConstants.URL_BUGLIST,
+ pairs.toArray(new NameValuePair[pairs.size()]), monitor);
+ } catch (RedirectException r) {
+ // Handle one redirect (Bugzilla 3.4 provides a redirect upon query submission via post)
+ postMethod = getConnectGzip(r.getMessage(), monitor);
+ }
+
+ if (postMethod != null && postMethod.getResponseHeader("Content-Type") != null) { //$NON-NLS-1$
+ Header responseTypeHeader = postMethod.getResponseHeader("Content-Type"); //$NON-NLS-1$
+ for (String type : VALID_CONFIG_CONTENT_TYPES) {
+ if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) {
+ InputStream stream = getResponseStream(postMethod, monitor);
+ try {
+ RepositoryQueryResultsFactory queryFactory = getQueryResultsFactory(stream);
+ int count = queryFactory.performQuery(repositoryUrl.toString(), collector, mapper,
+ TaskDataCollector.MAX_HITS);
+ return count > 0;
+ } finally {
+ stream.close();
+ }
+ }
+ }
+ }
+
+ parseHtmlError(getResponseStream(postMethod, monitor));
+ } finally {
+ if (postMethod != null) {
+ postMethod.releaseConnection();
+ }
+ }
+ return false;
+ }
+
+ protected RepositoryQueryResultsFactory getQueryResultsFactory(InputStream stream) {
+ return new RepositoryQueryResultsFactory(stream, getCharacterEncoding());
+ }
+
+ public static void setupExistingBugAttributes(String serverUrl, TaskData existingReport) {
+ // ordered list of elements as they appear in UI
+ // and additional elements that may not appear in the incoming xml
+ // stream but need to be present for bug submission / not always dirty
+ // state handling
+ BugzillaAttribute[] reportElements = { BugzillaAttribute.SHORT_DESC, BugzillaAttribute.BUG_STATUS,
+ BugzillaAttribute.RESOLUTION, BugzillaAttribute.BUG_ID, BugzillaAttribute.REP_PLATFORM,
+ BugzillaAttribute.PRODUCT, BugzillaAttribute.OP_SYS, BugzillaAttribute.COMPONENT,
+ BugzillaAttribute.VERSION, BugzillaAttribute.PRIORITY, BugzillaAttribute.BUG_SEVERITY,
+ BugzillaAttribute.ASSIGNED_TO, BugzillaAttribute.TARGET_MILESTONE, BugzillaAttribute.REPORTER,
+ BugzillaAttribute.DEPENDSON, BugzillaAttribute.BLOCKED, BugzillaAttribute.BUG_FILE_LOC,
+ BugzillaAttribute.NEWCC, BugzillaAttribute.KEYWORDS, BugzillaAttribute.CC,
+ BugzillaAttribute.NEW_COMMENT, BugzillaAttribute.QA_CONTACT, BugzillaAttribute.STATUS_WHITEBOARD,
+ BugzillaAttribute.DEADLINE };
+
+ for (BugzillaAttribute element : reportElements) {
+ BugzillaTaskDataHandler.createAttribute(existingReport, element);
+ }
+ }
+
+ public static String getBugUrlWithoutLogin(String repositoryUrl, String id) {
+ String url = repositoryUrl + IBugzillaConstants.URL_GET_SHOW_BUG + id;
+ return url;
+ }
+
+ public static String getCharsetFromString(String string) {
+ int charsetStartIndex = string.indexOf(ATTR_CHARSET);
+ if (charsetStartIndex != -1) {
+ int charsetEndIndex = string.indexOf("\"", charsetStartIndex); // TODO: //$NON-NLS-1$
+ // could
+ // be
+ // space
+ // after?
+ if (charsetEndIndex == -1) {
+ charsetEndIndex = string.length();
+ }
+ String charsetString = string.substring(charsetStartIndex + 8, charsetEndIndex);
+ if (Charset.availableCharsets().containsKey(charsetString)) {
+ return charsetString;
+ }
+ }
+ return null;
+ }
+
+ public RepositoryConfiguration getRepositoryConfiguration(IProgressMonitor monitor) throws IOException,
+ CoreException {
+ GzipGetMethod method = null;
+ int attempt = 0;
+ while (attempt < 2) {
+ try {
+ method = getConnectGzip(repositoryUrl + IBugzillaConstants.URL_GET_CONFIG_RDF, monitor);
+ // provide a solution for bug 196056 by allowing a (cached) gzipped configuration to be sent
+ // modified to also accept "application/x-gzip" as results from a 302 redirect to a previously gzipped file.
+ if (method == null) {
+ throw new IOException("Could not retrieve configuratoin. HttpClient return null method."); //$NON-NLS-1$
+ }
+
+ InputStream stream = getResponseStream(method, monitor);
+ try {
+ if (method.getResponseHeader("Content-Type") != null) { //$NON-NLS-1$
+ Header responseTypeHeader = method.getResponseHeader("Content-Type"); //$NON-NLS-1$
+ for (String type : VALID_CONFIG_CONTENT_TYPES) {
+ if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) {
+ RepositoryConfigurationFactory configFactory = new RepositoryConfigurationFactory(
+ stream, getCharacterEncoding());
+
+ repositoryConfiguration = configFactory.getConfiguration();
+
+ if (repositoryConfiguration != null) {
+ if (!repositoryConfiguration.getProducts().isEmpty()) {
+ repositoryConfiguration.setRepositoryUrl(repositoryUrl.toString());
+ return repositoryConfiguration;
+ } else {
+ if (attempt == 0) {
+ // empty configuration, retry authenticate
+ loggedIn = false;
+ break;
+ } else {
+ throw new CoreException(
+ new Status(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ "Unable to retrieve repository configuration. Ensure credentials are valid.")); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+
+ }
+ if (loggedIn) {
+ parseHtmlError(stream);
+ return null;
+ }
+ } finally {
+ stream.close();
+ }
+ } finally {
+ attempt++;
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ }
+ return null;
+ }
+
+ public void getAttachmentData(String attachmentId, OutputStream out, IProgressMonitor monitor) throws IOException,
+ CoreException {
+ String url = repositoryUrl + IBugzillaConstants.URL_GET_ATTACHMENT_DOWNLOAD + attachmentId;
+ GetMethod method = connectInternal(url, false, monitor);//getConnectGzip(url, monitor);
+ try {
+ int status = WebUtil.execute(httpClient, hostConfiguration, method, monitor);
+ if (status == HttpStatus.SC_OK) {
+ out.write(method.getResponseBody());
+ } else {
+ parseHtmlError(method.getResponseBodyAsStream());
+ }
+ } catch (IOException e) {
+ throw e;
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ private String getCharacterEncoding() {
+ if (repositoryConfiguration != null && repositoryConfiguration.getEncoding() != null
+ && repositoryConfiguration.getEncoding().length() > 0) {
+ // Special case for eclipse.org. See bug#280361 and bug#275102
+ return repositoryConfiguration.getEncoding();
+ } else {
+ return characterEncoding;
+ }
+ }
+
+ public void postAttachment(String bugReportID, String comment, AbstractTaskAttachmentSource source,
+ TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws HttpException, IOException,
+ CoreException {
+ monitor = Policy.monitorFor(monitor);
+ String description = source.getDescription();
+ String contentType = source.getContentType();
+ String filename = source.getName();
+ boolean isPatch = false;
+
+ if (attachmentAttribute != null) {
+ TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(attachmentAttribute);
+
+ if (mapper.getDescription() != null) {
+ description = mapper.getDescription();
+ }
+
+ if (mapper.getContentType() != null) {
+ contentType = mapper.getContentType();
+ }
+
+ if (mapper.getFileName() != null) {
+ filename = mapper.getFileName();
+ }
+
+ if (mapper.isPatch() != null) {
+ isPatch = mapper.isPatch();
+ }
+ }
+ Assert.isNotNull(bugReportID);
+ Assert.isNotNull(source);
+ Assert.isNotNull(contentType);
+ if (description == null) {
+ throw new CoreException(new Status(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ Messages.BugzillaClient_description_required_when_submitting_attachments));
+ }
+
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ authenticate(monitor);
+ GzipPostMethod postMethod = null;
+
+ try {
+ postMethod = new GzipPostMethod(WebUtil.getRequestPath(repositoryUrl
+ + IBugzillaConstants.URL_POST_ATTACHMENT_UPLOAD), true);
+ // This option causes the client to first
+ // check
+ // with the server to see if it will in fact receive the post before
+ // actually sending the contents.
+ postMethod.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, true);
+ List<PartBase> parts = new ArrayList<PartBase>();
+ parts.add(new StringPart(IBugzillaConstants.POST_INPUT_ACTION, VALUE_ACTION_INSERT, getCharacterEncoding()));
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ String username;
+ String password;
+ if (credentials != null) {
+ username = credentials.getUserName();
+ password = credentials.getPassword();
+ } else {
+ username = null;
+ password = null;
+
+ }
+ if (username != null && password != null) {
+ parts.add(new StringPart(IBugzillaConstants.POST_INPUT_BUGZILLA_LOGIN, username, getCharacterEncoding()));
+ parts.add(new StringPart(IBugzillaConstants.POST_INPUT_BUGZILLA_PASSWORD, password,
+ getCharacterEncoding()));
+ }
+ parts.add(new StringPart(IBugzillaConstants.POST_INPUT_BUGID, bugReportID, getCharacterEncoding()));
+ if (description != null) {
+ parts.add(new StringPart(IBugzillaConstants.POST_INPUT_DESCRIPTION, description, getCharacterEncoding()));
+ }
+ if (comment != null) {
+ parts.add(new StringPart(IBugzillaConstants.POST_INPUT_COMMENT, comment, getCharacterEncoding()));
+ }
+ parts.add(new FilePart(IBugzillaConstants.POST_INPUT_DATA, new TaskAttachmentPartSource(source, filename)));
+
+ if (isPatch) {
+ parts.add(new StringPart(ATTRIBUTE_ISPATCH, VALUE_ISPATCH));
+ } else {
+ parts.add(new StringPart(ATTRIBUTE_CONTENTTYPEMETHOD, VALUE_CONTENTTYPEMETHOD_MANUAL));
+ parts.add(new StringPart(ATTRIBUTE_CONTENTTYPEENTRY, contentType));
+ }
+ if (attachmentAttribute != null) {
+ Collection<TaskAttribute> attributes = attachmentAttribute.getAttributes().values();
+ Iterator<TaskAttribute> itr = attributes.iterator();
+ while (itr.hasNext()) {
+ TaskAttribute a = itr.next();
+ if (a.getId().startsWith("task.common.kind.flag_type") && repositoryConfiguration != null) { //$NON-NLS-1$
+ List<BugzillaFlag> flags = repositoryConfiguration.getFlags();
+ TaskAttribute requestee = a.getAttribute("requestee"); //$NON-NLS-1$
+ a = a.getAttribute("state"); //$NON-NLS-1$
+ String value = a.getValue();
+ String id = ""; //$NON-NLS-1$
+ if (value.equals(" ")) { //$NON-NLS-1$
+ continue;
+ }
+ String flagname = a.getMetaData().getLabel();
+ BugzillaFlag theFlag = null;
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (flagname.equals(bugzillaFlag.getName())) {
+ theFlag = bugzillaFlag;
+ break;
+ }
+ }
+ if (theFlag != null) {
+ int flagTypeNumber = theFlag.getFlagId();
+ id = "flag_type-" + flagTypeNumber; //$NON-NLS-1$
+ value = a.getValue();
+ if (value.equals("?") && requestee != null) { //$NON-NLS-1$
+ parts.add(new StringPart("requestee_type-" + flagTypeNumber, //$NON-NLS-1$
+ requestee.getValue() != null ? requestee.getValue() : "")); //$NON-NLS-1$
+ }
+ }
+ parts.add(new StringPart(id, value != null ? value : "")); //$NON-NLS-1$
+ } else if (a.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$
+ TaskAttribute flagnumber = a.getAttribute("number"); //$NON-NLS-1$
+ TaskAttribute requestee = a.getAttribute("requestee"); //$NON-NLS-1$
+ a = a.getAttribute("state"); //$NON-NLS-1$
+ String id = "flag-" + flagnumber.getValue(); //$NON-NLS-1$
+ String value = a.getValue();
+ if (value.equals(" ")) { //$NON-NLS-1$
+ value = "X"; //$NON-NLS-1$
+ }
+ if (value.equals("?") && requestee != null) { //$NON-NLS-1$
+ parts.add(new StringPart("requestee-" + flagnumber.getValue(), //$NON-NLS-1$
+ requestee.getValue() != null ? requestee.getValue() : "")); //$NON-NLS-1$
+ }
+ parts.add(new StringPart(id, value != null ? value : "")); //$NON-NLS-1$
+ }
+ }
+ }
+ postMethod.setRequestEntity(new MultipartRequestEntity(parts.toArray(new Part[1]), postMethod.getParams()));
+ postMethod.setDoAuthentication(true);
+ int status = WebUtil.execute(httpClient, hostConfiguration, postMethod, monitor);
+ if (status == HttpStatus.SC_OK) {
+ InputStream input = getResponseStream(postMethod, monitor);
+ try {
+ parseHtmlError(input);
+ } finally {
+ input.close();
+ }
+
+ } else {
+ postMethod.getResponseBodyNoop();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_NETWORK, repositoryUrl.toString(), "Http error: " //$NON-NLS-1$
+ + HttpStatus.getStatusText(status)));
+ // throw new IOException("Communication error occurred during
+ // upload. \n\n"
+ // + HttpStatus.getStatusText(status));
+ }
+ } finally {
+ if (postMethod != null) {
+ postMethod.releaseConnection();
+ }
+ }
+ }
+
+ /**
+ * calling method must release the connection on the returned PostMethod once finished.
+ *
+ * @throws CoreException
+ */
+ private GzipPostMethod postFormData(String formUrl, NameValuePair[] formData, IProgressMonitor monitor)
+ throws IOException, CoreException {
+
+ GzipPostMethod postMethod = null;
+ monitor = Policy.monitorFor(monitor);
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ authenticate(monitor);
+
+ postMethod = new GzipPostMethod(WebUtil.getRequestPath(repositoryUrl.toString() + formUrl), true);
+ postMethod.setRequestHeader(
+ "Content-Type", "application/x-www-form-urlencoded; charset=" + getCharacterEncoding()); //$NON-NLS-1$ //$NON-NLS-2$
+
+ httpClient.getHttpConnectionManager().getParams().setSoTimeout(WebUtil.getConnectionTimeout());
+
+ postMethod.setRequestBody(formData);
+ postMethod.setDoAuthentication(true);
+
+ int status = WebUtil.execute(httpClient, hostConfiguration, postMethod, monitor);
+ if (status == HttpStatus.SC_OK) {
+ return postMethod;
+ } else if (status == HttpStatus.SC_MOVED_TEMPORARILY) {
+ String redirectLocation;
+ Header locationHeader = postMethod.getResponseHeader("location"); //$NON-NLS-1$
+ if (locationHeader != null) {
+ redirectLocation = locationHeader.getValue();
+ throw new RedirectException(redirectLocation);
+ }
+
+ }
+
+ postMethod.getResponseBodyNoop();
+ postMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repositoryUrl.toString(), new IOException(
+ "Communication error occurred during upload. \n\n" + HttpStatus.getStatusText(status)))); //$NON-NLS-1$
+
+ }
+
+ public void postUpdateAttachment(TaskAttribute taskAttribute, String action, IProgressMonitor monitor)
+ throws IOException, CoreException {
+ List<NameValuePair> formData = new ArrayList<NameValuePair>(5);
+ boolean existingBugPosted = false;
+
+ formData.add(new NameValuePair("action", action)); //$NON-NLS-1$
+ formData.add(new NameValuePair("contenttypemethod", "manual")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ formData.add(new NameValuePair("id", taskAttribute.getValue())); //$NON-NLS-1$
+ Collection<TaskAttribute> attributes = taskAttribute.getAttributes().values();
+ Iterator<TaskAttribute> itr = attributes.iterator();
+ while (itr.hasNext()) {
+ TaskAttribute a = itr.next();
+ String id = a.getId();
+ String value = a.getValue();
+ if (id.equals(TaskAttribute.ATTACHMENT_AUTHOR) || id.equals("date") || id.equals("size") //$NON-NLS-1$ //$NON-NLS-2$
+ || id.equals(TaskAttribute.ATTACHMENT_URL)) {
+ continue;
+ }
+
+ if (id.equals("desc")) { //$NON-NLS-1$
+ id = "description"; //$NON-NLS-1$
+ }
+ if (id.equals("ctype")) { //$NON-NLS-1$
+ id = "contenttypeentry"; //$NON-NLS-1$
+ }
+
+ if (id.equals(TaskAttribute.ATTACHMENT_IS_DEPRECATED)) {
+ id = "isobsolete"; //$NON-NLS-1$
+ }
+ if (id.equals(TaskAttribute.ATTACHMENT_IS_PATCH)) {
+ id = "ispatch"; //$NON-NLS-1$
+ }
+ formData.add(new NameValuePair(id, value));
+ }
+ GzipPostMethod method = null;
+ InputStream input = null;
+ try {
+ method = postFormData(PROCESS_ATTACHMENT_CGI, formData.toArray(new NameValuePair[formData.size()]), monitor);
+
+ if (method == null) {
+ throw new IOException(Messages.BugzillaClient_could_not_post_form_null_returned);
+ }
+
+ input = getResponseStream(method, monitor);
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(input, method.getRequestCharSet()));
+ if (in.markSupported()) {
+ in.mark(1028);
+ }
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+
+ boolean isTitle = false;
+ String title = ""; //$NON-NLS-1$
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; //$NON-NLS-1$
+ continue;
+ } else if (token.getType() == Token.TAG && ((HtmlTag) token.getValue()).getTagType() == Tag.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_CHANGES_SUBMITTED).iterator(); iterator.hasNext()
+ && !existingBugPosted;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ existingBugPosted = existingBugPosted || title.indexOf(value) != -1;
+ }
+ break;
+ }
+ }
+ }
+
+ if (existingBugPosted != true) {
+ try {
+ if (in.markSupported()) {
+ in.reset();
+ }
+ } catch (IOException e) {
+ // ignore
+ }
+ parseHtmlError(in);
+ }
+
+ } catch (ParseException e) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); //$NON-NLS-1$ //$NON-NLS-2$
+ } finally {
+ if (input != null) {
+ input.close();
+ }
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ }
+
+ public RepositoryResponse postTaskData(TaskData taskData, IProgressMonitor monitor) throws IOException,
+ CoreException {
+ NameValuePair[] formData = null;
+ monitor = Policy.monitorFor(monitor);
+ BugzillaRepositoryResponse response;
+ authenticate(new SubProgressMonitor(monitor, 1));
+
+ if (repositoryConfiguration == null) {
+ getRepositoryConfiguration(new SubProgressMonitor(monitor, 1));
+ BugzillaCorePlugin.addRepositoryConfiguration(repositoryConfiguration);
+ }
+
+ if (taskData == null) {
+ return null;
+ } else if (taskData.isNew()) {
+ formData = getPairsForNew(taskData);
+ } else {
+ formData = getPairsForExisting(taskData, new SubProgressMonitor(monitor, 1));
+ }
+
+ String result = null;
+ GzipPostMethod method = null;
+ InputStream input = null;
+ try {
+ if (taskData.isNew()) {
+ method = postFormData(POST_BUG_CGI, formData, monitor);
+ } else {
+ method = postFormData(PROCESS_BUG_CGI, formData, monitor);
+ }
+
+ if (method == null) {
+ throw new IOException("Could not post form, client returned null method."); //$NON-NLS-1$
+ }
+
+ input = getResponseStream(method, monitor);
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(input, method.getRequestCharSet()));
+ if (in.markSupported()) {
+ in.mark(1028);
+ }
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+
+ boolean existingBugPosted = false;
+ boolean isTitle = false;
+ String title = ""; //$NON-NLS-1$
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; //$NON-NLS-1$
+ continue;
+ } else if (token.getType() == Token.TAG && ((HtmlTag) token.getValue()).getTagType() == Tag.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+
+ boolean found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_PROCESSED).iterator(); iterator.hasNext() && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (!taskData.isNew() && found) {
+ existingBugPosted = true;
+ } else if (taskData.isNew()) {
+
+ int startIndex = -1;
+
+ if (result == null) {
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_SUBMITTED).iterator(); iterator.hasNext();) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ int stopIndex = title.indexOf(value);
+ if (stopIndex > -1) {
+ for (iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_BUG).iterator(); iterator.hasNext();) {
+ value = iterator.next().toLowerCase(Locale.ENGLISH);
+ startIndex = title.indexOf(value);
+ if (startIndex > -1) {
+ startIndex = startIndex + value.length();
+ result = (title.substring(startIndex, stopIndex)).trim();
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ if (taskData.isNew()) {
+ response = new BugzillaRepositoryResponse(ResponseKind.TASK_CREATED, result);
+ } else {
+ response = new BugzillaRepositoryResponse(ResponseKind.TASK_UPDATED, taskData.getTaskId());
+ }
+ if ((!taskData.isNew() && existingBugPosted != true) || (taskData.isNew() && result == null)) {
+ try {
+ if (in.markSupported()) {
+ in.reset();
+ }
+ parseHtmlError(in);
+ } catch (IOException e) {
+ // ignore
+ }
+ } else {
+ try {
+ if (in.markSupported()) {
+ in.reset();
+ }
+ parseResultOK(in, response);
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ return response;
+ } catch (ParseException e) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); //$NON-NLS-1$//$NON-NLS-2$
+ } finally {
+ if (input != null) {
+ input.close();
+ }
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+
+ }
+
+ private NameValuePair[] getPairsForNew(TaskData taskData) {
+ Map<String, NameValuePair> fields = new HashMap<String, NameValuePair>();
+
+ // go through all of the attributes and add them to
+ // the bug post
+ Collection<TaskAttribute> attributes = new ArrayList<TaskAttribute>(taskData.getRoot().getAttributes().values());
+ Iterator<TaskAttribute> itr = attributes.iterator();
+ while (itr.hasNext()) {
+ TaskAttribute a = itr.next();
+ if (a != null && a.getId() != null && a.getId().compareTo("") != 0) { //$NON-NLS-1$
+ String value = null;
+ value = a.getValue();
+ if (value == null) {
+ continue;
+ }
+ if (a.getId().equals(BugzillaAttribute.NEWCC.getKey())) {
+ TaskAttribute b = taskData.getRoot().createAttribute(BugzillaAttribute.CC.getKey());
+ b.getMetaData().defaults().setReadOnly(BugzillaAttribute.CC.isReadOnly()).setKind(
+ BugzillaAttribute.CC.getKind()).setLabel(BugzillaAttribute.CC.toString()).setType(
+ BugzillaAttribute.CC.getType());
+ for (String val : a.getValues()) {
+ if (val != null) {
+ b.addValue(val);
+ }
+ }
+ a = b;
+ cleanIfShortLogin(a);
+ } else {
+ cleanQAContact(a);
+ }
+ fields.put(a.getId(), new NameValuePair(a.getId(), value));
+ }
+ }
+
+ TaskAttribute descAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION);
+ if (descAttribute != null && !descAttribute.getValue().equals("")) { //$NON-NLS-1$
+ BugzillaVersion bugzillaVersion = null;
+ if (repositoryConfiguration != null) {
+ bugzillaVersion = repositoryConfiguration.getInstallVersion();
+ } else {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_18) == 0) {
+ fields.put(KEY_COMMENT, new NameValuePair(KEY_COMMENT, formatTextToLineWrap(descAttribute.getValue(),
+ true)));
+ } else {
+ fields.put(KEY_COMMENT, new NameValuePair(KEY_COMMENT, descAttribute.getValue()));
+ }
+ }
+
+ return fields.values().toArray(new NameValuePair[fields.size()]);
+
+ }
+
+ private void cleanQAContact(TaskAttribute a) {
+ if (a.getId().equals(BugzillaAttribute.QA_CONTACT.getKey())) {
+ cleanIfShortLogin(a);
+ }
+ }
+
+ private void cleanIfShortLogin(TaskAttribute a) {
+ if ("true".equals(configParameters.get(IBugzillaConstants.REPOSITORY_SETTING_SHORT_LOGIN))) { //$NON-NLS-1$
+ if (a.getValue() != null && a.getValue().length() > 0) {
+ int atIndex = a.getValue().indexOf("@"); //$NON-NLS-1$
+ if (atIndex != -1) {
+ String newValue = a.getValue().substring(0, atIndex);
+ a.setValue(newValue);
+ }
+ }
+ }
+ }
+
+ private NameValuePair[] getPairsForExisting(TaskData model, IProgressMonitor monitor) throws CoreException {
+ boolean groupSecurityEnabled = false;
+ Map<String, NameValuePair> fields = new HashMap<String, NameValuePair>();
+ fields.put(KEY_FORM_NAME, new NameValuePair(KEY_FORM_NAME, VAL_PROCESS_BUG));
+ // go through all of the attributes and add them to the bug post
+ Collection<TaskAttribute> attributes = model.getRoot().getAttributes().values();
+ Iterator<TaskAttribute> itr = attributes.iterator();
+ boolean tokenFound = false;
+ boolean tokenRequired = false;
+ while (itr.hasNext()) {
+ TaskAttribute a = itr.next();
+
+ if (a == null) {
+ continue;
+ } else {
+ String id = a.getId();
+ if (id.equalsIgnoreCase(BugzillaAttribute.TOKEN.getKey())) {
+ tokenFound = true;
+ } else if (id.equals(BugzillaAttribute.QA_CONTACT.getKey())
+ || id.equals(BugzillaAttribute.ASSIGNED_TO.getKey())) {
+ cleanIfShortLogin(a);
+ } else if (id.equals(BugzillaAttribute.REPORTER.getKey()) || id.equals(BugzillaAttribute.CC.getKey())
+ || id.equals(BugzillaAttribute.REMOVECC.getKey())
+ || id.equals(BugzillaAttribute.CREATION_TS.getKey())
+ || id.equals(BugzillaAttribute.BUG_STATUS.getKey())
+ || id.equals(BugzillaAttribute.VOTES.getKey())) {
+ continue;
+ } else if (id.equals(BugzillaAttribute.NEW_COMMENT.getKey())) {
+ BugzillaVersion bugzillaVersion = null;
+ if (repositoryConfiguration != null) {
+ bugzillaVersion = repositoryConfiguration.getInstallVersion();
+ } else {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_2_18) == 0) {
+ a.setValue(formatTextToLineWrap(a.getValue(), true));
+ }
+ } else if (id.equals(BugzillaAttribute.GROUP.getKey()) && a.getValue().length() > 0) {
+ groupSecurityEnabled = true;
+ }
+
+ if (a.getMetaData().getType() != null
+ && a.getMetaData().getType().equals(TaskAttribute.TYPE_MULTI_SELECT)) {
+ List<String> values = a.getValues();
+ int i = 0;
+ for (String string : values) {
+ fields.put(id + i++, new NameValuePair(id, string != null ? string : "")); //$NON-NLS-1$
+ }
+ } else if (id != null && id.compareTo("") != 0) { //$NON-NLS-1$
+ String value = a.getValue();
+ if (id.equals(BugzillaAttribute.DELTA_TS.getKey())) {
+ value = stripTimeZone(value);
+ }
+ if (id.startsWith("task.common.kind.flag_type") && repositoryConfiguration != null) { //$NON-NLS-1$
+ List<BugzillaFlag> flags = repositoryConfiguration.getFlags();
+ TaskAttribute requestee = a.getAttribute("requestee"); //$NON-NLS-1$
+ a = a.getAttribute("state"); //$NON-NLS-1$
+ value = a.getValue();
+ if (value.equals(" ")) { //$NON-NLS-1$
+ continue;
+ }
+ String flagname = a.getMetaData().getLabel();
+ BugzillaFlag theFlag = null;
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (flagname.equals(bugzillaFlag.getName())) {
+ theFlag = bugzillaFlag;
+ break;
+ }
+ }
+ if (theFlag != null) {
+ int flagTypeNumber = theFlag.getFlagId();
+ id = "flag_type-" + flagTypeNumber; //$NON-NLS-1$
+ value = a.getValue();
+ if (value.equals("?") && requestee != null) { //$NON-NLS-1$
+ fields.put("requestee_type-" + flagTypeNumber, new NameValuePair("requestee_type-" //$NON-NLS-1$ //$NON-NLS-2$
+ + flagTypeNumber, requestee.getValue() != null ? requestee.getValue() : "")); //$NON-NLS-1$
+ }
+ }
+ } else if (id.startsWith("task.common.kind.flag")) { //$NON-NLS-1$
+ TaskAttribute flagnumber = a.getAttribute("number"); //$NON-NLS-1$
+ TaskAttribute requestee = a.getAttribute("requestee"); //$NON-NLS-1$
+ a = a.getAttribute("state"); //$NON-NLS-1$
+ id = "flag-" + flagnumber.getValue(); //$NON-NLS-1$
+ value = a.getValue();
+ if (value.equals(" ")) { //$NON-NLS-1$
+ value = "X"; //$NON-NLS-1$
+ }
+ if (value.equals("?") && requestee != null) { //$NON-NLS-1$
+ fields.put("requestee-" + flagnumber.getValue(), new NameValuePair("requestee-" //$NON-NLS-1$//$NON-NLS-2$
+ + flagnumber.getValue(), requestee.getValue() != null ? requestee.getValue() : "")); //$NON-NLS-1$
+ }
+ } else if (id.startsWith("task.common.")) { //$NON-NLS-1$
+ // Don't post any remaining non-bugzilla specific attributes
+ continue;
+ }
+ fields.put(id, new NameValuePair(id, value != null ? value : "")); //$NON-NLS-1$
+ }
+ }
+ }
+
+ // when posting the bug id is encoded in a hidden field named 'id'
+ TaskAttribute attributeBugId = model.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey());
+ if (attributeBugId != null) {
+ fields.put(KEY_ID, new NameValuePair(KEY_ID, attributeBugId.getValue()));
+ }
+
+ // add the operation to the bug post
+ BugzillaVersion bugzillaVersion = null;
+ if (repositoryConfiguration != null) {
+ bugzillaVersion = repositoryConfiguration.getInstallVersion();
+ } else {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+ if (bugzillaVersion.compareTo(BugzillaVersion.BUGZILLA_3_2) < 0) {
+
+ TaskAttribute attributeOperation = model.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ if (attributeOperation == null) {
+ fields.put(KEY_KNOB, new NameValuePair(KEY_KNOB, VAL_NONE));
+ } else {
+ TaskAttribute originalOperation = model.getRoot().getAttribute(
+ TaskAttribute.PREFIX_OPERATION + attributeOperation.getValue());
+ if (originalOperation == null) {
+ // Work around for bug#241012
+ fields.put(KEY_KNOB, new NameValuePair(KEY_KNOB, VAL_NONE));
+ } else {
+ String inputAttributeId = originalOperation.getMetaData().getValue(
+ TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID);
+ if (inputAttributeId == null || inputAttributeId.equals("")) { //$NON-NLS-1$
+ String sel = attributeOperation.getValue();
+ fields.put(KEY_KNOB, new NameValuePair(KEY_KNOB, sel));
+ } else {
+ fields.put(KEY_KNOB, new NameValuePair(KEY_KNOB, attributeOperation.getValue()));
+ TaskAttribute inputAttribute = attributeOperation.getTaskData().getRoot().getAttribute(
+ inputAttributeId);
+ if (inputAttribute != null) {
+ if (inputAttribute.getOptions().size() > 0) {
+ String sel = inputAttribute.getValue();
+ String knob = inputAttribute.getId();
+ if (knob.equals(BugzillaOperation.resolve.getInputId())) {
+ knob = BugzillaAttribute.RESOLUTION.getKey();
+ }
+ fields.put(knob, new NameValuePair(knob, inputAttribute.getOption(sel)));
+ } else {
+ String sel = inputAttribute.getValue();
+ String knob = attributeOperation.getValue();
+ if (knob.equals(BugzillaOperation.reassign.toString())) {
+ knob = BugzillaAttribute.ASSIGNED_TO.getKey();
+ }
+ fields.put(knob, new NameValuePair(knob, sel));
+ }
+ }
+ }
+ }
+ if (model.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW) != null
+ && model.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW).getValue().length() > 0) {
+ fields.put(KEY_COMMENT, new NameValuePair(KEY_COMMENT, model.getRoot().getMappedAttribute(
+ TaskAttribute.COMMENT_NEW).getValue()));
+ } else if (attributeOperation != null
+ && attributeOperation.getValue().equals(BugzillaOperation.duplicate.toString())) {
+ // fix for bug#198677
+ fields.put(KEY_COMMENT, new NameValuePair(KEY_COMMENT, "")); //$NON-NLS-1$
+ }
+ }
+ } else {
+ // A token is required for bugzilla 3.2.1 and newer
+ tokenRequired = bugzillaVersion.compareTo(BugzillaVersion.BUGZILLA_3_2) > 0;
+ String fieldName = BugzillaAttribute.BUG_STATUS.getKey();
+ TaskAttribute attributeStatus = model.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ TaskAttribute attributeOperation = model.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ if (attributeOperation == null) {
+ fields.put(fieldName, new NameValuePair(fieldName, attributeStatus.getValue()));
+ } else {
+ TaskAttribute originalOperation = model.getRoot().getAttribute(
+ TaskAttribute.PREFIX_OPERATION + attributeOperation.getValue());
+ if (originalOperation == null) {
+ // Work around for bug#241012
+ fields.put(fieldName, new NameValuePair(fieldName, attributeStatus.getValue()));
+ } else {
+ String inputAttributeId = originalOperation.getMetaData().getValue(
+ TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID);
+ if (originalOperation == null) {
+ fields.put(fieldName, new NameValuePair(fieldName, attributeStatus.getValue()));
+ } else {
+ String selOp = attributeOperation.getValue().toUpperCase();
+ if (selOp.equals("NONE")) { //$NON-NLS-1$
+ selOp = attributeStatus.getValue();
+ }
+ if (selOp.equals("ACCEPT")) { //$NON-NLS-1$
+ selOp = "ASSIGNED"; //$NON-NLS-1$
+ }
+ if (selOp.equals("RESOLVE")) { //$NON-NLS-1$
+ selOp = "RESOLVED"; //$NON-NLS-1$
+ }
+ if (selOp.equals("VERIFY")) { //$NON-NLS-1$
+ selOp = "VERIFIED"; //$NON-NLS-1$
+ }
+ if (selOp.equals("CLOSE")) { //$NON-NLS-1$
+ selOp = "CLOSED"; //$NON-NLS-1$
+ }
+ if (selOp.equals("REOPEN")) { //$NON-NLS-1$
+ selOp = "REOPENED"; //$NON-NLS-1$
+ }
+ if (selOp.equals("DUPLICATE")) { //$NON-NLS-1$
+ selOp = "RESOLVED"; //$NON-NLS-1$
+ String knob = BugzillaAttribute.RESOLUTION.getKey();
+ fields.put(knob, new NameValuePair(knob, "DUPLICATE")); //$NON-NLS-1$
+ }
+
+ fields.put(fieldName, new NameValuePair(fieldName, selOp));
+ if (inputAttributeId != null && !inputAttributeId.equals("")) { //$NON-NLS-1$
+ TaskAttribute inputAttribute = attributeOperation.getTaskData().getRoot().getAttribute(
+ inputAttributeId);
+ if (inputAttribute != null) {
+ if (inputAttribute.getOptions().size() > 0) {
+ String sel = inputAttribute.getValue();
+ String knob = inputAttribute.getId();
+ if (knob.equals(BugzillaOperation.resolve.getInputId())) {
+ knob = BugzillaAttribute.RESOLUTION.getKey();
+ }
+ fields.put(knob, new NameValuePair(knob, inputAttribute.getOption(sel)));
+ } else {
+ String sel = inputAttribute.getValue();
+ String knob = attributeOperation.getValue();
+ if (knob.equals("duplicate")) { //$NON-NLS-1$
+ knob = inputAttributeId;
+ }
+ if (knob.equals(BugzillaOperation.reassign.toString())) {
+ knob = BugzillaAttribute.ASSIGNED_TO.getKey();
+ }
+ fields.put(knob, new NameValuePair(knob, sel));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (model.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW) != null
+ && model.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW).getValue().length() > 0) {
+ fields.put(KEY_COMMENT, new NameValuePair(KEY_COMMENT, model.getRoot().getMappedAttribute(
+ TaskAttribute.COMMENT_NEW).getValue()));
+ }
+ }
+
+ if (model.getRoot().getMappedAttribute(BugzillaAttribute.SHORT_DESC.getKey()) != null) {
+ fields.put(KEY_SHORT_DESC, new NameValuePair(KEY_SHORT_DESC, model.getRoot().getMappedAttribute(
+ BugzillaAttribute.SHORT_DESC.getKey()).getValue()));
+ }
+
+ TaskAttribute attributeRemoveCC = model.getRoot().getMappedAttribute(BugzillaAttribute.REMOVECC.getKey());
+ if (attributeRemoveCC != null) {
+ List<String> removeCC = attributeRemoveCC.getValues();
+ if (removeCC != null && removeCC.size() > 0) {
+ String[] s = new String[removeCC.size()];
+ fields.put(KEY_CC, new NameValuePair(KEY_CC, toCommaSeparatedList(removeCC.toArray(s))));
+ fields.put(BugzillaAttribute.REMOVECC.getKey(), new NameValuePair(BugzillaAttribute.REMOVECC.getKey(),
+ VAL_TRUE));
+ }
+ }
+
+ // check for security token (required for successful submit on Bugzilla 3.2.1 and greater but not in xml until Bugzilla 3.2.3 bug#263318)
+
+ if (groupSecurityEnabled || (!tokenFound && tokenRequired)) {
+ // get security and token if exists from html and include in post
+ HtmlInformation htmlInfo = getHtmlOnlyInformation(model, monitor);
+
+ if (groupSecurityEnabled) {
+ for (String key : htmlInfo.getGroups().keySet()) {
+ fields.put(key, new NameValuePair(key, htmlInfo.getGroups().get(key)));
+ }
+ }
+ if (htmlInfo.getToken() != null && htmlInfo.getToken().length() > 0 && tokenRequired) {
+ NameValuePair tokenPair = fields.get(BugzillaAttribute.TOKEN.getKey());
+ if (tokenPair != null) {
+ tokenPair.setValue(htmlInfo.getToken());
+ } else {
+ fields.put(BugzillaAttribute.TOKEN.getKey(), new NameValuePair(BugzillaAttribute.TOKEN.getKey(),
+ htmlInfo.getToken()));
+ }
+ }
+ }
+ return fields.values().toArray(new NameValuePair[fields.size()]);
+
+ }
+
+ private HtmlInformation getHtmlOnlyInformation(TaskData taskData, IProgressMonitor monitor) throws CoreException {
+ HtmlInformation htmlInfo = new HtmlInformation();
+ authenticate(new SubProgressMonitor(monitor, 1));
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+
+ String bugUrl = taskData.getRepositoryUrl() + IBugzillaConstants.URL_GET_SHOW_BUG + taskData.getTaskId();
+ GzipGetMethod getMethod = new GzipGetMethod(WebUtil.getRequestPath(bugUrl), false);
+ getMethod.setRequestHeader("Content-Type", "text/xml; charset=" + getCharacterEncoding()); //$NON-NLS-1$ //$NON-NLS-2$
+ httpClient.getParams().setParameter("http.protocol.single-cookie-header", true); //$NON-NLS-1$
+ getMethod.setDoAuthentication(true);
+
+ int code;
+ InputStream inStream = null;
+ try {
+ code = WebUtil.execute(httpClient, hostConfiguration, getMethod, monitor);
+ if (code == HttpURLConnection.HTTP_OK) {
+ inStream = getResponseStream(getMethod, monitor);
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(new BufferedReader(new InputStreamReader(
+ inStream, getCharacterEncoding())), null);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.INPUT
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ // String name = tag.getAttribute("name");
+ String id = tag.getAttribute("id"); //$NON-NLS-1$
+ String checkedValue = tag.getAttribute("checked"); //$NON-NLS-1$
+ String type = tag.getAttribute("type"); //$NON-NLS-1$
+ String name = tag.getAttribute("name"); //$NON-NLS-1$
+ String value = tag.getAttribute("value"); //$NON-NLS-1$
+ if (type != null && type.equalsIgnoreCase("checkbox") && id != null && id.startsWith("bit-")) { //$NON-NLS-1$ //$NON-NLS-2$
+ htmlInfo.getGroups().put(id, checkedValue);
+ } else if (name != null && name.equalsIgnoreCase(BugzillaAttribute.TOKEN.getKey())
+ && value != null && value.length() > 0) {
+ htmlInfo.setToken(value);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Unable to retrieve group security information", e)); //$NON-NLS-1$
+ } finally {
+ if (inStream != null) {
+ try {
+ inStream.close();
+ } catch (IOException e) {
+ //ignore
+ }
+ }
+ }
+ return htmlInfo;
+ }
+
+ public static String stripTimeZone(String longTime) {
+ String result = longTime;
+ if (longTime != null) {
+ String[] values = longTime.split(" "); //$NON-NLS-1$
+ if (values != null && values.length > 2) {
+ result = values[0] + " " + values[1]; //$NON-NLS-1$
+ }
+ }
+ return result;
+ }
+
+ private static String toCommaSeparatedList(String[] strings) {
+ StringBuffer buffer = new StringBuffer();
+ for (int i = 0; i < strings.length; i++) {
+ buffer.append(strings[i]);
+ if (i != strings.length - 1) {
+ buffer.append(","); //$NON-NLS-1$
+ }
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * Utility method for determining what potential error has occurred from a bugzilla html reponse page
+ */
+ private void parseHtmlError(InputStream inputStream) throws IOException, CoreException {
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
+ parseHtmlError(in);
+ }
+
+ private void parseHtmlError(BufferedReader in) throws IOException, CoreException {
+
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+
+ boolean isTitle = false;
+ String title = ""; //$NON-NLS-1$
+ String body = ""; //$NON-NLS-1$
+
+ try {
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ body += token.toString();
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase(Locale.ENGLISH) + " "; //$NON-NLS-1$
+ continue;
+ } else if (token.getType() == Token.TAG && ((HtmlTag) token.getValue()).getTagType() == Tag.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+
+ boolean found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_ERROR_LOGIN).iterator(); iterator.hasNext() && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(), title));
+ }
+ found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_ERROR_COLLISION).iterator(); iterator.hasNext()
+ && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.REPOSITORY_COLLISION, repositoryUrl.toString()));
+ }
+ found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_ERROR_COMMENT_REQUIRED).iterator(); iterator.hasNext()
+ && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ throw new CoreException(new BugzillaStatus(IStatus.INFO, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.REPOSITORY_COMMENT_REQUIRED));
+ }
+ found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_SUSPICIOUS_ACTION).iterator(); iterator.hasNext()
+ && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ IBugzillaConstants.REPOSITORY_STATUS_SUSPICIOUS_ACTION));
+ }
+ found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_ERROR_LOGGED_OUT).iterator(); iterator.hasNext()
+ && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ loggedIn = false;
+ // throw new
+ // BugzillaException(IBugzillaConstants.LOGGED_OUT);
+ throw new CoreException(new BugzillaStatus(IStatus.INFO, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.REPOSITORY_LOGGED_OUT,
+ "You have been logged out. Please retry operation.")); //$NON-NLS-1$
+ }
+ found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_CHANGES_SUBMITTED).iterator(); iterator.hasNext()
+ && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ return;
+ }
+ isTitle = false;
+ }
+ }
+ }
+
+ throw new CoreException(RepositoryStatus.createHtmlStatus(repositoryUrl.toString(), IStatus.INFO,
+ BugzillaCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY,
+ "A repository error has occurred.", body)); //$NON-NLS-1$
+
+ } catch (ParseException e) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); //$NON-NLS-1$ //$NON-NLS-2$
+ } finally {
+ in.close();
+ }
+ }
+
+ public TaskHistory getHistory(String taskId, IProgressMonitor monitor) throws IOException, CoreException {
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ authenticate(monitor);
+ GzipGetMethod method = null;
+ try {
+ String url = repositoryUrl + IBugzillaConstants.SHOW_ACTIVITY + taskId;
+ method = getConnectGzip(url, monitor);
+ if (method != null) {
+ InputStream in = getResponseStream(method, monitor);
+ try {
+ BugzillaTaskHistoryParser parser = new BugzillaTaskHistoryParser(in, getCharacterEncoding());
+ try {
+ return parser.retrieveHistory(bugzillaLanguageSettings);
+ } catch (LoginException e) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+ IBugzillaConstants.INVALID_CREDENTIALS));
+ } catch (ParseException e) {
+ loggedIn = false;
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " //$NON-NLS-1$
+ + repositoryUrl.toString() + ".")); //$NON-NLS-1$
+ }
+ } finally {
+ in.close();
+ }
+ }
+
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ return null;
+ }
+
+ public void getTaskData(Set<String> taskIds, final TaskDataCollector collector, final TaskAttributeMapper mapper,
+ final IProgressMonitor monitor) throws IOException, CoreException {
+
+ if (repositoryConfiguration == null) {
+ getRepositoryConfiguration(new SubProgressMonitor(monitor, 1));
+ BugzillaCorePlugin.addRepositoryConfiguration(repositoryConfiguration);
+ }
+
+ GzipPostMethod method = null;
+ HashMap<String, TaskData> taskDataMap = new HashMap<String, TaskData>();
+ // make a copy to modify set
+ taskIds = new HashSet<String>(taskIds);
+ int authenticationAttempt = 0;
+ while (taskIds.size() > 0) {
+
+ try {
+
+ Set<String> idsToRetrieve = new HashSet<String>();
+ Iterator<String> itr = taskIds.iterator();
+ for (int x = 0; itr.hasNext() && x < MAX_RETRIEVED_PER_QUERY; x++) {
+ idsToRetrieve.add(itr.next());
+ }
+
+ NameValuePair[] formData = new NameValuePair[idsToRetrieve.size() + 2];
+
+ if (idsToRetrieve.size() == 0) {
+ return;
+ }
+
+ itr = idsToRetrieve.iterator();
+ int x = 0;
+ for (; itr.hasNext(); x++) {
+ String taskId = itr.next();
+ formData[x] = new NameValuePair("id", taskId); //$NON-NLS-1$
+ TaskData taskData = new TaskData(mapper, getConnectorKind(), repositoryUrl.toString(), taskId);
+ setupExistingBugAttributes(repositoryUrl.toString(), taskData);
+ taskDataMap.put(taskId, taskData);
+ }
+ formData[x++] = new NameValuePair("ctype", "xml"); //$NON-NLS-1$ //$NON-NLS-2$
+ formData[x] = new NameValuePair("excludefield", "attachmentdata"); //$NON-NLS-1$ //$NON-NLS-2$
+ method = postFormData(IBugzillaConstants.URL_POST_SHOW_BUG, formData, monitor);
+ if (method == null) {
+ throw new IOException("Could not post form, client returned null method."); //$NON-NLS-1$
+ }
+
+ boolean parseable = false;
+ if (method.getResponseHeader("Content-Type") != null) { //$NON-NLS-1$
+ Header responseTypeHeader = method.getResponseHeader("Content-Type"); //$NON-NLS-1$
+ for (String type : VALID_CONFIG_CONTENT_TYPES) {
+ if (responseTypeHeader.getValue().toLowerCase(Locale.ENGLISH).contains(type)) {
+ InputStream input = getResponseStream(method, monitor);
+ try {
+ MultiBugReportFactory factory = new MultiBugReportFactory(input, getCharacterEncoding());
+ List<BugzillaCustomField> customFields = new ArrayList<BugzillaCustomField>();
+ if (repositoryConfiguration != null) {
+ customFields = repositoryConfiguration.getCustomFields();
+ }
+ factory.populateReport(taskDataMap, collector, mapper, customFields);
+ taskIds.removeAll(idsToRetrieve);
+ taskDataMap.clear();
+ parseable = true;
+ break;
+ } finally {
+ input.close();
+ }
+ }
+ }
+ }
+
+ if (!parseable) {
+ parseHtmlError(getResponseStream(method, monitor));
+ break;
+ }
+ } catch (CoreException c) {
+ if (c.getStatus().getCode() == RepositoryStatus.ERROR_REPOSITORY_LOGIN && authenticationAttempt < 1) {
+ loggedIn = false;
+ authenticationAttempt++;
+ //StatusHandler.log(c.getStatus());
+ } else {
+ throw c;
+ }
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ }
+ }
+
+ protected String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ public String getConfigurationTimestamp(IProgressMonitor monitor) throws CoreException {
+ if (!lastModifiedSupported) {
+ return null;
+ }
+ String lastModified = null;
+ HeadMethod method = null;
+ try {
+ method = connectHead(repositoryUrl + IBugzillaConstants.URL_GET_CONFIG_RDF, monitor);
+
+ Header lastModifiedHeader = method.getResponseHeader("Last-Modified"); //$NON-NLS-1$
+ if (lastModifiedHeader != null && lastModifiedHeader.getValue() != null
+ && lastModifiedHeader.getValue().length() > 0) {
+ lastModified = lastModifiedHeader.getValue();
+ } else {
+ lastModifiedSupported = false;
+ }
+
+ } catch (Exception e) {
+
+ lastModifiedSupported = false;
+
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Error retrieving configuration timestamp", e)); //$NON-NLS-1$
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ return lastModified;
+ }
+
+ private HeadMethod connectHead(String requestURL, IProgressMonitor monitor) throws IOException, CoreException {
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ for (int attempt = 0; attempt < 2; attempt++) {
+ // force authentication
+ authenticate(monitor);
+
+ HeadMethod headMethod = new HeadMethod(WebUtil.getRequestPath(requestURL));
+ if (requestURL.contains(QUERY_DELIMITER)) {
+ headMethod.setQueryString(requestURL.substring(requestURL.indexOf(QUERY_DELIMITER)));
+ }
+
+ headMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" //$NON-NLS-1$ //$NON-NLS-2$
+ + getCharacterEncoding());
+
+ // WARNING!! Setting browser compatability breaks Bugzilla
+ // authentication
+ // getMethod.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
+
+// headMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new BugzillaRetryHandler());
+ headMethod.setDoAuthentication(true);
+
+ int code;
+ try {
+ code = WebUtil.execute(httpClient, hostConfiguration, headMethod, monitor);
+ } catch (IOException e) {
+ headMethod.getResponseBody();
+ headMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repositoryUrl.toString(), e));
+ }
+
+ if (code == HttpURLConnection.HTTP_OK) {
+ return headMethod;
+ } else if (code == HttpURLConnection.HTTP_UNAUTHORIZED || code == HttpURLConnection.HTTP_FORBIDDEN) {
+ headMethod.getResponseBody();
+ // login or reauthenticate due to an expired session
+ headMethod.releaseConnection();
+ loggedIn = false;
+ authenticate(monitor);
+ } else if (code == HttpURLConnection.HTTP_PROXY_AUTH) {
+ loggedIn = false;
+ headMethod.getResponseBody();
+ headMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, repositoryUrl.toString(),
+ "Proxy authentication required")); //$NON-NLS-1$
+ } else {
+ headMethod.getResponseBody();
+ headMethod.releaseConnection();
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_NETWORK, "Http error: " + HttpStatus.getStatusText(code))); //$NON-NLS-1$
+ // throw new IOException("HttpClient connection error response
+ // code: " + code);
+ }
+ }
+
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "All connection attempts to " + repositoryUrl.toString() //$NON-NLS-1$
+ + " failed. Please verify connection and authentication information.")); //$NON-NLS-1$
+ }
+
+ public void setRepositoryConfiguration(RepositoryConfiguration repositoryConfiguration) {
+ this.repositoryConfiguration = repositoryConfiguration;
+ }
+
+ public RepositoryConfiguration getRepositoryConfiguration() {
+ return repositoryConfiguration;
+ }
+
+ /**
+ * Break text up into lines so that it is displayed properly in bugzilla
+ */
+ public static String formatTextToLineWrap(String origText, boolean hardWrap) {
+ if (!hardWrap) {
+ return origText;
+ } else {
+ String newText = ""; //$NON-NLS-1$
+
+ while (!origText.equals("")) { //$NON-NLS-1$
+ int newLine = origText.indexOf('\n');
+ if (newLine == -1 || newLine > WRAP_LENGTH) {
+ if (origText.length() > WRAP_LENGTH) {
+ int spaceIndex = origText.lastIndexOf(" ", WRAP_LENGTH); //$NON-NLS-1$
+ if (spaceIndex == -1) {
+ spaceIndex = origText.indexOf(" ", WRAP_LENGTH); //$NON-NLS-1$
+ if (spaceIndex == -1) {
+ spaceIndex = newLine;
+ }
+ }
+ newText = newText + origText.substring(0, spaceIndex) + "\n"; //$NON-NLS-1$
+ if (origText.charAt(spaceIndex) == ' ' || origText.charAt(spaceIndex) == '\n') {
+ origText = origText.substring(spaceIndex + 1, origText.length());
+ } else {
+ origText = origText.substring(spaceIndex, origText.length());
+ }
+ } else {
+ newText = newText + origText;
+ origText = ""; //$NON-NLS-1$
+ }
+ } else {
+ newText = newText + origText.substring(0, newLine + 1);
+ origText = origText.substring(newLine + 1, origText.length());
+ }
+ }
+ return newText;
+ }
+ }
+
+ public static boolean isValidUrl(String url) {
+ if (url.startsWith("https://") || url.startsWith("http://")) { //$NON-NLS-1$//$NON-NLS-2$
+ try {
+ new URI(url, true, "UTF-8"); //$NON-NLS-1$
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ private class HtmlInformation {
+ private final Map<String, String> groups;
+
+ private String token;
+
+ public HtmlInformation() {
+ groups = new HashMap<String, String>();
+ }
+
+ public Map<String, String> getGroups() {
+ return groups;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ }
+
+ private void parseResultOK(BufferedReader in, BugzillaRepositoryResponse response) throws IOException,
+ CoreException {
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+
+ boolean isDT = false;
+ String dtString = ""; //$NON-NLS-1$
+ String body = ""; //$NON-NLS-1$
+ String lastDTValue = ""; //$NON-NLS-1$
+ boolean isCode = false;
+ String codeString = ""; //$NON-NLS-1$
+ try {
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ body += token.toString();
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.DT
+ && ((HtmlTag) (token.getValue())).isEndTag()) {
+ isDT = false;
+ if (!dtString.equals("")) { //$NON-NLS-1$
+ lastDTValue = dtString;
+ }
+ dtString = ""; //$NON-NLS-1$
+ continue;
+ }
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.CODE
+ && ((HtmlTag) (token.getValue())).isEndTag()) {
+ isCode = false;
+ if (codeString.length() > 0) {
+ codeString = codeString.replace("@", "@"); //$NON-NLS-1$ //$NON-NLS-2$
+ response.addResponseData(lastDTValue, codeString);
+ }
+ dtString = ""; //$NON-NLS-1$
+ codeString = ""; //$NON-NLS-1$
+ continue;
+ }
+ if (isCode) {
+ codeString += (" " + token.getValue()); //$NON-NLS-1$
+ }
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.CODE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isCode = true;
+ codeString = ""; //$NON-NLS-1$
+ }
+ if (isDT) {
+ if (dtString.length() > 0) {
+ dtString += (" " + token.getValue()); //$NON-NLS-1$
+ } else {
+ dtString += token.getValue();
+ }
+ }
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.DT
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isDT = true;
+ continue;
+ }
+ }
+ } catch (ParseException e) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "Unable to parse response from " + repositoryUrl.toString() + ".")); //$NON-NLS-1$ //$NON-NLS-2$
+ } finally {
+ in.close();
+ in.read();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientFactory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientFactory.java
new file mode 100644
index 0000000..09fd7f8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientFactory.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.net.MalformedURLException;
+
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+
+/**
+ * @author Steffen Pingel
+ * @author Robert Elves (adaption for Bugzilla)
+ */
+public class BugzillaClientFactory {
+
+ protected static TaskRepositoryLocationFactory taskRepositoryLocationFactory = new TaskRepositoryLocationFactory();
+
+ public static BugzillaClient createClient(TaskRepository taskRepository) throws MalformedURLException {
+ String language = taskRepository.getProperty(IBugzillaConstants.BUGZILLA_LANGUAGE_SETTING);
+ if (language == null || language.equals("")) { //$NON-NLS-1$
+ language = IBugzillaConstants.DEFAULT_LANG;
+ }
+ BugzillaLanguageSettings languageSettings = BugzillaRepositoryConnector.getLanguageSetting(language);
+ AbstractWebLocation location = taskRepositoryLocationFactory.createWebLocation(taskRepository);
+ BugzillaClient client = new BugzillaClient(location, taskRepository.getCharacterEncoding(),
+ taskRepository.getProperties(), languageSettings);
+ return client;
+
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientManager.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientManager.java
new file mode 100644
index 0000000..c9ab0d8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaClientManager.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.net.MalformedURLException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ * @author Robert Elves (adaption for Bugzilla)
+ */
+public class BugzillaClientManager implements IRepositoryListener {
+
+ private final Map<String, BugzillaClient> clientByUrl = new HashMap<String, BugzillaClient>();
+
+ public BugzillaClientManager() {
+ }
+
+ public BugzillaClient getClient(TaskRepository taskRepository, IProgressMonitor monitor) throws CoreException {
+ BugzillaClient client;
+ synchronized (clientByUrl) {
+ client = clientByUrl.get(taskRepository.getRepositoryUrl());
+ if (client == null) {
+ String language = taskRepository.getProperty(IBugzillaConstants.BUGZILLA_LANGUAGE_SETTING);
+ if (language == null || language.equals("")) { //$NON-NLS-1$
+ language = IBugzillaConstants.DEFAULT_LANG;
+ }
+ try {
+ client = createClient(taskRepository);
+ } catch (MalformedURLException e) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Malformed Repository Url", e)); //$NON-NLS-1$
+ }
+ clientByUrl.put(taskRepository.getRepositoryUrl(), client);
+ }
+ RepositoryConfiguration config = BugzillaCorePlugin.getRepositoryConfiguration(taskRepository.getUrl());
+ client.setRepositoryConfiguration(config);
+ }
+ return client;
+ }
+
+ protected BugzillaClient createClient(TaskRepository taskRepository) throws MalformedURLException {
+ return BugzillaClientFactory.createClient(taskRepository);
+ }
+
+ public void repositoryAdded(TaskRepository repository) {
+ // make sure there is no stale client still in the cache, bug #149939
+ removeClient(repository);
+ }
+
+ public void repositoryRemoved(TaskRepository repository) {
+ removeClient(repository);
+ }
+
+ private void removeClient(TaskRepository repository) {
+ synchronized (clientByUrl) {
+ clientByUrl.remove(repository.getRepositoryUrl());
+ }
+ }
+
+ public void repositorySettingsChanged(TaskRepository repository) {
+ removeClient(repository);
+ }
+
+ public void repositoryUrlChanged(TaskRepository repository, String oldUrl) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaCorePlugin.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaCorePlugin.java
new file mode 100644
index 0000000..aaaf153
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaCorePlugin.java
@@ -0,0 +1,447 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaCorePlugin extends Plugin {
+
+ private static final String ERROR_DELETING_CONFIGURATION = "Error removing corrupt repository configuration file."; //$NON-NLS-1$
+
+ private static final String ERROR_INCOMPATIBLE_CONFIGURATION = "Reset Bugzilla repository configuration cache due to format change"; //$NON-NLS-1$
+
+ public static final String CONNECTOR_KIND = "bugzilla"; //$NON-NLS-1$
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.bugzilla"; //$NON-NLS-1$
+
+ private static BugzillaCorePlugin INSTANCE;
+
+ private static boolean cacheFileRead = false;
+
+ private static File repositoryConfigurationFile = null;
+
+ private static BugzillaRepositoryConnector connector;
+
+ private static final String OPTION_ALL = "All"; //$NON-NLS-1$
+
+ // A Map from Java's Platform to Buzilla's
+ private final Map<String, String> java2buzillaPlatformMap = new HashMap<String, String>();
+
+ /** Product configuration for the current server */
+ private static Map<String, RepositoryConfiguration> repositoryConfigurations = new HashMap<String, RepositoryConfiguration>();
+
+ public BugzillaCorePlugin() {
+ super();
+ java2buzillaPlatformMap.put("x86", "PC"); // can be PC or Macintosh! //$NON-NLS-1$ //$NON-NLS-2$
+ java2buzillaPlatformMap.put("x86_64", "PC"); //$NON-NLS-1$ //$NON-NLS-2$
+ java2buzillaPlatformMap.put("ia64", "PC"); //$NON-NLS-1$ //$NON-NLS-2$
+ java2buzillaPlatformMap.put("ia64_32", "PC"); //$NON-NLS-1$ //$NON-NLS-2$
+ java2buzillaPlatformMap.put("sparc", "Sun"); //$NON-NLS-1$ //$NON-NLS-2$
+ java2buzillaPlatformMap.put("ppc", "Power PC"); // not Power! //$NON-NLS-1$ //$NON-NLS-2$
+
+ }
+
+ public static BugzillaCorePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ INSTANCE = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ writeRepositoryConfigFile();
+
+ INSTANCE = null;
+ super.stop(context);
+ }
+
+ static void setConnector(BugzillaRepositoryConnector theConnector) {
+ connector = theConnector;
+ }
+
+ public static Map<String, RepositoryConfiguration> getConfigurations() {
+ readRepositoryConfigurationFile();
+ return repositoryConfigurations;
+ }
+
+ public static void setConfigurationCacheFile(File file) {
+ repositoryConfigurationFile = file;
+ }
+
+ /**
+ * @since 2.1
+ * @return cached repository configuration. If not already cached, null is returned.
+ */
+ public static RepositoryConfiguration getRepositoryConfiguration(String repositoryUrl) {
+ readRepositoryConfigurationFile();
+ return repositoryConfigurations.get(repositoryUrl);
+ }
+
+ /**
+ * Retrieves the latest repository configuration from the server
+ */
+ public static RepositoryConfiguration getRepositoryConfiguration(TaskRepository repository, boolean forceRefresh,
+ IProgressMonitor monitor) throws CoreException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ readRepositoryConfigurationFile();
+ RepositoryConfiguration configuration;
+ configuration = repositoryConfigurations.get(repository.getRepositoryUrl());
+ if (configuration == null || forceRefresh) {
+ synchronized (repositoryConfigurations) {
+ // check if another thread already retrieved configuration
+ configuration = repositoryConfigurations.get(repository.getRepositoryUrl());
+ if (configuration == null || forceRefresh) {
+ BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
+ configuration = client.getRepositoryConfiguration(monitor);
+ if (configuration != null) {
+ internalAddConfiguration(configuration);
+ }
+ }
+ }
+ }
+ return configuration;//repositoryConfigurations.get(repository.getRepositoryUrl());
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, 1,
+ "Error retrieving task attributes from repository.\n\n" + e.getMessage(), e)); //$NON-NLS-1$
+ }
+ }
+
+ public static void addRepositoryConfiguration(RepositoryConfiguration config) {
+ if (config != null) {
+ readRepositoryConfigurationFile();
+ synchronized (repositoryConfigurations) {
+ internalAddConfiguration(config);
+ }
+ }
+ }
+
+ private static void internalAddConfiguration(RepositoryConfiguration config) {
+ repositoryConfigurations.remove(config.getRepositoryUrl());
+ repositoryConfigurations.put(config.getRepositoryUrl(), config);
+ }
+
+ // /**
+ // * Returns the path to the file cacheing the product configuration.
+ // */
+ // private static IPath getProductConfigurationCachePath() {
+ // IPath stateLocation =
+ // Platform.getStateLocation(BugzillaPlugin.getDefault().getBundle());
+ // IPath configFile = stateLocation.append("repositoryConfigurations");
+ // return configFile;
+ // }
+
+ /** public for testing */
+ public static void removeConfiguration(RepositoryConfiguration config) {
+ synchronized (repositoryConfigurations) {
+ repositoryConfigurations.remove(config.getRepositoryUrl());
+ }
+ }
+
+ /** public for testing */
+ public static synchronized void readRepositoryConfigurationFile() {
+
+ // IPath configFile = getProductConfigurationCachePath();
+ if (cacheFileRead || repositoryConfigurationFile == null || !repositoryConfigurationFile.exists()) {
+ return;
+ }
+
+ synchronized (repositoryConfigurations) {
+ ObjectInputStream in = null;
+ try {
+ in = new ObjectInputStream(new FileInputStream(repositoryConfigurationFile));
+ int size = in.readInt();
+ for (int nX = 0; nX < size; nX++) {
+ RepositoryConfiguration item = (RepositoryConfiguration) in.readObject();
+ if (item != null) {
+ repositoryConfigurations.put(item.getRepositoryUrl(), item);
+ }
+ }
+ } catch (Exception e) {
+ log(new Status(IStatus.INFO, BugzillaCorePlugin.ID_PLUGIN, ERROR_INCOMPATIBLE_CONFIGURATION));
+ try {
+ if (in != null) {
+ in.close();
+ }
+ if (repositoryConfigurationFile != null && repositoryConfigurationFile.exists()) {
+ if (repositoryConfigurationFile.delete()) {
+ // successfully deleted
+ } else {
+ log(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, 0,
+ ERROR_DELETING_CONFIGURATION, e));
+ }
+ }
+
+ } catch (Exception ex) {
+ log(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, 0, ERROR_DELETING_CONFIGURATION, e));
+ }
+ } finally {
+ cacheFileRead = true;
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ /** public for testing */
+ public static void writeRepositoryConfigFile() {
+ if (repositoryConfigurationFile != null) {
+ ObjectOutputStream out = null;
+ try {
+ Set<RepositoryConfiguration> tempConfigs;
+ synchronized (repositoryConfigurations) {
+ tempConfigs = new HashSet<RepositoryConfiguration>(repositoryConfigurations.values());
+ }
+ if (tempConfigs.size() > 0) {
+ out = new ObjectOutputStream(new FileOutputStream(repositoryConfigurationFile));
+ out.writeInt(tempConfigs.size());
+ for (RepositoryConfiguration repositoryConfiguration : tempConfigs) {
+ if (repositoryConfiguration != null) {
+ out.writeObject(repositoryConfiguration);
+ }
+ }
+ }
+ } catch (IOException e) {
+ log(e);
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Convenience method for logging statuses to the plugin log
+ *
+ * @param status
+ * the status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Convenience method for logging exceptions to the plugin log
+ *
+ * @param e
+ * the exception to log
+ */
+ public static void log(Exception e) {
+ String message = e.getMessage();
+ if (e.getMessage() == null) {
+ message = e.getClass().toString();
+ }
+ log(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, 0, message, e));
+ }
+
+ /**
+ * Returns the path to the file caching bug reports created while offline.
+ */
+ protected IPath getCachedBugReportPath() {
+ IPath stateLocation = Platform.getStateLocation(BugzillaCorePlugin.getDefault().getBundle());
+ IPath bugFile = stateLocation.append("bugReports"); //$NON-NLS-1$
+ return bugFile;
+ }
+
+ public void setPlatformDefaultsOrGuess(TaskRepository repository, TaskData newBugModel) {
+
+ String platform = repository.getProperty(IBugzillaConstants.BUGZILLA_DEF_PLATFORM);
+ String os = repository.getProperty(IBugzillaConstants.BUGZILLA_DEF_OS);
+
+ // set both or none
+ if (null != os && null != platform) {
+ TaskAttribute opSysAttribute = newBugModel.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey());
+ TaskAttribute platformAttribute = newBugModel.getRoot().getAttribute(
+ BugzillaAttribute.REP_PLATFORM.getKey());
+
+ // TODO something can still go wrong when the allowed values on the repository change...
+ opSysAttribute.setValue(os);
+ platformAttribute.setValue(platform);
+ return;
+ }
+ // fall through to old code
+ setPlatformOptions(newBugModel);
+ }
+
+ public void setPlatformOptions(TaskData newBugModel) {
+ try {
+
+ // Get OS Lookup Map
+ // Check that the result is in Values, if it is not, set it to other
+ // Defaults to the first of each (sorted) list All, All
+ TaskAttribute opSysAttribute = newBugModel.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey());
+ TaskAttribute platformAttribute = newBugModel.getRoot().getAttribute(
+ BugzillaAttribute.REP_PLATFORM.getKey());
+
+ String OS = Platform.getOS();
+ String platform = Platform.getOSArch();
+ String ws = Platform.getWS();
+
+ String bugzillaOS = null; // Bugzilla String for OS
+ String bugzillaPlatform = null; // Bugzilla String for Platform
+ String[] wsExtentions = null;
+/*
+ AIX -> AIX
+ Linux -> Linux
+ HP-UX -> HP-UX
+ Solaris -> Solaris
+ MacOS X -> Mac OS X
+ */
+
+ if (ws.length() > 1) {
+ char first = ws.charAt(0);
+ char firstLower = Character.toLowerCase(first);
+ char firstUpper = Character.toUpperCase(first);
+ String[] wsExtentionsTemp = { " - " + firstUpper + ws.substring(1, ws.length()), //$NON-NLS-1$
+ " - " + firstLower + ws.substring(1, ws.length()), //$NON-NLS-1$
+ " " + firstUpper + ws.substring(1, ws.length()), //$NON-NLS-1$
+ " " + firstLower + ws.substring(1, ws.length()), "" }; //$NON-NLS-1$//$NON-NLS-2$
+ wsExtentions = wsExtentionsTemp;
+ } else if (ws.length() == 1) {
+ char first = ws.charAt(0);
+ char firstLower = Character.toLowerCase(first);
+ char firstUpper = Character.toUpperCase(first);
+ String[] wsExtentionsTemp = { " - " + firstUpper, " - " + firstLower, " " + firstUpper, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ " " + firstLower, "" }; //$NON-NLS-1$//$NON-NLS-2$
+ wsExtentions = wsExtentionsTemp;
+ } else {
+ String[] wsExtentionsTemp = { "" }; //$NON-NLS-1$
+ wsExtentions = wsExtentionsTemp;
+ }
+
+ bugzillaOS = System.getProperty("os.name") + " " + System.getProperty("os.version"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ // We start with the most specific Value as the Search String.
+ // If we didn't find it we remove the last part of the version String or the OS Name from
+ // the Search String and continue with the test until we found it or the Search String is empty.
+ //
+ // The search in casesensitive.
+ if (opSysAttribute != null) {
+ for (String element : wsExtentions) {
+ String bugzillaOSTemp = bugzillaOS;
+ while (bugzillaOSTemp != null && opSysAttribute.getOption(bugzillaOSTemp + element) == null) {
+ int dotindex = bugzillaOSTemp.lastIndexOf('.');
+ if (dotindex > 0) {
+ bugzillaOSTemp = bugzillaOSTemp.substring(0, dotindex);
+ } else {
+ int spaceindex = bugzillaOSTemp.lastIndexOf(' ');
+ if (spaceindex > 0) {
+ bugzillaOSTemp = bugzillaOSTemp.substring(0, spaceindex);
+ } else {
+ bugzillaOSTemp = null;
+ }
+ }
+ }
+ if (bugzillaOSTemp != null) {
+ bugzillaOS = bugzillaOSTemp + element;
+ break;
+ }
+ }
+ } else {
+ bugzillaOS = null;
+ }
+
+ if (platform != null && java2buzillaPlatformMap.containsKey(platform)) {
+ bugzillaPlatform = java2buzillaPlatformMap.get(platform);
+ // Bugzilla knows the following Platforms [All, Macintosh, Other, PC, Power PC, Sun]
+ // Platform.getOSArch() returns "x86" on Intel Mac's and "ppc" on Power Mac's
+ // so bugzillaPlatform is "Power" or "PC".
+ //
+ // If the OS is "macosx" we change the Platform to "Macintosh"
+ //
+ if (bugzillaPlatform != null
+ && (bugzillaPlatform.compareTo("Power") == 0 || bugzillaPlatform.compareTo("PC") == 0) //$NON-NLS-1$ //$NON-NLS-2$
+ && OS != null && OS.compareTo("macosx") == 0) { //$NON-NLS-1$
+ // TODO: this may not even be a legal value in another repository!
+ bugzillaPlatform = "Macintosh"; //$NON-NLS-1$
+ } else if (platformAttribute != null && platformAttribute.getOption(bugzillaPlatform) == null) {
+ // If the platform we found is not int the list of available
+ // optinos, set the
+ // Bugzilla Platform to null, and juse use "other"
+ bugzillaPlatform = null;
+ }
+ }
+ // Set the OS and the Platform in the taskData
+ if (bugzillaOS != null && opSysAttribute != null) {
+ opSysAttribute.setValue(bugzillaOS);
+ } else if (opSysAttribute != null && opSysAttribute.getOption(OPTION_ALL) != null) {
+ opSysAttribute.setValue(OPTION_ALL);
+ }
+
+ if (bugzillaPlatform != null && platformAttribute != null) {
+ platformAttribute.setValue(bugzillaPlatform);
+ } else if (opSysAttribute != null && platformAttribute != null
+ && platformAttribute.getOption(OPTION_ALL) != null) {
+ opSysAttribute.setValue(OPTION_ALL);
+ }
+
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, "could not set platform options", //$NON-NLS-1$
+ e));
+ }
+ }
+
+ public Set<BugzillaLanguageSettings> getLanguageSettings() {
+ return BugzillaRepositoryConnector.getLanguageSettings();
+ }
+
+ public BugzillaLanguageSettings getLanguageSetting(String language) {
+ return BugzillaRepositoryConnector.getLanguageSetting(language);
+ }
+
+ /**
+ * this method is only for testing
+ */
+ public static void setCacheFileRead(boolean cacheFileRead) {
+ BugzillaCorePlugin.cacheFileRead = cacheFileRead;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaCustomField.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaCustomField.java
new file mode 100644
index 0000000..62f4a2f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaCustomField.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class describing a custom Fields for a given Bugzilla installation.
+ *
+ * @author Frank Becker
+ * @since 2.3
+ */
+public class BugzillaCustomField implements Serializable {
+
+ // old version private static final long serialVersionUID = 5703683576871326128L;
+ private static final long serialVersionUID = 7273310489883205486L;
+
+ public static final String CUSTOM_FIELD_PREFIX = "cf_"; //$NON-NLS-1$
+
+ private final String name;
+
+ private final String description;
+
+ private List<String> options = new ArrayList<String>();
+
+ final private int type;
+
+ final private String typeDesc;
+
+ final private boolean enterBug;
+
+ public BugzillaCustomField(String description, String name, String type, String typeDesc, String enterBug) {
+ this.description = description;
+ this.name = name;
+
+ this.type = parseInt(type);
+ this.typeDesc = typeDesc;
+ this.enterBug = "1".equals(enterBug); //$NON-NLS-1$
+ }
+
+ private int parseInt(String type) {
+ try {
+ return Integer.parseInt(type);
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public List<String> getOptions() {
+ return options;
+ }
+
+ public void setOptions(List<String> options) {
+ this.options = options;
+ }
+
+ public void addOption(String option) {
+ this.options.add(option);
+ }
+
+ /*
+ * @since 3.0.2
+ */
+ public int getType() {
+ return type;
+ }
+
+ /*
+ * @since 3.0.2
+ */
+ public String getTypeDesc() {
+ return typeDesc;
+ }
+
+ /*
+ * @since 3.0.2
+ */
+ public boolean isEnterBug() {
+ return enterBug;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlag.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlag.java
new file mode 100644
index 0000000..0c6a090
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlag.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaFlag implements Serializable {
+
+// old private static final long serialVersionUID = 4920551884607344418L;
+ private static final long serialVersionUID = -3149026741475639885L;
+
+ private final String name;
+
+ private final String description;
+
+ private final String type;
+
+ private final boolean requestable;
+
+ private final boolean specifically_requestable;
+
+ private final boolean multiplicable;
+
+ private final int flagId;
+
+ private final Map<String, List<String>> used = new HashMap<String, List<String>>();
+
+ public BugzillaFlag(String name, String description, String type, String requestable,
+ String specifically_requestable, String multiplicable, int flagId) {
+ this.description = description;
+ this.name = name;
+ this.type = type;
+ this.flagId = flagId;
+
+ if (multiplicable != null && !multiplicable.equals("")) { //$NON-NLS-1$
+ this.multiplicable = multiplicable.equals("1"); //$NON-NLS-1$
+ } else {
+ this.multiplicable = false;
+ }
+
+ if (requestable != null && !requestable.equals("")) { //$NON-NLS-1$
+ this.requestable = requestable.equals("1"); //$NON-NLS-1$
+ } else {
+ this.requestable = false;
+ }
+
+ if (specifically_requestable != null && !specifically_requestable.equals("")) { //$NON-NLS-1$
+ this.specifically_requestable = specifically_requestable.equals("1"); //$NON-NLS-1$
+ } else {
+ this.specifically_requestable = false;
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public boolean isRequestable() {
+ return requestable;
+ }
+
+ public boolean isSpecifically_requestable() {
+ return specifically_requestable;
+ }
+
+ public boolean isMultiplicable() {
+ return multiplicable;
+ }
+
+ public int getFlagId() {
+ return flagId;
+ }
+
+ public void addUsed(String product, String component) {
+ List<String> componentList = used.get(product);
+ if (componentList == null) {
+ componentList = new ArrayList<String>();
+ used.put(product, componentList);
+ }
+ if (!componentList.contains(component)) {
+ componentList.add(component);
+ }
+ }
+
+ public boolean isUsedIn(String product, String component) {
+ List<String> componentList = used.get(product);
+ if (componentList != null && componentList.contains(component)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlagMapper.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlagMapper.java
new file mode 100644
index 0000000..f50f5db
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaFlagMapper.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Frank Becker
+ * @since 3.1
+ */
+public class BugzillaFlagMapper {
+
+ private String requestee;
+
+ private String setter;
+
+ private String state;
+
+ private String flagId;
+
+ private int number;
+
+ public String getRequestee() {
+ return requestee;
+ }
+
+ public void setRequestee(String requestee) {
+ this.requestee = requestee;
+ }
+
+ public String getSetter() {
+ return setter;
+ }
+
+ public void setSetter(String setter) {
+ this.setter = setter;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public String getFlagId() {
+ return flagId;
+ }
+
+ public void setFlagId(String flagId) {
+ this.flagId = flagId;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+ private String description;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void applyTo(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskAttributeMapper mapper = taskData.getAttributeMapper();
+ TaskAttributeMetaData meta = taskAttribute.getMetaData().defaults();
+ meta.setType(IBugzillaConstants.EDITOR_TYPE_FLAG);
+ meta.setLabel(description);
+ BugzillaVersion bugzillaVersion = null;
+ RepositoryConfiguration repositoryConfiguration;
+ try {
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(mapper.getTaskRepository(), false,
+ new NullProgressMonitor());
+ bugzillaVersion = repositoryConfiguration.getInstallVersion();
+ } catch (CoreException e) {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+
+ if (bugzillaVersion.compareTo(BugzillaVersion.BUGZILLA_3_2) >= 0) {
+ meta.setKind(TaskAttribute.KIND_DEFAULT);
+ }
+ meta.setReadOnly(false);
+
+ if (getNumber() != 0) {
+ TaskAttribute child = taskAttribute.createMappedAttribute("number"); //$NON-NLS-1$
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_INTEGER);
+ mapper.setIntegerValue(child, getNumber());
+ }
+ if (getRequestee() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute("requestee"); //$NON-NLS-1$
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ mapper.setValue(child, getRequestee());
+ }
+ if (getSetter() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute("setter"); //$NON-NLS-1$
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ mapper.setValue(child, getSetter());
+ }
+ if (getState() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute("state"); //$NON-NLS-1$
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ child.getMetaData().setLabel(flagId);
+ child.getMetaData().setReadOnly(false);
+ mapper.setValue(child, getState());
+ taskAttribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, "state"); //$NON-NLS-1$
+
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaLanguageSettings.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaLanguageSettings.java
new file mode 100644
index 0000000..c0e6cd6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaLanguageSettings.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class describing the html response of Bugzilla requests which are used within Mylyn.
+ *
+ * Strings should be in the language which is the default for an Bugzilla instance.
+ *
+ * @author Frank Becker
+ */
+
+public class BugzillaLanguageSettings {
+ private String languageName = "<unknown>"; //$NON-NLS-1$
+
+ public static final String COMMAND_ERROR_LOGIN = "error_login"; //$NON-NLS-1$
+
+ public static final String COMMAND_ERROR_COLLISION = "error_collision"; //$NON-NLS-1$
+
+ public static final String COMMAND_ERROR_COMMENT_REQUIRED = "error_comment_required"; //$NON-NLS-1$
+
+ public static final String COMMAND_ERROR_LOGGED_OUT = "error_logged_out"; //$NON-NLS-1$
+
+ public static final String COMMAND_BAD_LOGIN = "bad_login"; //$NON-NLS-1$
+
+ public static final String COMMAND_PROCESSED = "processed"; //$NON-NLS-1$
+
+ public static final String COMMAND_CHANGES_SUBMITTED = "changes_submitted"; //$NON-NLS-1$
+
+ public static final String COMMAND_SUSPICIOUS_ACTION = "suspicious_action"; //$NON-NLS-1$
+
+ public static final String COMMAND_BUG = "bug"; //$NON-NLS-1$
+
+ public static final String COMMAND_SUBMITTED = "submitted"; //$NON-NLS-1$
+
+ private final Map<String, List<String>> languageAttributes = new LinkedHashMap<String, List<String>>();
+
+ public BugzillaLanguageSettings(String languageName) {
+ super();
+ this.languageName = languageName;
+ }
+
+ public String getLanguageName() {
+ return languageName;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((languageName == null) ? 0 : languageName.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ BugzillaLanguageSettings other = (BugzillaLanguageSettings) obj;
+ if (languageName == null) {
+ if (other.languageName != null) {
+ return false;
+ }
+ } else if (!languageName.equals(other.languageName)) {
+ return false;
+ }
+ return true;
+ }
+
+ public void setLanguageName(String languageName) {
+ this.languageName = languageName;
+ }
+
+ public void addLanguageAttribute(String command, String response) {
+ List<String> commandList = languageAttributes.get(command);
+ if (commandList == null) {
+ commandList = new LinkedList<String>();
+ languageAttributes.put(command.toLowerCase(), commandList);
+ }
+ commandList.add(response);
+ }
+
+ public List<String> getResponseForCommand(String command) {
+ return languageAttributes.get(command);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaOperation.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaOperation.java
new file mode 100644
index 0000000..a3e681d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaOperation.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public enum BugzillaOperation {
+
+ none(Messages.BugzillaOperation_Leave_as_X_X),
+
+ accept(Messages.BugzillaOperation_Accept_to_ASSIGNED),
+
+ resolve(Messages.BugzillaOperation_Resolve_as, "resolutionInput", TaskAttribute.TYPE_SINGLE_SELECT), //$NON-NLS-1$
+
+ duplicate(Messages.BugzillaOperation_Duplicate_of, "dup_id", TaskAttribute.TYPE_TASK_DEPENDENCY), //$NON-NLS-1$
+
+ reassign(Messages.BugzillaOperation_Reassign_to, "reassignInput", TaskAttribute.TYPE_PERSON), //$NON-NLS-1$
+
+ reassignbycomponent(Messages.BugzillaOperation_Reassign_to_default_assignee),
+
+ reopen(Messages.BugzillaOperation_Reopen_bug),
+
+ verify(Messages.BugzillaOperation_Mark_as_VERIFIED),
+
+ close(Messages.BugzillaOperation_Mark_as_CLOSED);
+
+ private final String label;
+
+ private final String inputId;
+
+ private final String inputType;
+
+ BugzillaOperation(String label) {
+ this(label, null, TaskAttribute.TYPE_SHORT_TEXT);
+ }
+
+ BugzillaOperation(String label, String inputId, String type) {
+ this.label = label;
+ this.inputId = inputId;
+ this.inputType = type;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getInputId() {
+ return inputId;
+ }
+
+ public String getInputType() {
+ return inputType;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java
new file mode 100644
index 0000000..34a7d57
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryConnector.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.MessageFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+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.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaRepositoryConnector extends AbstractRepositoryConnector {
+
+ private static final String BUG_ID = "&bug_id="; //$NON-NLS-1$
+
+ private static final String CHANGED_BUGS_CGI_ENDDATE = "&chfieldto=Now"; //$NON-NLS-1$
+
+ private static final String CHANGED_BUGS_CGI_QUERY = "/buglist.cgi?query_format=advanced&chfieldfrom="; //$NON-NLS-1$
+
+ private static final String CLIENT_LABEL = Messages.BugzillaRepositoryConnector_BUGZILLA_SUPPORTS_2_18_TO_3_0;
+
+ private static final String COMMENT_FORMAT = "yyyy-MM-dd HH:mm"; //$NON-NLS-1$
+
+ private static final String DEADLINE_FORMAT = "yyyy-MM-dd"; //$NON-NLS-1$
+
+ private final BugzillaTaskAttachmentHandler attachmentHandler = new BugzillaTaskAttachmentHandler(this);
+
+ private final BugzillaTaskDataHandler taskDataHandler = new BugzillaTaskDataHandler(this);
+
+ protected BugzillaClientManager clientManager;
+
+ protected static BugzillaLanguageSettings enSetting;
+
+ protected final static Set<BugzillaLanguageSettings> languages = new LinkedHashSet<BugzillaLanguageSettings>();
+
+ @Override
+ public String getLabel() {
+ return CLIENT_LABEL;
+ }
+
+ @Override
+ public AbstractTaskAttachmentHandler getTaskAttachmentHandler() {
+ return attachmentHandler;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public void updateTaskFromTaskData(TaskRepository repository, ITask task, TaskData taskData) {
+ TaskMapper scheme = getTaskMapping(taskData);
+ scheme.applyTo(task);
+
+ task.setUrl(BugzillaClient.getBugUrlWithoutLogin(repository.getRepositoryUrl(), taskData.getTaskId()));
+
+ boolean isComplete = false;
+ TaskAttribute attributeStatus = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ if (attributeStatus != null) {
+ isComplete = attributeStatus.getValue().equals(IBugzillaConstants.VALUE_STATUS_RESOLVED)
+ || attributeStatus.getValue().equals(IBugzillaConstants.VALUE_STATUS_CLOSED)
+ || attributeStatus.getValue().equals(IBugzillaConstants.VALUE_STATUS_VERIFIED);
+ }
+
+ if (taskData.isPartial()) {
+ if (isComplete) {
+ if (task.getCompletionDate() == null) {
+ task.setCompletionDate(new Date(0));
+ }
+ } else {
+ if (task.getCompletionDate() != null) {
+ task.setCompletionDate(null);
+ }
+ }
+ } else {
+ // Completion Date
+ if (isComplete) {
+ Date completionDate = null;
+
+ List<TaskAttribute> taskComments = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_COMMENT);
+ if (taskComments != null && taskComments.size() > 0) {
+ TaskAttribute lastComment = taskComments.get(taskComments.size() - 1);
+ if (lastComment != null) {
+ TaskAttribute attributeCommentDate = lastComment.getMappedAttribute(TaskAttribute.COMMENT_DATE);
+ if (attributeCommentDate != null) {
+ try {
+ completionDate = new SimpleDateFormat(COMMENT_FORMAT).parse(attributeCommentDate.getValue());
+ } catch (ParseException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ if (completionDate == null) {
+ // Use last modified date
+ TaskAttribute attributeLastModified = taskData.getRoot().getMappedAttribute(
+ TaskAttribute.DATE_MODIFICATION);
+ if (attributeLastModified != null && attributeLastModified.getValue().length() > 0) {
+ completionDate = taskData.getAttributeMapper().getDateValue(attributeLastModified);
+ }
+ }
+
+ if (completionDate == null) {
+ completionDate = new Date();
+ }
+
+ task.setCompletionDate(completionDate);
+ } else {
+ task.setCompletionDate(null);
+ }
+
+ // Bugzilla Specific Attributes
+
+ // Product
+ if (scheme.getProduct() != null) {
+ task.setAttribute(TaskAttribute.PRODUCT, scheme.getProduct());
+ }
+
+ // Severity
+ TaskAttribute attrSeverity = taskData.getRoot().getMappedAttribute(BugzillaAttribute.BUG_SEVERITY.getKey());
+ if (attrSeverity != null && !attrSeverity.getValue().equals("")) { //$NON-NLS-1$
+ task.setAttribute(BugzillaAttribute.BUG_SEVERITY.getKey(), attrSeverity.getValue());
+ }
+
+ // Due Date
+ if (taskData.getRoot().getMappedAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()) != null) {
+ Date dueDate = null;
+ // HACK: if estimated_time field exists, time tracking is
+ // enabled
+ try {
+ TaskAttribute attributeDeadline = taskData.getRoot().getMappedAttribute(
+ BugzillaAttribute.DEADLINE.getKey());
+ if (attributeDeadline != null) {
+ dueDate = new SimpleDateFormat(DEADLINE_FORMAT).parse(attributeDeadline.getValue());
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ task.setDueDate(dueDate);
+ }
+ }
+
+ updateExtendedAttributes(task, taskData);
+ }
+
+ private void updateExtendedAttributes(ITask task, TaskData taskData) {
+ // Set meta bugzilla task attribute values
+ for (BugzillaAttribute bugzillaReportElement : BugzillaAttribute.EXTENDED_ATTRIBUTES) {
+ TaskAttribute taskAttribute = taskData.getRoot().getAttribute(bugzillaReportElement.getKey());
+ if (taskAttribute != null) {
+ task.setAttribute(bugzillaReportElement.getKey(), taskAttribute.getValue());
+ }
+ }
+ }
+
+ @Override
+ public void preSynchronization(ISynchronizationSession session, IProgressMonitor monitor) throws CoreException {
+ TaskRepository repository = session.getTaskRepository();
+ if (session.getTasks().isEmpty()) {
+ return;
+ }
+
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask(Messages.BugzillaRepositoryConnector_checking_for_changed_tasks, session.getTasks()
+ .size());
+
+ if (repository.getSynchronizationTimeStamp() == null) {
+ for (ITask task : session.getTasks()) {
+ session.markStale(task);
+ }
+ return;
+ }
+
+ String dateString = repository.getSynchronizationTimeStamp();
+ if (dateString == null) {
+ dateString = ""; //$NON-NLS-1$
+ }
+
+ String urlQueryBase = repository.getRepositoryUrl() + CHANGED_BUGS_CGI_QUERY
+ + URLEncoder.encode(dateString, repository.getCharacterEncoding()) + CHANGED_BUGS_CGI_ENDDATE;
+
+ String urlQueryString = urlQueryBase + BUG_ID;
+
+ Set<ITask> changedTasks = new HashSet<ITask>();
+ Iterator<ITask> itr = session.getTasks().iterator();
+ int queryCounter = 0;
+ Set<ITask> checking = new HashSet<ITask>();
+ while (itr.hasNext()) {
+ ITask task = itr.next();
+ checking.add(task);
+ queryCounter++;
+ String newurlQueryString = URLEncoder.encode(task.getTaskId() + ",", repository.getCharacterEncoding()); //$NON-NLS-1$
+ urlQueryString += newurlQueryString;
+ if (queryCounter >= 1000) {
+ queryForChanged(repository, changedTasks, urlQueryString, session, new SubProgressMonitor(monitor,
+ queryCounter));
+
+ queryCounter = 0;
+ urlQueryString = urlQueryBase + BUG_ID;
+ newurlQueryString = ""; //$NON-NLS-1$
+ }
+
+ if (!itr.hasNext() && queryCounter != 0) {
+ queryForChanged(repository, changedTasks, urlQueryString, session, new SubProgressMonitor(monitor,
+ queryCounter));
+ }
+ }
+
+ for (ITask task : session.getTasks()) {
+ if (changedTasks.contains(task)) {
+ session.markStale(task);
+ }
+ }
+
+ } catch (UnsupportedEncodingException e) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Repository configured with unsupported encoding: " + repository.getCharacterEncoding() //$NON-NLS-1$
+ + "\n\n Unable to determine changed tasks.", e)); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * TODO: clean up use of BugzillaTaskDataCollector
+ */
+ private void queryForChanged(final TaskRepository repository, Set<ITask> changedTasks, String urlQueryString,
+ ISynchronizationSession context, IProgressMonitor monitor) throws UnsupportedEncodingException,
+ CoreException {
+
+ HashMap<String, ITask> taskById = new HashMap<String, ITask>();
+ for (ITask task : context.getTasks()) {
+ taskById.put(task.getTaskId(), task);
+ }
+ final Set<TaskData> changedTaskData = new HashSet<TaskData>();
+ TaskDataCollector collector = new TaskDataCollector() {
+
+ @Override
+ public void accept(TaskData taskData) {
+ changedTaskData.add(taskData);
+ }
+ };
+
+ // TODO: Decouple from internals
+ IRepositoryQuery query = new RepositoryQuery(repository.getConnectorKind(), ""); //$NON-NLS-1$
+ query.setSummary(Messages.BugzillaRepositoryConnector_Query_for_changed_tasks);
+ query.setUrl(urlQueryString);
+ performQuery(repository, query, collector, context, monitor);
+
+ for (TaskData data : changedTaskData) {
+ ITask changedTask = taskById.get(data.getTaskId());
+ if (changedTask != null) {
+ changedTasks.add(changedTask);
+ }
+ }
+
+ }
+
+ @Override
+ public boolean canCreateTaskFromKey(TaskRepository repository) {
+ return true;
+ }
+
+ @Override
+ public boolean canCreateNewTask(TaskRepository repository) {
+ return true;
+ }
+
+ @Override
+ public IStatus performQuery(TaskRepository repository, final IRepositoryQuery query,
+ TaskDataCollector resultCollector, ISynchronizationSession event, IProgressMonitor monitor) {
+
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask(Messages.BugzillaRepositoryConnector_running_query, IProgressMonitor.UNKNOWN);
+ BugzillaClient client = getClientManager().getClient(repository, new SubProgressMonitor(monitor, 1));
+ TaskAttributeMapper mapper = getTaskDataHandler().getAttributeMapper(repository);
+ boolean hitsReceived = client.getSearchHits(query, resultCollector, mapper, monitor);
+ if (!hitsReceived) {
+ // XXX: HACK in case of ip change bugzilla can return 0 hits
+ // due to invalid authorization token, forcing relogin fixes
+ client.logout(monitor);
+ client.getSearchHits(query, resultCollector, mapper, monitor);
+ }
+
+ return Status.OK_STATUS;
+ } catch (UnrecognizedReponseException e) {
+ return new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, IStatus.INFO,
+ Messages.BugzillaRepositoryConnector_Unrecognized_response_from_server, e);
+ } catch (IOException e) {
+ return new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN, IStatus.ERROR, MessageFormat.format(
+ Messages.BugzillaRepositoryConnector_Check_repository_configuration, e.getMessage()), e);
+ } catch (CoreException e) {
+ return e.getStatus();
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public String getRepositoryUrlFromTaskUrl(String url) {
+ if (url == null) {
+ return null;
+ }
+ int index = url.indexOf(IBugzillaConstants.URL_GET_SHOW_BUG);
+ return index == -1 ? null : url.substring(0, index);
+ }
+
+ @Override
+ public String getTaskIdFromTaskUrl(String url) {
+ if (url == null) {
+ return null;
+ }
+ int anchorIndex = url.lastIndexOf("#"); //$NON-NLS-1$
+ String bugUrl = url;
+ if (anchorIndex != -1) {
+ bugUrl = url.substring(0, anchorIndex);
+ }
+
+ int index = bugUrl.indexOf(IBugzillaConstants.URL_GET_SHOW_BUG);
+ return index == -1 ? null : bugUrl.substring(index + IBugzillaConstants.URL_GET_SHOW_BUG.length());
+ }
+
+ @Override
+ public String getTaskUrl(String repositoryUrl, String taskId) {
+ try {
+ return BugzillaClient.getBugUrlWithoutLogin(repositoryUrl, taskId);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Error constructing task url for " + repositoryUrl + " id:" + taskId, e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return null;
+ }
+
+ @Override
+ public String getTaskIdPrefix() {
+ return "bug"; //$NON-NLS-1$
+ }
+
+ public BugzillaClientManager getClientManager() {
+ if (clientManager == null) {
+ clientManager = new BugzillaClientManager();
+ // TODO: Move this initialization elsewhere
+ BugzillaCorePlugin.setConnector(this);
+ enSetting = new BugzillaLanguageSettings(IBugzillaConstants.DEFAULT_LANG);
+ enSetting.addLanguageAttribute("error_login", "Login"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("error_login", "log in"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("error_login", "check e-mail"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("error_login", "Invalid Username Or Password"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("error_collision", "Mid-air collision!"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("error_comment_required", "Comment Required"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("error_logged_out", "logged out"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bad_login", "Login"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bad_login", "log in"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bad_login", "check e-mail"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bad_login", "Invalid Username Or Password"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bad_login", "error"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("processed", "processed"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("changes_submitted", "Changes submitted"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("changes_submitted", "added to Bug"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bug", "Bug"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("bug", "Issue"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("submitted", "Submitted"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("submitted", "posted"); //$NON-NLS-1$ //$NON-NLS-2$
+ enSetting.addLanguageAttribute("suspicious_action", "Suspicious action"); //$NON-NLS-1$ //$NON-NLS-2$
+ languages.add(enSetting);
+
+ }
+ return clientManager;
+ }
+
+ @Override
+ public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
+ if (repository != null) {
+ BugzillaCorePlugin.getRepositoryConfiguration(repository, true, monitor);
+ }
+ }
+
+ @Override
+ public boolean isRepositoryConfigurationStale(TaskRepository repository, IProgressMonitor monitor)
+ throws CoreException {
+ if (super.isRepositoryConfigurationStale(repository, monitor)) {
+ boolean result = true;
+ BugzillaClient client = getClientManager().getClient(repository, monitor);
+ if (client != null) {
+ String timestamp = client.getConfigurationTimestamp(monitor);
+ if (timestamp != null) {
+ String oldTimestamp = repository.getProperty(IBugzillaConstants.PROPERTY_CONFIGTIMESTAMP);
+ if (oldTimestamp != null) {
+ result = !timestamp.equals(oldTimestamp);
+ }
+ repository.setProperty(IBugzillaConstants.PROPERTY_CONFIGTIMESTAMP, timestamp);
+ }
+ }
+ return result;
+ }
+ return false;
+ }
+
+ public static void addLanguageSetting(BugzillaLanguageSettings language) {
+ if (!languages.contains(language)) {
+ BugzillaRepositoryConnector.languages.add(language);
+ }
+ }
+
+ public static Set<BugzillaLanguageSettings> getLanguageSettings() {
+ return languages;
+ }
+
+ /** returns default language if language not found */
+ public static BugzillaLanguageSettings getLanguageSetting(String label) {
+ for (BugzillaLanguageSettings language : getLanguageSettings()) {
+ if (language.getLanguageName().equals(label)) {
+ return language;
+ }
+ }
+ return enSetting;
+ }
+
+ @Override
+ public void postSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask("", 1); //$NON-NLS-1$
+ if (event.isFullSynchronization() && event.getStatus() == null) {
+ event.getTaskRepository().setSynchronizationTimeStamp(getSynchronizationTimestamp(event));
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+ return taskDataHandler.getTaskData(repository, taskId, monitor);
+ }
+
+ @Override
+ public AbstractTaskDataHandler getTaskDataHandler() {
+ return taskDataHandler;
+ }
+
+ @Override
+ public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ if (taskData.isPartial() && task.getCreationDate() != null) {
+ return false;
+ }
+
+ // Security token
+ // Updated on the task upon each open (synch) to keep the most current token available for submission - bug#263318
+ TaskAttribute attrSecurityToken = taskData.getRoot().getMappedAttribute(BugzillaAttribute.TOKEN.getKey());
+ if (attrSecurityToken != null && !attrSecurityToken.getValue().equals("")) { //$NON-NLS-1$
+ task.setAttribute(BugzillaAttribute.TOKEN.getKey(), attrSecurityToken.getValue());
+ }
+
+ String lastKnownMod = task.getAttribute(BugzillaAttribute.DELTA_TS.getKey());
+ if (lastKnownMod != null) {
+ TaskAttribute attrModification = taskData.getRoot().getMappedAttribute(TaskAttribute.DATE_MODIFICATION);
+ if (attrModification != null) {
+ return !lastKnownMod.equals(attrModification.getValue());
+ }
+
+ }
+ return true;
+ }
+
+ @Override
+ public Collection<TaskRelation> getTaskRelations(TaskData taskData) {
+ List<TaskRelation> relations = new ArrayList<TaskRelation>();
+ TaskAttribute attribute = taskData.getRoot().getAttribute(BugzillaAttribute.DEPENDSON.getKey());
+ if (attribute != null && attribute.getValue().length() > 0) {
+ for (String taskId : attribute.getValue().split(",")) { //$NON-NLS-1$
+ relations.add(TaskRelation.subtask(taskId.trim()));
+ }
+ }
+ return relations;
+ }
+
+ private String getSynchronizationTimestamp(ISynchronizationSession event) {
+ Date mostRecent = new Date(0);
+ String mostRecentTimeStamp = event.getTaskRepository().getSynchronizationTimeStamp();
+ for (ITask task : event.getChangedTasks()) {
+ Date taskModifiedDate = task.getModificationDate();
+ if (taskModifiedDate != null && taskModifiedDate.after(mostRecent)) {
+ mostRecent = taskModifiedDate;
+ mostRecentTimeStamp = task.getAttribute(BugzillaAttribute.DELTA_TS.getKey());
+ }
+ }
+ return mostRecentTimeStamp;
+ }
+
+ @Override
+ public boolean hasRepositoryDueDate(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ return taskData.getRoot().getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()) != null;
+ }
+
+ @Override
+ public TaskMapper getTaskMapping(final TaskData taskData) {
+ return new TaskMapper(taskData) {
+ @Override
+ public String getTaskKey() {
+ TaskAttribute attribute = getTaskData().getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey());
+ if (attribute != null) {
+ return attribute.getValue();
+ }
+ return super.getTaskKey();
+ }
+
+ @Override
+ public String getTaskKind() {
+ return taskData.getConnectorKind();
+ }
+
+ @Override
+ public String getTaskUrl() {
+ return taskData.getRepositoryUrl();
+ }
+ };
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryResponse.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryResponse.java
new file mode 100644
index 0000000..583626b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaRepositoryResponse.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaRepositoryResponse extends RepositoryResponse {
+
+ private Map<String, List<String>> responseData = new LinkedHashMap<String, List<String>>();
+
+ public BugzillaRepositoryResponse(ResponseKind reposonseKind, String taskId) {
+ super(reposonseKind, taskId);
+ }
+
+ public BugzillaRepositoryResponse() {
+ // ignore
+ }
+
+ public Map<String, List<String>> getResponseData() {
+ return responseData;
+ }
+
+ public void setResponseData(Map<String, List<String>> responseData) {
+ this.responseData = responseData;
+ }
+
+ public void addResponseData(String name, String response) {
+ List<String> responseList = responseData.get(name);
+ if (responseList == null) {
+ responseList = new LinkedList<String>();
+ responseData.put(name, responseList);
+ }
+ responseList.add(response);
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaStatus.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaStatus.java
new file mode 100644
index 0000000..562b2cd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaStatus.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaStatus extends Status {
+
+ private final String errorMessage;
+
+ private String repositoryUrl = ""; //$NON-NLS-1$
+
+ public BugzillaStatus(int severity, String pluginId, int code) {
+ super(severity, pluginId, code, "MylynStatus", null); //$NON-NLS-1$
+ this.errorMessage = null;
+ }
+
+ public BugzillaStatus(int severity, String pluginId, int code, String errorMessage) {
+ super(severity, pluginId, code, "MylynStatus", null); //$NON-NLS-1$
+ this.errorMessage = errorMessage;
+ }
+
+ public BugzillaStatus(int severity, String pluginId, int code, String repositoryUrl, Throwable e) {
+ super(severity, pluginId, code, "MylynStatus", e); //$NON-NLS-1$
+ this.repositoryUrl = repositoryUrl;
+ this.errorMessage = e.getMessage();
+ }
+
+ public BugzillaStatus(int severity, String pluginId, int code, String repositoryUrl, String errorMessage) {
+ super(severity, pluginId, code, "MylynStatus", null); //$NON-NLS-1$
+ this.errorMessage = errorMessage;
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ public BugzillaStatus(int severity, String pluginId, int code, String repositoryUrl, String errorMessage,
+ Throwable e) {
+ super(severity, pluginId, code, "MylynStatus", e); //$NON-NLS-1$
+ this.errorMessage = errorMessage;
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ /**
+ * Returns the message that is relevant to the code of this status.
+ */
+ @Override
+ public String getMessage() {
+
+ switch (getCode()) {
+ case RepositoryStatus.ERROR_REPOSITORY_LOGIN:
+ return NLS.bind(Messages.BugzillaStatus_repositoryLoginFailure, this.getRepositoryUrl(), this.errorMessage);
+ case RepositoryStatus.ERROR_REPOSITORY_NOT_FOUND:
+ return NLS.bind(Messages.BugzillaStatus_repositoryNotFound, this.errorMessage);
+ case RepositoryStatus.ERROR_REPOSITORY:
+ return NLS.bind(Messages.BugzillaStatus_errorRepository, this.getRepositoryUrl(), this.errorMessage);
+ case RepositoryStatus.ERROR_IO:
+ String string1 = "Unknown IO error occurred"; //$NON-NLS-1$
+ String string2 = "No message provided"; //$NON-NLS-1$
+ if (getException() != null) {
+ string1 = getException().getClass().getSimpleName();
+ string2 = getException().getMessage();
+ }
+ Object[] strings = { getRepositoryUrl(), string1, string2 };
+ return NLS.bind(Messages.BugzillaStatus_errorIo, strings);
+ case RepositoryStatus.ERROR_INTERNAL:
+ return NLS.bind(Messages.BugzillaStatus_errorInternal, this.errorMessage);
+ case RepositoryStatus.OPERATION_CANCELLED:
+ return NLS.bind(Messages.BugzillaStatus_operationCancelled, this.errorMessage);
+ case RepositoryStatus.REPOSITORY_COLLISION:
+ return NLS.bind(Messages.BugzillaStatus_repositoryCollision, this.errorMessage);
+ case RepositoryStatus.REPOSITORY_COMMENT_REQUIRED:
+ if (errorMessage == null) {
+ return Messages.BugzillaStatus_repositoryCommentRequired;
+ } else {
+ return errorMessage;
+ }
+ }
+ if (errorMessage != null) {
+ return errorMessage;
+ } else if (getException() != null) {
+ String message = getException().getMessage();
+ if (message != null) {
+ return message;
+ } else {
+ return getException().toString();
+ }
+ }
+ return "Unknown"; //$NON-NLS-1$
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskAttachmentHandler.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskAttachmentHandler.java
new file mode 100644
index 0000000..8c18538
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskAttachmentHandler.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.eclipse.core.runtime.CoreException;
+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.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class BugzillaTaskAttachmentHandler extends AbstractTaskAttachmentHandler {
+
+ private final BugzillaRepositoryConnector connector;
+
+ public BugzillaTaskAttachmentHandler(BugzillaRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ @Override
+ public boolean canGetContent(TaskRepository repository, ITask task) {
+ // ignore
+ return true;
+ }
+
+ @Override
+ public boolean canPostContent(TaskRepository repository, ITask task) {
+ // ignore
+ return true;
+ }
+
+ @Override
+ public InputStream getContent(TaskRepository repository, ITask task, TaskAttribute attachmentAttribute,
+ IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask(Messages.BugzillaTaskAttachmentHandler_Getting_attachment, IProgressMonitor.UNKNOWN);
+ TaskAttachmentMapper attachment = TaskAttachmentMapper.createFrom(attachmentAttribute);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ downloadAttachment(repository, task, attachment.getAttachmentId(), out, monitor);
+ return new ByteArrayInputStream(out.toByteArray());
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public void postContent(TaskRepository repository, ITask task, AbstractTaskAttachmentSource source, String comment,
+ TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask(Messages.BugzillaTaskAttachmentHandler_Sending_attachment, IProgressMonitor.UNKNOWN);
+ BugzillaClient client = connector.getClientManager().getClient(repository,
+ new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+
+ client.postAttachment(task.getTaskId(), comment, source, attachmentAttribute, monitor);
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ Messages.BugzillaTaskAttachmentHandler_unable_to_submit_attachment, e));
+ } finally {
+ monitor.done();
+ }
+
+ }
+
+ private void downloadAttachment(TaskRepository repository, ITask task, String attachmentId, OutputStream out,
+ IProgressMonitor monitor) throws CoreException {
+ BugzillaClient client;
+ try {
+ client = connector.getClientManager().getClient(repository,
+ new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ client.getAttachmentData(attachmentId, out, monitor);
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Unable to retrieve attachment", e)); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java
new file mode 100644
index 0000000..969424a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaTaskDataHandler.java
@@ -0,0 +1,693 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+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.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaTaskDataHandler extends AbstractTaskDataHandler {
+
+ private enum TaskDataVersion {
+
+ VERSION_0(0f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ // ignore
+ }
+ },
+
+ VERSION_1_0(1.0f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ // 1: the value was stored in the attribute rather than the key
+ for (TaskAttribute attribute : new ArrayList<TaskAttribute>(data.getRoot().getAttributes().values())) {
+ if (attribute.getId().equals(BugzillaAttribute.DESC.getKey())) {
+ TaskAttribute attrLongDesc = createAttribute(data, BugzillaAttribute.LONG_DESC);
+ attrLongDesc.setValue(attribute.getValue());
+ data.getRoot().removeAttribute(BugzillaAttribute.DESC.getKey());
+ }
+ }
+ // Old actions not saved so recreate them upon migration
+ // delete legacy operations:
+ Set<TaskAttribute> operationsToRemove = new HashSet<TaskAttribute>();
+ for (TaskAttribute attribute : data.getAttributeMapper().getAttributesByType(data,
+ TaskAttribute.TYPE_OPERATION)) {
+ operationsToRemove.add(attribute);
+ }
+ for (TaskAttribute taskAttribute : operationsToRemove) {
+ data.getRoot().removeAttribute(taskAttribute.getId());
+ }
+ RepositoryConfiguration configuration = BugzillaCorePlugin.getRepositoryConfiguration(repository.getRepositoryUrl());
+ if (configuration != null) {
+ configuration.addValidOperations(data);
+ }
+ }
+ },
+ VERSION_2_0(2.0f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ updateAttribute(data, BugzillaAttribute.LONG_DESC);
+ }
+ },
+ VERSION_3_0(3.0f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ updateAttribute(data, BugzillaAttribute.NEW_COMMENT);
+ }
+ },
+ VERSION_4_0(4.0f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ updateAttribute(data, BugzillaAttribute.DEADLINE);
+ updateAttribute(data, BugzillaAttribute.ACTUAL_TIME);
+ }
+ },
+ VERSION_4_1(4.1f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ updateAttribute(data, BugzillaAttribute.VOTES);
+ TaskAttribute attrDeadline = data.getRoot().getMappedAttribute(BugzillaAttribute.VOTES.getKey());
+ if (attrDeadline != null) {
+ attrDeadline.getMetaData().setType(BugzillaAttribute.VOTES.getType());
+ }
+ }
+ },
+ VERSION_4_2(4.2f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ updateAttribute(data, BugzillaAttribute.CC);
+ updateAttribute(data, BugzillaAttribute.DEPENDSON);
+ updateAttribute(data, BugzillaAttribute.BLOCKED);
+ updateAttribute(data, BugzillaAttribute.BUG_FILE_LOC);
+ updateAttribute(data, BugzillaAttribute.KEYWORDS);
+ updateAttribute(data, BugzillaAttribute.STATUS_WHITEBOARD);
+ updateAttribute(data, BugzillaAttribute.QA_CONTACT);
+ updateAttribute(data, BugzillaAttribute.NEWCC);
+ }
+ },
+ VERSION_4_3(4.3f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ // migrate custom attributes
+ for (TaskAttribute attribute : data.getRoot().getAttributes().values()) {
+ if (attribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ attribute.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
+ attribute.getMetaData().setReadOnly(false);
+ if (attribute.getOptions().size() > 0) {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ } else {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ }
+ }
+ },
+ VERSION_4_4(4.4f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ // summary didn't have spell checking, update to short rich text
+ updateAttribute(data, BugzillaAttribute.SHORT_DESC);
+ }
+ },
+ VERSION_4_5(4.5f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ // migrate custom attributes
+ RepositoryConfiguration configuration = BugzillaCorePlugin.getRepositoryConfiguration(repository.getRepositoryUrl());
+
+ if (configuration == null) {
+ return;
+ }
+
+ for (TaskAttribute attribute : data.getRoot().getAttributes().values()) {
+ if (attribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+
+ BugzillaCustomField customField = null;
+ String actName = attribute.getId();
+ for (BugzillaCustomField bugzillaCustomField : configuration.getCustomFields()) {
+ if (actName.equals(bugzillaCustomField.getName())) {
+ customField = bugzillaCustomField;
+ break;
+ }
+ }
+ if (customField != null) {
+ String desc = customField.getDescription();
+ attribute.getMetaData().defaults().setLabel(desc).setReadOnly(false);
+ attribute.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ switch (customField.getType()) {
+ case 1: // Free Text
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ break;
+ case 2: // Drop Down
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ break;
+ case 3: // Multiple-Selection Box
+ attribute.getMetaData().setType(TaskAttribute.TYPE_MULTI_SELECT);
+ break;
+ case 4: // Large Text Box
+ attribute.getMetaData().setType(TaskAttribute.TYPE_LONG_TEXT);
+ break;
+ case 5: // Date/Time
+ attribute.getMetaData().setType(TaskAttribute.TYPE_DATETIME);
+ break;
+
+ default:
+ List<String> options = customField.getOptions();
+ if (options.size() > 0) {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ } else {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ attribute.getMetaData().setReadOnly(false);
+ }
+ }
+ }
+ }
+ },
+ VERSION_CURRENT(4.6f) {
+ @Override
+ void migrate(TaskRepository repository, TaskData data) {
+ data.setVersion(TaskDataVersion.VERSION_CURRENT.toString());
+ }
+ };
+
+ private float versionNumber = 0;
+
+ TaskDataVersion(float verNum) {
+ versionNumber = verNum;
+ }
+
+ public float getVersionNum() {
+ return versionNumber;
+ }
+
+ abstract void migrate(TaskRepository repository, TaskData data);
+
+ @Override
+ public String toString() {
+ return "" + getVersionNum(); //$NON-NLS-1$
+ }
+
+ private static void updateAttribute(TaskData data, BugzillaAttribute bugAttribute) {
+ TaskAttribute attribute = data.getRoot().getMappedAttribute(bugAttribute.getKey());
+ if (attribute != null) {
+ attribute.getMetaData().setType(bugAttribute.getType());
+ attribute.getMetaData().setReadOnly(bugAttribute.isReadOnly());
+ attribute.getMetaData().setKind(bugAttribute.getKind());
+ }
+ }
+ }
+
+ private final BugzillaRepositoryConnector connector;
+
+ public BugzillaTaskDataHandler(BugzillaRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+
+ Set<String> taskIds = new HashSet<String>();
+ taskIds.add(taskId);
+ final TaskData[] retrievedData = new TaskData[1];
+ TaskDataCollector collector = new TaskDataCollector() {
+
+ @Override
+ public void accept(TaskData taskData) {
+ retrievedData[0] = taskData;
+ }
+ };
+ getMultiTaskData(repository, taskIds, collector, monitor);
+
+ if (retrievedData[0] == null) {
+ throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ "Task data could not be retrieved. Please re-synchronize task")); //$NON-NLS-1$
+ }
+ return retrievedData[0];
+
+// monitor = Policy.monitorFor(monitor);
+// try {
+// monitor.beginTask("Receiving task", IProgressMonitor.UNKNOWN);
+// BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
+// int bugId = BugzillaRepositoryConnector.getBugId(taskId);
+// TaskData taskData = client.getTaskData(bugId, getAttributeMapper(repository), monitor);
+// if (taskData == null) {
+// throw new CoreException(new Status(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+// "Task data could not be retrieved. Please re-synchronize task"));
+// }
+// return taskData;
+// } catch (IOException e) {
+// throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+// RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
+// } finally {
+// monitor.done();
+// }
+ }
+
+ @Override
+ public void getMultiTaskData(final TaskRepository repository, Set<String> taskIds,
+ final TaskDataCollector collector, IProgressMonitor monitor) throws CoreException {
+
+ monitor = Policy.monitorFor(monitor);
+
+ try {
+ monitor.beginTask(Messages.BugzillaTaskDataHandler_Receiving_tasks, taskIds.size());
+ BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
+ final CoreException[] collectionException = new CoreException[1];
+
+ class CollectorWrapper extends TaskDataCollector {
+
+ private final IProgressMonitor monitor2;
+
+ private final TaskDataCollector collector;
+
+ public CollectorWrapper(TaskDataCollector collector, IProgressMonitor monitor2) {
+ this.collector = collector;
+ this.monitor2 = monitor2;
+ }
+
+ @Override
+ public void accept(TaskData taskData) {
+ try {
+ initializeTaskData(repository, taskData, null, new SubProgressMonitor(monitor2, 1));
+ } catch (CoreException e) {
+ if (collectionException[0] == null) {
+ collectionException[0] = e;
+ }
+ }
+ collector.accept(taskData);
+ monitor2.worked(1);
+ }
+ }
+
+ TaskDataCollector collector2 = new CollectorWrapper(collector, monitor);
+
+ client.getTaskData(taskIds, collector2, getAttributeMapper(repository), monitor);
+
+ if (collectionException[0] != null) {
+ throw collectionException[0];
+ }
+ } catch (IOException e) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public void migrateTaskData(TaskRepository taskRepository, TaskData taskData) {
+
+ float bugzillaTaskDataVersion = 0;
+ {
+ String taskDataVersion = taskData.getVersion();
+ if (taskDataVersion != null) {
+ try {
+ bugzillaTaskDataVersion = Float.parseFloat(taskDataVersion);
+ } catch (NumberFormatException e) {
+ bugzillaTaskDataVersion = 0;
+ }
+ }
+ }
+
+ for (TaskDataVersion version : TaskDataVersion.values()) {
+ if (bugzillaTaskDataVersion <= version.getVersionNum()) {
+ version.migrate(taskRepository, taskData);
+ }
+ }
+ }
+
+ @Override
+ public RepositoryResponse postTaskData(TaskRepository repository, TaskData taskData,
+ Set<TaskAttribute> changedAttributes, IProgressMonitor monitor) throws CoreException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask(Messages.BugzillaTaskDataHandler_Submitting_task, IProgressMonitor.UNKNOWN);
+ BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
+ try {
+ return client.postTaskData(taskData, monitor);
+ } catch (CoreException e) {
+ // TODO: Move retry handling into client
+ if (e.getStatus().getCode() == RepositoryStatus.ERROR_REPOSITORY_LOGIN) {
+ return client.postTaskData(taskData, monitor);
+ } else if (e.getStatus().getCode() == IBugzillaConstants.REPOSITORY_STATUS_SUSPICIOUS_ACTION) {
+ taskData.getRoot().removeAttribute(BugzillaAttribute.TOKEN.getKey());
+ return client.postTaskData(taskData, monitor);
+ } else {
+ throw e;
+ }
+ }
+ } catch (IOException e) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public boolean initializeTaskData(TaskRepository repository, TaskData taskData, ITaskMapping initializationData,
+ IProgressMonitor monitor) throws CoreException {
+
+ // Note: setting current version to latest assumes the data arriving here is either for a new task or is
+ // fresh from the repository (not locally stored data that may not have been migrated).
+ taskData.setVersion(TaskDataVersion.VERSION_CURRENT.toString());
+
+ RepositoryConfiguration repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository,
+ false, monitor);
+
+ if (repositoryConfiguration == null) {
+ return false;
+ }
+
+ if (taskData.isNew()) {
+ String product = null;
+ String component = null;
+ if (initializationData == null || initializationData.getProduct() == null) {
+ if (repositoryConfiguration.getProducts().size() > 0) {
+ product = repositoryConfiguration.getProducts().get(0);
+ }
+ } else {
+ product = initializationData.getProduct();
+ }
+
+ if (product == null) {
+ return false;
+ }
+
+ if (initializationData != null && initializationData.getComponent() != null
+ && initializationData.getComponent().length() > 0) {
+ component = initializationData.getComponent();
+ }
+
+ if (component == null && repositoryConfiguration.getComponents(product).size() > 0) {
+ component = repositoryConfiguration.getComponents(product).get(0);
+ }
+
+ initializeNewTaskDataAttributes(repositoryConfiguration, taskData, product, component, monitor);
+ BugzillaCorePlugin.getDefault().setPlatformDefaultsOrGuess(repository, taskData);
+ return true;
+
+ } else {
+ repositoryConfiguration.configureTaskData(taskData);
+ }
+ return true;
+ }
+
+ /**
+ * Only new, unsubmitted task data or freshly received task data from the repository can be passed in here.
+ *
+ * @param component
+ */
+ private boolean initializeNewTaskDataAttributes(RepositoryConfiguration repositoryConfiguration, TaskData taskData,
+ String product, String component, IProgressMonitor monitor) {
+
+ TaskAttribute productAttribute = createAttribute(taskData, BugzillaAttribute.PRODUCT);
+ productAttribute.setValue(product);
+
+ List<String> optionValues = repositoryConfiguration.getProducts();
+ Collections.sort(optionValues);
+ for (String optionValue : optionValues) {
+ productAttribute.putOption(optionValue, optionValue);
+ }
+
+ TaskAttribute attributeStatus = createAttribute(taskData, BugzillaAttribute.BUG_STATUS);
+ optionValues = repositoryConfiguration.getStatusValues();
+ for (String option : optionValues) {
+ attributeStatus.putOption(option, option);
+ }
+
+ attributeStatus.setValue(IBugzillaConstants.VALUE_STATUS_NEW);
+
+ createAttribute(taskData, BugzillaAttribute.SHORT_DESC);
+
+ TaskAttribute attributeVersion = createAttribute(taskData, BugzillaAttribute.VERSION);
+ optionValues = repositoryConfiguration.getVersions(productAttribute.getValue());
+ Collections.sort(optionValues);
+ for (String option : optionValues) {
+ attributeVersion.putOption(option, option);
+ }
+ if (optionValues.size() > 0) {
+ attributeVersion.setValue(optionValues.get(optionValues.size() - 1));
+ }
+
+ TaskAttribute attributeComponent = createAttribute(taskData, BugzillaAttribute.COMPONENT);
+ optionValues = repositoryConfiguration.getComponents(productAttribute.getValue());
+ Collections.sort(optionValues);
+ for (String option : optionValues) {
+ attributeComponent.putOption(option, option);
+ }
+ if (optionValues.size() == 1) {
+ attributeComponent.setValue(optionValues.get(0));
+ }
+ if (component != null && optionValues.contains(component)) {
+ attributeComponent.setValue(component);
+ }
+
+ optionValues = repositoryConfiguration.getTargetMilestones(productAttribute.getValue());
+ if (optionValues.size() > 0) {
+ TaskAttribute attributeTargetMilestone = createAttribute(taskData, BugzillaAttribute.TARGET_MILESTONE);
+ Collections.sort(optionValues);
+ for (String option : optionValues) {
+ attributeTargetMilestone.putOption(option, option);
+ }
+ attributeTargetMilestone.setValue(optionValues.get(0));
+ }
+
+ TaskAttribute attributePlatform = createAttribute(taskData, BugzillaAttribute.REP_PLATFORM);
+ optionValues = repositoryConfiguration.getPlatforms();
+ for (String option : optionValues) {
+ attributePlatform.putOption(option, option);
+ }
+ if (optionValues.size() > 0) {
+ // bug 159397 choose first platform: All
+ attributePlatform.setValue(optionValues.get(0));
+ }
+
+ TaskAttribute attributeOPSYS = createAttribute(taskData, BugzillaAttribute.OP_SYS);
+ optionValues = repositoryConfiguration.getOSs();
+ for (String option : optionValues) {
+ attributeOPSYS.putOption(option, option);
+ }
+ if (optionValues.size() > 0) {
+ // bug 159397 change to choose first op_sys All
+ attributeOPSYS.setValue(optionValues.get(0));
+ }
+
+ TaskAttribute attributePriority = createAttribute(taskData, BugzillaAttribute.PRIORITY);
+ optionValues = repositoryConfiguration.getPriorities();
+ for (String option : optionValues) {
+ attributePriority.putOption(option, option);
+ }
+ if (optionValues.size() > 0) {
+ // choose middle priority
+ attributePriority.setValue(optionValues.get((optionValues.size() / 2)));
+ }
+
+ TaskAttribute attributeSeverity = createAttribute(taskData, BugzillaAttribute.BUG_SEVERITY);
+ optionValues = repositoryConfiguration.getSeverities();
+ for (String option : optionValues) {
+ attributeSeverity.putOption(option, option);
+ }
+ if (optionValues.size() > 0) {
+ // choose middle severity
+ attributeSeverity.setValue(optionValues.get((optionValues.size() / 2)));
+ }
+
+ TaskAttribute attributeAssignedTo = createAttribute(taskData, BugzillaAttribute.ASSIGNED_TO);
+ attributeAssignedTo.setValue(""); //$NON-NLS-1$
+
+ TaskAttribute attributeQAContact = createAttribute(taskData, BugzillaAttribute.QA_CONTACT);
+ attributeQAContact.setValue(""); //$NON-NLS-1$
+
+ TaskAttribute attributeBugFileLoc = createAttribute(taskData, BugzillaAttribute.BUG_FILE_LOC);
+ attributeBugFileLoc.setValue("http://"); //$NON-NLS-1$
+
+ createAttribute(taskData, BugzillaAttribute.DEPENDSON);
+ createAttribute(taskData, BugzillaAttribute.BLOCKED);
+ createAttribute(taskData, BugzillaAttribute.NEWCC);
+ createAttribute(taskData, BugzillaAttribute.LONG_DESC);
+
+ List<String> keywords = repositoryConfiguration.getKeywords();
+ if (keywords.size() > 0) {
+ createAttribute(taskData, BugzillaAttribute.KEYWORDS);
+ }
+
+ TaskAttribute attrDescription = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION);
+ if (attrDescription != null) {
+ attrDescription.getMetaData().setReadOnly(false);
+ }
+ TaskAttribute attrOwner = taskData.getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED);
+ if (attrOwner != null) {
+ attrOwner.getMetaData().setReadOnly(false);
+ }
+ TaskAttribute attrAddSelfToCc = taskData.getRoot().getMappedAttribute(TaskAttribute.ADD_SELF_CC);
+ if (attrAddSelfToCc != null) {
+ attrAddSelfToCc.getMetaData().setKind(null);
+ }
+
+ List<BugzillaCustomField> customFields = new ArrayList<BugzillaCustomField>();
+ if (repositoryConfiguration != null) {
+ customFields = repositoryConfiguration.getCustomFields();
+ }
+ for (BugzillaCustomField bugzillaCustomField : customFields) {
+ if (bugzillaCustomField.isEnterBug()) {
+ TaskAttribute attribute = taskData.getRoot().createAttribute(bugzillaCustomField.getName());
+ if (attribute != null) {
+ attribute.getMetaData().defaults().setLabel(bugzillaCustomField.getDescription());
+ attribute.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
+
+ switch (bugzillaCustomField.getType()) {
+ case 1: // Free Text
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ break;
+ case 2: // Drop Down
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ break;
+ case 3: // Multiple-Selection Box
+ attribute.getMetaData().setType(TaskAttribute.TYPE_MULTI_SELECT);
+ break;
+ case 4: // Large Text Box
+ attribute.getMetaData().setType(TaskAttribute.TYPE_LONG_TEXT);
+ break;
+ case 5: // Date/Time
+ attribute.getMetaData().setType(TaskAttribute.TYPE_DATETIME);
+ break;
+
+ default:
+ List<String> options = bugzillaCustomField.getOptions();
+ if (options.size() > 0) {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ } else {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ attribute.getMetaData().setReadOnly(false);
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean canGetMultiTaskData(TaskRepository taskRepository) {
+ return true;
+ }
+
+ @Override
+ public boolean canInitializeSubTaskData(TaskRepository taskRepository, ITask task) {
+ return true;
+ }
+
+ @Override
+ public boolean initializeSubTaskData(TaskRepository repository, TaskData subTaskData, TaskData parentTaskData,
+ IProgressMonitor monitor) throws CoreException {
+ TaskMapper mapper = new TaskMapper(parentTaskData);
+ initializeTaskData(repository, subTaskData, mapper, monitor);
+ new TaskMapper(subTaskData).merge(mapper);
+ subTaskData.getRoot().getMappedAttribute(BugzillaAttribute.DEPENDSON.getKey()).setValue(""); //$NON-NLS-1$
+ subTaskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION).setValue(""); //$NON-NLS-1$
+ subTaskData.getRoot().getMappedAttribute(TaskAttribute.SUMMARY).setValue(""); //$NON-NLS-1$
+ TaskAttribute keywords = subTaskData.getRoot().getMappedAttribute(TaskAttribute.KEYWORDS);
+ if (keywords != null) {
+ // only if the repository has keywords this attribut exists
+ keywords.setValue(""); //$NON-NLS-1$
+ }
+ subTaskData.getRoot().getAttribute(BugzillaAttribute.BLOCKED.getKey()).setValue(parentTaskData.getTaskId());
+ TaskAttribute parentAttributeAssigned = parentTaskData.getRoot()
+ .getMappedAttribute(TaskAttribute.USER_ASSIGNED);
+ subTaskData.getRoot().getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey()).setValue(
+ parentAttributeAssigned.getValue());
+ return true;
+ }
+
+ @Override
+ public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) {
+ return new BugzillaAttributeMapper(taskRepository);
+ }
+
+ public static TaskAttribute createAttribute(TaskData data, BugzillaAttribute key) {
+ return createAttribute(data.getRoot(), key);
+ }
+
+ public static TaskAttribute createAttribute(TaskAttribute parent, BugzillaAttribute key) {
+ TaskAttribute attribute = parent.createAttribute(key.getKey());
+ attribute.getMetaData()
+ .defaults()
+ .setReadOnly(key.isReadOnly())
+ .setKind(key.getKind())
+ .setLabel(key.toString())
+ .setType(key.getType());
+ return attribute;
+ }
+
+ public void postUpdateAttachment(TaskRepository repository, TaskAttribute taskAttribute, String action,
+ IProgressMonitor monitor) throws CoreException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask(Messages.BugzillaTaskDataHandler_updating_attachment, IProgressMonitor.UNKNOWN);
+ BugzillaClient client = connector.getClientManager().getClient(repository, monitor);
+ try {
+ client.postUpdateAttachment(taskAttribute, action, monitor);
+ } catch (CoreException e) {
+ // TODO: Move retry handling into client
+ if (e.getStatus().getCode() == RepositoryStatus.ERROR_REPOSITORY_LOGIN) {
+ AuthenticationCredentials creds = repository.getCredentials(AuthenticationType.REPOSITORY);
+ if (creds != null && creds.getUserName() != null && creds.getUserName().length() > 0) {
+ client.postUpdateAttachment(taskAttribute, action, monitor);
+ } else {
+ throw e;
+ }
+ } else {
+ throw e;
+ }
+ }
+ } catch (IOException e) {
+ throw new CoreException(new BugzillaStatus(IStatus.ERROR, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, repository.getRepositoryUrl(), e));
+ } finally {
+ monitor.done();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaVersion.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaVersion.java
new file mode 100644
index 0000000..d7ea352
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/BugzillaVersion.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.Serializable;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaVersion implements Comparable<BugzillaVersion>, Serializable {
+
+ private static final long serialVersionUID = 2027987556171301044L;
+
+ public final static BugzillaVersion MIN_VERSION = new BugzillaVersion("2.18"); //$NON-NLS-1$
+
+ public final static BugzillaVersion BUGZILLA_2_18 = new BugzillaVersion("2.18"); //$NON-NLS-1$
+
+ public final static BugzillaVersion BUGZILLA_2_22 = new BugzillaVersion("2.22"); //$NON-NLS-1$
+
+ public final static BugzillaVersion BUGZILLA_3_0 = new BugzillaVersion("3.0"); //$NON-NLS-1$
+
+ public final static BugzillaVersion BUGZILLA_3_2 = new BugzillaVersion("3.2"); //$NON-NLS-1$
+
+ public final static BugzillaVersion MAX_VERSION = new BugzillaVersion("3.2"); //$NON-NLS-1$
+
+ private final int major;
+
+ private final int minor;
+
+ private int micro;
+
+ private final boolean rc;
+
+ public BugzillaVersion(String version) {
+ String[] segments;
+ if (version == null) {
+ segments = new String[0];
+ rc = false;
+ } else {
+ rc = version.contains("RC"); //$NON-NLS-1$
+ segments = rc ? version.split("(\\.|([R][C]))") : version.split("\\."); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ 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 (rc) {
+ micro -= 100;
+ }
+ }
+
+ private int parse(String segment) {
+ try {
+ return segment.length() == 0 ? 0 : Integer.parseInt(getVersion(segment));
+ } catch (NumberFormatException ex) {
+ return 0;
+ }
+ }
+
+ private String getVersion(String segment) {
+ int n = segment.indexOf('-');
+ return n == -1 ? segment : segment.substring(0, n);
+ }
+
+ public boolean isSmallerOrEquals(BugzillaVersion v) {
+ return compareTo(v) <= 0;
+ }
+
+ public int compareTo(BugzillaVersion 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;
+ }
+
+ return 0;
+ }
+
+ public int compareMajorMinorOnly(BugzillaVersion 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;
+ }
+ return 0;
+ }
+
+ @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$
+ } else if (micro < 0) {
+ sb.append("RC").append(Integer.toString(micro + 100)); //$NON-NLS-1$
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/GzipGetMethod.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/GzipGetMethod.java
new file mode 100644
index 0000000..e96f380
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/GzipGetMethod.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Maarten Meijer 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:
+ * Maarten Meijer - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.IOException;
+
+import org.apache.commons.httpclient.HttpConnection;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.methods.GetMethod;
+
+/**
+ * Use <code>GzipGetMethod</code> instead of {@link GetMethod} to make Mylyn well-behaved when accessing repositories
+ * that can supply gzipped responses.<br />
+ * <br>
+ * References:
+ * <ul>
+ * <li><a href="http://www.schroepl.net/projekte/mod_gzip/index.htm">Gzip home</a></li>
+ * <li><a href="http://www.oreilly.com/catalog/9780596529307/chapter/ch04.pdf">Gzip site comparison</a></li>
+ * </ul>
+ *
+ * @see GzipPostMethod, GetMethod
+ *
+ * @author Maarten Meijer
+ */
+public class GzipGetMethod extends GetMethod {
+ private final boolean gzipWanted;
+
+ /**
+ * @param requestPath
+ * the URI to request
+ * @param gzipWanted
+ * is compression desired (for debugging or optionalizing)
+ */
+ public GzipGetMethod(String requestPath, boolean gzipWanted) {
+ super(requestPath);
+ this.gzipWanted = gzipWanted;
+ }
+
+ @Override
+ public int execute(HttpState state, HttpConnection conn) throws HttpException, IOException {
+ // Insert accept-encoding header
+ if (gzipWanted) {
+ this.setRequestHeader("Accept-encoding", IBugzillaConstants.CONTENT_ENCODING_GZIP); //$NON-NLS-1$
+ }
+ int result = super.execute(state, conn);
+ return result;
+ }
+
+ /**
+ * getResponseBodyNoop is meant for clearing the response body in case of error. The result is never used so no need
+ * to unzip it first.
+ *
+ * @throws IOException
+ */
+ public void getResponseBodyNoop() throws IOException {
+ // result is ignored
+ super.getResponseBody();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/GzipPostMethod.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/GzipPostMethod.java
new file mode 100644
index 0000000..cf43553
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/GzipPostMethod.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Maarten Meijer 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:
+ * Maarten Meijer - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.IOException;
+
+import org.apache.commons.httpclient.HttpConnection;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.methods.PostMethod;
+
+/**
+ * Use <code>GzipPostMethod</code> instead of {@link PostMethod} to make Mylyn well-behaved when accessing repositories
+ * that can supply gzipped responses.<br />
+ * <br>
+ * References:
+ * <ul>
+ * <li><a href="http://www.schroepl.net/projekte/mod_gzip/index.htm">Gzip home</a></li>
+ * <li><a href="http://www.oreilly.com/catalog/9780596529307/chapter/ch04.pdf">Gzip site comparison</a></li>
+ * </ul>
+ *
+ * @see GzipGetMethod, PostMethod
+ *
+ * @author Maarten Meijer
+ */
+public class GzipPostMethod extends PostMethod {
+ private final boolean gzipWanted;
+
+ /**
+ * @param requestPath
+ * the URI to request
+ * @param gzipWanted
+ * is compression desired (for debugging or optionalizing)
+ */
+ public GzipPostMethod(String requestPath, boolean gzipWanted) {
+ super(requestPath);
+ this.gzipWanted = gzipWanted;
+ }
+
+ @Override
+ public int execute(HttpState state, HttpConnection conn) throws HttpException, IOException {
+ // Insert accept-encoding header
+ if (gzipWanted) {
+ this.setRequestHeader("Accept-encoding", IBugzillaConstants.CONTENT_ENCODING_GZIP); //$NON-NLS-1$
+ }
+ int result = super.execute(state, conn);
+ return result;
+ }
+
+ /**
+ * getResponseBodyNoop is meant for clearing the response body in case of error. The result is never used so no need
+ * to unzip it first.
+ *
+ * @throws IOException
+ */
+ public void getResponseBodyNoop() throws IOException {
+ // result is ignored
+ super.getResponseBody();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java
new file mode 100644
index 0000000..ca6b005
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/IBugzillaConstants.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IBugzillaConstants {
+
+ //public static final String POST_ARGS_PASSWORD = "&Bugzilla_password=";
+ //public static final String POST_ARGS_LOGIN = "GoAheadAndLogIn=1&Bugzilla_login=";
+
+ public static final String PROPERTY_CONFIGTIMESTAMP = "org.eclipse.mylyn.tasklist.repositories.config.timestamp"; //$NON-NLS-1$
+
+ static final String ERROR_MIDAIR_COLLISION = "collision"; //$NON-NLS-1$
+
+ static final String ERROR_MSG_MIDAIR_COLLISION = "A mid-air collision has occurred. Please synchronize by selecting Synchronize in the task's context menu."; //$NON-NLS-1$
+
+ static final String ERROR_COMMENT_REQUIRED = "comment required"; //$NON-NLS-1$
+
+ static final String ERROR_MSG_COMMENT_REQUIRED = "You have to specify a new comment when making this change. Please comment on the reason for this change."; //$NON-NLS-1$
+
+ static final String ERROR_INVALID_USERNAME_OR_PASSWORD = "Invalid Username or Password"; //$NON-NLS-1$
+
+ static final String LOGGED_OUT = "logged out"; //$NON-NLS-1$
+
+ static final String MOST_RECENT_QUERY = "org.eclipse.mylyn.bugzilla.query.last"; //$NON-NLS-1$
+
+ static final String SERVER_VERSION = "org.eclipse.mylyn.bugzilla.server.version"; //$NON-NLS-1$
+
+ public static final int RETURN_ALL_HITS = -1;
+
+ public static final String CONTENT_TYPE_RDF = "&ctype=rdf"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_BUGZILLA_PASSWORD = "Bugzilla_password"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_BUGZILLA_LOGIN = "Bugzilla_login"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_BUGID = "bugid"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_ACTION = "action"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_COMMENT = "comment"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_DESCRIPTION = "description"; //$NON-NLS-1$
+
+ public static final String POST_INPUT_DATA = "data"; //$NON-NLS-1$
+
+ public static final String URL_POST_LOGIN = "/index.cgi"; //$NON-NLS-1$
+
+ public static final String URL_POST_ATTACHMENT_UPLOAD = "/attachment.cgi"; //$NON-NLS-1$
+
+ public static final String URL_BUGLIST = "/buglist.cgi"; //$NON-NLS-1$
+
+ public static final String URL_GET_ATTACHMENT_DOWNLOAD = "/attachment.cgi?id="; //$NON-NLS-1$
+
+ public static final String URL_GET_ATTACHMENT_SUFFIX = "/attachment.cgi?id="; //$NON-NLS-1$
+
+ public static final String URL_BUG_ACTIVITY = "/show_activity.cgi?id="; //$NON-NLS-1$
+
+ public static final String URL_SHOW_VOTES = "/votes.cgi?action=show_bug&bug_id="; //$NON-NLS-1$
+
+ public static final String URL_VOTE = "/votes.cgi?action=show_user&bug_id="; //$NON-NLS-1$
+
+ public static final String URL_DEPENDENCY_TREE = "/showdependencytree.cgi?id="; //$NON-NLS-1$
+
+ public static final String URL_DEPENDENCY_GRAPH = "/showdependencygraph.cgi?id="; //$NON-NLS-1$
+
+ public static final String URL_GET_SHOW_BUG = "/show_bug.cgi?id="; //$NON-NLS-1$
+
+ public static final String URL_GET_CONFIG_RDF = "/config.cgi?ctype=rdf"; //$NON-NLS-1$
+
+ //For including fields in the xml (XML Summary mode as they like to call it)
+ //use &field=fieldname for example to only reveal the product information append &field=product
+ //to exclude from the xml use excludefield=fieldname. See bugzilla QuckSearch for a list of
+ //fields that can be used (repositoryurl/quicksearchhack.html).
+ //If somebody knows where this is officially documented I'd appreciate it if they would post a link here
+ // and on bug#161321. Thanks -relves
+ // (see also: https://bugzilla.mozilla.org/show_bug.cgi?id=136603https://bugzilla.mozilla.org/show_bug.cgi?id=136603)
+ public static final String URL_GET_SHOW_BUG_XML = "/show_bug.cgi?ctype=xml&excludefield=attachmentdata&id="; //$NON-NLS-1$
+
+ public static final String URL_GET_SHOW_BUG_XML_NOID = "/show_bug.cgi?ctype=xml&excludefield=attachmentdata"; //$NON-NLS-1$
+
+ public static final String URL_POST_SHOW_BUG = "/show_bug.cgi"; //$NON-NLS-1$
+
+ public static final String XML_ERROR_INVALIDBUGID = "invalidbugid"; //$NON-NLS-1$
+
+ public static final String XML_ERROR_NOTFOUND = "notfound"; //$NON-NLS-1$
+
+ public static final String XML_ERROR_NOTPERMITTED = "notpermitted"; //$NON-NLS-1$
+
+ public static final String ENCODING_UTF_8 = "UTF-8"; //$NON-NLS-1$
+
+ public static final int REPOSITORY_STATUS_SUSPICIOUS_ACTION = 99;
+
+ /** Supported bugzilla repository versions */
+ static public enum BugzillaServerVersion {
+ SERVER_218, SERVER_220, SERVER_222, SERVER_30;
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case SERVER_30:
+ return "3.0"; //$NON-NLS-1$
+ case SERVER_222:
+ return "2.22"; //$NON-NLS-1$
+ case SERVER_220:
+ return "2.20"; //$NON-NLS-1$
+ case SERVER_218:
+ return "2.18"; //$NON-NLS-1$
+ default:
+ return "null"; //$NON-NLS-1$
+ }
+ }
+
+ /** returns null if version string unknown* */
+ static public BugzillaServerVersion fromString(String version) {
+ if (version.equals(SERVER_30.toString())) {
+ return SERVER_30;
+ }
+ if (version.equals(SERVER_222.toString())) {
+ return SERVER_222;
+ }
+ if (version.equals(SERVER_220.toString())) {
+ return SERVER_220;
+ }
+ if (version.equals(SERVER_218.toString())) {
+ return SERVER_218;
+ }
+ return null;
+ }
+ }
+
+ /**
+ * Current Stable Major Release
+ */
+ public static final BugzillaServerVersion SERVER_VERSION_DEFAULT = BugzillaServerVersion.SERVER_30;
+
+ static final String REFRESH_QUERY = "org.eclipse.mylyn.bugzilla.query.refresh"; //$NON-NLS-1$
+
+ static final String MAX_RESULTS = "org.eclipse.mylyn.bugzilla.search.results.max"; //$NON-NLS-1$
+
+ // names for the resources used to hold the different attributes of a bug
+ static final String VALUES_STATUS = "org.eclipse.mylyn.bugzilla.values.status"; //$NON-NLS-1$
+
+ static final String VALUES_RESOLUTION = "org.eclipse.mylyn.bugzilla.values.resolution"; //$NON-NLS-1$
+
+ static final String VALUES_COMPONENT = "org.eclipse.mylyn.bugzilla.values.component"; //$NON-NLS-1$
+
+ static final String VALUES_VERSION = "org.eclipse.mylyn.bugzilla.values.version"; //$NON-NLS-1$
+
+ static final String VALUES_TARGET = "org.eclipse.mylyn.bugzilla.values.target"; //$NON-NLS-1$
+
+ static final String ECLIPSE_BUGZILLA_URL = "https://bugs.eclipse.org/bugs"; //$NON-NLS-1$
+
+ // Default values for keys
+
+ static final String[] DEFAULT_STATUS_VALUES = { "Unconfirmed", "New", "Assigned", "Reopened", "Resolved", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$
+ "Verified", "Closed" }; //$NON-NLS-1$//$NON-NLS-2$
+
+ static final String[] DEFAULT_PRESELECTED_STATUS_VALUES = { "New", "Assigned", "Reopened" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+ // static final String[] DEFAULT_RESOLUTION_VALUES = { "Fixed", "Invalid",
+ // "Wontfix", "Later", "Remind", "Duplicate",
+ // "Worksforme", "Moved" };
+
+ static final String[] DEFAULT_SEVERITY_VALUES = { "blocker", "critical", "major", "normal", "minor", "trivial", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ "enhancement" }; //$NON-NLS-1$
+
+ static final String[] DEFAULT_PRIORITY_VALUES = { "P1", "P2", "P3", "P4", "P5" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+
+ static final String[] DEFAULT_HARDWARE_VALUES = { "All", "Macintosh", "PC", "Power PC", "Sun", "Other" }; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+
+ static final String[] DEFAULT_OS_VALUES = { "All", "AIX Motif", "Windows 95", "Windows 98", "Windows CE", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$
+ "Windows ME", "Windows 2000", "Windows NT", "Windows XP", "Windows All", "MacOS X", "Linux", "Linux-GTK", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+ "Linux-Motif", "HP-UX", "Neutrino", "QNX-Photon", "Solaris", "Unix All", "other" }; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$//$NON-NLS-6$//$NON-NLS-7$
+
+ static final String[] DEFAULT_PRODUCT_VALUES = {};
+
+ static final String[] DEFAULT_COMPONENT_VALUES = {};
+
+ static final String[] DEFAULT_VERSION_VALUES = {};
+
+ static final String[] DEFAULT_TARGET_VALUES = {};
+
+ public static final String TITLE_MESSAGE_DIALOG = Messages.IBugzillaConstants_Mylyn_Bugzilla_Connector;
+
+ public static final String TITLE_NEW_BUG = Messages.IBugzillaConstants_New_Bugzilla_Report;
+
+ public static final String MESSAGE_LOGIN_FAILURE = Messages.IBugzillaConstants_Bugzilla_login_information_or_repository_version_incorrect;
+
+ public static final String INVALID_2201_ATTRIBUTE_IGNORED = "EclipsebugsBugzilla2.20.1"; //$NON-NLS-1$
+
+ public static final String VALUE_STATUS_RESOLVED = "RESOLVED"; //$NON-NLS-1$
+
+ public static final String VALUE_STATUS_NEW = "NEW"; //$NON-NLS-1$
+
+ public static final String VALUE_STATUS_CLOSED = "CLOSED"; //$NON-NLS-1$
+
+ public static final String VALUE_STATUS_ASSIGNED = "ASSIGNED"; //$NON-NLS-1$
+
+ public static final String VALUE_STATUS_VERIFIED = "VERIFIED"; //$NON-NLS-1$
+
+ public static final String VALUE_RESOLUTION_LATER = "LATER"; //$NON-NLS-1$
+
+ public static enum BUGZILLA_REPORT_STATUS {
+ UNCONFIRMED, NEW, ASSIGNED, REOPENED, RESOLVED, VERIFIED, CLOSED, SCHEDULED;
+ }
+
+ public static enum BUGZILLA_RESOLUTION_2_0 {
+ FIXED, INVALID, WONTFIX, LATER, REMIND, WORKSFORME;
+ }
+
+ public static enum BUGZILLA_RESOLUTION_3_0 {
+ FIXED, INVALID, WONTFIX, WORKSFORME;
+ }
+
+ public static final String ERROR_MSG_OP_NOT_PERMITTED = Messages.IBugzillaConstants_requested_operation_not_permitted;
+
+ public static final String ERROR_MSG_INVALID_BUG_ID = Messages.IBugzillaConstants_invalid_bug_id_requested_bug_id_does_not_exist;
+
+ public static final String INVALID_CREDENTIALS = Messages.IBugzillaConstants_invalid_repository_credentials;
+
+ public static final String SHOW_ACTIVITY = "/show_activity.cgi?id="; //$NON-NLS-1$
+
+ public static final String REPOSITORY_SETTING_SHORT_LOGIN = "bugzilla.shortLoginEnabled"; //$NON-NLS-1$
+
+ public static final String BUGZILLA_TASK_KIND = "Bug"; //$NON-NLS-1$
+
+ static final int MAX_URL_LENGTH = 2000;
+
+ public static final String TIMESTAMP_NOT_AVAILABLE = "n/a"; //$NON-NLS-1$
+
+ public static final String BUGZILLA_DEF_OS = "bugzilla.default.os"; //$NON-NLS-1$
+
+ public static final String BUGZILLA_DEF_PLATFORM = "bugzilla.default.platform"; //$NON-NLS-1$
+
+ public static final String BUGZILLA_LANGUAGE_SETTING = "bugzilla.languageSetting"; //$NON-NLS-1$
+
+ public static final String DEFAULT_LANG = "en (default)"; //$NON-NLS-1$
+
+ // Bugzilla Task Attribute Editor Types
+
+ public static final String EDITOR_TYPE_KEYWORDS = "bugzilla.editor.keywords"; //$NON-NLS-1$
+
+ public static final String EDITOR_TYPE_REMOVECC = "bugzilla.editor.removecc"; //$NON-NLS-1$
+
+ public static final String EDITOR_TYPE_VOTES = "bugzilla.editor.votes"; //$NON-NLS-1$
+
+ public static final String EDITOR_TYPE_FLAG = "bugzilla.editor.flag"; //$NON-NLS-1$
+
+ public static final String ATTRIBUTE_BUGZILLA_QUERY_CUSTOM = "bugzilla.query.custom"; //$NON-NLS-1$
+
+ // Old Tags used for migration
+ public static final String TAG_BUGZILLA_QUERY = "BugzillaQuery"; //$NON-NLS-1$
+
+ public static final String TAG_BUGZILLA_CUSTOM_QUERY = "BugzillaCustomQuery"; //$NON-NLS-1$
+
+ public static final String CONTENT_ENCODING_GZIP = "gzip"; //$NON-NLS-1$
+
+ public static final String LAST_PRODUCT_SELECTION = "last.selection.product"; //$NON-NLS-1$
+
+ public static final String LAST_COMPONENT_SELECTION = "last.selection.component"; //$NON-NLS-1$
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/KeywordParser.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/KeywordParser.java
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/KeywordParser.java
@@ -0,0 +1,7 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 Mylyn project committers 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
+ *******************************************************************************/
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/Messages.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/Messages.java
new file mode 100644
index 0000000..9c0b197
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/Messages.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.core.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String BugzillaAttribute_Add;
+
+ public static String BugzillaAttribute_Add_CC;
+
+ public static String BugzillaAttribute_Add_self_to_CC;
+
+ public static String BugzillaAttribute_Additional_Comments;
+
+ public static String BugzillaAttribute_Assigned_to;
+
+ public static String BugzillaAttribute_Assigned_to_NAME;
+
+ public static String BugzillaAttribute_ATTACH_ID;
+
+ public static String BugzillaAttribute_attachment;
+
+ public static String BugzillaAttribute_Blocks;
+
+ public static String BugzillaAttribute_bug;
+
+ public static String BugzillaAttribute_Bug_ID;
+
+ public static String BugzillaAttribute_bug_when;
+
+ public static String BugzillaAttribute_bugzilla;
+
+ public static String BugzillaAttribute_CC;
+
+ public static String BugzillaAttribute_CC_List;
+
+ public static String BugzillaAttribute_Classification;
+
+ public static String BugzillaAttribute_Classification_ID;
+
+ public static String BugzillaAttribute_Component;
+
+ public static String BugzillaAttribute_Content_Type;
+
+ public static String BugzillaAttribute_data;
+
+ public static String BugzillaAttribute_Date;
+
+ public static String BugzillaAttribute_Depends_on__Subtasks_;
+
+ public static String BugzillaAttribute_desc;
+
+ public static String BugzillaAttribute_Description;
+
+ public static String BugzillaAttribute_Due;
+
+ public static String BugzillaAttribute_Estimated_Time;
+
+ public static String BugzillaAttribute_everconfirmed;
+
+ public static String BugzillaAttribute_filename;
+
+ public static String BugzillaAttribute_flag;
+
+ public static String BugzillaAttribute_Group;
+
+ public static String BugzillaAttribute_Keywords;
+
+ public static String BugzillaAttribute_Modified;
+
+ public static String BugzillaAttribute_new_comment;
+
+ public static String BugzillaAttribute_Number_of_comments;
+
+ public static String BugzillaAttribute_Obsolete;
+
+ public static String BugzillaAttribute_open_status_values;
+
+ public static String BugzillaAttribute_Opened;
+
+ public static String BugzillaAttribute_OS;
+
+ public static String BugzillaAttribute_Patch;
+
+ public static String BugzillaAttribute_Platform;
+
+ public static String BugzillaAttribute_Priority;
+
+ public static String BugzillaAttribute_Product;
+
+ public static String BugzillaAttribute_QA_Contact;
+
+ public static String BugzillaAttribute_QA_Contact_NAME;
+
+ public static String BugzillaAttribute_Reassign_to_default_assignee;
+
+ public static String BugzillaAttribute_Remaining;
+
+ public static String BugzillaAttribute_Remove_CC;
+
+ public static String BugzillaAttribute_REPORT_ACCESSIBLE;
+
+ public static String BugzillaAttribute_REPORT_NAME;
+
+ public static String BugzillaAttribute_Reporter;
+
+ public static String BugzillaAttribute_Resolution;
+
+ public static String BugzillaAttribute_Severity;
+
+ public static String BugzillaAttribute_Size;
+
+ public static String BugzillaAttribute_Status;
+
+ public static String BugzillaAttribute_Status_Whiteboard;
+
+ public static String BugzillaAttribute_Summary;
+
+ public static String BugzillaAttribute_Target_milestone;
+
+ public static String BugzillaAttribute_thetext;
+
+ public static String BugzillaAttribute_type;
+
+ public static String BugzillaAttribute_UNKNOWN;
+
+ public static String BugzillaAttribute_URL;
+
+ public static String BugzillaAttribute_used_by_search_engine_bugs;
+
+ public static String BugzillaAttribute_used_by_search_engine_desc;
+
+ public static String BugzillaAttribute_used_by_search_engine_id;
+
+ public static String BugzillaAttribute_used_by_search_engine_installation;
+
+ public static String BugzillaAttribute_used_by_search_engine_li;
+
+ public static String BugzillaAttribute_used_by_search_engine_rdf;
+
+ public static String BugzillaAttribute_used_by_search_engine_result;
+
+ public static String BugzillaAttribute_used_by_search_engine_seq;
+
+ public static String BugzillaAttribute_Version;
+
+ public static String BugzillaAttribute_version_of_bugzilla_installed;
+
+ public static String BugzillaAttribute_Votes;
+
+ public static String BugzillaAttribute_who;
+
+ public static String BugzillaAttribute_who_name;
+
+ public static String BugzillaAttribute_Worked;
+
+ public static String BugzillaClient_could_not_post_form_null_returned;
+
+ public static String BugzillaClient_description_required_when_submitting_attachments;
+
+ public static String BugzillaOperation_Accept_to_ASSIGNED;
+
+ public static String BugzillaOperation_Duplicate_of;
+
+ public static String BugzillaOperation_Leave_as_X_X;
+
+ public static String BugzillaOperation_Mark_as_CLOSED;
+
+ public static String BugzillaOperation_Mark_as_VERIFIED;
+
+ public static String BugzillaOperation_Reassign_to;
+
+ public static String BugzillaOperation_Reopen_bug;
+
+ public static String BugzillaOperation_Resolve_as;
+
+ public static String BugzillaOperation_Reassign_to_default_assignee;
+
+ public static String BugzillaRepositoryConnector_BUGZILLA_SUPPORTS_2_18_TO_3_0;
+
+ public static String BugzillaRepositoryConnector_Check_repository_configuration;
+
+ public static String BugzillaRepositoryConnector_checking_for_changed_tasks;
+
+ public static String BugzillaRepositoryConnector_Query_for_changed_tasks;
+
+ public static String BugzillaRepositoryConnector_running_query;
+
+ public static String BugzillaRepositoryConnector_Unrecognized_response_from_server;
+
+ public static String BugzillaTaskAttachmentHandler_Getting_attachment;
+
+ public static String BugzillaTaskAttachmentHandler_Sending_attachment;
+
+ public static String BugzillaTaskAttachmentHandler_unable_to_submit_attachment;
+
+ public static String BugzillaTaskDataHandler_Receiving_tasks;
+
+ public static String BugzillaTaskDataHandler_Submitting_task;
+
+ public static String BugzillaTaskDataHandler_updating_attachment;
+
+ public static String IBugzillaConstants_Bugzilla_login_information_or_repository_version_incorrect;
+
+ public static String IBugzillaConstants_invalid_bug_id_requested_bug_id_does_not_exist;
+
+ public static String IBugzillaConstants_invalid_repository_credentials;
+
+ public static String IBugzillaConstants_Mylyn_Bugzilla_Connector;
+
+ public static String IBugzillaConstants_New_Bugzilla_Report;
+
+ public static String IBugzillaConstants_requested_operation_not_permitted;
+
+ public static String SaxMultiBugReportContentHandler_Bug_id_from_server_did_not_match_requested_id;
+
+ public static String SaxMultiBugReportContentHandler_id_not_found;
+
+ public static String BugzillaStatus_repositoryLoginFailure;
+
+ public static String BugzillaStatus_repositoryNotFound;
+
+ public static String BugzillaStatus_repositoryCommentRequired;
+
+ public static String BugzillaStatus_repositoryCollision;
+
+ public static String BugzillaStatus_operationCancelled;
+
+ public static String BugzillaStatus_errorIo;
+
+ public static String BugzillaStatus_errorInternal;
+
+ public static String BugzillaStatus_errorRepository;
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/MultiBugReportFactory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/MultiBugReportFactory.java
new file mode 100644
index 0000000..604d54f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/MultiBugReportFactory.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+
+/**
+ * Reads bug reports from repository.
+ *
+ * @author Rob Elves
+ */
+public class MultiBugReportFactory extends AbstractReportFactory {
+
+ public MultiBugReportFactory(InputStream inStream, String encoding) {
+ super(inStream, encoding);
+ }
+
+ public void populateReport(Map<String, TaskData> bugMap, TaskDataCollector collector, TaskAttributeMapper mapper,
+ List<BugzillaCustomField> customFields) throws IOException, CoreException {
+
+ SaxMultiBugReportContentHandler contentHandler = new SaxMultiBugReportContentHandler(mapper, collector, bugMap,
+ customFields);
+ collectResults(contentHandler, false);
+
+ if (contentHandler.errorOccurred()) {
+ String errorResponse = contentHandler.getErrorMessage().toLowerCase(Locale.ENGLISH);
+ if (errorResponse.equals(IBugzillaConstants.XML_ERROR_NOTFOUND)
+ || errorResponse.equals(IBugzillaConstants.XML_ERROR_INVALIDBUGID)) {
+ throw new CoreException(new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY, "", IBugzillaConstants.ERROR_MSG_INVALID_BUG_ID)); //$NON-NLS-1$
+ } else if (errorResponse.equals(IBugzillaConstants.XML_ERROR_NOTPERMITTED)) {
+ BugzillaStatus status = new BugzillaStatus(IStatus.INFO, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY_LOGIN, mapper.getTaskRepository().getRepositoryUrl(),
+ IBugzillaConstants.ERROR_MSG_OP_NOT_PERMITTED);
+ throw new CoreException(status);
+ } else {
+ throw new CoreException(new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY, "", "Unexpected error occurred: " + errorResponse)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfiguration.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfiguration.java
new file mode 100644
index 0000000..f882333
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfiguration.java
@@ -0,0 +1,710 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants.BUGZILLA_REPORT_STATUS;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskOperation;
+
+/**
+ * Class describing the configuration of products and components for a given Bugzilla installation.
+ *
+ * @author Rob Elves
+ */
+public class RepositoryConfiguration implements Serializable {
+
+ private static final long serialVersionUID = -1162588743524741054L;
+
+ private String repositoryUrl = "<unknown>"; //$NON-NLS-1$
+
+ private final Map<String, ProductEntry> products = new HashMap<String, ProductEntry>();
+
+ private final List<String> platforms = new ArrayList<String>();
+
+ private final List<String> operatingSystems = new ArrayList<String>();
+
+ private final List<String> priorities = new ArrayList<String>();
+
+ private final List<String> severities = new ArrayList<String>();
+
+ private final List<String> bugStatus = new ArrayList<String>();
+
+ private final List<String> openStatusValues = new ArrayList<String>();
+
+ private final List<String> resolutionValues = new ArrayList<String>();
+
+ private final List<String> keywords = new ArrayList<String>();
+
+ // master lists
+
+ private final List<String> versions = new ArrayList<String>();
+
+ private final List<String> components = new ArrayList<String>();
+
+ private final List<String> milestones = new ArrayList<String>();
+
+ private final List<BugzillaCustomField> customFields = new ArrayList<BugzillaCustomField>();
+
+ private final List<BugzillaFlag> flags = new ArrayList<BugzillaFlag>();
+
+ private BugzillaVersion version = BugzillaVersion.MIN_VERSION;
+
+ private String encoding = null;
+
+ public RepositoryConfiguration() {
+ super();
+ }
+
+ public void addStatus(String status) {
+ bugStatus.add(status);
+ }
+
+ public List<String> getStatusValues() {
+ return bugStatus;
+ }
+
+ public void addResolution(String res) {
+ resolutionValues.add(res);
+ }
+
+ public List<String> getResolutions() {
+ return resolutionValues;
+ }
+
+ /**
+ * Adds a product to the configuration.
+ */
+ public void addProduct(String name) {
+ if (!products.containsKey(name)) {
+ ProductEntry product = new ProductEntry(name);
+ products.put(name, product);
+ }
+ }
+
+ /**
+ * Returns an array of names of current products.
+ */
+ public List<String> getProducts() {
+ ArrayList<String> productList = new ArrayList<String>(products.keySet());
+ Collections.sort(productList);
+ return productList;
+ }
+
+ /**
+ * Returns an array of names of component that exist for a given product or <code>null</code> if the product does
+ * not exist.
+ */
+ public List<String> getComponents(String product) {
+ ProductEntry entry = products.get(product);
+ if (entry != null) {
+ return entry.getComponents();
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Returns an array of names of versions that exist for a given product or <code>null</code> if the product does not
+ * exist.
+ */
+ public List<String> getVersions(String product) {
+ ProductEntry entry = products.get(product);
+ if (entry != null) {
+ return entry.getVersions();
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Returns an array of names of valid severity values.
+ */
+ public List<String> getSeverities() {
+ return severities;
+ }
+
+ /**
+ * Returns an array of names of valid OS values.
+ */
+ public List<String> getOSs() {
+ return operatingSystems;
+ }
+
+ public void addOS(String os) {
+ operatingSystems.add(os);
+ }
+
+ /**
+ * Returns an array of names of valid platform values.
+ */
+ public List<String> getPlatforms() {
+ return platforms;
+ }
+
+ /**
+ * Returns an array of names of valid platform values.
+ */
+ public List<String> getPriorities() {
+ return priorities;
+ }
+
+ /**
+ * Adds a component to the given product.
+ */
+ public void addComponent(String product, String component) {
+ if (!components.contains(component)) {
+ components.add(component);
+ }
+ ProductEntry entry = products.get(product);
+ if (entry == null) {
+ entry = new ProductEntry(product);
+ products.put(product, entry);
+ }
+ entry.addComponent(component);
+ }
+
+ public void addVersion(String product, String version) {
+ if (!versions.contains(version)) {
+ versions.add(version);
+ }
+ ProductEntry entry = products.get(product);
+ if (entry == null) {
+ entry = new ProductEntry(product);
+ products.put(product, entry);
+ }
+ entry.addVersion(version);
+ }
+
+ public void addKeyword(String keyword) {
+ keywords.add(keyword);
+ }
+
+ public List<String> getKeywords() {
+ return keywords;
+ }
+
+ public void addPlatform(String platform) {
+ platforms.add(platform);
+ }
+
+ public void addPriority(String priority) {
+ priorities.add(priority);
+ }
+
+ public void addSeverity(String severity) {
+ severities.add(severity);
+
+ }
+
+ public void setInstallVersion(String version) {
+ this.version = new BugzillaVersion(version);
+ }
+
+ public BugzillaVersion getInstallVersion() {
+ return version;
+ }
+
+ public void addTargetMilestone(String product, String target) {
+ if (!milestones.contains(target)) {
+ milestones.add(target);
+ }
+ ProductEntry entry = products.get(product);
+ if (entry == null) {
+ entry = new ProductEntry(product);
+ products.put(product, entry);
+ }
+
+ entry.addTargetMilestone(target);
+
+ }
+
+ public List<String> getTargetMilestones(String product) {
+ ProductEntry entry = products.get(product);
+ if (entry != null) {
+ return entry.getTargetMilestones();
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Container for product information: name, components.
+ */
+ private static class ProductEntry implements Serializable {
+
+ private static final long serialVersionUID = 4120139521246741120L;
+
+ @SuppressWarnings("unused")
+ String productName;
+
+ List<String> components = new ArrayList<String>();
+
+ List<String> versions = new ArrayList<String>();
+
+ List<String> milestones = new ArrayList<String>();
+
+ ProductEntry(String name) {
+ this.productName = name;
+ }
+
+ List<String> getComponents() {
+ return components;
+ }
+
+ void addComponent(String componentName) {
+ if (!components.contains(componentName)) {
+ components.add(componentName);
+ }
+ }
+
+ List<String> getVersions() {
+ return versions;
+ }
+
+ void addVersion(String name) {
+ if (!versions.contains(name)) {
+ versions.add(name);
+ }
+ }
+
+ List<String> getTargetMilestones() {
+ return milestones;
+ }
+
+ void addTargetMilestone(String target) {
+ milestones.add(target);
+ }
+ }
+
+ public List<String> getOpenStatusValues() {
+ return openStatusValues;
+ }
+
+ public void addOpenStatusValue(String value) {
+ openStatusValues.add(value);
+ }
+
+ public List<String> getComponents() {
+ return components;
+ }
+
+ public List<String> getTargetMilestones() {
+ return milestones;
+ }
+
+ public List<String> getVersions() {
+ return versions;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ /*
+ * Intermediate step until configuration is made generic.
+ */
+ public List<String> getOptionValues(BugzillaAttribute element, String product) {
+ switch (element) {
+ case PRODUCT:
+ return getProducts();
+ case TARGET_MILESTONE:
+ return getTargetMilestones(product);
+ case BUG_STATUS:
+ return getStatusValues();
+ case VERSION:
+ return getVersions(product);
+ case COMPONENT:
+ return getComponents(product);
+ case REP_PLATFORM:
+ return getPlatforms();
+ case OP_SYS:
+ return getOSs();
+ case PRIORITY:
+ return getPriorities();
+ case BUG_SEVERITY:
+ return getSeverities();
+ case KEYWORDS:
+ return getKeywords();
+ case RESOLUTION:
+ return getResolutions();
+ default:
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Adds a field to the configuration.
+ */
+ public void addCustomField(BugzillaCustomField newField) {
+ customFields.add(newField);
+ }
+
+ public List<BugzillaCustomField> getCustomFields() {
+ return customFields;
+ }
+
+ public void configureTaskData(TaskData taskData) {
+ if (taskData != null) {
+ addMissingFlags(taskData);
+ updateAttributeOptions(taskData);
+ addValidOperations(taskData);
+ }
+ }
+
+ private void addMissingFlags(TaskData taskData) {
+ List<String> existingFlags = new ArrayList<String>();
+ List<BugzillaFlag> flags = getFlags();
+ for (TaskAttribute attribute : new HashSet<TaskAttribute>(taskData.getRoot().getAttributes().values())) {
+ if (attribute.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$
+ TaskAttribute state = attribute.getAttribute("state"); //$NON-NLS-1$
+ if (state != null) {
+ String nameValue = state.getMetaData().getLabel();
+ if (!existingFlags.contains(nameValue)) {
+ existingFlags.add(nameValue);
+ }
+ String desc = attribute.getMetaData().getLabel();
+ if (desc == null || desc.equals("")) { //$NON-NLS-1$
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (bugzillaFlag.getType().equals("attachment")) { //$NON-NLS-1$
+ continue;
+ }
+ if (bugzillaFlag.getName().equals(nameValue)) {
+ attribute.getMetaData().setLabel(bugzillaFlag.getDescription());
+ }
+ }
+ }
+ }
+ }
+ }
+ TaskAttribute productAttribute = taskData.getRoot().getMappedAttribute(BugzillaAttribute.PRODUCT.getKey());
+ TaskAttribute componentAttribute = taskData.getRoot().getMappedAttribute(BugzillaAttribute.COMPONENT.getKey());
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (bugzillaFlag.getType().equals("attachment")) { //$NON-NLS-1$
+ continue;
+ }
+ if (!bugzillaFlag.isUsedIn(productAttribute.getValue(), componentAttribute.getValue())) {
+ continue;
+ }
+ if (existingFlags.contains(bugzillaFlag.getName()) && !bugzillaFlag.isMultiplicable()) {
+ continue;
+ }
+ BugzillaFlagMapper mapper = new BugzillaFlagMapper();
+ mapper.setRequestee(""); //$NON-NLS-1$
+ mapper.setSetter(""); //$NON-NLS-1$
+ mapper.setState(" "); //$NON-NLS-1$
+ mapper.setFlagId(bugzillaFlag.getName());
+ mapper.setNumber(0);
+ mapper.setDescription(bugzillaFlag.getDescription());
+ TaskAttribute attribute = taskData.getRoot().createAttribute(
+ "task.common.kind.flag_type" + bugzillaFlag.getFlagId()); //$NON-NLS-1$
+ mapper.applyTo(attribute);
+ }
+ setFlagsRequestee(taskData);
+ }
+
+ private void setFlagsRequestee(TaskData taskData) {
+ for (TaskAttribute attribute : new HashSet<TaskAttribute>(taskData.getRoot().getAttributes().values())) {
+ if (attribute.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$
+ TaskAttribute state = attribute.getAttribute("state"); //$NON-NLS-1$
+ if (state != null) {
+ String nameValue = state.getMetaData().getLabel();
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (nameValue.equals(bugzillaFlag.getName())) {
+ TaskAttribute requestee = attribute.getAttribute("requestee"); //$NON-NLS-1$
+ if (requestee == null) {
+ requestee = attribute.createMappedAttribute("requestee"); //$NON-NLS-1$
+ requestee.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ requestee.setValue(""); //$NON-NLS-1$
+ }
+ requestee.getMetaData().setReadOnly(!bugzillaFlag.isSpecifically_requestable());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void updateAttributeOptions(TaskData existingReport) {
+ TaskAttribute attributeProduct = existingReport.getRoot()
+ .getMappedAttribute(BugzillaAttribute.PRODUCT.getKey());
+ if (attributeProduct == null) {
+ return;
+ }
+ String product = attributeProduct.getValue();
+ for (TaskAttribute attribute : new HashSet<TaskAttribute>(existingReport.getRoot().getAttributes().values())) {
+
+ List<String> optionValues = getAttributeOptions(product, attribute);
+
+ if (attribute.getId().equals(BugzillaAttribute.TARGET_MILESTONE.getKey()) && optionValues.isEmpty()) {
+ existingReport.getRoot().removeAttribute(BugzillaAttribute.TARGET_MILESTONE.getKey());
+ continue;
+ }
+
+ if (attribute.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$
+ attribute = attribute.getAttribute("state"); //$NON-NLS-1$
+ }
+
+ attribute.clearOptions();
+ for (String option : optionValues) {
+ attribute.putOption(option, option);
+ }
+ }
+
+ }
+
+ public List<String> getAttributeOptions(String product, TaskAttribute attribute) {
+ List<String> options = new ArrayList<String>();
+
+ if (attribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ for (BugzillaCustomField bugzillaCustomField : customFields) {
+ if (bugzillaCustomField.getName().equals(attribute.getId())) {
+ options = bugzillaCustomField.getOptions();
+ break;
+ }
+ }
+
+ } else if (attribute.getId().startsWith("task.common.kind.flag")) { //$NON-NLS-1$
+
+ TaskAttribute state = attribute.getAttribute("state"); //$NON-NLS-1$
+ if (state != null) {
+ String nameValue = state.getMetaData().getLabel();
+ options.add(""); //$NON-NLS-1$
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (nameValue.equals(bugzillaFlag.getName())) {
+ if (nameValue.equals(bugzillaFlag.getName())) {
+ if (bugzillaFlag.isRequestable()) {
+ options.add("?"); //$NON-NLS-1$
+ }
+ break;
+ }
+ }
+ }
+ options.add("+"); //$NON-NLS-1$
+ options.add("-"); //$NON-NLS-1$
+ }
+ }
+
+ else {
+ String type = attribute.getMetaData().getType();
+
+ if (type != null && type.equals(IBugzillaConstants.EDITOR_TYPE_FLAG)) {
+ options.add(""); //$NON-NLS-1$
+ options.add("?"); //$NON-NLS-1$
+ options.add("+"); //$NON-NLS-1$
+ options.add("-"); //$NON-NLS-1$
+ } else {
+
+ BugzillaAttribute element;
+ try {
+ element = BugzillaAttribute.valueOf(attribute.getId().trim().toUpperCase(Locale.ENGLISH));
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ return options;
+ }
+ throw e;
+ }
+
+ options = getOptionValues(element, product);
+
+ if (element != BugzillaAttribute.RESOLUTION && element != BugzillaAttribute.OP_SYS
+ && element != BugzillaAttribute.BUG_SEVERITY && element != BugzillaAttribute.PRIORITY
+ && element != BugzillaAttribute.BUG_STATUS) {
+ Collections.sort(options);
+ }
+ }
+ }
+ return options;
+ }
+
+ public void addValidOperations(TaskData bugReport) {
+ TaskAttribute attributeStatus = bugReport.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ BUGZILLA_REPORT_STATUS status = BUGZILLA_REPORT_STATUS.NEW;
+ if (attributeStatus != null) {
+ try {
+ status = BUGZILLA_REPORT_STATUS.valueOf(attributeStatus.getValue());
+ } catch (RuntimeException e) {
+// StatusHandler.log(new Status(IStatus.INFO, BugzillaCorePlugin.PLUGIN_ID, "Unrecognized status: "
+// + attributeStatus.getValue(), e));
+ status = BUGZILLA_REPORT_STATUS.NEW;
+ }
+ }
+ BugzillaVersion bugzillaVersion = getInstallVersion();
+ if (bugzillaVersion == null) {
+ bugzillaVersion = BugzillaVersion.MIN_VERSION;
+ }
+ switch (status) {
+ case UNCONFIRMED:
+ case REOPENED:
+ case NEW:
+ addOperation(bugReport, BugzillaOperation.none);
+ addOperation(bugReport, BugzillaOperation.accept);
+ addOperation(bugReport, BugzillaOperation.resolve);
+ addOperation(bugReport, BugzillaOperation.duplicate);
+ break;
+ case ASSIGNED:
+ addOperation(bugReport, BugzillaOperation.none);
+ addOperation(bugReport, BugzillaOperation.resolve);
+ addOperation(bugReport, BugzillaOperation.duplicate);
+ break;
+ case RESOLVED:
+ addOperation(bugReport, BugzillaOperation.none);
+ addOperation(bugReport, BugzillaOperation.reopen);
+ addOperation(bugReport, BugzillaOperation.verify);
+ addOperation(bugReport, BugzillaOperation.close);
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_3_0) >= 0) {
+ addOperation(bugReport, BugzillaOperation.duplicate);
+ addOperation(bugReport, BugzillaOperation.resolve);
+ }
+ break;
+ case CLOSED:
+ addOperation(bugReport, BugzillaOperation.none);
+ addOperation(bugReport, BugzillaOperation.reopen);
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_3_0) >= 0) {
+ addOperation(bugReport, BugzillaOperation.duplicate);
+ addOperation(bugReport, BugzillaOperation.resolve);
+ }
+ break;
+ case VERIFIED:
+ addOperation(bugReport, BugzillaOperation.none);
+ addOperation(bugReport, BugzillaOperation.reopen);
+ addOperation(bugReport, BugzillaOperation.close);
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_3_0) >= 0) {
+ addOperation(bugReport, BugzillaOperation.duplicate);
+ addOperation(bugReport, BugzillaOperation.resolve);
+ }
+ }
+
+ if (bugzillaVersion.compareTo(BugzillaVersion.BUGZILLA_3_0) < 0) {
+ // Product change is only supported for Versions >= 3.0 without verify html page
+ TaskAttribute productAttribute = bugReport.getRoot().getMappedAttribute(BugzillaAttribute.PRODUCT.getKey());
+ productAttribute.getMetaData().setReadOnly(true);
+ }
+
+ if (status == BUGZILLA_REPORT_STATUS.NEW || status == BUGZILLA_REPORT_STATUS.ASSIGNED
+ || status == BUGZILLA_REPORT_STATUS.REOPENED || status == BUGZILLA_REPORT_STATUS.UNCONFIRMED) {
+ if (bugzillaVersion.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_3_0) <= 0) {
+ // old bugzilla workflow is used
+ addOperation(bugReport, BugzillaOperation.reassign);
+ addOperation(bugReport, BugzillaOperation.reassignbycomponent);
+ } else {
+ BugzillaAttribute key = BugzillaAttribute.SET_DEFAULT_ASSIGNEE;
+ TaskAttribute operationAttribute = bugReport.getRoot().getAttribute(key.getKey());
+ if (operationAttribute == null) {
+ operationAttribute = bugReport.getRoot().createAttribute(key.getKey());
+ operationAttribute.getMetaData()
+ .defaults()
+ .setReadOnly(key.isReadOnly())
+ .setKind(key.getKind())
+ .setLabel(key.toString())
+ .setType(key.getType());
+ operationAttribute.setValue("0"); //$NON-NLS-1$
+ }
+ operationAttribute = bugReport.getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED);
+ if (operationAttribute != null) {
+ operationAttribute.getMetaData().setReadOnly(false);
+ }
+ }
+ }
+ }
+
+ public void addOperation(TaskData bugReport, BugzillaOperation opcode) {
+ TaskAttribute attribute;
+ TaskAttribute operationAttribute = bugReport.getRoot().getAttribute(TaskAttribute.OPERATION);
+ if (operationAttribute == null) {
+ operationAttribute = bugReport.getRoot().createAttribute(TaskAttribute.OPERATION);
+ }
+
+ switch (opcode) {
+ case none:
+ attribute = bugReport.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + opcode.toString());
+ String label = "Leave"; //$NON-NLS-1$
+ TaskAttribute attributeStatus = bugReport.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ TaskAttribute attributeResolution = bugReport.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ if (attributeStatus != null && attributeResolution != null) {
+ label = String.format(opcode.getLabel(), attributeStatus.getValue(), attributeResolution.getValue());
+ }
+
+ TaskOperation.applyTo(attribute, opcode.toString(), label);
+ // set as default
+ TaskOperation.applyTo(operationAttribute, opcode.toString(), label);
+ break;
+ case resolve:
+ attribute = bugReport.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + opcode.toString());
+ TaskOperation.applyTo(attribute, opcode.toString(), opcode.getLabel());
+ TaskAttribute attrResolvedInput = attribute.getTaskData().getRoot().createAttribute(opcode.getInputId());
+ attrResolvedInput.getMetaData().setType(opcode.getInputType());
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, opcode.getInputId());
+ for (String resolution : getResolutions()) {
+ // DUPLICATE and MOVED have special meanings so do not show as resolution
+ if (resolution.compareTo("DUPLICATE") != 0 && resolution.compareTo("MOVED") != 0) { //$NON-NLS-1$ //$NON-NLS-2$
+ attrResolvedInput.putOption(resolution, resolution);
+ }
+ }
+ if (getResolutions().size() > 0) {
+ attrResolvedInput.setValue(getResolutions().get(0));
+ }
+ break;
+ default:
+ attribute = bugReport.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + opcode.toString());
+ TaskOperation.applyTo(attribute, opcode.toString(), opcode.getLabel());
+ if (opcode.getInputId() != null) {
+ TaskAttribute attrInput = bugReport.getRoot().createAttribute(opcode.getInputId());
+ attrInput.getMetaData().defaults().setReadOnly(false).setType(opcode.getInputType());
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, opcode.getInputId());
+ }
+ break;
+ }
+ }
+
+ /**
+ * Adds a flag to the configuration.
+ */
+ public void addFlag(BugzillaFlag newFlag) {
+ flags.add(newFlag);
+ }
+
+ public List<BugzillaFlag> getFlags() {
+ return flags;
+ }
+
+ public BugzillaFlag getFlagWithId(Integer id) {
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (bugzillaFlag.getFlagId() == id) {
+ return bugzillaFlag;
+ }
+ }
+ return null;
+ }
+
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ public String getEncoding() {
+ return encoding;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfigurationFactory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfigurationFactory.java
new file mode 100644
index 0000000..ae8b26d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryConfigurationFactory.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * Reads bugzilla product configuration from config.cgi on server in RDF format.
+ *
+ * @author Rob Elves
+ */
+public class RepositoryConfigurationFactory extends AbstractReportFactory {
+
+ public RepositoryConfigurationFactory(InputStream inStream, String encoding) {
+ super(inStream, encoding);
+ }
+
+ public RepositoryConfiguration getConfiguration() throws IOException, CoreException {
+ SaxConfigurationContentHandler contentHandler = new SaxConfigurationContentHandler();
+ collectResults(contentHandler, true);
+ RepositoryConfiguration config = contentHandler.getConfiguration();
+ return config;
+ }
+
+ class SaxErrorHandler implements ErrorHandler {
+
+ public void error(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ public void fatalError(SAXParseException exception) throws SAXException {
+ throw exception;
+
+ }
+
+ public void warning(SAXParseException exception) throws SAXException {
+ // ignore
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java
new file mode 100644
index 0000000..2d90159
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/RepositoryQueryResultsFactory.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.GeneralSecurityException;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+
+/**
+ * @author Rob Elves
+ */
+public class RepositoryQueryResultsFactory extends AbstractReportFactory {
+
+ public RepositoryQueryResultsFactory(InputStream inStream, String encoding) {
+ super(inStream, encoding);
+ }
+
+ /**
+ * expects rdf returned from repository (ctype=rdf in url)
+ *
+ * @throws GeneralSecurityException
+ */
+ public int performQuery(String repositoryUrl, TaskDataCollector collector, TaskAttributeMapper mapper, int maxHits)
+ throws IOException {
+ SaxBugzillaQueryContentHandler contentHandler = new SaxBugzillaQueryContentHandler(repositoryUrl, collector,
+ mapper);
+ collectResults(contentHandler, false);
+ return contentHandler.getResultCount();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java
new file mode 100644
index 0000000..ccb40a2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxBugzillaQueryContentHandler.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.util.Locale;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Parser for RDF bugzilla query results.
+ *
+ * @author Rob Elves
+ */
+public class SaxBugzillaQueryContentHandler extends DefaultHandler {
+
+ private StringBuffer characters;
+
+ private final TaskDataCollector collector;
+
+ private final String repositoryUrl;
+
+ private int resultCount;
+
+ private final TaskAttributeMapper mapper;
+
+ private TaskData taskData;
+
+ public SaxBugzillaQueryContentHandler(String repositoryUrl, TaskDataCollector collector, TaskAttributeMapper mapper) {
+ this.repositoryUrl = repositoryUrl;
+ this.collector = collector;
+ this.mapper = mapper;
+ }
+
+ @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 StringBuffer();
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ String parsedText = characters.toString();
+ BugzillaAttribute tag = BugzillaAttribute.UNKNOWN;
+ try {
+ tag = BugzillaAttribute.valueOf(localName.trim().toUpperCase(Locale.ENGLISH));
+ switch (tag) {
+ case ID:
+ taskData = new TaskData(mapper, getConnectorKind(), repositoryUrl, parsedText);
+ taskData.setPartial(true);
+ break;
+ case SHORT_SHORT_DESC:
+ if (taskData != null) {
+ BugzillaTaskDataHandler.createAttribute(taskData, BugzillaAttribute.SHORT_DESC)
+ .setValue(parsedText);
+ }
+ break;
+ case LI:
+ if (taskData != null) {
+ collector.accept(taskData);
+ }
+ resultCount++;
+ break;
+ default:
+ if (taskData != null) {
+ BugzillaTaskDataHandler.createAttribute(taskData, tag).setValue(parsedText);
+ }
+ break;
+ }
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ return;
+ }
+ throw e;
+ }
+
+ }
+
+ protected String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ public int getResultCount() {
+ return resultCount;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxConfigurationContentHandler.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxConfigurationContentHandler.java
new file mode 100644
index 0000000..baccb77
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxConfigurationContentHandler.java
@@ -0,0 +1,593 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Quick config rdf parser.
+ *
+ * <pre>
+ * config.cgi?ctype=rdf
+ * </pre>
+ *
+ * Populates a <link>ProductConfiguration</link> data structure.
+ *
+ * @author Rob Elves
+ */
+public class SaxConfigurationContentHandler extends DefaultHandler {
+
+ private static final String ELEMENT_RESOLUTION = "resolution"; //$NON-NLS-1$
+
+ private static final String ELEMENT_STATUS_OPEN = "status_open"; //$NON-NLS-1$
+
+ private static final String ELEMENT_TARGET_MILESTONE = "target_milestone"; //$NON-NLS-1$
+
+ private static final String ELEMENT_TARGET_MILESTONES = "target_milestones"; //$NON-NLS-1$
+
+ private static final String ELEMENT_INSTALL_VERSION = "install_version"; //$NON-NLS-1$
+
+ private static final String ELEMENT_DB_ENCODING = "db_encoding"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_RDF_ABOUT = "rdf:about"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_RESOURCE = "resource"; //$NON-NLS-1$
+
+ private static final String ELEMENT_VERSION = "version"; //$NON-NLS-1$
+
+ private static final String ELEMENT_VERSIONS = "versions"; //$NON-NLS-1$
+
+ private static final String ELEMENT_COMPONENT = "component"; //$NON-NLS-1$
+
+ private static final String ELEMENT_COMPONENTS = "components"; //$NON-NLS-1$
+
+ private static final String ELEMENT_NAME = "name"; //$NON-NLS-1$
+
+ private static final String ELEMENT_PRODUCTS = "products"; //$NON-NLS-1$
+
+ private static final String ELEMENT_DESCRIPTION = "description"; //$NON-NLS-1$
+
+ private static final String ELEMENT_FIELDS = "fields"; //$NON-NLS-1$
+
+ private static final String ELEMENT_FIELD = "field"; //$NON-NLS-1$
+
+ private static final String ELEMENT_FLAG_TYPES = "flag_types"; //$NON-NLS-1$
+
+ private static final String ELEMENT_FLAG_TYPE = "flag_type"; //$NON-NLS-1$
+
+ private static final String ELEMENT_SEVERITY = "severity"; //$NON-NLS-1$
+
+ private static final String ELEMENT_PRIORITY = "priority"; //$NON-NLS-1$
+
+ private static final String ELEMENT_KEYWORD = "keyword"; //$NON-NLS-1$
+
+ private static final String ELEMENT_OP_SYS = "op_sys"; //$NON-NLS-1$
+
+ private static final String ELEMENT_PLATFORM = "platform"; //$NON-NLS-1$
+
+ private static final String ELEMENT_LI = "li"; //$NON-NLS-1$
+
+ private static final String ELEMENT_STATUS = "status"; //$NON-NLS-1$
+
+ private static final String ELEMENT_TYPE = "type"; //$NON-NLS-1$
+
+ private static final String ELEMENT_TYPE_DESC = "type_desc"; //$NON-NLS-1$
+
+ private static final String ELEMENT_ENTER_BUG = "enter_bug"; //$NON-NLS-1$
+
+ private static final String ELEMENT_REQUESTABLE = "requestable"; //$NON-NLS-1$
+
+ private static final String ELEMENT_SPECIFICALLY_REQUESTABLE = "specifically_requestable"; //$NON-NLS-1$
+
+ private static final String ELEMENT_ID = "id"; //$NON-NLS-1$
+
+ private static final String ELEMENT_MULTIPLICABLE = "multiplicable"; //$NON-NLS-1$
+
+ private static final int EXPECTING_ROOT = 0;
+
+ private static final int IN_INSTALL_VERSION = 1 << 1;
+
+ private static final int IN_STATUS = 1 << 2;
+
+ private static final int IN_PLATFORM = 1 << 3;
+
+ private static final int IN_OP_SYS = 1 << 4;
+
+ private static final int IN_PRIORITY = 1 << 5;
+
+ private static final int IN_SEVERITY = 1 << 6;
+
+ private static final int IN_PRODUCTS = 1 << 7;
+
+ private static final int IN_COMPONENTS = 1 << 8;
+
+ private static final int IN_VERSIONS = 1 << 9;
+
+ private static final int IN_LI = 1 << 10;
+
+ private static final int IN_LI_LI = 1 << 11;
+
+ private static final int IN_NAME = 1 << 12;
+
+ private static final int IN_COMPONENT = 1 << 13;
+
+ private static final int IN_VERSION = 1 << 14;
+
+ private static final int IN_TARGET_MILESTONES = 1 << 15;
+
+ private static final int IN_TARGET_MILESTONE = 1 << 16;
+
+ private static final int IN_STATUS_OPEN = 1 << 17;
+
+ private static final int IN_RESOLUTION = 1 << 18;
+
+ private static final int IN_KEYWORD = 1 << 19;
+
+ private static final int IN_STATUS_CLOSED = 1 << 20;
+
+ private static final int IN_FIELDS = 1 << 21;
+
+ private static final int IN_FIELD = 1 << 22;
+
+ private static final int IN_CUSTOM_OPTION = 1 << 23;
+
+ private static final int IN_FLAG_TYPES = 1 << 24;
+
+ private static final int IN_FLAG_TYPE = 1 << 25;
+
+ private static final int IN_DB_ENCODING = 1 << 26;
+
+ private int state = EXPECTING_ROOT;
+
+ private String currentProduct = ""; //$NON-NLS-1$
+
+ private String currentName = ""; //$NON-NLS-1$
+
+ private String currentDescription = ""; //$NON-NLS-1$
+
+ private String currentType;
+
+ private String currentRequestable;
+
+ private String currentSpecifically_requestable;
+
+ private String currentMultiplicable;
+
+ private int currentId;
+
+ private String currentTypeDesc = ""; //$NON-NLS-1$
+
+ private String currentEnterBug = ""; //$NON-NLS-1$
+
+ private StringBuffer characters = new StringBuffer();
+
+ private String about;
+
+ private final RepositoryConfiguration configuration = new RepositoryConfiguration();
+
+ private final Map<String, List<String>> components = new HashMap<String, List<String>>();
+
+ private final Map<String, List<String>> versions = new HashMap<String, List<String>>();
+
+ private final Map<String, List<String>> milestones = new HashMap<String, List<String>>();
+
+ private final Map<String, String> componentNames = new HashMap<String, String>();
+
+ private final Map<String, String> versionNames = new HashMap<String, String>();
+
+ private final Map<String, String> milestoneNames = new HashMap<String, String>();
+
+ private final Map<String, List<String>> customOption = new HashMap<String, List<String>>();
+
+ private final Map<String, Map<String, List<String>>> flagsInComponent = new HashMap<String, Map<String, List<String>>>();
+
+ private final Map<String, Integer> flagIds = new HashMap<String, Integer>();
+
+ private String currentComponent = ""; //$NON-NLS-1$
+
+ private String currentCustomOptionName = ""; //$NON-NLS-1$
+
+ public RepositoryConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ @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 StringBuffer();
+ if (localName.equals(ELEMENT_STATUS)) {
+ state = state | IN_STATUS;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI) == IN_LI)) {
+ state = state | IN_LI_LI;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI) != IN_LI)) {
+ state = state | IN_LI;
+ } else if (localName.equals(ELEMENT_PLATFORM)) {
+ state = state | IN_PLATFORM;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state | IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_PRIORITY)) {
+ state = state | IN_PRIORITY;
+ } else if (localName.equals(ELEMENT_SEVERITY)) {
+ state = state | IN_SEVERITY;
+ } else if (localName.equals(ELEMENT_PRODUCTS)) {
+ state = state | IN_PRODUCTS;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state | IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_NAME)) {
+ state = state | IN_NAME;
+ } else if (localName.equals(ELEMENT_COMPONENTS)) {
+ state = state | IN_COMPONENTS;
+ } else if (localName.equals(ELEMENT_COMPONENT)) {
+ state = state | IN_COMPONENT;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_VERSIONS)) {
+ state = state | IN_VERSIONS;
+ } else if (localName.equals(ELEMENT_VERSION)) {
+ state = state | IN_VERSION;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_INSTALL_VERSION)) {
+ state = state | IN_INSTALL_VERSION;
+ } else if (localName.equals(ELEMENT_DB_ENCODING)) {
+ state = state | IN_DB_ENCODING;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONES)) {
+ state = state | IN_TARGET_MILESTONES;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONE)) {
+ state = state | IN_TARGET_MILESTONE;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_STATUS_OPEN)) {
+ state = state | IN_STATUS_OPEN;
+ } else if (localName.equals(ELEMENT_RESOLUTION)) {
+ state = state | IN_RESOLUTION;
+ } else if (localName.equals(ELEMENT_KEYWORD)) {
+ state = state | IN_KEYWORD;
+ } else if (localName.equals(ELEMENT_FIELDS)) {
+ state = state | IN_FIELDS;
+ } else if (localName.equals(ELEMENT_FIELD)) {
+ state = state | IN_FIELD;
+ parseResource(attributes);
+ currentName = ""; //$NON-NLS-1$
+ currentDescription = ""; //$NON-NLS-1$
+ currentType = ""; //$NON-NLS-1$
+ currentTypeDesc = ""; //$NON-NLS-1$
+ currentEnterBug = ""; //$NON-NLS-1$
+ currentId = -1;
+ } else if (localName.equals(ELEMENT_FLAG_TYPES)) {
+ state = state | IN_FLAG_TYPES;
+ } else if (localName.equals(ELEMENT_FLAG_TYPE)) {
+ state = state | IN_FLAG_TYPE;
+ parseResource(attributes);
+ } else if (localName.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ state = state | IN_CUSTOM_OPTION;
+ currentCustomOptionName = localName;
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ // KEEP: && ((state & IN_LI) == IN_LI)
+
+ if (localName.equals(ELEMENT_STATUS)) {
+ state = state & ~IN_STATUS;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI_LI) == IN_LI_LI)) {
+ state = state & ~IN_LI_LI;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI_LI) != IN_LI_LI)) {
+ state = state & ~IN_LI;
+ if (characters.length() == 0) {
+ return;
+ }
+ if (state == (IN_STATUS)) {
+ configuration.addStatus(characters.toString());
+ } else if (state == (IN_STATUS_OPEN)) {
+ configuration.addOpenStatusValue(characters.toString());
+ } else if (state == (IN_STATUS_CLOSED)) {
+ // TODO: Add closed status values to configuration
+ } else if (state == (IN_RESOLUTION)) {
+ configuration.addResolution(characters.toString());
+ } else if (state == (IN_KEYWORD)) {
+ configuration.addKeyword(characters.toString());
+ } else if (state == (IN_PLATFORM)) {
+ configuration.addPlatform(characters.toString());
+ } else if (state == (IN_OP_SYS)) {
+ configuration.addOS(characters.toString());
+ } else if (state == (IN_PRIORITY)) {
+ configuration.addPriority(characters.toString());
+ } else if (state == (IN_SEVERITY)) {
+ configuration.addSeverity(characters.toString());
+ } else if (state == (IN_CUSTOM_OPTION)) {
+ // Option for CutstomFields
+ if (currentCustomOptionName != null) {
+ if (characters.length() > 0) {
+ List<String> customOptionList = customOption.get(currentCustomOptionName);
+ if (customOptionList == null) {
+ customOptionList = new ArrayList<String>();
+ customOption.put(currentCustomOptionName, customOptionList);
+ }
+ customOptionList.add(characters.toString());
+ }
+ }
+ }
+ } else if (localName.equals(ELEMENT_PLATFORM)) {
+ state = state & ~IN_PLATFORM;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state & ~IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_PRIORITY)) {
+ state = state & ~IN_PRIORITY;
+ } else if (localName.equals(ELEMENT_SEVERITY)) {
+ state = state & ~IN_SEVERITY;
+ } else if (localName.equals(ELEMENT_PRODUCTS)) {
+ state = state & ~IN_PRODUCTS;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state & ~IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_NAME)) {
+ state = state & ~IN_NAME;
+ if (state == (IN_PRODUCTS | IN_LI)) {
+ // PRODUCT NAME
+ currentProduct = characters.toString();
+ configuration.addProduct(currentProduct);
+ } else if (state == (IN_VERSIONS | IN_LI | IN_VERSION)) {
+ // VERSION NAME
+ if (about != null && !versionNames.containsValue(about)) {
+ if (characters.length() > 0) {
+ versionNames.put(about, characters.toString());
+ }
+ }
+ } else if (state == (IN_COMPONENTS | IN_LI | IN_COMPONENT)) {
+ // COMPONENT NAME
+ currentComponent = characters.toString();
+ if (about != null && !componentNames.containsValue(about)) {
+ if (currentComponent.length() > 0) {
+ componentNames.put(about, currentComponent);
+ }
+ }
+ } else if (state == (IN_TARGET_MILESTONES | IN_LI | IN_TARGET_MILESTONE)) {
+ // MILESTONE NAME
+ if (about != null && !milestoneNames.containsValue(about)) {
+ if (characters.length() > 0) {
+ milestoneNames.put(about, characters.toString());
+ }
+ }
+ } else if (state == (IN_FIELDS | IN_LI | IN_FIELD) || state == (IN_FLAG_TYPES | IN_LI | IN_FLAG_TYPE)) {
+ // FIELDS NAME
+ currentName = characters.toString();
+ }
+ } else if (localName.equals(ELEMENT_COMPONENTS)) {
+ state = state & ~IN_COMPONENTS;
+ } else if (localName.equals(ELEMENT_COMPONENT)) {
+ state = state & ~IN_COMPONENT;
+ } else if (localName.equals(ELEMENT_VERSION)) {
+ state = state & ~IN_VERSION;
+ } else if (localName.equals(ELEMENT_VERSIONS)) {
+ state = state & ~IN_VERSIONS;
+ } else if (localName.equals(ELEMENT_INSTALL_VERSION)) {
+ state = state & ~IN_INSTALL_VERSION;
+ configuration.setInstallVersion(characters.toString());
+ } else if (localName.equals(ELEMENT_DB_ENCODING)) {
+ state = state & ~IN_DB_ENCODING;
+ configuration.setEncoding(characters.toString());
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONE)) {
+ state = state & ~IN_TARGET_MILESTONE;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONES)) {
+ state = state & ~IN_TARGET_MILESTONES;
+ } else if (localName.equals(ELEMENT_STATUS_OPEN)) {
+ state = state & ~IN_STATUS_OPEN;
+ } else if (localName.equals(ELEMENT_RESOLUTION)) {
+ state = state & ~IN_RESOLUTION;
+ } else if (localName.equals(ELEMENT_KEYWORD)) {
+ state = state & ~IN_KEYWORD;
+ } else if (localName.equals(ELEMENT_FIELDS)) {
+ state = state & ~IN_FIELDS;
+ } else if (localName.equals(ELEMENT_FIELD)) {
+ if (currentName.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ BugzillaCustomField newField = new BugzillaCustomField(currentDescription, currentName, currentType,
+ currentTypeDesc, currentEnterBug);
+ List<String> customOptionList = customOption.get(currentName);
+ if (customOptionList != null && !customOptionList.isEmpty()) {
+ newField.setOptions(customOptionList);
+ }
+ configuration.addCustomField(newField);
+ }
+ state = state & ~IN_FIELD;
+ } else if (localName.equals(ELEMENT_DESCRIPTION)) {
+ currentDescription = characters.toString();
+ } else if (localName.equals(ELEMENT_TYPE)) {
+ currentType = characters.toString();
+ } else if (localName.equals(ELEMENT_ID)) {
+ currentId = Integer.parseInt(characters.toString());
+ } else if (localName.equals(ELEMENT_TYPE_DESC)) {
+ currentTypeDesc = characters.toString();
+ } else if (localName.equals(ELEMENT_ENTER_BUG)) {
+ currentEnterBug = characters.toString();
+ } else if (localName.equals(ELEMENT_REQUESTABLE)) {
+ currentRequestable = characters.toString();
+ } else if (localName.equals(ELEMENT_SPECIFICALLY_REQUESTABLE)) {
+ currentSpecifically_requestable = characters.toString();
+ } else if (localName.equals(ELEMENT_MULTIPLICABLE)) {
+ currentMultiplicable = characters.toString();
+ } else if (localName.equals(ELEMENT_FLAG_TYPES)) {
+ state = state & ~IN_FLAG_TYPES;
+ } else if (localName.equals(ELEMENT_FLAG_TYPE)) {
+ if (currentId != -1) {
+ if (about != null && !flagIds.containsValue(about)) {
+ flagIds.put(about, currentId);
+ }
+ BugzillaFlag newFlag = new BugzillaFlag(currentName, currentDescription, currentType,
+ currentRequestable, currentSpecifically_requestable, currentMultiplicable, currentId);
+ configuration.addFlag(newFlag);
+ }
+ state = state & ~IN_FLAG_TYPE;
+ } else if (localName.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ state = state & ~IN_CUSTOM_OPTION;
+ currentCustomOptionName = ""; //$NON-NLS-1$
+ }
+ }
+
+ private void parseResource(Attributes attributes) {
+
+ switch (state) {
+ case IN_PRODUCTS | IN_LI | IN_COMPONENTS | IN_LI_LI:
+ if (attributes != null) {
+ String compURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (compURI != null && currentProduct.length() > 0) {
+ List<String> compURIs = components.get(currentProduct);
+ if (compURIs == null) {
+ compURIs = new ArrayList<String>();
+ components.put(currentProduct, compURIs);
+ }
+ compURIs.add(compURI);
+ }
+ }
+ break;
+ case IN_PRODUCTS | IN_LI | IN_VERSIONS | IN_LI_LI:
+ if (attributes != null) {
+ String resourceURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (resourceURI != null && currentProduct.length() > 0) {
+ List<String> versionUris = versions.get(currentProduct);
+ if (versionUris == null) {
+ versionUris = new ArrayList<String>();
+ versions.put(currentProduct, versionUris);
+ }
+ versionUris.add(resourceURI);
+ }
+ }
+ break;
+ case IN_PRODUCTS | IN_LI | IN_TARGET_MILESTONES | IN_LI_LI:
+ if (attributes != null) {
+ String resourceURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (resourceURI != null) {
+ List<String> milestoneUris = milestones.get(currentProduct);
+ if (milestoneUris == null) {
+ milestoneUris = new ArrayList<String>();
+ milestones.put(currentProduct, milestoneUris);
+ }
+ milestoneUris.add(resourceURI);
+ }
+ }
+ break;
+ case IN_COMPONENTS | IN_LI | IN_COMPONENT | IN_FLAG_TYPES | IN_LI_LI:
+ if (attributes != null) {
+ String compURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (compURI != null && currentComponent.length() > 0 && currentProduct.length() > 0
+ && compURI.length() > 0) {
+
+ Map<String, List<String>> flagComponentList = flagsInComponent.get(currentProduct);
+ if (flagComponentList == null) {
+ flagComponentList = new HashMap<String, List<String>>();
+ flagsInComponent.put(currentProduct, flagComponentList);
+ }
+ List<String> flagsForComponent = flagComponentList.get(currentComponent);
+ if (flagsForComponent == null) {
+ flagsForComponent = new ArrayList<String>();
+ flagComponentList.put(currentComponent, flagsForComponent);
+ }
+ flagsForComponent.add(compURI.replace("flags.cgi?id=", "flag.cgi?id=")); //$NON-NLS-1$ //$NON-NLS-2$
+ int i = 0;
+ i++;
+ }
+ }
+ break;
+ case IN_COMPONENTS | IN_LI | IN_COMPONENT:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ int idx = about.indexOf("&product="); //$NON-NLS-1$
+ if (idx != -1) {
+ currentProduct = about.substring(idx + 9);
+ }
+ }
+ break;
+ case IN_VERSIONS | IN_LI | IN_VERSION:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+
+ case IN_TARGET_MILESTONES | IN_LI | IN_TARGET_MILESTONE:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+ case IN_FIELDS | IN_LI | IN_FIELD:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+ case IN_FLAG_TYPES | IN_LI | IN_FLAG_TYPE:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+
+ }
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+
+ for (String product : components.keySet()) {
+ List<String> componentURIs = components.get(product);
+ for (String uri : componentURIs) {
+ String realName = componentNames.get(uri);
+ if (realName != null) {
+ configuration.addComponent(product, realName);
+ }
+ }
+ }
+
+ for (String product : versions.keySet()) {
+ List<String> versionURIs = versions.get(product);
+ for (String uri : versionURIs) {
+ String realName = versionNames.get(uri);
+ if (realName != null) {
+ configuration.addVersion(product, realName);
+ }
+ }
+
+ }
+
+ for (String product : milestones.keySet()) {
+ List<String> milestoneURIs = milestones.get(product);
+ for (String uri : milestoneURIs) {
+ String realName = milestoneNames.get(uri);
+ if (realName != null) {
+ configuration.addTargetMilestone(product, realName);
+ }
+ }
+
+ }
+
+ for (String flagProduct : flagsInComponent.keySet()) {
+ Map<String, List<String>> flagComponentUsage = flagsInComponent.get(flagProduct);
+ for (String flagusageList : flagComponentUsage.keySet()) {
+ List<String> flagList = flagComponentUsage.get(flagusageList);
+ for (String flagAbout : flagList) {
+ Integer flagId = flagIds.get(flagAbout);
+ BugzillaFlag flag = configuration.getFlagWithId(flagId);
+ flag.addUsed(flagProduct, flagusageList);
+ }
+ }
+ }
+
+ super.endDocument();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java
new file mode 100644
index 0000000..7025d79
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/SaxMultiBugReportContentHandler.java
@@ -0,0 +1,653 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Parser for xml bugzilla reports.
+ *
+ * @author Rob Elves
+ * @author Hiroyuki Inaba (internationalization)
+ */
+public class SaxMultiBugReportContentHandler extends DefaultHandler {
+
+ private static final String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
+
+ private static final String ID_STRING_BEGIN = " (id="; //$NON-NLS-1$
+
+ private static final String ID_STRING_END = ")"; //$NON-NLS-1$
+
+ private StringBuffer characters;
+
+ private TaskComment taskComment;
+
+ private Map<String, TaskCommentMapper> attachIdToComment = new HashMap<String, TaskCommentMapper>();
+
+ private int commentNum = 0;
+
+ private BugzillaAttachmentMapper attachment;
+
+ private final Map<String, TaskData> taskDataMap;
+
+ private TaskData repositoryTaskData;
+
+ private List<TaskComment> longDescs;
+
+ private String errorMessage = null;
+
+ private final List<BugzillaCustomField> customFields;
+
+ private final TaskDataCollector collector;
+
+ private boolean isDeprecated = false;
+
+ private boolean isPatch = false;
+
+ private String token;
+
+ private TaskAttribute attachmentAttribute;
+
+ public SaxMultiBugReportContentHandler(TaskAttributeMapper mapper, TaskDataCollector collector,
+ Map<String, TaskData> taskDataMap, List<BugzillaCustomField> customFields) {
+ this.taskDataMap = taskDataMap;
+ this.customFields = customFields;
+ this.collector = collector;
+ }
+
+ public boolean errorOccurred() {
+ return errorMessage != null;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ characters.append(ch, start, length);
+ //System.err.println(String.copyValueOf(ch, start, length));
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ characters = new StringBuffer();
+ BugzillaAttribute tag = BugzillaAttribute.UNKNOWN;
+ if (localName.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ return;
+ }
+ try {
+ tag = BugzillaAttribute.valueOf(localName.trim().toUpperCase(Locale.ENGLISH));
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ return;
+ }
+ throw e;
+ }
+ switch (tag) {
+ case BUGZILLA:
+ // Note: here we can get the bugzilla version if necessary
+ break;
+ case BUG:
+ if (attributes != null && (attributes.getValue("error") != null)) { //$NON-NLS-1$
+ errorMessage = attributes.getValue("error"); //$NON-NLS-1$
+ }
+ attachIdToComment = new HashMap<String, TaskCommentMapper>();
+ commentNum = 0;
+ taskComment = null;
+ longDescs = new ArrayList<TaskComment>();
+ token = null;
+ break;
+ case LONG_DESC:
+ taskComment = new TaskComment(commentNum++);
+ break;
+ case WHO:
+ if (taskComment != null) {
+ if (attributes != null && attributes.getLength() > 0) {
+ String name = attributes.getValue(ATTRIBUTE_NAME);
+ if (name != null) {
+ taskComment.authorName = name;
+ }
+ }
+ }
+ break;
+ case REPORTER:
+ if (attributes != null && attributes.getLength() > 0) {
+ String name = attributes.getValue(ATTRIBUTE_NAME);
+ if (name != null) {
+ BugzillaTaskDataHandler.createAttribute(repositoryTaskData, BugzillaAttribute.REPORTER_NAME)
+ .setValue(name);
+ }
+ }
+ break;
+ case QA_CONTACT:
+ if (attributes != null && attributes.getLength() > 0) {
+ String name = attributes.getValue(ATTRIBUTE_NAME);
+ if (name != null) {
+ BugzillaTaskDataHandler.createAttribute(repositoryTaskData, BugzillaAttribute.QA_CONTACT_NAME)
+ .setValue(name);
+ }
+ }
+ break;
+ case ASSIGNED_TO:
+ if (attributes != null && attributes.getLength() > 0) {
+ String name = attributes.getValue(ATTRIBUTE_NAME);
+ if (name != null) {
+ BugzillaTaskDataHandler.createAttribute(repositoryTaskData, BugzillaAttribute.ASSIGNED_TO_NAME)
+ .setValue(name);
+ }
+ }
+ break;
+ case ATTACHMENT:
+ if (attributes != null) {
+ isDeprecated = "1".equals(attributes.getValue(BugzillaAttribute.IS_OBSOLETE.getKey())); //$NON-NLS-1$
+ isPatch = "1".equals(attributes.getValue(BugzillaAttribute.IS_PATCH.getKey())); //$NON-NLS-1$
+ }
+ break;
+ case FLAG:
+ if (attributes != null && attributes.getLength() > 0) {
+ String name = attributes.getValue(ATTRIBUTE_NAME);
+ if (name != null) {
+ BugzillaFlagMapper mapper = new BugzillaFlagMapper();
+ String requestee = attributes.getValue("requestee"); //$NON-NLS-1$
+ mapper.setRequestee(requestee);
+ String setter = attributes.getValue("setter"); //$NON-NLS-1$
+ mapper.setSetter(setter);
+ String status = attributes.getValue("status"); //$NON-NLS-1$
+ mapper.setState(status);
+ mapper.setFlagId(name);
+ String id = attributes.getValue("id"); //$NON-NLS-1$
+ if (id != null && !id.equals("")) { //$NON-NLS-1$
+ /*
+ * for version 3.2rc1 and 3.2.rc2 the id was not defined so we ignore
+ * the definition
+ */
+ try {
+ mapper.setNumber(Integer.valueOf(id));
+ TaskAttribute attribute;
+ if (attachmentAttribute != null) {
+ attribute = attachmentAttribute.createAttribute("task.common.kind.flag" + id); //$NON-NLS-1$
+ } else {
+ attribute = repositoryTaskData.getRoot().createAttribute("task.common.kind.flag" + id); //$NON-NLS-1$
+ }
+ mapper.applyTo(attribute);
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ //remove whitespaces from the end of the parsed Text
+ while (characters.length() > 0 && Character.isWhitespace(characters.charAt(characters.length() - 1))) {
+ characters.setLength(characters.length() - 1);
+ }
+
+ String parsedText = characters.toString();
+
+ if (localName.startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ TaskAttribute endAttribute = repositoryTaskData.getRoot().getAttribute(localName);
+ if (endAttribute == null) {
+ String desc = "???"; //$NON-NLS-1$
+ BugzillaCustomField customField = null;
+ for (BugzillaCustomField bugzillaCustomField : customFields) {
+ if (localName.equals(bugzillaCustomField.getName())) {
+ customField = bugzillaCustomField;
+ break;
+ }
+ }
+ if (customField != null) {
+ TaskAttribute atr = repositoryTaskData.getRoot().createAttribute(localName);
+ desc = customField.getDescription();
+ atr.getMetaData().defaults().setLabel(desc).setReadOnly(false);
+ atr.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
+ atr.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ switch (customField.getType()) {
+ case 1: // Free Text
+ atr.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ break;
+ case 2: // Drop Down
+ atr.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ break;
+ case 3: // Multiple-Selection Box
+ atr.getMetaData().setType(TaskAttribute.TYPE_MULTI_SELECT);
+ break;
+ case 4: // Large Text Box
+ atr.getMetaData().setType(TaskAttribute.TYPE_LONG_TEXT);
+ break;
+ case 5: // Date/Time
+ atr.getMetaData().setType(TaskAttribute.TYPE_DATETIME);
+ break;
+
+ default:
+ List<String> options = customField.getOptions();
+ if (options.size() > 0) {
+ atr.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ } else {
+ atr.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ atr.getMetaData().setReadOnly(false);
+ atr.setValue(parsedText);
+ }
+ } else {
+ endAttribute.addValue(parsedText);
+ }
+ }
+
+ BugzillaAttribute tag = BugzillaAttribute.UNKNOWN;
+ try {
+ tag = BugzillaAttribute.valueOf(localName.trim().toUpperCase(Locale.ENGLISH));
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ return;
+ }
+ throw e;
+ }
+ switch (tag) {
+ case BUG_ID: {
+ try {
+ repositoryTaskData = taskDataMap.get(parsedText.trim());
+ if (repositoryTaskData == null) {
+ errorMessage = parsedText + Messages.SaxMultiBugReportContentHandler_id_not_found;
+ }
+ } catch (Exception e) {
+ errorMessage = Messages.SaxMultiBugReportContentHandler_Bug_id_from_server_did_not_match_requested_id;
+ }
+
+ TaskAttribute attr = repositoryTaskData.getRoot().getMappedAttribute(tag.getKey());
+ if (attr == null) {
+ attr = BugzillaTaskDataHandler.createAttribute(repositoryTaskData, tag);
+ }
+ attr.setValue(parsedText);
+
+ break;
+ }
+
+ // Comment attributes
+ case WHO:
+ if (taskComment != null) {
+ taskComment.author = parsedText;
+ }
+ break;
+ case BUG_WHEN:
+ if (taskComment != null) {
+ taskComment.createdTimeStamp = parsedText;
+ }
+ break;
+ case WORK_TIME:
+ if (taskComment != null) {
+ taskComment.timeWorked = parsedText;
+ }
+ break;
+ case THETEXT:
+ if (taskComment != null) {
+ taskComment.commentText = parsedText;
+ }
+ break;
+ case LONG_DESC:
+ if (taskComment != null) {
+ longDescs.add(taskComment);
+ }
+ break;
+
+ // Attachment attributes
+ case ATTACHID:
+ attachmentAttribute = repositoryTaskData.getRoot().createAttribute(
+ TaskAttribute.PREFIX_ATTACHMENT + parsedText);
+ attachment = BugzillaAttachmentMapper.createFrom(attachmentAttribute);
+ attachment.setLength(new Long(-1));
+ attachment.setAttachmentId(parsedText);
+ attachment.setPatch(isPatch);
+ attachment.setDeprecated(isDeprecated);
+ attachment.setToken(null);
+ break;
+ case DATE:
+ // ignore
+ break;
+ case DESC:
+ if (attachment != null) {
+ attachment.setDescription(parsedText);
+ }
+ break;
+ case FILENAME:
+ if (attachment != null) {
+ attachment.setFileName(parsedText);
+ }
+ break;
+ case CTYPE:
+ case TYPE:
+ if (attachment != null) {
+ attachment.setContentType(parsedText);
+ }
+ break;
+ case SIZE:
+ if (attachment != null) {
+ try {
+ if (parsedText != null) {
+ attachment.setLength(Long.parseLong(parsedText));
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ break;
+ case ATTACHMENT:
+ if (attachment != null) {
+ attachment.applyTo(attachmentAttribute);
+ }
+ isPatch = false;
+ isDeprecated = false;
+ attachment = null;
+ attachmentAttribute = null;
+ break;
+ case DATA:
+ // ignored
+ break;
+ case BUGZILLA:
+ // ignored
+ break;
+ case BUG:
+ // Reached end of bug.
+
+ addDescriptionAndComments();
+
+ // Need to set LONGDESCLENGTH to number of comments + 1 for description
+ TaskAttribute numCommentsAttribute = repositoryTaskData.getRoot().getMappedAttribute(
+ BugzillaAttribute.LONGDESCLENGTH.getKey());
+ if (numCommentsAttribute == null) {
+ numCommentsAttribute = BugzillaTaskDataHandler.createAttribute(repositoryTaskData,
+ BugzillaAttribute.LONGDESCLENGTH);
+ }
+
+ numCommentsAttribute.setValue("" + commentNum); //$NON-NLS-1$
+
+ updateAttachmentMetaData();
+ TaskAttribute attrCreation = repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.CREATION_TS.getKey());
+
+ updateCustomFields(repositoryTaskData);
+
+ if (token != null) {
+ TaskAttribute tokenAttribute = BugzillaTaskDataHandler.createAttribute(repositoryTaskData,
+ BugzillaAttribute.TOKEN);
+ tokenAttribute.setValue(token);
+ }
+
+ // Guard against empty data sets
+ if (attrCreation != null && !attrCreation.equals("")) { //$NON-NLS-1$
+ collector.accept(repositoryTaskData);
+ }
+ break;
+ case BLOCKED:
+ // handled similarly to DEPENDSON
+ case DEPENDSON:
+ TaskAttribute blockOrDepends = repositoryTaskData.getRoot().getMappedAttribute(tag.getKey());
+ if (blockOrDepends == null) {
+ BugzillaTaskDataHandler.createAttribute(repositoryTaskData, tag).setValue(parsedText);
+ } else {
+ if (blockOrDepends.getValue().equals("")) { //$NON-NLS-1$
+ blockOrDepends.setValue(parsedText);
+ } else {
+ blockOrDepends.setValue(blockOrDepends.getValue() + ", " + parsedText); //$NON-NLS-1$
+ }
+ }
+ break;
+ case UNKNOWN:
+ //ignore
+ break;
+ case FLAG:
+ //ignore
+ break;
+ case TOKEN:
+ if (attachment != null) {
+ attachment.setToken(parsedText);
+ } else {
+ token = parsedText;
+ }
+ break;
+ default:
+ TaskAttribute defaultAttribute = repositoryTaskData.getRoot().getMappedAttribute(tag.getKey());
+ if (defaultAttribute == null) {
+ defaultAttribute = BugzillaTaskDataHandler.createAttribute(repositoryTaskData, tag);
+ defaultAttribute.setValue(parsedText);
+ } else {
+ defaultAttribute.addValue(parsedText);
+ }
+ break;
+ }
+
+ }
+
+ private void updateCustomFields(TaskData taskData) {
+ RepositoryConfiguration config = BugzillaCorePlugin.getRepositoryConfiguration(repositoryTaskData.getRepositoryUrl());
+ if (config != null) {
+ for (BugzillaCustomField bugzillaCustomField : config.getCustomFields()) {
+
+ TaskAttribute atr = taskData.getRoot().getAttribute(bugzillaCustomField.getName());
+ if (atr == null) {
+ atr = taskData.getRoot().createAttribute(bugzillaCustomField.getName());
+ }
+
+ if (atr != null) {
+ atr.getMetaData().defaults().setLabel(bugzillaCustomField.getDescription());
+ atr.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
+
+ switch (bugzillaCustomField.getType()) {
+ case 1: // Free Text
+ atr.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ break;
+ case 2: // Drop Down
+ atr.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ break;
+ case 3: // Multiple-Selection Box
+ atr.getMetaData().setType(TaskAttribute.TYPE_MULTI_SELECT);
+ break;
+ case 4: // Large Text Box
+ atr.getMetaData().setType(TaskAttribute.TYPE_LONG_TEXT);
+ break;
+ case 5: // Date/Time
+ atr.getMetaData().setType(TaskAttribute.TYPE_DATETIME);
+ break;
+
+ default:
+ List<String> options = bugzillaCustomField.getOptions();
+ if (options.size() > 0) {
+ atr.getMetaData().setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ } else {
+ atr.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ atr.getMetaData().setReadOnly(false);
+ }
+ }
+ }
+
+ }
+
+ private void updateAttachmentMetaData() {
+ List<TaskAttribute> taskAttachments = repositoryTaskData.getAttributeMapper().getAttributesByType(
+ repositoryTaskData, TaskAttribute.TYPE_ATTACHMENT);
+ for (TaskAttribute attachment : taskAttachments) {
+ TaskAttachmentMapper attachmentMapper = TaskAttachmentMapper.createFrom(attachment);
+ TaskCommentMapper taskComment = attachIdToComment.get(attachmentMapper.getAttachmentId());
+ if (taskComment != null) {
+ attachmentMapper.setAuthor(taskComment.getAuthor());
+ attachmentMapper.setCreationDate(taskComment.getCreationDate());
+ }
+ attachmentMapper.setUrl(repositoryTaskData.getRepositoryUrl()
+ + IBugzillaConstants.URL_GET_ATTACHMENT_SUFFIX + attachmentMapper.getAttachmentId());
+ attachmentMapper.applyTo(attachment);
+ }
+ }
+
+ private void addDescriptionAndComments() {
+ int longDescsSize = longDescs.size() - 1;
+ commentNum = 1;
+ if (longDescsSize == 0) {
+ addDescription(longDescs.get(0).commentText);
+ } else if (longDescsSize == 1) {
+ if (longDescs.get(0).createdTimeStamp.compareTo(longDescs.get(1).createdTimeStamp) <= 0) {
+ // if created_0 is equal to created_1 we assume that longDescs at index 0 is the description.
+ addDescription(longDescs.get(0).commentText);
+ addComment(longDescs.get(1));
+ } else {
+ addDescription(longDescs.get(1).commentText);
+ addComment(longDescs.get(0));
+ }
+ } else if (longDescsSize > 1) {
+ String created_0 = longDescs.get(0).createdTimeStamp;
+ String created_1 = longDescs.get(1).createdTimeStamp;
+ String created_n = longDescs.get(longDescsSize).createdTimeStamp;
+ if (created_0.compareTo(created_1) <= 0 && created_0.compareTo(created_n) < 0) {
+ // if created_0 is equal to created_1 we assume that longDescs at index 0 is the description.
+ addDescription(longDescs.get(0).commentText);
+
+ if (created_1.compareTo(created_n) < 0) {
+ for (int i = 1; i <= longDescsSize; i++) {
+ addComment(longDescs.get(i));
+ }
+ } else {
+ for (int i = longDescsSize; i > 0; i--) {
+ addComment(longDescs.get(i));
+ }
+ }
+ } else {
+ addDescription(longDescs.get(longDescsSize).commentText);
+ if (created_0.compareTo(created_1) < 0) {
+ for (int i = 0; i < longDescsSize; i++) {
+ addComment(longDescs.get(i));
+ }
+ } else {
+ for (int i = longDescsSize - 1; i >= 0; i--) {
+ addComment(longDescs.get(i));
+ }
+ }
+ }
+ }
+ }
+
+ private void addDescription(String commentText) {
+ TaskAttribute attrDescription = BugzillaTaskDataHandler.createAttribute(repositoryTaskData,
+ BugzillaAttribute.LONG_DESC);
+ attrDescription.setValue(commentText);
+ }
+
+ private void addComment(TaskComment comment) {
+ TaskAttribute attribute = repositoryTaskData.getRoot().createAttribute(
+ TaskAttribute.PREFIX_COMMENT + commentNum);
+ TaskCommentMapper taskComment = TaskCommentMapper.createFrom(attribute);
+ taskComment.setCommentId(commentNum + ""); //$NON-NLS-1$
+ taskComment.setNumber(commentNum);
+ IRepositoryPerson author = repositoryTaskData.getAttributeMapper().getTaskRepository().createPerson(
+ comment.author);
+ author.setName(comment.authorName);
+ taskComment.setAuthor(author);
+ TaskAttribute attrTimestamp = attribute.createAttribute(BugzillaAttribute.BUG_WHEN.getKey());
+ attrTimestamp.setValue(comment.createdTimeStamp);
+ taskComment.setCreationDate(repositoryTaskData.getAttributeMapper().getDateValue(attrTimestamp));
+ if (comment.commentText != null) {
+ String commentText = comment.commentText.trim();
+ taskComment.setText(commentText);
+
+ }
+ taskComment.applyTo(attribute);
+ commentNum++;
+
+ if (comment.timeWorked != null) {
+ TaskAttribute workTime = BugzillaTaskDataHandler.createAttribute(attribute, BugzillaAttribute.WORK_TIME);
+ workTime.setValue(comment.timeWorked);
+ }
+
+ parseAttachment(taskComment);
+
+ }
+
+ /** determines attachment id from comment */
+ private void parseAttachment(TaskCommentMapper comment) {
+ String attachmentID = ""; //$NON-NLS-1$
+ String commentText = comment.getText();
+ int firstDelimiter = commentText.indexOf("\n"); //$NON-NLS-1$
+ if (firstDelimiter < 0) {
+ firstDelimiter = commentText.length();
+ }
+ int startIndex = commentText.indexOf(ID_STRING_BEGIN);
+ if (startIndex > 0 && startIndex < firstDelimiter) {
+ int endIndex = commentText.indexOf(ID_STRING_END, startIndex);
+ if (endIndex > 0 && endIndex < firstDelimiter) {
+ startIndex += ID_STRING_BEGIN.length();
+ int p = startIndex;
+ while (p < endIndex) {
+ char c = commentText.charAt(p);
+ if (c < '0' || c > '9') {
+ break;
+ }
+ p++;
+ }
+ if (p == endIndex) {
+ attachmentID = commentText.substring(startIndex, endIndex);
+ if (!attachmentID.equals("")) { //$NON-NLS-1$
+ attachIdToComment.put(attachmentID, comment);
+ }
+ }
+ }
+ }
+ }
+
+ private static class TaskComment {
+
+ public int number;
+
+ public String author;
+
+ public String authorName;
+
+ public String createdTimeStamp;
+
+ public String commentText;
+
+ public String timeWorked;
+
+ public boolean hasAttachment;
+
+ public String attachmentId;
+
+ public TaskComment(int num) {
+ this.number = num;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/UnrecognizedReponseException.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/UnrecognizedReponseException.java
new file mode 100644
index 0000000..089eaeb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/UnrecognizedReponseException.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.IOException;
+
+/**
+ * @author Rob Elves
+ */
+public class UnrecognizedReponseException extends IOException {
+
+ private static final long serialVersionUID = 3937060773477757464L;
+
+ public UnrecognizedReponseException(String message) {
+ super(message);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/XmlCleaner.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/XmlCleaner.java
new file mode 100644
index 0000000..e68d290
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/XmlCleaner.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Reader;
+import java.text.ParseException;
+
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer;
+import org.eclipse.mylyn.commons.net.HtmlTag;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
+
+/**
+ * This is in place to escape & characters within the resource and rdf:about attributes. Currently the values are not
+ * escaped which causes sax parser errors. This bug has been filed and can be found here:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=264785
+ *
+ * @author Rob Elves
+ */
+public class XmlCleaner {
+
+ public static BufferedReader clean(Reader in, File tempFile) {
+
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+ try {
+ BufferedWriter content = new BufferedWriter(new FileWriter(tempFile));
+ // Hack since HtmlStreamTokenizer not familiar with xml tag.
+ content.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); //$NON-NLS-1$
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getAttribute("resource") != null) { //$NON-NLS-1$
+ String resourceID = tag.getAttribute("resource"); //$NON-NLS-1$
+ tag.setAttribute("resource", resourceID.replace("&", "&")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ if (tag.getAttribute("rdf:about") != null) { //$NON-NLS-1$
+ String resourceID = tag.getAttribute("rdf:about"); //$NON-NLS-1$
+ tag.setAttribute("rdf:about", resourceID.replace("&", "&")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ }
+ if (!token.toString().startsWith("<?xml")) { //$NON-NLS-1$
+ content.append(token.toString());
+ }
+ }
+ content.flush();
+ content.close();
+ return new BufferedReader(new FileReader(tempFile));
+ } catch (IOException e) {
+
+ } catch (ParseException e) {
+
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AssignmentEvent.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AssignmentEvent.java
new file mode 100644
index 0000000..cd4ea3d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AssignmentEvent.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+/**
+ * @author John Anvik
+ */
+public class AssignmentEvent extends TaskRevision {
+
+ private static final long serialVersionUID = 3258693199936631348L;
+
+ private final String assigned;
+
+ public AssignmentEvent(String change) {
+ this.what = TaskRevision.ASSIGNMENT;
+ this.assigned = change;
+ this.added = change;
+ }
+
+ public String getAssigned() {
+ return this.assigned;
+ }
+
+ @Override
+ public String toString() {
+ return this.getName() + " | " + this.getDate() + " | " + this.getWhat() + " | " + this.getRemoved() + " | " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ + this.getAssigned();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentEvent.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentEvent.java
new file mode 100644
index 0000000..39c7908
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentEvent.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author John Anvik
+ */
+public class AttachmentEvent extends TaskRevision {
+
+ private static final long serialVersionUID = 3258693199936631348L;
+
+ private static final Pattern id = Pattern.compile("\\d+"); //$NON-NLS-1$
+
+ private final int attachmentId;
+
+ private final List<AttachmentFlag> flags;
+
+ public AttachmentEvent(int id, List<AttachmentFlag> flags) {
+ this.what = TaskRevision.ATTACHMENT;
+ this.attachmentId = id;
+ this.flags = flags;
+ }
+
+ public String getFlagsString() {
+ String flagString = ""; //$NON-NLS-1$
+ for (AttachmentFlag flag : this.flags) {
+ flagString += flag + " "; //$NON-NLS-1$
+ }
+ return flagString;
+ }
+
+ public static int parseId(String attachment) {
+ Matcher matcher = AttachmentEvent.id.matcher(attachment);
+ if (matcher.find()) {
+ return Integer.parseInt(matcher.group());
+ }
+
+ // Error situation
+ System.err.println("WARNING: Cannot find attachment id in " + attachment); //$NON-NLS-1$
+ return -1;
+ }
+
+ public static List<AttachmentFlag> parseFlags(String attachmentFlags) {
+ List<AttachmentFlag> flags = new ArrayList<AttachmentFlag>();
+ AttachmentFlagStatus flagStatus = AttachmentFlagStatus.UNKNOWN;
+ AttachmentFlagState flagState = AttachmentFlagState.UNKNOWN;
+
+ String[] flagToken = attachmentFlags.split(", "); //$NON-NLS-1$
+ for (String token : flagToken) {
+ if (token.indexOf("(") != -1) { //$NON-NLS-1$
+ int end = token.indexOf("("); //$NON-NLS-1$
+ String substr = token.substring(0, end);
+ token = substr;
+ }
+
+ /* Handle the case of the obsolete status 'needs-work' */
+ if (token.startsWith("needs-work")) { //$NON-NLS-1$
+ /*
+ * Since we don't know if 'needs-work' applies to 'review' or
+ * 'superreview', deny both
+ */
+ flags.add(new AttachmentFlag(AttachmentFlagStatus.REVIEW, AttachmentFlagState.DENIED));
+ flags.add(new AttachmentFlag(AttachmentFlagStatus.SUPERREVIEW, AttachmentFlagState.DENIED));
+ } else {
+ boolean startsWithReview = token.toLowerCase().startsWith(
+ AttachmentFlagStatus.REVIEW.name().toLowerCase());
+ boolean firstOrSecondReview = token.toLowerCase().contains(
+ AttachmentFlagStatus.REVIEW.name().toLowerCase())
+ && (token.toLowerCase().startsWith("first-") || token.toLowerCase().startsWith("second-")); //$NON-NLS-1$ //$NON-NLS-2$
+ /*
+ * if(firstOrSecondReview){ System.err.println("First/second
+ * activated"); }
+ */
+ if (startsWithReview || firstOrSecondReview) {
+ flagStatus = AttachmentFlagStatus.REVIEW;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.SUPERREVIEW.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.SUPERREVIEW;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.APPROVAL.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.APPROVAL;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.UI.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.UI;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.BRANCH.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.BRANCH;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.COMMITTED.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.COMMITTED;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.ACCEPTED.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.ACCEPTED;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.COMMENTED.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.COMMENTED;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.NONE.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.NONE;
+ } else if (token.toLowerCase().startsWith(AttachmentFlagStatus.REJECTED.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.REJECTED;
+ } else if (token.equals("1") //$NON-NLS-1$
+ || token.toLowerCase().startsWith(AttachmentFlagStatus.OBSOLETE.name().toLowerCase())) {
+ flagStatus = AttachmentFlagStatus.OBSOLETE;
+ }
+
+ // Assure that flag was set to something meaningful
+ if (flagStatus.equals(AttachmentFlagStatus.UNKNOWN) && token.equals("") == false) { //$NON-NLS-1$
+ System.err.println("WARNING: Attachment flag status unknown: " + token); //$NON-NLS-1$
+ }
+
+ if (token.length() > 0) {
+ if (token.charAt(token.length() - 1) == '?') {
+ flagState = AttachmentFlagState.REQUESTED;
+ } else if (token.charAt(token.length() - 1) == '+') {
+ flagState = AttachmentFlagState.GRANTED;
+ } else if (token.charAt(token.length() - 1) == '-') {
+ flagState = AttachmentFlagState.DENIED;
+ } else if (flagStatus.equals(AttachmentFlagStatus.OBSOLETE)
+ || flagStatus.equals(AttachmentFlagStatus.COMMITTED)
+ || flagStatus.equals(AttachmentFlagStatus.ACCEPTED)
+ || flagStatus.equals(AttachmentFlagStatus.COMMENTED)
+ || flagStatus.equals(AttachmentFlagStatus.NONE)
+ || flagStatus.equals(AttachmentFlagStatus.REJECTED)
+ || flagStatus.equals(AttachmentFlagStatus.REVIEW)) {
+ flagState = AttachmentFlagState.OFF;
+ }
+ }
+ // Assure that flag state was set to something meaningful
+ if (flagState.equals(AttachmentFlagState.UNKNOWN) && token.equals("") == false) { //$NON-NLS-1$
+ System.err.println("WARNING: Attachment flag state unknown: " + token); //$NON-NLS-1$
+ }
+
+ flags.add(new AttachmentFlag(flagStatus, flagState));
+ }
+ }
+ return flags;
+ }
+
+ @Override
+ public String toString() {
+ return this.getName() + " | " + this.getDate() + " | " + this.getWhat() + " | " + this.attachmentId + " | " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ + this.getFlagsString();
+ }
+
+ public List<AttachmentFlag> getFlags() {
+ return this.flags;
+ }
+
+ public int getAttachmentId() {
+ return this.attachmentId;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlag.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlag.java
new file mode 100644
index 0000000..65a5fa5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlag.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+import java.io.Serializable;
+
+/**
+ * @author John Anvik
+ */
+public class AttachmentFlag implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private final AttachmentFlagStatus status;
+
+ private final AttachmentFlagState state;
+
+ public AttachmentFlag(AttachmentFlagStatus status, AttachmentFlagState state) {
+ this.status = status;
+ this.state = state;
+ }
+
+ public AttachmentFlagState getState() {
+ return this.state;
+ }
+
+ public AttachmentFlagStatus getStatus() {
+ return this.status;
+ }
+
+ @Override
+ public String toString() {
+ return this.status.name() + "[" + (this.state.equals(AttachmentFlagState.UNKNOWN) ? "" : this.state.name()) //$NON-NLS-1$ //$NON-NLS-2$
+ + "]"; //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlagState.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlagState.java
new file mode 100644
index 0000000..74dc75e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlagState.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+/**
+ * @author John Anvik
+ */
+public enum AttachmentFlagState {
+ OFF, GRANTED, DENIED, REQUESTED, UNKNOWN;
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlagStatus.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlagStatus.java
new file mode 100644
index 0000000..7364d4c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/AttachmentFlagStatus.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+/**
+ * @author John Anvik
+ */
+public enum AttachmentFlagStatus {
+ REVIEW /* Firefox */, SUPERREVIEW /* Firefox */, APPROVAL /* Firefox */, UI /* Firefox */, BRANCH /* Firefox */, OBSOLETE, UNKNOWN, COMMITTED /* Gnome */, ACCEPTED /* Gnome accepted-committ_now*/, COMMENTED /* Gnome */, NONE /* Gnome */, REJECTED/* Gnome */;
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/BugzillaTaskHistoryParser.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/BugzillaTaskHistoryParser.java
new file mode 100644
index 0000000..6c6e44c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/BugzillaTaskHistoryParser.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+/**
+ * @author John Anvik
+ */
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.ParseException;
+import java.util.Iterator;
+import java.util.Locale;
+
+import javax.security.auth.login.LoginException;
+import javax.swing.text.html.HTML.Tag;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer;
+import org.eclipse.mylyn.commons.net.HtmlTag;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaLanguageSettings;
+
+/**
+ * Parses Bugzilla bug activity page to fill in a BugActivity object
+ *
+ * @author John Anvik
+ */
+
+public class BugzillaTaskHistoryParser {
+
+ private final InputStream inStream;
+
+ private final String characterEncoding;
+
+ public BugzillaTaskHistoryParser(InputStream inStream, String characterEncoding) {
+ this.inStream = inStream;
+ this.characterEncoding = characterEncoding;
+ }
+
+ /**
+ * Parse the activity page for events
+ *
+ * @return A BugActivity object containing the activity history
+ */
+ public TaskHistory retrieveHistory(BugzillaLanguageSettings bugzillaLanguageSettings) throws IOException,
+ ParseException, LoginException {
+ TaskHistory activity = new TaskHistory();
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(new BufferedReader(new InputStreamReader(inStream,
+ characterEncoding)), null);
+
+ boolean isTitle = false;
+ boolean possibleBadLogin = false;
+ String title = ""; //$NON-NLS-1$
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ // make sure that bugzilla doesn't want us to login
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == Tag.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data from inside of the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " "; //$NON-NLS-1$
+ continue;
+ } else if (token.getType() == Token.TAG && ((HtmlTag) token.getValue()).getTagType() == Tag.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+ // check if we may have a problem with login by looking
+ // at
+ // the title of the page
+ boolean found = false;
+ for (Iterator<String> iterator = bugzillaLanguageSettings.getResponseForCommand(
+ BugzillaLanguageSettings.COMMAND_BAD_LOGIN).iterator(); iterator.hasNext() && !found;) {
+ String value = iterator.next().toLowerCase(Locale.ENGLISH);
+ found = found || title.indexOf(value) != -1;
+ }
+ if (found) {
+ possibleBadLogin = true;
+ }
+ isTitle = false;
+ title = ""; //$NON-NLS-1$
+ }
+ continue;
+ }
+
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ // Skip till find <br> - "there can be only one"
+ if (tag.getTagType() == Tag.BR && !tag.isEndTag()) {
+ // skip tags until start of real data
+ while (true) {
+ token = tokenizer.nextToken();
+ if (token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+ if ((tag.isEndTag() && tag.getTagType() == Tag.TR) || tag.getTagType() == Tag.P) {
+ break;
+ }
+ }
+ }
+ parseActivity(tokenizer, activity);
+ }
+ }
+ }
+
+ // if we don't have any keywords and suspect that there was a login
+ // problem, assume we had a login problem
+ if (activity.size() == 0 && possibleBadLogin) {
+ throw new LoginException("Bugzilla login information incorrect"); //$NON-NLS-1$
+ }
+ return activity;
+ }
+
+ /**
+ * Parse the events that have happened to the bug
+ *
+ * @param tokenizer
+ * the token stream
+ * @param activity
+ * the activity object to store the events in
+ * @return
+ */
+ private void parseActivity(HtmlStreamTokenizer tokenizer, TaskHistory activity) throws IOException, ParseException {
+ HtmlTag tag;
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+
+ // End of events
+ if (tag.getTagType() == Tag.TABLE && tag.isEndTag()) {
+ break;
+ }
+
+ // Get event entry
+ this.parseEvent(tokenizer, activity);
+ }
+ }
+ }
+
+ /**
+ * Parse an activity entry
+ *
+ * @param tokenizer
+ * the stream of tokens
+ * @param activity
+ * the activity object to store events in
+ */
+ private void parseEvent(HtmlStreamTokenizer tokenizer, TaskHistory activity) {
+
+ HtmlTag tag;
+ int numChanges = 0;
+
+ try {
+ // Discover how many changes for this entry
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.TD && tag.hasAttribute("rowspan")) { //$NON-NLS-1$
+ numChanges = tag.getIntAttribute("rowspan"); //$NON-NLS-1$
+ break;
+ }
+ }
+ }
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+ String name = getData(tokenizer);
+ String date = getData(tokenizer);
+
+ String what, removed, added;
+ TaskRevision event;
+ for (int change = 0; change < numChanges; change++) {
+ what = getData(tokenizer);
+ removed = getData(tokenizer);
+ added = getData(tokenizer);
+
+ event = TaskRevision.createEvent(what, added);
+ event.setName(name);
+ event.setDate(date);
+ event.setRemoved(removed);
+
+ activity.addEvent(event);
+ }
+ }
+
+ private String getData(HtmlStreamTokenizer tokenizer) {
+
+ Token token;
+ HtmlTag tag;
+ StringBuffer sb = new StringBuffer();
+
+ try {
+ for (token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.TD && tag.isEndTag()) {
+ String data = StringEscapeUtils.unescapeHtml(sb.toString());
+ if (data.startsWith("\n") && (data.contains("Attachment") == false)) { //$NON-NLS-1$ //$NON-NLS-2$
+ data = ""; // empty field //$NON-NLS-1$
+ }
+ return data;
+ }
+ }
+ if (token.getType() == Token.TEXT) {
+ sb.append(token.toString());
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/Messages.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/Messages.java
new file mode 100644
index 0000000..ba94cbc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.core.history;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.core.history.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ResolutionType_Unknown_resolution_type_X;
+
+ public static String StatusType_Unknown_status_type_X;
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/ResolutionEvent.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/ResolutionEvent.java
new file mode 100644
index 0000000..bc21d14
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/ResolutionEvent.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+/**
+ * @author John Anvik
+ */
+public class ResolutionEvent extends TaskRevision {
+
+ private static final long serialVersionUID = 6609447743555687524L;
+
+ private final ResolutionType type;
+
+ public ResolutionEvent(ResolutionType type) {
+ this.what = TaskRevision.RESOLUTION;
+ this.type = type;
+ }
+
+ public ResolutionType getType() {
+ return this.type;
+ }
+
+ public String getResolvedBy() {
+ return this.getName();
+ }
+
+ @Override
+ public String toString() {
+ return this.getName() + " | " + this.getDate() + " | " + this.getWhat() + " | " + this.getRemoved() + " | " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ + (this.getType().equals(ResolutionType.UNKNOWN) ? "" : this.getType()); //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/ResolutionType.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/ResolutionType.java
new file mode 100644
index 0000000..33ff708
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/ResolutionType.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+import java.text.MessageFormat;
+
+/**
+ * @author John Anvik
+ */
+public enum ResolutionType {
+
+ FIXED, DUPLICATE, WONTFIX, INVALID, WORKSFORME, REOPENED, LATER, REMIND, MOVED, UNKNOWN, NOTABUG, NOTGNOME, INCOMPLETE, OBSOLETE, EXPIRED, NOTXIMIAN, NEXTRELEASE, ERRATA, RAWHIDE, UPSTREAM, CANTFIX, CURRENTRELEASE, INSUFFICIENT_DATA, DEFERRED;
+
+ public static ResolutionType convert(String change) {
+ if (change.equals("FIXED")) { //$NON-NLS-1$
+ return ResolutionType.FIXED;
+ }
+ if (change.contains("DUPLICATE")) { //$NON-NLS-1$
+ return ResolutionType.DUPLICATE;
+ }
+ if (change.equals("INVALID")) { //$NON-NLS-1$
+ return ResolutionType.INVALID;
+ }
+ if (change.equals("LATER")) { //$NON-NLS-1$
+ return ResolutionType.LATER;
+ }
+ if (change.equals("WORKSFORME")) { //$NON-NLS-1$
+ return ResolutionType.WORKSFORME;
+ }
+ if (change.equals("REOPENED")) { //$NON-NLS-1$
+ return ResolutionType.REOPENED;
+ }
+ if (change.equals("WONTFIX")) { //$NON-NLS-1$
+ return ResolutionType.WONTFIX;
+ }
+ if (change.equals("REMIND")) { //$NON-NLS-1$
+ return ResolutionType.REMIND;
+ }
+ if (change.equals("MOVED")) { //$NON-NLS-1$
+ return ResolutionType.MOVED;
+ }
+ if (change.equals("EXPIRED")) { //$NON-NLS-1$
+ return ResolutionType.EXPIRED;
+ }
+ if (change.equals("NOTABUG")) { // Gnome //$NON-NLS-1$
+ return ResolutionType.NOTABUG;
+ }
+ if (change.equals("NOTGNOME")) { // Gnome //$NON-NLS-1$
+ return ResolutionType.NOTGNOME;
+ }
+ if (change.equals("INCOMPLETE")) { // Gnome //$NON-NLS-1$
+ return ResolutionType.INCOMPLETE;
+ }
+ if (change.equals("OBSOLETE")) { // Gnome //$NON-NLS-1$
+ return ResolutionType.OBSOLETE;
+ }
+ if (change.equals("NOTXIMIAN")) { // Gnome //$NON-NLS-1$
+ return ResolutionType.NOTXIMIAN;
+ }
+ if (change.equals("NEXTRELEASE")) { // Redhat //$NON-NLS-1$
+ return ResolutionType.NEXTRELEASE;
+ }
+ if (change.equals("ERRATA")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.ERRATA;
+ }
+ if (change.equals("RAWHIDE")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.RAWHIDE;
+ }
+ if (change.equals("UPSTREAM")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.UPSTREAM;
+ }
+ if (change.equals("CANTFIX")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.CANTFIX;
+ }
+ if (change.equals("CURRENTRELEASE")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.CURRENTRELEASE;
+ }
+ if (change.equals("INSUFFICIENT_DATA")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.INSUFFICIENT_DATA;
+ }
+ if (change.equals("DEFERRED")) {// Redhat //$NON-NLS-1$
+ return ResolutionType.DEFERRED;
+ }
+ if (change.equals("") == false) { //$NON-NLS-1$
+ System.err.println(MessageFormat.format(Messages.ResolutionType_Unknown_resolution_type_X, change));
+ }
+ return ResolutionType.UNKNOWN;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/StatusEvent.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/StatusEvent.java
new file mode 100644
index 0000000..4209035
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/StatusEvent.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+/**
+ * @author John Anvik
+ */
+public class StatusEvent extends TaskRevision {
+
+ private static final long serialVersionUID = 245446279981920435L;
+
+ private final StatusType type;
+
+ public StatusEvent(StatusType type) {
+ this.what = TaskRevision.STATUS;
+ this.type = type;
+ }
+
+ public StatusType getType() {
+ return this.type;
+ }
+
+ @Override
+ public String toString() {
+ return this.getName() + " | " + this.getDate() + " | " + this.getWhat() + " | " + this.getRemoved() + " | " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ + this.getType();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/StatusType.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/StatusType.java
new file mode 100644
index 0000000..922e642
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/StatusType.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+import java.text.MessageFormat;
+
+/**
+ * @author John Anvik
+ */
+public enum StatusType {
+ VERIFIED, RESOLVED, CLOSED, REOPENED, ASSIGNED, NEW, UNCONFIRMED, NEEDINFO, /* ANT? */
+ WAITING, /* GCC */
+ SUSPENDED, /* GCC */
+ MODIFIED, /* Redhat */
+ POST, /* Redhat */
+ INVESTIGATE, /* Redhat */
+ PASSES_QA, /* Redhat */
+ PROD_READY, /* Redhat */
+ RELEASE_PENDING, /* Redhat */
+ ON_QA, /* Redhat */
+ QA_READY, /* Redhat */
+ FAILS_QA, /* Redhat */
+ SPEC, /* Redhat */
+ UNKNOWN;
+
+ public static StatusType convert(String change) {
+ if (change.equals("RESOLVED")) { //$NON-NLS-1$
+ return RESOLVED;
+ }
+ if (change.equals("ASSIGNED")) { //$NON-NLS-1$
+ return ASSIGNED;
+ }
+ if (change.equals("NEW")) { //$NON-NLS-1$
+ return NEW;
+ }
+ if (change.equals("REOPENED")) { //$NON-NLS-1$
+ return REOPENED;
+ }
+ if (change.equals("CLOSED")) { //$NON-NLS-1$
+ return CLOSED;
+ }
+ if (change.equals("VERIFIED")) { //$NON-NLS-1$
+ return VERIFIED;
+ }
+ if (change.equals("UNCONFIRMED")) { //$NON-NLS-1$
+ return UNCONFIRMED;
+ }
+ if (change.startsWith("NEEDINFO")) { //$NON-NLS-1$
+ return NEEDINFO;
+ }
+ if (change.equals("WAITING")) { //$NON-NLS-1$
+ return WAITING;
+ }
+ if (change.equals("SUSPENDED")) { //$NON-NLS-1$
+ return SUSPENDED;
+ }
+ if (change.equals("MODIFIED")) { //$NON-NLS-1$
+ return MODIFIED;
+ }
+ if (change.equals("POST")) { //$NON-NLS-1$
+ return POST;
+ }
+ if (change.equals("INVESTIGATE")) { //$NON-NLS-1$
+ return INVESTIGATE;
+ }
+ if (change.equals("PASSES_QA")) { //$NON-NLS-1$
+ return PASSES_QA;
+ }
+ if (change.equals("PROD_READY")) { //$NON-NLS-1$
+ return PROD_READY;
+ }
+ if (change.equals("RELEASE_PENDING")) { //$NON-NLS-1$
+ return RELEASE_PENDING;
+ }
+ if (change.equals("ON_QA")) { //$NON-NLS-1$
+ return ON_QA;
+ }
+ if (change.equals("QA_READY")) { //$NON-NLS-1$
+ return QA_READY;
+ }
+ if (change.equals("FAILS_QA")) { //$NON-NLS-1$
+ return FAILS_QA;
+ }
+ if (change.equals("SPEC")) { //$NON-NLS-1$
+ return SPEC;
+ }
+ if (change.equals("") == false) { //$NON-NLS-1$
+ System.err.println(MessageFormat.format(Messages.StatusType_Unknown_status_type_X, change));
+ }
+ return UNKNOWN;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/TaskHistory.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/TaskHistory.java
new file mode 100644
index 0000000..71edf7e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/TaskHistory.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author John Anvik
+ */
+public class TaskHistory implements Iterable<TaskRevision>, Serializable {
+
+ private static final long serialVersionUID = 1724420130243724426L;
+
+ private final List<StatusEvent> statusEvents;
+
+ private final List<ResolutionEvent> resolutionEvents;
+
+ private final List<AssignmentEvent> assignmentEvents;
+
+ private final List<TaskRevision> otherEvents;
+
+ private final List<AttachmentEvent> attachmentEvents;
+
+ public TaskHistory() {
+ this.statusEvents = new ArrayList<StatusEvent>();
+ this.resolutionEvents = new ArrayList<ResolutionEvent>();
+ this.assignmentEvents = new ArrayList<AssignmentEvent>();
+ this.attachmentEvents = new ArrayList<AttachmentEvent>();
+ this.otherEvents = new ArrayList<TaskRevision>();
+ }
+
+ public void addEvent(TaskRevision event) {
+ if (event instanceof StatusEvent) {
+ this.statusEvents.add((StatusEvent) event);
+ return;
+ }
+
+ if (event instanceof ResolutionEvent) {
+ this.resolutionEvents.add((ResolutionEvent) event);
+ return;
+ }
+
+ if (event instanceof AssignmentEvent) {
+ this.assignmentEvents.add((AssignmentEvent) event);
+ return;
+ }
+
+ if (event instanceof AttachmentEvent) {
+ this.attachmentEvents.add((AttachmentEvent) event);
+ return;
+ }
+ this.otherEvents.add(event);
+ }
+
+ private List<TaskRevision> getEvents() {
+ List<TaskRevision> events = new ArrayList<TaskRevision>();
+ events.addAll(this.statusEvents);
+ events.addAll(this.resolutionEvents);
+ events.addAll(this.assignmentEvents);
+ events.addAll(this.attachmentEvents);
+ events.addAll(this.otherEvents);
+ Collections.sort(events);
+ return events;
+ }
+
+ public Iterator<TaskRevision> iterator() {
+ return getEvents().iterator();
+ }
+
+ public int size() {
+ return this.otherEvents.size() + this.statusEvents.size() + this.resolutionEvents.size()
+ + this.assignmentEvents.size();
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ for (Object event : this) {
+ sb.append(event);
+ sb.append("\n"); //$NON-NLS-1$
+ }
+ return sb.toString();
+ }
+
+ public List<StatusEvent> getStatusEvents() {
+ return statusEvents;
+ }
+
+ public List<ResolutionEvent> getResolutionEvents() {
+ return resolutionEvents;
+ }
+
+ public List<TaskRevision> getOtherEvents() {
+ return otherEvents;
+ }
+
+ public List<AttachmentEvent> getAttachmentEvents() {
+ return attachmentEvents;
+ }
+
+ public List<AssignmentEvent> getAssignmentEvents() {
+ return assignmentEvents;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/TaskRevision.java b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/TaskRevision.java
new file mode 100644
index 0000000..54ab0c4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/TaskRevision.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * John Anvik - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.history;
+
+import java.io.Serializable;
+
+/**
+ * @author John Anvik
+ */
+public class TaskRevision implements Comparable<TaskRevision>, Serializable {
+
+ private static final long serialVersionUID = 7739060501945994522L;
+
+ protected final static String STATUS = "Status"; //$NON-NLS-1$
+
+ protected final static String RESOLUTION = "Resolution"; //$NON-NLS-1$
+
+ protected final static String ASSIGNMENT = "AssignedTo"; //$NON-NLS-1$
+
+ protected final static String ATTACHMENT = "Attachment"; //$NON-NLS-1$
+
+ protected String name;
+
+ protected String date;
+
+ protected String what;
+
+ protected String removed;
+
+ protected String added;
+
+ protected TaskRevision() {
+ this.added = ""; //$NON-NLS-1$
+ }
+
+ public static TaskRevision createEvent(String type, String change) {
+ TaskRevision event = new TaskRevision();
+
+ event.setWhat(type);
+
+ if (STATUS.equals(type)) {
+ event = new StatusEvent(StatusType.convert(change));
+ }
+
+ if (RESOLUTION.equals(type)) {
+ event = new ResolutionEvent(ResolutionType.convert(change));
+ }
+
+ if (ASSIGNMENT.equals(type)) {
+ event = new AssignmentEvent(change);
+ }
+
+ if (type.contains(ATTACHMENT) && type.contains("Flag")) { //$NON-NLS-1$
+ event = new AttachmentEvent(AttachmentEvent.parseId(type), AttachmentEvent.parseFlags(change));
+ }
+
+ event.setAdded(change);
+ return event;
+ }
+
+ private void setAdded(String added) {
+ this.added = added;
+ }
+
+ public void setRemoved(String removed) {
+ this.removed = removed;
+ }
+
+ private void setWhat(String what) {
+ this.what = what;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAdded() {
+ return this.added;
+ }
+
+ public String getRemoved() {
+ return this.removed;
+ }
+
+ public String getWhat() {
+ return this.what;
+ }
+
+ public String getDate() {
+ return this.date;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ @Override
+ public String toString() {
+ return this.name + " | " + this.date + " | " + this.what + " | " + this.removed + " | " + this.added; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+
+ public int compareTo(TaskRevision o) {
+ return this.date.compareTo(o.getDate());
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/messages.properties b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/messages.properties
new file mode 100644
index 0000000..120c88a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/history/messages.properties
@@ -0,0 +1,2 @@
+ResolutionType_Unknown_resolution_type_X=Unknown resolution type: {0}
+StatusType_Unknown_status_type_X=Unknown status type: {0}
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/messages.properties b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/messages.properties
new file mode 100644
index 0000000..d42a9d4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/messages.properties
@@ -0,0 +1,122 @@
+BugzillaAttribute_Add=Add:
+BugzillaAttribute_Add_CC=Add CC:
+BugzillaAttribute_Add_self_to_CC=Add self to CC
+BugzillaAttribute_Additional_Comments=Additional Comments:
+BugzillaAttribute_Assigned_to=Assigned to:
+BugzillaAttribute_Assigned_to_NAME=Assigned to:
+BugzillaAttribute_ATTACH_ID=attachid
+BugzillaAttribute_attachment=attachment
+BugzillaAttribute_Blocks=Blocks:
+BugzillaAttribute_bug=bug
+BugzillaAttribute_Bug_ID=Bug:
+BugzillaAttribute_bug_when=bug_when
+BugzillaAttribute_bugzilla=bugzilla
+BugzillaAttribute_CC=CC:
+BugzillaAttribute_CC_List=CC List
+BugzillaAttribute_Classification=Classification:
+BugzillaAttribute_Classification_ID=Classification ID:
+BugzillaAttribute_Component=Component:
+BugzillaAttribute_Content_Type=Content Type
+BugzillaAttribute_data=data
+BugzillaAttribute_Date=Date
+BugzillaAttribute_Depends_on__Subtasks_=Depends on (Subtasks):
+BugzillaAttribute_desc=desc
+BugzillaAttribute_Description=Description:
+BugzillaAttribute_Due=Due:
+BugzillaAttribute_Estimated_Time=Estimated Time:
+BugzillaAttribute_everconfirmed=everconfirmed
+BugzillaAttribute_filename=filename
+BugzillaAttribute_flag=Flag:
+BugzillaAttribute_Group=Group
+BugzillaAttribute_Keywords=Keywords:
+BugzillaAttribute_Modified=Modified:
+BugzillaAttribute_new_comment=new comment
+BugzillaAttribute_Number_of_comments=Number of comments
+BugzillaAttribute_Obsolete=Obsolete
+BugzillaAttribute_open_status_values=open status values
+BugzillaAttribute_Opened=Opened:
+BugzillaAttribute_OS=OS:
+BugzillaAttribute_Patch=Patch
+BugzillaAttribute_Platform=Platform:
+BugzillaAttribute_Priority=Priority:
+BugzillaAttribute_Product=Product:
+BugzillaAttribute_QA_Contact=QA Contact:
+BugzillaAttribute_QA_Contact_NAME=QA Contact
+BugzillaAttribute_Reassign_to_default_assignee=Reassign to default assignee
+BugzillaAttribute_Remaining=Remaining:
+BugzillaAttribute_Remove_CC=Remove CC
+BugzillaAttribute_REPORT_ACCESSIBLE=Reporter
+BugzillaAttribute_REPORT_NAME=Reporter:
+BugzillaAttribute_Reporter=Reporter:
+BugzillaAttribute_Resolution=Resolution:
+BugzillaAttribute_Severity=Severity:
+BugzillaAttribute_Size=Size:
+BugzillaAttribute_Status=Status:
+BugzillaAttribute_Status_Whiteboard=Status Whiteboard:
+BugzillaAttribute_Summary=Summary:
+BugzillaAttribute_Target_milestone=Target milestone:
+BugzillaAttribute_thetext=thetext
+BugzillaAttribute_type=type
+BugzillaAttribute_UNKNOWN=UNKNOWN
+BugzillaAttribute_URL=URL:
+BugzillaAttribute_used_by_search_engine_bugs=used by search engine
+BugzillaAttribute_used_by_search_engine_desc=used by search engine
+BugzillaAttribute_used_by_search_engine_id=used by search engine
+BugzillaAttribute_used_by_search_engine_installation=used by search engine
+BugzillaAttribute_used_by_search_engine_li=used by search engine
+BugzillaAttribute_used_by_search_engine_rdf=used by search engine
+BugzillaAttribute_used_by_search_engine_result=used by search engine
+BugzillaAttribute_used_by_search_engine_seq=used by search engine
+BugzillaAttribute_Version=Version:
+BugzillaAttribute_version_of_bugzilla_installed=version of bugzilla installed
+BugzillaAttribute_Votes=Votes:
+BugzillaAttribute_who=who
+BugzillaAttribute_who_name=who_name
+BugzillaAttribute_Worked=Worked:
+BugzillaClient_could_not_post_form_null_returned=Could not post form, client returned null method.
+BugzillaClient_description_required_when_submitting_attachments=A description is required when submitting attachments.
+
+BugzillaOperation_Accept_to_ASSIGNED=Accept (change status to ASSIGNED)
+BugzillaOperation_Duplicate_of=Duplicate of
+BugzillaOperation_Leave_as_X_X=Leave as %s %s
+BugzillaOperation_Mark_as_CLOSED=Mark as CLOSED
+BugzillaOperation_Mark_as_VERIFIED=Mark as VERIFIED
+BugzillaOperation_Reassign_to=Reassign to
+BugzillaOperation_Reopen_bug=Reopen bug
+BugzillaOperation_Resolve_as=Resolve as
+BugzillaOperation_Reassign_to_default_assignee=Reassign to default assignee
+
+BugzillaRepositoryConnector_BUGZILLA_SUPPORTS_2_18_TO_3_0=Bugzilla (supports uncustomized 2.18-3.2)
+BugzillaRepositoryConnector_Check_repository_configuration=Check repository configuration: {0}
+BugzillaRepositoryConnector_checking_for_changed_tasks=Checking for changed tasks
+BugzillaRepositoryConnector_Query_for_changed_tasks=Query for changed tasks
+BugzillaRepositoryConnector_running_query=Running query
+BugzillaRepositoryConnector_Unrecognized_response_from_server=Unrecognized response from server
+
+BugzillaTaskAttachmentHandler_Getting_attachment=Getting attachment
+BugzillaTaskAttachmentHandler_Sending_attachment=Sending attachment
+BugzillaTaskAttachmentHandler_unable_to_submit_attachment=Unable to submit attachment
+
+BugzillaTaskDataHandler_Receiving_tasks=Receiving tasks
+BugzillaTaskDataHandler_Submitting_task=Submitting task
+BugzillaTaskDataHandler_updating_attachment=Updating Attachment
+
+IBugzillaConstants_Bugzilla_login_information_or_repository_version_incorrect=Bugzilla login information or repository version incorrect
+IBugzillaConstants_invalid_bug_id_requested_bug_id_does_not_exist=Invalid bug id. The requested bug id does not exist.
+IBugzillaConstants_invalid_repository_credentials=Invalid repository credentials.
+IBugzillaConstants_Mylyn_Bugzilla_Connector=Mylyn Bugzilla Connector
+IBugzillaConstants_New_Bugzilla_Report=New Bugzilla Report
+IBugzillaConstants_requested_operation_not_permitted=The requested operation is not permitted.
+
+SaxMultiBugReportContentHandler_Bug_id_from_server_did_not_match_requested_id=Bug id from server did not match requested id.
+SaxMultiBugReportContentHandler_id_not_found=\ id not found.
+
+BugzillaStatus_errorRepository = Repository error from {0}:\n\n{1}
+BugzillaStatus_repositoryLoginFailure = Unable to login to {0}.\n\n{1}\n\nPlease validate credentials via Task Repositories view.
+BugzillaStatus_repositoryNotFound = Repository {0} could not be found.
+BugzillaStatus_repositoryCommentRequired = You have to specify a new comment when making this change. Please comment on the reason for this change.
+BugzillaStatus_repositoryCollision = Mid-air collision occurred while submitting to {0}. Synchronize task and re-submit changes.
+### repositoryUrl, class.simpleName, class.getMessage
+BugzillaStatus_errorIo = I/O Error occurred while communicating with {0}.\n\n{1}: {2}
+BugzillaStatus_errorInternal = An internal error has occurred: {0}
+BugzillaStatus_operationCancelled = {0} was canceled by the user.
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/service/temp.txt b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/service/temp.txt
new file mode 100644
index 0000000..60d8cda
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.core/src/org/eclipse/mylyn/internal/bugzilla/core/service/temp.txt
@@ -0,0 +1 @@
+package for bugzilla web service apis
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/.classpath b/org.eclipse.mylyn.bugzilla.ide/.classpath
new file mode 100644
index 0000000..c66ff04
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/views/log/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.bugzilla.ide/.cvsignore b/org.eclipse.mylyn.bugzilla.ide/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.bugzilla.ide/.project b/org.eclipse.mylyn.bugzilla.ide/.project
new file mode 100644
index 0000000..a46e60e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.bugzilla.ide</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2007/11/46/refactorings.history b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2007/11/46/refactorings.history
new file mode 100644
index 0000000..d5e6a93
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2007/11/46/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromFailureAction' to 'NewTaskFromJunitResultViewAction'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromFailureAction'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromJunitResultViewAction'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in '*.xml, *.xsd' files
- Update textual occurrences in comments and strings" description="Rename type 'NewTaskFromFailureAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ide.actions{NewTaskFromFailureAction.java[NewTaskFromFailureAction" matchStrategy="1" name="NewTaskFromJunitResultViewAction" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1195089762817" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.actions'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Destination element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromJunitResultViewAction.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.java.ui/src<org.eclipse.mylyn.internal.java.ui.actions" element1="/src<org.eclipse.mylyn.internal.bugzilla.ide.actions{NewTaskFromJunitResultViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1195110912116" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2007/11/46/refactorings.index b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2007/11/46/refactorings.index
new file mode 100644
index 0000000..6f9ea4c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2007/11/46/refactorings.index
@@ -0,0 +1,2 @@
+1195089762817 Rename type 'NewTaskFromFailureAction'
+1195110912116 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/1/2/refactorings.history b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/1/2/refactorings.history
new file mode 100644
index 0000000..a3d3959
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/1/2/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'protected void createTask()' from 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromErrorAction.run()' to 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromErrorAction'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Method name: 'createTask'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.ide.actions.NewTaskFromErrorAction'
- Declared visibility: 'protected'" comments="false" description="Extract method 'createTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ide.actions{NewTaskFromErrorAction.java" name="createTask" replace="false" selection="1310 578" stamp="1199933021100" version="1.0" visibility="4"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/1/2/refactorings.index b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/1/2/refactorings.index
new file mode 100644
index 0000000..e02d7ec
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/1/2/refactorings.index
@@ -0,0 +1 @@
+1199933021100 Extract method 'createTask'
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/12/51/refactorings.history b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/12/51/refactorings.history
new file mode 100644
index 0000000..e882280
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'plugin.properties.rej'" description="Delete element" element1="plugin.properties.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229385204598" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'plugin.xml.rej'" description="Delete element" element1="plugin.xml.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229385276187" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'MANIFEST.MF.rej'" description="Delete element" element1="META-INF/MANIFEST.MF.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229386872772" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/12/51/refactorings.index b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/12/51/refactorings.index
new file mode 100644
index 0000000..9f55d06
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/12/51/refactorings.index
@@ -0,0 +1,3 @@
+1229385204598 Delete element
+1229385276187 Delete element
+1229386872772 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/2/8/refactorings.history
new file mode 100644
index 0000000..35bc79a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/2/8/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.ide.IBugzillaIdeConstants.ID_PLUGIN' to 'org.eclipse.mylyn.internal.bugzilla.ide.BugzillaIdePlugin'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ide.IBugzillaIdeConstants.ID_PLUGIN'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.ide.BugzillaIdePlugin'" delegate="false" deprecate="true" description="Move member 'ID_PLUGIN'" element1="/src<org.eclipse.mylyn.internal.bugzilla.ide{IBugzillaIdeConstants.java[IBugzillaIdeConstants^ID_PLUGIN" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.bugzilla.ide{BugzillaIdePlugin.java[BugzillaIdePlugin" stamp="1203364701627" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ide.wizards.SelectProductPage.YHINT' from expression '(int)(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH * 1.25)'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Constant name: 'YHINT'
- Constant expression: '(int)(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH * 1.25)'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'YHINT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ide.wizards{SelectProductPage.java" name="YHINT" qualify="false" replace="true" selection="4074 57" stamp="1203368907871" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ide.IBugzillaIdeConstants.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ide{IBugzillaIdeConstants.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1203389772791" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'REPOSITORY' in 'org.eclipse.mylyn.internal.bugzilla.ide.IRepositoryConstants' to 'REPOSITORY_URL'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ide.IRepositoryConstants.REPOSITORY'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ide.IRepositoryConstants.REPOSITORY_URL'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field" delegate="false" deprecate="false" description="Rename field 'REPOSITORY'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.ide{IRepositoryConstants.java[IRepositoryConstants^REPOSITORY" name="REPOSITORY_URL" references="true" setter="false" stamp="1203389864696" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/2/8/refactorings.index
new file mode 100644
index 0000000..6d3be94
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/2/8/refactorings.index
@@ -0,0 +1,4 @@
+1203364701627 Move member 'ID_PLUGIN'
+1203368907871 Extract constant 'YHINT'
+1203389772791 Delete element
+1203389864696 Rename field 'REPOSITORY'
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..ba43667
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'org.eclipse.mylyn.bugzilla.ide/src'" description="Delete element" element1="/src" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208553661005" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'icons'" description="Delete element" element1="icons" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208553665910" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ide'
- Original project: 'org.eclipse.mylyn.bugzilla.ide'
- Original element: 'schema'" description="Delete element" element1="schema" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208553669070" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..817a32a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,3 @@
+1208553661005 Delete element
+1208553665910 Delete element
+1208553669070 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.bugzilla.ide/META-INF/MANIFEST.MF b/org.eclipse.mylyn.bugzilla.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f24b8c4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.bugzilla.ide;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Require-Bundle: org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-Vendor: %Bundle-Vendor
+Bundle-ClassPath: .
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.mylyn.bugzilla.ide/about.html b/org.eclipse.mylyn.bugzilla.ide/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ide/build.properties b/org.eclipse.mylyn.bugzilla.ide/build.properties
new file mode 100644
index 0000000..0e0c4f7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = META-INF/,\
+ plugin.xml,\
+ about.html,\
+ .,\
+ plugin.properties,\
+ build.properties,\
+ icons/
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.bugzilla.ide/icons/branding32/eclipse.png b/org.eclipse.mylyn.bugzilla.ide/icons/branding32/eclipse.png
new file mode 100644
index 0000000..568fac1
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ide/icons/branding32/eclipse.png differ
diff --git a/org.eclipse.mylyn.bugzilla.ide/plugin.properties b/org.eclipse.mylyn.bugzilla.ide/plugin.properties
new file mode 100644
index 0000000..6620798
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/plugin.properties
@@ -0,0 +1,10 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Bugzilla IDE Extensions
diff --git a/org.eclipse.mylyn.bugzilla.ide/plugin.xml b/org.eclipse.mylyn.bugzilla.ide/plugin.xml
new file mode 100644
index 0000000..59d3915
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ide/plugin.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension point="org.eclipse.mylyn.tasks.core.templates">
+ <repository addAutomatically="true" characterEncoding="ISO-8859-1"
+ label="Eclipse.org" repositoryKind="bugzilla" urlRepository="https://bugs.eclipse.org/bugs"
+ version="3.0" />
+ </extension>
+ <extension point="org.eclipse.mylyn.tasks.bugs.support">
+ <category
+ description="Commercial support"
+ id="org.eclipse.mylyn.tasks.bugs.commercial"
+ name="Commercial Support"
+ weight="500">
+ </category>
+ <category description="Community supported open source projects"
+ id="org.eclipse.mylyn.tasks.bugs.openSource" name="Open Source Community"
+ weight="900" />
+ <provider categoryId="org.eclipse.mylyn.tasks.bugs.openSource"
+ description="Eclipse open source community bug tracker" icon="icons/branding32/eclipse.png"
+ id="org.eclipse" name="Eclipse.org" url="http://eclipse.org/" />
+ <mapping namespace="org.eclipse">
+ <repository kind="bugzilla" url="https://bugs.eclipse.org/bugs">
+ </repository>
+ </mapping>
+ <product featureId="org.eclipse.mylyn_feature" id="org.eclipse.mylyn"
+ pluginId="org.eclipse.mylyn" providerId="org.eclipse" url="http://eclipse.org/mylyn/support/" />
+ <mapping namespace="org.eclipse.mylyn" productId="org.eclipse.mylyn">
+ <property name="product" value="Mylyn">
+ </property>
+ </mapping>
+ <mapping namespace="org.eclipse.mylyn.tasks" productId="org.eclipse.mylyn">
+ <property name="component" value="Tasks"/>
+ </mapping>
+ <mapping namespace="org.eclipse.mylyn.wikitext" productId="org.eclipse.mylyn">
+ <property name="component" value="WikiText"/>
+ </mapping>
+ <product featureId="org.eclipse.pde" id="org.eclipse.pde"
+ providerId="org.eclipse" />
+ <mapping namespace="org.eclipse.pde" productId="org.eclipse.pde">
+ <property name="product" value="PDE">
+ </property>
+ </mapping>
+ <product featureId="org.eclipse.platform" id="org.eclipse.platform"
+ providerId="org.eclipse" />
+ <mapping namespace="org.eclipse.platform" productId="org.eclipse.platform">
+ <property name="product" value="Platform">
+ </property>
+ </mapping>
+ <product featureId="org.eclipse.cvs" id="org.eclipse.cvs"
+ providerId="org.eclipse">
+ </product>
+ <mapping namespace="org.eclipse.team.cvs" productId="org.eclipse.cvs">
+ <property name="product" value="Platform">
+ </property>
+ <property name="component" value="CVS">
+ </property>
+ </mapping>
+ <product featureId="org.eclipse.jdt" id="org.eclipse.jdt"
+ providerId="org.eclipse" />
+ <mapping namespace="org.eclipse.jdt" productId="org.eclipse.jdt">
+ <property name="product" value="JDT">
+ </property>
+ </mapping>
+ <!--
+ <product id="org.eclipse.epp.package.java" providerId="org.eclipse" featureId="org.eclipse.epp.package.java.feature" />
+ <mapping namespace="org.eclipse.epp.package.java" productId="org.eclipse.epp.package.java">
+ <property name="product" value="EPP"/>
+ <property name="component" value="java-package"/>
+ </mapping>
+ <product id="org.eclipse.epp.usagedata" providerId="org.eclipse" featureId="org.eclipse.epp.usagedata.feature" />
+ <mapping namespace="org.eclipse.epp.package.java" productId="org.eclipse.epp.package.java">
+ <property name="product" value="EPP"/>
+ <property name="component" value="Usage Data Collector"/>
+ </mapping>
+ -->
+ <product id="org.eclipse.wst.xml_ui" providerId="org.eclipse" featureId="org.eclipse.wst.xml_ui.feature" />
+ <mapping namespace="org.eclipse.wst" productId="org.eclipse.wst.xml_ui">
+ <property name="product" value="Web Tools"/>
+ <property name="component" value="Web Standard Tools"/>
+ </mapping>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.classpath b/org.eclipse.mylyn.bugzilla.tests/.classpath
new file mode 100644
index 0000000..c0275fa
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.cvsignore b/org.eclipse.mylyn.bugzilla.tests/.cvsignore
new file mode 100644
index 0000000..0a2b580
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.cvsignore
@@ -0,0 +1,2 @@
+bin
+credentials.properties
diff --git a/org.eclipse.mylyn.bugzilla.tests/.project b/org.eclipse.mylyn.bugzilla.tests/.project
new file mode 100644
index 0000000..eb0931c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.bugzilla.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..495d447
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaClientTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaClientTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1162340336906" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'config.xml'" description="Delete element" element1="testdata/configuration/config.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1162492480265" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..f03c395
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1,2 @@
+1162340336906 Delete element
+1162492480265 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..722337c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaClientTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaClientTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165347710203" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaClientTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaClientTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165352449734" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.Test.java'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests{Test.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165357526296" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaClientTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaClientTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165360578828" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..7829730
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,4 @@
+1165347710203 Delete element
+1165352449734 Delete element
+1165357526296 Delete element
+1165360578828 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..65b2122
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.bugzilla.tests.Bugzilla2201ParserTest' to 'Bugzilla220ParserTest'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.bugzilla.tests/src<org.eclipse.mylar.bugzilla.tests{Bugzilla2201ParserTest.java[Bugzilla2201ParserTest" matchStrategy="1" name="Bugzilla220ParserTest" project="org.eclipse.mylar.bugzilla.tests" qualified="false" references="true" similarDeclarations="false" stamp="1140639303138" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..af4b2c1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1 @@
+1140639303138 Rename type 'org.eclipse.mylar.bugzilla.tests.Bugzilla2201ParserTest' to 'Bugzilla220ParserTest'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..4b703cc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryClientTest' to 'BugzillaRepositoryConnectorTest'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.bugzilla.tests/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryClientTest.java[BugzillaRepositoryClientTest" matchStrategy="1" name="BugzillaRepositoryConnectorTest" project="org.eclipse.mylar.bugzilla.tests" qualified="false" references="true" similarDeclarations="false" stamp="1141173516336" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..c232929
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1 @@
+1141173516336 Rename type 'org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryClientTest' to 'BugzillaRepositoryConnectorTest'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/23/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/23/refactorings.history
new file mode 100644
index 0000000..3bbc00b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.bugzilla.tests/credentials.properties' to 'credentials.propertiesss' - Original element: 'credentials.properties'" description="Rename resource 'credentials.properties'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="credentials.properties" name="credentials.propertiesss" stamp="1149873326442" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.bugzilla.tests/credentials.propertiesss' to 'credentials.properties' - Original element: 'credentials.propertiesss'" description="Rename resource 'credentials.propertiesss'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="credentials.propertiesss" name="credentials.properties" stamp="1149873541932" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/23/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/23/refactorings.index
new file mode 100644
index 0000000..0ee7443
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1149873326442 Rename resource 'credentials.properties'
+1149873541932 Rename resource 'credentials.propertiesss'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..c53eeea
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1,9 @@
+1150394102289 Rename method 'init222'
+1150488669612 Rename method 'addOneDay'
+1150481509974 Rename local variable 'task4'
+1150481197812 Rename method 'assertAllTasksInSynchState'
+1150481142391 Rename method 'assertSynch'
+1150480265912 Rename method 'generateLocalTask'
+1150480184571 Rename method 'forceSynch'
+1150480102444 Rename local variable 'task4'
+1150479713257 Rename local variable 'task4'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..25bda14
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.bugzilla.tests.BugzillaTaskHyperlinkDetectorTest.DUPLICATE' from expression '"duplicate of 112233"' - Constant name: 'DUPLICATE' - Constant expression: '"duplicate of 112233"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DUPLICATE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.bugzilla.tests{BugzillaTaskHyperlinkDetectorTest.java" name="DUPLICATE" qualify="false" replace="true" selection="4735 21" stamp="1152662860186" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.BugzillaQueryTest' to 'BugzillaHeadlessTest' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaQueryTest' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.BugzillaHeadlessTest' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaQueryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests{BugzillaQueryTest.java[BugzillaQueryTest" matchStrategy="1" name="BugzillaHeadlessTest" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1152831671171" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaHeadlessTest' to 'BugzillaQueryTest' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaHeadlessTest' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaQueryTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaHeadlessTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaHeadlessTest.java[BugzillaHeadlessTest" matchStrategy="1" name="BugzillaQueryTest" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152844622515" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaQueryTest' to 'BugzillaHeadlessTest' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaQueryTest' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaHeadlessTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaQueryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaQueryTest.java[BugzillaQueryTest" matchStrategy="1" name="BugzillaHeadlessTest" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152846937875" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaHeadlessTest' to 'BugzillaQueryTest' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaHeadlessTest' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaQueryTest' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaHeadlessTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaHeadlessTest.java[BugzillaHeadlessTest" matchStrategy="1" name="BugzillaQueryTest" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1152894456171" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..9870b1a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,5 @@
+1152662860186 Extract constant 'DUPLICATE'
+1152894456171 Rename type 'BugzillaHeadlessTest'
+1152846937875 Rename type 'BugzillaQueryTest'
+1152844622515 Rename type 'BugzillaHeadlessTest'
+1152831671171 Rename type 'BugzillaQueryTest'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..8e7b242
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.TaskTestUtil' to 'BugzillaTestUtil' - Original element: 'org.eclipse.mylar.bugzilla.tests.TaskTestUtil' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.BugzillaTestUtil' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TaskTestUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests{TaskTestUtil.java[TaskTestUtil" matchStrategy="1" name="BugzillaTestUtil" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153790451297" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..890ae3e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1 @@
+1153790451297 Rename type 'TaskTestUtil'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..72477f4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.bugzilla.tests.TaskEditorTest.NEW_DESCRIPTION' from expression '"new description"' - Constant name: 'NEW_DESCRIPTION' - Constant expression: '"new description"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'NEW_DESCRIPTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.bugzilla.tests{TaskEditorTest.java" name="NEW_DESCRIPTION" qualify="false" replace="true" selection="4015 17" stamp="1154456278875" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.bugzilla.tests.TaskEditorTest.OLD_DESCRIPTION' from expression '"description"' - Constant name: 'OLD_DESCRIPTION' - Constant expression: '"description"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'OLD_DESCRIPTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.bugzilla.tests{TaskEditorTest.java" name="OLD_DESCRIPTION" qualify="false" replace="true" selection="4344 13" stamp="1154456310062" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.bugzilla.tests.TaskEditorTest.MOCK_HANDLE' from expression '"handle"' - Constant name: 'MOCK_HANDLE' - Constant expression: '"handle"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MOCK_HANDLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.bugzilla.tests{TaskEditorTest.java" name="MOCK_HANDLE" qualify="false" replace="true" selection="3456 8" stamp="1154462654562" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.bugzilla.tests.TaskEditorTest.MOCK_LABEL' from expression '"label"' - Constant name: 'MOCK_LABEL' - Constant expression: '"label"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MOCK_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.bugzilla.tests{TaskEditorTest.java" name="MOCK_LABEL" qualify="false" replace="true" selection="3525 7" stamp="1154462667718" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..8a4dd4f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1,4 @@
+1154456278875 Extract constant 'NEW_DESCRIPTION'
+1154462667718 Extract constant 'MOCK_LABEL'
+1154462654562 Extract constant 'MOCK_HANDLE'
+1154456310062 Extract constant 'OLD_DESCRIPTION'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/33/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/33/refactorings.history
new file mode 100644
index 0000000..22c6789
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/33/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.bugzilla.tests/testdata/configuration/rdfoutput222.txt' to 'rdfconfig222.txt' - Original element: 'rdfoutput222.txt'" description="Rename resource 'rdfoutput222.txt'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="testdata/configuration/rdfoutput222.txt" name="rdfconfig222.txt" stamp="1155933401593" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/33/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/33/refactorings.index
new file mode 100644
index 0000000..7b4037e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/33/refactorings.index
@@ -0,0 +1 @@
+1155933401593 Rename resource 'rdfoutput222.txt'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..d20a13a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.bugzilla.tests.AbstractBugzillaTest' from 'org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest' - Sub types: org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest - Extracted class: 'org.eclipse.mylar.bugzilla.tests.AbstractBugzillaTest' - Extracted members: org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.client org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.manager org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.repository org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.taskList org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.setUp() org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.init222() org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.init2201() org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.init220() org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.init218() org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.init(...) org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.tearDown() - Use super type where possible" delete="7" description="Extract superclass 'AbstractBugzillaTest'" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest^client" element10="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init~QString;" element11="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~tearDown" element12="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init~QString;" element13="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init218" element14="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init220" element15="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init2201" element16="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init222" element17="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~setUp" element18="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~tearDown" element19="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest" element2="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest^manager" element3="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest^repository" element4="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest^taskList" element5="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~setUp" element6="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init222" element7="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init2201" element8="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init220" element9="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~init218" extract="11" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest" instanceof="false" name="AbstractBugzillaTest" replace="true" stamp="1156205226109" stubs="true" types="1" version="1.0"/>
+<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest' to 'org.eclipse.mylar.bugzilla.tests.AbstractBugzillaTest' - Original elements: org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.generateLocalTaskAndDownload(...) org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.makeExistingBugPost(...) org.eclipse.mylar.bugzilla.tests.BugzillaRepositoryConnectorTest.synchAndAssertState(...) - Destination type: 'org.eclipse.mylar.bugzilla.tests.AbstractBugzillaTest' - Use super type where possible" delete="3" description="Pull up members to 'AbstractBugzillaTest'" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~generateLocalTaskAndDownload~QString;" element2="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~makeExistingBugPost~QRepositoryTaskData;" element3="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~synchAndAssertState~QSet\<QAbstractRepositoryTask;>;~QRepositoryTaskSyncState;" element4="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~generateLocalTaskAndDownload~QString;" element5="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~makeExistingBugPost~QRepositoryTaskData;" element6="/src<org.eclipse.mylar.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest~synchAndAssertState~QSet\<QAbstractRepositoryTask;>;~QRepositoryTaskSyncState;" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.bugzilla.tests{AbstractBugzillaTest.java[AbstractBugzillaTest" instanceof="false" pull="3" replace="true" stamp="1156205387328" stubs="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.BugzillaTaskDataMigration' to 'BugzillaTaskDataMigrationTest' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaTaskDataMigration' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.BugzillaTaskDataMigrationTest' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaTaskDataMigration'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests{BugzillaTaskDataMigration.java[BugzillaTaskDataMigration" matchStrategy="1" name="BugzillaTaskDataMigrationTest" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1156205631781" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..0968a6b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1,3 @@
+1156205226109 Extract superclass 'AbstractBugzillaTest'
+1156205631781 Rename type 'BugzillaTaskDataMigration'
+1156205387328 Pull up members to 'AbstractBugzillaTest'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..3abfe3f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Destination element: 'tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaTaskDataMigrationTest.java'" description="Copy compilation unit" destination="developer/src-old/tests" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaTaskDataMigrationTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/bugzilla/tests/BugzillaTaskDataMigrationTest.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1169231018163" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.BugzillaTaskDataMigrationTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests{BugzillaTaskDataMigrationTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1169231022363" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..647f5d6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1,2 @@
+1169231018163 Copy compilation unit
+1169231022363 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..3d580a1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.bugzilla.tests.headless.TestBugzillaTaskHistory' to 'BugzillaTaskHistoryTest' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.TestBugzillaTaskHistory' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TestBugzillaTaskHistory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.bugzilla.tests.headless{TestBugzillaTaskHistory.java[TestBugzillaTaskHistory" matchStrategy="1" name="BugzillaTaskHistoryTest" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1171348875703" textual="true" version="1.0"/>
+<refactoring comment="Rename local variable 'statusChange' in 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest.testGetBugHistory()' to 'resolutionChange' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest.testGetBugHistory().statusChange' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest.testGetBugHistory().resolutionChange' - Update references to refactored element" description="Rename local variable 'statusChange'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaTaskHistoryTest.java" name="resolutionChange" references="true" selection="3286 12" stamp="1171569480715" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..8fcf047
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1,2 @@
+1171348875703 Rename type 'TestBugzillaTaskHistory'
+1171569480715 Rename local variable 'statusChange'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..b91539a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 3 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original elements: test-attach-1171401227263.txt test-attach-1171401474612.txt test-attach-1171404403023.txt" description="Delete elements" element1="test-attach-1171401227263.txt" element2="test-attach-1171401474612.txt" element3="test-attach-1171404403023.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="3" stamp="1172174371330" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'temptasklist-save.zip'" description="Delete element" element1="temptasklist-save.zip" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1172174377826" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..cbf98da
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,2 @@
+1172174371330 Delete elements
+1172174377826 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/9/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/9/refactorings.history
new file mode 100644
index 0000000..88a98e7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/9/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'REPORT_FILE_NAME' in 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest' to 'HISTORY_FILE_NAME' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest.REPORT_FILE_NAME' - Renamed element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaTaskHistoryTest.HISTORY_FILE_NAME' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPORT_FILE_NAME'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaTaskHistoryTest.java[BugzillaTaskHistoryTest^REPORT_FILE_NAME" name="HISTORY_FILE_NAME" references="true" setter="false" stamp="1172613261484" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'sample.report'" description="Delete element" element1="sample.report" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1172614073375" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/9/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/9/refactorings.index
new file mode 100644
index 0000000..f1df577
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/2/9/refactorings.index
@@ -0,0 +1,2 @@
+1172613261484 Rename field 'REPORT_FILE_NAME'
+1172614073375 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/4/14/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/4/14/refactorings.history
new file mode 100644
index 0000000..a76046f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/4/14/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla.tests/src/org.eclipse.mylar.bugzilla.tests.headless' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Destination element: 'org.eclipse.mylar.bugzilla.tests/src/org.eclipse.mylar.bugzilla.tests.headless' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaQueryTest.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.bugzilla.tests.headless" element1="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaQueryTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaQueryTest.java	true	true	BugzillaStrictlyHeadlessTest.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1175789917468" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'org.eclipse.mylar.bugzilla.tests.headless.BugzillaStrictlyHeadlessTest'" description="Delete element" element1="/src<org.eclipse.mylar.bugzilla.tests.headless{BugzillaStrictlyHeadlessTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1175796889515" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/4/14/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/4/14/refactorings.index
new file mode 100644
index 0000000..2474162
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/4/14/refactorings.index
@@ -0,0 +1,2 @@
+1175789917468 Copy compilation unit
+1175796889515 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..e6ef7e3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.tests' - Original project: 'org.eclipse.mylyn.bugzilla.tests' - Original element: 'plugin.xml'" description="Delete element" element1="plugin.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1181356703235" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..aa54fc5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1 @@
+1181356703235 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..5b14b7a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/org.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/org.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.TaskListNotificationManagerTest.java'" description="Move compilation unit" destination="/src<org.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.bugzilla.tests{TaskListNotificationManagerTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1222909334700" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/org.eclipse.mylyn.bugzilla.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.deprecated.TaskListStandaloneTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.bugzilla.tests" element1="/src<org.eclipse.mylyn.bugzilla.deprecated{TaskListStandaloneTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222909470137" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.bugzilla.tests.BugzillaRepositoryConnectorTest' to 'BugzillaRepositoryConnectorTestOld'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaRepositoryConnectorTest'
- Renamed element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaRepositoryConnectorTestOld'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaRepositoryConnectorTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaRepositoryConnectorTest.java[BugzillaRepositoryConnectorTest" matchStrategy="1" name="BugzillaRepositoryConnectorTestOld" qualified="false" references="true" similarDeclarations="false" stamp="1222909641356" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaRepositoryConnectorTestOld.java'" description="Delete element" element1="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaRepositoryConnectorTestOld.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222909736802" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.bugzilla.tests.BugzillaTaskListManagerTest' to 'BugzillaTaskListTest'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaTaskListManagerTest'
- Renamed element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaTaskListTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaTaskListManagerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaTaskListManagerTest.java[BugzillaTaskListManagerTest" matchStrategy="1" name="BugzillaTaskListTest" qualified="false" references="true" similarDeclarations="false" stamp="1222911094859" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.bugzilla.tests.BugzillaSearchEngineTest' to 'BugzillaSearchTest'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaSearchEngineTest'
- Renamed element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaSearchTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaSearchEngineTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaSearchEngineTest.java[BugzillaSearchEngineTest" matchStrategy="1" name="BugzillaSearchTest" qualified="false" references="true" similarDeclarations="false" stamp="1222911349440" textual="false" version="1.0"/>
<refactoring comment="Move 16 elements(s) to 'bugzilla'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'bugzilla'
- Original elements:
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaTaskEditor.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaTaskEditorInput.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaStackTraceDuplicateDetector.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaCompareNode.java
 org.eclipse.mylyn.bugzilla.deprecated.AttachmentPartSource.java
 org.eclipse.mylyn.bugzilla.deprecated.NewBugzillaTaskEditor.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaCompareInput.java
 org.eclipse.mylyn.bugzilla.deprecated.NewBugWizardTest.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaTaskListFactory.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaCompareStructureCreator.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaTask.java
 org.eclipse.mylyn.bugzilla.deprecated.TaskListNotificationManagerTest.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaTaskEditorFactory.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaRepositoryQuery.java
 org.eclipse.mylyn.bugzilla.deprecated.DummySearchHitProvider.java
 org.eclipse.mylyn.bugzilla.deprecated.BugzillaAttributeFactory.java" description="Move compilation units" element1="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaTaskEditor.java" element10="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaCompareStructureCreator.java" element11="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaTask.java" element12="/src<org.eclipse.mylyn.bugzilla.deprecated{TaskListNotificationManagerTest.java" element13="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaTaskEditorFactory.java" element14="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaRepositoryQuery.java" element15="/src<org.eclipse.mylyn.bugzilla.deprecated{DummySearchHitProvider.java" element16="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaAttributeFactory.java" element2="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaTaskEditorInput.java" element3="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaStackTraceDuplicateDetector.java" element4="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaCompareNode.java" element5="/src<org.eclipse.mylyn.bugzilla.deprecated{AttachmentPartSource.java" element6="/src<org.eclipse.mylyn.bugzilla.deprecated{NewBugzillaTaskEditor.java" element7="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaCompareInput.java" element8="/src<org.eclipse.mylyn.bugzilla.deprecated{NewBugWizardTest.java" element9="/src<org.eclipse.mylyn.bugzilla.deprecated{BugzillaTaskListFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1222915168051" target="/org.eclipse.mylyn/developer/src-old/bugzilla" units="16" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..e0b45b4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1,7 @@
+1222909334700 Move compilation unit
+1222909470137 Move compilation unit
+1222909641356 Rename type 'BugzillaRepositoryConnectorTest'
+1222909736802 Delete element
+1222911094859 Rename type 'BugzillaTaskListManagerTest'
+1222911349440 Rename type 'BugzillaSearchEngineTest'
+1222915168051 Move compilation units
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/12/49/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/12/49/refactorings.history
new file mode 100644
index 0000000..fab57ee
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/12/49/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.BugzillaRepositoryConnectorTest2.java'" description="Delete element" element1="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaRepositoryConnectorTest2.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1228182055624" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/12/49/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/12/49/refactorings.index
new file mode 100644
index 0000000..ec6c991
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/12/49/refactorings.index
@@ -0,0 +1 @@
+1228182055624 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..ed5f579
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.bugs'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.bugs'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.KeyValueParserTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.tests/src<org.eclipse.mylyn.tasks.tests.bugs" element1="/src<org.eclipse.mylyn.bugzilla.tests{KeyValueParserTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="=org.eclipse.mylyn.tasks.tests/src<org.eclipse.mylyn.tasks.tests	=org.eclipse.mylyn.tasks.tests/src<org.eclipse.mylyn.tasks.tests.bugs" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208553786621" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..baac121
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1 @@
+1208553786621 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..68bfba7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.TaskReportGeneratorTest.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.tests/src<org.eclipse.mylyn.sandbox.tests" element1="/src<org.eclipse.mylyn.bugzilla.tests{TaskReportGeneratorTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209461414549" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.bugzilla.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original elements:
 test-attach-1181009324093.txt
 test-attach-1182233735875.txt" description="Delete elements" element1="test-attach-1182233735875.txt" element2="test-attach-1181009324093.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="2" stamp="1209474186737" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..78e9abd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,2 @@
+1209461414549 Move compilation unit
+1209474186737 Delete elements
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..ba00e1a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'protected void org.eclipse.mylyn.bugzilla.tests.AbstractBugzillaTest.submit(ITask task, TaskData taskData) throws CoreException' to 'protected void submit(ITask task, TaskData taskData, Set<TaskAttribute> changedAttributes) throws CoreException'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests.AbstractBugzillaTest.submit(...)'
- Added parameters:
 Set<TaskAttribute> changedAttributes" default3="null" delegate="false" deprecate="true" description="Change method 'submit'" element1="=org.eclipse.mylyn.jira.core/C:\/apps\/eclipse-3.4\/M7\/head\/plugins\/org.eclipse.equinox.common_3.4.0.v20080421-2006.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.bugzilla.tests{AbstractBugzillaTest.java[AbstractBugzillaTest~submit~QITask;~QTaskData;" kind1="0" name="submit" parameter1="ITask task 0 ITask task false" parameter2="TaskData taskData 1 TaskData taskData false" parameter3="{added} {added} -1 Set<TaskAttribute> changedAttributes false" stamp="1211341606664" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..80ae79a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1 @@
+1211341606664 Change method 'submit'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..6b19a5c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original elements:
 org.eclipse.mylyn.bugzilla.tests.DuplicateDetetionTest.java
 org.eclipse.mylyn.bugzilla.tests.NewBugWizardTest.java
 org.eclipse.mylyn.bugzilla.tests.TaskListStandaloneTest.java
- Update references to refactored element" description="Move compilation units" destination="/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.bugzilla.tests{DuplicateDetetionTest.java" element2="/src<org.eclipse.mylyn.bugzilla.tests{NewBugWizardTest.java" element3="/src<org.eclipse.mylyn.bugzilla.tests{TaskListStandaloneTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213375983338" units="3" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.ui/src/org.eclipse.mylyn.internal.bugzilla.ui.editor'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Destination element: 'org.eclipse.mylyn.bugzilla.ui/src/org.eclipse.mylyn.internal.bugzilla.ui.editor'
- Original element: 'com.eclipse.mylyn.bugzilla.deprecated.KeywordsDialog.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.ui/src<org.eclipse.mylyn.internal.bugzilla.ui.editor" element1="/src<com.eclipse.mylyn.bugzilla.deprecated{KeywordsDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213388189744" units="1" version="1.0"/>
<refactoring comment="Rename package 'com.eclipse.mylyn.bugzilla.deprecated' to 'org.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Renamed element: 'org.eclipse.mylyn.bugzilla.tests/src/org.eclipse.mylyn.bugzilla.deprecated'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename package 'com.eclipse.mylyn.bugzilla.deprecated'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<com.eclipse.mylyn.bugzilla.deprecated" name="org.eclipse.mylyn.bugzilla.deprecated" qualified="false" references="true" stamp="1213394611608" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..86a53dd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,3 @@
+1213375983338 Move compilation units
+1213388189744 Move compilation unit
+1213394611608 Rename package 'com.eclipse.mylyn.bugzilla.deprecated'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/38/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/38/refactorings.history
new file mode 100644
index 0000000..bbc910c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/38/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'org.eclipse.mylyn.bugzilla.deprecated.DuplicateDetetionTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.bugzilla.deprecated{DuplicateDetetionTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221787825482" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/38/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/38/refactorings.index
new file mode 100644
index 0000000..c90061f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/38/refactorings.index
@@ -0,0 +1 @@
+1221787825482 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/39/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/39/refactorings.history
new file mode 100644
index 0000000..350757c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'indexOf' from expression 'testString.indexOf(format)'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Variable name: 'indexOf'
- Destination method: 'org.eclipse.mylyn.bugzilla.tests.BugzillaTaskHyperlinkDetectorTest.testEnd()'
- Variable expression: 'testString.indexOf(format)'
- Replace occurrences of expression with variable" description="Extract local variable 'indexOf'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaTaskHyperlinkDetectorTest.java" name="indexOf" replace="true" selection="3860 26" stamp="1222468560025" version="1.0"/>
<refactoring comment="Extract local variable 'indexOf' from expression 'testString.indexOf(BUG_FORMAT_1_2)'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Variable name: 'indexOf'
- Destination method: 'org.eclipse.mylyn.bugzilla.tests.BugzillaTaskHyperlinkDetectorTest.testMultiLine()'
- Variable expression: 'testString.indexOf(BUG_FORMAT_1_2)'
- Replace occurrences of expression with variable" description="Extract local variable 'indexOf'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaTaskHyperlinkDetectorTest.java" name="indexOf" replace="true" selection="5359 34" stamp="1222468660018" version="1.0"/>
<refactoring comment="Extract local variable 'indexOf' from expression 'testString.indexOf(DUPLICATE)'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Variable name: 'indexOf'
- Destination method: 'org.eclipse.mylyn.bugzilla.tests.BugzillaTaskHyperlinkDetectorTest.testDuplicate()'
- Variable expression: 'testString.indexOf(DUPLICATE)'
- Replace occurrences of expression with variable" description="Extract local variable 'indexOf'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.bugzilla.tests{BugzillaTaskHyperlinkDetectorTest.java" name="indexOf" replace="true" selection="5786 29" stamp="1222468682123" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/39/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/39/refactorings.index
new file mode 100644
index 0000000..33285bd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2008/9/39/refactorings.index
@@ -0,0 +1,3 @@
+1222468560025 Extract local variable 'indexOf'
+1222468660018 Extract local variable 'indexOf'
+1222468682123 Extract local variable 'indexOf'
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2009/5/19/refactorings.history b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2009/5/19/refactorings.history
new file mode 100644
index 0000000..bde9e08
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2009/5/19/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.tests'
- Original project: 'org.eclipse.mylyn.bugzilla.tests'
- Original element: 'BugzillaQueryTest.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1241751630343" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/.refactorings/2009/5/19/refactorings.index b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2009/5/19/refactorings.index
new file mode 100644
index 0000000..5e22776
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.refactorings/2009/5/19/refactorings.index
@@ -0,0 +1 @@
+1241751630343 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2225bfc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=ignore
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..f5987fc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,145 @@
+#Tue Apr 08 17:49:50 PDT 2008
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_LEAK=Ignore
+API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
+ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Ignore
+ILLEGAL_IMPLEMENT=Ignore
+ILLEGAL_INSTANTIATE=Ignore
+ILLEGAL_OVERRIDE=Ignore
+ILLEGAL_REFERENCE=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
diff --git a/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.bugzilla.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.bugzilla.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5b4f990
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Bugzilla Connector Tests
+Bundle-SymbolicName: org.eclipse.mylyn.bugzilla.tests
+Bundle-Version: 0.0.0
+Bundle-Activator: org.eclipse.mylyn.bugzilla.tests.BugzillaTestPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.junit,
+ org.eclipse.jface.text,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.views,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.mylyn.bugzilla.core,
+ org.eclipse.mylyn.bugzilla.ui,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.tasks.tests,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.ui.forms,
+ org.eclipse.mylyn,
+ org.eclipse.search,
+ org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.bugzilla.ide,
+ org.eclipse.mylyn.commons.ui,
+ org.eclipse.compare,
+ org.eclipse.mylyn.commons.core
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Mylyn
+Bundle-ClassPath: bugzilla-test.jar
+Export-Package: org.eclipse.mylyn.bugzilla.tests;x-internal:=true,
+ org.eclipse.mylyn.bugzilla.tests.headless;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.bugzilla.tests/about.html b/org.eclipse.mylyn.bugzilla.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/build.properties b/org.eclipse.mylyn.bugzilla.tests/build.properties
new file mode 100644
index 0000000..7b9e5cc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = bugzilla-test.jar,\
+ META-INF/,\
+ about.html,\
+ testdata/
+jars.compile.order = bugzilla-test.jar
+source.bugzilla-test.jar = src/
+output.bugzilla-test.jar = bin/
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java
new file mode 100644
index 0000000..7ed5c83
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AbstractBugzillaTest.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Nathan Hapke
+ */
+public abstract class AbstractBugzillaTest extends TestCase {
+
+ static final String DEFAULT_KIND = BugzillaCorePlugin.CONNECTOR_KIND;
+
+ protected BugzillaRepositoryConnector connector;
+
+ protected TaskRepositoryManager manager;
+
+ protected TaskRepository repository;
+
+ protected TaskList taskList;
+
+ public AbstractBugzillaTest() {
+ super();
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false);
+ manager = TasksUiPlugin.getRepositoryManager();
+ TaskTestUtil.resetTaskListAndRepositories();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ TaskTestUtil.resetTaskList();
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ protected void init323() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_323_URL);
+ }
+
+ protected void init322() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_322_URL);
+ }
+
+ protected void init32() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_32_URL);
+ }
+
+ protected void init31() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_31_URL);
+ }
+
+ protected void init30() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_30_URL);
+ }
+
+ protected void init222() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ }
+
+ protected void init2201() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_2201_URL);
+ }
+
+ protected void init220() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_220_URL);
+ }
+
+ protected void init218() {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ }
+
+ @SuppressWarnings("deprecation")
+ protected void init(String url) {
+ repository = new TaskRepository(DEFAULT_KIND, url);
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username,
+ credentials.password), false);
+
+ repository.setTimeZoneId("Canada/Eastern");
+ assertNotNull(manager);
+ manager.addRepository(repository);
+
+ taskList = TasksUiPlugin.getTaskList();
+
+ AbstractRepositoryConnector abstractRepositoryClient = manager.getRepositoryConnector(DEFAULT_KIND);
+
+ assertEquals(abstractRepositoryClient.getConnectorKind(), DEFAULT_KIND);
+
+ connector = (BugzillaRepositoryConnector) abstractRepositoryClient;
+ try {
+ BugzillaCorePlugin.getRepositoryConfiguration(repository, false, new NullProgressMonitor());
+ } catch (CoreException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected ITask generateLocalTaskAndDownload(String taskNumber) throws CoreException {
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, taskNumber);
+ // FIXME task.setStale(true);
+ TasksUiPlugin.getTaskList().addTask(task);
+ TasksUiInternal.synchronizeTask(connector, task, true, null);
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ return task;
+ }
+
+ protected TaskDataModel createModel(ITask task) throws CoreException {
+ ITaskDataWorkingCopy taskDataState = getWorkingCopy(task);
+ return new TaskDataModel(repository, task, taskDataState);
+ }
+
+ protected ITaskDataWorkingCopy getWorkingCopy(ITask task) throws CoreException {
+ return TasksUiPlugin.getTaskDataManager().getWorkingCopy(task);
+ }
+
+ protected void submit(TaskDataModel model) {
+ SubmitJob submitJob = TasksUiInternal.getJobFactory().createSubmitTaskJob(connector, model.getTaskRepository(),
+ model.getTask(), model.getTaskData(), model.getChangedOldAttributes());
+ submitJob.schedule();
+ try {
+ submitJob.join();
+ } catch (InterruptedException e) {
+ fail(e.getMessage());
+ }
+ }
+
+ protected RepositoryResponse submit(ITask task, TaskData taskData, Set<TaskAttribute> changedAttributes)
+ throws CoreException {
+ RepositoryResponse response = connector.getTaskDataHandler().postTaskData(repository, taskData,
+ changedAttributes, new NullProgressMonitor());
+ ((AbstractTask) task).setSubmitting(true);
+ return response;
+ }
+
+ protected void synchAndAssertState(Set<ITask> tasks, SynchronizationState state) {
+ for (ITask task : tasks) {
+ TasksUiInternal.synchronizeTask(connector, task, true, null);
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ assertEquals(task.getSynchronizationState(), state);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AllBugzillaTests.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AllBugzillaTests.java
new file mode 100644
index 0000000..ff94a65
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/AllBugzillaTests.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.bugzilla.tests.headless.BugzillaQueryTest;
+import org.eclipse.mylyn.bugzilla.tests.headless.BugzillaTaskHistoryTest;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllBugzillaTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Tests for org.eclipse.mylyn.bugzilla.tests");
+ suite.addTestSuite(RepositoryTaskHandleTest.class);
+ suite.addTestSuite(BugzillaTaskCompletionTest.class);
+ suite.addTestSuite(BugzillaTaskDataHandlerTest.class);
+ suite.addTestSuite(TaskListStandaloneTest.class);
+ suite.addTestSuite(BugzillaTaskListTest.class);
+ suite.addTestSuite(TaskEditorTest.class);
+ suite.addTestSuite(BugzillaQueryTest.class);
+ suite.addTestSuite(RepositoryEditorWizardTest.class);
+ suite.addTestSuite(RepositoryReportFactoryTest.class);
+ suite.addTestSuite(BugzillaConfigurationTest.class);
+ suite.addTestSuite(BugzillaTaskHyperlinkDetectorTest.class);
+ suite.addTestSuite(BugzillaSearchTest.class);
+ suite.addTestSuite(BugzillaRepositoryConnectorTest.class);
+ suite.addTestSuite(EncodingTest.class);
+ suite.addTestSuite(BugzillaProductParserTest.class);
+ suite.addTestSuite(BugzillaSearchDialogTest.class);
+ suite.addTestSuite(BugzillaTaskHistoryTest.class);
+ suite.addTestSuite(BugzillaRepository32Test.class);
+ suite.addTestSuite(BugzillaVersionTest.class);
+ suite.addTestSuite(BugzillaDateTimeTests.class);
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaConfigurationTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaConfigurationTest.java
new file mode 100644
index 0000000..792542a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaConfigurationTest.java
@@ -0,0 +1,260 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClientManager;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.bugzilla.core.SaxConfigurationContentHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.XmlCleaner;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+public class BugzillaConfigurationTest extends TestCase {
+
+ BugzillaClientManager bugzillaClientManager = new BugzillaClientManager();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ private BugzillaClient createClient(String hostUrl, String username, String password, String htAuthUser,
+ String htAuthPass, String encoding) throws CoreException, IOException {
+ TaskRepository taskRepository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, hostUrl);
+
+ AuthenticationCredentials credentials = new AuthenticationCredentials(username, password);
+ taskRepository.setCredentials(AuthenticationType.REPOSITORY, credentials, false);
+
+ AuthenticationCredentials webCredentials = new AuthenticationCredentials(htAuthUser, htAuthPass);
+ taskRepository.setCredentials(AuthenticationType.HTTP, webCredentials, false);
+ taskRepository.setCharacterEncoding(encoding);
+ BugzillaClient client = bugzillaClientManager.getClient(taskRepository, null);
+ client.getRepositoryConfiguration(new NullProgressMonitor());
+ return client;
+ }
+
+ public void test222RDFProductConfig() throws Exception {
+
+ BugzillaClient client = createClient(IBugzillaTestConstants.TEST_BUGZILLA_222_URL, "", "", "", "", "UTF-8");
+ RepositoryConfiguration config = client.getRepositoryConfiguration();
+ assertNotNull(config);
+ assertEquals("2.22.1", config.getInstallVersion().toString());
+ assertEquals(7, config.getStatusValues().size());
+ assertEquals(8, config.getResolutions().size());
+ assertEquals(4, config.getPlatforms().size());
+ assertEquals(6, config.getOSs().size());
+ assertEquals(5, config.getPriorities().size());
+ assertEquals(7, config.getSeverities().size());
+ assertEquals(3, config.getProducts().size());
+ assertEquals(4, config.getOpenStatusValues().size());
+ assertEquals(1, config.getComponents("TestProduct").size());
+ assertEquals(1, config.getVersions("TestProduct").size());
+ assertEquals(0, config.getTargetMilestones("TestProduct").size());
+ }
+
+ public void test2201RDFProductConfig() throws Exception {
+ BugzillaClient client = createClient(IBugzillaTestConstants.TEST_BUGZILLA_2201_URL, "", "", "", "", "UTF-8");
+ RepositoryConfiguration config = client.getRepositoryConfiguration();
+ assertNotNull(config);
+ assertEquals("2.20.1", config.getInstallVersion().toString().toString());
+ assertEquals(7, config.getStatusValues().size());
+ assertEquals(8, config.getResolutions().size());
+ assertEquals(4, config.getPlatforms().size());
+ assertEquals(5, config.getOSs().size());
+ assertEquals(5, config.getPriorities().size());
+ assertEquals(7, config.getSeverities().size());
+ assertEquals(1, config.getProducts().size());
+ assertEquals(4, config.getOpenStatusValues().size());
+ assertEquals(2, config.getComponents("TestProduct").size());
+ assertEquals(1, config.getVersions("TestProduct").size());
+ // assertEquals(1, config.getTargetMilestones("TestProduct").size());
+ }
+
+ public void test220RDFProductConfig() throws Exception {
+ BugzillaClient client = createClient(IBugzillaTestConstants.TEST_BUGZILLA_220_URL, "", "", "", "", "UTF-8");
+ RepositoryConfiguration config = client.getRepositoryConfiguration();
+ assertNotNull(config);
+ assertEquals("2.20.3", config.getInstallVersion().toString());
+ assertEquals(7, config.getStatusValues().size());
+ assertEquals(8, config.getResolutions().size());
+ assertEquals(4, config.getPlatforms().size());
+ assertEquals(5, config.getOSs().size());
+ assertEquals(5, config.getPriorities().size());
+ assertEquals(7, config.getSeverities().size());
+ assertEquals(2, config.getProducts().size());
+ assertEquals(4, config.getOpenStatusValues().size());
+ assertEquals(2, config.getComponents("TestProduct").size());
+ assertEquals(1, config.getVersions("TestProduct").size());
+ // assertEquals(1, config.getTargetMilestones("TestProduct").size());
+ }
+
+ public void test218RDFProductConfig() throws Exception {
+ BugzillaClient client = createClient(IBugzillaTestConstants.TEST_BUGZILLA_218_URL, "", "", "", "", "UTF-8");
+ RepositoryConfiguration config = client.getRepositoryConfiguration();
+ assertNotNull(config);
+ assertEquals("2.18.6", config.getInstallVersion().toString());
+ assertEquals(7, config.getStatusValues().size());
+ assertEquals(8, config.getResolutions().size());
+ assertEquals(8, config.getPlatforms().size());
+ assertEquals(36, config.getOSs().size());
+ assertEquals(5, config.getPriorities().size());
+ assertEquals(7, config.getSeverities().size());
+ assertEquals(1, config.getProducts().size());
+ assertEquals(4, config.getOpenStatusValues().size());
+ assertEquals(1, config.getComponents("TestProduct").size());
+ assertEquals(1, config.getVersions("TestProduct").size());
+ // assertEquals(1, config.getTargetMilestones("TestProduct").size());
+ }
+
+ public void testEclipseRDFProductConfig() throws Exception {
+ BugzillaClient client = createClient(IBugzillaConstants.ECLIPSE_BUGZILLA_URL, "", "", "", "", "UTF-8");
+ RepositoryConfiguration config = client.getRepositoryConfiguration();
+ assertNotNull(config);
+ assertEquals("3.0.4", config.getInstallVersion().toString());
+ assertEquals(7, config.getStatusValues().size());
+ assertEquals(9, config.getResolutions().size());
+ assertEquals(6, config.getPlatforms().size());
+ assertEquals(32, config.getOSs().size());
+ assertEquals(5, config.getPriorities().size());
+ assertEquals(7, config.getSeverities().size());
+ assertTrue(config.getProducts().size() > 50);
+ assertEquals(4, config.getOpenStatusValues().size());
+ assertEquals(14, config.getComponents("Mylyn").size());
+ assertEquals(27, config.getKeywords().size());
+ // assertEquals(10, config.getComponents("Hyades").size());
+ // assertEquals(1, config.getTargetMilestones("TestProduct").size());
+ }
+
+ public void testRepositoryConfigurationCachePersistance() throws Exception {
+ RepositoryConfiguration configuration1 = new RepositoryConfiguration();
+ configuration1.setRepositoryUrl("url1");
+ configuration1.addProduct("Test Product 1");
+ assertEquals(1, configuration1.getProducts().size());
+
+ RepositoryConfiguration configuration2 = new RepositoryConfiguration();
+ configuration1.setRepositoryUrl("url2");
+ configuration2.addProduct("Test Product 2");
+ assertEquals(1, configuration2.getProducts().size());
+
+ BugzillaCorePlugin.addRepositoryConfiguration(configuration1);
+ BugzillaCorePlugin.addRepositoryConfiguration(configuration2);
+ BugzillaCorePlugin.writeRepositoryConfigFile();
+ assertNotNull(BugzillaCorePlugin.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
+ assertNotNull(BugzillaCorePlugin.getRepositoryConfiguration(configuration2.getRepositoryUrl()));
+ BugzillaCorePlugin.removeConfiguration(configuration1);
+ BugzillaCorePlugin.removeConfiguration(configuration2);
+ assertNull(BugzillaCorePlugin.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
+ assertNull(BugzillaCorePlugin.getRepositoryConfiguration(configuration2.getRepositoryUrl()));
+ BugzillaCorePlugin.setCacheFileRead(false);
+ BugzillaCorePlugin.readRepositoryConfigurationFile();
+ assertNotNull(BugzillaCorePlugin.getRepositoryConfiguration(configuration1.getRepositoryUrl()));
+ assertNotNull(BugzillaCorePlugin.getRepositoryConfiguration(configuration2.getRepositoryUrl()));
+ RepositoryConfiguration testLoadedConfig = BugzillaCorePlugin.getRepositoryConfiguration(configuration1.getRepositoryUrl());
+ assertEquals(1, testLoadedConfig.getProducts().size());
+ assertEquals(configuration1.getProducts().get(0), testLoadedConfig.getProducts().get(0));
+ }
+
+// @SuppressWarnings("deprecation")
+// public void testHtmlCleaner() throws IOException, BugzillaException, GeneralSecurityException {
+// StringBuffer incoming = new StringBuffer();
+// incoming.append("<RDF xmlns=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#");
+// incoming.append("xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#");
+// incoming.append("xmlns:bz=\"http://www.bugzilla.org/rdf#\">");
+// incoming.append("<li>");
+// incoming.append("<bz:product
+// incoming.append("</bz:product>");
+// incoming.append("</li>");
+// incoming.append("</RDF>");
+//
+// StringBuffer result = XmlCleaner.clean(new StringReader(incoming.toString()));
+// }
+
+ /**
+ * Can use this to test config data submitted by users. Be sure not to commit user's config file though. The file
+ * included (rdfconfig218.txt) is from mylyn.eclipse.org/bugs218
+ */
+ public void testRepositoryConfigurationFromFile() throws Exception {
+
+ URL entryURL = BugzillaTestPlugin.getDefault().getBundle().getEntry("testdata/configuration/rdfconfig218.txt");
+ assertNotNull(entryURL);
+ URL fileURL = FileLocator.toFileURL(entryURL);
+ assertNotNull(fileURL);
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileURL.getFile())));
+
+ if (true) {
+ File tempFile = File.createTempFile("XmlCleaner-", "tmp");
+ tempFile.deleteOnExit();
+ in = XmlCleaner.clean(in, tempFile);
+ if (tempFile != null) {
+ tempFile.delete();
+ }
+
+ }
+
+ SaxConfigurationContentHandler contentHandler = new SaxConfigurationContentHandler();
+ final XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setContentHandler(contentHandler);
+ reader.setErrorHandler(new ErrorHandler() {
+
+ public void error(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ public void fatalError(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ public void warning(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+ });
+ reader.parse(new InputSource(in));
+
+ RepositoryConfiguration config = contentHandler.getConfiguration();
+ assertNotNull(config);
+
+ assertTrue(config.getProducts().contains(
+ "Test-Long-Named-Product-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
+
+ // Add your additional checking for valid data here if necessary
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaDateTimeTests.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaDateTimeTests.java
new file mode 100644
index 0000000..29e3b48
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaDateTimeTests.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaDateTimeTests extends AbstractBugzillaTest {
+
+ public void testTimezones218() throws Exception {
+ // could not test BugzillaAttribute.DEADLINE because not supported in 2.18.6
+ TimeZone defaultTimeZone = TimeZone.getDefault();
+ try {
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
+ init218();
+ ITask task = generateLocalTaskAndDownload("10");
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+
+ TaskAttribute attribute = taskData.getRoot().getAttribute(BugzillaAttribute.CREATION_TS.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2006-05-08 15:04 PST", attribute.getValue());
+ Date date = taskData.getAttributeMapper().getDateValue(attribute);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ assertEquals(2006, calendar.get(Calendar.YEAR));
+ assertEquals(4, calendar.get(Calendar.MONTH));
+ assertEquals(8, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(23, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(4, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+
+ attribute = taskData.getRoot().getAttribute(BugzillaAttribute.DELTA_TS.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2006-06-02 14:45:37 PST", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2006, calendar.get(Calendar.YEAR));
+ assertEquals(5, calendar.get(Calendar.MONTH));
+ assertEquals(2, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(22, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(45, calendar.get(Calendar.MINUTE));
+ assertEquals(37, calendar.get(Calendar.SECOND));
+ TaskAttribute attachment = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).get(0);
+ assertNotNull(attachment);
+
+ attribute = attachment.getAttribute(BugzillaAttribute.DATE.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2006-05-26 19:38 PST", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2006, calendar.get(Calendar.YEAR));
+ assertEquals(4, calendar.get(Calendar.MONTH));
+ assertEquals(27, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(3, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(38, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+
+ TaskAttribute comment = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_COMMENT).get(0);
+ assertNotNull(comment);
+ attribute = comment.getAttribute(BugzillaAttribute.BUG_WHEN.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2006-05-08 15:05 PST", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2006, calendar.get(Calendar.YEAR));
+ assertEquals(4, calendar.get(Calendar.MONTH));
+ assertEquals(8, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(23, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(5, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+ } finally {
+ TimeZone.setDefault(defaultTimeZone);
+ }
+ }
+
+ public void testTimezones323() throws Exception {
+ // could not test BugzillaAttribute.DEADLINE and CUSTOM_FIELDS because not supported in 3.2.3
+ TimeZone defaultTimeZone = TimeZone.getDefault();
+ try {
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
+
+ init323();
+ ITask task = generateLocalTaskAndDownload("2");
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ TaskAttribute attribute = taskData.getRoot().getAttribute(BugzillaAttribute.CREATION_TS.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2009-02-12 13:40 PST", attribute.getValue());
+ Date date = taskData.getAttributeMapper().getDateValue(attribute);
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ assertEquals(2009, calendar.get(Calendar.YEAR));
+ assertEquals(1, calendar.get(Calendar.MONTH));
+ assertEquals(12, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(21, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(40, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+
+ attribute = taskData.getRoot().getAttribute(BugzillaAttribute.DELTA_TS.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+// String val = attribute.getValue();
+ assertEquals("2009-06-03 23:31:42 PST", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2009, calendar.get(Calendar.YEAR));
+ assertEquals(5, calendar.get(Calendar.MONTH));
+ assertEquals(4, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(7, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(31, calendar.get(Calendar.MINUTE));
+ assertEquals(42, calendar.get(Calendar.SECOND));
+ TaskAttribute attachment = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).get(0);
+ assertNotNull(attachment);
+
+ attribute = attachment.getAttribute(BugzillaAttribute.DATE.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2009-05-07 17:07:56 PST", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2009, calendar.get(Calendar.YEAR));
+ assertEquals(4, calendar.get(Calendar.MONTH));
+ assertEquals(8, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(1, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(7, calendar.get(Calendar.MINUTE));
+ assertEquals(56, calendar.get(Calendar.SECOND));
+
+ TaskAttribute comment = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_COMMENT).get(0);
+ assertNotNull(comment);
+ attribute = comment.getAttribute(BugzillaAttribute.BUG_WHEN.getKey());
+ attribute.setValue(attribute.getValue() + " PST");
+ assertEquals("2009-02-17 17:29:35 PST", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2009, calendar.get(Calendar.YEAR));
+ assertEquals(1, calendar.get(Calendar.MONTH));
+ assertEquals(18, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(1, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(29, calendar.get(Calendar.MINUTE));
+ assertEquals(35, calendar.get(Calendar.SECOND));
+
+ attribute = taskData.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey());
+ assertEquals("2009-06-24", attribute.getValue());
+ date = taskData.getAttributeMapper().getDateValue(attribute);
+ calendar.setTime(date);
+ assertEquals(2009, calendar.get(Calendar.YEAR));
+ assertEquals(5, calendar.get(Calendar.MONTH));
+ assertEquals(24, calendar.get(Calendar.DAY_OF_MONTH));
+ assertEquals(0, calendar.get(Calendar.HOUR_OF_DAY));
+ assertEquals(0, calendar.get(Calendar.MINUTE));
+ assertEquals(0, calendar.get(Calendar.SECOND));
+ } finally {
+ TimeZone.setDefault(defaultTimeZone);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaProductParserTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaProductParserTest.java
new file mode 100644
index 0000000..590b893
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaProductParserTest.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Tests for parsing Product Page for new Bugzilla reports
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaProductParserTest extends TestCase {
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public BugzillaProductParserTest(String arg0) {
+ super(arg0);
+ }
+
+ private TaskRepository setRepository(String url) {
+ repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, url);
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setAuthenticationCredentials(credentials.username, credentials.password);
+ return repository;
+ }
+
+ public void test222Products() throws Exception {
+ setRepository(IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ List<String> productList = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, null).getProducts();
+ Iterator<String> itr = productList.iterator();
+ assertTrue(itr.hasNext());
+ assertEquals("Read Only Test Cases", itr.next());
+ }
+
+ public void test2201Products() throws Exception {
+ setRepository(IBugzillaTestConstants.TEST_BUGZILLA_2201_URL);
+ List<String> productList = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, null).getProducts();
+ Iterator<String> itr = productList.iterator();
+ assertTrue(itr.hasNext());
+ assertEquals("TestProduct", "TestProduct", itr.next());
+
+ }
+
+ public void test220Products() throws Exception {
+ setRepository(IBugzillaTestConstants.TEST_BUGZILLA_220_URL);
+ List<String> productList = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, null).getProducts();
+ assertEquals(2, productList.size());
+ assertTrue(productList.contains("TestProduct"));
+ assertTrue(productList.contains("Widget"));
+
+ }
+
+ public void test218Products() throws Exception {
+ setRepository(IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ List<String> productList = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, null).getProducts();
+ assertEquals(1, productList.size());
+ assertTrue(productList.contains("TestProduct"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepository32Test.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepository32Test.java
new file mode 100644
index 0000000..468c922
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepository32Test.java
@@ -0,0 +1,532 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskJob;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+public class BugzillaRepository32Test extends AbstractBugzillaTest {
+
+ public void testBugUpdate() throws Exception {
+ init323();
+ String taskNumber = "1";
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ String tokenValue = task.getAttribute("token");
+ assertNotNull(tokenValue);
+ TaskData taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ assertEquals(tokenValue, taskData.getRoot().getAttribute("token").getValue());
+
+ //remove the token (i.e. unpatched Bugzilla 3.2.2)
+ taskData.getRoot().removeAttribute("token");
+
+ TaskAttribute attrPriority = taskData.getRoot().getAttribute("priority");
+ boolean p1 = false;
+ if (attrPriority.getValue().equals("P1")) {
+ p1 = true;
+ attrPriority.setValue("P2");
+ } else {
+ attrPriority.setValue("P1");
+ }
+
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(attrPriority);
+ submit(task, taskData, changed);
+
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ assertEquals(!p1, task.getPriority().equals("P1"));
+
+ }
+
+ public void testSecondSubmit() throws Exception {
+ init322();
+ String taskNumber = "1";
+ assertTrue(CoreUtil.TEST_MODE);
+ RepositoryQuery query = new RepositoryQuery("bugzilla", "blah");
+ query.setRepositoryUrl(IBugzillaTestConstants.TEST_BUGZILLA_322_URL);
+ query.setUrl("?short_desc_type=allwordssubstr&short_desc=&product=TestProduct&long_desc_type=allwordssubstr&long_desc=&order=Importance&ctype=rdf");
+ TasksUiInternal.getTaskList().addQuery(query);
+ TasksUiInternal.synchronizeQuery(connector, query, null, true);
+
+ ITask task = TasksUiInternal.getTask(IBugzillaTestConstants.TEST_BUGZILLA_322_URL, taskNumber, "");
+ assertNotNull(task);
+ ITaskDataWorkingCopy taskDataState = TasksUi.getTaskDataManager().getWorkingCopy(task);//TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskDataState);
+ TaskDataModel model = new TaskDataModel(repository, task, taskDataState);
+
+ TaskData taskData = model.getTaskData();
+ //remove the token (i.e. unpatched Bugzilla 3.2.2)
+ //taskData.getRoot().removeAttribute("token");
+
+ TaskAttribute attrPriority = taskData.getRoot().getAttribute("priority");
+ boolean p1 = false;
+ if (attrPriority.getValue().equals("P1")) {
+ p1 = true;
+ attrPriority.setValue("P2");
+ } else {
+ attrPriority.setValue("P1");
+ }
+
+ model.attributeChanged(attrPriority);
+ model.save(new NullProgressMonitor());
+ submit(task, model);
+
+ TasksUiInternal.synchronizeRepository(repository, false);
+
+ task = TasksUiPlugin.getTaskList().getTask(IBugzillaTestConstants.TEST_BUGZILLA_322_URL, taskNumber);
+ assertNotNull(task);
+ assertEquals(!p1, task.getPriority().equals("P1"));
+
+ // Attempt 2
+
+ taskDataState = TasksUi.getTaskDataManager().getWorkingCopy(task);//TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskDataState);
+ model = new TaskDataModel(repository, task, taskDataState);
+
+ taskData = model.getTaskData();
+ //remove the token (i.e. unpatched Bugzilla 3.2.2)
+ //taskData.getRoot().removeAttribute("token");
+
+ attrPriority = taskData.getRoot().getAttribute("priority");
+ p1 = false;
+ if (attrPriority.getValue().equals("P1")) {
+ p1 = true;
+ attrPriority.setValue("P2");
+ } else {
+ attrPriority.setValue("P1");
+ }
+
+ model.attributeChanged(attrPriority);
+ model.save(new NullProgressMonitor());
+ connector.getClientManager().repositoryRemoved(repository);
+ submit(task, model);
+
+ TasksUiInternal.synchronizeRepository(repository, false);
+
+ task = TasksUiPlugin.getTaskList().getTask(IBugzillaTestConstants.TEST_BUGZILLA_322_URL, taskNumber);
+ assertNotNull(task);
+ assertEquals(!p1, task.getPriority().equals("P1"));
+
+ }
+
+ @Override
+ protected RepositoryResponse submit(ITask task, TaskData taskData, Set<TaskAttribute> changedAttributes)
+ throws CoreException {
+
+ RepositoryResponse response = connector.getTaskDataHandler().postTaskData(repository, taskData,
+ changedAttributes, new NullProgressMonitor());
+ ((AbstractTask) task).setSubmitting(true);
+ return response;
+ }
+
+ protected void submit(ITask task, TaskDataModel model) throws Exception {
+
+ SubmitJob submitJob = TasksUiInternal.getJobFactory().createSubmitTaskJob(connector, model.getTaskRepository(),
+ task, model.getTaskData(), model.getChangedOldAttributes());
+ Method runMethod = SubmitTaskJob.class.getDeclaredMethod("run", IProgressMonitor.class);
+ runMethod.setAccessible(true);
+ runMethod.invoke(submitJob, new NullProgressMonitor());
+
+ }
+
+ @SuppressWarnings("null")
+ public void testFlags() throws Exception {
+ init32();
+ String taskNumber = "10";
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskData taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ Collection<TaskAttribute> a = taskData.getRoot().getAttributes().values();
+ TaskAttribute flagA = null;
+ TaskAttribute flagB = null;
+ TaskAttribute flagC = null;
+ TaskAttribute flagD = null;
+ TaskAttribute stateA = null;
+ TaskAttribute stateB = null;
+ TaskAttribute stateC = null;
+ TaskAttribute stateD = null;
+ for (TaskAttribute taskAttribute : a) {
+ if (taskAttribute.getId().startsWith("task.common.kind.flag")) {
+ TaskAttribute state = taskAttribute.getAttribute("state");
+ if (state.getMetaData().getLabel().equals("FLAG_A")) {
+ flagA = taskAttribute;
+ stateA = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_B")) {
+ flagB = taskAttribute;
+ stateB = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_C")) {
+ flagC = taskAttribute;
+ stateC = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_D")) {
+ flagD = taskAttribute;
+ stateD = state;
+ }
+ }
+ }
+ assertNotNull(flagA);
+ assertNotNull(flagB);
+ assertNotNull(flagC);
+ assertNotNull(flagD);
+ assertNotNull(stateA);
+ assertNotNull(stateB);
+ assertNotNull(stateC);
+ assertNotNull(stateD);
+ assertEquals("flagA is set(wrong precondidion)", " ", stateA.getValue());
+ assertEquals("flagB is set(wrong precondidion)", " ", stateB.getValue());
+ assertEquals("flagC is set(wrong precondidion)", " ", stateC.getValue());
+ assertEquals("flagD is set(wrong precondidion)", " ", stateD.getValue());
+ assertEquals("task.common.kind.flag_type1", flagA.getId());
+ assertEquals("task.common.kind.flag_type2", flagB.getId());
+ assertEquals("task.common.kind.flag_type3", flagC.getId());
+ assertEquals("task.common.kind.flag_type4", flagD.getId());
+ Map<String, String> optionA = stateA.getOptions();
+ Map<String, String> optionB = stateB.getOptions();
+ Map<String, String> optionC = stateC.getOptions();
+ Map<String, String> optionD = stateD.getOptions();
+ assertEquals(true, optionA.containsKey(""));
+ assertEquals(false, optionA.containsKey("?"));
+ assertEquals(true, optionA.containsKey("+"));
+ assertEquals(true, optionA.containsKey("-"));
+ assertEquals(true, optionB.containsKey(""));
+ assertEquals(true, optionB.containsKey("?"));
+ assertEquals(true, optionB.containsKey("+"));
+ assertEquals(true, optionB.containsKey("-"));
+ assertEquals(true, optionC.containsKey(""));
+ assertEquals(true, optionC.containsKey("?"));
+ assertEquals(true, optionC.containsKey("+"));
+ assertEquals(true, optionC.containsKey("-"));
+ assertEquals(true, optionD.containsKey(""));
+ assertEquals(true, optionD.containsKey("?"));
+ assertEquals(true, optionD.containsKey("+"));
+ assertEquals(true, optionD.containsKey("-"));
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ stateA.setValue("+");
+ stateB.setValue("?");
+ stateC.setValue("?");
+ stateD.setValue("?");
+ TaskAttribute requesteeD = flagD.getAttribute("requestee");
+ requesteeD.setValue("rob.elves at eclipse.org");
+ changed.add(flagA);
+ changed.add(flagB);
+ changed.add(flagC);
+ changed.add(flagD);
+
+ submit(task, taskData, changed);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ a = taskData.getRoot().getAttributes().values();
+ flagA = null;
+ flagB = null;
+ flagC = null;
+ TaskAttribute flagC2 = null;
+ flagD = null;
+ stateA = null;
+ stateB = null;
+ stateC = null;
+ TaskAttribute stateC2 = null;
+ stateD = null;
+ for (TaskAttribute taskAttribute : a) {
+ if (taskAttribute.getId().startsWith("task.common.kind.flag")) {
+ TaskAttribute state = taskAttribute.getAttribute("state");
+ if (state.getMetaData().getLabel().equals("FLAG_A")) {
+ flagA = taskAttribute;
+ stateA = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_B")) {
+ flagB = taskAttribute;
+ stateB = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_C")) {
+ if (flagC == null) {
+ flagC = taskAttribute;
+ stateC = state;
+ } else {
+ flagC2 = taskAttribute;
+ stateC2 = state;
+ }
+ } else if (state.getMetaData().getLabel().equals("FLAG_D")) {
+ flagD = taskAttribute;
+ stateD = state;
+ }
+ }
+ }
+ assertNotNull(flagA);
+ assertNotNull(flagB);
+ assertNotNull(flagC);
+ assertNotNull(flagC2);
+ assertNotNull(flagD);
+ assertNotNull(stateA);
+ assertNotNull(stateB);
+ assertNotNull(stateC);
+ assertNotNull(stateC2);
+ assertNotNull(stateD);
+ assertEquals("+", stateA.getValue());
+ assertEquals("?", stateB.getValue());
+ assertEquals("?", stateC.getValue());
+ assertEquals(" ", stateC2.getValue());
+ assertEquals("?", stateD.getValue());
+ requesteeD = flagD.getAttribute("requestee");
+ assertNotNull(requesteeD);
+ assertEquals("rob.elves at eclipse.org", requesteeD.getValue());
+ stateA.setValue(" ");
+ stateB.setValue(" ");
+ stateC.setValue(" ");
+ stateD.setValue(" ");
+ changed.add(flagA);
+ changed.add(flagB);
+ changed.add(flagC);
+ changed.add(flagD);
+
+ submit(task, taskData, changed);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ a = taskData.getRoot().getAttributes().values();
+ flagA = null;
+ flagB = null;
+ flagC = null;
+ flagC2 = null;
+ flagD = null;
+ stateA = null;
+ stateB = null;
+ stateC = null;
+ stateC2 = null;
+ stateD = null;
+ for (TaskAttribute taskAttribute : a) {
+ if (taskAttribute.getId().startsWith("task.common.kind.flag")) {
+ TaskAttribute state = taskAttribute.getAttribute("state");
+ if (state.getMetaData().getLabel().equals("FLAG_A")) {
+ flagA = taskAttribute;
+ stateA = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_B")) {
+ flagB = taskAttribute;
+ stateB = state;
+ } else if (state.getMetaData().getLabel().equals("FLAG_C")) {
+ if (flagC == null) {
+ flagC = taskAttribute;
+ stateC = state;
+ } else {
+ flagC2 = taskAttribute;
+ stateC2 = state;
+ }
+ } else if (state.getMetaData().getLabel().equals("FLAG_D")) {
+ flagD = taskAttribute;
+ stateD = state;
+ }
+ }
+ }
+ assertNotNull(flagA);
+ assertNotNull(flagB);
+ assertNotNull(flagC);
+ assertNull(flagC2);
+ assertNotNull(flagD);
+ assertNotNull(stateA);
+ assertNotNull(stateB);
+ assertNotNull(stateC);
+ assertNull(stateC2);
+ assertNotNull(stateD);
+ assertEquals(" ", stateA.getValue());
+ assertEquals(" ", stateB.getValue());
+ assertEquals(" ", stateC.getValue());
+ assertEquals(" ", stateD.getValue());
+ requesteeD = flagD.getAttribute("requestee");
+ assertNotNull(requesteeD);
+ assertEquals("", requesteeD.getValue());
+ }
+
+ public void testCustomAttributes() throws Exception {
+ init32();
+ String taskNumber = "1";
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskData taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ TaskMapper mapper = new TaskMapper(taskData);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ assertEquals(taskNumber, taskData.getTaskId());
+
+ SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ assertEquals(format1.parse("2008-10-04 15:01"), mapper.getCreationDate());
+
+ AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ assertNotNull("credentials are null", credentials);
+ assertNotNull("Repositor User not set", credentials.getUserName());
+ assertNotNull("no password for Repository", credentials.getPassword());
+
+ TaskAttribute colorAttribute = mapper.getTaskData().getRoot().getAttribute("cf_colors");
+ assertNotNull("TaskAttribute Color did not exists", colorAttribute);
+ List<String> theColors = colorAttribute.getValues();
+ assertNotNull(theColors);
+ assertFalse("no colors set", theColors.isEmpty());
+
+ boolean red = false;
+ boolean green = false;
+ boolean yellow = false;
+ boolean blue = false;
+
+ for (Object element : theColors) {
+ String string = (String) element;
+
+ if (!red && string.compareTo("Red") == 0) {
+ red = true;
+ } else if (!green && string.compareTo("Green") == 0) {
+ green = true;
+ } else if (!yellow && string.compareTo("Yellow") == 0) {
+ yellow = true;
+ } else if (!blue && string.compareTo("Blue") == 0) {
+ blue = true;
+ }
+ }
+ changeCollorAndSubmit(task, taskData, colorAttribute, red, green, yellow, blue);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ TasksUiInternal.synchronizeTask(connector, task, true, null);
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ assertNotNull(task);
+ taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+ colorAttribute = mapper.getTaskData().getRoot().getAttribute("cf_colors");
+ assertNotNull("TaskAttribute Color did not exists", colorAttribute);
+ theColors = colorAttribute.getValues();
+ assertNotNull(theColors);
+ assertFalse("no colors set", theColors.isEmpty());
+ boolean red_new = false;
+ boolean green_new = false;
+ boolean yellow_new = false;
+ boolean blue_new = false;
+
+ for (Object element : theColors) {
+ String string = (String) element;
+
+ if (!red_new && string.compareTo("Red") == 0) {
+ red_new = true;
+ } else if (!green_new && string.compareTo("Green") == 0) {
+ green_new = true;
+ } else if (!yellow_new && string.compareTo("Yellow") == 0) {
+ yellow_new = true;
+ } else if (!blue_new && string.compareTo("Blue") == 0) {
+ blue_new = true;
+ }
+ }
+ assertTrue("wrong change",
+ (!red && green && !yellow && !blue && red_new && green_new && !yellow_new && !blue_new)
+ || (red && green && !yellow && !blue && !red_new && green_new && !yellow_new && !blue_new));
+ changeCollorAndSubmit(task, taskData, colorAttribute, red_new, green_new, yellow_new, blue_new);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+ }
+
+ private void changeCollorAndSubmit(ITask task, TaskData taskData, TaskAttribute colorAttribute, boolean red,
+ boolean green, boolean yellow, boolean blue) throws CoreException {
+ if (!red && green && !yellow && !blue) {
+ List<String> newValue = new ArrayList<String>(2);
+ newValue.add("Red");
+ newValue.add("Green");
+ colorAttribute.setValues(newValue);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(colorAttribute);
+ // Submit changes
+ submit(task, taskData, changed);
+ } else if (red && green && !yellow && !blue) {
+ List<String> newValue = new ArrayList<String>(2);
+ newValue.add("Green");
+ colorAttribute.setValues(newValue);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(colorAttribute);
+ // Submit changes
+ submit(task, taskData, changed);
+ }
+ }
+
+ public void testCustomAttributesNewTask() throws Exception {
+ final TaskMapping taskMappingInit = new TaskMapping() {
+ @Override
+ public String getSummary() {
+ return "The Summary";
+ }
+
+ @Override
+ public String getDescription() {
+ return "The Description";
+ }
+
+ @Override
+ public String getProduct() {
+ return "TestProduct";
+ }
+ };
+
+ TaskRepository taskRepository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_32_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(taskRepository);
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ TaskAttributeMapper mapper = taskDataHandler.getAttributeMapper(taskRepository);
+ TaskData taskData = new TaskData(mapper, taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(),
+ "");
+ assertTrue(taskDataHandler.initializeTaskData(taskRepository, taskData, taskMappingInit, null));
+ TaskAttribute productAttribute = taskData.getRoot().getAttribute(BugzillaAttribute.PRODUCT.getKey());
+ assertNotNull(productAttribute);
+ assertEquals("TestProduct", productAttribute.getValue());
+ TaskAttribute colorAttribute = taskData.getRoot().getAttribute("cf_colors");
+ assertNotNull(colorAttribute);
+ TaskAttribute planningAttribute = taskData.getRoot().getAttribute("cf_planning");
+ assertNotNull(planningAttribute);
+ TaskAttribute shortstoryAttribute = taskData.getRoot().getAttribute("cf_shortstory");
+ assertNull(shortstoryAttribute);
+ TaskAttribute longstoryAttribute = taskData.getRoot().getAttribute("cf_longstory");
+ assertNull(longstoryAttribute);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java
new file mode 100644
index 0000000..ea96f45
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaRepositoryConnectorTest.java
@@ -0,0 +1,1307 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaStatus;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskAttachment;
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizationSession;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResult;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskOperation;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * @author Rob Elves
+ * @author Frank Becker
+ */
+public class BugzillaRepositoryConnectorTest extends AbstractBugzillaTest {
+
+ public void testSingleRetrievalFailure() throws CoreException {
+ init32();
+ ITask task = generateLocalTaskAndDownload("9999");
+ assertTrue(((AbstractTask) task).getStatus().getMessage().contains(IBugzillaConstants.ERROR_MSG_INVALID_BUG_ID));
+ }
+
+// public void testMultiRetrievalFailure() throws CoreException {
+// init32();
+// ITask task1 = TasksUi.getRepositoryModel().createTask(repository, "1");
+// ITask taskX = TasksUi.getRepositoryModel().createTask(repository, "9999");
+// ITask task2 = TasksUi.getRepositoryModel().createTask(repository, "2");
+// // FIXME task.setStale(true);
+// TasksUiPlugin.getTaskList().addTask(task1);
+// TasksUiPlugin.getTaskList().addTask(taskX);
+// TasksUiPlugin.getTaskList().addTask(task2);
+// Set<ITask> tasks = new HashSet<ITask>();
+// tasks.add(task1);
+// tasks.add(taskX);
+// tasks.add(task2);
+// TasksUiInternal.synchronizeTasks(connector, tasks, true, null);
+//
+// //TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+// assertNotNull(TasksUiPlugin.getTaskDataManager().getTaskData(task1));
+// assertNotNull(TasksUiPlugin.getTaskDataManager().getTaskData(task2));
+// assertNull(TasksUiPlugin.getTaskDataManager().getTaskData(taskX));
+// assertNull(((AbstractTask) task1).getStatus());
+// assertNull(((AbstractTask) task2).getStatus());
+// assertEquals(IBugzillaConstants.ERROR_MSG_NO_DATA_RETRIEVED, ((AbstractTask) taskX).getStatus().getMessage());
+// }
+
+ public void testBugWithoutDescription218() throws Exception {
+ init218();
+ doBugWithoutDescription("57");
+ }
+
+ public void testBugWithoutDescription222() throws Exception {
+ init222();
+ doBugWithoutDescription("391");
+ }
+
+ public void testBugWithoutDescription32() throws Exception {
+ init32();
+ doBugWithoutDescription("293");
+ }
+
+ private void doBugWithoutDescription(String taskNumber) throws CoreException {
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ int numComment = taskData.getAttributeMapper().getAttributesByType(taskData, TaskAttribute.TYPE_COMMENT).size();
+
+ String newCommentText = "new Comment for Bug Without an Description " + (new Date()).toString();
+ TaskAttribute comment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ comment.setValue(newCommentText);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(comment);
+
+ // Submit changes
+ submit(task, taskData, changed);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ int numCommentNew = taskData.getAttributeMapper()
+ .getAttributesByType(taskData, TaskAttribute.TYPE_COMMENT)
+ .size();
+ assertEquals(numComment + 1, numCommentNew);
+ }
+
+ public void testAttachmentToken323() throws Exception {
+ init323();
+ ITask task = generateLocalTaskAndDownload("2");
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ TaskAttribute attachment = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).get(0);
+ assertNotNull(attachment);
+ TaskAttribute obsolete = attachment.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ assertNotNull(obsolete);
+ TaskAttribute token = attachment.getAttribute(BugzillaAttribute.TOKEN.getKey());
+ assertNotNull(token);
+ attachment.removeAttribute(BugzillaAttribute.TOKEN.getKey());
+ token = attachment.getAttribute(BugzillaAttribute.TOKEN.getKey());
+ assertNull(token);
+ boolean oldObsoleteOn = obsolete.getValue().equals("1");
+ if (oldObsoleteOn) {
+ obsolete.setValue("0"); //$NON-NLS-1$
+ } else {
+ obsolete.setValue("1"); //$NON-NLS-1$
+ }
+ try {
+ ((BugzillaTaskDataHandler) connector.getTaskDataHandler()).postUpdateAttachment(repository, attachment,
+ "update", new NullProgressMonitor());
+ fail("CoreException expected but not reached");
+ } catch (CoreException e) {
+ // TODO Auto-generated catch block
+ IStatus status = e.getStatus();
+ assertTrue(status instanceof BugzillaStatus);
+ assertEquals(IBugzillaConstants.REPOSITORY_STATUS_SUSPICIOUS_ACTION, status.getCode());
+ }
+
+ task = generateLocalTaskAndDownload("2");
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ attachment = taskData.getAttributeMapper().getAttributesByType(taskData, TaskAttribute.TYPE_ATTACHMENT).get(0);
+ assertNotNull(attachment);
+ obsolete = attachment.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ assertNotNull(obsolete);
+ token = attachment.getAttribute(BugzillaAttribute.TOKEN.getKey());
+ assertNotNull(token);
+ oldObsoleteOn = obsolete.getValue().equals("1");
+ if (oldObsoleteOn) {
+ obsolete.setValue("0"); //$NON-NLS-1$
+ } else {
+ obsolete.setValue("1"); //$NON-NLS-1$
+ }
+ try {
+ ((BugzillaTaskDataHandler) connector.getTaskDataHandler()).postUpdateAttachment(repository, attachment,
+ "update", new NullProgressMonitor());
+ } catch (CoreException e) {
+ fail("CoreException expected reached");
+ }
+
+ }
+
+ public void testObsoleteAttachment222() throws Exception {
+ init222();
+ doObsoleteAttachment("81");
+ }
+
+ public void testObsoleteAttachment32() throws Exception {
+ init32();
+ doObsoleteAttachment("2");
+ }
+
+ private void doObsoleteAttachment(String taskNumber) throws CoreException {
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ TaskAttribute attachment = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).get(0);
+ assertNotNull(attachment);
+ TaskAttribute obsolete = attachment.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ assertNotNull(obsolete);
+ boolean oldObsoleteOn = obsolete.getValue().equals("1");
+ if (oldObsoleteOn) {
+ obsolete.setValue("0"); //$NON-NLS-1$
+ } else {
+ obsolete.setValue("1"); //$NON-NLS-1$
+ }
+ ((BugzillaTaskDataHandler) connector.getTaskDataHandler()).postUpdateAttachment(repository, attachment,
+ "update", new NullProgressMonitor()); //$NON-NLS-1$
+
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ attachment = taskData.getAttributeMapper().getAttributesByType(taskData, TaskAttribute.TYPE_ATTACHMENT).get(0);
+ assertNotNull(attachment);
+ obsolete = attachment.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ assertNotNull(obsolete);
+ boolean newObsoleteOn = obsolete.getValue().equals("1");
+ assertEquals(true, oldObsoleteOn != newObsoleteOn);
+ }
+
+ //testReassign Bugs
+ //Version BugNum assigned reporter
+ //2.22 92 user at mylar.eclipse.org tests at mylar.eclipse.org
+ //3.0 5 tests at mylar.eclipse.org tests2 at mylar.eclipse.org
+ //3.1 1 rob.elves at eclipse.org tests at mylar.eclipse.org
+
+ public void testReassign222() throws CoreException {
+ init222();
+ String taskNumber = "92";
+ doReassignOld(taskNumber, "user at mylar.eclipse.org");
+ }
+
+ public void testReassign30() throws CoreException {
+ init30();
+ String taskNumber = "5";
+ doReassignOld(taskNumber, "tests at mylyn.eclipse.org");
+ }
+
+ public void testReassign31() throws CoreException {
+ init31();
+ String taskNumber = "1";
+
+ // Get the task
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ TaskMapper mapper = new TaskMapper(taskData);
+
+ if (mapper.getOwner().equals("rob.elves at eclipse.org")) {
+ assertEquals("rob.elves at eclipse.org", mapper.getOwner());
+ reassingToUser31(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals("tests2 at mylyn.eclipse.org", mapper.getOwner());
+
+ reassignToDefault31(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals("rob.elves at eclipse.org", mapper.getOwner());
+ } else if (mapper.getOwner().equals("tests2 at mylyn.eclipse.org")) {
+ assertEquals("tests2 at mylyn.eclipse.org", mapper.getOwner());
+ reassignToDefault31(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals("rob.elves at eclipse.org", mapper.getOwner());
+
+ reassingToUser31(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals("tests2 at mylyn.eclipse.org", mapper.getOwner());
+ } else {
+ fail("Bug with unexpected user assigned");
+ }
+ }
+
+ private void reassignToDefault31(ITask task, TaskData taskData) throws CoreException {
+ // Modify it (reassignbycomponent)
+ String newCommentText = "BugzillaRepositoryClientTest.testReassign31(): reassignbycomponent "
+ + (new Date()).toString();
+ TaskAttribute comment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ comment.setValue(newCommentText);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(comment);
+
+ TaskAttribute assignee = taskData.getRoot().getAttribute(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ assignee.setValue("1");
+ changed.add(assignee);
+ // Submit changes
+ submit(task, taskData, changed);
+ }
+
+ private void reassingToUser31(ITask task, TaskData taskData) throws CoreException {
+ // Modify it (reassign to tests2 at mylyn.eclipse.org)
+ String newCommentText = "BugzillaRepositoryClientTest.testReassign31(): reassign " + (new Date()).toString();
+ TaskAttribute comment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ comment.setValue(newCommentText);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(comment);
+
+ TaskAttribute assignedAttribute = taskData.getRoot().getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey());
+ assignedAttribute.setValue("tests2 at mylyn.eclipse.org");
+ changed.add(assignedAttribute);
+
+ // Submit changes
+ submit(task, taskData, changed);
+ }
+
+ private void doReassignOld(String taskNumber, String defaultAssignee) throws CoreException {
+ // Get the task
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ TaskMapper mapper = new TaskMapper(taskData);
+
+ if (mapper.getOwner().equals(defaultAssignee)) {
+ assertEquals(defaultAssignee, mapper.getOwner());
+ reassingToUserOld(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals("tests2 at mylyn.eclipse.org", mapper.getOwner());
+
+ reassignToDefaultOld(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals(defaultAssignee, mapper.getOwner());
+ } else if (mapper.getOwner().equals("tests2 at mylyn.eclipse.org")) {
+ assertEquals("tests2 at mylyn.eclipse.org", mapper.getOwner());
+ reassignToDefaultOld(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals(defaultAssignee, mapper.getOwner());
+
+ reassingToUserOld(task, taskData);
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ mapper = new TaskMapper(taskData);
+ assertEquals("tests2 at mylyn.eclipse.org", mapper.getOwner());
+ } else {
+ fail("Bug with unexpected user assigned");
+ }
+ }
+
+ private void reassignToDefaultOld(ITask task, TaskData taskData) throws CoreException {
+ // Modify it (reassignbycomponent)
+ String newCommentText = "BugzillaRepositoryClientTest.testReassignOld(): reassignbycomponent "
+ + (new Date()).toString();
+ TaskAttribute comment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ comment.setValue(newCommentText);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(comment);
+ TaskAttribute selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.reassignbycomponent.toString(),
+ BugzillaOperation.reassignbycomponent.getLabel());
+ changed.add(selectedOperationAttribute);
+
+ // Submit changes
+ submit(task, taskData, null);
+ }
+
+ private void reassingToUserOld(ITask task, TaskData taskData) throws CoreException {
+ // Modify it (reassign to tests2 at mylyn.eclipse.org)
+ String newCommentText = "BugzillaRepositoryClientTest.testReassignOld(): reassign " + (new Date()).toString();
+ TaskAttribute comment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ comment.setValue(newCommentText);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(comment);
+ TaskAttribute selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.reassign.toString(),
+ BugzillaOperation.reassign.getLabel());
+ TaskAttribute assignedAttribute = taskData.getRoot().getAttribute("reassignInput");
+ assignedAttribute.setValue("tests2 at mylyn.eclipse.org");
+ changed.add(selectedOperationAttribute);
+ changed.add(assignedAttribute);
+
+ // Submit changes
+ submit(task, taskData, null);
+ }
+
+ /*
+ * Test for the following State transformation
+ * NEW -> ASSIGNED -> RESOLVED DUPLICATE -> VERIFIED -> CLOSED -> REOPENED -> RESOLVED FIXED
+ *
+ */
+
+ private void doStdWorkflow(String DupBugID) throws Exception {
+ final TaskMapping taskMappingInit = new TaskMapping() {
+
+ @Override
+ public String getProduct() {
+ return "TestProduct";
+ }
+ };
+ final TaskMapping taskMappingSelect = new TaskMapping() {
+ @Override
+ public String getComponent() {
+ return "TestComponent";
+ }
+
+ @Override
+ public String getSummary() {
+ return "test the std workflow";
+ }
+
+ @Override
+ public String getDescription() {
+ return "The Description of the std workflow task";
+ }
+
+ };
+
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ final TaskData[] taskDataNew = new TaskData[1];
+ // create Task
+ taskDataNew[0] = TasksUiInternal.createTaskData(repository, taskMappingInit, taskMappingSelect, null);
+ ITask taskNew = TasksUiUtil.createOutgoingNewTask(taskDataNew[0].getConnectorKind(),
+ taskDataNew[0].getRepositoryUrl());
+
+ //set Color to a legal value if exists
+ TaskAttribute colorAttribute = taskDataNew[0].getRoot().getAttribute("cf_colors");
+ if (colorAttribute != null) {
+ colorAttribute.setValue("Green");
+ }
+
+ ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(taskNew, taskDataNew[0]);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ workingCopy.save(changed, null);
+ RepositoryResponse response = submit(taskNew, taskDataNew[0], changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_CREATED.toString(), response.getReposonseKind().toString());
+ String taskId = response.getTaskId();
+
+ // change Status from NEW -> ASSIGNED
+ ITask task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ TaskAttribute statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("NEW", statusAttribute.getValue());
+ TaskAttribute selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.accept.toString(),
+ BugzillaOperation.accept.getLabel());
+ model.attributeChanged(selectedOperationAttribute);
+ changed.clear();
+ changed.add(selectedOperationAttribute);
+ workingCopy.save(changed, null);
+ response = submit(taskNew, taskData, changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
+
+ // change Status from ASSIGNED -> RESOLVED DUPLICATE
+ task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("ASSIGNED", statusAttribute.getValue());
+ selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.duplicate.toString(),
+ BugzillaOperation.duplicate.getLabel());
+ TaskAttribute duplicateAttribute = taskData.getRoot().getAttribute("dup_id");
+ duplicateAttribute.setValue(DupBugID);
+ model.attributeChanged(selectedOperationAttribute);
+ model.attributeChanged(duplicateAttribute);
+ changed.clear();
+ changed.add(selectedOperationAttribute);
+ changed.add(duplicateAttribute);
+ workingCopy.save(changed, null);
+ response = submit(taskNew, taskData, changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
+
+ // change Status from RESOLVED DUPLICATE -> VERIFIED
+ task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("RESOLVED", statusAttribute.getValue());
+ TaskAttribute resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ assertEquals("DUPLICATE", resolution.getValue());
+ selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.verify.toString(),
+ BugzillaOperation.verify.getLabel());
+ model.attributeChanged(selectedOperationAttribute);
+ changed.clear();
+ changed.add(selectedOperationAttribute);
+ workingCopy.save(changed, null);
+ response = submit(taskNew, taskData, changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
+
+ // change Status from VERIFIED -> CLOSE
+ task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("VERIFIED", statusAttribute.getValue());
+ selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.close.toString(),
+ BugzillaOperation.close.getLabel());
+ model.attributeChanged(selectedOperationAttribute);
+ changed.clear();
+ changed.add(selectedOperationAttribute);
+ workingCopy.save(changed, null);
+ response = submit(taskNew, taskData, changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
+
+ // change Status from CLOSE -> REOPENED
+ task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("CLOSED", statusAttribute.getValue());
+ selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.reopen.toString(),
+ BugzillaOperation.reopen.getLabel());
+ model.attributeChanged(selectedOperationAttribute);
+ changed.clear();
+ changed.add(selectedOperationAttribute);
+ workingCopy.save(changed, null);
+ response = submit(taskNew, taskData, changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
+
+ // change Status from REOPENED -> RESOLVED FIXED
+ task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("REOPENED", statusAttribute.getValue());
+ selectedOperationAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(selectedOperationAttribute, BugzillaOperation.resolve.toString(),
+ BugzillaOperation.resolve.getLabel());
+ resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ resolution.setValue("FIXED");
+ model.attributeChanged(selectedOperationAttribute);
+ model.attributeChanged(resolution);
+ changed.clear();
+ changed.add(selectedOperationAttribute);
+ changed.add(resolution);
+ workingCopy.save(changed, null);
+ response = submit(taskNew, taskData, changed);
+ assertNotNull(response);
+ assertEquals(ResponseKind.TASK_UPDATED.toString(), response.getReposonseKind().toString());
+
+ // test last state
+ task = generateLocalTaskAndDownload(taskId);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ statusAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ assertEquals("RESOLVED", statusAttribute.getValue());
+ resolution = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ assertEquals("FIXED", resolution.getValue());
+ }
+
+ public void testStdWorkflow222() throws Exception {
+ init222();
+ doStdWorkflow("101");
+ }
+
+ public void testStdWorkflow32() throws Exception {
+ init32();
+ doStdWorkflow("3");
+ }
+
+ public void testAttachToExistingReport() throws Exception {
+ init222();
+ String taskNumber = "33";
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ assertEquals(taskNumber, taskData.getTaskId());
+ int numAttached = taskData.getAttributeMapper()
+ .getAttributesByType(taskData, TaskAttribute.TYPE_ATTACHMENT)
+ .size();
+ String fileName = "test-attach-" + System.currentTimeMillis() + ".txt";
+
+ assertNotNull(repository.getCredentials(AuthenticationType.REPOSITORY));
+ assertNotNull(repository.getCredentials(AuthenticationType.REPOSITORY).getUserName());
+ assertNotNull(repository.getCredentials(AuthenticationType.REPOSITORY).getPassword());
+ BugzillaClient client = connector.getClientManager().getClient(repository, new NullProgressMonitor());
+
+ TaskAttribute attrAttachment = taskData.getAttributeMapper().createTaskAttachment(taskData);
+ TaskAttachmentMapper attachmentMapper = TaskAttachmentMapper.createFrom(attrAttachment);
+
+ /* Initialize a local attachment */
+ attachmentMapper.setDescription("Test attachment " + new Date());
+ attachmentMapper.setContentType("text/plain");
+ attachmentMapper.setPatch(false);
+ attachmentMapper.setComment("Automated JUnit attachment test");
+ attachmentMapper.applyTo(attrAttachment);
+
+ /* Test attempt to upload a non-existent file */
+ String filePath = "/this/is/not/a/real-file";
+
+ FileTaskAttachmentSource attachment = new FileTaskAttachmentSource(new File(filePath));
+ attachment.setContentType(FileTaskAttachmentSource.APPLICATION_OCTET_STREAM);
+ attachment.setDescription(AttachmentUtil.CONTEXT_DESCRIPTION);
+ attachment.setName("mylyn-context.zip");
+
+ try {
+ client.postAttachment(taskNumber, attachmentMapper.getComment(), attachment, attrAttachment,
+ new NullProgressMonitor());
+ fail("never reach this!");
+ } catch (Exception e) {
+ assertEquals("A repository error has occurred.", e.getMessage());
+ }
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+ task = TasksUi.getRepositoryModel().createTask(repository, taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ assertEquals(numAttached, taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).size());
+
+ /* Test attempt to upload an empty file */
+ File attachFile = new File(fileName);
+ attachFile.createNewFile();
+ BufferedWriter write = new BufferedWriter(new FileWriter(attachFile));
+
+ attachment = new FileTaskAttachmentSource(attachFile);
+ attachment.setContentType(FileTaskAttachmentSource.APPLICATION_OCTET_STREAM);
+ attachment.setDescription(AttachmentUtil.CONTEXT_DESCRIPTION);
+ attachment.setName("mylyn-context.zip");
+
+ try {
+ client.postAttachment(taskNumber, attachmentMapper.getComment(), attachment, attrAttachment,
+ new NullProgressMonitor());
+ fail("never reach this!");
+ } catch (Exception e) {
+ assertEquals("A repository error has occurred.", e.getMessage());
+ }
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ assertEquals(numAttached, taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).size());
+
+ /* Test uploading a proper file */
+ write.write("test file");
+ write.close();
+ try {
+ client.postAttachment(taskNumber, attachmentMapper.getComment(), attachment, attrAttachment,
+ new NullProgressMonitor());
+ } catch (Exception e) {
+ fail("never reach this!");
+ }
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+ task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ model = createModel(task);
+ taskData = model.getTaskData();
+ assertNotNull(taskData);
+ assertEquals(numAttached + 1, taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT).size());
+ // use assertion to track clean-up
+ assertTrue(attachFile.delete());
+ }
+
+ public void testDataRetrieval() throws CoreException, ParseException {
+ init30();
+ TaskData data = connector.getTaskData(repository, "2", new NullProgressMonitor());
+ assertNotNull(data);
+ ITaskMapping mapper = connector.getTaskMapping(data);
+ assertEquals("2", data.getTaskId());
+ assertEquals("New bug submit", mapper.getSummary());
+ assertEquals("Test new bug submission", mapper.getDescription());
+ assertEquals(PriorityLevel.P2, mapper.getPriorityLevel());
+ assertEquals("TestComponent", mapper.getComponent());
+ assertEquals("nhapke at cs.ubc.ca", mapper.getOwner());
+ assertEquals("TestProduct", mapper.getProduct());
+ assertEquals("PC", mapper.getTaskData()
+ .getRoot()
+ .getMappedAttribute(BugzillaAttribute.REP_PLATFORM.getKey())
+ .getValue());
+ assertEquals("Windows", mapper.getTaskData()
+ .getRoot()
+ .getMappedAttribute(BugzillaAttribute.OP_SYS.getKey())
+ .getValue());
+ assertEquals("ASSIGNED", mapper.getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.BUG_STATUS.getKey()).getValue());
+ SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+ SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ assertEquals(format1.parse("2007-03-20 16:37"), mapper.getCreationDate());
+ assertEquals(format2.parse("2008-09-24 13:33:02"), mapper.getModificationDate());
+
+ assertEquals(IBugzillaTestConstants.TEST_BUGZILLA_30_URL, mapper.getTaskUrl());
+ assertEquals(BugzillaCorePlugin.CONNECTOR_KIND, mapper.getTaskKind());
+ assertEquals("2", mapper.getTaskKey());
+
+ // test comments
+ List<TaskAttribute> comments = data.getAttributeMapper().getAttributesByType(data, TaskAttribute.TYPE_COMMENT);
+ assertEquals(12, comments.size());
+ TaskCommentMapper commentMap = TaskCommentMapper.createFrom(comments.get(0));
+ assertEquals("Rob Elves", commentMap.getAuthor().getName());
+ assertEquals("Created an attachment (id=1)\ntest\n\ntest attachments", commentMap.getText());
+ commentMap = TaskCommentMapper.createFrom(comments.get(10));
+ assertEquals("Tests", commentMap.getAuthor().getName());
+ assertEquals("test", commentMap.getText());
+ }
+
+ public void testMidAirCollision() throws Exception {
+ init30();
+ String taskNumber = "5";
+
+ // Get the task
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+
+ ITaskDataWorkingCopy workingCopy = TasksUiPlugin.getTaskDataManager().getWorkingCopy(task);
+ TaskData taskData = workingCopy.getLocalData();
+ assertNotNull(taskData);
+
+ String newCommentText = "BugzillaRepositoryClientTest.testMidAirCollision(): test " + (new Date()).toString();
+ TaskAttribute attrNewComment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ attrNewComment.setValue(newCommentText);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(attrNewComment);
+ TaskAttribute attrDeltaTs = taskData.getRoot().getMappedAttribute(TaskAttribute.DATE_MODIFICATION);
+ attrDeltaTs.setValue("2007-01-01 00:00:00");
+ changed.add(attrDeltaTs);
+
+ workingCopy.save(changed, new NullProgressMonitor());
+
+ try {
+ // Submit changes
+ submit(task, taskData, changed);
+ fail("Mid-air collision expected");
+ } catch (CoreException e) {
+ assertTrue(e.getStatus().getMessage().indexOf("Mid-air collision occurred while submitting") != -1);
+ return;
+ }
+ fail("Mid-air collision expected");
+ }
+
+ public void testAuthenticationCredentials() throws Exception {
+ init218();
+ ITask task = generateLocalTaskAndDownload("3");
+ assertNotNull(task);
+ TasksUiPlugin.getTaskActivityManager().activateTask(task);
+ File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ sourceContextFile.createNewFile();
+ sourceContextFile.deleteOnExit();
+ AuthenticationCredentials oldCreds = repository.getCredentials(AuthenticationType.REPOSITORY);
+ AuthenticationCredentials wrongCreds = new AuthenticationCredentials("wrong", "wrong");
+ repository.setCredentials(AuthenticationType.REPOSITORY, wrongCreds, false);
+ TasksUiPlugin.getRepositoryManager().notifyRepositorySettingsChanged(repository);
+ TaskData taskData = TasksUiPlugin.getTaskDataManager().getTaskData(task);
+ TaskAttributeMapper mapper = taskData.getAttributeMapper();
+ TaskAttribute attribute = mapper.createTaskAttachment(taskData);
+ try {
+ AttachmentUtil.postContext(connector, repository, task, "test", attribute, new NullProgressMonitor());
+ } catch (CoreException e) {
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ assertTrue(e.getStatus().getMessage().indexOf("invalid username or password") != -1);
+ return;
+ } finally {
+ repository.setCredentials(AuthenticationType.REPOSITORY, oldCreds, false);
+ TasksUiPlugin.getRepositoryManager().notifyRepositorySettingsChanged(repository);
+ }
+ fail("Should have failed due to invalid userid and password.");
+ }
+
+ public void testSynchronize() throws CoreException, Exception {
+ init222();
+
+ // Get the task
+ ITask task = generateLocalTaskAndDownload("3");
+ TasksUi.getTaskDataManager().discardEdits(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+
+// int numComments = taskData.getAttributeMapper()
+// .getAttributesByType(taskData, TaskAttribute.TYPE_ATTACHMENT)
+// .size();
+
+ // Modify it
+ String newCommentText = "BugzillaRepositoryClientTest.testSynchronize(): " + (new Date()).toString();
+ TaskAttribute attrNewComment = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ attrNewComment.setValue(newCommentText);
+ model.attributeChanged(attrNewComment);
+ model.save(new NullProgressMonitor());
+ assertEquals(SynchronizationState.OUTGOING, task.getSynchronizationState());
+ submit(model);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+// TaskData taskData2 = workingCopy.getRepositoryData();
+// TaskMapper taskData2Mapper = new TaskMapper(taskData2);
+// TaskMapper taskData1Mapper = new TaskMapper(taskData);
+// assertFalse(taskData2Mapper.getModificationDate().equals(taskData1Mapper.getModificationDate()));
+// // Still not read
+// assertFalse(taskData2.getLastModified().equals(task.getLastReadTimeStamp()));
+// TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+// assertEquals(taskData2.getLastModified(), task.getLastReadTimeStamp());
+// assertTrue(taskData2.getComments().size() > numComments);
+//
+// // Has no outgoing changes or conflicts yet needs synch
+// // because task doesn't have bug report (new query hit)
+// // Result: retrieved with no incoming status
+// // task.setSyncState(SynchronizationState.SYNCHRONIZED);
+// TasksUiPlugin.getTaskDataStorageManager().remove(task.getRepositoryUrl(), task.getTaskId());
+// TasksUiInternal.synchronizeTask(connector, task, false, null);
+// assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+// RepositoryTaskData bugReport2 = null;
+// bugReport2 = TasksUiPlugin.getTaskDataStorageManager()
+// .getNewTaskData(task.getRepositoryUrl(), task.getTaskId());
+// assertNotNull(bugReport2);
+// assertEquals(task.getTaskId(), bugReport2.getTaskId());
+//
+// assertEquals(newCommentText, bugReport2.getComments().get(numComments).getText());
+// // TODO: Test that comment was appended
+// // ArrayList<Comment> comments = task.getTaskData().getComments();
+// // assertNotNull(comments);
+// // assertTrue(comments.size() > 0);
+// // Comment lastComment = comments.get(comments.size() - 1);
+// // assertEquals(newCommentText, lastComment.getText());
+
+ }
+
+ public void testMissingHits() throws Exception {
+ init323();
+ String queryString = "http://mylyn.eclipse.org/bugs323/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&product=TestProduct&long_desc_type=substring&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&deadlinefrom=&deadlineto=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=&emailassigned_to2=1&emailreporter2=1&emailcc2=1&emailtype2=substring&email2=&bugidtype=include&bug_id=&chfieldfrom=&chfieldto=Now&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=";
+ RepositoryQuery query = new RepositoryQuery(BugzillaCorePlugin.CONNECTOR_KIND, "test");
+ query.setRepositoryUrl(repository.getRepositoryUrl());
+ query.setUrl(queryString);
+ TasksUiPlugin.getTaskList().addQuery(query);
+
+ TasksUiInternal.synchronizeQuery(connector, query, null, true);
+
+ for (ITask task : query.getChildren()) {
+ assertTrue(task.getSynchronizationState() == SynchronizationState.INCOMING_NEW);
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ assertTrue(task.getSynchronizationState() == SynchronizationState.SYNCHRONIZED);
+ }
+
+ repository.setSynchronizationTimeStamp("1970-01-01");
+ TasksUiInternal.synchronizeQuery(connector, query, null, true);
+ for (ITask task : query.getChildren()) {
+ assertTrue(task.getSynchronizationState() == SynchronizationState.SYNCHRONIZED);
+ }
+ }
+
+ ITask fruitTask;
+
+ TaskData fruitTaskData;
+
+ private void setFruitValueTo(String newValue) throws CoreException {
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ TaskAttribute cf_fruit = fruitTaskData.getRoot().getAttribute("cf_fruit");
+ cf_fruit.setValue(newValue);
+ assertEquals(newValue, fruitTaskData.getRoot().getAttribute("cf_fruit").getValue());
+ changed.add(cf_fruit);
+ submit(fruitTask, fruitTaskData, changed);
+ TasksUiInternal.synchronizeTask(connector, fruitTask, true, null);
+ fruitTaskData = TasksUiPlugin.getTaskDataManager().getTaskData(repository, fruitTask.getTaskId());
+ assertEquals(newValue, fruitTaskData.getRoot().getAttribute("cf_fruit").getValue());
+
+ }
+
+ public void testCustomFields() throws Exception {
+ init(IBugzillaTestConstants.TEST_BUGZILLA_303_URL);
+
+ String taskNumber = "1";
+
+ // Get the task
+ fruitTask = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(fruitTask);
+ TaskDataModel model = createModel(fruitTask);
+ fruitTaskData = model.getTaskData();
+ assertNotNull(fruitTaskData);
+
+ if (fruitTaskData.getRoot().getAttribute("cf_fruit").getValue().equals("---")) {
+ setFruitValueTo("apple");
+ setFruitValueTo("orange");
+ setFruitValueTo("---");
+ } else if (fruitTaskData.getRoot().getAttribute("cf_fruit").getValue().equals("apple")) {
+ setFruitValueTo("orange");
+ setFruitValueTo("apple");
+ setFruitValueTo("---");
+ } else if (fruitTaskData.getRoot().getAttribute("cf_fruit").getValue().equals("orange")) {
+ setFruitValueTo("apple");
+ setFruitValueTo("orange");
+ setFruitValueTo("---");
+ }
+ if (fruitTask != null) {
+ fruitTask = null;
+ }
+ if (fruitTaskData != null) {
+ fruitTaskData = null;
+ }
+ }
+
+ public void testAnonymousRepositoryAccess() throws Exception {
+ init218();
+ assertNotNull(repository);
+ AuthenticationCredentials anonymousCreds = new AuthenticationCredentials("", "");
+ repository.setCredentials(AuthenticationType.REPOSITORY, anonymousCreds, false);
+ TasksUiPlugin.getRepositoryManager().notifyRepositorySettingsChanged(repository);
+ // test anonymous task retrieval
+ ITask task = this.generateLocalTaskAndDownload("2");
+ assertNotNull(task);
+
+ // // test anonymous query (note that this demonstrates query via
+ // eclipse search (ui)
+
+ String queryUrl = "http://mylyn.eclipse.org/bugs218/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=search-match-test&product=TestProduct&long_desc_type=substring&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&deadlinefrom=&deadlineto=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=&emailassigned_to2=1&emailreporter2=1&emailcc2=1&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=";
+ IRepositoryQuery bugzillaQuery = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+ bugzillaQuery.setUrl(queryUrl);
+ SearchHitCollector collector = new SearchHitCollector(taskList, repository, bugzillaQuery);
+ RepositorySearchResult result = (RepositorySearchResult) collector.getSearchResult();
+
+ collector.run(new NullProgressMonitor());
+ assertEquals(2, result.getElements().length);
+
+ for (Object element : result.getElements()) {
+ assertEquals(true, element instanceof ITask);
+ ITask hit = (ITask) element;
+ assertTrue(hit.getSummary().contains("search-match-test"));
+ }
+
+ // test anonymous update of configuration
+ RepositoryConfiguration config = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, null);
+ assertNotNull(config);
+ assertTrue(config.getComponents().size() > 0);
+ }
+
+ public void testUpdate() throws Exception {
+ init222();
+ String taskNumber = "3";
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ TasksUi.getTaskDataManager().discardEdits(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+
+ assertEquals("search-match-test 2", task.getSummary());
+ assertEquals("TestProduct", task.getAttribute(TaskAttribute.PRODUCT));
+ assertEquals("P1", task.getPriority());
+ assertEquals("blocker", task.getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey()));
+ assertEquals("nhapke at cs.ubc.ca", task.getOwner());
+ assertFalse(task.isCompleted());
+ assertEquals("http://mylyn.eclipse.org/bugs222/show_bug.cgi?id=3", task.getUrl());
+ }
+
+ /**
+ * Ensure obsoletes and patches are marked as such by the parser.
+ */
+ public void testAttachmentAttributes() throws Exception {
+ init222();
+ String taskNumber = "19";
+ ITask task = generateLocalTaskAndDownload(taskNumber);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+
+ boolean isPatch[] = { false, true, false, false, false, false, false, true, false, false, false };
+ boolean isObsolete[] = { false, true, false, true, false, false, false, false, false, false, false };
+
+ int index = 0;
+ for (TaskAttribute attribute : taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT)) {
+ assertTrue(validateAttachmentAttributes(model, attribute, isPatch[index], isObsolete[index]));
+ index++;
+ }
+ }
+
+ private boolean validateAttachmentAttributes(TaskDataModel model, TaskAttribute taskAttribute, boolean isPatch,
+ boolean isObsolete) {
+ TaskAttachment taskAttachment = new TaskAttachment(model.getTaskRepository(), model.getTask(), taskAttribute);
+ model.getTaskData().getAttributeMapper().updateTaskAttachment(taskAttachment, taskAttribute);
+ return (taskAttachment.isPatch() == isPatch) && (taskAttachment.isDeprecated() == isObsolete);
+ }
+
+ public void testTimeTracker222() throws Exception {
+ init222();
+ timeTracker(15, true);
+ }
+
+ public void testTimeTracker218() throws Exception {
+ init218();
+ timeTracker(20, false);
+ }
+
+ /**
+ * @param enableDeadline
+ * bugzilla 218 doesn't support deadlines
+ */
+ protected void timeTracker(int taskid, boolean enableDeadline) throws Exception {
+ ITask task = generateLocalTaskAndDownload("" + taskid);
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+ assertEquals(taskid + "", taskData.getTaskId());
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+
+ Set<ITask> tasks = new HashSet<ITask>();
+ tasks.add(task);
+
+ synchAndAssertState(tasks, SynchronizationState.SYNCHRONIZED);
+
+ float estimatedTime, remainingTime, actualTime, addTime;
+ String deadline = null;
+
+ estimatedTime = Float.parseFloat(taskData.getRoot()
+ .getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey())
+ .getValue());
+ remainingTime = Float.parseFloat(taskData.getRoot()
+ .getAttribute(BugzillaAttribute.REMAINING_TIME.getKey())
+ .getValue());
+ actualTime = Float.parseFloat(taskData.getRoot()
+ .getAttribute(BugzillaAttribute.ACTUAL_TIME.getKey())
+ .getValue());
+
+ if (enableDeadline) {
+ deadline = taskData.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey()).getValue();
+ }
+
+ estimatedTime += 2;
+ remainingTime += 1.5;
+ addTime = 0.75f;
+ if (enableDeadline) {
+ deadline = generateNewDay();
+ }
+
+ taskData.getRoot().getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()).setValue("" + estimatedTime);
+ taskData.getRoot().getAttribute(BugzillaAttribute.REMAINING_TIME.getKey()).setValue("" + remainingTime);
+ TaskAttribute workTime = taskData.getRoot().getAttribute(BugzillaAttribute.WORK_TIME.getKey());
+ if (workTime == null) {
+ BugzillaTaskDataHandler.createAttribute(taskData.getRoot(), BugzillaAttribute.WORK_TIME);
+ workTime = taskData.getRoot().getAttribute(BugzillaAttribute.WORK_TIME.getKey());
+ }
+ workTime.setValue("" + addTime);
+ if (enableDeadline) {
+ taskData.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey()).setValue("" + deadline);
+ }
+
+ taskData.getRoot().getAttribute(BugzillaAttribute.NEW_COMMENT.getKey()).setValue(
+ "New Estimate: " + estimatedTime + "\nNew Remaining: " + remainingTime + "\nAdd: " + addTime);
+ Set<TaskAttribute> changed = new HashSet<TaskAttribute>();
+ changed.add(taskData.getRoot().getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()));
+ changed.add(taskData.getRoot().getAttribute(BugzillaAttribute.REMAINING_TIME.getKey()));
+ changed.add(taskData.getRoot().getAttribute(BugzillaAttribute.WORK_TIME.getKey()));
+ if (enableDeadline) {
+ changed.add(taskData.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey()));
+ }
+ changed.add(taskData.getRoot().getAttribute(BugzillaAttribute.NEW_COMMENT.getKey()));
+
+ submit(task, taskData, changed);
+
+ synchAndAssertState(tasks, SynchronizationState.SYNCHRONIZED);
+ model = createModel(task);
+ taskData = model.getTaskData();
+
+ assertEquals(estimatedTime, Float.parseFloat(taskData.getRoot().getAttribute(
+ BugzillaAttribute.ESTIMATED_TIME.getKey()).getValue()));
+ assertEquals(remainingTime, Float.parseFloat(taskData.getRoot().getAttribute(
+ BugzillaAttribute.REMAINING_TIME.getKey()).getValue()));
+ assertEquals(actualTime + addTime, Float.parseFloat(taskData.getRoot().getAttribute(
+ BugzillaAttribute.ACTUAL_TIME.getKey()).getValue()));
+ if (enableDeadline) {
+ assertEquals(deadline, taskData.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey()).getValue());
+ }
+
+ }
+
+ private String generateNewDay() {
+ int year = 2006;
+ int month = (int) (Math.random() * 12 + 1);
+ int day = (int) (Math.random() * 28 + 1);
+ return "" + year + "-" + ((month <= 9) ? "0" : "") + month + "-" + ((day <= 9) ? "0" : "") + day;
+ }
+
+ public void testSynchChangedReports() throws Exception {
+
+ init222();
+ String taskID4 = "4";
+ ITask task4 = generateLocalTaskAndDownload(taskID4);
+ assertNotNull(task4);
+ TaskDataModel model4 = createModel(task4);
+ TaskData taskData4 = model4.getTaskData();
+ assertNotNull(taskData4);
+ assertEquals(taskID4, taskData4.getTaskId());
+ assertEquals(SynchronizationState.SYNCHRONIZED, task4.getSynchronizationState());
+
+ String taskID5 = "5";
+ ITask task5 = generateLocalTaskAndDownload(taskID5);
+ assertNotNull(task5);
+ TaskDataModel model5 = createModel(task5);
+ TaskData taskData5 = model5.getTaskData();
+ assertNotNull(taskData5);
+ assertEquals(taskID5, taskData5.getTaskId());
+ assertEquals(SynchronizationState.SYNCHRONIZED, task5.getSynchronizationState());
+
+ Set<ITask> tasks = new HashSet<ITask>();
+ tasks.add(task4);
+ tasks.add(task5);
+
+ // Precondition for test passing is that task5's modification data is
+ // AFTER
+ // task4's
+ DateFormat timeDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date lastModTime4 = null;
+ Date lastModTime5 = null;
+ String mostRecentTimeStamp4 = taskData4.getRoot().getAttribute(BugzillaAttribute.DELTA_TS.getKey()).getValue();
+ String mostRecentTimeStamp = taskData5.getRoot().getAttribute(BugzillaAttribute.DELTA_TS.getKey()).getValue();
+ lastModTime4 = timeDateFormat.parse(mostRecentTimeStamp4);
+ lastModTime5 = timeDateFormat.parse(mostRecentTimeStamp);
+ assertTrue("Precondition not mached", lastModTime5.after(lastModTime4));
+
+ repository.setSynchronizationTimeStamp(mostRecentTimeStamp);
+
+ SynchronizationSession event = new SynchronizationSession();
+ event.setTasks(tasks);
+ event.setNeedsPerformQueries(true);
+ event.setTaskRepository(repository);
+ event.setFullSynchronization(true);
+ connector.preSynchronization(event, null);
+ assertTrue(event.needsPerformQueries());
+ // Always last known changed returned
+ assertFalse(event.getStaleTasks().contains(task4));
+ assertTrue(event.getStaleTasks().contains(task5));
+
+ String priority4 = null;
+ if (task4.getPriority().equals("P1")) {
+ priority4 = "P2";
+ taskData4.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).setValue(priority4);
+ } else {
+ priority4 = "P1";
+ taskData4.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).setValue(priority4);
+ }
+
+ String priority5 = null;
+ if (task5.getPriority().equals("P1")) {
+ priority5 = "P2";
+ taskData5.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).setValue(priority5);
+ } else {
+ priority5 = "P1";
+ taskData5.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).setValue(priority5);
+ }
+ Set<TaskAttribute> changed4 = new HashSet<TaskAttribute>();
+ Set<TaskAttribute> changed5 = new HashSet<TaskAttribute>();
+
+ changed4.add(taskData4.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()));
+ changed5.add(taskData5.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()));
+
+ submit(task4, taskData4, changed4);
+ submit(task5, taskData5, changed5);
+
+ event = new SynchronizationSession();
+ event.setTasks(tasks);
+ event.setNeedsPerformQueries(true);
+ event.setTaskRepository(repository);
+ event.setFullSynchronization(true);
+ connector.preSynchronization(event, null);
+ assertTrue(event.getStaleTasks().contains(task4));
+ assertTrue(event.getStaleTasks().contains(task5));
+
+ TasksUiInternal.synchronizeTasks(connector, tasks, true, null);
+
+ for (ITask task : tasks) {
+ if (task.getTaskId() == "4") {
+ assertEquals(priority4, taskData4.getRoot()
+ .getAttribute(BugzillaAttribute.PRIORITY.getKey())
+ .getValue());
+ }
+ if (task.getTaskId() == "5") {
+ assertEquals(priority5, taskData5.getRoot()
+ .getAttribute(BugzillaAttribute.PRIORITY.getKey())
+ .getValue());
+ }
+ }
+ }
+
+ public void testContextAttachFailure() throws Exception {
+ init218();
+ ITask task = this.generateLocalTaskAndDownload("3");
+ assertNotNull(task);
+ TaskDataModel model = createModel(task);
+ TaskData taskData = model.getTaskData();
+ assertNotNull(taskData);
+// assertNotNull(TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(task.getRepositoryUrl(),
+// task.getTaskId()));
+ TasksUi.getTaskActivityManager().activateTask(task);
+ File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ sourceContextFile.createNewFile();
+ sourceContextFile.deleteOnExit();
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("wrong", "wrong"), false);
+ try {
+ FileTaskAttachmentSource attachment = new FileTaskAttachmentSource(sourceContextFile);
+ attachment.setContentType(FileTaskAttachmentSource.APPLICATION_OCTET_STREAM);
+
+ attachment.setDescription(AttachmentUtil.CONTEXT_DESCRIPTION);
+ attachment.setName("mylyn-context.zip");
+
+ TaskAttribute attrAttachment = taskData.getAttributeMapper().createTaskAttachment(taskData);
+ TaskAttachmentMapper attachmentMapper = TaskAttachmentMapper.createFrom(attrAttachment);
+
+ /* Initialize a local attachment */
+ attachmentMapper.setDescription("Test attachment " + new Date());
+ attachmentMapper.setContentType(AttachmentUtil.CONTEXT_DESCRIPTION);
+ attachmentMapper.setPatch(false);
+ attachmentMapper.setComment("Context attachment failure Test");
+ attachmentMapper.applyTo(attrAttachment);
+
+ connector.getTaskAttachmentHandler().postContent(repository, task, attachment,
+ attachmentMapper.getComment(), attrAttachment, new NullProgressMonitor());
+ } catch (CoreException e) {
+ assertEquals(
+ "Unable to login to http://mylyn.eclipse.org/bugs218.\n\ninvalid username or password \n\nPlease validate credentials via Task Repositories view.",
+ e.getMessage());
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ return;
+ }
+ fail("Should have failed due to invalid userid and password.");
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchDialogTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchDialogTest.java
new file mode 100644
index 0000000..fd48f00
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchDialogTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Test the bugzilla search dialog.
+ *
+ * @author Jeff Pound
+ */
+public class BugzillaSearchDialogTest extends TestCase {
+
+ private TaskRepositoryManager manager;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ manager = TasksUiPlugin.getRepositoryManager();
+ assertNotNull(manager);
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ if (manager != null) {
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+ }
+
+ /**
+ * Test that the search dialog is initialized properly with the given repository.
+ *
+ * @throws Exception
+ */
+ public void testSearchDialogInit() throws Exception {
+ TaskRepository repo = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ repo.setVersion(IBugzillaConstants.BugzillaServerVersion.SERVER_222.toString());
+ manager.addRepository(repo);
+ BugzillaSearchPage page = new BugzillaSearchPage(repo);
+ Shell shell = BugzillaTestPlugin.getDefault().getWorkbench().getDisplay().getShells()[0];
+ page.createControl(shell);
+ page.setVisible(true);
+
+ /*
+ * This assertion will fail with a 0 product count if the options are
+ * not retrieved properly, throw an exception if the page is not
+ * initialized properly, or pass otherwise.
+ */
+ assertFalse(page.getProductCount() == 0);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchTest.java
new file mode 100644
index 0000000..2320abf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaSearchTest.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaSearchTest extends TestCase {
+
+ private static final String QUERY_NAME = "Query Page Name";
+
+ private static final String BUG_DESC_SUBSTRING_SEARCH = "/buglist.cgi?short_desc_type=allwordssubstr&short_desc=";// search-match-test&";
+
+ private static final String SEARCH_DESCRIPTION = "search-match-test";
+
+ private static final int NUM_EXPECTED_HITS = 2;
+
+ private static final int NUM_REPOSITORIES = 0;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ assertEquals(NUM_REPOSITORIES, TasksUiPlugin.getRepositoryManager().getRepositories(
+ BugzillaCorePlugin.CONNECTOR_KIND).size());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ super.tearDown();
+ }
+
+ public void testSearching218() throws Exception {
+ TaskRepository repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ repository.setVersion(IBugzillaConstants.BugzillaServerVersion.SERVER_218.toString());
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ assertEquals(NUM_EXPECTED_HITS,
+ runQuery(IBugzillaTestConstants.TEST_BUGZILLA_218_URL, SEARCH_DESCRIPTION).size());
+ }
+
+ public void testSearching220() throws Exception {
+ TaskRepository repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_220_URL);
+ repository.setVersion(IBugzillaConstants.BugzillaServerVersion.SERVER_220.toString());
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ assertEquals(NUM_EXPECTED_HITS,
+ runQuery(IBugzillaTestConstants.TEST_BUGZILLA_220_URL, SEARCH_DESCRIPTION).size());
+ }
+
+ public void testSearching2201() throws Exception {
+ TaskRepository repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_2201_URL);
+ repository.setVersion(IBugzillaConstants.BugzillaServerVersion.SERVER_220.toString());
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ assertEquals(NUM_EXPECTED_HITS,
+ runQuery(IBugzillaTestConstants.TEST_BUGZILLA_2201_URL, SEARCH_DESCRIPTION).size());
+ }
+
+ public void testSearching222() throws Exception {
+ TaskRepository repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ repository.setVersion(IBugzillaConstants.BugzillaServerVersion.SERVER_222.toString());
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ Set<TaskData> hits = runQuery(IBugzillaTestConstants.TEST_BUGZILLA_222_URL, SEARCH_DESCRIPTION);
+ assertEquals(NUM_EXPECTED_HITS, hits.size());
+ }
+
+ private Set<TaskData> runQuery(String repositoryURL, String SearchString) throws Exception {
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
+ BugzillaCorePlugin.CONNECTOR_KIND, repositoryURL);
+ assertNotNull(repository);
+ IRepositoryQuery repositoryQuery = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+ repositoryQuery.setUrl(repository.getRepositoryUrl() + BUG_DESC_SUBSTRING_SEARCH + SearchString);
+ repositoryQuery.setSummary(QUERY_NAME);
+
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+ final Set<TaskData> changedTaskData = new HashSet<TaskData>();
+ TaskDataCollector collector = new TaskDataCollector() {
+
+ @Override
+ public void accept(TaskData taskData) {
+ changedTaskData.add(taskData);
+ }
+ };
+
+ connector.performQuery(repository, repositoryQuery, collector, null, new NullProgressMonitor());
+
+ return changedTaskData;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskCompletionTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskCompletionTest.java
new file mode 100644
index 0000000..6374594
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskCompletionTest.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaTaskCompletionTest extends TestCase {
+
+ private TaskRepository repository;
+
+ private BugzillaRepositoryConnector connector;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ this.connector = (BugzillaRepositoryConnector) TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+ this.repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testCompletionDate() throws Exception {
+ TaskTask task = new TaskTask(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaConstants.ECLIPSE_BUGZILLA_URL, "1");
+ TaskAttributeMapper mapper = connector.getTaskDataHandler().getAttributeMapper(repository);
+ TaskData taskData = new TaskData(mapper, BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL, "1");
+ taskData.getRoot().createAttribute(BugzillaAttribute.BUG_STATUS.getKey()).setValue(
+ IBugzillaConstants.VALUE_STATUS_RESOLVED);
+ TaskAttribute attrComment = taskData.getRoot().createAttribute("commentId");
+ attrComment.getMetaData().setType(TaskAttribute.TYPE_COMMENT);
+ TaskAttribute attrCreationDate = attrComment.createAttribute(BugzillaAttribute.BUG_WHEN.getKey());
+ attrCreationDate.setValue("2009-12-11 12:00");
+
+ assertFalse(task.isCompleted());
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertTrue(task.isCompleted());
+ Date completionDate = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2009-12-11 12:00");
+ assertTrue(completionDate.equals(task.getCompletionDate()));
+
+ }
+
+ public void testCompletionDateForStates() throws Exception {
+ TaskTask task = new TaskTask(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaConstants.ECLIPSE_BUGZILLA_URL, "1");
+ TaskAttributeMapper mapper = connector.getTaskDataHandler().getAttributeMapper(repository);
+ TaskData taskData = new TaskData(mapper, BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL, "1");
+ TaskAttribute status = taskData.getRoot().createAttribute(BugzillaAttribute.BUG_STATUS.getKey());
+ status.setValue("REOPENED");
+ TaskAttribute attrComment = taskData.getRoot().createAttribute("commentId");
+ attrComment.getMetaData().setType(TaskAttribute.TYPE_COMMENT);
+ TaskAttribute attrCreationDate = attrComment.createAttribute(BugzillaAttribute.BUG_WHEN.getKey());
+ attrCreationDate.setValue("2008-12-11 12:00");
+
+ assertFalse(task.isCompleted());
+ taskData.setPartial(true);
+ Date completionDate = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2009-01-06 06:06");
+ task.setCompletionDate(completionDate);
+ assertTrue(completionDate.equals(task.getCompletionDate()));
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertTrue(!task.isCompleted());
+ assertNull(task.getCompletionDate());
+
+ status.setValue(IBugzillaConstants.VALUE_STATUS_NEW);
+ task.setCompletionDate(completionDate);
+ assertTrue(completionDate.equals(task.getCompletionDate()));
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertTrue(!task.isCompleted());
+ assertNull(task.getCompletionDate());
+
+ status.setValue(IBugzillaConstants.VALUE_STATUS_VERIFIED);
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertTrue(task.isCompleted());
+ Date nullDate = new Date(0);
+ assertNotNull(task.getCompletionDate());
+ assertTrue(nullDate.equals(task.getCompletionDate()));
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskDataHandlerTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskDataHandlerTest.java
new file mode 100644
index 0000000..c4c2e02
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskDataHandlerTest.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Frank Becker
+ * @author Rob Elves
+ */
+public class BugzillaTaskDataHandlerTest extends TestCase {
+
+ TaskRepository repository;
+
+ BugzillaRepositoryConnector connector;
+
+ private TaskData init(String taskId) throws CoreException {
+ return connector.getTaskData(repository, taskId, new NullProgressMonitor());
+ }
+
+ private TaskRepository setRepository(String kind, String url) {
+ connector = (BugzillaRepositoryConnector) TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+ repository = new TaskRepository(kind, url);
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username,
+ credentials.password), true);
+ return repository;
+ }
+
+ private void testAttributesFromCloneBug(TaskData repositoryTaskData, boolean valueFromBug9) {
+ assertEquals("Clone Bug 1", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.SHORT_DESC.getKey())
+ .getValue());
+ assertEquals("This Bug is used to test the cloneTaskData", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.LONG_DESC.getKey()).getValue());
+ assertEquals("TestProduct", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.PRODUCT.getKey())
+ .getValue());
+ assertEquals("TestComponent", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.COMPONENT.getKey())
+ .getValue());
+ assertEquals("PC", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.REP_PLATFORM.getKey())
+ .getValue());
+ assertEquals("Windows", repositoryTaskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ assertEquals("unspecified", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.VERSION.getKey())
+ .getValue());
+ assertEquals("P3", repositoryTaskData.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+ assertEquals("enhancement", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey())
+ .getValue());
+ // "---" is not contained in the repository configuration therefore not added as a valid target_milestone
+ // it is however returned in the bug xml.
+// assertEquals("---", repositoryTaskData.getRoot()
+// .getAttribute(BugzillaAttribute.TARGET_MILESTONE.getKey())
+// .getValue());
+ assertEquals("Unclassified", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.CLASSIFICATION.getKey()).getValue());
+ if (valueFromBug9) {
+ assertEquals("9", repositoryTaskData.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey()).getValue());
+ assertEquals("1.00", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.REMAINING_TIME.getKey())
+ .getValue());
+ assertEquals("1.00", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey())
+ .getValue());
+ assertEquals("2007-12-12", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.DEADLINE.getKey())
+ .getValue());
+ assertEquals("NEW", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.BUG_STATUS.getKey())
+ .getValue());
+ assertEquals("2007-11-14 15:12", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.CREATION_TS.getKey()).getValue());
+ assertEquals("2007-11-14 15:14:46", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.DELTA_TS.getKey()).getValue());
+ assertEquals("tests at mylyn.eclipse.org", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.REPORTER.getKey()).getValue());
+ assertEquals("tests2 at mylyn.eclipse.org", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.ASSIGNED_TO.getKey()).getValue());
+ } else {
+ assertEquals("2.00", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.REMAINING_TIME.getKey())
+ .getValue());
+ assertEquals("2.00", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey())
+ .getValue());
+ assertEquals("2008-01-01", repositoryTaskData.getRoot()
+ .getAttribute(BugzillaAttribute.DEADLINE.getKey())
+ .getValue());
+ assertEquals("2007-11-14 15:30", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.CREATION_TS.getKey()).getValue());
+ assertEquals("2007-11-14 15:30:38", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.DELTA_TS.getKey()).getValue());
+ assertEquals("tests2 at mylyn.eclipse.org", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.REPORTER.getKey()).getValue());
+ assertEquals("tests at mylyn.eclipse.org", repositoryTaskData.getRoot().getAttribute(
+ BugzillaAttribute.ASSIGNED_TO.getKey()).getValue());
+ }
+ }
+
+ public void testCloneTaskData() throws Exception {
+ String bugid = "9";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_30_URL);
+ TaskData report1 = init(bugid);
+
+ assertNotNull(report1);
+
+ testAttributesFromCloneBug(report1, true);
+
+ bugid = "10";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_30_URL);
+ TaskData report2 = init(bugid);
+
+ assertNotNull(report2);
+ assertEquals("" + bugid, report2.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey()).getValue());
+ assertEquals("2.00", report2.getRoot().getAttribute(BugzillaAttribute.REMAINING_TIME.getKey()).getValue());
+ assertEquals("2.00", report2.getRoot().getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()).getValue());
+ assertEquals("2008-01-01", report2.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey()).getValue());
+
+ assertEquals("Clone Bug 2", report2.getRoot().getAttribute(BugzillaAttribute.SHORT_DESC.getKey()).getValue());
+ assertEquals("other Bug for cloneTaskData", report2.getRoot()
+ .getAttribute(BugzillaAttribute.LONG_DESC.getKey())
+ .getValue());
+ assertEquals("TestProduct", report2.getRoot().getAttribute(BugzillaAttribute.PRODUCT.getKey()).getValue());
+ assertEquals("TestComponent", report2.getRoot().getAttribute(BugzillaAttribute.COMPONENT.getKey()).getValue());
+ assertEquals("PC", report2.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ assertEquals("Mac OS", report2.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ assertEquals("unspecified", report2.getRoot().getAttribute(BugzillaAttribute.VERSION.getKey()).getValue());
+ assertEquals("P2", report2.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+ assertEquals("critical", report2.getRoot().getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey()).getValue());
+ assertEquals("ASSIGNED", report2.getRoot().getAttribute(BugzillaAttribute.BUG_STATUS.getKey()).getValue());
+ assertEquals("2007-11-14 15:30", report2.getRoot()
+ .getAttribute(BugzillaAttribute.CREATION_TS.getKey())
+ .getValue());
+ assertEquals("2008-04-08 20:03:35", report2.getRoot()
+ .getAttribute(BugzillaAttribute.DELTA_TS.getKey())
+ .getValue());
+ // Same discrepancy as in above test related to "---" target milestone not being in repository coonfiguration
+// assertEquals("---", report2.getRoot().getAttribute(BugzillaAttribute.TARGET_MILESTONE.getKey()).getValue());
+ assertEquals("tests2 at mylyn.eclipse.org", report2.getRoot()
+ .getAttribute(BugzillaAttribute.REPORTER.getKey())
+ .getValue());
+ assertEquals("tests at mylyn.eclipse.org", report2.getRoot()
+ .getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey())
+ .getValue());
+ }
+
+ public void testCharacterEscaping() throws CoreException {
+ String bugid = "17";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_30_URL);
+ TaskData report1 = init(bugid);
+ assertEquals("Testing! \"&@ $\" &", report1.getRoot()
+ .getAttribute(BugzillaAttribute.SHORT_DESC.getKey())
+ .getValue());
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskHyperlinkDetectorTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskHyperlinkDetectorTest.java
new file mode 100644
index 0000000..c8d628c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskHyperlinkDetectorTest.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Rob Elves
+ * @author Terry Hon
+ */
+public class BugzillaTaskHyperlinkDetectorTest extends TestCase {
+
+ private static final String DUPLICATE_NUMBER = "112233";
+
+ private static final String DUPLICATE = "duplicate of " + DUPLICATE_NUMBER;
+
+ private final String TASK_FORMAT_1 = "task#1";
+
+ private final String TASK_FORMAT_2 = "task# 1";
+
+ private final String TASK_FORMAT_3 = "task1";
+
+ private final String TASK_FORMAT_4 = "task #1";
+
+ private final String BUG_FORMAT_1 = "bug# 1";
+
+ private final String BUG_FORMAT_2 = "bug # 1";
+
+ private final String BUG_FORMAT_3 = "bug1";
+
+ private final String BUG_FORMAT_4 = "bug #1";
+
+ private final String BUG_FORMAT_1_2 = "bug# 2";
+
+ //private BugzillaTaskHyperlinkDetector detector = new BugzillaTaskHyperlinkDetector();
+ private TaskHyperlinkDetector detector;
+
+ private TaskRepository repository1;
+
+ private TaskRepository repository2;
+
+ private TextViewer viewer;
+
+ private String[] formats;
+
+ private TaskRepositoryManager repositoryManager;
+
+ private Shell shell;
+
+ protected TaskRepository activeRepository;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ detector = new TaskHyperlinkDetector();
+
+ repository1 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url1");
+ repository2 = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, "repository_url2");
+
+ detector.setContext(new IAdaptable() {
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return (adapter == TaskRepository.class) ? activeRepository : null;
+ }
+ });
+ setRepository(repository1);
+
+ shell = new Shell();
+ viewer = new TextViewer(shell, SWT.NONE);
+
+ repositoryManager = TasksUiPlugin.getRepositoryManager();
+ repositoryManager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+
+ formats = new String[] { TASK_FORMAT_1, TASK_FORMAT_2, TASK_FORMAT_3, TASK_FORMAT_4, BUG_FORMAT_1,
+ BUG_FORMAT_2, BUG_FORMAT_3, BUG_FORMAT_4 };
+ }
+
+ private void setRepository(final TaskRepository repository) {
+ this.activeRepository = repository;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ detector.dispose();
+ repositoryManager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+
+ shell.dispose();
+ }
+
+ public void testBeginning() {
+ for (String format : formats) {
+ String testString = format + " is at the beginning";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
+ }
+ }
+
+ public void testEnd() {
+ for (String format : formats) {
+ String testString = "is ends with " + format;
+ viewer.setDocument(new Document(testString));
+ int i = testString.indexOf(format);
+ Region region = new Region(i, testString.length() - i);
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(i, links[0].getHyperlinkRegion().getOffset());
+ }
+ }
+
+ public void testMiddle() {
+ for (String format : formats) {
+ String testString = "is a " + format + " in the middle";
+ viewer.setDocument(new Document(testString));
+ int i = testString.indexOf(format);
+ Region region = new Region(i, testString.length() - i);
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(testString.indexOf(format), links[0].getHyperlinkRegion().getOffset());
+ }
+ }
+
+ public void testTwoOnSingleLine() {
+ String testString = "is a " + BUG_FORMAT_1 + " in the middle and at the end " + BUG_FORMAT_1_2;
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
+ assertNotNull(links);
+ assertEquals(2, links.length);
+ assertEquals(testString.indexOf(BUG_FORMAT_1), links[0].getHyperlinkRegion().getOffset());
+ assertEquals(testString.indexOf(BUG_FORMAT_1_2), links[1].getHyperlinkRegion().getOffset());
+ }
+
+ public void testMultiLine() {
+ String testString = "is a the first line\n this is the second which ends with a bug, " + BUG_FORMAT_1_2;
+ viewer.setDocument(new Document(testString));
+ int i = testString.indexOf(BUG_FORMAT_1_2);
+ Region region = new Region(i, testString.length() - i);
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(i, links[0].getHyperlinkRegion().getOffset());
+ }
+
+ public void testDuplicate() {
+ String testString = "*** This bug has been marked as a " + DUPLICATE + " ***";
+ viewer.setDocument(new Document(testString));
+ int i = testString.indexOf(DUPLICATE);
+ Region region = new Region(i, testString.length() - i);
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, false);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(testString.indexOf(DUPLICATE_NUMBER), links[0].getHyperlinkRegion().getOffset());
+ }
+
+ public void testNoRepositoryInViewNoRepositoryInManager() {
+ String testString = "bug 123";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ setRepository(null);
+
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNull(links);
+ }
+
+ public void testRepositoryInViewNoRepositoryInManager() {
+ String testString = "bug 123";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ setRepository(repository1);
+
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertTrue(links[0] instanceof TaskHyperlink);
+ assertEquals(((TaskHyperlink) links[0]).getRepository(), repository1);
+ }
+
+ public void testNoRepositoryInViewOneRepositoryInManager() {
+ String testString = "bug 123";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ setRepository(null);
+
+ repositoryManager.addRepository(repository1);
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertTrue(links[0] instanceof TaskHyperlink);
+ assertEquals(((TaskHyperlink) links[0]).getRepository(), repository1);
+ }
+
+ public void testRepositoryInViewOneRepositoryInManager() {
+ String testString = "bug 123";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ setRepository(repository1);
+ repositoryManager.addRepository(repository1);
+
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertTrue(links[0] instanceof TaskHyperlink);
+ assertEquals(((TaskHyperlink) links[0]).getRepository(), repository1);
+ }
+
+ public void testNoRepositoryInViewTwoRepositoryInManager() {
+ String testString = "bug 123";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ setRepository(null);
+ repositoryManager.addRepository(repository1);
+ repositoryManager.addRepository(repository2);
+
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNotNull(links);
+ assertEquals(2, links.length);
+ assertTrue(links[0] instanceof TaskHyperlink);
+ assertEquals(((TaskHyperlink) links[0]).getRepository(), repository1);
+ assertTrue(links[1] instanceof TaskHyperlink);
+ assertEquals(((TaskHyperlink) links[1]).getRepository(), repository2);
+ }
+
+ public void testRepositoryInViewTwoRepositoryInManager() {
+ String testString = "bug 123";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(0, testString.length());
+ setRepository(repository1);
+ repositoryManager.addRepository(repository1);
+ repositoryManager.addRepository(repository2);
+
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertTrue(links[0] instanceof TaskHyperlink);
+ assertEquals(((TaskHyperlink) links[0]).getRepository(), repository1);
+ }
+
+ public void testMatchMultipleEmptyRegion() {
+ String testString = "bug 123 bug 345";
+ viewer.setDocument(new Document(testString));
+ Region region = new Region(10, 0);
+ setRepository(repository1);
+ repositoryManager.addRepository(repository1);
+
+ IHyperlink[] links = detector.detectHyperlinks(viewer, region, true);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertTrue(links[0] instanceof TaskHyperlink);
+ assertEquals("345", ((TaskHyperlink) links[0]).getTaskId());
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskListTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskListTest.java
new file mode 100644
index 0000000..7754671
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTaskListTest.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaTaskListTest extends TestCase {
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TasksUiPlugin.getTaskList().reset();
+ TasksUiPlugin.getExternalizationManager().save(true);
+ repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ assertEquals(0, TasksUiPlugin.getTaskList().getAllTasks().size());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ TasksUiPlugin.getTaskList().reset();
+ TasksUiPlugin.getExternalizationManager().save(true);
+ TasksUiPlugin.getRepositoryManager().removeRepository(repository,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ @SuppressWarnings("null")
+ public void testRemindedPersistance() throws Exception {
+
+ String repositoryUrl = "https://bugs.eclipse.org/bugs";
+
+ String bugNumber = "106939";
+
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, bugNumber);
+ TaskTask task1 = null;
+ if (task instanceof TaskTask) {
+ task1 = (TaskTask) task;
+ }
+ assertNotNull(task1);
+
+ TasksUiPlugin.getTaskList().addTask(task1);
+
+ task1.setReminded(true);
+ TaskTestUtil.saveAndReadTasklist();
+
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ assertEquals(1, taskList.getAllTasks().size());
+ Set<ITask> tasksReturned = taskList.getTasks(repositoryUrl);
+ assertNotNull(tasksReturned);
+ assertEquals(1, tasksReturned.size());
+ for (ITask taskRet : tasksReturned) {
+ assertTrue(((AbstractTask) taskRet).isReminded());
+ }
+ }
+
+ @SuppressWarnings("null")
+ public void testRepositoryTaskExternalization() throws Exception {
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, "1");
+ TaskTask repositoryTask = null;
+ if (task instanceof TaskTask) {
+ repositoryTask = (TaskTask) task;
+ }
+ assertNotNull(repositoryTask);
+ repositoryTask.setTaskKind("kind");
+ TasksUiPlugin.getTaskList().addTask(repositoryTask);
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, TasksUiPlugin.getTaskList()
+ .getUnmatchedContainer(IBugzillaConstants.ECLIPSE_BUGZILLA_URL)
+ .getChildren()
+ .size());
+ ITask readTask = TasksUiPlugin.getTaskList()
+ .getUnmatchedContainer(IBugzillaConstants.ECLIPSE_BUGZILLA_URL)
+ .getChildren()
+ .iterator()
+ .next();
+
+ assertEquals(repositoryTask.getHandleIdentifier(), readTask.getHandleIdentifier());
+ assertEquals(repositoryTask.getSummary(), readTask.getSummary());
+ assertEquals(repositoryTask.getTaskKind(), readTask.getTaskKind());
+ }
+
+ public void testQueryExternalization() throws Exception {
+ RepositoryQuery query = (RepositoryQuery) TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+ assertEquals("https://bugs.eclipse.org/bugs", query.getRepositoryUrl());
+ assertEquals("<never>", query.getLastSynchronizedTimeStamp());
+ query.setLastSynchronizedStamp("today");
+ TasksUiPlugin.getTaskList().addQuery(query);
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, TasksUiPlugin.getTaskList().getQueries().size());
+ IRepositoryQuery readQuery = TasksUiPlugin.getTaskList().getQueries().iterator().next();
+ assertEquals(query.getRepositoryUrl(), readQuery.getRepositoryUrl());
+ assertEquals("today", query.getLastSynchronizedTimeStamp());
+ assertEquals("https://bugs.eclipse.org/bugs", readQuery.getRepositoryUrl());
+ }
+
+ public void testDeleteQuery() {
+ RepositoryQuery query = new RepositoryQuery(BugzillaCorePlugin.CONNECTOR_KIND, "queryUrl");
+ query.setRepositoryUrl("repositoryUrl");
+ TasksUiPlugin.getTaskList().addQuery(query);
+
+ IRepositoryQuery readQuery = TasksUiPlugin.getTaskList().getQueries().iterator().next();
+ assertEquals(query, readQuery);
+
+ TasksUiPlugin.getTaskList().deleteQuery(query);
+ assertEquals(0, TasksUiPlugin.getTaskList().getQueries().size());
+ }
+
+ public void testDeleteQueryAfterRename() {
+ RepositoryQuery query = new RepositoryQuery(BugzillaCorePlugin.CONNECTOR_KIND, "queryUrl");
+ query.setRepositoryUrl("repositoryUrl");
+ TasksUiPlugin.getTaskList().addQuery(query);
+
+ IRepositoryQuery readQuery = TasksUiPlugin.getTaskList().getQueries().iterator().next();
+ assertEquals(query, readQuery);
+ query.setSummary("newName");
+ TasksUiPlugin.getTaskList().deleteQuery(query);
+ assertEquals(0, TasksUiPlugin.getTaskList().getQueries().size());
+ }
+
+ public void testCreateQueryWithSameName() {
+ RepositoryQuery query = new RepositoryQuery(BugzillaCorePlugin.CONNECTOR_KIND, "queryUrl");
+ query.setRepositoryUrl("repositoryUrl");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ assertEquals(1, TasksUiPlugin.getTaskList().getQueries().size());
+ IRepositoryQuery readQuery = TasksUiPlugin.getTaskList().getQueries().iterator().next();
+ assertEquals(query, readQuery);
+
+ try {
+ query = new RepositoryQuery(BugzillaCorePlugin.CONNECTOR_KIND, "queryUrl");
+ query.setRepositoryUrl("repositoryUrl");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ fail("Expected IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ if (!e.getMessage().equals("Handle queryUrl already exists in task list")) {
+ throw e;
+ }
+ }
+ assertEquals(1, TasksUiPlugin.getTaskList().getQueries().size());
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestPlugin.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestPlugin.java
new file mode 100644
index 0000000..f1aabeb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestPlugin.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class BugzillaTestPlugin extends AbstractUIPlugin {
+ // The shared instance.
+ private static BugzillaTestPlugin plugin;
+
+ // Resource bundle.
+ private ResourceBundle resourceBundle;
+
+ /**
+ * The constructor.
+ */
+ public BugzillaTestPlugin() {
+ super();
+ plugin = this;
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ resourceBundle = null;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static BugzillaTestPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle, or 'key' if not found.
+ */
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = BugzillaTestPlugin.getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the plugin's resource bundle,
+ */
+ public ResourceBundle getResourceBundle() {
+ try {
+ if (resourceBundle == null) {
+ resourceBundle = ResourceBundle.getBundle("org.eclipse.mylyn.bugzilla.tests.TestsPluginResources");
+ }
+ } catch (MissingResourceException x) {
+ resourceBundle = null;
+ }
+ return resourceBundle;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in relative path.
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.bugzilla.tests", path);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestUtil.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestUtil.java
new file mode 100644
index 0000000..641a77f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaTestUtil.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.mylyn.tasks.tests.TasksTestsPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaTestUtil {
+
+ public static File getLocalFile(String path) {
+ try {
+ URL installURL = TasksTestsPlugin.getDefault().getBundle().getEntry(path);
+ URL localURL = FileLocator.toFileURL(installURL);
+ return new File(localURL.getFile());
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Adapted from Java Developers' almanac
+ */
+ public static void copy(File source, File dest) throws IOException {
+ InputStream in = new FileInputStream(source);
+ OutputStream out = new FileOutputStream(dest);
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+ in.close();
+ out.close();
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaVersionTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaVersionTest.java
new file mode 100644
index 0000000..6756034
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/BugzillaVersionTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaVersion;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaVersionTest extends TestCase {
+
+ public final static BugzillaVersion BUGZILLA_2_18_1 = new BugzillaVersion("2.18.1");
+
+ public final static BugzillaVersion BUGZILLA_2_18_2 = new BugzillaVersion("2.18.2");
+
+ public final static BugzillaVersion BUGZILLA_2_20_3 = new BugzillaVersion("2.20.3");
+
+ public final static BugzillaVersion BUGZILLA_3_0_4 = new BugzillaVersion("3.0.4");
+
+ public void testwrongVersion() throws Exception {
+ BugzillaVersion version = new BugzillaVersion("3.2.X");
+ assertEquals("3.2", version.toString());
+ }
+
+ public void testMissingVersion() throws Exception {
+ BugzillaVersion version = new BugzillaVersion("3..1.X.");
+ assertEquals("3.0.1", version.toString());
+ }
+
+ public void testRCVersions() throws Exception {
+ BugzillaVersion versionRC1 = new BugzillaVersion("3.2RC1");
+ assertEquals("3.2RC1", versionRC1.toString());
+ BugzillaVersion versionRC2 = new BugzillaVersion("3.2RC2");
+ assertEquals("3.2RC2", versionRC2.toString());
+ assertEquals(-1, versionRC1.compareTo(versionRC2));
+ assertEquals(1, versionRC2.compareTo(versionRC1));
+ assertEquals(-1, versionRC1.compareTo(BugzillaVersion.BUGZILLA_3_2));
+ assertEquals(0, versionRC1.compareMajorMinorOnly(BugzillaVersion.BUGZILLA_3_2));
+ }
+
+ public void testCompareAll() throws Exception {
+ assertEquals(0, BUGZILLA_2_18_1.compareTo(BUGZILLA_2_18_1));
+ assertEquals(-1, BUGZILLA_2_18_1.compareTo(BUGZILLA_2_18_2));
+ assertEquals(1, BUGZILLA_2_18_2.compareTo(BUGZILLA_2_18_1));
+
+ assertEquals(-1, BUGZILLA_2_18_1.compareTo(BUGZILLA_2_20_3));
+ assertEquals(1, BUGZILLA_3_0_4.compareMajorMinorOnly(BUGZILLA_2_20_3));
+ }
+
+ public void testCompareMajorMinorOnly() throws Exception {
+ assertEquals(0, BUGZILLA_2_18_1.compareMajorMinorOnly(BUGZILLA_2_18_1));
+ assertEquals(0, BUGZILLA_2_18_1.compareMajorMinorOnly(BUGZILLA_2_18_2));
+ assertEquals(0, BUGZILLA_2_18_2.compareMajorMinorOnly(BUGZILLA_2_18_1));
+
+ assertEquals(-1, BUGZILLA_2_18_1.compareMajorMinorOnly(BUGZILLA_2_20_3));
+ assertEquals(1, BUGZILLA_3_0_4.compareMajorMinorOnly(BUGZILLA_2_20_3));
+ }
+
+ public void testToString() throws Exception {
+ assertEquals("2.18.1", BUGZILLA_2_18_1.toString());
+ assertEquals("3.0.4", BUGZILLA_3_0_4.toString());
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/EncodingTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/EncodingTest.java
new file mode 100644
index 0000000..02aed29
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/EncodingTest.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+
+/**
+ * @author Mik Kersten
+ */
+public class EncodingTest extends AbstractBugzillaTest {
+
+ public void testEncodingSetting() {
+
+ String charset = BugzillaClient.getCharsetFromString("text/html; charset=UTF-8");
+ assertEquals("UTF-8", charset);
+
+ charset = BugzillaClient.getCharsetFromString("text/html");
+ assertEquals(null, charset);
+
+ charset = BugzillaClient.getCharsetFromString("<<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\">>");
+ assertEquals("iso-8859-2", charset);
+
+ charset = BugzillaClient.getCharsetFromString("<<meta http-equiv=\"Content-Type\" content=\"text/html\">>");
+ assertEquals(null, charset);
+ }
+
+ /**
+ * This test just shows that when the encoding is changed on the repository synchronization does in fact return in a
+ * different encoding (though it may not be legible)
+ */
+ public void testDifferentReportEncoding() throws CoreException {
+ init222();
+ repository.setCharacterEncoding("UTF-8");
+ ITask task = generateLocalTaskAndDownload("57");
+ assertNotNull(task);
+ assertTrue(task.getSummary().equals("\u00E6"));//"\u05D0"));
+ taskList.deleteTask(task);
+ connector.getClientManager().repositoryRemoved(repository);
+ repository.setCharacterEncoding("ISO-8859-1");
+ task = generateLocalTaskAndDownload("57");
+ assertNotNull(task);
+ // iso-8859-1 'incorrect' interpretation
+ assertFalse(task.getSummary().equals("\u00E6"));//"\u05D0"));
+ }
+
+ public void testProperEncodingUponPost() throws CoreException {
+ init222();
+ repository.setCharacterEncoding("UTF-8");
+ ITask task = generateLocalTaskAndDownload("57");
+ assertNotNull(task);
+ assertTrue(task.getSummary().equals("\u00E6"));//"\u05D0"));
+ String priority = null;
+ TaskDataModel model = createModel(task);
+ if (task.getPriority().equals("P1")) {
+ priority = "P2";
+ TaskAttribute attrPriority = model.getTaskData()
+ .getRoot()
+ .getAttribute(BugzillaAttribute.PRIORITY.getKey());
+ if (attrPriority != null) {
+ attrPriority.setValue(priority);
+ model.attributeChanged(attrPriority);
+ } else {
+ fail();
+ }
+ } else {
+ priority = "P1";
+ TaskAttribute attrPriority = model.getTaskData()
+ .getRoot()
+ .getAttribute(BugzillaAttribute.PRIORITY.getKey());
+ if (attrPriority != null) {
+ attrPriority.setValue(priority);
+ model.attributeChanged(attrPriority);
+ } else {
+ fail();
+ }
+ }
+ model.save(new NullProgressMonitor());
+
+ submit(model);
+ taskList.deleteTask(task);
+ task = generateLocalTaskAndDownload("57");
+ assertNotNull(task);
+ assertTrue(task.getSummary().equals("\u00E6"));//"\u05D0"));
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/IBugzillaTestConstants.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/IBugzillaTestConstants.java
new file mode 100644
index 0000000..985c45e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/IBugzillaTestConstants.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+/**
+ * @author Frank Becker
+ */
+public interface IBugzillaTestConstants {
+
+ static final String TEST_BUGZILLA_218_URL = "http://mylyn.eclipse.org/bugs218"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_220_URL = "http://mylyn.eclipse.org/bugs220"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_2201_URL = "http://mylyn.eclipse.org/bugs2201"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_222_URL = "http://mylyn.eclipse.org/bugs222"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_30_URL = "http://mylyn.eclipse.org/bugs30"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_303_URL = "http://mylyn.eclipse.org/bugs303"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_31_URL = "http://mylyn.eclipse.org/bugs31"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_32_URL = "http://mylyn.eclipse.org/bugs32"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_322_URL = "http://mylyn.eclipse.org/bugs322"; //$NON-NLS-1$
+
+ static final String TEST_BUGZILLA_323_URL = "http://mylyn.eclipse.org/bugs323"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryEditorWizardTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryEditorWizardTest.java
new file mode 100644
index 0000000..d739ae4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryEditorWizardTest.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.net.MalformedURLException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClientFactory;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.EditRepositoryWizard;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ */
+public class RepositoryEditorWizardTest extends TestCase {
+
+ private TaskRepositoryManager manager;
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ manager = TasksUiPlugin.getRepositoryManager();
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username,
+ credentials.password), false);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ }
+
+ private BugzillaClient createClient(String hostUrl, String username, String password, String htAuthUser,
+ String htAuthPass, String encoding) throws MalformedURLException {
+ TaskRepository taskRepository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, hostUrl);
+
+ AuthenticationCredentials credentials = new AuthenticationCredentials(username, password);
+ taskRepository.setCredentials(AuthenticationType.REPOSITORY, credentials, false);
+
+ AuthenticationCredentials webCredentials = new AuthenticationCredentials(htAuthUser, htAuthPass);
+ taskRepository.setCredentials(AuthenticationType.HTTP, webCredentials, false);
+ taskRepository.setCharacterEncoding(encoding);
+ return BugzillaClientFactory.createClient(taskRepository);
+ }
+
+ public void testValidationInvalidPassword() throws Exception {
+
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
+ dialog.create();
+ BugzillaRepositorySettingsPage page = (BugzillaRepositorySettingsPage) wizard.getSettingsPage();
+ // BugzillaClient client =
+ // BugzillaClientFactory.createClient(page.getServerUrl(),
+ // page.getUserName(), page.getPassword(), page.getHttpAuthUserId(),
+ // page.getHttpAuthPassword(), page.getCharacterEncoding());
+ page.setPassword("bogus");
+ try {
+ BugzillaClient client = createClient(page.getRepositoryUrl(), page.getUserName(), page.getPassword(),
+ page.getHttpAuthUserId(), page.getHttpAuthPassword(), page.getCharacterEncoding());
+ client.validate(null);
+ } catch (CoreException e) {
+ return;
+ }
+ fail("LoginException didn't occur!");
+ }
+
+ public void testValidationInvalidUserid() throws Exception {
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
+ dialog.create();
+ BugzillaRepositorySettingsPage page = (BugzillaRepositorySettingsPage) wizard.getSettingsPage();
+ page.setUserId("bogus");
+ try {
+ BugzillaClient client = createClient(page.getRepositoryUrl(), page.getUserName(), page.getPassword(),
+ page.getHttpAuthUserId(), page.getHttpAuthPassword(), page.getCharacterEncoding());
+ client.validate(null);
+ } catch (CoreException e) {
+ return;
+ }
+ fail("LoginException didn't occur!");
+ }
+
+ public void testValidationInvalidUrl() throws Exception {
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
+ dialog.create();
+ BugzillaRepositorySettingsPage page = (BugzillaRepositorySettingsPage) wizard.getSettingsPage();
+ page.setUrl("http://mylar.eclipse.org");
+ try {
+ BugzillaClient client = createClient(page.getRepositoryUrl(), page.getUserName(), page.getPassword(),
+ page.getHttpAuthUserId(), page.getHttpAuthPassword(), page.getCharacterEncoding());
+ client.validate(null);
+ fail("UnknownHostException didn't occur!");
+ } catch (CoreException e) {
+ // skip assertion, some environments will still resolve invalid addresses
+ //assertTrue(e.getStatus().getException() instanceof UnknownHostException);
+ }
+ }
+
+ // TODO: Test locking up?
+ // public void testAutoVersion() throws Exception {
+ // repository.setVersion(BugzillaRepositorySettingsPage.LABEL_AUTOMATIC_VERSION);
+ // EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ // WizardDialog dialog = new
+ // WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ // wizard);
+ // dialog.create();
+ // BugzillaRepositorySettingsPage page = (BugzillaRepositorySettingsPage)
+ // wizard.getSettingsPage();
+ // page.setTesting(true);
+ // assertEquals(BugzillaRepositorySettingsPage.LABEL_AUTOMATIC_VERSION,
+ // page.getVersion());
+ // page.validateSettings();
+ // assertEquals("2.22", page.getVersion());
+ // }
+
+ public void testPersistChangeOfUrl() throws Exception {
+ assertEquals(1, manager.getAllRepositories().size());
+ String tempUid = repository.getUserName();
+ String tempPass = repository.getPassword();
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
+ dialog.create();
+ BugzillaRepositorySettingsPage page = (BugzillaRepositorySettingsPage) wizard.getSettingsPage();
+ BugzillaClient client = createClient(page.getRepositoryUrl(), page.getUserName(), page.getPassword(),
+ page.getHttpAuthUserId(), page.getHttpAuthPassword(), page.getCharacterEncoding());
+ client.validate(null);
+ page.setUrl(IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ wizard.performFinish();
+ assertEquals(1, manager.getAllRepositories().size());
+ TaskRepository repositoryTest = manager.getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ assertNotNull(repositoryTest);
+ assertEquals(tempUid, repositoryTest.getUserName());
+ assertEquals(tempPass, repositoryTest.getPassword());
+ }
+
+ public void testPersistChangeUserId() throws Exception {
+ assertEquals(1, manager.getAllRepositories().size());
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
+ dialog.create();
+ BugzillaRepositorySettingsPage page = (BugzillaRepositorySettingsPage) wizard.getSettingsPage();
+ BugzillaClient client = createClient(page.getRepositoryUrl(), page.getUserName(), page.getPassword(),
+ page.getHttpAuthUserId(), page.getHttpAuthPassword(), page.getCharacterEncoding());
+ client.validate(null);
+ page.setUserId("bogus");
+ wizard.performFinish();
+ assertEquals(1, manager.getAllRepositories().size());
+ TaskRepository repositoryTest = manager.getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ assertNotNull(repositoryTest);
+ wizard = new EditRepositoryWizard(repositoryTest);
+ dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
+ dialog.create();
+ page = (BugzillaRepositorySettingsPage) wizard.getSettingsPage();
+ try {
+ client = createClient(page.getRepositoryUrl(), page.getUserName(), page.getPassword(),
+ page.getHttpAuthUserId(), page.getHttpAuthPassword(), page.getCharacterEncoding());
+ client.validate(null);
+ } catch (CoreException e) {
+ return;
+ }
+ fail("LoginException didn't occur!");
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryReportFactoryTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryReportFactoryTest.java
new file mode 100644
index 0000000..33acc53
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryReportFactoryTest.java
@@ -0,0 +1,463 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class RepositoryReportFactoryTest extends TestCase {
+
+// BugzillaAttributeFactory attributeFactory = new BugzillaAttributeFactory();
+
+ TaskRepository repository;
+
+ BugzillaRepositoryConnector connector;
+
+ private TaskData init(String taskId) throws CoreException {
+ return connector.getTaskData(repository, taskId, new NullProgressMonitor());
+ }
+
+ private TaskRepository setRepository(String kind, String url) {
+ connector = (BugzillaRepositoryConnector) TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+ repository = new TaskRepository(kind, url);
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setAuthenticationCredentials(credentials.username, credentials.password);
+ return repository;
+ }
+
+ public void testInvalidCredentials222() throws Exception {
+ String bugid = "1";
+ String errorMessage = "";
+ try {
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ repository.setAuthenticationCredentials("invalid", "invalid");
+ init(bugid);
+ } catch (CoreException e) {
+ errorMessage = e.getStatus().getMessage();
+ }
+ assertTrue(errorMessage.startsWith("Unable to login"));
+ repository.flushAuthenticationCredentials();
+ }
+
+ public void testBugNotFound222() {
+
+ String bugid = "-1";
+ String errorMessage = "";
+ try {
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ // If this isn't called the BugzillaClient will be reused (with old
+ // credentials) so
+ // force drop of old client connection.
+ // Note that this is usually called by notification
+ connector.getClientManager().repositoryAdded(repository);
+ init(bugid);
+ } catch (CoreException e) {
+ errorMessage = e.getStatus().getMessage();
+ }
+ assertTrue(errorMessage.startsWith("Repository error from"));
+ }
+
+ // public void testReadingReport() throws Exception {
+ // String bugid = "2";
+ // setRepository(BugzillaCorePlugin.REPOSITORY_KIND,
+ // IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ // RepositoryTaskData report = init(bugid);
+ //
+ // assertNotNull(report);
+ // assertEquals("search-match-test 1",
+ // report.getAttribute(BugzillaReportElement.SHORT_DESC.getKeyString())
+ // .getValue());
+ // assertEquals("TestProduct",
+ // report.getAttribute(BugzillaReportElement.PRODUCT.getKeyString()).getValue());
+ // assertEquals("PC",
+ // report.getAttribute(BugzillaReportElement.REP_PLATFORM.getKeyString()).getValue());
+ // assertEquals("Windows",
+ // report.getAttribute(BugzillaReportElement.OP_SYS.getKeyString()).getValue());
+ // // first comment (#0) is the summary so this value is always 1
+ // // greater
+ // // than what is shown on the report ui
+ // assertEquals(3, report.getComments().size());
+ // assertEquals("search-match-test 1",
+ // report.getComments().get(0).getAttribute(
+ // BugzillaReportElement.THETEXT.getKeyString()).getValue());
+ // // assertEquals(15, report.getAttachments().size());
+ // // assertEquals("1",
+ // //
+ // report.getAttachments().get(0).getAttribute(BugzillaReportElement.ATTACHID).getValue());
+ // // assertEquals("2006-03-10 14:11",
+ // //
+ // report.getAttachments().get(0).getAttribute(BugzillaReportElement.DATE)
+ // // .getValue());
+ // // assertEquals("Testing upload",
+ // //
+ // report.getAttachments().get(0).getAttribute(BugzillaReportElement.DESC)
+ // // .getValue());
+ // // assertEquals("patch130217.txt",
+ // //
+ // report.getAttachments().get(0).getAttribute(BugzillaReportElement.FILENAME)
+ // // .getValue());
+ // // assertEquals("text/plain",
+ // //
+ // report.getAttachments().get(0).getAttribute(BugzillaReportElement.TYPE).getValue());
+ // }
+
+ public void testReadingReport222() throws Exception {
+ String bugid = "2";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ TaskData report = init(bugid);
+ assertNotNull(report);
+ assertEquals("search-match-test 1", report.getRoot()
+ .getAttribute(BugzillaAttribute.SHORT_DESC.getKey())
+ .getValue());
+ assertEquals("search-match-test 1", report.getRoot()
+ .getAttribute(BugzillaAttribute.LONG_DESC.getKey())
+ .getValue());
+ assertEquals("TestProduct", report.getRoot().getAttribute(BugzillaAttribute.PRODUCT.getKey()).getValue());
+ assertEquals("TestComponent", report.getRoot().getAttribute(BugzillaAttribute.COMPONENT.getKey()).getValue());
+ assertEquals("PC", report.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ assertEquals("Windows", report.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ assertEquals("other", report.getRoot().getAttribute(BugzillaAttribute.VERSION.getKey()).getValue());
+ assertEquals("P1", report.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+ assertEquals("normal", report.getRoot().getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey()).getValue());
+ assertEquals("" + bugid, report.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey()).getValue());
+ assertEquals("NEW", report.getRoot().getAttribute(BugzillaAttribute.BUG_STATUS.getKey()).getValue());
+ assertEquals("2006-05-23 17:46", report.getRoot()
+ .getAttribute(BugzillaAttribute.CREATION_TS.getKey())
+ .getValue());
+ assertEquals("2008-07-04 16:33:55", report.getRoot()
+ .getAttribute(BugzillaAttribute.DELTA_TS.getKey())
+ .getValue());
+ assertEquals("relves at cs.ubc.ca", report.getRoot().getAttribute(BugzillaAttribute.REPORTER.getKey()).getValue());
+ assertEquals("nhapke at cs.ubc.ca", report.getRoot()
+ .getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey())
+ .getValue());
+ // test comments
+ List<TaskAttribute> comments = report.getAttributeMapper().getAttributesByType(report,
+ TaskAttribute.TYPE_COMMENT);
+ assertEquals(6, comments.size());
+ TaskCommentMapper commentMap = TaskCommentMapper.createFrom(comments.get(0));
+ assertEquals("relves at cs.ubc.ca", commentMap.getAuthor().getPersonId());
+ assertEquals("browser comment", commentMap.getText());
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ assertEquals(format.parse("2006-05-30 18:56:24"), commentMap.getCreationDate());
+ }
+
+ public void testReadingReport2201() throws Exception {
+ String bugid = "1";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_2201_URL);
+ TaskData report = init(bugid);
+
+ assertNotNull(report);
+ assertEquals("1", report.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey()).getValue());
+ assertEquals("search-match-test 1", report.getRoot()
+ .getAttribute(BugzillaAttribute.SHORT_DESC.getKey())
+ .getValue());
+ assertEquals("TestProduct", report.getRoot().getAttribute(BugzillaAttribute.PRODUCT.getKey()).getValue());
+ assertEquals("TestComponent", report.getRoot().getAttribute(BugzillaAttribute.COMPONENT.getKey()).getValue());
+ assertEquals("PC", report.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ assertEquals("Windows", report.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ assertEquals("other", report.getRoot().getAttribute(BugzillaAttribute.VERSION.getKey()).getValue());
+ assertEquals("P2", report.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+ assertEquals("normal", report.getRoot().getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey()).getValue());
+ assertEquals("NEW", report.getRoot().getAttribute(BugzillaAttribute.BUG_STATUS.getKey()).getValue());
+ assertEquals("2006-03-02 18:13", report.getRoot()
+ .getAttribute(BugzillaAttribute.CREATION_TS.getKey())
+ .getValue());
+ assertEquals("2006-05-03 13:06:11", report.getRoot()
+ .getAttribute(BugzillaAttribute.DELTA_TS.getKey())
+ .getValue());
+ TaskAttribute attribute = report.getRoot().getAttribute(BugzillaAttribute.BLOCKED.getKey());
+ assertEquals("2, 9", attribute.getValue());
+ attribute = report.getRoot().getAttribute(BugzillaAttribute.CC.getKey());
+ assertEquals(2, attribute.getValues().size());
+ assertEquals("relves at cs.ubc.ca", attribute.getValues().get(0));
+ assertEquals("relves at gmail.com", attribute.getValues().get(1));
+ assertEquals("relves at cs.ubc.ca", report.getRoot().getAttribute(BugzillaAttribute.REPORTER.getKey()).getValue());
+ assertEquals("relves at cs.ubc.ca", report.getRoot()
+ .getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey())
+ .getValue());
+ }
+
+ // public void testReadingReport2201Eclipse() throws Exception {
+ // String bugid = "24448";
+ // TaskRepository repository = new
+ // TaskRepository(BugzillaCorePlugin.REPOSITORY_KIND,
+ // IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+ //
+ // RepositoryTaskData report = new RepositoryTaskData(attributeFactory,
+ // BugzillaCorePlugin.REPOSITORY_KIND, repository
+ // .getUrl(), bugid);
+ // BugzillaServerFacade.setupExistingBugAttributes(repository.getUrl(),
+ // report);
+ // factory.populateReport(report, repository.getUrl(), null,
+ // repository.getUserName(), repository.getPassword(),
+ // null);
+ //
+ // assertNotNull(report);
+ // assertEquals("24448",
+ // report.getAttribute(BugzillaReportElement.BUG_ID.getKeyString()).getValue());
+ // assertEquals("Ant causing Out of Memory",
+ // report.getAttribute(BugzillaReportElement.SHORT_DESC.getKeyString())
+ // .getValue());
+ // assertEquals("Platform",
+ // report.getAttribute(BugzillaReportElement.PRODUCT.getKeyString()).getValue());
+ // assertEquals("Ant",
+ // report.getAttribute(BugzillaReportElement.COMPONENT.getKeyString()).getValue());
+ // assertEquals("PC",
+ // report.getAttribute(BugzillaReportElement.REP_PLATFORM.getKeyString()).getValue());
+ // assertEquals("other",
+ // report.getAttribute(BugzillaReportElement.OP_SYS.getKeyString()).getValue());
+ // assertEquals("2.0",
+ // report.getAttribute(BugzillaReportElement.VERSION.getKeyString()).getValue());
+ // assertEquals("P2",
+ // report.getAttribute(BugzillaReportElement.PRIORITY.getKeyString()).getValue());
+ // assertEquals("normal",
+ // report.getAttribute(BugzillaReportElement.BUG_SEVERITY.getKeyString()).getValue());
+ // assertEquals("RESOLVED",
+ // report.getAttribute(BugzillaReportElement.BUG_STATUS.getKeyString()).getValue());
+ // assertEquals("WONTFIX",
+ // report.getAttribute(BugzillaReportElement.RESOLUTION.getKeyString()).getValue());
+ // assertEquals("2002-10-07 09:32",
+ // report.getAttribute(BugzillaReportElement.CREATION_TS.getKeyString())
+ // .getValue());
+ // assertEquals("2006-02-03 12:03:57",
+ // report.getAttribute(BugzillaReportElement.DELTA_TS.getKeyString())
+ // .getValue());
+ // assertEquals("core, performance, ui",
+ // report.getAttribute(BugzillaReportElement.KEYWORDS.getKeyString())
+ // .getValue());
+ // // RepositoryTaskAttribute attribute =
+ // // report.getAttribute(BugzillaReportElement.CC);
+ // // assertEquals(30, attribute.getValues().size());
+ // // assertEquals("relves at cs.ubc.ca", attribute.getValues().get(0));
+ // // assertEquals("relves at gmail.com", attribute.getValues().get(1));
+ // // assertEquals("relves at cs.ubc.ca",
+ // // report.getAttribute(BugzillaReportElement.REPORTER).getValue());
+ // // assertEquals("relves at cs.ubc.ca",
+ // // report.getAttribute(BugzillaReportElement.ASSIGNED_TO).getValue());
+ // // assertEquals(1, report.getComments().size());
+ // // assertEquals("relves at cs.ubc.ca",
+ // //
+ // report.getComments().get(0).getAttribute(BugzillaReportElement.WHO).getValue());
+ // // assertEquals("2006-03-02 18:13",
+ // //
+ // report.getComments().get(0).getAttribute(BugzillaReportElement.BUG_WHEN)
+ // // .getValue());
+ // // assertEquals("search-match-test 1",
+ // //
+ // report.getComments().get(0).getAttribute(BugzillaReportElement.THETEXT)
+ // // .getValue());
+ // // assertEquals(0, report.getAttachments().size());
+ // }
+
+ // public void testReadingReport220() throws Exception {
+ // String bugid = "1";
+ // TaskRepository repository = new
+ // TaskRepository(BugzillaCorePlugin.REPOSITORY_KIND,
+ // IBugzillaTestConstants.TEST_BUGZILLA_220_URL);
+ //
+ // RepositoryTaskData report = new RepositoryTaskData(attributeFactory,
+ // BugzillaCorePlugin.REPOSITORY_KIND,
+ // repository.getUrl(), bugid);
+ // BugzillaServerFacade.setupExistingBugAttributes(repository.getUrl(),
+ // report);
+ // factory.populateReport(report, repository.getUrl(), null,
+ // repository.getUserName(), repository.getPassword(),
+ // null);
+ //
+ // assertNotNull(report);
+ // assertEquals("1",
+ // report.getAttribute(BugzillaReportElement.BUG_ID.getKeyString()).getValue());
+ // assertEquals("search-match-test",
+ // report.getAttribute(BugzillaReportElement.SHORT_DESC.getKeyString())
+ // .getValue());
+ // assertEquals("TestProduct",
+ // report.getAttribute(BugzillaReportElement.PRODUCT.getKeyString()).getValue());
+ // assertEquals("TestComponent",
+ // report.getAttribute(BugzillaReportElement.COMPONENT.getKeyString()).getValue());
+ // assertEquals("PC",
+ // report.getAttribute(BugzillaReportElement.REP_PLATFORM.getKeyString()).getValue());
+ // assertEquals("Windows",
+ // report.getAttribute(BugzillaReportElement.OP_SYS.getKeyString()).getValue());
+ // assertEquals("other",
+ // report.getAttribute(BugzillaReportElement.VERSION.getKeyString()).getValue());
+ // assertEquals("P2",
+ // report.getAttribute(BugzillaReportElement.PRIORITY.getKeyString()).getValue());
+ // assertEquals("normal",
+ // report.getAttribute(BugzillaReportElement.BUG_SEVERITY.getKeyString()).getValue());
+ // assertEquals("NEW",
+ // report.getAttribute(BugzillaReportElement.BUG_STATUS.getKeyString()).getValue());
+ // assertEquals("2006-03-02 17:30",
+ // report.getAttribute(BugzillaReportElement.CREATION_TS.getKeyString())
+ // .getValue());
+ // assertEquals("2006-04-20 15:13:43",
+ // report.getAttribute(BugzillaReportElement.DELTA_TS.getKeyString())
+ // .getValue());
+ // assertEquals("---",
+ // report.getAttribute(BugzillaReportElement.TARGET_MILESTONE.getKeyString()).getValue());
+ // assertEquals("relves at cs.ubc.ca",
+ // report.getAttribute(BugzillaReportElement.REPORTER.getKeyString()).getValue());
+ // assertEquals("relves at cs.ubc.ca",
+ // report.getAttribute(BugzillaReportElement.ASSIGNED_TO.getKeyString())
+ // .getValue());
+ // assertEquals("relves at cs.ubc.ca",
+ // report.getAttribute(BugzillaReportElement.CC.getKeyString()).getValue());
+ // assertEquals(3, report.getComments().size());
+ // assertEquals("relves at cs.ubc.ca",
+ // report.getComments().get(0).getAttribute(
+ // BugzillaReportElement.WHO.getKeyString()).getValue());
+ // assertEquals("2006-03-02 17:30",
+ // report.getComments().get(0).getAttribute(
+ // BugzillaReportElement.BUG_WHEN.getKeyString()).getValue());
+ // assertEquals("search-match-test",
+ // report.getComments().get(0).getAttribute(
+ // BugzillaReportElement.THETEXT.getKeyString()).getValue());
+ // assertEquals(0, report.getAttachments().size());
+ // }
+
+ public void testReadingReport218() throws Exception {
+ String bugid = "1";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ TaskData report = init(bugid);
+ assertNotNull(report);
+ assertEquals("1", report.getRoot().getAttribute(BugzillaAttribute.BUG_ID.getKey()).getValue());
+ assertEquals("search-match-test 1", report.getRoot()
+ .getAttribute(BugzillaAttribute.SHORT_DESC.getKey())
+ .getValue());
+ assertEquals("TestProduct", report.getRoot().getAttribute(BugzillaAttribute.PRODUCT.getKey()).getValue());
+ assertEquals("TestComponent", report.getRoot().getAttribute(BugzillaAttribute.COMPONENT.getKey()).getValue());
+ assertEquals("PC", report.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ assertEquals("Windows XP", report.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ assertEquals("other", report.getRoot().getAttribute(BugzillaAttribute.VERSION.getKey()).getValue());
+ assertEquals("P2", report.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+ assertEquals("normal", report.getRoot().getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey()).getValue());
+ assertEquals("NEW", report.getRoot().getAttribute(BugzillaAttribute.BUG_STATUS.getKey()).getValue());
+ assertEquals("2006-03-02 18:09", report.getRoot()
+ .getAttribute(BugzillaAttribute.CREATION_TS.getKey())
+ .getValue());
+ assertEquals("2006-05-05 17:45:24", report.getRoot()
+ .getAttribute(BugzillaAttribute.DELTA_TS.getKey())
+ .getValue());
+ assertEquals("relves at cs.ubc.ca", report.getRoot().getAttribute(BugzillaAttribute.REPORTER.getKey()).getValue());
+ assertEquals("relves at cs.ubc.ca", report.getRoot()
+ .getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey())
+ .getValue());
+ assertEquals(0, report.getAttributeMapper().getAttributesByType(report, TaskAttribute.TYPE_ATTACHMENT).size());
+ }
+
+ public void testTimeTracking222() throws Exception {
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ TaskData report = init("11");
+ assertEquals("7.50", report.getRoot().getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()).getValue());
+ assertEquals("4.00", report.getRoot().getAttribute(BugzillaAttribute.ACTUAL_TIME.getKey()).getValue());
+ assertEquals("3.00", report.getRoot().getAttribute(BugzillaAttribute.REMAINING_TIME.getKey()).getValue());
+ assertEquals("2005-03-04", report.getRoot().getAttribute(BugzillaAttribute.DEADLINE.getKey()).getValue());
+ }
+
+ // public void testTimeTracking2201() throws Exception {
+ // RepositoryTaskData report =
+ // init(IBugzillaTestConstants.TEST_BUGZILLA_2201_URL, 23);
+ //
+ // assertEquals("7.50",
+ // report.getAttribute(BugzillaReportElement.ESTIMATED_TIME.getKeyString()).getValue());
+ // assertEquals("1.00",
+ // report.getAttribute(BugzillaReportElement.ACTUAL_TIME.getKeyString()).getValue());
+ // assertEquals("3.00",
+ // report.getAttribute(BugzillaReportElement.REMAINING_TIME.getKeyString()).getValue());
+ // assertEquals("2005-03-04",
+ // report.getAttribute(BugzillaReportElement.DEADLINE.getKeyString()).getValue());
+ // }
+ //
+ // public void testTimeTracking220() throws Exception {
+ // RepositoryTaskData report =
+ // init(IBugzillaTestConstants.TEST_BUGZILLA_220_URL, 9);
+ //
+ // assertEquals("7.50",
+ // report.getAttribute(BugzillaReportElement.ESTIMATED_TIME.getKeyString()).getValue());
+ // assertEquals("1.00",
+ // report.getAttribute(BugzillaReportElement.ACTUAL_TIME.getKeyString()).getValue());
+ // assertEquals("3.00",
+ // report.getAttribute(BugzillaReportElement.REMAINING_TIME.getKeyString()).getValue());
+ // assertEquals("2005-03-04",
+ // report.getAttribute(BugzillaReportElement.DEADLINE.getKeyString()).getValue());
+ // }
+
+ public void testTimeTracking218() throws Exception {
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ TaskData report = init("19");
+ TaskAttribute root = report.getRoot();
+ assertEquals("7.50", root.getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()).getValue());
+ assertEquals("1.00", root.getAttribute(BugzillaAttribute.ACTUAL_TIME.getKey()).getValue());
+ assertEquals("3.00", root.getAttribute(BugzillaAttribute.REMAINING_TIME.getKey()).getValue());
+ }
+
+ public void testMultipleDepensOn() throws Exception {
+ String bugid = "5";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_218_URL);
+ TaskData report = init(bugid);
+ assertNotNull(report);
+ TaskAttribute root = report.getRoot();
+ assertEquals("5", root.getAttribute(BugzillaAttribute.BUG_ID.getKey()).getValue());
+ assertEquals("6, 7", root.getAttribute(BugzillaAttribute.DEPENDSON.getKey()).getValue());
+ assertEquals("13, 14", root.getAttribute(BugzillaAttribute.BLOCKED.getKey()).getValue());
+ }
+
+ public void testBugReportAPI() throws Exception {
+ String bugid = "3";
+ setRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ TaskData report = init(bugid);
+ assertNotNull(report);
+ assertTrue(report != null);
+ TaskMapper mapper = new TaskMapper(report);
+ assertEquals("search-match-test 2", mapper.getSummary());
+ assertEquals("search-match-test 2", mapper.getDescription());
+ assertEquals("TestProduct", mapper.getProduct());
+ assertEquals("nhapke at cs.ubc.ca", mapper.getOwner());
+ }
+
+ public void testDeltaTsTruncation() {
+ String ts1 = "2006-07-06 03:22:08 0900";
+ String ts1_truncated = "2006-07-06 03:22:08";
+ assertEquals(ts1_truncated, BugzillaClient.stripTimeZone(ts1));
+
+ String ts2 = "2006-07-06 03:22:08";
+ String ts2_truncated = "2006-07-06 03:22:08";
+ assertEquals(ts2_truncated, BugzillaClient.stripTimeZone(ts2));
+
+ String ts3 = "2006-07-06 03:22:08 PST";
+ String ts3_truncated = "2006-07-06 03:22:08";
+ assertEquals(ts3_truncated, BugzillaClient.stripTimeZone(ts3));
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryTaskHandleTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryTaskHandleTest.java
new file mode 100644
index 0000000..3a91422
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/RepositoryTaskHandleTest.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+
+/**
+ * @author Mik Kersten
+ */
+public class RepositoryTaskHandleTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskTestUtil.resetTaskList();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testRepositoryUrlHandles() throws Exception {
+ String taskId = "123";
+ String repositoryUrl = IBugzillaConstants.ECLIPSE_BUGZILLA_URL;
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, repositoryUrl);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+
+ ITask bugTask = new TaskTask(BugzillaCorePlugin.CONNECTOR_KIND, repositoryUrl, taskId);
+ bugTask.setSummary("Summary");
+ assertEquals(repositoryUrl, bugTask.getRepositoryUrl());
+
+ TasksUiPlugin.getTaskList().addTask(bugTask);
+ TaskTestUtil.saveAndReadTasklist();
+
+ ITask readReport = TasksUiPlugin.getTaskList().getTask(repositoryUrl, taskId);
+ assertEquals("Summary", readReport.getSummary());
+ assertEquals(repositoryUrl, readReport.getRepositoryUrl());
+ TasksUiPlugin.getRepositoryManager().removeRepository(repository,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskEditorTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskEditorTest.java
new file mode 100644
index 0000000..21afe26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskEditorTest.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Jeff Pound
+ */
+public class TaskEditorTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false);
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TaskTestUtil.resetTaskList();
+ TasksUiPlugin.getExternalizationManager().requestSave();
+ super.tearDown();
+ }
+
+ /**
+ * Automated task creation needs to access newly created task editors. This test tests that the access is available.
+ *
+ * @throws Exception
+ */
+ public void testAccessNewEditor() throws Exception {
+ final TaskMapping taskMappingInit = new TaskMapping() {
+ @Override
+ public String getSummary() {
+ return "The Summary";
+ }
+
+ @Override
+ public String getDescription() {
+ return "The Description";
+ }
+ };
+ final TaskMapping taskMappingSelect = new TaskMapping() {
+ @Override
+ public String getProduct() {
+ return "TestProduct";
+ }
+ };
+
+ TaskRepository taskRepository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(taskRepository);
+ final TaskData[] taskData = new TaskData[1];
+
+ taskData[0] = TasksUiInternal.createTaskData(taskRepository, taskMappingInit, taskMappingSelect, null);
+ TasksUiInternal.createAndOpenNewTask(taskData[0]);
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ TaskEditor taskEditor = (TaskEditor) page.getActiveEditor();
+ assertEquals("New Task", taskEditor.getTitle());
+ }
+
+ public void testinitializeTaskData() throws Exception {
+ final TaskMapping taskMappingInit = new TaskMapping() {
+ @Override
+ public String getSummary() {
+ return "The Summary";
+ }
+
+ @Override
+ public String getDescription() {
+ return "The Description";
+ }
+ };
+ final TaskMapping taskMappingSelect = new TaskMapping() {
+ @Override
+ public String getProduct() {
+ return "TestProduct";
+ }
+ };
+
+ TaskRepository taskRepository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(taskRepository);
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ TaskAttributeMapper mapper = taskDataHandler.getAttributeMapper(taskRepository);
+ TaskData taskData = new TaskData(mapper, taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(),
+ "");
+ assertTrue(taskDataHandler.initializeTaskData(taskRepository, taskData, null, null));
+ assertTrue(taskDataHandler.initializeTaskData(taskRepository, taskData, taskMappingInit, null));
+ assertTrue(taskDataHandler.initializeTaskData(taskRepository, taskData, taskMappingSelect, null));
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListStandaloneTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListStandaloneTest.java
new file mode 100644
index 0000000..891ce49
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/TaskListStandaloneTest.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests;
+
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskListStandaloneTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TasksUiPlugin.getTaskList().reset();
+ TasksUiPlugin.getExternalizationManager().save(true);
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ assertEquals("should be empty: " + TasksUiPlugin.getTaskList().getDefaultCategory().getChildren(), 0,
+ TasksUiPlugin.getTaskList().getDefaultCategory().getChildren().size());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TasksUiPlugin.getTaskList().reset();
+ TasksUiPlugin.getExternalizationManager().save(true);
+ super.tearDown();
+ }
+
+ public void testDueDateExternalization() throws Exception {
+ AbstractTask task = new LocalTask("1", "task 1");
+ Date dueDate = new Date();
+ task.setDueDate(dueDate);
+ TasksUiPlugin.getTaskList().addTask(task);
+ assertEquals(1, TasksUiPlugin.getTaskList().getAllTasks().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ assertEquals(1, TasksUiPlugin.getTaskList().getAllTasks().size());
+ Collection<ITask> readList = TasksUiPlugin.getTaskList().getDefaultCategory().getChildren();
+ ITask readTask = readList.iterator().next();
+ assertTrue(readTask.getSummary().equals("task 1"));
+ assertTrue(readTask.getDueDate().compareTo(dueDate) == 0);
+ }
+
+ public void testPastReminder() throws InterruptedException {
+ AbstractTask task = new LocalTask("1", "1");
+
+ task.setScheduledForDate(new DateRange(Calendar.getInstance()));
+ Thread.sleep(2000);
+ assertFalse(TasksUiPlugin.getTaskActivityManager().isPastReminder(task));
+
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.MINUTE, 2);
+ task.setScheduledForDate(new DateRange(cal));
+ assertFalse(TasksUiPlugin.getTaskActivityManager().isPastReminder(task));
+
+ Calendar cal1 = Calendar.getInstance();
+ cal1.add(Calendar.MINUTE, -2);
+ task.setScheduledForDate(new DateRange(cal1, cal));
+ assertFalse(TasksUiPlugin.getTaskActivityManager().isPastReminder(task));
+
+ Calendar cal2 = Calendar.getInstance();
+ cal2.add(Calendar.MINUTE, -2);
+ task.setScheduledForDate(new DateRange(cal2));
+ task.setCompletionDate(new Date());
+ assertFalse(TasksUiPlugin.getTaskActivityManager().isPastReminder(task));
+ }
+
+ public void testDates() {
+ Date start = Calendar.getInstance().getTime();
+ Date creation = new Date();
+ AbstractTask task = new LocalTask("1", "task 1");
+
+ TasksUiPlugin.getTaskList().addTask(task);
+ assertNull(task.getCreationDate());
+ task.setCreationDate(start);
+ assertEquals(start, task.getCreationDate());
+
+ assertNull(task.getCompletionDate());
+ task.setCompletionDate(creation);
+ assertEquals(creation, task.getCompletionDate());
+
+ assertEquals(1, TasksUiPlugin.getTaskList().getRootElements().size());
+ TasksUiPlugin.getExternalizationManager().requestSave();
+
+ assertNotNull(TasksUiPlugin.getTaskList());
+ assertEquals(1, TasksUiPlugin.getTaskList().getDefaultCategory().getChildren().size());
+
+ Collection<ITask> readList = TasksUiPlugin.getTaskList().getDefaultCategory().getChildren();
+ AbstractTask readTask = (AbstractTask) readList.iterator().next();
+ assertTrue(readTask.getSummary().equals("task 1"));
+
+ assertEquals("should be: " + creation, task.getCreationDate(), readTask.getCreationDate());
+ assertEquals(task.getCompletionDate(), readTask.getCompletionDate());
+ assertEquals(task.getScheduledForDate(), readTask.getScheduledForDate());
+ }
+
+ // Task retention when connector missing upon startup
+ public void testOrphanedTasks() throws Exception {
+ // make some tasks
+ // save them
+ assertEquals(0, TasksUiPlugin.getTaskList().getAllTasks().size());
+ ITask task = new TaskTask(BugzillaCorePlugin.CONNECTOR_KIND, "http://bugs", "1");
+ TasksUiPlugin.getTaskList().addTask(task);
+
+ // reload tasklist and check that they persist
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, TasksUiPlugin.getTaskList().getAllTasks().size());
+
+ // removed/disable externalizers
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().removeRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+
+ // reload tasklist ensure task didn't load
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(0, TasksUiPlugin.getTaskList().getAllTasks().size());
+ // Save the task list (tasks with missing connectors should get
+ // persisted)
+ TasksUiPlugin.getExternalizationManager().save(true);
+
+ // re-enable connector
+ TasksUiPlugin.getRepositoryManager().addRepositoryConnector(connector);
+
+ // re-load tasklist
+ TaskTestUtil.saveAndReadTasklist();
+
+ // ensure that task now gets loaded
+ assertEquals(1, TasksUiPlugin.getTaskList().getAllTasks().size());
+ assertNotNull("1", TasksUiPlugin.getTaskList().getTask("http://bugs", "1"));
+ }
+
+ // Query retention when connector missing/fails to load
+ public void testOrphanedQueries() throws Exception {
+ // make a query
+ assertEquals(0, TasksUiPlugin.getTaskList().getQueries().size());
+ RepositoryQuery query = new RepositoryQuery(BugzillaCorePlugin.CONNECTOR_KIND, "bugzillaQuery");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ TasksUiPlugin.getExternalizationManager().save(true);
+
+ // reload tasklist and check that they persist
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, TasksUiPlugin.getTaskList().getQueries().size());
+
+ // removed/disable externalizers
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().removeRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+
+ // reload tasklist ensure query didn't load
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(0, TasksUiPlugin.getTaskList().getQueries().size());
+ // Save the task list (queries with missing connectors should get
+ // persisted)
+ TasksUiPlugin.getExternalizationManager().requestSave();
+
+ // re-enable connector
+ TasksUiPlugin.getRepositoryManager().addRepositoryConnector(connector);
+
+ // re-load tasklist
+ TaskTestUtil.saveAndReadTasklist();
+
+ // ensure that query now gets loaded
+ assertEquals(1, TasksUiPlugin.getTaskList().getQueries().size());
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java
new file mode 100644
index 0000000..7d2e64a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaQueryTest.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests.headless;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.bugzilla.tests.IBugzillaTestConstants;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaLanguageSettings;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+
+/**
+ * Example use of headless API (no ui dependencies)
+ *
+ * @author Rob Elves
+ * @author Nathan Hapke
+ */
+public class BugzillaQueryTest extends TestCase {
+
+ private TaskRepository repository;
+
+ @SuppressWarnings("unused")
+ private AbstractRepositoryConnector connectorOriginal;
+
+ private BugzillaRepositoryConnector connector;
+
+ @SuppressWarnings("unused")
+ private AbstractTaskDataHandler handler;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ connectorOriginal = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ BugzillaCorePlugin.CONNECTOR_KIND);
+
+ BugzillaLanguageSettings language = BugzillaCorePlugin.getDefault().getLanguageSetting(
+ IBugzillaConstants.DEFAULT_LANG);
+
+ connector = new BugzillaRepositoryConnector();
+ BugzillaRepositoryConnector.addLanguageSetting(language);
+ handler = connector.getTaskDataHandler();
+ repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username,
+ credentials.password), false);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+
+ }
+
+ /**
+ * This is the first test so that the repository credentials are correctly set for the other tests
+ */
+ public void testAddCredentials() {
+ AuthenticationCredentials auth = repository.getCredentials(AuthenticationType.REPOSITORY);
+ assertTrue(auth != null && auth.getPassword() != null && !auth.getPassword().equals("")
+ && auth.getUserName() != null && !auth.getUserName().equals(""));
+ }
+
+ public void testGetBug() throws Exception {
+ Set<String> taskIds = new HashSet<String>();
+ taskIds.add("1");
+ final Set<TaskData> changedTaskData = new HashSet<TaskData>();
+ TaskDataCollector collector = new TaskDataCollector() {
+
+ @Override
+ public void accept(TaskData taskData) {
+ changedTaskData.add(taskData);
+ }
+ };
+ connector.getTaskDataHandler().getMultiTaskData(repository, taskIds, collector, new NullProgressMonitor());
+ assertEquals(1, changedTaskData.size());
+ for (TaskData taskData : changedTaskData) {
+ String taskId = taskData.getTaskId();
+ if (taskId.equals("1")) {
+ assertEquals("user at mylar.eclipse.org", taskData.getRoot().getAttribute(
+ BugzillaAttribute.ASSIGNED_TO.getKey()).getValue());
+ assertEquals("foo", taskData.getRoot().getAttribute(BugzillaAttribute.LONG_DESC.getKey()).getValue());
+ // You can use the getAttributeValue to pull up the information on any
+ // part of the bug
+ assertEquals("P1", taskData.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+
+ } else {
+ fail("Unexpected TaskData returned");
+ }
+ }
+ }
+
+ public void testGetBugs() throws Exception {
+ Set<String> taskIds = new HashSet<String>();
+ taskIds.add("1");
+ taskIds.add("2");
+ taskIds.add("4");
+ final Set<TaskData> changedTaskData = new HashSet<TaskData>();
+ TaskDataCollector collector = new TaskDataCollector() {
+
+ @Override
+ public void accept(TaskData taskData) {
+ changedTaskData.add(taskData);
+ }
+ };
+ connector.getTaskDataHandler().getMultiTaskData(repository, taskIds, collector, new NullProgressMonitor());
+ assertEquals(3, changedTaskData.size());
+ for (TaskData taskData : changedTaskData) {
+ String taskId = taskData.getTaskId();
+ if (taskId.equals("1")) {
+ assertEquals("user at mylar.eclipse.org", taskData.getRoot().getAttribute(
+ BugzillaAttribute.ASSIGNED_TO.getKey()).getValue());
+ assertEquals("foo", taskData.getRoot().getAttribute(BugzillaAttribute.LONG_DESC.getKey()).getValue());
+ // You can use the getAttributeValue to pull up the information on any
+ // part of the bug
+ assertEquals("P1", taskData.getRoot().getAttribute(BugzillaAttribute.PRIORITY.getKey()).getValue());
+
+ } else if (taskId.equals("2")) {
+ assertEquals("nhapke at cs.ubc.ca", taskData.getRoot()
+ .getAttribute(BugzillaAttribute.ASSIGNED_TO.getKey())
+ .getValue());
+ assertEquals("search-match-test 1", taskData.getRoot().getAttribute(
+ BugzillaAttribute.LONG_DESC.getKey()).getValue());
+ } else if (taskId.equals("4")) {
+ assertEquals("relves at cs.ubc.ca", taskData.getRoot()
+ .getAttribute(BugzillaAttribute.REPORTER.getKey())
+ .getValue());
+ assertEquals("Test", taskData.getRoot().getAttribute(BugzillaAttribute.LONG_DESC.getKey()).getValue());
+ } else {
+ fail("Unexpected TaskData returned");
+ }
+
+ }
+ }
+
+ // README
+ // public void testPostBug() throws Exception {
+ // RepositoryTaskData taskData = handler.getTaskData(repository, "1");
+ // assertNotNull(taskData);
+ // assertEquals("user at mylar.eclipse.org", taskData.getAssignedTo());
+ // assertEquals("foo", taskData.getDescription());
+ // taskData.setSummary("New Summary");
+ // // post this modification back to the repository
+ // handler.postTaskData(repository, taskData);
+ //
+ // // You can use the getAttributeValue to pull up the information on any
+ // // part of the bug
+ // // assertEquals("P1",
+ // //
+ // taskData.getAttributeValue(BugzillaReportElement.PRIORITY.getKeyString()));
+ // }
+
+ public void testQueryViaConnector() throws Exception {
+ String queryUrlString = repository.getRepositoryUrl()
+ + "/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=search-match-test&product=TestProduct&long_desc_type=substring&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&deadlinefrom=&deadlineto=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=&emailassigned_to2=1&emailreporter2=1&emailcc2=1&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=";
+
+ // holds onto actual hit objects
+ BugzillaRepositoryConnector connector = new BugzillaRepositoryConnector();
+ RepositoryQuery query = new RepositoryQuery(repository.getConnectorKind(), "handle-testQueryViaConnector");
+ query.setUrl(queryUrlString);
+
+ final Set<TaskData> changedTaskData = new HashSet<TaskData>();
+ TaskDataCollector collector = new TaskDataCollector() {
+
+ @Override
+ public void accept(TaskData taskData) {
+ changedTaskData.add(taskData);
+ }
+ };
+
+ connector.performQuery(repository, query, collector, null, new NullProgressMonitor());
+ assertEquals(2, changedTaskData.size());
+ for (TaskData taskData : changedTaskData) {
+ assertTrue(taskData.getRoot().getAttribute(BugzillaAttribute.SHORT_DESC.getKey()).getValue().contains(
+ "search-match-test"));
+ }
+ }
+}
+
+// public void testValidateCredentials() throws IOException,
+// BugzillaException, KeyManagementException,
+// GeneralSecurityException {
+// BugzillaClient.validateCredentials(null, repository.getUrl(),
+// repository.getCharacterEncoding(),
+// repository.getUserName(), repository.getPassword());
+// }
+//
+// public void testValidateCredentialsInvalidProxy() throws IOException,
+// BugzillaException, KeyManagementException,
+// GeneralSecurityException {
+// BugzillaClient.validateCredentials(new Proxy(Proxy.Type.HTTP, new
+// InetSocketAddress("localhost", 12356)),
+// repository.getUrl(), repository.getCharacterEncoding(),
+// repository.getUserName(), repository
+// .getPassword());
+// }
+
+// public void testCredentialsEncoding() throws IOException,
+// BugzillaException, KeyManagementException,
+// GeneralSecurityException {
+// String poundSignUTF8 =
+// BugzillaClient.addCredentials(IBugzillaTestConstants.TEST_BUGZILLA_222_URL,
+// "UTF-8",
+// "testUser", "\u00A3");
+// assertTrue(poundSignUTF8.endsWith("password=%C2%A3"));
+// String poundSignISO =
+// BugzillaClient.addCredentials(IBugzillaTestConstants.TEST_BUGZILLA_222_URL,
+// "ISO-8859-1", "testUser", "\u00A3");
+// assertFalse(poundSignISO.contains("%C2%A3"));
+// assertTrue(poundSignISO.endsWith("password=%A3"));
+// }
diff --git a/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaTaskHistoryTest.java b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaTaskHistoryTest.java
new file mode 100644
index 0000000..e66c226
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/src/org/eclipse/mylyn/bugzilla/tests/headless/BugzillaTaskHistoryTest.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.tests.headless;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.eclipse.mylyn.bugzilla.tests.AbstractBugzillaTest;
+import org.eclipse.mylyn.bugzilla.tests.IBugzillaTestConstants;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.bugzilla.core.history.AssignmentEvent;
+import org.eclipse.mylyn.internal.bugzilla.core.history.ResolutionEvent;
+import org.eclipse.mylyn.internal.bugzilla.core.history.StatusEvent;
+import org.eclipse.mylyn.internal.bugzilla.core.history.TaskHistory;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+public class BugzillaTaskHistoryTest extends AbstractBugzillaTest {
+
+ private TaskRepository repository;
+
+ private BugzillaRepositoryConnector connector;
+
+ private static final String HISTORY_FILE_NAME = "storedHistory.history";
+
+ private static final String REPORT_ID = "1";
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ connector = new BugzillaRepositoryConnector();
+ repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaTestConstants.TEST_BUGZILLA_222_URL);
+
+ Credentials credentials = TestUtil.readCredentials();
+ repository.setAuthenticationCredentials(credentials.username, credentials.password);
+ }
+
+ public void testGetBugHistory() throws Exception {
+
+ BugzillaClient client = connector.getClientManager().getClient(repository, null);
+ assertNotNull(client);
+ TaskHistory history = client.getHistory("1", null);
+ assertNotNull(history);
+
+ assertEquals(1, history.getAssignmentEvents().size());
+ assertEquals(2, history.getStatusEvents().size());
+ assertEquals(1, history.getResolutionEvents().size());
+ assertEquals(12, history.getOtherEvents().size());
+ }
+
+ public void testAssignmentEvent() throws Exception {
+ BugzillaClient client = connector.getClientManager().getClient(repository, null);
+ assertNotNull(client);
+ TaskHistory history = client.getHistory("1", null);
+ assertNotNull(history);
+
+ AssignmentEvent assignment = history.getAssignmentEvents().get(0);
+ assertEquals("nhapke at cs.ubc.ca", assignment.getName());
+ assertEquals("user at mylar.eclipse.org", assignment.getAssigned());
+ assertEquals("2006-08-25 17:48:02", assignment.getDate());
+ assertEquals("nhapke at cs.ubc.ca", assignment.getRemoved());
+ assertEquals("user at mylar.eclipse.org", assignment.getAdded());
+ assertEquals("AssignedTo", assignment.getWhat());
+ }
+
+ public void testStatusEvent() throws Exception {
+
+ BugzillaClient client = connector.getClientManager().getClient(repository, null);
+ assertNotNull(client);
+ TaskHistory history = client.getHistory("1", null);
+ assertNotNull(history);
+
+ StatusEvent statusChange = history.getStatusEvents().get(0);
+ assertEquals("nhapke at cs.ubc.ca", statusChange.getName());
+ assertEquals("2006-08-25 19:18:05", statusChange.getDate());
+ assertEquals("NEW", statusChange.getRemoved());
+ assertEquals("ASSIGNED", statusChange.getAdded());
+ assertEquals("Status", statusChange.getWhat());
+ }
+
+ public void testResolutionEvent() throws Exception {
+ BugzillaClient client = connector.getClientManager().getClient(repository, null);
+ assertNotNull(client);
+ TaskHistory history = client.getHistory(REPORT_ID, null);
+ assertNotNull(history);
+
+ ResolutionEvent resolutionChange = history.getResolutionEvents().get(0);
+ assertEquals("janvik at cs.ubc.ca", resolutionChange.getName());
+ assertEquals("2007-02-15 14:52:51", resolutionChange.getDate());
+ assertEquals("", resolutionChange.getRemoved());
+ assertEquals("FIXED", resolutionChange.getAdded());
+ assertEquals("Resolution", resolutionChange.getWhat());
+ }
+
+ public void testStoredHistory() throws Exception {
+ BugzillaClient client = connector.getClientManager().getClient(repository, null);
+ assertNotNull(client);
+ TaskHistory history = client.getHistory(REPORT_ID, null);
+ assertNotNull(history);
+ storeHistory(history);
+
+ history = getStoredHistory();
+
+ assertEquals(1, history.getAssignmentEvents().size());
+ assertEquals(2, history.getStatusEvents().size());
+ assertEquals(1, history.getResolutionEvents().size());
+ assertEquals(12, history.getOtherEvents().size());
+
+ // Remove file
+ File storedHistoryFile = new File(HISTORY_FILE_NAME);
+ assertTrue(storedHistoryFile.delete());
+ }
+
+ private void storeHistory(TaskHistory history) throws FileNotFoundException, IOException {
+ File saveFile = new File(HISTORY_FILE_NAME);
+ saveFile.deleteOnExit();
+ ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(saveFile));
+ out.writeObject(history);
+ out.close();
+ }
+
+ private TaskHistory getStoredHistory() throws FileNotFoundException, IOException, ClassNotFoundException {
+ File file = new File(HISTORY_FILE_NAME);
+ ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
+ TaskHistory history = (TaskHistory) in.readObject();
+ in.close();
+ return history;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/configuration/rdfconfig218.txt b/org.eclipse.mylyn.bugzilla.tests/testdata/configuration/rdfconfig218.txt
new file mode 100644
index 0000000..bf41e9a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/configuration/rdfconfig218.txt
@@ -0,0 +1,461 @@
+<?xml version="1.0"?>
+<!-- Note: this interface is experimental and under development.
+ - We may and probably will make breaking changes to it in the future. -->
+
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:bz="http://www.bugzilla.org/rdf#">
+
+<bz:installation rdf:about="">
+<!-- NOTE: rdf:about="http://mylar.eclipse.org/bugs218/"
+ changed to "" for testing -->
+ <bz:install_version>2.18.5</bz:install_version>
+ <bz:maintainer>relves@cs.ubc.ca</bz:maintainer>
+
+ <bz:status>
+ <Seq>
+ <li>UNCONFIRMED</li>
+ <li>NEW</li>
+ <li>ASSIGNED</li>
+ <li>REOPENED</li>
+ <li>RESOLVED</li>
+ <li>VERIFIED</li>
+ <li>CLOSED</li>
+ </Seq>
+ </bz:status>
+
+ <bz:status_open>
+ <Seq>
+ <li>UNCONFIRMED</li>
+ <li>NEW</li>
+ <li>ASSIGNED</li>
+ <li>REOPENED</li>
+ </Seq>
+ </bz:status_open>
+
+ <bz:status_closed>
+ <Seq>
+ <li>RESOLVED</li>
+ <li>VERIFIED</li>
+ <li>CLOSED</li>
+ </Seq>
+ </bz:status_closed>
+
+ <bz:resolution>
+ <Seq>
+ <li></li>
+ <li>FIXED</li>
+ <li>INVALID</li>
+ <li>WONTFIX</li>
+ <li>LATER</li>
+ <li>REMIND</li>
+ <li>DUPLICATE</li>
+ <li>WORKSFORME</li>
+ <li>MOVED</li>
+ </Seq>
+ </bz:resolution>
+
+ <bz:keyword>
+ <Seq>
+ </Seq>
+ </bz:keyword>
+
+ <bz:platform>
+ <Seq>
+ <li>All</li>
+ <li>DEC</li>
+ <li>HP</li>
+ <li>Macintosh</li>
+ <li>PC</li>
+ <li>SGI</li>
+ <li>Sun</li>
+ <li>Other</li>
+ </Seq>
+ </bz:platform>
+
+ <bz:op_sys>
+ <Seq>
+ <li>All</li>
+ <li>Windows 3.1</li>
+ <li>Windows 95</li>
+ <li>Windows 98</li>
+ <li>Windows ME</li>
+ <li>Windows 2000</li>
+ <li>Windows NT</li>
+ <li>Windows XP</li>
+ <li>Windows Server 2003</li>
+ <li>Mac System 7</li>
+ <li>Mac System 7.5</li>
+ <li>Mac System 7.6.1</li>
+ <li>Mac System 8.0</li>
+ <li>Mac System 8.5</li>
+ <li>Mac System 8.6</li>
+ <li>Mac System 9.x</li>
+ <li>Mac OS X 10.0</li>
+ <li>Mac OS X 10.1</li>
+ <li>Mac OS X 10.2</li>
+ <li>Mac OS X 10.3</li>
+ <li>Linux</li>
+ <li>BSD/OS</li>
+ <li>FreeBSD</li>
+ <li>NetBSD</li>
+ <li>OpenBSD</li>
+ <li>AIX</li>
+ <li>BeOS</li>
+ <li>HP-UX</li>
+ <li>IRIX</li>
+ <li>Neutrino</li>
+ <li>OpenVMS</li>
+ <li>OS/2</li>
+ <li>OSF/1</li>
+ <li>Solaris</li>
+ <li>SunOS</li>
+ <li>other</li>
+ </Seq>
+ </bz:op_sys>
+
+ <bz:priority>
+ <Seq>
+ <li>P1</li>
+ <li>P2</li>
+ <li>P3</li>
+ <li>P4</li>
+ <li>P5</li>
+ </Seq>
+ </bz:priority>
+
+ <bz:severity>
+ <Seq>
+ <li>blocker</li>
+ <li>critical</li>
+ <li>major</li>
+ <li>normal</li>
+ <li>minor</li>
+ <li>trivial</li>
+ <li>enhancement</li>
+ </Seq>
+ </bz:severity>
+
+ <bz:products>
+ <Seq>
+ <li>
+ <bz:product rdf:about="http://mylar.eclipse.org/bugs218/product.cgi?name=TestProduct">
+ <bz:name>TestProduct</bz:name>
+
+ <bz:components>
+ <Seq>
+ <li resource="http://mylar.eclipse.org/bugs218/component.cgi?name=TestComponent"/>
+ </Seq>
+ </bz:components>
+
+ <bz:versions>
+ <Seq>
+ <li resource="http://mylar.eclipse.org/bugs218/version.cgi?name=other"/>
+ </Seq>
+ </bz:versions>
+
+
+ </bz:product>
+ </li>
+ <li>
+ <bz:product rdf:about="http://mylar.eclipse.org/bugs218/product.cgi?name=Test-Long-Named-Product-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA">
+ <bz:name>Test-Long-Named-Product-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</bz:name>
+
+ <bz:components>
+ <Seq>
+ <li resource="http://mylar.eclipse.org/bugs218/component.cgi?name=TestComponent"/>
+ </Seq>
+ </bz:components>
+
+ <bz:versions>
+ <Seq>
+ <li resource="http://mylar.eclipse.org/bugs218/version.cgi?name=other"/>
+ </Seq>
+ </bz:versions>
+
+
+ </bz:product>
+ </li>
+ </Seq>
+ </bz:products>
+
+ <bz:components>
+ <Seq>
+ <li>
+ <bz:component rdf:about="http://mylar.eclipse.org/bugs218/component.cgi?name=TestComponent">
+ <bz:name>TestComponent</bz:name>
+ </bz:component>
+ </li>
+ </Seq>
+ </bz:components>
+
+ <bz:versions>
+ <Seq>
+ <li>
+ <bz:version rdf:about="http://mylar.eclipse.org/bugs218/version.cgi?name=other">
+ <bz:name>other</bz:name>
+ </bz:version>
+ </li>
+ </Seq>
+ </bz:versions>
+
+
+ <bz:fields>
+ <Seq>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=bug_id">
+ <bz:name>bug_id</bz:name>
+ <bz:description>Bug ID</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=short_desc">
+ <bz:name>short_desc</bz:name>
+ <bz:description>Summary</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=product">
+ <bz:name>product</bz:name>
+ <bz:description>Product</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=version">
+ <bz:name>version</bz:name>
+ <bz:description>Version</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=rep_platform">
+ <bz:name>rep_platform</bz:name>
+ <bz:description>Hardware</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=bug_file_loc">
+ <bz:name>bug_file_loc</bz:name>
+ <bz:description>URL</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=op_sys">
+ <bz:name>op_sys</bz:name>
+ <bz:description>OS</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=bug_status">
+ <bz:name>bug_status</bz:name>
+ <bz:description>Status</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=status_whiteboard">
+ <bz:name>status_whiteboard</bz:name>
+ <bz:description>Whiteboard</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=keywords">
+ <bz:name>keywords</bz:name>
+ <bz:description>Keywords</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=resolution">
+ <bz:name>resolution</bz:name>
+ <bz:description>Resolution</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=bug_severity">
+ <bz:name>bug_severity</bz:name>
+ <bz:description>Severity</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=priority">
+ <bz:name>priority</bz:name>
+ <bz:description>Priority</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=component">
+ <bz:name>component</bz:name>
+ <bz:description>Component</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=assigned_to">
+ <bz:name>assigned_to</bz:name>
+ <bz:description>Assignee</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=reporter">
+ <bz:name>reporter</bz:name>
+ <bz:description>Reporter</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=votes">
+ <bz:name>votes</bz:name>
+ <bz:description>Votes</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=qa_contact">
+ <bz:name>qa_contact</bz:name>
+ <bz:description>QA Contact</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=cc">
+ <bz:name>cc</bz:name>
+ <bz:description>CC</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=dependson">
+ <bz:name>dependson</bz:name>
+ <bz:description>Depends on</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=blocked">
+ <bz:name>blocked</bz:name>
+ <bz:description>Blocks</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.description">
+ <bz:name>attachments.description</bz:name>
+ <bz:description>Attachment description</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.thedata">
+ <bz:name>attachments.thedata</bz:name>
+ <bz:description>Attachment data</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.filename">
+ <bz:name>attachments.filename</bz:name>
+ <bz:description>Attachment filename</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.mimetype">
+ <bz:name>attachments.mimetype</bz:name>
+ <bz:description>Attachment mime type</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.ispatch">
+ <bz:name>attachments.ispatch</bz:name>
+ <bz:description>Attachment is patch</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.isobsolete">
+ <bz:name>attachments.isobsolete</bz:name>
+ <bz:description>Attachment is obsolete</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=attachments.isprivate">
+ <bz:name>attachments.isprivate</bz:name>
+ <bz:description>Attachment is private</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=target_milestone">
+ <bz:name>target_milestone</bz:name>
+ <bz:description>Target Milestone</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=delta_ts">
+ <bz:name>delta_ts</bz:name>
+ <bz:description>Last Changed time</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=(to_days(now())%20-%20to_days(bugs.delta_ts))">
+ <bz:name>(to_days(now()) - to_days(bugs.delta_ts))</bz:name>
+ <bz:description>Days since bug changed</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=longdesc">
+ <bz:name>longdesc</bz:name>
+ <bz:description>Comment</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=alias">
+ <bz:name>alias</bz:name>
+ <bz:description>Alias</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=everconfirmed">
+ <bz:name>everconfirmed</bz:name>
+ <bz:description>Ever confirmed?</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=reporter_accessible">
+ <bz:name>reporter_accessible</bz:name>
+ <bz:description>Reporter accessible?</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=cclist_accessible">
+ <bz:name>cclist_accessible</bz:name>
+ <bz:description>CC list accessible?</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=bug_group">
+ <bz:name>bug_group</bz:name>
+ <bz:description>Group</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=flagtypes.name">
+ <bz:name>flagtypes.name</bz:name>
+ <bz:description>Flag</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=requestees.login_name">
+ <bz:name>requestees.login_name</bz:name>
+ <bz:description>Flag Requestee</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=setters.login_name">
+ <bz:name>setters.login_name</bz:name>
+ <bz:description>Flag Setter</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=content">
+ <bz:name>content</bz:name>
+ <bz:description>Content</bz:description>
+ </bz:field>
+ </li>
+ <li>
+ <bz:field rdf:about="http://mylar.eclipse.org/bugs218/field.cgi?name=owner_idle_time">
+ <bz:name>owner_idle_time</bz:name>
+ <bz:description>Time Since Owner Touched</bz:description>
+ </bz:field>
+ </li>
+ </Seq>
+ </bz:fields>
+</bz:installation>
+
+</RDF>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/contexts/.cvsignore b/org.eclipse.mylyn.bugzilla.tests/testdata/contexts/.cvsignore
new file mode 100644
index 0000000..47269cf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/contexts/.cvsignore
@@ -0,0 +1 @@
+downloadedContext.xml
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/contexts/empty.txt b/org.eclipse.mylyn.bugzilla.tests/testdata/contexts/empty.txt
new file mode 100644
index 0000000..e69de29
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-1-full.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-1-full.html
new file mode 100644
index 0000000..00fd1bc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-1-full.html
@@ -0,0 +1,719 @@
+<!-- 1.0 at bugzilla.org -->
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Bug 1 - Usability issue with external editors (1GE6IRL)</title>
+
+
+
+
+
+
+
+ </head>
+
+
+
+ <body bgcolor="#FFFFFF" onload="">
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" >
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" ><tr><td
+WIDTH="100%"><table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%"
+BGCOLOR="#006699" ><tr><td BGCOLOR="#000000" width="116" ><img
+src="images/EclipseBannerPic.jpg" width="115" height="50"></td><td
+WIDTH="637"><a href=http://www.eclipse.org><img SRC="images/gradient.jpg" BORDER=0 height=50
+width=282></a></td><td WIDTH="250"><img src="images/eproject-simple.gif"
+width="250" height="48"></td></tr></table></td></tr></table>
+
+ <table border="0" cellspacing="0">
+ <tr>
+ <td valign="top" align="left">
+ <table border="0" cellpadding="0" cellspacing="2">
+ <tr>
+ <td valign="top" align="left" nowrap="nowrap">
+ <font size="+1"><b>Bugzilla Bug 1</b></font>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td valign="middle"> </td>
+ <td valign="middle" align="left">Usability issue with external editors (1GE6IRL)</td>
+ </tr>
+ </table>
+<!-- 1.0 at bugzilla.org -->
+
+
+
+ <a href="query.cgi">Query page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<hr>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="20011025104050">
+ <input type="hidden" name="longdesclength" value="5">
+ <input type="hidden" name="id" value="1">
+
+
+
+ <table cellspacing="1" cellpadding="1" border="0">
+ <tr>
+ <td align="right">
+ <b>Bug#:</b>
+ </td>
+ <td>
+ <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=1">1</a>
+ </td>
+
+ <td> </td>
+
+ <td align="right">
+ <b>Platform:</b>
+ </td><td>
+ <select name="rep_platform">
+ <option value="All" selected>All
+ </option>
+ <option value="Macintosh">Macintosh
+ </option>
+ <option value="PC">PC
+ </option>
+ <option value="Power PC">Power PC
+ </option>
+ <option value="Sun">Sun
+ </option>
+ <option value="Other">Other
+ </option>
+ </select>
+ </td>
+ <td> </td>
+
+ <td align="right">
+ <b>Reporter:</b>
+ </td>
+ <td>andre_weinand at ch.ibm.com (Andre Weinand)
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>Product:</b>
+ </td><td>
+ <select name="product">
+ <option value="AJDT">AJDT
+ </option>
+ <option value="AspectJ">AspectJ
+ </option>
+ <option value="CDT">CDT
+ </option>
+ <option value="EMF">EMF
+ </option>
+ <option value="Equinox">Equinox
+ </option>
+ <option value="GEF">GEF
+ </option>
+ <option value="JDT">JDT
+ </option>
+ <option value="PDE">PDE
+ </option>
+ <option value="Platform" selected>Platform
+ </option>
+ <option value="Stellation">Stellation
+ </option>
+ <option value="XSD">XSD
+ </option>
+ </select>
+ </td>
+ <td> </td>
+
+ <td align="right">
+ <b>OS:</b>
+ </td><td>
+ <select name="op_sys">
+ <option value="All" selected>All
+ </option>
+ <option value="AIX Motif">AIX Motif
+ </option>
+ <option value="Windows 95">Windows 95
+ </option>
+ <option value="Windows 98">Windows 98
+ </option>
+ <option value="Windows CE">Windows CE
+ </option>
+ <option value="Windows ME">Windows ME
+ </option>
+ <option value="Windows 2000">Windows 2000
+ </option>
+ <option value="Windows NT">Windows NT
+ </option>
+ <option value="Windows XP">Windows XP
+ </option>
+ <option value="Windows All">Windows All
+ </option>
+ <option value="MacOS X">MacOS X
+ </option>
+ <option value="Linux">Linux
+ </option>
+ <option value="Linux-GTK">Linux-GTK
+ </option>
+ <option value="Linux-Motif">Linux-Motif
+ </option>
+ <option value="HP-UX">HP-UX
+ </option>
+ <option value="Neutrino">Neutrino
+ </option>
+ <option value="QNX-Photon">QNX-Photon
+ </option>
+ <option value="Solaris">Solaris
+ </option>
+ <option value="Unix All">Unix All
+ </option>
+ <option value="other">other
+ </option>
+ </select>
+ </td>
+ <td> </td>
+
+ <td align="right">
+ <b>Add CC:</b>
+ </td>
+ <td>
+ <input name="newcc" size="30" value="">
+ </td>
+ </tr>
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="describecomponents.cgi?product=Platform">
+ Component</a>:
+ </b>
+ </td>
+ <td>
+ <select name="component">
+ <option value="Ant">Ant
+ </option>
+ <option value="Compare">Compare
+ </option>
+ <option value="Core">Core
+ </option>
+ <option value="Debug">Debug
+ </option>
+ <option value="Doc">Doc
+ </option>
+ <option value="Help">Help
+ </option>
+ <option value="Releng">Releng
+ </option>
+ <option value="Scripting">Scripting
+ </option>
+ <option value="Search">Search
+ </option>
+ <option value="SWT">SWT
+ </option>
+ <option value="Text">Text
+ </option>
+ <option value="UI">UI
+ </option>
+ <option value="Update">Update
+ </option>
+ <option value="VCM" selected>VCM
+ </option>
+ <option value="WebDAV">WebDAV
+ </option>
+ </select>
+ </td>
+
+ <td> </td>
+
+ <td align="right">
+ <b>Version:</b>
+ </td><td>
+ <select name="version">
+ <option value="1.0">1.0
+ </option>
+ <option value="2.0" selected>2.0
+ </option>
+ <option value="2.0.1">2.0.1
+ </option>
+ <option value="2.0.2">2.0.2
+ </option>
+ <option value="2.1">2.1
+ </option>
+ </select>
+ </td>
+ <td> </td>
+
+ <td rowspan="4" align="right" valign="top">
+ <b>CC:</b>
+ </td>
+ <td rowspan="4" valign="top">
+ <select name="cc" multiple="multiple" size="5">
+ <option value="Kevin_McGuire at oti.com">Kevin_McGuire at oti.com</option>
+ </select>
+ <br>
+ <input type="checkbox" name="removecc">Remove selected CCs
+ <br>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="bug_status.html">Status</a>:
+ </b>
+ </td>
+ <td>VERIFIED</td>
+ <td> </td>
+
+ <td align="right">
+ <b><a href="bug_status.html#priority">Priority</a>:</b>
+ </td><td>
+ <select name="priority">
+ <option value="P1">P1
+ </option>
+ <option value="P2">P2
+ </option>
+ <option value="P3" selected>P3
+ </option>
+ <option value="P4">P4
+ </option>
+ <option value="P5">P5
+ </option>
+ </select>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="bug_status.html">Resolution</a>:
+ </b>
+ </td>
+ <td>FIXED</td>
+ <td> </td>
+
+ <td align="right">
+ <b><a href="bug_status.html#severity">Severity</a>:</b>
+ </td><td>
+ <select name="bug_severity">
+ <option value="blocker">blocker
+ </option>
+ <option value="critical">critical
+ </option>
+ <option value="major">major
+ </option>
+ <option value="normal" selected>normal
+ </option>
+ <option value="minor">minor
+ </option>
+ <option value="trivial">trivial
+ </option>
+ <option value="enhancement">enhancement
+ </option>
+ </select>
+ </td>
+ <td> </td>
+
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="bug_status.html#assigned_to">Assigned To</a>:
+ </b>
+ </td>
+ <td>James_Moody at ca.ibm.com (James Moody)</td>
+ <td> </td>
+
+ <td align="right">
+ <b>
+ <a href="notargetmilestone.html">Target Milestone</a>:
+ </b>
+ </td><td>
+ <select name="target_milestone">
+ <option value="2.0 M1">2.0 M1
+ </option>
+ <option value="2.0 M2">2.0 M2
+ </option>
+ <option value="2.0 M3">2.0 M3
+ </option>
+ <option value="2.0 M4">2.0 M4
+ </option>
+ <option value="2.0 M5">2.0 M5
+ </option>
+ <option value="2.0 M6">2.0 M6
+ </option>
+ <option value="2.0 F1">2.0 F1
+ </option>
+ <option value="2.0 F2">2.0 F2
+ </option>
+ <option value="2.0 F3">2.0 F3
+ </option>
+ <option value="2.0 F4">2.0 F4
+ </option>
+ <option value="2.0.1">2.0.1
+ </option>
+ <option value="2.0.2">2.0.2
+ </option>
+ <option value="2.1">2.1
+ </option>
+ <option value="2.1 M1">2.1 M1
+ </option>
+ <option value="2.1 M2">2.1 M2
+ </option>
+ <option value="2.1 M3">2.1 M3
+ </option>
+ <option value="2.1 M4">2.1 M4
+ </option>
+ <option value="2.1 M5">2.1 M5
+ </option>
+ <option value="2.1 RC1">2.1 RC1
+ </option>
+ <option value="2.1 RC2">2.1 RC2
+ </option>
+ <option value="2.1 RC3">2.1 RC3
+ </option>
+ <option value="2.1 RC4">2.1 RC4
+ </option>
+ <option value="2.1.1">2.1.1
+ </option>
+ <option value="2.2">2.2
+ </option>
+ <option value="---" selected>---
+ </option>
+ </select>
+ </td>
+ <td> </td>
+ </tr>
+
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+ URL:
+ </b>
+ </td>
+ <td colspan="7">
+ <input name="bug_file_loc"
+ value="" size="60">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>Summary:</b>
+ </td>
+ <td colspan="7">
+ <input name="short_desc"
+ value="Usability issue with external editors (1GE6IRL)" size="60">
+ </td>
+ </tr>
+
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="describekeywords.cgi">Keywords</a>:
+ </b>
+ <td colspan="7">
+ <input name="keywords"
+ value="" size="60">
+ </td>
+ </tr>
+ </table>
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+<br>
+<table cellspacing="0" cellpadding="4" border="1">
+ <tr>
+ <th bgcolor="#cccccc" align="left">Attachment</th>
+ <th bgcolor="#cccccc" align="left">Type</th>
+ <th bgcolor="#cccccc" align="left">Modified</th>
+ <th bgcolor="#cccccc" align="left">Status</th>
+ <th bgcolor="#cccccc" align="left">Actions</th>
+ </tr>
+
+
+ <tr>
+ <td colspan="4">
+ <a href="attachment.cgi?bugid=1&action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.)
+ </td>
+ <td colspan="1">
+ <a href="attachment.cgi?bugid=1&action=viewall">View All</a>
+ </td>
+ </tr>
+</table>
+<br>
+
+
+
+ <table>
+ <tr><th align="right">Bug 1 depends on:</th>
+ <td>
+ </td>
+ <td>
+ <input name="dependson"
+ value="">
+ </td>
+ <td rowspan="2">
+ <a href="showdependencytree.cgi?id=1">Show
+ dependency tree</a>
+
+ </td>
+ </tr>
+
+ <tr><th align="right">Bug 1 blocks:</th>
+ <td>
+ </td>
+ <td>
+ <input name="blocked"
+ value="">
+ </td>
+ </tr>
+ </table>
+
+ <table>
+ <tr>
+ <th>
+ <a href="votehelp.html">Votes</a>:
+ </th>
+ <td>0
+ <a href="votes.cgi?action=show_bug&bug_id=1">Show
+ votes for this bug</a>
+ <a href="votes.cgi?action=show_user&bug_id=1">Vote
+ for this bug</a>
+ </td>
+ </tr>
+ </table>
+
+
+
+ <br>
+ <b>Additional Comments:</b>
+ <br>
+ <textarea wrap="hard" name="comment" rows="10" cols="80"
+ accesskey="c"></textarea>
+ <br>
+
+
+
+
+ <br>
+ <input type="radio" name="knob" value="none" checked="checked">
+ Leave as <b>VERIFIED FIXED</b>
+ <br>
+
+
+
+ <input type="radio" name="knob" value="reopen"> Reopen bug
+ <br>
+ <input type="radio" name="knob" value="close">
+ Mark bug as <b>CLOSED</b><br>
+
+ <input type="submit" value="Commit">
+ <input type="hidden" name="form_name" value="process_bug">
+ <p>
+ <font size="+1">
+ <b>
+ <a href="show_activity.cgi?id=1">View Bug Activity</a>
+ |
+ <a href="long_list.cgi?buglist=1">Format For Printing</a>
+ </b>
+ </font>
+
+ </p>
+</form>
+
+
+
+<table>
+ <tr>
+ <td align="left">
+ <b>
+ <a name="c0" href="#c0">Description</a>:
+ </b>
+ </td>
+ <td align="right" width="100%">
+ Opened: 2001-10-10 21:34
+ </td>
+ </tr>
+</table>
+<hr>
+<!-- 1.0 at bugzilla.org -->
+
+<pre>- Setup a project that contains a *.gif resource
+ - release project to CVS
+ - edit the *.gif resource with an external editor, e.g. PaintShop
+ - save and close external editor
+ - in Navigator open the icon resource and verify that your changes are there
+ - release project
+ -> nothing to release!
+ - in Navigator open the icon resource and verify that your changes are still there
+
+ Problem: because I never "Refreshed from local", the workspace hasn't changed so "Release" didn't find anything.
+ However opening the resource with an external editor found the modified file on disk and showed the changes.
+
+ The real problem occurs if "Release" actually finds something to release but you don't spot that some resources are missing.
+ This is extremely error prone: one of my changes didn't made it into build 110 because of this!
+
+NOTES:
+EG (5/23/01 3:00:33 PM)
+ Release should do a refresh from local before doing the release.
+ Moving to VCM
+
+
+KM (05/27/01 5:10:19 PM)
+ Comments from JM in related email:
+
+ Should not do this for free. Could have a setting which made it optoinal but should nt be mandatory. Default setting could be to have it on.
+ Consider the SWT team who keep their workspaces on network drives. This will be slow.
+
+ Side effects will be that a build runs when the refresh is completed unless you somehow do it in a workspace runnable and don't end the
+ runnable until after the release. This would be less than optimal as some builders may be responsible for maintaining some invariants and deriving resources which are releasable. If you don't run the builders before releasing, the invariants will not be maintained and you will release inconsistent state.
+
+ Summary: Offer to "ensure local consistency" before releasing.
+
+KM (5/31/01 1:30:35 PM)
+ See also 1GEAG1A: ITPVCM:WINNT - Internal error comparing with a document
+ which failed with an error. Never got log from Tod though.</pre>
+ <br>
+ <i>------- Additional Comment
+ <a name="c1" href="#c1">#1</a> From
+ <a href="mailto:James_Moody at ca.ibm.com">James Moody</a>
+ 2001-10-19 10:32 -------
+ </i>
+
+
+<pre>*** <strike><a href="show_bug.cgi?id=183" title="RESOLVED DUPLICATE - readme: must refresh from local if using external editors (1GFBQNI)">Bug 183</a></strike> has been marked as a duplicate of this bug. ***</pre>
+ <br>
+ <i>------- Additional Comment
+ <a name="c2" href="#c2">#2</a> From
+ <a href="mailto:James_Moody at ca.ibm.com">James Moody</a>
+ 2001-10-19 16:36 -------
+ </i>
+
+
+<pre>Implemented 'auto refresh' option. Default value is off.</pre>
+ <br>
+ <i>------- Additional Comment
+ <a name="c3" href="#c3">#3</a> From
+ <a href="mailto:dj_houghton at ca.ibm.com">DJ Houghton</a>
+ 2001-10-23 23:39 -------
+ </i>
+
+
+<pre>PRODUCT VERSION:
+ 109
+
+</pre>
+ <br>
+ <i>------- Additional Comment
+ <a name="c4" href="#c4">#4</a> From
+ <a href="mailto:James_Moody at ca.ibm.com">James Moody</a>
+ 2001-10-25 10:19 -------
+ </i>
+
+
+<pre>Fixed in v206</pre>
+
+<hr>
+<!-- 1.0 at bugzilla.org -->
+
+
+
+ <a href="query.cgi">Query page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<br>
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<table border="0">
+ <tr>
+ <td bgcolor="#000000" valign="top">
+ <table border="0" cellpadding="10" cellspacing="0" width="100%"
+ bgcolor="lightyellow">
+ <tr>
+ <td>
+
+
+
+ This is <b>Bugzilla</b>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see
+ <a href="http://www.bugzilla.org/">bugzilla.org</a>.
+
+
+
+ <br>
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<form method="get" action="show_bug.cgi">
+ <table width="100%">
+ <tr>
+ <td>
+ Actions:
+ </td>
+
+ <td valign="middle" nowrap>
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Query</a> |
+
+ <input type="submit" value="Find"> bug #
+ <input name="id" size="6"> |
+
+ <a href="reports.cgi">Reports</a>
+
+ </td>
+
+ <td> </td>
+
+ <td valign="middle" align="right">
+ <a href="createaccount.cgi">New Account</a> |
+ <a href="query.cgi?GoAheadAndLogIn=1">Log In</a>
+ </td>
+ </tr>
+
+ </table>
+</form>
+
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-eclipse.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-eclipse.html
new file mode 100644
index 0000000..156212e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-eclipse.html
@@ -0,0 +1,158 @@
+<!-- 1.0 at bugzilla.org -->
+
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Error</title>
+
+
+
+
+
+
+
+ </head>
+
+
+
+ <body bgcolor="#FFFFFF" onload="">
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" >
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" ><tr><td
+WIDTH="100%"><table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%"
+BGCOLOR="#006699" ><tr><td BGCOLOR="#000000" width="116" ><img
+src="images/EclipseBannerPic.jpg" width="115" height="50"></td><td
+WIDTH="637"><a href=http://www.eclipse.org><img SRC="images/gradient.jpg" BORDER=0 height=50
+width=282></a></td><td WIDTH="250"><img src="images/eproject-simple.gif"
+width="250" height="48"></td></tr></table></td></tr></table>
+
+ <table border="0" cellspacing="0">
+ <tr>
+ <td valign="top" align="left">
+ <table border="0" cellpadding="0" cellspacing="2">
+ <tr>
+ <td valign="top" align="left" nowrap="nowrap">
+ <font size="+1"><b>Error</b></font>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td valign="middle"> </td>
+ <td valign="middle" align="left"></td>
+ </tr>
+ </table>
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">Bug #666 does not exist.
+ </font>
+ </td>
+ </tr>
+</table>
+
+<p>
+ Please press <b>Back</b> and try again.
+</p>
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<table border="0">
+ <tr>
+ <td bgcolor="#000000" valign="top">
+ <table border="0" cellpadding="10" cellspacing="0" width="100%"
+ bgcolor="lightyellow">
+ <tr>
+ <td>
+
+
+
+ This is <b>Bugzilla</b>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see
+ <a href="http://www.bugzilla.org/">bugzilla.org</a>.
+
+
+
+ <br>
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<form method="get" action="show_bug.cgi">
+ <table width="100%">
+ <tr>
+ <td>
+ Actions:
+ </td>
+
+ <td valign="middle" nowrap>
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Query</a> |
+
+ <input type="submit" value="Find"> bug #
+ <input name="id" size="6"> |
+
+ <a href="reports.cgi">Reports</a>
+
+ | <a href="votes.cgi?action=show_user">My Votes</a>
+ </td>
+
+ <td> </td>
+
+
+ <td valign="middle">
+ Edit <a href="userprefs.cgi">prefs</a>
+
+ | <a href="relogin.cgi">Log out</a> cubranic at cs.ubc.ca
+ </td>
+ </tr>
+
+
+
+
+ <tr>
+ <td>
+ Preset Queries:
+ </td>
+
+ <td colspan="3">
+ <a href="buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=cubranic%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</a>
+
+ </td>
+ </tr>
+
+
+ </table>
+</form>
+
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-hipikat.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-hipikat.html
new file mode 100644
index 0000000..e6261be
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/bug-not-found-hipikat.html
@@ -0,0 +1,142 @@
+<!-- 1.0 at bugzilla.org -->
+
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Error</title>
+
+
+
+
+
+
+
+ </head>
+
+
+
+ <body bgcolor="#FFFFFF" onload="">
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+ <table bgcolor="#000000" width="100%" border="0" cellpadding="0"
+ cellspacing="0">
+ <tr>
+ <td>
+ <font color="#FFFFFF" size="8"><center>
+ Bugzilla Version 2.16.3
+ </center></font>
+ </td>
+ </tr>
+ </table>
+
+ <table border="0" cellspacing="0">
+ <tr>
+ <td valign="top" align="left">
+ <table border="0" cellpadding="0" cellspacing="2">
+ <tr>
+ <td valign="top" align="left" nowrap="nowrap">
+ <font size="+1"><b>Error</b></font>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td valign="middle"> </td>
+ <td valign="middle" align="left"></td>
+ </tr>
+ </table>
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">Bug #666 does not exist.
+ </font>
+ </td>
+ </tr>
+</table>
+
+<p>
+ Please press <b>Back</b> and try again.
+</p>
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<table border="0">
+ <tr>
+ <td bgcolor="#000000" valign="top">
+ <table border="0" cellpadding="10" cellspacing="0" width="100%"
+ bgcolor="lightyellow">
+ <tr>
+ <td>
+
+
+
+ This is <b>Bugzilla</b>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see
+ <a href="http://www.bugzilla.org/">bugzilla.org</a>.
+
+
+
+ <br>
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<form method="get" action="show_bug.cgi">
+ <table width="100%">
+ <tr>
+ <td>
+ Actions:
+ </td>
+
+ <td valign="middle" nowrap>
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Query</a> |
+
+ <input type="submit" value="Find"> bug #
+ <input name="id" size="6"> |
+
+ <a href="reports.cgi">Reports</a>
+
+ </td>
+
+ <td> </td>
+
+ <td valign="middle" align="right">
+ <a href="createaccount.cgi">New Account</a> |
+ <a href="query.cgi?GoAheadAndLogIn=1">Log In</a>
+ </td>
+ </tr>
+
+ </table>
+</form>
+
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/cdt-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/cdt-page.html
new file mode 100644
index 0000000..3a1d20f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/cdt-page.html
@@ -0,0 +1,184 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0055)https://bugs.eclipse.org/bugs/enter_bug.cgi?product=CDT -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Enter Bug</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="Enter Bug_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="Enter Bug_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48
+ src="Enter Bug_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Enter
+ Bug</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>This page lets you enter a new bug into
+ Bugzilla.</TD></TR></TBODY></TABLE>
+<FORM action=post_bug.cgi method=post><INPUT type=hidden value=CDT name=product>
+
+<TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><!-- 1.0 at bugzilla.org -->Before reporting a bug, please read
+ the <A href="https://bugs.eclipse.org/bugs/bugwritinghelp.html">bug
+ writing guidelines</A>, please look at the list of <A
+ href="https://bugs.eclipse.org/bugs/duplicates.cgi">most frequently
+ reported bugs</A>, and please <A
+ href="https://bugs.eclipse.org/bugs/query.cgi">search</A> for the bug.
+ </TD></TR>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Reporter:</STRONG></TD>
+ <TD vAlign=top>tanya at cs.ubc.ca</TD>
+ <TD vAlign=top align=right><STRONG>Product:</STRONG></TD>
+ <TD vAlign=top>CDT</TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Version:</STRONG> </TD>
+ <TD><SELECT size=5 name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=1.0.1>1.0.1</OPTION> <OPTION value=1.1>1.1</OPTION> <OPTION
+ value=1.2>1.2</OPTION> <OPTION value=2.0 selected>2.0</OPTION></SELECT>
+</TD>
+ <TD vAlign=top align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=CDT">Component</A>:
+ </STRONG></TD>
+ <TD><SELECT size=5 name=component> <OPTION
+ value=CDT-parser>CDT-parser</OPTION> <OPTION value=Core>Core</OPTION>
+ <OPTION value=Cpp-Extensions>Cpp-Extensions</OPTION> <OPTION
+ value=Debug>Debug</OPTION> <OPTION value=Debug-MI>Debug-MI</OPTION>
+ <OPTION value=Doc>Doc</OPTION> <OPTION
+ value=Generic-Extensions>Generic-Extensions</OPTION> <OPTION
+ value=Launcher>Launcher</OPTION> <OPTION value=UI>UI</OPTION></SELECT>
+ </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#rep_platform">Platform</A>:
+ </STRONG></TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#op_sys">OS</A>:
+ </STRONG></TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD></TR>
+ <TR><INPUT type=hidden value=P3 name=priority>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#bug_severity">Severity</A>:
+ </STRONG></TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR><INPUT type=hidden value=NEW name=bug_status>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned
+ To</A>: </STRONG></TD>
+ <TD colSpan=3><INPUT size=32 name=assigned_to> (Leave blank to assign to
+ default component owner) </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Cc:</STRONG></TD>
+ <TD colSpan=3><INPUT size=45 name=cc> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD colSpan=3><INPUT type=hidden size=60 name=bug_file_loc input> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Summary:</STRONG></TD>
+ <TD colSpan=3><INPUT size=60 name=short_desc> </TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Description:</STRONG></TD>
+ <TD colSpan=3><TEXTAREA name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+ <BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><INPUT onclick="if (this.form.short_desc.value == '') { alert('Please enter a summary sentence for this bug.'); return false; } return true;" type=submit value=" Commit ">
+ <INPUT type=submit value="Remember values as bookmarkable template" name=maketemplate>
+ </TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><BR>We've made a guess at your operating system and
+ platform. Please check them and, if we got it wrong, email
+ webmaster at eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user">My
+ Votes</A> </TD>
+ <TD> </TD>
+ <TD vAlign=center>Edit <A
+ href="https://bugs.eclipse.org/bugs/userprefs.cgi">prefs</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/relogin.cgi">Log out</A> tanya at cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=tanya%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/enter-bug220.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/enter-bug220.html
new file mode 100644
index 0000000..e9c1deb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/enter-bug220.html
@@ -0,0 +1,441 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>Enter Bug: TestProduct</title>
+
+
+<link rel="Top" href="http://you-havent-visited-editparams.cgi-yet/">
+
+
+
+
+
+
+
+
+ <link rel="Saved Searches" title="My Bugs"
+ href="buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=relves%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">
+
+
+ <link rel="Administration" title="Parameters"
+ href="editparams.cgi"><link rel="Administration" title="Users"
+ href="editusers.cgi"><link rel="Administration" title="Products"
+ href="editproducts.cgi"><link rel="Administration" title="Flag Types"
+ href="editflagtypes.cgi"><link rel="Administration" title="Groups"
+ href="editgroups.cgi"><link rel="Administration" title="Keywords"
+ href="editkeywords.cgi"><link rel="Administration" title="Whining"
+ href="editwhines.cgi"><link rel="Administration" title="Sanity Check"
+ href="sanitycheck.cgi">
+
+
+
+ <script type="text/javascript">
+ <!--
+
+ function initHelp() {}
+ // -->
+ </script>
+
+ <link href="skins/standard/global.css" rel="stylesheet" type="text/css">
+ <link href="skins/custom/global.css" rel="stylesheet" type="text/css">
+
+
+
+
+
+ </head>
+
+
+
+ <body onload="set_assign_to();"
+ class="you-havent-visited-editparams-cgi-yet">
+
+
+<div id="banner">
+ <div class="intro"></div>
+ <p id="banner-name">
+ <span>This is Bugzilla</span>
+ </p>
+ <p id="banner-version">
+ <a href="http://www.bugzilla.org/"><span>Bugzilla</span></a>
+
+ <span>Version 2.20</span>
+ </p>
+ <div class="outro"></div>
+ </div>
+
+<div id="header">
+ <h1>Enter Bug: TestProduct</h1>
+
+ <h2>This page lets you enter a new bug into Bugzilla.</h2>
+
+</div>
+
+<script type="text/javascript">
+<!--
+
+var initialowners = new Array(1);
+var last_initialowner;
+var components = new Array(1);
+ components[0] = "TestComponent";
+ initialowners[0] = "relves\x40cs.ubc.ca";
+
+function set_assign_to() {
+ // Based on the selected component, fill the "Assign To:" field
+ // with the default component owner, and the the "QA Contact:" field
+ // with the default QA Contact.
+ var form = document.Create;
+ var assigned_to = form.assigned_to.value;
+
+
+ var index = -1;
+ if (form.component.type == 'select-one') {
+ index = form.component.selectedIndex;
+ } else if (form.component.type == 'hidden') {
+ // Assume there is only one component in the list
+ index = 0;
+ }
+ if (index != -1) {
+ var owner = initialowners[index];
+ var component = components[index];
+ if (assigned_to == last_initialowner
+ || assigned_to == owner
+ || assigned_to == '') {
+ form.assigned_to.value = owner;
+ last_initialowner = owner;
+ }
+ }
+}
+-->
+</script>
+
+<form name="Create" id="Create" method="post" action="post_bug.cgi">
+<input type="hidden" name="product" value="TestProduct">
+
+<table cellspacing="2" cellpadding="0" border="0">
+
+ <tr>
+ <td><br></td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ Before reporting a bug, please read the
+<a href="page.cgi?id=bug-writing.html">bug writing guidelines</a>, please look at the list of
+<a href="duplicates.cgi">most frequently reported bugs</a>, and please
+<a href="query.cgi">search</a> for the bug.
+ </td>
+
+ </tr>
+
+ <tr>
+ <td><br></td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top"><strong>Reporter:</strong></td>
+ <td valign="top">relves@cs.ubc.ca</td>
+
+ <td align="right" valign="top"><strong>Product:</strong></td>
+ <td valign="top">TestProduct</td>
+ </tr>
+
+
+ <tr>
+ <td align="right" valign="top">
+ <strong>Version:</strong>
+
+ </td>
+ <td>
+ <select name="version" size="5">
+ <option value="other" selected="selected">other </option>
+ </select>
+ </td>
+
+ <td align="right" valign="top">
+ <strong>
+
+ <a href="describecomponents.cgi?product=TestProduct">
+ Component</a>:
+ </strong>
+ </td>
+ <td>
+ <select name="component" onchange="set_assign_to();" size="5">
+ <option value="TestComponent" selected="selected">TestComponent </option>
+ </select>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+ <tr><td align="right">
+ <strong>
+
+ <a href="page.cgi?id=fields.html#rep_platform">Platform</a>:
+ </strong>
+ </td>
+
+ <td>
+ <select name="rep_platform">
+ <option value="All">All</option>
+ <option value="PC" selected="selected">PC</option>
+
+ <option value="Macintosh">Macintosh</option>
+ <option value="Other">Other</option>
+ </select>
+ </td>
+<td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#op_sys">OS</a>:
+ </strong>
+
+ </td>
+
+ <td>
+ <select name="op_sys">
+ <option value="All">All</option>
+ <option value="Windows" selected="selected">Windows</option>
+ <option value="Mac OS">Mac OS</option>
+ <option value="Linux">Linux</option>
+
+ <option value="Other">Other</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr><td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#priority">Priority</a>:
+ </strong>
+
+ </td>
+
+ <td>
+ <select name="priority">
+ <option value="P1">P1</option>
+ <option value="P2" selected="selected">P2</option>
+ <option value="P3">P3</option>
+ <option value="P4">P4</option>
+
+ <option value="P5">P5</option>
+ </select>
+ </td>
+<td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#bug_severity">Severity</a>:
+ </strong>
+ </td>
+
+ <td>
+ <select name="bug_severity">
+ <option value="blocker">blocker</option>
+ <option value="critical">critical</option>
+ <option value="major">major</option>
+ <option value="normal" selected="selected">normal</option>
+ <option value="minor">minor</option>
+
+ <option value="trivial">trivial</option>
+ <option value="enhancement">enhancement</option>
+ </select>
+ </td>
+ </tr>
+
+
+ <tr>
+ <td> </td>
+
+ <td colspan="3"></td>
+ </tr>
+
+ <tr>
+ <input type="hidden" name="bug_status"
+ value="NEW">
+ <td align="right" valign="top"><strong>Initial State:</strong></td>
+ <td valign="top">NEW</td>
+ <td colspan="2"></td>
+
+ </tr>
+
+ <tr>
+ <td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#assigned_to">Assign To</a>:
+ </strong>
+ </td>
+ <td colspan="3"><input
+ name="assigned_to"
+ value="" size="32"
+>
+
+ <noscript>(Leave blank to assign to component's default assignee)</noscript>
+ </td>
+ </tr>
+
+
+ <tr>
+ <td align="right"><strong>Cc:</strong></td>
+ <td colspan="3"><input
+ name="cc"
+ value="" size="45"
+>
+ </td>
+
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+
+ <tr>
+ <td align="right"><strong>URL:</strong></td>
+
+ <td colspan="3">
+ <input name="bug_file_loc" size="60"
+ value="http://">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right"><strong>Summary:</strong></td>
+ <td colspan="3">
+ <input name="short_desc" size="60" value="">
+
+ </td>
+ </tr>
+
+ <tr><td align="right" valign="top"><strong>Description:</strong></td>
+ <td colspan="3">
+ <textarea name="comment" rows="10" cols="80"></textarea>
+ <br>
+ </td>
+
+ </tr>
+
+ <input type="hidden" name="commentprivacy" value="0">
+
+ <tr>
+ <td align="right">
+ <strong>Depends on:</strong>
+ </td>
+ <td>
+
+ <input name="dependson" accesskey="d" value="">
+ </td>
+ </tr>
+ <tr>
+ <td align="right">
+ <strong>Blocks:</strong>
+ </td>
+ <td>
+
+ <input name="blocked" accesskey="b" value="">
+ </td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ </td>
+ </tr>
+
+
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ <input type="submit" value=" Commit "
+ onclick="if (this.form.short_desc.value == '')
+ { alert('Please enter a summary sentence for this bug.');
+ return false; } return true;">
+
+ <input type="submit" name="maketemplate"
+ value="Remember values as bookmarkable template">
+ </td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ <br>
+ We've made a guess at your
+ operating system and platform. Please check them
+ and, if we got it wrong, email
+ THE MAINTAINER HAS NOT YET BEEN SET.
+ </td>
+ </tr>
+
+ </table>
+
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+
+<div id="footer">
+ <div class="intro"></div>
+
+
+
+
+<form method="get" action="show_bug.cgi">
+<div id="useful-links">
+ <div id="links-actions">
+ <div class="label">Actions:</div>
+
+ <div class="links">
+ <a href="./">Home</a> |
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Search</a> |
+ bug # <input class="txt" name="id" size="6">
+ <input class="btn" type="submit" value="Find"> |
+
+ <a href="report.cgi">Reports</a>
+
+ | <a href="request.cgi?requester=relves%40cs.ubc.ca&requestee=relves%40cs.ubc.ca&do_union=1&group=type">My Requests</a>
+
+
+ | <a href="votes.cgi?action=show_user">My Votes</a>
+ | <a href="sanitycheck.cgi">Sanity check</a>
+ | <a href="relogin.cgi">Log out</a> relves@cs.ubc.ca
+ </div>
+ </div>
+
+
+ <div id="links-edit">
+ <div class="label">Edit:</div>
+ <div class="links">
+
+ <a href="userprefs.cgi">Prefs</a> | <a href="editparams.cgi">Parameters</a> | <a href="editsettings.cgi">User Preferences</a> | <a href="editusers.cgi">Users</a> | <a href="editproducts.cgi">Products</a> | <a href="editflagtypes.cgi">Flags</a> | <a href="editvalues.cgi">Field Values</a> | <a href="editgroups.cgi">Groups</a> | <a href="editkeywords.cgi">Keywords</a> | <a href="editwhines.cgi">Whining</a>
+
+ </div>
+ </div>
+
+
+
+
+ <div id="links-saved">
+ <div class="label">
+ Saved Searches:
+ </div>
+ <div class="links">
+ <a href="buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=relves%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</a>
+
+ </div>
+ </div>
+
+
+</div>
+</form>
+
+ <div class="outro"></div>
+</div>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/enter-bug2201.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/enter-bug2201.html
new file mode 100644
index 0000000..b942b2a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/enter-bug2201.html
@@ -0,0 +1,493 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>Enter Bug: Mylar</title>
+
+
+<link rel="Top" href="https://bugs.eclipse.org/bugs/">
+
+
+
+
+
+
+
+
+ <link rel="Saved Searches" title="My Bugs"
+ href="buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=relves%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">
+
+ <link rel="Saved Searches"
+ title="AssignedToMe"
+ href="buglist.cgi?cmdtype=runnamed&namedcmd=AssignedToMe">
+
+
+
+ <script type="text/javascript">
+ <!--
+
+ function initHelp() {}
+ // -->
+ </script>
+
+ <link href="skins/standard/global.css" rel="stylesheet" type="text/css">
+ <link href="skins/custom/global.css" rel="stylesheet" type="text/css">
+
+
+
+
+
+ </head>
+
+
+
+ <body onload="set_assign_to();"
+ class="bugs-eclipse-org-bugs">
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr style="background-image: url(/bugs/header_bg.gif);">
+ <td>
+ <a href="http://www.eclipse.org/"><img src="/bugs/header_logo.gif" width="164" height="68" border="0" /></a>
+ </td>
+ <td align="right" style="color: white; font-family: verdana,arial,helvetica; font-size: 1.25em; font-style: italic;"><b>Eclipse bugs</b></font> <br /><font style="font-size: .5em;">Bugzilla 2.20.1  </font></td>
+
+ </tr>
+</table>
+
+<div id="header">
+ <h1>Enter Bug: Mylar</h1>
+
+ <h2>This page lets you enter a new bug into Bugzilla.</h2>
+
+</div>
+
+<script type="text/javascript">
+<!--
+
+var initialowners = new Array(10);
+var last_initialowner;
+var components = new Array(10);
+ var initialqacontacts = new Array(10);
+ var last_initialqacontact;
+ components[0] = "Bugzilla";
+ initialowners[0] = "beatmik\x40acm.org";
+ initialqacontacts[0] = "";
+ components[1] = "Core";
+ initialowners[1] = "beatmik\x40acm.org";
+ initialqacontacts[1] = "";
+ components[2] = "Doc";
+ initialowners[2] = "beatmik\x40acm.org";
+ initialqacontacts[2] = "";
+ components[3] = "Java";
+ initialowners[3] = "beatmik\x40acm.org";
+ initialqacontacts[3] = "";
+ components[4] = "Jira";
+ initialowners[4] = "beatmik\x40acm.org";
+ initialqacontacts[4] = "";
+ components[5] = "Monitor";
+ initialowners[5] = "beatmik\x40acm.org";
+ initialqacontacts[5] = "";
+ components[6] = "Tasks";
+ initialowners[6] = "beatmik\x40acm.org";
+ initialqacontacts[6] = "";
+ components[7] = "UI";
+ initialowners[7] = "beatmik\x40acm.org";
+ initialqacontacts[7] = "";
+ components[8] = "XML";
+ initialowners[8] = "beatmik\x40acm.org";
+ initialqacontacts[8] = "";
+ components[9] = "Zest";
+ initialowners[9] = "irbull\x40cs.uvic.ca";
+ initialqacontacts[9] = "";
+
+function set_assign_to() {
+ // Based on the selected component, fill the "Assign To:" field
+ // with the default component owner, and the the "QA Contact:" field
+ // with the default QA Contact.
+ var form = document.Create;
+ var assigned_to = form.assigned_to.value;
+
+ var qa_contact = form.qa_contact.value;
+
+ var index = -1;
+ if (form.component.type == 'select-one') {
+ index = form.component.selectedIndex;
+ } else if (form.component.type == 'hidden') {
+ // Assume there is only one component in the list
+ index = 0;
+ }
+ if (index != -1) {
+ var owner = initialowners[index];
+ var component = components[index];
+ if (assigned_to == last_initialowner
+ || assigned_to == owner
+ || assigned_to == '') {
+ form.assigned_to.value = owner;
+ last_initialowner = owner;
+ }
+ var contact = initialqacontacts[index];
+ if (qa_contact == last_initialqacontact
+ || qa_contact == contact
+ || qa_contact == '') {
+ form.qa_contact.value = contact;
+ last_initialqacontact = contact;
+ }
+ }
+}
+-->
+</script>
+
+<form name="Create" id="Create" method="post" action="post_bug.cgi">
+<input type="hidden" name="product" value="Mylar">
+
+<table cellspacing="2" cellpadding="0" border="0">
+
+ <tr>
+ <td><br></td>
+ </tr>
+
+ <tr>
+ <td></td>
+
+ <td colspan="3">
+ Before reporting a bug, please read the
+<a href="page.cgi?id=bug-writing.html">bug writing guidelines</a>, please look at the list of
+<a href="duplicates.cgi">most frequently reported bugs</a>, and please
+<a href="query.cgi">search</a> for the bug.
+ </td>
+ </tr>
+
+ <tr>
+
+ <td><br></td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top"><strong>Reporter:</strong></td>
+ <td valign="top">relves@cs.ubc.ca</td>
+
+ <td align="right" valign="top"><strong>Product:</strong></td>
+
+ <td valign="top">Mylar</td>
+ </tr>
+
+
+ <tr>
+ <td align="right" valign="top">
+ <strong>Version:</strong>
+ </td>
+ <td>
+
+ <select name="version" size="5">
+ <option value="0.2">0.2 </option>
+ <option value="0.3">0.3 </option>
+ <option value="0.4" selected="selected">0.4 </option>
+ <option value="unspecified">unspecified </option>
+ </select>
+ </td>
+
+ <td align="right" valign="top">
+ <strong>
+ <a href="describecomponents.cgi?product=Mylar">
+ Component</a>:
+ </strong>
+ </td>
+ <td>
+ <select name="component" onchange="set_assign_to();" size="5">
+
+ <option value="Bugzilla">Bugzilla </option>
+ <option value="Core">Core </option>
+ <option value="Doc">Doc </option>
+ <option value="Java">Java </option>
+ <option value="Jira">Jira </option>
+ <option value="Monitor">Monitor </option>
+
+ <option value="Tasks">Tasks </option>
+ <option value="UI">UI </option>
+ <option value="XML">XML </option>
+ <option value="Zest">Zest </option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+ <tr><td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#rep_platform">Platform</a>:
+ </strong>
+
+ </td>
+
+ <td>
+ <select name="rep_platform">
+ <option value="All">All</option>
+ <option value="Macintosh">Macintosh</option>
+ <option value="Other">Other</option>
+ <option value="PC" selected="selected">PC</option>
+
+ <option value="Power PC">Power PC</option>
+ <option value="Sun">Sun</option>
+ </select>
+ </td>
+<td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#op_sys">OS</a>:
+ </strong>
+
+ </td>
+
+ <td>
+ <select name="op_sys">
+ <option value="All">All</option>
+ <option value="AIX Motif">AIX Motif</option>
+ <option value="HP-UX">HP-UX</option>
+ <option value="Linux">Linux</option>
+
+ <option value="Linux-GTK">Linux-GTK</option>
+ <option value="Linux-Motif">Linux-Motif</option>
+ <option value="Mac OS">Mac OS</option>
+ <option value="MacOS X">MacOS X</option>
+ <option value="Neutrino">Neutrino</option>
+ <option value="other">other</option>
+
+ <option value="QNX-Photon">QNX-Photon</option>
+ <option value="Solaris">Solaris</option>
+ <option value="Solaris-GTK">Solaris-GTK</option>
+ <option value="Solaris-Motif">Solaris-Motif</option>
+ <option value="SymbianOS-Series 80">SymbianOS-Series 80</option>
+ <option value="Unix All">Unix All</option>
+
+ <option value="Windows All">Windows All</option>
+ <option value="Windows 95">Windows 95</option>
+ <option value="Windows 98">Windows 98</option>
+ <option value="Windows 2000">Windows 2000</option>
+ <option value="Windows 2003 Server">Windows 2003 Server</option>
+ <option value="Windows CE">Windows CE</option>
+
+ <option value="Windows ME">Windows ME</option>
+ <option value="Windows Mobile 2003">Windows Mobile 2003</option>
+ <option value="Windows NT">Windows NT</option>
+ <option value="Windows XP" selected="selected">Windows XP</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <input type="hidden" name="priority"
+ value="P3">
+<td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#bug_severity">Severity</a>:
+ </strong>
+ </td>
+
+ <td>
+
+ <select name="bug_severity">
+ <option value="blocker">blocker</option>
+ <option value="critical">critical</option>
+ <option value="major">major</option>
+ <option value="normal" selected="selected">normal</option>
+ <option value="minor">minor</option>
+
+ <option value="trivial">trivial</option>
+ <option value="enhancement">enhancement</option>
+ </select>
+ </td>
+ </tr>
+
+
+ <tr>
+ <td> </td>
+
+ <td colspan="3"></td>
+ </tr>
+
+ <tr>
+ <input type="hidden" name="bug_status"
+ value="NEW">
+ <td align="right" valign="top"><strong>Initial State:</strong></td>
+ <td valign="top">NEW</td>
+ <td colspan="2"></td>
+
+ </tr>
+
+ <tr>
+ <td align="right">
+ <strong>
+ <a href="page.cgi?id=fields.html#assigned_to">Assign To</a>:
+ </strong>
+ </td>
+ <td colspan="3"><input
+ name="assigned_to"
+ value="" disabled="1" size="32"
+>
+
+ <noscript>(Leave blank to assign to component's default assignee)</noscript>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right"><strong>QA Contact:</strong></td>
+ <td colspan="3"><input
+ name="qa_contact"
+ value="" disabled="1" size="32"
+>
+ <noscript>(Leave blank to assign to default qa contact)</noscript>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right"><strong>Cc:</strong></td>
+ <td colspan="3"><input
+ name="cc"
+ value="" size="45"
+>
+ </td>
+ </tr>
+
+ <tr>
+
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+
+ <tr>
+ <td align="right"><strong>URL:</strong></td>
+ <td colspan="3">
+ <input name="bug_file_loc" size="60"
+ value="http://">
+
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right"><strong>Summary:</strong></td>
+ <td colspan="3">
+ <input name="short_desc" size="60" value="">
+ </td>
+ </tr>
+
+ <tr><td align="right" valign="top"><strong>Description:</strong></td>
+ <td colspan="3">
+ <textarea name="comment" rows="10" cols="80"></textarea>
+ <br>
+ </td>
+ </tr>
+
+ <input type="hidden" name="commentprivacy" value="0">
+
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ </td>
+ </tr>
+
+
+
+ <tr>
+ <td></td>
+
+ <td colspan="3">
+ <input type="submit" value=" Commit "
+ onclick="if (this.form.short_desc.value == '')
+ { alert('Please enter a summary sentence for this bug.');
+ return false; } return true;">
+
+ <input type="submit" name="maketemplate"
+ value="Remember values as bookmarkable template">
+ </td>
+ </tr>
+
+ <tr>
+ <td></td>
+
+ <td colspan="3">
+ <br>
+ We've made a guess at your
+ operating system and platform. Please check them
+ and, if we got it wrong, email
+ webmaster at eclipse.org.
+ </td>
+ </tr>
+
+ </table>
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+
+<div id="footer">
+ <div class="intro"></div>
+
+
+
+
+<form method="get" action="show_bug.cgi">
+<div id="useful-links">
+ <div id="links-actions">
+ <div class="label">Actions:</div>
+ <div class="links">
+ <a href="./">Home</a> |
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Search</a> |
+ bug # <input class="txt" name="id" size="6">
+
+ <input class="btn" type="submit" value="Find"> |
+
+ <a href="report.cgi">Reports</a>
+
+ | <a href="request.cgi?requester=relves%40cs.ubc.ca&requestee=relves%40cs.ubc.ca&do_union=1&group=type">My Requests</a>
+
+ | <a href="votes.cgi?action=show_user">My Votes</a>
+
+ | <a href="relogin.cgi">Log out</a> relves@cs.ubc.ca
+ </div>
+
+ </div>
+
+ <div id="links-edit">
+ <div class="label">Edit:</div>
+ <div class="links">
+
+ <a href="userprefs.cgi">Prefs</a>
+ </div>
+ </div>
+
+
+
+
+ <div id="links-saved">
+
+ <div class="label">
+ Saved Searches:
+ </div>
+ <div class="links">
+ <a href="buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=relves%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</a>
+ |
+ <a href="buglist.cgi?cmdtype=runnamed&namedcmd=AssignedToMe">AssignedToMe</a>
+ </div>
+
+ </div>
+
+
+</div>
+</form>
+
+ <div class="outro"></div>
+</div>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/equinox-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/equinox-page.html
new file mode 100644
index 0000000..1c8fdf5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/equinox-page.html
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0059)https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Equinox -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Enter Bug</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="Equinox_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="Equinox_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="Equinox_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Enter
+ Bug</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>This page lets you enter a new bug into
+ Bugzilla.</TD></TR></TBODY></TABLE>
+<FORM action=post_bug.cgi method=post><INPUT type=hidden value=Equinox
+name=product>
+<TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><!-- 1.0 at bugzilla.org -->Before reporting a bug, please read
+ the <A href="https://bugs.eclipse.org/bugs/bugwritinghelp.html">bug
+ writing guidelines</A>, please look at the list of <A
+ href="https://bugs.eclipse.org/bugs/duplicates.cgi">most frequently
+ reported bugs</A>, and please <A
+ href="https://bugs.eclipse.org/bugs/query.cgi">search</A> for the bug.
+ </TD></TR>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Reporter:</STRONG></TD>
+ <TD vAlign=top>tanya at cs.ubc.ca</TD>
+ <TD vAlign=top align=right><STRONG>Product:</STRONG></TD>
+ <TD vAlign=top>Equinox</TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Version:</STRONG> </TD>
+ <TD><SELECT size=5 name=version> <OPTION value=unspecified
+ selected>unspecified</OPTION></SELECT> </TD>
+ <TD vAlign=top align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=Equinox">Component</A>:
+ </STRONG></TD>
+ <TD><SELECT size=5 name=component> <OPTION
+ value="Dynamic Plugins">Dynamic Plugins</OPTION> <OPTION
+ value=General>General</OPTION> <OPTION value=OSGi>OSGi</OPTION></SELECT>
+ </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#rep_platform">Platform</A>:
+ </STRONG></TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#op_sys">OS</A>:
+ </STRONG></TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD></TR>
+ <TR><INPUT type=hidden value=P3 name=priority>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#bug_severity">Severity</A>:
+ </STRONG></TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR><INPUT type=hidden value=NEW name=bug_status>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned
+ To</A>: </STRONG></TD>
+ <TD colSpan=3><INPUT size=32 name=assigned_to> (Leave blank to assign to
+ default component owner) </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Cc:</STRONG></TD>
+ <TD colSpan=3><INPUT size=45 name=cc> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD colSpan=3><INPUT type=hidden size=60 name=bug_file_loc input> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Summary:</STRONG></TD>
+ <TD colSpan=3><INPUT size=60 name=short_desc> </TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Description:</STRONG></TD>
+ <TD colSpan=3><TEXTAREA name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+ <BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><INPUT onclick="if (this.form.short_desc.value == '') { alert('Please enter a summary sentence for this bug.'); return false; } return true;" type=submit value=" Commit ">
+ <INPUT type=submit value="Remember values as bookmarkable template" name=maketemplate>
+ </TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><BR>We've made a guess at your operating system and
+ platform. Please check them and, if we got it wrong, email
+ webmaster at eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user">My
+ Votes</A> </TD>
+ <TD> </TD>
+ <TD vAlign=center>Edit <A
+ href="https://bugs.eclipse.org/bugs/userprefs.cgi">prefs</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/relogin.cgi">Log out</A> tanya at cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=tanya%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/gmt-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/gmt-page.html
new file mode 100644
index 0000000..951b86c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/gmt-page.html
@@ -0,0 +1,175 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0055)https://bugs.eclipse.org/bugs/enter_bug.cgi?product=GMT -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Enter Bug</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="GMT_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="GMT_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="GMT_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Enter
+ Bug</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>This page lets you enter a new bug into
+ Bugzilla.</TD></TR></TBODY></TABLE>
+<FORM action=post_bug.cgi method=post><INPUT type=hidden value=GMT name=product>
+
+<TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><!-- 1.0 at bugzilla.org -->Before reporting a bug, please read
+ the <A href="https://bugs.eclipse.org/bugs/bugwritinghelp.html">bug
+ writing guidelines</A>, please look at the list of <A
+ href="https://bugs.eclipse.org/bugs/duplicates.cgi">most frequently
+ reported bugs</A>, and please <A
+ href="https://bugs.eclipse.org/bugs/query.cgi">search</A> for the bug.
+ </TD></TR>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Reporter:</STRONG></TD>
+ <TD vAlign=top>tanya at cs.ubc.ca</TD>
+ <TD vAlign=top align=right><STRONG>Product:</STRONG></TD>
+ <TD vAlign=top>GMT</TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Version:</STRONG> </TD>
+ <TD><SELECT size=5 name=version> <OPTION value=unspecified
+ selected>unspecified</OPTION></SELECT> </TD>
+ <TD vAlign=top align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=GMT">Component</A>:
+ </STRONG></TD>
+ <TD><SELECT size=5 name=component> <OPTION value=Core
+ selected>Core</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#rep_platform">Platform</A>:
+ </STRONG></TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#op_sys">OS</A>:
+ </STRONG></TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD></TR>
+ <TR><INPUT type=hidden value=P3 name=priority>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#bug_severity">Severity</A>:
+ </STRONG></TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR><INPUT type=hidden value=NEW name=bug_status>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned
+ To</A>: </STRONG></TD>
+ <TD colSpan=3><INPUT size=32 name=assigned_to> (Leave blank to assign to
+ default component owner) </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Cc:</STRONG></TD>
+ <TD colSpan=3><INPUT size=45 name=cc> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD colSpan=3><INPUT type=hidden size=60 name=bug_file_loc input> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Summary:</STRONG></TD>
+ <TD colSpan=3><INPUT size=60 name=short_desc> </TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Description:</STRONG></TD>
+ <TD colSpan=3><TEXTAREA name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+ <BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><INPUT onclick="if (this.form.short_desc.value == '') { alert('Please enter a summary sentence for this bug.'); return false; } return true;" type=submit value=" Commit ">
+ <INPUT type=submit value="Remember values as bookmarkable template" name=maketemplate>
+ </TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><BR>We've made a guess at your operating system and
+ platform. Please check them and, if we got it wrong, email
+ webmaster at eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user">My
+ Votes</A> </TD>
+ <TD> </TD>
+ <TD vAlign=center>Edit <A
+ href="https://bugs.eclipse.org/bugs/userprefs.cgi">prefs</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/relogin.cgi">Log out</A> tanya at cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=tanya%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/hipikat-copy-bug-1-full.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/hipikat-copy-bug-1-full.html
new file mode 100644
index 0000000..6390fcc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/hipikat-copy-bug-1-full.html
@@ -0,0 +1,157 @@
+<HTML><HEAD>
+<TITLE>Bug 1 - Usability issue with external editors (1GE6IRL)</TITLE>
+
+
+</HEAD>
+<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" >
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" ><tr><td
+WIDTH="100%"><table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%"
+BGCOLOR="#006699" ><tr><td BGCOLOR="#000000" width="116" ><img
+src="http://bugs.eclipse.org/bugs/images/EclipseBannerPic.jpg" width="115" height="50"></td><td
+WIDTH="637"><img SRC="http://bugs.eclipse.org/bugs/images/gradient.jpg" BORDER=0 height=50
+width=282></td><td WIDTH="250"><img src="http://bugs.eclipse.org/bugs/images/eproject-simple.gif"
+width="250" height="48"></td></tr></table></td></tr></table>
+
+<TABLE BORDER=0 CELLSPACING=0 WIDTH="100%">
+ <TR>
+ <TD WIDTH=10% VALIGN=TOP ALIGN=LEFT>
+ <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=2>
+ <TR><TD VALIGN=TOP ALIGN=LEFT NOWRAP>
+ <FONT SIZE=+1><B>Bugzilla Bug 1</B></FONT> </TD></TR>
+ </TABLE>
+ </TD>
+ <TD VALIGN=CENTER> </TD>
+ <TD VALIGN=CENTER ALIGN=LEFT>
+Usability issue with external editors (1GE6IRL)
+</TD></TR></TABLE>
+ <A HREF=query.cgi>Query page</A>
+ <A HREF=enter_bug.cgi>Enter new bug</A>
+<HR>
+<FORM NAME="changeform" METHOD="POST" ACTION="process_bug.cgi">
+
+<INPUT TYPE=HIDDEN NAME="delta_ts" VALUE="20020427143827">
+<INPUT TYPE=HIDDEN NAME="longdesclength" VALUE="3022">
+<INPUT TYPE=HIDDEN NAME="id" VALUE=1>
+ <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0><TR>
+ <TD ALIGN=RIGHT><B>Bug#:</B></TD><TD><A HREF="http://cvs-mirror.mozilla.org/webtools/bugzilla/show_bug.cgi?id=1">1</A></TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html#rep_platform">Platform:</A></B></TD>
+ <TD><SELECT NAME=rep_platform><OPTION VALUE="All">All<OPTION VALUE="DEC">DEC<OPTION VALUE="HP">HP<OPTION VALUE="Macintosh">Macintosh<OPTION VALUE="PC">PC<OPTION VALUE="SGI">SGI<OPTION VALUE="Sun">Sun<OPTION VALUE="Other">Other</SELECT></TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT><B>Reporter:</B></TD><TD>Andre_Weinand at oti.com (Andre Weinand)</TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B>Product:</B></TD>
+ <TD><SELECT NAME=product><OPTION VALUE="TestProduct">TestProduct</SELECT></TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT><B>OS:</B></TD>
+ <TD><SELECT NAME=op_sys><OPTION SELECTED VALUE="All">All<OPTION VALUE="Windows 3.1">Windows 3.1<OPTION VALUE="Windows 95">Windows 95<OPTION VALUE="Windows 98">Windows 98<OPTION VALUE="Windows ME">Windows ME<OPTION VALUE="Windows 2000">Windows 2000<OPTION VALUE="Windows NT">Windows NT<OPTION VALUE="Mac System 7">Mac System 7<OPTION VALUE="Mac System 7.5">Mac System 7.5<OPTION VALUE="Mac System 7.6.1">Mac System 7.6.1<OPTION VALUE="Mac System 8.0">Mac System 8.0<OPTION VALUE="Mac System 8.5">Mac System 8.5<OPTION VALUE="Mac System 8.6">Mac System 8.6<OPTION VALUE="Mac System 9.0">Mac System 9.0<OPTION VALUE="Linux">Linux<OPTION VALUE="BSDI">BSDI<OPTION VALUE="FreeBSD">FreeBSD<OPTION VALUE="NetBSD">NetBSD<OPTION VALUE="OpenBSD">OpenBSD<OPTION VALUE="AIX">AIX<OPTION VALUE="BeOS">BeOS<OPTION VALUE="HP-UX">HP-UX<OPTION VALUE="IRIX">IRIX<OPTION VALUE="Neutrino">Neutrino<OPTION VALUE="OpenVMS">OpenVMS<OPTION VALUE="OS/2">OS/2<OPTION VALUE="OSF/1">OSF/1<OPTION VALUE="Solaris">Solaris<OPTION VALUE="SunOS">SunOS<OPTION VALUE="other">other</SELECT></TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT NOWRAP><b>Add CC:</b></TD>
+ <TD><INPUT NAME=newcc SIZE=30 VALUE=""></TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B><A HREF="describecomponents.cgi?product=">Component:</A></B></TD>
+ <TD><SELECT NAME=component></SELECT></TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT><B>Version:</B></TD>
+ <TD><SELECT NAME=version></SELECT></TD>
+ <TD> </TD>
+ <TD ROWSPAN=4 ALIGN=RIGHT VALIGN=TOP><B>Cc:</B></TD>
+ <TD ROWSPAN=4 VALIGN=TOP> <SELECT NAME=cc MULTIPLE SIZE=5>
+<OPTION VALUE="Kevin_McGuire at oti.com">Kevin_McGuire at oti.com
+</SELECT><BR>
+<INPUT TYPE=CHECKBOX NAME=removecc>Remove selected CCs<br>
+ </TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html">Status:</A></B></TD>
+ <TD>VERIFIED</TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html#priority">Priority:</A></B></TD>
+ <TD><SELECT NAME=priority><OPTION VALUE="P1">P1<OPTION VALUE="P2">P2<OPTION SELECTED VALUE="P3">P3<OPTION VALUE="P4">P4<OPTION VALUE="P5">P5</SELECT></TD>
+ <TD> </TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html">Resolution:</A></B></TD>
+ <TD>FIXED</TD>
+ <TD> </TD>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html#severity">Severity:</A></B></TD>
+ <TD><SELECT NAME=bug_severity><OPTION VALUE="blocker">blocker<OPTION VALUE="critical">critical<OPTION VALUE="major">major<OPTION SELECTED VALUE="normal">normal<OPTION VALUE="minor">minor<OPTION VALUE="trivial">trivial<OPTION VALUE="enhancement">enhancement</SELECT></TD>
+ <TD> </TD>
+</TR><TR>
+ <TD ALIGN=RIGHT><B><A HREF="bug_status.html#assigned_to">Assigned To:
+ </A></B></TD>
+ <TD>James_Moody at oti.com (James Moody)</TD>
+ <TD> </TD><TD></TD><TD></TD><TD> </TD>
+</TR>
+ <TR>
+ <TD ALIGN="RIGHT"><B>URL:</B>
+ <TD COLSPAN=7>
+ <INPUT NAME=bug_file_loc VALUE="" SIZE=60></TD>
+ </TR><TR>
+ <TD ALIGN="RIGHT"><B>Summary:</B>
+ <TD COLSPAN=7>
+ <INPUT NAME=short_desc VALUE="Usability issue with external editors (1GE6IRL)" SIZE=60></TD>
+ </TR><tr><td align=right><B>Attachments:</b></td>
+<td colspan=7><a href="createattachment.cgi?id=1">Create a new attachment</a> (proposed patch, testcase, etc.)</td></tr></table>
+<table><tr>
+<th align=right>Bug 1 depends on:</th><td></td><td><input name=dependson value=""></td>
+
+<td rowspan=2><a href="showdependencytree.cgi?id=1">Show dependency tree</a>
+
+<br><a href="showdependencygraph.cgi?id=1">Show dependency graph</a>
+</td></tr><tr><th align=right>Bug 1 blocks:</th><td></td><td><input name=blocked value=""></td>
+</tr></table>
+
+<br>
+<B>Additional Comments:</B>
+<BR>
+<TEXTAREA WRAP=HARD NAME=comment ROWS=10 COLS=80></TEXTAREA><BR><br>
+<INPUT TYPE=radio NAME=knob VALUE=none CHECKED>
+ Leave as <b>VERIFIED FIXED</b><br><INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bug<br>
+<INPUT TYPE=radio NAME=knob VALUE=close>
+ Mark bug as <b>CLOSED</b><br>
+
+<INPUT TYPE="submit" VALUE="Commit">
+<INPUT TYPE="reset" VALUE="Reset">
+<INPUT TYPE="hidden" name="form_name" VALUE="process_bug">
+<P>
+<FONT size="+1"><B>
+ <A HREF="show_activity.cgi?id=1">View Bug Activity</A>
+ |
+ <A HREF="long_list.cgi?buglist=1">Format For Printing</A>
+</B></FONT>
+<BR></FORM>
+<table><tr><td align=left><B>Description:</B></td>
+<td align=right width=100%>Opened: 2001-10-10 17:34</td></tr></table>
+<HR>
+<PRE>- Setup a project that contains a *.gif resource
 - release project to CVS
 - edit the *.gif resource with an external editor, e.g. PaintShop
 - save and close external editor
 - in Navigator open the icon resource and verify that your changes are there
 - release project
 -> nothing to release!
 - in Navigator open the icon resource and verify that your changes are still there

 Problem: because I never "Refreshed from local", the workspace hasn't changed so "Release" didn't find anything.
 However opening the resource with an external editor found the modified file on disk and showed the changes.

 The real problem occurs if "Release" actually finds something to release but you don't spot that some resources are missing.
 This is extremely error prone: one of my changes didn't made it into build 110 because of this!

NOTES:
EG (5/23/01 3:00:33 PM)
 Release should do a refresh from local before doing the release.
 Moving to VCM


KM (05/27/01 5:10:19 PM)
 Comments from JM in related email:

 Should not do this for free. Could have a setting which made it optoinal but should nt be mandatory. Default setting could be to have it on.
 Consider the SWT team who keep their workspaces on network drives. This will be slow. 

 Side effects will be that a build runs when the refresh is completed unless you somehow do it in a workspace runnable and don't end the
 runnable until after the release. This would be less than optimal as some builders may be responsible for maintaining some invariants and deriving resources which are releasable. If you don't run the builders before releasing, the invariants will not be maintained and you will release inconsistent state.

 Summary: Offer to "ensure local consistency" before releasing.

KM (5/31/01 1:30:35 PM)
 See also 1GEAG1A: ITPVCM:WINNT - Internal error comparing with a document
 which failed with an error. Never got log from Tod though.</PRE>
+<BR><BR><I>------- Additional Comments From <A HREF="mailto:James_Moody at oti.com">James Moody</A> 2001-10-19 06:32 -------</I><BR>
+<PRE>*** <strike><a href="show_bug.cgi?id=183" title="RESOLVED DUPLICATE - readme: must refresh from local if using external editors (1GFBQNI)">Bug 183</a></strike> has been marked as a duplicate of this bug. ***</PRE>
+<BR><BR><I>------- Additional Comments From <A HREF="mailto:James_Moody at oti.com">James Moody</A> 2001-10-19 12:36 -------</I><BR>
+<PRE>Implemented 'auto refresh' option. Default value is off.</PRE>
+<BR><BR><I>------- Additional Comments From <A HREF="mailto:DJ_Houghton at oti.com">DJ Houghton</A> 2001-10-23 19:39 -------</I><BR>
+<PRE>PRODUCT VERSION:
 109

</PRE>
+<BR><BR><I>------- Additional Comments From <A HREF="mailto:James_Moody at oti.com">James Moody</A> 2001-10-25 06:19 -------</I><BR>
+<PRE>Fixed in v206</PRE>
+
+<HR>
+ <A HREF=query.cgi>Query page</A>
+ <A HREF=enter_bug.cgi>Enter new bug</A>
+<hr>
+ <a HREF=query.cgi>Query page</a>
+ <a HREF=enter_bug.cgi>Enter new bug</a>
+<table BORDER="0"><tr><td BGCOLOR="#000000" VALIGN="TOP">
+<table BORDER="0" CELLPADDING="10" CELLSPACING="0" WIDTH="100%"
+BGCOLOR="lightyellow">
+<tr><td>
+<form METHOD=GET ACTION="show_bug.cgi">
+<table width="100%"><tr><td>
+Actions:
+</td><td VALIGN="middle" NOWRAP>
+<a href='enter_bug.cgi'>New</a> | <a href='query.cgi'>Query</a> |
+ <input TYPE=SUBMIT VALUE="Find"> bug # <input NAME=id SIZE=6> | <a
+href='reports.cgi'>Reports</a></td><td> </td><td valign=middle align=right>
+
+ <a href="createaccount.cgi"><nobr>New account</nobr></a>
+ | <nobr><a href=query.cgi?GoAheadAndLogIn=1>Log in</a></nobr></td></tr></form>
+</table><br>
+<a HREF="index.html">Eclipse Bugs Home</a>
+</td></tr>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/platform-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/platform-page.html
new file mode 100644
index 0000000..d41b5c8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/platform-page.html
@@ -0,0 +1,299 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><title>Enter Bug</title></head>
+
+
+
+
+
+
+
+
+ <body bgcolor="#ffffff" onload="" text="#000000" link="#0000ee" vlink="#551a8b" alink="#ff0000">
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+<table border="0" cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td width="100%"><table border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#006699"><tbody><tr><td bgcolor="#000000" width="116"><img src="main_data/EclipseBannerPic.jpg" width="115" height="50"></td><td width="637"><a href="http://www.eclipse.org/"><img src="main_data/gradient.jpg" border="0" height="50" width="282"></a></td><td width="250"><img src="main_data/eproject-simple.gif" width="250" height="48"></td></tr></tbody></table></td></tr></tbody></table>
+
+ <table border="0" cellspacing="0">
+ <tbody><tr>
+ <td valign="top" align="left">
+ <table border="0" cellpadding="0" cellspacing="2">
+ <tbody><tr>
+ <td valign="top" align="left" nowrap="nowrap">
+ <font size="+1"><b>Enter Bug</b></font>
+ </td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="middle"> </td>
+ <td valign="middle" align="left">This page lets you enter a new bug into Bugzilla.</td>
+ </tr>
+ </tbody></table>
+
+<form method="post" action="post_bug.cgi">
+<input type="hidden" name="product" value="Platform">
+
+<input type="hidden" name="priority" value="P3">
+<input type="hidden" name="bug_status" value="NEW">
+
+ <table cellspacing="2" cellpadding="0" border="0">
+
+ <tbody><tr>
+ <td><br></td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ <!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+Before reporting a bug, please read the <a href="https://bugs.eclipse.org/bugs/bugwritinghelp.html">
+bug writing guidelines</a>, please look at the list of
+<a href="https://bugs.eclipse.org/bugs/duplicates.cgi">most frequently reported bugs</a>, and please
+<a href="https://bugs.eclipse.org/bugs/query.cgi">search</a> for the bug.
+ </td>
+ </tr>
+
+ <tr>
+ <td><br></td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top"><strong>Reporter:</strong></td>
+ <td valign="top">tanya at cs.ubc.ca</td>
+
+ <td align="right" valign="top"><strong>Product:</strong></td>
+ <td valign="top">Platform</td>
+ </tr>
+
+
+ <tr>
+ <td align="right" valign="top">
+ <strong>Version:</strong>
+ </td>
+ <td>
+ <select name="version" size="5"><option value="1.0">1.0 </option><option value="2.0">2.0 </option><option value="2.0.1">2.0.1 </option><option value="2.0.2">2.0.2 </option><option value="2.1">2.1 </option><option value="2.1.1">2.1.1 </option><option value="2.1.2">2.1.2 </option><option value="3.0" selected="selected">3.0 </option></select>
+ </td>
+
+ <td align="right" valign="top">
+ <strong>
+ <a href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=Platform">
+ Component</a>:
+ </strong>
+ </td>
+ <td>
+ <select name="component" size="5"><option value="Ant">Ant </option><option value="Compare">Compare </option><option value="Core">Core </option><option value="CVS">CVS </option><option value="Debug">Debug </option><option value="Doc">Doc </option><option value="Help">Help </option><option value="Releng">Releng </option><option value="Scripting">Scripting </option><option value="Search">Search </option><option value="SWT">SWT </option><option value="Team">Team </option><option value="Text">Text </option><option value="UI">UI </option><option value="Update">Update </option><option value="WebDAV">WebDAV </option></select>
+ </td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+ <tr><td align="right">
+ <strong>
+ <a href="https://bugs.eclipse.org/bugs/bug_status.html#rep_platform">Platform</a>:
+ </strong>
+ </td>
+
+ <td>
+ <select name="rep_platform"><option value="All">All </option><option value="Macintosh">Macintosh </option><option value="PC" selected="selected">PC </option><option value="Power PC">Power PC </option><option value="Sun">Sun </option><option value="Other">Other </option></select>
+ </td>
+ <td align="right">
+ <strong>
+ <a href="https://bugs.eclipse.org/bugs/bug_status.html#op_sys">OS</a>:
+ </strong>
+ </td>
+
+ <td>
+ <select name="op_sys"><option value="All">All </option><option value="AIX Motif">AIX Motif </option><option value="Windows 95">Windows 95 </option><option value="Windows 98">Windows 98 </option><option value="Windows CE">Windows CE </option><option value="Windows ME">Windows ME </option><option value="Windows 2000">Windows 2000 </option><option value="Windows NT">Windows NT </option><option value="Windows XP" selected="selected">Windows XP </option><option value="Windows All">Windows All </option><option value="MacOS X">MacOS X </option><option value="Linux">Linux </option><option value="Linux-GTK">Linux-GTK </option><option value="Linux-Motif">Linux-Motif </option><option value="HP-UX">HP-UX </option><option value="Neutrino">Neutrino </option><option value="QNX-Photon">QNX-Photon </option><option value="Solaris">Solaris </option><option value="Unix All">Unix All </option><option value="other">other </option></select>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <strong>
+ <a href="https://bugs.eclipse.org/bugs/bug_status.html#bug_severity">Severity</a>:
+ </strong>
+ </td>
+
+ <td>
+ <select name="bug_severity"><option value="blocker">blocker </option><option value="critical">critical </option><option value="major">major </option><option value="normal" selected="selected">normal </option><option value="minor">minor </option><option value="trivial">trivial </option><option value="enhancement">enhancement </option></select>
+ </td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <strong>
+ <a href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</a>:
+ </strong>
+ </td>
+ <td colspan="3">
+ <input name="assigned_to" size="32" value="">
+ (Leave blank to assign to default component owner)
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right"><strong>Cc:</strong></td>
+ <td colspan="3">
+ <input name="cc" size="45" value="">
+ </td>
+ </tr>
+
+ <tr>
+ <td> </td>
+ <td colspan="3"></td>
+ </tr>
+
+ <tr>
+ <td colspan="3">
+ <input type="hidden" input="" name="bug_file_loc" size="60" value="">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right"><strong>Summary:</strong></td>
+ <td colspan="3">
+ <input name="short_desc" size="60" value="">
+ </td>
+ </tr>
+
+ <tr><td align="right" valign="top"><strong>Description:</strong></td>
+ <td colspan="3">
+ <textarea wrap="hard" name="comment" rows="10" cols="80"></textarea>
+ <br>
+ </td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ </td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ <input type="submit" value=" Commit " onclick="if (this.form.short_desc.value == '')
+ { alert('Please enter a summary sentence for this bug.');
+ return false; } return true;">
+
+ <input type="submit" name="maketemplate" value="Remember values as bookmarkable template">
+ </td>
+ </tr>
+
+ <tr>
+ <td></td>
+ <td colspan="3">
+ <br>
+ We've made a guess at your operating system and platform.
+ Please check them and, if we got it wrong, email webmaster at eclipse.org.
+ </td>
+ </tr>
+
+ </tbody></table>
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<table border="0">
+ <tbody><tr>
+ <td bgcolor="#000000" valign="top">
+ <table border="0" cellpadding="10" cellspacing="0" width="100%" bgcolor="lightyellow">
+ <tbody><tr>
+ <td>
+
+
+
+ This is <b>Bugzilla</b>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see
+ <a href="http://www.bugzilla.org/">bugzilla.org</a>.
+
+
+
+ <br>
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+
+
+<form method="get" action="show_bug.cgi">
+ <table width="100%">
+ <tbody><tr>
+ <td>
+ Actions:
+ </td>
+
+ <td valign="middle" nowrap="nowrap">
+ <a href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</a> |
+ <a href="https://bugs.eclipse.org/bugs/query.cgi">Query</a> |
+
+ <input type="submit" value="Find"> bug #
+ <input name="id" size="6"> |
+
+ <a href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</a>
+
+ | <a href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user">My Votes</a>
+ </td>
+
+ <td> </td>
+
+
+ <td valign="middle">
+ Edit <a href="https://bugs.eclipse.org/bugs/userprefs.cgi">prefs</a>
+
+ | <a href="https://bugs.eclipse.org/bugs/relogin.cgi">Log out</a> tanya at cs.ubc.ca
+ </td>
+ </tr>
+
+
+
+
+ <tr>
+ <td>
+ Preset Queries:
+ </td>
+
+ <td colspan="3">
+ <a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=tanya%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</a>
+
+ </td>
+ </tr>
+
+
+ </tbody></table>
+</form>
+
+ </td>
+ </tr>
+ </tbody></table>
+ </td>
+ </tr>
+</tbody></table>
+
+</body></html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/product-page-1-product-hipikat.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/product-page-1-product-hipikat.html
new file mode 100644
index 0000000..53805b2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/product-page-1-product-hipikat.html
@@ -0,0 +1,256 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0073)http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/enter_bug.cgi -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Enter Bug</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=windows-1252"><!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org -->
+<SCRIPT
+type=text/javascript>
+ <!--
+
+ function initHelp() {}
+ // -->
+ </SCRIPT>
+
+<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
+<BODY bgColor=#ffffff onload=set_assign_to();><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#000000 border=0>
+ <TBODY>
+ <TR>
+ <TD>
+ <CENTER><FONT color=#ffffff size=8>This is Bugzilla
+ </FONT></CENTER></TD></TR></TBODY></TABLE>
+<CENTER><FONT size=-1><A href="http://www.bugzilla.org/">Bugzilla</A> Version
+2.17.6 </FONT></CENTER>
+<TABLE cellSpacing=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Enter
+ Bug</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center align=left> </TD>
+ <TD vAlign=center align=left>This page lets you enter a new bug into
+ Bugzilla.</TD></TR></TBODY></TABLE>
+<SCRIPT language=JavaScript type=text/javascript>
+<!--
+
+var default_owners = new Array(1);
+var components = new Array(1);
+ components[0] = "TestComponent";
+ default_owners[0] = "cubranic\x40cs.ubc.ca";
+var last_default_owner;
+function set_assign_to() {
+ // Based on the selected component, fill the "Assign To:" field
+ // with the default component owner.
+ var form = document.Create;
+ assigned_to = form.assigned_to.value
+ var index = -1;
+ if (form.component.type == 'select-one') {
+ index = form.component.selectedIndex;
+ } else if (form.component.type == 'hidden') {
+ // Assume there is only one component in the list
+ index = 0;
+ }
+ if (index != -1) {
+ var owner = default_owners[index];
+ var component = components[index];
+ if (assigned_to == last_default_owner
+ || assigned_to == owner
+ || assigned_to == ''
+ || confirm('Would you like to change\n\n' +
+ ' "Assign To: ' + assigned_to + '"\n\n' +
+ 'to the default "' + component + '" owner:\n\n' +
+ ' ' + owner + "?")) {
+ form.assigned_to.value = owner;
+ last_default_owner = owner;
+ }
+ }
+}
+-->
+</SCRIPT>
+
+<FORM id=Create name=Create action=post_bug.cgi method=post><INPUT type=hidden
+value=TestProduct name=product>
+<TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><!-- 1.0 at bugzilla.org -->Before reporting a bug, please read
+ the <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/bugwritinghelp.html">bug
+ writing guidelines</A>, please look at the list of <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/duplicates.cgi">most
+ frequently reported bugs</A>, and please <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/query.cgi">search</A>
+ for the bug. </TD></TR>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Reporter:</STRONG></TD>
+ <TD vAlign=top>tanya at cs.ubc.ca</TD>
+ <TD vAlign=top align=right><STRONG>Product:</STRONG></TD>
+ <TD vAlign=top>TestProduct</TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Version:</STRONG> </TD>
+ <TD><SELECT size=5 name=version> <OPTION value=other
+ selected>other</OPTION></SELECT> </TD>
+ <TD vAlign=top align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/describecomponents.cgi?product=TestProduct">Component</A>:
+ </STRONG></TD>
+ <TD><SELECT onchange=set_assign_to(); size=5 name=component> <OPTION
+ value=TestComponent selected>TestComponent</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/bug_status.html#rep_platform">Platform</A>:
+ </STRONG></TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=DEC>DEC</OPTION> <OPTION value=HP>HP</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value=SGI>SGI</OPTION> <OPTION value=Sun>Sun</OPTION> <OPTION
+ value=Other>Other</OPTION></SELECT> </TD>
+ <TD align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/bug_status.html#op_sys">OS</A>:
+ </STRONG></TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="Windows 3.1">Windows 3.1</OPTION> <OPTION
+ value="Windows 95">Windows 95</OPTION> <OPTION
+ value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows Server 2003">Windows
+ Server 2003</OPTION> <OPTION value="Mac System 7">Mac System 7</OPTION>
+ <OPTION value="Mac System 7.5">Mac System 7.5</OPTION> <OPTION
+ value="Mac System 7.6.1">Mac System 7.6.1</OPTION> <OPTION
+ value="Mac System 8.0">Mac System 8.0</OPTION> <OPTION
+ value="Mac System 8.5">Mac System 8.5</OPTION> <OPTION
+ value="Mac System 8.6">Mac System 8.6</OPTION> <OPTION
+ value="Mac System 9.x">Mac System 9.x</OPTION> <OPTION
+ value="Mac OS X 10.0">Mac OS X 10.0</OPTION> <OPTION
+ value="Mac OS X 10.1">Mac OS X 10.1</OPTION> <OPTION
+ value="Mac OS X 10.2">Mac OS X 10.2</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=BSD/OS>BSD/OS</OPTION> <OPTION
+ value=FreeBSD>FreeBSD</OPTION> <OPTION value=NetBSD>NetBSD</OPTION>
+ <OPTION value=OpenBSD>OpenBSD</OPTION> <OPTION value=AIX>AIX</OPTION>
+ <OPTION value=BeOS>BeOS</OPTION> <OPTION value=HP-UX>HP-UX</OPTION>
+ <OPTION value=IRIX>IRIX</OPTION> <OPTION
+ value=Neutrino>Neutrino</OPTION> <OPTION value=OpenVMS>OpenVMS</OPTION>
+ <OPTION value=OS/2>OS/2</OPTION> <OPTION value=OSF/1>OSF/1</OPTION>
+ <OPTION value=Solaris>Solaris</OPTION> <OPTION
+ value=SunOS>SunOS</OPTION> <OPTION value=other>other</OPTION></SELECT>
+ </TD></TR>
+ <TR>
+ <TD align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/bug_status.html#priority">Priority</A>:
+ </STRONG></TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION value=P2
+ selected>P2</OPTION> <OPTION value=P3>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/bug_status.html#bug_severity">Severity</A>:
+ </STRONG></TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR><INPUT type=hidden value=NEW name=bug_status>
+ <TR>
+ <TD align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/bug_status.html#assigned_to">Assign
+ To</A>: </STRONG></TD>
+ <TD colSpan=3><INPUT size=32 name=assigned_to> <NOSCRIPT>(Leave blank to
+ assign to default component owner)</NOSCRIPT> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Cc:</STRONG></TD>
+ <TD colSpan=3><INPUT size=45 name=cc> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD align=right><STRONG>URL:</STRONG></TD>
+ <TD colSpan=3><INPUT size=60 value=http:// name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Summary:</STRONG></TD>
+ <TD colSpan=3><INPUT size=60 name=short_desc> </TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Description:</STRONG></TD>
+ <TD colSpan=3><TEXTAREA name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+ <BR></TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/describekeywords.cgi">Keywords</A>:
+ </STRONG></TD>
+ <TD colSpan=3><INPUT size=60 name=keywords> (optional) </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Depends on:</STRONG> </TD>
+ <TD><INPUT accessKey=d name=dependson> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Blocks:</STRONG> </TD>
+ <TD><INPUT accessKey=b name=blocked> </TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><INPUT onclick="if (this.form.short_desc.value == '') { alert('Please enter a summary sentence for this bug.'); return false; } return true;" type=submit value=" Commit ">
+ <INPUT type=submit value="Remember values as bookmarkable template" name=maketemplate>
+ </TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><BR>We've made a guess at your operating system and
+ platform. Please check them and, if we got it wrong, emailTHE MAINTAINER
+ HAS NOT YET BEEN SET. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/enter_bug.cgi">New</A>
+ | <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/query.cgi">Search</A>
+ | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id>
+ | <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/report.cgi">Reports</A>
+ | <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/request.cgi?requester=tanya%40cs.ubc.ca&requestee=tanya%40cs.ubc.ca&do_union=1&group=type">My
+ Requests</A> | <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/votes.cgi?action=show_user">My
+ Votes</A> </TD>
+ <TD> </TD>
+ <TD vAlign=center>Edit <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/userprefs.cgi">prefs</A>,
+ <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/editproducts.cgi">products</A>,
+ <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/editflagtypes.cgi">flags</A>,
+ <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/editkeywords.cgi">keywords</A>
+ | <A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/relogin.cgi">Log out</A> tanya at cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Saved Searches: </TD>
+ <TD colSpan=3><A
+ href="http://hipikat.cs.ubc.ca:8081/bugzilla-test/bugzilla-2.17.6/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=tanya%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-220.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-220.html
new file mode 100644
index 0000000..6e8adde
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-220.html
@@ -0,0 +1,667 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>Bug 7 - summary</title>
+
+
+
+
+
+
+ <script type="text/javascript">
+ <!--
+
+ function initHelp() {}
+ // -->
+ </script>
+
+ <link href="skins/standard/global.css" rel="stylesheet" type="text/css">
+ <link href="skins/custom/global.css" rel="stylesheet" type="text/css">
+
+
+
+
+
+ </head>
+
+
+
+ <body onload=""
+ class="you-havent-visited-editparams-cgi-yet bz_bug bz_status_NEW bz_component_TestComponent bz_bug_7">
+
+
+<div id="banner">
+ <div class="intro"></div>
+ <p id="banner-name">
+ <span>This is Bugzilla</span>
+ </p>
+ <p id="banner-version">
+ <a href="http://www.bugzilla.org/"><span>Bugzilla</span></a>
+ <span>Version 2.20</span>
+ </p>
+ <div class="outro"></div>
+ </div>
+
+<div id="header">
+ <h1>Bugzilla Bug 7</h1>
+
+ <h2>summary</h2>
+
+ <h3>Last modified: 2006-02-21 16:34:29</h3>
+</div>
+<i><font color="#777777">First</font></i>
+ <i><font color="#777777">Last</font></i>
+ <i><font color="#777777">Prev</font></i>
+ <i><font color="#777777">Next</font></i>
+
+ <i><font color="#777777">No search results available</font></i>
+
+ <a href="query.cgi">Search page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<hr>
+<script type="text/javascript">
+ <!--
+
+ /* Outputs a link to call replyToComment(); used to reduce HTML output */
+ function addReplyLink(id) {
+ /* XXX this should really be updated to use the DOM Core's
+ * createElement, but finding a container isn't trivial */
+ document.write('[<a href="#add_comment" onclick="replyToComment(' +
+ id + ');">reply<' + '/a>]');
+ }
+
+ /* Adds the reply text to the `comment' textarea */
+ function replyToComment(id) {
+ /* pre id="comment_name_N" */
+ var text_elem = document.getElementById('comment_text_'+id);
+ var text = getText(text_elem);
+
+ /* make sure we split on all newlines -- IE or Moz use \r and \n
+ * respectively */
+ text = text.split(/\r|\n/);
+
+ var replytext = "";
+ for (var i=0; i < text.length; i++) {
+ replytext += "> " + text[i] + "\n";
+ }
+
+ replytext = "(In reply to comment #" + id + ")\n" + replytext + "\n";
+
+
+ /* <textarea id="comment"> */
+ var textarea = document.getElementById('comment');
+ textarea.value += replytext;
+
+ textarea.focus();
+ }
+
+ if (!Node) {
+ /* MSIE doesn't define Node, so provide a compatibility array */
+ var Node = {
+ TEXT_NODE: 3,
+ ENTITY_REFERENCE_NODE: 5
+ };
+ }
+
+ /* Concatenates all text from element's childNodes. This is used
+ * instead of innerHTML because we want the actual text (and
+ * innerText is non-standard) */
+ function getText(element) {
+ var child, text = "";
+ for (var i=0; i < element.childNodes.length; i++) {
+ child = element.childNodes[i];
+ var type = child.nodeType;
+ if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
+ text += child.nodeValue;
+ } else {
+ /* recurse into nodes of other types */
+ text += getText(child);
+ }
+ }
+ return text;
+ }
+
+
+ //-->
+ </script>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="2006-02-21 16:34:29">
+ <input type="hidden" name="longdesclength" value="2">
+ <input type="hidden" name="id" value="7">
+
+
+
+ <table>
+
+ <tr>
+ <td valign="top">
+ <table cellspacing="1" cellpadding="1">
+
+ <tr>
+ <td align="right">
+ <b>Bug#:</b>
+ </td>
+ <td>
+ <a href="http://you-havent-visited-editparams.cgi-yet/show_bug.cgi?id=7">7</a>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>P</u>roduct:</b>
+ </td><td>
+ <label for="product" accesskey="p">
+ <select name="product" id="product">
+ <option value="TestProduct" selected>TestProduct
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="describecomponents.cgi?product=TestProduct">
+ Co<u>m</u>ponent</a>:
+ </b>
+ </td><td>
+ <label for="component" accesskey="m">
+ <select name="component" id="component">
+ <option value="TestComponent" selected>TestComponent
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#status">Status</a>:
+ </b>
+ </td>
+ <td>NEW</td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#resolution">Resolution</a>:
+ </b>
+ </td>
+ <td>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#assigned_to">Assigned To</a>:
+ </b>
+ </td>
+ <td>Robert Elves <relves@cs.ubc.ca></td>
+ </tr>
+
+ </table>
+
+ </td>
+ <td valign="top">
+
+ <table cellspacing="1" cellpadding="1">
+
+ <tr>
+ <td align="right">
+ <b><u>H</u>ardware:</b>
+ </td><td>
+ <label for="rep_platform" accesskey="h">
+ <select name="rep_platform" id="rep_platform">
+ <option value="All">All
+ </option>
+ <option value="PC" selected>PC
+ </option>
+ <option value="Macintosh">Macintosh
+ </option>
+ <option value="Other">Other
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>O</u>S:</b>
+ </td><td>
+ <label for="op_sys" accesskey="o">
+ <select name="op_sys" id="op_sys">
+ <option value="All">All
+ </option>
+ <option value="Windows">Windows
+ </option>
+ <option value="Mac OS">Mac OS
+ </option>
+ <option value="Linux">Linux
+ </option>
+ <option value="Other" selected>Other
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>V</u>ersion:</b>
+ </td><td>
+ <label for="version" accesskey="v">
+ <select name="version" id="version">
+ <option value="other" selected>other
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><a href="page.cgi?id=fields.html#priority">Pr<u>i</u>ority</a>:</b>
+ </td><td>
+ <label for="priority" accesskey="i">
+ <select name="priority" id="priority">
+ <option value="P1">P1
+ </option>
+ <option value="P2" selected>P2
+ </option>
+ <option value="P3">P3
+ </option>
+ <option value="P4">P4
+ </option>
+ <option value="P5">P5
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><a href="page.cgi?id=fields.html#bug_severity">S<u>e</u>verity</a>:</b>
+ </td><td>
+ <label for="bug_severity" accesskey="e">
+ <select name="bug_severity" id="bug_severity">
+ <option value="blocker">blocker
+ </option>
+ <option value="critical">critical
+ </option>
+ <option value="major">major
+ </option>
+ <option value="normal" selected>normal
+ </option>
+ <option value="minor">minor
+ </option>
+ <option value="trivial">trivial
+ </option>
+ <option value="enhancement">enhancement
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+
+ </table>
+ </td>
+
+ <td valign="top">
+
+ <table cellpadding="1" cellspacing="1">
+
+ <tr>
+ <td align="right">
+ <b>Reporter:</b>
+ </td>
+ <td>
+ <a href="mailto:relves@cs.ubc.ca">Robert Elves <relves@cs.ubc.ca></a>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b><u>A</u>dd CC:</b>
+ </td>
+ <td><input
+ name="newcc"
+ value="" accesskey="a" size="30"
+>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>CC:</b>
+ </td>
+ <td valign="top">
+ <select name="cc" multiple="multiple" size="5">
+ <option value="relves@cs.ubc.ca">relves@cs.ubc.ca</option>
+ </select>
+ <br>
+ <input type="checkbox" name="removecc">Remove selected CCs
+ <br>
+ </td>
+ </tr>
+
+ </table>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">
+ <table cellspacing="1" cellpadding="1">
+
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+ <u>U</u>RL:
+ </b>
+ </td>
+ <td colspan="5">
+ <input name="bug_file_loc" accesskey="u"
+ value="" size="60">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>S</u>ummary:</b>
+ </td>
+ <td colspan="5">
+ <input name="short_desc" accesskey="s"
+ value="summary" size="60">
+ </td>
+ </tr>
+
+
+
+ </table>
+ </td>
+
+ <td valign="top">
+ <table cellspacing="1" cellpadding="1">
+ <tr>
+ <td colspan="2" valign="top">
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+
+
+<br>
+<table cellspacing="0" cellpadding="4" border="1">
+ <tr>
+ <th bgcolor="#cccccc" align="left">Attachment</th>
+ <th bgcolor="#cccccc" align="left">Type</th>
+ <th bgcolor="#cccccc" align="left">Created</th>
+ <th bgcolor="#cccccc" align="left">Size</th>
+ <th bgcolor="#cccccc" align="left">Actions</th>
+ </tr>
+
+ <tr>
+ <td colspan="4">
+ <a href="attachment.cgi?bugid=7&action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.)
+ </td>
+ <td class="bz_disabled">
+ View All
+ </td>
+ </tr>
+</table>
+<br>
+
+
+
+ <table>
+ <tr><th align="right">Bug 7 <u>d</u>epends on:</th>
+ <td>
+ </td>
+ <td>
+ <input name="dependson" accesskey="d"
+ value="">
+ </td>
+ <td rowspan="2">
+ <a href="showdependencytree.cgi?id=7">Show
+ dependency tree</a>
+
+ <br>
+ <a href="showdependencygraph.cgi?id=7">Show
+ dependency graph</a>
+ </td>
+ </tr>
+
+ <tr><th align="right">Bug 7 <u>b</u>locks:</th>
+ <td>
+ </td>
+ <td>
+ <input name="blocked" accesskey="b"
+ value="">
+ </td>
+ </tr>
+ </table>
+
+
+
+
+ <br>
+ <b>Additional <u>C</u>omments:</b>
+ <br>
+ <a name="add_comment"></a>
+ <textarea name="comment" id="comment" rows="10" cols="80"
+ accesskey="c"></textarea>
+
+ <br>
+ <label for="addselfcc">
+ <input type="checkbox" id="addselfcc" name="addselfcc">
+ Add to CC list
+ </label>
+ <br>
+
+<br>
+ <input type="radio" id="knob-leave" name="knob" value="none" checked="checked">
+ <label for="knob-leave">
+ Leave as <b>NEW </b>
+ </label>
+ <br>
+
+
+
+ <input type="radio" id="knob-accept" name="knob" value="accept">
+ <label for="knob-accept">
+ Accept bug (change
+ status to <b>ASSIGNED</b>)
+ </label>
+ <br>
+
+
+ <input type="radio" id="knob-resolve" name="knob" value="resolve">
+ <label for="knob-resolve">
+ Resolve bug, changing
+ <a href="page.cgi?id=fields.html#resolution">resolution</a> to
+ </label>
+ <select name="resolution"
+ onchange="document.changeform.knob[2].checked=true">
+ <option value="FIXED">FIXED</option>
+ <option value="INVALID">INVALID</option>
+ <option value="WONTFIX">WONTFIX</option>
+ <option value="LATER">LATER</option>
+ <option value="REMIND">REMIND</option>
+ <option value="WORKSFORME">WORKSFORME</option>
+ </select>
+ <br>
+
+ <input type="radio" id="knob-duplicate" name="knob" value="duplicate">
+ <label for="knob-duplicate">
+ Resolve bug, mark it as duplicate of bug #
+ </label>
+ <input name="dup_id" size="6"
+ onchange="if (this.value != '')
+ {document.changeform.knob[3].checked=true}">
+ <br>
+
+ <input type="radio" id="knob-reassign" name="knob" value="reassign">
+ <label for="knob-reassign">
+ <a href="page.cgi?id=fields.html#assigned_to">Reassign</a> bug to
+ </label><input
+ name="assigned_to"
+ value="relves@cs.ubc.ca" onchange="if ((this.value != 'relves\x40cs.ubc.ca') && (this.value != '')) {
+ document.changeform.knob[4].checked=true;
+ }" accesskey="b" size="32"
+>
+ <br>
+
+ <input type="radio" id="knob-reassign-cmp" name="knob" value="reassignbycomponent">
+ <label for="knob-reassign-cmp">
+ Reassign bug to default assignee
+ of selected component
+ </label>
+ <br>
+
+ <input type="submit" value="Commit">
+ <input type="hidden" name="form_name" value="process_bug">
+ <p>
+ <font size="+1">
+ <b>
+ <a href="show_activity.cgi?id=7">View Bug Activity</a>
+ |
+ <a href="show_bug.cgi?format=multiple&id=7">Format For Printing</a>
+ |
+ <a href="enter_bug.cgi?cloned_bug_id=7">Clone This Bug</a>
+
+
+ </b>
+ </font>
+
+ </p>
+
+
+
+<hr>
+<div >
+ <table>
+ <tr>
+ <td align="left">
+ <b><a name="c0" href="#c0">Description</a>:</b> <script
+ type="text/javascript"><!--
+ addReplyLink(0);
+ //--></script>
+ </td>
+ <td align="left" width="30%">
+ <b>Opened:</b> 2006-02-13 17:02
+ </td>
+ </tr>
+ </table>
+
+
+
+<pre id="comment_text_0">test summary
+</pre>
+ </div>
+ <div >
+ <br>
+ <span class="bz_comment">
+ ------- <i>Comment
+ <a name="c1" href="#c1">#1</a> From
+ <a href="mailto:relves@cs.ubc.ca">Robert Elves</a>
+ 2006-02-21 16:34
+ </i>
+ <script type="text/javascript"><!--
+ addReplyLink(1); //--></script>
+ -------
+ </span>
+
+
+
+<pre id="comment_text_1">out
+</pre>
+ </div>
+
+</form>
+
+<hr>
+<i><font color="#777777">First</font></i>
+ <i><font color="#777777">Last</font></i>
+ <i><font color="#777777">Prev</font></i>
+ <i><font color="#777777">Next</font></i>
+
+ <i><font color="#777777">No search results available</font></i>
+
+ <a href="query.cgi">Search page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<br>
+<div id="footer">
+ <div class="intro"></div>
+
+
+
+
+<form method="get" action="show_bug.cgi">
+<div id="useful-links">
+ <div id="links-actions">
+ <div class="label">Actions:</div>
+ <div class="links">
+ <a href="./">Home</a> |
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Search</a> |
+ bug # <input class="txt" name="id" size="6">
+ <input class="btn" type="submit" value="Find"> |
+
+ <a href="report.cgi">Reports</a>
+
+ | <a href="request.cgi">Requests</a>
+
+
+ | <a href="createaccount.cgi">New Account</a>
+ | <a href="index.cgi?GoAheadAndLogIn=1">Log In</a>
+ </div>
+ </div>
+
+
+
+
+
+ <div id="links-saved">
+ <div class="label">
+ </div>
+ <div class="links">
+
+ </div>
+ </div>
+
+
+</div>
+</form>
+
+ <div class="outro"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-2201.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-2201.html
new file mode 100644
index 0000000..f93d6a5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-2201.html
@@ -0,0 +1,859 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>Bug 125527 - bugzilla refresh incorrect for new reports and newly opened hits</title>
+
+
+
+
+
+
+ <script type="text/javascript">
+ <!--
+
+ function initHelp() {}
+ // -->
+ </script>
+
+ <link href="skins/standard/global.css" rel="stylesheet" type="text/css">
+ <link href="skins/custom/global.css" rel="stylesheet" type="text/css">
+
+
+
+
+
+ </head>
+
+
+
+ <body onload=""
+ class="bugs-eclipse-org-bugs bz_bug bz_status_RESOLVED bz_component_Bugzilla bz_bug_125527">
+
+
+<!-- 1.0 at bugzilla.org -->
+
+
+
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr style="background-image: url(/bugs/header_bg.gif);">
+ <td>
+ <a href="http://www.eclipse.org/"><img src="/bugs/header_logo.gif" width="164" height="68" border="0" /></a>
+ </td>
+ <td align="right" style="color: white; font-family: verdana,arial,helvetica; font-size: 1.25em; font-style: italic;"><b>Eclipse bugs</b></font> <br /><font style="font-size: .5em;">Bugzilla 2.20.1  </font></td>
+ </tr>
+</table>
+
+<div id="header">
+ <h1>Bugzilla Bug 125527</h1>
+
+ <h2>bugzilla refresh incorrect for new reports and newly opened hits</h2>
+
+ <h3>Last modified: 2006-01-27 21:30:34</h3>
+</div>
+<i><font color="#777777">First</font></i>
+ <i><font color="#777777">Last</font></i>
+ <i><font color="#777777">Prev</font></i>
+ <i><font color="#777777">Next</font></i>
+
+ <i><font color="#777777">No search results available</font></i>
+
+ <a href="query.cgi">Search page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<hr>
+<script type="text/javascript">
+ <!--
+
+ /* Outputs a link to call replyToComment(); used to reduce HTML output */
+ function addReplyLink(id) {
+ /* XXX this should really be updated to use the DOM Core's
+ * createElement, but finding a container isn't trivial.
+ */
+ document.write('[<a href="#add_comment" onclick="replyToComment(' +
+ id + ');">reply<' + '/a>]');
+ }
+
+ /* Adds the reply text to the `comment' textarea */
+ function replyToComment(id) {
+ /* pre id="comment_name_N" */
+ var text_elem = document.getElementById('comment_text_'+id);
+ var text = getText(text_elem);
+
+ /* make sure we split on all newlines -- IE or Moz use \r and \n
+ * respectively.
+ */
+ text = text.split(/\r|\n/);
+
+ var replytext = "";
+ for (var i=0; i < text.length; i++) {
+ replytext += "> " + text[i] + "\n";
+ }
+
+ replytext = "(In reply to comment #" + id + ")\n" + replytext + "\n";
+
+
+ /* <textarea id="comment"> */
+ var textarea = document.getElementById('comment');
+ textarea.value += replytext;
+
+ textarea.focus();
+ }
+
+ if (typeof Node == 'undefined') {
+ /* MSIE doesn't define Node, so provide a compatibility object */
+ window.Node = {
+ TEXT_NODE: 3,
+ ENTITY_REFERENCE_NODE: 5
+ };
+ }
+
+ /* Concatenates all text from element's childNodes. This is used
+ * instead of innerHTML because we want the actual text (and
+ * innerText is non-standard).
+ */
+ function getText(element) {
+ var child, text = "";
+ for (var i=0; i < element.childNodes.length; i++) {
+ child = element.childNodes[i];
+ var type = child.nodeType;
+ if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
+ text += child.nodeValue;
+ } else {
+ /* recurse into nodes of other types */
+ text += getText(child);
+ }
+ }
+ return text;
+ }
+
+
+ //-->
+ </script>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="2006-01-27 21:30:34">
+ <input type="hidden" name="longdesclength" value="2">
+ <input type="hidden" name="id" value="125527">
+
+
+
+ <table>
+
+ <tr>
+ <td valign="top">
+ <table cellspacing="1" cellpadding="1">
+
+ <tr>
+ <td align="right">
+ <b>[Technology]</b>
+ <b>Bug#:</b>
+ </td>
+ <td>
+ <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125527">125527</a>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>P</u>roduct:</b>
+ </td><td>
+ <label for="product" accesskey="p">
+ <select name="product" id="product">
+ <option value="AJDT">AJDT
+ </option>
+ <option value="ALF">ALF
+ </option>
+ <option value="AspectJ">AspectJ
+ </option>
+ <option value="BIRT">BIRT
+ </option>
+ <option value="BPEL">BPEL
+ </option>
+ <option value="Buckminster">Buckminster
+ </option>
+ <option value="CDT">CDT
+ </option>
+ <option value="Community">Community
+ </option>
+ <option value="Dali">Dali
+ </option>
+ <option value="Dash">Dash
+ </option>
+ <option value="Data Tools">Data Tools
+ </option>
+ <option value="DSDP">DSDP
+ </option>
+ <option value="ECF">ECF
+ </option>
+ <option value="EMF">EMF
+ </option>
+ <option value="EMFT">EMFT
+ </option>
+ <option value="EPF">EPF
+ </option>
+ <option value="Equinox">Equinox
+ </option>
+ <option value="ERCP">ERCP
+ </option>
+ <option value="GEF">GEF
+ </option>
+ <option value="GMF">GMF
+ </option>
+ <option value="GMT">GMT
+ </option>
+ <option value="Higgins">Higgins
+ </option>
+ <option value="Hyades">Hyades
+ </option>
+ <option value="Java Server Faces">Java Server Faces
+ </option>
+ <option value="JDT">JDT
+ </option>
+ <option value="JSR220-ORM">JSR220-ORM
+ </option>
+ <option value="Laszlo">Laszlo
+ </option>
+ <option value="Lepido">Lepido
+ </option>
+ <option value="MDDi">MDDi
+ </option>
+ <option value="MTJ">MTJ
+ </option>
+ <option value="Mylar" selected>Mylar
+ </option>
+ <option value="OHF">OHF
+ </option>
+ <option value="PDE">PDE
+ </option>
+ <option value="Phoenix">Phoenix
+ </option>
+ <option value="Photran">Photran
+ </option>
+ <option value="Platform">Platform
+ </option>
+ <option value="PTP">PTP
+ </option>
+ <option value="SOA">SOA
+ </option>
+ <option value="Target Management">Target Management
+ </option>
+ <option value="TPTP">TPTP
+ </option>
+ <option value="UML2">UML2
+ </option>
+ <option value="VE">VE
+ </option>
+ <option value="VTP">VTP
+ </option>
+ <option value="Web Tools">Web Tools
+ </option>
+ <option value="XSD">XSD
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="describecomponents.cgi?product=Mylar">
+ Co<u>m</u>ponent</a>:
+ </b>
+ </td><td>
+ <label for="component" accesskey="m">
+ <select name="component" id="component">
+ <option value="Bugzilla" selected>Bugzilla
+ </option>
+ <option value="Core">Core
+ </option>
+ <option value="Doc">Doc
+ </option>
+ <option value="Java">Java
+ </option>
+ <option value="Jira">Jira
+ </option>
+ <option value="Monitor">Monitor
+ </option>
+ <option value="Tasks">Tasks
+ </option>
+ <option value="UI">UI
+ </option>
+ <option value="XML">XML
+ </option>
+ <option value="Zest">Zest
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#status">Status</a>:
+ </b>
+ </td>
+ <td>RESOLVED</td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#resolution">Resolution</a>:
+ </b>
+ </td>
+ <td>FIXED
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#assigned_to">Assigned To</a>:
+ </b>
+ </td>
+ <td>Robert Elves <relves@cs.ubc.ca></td>
+ </tr>
+
+ </table>
+
+ </td>
+ <td valign="top">
+
+ <table cellspacing="1" cellpadding="1">
+
+ <tr>
+ <td align="right">
+ <b><u>H</u>ardware:</b>
+ </td><td>
+ <label for="rep_platform" accesskey="h">
+ <select name="rep_platform" id="rep_platform">
+ <option value="All">All
+ </option>
+ <option value="Macintosh">Macintosh
+ </option>
+ <option value="Other">Other
+ </option>
+ <option value="PC" selected>PC
+ </option>
+ <option value="Power PC">Power PC
+ </option>
+ <option value="Sun">Sun
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>O</u>S:</b>
+ </td><td>
+ <label for="op_sys" accesskey="o">
+ <select name="op_sys" id="op_sys">
+ <option value="All">All
+ </option>
+ <option value="AIX Motif">AIX Motif
+ </option>
+ <option value="HP-UX">HP-UX
+ </option>
+ <option value="Linux">Linux
+ </option>
+ <option value="Linux-GTK">Linux-GTK
+ </option>
+ <option value="Linux-Motif">Linux-Motif
+ </option>
+ <option value="Mac OS">Mac OS
+ </option>
+ <option value="MacOS X">MacOS X
+ </option>
+ <option value="Neutrino">Neutrino
+ </option>
+ <option value="other">other
+ </option>
+ <option value="QNX-Photon">QNX-Photon
+ </option>
+ <option value="Solaris">Solaris
+ </option>
+ <option value="Solaris-GTK">Solaris-GTK
+ </option>
+ <option value="Solaris-Motif">Solaris-Motif
+ </option>
+ <option value="SymbianOS-Series 80">SymbianOS-Series 80
+ </option>
+ <option value="Unix All">Unix All
+ </option>
+ <option value="Windows All" selected>Windows All
+ </option>
+ <option value="Windows 95">Windows 95
+ </option>
+ <option value="Windows 98">Windows 98
+ </option>
+ <option value="Windows 2000">Windows 2000
+ </option>
+ <option value="Windows 2003 Server">Windows 2003 Server
+ </option>
+ <option value="Windows CE">Windows CE
+ </option>
+ <option value="Windows ME">Windows ME
+ </option>
+ <option value="Windows Mobile 2003">Windows Mobile 2003
+ </option>
+ <option value="Windows NT">Windows NT
+ </option>
+ <option value="Windows XP">Windows XP
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>Version:</b>
+ </td><td>
+ <label for="version" accesskey="o">
+ <select name="version" id="version">
+ <option value="0.2">0.2
+ </option>
+ <option value="0.3">0.3
+ </option>
+ <option value="0.4">0.4
+ </option>
+ <option value="unspecified" selected>unspecified
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><a href="page.cgi?id=fields.html#priority">Pr<u>i</u>ority</a>:</b>
+ </td><td>
+ <label for="priority" accesskey="i">
+ <select name="priority" id="priority">
+ <option value="P1" selected>P1
+ </option>
+ <option value="P2">P2
+ </option>
+ <option value="P3">P3
+ </option>
+ <option value="P4">P4
+ </option>
+ <option value="P5">P5
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><a href="page.cgi?id=fields.html#bug_severity">Severity</a>:</b>
+ </td><td>
+ <label for="bug_severity" accesskey="i">
+ <select name="bug_severity" id="bug_severity">
+ <option value="blocker">blocker
+ </option>
+ <option value="critical">critical
+ </option>
+ <option value="major">major
+ </option>
+ <option value="normal" selected>normal
+ </option>
+ <option value="minor">minor
+ </option>
+ <option value="trivial">trivial
+ </option>
+ <option value="enhancement">enhancement
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ Target Milestone:
+ </b>
+ </td><td>
+ <label for="target_milestone" accesskey="i">
+ <select name="target_milestone" id="target_milestone">
+ <option value="---" selected>---
+ </option>
+ <option value="0.5">0.5
+ </option>
+ <option value="0.6">0.6
+ </option>
+ </select>
+ </label>
+ </td>
+ <td> </td>
+ </tr>
+
+ </table>
+ </td>
+
+ <td valign="top">
+
+ <table cellpadding="1" cellspacing="1">
+
+ <tr>
+ <td align="right">
+ <b>Reporter:</b>
+ </td>
+ <td>
+ <a href="mailto:beatmik@acm.org">Mik Kersten <beatmik@acm.org></a>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b><u>A</u>dd CC:</b>
+ </td>
+ <td><input
+ name="newcc"
+ value="" accesskey="a" size="30"
+>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>CC:</b>
+ </td>
+ <td valign="top">
+ <select name="cc" multiple="multiple" size="5">
+ <option value="beatmik@acm.org">beatmik@acm.org</option>
+ </select>
+ <br>
+ <input type="checkbox" name="removecc">Remove selected CCs
+ <br>
+ </td>
+ </tr>
+
+ </table>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">
+ <table cellspacing="1" cellpadding="1">
+
+
+
+ <tr>
+ <td align="right">
+ <b><u>Q</u>A Contact:</b>
+ </td>
+ <td colspan="7"><input
+ name="qa_contact"
+ value="" accesskey="q" size="60"
+>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <u>U</u>RL:
+ </b>
+ </td>
+ <td colspan="5">
+ <input name="bug_file_loc" accesskey="u"
+ value="" size="60">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>S</u>ummary:</b>
+ </td>
+ <td colspan="5">
+ <input name="short_desc" accesskey="s"
+ value="bugzilla refresh incorrect for new reports and newly opened hits" size="60">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>Status <u>W</u>hiteboard:</b>
+ </td>
+ <td colspan="5">
+ <input name="status_whiteboard" accesskey="w"
+ value="" size="60">
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="describekeywords.cgi"><u>K</u>eywords</a>:
+ </b>
+ <td colspan="5">
+ <input name="keywords" accesskey="k"
+ value="" size="60">
+ </td>
+ </tr>
+
+ </table>
+ </td>
+
+ <td valign="top">
+ <table cellspacing="1" cellpadding="1">
+ <tr>
+ <td colspan="2" valign="top">
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+
+
+<br>
+<table cellspacing="0" cellpadding="4" border="1">
+ <tr>
+ <th bgcolor="#cccccc" align="left">Attachment</th>
+ <th bgcolor="#cccccc" align="left">Type</th>
+ <th bgcolor="#cccccc" align="left">Created</th>
+ <th bgcolor="#cccccc" align="left">Size</th>
+ <th bgcolor="#cccccc" align="left">Actions</th>
+ </tr>
+
+ <tr>
+ <td colspan="4">
+ <a href="attachment.cgi?bugid=125527&action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.)
+ </td>
+ <td class="bz_disabled">
+ View All
+ </td>
+ </tr>
+</table>
+<br>
+
+
+
+ <table>
+ <tr><th align="right">Bug 125527 depends on:</th>
+ <td>
+ </td>
+ <td>
+ <input name="dependson" accesskey="i"
+ value="">
+ </td>
+ <td rowspan="2">
+ <a href="showdependencytree.cgi?id=125527">Show
+ dependency tree</a>
+
+ </td>
+ </tr>
+
+ <tr><th align="right">Bug 125527 <u>b</u>locks:</th>
+ <td>
+ </td>
+ <td>
+ <input name="blocked" accesskey="b"
+ value="">
+ </td>
+ </tr>
+ </table>
+
+ <table>
+ <tr>
+ <th>
+ <a href="page.cgi?id=voting.html">Votes</a>:
+ </th>
+ <td>0
+ <a href="votes.cgi?action=show_bug&bug_id=125527">Show
+ votes for this bug</a>
+ <a href="votes.cgi?action=show_user&bug_id=125527#vote_125527">Vote
+ for this bug</a>
+ </td>
+ </tr>
+ </table>
+
+
+
+ <br>
+ <b>Additional <u>C</u>omments:</b>
+ <br>
+ <a name="add_comment"></a>
+ <textarea name="comment" id="comment" rows="10" cols="80"
+ accesskey="c"></textarea>
+
+ <br>
+ <label for="addselfcc">
+ <input type="checkbox" id="addselfcc" name="addselfcc">
+ Add to CC list
+ </label>
+ <br>
+
+<br>
+ <input type="radio" id="knob-leave" name="knob" value="none" checked="checked">
+ <label for="knob-leave">
+ Leave as <b>RESOLVED FIXED</b>
+ </label>
+ <br>
+
+
+
+
+ <input type="radio" id="knob-reopen" name="knob" value="reopen">
+ <label for="knob-reopen">
+ Reopen bug
+ </label>
+ <br>
+ <input type="radio" id="knob-verify" name="knob" value="verify">
+ <label for="knob-verify">
+ Mark bug as <b>VERIFIED</b>
+ </label>
+ <br>
+ <input type="radio" id="knob-close" name="knob" value="close">
+ <label for="knob-close">
+ Mark bug as <b>CLOSED</b>
+ </label>
+ <br>
+
+ <input type="submit" value="Commit">
+ <input type="hidden" name="form_name" value="process_bug">
+ <p>
+ <font size="+1">
+ <b>
+ <a href="show_activity.cgi?id=125527">View Bug Activity</a>
+ |
+ <a href="show_bug.cgi?format=multiple&id=125527">Format For Printing</a>
+ |
+ <a href="enter_bug.cgi?cloned_bug_id=125527">Clone This Bug</a>
+
+
+ </b>
+ </font>
+
+ </p>
+
+
+
+<hr>
+<div >
+ <table>
+ <tr>
+ <td align="left">
+ <b><a name="c0" href="show_bug.cgi?id=125527#c0">
+ Description</a>:</b> <script type="text/javascript"><!--
+ addReplyLink(0);
+ //--></script>
+ </td>
+ <td align="left" width="30%">
+ <b>Opened:</b> 2006-01-27 13:36
+ </td>
+ </tr>
+ </table>
+
+
+
+<pre id="comment_text_0">After bug report is added, description is always blank, and it's opened in
+wrong editor (ExistingBugEditor, not MylarTaskEditor).
+
+After hit is opened and becomes a task, task stays italic.
+</pre>
+ </div>
+ <div >
+ <br>
+ <span class="bz_comment">
+ ------- <i>Comment
+ <a name="c1" href="show_bug.cgi?id=125527#c1">
+ #1</a> From
+ <a href="mailto:beatmik@acm.org">Mik Kersten</a>
+ 2006-01-27 21:30
+ </i>
+ <script type="text/javascript"><!--
+ addReplyLink(1); //--></script>
+ -------
+ </span>
+
+
+
+<pre id="comment_text_1">Done.
+</pre>
+ </div>
+
+</form>
+
+<hr>
+<i><font color="#777777">First</font></i>
+ <i><font color="#777777">Last</font></i>
+ <i><font color="#777777">Prev</font></i>
+ <i><font color="#777777">Next</font></i>
+
+ <i><font color="#777777">No search results available</font></i>
+
+ <a href="query.cgi">Search page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<br>
+<div id="footer">
+ <div class="intro"></div>
+
+
+
+
+<form method="get" action="show_bug.cgi">
+<div id="useful-links">
+ <div id="links-actions">
+ <div class="label">Actions:</div>
+ <div class="links">
+ <a href="./">Home</a> |
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Search</a> |
+ bug # <input class="txt" name="id" size="6">
+ <input class="btn" type="submit" value="Find"> |
+
+ <a href="report.cgi">Reports</a>
+
+ | <a href="request.cgi">Requests</a>
+
+
+ | <a href="createaccount.cgi">New Account</a>
+ | <a href="index.cgi?GoAheadAndLogIn=1">Log In</a>
+ </div>
+ </div>
+
+
+
+
+
+ <div id="links-saved">
+ <div class="label">
+ </div>
+ <div class="links">
+
+ </div>
+ </div>
+
+
+</div>
+</form>
+
+ <div class="outro"></div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-222attachment.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-222attachment.html
new file mode 100644
index 0000000..6248ce4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/test-report-222attachment.html
@@ -0,0 +1,859 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <title>Bug 4 - Another Test</title>
+
+
+<link rel="Top" href="http://mylar.eclipse.org/bugs222/">
+
+
+ <link rel="Up" href="buglist.cgi?regetlastlist=1">
+
+ <link rel="First" href="show_bug.cgi?id=1">
+ <link rel="Last" href="show_bug.cgi?id=4">
+
+
+
+ <link rel="Prev" href="show_bug.cgi?id=3">
+
+
+
+
+
+ <link rel="Show" title="Dependency Tree"
+ href="showdependencytree.cgi?id=4">
+ <link rel="Show" title="Dependency Graph"
+ href="showdependencygraph.cgi?id=4">
+
+
+ <link rel="Show" title="Bug Activity"
+ href="show_activity.cgi?id=4">
+
+ <link rel="Show" title="Printer-Friendly Version"
+ href="show_bug.cgi?format=multiple&id=4">
+
+
+
+ <link rel="Saved Searches" title="My Bugs"
+ href="buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailreporter1=1&emailtype1=exact&email1=relves%40cs.ubc.ca&field0-0-0=bug_status&type0-0-0=notequals&value0-0-0=UNCONFIRMED&field0-0-1=reporter&type0-0-1=equals&value0-0-1=relves%40cs.ubc.ca">
+
+
+ <link rel="Administration" title="Parameters"
+ href="editparams.cgi"><link rel="Administration" title="Users"
+ href="editusers.cgi"><link rel="Administration" title="Products"
+ href="editproducts.cgi"><link rel="Administration" title="Flag Types"
+ href="editflagtypes.cgi"><link rel="Administration" title="Groups"
+ href="editgroups.cgi"><link rel="Administration" title="Keywords"
+ href="editkeywords.cgi"><link rel="Administration" title="Whining"
+ href="editwhines.cgi"><link rel="Administration" title="Sanity Check"
+ href="sanitycheck.cgi">
+
+
+
+ <script type="text/javascript">
+ <!--
+
+ function initHelp() {}
+ // -->
+ </script>
+
+ <link href="skins/standard/global.css" rel="stylesheet" type="text/css">
+
+ <link href="skins/custom/global.css" rel="stylesheet" type="text/css">
+
+
+
+
+
+ </head>
+
+
+
+ <body onload=""
+ class="mylar-eclipse-org-bugs222 bz_bug bz_status_NEW bz_component_TestComponent bz_bug_4">
+
+
+<div id="banner">
+ <div class="intro"></div>
+
+ <p id="banner-name">
+ <span>This is Bugzilla</span>
+ </p>
+ <p id="banner-version">
+ <a href="http://www.bugzilla.org/"><span>Bugzilla</span></a>
+ <span>Version 2.22rc1</span>
+ </p>
+
+ <div class="outro"></div>
+ </div>
+
+<div id="header">
+ <h1>Bugzilla Bug 4</h1>
+
+ <h2>Another Test</h2>
+
+ <h3>Last modified: 2006-03-10 14:11:48</h3>
+
+</div>
+
+<b>Bug List:</b>
+ (4 of 4)
+
+ <a href="show_bug.cgi?id=1">First</a>
+ <a href="show_bug.cgi?id=4">Last</a>
+
+ <a href="show_bug.cgi?id=3">Prev</a>
+
+ <i><font color="#777777">Next</font></i>
+
+ <a href="buglist.cgi?regetlastlist=1">Show last search results</a>
+
+ <a href="query.cgi">Search page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<hr>
+<script type="text/javascript">
+ <!--
+
+ /* Outputs a link to call replyToComment(); used to reduce HTML output */
+ function addReplyLink(id) {
+ /* XXX this should really be updated to use the DOM Core's
+ * createElement, but finding a container isn't trivial.
+ */
+ document.write('[<a href="#add_comment" onclick="replyToComment(' +
+ id + ');">reply<' + '/a>]');
+ }
+
+ /* Adds the reply text to the `comment' textarea */
+ function replyToComment(id) {
+ /* pre id="comment_name_N" */
+ var text_elem = document.getElementById('comment_text_'+id);
+ var text = getText(text_elem);
+
+ /* make sure we split on all newlines -- IE or Moz use \r and \n
+ * respectively.
+ */
+ text = text.split(/\r|\n/);
+
+ var replytext = "";
+ for (var i=0; i < text.length; i++) {
+ replytext += "> " + text[i] + "\n";
+ }
+
+ replytext = "(In reply to comment #" + id + ")\n" + replytext + "\n";
+
+
+ /* <textarea id="comment"> */
+ var textarea = document.getElementById('comment');
+ textarea.value += replytext;
+
+ textarea.focus();
+ }
+
+ if (typeof Node == 'undefined') {
+ /* MSIE doesn't define Node, so provide a compatibility object */
+ window.Node = {
+ TEXT_NODE: 3,
+ ENTITY_REFERENCE_NODE: 5
+ };
+ }
+
+ /* Concatenates all text from element's childNodes. This is used
+ * instead of innerHTML because we want the actual text (and
+ * innerText is non-standard).
+ */
+ function getText(element) {
+ var child, text = "";
+ for (var i=0; i < element.childNodes.length; i++) {
+ child = element.childNodes[i];
+ var type = child.nodeType;
+ if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
+ text += child.nodeValue;
+ } else {
+ /* recurse into nodes of other types */
+ text += getText(child);
+ }
+ }
+ return text;
+ }
+
+
+ function updateCommentTagControl(checkbox, form) {
+ if (checkbox.checked) {
+ form.comment.className='bz_private';
+ } else {
+ form.comment.className='';
+ }
+ }
+
+ //-->
+ </script>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="2006-03-10 14:11:48">
+
+ <input type="hidden" name="longdesclength" value="2">
+ <input type="hidden" name="id" value="4">
+
+
+
+ <table>
+
+ <tr>
+ <td valign="top">
+ <table cellspacing="1" cellpadding="1">
+ <tr>
+
+ <td align="right">
+ <b>Bug#:</b>
+ </td>
+ <td>
+ <a href="http://mylar.eclipse.org/bugs222/show_bug.cgi?id=4">4</a>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>P</u>roduct:</b>
+ </td><td>
+ <label for="product" accesskey="p">
+ <select name="product" id="product">
+ <option value="TestProduct" selected>TestProduct
+ </option>
+
+ </select>
+ </label>
+ </td>
+ </tr>
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="describecomponents.cgi?product=TestProduct">
+
+ Co<u>m</u>ponent</a>:
+ </b>
+ </td><td>
+ <label for="component" accesskey="m">
+ <select name="component" id="component">
+ <option value="TestComponent" selected>TestComponent
+ </option>
+ </select>
+
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#status">Status</a>:
+ </b>
+
+ </td>
+ <td>NEW</td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#resolution">Resolution</a>:
+ </b>
+
+ </td>
+ <td>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ <a href="page.cgi?id=fields.html#assigned_to">Assigned To</a>:
+ </b>
+
+ </td>
+ <td>Robert Elves <relves@cs.ubc.ca></td>
+ </tr>
+
+ </table>
+
+ </td>
+ <td valign="top">
+
+ <table cellspacing="1" cellpadding="1">
+
+ <tr>
+ <td align="right">
+ <b><u>H</u>ardware:</b>
+ </td><td>
+ <label for="rep_platform" accesskey="h">
+ <select name="rep_platform" id="rep_platform">
+
+ <option value="All">All
+ </option>
+ <option value="PC" selected>PC
+ </option>
+ <option value="Macintosh">Macintosh
+ </option>
+ <option value="Other">Other
+ </option>
+ </select>
+ </label>
+ </td>
+
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><u>O</u>S:</b>
+ </td><td>
+ <label for="op_sys" accesskey="o">
+ <select name="op_sys" id="op_sys">
+
+ <option value="All">All
+ </option>
+ <option value="Windows">Windows
+ </option>
+ <option value="Mac OS">Mac OS
+ </option>
+ <option value="Linux">Linux
+ </option>
+ <option value="Other" selected>Other
+ </option>
+ </select>
+
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>Version:</b>
+ </td><td>
+ <label for="version" accesskey="o">
+
+ <select name="version" id="version">
+ <option value="other" selected>other
+ </option>
+ </select>
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+
+ <b><a href="page.cgi?id=fields.html#priority">Pr<u>i</u>ority</a>:</b>
+ </td><td>
+ <label for="priority" accesskey="i">
+ <select name="priority" id="priority">
+ <option value="P1">P1
+ </option>
+ <option value="P2">P2
+ </option>
+
+ <option value="P3" selected>P3
+ </option>
+ <option value="P4">P4
+ </option>
+ <option value="P5">P5
+ </option>
+ </select>
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b><a href="page.cgi?id=fields.html#bug_severity">Severity</a>:</b>
+ </td><td>
+ <label for="bug_severity" accesskey="i">
+ <select name="bug_severity" id="bug_severity">
+ <option value="blocker">blocker
+ </option>
+
+ <option value="critical">critical
+ </option>
+ <option value="major">major
+ </option>
+ <option value="normal" selected>normal
+ </option>
+ <option value="minor">minor
+ </option>
+ <option value="trivial">trivial
+ </option>
+ <option value="enhancement">enhancement
+ </option>
+
+ </select>
+ </label>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right">
+ <b>
+ Target Milestone:
+ </b>
+
+ </td><td>
+ <label for="target_milestone" accesskey="i">
+ <select name="target_milestone" id="target_milestone">
+ <option value="---" selected>---
+ </option>
+ </select>
+ </label>
+ </td>
+ </tr>
+
+ </table>
+ </td>
+
+ <td valign="top">
+
+ <table cellpadding="1" cellspacing="1">
+
+ <tr>
+ <td align="right">
+ <b>Reporter:</b>
+
+ </td>
+ <td>
+ <a href="mailto:relves@cs.ubc.ca">Robert Elves <relves@cs.ubc.ca></a>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+
+ <b><u>A</u>dd CC:</b>
+ </td>
+ <td><input
+ name="newcc"
+ value="" accesskey="a" size="30"
+>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+
+ <b>CC:</b>
+ </td>
+ <td valign="top">
+ <input type="hidden" name="cc" value="">
+ </td>
+ </tr>
+
+ </table>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">
+ <table cellspacing="1" cellpadding="1">
+
+
+
+
+ <tr>
+ <td align="right">
+ <b>
+
+ <u>U</u>RL:
+ </b>
+ </td>
+ <td colspan="5">
+ <input name="bug_file_loc" accesskey="u"
+ value="" size="60">
+ </td>
+ </tr>
+
+ <tr>
+
+ <td align="right">
+ <b><u>S</u>ummary:</b>
+ </td>
+ <td colspan="5">
+ <input name="short_desc" accesskey="s"
+ value="Another Test" size="60">
+ </td>
+ </tr>
+
+
+ </table>
+ </td>
+
+ <td valign="top">
+ <table cellspacing="1" cellpadding="1">
+ <tr>
+ <td colspan="2" valign="top">
+ </td>
+
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+
+
+<br>
+<table cellspacing="0" cellpadding="4" border="1">
+ <tr>
+
+ <th bgcolor="#cccccc" align="left">Attachment</th>
+ <th bgcolor="#cccccc" align="left">Type</th>
+ <th bgcolor="#cccccc" align="left">Creator</th>
+ <th bgcolor="#cccccc" align="left">Created</th>
+ <th bgcolor="#cccccc" align="left">Size</th>
+ <th bgcolor="#cccccc" align="left">Actions</th>
+
+ </tr>
+ <tr >
+ <td valign="top">
+ <a href="attachment.cgi?id=1">Testing upload</a>
+ </td>
+
+ <td valign="top">text/plain
+ </td>
+
+ <td valign="top">
+
+ <a href="mailto:relves@cs.ubc.ca">Robert Elves
+ </a>
+ </td>
+ <td valign="top">2006-03-10 14:11</td>
+ <td valign="top">6.87 KB</td>
+
+
+ <td valign="top">
+ <a href="attachment.cgi?id=1&action=edit">Edit</a>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="5">
+ <a href="attachment.cgi?bugid=4&action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.)
+ </td>
+ <td>
+ <a href="attachment.cgi?bugid=4&action=viewall">View All</a>
+
+ </td>
+ </tr>
+</table>
+<br>
+
+
+
+ <table>
+ <tr><th align="right">Bug 4 depends on:</th>
+ <td>
+ </td>
+
+ <td>
+ <input name="dependson" accesskey="i"
+ value="">
+ </td>
+ <td rowspan="2">
+ <a href="showdependencytree.cgi?id=4">Show
+ dependency tree</a>
+
+ <br>
+ <a href="showdependencygraph.cgi?id=4">Show
+ dependency graph</a>
+
+ </td>
+ </tr>
+
+ <tr><th align="right">Bug 4 <u>b</u>locks:</th>
+ <td>
+ </td>
+ <td>
+ <input name="blocked" accesskey="b"
+ value="">
+
+ </td>
+ </tr>
+ </table>
+
+
+
+
+ <br>
+ <b>Additional <u>C</u>omments:</b>
+
+ <br>
+ <a name="add_comment"></a>
+ <textarea name="comment" id="comment" rows="10" cols="80"
+ accesskey="c"></textarea>
+
+ <br>
+ <label for="addselfcc">
+ <input type="checkbox" id="addselfcc" name="addselfcc">
+ Add relves@cs.ubc.ca to CC list
+ </label>
+
+ <br>
+
+<br>
+ <input type="radio" id="knob-leave" name="knob" value="none" checked="checked">
+ <label for="knob-leave">
+ Leave as <b>NEW </b>
+ </label>
+ <br>
+
+
+ <input type="radio" id="knob-accept" name="knob" value="accept">
+ <label for="knob-accept">
+ Accept bug (change
+ status to <b>ASSIGNED</b>)
+ </label>
+ <br>
+
+
+ <input type="radio" id="knob-resolve" name="knob" value="resolve">
+
+ <label for="knob-resolve">
+ Resolve bug, changing
+ <a href="page.cgi?id=fields.html#resolution">resolution</a> to
+ </label>
+ <select name="resolution"
+ onchange="document.changeform.knob[2].checked=true">
+ <option value="FIXED">FIXED</option>
+ <option value="INVALID">INVALID</option>
+ <option value="WONTFIX">WONTFIX</option>
+
+ <option value="LATER">LATER</option>
+ <option value="REMIND">REMIND</option>
+ <option value="WORKSFORME">WORKSFORME</option>
+ </select>
+ <br>
+
+ <input type="radio" id="knob-duplicate" name="knob" value="duplicate">
+ <label for="knob-duplicate">
+
+ Resolve bug, mark it as duplicate of bug #
+ </label>
+ <input name="dup_id" size="6"
+ onchange="if (this.value != '')
+ {document.changeform.knob[3].checked=true}">
+ <br>
+
+ <input type="radio" id="knob-reassign" name="knob" value="reassign">
+ <label for="knob-reassign">
+ <a href="page.cgi?id=fields.html#assigned_to">Reassign</a> bug to
+ </label><input
+ name="assigned_to"
+ value="relves@cs.ubc.ca" onchange="if ((this.value != 'relves\x40cs.ubc.ca') && (this.value != '')) {
+ document.changeform.knob[4].checked=true;
+ }" accesskey="b" size="32"
+>
+
+ <br>
+
+ <input type="radio" id="knob-reassign-cmp" name="knob" value="reassignbycomponent">
+ <label for="knob-reassign-cmp">
+ Reassign bug to default assignee
+ of selected component
+ </label>
+ <br>
+
+ <input type="submit" value="Commit">
+ <input type="hidden" name="form_name" value="process_bug">
+
+ <p>
+ <font size="+1">
+ <b>
+ <a href="show_activity.cgi?id=4">View Bug Activity</a>
+ |
+ <a href="show_bug.cgi?format=multiple&id=4">Format For Printing</a>
+ |
+
+ <a href="show_bug.cgi?ctype=xml&id=4">XML</a>
+ |
+ <a href="enter_bug.cgi?cloned_bug_id=4">Clone This Bug</a>
+
+
+ </b>
+ </font>
+
+ </p>
+
+
+
+<hr>
+<script type="text/javascript">
+ <!--
+ function updateCommentPrivacy(checkbox, id) {
+ var text_elem = document.getElementById('comment_text_'+id);
+ if (checkbox.checked) {
+ text_elem.parentNode.className='bz_private';
+ } else {
+ text_elem.parentNode.className='';
+ }
+ }
+ //-->
+ </script>
+
+
+
+
+
+
+
+
+<div >
+ <table>
+
+ <tr>
+ <td align="left">
+ <b><a name="c0" href="show_bug.cgi?id=4#c0">
+ Description</a>:</b> <script type="text/javascript"><!--
+ addReplyLink(0);
+ //--></script>
+ </td>
+ <td align="left" width="30%">
+ <b>Opened:</b> 2006-03-09 13:09
+ </td>
+
+ </tr>
+ </table>
+
+
+
+<pre id="comment_text_0">Testing new 2.22 version capability
+</pre>
+ </div>
+ <div >
+ <br>
+ <span class="bz_comment">
+ ------- <i>Comment
+ <a name="c1" href="show_bug.cgi?id=4#c1">
+
+ #1</a> From
+ <a href="mailto:relves@cs.ubc.ca">Robert Elves</a>
+ 2006-03-10 14:11:48
+ </i>
+ <script type="text/javascript"><!--
+ addReplyLink(1); //--></script>
+ -------
+ </span>
+
+
+
+<pre id="comment_text_1"><span class=""><a href="attachment.cgi?id=1&action=view" title="Testing upload">Created an attachment (id=1)</a> <a href="attachment.cgi?id=1&action=edit" title="Testing upload">[edit]</a></span>
+
+Testing upload
+
+The comment
+</pre>
+ </div>
+
+</form>
+
+<hr>
+<b>Bug List:</b>
+ (4 of 4)
+
+ <a href="show_bug.cgi?id=1">First</a>
+ <a href="show_bug.cgi?id=4">Last</a>
+
+ <a href="show_bug.cgi?id=3">Prev</a>
+
+ <i><font color="#777777">Next</font></i>
+
+ <a href="buglist.cgi?regetlastlist=1">Show last search results</a>
+
+ <a href="query.cgi">Search page</a>
+ <a href="enter_bug.cgi">Enter new bug</a>
+
+<br>
+<div id="footer">
+ <div class="intro"></div>
+
+
+
+
+<div id="useful-links">
+ <div id="links-actions">
+ <div class="label">Actions:</div>
+ <div class="links">
+
+ <a href="./">Home</a> |
+ <a href="enter_bug.cgi">New</a> |
+ <a href="query.cgi">Search</a> |
+
+ <form action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '')
+ { alert('Please enter one or more search terms first.');
+ return false; } return true;">
+ <input class="txt" type="text" name="quicksearch">
+ <input class="btn" type="submit" value="Find">
+ </form> |
+
+ <a href="report.cgi">Reports</a>
+
+ | <a href="request.cgi?requester=relves%40cs.ubc.ca&requestee=relves%40cs.ubc.ca&do_union=1&group=type">My Requests</a>
+
+
+ | <a href="votes.cgi?action=show_user">My Votes</a>
+ | <a href="sanitycheck.cgi">Sanity check</a>
+ | <a href="relogin.cgi">Log out</a> relves@cs.ubc.ca
+ </div>
+ </div>
+
+
+ <div id="links-edit">
+ <div class="label">Edit:</div>
+ <div class="links">
+
+ <a href="userprefs.cgi">Prefs</a> | <a href="editparams.cgi">Parameters</a> | <a href="editsettings.cgi">User Preferences</a> | <a href="editusers.cgi">Users</a> | <a href="editproducts.cgi">Products</a> | <a href="editflagtypes.cgi">Flags</a> | <a href="editvalues.cgi">Field Values</a> | <a href="editgroups.cgi">Groups</a> | <a href="editkeywords.cgi">Keywords</a> | <a href="editwhines.cgi">Whining</a>
+
+ </div>
+ </div>
+
+
+
+
+ <div id="links-saved">
+ <div class="label">
+ Saved Searches:
+ </div>
+ <div class="links">
+ <a href="buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailreporter1=1&emailtype1=exact&email1=relves%40cs.ubc.ca&field0-0-0=bug_status&type0-0-0=notequals&value0-0-0=UNCONFIRMED&field0-0-1=reporter&type0-0-1=equals&value0-0-1=relves%40cs.ubc.ca">My Bugs</a>
+
+ </div>
+ </div>
+
+
+<div id="links-special">
+ <div class="label"> </div>
+ <div class="links">
+ <form action="buglist.cgi" method="get">
+ <input type="hidden" name="cmdtype" value="doit">
+ <input type="hidden" name="remtype" value="asnamed">
+
+ <input type="hidden" name="add_bugids" value="1">
+ <input type="submit" value="Add"> bugs
+ <input type="text" name="bug_ids" size="8" maxlength="80"> to
+ the new saved search:
+ <input type="text" name="newqueryname" size="20" maxlength="64">
+ </form>
+ </div>
+ </div>
+
+
+</div>
+
+ <div class="outro"></div>
+</div>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/pages/ve-page.html b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/ve-page.html
new file mode 100644
index 0000000..e5423da
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/pages/ve-page.html
@@ -0,0 +1,178 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0054)https://bugs.eclipse.org/bugs/enter_bug.cgi?product=VE -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Enter Bug</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="VE_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="VE_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="VE_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Enter
+ Bug</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>This page lets you enter a new bug into
+ Bugzilla.</TD></TR></TBODY></TABLE>
+<FORM action=post_bug.cgi method=post><INPUT type=hidden value=VE name=product>
+<TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><!-- 1.0 at bugzilla.org -->Before reporting a bug, please read
+ the <A href="https://bugs.eclipse.org/bugs/bugwritinghelp.html">bug
+ writing guidelines</A>, please look at the list of <A
+ href="https://bugs.eclipse.org/bugs/duplicates.cgi">most frequently
+ reported bugs</A>, and please <A
+ href="https://bugs.eclipse.org/bugs/query.cgi">search</A> for the bug.
+ </TD></TR>
+ <TR>
+ <TD><BR></TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Reporter:</STRONG></TD>
+ <TD vAlign=top>tanya at cs.ubc.ca</TD>
+ <TD vAlign=top align=right><STRONG>Product:</STRONG></TD>
+ <TD vAlign=top>VE</TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Version:</STRONG> </TD>
+ <TD><SELECT size=5 name=version> <OPTION value=0.5.0>0.5.0</OPTION>
+ <OPTION value=1.0.0>1.0.0</OPTION> <OPTION value=unspecified
+ selected>unspecified</OPTION></SELECT> </TD>
+ <TD vAlign=top align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=VE">Component</A>:
+ </STRONG></TD>
+ <TD><SELECT size=5 name=component> <OPTION value=CDE>CDE</OPTION>
+ <OPTION value=Doc>Doc</OPTION> <OPTION value="Java Core">Java
+ Core</OPTION> <OPTION value="Java Model (JEM)">Java Model (JEM)</OPTION>
+ <OPTION value=JFC/Swing>JFC/Swing</OPTION> <OPTION
+ value=SWT>SWT</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#rep_platform">Platform</A>:
+ </STRONG></TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#op_sys">OS</A>:
+ </STRONG></TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD></TR>
+ <TR><INPUT type=hidden value=P3 name=priority>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#bug_severity">Severity</A>:
+ </STRONG></TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR><INPUT type=hidden value=NEW name=bug_status>
+ <TR>
+ <TD align=right><STRONG><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned
+ To</A>: </STRONG></TD>
+ <TD colSpan=3><INPUT size=32 name=assigned_to> (Leave blank to assign to
+ default component owner) </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Cc:</STRONG></TD>
+ <TD colSpan=3><INPUT size=45 name=cc> </TD></TR>
+ <TR>
+ <TD> </TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD colSpan=3><INPUT type=hidden size=60 name=bug_file_loc input> </TD></TR>
+ <TR>
+ <TD align=right><STRONG>Summary:</STRONG></TD>
+ <TD colSpan=3><INPUT size=60 name=short_desc> </TD></TR>
+ <TR>
+ <TD vAlign=top align=right><STRONG>Description:</STRONG></TD>
+ <TD colSpan=3><TEXTAREA name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+ <BR></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3></TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><INPUT onclick="if (this.form.short_desc.value == '') { alert('Please enter a summary sentence for this bug.'); return false; } return true;" type=submit value=" Commit ">
+ <INPUT type=submit value="Remember values as bookmarkable template" name=maketemplate>
+ </TD></TR>
+ <TR>
+ <TD></TD>
+ <TD colSpan=3><BR>We've made a guess at your operating system and
+ platform. Please check them and, if we got it wrong, email
+ webmaster at eclipse.org. </TD></TR></TBODY></TABLE><INPUT type=hidden
+value=enter_bug name=form_name> </FORM><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user">My
+ Votes</A> </TD>
+ <TD> </TD>
+ <TD vAlign=center>Edit <A
+ href="https://bugs.eclipse.org/bugs/userprefs.cgi">prefs</A> |
+ <A
+ href="https://bugs.eclipse.org/bugs/relogin.cgi">Log out</A> tanya at cs.ubc.ca
+ </TD></TR>
+ <TR>
+ <TD>Preset Queries: </TD>
+ <TD colSpan=3><A
+ href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&email1=tanya%40cs.ubc.ca&emailtype1=exact&emailassigned_to1=1&emailreporter1=1">My Bugs</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/1.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/1.html
new file mode 100644
index 0000000..cf50a3d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/1.html
@@ -0,0 +1,377 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0050)https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 4548 - DCR: TableTree should support icon in 1st column (1G06WFT)</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="4548_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="4548_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="4548_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 4548</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>DCR: TableTree should support icon in 1st
+ column (1G06WFT)</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug
+List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20020527161709 name=delta_ts> <INPUT type=hidden value=2
+name=longdesclength> <INPUT type=hidden value=4548 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548">4548</A>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All selected>All</OPTION>
+ <OPTION value=Macintosh>Macintosh</OPTION> <OPTION value=PC>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>erich_gamma at ch.ibm.com (Erich Gamma) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT>AJDT</OPTION> <OPTION
+ value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION> <OPTION
+ value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT>JDT</OPTION> <OPTION
+ value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION> <OPTION
+ value=Platform selected>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All selected>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION
+ value="Windows XP">Windows XP</OPTION> <OPTION
+ value="Windows All">Windows All</OPTION> <OPTION value="MacOS X">MacOS
+ X</OPTION> <OPTION value=Linux>Linux</OPTION> <OPTION
+ value=Linux-GTK>Linux-GTK</OPTION> <OPTION
+ value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=Platform">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Ant>Ant</OPTION> <OPTION
+ value=Compare>Compare</OPTION> <OPTION value=CVS>CVS</OPTION> <OPTION
+ value=Debug>Debug</OPTION> <OPTION value=Doc>Doc</OPTION> <OPTION
+ value=Help>Help</OPTION> <OPTION value=Intro>Intro</OPTION> <OPTION
+ value=Releng>Releng</OPTION> <OPTION value=Resources>Resources</OPTION>
+ <OPTION value=Runtime>Runtime</OPTION> <OPTION
+ value=Scripting>Scripting</OPTION> <OPTION value=Search>Search</OPTION>
+ <OPTION value=SWT selected>SWT</OPTION> <OPTION value=Team>Team</OPTION>
+ <OPTION value=Text>Text</OPTION> <OPTION value=UI>UI</OPTION> <OPTION
+ value=Update>Update</OPTION> <OPTION value=WebDAV>WebDAV</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=2.0 selected>2.0</OPTION> <OPTION value=2.0.1>2.0.1</OPTION>
+ <OPTION value=2.0.2>2.0.2</OPTION> <OPTION value=2.1>2.1</OPTION>
+ <OPTION value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION>
+ <OPTION value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION>
+ <OPTION value=3.0.1>3.0.1</OPTION> <OPTION value=3.1>3.1</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><INPUT type=hidden name=cc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>RESOLVED</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5 selected>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD>WONTFIX</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>veronika_irvine at ca.ibm.com (Veronika Irvine)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value="2.0 M1">2.0
+ M1</OPTION> <OPTION value="2.0 M2">2.0 M2</OPTION> <OPTION
+ value="2.0 M3">2.0 M3</OPTION> <OPTION value="2.0 M4">2.0 M4</OPTION>
+ <OPTION value="2.0 M5">2.0 M5</OPTION> <OPTION value="2.0 M6">2.0
+ M6</OPTION> <OPTION value="2.0 F1">2.0 F1</OPTION> <OPTION
+ value="2.0 F2">2.0 F2</OPTION> <OPTION value="2.0 F3">2.0 F3</OPTION>
+ <OPTION value="2.0 F4">2.0 F4</OPTION> <OPTION
+ value=2.0.1>2.0.1</OPTION> <OPTION value=2.0.2>2.0.2</OPTION> <OPTION
+ value=2.1>2.1</OPTION> <OPTION value="2.1 M1">2.1 M1</OPTION> <OPTION
+ value="2.1 M2">2.1 M2</OPTION> <OPTION value="2.1 M3">2.1 M3</OPTION>
+ <OPTION value="2.1 M4">2.1 M4</OPTION> <OPTION value="2.1 M5">2.1
+ M5</OPTION> <OPTION value="2.1 RC1">2.1 RC1</OPTION> <OPTION
+ value="2.1 RC2">2.1 RC2</OPTION> <OPTION value="2.1 RC3">2.1
+ RC3</OPTION> <OPTION value="2.1 RC4">2.1 RC4</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION> <OPTION
+ value="3.0 M1">3.0 M1</OPTION> <OPTION value="3.0 M2">3.0 M2</OPTION>
+ <OPTION value="3.0 M3">3.0 M3</OPTION> <OPTION value="3.0 M4">3.0
+ M4</OPTION> <OPTION value="3.0 M5">3.0 M5</OPTION> <OPTION
+ value="3.0 M6">3.0 M6</OPTION> <OPTION value="3.0 M7">3.0 M7</OPTION>
+ <OPTION value="3.0 M8">3.0 M8</OPTION> <OPTION value="3.0 M9">3.0
+ M9</OPTION> <OPTION value="3.0 RC1">3.0 RC1</OPTION> <OPTION
+ value="3.0 RC2">3.0 RC2</OPTION> <OPTION value="3.0 RC3">3.0
+ RC3</OPTION> <OPTION value="3.0 RC4">3.0 RC4</OPTION> <OPTION
+ value=3.0.1>3.0.1</OPTION> <OPTION value=3.0.2>3.0.2</OPTION> <OPTION
+ value=3.1>3.1</OPTION> <OPTION value="3.1 M1">3.1 M1</OPTION> <OPTION
+ value="3.1 M2">3.1 M2</OPTION> <OPTION value="3.1 M3">3.1 M3</OPTION>
+ <OPTION value="3.1 M4">3.1 M4</OPTION> <OPTION value="3.1 M5">3.1
+ M5</OPTION> <OPTION value="3.1 M6">3.1 M6</OPTION> <OPTION value=---
+ selected>---</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="DCR: TableTree should support icon in 1st column (1G06WFT)"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4548&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4548&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 4548 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=4548">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 4548 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH><A href="https://bugs.eclipse.org/bugs/votehelp.html">Votes</A>: </TH>
+ <TD>0 <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&bug_id=4548">Show
+ votes for this bug</A> <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&bug_id=4548">Vote
+ for this bug</A> </TD></TR></TBODY></TABLE><BR><B>Additional Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>RESOLVED WONTFIX</B> <BR><INPUT type=radio value=reopen name=knob>
+Reopen bug <BR><INPUT type=radio value=verify name=knob> Mark bug as
+<B>VERIFIED</B><BR><INPUT type=radio value=close name=knob> Mark bug as
+<B>CLOSED</B><BR><INPUT type=submit value=Commit> <INPUT type=hidden
+value=process_bug name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=4548">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=4548">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2001-10-11 14:18 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>EG (8/24/00 3:41:25 PM)
+ TableTree doesn't support showing an icon in the first column. The icon is eaten up
+ by the +/- icon.
+ Not being able to have an icon in the first column reduces the applicability
+ of TableTree (we would like to use it in the Java plugin, but we can't).
+
+NOTES:
+
+VI (8/24/00 10:54:39 AM)
+ TableTree is implemented using the Windows table widget and this only allows
+ one image per column. Sorry, there's nothing we can do.
+
+AW (24.08.00 17:31:06)
+ Why not combining the +/- icon with the client's icon into a single icon?
+
+EG (8/29/00 3:35:01 PM)
+ JFace has support for compositing icons see:
+ com.ibm.jface.examples.compositeimage.CompositeImageExample
+
+CM (3/17/01 5:29:49 PM)
+ P1/M1 (April 1st, 2001)
+ Need to know the priority of 1GAJ9KP: SWT:ALL - TableTree class has no selection support for the SWT.CHECK style
+ because these two PRs may conflict.
+
+CM (3/28/01 5:09:33 PM)
+ We investigated using the Windows "state image" feature in Table, but this is already being used by
+ checkboxes if the Table is created with check style. It would also mean that we would have to provide
+ platform-specific public API on Table to allow TableTree class to set/get state images. So we decided
+ against this.
+
+ VI is going to investigate merging the [+]/[-] images with the user's image. We would try to write it
+ in such a way that only those who actually put an image in the first column would have to pay for
+ the added slowness. We suspect there may be issues such as background color/transparency
+ problems, hit test problems, selection highlight problems, and cheese problems, but we will have
+ to try it first before we know for sure.
+
+VI (4/4/2001 10:41:59 AM)
+ Two major issues which prevent us from merging the [+]/[-] with the user's image and using the normal first column image:
+ 1) Images of different sizes can be added to the control, however the size of the image displayed in the associated
+ Windows Common Control will be constrained to the size of the first image added to the ImageList.
+ Images for all columns are added to the same ImageList and therefore must have the exact same height and WIDTH.
+ This makes merging the +/- and the first column image have impact on every image in the TableTree
+ 2) There is a limit to how may images I can cram in the ImageList. Having potentially 3 per row I think will quickly exceed the limit.
+
+VI (4/4/2001 05:20 PM)
+
+ We have a PR that requests support for an image in the first column of a TableTree and I believe that you
+ are the prime requestor.
+
+ I have tried to make this work and below is the best I can do. As you can see, there is a limitation on the
+ underlying native widget which is that all images in the TableTree must have the exact same height and width.
+ Consequently, when I leave enough room to merge the +/- image with the image you wish to show in the first column,
+ this causes all the other images in the TableTree to be stretched width wise.
+
+ <picture>
+
+ It is my opinion that the current TableTree can not be made to work any better than this. If this is not
+ adequate for your use, the only alternative is to write a custom widget that does this and does not
+ use the native widget. Writing a full custom widget is not trivial. It will probably require a month or
+ two and will probably not give all the capability that is present in native List or Tree widgets (just
+ because there are a lot of subtle things going on there and I won't have time to get them all). I need
+ to know if I should commence with a custom widget. Also, as I have other responsibilities, Mike and I will
+ have to discuss which of them will be set aside before I can do this work.
+
+VI (4/27/2001 8:42:19 AM)
+ Have received no feedback requesting a custom Tree or implementation of the solution presented above.
+ Moving to Inactive.</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548#c1" name=c1>#1</A> From
+<A href="mailto:veronika_irvine at ca.ibm.com">Veronika Irvine</A> 2002-05-27 16:17
+------- </I><PRE>java.lang.NullPointerException Closing this bug report. A new DCR should be raised from a better custom table
+tree.</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/2.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/2.html
new file mode 100644
index 0000000..6bae805
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/2.html
@@ -0,0 +1,406 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0051)https://bugs.eclipse.org/bugs/show_bug.cgi?id=76146 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 76146 - NPE using quickfix in Aspect opened with java editor</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="76146_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="76146_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="76146_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 76146</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>NPE using quickfix in Aspect opened with java
+ editor</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20041013045125 name=delta_ts> <INPUT type=hidden value=1
+name=longdesclength> <INPUT type=hidden value=76146 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76146">76146</A> </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>hawkinsh at uk.ibm.com (Helen Hawkins) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT selected>AJDT</OPTION>
+ <OPTION value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION>
+ <OPTION value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT>JDT</OPTION> <OPTION
+ value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION> <OPTION
+ value=Platform>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=AJDT">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Core>Core</OPTION> <OPTION
+ value=Doc>Doc</OPTION> <OPTION value=UI selected>UI</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.1.11>1.1.11</OPTION> <OPTION
+ value=1.1.12 selected>1.1.12</OPTION> <OPTION value=1.1.3>1.1.3</OPTION>
+ <OPTION value=1.1.4>1.1.4</OPTION> <OPTION value=1.1.7>1.1.7</OPTION>
+ <OPTION value=1.2.0>1.2.0</OPTION> <OPTION value="1.2.0 M1">1.2.0
+ M1</OPTION> <OPTION value=unspecified>unspecified</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><INPUT type=hidden name=cc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>NEW</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3 selected>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>mchapman at uk.ibm.com (Matt Chapman)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value=---
+ selected>---</OPTION> <OPTION value=1.1.12>1.1.12</OPTION> <OPTION
+ value=1.1.13>1.1.13</OPTION> <OPTION value=1.1.3>1.1.3</OPTION> <OPTION
+ value=1.1.4>1.1.4</OPTION> <OPTION value=1.2.0>1.2.0</OPTION> <OPTION
+ value="1.2.0 M1">1.2.0 M1</OPTION> <OPTION value="1.2.0 M2">1.2.0
+ M2</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="NPE using quickfix in Aspect opened with java editor"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76146&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76146&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 76146 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=76146">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 76146 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE><BR><B>Additional
+Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>NEW </B> <BR><INPUT type=radio value=accept name=knob> Accept bug
+(change status to <B>ASSIGNED</B>) <BR><INPUT type=radio value=resolve
+name=knob> Resolve bug, changing <A
+href="https://bugs.eclipse.org/bugs/bug_status.html">resolution</A> to <SELECT
+onchange=document.changeform.knob[2].checked=true name=resolution> <OPTION
+ value=FIXED selected>FIXED</OPTION> <OPTION value=INVALID>INVALID</OPTION>
+ <OPTION value=WONTFIX>WONTFIX</OPTION> <OPTION value=LATER>LATER</OPTION>
+ <OPTION value=REMIND>REMIND</OPTION> <OPTION
+ value=WORKSFORME>WORKSFORME</OPTION></SELECT> <BR><INPUT type=radio
+value=duplicate name=knob> Resolve bug, mark it as duplicate of bug # <INPUT
+onchange="if (this.value != '') {document.changeform.knob[3].checked=true}"
+size=6 name=dup_id> <BR><INPUT type=radio value=reassign name=knob> <A
+href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Reassign</A>
+bug to <INPUT
+onchange="if ((this.value != 'mchapman at uk.ibm.com') && (this.value != '')) { document.changeform.knob[4].checked=true; }"
+size=32 value=mchapman at uk.ibm.com name=assigned_to> <BR><INPUT type=radio
+value=reassignbycomponent name=knob> Reassign bug to owner of selected component
+<BR><INPUT type=submit value=Commit> <INPUT type=hidden value=process_bug
+name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=76146">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=76146">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76146#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2004-10-13 04:51 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>To recreate:
+
+- Check out the QuickFix project from ajdt.test project
+java.lang.NullPointerException- Open TestAspect.java in the Java Editor (right click > open with > Java
+Editor)
+- Click on the lightbulb with the error marker (the same line as File f = new
+File("tmp");
+java.lang.NullPointerException- An Internal Error appear in the Error log with the following stack trace:
+
+
+
+java.lang.NullPointerException
+at
+org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsSubProcessor.getT
+ypeProposals(UnresolvedElementsSubProcessor.java:395)
+at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.process
+(QuickFixProcessor.java:270)
+at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.getCorrections
+(QuickFixProcessor.java:202)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.collectCorr
+ections(JavaCorrectionProcessor.java:240)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.processAnno
+tations(JavaCorrectionProcessor.java:208)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.computeComp
+letionProposals(JavaCorrectionProcessor.java:177)
+at
+org.eclipse.jface.text.contentassist.ContentAssistant.computeCompletionProposal
+s(ContentAssistant.java:1472)
+at
+org.eclipse.jface.text.contentassist.CompletionProposalPopup.computeProposals
+(CompletionProposalPopup.java:242)
+at org.eclipse.jface.text.contentassist.CompletionProposalPopup.access$7
+(CompletionProposalPopup.java:238)
+at org.eclipse.jface.text.contentassist.CompletionProposalPopup$1.run
+(CompletionProposalPopup.java:197)
+at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
+at org.eclipse.jface.text.contentassist.CompletionProposalPopup.showProposals
+(CompletionProposalPopup.java:192)
+at
+org.eclipse.jface.text.contentassist.ContentAssistant.showPossibleCompletions
+(ContentAssistant.java:1320)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionAssistant.showPossibl
+eCompletions(JavaCorrectionAssistant.java:159)
+at
+org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewe
+r.doOperation(CompilationUnitEditor.java:184)
+at org.eclipse.jdt.internal.ui.javaeditor.JavaSelectAnnotationRulerAction.run
+(JavaSelectAnnotationRulerAction.java:78)
+at org.eclipse.ui.texteditor.AbstractRulerActionDelegate.run
+(AbstractRulerActionDelegate.java:99)
+at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:276)
+at org.eclipse.ui.internal.PluginAction.run(PluginAction.java:238)
+at org.eclipse.ui.texteditor.AbstractTextEditor$11.triggerAction
+(AbstractTextEditor.java:2110)
+at org.eclipse.ui.texteditor.AbstractTextEditor$11.mouseUp
+(AbstractTextEditor.java:2117)
+at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:136)
+at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
+at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796)
+at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2772)
+at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2431)
+at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1377)
+at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1348)
+at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:254)
+at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:141)
+at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:96)
+at org.eclipse.core.internal.runtime.PlatformActivator$1.run
+(PlatformActivator.java:335)
+at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:273)
+at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:129)
+at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at sun.reflect.NativeMethodAccessorImpl.invoke
+(NativeMethodAccessorImpl.java:39)
+at sun.reflect.DelegatingMethodAccessorImpl.invoke
+(DelegatingMethodAccessorImpl.java:25)
+at java.lang.reflect.Method.invoke(Method.java:324)
+at org.eclipse.core.launcher.Main.basicRun(Main.java:183)
+at org.eclipse.core.launcher.Main.run(Main.java:644)
+at org.eclipse.core.launcher.Main.main(Main.java:628)
+
+
+Looking at the jdt code in UnresolvedElementsSubProcessor.java, at line 395,
+the parent field is null:
+
+ ASTNode parent= selectedNode.getParent();
+ while (parent.getLength() == selectedNode.getLength()) { // line 395
+ parent= parent.getParent();
+ }
+
+java.lang.NullPointerException There just needs to be a null check as there is above:
+
+
+ ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot());
+ if (selectedNode == null) {
+ return;
+ }
+ int kind= SimilarElementsRequestor.ALL_TYPES;
+
+ ASTNode parent= selectedNode.getParent();
+ while (parent.getLength() == selectedNode.getLength()) {
+ parent= parent.getParent();
+ }
+
+should become:
+
+
+ ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot());
+ if (selectedNode == null) {
+ return;
+ }
+ int kind= SimilarElementsRequestor.ALL_TYPES;
+
+ ASTNode parent= selectedNode.getParent();
+ if (parent == null) {
+ return;
+ }
+ while (parent.getLength() == selectedNode.getLength()) {
+ parent= parent.getParent();
+ }
+
+
+This needs to be raised as a jdt bug, since we don't pass through any ajdt
+code in order to get here.
+
+Raising this bug against ajdt is just for tracking.
+
+(note this happens on 1.1.12, but also on the latest AJDT dev build).</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/40152.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/40152.html
new file mode 100644
index 0000000..fb15d0f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/40152.html
@@ -0,0 +1,1228 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0051)https://bugs.eclipse.org/bugs/show_bug.cgi?id=40152 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 40152 - Junit tests fail on GTK</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=4862" rel=First><LINK href="show_bug.cgi?id=40059"
+rel=Prev><LINK href="show_bug.cgi?id=40723" rel=Next><LINK
+href="show_bug.cgi?id=79413" rel=Last><LINK href="buglist.cgi?regetlastlist=1"
+rel=Up><LINK href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="40152_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="40152_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="40152_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 40152</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>Junit tests fail on GTK</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug List:</B> (18 of
+183) <A href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=79413">Last</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40059">Prev</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40723">Next</A>
+ <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20040525174037 name=delta_ts> <INPUT type=hidden value=2
+name=longdesclength> <INPUT type=hidden value=40152 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40152">40152</A> </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>christophe_cornu at ca.ibm.com (Christophe Cornu) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT>AJDT</OPTION> <OPTION
+ value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION> <OPTION
+ value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT>JDT</OPTION> <OPTION
+ value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION> <OPTION
+ value=Platform selected>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION
+ value="Windows XP">Windows XP</OPTION> <OPTION
+ value="Windows All">Windows All</OPTION> <OPTION value="MacOS X">MacOS
+ X</OPTION> <OPTION value=Linux>Linux</OPTION> <OPTION value=Linux-GTK
+ selected>Linux-GTK</OPTION> <OPTION
+ value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=Platform">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Ant>Ant</OPTION> <OPTION
+ value=Compare>Compare</OPTION> <OPTION value=CVS>CVS</OPTION> <OPTION
+ value=Debug>Debug</OPTION> <OPTION value=Doc>Doc</OPTION> <OPTION
+ value=Help>Help</OPTION> <OPTION value=Intro>Intro</OPTION> <OPTION
+ value=Releng>Releng</OPTION> <OPTION value=Resources>Resources</OPTION>
+ <OPTION value=Runtime>Runtime</OPTION> <OPTION
+ value=Scripting>Scripting</OPTION> <OPTION value=Search>Search</OPTION>
+ <OPTION value=SWT selected>SWT</OPTION> <OPTION value=Team>Team</OPTION>
+ <OPTION value=Text>Text</OPTION> <OPTION value=UI>UI</OPTION> <OPTION
+ value=Update>Update</OPTION> <OPTION value=WebDAV>WebDAV</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=2.0>2.0</OPTION> <OPTION value=2.0.1>2.0.1</OPTION> <OPTION
+ value=2.0.2>2.0.2</OPTION> <OPTION value=2.1>2.1</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0 selected>3.0</OPTION>
+ <OPTION value=3.0.1>3.0.1</OPTION> <OPTION value=3.1>3.1</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><INPUT type=hidden name=cc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>NEW</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3 selected>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION value=major
+ selected>major</OPTION> <OPTION value=normal>normal</OPTION> <OPTION
+ value=minor>minor</OPTION> <OPTION value=trivial>trivial</OPTION>
+ <OPTION value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>felipe_heidrich at ca.ibm.com (Felipe Heidrich)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value="2.0 M1">2.0
+ M1</OPTION> <OPTION value="2.0 M2">2.0 M2</OPTION> <OPTION
+ value="2.0 M3">2.0 M3</OPTION> <OPTION value="2.0 M4">2.0 M4</OPTION>
+ <OPTION value="2.0 M5">2.0 M5</OPTION> <OPTION value="2.0 M6">2.0
+ M6</OPTION> <OPTION value="2.0 F1">2.0 F1</OPTION> <OPTION
+ value="2.0 F2">2.0 F2</OPTION> <OPTION value="2.0 F3">2.0 F3</OPTION>
+ <OPTION value="2.0 F4">2.0 F4</OPTION> <OPTION
+ value=2.0.1>2.0.1</OPTION> <OPTION value=2.0.2>2.0.2</OPTION> <OPTION
+ value=2.1>2.1</OPTION> <OPTION value="2.1 M1">2.1 M1</OPTION> <OPTION
+ value="2.1 M2">2.1 M2</OPTION> <OPTION value="2.1 M3">2.1 M3</OPTION>
+ <OPTION value="2.1 M4">2.1 M4</OPTION> <OPTION value="2.1 M5">2.1
+ M5</OPTION> <OPTION value="2.1 RC1">2.1 RC1</OPTION> <OPTION
+ value="2.1 RC2">2.1 RC2</OPTION> <OPTION value="2.1 RC3">2.1
+ RC3</OPTION> <OPTION value="2.1 RC4">2.1 RC4</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION> <OPTION
+ value="3.0 M1">3.0 M1</OPTION> <OPTION value="3.0 M2">3.0 M2</OPTION>
+ <OPTION value="3.0 M3">3.0 M3</OPTION> <OPTION value="3.0 M4">3.0
+ M4</OPTION> <OPTION value="3.0 M5">3.0 M5</OPTION> <OPTION
+ value="3.0 M6">3.0 M6</OPTION> <OPTION value="3.0 M7">3.0 M7</OPTION>
+ <OPTION value="3.0 M8">3.0 M8</OPTION> <OPTION value="3.0 M9">3.0
+ M9</OPTION> <OPTION value="3.0 RC1">3.0 RC1</OPTION> <OPTION
+ value="3.0 RC2">3.0 RC2</OPTION> <OPTION value="3.0 RC3">3.0
+ RC3</OPTION> <OPTION value="3.0 RC4">3.0 RC4</OPTION> <OPTION
+ value=3.0.1>3.0.1</OPTION> <OPTION value=3.0.2>3.0.2</OPTION> <OPTION
+ value=3.1>3.1</OPTION> <OPTION value="3.1 M1">3.1 M1</OPTION> <OPTION
+ value="3.1 M2">3.1 M2</OPTION> <OPTION value="3.1 M3">3.1 M3</OPTION>
+ <OPTION value="3.1 M4">3.1 M4</OPTION> <OPTION value="3.1 M5">3.1
+ M5</OPTION> <OPTION value="3.1 M6">3.1 M6</OPTION> <OPTION value=---
+ selected>---</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60 value="Junit tests fail on GTK"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=40152&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=40152&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 40152 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=40152">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 40152 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH><A href="https://bugs.eclipse.org/bugs/votehelp.html">Votes</A>: </TH>
+ <TD>0 <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&bug_id=40152">Show
+ votes for this bug</A> <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&bug_id=40152">Vote
+ for this bug</A> </TD></TR></TBODY></TABLE><BR><B>Additional Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>NEW </B> <BR><INPUT type=radio value=accept name=knob> Accept bug
+(change status to <B>ASSIGNED</B>) <BR><INPUT type=radio value=resolve
+name=knob> Resolve bug, changing <A
+href="https://bugs.eclipse.org/bugs/bug_status.html">resolution</A> to <SELECT
+onchange=document.changeform.knob[2].checked=true name=resolution> <OPTION
+ value=FIXED selected>FIXED</OPTION> <OPTION value=INVALID>INVALID</OPTION>
+ <OPTION value=WONTFIX>WONTFIX</OPTION> <OPTION value=LATER>LATER</OPTION>
+ <OPTION value=REMIND>REMIND</OPTION> <OPTION
+ value=WORKSFORME>WORKSFORME</OPTION></SELECT> <BR><INPUT type=radio
+value=duplicate name=knob> Resolve bug, mark it as duplicate of bug # <INPUT
+onchange="if (this.value != '') {document.changeform.knob[3].checked=true}"
+size=6 name=dup_id> <BR><INPUT type=radio value=reassign name=knob> <A
+href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Reassign</A>
+bug to <INPUT
+onchange="if ((this.value != 'felipe_heidrich at ca.ibm.com') && (this.value != '')) { document.changeform.knob[4].checked=true; }"
+size=32 value=felipe_heidrich at ca.ibm.com name=assigned_to> <BR><INPUT type=radio
+value=reassignbycomponent name=knob> Reassign bug to owner of selected component
+<BR><INPUT type=submit value=Commit> <INPUT type=hidden value=process_bug
+name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=40152">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=40152">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40152#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2003-07-15 16:25 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>latest from head (20030715) generate about 30 errors/failures.
+
+.........................................
+.........................................
+.........................E................
+..........4
+5
+...............................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+...........F.....F...........F.E.E............
+.................F....F....................
+..........
+(<unknown>:6548): Gdk-CRITICAL **: file gdkdraw.c: line 238
+(gdk_drawable_get_display): assertion `GDK_IS_DRAWABLE (drawable)' failed
+
+(<unknown>:6548): Gdk-CRITICAL **: file gdkdisplay.c: line 498
+(gdk_display_get_window_at_pointer): assertion `GDK_IS_DISPLAY (display)'
+failed
+........
+(<unknown>:6548): Gdk-CRITICAL **: file gdkdraw.c: line 238
+(gdk_drawable_get_display): assertion `GDK_IS_DRAWABLE (drawable)' failed
+
+(<unknown>:6548): Gdk-CRITICAL **: file gdkdisplay.c: line 498
+(gdk_display_get_window_at_pointer): assertion `GDK_IS_DISPLAY (display)'
+failed
+.......................
+.........................................
+..............F...........................
+.........................................
+....................................F.....
+.........................................
+.........................................
+.........................................
+.......................................
+(<unknown>:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width >= -1' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width >= -1' failed
+..
+...................
+(<unknown>:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width >= -1' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtkwidget.c: line 5139
+(gtk_widget_set_size_request): assertion `width >= -1' failed
+......................
+.........................................
+..................................
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view->priv->bin_window !=
+NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view->priv->bin_window !=
+NULL' failed
+.......
+...
+(<unknown>:6548): Gtk-CRITICAL **: file gtkliststore.c: line 533
+(gtk_list_store_get_path): assertion `iter->stamp == GTK_LIST_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtkliststore.c: line 533
+(gtk_list_store_get_path): assertion `iter->stamp == GTK_LIST_STORE
+(tree_model)->stamp' failed
+.........
+(<unknown>:6548): Gtk-CRITICAL **: file gtkliststore.c: line 533
+(gtk_list_store_get_path): assertion `iter->stamp == GTK_LIST_STORE
+(tree_model)->stamp' failed
+..
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view->priv->bin_window !=
+NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view->priv->bin_window !=
+NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view->priv->bin_window !=
+NULL' failed
+F...........................
+.........................................
+........................................F.
+............F........F........F...F..........
+.........................................
+.........................................
+.....................F.F...................
+.........................................
+.........................................
+................................
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 9817
+(gtk_tree_view_get_path_at_pos): assertion `tree_view->priv->bin_window !=
+NULL' failed
+F.
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreestore.c: line 569
+(gtk_tree_store_get_path): assertion `iter->stamp == GTK_TREE_STORE
+(tree_model)->stamp' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 369
+(gtk_tree_path_get_depth): assertion `path != NULL' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreeview.c: line 8800
+(gtk_tree_view_scroll_to_cell): assertion `path != NULL || column != NULL'
+failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtktreemodel.c: line 400
+(gtk_tree_path_free): assertion `path != NULL' failed
+........
+.........................................
+.........................................
+...........................F..............
+.........................................
+.........................................
+.............
+(<unknown>:6548): Gtk-CRITICAL **: file gtkeditable.c: line 172
+(gtk_editable_delete_selection): assertion `GTK_IS_EDITABLE (editable)' failed
+
+(<unknown>:6548): Gtk-CRITICAL **: file gtkeditable.c: line 172
+(gtk_editable_delete_selection): assertion `GTK_IS_EDITABLE (editable)' failed
+F....F.......F.......F.E.......E..
+.........................................
+.........................................
+.............................
+(<unknown>:6548): Gtk-CRITICAL **: file gtkframe.c: line 362
+(gtk_frame_set_label_widget): assertion `label_widget == NULL || label_widget-
+>parent == NULL' failed
+............
+.........................................
+.........................................
+................F.........................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.......................................F.F.
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+...........F.F.............................
+..F....F..E.E................................
+....F.F....................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.........................................
+.......
+Time: 111.199
+There were 7 errors:
+1) test_getFontData
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_graphics_Font)
+java.lang.NullPointerException
+ at org.eclipse.swt.graphics.Font.dispose(Font.java:143)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_graphics_Font.test_getFontData
+(Test_org_eclipse_swt_graphics_Font.java:239)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_graphics_Font.runTest
+(Test_org_eclipse_swt_graphics_Font.java:308)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+2) test_setText$Ljava_lang_String
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem)
+org.eclipse.swt.SWTError: Cannot get text
+ at org.eclipse.swt.SWT.error(SWT.java:2391)
+ at org.eclipse.swt.SWT.error(SWT.java:2295)
+ at org.eclipse.swt.widgets.Widget.error(Widget.java:375)
+ at org.eclipse.swt.widgets.TableItem.getText(TableItem.java:350)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.test_setText
+$Ljava_lang_String(Test_org_eclipse_swt_widgets_TableItem.java:359)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.runTest
+(Test_org_eclipse_swt_widgets_TableItem.java:518)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+3) test_setTextILjava_lang_String
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem)
+org.eclipse.swt.SWTError: Cannot get text
+ at org.eclipse.swt.SWT.error(SWT.java:2391)
+ at org.eclipse.swt.SWT.error(SWT.java:2295)
+ at org.eclipse.swt.widgets.Widget.error(Widget.java:375)
+ at org.eclipse.swt.widgets.TableItem.getText(TableItem.java:350)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.test_setText
+ILjava_lang_String(Test_org_eclipse_swt_widgets_TableItem.java:396)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.runTest
+(Test_org_eclipse_swt_widgets_TableItem.java:519)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+4) test_removeII
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo)
+java.lang.IllegalArgumentException: Index out of bounds
+ at org.eclipse.swt.SWT.error(SWT.java:2351)
+ at org.eclipse.swt.SWT.error(SWT.java:2295)
+ at org.eclipse.swt.widgets.Widget.error(Widget.java:375)
+ at org.eclipse.swt.widgets.Combo.remove(Combo.java:938)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.test_removeII
+(Test_org_eclipse_swt_widgets_Combo.java:397)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.runTest
+(Test_org_eclipse_swt_widgets_Combo.java:688)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+5) test_setItemILjava_lang_String
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo)
+java.lang.ArrayIndexOutOfBoundsException: 0
+ at org.eclipse.swt.widgets.Combo.setItem(Combo.java:1103)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.test_setItemILja
+va_lang_String(Test_org_eclipse_swt_widgets_Combo.java:503)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.runTest
+(Test_org_eclipse_swt_widgets_Combo.java:695)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+6) test_print
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+java.lang.NullPointerException
+ at org.eclipse.swt.custom.StyledText$Printing.<init>
+(StyledText.java:200)
+ at org.eclipse.swt.custom.StyledText.print(StyledText.java:5933)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_print
+(Test_org_eclipse_swt_custom_StyledText.java:1690)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4165)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+7) test_printLorg_eclipse_swt_printing_Printer
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+java.lang.NullPointerException
+ at org.eclipse.swt.custom.StyledText$Printing.<init>
+(StyledText.java:200)
+ at org.eclipse.swt.custom.StyledText.print(StyledText.java:5988)
+ at org.eclipse.swt.custom.StyledText.print(StyledText.java:5963)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_printLo
+rg_eclipse_swt_printing_Printer
+(Test_org_eclipse_swt_custom_StyledText.java:1710)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4166)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+There were 30 failures:
+1) test_getBoundsI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem)
+junit.framework.AssertionFailedError: :a:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.test_getBoun
+dsI(Test_org_eclipse_swt_widgets_TableItem.java:85)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.runTest
+(Test_org_eclipse_swt_widgets_TableItem.java:501)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+2) test_getImageBoundsI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem)
+junit.framework.AssertionFailedError: :e:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.test_getImag
+eBoundsI(Test_org_eclipse_swt_widgets_TableItem.java:177)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.runTest
+(Test_org_eclipse_swt_widgets_TableItem.java:506)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+3) test_setImageIndentI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem)
+junit.framework.AssertionFailedError: expected:<1> but was:<0>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.test_setImag
+eIndentI(Test_org_eclipse_swt_widgets_TableItem.java:338)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableItem.runTest
+(Test_org_eclipse_swt_widgets_TableItem.java:517)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+4) test_getWidth
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableColumn)
+junit.framework.AssertionFailedError: :a: width=0 should be=10
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableColumn.test_getWi
+dth(Test_org_eclipse_swt_widgets_TableColumn.java:122)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableColumn.runTest
+(Test_org_eclipse_swt_widgets_TableColumn.java:264)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+5) test_setAlignmentI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableColumn)
+junit.framework.AssertionFailedError: :c: Should not be allowed to set
+alignment of the first column
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableColumn.test_setAl
+ignmentI(Test_org_eclipse_swt_widgets_TableColumn.java:177)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TableColumn.runTest
+(Test_org_eclipse_swt_widgets_TableColumn.java:268)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+6) test_setDefaultItemLorg_eclipse_swt_widgets_MenuItem
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Menu)
+junit.framework.AssertionFailedError: expected:<null> but was:<MenuItem {}>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Menu.test_setDefaultIt
+emLorg_eclipse_swt_widgets_MenuItem(Test_org_eclipse_swt_widgets_Menu.java:272)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Menu.runTest
+(Test_org_eclipse_swt_widgets_Menu.java:387)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+7) test_getMonitor
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Shell)
+junit.framework.AssertionFailedError
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Control.test_getMonito
+r(Test_org_eclipse_swt_widgets_Control.java:287)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Control.runTest
+(Test_org_eclipse_swt_widgets_Control.java:819)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Scrollable.runTest
+(Test_org_eclipse_swt_widgets_Scrollable.java:72)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Composite.runTest
+(Test_org_eclipse_swt_widgets_Composite.java:159)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Canvas.runTest
+(Test_org_eclipse_swt_widgets_Canvas.java:115)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Decorations.runTest
+(Test_org_eclipse_swt_widgets_Decorations.java:250)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Shell.runTest
+(Test_org_eclipse_swt_widgets_Shell.java:428)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+8) test_setTopIndexI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_List)
+junit.framework.AssertionFailedError: expected:<0> but was:<1>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_List.test_setTopIndexI
+(Test_org_eclipse_swt_widgets_List.java:2019)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_List.runTest
+(Test_org_eclipse_swt_widgets_List.java:2144)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+9) test_getDoubleClickEnabled
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text)
+junit.framework.AssertionFailedError: expected:<false> but was:<true>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_getDoubleCli
+ckEnabled(Test_org_eclipse_swt_widgets_Text.java:316)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.runTest
+(Test_org_eclipse_swt_widgets_Text.java:953)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+10) test_getTopIndex
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text)
+junit.framework.AssertionFailedError: expected:<1> but was:<0>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_getTopIndex
+(Test_org_eclipse_swt_widgets_Text.java:424)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.runTest
+(Test_org_eclipse_swt_widgets_Text.java:966)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+11) test_setDoubleClickEnabledZ
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text)
+junit.framework.AssertionFailedError: expected:<false> but was:<true>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_setDoubleCli
+ckEnabledZ(Test_org_eclipse_swt_widgets_Text.java:599)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.runTest
+(Test_org_eclipse_swt_widgets_Text.java:974)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+12) test_setTabsI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text)
+junit.framework.AssertionFailedError: expected:<8> but was:<0>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_setTabsI
+(Test_org_eclipse_swt_widgets_Text.java:759)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.runTest
+(Test_org_eclipse_swt_widgets_Text.java:982)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+13) test_setTopIndexI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text)
+junit.framework.AssertionFailedError: expected:<1> but was:<0>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_setTopIndexI
+(Test_org_eclipse_swt_widgets_Text.java:820)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.runTest
+(Test_org_eclipse_swt_widgets_Text.java:985)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+14) test_setMaximumI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar)
+junit.framework.AssertionFailedError: expected:<1> but was:<10>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.check
+(Test_org_eclipse_swt_widgets_ScrollBar.java:67)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.report
+(Test_org_eclipse_swt_widgets_ScrollBar.java:61)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.test_setMaxi
+mumI(Test_org_eclipse_swt_widgets_ScrollBar.java:757)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.runTest
+(Test_org_eclipse_swt_widgets_ScrollBar.java:892)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+15) test_setMinimumI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar)
+junit.framework.AssertionFailedError: expected:<10> but was:<9>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.check
+(Test_org_eclipse_swt_widgets_ScrollBar.java:68)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.report
+(Test_org_eclipse_swt_widgets_ScrollBar.java:61)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.test_setMini
+mumI(Test_org_eclipse_swt_widgets_ScrollBar.java:773)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ScrollBar.runTest
+(Test_org_eclipse_swt_widgets_ScrollBar.java:893)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+16) test_setTopItemLorg_eclipse_swt_widgets_TreeItem
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Tree)
+junit.framework.AssertionFailedError: expected:<TreeItem {}> but was:<null>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Tree.test_setTopItemLo
+rg_eclipse_swt_widgets_TreeItem(Test_org_eclipse_swt_widgets_Tree.java:424)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Tree.runTest
+(Test_org_eclipse_swt_widgets_Tree.java:538)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+17) test_setSelectionI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TabFolder)
+junit.framework.AssertionFailedError: expected:<0> but was:<1>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TabFolder.test_setSele
+ctionI(Test_org_eclipse_swt_widgets_TabFolder.java:307)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_TabFolder.runTest
+(Test_org_eclipse_swt_widgets_TabFolder.java:405)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+18) test_clearSelection
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo)
+junit.framework.AssertionFailedError: :d:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.test_clearSelect
+ion(Test_org_eclipse_swt_widgets_Combo.java:130)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.runTest
+(Test_org_eclipse_swt_widgets_Combo.java:669)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+19) test_deselectI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo)
+junit.framework.AssertionFailedError: :b:0
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.test_deselectI
+(Test_org_eclipse_swt_widgets_Combo.java:155)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.runTest
+(Test_org_eclipse_swt_widgets_Combo.java:673)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+20) test_getSelectionIndex
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo)
+junit.framework.AssertionFailedError: expected:<1> but was:<0>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.test_getSelectio
+nIndex(Test_org_eclipse_swt_widgets_Combo.java:219)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.runTest
+(Test_org_eclipse_swt_widgets_Combo.java:680)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+21) test_removeI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo)
+junit.framework.AssertionFailedError: index 0 expected:<0> but was:<-1>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.test_removeI
+(Test_org_eclipse_swt_widgets_Combo.java:356)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo.runTest
+(Test_org_eclipse_swt_widgets_Combo.java:687)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+22) test_getRowCount
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ToolBar)
+junit.framework.AssertionFailedError: :a:1
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ToolBar.test_getRowCou
+nt(Test_org_eclipse_swt_widgets_ToolBar.java:132)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_ToolBar.runTest
+(Test_org_eclipse_swt_widgets_ToolBar.java:206)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+23) test_setMaximumI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider)
+junit.framework.AssertionFailedError: setMaximum(11): Thumb Expected: 1
+Actual: 10
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.check
+(Test_org_eclipse_swt_widgets_Slider.java:67)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.report
+(Test_org_eclipse_swt_widgets_Slider.java:60)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.test_setMaximum
+I(Test_org_eclipse_swt_widgets_Slider.java:743)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.runTest
+(Test_org_eclipse_swt_widgets_Slider.java:836)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+24) test_setMinimumI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider)
+junit.framework.AssertionFailedError: setMinimum(91): Thumb Expected: 9
+Actual: 10
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.check
+(Test_org_eclipse_swt_widgets_Slider.java:67)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.report
+(Test_org_eclipse_swt_widgets_Slider.java:60)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.test_setMinimum
+I(Test_org_eclipse_swt_widgets_Slider.java:755)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Slider.runTest
+(Test_org_eclipse_swt_widgets_Slider.java:837)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+25) test_copy
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+junit.framework.AssertionFailedError: :a:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_copy
+(Test_org_eclipse_swt_custom_StyledText.java:559)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4127)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+26) test_cut
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+junit.framework.AssertionFailedError: :a:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_cut
+(Test_org_eclipse_swt_custom_StyledText.java:619)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4128)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+27) test_getTopIndex
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+junit.framework.AssertionFailedError: :d:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_getTopI
+ndex(Test_org_eclipse_swt_custom_StyledText.java:1388)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4159)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+28) test_invokeActionI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+junit.framework.ComparisonFailure: expected:<...
+...> but was:<......>
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_invokeA
+ctionI(Test_org_eclipse_swt_custom_StyledText.java:1593)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4163)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+29) test_setTopIndexI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+junit.framework.AssertionFailedError: :e:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_setTopI
+ndexI(Test_org_eclipse_swt_custom_StyledText.java:3943)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4202)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+30) test_setTopPixelI
+(org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText)
+junit.framework.AssertionFailedError: :f:
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.test_setTopP
+ixelI(Test_org_eclipse_swt_custom_StyledText.java:3972)
+ at
+org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_StyledText.runTest
+(Test_org_eclipse_swt_custom_StyledText.java:4203)
+ at org.eclipse.swt.tests.junit.AllTests.main(AllTests.java:25)
+
+FAILURES!!!
+Tests run: 4148, Failures: 30, Errors: 7
+
+
+Calls to warnUnimpl: 958</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40152#c1" name=c1>#1</A>
+From <A href="mailto:felipe_heidrich at ca.ibm.com">Felipe Heidrich</A> 2003-07-28
+17:17 ------- </I><PRE>I was able to get rid of the GTK warnings, we still have 2 errors and 28
+Failures.
+</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> (18 of 183) <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=79413">Last</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40059">Prev</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=40723">Next</A>
+ <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4548.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4548.html
new file mode 100644
index 0000000..b7047a4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4548.html
@@ -0,0 +1,377 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0050)https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 4548 - DCR: TableTree should support icon in 1st column (1G06WFT)</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="4548_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="4548_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="4548_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 4548</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>DCR: TableTree should support icon in 1st
+ column (1G06WFT)</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug
+List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20020527161709 name=delta_ts> <INPUT type=hidden value=2
+name=longdesclength> <INPUT type=hidden value=4548 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548">4548</A>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All selected>All</OPTION>
+ <OPTION value=Macintosh>Macintosh</OPTION> <OPTION value=PC>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>erich_gamma at ch.ibm.com (Erich Gamma) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT>AJDT</OPTION> <OPTION
+ value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION> <OPTION
+ value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT>JDT</OPTION> <OPTION
+ value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION> <OPTION
+ value=Platform selected>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All selected>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION
+ value="Windows XP">Windows XP</OPTION> <OPTION
+ value="Windows All">Windows All</OPTION> <OPTION value="MacOS X">MacOS
+ X</OPTION> <OPTION value=Linux>Linux</OPTION> <OPTION
+ value=Linux-GTK>Linux-GTK</OPTION> <OPTION
+ value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=Platform">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Ant>Ant</OPTION> <OPTION
+ value=Compare>Compare</OPTION> <OPTION value=CVS>CVS</OPTION> <OPTION
+ value=Debug>Debug</OPTION> <OPTION value=Doc>Doc</OPTION> <OPTION
+ value=Help>Help</OPTION> <OPTION value=Intro>Intro</OPTION> <OPTION
+ value=Releng>Releng</OPTION> <OPTION value=Resources>Resources</OPTION>
+ <OPTION value=Runtime>Runtime</OPTION> <OPTION
+ value=Scripting>Scripting</OPTION> <OPTION value=Search>Search</OPTION>
+ <OPTION value=SWT selected>SWT</OPTION> <OPTION value=Team>Team</OPTION>
+ <OPTION value=Text>Text</OPTION> <OPTION value=UI>UI</OPTION> <OPTION
+ value=Update>Update</OPTION> <OPTION value=WebDAV>WebDAV</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=2.0 selected>2.0</OPTION> <OPTION value=2.0.1>2.0.1</OPTION>
+ <OPTION value=2.0.2>2.0.2</OPTION> <OPTION value=2.1>2.1</OPTION>
+ <OPTION value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION>
+ <OPTION value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION>
+ <OPTION value=3.0.1>3.0.1</OPTION> <OPTION value=3.1>3.1</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><INPUT type=hidden name=cc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>RESOLVED</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5 selected>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD>WONTFIX</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>veronika_irvine at ca.ibm.com (Veronika Irvine)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value="2.0 M1">2.0
+ M1</OPTION> <OPTION value="2.0 M2">2.0 M2</OPTION> <OPTION
+ value="2.0 M3">2.0 M3</OPTION> <OPTION value="2.0 M4">2.0 M4</OPTION>
+ <OPTION value="2.0 M5">2.0 M5</OPTION> <OPTION value="2.0 M6">2.0
+ M6</OPTION> <OPTION value="2.0 F1">2.0 F1</OPTION> <OPTION
+ value="2.0 F2">2.0 F2</OPTION> <OPTION value="2.0 F3">2.0 F3</OPTION>
+ <OPTION value="2.0 F4">2.0 F4</OPTION> <OPTION
+ value=2.0.1>2.0.1</OPTION> <OPTION value=2.0.2>2.0.2</OPTION> <OPTION
+ value=2.1>2.1</OPTION> <OPTION value="2.1 M1">2.1 M1</OPTION> <OPTION
+ value="2.1 M2">2.1 M2</OPTION> <OPTION value="2.1 M3">2.1 M3</OPTION>
+ <OPTION value="2.1 M4">2.1 M4</OPTION> <OPTION value="2.1 M5">2.1
+ M5</OPTION> <OPTION value="2.1 RC1">2.1 RC1</OPTION> <OPTION
+ value="2.1 RC2">2.1 RC2</OPTION> <OPTION value="2.1 RC3">2.1
+ RC3</OPTION> <OPTION value="2.1 RC4">2.1 RC4</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION> <OPTION
+ value="3.0 M1">3.0 M1</OPTION> <OPTION value="3.0 M2">3.0 M2</OPTION>
+ <OPTION value="3.0 M3">3.0 M3</OPTION> <OPTION value="3.0 M4">3.0
+ M4</OPTION> <OPTION value="3.0 M5">3.0 M5</OPTION> <OPTION
+ value="3.0 M6">3.0 M6</OPTION> <OPTION value="3.0 M7">3.0 M7</OPTION>
+ <OPTION value="3.0 M8">3.0 M8</OPTION> <OPTION value="3.0 M9">3.0
+ M9</OPTION> <OPTION value="3.0 RC1">3.0 RC1</OPTION> <OPTION
+ value="3.0 RC2">3.0 RC2</OPTION> <OPTION value="3.0 RC3">3.0
+ RC3</OPTION> <OPTION value="3.0 RC4">3.0 RC4</OPTION> <OPTION
+ value=3.0.1>3.0.1</OPTION> <OPTION value=3.0.2>3.0.2</OPTION> <OPTION
+ value=3.1>3.1</OPTION> <OPTION value="3.1 M1">3.1 M1</OPTION> <OPTION
+ value="3.1 M2">3.1 M2</OPTION> <OPTION value="3.1 M3">3.1 M3</OPTION>
+ <OPTION value="3.1 M4">3.1 M4</OPTION> <OPTION value="3.1 M5">3.1
+ M5</OPTION> <OPTION value="3.1 M6">3.1 M6</OPTION> <OPTION value=---
+ selected>---</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="DCR: TableTree should support icon in 1st column (1G06WFT)"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4548&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4548&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 4548 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=4548">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 4548 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH><A href="https://bugs.eclipse.org/bugs/votehelp.html">Votes</A>: </TH>
+ <TD>0 <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&bug_id=4548">Show
+ votes for this bug</A> <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&bug_id=4548">Vote
+ for this bug</A> </TD></TR></TBODY></TABLE><BR><B>Additional Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>RESOLVED WONTFIX</B> <BR><INPUT type=radio value=reopen name=knob>
+Reopen bug <BR><INPUT type=radio value=verify name=knob> Mark bug as
+<B>VERIFIED</B><BR><INPUT type=radio value=close name=knob> Mark bug as
+<B>CLOSED</B><BR><INPUT type=submit value=Commit> <INPUT type=hidden
+value=process_bug name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=4548">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=4548">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2001-10-11 14:18 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>EG (8/24/00 3:41:25 PM)
+ TableTree doesn't support showing an icon in the first column. The icon is eaten up
+ by the +/- icon.
+ Not being able to have an icon in the first column reduces the applicability
+ of TableTree (we would like to use it in the Java plugin, but we can't).
+
+NOTES:
+
+VI (8/24/00 10:54:39 AM)
+ TableTree is implemented using the Windows table widget and this only allows
+ one image per column. Sorry, there's nothing we can do.
+
+AW (24.08.00 17:31:06)
+ Why not combining the +/- icon with the client's icon into a single icon?
+
+EG (8/29/00 3:35:01 PM)
+ JFace has support for compositing icons see:
+ com.ibm.jface.examples.compositeimage.CompositeImageExample
+
+CM (3/17/01 5:29:49 PM)
+ P1/M1 (April 1st, 2001)
+ Need to know the priority of 1GAJ9KP: SWT:ALL - TableTree class has no selection support for the SWT.CHECK style
+ because these two PRs may conflict.
+
+CM (3/28/01 5:09:33 PM)
+ We investigated using the Windows "state image" feature in Table, but this is already being used by
+ checkboxes if the Table is created with check style. It would also mean that we would have to provide
+ platform-specific public API on Table to allow TableTree class to set/get state images. So we decided
+ against this.
+
+ VI is going to investigate merging the [+]/[-] images with the user's image. We would try to write it
+ in such a way that only those who actually put an image in the first column would have to pay for
+ the added slowness. We suspect there may be issues such as background color/transparency
+ problems, hit test problems, selection highlight problems, and cheese problems, but we will have
+ to try it first before we know for sure.
+
+VI (4/4/2001 10:41:59 AM)
+ Two major issues which prevent us from merging the [+]/[-] with the user's image and using the normal first column image:
+ 1) Images of different sizes can be added to the control, however the size of the image displayed in the associated
+ Windows Common Control will be constrained to the size of the first image added to the ImageList.
+ Images for all columns are added to the same ImageList and therefore must have the exact same height and WIDTH.
+ This makes merging the +/- and the first column image have impact on every image in the TableTree
+ 2) There is a limit to how may images I can cram in the ImageList. Having potentially 3 per row I think will quickly exceed the limit.
+
+VI (4/4/2001 05:20 PM)
+
+ We have a PR that requests support for an image in the first column of a TableTree and I believe that you
+ are the prime requestor.
+
+ I have tried to make this work and below is the best I can do. As you can see, there is a limitation on the
+ underlying native widget which is that all images in the TableTree must have the exact same height and width.
+ Consequently, when I leave enough room to merge the +/- image with the image you wish to show in the first column,
+ this causes all the other images in the TableTree to be stretched width wise.
+
+ <picture>
+
+ It is my opinion that the current TableTree can not be made to work any better than this. If this is not
+ adequate for your use, the only alternative is to write a custom widget that does this and does not
+ use the native widget. Writing a full custom widget is not trivial. It will probably require a month or
+ two and will probably not give all the capability that is present in native List or Tree widgets (just
+ because there are a lot of subtle things going on there and I won't have time to get them all). I need
+ to know if I should commence with a custom widget. Also, as I have other responsibilities, Mike and I will
+ have to discuss which of them will be set aside before I can do this work.
+
+VI (4/27/2001 8:42:19 AM)
+ Have received no feedback requesting a custom Tree or implementation of the solution presented above.
+ Moving to Inactive.</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4548#c1" name=c1>#1</A> From
+<A href="mailto:veronika_irvine at ca.ibm.com">Veronika Irvine</A> 2002-05-27 16:17
+------- </I><PRE>Closing this bug report. A new DCR should be raised from a better custom table
+tree.</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4862.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4862.html
new file mode 100644
index 0000000..813a29a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/4862.html
@@ -0,0 +1,401 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0050)https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 4862 - Check for isDisposed() in dispose after sending Dispose Calback (1GLC25X)</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="4862_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="4862_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="4862_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 4862</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>Check for isDisposed() in dispose after
+ sending Dispose Calback (1GLC25X)</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20040924100922 name=delta_ts> <INPUT type=hidden value=3
+name=longdesclength> <INPUT type=hidden value=4862 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862">4862</A>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All selected>All</OPTION>
+ <OPTION value=Macintosh>Macintosh</OPTION> <OPTION value=PC>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>veronika_irvine at ca.ibm.com (Veronika Irvine) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT>AJDT</OPTION> <OPTION
+ value=AspectJ>AspectJ</OPTION> <OPTION value=CDT>CDT</OPTION> <OPTION
+ value=CME>CME</OPTION> <OPTION value=Community>Community</OPTION>
+ <OPTION value=ECESIS>ECESIS</OPTION> <OPTION value=EMF>EMF</OPTION>
+ <OPTION value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION>
+ <OPTION value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT>JDT</OPTION> <OPTION
+ value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION> <OPTION
+ value=Platform selected>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All selected>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION
+ value="Windows XP">Windows XP</OPTION> <OPTION
+ value="Windows All">Windows All</OPTION> <OPTION value="MacOS X">MacOS
+ X</OPTION> <OPTION value=Linux>Linux</OPTION> <OPTION
+ value=Linux-GTK>Linux-GTK</OPTION> <OPTION
+ value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=Platform">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Ant>Ant</OPTION> <OPTION
+ value=Compare>Compare</OPTION> <OPTION value=CVS>CVS</OPTION> <OPTION
+ value=Debug>Debug</OPTION> <OPTION value=Doc>Doc</OPTION> <OPTION
+ value=Help>Help</OPTION> <OPTION value=Intro>Intro</OPTION> <OPTION
+ value=Releng>Releng</OPTION> <OPTION value=Resources>Resources</OPTION>
+ <OPTION value=Runtime>Runtime</OPTION> <OPTION
+ value=Scripting>Scripting</OPTION> <OPTION value=Search>Search</OPTION>
+ <OPTION value=SWT selected>SWT</OPTION> <OPTION value=Team>Team</OPTION>
+ <OPTION value=Text>Text</OPTION> <OPTION value=UI>UI</OPTION> <OPTION
+ value=Update>Update</OPTION> <OPTION value=WebDAV>WebDAV</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=2.0 selected>2.0</OPTION> <OPTION value=2.0.1>2.0.1</OPTION>
+ <OPTION value=2.0.2>2.0.2</OPTION> <OPTION value=2.1>2.1</OPTION>
+ <OPTION value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION>
+ <OPTION value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION>
+ <OPTION value=3.0.1>3.0.1</OPTION> <OPTION value=3.1>3.1</OPTION></SELECT>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><SELECT multiple size=5 name=cc> <OPTION
+ value=steve_northover at ca.ibm.com>steve_northover at ca.ibm.com</OPTION></SELECT>
+ <BR><INPUT type=checkbox name=removecc>Remove selected CCs <BR></TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>NEW</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3 selected>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>Silenio_Quarti at ca.ibm.com (Silenio Quarti)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value="2.0 M1">2.0
+ M1</OPTION> <OPTION value="2.0 M2">2.0 M2</OPTION> <OPTION
+ value="2.0 M3">2.0 M3</OPTION> <OPTION value="2.0 M4">2.0 M4</OPTION>
+ <OPTION value="2.0 M5">2.0 M5</OPTION> <OPTION value="2.0 M6">2.0
+ M6</OPTION> <OPTION value="2.0 F1">2.0 F1</OPTION> <OPTION
+ value="2.0 F2">2.0 F2</OPTION> <OPTION value="2.0 F3">2.0 F3</OPTION>
+ <OPTION value="2.0 F4">2.0 F4</OPTION> <OPTION
+ value=2.0.1>2.0.1</OPTION> <OPTION value=2.0.2>2.0.2</OPTION> <OPTION
+ value=2.1>2.1</OPTION> <OPTION value="2.1 M1">2.1 M1</OPTION> <OPTION
+ value="2.1 M2">2.1 M2</OPTION> <OPTION value="2.1 M3">2.1 M3</OPTION>
+ <OPTION value="2.1 M4">2.1 M4</OPTION> <OPTION value="2.1 M5">2.1
+ M5</OPTION> <OPTION value="2.1 RC1">2.1 RC1</OPTION> <OPTION
+ value="2.1 RC2">2.1 RC2</OPTION> <OPTION value="2.1 RC3">2.1
+ RC3</OPTION> <OPTION value="2.1 RC4">2.1 RC4</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION> <OPTION
+ value="3.0 M1">3.0 M1</OPTION> <OPTION value="3.0 M2">3.0 M2</OPTION>
+ <OPTION value="3.0 M3">3.0 M3</OPTION> <OPTION value="3.0 M4">3.0
+ M4</OPTION> <OPTION value="3.0 M5">3.0 M5</OPTION> <OPTION
+ value="3.0 M6">3.0 M6</OPTION> <OPTION value="3.0 M7">3.0 M7</OPTION>
+ <OPTION value="3.0 M8">3.0 M8</OPTION> <OPTION value="3.0 M9">3.0
+ M9</OPTION> <OPTION value="3.0 RC1">3.0 RC1</OPTION> <OPTION
+ value="3.0 RC2">3.0 RC2</OPTION> <OPTION value="3.0 RC3">3.0
+ RC3</OPTION> <OPTION value="3.0 RC4">3.0 RC4</OPTION> <OPTION
+ value=3.0.1>3.0.1</OPTION> <OPTION value=3.0.2>3.0.2</OPTION> <OPTION
+ value=3.1>3.1</OPTION> <OPTION value="3.1 M1">3.1 M1</OPTION> <OPTION
+ value="3.1 M2">3.1 M2</OPTION> <OPTION value="3.1 M3">3.1 M3</OPTION>
+ <OPTION value="3.1 M4">3.1 M4</OPTION> <OPTION value="3.1 M5">3.1
+ M5</OPTION> <OPTION value="3.1 M6">3.1 M6</OPTION> <OPTION value=---
+ selected>---</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="Check for isDisposed() in dispose after sending Dispose Calback (1GLC25X)"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4862&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=4862&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 4862 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=4862">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 4862 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH><A href="https://bugs.eclipse.org/bugs/votehelp.html">Votes</A>: </TH>
+ <TD>0 <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&bug_id=4862">Show
+ votes for this bug</A> <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&bug_id=4862">Vote
+ for this bug</A> </TD></TR></TBODY></TABLE><BR><B>Additional Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>NEW </B> <BR><INPUT type=radio value=accept name=knob> Accept bug
+(change status to <B>ASSIGNED</B>) <BR><INPUT type=radio value=resolve
+name=knob> Resolve bug, changing <A
+href="https://bugs.eclipse.org/bugs/bug_status.html">resolution</A> to <SELECT
+onchange=document.changeform.knob[2].checked=true name=resolution> <OPTION
+ value=FIXED selected>FIXED</OPTION> <OPTION value=INVALID>INVALID</OPTION>
+ <OPTION value=WONTFIX>WONTFIX</OPTION> <OPTION value=LATER>LATER</OPTION>
+ <OPTION value=REMIND>REMIND</OPTION> <OPTION
+ value=WORKSFORME>WORKSFORME</OPTION></SELECT> <BR><INPUT type=radio
+value=duplicate name=knob> Resolve bug, mark it as duplicate of bug # <INPUT
+onchange="if (this.value != '') {document.changeform.knob[3].checked=true}"
+size=6 name=dup_id> <BR><INPUT type=radio value=reassign name=knob> <A
+href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Reassign</A>
+bug to <INPUT
+onchange="if ((this.value != 'Silenio_Quarti at ca.ibm.com') && (this.value != '')) { document.changeform.knob[4].checked=true; }"
+size=32 value=Silenio_Quarti at ca.ibm.com name=assigned_to> <BR><INPUT type=radio
+value=reassignbycomponent name=knob> Reassign bug to owner of selected component
+<BR><INPUT type=submit value=Commit> <INPUT type=hidden value=process_bug
+name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=4862">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=4862">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2001-10-11 14:24 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>Run the following example, click on the button and you get the SWT Exception wdiget is disposed.
+See Stack trace below.
+In the dispose method of a widget, we need to check that the widget has not been disposed in the Dispose callback.
+
+public static void main(String args[]){
+ Display display = new Display ();
+ Shell shell = new Shell();
+ shell.setLayout(new org.eclipse.swt.layout.GridLayout());
+ shell.setBounds(100,30, 800,600);
+ shell.open();
+
+ final Composite panel = new Composite(shell, SWT.BORDER);
+ panel.setBounds(20,430,100,100);
+
+ final Button button = new Button(panel, 0);
+ button.setText("dispose button");
+ button.setBounds(7,7,80,70);
+ final SelectionAdapter[] selectionListener = new SelectionAdapter[1];
+ selectionListener[0] = new SelectionAdapter(){
+ public void widgetSelected (org.eclipse.swt.events.SelectionEvent e){
+ button.dispose();
+ }
+ };
+ button.addSelectionListener(selectionListener[0]);
+
+ final DisposeListener[] disposeListener = new DisposeListener[1];
+ disposeListener[0] = new DisposeListener(){
+ public void widgetDisposed(org.eclipse.swt.events.DisposeEvent e){
+ button.removeDisposeListener(disposeListener[0]);
+ panel.dispose();
+ }
+ };
+ button.addDisposeListener(disposeListener[0]);
+
+ while (!shell.isDisposed ()) {
+ if (!display.readAndDispatch ()) display.sleep ();
+ }
+}
+
+
+org.eclipse.swt.SWTException: Widget is disposed
+ at org.eclipse.swt.SWT.error(SWT.java:1818)
+ at org.eclipse.swt.SWT.error(SWT.java:1750)
+ at org.eclipse.swt.widgets.Widget.error(Widget.java:379)
+ at org.eclipse.swt.widgets.Control.getDisplay(Control.java:597)
+ at org.eclipse.swt.widgets.Control.unsubclass(Control.java:2365)
+ at org.eclipse.swt.widgets.Control.releaseWidget(Control.java:1247)
+ at org.eclipse.swt.widgets.Button.releaseWidget(Button.java:344)
+ at org.eclipse.swt.widgets.Widget.dispose(Widget.java:366)
+ at veronika._Scrapbook$1.widgetSelected(_Scrapbook.java:43)
+ at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:85)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:54)
+ at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:645)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:1359)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1160)
+ at veronika._Scrapbook.main(_Scrapbook.java:58)
+Exception in thread "main"
+
+NOTES:</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862#c1" name=c1>#1</A> From
+<A href="mailto:dj_houghton at ca.ibm.com">DJ Houghton</A> 2001-10-29 16:44 -------
+</I><PRE>PRODUCT VERSION:
+2.0 007
+
+</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=4862#c2" name=c2>#2</A> From
+<A href="mailto:veronika_irvine at ca.ibm.com">Veronika Irvine</A> 2004-09-24 10:09
+------- </I><PRE>In 3.1, I get a different error now on Windows:
+
+java.lang.NullPointerException
+ at org.eclipse.swt.widgets.Control.deregister(Control.java:498)
+ at org.eclipse.swt.widgets.Control.releaseWidget(Control.java:1496)
+ at org.eclipse.swt.widgets.Button.releaseWidget(Button.java:364)
+ at org.eclipse.swt.widgets.Widget.dispose(Widget.java:368)
+ at veronika.Newsgroup$1.widgetSelected(Newsgroup.java:25)
+ at org.eclipse.swt.widgets.TypedListener.handleEvent
+(TypedListener.java:89)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2783)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2442)
+ at veronika.Newsgroup.main(Newsgroup.java:40)
+</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/67395.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/67395.html
new file mode 100644
index 0000000..ec99110
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/67395.html
@@ -0,0 +1,390 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0051)https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 67395 - NullPointerException @ org.eclipse.jdt.internal.debug.eval.ast.engine.ASTInstructionCompiler.containsALocalType</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="67395_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="67395_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="67395_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 67395</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>NullPointerException @
+ org.eclipse.jdt.internal.debug.eval.ast.engine.ASTInstructionCompiler.containsALocalType</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug
+List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20041108112414 name=delta_ts> <INPUT type=hidden value=10
+name=longdesclength> <INPUT type=hidden value=67395 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395">67395</A> </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>Leo.Kuznetsov at windriver.com (Leo Kuznetsov) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT>AJDT</OPTION> <OPTION
+ value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION> <OPTION
+ value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT selected>JDT</OPTION>
+ <OPTION value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION>
+ <OPTION value=Platform>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=JDT">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Core>Core</OPTION> <OPTION
+ value=Debug selected>Debug</OPTION> <OPTION value=Doc>Doc</OPTION>
+ <OPTION value=Text>Text</OPTION> <OPTION value=UI>UI</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=2.0>2.0</OPTION> <OPTION value=2.0.1>2.0.1</OPTION> <OPTION
+ value=2.0.2>2.0.2</OPTION> <OPTION value=2.1>2.1</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=3.0 selected>3.0</OPTION> <OPTION value=3.0.1>3.0.1</OPTION>
+ <OPTION value=3.1>3.1</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><SELECT multiple size=5 name=cc> <OPTION
+ value=christof_marti at ch.ibm.com>christof_marti at ch.ibm.com</OPTION>
+ <OPTION value=Darin_Wright at ca.ibm.com>Darin_Wright at ca.ibm.com</OPTION>
+ <OPTION
+ value=Michael.Scharf at windriver.com>Michael.Scharf at windriver.com</OPTION></SELECT>
+ <BR><INPUT type=checkbox name=removecc>Remove selected CCs <BR></TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>ASSIGNED</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3 selected>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>luc_bourlier at us.ibm.com (Luc Bourlier)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value="2.0 M1">2.0
+ M1</OPTION> <OPTION value="2.0 M2">2.0 M2</OPTION> <OPTION
+ value="2.0 M3">2.0 M3</OPTION> <OPTION value="2.0 M4">2.0 M4</OPTION>
+ <OPTION value="2.0 M5">2.0 M5</OPTION> <OPTION value="2.0 M6">2.0
+ M6</OPTION> <OPTION value="2.0 F1">2.0 F1</OPTION> <OPTION
+ value="2.0 F2">2.0 F2</OPTION> <OPTION value="2.0 F3">2.0 F3</OPTION>
+ <OPTION value="2.0 F4">2.0 F4</OPTION> <OPTION
+ value=2.0.1>2.0.1</OPTION> <OPTION value=2.0.2>2.0.2</OPTION> <OPTION
+ value=2.1>2.1</OPTION> <OPTION value="2.1 M1">2.1 M1</OPTION> <OPTION
+ value="2.1 M2">2.1 M2</OPTION> <OPTION value="2.1 M3">2.1 M3</OPTION>
+ <OPTION value="2.1 M4">2.1 M4</OPTION> <OPTION value="2.1 M5">2.1
+ M5</OPTION> <OPTION value="2.1 RC1">2.1 RC1</OPTION> <OPTION
+ value="2.1 RC2">2.1 RC2</OPTION> <OPTION value="2.1 RC3">2.1
+ RC3</OPTION> <OPTION value="2.1 RC4">2.1 RC4</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION> <OPTION
+ value="3.0 M1">3.0 M1</OPTION> <OPTION value="3.0 M2">3.0 M2</OPTION>
+ <OPTION value="3.0 M3">3.0 M3</OPTION> <OPTION value="3.0 M4">3.0
+ M4</OPTION> <OPTION value="3.0 M5">3.0 M5</OPTION> <OPTION
+ value="3.0 M6">3.0 M6</OPTION> <OPTION value="3.0 M7">3.0 M7</OPTION>
+ <OPTION value="3.0 M8">3.0 M8</OPTION> <OPTION value="3.0 M9">3.0
+ M9</OPTION> <OPTION value="3.0 RC1">3.0 RC1</OPTION> <OPTION
+ value="3.0 RC2">3.0 RC2</OPTION> <OPTION value="3.0 RC3">3.0
+ RC3</OPTION> <OPTION value="3.0 RC4">3.0 RC4</OPTION> <OPTION
+ value=3.0.1>3.0.1</OPTION> <OPTION value=3.0.2>3.0.2</OPTION> <OPTION
+ value=3.1>3.1</OPTION> <OPTION value="3.1 M1">3.1 M1</OPTION> <OPTION
+ value="3.1 M2">3.1 M2</OPTION> <OPTION value="3.1 M3">3.1 M3</OPTION>
+ <OPTION value="3.1 M4" selected>3.1 M4</OPTION> <OPTION
+ value="3.1 M5">3.1 M5</OPTION> <OPTION value="3.1 M6">3.1 M6</OPTION>
+ <OPTION value=--->---</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="NullPointerException @ org.eclipse.jdt.internal.debug.eval.ast.engine.ASTInstructionCompiler.containsALocalType"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=67395&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=67395&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 67395 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=67395">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 67395 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH><A href="https://bugs.eclipse.org/bugs/votehelp.html">Votes</A>: </TH>
+ <TD>0 <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&bug_id=67395">Show
+ votes for this bug</A> <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&bug_id=67395">Vote
+ for this bug</A> </TD></TR></TBODY></TABLE><BR><B>Additional Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>ASSIGNED </B> <BR><INPUT type=radio value=resolve name=knob> Resolve
+bug, changing <A
+href="https://bugs.eclipse.org/bugs/bug_status.html">resolution</A> to <SELECT
+onchange=document.changeform.knob[1].checked=true name=resolution> <OPTION
+ value=FIXED selected>FIXED</OPTION> <OPTION value=INVALID>INVALID</OPTION>
+ <OPTION value=WONTFIX>WONTFIX</OPTION> <OPTION value=LATER>LATER</OPTION>
+ <OPTION value=REMIND>REMIND</OPTION> <OPTION
+ value=WORKSFORME>WORKSFORME</OPTION></SELECT> <BR><INPUT type=radio
+value=duplicate name=knob> Resolve bug, mark it as duplicate of bug # <INPUT
+onchange="if (this.value != '') {document.changeform.knob[2].checked=true}"
+size=6 name=dup_id> <BR><INPUT type=radio value=reassign name=knob> <A
+href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Reassign</A>
+bug to <INPUT
+onchange="if ((this.value != 'luc_bourlier at us.ibm.com') && (this.value != '')) { document.changeform.knob[3].checked=true; }"
+size=32 value=luc_bourlier at us.ibm.com name=assigned_to> <BR><INPUT type=radio
+value=reassignbycomponent name=knob> Reassign bug to owner of selected component
+<BR><INPUT type=submit value=Commit> <INPUT type=hidden value=process_bug
+name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=67395">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=67395">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2004-06-15 18:14 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>java.lang.NullPointerException
+at
+org.eclipse.jdt.internal.debug.eval.ast.engine.ASTInstructionCompiler.containsA
+LocalType(ASTInstructionCompiler.java:331)
+at org.eclipse.jdt.internal.debug.eval.ast.engine.ASTInstructionCompiler.visit
+(ASTInstructionCompiler.java:2075)
+at org.eclipse.jdt.core.dom.MethodInvocation.accept0(MethodInvocation.java:234)
+at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2456)
+at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2503)
+at org.eclipse.jdt.core.dom.ReturnStatement.accept0(ReturnStatement.java:133)
+at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2456)
+at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2526)
+at org.eclipse.jdt.core.dom.Block.accept0(Block.java:133)
+at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2456)
+at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2503)
+at org.eclipse.jdt.core.dom.MethodDeclaration.accept0
+(MethodDeclaration.java:499)
+at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2456)
+at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2526)
+at org.eclipse.jdt.core.dom.TypeDeclaration.accept0(TypeDeclaration.java:474)
+at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2456)
+at org.eclipse.jdt.core.dom.ASTNode.acceptChildren(ASTNode.java:2526)
+at org.eclipse.jdt.core.dom.CompilationUnit.accept0(CompilationUnit.java:290)
+at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2456)
+at
+org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine.createExpres
+sionFromAST(ASTEvaluationEngine.java:251)
+at
+org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine.getCompiledE
+xpression(ASTEvaluationEngine.java:156)
+at org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine.evaluate
+(ASTEvaluationEngine.java:73)
+at
+org.eclipse.jdt.internal.debug.ui.JavaWatchExpressionDelegate$EvaluationRunnabl
+e.run(JavaWatchExpressionDelegate.java:144)
+at org.eclipse.jdt.internal.debug.core.model.JDIThread$ThreadJob.run
+(JDIThread.java:2510)
+at org.eclipse.core.internal.jobs.Worker.run(Worker.java:66)</PRE><BR><I>-------
+Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c1" name=c1>#1</A>
+From <A href="mailto:john_arthorne at ca.ibm.com">John Arthorne</A> 2004-06-15
+18:17 ------- </I><PRE>Please include the Eclipse build number in the bug report. Also, it looks like
+you are evaluating a watch expression. Please include/describe the expression,
+and say if it is reproducible.</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c2" name=c2>#2</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-06-16 13:38
+------- </I><PRE>Do you have the expression that caused this problem?</PRE><BR><I>-------
+Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c3" name=c3>#3</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-06-17 12:26
+------- </I><PRE>*** <STRIKE><A title="RESOLVED DUPLICATE - NPE while evaluating watch expression" href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67664">Bug 67664</A></STRIKE> has been marked as a duplicate of this bug. ***</PRE><BR><I>-------
+Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c4" name=c4>#4</A>
+From <A href="mailto:Leo.Kuznetsov at windriver.com">Leo Kuznetsov</A> 2004-06-17
+15:53 ------- </I><PRE>This was a function call:
+
+Sequent.getCurrent().toDebugString()
+
+where toDebugString() returns String</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c5" name=c5>#5</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-06-23 09:24
+------- </I><PRE>Deferred</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c6" name=c6>#6</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-08-03 14:57
+------- </I><PRE>*** <STRIKE><A title="RESOLVED DUPLICATE - NPE from watch expression evaluation" href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=70615">Bug 70615</A></STRIKE> has been marked as a duplicate of this bug. ***</PRE><BR><I>-------
+Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c7" name=c7>#7</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-08-03 14:57
+------- </I><PRE>open for 3.1</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c8" name=c8>#8</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-08-03 14:58
+------- </I><PRE>Luc, please advise if this should be fixed in 3.0.1</PRE><BR><I>-------
+Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=67395#c9" name=c9>#9</A>
+From <A href="mailto:Darin_Wright at ca.ibm.com">Darin Wright</A> 2004-08-12 09:26
+------- </I><PRE>*** <STRIKE><A title="RESOLVED DUPLICATE - NPE in ASTInstructionCompiler.containsALocalType" href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=71851">Bug 71851</A></STRIKE> has been marked as a duplicate of this bug. ***</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76146.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76146.html
new file mode 100644
index 0000000..f806fe8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76146.html
@@ -0,0 +1,406 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0051)https://bugs.eclipse.org/bugs/show_bug.cgi?id=76146 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 76146 - NPE using quickfix in Aspect opened with java editor</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="76146_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="76146_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="76146_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 76146</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>NPE using quickfix in Aspect opened with java
+ editor</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20041013045125 name=delta_ts> <INPUT type=hidden value=1
+name=longdesclength> <INPUT type=hidden value=76146 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76146">76146</A> </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>hawkinsh at uk.ibm.com (Helen Hawkins) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT selected>AJDT</OPTION>
+ <OPTION value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION>
+ <OPTION value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT>JDT</OPTION> <OPTION
+ value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION> <OPTION
+ value=Platform>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=AJDT">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Core>Core</OPTION> <OPTION
+ value=Doc>Doc</OPTION> <OPTION value=UI selected>UI</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.1.11>1.1.11</OPTION> <OPTION
+ value=1.1.12 selected>1.1.12</OPTION> <OPTION value=1.1.3>1.1.3</OPTION>
+ <OPTION value=1.1.4>1.1.4</OPTION> <OPTION value=1.1.7>1.1.7</OPTION>
+ <OPTION value=1.2.0>1.2.0</OPTION> <OPTION value="1.2.0 M1">1.2.0
+ M1</OPTION> <OPTION value=unspecified>unspecified</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><INPUT type=hidden name=cc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>NEW</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3 selected>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>mchapman at uk.ibm.com (Matt Chapman)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value=---
+ selected>---</OPTION> <OPTION value=1.1.12>1.1.12</OPTION> <OPTION
+ value=1.1.13>1.1.13</OPTION> <OPTION value=1.1.3>1.1.3</OPTION> <OPTION
+ value=1.1.4>1.1.4</OPTION> <OPTION value=1.2.0>1.2.0</OPTION> <OPTION
+ value="1.2.0 M1">1.2.0 M1</OPTION> <OPTION value="1.2.0 M2">1.2.0
+ M2</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="NPE using quickfix in Aspect opened with java editor"
+ name=short_desc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76146&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76146&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 76146 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=76146">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 76146 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE><BR><B>Additional
+Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>NEW </B> <BR><INPUT type=radio value=accept name=knob> Accept bug
+(change status to <B>ASSIGNED</B>) <BR><INPUT type=radio value=resolve
+name=knob> Resolve bug, changing <A
+href="https://bugs.eclipse.org/bugs/bug_status.html">resolution</A> to <SELECT
+onchange=document.changeform.knob[2].checked=true name=resolution> <OPTION
+ value=FIXED selected>FIXED</OPTION> <OPTION value=INVALID>INVALID</OPTION>
+ <OPTION value=WONTFIX>WONTFIX</OPTION> <OPTION value=LATER>LATER</OPTION>
+ <OPTION value=REMIND>REMIND</OPTION> <OPTION
+ value=WORKSFORME>WORKSFORME</OPTION></SELECT> <BR><INPUT type=radio
+value=duplicate name=knob> Resolve bug, mark it as duplicate of bug # <INPUT
+onchange="if (this.value != '') {document.changeform.knob[3].checked=true}"
+size=6 name=dup_id> <BR><INPUT type=radio value=reassign name=knob> <A
+href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Reassign</A>
+bug to <INPUT
+onchange="if ((this.value != 'mchapman at uk.ibm.com') && (this.value != '')) { document.changeform.knob[4].checked=true; }"
+size=32 value=mchapman at uk.ibm.com name=assigned_to> <BR><INPUT type=radio
+value=reassignbycomponent name=knob> Reassign bug to owner of selected component
+<BR><INPUT type=submit value=Commit> <INPUT type=hidden value=process_bug
+name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=76146">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=76146">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76146#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2004-10-13 04:51 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>To recreate:
+
+- Check out the QuickFix project from ajdt.test project
+- Open TestAspect.java in the Java Editor (right click > open with > Java
+Editor)
+- Click on the lightbulb with the error marker (the same line as File f = new
+File("tmp");
+- An Internal Error appear in the Error log with the following stack trace:
+
+
+
+java.lang.NullPointerException
+at
+org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsSubProcessor.getT
+ypeProposals(UnresolvedElementsSubProcessor.java:395)
+at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.process
+(QuickFixProcessor.java:270)
+at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.getCorrections
+(QuickFixProcessor.java:202)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.collectCorr
+ections(JavaCorrectionProcessor.java:240)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.processAnno
+tations(JavaCorrectionProcessor.java:208)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.computeComp
+letionProposals(JavaCorrectionProcessor.java:177)
+at
+org.eclipse.jface.text.contentassist.ContentAssistant.computeCompletionProposal
+s(ContentAssistant.java:1472)
+at
+org.eclipse.jface.text.contentassist.CompletionProposalPopup.computeProposals
+(CompletionProposalPopup.java:242)
+at org.eclipse.jface.text.contentassist.CompletionProposalPopup.access$7
+(CompletionProposalPopup.java:238)
+at org.eclipse.jface.text.contentassist.CompletionProposalPopup$1.run
+(CompletionProposalPopup.java:197)
+at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
+at org.eclipse.jface.text.contentassist.CompletionProposalPopup.showProposals
+(CompletionProposalPopup.java:192)
+at
+org.eclipse.jface.text.contentassist.ContentAssistant.showPossibleCompletions
+(ContentAssistant.java:1320)
+at
+org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionAssistant.showPossibl
+eCompletions(JavaCorrectionAssistant.java:159)
+at
+org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewe
+r.doOperation(CompilationUnitEditor.java:184)
+at org.eclipse.jdt.internal.ui.javaeditor.JavaSelectAnnotationRulerAction.run
+(JavaSelectAnnotationRulerAction.java:78)
+at org.eclipse.ui.texteditor.AbstractRulerActionDelegate.run
+(AbstractRulerActionDelegate.java:99)
+at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:276)
+at org.eclipse.ui.internal.PluginAction.run(PluginAction.java:238)
+at org.eclipse.ui.texteditor.AbstractTextEditor$11.triggerAction
+(AbstractTextEditor.java:2110)
+at org.eclipse.ui.texteditor.AbstractTextEditor$11.mouseUp
+(AbstractTextEditor.java:2117)
+at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:136)
+at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
+at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796)
+at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2772)
+at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2431)
+at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1377)
+at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1348)
+at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:254)
+at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:141)
+at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:96)
+at org.eclipse.core.internal.runtime.PlatformActivator$1.run
+(PlatformActivator.java:335)
+at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:273)
+at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:129)
+at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+at sun.reflect.NativeMethodAccessorImpl.invoke
+(NativeMethodAccessorImpl.java:39)
+at sun.reflect.DelegatingMethodAccessorImpl.invoke
+(DelegatingMethodAccessorImpl.java:25)
+at java.lang.reflect.Method.invoke(Method.java:324)
+at org.eclipse.core.launcher.Main.basicRun(Main.java:183)
+at org.eclipse.core.launcher.Main.run(Main.java:644)
+at org.eclipse.core.launcher.Main.main(Main.java:628)
+
+
+Looking at the jdt code in UnresolvedElementsSubProcessor.java, at line 395,
+the parent field is null:
+
+ ASTNode parent= selectedNode.getParent();
+ while (parent.getLength() == selectedNode.getLength()) { // line 395
+ parent= parent.getParent();
+ }
+
+There just needs to be a null check as there is above:
+
+
+ ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot());
+ if (selectedNode == null) {
+ return;
+ }
+ int kind= SimilarElementsRequestor.ALL_TYPES;
+
+ ASTNode parent= selectedNode.getParent();
+ while (parent.getLength() == selectedNode.getLength()) {
+ parent= parent.getParent();
+ }
+
+should become:
+
+
+ ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot());
+ if (selectedNode == null) {
+ return;
+ }
+ int kind= SimilarElementsRequestor.ALL_TYPES;
+
+ ASTNode parent= selectedNode.getParent();
+ if (parent == null) {
+ return;
+ }
+ while (parent.getLength() == selectedNode.getLength()) {
+ parent= parent.getParent();
+ }
+
+
+This needs to be raised as a jdt bug, since we don't pass through any ajdt
+code in order to get here.
+
+Raising this bug against ajdt is just for tracking.
+
+(note this happens on 1.1.12, but also on the latest AJDT dev build).</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76388.html b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76388.html
new file mode 100644
index 0000000..1e2c41a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.tests/testdata/reports-stacktrace/76388.html
@@ -0,0 +1,426 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- saved from url=(0051)https://bugs.eclipse.org/bugs/show_bug.cgi?id=76388 -->
+<!-- 1.0 at bugzilla.org --><!-- 1.0 at bugzilla.org --><HTML><HEAD><TITLE>Bug 76388 - Assertion failed during pull up refactoring</TITLE>
+<META http-equiv=Content-Type content="text/html; charset=iso-8859-1"><LINK
+href="show_bug.cgi?id=36310" rel=Next><LINK href="show_bug.cgi?id=76101"
+rel=Last><LINK href="buglist.cgi?regetlastlist=1" rel=Up><LINK
+href="buglist.cgi?regetlastlist=1" rel=Contents>
+<META content="MSHTML 6.00.2800.1476" name=GENERATOR></HEAD>
+<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff
+onload=""><!-- 1.0 at bugzilla.org -->
+<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
+ <TBODY>
+ <TR>
+ <TD width="100%">
+ <TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#006699
+ border=0><TBODY>
+ <TR>
+ <TD width=116 bgColor=#000000><IMG height=50
+ src="76388_files/EclipseBannerPic.jpg" width=115></TD>
+ <TD width=637><A href="http://www.eclipse.org/"><IMG height=50
+ src="76388_files/gradient.jpg" width=282 border=0></A></TD>
+ <TD width=250><IMG height=48 src="76388_files/eproject-simple.gif"
+ width=250></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
+<TABLE cellSpacing=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top align=left>
+ <TABLE cellSpacing=2 cellPadding=0 border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top noWrap align=left><FONT size=+1><B>Bugzilla Bug
+ 76388</B></FONT> </TD></TR></TBODY></TABLE></TD>
+ <TD vAlign=center> </TD>
+ <TD vAlign=center align=left>Assertion failed during pull up
+ refactoring</TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><B>Bug List:</B>
+<A href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A>
+<HR>
+
+<FORM name=changeform action=process_bug.cgi method=post><INPUT type=hidden
+value=20041019085725 name=delta_ts> <INPUT type=hidden value=3
+name=longdesclength> <INPUT type=hidden value=76388 name=id>
+<TABLE cellSpacing=1 cellPadding=1 border=0>
+ <TBODY>
+ <TR>
+ <TD align=right><B>Bug#:</B> </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76388">76388</A> </TD>
+ <TD> </TD>
+ <TD align=right><B>Platform:</B> </TD>
+ <TD><SELECT name=rep_platform> <OPTION value=All>All</OPTION> <OPTION
+ value=Macintosh>Macintosh</OPTION> <OPTION value=PC selected>PC</OPTION>
+ <OPTION value="Power PC">Power PC</OPTION> <OPTION
+ value=Sun>Sun</OPTION> <OPTION value=Other>Other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Reporter:</B> </TD>
+ <TD>silvio_boehler at ca.ibm.com (Silvio Böhler) </TD></TR>
+ <TR>
+ <TD align=right><B>Product:</B> </TD>
+ <TD><SELECT name=product> <OPTION value=AJDT>AJDT</OPTION> <OPTION
+ value=AspectJ>AspectJ</OPTION> <OPTION value=Birt>Birt</OPTION> <OPTION
+ value=CDT>CDT</OPTION> <OPTION value=CME>CME</OPTION> <OPTION
+ value=Community>Community</OPTION> <OPTION value=ECESIS>ECESIS</OPTION>
+ <OPTION value=ECF>ECF</OPTION> <OPTION value=EMF>EMF</OPTION> <OPTION
+ value=Equinox>Equinox</OPTION> <OPTION value=ERCP>ERCP</OPTION> <OPTION
+ value=GEF>GEF</OPTION> <OPTION value=GMT>GMT</OPTION> <OPTION
+ value=Hyades>Hyades</OPTION> <OPTION value=JDT selected>JDT</OPTION>
+ <OPTION value=OMELET>OMELET</OPTION> <OPTION value=PDE>PDE</OPTION>
+ <OPTION value=Platform>Platform</OPTION> <OPTION
+ value=Pollinate>Pollinate</OPTION> <OPTION
+ value=Stellation>Stellation</OPTION> <OPTION value=UML2>UML2</OPTION>
+ <OPTION value=VE>VE</OPTION> <OPTION value="Web Tools">Web
+ Tools</OPTION> <OPTION value=WSVT>WSVT</OPTION> <OPTION
+ value=XSD>XSD</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>OS:</B> </TD>
+ <TD><SELECT name=op_sys> <OPTION value=All>All</OPTION> <OPTION
+ value="AIX Motif">AIX Motif</OPTION> <OPTION value="Windows 95">Windows
+ 95</OPTION> <OPTION value="Windows 98">Windows 98</OPTION> <OPTION
+ value="Windows CE">Windows CE</OPTION> <OPTION
+ value="Windows ME">Windows ME</OPTION> <OPTION
+ value="Windows 2000">Windows 2000</OPTION> <OPTION
+ value="Windows NT">Windows NT</OPTION> <OPTION value="Windows XP"
+ selected>Windows XP</OPTION> <OPTION value="Windows All">Windows
+ All</OPTION> <OPTION value="MacOS X">MacOS X</OPTION> <OPTION
+ value=Linux>Linux</OPTION> <OPTION value=Linux-GTK>Linux-GTK</OPTION>
+ <OPTION value=Linux-Motif>Linux-Motif</OPTION> <OPTION
+ value=HP-UX>HP-UX</OPTION> <OPTION value=Neutrino>Neutrino</OPTION>
+ <OPTION value=QNX-Photon>QNX-Photon</OPTION> <OPTION
+ value=Solaris>Solaris</OPTION> <OPTION
+ value=Solaris-GTK>Solaris-GTK</OPTION> <OPTION
+ value=Solaris-Motif>Solaris-Motif</OPTION> <OPTION value="Unix All">Unix
+ All</OPTION> <OPTION value=other>other</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD align=right><B>Add CC:</B> </TD>
+ <TD><INPUT size=30 name=newcc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describecomponents.cgi?product=JDT">Component</A>:
+ </B></TD>
+ <TD><SELECT name=component> <OPTION value=Core>Core</OPTION> <OPTION
+ value=Debug>Debug</OPTION> <OPTION value=Doc>Doc</OPTION> <OPTION
+ value=Text>Text</OPTION> <OPTION value=UI selected>UI</OPTION></SELECT>
+</TD>
+ <TD> </TD>
+ <TD align=right><B>Version:</B> </TD>
+ <TD><SELECT name=version> <OPTION value=1.0>1.0</OPTION> <OPTION
+ value=2.0>2.0</OPTION> <OPTION value=2.0.1>2.0.1</OPTION> <OPTION
+ value=2.0.2>2.0.2</OPTION> <OPTION value=2.1>2.1</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=3.0 selected>3.0</OPTION> <OPTION value=3.0.1>3.0.1</OPTION>
+ <OPTION value=3.1>3.1</OPTION></SELECT> </TD>
+ <TD> </TD>
+ <TD vAlign=top align=right rowSpan=4><B>CC:</B> </TD>
+ <TD vAlign=top rowSpan=4><INPUT type=hidden name=cc> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Status</A>: </B></TD>
+ <TD>NEW</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#priority">Priority</A>:</B>
+ </TD>
+ <TD><SELECT name=priority> <OPTION value=P1>P1</OPTION> <OPTION
+ value=P2>P2</OPTION> <OPTION value=P3 selected>P3</OPTION> <OPTION
+ value=P4>P4</OPTION> <OPTION value=P5>P5</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html">Resolution</A>:
+ </B></TD>
+ <TD></TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#severity">Severity</A>:</B>
+ </TD>
+ <TD><SELECT name=bug_severity> <OPTION value=blocker>blocker</OPTION>
+ <OPTION value=critical>critical</OPTION> <OPTION
+ value=major>major</OPTION> <OPTION value=normal selected>normal</OPTION>
+ <OPTION value=minor>minor</OPTION> <OPTION
+ value=trivial>trivial</OPTION> <OPTION
+ value=enhancement>enhancement</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Assigned To</A>:
+ </B></TD>
+ <TD>dirk_baeumer at ch.ibm.com (Dirk Baeumer)</TD>
+ <TD> </TD>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/notargetmilestone.html">Target
+ Milestone</A>: </B></TD>
+ <TD><SELECT name=target_milestone> <OPTION value="2.0 M1">2.0
+ M1</OPTION> <OPTION value="2.0 M2">2.0 M2</OPTION> <OPTION
+ value="2.0 M3">2.0 M3</OPTION> <OPTION value="2.0 M4">2.0 M4</OPTION>
+ <OPTION value="2.0 M5">2.0 M5</OPTION> <OPTION value="2.0 M6">2.0
+ M6</OPTION> <OPTION value="2.0 F1">2.0 F1</OPTION> <OPTION
+ value="2.0 F2">2.0 F2</OPTION> <OPTION value="2.0 F3">2.0 F3</OPTION>
+ <OPTION value="2.0 F4">2.0 F4</OPTION> <OPTION
+ value=2.0.1>2.0.1</OPTION> <OPTION value=2.0.2>2.0.2</OPTION> <OPTION
+ value=2.1>2.1</OPTION> <OPTION value="2.1 M1">2.1 M1</OPTION> <OPTION
+ value="2.1 M2">2.1 M2</OPTION> <OPTION value="2.1 M3">2.1 M3</OPTION>
+ <OPTION value="2.1 M4">2.1 M4</OPTION> <OPTION value="2.1 M5">2.1
+ M5</OPTION> <OPTION value="2.1 RC1">2.1 RC1</OPTION> <OPTION
+ value="2.1 RC2">2.1 RC2</OPTION> <OPTION value="2.1 RC3">2.1
+ RC3</OPTION> <OPTION value="2.1 RC4">2.1 RC4</OPTION> <OPTION
+ value=2.1.1>2.1.1</OPTION> <OPTION value=2.1.2>2.1.2</OPTION> <OPTION
+ value=2.1.3>2.1.3</OPTION> <OPTION value=3.0>3.0</OPTION> <OPTION
+ value="3.0 M1">3.0 M1</OPTION> <OPTION value="3.0 M2">3.0 M2</OPTION>
+ <OPTION value="3.0 M3">3.0 M3</OPTION> <OPTION value="3.0 M4">3.0
+ M4</OPTION> <OPTION value="3.0 M5">3.0 M5</OPTION> <OPTION
+ value="3.0 M6">3.0 M6</OPTION> <OPTION value="3.0 M7">3.0 M7</OPTION>
+ <OPTION value="3.0 M8">3.0 M8</OPTION> <OPTION value="3.0 M9">3.0
+ M9</OPTION> <OPTION value="3.0 RC1">3.0 RC1</OPTION> <OPTION
+ value="3.0 RC2">3.0 RC2</OPTION> <OPTION value="3.0 RC3">3.0
+ RC3</OPTION> <OPTION value="3.0 RC4">3.0 RC4</OPTION> <OPTION
+ value=3.0.1>3.0.1</OPTION> <OPTION value=3.0.2>3.0.2</OPTION> <OPTION
+ value=3.1>3.1</OPTION> <OPTION value="3.1 M1">3.1 M1</OPTION> <OPTION
+ value="3.1 M2">3.1 M2</OPTION> <OPTION value="3.1 M3">3.1 M3</OPTION>
+ <OPTION value="3.1 M4">3.1 M4</OPTION> <OPTION value="3.1 M5">3.1
+ M5</OPTION> <OPTION value="3.1 M6">3.1 M6</OPTION> <OPTION value=---
+ selected>---</OPTION></SELECT> </TD>
+ <TD> </TD></TR>
+ <TR>
+ <TD align=right><B>URL: </B></TD>
+ <TD colSpan=7><INPUT size=60 name=bug_file_loc> </TD></TR>
+ <TR>
+ <TD align=right><B>Summary:</B> </TD>
+ <TD colSpan=7><INPUT size=60
+ value="Assertion failed during pull up refactoring" name=short_desc>
+</TD></TR>
+ <TR>
+ <TD align=right><B><A
+ href="https://bugs.eclipse.org/bugs/describekeywords.cgi">Keywords</A>:
+ </B>
+ <TD colSpan=7><INPUT size=60 name=keywords> </TD></TR></TBODY></TABLE><!-- 1.0 at bugzilla.org --><BR>
+<TABLE cellSpacing=0 cellPadding=4 border=1>
+ <TBODY>
+ <TR>
+ <TH align=left bgColor=#cccccc>Attachment</TH>
+ <TH align=left bgColor=#cccccc>Type</TH>
+ <TH align=left bgColor=#cccccc>Modified</TH>
+ <TH align=left bgColor=#cccccc>Status</TH>
+ <TH align=left bgColor=#cccccc>Actions</TH></TR>
+ <TR>
+ <TD colSpan=4><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76388&action=enter">Create
+ a New Attachment</A> (proposed patch, testcase, etc.) </TD>
+ <TD><A
+ href="https://bugs.eclipse.org/bugs/attachment.cgi?bugid=76388&action=viewall">View
+ All</A> </TD></TR></TBODY></TABLE><BR>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH align=right>Bug 76388 depends on:</TH>
+ <TD></TD>
+ <TD><INPUT name=dependson> </TD>
+ <TD rowSpan=2><A
+ href="https://bugs.eclipse.org/bugs/showdependencytree.cgi?id=76388">Show
+ dependency tree</A> </TD></TR>
+ <TR>
+ <TH align=right>Bug 76388 blocks:</TH>
+ <TD></TD>
+ <TD><INPUT name=blocked> </TD></TR></TBODY></TABLE>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TH><A href="https://bugs.eclipse.org/bugs/votehelp.html">Votes</A>: </TH>
+ <TD>0 <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_bug&bug_id=76388">Show
+ votes for this bug</A> <A
+ href="https://bugs.eclipse.org/bugs/votes.cgi?action=show_user&bug_id=76388">Vote
+ for this bug</A> </TD></TR></TBODY></TABLE><BR><B>Additional Comments:</B> <BR><TEXTAREA accessKey=c name=comment rows=10 wrap=hard cols=80></TEXTAREA>
+<BR><BR><INPUT type=radio CHECKED value=none name=knob> Leave as
+<B>NEW </B> <BR><INPUT type=radio value=accept name=knob> Accept bug
+(change status to <B>ASSIGNED</B>) <BR><INPUT type=radio value=resolve
+name=knob> Resolve bug, changing <A
+href="https://bugs.eclipse.org/bugs/bug_status.html">resolution</A> to <SELECT
+onchange=document.changeform.knob[2].checked=true name=resolution> <OPTION
+ value=FIXED selected>FIXED</OPTION> <OPTION value=INVALID>INVALID</OPTION>
+ <OPTION value=WONTFIX>WONTFIX</OPTION> <OPTION value=LATER>LATER</OPTION>
+ <OPTION value=REMIND>REMIND</OPTION> <OPTION
+ value=WORKSFORME>WORKSFORME</OPTION></SELECT> <BR><INPUT type=radio
+value=duplicate name=knob> Resolve bug, mark it as duplicate of bug # <INPUT
+onchange="if (this.value != '') {document.changeform.knob[3].checked=true}"
+size=6 name=dup_id> <BR><INPUT type=radio value=reassign name=knob> <A
+href="https://bugs.eclipse.org/bugs/bug_status.html#assigned_to">Reassign</A>
+bug to <INPUT
+onchange="if ((this.value != 'dirk_baeumer at ch.ibm.com') && (this.value != '')) { document.changeform.knob[4].checked=true; }"
+size=32 value=dirk_baeumer at ch.ibm.com name=assigned_to> <BR><INPUT type=radio
+value=reassignbycomponent name=knob> Reassign bug to owner of selected component
+<BR><INPUT type=submit value=Commit> <INPUT type=hidden value=process_bug
+name=form_name>
+<P><FONT size=+1><B><A
+href="https://bugs.eclipse.org/bugs/show_activity.cgi?id=76388">View Bug
+Activity</A> | <A
+href="https://bugs.eclipse.org/bugs/long_list.cgi?buglist=76388">Format For
+Printing</A> </B></FONT></P></FORM>
+<TABLE>
+ <TBODY>
+ <TR>
+ <TD align=left><B><A
+ href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76388#c0"
+ name=c0>Description</A>: </B></TD>
+ <TD align=right width="100%">Opened: 2004-10-15 15:30 </TD></TR></TBODY></TABLE>
+<HR>
+<!-- 1.0 at bugzilla.org --><PRE>I was doing some pull up refactorings.
+
+!SESSION Oct 15, 2004 15:08:42.572 ---------------------------------------------
+eclipse.buildId=I200410130800
+java.fullversion=J2RE 1.4.2 IBM J9 2.2 Windows XP x86-32 j9n142-20040831 (JIT
+enabled)
+J9VM - 20040827_2136_lHdSMR
+JIT - r7_level20040827_1801
+BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US
+
+!ENTRY org.eclipse.core.runtime 4 2 Oct 15, 2004 15:08:42.572
+!MESSAGE Problems occurred when invoking code from plug-in:
+"org.eclipse.core.runtime".
+!STACK 0
+org.eclipse.jface.text.Assert$AssertionFailedException: Assertion failed:
+ at org.eclipse.jface.text.Assert.isTrue(Assert.java:177)
+ at org.eclipse.jface.text.Assert.isTrue(Assert.java:162)
+ at org.eclipse.text.edits.TextEdit.internalSetLength(TextEdit.java:712)
+ at org.eclipse.text.edits.MultiTextEdit.defineRegion(MultiTextEdit.java:194)
+ at org.eclipse.text.edits.TextEditProcessor.<init>(TextEditProcessor.java:65)
+ at org.eclipse.text.edits.TextEditProcessor.<init>(TextEditProcessor.java:56)
+ at
+org.eclipse.ltk.core.refactoring.TextChange.createTextEditProcessor(TextChange.java:638)
+ at
+org.eclipse.ltk.core.refactoring.TextChange.getPreviewDocument(TextChange.java:611)
+ at
+org.eclipse.ltk.core.refactoring.TextChange.getPreviewDocument(TextChange.java:538)
+ at
+org.eclipse.ltk.core.refactoring.TextChange.getPreviewContent(TextChange.java:553)
+ at
+org.eclipse.ltk.internal.ui.refactoring.TextChangePreviewViewer.setInput(TextChangePreviewViewer.java:190)
+ at
+org.eclipse.ltk.internal.ui.refactoring.DefaultChangeElement.feedInput(DefaultChangeElement.java:57)
+ at
+org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.showPreview(PreviewWizardPage.java:370)
+ at
+org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.access$2(PreviewWizardPage.java:355)
+ at
+org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage$2.selectionChanged(PreviewWizardPage.java:346)
+ at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:163)
+ at
+org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:616)
+ at org.eclipse.core.runtime.Platform.run(Platform.java:747)
+ at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:161)
+ at
+org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:1613)
+ at
+org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1304)
+ at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:380)
+ at
+org.eclipse.ltk.internal.ui.refactoring.PreviewWizardPage.setVisible(PreviewWizardPage.java:283)
+ at org.eclipse.jface.wizard.WizardDialog.updateForPage(WizardDialog.java:1024)
+ at org.eclipse.jface.wizard.WizardDialog.access$2(WizardDialog.java:1007)
+ at org.eclipse.jface.wizard.WizardDialog$4.run(WizardDialog.java:997)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
+ at org.eclipse.jface.wizard.WizardDialog.showPage(WizardDialog.java:995)
+ at org.eclipse.jface.wizard.WizardDialog.nextPressed(WizardDialog.java:747)
+ at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:338)
+ at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:543)
+ at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:89)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:800)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2784)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2443)
+ at org.eclipse.jface.window.Window.runEventLoop(Window.java:706)
+ at org.eclipse.jface.window.Window.open(Window.java:684)
+ at
+org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation$1.run(RefactoringWizardOpenOperation.java:125)
+ at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
+ at
+org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation.run(RefactoringWizardOpenOperation.java:138)
+ at
+org.eclipse.jdt.internal.ui.refactoring.actions.RefactoringStarter.activate(RefactoringStarter.java:40)
+ at org.eclipse.jdt.ui.actions.PullUpAction.startRefactoring(PullUpAction.java:209)
+ at org.eclipse.jdt.ui.actions.PullUpAction.run(PullUpAction.java:151)
+ at
+org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:216)
+ at
+org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:188)
+ at org.eclipse.jface.action.Action.runWithEvent(Action.java:988)
+ at
+org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:946)
+ at
+org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:896)
+ at
+org.eclipse.jface.action.ActionContributionItem$7.handleEvent(ActionContributionItem.java:810)
+ at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
+ at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:800)
+ at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2784)
+ at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2443)
+ at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1443)
+ at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1414)
+ at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:271)
+ at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:144)
+ at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:102)
+ at
+org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:335)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:273)
+ at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:129)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:85)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:58)
+ at
+sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:60)
+ at java.lang.reflect.Method.invoke(Method.java:391)
+ at org.eclipse.core.launcher.Main.basicRun(Main.java:185)
+ at org.eclipse.core.launcher.Main.run(Main.java:704)
+ at org.eclipse.core.launcher.Main.main(Main.java:688)</PRE><BR><I>-------
+Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76388#c1" name=c1>#1</A>
+From <A href="mailto:dirk_baeumer at ch.ibm.com">Dirk Baeumer</A> 2004-10-19 06:06
+------- </I><PRE>Silvio, any steps to reproduce or any additional entries in the log that
+contain exceptions from text edits ?</PRE><BR><I>------- Additional Comment <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76388#c2" name=c2>#2</A>
+From <A href="mailto:silvio_boehler at ca.ibm.com">Silvio Böhler</A> 2004-10-19
+08:57 ------- </I><PRE>No further entries and no reproducable steps unfortunately, sorry.</PRE>
+<HR>
+<!-- 1.0 at bugzilla.org --><B>Bug List:</B> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36310">First</A> <A
+href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=76101">Last</A> (This bug is
+not in your list) <A
+href="https://bugs.eclipse.org/bugs/buglist.cgi?regetlastlist=1">Show list</A>
+ <A
+href="https://bugs.eclipse.org/bugs/query.cgi">Query page</A>
+ <A
+href="https://bugs.eclipse.org/bugs/enter_bug.cgi">Enter new bug</A> <BR><!-- 1.0 at bugzilla.org -->
+<TABLE border=0>
+ <TBODY>
+ <TR>
+ <TD vAlign=top bgColor=#000000>
+ <TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=lightyellow
+ border=0>
+ <TBODY>
+ <TR>
+ <TD>This is <B>Bugzilla</B>: the Mozilla bug system. For more
+ information about what Bugzilla is and what it can do, see <A
+ href="http://www.bugzilla.org/">bugzilla.org</A>. <BR><!-- 1.0 at bugzilla.org -->
+ <FORM action=show_bug.cgi method=get>
+ <TABLE width="100%">
+ <TBODY>
+ <TR>
+ <TD>Actions: </TD>
+ <TD vAlign=center noWrap><A
+ href="https://bugs.eclipse.org/bugs/enter_bug.cgi">New</A> |
+ <A href="https://bugs.eclipse.org/bugs/query.cgi">Query</A> | <INPUT type=submit value=Find> bug # <INPUT size=6 name=id> |
+ <A
+ href="https://bugs.eclipse.org/bugs/reports.cgi">Reports</A>
+ </TD>
+ <TD> </TD>
+ <TD vAlign=center align=right><A
+ href="https://bugs.eclipse.org/bugs/createaccount.cgi">New Account</A>
+ | <A
+ href="https://bugs.eclipse.org/bugs/query.cgi?GoAheadAndLogIn=1">Log In</A>
+ </TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.classpath b/org.eclipse.mylyn.bugzilla.ui/.classpath
new file mode 100644
index 0000000..8dae743
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.classpath
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="**/TasksUiImages"/>
+ <accessrule kind="accessible" pattern="**/TaskListColorsAndFonts"/>
+ <accessrule kind="accessible" pattern="**/TaskListPreferenceConstants"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.cvsignore b/org.eclipse.mylyn.bugzilla.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.bugzilla.ui/.project b/org.eclipse.mylyn.bugzilla.ui/.project
new file mode 100644
index 0000000..78cc251
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.bugzilla.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/39/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/39/refactorings.history
new file mode 100644
index 0000000..a130366
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/39/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditorInput.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1159718905284" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1159727542290" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/39/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/39/refactorings.index
new file mode 100644
index 0000000..7f60596
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/39/refactorings.index
@@ -0,0 +1,2 @@
+1159718905284 Move compilation unit
+1159727542290 Copy compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/41/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/41/refactorings.history
new file mode 100644
index 0000000..5142a3e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/41/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui.editor' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui.editor' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugzillaTaskEditor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.trac.ui.editor" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugzillaTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugzillaTaskEditor.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1160698002390" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/41/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/41/refactorings.index
new file mode 100644
index 0000000..12eed84
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/41/refactorings.index
@@ -0,0 +1 @@
+1160698002390 Copy compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..61ed665
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.wizard.BugzillaProductPage.OPTION_ALL' from expression '"All"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'OPTION_ALL' - Constant expression: '"All"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'OPTION_ALL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{BugzillaProductPage.java" name="OPTION_ALL" qualify="false" replace="true" selection="17502 5" stamp="1161021150781" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..613f374
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1 @@
+1161021150781 Extract constant 'OPTION_ALL'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/43/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/43/refactorings.history
new file mode 100644
index 0000000..a0342df
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/43/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugzillaTaskEditor.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugzillaTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/ui/editor/NewBugzillaTaskEditor.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1161666444718" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugzillaTaskEditor.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugzillaTaskEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161667099812" subPackages="false" version="1.0"/>
+
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditor.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/ui/tasklist/BugzillaTaskEditor.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1161667803078" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditor.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161667857484" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor' to 'BugzillaTaskEditor' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ExistingBugEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor" matchStrategy="1" name="BugzillaTaskEditor" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161667982312" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor' to 'NewBugzillaTaskEditor' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugzillaTaskEditor' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'NewBugEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java[NewBugEditor" matchStrategy="1" name="NewBugzillaTaskEditor" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161668043031" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/43/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/43/refactorings.index
new file mode 100644
index 0000000..4d4000b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/10/43/refactorings.index
@@ -0,0 +1,6 @@
+1161666444718 Copy compilation unit
+1161667099812 Delete element
+1161667803078 Copy compilation unit
+1161667857484 Delete element
+1161667982312 Rename type 'ExistingBugEditor'
+1161668043031 Rename type 'NewBugEditor'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/45/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/45/refactorings.history
new file mode 100644
index 0000000..1badb54
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/45/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportEditorFactory' to 'BugzillaTaskEditorFactory' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportEditorFactory' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditorFactory' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaReportEditorFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaReportEditorFactory.java[BugzillaReportEditorFactory" matchStrategy="1" name="BugzillaTaskEditorFactory" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1162974872859" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_INFO' in 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditorFactory' to 'TITLE' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditorFactory.REPOSITORY_INFO' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskEditorFactory.TITLE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_INFO'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskEditorFactory.java[BugzillaTaskEditorFactory^REPOSITORY_INFO" name="TITLE" references="true" setter="false" stamp="1162974932968" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/45/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/45/refactorings.index
new file mode 100644
index 0000000..8854e26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/45/refactorings.index
@@ -0,0 +1,2 @@
+1162974872859 Rename type 'BugzillaReportEditorFactory'
+1162974932968 Rename field 'REPOSITORY_INFO'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..f94d243
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="0" comment="Pull up 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.submitToRepository()' from 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor' to 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.submitToRepository()' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Use super type where possible" delete="1" description="Pull up 'submitToRepository' to 'AbstractRepositoryTaskEditor'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugzillaTaskEditor.java[BugzillaTaskEditor~submitToRepository" element2="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugzillaTaskEditor.java[BugzillaTaskEditor~submitToRepository" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor" instanceof="false" pull="1" replace="true" stamp="1164562529390" stubs="true" version="1.0"/>
+<refactoring abstract="0" comment="Pull up 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.connector' from 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor' to 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.connector' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Use super type where possible" delete="0" description="Pull up 'connector' to 'AbstractRepositoryTaskEditor'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugzillaTaskEditor.java[BugzillaTaskEditor^connector" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor" instanceof="false" pull="1" replace="true" stamp="1164562769734" stubs="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugSubmissionHandler.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugSubmissionHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/ui/editor/BugSubmissionHandler.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1164571534703" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugSubmissionHandler.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugSubmissionHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1164571545750" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..a96d16d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1,4 @@
+1164562529390 Pull up 'submitToRepository' to 'AbstractRepositoryTaskEditor'
+1164562769734 Pull up 'connector' to 'AbstractRepositoryTaskEditor'
+1164571534703 Copy compilation unit
+1164571545750 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..d4acde4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'model' in 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard' to 'taskData' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard.model' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard.taskData' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'model'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{NewBugzillaTaskWizard.java[NewBugzillaTaskWizard^model" name="taskData" references="true" setter="false" stamp="1165462898140" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..23b2ee0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1 @@
+1165462898140 Rename field 'model'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/6/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/6/refactorings.history
new file mode 100644
index 0000000..3da8a1b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/6/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.BUG_HIT' to 'QUERY_HIT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^BUG_HIT" name="QUERY_HIT" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540236838" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.REPORT_REPOSITORY' to 'TASK_REMOTE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^REPORT_REPOSITORY" name="TASK_REMOTE" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540291246" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.IMG_COMMENT' to 'BUG_COMMENT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^IMG_COMMENT" name="BUG_COMMENT" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540337353" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUG' to 'TASK_REPOSITORY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^TASK_BUG" name="TASK_REPOSITORY" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540398601" textual="false"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.bugzilla.ui/icons/etool16/report-repository.gif' to 'task-remote.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.bugzilla.ui/icons/etool16/report-repository.gif" name="task-remote.gif" project="org.eclipse.mylar.bugzilla.ui" stamp="1139540419561"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.CATEGORY_QUERY' to 'QUERY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^CATEGORY_QUERY" name="QUERY" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540614722" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.CATEGORY_QUERY_NEW' to 'QUERY_NEW'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^CATEGORY_QUERY_NEW" name="QUERY_NEW" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540638856" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUGZILLA_INCOMMING' to 'TASK_REPOSITORY_INCOMMING'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^TASK_BUGZILLA_INCOMMING" name="TASK_REPOSITORY_INCOMMING" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540717209" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUGZILLA_CONFLICT' to 'TASK_REPOSITORY_CONFLICT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^TASK_BUGZILLA_CONFLICT" name="TASK_REPOSITORY_CONFLICT" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540731139" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUGZILLA_OUTGOING' to 'TASK_REPOSITORY_OUTGOING'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java[BugzillaImages^TASK_BUGZILLA_OUTGOING" name="TASK_REPOSITORY_OUTGOING" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1139540747062" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/6/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/6/refactorings.index
new file mode 100644
index 0000000..1db28fd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/6/refactorings.index
@@ -0,0 +1,10 @@
+1139540236838 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.BUG_HIT' to 'QUERY_HIT'
+1139540291246 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.REPORT_REPOSITORY' to 'TASK_REMOTE'
+1139540337353 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.IMG_COMMENT' to 'BUG_COMMENT'
+1139540398601 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUG' to 'TASK_REPOSITORY'
+1139540419561 Rename resource '/org.eclipse.mylar.bugzilla.ui/icons/etool16/report-repository.gif' to 'task-remote.gif'
+1139540614722 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.CATEGORY_QUERY' to 'QUERY'
+1139540638856 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.CATEGORY_QUERY_NEW' to 'QUERY_NEW'
+1139540717209 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUGZILLA_INCOMMING' to 'TASK_REPOSITORY_INCOMMING'
+1139540731139 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUGZILLA_CONFLICT' to 'TASK_REPOSITORY_CONFLICT'
+1139540747062 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.TASK_BUGZILLA_OUTGOING' to 'TASK_REPOSITORY_OUTGOING'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/7/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/7/refactorings.history
new file mode 100644
index 0000000..01c8e18
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/7/refactorings.history
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.bugzilla.ui/icons/eview16]' to 'eview16'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.bugzilla.ui/icons/eview16]" name="eview16" project="org.eclipse.mylar.bugzilla.ui" stamp="1139955674016"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_SEVERITY to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_SEVERITY" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034781046"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_OS to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_OS" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034793124"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_MILESTONE to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_MILESTONE" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034807895"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_PLATFORM to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_PLATFORM" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034818450"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_VERSION to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_VERSION" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034829436"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_COMPONENT to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_COMPONENT" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034838118"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_PRIORITY to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_PRIORITY" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034848654"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_URL to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^ATTRIBUTE_URL" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034858618"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.KEY_MILESTONE to {1}" element1="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage^KEY_MILESTONE" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.bugzilla.core/src<org.eclipse.mylar.bugzilla.core{BugReport.java[BugReport" project="org.eclipse.mylar.bugzilla.ui" stamp="1140034872197"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.model' to 'bugzillaOutlineNode'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.editor{AbstractBugEditor.java[AbstractBugEditor^model" name="bugzillaOutlineNode" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1140066991322" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.bugzillaOutlineNode' to 'bugzillaOutlineModel'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.editor{AbstractBugEditor.java[AbstractBugEditor^bugzillaOutlineNode" name="bugzillaOutlineModel" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1140067014366" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.getModel()' to 'getOutlineModel'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.editor{AbstractBugEditor.java[AbstractBugEditor~getModel" name="getOutlineModel" project="org.eclipse.mylar.bugzilla.ui" references="true" stamp="1140067346513"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/7/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/7/refactorings.index
new file mode 100644
index 0000000..9c75a3a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/7/refactorings.index
@@ -0,0 +1,13 @@
+1139955674016 Rename resource '/org.eclipse.mylar.bugzilla.ui/icons/eview16]' to 'eview16'
+1140034781046 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_SEVERITY to {1}
+1140034793124 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_OS to {1}
+1140034807895 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_MILESTONE to {1}
+1140034818450 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_PLATFORM to {1}
+1140034829436 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_VERSION to {1}
+1140034838118 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_COMPONENT to {1}
+1140034848654 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_PRIORITY to {1}
+1140034858618 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.ATTRIBUTE_URL to {1}
+1140034872197 Move org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage.KEY_MILESTONE to {1}
+1140066991322 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.model' to 'bugzillaOutlineNode'
+1140067014366 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.bugzillaOutlineNode' to 'bugzillaOutlineModel'
+1140067346513 Rename method 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.getModel()' to 'getOutlineModel'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..5046497
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.validateServer()' to 'validateSettings'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java[BugzillaRepositorySettingsPage~validateServer" name="validateSettings" project="org.eclipse.mylar.bugzilla.ui" references="true" stamp="1140467802970"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryClient' to 'BugzillaRepositoryConnector'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryClient.java[BugzillaRepositoryClient" matchStrategy="1" name="BugzillaRepositoryConnector" project="org.eclipse.mylar.bugzilla.ui" qualified="false" references="true" similarDeclarations="false" stamp="1140626236549" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..416c2fb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1,2 @@
+1140467802970 Rename method 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.validateServer()' to 'validateSettings'
+1140626236549 Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryClient' to 'BugzillaRepositoryConnector'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/11/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/11/refactorings.history
new file mode 100644
index 0000000..bc8f0b7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/11/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage' to 'AbstractBugzillaWizardPage'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractWizardDataPage.java[AbstractWizardDataPage" matchStrategy="1" name="AbstractBugzillaWizardPage" project="org.eclipse.mylar.bugzilla.ui" qualified="false" references="true" similarDeclarations="true" stamp="1142292958622" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.bugzilla.ui.wizard.BugzillaProductPage.TITLE' to 'TITLE_NEW_BUG'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{BugzillaProductPage.java[BugzillaProductPage^TITLE" name="TITLE_NEW_BUG" project="org.eclipse.mylar.bugzilla.ui" references="true" setter="false" stamp="1142293187141" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.wizard.WizardAttributesPage.DESCRIPTION' from expression '"Enter Bugzilla report details"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{WizardAttributesPage.java" name="DESCRIPTION" project="org.eclipse.mylar.bugzilla.ui" qualify="false" replace="true" selection="1106 31" stamp="1142293403341" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/11/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/11/refactorings.index
new file mode 100644
index 0000000..cac8364
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/11/refactorings.index
@@ -0,0 +1,3 @@
+1142292958622 Rename type 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractWizardDataPage' to 'AbstractBugzillaWizardPage'
+1142293187141 Rename field 'org.eclipse.mylar.internal.bugzilla.ui.wizard.BugzillaProductPage.TITLE' to 'TITLE_NEW_BUG'
+1142293403341 Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.wizard.WizardAttributesPage.DESCRIPTION' from expression '"Enter Bugzilla report details"'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/13/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/13/refactorings.history
new file mode 100644
index 0000000..fc74700
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/13/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.ATTR_SUMMARY' from expression '"Summary"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/bugzilla/ui/editor/ExistingBugEditor.java" name="ATTR_SUMMARY" qualify="false" replace="true" selection="34667 9" stamp="1143846908155" version="1.0" visibility="2"/>
+<refactoring description="Convert anonymous class 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.addHyperlinks().new HyperlinkAdapter() {...}' in 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.addHyperlinks()' to nested class" final="true" flags="2" id="org.eclipse.jdt.ui.convert.anonymous" input="unit://src/org/eclipse/mylar/internal/bugzilla/ui/editor/AbstractBugEditor.java" name="JavaStackTraceHyperlinkAdapter" selection="54854 0" stamp="1143847679764" static="false" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/13/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/13/refactorings.index
new file mode 100644
index 0000000..508ebea
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/13/refactorings.index
@@ -0,0 +1,2 @@
+1143846908155 Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.ATTR_SUMMARY' from expression '"Summary"'
+1143847679764 Convert anonymous class 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.addHyperlinks().new HyperlinkAdapter() {...}' in 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.addHyperlinks()' to nested class
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..474a599
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.SynchronizeBugzillaQueryJob' to 'SynchronizeQueryJob'" flags="65538" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector[SynchronizeBugzillaQueryJob" matchStrategy="1" name="SynchronizeQueryJob" project="org.eclipse.mylar.bugzilla.ui" qualified="false" references="true" similarDeclarations="false" stamp="1141261237917" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.SynchronizeBugzillaTaskJob' to 'SynchronizeTaskJob'" flags="65538" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector[SynchronizeBugzillaTaskJob" matchStrategy="1" name="SynchronizeTaskJob" project="org.eclipse.mylar.bugzilla.ui" qualified="false" references="true" similarDeclarations="false" stamp="1141261247020" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask.isBugDownloaded()' to 'isDownloaded'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.bugzilla.ui/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTask.java[BugzillaTask~isBugDownloaded" name="isDownloaded" project="org.eclipse.mylar.bugzilla.ui" references="true" stamp="1141272919794"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..607e7c8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1,3 @@
+1141261237917 Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.SynchronizeBugzillaQueryJob' to 'SynchronizeQueryJob'
+1141261247020 Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.SynchronizeBugzillaTaskJob' to 'SynchronizeTaskJob'
+1141272919794 Rename method 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask.isBugDownloaded()' to 'isDownloaded'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/13/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/13/refactorings.history
new file mode 100644
index 0000000..08d983f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.HYPERLINK_TYPE_JAVA' from expression '"java"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/bugzilla/ui/editor/AbstractBugEditor.java" name="HYPERLINK_TYPE_JAVA" qualify="false" replace="true" selection="54460 6" stamp="1143849816096" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/13/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/13/refactorings.index
new file mode 100644
index 0000000..8d588ad
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/13/refactorings.index
@@ -0,0 +1 @@
+1143849816096 Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.AbstractBugEditor.HYPERLINK_TYPE_JAVA' from expression '"java"'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..e4e1c87
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaReportWizard.TITLE' from expression '"New Bugzilla Task"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/bugzilla/ui/wizard/NewBugzillaReportWizard.java" name="TITLE" qualify="false" replace="true" selection="1911 19" stamp="1144337386181" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..c94d954
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1 @@
+1144337386181 Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaReportWizard.TITLE' from expression '"New Bugzilla Task"'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/19/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/19/refactorings.history
new file mode 100644
index 0000000..a0a3622
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/19/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.MESSAGE_FAILURE_UNKNOWN' from expression '"Unknown error occured. Check that server url and credentials are valid."' - Constant name: 'MESSAGE_FAILURE_UNKNOWN' - Constant expression: '"Unknown error occured. Check that server url and credentials are valid."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MESSAGE_FAILURE_UNKNOWN'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="MESSAGE_FAILURE_UNKNOWN" qualify="false" replace="true" selection="6501 73" stamp="1147374129178" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUITools' to 'BugzillaHyperlinkUtil' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUITools' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaHyperlinkUtil' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'BugzillaUITools'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaUITools.java[BugzillaUITools" matchStrategy="1" name="BugzillaHyperlinkUtil" qualified="false" references="true" similarDeclarations="true" stamp="1147394818372" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportNode' to 'BugzillaReportElement' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportNode' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaReportElement' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'BugzillaReportNode'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaReportNode.java[BugzillaReportNode" matchStrategy="1" name="BugzillaReportElement" qualified="false" references="true" similarDeclarations="true" stamp="1147395124272" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.PLUGIN_ID' from expression '"org.eclipse.mylar.internal.bugzilla.ui"' - Constant name: 'PLUGIN_ID' - Constant expression: '"org.eclipse.mylar.internal.bugzilla.ui"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'PLUGIN_ID'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaUiPlugin.java" name="PLUGIN_ID" qualify="false" replace="true" selection="7608 40" stamp="1147472335220" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchHit.getRepository()' to 'getRepositoryUrl' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchHit.getRepository()' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchHit.getRepositoryUrl()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchHit.java[BugzillaSearchHit~getRepository" name="getRepositoryUrl" references="true" stamp="1147474500613" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/19/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/19/refactorings.index
new file mode 100644
index 0000000..2c32bb3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/19/refactorings.index
@@ -0,0 +1,5 @@
+1147374129178 Extract constant 'MESSAGE_FAILURE_UNKNOWN'
+1147474500613 Rename method 'getRepository'
+1147472335220 Extract constant 'PLUGIN_ID'
+1147395124272 Rename type 'BugzillaReportNode'
+1147394818372 Rename type 'BugzillaUITools'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..acc416e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractBugWizard' to 'AbstractBugzillaReportWizard' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractBugWizard' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractBugzillaReportWizard' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'AbstractBugWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractBugWizard.java[AbstractBugWizard" matchStrategy="1" name="AbstractBugzillaReportWizard" qualified="false" references="true" similarDeclarations="true" stamp="1147900993896" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.getOfflineReportsFile()' to 'getOfflineReportsFilePath' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.getOfflineReportsFile()' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.getOfflineReportsFilePath()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getOfflineReportsFile'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaUiPlugin.java[BugzillaUiPlugin~getOfflineReportsFile" name="getOfflineReportsFilePath" references="true" stamp="1147970969424" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.getOfflineReports()' to 'getOfflineReportsFile' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.getOfflineReports()' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaUiPlugin.getOfflineReportsFile()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getOfflineReports'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaUiPlugin.java[BugzillaUiPlugin~getOfflineReports" name="getOfflineReportsFile" references="true" stamp="1147970992447" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..d982022
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1,3 @@
+1147900993896 Rename type 'AbstractBugWizard'
+1147970992447 Rename method 'getOfflineReports'
+1147970969424 Rename method 'getOfflineReportsFile'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/22/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/22/refactorings.history
new file mode 100644
index 0000000..fd560ef
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.OfflineReportsFile' to 'OfflineReportManager' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.OfflineReportsFile' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.OfflineReportManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'OfflineReportsFile'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui{OfflineReportsFile.java[OfflineReportsFile" matchStrategy="1" name="OfflineReportManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149206577977" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'bug' in 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor' to 'taskData' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.bug' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.taskData' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'bug'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor^bug" name="taskData" references="true" setter="false" stamp="1149300275874" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/22/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/22/refactorings.index
new file mode 100644
index 0000000..a996d8a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/22/refactorings.index
@@ -0,0 +1,2 @@
+1149206577977 Rename type 'OfflineReportsFile'
+1149300275874 Rename field 'bug'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/23/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/23/refactorings.history
new file mode 100644
index 0000000..7dcf73d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/23/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'fname' in 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage' to 'filePath' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.fname' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.filePath' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fname'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{NewAttachmentPage.java[NewAttachmentPage^fname" name="filePath" references="true" setter="false" stamp="1149704056597" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'att' in 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.createControl(...).new ModifyListener() {...}.modifyText(...)' to 'attachment' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.createControl(...).new ModifyListener() {...}.modifyText(ModifyEvent).att' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.createControl(...).new ModifyListener() {...}.modifyText(ModifyEvent).attachment' - Update references to refactored element" description="Rename local variable 'att'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{NewAttachmentPage.java" name="attachment" references="true" selection="3609 3" stamp="1149703748946" version="1.0"/>
+<refactoring comment="Rename local variable 'addAttachmentComposite' in 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.createControl(...)' to 'parent' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.createControl(Composite).addAttachmentComposite' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewAttachmentPage.createControl(Composite).parent' - Update references to refactored element" description="Rename local variable 'addAttachmentComposite'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{NewAttachmentPage.java" name="parent" references="true" selection="1350 22" stamp="1149703495183" version="1.0"/>
+<refactoring abstract="0" comment="Pull up 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.removeReport(...)' from 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector' to 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.removeReport(...)' - Destination type: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' - Use super type where possible" delete="1" description="Pull up 'removeReport' to 'AbstractRepositoryConnector'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~removeReport~QRepositoryTaskData;" element2="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~removeReport~QRepositoryTaskData;" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector" instanceof="false" pull="1" replace="true" stamp="1149538081940" stubs="true" version="1.0"/>
+<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector' to 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' - Original elements: org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.offlineStatusChange(...) org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.saveOffline(...) - Destination type: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' - Use super type where possible" delete="2" description="Pull up members to 'AbstractRepositoryConnector'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~offlineStatusChange~QRepositoryTaskData;~QRepositoryTaskSyncState;" element2="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~saveOffline~QRepositoryTaskData;~Z" element3="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~offlineStatusChange~QRepositoryTaskData;~QRepositoryTaskSyncState;" element4="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~saveOffline~QRepositoryTaskData;~Z" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector" instanceof="false" pull="2" replace="true" stamp="1149537932221" stubs="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/23/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/23/refactorings.index
new file mode 100644
index 0000000..69ad4e9
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/23/refactorings.index
@@ -0,0 +1,5 @@
+1149704056597 Rename field 'fname'
+1149703748946 Rename local variable 'att'
+1149703495183 Rename local variable 'addAttachmentComposite'
+1149538081940 Pull up 'removeReport' to 'AbstractRepositoryConnector'
+1149537932221 Pull up members to 'AbstractRepositoryConnector'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..71155f8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.BUG_ID' from expression '"&bug_id="' - Constant name: 'BUG_ID' - Constant expression: '"&bug_id="' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'BUG_ID'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java" name="BUG_ID" qualify="false" replace="true" selection="15760 10" stamp="1150242097949" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'attributeCompleted' in 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractBugzillaReportWizard' to 'completed' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractBugzillaReportWizard.attributeCompleted' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.AbstractBugzillaReportWizard.completed' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'attributeCompleted'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{AbstractBugzillaReportWizard.java[AbstractBugzillaReportWizard^attributeCompleted" name="completed" references="true" setter="false" stamp="1150426279452" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..7df9428
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1150242097949 Extract constant 'BUG_ID'
+1150426279452 Rename field 'attributeCompleted'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..a9ad87b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.ATTR_DIRTY' from expression '"Dirty"' - Constant name: 'ATTR_DIRTY' - Constant expression: '"Dirty"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTR_DIRTY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java" name="ATTR_DIRTY" qualify="false" replace="true" selection="5877 7" stamp="1150727681714" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.ATTR_LAST_DATE' from expression '"LastDate"' - Constant name: 'ATTR_LAST_DATE' - Constant expression: '"LastDate"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTR_LAST_DATE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java" name="ATTR_LAST_DATE" qualify="false" replace="true" selection="5876 10" stamp="1150727695434" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'KEY_LAST_DATE' in 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer' to 'KEY_LAST_MOD_DATE' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.KEY_LAST_DATE' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.KEY_LAST_MOD_DATE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_LAST_DATE'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java[BugzillaTaskExternalizer^KEY_LAST_DATE" name="KEY_LAST_MOD_DATE" references="true" setter="false" stamp="1150732893640" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'creation_ts_date_format' in 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask' to 'comment_creation_ts_format' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask.creation_ts_date_format' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask.comment_creation_ts_format' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'creation_ts_date_format'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTask.java[BugzillaTask^creation_ts_date_format" name="comment_creation_ts_format" references="true" setter="false" stamp="1150736720390" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaOfflineTaskHandler.DATE_FORMAT_1' from expression '"yyyy-MM-dd HH:mm"' - Constant name: 'DATE_FORMAT_1' - Constant expression: '"yyyy-MM-dd HH:mm"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DATE_FORMAT_1'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaOfflineTaskHandler.java" name="DATE_FORMAT_1" qualify="false" replace="true" selection="2345 18" stamp="1150737292343" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaOfflineTaskHandler.DATE_FORMAT_2' from expression '"yyyy-MM-dd HH:mm:ss"' - Constant name: 'DATE_FORMAT_2' - Constant expression: '"yyyy-MM-dd HH:mm:ss"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DATE_FORMAT_2'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaOfflineTaskHandler.java" name="DATE_FORMAT_2" qualify="false" replace="true" selection="2294 21" stamp="1150737308468" version="1.0" visibility="2"/>
+<refactoring abstract="0" comment="Pull up 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.KEY_LAST_MOD_DATE' from 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer' to 'org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.KEY_LAST_MOD_DATE' - Destination type: 'org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer' - Use super type where possible" delete="0" description="Pull up 'KEY_LAST_MOD_DATE' to 'DelegatingTaskExternalizer'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java[BugzillaTaskExternalizer^KEY_LAST_MOD_DATE" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.provisional.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer" instanceof="false" pull="1" replace="true" stamp="1150938218389" stubs="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..5233d4f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,7 @@
+1150727681714 Extract constant 'ATTR_DIRTY'
+1150938218389 Pull up 'KEY_LAST_MOD_DATE' to 'DelegatingTaskExternalizer'
+1150737308468 Extract constant 'DATE_FORMAT_2'
+1150737292343 Extract constant 'DATE_FORMAT_1'
+1150736720390 Rename field 'creation_ts_date_format'
+1150732893640 Rename field 'KEY_LAST_DATE'
+1150727695434 Extract constant 'ATTR_LAST_DATE'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/26/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/26/refactorings.history
new file mode 100644
index 0000000..0a83780
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/26/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'fDialogSettings' in 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchPage.saveWidgetValues()' to 'settings' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchPage.saveWidgetValues().fDialogSettings' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchPage.saveWidgetValues().settings' - Update references to refactored element" description="Rename local variable 'fDialogSettings'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchPage.java" name="settings" references="true" selection="52688 15" stamp="1151428183880" version="1.0"/>
+<refactoring comment="Rename field 'STORE_EMAILADD_ID' in 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchPage' to 'STORE_EMAILADDRESS_ID' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchPage.STORE_EMAILADD_ID' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchPage.STORE_EMAILADDRESS_ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'STORE_EMAILADD_ID'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchPage.java[BugzillaSearchPage^STORE_EMAILADD_ID" name="STORE_EMAILADDRESS_ID" references="true" setter="false" stamp="1151534852229" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.TeeOutputStream' to 'TeeInputStream' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.TeeOutputStream' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.TeeInputStream' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TeeOutputStream'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui{TeeOutputStream.java[TeeOutputStream" matchStrategy="1" name="TeeInputStream" patterns="*.xml" qualified="false" references="true" similarDeclarations="false" stamp="1151699448968" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/26/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/26/refactorings.index
new file mode 100644
index 0000000..f962c25
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/6/26/refactorings.index
@@ -0,0 +1,3 @@
+1151428183880 Rename local variable 'fDialogSettings'
+1151699448968 Rename type 'TeeOutputStream'
+1151534852229 Rename field 'STORE_EMAILADD_ID'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..d4bef80
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.LABEL_TIME_TRACKING' from expression '"Bugzilla Time Tracking"' - Constant name: 'LABEL_TIME_TRACKING' - Constant expression: '"Bugzilla Time Tracking"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_TIME_TRACKING'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java" name="LABEL_TIME_TRACKING" qualify="false" replace="true" selection="16016 24" stamp="1152210893889" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.SUBMITTING_NEW_BUG' from expression '"Submitting new bug"' - Constant name: 'SUBMITTING_NEW_BUG' - Constant expression: '"Submitting new bug"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'SUBMITTING_NEW_BUG'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" name="SUBMITTING_NEW_BUG" qualify="false" replace="true" selection="8854 20" stamp="1152321329842" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..24e9401
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1,2 @@
+1152210893889 Extract constant 'LABEL_TIME_TRACKING'
+1152321329842 Extract constant 'SUBMITTING_NEW_BUG'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..e2743f2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaHyperlinkUtil.TASK_NUM_GROUP' from expression '3' - Constant name: 'TASK_NUM_GROUP' - Constant expression: '3' - Declared visibility: 'private'" description="Extract constant 'TASK_NUM_GROUP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaHyperlinkUtil.java" name="TASK_NUM_GROUP" qualify="false" replace="false" selection="1956 1" stamp="1152663306780" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.ERROR_CREATING_BUG_REPORT' from expression '"Error creating bug report"' - Constant name: 'ERROR_CREATING_BUG_REPORT' - Constant expression: '"Error creating bug report"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ERROR_CREATING_BUG_REPORT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" name="ERROR_CREATING_BUG_REPORT" qualify="false" replace="true" selection="8598 27" stamp="1152919763171" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..34c5183
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,2 @@
+1152663306780 Extract constant 'TASK_NUM_GROUP'
+1152919763171 Extract constant 'ERROR_CREATING_BUG_REPORT'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..537997a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'stackIdentifier' from expression '"Stack Trace:"' - Variable name: 'stackIdentifier' - Destination method: 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.getStackTraceFromDescription()' - Variable expression: '"Stack Trace:"' - Replace occurrences of expression with variable" description="Extract local variable 'stackIdentifier'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" name="stackIdentifier" replace="true" selection="8464 14" stamp="1154025692191" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.NO_STACK_MESSAGE' from expression '"Unable to locate a stack trace in the description text.\nDuplicate search currently only supports stack trace matching."' - Constant name: 'NO_STACK_MESSAGE' - Constant expression: '"Unable to locate a stack trace in the description text.\nDuplicate search currently only supports stack trace matching."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'NO_STACK_MESSAGE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" name="NO_STACK_MESSAGE" qualify="false" replace="true" selection="7580 0" stamp="1154026840382" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.LABEL_CREATE' from expression '"Create New"' - Constant name: 'LABEL_CREATE' - Constant expression: '"Create New"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_CREATE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" name="LABEL_CREATE" qualify="false" replace="true" selection="16965 12" stamp="1154108206812" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..660ffc1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1,3 @@
+1154025692191 Extract local variable 'stackIdentifier'
+1154108206812 Extract constant 'LABEL_CREATE'
+1154026840382 Extract constant 'NO_STACK_MESSAGE'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/32/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/32/refactorings.history
new file mode 100644
index 0000000..7f5066f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/32/refactorings.history
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.search.TaskSearchPage.TITLE_REPOSITORY_SEARCH' from expression '"Repository Search"' - Constant name: 'TITLE_REPOSITORY_SEARCH' - Constant expression: '"Repository Search"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TITLE_REPOSITORY_SEARCH'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{TaskSearchPage.java" name="TITLE_REPOSITORY_SEARCH" qualify="false" replace="true" selection="6357 19" stamp="1155247096037" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.search.TaskSearchPage' to 'RepositorySearchPage' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.TaskSearchPage' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.search.RepositorySearchPage' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'TaskSearchPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{TaskSearchPage.java[TaskSearchPage" matchStrategy="1" name="RepositorySearchPage" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155254770849" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.RepositorySearchPage.java' - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{RepositorySearchPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1155327217750" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaIdSearchSorter.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaIdSearchSorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155329762187" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaDescriptionSearchSorter.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaDescriptionSearchSorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155329946718" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaPrioritySearchSorter.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaPrioritySearchSorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155330432187" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultView.java' - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchResultView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1155330636843" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaTableContentProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaTableContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1155330721828" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaContentProvider.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155330763593" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResult.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchResult.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155331346187" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchQuery.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155331516500" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.actions.BugzillaSortAction.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.actions{BugzillaSortAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155331582296" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.actions.OpenBugsAction.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.actions{OpenBugsAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155331813203" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.IBugzillaSearchOperation.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{IBugzillaSearchOperation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155331896703" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui.actions'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.actions" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1155332625484" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/32/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/32/refactorings.index
new file mode 100644
index 0000000..37cc31c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/32/refactorings.index
@@ -0,0 +1,15 @@
+1155247096037 Extract constant 'TITLE_REPOSITORY_SEARCH'
+1155254770849 Rename type 'TaskSearchPage'
+1155327217750 Move compilation unit
+1155329762187 Move compilation unit
+1155329946718 Move compilation unit
+1155330432187 Move compilation unit
+1155330636843 Move compilation unit
+1155330721828 Move compilation unit
+1155330763593 Move compilation unit
+1155331346187 Move compilation unit
+1155331516500 Move compilation unit
+1155331582296 Move compilation unit
+1155331813203 Move compilation unit
+1155331896703 Move compilation unit
+1155332625484 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..1941a89
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor' to 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Original elements: org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.REASSIGN_BUG_TO org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.radios org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.radioOptions org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.attachContextButton org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.taskData org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.addRadioButtons(...) org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.addAttachContextButton(...) org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.addSelfToCC(...) - Destination type: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Use super type where possible" delete="4" description="Pull up members to 'AbstractRepositoryTaskEditor'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor^REASSIGN_BUG_TO" element10="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor~addRadioButtons~QComposite;" element11="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor~addSelfToCC~QComposite;" element12="/src<org.eclipse.mylar.internal.trac.ui.editor{TracTaskEditor.java[TracTaskEditor~addRadioButtons~QComposite;" element2="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor^radios" element3="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor^radioOptions" element4="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor^attachContextButton" element5="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor^taskData" element6="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor~addRadioButtons~QComposite;" element7="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor~addAttachContextButton~QComposite;~QITask;" element8="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor~addSelfToCC~QComposite;" element9="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java[ExistingBugEditor~addAttachContextButton~QComposite;~QITask;" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor" instanceof="false" pull="8" replace="true" stamp="1156377154117" stubs="true" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.getSearchPage(...)' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java[BugzillaRepositoryUi" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~getSearchPage~QTaskRepository;~QIStructuredSelection;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156484364578" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.openEditQueryDialog(...)' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java[BugzillaRepositoryUi" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~openEditQueryDialog~QAbstractRepositoryQuery;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156484375187" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.getNewTaskWizard(...)' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java[BugzillaRepositoryUi" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~getNewTaskWizard~QTaskRepository;~QIStructuredSelection;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156484393968" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' to 'BugzillaRepositoryConnectorUi' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnectorUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java[BugzillaRepositoryUi" matchStrategy="1" name="BugzillaRepositoryConnectorUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156484692656" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnectorUi' to 'BugzillaConnectorUi' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnectorUi' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaConnectorUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaRepositoryConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnectorUi.java[BugzillaRepositoryConnectorUi" matchStrategy="1" name="BugzillaConnectorUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156490202609" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaConnectorUi' to 'BugzillaRepositoryUi' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaConnectorUi' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaConnectorUi.java[BugzillaConnectorUi" matchStrategy="1" name="BugzillaRepositoryUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156521160796" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..be5323f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1,7 @@
+1156377154117 Pull up members to 'AbstractRepositoryTaskEditor'
+1156484364578 Move method
+1156484375187 Move method
+1156484393968 Move method
+1156484692656 Rename type 'BugzillaRepositoryUi'
+1156490202609 Rename type 'BugzillaRepositoryConnectorUi'
+1156521160796 Rename type 'BugzillaConnectorUi'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/35/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/35/refactorings.history
new file mode 100644
index 0000000..c89181c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/35/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.LABEL_AUTOMATIC_VERSION' from expression '"Automatic (Use Validate Settings)"' - Constant name: 'LABEL_AUTOMATIC_VERSION' - Constant expression: '"Automatic (Use Validate Settings)"' - Declared visibility: 'public' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_AUTOMATIC_VERSION'" flags="786434" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="LABEL_AUTOMATIC_VERSION" qualify="false" replace="true" selection="3668 35" stamp="1156815061718" version="1.0" visibility="1"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylar.internal.bugzilla.ui.search.IOperationContainer' from 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultCollector' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultCollector' - Extracted interface: 'org.eclipse.mylar.internal.bugzilla.ui.search.IOperationContainer' - Extracted members: org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultCollector.getOperation() org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultCollector.setOperation(...) - Use super type where possible" comments="true" description="Extract interface 'IOperationContainer'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchResultCollector.java[BugzillaSearchResultCollector~getOperation" element2="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchResultCollector.java[BugzillaSearchResultCollector~setOperation~QIBugzillaSearchOperation;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchResultCollector.java[BugzillaSearchResultCollector" instanceof="false" name="IOperationContainer" public="true" replace="true" stamp="1156904717609" version="1.0"/>
+
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/35/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/35/refactorings.index
new file mode 100644
index 0000000..ea5d725
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/8/35/refactorings.index
@@ -0,0 +1,2 @@
+1156815061718 Extract constant 'LABEL_AUTOMATIC_VERSION'
+1156904717609 Extract interface 'IOperationContainer'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/36/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/36/refactorings.history
new file mode 100644
index 0000000..eedcce0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/36/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryConnector.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.core" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1157658622796" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaOfflineTaskHandler.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.core" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaOfflineTaskHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1157658801156" units="1" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.search.BugzillaSearchResultCollector.QUERYING_REPOSITORY' from expression '"Querying Repository..."' - Constant name: 'QUERYING_REPOSITORY' - Constant expression: '"Querying Repository..."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'QUERYING_REPOSITORY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.search{BugzillaSearchResultCollector.java" name="QUERYING_REPOSITORY" qualify="false" replace="true" selection="3653 24" stamp="1157762652609" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/36/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/36/refactorings.index
new file mode 100644
index 0000000..0287198
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/36/refactorings.index
@@ -0,0 +1,3 @@
+1157658622796 Move compilation unit
+1157762652609 Extract constant 'QUERYING_REPOSITORY'
+1157658801156 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..3e86840
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaReportWizard' to 'NewBugzillaTaskWizard' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaReportWizard' - Renamed element: 'org.eclipse.mylar.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'NewBugzillaReportWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugzilla.ui.wizard{NewBugzillaReportWizard.java[NewBugzillaReportWizard" matchStrategy="1" name="NewBugzillaTaskWizard" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1158708094256" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.NewBugEditor.DEFAULT_ESTIMATED_TIME' from expression '1' - Constant name: 'DEFAULT_ESTIMATED_TIME' - Constant expression: '1' - Declared visibility: 'private'" description="Extract constant 'DEFAULT_ESTIMATED_TIME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{NewBugEditor.java" name="DEFAULT_ESTIMATED_TIME" qualify="false" replace="false" selection="9673 1" stamp="1158856710100" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..07cbf7b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1,2 @@
+1158708094256 Rename type 'NewBugzillaReportWizard'
+1158856710100 Extract constant 'DEFAULT_ESTIMATED_TIME'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/39/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/39/refactorings.history
new file mode 100644
index 0000000..5348cf6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.editor.ExistingBugEditor.SECTION_TITLE_PEOPLE' from expression '"People"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'SECTION_TITLE_PEOPLE' - Constant expression: '"People"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'SECTION_TITLE_PEOPLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{ExistingBugEditor.java" name="SECTION_TITLE_PEOPLE" qualify="false" replace="true" selection="10112 8" stamp="1159466266950" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/39/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/39/refactorings.index
new file mode 100644
index 0000000..5fbf4f7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2006/9/39/refactorings.index
@@ -0,0 +1 @@
+1159466266950 Extract constant 'SECTION_TITLE_PEOPLE'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/2/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/2/refactorings.history
new file mode 100644
index 0000000..5036ab0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/2/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void displayError(final String serverUrl,InvocationTargetException e)' from 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.validateSettings()' to 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Method name: 'displayError' - Destination type: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage' - Declared visibility: 'private'" comments="false" description="Extract method 'displayError'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="displayError" replace="false" selection="9320 868" stamp="1168565733609" version="1.0" visibility="2"/>
+
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/2/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/2/refactorings.index
new file mode 100644
index 0000000..4a3636e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/2/refactorings.index
@@ -0,0 +1 @@
+1168565733609 Extract method 'displayError'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..e2f5253
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void addButtonField(Composite rolesComposite,RepositoryTaskAttribute attribute)' from 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.addRoles()' to 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Method name: 'addButtonField' - Destination type: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'addButtonField'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugzillaTaskEditor.java" name="addButtonField" replace="false" selection="18419 695" stamp="1168989579609" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..53f3e5b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1 @@
+1168989579609 Extract method 'addButtonField'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..8666839
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'doc'" description="Delete element" element1="doc" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169487209437" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'bugzilla-help.xml'" description="Delete element" element1="bugzilla-help.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169487215343" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..af3ec75
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1,2 @@
+1169487209437 Delete element
+1169487215343 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/11/47/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/11/47/refactorings.history
new file mode 100644
index 0000000..bcd26ad
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/11/47/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.actions.NewBugzillaSubTaskAction.NewBugzillaSubTaskAction()'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.actions{NewBugzillaSubTaskAction.java[NewBugzillaSubTaskAction~NewBugzillaSubTaskAction" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1195682111742" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.actions.NewBugzillaSubTaskAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.actions{NewBugzillaSubTaskAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1195682118646" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/11/47/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/11/47/refactorings.index
new file mode 100644
index 0000000..5940543
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/11/47/refactorings.index
@@ -0,0 +1,2 @@
+1195682111742 Delete element
+1195682118646 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..e9ca4ac
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.TAG_BUGZILLA' from expression '"Bugzilla"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'TAG_BUGZILLA' - Constant expression: '"Bugzilla"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TAG_BUGZILLA'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java" name="TAG_BUGZILLA" qualify="false" replace="true" selection="1578 10" stamp="1171408287007" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaTaskHyperlinkDetector.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.ui" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaTaskHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaTaskHyperlinkDetector.java	true	true	JavaTaskHyperlinkDetector.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1171563240687" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.JavaTaskHyperlinkDetector.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{JavaTaskHyperlinkDetector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1171565427359" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.BUGZILLA_SHORT_LOGIN' from expression '"bugzilla.shortLoginEnabled"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'BUGZILLA_SHORT_LOGIN' - Constant expression: '"bugzilla.shortLoginEnabled"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'BUGZILLA_SHORT_LOGIN'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="BUGZILLA_SHORT_LOGIN" qualify="false" replace="true" selection="6302 28" stamp="1171652020500" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.LABEL_SHORT_LOGINS' from expression '"Short logins enabled on repository:"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'LABEL_SHORT_LOGINS' - Constant expression: '"Short logins enabled on repository:"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_SHORT_LOGINS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="LABEL_SHORT_LOGINS" qualify="false" replace="true" selection="5166 37" stamp="1171657329875" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..20c963f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1,5 @@
+1171408287007 Extract constant 'TAG_BUGZILLA'
+1171563240687 Copy compilation unit
+1171565427359 Delete element
+1171652020500 Extract constant 'BUGZILLA_SHORT_LOGIN'
+1171657329875 Extract constant 'LABEL_SHORT_LOGINS'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..ce2aec8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi.BUGZILL_TASK_KIND' from expression '"Bug"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'BUGZILL_TASK_KIND' - Constant expression: '"Bug"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'BUGZILL_TASK_KIND'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java" name="BUGZILL_TASK_KIND" qualify="false" replace="true" selection="1648 5" stamp="1172003537125" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi.BUGZILL_TASK_KIND' to 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi.BUGZILL_TASK_KIND' - Destination type: 'org.eclipse.mylar.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="false" description="Move member 'BUGZILL_TASK_KIND'" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java[BugzillaRepositoryUi^BUGZILL_TASK_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1172003559515" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..b31a873
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,2 @@
+1172003537125 Extract constant 'BUGZILL_TASK_KIND'
+1172003559515 Move member 'BUGZILL_TASK_KIND'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/10/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/10/refactorings.history
new file mode 100644
index 0000000..00ccad5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/10/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaTaskHyperlinkDetector.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaTaskHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaTaskHyperlinkDetector.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1173413418828" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaHyperlinkUtil.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaHyperlinkUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1173470410984" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/10/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/10/refactorings.index
new file mode 100644
index 0000000..cfa34b5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/10/refactorings.index
@@ -0,0 +1,2 @@
+1173413418828 Copy compilation unit
+1173470410984 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/11/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/11/refactorings.history
new file mode 100644
index 0000000..e8bb65a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/11/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaHyperLink.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaHyperLink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/ui/BugzillaHyperLink.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1173739858937" target="/org.eclipse.mylar/developer/src-old/bugzilla" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaHyperLink.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaHyperLink.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1173739869671" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaTaskHyperlinkDetector.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaTaskHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/ui/BugzillaTaskHyperlinkDetector.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1173748980562" target="/org.eclipse.mylar/developer/src-old/bugzilla" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaTaskHyperlinkDetector.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaTaskHyperlinkDetector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1173748991328" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/11/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/11/refactorings.index
new file mode 100644
index 0000000..85ae878
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/11/refactorings.index
@@ -0,0 +1,4 @@
+1173739858937 Copy compilation unit
+1173739869671 Delete element
+1173748980562 Copy compilation unit
+1173748991328 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..2d8a73c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaResultMatchAdapter.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaResultMatchAdapter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/bugzilla/ui/BugzillaResultMatchAdapter.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1175098929953" target="/org.eclipse.mylar/developer/src-old/bugzilla" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaResultMatchAdapter.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaResultMatchAdapter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1175098966828" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..92e9c72
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1,2 @@
+1175098929953 Copy compilation unit
+1175098966828 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/4/16/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/4/16/refactorings.history
new file mode 100644
index 0000000..99c1f02
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer.KEY_SEVERITY' from expression '"Severity"' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Constant name: 'KEY_SEVERITY' - Constant expression: '"Severity"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'KEY_SEVERITY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java" name="KEY_SEVERITY" qualify="false" replace="true" selection="3323 10" stamp="1176914356171" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/4/16/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/4/16/refactorings.index
new file mode 100644
index 0000000..5541ed6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/4/16/refactorings.index
@@ -0,0 +1 @@
+1176914356171 Extract constant 'KEY_SEVERITY'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/18/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/18/refactorings.history
new file mode 100644
index 0000000..a17b07e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/18/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTaskDecorator.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTaskDecorator.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1177986970964" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'eview16' - Original element: 'overlay-major.gif'" description="Copy file" element1="icons/eview16/overlay-major.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/overlay-major.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1177987726090" target="/org.eclipse.mylar.jira.ui/icons/eview16" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'etool16' - Original element: 'bug.gif'" description="Copy file" element1="icons/elcl16/bug.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/elcl16/bug.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1178232662054" target="/org.eclipse.mylar.tasks.ui/icons/etool16" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/18/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/18/refactorings.index
new file mode 100644
index 0000000..ae95282
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/18/refactorings.index
@@ -0,0 +1,3 @@
+1177986970964 Delete element
+1177987726090 Copy file
+1178232662054 Copy file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..30baa15
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Convert member type 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.EmailContentProposalProvider' in 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor' to top level type - Original project: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.BugzillaTaskEditor.EmailContentProposalProvider' - Field name: 'bugzillaTaskEditor' - Parameter name: 'bugzillaTaskEditor' - Declare field 'final'" description="Convert member type 'EmailContentProposalProvider' to top level" field="true" fieldName="bugzillaTaskEditor" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{BugzillaTaskEditor.java[BugzillaTaskEditor[EmailContentProposalProvider" mandatory="true" parameterName="bugzillaTaskEditor" possible="true" stamp="1178906465375" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.editor.EmailContentProposalProvider.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui" element1="/src<org.eclipse.mylar.internal.bugzilla.ui.editor{EmailContentProposalProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1178906651171" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..01e8eaf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1,2 @@
+1178906465375 Convert member type 'EmailContentProposalProvider' to top level
+1178906651171 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/20/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/20/refactorings.history
new file mode 100644
index 0000000..c8ba6f3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui' - Original project: 'org.eclipse.mylar.bugzilla.ui' - Destination element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui' - Original element: 'org.eclipse.mylar.internal.bugzilla.ui.BugzillaImages.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.trac.ui" element1="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.bugzilla.ui{BugzillaImages.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1179450213425" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/20/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/20/refactorings.index
new file mode 100644
index 0000000..0c7b441
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/5/20/refactorings.index
@@ -0,0 +1 @@
+1179450213425 Copy compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..03a05cc
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.ide/src/org.eclipse.mylyn.internal.bugzilla.ide' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Destination element: 'org.eclipse.mylyn.bugzilla.ide/src/org.eclipse.mylyn.internal.bugzilla.ide' - Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.StackTraceDuplicateDetector.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.bugzilla.ide" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{StackTraceDuplicateDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181623414235" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..5f9a4c6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181623414235 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..5575833
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer' to 'BugzillaTaskListFactory' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskExternalizer' - Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaTaskExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskExternalizer.java[BugzillaTaskExternalizer" matchStrategy="1" name="BugzillaTaskListFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182400176744" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' to 'BugzillaConnectorUi' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositoryUi' - Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaConnectorUi' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositoryUi.java[BugzillaRepositoryUi" matchStrategy="1" name="BugzillaConnectorUi" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182561704973" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..726ef9a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1182400176744 Rename type 'BugzillaTaskExternalizer'
+1182561704973 Rename type 'BugzillaRepositoryUi'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..d4fee04
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.OfflineView.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui{OfflineView.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1184020069235" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Original element: 'BugzillaTaskEditor.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditor.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1184175439156" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.LABEL_CACHED_CONFIGURATION' from expression '"Cached Repository Configuration"' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Constant name: 'LABEL_CACHED_CONFIGURATION' - Constant expression: '"Cached Repository Configuration"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_CACHED_CONFIGURATION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="LABEL_CACHED_CONFIGURATION" qualify="false" replace="true" selection="5377 33" stamp="1184346453359" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.TIMESTAMP_NOT_AVAILABLE' from expression '"n/a"' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Constant name: 'TIMESTAMP_NOT_AVAILABLE' - Constant expression: '"n/a"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TIMESTAMP_NOT_AVAILABLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="TIMESTAMP_NOT_AVAILABLE" qualify="false" replace="true" selection="5773 5" stamp="1184346482656" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.TIMESTAMP_NOT_AVAILABLE' to 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.TIMESTAMP_NOT_AVAILABLE' - Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="false" description="Move member 'TIMESTAMP_NOT_AVAILABLE'" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java[BugzillaRepositorySettingsPage^TIMESTAMP_NOT_AVAILABLE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1184346502375" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..8fb70ce
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1,5 @@
+1184020069235 Delete element
+1184175439156 Delete element
+1184346453359 Extract constant 'LABEL_CACHED_CONFIGURATION'
+1184346482656 Extract constant 'TIMESTAMP_NOT_AVAILABLE'
+1184346502375 Move member 'TIMESTAMP_NOT_AVAILABLE'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/8/35/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/8/35/refactorings.history
new file mode 100644
index 0000000..4c9100c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/8/35/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.TOOLTIP_CACHED_CONFIGURATION' from expression '"Use for repositories that explicitly state that they support this customization."' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Constant name: 'TOOLTIP_CACHED_CONFIGURATION' - Constant expression: '"Use for repositories that explicitly state that they support this customization."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TOOLTIP_CACHED_CONFIGURATION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="TOOLTIP_CACHED_CONFIGURATION" qualify="false" replace="true" selection="5528 82" stamp="1188284514087" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void populatePlatformCombo()' from 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.createAdditionalControls()' to 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Method name: 'populatePlatformCombo' - Destination type: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage' - Declared visibility: 'private'" comments="false" description="Extract method 'populatePlatformCombo'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="populatePlatformCombo" replace="false" selection="9301 707" stamp="1188408232578" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void populateOsCombo()' from 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.createAdditionalControls()' to 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Method name: 'populateOsCombo' - Destination type: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage' - Declared visibility: 'private'" comments="false" description="Extract method 'populateOsCombo'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="populateOsCombo" replace="false" selection="9398 561" stamp="1188408256578" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.TOOLTIP_AUTODETECTION_DISABLED' from expression '"This option is available once the repository has been created."' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Constant name: 'TOOLTIP_AUTODETECTION_DISABLED' - Constant expression: '"This option is available once the repository has been created."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TOOLTIP_AUTODETECTION_DISABLED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="TOOLTIP_AUTODETECTION_DISABLED" qualify="false" replace="true" selection="7051 64" stamp="1188408762562" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaRepositorySettingsPage.TOOLTIP_AUTODETECTION_ENABLED' from expression '"Use these settings to override auto detection of Platform and OS for new bug reports."' - Original project: 'org.eclipse.mylyn.bugzilla.ui' - Constant name: 'TOOLTIP_AUTODETECTION_ENABLED' - Constant expression: '"Use these settings to override auto detection of Platform and OS for new bug reports."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TOOLTIP_AUTODETECTION_ENABLED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaRepositorySettingsPage.java" name="TOOLTIP_AUTODETECTION_ENABLED" qualify="false" replace="true" selection="7263 87" stamp="1188408788625" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/8/35/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/8/35/refactorings.index
new file mode 100644
index 0000000..bf84257
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/8/35/refactorings.index
@@ -0,0 +1,5 @@
+1188284514087 Extract constant 'TOOLTIP_CACHED_CONFIGURATION'
+1188408232578 Extract method 'populatePlatformCombo'
+1188408256578 Extract method 'populateOsCombo'
+1188408762562 Extract constant 'TOOLTIP_AUTODETECTION_DISABLED'
+1188408788625 Extract constant 'TOOLTIP_AUTODETECTION_ENABLED'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..53958bf
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.setPageComplete()' to 'updatePageCompletion'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.setPageComplete()'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.updatePageCompletion()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setPageComplete'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java[BugzillaSearchPage~setPageComplete" name="updatePageCompletion" references="true" stamp="1190767330656" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..0d563d5
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1 @@
+1190767330656 Rename method 'setPageComplete'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/2/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/2/refactorings.history
new file mode 100644
index 0000000..6d525b4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/2/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void createTaskLinkHyperlink(Composite hyperlinksComposite,final String bugId,final String bugUrl,final AbstractTask task)' from 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditor.addBugHyperlinks()' to 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditor'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Method name: 'createTaskLinkHyperlink'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditor'
- Declared visibility: 'private'" comments="false" description="Extract method 'createTaskLinkHyperlink'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaTaskEditor.java" name="createTaskLinkHyperlink" replace="false" selection="10576 682" stamp="1199906292897" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.LABEL_WIDTH' from expression '58'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Constant name: 'LABEL_WIDTH'
- Constant expression: '58'
- Declared visibility: 'private'" description="Extract constant 'LABEL_WIDTH'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" name="LABEL_WIDTH" qualify="false" replace="false" selection="13358 2" stamp="1200162783957" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/2/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/2/refactorings.index
new file mode 100644
index 0000000..009d816
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/2/refactorings.index
@@ -0,0 +1,2 @@
+1199906292897 Extract method 'createTaskLinkHyperlink'
+1200162783957 Extract constant 'LABEL_WIDTH'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/5/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/5/refactorings.history
new file mode 100644
index 0000000..2d5d2c8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'ce' in 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.createControl(...).new SelectionAdapter() {...}.widgetSelected(...).new IRunnableWithProgress() {...}.run(...)' to 'e'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.createControl(...).new SelectionAdapter() {...}.widgetSelected(...).new IRunnableWithProgress() {...}.run(IProgressMonitor).ce'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.createControl(...).new SelectionAdapter() {...}.widgetSelected(...).new IRunnableWithProgress() {...}.run(IProgressMonitor).e'
- Update references to refactored element" description="Rename local variable 'ce'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{BugzillaProductPage.java[BugzillaProductPage~createControl~QComposite;[!5~widgetSelected~QSelectionEvent;[~run~QIProgressMonitor;@ce!8845!8860!8859!8860!QCoreException;" name="e" references="true" stamp="1201740927456" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/5/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/5/refactorings.index
new file mode 100644
index 0000000..1dc97ec
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/1/5/refactorings.index
@@ -0,0 +1 @@
+1201740927456 Rename local variable 'ce'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/11/45/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/11/45/refactorings.history
new file mode 100644
index 0000000..57f992b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/11/45/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private Shell getRealShell(Shell shell)' from 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.updateConfiguration()' to 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Method name: 'getRealShell'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'getRealShell'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" name="getRealShell" replace="false" selection="71163 220" stamp="1225735008230" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.getRealShell()' to 'getShell'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.getRealShell()'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.getShell()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRealShell'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java[BugzillaSearchPage~getRealShell" name="getShell" references="true" stamp="1225735632893" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/11/45/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/11/45/refactorings.index
new file mode 100644
index 0000000..cd823db
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/11/45/refactorings.index
@@ -0,0 +1,2 @@
+1225735008230 Extract method 'getRealShell'
+1225735632893 Rename method 'getRealShell'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/50/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/50/refactorings.history
new file mode 100644
index 0000000..0cafa72
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'BugzillaTaskAttachmentPage.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskAttachmentPage.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229125656514" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/50/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/50/refactorings.index
new file mode 100644
index 0000000..7c94a48
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/50/refactorings.index
@@ -0,0 +1 @@
+1229125656514 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/51/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/51/refactorings.history
new file mode 100644
index 0000000..5adb280
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'BugzillaSearchPage.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchPage.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229385559742" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'BugzillaRepositorySettingsPage.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229385737966" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'action.properties'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/ui/action/action.properties" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1229648143234" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/51/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/51/refactorings.index
new file mode 100644
index 0000000..ed246e1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/12/51/refactorings.index
@@ -0,0 +1,3 @@
+1229385559742 Delete element
+1229385737966 Delete element
+1229648143234 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/3/13/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/3/13/refactorings.history
new file mode 100644
index 0000000..a243f79
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/3/13/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void updateConfiguration()' from 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.createSearchGroup().new SelectionAdapter() {...}.widgetSelected()' to 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Method name: 'updateConfiguration'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateConfiguration'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" name="updateConfiguration" replace="false" selection="31408 2947" stamp="1206727720113" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.updateAttributesFromRepository(...)' to 'updateAttributesFromConfiguration'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.updateAttributesFromRepository(...)'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.updateAttributesFromConfiguration(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateAttributesFromRepository'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java[BugzillaSearchPage~updateAttributesFromRepository~\[QString;" name="updateAttributesFromConfiguration" references="true" stamp="1206727858212" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/3/13/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/3/13/refactorings.index
new file mode 100644
index 0000000..0e38a6f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/3/13/refactorings.index
@@ -0,0 +1,2 @@
+1206727720113 Extract method 'updateConfiguration'
+1206727858212 Rename method 'updateAttributesFromRepository'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..b9c7c6a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.BugzillaAuthenticator.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui{BugzillaAuthenticator.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207688478436" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..ec5d85e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1 @@
+1207688478436 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/17/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/17/refactorings.history
new file mode 100644
index 0000000..f09a054
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/17/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.StackTraceDuplicateDetector.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui{StackTraceDuplicateDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208901052471" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/17/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/17/refactorings.index
new file mode 100644
index 0000000..110f41f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/17/refactorings.index
@@ -0,0 +1 @@
+1208901052471 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..1c96bfd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.IBugzillaResultEditorMatchAdapter.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{IBugzillaResultEditorMatchAdapter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209518850995" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..b974093
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1 @@
+1209518850995 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..28fcb9d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.ui/src/org.eclipse.mylyn.internal.bugzilla.ui.tasklist'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.ui/src/org.eclipse.mylyn.internal.bugzilla.ui.tasklist'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.BugzillaTaskListMigrator.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui{BugzillaTaskListMigrator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210972267786" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..ebf67f2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1 @@
+1210972267786 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..823b71d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage.BugzillaPeoplePart' in 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage' to top level type
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage.BugzillaPeoplePart'
- Field name: 'bugzillaTaskEditorPage'
- Declare field 'final'" description="Convert member type 'BugzillaPeoplePart' to top level" field="false" fieldName="bugzillaTaskEditorPage" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaTaskEditorPage.java[BugzillaTaskEditorPage[BugzillaPeoplePart" mandatory="false" possible="false" stamp="1211850706026" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.editor.KeywordEditorPart' to 'BugzillaKeywordAttributeEditor'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.KeywordEditorPart'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaKeywordAttributeEditor'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'KeywordEditorPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{KeywordEditorPart.java[KeywordEditorPart" matchStrategy="1" name="BugzillaKeywordAttributeEditor" qualified="false" references="true" similarDeclarations="false" stamp="1211924876230" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCCAttributeEditor' to 'BugzillaRemoveCCAttributeEditor'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCCAttributeEditor'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaRemoveCCAttributeEditor'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaCCAttributeEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaCCAttributeEditor.java[BugzillaCCAttributeEditor" matchStrategy="1" name="BugzillaRemoveCCAttributeEditor" qualified="false" references="true" similarDeclarations="false" stamp="1211932093649" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaRemoveCCAttributeEditor' to 'BugzillaCCAttributeEditor'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaRemoveCCAttributeEditor'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCCAttributeEditor'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaRemoveCCAttributeEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaRemoveCCAttributeEditor.java[BugzillaRemoveCCAttributeEditor" matchStrategy="1" name="BugzillaCCAttributeEditor" qualified="false" references="true" similarDeclarations="false" stamp="1211933143043" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.TAG_BUGZILLA_QUERY' to 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.TAG_BUGZILLA_QUERY'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'TAG_BUGZILLA_QUERY'" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListMigrator.java[BugzillaTaskListMigrator^TAG_BUGZILLA_QUERY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1211940731303" version="1.0"/>
<refactoring comment="Extract constant 'ATTRIBUTE_BUGZILLA_QUERY_CUSTOM' from expression '"bugzilla.query.custom"'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Constant name: 'ATTRIBUTE_BUGZILLA_QUERY_CUSTOM'
- Constant expression: '"bugzilla.query.custom"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ATTRIBUTE_BUGZILLA_QUERY_CUSTOM'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListMigrator.java" name="ATTRIBUTE_BUGZILLA_QUERY_CUSTOM" qualify="false" replace="true" selection="1872 23" stamp="1211940991411" version="1.0" visibility="2"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.ATTRIBUTE_BUGZILLA_QUERY_CUSTOM' to 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.ATTRIBUTE_BUGZILLA_QUERY_CUSTOM'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'ATTRIBUTE_BUGZILLA_QUERY_CUSTOM'" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListMigrator.java[BugzillaTaskListMigrator^ATTRIBUTE_BUGZILLA_QUERY_CUSTOM" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1211941006077" version="1.0"/>
<refactoring comment="Extract method 'private String getSelectedProduct()' from 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.saveDataToModel()' to 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Method name: 'getSelectedProduct'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'getSelectedProduct'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{BugzillaProductPage.java" name="getSelectedProduct" replace="false" selection="15385 90" stamp="1211957448250" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original elements:
 org.eclipse.mylyn.internal.bugzilla.ui.tasklist.EditBugzillaQueryWizard.java
 org.eclipse.mylyn.internal.bugzilla.ui.tasklist.NewBugzillaQueryWizard.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{EditBugzillaQueryWizard.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{NewBugzillaQueryWizard.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212016353265" subPackages="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.KEY_SEVERITY' to 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.KEY_SEVERITY'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'KEY_SEVERITY'" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListMigrator.java[BugzillaTaskListMigrator^KEY_SEVERITY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1212179977200" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.KEY_PRODUCT' to 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator.KEY_PRODUCT'
- Destination type: 'org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants'" delegate="false" deprecate="true" description="Move member 'KEY_PRODUCT'" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListMigrator.java[BugzillaTaskListMigrator^KEY_PRODUCT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core{IBugzillaConstants.java[IBugzillaConstants" stamp="1212179987137" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaDependencyAttributeEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaDependencyAttributeEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212187050964" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..f59ad1b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,12 @@
+1211850706026 Convert member type 'BugzillaPeoplePart' to top level
+1211924876230 Rename type 'KeywordEditorPart'
+1211932093649 Rename type 'BugzillaCCAttributeEditor'
+1211933143043 Rename type 'BugzillaRemoveCCAttributeEditor'
+1211940731303 Move member 'TAG_BUGZILLA_QUERY'
+1211940991411 Extract constant 'ATTRIBUTE_BUGZILLA_QUERY_CUSTOM'
+1211941006077 Move member 'ATTRIBUTE_BUGZILLA_QUERY_CUSTOM'
+1211957448250 Extract method 'getSelectedProduct'
+1212016353265 Delete elements
+1212179977200 Move member 'KEY_SEVERITY'
+1212179987137 Move member 'KEY_PRODUCT'
+1212187050964 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/22/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/22/refactorings.history
new file mode 100644
index 0000000..976cb27
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCCAttributeEditor' to 'BugzillaCcAttributeEditor'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCCAttributeEditor'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCcAttributeEditor'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaCCAttributeEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaCCAttributeEditor.java[BugzillaCCAttributeEditor" matchStrategy="1" name="BugzillaCcAttributeEditor" qualified="false" references="true" similarDeclarations="false" stamp="1212302271781" textual="true" version="1.0"/>
<refactoring comment="Rename field 'attrRemoveCC' in 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCcAttributeEditor' to 'attrRemoveCc'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCcAttributeEditor.attrRemoveCC'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaCcAttributeEditor.attrRemoveCc'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'attrRemoveCC'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaCcAttributeEditor.java[BugzillaCcAttributeEditor^attrRemoveCC" name="attrRemoveCc" references="true" setter="true" stamp="1212302278936" textual="true" version="1.0"/>


<refactoring comment="Extract local variable 'mappedAttribute' from expression 'getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.CC.getKey())'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Variable name: 'mappedAttribute'
- Destination method: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaPeoplePart.createControl()'
- Variable expression: 'getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.CC.getKey())'
- Replace occurrences of expression with variable" description="Extract local variable 'mappedAttribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaPeoplePart.java" name="mappedAttribute" replace="true" selection="3082 78" stamp="1212302949748" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/22/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/22/refactorings.index
new file mode 100644
index 0000000..fddbb89
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/22/refactorings.index
@@ -0,0 +1,3 @@
+1212302271781 Rename type 'BugzillaCCAttributeEditor'
+1212302278936 Rename field 'attrRemoveCC'
+1212302949748 Extract local variable 'mappedAttribute'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..f65d1ec
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaPlanningAttributePart' to 'BugzillaPlanningEditorPart'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaPlanningAttributePart'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaPlanningEditorPart'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaPlanningAttributePart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaPlanningAttributePart.java[BugzillaPlanningAttributePart" matchStrategy="1" name="BugzillaPlanningEditorPart" qualified="false" references="true" similarDeclarations="false" stamp="1212530065527" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..2c96577
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1 @@
+1212530065527 Rename type 'BugzillaPlanningAttributePart'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..59416db
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.bugzilla.ui{BugzillaUiPlugin.java[BugzillaUiPlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213246241748" textual="false" version="1.0"/>
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original elements:
 org.eclipse.mylyn.internal.bugzilla.ui.BugzillaCompareStructureCreator.java
 org.eclipse.mylyn.internal.bugzilla.ui.BugzillaCompareInput.java
 org.eclipse.mylyn.internal.bugzilla.ui.BugzillaCompareNode.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui{BugzillaCompareStructureCreator.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.ui{BugzillaCompareInput.java" element3="/src<org.eclipse.mylyn.internal.bugzilla.ui{BugzillaCompareNode.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213374224478" units="3" version="1.0"/>
<refactoring comment="Copy 3 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original elements:
 org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditor.java
 org.eclipse.mylyn.internal.bugzilla.ui.editor.NewBugzillaTaskEditor.java
 org.eclipse.mylyn.internal.bugzilla.ui.editor.DummySearchHitProvider.java" description="Copy compilation units" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaTaskEditor.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{NewBugzillaTaskEditor.java" element3="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{DummySearchHitProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213374348583" units="3" version="1.0"/>
<refactoring accessors="true" comment="Delete 3 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original elements:
 org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditor.java
 org.eclipse.mylyn.internal.bugzilla.ui.editor.DummySearchHitProvider.java
 org.eclipse.mylyn.internal.bugzilla.ui.editor.NewBugzillaTaskEditor.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaTaskEditor.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{NewBugzillaTaskEditor.java" element3="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{DummySearchHitProvider.java" elements="3" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213374357929" subPackages="false" version="1.0"/>
<refactoring comment="Copy 2 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original elements:
 org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskEditorFactory.java
 org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListFactory.java" description="Copy compilation units" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskEditorFactory.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213374395064" units="2" version="1.0"/>
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original elements:
 org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskEditorFactory.java
 org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListFactory.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskEditorFactory.java" element2="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskListFactory.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213374402342" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskEditorInput.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213375295701" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskEditorInput.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.tasklist{BugzillaTaskEditorInput.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213375304685" subPackages="false" version="1.0"/>
<refactoring comment="Change method 'public org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.BugzillaProductPage(NewBugzillaTaskWizard bugWiz, TaskRepository repository)' to 'public BugzillaProductPage(TaskRepository repository)'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.BugzillaProductPage(...)'
- Removed parameters:
 NewBugzillaTaskWizard bugWiz" delegate="false" deprecate="true" description="Change method 'BugzillaProductPage'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{BugzillaProductPage.java[BugzillaProductPage~BugzillaProductPage~QNewBugzillaTaskWizard;~QTaskRepository;" name="BugzillaProductPage" parameter1="NewBugzillaTaskWizard bugWiz 0 {deleted} {deleted} true" parameter2="TaskRepository repository 1 TaskRepository repository false" stamp="1213387344996" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'org.eclipse.mylyn.bugzilla.tests/src/com.eclipse.mylyn.bugzilla.deprecated'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.KeywordsDialog.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.tests/src<com.eclipse.mylyn.bugzilla.deprecated" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{KeywordsDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213388146130" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..dd092ff
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,10 @@
+1213246241748 Rename field 'PLUGIN_ID'
+1213374224478 Move compilation units
+1213374348583 Copy compilation units
+1213374357929 Delete elements
+1213374395064 Copy compilation units
+1213374402342 Delete elements
+1213375295701 Copy compilation unit
+1213375304685 Delete element
+1213387344996 Change method 'BugzillaProductPage'
+1213388146130 Move compilation unit
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/1/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/1/refactorings.history
new file mode 100644
index 0000000..2cdef6f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/1/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.LABEL_VIEW_REPOSITORIES' in 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.LABEL_VIEW_REPOSITORIES'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_VIEW_REPOSITORIES'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" remove="true" replace="true" selection="3772 0" stamp="1230992411312" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.MESSAGE_NO_REPOSITORY' in 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.MESSAGE_NO_REPOSITORY'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'MESSAGE_NO_REPOSITORY'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" remove="true" replace="true" selection="3769 0" stamp="1230992418027" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.NUM_DAYS_POSITIVE' in 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.NUM_DAYS_POSITIVE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'NUM_DAYS_POSITIVE'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" remove="true" replace="true" selection="3767 0" stamp="1230992422049" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.TITLE_BUGZILLA_QUERY' in 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage.TITLE_BUGZILLA_QUERY'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'TITLE_BUGZILLA_QUERY'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.bugzilla.ui.search{BugzillaSearchPage.java" remove="true" replace="true" selection="3773 0" stamp="1230992426061" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/1/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/1/refactorings.index
new file mode 100644
index 0000000..0c16c06
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/1/refactorings.index
@@ -0,0 +1,4 @@
+1230992411312 Inline constant 'LABEL_VIEW_REPOSITORIES'
+1230992418027 Inline constant 'MESSAGE_NO_REPOSITORY'
+1230992422049 Inline constant 'NUM_DAYS_POSITIVE'
+1230992426061 Inline constant 'TITLE_BUGZILLA_QUERY'
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/2/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/2/refactorings.history
new file mode 100644
index 0000000..825e4e3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/2/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaFlagPart.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.editor{BugzillaFlagPart.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1231597046303" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/2/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/2/refactorings.index
new file mode 100644
index 0000000..c6b95ab
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/1/2/refactorings.index
@@ -0,0 +1 @@
+1231597046303 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/2/8/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/2/8/refactorings.history
new file mode 100644
index 0000000..04f8652
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/2/8/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'bugzilla'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Destination element: 'bugzilla'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{BugzillaProductPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1235006329785" target="/org.eclipse.mylyn/developer/src-old/bugzilla" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.BugzillaProductPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{BugzillaProductPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1235006353709" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{NewBugzillaTaskWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1235006474937" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/2/8/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/2/8/refactorings.index
new file mode 100644
index 0000000..7bf52eb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/2/8/refactorings.index
@@ -0,0 +1,3 @@
+1235006329785 Copy compilation unit
+1235006353709 Delete element
+1235006474937 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/6/25/refactorings.history b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/6/25/refactorings.history
new file mode 100644
index 0000000..954b38b
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/6/25/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'messages.properties'" description="Delete element" element1="src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/messages.properties" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1245192152943" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.bugzilla.ui'
- Original project: 'org.eclipse.mylyn.bugzilla.ui'
- Original element: 'org.eclipse.mylyn.internal.bugzilla.ui.wizard.Messages.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.bugzilla.ui.wizard{Messages.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1245192241297" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/6/25/refactorings.index b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/6/25/refactorings.index
new file mode 100644
index 0000000..4568e80
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.refactorings/2009/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1245192152943 Delete element
+1245192241297 Delete element
diff --git a/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.bugzilla.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.bugzilla.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5b35af8
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.bugzilla.ui; singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.compare,
+ org.eclipse.ui.views,
+ org.eclipse.ui.forms,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.mylyn.bugzilla.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.mylyn.internal.bugzilla.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.bugzilla.ui.action;x-internal:=true,
+ org.eclipse.mylyn.internal.bugzilla.ui.editor;x-internal:=true,
+ org.eclipse.mylyn.internal.bugzilla.ui.search;x-internal:=true,
+ org.eclipse.mylyn.internal.bugzilla.ui.tasklist;x-internal:=true,
+ org.eclipse.mylyn.internal.bugzilla.ui.wizard;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ClassPath: .
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.bugzilla.ui/about.html b/org.eclipse.mylyn.bugzilla.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/build-user.xml b/org.eclipse.mylyn.bugzilla.ui/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.bugzilla.ui/build.properties b/org.eclipse.mylyn.bugzilla.ui/build.properties
new file mode 100644
index 0000000..d4538f4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = META-INF/,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ .,\
+ plugin.properties
+src.includes = META-INF/,\
+ about.html
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-comment.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-comment.gif
new file mode 100644
index 0000000..97bbdf7
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-comment.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-dirty.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-dirty.gif
new file mode 100644
index 0000000..8628881
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-dirty.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-favorite.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-favorite.gif
new file mode 100644
index 0000000..6830e33
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-favorite.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-new.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-new.gif
new file mode 100644
index 0000000..312ca8f
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-new.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-search-new.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-search-new.gif
new file mode 100644
index 0000000..8ac5e57
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-search-new.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-search.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-search.gif
new file mode 100644
index 0000000..b706063
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-search.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-small.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-small.gif
new file mode 100644
index 0000000..761b283
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug-small.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug.gif
new file mode 100644
index 0000000..54525a7
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/bug.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-conflicting.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-conflicting.gif
new file mode 100644
index 0000000..d13a356
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-conflicting.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-incoming.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-incoming.gif
new file mode 100644
index 0000000..f74cffb
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-incoming.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-outgoing.gif b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-outgoing.gif
new file mode 100644
index 0000000..0c5a35c
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/elcl16/overlay-outgoing.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug-new.gif b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug-new.gif
new file mode 100644
index 0000000..04f3028
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug-new.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug-refresh.gif b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug-refresh.gif
new file mode 100644
index 0000000..bb8538b
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug-refresh.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug.gif b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug.gif
new file mode 100644
index 0000000..71b1bab
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-bug.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-remote.gif b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-remote.gif
new file mode 100644
index 0000000..d0d46a0
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-remote.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository-new.gif b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository-new.gif
new file mode 100644
index 0000000..5f33961
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository-new.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository.gif b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository.gif
new file mode 100644
index 0000000..78470a3
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/etool16/task-repository.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/bugzilla-logo.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/bugzilla-logo.gif
new file mode 100644
index 0000000..1ac3a03
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/bugzilla-logo.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bug.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bug.gif
new file mode 100644
index 0000000..692d2fa
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bug.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bugzilla.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bugzilla.gif
new file mode 100644
index 0000000..f220eeb
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-bugzilla.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-critical.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-critical.gif
new file mode 100644
index 0000000..41497b1
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-critical.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-enhancement.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-enhancement.gif
new file mode 100644
index 0000000..9a75b1e
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-enhancement.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-feature.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-feature.gif
new file mode 100644
index 0000000..45f7a76
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-feature.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-major.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-major.gif
new file mode 100644
index 0000000..2ec19fb
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-major.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-minor.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-minor.gif
new file mode 100644
index 0000000..376dbb4
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-minor.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-normal.gif b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-normal.gif
new file mode 100644
index 0000000..d582fe0
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/eview16/overlay-normal.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/find.gif b/org.eclipse.mylyn.bugzilla.ui/icons/find.gif
new file mode 100644
index 0000000..2b645a8
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/find.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/icons/wizban/bug-wizard.gif b/org.eclipse.mylyn.bugzilla.ui/icons/wizban/bug-wizard.gif
new file mode 100644
index 0000000..ec6d66c
Binary files /dev/null and b/org.eclipse.mylyn.bugzilla.ui/icons/wizban/bug-wizard.gif differ
diff --git a/org.eclipse.mylyn.bugzilla.ui/plugin.properties b/org.eclipse.mylyn.bugzilla.ui/plugin.properties
new file mode 100644
index 0000000..d4a7757
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/plugin.properties
@@ -0,0 +1,7 @@
+#Properties file for org.eclipse.mylyn.bugzilla.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Bugzilla Connector UI
+
+bugzilla.repository.name=Bugzilla Repository
+BugzillaRepositoryConnector.name=Bugzilla Repository Connector
+tasklist.BugzillaConnectorUi.name=Bugzilla Repository UI
diff --git a/org.eclipse.mylyn.bugzilla.ui/plugin.xml b/org.eclipse.mylyn.bugzilla.ui/plugin.xml
new file mode 100644
index 0000000..b8a00f2
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/plugin.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ id="org.eclipse.mylyn.bugzilla.repository"
+ name="%bugzilla.repository.name"
+ point="org.eclipse.mylyn.tasks.ui.repositories">
+
+ <connectorCore
+ class="org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector"
+ id="org.eclipse.mylyn.bugzilla.tasklist.repositories"
+ name="%BugzillaRepositoryConnector.name"/>
+
+ <connectorUi
+ brandingIcon="icons/eview16/bugzilla-logo.gif"
+ class="org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaConnectorUi"
+ name="%tasklist.BugzillaConnectorUi.name"
+ overlayIcon="icons/eview16/overlay-bugzilla.gif"/>
+
+ <taskListMigrator
+ class="org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskListMigrator"/>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.bugzilla.core.languages">
+ <!-- <language
+ name="en">
+ <languageAttribute command="error_login" response="Login"/>
+ <languageAttribute command="error_login" response="log in"/>
+ <languageAttribute command="error_login" response="check e-mail"/>
+ <languageAttribute command="error_login" response="Invalid Username Or Password"/>
+ <languageAttribute command="error_collision" response="Mid-air collision!"/>
+ <languageAttribute command="error_comment_required" response="Comment Required"/>
+ <languageAttribute command="error_logged_out" response="logged out"/>
+ <languageAttribute command="bad_login" response="Login"/>
+ <languageAttribute command="bad_login" response="log in"/>
+ <languageAttribute command="bad_login" response="check e-mail"/>
+ <languageAttribute command="bad_login" response="Invalid Username Or Password"/>
+ <languageAttribute command="bad_login" response="error"/>
+ <languageAttribute command="processed" response="processed"/>
+ <languageAttribute command="changes_submitted" response="Changes submitted"/>
+ <languageAttribute command="changes_submitted" response="added to Bug"/>
+ </language>
+ -->
+ <language
+ name="de">
+ <languageAttribute command="error_login" response="Anmeldename erforderlich"/>
+ <languageAttribute command="error_login" response="check e-mail"/>
+ <languageAttribute command="error_login" response="Ungültiger Benutzername oder ungültiges Passwort"/>
+ <languageAttribute command="error_collision" response="Kollision!"/>
+ <languageAttribute command="error_comment_required" response="Kommentar erforderlich"/>
+ <languageAttribute command="error_logged_out" response="Abgemeldet"/>
+ <languageAttribute command="bad_login" response="Anmeldename erforderlich"/>
+ <languageAttribute command="bad_login" response="check e-mail"/>
+ <languageAttribute command="bad_login" response="Ungültiger Benutzername oder ungültiges Passwort"/>
+ <languageAttribute command="bad_login" response="error"/>
+ <languageAttribute command="processed" response="processed"/>
+ <languageAttribute command="changes_submitted" response="Changes submitted"/>
+ <languageAttribute command="changes_submitted" response="added to Bug"/>
+ <languageAttribute command="bug" response="Bug"/>
+ <languageAttribute command="bug" response="Issue"/>
+ <languageAttribute command="submitted" response="Submitted"/>
+ <languageAttribute command="submitted" response="posted"/>
+ <languageAttribute command="suspicious_action" response="Suspicious action"/>
+ </language>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.editors">
+ <pageFactory
+ class="org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPageFactory"
+ id="org.eclipse.mylyn.bugzilla.ui.pageFactory">
+ </pageFactory>
+ </extension>
+
+ <extension point = "org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.bugzilla.ui.contribution.attachment"
+ objectClass="org.eclipse.mylyn.tasks.core.ITaskAttachment">
+ <action
+ class="org.eclipse.mylyn.internal.bugzilla.ui.action.BugzillaNotObsoleteAttachmentAction"
+ enablesFor="*"
+ id="org.eclipse.mylyn.bugzilla.ui.contribution.attachment.notobsolete"
+ label="Mark not obsolete"
+ menubarPath="org.eclipse.mylyn.bugzilla.ui.attachments.mark/markadditions"
+ tooltip="Mark attachment as not obsolete">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.bugzilla.ui.action.BugzillaObsoleteAttachmentAction"
+ enablesFor="*"
+ id="org.eclipse.mylyn.bugzilla.ui.contribution.attachment.obsolete"
+ label="Mark obsolete"
+ menubarPath="org.eclipse.mylyn.bugzilla.ui.attachments.mark/markadditions"
+ tooltip="Mark attachment as obsolete">
+ </action>
+ <menu
+ id="org.eclipse.mylyn.bugzilla.ui.attachments.mark"
+ label="Mark as"
+ path="markadditions">
+ </menu>
+ </objectContribution>
+ </extension>
+
+
+</plugin>
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaImages.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaImages.java
new file mode 100644
index 0000000..b49311a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaImages.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class BugzillaImages {
+
+ private static ImageRegistry imageRegistry;
+
+ private static final URL baseURL = BugzillaUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$
+
+ public static final String T_ELCL = "elcl16"; //$NON-NLS-1$
+
+ public static final String T_TOOL = "etool16"; //$NON-NLS-1$
+
+ public static final String T_VIEW = "eview16"; //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_BUGZILLA = create(T_VIEW, "overlay-bugzilla.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BUG = create(T_ELCL, "bug.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BUG_COMMENT = create(T_ELCL, "bug-comment.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REMOVE_ALL = create("", "remove-all.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor REMOVE = create("", "remove.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor SELECT_ALL = create("", "selectAll.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor OPEN = create("", "openresult.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor OVERLAY_CRITICAL = create(T_VIEW, "overlay-critical.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_MAJOR = create(T_VIEW, "overlay-major.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_ENHANCEMENT = create(T_VIEW, "overlay-enhancement.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_MINOR = create(T_VIEW, "overlay-minor.gif"); //$NON-NLS-1$
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuffer buffer = new StringBuffer(prefix);
+ if (prefix != "") { //$NON-NLS-1$
+ buffer.append('/');
+ }
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+ private static ImageRegistry getImageRegistry() {
+ if (imageRegistry == null) {
+ imageRegistry = new ImageRegistry();
+ }
+
+ return imageRegistry;
+ }
+
+ /**
+ * Lazily initializes image map.
+ */
+ public static Image getImage(ImageDescriptor imageDescriptor) {
+ ImageRegistry imageRegistry = getImageRegistry();
+ Image image = imageRegistry.get("" + imageDescriptor.hashCode()); //$NON-NLS-1$
+ if (image == null) {
+ image = imageDescriptor.createImage();
+ imageRegistry.put("" + imageDescriptor.hashCode(), image); //$NON-NLS-1$
+ }
+ return image;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaSearchHandler.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaSearchHandler.java
new file mode 100644
index 0000000..ee80ad0
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaSearchHandler.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Robert Elves
+ */
+ at SuppressWarnings("restriction")
+public class BugzillaSearchHandler extends AbstractSearchHandler {
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public boolean queryForText(TaskRepository taskRepository, IRepositoryQuery query, TaskData taskData,
+ String searchString) {
+ try {
+ String queryUrl = taskRepository.getRepositoryUrl()
+ + "/buglist.cgi?long_desc_type=allwordssubstr&long_desc=" //$NON-NLS-1$
+ + URLEncoder.encode(searchString, taskRepository.getCharacterEncoding());
+ query.setUrl(queryUrl);
+ } catch (UnsupportedEncodingException e) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiExtensionReader.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiExtensionReader.java
new file mode 100644
index 0000000..26bfa2d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiExtensionReader.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaLanguageSettings;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaUiExtensionReader {
+
+ public static final String EXTENSION_LANGUAGES = "org.eclipse.mylyn.bugzilla.core.languages"; //$NON-NLS-1$
+
+ public static final String EXTENSION_TMPL_LANGUAGE = "language"; //$NON-NLS-1$
+
+ public static final String ATTR_LANG_VALUE = "value"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_NAME = "name"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_ERROR_LOGIN = "error_login"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_ERROR_COLLISION = "error_collision"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_ERROR_COMMENT_REQIRED = "error_comment_required"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_ERROR_LOGGED_OUT = "error_logged_out"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_BAD_LOGIN = "bad_login"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_PROCESSED = "processed"; //$NON-NLS-1$
+
+ public static final String ELMNT_LANG_CHANGES_SUBMITTED = "changes_submitted"; //$NON-NLS-1$
+
+ private static boolean coreExtensionsRead = false;
+
+ public static void initStartupExtensions() {
+ if (!coreExtensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ IExtensionPoint templatesExtensionPoint = registry.getExtensionPoint(EXTENSION_LANGUAGES);
+ IExtension[] templateExtensions = templatesExtensionPoint.getExtensions();
+ for (IExtension templateExtension : templateExtensions) {
+ IConfigurationElement[] elements = templateExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(EXTENSION_TMPL_LANGUAGE)) {
+ readLanguageTemplate(element);
+ }
+ }
+ }
+
+ coreExtensionsRead = true;
+ }
+
+ }
+
+ private static void readLanguageTemplate(IConfigurationElement element) {
+ String languageName = element.getAttribute(ELMNT_LANG_NAME);
+ if (languageName != null) {
+ BugzillaLanguageSettings bugzillaLanguageSettings = new BugzillaLanguageSettings(languageName);
+
+ for (IConfigurationElement configElement : element.getChildren()) {
+ String name = configElement.getName();
+ if (name != null && name.equals("languageAttribute")) { //$NON-NLS-1$
+ String command = configElement.getAttribute("command"); //$NON-NLS-1$
+ String response = configElement.getAttribute("response"); //$NON-NLS-1$
+ bugzillaLanguageSettings.addLanguageAttribute(command, response);
+ }
+ }
+ BugzillaRepositoryConnector.addLanguageSetting(bugzillaLanguageSettings);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, BugzillaUiPlugin.ID_PLUGIN,
+ "Could not load language template extension " + element.getName())); //$NON-NLS-1$
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java
new file mode 100644
index 0000000..4c5248a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/BugzillaUiPlugin.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Mik Kersten
+ */
+public class BugzillaUiPlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.bugzilla.ui"; //$NON-NLS-1$
+
+ public static final String SEARCH_PAGE_ID = BugzillaUiPlugin.ID_PLUGIN + ".search.bugzillaSearchPage"; //$NON-NLS-1$
+
+ public static final String SEARCH_PAGE_CONTEXT = BugzillaUiPlugin.ID_PLUGIN + ".bugzillaSearchContext"; //$NON-NLS-1$
+
+ public static final String EDITOR_PAGE_CONTEXT = BugzillaUiPlugin.ID_PLUGIN + ".bugzillaEditorContext"; //$NON-NLS-1$
+
+ // The is's for hit markers used in the label provider and sorters
+ public static final String HIT_MARKER_ATTR_ID = "taskId"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_REPOSITORY = "repository"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_HREF = "href"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_DESC = "summary"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_LABEL = "label"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_SEVERITY = "severity"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_PRIORITY = "priority"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_PLATFORM = "platform"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_STATE = "state"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_RESULT = "result"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_OWNER = "owner"; //$NON-NLS-1$
+
+ public static final String HIT_MARKER_ATTR_QUERY = "query"; //$NON-NLS-1$
+
+ /**
+ * XXX: remove?
+ */
+ public static final String HIT_MARKER_ID = BugzillaUiPlugin.ID_PLUGIN + ".searchHit"; //$NON-NLS-1$
+
+ private static BugzillaUiPlugin plugin;
+
+ public static final char PREF_DELIM_REPOSITORY = ':';
+
+ private static final int WRAP_LENGTH = 90;
+
+ @SuppressWarnings("restriction")
+ public BugzillaUiPlugin() {
+ plugin = this;
+ org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getDefault().addSearchHandler(new BugzillaSearchHandler());
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ getPreferenceStore().setDefault(IBugzillaConstants.MAX_RESULTS, 100);
+
+ IPath repConfigCacheFile = getProductConfigurationCachePath();
+ if (repConfigCacheFile != null) {
+ BugzillaCorePlugin.setConfigurationCacheFile(repConfigCacheFile.toFile());
+ }
+
+ BugzillaRepositoryConnector bugzillaConnector = (BugzillaRepositoryConnector) TasksUi.getRepositoryManager()
+ .getRepositoryConnector(BugzillaCorePlugin.CONNECTOR_KIND);
+
+ TasksUi.getRepositoryManager().addListener(bugzillaConnector.getClientManager());
+
+ // NOTE: initializing extensions in start(..) has caused race
+ // conditions previously
+ BugzillaUiExtensionReader.initStartupExtensions();
+ }
+
+ /**
+ * Returns the path to the file cacheing the product configuration.
+ */
+ private static IPath getProductConfigurationCachePath() {
+ IPath stateLocation = Platform.getStateLocation(BugzillaCorePlugin.getDefault().getBundle());
+ IPath configFile = stateLocation.append("repositoryConfigurations"); //$NON-NLS-1$
+ return configFile;
+ }
+
+ public int getMaxResults() {
+ return getPreferenceStore().getInt(IBugzillaConstants.MAX_RESULTS);
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+
+ BugzillaRepositoryConnector bugzillaConnector = (BugzillaRepositoryConnector) TasksUi.getRepositoryManager()
+ .getRepositoryConnector(BugzillaCorePlugin.CONNECTOR_KIND);
+
+ TasksUi.getRepositoryManager().removeListener(bugzillaConnector.getClientManager());
+
+ super.stop(context);
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static BugzillaUiPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in relative path.
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(ID_PLUGIN, path);
+ }
+
+ public static String[] getQueryOptions(String prefId, String[] selectedProducts,
+ RepositoryConfiguration repositoryConfiguration) {
+ List<String> options = new ArrayList<String>();
+ if ((prefId.equals(IBugzillaConstants.VALUES_COMPONENT) || prefId.equals(IBugzillaConstants.VALUES_VERSION) || prefId.equals(IBugzillaConstants.VALUES_TARGET))
+ && selectedProducts != null) {
+ for (String product : selectedProducts) {
+ if (prefId.equals(IBugzillaConstants.VALUES_COMPONENT)) {
+ for (String option : repositoryConfiguration.getComponents(product)) {
+ if (!options.contains(option)) {
+ options.add(option);
+ }
+ }
+ }
+ if (prefId.equals(IBugzillaConstants.VALUES_VERSION)) {
+ for (String option : repositoryConfiguration.getVersions(product)) {
+ if (!options.contains(option)) {
+ options.add(option);
+ }
+ }
+ }
+ if (prefId.equals(IBugzillaConstants.VALUES_TARGET)) {
+ for (String option : repositoryConfiguration.getTargetMilestones(product)) {
+ if (!options.contains(option)) {
+ options.add(option);
+ }
+ }
+ }
+ }
+ } else {
+ if (prefId.equals(IBugzillaConstants.VALUES_COMPONENT)) {
+ options = repositoryConfiguration.getComponents();
+ }
+ if (prefId.equals(IBugzillaConstants.VALUES_VERSION)) {
+ options = repositoryConfiguration.getVersions();
+ }
+ if (prefId.equals(IBugzillaConstants.VALUES_TARGET)) {
+ options = repositoryConfiguration.getTargetMilestones();
+ }
+ }
+ return options.toArray(new String[options.size()]);
+ }
+
+ public static String getMostRecentQuery() {
+ return plugin.getPreferenceStore().getString(IBugzillaConstants.MOST_RECENT_QUERY);
+ }
+
+ /**
+ * Break text up into lines so that it is displayed properly in bugzilla
+ *
+ * @deprecated use {@link BugzillaClient#formatTextToLineWrap(String, boolean)} instead
+ */
+ @Deprecated
+ public static String formatTextToLineWrap(String origText, boolean hardWrap) {
+ // BugzillaServerVersion bugzillaServerVersion =
+ // IBugzillaConstants.BugzillaServerVersion.fromString(repository
+ // .getVersion());
+ // if (bugzillaServerVersion != null &&
+ // bugzillaServerVersion.compareTo(BugzillaServerVersion.SERVER_220) >=
+ // 0) {
+ // return origText;
+ if (!hardWrap) {
+ return origText;
+ } else {
+ String[] textArray = new String[(origText.length() / WRAP_LENGTH + 1) * 2];
+ for (int i = 0; i < textArray.length; i++) {
+ textArray[i] = null;
+ }
+ int j = 0;
+ while (true) {
+ int spaceIndex = origText.indexOf(" ", WRAP_LENGTH - 5); //$NON-NLS-1$
+ if (spaceIndex == origText.length() || spaceIndex == -1) {
+ textArray[j] = origText;
+ break;
+ }
+ textArray[j] = origText.substring(0, spaceIndex);
+ origText = origText.substring(spaceIndex + 1, origText.length());
+ j++;
+ }
+
+ String newText = ""; //$NON-NLS-1$
+
+ for (String element : textArray) {
+ if (element == null) {
+ break;
+ }
+ newText += element + "\n"; //$NON-NLS-1$
+ }
+ return newText;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaNotObsoleteAttachmentAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaNotObsoleteAttachmentAction.java
new file mode 100644
index 0000000..9919b5c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaNotObsoleteAttachmentAction.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.action;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaNotObsoleteAttachmentAction extends BugzillaUpdateAttachmentAction {
+
+ public BugzillaNotObsoleteAttachmentAction() {
+ super(false);
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaObsoleteAttachmentAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaObsoleteAttachmentAction.java
new file mode 100644
index 0000000..c39f1f6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaObsoleteAttachmentAction.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.action;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaObsoleteAttachmentAction extends BugzillaUpdateAttachmentAction {
+
+ public BugzillaObsoleteAttachmentAction() {
+ super(true);
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaUpdateAttachmentAction.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaUpdateAttachmentAction.java
new file mode 100644
index 0000000..2d1736d
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/BugzillaUpdateAttachmentAction.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.action;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.forms.editor.IFormPage;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaUpdateAttachmentAction extends BaseSelectionListenerAction implements IViewActionDelegate {
+
+ private ISelection currentSelection;
+
+ private final boolean obsolete;
+
+ public BugzillaUpdateAttachmentAction(boolean obsolete) {
+ super("UpdateAttachmentAction"); //$NON-NLS-1$
+ this.obsolete = obsolete;
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @SuppressWarnings("unchecked")
+ public void run(IAction action) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ IWorkbenchPage page = window.getActivePage();
+ IEditorPart activeEditor = page.getActiveEditor();
+ if (activeEditor instanceof TaskEditor) {
+ final TaskEditor taskEditor = (TaskEditor) activeEditor;
+ IStructuredSelection selection = null;
+ if (currentSelection instanceof IStructuredSelection) {
+ selection = (IStructuredSelection) currentSelection;
+ }
+ if (selection == null || selection.isEmpty()) {
+ return;
+ }
+ List<ITaskAttachment> attachment = selection.toList();
+ if (attachment != null) {
+ final UpdateAttachmentJob job = new UpdateAttachmentJob(attachment, taskEditor, obsolete);
+ job.setUser(true);
+ job.addJobChangeListener(new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (job.getError() != null) {
+ IFormPage formPage = taskEditor.getActivePageInstance();
+ if (formPage instanceof BugzillaTaskEditorPage) {
+ final BugzillaTaskEditorPage bugzillaPage = (BugzillaTaskEditorPage) formPage;
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ bugzillaPage.getTaskEditor().setMessage(job.getError().getMessage(),
+ IMessageProvider.ERROR);
+ }
+ });
+ }
+ }
+ }
+ });
+ job.schedule();
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.currentSelection = selection;
+ IStructuredSelection sructuredSelection = null;
+ if (selection instanceof IStructuredSelection) {
+ sructuredSelection = (IStructuredSelection) currentSelection;
+ }
+ if (sructuredSelection == null || sructuredSelection.isEmpty()) {
+ return;
+ }
+ List<ITaskAttachment> attachmentList = sructuredSelection.toList();
+ action.setEnabled(false);
+ for (ITaskAttachment taskAttachment : attachmentList) {
+ TaskAttribute taskAttribute = taskAttachment.getTaskAttribute();
+ TaskAttribute deprecated = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ if (deprecated != null && deprecated.getValue().equals("1") != obsolete) { //$NON-NLS-1$
+ action.setEnabled(true);
+ break;
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/Messages.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/Messages.java
new file mode 100644
index 0000000..4ff7d36
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.action;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.ui.action.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String UpdateAttachmentJob_update_attachments;
+
+ public static String UpdateAttachmentJob_update_attachment;
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/UpdateAttachmentJob.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/UpdateAttachmentJob.java
new file mode 100644
index 0000000..8ae2010
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/UpdateAttachmentJob.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.action;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+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.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.BugzillaTaskEditorPage;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Frank Becker
+ */
+ at SuppressWarnings("restriction")
+public class UpdateAttachmentJob extends Job {
+
+ private final List<ITaskAttachment> attachment;
+
+ private final TaskEditor editor;
+
+ private final boolean obsolete;
+
+ private IStatus error;
+
+ public UpdateAttachmentJob(List<ITaskAttachment> attachment, TaskEditor editor, boolean obsolete) {
+ super(Messages.UpdateAttachmentJob_update_attachment);
+ this.attachment = attachment;
+ this.editor = editor;
+ this.obsolete = obsolete;
+ }
+
+ public IStatus getError() {
+ return error;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final ITask task;
+ task = editor.getTaskEditorInput().getTask();
+
+ if (!task.getConnectorKind().equals(BugzillaCorePlugin.CONNECTOR_KIND)) {
+ return Status.OK_STATUS;
+ }
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ monitor.beginTask(Messages.UpdateAttachmentJob_update_attachments, attachment.size() * 10 + 10);
+ try {
+ for (ITaskAttachment taskAttachment : attachment) {
+ TaskAttribute taskAttribute = taskAttachment.getTaskAttribute();
+ TaskAttribute deprecated = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ if (deprecated != null) {
+ if (deprecated.getValue().equals("1") && !obsolete) { //$NON-NLS-1$
+ try {
+ deprecated.setValue("0"); //$NON-NLS-1$
+ ((BugzillaTaskDataHandler) connector.getTaskDataHandler()).postUpdateAttachment(
+ taskAttachment.getTaskRepository(), taskAttribute, "update", monitor); //$NON-NLS-1$
+ } catch (CoreException e) {
+ error = e.getStatus();
+ deprecated.setValue("1"); //$NON-NLS-1$
+ return Status.OK_STATUS;
+ }
+ } else if (deprecated.getValue().equals("0") && obsolete) { //$NON-NLS-1$
+ try {
+ deprecated.setValue("1"); //$NON-NLS-1$
+ ((BugzillaTaskDataHandler) connector.getTaskDataHandler()).postUpdateAttachment(
+ taskAttachment.getTaskRepository(), taskAttribute, "update", monitor); //$NON-NLS-1$
+ } catch (CoreException e) {
+ error = e.getStatus();
+ deprecated.setValue("0"); //$NON-NLS-1$
+ return Status.OK_STATUS;
+ }
+ }
+ }
+ monitor.worked(10);
+ }
+
+ if (task != null) {
+ if (connector != null) {
+ TasksUiInternal.synchronizeTask(connector, task, true, new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ if (editor != null) {
+ editor.refreshPages();
+ editor.getEditorSite().getPage().activate(editor);
+ IFormPage formPage = editor.getActivePageInstance();
+ if (formPage instanceof BugzillaTaskEditorPage) {
+ BugzillaTaskEditorPage bugzillaPage = (BugzillaTaskEditorPage) formPage;
+ Control control = bugzillaPage.getPart(
+ AbstractTaskEditorPage.ID_PART_ATTACHMENTS).getControl();
+ if (control instanceof Section) {
+ Section section = (Section) control;
+ CommonFormUtil.setExpanded(section, true);
+ }
+ }
+
+ }
+ } finally {
+ if (editor != null) {
+ editor.showBusy(false);
+ }
+ }
+ }
+ });
+ }
+ });
+ }
+ monitor.worked(10);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (editor != null) {
+ editor.showBusy(true);
+ }
+ }
+ });
+ }
+ } catch (OperationCanceledException e) {
+ return Status.CANCEL_STATUS;
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/messages.properties b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/messages.properties
new file mode 100644
index 0000000..a23d1a7
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/action/messages.properties
@@ -0,0 +1,2 @@
+UpdateAttachmentJob_update_attachment=Update attachment
+UpdateAttachmentJob_update_attachments=Update attachments
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaCcAttributeEditor.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaCcAttributeEditor.java
new file mode 100644
index 0000000..303cdf3
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaCcAttributeEditor.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaCcAttributeEditor extends AbstractAttributeEditor {
+
+ private List list;
+
+ private TaskAttribute attrRemoveCc;
+
+ public BugzillaCcAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.SINGLE));
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ list = new List(parent, SWT.FLAT | SWT.MULTI | SWT.V_SCROLL);
+ toolkit.adapt(list, true, true);
+ list.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ list.setFont(JFaceResources.getDefaultFont());
+ GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(list);
+
+ TaskAttribute attrUserCC = getTaskAttribute();
+ if (attrUserCC != null) {
+ for (String value : attrUserCC.getValues()) {
+ list.add(value);
+ }
+ }
+
+ attrRemoveCc = getModel().getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.REMOVECC.getKey());
+
+ if (attrRemoveCc == null) {
+ attrRemoveCc = BugzillaTaskDataHandler.createAttribute(getModel().getTaskData(), BugzillaAttribute.REMOVECC);
+ }
+
+ for (String item : attrRemoveCc.getValues()) {
+ int i = list.indexOf(item);
+ if (i != -1) {
+ list.select(i);
+ }
+ }
+
+ list.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ for (String cc : list.getItems()) {
+ int index = list.indexOf(cc);
+ if (list.isSelected(index)) {
+ java.util.List<String> remove = attrRemoveCc.getValues();
+ if (!remove.contains(cc)) {
+ attrRemoveCc.addValue(cc);
+ }
+ } else {
+ attrRemoveCc.removeValue(cc);
+ }
+ }
+ getModel().attributeChanged(attrRemoveCc);
+ }
+ });
+
+ list.showSelection();
+
+ setControl(list);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaKeywordAttributeEditor.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaKeywordAttributeEditor.java
new file mode 100644
index 0000000..d3a1b5e
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaKeywordAttributeEditor.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaKeywordAttributeEditor extends AbstractAttributeEditor {
+
+ private Text keywordsText;
+
+ public BugzillaKeywordAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.MULTIPLE));
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Composite keywordComposite = toolkit.createComposite(parent);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginWidth = 1;
+ keywordComposite.setLayout(layout);
+
+ keywordsText = toolkit.createText(keywordComposite, getTaskAttribute().getValue());
+ GridData keywordsData = new GridData(GridData.FILL_HORIZONTAL);
+ keywordsText.setLayoutData(keywordsData);
+ keywordsText.setEditable(false);
+
+ Button changeKeywordsButton = toolkit.createButton(keywordComposite, Messages.BugzillaKeywordAttributeEditor_Edit_, SWT.FLAT);
+ GridData keyWordsButtonData = new GridData();
+ changeKeywordsButton.setLayoutData(keyWordsButtonData);
+ changeKeywordsButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+
+ String keywords = getTaskAttribute().getValue();
+
+ Shell shell = null;
+ if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ } else {
+ shell = new Shell(PlatformUI.getWorkbench().getDisplay());
+ }
+
+ List<String> validKeywords = new ArrayList<String>();
+ try {
+ validKeywords = BugzillaCorePlugin.getRepositoryConfiguration(getModel().getTaskRepository(),
+ false, new NullProgressMonitor()).getKeywords();
+ } catch (Exception ex) {
+ // ignore
+ }
+
+ KeywordsDialog keywordsDialog = new KeywordsDialog(shell, keywords, validKeywords);
+ int responseCode = keywordsDialog.open();
+
+ String newKeywords = keywordsDialog.getSelectedKeywordsString();
+ if (responseCode == Window.OK && keywords != null) {
+ keywordsText.setText(newKeywords);
+ getAttributeMapper().setValue(getTaskAttribute(), newKeywords);
+ attributeChanged();
+ } else {
+ return;
+ }
+
+ }
+
+ });
+ setControl(keywordComposite);
+ }
+
+ @Override
+ protected void decorateIncoming(Color color) {
+ if (keywordsText != null && !keywordsText.isDisposed()) {
+ keywordsText.setBackground(color);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaPeoplePart.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaPeoplePart.java
new file mode 100644
index 0000000..dab4711
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaPeoplePart.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaPeoplePart extends AbstractTaskEditorPart {
+
+ private static final int COLUMN_MARGIN = 5;
+
+ public BugzillaPeoplePart() {
+ setPartName(Messages.BugzillaPeoplePart_People);
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute) {
+ AbstractAttributeEditor editor = createAttributeEditor(attribute);
+ if (editor != null) {
+ editor.createLabelControl(composite, toolkit);
+ GridDataFactory.defaultsFor(editor.getLabelControl()).indent(COLUMN_MARGIN, 0).applyTo(
+ editor.getLabelControl());
+ editor.createControl(composite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ if (attribute.getId().equals(BugzillaAttribute.CC.getKey())) {
+ GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).hint(130, 95).applyTo(
+ editor.getControl());
+ } else {
+ GridDataFactory.fillDefaults()
+ .grab(true, false)
+ .align(SWT.FILL, SWT.TOP)
+ .hint(130, SWT.DEFAULT)
+ .applyTo(editor.getControl());
+ }
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Section section = createSection(parent, toolkit, true);
+ Composite peopleComposite = toolkit.createComposite(section);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginWidth = 5;
+ peopleComposite.setLayout(layout);
+
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED));
+ TaskAttribute assignee = getTaskData().getRoot().getAttribute(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ if (assignee != null) {
+ addAttribute(peopleComposite, toolkit, assignee);
+ }
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_REPORTER));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.QA_CONTACT.getKey()));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.NEWCC.getKey()));
+ addSelfToCC(peopleComposite);
+ TaskAttribute cc = getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.CC.getKey());
+ if (cc != null) {
+ addAttribute(peopleComposite, toolkit, cc);
+ toolkit.createLabel(peopleComposite, ""); //$NON-NLS-1$
+ Label label = toolkit.createLabel(peopleComposite, Messages.BugzillaPeoplePart__Select_to_remove_);
+ GridDataFactory.fillDefaults().indent(0, 5).align(SWT.CENTER, SWT.CENTER).applyTo(label);
+ }
+
+ toolkit.paintBordersFor(peopleComposite);
+ section.setClient(peopleComposite);
+ setSection(toolkit, section);
+ }
+
+ /**
+ * Creates a check box for adding the repository user to the cc list. Does nothing if the repository does not have a
+ * valid username, the repository user is the assignee, reporter or already on the the cc list.
+ */
+ protected void addSelfToCC(Composite composite) {
+
+ TaskRepository repository = this.getTaskEditorPage().getTaskRepository();
+
+ if (repository.getUserName() == null) {
+ return;
+ }
+
+ TaskAttribute root = getTaskData().getRoot();
+ TaskAttribute owner = root.getMappedAttribute(TaskAttribute.USER_ASSIGNED);
+ if (owner != null && owner.getValue().indexOf(repository.getUserName()) != -1) {
+ return;
+ }
+
+ TaskAttribute reporter = root.getMappedAttribute(TaskAttribute.USER_REPORTER);
+ if (reporter != null && reporter.getValue().indexOf(repository.getUserName()) != -1) {
+ return;
+ }
+
+ TaskAttribute ccAttribute = root.getMappedAttribute(TaskAttribute.USER_CC);
+ if (ccAttribute != null && ccAttribute.getValues().contains(repository.getUserName())) {
+ return;
+ }
+
+ FormToolkit toolkit = getManagedForm().getToolkit();
+ TaskAttribute attrAddToCC = getTaskData().getRoot().getMappedAttribute(TaskAttribute.ADD_SELF_CC);
+ if (attrAddToCC == null) {
+ attrAddToCC = BugzillaTaskDataHandler.createAttribute(getTaskData(), BugzillaAttribute.ADDSELFCC);
+ }
+ addAttribute(composite, toolkit, attrAddToCC);
+ }
+
+// protected void addCCList(Composite attributesComposite) {
+//
+// RepositoryTaskAttribute addCCattribute = taskData.getAttribute(RepositoryTaskAttribute.NEW_CC);
+// if (addCCattribute == null) {
+// // TODO: remove once TRAC is priming taskData with NEW_CC attribute
+// taskData.setAttributeValue(RepositoryTaskAttribute.NEW_CC, "");
+// addCCattribute = taskData.getAttribute(RepositoryTaskAttribute.NEW_CC);
+// }
+// if (addCCattribute != null) {
+// Label label = createLabel(attributesComposite, addCCattribute);
+// GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+// Text text = createTextField(attributesComposite, addCCattribute, SWT.FLAT);
+// GridDataFactory.fillDefaults().hint(150, SWT.DEFAULT).applyTo(text);
+//
+// if (hasContentAssist(addCCattribute)) {
+// ContentAssistCommandAdapter adapter = applyContentAssist(text,
+// createContentProposalProvider(addCCattribute));
+// ILabelProvider propsalLabelProvider = createProposalLabelProvider(addCCattribute);
+// if (propsalLabelProvider != null) {
+// adapter.setLabelProvider(propsalLabelProvider);
+// }
+// adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+// }
+// }
+//
+// TaskAttribute CCattribute = getTaskData().getAttribute(TaskAttribute.USER_CC);
+// if (CCattribute != null) {
+// Label label = createLabel(attributesComposite, CCattribute);
+// GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.TOP).applyTo(label);
+// ccList = new org.eclipse.swt.widgets.List(attributesComposite, SWT.MULTI | SWT.V_SCROLL);// SWT.BORDER
+// ccList.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+// ccList.setFont(TEXT_FONT);
+// GridData ccListData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+// ccListData.horizontalSpan = 1;
+// ccListData.widthHint = 150;
+// ccListData.heightHint = 95;
+// ccList.setLayoutData(ccListData);
+// if (hasChanged(taskData.getAttribute(RepositoryTaskAttribute.USER_CC))) {
+// ccList.setBackground(colorIncoming);
+// }
+// java.util.List<String> ccs = taskData.getCc();
+// if (ccs != null) {
+// for (String cc : ccs) {
+// ccList.add(cc);
+// }
+// }
+// java.util.List<String> removedCCs = taskData.getAttributeValues(RepositoryTaskAttribute.REMOVE_CC);
+// if (removedCCs != null) {
+// for (String item : removedCCs) {
+// int i = ccList.indexOf(item);
+// if (i != -1) {
+// ccList.select(i);
+// }
+// }
+// }
+// ccList.addSelectionListener(new SelectionListener() {
+//
+// public void widgetSelected(SelectionEvent e) {
+// for (String cc : ccList.getItems()) {
+// int index = ccList.indexOf(cc);
+// if (ccList.isSelected(index)) {
+// List<String> remove = taskData.getAttributeValues(RepositoryTaskAttribute.REMOVE_CC);
+// if (!remove.contains(cc)) {
+// taskData.addAttributeValue(RepositoryTaskAttribute.REMOVE_CC, cc);
+// }
+// } else {
+// taskData.removeAttributeValue(RepositoryTaskAttribute.REMOVE_CC, cc);
+// }
+// }
+// attributeChanged(taskData.getAttribute(RepositoryTaskAttribute.REMOVE_CC));
+// }
+//
+// public void widgetDefaultSelected(SelectionEvent e) {
+// }
+// });
+// toolkit.createLabel(attributesComposite, "");
+// label = toolkit.createLabel(attributesComposite, "(Select to remove)");
+// GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(label);
+// }
+
+// }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaPlanningEditorPart.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaPlanningEditorPart.java
new file mode 100644
index 0000000..5dde706
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaPlanningEditorPart.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import java.util.EnumSet;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaPlanningEditorPart extends AbstractTaskEditorPart {
+
+ private boolean hasIncoming;
+
+ private static final Set<BugzillaAttribute> PLANNING_ATTRIBUTES = EnumSet.of(BugzillaAttribute.ACTUAL_TIME,
+ BugzillaAttribute.ESTIMATED_TIME, BugzillaAttribute.WORK_TIME, BugzillaAttribute.REMAINING_TIME,
+ BugzillaAttribute.DEADLINE);
+
+ public BugzillaPlanningEditorPart() {
+ setPartName(Messages.BugzillaPlanningEditorPart_Team_Planning);
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ initialize();
+ Section timeSection = createSection(parent, toolkit, hasIncoming);
+
+ GridLayout gl = new GridLayout();
+ GridData gd = new GridData(SWT.FILL, SWT.NONE, false, false);
+ gd.horizontalSpan = 4;
+ timeSection.setLayout(gl);
+ timeSection.setLayoutData(gd);
+
+ Composite timeComposite = toolkit.createComposite(timeSection);
+ gl = new GridLayout(6, false);
+ timeComposite.setLayout(gl);
+ gd = new GridData();
+ gd.horizontalSpan = 4;
+ timeComposite.setLayoutData(gd);
+
+ TaskAttribute attribute = getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.DEADLINE.getKey());
+ if (attribute != null) {
+ AbstractAttributeEditor attributeEditor = createAttributeEditor(attribute);
+ attributeEditor.createLabelControl(timeComposite, toolkit);
+ attributeEditor.createControl(timeComposite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+ }
+
+ attribute = getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey());
+ AbstractAttributeEditor attributeEditor = createAttributeEditor(attribute);
+ attributeEditor.createLabelControl(timeComposite, toolkit);
+ attributeEditor.createControl(timeComposite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+
+ Label label = toolkit.createLabel(timeComposite, Messages.BugzillaPlanningEditorPart_Current_Estimate);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ float total = 0;
+ try {
+ TaskAttribute attrActualTime = getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.ACTUAL_TIME.getKey());
+ float actual = 0;
+ if (attrActualTime != null) {
+ actual = Float.parseFloat(attrActualTime.getValue());
+ }
+ TaskAttribute attrRemainingTime = getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.REMAINING_TIME.getKey());
+ float remaining = 0;
+ if (attrRemainingTime != null) {
+ remaining = Float.parseFloat(attrRemainingTime.getValue());
+ }
+ total = actual + remaining;
+ } catch (Exception e) {
+ // ignore NumberFormatException
+ }
+
+ Text currentEstimate = toolkit.createText(timeComposite, "" + total, SWT.FLAT | SWT.READ_ONLY); //$NON-NLS-1$
+ currentEstimate.setFont(TEXT_FONT);
+ toolkit.adapt(currentEstimate, false, false);
+ currentEstimate.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ currentEstimate.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+ attribute = getTaskData().getRoot().getMappedAttribute(BugzillaAttribute.ACTUAL_TIME.getKey());
+ if (attribute != null) {
+ attributeEditor = createAttributeEditor(attribute);
+ attributeEditor.createLabelControl(timeComposite, toolkit);
+ attributeEditor.createControl(timeComposite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+ }
+
+ // Add Time
+ TaskAttribute addTimeAttribute = getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.WORK_TIME.getKey());
+ if (addTimeAttribute == null) {
+ addTimeAttribute = BugzillaTaskDataHandler.createAttribute(getTaskData(), BugzillaAttribute.WORK_TIME);
+
+ }
+ if (addTimeAttribute != null) {
+ addTimeAttribute.setValue("0"); //$NON-NLS-1$
+ attributeEditor = createAttributeEditor(addTimeAttribute);
+ attributeEditor.createLabelControl(timeComposite, toolkit);
+ attributeEditor.createControl(timeComposite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+ }
+
+ attribute = getTaskData().getRoot().getAttribute(BugzillaAttribute.REMAINING_TIME.getKey());
+ if (attribute != null) {
+ attributeEditor = createAttributeEditor(attribute);
+ attributeEditor.createLabelControl(timeComposite, toolkit);
+ attributeEditor.createControl(timeComposite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+ }
+
+ timeSection.setClient(timeComposite);
+ toolkit.paintBordersFor(timeComposite);
+ setSection(toolkit, timeSection);
+
+ }
+
+ private void initialize() {
+ hasIncoming = false;
+ Map<String, TaskAttribute> attributes = getTaskData().getRoot().getAttributes();
+ for (TaskAttribute attribute : attributes.values()) {
+
+ BugzillaAttribute bugzillaAttribute = BugzillaAttribute.UNKNOWN;
+ try {
+ bugzillaAttribute = BugzillaAttribute.valueOf(attribute.getId().trim().toUpperCase(Locale.ENGLISH));
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ continue;
+ }
+ throw e;
+ }
+
+ if (PLANNING_ATTRIBUTES.contains(bugzillaAttribute)) {
+ if (getModel().hasIncomingChanges(attribute)) {
+ hasIncoming = true;
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPage.java
new file mode 100644
index 0000000..84ba6c1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPage.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCustomField;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryResponse;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelEvent;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelListener;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJobEvent;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorPartDescriptor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class BugzillaTaskEditorPage extends AbstractTaskEditorPage {
+
+ public static final String ID_PART_BUGZILLA_PLANNING = "org.eclipse.mylyn.bugzilla.ui.editors.part.planning"; //$NON-NLS-1$
+
+ public static final String ID_PART_BUGZILLA_FLAGS = "org.eclipse.mylyn.bugzilla.ui.editors.part.flags"; //$NON-NLS-1$
+
+ private final Map<TaskAttribute, AbstractAttributeEditor> attributeEditorMap;
+
+ private TaskDataModelListener productListener;
+
+ public BugzillaTaskEditorPage(TaskEditor editor) {
+ this(editor, BugzillaCorePlugin.CONNECTOR_KIND);
+ }
+
+ /**
+ * Call this constructor if extending the Bugzilla connector
+ *
+ * @param editor
+ * @param connectorKind
+ */
+ public BugzillaTaskEditorPage(TaskEditor editor, String connectorKind) {
+ super(editor, connectorKind);
+ this.attributeEditorMap = new HashMap<TaskAttribute, AbstractAttributeEditor>();
+ setNeedsPrivateSection(true);
+ setNeedsSubmitButton(true);
+ }
+
+ @Override
+ protected Set<TaskEditorPartDescriptor> createPartDescriptors() {
+ Set<TaskEditorPartDescriptor> descriptors = super.createPartDescriptors();
+
+ // remove unnecessary default editor parts
+ for (TaskEditorPartDescriptor taskEditorPartDescriptor : descriptors) {
+ if (taskEditorPartDescriptor.getId().equals(ID_PART_PEOPLE)) {
+ descriptors.remove(taskEditorPartDescriptor);
+ break;
+ }
+ }
+
+ // Add Bugzilla Planning part
+ try {
+ TaskData data = TasksUi.getTaskDataManager().getTaskData(getTask());
+ if (data != null) {
+ TaskAttribute attrEstimatedTime = data.getRoot().getMappedAttribute(
+ BugzillaAttribute.ESTIMATED_TIME.getKey());
+ if (attrEstimatedTime != null) {
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_BUGZILLA_PLANNING) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new BugzillaPlanningEditorPart();
+ }
+ }.setPath(PATH_ATTRIBUTES));
+ }
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+
+ // Add the updated Bugzilla people part
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_PEOPLE) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new BugzillaPeoplePart();
+ }
+ }.setPath(PATH_PEOPLE));
+
+ return descriptors;
+ }
+
+ @Override
+ protected AttributeEditorFactory createAttributeEditorFactory() {
+ AttributeEditorFactory factory = new AttributeEditorFactory(getModel(), getTaskRepository(), getEditorSite()) {
+ @Override
+ public AbstractAttributeEditor createEditor(String type, final TaskAttribute taskAttribute) {
+ AbstractAttributeEditor editor;
+ if (IBugzillaConstants.EDITOR_TYPE_KEYWORDS.equals(type)) {
+ editor = new BugzillaKeywordAttributeEditor(getModel(), taskAttribute);
+ } else if (IBugzillaConstants.EDITOR_TYPE_REMOVECC.equals(type)) {
+ editor = new BugzillaCcAttributeEditor(getModel(), taskAttribute);
+ } else if (IBugzillaConstants.EDITOR_TYPE_VOTES.equals(type)) {
+ editor = new BugzillaVotesEditor(getModel(), taskAttribute);
+ } else if (IBugzillaConstants.EDITOR_TYPE_FLAG.equals(type)) {
+ editor = new FlagAttributeEditor(getModel(), taskAttribute);
+ } else {
+ editor = super.createEditor(type, taskAttribute);
+ if (TaskAttribute.TYPE_BOOLEAN.equals(type)) {
+ editor.setDecorationEnabled(false);
+ }
+ }
+
+ if (editor != null && taskAttribute.getId().startsWith(BugzillaCustomField.CUSTOM_FIELD_PREFIX)) {
+ editor.setLayoutHint(new LayoutHint(editor.getLayoutHint()) {
+
+ @Override
+ public int getPriority() {
+ return super.getPriority() * 10;
+ }
+ });
+ }
+
+ TaskAttributeMetaData properties = taskAttribute.getMetaData();
+ if (editor != null && IBugzillaConstants.EDITOR_TYPE_FLAG.equals(properties.getType())) {
+ editor.setLayoutHint(new LayoutHint(editor.getLayoutHint()) {
+
+ @Override
+ public int getPriority() {
+ return super.getPriority() * 5;
+ }
+ });
+ }
+ BugzillaTaskEditorPage.this.addToAttributeEditorMap(taskAttribute, editor);
+ return editor;
+ }
+ };
+ return factory;
+ }
+
+ @Override
+ public void doSubmit() {
+ TaskAttribute summaryAttribute = getModel().getTaskData().getRoot().getMappedAttribute(TaskAttribute.SUMMARY);
+ if (summaryAttribute != null && summaryAttribute.getValue().length() == 0) {
+ getTaskEditor().setMessage(Messages.BugzillaTaskEditorPage_Please_enter_a_short_summary_before_submitting,
+ IMessageProvider.ERROR);
+ AbstractTaskEditorPart part = getPart(ID_PART_SUMMARY);
+ if (part != null) {
+ part.setFocus();
+ }
+ return;
+ }
+
+ TaskAttribute componentAttribute = getModel().getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.COMPONENT.getKey());
+ if (componentAttribute != null && componentAttribute.getValue().length() == 0) {
+ getTaskEditor().setMessage(Messages.BugzillaTaskEditorPage_Please_select_a_component_before_submitting,
+ IMessageProvider.ERROR);
+ AbstractTaskEditorPart part = getPart(ID_PART_ATTRIBUTES);
+ if (part != null) {
+ part.setFocus();
+ }
+ return;
+ }
+
+ TaskAttribute descriptionAttribute = getModel().getTaskData().getRoot().getMappedAttribute(
+ TaskAttribute.DESCRIPTION);
+ if (descriptionAttribute != null && descriptionAttribute.getValue().length() == 0
+ && getModel().getTaskData().isNew()) {
+ getTaskEditor().setMessage(Messages.BugzillaTaskEditorPage_Please_enter_a_description_before_submitting,
+ IMessageProvider.ERROR);
+ AbstractTaskEditorPart descriptionPart = getPart(ID_PART_DESCRIPTION);
+ if (descriptionPart != null) {
+ descriptionPart.setFocus();
+ }
+ return;
+ }
+
+ if (getModel().getTaskData().isNew()) {
+ TaskAttribute productAttribute = getModel().getTaskData().getRoot().getMappedAttribute(
+ TaskAttribute.PRODUCT);
+ if (productAttribute != null && productAttribute.getValue().length() > 0) {
+ getModel().getTaskRepository().setProperty(IBugzillaConstants.LAST_PRODUCT_SELECTION,
+ productAttribute.getValue());
+ }
+ TaskAttribute componentSelectedAttribute = getModel().getTaskData().getRoot().getMappedAttribute(
+ TaskAttribute.COMPONENT);
+ if (componentSelectedAttribute != null && componentSelectedAttribute.getValue().length() > 0) {
+ getModel().getTaskRepository().setProperty(IBugzillaConstants.LAST_COMPONENT_SELECTION,
+ componentSelectedAttribute.getValue());
+ }
+ }
+
+ // Force the most recent known good token onto the outgoing task data to ensure submit
+ // bug#263318
+ TaskAttribute attrToken = getModel().getTaskData().getRoot().getAttribute(BugzillaAttribute.TOKEN.getKey());
+ if (attrToken != null) {
+ attrToken.setValue(getModel().getTask().getAttribute(BugzillaAttribute.TOKEN.getKey()));
+ }
+
+ getTaskEditor().setMessage("", IMessageProvider.NONE); //$NON-NLS-1$
+ super.doSubmit();
+ }
+
+ @Override
+ protected void createParts() {
+ attributeEditorMap.clear();
+ super.createParts();
+ }
+
+ @Override
+ protected TaskDataModel createModel(TaskEditorInput input) throws CoreException {
+ TaskDataModel model = super.createModel(input);
+ productListener = new ProductSelectionListener();
+ model.addModelListener(productListener);
+ return model;
+ }
+
+ /**
+ * @since 3.1
+ */
+ private void addToAttributeEditorMap(TaskAttribute attribute, AbstractAttributeEditor editor) {
+ if (attributeEditorMap.containsKey(attribute)) {
+ attributeEditorMap.remove(attribute);
+ }
+ attributeEditorMap.put(attribute, editor);
+ }
+
+ /**
+ * @since 3.1
+ */
+ private AbstractAttributeEditor getEditorForAttribute(TaskAttribute attribute) {
+ return attributeEditorMap.get(attribute);
+ }
+
+ private void refresh(TaskAttribute attributeComponent) {
+ AbstractAttributeEditor editor = getEditorForAttribute(attributeComponent);
+ if (editor != null) {
+ try {
+ editor.refresh();
+ } catch (UnsupportedOperationException e) {
+ // ignore
+ }
+ }
+ }
+
+ private class ProductSelectionListener extends TaskDataModelListener {
+ @Override
+ public void attributeChanged(TaskDataModelEvent event) {
+ TaskAttribute taskAttribute = event.getTaskAttribute();
+ if (taskAttribute != null) {
+ if (taskAttribute.getId().equals(BugzillaAttribute.PRODUCT.getKey())) {
+ RepositoryConfiguration repositoryConfiguration = null;
+ try {
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(
+ getModel().getTaskRepository(), false, new NullProgressMonitor());
+ } catch (CoreException e) {
+ StatusHandler.log(new RepositoryStatus(getTaskRepository(), IStatus.ERROR,
+ BugzillaUiPlugin.ID_PLUGIN, 0, "Failed to obtain repository configuration", e)); //$NON-NLS-1$
+ getTaskEditor().setMessage("Problem occured when updating attributes", IMessageProvider.ERROR); //$NON-NLS-1$
+ return;
+ }
+
+ TaskAttribute attributeComponent = taskAttribute.getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.COMPONENT.getKey());
+ if (attributeComponent != null) {
+ List<String> optionValues = repositoryConfiguration.getComponents(taskAttribute.getValue());
+ Collections.sort(optionValues);
+ attributeComponent.clearOptions();
+ for (String option : optionValues) {
+ attributeComponent.putOption(option, option);
+ }
+ if (optionValues.size() == 1) {
+ attributeComponent.setValue(optionValues.get(0));
+ } else {
+ attributeComponent.setValue(""); //$NON-NLS-1$
+ }
+ refresh(attributeComponent);
+ }
+
+ TaskAttribute attributeTargetMilestone = taskAttribute.getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.TARGET_MILESTONE.getKey());
+ if (attributeTargetMilestone != null) {
+ List<String> optionValues = repositoryConfiguration.getTargetMilestones(taskAttribute.getValue());
+ Collections.sort(optionValues);
+ attributeTargetMilestone.clearOptions();
+ for (String option : optionValues) {
+ attributeTargetMilestone.putOption(option, option);
+ }
+ if (optionValues.size() == 1) {
+ attributeTargetMilestone.setValue(optionValues.get(0));
+ } else {
+ attributeTargetMilestone.setValue("---"); //$NON-NLS-1$
+ }
+ refresh(attributeTargetMilestone);
+ }
+
+ TaskAttribute attributeVersion = taskAttribute.getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.VERSION.getKey());
+ if (attributeVersion != null) {
+ List<String> optionValues = repositoryConfiguration.getVersions(taskAttribute.getValue());
+ Collections.sort(optionValues);
+ attributeVersion.clearOptions();
+ for (String option : optionValues) {
+ attributeVersion.putOption(option, option);
+ }
+ if (optionValues.size() == 1) {
+ attributeVersion.setValue(optionValues.get(0));
+ } else {
+ attributeVersion.setValue("unspecified"); //$NON-NLS-1$
+ }
+ refresh(attributeVersion);
+ }
+
+ TaskAttribute attributeDefaultAssignee = taskAttribute.getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ if (attributeDefaultAssignee != null) {
+ attributeDefaultAssignee.setValue("1"); //$NON-NLS-1$
+ refresh(attributeDefaultAssignee);
+ }
+
+/*
+ * add confirm_product_change to avoid verification page on submit
+ */
+ TaskAttribute attributeConfirmeProductChange = taskAttribute.getTaskData()
+ .getRoot()
+ .getMappedAttribute(BugzillaAttribute.CONFIRM_PRODUCT_CHANGE.getKey());
+ if (attributeConfirmeProductChange == null) {
+ attributeConfirmeProductChange = BugzillaTaskDataHandler.createAttribute(
+ taskAttribute.getTaskData().getRoot(), BugzillaAttribute.CONFIRM_PRODUCT_CHANGE);
+ }
+ if (attributeConfirmeProductChange != null) {
+ attributeConfirmeProductChange.setValue("1"); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void handleTaskSubmitted(SubmitJobEvent event) {
+ if (event.getJob().getResponse() != null && event.getJob().getResponse() instanceof BugzillaRepositoryResponse) {
+ final RepositoryResponse response = event.getJob().getResponse();
+ getTaskEditor().setMessage(Messages.BugzillaTaskEditorPage_Changes_Submitted_Message,
+ IMessageProvider.INFORMATION, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent event) {
+ String mes = ""; //$NON-NLS-1$
+ if (response instanceof BugzillaRepositoryResponse) {
+ BugzillaRepositoryResponse bugzillaResponse = (BugzillaRepositoryResponse) response;
+ for (String iterable_element : bugzillaResponse.getResponseData().keySet()) {
+ mes += NLS.bind(Messages.BugzillaTaskEditorPage_Changes_Submitted_Action_Line,
+ iterable_element);
+ List<String> o = bugzillaResponse.getResponseData().get(iterable_element);
+ for (String string : o) {
+ mes += NLS.bind(Messages.BugzillaTaskEditorPage_Changes_Submitted_Email_Line,
+ string);
+ }
+ }
+ new MessageDialog(WorkbenchUtil.getShell(),
+ Messages.BugzillaTaskEditorPage_Changes_Submitted_Titel, null, mes,
+ MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0).open();
+ }
+ }
+ });
+ } else {
+ super.handleTaskSubmitted(event);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java
new file mode 100644
index 0000000..2579a56
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaTaskEditorPageFactory.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.forms.editor.IFormPage;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaTaskEditorPageFactory extends AbstractTaskEditorPageFactory {
+
+ @Override
+ public boolean canCreatePageFor(TaskEditorInput input) {
+ if (input.getTask().getConnectorKind().equals(BugzillaCorePlugin.CONNECTOR_KIND)
+ || TasksUiUtil.isOutgoingNewTask(input.getTask(), BugzillaCorePlugin.CONNECTOR_KIND)) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public IFormPage createPage(TaskEditor parentEditor) {
+ return new BugzillaTaskEditorPage(parentEditor);
+ }
+
+ @Override
+ public String[] getConflictingIds(TaskEditorInput input) {
+ return new String[] { ITasksUiConstants.ID_PAGE_PLANNING };
+ }
+
+ @Override
+ public int getPriority() {
+ return PRIORITY_TASK;
+ }
+
+ @Override
+ public Image getPageImage() {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY_SMALL);
+ }
+
+ @Override
+ public String getPageText() {
+ return "Bugzilla"; //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaVotesEditor.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaVotesEditor.java
new file mode 100644
index 0000000..d2ba620
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/BugzillaVotesEditor.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+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.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaVotesEditor extends AbstractAttributeEditor {
+
+ // Copy from <code>TaskEditorAttributePart</code>
+ private static final int LABEL_WIDTH = 100;
+
+ // Copy from TaskEditorAttributePart
+ private static final int COLUMN_GAP = 5;
+
+ public BugzillaVotesEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ }
+
+ private Hyperlink voteControl;
+
+ private Label hiddenLabel;
+
+ private Hyperlink showVotes;
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ ((GridData) getLabelControl().getLayoutData()).exclude = true;
+ showVotes = toolkit.createHyperlink(parent, getTaskAttribute().getValue(), SWT.NONE);
+ showVotes.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ showVotes.setToolTipText(Messages.BugzillaVotesEditor_Show_votes);
+ showVotes.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TasksUiUtil.openUrl(getTaskAttribute().getTaskData().getRepositoryUrl()
+ + IBugzillaConstants.URL_SHOW_VOTES + getTaskAttribute().getTaskData().getTaskId());
+ }
+ });
+ setControl(showVotes);
+ }
+
+ @Override
+ public void createLabelControl(Composite composite, FormToolkit toolkit) {
+ voteControl = toolkit.createHyperlink(composite, getLabel(), SWT.NONE);
+ voteControl.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ voteControl.setToolTipText(Messages.BugzillaVotesEditor_Vote);
+ voteControl.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TasksUiUtil.openUrl(getTaskAttribute().getTaskData().getRepositoryUrl() + IBugzillaConstants.URL_VOTE
+ + getTaskAttribute().getTaskData().getTaskId());
+ }
+ });
+
+ GridData gd = GridDataFactory.fillDefaults()
+ .align(SWT.RIGHT, SWT.CENTER)
+ .hint(LABEL_WIDTH, SWT.DEFAULT)
+ .create();
+
+ gd.horizontalIndent = COLUMN_GAP;
+ gd.widthHint = LABEL_WIDTH + COLUMN_GAP;
+
+ voteControl.setLayoutData(gd);
+
+ hiddenLabel = toolkit.createLabel(composite, ""); //$NON-NLS-1$
+ GridData data = new GridData();
+ data.exclude = true;
+ hiddenLabel.setLayoutData(data);
+ }
+
+ @Override
+ protected void decorateOutgoing(Color color) {
+ // ignore
+ }
+
+ @Override
+ public Label getLabelControl() {
+ return hiddenLabel;
+ }
+
+ public String getValue() {
+ return getAttributeMapper().getValue(getTaskAttribute());
+ }
+
+ public void setValue(String text) {
+ getAttributeMapper().setValue(getTaskAttribute(), text);
+ attributeChanged();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/FlagAttributeEditor.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/FlagAttributeEditor.java
new file mode 100644
index 0000000..47bca65
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/FlagAttributeEditor.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.editor;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Frank Becker
+ */
+public class FlagAttributeEditor extends AbstractAttributeEditor {
+
+ private String[] values;
+
+ private CCombo combo;
+
+ private Text requesteeText;
+
+ public FlagAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE));
+ if (taskAttribute.getAttribute("state") != null) { //$NON-NLS-1$
+ setReadOnly(taskAttribute.getAttribute("state").getMetaData().isReadOnly()); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Composite composite = toolkit.createComposite(parent);
+ GridLayout layout = new GridLayout(3, false);
+ layout.marginWidth = 1;
+ composite.setLayout(layout);
+ if (isReadOnly()) {
+ Text text = new Text(composite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(text, false, false);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ text.setText(getValueLabel());
+ String tooltip = getTaskAttribute().getMetaData().getLabel();
+ if (tooltip != null) {
+ text.setToolTipText(tooltip);
+ }
+ } else {
+ combo = new CCombo(composite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(combo, false, false);
+ combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ String tooltip = getTaskAttribute().getMetaData().getLabel();
+ if (tooltip != null) {
+ combo.setToolTipText(tooltip);
+ }
+
+ Map<String, String> labelByValue = getAttributeMapper().getAssoctiatedAttribute(getTaskAttribute())
+ .getOptions();
+ if (labelByValue != null) {
+ values = labelByValue.keySet().toArray(new String[0]);
+ for (String value : values) {
+ combo.add(labelByValue.get(value));
+ }
+ }
+
+ select(getValue(), getValueLabel());
+
+ if (values != null) {
+ combo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ int index = combo.getSelectionIndex();
+ if (index > -1) {
+ Assert.isNotNull(values);
+ Assert.isLegal(index >= 0 && index <= values.length - 1);
+ setValue(values[index]);
+ if (requesteeText != null) {
+ requesteeText.setEnabled(values[index].equals("?")); //$NON-NLS-1$
+ }
+ }
+ }
+ });
+ }
+ TaskAttribute requestee = getTaskAttribute().getAttribute("requestee"); //$NON-NLS-1$
+ if (requestee != null && !requestee.getMetaData().isReadOnly()) {
+ requesteeText = toolkit.createText(composite, requestee.getValue());
+ requesteeText.setEnabled("?".equals(getValueLabel())); //$NON-NLS-1$
+ GridData requesteeData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ requesteeData.widthHint = 78;
+ requesteeText.setLayoutData(requesteeData);
+ requesteeText.addFocusListener(new FocusListener() {
+
+ public void focusGained(FocusEvent e) {
+ }
+
+ public void focusLost(FocusEvent e) {
+ setRequestee(requesteeText.getText());
+ }
+ });
+ }
+ }
+ toolkit.paintBordersFor(composite);
+ setControl(composite);
+ }
+
+ public String getValue() {
+// return getAttributeMapper().getValue(getTaskAttribute());
+ return getAttributeMapper().getValue(getAttributeMapper().getAssoctiatedAttribute(getTaskAttribute()));
+ }
+
+ public String getValueLabel() {
+// return getAttributeMapper().getValueLabel(getTaskAttribute());
+ return getAttributeMapper().getValueLabel(getAttributeMapper().getAssoctiatedAttribute(getTaskAttribute()));
+ }
+
+ private void select(String value, String label) {
+ if (values != null) {
+ for (int i = 0; i < values.length; i++) {
+ if (values[i].equals(value)) {
+ combo.select(i);
+ break;
+ }
+ }
+ } else {
+ combo.setText(label);
+ }
+ }
+
+ public void setRequestee(String value) {
+ TaskAttribute requestee = getTaskAttribute().getAttribute("requestee"); //$NON-NLS-1$
+ if (requestee != null) {
+ getAttributeMapper().setValue(getTaskAttribute().getAttribute("requestee"), value); //$NON-NLS-1$
+ attributeChanged();
+ }
+ }
+
+ public void setValue(String value) {
+ getAttributeMapper().setValue(getAttributeMapper().getAssoctiatedAttribute(getTaskAttribute()), value);
+ attributeChanged();
+ }
+
+ @Override
+ public String getLabel() {
+ String label = getAttributeMapper().getLabel(getAttributeMapper().getAssoctiatedAttribute(getTaskAttribute()));
+ if (label != null) {
+ label.replace("&", "&&"); //$NON-NLS-1$//$NON-NLS-2$
+ } else {
+ label = ""; //$NON-NLS-1$
+ }
+
+ TaskAttribute setter = getTaskAttribute().getAttribute("setter"); //$NON-NLS-1$
+ if (setter != null) {
+ String setterValue = setter.getValue();
+ if (setterValue != null && !setterValue.equals("")) { //$NON-NLS-1$
+ if (setterValue.indexOf("@") != 0) { //$NON-NLS-1$
+ setterValue = setterValue.substring(0, setterValue.indexOf("@")); //$NON-NLS-1$
+ }
+ label = setterValue + ": " + label; //$NON-NLS-1$
+ }
+ }
+ return label;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/KeywordsDialog.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/KeywordsDialog.java
new file mode 100644
index 0000000..396920a
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/KeywordsDialog.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+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.Shell;
+
+/**
+ * @author Shawn Minto
+ */
+public class KeywordsDialog extends Dialog {
+
+ private final List<String> selectedKeywords;
+
+ private final List<String> validKeywords;
+
+ private CheckboxTableViewer keyWordsList;
+
+ public KeywordsDialog(Shell shell, String selectedKeywords, java.util.List<String> validKeywords) {
+ super(shell);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ StringTokenizer st = new StringTokenizer(selectedKeywords, ",", false); //$NON-NLS-1$
+ this.selectedKeywords = new ArrayList<String>();
+ while (st.hasMoreTokens()) {
+ String s = st.nextToken().trim();
+ this.selectedKeywords.add(s);
+ }
+
+ this.validKeywords = validKeywords;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText(Messages.KeywordsDialog_Select_Keywords);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+ composite.setLayoutData(gd);
+
+ keyWordsList = CheckboxTableViewer.newCheckList(composite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ GridData keyWordsTextData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+ keyWordsTextData.heightHint = 175;
+ keyWordsTextData.widthHint = 160;
+ keyWordsList.getTable().setLayoutData(keyWordsTextData);
+
+ if (validKeywords != null) {
+
+ keyWordsList.setContentProvider(new ITreeContentProvider() {
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection<?>) {
+ return ((Collection<?>) parentElement).toArray();
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ });
+
+ Set<String> invalidKeywords = new HashSet<String>();
+
+ keyWordsList.setInput(validKeywords);
+
+ for (String keyword : selectedKeywords) {
+ if (!keyWordsList.setChecked(keyword, true)) {
+ invalidKeywords.add(keyword);
+ }
+ }
+
+ selectedKeywords.removeAll(invalidKeywords);
+
+ }
+
+ keyWordsList.addCheckStateListener(new KeywordListener());
+
+ parent.pack();
+
+ applyDialogFont(composite);
+
+ return composite;
+ }
+
+ protected class KeywordListener implements ICheckStateListener {
+
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ if (event.getChecked()) {
+ selectedKeywords.add((String) event.getElement());
+ } else {
+ selectedKeywords.remove(event.getElement());
+ }
+ }
+
+ }
+
+ public List<String> getSelectedKeywords() {
+ return selectedKeywords;
+ }
+
+ public String getSelectedKeywordsString() {
+ StringBuffer keywords = new StringBuffer();
+
+ for (String sel : selectedKeywords) {
+ keywords.append(sel);
+ keywords.append(","); //$NON-NLS-1$
+ }
+
+ String keywordsString = keywords.toString();
+
+ if (keywordsString.endsWith(",")) { //$NON-NLS-1$
+ keywordsString = keywordsString.substring(0, keywordsString.length() - 1);
+ }
+
+ return keywordsString;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/Messages.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/Messages.java
new file mode 100644
index 0000000..7ab3aaa
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/Messages.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.editor;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.ui.editor.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String BugzillaKeywordAttributeEditor_Edit_;
+
+ public static String BugzillaPeoplePart_People;
+
+ public static String BugzillaPeoplePart__Select_to_remove_;
+
+ public static String BugzillaPlanningEditorPart_Current_Estimate;
+
+ public static String BugzillaPlanningEditorPart_Team_Planning;
+
+ public static String BugzillaTaskEditorPage_Changes_Submitted_Action_Line;
+
+ public static String BugzillaTaskEditorPage_Changes_Submitted_Email_Line;
+
+ public static String BugzillaTaskEditorPage_Changes_Submitted_Message;
+
+ public static String BugzillaTaskEditorPage_Changes_Submitted_Titel;
+
+ public static String BugzillaTaskEditorPage_Please_enter_a_description_before_submitting;
+
+ public static String BugzillaTaskEditorPage_Please_enter_a_short_summary_before_submitting;
+
+ public static String BugzillaTaskEditorPage_Please_select_a_component_before_submitting;
+
+ public static String BugzillaVotesEditor_Show_votes;
+
+ public static String BugzillaVotesEditor_Vote;
+
+ public static String KeywordsDialog_Select_Keywords;
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/messages.properties b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/messages.properties
new file mode 100644
index 0000000..eaefd75
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/editor/messages.properties
@@ -0,0 +1,20 @@
+BugzillaKeywordAttributeEditor_Edit_=Edit...
+
+BugzillaPeoplePart_People=People
+BugzillaPeoplePart__Select_to_remove_=(Select to remove)
+
+BugzillaPlanningEditorPart_Current_Estimate=Current Estimate:
+BugzillaPlanningEditorPart_Team_Planning=Team Planning
+
+BugzillaTaskEditorPage_Changes_Submitted_Action_Line={0}\n
+BugzillaTaskEditorPage_Changes_Submitted_Email_Line=\ \ \ \ \ \ \ \ {0}\n
+BugzillaTaskEditorPage_Changes_Submitted_Message=Changes submitted
+BugzillaTaskEditorPage_Changes_Submitted_Titel=Changes submitted
+BugzillaTaskEditorPage_Please_enter_a_description_before_submitting=Please enter a description before submitting
+BugzillaTaskEditorPage_Please_enter_a_short_summary_before_submitting=Please enter a short summary before submitting
+BugzillaTaskEditorPage_Please_select_a_component_before_submitting=Please select a component before submitting
+
+BugzillaVotesEditor_Show_votes=Show votes
+BugzillaVotesEditor_Vote=Vote
+
+KeywordsDialog_Select_Keywords=Select Keywords
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchPage.java
new file mode 100644
index 0000000..40a0f8c
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSearchPage.java
@@ -0,0 +1,1948 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.DialogSettings;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ComboContentAdapter;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.KeywordsDialog;
+import org.eclipse.mylyn.internal.tasks.ui.util.WebBrowserDialog;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.progress.IProgressService;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+
+/**
+ * Bugzilla search page
+ *
+ * @author Mik Kersten (hardening of prototype)
+ * @author Frank Becker
+ */
+public class BugzillaSearchPage extends AbstractRepositoryQueryPage implements Listener {
+
+ private static final int HEIGHT_ATTRIBUTE_COMBO = 70;
+
+ // protected Combo repositoryCombo = null;
+
+ private static ArrayList<BugzillaSearchData> previousSummaryPatterns = new ArrayList<BugzillaSearchData>(20);
+
+ private static ArrayList<BugzillaSearchData> previousEmailPatterns = new ArrayList<BugzillaSearchData>(20);
+
+ private static ArrayList<BugzillaSearchData> previousEmailPatterns2 = new ArrayList<BugzillaSearchData>(20);
+
+ private static ArrayList<BugzillaSearchData> previousCommentPatterns = new ArrayList<BugzillaSearchData>(20);
+
+ private static ArrayList<BugzillaSearchData> previousKeywords = new ArrayList<BugzillaSearchData>(20);
+
+ private boolean firstTime = true;
+
+ private IDialogSettings fDialogSettings;
+
+ private static final String[] patternOperationText = { Messages.BugzillaSearchPage_all_words,
+ Messages.BugzillaSearchPage_any_word, Messages.BugzillaSearchPage_regexp,
+ Messages.BugzillaSearchPage_notregexp };
+
+ private static final String[] patternOperationValues = { "allwordssubstr", "anywordssubstr", "regexp", "notregexp" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+
+ private static final String[] emailOperationText = { Messages.BugzillaSearchPage_substring,
+ Messages.BugzillaSearchPage_exact, Messages.BugzillaSearchPage_regexp,
+ Messages.BugzillaSearchPage_notregexp };
+
+ private static final String[] emailOperationValues = { "substring", "exact", "regexp", "notregexp" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+
+ private static final String[] keywordOperationText = { Messages.BugzillaSearchPage_all,
+ Messages.BugzillaSearchPage_any, Messages.BugzillaSearchPage_none };
+
+ private static final String[] keywordOperationValues = { "allwords", "anywords", "nowords" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+
+ private static final String[] emailRoleValues = { "emailassigned_to1", "emailreporter1", "emailcc1", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ "emaillongdesc1" }; //$NON-NLS-1$
+
+ private static final String[] emailRoleValues2 = { "emailassigned_to2", "emailreporter2", "emailcc2", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ "emaillongdesc2" }; //$NON-NLS-1$
+
+ // dialog store id constants
+ private final static String DIALOG_BOUNDS_KEY = "ResizableDialogBounds"; //$NON-NLS-1$
+
+ private static final String X = "x"; //$NON-NLS-1$
+
+ private static final String Y = "y"; //$NON-NLS-1$
+
+ private static final String WIDTH = "width"; //$NON-NLS-1$
+
+ private static final String HEIGHT = "height"; //$NON-NLS-1$
+
+ private IRepositoryQuery originalQuery = null;
+
+ protected boolean restoring = false;
+
+ private boolean restoreQueryOptions = true;
+
+ protected Combo summaryPattern;
+
+ protected Combo summaryOperation;
+
+ protected List product;
+
+ protected List os;
+
+ protected List hardware;
+
+ protected List priority;
+
+ protected List severity;
+
+ protected List resolution;
+
+ protected List status;
+
+ protected Combo commentOperation;
+
+ protected Combo commentPattern;
+
+ protected List component;
+
+ protected List version;
+
+ protected List target;
+
+ protected Combo emailOperation;
+
+ protected Combo emailOperation2;
+
+ protected Combo emailPattern;
+
+ protected Combo emailPattern2;
+
+ protected Button[] emailButtons;
+
+ protected Button[] emailButtons2;
+
+ private Combo keywords;
+
+ private Combo keywordsOperation;
+
+ protected Text daysText;
+
+ // /** File containing saved queries */
+ // protected static SavedQueryFile input;
+
+ // /** "Remember query" button */
+ // protected Button saveButton;
+
+ // /** "Saved queries..." button */
+ // protected Button loadButton;
+
+ // /** Run a remembered query */
+ // protected boolean rememberedQuery = false;
+
+ /** Index of the saved query to run */
+ protected int selIndex;
+
+ // --------------- Configuration handling --------------
+
+ // Dialog store taskId constants
+ protected final static String PAGE_NAME = "BugzillaSearchPage"; //$NON-NLS-1$
+
+ private static final String STORE_PRODUCT_ID = PAGE_NAME + ".PRODUCT"; //$NON-NLS-1$
+
+ private static final String STORE_COMPONENT_ID = PAGE_NAME + ".COMPONENT"; //$NON-NLS-1$
+
+ private static final String STORE_VERSION_ID = PAGE_NAME + ".VERSION"; //$NON-NLS-1$
+
+ private static final String STORE_MSTONE_ID = PAGE_NAME + ".MILESTONE"; //$NON-NLS-1$
+
+ private static final String STORE_STATUS_ID = PAGE_NAME + ".STATUS"; //$NON-NLS-1$
+
+ private static final String STORE_RESOLUTION_ID = PAGE_NAME + ".RESOLUTION"; //$NON-NLS-1$
+
+ private static final String STORE_SEVERITY_ID = PAGE_NAME + ".SEVERITY"; //$NON-NLS-1$
+
+ private static final String STORE_PRIORITY_ID = PAGE_NAME + ".PRIORITY"; //$NON-NLS-1$
+
+ private static final String STORE_HARDWARE_ID = PAGE_NAME + ".HARDWARE"; //$NON-NLS-1$
+
+ private static final String STORE_OS_ID = PAGE_NAME + ".OS"; //$NON-NLS-1$
+
+ private static final String STORE_SUMMARYMATCH_ID = PAGE_NAME + ".SUMMARYMATCH"; //$NON-NLS-1$
+
+ private static final String STORE_COMMENTMATCH_ID = PAGE_NAME + ".COMMENTMATCH"; //$NON-NLS-1$
+
+ private static final String STORE_EMAILMATCH_ID = PAGE_NAME + ".EMAILMATCH"; //$NON-NLS-1$
+
+ private static final String STORE_EMAIL2MATCH_ID = PAGE_NAME + ".EMAIL2MATCH"; //$NON-NLS-1$
+
+ private static final String STORE_EMAILBUTTON_ID = PAGE_NAME + ".EMAILATTR"; //$NON-NLS-1$
+
+ private static final String STORE_EMAIL2BUTTON_ID = PAGE_NAME + ".EMAIL2ATTR"; //$NON-NLS-1$
+
+ private static final String STORE_SUMMARYTEXT_ID = PAGE_NAME + ".SUMMARYTEXT"; //$NON-NLS-1$
+
+ private static final String STORE_COMMENTTEXT_ID = PAGE_NAME + ".COMMENTTEXT"; //$NON-NLS-1$
+
+ private static final String STORE_EMAILADDRESS_ID = PAGE_NAME + ".EMAILADDRESS"; //$NON-NLS-1$
+
+ private static final String STORE_EMAIL2ADDRESS_ID = PAGE_NAME + ".EMAIL2ADDRESS"; //$NON-NLS-1$
+
+ private static final String STORE_KEYWORDS_ID = PAGE_NAME + ".KEYWORDS"; //$NON-NLS-1$
+
+ private static final String STORE_KEYWORDSMATCH_ID = PAGE_NAME + ".KEYWORDSMATCH"; //$NON-NLS-1$
+
+ // private static final String STORE_REPO_ID = PAGE_NAME + ".REPO";
+
+ private RepositoryConfiguration repositoryConfiguration;
+
+ private final SelectionAdapter updateActionSelectionAdapter = new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (isControlCreated()) {
+ setPageComplete(isPageComplete());
+ }
+ }
+ };
+
+ private Text queryTitle;
+
+ private final class ModifyListenerImplementation implements ModifyListener {
+ public void modifyText(ModifyEvent e) {
+ if (isControlCreated()) {
+ setPageComplete(isPageComplete());
+ }
+ }
+ }
+
+ @Override
+ public void setPageComplete(boolean complete) {
+ super.setPageComplete(complete);
+ if (getSearchContainer() != null) {
+ getSearchContainer().setPerformActionEnabled(complete);
+ }
+ }
+
+ private static class BugzillaSearchData {
+ /** Pattern to match on */
+ String pattern;
+
+ /** Pattern matching criterion */
+ int operation;
+
+ BugzillaSearchData(String pattern, int operation) {
+ this.pattern = pattern;
+ this.operation = operation;
+ }
+ }
+
+ public BugzillaSearchPage(TaskRepository repository) {
+ super(Messages.BugzillaSearchPage_Bugzilla_Query, repository);
+ // setTitle(TITLE);
+ // setDescription(DESCRIPTION);
+ // setImageDescriptor(TaskListImages.BANNER_REPOSITORY);
+ // setPageComplete(false);
+// try {
+// repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository, false);
+// } catch (final CoreException e) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// MessageDialog.openError(Display.getDefault().getActiveShell(), "Bugzilla Search Page",
+// "Unable to get configuration. Ensure proper repository configuration in "
+// + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".\n\n");
+// }
+// });
+// }
+ }
+
+ public BugzillaSearchPage(TaskRepository repository, IRepositoryQuery origQuery) {
+ super(Messages.BugzillaSearchPage_Bugzilla_Query, repository, origQuery);
+ originalQuery = origQuery;
+ setDescription(Messages.BugzillaSearchPage_Select_the_Bugzilla_query_parameters);
+ // setTitle(TITLE);
+ // setDescription(DESCRIPTION);
+ // setPageComplete(false);
+// try {
+// repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository, false);
+// } catch (final CoreException e) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// MessageDialog.openError(Display.getDefault().getActiveShell(), "Bugzilla Search Page",
+// "Unable to get configuration. Ensure proper repository configuration in "
+// + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".\n\n");
+// }
+// });
+// }
+ }
+
+ public void createControl(Composite parent) {
+ readConfiguration();
+
+ Composite control = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ control.setLayout(layout);
+ control.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL));
+
+// if (scontainer == null) {
+ // Not presenting in search pane so want query title
+// super.createControl(control);
+// Label lblName = new Label(control, SWT.NONE);
+// final GridData gridData = new GridData();
+// lblName.setLayoutData(gridData);
+// lblName.setText("Query Title:");
+//
+// title = new Text(control, SWT.BORDER);
+// title.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
+// title.addModifyListener(new ModifyListener() {
+// public void modifyText(ModifyEvent e) {
+// setPageComplete(isPageComplete());
+// }
+// });
+// }
+
+ // else {
+ // // if (repository == null) {
+ // // search pane so add repository selection
+ // createRepositoryGroup(control);
+ // }
+ createOptionsGroup(control);
+ createSearchGroup(control);
+
+ // createSaveQuery(control);
+ // createMaxHits(control);
+ // input = new SavedQueryFile(BugzillaPlugin.getDefault().getStateLocation().toString(), "/queries");
+ // createUpdate(control);
+ // if (originalQuery != null) {
+ // try {
+ // updateDefaults(originalQuery.getQueryUrl(), String.valueOf(originalQuery.getMaxHits()));
+ // } catch (UnsupportedEncodingException e) {
+ // // ignore
+ // }
+ // }
+ Dialog.applyDialogFont(control);
+ setControl(control);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(control, BugzillaUiPlugin.SEARCH_PAGE_CONTEXT);
+ restoreBounds();
+ }
+
+ protected void createOptionsGroup(Composite control) {
+ GridLayout sashFormLayout = new GridLayout();
+ sashFormLayout.numColumns = 4;
+ sashFormLayout.marginHeight = 5;
+ sashFormLayout.marginWidth = 5;
+ sashFormLayout.horizontalSpacing = 5;
+
+ final Composite composite = new Composite(control, SWT.NONE);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ final GridLayout gridLayout = new GridLayout();
+ gridLayout.marginBottom = 8;
+ gridLayout.marginHeight = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.numColumns = 4;
+ composite.setLayout(gridLayout);
+
+ if (!inSearchContainer()) {
+ final Label queryTitleLabel = new Label(composite, SWT.NONE);
+ queryTitleLabel.setText(Messages.BugzillaSearchPage_Query_Title);
+
+ queryTitle = new Text(composite, SWT.BORDER);
+ queryTitle.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
+ if (originalQuery != null) {
+ queryTitle.setText(originalQuery.getSummary());
+ }
+ queryTitle.addModifyListener(new ModifyListenerImplementation());
+ queryTitle.setFocus();
+ }
+
+ // Info text
+ Label labelSummary = new Label(composite, SWT.LEFT);
+ labelSummary.setText(Messages.BugzillaSearchPage_Summary);
+// labelSummary.setLayoutData(new GridData(LABEL_WIDTH, SWT.DEFAULT));
+ //labelSummary.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+ // Pattern combo
+ summaryPattern = new Combo(composite, SWT.SINGLE | SWT.BORDER);
+ summaryPattern.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+ summaryPattern.addModifyListener(new ModifyListenerImplementation());
+ summaryPattern.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleWidgetSelected(summaryPattern, summaryOperation, previousSummaryPatterns);
+ }
+ });
+
+ summaryOperation = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+ summaryOperation.setItems(patternOperationText);
+ summaryOperation.setText(patternOperationText[0]);
+ summaryOperation.select(0);
+
+ // Info text
+ Label labelComment = new Label(composite, SWT.LEFT);
+ labelComment.setText(Messages.BugzillaSearchPage_Comment);
+ //labelComment.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+ // Comment pattern combo
+ commentPattern = new Combo(composite, SWT.SINGLE | SWT.BORDER);
+ commentPattern.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
+ commentPattern.addModifyListener(new ModifyListenerImplementation());
+ commentPattern.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleWidgetSelected(commentPattern, commentOperation, previousCommentPatterns);
+ }
+ });
+
+ commentOperation = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+ commentOperation.setItems(patternOperationText);
+ commentOperation.setText(patternOperationText[0]);
+ commentOperation.select(0);
+
+ Label labelEmail = new Label(composite, SWT.LEFT);
+ labelEmail.setText(Messages.BugzillaSearchPage_Email);
+ //labelEmail.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+ // pattern combo
+ emailPattern = new Combo(composite, SWT.SINGLE | SWT.BORDER);
+ emailPattern.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ emailPattern.addModifyListener(new ModifyListenerImplementation());
+ emailPattern.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleWidgetSelected(emailPattern, emailOperation, previousEmailPatterns);
+ }
+ });
+ IContentProposalProvider proposalProvider = TasksUi.getUiFactory().createPersonContentProposalProvider(
+ getTaskRepository());
+ ILabelProvider proposalLabelProvider = TasksUi.getUiFactory().createPersonContentProposalLabelProvider(
+ getTaskRepository());
+
+ ContentAssistCommandAdapter adapter = new ContentAssistCommandAdapter(emailPattern, new ComboContentAdapter(),
+ proposalProvider, ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true);
+ adapter.setLabelProvider(proposalLabelProvider);
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+
+ Composite emailComposite = new Composite(composite, SWT.NONE);
+ emailComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+ GridLayout emailLayout = new GridLayout();
+ emailLayout.marginWidth = 0;
+ emailLayout.marginHeight = 0;
+ emailLayout.horizontalSpacing = 2;
+ emailLayout.numColumns = 4;
+ emailComposite.setLayout(emailLayout);
+
+ Button button0 = new Button(emailComposite, SWT.CHECK);
+ button0.setText(Messages.BugzillaSearchPage_owner);
+
+ Button button1 = new Button(emailComposite, SWT.CHECK);
+ button1.setText(Messages.BugzillaSearchPage_reporter);
+
+ Button button2 = new Button(emailComposite, SWT.CHECK);
+ button2.setText(Messages.BugzillaSearchPage_cc);
+
+ Button button3 = new Button(emailComposite, SWT.CHECK);
+ button3.setText(Messages.BugzillaSearchPage_commenter);
+
+ emailButtons = new Button[] { button0, button1, button2, button3 };
+
+ // operation combo
+ emailOperation = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+ emailOperation.setItems(emailOperationText);
+ emailOperation.setText(emailOperationText[0]);
+ emailOperation.select(0);
+
+ // Email2
+
+ Label labelEmail2 = new Label(composite, SWT.LEFT);
+ labelEmail2.setText(Messages.BugzillaSearchPage_Email_2);
+ //labelEmail.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+ // pattern combo
+ emailPattern2 = new Combo(composite, SWT.SINGLE | SWT.BORDER);
+ emailPattern2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ emailPattern2.addModifyListener(new ModifyListenerImplementation());
+ emailPattern2.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleWidgetSelected(emailPattern2, emailOperation2, previousEmailPatterns2);
+ }
+ });
+ ContentAssistCommandAdapter adapter2 = new ContentAssistCommandAdapter(emailPattern2,
+ new ComboContentAdapter(), proposalProvider, ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS,
+ new char[0], true);
+ adapter.setLabelProvider(proposalLabelProvider);
+ adapter2.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+
+ Composite emailComposite2 = new Composite(composite, SWT.NONE);
+ emailComposite2.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
+ GridLayout emailLayout2 = new GridLayout();
+ emailLayout2.marginWidth = 0;
+ emailLayout2.marginHeight = 0;
+ emailLayout2.horizontalSpacing = 2;
+ emailLayout2.numColumns = 4;
+ emailComposite2.setLayout(emailLayout2);
+
+ Button e2button0 = new Button(emailComposite2, SWT.CHECK);
+ e2button0.setText(Messages.BugzillaSearchPage_owner);
+
+ Button e2button1 = new Button(emailComposite2, SWT.CHECK);
+ e2button1.setText(Messages.BugzillaSearchPage_reporter);
+
+ Button e2button2 = new Button(emailComposite2, SWT.CHECK);
+ e2button2.setText(Messages.BugzillaSearchPage_cc);
+
+ Button e2button3 = new Button(emailComposite2, SWT.CHECK);
+ e2button3.setText(Messages.BugzillaSearchPage_commenter);
+
+ emailButtons2 = new Button[] { e2button0, e2button1, e2button2, e2button3 };
+
+ // operation combo
+ emailOperation2 = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
+ emailOperation2.setItems(emailOperationText);
+ emailOperation2.setText(emailOperationText[0]);
+ emailOperation2.select(0);
+
+ /////
+
+ Label labelKeywords = new Label(composite, SWT.NONE);
+ labelKeywords.setText(Messages.BugzillaSearchPage_Keywords);
+// labelKeywords.setLayoutData(new GridData(LABEL_WIDTH, SWT.DEFAULT));
+ //labelKeywords.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+ Composite keywordsComposite = new Composite(composite, SWT.NONE);
+ keywordsComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
+ GridLayout keywordsLayout = new GridLayout();
+ keywordsLayout.marginWidth = 0;
+ keywordsLayout.marginHeight = 0;
+ keywordsLayout.numColumns = 3;
+ keywordsComposite.setLayout(keywordsLayout);
+
+ keywordsOperation = new Combo(keywordsComposite, SWT.READ_ONLY);
+ keywordsOperation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ keywordsOperation.setItems(keywordOperationText);
+ keywordsOperation.setText(keywordOperationText[0]);
+ keywordsOperation.select(0);
+
+ keywords = new Combo(keywordsComposite, SWT.NONE);
+ keywords.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ keywords.addModifyListener(new ModifyListenerImplementation());
+ keywords.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleWidgetSelected(keywords, keywordsOperation, previousKeywords);
+ }
+ });
+
+ Button keywordsSelectButton = new Button(keywordsComposite, SWT.NONE);
+ keywordsSelectButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (repositoryConfiguration != null && getShell() != null) {
+ KeywordsDialog dialog = new KeywordsDialog(getShell(), keywords.getText(), //
+ repositoryConfiguration.getKeywords());
+ if (dialog.open() == Window.OK) {
+ keywords.setText(dialog.getSelectedKeywordsString());
+ }
+ }
+ }
+ });
+ keywordsSelectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ keywordsSelectButton.setText(Messages.BugzillaSearchPage_Select_);
+ SashForm sashForm = new SashForm(control, SWT.VERTICAL);
+ sashForm.setLayout(sashFormLayout);
+ final GridData gd_sashForm = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_sashForm.widthHint = 500;
+ sashForm.setLayoutData(gd_sashForm);
+
+ GridLayout topLayout = new GridLayout();
+ topLayout.numColumns = 4;
+ SashForm topForm = new SashForm(sashForm, SWT.NONE);
+ GridData topLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
+ topLayoutData.widthHint = 500;
+ topForm.setLayoutData(topLayoutData);
+ topForm.setLayout(topLayout);
+
+ GridLayout productLayout = new GridLayout();
+ productLayout.marginWidth = 0;
+ productLayout.marginHeight = 0;
+ productLayout.horizontalSpacing = 0;
+ Composite productComposite = new Composite(topForm, SWT.NONE);
+ productComposite.setLayout(productLayout);
+
+ Label productLabel = new Label(productComposite, SWT.LEFT);
+ productLabel.setText(Messages.BugzillaSearchPage_Product);
+ productLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ GridData productLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ productLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
+ product = new List(productComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ product.setLayoutData(productLayoutData);
+ product.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (product.getSelectionIndex() != -1) {
+ String[] selectedProducts = product.getSelection();
+ updateAttributesFromConfiguration(selectedProducts);
+ } else {
+ updateAttributesFromConfiguration(null);
+ }
+ if (restoring) {
+ restoring = false;
+ restoreWidgetValues();
+ }
+ setPageComplete(isPageComplete());
+ }
+ });
+
+ GridLayout componentLayout = new GridLayout();
+ componentLayout.marginWidth = 0;
+ componentLayout.marginHeight = 0;
+ componentLayout.horizontalSpacing = 0;
+ Composite componentComposite = new Composite(topForm, SWT.NONE);
+ componentComposite.setLayout(componentLayout);
+
+ Label componentLabel = new Label(componentComposite, SWT.LEFT);
+ componentLabel.setText(Messages.BugzillaSearchPage_Component);
+ componentLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ component = new List(componentComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ GridData componentLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ componentLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
+ component.setLayoutData(componentLayoutData);
+ component.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite versionComposite = new Composite(topForm, SWT.NONE);
+ GridLayout versionLayout = new GridLayout();
+ versionLayout.marginWidth = 0;
+ versionLayout.marginHeight = 0;
+ versionLayout.horizontalSpacing = 0;
+ versionComposite.setLayout(versionLayout);
+
+ Label versionLabel = new Label(versionComposite, SWT.LEFT);
+ versionLabel.setText(Messages.BugzillaSearchPage_Version);
+ versionLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ version = new List(versionComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ GridData versionLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ versionLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
+ version.setLayoutData(versionLayoutData);
+ version.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite milestoneComposite = new Composite(topForm, SWT.NONE);
+ GridLayout milestoneLayout = new GridLayout();
+ milestoneLayout.marginWidth = 0;
+ milestoneLayout.marginHeight = 0;
+ milestoneLayout.horizontalSpacing = 0;
+ milestoneComposite.setLayout(milestoneLayout);
+
+ Label milestoneLabel = new Label(milestoneComposite, SWT.LEFT);
+ milestoneLabel.setText(Messages.BugzillaSearchPage_Milestone);
+ milestoneLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ target = new List(milestoneComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ GridData targetLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ targetLayoutData.heightHint = HEIGHT_ATTRIBUTE_COMBO;
+ target.setLayoutData(targetLayoutData);
+ target.addSelectionListener(updateActionSelectionAdapter);
+
+ SashForm bottomForm = new SashForm(sashForm, SWT.NONE);
+ GridLayout bottomLayout = new GridLayout();
+ bottomLayout.numColumns = 6;
+ bottomForm.setLayout(bottomLayout);
+ GridData bottomLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1);
+ bottomLayoutData.heightHint = 119;
+ bottomLayoutData.widthHint = 400;
+ bottomForm.setLayoutData(bottomLayoutData);
+
+ Composite statusComposite = new Composite(bottomForm, SWT.NONE);
+ GridLayout statusLayout = new GridLayout();
+ statusLayout.marginTop = 7;
+ statusLayout.marginWidth = 0;
+ statusLayout.horizontalSpacing = 0;
+ statusLayout.marginHeight = 0;
+ statusComposite.setLayout(statusLayout);
+
+ Label statusLabel = new Label(statusComposite, SWT.LEFT);
+ statusLabel.setText(Messages.BugzillaSearchPage_Status);
+ statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ status = new List(statusComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ final GridData gd_status = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_status.heightHint = 60;
+ status.setLayoutData(gd_status);
+ status.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite resolutionComposite = new Composite(bottomForm, SWT.NONE);
+ GridLayout resolutionLayout = new GridLayout();
+ resolutionLayout.marginTop = 7;
+ resolutionLayout.marginWidth = 0;
+ resolutionLayout.marginHeight = 0;
+ resolutionLayout.horizontalSpacing = 0;
+ resolutionComposite.setLayout(resolutionLayout);
+
+ Label resolutionLabel = new Label(resolutionComposite, SWT.LEFT);
+ resolutionLabel.setText(Messages.BugzillaSearchPage_Resolution);
+ resolutionLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ resolution = new List(resolutionComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ final GridData gd_resolution = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_resolution.heightHint = 60;
+ resolution.setLayoutData(gd_resolution);
+ resolution.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite priorityComposite = new Composite(bottomForm, SWT.NONE);
+ GridLayout priorityLayout = new GridLayout();
+ priorityLayout.marginTop = 7;
+ priorityLayout.marginWidth = 0;
+ priorityLayout.marginHeight = 0;
+ priorityLayout.horizontalSpacing = 0;
+ priorityComposite.setLayout(priorityLayout);
+
+ Label priorityLabel = new Label(priorityComposite, SWT.LEFT);
+ priorityLabel.setText(Messages.BugzillaSearchPage_PROORITY);
+ priorityLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ priority = new List(priorityComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ final GridData gd_priority = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_priority.heightHint = 60;
+ priority.setLayoutData(gd_priority);
+ priority.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite severityComposite = new Composite(bottomForm, SWT.NONE);
+ GridLayout severityLayout = new GridLayout();
+ severityLayout.marginTop = 7;
+ severityLayout.marginWidth = 0;
+ severityLayout.marginHeight = 0;
+ severityLayout.horizontalSpacing = 0;
+ severityComposite.setLayout(severityLayout);
+
+ Label severityLabel = new Label(severityComposite, SWT.LEFT);
+ severityLabel.setText(Messages.BugzillaSearchPage_Severity);
+ severityLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ severity = new List(severityComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ final GridData gd_severity = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_severity.heightHint = 60;
+ severity.setLayoutData(gd_severity);
+ severity.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite hardwareComposite = new Composite(bottomForm, SWT.NONE);
+ GridLayout hardwareLayout = new GridLayout();
+ hardwareLayout.marginTop = 7;
+ hardwareLayout.marginWidth = 0;
+ hardwareLayout.marginHeight = 0;
+ hardwareLayout.horizontalSpacing = 0;
+ hardwareComposite.setLayout(hardwareLayout);
+
+ Label hardwareLabel = new Label(hardwareComposite, SWT.LEFT);
+ hardwareLabel.setText(Messages.BugzillaSearchPage_Hardware);
+ hardwareLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ hardware = new List(hardwareComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ final GridData gd_hardware = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_hardware.heightHint = 60;
+ hardware.setLayoutData(gd_hardware);
+ hardware.addSelectionListener(updateActionSelectionAdapter);
+
+ Composite osComposite = new Composite(bottomForm, SWT.NONE);
+ GridLayout osLayout = new GridLayout();
+ osLayout.marginTop = 7;
+ osLayout.marginWidth = 0;
+ osLayout.marginHeight = 0;
+ osLayout.horizontalSpacing = 0;
+ osComposite.setLayout(osLayout);
+
+ Label osLabel = new Label(osComposite, SWT.LEFT);
+ osLabel.setText(Messages.BugzillaSearchPage_Operating_System);
+ osLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ os = new List(osComposite, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ final GridData gd_os = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd_os.heightHint = 60;
+ os.setLayoutData(gd_os);
+ os.addSelectionListener(updateActionSelectionAdapter);
+ bottomForm.setWeights(new int[] { 88, 90, 50, 77, 88, 85 });
+ }
+
+ private void createSearchGroup(Composite control) {
+ Composite composite = new Composite(control, SWT.NONE);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.marginTop = 7;
+ gridLayout.marginHeight = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.numColumns = 2;
+ composite.setLayout(gridLayout);
+
+ Label changedInTheLabel = new Label(composite, SWT.LEFT);
+ changedInTheLabel.setLayoutData(new GridData());
+ changedInTheLabel.setText(Messages.BugzillaSearchPage_Changed_in);
+
+ Composite updateComposite = new Composite(composite, SWT.NONE);
+ updateComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ GridLayout updateLayout = new GridLayout(3, false);
+ updateLayout.marginWidth = 0;
+ updateLayout.horizontalSpacing = 0;
+ updateLayout.marginHeight = 0;
+ updateComposite.setLayout(updateLayout);
+
+ daysText = new Text(updateComposite, SWT.BORDER);
+ daysText.setLayoutData(new GridData(40, SWT.DEFAULT));
+ daysText.setTextLimit(5);
+ daysText.addListener(SWT.Modify, this);
+
+ Label label = new Label(updateComposite, SWT.LEFT);
+ label.setText(Messages.BugzillaSearchPage_days);
+
+ Button updateButton = new Button(updateComposite, SWT.PUSH);
+ updateButton.setText(Messages.BugzillaSearchPage_Update_Attributes_from_Repository);
+ updateButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
+ updateButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (getTaskRepository() != null) {
+// try {
+
+ updateConfiguration(true);
+
+// } catch (final CoreException e1) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// MessageDialog.openError(Display.getDefault().getActiveShell(), "Bugzilla Search Page",
+// "Unable to get configuration. Ensure proper repository configuration in "
+// + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".\n\n");
+// }
+// });
+// }
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
+ IBugzillaConstants.TITLE_MESSAGE_DIALOG,
+ Messages.BugzillaSearchPage_No_repository_available);
+ }
+ }
+ });
+ }
+
+ /**
+ * Creates the buttons for remembering a query and accessing previously saved queries.
+ */
+ protected Control createSaveQuery(Composite control) {
+ GridLayout layout;
+ GridData gd;
+
+ Group group = new Group(control, SWT.NONE);
+ layout = new GridLayout(3, false);
+ group.setLayout(layout);
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ gd = new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ gd.horizontalSpan = 2;
+ group.setLayoutData(gd);
+
+ // loadButton = new Button(group, SWT.PUSH | SWT.LEFT);
+ // loadButton.setText("Saved Queries...");
+ // final BugzillaSearchPage bsp = this;
+ // loadButton.addSelectionListener(new SelectionAdapter() {
+ //
+ // @Override
+ // public void widgetSelected(SelectionEvent event) {
+ // GetQueryDialog qd = new GetQueryDialog(getShell(), "Saved Queries",
+ // input);
+ // if (qd.open() == InputDialog.OK) {
+ // selIndex = qd.getSelected();
+ // if (selIndex != -1) {
+ // rememberedQuery = true;
+ // performAction();
+ // bsp.getShell().close();
+ // }
+ // }
+ // }
+ // });
+ // loadButton.setEnabled(true);
+ // loadButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+ //
+ // saveButton = new Button(group, SWT.PUSH | SWT.LEFT);
+ // saveButton.setText("Remember...");
+ // saveButton.addSelectionListener(new SelectionAdapter() {
+ //
+ // @Override
+ // public void widgetSelected(SelectionEvent event) {
+ // SaveQueryDialog qd = new SaveQueryDialog(getShell(), "Remember Query");
+ // if (qd.open() == InputDialog.OK) {
+ // String qName = qd.getText();
+ // if (qName != null && qName.compareTo("") != 0) {
+ // try {
+ // input.add(getQueryParameters().toString(), qName, summaryPattern.getText());
+ // } catch (UnsupportedEncodingException e) {
+ // /*
+ // * Do nothing. Every implementation of the Java
+ // * platform is required to support the standard
+ // * charset "UTF-8"
+ // */
+ // }
+ // }
+ // }
+ // }
+ // });
+ // saveButton.setEnabled(true);
+ // saveButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ return group;
+ }
+
+ // public static SavedQueryFile getInput() {
+ // return input;
+ // }
+
+ private void handleWidgetSelected(Combo widget, Combo operation, ArrayList<BugzillaSearchData> history) {
+ if (widget.getSelectionIndex() < 0) {
+ return;
+ }
+ int index = history.size() - 1 - widget.getSelectionIndex();
+ BugzillaSearchData patternData = history.get(index);
+ if (patternData == null || !widget.getText().equals(patternData.pattern)) {
+ return;
+ }
+ widget.setText(patternData.pattern);
+ operation.setText(operation.getItem(patternData.operation));
+ }
+
+ // TODO: avoid overriding?
+ @Override
+ public boolean performSearch() {
+ if (restoreQueryOptions) {
+ saveState();
+ }
+
+ getPatternData(summaryPattern, summaryOperation, previousSummaryPatterns);
+ getPatternData(commentPattern, commentOperation, previousCommentPatterns);
+ getPatternData(emailPattern, emailOperation, previousEmailPatterns);
+ getPatternData(emailPattern2, emailOperation2, previousEmailPatterns2);
+ getPatternData(keywords, keywordsOperation, previousKeywords);
+
+ String summaryText = summaryPattern.getText();
+ BugzillaUiPlugin.getDefault().getPreferenceStore().setValue(IBugzillaConstants.MOST_RECENT_QUERY, summaryText);
+
+ return super.performSearch();
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ if (visible && summaryPattern != null) {
+ if (firstTime) {
+ // Set<TaskRepository> repositories = TasksUiPlugin.getRepositoryManager().getRepositories(BugzillaCorePlugin.REPOSITORY_KIND);
+ // String[] repositoryUrls = new String[repositories.size()];
+ // int i = 0;
+ // int indexToSelect = 0;
+ // for (Iterator<TaskRepository> iter = repositories.iterator(); iter.hasNext();) {
+ // TaskRepository currRepsitory = iter.next();
+ // // if (i == 0 && repository == null) {
+ // // repository = currRepsitory;
+ // // indexToSelect = 0;
+ // // }
+ // if (repository != null && repository.equals(currRepsitory)) {
+ // indexToSelect = i;
+ // }
+ // repositoryUrls[i] = currRepsitory.getUrl();
+ // i++;
+ // }
+
+ // IDialogSettings settings = getDialogSettings();
+ // if (repositoryCombo != null) {
+ // repositoryCombo.setItems(repositoryUrls);
+ // if (repositoryUrls.length == 0) {
+ // MessageDialog.openInformation(Display.getCurrent().getActiveShell(), IBugzillaConstants.TITLE_MESSAGE_DIALOG,
+ // TaskRepositoryManager.MESSAGE_NO_REPOSITORY);
+ // } else {
+ // String selectRepo = settings.get(STORE_REPO_ID);
+ // if (selectRepo != null && repositoryCombo.indexOf(selectRepo) > -1) {
+ // repositoryCombo.setText(selectRepo);
+ // repository = TasksUiPlugin.getRepositoryManager().getRepository(
+ // BugzillaCorePlugin.REPOSITORY_KIND, repositoryCombo.getText());
+ // if (repository == null) {
+ // repository = TasksUiPlugin.getRepositoryManager().getDefaultRepository( BugzillaCorePlugin.REPOSITORY_KIND);
+ // }
+ // } else {
+ // repositoryCombo.select(indexToSelect);
+ // }
+ // updateAttributesFromRepository(repositoryCombo.getText(), null, false);
+ // }
+ // }
+
+ firstTime = false;
+ // Set item and text here to prevent page from resizing
+ for (String searchPattern : getPreviousPatterns(previousSummaryPatterns)) {
+ summaryPattern.add(searchPattern);
+ }
+ // summaryPattern.setItems(getPreviousPatterns(previousSummaryPatterns));
+ for (String comment : getPreviousPatterns(previousCommentPatterns)) {
+ commentPattern.add(comment);
+ }
+ // commentPattern.setItems(getPreviousPatterns(previousCommentPatterns));
+ for (String email : getPreviousPatterns(previousEmailPatterns)) {
+ emailPattern.add(email);
+ }
+
+ for (String email : getPreviousPatterns(previousEmailPatterns2)) {
+ emailPattern2.add(email);
+ }
+
+ // emailPattern.setItems(getPreviousPatterns(previousEmailPatterns));
+ for (String keyword : getPreviousPatterns(previousKeywords)) {
+ keywords.add(keyword);
+ }
+
+ // TODO: update status, resolution, severity etc if possible...
+ if (getTaskRepository() != null) {
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(getTaskRepository().getUrl());
+ updateAttributesFromConfiguration(null);
+ if (product.getItemCount() == 0) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (getControl() != null && !getControl().isDisposed()) {
+ updateConfiguration(true);
+ updateAttributesFromConfiguration(null);
+ }
+ }
+
+ });
+ }
+ }
+ if (originalQuery != null) {
+ try {
+ updateDefaults(originalQuery.getUrl());
+ } catch (UnsupportedEncodingException e) {
+ // ignore
+ }
+ }
+ }
+
+ /*
+ * hack: we have to select the correct product, then update the
+ * attributes so the component/version/milestone lists have the
+ * proper values, then we can restore all the widget selections.
+ */
+ if (getTaskRepository() != null) {
+ IDialogSettings settings = getDialogSettings();
+ String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
+ if (getWizard() == null && restoreQueryOptions && settings.getArray(STORE_PRODUCT_ID + repoId) != null
+ && product != null) {
+ product.setSelection(nonNullArray(settings, STORE_PRODUCT_ID + repoId));
+ if (product.getSelection().length > 0) {
+ updateAttributesFromConfiguration(product.getSelection());
+ }
+ restoreWidgetValues();
+ }
+ }
+ setPageComplete(isPageComplete());
+ if (getWizard() == null) {
+ // TODO: wierd check
+ summaryPattern.setFocus();
+ }
+ }
+ super.setVisible(visible);
+ }
+
+ /**
+ * Returns <code>true</code> if at least some parameter is given to query on.
+ */
+ private boolean canQuery() {
+ if (isControlCreated()) {
+ return product.getSelectionCount() > 0 || component.getSelectionCount() > 0
+ || version.getSelectionCount() > 0 || target.getSelectionCount() > 0
+ || status.getSelectionCount() > 0 || resolution.getSelectionCount() > 0
+ || severity.getSelectionCount() > 0 || priority.getSelectionCount() > 0
+ || hardware.getSelectionCount() > 0 || os.getSelectionCount() > 0
+ || summaryPattern.getText().length() > 0 || commentPattern.getText().length() > 0
+ || emailPattern.getText().length() > 0 || emailPattern2.getText().length() > 0
+ || keywords.getText().length() > 0;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (daysText != null) {
+ String days = daysText.getText();
+ if (days.length() > 0) {
+ try {
+ if (Integer.parseInt(days) < 0) {
+ throw new NumberFormatException();
+ }
+ } catch (NumberFormatException ex) {
+ setErrorMessage(NLS.bind(Messages.BugzillaSearchPage_Number_of_days_must_be_a_positive_integer,
+ days));
+ return false;
+ }
+ }
+ }
+ return getWizard() == null ? canQuery() : canQuery() && super.isPageComplete();
+ }
+
+ /**
+ * Return search pattern data and update search history list. An existing entry will be updated or a new one
+ * created.
+ */
+ private BugzillaSearchData getPatternData(Combo widget, Combo operation,
+ ArrayList<BugzillaSearchData> previousSearchQueryData) {
+ String pattern = widget.getText();
+ if (pattern == null || pattern.trim().equals("")) { //$NON-NLS-1$
+ return null;
+ }
+ BugzillaSearchData match = null;
+ int i = previousSearchQueryData.size() - 1;
+ while (i >= 0) {
+ match = previousSearchQueryData.get(i);
+ if (pattern.equals(match.pattern)) {
+ break;
+ }
+ i--;
+ }
+ if (i >= 0 && match != null) {
+ match.operation = operation.getSelectionIndex();
+ // remove - will be added last (see below)
+ previousSearchQueryData.remove(match);
+ } else {
+ match = new BugzillaSearchData(widget.getText(), operation.getSelectionIndex());
+ }
+ previousSearchQueryData.add(match);
+ return match;
+ }
+
+ /**
+ * Returns an array of previous summary patterns
+ */
+ private String[] getPreviousPatterns(ArrayList<BugzillaSearchData> patternHistory) {
+ int size = patternHistory.size();
+ String[] patterns = new String[size];
+ for (int i = 0; i < size; i++) {
+ patterns[i] = (patternHistory.get(size - 1 - i)).pattern;
+ }
+ return patterns;
+ }
+
+ public String getSearchURL(TaskRepository repository) {
+ return getQueryURL(repository, getQueryParameters());
+ }
+
+ protected String getQueryURL(TaskRepository repository, StringBuilder params) {
+ StringBuilder url = new StringBuilder(getQueryURLStart(repository).toString());
+ url.append(params);
+
+ // HACK make sure that the searches come back sorted by priority. This
+ // should be a search option though
+ url.append("&order=Importance"); //$NON-NLS-1$
+ // url.append(BugzillaRepositoryUtil.contentTypeRDF);
+ return url.toString();
+ }
+
+ /**
+ * Creates the bugzilla query URL start. Example: https://bugs.eclipse.org/bugs/buglist.cgi?
+ */
+ private StringBuilder getQueryURLStart(TaskRepository repository) {
+ StringBuilder sb = new StringBuilder(repository.getRepositoryUrl());
+
+ if (sb.charAt(sb.length() - 1) != '/') {
+ sb.append('/');
+ }
+ sb.append("buglist.cgi?"); //$NON-NLS-1$
+ return sb;
+ }
+
+ /**
+ * Goes through the query form and builds up the query parameters. Example:
+ * short_desc_type=substring&short_desc=bla& ... TODO: The encoding here should match
+ * TaskRepository.getCharacterEncoding()
+ *
+ * @throws UnsupportedEncodingException
+ */
+ protected StringBuilder getQueryParameters() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("short_desc_type="); //$NON-NLS-1$
+ sb.append(patternOperationValues[summaryOperation.getSelectionIndex()]);
+ appendToBuffer(sb, "&short_desc=", summaryPattern.getText()); //$NON-NLS-1$
+
+ int[] selected = product.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&product=", product.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = component.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&component=", component.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = version.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&version=", version.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = target.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&target_milestone=", target.getItem(element)); //$NON-NLS-1$
+ }
+
+ sb.append("&long_desc_type="); //$NON-NLS-1$
+ sb.append(patternOperationValues[commentOperation.getSelectionIndex()]);
+ appendToBuffer(sb, "&long_desc=", commentPattern.getText()); //$NON-NLS-1$
+
+ selected = status.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&bug_status=", status.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = resolution.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&resolution=", resolution.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = severity.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&bug_severity=", severity.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = priority.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&priority=", priority.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = hardware.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&ref_platform=", hardware.getItem(element)); //$NON-NLS-1$
+ }
+
+ selected = os.getSelectionIndices();
+ for (int element : selected) {
+ appendToBuffer(sb, "&op_sys=", os.getItem(element)); //$NON-NLS-1$
+ }
+
+ if (emailPattern.getText() != null && !emailPattern.getText().trim().equals("")) { //$NON-NLS-1$
+ boolean selectionMade = false;
+ for (Button button : emailButtons) {
+ if (button.getSelection()) {
+ selectionMade = true;
+ break;
+ }
+ }
+ if (selectionMade) {
+ for (int i = 0; i < emailButtons.length; i++) {
+ if (emailButtons[i].getSelection()) {
+ sb.append("&"); //$NON-NLS-1$
+ sb.append(emailRoleValues[i]);
+ sb.append("=1"); //$NON-NLS-1$
+ }
+ }
+ sb.append("&emailtype1="); //$NON-NLS-1$
+ sb.append(emailOperationValues[emailOperation.getSelectionIndex()]);
+ appendToBuffer(sb, "&email1=", emailPattern.getText()); //$NON-NLS-1$
+ }
+ }
+
+ if (emailPattern2.getText() != null && !emailPattern2.getText().trim().equals("")) { //$NON-NLS-1$
+ boolean selectionMade = false;
+ for (Button button : emailButtons2) {
+ if (button.getSelection()) {
+ selectionMade = true;
+ break;
+ }
+ }
+ if (selectionMade) {
+ for (int i = 0; i < emailButtons2.length; i++) {
+ if (emailButtons2[i].getSelection()) {
+ sb.append("&"); //$NON-NLS-1$
+ sb.append(emailRoleValues2[i]);
+ sb.append("=1"); //$NON-NLS-1$
+ }
+ }
+ sb.append("&emailtype2="); //$NON-NLS-1$
+ sb.append(emailOperationValues[emailOperation2.getSelectionIndex()]);
+ appendToBuffer(sb, "&email2=", emailPattern2.getText()); //$NON-NLS-1$
+ }
+ }
+
+ if (daysText.getText() != null && !daysText.getText().equals("")) { //$NON-NLS-1$
+ try {
+ Integer.parseInt(daysText.getText());
+ appendToBuffer(sb, "&changedin=", daysText.getText()); //$NON-NLS-1$
+ } catch (NumberFormatException ignored) {
+ // this means that the days is not a number, so don't worry
+ }
+ }
+
+ if (keywords.getText() != null && !keywords.getText().trim().equals("")) { //$NON-NLS-1$
+ sb.append("&keywords_type="); //$NON-NLS-1$
+ sb.append(keywordOperationValues[keywordsOperation.getSelectionIndex()]);
+ appendToBuffer(sb, "&keywords=", keywords.getText().replace(',', ' ')); //$NON-NLS-1$
+ }
+
+ return sb;
+ }
+
+ private void appendToBuffer(StringBuilder sb, String key, String value) {
+ sb.append(key);
+ try {
+ sb.append(URLEncoder.encode(value, getTaskRepository().getCharacterEncoding()));
+ } catch (UnsupportedEncodingException e) {
+ sb.append(value);
+ }
+ }
+
+ @Override
+ public IDialogSettings getDialogSettings() {
+ IDialogSettings settings = BugzillaUiPlugin.getDefault().getDialogSettings();
+ fDialogSettings = settings.getSection(PAGE_NAME);
+ if (fDialogSettings == null) {
+ fDialogSettings = settings.addNewSection(PAGE_NAME);
+ }
+ return fDialogSettings;
+ }
+
+ /**
+ * Initializes itself from the stored page settings.
+ */
+ private void readConfiguration() {
+ getDialogSettings();
+ }
+
+ private void updateAttributesFromConfiguration(String[] selectedProducts) {
+ if (repositoryConfiguration != null) {
+ String[] saved_product = product.getSelection();
+ String[] saved_component = component.getSelection();
+ String[] saved_version = version.getSelection();
+ String[] saved_target = target.getSelection();
+ String[] saved_status = status.getSelection();
+ String[] saved_resolution = resolution.getSelection();
+ String[] saved_severity = severity.getSelection();
+ String[] saved_priority = priority.getSelection();
+ String[] saved_hardware = hardware.getSelection();
+ String[] saved_os = os.getSelection();
+
+ if (selectedProducts == null) {
+ java.util.List<String> products = repositoryConfiguration.getProducts();
+ String[] productsList = products.toArray(new String[products.size()]);
+ Arrays.sort(productsList, String.CASE_INSENSITIVE_ORDER);
+ product.setItems(productsList);
+ }
+
+ String[] componentsList = BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_COMPONENT,
+ selectedProducts, repositoryConfiguration);
+ Arrays.sort(componentsList, String.CASE_INSENSITIVE_ORDER);
+ component.setItems(componentsList);
+
+ version.setItems(BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_VERSION, selectedProducts,
+ repositoryConfiguration));
+ target.setItems(BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_TARGET, selectedProducts,
+ repositoryConfiguration));
+ status.setItems(convertStringListToArray(repositoryConfiguration.getStatusValues()));
+ resolution.setItems(convertStringListToArray(repositoryConfiguration.getResolutions()));
+ severity.setItems(convertStringListToArray(repositoryConfiguration.getSeverities()));
+ priority.setItems(convertStringListToArray(repositoryConfiguration.getPriorities()));
+ hardware.setItems(convertStringListToArray(repositoryConfiguration.getPlatforms()));
+ os.setItems(convertStringListToArray(repositoryConfiguration.getOSs()));
+
+ setSelection(product, saved_product);
+ setSelection(component, saved_component);
+ setSelection(version, saved_version);
+ setSelection(target, saved_target);
+ setSelection(status, saved_status);
+ setSelection(resolution, saved_resolution);
+ setSelection(severity, saved_severity);
+ setSelection(priority, saved_priority);
+ setSelection(hardware, saved_hardware);
+ setSelection(os, saved_os);
+ }
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ // if (getErrorMessage() != null)
+ // return false;
+ //
+ // return true;
+ return false;
+ }
+
+ public void handleEvent(Event event) {
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ /**
+ * TODO: get rid of this?
+ */
+ public void updateDefaults(String startingUrl) throws UnsupportedEncodingException {
+ // String serverName = startingUrl.substring(0,
+ // startingUrl.indexOf("?"));
+
+ startingUrl = startingUrl.substring(startingUrl.indexOf("?") + 1); //$NON-NLS-1$
+ String[] options = startingUrl.split("&"); //$NON-NLS-1$
+ for (String option : options) {
+ String key = option.substring(0, option.indexOf("=")); //$NON-NLS-1$
+ String value = URLDecoder.decode(option.substring(option.indexOf("=") + 1), //$NON-NLS-1$
+ getTaskRepository().getCharacterEncoding());
+ if (key == null) {
+ continue;
+ }
+
+ if (key.equals("short_desc")) { //$NON-NLS-1$
+ summaryPattern.setText(value);
+ } else if (key.equals("short_desc_type")) { //$NON-NLS-1$
+ if (value.equals("allwordssubstr")) { //$NON-NLS-1$
+ value = "all words"; //$NON-NLS-1$
+ } else if (value.equals("anywordssubstr")) { //$NON-NLS-1$
+ value = "any word"; //$NON-NLS-1$
+ }
+ int index = 0;
+ for (String item : summaryOperation.getItems()) {
+ if (item.compareTo(value) == 0) {
+ break;
+ }
+ index++;
+ }
+ if (index < summaryOperation.getItemCount()) {
+ summaryOperation.select(index);
+ }
+ } else if (key.equals("product")) { //$NON-NLS-1$
+ String[] sel = product.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ product.setSelection(selList.toArray(sel));
+ updateAttributesFromConfiguration(selList.toArray(sel));
+ } else if (key.equals("component")) { //$NON-NLS-1$
+ String[] sel = component.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ component.setSelection(selList.toArray(sel));
+ } else if (key.equals("version")) { //$NON-NLS-1$
+ String[] sel = version.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ version.setSelection(selList.toArray(sel));
+ } else if (key.equals("target_milestone")) { // XXX //$NON-NLS-1$
+ String[] sel = target.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ target.setSelection(selList.toArray(sel));
+ } else if (key.equals("version")) { //$NON-NLS-1$
+ String[] sel = version.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ version.setSelection(selList.toArray(sel));
+ } else if (key.equals("long_desc_type")) { //$NON-NLS-1$
+ if (value.equals("allwordssubstr")) { //$NON-NLS-1$
+ value = "all words"; //$NON-NLS-1$
+ } else if (value.equals("anywordssubstr")) { //$NON-NLS-1$
+ value = "any word"; //$NON-NLS-1$
+ }
+ int index = 0;
+ for (String item : commentOperation.getItems()) {
+ if (item.compareTo(value) == 0) {
+ break;
+ }
+ index++;
+ }
+ if (index < commentOperation.getItemCount()) {
+ commentOperation.select(index);
+ }
+ } else if (key.equals("long_desc")) { //$NON-NLS-1$
+ commentPattern.setText(value);
+ } else if (key.equals("bug_status")) { //$NON-NLS-1$
+ String[] sel = status.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ status.setSelection(selList.toArray(sel));
+ } else if (key.equals("resolution")) { //$NON-NLS-1$
+ String[] sel = resolution.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ resolution.setSelection(selList.toArray(sel));
+ } else if (key.equals("bug_severity")) { //$NON-NLS-1$
+ String[] sel = severity.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ severity.setSelection(selList.toArray(sel));
+ } else if (key.equals("priority")) { //$NON-NLS-1$
+ String[] sel = priority.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ priority.setSelection(selList.toArray(sel));
+ } else if (key.equals("ref_platform")) { //$NON-NLS-1$
+ String[] sel = hardware.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ hardware.setSelection(selList.toArray(sel));
+ } else if (key.equals("op_sys")) { //$NON-NLS-1$
+ String[] sel = os.getSelection();
+ java.util.List<String> selList = Arrays.asList(sel);
+ selList = new ArrayList<String>(selList);
+ selList.add(value);
+ sel = new String[selList.size()];
+ os.setSelection(selList.toArray(sel));
+ } else if (key.equals("emailassigned_to1")) { // HACK: email //$NON-NLS-1$
+ // buttons
+ // assumed to be
+ // in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons[0].setSelection(true);
+ } else {
+ emailButtons[0].setSelection(false);
+ }
+ } else if (key.equals("emailreporter1")) { // HACK: email //$NON-NLS-1$
+ // buttons assumed
+ // to be in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons[1].setSelection(true);
+ } else {
+ emailButtons[1].setSelection(false);
+ }
+ } else if (key.equals("emailcc1")) { // HACK: email buttons //$NON-NLS-1$
+ // assumed to be in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons[2].setSelection(true);
+ } else {
+ emailButtons[2].setSelection(false);
+ }
+ } else if (key.equals("emaillongdesc1")) { // HACK: email //$NON-NLS-1$
+ // buttons assumed
+ // to be in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons[3].setSelection(true);
+ } else {
+ emailButtons[3].setSelection(false);
+ }
+ } else if (key.equals("emailtype1")) { //$NON-NLS-1$
+ int index = 0;
+ for (String item : emailOperation.getItems()) {
+ if (item.compareTo(value) == 0) {
+ break;
+ }
+ index++;
+ }
+ if (index < emailOperation.getItemCount()) {
+ emailOperation.select(index);
+ }
+ } else if (key.equals("email1")) { //$NON-NLS-1$
+ emailPattern.setText(value);
+ } else if (key.equals("emailassigned_to2")) { // HACK: email //$NON-NLS-1$
+ // buttons
+ // assumed to be
+ // in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons2[0].setSelection(true);
+ } else {
+ emailButtons2[0].setSelection(false);
+ }
+ } else if (key.equals("emailreporter2")) { // HACK: email //$NON-NLS-1$
+ // buttons assumed
+ // to be in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons2[1].setSelection(true);
+ } else {
+ emailButtons2[1].setSelection(false);
+ }
+ } else if (key.equals("emailcc2")) { // HACK: email buttons //$NON-NLS-1$
+ // assumed to be in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons2[2].setSelection(true);
+ } else {
+ emailButtons2[2].setSelection(false);
+ }
+ } else if (key.equals("emaillongdesc2")) { // HACK: email //$NON-NLS-1$
+ // buttons assumed
+ // to be in same
+ // position
+ if (value.equals("1")) { //$NON-NLS-1$
+ emailButtons2[3].setSelection(true);
+ } else {
+ emailButtons2[3].setSelection(false);
+ }
+ } else if (key.equals("emailtype2")) { //$NON-NLS-1$
+ int index = 0;
+ for (String item : emailOperation2.getItems()) {
+ if (item.compareTo(value) == 0) {
+ break;
+ }
+ index++;
+ }
+ if (index < emailOperation2.getItemCount()) {
+ emailOperation2.select(index);
+ }
+ } else if (key.equals("email2")) { //$NON-NLS-1$
+ emailPattern2.setText(value);
+ } else if (key.equals("changedin")) { //$NON-NLS-1$
+ daysText.setText(value);
+ } else if (key.equals("keywords")) { //$NON-NLS-1$
+ keywords.setText(value.replace(' ', ','));
+ } else if (key.equals("keywords_type")) { //$NON-NLS-1$
+ int index = 0;
+ for (String item : keywordOperationValues) {
+ if (item.equals(value)) {
+ keywordsOperation.select(index);
+ break;
+ }
+ index++;
+ }
+ }
+ }
+ }
+
+ private String[] nonNullArray(IDialogSettings settings, String id) {
+ String[] value = settings.getArray(id);
+ if (value == null) {
+ return new String[] {};
+ }
+ return value;
+ }
+
+ private void restoreWidgetValues() {
+ try {
+ IDialogSettings settings = getDialogSettings();
+ String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
+ if (!restoreQueryOptions || settings.getArray(STORE_PRODUCT_ID + repoId) == null || product == null) {
+ return;
+ }
+
+ // set widgets to stored values
+ product.setSelection(nonNullArray(settings, STORE_PRODUCT_ID + repoId));
+ component.setSelection(nonNullArray(settings, STORE_COMPONENT_ID + repoId));
+ version.setSelection(nonNullArray(settings, STORE_VERSION_ID + repoId));
+ target.setSelection(nonNullArray(settings, STORE_MSTONE_ID + repoId));
+ status.setSelection(nonNullArray(settings, STORE_STATUS_ID + repoId));
+ resolution.setSelection(nonNullArray(settings, STORE_RESOLUTION_ID + repoId));
+ severity.setSelection(nonNullArray(settings, STORE_SEVERITY_ID + repoId));
+ priority.setSelection(nonNullArray(settings, STORE_PRIORITY_ID + repoId));
+ hardware.setSelection(nonNullArray(settings, STORE_HARDWARE_ID + repoId));
+ os.setSelection(nonNullArray(settings, STORE_OS_ID + repoId));
+ summaryOperation.select(settings.getInt(STORE_SUMMARYMATCH_ID + repoId));
+ commentOperation.select(settings.getInt(STORE_COMMENTMATCH_ID + repoId));
+ emailOperation.select(settings.getInt(STORE_EMAILMATCH_ID + repoId));
+ for (int i = 0; i < emailButtons.length; i++) {
+ emailButtons[i].setSelection(settings.getBoolean(STORE_EMAILBUTTON_ID + i + repoId));
+ }
+ summaryPattern.setText(settings.get(STORE_SUMMARYTEXT_ID + repoId));
+ commentPattern.setText(settings.get(STORE_COMMENTTEXT_ID + repoId));
+ emailPattern.setText(settings.get(STORE_EMAILADDRESS_ID + repoId));
+ try {
+ emailOperation2.select(settings.getInt(STORE_EMAIL2MATCH_ID + repoId));
+ } catch (Exception e) {
+ //ignore
+ }
+ for (int i = 0; i < emailButtons2.length; i++) {
+ emailButtons2[i].setSelection(settings.getBoolean(STORE_EMAIL2BUTTON_ID + i + repoId));
+ }
+ emailPattern2.setText(settings.get(STORE_EMAIL2ADDRESS_ID + repoId));
+ if (settings.get(STORE_KEYWORDS_ID + repoId) != null) {
+ keywords.setText(settings.get(STORE_KEYWORDS_ID + repoId));
+ keywordsOperation.select(settings.getInt(STORE_KEYWORDSMATCH_ID + repoId));
+ }
+ } catch (IllegalArgumentException e) {
+ //ignore
+ }
+ }
+
+ @Override
+ public void saveState() {
+ String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
+ IDialogSettings settings = getDialogSettings();
+ settings.put(STORE_PRODUCT_ID + repoId, product.getSelection());
+ settings.put(STORE_COMPONENT_ID + repoId, component.getSelection());
+ settings.put(STORE_VERSION_ID + repoId, version.getSelection());
+ settings.put(STORE_MSTONE_ID + repoId, target.getSelection());
+ settings.put(STORE_STATUS_ID + repoId, status.getSelection());
+ settings.put(STORE_RESOLUTION_ID + repoId, resolution.getSelection());
+ settings.put(STORE_SEVERITY_ID + repoId, severity.getSelection());
+ settings.put(STORE_PRIORITY_ID + repoId, priority.getSelection());
+ settings.put(STORE_HARDWARE_ID + repoId, hardware.getSelection());
+ settings.put(STORE_OS_ID + repoId, os.getSelection());
+ settings.put(STORE_SUMMARYMATCH_ID + repoId, summaryOperation.getSelectionIndex());
+ settings.put(STORE_COMMENTMATCH_ID + repoId, commentOperation.getSelectionIndex());
+ settings.put(STORE_EMAILMATCH_ID + repoId, emailOperation.getSelectionIndex());
+ for (int i = 0; i < emailButtons.length; i++) {
+ settings.put(STORE_EMAILBUTTON_ID + i + repoId, emailButtons[i].getSelection());
+ }
+ settings.put(STORE_SUMMARYTEXT_ID + repoId, summaryPattern.getText());
+ settings.put(STORE_COMMENTTEXT_ID + repoId, commentPattern.getText());
+ settings.put(STORE_EMAILADDRESS_ID + repoId, emailPattern.getText());
+ settings.put(STORE_EMAIL2ADDRESS_ID + repoId, emailPattern2.getText());
+ settings.put(STORE_EMAIL2MATCH_ID + repoId, emailOperation2.getSelectionIndex());
+ for (int i = 0; i < emailButtons2.length; i++) {
+ settings.put(STORE_EMAIL2BUTTON_ID + i + repoId, emailButtons2[i].getSelection());
+ }
+
+ settings.put(STORE_KEYWORDS_ID + repoId, keywords.getText());
+ settings.put(STORE_KEYWORDSMATCH_ID + repoId, keywordsOperation.getSelectionIndex());
+ // settings.put(STORE_REPO_ID, repositoryCombo.getText());
+ }
+
+ private void saveBounds(Rectangle bounds) {
+ if (inSearchContainer()) {
+ return;
+ }
+
+ IDialogSettings settings = getDialogSettings();
+ IDialogSettings dialogBounds = settings.getSection(DIALOG_BOUNDS_KEY);
+ if (dialogBounds == null) {
+ dialogBounds = new DialogSettings(DIALOG_BOUNDS_KEY);
+ settings.addSection(dialogBounds);
+ }
+ dialogBounds.put(X, bounds.x);
+ dialogBounds.put(Y, bounds.y);
+ dialogBounds.put(WIDTH, bounds.width);
+ dialogBounds.put(HEIGHT, bounds.height);
+ }
+
+ private void restoreBounds() {
+ if (inSearchContainer()) {
+ return;
+ }
+
+ IDialogSettings settings = getDialogSettings();
+ IDialogSettings dialogBounds = settings.getSection(DIALOG_BOUNDS_KEY);
+ Shell shell = getShell();
+ if (shell != null) {
+ Rectangle bounds = shell.getBounds();
+
+ if (bounds != null && dialogBounds != null) {
+ try {
+ bounds.x = dialogBounds.getInt(X);
+ bounds.y = dialogBounds.getInt(Y);
+ bounds.height = dialogBounds.getInt(HEIGHT);
+ bounds.width = dialogBounds.getInt(WIDTH);
+ shell.setBounds(bounds);
+ } catch (NumberFormatException e) {
+ // silently ignored
+ }
+ }
+ }
+
+ }
+
+ /* Testing hook to see if any products are present */
+ public int getProductCount() throws Exception {
+ return product.getItemCount();
+ }
+
+ public boolean isRestoreQueryOptions() {
+ return restoreQueryOptions;
+ }
+
+ public void setRestoreQueryOptions(boolean restoreQueryOptions) {
+ this.restoreQueryOptions = restoreQueryOptions;
+ }
+
+ private String[] convertStringListToArray(java.util.List<String> stringList) {
+ return stringList.toArray(new String[stringList.size()]);
+ }
+
+ private void updateConfiguration(final boolean force) {
+ String[] selectedProducts = product.getSelection();
+ if (selectedProducts != null && selectedProducts.length == 0) {
+ selectedProducts = null;
+ }
+ if (getTaskRepository() != null) {
+ IRunnableWithProgress updateRunnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ try {
+ monitor.beginTask(Messages.BugzillaSearchPage_Updating_search_options_,
+ IProgressMonitor.UNKNOWN);
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(getTaskRepository(),
+ force, monitor);
+ } catch (final Exception e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+
+ try {
+ if (getContainer() != null) {
+ getContainer().run(true, true, updateRunnable);
+ } else if (getSearchContainer() != null) {
+ getSearchContainer().getRunnableContext().run(true, true, updateRunnable);
+ } else {
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.busyCursorWhile(updateRunnable);
+ }
+
+ } catch (InvocationTargetException ex) {
+ Shell shell = null;
+ shell = getShell();
+ if (ex.getCause() instanceof CoreException) {
+ CoreException cause = ((CoreException) ex.getCause());
+ if (cause.getStatus() instanceof RepositoryStatus
+ && ((RepositoryStatus) cause.getStatus()).isHtmlMessage()) {
+ if (shell != null) {
+ shell.setEnabled(false);
+ }
+ // TODO: eliminate use of internal api
+ WebBrowserDialog dialog = new WebBrowserDialog(shell,
+ Messages.BugzillaSearchPage_Error_updating_search_options, null, cause.getStatus()
+ .getMessage(), NONE, new String[] { IDialogConstants.OK_LABEL }, 0,
+ ((RepositoryStatus) cause.getStatus()).getHtmlMessage());
+ dialog.setBlockOnOpen(true);
+ dialog.open();
+ if (shell != null) {
+ shell.setEnabled(true);
+ }
+ return;
+// this.setPageComplete(this.isPageComplete());
+// this.setControlsEnabled(true);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, cause.getMessage(),
+ cause));
+ }
+ }
+ if (ex.getCause() instanceof OperationCanceledException) {
+ return;
+ }
+
+ MessageDialog.openError(shell, Messages.BugzillaSearchPage_Error_updating_search_options,
+ MessageFormat.format(Messages.BugzillaSearchPage_Error_was_X, ex.getCause().getMessage()));
+ return;
+
+ } catch (InterruptedException ex) {
+ return;
+ }
+
+ updateAttributesFromConfiguration(selectedProducts);
+ }
+ }
+
+ @Override
+ public Shell getShell() {
+ Shell shell = null;
+ if (getWizard() != null && getWizard().getContainer() != null) {
+ shell = getWizard().getContainer().getShell();
+ }
+ if (shell == null && getControl() != null) {
+ shell = getControl().getShell();
+ }
+ return shell;
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return (queryTitle != null) ? queryTitle.getText() : ""; //$NON-NLS-1$
+ }
+
+ private void setSelection(List listControl, String[] selection) {
+ for (String item : selection) {
+ int index = listControl.indexOf(item);
+ if (index > -1) {
+ listControl.select(index);
+ }
+ }
+ if (listControl.getSelectionCount() > 0) {
+ listControl.showSelection();
+ } else {
+ listControl.select(0);
+ listControl.showSelection();
+ listControl.deselectAll();
+ }
+
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ query.setUrl(getQueryURL(getTaskRepository(), getQueryParameters()));
+ query.setSummary(getQueryTitle());
+ Shell shell = getShell();
+ if (shell != null) {
+ saveBounds(shell.getBounds());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSeveritySearchSorter.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSeveritySearchSorter.java
new file mode 100644
index 0000000..915a683
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaSeveritySearchSorter.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.search;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+
+/**
+ * Sorts results of Bugzilla search by bug severity.
+ */
+public class BugzillaSeveritySearchSorter extends ViewerSorter {
+
+ /**
+ * Returns a negative, zero, or positive number depending on whether the first bug's severity goes before, is the
+ * same as, or goes after the second element's severity.
+ * <p>
+ *
+ * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object,
+ * java.lang.Object)
+ */
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ try {
+ // cast the object and get its severity
+ IMarker entry1 = (IMarker) e1;
+ Integer severity1 = (Integer) entry1.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_SEVERITY);
+
+ // cast the other object and get its severity
+ IMarker entry2 = (IMarker) e2;
+ Integer severity2 = (Integer) entry2.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_SEVERITY);
+
+ // if neither is null, compare the bugs severities
+ if (severity1 != null && severity2 != null) {
+ return severity1.compareTo(severity2);
+ }
+ } catch (Exception ignored) {
+ // ignore if there is a problem
+ }
+
+ // if that didn't work, use the default compare method
+ return super.compare(viewer, e1, e2);
+ }
+
+ /**
+ * Returns the category of the given element. The category is a number used to allocate elements to bins; the bins
+ * are arranged in ascending numeric order. The elements within a bin are arranged via a second level sort
+ * criterion.
+ * <p>
+ *
+ * @see org.eclipse.jface.viewers.ViewerSorter#category(Object)
+ */
+ @Override
+ public int category(Object element) {
+ try {
+ IMarker marker = (IMarker) element;
+
+ // return the bugs id
+ if (marker.getType().equals(BugzillaUiPlugin.HIT_MARKER_ID)) {
+ return ((Integer) marker.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_ID)).intValue();
+ }
+ } catch (Exception ignored) {
+ // ignore if there is a problem
+ }
+
+ // if that didn't work, use the default category method
+ return super.category(element);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaStateSearchSorter.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaStateSearchSorter.java
new file mode 100644
index 0000000..29f1afa
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/BugzillaStateSearchSorter.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.search;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+
+/**
+ * Sorts results of Bugzilla search by bug state.
+ */
+public class BugzillaStateSearchSorter extends ViewerSorter {
+
+ /**
+ * Returns a negative, zero, or positive number depending on whether the first bug's state goes before, is the same
+ * as, or goes after the second element's state.
+ * <p>
+ *
+ * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object,
+ * java.lang.Object)
+ */
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ try {
+ // cast the object and get its state
+ IMarker entry1 = (IMarker) e1;
+ Integer state1 = (Integer) entry1.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_STATE);
+
+ // cast the other object and get its state
+ IMarker entry2 = (IMarker) e2;
+ Integer state2 = (Integer) entry2.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_STATE);
+
+ // if neither is null, compare the bugs states
+ if (state1 != null && state2 != null) {
+ // compare the states
+ int rc = state1.compareTo(state2);
+
+ // compare the resolution if the states are the same
+ if (rc == 0) {
+ // get the resolution of the bug
+ Integer result1 = (Integer) entry1.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_RESULT);
+
+ // get the resolution of the other bug
+ Integer result2 = (Integer) entry2.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_RESULT);
+
+ // if neither state is null, compare them
+ if (result1 != null && result2 != null) {
+ rc = result1.compareTo(result2);
+ }
+ }
+ return rc;
+ }
+
+ } catch (Exception ignored) {
+ // ignore if there is a problem
+ }
+
+ // if that didn't work, use the default compare method
+ return super.compare(viewer, e1, e2);
+ }
+
+ /**
+ * Returns the category of the given element. The category is a number used to allocate elements to bins; the bins
+ * are arranged in ascending numeric order. The elements within a bin are arranged via a second level sort
+ * criterion.
+ * <p>
+ *
+ * @see org.eclipse.jface.viewers.ViewerSorter#category(Object)
+ */
+ @Override
+ public int category(Object element) {
+ try {
+ IMarker marker = (IMarker) element;
+
+ // return the bugs id
+ if (marker.getType().equals(BugzillaUiPlugin.HIT_MARKER_ID)) {
+ return ((Integer) marker.getAttribute(BugzillaUiPlugin.HIT_MARKER_ATTR_ID)).intValue();
+ }
+ } catch (Exception ignored) {
+ // ignore if there is a problem
+ }
+
+ // if that didn't work, use the default category method
+ return super.category(element);
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/Messages.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/Messages.java
new file mode 100644
index 0000000..a795bd4
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/Messages.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.search;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.ui.search.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String BugzillaSearchPage_all;
+
+ public static String BugzillaSearchPage_all_words;
+
+ public static String BugzillaSearchPage_any;
+
+ public static String BugzillaSearchPage_any_word;
+
+ public static String BugzillaSearchPage_Bugzilla_Query;
+
+ public static String BugzillaSearchPage_cc;
+
+ public static String BugzillaSearchPage_Changed_in;
+
+ public static String BugzillaSearchPage_Comment;
+
+ public static String BugzillaSearchPage_commenter;
+
+ public static String BugzillaSearchPage_Component;
+
+ public static String BugzillaSearchPage_days;
+
+ public static String BugzillaSearchPage_Email;
+
+ public static String BugzillaSearchPage_Email_2;
+
+ public static String BugzillaSearchPage_Error_updating_search_options;
+
+ public static String BugzillaSearchPage_Error_was_X;
+
+ public static String BugzillaSearchPage_exact;
+
+ public static String BugzillaSearchPage_Hardware;
+
+ public static String BugzillaSearchPage_Keywords;
+
+ public static String BugzillaSearchPage_Milestone;
+
+ public static String BugzillaSearchPage_No_repository_available;
+
+ public static String BugzillaSearchPage_none;
+
+ public static String BugzillaSearchPage_notregexp;
+
+ public static String BugzillaSearchPage_Number_of_days_must_be_a_positive_integer;
+
+ public static String BugzillaSearchPage_Operating_System;
+
+ public static String BugzillaSearchPage_owner;
+
+ public static String BugzillaSearchPage_Product;
+
+ public static String BugzillaSearchPage_PROORITY;
+
+ public static String BugzillaSearchPage_Query_Title;
+
+ public static String BugzillaSearchPage_regexp;
+
+ public static String BugzillaSearchPage_reporter;
+
+ public static String BugzillaSearchPage_Resolution;
+
+ public static String BugzillaSearchPage_Select_;
+
+ public static String BugzillaSearchPage_Select_the_Bugzilla_query_parameters;
+
+ public static String BugzillaSearchPage_Severity;
+
+ public static String BugzillaSearchPage_Status;
+
+ public static String BugzillaSearchPage_substring;
+
+ public static String BugzillaSearchPage_Summary;
+
+ public static String BugzillaSearchPage_Update_Attributes_from_Repository;
+
+ public static String BugzillaSearchPage_Updating_search_options_;
+
+ public static String BugzillaSearchPage_Version;
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/messages.properties b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/messages.properties
new file mode 100644
index 0000000..06c43df
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/search/messages.properties
@@ -0,0 +1,40 @@
+BugzillaSearchPage_all=all
+BugzillaSearchPage_all_words=all words
+BugzillaSearchPage_any=any
+BugzillaSearchPage_any_word=any word
+BugzillaSearchPage_Bugzilla_Query=Bugzilla Query
+BugzillaSearchPage_cc=cc
+BugzillaSearchPage_Changed_in=Ch&anged in:
+BugzillaSearchPage_Comment=&Comment:
+BugzillaSearchPage_commenter=commenter
+BugzillaSearchPage_Component=Compo&nent:
+BugzillaSearchPage_days=\ days.
+BugzillaSearchPage_Email=&Email:
+BugzillaSearchPage_Email_2=Email &2:
+BugzillaSearchPage_Error_updating_search_options=Error updating search options
+BugzillaSearchPage_Error_was_X=Error was: {0}
+BugzillaSearchPage_exact=exact
+BugzillaSearchPage_Hardware=Hard&ware:
+BugzillaSearchPage_Keywords=&Keywords:
+BugzillaSearchPage_Milestone=&Milestone:
+BugzillaSearchPage_No_repository_available=No repository available, please add one using the Task Repositories view.
+BugzillaSearchPage_none=none
+BugzillaSearchPage_notregexp=notregexp
+BugzillaSearchPage_Number_of_days_must_be_a_positive_integer=Number of days must be a positive integer. {0} is invalid.
+BugzillaSearchPage_Operating_System=&Operating System:
+BugzillaSearchPage_owner=owner
+BugzillaSearchPage_Product=&Product:
+BugzillaSearchPage_PROORITY=Priori&ty:
+BugzillaSearchPage_Query_Title=&Query Title:
+BugzillaSearchPage_regexp=regexp
+BugzillaSearchPage_reporter=reporter
+BugzillaSearchPage_Resolution=&Resolution:
+BugzillaSearchPage_Select_=Select...
+BugzillaSearchPage_Select_the_Bugzilla_query_parameters=Select the Bugzilla query parameters. Use the Update Attributes button to retrieve updated values from the repository.
+BugzillaSearchPage_Severity=Se&verity:
+BugzillaSearchPage_Status=Stat&us:
+BugzillaSearchPage_substring=substring
+BugzillaSearchPage_Summary=Summar&y:
+BugzillaSearchPage_Update_Attributes_from_Repository=Up&date Attributes from Repository
+BugzillaSearchPage_Updating_search_options_=Updating search options...
+BugzillaSearchPage_Version=Vers&ion:
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java
new file mode 100644
index 0000000..70fab64
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaConnectorUi.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.tasklist;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage;
+import org.eclipse.mylyn.internal.bugzilla.ui.wizard.NewBugzillaTaskWizard;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.LegendElement;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+import org.eclipse.mylyn.tasks.ui.wizards.RepositoryQueryWizard;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaConnectorUi extends AbstractRepositoryConnectorUi {
+
+ private static final String regexp = "(duplicate of|bug|task)( ?#? ?)(\\d+)"; //$NON-NLS-1$
+
+ private static final Pattern PATTERN = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
+
+ @Override
+ public String getAccountCreationUrl(TaskRepository taskRepository) {
+ return taskRepository.getRepositoryUrl() + "/createaccount.cgi"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getAccountManagementUrl(TaskRepository taskRepository) {
+ return taskRepository.getRepositoryUrl() + "/userprefs.cgi"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getTaskHistoryUrl(TaskRepository taskRepository, ITask task) {
+ return taskRepository.getRepositoryUrl() + IBugzillaConstants.URL_BUG_ACTIVITY + task.getTaskId();
+ }
+
+ @Override
+ public String getReplyText(TaskRepository taskRepository, ITask task, ITaskComment taskComment, boolean includeTask) {
+ if (taskComment == null) {
+ return Messages.BugzillaConnectorUi__In_reply_to_comment_0_;
+ } else if (includeTask) {
+ return MessageFormat.format(Messages.BugzillaConnectorUi__In_reply_to_X_comment_X_, task.getTaskKey(),
+ taskComment.getNumber());
+ } else {
+ return MessageFormat.format(Messages.BugzillaConnectorUi__In_reply_to_comment_X_, taskComment.getNumber());
+ }
+ }
+
+ private static final int TASK_NUM_GROUP = 3;
+
+ @Override
+ public List<LegendElement> getLegendElements() {
+ List<LegendElement> legendItems = new ArrayList<LegendElement>();
+ legendItems.add(LegendElement.createTask("blocker", BugzillaImages.OVERLAY_CRITICAL)); //$NON-NLS-1$
+ legendItems.add(LegendElement.createTask("critical", BugzillaImages.OVERLAY_CRITICAL)); //$NON-NLS-1$
+ legendItems.add(LegendElement.createTask("major", BugzillaImages.OVERLAY_MAJOR)); //$NON-NLS-1$
+ legendItems.add(LegendElement.createTask("enhancement", BugzillaImages.OVERLAY_ENHANCEMENT)); //$NON-NLS-1$
+ legendItems.add(LegendElement.createTask("trivial", BugzillaImages.OVERLAY_MINOR)); //$NON-NLS-1$
+ return legendItems;
+ }
+
+ @Override
+ public ImageDescriptor getTaskKindOverlay(ITask task) {
+ String severity = task.getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey());
+ if (severity != null) {
+ // XXX: refactor to use configuration
+ if ("blocker".equals(severity) || "critical".equals(severity)) { //$NON-NLS-1$ //$NON-NLS-2$
+ return BugzillaImages.OVERLAY_CRITICAL;
+ } else if ("major".equals(severity)) { //$NON-NLS-1$
+ return BugzillaImages.OVERLAY_MAJOR;
+ } else if ("enhancement".equals(severity)) { //$NON-NLS-1$
+ return BugzillaImages.OVERLAY_ENHANCEMENT;
+ } else if ("trivial".equals(severity) || "minor".equals(severity)) { //$NON-NLS-1$ //$NON-NLS-2$
+ return BugzillaImages.OVERLAY_MINOR;
+ } else {
+ return null;
+ }
+ }
+ return super.getTaskKindOverlay(task);
+ }
+
+ @Override
+ public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
+ ArrayList<IHyperlink> hyperlinksFound = null;
+
+ Matcher m = PATTERN.matcher(text);
+ while (m.find()) {
+ if (index == -1 || (index >= m.start() && index <= m.end())) {
+ IHyperlink link = extractHyperlink(repository, textOffset, m);
+ if (link != null) {
+ if (hyperlinksFound == null) {
+ hyperlinksFound = new ArrayList<IHyperlink>();
+ }
+ hyperlinksFound.add(link);
+ }
+ }
+ }
+
+ return (hyperlinksFound != null) ? hyperlinksFound.toArray(new IHyperlink[0]) : null;
+ }
+
+ @Override
+ public String getTaskKindLabel(ITask repositoryTask) {
+ return IBugzillaConstants.BUGZILLA_TASK_KIND;
+ }
+
+ @Override
+ public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) {
+ return new BugzillaRepositorySettingsPage(taskRepository);
+ }
+
+ @Override
+ public AbstractRepositoryQueryPage getSearchPage(TaskRepository repository, IStructuredSelection selection) {
+ return new BugzillaSearchPage(repository);
+ }
+
+ @Override
+ public IWizard getNewTaskWizard(TaskRepository taskRepository, ITaskMapping selection) {
+ return new NewBugzillaTaskWizard(taskRepository, selection);
+ }
+
+ @Override
+ public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery query) {
+ RepositoryQueryWizard wizard = new RepositoryQueryWizard(repository);
+ if (query == null) {
+ wizard.addPage(new BugzillaQueryTypeWizardPage(repository));
+ } else {
+ if (isCustomQuery(query)) {
+ wizard.addPage(new BugzillaCustomQueryWizardPage(repository, query));
+ } else {
+ wizard.addPage(new BugzillaSearchPage(repository, query));
+ }
+ }
+ return wizard;
+ }
+
+ @Override
+ public boolean hasSearchPage() {
+ return true;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ private boolean isCustomQuery(IRepositoryQuery query2) {
+ String custom = query2.getAttribute(IBugzillaConstants.ATTRIBUTE_BUGZILLA_QUERY_CUSTOM);
+ return custom != null && custom.equals(Boolean.TRUE.toString());
+ }
+
+ private static IHyperlink extractHyperlink(TaskRepository repository, int regionOffset, Matcher m) {
+
+ int start = -1;
+
+ if (m.group().startsWith("duplicate")) { //$NON-NLS-1$
+ start = m.start() + m.group().indexOf(m.group(TASK_NUM_GROUP));
+ } else {
+ start = m.start();
+ }
+
+ int end = m.end();
+
+ if (end == -1) {
+ end = m.group().length();
+ }
+
+ try {
+
+ String bugId = m.group(TASK_NUM_GROUP).trim();
+ start += regionOffset;
+ end += regionOffset;
+
+ IRegion sregion = new Region(start, end - start);
+ return new TaskHyperlink(sregion, repository, bugId);
+
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public IWizardPage getTaskAttachmentPage(TaskAttachmentModel model) {
+ return new BugzillaTaskAttachmentPage(model);
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryDialog.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryDialog.java
new file mode 100644
index 0000000..1e309a6
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryDialog.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class BugzillaCustomQueryDialog extends Dialog {
+ private String url;
+
+ private String name = ""; //$NON-NLS-1$
+
+ private String startingUrl = null;
+
+ private String maxHits;
+
+ private Text maxHitsText;
+
+ private Text nameText;
+
+ private Text queryText;
+
+ public BugzillaCustomQueryDialog(Shell parentShell, String queryString, String description, String maxHits) {
+ super(parentShell);
+ this.startingUrl = queryString;
+ this.maxHits = maxHits;
+ this.name = description;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getMaxHits() {
+ return maxHits;
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite custom = new Composite(parent, SWT.NONE);
+ GridLayout gl = new GridLayout(2, false);
+ custom.setLayout(gl);
+
+ Label l = new Label(custom, SWT.NONE);
+ l.setText(Messages.BugzillaCustomQueryDialog_Bugzilla_Query_Category_Name);
+
+ nameText = new Text(custom, SWT.BORDER | SWT.SINGLE);
+ if (name != null) {
+ nameText.setText(name);
+ }
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = 300;
+ nameText.setLayoutData(gd);
+
+ l = new Label(custom, SWT.NONE);
+ l.setText(Messages.BugzillaCustomQueryDialog_Max_Hits_Returned__1_means_all_);
+
+ maxHitsText = new Text(custom, SWT.BORDER | SWT.SINGLE);
+ if (maxHits != null) {
+ maxHitsText.setText(maxHits);
+ }
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = 300;
+ maxHitsText.setLayoutData(gd);
+
+ l = new Label(custom, SWT.NONE);
+ l.setText(Messages.BugzillaCustomQueryDialog_Query_URL);
+
+ queryText = new Text(custom, SWT.BORDER | SWT.SINGLE);
+ if (startingUrl != null) {
+ queryText.setText(startingUrl);
+ }
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = 300;
+ queryText.setLayoutData(gd);
+
+ Control c = super.createContents(parent);
+
+ return c;
+ }
+
+ @Override
+ protected void okPressed() {
+ // TODO validate the values
+ url = queryText.getText();
+ name = nameText.getText();
+ maxHits = maxHitsText.getText();
+ super.okPressed();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryWizardPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryWizardPage.java
new file mode 100644
index 0000000..a9a57ca
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaCustomQueryWizardPage.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.tasklist;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ */
+public class BugzillaCustomQueryWizardPage extends AbstractRepositoryQueryPage {
+
+ private static final String LABEL_CUSTOM_TITLE = Messages.BugzillaCustomQueryWizardPage_Query_Title;
+
+ private static final String LABEL_CUSTOM_QUERY = Messages.BugzillaCustomQueryWizardPage_Query_URL;
+
+ private static final String TITLE = Messages.BugzillaCustomQueryWizardPage_Create_query_from_URL;
+
+ private static final String DESCRIPTION = Messages.BugzillaCustomQueryWizardPage_Enter_the_title_and_URL_for_the_query;
+
+ private Text queryText;
+
+ private final IRepositoryQuery query;
+
+ private Text queryTitle;
+
+ public BugzillaCustomQueryWizardPage(TaskRepository repository, IRepositoryQuery query) {
+ super(TITLE, repository, query);
+ this.query = query;
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ setImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ }
+
+ public BugzillaCustomQueryWizardPage(TaskRepository repository) {
+ this(repository, null);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ setControl(composite);
+
+ ModifyListener modifyListener = new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ setPageComplete(isPageComplete());
+ }
+ };
+
+ final Label queryTitleLabel = new Label(composite, SWT.NONE);
+ queryTitleLabel.setText(LABEL_CUSTOM_TITLE);
+
+ queryTitle = new Text(composite, SWT.BORDER);
+ queryTitle.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ queryTitle.addModifyListener(modifyListener);
+ queryTitle.setFocus();
+
+ final Label queryUrlLabel = new Label(composite, SWT.NONE);
+ queryUrlLabel.setText(LABEL_CUSTOM_QUERY);
+
+ queryText = new Text(composite, SWT.BORDER);
+ final GridData gd_queryText = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gd_queryText.widthHint = 300;
+ queryText.setLayoutData(gd_queryText);
+ queryText.addModifyListener(modifyListener);
+
+ if (query != null) {
+ queryTitle.setText(query.getSummary());
+ queryText.setText(query.getUrl());
+ }
+ Dialog.applyDialogFont(composite);
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return queryTitle.getText();
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return false;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (super.isPageComplete()) {
+ if (queryText.getText().length() > 0) {
+ return true;
+ }
+ setErrorMessage(Messages.BugzillaCustomQueryWizardPage_Please_specify_Query_URL);
+ }
+ return false;
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ query.setSummary(this.getQueryTitle());
+ query.setUrl(queryText.getText());
+ query.setAttribute(IBugzillaConstants.ATTRIBUTE_BUGZILLA_QUERY_CUSTOM, Boolean.TRUE.toString());
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaQueryTypeWizardPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaQueryTypeWizardPage.java
new file mode 100644
index 0000000..ef43545
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaQueryTypeWizardPage.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchPage;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaQueryTypeWizardPage extends WizardPage {
+
+ private static final String BUTTON_LABEL_QUERY = Messages.BugzillaQueryTypeWizardPage_Create_query_from_existing_URL;
+
+ private static final String BUTTON_LABEL_FORM = Messages.BugzillaQueryTypeWizardPage_Create_query_using_form;
+
+ private static final String TITLE = Messages.BugzillaQueryTypeWizardPage_Choose_query_type;
+
+ private static final String DESCRIPTION = Messages.BugzillaQueryTypeWizardPage_Select_from_the_available_query_types;
+
+ private Button buttonCustom;
+
+ private Button buttonForm;
+
+ private Composite composite;
+
+ private final BugzillaCustomQueryWizardPage customPage;
+
+ private final BugzillaSearchPage searchPage;
+
+ public BugzillaQueryTypeWizardPage(TaskRepository repository) {
+ super(TITLE);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ setImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ customPage = new BugzillaCustomQueryWizardPage(repository);
+ searchPage = new BugzillaSearchPage(repository);
+ searchPage.setRestoreQueryOptions(false);
+ }
+
+ public void createControl(Composite parent) {
+ composite = new Composite(parent, SWT.NONE);
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ gridData.grabExcessVerticalSpace = false;
+ composite.setLayoutData(gridData);
+ composite.setLayout(new GridLayout(1, false));
+
+ buttonForm = new Button(composite, SWT.RADIO);
+ buttonForm.setText(BUTTON_LABEL_FORM);
+ buttonForm.setSelection(true);
+
+ buttonCustom = new Button(composite, SWT.RADIO);
+ buttonCustom.setText(BUTTON_LABEL_QUERY);
+
+ setPageComplete(true);
+ setControl(composite);
+ Dialog.applyDialogFont(composite);
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ if (buttonForm.getSelection()) {
+ searchPage.setWizard(this.getWizard());
+ return searchPage;
+ }
+ customPage.setWizard(this.getWizard());
+ return customPage;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java
new file mode 100644
index 0000000..2c20250
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaRepositorySettingsPage.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClientFactory;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaLanguageSettings;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaStatus;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaRepositorySettingsPage extends AbstractRepositorySettingsPage {
+
+ private static final String TOOLTIP_AUTODETECTION_ENABLED = Messages.BugzillaRepositorySettingsPage_override_auto_detection_of_platform;
+
+ private static final String TOOLTIP_AUTODETECTION_DISABLED = Messages.BugzillaRepositorySettingsPage_available_once_repository_created;
+
+ private static final String LABEL_SHORT_LOGINS = Messages.BugzillaRepositorySettingsPage_local_users_enabled;
+
+ private static final String LABEL_VERSION_NUMBER = "2.18 - 3.2"; //$NON-NLS-1$
+
+ private static final String TITLE = Messages.BugzillaRepositorySettingsPage_bugzilla_repository_settings;
+
+ private static final String DESCRIPTION = MessageFormat.format(
+ Messages.BugzillaRepositorySettingsPage_supports_bugzilla_X, LABEL_VERSION_NUMBER)
+ + Messages.BugzillaRepositorySettingsPage_example_do_not_include;
+
+ protected Button autodetectPlatformOS;
+
+ protected Combo defaultPlatformCombo;
+
+ protected Combo defaultOSCombo;
+
+ private Button cleanQAContact;
+
+ private RepositoryConfiguration repositoryConfiguration = null;
+
+ private String platform = null;
+
+ private String os = null;
+
+ private Combo languageSettingCombo;
+
+ public BugzillaRepositorySettingsPage(TaskRepository taskRepository) {
+ super(TITLE, DESCRIPTION, taskRepository);
+ setNeedsAnonymousLogin(true);
+ setNeedsEncoding(true);
+ setNeedsTimeZone(false);
+ setNeedsHttpAuth(true);
+ }
+
+ @Override
+ protected void repositoryTemplateSelected(RepositoryTemplate template) {
+ repositoryLabelEditor.setStringValue(template.label);
+ setUrl(template.repositoryUrl);
+ // setAnonymous(info.anonymous);
+ if (template.characterEncoding != null) {
+ setEncoding(template.characterEncoding);
+ }
+ getContainer().updateButtons();
+
+ }
+
+ @Override
+ protected void createAdditionalControls(Composite parent) {
+ addRepositoryTemplatesToServerUrlCombo();
+
+ Label shortLoginLabel = new Label(parent, SWT.NONE);
+ shortLoginLabel.setText(LABEL_SHORT_LOGINS);
+ cleanQAContact = new Button(parent, SWT.CHECK | SWT.LEFT);
+ if (repository != null) {
+ boolean shortLogin = Boolean.parseBoolean(repository.getProperty(IBugzillaConstants.REPOSITORY_SETTING_SHORT_LOGIN));
+ cleanQAContact.setSelection(shortLogin);
+ }
+
+ if (null != repository) {
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository.getRepositoryUrl());
+ platform = repository.getProperty(IBugzillaConstants.BUGZILLA_DEF_PLATFORM);
+ os = repository.getProperty(IBugzillaConstants.BUGZILLA_DEF_OS);
+ }
+
+ Label defaultPlatformLabel = new Label(parent, SWT.NONE);
+ defaultPlatformLabel.setText(Messages.BugzillaRepositorySettingsPage_AUTOTETECT_PLATFORM_AND_OS);
+ if (null == repository) {
+ defaultPlatformLabel.setToolTipText(TOOLTIP_AUTODETECTION_DISABLED);
+ } else {
+ defaultPlatformLabel.setToolTipText(TOOLTIP_AUTODETECTION_ENABLED);
+ }
+
+ Composite platformOSContainer = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout(3, false);
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ platformOSContainer.setLayout(gridLayout);
+
+ autodetectPlatformOS = new Button(platformOSContainer, SWT.CHECK);
+ autodetectPlatformOS.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (autodetectPlatformOS.isEnabled() && repositoryConfiguration == null
+ && !autodetectPlatformOS.getSelection()) {
+ try {
+ getWizard().getContainer().run(true, false, new IRunnableWithProgress() {
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException {
+ try {
+ monitor.beginTask(
+ Messages.BugzillaRepositorySettingsPage_Retrieving_repository_configuration,
+ IProgressMonitor.UNKNOWN);
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository,
+ false, monitor);
+ if (repositoryConfiguration != null) {
+ platform = repository.getProperty(IBugzillaConstants.BUGZILLA_DEF_PLATFORM);
+ os = repository.getProperty(IBugzillaConstants.BUGZILLA_DEF_OS);
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+
+ public void run() {
+ populatePlatformCombo();
+ populateOsCombo();
+ }
+ });
+ }
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+
+ }
+
+ });
+ } catch (InvocationTargetException e1) {
+ if (e1.getCause() != null) {
+ setErrorMessage(e1.getCause().getMessage());
+ }
+ } catch (InterruptedException e1) {
+ // ignore
+ }
+ }
+ defaultPlatformCombo.setEnabled(!autodetectPlatformOS.getSelection());
+ defaultOSCombo.setEnabled(!autodetectPlatformOS.getSelection());
+ }
+
+ });
+ autodetectPlatformOS.setEnabled(null != repository);
+ if (null == repository) {
+ autodetectPlatformOS.setToolTipText(TOOLTIP_AUTODETECTION_DISABLED);
+ } else {
+ autodetectPlatformOS.setToolTipText(TOOLTIP_AUTODETECTION_ENABLED);
+ }
+ autodetectPlatformOS.setSelection(null == platform && null == os);
+
+ defaultPlatformCombo = new Combo(platformOSContainer, SWT.READ_ONLY);
+ populatePlatformCombo();
+
+ defaultOSCombo = new Combo(platformOSContainer, SWT.READ_ONLY);
+ populateOsCombo();
+
+ new Label(parent, SWT.NONE).setText(Messages.BugzillaRepositorySettingsPage_Language_);
+ languageSettingCombo = new Combo(parent, SWT.DROP_DOWN);
+
+ for (BugzillaLanguageSettings bugzillaLanguageSettings : BugzillaCorePlugin.getDefault().getLanguageSettings()) {
+ languageSettingCombo.add(bugzillaLanguageSettings.getLanguageName());
+ }
+ if (repository != null) {
+ String language = repository.getProperty(IBugzillaConstants.BUGZILLA_LANGUAGE_SETTING);
+ if (language != null && !language.equals("") && languageSettingCombo.indexOf(language) >= 0) { //$NON-NLS-1$
+ languageSettingCombo.select(languageSettingCombo.indexOf(language));
+ }
+ }
+ if (languageSettingCombo.getSelectionIndex() == -1) {
+ if (languageSettingCombo.indexOf(IBugzillaConstants.DEFAULT_LANG) >= 0) {
+ languageSettingCombo.select(languageSettingCombo.indexOf(IBugzillaConstants.DEFAULT_LANG));
+ }
+ }
+ }
+
+ private void populateOsCombo() {
+ if (null != repositoryConfiguration && defaultOSCombo != null) {
+ defaultOSCombo.removeAll();
+ List<String> optionValues = repositoryConfiguration.getOSs();
+ for (String option : optionValues) {
+ defaultOSCombo.add(option.toString());
+ }
+ if (null != os && defaultOSCombo.indexOf(os) >= 0) {
+ defaultOSCombo.select(defaultOSCombo.indexOf(os));
+ } else {
+ // remove value if no longer exists and set to All!
+ repository.removeProperty(IBugzillaConstants.BUGZILLA_DEF_OS);
+ defaultOSCombo.select(0);
+ }
+ } else {
+ defaultOSCombo.add(Messages.BugzillaRepositorySettingsPage_All);
+ defaultOSCombo.select(0);
+ }
+ defaultOSCombo.getParent().pack(true);
+ defaultOSCombo.setEnabled(!autodetectPlatformOS.getSelection());
+ }
+
+ private void populatePlatformCombo() {
+ if (null != repositoryConfiguration && defaultPlatformCombo != null) {
+ defaultPlatformCombo.removeAll();
+ List<String> optionValues = repositoryConfiguration.getPlatforms();
+ for (String option : optionValues) {
+ defaultPlatformCombo.add(option.toString());
+ }
+ if (null != platform && defaultPlatformCombo.indexOf(platform) >= 0) {
+ defaultPlatformCombo.select(defaultPlatformCombo.indexOf(platform));
+ } else {
+ // remove value if no longer exists and set to All!
+ repository.removeProperty(IBugzillaConstants.BUGZILLA_DEF_PLATFORM);
+ defaultPlatformCombo.select(0);
+ }
+ } else {
+ defaultPlatformCombo.add(Messages.BugzillaRepositorySettingsPage_All);
+ defaultPlatformCombo.select(0);
+ }
+ defaultPlatformCombo.getParent().pack(true);
+ defaultPlatformCombo.setEnabled(!autodetectPlatformOS.getSelection());
+ }
+
+ @Override
+ public void applyTo(TaskRepository repository) {
+ super.applyTo(repository);
+ repository.setProperty(IBugzillaConstants.REPOSITORY_SETTING_SHORT_LOGIN,
+ String.valueOf(cleanQAContact.getSelection()));
+ repository.setProperty(IBugzillaConstants.BUGZILLA_LANGUAGE_SETTING, languageSettingCombo.getText());
+
+ if (!autodetectPlatformOS.getSelection()) {
+ repository.setProperty(IBugzillaConstants.BUGZILLA_DEF_PLATFORM,
+ String.valueOf(defaultPlatformCombo.getItem(defaultPlatformCombo.getSelectionIndex())));
+ repository.setProperty(IBugzillaConstants.BUGZILLA_DEF_OS,
+ String.valueOf(defaultOSCombo.getItem(defaultOSCombo.getSelectionIndex())));
+ } else {
+ repository.removeProperty(IBugzillaConstants.BUGZILLA_DEF_PLATFORM);
+ repository.removeProperty(IBugzillaConstants.BUGZILLA_DEF_OS);
+ }
+ }
+
+ @Override
+ protected boolean isValidUrl(String url) {
+ return BugzillaClient.isValidUrl(url);
+ }
+
+ @Override
+ protected Validator getValidator(TaskRepository repository) {
+ return new BugzillaValidator(repository);
+ }
+
+ public class BugzillaValidator extends Validator {
+
+ final TaskRepository repository;
+
+ public BugzillaValidator(TaskRepository repository) {
+ this.repository = repository;
+ }
+
+ @Override
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ validate(monitor);
+ } catch (Exception e) {
+ displayError(repository.getRepositoryUrl(), e);
+ }
+ }
+
+ private void displayError(final String serverUrl, Throwable e) {
+ IStatus status;
+ if (e instanceof MalformedURLException) {
+ status = new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_NETWORK, Messages.BugzillaRepositorySettingsPage_Server_URL_is_invalid);
+ } else if (e instanceof CoreException) {
+ status = ((CoreException) e).getStatus();
+ } else if (e instanceof IOException) {
+ status = new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_IO,
+ serverUrl, e.getMessage());
+ } else {
+ status = new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_NETWORK, serverUrl, e.getMessage());
+ }
+ setStatus(status);
+ }
+
+ public void validate(IProgressMonitor monitor) throws IOException, CoreException {
+
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ try {
+ monitor.beginTask(Messages.BugzillaRepositorySettingsPage_Validating_server_settings,
+ IProgressMonitor.UNKNOWN);
+ BugzillaClient client = null;
+
+ client = BugzillaClientFactory.createClient(repository);
+ client.validate(monitor);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskAttachmentPage.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskAttachmentPage.java
new file mode 100644
index 0000000..dab7208
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskAttachmentPage.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaFlag;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaFlagMapper;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.wizards.TaskAttachmentPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+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.swt.widgets.Text;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Frank Becker
+ */
+public class BugzillaTaskAttachmentPage extends TaskAttachmentPage {
+
+ private final List<BugzillaFlag> flagAttributes = new ArrayList<BugzillaFlag>();
+
+ private final FormToolkit toolkit;
+
+ private ExpandableComposite flagExpandComposite = null;
+
+ private Composite scrollComposite;
+
+ public BugzillaTaskAttachmentPage(TaskAttachmentModel model) {
+ super(model);
+ toolkit = new FormToolkit(Display.getCurrent());
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ RepositoryConfiguration configuration = BugzillaCorePlugin.getRepositoryConfiguration(getModel().getTaskRepository()
+ .getRepositoryUrl());
+ if (configuration != null) {
+ List<BugzillaFlag> flags = configuration.getFlags();
+ TaskAttribute productAttribute = getModel().getAttribute().getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.PRODUCT.getKey());
+ TaskAttribute componentAttribute = getModel().getAttribute().getTaskData().getRoot().getMappedAttribute(
+ BugzillaAttribute.COMPONENT.getKey());
+ Control[] children = parent.getChildren();
+ Composite pageComposite = (Composite) children[children.length - 1];
+ Composite flagComposite = null;
+ for (BugzillaFlag bugzillaFlag : flags) {
+ if (bugzillaFlag.getType().equals("bug")) { //$NON-NLS-1$
+ continue;
+ }
+ if (!bugzillaFlag.isUsedIn(productAttribute.getValue(), componentAttribute.getValue())) {
+ continue;
+ }
+
+ if (flagComposite == null) {
+ flagComposite = createFlagSection(pageComposite);
+ }
+ BugzillaFlagMapper mapper = new BugzillaFlagMapper();
+ mapper.setRequestee(""); //$NON-NLS-1$
+ mapper.setSetter(""); //$NON-NLS-1$
+ mapper.setState(" "); //$NON-NLS-1$
+ mapper.setFlagId(bugzillaFlag.getName());
+ mapper.setNumber(0);
+ final TaskAttribute attribute = getModel().getAttribute().createAttribute(
+ "task.common.kind.flag_type" + bugzillaFlag.getFlagId()); //$NON-NLS-1$
+ mapper.applyTo(attribute);
+
+ Label flagLiteral = new Label(flagComposite, SWT.NONE);
+ flagLiteral.setText("" + bugzillaFlag.getName()); //$NON-NLS-1$
+ flagLiteral.setToolTipText(bugzillaFlag.getDescription());
+ flagAttributes.add(bugzillaFlag);
+ final Combo flagState = new Combo(flagComposite, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
+ flagState.add(" "); //$NON-NLS-1$
+ if (bugzillaFlag.isRequestable()) {
+ flagState.add("?"); //$NON-NLS-1$
+ }
+ flagState.add("+"); //$NON-NLS-1$
+ flagState.add("-"); //$NON-NLS-1$
+ if (bugzillaFlag.isRequestable() && bugzillaFlag.isSpecifically_requestable()) {
+ flagState.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 1, 1));
+ final Text requesteeText = new Text(flagComposite, SWT.BORDER);
+ requesteeText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
+ requesteeText.setEditable(false);
+ requesteeText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ TaskAttribute requesteeAttribute = attribute.getAttribute("requestee"); //$NON-NLS-1$
+ if (requesteeAttribute != null) {
+ String value = requesteeText.getText().trim();
+ requesteeAttribute.setValue(value);
+ }
+ }
+ });
+ flagState.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ TaskAttribute state = attribute.getAttribute("state"); //$NON-NLS-1$
+ if (state != null) {
+ String value = flagState.getItem(flagState.getSelectionIndex());
+ state.setValue(value);
+ requesteeText.setEditable(value.equals("?")); //$NON-NLS-1$
+ }
+ }
+ });
+ } else {
+ flagState.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 2, 1));
+ flagState.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ TaskAttribute state = attribute.getAttribute("state"); //$NON-NLS-1$
+ String value = flagState.getItem(flagState.getSelectionIndex());
+ if (state != null && value != null) {
+ state.setValue(value);
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+
+ private Composite createFlagSection(Composite container) {
+ flagExpandComposite = toolkit.createExpandableComposite(container, ExpandableComposite.COMPACT
+ | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR);
+ flagExpandComposite.setFont(container.getFont());
+ flagExpandComposite.setBackground(container.getBackground());
+ flagExpandComposite.setText(Messages.BugzillaTaskAttachmentPage_flags);
+ flagExpandComposite.setLayout(new GridLayout(3, false));
+ GridData g = new GridData(GridData.FILL_HORIZONTAL);
+ g.horizontalSpan = 3;
+ flagExpandComposite.setLayoutData(g);
+ flagExpandComposite.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ getControl().getShell().pack();
+ }
+ });
+
+ scrollComposite = new Composite(flagExpandComposite, SWT.NONE);
+ scrollComposite.setLayout(new GridLayout(3, false));
+ flagExpandComposite.setClient(scrollComposite);
+ return scrollComposite;
+ }
+
+ @Override
+ public void dispose() {
+ if (toolkit != null) {
+ if (toolkit.getColors() != null) {
+ toolkit.dispose();
+ }
+ }
+ super.dispose();
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskListMigrator.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskListMigrator.java
new file mode 100644
index 0000000..9066348
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/BugzillaTaskListMigrator.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.w3c.dom.Element;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class BugzillaTaskListMigrator extends AbstractTaskListMigrator {
+
+ private static final String TAG_BUGZILLA_REPORT = "BugzillaReport"; //$NON-NLS-1$
+
+ private static final String KEY_SEVERITY = "bugzilla.severity"; //$NON-NLS-1$
+
+ private static final String KEY_PRODUCT = "bugzilla.product"; //$NON-NLS-1$
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public Set<String> getQueryElementNames() {
+ Set<String> names = new HashSet<String>();
+ names.add(IBugzillaConstants.TAG_BUGZILLA_QUERY);
+ names.add(IBugzillaConstants.TAG_BUGZILLA_CUSTOM_QUERY);
+ return names;
+ }
+
+ @Override
+ public String getTaskElementName() {
+ return TAG_BUGZILLA_REPORT;
+ }
+
+ @Override
+ public void migrateQuery(IRepositoryQuery query, Element element) {
+ if (element.getNodeName().equals(IBugzillaConstants.TAG_BUGZILLA_CUSTOM_QUERY)) {
+ query.setAttribute(IBugzillaConstants.ATTRIBUTE_BUGZILLA_QUERY_CUSTOM, Boolean.TRUE.toString());
+ }
+ }
+
+ @Override
+ public void migrateTask(ITask task, Element element) {
+ if (element.hasAttribute(KEY_SEVERITY)) {
+ task.setAttribute(BugzillaAttribute.BUG_SEVERITY.getKey(),
+ element.getAttribute(BugzillaAttribute.BUG_SEVERITY.getKey()));
+ }
+ if (element.hasAttribute(KEY_PRODUCT)) {
+ task.setAttribute(BugzillaAttribute.PRODUCT.getKey(),
+ element.getAttribute(BugzillaAttribute.PRODUCT.getKey()));
+ }
+ if (element.hasAttribute(KEY_LAST_MOD_DATE)) {
+ task.setAttribute(BugzillaAttribute.DELTA_TS.getKey(), element.getAttribute(KEY_LAST_MOD_DATE));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/Messages.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/Messages.java
new file mode 100644
index 0000000..fdf774f
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/Messages.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.bugzilla.ui.tasklist.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String BugzillaConnectorUi__In_reply_to_comment_X_;
+
+ public static String BugzillaConnectorUi__In_reply_to_X_comment_X_;
+
+ public static String BugzillaConnectorUi__In_reply_to_comment_0_;
+
+ public static String BugzillaCustomQueryDialog_Bugzilla_Query_Category_Name;
+
+ public static String BugzillaCustomQueryDialog_Max_Hits_Returned__1_means_all_;
+
+ public static String BugzillaCustomQueryDialog_Query_URL;
+
+ public static String BugzillaCustomQueryWizardPage_Create_query_from_URL;
+
+ public static String BugzillaCustomQueryWizardPage_Enter_the_title_and_URL_for_the_query;
+
+ public static String BugzillaCustomQueryWizardPage_Please_specify_Query_URL;
+
+ public static String BugzillaCustomQueryWizardPage_Query_Title;
+
+ public static String BugzillaCustomQueryWizardPage_Query_URL;
+
+ public static String BugzillaQueryTypeWizardPage_Choose_query_type;
+
+ public static String BugzillaQueryTypeWizardPage_Create_query_from_existing_URL;
+
+ public static String BugzillaQueryTypeWizardPage_Create_query_using_form;
+
+ public static String BugzillaQueryTypeWizardPage_Select_from_the_available_query_types;
+
+ public static String BugzillaRepositorySettingsPage_All;
+
+ public static String BugzillaRepositorySettingsPage_AUTOTETECT_PLATFORM_AND_OS;
+
+ public static String BugzillaRepositorySettingsPage_available_once_repository_created;
+
+ public static String BugzillaRepositorySettingsPage_bugzilla_repository_settings;
+
+ public static String BugzillaRepositorySettingsPage_example_do_not_include;
+
+ public static String BugzillaRepositorySettingsPage_Language_;
+
+ public static String BugzillaRepositorySettingsPage_local_users_enabled;
+
+ public static String BugzillaRepositorySettingsPage_override_auto_detection_of_platform;
+
+ public static String BugzillaRepositorySettingsPage_Retrieving_repository_configuration;
+
+ public static String BugzillaRepositorySettingsPage_Server_URL_is_invalid;
+
+ public static String BugzillaRepositorySettingsPage_supports_bugzilla_X;
+
+ public static String BugzillaRepositorySettingsPage_Validating_server_settings;
+
+ public static String BugzillaTaskAttachmentPage_flags;
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/StackTrace.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/StackTrace.java
new file mode 100644
index 0000000..7da62a1
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/StackTrace.java
@@ -0,0 +1,373 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.tasklist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to hold all of the information about a stack trace
+ *
+ * @author Shawn Minto
+ */
+public class StackTrace {
+
+ /** The length of the stack trace in the original string */
+ private final int length;
+
+ /** The offset of the stack trace in the orignal string */
+ private final int offset;
+
+ /** The string of the stack trace */
+ private final String stackTrace;
+
+ /**
+ * This is the comment that the stack trace appeared in. String if desciption else Comment
+ */
+ private final Object comment;
+
+ /**
+ * Constructor
+ *
+ * @param stackTrace
+ * The stack trace string
+ * @param offset
+ * The offset of the stack trace in the original string
+ * @param length
+ * The length of the stack trace in the original string
+ * @param comment
+ * The comment that the stack trace came from
+ */
+ public StackTrace(String stackTrace, int offset, int length, Object comment) {
+ this.stackTrace = stackTrace;
+ this.offset = offset;
+ this.length = length;
+ this.comment = comment;
+ }
+
+ /**
+ * Get the offset for the stack trace
+ *
+ * @return Returns the offset.
+ */
+ public int getOffset() {
+ return offset;
+ }
+
+ /**
+ * Get the stack trace for the bug
+ *
+ * @return Returns the stackTrace.
+ */
+ public String getStackTrace() {
+ return stackTrace;
+ }
+
+ /**
+ * Get the length of the bug
+ *
+ * @return Returns the length.
+ */
+ public int getLength() {
+ return length;
+ }
+
+ /**
+ * Get the Comment that this stack trace came from
+ *
+ * @return Returns the Comment if it was a comment else a String if it was the summary
+ */
+ public Object getComment() {
+ return comment;
+ }
+
+ /**
+ * Find a standard java stack trace in the given string
+ *
+ *
+ * @param s
+ * The string to search for stack traces
+ * @param comment
+ * The comment that the text came from.<br>
+ * Comment if a comment else a String
+ * @return String[] of stack traces - each element is 1 trace
+ */
+ public static StackTrace[] getStackTrace(String s, Object comment) {
+
+ // setup the regex used to determine if it looks like we are at a
+ // stack trace and whether it is something that should be skipped
+ String regexExceptionType = "^(.*\\.)+.+(Exception|Error|Throwable).*"; //$NON-NLS-1$
+ String regexSkip = ".*\\.\\..*"; //$NON-NLS-1$
+
+ // get all of the individual lines for the string
+ String[] lines = s.split("\r\n|\n"); //$NON-NLS-1$
+
+ // the character start of the current stack trace
+ int charStackStart = 0;
+
+ // the current character in the string - used for the start and the
+ // offset
+ int[] charPos = { 0 }; // array so pass by reference
+
+ boolean inStackTrace = false;
+ List<String> stackTrace = null;
+ List<StackTrace> stackTraces = new ArrayList<StackTrace>();
+
+ // go through each of the lines of the string
+ for (int i = 0; i < lines.length; i++) {
+
+ if (lines[i].matches(regexSkip)) {
+
+ // update the current character position
+ charPos[0] += lines[i].length() + 2;
+
+ } else if (lines[i].trim().matches(regexExceptionType) && !inStackTrace) {
+
+ // we have matched the stack trace and we are not already in one
+
+ // add the old stack trace to the list of stack traces
+ if (stackTrace != null && stackTrace.size() > 1) {
+ stackTraces.add(getStackTrace(stackTrace, charStackStart, charPos[0] - charStackStart, comment));
+ }
+
+ // prepare for a new stack trace
+ stackTrace = new ArrayList<String>();
+ inStackTrace = true;
+
+ // the current line is the start of our stack trace
+ stackTrace.add(lines[i]);
+ charStackStart = charPos[0];
+ charPos[0] += lines[i].length() + 2;
+ } else if (inStackTrace) {
+ // we are in a stack trace
+
+ int[] pos = { i }; // array so pass by reference
+
+ // get the next at clause of the stack trace
+ String stack = getNextAt(lines, pos, charPos);
+
+ // check if there was an at
+ if (stack == null) {
+
+ // there wasn't so we are done this stack trace
+ inStackTrace = false;
+ if (stackTrace != null && stackTrace.size() > 1) {
+ stackTraces.add(getStackTrace(stackTrace, charStackStart, charPos[0] - charStackStart, comment));
+ }
+ stackTrace = null;
+ } else if (stackTrace != null) {
+
+ // we had one, so add it to this stack trace
+ stackTrace.add(stack);
+ }
+
+ // update the position
+ i = pos[0];
+ } else {
+ // update the current character position
+ charPos[0] += lines[i].length() + 2;
+ }
+ }
+
+ // make sure to add the stack trace if it was the last in the string
+ if (stackTrace != null && stackTrace.size() > 1) {
+ stackTraces.add(getStackTrace(stackTrace, charStackStart, charPos[0] - charStackStart, comment));
+ }
+
+ if (stackTraces.size() == 0) {
+ return null;
+ }
+
+ // get the string values of the stack traces and return it
+ return getTracesFromList(stackTraces);
+ }
+
+ /**
+ * Get the next at clause from a potential stack trace -- looks ahead 4 lines
+ *
+ * @param lines
+ * The array of all of the lines in the bug
+ * @param i
+ * The current position to start at
+ * @param charPos
+ * The current character position in the original string
+ * @return The next at clause, or <code>null</code><br>
+ * If an at line is matched, but the end isn't within the 4 lines, only the first line is returned. Also,
+ * charPos is updated as well as i
+ */
+ private static String getNextAt(String[] lines, int[] i, int[] charPos) {
+ String regexAtString = "^at.*"; //$NON-NLS-1$
+ String regexEndString = ".*:\\d+\\)$"; //$NON-NLS-1$
+ int index = i[0];
+ String l1, l2, l3, l4;
+ l1 = l2 = l3 = l4 = null;
+ String res = null;
+
+ // get the first line to look at
+ if (lines.length > index) {
+ l1 = lines[index];
+ } else {
+ // if the first line doesn't exist, we are done and should
+ // return
+ return null;
+ }
+
+ // get the next 3 lines
+ if (lines.length > index + 1) {
+ l2 = lines[index + 1];
+ }
+ if (lines.length > index + 2) {
+ l3 = lines[index + 2];
+ }
+ if (lines.length > index + 3) {
+ l4 = lines[index + 3];
+ }
+
+ // make sure that the first line is the start of an at
+ // if not, return null
+ if (l1.trim().matches(regexAtString)) {
+ charPos[0] += l1.length() + 2;
+ res = l1;
+ } else {
+ return null;
+ }
+
+ // now determine where the end is if it wasn't on 1 line
+ if (!res.trim().matches(regexEndString)) {
+
+ if (l2 != null && l2.trim().matches(regexEndString)) {
+
+ // it was on the second line
+ // update the current position and the result string
+ i[0] = index + 1;
+ charPos[0] += l2.length() + 2;
+ res += l2.trim();
+ } else if (l2 != null && l3 != null && l3.trim().matches(regexEndString)) {
+
+ // it was on the third line
+ // update the current position and the result string
+ i[0] = index + 2;
+ charPos[0] += l2.length() + l3.length() + 4;
+ res += l2.trim();
+ res += l3.trim();
+ } else if (l2 != null && l3 != null && l4 != null && l4.trim().matches(regexEndString)) {
+
+ // it was on the fourth line
+ // update the current position and the result string
+ i[0] = index + 3;
+ charPos[0] += l2.length() + l3.length() + l4.length() + 6;
+ res += l2.trim();
+ res += l3.trim();
+ res += l4.trim();
+ }
+ }
+
+ // return the result
+ return res;
+ }
+
+ /**
+ * Get the StackTrace
+ *
+ * @param l
+ * the list of lines that contain the trace
+ * @param start
+ * the start of the stack trace
+ * @param offset
+ * the offset of the stack trace
+ * @param comment
+ * The comment that the stack trace came from
+ * @return The StackTrace for the given data
+ */
+ private static StackTrace getStackTrace(List<String> l, int offset, int length, Object comment) {
+ String s = ""; //$NON-NLS-1$
+ for (String s2 : l) {
+ s += s2 + "\r\n"; //$NON-NLS-1$
+ }
+
+ return new StackTrace(s, offset, length, comment);
+ }
+
+ /**
+ * Convert a List StackTraces to a StackTrace[] <br>
+ *
+ * @param l
+ * The List of StackTraces
+ * @return StackTrace[] of the List
+ */
+ private static StackTrace[] getTracesFromList(List<StackTrace> l) {
+
+ // make sure that there is something to convert, else return null
+ if (l == null || l.size() == 0) {
+ return null;
+ }
+
+ // convert the list of strings to an array of strings
+ int i = 0;
+ StackTrace[] s = new StackTrace[l.size()];
+
+ for (StackTrace st : l) {
+ s[i] = st;
+ i++;
+ }
+
+ // return the string array
+ return s;
+ }
+
+ /**
+ * Escape all of the special regex characters from the string
+ *
+ * @param s
+ * The string to escape the characters for
+ * @return A string with all of the special characters escaped <br>
+ * <code>
+ * . => \.<br>
+ * $ => \$<br>
+ * ? => \?<br>
+ * { => \{<br>
+ * } => \}<br>
+ * ( => \(<br>
+ * ) => \)<br>
+ * [ => \[<br>
+ * ] => \]<br>
+ * + => \+<br>
+ * * => \*<br>
+ * | => \|<br>
+ * ^ => \^<br>
+ * \ => \\<br>
+ * / => \/<br>
+ * </code>
+ */
+ public static String escapeForRegex(String s) {
+ String sFixed = s;
+
+ // replace all special regex characters
+ sFixed = sFixed.replaceAll("\\\\", "\\\\\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\$", "\\\\\\$"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\.", "\\\\."); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\?", "\\\\?"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\{", "\\\\{"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\}", "\\\\}"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\(", "\\\\("); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\)", "\\\\)"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\[", "\\\\["); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\]", "\\\\]"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\+", "\\\\+"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\*", "\\\\*"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\|", "\\\\|"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\^", "\\\\^"); //$NON-NLS-1$ //$NON-NLS-2$
+ sFixed = sFixed.replaceAll("\\/", "\\\\/"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ return sFixed;
+ }
+}
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/messages.properties b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/messages.properties
new file mode 100644
index 0000000..1a2bd94
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/tasklist/messages.properties
@@ -0,0 +1,31 @@
+BugzillaConnectorUi__In_reply_to_comment_X_=(In reply to comment \#{0})
+BugzillaConnectorUi__In_reply_to_X_comment_X_=(In reply to {0} comment \#{1})
+BugzillaConnectorUi__In_reply_to_comment_0_=(In reply to comment \#0)
+BugzillaCustomQueryDialog_Bugzilla_Query_Category_Name=Bugzilla Query Category Name
+BugzillaCustomQueryDialog_Max_Hits_Returned__1_means_all_=Max Hits Returned (-1 means all)
+BugzillaCustomQueryDialog_Query_URL=Query URL
+
+BugzillaCustomQueryWizardPage_Create_query_from_URL=Create query from URL
+BugzillaCustomQueryWizardPage_Enter_the_title_and_URL_for_the_query=Enter the title and URL for the query
+BugzillaCustomQueryWizardPage_Please_specify_Query_URL=Please specify Query URL
+BugzillaCustomQueryWizardPage_Query_Title=&Query Title:
+BugzillaCustomQueryWizardPage_Query_URL=Query &URL
+
+BugzillaQueryTypeWizardPage_Choose_query_type=Choose query type
+BugzillaQueryTypeWizardPage_Create_query_from_existing_URL=&Create query from existing URL
+BugzillaQueryTypeWizardPage_Create_query_using_form=Cre&ate query using form
+BugzillaQueryTypeWizardPage_Select_from_the_available_query_types=Select from the available query types.
+
+BugzillaRepositorySettingsPage_All=All
+BugzillaRepositorySettingsPage_AUTOTETECT_PLATFORM_AND_OS=Autodetect platform and os
+BugzillaRepositorySettingsPage_available_once_repository_created=Available once repository has been created.
+BugzillaRepositorySettingsPage_bugzilla_repository_settings=Bugzilla Repository Settings
+BugzillaRepositorySettingsPage_example_do_not_include=\nExample: https://bugs.eclipse.org/bugs (do not include index.cgi)
+BugzillaRepositorySettingsPage_Language_=Language:
+BugzillaRepositorySettingsPage_local_users_enabled=Local users enabled:
+BugzillaRepositorySettingsPage_override_auto_detection_of_platform=Override auto detection of Platform and OS for new bug reports.
+BugzillaRepositorySettingsPage_Retrieving_repository_configuration=Retrieving repository configuration
+BugzillaRepositorySettingsPage_Server_URL_is_invalid=Server URL is invalid.
+BugzillaRepositorySettingsPage_supports_bugzilla_X=Supports Bugzilla {0}
+BugzillaRepositorySettingsPage_Validating_server_settings=Validating server settings
+BugzillaTaskAttachmentPage_flags=Flags
diff --git a/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/NewBugzillaTaskWizard.java b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/NewBugzillaTaskWizard.java
new file mode 100644
index 0000000..c276549
--- /dev/null
+++ b/org.eclipse.mylyn.bugzilla.ui/src/org/eclipse/mylyn/internal/bugzilla/ui/wizard/NewBugzillaTaskWizard.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.ui.wizard;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class NewBugzillaTaskWizard extends NewTaskWizard implements INewWizard {
+
+ private IStructuredSelection selection;
+
+ public NewBugzillaTaskWizard(TaskRepository taskRepository, ITaskMapping taskSelection) {
+ super(taskRepository, taskSelection);
+ }
+
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ /**
+ * @since 3.0
+ */
+ @Override
+ protected ITaskMapping getInitializationData() {
+ if (getTaskSelection() != null) {
+ return getTaskSelection();
+ }
+
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null) {
+ IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+ if (window != null) {
+ ISelection sel = window.getSelectionService().getSelection();
+ if (sel instanceof IStructuredSelection) {
+ selection = (IStructuredSelection) sel;
+ }
+ }
+ }
+ if (selection == null || selection.isEmpty()) {
+ final String lastProductSelection = getTaskRepository().getProperty(
+ IBugzillaConstants.LAST_PRODUCT_SELECTION);
+ final String lastComponentSelection = getTaskRepository().getProperty(
+ IBugzillaConstants.LAST_COMPONENT_SELECTION);
+ return new TaskMapping() {
+ @Override
+ public String getProduct() {
+ return lastProductSelection;
+ }
+
+ @Override
+ public String getComponent() {
+ return lastComponentSelection;
+ }
+ };
+
+ }
+
+ final ArrayList<String> products = new ArrayList<String>();
+
+ Object element = (selection).getFirstElement();
+ if (element instanceof ITask) {
+ ITask bugzillaTask = (ITask) element;
+ if (bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()) != null) {
+ products.add(bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()));
+ }
+ } else {
+ IRepositoryQuery query = null;
+ if (element instanceof IRepositoryQuery) {
+ query = (IRepositoryQuery) element;
+ }
+
+ if (query != null && query.getConnectorKind().equals(BugzillaCorePlugin.CONNECTOR_KIND)) {
+ String queryUrl = query.getUrl();
+ queryUrl = queryUrl.substring(queryUrl.indexOf("?") + 1); //$NON-NLS-1$
+ String[] options = queryUrl.split("&"); //$NON-NLS-1$
+
+ for (String option : options) {
+ int index = option.indexOf("="); //$NON-NLS-1$
+ if (index != -1) {
+ String key = option.substring(0, index);
+ if ("product".equals(key)) { //$NON-NLS-1$
+ try {
+ products.add(URLDecoder.decode(option.substring(index + 1),
+ getTaskRepository().getCharacterEncoding()));
+ // TODO: list box only accepts a single selection so
+ // we break on first found
+ break;
+ } catch (UnsupportedEncodingException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ } else {
+ if (element instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) element;
+ ITask task = (ITask) adaptable.getAdapter(ITask.class);
+ if (task != null) {
+ ITask bugzillaTask = (ITask) element;
+ if (bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()) != null) {
+ products.add(bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()));
+ }
+ }
+ }
+ }
+ }
+
+ if (products.size() > 0) {
+ return new TaskMapping() {
+ @Override
+ public String getProduct() {
+ return products.get(0);
+ }
+ };
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.core/.classpath b/org.eclipse.mylyn.commons.core/.classpath
new file mode 100644
index 0000000..41e559d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/runtime/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.commons.core/.cvsignore b/org.eclipse.mylyn.commons.core/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.commons.core/.project b/org.eclipse.mylyn.commons.core/.project
new file mode 100644
index 0000000..75e5ef5
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.commons.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..0711605
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.core.TimerThread' to 'ActivityTimerThread' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core.TimerThread' - Renamed element: 'org.eclipse.mylar.monitor.core.ActivityTimerThread' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TimerThread'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.core{TimerThread.java[TimerThread" matchStrategy="1" name="ActivityTimerThread" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170473912720" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..988b643
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1 @@
+1170473912720 Rename type 'TimerThread'
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..ee98d52
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.core.logging.InteractionEventLogger.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.monitor.core.logging{InteractionEventLogger.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170815623425" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original elements: org.eclipse.mylar.monitor.core.html.HtmlTag.java org.eclipse.mylar.monitor.core.html.HtmlStreamTokenizer.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.core.net" element1="/src<org.eclipse.mylar.monitor.core.html{HtmlTag.java" element2="/src<org.eclipse.mylar.monitor.core.html{HtmlStreamTokenizer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170818545620" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.html'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.core.html" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170818596883" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core.logging.AbstractMonitorLog.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core" element1="/src<org.eclipse.mylar.monitor.core.logging{AbstractMonitorLog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170818633978" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.core.collectors" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170818845448" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.core.InteractionEventObfuscator.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage" element1="/src<org.eclipse.mylar.monitor.core{InteractionEventObfuscator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170819056047" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original element: 'org.eclipse.mylar.monitor.core.collectors.AbstractMylarUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core.collectors" element1="/src<org.eclipse.mylar.monitor.core.collectors{AbstractMylarUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819706918" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original element: 'org.eclipse.mylar.monitor.core.collectors.PerspectiveUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core.collectors" element1="/src<org.eclipse.mylar.monitor.core.collectors{PerspectiveUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819897253" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.core.collectors.Util' to 'InteractionEventUtil' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core.collectors.Util' - Renamed element: 'org.eclipse.mylar.monitor.core.collectors.InteractionEventUtil' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'Util'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.core.collectors{Util.java[Util" matchStrategy="1" name="InteractionEventUtil" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170820123682" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui' - Original element: 'org.eclipse.mylar.monitor.core.collectors.InteractionEventSummarySorter.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage.ui" element1="/src<org.eclipse.mylar.monitor.core.collectors{InteractionEventSummarySorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820374833" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.core.collectors' to 'org.eclipse.mylar.monitor.core.collection' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Renamed element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collection' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.core.collectors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.core.collectors" name="org.eclipse.mylar.monitor.core.collection" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170820412668" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.logging'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.core.logging" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170868071765" subPackages="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.core.collection' to 'org.eclipse.mylar.internal.monitor.core.collection' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collection' - Renamed element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.internal.monitor.core.collection' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.core.collection'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.core.collection" name="org.eclipse.mylar.internal.monitor.core.collection" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170868139648" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..1739822
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,13 @@
+1170815623425 Move compilation unit
+1170818545620 Move compilation units
+1170818596883 Delete element
+1170818633978 Move compilation unit
+1170818845448 Delete element
+1170819056047 Move compilation unit
+1170819706918 Move compilation unit
+1170819897253 Move compilation unit
+1170820123682 Rename type 'Util'
+1170820374833 Move compilation unit
+1170820412668 Rename package 'org.eclipse.mylar.monitor.core.collectors'
+1170868071765 Delete element
+1170868139648 Rename package 'org.eclipse.mylar.monitor.core.collection'
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..03e0962
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.util.DateUtil.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{DateUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181334620271" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.monitor.core.util' to 'org.eclipse.mylyn.internal.monitor.core.util' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core.util' - Renamed element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core.util' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.monitor.core.util'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.monitor.core.util" name="org.eclipse.mylyn.internal.monitor.core.util" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181352154623" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..bf27356
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181334620271 Move compilation unit
+1181352154623 Rename package 'org.eclipse.mylyn.monitor.core.util'
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..7a32a00
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.monitor.core.util.StatusHandler' to 'StatusManager' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.util.StatusHandler' - Renamed element: 'org.eclipse.mylyn.internal.monitor.core.util.StatusManager' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'StatusHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.monitor.core.util{StatusHandler.java[StatusHandler" matchStrategy="1" name="StatusManager" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181944304394" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..a6aa5dc
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181944304394 Rename type 'StatusHandler'
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..592c5ef
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.core.XmlUtil' to 'XmlCleaner' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.monitor.core.XmlUtil' - Renamed element: 'org.eclipse.mylyn.monitor.core.XmlCleaner' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'XmlUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.core{XmlUtil.java[XmlUtil" matchStrategy="1" name="XmlCleaner" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182278817359" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original element: 'org.eclipse.mylyn.monitor.core.XmlUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.web.core" element1="/src<org.eclipse.mylyn.monitor.core{XmlUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182281734593" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.util.StatusManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{StatusManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182568808865" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.core.StatusManager' to 'StatusHandler' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.monitor.core.StatusManager' - Renamed element: 'org.eclipse.mylyn.monitor.core.StatusHandler' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'StatusManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.core{StatusManager.java[StatusManager" matchStrategy="1" name="StatusHandler" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182568887619" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..fd6b39b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,4 @@
+1182278817359 Rename type 'XmlUtil'
+1182281734593 Move compilation unit
+1182568808865 Move compilation unit
+1182568887619 Rename type 'StatusManager'
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..77cf6b5
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.collection.asdf.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.monitor.core.collection{asdf.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1184030298564" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..61a714d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184030298564 Delete element
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..6af492c
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core'
- Original element: 'org.eclipse.mylyn.internal.monitor.core.util.IStatusHandler.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{IStatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207704372900" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..9fb14b8
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1 @@
+1207704372900 Move compilation unit
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..f10172f
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 4 element(s) from project 'org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original elements:
 org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.monitor.core
 org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.monitor.core.collection
 org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.monitor.core.util
 org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.monitor.core" description="Delete elements" element1="/src<org.eclipse.mylyn.monitor.core" element10="/src<org" element2="/src<org.eclipse.mylyn.monitor" element3="/src<org.eclipse.mylyn.internal.monitor.core.util" element4="/src<org.eclipse.mylyn.internal.monitor.core.collection" element5="/src<org.eclipse.mylyn.internal.monitor.core" element6="/src<org.eclipse.mylyn.internal.monitor" element7="/src<org.eclipse.mylyn.internal" element8="/src<org.eclipse.mylyn" element9="/src<org.eclipse" elements="10" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209508153123" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'pom.xml'" description="Delete element" element1="pom.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1209509360854" subPackages="false" version="1.0"/>
<refactoring comment="Move 2 element(s) to 'org.eclipse.mylyn.internal.commons.core.XmlStringConverter'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: 'org.eclipse.mylyn.internal.commons.core.XmlStringConverter'
- Original elements:
 org.eclipse.mylyn.internal.commons.core.XmlUtil.cleanXmlString(...)
 org.eclipse.mylyn.internal.commons.core.XmlUtil.isValid(...)
- Textual move only" description="Move methods" destination="/src<org.eclipse.mylyn.internal.commons.core{XmlStringConverter.java[XmlStringConverter" element1="/src<org.eclipse.mylyn.internal.commons.core{XmlUtil.java[XmlUtil~cleanXmlString~QString;" element2="/src<org.eclipse.mylyn.internal.commons.core{XmlUtil.java[XmlUtil~isValid~C" flags="589830" id="org.eclipse.jdt.ui.move" members="2" policy="org.eclipse.jdt.ui.moveMembers" stamp="1209512880029" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.internal.commons.core.XmlUtil.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.commons.core{XmlUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209512895237" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.commons.core.IMonitorCoreConstants' to 'ICommonsCoreConstants'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.internal.commons.core.IMonitorCoreConstants'
- Renamed element: 'org.eclipse.mylyn.internal.commons.core.ICommonsCoreConstants'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'IMonitorCoreConstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.commons.core{IMonitorCoreConstants.java[IMonitorCoreConstants" matchStrategy="1" name="ICommonsCoreConstants" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1209514385281" textual="true" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core'
- Original element: 'org.eclipse.mylyn.internal.commons.core.IMonitorCoreConstants.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.monitor.core/src<org.eclipse.mylyn.internal.monitor.core" element1="/src<org.eclipse.mylyn.internal.commons.core{IMonitorCoreConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209514636111" units="1" version="1.0"/>
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.commons.core.StatusHandlerUi'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: 'org.eclipse.mylyn.commons.core.StatusHandlerUi'
- Original element: 'org.eclipse.mylyn.commons.core.StatusHandler.displayStatus(...)'
- Textual move only" description="Move method" destination="/src<org.eclipse.mylyn.commons.core{StatusHandlerUi.java[StatusHandlerUi" element1="/src<org.eclipse.mylyn.commons.core{StatusHandler.java[StatusHandler~displayStatus~QString;~QIStatus;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1209581812151" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.StatusHandlerUi.java'" description="Delete element" element1="/src<org.eclipse.mylyn.commons.core{StatusHandlerUi.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209581881234" subPackages="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.commons.core.StatusHandler.displayStatus(...)' to 'org.eclipse.mylyn.commons.core.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.StatusHandler.displayStatus(...)'
- Destination type: 'org.eclipse.mylyn.commons.core.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'displayStatus'" element1="/src<org.eclipse.mylyn.commons.core{StatusHandler.java[StatusHandler~displayStatus~QString;~QIStatus;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.commons.core{TasksUiInternal.java[TasksUiInternal" stamp="1209582013430" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.TasksUiInternal.java'" description="Delete element" element1="/src<org.eclipse.mylyn.commons.core{TasksUiInternal.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209582045099" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..01fea63
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,10 @@
+1209508153123 Delete elements
+1209509360854 Delete element
+1209512880029 Move methods
+1209512895237 Delete element
+1209514385281 Rename type 'IMonitorCoreConstants'
+1209514636111 Move compilation unit
+1209581812151 Move method
+1209581881234 Delete element
+1209582013430 Move member 'displayStatus'
+1209582045099 Delete element
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..99984f5
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.provisional.commons.net'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.provisional.commons.net'
- Original element: 'org.eclipse.mylyn.internal.commons.core.AbstractRetrieveTitleFromUrlJob.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.net/src<org.eclipse.mylyn.internal.provisional.commons.net" element1="/src<org.eclipse.mylyn.internal.commons.core{AbstractRetrieveTitleFromUrlJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211306278108" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.commons.core.DateUtil.getFormattedDate(...)' to 'getIsoFormattedDate'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.DateUtil.getFormattedDate(...)'
- Renamed element: 'org.eclipse.mylyn.commons.core.DateUtil.getIsoFormattedDate(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getFormattedDate'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.commons.core{DateUtil.java[DateUtil~getFormattedDate~QCalendar;" name="getIsoFormattedDate" references="true" stamp="1211321747290" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.commons.core.DateUtil.getFormattedDate()' in 'org.eclipse.mylyn.commons.core.DateUtil'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.DateUtil.getFormattedDate()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'getFormattedDate'" flags="786438" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.commons.core{DateUtil.java" mode="1" selection="4288 0" stamp="1211322034132" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.commons.core.DateUtil.getFormattedTime()' to 'getIsoFormattedTime'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.DateUtil.getFormattedTime()'
- Renamed element: 'org.eclipse.mylyn.commons.core.DateUtil.getIsoFormattedTime()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getFormattedTime'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.commons.core{DateUtil.java[DateUtil~getFormattedTime" name="getIsoFormattedTime" references="true" stamp="1211322339927" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.commons.core'
- Original element: 'org.eclipse.mylyn.commons.core.IStatusHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.commons.core{IStatusHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211327265944" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..23ffe22
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,5 @@
+1211306278108 Move compilation unit
+1211321747290 Rename method 'getFormattedDate'
+1211322034132 Inline method 'getFormattedDate'
+1211322339927 Rename method 'getFormattedTime'
+1211327265944 Delete element
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.commons.core/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..275d426
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175723385" target="/org.eclipse.mylyn.commons.net/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175728745" target="/org.eclipse.mylyn.commons.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175732248" target="/org.eclipse.mylyn.compatibility/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175739276" target="/org.eclipse.mylyn.context-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175742516" target="/org.eclipse.mylyn.context.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175747631" target="/org.eclipse.mylyn.context.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175750816" target="/org.eclipse.mylyn.context.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175756119" target="/org.eclipse.mylyn.examples.monitor.study/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175761068" target="/org.eclipse.mylyn.help.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175767117" target="/org.eclipse.mylyn.ide-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175770712" target="/org.eclipse.mylyn.ide.ant/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175775097" target="/org.eclipse.mylyn.ide.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175778214" target="/org.eclipse.mylyn.ide.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175783980" target="/org.eclipse.mylyn.java-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175788333" target="/org.eclipse.mylyn.java.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175803738" target="/org.eclipse.mylyn.java.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175806430" target="/org.eclipse.mylyn.jira-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175813073" target="/org.eclipse.mylyn.jira.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175841919" target="/org.eclipse.mylyn.jira.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175845363" target="/org.eclipse.mylyn.jira.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175850492" target="/org.eclipse.mylyn.monitor-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175853718" target="/org.eclipse.mylyn.monitor.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175856773" target="/org.eclipse.mylyn.monitor.reports/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175862162" target="/org.eclipse.mylyn.monitor.server/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175865151" target="/org.eclipse.mylyn.monitor.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175870315" target="/org.eclipse.mylyn.monitor.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175874272" target="/org.eclipse.mylyn.monitor.usage/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175880379" target="/org.eclipse.mylyn.pde-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175884133" target="/org.eclipse.mylyn.pde.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175889925" target="/org.eclipse.mylyn.releng/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175895449" target="/org.eclipse.mylyn.resources.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175901790" target="/org.eclipse.mylyn.resources.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175905128" target="/org.eclipse.mylyn.sandbox.dev/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175912557" target="/org.eclipse.mylyn.sandbox.dev-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175915628" target="/org.eclipse.mylyn.sandbox.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175919465" target="/org.eclipse.mylyn.sandbox.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175925019" target="/org.eclipse.mylyn.sandbox.ui-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175928485" target="/org.eclipse.mylyn.tasks.bugs/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175934059" target="/org.eclipse.mylyn.tasks.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175937356" target="/org.eclipse.mylyn.tasks.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175943292" target="/org.eclipse.mylyn.tasks.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175948221" target="/org.eclipse.mylyn.team-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175952415" target="/org.eclipse.mylyn.team.cvs/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175957179" target="/org.eclipse.mylyn.team.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175960118" target="/org.eclipse.mylyn.team.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175963263" target="/org.eclipse.mylyn.test-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175971259" target="/org.eclipse.mylyn.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175975758" target="/org.eclipse.mylyn.tests.report/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175981716" target="/org.eclipse.mylyn.trac-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175986294" target="/org.eclipse.mylyn.trac.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175991477" target="/org.eclipse.mylyn.trac.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175995133" target="/org.eclipse.mylyn.trac.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221176000426" target="/org.eclipse.mylyn.trac.wiki/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221176005873" target="/org.eclipse.mylyn.trac.wiki-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221176009165" target="/org.eclipse.mylyn.web.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221176012052" target="/org.eclipse.mylyn.web.tasks/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.commons.core'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221176017159" target="/org.eclipse.mylyn.web.ui/.settings" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.core/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.commons.core/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..1cfe1d2
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1,57 @@
+1221175723385 Copy file
+1221175728745 Copy file
+1221175732248 Copy file
+1221175739276 Copy file
+1221175742516 Copy file
+1221175747631 Copy file
+1221175750816 Copy file
+1221175756119 Copy file
+1221175761068 Copy file
+1221175767117 Copy file
+1221175770712 Copy file
+1221175775097 Copy file
+1221175778214 Copy file
+1221175783980 Copy file
+1221175788333 Copy file
+1221175803738 Copy file
+1221175806430 Copy file
+1221175813073 Copy file
+1221175841919 Copy file
+1221175845363 Copy file
+1221175850492 Copy file
+1221175853718 Copy file
+1221175856773 Copy file
+1221175862162 Copy file
+1221175865151 Copy file
+1221175870315 Copy file
+1221175874272 Copy file
+1221175880379 Copy file
+1221175884133 Copy file
+1221175889925 Copy file
+1221175895449 Copy file
+1221175901790 Copy file
+1221175905128 Copy file
+1221175912557 Copy file
+1221175915628 Copy file
+1221175919465 Copy file
+1221175925019 Copy file
+1221175928485 Copy file
+1221175934059 Copy file
+1221175937356 Copy file
+1221175943292 Copy file
+1221175948221 Copy file
+1221175952415 Copy file
+1221175957179 Copy file
+1221175960118 Copy file
+1221175963263 Copy file
+1221175971259 Copy file
+1221175975758 Copy file
+1221175981716 Copy file
+1221175986294 Copy file
+1221175991477 Copy file
+1221175995133 Copy file
+1221176000426 Copy file
+1221176005873 Copy file
+1221176009165 Copy file
+1221176012052 Copy file
+1221176017159 Copy file
diff --git a/org.eclipse.mylyn.commons.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.commons.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.commons.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.commons.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.commons.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.commons.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.commons.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c869295
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/META-INF/MANIFEST.MF
@@ -0,0 +1,69 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.commons.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.commons.core,
+ org.eclipse.mylyn.internal.commons.core;x-internal:=true,
+ org.eclipse.mylyn.internal.provisional.commons.core;
+ x-friends:="org.eclipse.mylyn,
+ org.eclipse.mylyn.bugzilla.core,
+ org.eclipse.mylyn.bugzilla.ide,
+ org.eclipse.mylyn.bugzilla.tests,
+ org.eclipse.mylyn.bugzilla.ui,
+ org.eclipse.mylyn.commons.core,
+ org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.commons.tests,
+ org.eclipse.mylyn.commons.ui,
+ org.eclipse.mylyn.compatibility,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.help.ui,
+ org.eclipse.mylyn.ide.ant,
+ org.eclipse.mylyn.ide.tests,
+ org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.java.tasks,
+ org.eclipse.mylyn.java.tests,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.mylyn.jira.core,
+ org.eclipse.mylyn.jira.tests,
+ org.eclipse.mylyn.jira.ui,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.monitor.reports,
+ org.eclipse.mylyn.monitor.tests,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.mylyn.monitor.usage,
+ org.eclipse.mylyn.pde.ui,
+ org.eclipse.mylyn.resources.tests,
+ org.eclipse.mylyn.resources.ui,
+ org.eclipse.mylyn.sandbox.dev,
+ org.eclipse.mylyn.sandbox.tests,
+ org.eclipse.mylyn.sandbox.ui,
+ org.eclipse.mylyn.tasks.bugs,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.tasks.tests,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.team.cvs,
+ org.eclipse.mylyn.team.tests,
+ org.eclipse.mylyn.team.ui,
+ org.eclipse.mylyn.tests,
+ org.eclipse.mylyn.trac.core,
+ org.eclipse.mylyn.trac.tests,
+ org.eclipse.mylyn.trac.ui,
+ org.eclipse.mylyn.trac.wiki,
+ org.eclipse.mylyn.web.tasks,
+ org.eclipse.mylyn.web.ui,
+ org.eclipse.mylyn.wikitext.tracwiki.core,
+ org.eclipse.mylyn.wikitext.tracwiki.ui,
+ org.eclipse.mylyn.wikitext.twiki.core,
+ org.eclipse.mylyn.wikitext.twiki.ui,
+ org.eclipse.mylyn.wikitext.ui,
+ org.eclipse.mylyn.xplanner.core,
+ org.eclipse.mylyn.xplanner.tests,
+ org.eclipse.mylyn.xplanner.ui"
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ClassPath: .
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.commons.core/about.html b/org.eclipse.mylyn.commons.core/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.core/build.properties b/org.eclipse.mylyn.commons.core/build.properties
new file mode 100644
index 0000000..4e2dae3
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = about.html,\
+ META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.commons.core/plugin.properties b/org.eclipse.mylyn.commons.core/plugin.properties
new file mode 100644
index 0000000..d528865
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.commons.core
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Commons Core
diff --git a/org.eclipse.mylyn.commons.core/plugin.xml b/org.eclipse.mylyn.commons.core/plugin.xml
new file mode 100644
index 0000000..c1b32fb
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/plugin.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="errorReporters" name="Error Reporters" schema="schema/errorReporters.exsd"/>
+</plugin>
diff --git a/org.eclipse.mylyn.commons.core/schema/errorReporters.exsd b/org.eclipse.mylyn.commons.core/schema/errorReporters.exsd
new file mode 100644
index 0000000..e1c5860
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/schema/errorReporters.exsd
@@ -0,0 +1,115 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.commons.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.commons.core" id="errorReporters" name="Error Reporters"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="errorReporter"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="errorReporter">
+ <complexType>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.internal.bugzilla.ide.AbstractErrorReporter:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="label" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/AbstractErrorReporter.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/AbstractErrorReporter.java
new file mode 100644
index 0000000..c9f7edf
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/AbstractErrorReporter.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * This class is intended to be sub-classes by clients.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractErrorReporter {
+
+ /**
+ * @since 3.0
+ */
+ public static int PRIORITY_NONE = -1;
+
+ /**
+ * @since 3.0
+ */
+ public static int PRIORITY_LOW = 10;
+
+ /**
+ * @since 3.0
+ */
+ public static int PRIORITY_DEFAULT = 100;
+
+ /**
+ * @since 3.0
+ */
+ public static int PRIORITY_HIGH = 1000;
+
+ /**
+ * @since 3.0
+ */
+ public abstract int getPriority(IStatus status);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void handle(IStatus status);
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java
new file mode 100644
index 0000000..c29de39
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/CoreUtil.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+/**
+ * @since 3.0
+ * @author Steffen Pingel
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+public class CoreUtil {
+
+ /**
+ * @since 3.0
+ */
+ public static final boolean TEST_MODE;
+
+ static {
+ String application = System.getProperty("eclipse.application", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ if (application.length() > 0) {
+ TEST_MODE = application.endsWith("testapplication"); //$NON-NLS-1$
+ } else {
+ // eclipse 3.3 does not the eclipse.application property
+ String commands = System.getProperty("eclipse.commands", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ TEST_MODE = commands.contains("testapplication\n"); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/DateUtil.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/DateUtil.java
new file mode 100644
index 0000000..b2849d7
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/DateUtil.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import java.util.Calendar;
+
+/**
+ * Used for formatting dates.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+public class DateUtil {
+
+ public static String getIsoFormattedDate(Calendar calendar) {
+ try {
+ int monthInt = (calendar.get(Calendar.MONTH) + 1);
+ String month = "" + monthInt; //$NON-NLS-1$
+ if (monthInt < 10) {
+ month = "0" + month; //$NON-NLS-1$
+ }
+ int dateInt = (calendar.get(Calendar.DATE));
+ String date = "" + dateInt; //$NON-NLS-1$
+ if (dateInt < 10) {
+ date = "0" + date; //$NON-NLS-1$
+ }
+ return calendar.get(Calendar.YEAR) + "-" + month + "-" + date; //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (Exception e) {
+ return "<unresolved date>"; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @return Time formatted according to: http://www.iso.org/iso/date_and_time_format
+ */
+ public static String getIsoFormattedDateTime(Calendar calendar) {
+ return getIsoFormattedDate(calendar) + "T" + calendar.get(Calendar.HOUR) + "-" + calendar.get(Calendar.MINUTE) //$NON-NLS-1$ //$NON-NLS-2$
+ + "-" + calendar.get(Calendar.SECOND); //$NON-NLS-1$
+ }
+
+ /** Returns the time in the format: HHH:MM */
+ public static String getFormattedDurationShort(long duration) {
+ if (duration <= 0) {
+ return "00:00"; //$NON-NLS-1$
+ }
+
+ long totalMinutes = duration / 1000 / 60;
+ long remainderMinutes = totalMinutes % 60;
+ long totalHours = totalMinutes / 60;
+
+ String hourString = "" + totalHours; //$NON-NLS-1$
+ String minuteString = "" + remainderMinutes; //$NON-NLS-1$
+
+ if (totalHours < 10) {
+ hourString = "0" + hourString; //$NON-NLS-1$
+ }
+
+ if (remainderMinutes < 10) {
+ minuteString = "0" + remainderMinutes; //$NON-NLS-1$
+ }
+
+ return hourString + ":" + minuteString; //$NON-NLS-1$
+ }
+
+ /**
+ * @deprecated The result of this method is not properly localized.
+ */
+ @Deprecated
+ public static String getFormattedDuration(long duration, boolean includeSeconds) {
+ long seconds = duration / 1000;
+ long minutes = 0;
+ long hours = 0;
+ // final long SECOND = 1000;
+ final long MIN = 60;
+ final long HOUR = MIN * 60;
+ String formatted = ""; //$NON-NLS-1$
+
+ String hour = ""; //$NON-NLS-1$
+ String min = ""; //$NON-NLS-1$
+ String sec = ""; //$NON-NLS-1$
+ if (seconds >= HOUR) {
+ hours = seconds / HOUR;
+ if (hours == 1) {
+ hour = hours + " hour "; //$NON-NLS-1$
+ } else if (hours > 1) {
+ hour = hours + " hours "; //$NON-NLS-1$
+ }
+ seconds -= hours * HOUR;
+
+ minutes = seconds / MIN;
+ if (minutes == 1) {
+ min = minutes + " minute "; //$NON-NLS-1$
+ } else if (minutes != 1) {
+ min = minutes + " minutes "; //$NON-NLS-1$
+ }
+ seconds -= minutes * MIN;
+ if (seconds == 1) {
+ sec = seconds + " second"; //$NON-NLS-1$
+ } else if (seconds > 1) {
+ sec = seconds + " seconds"; //$NON-NLS-1$
+ }
+ formatted += hour + min;
+ if (includeSeconds) {
+ formatted += sec;
+ }
+ } else if (seconds >= MIN) {
+ minutes = seconds / MIN;
+ if (minutes == 1) {
+ min = minutes + " minute "; //$NON-NLS-1$
+ } else if (minutes != 1) {
+ min = minutes + " minutes "; //$NON-NLS-1$
+ }
+ seconds -= minutes * MIN;
+ if (seconds == 1) {
+ sec = seconds + " second"; //$NON-NLS-1$
+ } else if (seconds > 1) {
+ sec = seconds + " seconds"; //$NON-NLS-1$
+ }
+ formatted += min;
+ if (includeSeconds) {
+ formatted += sec;
+ }
+ } else {
+ if (seconds == 1) {
+ sec = seconds + " second"; //$NON-NLS-1$
+ } else if (seconds > 1) {
+ sec = seconds + " seconds"; //$NON-NLS-1$
+ }
+ if (includeSeconds) {
+ formatted += sec;
+ }
+ }
+ return formatted;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/DelegatingProgressMonitor.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/DelegatingProgressMonitor.java
new file mode 100644
index 0000000..9e2236d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/DelegatingProgressMonitor.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Delegates to all attached monitors.
+ *
+ * @author Steffen Pingel
+ * @author Thomas Ehrnhoefer
+ * @since 3.2
+ */
+public class DelegatingProgressMonitor implements IDelegatingProgressMonitor {
+
+ private boolean calledBeginTask;
+
+ private boolean canceled;
+
+ private boolean done;
+
+ private double internalWorked;
+
+ private final List<IProgressMonitor> monitors;
+
+ private String subTaskName;
+
+ private String taskName;
+
+ private int totalWork;
+
+ private int worked;
+
+ public DelegatingProgressMonitor() {
+ monitors = new CopyOnWriteArrayList<IProgressMonitor>();
+ }
+
+ public void attach(IProgressMonitor monitor) {
+ Assert.isNotNull(monitor);
+ if (calledBeginTask) {
+ monitor.beginTask(taskName, totalWork);
+ }
+ if (taskName != null) {
+ monitor.setTaskName(taskName);
+ }
+ if (subTaskName != null) {
+ monitor.subTask(subTaskName);
+ }
+ if (worked > 0) {
+ monitor.worked(worked);
+ }
+ if (internalWorked > 0) {
+ monitor.internalWorked(internalWorked);
+ }
+ if (canceled) {
+ monitor.setCanceled(canceled);
+ }
+ if (done) {
+ monitor.done();
+ }
+ monitors.add(monitor);
+ }
+
+ public void beginTask(String name, int totalWork) {
+ if (!calledBeginTask) {
+ this.taskName = name;
+ this.totalWork = totalWork;
+ this.calledBeginTask = true;
+ }
+ for (IProgressMonitor monitor : monitors) {
+ monitor.beginTask(name, totalWork);
+ }
+ }
+
+ public void detach(IProgressMonitor monitor) {
+ monitors.remove(monitor);
+ }
+
+ public void done() {
+ this.done = true;
+ for (IProgressMonitor monitor : monitors) {
+ monitor.done();
+ }
+ }
+
+ public void internalWorked(double work) {
+ this.internalWorked += work;
+ for (IProgressMonitor monitor : monitors) {
+ monitor.internalWorked(work);
+ }
+ }
+
+ public boolean isCanceled() {
+ boolean canceled = false;
+ for (IProgressMonitor monitor : monitors) {
+ canceled |= monitor.isCanceled();
+ }
+ if (canceled) {
+ setCanceled(canceled);
+ }
+ return canceled;
+ }
+
+ public void setCanceled(boolean value) {
+ this.canceled = value;
+ for (IProgressMonitor monitor : monitors) {
+ monitor.setCanceled(true);
+ }
+ }
+
+ public void setTaskName(String name) {
+ this.taskName = name;
+ for (IProgressMonitor monitor : monitors) {
+ monitor.setTaskName(name);
+ }
+ }
+
+ public void subTask(String name) {
+ this.subTaskName = name;
+ for (IProgressMonitor monitor : monitors) {
+ monitor.subTask(name);
+ }
+ }
+
+ public void worked(int work) {
+ this.worked += work;
+ for (IProgressMonitor monitor : monitors) {
+ monitor.worked(work);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/IDelegatingProgressMonitor.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/IDelegatingProgressMonitor.java
new file mode 100644
index 0000000..dc13e13
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/IDelegatingProgressMonitor.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Delegates progress reporting to all attached monitors.
+ *
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @author Steffen Pingel
+ * @since 3.2
+ */
+public interface IDelegatingProgressMonitor extends IProgressMonitor {
+
+ /**
+ * Registers to <code>monitor</code> to receive all progress events. If the operation is already in progress
+ * <code>monitor</code> will receive all queued events.
+ *
+ * @since 3.2
+ * @see #detach(IProgressMonitor)
+ */
+ public void attach(IProgressMonitor monitor);
+
+ /**
+ * Unregisters <code>monitor</code>. No progress events will be sent to <code>monitor</code>.
+ *
+ * @since 3.2
+ * @see #attach(IProgressMonitor)
+ */
+ public void detach(IProgressMonitor monitor);
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/StatusHandler.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/StatusHandler.java
new file mode 100644
index 0000000..0cd37d4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/commons/core/StatusHandler.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Calendar;
+
+import org.eclipse.core.internal.runtime.InternalPlatform;
+import org.eclipse.core.internal.runtime.PlatformActivator;
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.commons.core.ErrorReporterManager;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+public class StatusHandler {
+
+ private static ErrorReporterManager errorReporterManager;
+
+ /**
+ * Logs <code>status</code> to this bundle's log if a platform is running. Does nothing if no platform is running.
+ * Plug-ins that require running in Eclipse are encouraged to use their plug-in log.
+ *
+ * @param status
+ * status to log
+ * @since 3.0
+ */
+ public static void log(IStatus status) {
+ if (InternalPlatform.getDefault() != null && PlatformActivator.getContext() != null) {
+ ILog log = InternalPlatform.getDefault().getLog(PlatformActivator.getContext().getBundle());
+ if (log != null) {
+ log.log(status);
+ }
+ }
+ if (CoreUtil.TEST_MODE) {
+ dumpErrorToConsole(status);
+ }
+ }
+
+ /**
+ * Logs <code>status</code> to this bundle's log if a platform is running. Forwards <code>status</code> to
+ * registered status handlers.
+ * <p>
+ * Listeners should not block.
+ * </p>
+ *
+ * @see #log(IStatus)
+ * @since 3.0
+ */
+ public static void fail(IStatus status) {
+ log(status);
+ getErrorReporterManager().fail(status);
+ }
+
+ private static synchronized ErrorReporterManager getErrorReporterManager() {
+ if (errorReporterManager == null) {
+ errorReporterManager = new ErrorReporterManager();
+ }
+ return errorReporterManager;
+ }
+
+ private static void dumpErrorToConsole(IStatus status) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("["); //$NON-NLS-1$
+ Calendar now = Calendar.getInstance();
+ sb.append(DateUtil.getIsoFormattedDateTime(now));
+ sb.append("] "); //$NON-NLS-1$
+ sb.append(status.toString() + ", "); //$NON-NLS-1$
+ if (status.getException() != null) {
+ sb.append("Exception:\n"); //$NON-NLS-1$
+ sb.append(printStrackTrace(status.getException()));
+ }
+ System.err.println(sb.toString());
+ }
+
+ private static String printStrackTrace(Throwable t) {
+ StringWriter writer = new StringWriter();
+ t.printStackTrace(new PrintWriter(writer));
+ return writer.toString();
+ }
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ErrorReporterManager.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ErrorReporterManager.java
new file mode 100644
index 0000000..e33ae2a
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ErrorReporterManager.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.AbstractErrorReporter;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ErrorReporterManager {
+
+ private static final String EXTENSION_ID_ERROR_REPORTERS = "org.eclipse.mylyn.commons.core.errorReporters"; //$NON-NLS-1$
+
+ private static final String ELEMENT_ERROR_REPORTER = "errorReporter"; //$NON-NLS-1$
+
+ private final List<AbstractErrorReporter> errorReporters = new CopyOnWriteArrayList<AbstractErrorReporter>();
+
+ private boolean readExtensions;
+
+ private static final String ELEMENT_CLASS = "class"; //$NON-NLS-1$
+
+ public ErrorReporterManager() {
+ }
+
+ public void addErrorReporter(AbstractErrorReporter errorReporter) {
+ errorReporters.add(errorReporter);
+ }
+
+ public void removeErrorReporter(AbstractErrorReporter errorReporter) {
+ errorReporters.remove(errorReporter);
+ }
+
+ public void fail(IStatus status) {
+ readExtensions();
+
+ int priority = AbstractErrorReporter.PRIORITY_NONE;
+ List<AbstractErrorReporter> interestedReporters = new ArrayList<AbstractErrorReporter>();
+ for (AbstractErrorReporter reporter : errorReporters) {
+ int newPriority = reporter.getPriority(status);
+ if (newPriority > AbstractErrorReporter.PRIORITY_NONE) {
+ if (newPriority > priority) {
+ interestedReporters.clear();
+ interestedReporters.add(reporter);
+ priority = newPriority;
+ } else if (newPriority == priority) {
+ interestedReporters.add(reporter);
+ }
+ }
+ }
+
+ AbstractErrorReporter reporter;
+ if (interestedReporters.isEmpty()) {
+ return;
+ } else if (interestedReporters.size() > 1) {
+ // TODO prompt user?
+ reporter = interestedReporters.get(0);
+ } else {
+ reporter = interestedReporters.get(0);
+ }
+
+ reporter.handle(status);
+ }
+
+ private synchronized void readExtensions() {
+ if (readExtensions) {
+ return;
+ }
+
+ readExtensions = true;
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_ERROR_REPORTERS);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELEMENT_ERROR_REPORTER)) {
+ readErrorReporter(element);
+ }
+ }
+ }
+ }
+
+ private void readErrorReporter(IConfigurationElement element) {
+ try {
+ Object object = element.createExecutableExtension(ELEMENT_CLASS);
+ if (object instanceof AbstractErrorReporter) {
+ errorReporters.add((AbstractErrorReporter) object);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, ICommonsCoreConstants.ID_PLUGIN,
+ "Could not load error reporter extenstion: \"" + object.getClass().getCanonicalName() + "\"" //$NON-NLS-1$ //$NON-NLS-2$
+ + " does not implement \"" + AbstractErrorReporter.class.getCanonicalName() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ICommonsCoreConstants.ID_PLUGIN,
+ "Could not load error reporter extension", e)); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ICommonsCoreConstants.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ICommonsCoreConstants.java
new file mode 100644
index 0000000..7d74b1d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ICommonsCoreConstants.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+/**
+ * @author Steffen Pingel
+ */
+public interface ICommonsCoreConstants {
+
+ public static String ID_PLUGIN = "org.eclipse.mylyn.commons.core"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/XmlStringConverter.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/XmlStringConverter.java
new file mode 100644
index 0000000..be46bc6
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/XmlStringConverter.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+/**
+ * @author Ken Sueda
+ */
+// XXX should use xerces or some other parser's facilities
+public class XmlStringConverter {
+
+ @Deprecated
+ public static String convertToXmlString(String s) {
+ if (s == null) {
+ return ""; //$NON-NLS-1$
+ }
+ StringBuffer res = new StringBuffer(s.length() + 20);
+ for (int i = 0; i < s.length(); ++i) {
+ appendEscapedChar(res, s.charAt(i));
+ }
+ return res.toString();
+ }
+
+ private static void appendEscapedChar(StringBuffer buffer, char c) {
+ String replacement = getReplacementForSymbol(c);
+ if (replacement != null) {
+ buffer.append('&');
+ buffer.append(replacement);
+ buffer.append(';');
+ } else {
+ buffer.append(c);
+ }
+ }
+
+ private static String getReplacementForSymbol(char c) {
+ switch (c) {
+ case '<':
+ return "lt"; //$NON-NLS-1$
+ case '>':
+ return "gt"; //$NON-NLS-1$
+ case '"':
+ return "quot"; //$NON-NLS-1$
+ case '\'':
+ return "apos"; //$NON-NLS-1$
+ case '&':
+ return "amp"; //$NON-NLS-1$
+ case '\r':
+ return "#x0D"; //$NON-NLS-1$
+ case '\n':
+ return "#x0A"; //$NON-NLS-1$
+ case '\u0009':
+ return "#x09"; //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ @Deprecated
+ public static String convertXmlToString(String string) {
+ StringBuilder result = new StringBuilder(string.length() + 10);
+ for (int i = 0; i < string.length(); ++i) {
+ char xChar = string.charAt(i);
+ if (xChar == '&') {
+ i++;
+ StringBuffer escapeChar = new StringBuffer(10);
+ boolean flag = true;
+ while (flag) {
+ xChar = string.charAt(i++);
+ if (xChar == ';') {
+ flag = false;
+ i--;
+ } else {
+ escapeChar.append(xChar);
+ }
+ }
+ result.append(getReplacementForXml(escapeChar.toString()));
+ } else {
+ result.append(xChar);
+ }
+ }
+ return result.toString();
+ }
+
+ private static char getReplacementForXml(String s) {
+ if (s.equals("lt")) { //$NON-NLS-1$
+ return '<';
+ } else if (s.equals("gt")) { //$NON-NLS-1$
+ return '>';
+ } else if (s.equals("quot")) { //$NON-NLS-1$
+ return '"';
+ } else if (s.equals("apos")) { //$NON-NLS-1$
+ return '\'';
+ } else if (s.equals("amp")) { //$NON-NLS-1$
+ return '&';
+ } else if (s.equals("#x0D")) { //$NON-NLS-1$
+ return '\r';
+ } else if (s.equals("#x0A")) { //$NON-NLS-1$
+ return '\n';
+ } else if (s.equals("#x09")) { //$NON-NLS-1$
+ return '\u0009';
+ }
+ return 0;
+ }
+
+ /**
+ * @param text
+ * string to clean
+ * @return string with all non valid characters removed, if text is null return null
+ */
+ public static String cleanXmlString(String text) {
+ if (text == null) {
+ return null;
+ }
+ StringBuilder builder = new StringBuilder(text.length());
+ for (int x = 0; x < text.length(); x++) {
+ char ch = text.charAt(x);
+ if (isValid(ch)) {
+ builder.append(ch);
+ }
+ }
+ return builder.toString();
+ }
+
+ /**
+ * Return true if character is a valid xml character
+ *
+ * @see http://www.w3.org/TR/REC-xml/
+ */
+ public static boolean isValid(char ch) {
+ return (0x0A == ch || 0x0D == ch || 0x09 == ch) || (ch >= 0x20 && ch <= 0xD7FF)
+ || (ch >= 0xE000 && ch <= 0xFFFD) || (ch >= 0x10000 && ch <= 0x10FFFF);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ZipFileUtil.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ZipFileUtil.java
new file mode 100644
index 0000000..b56ed67
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/commons/core/ZipFileUtil.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.core;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+
+/**
+ * Contains utility methods for working with zip files
+ *
+ * @author Wesley Coelho
+ * @author Shawn Minto (Wrote methods that were moved here)
+ */
+// FIXME add try/finally blocks that properly close streams
+public class ZipFileUtil {
+
+ /**
+ * Only unzips files in zip file not directories
+ *
+ * @param zipped
+ * file
+ * @param destPath
+ * Destination path
+ * @return Files that were unzipped
+ */
+ public static List<File> unzipFiles(File zippedfile, String destPath, IProgressMonitor monitor)
+ throws FileNotFoundException, IOException {
+ ZipFile zipFile = new ZipFile(zippedfile);
+
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+ List<File> outputFiles = new ArrayList<File>();
+ File destinationFile = new File(destPath);
+ if (!destinationFile.exists()) {
+ destinationFile.mkdirs();
+ }
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = entries.nextElement();
+ File outputFile = new File(destinationFile, entry.getName());
+ if (entry.isDirectory() && !outputFile.exists()) {
+ outputFile.mkdirs();
+ continue;
+ }
+
+ if (!outputFile.getParentFile().exists()) {
+ outputFile.getParentFile().mkdirs();
+ }
+
+ InputStream inputStream = zipFile.getInputStream(entry);
+ FileOutputStream outStream = new FileOutputStream(outputFile);
+ copyByteStream(inputStream, outStream);
+
+ outputFiles.add(outputFile);
+ if (monitor != null) {
+ monitor.worked(1);
+ }
+ }
+ return outputFiles;
+ }
+
+ public static List<File> extactEntries(File zippedFile, List<ZipEntry> entries, String destPath)
+ throws FileNotFoundException, IOException {
+ ZipFile zipFile = new ZipFile(zippedFile);
+ List<File> outputFiles = new ArrayList<File>();
+ for (ZipEntry entry : entries) {
+ if (entry.isDirectory()) {
+ // Assume directories are stored parents first then children.
+ (new File(entry.getName())).mkdir();
+ continue;
+ }
+ InputStream inputStream = zipFile.getInputStream(entry);
+ File outputFile = new File(destPath + File.separator + entry.getName());
+ FileOutputStream outStream = new FileOutputStream(outputFile);
+ copyByteStream(inputStream, outStream);
+ outputFiles.add(outputFile);
+ }
+ return outputFiles;
+ }
+
+ public static void copyByteStream(InputStream in, OutputStream out) throws IOException {
+ if (in != null && out != null) {
+ BufferedInputStream inBuffered = new BufferedInputStream(in);
+
+ int bufferSize = 1000;
+ byte[] buffer = new byte[bufferSize];
+
+ int readCount;
+
+ BufferedOutputStream fout = new BufferedOutputStream(out);
+
+ while ((readCount = inBuffered.read(buffer)) != -1) {
+ if (readCount < bufferSize) {
+ fout.write(buffer, 0, readCount);
+ } else {
+ fout.write(buffer);
+ }
+ }
+ fout.flush();
+ fout.close();
+ in.close();
+ }
+ }
+
+ /**
+ * @param zipFile
+ * Destination zipped file
+ * @param files
+ * List of files to add to the zip file
+ */
+ public static void createZipFile(File zipFile, List<File> files) throws FileNotFoundException, IOException {
+ createZipFile(zipFile, files, null, null);
+ }
+
+ public static void createZipFile(File zipFile, List<File> files, IProgressMonitor monitor)
+ throws FileNotFoundException, IOException {
+ createZipFile(zipFile, files, null, monitor);
+ }
+
+ /**
+ * @param zipFile
+ * Destination zipped file
+ * @param files
+ * List of files to add to the zip file
+ * @param progressMonitor
+ * will report worked(1) to the monitor for each file zipped
+ * @author Shawn Minto
+ * @author Wesley Coelho
+ */
+ public static void createZipFile(File zipFile, List<File> files, String rootPath, IProgressMonitor monitor)
+ throws FileNotFoundException, IOException {
+ if (zipFile.exists()) {
+ zipFile.delete();
+ }
+ if (rootPath == null) {
+ rootPath = ""; //$NON-NLS-1$
+ } else if (!rootPath.endsWith("\\") || !rootPath.endsWith("/")) { //$NON-NLS-1$ //$NON-NLS-2$
+ rootPath += "/"; //$NON-NLS-1$
+ }
+
+ ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
+
+ try {
+
+ for (File file : files) {
+ try {
+ addZipEntry(zipOut, rootPath, file);
+ if (monitor != null) {
+ monitor.worked(1);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ICommonsCoreConstants.ID_PLUGIN, "Could not add " //$NON-NLS-1$
+ + file.getName() + " to zip", e)); //$NON-NLS-1$
+ }
+ }
+
+ } finally {
+ zipOut.close();
+ }
+ }
+
+ /**
+ * @author Shawn Minto
+ */
+ private static void addZipEntry(ZipOutputStream zipOut, String rootPath, File file) throws FileNotFoundException,
+ IOException {
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ for (File child : file.listFiles()) {
+ addZipEntry(zipOut, rootPath, child);
+ }
+ } else {
+ // Add ZIP entry to output stream.m
+ String path = ""; //$NON-NLS-1$
+ if (!rootPath.equals("")) { //$NON-NLS-1$
+ rootPath = rootPath.replaceAll("\\\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+ path = file.getAbsolutePath().replaceAll("\\\\", "/"); //$NON-NLS-1$ //$NON-NLS-2$
+ path = path.substring(rootPath.length());
+ } else {
+ path = file.getName();
+ }
+
+ zipOut.putNextEntry(new ZipEntry(path));
+
+ // Create a buffer for reading the files
+ byte[] buf = new byte[1024];
+
+ // Transfer bytes from the file to the ZIP file
+ // and compress the files
+ FileInputStream in = new FileInputStream(file);
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ zipOut.write(buf, 0, len);
+ }
+
+ // Complete the entry
+ zipOut.closeEntry();
+ in.close();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/provisional/commons/core/CommonMessages.java b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/provisional/commons/core/CommonMessages.java
new file mode 100644
index 0000000..4652e9b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/provisional/commons/core/CommonMessages.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.core;
+
+import org.eclipse.osgi.util.NLS;
+
+public class CommonMessages extends NLS {
+
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.provisional.commons.core.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, CommonMessages.class);
+ }
+
+ public static String Friday;
+
+ public static String Monday;
+
+ public static String Saturday;
+
+ public static String Sunday;
+
+ public static String Thursday;
+
+ public static String Tuesday;
+
+ public static String Wednesday;
+
+}
diff --git a/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/provisional/commons/core/messages.properties b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/provisional/commons/core/messages.properties
new file mode 100644
index 0000000..70de146
--- /dev/null
+++ b/org.eclipse.mylyn.commons.core/src/org/eclipse/mylyn/internal/provisional/commons/core/messages.properties
@@ -0,0 +1,7 @@
+Friday=Friday
+Monday=Monday
+Saturday=Saturday
+Sunday=Sunday
+Tuesday=Tuesday
+Thursday=Thursday
+Wednesday=Wednesday
diff --git a/org.eclipse.mylyn.commons.net/.classpath b/org.eclipse.mylyn.commons.net/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.commons.net/.cvsignore b/org.eclipse.mylyn.commons.net/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.commons.net/.project b/org.eclipse.mylyn.commons.net/.project
new file mode 100644
index 0000000..c334d5c
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.commons.net</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2007/11/48/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2007/11/48/refactorings.history
new file mode 100644
index 0000000..4c0f43d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2007/11/48/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.web.core.WebCredentials.Type' to 'AuthenticationType'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebCredentials.Type'
- Renamed element: 'org.eclipse.mylyn.web.core.WebCredentials.AuthenticationType'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'Type'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.web.core{WebCredentials.java[WebCredentials[Type" matchStrategy="1" name="AuthenticationType" qualified="false" references="true" similarDeclarations="false" stamp="1196378032015" textual="false" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.web.core.WebCredentials.AuthenticationType' in 'org.eclipse.mylyn.web.core.WebCredentials' to top level type
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebCredentials.AuthenticationType'
- Field name: 'webCredentials'
- Declare field 'final'" description="Convert member type 'AuthenticationType' to top level" field="false" fieldName="webCredentials" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.web.core{WebCredentials.java[WebCredentials[AuthenticationType" mandatory="false" possible="false" stamp="1196378195333" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.web.core.WebCredentials' to 'AuthenticationCredentials'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebCredentials'
- Renamed element: 'org.eclipse.mylyn.web.core.AuthenticationCredentials'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'WebCredentials'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.web.core{WebCredentials.java[WebCredentials" matchStrategy="1" name="AuthenticationCredentials" qualified="false" references="true" similarDeclarations="false" stamp="1196378212434" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2007/11/48/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2007/11/48/refactorings.index
new file mode 100644
index 0000000..9ab6bb0
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2007/11/48/refactorings.index
@@ -0,0 +1,3 @@
+1196378032015 Rename type 'Type'
+1196378195333 Convert member type 'AuthenticationType' to top level
+1196378212434 Rename type 'WebCredentials'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2007/7/27/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2007/7/27/refactorings.history
new file mode 100644
index 0000000..57e7333
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2007/7/27/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylyn.web.core/lib-httpclient/commons-httpclient-3.0.1-sources.zip' to 'commons-httpclient-3.0.1-src.zip' - Original project: 'org.eclipse.mylyn.web.core' - Original element: 'commons-httpclient-3.0.1-sources.zip'" description="Rename resource 'commons-httpclient-3.0.1-sources.zip'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="lib-httpclient/commons-httpclient-3.0.1-sources.zip" name="commons-httpclient-3.0.1-src.zip" stamp="1183609293395" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2007/7/27/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2007/7/27/refactorings.index
new file mode 100644
index 0000000..6acb3aa
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2007/7/27/refactorings.index
@@ -0,0 +1 @@
+1183609293395 Rename resource 'commons-httpclient-3.0.1-sources.zip'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2007/9/37/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2007/9/37/refactorings.history
new file mode 100644
index 0000000..35ce1cc
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2007/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.web.core.WebClientUtil.SOCKS_PORT' from expression '1080' - Original project: 'org.eclipse.mylyn.web.core' - Constant name: 'SOCKS_PORT' - Constant expression: '1080' - Declared visibility: 'private'" description="Extract constant 'SOCKS_PORT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.web.core{WebClientUtil.java" name="SOCKS_PORT" qualify="false" replace="false" selection="11223 4" stamp="1189560972890" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2007/9/37/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2007/9/37/refactorings.index
new file mode 100644
index 0000000..7498fde
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2007/9/37/refactorings.index
@@ -0,0 +1 @@
+1189560972890 Extract constant 'SOCKS_PORT'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/1/4/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/1/4/refactorings.history
new file mode 100644
index 0000000..d65a772
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/1/4/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private static void pollIo(IProgressMonitor monitor,AbortableCallable<?> executor) throws IOException, Error ' from 'org.eclipse.mylyn.web.core.WebClientUtil.connect()' to 'org.eclipse.mylyn.web.core.WebClientUtil'
- Original project: 'org.eclipse.mylyn.web.core'
- Method name: 'pollIo'
- Destination type: 'org.eclipse.mylyn.web.core.WebClientUtil'
- Declared visibility: 'private'" comments="false" description="Extract method 'pollIo'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.web.core{WebClientUtil.java" name="pollIo" replace="false" selection="23130 218" stamp="1200896420286" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/1/4/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/1/4/refactorings.index
new file mode 100644
index 0000000..a3f528d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/1/4/refactorings.index
@@ -0,0 +1 @@
+1200896420286 Extract method 'pollIo'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/12/50/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/12/50/refactorings.history
new file mode 100644
index 0000000..e5d3e61
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/12/50/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Original element: 'org.eclipse.mylyn.internal.commons.net.WebClientUtil.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.commons.net{WebClientUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1228954256809" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Original element: 'org.eclipse.mylyn.internal.commons.net.WebClientLog.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.commons.net{WebClientLog.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1228955215823" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/12/50/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/12/50/refactorings.index
new file mode 100644
index 0000000..3e37b86
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/12/50/refactorings.index
@@ -0,0 +1,2 @@
+1228954256809 Delete element
+1228955215823 Delete element
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/3/10/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/10/refactorings.history
new file mode 100644
index 0000000..a77a841
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/10/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'build.properties.rej'" description="Delete element" element1="build.properties.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1204594288317" subPackages="false" version="1.0"/>
<refactoring comment="Extract method 'private static void configureHttpClientConnectionManager(HttpClient client)' from 'org.eclipse.mylyn.web.core.WebClientUtil.configureHttpClient()' to 'org.eclipse.mylyn.web.core.WebClientUtil'
- Original project: 'org.eclipse.mylyn.web.core'
- Method name: 'configureHttpClientConnectionManager'
- Destination type: 'org.eclipse.mylyn.web.core.WebClientUtil'
- Declared visibility: 'private'" comments="false" description="Extract method 'configureHttpClientConnectionManager'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.web.core{WebClientUtil.java" name="configureHttpClientConnectionManager" replace="false" selection="21232 194" stamp="1204616232333" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/3/10/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/10/refactorings.index
new file mode 100644
index 0000000..63dc396
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/10/refactorings.index
@@ -0,0 +1,2 @@
+1204594288317 Delete element
+1204616232333 Extract method 'configureHttpClientConnectionManager'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/3/9/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/9/refactorings.history
new file mode 100644
index 0000000..ae5ecf4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/9/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'lib-httpclient'" description="Delete element" element1="lib-httpclient" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1204408325526" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'lib-rome'" description="Delete element" element1="lib-rome" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1204412041247" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'lib-lang'" description="Delete element" element1="lib-lang" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1204412710137" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'lib-xmlrpc'" description="Delete element" element1="lib-xmlrpc" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1204412868348" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/3/9/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/9/refactorings.index
new file mode 100644
index 0000000..886a71b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/3/9/refactorings.index
@@ -0,0 +1,4 @@
+1204408325526 Delete element
+1204412041247 Delete element
+1204412710137 Delete element
+1204412868348 Delete element
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..edf3d31
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.web.core.WebClientUtil' to 'WebUtil'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebClientUtil'
- Renamed element: 'org.eclipse.mylyn.web.core.WebUtil'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'WebClientUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.web.core{WebClientUtil.java[WebClientUtil" matchStrategy="1" name="WebUtil" qualified="false" references="true" similarDeclarations="false" stamp="1207123273790" textual="false" version="1.0"/>
<refactoring comment="Move 4 members to 'org.eclipse.mylyn.web.core.WebClientLog'
- Original project: 'org.eclipse.mylyn.web.core'
- Original elements:
 org.eclipse.mylyn.web.core.WebUtil.loggingEnabled
 org.eclipse.mylyn.web.core.WebUtil.logOutputStream
 org.eclipse.mylyn.web.core.WebUtil.isLoggingEnabled()
 org.eclipse.mylyn.web.core.WebUtil.initCommonsLoggingSettings()
- Destination type: 'org.eclipse.mylyn.web.core.WebClientLog'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil^loggingEnabled" element2="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil^logOutputStream" element3="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~isLoggingEnabled" element4="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~initCommonsLoggingSettings" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.web.core{WebClientLog.java[WebClientLog" stamp="1207123563590" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original elements:
 org.eclipse.mylyn.web.core.GzipGetMethod.java
 org.eclipse.mylyn.web.core.GzipPostMethod.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core" element1="/src<org.eclipse.mylyn.web.core{GzipGetMethod.java" element2="/src<org.eclipse.mylyn.web.core{GzipPostMethod.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207123697321" units="2" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.web.core.WebUtil.setLoggingEnabled(...)' to 'org.eclipse.mylyn.web.core.WebClientLog'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.setLoggingEnabled(...)'
- Destination type: 'org.eclipse.mylyn.web.core.WebClientLog'" delegate="false" deprecate="true" description="Move member 'setLoggingEnabled'" element1="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~setLoggingEnabled~Z" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.web.core{WebClientLog.java[WebClientLog" stamp="1207123808280" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.web.core.WebUtil.setLogStream(...)' to 'org.eclipse.mylyn.web.core.WebClientLog'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.setLogStream(...)'
- Destination type: 'org.eclipse.mylyn.web.core.WebClientLog'" delegate="false" deprecate="true" description="Move member 'setLogStream'" element1="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~setLogStream~QOutputStream;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.web.core{WebClientLog.java[WebClientLog" stamp="1207123813346" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.web.core.WebUtil.getLogStream()' to 'org.eclipse.mylyn.web.core.WebClientLog'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.getLogStream()'
- Destination type: 'org.eclipse.mylyn.web.core.WebClientLog'" delegate="false" deprecate="true" description="Move member 'getLogStream'" element1="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~getLogStream" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.web.core{WebClientLog.java[WebClientLog" stamp="1207123894125" version="1.0"/>
<refactoring comment="Move 2 members to 'org.eclipse.mylyn.web.core.WebClientUtil'
- Original project: 'org.eclipse.mylyn.web.core'
- Original elements:
 org.eclipse.mylyn.web.core.WebUtil.getPlatformProxy(...)
 org.eclipse.mylyn.web.core.WebUtil.getProxy(...)
- Destination type: 'org.eclipse.mylyn.web.core.WebClientUtil'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~getPlatformProxy~QString;" element2="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~getProxy~QString;~QString;~QString;~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.web.core{WebClientUtil.java[WebClientUtil" stamp="1207124482495" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.web.core.WebUtil.getDomain(...)' to 'getHost'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.getDomain(...)'
- Renamed element: 'org.eclipse.mylyn.web.core.WebUtil.getHost(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDomain'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~getDomain~QString;" name="getHost" references="true" stamp="1207124521291" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.internal.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.internal.web.core'
- Original element: 'org.eclipse.mylyn.web.core.TrustAllTrustManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.web.core" element1="/src<org.eclipse.mylyn.web.core{TrustAllTrustManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207124665333" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.internal.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.internal.web.core'
- Original element: 'org.eclipse.mylyn.web.core.SslProtocolSocketFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.web.core" element1="/src<org.eclipse.mylyn.web.core{SslProtocolSocketFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207124747071" units="1" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.web.core.WebUtil.AbortableCallable' in 'org.eclipse.mylyn.web.core.WebUtil' to top level type
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.AbortableCallable'
- Field name: 'webUtil'
- Declare field 'final'" description="Convert member type 'AbortableCallable' to top level" field="false" fieldName="webUtil" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil[AbortableCallable" mandatory="false" possible="false" stamp="1207423084866" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.web.core.AbortableCallable' to 'WebRequest'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.AbortableCallable'
- Renamed element: 'org.eclipse.mylyn.web.core.WebRequest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbortableCallable'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.web.core{AbortableCallable.java[AbortableCallable" matchStrategy="1" name="WebRequest" qualified="false" references="true" similarDeclarations="false" stamp="1207423102900" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.web.core.WebUtil.poll(...)' to 'execute'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.poll(...)'
- Renamed element: 'org.eclipse.mylyn.web.core.WebUtil.execute(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'poll'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~poll~QIProgressMonitor;~QWebRequest\<QT;>;" name="execute" references="true" stamp="1207423141129" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.web.core.WebUtil.pollIo(...)' to 'executeInternal'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebUtil.pollIo(...)'
- Renamed element: 'org.eclipse.mylyn.web.core.WebUtil.executeInternal(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'pollIo'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.web.core{WebUtil.java[WebUtil~pollIo~QIProgressMonitor;~QWebRequest\<*>;" name="executeInternal" references="true" stamp="1207423148388" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..a742c98
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1,14 @@
+1207123273790 Rename type 'WebClientUtil'
+1207123563590 Move members
+1207123697321 Move compilation units
+1207123808280 Move member 'setLoggingEnabled'
+1207123813346 Move member 'setLogStream'
+1207123894125 Move member 'getLogStream'
+1207124482495 Move members
+1207124521291 Rename method 'getDomain'
+1207124665333 Move compilation unit
+1207124747071 Move compilation unit
+1207423084866 Convert member type 'AbortableCallable' to top level
+1207423102900 Rename type 'AbortableCallable'
+1207423141129 Rename method 'poll'
+1207423148388 Rename method 'pollIo'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..9ad11be
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.internal.web.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.internal.web.core'
- Original element: 'org.eclipse.mylyn.web.core.WebCorePlugin.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.web.core" element1="/src<org.eclipse.mylyn.web.core{WebCorePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207814028041" units="1" version="1.0"/>
<refactoring comment="Change method 'public ResultType org.eclipse.mylyn.web.core.AbstractWebLocation.requestCredentials(AuthenticationType type, String message)' to 'public void requestCredentials(AuthenticationType type, String message, IProgressMonitor monitor) throws UnsupportedRequestException'
- Original project: 'org.eclipse.mylyn.web.core'
- Original element: 'org.eclipse.mylyn.web.core.AbstractWebLocation.requestCredentials(...)'
- New return type: 'void'
- Added parameters:
 org.eclipse.core.runtime.IProgressMonitor monitor
- Added exceptions:
 UnsupportedRequestException" default3="null" delegate="false" deprecate="true" description="Change method 'requestCredentials'" element1="/src<org.eclipse.mylyn.web.core{UnsupportedRequestException.java[UnsupportedRequestException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.web.core{AbstractWebLocation.java[AbstractWebLocation~requestCredentials~QAuthenticationType;~QString;" kind1="1" name="requestCredentials" parameter1="AuthenticationType type 0 AuthenticationType type false" parameter2="String message 1 String message false" parameter3="{added} {added} -1 org.eclipse.core.runtime.IProgressMonitor monitor false" return="void" stamp="1207868733138" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..fe50993
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,2 @@
+1207814028041 Move compilation unit
+1207868733138 Change method 'requestCredentials'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..c9a0d2c
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original project: 'org.eclipse.mylyn.web.core'
- Destination element: 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original element: 'org.eclipse.mylyn.web.core.XmlUtil.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.core/src<org.eclipse.mylyn.internal.commons.core" element1="/src<org.eclipse.mylyn.web.core{XmlUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209512865002" units="1" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.internal.web.core' to 'org.eclipse.mylyn.internal.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Original element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.web.core'
- Renamed element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.web.core'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.web.core" name="org.eclipse.mylyn.internal.commons.net" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1209569049215" textual="false" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.web.core' to 'org.eclipse.mylyn.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Original element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.web.core'
- Renamed element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.commons.net'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.web.core'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.web.core" name="org.eclipse.mylyn.commons.net" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1209569104888" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.commons.net.WebCorePlugin' to 'CommonsNetPlugin'
- Original project: 'org.eclipse.mylyn.commons.net'
- Original element: 'org.eclipse.mylyn.internal.commons.net.WebCorePlugin'
- Renamed element: 'org.eclipse.mylyn.internal.commons.net.CommonsNetPlugin'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'WebCorePlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.commons.net{WebCorePlugin.java[WebCorePlugin" matchStrategy="1" name="CommonsNetPlugin" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1209569151663" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..9bde0c0
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,4 @@
+1209512865002 Move compilation unit
+1209569049215 Rename package 'org.eclipse.mylyn.internal.web.core'
+1209569104888 Rename package 'org.eclipse.mylyn.web.core'
+1209569151663 Rename type 'WebCorePlugin'
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..c407efe
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.net'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.net.AbstractRetrieveTitleFromUrlJob.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui" element1="/src<org.eclipse.mylyn.internal.provisional.commons.net{AbstractRetrieveTitleFromUrlJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211306316751" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Original element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.provisional.commons.net'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.provisional.commons.net" element2="/src<org.eclipse.mylyn.internal.provisional.commons" element3="/src<org.eclipse.mylyn.internal.provisional" elements="3" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211306480103" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..c4a1b84
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1211306316751 Move compilation unit
+1211306480103 Delete element
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.commons.net/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..2f40679
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Destination element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Original element: 'org.eclipse.mylyn.commons.net.WebClientUtil.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.commons.net" element1="/src<org.eclipse.mylyn.commons.net{WebClientUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1212727356951" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Destination element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Original element: 'org.eclipse.mylyn.commons.net.AuthenticatedProxy.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.commons.net" element1="/src<org.eclipse.mylyn.commons.net{AuthenticatedProxy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1212727371422" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Original project: 'org.eclipse.mylyn.commons.net'
- Destination element: 'org.eclipse.mylyn.commons.net/src/org.eclipse.mylyn.internal.commons.net'
- Original element: 'org.eclipse.mylyn.commons.net.WebClientLog.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.commons.net" element1="/src<org.eclipse.mylyn.commons.net{WebClientLog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1212727416849" units="1" version="1.0"/>
<refactoring comment="Extract local variable 'text' from expression 'getText(tokenizer)'
- Original project: 'org.eclipse.mylyn.commons.net'
- Variable name: 'text'
- Destination method: 'org.eclipse.mylyn.commons.net.WebUtil.getTitleFromUrl()'
- Variable expression: 'getText(tokenizer)'
- Replace occurrences of expression with variable" description="Extract local variable 'text'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.commons.net{WebUtil.java" name="text" replace="true" selection="15303 18" stamp="1212917620853" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.commons.net/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..eb13b10
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,4 @@
+1212727356951 Move compilation unit
+1212727371422 Move compilation unit
+1212727416849 Move compilation unit
+1212917620853 Extract local variable 'text'
diff --git a/org.eclipse.mylyn.commons.net/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.commons.net/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.commons.net/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.commons.net/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.commons.net/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.commons.net/META-INF/MANIFEST.MF b/org.eclipse.mylyn.commons.net/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..688253e
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.commons.net;singleton:=true
+Bundle-Version: 3.2.0.v20090617-0100-e3x
+Bundle-Vendor: %Bundle-Vendor
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.apache.commons.codec;bundle-version="1.3.0";visibility:=reexport,
+ org.apache.commons.httpclient;bundle-version="3.1.0";visibility:=reexport,
+ org.apache.commons.lang;bundle-version="2.3.0";visibility:=reexport,
+ org.apache.commons.logging;bundle-version="1.0.4",
+ org.eclipse.core.runtime,
+ org.eclipse.core.net
+Bundle-ClassPath: .
+Export-Package: org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.internal.commons.net;x-internal:=true
+Bundle-Activator: org.eclipse.mylyn.internal.commons.net.CommonsNetPlugin
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.commons.net/about.html b/org.eclipse.mylyn.commons.net/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/build.properties b/org.eclipse.mylyn.commons.net/build.properties
new file mode 100644
index 0000000..96bc39e
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/build.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.commons.net/plugin.properties b/org.eclipse.mylyn.commons.net/plugin.properties
new file mode 100644
index 0000000..12c1114
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.commons.net
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Commons Net
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AbstractWebLocation.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AbstractWebLocation.java
new file mode 100644
index 0000000..adec1fd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AbstractWebLocation.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.net.Proxy;
+
+import javax.net.ssl.X509TrustManager;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @since 2.2
+ * @author Steffen Pingel
+ */
+public abstract class AbstractWebLocation {
+
+ private final String url;
+
+ /**
+ * @since 2.2
+ */
+ public AbstractWebLocation(String url) {
+ this.url = url;
+ }
+
+ /**
+ * @since 2.2
+ */
+ public abstract AuthenticationCredentials getCredentials(AuthenticationType type);
+
+ /**
+ * @since 2.2
+ */
+ public abstract Proxy getProxyForHost(String host, String proxyType);
+
+ /**
+ * @since 2.2
+ */
+ public X509TrustManager getTrustManager() {
+ return null;
+ }
+
+ /**
+ * @since 2.2
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void requestCredentials(AuthenticationType type, String message, IProgressMonitor monitor)
+ throws UnsupportedRequestException {
+ throw new UnsupportedRequestException();
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AuthenticationCredentials.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AuthenticationCredentials.java
new file mode 100644
index 0000000..4c09ff5
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AuthenticationCredentials.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+/**
+ * Provides a user name and password.
+ *
+ * @author Steffen Pingel
+ * @since 2.2
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class AuthenticationCredentials {
+
+ private final String userName;
+
+ private final String password;
+
+ /**
+ * @param userName
+ * the user name, must not be null
+ * @param password
+ * the password, must not be null
+ */
+ public AuthenticationCredentials(String userName, String password) {
+ if (userName == null) {
+ throw new IllegalArgumentException();
+ }
+ if (password == null) {
+ throw new IllegalArgumentException();
+ }
+
+ this.userName = userName;
+ this.password = password;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((password == null) ? 0 : password.hashCode());
+ result = prime * result + ((userName == null) ? 0 : userName.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final AuthenticationCredentials other = (AuthenticationCredentials) obj;
+ if (password == null) {
+ if (other.password != null) {
+ return false;
+ }
+ } else if (!password.equals(other.password)) {
+ return false;
+ }
+ if (userName == null) {
+ if (other.userName != null) {
+ return false;
+ }
+ } else if (!userName.equals(other.userName)) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AuthenticationType.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AuthenticationType.java
new file mode 100644
index 0000000..fb9ea2d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/AuthenticationType.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+/**
+ * An enum of the supported authentication types.
+ *
+ * @since 2.2
+ * @author Steffen Pingel
+ */
+public enum AuthenticationType {
+ /**
+ * HTTP authentication, this is typically basic authentication but other methods such as digest or NTLM are used as
+ * well.
+ */
+ HTTP,
+ /** Proxy authentication. */
+ PROXY,
+ /** Task repository authentication. */
+ REPOSITORY
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/HtmlStreamTokenizer.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/HtmlStreamTokenizer.java
new file mode 100644
index 0000000..f3194c4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/HtmlStreamTokenizer.java
@@ -0,0 +1,1143 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URL;
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Locale;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+/**
+ * Parses HTML into tokens.
+ *
+ * @author Shawn Minto
+ * @since 2.0
+ */
+public class HtmlStreamTokenizer {
+
+ /** parser state */
+ private State state;
+
+ /** reader from which to parse the text */
+ private final BufferedReader in;
+
+ /** base URL for resolving relative URLs */
+ private final URL base;
+
+ /** buffer holding the text of the current token */
+ private final StringBuffer textBuffer;
+
+ /** buffer holding whitespace preceding the current token */
+ private final StringBuffer whitespaceBuffer;
+
+ /**
+ * holds a token that was read and then put back in the queue to be returned again on <code>nextToken</code> call
+ */
+ private Token pushbackToken;
+
+ /**
+ * holds a character that was read and then determined not to be part of the current token
+ */
+ private int pushbackChar;
+
+ /** current quote delimiter (single or double) */
+ private int quoteChar;
+
+ /** Allow class client to choose if tag attributes are escaped or not */
+ private boolean escapeTagValues;
+
+ /**
+ * Constructor.
+ *
+ * @param in
+ * reader for the HTML document to tokenize
+ * @param base
+ * URL for resolving relative URLs
+ */
+ public HtmlStreamTokenizer(Reader in, URL base) {
+ textBuffer = new StringBuffer();
+ whitespaceBuffer = new StringBuffer();
+ pushbackChar = 0;
+ state = State.TEXT;
+ this.in = new BufferedReader(in);
+ this.base = base;
+ escapeTagValues = true;
+ }
+
+ public void escapeTagAttributes(boolean value) {
+ escapeTagValues = value;
+ }
+
+ /**
+ * Returns the next token from the stream.
+ */
+ public Token nextToken() throws IOException, ParseException {
+ if (pushbackToken != null) {
+ Token token = pushbackToken;
+ pushbackToken = null;
+ return token;
+ }
+
+ int closingComment = 0;
+
+ textBuffer.setLength(0);
+ whitespaceBuffer.setLength(0);
+ do {
+ int ch;
+ if (pushbackChar != 0) {
+ ch = pushbackChar;
+ pushbackChar = 0;
+ } else {
+ ch = in.read();
+ }
+ if (ch < 0) {
+ State oldState = state;
+ state = State.EOF;
+ if (textBuffer.length() > 0 && oldState == State.TEXT) {
+ return new Token(textBuffer, whitespaceBuffer, false);
+ } else {
+ return new Token();
+ }
+ }
+ if (state == State.TEXT) {
+ if (ch == '<') {
+ state = State.TAG;
+ if (textBuffer.length() > 0) {
+ return new Token(textBuffer, whitespaceBuffer, false);
+ }
+ } else if (Character.isWhitespace((char) ch)) {
+ pushbackChar = ch;
+ state = State.WS;
+ if (textBuffer.length() > 0) {
+ return new Token(textBuffer, whitespaceBuffer, false);
+ }
+ } else {
+ textBuffer.append((char) ch);
+ }
+ } else if (state == State.WS) {
+ if (!Character.isWhitespace((char) ch)) {
+ pushbackChar = ch;
+ state = State.TEXT;
+ } else {
+ whitespaceBuffer.append((char) ch);
+ }
+ } else if (state == State.TAG) {
+ if (ch == '>') {
+ state = State.TEXT;
+ HtmlTag tag = new HtmlTag(base);
+ parseTag(textBuffer.toString(), tag, escapeTagValues);
+ return new Token(tag, whitespaceBuffer);
+ }
+ if (ch == '<' && textBuffer.length() == 0) {
+ textBuffer.append("<<"); //$NON-NLS-1$
+ state = State.TEXT;
+ } else if (ch == '-' && textBuffer.length() == 2 && textBuffer.charAt(1) == '-'
+ && textBuffer.charAt(0) == '!') {
+ textBuffer.setLength(0);
+ state = State.COMMENT;
+ } else if (ch == '\'' || ch == '"') {
+ quoteChar = ch;
+ textBuffer.append((char) ch);
+ state = State.TAG_QUOTE;
+ } else {
+ textBuffer.append((char) ch);
+ }
+ } else if (state == State.TAG_QUOTE) {
+ if (ch == '>') {
+ pushbackChar = ch;
+ state = State.TAG;
+ } else {
+ textBuffer.append((char) ch);
+ if (ch == quoteChar) {
+ state = State.TAG;
+ }
+ }
+ } else if (state == State.COMMENT) {
+ if (ch == '>' && closingComment >= 2) {
+ textBuffer.setLength(textBuffer.length() - 2);
+ closingComment = 0;
+ state = State.TEXT;
+ return new Token(textBuffer, whitespaceBuffer, true);
+ }
+ if (ch == '-') {
+ closingComment++;
+ } else {
+ closingComment = 0;
+ }
+ textBuffer.append((char) ch);
+ }
+ } while (true);
+ }
+
+ /**
+ * Pushes the token back into the queue, to be returned by the subsequent call to <code>nextToken</code>
+ */
+ public void pushback(Token token) {
+ pushbackToken = token;
+ }
+
+ /**
+ * Parses an HTML tag out of a string of characters.
+ */
+ private static void parseTag(String s, HtmlTag tag, boolean escapeValues) throws ParseException {
+
+ int i = 0;
+ for (; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) {
+ // just move forward
+ }
+ if (i == s.length()) {
+ throw new ParseException("parse empty tag", 0); //$NON-NLS-1$
+ }
+
+ int start = i;
+ for (; i < s.length() && !Character.isWhitespace(s.charAt(i)); i++) {
+ // just move forward
+ }
+ tag.setTagName(s.substring(start, i));
+
+ for (; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) {
+ // just move forward
+ }
+ if (i == s.length()) {
+ return;
+ } else {
+ parseAttributes(tag, s, i, escapeValues);
+ return;
+ }
+ }
+
+ /**
+ * parses HTML tag attributes from a buffer and sets them in an HtmlTag
+ */
+ private static void parseAttributes(HtmlTag tag, String s, int i, boolean escapeValues) throws ParseException {
+ while (i < s.length()) {
+ // skip whitespace
+ while (i < s.length() && Character.isWhitespace(s.charAt(i))) {
+ i++;
+ }
+
+ if (i == s.length()) {
+ return;
+ }
+
+ // read the attribute name -- the rule might be looser than the RFC
+ // specifies:
+ // everything up to a space or an equal sign is included
+ int start = i;
+ for (; i < s.length() && !Character.isWhitespace(s.charAt(i)) && s.charAt(i) != '='; i++) {
+ // just move forward
+ }
+ String attributeName = s.substring(start, i).toLowerCase(Locale.ENGLISH);
+
+ if (attributeName.equals("/")) { //$NON-NLS-1$
+ tag.setSelfTerminating(true);
+ continue;
+ }
+
+ for (; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) {
+ // just move forward
+ }
+ if (i == s.length() || s.charAt(i) != '=') {
+ // no attribute value
+ tag.setAttribute(attributeName, ""); //$NON-NLS-1$
+ continue;
+ }
+
+ // skip whitespace to the start of attribute value
+ for (i = i + 1; i < s.length() && Character.isWhitespace(s.charAt(i)); i++) {
+ // just move forward
+ }
+ if (i == s.length()) {
+ return;
+ }
+
+ // read the attribute value -- the rule for unquoted attribute value
+ // is
+ // looser than the one in Conolly's W3C 1996 lexical analyzer draft:
+ // everything
+ // is included up to the next space
+ String attributeValue;
+ if (s.charAt(i) == '"') {
+ start = ++i;
+ for (; i < s.length() && s.charAt(i) != '"'; i++) {
+ // just move forward
+ }
+ if (i == s.length()) {
+ return; // shouldn't happen if input returned by nextToken
+ }
+ if (escapeValues) {
+ attributeValue = unescape(s.substring(start, i));
+ } else {
+ attributeValue = s.substring(start, i);
+ }
+ i++;
+ } else if (s.charAt(i) == '\'') {
+ start = ++i;
+ for (; i < s.length() && s.charAt(i) != '\''; i++) {
+ // just move forward
+ }
+ if (i == s.length()) {
+ return; // shouldn't happen if input returned by nextToken
+ }
+ attributeValue = unescape(s.substring(start, i));
+ i++;
+ } else {
+ start = i;
+ for (; i < s.length() && !Character.isWhitespace(s.charAt(i)); i++) {
+ // just move forward
+ }
+ attributeValue = s.substring(start, i);
+ }
+ tag.setAttribute(attributeName, attributeValue);
+ }
+ }
+
+ /**
+ * Returns a string with HTML escapes changed into their corresponding characters.
+ *
+ * @deprecated use {@link StringEscapeUtils#unescapeHtml(String)} instead
+ */
+ @Deprecated
+ public static String unescape(String s) {
+ if (s.indexOf('&') == -1) {
+ return s;
+ } else {
+ StringBuffer sb = new StringBuffer(s);
+ unescape(sb);
+ return sb.toString();
+ }
+ }
+
+ /**
+ * Replaces (in-place) HTML escapes in a StringBuffer with their corresponding characters.
+ *
+ * @deprecated use {@link StringEscapeUtils#unescapeHtml(String)} instead
+ */
+ @Deprecated
+ public static StringBuffer unescape(StringBuffer sb) {
+ int i = 0; // index into the unprocessed section of the buffer
+ int j = 0; // index into the processed section of the buffer
+
+ while (i < sb.length()) {
+ char ch = sb.charAt(i);
+ if (ch == '&') {
+ int start = i;
+ String escape = null;
+ for (i = i + 1; i < sb.length(); i++) {
+ ch = sb.charAt(i);
+ if (!Character.isLetterOrDigit(ch) && !(ch == '#' && i == (start + 1))) {
+ escape = sb.substring(start + 1, i);
+ break;
+ }
+ }
+ if (i == sb.length() && i != (start + 1)) {
+ escape = sb.substring(start + 1);
+ }
+ if (escape != null) {
+ Character character = parseReference(escape);
+ if (character != null
+ && !((0x0A == character || 0x0D == character || 0x09 == ch)
+ || (character >= 0x20 && character <= 0xD7FF)
+ || (character >= 0xE000 && character <= 0xFFFD) || (character >= 0x10000 && character <= 0x10FFFF))) {
+ // Character is an invalid xml character
+ // http://www.w3.org/TR/REC-xml/#charsets
+ character = null;
+ }
+ if (character != null) {
+ ch = character.charValue();
+ } else {
+ // not an HTML escape; rewind
+ i = start;
+ ch = '&';
+ }
+ }
+ }
+ sb.setCharAt(j, ch);
+ i++;
+ j++;
+ }
+
+ sb.setLength(j);
+ return sb;
+ }
+
+ /**
+ * Parses HTML character and entity references and returns the corresponding character.
+ */
+ private static Character parseReference(String s) {
+ if (s.length() == 0) {
+ return null;
+ }
+
+ if (s.charAt(0) == '#') {
+ // character reference
+ if (s.length() == 1) {
+ return null;
+ }
+
+ try {
+ int value;
+ if (s.charAt(1) == 'x') {
+ // Hex reference
+ value = Integer.parseInt(s.substring(2), 16);
+ } else {
+ // Decimal reference
+ value = Integer.parseInt(s.substring(1));
+ }
+ return new Character((char) value);
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ } else {
+ return entities.get(s);
+ }
+ }
+
+ /**
+ * Class for current token.
+ */
+ public static class Token {
+ public static final Type EOF = new Type();
+
+ public static final Type TEXT = new Type();
+
+ public static final Type TAG = new Type();
+
+ public static final Type COMMENT = new Type();
+
+ /** token's type */
+ private Type type;
+
+ /** token's value */
+ private final Object value;
+
+ /** whitespace preceding the token */
+ private final StringBuffer whitespace;
+
+ /**
+ * Constructor for the EOF token.
+ */
+ protected Token() {
+ type = EOF;
+ value = null;
+ whitespace = null;
+ }
+
+ /**
+ * Constructor for the HTML tag tokens.
+ */
+ protected Token(HtmlTag tag, StringBuffer whitespace) {
+ type = TAG;
+ value = tag;
+ this.whitespace = whitespace;
+ }
+
+ /**
+ * Constructor for regular text and comments.
+ */
+ protected Token(StringBuffer text, StringBuffer whitespace, boolean comment) {
+ if (comment) {
+ type = COMMENT;
+ } else {
+ type = TEXT;
+ }
+ this.value = text;
+ this.whitespace = whitespace;
+ }
+
+ /**
+ * Returns the token's type.
+ */
+ public Type getType() {
+ return type;
+ }
+
+ /**
+ * Returns the whitespace preceding the token.
+ */
+ public StringBuffer getWhitespace() {
+ return whitespace;
+ }
+
+ /**
+ * Returns the token's value. This is an HtmlTag for tokens of type <code>TAG</code> and a StringBuffer for
+ * tokens of type <code>TEXT</code> and <code>COMMENT</code>. For tokens of type <code>EOF</code>, the value is
+ * <code>null</code>.
+ */
+ public Object getValue() {
+ return value;
+ }
+
+ /**
+ * Returns the string representation of the token, including the preceding whitespace.
+ */
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ if (whitespace != null) {
+ sb.append(whitespace);
+ }
+ if (value != null) {
+ if (type == TAG) {
+ // sb.append('<');
+ } else if (type == COMMENT) {
+ sb.append("<!--"); //$NON-NLS-1$
+ }
+ sb.append(value);
+ if (type == TAG) {
+ // if(value instanceof HtmlTag) {
+ // HtmlTag htmlTag = (HtmlTag)value;
+ // if(htmlTag.getTagName().startsWith("?xml")) {
+ // sb.append("?>");
+ // }
+ // } else {
+ // sb.append('>');
+
+ } else if (type == COMMENT) {
+ sb.append("-->"); //$NON-NLS-1$
+ }
+
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Private enum class for token type.
+ */
+ private static class Type {
+ private Type() {
+ // don't need to do anything
+ }
+ }
+ }
+
+ /**
+ * Enum class for parser state.
+ */
+ private static class State {
+ static final State EOF = new State();
+
+ static final State COMMENT = new State();
+
+ static final State TEXT = new State();
+
+ static final State TAG = new State();
+
+ static final State WS = new State();
+
+ static final State TAG_QUOTE = new State();
+
+ private State() {
+ // don't need to do anything
+ }
+ }
+
+ /** names and values of HTML entity references */
+ private static HashMap<String, Character> entities;
+
+ /*
+ * Based on ISO 8879.
+ *
+ * Portions (c) International Organization for Standardization 1986
+ * Permission to copy in any form is granted for use with conforming SGML
+ * systems and applications as defined in ISO 8879, provided this notice is
+ * included in all copies.
+ *
+ */
+ static {
+ entities = new HashMap<String, Character>();
+ entities.put("nbsp", Character.valueOf('\240')); // no-break //$NON-NLS-1$
+ // space =
+ // non-breaking
+ // space
+ entities.put("iexcl", Character.valueOf('\241')); // inverted //$NON-NLS-1$
+ // exclamation
+ // mark
+ entities.put("cent", Character.valueOf('\242')); // cent sign //$NON-NLS-1$
+ entities.put("pound", Character.valueOf('\243')); // pound //$NON-NLS-1$
+ // sign
+ entities.put("curren", Character.valueOf('\244')); // currency //$NON-NLS-1$
+ // sign
+ entities.put("yen", Character.valueOf('\245')); // yen sign = //$NON-NLS-1$
+ // yuan sign
+ entities.put("brvbar", Character.valueOf('\246')); // broken //$NON-NLS-1$
+ // bar =
+ // broken
+ // vertical
+ // bar
+ entities.put("sect", Character.valueOf('\247')); // section //$NON-NLS-1$
+ // sign
+ entities.put("uml", Character.valueOf('\250')); // diaeresis = //$NON-NLS-1$
+ // spacing
+ // diaeresis
+ entities.put("copy", Character.valueOf('\251')); // copyright //$NON-NLS-1$
+ // sign
+ entities.put("ordf", Character.valueOf('\252')); // feminine //$NON-NLS-1$
+ // ordinal
+ // indicator
+ entities.put("laquo", Character.valueOf('\253')); // left-pointing //$NON-NLS-1$
+ // double
+ // angle
+ // quotation
+ // mark =
+ // left
+ // pointing
+ // guillemet
+ entities.put("not", Character.valueOf('\254')); // not sign //$NON-NLS-1$
+ entities.put("shy", Character.valueOf('\255')); // soft hyphen = //$NON-NLS-1$
+ // discretionary
+ // hyphen
+ entities.put("reg", Character.valueOf('\256')); // registered //$NON-NLS-1$
+ // sign =
+ // registered
+ // trade mark
+ // sign
+ entities.put("macr", Character.valueOf('\257')); // macron = //$NON-NLS-1$
+ // spacing
+ // macron =
+ // overline
+ // = APL
+ // overbar
+ entities.put("deg", Character.valueOf('\260')); // degree sign //$NON-NLS-1$
+ entities.put("plusmn", Character.valueOf('\261')); // plus-minus //$NON-NLS-1$
+ // sign =
+ // plus-or-minus
+ // sign
+ entities.put("sup2", Character.valueOf('\262')); // superscript //$NON-NLS-1$
+ // two =
+ // superscript
+ // digit two
+ // = squared
+ entities.put("sup3", Character.valueOf('\263')); // superscript //$NON-NLS-1$
+ // three =
+ // superscript
+ // digit
+ // three =
+ // cubed
+ entities.put("acute", Character.valueOf('\264')); // acute //$NON-NLS-1$
+ // accent =
+ // spacing
+ // acute
+ entities.put("micro", Character.valueOf('\265')); // micro //$NON-NLS-1$
+ // sign
+ entities.put("para", Character.valueOf('\266')); // pilcrow //$NON-NLS-1$
+ // sign =
+ // paragraph
+ // sign
+ entities.put("middot", Character.valueOf('\267')); // middle //$NON-NLS-1$
+ // dot =
+ // Georgian
+ // comma =
+ // Greek
+ // middle
+ // dot
+ entities.put("cedil", Character.valueOf('\270')); // cedilla = //$NON-NLS-1$
+ // spacing
+ // cedilla
+ entities.put("sup1", Character.valueOf('\271')); // superscript //$NON-NLS-1$
+ // one =
+ // superscript
+ // digit one
+ entities.put("ordm", Character.valueOf('\272')); // masculine //$NON-NLS-1$
+ // ordinal
+ // indicator
+ entities.put("raquo", Character.valueOf('\273')); // right-pointing //$NON-NLS-1$
+ // double
+ // angle
+ // quotation
+ // mark =
+ // right
+ // pointing
+ // guillemet
+ entities.put("frac14", Character.valueOf('\274')); // vulgar //$NON-NLS-1$
+ // fraction
+ // one
+ // quarter =
+ // fraction
+ // one
+ // quarter
+ entities.put("frac12", Character.valueOf('\275')); // vulgar //$NON-NLS-1$
+ // fraction
+ // one half
+ // =
+ // fraction
+ // one half
+ entities.put("frac34", Character.valueOf('\276')); // vulgar //$NON-NLS-1$
+ // fraction
+ // three
+ // quarters
+ // =
+ // fraction
+ // three
+ // quarters
+ entities.put("iquest", Character.valueOf('\277')); // inverted //$NON-NLS-1$
+ // question
+ // mark =
+ // turned
+ // question
+ // mark
+ entities.put("Agrave", Character.valueOf('\300')); // latin //$NON-NLS-1$
+ // capital
+ // letter A
+ // with
+ // grave =
+ // latin
+ // capital
+ // letter A
+ // grave
+ entities.put("Aacute", Character.valueOf('\301')); // latin //$NON-NLS-1$
+ // capital
+ // letter A
+ // with
+ // acute
+ entities.put("Acirc", Character.valueOf('\302')); // latin //$NON-NLS-1$
+ // capital
+ // letter A
+ // with
+ // circumflex
+ entities.put("Atilde", Character.valueOf('\303')); // latin //$NON-NLS-1$
+ // capital
+ // letter A
+ // with
+ // tilde
+ entities.put("Auml", Character.valueOf('\304')); // latin //$NON-NLS-1$
+ // capital
+ // letter A
+ // with
+ // diaeresis
+ entities.put("Aring", Character.valueOf('\305')); // latin //$NON-NLS-1$
+ // capital
+ // letter A
+ // with ring
+ // above =
+ // latin
+ // capital
+ // letter A
+ // ring
+ entities.put("AElig", Character.valueOf('\306')); // latin //$NON-NLS-1$
+ // capital
+ // letter AE
+ // = latin
+ // capital
+ // ligature
+ // AE
+ entities.put("Ccedil", Character.valueOf('\307')); // latin //$NON-NLS-1$
+ // capital
+ // letter C
+ // with
+ // cedilla
+ entities.put("Egrave", Character.valueOf('\310')); // latin //$NON-NLS-1$
+ // capital
+ // letter E
+ // with
+ // grave
+ entities.put("Eacute", Character.valueOf('\311')); // latin //$NON-NLS-1$
+ // capital
+ // letter E
+ // with
+ // acute
+ entities.put("Ecirc", Character.valueOf('\312')); // latin //$NON-NLS-1$
+ // capital
+ // letter E
+ // with
+ // circumflex
+ entities.put("Euml", Character.valueOf('\313')); // latin //$NON-NLS-1$
+ // capital
+ // letter E
+ // with
+ // diaeresis
+ entities.put("Igrave", Character.valueOf('\314')); // latin //$NON-NLS-1$
+ // capital
+ // letter I
+ // with
+ // grave
+ entities.put("Iacute", Character.valueOf('\315')); // latin //$NON-NLS-1$
+ // capital
+ // letter I
+ // with
+ // acute
+ entities.put("Icirc", Character.valueOf('\316')); // latin //$NON-NLS-1$
+ // capital
+ // letter I
+ // with
+ // circumflex
+ entities.put("Iuml", Character.valueOf('\317')); // latin //$NON-NLS-1$
+ // capital
+ // letter I
+ // with
+ // diaeresis
+ entities.put("ETH", Character.valueOf('\320')); // latin capital //$NON-NLS-1$
+ // letter ETH
+ entities.put("Ntilde", Character.valueOf('\321')); // latin //$NON-NLS-1$
+ // capital
+ // letter N
+ // with
+ // tilde
+ entities.put("Ograve", Character.valueOf('\322')); // latin //$NON-NLS-1$
+ // capital
+ // letter O
+ // with
+ // grave
+ entities.put("Oacute", Character.valueOf('\323')); // latin //$NON-NLS-1$
+ // capital
+ // letter O
+ // with
+ // acute
+ entities.put("Ocirc", Character.valueOf('\324')); // latin //$NON-NLS-1$
+ // capital
+ // letter O
+ // with
+ // circumflex
+ entities.put("Otilde", Character.valueOf('\325')); // latin //$NON-NLS-1$
+ // capital
+ // letter O
+ // with
+ // tilde
+ entities.put("Ouml", Character.valueOf('\326')); // latin //$NON-NLS-1$
+ // capital
+ // letter O
+ // with
+ // diaeresis
+ entities.put("times", Character.valueOf('\327')); // multiplication //$NON-NLS-1$
+ // sign
+ entities.put("Oslash", Character.valueOf('\330')); // latin //$NON-NLS-1$
+ // capital
+ // letter O
+ // with
+ // stroke =
+ // latin
+ // capital
+ // letter O
+ // slash
+ entities.put("Ugrave", Character.valueOf('\331')); // latin //$NON-NLS-1$
+ // capital
+ // letter U
+ // with
+ // grave
+ entities.put("Uacute", Character.valueOf('\332')); // latin //$NON-NLS-1$
+ // capital
+ // letter U
+ // with
+ // acute
+ entities.put("Ucirc", Character.valueOf('\333')); // latin //$NON-NLS-1$
+ // capital
+ // letter U
+ // with
+ // circumflex
+ entities.put("Uuml", Character.valueOf('\334')); // latin //$NON-NLS-1$
+ // capital
+ // letter U
+ // with
+ // diaeresis
+ entities.put("Yacute", Character.valueOf('\335')); // latin //$NON-NLS-1$
+ // capital
+ // letter Y
+ // with
+ // acute
+ entities.put("THORN", Character.valueOf('\336')); // latin //$NON-NLS-1$
+ // capital
+ // letter
+ // THORN
+ entities.put("szlig", Character.valueOf('\337')); // latin //$NON-NLS-1$
+ // small
+ // letter
+ // sharp s =
+ // ess-zed
+ entities.put("agrave", Character.valueOf('\340')); // latin //$NON-NLS-1$
+ // small
+ // letter a
+ // with
+ // grave =
+ // latin
+ // small
+ // letter a
+ // grave
+ entities.put("aacute", Character.valueOf('\341')); // latin //$NON-NLS-1$
+ // small
+ // letter a
+ // with
+ // acute
+ entities.put("acirc", Character.valueOf('\342')); // latin //$NON-NLS-1$
+ // small
+ // letter a
+ // with
+ // circumflex
+ entities.put("atilde", Character.valueOf('\343')); // latin //$NON-NLS-1$
+ // small
+ // letter a
+ // with
+ // tilde
+ entities.put("auml", Character.valueOf('\344')); // latin //$NON-NLS-1$
+ // small
+ // letter a
+ // with
+ // diaeresis
+ entities.put("aring", Character.valueOf('\345')); // latin //$NON-NLS-1$
+ // small
+ // letter a
+ // with ring
+ // above =
+ // latin
+ // small
+ // letter a
+ // ring
+ entities.put("aelig", Character.valueOf('\346')); // latin //$NON-NLS-1$
+ // small
+ // letter ae
+ // = latin
+ // small
+ // ligature
+ // ae
+ entities.put("ccedil", Character.valueOf('\347')); // latin //$NON-NLS-1$
+ // small
+ // letter c
+ // with
+ // cedilla
+ entities.put("egrave", Character.valueOf('\350')); // latin //$NON-NLS-1$
+ // small
+ // letter e
+ // with
+ // grave
+ entities.put("eacute", Character.valueOf('\351')); // latin //$NON-NLS-1$
+ // small
+ // letter e
+ // with
+ // acute
+ entities.put("ecirc", Character.valueOf('\352')); // latin //$NON-NLS-1$
+ // small
+ // letter e
+ // with
+ // circumflex
+ entities.put("euml", Character.valueOf('\353')); // latin //$NON-NLS-1$
+ // small
+ // letter e
+ // with
+ // diaeresis
+ entities.put("igrave", Character.valueOf('\354')); // latin //$NON-NLS-1$
+ // small
+ // letter i
+ // with
+ // grave
+ entities.put("iacute", Character.valueOf('\355')); // latin //$NON-NLS-1$
+ // small
+ // letter i
+ // with
+ // acute
+ entities.put("icirc", Character.valueOf('\356')); // latin //$NON-NLS-1$
+ // small
+ // letter i
+ // with
+ // circumflex
+ entities.put("iuml", Character.valueOf('\357')); // latin //$NON-NLS-1$
+ // small
+ // letter i
+ // with
+ // diaeresis
+ entities.put("eth", Character.valueOf('\360')); // latin small //$NON-NLS-1$
+ // letter eth
+ entities.put("ntilde", Character.valueOf('\361')); // latin //$NON-NLS-1$
+ // small
+ // letter n
+ // with
+ // tilde
+ entities.put("ograve", Character.valueOf('\362')); // latin //$NON-NLS-1$
+ // small
+ // letter o
+ // with
+ // grave
+ entities.put("oacute", Character.valueOf('\363')); // latin //$NON-NLS-1$
+ // small
+ // letter o
+ // with
+ // acute
+ entities.put("ocirc", Character.valueOf('\364')); // latin //$NON-NLS-1$
+ // small
+ // letter o
+ // with
+ // circumflex
+ entities.put("otilde", Character.valueOf('\365')); // latin //$NON-NLS-1$
+ // small
+ // letter o
+ // with
+ // tilde
+ entities.put("ouml", Character.valueOf('\366')); // latin //$NON-NLS-1$
+ // small
+ // letter o
+ // with
+ // diaeresis
+ entities.put("divide", Character.valueOf('\367')); // division //$NON-NLS-1$
+ // sign
+ entities.put("oslash", Character.valueOf('\370')); // latin //$NON-NLS-1$
+ // small
+ // letter o
+ // with
+ // stroke =
+ // latin
+ // small
+ // letter o
+ // slash
+ entities.put("ugrave", Character.valueOf('\371')); // latin //$NON-NLS-1$
+ // small
+ // letter u
+ // with
+ // grave
+ entities.put("uacute", Character.valueOf('\372')); // latin //$NON-NLS-1$
+ // small
+ // letter u
+ // with
+ // acute
+ entities.put("ucirc", Character.valueOf('\373')); // latin //$NON-NLS-1$
+ // small
+ // letter u
+ // with
+ // circumflex
+ entities.put("uuml", Character.valueOf('\374')); // latin //$NON-NLS-1$
+ // small
+ // letter u
+ // with
+ // diaeresis
+ entities.put("yacute", Character.valueOf('\375')); // latin //$NON-NLS-1$
+ // small
+ // letter y
+ // with
+ // acute
+ entities.put("thorn", Character.valueOf('\376')); // latin //$NON-NLS-1$
+ // small
+ // letter
+ // thorn
+ entities.put("yuml", Character.valueOf('\377')); // latin //$NON-NLS-1$
+ // small
+ // letter y
+ // with
+ // diaeresis
+
+ // Special characters
+ entities.put("quot", Character.valueOf('\42')); // quotation //$NON-NLS-1$
+ // mark = APL
+ // quote
+ entities.put("amp", Character.valueOf('\46')); // ampersand //$NON-NLS-1$
+ entities.put("lt", Character.valueOf('\74')); // less-than //$NON-NLS-1$
+ // sign
+ entities.put("gt", Character.valueOf('\76')); // greater-than //$NON-NLS-1$
+ // sign
+ // Latin Extended-A
+ entities.put("OElig", Character.valueOf('\u0152')); // latin //$NON-NLS-1$
+ // capital
+ // ligature
+ // OE
+ entities.put("oelig", Character.valueOf('\u0153')); // latin //$NON-NLS-1$
+ // small
+ // ligature
+ // oe,
+ // ligature
+ // is a
+ // misnomer,
+ // this is a
+ // separate
+ // character
+ // in some
+ // languages
+ entities.put("Scaron", Character.valueOf('\u0160')); // latin //$NON-NLS-1$
+ // capital
+ // letter
+ // S
+ // with
+ // caron
+ entities.put("scaron", Character.valueOf('\u0161')); // latin //$NON-NLS-1$
+ // small
+ // letter
+ // s
+ // with
+ // caron
+ entities.put("Yuml", Character.valueOf('\u0178')); // latin //$NON-NLS-1$
+ // capital
+ // letter Y
+ // with
+ // diaeresis
+ // Spacing Modifier Letters
+ entities.put("circ", Character.valueOf('\u02c6')); // modifier //$NON-NLS-1$
+ // letter
+ // circumflex
+ // accent
+ entities.put("tilde", Character.valueOf('\u02dc')); // small //$NON-NLS-1$
+ // tilde
+ // General punctuation
+ entities.put("ensp", Character.valueOf('\u2002')); // en space //$NON-NLS-1$
+ entities.put("emsp", Character.valueOf('\u2003')); // em space //$NON-NLS-1$
+ entities.put("thinsp", Character.valueOf('\u2009')); // thin //$NON-NLS-1$
+ // space
+ entities.put("zwnj", Character.valueOf('\u200c')); // zero //$NON-NLS-1$
+ // width
+ // non-joiner
+ entities.put("zwj", Character.valueOf('\u200d')); // zero //$NON-NLS-1$
+ // width
+ // joiner
+ entities.put("lrm", Character.valueOf('\u200e')); // left-to-right //$NON-NLS-1$
+ // mark
+ entities.put("rlm", Character.valueOf('\u200f')); // right-to-left //$NON-NLS-1$
+ // mark
+ entities.put("ndash", Character.valueOf('\u2013')); // en dash //$NON-NLS-1$
+ entities.put("mdash", Character.valueOf('\u2014')); // em dash //$NON-NLS-1$
+ entities.put("lsquo", Character.valueOf('\u2018')); // left //$NON-NLS-1$
+ // single
+ // quotation
+ // mark
+ entities.put("rsquo", Character.valueOf('\u2019')); // right //$NON-NLS-1$
+ // single
+ // quotation
+ // mark
+ entities.put("sbquo", Character.valueOf('\u201a')); // single //$NON-NLS-1$
+ // low-9
+ // quotation
+ // mark
+ entities.put("ldquo", Character.valueOf('\u201c')); // left //$NON-NLS-1$
+ // double
+ // quotation
+ // mark
+ entities.put("rdquo", Character.valueOf('\u201d')); // right //$NON-NLS-1$
+ // double
+ // quotation
+ // mark
+ entities.put("bdquo", Character.valueOf('\u201e')); // double //$NON-NLS-1$
+ // low-9
+ // quotation
+ // mark
+ entities.put("dagger", Character.valueOf('\u2020')); // dagger //$NON-NLS-1$
+ entities.put("Dagger", Character.valueOf('\u2021')); // double //$NON-NLS-1$
+ // dagger
+ entities.put("permil", Character.valueOf('\u2030')); // per //$NON-NLS-1$
+ // mille
+ // sign
+ entities.put("lsaquo", Character.valueOf('\u2039')); // single //$NON-NLS-1$
+ // left-pointing
+ // angle
+ // quotation
+ // mark,
+ // not
+ // yet
+ // standardized
+ entities.put("rsaquo", Character.valueOf('\u203a')); // single //$NON-NLS-1$
+ // right-pointing
+ // angle
+ // quotation
+ // mark,
+ // not
+ // yet
+ // standardized
+ entities.put("euro", Character.valueOf('\u20ac')); // euro sign //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/HtmlTag.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/HtmlTag.java
new file mode 100644
index 0000000..874ea7d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/HtmlTag.java
@@ -0,0 +1,374 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.net.URL;
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+
+import javax.swing.text.html.HTML.Tag;
+
+/**
+ * Class representing an HTML (3.2) tag and its attributes.
+ *
+ * @author Shawn Minto
+ * @since 2.0
+ */
+public class HtmlTag {
+ /** tag's name */
+ private String tagName;
+
+ /** tag type enum */
+ private Tag tagType;
+
+ /** true if the tag is a closing tag */
+ private boolean isEndTag;
+
+ /** tag's attributes (keys are lowercase attribute names) */
+ private HashMap<String, String> attributes;
+
+ /** tag's base url */
+ private final URL baseUrl;
+
+ /** tag is self terminated */
+ private boolean selfTerminating;
+
+ /**
+ * Basic constructor. The tag is uninitialized.
+ */
+ public HtmlTag() {
+ tagName = null;
+ tagType = Type.UNKNOWN;
+ isEndTag = false;
+ attributes = new HashMap<String, String>();
+ baseUrl = null;
+ }
+
+ /**
+ * Copy constructor.
+ */
+ @SuppressWarnings("unchecked")
+ public HtmlTag(HtmlTag htmltag) {
+ tagName = null;
+ tagType = Type.UNKNOWN;
+ isEndTag = false;
+ attributes = new HashMap<String, String>();
+ tagName = htmltag.tagName;
+ baseUrl = htmltag.baseUrl;
+ tagType = htmltag.tagType;
+ isEndTag = htmltag.isEndTag;
+ attributes = (HashMap) htmltag.attributes.clone();
+ }
+
+ /**
+ * Constructor.
+ */
+ public HtmlTag(String s) throws ParseException {
+ attributes = new HashMap<String, String>();
+ setTagName(s);
+ baseUrl = null;
+ }
+
+ /**
+ * Constructor creating an otherwise empty tag, but with a given base url.
+ */
+ public HtmlTag(URL url) {
+ tagName = null;
+ tagType = Type.UNKNOWN;
+ isEndTag = false;
+ attributes = new HashMap<String, String>();
+ baseUrl = url;
+ }
+
+ /**
+ * Returns the tag's type (linked to the tag's name).
+ */
+ public Tag getTagType() {
+ return tagType;
+ }
+
+ /**
+ * Returns the tag's name (e.g., "HEAD", "P", etc.).
+ */
+ public String getTagName() {
+ return tagName;
+ }
+
+ /**
+ * Sets the tag's name and type, if known.
+ *
+ * @throws IllegalArgumentException
+ * if the argument is <code>null</code> or empty string
+ */
+ public void setTagName(String s) throws IllegalArgumentException {
+ if (s == null || s.length() == 0) {
+ throw new IllegalArgumentException("Empty tag name"); //$NON-NLS-1$
+ }
+ if (s.charAt(0) == '/') {
+ isEndTag = true;
+ s = s.substring(1);
+ }
+ if (s.length() == 0) {
+ throw new IllegalArgumentException("Empty tag name"); //$NON-NLS-1$
+ }
+ tagName = s;
+ tagType = tags.get(s.toUpperCase(Locale.ENGLISH));
+ if (tagType == null) {
+ tagType = Type.UNKNOWN;
+ }
+ }
+
+ /**
+ * Returns <code>true</code> if the tag is a closing tag.
+ */
+ public boolean isEndTag() {
+ return isEndTag;
+ }
+
+ /**
+ * Returns the value of a tag's attribute as an integer.
+ */
+ public int getIntAttribute(String s) throws NumberFormatException {
+ return Integer.parseInt(getAttribute(s));
+ }
+
+ /**
+ * Returns the value of a tag's attribute, or NULL if it doesn't exist.
+ */
+ public String getAttribute(String s) {
+ return attributes.get(s);
+ }
+
+ /**
+ * Returns <code>true</code> if the tag contains attribute with the given name.
+ */
+ public boolean hasAttribute(String s) {
+ return getAttribute(s) != null;
+ }
+
+ /**
+ * Sets the value of a tag's attribute.
+ */
+ public void setAttribute(String name, String value) {
+ attributes.put(name.toLowerCase(Locale.ENGLISH), value);
+ }
+
+ public StringBuffer getURLs() {
+ StringBuffer sb = new StringBuffer();
+
+ Iterator<String> attributeNames = attributes.keySet().iterator();
+ Iterator<String> attributeValues = attributes.values().iterator();
+ while (attributeNames.hasNext()) {
+ String attributeName = attributeNames.next();
+ if (attributeName.compareTo("href") == 0 || attributeName.compareTo("src") == 0) { //$NON-NLS-1$ //$NON-NLS-2$
+ String target = attributeValues.next();
+ if (!target.endsWith(".jpg") && !target.endsWith(".gif") && !target.endsWith(".css") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ && !target.endsWith(".js") && !target.startsWith("mailto") && target.lastIndexOf("#") == -1 //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ && target.length() > 0) {
+
+ for (int i = 0; i < target.length(); i++) {
+ char ch = target.charAt(i);
+ if (!Character.isWhitespace(ch)) {
+ if (i > 0) {
+ target = target.substring(i + 1);
+ }
+ break;
+ }
+ }
+ target = target.replace('\\', '/');
+
+ if (target.startsWith("news:") || (target.indexOf("://") != -1 && target.length() >= 7)) { //$NON-NLS-1$ //$NON-NLS-2$
+ // Absolute URL
+ if (target.substring(0, 7).compareToIgnoreCase("http://") == 0) { //$NON-NLS-1$
+ sb.append(target);
+ }
+ } else {
+ // Relative URL
+
+ String baseDir = baseUrl.getPath();
+ int lastSep = -1;
+ for (int i = 0; i < baseDir.length(); i++) {
+ char ch = baseDir.charAt(i);
+ if (ch == '/') {
+ lastSep = i;
+ } else if (ch == '?') {
+ break;
+ }
+ }
+ if (lastSep >= 0) {
+ baseDir = baseDir.substring(0, lastSep);
+ }
+ while (baseDir.length() > 1 && baseDir.endsWith("/.")) { //$NON-NLS-1$
+ baseDir = baseDir.substring(0, baseDir.length() - 2);
+ }
+
+ if (target.startsWith("//")) { //$NON-NLS-1$
+ sb.append(baseUrl.getProtocol() + ":" + target); //$NON-NLS-1$
+ } else if (target.startsWith("/")) { //$NON-NLS-1$
+ sb.append(baseUrl.getProtocol() + "://" + baseUrl.getHost() + target); //$NON-NLS-1$
+ } else {
+ while (target.startsWith("../")) { //$NON-NLS-1$
+ if (baseDir.length() > 0) {
+ // can't go above root
+ baseDir = baseDir.substring(0, baseDir.lastIndexOf("/")); //$NON-NLS-1$
+ }
+ target = target.substring(3);
+ }
+ sb.append(baseUrl.getProtocol() + "://" + baseUrl.getHost() + baseDir + "/" + target); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+ } else {
+ attributeValues.next();
+ }
+ }
+
+ return sb;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append('<');
+ if (isEndTag) {
+ sb.append('/');
+ }
+ sb.append(tagName);
+ Iterator<String> keys = attributes.keySet().iterator();
+ Iterator<String> values = attributes.values().iterator();
+ while (keys.hasNext()) {
+ String name = keys.next();
+ sb.append(' ');
+ sb.append(name);
+ String value = values.next();
+ sb.append("=\""); //$NON-NLS-1$
+ if (value.length() > 0) {
+ sb.append(value);
+ }
+ sb.append('"');
+ }
+ if (selfTerminating) {
+ sb.append('/');
+ }
+ sb.append('>');
+
+ return sb.toString();
+ }
+
+ /**
+ * Enum class for tag types.
+ */
+ public static class Type extends Tag {
+ public static final Tag UNKNOWN = new Tag();
+
+ public static final Tag THEAD = new Type("THEAD"); //$NON-NLS-1$
+
+ public static final Tag DOCTYPE = new Type("!DOCTYPE"); //$NON-NLS-1$
+
+ public static final Tag LABEL = new Type("LABEL"); //$NON-NLS-1$
+
+ private Type(String name) {
+ super(name);
+ }
+ }
+
+ private static HashMap<String, Tag> tags;
+ static {
+ tags = new HashMap<String, Tag>();
+ tags.put("A", Tag.A); //$NON-NLS-1$
+ tags.put("ADDRESS", Tag.ADDRESS); //$NON-NLS-1$
+ tags.put("APPLET", Tag.APPLET); //$NON-NLS-1$
+ tags.put("AREA", Tag.AREA); //$NON-NLS-1$
+ tags.put("B", Tag.B); //$NON-NLS-1$
+ tags.put("BASE", Tag.BASE); //$NON-NLS-1$
+ tags.put("BASEFONT", Tag.BASEFONT); //$NON-NLS-1$
+ tags.put("BIG", Tag.BIG); //$NON-NLS-1$
+ tags.put("BLOCKQUOTE", Tag.BLOCKQUOTE); //$NON-NLS-1$
+ tags.put("BODY", Tag.BODY); //$NON-NLS-1$
+ tags.put("BR", Tag.BR); //$NON-NLS-1$
+ tags.put("CAPTION", Tag.CAPTION); //$NON-NLS-1$
+ tags.put("CENTER", Tag.CENTER); //$NON-NLS-1$
+ tags.put("CITE", Tag.CITE); //$NON-NLS-1$
+ tags.put("CODE", Tag.CODE); //$NON-NLS-1$
+ tags.put("DD", Tag.DD); //$NON-NLS-1$
+ tags.put("DFN", Tag.DFN); //$NON-NLS-1$
+ tags.put("DIR", Tag.DIR); //$NON-NLS-1$
+ tags.put("DIV", Tag.DIV); //$NON-NLS-1$
+ tags.put("DL", Tag.DL); //$NON-NLS-1$
+ tags.put("!DOCTYPE", Type.DOCTYPE); //$NON-NLS-1$
+ tags.put("DT", Tag.DT); //$NON-NLS-1$
+ tags.put("EM", Tag.EM); //$NON-NLS-1$
+ tags.put("FONT", Tag.FONT); //$NON-NLS-1$
+ tags.put("FORM", Tag.FORM); //$NON-NLS-1$
+ tags.put("FRAME", Tag.FRAME); //$NON-NLS-1$
+ tags.put("FRAMESET", Tag.FRAMESET); //$NON-NLS-1$
+ tags.put("H1", Tag.H1); //$NON-NLS-1$
+ tags.put("H2", Tag.H2); //$NON-NLS-1$
+ tags.put("H3", Tag.H3); //$NON-NLS-1$
+ tags.put("H4", Tag.H4); //$NON-NLS-1$
+ tags.put("H5", Tag.H5); //$NON-NLS-1$
+ tags.put("H6", Tag.H6); //$NON-NLS-1$
+ tags.put("HEAD", Tag.HEAD); //$NON-NLS-1$
+ tags.put("HTML", Tag.HTML); //$NON-NLS-1$
+ tags.put("HR", Tag.HR); //$NON-NLS-1$
+ tags.put("I", Tag.I); //$NON-NLS-1$
+ tags.put("IMG", Tag.IMG); //$NON-NLS-1$
+ tags.put("INPUT", Tag.INPUT); //$NON-NLS-1$
+ tags.put("ISINDEX", Tag.ISINDEX); //$NON-NLS-1$
+ tags.put("KBD", Tag.KBD); //$NON-NLS-1$
+ tags.put("LI", Tag.LI); //$NON-NLS-1$
+ tags.put("LABEL", Type.LABEL); //$NON-NLS-1$
+ tags.put("LINK", Tag.LINK); //$NON-NLS-1$
+ tags.put("MAP", Tag.MAP); //$NON-NLS-1$
+ tags.put("MENU", Tag.MENU); //$NON-NLS-1$
+ tags.put("META", Tag.META); //$NON-NLS-1$
+ tags.put("NOFRAMES", Tag.NOFRAMES); //$NON-NLS-1$
+ tags.put("OBJECT", Tag.OBJECT); //$NON-NLS-1$
+ tags.put("OL", Tag.OL); //$NON-NLS-1$
+ tags.put("OPTION", Tag.OPTION); //$NON-NLS-1$
+ tags.put("P", Tag.P); //$NON-NLS-1$
+ tags.put("PARAM", Tag.PARAM); //$NON-NLS-1$
+ tags.put("PRE", Tag.PRE); //$NON-NLS-1$
+ tags.put("S", Tag.S); //$NON-NLS-1$
+ tags.put("SAMP", Tag.SAMP); //$NON-NLS-1$
+ tags.put("SCRIPT", Tag.SCRIPT); //$NON-NLS-1$
+ tags.put("SELECT", Tag.SELECT); //$NON-NLS-1$
+ tags.put("SMALL", Tag.SMALL); //$NON-NLS-1$
+ tags.put("SPAN", Tag.SPAN); //$NON-NLS-1$
+ tags.put("STRONG", Tag.STRONG); //$NON-NLS-1$
+ tags.put("STYLE", Tag.STYLE); //$NON-NLS-1$
+ tags.put("SUB", Tag.SUB); //$NON-NLS-1$
+ tags.put("SUP", Tag.SUP); //$NON-NLS-1$
+ tags.put("TABLE", Tag.TABLE); //$NON-NLS-1$
+ tags.put("TD", Tag.TD); //$NON-NLS-1$
+ tags.put("TEXTAREA", Tag.TEXTAREA); //$NON-NLS-1$
+ tags.put("TH", Tag.TH); //$NON-NLS-1$
+ tags.put("THEAD", Type.THEAD); //$NON-NLS-1$
+ tags.put("TITLE", Tag.TITLE); //$NON-NLS-1$
+ tags.put("TR", Tag.TR); //$NON-NLS-1$
+ tags.put("TT", Tag.TT); //$NON-NLS-1$
+ tags.put("U", Tag.U); //$NON-NLS-1$
+ tags.put("UL", Tag.UL); //$NON-NLS-1$
+ tags.put("VAR", Tag.VAR); //$NON-NLS-1$
+ }
+
+ public void setSelfTerminating(boolean terminating) {
+ this.selfTerminating = terminating;
+
+ }
+
+ public boolean isSelfTerminating() {
+ return selfTerminating;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/IProxyProvider.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/IProxyProvider.java
new file mode 100644
index 0000000..2ec81c2
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/IProxyProvider.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.net.Proxy;
+
+/**
+ * @since 2.2
+ * @author Steffen Pingel
+ */
+public interface IProxyProvider {
+
+ /**
+ * @since 2.2
+ */
+ public Proxy getProxyForHost(String host, String proxyType);
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/Policy.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/Policy.java
new file mode 100644
index 0000000..123a408
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/Policy.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.commons.net;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.ProgressMonitorWrapper;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.internal.commons.net.CommonsNetPlugin;
+import org.eclipse.mylyn.internal.commons.net.InfiniteSubProgressMonitor;
+
+/**
+ * @since 2.3
+ */
+public class Policy {
+
+ /**
+ * @since 2.3
+ */
+ public static boolean DEBUG_STREAMS = false;
+
+ static {
+ if (CommonsNetPlugin.getDefault() != null && CommonsNetPlugin.getDefault().isDebugging()) {
+ DEBUG_STREAMS = "true".equalsIgnoreCase(Platform.getDebugOption(CommonsNetPlugin.ID_PLUGIN + "/streams"));//$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static void advance(IProgressMonitor monitor, int worked) {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ monitor.worked(worked);
+ }
+
+ public static void checkCanceled(IProgressMonitor monitor) {
+ if (monitor != null && monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean isBackgroundMonitor(IProgressMonitor monitor) {
+ return monitor instanceof BackgroundProgressMonitor;
+
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static IProgressMonitor backgroundMonitorFor(IProgressMonitor monitor) {
+ if (monitor == null) {
+ return new NullProgressMonitor();
+ }
+ return new BackgroundProgressMonitor(monitor);
+ }
+
+ /**
+ * @since 2.3
+ */
+ public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
+ if (monitor == null) {
+ return new NullProgressMonitor();
+ }
+ return monitor;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static IProgressMonitor monitorFor(IProgressMonitor monitor, boolean backgroundOperation) {
+ if (monitor == null) {
+ return new NullProgressMonitor();
+ }
+ if (backgroundOperation) {
+ return backgroundMonitorFor(monitor);
+ }
+ return monitor;
+ }
+
+ /**
+ * @since 2.3
+ */
+ public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
+ if (monitor == null) {
+ return new NullProgressMonitor();
+ }
+ if (monitor instanceof NullProgressMonitor) {
+ return monitor;
+ }
+ if (monitor instanceof BackgroundProgressMonitor) {
+ return new BackgroundProgressMonitor(new SubProgressMonitor(monitor, ticks));
+ }
+ return new SubProgressMonitor(monitor, ticks);
+ }
+
+ /**
+ * @since 2.3
+ */
+ public static IProgressMonitor infiniteSubMonitorFor(IProgressMonitor monitor, int ticks) {
+ if (monitor == null) {
+ return new NullProgressMonitor();
+ }
+ if (monitor instanceof NullProgressMonitor) {
+ return monitor;
+ }
+ if (monitor instanceof BackgroundProgressMonitor) {
+ return new BackgroundProgressMonitor(new InfiniteSubProgressMonitor(monitor, ticks));
+ }
+ return new InfiniteSubProgressMonitor(monitor, ticks);
+ }
+
+ /**
+ * Wrapped progress monitor for background operations.
+ */
+ private static class BackgroundProgressMonitor extends ProgressMonitorWrapper {
+
+ protected BackgroundProgressMonitor(IProgressMonitor monitor) {
+ super(monitor);
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/UnsupportedRequestException.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/UnsupportedRequestException.java
new file mode 100644
index 0000000..6d7f1a8
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/UnsupportedRequestException.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+/**
+ * Indicates that the request is not supported.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class UnsupportedRequestException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ public UnsupportedRequestException() {
+ }
+
+ public UnsupportedRequestException(String message) {
+ super(message);
+ }
+
+ public UnsupportedRequestException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public UnsupportedRequestException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebLocation.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebLocation.java
new file mode 100644
index 0000000..19a4604
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebLocation.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.net.Proxy;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @since 2.2
+ * @author Steffen Pingel
+ */
+public class WebLocation extends AbstractWebLocation {
+
+ private static class PlatformProxyProvider implements IProxyProvider {
+
+ public Proxy getProxyForHost(String host, String proxyType) {
+ return WebUtil.getProxy(host, proxyType);
+ }
+
+ }
+
+ private final Map<AuthenticationType, AuthenticationCredentials> credentialsByType;
+
+ private final IProxyProvider proxyProvider;
+
+ public WebLocation(String url, String username, String password, IProxyProvider proxyProvider) {
+ super(url);
+
+ this.credentialsByType = new HashMap<AuthenticationType, AuthenticationCredentials>();
+ this.proxyProvider = proxyProvider;
+
+ if (username != null && password != null) {
+ setCredentials(AuthenticationType.REPOSITORY, username, password);
+ }
+ }
+
+ public WebLocation(String url, String username, String password) {
+ this(url, username, password, new PlatformProxyProvider());
+ }
+
+ public WebLocation(String url) {
+ this(url, null, null, new PlatformProxyProvider());
+ }
+
+ @Override
+ public AuthenticationCredentials getCredentials(AuthenticationType authType) {
+ return credentialsByType.get(authType);
+ }
+
+ @Override
+ public Proxy getProxyForHost(String host, String proxyType) {
+ if (proxyProvider != null) {
+ return proxyProvider.getProxyForHost(host, proxyType);
+ }
+ return null;
+ }
+
+ public void setCredentials(AuthenticationType authType, String username, String password) {
+ credentialsByType.put(authType, new AuthenticationCredentials(username, password));
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebRequest.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebRequest.java
new file mode 100644
index 0000000..7956815
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebRequest.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class WebRequest<T> implements Callable<T> {
+
+ /**
+ * @since 3.0
+ */
+ public abstract void abort();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebUtil.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebUtil.java
new file mode 100644
index 0000000..4d12b45
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/commons/net/WebUtil.java
@@ -0,0 +1,745 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.Socket;
+import java.net.Proxy.Type;
+import java.text.ParseException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.swing.text.html.HTML.Tag;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpConnectionManager;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.NTCredentials;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.params.DefaultHttpParams;
+import org.apache.commons.httpclient.params.HttpClientParams;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+import org.apache.commons.httpclient.protocol.Protocol;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+import org.apache.commons.httpclient.util.IdleConnectionTimeoutThread;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.internal.commons.net.AuthenticatedProxy;
+import org.eclipse.mylyn.internal.commons.net.CloneableHostConfiguration;
+import org.eclipse.mylyn.internal.commons.net.CommonsNetPlugin;
+import org.eclipse.mylyn.internal.commons.net.PollingInputStream;
+import org.eclipse.mylyn.internal.commons.net.PollingProtocolSocketFactory;
+import org.eclipse.mylyn.internal.commons.net.PollingSslProtocolSocketFactory;
+import org.eclipse.mylyn.internal.commons.net.TimeoutInputStream;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @author Rob Elves
+ * @since 3.0
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+public class WebUtil {
+
+ /**
+ * like Mylyn/2.1.0 (Rally Connector 1.0) Eclipse/3.3.0 (JBuilder 2007) HttpClient/3.0.1 Java/1.5.0_11 (Sun)
+ * Linux/2.6.20-16-lowlatency (i386; en)
+ */
+ private static final String USER_AGENT;
+
+ private static final int CONNNECT_TIMEOUT = 60 * 1000;
+
+ private static final int SOCKET_TIMEOUT = 3 * 60 * 1000;
+
+ private static final int HTTP_PORT = 80;
+
+ private static final int HTTPS_PORT = 443;
+
+ private static final int POLL_INTERVAL = 1000;
+
+ private static final int POLL_ATTEMPTS = SOCKET_TIMEOUT / POLL_INTERVAL;
+
+ private static final String USER_AGENT_PREFIX;
+
+ private static final String USER_AGENT_POSTFIX;
+
+ private static final int BUFFER_SIZE = 4096;
+
+ /**
+ * Do not block.
+ */
+ private static final long CLOSE_TIMEOUT = -1;
+
+ /**
+ * @see IdleConnectionTimeoutThread#setTimeoutInterval(long)
+ */
+ private static final long CONNECTION_TIMEOUT_INTERVAL = 30 * 1000;
+
+ static {
+ initCommonsLoggingSettings();
+
+ StringBuilder sb = new StringBuilder();
+ sb.append("Mylyn"); //$NON-NLS-1$
+ sb.append(getBundleVersion(CommonsNetPlugin.getDefault()));
+
+ USER_AGENT_PREFIX = sb.toString();
+ sb.setLength(0);
+
+ if (System.getProperty("org.osgi.framework.vendor") != null) { //$NON-NLS-1$
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(System.getProperty("org.osgi.framework.vendor")); //$NON-NLS-1$
+ sb.append(stripQualifier(System.getProperty("osgi.framework.version"))); //$NON-NLS-1$
+
+ if (System.getProperty("eclipse.product") != null) { //$NON-NLS-1$
+ sb.append(" ("); //$NON-NLS-1$
+ sb.append(System.getProperty("eclipse.product")); //$NON-NLS-1$
+ sb.append(")"); //$NON-NLS-1$
+ }
+ }
+
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(DefaultHttpParams.getDefaultParams().getParameter(HttpMethodParams.USER_AGENT).toString().split("-")[1]); //$NON-NLS-1$
+
+ sb.append(" Java/"); //$NON-NLS-1$
+ sb.append(System.getProperty("java.version")); //$NON-NLS-1$
+ sb.append(" ("); //$NON-NLS-1$
+ sb.append(System.getProperty("java.vendor").split(" ")[0]); //$NON-NLS-1$ //$NON-NLS-2$
+ sb.append(") "); //$NON-NLS-1$
+
+ sb.append(System.getProperty("os.name")); //$NON-NLS-1$
+ sb.append("/"); //$NON-NLS-1$
+ sb.append(System.getProperty("os.version")); //$NON-NLS-1$
+ sb.append(" ("); //$NON-NLS-1$
+ sb.append(System.getProperty("os.arch")); //$NON-NLS-1$
+ if (System.getProperty("osgi.nl") != null) { //$NON-NLS-1$
+ sb.append("; "); //$NON-NLS-1$
+ sb.append(System.getProperty("osgi.nl")); //$NON-NLS-1$
+ }
+ sb.append(")"); //$NON-NLS-1$
+
+ USER_AGENT_POSTFIX = sb.toString();
+
+ USER_AGENT = USER_AGENT_PREFIX + USER_AGENT_POSTFIX;
+ }
+
+ private static IdleConnectionTimeoutThread idleConnectionTimeoutThread;
+
+ private static MultiThreadedHttpConnectionManager connectionManager;
+
+ /**
+ * @since 3.0
+ */
+ public static void configureHttpClient(HttpClient client, String userAgent) {
+ client.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, true);
+ client.getParams().setParameter(HttpMethodParams.USER_AGENT, getUserAgent(userAgent));
+ // TODO consider setting this as the default
+ //client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
+ configureHttpClientConnectionManager(client);
+ }
+
+ private static void configureHttpClientConnectionManager(HttpClient client) {
+ client.getHttpConnectionManager().getParams().setSoTimeout(WebUtil.SOCKET_TIMEOUT);
+ client.getHttpConnectionManager().getParams().setConnectionTimeout(WebUtil.CONNNECT_TIMEOUT);
+ }
+
+ private static void configureHttpClientProxy(HttpClient client, HostConfiguration hostConfiguration,
+ AbstractWebLocation location) {
+ String host = WebUtil.getHost(location.getUrl());
+
+ Proxy proxy;
+ if (WebUtil.isRepositoryHttps(location.getUrl())) {
+ proxy = location.getProxyForHost(host, IProxyData.HTTPS_PROXY_TYPE);
+ } else {
+ proxy = location.getProxyForHost(host, IProxyData.HTTP_PROXY_TYPE);
+ }
+
+ if (proxy != null && !Proxy.NO_PROXY.equals(proxy)) {
+ InetSocketAddress address = (InetSocketAddress) proxy.address();
+ hostConfiguration.setProxy(address.getHostName(), address.getPort());
+ if (proxy instanceof AuthenticatedProxy) {
+ AuthenticatedProxy authProxy = (AuthenticatedProxy) proxy;
+ Credentials credentials = getCredentials(authProxy.getUserName(), authProxy.getPassword(),
+ address.getAddress());
+ AuthScope proxyAuthScope = new AuthScope(address.getHostName(), address.getPort(), AuthScope.ANY_REALM);
+ client.getState().setProxyCredentials(proxyAuthScope, credentials);
+ }
+ } else {
+ hostConfiguration.setProxyHost(null);
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static void connect(final Socket socket, final InetSocketAddress address, final int timeout,
+ IProgressMonitor monitor) throws IOException {
+ if (socket == null) {
+ throw new IllegalArgumentException();
+ }
+
+ WebRequest<?> executor = new WebRequest<Object>() {
+ @Override
+ public void abort() {
+ try {
+ socket.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+
+ public Object call() throws Exception {
+ socket.connect(address, timeout);
+ return null;
+ }
+
+ };
+
+ executeInternal(monitor, executor);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static HostConfiguration createHostConfiguration(HttpClient client, AbstractWebLocation location,
+ IProgressMonitor monitor) {
+ Assert.isNotNull(client);
+ Assert.isNotNull(location);
+
+ String url = location.getUrl();
+ String host = WebUtil.getHost(url);
+ int port = WebUtil.getPort(url);
+
+ configureHttpClientConnectionManager(client);
+
+ HostConfiguration hostConfiguration = new CloneableHostConfiguration();
+ configureHttpClientProxy(client, hostConfiguration, location);
+
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.HTTP);
+ if (credentials != null) {
+ AuthScope authScope = new AuthScope(host, port, AuthScope.ANY_REALM);
+ client.getState().setCredentials(authScope, getHttpClientCredentials(credentials, host));
+ }
+
+ if (WebUtil.isRepositoryHttps(url)) {
+ ProtocolSocketFactory socketFactory = new PollingSslProtocolSocketFactory(monitor);
+ Protocol protocol = new Protocol("https", socketFactory, HTTPS_PORT); //$NON-NLS-1$
+ hostConfiguration.setHost(host, port, protocol);
+ } else {
+ ProtocolSocketFactory socketFactory = new PollingProtocolSocketFactory(monitor);
+ Protocol protocol = new Protocol("http", socketFactory, HTTP_PORT); //$NON-NLS-1$
+ hostConfiguration.setHost(host, port, protocol);
+ }
+
+ return hostConfiguration;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static int execute(final HttpClient client, final HostConfiguration hostConfiguration,
+ final HttpMethod method, IProgressMonitor monitor) throws IOException {
+ return execute(client, hostConfiguration, method, null, monitor);
+ }
+
+ /**
+ * @since 3.1
+ */
+ public static int execute(final HttpClient client, final HostConfiguration hostConfiguration,
+ final HttpMethod method, final HttpState state, IProgressMonitor monitor) throws IOException {
+ Assert.isNotNull(client);
+ Assert.isNotNull(method);
+
+ monitor = Policy.monitorFor(monitor);
+
+ WebRequest<Integer> executor = new WebRequest<Integer>() {
+ @Override
+ public void abort() {
+ method.abort();
+ }
+
+ public Integer call() throws Exception {
+ return client.executeMethod(hostConfiguration, method, state);
+ }
+ };
+
+ return executeInternal(monitor, executor);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static <T> T execute(IProgressMonitor monitor, WebRequest<T> request) throws Throwable {
+ monitor = Policy.monitorFor(monitor);
+
+ Future<T> future = CommonsNetPlugin.getExecutorService().submit(request);
+ while (true) {
+ if (monitor.isCanceled()) {
+ if (!future.cancel(false)) {
+ request.abort();
+ }
+ // wait for executor to finish
+ try {
+ if (!future.isCancelled()) {
+ future.get();
+ }
+ } catch (InterruptedException e) {
+ // ignore
+ } catch (ExecutionException e) {
+ // ignore
+ }
+ throw new OperationCanceledException();
+ }
+
+ try {
+ return future.get(POLL_INTERVAL, TimeUnit.MILLISECONDS);
+ } catch (ExecutionException e) {
+ throw e.getCause();
+ } catch (TimeoutException ignored) {
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T> T executeInternal(IProgressMonitor monitor, WebRequest<?> request) throws IOException {
+ try {
+ return (T) execute(monitor, request);
+ } catch (IOException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Error e) {
+ throw e;
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static String getBundleVersion(Plugin plugin) {
+ if (null == plugin) {
+ return ""; //$NON-NLS-1$
+ }
+ Object bundleVersion = plugin.getBundle().getHeaders().get("Bundle-Version"); //$NON-NLS-1$
+ if (null == bundleVersion) {
+ return ""; //$NON-NLS-1$
+ }
+ return stripQualifier((String) bundleVersion);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static int getConnectionTimeout() {
+ return CONNNECT_TIMEOUT;
+ }
+
+ static Credentials getCredentials(final String username, final String password, final InetAddress address) {
+ int i = username.indexOf("\\"); //$NON-NLS-1$
+ if (i > 0 && i < username.length() - 1 && address != null) {
+ return new NTCredentials(username.substring(i + 1), password, address.getHostName(), username.substring(0,
+ i));
+ } else {
+ return new UsernamePasswordCredentials(username, password);
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static String getHost(String repositoryUrl) {
+ String result = repositoryUrl;
+ int colonSlashSlash = repositoryUrl.indexOf("://"); //$NON-NLS-1$
+
+ if (colonSlashSlash >= 0) {
+ result = repositoryUrl.substring(colonSlashSlash + 3);
+ }
+
+ int colonPort = result.indexOf(':');
+ int requestPath = result.indexOf('/');
+
+ int substringEnd;
+
+ // minimum positive, or string length
+ if (colonPort > 0 && requestPath > 0) {
+ substringEnd = Math.min(colonPort, requestPath);
+ } else if (colonPort > 0) {
+ substringEnd = colonPort;
+ } else if (requestPath > 0) {
+ substringEnd = requestPath;
+ } else {
+ substringEnd = result.length();
+ }
+
+ return result.substring(0, substringEnd);
+ }
+
+ /**
+ * @since 2.2
+ */
+ public static Credentials getHttpClientCredentials(AuthenticationCredentials credentials, String host) {
+ String username = credentials.getUserName();
+ String password = credentials.getPassword();
+ int i = username.indexOf("\\"); //$NON-NLS-1$
+ if (i > 0 && i < username.length() - 1 && host != null) {
+ return new NTCredentials(username.substring(i + 1), password, host, username.substring(0, i));
+ } else {
+ return new UsernamePasswordCredentials(username, password);
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static int getPort(String repositoryUrl) {
+ int colonSlashSlash = repositoryUrl.indexOf("://"); //$NON-NLS-1$
+ int firstSlash = repositoryUrl.indexOf("/", colonSlashSlash + 3); //$NON-NLS-1$
+ int colonPort = repositoryUrl.indexOf(':', colonSlashSlash + 1);
+ if (firstSlash == -1) {
+ firstSlash = repositoryUrl.length();
+ }
+ if (colonPort < 0 || colonPort > firstSlash) {
+ return isRepositoryHttps(repositoryUrl) ? HTTPS_PORT : HTTP_PORT;
+ }
+
+ int requestPath = repositoryUrl.indexOf('/', colonPort + 1);
+ int end = requestPath < 0 ? repositoryUrl.length() : requestPath;
+ String port = repositoryUrl.substring(colonPort + 1, end);
+ if (port.length() == 0) {
+ return isRepositoryHttps(repositoryUrl) ? HTTPS_PORT : HTTP_PORT;
+ }
+
+ return Integer.parseInt(port);
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static String getRequestPath(String repositoryUrl) {
+ int colonSlashSlash = repositoryUrl.indexOf("://"); //$NON-NLS-1$
+ int requestPath = repositoryUrl.indexOf('/', colonSlashSlash + 3);
+
+ if (requestPath < 0) {
+ return ""; //$NON-NLS-1$
+ } else {
+ return repositoryUrl.substring(requestPath);
+ }
+ }
+
+ public static InputStream getResponseBodyAsStream(HttpMethodBase method, IProgressMonitor monitor)
+ throws IOException {
+ monitor = Policy.monitorFor(monitor);
+ return new PollingInputStream(new TimeoutInputStream(method.getResponseBodyAsStream(), BUFFER_SIZE,
+ POLL_INTERVAL, CLOSE_TIMEOUT), POLL_ATTEMPTS, monitor);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static int getSocketTimeout() {
+ return SOCKET_TIMEOUT;
+ }
+
+ /**
+ * Returns the title of a web page.
+ *
+ * @throws IOException
+ * if a network occurs
+ * @return the title; null, if the title could not be determined;
+ * @since 3.0
+ */
+ public static String getTitleFromUrl(AbstractWebLocation location, IProgressMonitor monitor) throws IOException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask("Retrieving " + location.getUrl(), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+
+ HttpClient client = new HttpClient();
+ WebUtil.configureHttpClient(client, ""); //$NON-NLS-1$
+
+ GetMethod method = new GetMethod(location.getUrl());
+ try {
+ HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(client, location, monitor);
+ int result = WebUtil.execute(client, hostConfiguration, method, monitor);
+ if (result == HttpStatus.SC_OK) {
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in,
+ method.getResponseCharSet()));
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
+ try {
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.TITLE) {
+ String text = getText(tokenizer);
+ text = text.replaceAll("\n", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ text = text.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
+ return text.trim();
+ }
+ }
+ }
+ } catch (ParseException e) {
+ throw new IOException("Error reading url"); //$NON-NLS-1$
+ }
+ } finally {
+ in.close();
+ }
+ }
+ } finally {
+ method.releaseConnection();
+ }
+ } finally {
+ monitor.done();
+ }
+ return null;
+ }
+
+ private static String getText(HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ StringBuilder sb = new StringBuilder();
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TEXT) {
+ sb.append(token.toString());
+ } else if (token.getType() == Token.COMMENT) {
+ // ignore
+ } else {
+ break;
+ }
+ }
+ return StringEscapeUtils.unescapeHtml(sb.toString());
+ }
+
+ /**
+ * Returns a user agent string that contains information about the platform and operating system. The
+ * <code>product</code> parameter allows to additional specify custom text that is inserted into the returned
+ * string. The exact return value depends on the environment.
+ * <p>
+ * Examples:
+ * <ul>
+ * <li>Headless: <code>Mylyn MyProduct HttpClient/3.1 Java/1.5.0_13 (Sun) Linux/2.6.22-14-generic (i386)</code>
+ * <li>Eclipse:
+ * <code>Mylyn/2.2.0 Eclipse/3.4.0 (org.eclipse.sdk.ide) HttpClient/3.1 Java/1.5.0_13 (Sun) Linux/2.6.22-14-generic (i386; en_CA)</code>
+ *
+ * @param product
+ * an identifier that is inserted into the returned user agent string
+ * @return a user agent string
+ * @since 2.3
+ */
+ public static String getUserAgent(String product) {
+ if (product != null && product.length() > 0) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(USER_AGENT_PREFIX);
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(product);
+ sb.append(USER_AGENT_POSTFIX);
+ return sb.toString();
+ } else {
+ return USER_AGENT;
+ }
+ }
+
+ public static void init() {
+ // initialization is done in the static initializer
+ }
+
+ /**
+ * Disables logging by default. Set these system properties on launch enables verbose logging of HTTP communication:
+ *
+ * <pre>
+ * -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
+ * -Dorg.apache.commons.logging.simplelog.showlogname=true
+ * -Dorg.apache.commons.logging.simplelog.defaultlog=off
+ * -Dorg.apache.commons.logging.simplelog.log.httpclient.wire=debug
+ * -Dorg.apache.commons.logging.simplelog.log.org.apache.commons.httpclient=off
+ * -Dorg.apache.commons.logging.simplelog.log.org.apache.axis.message=debug
+ * </pre>
+ */
+ private static void initCommonsLoggingSettings() {
+ defaultSystemProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Only sets system property if they are not already set to a value.
+ */
+ private static void defaultSystemProperty(String key, String defaultValue) {
+ if (System.getProperty(key) == null) {
+ System.setProperty(key, defaultValue);
+ }
+ }
+
+ private static boolean isRepositoryHttps(String repositoryUrl) {
+ return repositoryUrl.matches("https.*"); //$NON-NLS-1$
+ }
+
+ private static String stripQualifier(String longVersion) {
+ if (longVersion == null) {
+ return ""; //$NON-NLS-1$
+ }
+
+ String parts[] = longVersion.split("\\."); //$NON-NLS-1$
+ StringBuilder version = new StringBuilder();
+ if (parts.length > 0) {
+ version.append("/"); //$NON-NLS-1$
+ version.append(parts[0]);
+ if (parts.length > 1) {
+ version.append("."); //$NON-NLS-1$
+ version.append(parts[1]);
+ if (parts.length > 2) {
+ version.append("."); //$NON-NLS-1$
+ version.append(parts[2]);
+ }
+ }
+ }
+ return version.toString();
+
+ }
+
+ /**
+ * For standalone applications that want to provide a global proxy service.
+ *
+ * @param proxyService
+ * the proxy service
+ * @since 3.0
+ */
+ public static void setProxyService(IProxyService proxyService) {
+ CommonsNetPlugin.setProxyService(proxyService);
+ }
+
+ /**
+ * @since 3.1
+ */
+ public static IProxyService getProxyService() {
+ return CommonsNetPlugin.getProxyService();
+ }
+
+ /**
+ * @since 3.1
+ */
+ public synchronized static void addConnectionManager(HttpConnectionManager connectionManager) {
+ if (idleConnectionTimeoutThread == null) {
+ idleConnectionTimeoutThread = new IdleConnectionTimeoutThread();
+ idleConnectionTimeoutThread.setTimeoutInterval(CONNECTION_TIMEOUT_INTERVAL);
+ idleConnectionTimeoutThread.setConnectionTimeout(CONNNECT_TIMEOUT);
+ idleConnectionTimeoutThread.start();
+ }
+ idleConnectionTimeoutThread.addConnectionManager(connectionManager);
+ }
+
+ /**
+ * @since 3.1
+ */
+ public synchronized static HttpConnectionManager getConnectionManager() {
+ if (connectionManager == null) {
+ connectionManager = new MultiThreadedHttpConnectionManager();
+ addConnectionManager(connectionManager);
+ }
+ return connectionManager;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public synchronized static void removeConnectionManager(HttpConnectionManager connectionManager) {
+ if (idleConnectionTimeoutThread == null) {
+ return;
+ }
+ idleConnectionTimeoutThread.removeConnectionManager(connectionManager);
+ }
+
+ /**
+ * @since 3.1
+ */
+ @SuppressWarnings("deprecation")
+ public static Proxy getProxy(String host, String proxyType) {
+ Assert.isNotNull(host);
+ Assert.isNotNull(proxyType);
+ IProxyService service = CommonsNetPlugin.getProxyService();
+ if (service != null && service.isProxiesEnabled()) {
+ // TODO e3.5 move to new proxy API
+ IProxyData data = service.getProxyDataForHost(host, proxyType);
+ if (data != null && data.getHost() != null) {
+ String proxyHost = data.getHost();
+ int proxyPort = data.getPort();
+ // change the IProxyData default port to the Java default port
+ if (proxyPort == -1) {
+ proxyPort = 0;
+ }
+
+ AuthenticationCredentials credentials = null;
+ if (data.isRequiresAuthentication()) {
+ credentials = new AuthenticationCredentials(data.getUserId(), data.getPassword());
+ }
+ return createProxy(proxyHost, proxyPort, credentials);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public static Proxy getProxy(String host, Proxy.Type proxyType) {
+ Assert.isNotNull(host);
+ Assert.isNotNull(proxyType);
+ return getProxy(host, getPlatformProxyType(proxyType));
+ }
+
+// private static Type getJavaProxyType(String type) {
+// return (IProxyData.SOCKS_PROXY_TYPE.equals(type)) ? Proxy.Type.SOCKS : Proxy.Type.HTTP;
+// }
+
+ private static String getPlatformProxyType(Type type) {
+ return type == Type.SOCKS ? IProxyData.SOCKS_PROXY_TYPE : IProxyData.HTTP_PROXY_TYPE;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public static Proxy createProxy(String proxyHost, int proxyPort, AuthenticationCredentials credentials) {
+ String proxyUsername = ""; //$NON-NLS-1$
+ String proxyPassword = ""; //$NON-NLS-1$
+ if (credentials != null) {
+ proxyUsername = credentials.getUserName();
+ proxyPassword = credentials.getPassword();
+ }
+ if (proxyHost != null && proxyHost.length() > 0) {
+ InetSocketAddress sockAddr = new InetSocketAddress(proxyHost, proxyPort);
+ boolean authenticated = (proxyUsername != null && proxyPassword != null && proxyUsername.length() > 0 && proxyPassword.length() > 0);
+ if (authenticated) {
+ return new AuthenticatedProxy(Type.HTTP, sockAddr, proxyUsername, proxyPassword);
+ } else {
+ return new Proxy(Type.HTTP, sockAddr);
+ }
+ }
+ return Proxy.NO_PROXY;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/AuthenticatedProxy.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/AuthenticatedProxy.java
new file mode 100644
index 0000000..a3b7d4a
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/AuthenticatedProxy.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.net.Proxy;
+import java.net.SocketAddress;
+
+/**
+ * Abstraction for a proxy that supports user authentication.
+ *
+ * @author Rob Elves
+ * @since 2.0
+ */
+public class AuthenticatedProxy extends Proxy {
+
+ private String userName = ""; //$NON-NLS-1$
+
+ private String password = ""; //$NON-NLS-1$
+
+ public AuthenticatedProxy(Type type, SocketAddress sa, String userName, String password) {
+ super(type, sa);
+ this.userName = userName;
+ this.password = password;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/CloneableHostConfiguration.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/CloneableHostConfiguration.java
new file mode 100644
index 0000000..6f09d75
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/CloneableHostConfiguration.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * John Kristian - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpHost;
+import org.apache.commons.httpclient.protocol.Protocol;
+
+/**
+ * Based on org.apache.commons.httpclient.contrib.ssl.HostConfigurationWithStickyProtocol.
+ *
+ * @author John Kristian
+ * @author Steffen Pingel
+ */
+public class CloneableHostConfiguration extends HostConfiguration {
+
+ public CloneableHostConfiguration() {
+ }
+
+ public CloneableHostConfiguration(CloneableHostConfiguration hostConfiguration) {
+ super(hostConfiguration);
+ }
+
+ @Override
+ public Object clone() {
+ return new CloneableHostConfiguration(this);
+ }
+
+ @Override
+ public synchronized void setHost(String host, int port, String scheme) {
+ setHost(new HttpHost(host, port, getProtocol(host, port, scheme)));
+ }
+
+ /**
+ * Keeps the previous {@link Protocol} if the <code>scheme</code> matches the previous protocol scheme.
+ */
+ private Protocol getProtocol(String host, int port, String scheme) {
+ final Protocol oldProtocol = getProtocol();
+ if (oldProtocol != null) {
+ final String oldScheme = oldProtocol.getScheme();
+ if (oldScheme == scheme || (oldScheme != null && oldScheme.equalsIgnoreCase(scheme))) {
+ return oldProtocol;
+ }
+ }
+ return Protocol.getProtocol(scheme);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/CommonsNetPlugin.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/CommonsNetPlugin.java
new file mode 100644
index 0000000..40affb4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/CommonsNetPlugin.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Michael Valenta - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * Provides an entry point for the proxy service and potentially other web facilities
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public class CommonsNetPlugin extends Plugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.commons.net"; //$NON-NLS-1$
+
+ private static CommonsNetPlugin INSTANCE;
+
+ private static final int MAX_CONCURRENT_REQUESTS = 100;
+
+ private static IProxyService proxyService;
+
+ private static ExecutorService service;
+
+ public static CommonsNetPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ public static synchronized ExecutorService getExecutorService() {
+ if (service == null) {
+ service = new ThreadPoolExecutor(1, MAX_CONCURRENT_REQUESTS, 10L, TimeUnit.SECONDS,
+ new SynchronousQueue<Runnable>());
+ }
+ return service;
+ }
+
+ /**
+ * Return the {@link IProxyService} or <code>null</code> if the service is not available.
+ *
+ * @return the {@link IProxyService} or <code>null</code>
+ */
+ public synchronized static IProxyService getProxyService() {
+ if (proxyService == null) {
+ if (INSTANCE != null && INSTANCE.tracker != null) {
+ return (IProxyService) INSTANCE.tracker.getService();
+ }
+ }
+ return proxyService;
+ }
+
+ public static void log(int error, String message, Throwable e) {
+ if (getDefault() != null) {
+ getDefault().getLog().log(new Status(IStatus.ERROR, ID_PLUGIN, error, message, e));
+ }
+ }
+
+ public synchronized static void setProxyService(IProxyService proxyService) {
+ CommonsNetPlugin.proxyService = proxyService;
+ }
+
+ private ServiceTracker tracker;
+
+ public CommonsNetPlugin() {
+ INSTANCE = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ tracker = new ServiceTracker(getBundle().getBundleContext(), IProxyService.class.getName(), null);
+ tracker.open();
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ tracker.close();
+ tracker = null;
+ if (service != null) {
+ service.shutdown();
+ service = null;
+ }
+ super.stop(context);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/InfiniteSubProgressMonitor.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/InfiniteSubProgressMonitor.java
new file mode 100644
index 0000000..e9b90ad
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/InfiniteSubProgressMonitor.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+
+/**
+ * Provides an infinite progress monitor by subdividing by half repeatedly.
+ *
+ * The ticks parameter represents the number of ticks shown in the progress dialog (or propogated up to a parent
+ * IProgressMonitor). The totalWork parameter provided in actually a hint used to determine how work is translated into
+ * ticks. The number of totalWork that can actually be worked is n*totalWork/2 where 2^n = totalWork. What this means is
+ * that if you provide a totalWork of 32 (2^5) than the maximum number of ticks is 5*32/2 = 80.
+ *
+ */
+public class InfiniteSubProgressMonitor extends SubProgressMonitor {
+
+ int totalWork;
+
+ int halfWay;
+
+ int currentIncrement;
+
+ int nextProgress;
+
+ int worked;
+
+ /**
+ * Constructor for InfiniteSubProgressMonitor.
+ *
+ * @param monitor
+ * @param ticks
+ */
+ public InfiniteSubProgressMonitor(IProgressMonitor monitor, int ticks) {
+ this(monitor, ticks, 0);
+ }
+
+ /**
+ * Constructor for InfiniteSubProgressMonitor.
+ *
+ * @param monitor
+ * @param ticks
+ * @param style
+ */
+ public InfiniteSubProgressMonitor(IProgressMonitor monitor, int ticks, int style) {
+ super(monitor, ticks, style);
+ }
+
+ @Override
+ public void beginTask(String name, int totalWork) {
+ super.beginTask(name, totalWork);
+ this.totalWork = totalWork;
+ this.halfWay = totalWork / 2;
+ this.currentIncrement = 1;
+ this.nextProgress = currentIncrement;
+ this.worked = 0;
+ }
+
+ @Override
+ public void worked(int work) {
+ if (worked >= totalWork) {
+ return;
+ }
+ if (--nextProgress <= 0) {
+ super.worked(1);
+ worked++;
+ if (worked >= halfWay) {
+ // we have passed the current halfway point, so double the
+ // increment and reset the halfway point.
+ currentIncrement *= 2;
+ halfWay += (totalWork - halfWay) / 2;
+ }
+ // reset the progress counter to another full increment
+ nextProgress = currentIncrement;
+ }
+ }
+
+ /**
+ * Don't allow clearing of the subtask. This will stop the flickering of the subtask in the progress dialogs.
+ *
+ * @see IProgressMonitor#subTask(String)
+ */
+ @Override
+ public void subTask(String name) {
+ if (name != null && !name.equals("")) { //$NON-NLS-1$
+ super.subTask(name);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/Messages.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/Messages.java
new file mode 100644
index 0000000..fb07664
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ * IBM - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.commons.net.messages";//$NON-NLS-1$
+
+ public static String PollingInputStream_readTimeout;
+
+ public static String PollingInputStream_closeTimeout;
+
+ public static String PollingOutputStream_writeTimeout;
+
+ public static String PollingOutputStream_closeTimeout;
+
+ public static String TimeoutOutputStream_cannotWriteToStream;
+
+ static {
+ // load message values from bundle file
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingInputStream.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingInputStream.java
new file mode 100644
index 0000000..d1608de
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingInputStream.java
@@ -0,0 +1,258 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.mylyn.commons.net.Policy;
+
+/**
+ * Polls a progress monitor periodically and handles timeouts over extended durations. For this class to be effective, a
+ * high numAttempts should be specified, and the underlying stream should time out frequently on reads (every second or
+ * so).
+ *
+ * Supports resuming partially completed operations after an InterruptedIOException if the underlying stream does. Check
+ * the bytesTransferred field to determine how much of the operation completed; conversely, at what point to resume.
+ */
+public class PollingInputStream extends FilterInputStream {
+ private static final boolean DEBUG = Policy.DEBUG_STREAMS;
+
+ private final int numAttempts;
+
+ private final IProgressMonitor monitor;
+
+ private boolean cancellable;
+
+ /**
+ * Creates a new polling input stream.
+ *
+ * @param in
+ * the underlying input stream
+ * @param numAttempts
+ * the number of attempts before issuing an InterruptedIOException, if 0, retries indefinitely until
+ * canceled
+ * @param monitor
+ * the progress monitor to be polled for cancellation
+ */
+ public PollingInputStream(InputStream in, int numAttempts, IProgressMonitor monitor) {
+ super(in);
+ this.numAttempts = numAttempts;
+ this.monitor = monitor;
+ this.cancellable = true;
+ }
+
+ /**
+ * Wraps the underlying stream's method. It may be important to wait for an input stream to be closed because it
+ * holds an implicit lock on a system resource (such as a file) while it is open. Closing a stream may take time if
+ * the underlying stream is still servicing a previous request.
+ *
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times
+ */
+ @Override
+ public void close() throws InterruptedIOException {
+ int attempts = 0;
+ try {
+ readPendingInput();
+ } catch (IOException e) {
+ // We shouldn't get an exception when we're getting the available input.
+ // If we do, just log it so we can close.
+ CommonsNetPlugin.log(IStatus.ERROR, e.getMessage(), e);
+ } finally {
+ boolean stop = false;
+ while (!stop) {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ stop = true;
+ } catch (InterruptedIOException e) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ if (++attempts == numAttempts) {
+ throw new InterruptedIOException(Messages.PollingInputStream_closeTimeout);
+ }
+ if (DEBUG) {
+ System.out.println("close retry=" + attempts); //$NON-NLS-1$
+ }
+ } catch (IOException e) {
+ // ignore it - see https://bugs.eclipse.org/bugs/show_bug.cgi?id=203423#c10
+ }
+ }
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method.
+ *
+ * @return the next byte of data, or -1 if the end of the stream is reached.
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times and no data was received, bytesTransferred
+ * will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public int read() throws IOException {
+ int attempts = 0;
+ for (;;) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ try {
+ return in.read();
+ } catch (InterruptedIOException e) {
+ if (++attempts == numAttempts) {
+ throw new InterruptedIOException(Messages.PollingInputStream_readTimeout);
+ }
+ if (DEBUG) {
+ System.out.println("read retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method.
+ *
+ * @param buffer
+ * - the buffer into which the data is read.
+ * @param off
+ * - the start offset of the data.
+ * @param len
+ * - the maximum number of bytes read.
+ * @return the total number of bytes read into the buffer, or -1 if there is no more data because the end of the
+ * stream has been reached.
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times and no data was received, bytesTransferred
+ * will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public int read(byte[] buffer, int off, int len) throws IOException {
+ int attempts = 0;
+ for (;;) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ try {
+ return in.read(buffer, off, len);
+ } catch (InterruptedIOException e) {
+ if (e.bytesTransferred != 0) {
+ return e.bytesTransferred; // keep partial transfer
+ }
+ if (++attempts == numAttempts) {
+ throw new InterruptedIOException(Messages.PollingInputStream_readTimeout);
+ }
+ if (DEBUG) {
+ System.out.println("read retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method.
+ *
+ * @param count
+ * - the number of bytes to be skipped.
+ * @return the actual number of bytes skipped.
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times and no data was received, bytesTransferred
+ * will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public long skip(long count) throws IOException {
+ int attempts = 0;
+ for (;;) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ try {
+ return in.skip(count);
+ } catch (InterruptedIOException e) {
+ if (e.bytesTransferred != 0) {
+ return e.bytesTransferred; // keep partial transfer
+ }
+ if (++attempts == numAttempts) {
+ throw new InterruptedIOException(Messages.PollingInputStream_readTimeout);
+ }
+ if (DEBUG) {
+ System.out.println("read retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ /**
+ * Reads any pending input from the input stream so that the stream can savely be closed.
+ */
+ protected void readPendingInput() throws IOException {
+ byte[] buffer = new byte[2048];
+ while (true) {
+ int available = in.available();
+ if (available < 1) {
+ break;
+ }
+ if (available > buffer.length) {
+ available = buffer.length;
+ }
+ if (in.read(buffer, 0, available) < 1) {
+ break;
+ }
+ }
+ }
+
+ /**
+ * Called to set whether cancellation will be checked by this stream. Turning cancellation checking off can be very
+ * useful for protecting critical portions of a protocol that shouldn't be interrupted. For example, it is often
+ * necessary to protect login sequences.
+ *
+ * @param cancellable
+ * a flag controlling whether this stream will check for cancellation.
+ */
+ public void setIsCancellable(boolean cancellable) {
+ this.cancellable = cancellable;
+ }
+
+ /**
+ * Checked whether the monitor for this stream has been cancelled. If the cancellable flag is <code>false</code>
+ * then the monitor is never cancelled.
+ *
+ * @return <code>true</code> if the monitor has been cancelled and <code>false</code> otherwise.
+ */
+ private boolean checkCancellation() {
+ if (cancellable) {
+ return monitor.isCanceled();
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingOutputStream.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingOutputStream.java
new file mode 100644
index 0000000..d152175
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingOutputStream.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.mylyn.commons.net.Policy;
+
+/**
+ * Polls a progress monitor periodically and handles timeouts over extended durations. For this class to be effective, a
+ * high numAttempts should be specified, and the underlying stream should time out frequently on writes (every second or
+ * so).
+ *
+ * Supports resuming partially completed operations after an InterruptedIOException if the underlying stream does. Check
+ * the bytesTransferred field to determine how much of the operation completed; conversely, at what point to resume.
+ */
+public class PollingOutputStream extends FilterOutputStream {
+ private static final boolean DEBUG = Policy.DEBUG_STREAMS;
+
+ private final int numAttempts;
+
+ private final IProgressMonitor monitor;
+
+ private boolean cancellable;
+
+ /**
+ * Creates a new polling output stream.
+ *
+ * @param out
+ * the underlying output stream
+ * @param numAttempts
+ * the number of attempts before issuing an InterruptedIOException, if 0, retries indefinitely until
+ * canceled
+ * @param monitor
+ * the progress monitor to be polled for cancellation
+ */
+ public PollingOutputStream(OutputStream out, int numAttempts, IProgressMonitor monitor) {
+ super(out);
+ this.numAttempts = numAttempts;
+ this.monitor = monitor;
+ this.cancellable = true;
+ }
+
+ /**
+ * Wraps the underlying stream's method.
+ *
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times and no data was sent, bytesTransferred will
+ * be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void write(int b) throws IOException {
+ int attempts = 0;
+ for (;;) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ try {
+ out.write(b);
+ return;
+ } catch (InterruptedIOException e) {
+ if (++attempts == numAttempts) {
+ throw new InterruptedIOException(Messages.PollingOutputStream_writeTimeout);
+ }
+ if (DEBUG) {
+ System.out.println("write retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method.
+ *
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times, bytesTransferred will reflect the number of
+ * bytes sent
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void write(byte[] buffer, int off, int len) throws IOException {
+ int count = 0;
+ int attempts = 0;
+ for (;;) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ try {
+ out.write(buffer, off, len);
+ return;
+ } catch (InterruptedIOException e) {
+ int amount = e.bytesTransferred;
+ if (amount != 0) { // keep partial transfer
+ len -= amount;
+ if (len <= 0) {
+ return;
+ }
+ off += amount;
+ count += amount;
+ attempts = 0; // made some progress, don't time out quite yet
+ }
+ if (++attempts == numAttempts) {
+ e = new InterruptedIOException(Messages.PollingOutputStream_writeTimeout);
+ e.bytesTransferred = count;
+ throw e;
+ }
+ if (DEBUG) {
+ System.out.println("write retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method.
+ *
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times, bytesTransferred will reflect the number of
+ * bytes sent
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void flush() throws IOException {
+ int count = 0;
+ int attempts = 0;
+ for (;;) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ try {
+ out.flush();
+ return;
+ } catch (InterruptedIOException e) {
+ int amount = e.bytesTransferred;
+ if (amount != 0) { // keep partial transfer
+ count += amount;
+ attempts = 0; // made some progress, don't time out quite yet
+ }
+ if (++attempts == numAttempts) {
+ e = new InterruptedIOException(Messages.PollingOutputStream_writeTimeout);
+ e.bytesTransferred = count;
+ throw e;
+ }
+ if (DEBUG) {
+ System.out.println("write retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ /**
+ * Calls flush() then close() on the underlying stream.
+ *
+ * @throws OperationCanceledException
+ * if the progress monitor is canceled
+ * @throws InterruptedIOException
+ * if the underlying operation times out numAttempts times, bytesTransferred will reflect the number of
+ * bytes sent during the flush()
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void close() throws IOException {
+ int attempts = numAttempts - 1; // fail fast if flush() does times out
+ try {
+ out.flush();
+ attempts = 0;
+ } finally {
+ boolean stop = false;
+ while (!stop) {
+ try {
+ out.close();
+ stop = true;
+ } catch (InterruptedIOException e) {
+ if (checkCancellation()) {
+ throw new OperationCanceledException();
+ }
+ if (++attempts == numAttempts) {
+ throw new InterruptedIOException(Messages.PollingOutputStream_closeTimeout);
+ }
+ if (DEBUG) {
+ System.out.println("close retry=" + attempts); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Called to set whether cancellation will be checked by this stream. Turning cancellation checking off can be very
+ * useful for protecting critical portions of a protocol that shouldn't be interrupted. For example, it is often
+ * necessary to protect login sequences.
+ *
+ * @param cancellable
+ * a flag controlling whether this stream will check for cancellation.
+ */
+ public void setIsCancellable(boolean cancellable) {
+ this.cancellable = cancellable;
+ }
+
+ /**
+ * Checked whether the monitor for this stream has been cancelled. If the cancellable flag is <code>false</code>
+ * then the monitor is never cancelled.
+ *
+ * @return <code>true</code> if the monitor has been cancelled and <code>false</code> otherwise.
+ */
+ private boolean checkCancellation() {
+ if (cancellable) {
+ return monitor.isCanceled();
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingProtocolSocketFactory.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingProtocolSocketFactory.java
new file mode 100644
index 0000000..666aeb2
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingProtocolSocketFactory.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import javax.net.SocketFactory;
+
+import org.apache.commons.httpclient.ConnectTimeoutException;
+import org.apache.commons.httpclient.params.HttpConnectionParams;
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.commons.net.WebUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class PollingProtocolSocketFactory implements ProtocolSocketFactory {
+
+ private final static SocketFactory factory = SocketFactory.getDefault();
+
+ private final IProgressMonitor monitor;
+
+ public PollingProtocolSocketFactory(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+ public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
+ return factory.createSocket(host, port);
+ }
+
+ public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException,
+ UnknownHostException {
+ return factory.createSocket(host, port, localAddress, localPort);
+ }
+
+ public Socket createSocket(String host, int port, InetAddress localAddress, int localPort,
+ HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
+ if (params == null) {
+ throw new IllegalArgumentException("Parameters may not be null"); //$NON-NLS-1$
+ }
+
+ int timeout = params.getConnectionTimeout();
+ Socket socket = factory.createSocket();
+ socket.bind(new InetSocketAddress(localAddress, localPort));
+ // FIME convert OperationCanceledException?
+ WebUtil.connect(socket, new InetSocketAddress(host, port), timeout, monitor);
+ return socket;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingSslProtocolSocketFactory.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingSslProtocolSocketFactory.java
new file mode 100644
index 0000000..cc63287
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/PollingSslProtocolSocketFactory.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import org.apache.commons.httpclient.ConnectTimeoutException;
+import org.apache.commons.httpclient.params.HttpConnectionParams;
+import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.commons.net.WebUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class PollingSslProtocolSocketFactory implements SecureProtocolSocketFactory {
+
+ private final IProgressMonitor monitor;
+
+ private final SslProtocolSocketFactory factory;
+
+ public PollingSslProtocolSocketFactory(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ this.factory = SslProtocolSocketFactory.getInstance();
+ }
+
+ public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
+ UnknownHostException {
+ return factory.createSocket(socket, host, port, autoClose);
+ }
+
+ public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
+ return factory.createSocket(host, port);
+ }
+
+ public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException,
+ UnknownHostException {
+ return factory.createSocket(host, port, localAddress, localPort);
+ }
+
+ public Socket createSocket(String host, int port, InetAddress localAddress, int localPort,
+ HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
+ if (params == null) {
+ throw new IllegalArgumentException("Parameters may not be null"); //$NON-NLS-1$
+ }
+
+ int timeout = params.getConnectionTimeout();
+ Socket socket = factory.getSocketFactory().createSocket();
+ socket.bind(new InetSocketAddress(localAddress, localPort));
+ WebUtil.connect(socket, new InetSocketAddress(host, port), timeout, monitor);
+ return socket;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/ProgressMonitorInputStream.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/ProgressMonitorInputStream.java
new file mode 100644
index 0000000..b672e64
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/ProgressMonitorInputStream.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Updates a progress monitor as bytes are read from the input stream. Also starts a background thread to provide
+ * responsive cancellation on read().
+ *
+ * Supports resuming partially completed operations after an InterruptedIOException if the underlying stream does. Check
+ * the bytesTransferred field to determine how much of the operation completed; conversely, at what point to resume.
+ */
+public abstract class ProgressMonitorInputStream extends FilterInputStream {
+ private final IProgressMonitor monitor;
+
+ private final int updateIncrement;
+
+ private final long bytesTotal;
+
+ private long bytesRead = 0;
+
+ private long lastUpdate = -1;
+
+ private long nextUpdate = 0;
+
+ /**
+ * Creates a progress monitoring input stream.
+ *
+ * @param in
+ * the underlying input stream
+ * @param bytesTotal
+ * the number of bytes to read in total (passed to updateMonitor())
+ * @param updateIncrement
+ * the number of bytes read between updates
+ * @param monitor
+ * the progress monitor
+ */
+ public ProgressMonitorInputStream(InputStream in, long bytesTotal, int updateIncrement, IProgressMonitor monitor) {
+ super(in);
+ this.bytesTotal = bytesTotal;
+ this.updateIncrement = updateIncrement;
+ this.monitor = monitor;
+ update(true);
+ }
+
+ protected abstract void updateMonitor(long bytesRead, long size, IProgressMonitor monitor);
+
+ /**
+ * Wraps the underlying stream's method. Updates the progress monitor to the final number of bytes read.
+ *
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void close() throws IOException {
+ try {
+ in.close();
+ } finally {
+ update(true);
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method. Updates the progress monitor if the next update increment has been reached.
+ *
+ * @throws InterruptedIOException
+ * if the operation was interrupted before all of the bytes specified have been skipped,
+ * bytesTransferred will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public int read() throws IOException {
+ int b = in.read();
+ if (b != -1) {
+ bytesRead += 1;
+ update(false);
+ }
+ return b;
+ }
+
+ /**
+ * Wraps the underlying stream's method. Updates the progress monitor if the next update increment has been reached.
+ *
+ * @throws InterruptedIOException
+ * if the operation was interrupted before all of the bytes specified have been skipped,
+ * bytesTransferred may be non-zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public int read(byte[] buffer, int offset, int length) throws IOException {
+ try {
+ int count = in.read(buffer, offset, length);
+ if (count != -1) {
+ bytesRead += count;
+ update(false);
+ }
+ return count;
+ } catch (InterruptedIOException e) {
+ bytesRead += e.bytesTransferred;
+ update(false);
+ throw e;
+ }
+ }
+
+ /**
+ * Wraps the underlying stream's method. Updates the progress monitor if the next update increment has been reached.
+ *
+ * @throws InterruptedIOException
+ * if the operation was interrupted before all of the bytes specified have been skipped,
+ * bytesTransferred may be non-zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public long skip(long amount) throws IOException {
+ try {
+ long count = in.skip(amount);
+ bytesRead += count;
+ update(false);
+ return count;
+ } catch (InterruptedIOException e) {
+ bytesRead += e.bytesTransferred;
+ update(false);
+ throw e;
+ }
+ }
+
+ /**
+ * Mark is not supported by the wrapper even if the underlying stream does, returns false.
+ */
+ @Override
+ public boolean markSupported() {
+ return false;
+ }
+
+ private void update(boolean now) {
+ if (bytesRead >= nextUpdate || now) {
+ nextUpdate = bytesRead - (bytesRead % updateIncrement);
+ if (nextUpdate != lastUpdate) {
+ updateMonitor(nextUpdate, bytesTotal, monitor);
+ }
+ lastUpdate = nextUpdate;
+ nextUpdate += updateIncrement;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/SslProtocolSocketFactory.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/SslProtocolSocketFactory.java
new file mode 100644
index 0000000..8052e3e
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/SslProtocolSocketFactory.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.net;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.security.KeyStore;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+
+import org.apache.commons.httpclient.ConnectTimeoutException;
+import org.apache.commons.httpclient.params.HttpConnectionParams;
+import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
+
+/**
+ * Provides support for managing SSL connections.
+ *
+ * @author Nathan Hapke
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+// TODO merge with PollingSslProtocolSocketFactory
+public class SslProtocolSocketFactory implements SecureProtocolSocketFactory {
+
+ private static final String KEY_STORE = "javax.net.ssl.keyStore"; //$NON-NLS-1$
+
+ private static final String KEY_STORE_TYPE = "javax.net.ssl.keyStoreType"; //$NON-NLS-1$
+
+ private static final String KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword"; //$NON-NLS-1$
+
+ static SslProtocolSocketFactory factory = new SslProtocolSocketFactory();
+
+ public static SslProtocolSocketFactory getInstance() {
+ return factory;
+ }
+
+ private SSLSocketFactory socketFactory;
+
+ private final boolean hasKeyManager;
+
+ private SslProtocolSocketFactory() {
+ KeyManager[] keymanagers = null;
+ if (System.getProperty(KEY_STORE) != null && System.getProperty(KEY_STORE_PASSWORD) != null) {
+ try {
+ String type = System.getProperty(KEY_STORE_TYPE, KeyStore.getDefaultType());
+ KeyStore keyStore = KeyStore.getInstance(type);
+ char[] password = System.getProperty(KEY_STORE_PASSWORD).toCharArray();
+ keyStore.load(new FileInputStream(System.getProperty(KEY_STORE)), password);
+ KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+ keyManagerFactory.init(keyStore, password);
+ keymanagers = keyManagerFactory.getKeyManagers();
+ } catch (Exception e) {
+ CommonsNetPlugin.log(0, "Could not initialize keystore", e); //$NON-NLS-1$
+ }
+ }
+
+ hasKeyManager = keymanagers != null;
+
+ try {
+ SSLContext sslContext = SSLContext.getInstance("SSL"); //$NON-NLS-1$
+ sslContext.init(keymanagers, new TrustManager[] { new TrustAllTrustManager() }, null);
+ this.socketFactory = sslContext.getSocketFactory();
+ } catch (Exception e) {
+ CommonsNetPlugin.log(0, "Could not initialize SSL context", e); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.3
+ */
+ public SSLSocketFactory getSocketFactory() throws IOException {
+ if (socketFactory == null) {
+ throw new IOException("Could not initialize SSL context"); //$NON-NLS-1$
+ }
+ return socketFactory;
+ }
+
+ public Socket createSocket(String remoteHost, int remotePort) throws IOException, UnknownHostException {
+ return getSocketFactory().createSocket(remoteHost, remotePort);
+ }
+
+ public Socket createSocket(String remoteHost, int remotePort, InetAddress clientHost, int clientPort)
+ throws IOException, UnknownHostException {
+ return getSocketFactory().createSocket(remoteHost, remotePort, clientHost, clientPort);
+ }
+
+ public Socket createSocket(String remoteHost, int remotePort, InetAddress clientHost, int clientPort,
+ HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
+ if (params == null) {
+ throw new IllegalArgumentException("Parameters may not be null"); //$NON-NLS-1$
+ }
+
+ int timeout = params.getConnectionTimeout();
+ if (timeout == 0) {
+ return getSocketFactory().createSocket(remoteHost, remotePort, clientHost, clientPort);
+ } else {
+ Socket socket = getSocketFactory().createSocket();
+ socket.bind(new InetSocketAddress(clientHost, clientPort));
+ socket.connect(new InetSocketAddress(remoteHost, remotePort), timeout);
+ return socket;
+ }
+ }
+
+ public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
+ UnknownHostException {
+ return getSocketFactory().createSocket(socket, host, port, autoClose);
+ }
+
+ public boolean hasKeyManager() {
+ return hasKeyManager;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TimeoutInputStream.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TimeoutInputStream.java
new file mode 100644
index 0000000..6e89275
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TimeoutInputStream.java
@@ -0,0 +1,390 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.commons.net;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.mylyn.commons.net.Policy;
+
+/**
+ * Wraps an input stream that blocks indefinitely to simulate timeouts on read(), skip(), and close(). The resulting
+ * input stream is buffered and supports retrying operations that failed due to an InterruptedIOException.
+ *
+ * Supports resuming partially completed operations after an InterruptedIOException REGARDLESS of whether the underlying
+ * stream does unless the underlying stream itself generates InterruptedIOExceptions in which case it must also support
+ * resuming. Check the bytesTransferred field to determine how much of the operation completed; conversely, at what
+ * point to resume.
+ */
+public class TimeoutInputStream extends FilterInputStream {
+ // unsynchronized variables
+ private final long readTimeout; // read() timeout in millis
+
+ private final long closeTimeout; // close() timeout in millis, or -1
+
+ // requests for the thread (synchronized)
+ private boolean closeRequested = false; // if true, close requested
+
+ // responses from the thread (synchronized)
+ private final Future<?> future;
+
+ private byte[] iobuffer; // circular buffer
+
+ private int head = 0; // points to first unread byte
+
+ private int length = 0; // number of remaining unread bytes
+
+ private IOException ioe = null; // if non-null, contains a pending exception
+
+ private boolean waitingForClose = false; // if true, thread is waiting for close()
+
+ private boolean growWhenFull = false; // if true, buffer will grow when it is full
+
+ private final CountDownLatch closeLatch = new CountDownLatch(1); // if 0, runThread() has finished
+
+ /**
+ * Creates a timeout wrapper for an input stream.
+ *
+ * @param in
+ * the underlying input stream
+ * @param bufferSize
+ * the buffer size in bytes; should be large enough to mitigate Thread synchronization and context
+ * switching overhead
+ * @param readTimeout
+ * the number of milliseconds to block for a read() or skip() before throwing an InterruptedIOException;
+ * 0 blocks indefinitely
+ * @param closeTimeout
+ * the number of milliseconds to block for a close() before throwing an InterruptedIOException; 0 blocks
+ * indefinitely, -1 closes the stream in the background
+ */
+ public TimeoutInputStream(InputStream in, int bufferSize, long readTimeout, long closeTimeout) {
+ super(in);
+ this.readTimeout = readTimeout;
+ this.closeTimeout = closeTimeout;
+ this.iobuffer = new byte[bufferSize];
+ this.future = CommonsNetPlugin.getExecutorService().submit(new Runnable() {
+ public void run() {
+ runThread();
+ }
+ });
+ }
+
+ public TimeoutInputStream(InputStream in, int bufferSize, long readTimeout, long closeTimeout, boolean growWhenFull) {
+ this(in, bufferSize, readTimeout, closeTimeout);
+ this.growWhenFull = growWhenFull;
+ }
+
+ /**
+ * Wraps the underlying stream's method. It may be important to wait for a stream to actually be closed because it
+ * holds an implicit lock on a system resoure (such as a file) while it is open. Closing a stream may take time if
+ * the underlying stream is still servicing a previous request.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void close() throws IOException {
+ if (closeLatch.getCount() == 0) {
+ return;
+ }
+ synchronized (this) {
+ closeRequested = true;
+ future.cancel(true);
+ checkError();
+ }
+ if (closeTimeout == -1) {
+ return;
+ }
+ boolean closed = false;
+ try {
+ closed = closeLatch.await(closeTimeout, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt(); // we weren't expecting to be interrupted
+ }
+ synchronized (this) {
+ checkError();
+ if (!closed) {
+ throw new InterruptedIOException();
+ }
+ }
+ }
+
+ /**
+ * Returns the number of unread bytes in the buffer.
+ *
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized int available() throws IOException {
+ if (length == 0) {
+ checkError();
+ }
+ return length > 0 ? length : 0;
+ }
+
+ /**
+ * Reads a byte from the stream.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired and no data was received, bytesTransferred will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized int read() throws IOException {
+ if (!syncFill()) {
+ return -1; // EOF reached
+ }
+ int b = iobuffer[head++] & 255;
+ if (head == iobuffer.length) {
+ head = 0;
+ }
+ length--;
+ notify();
+ return b;
+ }
+
+ /**
+ * Reads multiple bytes from the stream.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired and no data was received, bytesTransferred will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized int read(byte[] buffer, int off, int len) throws IOException {
+ if (!syncFill()) {
+ return -1; // EOF reached
+ }
+ int pos = off;
+ if (len > length) {
+ len = length;
+ }
+ while (len-- > 0) {
+ buffer[pos++] = iobuffer[head++];
+ if (head == iobuffer.length) {
+ head = 0;
+ }
+ length--;
+ }
+ notify();
+ return pos - off;
+ }
+
+ /**
+ * Skips multiple bytes in the stream.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired before all of the bytes specified have been skipped, bytesTransferred may be
+ * non-zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized long skip(long count) throws IOException {
+ long amount = 0;
+ try {
+ do {
+ if (!syncFill()) {
+ break; // EOF reached
+ }
+ int skip = (int) Math.min(count - amount, length);
+ head = (head + skip) % iobuffer.length;
+ length -= skip;
+ amount += skip;
+ } while (amount < count);
+ } catch (InterruptedIOException e) {
+ e.bytesTransferred = (int) amount; // assumes amount < Integer.MAX_INT
+ throw e;
+ }
+ notify();
+ return amount;
+ }
+
+ /**
+ * Mark is not supported by the wrapper even if the underlying stream does, returns false.
+ */
+ @Override
+ public boolean markSupported() {
+ return false;
+ }
+
+ /**
+ * Waits for the buffer to fill if it is empty and the stream has not reached EOF.
+ *
+ * @return true if bytes are available, false if EOF has been reached
+ * @throws InterruptedIOException
+ * if EOF not reached but no bytes are available
+ */
+ private boolean syncFill() throws IOException {
+ if (length != 0) {
+ return true;
+ }
+ checkError(); // check errors only after we have read all remaining bytes
+ if (waitingForClose) {
+ return false;
+ }
+ notify();
+ try {
+ wait(readTimeout);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt(); // we weren't expecting to be interrupted
+ }
+ if (length != 0) {
+ return true;
+ }
+ checkError(); // check errors only after we have read all remaining bytes
+ if (waitingForClose) {
+ return false;
+ }
+ throw new InterruptedIOException();
+ }
+
+ /**
+ * If an exception is pending, throws it.
+ */
+ private void checkError() throws IOException {
+ if (ioe != null) {
+ IOException e = ioe;
+ ioe = null;
+ throw e;
+ }
+ }
+
+ /**
+ * Runs the thread in the background.
+ */
+ private void runThread() {
+ try {
+ readUntilDone();
+ } catch (IOException e) {
+ synchronized (this) {
+ ioe = e;
+ }
+ } finally {
+ waitUntilClosed();
+ try {
+ in.close();
+ } catch (IOException e) {
+ synchronized (this) {
+ ioe = e;
+ }
+ } finally {
+ closeLatch.countDown();
+ }
+ }
+ }
+
+ /**
+ * Waits until we have been requested to close the stream.
+ */
+ private synchronized void waitUntilClosed() {
+ waitingForClose = true;
+ notify();
+ while (!closeRequested) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ closeRequested = true; // alternate quit signal
+ }
+ }
+ }
+
+ /**
+ * Reads bytes into the buffer until EOF, closed, or error.
+ */
+ private void readUntilDone() throws IOException {
+ for (;;) {
+ int off, len;
+ synchronized (this) {
+ while (isBufferFull()) {
+ if (closeRequested) {
+ return; // quit signal
+ }
+ waitForRead();
+ }
+ off = (head + length) % iobuffer.length;
+ len = ((head > off) ? head : iobuffer.length) - off;
+ }
+ int count;
+ try {
+ // the i/o operation might block without releasing the lock,
+ // so we do this outside of the synchronized block
+ count = in.read(iobuffer, off, len);
+ if (count == -1) {
+ return; // EOF encountered
+ }
+ } catch (InterruptedIOException e) {
+ count = e.bytesTransferred; // keep partial transfer
+ }
+ synchronized (this) {
+ length += count;
+ notify();
+ }
+ }
+ }
+
+ /*
+ * Wait for a read when the buffer is full (with the implication
+ * that space will become available in the buffer after the read
+ * takes place).
+ */
+ private synchronized void waitForRead() {
+ try {
+ if (growWhenFull) {
+ // wait a second before growing to let reads catch up
+ wait(readTimeout);
+ } else {
+ wait();
+ }
+ } catch (InterruptedException e) {
+ closeRequested = true; // alternate quit signal
+ }
+ // If the buffer is still full, give it a chance to grow
+ if (growWhenFull && isBufferFull()) {
+ growBuffer();
+ }
+ }
+
+ private synchronized void growBuffer() {
+ int newSize = 2 * iobuffer.length;
+ if (newSize > iobuffer.length) {
+ if (Policy.DEBUG_STREAMS) {
+ System.out.println("InputStream growing to " + newSize + " bytes"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ byte[] newBuffer = new byte[newSize];
+ int pos = 0;
+ int len = length;
+ while (len-- > 0) {
+ newBuffer[pos++] = iobuffer[head++];
+ if (head == iobuffer.length) {
+ head = 0;
+ }
+ }
+ iobuffer = newBuffer;
+ head = 0;
+ // length instance variable was not changed by this method
+ }
+ }
+
+ private boolean isBufferFull() {
+ return length == iobuffer.length;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TimeoutOutputStream.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TimeoutOutputStream.java
new file mode 100644
index 0000000..e1aa31c
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TimeoutOutputStream.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.commons.net;
+
+import java.io.BufferedOutputStream;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+
+
+/**
+ * Wraps an output stream that blocks indefinitely to simulate timeouts on write(), flush(), and close(). The resulting
+ * output stream is buffered and supports retrying operations that failed due to an InterruptedIOException.
+ *
+ * Supports resuming partially completed operations after an InterruptedIOException REGARDLESS of whether the underlying
+ * stream does unless the underlying stream itself generates InterruptedIOExceptions in which case it must also support
+ * resuming. Check the bytesTransferred field to determine how much of the operation completed; conversely, at what
+ * point to resume.
+ */
+public class TimeoutOutputStream extends FilterOutputStream {
+ // unsynchronized variables
+ private final long writeTimeout; // write() timeout in millis
+
+ private final long closeTimeout; // close() timeout in millis, or -1
+
+ // requests for the thread (synchronized)
+ private final byte[] iobuffer; // circular buffer
+
+ private int head = 0; // points to first unwritten byte
+
+ private int length = 0; // number of remaining unwritten bytes
+
+ private boolean closeRequested = false; // if true, close requested
+
+ private boolean flushRequested = false; // if true, flush requested
+
+ // responses from the thread (synchronized)
+ private Thread thread;
+
+ private boolean waitingForClose = false; // if true, the thread is waiting for close()
+
+ private IOException ioe = null;
+
+ /**
+ * Creates a timeout wrapper for an output stream.
+ *
+ * @param out
+ * the underlying input stream
+ * @param bufferSize
+ * the buffer size in bytes; should be large enough to mitigate Thread synchronization and context
+ * switching overhead
+ * @param writeTimeout
+ * the number of milliseconds to block for a write() or flush() before throwing an
+ * InterruptedIOException; 0 blocks indefinitely
+ * @param closeTimeout
+ * the number of milliseconds to block for a close() before throwing an InterruptedIOException; 0 blocks
+ * indefinitely, -1 closes the stream in the background
+ */
+ public TimeoutOutputStream(OutputStream out, int bufferSize, long writeTimeout, long closeTimeout) {
+ super(new BufferedOutputStream(out, bufferSize));
+ this.writeTimeout = writeTimeout;
+ this.closeTimeout = closeTimeout;
+ this.iobuffer = new byte[bufferSize];
+ thread = new Thread(new Runnable() {
+ public void run() {
+ runThread();
+ }
+ }, "TimeoutOutputStream");//$NON-NLS-1$
+ thread.setDaemon(true);
+ thread.start();
+ }
+
+ /**
+ * Wraps the underlying stream's method. It may be important to wait for a stream to actually be closed because it
+ * holds an implicit lock on a system resoure (such as a file) while it is open. Closing a stream may take time if
+ * the underlying stream is still servicing a previous request.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired, bytesTransferred will reflect the number of bytes flushed from the buffer
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public void close() throws IOException {
+ Thread oldThread;
+ synchronized (this) {
+ if (thread == null) {
+ return;
+ }
+ oldThread = thread;
+ closeRequested = true;
+ thread.interrupt();
+ checkError();
+ }
+ if (closeTimeout == -1) {
+ return;
+ }
+ try {
+ oldThread.join(closeTimeout);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt(); // we weren't expecting to be interrupted
+ }
+ synchronized (this) {
+ checkError();
+ if (thread != null) {
+ throw new InterruptedIOException();
+ }
+ }
+ }
+
+ /**
+ * Writes a byte to the stream.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired and no data was sent, bytesTransferred will be zero
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized void write(int b) throws IOException {
+ syncCommit(true);
+ iobuffer[(head + length) % iobuffer.length] = (byte) b;
+ length++;
+ notify();
+ }
+
+ /**
+ * Writes multiple bytes to the stream.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired, bytesTransferred will reflect the number of bytes sent
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized void write(byte[] buffer, int off, int len) throws IOException {
+ int amount = 0;
+ try {
+ do {
+ syncCommit(true);
+ while (amount < len && length != iobuffer.length) {
+ iobuffer[(head + length) % iobuffer.length] = buffer[off++];
+ length++;
+ amount++;
+ }
+ } while (amount < len);
+ } catch (InterruptedIOException e) {
+ e.bytesTransferred = amount;
+ throw e;
+ }
+ notify();
+ }
+
+ /**
+ * Flushes the stream.
+ *
+ * @throws InterruptedIOException
+ * if the timeout expired, bytesTransferred will reflect the number of bytes flushed from the buffer
+ * @throws IOException
+ * if an i/o error occurs
+ */
+ @Override
+ public synchronized void flush() throws IOException {
+ int oldLength = length;
+ flushRequested = true;
+ try {
+ syncCommit(false);
+ } catch (InterruptedIOException e) {
+ e.bytesTransferred = oldLength - length;
+ throw e;
+ }
+ notify();
+ }
+
+ /**
+ * Waits for the buffer to drain if it is full.
+ *
+ * @param partial
+ * if true, waits until the buffer is partially empty, else drains it entirely
+ * @throws InterruptedIOException
+ * if the buffer could not be drained as requested
+ */
+ private void syncCommit(boolean partial) throws IOException {
+ checkError(); // check errors before allowing the addition of new bytes
+ if (partial && length != iobuffer.length || length == 0) {
+ return;
+ }
+ if (waitingForClose) {
+ throw new IOException(Messages.TimeoutOutputStream_cannotWriteToStream);
+ }
+ notify();
+ try {
+ wait(writeTimeout);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt(); // we weren't expecting to be interrupted
+ }
+ checkError(); // check errors before allowing the addition of new bytes
+ if (partial && length != iobuffer.length || length == 0) {
+ return;
+ }
+ throw new InterruptedIOException();
+ }
+
+ /**
+ * If an exception is pending, throws it.
+ */
+ private void checkError() throws IOException {
+ if (ioe != null) {
+ IOException e = ioe;
+ ioe = null;
+ throw e;
+ }
+ }
+
+ /**
+ * Runs the thread in the background.
+ */
+ private void runThread() {
+ try {
+ writeUntilDone();
+ } catch (IOException e) {
+ synchronized (this) {
+ ioe = e;
+ }
+ } finally {
+ waitUntilClosed();
+ try {
+ out.close();
+ } catch (IOException e) {
+ synchronized (this) {
+ ioe = e;
+ }
+ } finally {
+ synchronized (this) {
+ thread = null;
+ notify();
+ }
+ }
+ }
+ }
+
+ /**
+ * Waits until we have been requested to close the stream.
+ */
+ private synchronized void waitUntilClosed() {
+ waitingForClose = true;
+ notify();
+ while (!closeRequested) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ closeRequested = true; // alternate quit signal
+ }
+ }
+ }
+
+ /**
+ * Writes bytes from the buffer until closed and buffer is empty
+ */
+ private void writeUntilDone() throws IOException {
+ int bytesUntilFlush = -1; // if > 0, then we will flush after that many bytes have been written
+ for (;;) {
+ int off, len;
+ synchronized (this) {
+ for (;;) {
+ if (closeRequested && length == 0) {
+ return; // quit signal
+ }
+ if (length != 0 || flushRequested) {
+ break;
+ }
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ closeRequested = true; // alternate quit signal
+ }
+ }
+ off = head;
+ len = iobuffer.length - head;
+ if (len > length) {
+ len = length;
+ }
+ if (flushRequested && bytesUntilFlush < 0) {
+ flushRequested = false;
+ bytesUntilFlush = length;
+ }
+ }
+
+ // If there are bytes to be written, write them
+ if (len != 0) {
+ // write out all remaining bytes from the buffer before flushing
+ try {
+ // the i/o operation might block without releasing the lock,
+ // so we do this outside of the synchronized block
+ out.write(iobuffer, off, len);
+ } catch (InterruptedIOException e) {
+ len = e.bytesTransferred;
+ }
+ }
+
+ // If there was a pending flush, do it
+ if (bytesUntilFlush >= 0) {
+ bytesUntilFlush -= len;
+ if (bytesUntilFlush <= 0) {
+ // flush the buffer now
+ try {
+ out.flush();
+ } catch (InterruptedIOException e) {
+ }
+ bytesUntilFlush = -1; // might have been 0
+ }
+ }
+
+ // If bytes were written, update the circular buffer
+ if (len != 0) {
+ synchronized (this) {
+ head = (head + len) % iobuffer.length;
+ length -= len;
+ notify();
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TrustAllTrustManager.java b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TrustAllTrustManager.java
new file mode 100644
index 0000000..31f855b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/TrustAllTrustManager.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.net;
+
+import javax.net.ssl.X509TrustManager;
+
+/**
+ * TrustAll class implements X509TrustManager to access all https servers with signed and unsigned certificates.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public class TrustAllTrustManager implements X509TrustManager {
+
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
+ // don't need to do any checks
+ }
+
+ public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
+ // don't need to do any checks
+ }
+}
diff --git a/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/messages.properties b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/messages.properties
new file mode 100644
index 0000000..8943ed9
--- /dev/null
+++ b/org.eclipse.mylyn.commons.net/src/org/eclipse/mylyn/internal/commons/net/messages.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2000, 2006 IBM Corporation 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:
+# IBM Corporation - initial API and implementation
+###############################################################################
+
+PollingInputStream_readTimeout=Timeout while reading from input stream
+PollingInputStream_closeTimeout=Timeout while closing input stream
+PollingOutputStream_writeTimeout=Timeout while writing to output stream
+PollingOutputStream_closeTimeout=Timeout while closing output stream
+TimeoutOutputStream_cannotWriteToStream=Cannot write to output stream
+
+Util_processTimeout=A timeout occurred executing command ''{0}''
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.classpath b/org.eclipse.mylyn.commons.ui/.classpath
new file mode 100644
index 0000000..e756522
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/forms/widgets/FormUtil"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/browser/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.commons.ui/.project b/org.eclipse.mylyn.commons.ui/.project
new file mode 100644
index 0000000..e5f0da4
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.commons.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..ca2dadd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original element: 'org.eclipse.mylyn.internal.commons.ui.TreeWalker.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.util" element1="/src<org.eclipse.mylyn.internal.commons.ui{TreeWalker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1223001466659" units="1" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.initializeBounds().initialHeight' in 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.initializeBounds()'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.initializeBounds().initialHeight'" description="Inline local variable 'initialHeight'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{AbstractNotificationPopup.java" selection="13684 29" stamp="1223004162351" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.initializeBounds().initialWidth' in 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.initializeBounds()'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.initializeBounds().initialWidth'" description="Inline local variable 'initialWidth'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{AbstractNotificationPopup.java" selection="13684 28" stamp="1223004165752" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..9157a44
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1,3 @@
+1223001466659 Move compilation unit
+1223004162351 Inline local variable 'initialHeight'
+1223004165752 Inline local variable 'initialWidth'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/11/46/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/11/46/refactorings.history
new file mode 100644
index 0000000..28f2daa
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.commons.ui.SwtUtil.collectItems(...)' to 'collectItemData'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.commons.ui.SwtUtil.collectItems(...)'
- Renamed element: 'org.eclipse.mylyn.internal.commons.ui.SwtUtil.collectItemData(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'collectItems'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.commons.ui{SwtUtil.java[SwtUtil~collectItems~\[QTreeItem;~QSet\<QObject;>;" name="collectItemData" references="true" stamp="1226206473551" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/11/46/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/11/46/refactorings.index
new file mode 100644
index 0000000..fe6d206
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/11/46/refactorings.index
@@ -0,0 +1 @@
+1226206473551 Rename method 'collectItems'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..67bcafa
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: '2008'" description="Delete element" element1=".refactorings/2008" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1209511683958" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: '.api_filters'" description="Delete element" element1=".settings/.api_filters" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1209511743212" subPackages="false" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.internal.workbench.ui' to 'org.eclipse.mylyn.internal.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Renamed element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.commons.ui'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.workbench.ui'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.workbench.ui" name="org.eclipse.mylyn.internal.commons.ui" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1209515618596" textual="false" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.provisional.workbench.ui' to 'org.eclipse.mylyn.internal.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Renamed element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.workbench.ui'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.provisional.workbench.ui'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.provisional.workbench.ui" name="org.eclipse.mylyn.internal.provisional.workbench.ui" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1209515801600" textual="false" version="1.0"/>
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.workbench.ui'
- Original elements:
 org.eclipse.mylyn.provisional.workbench.ui.notifications.AbstractNotificationPopup.java
 org.eclipse.mylyn.provisional.workbench.ui.notifications.NotificationPopupColors.java
 org.eclipse.mylyn.provisional.workbench.ui.notifications.AbstractNotification.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.provisional.workbench.ui.notifications{AbstractNotificationPopup.java" element2="/src<org.eclipse.mylyn.provisional.workbench.ui.notifications{NotificationPopupColors.java" element3="/src<org.eclipse.mylyn.provisional.workbench.ui.notifications{AbstractNotification.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209515837956" units="3" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.workbench.ui.NotificationPopupColors.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.commons.ui" element1="/src<org.eclipse.mylyn.internal.provisional.workbench.ui{NotificationPopupColors.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209515847736" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.provisional.workbench.ui.notifications'" description="Delete element" element1="/src<org.eclipse.mylyn.provisional.workbench.ui.notifications" element2="/src<org.eclipse.mylyn.provisional.workbench.ui" element3="/src<org.eclipse.mylyn.provisional.workbench" element4="/src<org.eclipse.mylyn.provisional" elements="4" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209515852219" subPackages="false" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.internal.provisional.workbench.ui' to 'org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.workbench.ui'
- Renamed element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.provisional.workbench.ui'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.provisional.workbench.ui" name="org.eclipse.mylyn.internal.provisional.commons.ui" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1209516185596" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts.BOLD' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts.BOLD'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts'" delegate="false" deprecate="true" description="Move member 'BOLD'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColorsAndFonts.java[CommonColorsAndFonts^BOLD" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFonts.java[CommonFonts" stamp="1209571142502" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts.ITALIC' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts.ITALIC'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts'" delegate="false" deprecate="true" description="Move member 'ITALIC'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColorsAndFonts.java[CommonColorsAndFonts^ITALIC" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFonts.java[CommonFonts" stamp="1209571150518" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts.STRIKETHROUGH' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts.STRIKETHROUGH'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts'" delegate="false" deprecate="true" description="Move member 'STRIKETHROUGH'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColorsAndFonts.java[CommonColorsAndFonts^STRIKETHROUGH" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFonts.java[CommonFonts" stamp="1209571157631" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts' to 'CommonColors'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColorsAndFonts'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'CommonColorsAndFonts'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColorsAndFonts.java[CommonColorsAndFonts" matchStrategy="1" name="CommonColors" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1209571235160" textual="false" version="1.0"/>
<refactoring comment="Rename field 'TASK_EDITOR_FONT' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_FONT_TEDITOR_COMMENT'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.TASK_EDITOR_FONT'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_FONT_TEDITOR_COMMENT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'TASK_EDITOR_FONT'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^TASK_EDITOR_FONT" name="THEME_FONT_TEDITOR_COMMENT" references="true" setter="true" stamp="1209571326741" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_FONT_TEDITOR_COMMENT' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_FONT_EDITOR_COMMENT'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_FONT_TEDITOR_COMMENT'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_FONT_EDITOR_COMMENT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_FONT_TEDITOR_COMMENT'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_FONT_TEDITOR_COMMENT" name="THEME_FONT_EDITOR_COMMENT" references="true" setter="true" stamp="1209571331020" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_PAST_DUE' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_OVERDUE'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASK_PAST_DUE'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_OVERDUE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_PAST_DUE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASK_PAST_DUE" name="THEME_COLOR_OVERDUE" references="true" setter="true" stamp="1209571359695" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_PAST_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_PAST_SCHEDULED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASK_PAST_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_PAST_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_PAST_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASK_PAST_SCHEDULED" name="THEME_COLOR_PAST_SCHEDULED" references="true" setter="true" stamp="1209571377735" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_TODAY_COMPLETED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_TODAY_COMPLETED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASK_TODAY_COMPLETED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TODAY_COMPLETED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_TODAY_COMPLETED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASK_TODAY_COMPLETED" name="THEME_COLOR_TODAY_COMPLETED" references="true" setter="true" stamp="1209571384901" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_TODAY_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_TODAY_SCHEDULED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASK_TODAY_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TODAY_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_TODAY_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASK_TODAY_SCHEDULED" name="THEME_COLOR_TODAY_SCHEDULED" references="true" setter="true" stamp="1209571391307" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_THISWEEK_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_WEEK_SCHEDULED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASK_THISWEEK_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_WEEK_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_THISWEEK_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASK_THISWEEK_SCHEDULED" name="THEME_COLOR_WEEK_SCHEDULED" references="true" setter="true" stamp="1209571400480" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASKS_INCOMING_BACKGROUND' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_INCOMING_BACKGROUND'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASKS_INCOMING_BACKGROUND'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_INCOMING_BACKGROUND'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASKS_INCOMING_BACKGROUND'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASKS_INCOMING_BACKGROUND" name="THEME_COLOR_INCOMING_BACKGROUND" references="true" setter="true" stamp="1209571406635" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASKLIST_CATEGORY' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'THEME_COLOR_CATEGORY'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TASKLIST_CATEGORY'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASKLIST_CATEGORY'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TASKLIST_CATEGORY" name="THEME_COLOR_CATEGORY" references="true" setter="true" stamp="1209571419597" textual="false" version="1.0"/>
<refactoring comment="Rename field 'BACKGROUND_ARCHIVE' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'COLOR_ARCHIVE_BACKGROUND'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.BACKGROUND_ARCHIVE'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_ARCHIVE_BACKGROUND'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'BACKGROUND_ARCHIVE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^BACKGROUND_ARCHIVE" name="COLOR_ARCHIVE_BACKGROUND" references="true" setter="true" stamp="1209571439185" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_TASK_ACTIVE' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'COLOR_CONTEXT_ACTIVE'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_TASK_ACTIVE'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_CONTEXT_ACTIVE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_TASK_ACTIVE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_TASK_ACTIVE" name="COLOR_CONTEXT_ACTIVE" references="true" setter="true" stamp="1209571450384" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_QUOTED_TEXT' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'COLOR_TEXT_QUOTED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_QUOTED_TEXT'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_TEXT_QUOTED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_QUOTED_TEXT'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_QUOTED_TEXT" name="COLOR_TEXT_QUOTED" references="true" setter="true" stamp="1209571486581" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_SPELLING_ERROR' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'COLOR_TEXT_SPELLING_ERROR'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_SPELLING_ERROR'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_TEXT_SPELLING_ERROR'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_SPELLING_ERROR'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_SPELLING_ERROR" name="COLOR_TEXT_SPELLING_ERROR" references="true" setter="true" stamp="1209571498526" textual="false" version="1.0"/>
<refactoring comment="Rename field 'GRAY' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'COLOR_GRAY'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.GRAY'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_GRAY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'GRAY'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^GRAY" name="COLOR_GRAY" references="true" setter="true" stamp="1209571813918" textual="false" version="1.0"/>

<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_INCOMING_BACKGROUND' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_INCOMING_BACKGROUND'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_INCOMING_BACKGROUND'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_INCOMING_BACKGROUND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571926926" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_PAST_SCHEDULED' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_PAST_SCHEDULED'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_PAST_SCHEDULED'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_PAST_SCHEDULED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571935759" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_OVERDUE' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_OVERDUE'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_OVERDUE'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_OVERDUE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571938933" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_WEEK_SCHEDULED' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_WEEK_SCHEDULED'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_WEEK_SCHEDULED'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_WEEK_SCHEDULED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571942098" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_COMPLETED' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_COMPLETED'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_COMPLETED'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_COMPLETED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571946440" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TODAY_SCHEDULED' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TODAY_SCHEDULED'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_TODAY_SCHEDULED'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TODAY_SCHEDULED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571949321" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TODAY_COMPLETED' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_TODAY_COMPLETED'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_TODAY_COMPLETED'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_TODAY_COMPLETED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571952231" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY_GRADIENT_START' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY_GRADIENT_START'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_CATEGORY_GRADIENT_START'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_CATEGORY_GRADIENT_START" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571954972" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY_GRADIENT_END' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY_GRADIENT_END'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_CATEGORY_GRADIENT_END'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_CATEGORY_GRADIENT_END" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571958268" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_COLOR_CATEGORY'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_COLOR_CATEGORY'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_COLOR_CATEGORY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571961475" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_FONT_EDITOR_COMMENT' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.THEME_FONT_EDITOR_COMMENT'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'THEME_FONT_EDITOR_COMMENT'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^THEME_FONT_EDITOR_COMMENT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571965072" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.isTaskListTheme(...)' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.isTaskListTheme(...)'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes'" delegate="false" deprecate="true" description="Move member 'isTaskListTheme'" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors~isTaskListTheme~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes" stamp="1209571974756" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.isTaskListTheme(...)' to 'isCommonTheme'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.isTaskListTheme(...)'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.isCommonTheme(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isTaskListTheme'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes~isTaskListTheme~QString;" name="isCommonTheme" references="true" stamp="1209571991758" version="1.0"/>
<refactoring comment="Rename field 'THEME_FONT_EDITOR_COMMENT' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'FONT_EDITOR_COMMENT'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_FONT_EDITOR_COMMENT'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.FONT_EDITOR_COMMENT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_FONT_EDITOR_COMMENT'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_FONT_EDITOR_COMMENT" name="FONT_EDITOR_COMMENT" references="true" setter="true" stamp="1209571996022" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_CATEGORY' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_CATEGORY'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_CATEGORY'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_CATEGORY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_CATEGORY'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_CATEGORY" name="COLOR_CATEGORY" references="true" setter="true" stamp="1209572000158" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_CATEGORY_GRADIENT_END' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_CATEGORY_GRADIENT_END'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_CATEGORY_GRADIENT_END'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_CATEGORY_GRADIENT_END'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_CATEGORY_GRADIENT_END'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_CATEGORY_GRADIENT_END" name="COLOR_CATEGORY_GRADIENT_END" references="true" setter="true" stamp="1209572004706" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_CATEGORY_GRADIENT_START' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_CATEGORY_GRADIENT_START'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_CATEGORY_GRADIENT_START'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_CATEGORY_GRADIENT_START'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_CATEGORY_GRADIENT_START'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_CATEGORY_GRADIENT_START" name="COLOR_CATEGORY_GRADIENT_START" references="true" setter="true" stamp="1209572009399" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TODAY_COMPLETED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_TODAY_COMPLETED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_TODAY_COMPLETED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_TODAY_COMPLETED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TODAY_COMPLETED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_TODAY_COMPLETED" name="COLOR_TODAY_COMPLETED" references="true" setter="true" stamp="1209572032724" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TODAY_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_TODAY_SCHEDULED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_TODAY_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_TODAY_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TODAY_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_TODAY_SCHEDULED" name="COLOR_TODAY_SCHEDULED" references="true" setter="true" stamp="1209572036863" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_COMPLETED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_COMPLETED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_COMPLETED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_COMPLETED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_COMPLETED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_COMPLETED" name="COLOR_COMPLETED" references="true" setter="true" stamp="1209572040341" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_WEEK_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_WEEK_SCHEDULED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_WEEK_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_WEEK_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_WEEK_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_WEEK_SCHEDULED" name="COLOR_WEEK_SCHEDULED" references="true" setter="true" stamp="1209572043278" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_OVERDUE' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_OVERDUE'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_OVERDUE'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_OVERDUE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_OVERDUE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_OVERDUE" name="COLOR_OVERDUE" references="true" setter="true" stamp="1209572047601" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_PAST_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_PAST_SCHEDULED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_PAST_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_PAST_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_PAST_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_PAST_SCHEDULED" name="COLOR_PAST_SCHEDULED" references="true" setter="true" stamp="1209572050916" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_INCOMING_BACKGROUND' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_INCOMING_BACKGROUND'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.THEME_COLOR_INCOMING_BACKGROUND'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_INCOMING_BACKGROUND'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_INCOMING_BACKGROUND'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^THEME_COLOR_INCOMING_BACKGROUND" name="COLOR_INCOMING_BACKGROUND" references="true" setter="true" stamp="1209572053809" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_PAST_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_SCHEDULED_PAST'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_PAST_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_SCHEDULED_PAST'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_PAST_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^COLOR_PAST_SCHEDULED" name="COLOR_SCHEDULED_PAST" references="true" setter="true" stamp="1209572068420" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_WEEK_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_SCHEDULED_THIS_WEEK'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_WEEK_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_SCHEDULED_THIS_WEEK'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_WEEK_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^COLOR_WEEK_SCHEDULED" name="COLOR_SCHEDULED_THIS_WEEK" references="true" setter="true" stamp="1209572075435" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_TODAY_SCHEDULED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_SCHEDULED_TODAY'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_TODAY_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_SCHEDULED_TODAY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_TODAY_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^COLOR_TODAY_SCHEDULED" name="COLOR_SCHEDULED_TODAY" references="true" setter="true" stamp="1209572082479" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_TODAY_COMPLETED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes' to 'COLOR_COMPLETED_TODAY'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_TODAY_COMPLETED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes.COLOR_COMPLETED_TODAY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_TODAY_COMPLETED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonThemes.java[CommonThemes^COLOR_TODAY_COMPLETED" name="COLOR_COMPLETED_TODAY" references="true" setter="true" stamp="1209572089493" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_CONTEXT_ACTIVE' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'CONTEXT_ACTIVE'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_CONTEXT_ACTIVE'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.CONTEXT_ACTIVE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_CONTEXT_ACTIVE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_CONTEXT_ACTIVE" name="CONTEXT_ACTIVE" references="true" setter="true" stamp="1209572153221" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_LABEL_CAUTION' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'LABEL_CAUTION'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_LABEL_CAUTION'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.LABEL_CAUTION'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_LABEL_CAUTION'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_LABEL_CAUTION" name="LABEL_CAUTION" references="true" setter="true" stamp="1209572157124" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_HYPERLINK_WIDGET' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'HYPERLINK_WIDGET'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_HYPERLINK_WIDGET'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.HYPERLINK_WIDGET'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_HYPERLINK_WIDGET'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_HYPERLINK_WIDGET" name="HYPERLINK_WIDGET" references="true" setter="true" stamp="1209572172019" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_TEXT_QUOTED' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'TEXT_QUOTED'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_TEXT_QUOTED'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.TEXT_QUOTED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_TEXT_QUOTED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_TEXT_QUOTED" name="TEXT_QUOTED" references="true" setter="true" stamp="1209572180371" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_TEXT_SPELLING_ERROR' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'TEXT_SPELLING_ERROR'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_TEXT_SPELLING_ERROR'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.TEXT_SPELLING_ERROR'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_TEXT_SPELLING_ERROR'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_TEXT_SPELLING_ERROR" name="TEXT_SPELLING_ERROR" references="true" setter="true" stamp="1209572192118" textual="false" version="1.0"/>
<refactoring comment="Rename field 'COLOR_GRAY' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors' to 'GRAY_MID'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.COLOR_GRAY'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors.GRAY_MID'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'COLOR_GRAY'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonColors.java[CommonColors^COLOR_GRAY" name="GRAY_MID" references="true" setter="true" stamp="1209572204384" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..01ded15
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,60 @@
+1209511683958 Delete element
+1209511743212 Delete element
+1209515618596 Rename package 'org.eclipse.mylyn.internal.workbench.ui'
+1209515801600 Rename package 'org.eclipse.mylyn.provisional.workbench.ui'
+1209515837956 Move compilation units
+1209515847736 Move compilation unit
+1209515852219 Delete element
+1209516185596 Rename package 'org.eclipse.mylyn.internal.provisional.workbench.ui'
+1209571142502 Move member 'BOLD'
+1209571150518 Move member 'ITALIC'
+1209571157631 Move member 'STRIKETHROUGH'
+1209571235160 Rename type 'CommonColorsAndFonts'
+1209571326741 Rename field 'TASK_EDITOR_FONT'
+1209571331020 Rename field 'THEME_FONT_TEDITOR_COMMENT'
+1209571359695 Rename field 'THEME_COLOR_TASK_PAST_DUE'
+1209571377735 Rename field 'THEME_COLOR_TASK_PAST_SCHEDULED'
+1209571384901 Rename field 'THEME_COLOR_TASK_TODAY_COMPLETED'
+1209571391307 Rename field 'THEME_COLOR_TASK_TODAY_SCHEDULED'
+1209571400480 Rename field 'THEME_COLOR_TASK_THISWEEK_SCHEDULED'
+1209571406635 Rename field 'THEME_COLOR_TASKS_INCOMING_BACKGROUND'
+1209571419597 Rename field 'THEME_COLOR_TASKLIST_CATEGORY'
+1209571439185 Rename field 'BACKGROUND_ARCHIVE'
+1209571450384 Rename field 'COLOR_TASK_ACTIVE'
+1209571486581 Rename field 'COLOR_QUOTED_TEXT'
+1209571498526 Rename field 'COLOR_SPELLING_ERROR'
+1209571813918 Rename field 'GRAY'
+1209571926926 Move member 'THEME_COLOR_INCOMING_BACKGROUND'
+1209571935759 Move member 'THEME_COLOR_PAST_SCHEDULED'
+1209571938933 Move member 'THEME_COLOR_OVERDUE'
+1209571942098 Move member 'THEME_COLOR_WEEK_SCHEDULED'
+1209571946440 Move member 'THEME_COLOR_COMPLETED'
+1209571949321 Move member 'THEME_COLOR_TODAY_SCHEDULED'
+1209571952231 Move member 'THEME_COLOR_TODAY_COMPLETED'
+1209571954972 Move member 'THEME_COLOR_CATEGORY_GRADIENT_START'
+1209571958268 Move member 'THEME_COLOR_CATEGORY_GRADIENT_END'
+1209571961475 Move member 'THEME_COLOR_CATEGORY'
+1209571965072 Move member 'THEME_FONT_EDITOR_COMMENT'
+1209571974756 Move member 'isTaskListTheme'
+1209571991758 Rename method 'isTaskListTheme'
+1209571996022 Rename field 'THEME_FONT_EDITOR_COMMENT'
+1209572000158 Rename field 'THEME_COLOR_CATEGORY'
+1209572004706 Rename field 'THEME_COLOR_CATEGORY_GRADIENT_END'
+1209572009399 Rename field 'THEME_COLOR_CATEGORY_GRADIENT_START'
+1209572032724 Rename field 'THEME_COLOR_TODAY_COMPLETED'
+1209572036863 Rename field 'THEME_COLOR_TODAY_SCHEDULED'
+1209572040341 Rename field 'THEME_COLOR_COMPLETED'
+1209572043278 Rename field 'THEME_COLOR_WEEK_SCHEDULED'
+1209572047601 Rename field 'THEME_COLOR_OVERDUE'
+1209572050916 Rename field 'THEME_COLOR_PAST_SCHEDULED'
+1209572053809 Rename field 'THEME_COLOR_INCOMING_BACKGROUND'
+1209572068420 Rename field 'COLOR_PAST_SCHEDULED'
+1209572075435 Rename field 'COLOR_WEEK_SCHEDULED'
+1209572082479 Rename field 'COLOR_TODAY_SCHEDULED'
+1209572089493 Rename field 'COLOR_TODAY_COMPLETED'
+1209572153221 Rename field 'COLOR_CONTEXT_ACTIVE'
+1209572157124 Rename field 'COLOR_LABEL_CAUTION'
+1209572172019 Rename field 'COLOR_HYPERLINK_WIDGET'
+1209572180371 Rename field 'COLOR_TEXT_QUOTED'
+1209572192118 Rename field 'COLOR_TEXT_SPELLING_ERROR'
+1209572204384 Rename field 'COLOR_GRAY'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/18/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/18/refactorings.history
new file mode 100644
index 0000000..92363f8
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/18/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'obj16'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'obj16'
- Original element: 'attachment-patch.gif'" description="Move file" element1="icons/obj16/attachment-patch.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209609208736" target="/org.eclipse.mylyn.tasks.ui/icons/obj16" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/18/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/18/refactorings.index
new file mode 100644
index 0000000..41c6903
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/18/refactorings.index
@@ -0,0 +1 @@
+1209609208736 Move file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..3e514bd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'treeViewer' in 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob' to 'viewer'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.treeViewer'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.viewer'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'treeViewer'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{DelayedRefreshJob.java[DelayedRefreshJob^treeViewer" name="viewer" references="true" setter="false" stamp="1210711926937" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.refreshTask(...)' to 'refreshElement'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.refreshTask(...)'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.refreshElement(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'refreshTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{DelayedRefreshJob.java[DelayedRefreshJob~refreshTask~QObject;" name="refreshElement" references="true" stamp="1210712113125" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..99c4762
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,2 @@
+1210711926937 Rename field 'treeViewer'
+1210712113125 Rename method 'refreshTask'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..8856632
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.commons.ui.WorkbenchExtensionsPlugin' to 'CommonsUiPlugin'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.commons.ui.WorkbenchExtensionsPlugin'
- Renamed element: 'org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'WorkbenchExtensionsPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.commons.ui{WorkbenchExtensionsPlugin.java[WorkbenchExtensionsPlugin" matchStrategy="1" name="CommonsUiPlugin" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1211306421354" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.commons.tests'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.commons.tests'
- Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.commons.tests" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1211308239932" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..a779cb8
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1211306421354 Rename type 'WorkbenchExtensionsPlugin'
+1211308239932 Copy folder
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..6cfaa9d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.refresh(...)' to 'doRefresh'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.refresh(...)'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.doRefresh(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'refresh'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{DelayedRefreshJob.java[DelayedRefreshJob~refresh~\[QObject;" name="doRefresh" references="true" stamp="1212097719688" version="1.0"/>

<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.forceRefresh()' to 'refreshNow'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.forceRefresh()'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob.refreshNow()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'forceRefresh'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{DelayedRefreshJob.java[DelayedRefreshJob~forceRefresh" name="refreshNow" references="true" stamp="1212098073549" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.views'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.views'
- Original elements:
 org.eclipse.mylyn.internal.provisional.commons.ui.CommonNavigatorFilterBar.java
 org.eclipse.mylyn.internal.provisional.commons.ui.CommonNavigatorPatternFilter.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui.views" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonNavigatorFilterBar.java" element2="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonNavigatorPatternFilter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212189958257" units="2" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..8f59022
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,3 @@
+1212097719688 Rename method 'refresh'
+1212098073549 Rename method 'forceRefresh'
+1212189958257 Move compilation units
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..a970494
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename resource 'org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing.gif' to 'overlay-outgoing-new.gif'" description="Rename resource 'overlay-outgoing.gif'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="icons/eview16/overlay-outgoing.gif" name="overlay-outgoing-new.gif" stamp="1213066365678" updateReferences="true"/>
<refactoring comment="Rename field 'PRIORITY_COMPLETE' in 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages' to 'COMPLETE'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages.PRIORITY_COMPLETE'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages.COMPLETE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PRIORITY_COMPLETE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonImages.java[CommonImages^PRIORITY_COMPLETE" name="COMPLETE" references="true" setter="true" stamp="1213222546051" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..7cb7eb2
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1213066365678 Rename resource 'overlay-outgoing.gif'
+1213222546051 Rename field 'PRIORITY_COMPLETE'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/1/2/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/1/2/refactorings.history
new file mode 100644
index 0000000..53e7bd5
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/1/2/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.provisional.tasks.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.provisional.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractRetrieveTitleFromUrlJob.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.provisional.tasks.ui" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{AbstractRetrieveTitleFromUrlJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1231570614634" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/1/2/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/1/2/refactorings.index
new file mode 100644
index 0000000..aa078c3
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/1/2/refactorings.index
@@ -0,0 +1 @@
+1231570614634 Move compilation unit
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/2/9/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/2/9/refactorings.history
new file mode 100644
index 0000000..cf30ea2
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/2/9/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'innerContentCircle' in 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.createContents(...)' to 'innerContent'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup.createContents(Composite).innerContentCircle'
- Renamed element: 'innerContentCircle'
- Update references to refactored element" description="Rename local variable 'innerContentCircle'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{AbstractNotificationPopup.java[AbstractNotificationPopup~createContents~QComposite;@innerContentCircle!13528!13607!13538!13555!QComposite;" name="innerContent" references="true" stamp="1235682330385" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/2/9/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/2/9/refactorings.index
new file mode 100644
index 0000000..a0966cc
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/2/9/refactorings.index
@@ -0,0 +1 @@
+1235682330385 Rename local variable 'innerContentCircle'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/16/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/16/refactorings.history
new file mode 100644
index 0000000..929fb5d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.IImageCreator.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.provisional.commons.ui{IImageCreator.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1239671272501" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/16/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/16/refactorings.index
new file mode 100644
index 0000000..bb7e643
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/16/refactorings.index
@@ -0,0 +1 @@
+1239671272501 Delete element
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/18/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/18/refactorings.history
new file mode 100644
index 0000000..a6b33d9
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.commons.ui.WorkbenchUtil.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.provisional.commons.ui" element1="/src<org.eclipse.mylyn.internal.commons.ui{WorkbenchUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1241061658407" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonsUiUtil' to 'CommonUiUtil'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonsUiUtil'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'CommonsUiUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonsUiUtil.java[CommonsUiUtil" matchStrategy="1" name="CommonUiUtil" qualified="false" references="true" similarDeclarations="true" stamp="1241063329679" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil.toggleExpandableComposite(...)' to 'setExpanded'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil.toggleExpandableComposite(...)'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil.setExpanded(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'toggleExpandableComposite'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFormUtil.java[CommonFormUtil~toggleExpandableComposite~Z~QExpandableComposite;" name="setExpanded" references="true" stamp="1241063626763" version="1.0"/>
<refactoring comment="Change method 'public static void org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil.setExpanded(ExpandableComposite comp, boolean expanded)' to 'public static void setExpanded(ExpandableComposite comp, boolean expanded)'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil.setExpanded(...)'
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Change method 'setExpanded'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFormUtil.java[CommonFormUtil~setExpanded~Z~QExpandableComposite;" name="setExpanded" parameter1="ExpandableComposite comp 1 ExpandableComposite comp false" parameter2="boolean expanded 0 boolean expanded false" stamp="1241063636368" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil.setEnabledState(...)' to 'setEnabled'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil.setEnabledState(...)'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil.setEnabled(...)'
- Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setEnabledState'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonUiUtil.java[CommonUiUtil~setEnabledState~QComposite;~Z" name="setEnabled" references="true" stamp="1241063910326" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/18/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/18/refactorings.index
new file mode 100644
index 0000000..d1a66b1
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/4/18/refactorings.index
@@ -0,0 +1,5 @@
+1241061658407 Move compilation unit
+1241063329679 Rename type 'CommonsUiUtil'
+1241063626763 Rename method 'toggleExpandableComposite'
+1241063636368 Change method 'setExpanded'
+1241063910326 Rename method 'setEnabledState'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/21/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/21/refactorings.history
new file mode 100644
index 0000000..9eb6387
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void updateSize()' from 'org.eclipse.mylyn.internal.commons.ui.ControlListViewer.ControlListViewer().new ControlAdapter() {...}.controlResized()' to 'org.eclipse.mylyn.internal.commons.ui.ControlListViewer.ControlListViewer().new ControlAdapter() {...}'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Method name: 'updateSize'
- Destination type: 'org.eclipse.mylyn.internal.commons.ui.ControlListViewer.ControlListViewer().new ControlAdapter() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateSize'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.commons.ui{ControlListViewer.java" name="updateSize" replace="false" selection="3215 147" stamp="1242972702999" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/21/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/21/refactorings.index
new file mode 100644
index 0000000..8ebd2cd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/21/refactorings.index
@@ -0,0 +1 @@
+1242972702999 Extract method 'updateSize'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/22/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/22/refactorings.history
new file mode 100644
index 0000000..d7e621a
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource 'org.eclipse.mylyn.commons.ui/icons/wizban/discovery.png' to 'banner-discovery.png'" description="Rename resource 'discovery.png'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="icons/wizban/discovery.png" name="banner-discovery.png" stamp="1243363282741" updateReferences="true"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/22/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/22/refactorings.index
new file mode 100644
index 0000000..8dc53db
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/5/22/refactorings.index
@@ -0,0 +1 @@
+1243363282741 Rename resource 'discovery.png'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/23/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/23/refactorings.history
new file mode 100644
index 0000000..4d76718
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractFilteredTree.setFindLabel()' to 'setFindForeround'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractFilteredTree.setFindLabel()'
- Renamed element: 'org.eclipse.mylyn.internal.provisional.commons.ui.AbstractFilteredTree.setFindForeround()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setFindLabel'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.provisional.commons.ui{AbstractFilteredTree.java[AbstractFilteredTree~setFindLabel" name="setFindForeround" references="true" stamp="1244246771375" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/23/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/23/refactorings.index
new file mode 100644
index 0000000..e635985
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/23/refactorings.index
@@ -0,0 +1 @@
+1244246771375 Rename method 'setFindLabel'
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/24/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/24/refactorings.history
new file mode 100644
index 0000000..cf7c2e0
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'obj24'" description="Delete element" element1="icons/obj24" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1244862383645" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/24/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/24/refactorings.index
new file mode 100644
index 0000000..85763ca
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/24/refactorings.index
@@ -0,0 +1 @@
+1244862383645 Delete element
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/25/refactorings.history b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/25/refactorings.history
new file mode 100644
index 0000000..832e51e
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/25/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.commons.ui'
- Original project: 'org.eclipse.mylyn.commons.ui'
- Original element: 'web.png'" description="Delete element" element1="icons/etool16/web.png" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1245172172343" subPackages="false" version="1.0"/>
<refactoring comment="Rename resource 'org.eclipse.mylyn.commons.ui/icons/etool16/web-small.png' to 'web.png'" description="Rename resource 'web-small.png'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="icons/etool16/web-small.png" name="web.png" stamp="1245172190096" updateReferences="true"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/25/refactorings.index b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/25/refactorings.index
new file mode 100644
index 0000000..92a0c60
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.refactorings/2009/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1245172172343 Delete element
+1245172190096 Rename resource 'web-small.png'
diff --git a/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..8b14054
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,344 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.commons.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.commons.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..579eeea
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,126 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.commons.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.expressions,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.editors;resolution:=optional,
+ org.eclipse.ui.forms;resolution:=optional,
+ org.eclipse.ui.browser;resolution:=optional
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Activator: org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin
+Export-Package: org.eclipse.mylyn.internal.commons.ui;x-internal:=true;
+ uses:="org.eclipse.jface.window,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.resource,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.ui.plugin,
+ org.eclipse.swt.graphics,
+ org.osgi.framework,
+ org.eclipse.swt.widgets",
+ org.eclipse.mylyn.internal.provisional.commons.ui;
+ x-friends:="org.eclipse.mylyn.bugzilla.core,
+ org.eclipse.mylyn.bugzilla.ide,
+ org.eclipse.mylyn.bugzilla.ui,
+ org.eclipse.mylyn.commons.core,
+ org.eclipse.mylyn.commons.ui,
+ org.eclipse.mylyn.compatibility,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.help.ui,
+ org.eclipse.mylyn.ide.ant,
+ org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.mylyn.jira.core,
+ org.eclipse.mylyn.jira.ui,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.monitor.reports,
+ org.eclipse.mylyn.monitor.server,
+ org.eclipse.mylyn.monitor.study,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.mylyn.monitor.usage,
+ org.eclipse.mylyn.pde.ui,
+ org.eclipse.mylyn.resources.ui,
+ org.eclipse.mylyn.sandbox.dev,
+ org.eclipse.mylyn.sandbox.ui,
+ org.eclipse.mylyn.tasks.bugs,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.team.cvs,
+ org.eclipse.mylyn.team.ui,
+ org.eclipse.mylyn.trac.core,
+ org.eclipse.mylyn.trac.tests,
+ org.eclipse.mylyn.trac.ui,
+ org.eclipse.mylyn.trac.wiki,
+ org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.web.tasks,
+ org.eclipse.mylyn.web.ui,
+ org.eclipse.mylyn.xplanner.core,
+ org.eclipse.mylyn.xplanner.ui";
+ uses:="org.eclipse.jface.wizard,
+ org.eclipse.jface.window,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.resource,
+ org.eclipse.swt.events,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.swt.graphics,
+ org.eclipse.jface.viewers,
+ org.eclipse.ui.dialogs,
+ org.eclipse.swt.widgets,
+ org.eclipse.jface.dialogs",
+ org.eclipse.mylyn.internal.provisional.commons.ui.editor;
+ x-friends:="org.eclipse.mylyn.bugzilla.core,
+ org.eclipse.mylyn.bugzilla.ide,
+ org.eclipse.mylyn.bugzilla.ui,
+ org.eclipse.mylyn.commons.core,
+ org.eclipse.mylyn.commons.ui,
+ org.eclipse.mylyn.compatibility,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.help.ui,
+ org.eclipse.mylyn.ide.ant,
+ org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.mylyn.jira.core,
+ org.eclipse.mylyn.jira.ui,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.monitor.reports,
+ org.eclipse.mylyn.monitor.server,
+ org.eclipse.mylyn.monitor.study,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.mylyn.monitor.usage,
+ org.eclipse.mylyn.pde.ui,
+ org.eclipse.mylyn.resources.ui,
+ org.eclipse.mylyn.sandbox.dev,
+ org.eclipse.mylyn.sandbox.ui,
+ org.eclipse.mylyn.tasks.bugs,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.team.cvs,
+ org.eclipse.mylyn.team.ui,
+ org.eclipse.mylyn.trac.core,
+ org.eclipse.mylyn.trac.tests,
+ org.eclipse.mylyn.trac.ui,
+ org.eclipse.mylyn.trac.wiki,
+ org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.web.tasks,
+ org.eclipse.mylyn.web.ui,
+ org.eclipse.mylyn.xplanner.core,
+ org.eclipse.mylyn.xplanner.ui";
+ uses:="org.eclipse.jface.wizard,
+ org.eclipse.jface.window,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.resource,
+ org.eclipse.swt.events,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.swt.graphics,
+ org.eclipse.jface.viewers,
+ org.eclipse.ui.dialogs,
+ org.eclipse.swt.widgets,
+ org.eclipse.jface.dialogs"
+Bundle-Vendor: %Bundle-Vendor
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.commons.ui/about.html b/org.eclipse.mylyn.commons.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/build.properties b/org.eclipse.mylyn.commons.ui/build.properties
new file mode 100644
index 0000000..c2d342d
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ icons/,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_arrow1.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_arrow1.gif
new file mode 100644
index 0000000..0083160
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_arrow1.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_arrow2.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_arrow2.gif
new file mode 100644
index 0000000..dd97e84
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_arrow2.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_box.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_box.gif
new file mode 100644
index 0000000..f89e65a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_box.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_box.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_box.gif
new file mode 100644
index 0000000..731a6bb
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_box.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_oval.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_oval.gif
new file mode 100644
index 0000000..ad0779b
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_oval.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_rbox.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_rbox.gif
new file mode 100644
index 0000000..2b8f521
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_fill_rbox.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_free.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_free.gif
new file mode 100644
index 0000000..14583e7
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_free.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_line.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_line.gif
new file mode 100644
index 0000000..923c116
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_line.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_oval.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_oval.gif
new file mode 100644
index 0000000..f50969b
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_oval.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/edit_rbox.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_rbox.gif
new file mode 100644
index 0000000..174c41f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/edit_rbox.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold1.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold1.gif
new file mode 100644
index 0000000..7c85b32
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold1.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold2.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold2.gif
new file mode 100644
index 0000000..6158793
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold2.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold4.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold4.gif
new file mode 100644
index 0000000..df5f605
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold4.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold8.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold8.gif
new file mode 100644
index 0000000..49c6985
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_bold8.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash.gif
new file mode 100644
index 0000000..db5950a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash1d.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash1d.gif
new file mode 100644
index 0000000..62099ba
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash1d.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash2d.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash2d.gif
new file mode 100644
index 0000000..5e700cd
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dash2d.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_dot.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dot.gif
new file mode 100644
index 0000000..69d00e3
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_dot.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/draw16/line_sold.gif b/org.eclipse.mylyn.commons.ui/icons/draw16/line_sold.gif
new file mode 100644
index 0000000..ec93950
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/draw16/line_sold.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/blank.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/blank.gif
new file mode 100644
index 0000000..45b7594
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/blank.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/clearDot.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/clearDot.gif
new file mode 100644
index 0000000..35d42e8
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/clearDot.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/collapseall-small.png b/org.eclipse.mylyn.commons.ui/icons/elcl16/collapseall-small.png
new file mode 100644
index 0000000..4321c88
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/collapseall-small.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/collapseall.png b/org.eclipse.mylyn.commons.ui/icons/elcl16/collapseall.png
new file mode 100644
index 0000000..611a8c5
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/collapseall.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/delete.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/delete.gif
new file mode 100644
index 0000000..b6922ac
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/delete.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/expandall-small.png b/org.eclipse.mylyn.commons.ui/icons/elcl16/expandall-small.png
new file mode 100644
index 0000000..05445c0
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/expandall-small.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/expandall.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/expandall.gif
new file mode 100644
index 0000000..0205b29
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/expandall.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/filter-complete.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/filter-complete.gif
new file mode 100644
index 0000000..ef1c1b3
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/filter-complete.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/filter-priority.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/filter-priority.gif
new file mode 100644
index 0000000..16f5652
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/filter-priority.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/refresh-small.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/refresh-small.gif
new file mode 100644
index 0000000..284be87
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/refresh-small.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/refresh.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/refresh.gif
new file mode 100644
index 0000000..634306d
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/refresh.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/remove.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/remove.gif
new file mode 100644
index 0000000..2cd9c54
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/remove.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/elcl16/warning.gif b/org.eclipse.mylyn.commons.ui/icons/elcl16/warning.gif
new file mode 100644
index 0000000..6e44748
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/elcl16/warning.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/calendar.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/calendar.gif
new file mode 100644
index 0000000..4126b3c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/calendar.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/capture-fit.png b/org.eclipse.mylyn.commons.ui/icons/etool16/capture-fit.png
new file mode 100644
index 0000000..adbc678
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/capture-fit.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/capture-screen-bold.png b/org.eclipse.mylyn.commons.ui/icons/etool16/capture-screen-bold.png
new file mode 100644
index 0000000..cb3e252
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/capture-screen-bold.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/capture-screen.png b/org.eclipse.mylyn.commons.ui/icons/etool16/capture-screen.png
new file mode 100644
index 0000000..91fe363
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/capture-screen.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/clear.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/clear.gif
new file mode 100644
index 0000000..6bc10f9
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/clear.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/clipboard_obj.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/clipboard_obj.gif
new file mode 100644
index 0000000..b817f8b
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/clipboard_obj.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/content-assist-separator.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/content-assist-separator.gif
new file mode 100644
index 0000000..25b1176
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/content-assist-separator.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/copy.png b/org.eclipse.mylyn.commons.ui/icons/etool16/copy.png
new file mode 100644
index 0000000..bb5451c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/copy.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/cut.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/cut.gif
new file mode 100644
index 0000000..d044e59
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/cut.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/discovery.png b/org.eclipse.mylyn.commons.ui/icons/etool16/discovery.png
new file mode 100644
index 0000000..53a305a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/discovery.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/edit.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/edit.gif
new file mode 100644
index 0000000..e8de662
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/edit.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/file_obj.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/file_obj.gif
new file mode 100644
index 0000000..7ccc6a7
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/file_obj.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/find-clear-disabled.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/find-clear-disabled.gif
new file mode 100644
index 0000000..7f32480
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/find-clear-disabled.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/find-clear.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/find-clear.gif
new file mode 100644
index 0000000..2d3935a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/find-clear.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/find.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/find.gif
new file mode 100644
index 0000000..9d58cb9
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/find.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/go-into.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/go-into.gif
new file mode 100644
index 0000000..98d316d
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/go-into.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/go-up.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/go-up.gif
new file mode 100644
index 0000000..73e336e
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/go-up.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/grouping.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/grouping.gif
new file mode 100644
index 0000000..b487d07
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/grouping.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/link-editor.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/link-editor.gif
new file mode 100644
index 0000000..0061df8
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/link-editor.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/maximize.png b/org.eclipse.mylyn.commons.ui/icons/etool16/maximize.png
new file mode 100644
index 0000000..f300b7c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/maximize.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/monitor_obj.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/monitor_obj.gif
new file mode 100644
index 0000000..e3ecc55
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/monitor_obj.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/open-browser.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/open-browser.gif
new file mode 100644
index 0000000..b09bc8b
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/open-browser.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/overlay-repository.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/overlay-repository.gif
new file mode 100644
index 0000000..0ce0f9f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/overlay-repository.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/person-me-narrow.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/person-me-narrow.gif
new file mode 100644
index 0000000..268540f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/person-me-narrow.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/person-me.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/person-me.gif
new file mode 100644
index 0000000..fa074fb
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/person-me.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/person-narrow.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/person-narrow.gif
new file mode 100644
index 0000000..9c0c4bf
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/person-narrow.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/person.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/person.gif
new file mode 100644
index 0000000..dc5a1af
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/person.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/presentation.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/presentation.gif
new file mode 100644
index 0000000..db8f21f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/presentation.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/preview-web.png b/org.eclipse.mylyn.commons.ui/icons/etool16/preview-web.png
new file mode 100644
index 0000000..c82f13f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/preview-web.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/redo_edit.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/redo_edit.gif
new file mode 100644
index 0000000..c84e5b1
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/redo_edit.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/save.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/save.gif
new file mode 100644
index 0000000..7da6455
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/save.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/schedule-day.png b/org.eclipse.mylyn.commons.ui/icons/etool16/schedule-day.png
new file mode 100644
index 0000000..ae34650
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/schedule-day.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/schedule-week.png b/org.eclipse.mylyn.commons.ui/icons/etool16/schedule-week.png
new file mode 100644
index 0000000..94845cb
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/schedule-week.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/select_rect.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/select_rect.gif
new file mode 100644
index 0000000..10dd1f0
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/select_rect.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/sort-down-gray.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-down-gray.gif
new file mode 100644
index 0000000..f16b4c9
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-down-gray.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/sort-down.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-down.gif
new file mode 100644
index 0000000..18d6269
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-down.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/sort-up-gray.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-up-gray.gif
new file mode 100644
index 0000000..4ac9855
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-up-gray.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/sort-up.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-up.gif
new file mode 100644
index 0000000..fd2d3de
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/sort-up.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/toolbar-arrow-down.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/toolbar-arrow-down.gif
new file mode 100644
index 0000000..32107ac
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/toolbar-arrow-down.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/toolbar-arrow-right.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/toolbar-arrow-right.gif
new file mode 100644
index 0000000..fc8b2e4
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/toolbar-arrow-right.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/undo_edit.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/undo_edit.gif
new file mode 100644
index 0000000..eae118a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/undo_edit.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/view-filter.gif b/org.eclipse.mylyn.commons.ui/icons/etool16/view-filter.gif
new file mode 100644
index 0000000..a5317bd
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/view-filter.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/etool16/web.png b/org.eclipse.mylyn.commons.ui/icons/etool16/web.png
new file mode 100644
index 0000000..94eec2c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/etool16/web.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/focus-view.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/focus-view.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/focus-view.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/more.png b/org.eclipse.mylyn.commons.ui/icons/eview16/more.png
new file mode 100644
index 0000000..1252a14
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/more.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/notification-close-active.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/notification-close-active.gif
new file mode 100644
index 0000000..8816521
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/notification-close-active.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/notification-close.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/notification-close.gif
new file mode 100644
index 0000000..17b7573
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/notification-close.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-completed.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-completed.gif
new file mode 100644
index 0000000..755f70d
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-completed.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-conflict.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-conflict.gif
new file mode 100644
index 0000000..d13a356
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-conflict.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-has-context.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-has-context.gif
new file mode 100644
index 0000000..c53adcf
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-has-context.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-has-due.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-has-due.gif
new file mode 100644
index 0000000..a0bb744
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-has-due.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming-multiple.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming-multiple.gif
new file mode 100644
index 0000000..db812df
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming-multiple.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming-new.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming-new.gif
new file mode 100644
index 0000000..fc5592c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming-new.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming.gif
new file mode 100644
index 0000000..e95e894
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-incoming.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing-new.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing-new.gif
new file mode 100644
index 0000000..5699bd3
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing-new.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing.gif
new file mode 100644
index 0000000..de83ff6
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-outgoing.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-overdue.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-overdue.gif
new file mode 100644
index 0000000..15b07bb
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-overdue.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-incoming-new.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-incoming-new.gif
new file mode 100644
index 0000000..a9dc04e
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-incoming-new.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-incoming.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-incoming.gif
new file mode 100644
index 0000000..ab5483d
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-incoming.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-outgoing.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-outgoing.gif
new file mode 100644
index 0000000..5f1c76a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/overlay-synch-outgoing.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/1.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/1.png
new file mode 100644
index 0000000..ec9b075
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/1.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/2.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/2.png
new file mode 100644
index 0000000..ffb9c84
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/2.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/3.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/3.png
new file mode 100644
index 0000000..d78a258
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/3.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/4.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/4.png
new file mode 100644
index 0000000..2b0cd62
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/4.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/5.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/5.png
new file mode 100644
index 0000000..f5b8cc1
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/5.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/6.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/6.png
new file mode 100644
index 0000000..bca79f4
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/6.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/7.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/7.png
new file mode 100644
index 0000000..53125db
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/7.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/progress/8.png b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/8.png
new file mode 100644
index 0000000..02bb604
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/progress/8.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/status-conflict.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/status-conflict.gif
new file mode 100644
index 0000000..1e364ac
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/status-conflict.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/status-normal.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/status-normal.gif
new file mode 100644
index 0000000..45b7594
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/status-normal.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/eview16/status-server-context.gif b/org.eclipse.mylyn.commons.ui/icons/eview16/status-server-context.gif
new file mode 100644
index 0000000..7323d96
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/eview16/status-server-context.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/browser-small.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/browser-small.gif
new file mode 100644
index 0000000..d4b0e39
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/browser-small.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/calendar-small.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/calendar-small.gif
new file mode 100644
index 0000000..d9629a1
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/calendar-small.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/complete.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/complete.gif
new file mode 100644
index 0000000..1f4f0c4
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/complete.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/file-image.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/file-image.gif
new file mode 100644
index 0000000..07e2598
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/file-image.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/file-plain.png b/org.eclipse.mylyn.commons.ui/icons/obj16/file-plain.png
new file mode 100644
index 0000000..735dd02
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/file-plain.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/message_info.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/message_info.gif
new file mode 100644
index 0000000..b484d9b
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/message_info.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/priority-1.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-1.gif
new file mode 100644
index 0000000..f256fa5
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-1.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/priority-2.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-2.gif
new file mode 100644
index 0000000..4e4b55f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-2.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/priority-3.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-3.gif
new file mode 100644
index 0000000..bc468f7
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-3.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/priority-4.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-4.gif
new file mode 100644
index 0000000..2bd543a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-4.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/priority-5.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-5.gif
new file mode 100644
index 0000000..30b6322
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/priority-5.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj16/question.gif b/org.eclipse.mylyn.commons.ui/icons/obj16/question.gif
new file mode 100644
index 0000000..7f6cded
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj16/question.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj32/priority-critical.png b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-critical.png
new file mode 100644
index 0000000..37362de
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-critical.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj32/priority-high.png b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-high.png
new file mode 100644
index 0000000..cd3889f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-high.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj32/priority-low.png b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-low.png
new file mode 100644
index 0000000..876e813
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-low.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj32/priority-none.png b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-none.png
new file mode 100644
index 0000000..ea9d9a1
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-none.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj32/priority-normal.png b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-normal.png
new file mode 100644
index 0000000..38716d2
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-normal.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/obj32/priority-very-low.png b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-very-low.png
new file mode 100644
index 0000000..876e813
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/obj32/priority-very-low.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-blank.gif b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-blank.gif
new file mode 100644
index 0000000..27e2998
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-blank.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-complete.gif b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-complete.gif
new file mode 100644
index 0000000..755f70d
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-complete.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-local-task.gif b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-local-task.gif
new file mode 100644
index 0000000..fa95ffc
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-local-task.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-warning.gif b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-warning.gif
new file mode 100644
index 0000000..4a63dd7
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/ovr16/overlay-warning.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/ovr16/solid-white.gif b/org.eclipse.mylyn.commons.ui/icons/ovr16/solid-white.gif
new file mode 100644
index 0000000..521055c
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/ovr16/solid-white.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/wizban/banner-discovery.png b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-discovery.png
new file mode 100644
index 0000000..cc4b2cf
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-discovery.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/wizban/banner-export.gif b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-export.gif
new file mode 100644
index 0000000..a22549f
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-export.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/wizban/banner-import.gif b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-import.gif
new file mode 100644
index 0000000..39bc01a
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-import.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/wizban/banner-screenshot.png b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-screenshot.png
new file mode 100644
index 0000000..c23f8ab
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/wizban/banner-screenshot.png differ
diff --git a/org.eclipse.mylyn.commons.ui/icons/wizban/keylock.gif b/org.eclipse.mylyn.commons.ui/icons/wizban/keylock.gif
new file mode 100644
index 0000000..2ed58db
Binary files /dev/null and b/org.eclipse.mylyn.commons.ui/icons/wizban/keylock.gif differ
diff --git a/org.eclipse.mylyn.commons.ui/plugin.properties b/org.eclipse.mylyn.commons.ui/plugin.properties
new file mode 100644
index 0000000..7157a46
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.commons.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Commons UI
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ColorCanvas.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ColorCanvas.java
new file mode 100644
index 0000000..de996b0
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ColorCanvas.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.ui;
+
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A tiny control just for color display
+ *
+ * @author Willian Mitsuda
+ */
+public class ColorCanvas extends Canvas {
+
+ private final Color color;
+
+ public ColorCanvas(Composite parent, int style, RGB rgb) {
+ super(parent, style);
+ color = new Color(parent.getDisplay(), rgb);
+ addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent e) {
+ e.gc.setBackground(color);
+ e.gc.fillRectangle(getClientArea());
+ }
+ });
+ addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ color.dispose();
+ }
+ });
+ }
+
+ public RGB getRGB() {
+ return color.getRGB();
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ColorSelectionWindow.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ColorSelectionWindow.java
new file mode 100644
index 0000000..4bbd375
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ColorSelectionWindow.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.ui;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Popup window for color selection
+ *
+ * @author Willian Mitsuda
+ */
+public class ColorSelectionWindow extends Window {
+
+ private ColorCanvas[] colors;
+
+ public ColorSelectionWindow(Shell shell) {
+ super(shell);
+ setShellStyle(SWT.BORDER);
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.addShellListener(new ShellAdapter() {
+
+ @Override
+ public void shellDeactivated(ShellEvent e) {
+ close();
+ }
+
+ });
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite colorComposite = new Composite(parent, SWT.NONE);
+ colorComposite.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_BLACK));
+ colorComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+ colorComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(8).spacing(1, 1).margins(1, 1).equalWidth(
+ true).create());
+
+ // EGA classic palette
+ colors = new ColorCanvas[16];
+ colors[0] = createColorCanvas(colorComposite, new RGB(0, 0, 0));
+ colors[1] = createColorCanvas(colorComposite, new RGB(0, 0, 170));
+ colors[2] = createColorCanvas(colorComposite, new RGB(0, 170, 0));
+ colors[3] = createColorCanvas(colorComposite, new RGB(0, 170, 170));
+ colors[4] = createColorCanvas(colorComposite, new RGB(170, 0, 0));
+ colors[5] = createColorCanvas(colorComposite, new RGB(170, 0, 170));
+ colors[6] = createColorCanvas(colorComposite, new RGB(170, 85, 0));
+ colors[7] = createColorCanvas(colorComposite, new RGB(170, 170, 170));
+ colors[8] = createColorCanvas(colorComposite, new RGB(85, 85, 85));
+ colors[9] = createColorCanvas(colorComposite, new RGB(85, 85, 255));
+ colors[10] = createColorCanvas(colorComposite, new RGB(85, 255, 85));
+ colors[11] = createColorCanvas(colorComposite, new RGB(85, 255, 255));
+ colors[12] = createColorCanvas(colorComposite, new RGB(255, 85, 85));
+ colors[13] = createColorCanvas(colorComposite, new RGB(255, 85, 255));
+ colors[14] = createColorCanvas(colorComposite, new RGB(255, 255, 85));
+ colors[15] = createColorCanvas(colorComposite, new RGB(255, 255, 255));
+
+ Button closeButton = new Button(parent, SWT.PUSH);
+ closeButton.setText(Messages.ColorSelectionWindow_Close);
+ closeButton.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+ closeButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ close();
+ }
+
+ });
+ return parent;
+ }
+
+ private ColorCanvas createColorCanvas(Composite parent, RGB rgb) {
+ final ColorCanvas canvas = new ColorCanvas(parent, SWT.NONE, rgb);
+ canvas.setLayoutData(GridDataFactory.fillDefaults().hint(16, 16).create());
+ canvas.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ selectedRGB = canvas.getRGB();
+ close();
+ }
+
+ });
+ return canvas;
+ }
+
+ private RGB selectedRGB;
+
+ public RGB getSelectedRGB() {
+ return selectedRGB;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CommonsUiPlugin.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CommonsUiPlugin.java
new file mode 100644
index 0000000..03975ed
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CommonsUiPlugin.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ */
+public class CommonsUiPlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.commons.ui"; //$NON-NLS-1$
+
+ private static CommonsUiPlugin plugin;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ public static CommonsUiPlugin getDefault() {
+ return plugin;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeContainerImageDescriptor.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeContainerImageDescriptor.java
new file mode 100644
index 0000000..f06f317
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeContainerImageDescriptor.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Mik Kersten
+ */
+public class CompositeContainerImageDescriptor extends CompositeImageDescriptor {
+
+ private final ImageData base;
+
+ private ImageData overlay;
+
+ protected Point size;
+
+ public CompositeContainerImageDescriptor(ImageDescriptor icon, ImageDescriptor overlay, boolean wide) {
+ this.base = getImageData(icon);
+ if (overlay != null) {
+ this.overlay = getImageData(overlay);
+ }
+ int width = CompositeElementImageDescriptor.WIDTH_ICON;
+ if (wide) {
+ width += CompositeElementImageDescriptor.OFFSET_DECORATION;
+ }
+ this.size = new Point(width, base.height);
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawImage(base, 0, 0);
+ if (overlay != null) {
+ drawImage(overlay, base.width + 2, 0);
+ }
+ }
+
+ private ImageData getImageData(ImageDescriptor descriptor) {
+ ImageData data = descriptor.getImageData();
+ // see bug 51965: getImageData can return null
+ if (data == null) {
+ data = DEFAULT_IMAGE_DATA;
+ }
+ return data;
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(size.x, size.y);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeElementImageDescriptor.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeElementImageDescriptor.java
new file mode 100644
index 0000000..c0948c5
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeElementImageDescriptor.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Mik Kersten
+ */
+public class CompositeElementImageDescriptor extends CompositeImageDescriptor {
+
+ private final ImageData base;
+
+ private ImageData kind;
+
+ protected Point size;
+
+ public static final int OFFSET_DECORATION = 6;
+
+ static final int WIDTH_ICON = 16;
+
+ private int offset = 0;
+
+ public CompositeElementImageDescriptor(ImageDescriptor icon, ImageDescriptor overlayKind, boolean wide) {
+ this.base = getImageData(icon);
+ if (overlayKind != null) {
+ this.kind = getImageData(overlayKind);
+ }
+ int width = WIDTH_ICON;
+ if (wide) {
+ width += OFFSET_DECORATION;
+ offset = OFFSET_DECORATION;
+ }
+ this.size = new Point(width, base.height);
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawImage(base, offset, 1);
+ if (kind != null) {
+ drawImage(kind, offset + 5, 6);
+ }
+ }
+
+ private ImageData getImageData(ImageDescriptor descriptor) {
+ ImageData data = descriptor.getImageData();
+ // see bug 51965: getImageData can return null
+ if (data == null) {
+ data = DEFAULT_IMAGE_DATA;
+ }
+ return data;
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(size.x, size.y);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeSyncImageDescriptor.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeSyncImageDescriptor.java
new file mode 100644
index 0000000..93c1716
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/CompositeSyncImageDescriptor.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Mik Kersten
+ */
+public class CompositeSyncImageDescriptor extends CompositeImageDescriptor {
+
+ private final ImageData base;
+
+ private final ImageData background;
+
+ private final boolean fillBackground;
+
+ protected Point size;
+
+ static int WIDTH;
+
+ public CompositeSyncImageDescriptor(ImageDescriptor icon, boolean fillBackground) {
+ this.base = getImageData(icon);
+ this.background = getImageData(CommonImages.OVERLAY_WHITE);
+ this.size = new Point(background.width, background.height);
+ this.fillBackground = fillBackground;
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ if (fillBackground) {
+ drawImage(background, 0, 0);
+ }
+ drawImage(base, 3, 2);
+ }
+
+ private ImageData getImageData(ImageDescriptor descriptor) {
+ ImageData data = descriptor.getImageData();
+ // see bug 51965: getImageData can return null
+ if (data == null) {
+ data = DEFAULT_IMAGE_DATA;
+ }
+ return data;
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(size.x, size.y);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ControlListItem.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ControlListItem.java
new file mode 100644
index 0000000..b2a67fa
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ControlListItem.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2008 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.ui;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Based on {@link org.eclipse.ui.internal.progress.ProgressInfoItem}.
+ *
+ * @author Steffen Pingel
+ */
+public abstract class ControlListItem extends Composite {
+
+ static String DARK_COLOR_KEY = "org.eclipse.mylyn.commons.ui.ControlListItem.DARK_COLOR"; //$NON-NLS-1$
+
+ interface IndexListener {
+ /**
+ * Select the item previous to the receiver.
+ */
+ public void selectPrevious();
+
+ /**
+ * Select the next previous to the receiver.
+ */
+ public void selectNext();
+
+ /**
+ * Select the receiver.
+ */
+ public void select();
+ }
+
+ IndexListener indexListener;
+
+ private int currentIndex;
+
+ private boolean selected;
+
+ private final MouseAdapter mouseListener;
+
+ private boolean isShowing = true;
+
+ private final MouseTrackAdapter mouseTrackListener;
+
+ private boolean hot;
+
+ static {
+ // Mac has different Gamma value
+ int shift = "carbon".equals(SWT.getPlatform()) ? -25 : -10;//$NON-NLS-1$
+
+ Color lightColor = PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+
+ // Determine a dark color by shifting the list color
+ RGB darkRGB = new RGB(Math.max(0, lightColor.getRed() + shift), Math.max(0, lightColor.getGreen() + shift),
+ Math.max(0, lightColor.getBlue() + shift));
+ JFaceResources.getColorRegistry().put(DARK_COLOR_KEY, darkRGB);
+ }
+
+ /**
+ * Create a new instance of the receiver with the specified parent, style and info object/
+ *
+ * @param parent
+ * @param style
+ * @param progressInfo
+ */
+ public ControlListItem(Composite parent, int style, Object element) {
+ super(parent, style | SWT.NO_FOCUS);
+ setData(element);
+ setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+ mouseListener = doCreateMouseListener();
+ mouseTrackListener = doCreateMouseTrackListener();
+ createContent();
+ registerChild(this);
+ Control[] children = getChildren();
+ for (Control child : children) {
+ registerChild(child);
+ }
+ setHot(false);
+ refresh();
+ }
+
+ private MouseTrackAdapter doCreateMouseTrackListener() {
+ return new MouseTrackAdapter() {
+ private int enterCount;
+
+ @Override
+ public void mouseEnter(MouseEvent e) {
+ enterCount++;
+ updateHotState();
+ }
+
+ @Override
+ public void mouseExit(MouseEvent e) {
+ enterCount--;
+ getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (!isDisposed()) {
+ updateHotState();
+ }
+ }
+ });
+ }
+
+ private void updateHotState() {
+ if (enterCount == 0) {
+ if (isHot()) {
+ setHot(false);
+ }
+ } else {
+ if (!isHot()) {
+ setHot(true);
+ }
+ }
+ }
+ };
+ }
+
+ private MouseAdapter doCreateMouseListener() {
+ return new MouseAdapter() {
+ @Override
+ public void mouseDown(MouseEvent e) {
+ if (indexListener != null) {
+ indexListener.select();
+ }
+ }
+ };
+ }
+
+ /**
+ * Create the child widgets of the receiver.
+ */
+ protected abstract void createContent();
+
+ public boolean isHot() {
+ return hot;
+ }
+
+ public void setHot(boolean hot) {
+ this.hot = hot;
+ }
+
+ protected void registerChild(Control child) {
+ child.addMouseListener(mouseListener);
+ child.addMouseTrackListener(mouseTrackListener);
+
+ }
+
+ /**
+ * Refresh the contents of the receiver.
+ */
+ protected abstract void refresh();
+
+ /**
+ * Set the color base on the index
+ *
+ * @param index
+ */
+ public void updateColors(int index) {
+ currentIndex = index;
+
+ if (selected) {
+ setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION));
+ setForeground(getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT));
+ } else {
+ if (index % 2 == 0) {
+ setBackground(JFaceResources.getColorRegistry().get(DARK_COLOR_KEY));
+ } else {
+ setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+ }
+ setForeground(getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND));
+ }
+ }
+
+ @Override
+ public void setForeground(Color color) {
+ super.setForeground(color);
+ Control[] children = getChildren();
+ for (Control child : children) {
+ child.setForeground(color);
+ }
+ }
+
+ @Override
+ public void setBackground(Color color) {
+ super.setBackground(color);
+ Control[] children = getChildren();
+ for (Control child : children) {
+ child.setBackground(color);
+ }
+ }
+
+ /**
+ * Set the selection colors.
+ *
+ * @param select
+ * boolean that indicates whether or not to show selection.
+ */
+ public void setSelected(boolean select) {
+ selected = select;
+ updateColors(currentIndex);
+ }
+
+ /**
+ * Set the listener for index changes.
+ *
+ * @param indexListener
+ */
+ void setIndexListener(IndexListener indexListener) {
+ this.indexListener = indexListener;
+ }
+
+ /**
+ * Return whether or not the receiver is selected.
+ *
+ * @return boolean
+ */
+ public boolean isSelected() {
+ return selected;
+ }
+
+ /**
+ * Set whether or not the receiver is being displayed based on the top and bottom of the currently visible area.
+ *
+ * @param top
+ * @param bottom
+ */
+ void setDisplayed(int top, int bottom) {
+ int itemTop = getLocation().y;
+ int itemBottom = itemTop + getBounds().height;
+ setDisplayed(itemTop <= bottom && itemBottom > top);
+
+ }
+
+ /**
+ * Set whether or not the receiver is being displayed
+ *
+ * @param displayed
+ */
+ private void setDisplayed(boolean displayed) {
+ // See if this element has been turned off
+ boolean refresh = !isShowing && displayed;
+ isShowing = displayed;
+ if (refresh) {
+ refresh();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ControlListViewer.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ControlListViewer.java
new file mode 100644
index 0000000..761454b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ControlListViewer.java
@@ -0,0 +1,487 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2008 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.ui;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+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.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * Based on {@link org.eclipse.ui.internal.progress.DetailedProgressViewer}.
+ *
+ * @author Steffen Pingel
+ */
+ at SuppressWarnings("restriction")
+public abstract class ControlListViewer extends StructuredViewer {
+
+ Composite control;
+
+ private final ScrolledComposite scrolled;
+
+ private final Composite noEntryArea;
+
+ protected boolean hasFocus;
+
+ /**
+ * Create a new instance of the receiver with a control that is a child of parent with style style.
+ *
+ * @param parent
+ * @param style
+ */
+ public ControlListViewer(Composite parent, int style) {
+ scrolled = new ScrolledComposite(parent, style);
+ int height = JFaceResources.getDefaultFont().getFontData()[0].getHeight();
+ scrolled.getVerticalBar().setIncrement(height * 2);
+ scrolled.setExpandHorizontal(true);
+ scrolled.setExpandVertical(true);
+
+ control = new Composite(scrolled, SWT.NONE) {
+ @Override
+ public boolean setFocus() {
+ forceFocus();
+ return true;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ updateSize(control);
+ }
+ }
+ };
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.horizontalSpacing = 0;
+ layout.verticalSpacing = 1;
+ control.setLayout(layout);
+ control.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+
+ control.addControlListener(new ControlListener() {
+ public void controlMoved(ControlEvent e) {
+ updateVisibleItems();
+
+ }
+
+ public void controlResized(ControlEvent e) {
+ updateVisibleItems();
+ }
+ });
+
+ scrolled.setContent(control);
+ hookControl(control);
+
+ noEntryArea = new Composite(scrolled, SWT.NONE);
+ doCreateNoEntryArea(noEntryArea);
+
+ scrolled.setExpandHorizontal(true);
+ scrolled.setExpandVertical(true);
+ scrolled.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ updateSize(scrolled.getContent());
+ }
+ });
+ control.addTraverseListener(new TraverseListener() {
+ private boolean handleEvent = true;
+
+ public void keyTraversed(TraverseEvent event) {
+ if (!handleEvent) {
+ return;
+ }
+ switch (event.detail) {
+ case SWT.TRAVERSE_ARROW_PREVIOUS: {
+ Control[] children = control.getChildren();
+ if (children.length > 0) {
+ boolean selected = false;
+ for (int i = 0; i < children.length; i++) {
+ ControlListItem item = (ControlListItem) children[i];
+ if (item.isSelected()) {
+ selected = true;
+ if (i > 0) {
+ setSelection(new StructuredSelection(children[i - 1].getData()), true);
+ }
+ break;
+ }
+ }
+ if (!selected) {
+ setSelection(new StructuredSelection(children[children.length - 1].getData()), true);
+ }
+ }
+ break;
+ }
+ case SWT.TRAVERSE_ARROW_NEXT: {
+ Control[] children = control.getChildren();
+ if (children.length > 0) {
+ boolean selected = false;
+ for (int i = 0; i < children.length; i++) {
+ ControlListItem item = (ControlListItem) children[i];
+ if (item.isSelected()) {
+ selected = true;
+ if (i < children.length - 1) {
+ setSelection(new StructuredSelection(children[i + 1].getData()), true);
+ }
+ break;
+ }
+ }
+ if (!selected) {
+ setSelection(new StructuredSelection(children[0].getData()), true);
+ }
+ }
+ break;
+ }
+ default:
+ handleEvent = false;
+ event.doit = true;
+ Control control = ControlListViewer.this.control;
+ Shell shell = control.getShell();
+ while (control != null) {
+ if (control.traverse(event.detail)) {
+ break;
+ }
+ if (!event.doit || control == shell) {
+ break;
+ }
+ control = control.getParent();
+ }
+ handleEvent = true;
+ break;
+ }
+ }
+ });
+ }
+
+ protected void doCreateNoEntryArea(Composite parent) {
+ }
+
+ public void add(Object[] elements) {
+ ViewerComparator sorter = getComparator();
+
+ // Use a Set in case we are getting something added that exists
+ Set<Object> newItems = new HashSet<Object>(elements.length);
+
+ Control[] existingChildren = control.getChildren();
+ for (Control element : existingChildren) {
+ if (element.getData() != null) {
+ newItems.add(element.getData());
+ }
+ }
+
+ for (Object element : elements) {
+ if (element != null) {
+ newItems.add(element);
+ }
+ }
+
+ Object[] infos = new Object[newItems.size()];
+ newItems.toArray(infos);
+
+ if (sorter != null) {
+ sorter.sort(this, infos);
+ }
+
+ // Update with the new elements to prevent flash
+ for (Control element : existingChildren) {
+ ((ControlListItem) element).dispose();
+ }
+
+ for (int i = 0; i < infos.length; i++) {
+ ControlListItem item = createNewItem(infos[i]);
+ item.updateColors(i);
+ }
+
+ control.layout(true);
+ doUpdateContent();
+ }
+
+ private void updateSize(Control control) {
+ if (control == null) {
+ return;
+ }
+ // XXX need a small offset in case the list has a scroll bar
+ Point size = control.computeSize(scrolled.getClientArea().width - 20, SWT.DEFAULT, true);
+ control.setSize(size);
+ scrolled.setMinSize(size);
+ }
+
+ protected void doUpdateContent() {
+ if (control.getChildren().length > 0) {
+ updateSize(control);
+ scrolled.setContent(control);
+ } else {
+ updateSize(noEntryArea);
+ scrolled.setContent(noEntryArea);
+ }
+ }
+
+ /**
+ * Create a new item for info.
+ *
+ * @param element
+ * @return ControlListItem
+ */
+ private ControlListItem createNewItem(Object element) {
+ final ControlListItem item = doCreateItem(control, element);
+// item.getChildren()[0].addPaintListener(new PaintListener() {
+// public void paintControl(PaintEvent e) {
+// if (hasFocus && item.isSelected()) {
+// Point size = item.getSize();
+// e.gc.setForeground(e.gc.getDevice().getSystemColor(SWT.COLOR_DARK_GRAY));
+// e.gc.setLineDash(new int[] { 1, 2 });
+// e.gc.drawRoundRectangle(0, 0, size.x - 1, size.y - 1, 5, 5);
+// }
+// }
+// });
+ item.setIndexListener(new ControlListItem.IndexListener() {
+ public void selectNext() {
+ Control[] children = control.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ if (item == children[i]) {
+ if (i < children.length - 1) {
+ setSelection(new StructuredSelection(children[i + 1].getData()));
+ }
+ break;
+ }
+ }
+ }
+
+ public void selectPrevious() {
+ Control[] children = control.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ if (item == children[i]) {
+ if (i > 0) {
+ setSelection(new StructuredSelection(children[i - 1].getData()));
+ }
+ break;
+ }
+ }
+ }
+
+ public void select() {
+ setSelection(new StructuredSelection(item.getData()));
+ setFocus();
+ }
+ });
+
+ // Refresh to populate with the current tasks
+ item.refresh();
+ return item;
+ }
+
+ protected abstract ControlListItem doCreateItem(Composite parent, Object element);
+
+ @Override
+ protected ControlListItem doFindInputItem(Object element) {
+ return null;
+ }
+
+ @Override
+ protected ControlListItem doFindItem(Object element) {
+ Control[] children = control.getChildren();
+ for (Control child : children) {
+ if (child.isDisposed() || child.getData() == null) {
+ continue;
+ }
+ if (child.getData().equals(element)) {
+ return (ControlListItem) child;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void doUpdateItem(Widget item, Object element, boolean fullMap) {
+ if (usingElementMap()) {
+ unmapElement(item);
+ }
+ item.dispose();
+ add(new Object[] { element });
+ }
+
+ @Override
+ public ScrolledComposite getControl() {
+ return scrolled;
+ }
+
+ @Override
+ protected List<?> getSelectionFromWidget() {
+ Control[] children = control.getChildren();
+ ArrayList<Object> selection = new ArrayList<Object>(children.length);
+ for (Control child : children) {
+ ControlListItem item = (ControlListItem) child;
+ if (item.isSelected() && item.getData() != null) {
+ selection.add(item.getData());
+ }
+ }
+ return selection;
+ }
+
+ @Override
+ protected void inputChanged(Object input, Object oldInput) {
+ super.inputChanged(input, oldInput);
+ refreshAll();
+ doUpdateContent();
+ }
+
+ @Override
+ protected void internalRefresh(Object element) {
+ if (element == null) {
+ return;
+ }
+
+ if (element.equals(getRoot())) {
+ refreshAll();
+ return;
+ }
+ Widget widget = findItem(element);
+ if (widget == null) {
+ add(new Object[] { element });
+ return;
+ }
+ ((ControlListItem) widget).refresh();
+
+ updateSize(control);
+ }
+
+ public void remove(Object[] elements) {
+ for (Object element : elements) {
+ Widget item = doFindItem(element);
+ if (item != null) {
+ unmapElement(element);
+ item.dispose();
+ }
+ }
+
+ Control[] existingChildren = control.getChildren();
+ for (int i = 0; i < existingChildren.length; i++) {
+ ControlListItem item = (ControlListItem) existingChildren[i];
+ item.updateColors(i);
+ }
+ control.layout(true);
+ doUpdateContent();
+ }
+
+ @Override
+ public void reveal(Object element) {
+ Control control = doFindItem(element);
+ if (control != null) {
+ revealControl(control);
+ }
+ }
+
+ private void revealControl(Control control) {
+ Rectangle clientArea = scrolled.getClientArea();
+ Point origin = scrolled.getOrigin();
+ Point location = control.getLocation();
+ Point size = control.getSize();
+ if (location.y + size.y > origin.y + clientArea.height) {
+ scrolled.setOrigin(origin.x, location.y + size.y - clientArea.height);
+ }
+ if (location.y < origin.y) {
+ scrolled.setOrigin(origin.x, location.y);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void setSelectionToWidget(List list, boolean reveal) {
+ HashSet<Object> elements = new HashSet<Object>(list);
+ Control[] children = control.getChildren();
+ for (Control control : children) {
+ ControlListItem child = (ControlListItem) control;
+ boolean selected = elements.contains(child.getData());
+ if (selected != child.isSelected()) {
+ child.setSelected(selected);
+ }
+ if (reveal && selected) {
+ revealControl(child);
+ reveal = false;
+ }
+ }
+ }
+
+ /**
+ * Set focus on the current selection.
+ */
+ public void setFocus() {
+ Control[] children = control.getChildren();
+ if (children.length > 0) {
+ // causes the item's tool bar to get focus when clicked which is undesirable
+// for (Control element : children) {
+// ControlListItem item = (ControlListItem) element;
+// if (item.isSelected()) {
+// if (item.setFocus()) {
+// return;
+// }
+// }
+// }
+ control.forceFocus();
+ } else {
+ noEntryArea.setFocus();
+ }
+ }
+
+ /**
+ * Refresh everything as the root is being refreshed.
+ */
+ private void refreshAll() {
+ Object[] infos = getSortedChildren(getRoot());
+ Control[] existingChildren = control.getChildren();
+
+ for (Control element : existingChildren) {
+ element.dispose();
+ }
+
+ for (int i = 0; i < infos.length; i++) {
+ ControlListItem item = createNewItem(infos[i]);
+ item.updateColors(i);
+ }
+
+ control.layout(true);
+ doUpdateContent();
+ }
+
+ /**
+ * Set the virtual items to be visible or not depending on the displayed area.
+ */
+ private void updateVisibleItems() {
+ Control[] children = control.getChildren();
+ int top = scrolled.getOrigin().y;
+ int bottom = top + scrolled.getParent().getBounds().height;
+ for (Control element : children) {
+ ControlListItem item = (ControlListItem) element;
+ item.setDisplayed(top, bottom);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/Messages.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/Messages.java
new file mode 100644
index 0000000..4d75661
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/Messages.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.commons.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String WorkbenchUtil_Browser_Initialization_Failed;
+
+ public static String WorkbenchUtil_Invalid_URL_Error;
+
+ public static String WorkbenchUtil_No_URL_Error;
+
+ public static String WorkbenchUtil_Open_Location_Title;
+
+ public static String ColorSelectionWindow_Close;
+
+ public static String SwtUtil_Fading;
+
+ public static String AbstractFilteredTree_Find;
+
+ public static String AbstractNotificationPopup_Close_Notification_Job;
+
+ public static String AbstractNotificationPopup_Notification;
+
+ public static String DatePicker_Choose_Date;
+
+ public static String DateSelectionDialog_Clear;
+
+ public static String DateSelectionDialog_Date_Selection;
+
+ public static String ScreenshotCreationPage_After_capturing;
+
+ public static String ScreenshotCreationPage_Annotate;
+
+ public static String ScreenshotCreationPage_Capture_Desktop;
+
+ public static String ScreenshotCreationPage_Capture_Desktop_C;
+
+ public static String ScreenshotCreationPage_CAPTURE_SCRRENSHOT;
+
+ public static String ScreenshotCreationPage_Clear_all_annotations_made_on_screenshot_image;
+
+ public static String ScreenshotCreationPage_Clear;
+
+ public static String ScreenshotCreationPage_Undo;
+
+ public static String ScreenshotCreationPage_Undo_annotation;
+
+ public static String ScreenshotCreationPage_Redo;
+
+ public static String ScreenshotCreationPage_Redo_annotation;
+
+ public static String ScreenshotCreationPage_Crop;
+
+ public static String ScreenshotCreationPage_Crop_R;
+
+ public static String ScreenshotCreationPage_DRAW_ANNOTATION_ON_SCREENSHOT_IMAGE;
+
+ public static String ScreenshotCreationPage_Fit_Image;
+
+ public static String ScreenshotCreationPage_Fit_Image_F;
+
+ public static String ScreenshotCreationPage_NOTE_THAT_YOU_CONTINUTE;
+
+ public static String ScreenshotCreationPage_Show_Line_Type_Selector;
+
+ public static String ScreenshotCreationPage_Show_Line_Bold_Selector;
+
+ public static String SelectToolAction_Font_Bold;
+
+ public static String SelectToolAction_Font_Italic;
+
+ public static String SelectToolAction_Font_Name_Size;
+
+ public static String SelectToolAction_1dot;
+
+ public static String SelectToolAction_2dots;
+
+ public static String SelectToolAction_4dots;
+
+ public static String SelectToolAction_8dots;
+
+ public static String SelectToolAction_Clipboard;
+
+ public static String SelectToolAction_Desktop;
+
+ public static String SelectToolAction_File;
+
+ public static String SelectToolAction_Rectangle;
+
+ public static String SelectToolAction_Round_Rectangle;
+
+ public static String SelectToolAction_Oval;
+
+ public static String SelectToolAction_Fill_Rectangle;
+
+ public static String SelectToolAction_Fill_Round_Rectangle;
+
+ public static String SelectToolAction_Fill_Oval;
+
+ public static String SelectToolAction_Free;
+
+ public static String SelectToolAction_Line;
+
+ public static String SelectToolAction_Single_Side_Arrow;
+
+ public static String SelectToolAction_Both_Side_Arrow;
+
+ public static String SelectToolAction_Dashed_Line;
+
+ public static String SelectToolAction_Dashed_Line_1_dot;
+
+ public static String SelectToolAction_Dashed_Line_2_dots;
+
+ public static String SelectToolAction_Dotted_Line;
+
+ public static String SelectToolAction_Solid_Line;
+
+ public static String SelectToolAction_Fit;
+
+ public static String SelectToolAction_ZoomHalf;
+
+ public static String SelectToolAction_Zoom1X;
+
+ public static String SelectToolAction_Zoom2X;
+
+ public static String SelectToolAction_Zoom4X;
+
+ public static String SelectToolAction_Zoom8X;
+
+ public static String SelectToolAction_Selected_Rectangle;
+
+ public static String SelectToolAction_Font_;
+
+ public static String SelectToolAction_Color_;
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/NotificationPopupColors.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/NotificationPopupColors.java
new file mode 100644
index 0000000..b81f617
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/NotificationPopupColors.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Benjamin Pasero - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.ui;
+
+import org.eclipse.jface.resource.DeviceResourceException;
+import org.eclipse.jface.resource.ResourceManager;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Helper Class to create the colors for the {@link AbstractNotificationPopup}.
+ * <p>
+ * Note: Copied from FormColors of UI Forms.
+ * </p>
+ *
+ * @author Benjamin Pasero (initial contribution from RSSOwl, see bug 177974)
+ * @author Mik Kersten
+ */
+public class NotificationPopupColors {
+
+ private final Display display;
+
+ private Color titleText;
+
+ private Color gradientBegin;
+
+ private Color gradientEnd;
+
+ private Color border;
+
+ private final ResourceManager resourceManager;
+
+ public NotificationPopupColors(Display display, ResourceManager resourceManager) {
+ this.display = display;
+ this.resourceManager = resourceManager;
+
+ createColors();
+ }
+
+ private void createColors() {
+ createBorderColor();
+ createGradientColors();
+ // previously used SWT.COLOR_TITLE_INACTIVE_FOREGROUND, but too light on Windows XP
+ titleText = getColor(resourceManager, getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
+ }
+
+ public Color getGradientBegin() {
+ return gradientBegin;
+ }
+
+ public Color getGradientEnd() {
+ return gradientEnd;
+ }
+
+ public Color getBorder() {
+ return border;
+ }
+
+ public Color getTitleText() {
+ return titleText;
+ }
+
+ private void createBorderColor() {
+ RGB tbBorder = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
+ RGB bg = getImpliedBackground().getRGB();
+
+ // Group 1
+ // Rule: If at least 2 of the RGB values are equal to or between 180 and
+ // 255, then apply specified opacity for Group 1
+ // Examples: Vista, XP Silver, Wn High Con #2
+ // Keyline = TITLE_BACKGROUND @ 70% Opacity over LIST_BACKGROUND
+ if (testTwoPrimaryColors(tbBorder, 179, 256)) {
+ tbBorder = blend(tbBorder, bg, 70);
+ } else if (testTwoPrimaryColors(tbBorder, 120, 180)) {
+ tbBorder = blend(tbBorder, bg, 50);
+ } else {
+ tbBorder = blend(tbBorder, bg, 30);
+ }
+
+ border = getColor(resourceManager, tbBorder);
+ }
+
+ private void createGradientColors() {
+ RGB titleBg = getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
+ Color bgColor = getImpliedBackground();
+ RGB bg = bgColor.getRGB();
+ RGB bottom, top;
+
+ // Group 1
+ // Rule: If at least 2 of the RGB values are equal to or between 180 and
+ // 255, then apply specified opacity for Group 1
+ // Examples: Vista, XP Silver, Wn High Con #2
+ // Gradient Bottom = TITLE_BACKGROUND @ 30% Opacity over LIST_BACKGROUND
+ // Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
+ if (testTwoPrimaryColors(titleBg, 179, 256)) {
+ bottom = blend(titleBg, bg, 30);
+ top = bg;
+ }
+
+ // Group 2
+ // Rule: If at least 2 of the RGB values are equal to or between 121 and
+ // 179, then apply specified opacity for Group 2
+ // Examples: XP Olive, OSX Graphite, Linux GTK, Wn High Con Black
+ // Gradient Bottom = TITLE_BACKGROUND @ 20% Opacity over LIST_BACKGROUND
+ // Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
+ else if (testTwoPrimaryColors(titleBg, 120, 180)) {
+ bottom = blend(titleBg, bg, 20);
+ top = bg;
+ }
+
+ // Group 3
+ // Rule: If at least 2 of the RGB values are equal to or between 0 and
+ // 120, then apply specified opacity for Group 3
+ // Examples: XP Default, Wn Classic Standard, Wn Marine, Wn Plum, OSX
+ // Aqua, Wn High Con White, Wn High Con #1
+ // Gradient Bottom = TITLE_BACKGROUND @ 10% Opacity over LIST_BACKGROUND
+ // Gradient Top = TITLE BACKGROUND @ 0% Opacity over LIST_BACKGROUND
+ else {
+ bottom = blend(titleBg, bg, 10);
+ top = bg;
+ }
+
+ gradientBegin = getColor(resourceManager, top);
+ gradientEnd = getColor(resourceManager, bottom);
+ }
+
+ private RGB blend(RGB c1, RGB c2, int ratio) {
+ int r = blend(c1.red, c2.red, ratio);
+ int g = blend(c1.green, c2.green, ratio);
+ int b = blend(c1.blue, c2.blue, ratio);
+ return new RGB(r, g, b);
+ }
+
+ private int blend(int v1, int v2, int ratio) {
+ int b = (ratio * v1 + (100 - ratio) * v2) / 100;
+ return Math.min(255, b);
+ }
+
+ private boolean testTwoPrimaryColors(RGB rgb, int from, int to) {
+ int total = 0;
+ if (testPrimaryColor(rgb.red, from, to)) {
+ total++;
+ }
+ if (testPrimaryColor(rgb.green, from, to)) {
+ total++;
+ }
+ if (testPrimaryColor(rgb.blue, from, to)) {
+ total++;
+ }
+ return total >= 2;
+ }
+
+ private boolean testPrimaryColor(int value, int from, int to) {
+ return value > from && value < to;
+ }
+
+ private RGB getSystemColor(int code) {
+ return getDisplay().getSystemColor(code).getRGB();
+ }
+
+ private Color getImpliedBackground() {
+ return display.getSystemColor(SWT.COLOR_LIST_BACKGROUND);
+ }
+
+ private Display getDisplay() {
+ return display;
+ }
+
+ private Color getColor(ResourceManager manager, RGB rgb) {
+ try {
+ return manager.createColor(rgb);
+ } catch (DeviceResourceException e) {
+ return manager.getDevice().getSystemColor(SWT.COLOR_BLACK);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ScreenshotImages.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ScreenshotImages.java
new file mode 100644
index 0000000..73da94f
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/ScreenshotImages.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Hiroyuki Inaba 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:
+ * Hiroyuki Inaba - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.commons.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @author Hiroyuki Inaba
+ */
+public class ScreenshotImages {
+
+ private static final URL baseURL = CommonsUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$
+
+ private static final String T_TOOL = "etool16"; //$NON-NLS-1$
+
+ private static final String T_DRAW = "draw16"; //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_FREE = create(T_DRAW, "edit_free.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_LINE = create(T_DRAW, "edit_line.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_BOX = create(T_DRAW, "edit_box.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_RBOX = create(T_DRAW, "edit_rbox.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_OVAL = create(T_DRAW, "edit_oval.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_FILL_BOX = create(T_DRAW, "edit_fill_box.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_FILL_RBOX = create(T_DRAW, "edit_fill_rbox.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_FILL_OVAL = create(T_DRAW, "edit_fill_oval.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_ARROW1 = create(T_DRAW, "edit_arrow1.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_ARROW2 = create(T_DRAW, "edit_arrow2.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_UNDO = create(T_TOOL, "undo_edit.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT_REDO = create(T_TOOL, "redo_edit.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILE_OBJ = create(T_TOOL, "file_obj.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CLIPBOARD_OBJ = create(T_TOOL, "clipboard_obj.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor MONITOR_OBJ = create(T_TOOL, "monitor_obj.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_SOLD = create(T_DRAW, "line_sold.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_DOT = create(T_DRAW, "line_dot.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_DASH = create(T_DRAW, "line_dash.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_DASH1D = create(T_DRAW, "line_dash1d.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_DASH2D = create(T_DRAW, "line_dash2d.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_BOLD1 = create(T_DRAW, "line_bold1.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_BOLD2 = create(T_DRAW, "line_bold2.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_BOLD4 = create(T_DRAW, "line_bold4.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINE_BOLD8 = create(T_DRAW, "line_bold8.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor SEL_RECT = create(T_TOOL, "select_rect.gif"); //$NON-NLS-1$
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuffer buffer = new StringBuffer(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/SelectToolAction.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/SelectToolAction.java
new file mode 100644
index 0000000..fe973fc
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/SelectToolAction.java
@@ -0,0 +1,907 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Hiroyuki Inaba 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:
+ * Hiroyuki Inaba - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.commons.ui;
+
+import java.lang.reflect.Method;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.ColorDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.FontDialog;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Hiroyuki Inaba
+ */
+public class SelectToolAction extends Action implements IMenuCreator {
+
+ public static final int CAPTURE_DROP_DOWN_MENU = 1;
+
+ public static final int ZOOM_DROP_DOWN_MENU = 2;
+
+ public static final int DRAWLINE_TOOLBAR = 3;
+
+ public static final int DRAWARROW_TOOLBAR = 4;
+
+ public static final int DRAWBOX_TOOLBAR = 5;
+
+ public static final int DRAWTEXT_TOOLBAR = 6;
+
+ public static final int LINETYPE_TOOLBAR = 7;
+
+ public static final int LINEBOLD_TOOLBAR = 8;
+
+ public static final int COLOR_TOOLBAR = 9;
+
+ public SelectToolAction(Composite parent, int tool) {
+ this(parent, "", tool); //$NON-NLS-1$
+ }
+
+ public SelectToolAction(String label, int tool) {
+ this(null, label, tool);
+ }
+
+ public SelectToolAction(Composite parent, String label, int tool) {
+ super(label, AS_DROP_DOWN_MENU);
+ setMenuCreator(this);
+ showMenuAlways = true;
+ this.parent = parent;
+ setToolAction(tool);
+ }
+
+ private void setToolAction(int tool) {
+ if (tool == CAPTURE_DROP_DOWN_MENU) {
+ selectedItemID = CAPTURE_DESKTOP;
+ initMenu(
+ tool,
+ new ToolActionItem[] {
+ new ToolActionItem(CAPTURE_DESKTOP, Messages.SelectToolAction_Desktop,
+ ScreenshotImages.MONITOR_OBJ), //
+ new ToolActionItem(CAPTURE_CLIPBOARD, Messages.SelectToolAction_Clipboard,
+ ScreenshotImages.CLIPBOARD_OBJ), //
+ new ToolActionItem(CAPTURE_FILE, Messages.SelectToolAction_File, ScreenshotImages.FILE_OBJ),
+ new ToolActionItem(CAPTURE_RECTANGLE, Messages.SelectToolAction_Selected_Rectangle,
+ ScreenshotImages.SEL_RECT) });
+ return;
+ }
+
+ if (tool == ZOOM_DROP_DOWN_MENU) {
+ selectedItemID = ZOOM_FIT;
+ initMenu(tool, new ToolActionItem[] { new ToolActionItem(ZOOM_FIT, Messages.SelectToolAction_Fit, null),
+ new ToolActionItem(50, Messages.SelectToolAction_ZoomHalf, null),
+ new ToolActionItem(100, Messages.SelectToolAction_Zoom1X, null),
+ new ToolActionItem(200, Messages.SelectToolAction_Zoom2X, null),
+ new ToolActionItem(400, Messages.SelectToolAction_Zoom4X, null),
+ new ToolActionItem(800, Messages.SelectToolAction_Zoom8X, null) });
+ return;
+ }
+
+ if (tool == LINETYPE_TOOLBAR) {
+ selectedItemID = SWT.LINE_SOLID;
+ initBar(tool,
+ new ToolActionItem[] {
+ new ToolActionItem(SWT.LINE_SOLID, Messages.SelectToolAction_Solid_Line,
+ ScreenshotImages.LINE_SOLD),
+ new ToolActionItem(SWT.LINE_DOT, Messages.SelectToolAction_Dotted_Line,
+ ScreenshotImages.LINE_DOT),
+ new ToolActionItem(SWT.LINE_DASH, Messages.SelectToolAction_Dashed_Line,
+ ScreenshotImages.LINE_DASH),
+ new ToolActionItem(SWT.LINE_DASHDOT, Messages.SelectToolAction_Dashed_Line_1_dot,
+ ScreenshotImages.LINE_DASH1D),
+ new ToolActionItem(SWT.LINE_DASHDOTDOT, Messages.SelectToolAction_Dashed_Line_2_dots,
+ ScreenshotImages.LINE_DASH2D) });
+ return;
+ }
+
+ if (tool == DRAWLINE_TOOLBAR) {
+ showSelection = true;
+ selectedItemID = DRAW_FREE;
+ initBar(tool, new ToolActionItem[] {
+ new ToolActionItem(DRAW_FREE, Messages.SelectToolAction_Free, ScreenshotImages.EDIT_FREE),
+ new ToolActionItem(DRAW_LINE, Messages.SelectToolAction_Line, ScreenshotImages.EDIT_LINE) });
+ return;
+ }
+ if (tool == DRAWARROW_TOOLBAR) {
+ showSelection = true;
+ selectedItemID = DRAW_ARROW1;
+ initBar(tool, new ToolActionItem[] {
+ new ToolActionItem(DRAW_ARROW1, Messages.SelectToolAction_Single_Side_Arrow,
+ ScreenshotImages.EDIT_ARROW1),
+ new ToolActionItem(DRAW_ARROW2, Messages.SelectToolAction_Both_Side_Arrow,
+ ScreenshotImages.EDIT_ARROW2) });
+ selectedItemID = -1;
+ return;
+ }
+ if (tool == DRAWBOX_TOOLBAR) {
+ showSelection = true;
+ selectedItemID = DRAW_RBOX;
+ initBar(
+ tool,
+ new ToolActionItem[] {
+ new ToolActionItem(DRAW_BOX, Messages.SelectToolAction_Rectangle, ScreenshotImages.EDIT_BOX),
+ new ToolActionItem(DRAW_RBOX, Messages.SelectToolAction_Round_Rectangle,
+ ScreenshotImages.EDIT_RBOX),
+ new ToolActionItem(DRAW_OVAL, Messages.SelectToolAction_Oval, ScreenshotImages.EDIT_OVAL),
+ new ToolActionItem(DRAW_FILL_BOX, Messages.SelectToolAction_Fill_Rectangle,
+ ScreenshotImages.EDIT_FILL_BOX),
+ new ToolActionItem(DRAW_FILL_RBOX, Messages.SelectToolAction_Fill_Round_Rectangle,
+ ScreenshotImages.EDIT_FILL_RBOX),
+ new ToolActionItem(DRAW_FILL_OVAL, Messages.SelectToolAction_Fill_Oval,
+ ScreenshotImages.EDIT_FILL_OVAL) });
+ selectedItemID = -1;
+ return;
+ }
+ if (tool == DRAWTEXT_TOOLBAR) {
+ showSelection = true;
+ selectedItemID = DRAW_TEXT;
+ // Bug:266123 Set initial font as HEADER_FONT
+ FontData fontData = JFaceResources.getFont(JFaceResources.HEADER_FONT).getFontData()[0];
+ stringCustom = fontData.toString();
+ intgerCustom = rgb2int(255, 0, 0);
+ selectedItemID = intgerCustom;
+ initFont(tool);
+ selectedItemID = -1;
+ return;
+ }
+
+ if (tool == LINEBOLD_TOOLBAR) {
+ selectedItemID = 4;
+ initBar(tool, new ToolActionItem[] {
+ new ToolActionItem(1, Messages.SelectToolAction_1dot, ScreenshotImages.LINE_BOLD1),
+ new ToolActionItem(2, Messages.SelectToolAction_2dots, ScreenshotImages.LINE_BOLD2),
+ new ToolActionItem(4, Messages.SelectToolAction_4dots, ScreenshotImages.LINE_BOLD4),
+ new ToolActionItem(8, Messages.SelectToolAction_8dots, ScreenshotImages.LINE_BOLD8) });
+ return;
+ }
+
+ if (tool == COLOR_TOOLBAR) {
+ intgerCustom = rgb2int(255, 85, 85);
+ selectedItemID = intgerCustom;
+ initColor(tool);
+ return;
+ }
+ }
+
+ private void initBar(int tool, ToolActionItem[] items) {
+ this.items = items;
+ setId(tool + ""); //$NON-NLS-1$
+ toolButton = new ToolComposite(parent, SWT.CASCADE) {
+
+ @Override
+ public void clickBody() {
+ selectAndRun(getToolTipText(), null);
+ }
+
+ @Override
+ public void clickMenu(int x, int y) {
+ dropDownMenu = new Menu(parent.getShell(), SWT.POP_UP);
+ addActionsToMenu();
+ Point p = parent.toDisplay(x, y);
+ dropDownMenu.setLocation(p.x, p.y);
+ dropDownMenu.setVisible(true);
+ dropDownMenu = null;
+ }
+
+ @Override
+ public boolean isSelect() {
+ return (selectedItemID >= 0);
+ }
+ };
+
+ if (items != null) {
+ for (ToolActionItem actionItem : items) {
+ if (actionItem.id == selectedItemID) {
+ toolButton.setImage(actionItem.image.createImage());
+ toolButton.setToolTipText(actionItem.label);
+ }
+ }
+ }
+ }
+
+ private void initFont(int tool) {
+ this.items = null;
+ setId(tool + ""); //$NON-NLS-1$
+ toolButton = new ToolComposite(parent, SWT.CASCADE) {
+
+ @Override
+ public void clickBody() {
+ selectedItemID = DRAW_TEXT;
+ if (toolButton != null) {
+ FontData fontData = new FontData(stringCustom);
+ toolButton.setImage(createFontImage(fontData, int2rgb(intgerCustom), true));
+ toolButton.redraw();
+ }
+ run();
+ }
+
+ @Override
+ public void clickMenu(int x, int y) {
+ if (Platform.getWS().equalsIgnoreCase(Platform.WS_WIN32)
+ || Platform.getWS().equalsIgnoreCase(Platform.WS_WPF)) {
+ invokeFontDialog();
+ } else {
+ Menu rightClickMenu = new Menu(parent.getShell(), SWT.POP_UP);
+ MenuItem menuItem = new MenuItem(rightClickMenu, SWT.PUSH);
+ menuItem.setText(Messages.SelectToolAction_Font_);
+ menuItem.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(final Event event) {
+ invokeFontDialog();
+ }
+ });
+ menuItem = new MenuItem(rightClickMenu, SWT.PUSH);
+ menuItem.setText(Messages.SelectToolAction_Color_);
+ menuItem.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(final Event event) {
+ invokeColorDialog();
+ }
+ });
+ Point p = parent.toDisplay(x, y);
+ rightClickMenu.setLocation(p.x, p.y);
+ rightClickMenu.setVisible(true);
+ }
+ }
+
+ @Override
+ public boolean isSelect() {
+ return (selectedItemID >= 0);
+ }
+
+ public void invokeFontDialog() {
+ FontData fontData = new FontData(stringCustom);
+ FontDialog fontWindow = new FontDialog(parent.getShell());
+ fontWindow.setFontList(new FontData[] { fontData });
+ fontWindow.setRGB(int2rgb(intgerCustom));
+ fontData = fontWindow.open();
+ if (fontData != null) {
+ intgerCustom = rgb2int(fontWindow.getRGB());
+ stringCustom = fontData.toString();
+ toolButton.setToolTipText(font2string(fontData));
+ clickBody();
+ }
+ }
+
+ public void invokeColorDialog() {
+ ColorDialog colorWindow = new ColorDialog(parent.getShell());
+ colorWindow.setRGB(int2rgb(intgerCustom));
+ RGB rgb = colorWindow.open();
+ if (rgb != null) {
+ intgerCustom = rgb2int(rgb);
+ clickBody();
+ }
+ }
+ };
+
+ FontData fontData = new FontData(stringCustom);
+ toolButton.setToolTipText(font2string(fontData));
+ toolButton.setImage(createFontImage(fontData, int2rgb(intgerCustom), false));
+ }
+
+ private void initColor(int tool) {
+ this.items = null;
+ setId(tool + ""); //$NON-NLS-1$
+ toolButton = new ToolComposite(parent, SWT.NONE) {
+
+ @Override
+ public void clickMenu(int x, int y) {
+ ColorDialog colorWindow = new ColorDialog(parent.getShell());
+ colorWindow.setRGB(int2rgb(intgerCustom));
+ RGB rgb = colorWindow.open();
+ if (rgb != null) {
+ intgerCustom = rgb2int(rgb);
+ selectedItemID = intgerCustom;
+ toolButton.setImage(createColorImage(int2rgb(intgerCustom)));
+ toolButton.redraw();
+ }
+ }
+ };
+ toolButton.setToolTipText(""); //$NON-NLS-1$
+ toolButton.setImage(createColorImage(int2rgb(intgerCustom)));
+ }
+
+ private Image createColorImage(RGB rgb) {
+ Display display = parent.getDisplay();
+ Color BACKGROUND = display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
+ Color DARK_GRAY = display.getSystemColor(SWT.COLOR_DARK_GRAY);
+ int x = 16, y = 16;
+ Image image = new Image(display, x, y);
+ GC gc = new GC(image);
+ gc.setForeground(DARK_GRAY);
+ gc.setBackground(BACKGROUND);
+ gc.fillRectangle(0, 0, x, y);
+ gc.setBackground(new Color(display, rgb));
+ gc.fillRectangle(1, 2, x - 2, y - 4);
+ gc.drawRectangle(1, 2, x - 3, y - 5);
+ gc.dispose();
+ return image;
+ }
+
+ private Image createFontImage(FontData fontData, RGB rgb, boolean select) {
+ Display display = parent.getDisplay();
+ Color ButtonFace = display.getSystemColor((select) ? SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW
+ : SWT.COLOR_WIDGET_BACKGROUND);
+ int x = 16, y = 16;
+ Image image = new Image(display, x, y);
+ GC gc = new GC(image);
+ gc.setBackground(ButtonFace);
+ gc.fillRectangle(0, 0, x, y);
+ String label = "A"; //$NON-NLS-1$
+ fontData.height = 11;
+ gc.setFont(new Font(display, fontData));
+ gc.setForeground(new Color(display, rgb));
+ Point sz = gc.textExtent(label);
+ gc.drawText(label, (x - sz.x) / 2, (y - sz.y) / 2 + 1, true);
+ gc.dispose();
+ return image;
+ }
+
+ private void initMenu(int tool, ToolActionItem[] items) {
+ this.items = items;
+ setId(tool + ""); //$NON-NLS-1$
+ if (items != null) {
+ setImageDescriptor(items[0].image);
+ setToolTipText(items[0].label);
+ selectedItemID = items[0].id;
+ }
+ }
+
+ private class ToolActionItem {
+ int id;
+
+ String label;
+
+ ImageDescriptor image;
+
+ ToolActionItem(int id, String label, ImageDescriptor image) {
+ this.id = id;
+ this.label = label;
+ this.image = image;
+ }
+ }
+
+ private class ToolComposite extends Composite {
+ private Image image;
+
+ private final boolean bMenu;
+
+ private boolean bMouse;
+
+ private static final int S = 1; // Border for Selected rectangle
+
+ private static final int B = 2; // Border for Shadow rectangle
+
+ private static final int G = 3; // Gap
+
+ private static final int M = 4; // Image width for Sub menu
+
+ private final Point iconSize = new Point(S + B + 16 + B + S, S + B + 16 + B + S);
+
+ private final Point maxSize = new Point(iconSize.x + G + M + G, iconSize.y);
+
+ public ToolComposite(Composite parent, int style) {
+ super(parent, style);
+ bMenu = (style & SWT.CASCADE) != 0;
+
+ addListener(SWT.Paint, new Listener() {
+ public void handleEvent(Event e) {
+ Color background = e.gc.getBackground();
+ Color foreground = e.gc.getForeground();
+ Display display = e.widget.getDisplay();
+ Color NORMAL_SHADOW = display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
+ boolean enabled = getEnabled();
+ if (bMouse && enabled) {
+ e.gc.setForeground(NORMAL_SHADOW);
+ if (bMenu) {
+ e.gc.drawRectangle(0, 0, maxSize.x - 1, maxSize.y - 1);
+ e.gc.drawLine(iconSize.x, 0, iconSize.x, maxSize.y);
+ } else {
+ e.gc.drawRectangle(0, 0, iconSize.x - 1, iconSize.y - 1);
+ }
+ }
+ if (showSelection && isSelect() && enabled) {
+ Color HIGHLIGHT_SHADOW = display.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);
+ Color LIGHT_SHADOW = display.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
+ Color SELECTION = display.getSystemColor(SWT.COLOR_LIST_SELECTION);
+ e.gc.setBackground(HIGHLIGHT_SHADOW);
+ e.gc.fillRectangle(0, 0, iconSize.x, iconSize.y);
+ e.gc.setForeground(NORMAL_SHADOW);
+ e.gc.drawLine(S, S, iconSize.x - S - 1, S);
+ e.gc.drawLine(S + 1, S + 1, iconSize.x - S - 2, S + 1);
+ e.gc.drawLine(S, S, S, iconSize.y - S - 1);
+ e.gc.drawLine(S + 1, S + 1, S + 1, iconSize.y - S - 2);
+ e.gc.setForeground(HIGHLIGHT_SHADOW);
+ e.gc.drawLine(iconSize.x - S - 1, S + 1, iconSize.x - S - 1, iconSize.y - S - 1);
+ e.gc.drawLine(S, iconSize.y - S - 1, iconSize.x - S - 1, iconSize.y - S - 1);
+ e.gc.setForeground(LIGHT_SHADOW);
+ e.gc.drawLine(iconSize.x - S - 2, S + 2, iconSize.x - S - 2, iconSize.y - S - 2);
+ e.gc.drawLine(S + 1, iconSize.x - S - 2, iconSize.x - S - 2, iconSize.y - S - 2);
+ e.gc.setForeground(SELECTION);
+ e.gc.drawRectangle(0, 0, iconSize.x - 1, iconSize.y - 1);
+ }
+
+ if (getEnabled()) {
+ e.gc.drawImage(image, S + B, S + B);
+ } else {
+ Image disabled = new Image(display, image, SWT.IMAGE_DISABLE);
+ e.gc.drawImage(disabled, S + B, S + B);
+ }
+
+ if (bMenu) {
+ if (Platform.getWS().equalsIgnoreCase(Platform.WS_WIN32)
+ || Platform.getWS().equalsIgnoreCase(Platform.WS_WPF)) {
+ Color FOREGROUND = display.getSystemColor((getEnabled()) ? SWT.COLOR_WIDGET_FOREGROUND
+ : SWT.COLOR_WIDGET_DARK_SHADOW);
+ e.gc.setForeground(FOREGROUND);
+ int x = iconSize.x + G;
+ int y = S + B + M;
+ int h = 6;
+ while (h >= 0) {
+ e.gc.drawLine(x, y, x, y + h);
+ x++;
+ y++;
+ h -= 2;
+ }
+ } else {
+ Color FOREGROUND = display.getSystemColor((getEnabled()) ? SWT.COLOR_WIDGET_DARK_SHADOW
+ : SWT.COLOR_WIDGET_NORMAL_SHADOW);
+ e.gc.setForeground(FOREGROUND);
+ int x = iconSize.x + G;
+ int y = S + B + M;
+ int h = 4;
+ e.gc.drawLine(x, y, x + h / 2 + 1, y + h / 2 + 1);
+ e.gc.drawLine(x, y + 1, x + h / 2, y + h / 2 + 1);
+ e.gc.drawLine(x, y + h + 1, x + h / 2, y + h / 2 + 1);
+ e.gc.drawLine(x, y + h + 2, x + h / 2, y + h / 2 + 2);
+ }
+ }
+ e.gc.setBackground(background);
+ e.gc.setForeground(foreground);
+ //System.out.println(e.toString());
+ }
+ });
+
+ addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseDown(MouseEvent e) {
+ if (e.x < iconSize.x && e.y < iconSize.y) {
+ if (showSelection) {
+ clickBody();
+ return;
+ } else {
+ invokeMenu((Composite) e.widget);
+ }
+ } else {
+ invokeMenu((Composite) e.widget);
+ }
+ }
+
+ private void invokeMenu(Composite widget) {
+ Rectangle b = widget.getBounds();
+ Point p = widget.getLocation();
+ p.x += b.width + 3;
+ bMouse = false;
+ redraw();
+ clickMenu(p.x, p.y);
+ }
+ });
+
+ addListener(SWT.MouseEnter, new Listener() {
+
+ public void handleEvent(Event event) {
+ if (getEnabled()) {
+ bMouse = true;
+ redraw();
+ }
+ }
+ });
+ addListener(SWT.MouseMove, new Listener() {
+
+ public void handleEvent(Event event) {
+ if (getEnabled()) {
+ bMouse = true;
+ redraw();
+ }
+ }
+ });
+ addListener(SWT.MouseExit, new Listener() {
+
+ public void handleEvent(Event event) {
+ if (getEnabled()) {
+ bMouse = false;
+ redraw();
+ }
+ }
+ });
+ }
+
+ @Override
+ public Point computeSize(int wHint, int hHint, boolean changed) {
+ if (!getVisible()) {
+ return new Point(0, 0);
+ }
+ return maxSize;
+ }
+
+ public void setImage(Image image) {
+ this.image = image;
+ }
+
+ public void clickBody() {
+ }
+
+ public void clickMenu(int x, int y) {
+ }
+
+ public boolean isSelect() {
+ return false;
+ }
+ }
+
+ private ToolActionItem[] items;
+
+ private int selectedItemID;
+
+ private ToolComposite toolButton;
+
+ private Menu dropDownMenu;
+
+ private int intgerCustom;
+
+ private String stringCustom;
+
+ private boolean showMenuAlways;
+
+ public boolean isShowMenuAlways() {
+ return showMenuAlways;
+ }
+
+ public void setShowMenuAlways(boolean showMenuAlways) {
+ this.showMenuAlways = showMenuAlways;
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ if (showMenuAlways) {
+ IMenuCreator mc = getMenuCreator();
+ if (mc != null) {
+ Widget item = event.widget;
+ ToolItem ti = (ToolItem) item;
+ Menu m = mc.getMenu(ti.getParent());
+ if (m != null) {
+ // position the menu below the drop down item
+ Rectangle itemBounds = ti.getBounds();
+ Point point = ti.getParent().toDisplay(itemBounds.x, itemBounds.y + itemBounds.height);
+ m.setLocation(point.x, point.y); // waiting for SWT
+ m.setVisible(true);
+ return; // we don't fire the action
+ }
+ }
+ }
+ super.runWithEvent(event);
+ }
+
+ public static final int ZOOM_FIT = 0;
+
+ public static final int DRAW_FREE = 0;
+
+ public static final int DRAW_LINE = 1;
+
+ public static final int DRAW_ARROW1 = 2;
+
+ public static final int DRAW_ARROW2 = 3;
+
+ public static final int DRAW_BOX = 10;
+
+ public static final int DRAW_RBOX = 11;
+
+ public static final int DRAW_FILL_BOX = 12;
+
+ public static final int DRAW_FILL_RBOX = 13;
+
+ public static final int DRAW_OVAL = 20;
+
+ public static final int DRAW_FILL_OVAL = 21;
+
+ public static final int DRAW_TEXT = 30;
+
+ public static final int CAPTURE_DESKTOP = 0;
+
+ public static final int CAPTURE_CLIPBOARD = 1;
+
+ public static final int CAPTURE_FILE = 2;
+
+ public static final int CAPTURE_RECTANGLE = 3;
+
+ public int getSelect() {
+ return selectedItemID;
+ }
+
+ public boolean setSelect(int select) {
+ if (items != null) {
+ for (ToolActionItem actionItem : items) {
+ if (select == actionItem.id) {
+ selectItem(actionItem.label, null);
+ return true;
+ }
+ }
+ } else {
+ if (getId().equals(DRAWTEXT_TOOLBAR + "")) { //$NON-NLS-1$
+ toolButton.clickBody();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void setUnselect() {
+ selectedItemID = -1;
+ if (toolButton != null) {
+ if (getId().equals(DRAWTEXT_TOOLBAR + "")) { //$NON-NLS-1$
+ FontData fontData = new FontData(stringCustom);
+ toolButton.setImage(createFontImage(fontData, int2rgb(intgerCustom), false));
+ }
+ toolButton.redraw();
+ }
+ }
+
+ public int getIntgerCustom() {
+ return intgerCustom;
+ }
+
+ public String getStringCustom() {
+ return stringCustom;
+ }
+
+ protected void selectAndRun(String label, ImageDescriptor image) {
+ if (selectItem(label, image)) {
+ if (getId().equals(CAPTURE_DROP_DOWN_MENU + "")) { //$NON-NLS-1$
+ if (selectedItemID == CAPTURE_FILE) {
+ FileDialog dialog = new FileDialog(parent.getShell());
+ dialog.setFileName(stringCustom);
+ dialog.setFilterExtensions(new String[] { "*.bmp;*.jpg;*.png", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
+ String result = dialog.open();
+ if (result != null && result.length() > 0) {
+ stringCustom = result;
+ run();
+ }
+ } else {
+ run();
+ }
+ selectedItemID = CAPTURE_DESKTOP;
+ } else {
+ run();
+ }
+ }
+ }
+
+ protected boolean selectItem(String label, ImageDescriptor image) {
+ for (ToolActionItem actionItem : items) {
+ if (actionItem.label.equals(label)) {
+ selectedItemID = actionItem.id;
+ if (getId().equals(CAPTURE_DROP_DOWN_MENU + "")) { //$NON-NLS-1$
+ // NONE
+ } else {
+ setToolTipText(label);
+ if (image != null) {
+ setImageDescriptor(image);
+ }
+ if (toolButton != null) {
+ toolButton.setToolTipText(label);
+ if (image != null) {
+ toolButton.setImage(image.createImage());
+ }
+ toolButton.redraw();
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void addActionsToMenu() {
+ for (ToolActionItem actionItem : items) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ selectAndRun(getText(), getImageDescriptor());
+ }
+ };
+ action.setText(actionItem.label);
+ if (actionItem.image != null) {
+ action.setImageDescriptor(actionItem.image);
+ }
+ updateAction(action, actionItem.id);
+ ActionContributionItem contributionItem = new ActionContributionItem(action);
+ contributionItem.fill(dropDownMenu, -1);
+ }
+ }
+
+ private void updateAction(Action action, int id) {
+ action.setChecked(id == selectedItemID);
+ if (getId().equals(CAPTURE_DROP_DOWN_MENU + "")) { //$NON-NLS-1$
+ if (id == CAPTURE_CLIPBOARD) {
+ action.setEnabled(existImageOnClipboard());
+ } else if (id == CAPTURE_RECTANGLE) {
+ action.setEnabled(isEnableRectangle());
+ }
+ }
+ }
+
+ protected boolean isEnableRectangle() {
+ return false;
+ }
+
+ public void dispose() {
+ if (toolButton != null) {
+ toolButton.dispose();
+ toolButton = null;
+ }
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ dropDownMenu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ private final Composite parent;
+
+ private boolean showSelection;
+
+ public boolean getVisible() {
+ if (toolButton != null) {
+ return toolButton.getVisible();
+ }
+ return false;
+ }
+
+ public void setVisible(boolean visible) {
+ if (toolButton != null) {
+ toolButton.setVisible(visible);
+ toolButton.redraw();
+ }
+ }
+
+ public boolean getEnabled() {
+ if (toolButton != null) {
+ return toolButton.getEnabled();
+ }
+ return false;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ if (toolButton != null) {
+ toolButton.setEnabled(enabled);
+ toolButton.redraw();
+ }
+ }
+
+ public Image getFileImage() {
+ try {
+ Image image = new Image(parent.getShell().getDisplay(), stringCustom);
+ return image;
+ } catch (Exception e) {
+ // None
+ }
+ return null;
+ }
+
+ private Transfer getImageTransfer() {
+ try {
+ Class<?> clazz = Class.forName("org.eclipse.swt.dnd.ImageTransfer"); //$NON-NLS-1$
+ Method method = clazz.getMethod("getInstance"); //$NON-NLS-1$
+ if (method != null) {
+ return (Transfer) method.invoke(null);
+ }
+ } catch (Exception e) {
+ // ignore
+ } catch (LinkageError e) {
+ // ignore
+ }
+ return null;
+ }
+
+ public Image getClipboardImage() {
+ Clipboard clipboard = new Clipboard(parent.getShell().getDisplay());
+ Transfer imageTransfer = getImageTransfer();
+ if (imageTransfer != null) {
+ Object data = clipboard.getContents(imageTransfer);
+ if (data instanceof ImageData) {
+ Image image = new Image(parent.getShell().getDisplay(), (ImageData) data);
+ return image;
+ }
+ }
+ return null;
+ }
+
+ private boolean existImageOnClipboard() {
+ Clipboard clipboard = new Clipboard(parent.getShell().getDisplay());
+ Transfer imageTransfer = getImageTransfer();
+ if (imageTransfer != null) {
+ Object data = clipboard.getContents(imageTransfer);
+ if (data instanceof ImageData) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static int rgb2int(RGB rgb) {
+ return rgb2int(rgb.red, rgb.green, rgb.blue);
+ }
+
+ public static int rgb2int(int r, int g, int b) {
+ return (r << 16) + (g << 8) + b;
+ }
+
+ public static RGB int2rgb(int rgb) {
+ return new RGB(rgb >> 16, (rgb >> 8) & 0x00ff, rgb & 0x00ff);
+ }
+
+ private String font2string(FontData fontData) {
+ String info = NLS.bind(Messages.SelectToolAction_Font_Name_Size, //
+ new Object[] { fontData.getName(), fontData.getHeight() + "" }); //$NON-NLS-1$
+ int style = fontData.getStyle();
+ if ((style & SWT.BOLD) != 0) {
+ info = info + Messages.SelectToolAction_Font_Bold;
+ }
+ if ((style & SWT.ITALIC) != 0) {
+ info = info + Messages.SelectToolAction_Font_Italic;
+ }
+ return info;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/SwtUtil.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/SwtUtil.java
new file mode 100644
index 0000000..280eb26
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/SwtUtil.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import java.lang.reflect.Method;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class SwtUtil {
+
+ public static final long FADE_RESCHEDULE_DELAY = 80;
+
+ public static final int FADE_IN_INCREMENT = 15;
+
+ public static final int FADE_OUT_INCREMENT = -20;
+
+ public static void collectItemData(TreeItem[] items, Set<Object> allVisible) {
+ for (TreeItem item : items) {
+ allVisible.add(item.getData());
+ collectItemData(item.getItems(), allVisible);
+ }
+ }
+
+ // TODO e3.4 get rid of reflection on 3.4 branch
+ public static boolean setAlpha(Shell shell, int value) {
+ Method method = null;
+ try {
+ method = shell.getClass().getMethod("setAlpha", new Class[] { int.class }); //$NON-NLS-1$
+ method.setAccessible(true);
+ //shell.setAlpha(value);
+ method.invoke(shell, new Object[] { value });
+ return true;
+ } catch (Exception e) {
+ // ignore, not supported on Eclipse 3.3
+ return false;
+ }
+ }
+
+ // TODO e3.4 get rid of reflection on 3.4 branch
+ public static int getAlpha(Shell shell) {
+ Method method = null;
+ try {
+ method = shell.getClass().getMethod("getAlpha"); //$NON-NLS-1$
+ method.setAccessible(true);
+ return (Integer) method.invoke(shell);
+ } catch (Exception e) {
+ return 0xFF;
+ }
+ }
+
+ public static FadeJob fastFadeIn(Shell shell, IFadeListener listener) {
+ return new FadeJob(shell, 2 * FADE_IN_INCREMENT, FADE_RESCHEDULE_DELAY, listener);
+ }
+
+ public static FadeJob fadeIn(Shell shell, IFadeListener listener) {
+ return new FadeJob(shell, FADE_IN_INCREMENT, FADE_RESCHEDULE_DELAY, listener);
+ }
+
+ public static FadeJob fadeOut(Shell shell, IFadeListener listener) {
+ return new FadeJob(shell, FADE_OUT_INCREMENT, FADE_RESCHEDULE_DELAY, listener);
+ }
+
+ // TODO e3.4 get rid of reflection on 3.4 branch
+ public static void fade(Shell shell, boolean fadeIn, int increment, int speed) {
+ try {
+ Method method = shell.getClass().getMethod("setAlpha", new Class[] { int.class }); //$NON-NLS-1$
+ method.setAccessible(true);
+
+ if (fadeIn) {
+ for (int i = 0; i <= 255; i += increment) {
+ // shell.setAlpha(i);
+ method.invoke(shell, new Object[] { i });
+ try {
+ Thread.sleep(speed);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+ // shell.setAlpha(255);
+ method.invoke(shell, new Object[] { 255 });
+ } else {
+ for (int i = 244; i >= 0; i -= increment) {
+ // shell.setAlpha(i);
+ method.invoke(shell, new Object[] { i });
+ try {
+ Thread.sleep(speed);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+ // shell.setAlpha(0);
+ method.invoke(shell, new Object[] { 0 });
+ }
+ } catch (Exception e) {
+ // ignore, not supported on Eclipse 3.3
+ }
+ }
+
+ public static class FadeJob extends Job {
+
+ private final Shell shell;
+
+ private final int increment;
+
+ private volatile boolean stopped;
+
+ private volatile int currentAlpha;
+
+ private final long delay;
+
+ private final IFadeListener fadeListener;
+
+ public FadeJob(Shell shell, int increment, long delay, IFadeListener fadeListener) {
+ super(Messages.SwtUtil_Fading);
+ if (increment < -255 || increment == 0 || increment > 255) {
+ throw new IllegalArgumentException("-255 <= increment <= 255 && increment != 0"); //$NON-NLS-1$
+ }
+ if (delay < 1) {
+ throw new IllegalArgumentException("delay must be > 0"); //$NON-NLS-1$
+ }
+ this.currentAlpha = getAlpha(shell);
+ this.shell = shell;
+ this.increment = increment;
+ this.delay = delay;
+ this.fadeListener = fadeListener;
+
+ setSystem(true);
+ schedule(delay);
+ }
+
+ @Override
+ protected void canceling() {
+ stopped = true;
+ }
+
+ private void reschedule() {
+ if (stopped) {
+ return;
+ }
+ schedule(delay);
+ }
+
+ public void cancelAndWait(final boolean setAlpha) {
+ if (stopped) {
+ return;
+ }
+ cancel();
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ if (setAlpha) {
+ SwtUtil.setAlpha(shell, getLastAlpha());
+ }
+ }
+ });
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (stopped) {
+ return Status.OK_STATUS;
+ }
+
+ currentAlpha += increment;
+ if (currentAlpha <= 0) {
+ currentAlpha = 0;
+ } else if (currentAlpha >= 255) {
+ currentAlpha = 255;
+ }
+
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ if (stopped) {
+ return;
+ }
+
+ if (shell.isDisposed()) {
+ stopped = true;
+ return;
+ }
+
+ if (!SwtUtil.setAlpha(shell, currentAlpha)) {
+ // just in case it failed for some other reason than lack of support on the platform
+ currentAlpha = getLastAlpha();
+ SwtUtil.setAlpha(shell, currentAlpha);
+ stopped = true;
+ }
+
+ if (fadeListener != null) {
+ fadeListener.faded(shell, currentAlpha);
+ }
+ }
+ });
+
+ if (currentAlpha == 0 || currentAlpha == 255) {
+ stopped = true;
+ }
+
+ reschedule();
+ return Status.OK_STATUS;
+ }
+
+ private int getLastAlpha() {
+ return (increment < 0) ? 0 : 255;
+ }
+
+ }
+
+ public static interface IFadeListener {
+
+ public void faded(Shell shell, int alpha);
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/TaskListImageDescriptor.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/TaskListImageDescriptor.java
new file mode 100644
index 0000000..cd2b5e2
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/TaskListImageDescriptor.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commons.ui;
+
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListImageDescriptor extends CompositeImageDescriptor {
+
+ private final ImageData base;
+
+ private ImageData overlay;
+
+ private boolean top;
+
+ private boolean left;
+
+ protected Point size;
+
+ public TaskListImageDescriptor(ImageDescriptor baseDesc, ImageDescriptor overlayDesc, boolean top, boolean left) {
+ this.base = getImageData(baseDesc);
+ this.top = top;
+ this.left = left;
+ if (overlayDesc != null) {
+ this.overlay = getImageData(overlayDesc);
+ }
+ Point size = new Point(base.width, base.height);
+ setImageSize(size);
+ }
+
+ public TaskListImageDescriptor(ImageDescriptor baseDesc, Point size) {
+ this.base = getImageData(baseDesc);
+ setImageSize(size);
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ drawImage(base, 0, 0);
+ int x = 0;
+ int y = 0;
+ if (!left) {
+ x = 8;// base.width - overlay.width;
+ }
+ if (!top) {
+ y = 8;// base.height - overlay.height;
+ }
+ if (overlay != null) {
+ drawImage(overlay, x, y);
+ }
+ }
+
+ private ImageData getImageData(ImageDescriptor descriptor) {
+ ImageData data = descriptor.getImageData();
+ // see bug 51965: getImageData can return null
+ if (data == null) {
+ data = DEFAULT_IMAGE_DATA;
+ }
+ return data;
+ }
+
+ public void setImageSize(Point size) {
+ this.size = size;
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(size.x, size.y);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/messages.properties b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/messages.properties
new file mode 100644
index 0000000..53f5231
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/commons/ui/messages.properties
@@ -0,0 +1,74 @@
+WorkbenchUtil_Browser_Initialization_Failed=Browser initialization failed.
+WorkbenchUtil_Invalid_URL_Error=Invalid URL specified: ''{0}''.
+WorkbenchUtil_No_URL_Error=No URL specified when opening browser.
+WorkbenchUtil_Open_Location_Title=Open Location
+
+ColorSelectionWindow_Close=&Close
+
+SwtUtil_Fading=Fading
+
+AbstractFilteredTree_Find=Find
+
+AbstractNotificationPopup_Close_Notification_Job=Close Notification Job
+AbstractNotificationPopup_Notification=Notification
+
+DatePicker_Choose_Date=Choose Date
+
+DateSelectionDialog_Clear=Clear
+DateSelectionDialog_Date_Selection=Date Selection
+
+ScreenshotCreationPage_After_capturing=After capturing, you can crop the image and make drawings on it. This window will not be captured.
+ScreenshotCreationPage_Annotate=&Annotate
+ScreenshotCreationPage_Capture_Desktop=Capture Desktop, Clipboard or File
+ScreenshotCreationPage_Capture_Desktop_C=&Capture
+ScreenshotCreationPage_CAPTURE_SCRRENSHOT=Capture Screenshot
+ScreenshotCreationPage_Clear_all_annotations_made_on_screenshot_image=Clear all annotations made on screenshot image
+ScreenshotCreationPage_Clear=C&lear
+ScreenshotCreationPage_Undo=&Undo
+ScreenshotCreationPage_Undo_annotation=Undo annotation
+ScreenshotCreationPage_Redo=Re&do
+ScreenshotCreationPage_Redo_annotation=Redo annotation
+ScreenshotCreationPage_Crop=Crop
+ScreenshotCreationPage_Crop_R=C&rop
+ScreenshotCreationPage_DRAW_ANNOTATION_ON_SCREENSHOT_IMAGE=Draw annotations on screenshot image
+ScreenshotCreationPage_Fit_Image=Fit Image
+#ScreenshotCreationPage_Fit_Image_F=&Fit Image
+ScreenshotCreationPage_Fit_Image_F=&Fit
+ScreenshotCreationPage_NOTE_THAT_YOU_CONTINUTE=Note that you can continue to interact with the workbench in order to set up the screenshot.
+ScreenshotCreationPage_Show_Line_Type_Selector=Show Line Type Selector
+ScreenshotCreationPage_Show_Line_Bold_Selector=Show Line Bold Selector
+
+SelectToolAction_Font_Bold=, Bold
+SelectToolAction_Font_Italic=, Italic
+SelectToolAction_Font_Name_Size={0}, {1} pt
+SelectToolAction_1dot=1 dot
+SelectToolAction_2dots=2 dots
+SelectToolAction_4dots=4 dots
+SelectToolAction_8dots=8 dots
+SelectToolAction_Clipboard=Clipboard
+SelectToolAction_Desktop=Desktop
+SelectToolAction_File=File...
+SelectToolAction_Selected_Rectangle=Selected Rectangle
+SelectToolAction_Rectangle=Rectangle
+SelectToolAction_Round_Rectangle=Round Rectangle
+SelectToolAction_Oval=Oval
+SelectToolAction_Fill_Rectangle=Fill Rectangle
+SelectToolAction_Fill_Round_Rectangle=Fill Round Rectangle
+SelectToolAction_Fill_Oval=Fill Oval
+SelectToolAction_Free=Free
+SelectToolAction_Line=Line
+SelectToolAction_Single_Side_Arrow=Single Side Arrow
+SelectToolAction_Both_Side_Arrow=Both Side Arrow
+SelectToolAction_Dashed_Line=Dashed Line
+SelectToolAction_Dashed_Line_1_dot=1 dots Dashed Line
+SelectToolAction_Dashed_Line_2_dots=2 dots Dashed Line
+SelectToolAction_Dotted_Line=Dotted Line
+SelectToolAction_Solid_Line=Solid Line
+SelectToolAction_Fit=Fit
+SelectToolAction_ZoomHalf=50%
+SelectToolAction_Zoom1X=100%
+SelectToolAction_Zoom2X=200%
+SelectToolAction_Zoom4X=400%
+SelectToolAction_Zoom8X=800%
+SelectToolAction_Font_=Font...
+SelectToolAction_Color_=Color...
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractFilteredTree.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractFilteredTree.java
new file mode 100644
index 0000000..f06b7d7
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractFilteredTree.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.lang.reflect.Field;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin;
+import org.eclipse.mylyn.internal.commons.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+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.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractFilteredTree extends EnhancedFilteredTree {
+
+ private static final int FILTER_WIDTH_MIN = 60;
+
+ private static final int FILTER_WIDTH_MAX = 300;
+
+ private static final float FILTER_WIDTH_RATIO = 0.35f;
+
+ public static final String LABEL_FIND = Messages.AbstractFilteredTree_Find;
+
+ private Job refreshJob;
+
+ private AdaptiveRefreshPolicy refreshPolicy;
+
+ private Composite progressComposite;
+
+ private Composite searchComposite;
+
+ private boolean showProgress = false;
+
+ private Color textColor = null;
+
+ private Font textFont = null;
+
+ /**
+ * XXX: using reflection to gain access
+ *
+ * @param parent
+ * @param treeStyle
+ * @param filter
+ */
+ public AbstractFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+ try {
+ // TODO e3.4 override doCreateRefreshJob() instead
+ Field refreshField = FilteredTree.class.getDeclaredField("refreshJob"); //$NON-NLS-1$
+ refreshField.setAccessible(true);
+ refreshJob = (Job) refreshField.get(this);
+ refreshPolicy = new AdaptiveRefreshPolicy(refreshJob);
+
+ filterText.addFocusListener(new FocusListener() {
+
+ public void focusLost(FocusEvent focusEvent) {
+ if ("".equals(filterText.getText())) { //$NON-NLS-1$
+ filterText.setText(LABEL_FIND);
+ setGrayFilterText(true);
+ }
+ }
+
+ public void focusGained(FocusEvent focusEvent) {
+ if (LABEL_FIND.equals(filterText.getText())) {
+ filterText.setText(""); //$NON-NLS-1$
+ setGrayFilterText(false);
+ }
+ }
+ });
+
+ filterText.addKeyListener(new KeyListener() {
+
+ public void keyReleased(KeyEvent e) {
+ // ignore
+ }
+
+ public void keyPressed(KeyEvent e) {
+ // could consider doing this only on the first keystroke
+ setGrayFilterText(false);
+ }
+ });
+ } catch (Exception e) {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Could not get refresh job", e)); //$NON-NLS-1$
+ }
+ setInitialText(LABEL_FIND);
+ }
+
+ @Override
+ protected void createControl(Composite parent, int treeStyle) {
+ super.createControl(parent, treeStyle);
+
+ // Override superclass layout settings...
+ GridLayout layout = (GridLayout) getLayout();
+ layout.verticalSpacing = 0;
+ layout.horizontalSpacing = 0;
+ }
+
+ @Override
+ protected Control createTreeControl(Composite parent, int style) {
+ progressComposite = createProgressComposite(parent);
+// progressComposite.setVisible(false);
+// ((GridData) progressComposite.getLayoutData()).exclude = true;
+
+ searchComposite = createSearchComposite(parent);
+ if (searchComposite != null) {
+ searchComposite.setVisible(false);
+ ((GridData) searchComposite.getLayoutData()).exclude = true;
+ }
+
+ return super.createTreeControl(parent, style);
+ }
+
+ @Override
+ protected Composite createFilterControls(final Composite parent) {
+ // replace filterComposite by a new composite
+ filterComposite = new Composite(parent.getParent(), SWT.NONE);
+ GridLayout gridLayout = new GridLayout(1, false);
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ gridLayout.marginLeft = 3;
+ gridLayout.marginTop = 5;
+ gridLayout.marginBottom = 3;
+ gridLayout.verticalSpacing = 0;
+ filterComposite.setLayout(gridLayout);
+
+ // let FilteredTree create the find and clear control
+ super.createFilterControls(parent);
+ GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).grab(false, false).hint(FILTER_WIDTH_MIN,
+ SWT.DEFAULT).minSize(FILTER_WIDTH_MIN, SWT.DEFAULT).applyTo(parent);
+ filterComposite.addControlListener(new ControlAdapter() {
+ boolean handlingEvents;
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ if (handlingEvents) {
+ return;
+ }
+ try {
+ handlingEvents = true;
+ Point size = parent.getParent().getSize();
+ int width = Math.max(FILTER_WIDTH_MIN, (int) (size.x * FILTER_WIDTH_RATIO));
+ ((GridData) parent.getLayoutData()).widthHint = Math.min(width, FILTER_WIDTH_MAX);
+ parent.getParent().layout();
+ } finally {
+ handlingEvents = false;
+ }
+ }
+ });
+ filterText.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.character == SWT.ESC) {
+ setFilterText(""); //$NON-NLS-1$
+ }
+ }
+ });
+ ((GridData) filterText.getLayoutData()).verticalAlignment = SWT.CENTER;
+
+ // move original filterComposite on new filterComposite
+ parent.setParent(filterComposite);
+
+ Composite workingSetComposite = createActiveWorkingSetComposite(filterComposite);
+ GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).grab(false, false).applyTo(workingSetComposite);
+
+ Composite activeTaskComposite = createActiveTaskComposite(filterComposite);
+ GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).grab(true, false).applyTo(activeTaskComposite);
+
+ gridLayout.numColumns = filterComposite.getChildren().length;
+
+ textColor = filterText.getForeground();
+ textFont = filterText.getFont();
+ setGrayFilterText(true);
+ return parent;
+ }
+
+ private void setGrayFilterText(boolean gray) {
+ if (gray) {
+ filterText.setForeground(CommonColors.GRAY_MID);
+// filterText.setFont(CommonFonts.ITALIC);
+ } else {
+ filterText.setForeground(textColor);
+ filterText.setFont(textFont);
+ }
+ }
+
+ protected abstract Composite createProgressComposite(Composite container);
+
+ protected abstract Composite createActiveWorkingSetComposite(Composite container);
+
+ protected abstract Composite createActiveTaskComposite(Composite container);
+
+ protected Composite createSearchComposite(Composite container) {
+ return null;
+ }
+
+ @Override
+ protected void textChanged() {
+ // this call allows the filtered tree to preserve the selection when the clear button is used.
+ // It is necessary to correctly set the private narrowingDown flag in the super class.
+ // Note that the scheduling of the refresh job that is done in the super class will be overridden
+ // by the call to refreshPolicy.textChanged().
+ super.textChanged();
+ if (refreshPolicy != null) {
+ if (LABEL_FIND.equals(getFilterString())) {
+ clearText();
+ refreshPolicy.textChanged(""); //$NON-NLS-1$
+ } else {
+ refreshPolicy.textChanged(getFilterString());
+ }
+ }
+ // bug 165353 work-around for premature return at FilteredTree.java:374
+ updateToolbar(true);
+ }
+
+ @Deprecated
+ protected Job getRefreshJob() {
+ return refreshJob;
+ }
+
+ public AdaptiveRefreshPolicy getRefreshPolicy() {
+ return refreshPolicy;
+ }
+
+ public boolean isShowProgress() {
+ return showProgress;
+ }
+
+ public void setShowProgress(boolean showProgress) {
+ this.showProgress = showProgress;
+ progressComposite.setVisible(showProgress);
+ ((GridData) progressComposite.getLayoutData()).exclude = !showProgress;
+ getParent().getParent().layout(true, true);
+ }
+
+ public void setShowSearch(boolean showSearch) {
+ if (searchComposite != null) {
+ searchComposite.setVisible(showSearch);
+ ((GridData) searchComposite.getLayoutData()).exclude = !showSearch;
+ getParent().getParent().layout(true, true);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractNotification.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractNotification.java
new file mode 100644
index 0000000..acb6e6e
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractNotification.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public abstract class AbstractNotification implements Comparable<AbstractNotification>, IAdaptable {
+
+ public abstract void open();
+
+ public abstract String getDescription();
+
+ public abstract String getLabel();
+
+ public abstract Image getNotificationImage();
+
+ public abstract Image getNotificationKindImage();
+
+ public abstract Date getDate();
+
+ public abstract void setDate(Date date);
+
+ public Object getToken() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractNotificationPopup.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractNotificationPopup.java
new file mode 100644
index 0000000..02bd44f
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AbstractNotificationPopup.java
@@ -0,0 +1,627 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Benjamin Pasero - intial API and implementation
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.commons.ui;
+
+import org.eclipse.core.runtime.IProduct;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.commons.ui.Messages;
+import org.eclipse.mylyn.internal.commons.ui.NotificationPopupColors;
+import org.eclipse.mylyn.internal.commons.ui.SwtUtil;
+import org.eclipse.mylyn.internal.commons.ui.SwtUtil.FadeJob;
+import org.eclipse.mylyn.internal.commons.ui.SwtUtil.IFadeListener;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Region;
+import org.eclipse.swt.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.swt.widgets.Monitor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Benjamin Pasero
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public abstract class AbstractNotificationPopup extends Window {
+
+ private static final int TITLE_HEIGHT = 24;
+
+ private static final String LABEL_NOTIFICATION = Messages.AbstractNotificationPopup_Notification;
+
+ private static final String LABEL_JOB_CLOSE = Messages.AbstractNotificationPopup_Close_Notification_Job;
+
+ private static final int MAX_WIDTH = 400;
+
+ private static final int MIN_HEIGHT = 100;
+
+ private static final long DEFAULT_DELAY_CLOSE = 8 * 1000;
+
+ private static final int PADDING_EDGE = 5;
+
+ private long delayClose = DEFAULT_DELAY_CLOSE;
+
+ protected LocalResourceManager resources;
+
+ private NotificationPopupColors color;
+
+ private final Display display;
+
+ private Shell shell;
+
+ private Region lastUsedRegion;
+
+ private Image lastUsedBgImage;
+
+ private final Job closeJob = new Job(LABEL_JOB_CLOSE) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (!display.isDisposed()) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ Shell shell = AbstractNotificationPopup.this.getShell();
+ if (shell == null || shell.isDisposed()) {
+ return;
+ }
+
+ if (isMouseOver(shell)) {
+ scheduleAutoClose();
+ return;
+ }
+
+ AbstractNotificationPopup.this.closeFade();
+ }
+
+ });
+ }
+ if (monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ return Status.OK_STATUS;
+ }
+ };
+
+ private final boolean respectDisplayBounds = true;
+
+ private final boolean respectMonitorBounds = true;
+
+ private FadeJob fadeJob;
+
+ private boolean supportsFading;
+
+ private boolean fadingEnabled;
+
+ public AbstractNotificationPopup(Display display) {
+ this(display, SWT.NO_TRIM | SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
+ }
+
+ public AbstractNotificationPopup(Display display, int style) {
+ super(new Shell(display));
+ setShellStyle(style);
+
+ this.display = display;
+ resources = new LocalResourceManager(JFaceResources.getResources());
+ initResources();
+
+ closeJob.setSystem(true);
+ }
+
+ public boolean isFadingEnabled() {
+ return fadingEnabled;
+ }
+
+ public void setFadingEnabled(boolean fadingEnabled) {
+ this.fadingEnabled = fadingEnabled;
+ }
+
+ /**
+ * Override to return a customized name. Default is to return the name of the product, specified by the -name (e.g.
+ * "Eclipse SDK") command line parameter that's associated with the product ID (e.g. "org.eclipse.sdk.ide"). Strips
+ * the trailing "SDK" for any name, since this part of the label is considered visual noise.
+ *
+ * @return the name to be used in the title of the popup.
+ */
+ protected String getPopupShellTitle() {
+ IProduct product = Platform.getProduct();
+ if (product != null) {
+ String productName = product.getName();
+ String LABEL_SDK = "SDK"; //$NON-NLS-1$
+ if (productName.endsWith(LABEL_SDK)) {
+ productName = productName.substring(0, productName.length() - LABEL_SDK.length());
+ }
+ return productName + " " + LABEL_NOTIFICATION; //$NON-NLS-1$
+ } else {
+ return LABEL_NOTIFICATION;
+ }
+ }
+
+ protected Image getPopupShellImage(int maximumHeight) {
+ // always use the launching workbench window
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ if (windows != null && windows.length > 0) {
+ IWorkbenchWindow workbenchWindow = windows[0];
+ if (workbenchWindow != null && !workbenchWindow.getShell().isDisposed()) {
+ Image image = getShell().getImage();
+ int diff = Integer.MAX_VALUE;
+ if (image != null && image.getBounds().height <= maximumHeight) {
+ diff = maximumHeight - image.getBounds().height;
+ } else {
+ image = null;
+ }
+
+ Image[] images = getShell().getImages();
+ if (images != null && images.length > 0) {
+ // find the icon that is closest in size, but not larger than maximumHeight
+ for (Image image2 : images) {
+ int newDiff = maximumHeight - image2.getBounds().height;
+ if (newDiff >= 0 && newDiff <= diff) {
+ diff = newDiff;
+ image = image2;
+ }
+ }
+ }
+
+ return image;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Override to populate with notifications.
+ *
+ * @param parent
+ */
+ protected void createContentArea(Composite parent) {
+ // empty by default
+ }
+
+ /**
+ * Override to customize the title bar
+ */
+ protected void createTitleArea(Composite parent) {
+ ((GridData) parent.getLayoutData()).heightHint = TITLE_HEIGHT;
+
+ Label titleImageLabel = new Label(parent, SWT.NONE);
+ titleImageLabel.setImage(getPopupShellImage(TITLE_HEIGHT));
+
+ Label titleTextLabel = new Label(parent, SWT.NONE);
+ titleTextLabel.setText(getPopupShellTitle());
+ titleTextLabel.setFont(CommonFonts.BOLD);
+ titleTextLabel.setForeground(getTitleForeground());
+// titleTextLabel.setForeground(color.getTitleText());
+ titleTextLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
+ titleTextLabel.setCursor(parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND));
+
+ final Label button = new Label(parent, SWT.NONE);
+ button.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
+ button.addMouseTrackListener(new MouseTrackAdapter() {
+ @Override
+ public void mouseEnter(MouseEvent e) {
+ button.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE_HOVER));
+ }
+
+ @Override
+ public void mouseExit(MouseEvent e) {
+ button.setImage(CommonImages.getImage(CommonImages.NOTIFICATION_CLOSE));
+ }
+ });
+ button.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ close();
+ setReturnCode(CANCEL);
+ }
+
+ });
+ }
+
+ protected Color getTitleForeground() {
+ return color.getTitleText();
+ }
+
+ private void initResources() {
+ color = new NotificationPopupColors(display, resources);
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+
+ shell = newShell;
+ newShell.setBackground(color.getBorder());
+ }
+
+ @Override
+ public void create() {
+ super.create();
+ addRegion(shell);
+ }
+
+ private void addRegion(Shell shell) {
+ Region region = new Region();
+ Point s = shell.getSize();
+
+ /* Add entire Shell */
+ region.add(0, 0, s.x, s.y);
+
+ /* Subtract Top-Left Corner */
+ region.subtract(0, 0, 5, 1);
+ region.subtract(0, 1, 3, 1);
+ region.subtract(0, 2, 2, 1);
+ region.subtract(0, 3, 1, 1);
+ region.subtract(0, 4, 1, 1);
+
+ /* Subtract Top-Right Corner */
+ region.subtract(s.x - 5, 0, 5, 1);
+ region.subtract(s.x - 3, 1, 3, 1);
+ region.subtract(s.x - 2, 2, 2, 1);
+ region.subtract(s.x - 1, 3, 1, 1);
+ region.subtract(s.x - 1, 4, 1, 1);
+
+ /* Subtract Bottom-Left Corner */
+ region.subtract(0, s.y, 5, 1);
+ region.subtract(0, s.y - 1, 3, 1);
+ region.subtract(0, s.y - 2, 2, 1);
+ region.subtract(0, s.y - 3, 1, 1);
+ region.subtract(0, s.y - 4, 1, 1);
+
+ /* Subtract Bottom-Right Corner */
+ region.subtract(s.x - 5, s.y - 0, 5, 1);
+ region.subtract(s.x - 3, s.y - 1, 3, 1);
+ region.subtract(s.x - 2, s.y - 2, 2, 1);
+ region.subtract(s.x - 1, s.y - 3, 1, 1);
+ region.subtract(s.x - 1, s.y - 4, 1, 1);
+
+ /* Dispose old first */
+ if (shell.getRegion() != null) {
+ shell.getRegion().dispose();
+ }
+
+ /* Apply Region */
+ shell.setRegion(region);
+
+ /* Remember to dispose later */
+ lastUsedRegion = region;
+ }
+
+ private boolean isMouseOver(Shell shell) {
+ if (display.isDisposed()) {
+ return false;
+ }
+ return shell.getBounds().contains(display.getCursorLocation());
+ }
+
+ @Override
+ public int open() {
+ if (shell == null || shell.isDisposed()) {
+ shell = null;
+ create();
+ }
+
+ constrainShellSize();
+ shell.setLocation(fixupDisplayBounds(shell.getSize(), shell.getLocation()));
+
+ if (isFadingEnabled()) {
+ supportsFading = SwtUtil.setAlpha(shell, 0);
+ } else {
+ supportsFading = false;
+ }
+ shell.setVisible(true);
+ if (supportsFading) {
+ fadeJob = SwtUtil.fadeIn(shell, new IFadeListener() {
+ public void faded(Shell shell, int alpha) {
+ if (shell.isDisposed()) {
+ return;
+ }
+
+ if (alpha == 255) {
+ scheduleAutoClose();
+ }
+ }
+ });
+ } else {
+ scheduleAutoClose();
+ }
+
+ return Window.OK;
+ }
+
+ protected void scheduleAutoClose() {
+ if (delayClose > 0) {
+ closeJob.schedule(delayClose);
+ }
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ ((GridLayout) parent.getLayout()).marginWidth = 1;
+ ((GridLayout) parent.getLayout()).marginHeight = 1;
+
+ /* Outer Composite holding the controls */
+ final Composite outerCircle = new Composite(parent, SWT.NO_FOCUS);
+ outerCircle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ outerCircle.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ outerCircle.addControlListener(new ControlAdapter() {
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ Rectangle clArea = outerCircle.getClientArea();
+ lastUsedBgImage = new Image(outerCircle.getDisplay(), clArea.width, clArea.height);
+ GC gc = new GC(lastUsedBgImage);
+
+ /* Gradient */
+ drawGradient(gc, clArea);
+
+ /* Fix Region Shape */
+ fixRegion(gc, clArea);
+
+ gc.dispose();
+
+ Image oldBGImage = outerCircle.getBackgroundImage();
+ outerCircle.setBackgroundImage(lastUsedBgImage);
+
+ if (oldBGImage != null) {
+ oldBGImage.dispose();
+ }
+ }
+
+ private void drawGradient(GC gc, Rectangle clArea) {
+ gc.setForeground(color.getGradientBegin());
+ gc.setBackground(color.getGradientEnd());
+ gc.fillGradientRectangle(clArea.x, clArea.y, clArea.width, clArea.height, true);
+ }
+
+ private void fixRegion(GC gc, Rectangle clArea) {
+ gc.setForeground(color.getBorder());
+
+ /* Fill Top Left */
+ gc.drawPoint(2, 0);
+ gc.drawPoint(3, 0);
+ gc.drawPoint(1, 1);
+ gc.drawPoint(0, 2);
+ gc.drawPoint(0, 3);
+
+ /* Fill Top Right */
+ gc.drawPoint(clArea.width - 4, 0);
+ gc.drawPoint(clArea.width - 3, 0);
+ gc.drawPoint(clArea.width - 2, 1);
+ gc.drawPoint(clArea.width - 1, 2);
+ gc.drawPoint(clArea.width - 1, 3);
+
+ /* Fill Bottom Left */
+ gc.drawPoint(2, clArea.height - 0);
+ gc.drawPoint(3, clArea.height - 0);
+ gc.drawPoint(1, clArea.height - 1);
+ gc.drawPoint(0, clArea.height - 2);
+ gc.drawPoint(0, clArea.height - 3);
+
+ /* Fill Bottom Right */
+ gc.drawPoint(clArea.width - 4, clArea.height - 0);
+ gc.drawPoint(clArea.width - 3, clArea.height - 0);
+ gc.drawPoint(clArea.width - 2, clArea.height - 1);
+ gc.drawPoint(clArea.width - 1, clArea.height - 2);
+ gc.drawPoint(clArea.width - 1, clArea.height - 3);
+ }
+ });
+
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.verticalSpacing = 0;
+
+ outerCircle.setLayout(layout);
+
+ /* Title area containing label and close button */
+ final Composite titleCircle = new Composite(outerCircle, SWT.NO_FOCUS);
+ titleCircle.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ titleCircle.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ layout = new GridLayout(4, false);
+ layout.marginWidth = 3;
+ layout.marginHeight = 0;
+ layout.verticalSpacing = 5;
+ layout.horizontalSpacing = 3;
+
+ titleCircle.setLayout(layout);
+
+ /* Create Title Area */
+ createTitleArea(titleCircle);
+
+ /* Outer composite to hold content controlls */
+ Composite outerContentCircle = new Composite(outerCircle, SWT.NONE);
+ outerContentCircle.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ layout = new GridLayout(1, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+
+ outerContentCircle.setLayout(layout);
+ outerContentCircle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ outerContentCircle.setBackground(outerCircle.getBackground());
+
+ /* Middle composite to show a 1px black line around the content controls */
+ Composite middleContentCircle = new Composite(outerContentCircle, SWT.NO_FOCUS);
+ middleContentCircle.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ layout = new GridLayout(1, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.marginTop = 1;
+
+ middleContentCircle.setLayout(layout);
+ middleContentCircle.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ middleContentCircle.setBackground(color.getBorder());
+
+ /* Inner composite containing the content controls */
+ Composite innerContent = new Composite(middleContentCircle, SWT.NO_FOCUS);
+ innerContent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ innerContent.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ layout = new GridLayout(1, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 5;
+ layout.marginLeft = 5;
+ layout.marginRight = 5;
+ innerContent.setLayout(layout);
+
+ innerContent.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));
+
+ /* Content Area */
+ createContentArea(innerContent);
+
+ setNullBackground(outerCircle);
+
+ return outerCircle;
+ }
+
+ private void setNullBackground(final Composite outerCircle) {
+ for (Control c : outerCircle.getChildren()) {
+ c.setBackground(null);
+ if (c instanceof Composite) {
+ setNullBackground((Composite) c);
+ }
+ }
+ }
+
+ @Override
+ protected void initializeBounds() {
+ Rectangle clArea = getPrimaryClientArea();
+ Point initialSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ int height = Math.max(initialSize.y, MIN_HEIGHT);
+ int width = Math.min(initialSize.x, MAX_WIDTH);
+
+ Point size = new Point(width, height);
+ shell.setLocation(clArea.width + clArea.x - size.x - PADDING_EDGE, clArea.height + clArea.y - size.y
+ - PADDING_EDGE);
+ shell.setSize(size);
+ }
+
+ private Rectangle getPrimaryClientArea() {
+ Monitor primaryMonitor = shell.getDisplay().getPrimaryMonitor();
+ return (primaryMonitor != null) ? primaryMonitor.getClientArea() : shell.getDisplay().getClientArea();
+ }
+
+ public void closeFade() {
+ if (fadeJob != null) {
+ fadeJob.cancelAndWait(false);
+ }
+ if (supportsFading) {
+ fadeJob = SwtUtil.fadeOut(getShell(), new IFadeListener() {
+ public void faded(Shell shell, int alpha) {
+ if (!shell.isDisposed()) {
+ if (alpha == 0) {
+ shell.close();
+ } else if (isMouseOver(shell)) {
+ if (fadeJob != null) {
+ fadeJob.cancelAndWait(false);
+ }
+ fadeJob = SwtUtil.fastFadeIn(shell, new IFadeListener() {
+ public void faded(Shell shell, int alpha) {
+ if (shell.isDisposed()) {
+ return;
+ }
+
+ if (alpha == 255) {
+ scheduleAutoClose();
+ }
+ }
+ });
+ }
+ }
+ }
+ });
+ } else {
+ shell.close();
+ }
+ }
+
+ @Override
+ public boolean close() {
+ resources.dispose();
+ if (lastUsedRegion != null) {
+ lastUsedRegion.dispose();
+ }
+ if (lastUsedBgImage != null && !lastUsedBgImage.isDisposed()) {
+ lastUsedBgImage.dispose();
+ }
+ return super.close();
+ }
+
+ public long getDelayClose() {
+ return delayClose;
+ }
+
+ public void setDelayClose(long delayClose) {
+ this.delayClose = delayClose;
+ }
+
+ private Point fixupDisplayBounds(Point tipSize, Point location) {
+ if (respectDisplayBounds) {
+ Rectangle bounds;
+ Point rightBounds = new Point(tipSize.x + location.x, tipSize.y + location.y);
+
+ if (respectMonitorBounds) {
+ bounds = shell.getDisplay().getPrimaryMonitor().getBounds();
+ } else {
+ bounds = getPrimaryClientArea();
+ }
+
+ if (!(bounds.contains(location) && bounds.contains(rightBounds))) {
+ if (rightBounds.x > bounds.x + bounds.width) {
+ location.x -= rightBounds.x - (bounds.x + bounds.width);
+ }
+
+ if (rightBounds.y > bounds.y + bounds.height) {
+ location.y -= rightBounds.y - (bounds.y + bounds.height);
+ }
+
+ if (location.x < bounds.x) {
+ location.x = bounds.x;
+ }
+
+ if (location.y < bounds.y) {
+ location.y = bounds.y;
+ }
+ }
+ }
+
+ return location;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AdaptiveRefreshPolicy.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AdaptiveRefreshPolicy.java
new file mode 100644
index 0000000..95e77d7
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/AdaptiveRefreshPolicy.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.WorkbenchJob;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class AdaptiveRefreshPolicy {
+
+ private int refreshDelay = 1500;
+
+ private final Set<IFilteredTreeListener> listeners = new HashSet<IFilteredTreeListener>();
+
+ private String oldText = ""; //$NON-NLS-1$
+
+ protected Job refreshJob;
+
+ @Deprecated
+ public AdaptiveRefreshPolicy(Job refreshJob, Text filterText) {
+ this(refreshJob);
+ }
+
+ public AdaptiveRefreshPolicy(Job refreshJob) {
+ Assert.isNotNull(refreshJob);
+ this.refreshJob = refreshJob;
+ refreshJob.addJobChangeListener(REFRESH_JOB_LISTENER);
+ }
+
+ public void dispose() {
+ refreshJob.removeJobChangeListener(REFRESH_JOB_LISTENER);
+ }
+
+ protected final IJobChangeListener REFRESH_JOB_LISTENER = new IJobChangeListener() {
+
+ public void aboutToRun(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void awake(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void done(IJobChangeEvent event) {
+ if (event.getResult().isOK()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ for (IFilteredTreeListener listener : listeners) {
+ listener.filterTextChanged(oldText);
+ }
+ }
+ });
+ }
+ }
+
+ public void running(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void scheduled(IJobChangeEvent event) {
+ // ignore
+ }
+
+ public void sleeping(IJobChangeEvent event) {
+ // ignore
+ }
+ };
+
+ public void textChanged(String text) {
+ if (text == null || text.equals(oldText)) {
+ return;
+ }
+
+ refreshJob.cancel();
+ int delay = 0;
+ int textLength = text.length();
+ if (textLength > 0) {
+ delay = (int) (this.refreshDelay / (textLength * 0.6));
+ }
+ refreshJob.schedule(delay);
+
+ this.oldText = text;
+ }
+
+ /**
+ * for testing purposes only
+ */
+ public void internalForceRefresh() {
+ ((WorkbenchJob) refreshJob).runInUIThread(new NullProgressMonitor());
+ }
+
+ public void addListener(IFilteredTreeListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(IFilteredTreeListener listener) {
+ listeners.remove(listener);
+ }
+
+ public void setRefreshDelay(int refreshDelay) {
+ this.refreshDelay = refreshDelay;
+ }
+
+ public int getRefreshDelay() {
+ return refreshDelay;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonColors.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonColors.java
new file mode 100644
index 0000000..fdc7273
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonColors.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class CommonColors {
+
+ public static final Color CONTEXT_ACTIVE = new Color(Display.getDefault(), 36, 22, 50);
+
+ public static final Color HYPERLINK_WIDGET = new Color(Display.getDefault(), 12, 81, 172);
+
+ public static final Color TEXT_QUOTED = new Color(Display.getDefault(), 38, 86, 145);
+
+ public static final Color TEXT_SPELLING_ERROR = new Color(Display.getDefault(), 255, 0, 0);
+
+ public static final Color GRAY_MID = new Color(Display.getDefault(), 100, 100, 100);
+
+ /**
+ * NOTE: disposal of JFaceResources fonts handled by registry.
+ */
+ public static void dispose() {
+ CONTEXT_ACTIVE.dispose();
+ HYPERLINK_WIDGET.dispose();
+ TEXT_QUOTED.dispose();
+ TEXT_SPELLING_ERROR.dispose();
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonFonts.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonFonts.java
new file mode 100644
index 0000000..3638453
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonFonts.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.lang.reflect.Field;
+
+import org.eclipse.jface.resource.FontRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class CommonFonts {
+
+ public static Font BOLD;
+
+ public static Font ITALIC;
+
+ public static Font BOLD_ITALIC;
+
+ public static Font STRIKETHROUGH = null;
+
+ public static boolean HAS_STRIKETHROUGH;
+
+ static {
+ if (Display.getCurrent() != null) {
+ init();
+ } else {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ init();
+ }
+ });
+ }
+ }
+
+ private static void init() {
+ BOLD = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
+ ITALIC = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
+ BOLD_ITALIC = new Font(Display.getCurrent(), getModifiedFontData(ITALIC.getFontData(), SWT.BOLD | SWT.ITALIC));
+
+ Font defaultFont = JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT);
+ FontData[] defaultData = defaultFont.getFontData();
+ if (defaultData != null && defaultData.length == 1) {
+ FontData data = new FontData(defaultData[0].getName(), defaultData[0].getHeight(),
+ defaultData[0].getStyle());
+
+ if ("win32".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ // NOTE: Windows only, for: data.data.lfStrikeOut = 1;
+ try {
+ Field dataField = data.getClass().getDeclaredField("data"); //$NON-NLS-1$
+ Object dataObject = dataField.get(data);
+ Class<?> clazz = dataObject.getClass().getSuperclass();
+ Field strikeOutFiled = clazz.getDeclaredField("lfStrikeOut"); //$NON-NLS-1$
+ strikeOutFiled.set(dataObject, (byte) 1);
+ CommonFonts.STRIKETHROUGH = new Font(Display.getCurrent(), data);
+ } catch (Throwable t) {
+ // ignore
+ }
+ }
+ }
+ if (CommonFonts.STRIKETHROUGH == null) {
+ CommonFonts.HAS_STRIKETHROUGH = false;
+ CommonFonts.STRIKETHROUGH = defaultFont;
+ } else {
+ CommonFonts.HAS_STRIKETHROUGH = true;
+ }
+ }
+
+ /**
+ * NOTE: disposal of JFaceResources fonts handled by registry.
+ */
+ public static void dispose() {
+ if (CommonFonts.STRIKETHROUGH != null && !CommonFonts.STRIKETHROUGH.isDisposed()) {
+ CommonFonts.STRIKETHROUGH.dispose();
+ CommonFonts.BOLD_ITALIC.dispose();
+ }
+ }
+
+ /**
+ * Copied from {@link FontRegistry}
+ */
+ private static FontData[] getModifiedFontData(FontData[] baseData, int style) {
+ FontData[] styleData = new FontData[baseData.length];
+ for (int i = 0; i < styleData.length; i++) {
+ FontData base = baseData[i];
+ styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle() | style);
+ }
+
+ return styleData;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonFormUtil.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonFormUtil.java
new file mode 100644
index 0000000..5d311f3
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonFormUtil.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.lang.reflect.Method;
+
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.internal.forms.widgets.FormUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CommonFormUtil {
+
+ public static void disableScrollingOnFocus(ScrolledForm form) {
+ form.setData(FormUtil.FOCUS_SCROLLING, Boolean.FALSE);
+ }
+
+ public static void ensureVisible(Control control) {
+ ScrolledComposite form = FormUtil.getScrolledComposite(control);
+ if (form != null) {
+ FormUtil.ensureVisible(form, control);
+ }
+ }
+
+ /**
+ * Programmatically expand the provided ExpandableComposite, using reflection to fire the expansion listeners (see
+ * bug#70358)
+ *
+ * @param comp
+ */
+ public static void setExpanded(ExpandableComposite comp, boolean expanded) {
+ if (comp.isExpanded() != expanded) {
+ Method method = null;
+ try {
+ method = ExpandableComposite.class.getDeclaredMethod("programmaticToggleState"); //$NON-NLS-1$
+ method.setAccessible(true);
+ method.invoke(comp);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonImages.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonImages.java
new file mode 100644
index 0000000..a1bc9fd
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonImages.java
@@ -0,0 +1,380 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin;
+import org.eclipse.mylyn.internal.commons.ui.CompositeContainerImageDescriptor;
+import org.eclipse.mylyn.internal.commons.ui.CompositeElementImageDescriptor;
+import org.eclipse.mylyn.internal.commons.ui.CompositeSyncImageDescriptor;
+import org.eclipse.mylyn.internal.commons.ui.TaskListImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class CommonImages {
+
+ private static final URL baseURL = CommonsUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$
+
+ private static ImageRegistry imageRegistry;
+
+ private static final String T_ELCL = "elcl16"; //$NON-NLS-1$
+
+ private static final String T_EVIEW = "eview16"; //$NON-NLS-1$
+
+ private static final String T_TOOL = "etool16"; //$NON-NLS-1$
+
+ private static final String T_OBJ = "obj16"; //$NON-NLS-1$
+
+ private static final String T_OBJ_32 = "obj32"; //$NON-NLS-1$
+
+ private static final String T_WIZBAN = "wizban"; //$NON-NLS-1$
+
+ private static final String T_OVR = "ovr16"; //$NON-NLS-1$
+
+ // Priorities
+
+ public static final ImageDescriptor PRIORITY_1 = create(T_OBJ, "priority-1.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_2 = create(T_OBJ, "priority-2.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_3 = create(T_OBJ, "priority-3.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_4 = create(T_OBJ, "priority-4.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_5 = create(T_OBJ, "priority-5.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_1_LARGE = create(T_OBJ_32, "priority-critical.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_2_LARGE = create(T_OBJ_32, "priority-high.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_3_LARGE = create(T_OBJ_32, "priority-normal.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_4_LARGE = create(T_OBJ_32, "priority-low.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRIORITY_5_LARGE = create(T_OBJ_32, "priority-very-low.png"); //$NON-NLS-1$
+
+ // Calendars, people and notifications
+
+ public static final ImageDescriptor CALENDAR = create(T_TOOL, "calendar.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CALENDAR_SMALL = create(T_OBJ, "calendar-small.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor SCHEDULE_DAY = create(T_TOOL, "schedule-day.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor SCHEDULE_WEEK = create(T_TOOL, "schedule-week.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PERSON = create(T_TOOL, "person.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PERSON_NARROW = create(T_TOOL, "person-narrow.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PERSON_ME = create(T_TOOL, "person-me.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PERSON_ME_NARROW = create(T_TOOL, "person-me-narrow.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor NOTIFICATION_CLOSE = create(T_EVIEW, "notification-close.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor NOTIFICATION_CLOSE_HOVER = create(T_EVIEW, "notification-close-active.gif"); //$NON-NLS-1$
+
+ // Date and synchronization overlays
+
+ public static final ImageDescriptor OVERLAY_DATE_DUE = create(T_EVIEW, "overlay-has-due.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_DATE_OVERDUE = create(T_EVIEW, "overlay-overdue.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_IN_PROGRESS = create(T_EVIEW, "overlay-synchronizing.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_INCOMMING = create(T_EVIEW, "overlay-incoming.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_INCOMMING_NEW = create(T_EVIEW, "overlay-incoming-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_OUTGOING = create(T_EVIEW, "overlay-outgoing.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_OUTGOING_NEW = create(T_EVIEW, "overlay-outgoing-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_CONFLICT = create(T_EVIEW, "overlay-conflict.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_WARNING = create(T_OVR, "overlay-warning.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_OLD_INCOMMING = create(T_EVIEW, "overlay-synch-incoming.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_OLD_INCOMMING_NEW = create(T_EVIEW,
+ "overlay-synch-incoming-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_SYNC_OLD_OUTGOING = create(T_EVIEW, "overlay-synch-outgoing.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_CLEAR = create(T_OVR, "overlay-blank.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_WHITE = create(T_OVR, "solid-white.gif"); //$NON-NLS-1$
+
+ // Wizard banners
+
+ public static final ImageDescriptor BANNER_SCREENSHOT = create(T_WIZBAN, "banner-discovery.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BANNER_IMPORT = create(T_TOOL, "discovery.gif"); //$NON-NLS-1$
+
+ // Discovery
+
+ public static final ImageDescriptor DISCOVERY = create(T_TOOL, "discovery.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BANNER_DISOVERY = create(T_WIZBAN, "banner-discovery.png"); //$NON-NLS-1$
+
+ // Miscellaneous
+ // TODO: some of the common images below come from the workbench
+
+ public static final ImageDescriptor COMPLETE = create(T_OBJ, "complete.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REMOVE = create(T_ELCL, "remove.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor DELETE = create(T_ELCL, "delete.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor WARNING = create(T_ELCL, "warning.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILTER_COMPLETE = create(T_ELCL, "filter-complete.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILTER_ARCHIVE = create(T_ELCL, "filter-archive.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILTER_PRIORITY = create(T_ELCL, "filter-priority.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COLOR_PALETTE = create(T_ELCL, "color-palette.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILTER = create(T_TOOL, "view-filter.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FIND_CLEAR = create(T_TOOL, "find-clear.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FIND_CLEAR_DISABLED = create(T_TOOL, "find-clear-disabled.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BROWSER_SMALL = create(T_OBJ, "browser-small.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BROWSER_OPEN_TASK = create(T_TOOL, "open-browser.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TOOLBAR_ARROW_RIGHT = create(T_TOOL, "toolbar-arrow-right.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TOOLBAR_ARROW_DOWN = create(T_TOOL, "toolbar-arrow-down.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor LINK_EDITOR = create(T_TOOL, "link-editor.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CLEAR = create(T_TOOL, "clear.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EDIT = create(T_TOOL, "edit.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CUT = create(T_TOOL, "cut.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor UNDO = create(T_TOOL, "undo_edit.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REDO = create(T_TOOL, "redo_edit.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor STATUS_NORMAL = create(T_EVIEW, "status-normal.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor STATUS_CONTEXT = create(T_EVIEW, "status-server-context.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PRESENTATION = create(T_TOOL, "presentation.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor GROUPING = create(T_TOOL, "grouping.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COPY = create(T_TOOL, "copy.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor GO_UP = create(T_TOOL, "go-up.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor GO_INTO = create(T_TOOL, "go-into.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REFRESH = create(T_ELCL, "refresh.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REFRESH_SMALL = create(T_ELCL, "refresh-small.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COLLAPSE_ALL = create(T_ELCL, "collapseall.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COLLAPSE_ALL_SMALL = create(T_ELCL, "collapseall-small.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EXPAND_ALL = create(T_ELCL, "expandall.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor EXPAND_ALL_SMALL = create(T_ELCL, "expandall-small.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BLANK = create(T_ELCL, "blank.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor IMAGE_CAPTURE = create(T_TOOL, "capture-screen.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor IMAGE_FIT = create(T_TOOL, "capture-fit.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor IMAGE_FILE = create(T_OBJ, "file-image.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILE_PLAIN = create(T_OBJ, "file-plain.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor QUESTION = create(T_OBJ, "question.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor INFORMATION = create(T_OBJ, "message_info.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor SEPARATOR_LIST = create(T_TOOL, "content-assist-separator.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PART_MAXIMIZE = create(T_TOOL, "maximize.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor PREVIEW_WEB = create(T_TOOL, "preview-web.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor WEB = create(T_TOOL, "web.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FIND = create(T_TOOL, "find.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor SAVE = create(T_TOOL, "save.gif"); //$NON-NLS-1$;
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ /**
+ * Lazily initializes image map.
+ *
+ * @param imageDescriptor
+ * @return Image
+ */
+ public static Image getImage(ImageDescriptor imageDescriptor) {
+ ImageRegistry imageRegistry = getImageRegistry();
+ Image image = imageRegistry.get("" + imageDescriptor.hashCode()); //$NON-NLS-1$
+ if (image == null) {
+ image = imageDescriptor.createImage(true);
+ imageRegistry.put("" + imageDescriptor.hashCode(), image); //$NON-NLS-1$
+ }
+ return image;
+ }
+
+ public static Image getImageWithOverlay(ImageDescriptor icon, ImageDescriptor overlay, boolean top, boolean left) {
+ if (icon == null) {
+ return null;
+ }
+ String key = "" + icon.hashCode(); //$NON-NLS-1$
+ if (overlay != null) {
+ key += overlay.hashCode();
+ }
+ key += new Boolean(top).hashCode();
+ key += new Boolean(left).hashCode();
+
+ Image image = getImageRegistry().get(key);
+
+ if (image == null) {
+ TaskListImageDescriptor imageDescriptor = new TaskListImageDescriptor(icon, overlay, top, left);
+ image = imageDescriptor.createImage(true);
+ getImageRegistry().put(key, image);
+ }
+ return image;
+ }
+
+ /**
+ * Lazily initializes image map.
+ *
+ * @param icon
+ * cannot be null
+ * @param overlayKind
+ * @param wide
+ * @return Image
+ */
+ public static Image getCompositeTaskImage(ImageDescriptor icon, ImageDescriptor overlayKind, boolean wide) {
+ if (icon == null) {
+ return null;
+ }
+ String key = "" + icon.hashCode(); //$NON-NLS-1$
+ if (overlayKind != null) {
+ key += overlayKind.hashCode();
+ }
+ if (wide) {
+ key += ".wide"; //$NON-NLS-1$
+ }
+ Image image = getImageRegistry().get(key);
+
+ if (image == null) {
+ CompositeElementImageDescriptor imageDescriptor = new CompositeElementImageDescriptor(icon, overlayKind,
+ wide);
+ image = imageDescriptor.createImage(true);
+ getImageRegistry().put(key, image);
+ }
+ return image;
+ }
+
+ public static Image getCompositeContainerImage(ImageDescriptor icon, boolean wide) {
+ if (icon == null) {
+ return null;
+ }
+ String key = "" + icon.hashCode(); //$NON-NLS-1$
+ if (wide) {
+ key += ".wide"; //$NON-NLS-1$
+ }
+ Image image = getImageRegistry().get(key);
+ if (image == null) {
+ CompositeContainerImageDescriptor imageDescriptor = new CompositeContainerImageDescriptor(icon,
+ OVERLAY_CLEAR, wide);
+ image = imageDescriptor.createImage(true);
+ getImageRegistry().put(key, image);
+ }
+ return image;
+ }
+
+ public static Image getCompositeSynchImage(ImageDescriptor icon, boolean background) {
+ String key = "" + icon.hashCode(); //$NON-NLS-1$
+ if (background) {
+ key += ".background"; //$NON-NLS-1$
+ }
+
+ Image image = getImageRegistry().get(key);
+ if (image == null) {
+ CompositeSyncImageDescriptor imageDescriptor = new CompositeSyncImageDescriptor(icon, background);
+ image = imageDescriptor.createImage(true);
+ getImageRegistry().put(key, image);
+ }
+ return image;
+ }
+
+ private static ImageRegistry getImageRegistry() {
+ if (imageRegistry == null) {
+ imageRegistry = new ImageRegistry();
+ }
+
+ return imageRegistry;
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuffer buffer = new StringBuffer(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+ private static Image[] progressImages;
+
+ public static Image[] getProgressImages() {
+
+ if (progressImages != null) {
+ return progressImages;
+ }
+
+ progressImages = new Image[8];
+
+ for (int i = 1; i <= 8; i++) {
+ ImageDescriptor imageDescriptor = create(T_EVIEW + "/progress", i + ".png"); //$NON-NLS-1$ //$NON-NLS-2$
+ progressImages[i - 1] = getImage(imageDescriptor);
+ }
+
+ return progressImages;
+
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonTextSupport.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonTextSupport.java
new file mode 100644
index 0000000..a61ef72
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonTextSupport.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.IHandler;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.commands.ActionHandler;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationAccess;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.ActiveShellExpression;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.handlers.IHandlerActivation;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+
+/**
+ * Utility class that enables edit actions, content assist and quick fixing for {@link TextViewer} and
+ * {@link SourceViewer} controls.
+ *
+ * @author Steffen Pingel
+ */
+public class CommonTextSupport {
+
+ private class TextViewerFocusListener implements FocusListener {
+
+ private final boolean spellCheck;
+
+ private final TextViewer viewer;
+
+ public TextViewerFocusListener(TextViewer viewer, boolean spellCheck) {
+ this.viewer = viewer;
+ this.spellCheck = spellCheck;
+ }
+
+ public void focusGained(FocusEvent e) {
+ if (selectionChangedListener != null) {
+ selectionChangedListener.selectionChanged(new SelectionChangedEvent(viewer, viewer.getSelection()));
+ }
+ activateHandlers(viewer, spellCheck);
+ }
+
+ public void focusLost(FocusEvent e) {
+ deactivateHandlers();
+ if (selectionChangedListener != null) {
+ // make sure selection no text is selected when control looses focus
+ StyledText st = (StyledText) e.widget;
+ st.setSelectionRange(st.getCaretOffset(), 0);
+ // update action enablement
+ selectionChangedListener.selectionChanged(new SelectionChangedEvent(viewer, StructuredSelection.EMPTY));
+ }
+ }
+ }
+
+ private static final String KEY_TEXT_VIEWER = "textViewer"; //$NON-NLS-1$
+
+ private static boolean canDoGlobalAction(String actionId, TextViewer textViewer) {
+ if (actionId.equals(ActionFactory.CUT.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.CUT);
+ } else if (actionId.equals(ActionFactory.COPY.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.COPY);
+ } else if (actionId.equals(ActionFactory.PASTE.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.PASTE);
+ } else if (actionId.equals(ActionFactory.DELETE.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.DELETE);
+ } else if (actionId.equals(ActionFactory.UNDO.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.UNDO);
+ } else if (actionId.equals(ActionFactory.REDO.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.REDO);
+ } else if (actionId.equals(ActionFactory.SELECT_ALL.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.SELECT_ALL);
+ }
+ return false;
+ }
+
+ public static boolean canPerformAction(String actionId, Control focusControl) {
+ TextViewer viewer = getTextViewer(focusControl);
+ if (viewer != null) {
+ return canDoGlobalAction(actionId, viewer);
+ }
+ if (actionId.equals(ActionFactory.UNDO.getId()) || actionId.equals(ActionFactory.REDO.getId())) {
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean canPerformDirectly(String id, Control control) {
+ if (control instanceof Text) {
+ Text text = (Text) control;
+ if (id.equals(ActionFactory.CUT.getId())) {
+ text.cut();
+ return true;
+ }
+ if (id.equals(ActionFactory.COPY.getId())) {
+ text.copy();
+ return true;
+ }
+ if (id.equals(ActionFactory.PASTE.getId())) {
+ text.paste();
+ return true;
+ }
+ if (id.equals(ActionFactory.SELECT_ALL.getId())) {
+ text.selectAll();
+ return true;
+ }
+ if (id.equals(ActionFactory.DELETE.getId())) {
+ int count = text.getSelectionCount();
+ if (count == 0) {
+ int caretPos = text.getCaretPosition();
+ text.setSelection(caretPos, caretPos + 1);
+ }
+ text.insert(""); //$NON-NLS-1$
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static void doAction(String actionId, Control focusControl) {
+ if (canPerformDirectly(actionId, focusControl)) {
+ return;
+ }
+ TextViewer viewer = getTextViewer(focusControl);
+ if (viewer != null) {
+ doGlobalAction(actionId, viewer);
+ }
+ }
+
+ private static boolean doGlobalAction(String actionId, TextViewer textViewer) {
+ if (actionId.equals(ActionFactory.CUT.getId())) {
+ textViewer.doOperation(ITextOperationTarget.CUT);
+ return true;
+ } else if (actionId.equals(ActionFactory.COPY.getId())) {
+ textViewer.doOperation(ITextOperationTarget.COPY);
+ return true;
+ } else if (actionId.equals(ActionFactory.PASTE.getId())) {
+ textViewer.doOperation(ITextOperationTarget.PASTE);
+ return true;
+ } else if (actionId.equals(ActionFactory.DELETE.getId())) {
+ textViewer.doOperation(ITextOperationTarget.DELETE);
+ return true;
+ } else if (actionId.equals(ActionFactory.UNDO.getId())) {
+ textViewer.doOperation(ITextOperationTarget.UNDO);
+ return true;
+ } else if (actionId.equals(ActionFactory.REDO.getId())) {
+ textViewer.doOperation(ITextOperationTarget.REDO);
+ return true;
+ } else if (actionId.equals(ActionFactory.SELECT_ALL.getId())) {
+ textViewer.doOperation(ITextOperationTarget.SELECT_ALL);
+ return true;
+ }
+ return false;
+ }
+
+ public static TextViewer getTextViewer(Widget widget) {
+ if (widget instanceof StyledText) {
+ Object data = widget.getData(KEY_TEXT_VIEWER);
+ if (data instanceof TextViewer) {
+ return (TextViewer) data;
+ }
+ }
+ return null;
+ }
+
+ public static void setTextViewer(Widget widget, TextViewer textViewer) {
+ widget.setData(KEY_TEXT_VIEWER, textViewer);
+ }
+
+ public IHandlerActivation contentAssistHandlerActivation;
+
+ private final IHandlerService handlerService;
+
+ private IHandlerActivation quickAssistHandlerActivation;
+
+ private ISelectionChangedListener selectionChangedListener;
+
+ public CommonTextSupport(IHandlerService handlerService) {
+ Assert.isNotNull(handlerService);
+ this.handlerService = handlerService;
+ }
+
+ private IHandlerActivation activateHandler(TextViewer viewer, int operation, String actionDefinitionId) {
+ IHandler handler = createActionHandler(viewer, operation, actionDefinitionId);
+ return handlerService.activateHandler(actionDefinitionId, handler, //
+ new ActiveShellExpression(viewer.getTextWidget().getShell()));
+ }
+
+ private void activateHandlers(TextViewer viewer, boolean spellCheck) {
+ deactivateHandlers();
+ if (spellCheck) {
+ quickAssistHandlerActivation = activateHandler(viewer, ISourceViewer.QUICK_ASSIST,
+ ITextEditorActionDefinitionIds.QUICK_ASSIST);
+ }
+ contentAssistHandlerActivation = activateHandler(viewer, ISourceViewer.CONTENTASSIST_PROPOSALS,
+ ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+ }
+
+ public void configure(final TextViewer viewer, Document document, boolean spellCheck) {
+ if (spellCheck && viewer instanceof ISourceViewer) {
+ configureAsEditor((ISourceViewer) viewer, document);
+ } else {
+ viewer.setDocument(document);
+ }
+ install(viewer, spellCheck);
+ }
+
+ /** Configures annotation model for spell checking. */
+ private void configureAsEditor(ISourceViewer viewer, Document document) {
+ IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
+ final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null, annotationAccess,
+ EditorsUI.getSharedTextColors());
+ Iterator<?> e = new MarkerAnnotationPreferences().getAnnotationPreferences().iterator();
+ while (e.hasNext()) {
+ support.setAnnotationPreference((AnnotationPreference) e.next());
+ }
+ support.install(EditorsUI.getPreferenceStore());
+ viewer.getTextWidget().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ support.uninstall();
+ }
+ });
+ AnnotationModel annotationModel = new AnnotationModel();
+ viewer.setDocument(document, annotationModel);
+ }
+
+ private IHandler createActionHandler(final ITextOperationTarget viewer, final int operation,
+ String actionDefinitionId) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ if (viewer.canDoOperation(operation)) {
+ viewer.doOperation(operation);
+ }
+ }
+ };
+ action.setActionDefinitionId(actionDefinitionId);
+ return new ActionHandler(action);
+ }
+
+ private void deactivateHandlers() {
+ if (quickAssistHandlerActivation != null) {
+ handlerService.deactivateHandler(quickAssistHandlerActivation);
+ quickAssistHandlerActivation = null;
+ }
+ if (contentAssistHandlerActivation != null) {
+ handlerService.deactivateHandler(contentAssistHandlerActivation);
+ contentAssistHandlerActivation = null;
+ }
+ }
+
+ public void dispose() {
+ deactivateHandlers();
+ }
+
+ public ISelectionChangedListener getSelectionChangedListener() {
+ return selectionChangedListener;
+ }
+
+ public void install(final TextViewer viewer, boolean spellCheck) {
+ viewer.getControl().addFocusListener(new TextViewerFocusListener(viewer, spellCheck));
+ if (selectionChangedListener != null) {
+ viewer.addSelectionChangedListener(selectionChangedListener);
+ viewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ if (selectionChangedListener != null) {
+ selectionChangedListener.selectionChanged(new SelectionChangedEvent(viewer,
+ viewer.getSelection()));
+ }
+ }
+ });
+ }
+ setTextViewer(viewer.getControl(), viewer);
+ }
+
+ public void setSelectionChangedListener(ISelectionChangedListener selectionChangedListener) {
+ this.selectionChangedListener = selectionChangedListener;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonThemes.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonThemes.java
new file mode 100644
index 0000000..dccbdce
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonThemes.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class CommonThemes {
+
+ public static final String COLOR_INCOMING_BACKGROUND = "org.eclipse.mylyn.tasks.ui.colors.incoming.background"; //$NON-NLS-1$
+
+ public static final String COLOR_SCHEDULED_PAST = "org.eclipse.mylyn.tasks.ui.colors.foreground.past.scheduled"; //$NON-NLS-1$
+
+ public static final String COLOR_OVERDUE = "org.eclipse.mylyn.tasks.ui.colors.foreground.past.due"; //$NON-NLS-1$
+
+ public static final String COLOR_SCHEDULED_THIS_WEEK = "org.eclipse.mylyn.tasks.ui.colors.foreground.thisweek.scheduled"; //$NON-NLS-1$
+
+ public static final String COLOR_COMPLETED = "org.eclipse.mylyn.tasks.ui.colors.foreground.completed"; //$NON-NLS-1$
+
+ public static final String COLOR_SCHEDULED_TODAY = "org.eclipse.mylyn.tasks.ui.colors.foreground.today.scheduled"; //$NON-NLS-1$
+
+ public static final String COLOR_COMPLETED_TODAY = "org.eclipse.mylyn.tasks.ui.colors.foreground.today.completed"; //$NON-NLS-1$
+
+ public static final String COLOR_CATEGORY_GRADIENT_START = "org.eclipse.mylyn.tasks.ui.colors.category.gradient.start"; //$NON-NLS-1$
+
+ public static final String COLOR_CATEGORY_GRADIENT_END = "org.eclipse.mylyn.tasks.ui.colors.category.gradient.end"; //$NON-NLS-1$
+
+ public static final String COLOR_CATEGORY = COLOR_CATEGORY_GRADIENT_END;
+
+ public static final String FONT_EDITOR_COMMENT = "org.eclipse.mylyn.tasks.ui.fonts.task.editor.comment"; //$NON-NLS-1$
+
+ public static boolean isCommonTheme(String property) {
+ if (property == null) {
+ return false;
+ } else {
+ return property.equals(COLOR_CATEGORY) || property.equals(COLOR_OVERDUE)
+ || property.equals(COLOR_SCHEDULED_PAST) || property.equals(COLOR_COMPLETED_TODAY)
+ || property.equals(COLOR_SCHEDULED_TODAY) || property.equals(COLOR_SCHEDULED_THIS_WEEK)
+ || property.equals(COLOR_INCOMING_BACKGROUND) || property.equals(COLOR_CATEGORY_GRADIENT_START)
+ || property.equals(COLOR_CATEGORY_GRADIENT_END);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonUiUtil.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonUiUtil.java
new file mode 100644
index 0000000..311996e
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonUiUtil.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CommonUiUtil {
+
+ private static final String KEY_ENABLED = "org.eclipse.mylyn.commons.ui.enabled"; //$NON-NLS-1$
+
+ public static void busyCursorWhile(final ICoreRunnable runnable) throws OperationCanceledException, CoreException {
+ try {
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ runnable.run(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runner);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ throw (CoreException) e.getCause();
+ } else {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Unexpected exception", e)); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public static void run(IRunnableContext context, final ICoreRunnable runnable) throws CoreException {
+ try {
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ runnable.run(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ context.run(true, true, runner);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ throw (CoreException) e.getCause();
+ } else {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Unexpected exception", e)); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public static void runInUi(ICoreRunnable runnable, ISchedulingRule rule) throws CoreException {
+ runInUi(PlatformUI.getWorkbench().getProgressService(), runnable, rule);
+ }
+
+ public static void runInUi(IRunnableContext context, final ICoreRunnable runnable, ISchedulingRule rule)
+ throws CoreException {
+ try {
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ runnable.run(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ PlatformUI.getWorkbench().getProgressService().runInUI(context, runner, rule);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ throw (CoreException) e.getCause();
+ } else {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Unexpected exception", e)); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public static void setMessage(DialogPage page, IStatus status) {
+ String message = status.getMessage();
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ page.setMessage(null, IMessageProvider.NONE);
+ break;
+ case IStatus.INFO:
+ page.setMessage(message, IMessageProvider.INFORMATION);
+ break;
+ case IStatus.WARNING:
+ page.setMessage(message, IMessageProvider.WARNING);
+ break;
+ default:
+ page.setMessage(message, IMessageProvider.ERROR);
+ break;
+ }
+ }
+
+ /**
+ * Recursively sets the menu of all children of <code>composite</code>.
+ */
+ public static void setMenu(Composite composite, Menu menu) {
+ if (!composite.isDisposed()) {
+ composite.setMenu(menu);
+ for (Control child : composite.getChildren()) {
+ child.setMenu(menu);
+ if (child instanceof Composite) {
+ setMenu((Composite) child, menu);
+ }
+ }
+ }
+ }
+
+ public static void setEnabled(Composite composite, boolean restore) {
+ if (restore) {
+ restoreState(composite);
+ } else {
+ saveStateAndDisable(composite);
+ }
+ }
+
+ private static void saveStateAndDisable(Composite composite) {
+ if (!composite.isDisposed()) {
+ Object data = composite.getData(KEY_ENABLED);
+ if (data == null) {
+ if (!composite.getEnabled()) {
+ composite.setData(KEY_ENABLED, Boolean.FALSE);
+ } else {
+ composite.setData(KEY_ENABLED, Boolean.TRUE);
+ composite.setEnabled(false);
+ }
+ }
+ for (Control control : composite.getChildren()) {
+ if (control instanceof Composite) {
+ saveStateAndDisable((Composite) control);
+ } else {
+ data = control.getData(KEY_ENABLED);
+ if (data == null) {
+ if (!control.getEnabled()) {
+ control.setData(KEY_ENABLED, Boolean.FALSE);
+ } else {
+ control.setData(KEY_ENABLED, Boolean.TRUE);
+ control.setEnabled(false);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private static void restoreState(Composite composite) {
+ if (!composite.isDisposed()) {
+ Object data = composite.getData(KEY_ENABLED);
+ if (data != null) {
+ if (data == Boolean.TRUE) {
+ composite.setEnabled(data == Boolean.TRUE);
+ }
+ composite.setData(KEY_ENABLED, null);
+ }
+ for (Control control : composite.getChildren()) {
+ if (control instanceof Composite) {
+ restoreState((Composite) control);
+ } else {
+ data = control.getData(KEY_ENABLED);
+ if (data != null) {
+ if (data == Boolean.TRUE) {
+ control.setEnabled(true);
+ }
+ control.setData(KEY_ENABLED, null);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonsUiUtil.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonsUiUtil.java
new file mode 100644
index 0000000..ebe7369
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/CommonsUiUtil.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ * @deprecated use {@link CommonUiUtil} instead
+ */
+ at Deprecated
+public class CommonsUiUtil {
+
+ public static void busyCursorWhile(final ICoreRunnable runnable) throws OperationCanceledException, CoreException {
+ try {
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ runnable.run(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runner);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ throw (CoreException) e.getCause();
+ } else {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Unexpected exception", e)); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public static void run(IRunnableContext context, final ICoreRunnable runnable) throws CoreException {
+ try {
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ runnable.run(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ context.run(true, true, runner);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ throw (CoreException) e.getCause();
+ } else {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Unexpected exception", e)); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public static void runInUi(ICoreRunnable runnable, ISchedulingRule rule) throws CoreException {
+ runInUi(PlatformUI.getWorkbench().getProgressService(), runnable, rule);
+ }
+
+ public static void runInUi(IRunnableContext context, final ICoreRunnable runnable, ISchedulingRule rule)
+ throws CoreException {
+ try {
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ runnable.run(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ PlatformUI.getWorkbench().getProgressService().runInUI(context, runner, rule);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ throw (CoreException) e.getCause();
+ } else {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Unexpected exception", e)); //$NON-NLS-1$
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public static void setMessage(DialogPage page, IStatus status) {
+ String message = status.getMessage();
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ page.setMessage(null, IMessageProvider.NONE);
+ break;
+ case IStatus.INFO:
+ page.setMessage(message, IMessageProvider.INFORMATION);
+ break;
+ case IStatus.WARNING:
+ page.setMessage(message, IMessageProvider.WARNING);
+ break;
+ default:
+ page.setMessage(message, IMessageProvider.ERROR);
+ break;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DatePicker.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DatePicker.java
new file mode 100644
index 0000000..222fa48
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DatePicker.java
@@ -0,0 +1,295 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.commons.ui.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Temporary date picker from patch posted to: https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=19945
+ *
+ * see bug# 19945
+ *
+ * TODO: remove this class when an SWT date picker is added
+ *
+ * @author Bahadir Yagan
+ * @author Mik Kersten
+ * @since 1.0
+ */
+public class DatePicker extends Composite {
+
+ public final static String TITLE_DIALOG = Messages.DatePicker_Choose_Date;
+
+ public static final String LABEL_CHOOSE = Messages.DatePicker_Choose_Date;
+
+ private Text dateText;
+
+ private Button pickButton;
+
+ private Calendar date;
+
+ private final List<SelectionListener> pickerListeners = new LinkedList<SelectionListener>();
+
+ private DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
+
+ private String initialText = LABEL_CHOOSE;
+
+ private final boolean includeTimeOfday;
+
+ private final int hourOfDay = 0;
+
+ private int selectedHourOfDay = 0;
+
+ public DatePicker(Composite parent, int style, String initialText, boolean includeHours, int selectedHourOfDay) {
+ super(parent, style);
+ this.initialText = initialText;
+ this.includeTimeOfday = includeHours;
+ this.selectedHourOfDay = selectedHourOfDay;
+ initialize((style & SWT.FLAT) != 0 ? SWT.FLAT : 0);
+ }
+
+ public DateFormat getDateFormat() {
+ return dateFormat;
+ }
+
+ public void setDatePattern(String pattern) {
+ this.dateFormat = new SimpleDateFormat(pattern);
+ }
+
+ public void setDateFormat(DateFormat dateFormat) {
+ this.dateFormat = dateFormat;
+ }
+
+ private void initialize(int style) {
+ GridLayout gridLayout = new GridLayout(2, false);
+ gridLayout.horizontalSpacing = 0;
+ gridLayout.verticalSpacing = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ this.setLayout(gridLayout);
+
+ dateText = new Text(this, style);
+ GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false);
+ dateTextGridData.grabExcessHorizontalSpace = true;
+ dateTextGridData.verticalAlignment = SWT.FILL;
+
+ dateText.setLayoutData(dateTextGridData);
+ dateText.setText(initialText);
+ dateText.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // key listener used because setting of date picker text causes
+ // modify listener to fire which results in perpetual dirty
+ // editor
+ notifyPickerListeners();
+ }
+ });
+
+ dateText.addFocusListener(new FocusAdapter() {
+ Calendar calendar = Calendar.getInstance();
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ Date reminderDate;
+ try {
+ reminderDate = dateFormat.parse(dateText.getText());
+ calendar.setTime(reminderDate);
+ date = calendar;
+ updateDateText();
+ } catch (ParseException e1) {
+ updateDateText();
+ }
+
+ }
+ });
+
+ pickButton = new Button(this, style | SWT.ARROW | SWT.DOWN);
+ GridData pickButtonGridData = new GridData(SWT.RIGHT, SWT.FILL, false, true);
+ pickButtonGridData.verticalIndent = 0;
+ pickButton.setLayoutData(pickButtonGridData);
+ pickButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent arg0) {
+ Calendar newCalendar = Calendar.getInstance();
+ newCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
+ newCalendar.set(Calendar.MINUTE, 0);
+ newCalendar.set(Calendar.SECOND, 0);
+ newCalendar.set(Calendar.MILLISECOND, 0);
+ if (date != null) {
+ newCalendar.setTime(date.getTime());
+ }
+
+ Shell shell = null;
+ if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ } else {
+ shell = new Shell(PlatformUI.getWorkbench().getDisplay());
+ }
+ DateSelectionDialog dialog = new DateSelectionDialog(shell, newCalendar, DatePicker.TITLE_DIALOG,
+ includeTimeOfday, selectedHourOfDay);
+ pickButton.setEnabled(false);
+ dateText.setEnabled(false);
+
+ int dialogResponse = dialog.open();
+ if (dialog.getDate() != null) {
+ newCalendar.setTime(dialog.getDate());
+ } else {
+ newCalendar = null;
+ }
+ dateSelected(dialogResponse == Window.CANCEL, newCalendar);
+
+ // Display display = Display.getCurrent();
+ // showDatePicker((display.getCursorLocation().x),
+ // (display.getCursorLocation().y));
+ }
+ });
+
+ pack();
+ }
+
+ public void addPickerSelectionListener(SelectionListener listener) {
+ pickerListeners.add(listener);
+ }
+
+ /**
+ * must check for null return value
+ *
+ * @return Calendar
+ */
+ public Calendar getDate() {
+ return date;
+ }
+
+ @Override
+ public void setBackground(Color backgroundColor) {
+ dateText.setBackground(backgroundColor);
+ pickButton.setBackground(backgroundColor);
+ super.setBackground(backgroundColor);
+ }
+
+ public void setDate(Calendar date) {
+ this.date = date;
+ updateDateText();
+ }
+
+ // private void showDatePicker(int x, int y) {
+ // pickerShell = new Shell(SWT.APPLICATION_MODAL);//| SWT.ON_TOP
+ // pickerShell.setText("Shell");
+ // pickerShell.setLayout(new FillLayout());
+ // if (date == null) {
+ // date = new GregorianCalendar();
+ // }
+ // // datePickerPanel.setDate(date);
+ // datePickerPanel = new DatePickerPanel(pickerShell, SWT.NONE, date);
+ // datePickerPanel.addSelectionChangedListener(new
+ // ISelectionChangedListener() {
+ //
+ // public void selectionChanged(SelectionChangedEvent event) {
+ // if(!event.getSelection().isEmpty()) {
+ // dateSelected(event.getSelection().isEmpty(),
+ // ((DateSelection)event.getSelection()).getDate());
+ // } else {
+ // dateSelected(false, null);
+ // }
+ // }});
+ //
+ // pickerShell.setSize(new Point(240, 180));
+ // pickerShell.setLocation(new Point(x, y));
+ //
+ // datePickerPanel.addKeyListener(new KeyListener() {
+ // public void keyPressed(KeyEvent e) {
+ // if (e.keyCode == SWT.ESC) {
+ // dateSelected(true, null);
+ // }
+ // }
+ //
+ // public void keyReleased(KeyEvent e) {
+ // }
+ // });
+ //
+ // pickerShell.addFocusListener(new FocusListener() {
+ //
+ // public void focusGained(FocusEvent e) {
+ //
+ // }
+ //
+ // public void focusLost(FocusEvent e) {
+ //
+ // }});
+ //
+ // pickerShell.pack();
+ // pickerShell.open();
+ // }
+
+ /** Called when the user has selected a date */
+ protected void dateSelected(boolean canceled, Calendar selectedDate) {
+
+ if (!canceled) {
+ this.date = selectedDate != null ? selectedDate : null;
+ updateDateText();
+ notifyPickerListeners();
+ }
+
+ pickButton.setEnabled(true);
+ dateText.setEnabled(true);
+ }
+
+ private void notifyPickerListeners() {
+ for (SelectionListener listener : pickerListeners) {
+ listener.widgetSelected(null);
+ }
+ }
+
+ private void updateDateText() {
+ if (date != null) {
+ Date currentDate = new Date(date.getTimeInMillis());
+ dateText.setText(dateFormat.format(currentDate));
+ } else {
+ dateText.setEnabled(false);
+ dateText.setText(LABEL_CHOOSE);
+ dateText.setEnabled(true);
+ }
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ dateText.setEnabled(enabled);
+ pickButton.setEnabled(enabled);
+ super.setEnabled(enabled);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DatePickerPanel.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DatePickerPanel.java
new file mode 100644
index 0000000..2bff691
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DatePickerPanel.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Bahadir Yagan - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.commons.ui;
+
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.ListViewer;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DateTime;
+
+/**
+ * @author Bahadir Yagan
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class DatePickerPanel extends Composite implements KeyListener, ISelectionProvider {
+
+ private org.eclipse.swt.widgets.List timeList = null;
+
+ private ISelection selection = null;
+
+ private Calendar date = null;
+
+ private DateTime calendar = null;
+
+ private final List<ISelectionChangedListener> selectionListeners = new ArrayList<ISelectionChangedListener>();
+
+ private int hourOfDay = 0;
+
+ public DatePickerPanel(Composite parent, int style, Calendar initialDate, boolean includeTime, int hourOfDay) {
+ super(parent, style);
+ this.date = initialDate;
+ this.hourOfDay = hourOfDay;
+ initialize(includeTime);
+ setDate(date);
+ //this.setBackground()
+ }
+
+ private void initialize(boolean includeTime) {
+ if (date == null) {
+ date = Calendar.getInstance();
+ date.set(Calendar.HOUR_OF_DAY, hourOfDay);
+ date.set(Calendar.MINUTE, 0);
+ date.set(Calendar.SECOND, 0);
+ date.set(Calendar.MILLISECOND, 0);
+ }
+
+ GridLayout gridLayout = new GridLayout();
+ if (includeTime) {
+ gridLayout.numColumns = 2;
+ } else {
+ gridLayout.numColumns = 2;
+ }
+ this.setLayout(gridLayout);
+
+ calendar = new DateTime(this, SWT.CALENDAR);
+ calendar.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ date.set(Calendar.YEAR, calendar.getYear());
+ date.set(Calendar.MONTH, calendar.getMonth());
+ date.set(Calendar.DAY_OF_MONTH, calendar.getDay());
+ setSelection(new DateSelection(date));
+ notifyListeners(new SelectionChangedEvent(DatePickerPanel.this, getSelection()));
+ }
+ });
+
+ if (includeTime) {
+ createTimeList(this);
+ }
+ }
+
+ /**
+ * This method initializes the month combo
+ *
+ */
+ private void createTimeList(Composite composite) {
+
+ DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
+ Calendar tempCalendar = Calendar.getInstance();
+ tempCalendar.set(Calendar.MINUTE, 0);
+ tempCalendar.set(Calendar.SECOND, 0);
+ String[] times = new String[24];
+ for (int x = 0; x < 24; x++) {
+ tempCalendar.set(Calendar.HOUR_OF_DAY, x);
+ String timeString = dateFormat.format(tempCalendar.getTime());
+ times[x] = timeString;
+ }
+
+ ListViewer listViewer = new ListViewer(composite);
+
+ listViewer.setContentProvider(new ArrayContentProvider());
+ listViewer.setInput(times);
+
+ timeList = listViewer.getList();
+
+ listViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ date.set(Calendar.HOUR_OF_DAY, timeList.getSelectionIndex());
+ date.set(Calendar.MINUTE, 0);
+ setSelection(new DateSelection(date));
+ notifyListeners(new SelectionChangedEvent(DatePickerPanel.this, getSelection()));
+ }
+ });
+
+ GridDataFactory.fillDefaults().hint(SWT.DEFAULT, 150).grab(false, true).applyTo(timeList);
+ if (date != null) {
+ listViewer.setSelection(new StructuredSelection(times[date.get(Calendar.HOUR_OF_DAY)]), true);
+ } else {
+ listViewer.setSelection(new StructuredSelection(times[8]), true);
+ }
+ timeList.addKeyListener(this);
+ }
+
+ public void setDate(Calendar date) {
+ this.date = date;
+ calendar.setYear(date.get(Calendar.YEAR));
+ calendar.setMonth(date.get(Calendar.MONTH));
+ calendar.setDay(date.get(Calendar.DAY_OF_MONTH));
+ }
+
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == SWT.ESC) {
+ SelectionChangedEvent changeEvent = new SelectionChangedEvent(this, new ISelection() {
+ public boolean isEmpty() {
+ return true;
+ }
+ });
+ notifyListeners(changeEvent);
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+
+ private void notifyListeners(SelectionChangedEvent event) {
+ for (ISelectionChangedListener listener : selectionListeners) {
+ listener.selectionChanged(event);
+ }
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionListeners.add(listener);
+ }
+
+ public ISelection getSelection() {
+ return selection;
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionListeners.remove(listener);
+ }
+
+ public void setSelection(ISelection selection) {
+ this.selection = selection;
+ }
+
+ public class DateSelection implements ISelection {
+ private final Calendar date;
+
+ public DateSelection(Calendar calendar) {
+ date = calendar;
+ }
+
+ public boolean isEmpty() {
+ return date == null;
+ }
+
+ public Calendar getDate() {
+ return date;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DateSelectionDialog.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DateSelectionDialog.java
new file mode 100644
index 0000000..f81252b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DateSelectionDialog.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.mylyn.internal.commons.ui.Messages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePickerPanel.DateSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class DateSelectionDialog extends Dialog {
+
+ private Date selectedDate = null;
+
+ private String title = Messages.DateSelectionDialog_Date_Selection;
+
+ private final Calendar initialCalendar = Calendar.getInstance();
+
+ private boolean includeTime = true;
+
+ private int hourOfDay = 0;
+
+ public DateSelectionDialog(Shell parentShell, Calendar initialDate, String title, boolean includeTime, int hourOfDay) {
+ super(parentShell);
+ this.includeTime = includeTime;
+ this.hourOfDay = hourOfDay;
+ if (title != null) {
+ this.title = title;
+ }
+ if (initialDate != null) {
+ this.initialCalendar.setTime(initialDate.getTime());
+ }
+ selectedDate = initialCalendar.getTime();
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText(title);
+ final DatePickerPanel datePanel = new DatePickerPanel(parent, SWT.NULL, initialCalendar, includeTime, hourOfDay);
+ datePanel.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (!event.getSelection().isEmpty()) {
+ DateSelection dateSelection = (DateSelection) event.getSelection();
+ selectedDate = dateSelection.getDate().getTime();
+ }
+ }
+ });
+
+ datePanel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+
+ applyDialogFont(datePanel);
+ return datePanel;
+ }
+
+ @Override
+ public boolean close() {
+ return super.close();
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.CLIENT_ID + 1, Messages.DateSelectionDialog_Clear, false);
+ super.createButtonsForButtonBar(parent);
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ super.buttonPressed(buttonId);
+ if (buttonId == IDialogConstants.CLIENT_ID + 1) {
+ selectedDate = null;
+ okPressed();
+ }
+ }
+
+ public Date getDate() {
+ return selectedDate;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DelayedRefreshJob.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DelayedRefreshJob.java
new file mode 100644
index 0000000..a637627
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/DelayedRefreshJob.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.ui.progress.WorkbenchJob;
+
+/**
+ * TODO use extensible deltas instead of Objects for refresh
+ *
+ * @author Steffen Pingel
+ * @author Mik Kersten
+ */
+public abstract class DelayedRefreshJob extends WorkbenchJob {
+
+ static final long REFRESH_DELAY_DEFAULT = 200;
+
+ static final long REFRESH_DELAY_MAX = REFRESH_DELAY_DEFAULT * 2;
+
+ // FIXME make private
+ protected final StructuredViewer viewer;
+
+ private static final int NOT_SCHEDULED = -1;
+
+ private final LinkedHashSet<Object> queue = new LinkedHashSet<Object>();
+
+ private long scheduleTime = NOT_SCHEDULED;
+
+ public DelayedRefreshJob(StructuredViewer viewer, String name) {
+ super(name);
+ Assert.isNotNull(viewer);
+ this.viewer = viewer;
+ setSystem(true);
+ }
+
+ // XXX needs to be called from UI thread
+ public void refreshNow() {
+ queue.add(null);
+ runInUIThread(new NullProgressMonitor());
+ }
+
+ public synchronized void refresh() {
+ refreshElement(null);
+ }
+
+ public synchronized void refreshElements(Object[] elements) {
+ queue.addAll(Arrays.asList(elements));
+ if (scheduleTime == NOT_SCHEDULED) {
+ scheduleTime = System.currentTimeMillis();
+ schedule(REFRESH_DELAY_DEFAULT);
+ } else if (System.currentTimeMillis() - scheduleTime < REFRESH_DELAY_MAX - REFRESH_DELAY_DEFAULT) {
+ // reschedule to aggregate more refreshes
+ cancel();
+ schedule(REFRESH_DELAY_DEFAULT);
+ }
+ }
+
+ public synchronized void refreshElement(Object element) {
+ refreshElements(new Object[] { element });
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (viewer.getControl() == null || viewer.getControl().isDisposed()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ final Object[] items;
+ synchronized (this) {
+ if (queue.contains(null)) {
+ items = null;
+ } else {
+ items = queue.toArray(new Object[0]);
+ }
+ queue.clear();
+ scheduleTime = NOT_SCHEDULED;
+ }
+
+ doRefresh(items);
+
+ return Status.OK_STATUS;
+ }
+
+ protected abstract void doRefresh(final Object[] items);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/EnhancedFilteredTree.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/EnhancedFilteredTree.java
new file mode 100644
index 0000000..2e9690a
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/EnhancedFilteredTree.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Hiroyuki Inaba 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:
+ * Hiroyuki Inaba - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.commons.ui;
+
+import java.lang.reflect.Field;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * A {@link FilteredTree} that uses the new look on Eclipse 3.5 and later.
+ *
+ * @author Hiroyuki Inaba
+ */
+// TODO e3.4 move to new FilteredTree API
+public class EnhancedFilteredTree extends FilteredTree {
+
+ protected boolean useNewLook;
+
+ @SuppressWarnings("deprecation")
+ public EnhancedFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+ }
+
+ @SuppressWarnings("deprecation")
+ public EnhancedFilteredTree(Composite parent) {
+ super(parent);
+ }
+
+ @Override
+ protected void createControl(Composite parent, int treeStyle) {
+ useNewLook = setNewLook(this);
+ super.createControl(parent, treeStyle);
+ }
+
+ public static boolean setNewLook(FilteredTree tree) {
+ try {
+ Field newStyleField = FilteredTree.class.getDeclaredField("useNewLook"); //$NON-NLS-1$
+ newStyleField.setAccessible(true);
+ newStyleField.setBoolean(tree, true);
+ return newStyleField.getBoolean(tree);
+ } catch (Exception e) {
+ // ignore
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/GradientCanvas.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/GradientCanvas.java
new file mode 100644
index 0000000..72f87dc
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/GradientCanvas.java
@@ -0,0 +1,350 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ * Tasktop Technologies - extracted FormHeading implementation for Mylyn
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.provisional.commons.ui;
+
+import java.util.Hashtable;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * Based on {@link org.eclipse.ui.internal.forms.widgets.FormHeading}.
+ */
+ at SuppressWarnings("restriction")
+public class GradientCanvas extends Canvas {
+
+ private static final int SEPARATOR = 1 << 1;
+
+ private static final int BOTTOM_SEPARATOR = 1 << 2;
+
+ private static final int BACKGROUND_IMAGE_TILED = 1 << 3;
+
+ public static final String COLOR_BASE_BG = "baseBg"; //$NON-NLS-1$
+
+ static String PREFIX = "org.eclipse.ui.forms."; //$NON-NLS-1$
+
+ static String H_PREFIX = PREFIX + "H_"; //$NON-NLS-1$
+
+ public static String H_BOTTOM_KEYLINE1 = H_PREFIX + "BOTTOM_KEYLINE1"; //$NON-NLS-1$
+
+ /**
+ * Key for the form header bottom keyline 2 color.
+ */
+ public static String H_BOTTOM_KEYLINE2 = H_PREFIX + "BOTTOM_KEYLINE2"; //$NON-NLS-1$
+
+ private Image backgroundImage;
+
+ private Image gradientImage;
+
+ @SuppressWarnings("unchecked")
+ Hashtable colors = new Hashtable();
+
+ private int flags;
+
+ private GradientInfo gradientInfo;
+
+ private class GradientInfo {
+ Color[] gradientColors;
+
+ int[] percents;
+
+ boolean vertical;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.widgets.Control#forceFocus()
+ */
+ @Override
+ public boolean forceFocus() {
+ return false;
+ }
+
+ /**
+ * Creates the form content control as a child of the provided parent.
+ *
+ * @param parent
+ * the parent widget
+ */
+ public GradientCanvas(Composite parent, int style) {
+ super(parent, style);
+ setBackgroundMode(SWT.INHERIT_DEFAULT);
+ setSeparatorAlignment(SWT.BOTTOM);
+ addListener(SWT.Paint, new Listener() {
+ public void handleEvent(Event e) {
+ onPaint(e.gc);
+ }
+ });
+ addListener(SWT.Dispose, new Listener() {
+ public void handleEvent(Event e) {
+ if (gradientImage != null) {
+ // TODO e3.4 FormImages.getInstance().markFinished(gradientImage);
+ gradientImage.dispose();
+ gradientImage = null;
+ }
+ }
+ });
+ addListener(SWT.Resize, new Listener() {
+ public void handleEvent(Event e) {
+ if (gradientInfo != null || (backgroundImage != null && !isBackgroundImageTiled())) {
+ updateGradientImage();
+ }
+ }
+ });
+ }
+
+ /**
+ * Sets the background color of the header.
+ */
+ @Override
+ public void setBackground(Color bg) {
+ super.setBackground(bg);
+ internalSetBackground(bg);
+ }
+
+ private void internalSetBackground(Color bg) {
+ putColor(COLOR_BASE_BG, bg);
+ }
+
+ public void setBackgroundGradient(Color[] gradientColors, int[] percents, boolean vertical) {
+ if (gradientColors != null) {
+ gradientInfo = new GradientInfo();
+ gradientInfo.gradientColors = gradientColors;
+ gradientInfo.percents = percents;
+ gradientInfo.vertical = vertical;
+ setBackground(null);
+ updateGradientImage();
+ } else {
+ // reset
+ gradientInfo = null;
+ if (gradientImage != null) {
+ // TODO e3.4 FormImages.getInstance().markFinished(gradientImage);
+ gradientImage.dispose();
+ gradientImage = null;
+ setBackgroundImage(null);
+ }
+ }
+ }
+
+ public void setHeadingBackgroundImage(Image image) {
+ this.backgroundImage = image;
+ if (image != null) {
+ setBackground(null);
+ }
+ if (isBackgroundImageTiled()) {
+ setBackgroundImage(image);
+ } else {
+ updateGradientImage();
+ }
+ }
+
+ public Image getHeadingBackgroundImage() {
+ return backgroundImage;
+ }
+
+ public void setBackgroundImageTiled(boolean tiled) {
+ if (tiled) {
+ flags |= BACKGROUND_IMAGE_TILED;
+ } else {
+ flags &= ~BACKGROUND_IMAGE_TILED;
+ }
+ setHeadingBackgroundImage(this.backgroundImage);
+ }
+
+ public boolean isBackgroundImageTiled() {
+ return (flags & BACKGROUND_IMAGE_TILED) != 0;
+ }
+
+ @Override
+ public void setBackgroundImage(Image image) {
+ super.setBackgroundImage(image);
+ if (image != null) {
+ internalSetBackground(null);
+ }
+ }
+
+ private void onPaint(GC gc) {
+ if (!isSeparatorVisible() && getBackgroundImage() == null) {
+ return;
+ }
+ Rectangle carea = getClientArea();
+ Image buffer = new Image(getDisplay(), carea.width, carea.height);
+ buffer.setBackground(getBackground());
+ GC igc = new GC(buffer);
+ igc.setBackground(getBackground());
+ igc.fillRectangle(0, 0, carea.width, carea.height);
+ if (getBackgroundImage() != null) {
+ if (gradientInfo != null) {
+ drawBackground(igc, carea.x, carea.y, carea.width, carea.height);
+ } else {
+ Image bgImage = getBackgroundImage();
+ Rectangle ibounds = bgImage.getBounds();
+ drawBackground(igc, carea.x, carea.y, ibounds.width, ibounds.height);
+ }
+ }
+
+ if (isSeparatorVisible()) {
+ drawSeparator(carea, igc);
+ }
+ igc.dispose();
+ gc.drawImage(buffer, carea.x, carea.y);
+ buffer.dispose();
+ }
+
+ private void drawSeparator(Rectangle carea, GC igc) {
+ // bg separator
+ if (hasColor(H_BOTTOM_KEYLINE1)) {
+ igc.setForeground(getColor(H_BOTTOM_KEYLINE1));
+ } else {
+ igc.setForeground(getBackground());
+ }
+ if (getSeparatorAlignment() == SWT.BOTTOM) {
+ igc.drawLine(carea.x, carea.height - 2, carea.x + carea.width - 1, carea.height - 2);
+ } else {
+ igc.drawLine(carea.x, 1, carea.x + carea.width - 1, 1);
+ }
+ if (hasColor(H_BOTTOM_KEYLINE2)) {
+ igc.setForeground(getColor(H_BOTTOM_KEYLINE2));
+ } else {
+ igc.setForeground(getForeground());
+ }
+ if (getSeparatorAlignment() == SWT.BOTTOM) {
+ igc.drawLine(carea.x, carea.height - 1, carea.x + carea.width - 1, carea.height - 1);
+ } else {
+ igc.drawLine(carea.x, 0, carea.x + carea.width - 1, 0);
+ }
+ }
+
+ private void updateGradientImage() {
+ Rectangle rect = getBounds();
+ if (gradientImage != null) {
+ // TODO e3.4 FormImages.getInstance().markFinished(gradientImage);
+ gradientImage.dispose();
+ gradientImage = null;
+ }
+ if (gradientInfo != null) {
+ // TODO e3.4 use FormImages
+// gradientImage = FormImages.getInstance().getGradient(gradientInfo.gradientColors, gradientInfo.percents,
+// gradientInfo.vertical ? rect.height : rect.width, gradientInfo.vertical, getColor(COLOR_BASE_BG));
+ boolean vertical = gradientInfo.vertical;
+ int width = vertical ? 1 : rect.width;
+ int height = vertical ? rect.height : 1;
+ gradientImage = new Image(getDisplay(), Math.max(width, 1), Math.max(height, 1));
+ GC gc = new GC(gradientImage);
+ drawTextGradient(gc, width, height);
+ gc.dispose();
+ } else if (backgroundImage != null && !isBackgroundImageTiled()) {
+ gradientImage = new Image(getDisplay(), Math.max(rect.width, 1), Math.max(rect.height, 1));
+ gradientImage.setBackground(getBackground());
+ GC gc = new GC(gradientImage);
+ gc.drawImage(backgroundImage, 0, 0);
+ gc.dispose();
+ }
+ setBackgroundImage(gradientImage);
+ }
+
+ // TODO e3.4 remove, use FormImages
+ private void drawTextGradient(GC gc, int width, int height) {
+ final Color oldBackground = gc.getBackground();
+ if (gradientInfo.gradientColors.length == 1) {
+ if (gradientInfo.gradientColors[0] != null) {
+ gc.setBackground(gradientInfo.gradientColors[0]);
+ }
+ gc.fillRectangle(0, 0, width, height);
+ } else {
+ final Color oldForeground = gc.getForeground();
+ Color lastColor = gradientInfo.gradientColors[0];
+ if (lastColor == null) {
+ lastColor = oldBackground;
+ }
+ int pos = 0;
+ for (int i = 0; i < gradientInfo.percents.length; ++i) {
+ gc.setForeground(lastColor);
+ lastColor = gradientInfo.gradientColors[i + 1];
+ if (lastColor == null) {
+ lastColor = oldBackground;
+ }
+ gc.setBackground(lastColor);
+ if (gradientInfo.vertical) {
+ final int gradientHeight = (gradientInfo.percents[i] * height / 100) - pos;
+ gc.fillGradientRectangle(0, pos, width, gradientHeight, true);
+ pos += gradientHeight;
+ } else {
+ final int gradientWidth = (gradientInfo.percents[i] * width / 100) - pos;
+ gc.fillGradientRectangle(pos, 0, gradientWidth, height, false);
+ pos += gradientWidth;
+ }
+ }
+ if (gradientInfo.vertical && pos < height) {
+ gc.setBackground(getColor(COLOR_BASE_BG));
+ gc.fillRectangle(0, pos, width, height - pos);
+ }
+ if (!gradientInfo.vertical && pos < width) {
+ gc.setBackground(getColor(COLOR_BASE_BG));
+ gc.fillRectangle(pos, 0, width - pos, height);
+ }
+
+ if (isSeparatorVisible()) {
+ drawSeparator(getClientArea(), gc);
+ }
+ gc.setForeground(oldForeground);
+ }
+ }
+
+ public boolean isSeparatorVisible() {
+ return (flags & SEPARATOR) != 0;
+ }
+
+ public void setSeparatorVisible(boolean addSeparator) {
+ if (addSeparator) {
+ flags |= SEPARATOR;
+ } else {
+ flags &= ~SEPARATOR;
+ }
+ }
+
+ public void setSeparatorAlignment(int alignment) {
+ if (alignment == SWT.BOTTOM) {
+ flags |= BOTTOM_SEPARATOR;
+ } else {
+ flags &= ~BOTTOM_SEPARATOR;
+ }
+ }
+
+ public int getSeparatorAlignment() {
+ return (flags & BOTTOM_SEPARATOR) != 0 ? SWT.BOTTOM : SWT.TOP;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void putColor(String key, Color color) {
+ if (color == null) {
+ colors.remove(key);
+ } else {
+ colors.put(key, color);
+ }
+ }
+
+ public Color getColor(String key) {
+ return (Color) colors.get(key);
+ }
+
+ public boolean hasColor(String key) {
+ return colors.containsKey(key);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/GradientToolTip.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/GradientToolTip.java
new file mode 100644
index 0000000..9d4ff71
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/GradientToolTip.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.mylyn.internal.commons.ui.NotificationPopupColors;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+
+/**
+ * A Custom JFace ToolTip that applies a gradient to the contents
+ *
+ * @author Shawn Minto
+ * @since 3.2
+ */
+public abstract class GradientToolTip extends ToolTip {
+
+ private NotificationPopupColors colors;
+
+ private LocalResourceManager resourceManager;
+
+ public GradientToolTip(Control control, int style, boolean manualActivation) {
+ super(control, style, manualActivation);
+ initResources(control);
+ }
+
+ public GradientToolTip(Control control) {
+ super(control);
+ initResources(control);
+ }
+
+ private void initResources(Control control) {
+ resourceManager = new LocalResourceManager(JFaceResources.getResources());
+ colors = new NotificationPopupColors(control.getDisplay(), resourceManager);
+ }
+
+ @Override
+ protected final Composite createToolTipContentArea(Event event, final Composite parent) {
+ GradientCanvas gradient = new GradientCanvas(parent, SWT.NONE);
+ gradient.setSeparatorVisible(false);
+ GridLayout headLayout = new GridLayout();
+ headLayout.marginHeight = 0;
+ headLayout.marginWidth = 0;
+ headLayout.horizontalSpacing = 0;
+ headLayout.verticalSpacing = 0;
+ headLayout.numColumns = 1;
+ gradient.setLayout(headLayout);
+
+ gradient.setBackgroundGradient(new Color[] { colors.getGradientBegin(), colors.getGradientEnd() },
+ new int[] { 100 }, true);
+
+ createToolTipArea(event, gradient);
+
+ // force a null background so that the gradient shines through
+ for (Control c : gradient.getChildren()) {
+ setNullBackground(c);
+ }
+
+ return gradient;
+ }
+
+ private void setNullBackground(final Control outerCircle) {
+ outerCircle.setBackground(null);
+ if (outerCircle instanceof Composite) {
+ ((Composite) outerCircle).setBackgroundMode(SWT.INHERIT_FORCE);
+ for (Control c : ((Composite) outerCircle).getChildren()) {
+ setNullBackground(c);
+ }
+ }
+ }
+
+ protected abstract Composite createToolTipArea(Event event, Composite parent);
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ICoreRunnable.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ICoreRunnable.java
new file mode 100644
index 0000000..a999e73
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ICoreRunnable.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Steffen Pingel
+ */
+public interface ICoreRunnable {
+
+ public void run(IProgressMonitor monitor) throws CoreException;
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/IFilteredTreeListener.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/IFilteredTreeListener.java
new file mode 100644
index 0000000..5f17b30
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/IFilteredTreeListener.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IFilteredTreeListener {
+
+ public void filterTextChanged(String text);
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ScalingHyperlink.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ScalingHyperlink.java
new file mode 100644
index 0000000..ebe8a1c
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ScalingHyperlink.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * Enhanced {@link ImageHyperlink} that truncates the link text at the end rather than the middle if it is wider than
+ * the available space. Also provides default color and underline on hover.
+ *
+ * @author Leo Dos Santos
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class ScalingHyperlink extends ImageHyperlink {
+
+ private boolean strikeThrough;
+
+ protected final MouseTrackListener MOUSE_TRACK_LISTENER = new MouseTrackListener() {
+
+ public void mouseEnter(MouseEvent e) {
+ setUnderlined(true);
+ }
+
+ public void mouseExit(MouseEvent e) {
+ setUnderlined(false);
+ }
+
+ public void mouseHover(MouseEvent e) {
+ }
+ };
+
+ public ScalingHyperlink(Composite parent, int style) {
+ super(parent, style);
+ }
+
+ @Override
+ public void dispose() {
+ removeMouseTrackListener(MOUSE_TRACK_LISTENER);
+ super.dispose();
+ }
+
+ public boolean isStrikeThrough() {
+ return strikeThrough;
+ }
+
+ @Override
+ protected void paintText(GC gc, Rectangle bounds) {
+ super.paintText(gc, bounds);
+ if (strikeThrough) {
+ Point totalSize = computeTextSize(SWT.DEFAULT, SWT.DEFAULT);
+ int textWidth = Math.min(bounds.width, totalSize.x);
+ int textHeight = totalSize.y;
+
+ // int descent = gc.getFontMetrics().getDescent();
+ int lineY = bounds.y + (textHeight / 2); // - descent + 1;
+ gc.drawLine(bounds.x, lineY, bounds.x + textWidth, lineY);
+ }
+ }
+
+ public void setStrikeThrough(boolean strikethrough) {
+ this.strikeThrough = strikethrough;
+ }
+
+ @Override
+ protected String shortenText(GC gc, String t, int width) {
+ if (t == null) {
+ return null;
+ }
+
+ if ((getStyle() & SWT.SHORT) != 0) {
+ return t;
+ }
+
+ String returnText = t;
+ if (gc.textExtent(t).x > width) {
+ for (int i = t.length(); i > 0; i--) {
+ String test = t.substring(0, i);
+ test = test + "..."; //$NON-NLS-1$
+ if (gc.textExtent(test).x < width) {
+ returnText = test;
+ break;
+ }
+ }
+ }
+ return returnText;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ScreenshotCreationPage.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ScreenshotCreationPage.java
new file mode 100644
index 0000000..1b3087a
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/ScreenshotCreationPage.java
@@ -0,0 +1,1737 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Balazs Brinkus - initial API and implementation
+ * Tasktop Technologies - improvements
+ * Willian Mitsuda - improvements
+ * Hiroyuki Inaba - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.commons.ui;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.commons.ui.Messages;
+import org.eclipse.mylyn.internal.commons.ui.SelectToolAction;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.custom.ViewForm;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Region;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * A wizard page to create a screenshot from the display.
+ * <p>
+ * NOTE: this class exposes a lot of implementation detail and is likely to change.
+ *
+ * @author Balazs Brinkus
+ * @author Willian Mitsuda
+ * @author Mik Kersten
+ * @author Hiroyuki Inaba
+ */
+public class ScreenshotCreationPage extends WizardPage {
+
+ private SelectToolAction captureAction;
+
+ private SelectToolAction fitAction;
+
+ private IAction cropAction;
+
+ private IAction markAction;
+
+ private IAction clearAction;
+
+ private IAction undoAction;
+
+ private IAction redoAction;
+
+ private Composite paletteArea;
+
+ private int lastDrawAction;
+
+ private SelectToolAction drawLineToolbar;
+
+ private SelectToolAction drawArrowToolbar;
+
+ private SelectToolAction drawBoxToolbar;
+
+ private SelectToolAction drawTextToolbar;
+
+ private SelectToolAction lineTypeToolbar;
+
+ private SelectToolAction lineBoldToolbar;
+
+ private SelectToolAction drawColorToolbar;
+
+ private boolean imageDirty;
+
+ /**
+ * Original screenshot image; used for backup purposes
+ */
+ private Image originalImage;
+
+ /**
+ * Copy of {@link #originalImage original} image; all drawing operations are done here; base for the result image
+ */
+ private Image workImage;
+
+ private Image previousImage;
+
+ /**
+ * Used to draw into {@link #workImage}
+ */
+ private GC workImageGC;
+
+ private Canvas canvas;
+
+ private ScrolledComposite scrolledComposite;
+
+ /**
+ * Stores the selection rectangle; this value is normalized to real image coordinates, no matter the zoom level (see
+ * {@link #scaleFactor})
+ */
+ private Rectangle currentSelection;
+
+ /**
+ * Stores the original selection rectangle, before a selection resize/move operation starts
+ */
+ private Rectangle originalSelection;
+
+ /**
+ * Temporary storage for selection start point, selection resizing initial reference point or previous mark point
+ * (it depends on current tool); this value is normalized to real image coordinates, no matter the zoom level (see
+ * {@link #scaleFactor})
+ */
+ private Point startPoint;
+
+ /**
+ * What sides I'm resizing when doing an selection {@link EditorAction#RESIZING_SELECTION resize}
+ */
+ private Set<SelectionSide> resizableSides = EnumSet.noneOf(SelectionSide.class);
+
+ /**
+ * Scale factor of displayed image compared to the original image
+ */
+ private double scaleFactor = 1.0;
+
+ /**
+ * Manages allocated cursors
+ */
+ private final Map<Integer, Cursor> cursors = new HashMap<Integer, Cursor>();
+
+ /**
+ * Available actions for the screenshot editor
+ */
+ private static enum EditorAction {
+
+ CROPPING, SELECTING, RESIZING_SELECTION, MOVING_SELECTION, MARKING;
+
+ };
+
+ /**
+ * What am I doing now?
+ */
+ private EditorAction currentAction = EditorAction.CROPPING;
+
+ private boolean isFirstCapture = true;
+
+ private Text textArea;
+
+ /**
+ * Mouse event history. Entry is [0] MouseDown/MouseMove/MouseUp, [1] x, [2] y
+ */
+ private List<int[]> historyMouseEvent = new ArrayList<int[]>();
+
+ /**
+ * Draw tool history. Entry is [0] drawHistory index, [1] FREE/LINE/BOX/OVAL, [2] Line type, [3] Bold, [4] R/G/B
+ */
+ private List<int[]> historyDrawTool = new ArrayList<int[]>();
+
+ private List<StringBuffer> historyDrawText = new ArrayList<StringBuffer>();
+
+ private List<String> historyDrawFont = new ArrayList<String>();
+
+ private int historyCheckpoint = 0;
+
+ public ScreenshotCreationPage() {
+ super("ScreenShotAttachment"); //$NON-NLS-1$
+ setTitle(Messages.ScreenshotCreationPage_CAPTURE_SCRRENSHOT);
+ setDescription(Messages.ScreenshotCreationPage_After_capturing
+ + Messages.ScreenshotCreationPage_NOTE_THAT_YOU_CONTINUTE);
+ }
+
+ public void createControl(Composite parent) {
+ ViewForm vf = new ViewForm(parent, SWT.BORDER | SWT.FLAT);
+ vf.horizontalSpacing = 0;
+ vf.verticalSpacing = 0;
+ setControl(vf);
+ vf.setLayoutData(GridDataFactory.fillDefaults().create());
+
+ allocateCursors();
+
+ // TODO: need disabled versions of all toolbar icons
+ ToolBarManager tbm = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL | SWT.RIGHT);
+
+ captureAction = new SelectToolAction(getShell(), Messages.ScreenshotCreationPage_Capture_Desktop_C,
+ SelectToolAction.CAPTURE_DROP_DOWN_MENU) {
+
+ @Override
+ public void run() {
+ if (captureAction.getSelect() == SelectToolAction.CAPTURE_DESKTOP) {
+ captureScreenshotContent();
+ } else if (captureAction.getSelect() == SelectToolAction.CAPTURE_CLIPBOARD) {
+ captureScreenshotContent(captureAction.getClipboardImage());
+ } else if (captureAction.getSelect() == SelectToolAction.CAPTURE_RECTANGLE) {
+ captureScreenshotContentFromSelection();
+ } else {
+ captureScreenshotContent(captureAction.getFileImage());
+ }
+ setErrorMessage(null);
+ if (isFirstCapture) {
+ isFirstCapture = false;
+ fitAction.setEnabled(true);
+ cropAction.setEnabled(true);
+ cropAction.setChecked(true);
+ markAction.setEnabled(true);
+ drawLineToolbar.setEnabled(true);
+ drawArrowToolbar.setEnabled(true);
+ drawBoxToolbar.setEnabled(true);
+ drawTextToolbar.setEnabled(true);
+ }
+
+ historyMouseEvent = new ArrayList<int[]>();
+ historyDrawTool = new ArrayList<int[]>();
+ historyDrawText = new ArrayList<StringBuffer>();
+ historyDrawFont = new ArrayList<String>();
+ historyCheckpoint = 0;
+ undoAction.setEnabled(false);
+ redoAction.setEnabled(false);
+ clearAction.setEnabled(false);
+ }
+
+ @Override
+ protected boolean isEnableRectangle() {
+ return (currentSelection != null);
+ }
+ };
+ captureAction.setToolTipText(Messages.ScreenshotCreationPage_Capture_Desktop);
+ captureAction.setImageDescriptor(ImageDescriptor.createFromImage(CommonImages.getImage(CommonImages.IMAGE_CAPTURE)));
+ captureAction.setShowMenuAlways(false);
+
+// captureDelayedButton = new Button(buttonsComposite, SWT.PUSH);
+// final String captureIn = "Capture in ";
+// final int secondsDelay = 1;
+// captureDelayedButton.setText(captureIn + secondsDelay +" seconds");
+// captureDelayedButton.setImage(TasksUiImages.getImage(TasksUiImages.IMAGE_CAPTURE));
+// captureDelayedButton.addSelectionListener(new SelectionListener() {
+//
+// public void widgetSelected(SelectionEvent e) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// getShell().setVisible(false);
+// for (int i = 1; i <= secondsDelay; i++) {
+// try {
+// Thread.sleep(1000);
+//// captureDelayedButton.setText("Capture in " + (secondsDelay-i) + " seconds");
+// } catch (InterruptedException e1) {
+// // ignore
+// }
+// }
+// captureScreenshotContent();
+// page.setErrorMessage(null);
+// fitButton.setEnabled(true);
+// captureDelayedButton.setText(captureIn + secondsDelay +" seconds");
+// getShell().setVisible(true);
+// }
+// });
+// }
+//
+// public void widgetDefaultSelected(SelectionEvent e) {
+// //ignore
+// }
+// });
+
+ fitAction = new SelectToolAction(Messages.ScreenshotCreationPage_Fit_Image_F,
+ SelectToolAction.ZOOM_DROP_DOWN_MENU) {
+ @Override
+ public void run() {
+ refreshCanvasSize();
+ }
+ };
+ fitAction.setToolTipText(Messages.ScreenshotCreationPage_Fit_Image);
+ fitAction.setImageDescriptor(ImageDescriptor.createFromImage(CommonImages.getImage(CommonImages.IMAGE_FIT)));
+ //fitAction.setChecked(true);
+ fitAction.setEnabled(false);
+
+ cropAction = new Action(Messages.ScreenshotCreationPage_Crop_R, IAction.AS_RADIO_BUTTON) {
+ @Override
+ public void run() {
+ currentAction = EditorAction.CROPPING;
+ cropAction.setChecked(true);
+ markAction.setChecked(false);
+// undoAction.setEnabled(false);
+// redoAction.setEnabled(false);
+ canvas.redraw();
+ }
+ };
+ cropAction.setToolTipText(Messages.ScreenshotCreationPage_Crop);
+ cropAction.setImageDescriptor(CommonImages.CUT);
+ cropAction.setEnabled(false);
+
+ markAction = new Action(Messages.ScreenshotCreationPage_Annotate, IAction.AS_RADIO_BUTTON) {
+ @Override
+ public void setChecked(boolean checked) {
+ super.setChecked(checked);
+ if (paletteArea != null) {
+ if (checked) {
+ if (getSelectDrawToolbar() < 0) {
+ setSelectDrawToolbar(lastDrawAction);
+ }
+ } else {
+ int select = getSelectDrawToolbar();
+ if (select >= 0) {
+ lastDrawAction = select;
+ unselectDrawToolbar();
+ }
+ }
+ boolean isDrawText = (drawTextToolbar.getSelect() >= 0) ? false : checked;
+ //drawLineToolbar.setEnabled(checked);
+ //drawArrowToolbar.setEnabled(checked);
+ //drawBoxToolbar.setEnabled(checked);
+ //drawTextToolbar.setEnabled(checked);
+ drawColorToolbar.setEnabled(isDrawText);
+ lineTypeToolbar.setEnabled(isDrawText);
+ lineBoldToolbar.setEnabled(isDrawText);
+ }
+ }
+
+ @Override
+ public void run() {
+ currentAction = EditorAction.MARKING;
+ cropAction.setChecked(false);
+ markAction.setChecked(true);
+// undoAction.setEnabled(false);
+// redoAction.setEnabled(false);
+ canvas.redraw();
+ }
+ };
+ markAction.setToolTipText(Messages.ScreenshotCreationPage_DRAW_ANNOTATION_ON_SCREENSHOT_IMAGE);
+ markAction.setImageDescriptor(CommonImages.EDIT);
+// markAction.setDisabledImageDescriptor(ImageDescriptor.createFromFile(getClass(), "mark_disabled.gif"));
+ markAction.setEnabled(false);
+
+ clearAction = new Action(Messages.ScreenshotCreationPage_Clear, IAction.AS_PUSH_BUTTON) {
+ @Override
+ public void run() {
+ clearAction.setEnabled(false);
+ workImageGC.drawImage(originalImage, 0, 0);
+ canvas.redraw();
+ setImageDirty(true);
+
+ historyMouseEvent = new ArrayList<int[]>();
+ historyDrawTool = new ArrayList<int[]>();
+ historyDrawText = new ArrayList<StringBuffer>();
+ historyDrawFont = new ArrayList<String>();
+ historyCheckpoint = 0;
+ undoAction.setEnabled(false);
+ redoAction.setEnabled(false);
+ }
+ };
+ clearAction.setToolTipText(Messages.ScreenshotCreationPage_Clear_all_annotations_made_on_screenshot_image);
+ clearAction.setImageDescriptor(CommonImages.CLEAR);
+ clearAction.setEnabled(false);
+
+ undoAction = new Action(Messages.ScreenshotCreationPage_Undo) {
+ @Override
+ public void run() {
+ if (historyCheckpoint > 0) {
+ historyCheckpoint--;
+ drawAnnotationHistory();
+ }
+ if (historyCheckpoint == 0) {
+ undoAction.setEnabled(false);
+ }
+ if (historyCheckpoint < historyDrawTool.size()) {
+ redoAction.setEnabled(true);
+ }
+ }
+ };
+ undoAction.setToolTipText(Messages.ScreenshotCreationPage_Undo_annotation);
+ undoAction.setImageDescriptor(CommonImages.UNDO);
+ undoAction.setEnabled(false);
+
+ redoAction = new Action(Messages.ScreenshotCreationPage_Redo) {
+ @Override
+ public void run() {
+ if (historyCheckpoint < historyDrawTool.size()) {
+ historyCheckpoint++;
+ drawAnnotationHistory();
+ }
+ if (historyCheckpoint > 0) {
+ undoAction.setEnabled(true);
+ }
+ if (historyCheckpoint >= historyDrawTool.size()) {
+ redoAction.setEnabled(false);
+ }
+ }
+ };
+ redoAction.setToolTipText(Messages.ScreenshotCreationPage_Redo_annotation);
+ redoAction.setImageDescriptor(CommonImages.REDO);
+ redoAction.setEnabled(false);
+
+ tbm.add(createAndConfigureCI(captureAction));
+ tbm.add(new Separator());
+ tbm.add(createAndConfigureCI(fitAction));
+ tbm.add(createAndConfigureCI(cropAction));
+ tbm.add(createAndConfigureCI(markAction));
+ tbm.add(new Separator());
+ tbm.add(createAndConfigureCI(clearAction));
+ tbm.add(createAndConfigureCI(undoAction));
+ tbm.add(createAndConfigureCI(redoAction));
+ tbm.add(new Separator());
+
+ Composite body = new Composite(vf, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ layout.horizontalSpacing = 0;
+ layout.verticalSpacing = 0;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ body.setLayout(layout);
+ createPaletteBars(body);
+ lastDrawAction = getSelectDrawToolbar();
+ unselectDrawToolbar();
+
+ scrolledComposite = new ScrolledComposite(body, SWT.V_SCROLL | SWT.H_SCROLL);
+ scrolledComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ canvas = new Canvas(scrolledComposite, SWT.DOUBLE_BUFFERED);
+ scrolledComposite.setContent(canvas);
+ canvas.addPaintListener(new PaintListener() {
+
+ public void paintControl(PaintEvent e) {
+ if (workImage != null) {
+ Rectangle imageBounds = workImage.getBounds();
+ Rectangle canvasBounds = canvas.getClientArea();
+
+ int zoom = fitAction.getSelect();
+ switch (zoom) {
+ case SelectToolAction.ZOOM_FIT:
+ e.gc.drawImage(workImage, 0, 0, imageBounds.width, imageBounds.height, //
+ 0, 0, canvasBounds.width, canvasBounds.height);
+ break;
+ case 50:
+ e.gc.drawImage(workImage, 0, 0, imageBounds.width, imageBounds.height, //
+ 0, 0, imageBounds.width / 2, imageBounds.height / 2);
+ break;
+ case 100:
+ e.gc.drawImage(workImage, 0, 0);
+ break;
+ default:
+ e.gc.drawImage(workImage, 0, 0, imageBounds.width, imageBounds.height, //
+ 0, 0, imageBounds.width * zoom / 100, imageBounds.height * zoom / 100);
+ break;
+ }
+ drawSelection(e.gc);
+ } else {
+// page.setErrorMessage("Screenshot required");
+ fitAction.setEnabled(false);
+ }
+ }
+ });
+
+ scrolledComposite.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ if (fitAction.getSelect() == SelectToolAction.ZOOM_FIT) {
+ refreshCanvasSize();
+ }
+ }
+ });
+ scrolledComposite.setEnabled(false);
+
+ vf.setTopLeft(tbm.createControl(vf));
+ vf.setContent(body);
+ registerMouseListeners();
+
+ vf.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Dialog.applyDialogFont(vf);
+ }
+
+ private void createPaletteBars(Composite body) {
+ paletteArea = new Composite(body, SWT.NONE);
+ paletteArea.setLayoutData(new GridData(GridData.FILL_VERTICAL));
+ RowLayout rowlayout = new RowLayout(SWT.VERTICAL);
+ rowlayout.marginRight += 1;
+ paletteArea.setLayout(rowlayout);
+
+ paletteArea.addListener(SWT.Paint, new Listener() {
+ public void handleEvent(Event e) {
+ Color gcForeground = e.gc.getForeground();
+ Rectangle bounds = ((Composite) e.widget).getBounds();
+ Color border = e.widget.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
+ e.gc.setForeground(border);
+ e.gc.drawLine(bounds.width - 1, 0, bounds.width - 1, bounds.height);
+ e.gc.setForeground(gcForeground);
+ }
+ });
+ paletteArea.addMenuDetectListener(new MenuDetectListener() {
+
+ public void menuDetected(MenuDetectEvent e) {
+ Menu rightClickMenu = new Menu(Display.getDefault().getActiveShell(), SWT.POP_UP);
+ MenuItem menuItem = new MenuItem(rightClickMenu, SWT.CHECK);
+ menuItem.setText(Messages.ScreenshotCreationPage_Show_Line_Type_Selector);
+ menuItem.setSelection(lineTypeToolbar.getVisible());
+ menuItem.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(final Event event) {
+ lineTypeToolbar.setVisible(!lineTypeToolbar.getVisible());
+ paletteArea.layout();
+ }
+ });
+ menuItem = new MenuItem(rightClickMenu, SWT.CHECK);
+ menuItem.setText(Messages.ScreenshotCreationPage_Show_Line_Bold_Selector);
+ menuItem.setSelection(lineBoldToolbar.getVisible());
+ menuItem.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(final Event event) {
+ lineBoldToolbar.setVisible(!lineBoldToolbar.getVisible());
+ paletteArea.layout();
+ }
+ });
+ rightClickMenu.setLocation(e.x, e.y);
+ rightClickMenu.setVisible(true);
+ }
+ });
+ drawLineToolbar = new SelectToolAction(paletteArea, SelectToolAction.DRAWLINE_TOOLBAR) {
+
+ @Override
+ public void run() {
+ markAction.run();
+ drawArrowToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ drawColorToolbar.setEnabled(true);
+ lineTypeToolbar.setEnabled(true);
+ lineBoldToolbar.setEnabled(true);
+ }
+ };
+ drawLineToolbar.setEnabled(false);
+ drawArrowToolbar = new SelectToolAction(paletteArea, SelectToolAction.DRAWARROW_TOOLBAR) {
+
+ @Override
+ public void run() {
+ markAction.run();
+ drawLineToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ drawColorToolbar.setEnabled(true);
+ lineTypeToolbar.setEnabled(true);
+ lineBoldToolbar.setEnabled(true);
+ }
+ };
+ drawArrowToolbar.setEnabled(false);
+ drawBoxToolbar = new SelectToolAction(paletteArea, SelectToolAction.DRAWBOX_TOOLBAR) {
+
+ @Override
+ public void run() {
+ markAction.run();
+ drawLineToolbar.setUnselect();
+ drawArrowToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ drawColorToolbar.setEnabled(true);
+ lineTypeToolbar.setEnabled(true);
+ lineBoldToolbar.setEnabled(true);
+ }
+ };
+ drawBoxToolbar.setEnabled(false);
+ drawTextToolbar = new SelectToolAction(paletteArea, SelectToolAction.DRAWTEXT_TOOLBAR) {
+
+ @Override
+ public void run() {
+ markAction.run();
+ drawLineToolbar.setUnselect();
+ drawArrowToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawColorToolbar.setEnabled(false);
+ lineTypeToolbar.setEnabled(false);
+ lineBoldToolbar.setEnabled(false);
+ }
+ };
+ drawTextToolbar.setEnabled(false);
+ drawColorToolbar = new SelectToolAction(paletteArea, SelectToolAction.COLOR_TOOLBAR);
+ drawColorToolbar.setEnabled(false);
+ lineTypeToolbar = new SelectToolAction(paletteArea, SelectToolAction.LINETYPE_TOOLBAR);
+ lineTypeToolbar.setEnabled(false);
+ lineTypeToolbar.setVisible(false);
+ lineBoldToolbar = new SelectToolAction(paletteArea, SelectToolAction.LINEBOLD_TOOLBAR);
+ lineBoldToolbar.setEnabled(false);
+ lineBoldToolbar.setVisible(false);
+ }
+
+ private void setSelectDrawToolbar(int drawTool) {
+ if (drawLineToolbar.setSelect(drawTool)) {
+ drawArrowToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ return;
+ }
+ if (drawArrowToolbar.setSelect(drawTool)) {
+ drawLineToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ return;
+ }
+ if (drawBoxToolbar.setSelect(drawTool)) {
+ drawLineToolbar.setUnselect();
+ drawArrowToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ return;
+ }
+ drawLineToolbar.setUnselect();
+ drawArrowToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawTextToolbar.setSelect(drawTool);
+ }
+
+ private void unselectDrawToolbar() {
+ drawLineToolbar.setUnselect();
+ drawArrowToolbar.setUnselect();
+ drawBoxToolbar.setUnselect();
+ drawTextToolbar.setUnselect();
+ }
+
+ private int getSelectDrawToolbar() {
+ int drawTool;
+ if ((drawTool = drawLineToolbar.getSelect()) >= 0) {
+ return drawTool;
+ }
+ if ((drawTool = drawArrowToolbar.getSelect()) >= 0) {
+ return drawTool;
+ }
+ if ((drawTool = drawBoxToolbar.getSelect()) >= 0) {
+ return drawTool;
+ }
+ if ((drawTool = drawTextToolbar.getSelect()) >= 0) {
+ return drawTool;
+ }
+ return -1;
+ }
+
+ private ActionContributionItem createAndConfigureCI(IAction action) {
+ ActionContributionItem ci = new ActionContributionItem(action);
+ ci.setMode(ActionContributionItem.MODE_FORCE_TEXT);
+ return ci;
+ }
+
+ @Override
+ public void dispose() {
+ disposeImageResources();
+
+ canvas.setCursor(null);
+ for (Cursor cursor : cursors.values()) {
+ cursor.dispose();
+ }
+ super.dispose();
+ }
+
+ private void disposeImageResources() {
+ if (originalImage != null) {
+ originalImage.dispose();
+ }
+ if (workImageGC != null) {
+ workImageGC.dispose();
+ }
+ if (workImage != null) {
+ workImage.dispose();
+ }
+ }
+
+ private static final int CURSOR_MARK_TOOL = -1;
+
+ private static final long CAPTURE_DELAY = 400;
+
+ private void allocateCursors() {
+ Display display = getShell().getDisplay();
+ cursors.put(SWT.CURSOR_ARROW, new Cursor(display, SWT.CURSOR_ARROW));
+ cursors.put(SWT.CURSOR_SIZEALL, new Cursor(display, SWT.CURSOR_SIZEALL));
+ cursors.put(SWT.CURSOR_SIZENWSE, new Cursor(display, SWT.CURSOR_SIZENWSE));
+ cursors.put(SWT.CURSOR_SIZENESW, new Cursor(display, SWT.CURSOR_SIZENESW));
+ cursors.put(SWT.CURSOR_SIZENS, new Cursor(display, SWT.CURSOR_SIZENS));
+ cursors.put(SWT.CURSOR_SIZEWE, new Cursor(display, SWT.CURSOR_SIZEWE));
+ cursors.put(SWT.CURSOR_CROSS, new Cursor(display, SWT.CURSOR_CROSS));
+
+ // TODO: allocate custom cursor for "mark" tool
+ cursors.put(CURSOR_MARK_TOOL, new Cursor(display, SWT.CURSOR_HAND));
+ }
+
+ private Rectangle getScaledSelection() {
+ if (currentSelection == null) {
+ return null;
+ }
+ int x = (int) Math.round(currentSelection.x * scaleFactor);
+ int y = (int) Math.round(currentSelection.y * scaleFactor);
+ int right = (int) Math.round((currentSelection.x + currentSelection.width) * scaleFactor);
+ int bottom = (int) Math.round((currentSelection.y + currentSelection.height) * scaleFactor);
+ int width = Math.min(right, (int) Math.round(workImage.getBounds().width * scaleFactor)) - x;
+ int height = Math.min(bottom, (int) Math.round(workImage.getBounds().height * scaleFactor)) - y;
+ return new Rectangle(x, y, width, height);
+ }
+
+ private Rectangle getOutsideSelection(Rectangle rectangle) {
+ if (rectangle == null) {
+ return null;
+ }
+ return new Rectangle(rectangle.x - SQUARE_SIZE * 2, rectangle.y - SQUARE_SIZE * 2, //
+ rectangle.width + SQUARE_SIZE * 4 + 1, rectangle.height + SQUARE_SIZE * 4 + 1);
+ }
+
+ private static final int[][] grapGroupPoints = { //
+ /* */{ 0, 0, 0 }, { 1, 0, 0 }, { 2, 0, 1 }, { 3, 0, 2 }, { 4, 0, 2 }, //
+ { 0, 1, 0 }, /* *//* *//* */{ 4, 1, 2 }, //
+ { 0, 2, 3 }, /* *//* *//* */{ 4, 2, 4 }, //
+ { 0, 3, 5 }, /* *//* *//* */{ 4, 3, 7 }, //
+ { 0, 4, 5 }, { 1, 4, 5 }, { 2, 4, 6 }, { 3, 4, 7 }, { 4, 4, 7 } };
+
+ private static final int[] grapScanOrder = { 0, 4, 1, 3, 2 };
+
+ private int getGrabPoint(int x, int y) {
+ if (currentSelection == null) {
+ return -1;
+ }
+
+ Rectangle inside = getScaledSelection();
+ Rectangle outside = getOutsideSelection(inside);
+ int[] xGroupPoint = { outside.x, //
+ inside.x, //
+ inside.x + SQUARE_SIZE * 4, //
+ inside.x + inside.width - SQUARE_SIZE * 4, //
+ inside.x + inside.width, //
+ outside.x + outside.width };
+ int[] yGroupPoint = { outside.y, //
+ inside.y, //
+ inside.y + SQUARE_SIZE * 4, //
+ inside.y + inside.height - SQUARE_SIZE * 4, //
+ inside.y + inside.height, //
+ outside.y + outside.height };
+ int xGroup = -1, yGroup = -1;
+ for (int element : grapScanOrder) {
+ if (xGroupPoint[element] <= x && x <= xGroupPoint[element + 1]) {
+ xGroup = element;
+ break;
+ }
+ }
+ if (xGroup < 0) {
+ return -1;
+ }
+ for (int element : grapScanOrder) {
+ if (yGroupPoint[element] <= y && y <= yGroupPoint[element + 1]) {
+ yGroup = element;
+ break;
+ }
+ }
+ if (yGroup < 0) {
+ return -1;
+ }
+ for (int[] element : grapGroupPoints) {
+ if (element[0] == xGroup && element[1] == yGroup) {
+ return element[2];
+ }
+ }
+ return -1;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return workImage != null;
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return isPageComplete();
+ }
+
+ private void captureScreenshotContent(Image image) {
+ final Display display = getShell().getDisplay();
+ disposeImageResources();
+ originalImage = image;
+ Rectangle displayBounds = originalImage.getBounds();
+ workImage = new Image(display, displayBounds.width, displayBounds.height);
+ GC gc = new GC(workImage);
+ gc.drawImage(originalImage, 0, 0);
+ gc.dispose();
+
+ workImageGC = new GC(workImage);
+ workImageGC.setLineCap(SWT.CAP_ROUND);
+
+ scrolledComposite.setEnabled(true);
+ clearSelection();
+ refreshCanvasSize();
+
+ setPageComplete(true);
+ }
+
+ private void captureScreenshotContentFromSelection() {
+ Display display = getShell().getDisplay();
+
+ Image image = new Image(display, currentSelection);
+ GC gc = new GC(image);
+ gc.drawImage(workImage, currentSelection.x, currentSelection.y, currentSelection.width,
+ currentSelection.height, 0, 0, currentSelection.width, currentSelection.height);
+ gc.dispose();
+ disposeImageResources();
+
+ originalImage = image;
+ Rectangle displayBounds = originalImage.getBounds();
+ workImage = new Image(display, displayBounds.width, displayBounds.height);
+ gc = new GC(workImage);
+ gc.drawImage(originalImage, 0, 0);
+ gc.dispose();
+
+ workImageGC = new GC(workImage);
+ workImageGC.setLineCap(SWT.CAP_ROUND);
+
+ scrolledComposite.setEnabled(true);
+ clearSelection();
+ refreshCanvasSize();
+
+ setPageComplete(true);
+ }
+
+ private void captureScreenshotContent() {
+ final Display display = getShell().getDisplay();
+ final Shell wizardShell = getWizard().getContainer().getShell();
+ wizardShell.setVisible(false);
+
+ // this code needs to run asynchronously to allow the workbench to refresh before the screen is captured
+ UIJob job = new UIJob("Capturing Screenshot") { //$NON-NLS-1$
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ disposeImageResources();
+ Rectangle displayBounds = display.getBounds();
+ originalImage = new Image(display, displayBounds.width, displayBounds.height);
+ workImage = new Image(display, displayBounds.width, displayBounds.height);
+
+ GC gc = new GC(display);
+ gc.copyArea(originalImage, displayBounds.x, displayBounds.y);
+ gc.copyArea(workImage, displayBounds.x, displayBounds.y);
+ gc.dispose();
+
+ workImageGC = new GC(workImage);
+ workImageGC.setLineCap(SWT.CAP_ROUND);
+
+ scrolledComposite.setEnabled(true);
+ clearSelection();
+ refreshCanvasSize();
+
+ wizardShell.setVisible(true);
+ setPageComplete(true);
+
+ return Status.OK_STATUS;
+ }
+ };
+ // NOTE: need a wait since the shell can take time to disappear (e.g. fade on Vista)
+ job.schedule(CAPTURE_DELAY);
+ }
+
+ /**
+ * Sets the selection rectangle based on the initial selection start point previously set in {@link #startPoint} and
+ * the end point passed as parameters to this method
+ * <p>
+ * The coordinates are based on the real image coordinates
+ */
+ private void refreshCurrentSelection(int x, int y) {
+ int startX = Math.min(startPoint.x, x);
+ int startY = Math.min(startPoint.y, y);
+ int width = Math.abs(startPoint.x - x);
+ int height = Math.abs(startPoint.y - y);
+ currentSelection = new Rectangle(startX, startY, width, height);
+
+ // Decreases 1 pixel size from original image because Rectangle.intersect() consider them as right-bottom limit
+ Rectangle imageBounds = workImage.getBounds();
+ imageBounds.width--;
+ imageBounds.height--;
+ currentSelection.intersect(imageBounds);
+ }
+
+ private static final int grabPointCurosr[] = { SWT.CURSOR_SIZENWSE, SWT.CURSOR_SIZENS, SWT.CURSOR_SIZENESW,
+ SWT.CURSOR_SIZEWE, SWT.CURSOR_SIZEWE, SWT.CURSOR_SIZENESW, SWT.CURSOR_SIZENS, SWT.CURSOR_SIZENWSE };
+
+ private static final SelectionSide[][] grabPointResizableSides = { { SelectionSide.LEFT, SelectionSide.TOP },
+ { SelectionSide.TOP }, { SelectionSide.TOP, SelectionSide.RIGHT }, { SelectionSide.LEFT },
+ { SelectionSide.RIGHT }, { SelectionSide.LEFT, SelectionSide.BOTTOM }, { SelectionSide.BOTTOM },
+ { SelectionSide.BOTTOM, SelectionSide.RIGHT } };
+
+ private void refreshSelectionResize(int x, int y) {
+ currentSelection = new Rectangle(originalSelection.x, originalSelection.y, originalSelection.width,
+ originalSelection.height);
+ int deltaX = x - startPoint.x;
+ int deltaY = y - startPoint.y;
+ Rectangle imageBounds = workImage.getBounds();
+
+ // Check current selection limits
+ if (resizableSides.contains(SelectionSide.LEFT)) {
+ deltaX = Math.min(deltaX, originalSelection.width);
+ if (originalSelection.x + deltaX < 0) {
+ deltaX = -originalSelection.x;
+ }
+ }
+ if (resizableSides.contains(SelectionSide.RIGHT)) {
+ deltaX = Math.max(deltaX, -originalSelection.width);
+ if (originalSelection.x + originalSelection.width + deltaX > imageBounds.width) {
+ deltaX = imageBounds.width - (originalSelection.x + originalSelection.width);
+ }
+ }
+ if (resizableSides.contains(SelectionSide.TOP)) {
+ deltaY = Math.min(deltaY, originalSelection.height);
+ if (originalSelection.y + deltaY < 0) {
+ deltaY = -originalSelection.y;
+ }
+ }
+ if (resizableSides.contains(SelectionSide.BOTTOM)) {
+ deltaY = Math.max(deltaY, -originalSelection.height);
+ if (originalSelection.y + originalSelection.height + deltaY > imageBounds.height) {
+ deltaY = imageBounds.height - (originalSelection.y + originalSelection.height);
+ }
+ }
+
+ // Adjust corresponding sides
+ if (resizableSides.contains(SelectionSide.LEFT)) {
+ currentSelection.x += deltaX;
+ currentSelection.width -= deltaX;
+ }
+ if (resizableSides.contains(SelectionSide.RIGHT)) {
+ currentSelection.width += deltaX;
+ }
+ if (resizableSides.contains(SelectionSide.TOP)) {
+ currentSelection.y += deltaY;
+ currentSelection.height -= deltaY;
+ }
+ if (resizableSides.contains(SelectionSide.BOTTOM)) {
+ currentSelection.height += deltaY;
+ }
+ }
+
+ private void refreshSelectionPosition(int x, int y) {
+ int newX = originalSelection.x + (x - startPoint.x);
+ int newY = originalSelection.y + (y - startPoint.y);
+ if (newX < 0) {
+ newX = 0;
+ }
+ if (newY < 0) {
+ newY = 0;
+ }
+ Rectangle imageBounds = workImage.getBounds();
+ if (newX + originalSelection.width > imageBounds.width) {
+ newX = imageBounds.width - originalSelection.width;
+ }
+ if (newY + originalSelection.height > imageBounds.height) {
+ newY = imageBounds.height - originalSelection.height;
+ }
+ currentSelection = new Rectangle(newX, newY, originalSelection.width, originalSelection.height);
+ }
+
+ private void registerMouseListeners() {
+ canvas.addMouseMoveListener(new MouseMoveListener() {
+
+ /**
+ * If a selection is in course, moving the mouse around refreshes the selection rectangle
+ */
+ public void mouseMove(MouseEvent e) {
+ int scaledX = (int) Math.round(e.x / scaleFactor);
+ int scaledY = (int) Math.round(e.y / scaleFactor);
+
+ if (currentAction == EditorAction.SELECTING) {
+ refreshCurrentSelection(scaledX, scaledY);
+ canvas.redraw();
+ } else if (currentAction == EditorAction.RESIZING_SELECTION) {
+ refreshSelectionResize(scaledX, scaledY);
+ canvas.redraw();
+ } else if (currentAction == EditorAction.MOVING_SELECTION) {
+ refreshSelectionPosition(scaledX, scaledY);
+ canvas.redraw();
+ } else if (currentAction == EditorAction.CROPPING && currentSelection != null) {
+ boolean cursorSet = false;
+
+ // No selection in course, but have something selected; first test if I'm hovering some grab point
+ int info = getGrabPoint(e.x, e.y);
+ if (info >= 0) {
+ canvas.setCursor(cursors.get(grabPointCurosr[info]));
+ cursorSet = true;
+ }
+
+ // Test if I'm inside selection, so I can move it
+ if (!cursorSet && getScaledSelection().contains(e.x, e.y)) {
+ canvas.setCursor(cursors.get(SWT.CURSOR_SIZEALL));
+ cursorSet = true;
+ }
+
+ // If I'm out, the default cursor for cropping mode is cross
+ Cursor crossCursor = cursors.get(SWT.CURSOR_CROSS);
+ if (!cursorSet && canvas.getCursor() != crossCursor) {
+ canvas.setCursor(crossCursor);
+ }
+ } else if (currentAction == EditorAction.MARKING) {
+ if (startPoint != null) {
+ int drawTool = getSelectDrawToolbar();
+ if (drawTool == SelectToolAction.DRAW_FREE) {
+ int[] history = new int[3];
+ history[0] = SWT.MouseMove;
+ history[1] = scaledX;
+ history[2] = scaledY;
+ historyMouseEvent.add(history);
+ } else {
+ int[] history = historyMouseEvent.get(historyMouseEvent.size() - 1);
+ if (history[0] == SWT.MouseMove) {
+ history[1] = scaledX;
+ history[2] = scaledY;
+ } else {
+ history = new int[3];
+ history[0] = SWT.MouseMove;
+ history[1] = scaledX;
+ history[2] = scaledY;
+ historyMouseEvent.add(history);
+ }
+ }
+ }
+
+ drawMarkLine(scaledX, scaledY);
+
+ Cursor markCursor = cursors.get(CURSOR_MARK_TOOL);
+ if (canvas.getCursor() != markCursor) {
+ canvas.setCursor(markCursor);
+ }
+ }
+ }
+ });
+
+ canvas.addMouseListener(new MouseAdapter() {
+
+ /**
+ * Releasing the mouse button ends the selection or a drawing; compute the selection rectangle and redraw
+ * the cropped image
+ */
+ @Override
+ public void mouseUp(MouseEvent e) {
+ if (currentAction == EditorAction.SELECTING || currentAction == EditorAction.RESIZING_SELECTION
+ || currentAction == EditorAction.MOVING_SELECTION) {
+ int scaledX = (int) Math.round(e.x / scaleFactor);
+ int scaledY = (int) Math.round(e.y / scaleFactor);
+ if (currentAction == EditorAction.SELECTING) {
+ refreshCurrentSelection(scaledX, scaledY);
+ } else if (currentAction == EditorAction.RESIZING_SELECTION) {
+ refreshSelectionResize(scaledX, scaledY);
+ } else if (currentAction == EditorAction.MOVING_SELECTION) {
+ refreshSelectionPosition(scaledX, scaledY);
+ }
+ if (currentSelection.width == 0 && currentSelection.height == 0) {
+ currentSelection = null;
+ }
+
+ startPoint = null;
+ currentAction = EditorAction.CROPPING;
+
+ canvas.redraw();
+ setImageDirty(true);
+ } else if (currentAction == EditorAction.MARKING) {
+ if (startPoint != null) {
+ int drawTool = getSelectDrawToolbar();
+ if (drawTool != SelectToolAction.DRAW_FREE) {
+ if (drawTool == SelectToolAction.DRAW_TEXT) {
+ drawAnnotationText();
+ }
+ previousImage.dispose();
+ previousImage = null;
+ }
+
+ int[] history = new int[3];
+ history[0] = SWT.MouseUp;
+ history[1] = 0;
+ history[2] = 0;
+ historyMouseEvent.add(history);
+ }
+
+ startPoint = null;
+ setImageDirty(true);
+ }
+ }
+
+ /**
+ * Input annotation text and draw text
+ */
+ private void drawAnnotationText() {
+ workImageGC.drawImage(previousImage, 0, 0);
+ canvas.redraw();
+
+ int[] history = historyMouseEvent.get(historyMouseEvent.size() - 1);
+ if (history[0] != SWT.MouseMove) {
+ historyCheckpoint--;
+ updateAnnotationHistory();
+ return;
+ }
+
+ int endedPoint_x, endedPoint_y;
+ if (history[1] < startPoint.x) {
+ endedPoint_x = startPoint.x;
+ startPoint.x = history[1];
+ } else {
+ endedPoint_x = history[1];
+ }
+ if (history[2] < startPoint.y) {
+ endedPoint_y = startPoint.y;
+ startPoint.y = history[2];
+ } else {
+ endedPoint_y = history[2];
+ }
+ final Rectangle bounds = new Rectangle(startPoint.x, startPoint.y, endedPoint_x - startPoint.x,
+ endedPoint_y - startPoint.y);
+ textArea = new Text(canvas, SWT.MULTI | SWT.WRAP);
+ int xs = (int) Math.round(startPoint.x * scaleFactor);
+ int ys = (int) Math.round(startPoint.y * scaleFactor);
+ int xe = (int) Math.round(endedPoint_x * scaleFactor);
+ int ye = (int) Math.round(endedPoint_y * scaleFactor);
+ textArea.setBounds(new Rectangle(xs, ys, xe - xs, ye - ys));
+ FontData fontData = new FontData(drawTextToolbar.getStringCustom());
+ if (scaleFactor != 1.0) {
+ fontData.setHeight((int) Math.round(fontData.getHeight() * scaleFactor));
+ }
+ textArea.setFont(new Font(getShell().getDisplay(), fontData));
+ textArea.setForeground(new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawTextToolbar.getIntgerCustom())));
+ textArea.setTabs(1);
+ Point point = textArea.getCaretLocation();
+ textArea.setBounds(new Rectangle(xs - point.x, ys, xe - xs + point.x + point.x, ye - ys));
+ textArea.setFocus();
+ textArea.addListener(SWT.Deactivate, new Listener() {
+
+ public void handleEvent(Event event) {
+ String text = textArea.getText();
+ {
+ String newtext = ""; //$NON-NLS-1$
+ int currpos = 0;
+ int charpos = currpos;
+ textArea.setTopIndex(0);
+ textArea.setSelection(currpos);
+ int linepos = textArea.getCaretLineNumber();
+ boolean remove1st = false;
+ String line;
+ while (currpos < text.length()) {
+ int y = textArea.getCaretLineNumber();
+ if (linepos != y) {
+ line = text.substring(charpos, currpos);
+ if (line.endsWith("\n")) { //$NON-NLS-1$
+ line = line.substring(0, line.length() - 1);
+ }
+ newtext = newtext + "\n" + line; //$NON-NLS-1$
+ remove1st = true;
+ charpos = currpos;
+ linepos = y;
+ }
+ currpos++;
+ textArea.setSelection(currpos);
+ }
+ line = text.substring(charpos, currpos);
+ if (line.endsWith("\n")) { //$NON-NLS-1$
+ line = line.substring(0, line.length() - 1);
+ }
+ if (line.length() > 0) {
+ newtext = newtext + "\n" + text.substring(charpos, currpos); //$NON-NLS-1$
+ remove1st = true;
+ }
+ currpos = newtext.indexOf("\r"); //$NON-NLS-1$
+ while (currpos > 0) {
+ newtext = newtext.substring(0, currpos) + newtext.substring(currpos + 1);
+ currpos = newtext.indexOf("\r"); //$NON-NLS-1$
+ }
+ newtext = newtext.replace("\t", " "); //$NON-NLS-1$//$NON-NLS-2$
+ if (remove1st) {
+ newtext = newtext.substring(1);
+ }
+ text = newtext;
+ }
+
+ textArea.dispose();
+ textArea = null;
+
+ if (text.length() > 0) {
+ historyDrawText.get(historyCheckpoint - 1).append(text);
+ Color color = workImageGC.getForeground();
+ FontData fontData = new FontData(drawTextToolbar.getStringCustom());
+ workImageGC.setFont(new Font(getShell().getDisplay(), fontData));
+ workImageGC.setForeground(new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawTextToolbar.getIntgerCustom())));
+ workImageGC.setClipping(bounds);
+ workImageGC.drawText(text, bounds.x, bounds.y, true);
+ workImageGC.setClipping((Rectangle) null);
+ workImageGC.setForeground(color);
+ } else {
+ historyCheckpoint--;
+ updateAnnotationHistory();
+ }
+ canvas.redraw();
+ }
+ });
+ }
+
+ /**
+ * Pressing mouse button starts a selection or a drawing; normalizes and marks the start point
+ */
+ @Override
+ public void mouseDown(MouseEvent e) {
+ int scaledX = (int) (e.x / scaleFactor);
+ int scaledY = (int) (e.y / scaleFactor);
+
+ if (currentAction == EditorAction.MARKING) {
+ updateAnnotationHistory();
+
+ int drawTool = getSelectDrawToolbar();
+ int[] history = new int[5];
+ history[0] = historyMouseEvent.size();
+ history[1] = drawTool;
+ history[2] = (lineTypeToolbar != null) ? lineTypeToolbar.getSelect() : SWT.LINE_DOT;
+ history[3] = (lineBoldToolbar != null) ? lineBoldToolbar.getSelect() : 1;
+ RGB rgb;
+ if (drawTool == SelectToolAction.DRAW_TEXT) {
+ rgb = SelectToolAction.int2rgb(drawTextToolbar.getIntgerCustom());
+ } else {
+ rgb = SelectToolAction.int2rgb(drawColorToolbar.getSelect());
+ }
+ history[4] = (rgb.red << 16) + (rgb.green << 8) + rgb.blue;
+ historyDrawTool.add(history);
+ historyDrawText.add(new StringBuffer());
+ if (drawTool == SelectToolAction.DRAW_TEXT) {
+ FontData fontData = new FontData(drawTextToolbar.getStringCustom());
+ historyDrawFont.add(fontData.toString());
+ } else {
+ historyDrawFont.add(""); //$NON-NLS-1$
+ }
+ historyCheckpoint = historyDrawTool.size();
+
+ history = new int[3];
+ history[0] = SWT.MouseDown;
+ history[1] = scaledX;
+ history[2] = scaledY;
+ historyMouseEvent.add(history);
+ undoAction.setEnabled(true);
+
+ if (drawTool != SelectToolAction.DRAW_FREE) {
+ Display display = getShell().getDisplay();
+ previousImage = new Image(display, workImage.getBounds());
+ GC gc = new GC(previousImage);
+ gc.drawImage(workImage, 0, 0);
+ gc.dispose();
+ }
+
+ if (drawTool != SelectToolAction.DRAW_TEXT) {
+ workImageGC.setLineStyle(lineTypeToolbar.getSelect());
+ workImageGC.setLineWidth(lineBoldToolbar.getSelect());
+ workImageGC.setForeground(new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawColorToolbar.getSelect())));
+ } else {
+ workImageGC.setLineStyle(SWT.LINE_DOT);
+ workImageGC.setLineWidth(1);
+ workImageGC.setForeground(new Color(getShell().getDisplay(), 0, 0, 0));
+ }
+
+ startPoint = new Point(scaledX, scaledY);
+ drawMarkLine(scaledX, scaledY);
+ canvas.setCursor(cursors.get(CURSOR_MARK_TOOL));
+ return;
+ } else if (currentAction != EditorAction.CROPPING) {
+ return;
+ }
+
+ // Check the most appropriate action to follow; first check if I'm on some grab point
+ if (currentSelection != null) {
+ int info = getGrabPoint(e.x, e.y);
+ if (info >= 0) {
+ originalSelection = currentSelection;
+ currentAction = EditorAction.RESIZING_SELECTION;
+ resizableSides = new HashSet<SelectionSide>();
+ for (SelectionSide side : grabPointResizableSides[info]) {
+ resizableSides.add(side);
+ }
+ startPoint = new Point(scaledX, scaledY);
+ canvas.redraw();
+ return;
+ }
+ }
+
+ // Check if I could move the selection
+ if (currentSelection != null && currentSelection.contains(scaledX, scaledY)) {
+ originalSelection = currentSelection;
+ currentAction = EditorAction.MOVING_SELECTION;
+ startPoint = new Point(scaledX, scaledY);
+ canvas.redraw();
+ return;
+ }
+
+ // Do a simple selection
+ canvas.setCursor(cursors.get(SWT.CURSOR_CROSS));
+ currentAction = EditorAction.SELECTING;
+ currentSelection = null;
+ startPoint = new Point(scaledX, scaledY);
+
+ canvas.redraw();
+ }
+ });
+ }
+
+ private void clearSelection() {
+ currentSelection = null;
+ startPoint = null;
+ setImageDirty(true);
+ }
+
+ /**
+ * Recalculates image canvas size based on "fit on canvas" setting, set up the grab points, and redraws
+ * <p>
+ * This method should be called whenever the {@link #workImage image} <strong>visible</strong> size is changed,
+ * which can happen when:
+ * <p>
+ * <ul>
+ * <li>The "Fit Image" setting is changed, so the image zoom level changes
+ * <li>The image changes (by recapturing)
+ * <li>The canvas is resized (indirectly happens by resizing the wizard page) <strong>AND</strong> "Fit Image"
+ * setting is ON
+ * </ul>
+ * <p>
+ * Calling this method under other circumstances may lead to strange behavior in the scrolled composite
+ */
+ private void refreshCanvasSize() {
+ if (fitAction.getSelect() == SelectToolAction.ZOOM_FIT) {
+ // This little hack is necessary to get the client area without scrollbars;
+ // they'll be automatically restored if necessary after Canvas.setBounds()
+ scrolledComposite.getHorizontalBar().setVisible(false);
+ scrolledComposite.getVerticalBar().setVisible(false);
+
+ Rectangle bounds = scrolledComposite.getClientArea();
+ if (workImage != null) {
+ Rectangle imageBounds = workImage.getBounds();
+ double xRatio = (double) bounds.width / imageBounds.width;
+ double yRatio = (double) bounds.height / imageBounds.height;
+ scaleFactor = Math.min(xRatio, yRatio);
+ bounds.width = (int) Math.round(imageBounds.width * scaleFactor);
+ bounds.height = (int) Math.round(imageBounds.height * scaleFactor);
+ }
+ canvas.setBounds(bounds);
+ } else {
+ scaleFactor = fitAction.getSelect(); // 50, 100, 200, 400 or 800
+ scaleFactor = scaleFactor / 100;
+ Rectangle bounds = scrolledComposite.getClientArea();
+ if (workImage != null) {
+ Rectangle imageBounds = workImage.getBounds();
+ bounds.width = (int) Math.round(imageBounds.width * scaleFactor);
+ bounds.height = (int) Math.round(imageBounds.height * scaleFactor);
+ }
+ canvas.setBounds(bounds);
+ }
+
+ canvas.redraw();
+ }
+
+ private void updateAnnotationHistory() {
+ int[] history;
+ if (historyCheckpoint < historyDrawTool.size()) {
+ history = historyDrawTool.get(historyCheckpoint);
+ while (history[0] < historyMouseEvent.size()) {
+ historyMouseEvent.remove(historyMouseEvent.size() - 1);
+ }
+ while (historyCheckpoint < historyDrawTool.size()) {
+ historyDrawTool.remove(historyDrawTool.size() - 1);
+ }
+ while (historyCheckpoint < historyDrawText.size()) {
+ historyDrawText.remove(historyDrawText.size() - 1);
+ }
+ while (historyCheckpoint < historyDrawFont.size()) {
+ historyDrawFont.remove(historyDrawFont.size() - 1);
+ }
+ redoAction.setEnabled(false);
+ }
+
+ undoAction.setEnabled(historyCheckpoint > 0);
+ }
+
+ /**
+ * Draw Annotation with history
+ */
+ private void drawAnnotationHistory() {
+ workImageGC.drawImage(originalImage, 0, 0);
+ Color backBackground = workImageGC.getBackground();
+ Color backForeground = workImageGC.getForeground();
+ int backLineStyle = workImageGC.getLineStyle();
+ int backLineWidth = workImageGC.getLineWidth();
+ int[] history;
+ for (int c = 0; c < historyCheckpoint; c++) {
+ history = historyDrawTool.get(c);
+ int toolKind = history[1];
+ int boldlKind = history[3];
+ workImageGC.setLineStyle(history[2]);
+ workImageGC.setLineWidth(boldlKind);
+ workImageGC.setForeground(new Color(getShell().getDisplay(), //
+ history[4] >> 16, //
+ (history[4] >> 8) & 0x00ff, //
+ history[4] & 0x00ff));
+
+ int h = history[0];
+ history = historyMouseEvent.get(h);
+ int start_x = history[1];
+ int start_y = history[2];
+ for (h++; h < historyMouseEvent.size(); h++) {
+ history = historyMouseEvent.get(h);
+ if (history[0] == SWT.MouseUp) {
+ break;
+ }
+ int x = history[1];
+ int y = history[2];
+ if (toolKind == SelectToolAction.DRAW_FREE) {
+ workImageGC.drawLine(start_x, start_y, x, y);
+ start_x = x;
+ start_y = y;
+ } else {
+ if (start_x == x && start_y == y) {
+ workImageGC.drawLine(start_x, start_y, x, y);
+ } else {
+ int rounded;
+ int width = x - start_x;
+ int height = y - start_y;
+ switch (toolKind) {
+ case SelectToolAction.DRAW_LINE:
+ workImageGC.drawLine(start_x, start_y, x, y);
+ break;
+ case SelectToolAction.DRAW_ARROW1:
+ workImageGC.setBackground(workImageGC.getForeground());
+ drawArrowLine(start_x, start_y, x, y, false);
+ break;
+ case SelectToolAction.DRAW_ARROW2:
+ workImageGC.setBackground(workImageGC.getForeground());
+ drawArrowLine(start_x, start_y, x, y, true);
+ break;
+ case SelectToolAction.DRAW_BOX:
+ workImageGC.drawRectangle(start_x, start_y, width, height);
+ break;
+ case SelectToolAction.DRAW_RBOX:
+ rounded = boldlKind * 8;
+ workImageGC.drawRoundRectangle(start_x, start_y, width, height, rounded, rounded);
+ break;
+ case SelectToolAction.DRAW_OVAL:
+ workImageGC.drawOval(start_x, start_y, width, height);
+ break;
+ case SelectToolAction.DRAW_FILL_BOX:
+ workImageGC.setBackground(workImageGC.getForeground());
+ workImageGC.fillRectangle(start_x, start_y, width, height);
+ break;
+ case SelectToolAction.DRAW_FILL_RBOX:
+ rounded = boldlKind * 8;
+ workImageGC.setBackground(workImageGC.getForeground());
+ workImageGC.fillRoundRectangle(start_x, start_y, width, height, rounded, rounded);
+ break;
+ case SelectToolAction.DRAW_FILL_OVAL:
+ workImageGC.setBackground(workImageGC.getForeground());
+ workImageGC.fillOval(start_x, start_y, width, height);
+ break;
+ case SelectToolAction.DRAW_TEXT:
+ StringBuffer text = historyDrawText.get(c);
+ {
+ Font backFont = workImageGC.getFont();
+ FontData fontData = new FontData(historyDrawFont.get(c));
+ workImageGC.setFont(new Font(getShell().getDisplay(), fontData));
+ workImageGC.setClipping(start_x, start_y, width, height);
+ workImageGC.drawText(text.toString(), start_x, start_y, true);
+ workImageGC.setClipping((Rectangle) null);
+ workImageGC.setFont(backFont);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ workImageGC.setBackground(backBackground);
+ workImageGC.setForeground(backForeground);
+ workImageGC.setLineStyle(backLineStyle);
+ workImageGC.setLineWidth(backLineWidth);
+
+ canvas.redraw();
+ }
+
+ /**
+ * Decorates the screenshot canvas with the selection rectangle, resize grab points and other adornments
+ */
+ private void drawSelection(GC gc) {
+ if (currentSelection == null) {
+ return;
+ }
+ Rectangle inside = getScaledSelection();
+
+ // Draw shadow
+ gc.setBackground(CommonColors.GRAY_MID);
+ gc.setAdvanced(true);
+ gc.setAlpha(120);
+
+ Region invertedSelection = new Region();
+ invertedSelection.add(canvas.getClientArea());
+ invertedSelection.subtract(inside);
+ gc.setClipping(invertedSelection);
+ gc.fillRectangle(canvas.getClientArea());
+ gc.setClipping((Region) null);
+ invertedSelection.dispose();
+
+ gc.setAdvanced(false);
+
+ // Draw selection rectangle
+ gc.setLineStyle(SWT.LINE_SOLID);
+ gc.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
+ gc.drawRectangle(inside);
+
+// // Draw grab points
+// gc.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+// gc.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_BLACK));
+// for (GrabPoint point : grabPoints) {
+// gc.fillRectangle(point.grabArea);
+// gc.drawRectangle(point.grabArea);
+// }
+ gc.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
+ Rectangle outside = getOutsideSelection(inside);
+ gc.drawRectangle(outside);
+ gc.setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
+ gc.fillRectangle(outside.x, outside.y, //
+ SQUARE_SIZE * 6, SQUARE_SIZE * 2);
+ gc.fillRectangle(outside.x + outside.width - SQUARE_SIZE * 6, outside.y, //
+ SQUARE_SIZE * 6, SQUARE_SIZE * 2);
+ gc.fillRectangle(outside.x, outside.y, //
+ SQUARE_SIZE * 2, SQUARE_SIZE * 6);
+ gc.fillRectangle(outside.x + outside.width - SQUARE_SIZE * 2, outside.y, //
+ SQUARE_SIZE * 2, SQUARE_SIZE * 6);
+ gc.fillRectangle(outside.x, outside.y + outside.height - SQUARE_SIZE * 6, //
+ SQUARE_SIZE * 2, SQUARE_SIZE * 6);
+ gc.fillRectangle(outside.x + outside.width - SQUARE_SIZE * 2, outside.y + outside.height - SQUARE_SIZE * 6, //
+ SQUARE_SIZE * 2, SQUARE_SIZE * 6);
+ gc.fillRectangle(outside.x, outside.y + outside.height - SQUARE_SIZE * 2, //
+ SQUARE_SIZE * 6, SQUARE_SIZE * 2);
+ gc.fillRectangle(outside.x + outside.width - SQUARE_SIZE * 6, outside.y + outside.height - SQUARE_SIZE * 2, //
+ SQUARE_SIZE * 6, SQUARE_SIZE * 2);
+ }
+
+ /**
+ * Connects the previous mark point to the new reference point, by drawing a new line, rectangle or oval
+ */
+ private void drawMarkLine(int x, int y) {
+ if (startPoint != null) {
+ clearAction.setEnabled(true);
+ int drawTool = getSelectDrawToolbar();
+ if (drawTool == SelectToolAction.DRAW_FREE) {
+ workImageGC.drawLine(startPoint.x, startPoint.y, x, y);
+ startPoint.x = x;
+ startPoint.y = y;
+ } else {
+ workImageGC.drawImage(previousImage, 0, 0);
+ if (startPoint.x == x && startPoint.y == y) {
+ workImageGC.drawLine(startPoint.x, startPoint.y, x, y);
+ } else {
+ Color backColor;
+ Color markColor;
+ int rounded;
+ int width = x - startPoint.x;
+ int height = y - startPoint.y;
+ switch (drawTool) {
+ case SelectToolAction.DRAW_LINE:
+ workImageGC.drawLine(startPoint.x, startPoint.y, x, y);
+ break;
+ case SelectToolAction.DRAW_ARROW1:
+ backColor = workImageGC.getBackground();
+ markColor = new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawColorToolbar.getSelect()));
+ workImageGC.setBackground(markColor);
+ drawArrowLine(startPoint.x, startPoint.y, x, y, false);
+ workImageGC.setBackground(backColor);
+ break;
+ case SelectToolAction.DRAW_ARROW2:
+ backColor = workImageGC.getBackground();
+ markColor = new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawColorToolbar.getSelect()));
+ workImageGC.setBackground(markColor);
+ drawArrowLine(startPoint.x, startPoint.y, x, y, true);
+ workImageGC.setBackground(backColor);
+ break;
+ case SelectToolAction.DRAW_BOX:
+ workImageGC.drawRectangle(startPoint.x, startPoint.y, width, height);
+ break;
+ case SelectToolAction.DRAW_RBOX:
+ rounded = lineBoldToolbar.getSelect() * 8;
+ workImageGC.drawRoundRectangle(startPoint.x, startPoint.y, width, height, rounded, rounded);
+ break;
+ case SelectToolAction.DRAW_OVAL:
+ workImageGC.drawOval(startPoint.x, startPoint.y, width, height);
+ break;
+ case SelectToolAction.DRAW_FILL_BOX:
+ backColor = workImageGC.getBackground();
+ markColor = new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawColorToolbar.getSelect()));
+ workImageGC.setBackground(markColor);
+ workImageGC.fillRectangle(startPoint.x, startPoint.y, width, height);
+ workImageGC.setBackground(backColor);
+ break;
+ case SelectToolAction.DRAW_FILL_RBOX:
+ rounded = lineBoldToolbar.getSelect() * 8;
+ backColor = workImageGC.getBackground();
+ markColor = new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawColorToolbar.getSelect()));
+ workImageGC.setBackground(markColor);
+ workImageGC.fillRoundRectangle(startPoint.x, startPoint.y, width, height, rounded, rounded);
+ workImageGC.setBackground(backColor);
+ break;
+ case SelectToolAction.DRAW_FILL_OVAL:
+ backColor = workImageGC.getBackground();
+ markColor = new Color(getShell().getDisplay(),
+ SelectToolAction.int2rgb(drawColorToolbar.getSelect()));
+ workImageGC.setBackground(markColor);
+ workImageGC.fillOval(startPoint.x, startPoint.y, width, height);
+ workImageGC.setBackground(backColor);
+ break;
+ case SelectToolAction.DRAW_TEXT:
+ workImageGC.fillRectangle(startPoint.x, startPoint.y, width, height);
+ workImageGC.drawRectangle(startPoint.x, startPoint.y, width, height);
+ break;
+ }
+ }
+ }
+ canvas.redraw();
+ }
+ }
+
+ public void drawArrowLine(int xs, int ys, int xe, int ye, boolean bothsides) {
+ int width = xe - xs, height = ye - ys;
+ int bold = workImageGC.getLineWidth();
+ int leng = (bold == 8) ? bold * 4 : (bold == 4) ? bold * 6 : (bold == 2) ? bold * 8 : bold * 10;
+ double delta = Math.PI / 6.0;
+ double theta = Math.atan2(height, width);
+
+ // Draw line
+ if (bothsides) {
+ workImageGC.drawLine( //
+ xs + (int) (leng / 2 * Math.cos(theta)), //
+ ys + (int) (leng / 2 * Math.sin(theta)), //
+ xe - (int) (leng / 2 * Math.cos(theta)), //
+ ye - (int) (leng / 2 * Math.sin(theta)));
+ } else {
+ workImageGC.drawLine( //
+ xs, //
+ ys, //
+ xe - (int) (leng / 2 * Math.cos(theta)), //
+ ye - (int) (leng / 2 * Math.sin(theta)));
+ }
+
+ // Draw ending side arrow
+ workImageGC.setLineWidth(1);
+
+ int[] point = { xe, ye, //
+ xe - (int) (leng * Math.cos(theta - delta)), //
+ ye - (int) (leng * Math.sin(theta - delta)), //
+ xe - (int) (leng * Math.cos(theta + delta)), //
+ ye - (int) (leng * Math.sin(theta + delta)) };
+ workImageGC.fillPolygon(point);
+
+ // Draw starting side arrow
+ if (bothsides) {
+ int[] point2 = { xs, ys, //
+ xs + (int) (leng * Math.cos(theta - delta)), //
+ ys + (int) (leng * Math.sin(theta - delta)), //
+ xs + (int) (leng * Math.cos(theta + delta)), //
+ ys + (int) (leng * Math.sin(theta + delta)) };
+ workImageGC.fillPolygon(point2);
+ }
+
+ workImageGC.setLineWidth(bold);
+ }
+
+ private static enum SelectionSide {
+
+ LEFT, RIGHT, TOP, BOTTOM;
+
+ };
+
+ private static final int SQUARE_SIZE = 3;
+
+ /**
+ * Creates the final screenshot
+ *
+ * @return The final screenshot, with all markings, and cropped according to user settings; <strong>The caller is
+ * responsible for disposing the returned image</strong>
+ */
+ public Image createImage() {
+ Image screenshot = new Image(getShell().getDisplay(), currentSelection != null ? currentSelection
+ : workImage.getBounds());
+
+ GC gc = new GC(screenshot);
+ if (currentSelection != null) {
+ gc.drawImage(workImage, currentSelection.x, currentSelection.y, currentSelection.width,
+ currentSelection.height, 0, 0, currentSelection.width, currentSelection.height);
+ } else {
+ gc.drawImage(workImage, 0, 0);
+ }
+ gc.dispose();
+ this.imageDirty = false;
+
+ return screenshot;
+ }
+
+ public void setImageDirty(boolean pageDirty) {
+ this.imageDirty = pageDirty;
+ }
+
+ public boolean isImageDirty() {
+ return imageDirty;
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/SelectionProviderAdapter.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/SelectionProviderAdapter.java
new file mode 100644
index 0000000..048aff9
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/SelectionProviderAdapter.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.core.commands.common.EventManager;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * Provides an simple implementation of {@link ISelectionProvider} that propagates selection events to registered
+ * listeners.
+ *
+ * @author Steffen Pingel
+ */
+public class SelectionProviderAdapter extends EventManager implements ISelectionProvider {
+
+ private ISelection selection;
+
+ /**
+ * Constructs a <code>SelectionProviderAdapter</code> and initializes the selection to <code>selection</code>.
+ *
+ * @param selection
+ * the initial selection
+ * @see #setSelection(ISelection)
+ */
+ public SelectionProviderAdapter(ISelection selection) {
+ setSelection(selection);
+ }
+
+ /**
+ * Constructs a <code>SelectionProviderAdapter</code> with a <code>null</code> selection.
+ */
+ public SelectionProviderAdapter() {
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ addListenerObject(listener);
+ }
+
+ public ISelection getSelection() {
+ return selection;
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ removeListenerObject(listener);
+ }
+
+ protected void selectionChanged(final SelectionChangedEvent event) {
+ Object[] listeners = getListeners();
+ for (int i = 0; i < listeners.length; ++i) {
+ final ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i];
+ SafeRunner.run(new SafeRunnable() {
+ public void run() {
+ listener.selectionChanged(event);
+ }
+ });
+ }
+ }
+
+ public void setSelection(ISelection selection) {
+ this.selection = selection;
+ selectionChanged(new SelectionChangedEvent(this, selection));
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/SubstringPatternFilter.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/SubstringPatternFilter.java
new file mode 100644
index 0000000..809db99
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/SubstringPatternFilter.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class SubstringPatternFilter extends PatternFilter {
+
+ @Override
+ public void setPattern(String patternString) {
+ if (patternString == null || patternString.startsWith("*")) { //$NON-NLS-1$
+ super.setPattern(patternString);
+ } else {
+ super.setPattern("*" + patternString); //$NON-NLS-1$
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/WorkbenchActionSupport.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/WorkbenchActionSupport.java
new file mode 100644
index 0000000..8bac083
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/WorkbenchActionSupport.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.internal.WorkbenchMessages;
+import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
+
+/**
+ * Manages commons workbench actions for editing text.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+ at SuppressWarnings("restriction")
+public class WorkbenchActionSupport implements ISelectionChangedListener {
+
+ private class GlobalAction extends Action {
+
+ private final String actionId;
+
+ public GlobalAction(String actionId) {
+ this.actionId = actionId;
+ }
+
+ @Override
+ public void run() {
+ if (callback != null) {
+ callback.doAction(actionId, callback.getFocusControl());
+ updateActions(callback.getSelection());
+ }
+ }
+
+ public void selectionChanged(ISelection selection) {
+ if (callback != null) {
+ setEnabled(callback.canPerformAction(actionId, callback.getFocusControl()));
+ } else {
+ setEnabled(false);
+ }
+ }
+ }
+
+ public static class WorkbenchActionCallback {
+
+ public boolean canPerformAction(String actionId, Control control) {
+ return CommonTextSupport.canPerformAction(actionId, control);
+ }
+
+ public void doAction(String actionId, Control control) {
+ CommonTextSupport.doAction(actionId, control);
+ }
+
+ public Control getFocusControl() {
+ return Display.getDefault().getFocusControl();
+ }
+
+ public ISelection getSelection() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null && window.getSelectionService() != null) {
+ return window.getSelectionService().getSelection();
+ }
+ return null;
+ }
+
+ }
+
+ private WorkbenchActionCallback callback;
+
+ private final GlobalAction copyAction;
+
+ private final GlobalAction cutAction;
+
+ private final GlobalAction findAction;
+
+ private final GlobalAction pasteAction;
+
+ private final GlobalAction redoAction;
+
+ private final GlobalAction selectAllAction;
+
+ private final GlobalAction undoAction;
+
+ public WorkbenchActionSupport() {
+ cutAction = new GlobalAction(ActionFactory.CUT.getId());
+ cutAction.setText(WorkbenchMessages.Workbench_cut);
+ cutAction.setToolTipText(WorkbenchMessages.Workbench_cutToolTip);
+ cutAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
+ cutAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
+ cutAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
+ cutAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.CUT);
+
+ pasteAction = new GlobalAction(ActionFactory.PASTE.getId());
+ pasteAction.setText(WorkbenchMessages.Workbench_paste);
+ pasteAction.setToolTipText(WorkbenchMessages.Workbench_pasteToolTip);
+ pasteAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
+ pasteAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
+ pasteAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
+ pasteAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
+
+ copyAction = new GlobalAction(ActionFactory.COPY.getId());
+ copyAction.setText(WorkbenchMessages.Workbench_copy);
+ copyAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
+ copyAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
+ copyAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
+ copyAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
+
+ undoAction = new GlobalAction(ActionFactory.UNDO.getId());
+ undoAction.setText(WorkbenchMessages.Workbench_undo);
+ undoAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
+ undoAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
+ undoAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED));
+ undoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.UNDO);
+
+ redoAction = new GlobalAction(ActionFactory.REDO.getId());
+ redoAction.setText(WorkbenchMessages.Workbench_redo);
+ redoAction.setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
+ redoAction.setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
+ redoAction.setDisabledImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_REDO_DISABLED));
+ redoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.REDO);
+
+ selectAllAction = new GlobalAction(ActionFactory.SELECT_ALL.getId());
+ selectAllAction.setText(WorkbenchMessages.Workbench_selectAll);
+ selectAllAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.SELECT_ALL);
+ selectAllAction.setEnabled(true);
+
+ findAction = new GlobalAction(ActionFactory.FIND.getId());
+ findAction.setText(WorkbenchMessages.Workbench_findReplace);
+ findAction.setImageDescriptor(CommonImages.FIND);
+ findAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_REPLACE);
+ }
+
+ public void contributeActions(IMenuManager manager) {
+ manager.add(undoAction);
+ manager.add(redoAction);
+ manager.add(new Separator());
+ manager.add(cutAction);
+ manager.add(copyAction);
+ manager.add(pasteAction);
+ manager.add(selectAllAction);
+ manager.add(new Separator());
+ }
+
+ public void forceEditActionsEnabled() {
+ cutAction.setEnabled(true);
+ copyAction.setEnabled(true);
+ pasteAction.setEnabled(true);
+ selectAllAction.setEnabled(true);
+ undoAction.setEnabled(false);
+ redoAction.setEnabled(false);
+ }
+
+ public WorkbenchActionCallback getCallback() {
+ return callback;
+ }
+
+ public Action getCopyAction() {
+ return copyAction;
+ }
+
+ public Action getCutAction() {
+ return cutAction;
+ }
+
+ public Action getFindAction() {
+ return findAction;
+ }
+
+ public Action getPasteAction() {
+ return pasteAction;
+ }
+
+ public Action getRedoAction() {
+ return redoAction;
+ }
+
+ public Action getSelectAllAction() {
+ return selectAllAction;
+ }
+
+ public Action getUndoAction() {
+ return undoAction;
+ }
+
+ public void install(IActionBars bars) {
+ bars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
+ bars.setGlobalActionHandler(ActionFactory.PASTE.getId(), pasteAction);
+ bars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
+ bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), undoAction);
+ bars.setGlobalActionHandler(ActionFactory.REDO.getId(), redoAction);
+ bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAllAction);
+ bars.setGlobalActionHandler(ActionFactory.FIND.getId(), findAction);
+ bars.updateActionBars();
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof TextSelection) {
+ // only update global actions
+ updateActions(event.getSelection());
+ } else if (selection.isEmpty()) {
+ // XXX a styled text widget has lost focus, re-enable all edit actions
+ forceEditActionsEnabled();
+ }
+ }
+
+ public void setCallback(WorkbenchActionCallback callback) {
+ this.callback = callback;
+ }
+
+ public void uninstall(IActionBars bars) {
+ bars.setGlobalActionHandler(ActionFactory.CUT.getId(), null);
+ bars.setGlobalActionHandler(ActionFactory.PASTE.getId(), null);
+ bars.setGlobalActionHandler(ActionFactory.COPY.getId(), null);
+ bars.setGlobalActionHandler(ActionFactory.UNDO.getId(), null);
+ bars.setGlobalActionHandler(ActionFactory.REDO.getId(), null);
+ bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), null);
+ bars.setGlobalActionHandler(ActionFactory.FIND.getId(), null);
+ bars.updateActionBars();
+ }
+
+ public void updateActions(ISelection selection) {
+ cutAction.selectionChanged(selection);
+ copyAction.selectionChanged(selection);
+ pasteAction.selectionChanged(selection);
+ undoAction.selectionChanged(selection);
+ redoAction.selectionChanged(selection);
+ selectAllAction.selectionChanged(selection);
+ findAction.selectionChanged(selection);
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/WorkbenchUtil.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/WorkbenchUtil.java
new file mode 100644
index 0000000..fc6ab9b
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/WorkbenchUtil.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * IBM Corporation - helper methods from
+ * org.eclipse.wst.common.frameworks.internal.ui.WTPActivityHelper
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.provisional.commons.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Calendar;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin;
+import org.eclipse.mylyn.internal.commons.ui.Messages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IPluginContribution;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.activities.IIdentifier;
+import org.eclipse.ui.activities.IWorkbenchActivitySupport;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.internal.browser.WebBrowserPreference;
+import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class WorkbenchUtil {
+
+// public static IViewPart getFromActivePerspective(String viewId) {
+// if (PlatformUI.isWorkbenchRunning()) {
+// IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+// if (activePage != null) {
+// return activePage.findView(viewId);
+// }
+// }
+// return null;
+// }
+
+// public static IViewPart openInActivePerspective(String viewId) throws PartInitException {
+// if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+// IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+// if (activePage != null) {
+// return activePage.showView(viewId);
+// }
+// }
+// return null;
+// }
+
+ /**
+ * Return the modal shell that is currently open. If there isn't one then return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @param shell
+ * A shell to exclude from the search. May be <code>null</code>.
+ * @return Shell or <code>null</code>.
+ */
+ private static Shell getModalShellExcluding(Shell shell) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ Shell[] shells = workbench.getDisplay().getShells();
+ int modal = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL;
+ for (Shell shell2 : shells) {
+ if (shell2.equals(shell)) {
+ break;
+ }
+ // Do not worry about shells that will not block the user.
+ if (shell2.isVisible()) {
+ int style = shell2.getStyle();
+ if ((style & modal) != 0) {
+ return shell2;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Utility method to get the best parenting possible for a dialog. If there is a modal shell create it so as to
+ * avoid two modal dialogs. If not then return the shell of the active workbench window. If neither can be found
+ * return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @return Shell or <code>null</code>
+ */
+ public static Shell getShell() {
+ if (!PlatformUI.isWorkbenchRunning() || PlatformUI.getWorkbench().isClosing()) {
+ return null;
+ }
+ Shell modal = getModalShellExcluding(null);
+ if (modal != null) {
+ return modal;
+ }
+ return getNonModalShell();
+ }
+
+ /**
+ * Get the active non modal shell. If there isn't one return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @return Shell
+ */
+ private static Shell getNonModalShell() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ if (windows.length > 0) {
+ return windows[0].getShell();
+ }
+ } else {
+ return window.getShell();
+ }
+
+ return null;
+ }
+
+ /**
+ * @return whether the UI is set up to filter contributions (has defined activity categories).
+ */
+ public static final boolean isFiltering() {
+ return !PlatformUI.getWorkbench().getActivitySupport().getActivityManager().getDefinedActivityIds().isEmpty();
+ }
+
+ public static boolean allowUseOf(Object object) {
+ if (!isFiltering()) {
+ return true;
+ }
+ if (object instanceof IPluginContribution) {
+ IPluginContribution contribution = (IPluginContribution) object;
+ if (contribution.getPluginId() != null) {
+ IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
+ IIdentifier identifier = workbenchActivitySupport.getActivityManager().getIdentifier(
+ createUnifiedId(contribution));
+ return identifier.isEnabled();
+ }
+ }
+ if (object instanceof String) {
+ IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
+ IIdentifier identifier = workbenchActivitySupport.getActivityManager().getIdentifier((String) object);
+ return identifier.isEnabled();
+ }
+ return true;
+ }
+
+ private static final String createUnifiedId(IPluginContribution contribution) {
+ if (contribution.getPluginId() != null) {
+ return contribution.getPluginId() + '/' + contribution.getLocalId();
+ }
+ return contribution.getLocalId();
+ }
+
+ /**
+ * Opens <code>location</code> in a web-browser according to the Eclipse workbench preferences.
+ *
+ * @param location
+ * the url to open
+ * @see #openUrl(String, int)
+ */
+ public static void openUrl(String location) {
+ openUrl(location, SWT.NONE);
+ }
+
+ /**
+ * Opens <code>location</code> in a web-browser according to the Eclipse workbench preferences.
+ *
+ * @param location
+ * the url to open
+ * @param customFlags
+ * additional flags that are passed to {@link IWorkbenchBrowserSupport}, pass
+ * {@link IWorkbenchBrowserSupport#AS_EXTERNAL} to force opening external browser
+ */
+ public static void openUrl(String location, int customFlags) {
+ try {
+ URL url = null;
+ if (location != null) {
+ url = new URL(location);
+ }
+ if (WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.EXTERNAL
+ || (customFlags & IWorkbenchBrowserSupport.AS_EXTERNAL) != 0) {
+ try {
+ IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
+ support.getExternalBrowser().openURL(url);
+ } catch (PartInitException e) {
+ Status status = new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN,
+ Messages.WorkbenchUtil_Browser_Initialization_Failed);
+ MessageDialog.openError(getShell(), Messages.WorkbenchUtil_Open_Location_Title, status.getMessage());
+ }
+ } else {
+ IWebBrowser browser = null;
+ int flags = customFlags;
+ if (WorkbenchBrowserSupport.getInstance().isInternalWebBrowserAvailable()) {
+ flags |= IWorkbenchBrowserSupport.AS_EDITOR | IWorkbenchBrowserSupport.LOCATION_BAR
+ | IWorkbenchBrowserSupport.NAVIGATION_BAR;
+ } else {
+ flags |= IWorkbenchBrowserSupport.AS_EXTERNAL | IWorkbenchBrowserSupport.LOCATION_BAR
+ | IWorkbenchBrowserSupport.NAVIGATION_BAR;
+ }
+
+ String generatedId = "org.eclipse.mylyn.web.browser-" + Calendar.getInstance().getTimeInMillis(); //$NON-NLS-1$
+ browser = WorkbenchBrowserSupport.getInstance().createBrowser(flags, generatedId, null, null);
+ browser.openURL(url);
+ }
+ } catch (PartInitException e) {
+ Status status = new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN,
+ Messages.WorkbenchUtil_Browser_Initialization_Failed, e);
+ CommonsUiPlugin.getDefault().getLog().log(status);
+ MessageDialog.openError(getShell(), Messages.WorkbenchUtil_Open_Location_Title, status.getMessage());
+ } catch (MalformedURLException e) {
+ if (location != null && location.trim().equals("")) { //$NON-NLS-1$
+ Status status = new Status(IStatus.WARNING, CommonsUiPlugin.ID_PLUGIN,
+ Messages.WorkbenchUtil_No_URL_Error, e);
+ MessageDialog.openWarning(getShell(), Messages.WorkbenchUtil_Open_Location_Title, status.getMessage());
+ } else {
+ Status status = new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, NLS.bind(
+ Messages.WorkbenchUtil_Invalid_URL_Error, location), e);
+ MessageDialog.openError(getShell(), Messages.WorkbenchUtil_Open_Location_Title, status.getMessage());
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/editor/EditorBusyIndicator.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/editor/EditorBusyIndicator.java
new file mode 100644
index 0000000..979209a
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/editor/EditorBusyIndicator.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui.editor;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.commons.ui.CommonsUiPlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Provides a spinner animation for the tab title of an editor.
+ *
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+public class EditorBusyIndicator {
+
+ private class Animator implements Runnable {
+
+ int imageDataIndex = 0;
+
+ private final Image[] images;
+
+ private boolean stopped;
+
+ public Animator(Image[] images) {
+ this.images = images;
+ }
+
+ public void run() {
+ if (stopped) {
+ return;
+ }
+
+ try {
+ Image image = images[imageDataIndex];
+ imageDataIndex = (imageDataIndex + 1) % images.length;
+
+ if (updateTitleImage(image)) {
+ PlatformUI.getWorkbench().getDisplay().timerExec(UPDATE_INTERVAL, this);
+ }
+ } catch (Exception e) {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Failed to update animation", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void stop() {
+ stopped = true;
+ }
+ }
+
+ private static final int UPDATE_INTERVAL = 90;
+
+ private Animator animator;
+
+ private final IBusyEditor editor;
+
+ private Image[] images;
+
+ private Image oldImage;
+
+ public EditorBusyIndicator(IBusyEditor editor) {
+ this.editor = editor;
+ }
+
+ /**
+ * Starts the busy indication.
+ *
+ * @see #stop()
+ */
+ public void start() {
+ if (animator != null) {
+ stop();
+ }
+
+ try {
+ if (images == null) {
+ images = CommonImages.getProgressImages();
+ // if image fails to load do not continue
+ if (images == null) {
+ return;
+ }
+ }
+
+ oldImage = editor.getTitleImage();
+
+ if (images.length > 1) {
+ animator = new Animator(images);
+ animator.run();
+ }
+ } catch (SWTException e) {
+ CommonsUiPlugin.getDefault().getLog().log(
+ new Status(IStatus.ERROR, CommonsUiPlugin.ID_PLUGIN, "Failed to start animation", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Stops the animation.
+ *
+ * @see #start()
+ */
+ public void stop() {
+ if (animator != null) {
+ animator.stop();
+ animator = null;
+
+ updateTitleImage(oldImage);
+ oldImage = null;
+ }
+ }
+
+ private boolean updateTitleImage(final Image image) {
+ if (!PlatformUI.getWorkbench().isClosing()) {
+ if (image != null && !image.isDisposed()) {
+ editor.setTitleImage(image);
+ return true;
+ } else {
+ if (oldImage != null && !oldImage.isDisposed()) {
+ editor.setTitleImage(oldImage);
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/editor/IBusyEditor.java b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/editor/IBusyEditor.java
new file mode 100644
index 0000000..b21099f
--- /dev/null
+++ b/org.eclipse.mylyn.commons.ui/src/org/eclipse/mylyn/internal/provisional/commons/ui/editor/IBusyEditor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.commons.ui.editor;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.part.WorkbenchPart;
+
+/**
+ * A callback for modifying the title image of an editor. Clients that provide busy animations should implement this
+ * interface and delegate to the respective methods in {@link WorkbenchPart}.
+ *
+ * @author Shawn Minto
+ * @see EditorBusyIndicator
+ */
+public interface IBusyEditor {
+
+ /**
+ * Updates the title image of the editor to <code>image</code>.
+ *
+ * @param image
+ * the image
+ */
+ public void setTitleImage(Image image);
+
+ /**
+ * Returns the current title image of the editor.
+ */
+ public Image getTitleImage();
+
+}
diff --git a/org.eclipse.mylyn.compatibility/.classpath b/org.eclipse.mylyn.compatibility/.classpath
new file mode 100644
index 0000000..36e9463
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.3"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.compatibility/.cvsignore b/org.eclipse.mylyn.compatibility/.cvsignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.cvsignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/org.eclipse.mylyn.compatibility/.project b/org.eclipse.mylyn.compatibility/.project
new file mode 100644
index 0000000..c81a666
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.compatibility</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.compatibility/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..65852b3
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylyn.compatibility' to 'org.eclipse.mylyn.internal.compatibility' - Original project: 'org.eclipse.mylyn.compatibility' - Original element: 'org.eclipse.mylyn.compatibility/src/org.eclipse.mylyn.compatibility' - Renamed element: 'org.eclipse.mylyn.compatibility/src/org.eclipse.mylyn.internal.compatibility' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.compatibility'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.compatibility" name="org.eclipse.mylyn.internal.compatibility" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181359351665" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.compatibility/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..e7888ba
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1 @@
+1181359351665 Rename package 'org.eclipse.mylyn.compatibility'
diff --git a/org.eclipse.mylyn.compatibility/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..1f4d9b5
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'JavaCompatibilityCheckActivator' to 'JavaRuntimeVersionChecker' - Original project: 'org.eclipse.mylyn.compatibility' - Original element: 'JavaCompatibilityCheckActivator' - Renamed element: 'JavaRuntimeVersionChecker' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'JavaCompatibilityCheckActivator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<{JavaCompatibilityCheckActivator.java[JavaCompatibilityCheckActivator" matchStrategy="1" name="JavaRuntimeVersionChecker" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182232410676" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.compatibility/src/org.eclipse.mylyn.internal.compatibility' - Original project: 'org.eclipse.mylyn.compatibility' - Destination element: 'org.eclipse.mylyn.compatibility/src/org.eclipse.mylyn.internal.compatibility' - Original element: 'JavaRuntimeVersionChecker.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.compatibility" element1="/src<{JavaRuntimeVersionChecker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182232431260" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.compatibility' - Original project: 'org.eclipse.mylyn.compatibility' - Original element: 'empty.txt'" description="Delete element" element1="src/org/eclipse/mylyn/internal/compatibility/empty.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182232435569" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.compatibility.JavaRuntimeVersionChecker.PREF_WARN_DISABLED' from expression '"org.eclipse.mylyn.internal.compatibility.warn.disabled"' - Original project: 'org.eclipse.mylyn.compatibility' - Constant name: 'PREF_WARN_DISABLED' - Constant expression: '"org.eclipse.mylyn.internal.compatibility.warn.disabled"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'PREF_WARN_DISABLED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.compatibility{JavaRuntimeVersionChecker.java" name="PREF_WARN_DISABLED" qualify="false" replace="true" selection="1904 56" stamp="1182234194869" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.compatibility.JavaRuntimeVersionChecker.JRE_MIN_VERSION' from expression '1.5f' - Original project: 'org.eclipse.mylyn.compatibility' - Constant name: 'JRE_MIN_VERSION' - Constant expression: '1.5f' - Declared visibility: 'private'" description="Extract constant 'JRE_MIN_VERSION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.compatibility{JavaRuntimeVersionChecker.java" name="JRE_MIN_VERSION" qualify="false" replace="false" selection="2027 4" stamp="1182234697645" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.compatibility/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..9c0ba6c
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,5 @@
+1182232410676 Rename type 'JavaCompatibilityCheckActivator'
+1182232431260 Move compilation unit
+1182232435569 Delete element
+1182234194869 Extract constant 'PREF_WARN_DISABLED'
+1182234697645 Extract constant 'JRE_MIN_VERSION'
diff --git a/org.eclipse.mylyn.compatibility/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..a3a1b02
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,331 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.3
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=ignore
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=ignore
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.compatibility/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.compatibility/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..65babf3
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:56 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.compatibility/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..435c316
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:13:47 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.compatibility/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.compatibility/META-INF/MANIFEST.MF b/org.eclipse.mylyn.compatibility/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8ba735c
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.compatibility;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime
+Bundle-ClassPath: .
+Export-Package: org.eclipse.mylyn.internal.compatibility;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.3
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.compatibility/about.html b/org.eclipse.mylyn.compatibility/about.html
new file mode 100644
index 0000000..0dd939c
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 7, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.compatibility/build.properties b/org.eclipse.mylyn.compatibility/build.properties
new file mode 100644
index 0000000..7e8cb54
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.compatibility/plugin.properties b/org.eclipse.mylyn.compatibility/plugin.properties
new file mode 100644
index 0000000..d4804c3
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.compatibility
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Java 5 Compatibility Checker
diff --git a/org.eclipse.mylyn.compatibility/plugin.xml b/org.eclipse.mylyn.compatibility/plugin.xml
new file mode 100644
index 0000000..5743ded
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/plugin.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension
+ name="Java 5 Compatibility Checker"
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.compatibility.JavaRuntimeVersionChecker"></startup>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/JavaRuntimeVersionChecker.java b/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/JavaRuntimeVersionChecker.java
new file mode 100644
index 0000000..eb10668
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/JavaRuntimeVersionChecker.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.compatibility;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPersistentPreferenceStore;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+import org.eclipse.ui.statushandlers.StatusManager;
+
+/**
+ * Checks the JRE version and show a dialog if an incompatible version is found.
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class JavaRuntimeVersionChecker implements IStartup {
+
+ private static final String ID_PLUGIN = "org.eclipse.mylyn.compatibility"; //$NON-NLS-1$
+
+ private static final String PREF_WARN_DISABLED = "org.eclipse.mylyn.internal.compatibility.warn.disabled"; //$NON-NLS-1$
+
+ private static final float JRE_MIN_VERSION = 1.5f;
+
+ public void earlyStartup() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ String versionString = System.getProperty("java.runtime.version"); //$NON-NLS-1$
+ int minorMinorIndex = versionString.lastIndexOf('.');
+ if (minorMinorIndex != -1) {
+ String minorString = versionString.substring(0, minorMinorIndex);
+ Float versionFloat = new Float(minorString);
+ if (versionFloat.compareTo(new Float(JRE_MIN_VERSION)) < 0) {
+ IPersistentPreferenceStore preferenceStore = new ScopedPreferenceStore(new InstanceScope(),
+ ID_PLUGIN);
+ if (!preferenceStore.getBoolean(PREF_WARN_DISABLED)) {
+ MessageDialogWithToggle dialog = MessageDialogWithToggle.openWarning(
+ PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ Messages.JavaRuntimeVersionChecker_JDK_Version_Check,
+ Messages.JavaRuntimeVersionChecker_Mylyn_was_installed_but_requires_Java_5_or_later_to_run,
+ Messages.JavaRuntimeVersionChecker_Do_not_warn_again, false, preferenceStore,
+ PREF_WARN_DISABLED);
+ preferenceStore.setValue(PREF_WARN_DISABLED, dialog.getToggleState());
+ preferenceStore.save();
+ }
+ }
+ }
+ } catch (Throwable t) {
+ StatusManager.getManager().handle(
+ new Status(IStatus.INFO, ID_PLUGIN, "Could determine JRE version.", t), StatusManager.LOG); //$NON-NLS-1$
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/Messages.java b/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/Messages.java
new file mode 100644
index 0000000..d4c3246
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.compatibility;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.compatibility.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String JavaRuntimeVersionChecker_Do_not_warn_again;
+ public static String JavaRuntimeVersionChecker_JDK_Version_Check;
+ public static String JavaRuntimeVersionChecker_Mylyn_was_installed_but_requires_Java_5_or_later_to_run;
+}
diff --git a/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/messages.properties b/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/messages.properties
new file mode 100644
index 0000000..e22381b
--- /dev/null
+++ b/org.eclipse.mylyn.compatibility/src/org/eclipse/mylyn/internal/compatibility/messages.properties
@@ -0,0 +1,3 @@
+JavaRuntimeVersionChecker_Do_not_warn_again=Do not warn again
+JavaRuntimeVersionChecker_JDK_Version_Check=JDK Version Check
+JavaRuntimeVersionChecker_Mylyn_was_installed_but_requires_Java_5_or_later_to_run=Mylyn was installed but requires Java 5 or later to run. Please download and install the latest Java version and restart.
diff --git a/org.eclipse.mylyn.context-feature/.project b/org.eclipse.mylyn.context-feature/.project
new file mode 100644
index 0000000..229144d
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.context-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.context-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7b6172c
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:47 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.context-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.context-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..4c9ebcf
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:51 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.context-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..09d573c
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:08:39 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.context-feature/about.html b/org.eclipse.mylyn.context-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context-feature/build.properties b/org.eclipse.mylyn.context-feature/build.properties
new file mode 100644
index 0000000..dcaa2fa
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.context-feature/epl-v10.html b/org.eclipse.mylyn.context-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context-feature/feature.properties b/org.eclipse.mylyn.context-feature/feature.properties
new file mode 100644
index 0000000..7f0a384
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Task-Focused Interface (Recommended)
+description=Provides the Mylyn Task-Focused Interface.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.context-feature/feature.xml b/org.eclipse.mylyn.context-feature/feature.xml
new file mode 100644
index 0000000..4c8d014
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/feature.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.context_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.ui.navigator"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.compare"/>
+ <import feature="org.eclipse.mylyn_feature" version="3.2.1.qualifier" match="perfect"/>
+ <import plugin="org.eclipse.mylyn.context.ui" version="3.0.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.context.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.resources.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.context-feature/license.html b/org.eclipse.mylyn.context-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.context-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.context.core/.classpath b/org.eclipse.mylyn.context.core/.classpath
new file mode 100644
index 0000000..0d08413
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.context.core/.cvsignore b/org.eclipse.mylyn.context.core/.cvsignore
new file mode 100644
index 0000000..4a98758
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.fbwarnings
diff --git a/org.eclipse.mylyn.context.core/.project b/org.eclipse.mylyn.context.core/.project
new file mode 100644
index 0000000..df03d73
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.context.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..6d40386
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'OLD_CONTEXT_FILE_EXTENSION' in 'org.eclipse.mylar.internal.context.core.MylarContextManager' to 'CONTEXT_FILE_EXTENSION_OLD' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContextManager.OLD_CONTEXT_FILE_EXTENSION' - Renamed element: 'org.eclipse.mylar.internal.context.core.MylarContextManager.CONTEXT_FILE_EXTENSION_OLD' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'OLD_CONTEXT_FILE_EXTENSION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.core{MylarContextManager.java[MylarContextManager^OLD_CONTEXT_FILE_EXTENSION" name="CONTEXT_FILE_EXTENSION_OLD" references="true" setter="false" stamp="1163659751718" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..974ad85
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1 @@
+1163659751718 Rename field 'OLD_CONTEXT_FILE_EXTENSION'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..b15c8c5
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'xmlrpc-client-3.0b1.jar'" description="Delete element" element1="lib/xmlrpc-client-3.0b1.jar" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1164141532500" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'xmlrpc-common-3.0b1.jar'" description="Delete element" element1="lib/xmlrpc-common-3.0b1.jar" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1164141537046" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarStructureBridge' to 'AbstractStructureBridge' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarStructureBridge' - Renamed element: 'org.eclipse.mylar.context.core.AbstractStructureBridge' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarStructureBridge'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarStructureBridge.java[IMylarStructureBridge" matchStrategy="1" name="AbstractStructureBridge" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1164406850750" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.AbstractStructureBridge' to 'AbstractContextStructureBridge' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.AbstractStructureBridge' - Renamed element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractStructureBridge'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{AbstractStructureBridge.java[AbstractStructureBridge" matchStrategy="1" name="AbstractContextStructureBridge" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1164407022375" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getChildBridges()' to 'getChildContentTypes' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getChildBridges()' - Renamed element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getChildContentTypes()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getChildBridges'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{AbstractContextStructureBridge.java[AbstractContextStructureBridge~getChildBridges" name="getChildContentTypes" references="true" stamp="1164410648359" version="1.0"/>
+<refactoring comment="Rename field 'childContentTypes' in 'org.eclipse.mylar.context.core.ContextCorePlugin' to 'childContentTypeMap' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.ContextCorePlugin.childContentTypes' - Renamed element: 'org.eclipse.mylar.context.core.ContextCorePlugin.childContentTypeMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'childContentTypes'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.context.core{ContextCorePlugin.java[ContextCorePlugin^childContentTypes" name="childContentTypeMap" references="true" setter="false" stamp="1164411016812" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.adaptParent(...)' to 'getAdapteParent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.adaptParent(...)' - Renamed element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getAdapteParent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'adaptParent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{AbstractContextStructureBridge.java[AbstractContextStructureBridge~adaptParent~QObject;" name="getAdapteParent" references="true" stamp="1164411884078" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getAdapteParent(...)' to 'getAdaptedParent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getAdapteParent(...)' - Renamed element: 'org.eclipse.mylar.context.core.AbstractContextStructureBridge.getAdaptedParent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getAdapteParent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{AbstractContextStructureBridge.java[AbstractContextStructureBridge~getAdapteParent~QObject;" name="getAdaptedParent" references="true" stamp="1164411889500" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..a026f8c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1,8 @@
+1164141532500 Delete element
+1164141537046 Delete element
+1164406850750 Rename type 'IMylarStructureBridge'
+1164407022375 Rename type 'AbstractStructureBridge'
+1164410648359 Rename method 'getChildBridges'
+1164411016812 Rename field 'childContentTypes'
+1164411884078 Rename method 'adaptParent'
+1164411889500 Rename method 'getAdapteParent'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..e991327
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'lib' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'lib' - Original element: 'commons-httpclient-3.0.1.jar'" description="Copy file" destination="lib" element1="commons-httpclient-3.0.1/commons-httpclient-3.0.1.jar" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="commons-httpclient-3.0.1/commons-httpclient-3.0.1.jar	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1164829600625" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'commons-httpclient-3.0.1'" description="Delete element" element1="commons-httpclient-3.0.1" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1164829604937" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'commons-httpclient-3.0.jar'" description="Delete element" element1="lib/commons-httpclient-3.0.jar" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1164845319102" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..3ad1b2d
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1,3 @@
+1164829600625 Copy file
+1164829604937 Delete element
+1164845319102 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/12/48/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/12/48/refactorings.history
new file mode 100644
index 0000000..ae184ca
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/12/48/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'lib' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'lib' - Original element: 'commons-httpclient-3.0.jar'" description="Move file" destination="lib" element1="lib/commons-httpclient-3.0/commons-httpclient-3.0.jar" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165000289296" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'commons-httpclient-3.0'" description="Delete element" element1="lib/commons-httpclient-3.0" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1165000294109" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'commons-httpclient-3.0.1.jar'" description="Delete element" element1="lib/commons-httpclient-3.0.1.jar" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1165000440640" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/12/48/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/12/48/refactorings.index
new file mode 100644
index 0000000..4ab2fc9
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/12/48/refactorings.index
@@ -0,0 +1,3 @@
+1165000289296 Move file
+1165000294109 Delete element
+1165000440640 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..1254ad1
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.IMylarContextListener.nodeDeleted(...)' to 'elementDeleted' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarContextListener.nodeDeleted(...)' - Renamed element: 'org.eclipse.mylar.context.core.IMylarContextListener.elementDeleted(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'nodeDeleted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{IMylarContextListener.java[IMylarContextListener~nodeDeleted~QIMylarElement;" name="elementDeleted" references="true" stamp="1165438452843" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.IMylarContextListener.edgesChanged(...)' to 'relationsChanged' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarContextListener.edgesChanged(...)' - Renamed element: 'org.eclipse.mylar.context.core.IMylarContextListener.relationsChanged(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'edgesChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{IMylarContextListener.java[IMylarContextListener~edgesChanged~QIMylarElement;" name="relationsChanged" references="true" stamp="1165438493031" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'lib' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'lib' - Original element: 'commons-httpclient-3.0.1.jar'" description="Move file" destination="lib" element1="lib/commons-httpclient-3.0.1/commons-httpclient-3.0.1.jar" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165454720080" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'commons-httpclient-3.0.1'" description="Delete element" element1="lib/commons-httpclient-3.0.1" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1165454724345" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'commons-httpclient-3.0.jar'" description="Delete element" element1="lib/commons-httpclient-3.0.jar" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1165455047033" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..cbe3046
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,5 @@
+1165438452843 Rename method 'nodeDeleted'
+1165438493031 Rename method 'edgesChanged'
+1165454720080 Move file
+1165454724345 Delete element
+1165455047033 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..c91ab35
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename package 'org.eclipse.mylar.core' to 'org.eclipse.mylar.provisional.core'" flags="65542" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.core" name="org.eclipse.mylar.provisional.core" project="org.eclipse.mylar.core" qualified="false" references="true" stamp="1140464685357" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..c321166
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1 @@
+1140464685357 Rename package 'org.eclipse.mylar.core' to 'org.eclipse.mylar.provisional.core'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..d08f536
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.activityHistory' to 'activityHistoryMetaContext'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^activityHistory" name="activityHistoryMetaContext" project="org.eclipse.mylar.core" references="true" setter="false" stamp="1141348679497" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.getActivityHistory()' to 'getActivityHistoryMetaContext'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~getActivityHistory" name="getActivityHistoryMetaContext" project="org.eclipse.mylar.core" references="true" stamp="1141349070860"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.activityHistoryMetaContext' to 'activityMetaContext'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^activityHistoryMetaContext" name="activityMetaContext" project="org.eclipse.mylar.core" references="true" setter="false" stamp="1141350881133" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..5930812
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1,3 @@
+1141348679497 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.activityHistory' to 'activityHistoryMetaContext'
+1141349070860 Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.getActivityHistory()' to 'getActivityHistoryMetaContext'
+1141350881133 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.activityHistoryMetaContext' to 'activityMetaContext'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..defc0f3
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comments="false" description="Extract method 'private void ensureIsInteresting(InteractionEvent event,IMylarElement previous,float previousInterest)' from 'org.eclipse.mylar.internal.core.MylarContextManager.internalHandleInteractionEvent()' to 'org.eclipse.mylar.internal.core.MylarContextManager'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/internal/core/MylarContextManager.java" name="ensureIsInteresting" replace="false" selection="11571 367" stamp="1144349097441" version="1.0" visibility="2"/>
+<refactoring comments="false" description="Extract method 'private float ensureIsInteresting(InteractionEvent event,IMylarElement previous,float previousInterest,float decayOffset)' from 'org.eclipse.mylar.internal.core.MylarContextManager.internalHandleInteractionEvent()' to 'org.eclipse.mylar.internal.core.MylarContextManager'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/internal/core/MylarContextManager.java" name="ensureIsInteresting" replace="false" selection="11612 321" stamp="1144350345916" version="1.0" visibility="2"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_DEACTIVATED' to 'ACTIVITY_DELTA_DEACTIVATED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^ACTIVITY_DEACTIVATED" name="ACTIVITY_DELTA_DEACTIVATED" references="true" setter="false" stamp="1144433799169" textual="false" version="1.0"/>
+
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_ACTIVATED' to 'ACTIVITY_DELTA_ACTIVATED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^ACTIVITY_ACTIVATED" name="ACTIVITY_DELTA_ACTIVATED" references="true" setter="false" stamp="1144436579587" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_ID' to 'ACTIVITY_ORIGIN_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^ACTIVITY_ID" name="ACTIVITY_ORIGIN_ID" references="true" setter="false" stamp="1144436658981" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_HANDLE' to 'ACTIVITY_HANDLE_ATTENTION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^ACTIVITY_HANDLE" name="ACTIVITY_HANDLE_ATTENTION" references="true" setter="false" stamp="1144436676736" textual="false" version="1.0"/>
+<refactoring description="Convert anonymous class 'org.eclipse.mylar.internal.core.MylarContextManager.new ShellListener() {...}' in '' to nested class" final="true" flags="2" id="org.eclipse.jdt.ui.convert.anonymous" input="unit://src/org/eclipse/mylar/internal/core/MylarContextManager.java" name="ShellLifecycleListener" selection="4712 0" stamp="1144437084963" static="false" version="1.0" visibility="2"/>
+<refactoring description="Move type 'org.eclipse.mylar.internal.core.MylarContextManager.ShellLifecycleListener' in 'org.eclipse.mylar.internal.core.MylarContextManager' to new file" field="true" fieldName="manager" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager[ShellLifecycleListener" mandatory="true" parameterName="manager" possible="true" stamp="1144440455570" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.INACTIVITY_TIMEOUT_MILLIS' to 'TIMEOUT_INACTIVITY_MILLIS'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^INACTIVITY_TIMEOUT_MILLIS" name="TIMEOUT_INACTIVITY_MILLIS" references="true" setter="false" stamp="1144441959402" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_KIND' to 'ACTIVITY_STRUCTURE_KIND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager^ACTIVITY_KIND" name="ACTIVITY_STRUCTURE_KIND" references="true" setter="false" stamp="1144442079575" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.core.MylarContextManager' to 'MylarContextManagerr'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager" matchStrategy="1" name="MylarContextManagerr" qualified="false" references="true" similarDeclarations="true" stamp="1144442095238" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.core.MylarContextManagerr' to 'MylarContextManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManagerr.java[MylarContextManagerr" matchStrategy="1" name="MylarContextManager" qualified="false" references="true" similarDeclarations="true" stamp="1144442112933" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextDeleted(...)' to 'deleteContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~contextDeleted~QString;" name="deleteContext" references="true" stamp="1144447965298" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextActivated(...)' to 'activateContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~contextActivated~QString;" name="activateContext" references="true" stamp="1144448013528" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextActivated(...)' to 'activateContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~contextActivated~QMylarContext;" name="activateContext" references="true" stamp="1144448036711" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextDeactivated(...)' to 'deactivateContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.core/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~contextDeactivated~QString;" name="deactivateContext" references="true" stamp="1144448049830" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..5ac6194
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1,16 @@
+1144349097441 Extract method 'private void ensureIsInteresting(InteractionEvent event,IMylarElement previous,float previousInterest)' from 'org.eclipse.mylar.internal.core.MylarContextManager.internalHandleInteractionEvent()' to 'org.eclipse.mylar.internal.core.MylarContextManager'
+1144448049830 Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextDeactivated(...)' to 'deactivateContext'
+1144448036711 Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextActivated(...)' to 'activateContext'
+1144448013528 Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextActivated(...)' to 'activateContext'
+1144447965298 Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.contextDeleted(...)' to 'deleteContext'
+1144442112933 Rename type 'org.eclipse.mylar.internal.core.MylarContextManagerr' to 'MylarContextManager'
+1144442095238 Rename type 'org.eclipse.mylar.internal.core.MylarContextManager' to 'MylarContextManagerr'
+1144442079575 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_KIND' to 'ACTIVITY_STRUCTURE_KIND'
+1144441959402 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.INACTIVITY_TIMEOUT_MILLIS' to 'TIMEOUT_INACTIVITY_MILLIS'
+1144440455570 Move type 'org.eclipse.mylar.internal.core.MylarContextManager.ShellLifecycleListener' in 'org.eclipse.mylar.internal.core.MylarContextManager' to new file
+1144437084963 Convert anonymous class 'org.eclipse.mylar.internal.core.MylarContextManager.new ShellListener() {...}' in '' to nested class
+1144436676736 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_HANDLE' to 'ACTIVITY_HANDLE_ATTENTION'
+1144436658981 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_ID' to 'ACTIVITY_ORIGIN_ID'
+1144436579587 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_ACTIVATED' to 'ACTIVITY_DELTA_ACTIVATED'
+1144433799169 Rename field 'org.eclipse.mylar.internal.core.MylarContextManager.ACTIVITY_DEACTIVATED' to 'ACTIVITY_DELTA_DEACTIVATED'
+1144350345916 Extract method 'private float ensureIsInteresting(InteractionEvent event,IMylarElement previous,float previousInterest,float decayOffset)' from 'org.eclipse.mylar.internal.core.MylarContextManager.internalHandleInteractionEvent()' to 'org.eclipse.mylar.internal.core.MylarContextManager'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/4/16/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/4/16/refactorings.history
new file mode 100644
index 0000000..889bc65
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.manipulateInterestForNode(...)' to 'manipulateInterestForElement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~manipulateInterestForNode~QIMylarElement;~Z~Z~QString;" name="manipulateInterestForElement" references="true" stamp="1145732023684" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/4/16/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/4/16/refactorings.index
new file mode 100644
index 0000000..e5bd914
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/4/16/refactorings.index
@@ -0,0 +1 @@
+1145732023684 Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.manipulateInterestForNode(...)' to 'manipulateInterestForElement'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/5/21/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/5/21/refactorings.history
new file mode 100644
index 0000000..998d8bf
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/5/21/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'private void org.eclipse.mylar.internal.core.MylarContextManager.notifyInterestDelta(Set<IMylarElement> interestDelta)' to 'private void notifyInterestDelta(Set<IMylarElement> interestDelta)' - Changed parameters: List<IMylarElement> interestDelta" delegate="false" deprecate="true" description="Change method 'notifyInterestDelta'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~notifyInterestDelta~QList\<QIMylarElement;>;" name="notifyInterestDelta" parameter1="List<IMylarElement> interestDelta 0 Set<IMylarElement> interestDelta false" stamp="1148442584784" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.provisional.core.IMylarContextListener.interestChanged(Set<IMylarElement> elements)' to 'public void interestChanged(Set<IMylarElement> elements)' - Changed parameters: List<IMylarElement> elements" delegate="false" deprecate="true" description="Change method 'interestChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.provisional.core{IMylarContextListener.java[IMylarContextListener~interestChanged~QList\<QIMylarElement;>;" name="interestChanged" parameter1="List<IMylarElement> elements 0 Set<IMylarElement> elements false" stamp="1148442624982" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.provisional.core.IMylarContextListener.interestChanged(List<IMylarElement> elements)' to 'public void interestChanged(List<IMylarElement> elements)' - Changed parameters: Set<IMylarElement> elements" delegate="false" deprecate="true" description="Change method 'interestChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.provisional.core{IMylarContextListener.java[IMylarContextListener~interestChanged~QSet\<QIMylarElement;>;" name="interestChanged" parameter1="Set<IMylarElement> elements 0 List<IMylarElement> elements false" stamp="1148442685038" version="1.0"/>
+<refactoring comment="Change method 'private void org.eclipse.mylar.internal.core.MylarContextManager.notifyInterestDelta(List<IMylarElement> interestDelta)' to 'private void notifyInterestDelta(List<IMylarElement> interestDelta)' - Changed parameters: Set<IMylarElement> interestDelta" delegate="false" deprecate="true" description="Change method 'notifyInterestDelta'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~notifyInterestDelta~QSet\<QIMylarElement;>;" name="notifyInterestDelta" parameter1="Set<IMylarElement> interestDelta 0 List<IMylarElement> interestDelta false" stamp="1148442729472" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/5/21/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/5/21/refactorings.index
new file mode 100644
index 0000000..34da270
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/5/21/refactorings.index
@@ -0,0 +1,4 @@
+1148442584784 Change method 'notifyInterestDelta'
+1148442729472 Change method 'notifyInterestDelta'
+1148442685038 Change method 'interestChanged'
+1148442624982 Change method 'interestChanged'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/6/23/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/6/23/refactorings.history
new file mode 100644
index 0000000..e952d54
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/6/23/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.core.InteractionEvent.getContentType()' to 'getStructureKind' - Original element: 'org.eclipse.mylar.provisional.core.InteractionEvent.getContentType()' - Renamed element: 'org.eclipse.mylar.provisional.core.InteractionEvent.getStructureKind()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getContentType'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.core{InteractionEvent.java[InteractionEvent~getContentType" name="getStructureKind" references="true" stamp="1149463910789" version="1.0"/>
+<refactoring comment="Rename field 'nodes' in 'org.eclipse.mylar.internal.core.MylarContext' to 'elementMap' - Original element: 'org.eclipse.mylar.internal.core.MylarContext.nodes' - Renamed element: 'org.eclipse.mylar.internal.core.MylarContext.elementMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'nodes'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.core{MylarContext.java[MylarContext^nodes" name="elementMap" references="true" setter="false" stamp="1149642998335" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'landmarks' in 'org.eclipse.mylar.internal.core.MylarContext' to 'landmarkMap' - Original element: 'org.eclipse.mylar.internal.core.MylarContext.landmarks' - Renamed element: 'org.eclipse.mylar.internal.core.MylarContext.landmarkMap' - Update references to refactored element - Update textual occurrences in comments and strings - Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'landmarks'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.core{MylarContext.java[MylarContext^landmarks" name="landmarkMap" references="true" setter="false" stamp="1149643056479" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/6/23/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/6/23/refactorings.index
new file mode 100644
index 0000000..660b3a8
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/6/23/refactorings.index
@@ -0,0 +1,3 @@
+1149463910789 Rename method 'getContentType'
+1149643056479 Rename field 'landmarks'
+1149642998335 Rename field 'nodes'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/6/26/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/6/26/refactorings.history
new file mode 100644
index 0000000..8af04d3
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'public void loadActivityMetaContext()' from 'org.eclipse.mylar.internal.core.MylarContextManager.MylarContextManager()' to 'org.eclipse.mylar.internal.core.MylarContextManager' - Method name: 'loadActivityMetaContext' - Destination type: 'org.eclipse.mylar.internal.core.MylarContextManager' - Declared visibility: 'public'" comments="false" description="Extract method 'loadActivityMetaContext'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.core{MylarContextManager.java" name="loadActivityMetaContext" replace="false" selection="7060 333" stamp="1151514689546" version="1.0" visibility="1"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/6/26/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/6/26/refactorings.index
new file mode 100644
index 0000000..8dfdb86
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/6/26/refactorings.index
@@ -0,0 +1 @@
+1151514689546 Extract method 'loadActivityMetaContext'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..f5aa876
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.core.MylarContextExternalizer.writeContextToXML(...)' to 'writeContextToXml' - Original element: 'org.eclipse.mylar.internal.core.MylarContextExternalizer.writeContextToXML(...)' - Renamed element: 'org.eclipse.mylar.internal.core.MylarContextExternalizer.writeContextToXml(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'writeContextToXML'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.core{MylarContextExternalizer.java[MylarContextExternalizer~writeContextToXML~QMylarContext;~QFile;" name="writeContextToXml" references="true" stamp="1152054519328" version="1.0"/>
+<refactoring comment="Extract method 'private AttributesImpl setEventAttributes(InteractionEvent ie)' from 'org.eclipse.mylar.internal.core.util.SaxContextWriter.SaxWriter.parse()' to 'org.eclipse.mylar.internal.core.util.SaxContextWriter.SaxWriter' - Method name: 'setEventAttributes' - Destination type: 'org.eclipse.mylar.internal.core.util.SaxContextWriter.SaxWriter' - Declared visibility: 'private'" comments="false" description="Extract method 'setEventAttributes'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.core.util{SaxContextWriter.java" name="setEventAttributes" replace="false" selection="4979 1750" stamp="1152055194734" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private InteractionEvent createEventFromAttributes(Attributes attributes) throws ParseException ' from 'org.eclipse.mylar.internal.core.util.SaxContextContentHandler.startElement()' to 'org.eclipse.mylar.internal.core.util.SaxContextContentHandler' - Method name: 'createEventFromAttributes' - Destination type: 'org.eclipse.mylar.internal.core.util.SaxContextContentHandler' - Declared visibility: 'private'" comments="false" description="Extract method 'createEventFromAttributes'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.core.util{SaxContextContentHandler.java" name="createEventFromAttributes" replace="false" selection="2180 1375" stamp="1152055655953" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.core.util.SaxContextWriter.setEventAttributes(...)' to 'createEventAttributes' - Original element: 'org.eclipse.mylar.internal.core.util.SaxContextWriter.setEventAttributes(...)' - Renamed element: 'org.eclipse.mylar.internal.core.util.SaxContextWriter.createEventAttributes(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setEventAttributes'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.core.util{SaxContextWriter.java[SaxContextWriter~setEventAttributes~QInteractionEvent;" name="createEventAttributes" references="true" stamp="1152055773328" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..a2d7b7b
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1,4 @@
+1152054519328 Rename method 'writeContextToXML'
+1152055773328 Rename method 'setEventAttributes'
+1152055655953 Extract method 'createEventFromAttributes'
+1152055194734 Extract method 'setEventAttributes'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..84b3d8c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.core.MylarContextManager.transferContext(...)' to 'transferContextAndActivate' - Original element: 'org.eclipse.mylar.internal.core.MylarContextManager.transferContext(...)' - Renamed element: 'org.eclipse.mylar.internal.core.MylarContextManager.transferContextAndActivate(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'transferContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.core{MylarContextManager.java[MylarContextManager~transferContext~QString;~QFile;~Z" name="transferContextAndActivate" references="true" stamp="1152658334937" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.core.search.MylarWorkingSetUpdater' to 'MylarWorkingSetManager' - Original element: 'org.eclipse.mylar.internal.core.search.MylarWorkingSetUpdater' - Renamed element: 'org.eclipse.mylar.internal.core.search.MylarWorkingSetManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarWorkingSetUpdater'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.core.search{MylarWorkingSetUpdater.java[MylarWorkingSetUpdater" matchStrategy="1" name="MylarWorkingSetManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152748552375" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.provisional.core' to 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.core/src/org.eclipse.mylar.provisional.core' - Renamed element: 'org.eclipse.mylar.core/src/org.eclipse.mylar.context.core' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.provisional.core'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.provisional.core" name="org.eclipse.mylar.context.core" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152773537171" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.core' to 'org.eclipse.mylar.internal.context.core' - Original element: 'org.eclipse.mylar.core/src/org.eclipse.mylar.internal.core' - Renamed element: 'org.eclipse.mylar.core/src/org.eclipse.mylar.internal.context.core' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.core'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.core" name="org.eclipse.mylar.internal.context.core" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152773664687" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.MylarStatusHandler.setDumpErrors(...)' to 'setDumpErrorsForTesting' - Original element: 'org.eclipse.mylar.context.core.MylarStatusHandler.setDumpErrors(...)' - Renamed element: 'org.eclipse.mylar.context.core.MylarStatusHandler.setDumpErrorsForTesting(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setDumpErrors'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{MylarStatusHandler.java[MylarStatusHandler~setDumpErrors~Z" name="setDumpErrorsForTesting" references="true" stamp="1152775563187" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarContextStore' to 'AbstractContextStore' - Original element: 'org.eclipse.mylar.context.core.IMylarContextStore' - Renamed element: 'org.eclipse.mylar.context.core.AbstractContextStore' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'IMylarContextStore'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarContextStore.java[IMylarContextStore" matchStrategy="1" name="AbstractContextStore" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152830998593" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.AbstractStatusNotifier' to 'IStatusNotifier' - Original element: 'org.eclipse.mylar.context.core.AbstractStatusNotifier' - Renamed element: 'org.eclipse.mylar.context.core.IStatusNotifier' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractStatusNotifier'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{AbstractStatusNotifier.java[AbstractStatusNotifier" matchStrategy="1" name="IStatusNotifier" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152835774359" textual="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.context.core/schema/context.exsd' to 'bridges.exsd' - Original element: 'context.exsd'" description="Rename resource 'context.exsd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="schema/context.exsd" name="bridges.exsd" stamp="1152841105921" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..c0b880d
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,8 @@
+1152658334937 Rename method 'transferContext'
+1152841105921 Rename resource 'context.exsd'
+1152835774359 Rename type 'AbstractStatusNotifier'
+1152830998593 Rename type 'IMylarContextStore'
+1152775563187 Rename method 'setDumpErrors'
+1152773664687 Rename package 'org.eclipse.mylar.internal.core'
+1152773537171 Rename package 'org.eclipse.mylar.provisional.core'
+1152748552375 Rename type 'MylarWorkingSetUpdater'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..1b1e2e7
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.ContextCorePlugin.CoreExtensionPointReader' to 'BridgesExtensionPointReader' - Original element: 'org.eclipse.mylar.context.core.ContextCorePlugin.CoreExtensionPointReader' - Renamed element: 'org.eclipse.mylar.context.core.ContextCorePlugin.BridgesExtensionPointReader' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'CoreExtensionPointReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{ContextCorePlugin.java[ContextCorePlugin[CoreExtensionPointReader" matchStrategy="1" name="BridgesExtensionPointReader" qualified="false" references="true" similarDeclarations="true" stamp="1153098779640" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IStatusNotifier' to 'IStatusHandler' - Original element: 'org.eclipse.mylar.context.core.IStatusNotifier' - Renamed element: 'org.eclipse.mylar.context.core.IStatusHandler' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'IStatusNotifier'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IStatusNotifier.java[IStatusNotifier" matchStrategy="1" name="IStatusHandler" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153113033593" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..2ceb4a7
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,2 @@
+1153098779640 Rename type 'CoreExtensionPointReader'
+1153113033593 Rename type 'IStatusNotifier'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..a483f0f
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.IInteractionEventListener.startObserving()' to 'startMonitoring' - Original element: 'org.eclipse.mylar.context.core.IInteractionEventListener.startObserving()' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionEventListener.startMonitoring()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'startObserving'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{IInteractionEventListener.java[IInteractionEventListener~startObserving" name="startMonitoring" references="true" stamp="1154625040429" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.IInteractionEventListener.stopObserving()' to 'stopMonitoring' - Original element: 'org.eclipse.mylar.context.core.IInteractionEventListener.stopObserving()' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionEventListener.stopMonitoring()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'stopObserving'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{IInteractionEventListener.java[IInteractionEventListener~stopObserving" name="stopMonitoring" references="true" stamp="1154625056070" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..fde1597
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1,2 @@
+1154625040429 Rename method 'startObserving'
+1154625056070 Rename method 'stopObserving'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..4b0afc3
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.IStatusHandler.notify(...)' to 'fail' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IStatusHandler.notify(...)' - Renamed element: 'org.eclipse.mylar.context.core.IStatusHandler.fail(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notify'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{IStatusHandler.java[IStatusHandler~notify~QIStatus;~Z" name="fail" references="true" stamp="1168886363000" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..c18ab28
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1 @@
+1168886363000 Rename method 'notify'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..ed53816
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.context.core.AbstractContextStore.notifyContextStoreMoved()' to 'contextStoreMoved' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.AbstractContextStore.notifyContextStoreMoved()' - Renamed element: 'org.eclipse.mylar.context.core.AbstractContextStore.contextStoreMoved()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifyContextStoreMoved'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.core{AbstractContextStore.java[AbstractContextStore~notifyContextStoreMoved" name="contextStoreMoved" references="true" stamp="1169830343036" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..abf2215
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1 @@
+1169830343036 Rename method 'notifyContextStoreMoved'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/10/42/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/10/42/refactorings.history
new file mode 100644
index 0000000..07a409c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/10/42/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'userLandmark' in 'org.eclipse.mylyn.internal.context.core.ScalingFactors' to 'landmarkForced'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ScalingFactors.userLandmark'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ScalingFactors.landmarkForced'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'userLandmark'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{ScalingFactors.java[ScalingFactors^userLandmark" name="landmarkForced" references="true" setter="true" stamp="1192581354560" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.core.ScalingFactors' to 'ContextParameters'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ScalingFactors'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ContextParameters'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ScalingFactors'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.core{ScalingFactors.java[ScalingFactors" matchStrategy="1" name="ContextParameters" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1192585731495" textual="false" version="1.0"/>

<refactoring comment="Rename field 'factors' in 'org.eclipse.mylyn.internal.context.core.ContextParameters' to 'scalingFactors'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextParameters.factors'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ContextParameters.scalingFactors'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'factors'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{ContextParameters.java[ContextParameters^factors" name="scalingFactors" references="true" setter="false" stamp="1192585894538" textual="false" version="1.0"/>
<refactoring comment="Rename field 'scalingFactors' in 'org.eclipse.mylyn.internal.context.core.ContextParameters' to 'interactionScalingFactors'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextParameters.scalingFactors'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ContextParameters.interactionScalingFactors'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'scalingFactors'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{ContextParameters.java[ContextParameters^scalingFactors" name="interactionScalingFactors" references="true" setter="true" stamp="1192586580301" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.core.ScalingFactor' to 'InteractionScalingFactor'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ScalingFactor'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionScalingFactor'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ScalingFactor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.core{ScalingFactor.java[ScalingFactor" matchStrategy="1" name="InteractionScalingFactor" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1192586592763" textual="false" version="1.0"/>


<refactoring comment="Rename field 'scaling' in 'org.eclipse.mylyn.internal.context.core.DegreeOfInterest' to 'contextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.DegreeOfInterest.scaling'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.DegreeOfInterest.contextScaling'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'scaling'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{DegreeOfInterest.java[DegreeOfInterest^scaling" name="contextScaling" references="true" setter="true" stamp="1192586839865" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.core.ContextParameters' to 'InteactionContextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextParameters'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteactionContextScaling'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ContextParameters'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.core{ContextParameters.java[ContextParameters" matchStrategy="1" name="InteactionContextScaling" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1192586855139" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.core.InteractionScalingFactor' to 'InteractionEventScalingFactor'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionScalingFactor'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionEventScalingFactor'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'InteractionScalingFactor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.core{InteractionScalingFactor.java[InteractionScalingFactor" matchStrategy="1" name="InteractionEventScalingFactor" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1192586875211" textual="false" version="1.0"/>
<refactoring comment="Rename field 'scaling' in 'org.eclipse.mylyn.internal.context.core.CompositeDegreeOfInterest' to 'contextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.CompositeDegreeOfInterest.scaling'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.CompositeDegreeOfInterest.contextScaling'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'scaling'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{CompositeDegreeOfInterest.java[CompositeDegreeOfInterest^scaling" name="contextScaling" references="true" setter="true" stamp="1192586891884" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.core.InteactionContextScaling' to 'InteractionContextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteactionContextScaling'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'InteactionContextScaling'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.core{InteactionContextScaling.java[InteactionContextScaling" matchStrategy="1" name="InteractionContextScaling" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1192587026470" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getScalingFactors()' to 'getDefaultScalingFactors'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getScalingFactors()'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getDefaultScalingFactors()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getScalingFactors'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getScalingFactors" name="getDefaultScalingFactors" references="true" stamp="1192588587144" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getDefaultScalingFactors()' to 'getCommonScalingFactors'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getDefaultScalingFactors()'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getCommonScalingFactors()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDefaultScalingFactors'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getDefaultScalingFactors" name="getCommonScalingFactors" references="true" stamp="1192588641644" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getCommonScalingFactors()' to 'getCommonContextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getCommonScalingFactors()'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getCommonContextScaling()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCommonScalingFactors'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getCommonScalingFactors" name="getCommonContextScaling" references="true" stamp="1192588663105" version="1.0"/>
<refactoring comment="Rename field 'scalingFactors' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'contextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.scalingFactors'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.contextScaling'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'scalingFactors'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^scalingFactors" name="contextScaling" references="true" setter="true" stamp="1192588673295" textual="false" version="1.0"/>
<refactoring comment="Rename field 'landmarkForced' in 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling' to 'forcedLandmark'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.landmarkForced'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.forcedLandmark'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'landmarkForced'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling^landmarkForced" name="forcedLandmark" references="true" setter="true" stamp="1192588773877" textual="false" version="1.0"/>
<refactoring comment="Rename field 'DEFAULT_DECAY' in 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling' to 'DEFAULT_EVENT_DECAY'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.DEFAULT_DECAY'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.DEFAULT_EVENT_DECAY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'DEFAULT_DECAY'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling^DEFAULT_DECAY" name="DEFAULT_EVENT_DECAY" references="true" setter="true" stamp="1192589725238" textual="false" version="1.0"/>
<refactoring comment="Rename field 'DEFAULT_EDIT' in 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling' to 'DEFAULT_EVENT_EDIT'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.DEFAULT_EDIT'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.DEFAULT_EVENT_EDIT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'DEFAULT_EDIT'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling^DEFAULT_EDIT" name="DEFAULT_EVENT_EDIT" references="true" setter="true" stamp="1192589732895" textual="false" version="1.0"/>
<refactoring comment="Rename field 'scalingFactors' in 'org.eclipse.mylyn.internal.context.core.InteractionContext' to 'contextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContext.scalingFactors'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContext.contextScaling'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'scalingFactors'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContext.java[InteractionContext^scalingFactors" name="contextScaling" references="true" setter="true" stamp="1192643394607" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'scalingFactors' in 'org.eclipse.mylyn.internal.context.core.InteractionContext.setContextScaling(...)' to 'contextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContext.setContextScaling(InteractionContextScaling).scalingFactors'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContext.setContextScaling(InteractionContextScaling).contextScaling'
- Update references to refactored element" description="Rename local variable 'scalingFactors'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContext.java[InteractionContext~setContextScaling~QInteractionContextScaling;@scalingFactors!8868!8907!8894!8907!QInteractionContextScaling;" name="contextScaling" references="true" stamp="1192643404514" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IInteractionContext.getContextScaling()' to 'getScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContext.getContextScaling()'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContext.getScaling()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getContextScaling'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IInteractionContext.java[IInteractionContext~getContextScaling" name="getScaling" references="true" stamp="1192646019089" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContext.setContextScaling(...)' to 'setScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContext.setContextScaling(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContext.setScaling(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setContextScaling'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContext.java[InteractionContext~setContextScaling~QInteractionContextScaling;" name="setScaling" references="true" stamp="1192730491230" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionEventScalingFactor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionEventScalingFactor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1192730866247" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'DEFAULT_EVENT_DECAY' in 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling' to 'DEFAULT_DECAY'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.DEFAULT_EVENT_DECAY'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling.DEFAULT_DECAY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'DEFAULT_EVENT_DECAY'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling^DEFAULT_EVENT_DECAY" name="DEFAULT_DECAY" references="true" setter="true" stamp="1192731024319" textual="false" version="1.0"/>
<refactoring comment="Rename field 'contextScaling' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'commonContextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.contextScaling'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.commonContextScaling'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'contextScaling'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^contextScaling" name="commonContextScaling" references="true" setter="true" stamp="1192740953984" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/10/42/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/10/42/refactorings.index
new file mode 100644
index 0000000..f74d99c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/10/42/refactorings.index
@@ -0,0 +1,24 @@
+1192581354560 Rename field 'userLandmark'
+1192585731495 Rename type 'ScalingFactors'
+1192585894538 Rename field 'factors'
+1192586580301 Rename field 'scalingFactors'
+1192586592763 Rename type 'ScalingFactor'
+1192586839865 Rename field 'scaling'
+1192586855139 Rename type 'ContextParameters'
+1192586875211 Rename type 'InteractionScalingFactor'
+1192586891884 Rename field 'scaling'
+1192587026470 Rename type 'InteactionContextScaling'
+1192588587144 Rename method 'getScalingFactors'
+1192588641644 Rename method 'getDefaultScalingFactors'
+1192588663105 Rename method 'getCommonScalingFactors'
+1192588673295 Rename field 'scalingFactors'
+1192588773877 Rename field 'landmarkForced'
+1192589725238 Rename field 'DEFAULT_DECAY'
+1192589732895 Rename field 'DEFAULT_EDIT'
+1192643394607 Rename field 'scalingFactors'
+1192643404514 Rename local variable 'scalingFactors'
+1192646019089 Rename method 'getContextScaling'
+1192730491230 Rename method 'setContextScaling'
+1192730866247 Delete element
+1192731024319 Rename field 'DEFAULT_EVENT_DECAY'
+1192740953984 Rename field 'contextScaling'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/10/43/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/10/43/refactorings.history
new file mode 100644
index 0000000..6f6c80c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/10/43/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'public IInteractionElement org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(Object object, Kind eventKind, String origin, IInteractionContext context)' to 'public IInteractionElement processInteractionEvent(Object object, Kind eventKind, String origin, IInteractionContext context)'
- Original project: 'org.eclipse.mylyn.context.core'" delegate="false" deprecate="true" description="Change method 'processInteractionEvent'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QKind;~QObject;~QIInteractionContext;~QString;" name="processInteractionEvent" parameter1="Object object 1 Object object false" parameter2="Kind eventKind 0 Kind eventKind false" parameter3="String origin 3 String origin false" parameter4="IInteractionContext context 2 IInteractionContext context false" stamp="1193265604096" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/10/43/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/10/43/refactorings.index
new file mode 100644
index 0000000..e353226
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/10/43/refactorings.index
@@ -0,0 +1 @@
+1193265604096 Change method 'processInteractionEvent'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/10/44/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/10/44/refactorings.history
new file mode 100644
index 0000000..4822a28
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/10/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.activateContext(...)' to 'internalActivateContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.activateContext(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.internalActivateContext(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'activateContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~activateContext~QInteractionContext;" name="internalActivateContext" references="true" stamp="1193871917065" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/10/44/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/10/44/refactorings.index
new file mode 100644
index 0000000..3e887d4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/10/44/refactorings.index
@@ -0,0 +1 @@
+1193871917065 Rename method 'activateContext'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/11/45/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/11/45/refactorings.history
new file mode 100644
index 0000000..a9515b5
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/11/45/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'increment' from expression 'interactionContext.getScaling().getInteresting()'
- Original project: 'org.eclipse.mylyn.context.core'
- Variable name: 'increment'
- Destination method: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.propegateInterestToParents()'
- Variable expression: 'interactionContext.getScaling().getInteresting()'
- Replace occurrences of expression with variable" description="Extract local variable 'increment'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java" name="increment" replace="true" selection="19290 48" stamp="1194392750520" version="1.0"/>
<refactoring comment="Rename local variable 'previous' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.propegateInterestToParents(...)' to 'previousElement'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.propegateInterestToParents(IInteractionContext, Kind, IInteractionElement, float, float, int, List<IInteractionElement>).previous'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.propegateInterestToParents(IInteractionContext, Kind, IInteractionElement, float, float, int, List<IInteractionElement>).previousElement'
- Update references to refactored element" description="Rename local variable 'previous'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~propegateInterestToParents~QIInteractionContext;~QInteractionEvent.Kind;~QIInteractionElement;~F~F~I~QList\<QIInteractionElement;>;@previous!19482!19574!19502!19509!QIInteractionElement;" name="previousElement" references="true" stamp="1194393816715" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/11/45/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/11/45/refactorings.index
new file mode 100644
index 0000000..72e663d
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/11/45/refactorings.index
@@ -0,0 +1,2 @@
+1194392750520 Extract local variable 'increment'
+1194393816715 Rename local variable 'previous'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/12/49/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/12/49/refactorings.history
new file mode 100644
index 0000000..1f729e1
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/12/49/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private boolean manipulateInterestForElementHelper(IInteractionElement element,boolean increment,boolean forceLandmark,boolean preserveUninteresting,String sourceId,IInteractionContext context)' from 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.manipulateInterestForElement()' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Method name: 'manipulateInterestForElementHelper'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Declared visibility: 'private'" comments="false" description="Extract method 'manipulateInterestForElementHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java" name="manipulateInterestForElementHelper" replace="false" selection="37897 1986" stamp="1196986431031" version="1.0" visibility="2"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.context.core.IInteractionContextListener.java'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core.IInteractionContextListener.java'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextListener.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.context.core{IInteractionContextListener.java" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylyn.context.core{IInteractionContextListener.java	true	true	IInteractionContextListener2.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1196987556734" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/12/49/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/12/49/refactorings.index
new file mode 100644
index 0000000..59f0fa4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/12/49/refactorings.index
@@ -0,0 +1,2 @@
+1196986431031 Extract method 'manipulateInterestForElementHelper'
+1196987556734 Copy compilation unit
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..3e108a6
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'listeners' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'contextListeners'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.listeners'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.contextListeners'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'listeners'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^listeners" name="contextListeners" references="true" setter="true" stamp="1198110903392" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getContextListeners()' to 'getListeners'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getContextListeners()'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.getListeners()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getContextListeners'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getContextListeners" name="getListeners" references="true" stamp="1198112235529" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..ed9d5ac
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1,2 @@
+1198110903392 Rename field 'listeners'
+1198112235529 Rename method 'getContextListeners'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..cd35e4d
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.util.ITimerThreadListener' to 'IActivityTimerListener' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.util.ITimerThreadListener' - Renamed element: 'org.eclipse.mylar.internal.context.core.util.IActivityTimerListener' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ITimerThreadListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core.util{ITimerThreadListener.java[ITimerThreadListener" matchStrategy="1" name="IActivityTimerListener" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170465389159" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.util.IActivityTimerListener.fireTimedOut()' to 'fireInactive' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.util.IActivityTimerListener.fireTimedOut()' - Renamed element: 'org.eclipse.mylar.internal.context.core.util.IActivityTimerListener.fireInactive()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'fireTimedOut'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core.util{IActivityTimerListener.java[IActivityTimerListener~fireTimedOut" name="fireInactive" references="true" stamp="1170466362524" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.context.core.IInteractionEventListener.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core" element1="/src<org.eclipse.mylar.context.core{IInteractionEventListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170470437923" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.context.core.InteractionEvent.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core" element1="/src<org.eclipse.mylar.context.core{InteractionEvent.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170470610182" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar.monitor.core' - Original element: 'build.properties'" description="Copy file" destination="=org.eclipse.mylar.monitor.core" element1="build.properties" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="build.properties	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1170471759214" units="0" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original elements: org.eclipse.mylar.internal.context.core.util.IActivityTimerListener.java org.eclipse.mylar.internal.context.core.util.TimerThread.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.monitor.core" element1="/src<org.eclipse.mylar.internal.context.core.util{IActivityTimerListener.java" element2="/src<org.eclipse.mylar.internal.context.core.util{TimerThread.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170473831014" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IInteractionEventListener.java'" description="Delete element" element1="/src<org.eclipse.mylar.context.core{IInteractionEventListener.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170474920616" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.InteractionEvent.java'" description="Delete element" element1="/src<org.eclipse.mylar.context.core{InteractionEvent.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170474926204" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..0768456
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1,8 @@
+1170465389159 Rename type 'ITimerThreadListener'
+1170466362524 Rename method 'fireTimedOut'
+1170470437923 Move compilation unit
+1170470610182 Move compilation unit
+1170471759214 Copy file
+1170473831014 Move compilation units
+1170474920616 Delete element
+1170474926204 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..859297e
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original element: 'org.eclipse.mylar.context.core.MylarStatusHandler.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.core" element1="/src<org.eclipse.mylar.context.core{MylarStatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170817286259" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original element: 'org.eclipse.mylar.context.core.IStatusHandler.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.core" element1="/src<org.eclipse.mylar.context.core{IStatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170817337149" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original element: 'org.eclipse.mylar.internal.context.core.util.ZipFileUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core" element1="/src<org.eclipse.mylar.internal.context.core.util{ZipFileUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820499959" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core' - Original element: 'org.eclipse.mylar.internal.context.core.util.DateUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core" element1="/src<org.eclipse.mylar.internal.context.core.util{DateUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820525154" units="1" version="1.0"/>
+<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.internal.core.util' - Original project: 'org.eclipse.mylar.context.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.internal.core.util' - Original elements: org.eclipse.mylar.internal.context.core.util.SaxContextContentHandler.java org.eclipse.mylar.internal.context.core.util.XmlStringConverter.java org.eclipse.mylar.internal.context.core.util.SaxContextReader.java org.eclipse.mylar.internal.context.core.util.SaxContextWriter.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.core.util" element1="/src<org.eclipse.mylar.internal.context.core.util{SaxContextContentHandler.java" element2="/src<org.eclipse.mylar.internal.context.core.util{XmlStringConverter.java" element3="/src<org.eclipse.mylar.internal.context.core.util{SaxContextReader.java" element4="/src<org.eclipse.mylar.internal.context.core.util{SaxContextWriter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820695146" units="4" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core/src/org.eclipse.mylar.internal.context.core.util'" description="Delete element" element1="/src<org.eclipse.mylar.internal.context.core.util" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170820709979" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..399a081
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,6 @@
+1170817286259 Move compilation unit
+1170817337149 Move compilation unit
+1170820499959 Move compilation unit
+1170820525154 Move compilation unit
+1170820695146 Move compilation units
+1170820709979 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..f47ace6
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IElementContainer' to 'IContextIgnoringContainer' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IElementContainer' - Renamed element: 'org.eclipse.mylar.context.core.IContextIgnoringContainer' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'IElementContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IElementContainer.java[IElementContainer" matchStrategy="1" name="IContextIgnoringContainer" qualified="false" references="true" similarDeclarations="false" stamp="1172286497401" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IAlwaysIntersting' to 'IAlwaysInterstingContainer' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IAlwaysIntersting' - Renamed element: 'org.eclipse.mylar.context.core.IAlwaysInterstingContainer' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'IAlwaysIntersting'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IContextIgnoringContainer.java[IAlwaysIntersting" matchStrategy="1" name="IAlwaysInterstingContainer" qualified="false" references="true" similarDeclarations="false" stamp="1172286526046" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..7568d89
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,2 @@
+1172286497401 Rename type 'IElementContainer'
+1172286526046 Rename type 'IAlwaysIntersting'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..fa476df
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void addAttentionEvents(List<InteractionEvent> attention,MylarContext temp)' from 'org.eclipse.mylar.internal.context.core.MylarContextManager.saveActivityHistoryContext()' to 'org.eclipse.mylar.internal.context.core.MylarContextManager' - Original project: 'org.eclipse.mylar.context.core' - Method name: 'addAttentionEvents' - Destination type: 'org.eclipse.mylar.internal.context.core.MylarContextManager' - Declared visibility: 'private'" comments="false" description="Extract method 'addAttentionEvents'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.core{MylarContextManager.java" name="addAttentionEvents" replace="false" selection="22628 821" stamp="1175198691750" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..f837a22
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1 @@
+1175198691750 Extract method 'addAttentionEvents'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/4/15/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/4/15/refactorings.history
new file mode 100644
index 0000000..6faeca6
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/4/15/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original elements: org.eclipse.mylar.context.core.ContextCorePlugin.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.context.core{ContextCorePlugin.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1176148261059" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.getInfos()' to 'getComposed' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.getInfos()' - Renamed element: 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.getComposed()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getInfos'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{CompositeDegreeOfInterest.java[CompositeDegreeOfInterest~getInfos" name="getComposed" references="true" stamp="1176167316305" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.getComposed()' to 'getComposedDegreesOfInterest' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.getComposed()' - Renamed element: 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.getComposedDegreesOfInterest()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getComposed'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{CompositeDegreeOfInterest.java[CompositeDegreeOfInterest~getComposed" name="getComposedDegreesOfInterest" references="true" stamp="1176167369916" version="1.0"/>
+<refactoring comment="Rename field 'infos' in 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest' to 'composed' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.infos' - Renamed element: 'org.eclipse.mylar.internal.context.core.CompositeDegreeOfInterest.composed' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'infos'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.core{CompositeDegreeOfInterest.java[CompositeDegreeOfInterest^infos" name="composed" references="true" setter="false" stamp="1176167374642" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/4/15/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/4/15/refactorings.index
new file mode 100644
index 0000000..7336579
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/4/15/refactorings.index
@@ -0,0 +1,4 @@
+1176148261059 Infer generic type arguments
+1176167316305 Rename method 'getInfos'
+1176167369916 Rename method 'getComposed'
+1176167374642 Rename field 'infos'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/4/17/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/4/17/refactorings.history
new file mode 100644
index 0000000..289478b
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/4/17/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.MylarContext.parseInteractionEvent(...)' to 'processInteractionEvent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContext.parseInteractionEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.MylarContext.processInteractionEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'parseInteractionEvent'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{MylarContext.java[MylarContext~parseInteractionEvent~QInteractionEvent;" name="processInteractionEvent" references="true" stamp="1177322813608" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.MylarContext.processInteractionEvent(...)' to 'parseInteractionEvent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContext.processInteractionEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.MylarContext.parseInteractionEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'processInteractionEvent'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{MylarContext.java[MylarContext~processInteractionEvent~QInteractionEvent;" name="parseInteractionEvent" references="true" stamp="1177322879407" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/4/17/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/4/17/refactorings.index
new file mode 100644
index 0000000..84b7cc7
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/4/17/refactorings.index
@@ -0,0 +1,2 @@
+1177322813608 Rename method 'parseInteractionEvent'
+1177322879407 Rename method 'processInteractionEvent'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/5/18/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/5/18/refactorings.history
new file mode 100644
index 0000000..b850280
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/5/18/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.MylarContextManager' to 'ContextManager' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContextManager' - Renamed element: 'org.eclipse.mylar.internal.context.core.ContextManager' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContextManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{MylarContextManager.java[MylarContextManager" matchStrategy="1" name="ContextManager" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178234470389" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'id' in 'org.eclipse.mylar.internal.context.core.ContextManager.eraseContext(...)' to 'handleIdentifier' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.ContextManager.eraseContext(String, boolean).id' - Renamed element: 'org.eclipse.mylar.internal.context.core.ContextManager.eraseContext(String, boolean).handleIdentifier' - Update references to refactored element" description="Rename local variable 'id'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.context.core{ContextManager.java" name="handleIdentifier" references="true" selection="20884 2" stamp="1178234578786" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/5/18/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/5/18/refactorings.index
new file mode 100644
index 0000000..c006098
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/5/18/refactorings.index
@@ -0,0 +1,2 @@
+1178234470389 Rename type 'MylarContextManager'
+1178234578786 Rename local variable 'id'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..913b934
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'currentContext' in 'org.eclipse.mylar.internal.context.core.ContextManager' to 'activeContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.ContextManager.currentContext' - Renamed element: 'org.eclipse.mylar.internal.context.core.ContextManager.activeContext' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'currentContext'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.core{ContextManager.java[ContextManager^currentContext" name="activeContext" references="true" setter="false" stamp="1180141134768" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarContext' to 'IInteractionContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarContext' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionContext' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarContext'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarContext.java[IMylarContext" matchStrategy="1" name="IInteractionContext" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141515597" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarElement' to 'IInteractionElement' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarElement' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionElement' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarElement.java[IMylarElement" matchStrategy="1" name="IInteractionElement" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141559368" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarObject' to 'IInteractionObject' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarObject' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionObject' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarObject'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarObject.java[IMylarObject" matchStrategy="1" name="IInteractionObject" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141640414" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarRelation' to 'IInteractionRelation' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarRelation' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionRelation' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarRelation'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarRelation.java[IMylarRelation" matchStrategy="1" name="IInteractionRelation" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141684581" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.ContextManager' to 'InteractionContextManager' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.ContextManager' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{ContextManager.java[ContextManager" matchStrategy="1" name="InteractionContextManager" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141711955" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.MylarContextElement' to 'InteractionContextElement' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContextElement' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextElement' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContextElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{MylarContextElement.java[MylarContextElement" matchStrategy="1" name="InteractionContextElement" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141751410" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.MylarContext' to 'InteractionContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContext' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContext' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContext'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{MylarContext.java[MylarContext" matchStrategy="1" name="InteractionContext" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141767844" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.MylarContextExternalizer' to 'InteractionContextExternalizer' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContextExternalizer' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextExternalizer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContextExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{MylarContextExternalizer.java[MylarContextExternalizer" matchStrategy="1" name="InteractionContextExternalizer" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141796380" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.MylarContextRelation' to 'InteractionContextRelation' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarContextRelation' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextRelation' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContextRelation'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{MylarContextRelation.java[MylarContextRelation" matchStrategy="1" name="InteractionContextRelation" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141835707" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.MylarPreferenceContstants' to 'ContextPreferenceContstants' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.MylarPreferenceContstants' - Renamed element: 'org.eclipse.mylar.internal.context.core.ContextPreferenceContstants' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPreferenceContstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{MylarPreferenceContstants.java[MylarPreferenceContstants" matchStrategy="1" name="ContextPreferenceContstants" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180141869986" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IAlwaysIntersting' to 'IImplicitlyIntersting' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IAlwaysIntersting' - Renamed element: 'org.eclipse.mylar.context.core.IImplicitlyIntersting' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IAlwaysIntersting'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IAlwaysIntersting.java[IAlwaysIntersting" matchStrategy="1" name="IImplicitlyIntersting" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180145532142" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'activeContext' in 'org.eclipse.mylar.internal.context.core.InteractionContextManager' to 'aaactiveContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.activeContext' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.aaactiveContext' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'activeContext'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager^activeContext" name="aaactiveContext" references="true" setter="false" stamp="1180146502717" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.SaxContextWriter.MylarContextInputSource' to 'InteractionContextInputSource' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.SaxContextWriter.MylarContextInputSource' - Renamed element: 'org.eclipse.mylar.internal.context.core.SaxContextWriter.InteractionContextInputSource' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'MylarContextInputSource'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{SaxContextWriter.java[SaxContextWriter[MylarContextInputSource" matchStrategy="1" name="InteractionContextInputSource" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180148583439" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.core.CompositeContext' to 'CompositeInteractionContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.CompositeContext' - Renamed element: 'org.eclipse.mylar.internal.context.core.CompositeInteractionContext' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'CompositeContext'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.core{CompositeContext.java[CompositeContext" matchStrategy="1" name="CompositeInteractionContext" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180148713663" textual="false" version="1.0"/>
+
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.context.core.ContentSpecificGlobalContext.ContentSpecificGlobalContext(ScalingFactors scaling, String contentType, String id)' to 'public ContentSpecificGlobalContext(ScalingFactors scaling, String contentType, String id)' - Original project: 'org.eclipse.mylar.context.core'" delegate="false" deprecate="true" description="Change method 'ContentSpecificGlobalContext'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.context.core{ContentSpecificGlobalContext.java[ContentSpecificGlobalContext~ContentSpecificGlobalContext~QString;~QScalingFactors;~QString;" name="ContentSpecificGlobalContext" parameter1="ScalingFactors scaling 1 ScalingFactors scaling false" parameter2="String contentType 2 String contentType false" parameter3="String id 0 String id false" stamp="1180155499347" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleActivityMetaContextEvent(...)' to 'processActivityMetaContextEvent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleActivityMetaContextEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.processActivityMetaContextEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleActivityMetaContextEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~handleActivityMetaContextEvent~QInteractionEvent;" name="processActivityMetaContextEvent" references="true" stamp="1180171547784" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvent(...)' to 'processInteractionEvent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.processInteractionEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleInteractionEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~handleInteractionEvent~QInteractionEvent;" name="processInteractionEvent" references="true" stamp="1180171565441" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvent(...)' to 'processInteractionEvent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.processInteractionEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleInteractionEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~handleInteractionEvent~QInteractionEvent;~Z" name="processInteractionEvent" references="true" stamp="1180171576026" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvents(...)' to 'processInteractionEvents' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvents(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.processInteractionEvents(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleInteractionEvents'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~handleInteractionEvents~QList\<QInteractionEvent;>;~Z" name="processInteractionEvents" references="true" stamp="1180171582846" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvent(...)' to 'processInteractionEvent' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.handleInteractionEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.processInteractionEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleInteractionEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~handleInteractionEvent~QInteractionEvent;~Z~Z" name="processInteractionEvent" references="true" stamp="1180171590375" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..b3ef41a
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1,19 @@
+1180141134768 Rename field 'currentContext'
+1180141515597 Rename type 'IMylarContext'
+1180141559368 Rename type 'IMylarElement'
+1180141640414 Rename type 'IMylarObject'
+1180141684581 Rename type 'IMylarRelation'
+1180141711955 Rename type 'ContextManager'
+1180141751410 Rename type 'MylarContextElement'
+1180141767844 Rename type 'MylarContext'
+1180141796380 Rename type 'MylarContextExternalizer'
+1180141835707 Rename type 'MylarContextRelation'
+1180141869986 Rename type 'MylarPreferenceContstants'
+1180148583439 Rename type 'MylarContextInputSource'
+1180148713663 Rename type 'CompositeContext'
+1180155499347 Change method 'ContentSpecificGlobalContext'
+1180171547784 Rename method 'handleActivityMetaContextEvent'
+1180171565441 Rename method 'handleInteractionEvent'
+1180171576026 Rename method 'handleInteractionEvent'
+1180171582846 Rename method 'handleInteractionEvents'
+1180171590375 Rename method 'handleInteractionEvent'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..07f2e4e
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.getActivityHistoryMetaContext()' to 'getActivityMetaContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.getActivityHistoryMetaContext()' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.getActivityMetaContext()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getActivityHistoryMetaContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActivityHistoryMetaContext" name="getActivityMetaContext" references="true" stamp="1180238406001" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.core.InteractionContextManager.saveActivityHistoryContext()' to 'saveActivityContext' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.saveActivityHistoryContext()' - Renamed element: 'org.eclipse.mylar.internal.context.core.InteractionContextManager.saveActivityContext()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveActivityHistoryContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java[InteractionContextManager~saveActivityHistoryContext" name="saveActivityContext" references="true" stamp="1180239224606" version="1.0"/>
+<refactoring comment="Extract method 'private void saveContext(String handleIdentifier,InteractionContext context)' from 'org.eclipse.mylar.internal.context.core.InteractionContextManager.saveContext()' to 'org.eclipse.mylar.internal.context.core.InteractionContextManager' - Original project: 'org.eclipse.mylar.context.core' - Method name: 'saveContext' - Destination type: 'org.eclipse.mylar.internal.context.core.InteractionContextManager' - Declared visibility: 'private'" comments="false" description="Extract method 'saveContext'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.core{InteractionContextManager.java" name="saveContext" replace="false" selection="23932 540" stamp="1180239659679" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IContextWriter' to 'IInteractionContextWriter' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IContextWriter' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionContextWriter' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IContextWriter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IContextWriter.java[IContextWriter" matchStrategy="1" name="IInteractionContextWriter" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180240817088" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IContextReader' to 'IInteractionContextReader' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IContextReader' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionContextReader' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IContextReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IContextReader.java[IContextReader" matchStrategy="1" name="IInteractionContextReader" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180240835195" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.core.IMylarContextListener' to 'IInteractionContextListener' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.context.core.IMylarContextListener' - Renamed element: 'org.eclipse.mylar.context.core.IInteractionContextListener' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarContextListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.core{IMylarContextListener.java[IMylarContextListener" matchStrategy="1" name="IInteractionContextListener" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180240909421" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_CONTENT_LIMITED' in 'org.eclipse.mylar.internal.context.core.SaxContextContentHandler' to 'ATTRIBUTE_CONTENT_LIMITED_TO' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.SaxContextContentHandler.ATTRIBUTE_CONTENT_LIMITED' - Renamed element: 'org.eclipse.mylar.internal.context.core.SaxContextContentHandler.ATTRIBUTE_CONTENT_LIMITED_TO' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ATTRIBUTE_CONTENT_LIMITED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.core{SaxContextContentHandler.java[SaxContextContentHandler^ATTRIBUTE_CONTENT_LIMITED" name="ATTRIBUTE_CONTENT_LIMITED_TO" references="true" setter="false" stamp="1180241439795" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTRIBUTE_CONTENT_LIMITED_TO' in 'org.eclipse.mylar.internal.context.core.SaxContextContentHandler' to 'ATTRIBUTE_CONTENT' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.SaxContextContentHandler.ATTRIBUTE_CONTENT_LIMITED_TO' - Renamed element: 'org.eclipse.mylar.internal.context.core.SaxContextContentHandler.ATTRIBUTE_CONTENT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ATTRIBUTE_CONTENT_LIMITED_TO'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.core{SaxContextContentHandler.java[SaxContextContentHandler^ATTRIBUTE_CONTENT_LIMITED_TO" name="ATTRIBUTE_CONTENT" references="true" setter="false" stamp="1180241797425" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.context.core.ContentSpecificGlobalContext.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.context.core{ContentSpecificGlobalContext.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180242847126" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..a6c0c0f
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,9 @@
+1180238406001 Rename method 'getActivityHistoryMetaContext'
+1180239224606 Rename method 'saveActivityHistoryContext'
+1180239659679 Extract method 'saveContext'
+1180240817088 Rename type 'IContextWriter'
+1180240835195 Rename type 'IContextReader'
+1180240909421 Rename type 'IMylarContextListener'
+1180241439795 Rename field 'ATTRIBUTE_CONTENT_LIMITED'
+1180241797425 Rename field 'ATTRIBUTE_CONTENT_LIMITED_TO'
+1180242847126 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..b215e11
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'CONTENT_TYPE_ANY' in 'org.eclipse.mylyn.context.core.ContextCorePlugin' to 'CONTENT_TYPE_RESOURCE' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.CONTENT_TYPE_ANY' - Renamed element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.CONTENT_TYPE_RESOURCE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'CONTENT_TYPE_ANY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.core{ContextCorePlugin.java[ContextCorePlugin^CONTENT_TYPE_ANY" name="CONTENT_TYPE_RESOURCE" references="true" setter="false" stamp="1181620930143" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.core.IMylarSearchOperation' to 'IActiveSearchOperation' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.IMylarSearchOperation' - Renamed element: 'org.eclipse.mylyn.internal.context.core.IActiveSearchOperation' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarSearchOperation'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.core{IMylarSearchOperation.java[IMylarSearchOperation" matchStrategy="1" name="IActiveSearchOperation" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181674511100" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.ContextCorePlugin.makeXMLString(...)' to 'cleanXMLString' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.makeXMLString(...)' - Renamed element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.cleanXMLString(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'makeXMLString'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{ContextCorePlugin.java[ContextCorePlugin~makeXMLString~QString;" name="cleanXMLString" references="true" stamp="1182034231703" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.ContextCorePlugin.cleanXMLString(...)' to 'cleanXmlString' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.cleanXMLString(...)' - Renamed element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.cleanXmlString(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'cleanXMLString'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{ContextCorePlugin.java[ContextCorePlugin~cleanXMLString~QString;" name="cleanXmlString" references="true" stamp="1182034251781" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..5cad069
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,4 @@
+1181620930143 Rename field 'CONTENT_TYPE_ANY'
+1181674511100 Rename type 'IMylarSearchOperation'
+1182034231703 Rename method 'makeXMLString'
+1182034251781 Rename method 'cleanXMLString'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..c9056d4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.ContextCorePlugin.addBridge(...)' to 'addStructureBridge' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.addBridge(...)' - Renamed element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.addStructureBridge(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addBridge'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{ContextCorePlugin.java[ContextCorePlugin~addBridge~QAbstractContextStructureBridge;" name="addStructureBridge" references="true" stamp="1182281870188" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.core' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'handlers.exsd'" description="Delete element" element1="schema/handlers.exsd" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182456940732" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.AbstractContextStructureBridge.getName(...)' to 'getLabel' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.context.core.AbstractContextStructureBridge.getName(...)' - Renamed element: 'org.eclipse.mylyn.context.core.AbstractContextStructureBridge.getLabel(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getName'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{AbstractContextStructureBridge.java[AbstractContextStructureBridge~getName~QObject;" name="getLabel" references="true" stamp="1182465375585" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..4eec024
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,3 @@
+1182281870188 Rename method 'addBridge'
+1182456940732 Delete element
+1182465375585 Rename method 'getName'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..9242e52
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'com.tasktop.calendar.core' - Original project: 'org.eclipse.mylyn.context.core' - Destination element: 'com.tasktop.calendar.core' - Original element: 'about.html'" description="Copy file" destination="=com.tasktop.calendar.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1184177396953" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..3d5b174
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184177396953 Copy file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/8/33/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/8/33/refactorings.history
new file mode 100644
index 0000000..86be96c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/8/33/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.collapseHourlyEvents(...)' to 'collapseEventsByHour' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.collapseHourlyEvents(...)' - Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.collapseEventsByHour(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'collapseHourlyEvents'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseHourlyEvents~QList\<QInteractionEvent;>;" name="collapseEventsByHour" references="true" stamp="1187049279328" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.context.core' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.context.core.LegacyActivityAdaptor.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.internal.context.core{LegacyActivityAdaptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1187210968203" units="1" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.PREFERENCE_ATTENTION_MIGRATED' from expression '"mylyn.attention.migrated"' - Original project: 'org.eclipse.mylyn.context.core' - Constant name: 'PREFERENCE_ATTENTION_MIGRATED' - Constant expression: '"mylyn.attention.migrated"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'PREFERENCE_ATTENTION_MIGRATED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java" name="PREFERENCE_ATTENTION_MIGRATED" qualify="false" replace="true" selection="6380 26" stamp="1187211589328" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'ACTIVITY_DELTA_ATTENTION_GAINED' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'ACTIVITY_DELTA_ATTENTION_ADD' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ATTENTION_GAINED' - Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ATTENTION_ADD' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ACTIVITY_DELTA_ATTENTION_GAINED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_ATTENTION_GAINED" name="ACTIVITY_DELTA_ATTENTION_ADD" references="true" setter="false" stamp="1187293285640" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/8/33/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/8/33/refactorings.index
new file mode 100644
index 0000000..e8e7189
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/8/33/refactorings.index
@@ -0,0 +1,4 @@
+1187049279328 Rename method 'collapseHourlyEvents'
+1187210968203 Move compilation unit
+1187211589328 Extract constant 'PREFERENCE_ATTENTION_MIGRATED'
+1187293285640 Rename field 'ACTIVITY_DELTA_ATTENTION_GAINED'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/8/34/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/8/34/refactorings.history
new file mode 100644
index 0000000..ae7b364
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/8/34/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'ACTIVITY_STRUCTURE_KIND' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'ACTIVITY_STRUCTUREKIND_TASK' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTURE_KIND' - Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTUREKIND_TASK' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ACTIVITY_STRUCTURE_KIND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_STRUCTURE_KIND" name="ACTIVITY_STRUCTUREKIND_TASK" references="true" setter="false" stamp="1187890812843" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'ACTIVITY_DELTA_ATTENTION_ADD' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'ACTIVITY_DELTA_ATTENTION_ADDED' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ATTENTION_ADD' - Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ATTENTION_ADDED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ACTIVITY_DELTA_ATTENTION_ADD'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_ATTENTION_ADD" name="ACTIVITY_DELTA_ATTENTION_ADDED" references="true" setter="false" stamp="1187891116421" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'ACTIVITY_STRUCTUREKIND_APPLICATION' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'ACTIVITY_STRUCTUREKIND_LIFECYCLE' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTUREKIND_APPLICATION' - Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTUREKIND_LIFECYCLE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ACTIVITY_STRUCTUREKIND_APPLICATION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_STRUCTUREKIND_APPLICATION" name="ACTIVITY_STRUCTUREKIND_LIFECYCLE" references="true" setter="false" stamp="1187899604203" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'ACTIVITY_DELTA_ATTENTION_ADDED' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'ACTIVITY_DELTA_ADDED' - Original project: 'org.eclipse.mylyn.context.core' - Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ATTENTION_ADDED' - Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ADDED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ACTIVITY_DELTA_ATTENTION_ADDED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_ATTENTION_ADDED" name="ACTIVITY_DELTA_ADDED" references="true" setter="false" stamp="1187899748984" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/8/34/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/8/34/refactorings.index
new file mode 100644
index 0000000..18b434b
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/8/34/refactorings.index
@@ -0,0 +1,4 @@
+1187890812843 Rename field 'ACTIVITY_STRUCTURE_KIND'
+1187891116421 Rename field 'ACTIVITY_DELTA_ATTENTION_ADD'
+1187899604203 Rename field 'ACTIVITY_STRUCTUREKIND_APPLICATION'
+1187899748984 Rename field 'ACTIVITY_DELTA_ATTENTION_ADDED'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..a760b4e
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'handleIdentifier' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.transferContextAndActivate(...)' to 'targetHhandleIdentifier'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.transferContextAndActivate(String, File).handleIdentifier'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.transferContextAndActivate(String, File).targetHhandleIdentifier'
- Update references to refactored element" description="Rename local variable 'handleIdentifier'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~transferContextAndActivate~QString;~QFile;@handleIdentifier!40050!40072!40057!40072!QString;" name="targetHhandleIdentifier" references="true" stamp="1190827245500" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..5d07ba4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1 @@
+1190827245500 Rename local variable 'handleIdentifier'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/1/2/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/1/2/refactorings.history
new file mode 100644
index 0000000..bd5a058
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/1/2/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename local variable 'obj' in 'org.eclipse.mylyn.internal.context.core.CompositeContextElement.equals(...)' to 'object'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.CompositeContextElement.equals(Object).obj'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.CompositeContextElement.equals(Object).object'
- Update references to refactored element" description="Rename local variable 'obj'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{CompositeContextElement.java[CompositeContextElement~equals~QObject;@obj!3985!3994!3992!3994!QObject;" name="object" references="true" stamp="1199813507255" version="1.0"/>
<refactoring comment="Rename local variable 'node' in 'org.eclipse.mylyn.internal.context.core.CompositeContextElement.equals(...)' to 'element'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.CompositeContextElement.equals(Object).node'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.CompositeContextElement.equals(Object).element'
- Update references to refactored element" description="Rename local variable 'node'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{CompositeContextElement.java[CompositeContextElement~equals~QObject;@node!4099!4161!4123!4126!QCompositeContextElement;" name="element" references="true" stamp="1199813535139" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/1/2/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/1/2/refactorings.index
new file mode 100644
index 0000000..0726eaf
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/1/2/refactorings.index
@@ -0,0 +1,2 @@
+1199813507255 Rename local variable 'obj'
+1199813535139 Rename local variable 'node'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/10/44/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/10/44/refactorings.history
new file mode 100644
index 0000000..5914996
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/10/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'dest' from expression 'new File(file.getAbsolutePath() + "-save")'
- Original project: 'org.eclipse.mylyn.context.core'
- Variable name: 'dest'
- Destination method: 'org.eclipse.mylyn.internal.context.core.SaxContextReader.readContext()'
- Variable expression: 'new File(file.getAbsolutePath() + "-save")'
- Replace occurrences of expression with variable" description="Extract local variable 'dest'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.context.core{SaxContextReader.java" name="dest" replace="true" selection="2926 42" stamp="1225441239655" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/10/44/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/10/44/refactorings.index
new file mode 100644
index 0000000..7b5e96e
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/10/44/refactorings.index
@@ -0,0 +1 @@
+1225441239655 Extract local variable 'dest'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..d30c75f
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.context.core.InteractionContextListenerAdapter' to 'InteractionContextAdapter'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.InteractionContextListenerAdapter'
- Renamed element: 'org.eclipse.mylyn.context.core.InteractionContextAdapter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'InteractionContextListenerAdapter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.core{InteractionContextListenerAdapter.java[InteractionContextListenerAdapter" matchStrategy="1" name="InteractionContextAdapter" qualified="false" references="true" similarDeclarations="false" stamp="1207275154780" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..fddc7a3
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1 @@
+1207275154780 Rename type 'InteractionContextListenerAdapter'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..2d9e497
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextWriter.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextWriter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207702516753" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextReader.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207702686875" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.context.core.ContextCorePlugin.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.context.core{ContextCorePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207704803962" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.getContextManager()' to 'org.eclipse.mylyn.context.core.ContextCore'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.getContextManager()'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.context.core.ContextCore'" delegate="true" deprecate="true" description="Move member 'getContextManager'" element1="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin~getContextManager" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.core{ContextCore.java[ContextCore" stamp="1207704911998" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.context.core.IInteractionContextManager' from 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Extracted interface: 'org.eclipse.mylyn.internal.context.core.IInteractionContextManager'
- Extracted members:
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getActiveElement()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getElement(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvents(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.addListener(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.removeListener(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.removeAllListeners()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getActiveContexts()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.activateContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.deactivateAllContexts()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.deactivateContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.deleteContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.loadContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.loadContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.loadContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.saveContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.saveContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getActiveContext()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getActiveLandmarks()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getInterestingDocuments(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getInterestingDocuments()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.manipulateInterestForElement(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.manipulateInterestForElement(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.updateHandle(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.delete(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.copyContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.cloneContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getGlobalContexts()
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'IInteractionContextManager'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveElement" element10="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~removeAllListeners" element11="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveContexts" element12="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~activateContext~QString;" element13="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~deactivateContext~QSt" element14="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~deactivateContext~QString;" element15="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~loadContext~QString;g;" element16="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~loadContext~QString;" element17="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~loadContext~QString;~QFile;actionContextScaling;" element18="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~loadContext~QString;~QFile;" element19="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getElement~QString;;" element2="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getElement~QString;" element20="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveContexteractionContext;" element21="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveContext" element22="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getInterestingDocu" element23="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getInterestingDocuments~QIInteractionContext;" element24="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~manipulateInterestForEl" element25="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~manipulateInterestForElement~QIInteractionElement;~Z~Z~Z~QString;" element26="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~updateHandle~QIInteractionElement;~QString;lement;~Z~Z~Z~QString;~QIInteractionContext;" element27="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~updateHandle~QIInteractionElement;~QString;" element28="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~copyContext~QString;~QFile;;" element29="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~copyContext~QString;~QFile;" element3="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~cloneContext~QString;~QString;t;~QKind;~QString;~QIInteractionContext;" element30="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~cloneContext~QString;~QString;" element31="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractio" element4="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;" element5="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvents~QList\<QInteraction" element6="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvents~QList\<QInteractionEvent;>;~Z" element7="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~addListener~QIInteractionContextListener;;~Z~Z" element8="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~addListener~QIInteractionContextListener;" element9="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~removeListener~QIInteractionContextListener;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" instanceof="true" name="IInteractionContextManager" public="true" replace="true" stamp="1207705365874" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.IInteractionContextManager.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.core" element1="/src<org.eclipse.mylyn.internal.context.core{IInteractionContextManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207705382332" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.PROPERTY_CONTEXT_ACTIVE' to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.PROPERTY_CONTEXT_ACTIVE'
- Destination type: 'org.eclipse.mylyn.context.core.IInteractionContextManager'" delegate="false" deprecate="true" description="Move member 'PROPERTY_CONTEXT_ACTIVE'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^PROPERTY_CONTEXT_ACTIVE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" stamp="1207705477767" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.CONTEXT_FILENAME_ENCODING' to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.CONTEXT_FILENAME_ENCODING'
- Destination type: 'org.eclipse.mylyn.context.core.IInteractionContextManager'" delegate="false" deprecate="true" description="Move member 'CONTEXT_FILENAME_ENCODING'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^CONTEXT_FILENAME_ENCODING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" stamp="1207705529955" version="1.0"/>
<refactoring comment="Move 15 members to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original elements:
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ACTIVATED
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.CONTEXT_FILE_EXTENSION
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.CONTAINMENT_PROPAGATION_ID
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_ORIGINID_OS
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.OLD_CONTEXT_HISTORY_FILE_NAME
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTUREKIND_ACTIVATION
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_STARTED
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_ADDED
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.CONTEXT_HISTORY_FILE_NAME
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_DELTA_STOPPED
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.ACTIVITY_STRUCTUREKIND_LIFECYCLE
- Destination type: 'org.eclipse.mylyn.context.core.IInteractionContextManager'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_DEACTIVATED" element10="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^CONTEXT_FILE_EXTENSION_OLD" element11="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_ADDED" element12="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^CONTEXT_HISTORY_FILE_NAME" element13="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_STOPPED" element14="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_STRUCTUREKIND_TIMING" element15="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_STRUCTUREKIND_LIFECYCLE" element2="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_ACTIVATED" element3="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^CONTEXT_FILE_EXTENSION" element4="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^CONTAINMENT_PROPAGATION_ID" element5="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_ORIGINID_OS" element6="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^OLD_CONTEXT_HISTORY_FILE_NAME" element7="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_STRUCTUREKIND_ACTIVATION" element8="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_DELTA_STARTED" element9="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^ACTIVITY_ORIGINID_WORKBENCH" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" stamp="1207705577993" version="1.0"/>
<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original elements:
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getActivityMetaContext()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.loadActivityMetaContext()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processActivityMetaContextEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.resetActivityHistory()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getActiveElement()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvents(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.processInteractionEvent(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.saveActivityContext()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.collapseActivityMetaContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.collapseEventsByHour(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getFileForContext(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.getCommonContextScaling()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.isContextActive()
 org.eclipse.mylyn.internal.context.core.InteractionContextManager.setContextCapturePaused(...)
- Destination type: 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Use super type where possible
- Use super type in 'instanceof' expressions" delete="17" description="Pull up members to 'IInteractionContextManager'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActivityMetaContext" element10="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;~Z~Z" element11="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~saveActivityContext" element12="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseActivityMetaContext~QInteractionContext;" element13="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseEventsByHour~QList\<QInteractionEvent;>;" element14="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getFileForContext~QString;" element15="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getCommonContextScaling" element16="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~isContextActive" element17="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~setContextCapturePaused~Z" element18="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActivityMetaContext" element19="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~loadActivityMetaContext" element2="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~loadActivityMetaContext" element20="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processActivityMetaContextEvent~QInteractionEvent;" element21="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~resetActivityHistory" element22="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveElement" element23="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QObject;~QKind;~QString;~QIInteractionContext;" element24="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;" element25="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;~Z" element26="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;~Z~Zent;>;~Z" element27="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;~Z~Z" element28="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseActivityMet" element29="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseActivityMetaContext~QInteractionContext;" element3="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseEventsByHour~QList\<QInteractionEvent;>;t;" element30="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~collapseEventsByHour~QList\<QInteractionEvent;>;" element31="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getCommonContextScalingng;" element32="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getCommonContextScaling" element33="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~setContextCaptu" element34="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~setContextCapturePaused~Z" element4="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveElementtory" element5="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~getActiveElement" element6="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;tring;~QIInteractionContext;" element7="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvent~QInteractionEvent;" element8="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvents~QList\<QInteraction" element9="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~processInteractionEvents~QList\<QInteractionEvent;>;~Z" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" instanceof="true" pull="17" replace="true" stamp="1207705722084" stubs="true" version="1.0"/>
<refactoring abstract="0" comment="Pull up 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.addActivityMetaContextListener(...)' from 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.addActivityMetaContextListener(...)'
- Destination type: 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Use super type where possible
- Use super type in 'instanceof' expressions" delete="1" description="Pull up 'addActivityMetaContextListener' to 'IInteractionContextManager'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~addActivityMetaContextListener~QIInteractionContextListener;" element2="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~addActivityMetaContextListener~QIInteractionContextListener;" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" instanceof="true" pull="1" replace="true" stamp="1207705775046" stubs="true" version="1.0"/>
<refactoring abstract="0" comment="Pull up 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.hasContext(...)' from 'org.eclipse.mylyn.internal.context.core.InteractionContextManager' to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.hasContext(...)'
- Destination type: 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Use super type where possible
- Use super type in 'instanceof' expressions" delete="1" description="Pull up 'hasContext' to 'IInteractionContextManager'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~hasContext~QString;" element2="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~hasContext~QString;" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" instanceof="true" pull="1" replace="true" stamp="1207706022984" stubs="true" version="1.0"/>
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core.IInteractionContextManager'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.SOURCE_ID_DECAY'
- Textual move only" description="Move field" destination="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager^SOURCE_ID_DECAY" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1207707345590" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.context.core.IInteractionContextScaling' from 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextScaling'
- Extracted interface: 'org.eclipse.mylyn.internal.context.core.IInteractionContextScaling'
- Extracted members:
 org.eclipse.mylyn.internal.context.core.InteractionContextScaling.get(...)
 org.eclipse.mylyn.internal.context.core.InteractionContextScaling.getDecay()
 org.eclipse.mylyn.internal.context.core.InteractionContextScaling.getInteresting()
 org.eclipse.mylyn.internal.context.core.InteractionContextScaling.getLandmark()
 org.eclipse.mylyn.internal.context.core.InteractionContextScaling.getForcedLandmark()
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'IInteractionContextScaling'" element1="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling~get~QInteractionEvent.Kind;" element2="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling~getDecay" element3="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling~getInteresting" element4="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling~getLandmark" element5="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling~getForcedLandmark" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextScaling.java[InteractionContextScaling" instanceof="true" name="IInteractionContextScaling" public="true" replace="true" stamp="1207708672361" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.IInteractionContextScaling.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.core" element1="/src<org.eclipse.mylyn.internal.context.core{IInteractionContextScaling.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207708685934" units="1" version="1.0"/>

</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..8e7905c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,15 @@
+1207702516753 Move compilation unit
+1207702686875 Move compilation unit
+1207704803962 Move compilation unit
+1207704911998 Move member 'getContextManager'
+1207705365874 Extract interface 'IInteractionContextManager'
+1207705382332 Move compilation unit
+1207705477767 Move member 'PROPERTY_CONTEXT_ACTIVE'
+1207705529955 Move member 'CONTEXT_FILENAME_ENCODING'
+1207705577993 Move members
+1207705722084 Pull up members to 'IInteractionContextManager'
+1207705775046 Pull up 'addActivityMetaContextListener' to 'IInteractionContextManager'
+1207706022984 Pull up 'hasContext' to 'IInteractionContextManager'
+1207707345590 Move field
+1207708672361 Extract interface 'IInteractionContextScaling'
+1207708685934 Move compilation unit
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..444d6c7
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'ACTIVITY_DELTA_RESET' in 'org.eclipse.mylyn.context.core.IInteractionContextManager' to 'ACTIVITY_DELTA_REMOVED'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_RESET'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_REMOVED'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ACTIVITY_DELTA_RESET'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_RESET" name="ACTIVITY_DELTA_REMOVED" references="true" setter="false" stamp="1208445950341" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..8a0c280
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1 @@
+1208445950341 Rename field 'ACTIVITY_DELTA_RESET'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..166f56c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'pom.xml'" description="Delete element" element1="pom.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1209509373969" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..f82ff2d
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1 @@
+1209509373969 Delete element
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..dbab8fd
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractRelationProvider.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.context.core{AbstractRelationProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1210647553404" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextListener2.java'" description="Delete element" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextListener2.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210649909532" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.context.core.IInteractionContextListener' to 'AbstractContextListener'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextListener'
- Renamed element: 'org.eclipse.mylyn.context.core.AbstractContextListener'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'IInteractionContextListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.core{IInteractionContextListener.java[IInteractionContextListener" matchStrategy="1" name="AbstractContextListener" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1210651110885" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.CONTENT_TYPE_RESOURCE' to 'org.eclipse.mylyn.context.core.ContextCore'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.CONTENT_TYPE_RESOURCE'
- Destination type: 'org.eclipse.mylyn.context.core.ContextCore'" delegate="false" deprecate="true" description="Move member 'CONTENT_TYPE_RESOURCE'" element1="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin^CONTENT_TYPE_RESOURCE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.core{ContextCore.java[ContextCore" stamp="1210823607560" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.ContextCore.getKnownContentTypes()' to 'getContentTypes'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.ContextCore.getKnownContentTypes()'
- Renamed element: 'org.eclipse.mylyn.context.core.ContextCore.getContentTypes()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getKnownContentTypes'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{ContextCore.java[ContextCore~getKnownContentTypes" name="getContentTypes" references="true" stamp="1210836261495" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.getKnownContentTypes()' to 'getContentTypes'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.getKnownContentTypes()'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.getContentTypes()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getKnownContentTypes'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin~getKnownContentTypes" name="getContentTypes" references="true" stamp="1210836268541" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..5d3bc39
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,6 @@
+1210647553404 Move compilation unit
+1210649909532 Delete element
+1210651110885 Rename type 'IInteractionContextListener'
+1210823607560 Move member 'CONTENT_TYPE_RESOURCE'
+1210836261495 Rename method 'getKnownContentTypes'
+1210836268541 Rename method 'getKnownContentTypes'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..f5d8325
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename local variable 'node' in 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.notifyRelationshipsChanged(...)' to 'element'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager.notifyRelationshipsChanged(IInteractionElement).node'
- Renamed element: 'node'
- Update references to refactored element" description="Rename local variable 'node'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager~notifyRelationshipsChanged~QIInteractionElement;@node!34493!34516!34513!34516!QIInteractionElement;" name="element" references="true" stamp="1211324063084" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.AbstractContextStore.hasContext(...)' to 'hasSavedContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextStore.hasContext(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.AbstractContextStore.hasSavedContext(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~hasContext~QString;" name="hasSavedContext" references="true" stamp="1211398787591" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.context.core.AbstractContextStore.copyContext(File file, String handleIdentifier)' to 'public boolean copyContext(File file, String handleIdentifier)'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextStore.copyContext(...)'" delegate="false" deprecate="true" description="Change method 'copyContext'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~copyContext~QString;~QFile;" name="copyContext" parameter1="File file 1 File file false" parameter2="String handleIdentifier 0 String handleIdentifier false" stamp="1211401446691" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IInteractionContextManager.saveActivityContext()' to 'saveActivityMetaContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.saveActivityContext()'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.saveActivityMetaContext()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveActivityContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager~saveActivityContext" name="saveActivityMetaContext" references="true" stamp="1211404394981" version="1.0"/>
<refactoring comment="Rename local variable 'context_listener' in 'org.eclipse.mylyn.context.core.IInteractionContextManager.removeActivityMetaContextListener(...)' to 'listener'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.removeActivityMetaContextListener(AbstractContextListener).context_listener'
- Renamed element: 'context_listener'
- Update references to refactored element" description="Rename local variable 'context_listener'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager~removeActivityMetaContextListener~QAbstractContextListener;@context_listener!6043!6082!6067!6082!QAbstractContextListener;" name="listener" references="true" stamp="1211409981306" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextPreferenceContstants.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.core{ContextPreferenceContstants.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211410177338" subPackages="false" version="1.0"/>
<refactoring comment="Rename local variable 'contextDirectory' in 'org.eclipse.mylyn.context.core.IContextStoreListener.contextStoreMoved(...)' to 'newDirectory'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IContextStoreListener.contextStoreMoved(File).contextDirectory'
- Renamed element: 'contextDirectory'
- Update references to refactored element" description="Rename local variable 'contextDirectory'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.core{IContextStoreListener.java[IContextStoreListener~contextStoreMoved~QFile;@contextDirectory!784!804!789!804!QFile;" name="newDirectory" references="true" stamp="1211412692818" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXML(...)' to 'readContextFromXml'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXML(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXml(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readContextFromXML'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextExternalizer.java[InteractionContextExternalizer~readContextFromXML~QString;~QFile;~QIInteractionContextScaling;" name="readContextFromXml" references="true" stamp="1211418203305" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXML(...)' to 'readContextFromXml'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXML(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXml(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readContextFromXML'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextExternalizer.java[InteractionContextExternalizer~readContextFromXML~QString;~QFile;~QIInteractionContextReader;~QIInteractionContextScaling;" name="readContextFromXml" references="true" stamp="1211418209156" version="1.0"/>
<refactoring comment="Rename local variable 'outFile' in 'org.eclipse.mylyn.context.core.AbstractContextStore.loadContext(...)' to 'zipFile'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextStore.loadContext(String, File).outFile'
- Renamed element: 'outFile'
- Update references to refactored element" description="Rename local variable 'outFile'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~loadContext~QString;~QFile;@outFile!2272!2283!2277!2283!QFile;" name="zipFile" references="true" stamp="1211418365932" version="1.0"/>
<refactoring comment="Push down members from 'org.eclipse.mylyn.context.core.AbstractContextStore'
- Original project: 'org.eclipse.mylyn.context.core'
- Original elements:
 org.eclipse.mylyn.context.core.AbstractContextStore.listeners
 org.eclipse.mylyn.context.core.AbstractContextStore.addListener(...)
 org.eclipse.mylyn.context.core.AbstractContextStore.removeListener(...)
- Pushed members:
 org.eclipse.mylyn.context.core.AbstractContextStore.listeners
 org.eclipse.mylyn.context.core.AbstractContextStore.addListener(...)
 org.eclipse.mylyn.context.core.AbstractContextStore.removeListener(...)" description="Push down" element1="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore^listeners" element2="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~addListener~QIContextStoreListener;" element3="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~removeListener~QIContextStoreListener;" flags="589830" id="org.eclipse.jdt.ui.push.down" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore" push1="true" push2="true" push3="true" stamp="1211421565301" version="1.0"/>
<refactoring comment="Push down 'org.eclipse.mylyn.context.core.AbstractContextStore.contextStoreMoved(...)' from 'org.eclipse.mylyn.context.core.AbstractContextStore'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextStore.contextStoreMoved(...)'
- Pushed members:
 org.eclipse.mylyn.context.core.AbstractContextStore.contextStoreMoved(...)" description="Push down 'contextStoreMoved'" element1="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~contextStoreMoved~QFile;" flags="589830" id="org.eclipse.jdt.ui.push.down" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore" push1="true" stamp="1211421576487" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.AbstractContextStore.init(...)' to 'setContextDirectory'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextStore.init(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.AbstractContextStore.setContextDirectory(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'init'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore~init~QFile;" name="setContextDirectory" references="true" stamp="1211421662315" version="1.0"/>
<refactoring comment="Rename local variable 'contextDirectory' in 'org.eclipse.mylyn.internal.context.core.LocalContextStore.setContextDirectory(...)' to 'directory'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.LocalContextStore.setContextDirectory(File).contextDirectory'
- Renamed element: 'contextDirectory'
- Update references to refactored element" description="Rename local variable 'contextDirectory'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{LocalContextStore.java[LocalContextStore~setContextDirectory~QFile;@contextDirectory!2119!2139!2124!2139!QFile;" name="directory" references="true" stamp="1211421669081" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.context.core.AbstractContextStore' to 'IContextStore'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextStore'
- Renamed element: 'org.eclipse.mylyn.context.core.IContextStore'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'AbstractContextStore'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.core{AbstractContextStore.java[AbstractContextStore" matchStrategy="1" name="IContextStore" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1211421722902" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IContextStore.loadContext(...)' to 'importContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IContextStore.loadContext(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.IContextStore.importContext(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'loadContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IContextStore.java[IContextStore~loadContext~QString;~QFile;" name="importContext" references="true" stamp="1211421941630" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IContextStore.hasSavedContext(...)' to 'hasContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IContextStore.hasSavedContext(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.IContextStore.hasContext(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasSavedContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IContextStore.java[IContextStore~hasSavedContext~QString;" name="hasContext" references="true" stamp="1211424075101" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IContextStoreListener.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.context.core{IContextStoreListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211432530529" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IInteractionContextManager.resetActivityHistory()' to 'resetActivityMetaContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.resetActivityHistory()'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.resetActivityMetaContext()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'resetActivityHistory'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager~resetActivityHistory" name="resetActivityMetaContext" references="true" stamp="1211433510677" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_DEACTIVATED' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_DEACTIVATED'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_DELTA_DEACTIVATED'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_DEACTIVATED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433946825" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_ACTIVATED' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_ACTIVATED'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_DELTA_ACTIVATED'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_ACTIVATED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433952893" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_ADDED' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_ADDED'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_DELTA_ADDED'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_ADDED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433959484" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_REMOVED' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_REMOVED'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_DELTA_REMOVED'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_REMOVED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433966359" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_STARTED' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_STARTED'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_DELTA_STARTED'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_STARTED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433981309" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_STOPPED' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_DELTA_STOPPED'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_DELTA_STOPPED'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_DELTA_STOPPED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433987264" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_HANDLE_NONE' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_HANDLE_NONE'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_HANDLE_NONE'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_HANDLE_NONE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211433994919" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_ORIGINID_WORKBENCH'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_ORIGINID_WORKBENCH" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434000939" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_ORIGINID_OS' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_ORIGINID_OS'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_ORIGINID_OS'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_ORIGINID_OS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434005583" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_ORIGINID_USER' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_ORIGINID_USER'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_ORIGINID_USER'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_ORIGINID_USER" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434010514" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_STRUCTUREKIND_LIFECYCLE' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_STRUCTUREKIND_LIFECYCLE'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_STRUCTUREKIND_LIFECYCLE'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_STRUCTUREKIND_LIFECYCLE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434017430" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_STRUCTUREKIND_TIMING'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_STRUCTUREKIND_TIMING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434023725" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_STRUCTUREKIND_ACTIVATION' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.ACTIVITY_STRUCTUREKIND_ACTIVATION'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_STRUCTUREKIND_ACTIVATION'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^ACTIVITY_STRUCTUREKIND_ACTIVATION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434030180" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.PROPERTY_CONTEXT_ACTIVE' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.PROPERTY_CONTEXT_ACTIVE'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'PROPERTY_CONTEXT_ACTIVE'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^PROPERTY_CONTEXT_ACTIVE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434038297" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_FILENAME_ENCODING' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_FILENAME_ENCODING'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'CONTEXT_FILENAME_ENCODING'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^CONTEXT_FILENAME_ENCODING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434054359" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_HISTORY_FILE_NAME' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_HISTORY_FILE_NAME'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'CONTEXT_HISTORY_FILE_NAME'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^CONTEXT_HISTORY_FILE_NAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434071815" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.OLD_CONTEXT_HISTORY_FILE_NAME' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.OLD_CONTEXT_HISTORY_FILE_NAME'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'OLD_CONTEXT_HISTORY_FILE_NAME'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^OLD_CONTEXT_HISTORY_FILE_NAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434078308" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTAINMENT_PROPAGATION_ID' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTAINMENT_PROPAGATION_ID'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'CONTAINMENT_PROPAGATION_ID'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^CONTAINMENT_PROPAGATION_ID" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434086908" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_FILE_EXTENSION' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_FILE_EXTENSION'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'CONTEXT_FILE_EXTENSION'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^CONTEXT_FILE_EXTENSION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434106581" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_FILE_EXTENSION_OLD' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.CONTEXT_FILE_EXTENSION_OLD'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'CONTEXT_FILE_EXTENSION_OLD'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^CONTEXT_FILE_EXTENSION_OLD" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434112425" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.core.IInteractionContextManager.SOURCE_ID_DECAY' to 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.SOURCE_ID_DECAY'
- Destination type: 'org.eclipse.mylyn.internal.context.core.InteractionContextManager'" delegate="false" deprecate="true" description="Move member 'SOURCE_ID_DECAY'" element1="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager^SOURCE_ID_DECAY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextManager.java[InteractionContextManager" stamp="1211434121696" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IInteractionContextManager.delete(...)' to 'deleteElement'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.delete(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.deleteElement(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'delete'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager~delete~QIInteractionElement;" name="deleteElement" references="true" stamp="1211434445971" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IInteractionContextManager.getInterestingDocuments(...)' to 'getActiveDocuments'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.getInterestingDocuments(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.getActiveDocuments(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getInterestingDocuments'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager~getInterestingDocuments~QIInteractionContext;" name="getActiveDocuments" references="true" stamp="1211434828085" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.IInteractionContextManager.getInterestingDocuments()' to 'getActiveDocuments'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.getInterestingDocuments()'
- Renamed element: 'org.eclipse.mylyn.context.core.IInteractionContextManager.getActiveDocuments()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getInterestingDocuments'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{IInteractionContextManager.java[IInteractionContextManager~getInterestingDocuments" name="getActiveDocuments" references="true" stamp="1211434835156" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..5534018
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,43 @@
+1211324063084 Rename local variable 'node'
+1211398787591 Rename method 'hasContext'
+1211401446691 Change method 'copyContext'
+1211404394981 Rename method 'saveActivityContext'
+1211409981306 Rename local variable 'context_listener'
+1211410177338 Delete element
+1211412692818 Rename local variable 'contextDirectory'
+1211418203305 Rename method 'readContextFromXML'
+1211418209156 Rename method 'readContextFromXML'
+1211418365932 Rename local variable 'outFile'
+1211421565301 Push down
+1211421576487 Push down 'contextStoreMoved'
+1211421662315 Rename method 'init'
+1211421669081 Rename local variable 'contextDirectory'
+1211421722902 Rename type 'AbstractContextStore'
+1211421941630 Rename method 'loadContext'
+1211424075101 Rename method 'hasSavedContext'
+1211432530529 Move compilation unit
+1211433510677 Rename method 'resetActivityHistory'
+1211433946825 Move member 'ACTIVITY_DELTA_DEACTIVATED'
+1211433952893 Move member 'ACTIVITY_DELTA_ACTIVATED'
+1211433959484 Move member 'ACTIVITY_DELTA_ADDED'
+1211433966359 Move member 'ACTIVITY_DELTA_REMOVED'
+1211433981309 Move member 'ACTIVITY_DELTA_STARTED'
+1211433987264 Move member 'ACTIVITY_DELTA_STOPPED'
+1211433994919 Move member 'ACTIVITY_HANDLE_NONE'
+1211434000939 Move member 'ACTIVITY_ORIGINID_WORKBENCH'
+1211434005583 Move member 'ACTIVITY_ORIGINID_OS'
+1211434010514 Move member 'ACTIVITY_ORIGINID_USER'
+1211434017430 Move member 'ACTIVITY_STRUCTUREKIND_LIFECYCLE'
+1211434023725 Move member 'ACTIVITY_STRUCTUREKIND_TIMING'
+1211434030180 Move member 'ACTIVITY_STRUCTUREKIND_ACTIVATION'
+1211434038297 Move member 'PROPERTY_CONTEXT_ACTIVE'
+1211434054359 Move member 'CONTEXT_FILENAME_ENCODING'
+1211434071815 Move member 'CONTEXT_HISTORY_FILE_NAME'
+1211434078308 Move member 'OLD_CONTEXT_HISTORY_FILE_NAME'
+1211434086908 Move member 'CONTAINMENT_PROPAGATION_ID'
+1211434106581 Move member 'CONTEXT_FILE_EXTENSION'
+1211434112425 Move member 'CONTEXT_FILE_EXTENSION_OLD'
+1211434121696 Move member 'SOURCE_ID_DECAY'
+1211434445971 Rename method 'delete'
+1211434828085 Rename method 'getInterestingDocuments'
+1211434835156 Rename method 'getInterestingDocuments'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..b1017ce
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.context.core.IDegreeOfSeparation.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.context.core{IDegreeOfSeparation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212639968607" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..724a7dd
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1 @@
+1212639968607 Move compilation unit
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..70dcaa1
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213246271403" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'file' in 'org.eclipse.mylyn.internal.context.core.LocalContextStore.importContext(...)' to 'sourceFile'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.LocalContextStore.importContext(String, File).file'
- Renamed element: 'file'
- Update references to refactored element" description="Rename local variable 'file'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{LocalContextStore.java[LocalContextStore~importContext~QString;~QFile;@file!2848!2856!2853!2856!QFile;" name="sourceFile" references="true" stamp="1213249345090" version="1.0"/>
<refactoring comment="Rename local variable 'sourceFile' in 'org.eclipse.mylyn.internal.context.core.LocalContextStore.importContext(...)' to 'fromFile'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.LocalContextStore.importContext(String, File).sourceFile'
- Renamed element: 'sourceFile'
- Update references to refactored element" description="Rename local variable 'sourceFile'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{LocalContextStore.java[LocalContextStore~importContext~QString;~QFile;@sourceFile!2848!2862!2853!2862!QFile;" name="fromFile" references="true" stamp="1213249352611" version="1.0"/>
<refactoring comment="Rename local variable 'file' in 'org.eclipse.mylyn.internal.context.core.LocalContextStore.loadContext(...)' to 'fromFile'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.LocalContextStore.loadContext(String, File, IInteractionContextScaling).file'
- Renamed element: 'file'
- Update references to refactored element" description="Rename local variable 'file'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{LocalContextStore.java[LocalContextStore~loadContext~QString;~QFile;~QIInteractionContextScaling;@file!3875!3883!3880!3883!QFile;" name="fromFile" references="true" stamp="1213249473234" version="1.0"/>
<refactoring comment="Rename local variable 'file' in 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXml(...)' to 'fromFile'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXml(String, File, IInteractionContextScaling).file'
- Renamed element: 'file'
- Update references to refactored element" description="Rename local variable 'file'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextExternalizer.java[InteractionContextExternalizer~readContextFromXml~QString;~QFile;~QIInteractionContextScaling;@file!4174!4182!4179!4182!QFile;" name="fromFile" references="true" stamp="1213249638174" version="1.0"/>
<refactoring comment="Rename local variable 'file' in 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXml(...)' to 'fromFile'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer.readContextFromXml(String, File, IInteractionContextReader, IInteractionContextScaling).file'
- Renamed element: 'file'
- Update references to refactored element" description="Rename local variable 'file'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{InteractionContextExternalizer.java[InteractionContextExternalizer~readContextFromXml~QString;~QFile;~QIInteractionContextReader;~QIInteractionContextScaling;@file!4437!4445!4442!4445!QFile;" name="fromFile" references="true" stamp="1213249667293" version="1.0"/>
<refactoring comment="Rename local variable 'sourceContext' in 'org.eclipse.mylyn.internal.context.core.LocalContextStore.cloneContext(...)' to 'readContext'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.LocalContextStore.cloneContext(String, String).sourceContext'
- Renamed element: 'sourceContext'
- Update references to refactored element" description="Rename local variable 'sourceContext'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{LocalContextStore.java[LocalContextStore~cloneContext~QString;~QString;@sourceContext!6712!6887!6731!6743!QInteractionContext;" name="readContext" references="true" stamp="1213251816499" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..4d7b56e
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,7 @@
+1213246271403 Rename field 'PLUGIN_ID'
+1213249345090 Rename local variable 'file'
+1213249352611 Rename local variable 'sourceFile'
+1213249473234 Rename local variable 'file'
+1213249638174 Rename local variable 'file'
+1213249667293 Rename local variable 'file'
+1213251816499 Rename local variable 'sourceContext'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/9/36/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2008/9/36/refactorings.history
new file mode 100644
index 0000000..870372a
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/9/36/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename local variable 'baseContent' in 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.addShadowsContent(...)' to 'baseContentType'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.addShadowsContent(String, String).baseContent'
- Renamed element: 'baseContent'
- Update references to refactored element" description="Rename local variable 'baseContent'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin~addShadowsContent~QString;~QString;@baseContent!4627!4644!4634!4644!QString;" name="baseContentType" references="true" stamp="1220581775168" version="1.0"/>
<refactoring comment="Rename local variable 'shadowedByContent' in 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.addShadowsContent(...)' to 'shadowedByContentType'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.addShadowsContent(String, String).shadowedByContent'
- Renamed element: 'shadowedByContent'
- Update references to refactored element" description="Rename local variable 'shadowedByContent'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin~addShadowsContent~QString;~QString;@shadowedByContent!4651!4674!4658!4674!QString;" name="shadowedByContentType" references="true" stamp="1220581783290" version="1.0"/>
<refactoring comment="Rename field 'baseContentToShadowedByContentMap' in 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin' to 'contentTypeToShadowMap'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.baseContentToShadowedByContentMap'
- Renamed element: 'org.eclipse.mylyn.internal.context.core.ContextCorePlugin.contentTypeToShadowMap'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'baseContentToShadowedByContentMap'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.core{ContextCorePlugin.java[ContextCorePlugin^baseContentToShadowedByContentMap" name="contentTypeToShadowMap" references="true" setter="true" stamp="1220581823250" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2008/9/36/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2008/9/36/refactorings.index
new file mode 100644
index 0000000..340a4a1
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2008/9/36/refactorings.index
@@ -0,0 +1,3 @@
+1220581775168 Rename local variable 'baseContent'
+1220581783290 Rename local variable 'shadowedByContent'
+1220581823250 Rename field 'baseContentToShadowedByContentMap'
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2009/5/18/refactorings.history b/org.eclipse.mylyn.context.core/.refactorings/2009/5/18/refactorings.history
new file mode 100644
index 0000000..5fae5dd
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2009/5/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.context.core.AbstractContextListener.contextUpdated(...)' to 'contextChanged'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextListener.contextUpdated(...)'
- Renamed element: 'org.eclipse.mylyn.context.core.AbstractContextListener.contextChanged(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'contextUpdated'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.core{AbstractContextListener.java[AbstractContextListener~contextUpdated~QContextChangeEvent;" name="contextChanged" references="true" stamp="1241196444890" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.context.core.AbstractContextListener.ContextChangeEvent' in 'org.eclipse.mylyn.context.core.AbstractContextListener' to top level type
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextListener.ContextChangeEvent'" description="Convert member type 'ContextChangeEvent' to top level" field="false" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.context.core{AbstractContextListener.java[AbstractContextListener[ContextChangeEvent" mandatory="false" possible="true" stamp="1241197005843" version="1.0"/>
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.context.core.ContextChangeEvent'
- Original project: 'org.eclipse.mylyn.context.core'
- Destination element: 'org.eclipse.mylyn.context.core.ContextChangeEvent'
- Original element: 'org.eclipse.mylyn.context.core.AbstractContextListener.ContextChangeKind'
- Textual move only
- Update references to refactored element" description="Move type" destination="/src<org.eclipse.mylyn.context.core{ContextChangeEvent.java[ContextChangeEvent" element1="/src<org.eclipse.mylyn.context.core{AbstractContextListener.java[AbstractContextListener[ContextChangeKind" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1241197018828" version="1.0"/>
<refactoring comment="Rename enum constant 'PRE_ACTIVATE' of 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind' to 'PRE_ACTIVATED'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.PRE_ACTIVATE'
- Renamed element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.PRE_ACTIVATED'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'PRE_ACTIVATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.context.core{ContextChangeEvent.java[ContextChangeEvent[ContextChangeKind^PRE_ACTIVATE" name="PRE_ACTIVATED" references="true" setter="false" stamp="1241211583906" textual="false" version="1.0"/>
<refactoring comment="Rename enum constant 'ACTIVATE' of 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind' to 'ACTIVATED'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.ACTIVATE'
- Renamed element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.ACTIVATED'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'ACTIVATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.context.core{ContextChangeEvent.java[ContextChangeEvent[ContextChangeKind^ACTIVATE" name="ACTIVATED" references="true" setter="false" stamp="1241211595421" textual="false" version="1.0"/>
<refactoring comment="Rename enum constant 'DEACTIVATE' of 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind' to 'DEACTIVATED'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.DEACTIVATE'
- Renamed element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.DEACTIVATED'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'DEACTIVATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.context.core{ContextChangeEvent.java[ContextChangeEvent[ContextChangeKind^DEACTIVATE" name="DEACTIVATED" references="true" setter="false" stamp="1241211600281" textual="false" version="1.0"/>
<refactoring comment="Rename enum constant 'CLEAR' of 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind' to 'CLEARED'
- Original project: 'org.eclipse.mylyn.context.core'
- Original element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.CLEAR'
- Renamed element: 'org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind.CLEARED'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'CLEAR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.context.core{ContextChangeEvent.java[ContextChangeEvent[ContextChangeKind^CLEAR" name="CLEARED" references="true" setter="false" stamp="1241211605437" textual="false" version="1.0"/>
<refactoring comment="Extract local variable 'activeContext' from expression 'ContextCore.getContextManager().getActiveContext()'
- Original project: 'org.eclipse.mylyn.context.core'
- Variable name: 'activeContext'
- Destination method: 'org.eclipse.mylyn.context.core.ContextChangeEvent.isActiveContext()'
- Variable expression: 'ContextCore.getContextManager().getActiveContext()'
- Replace occurrences of expression with variable" description="Extract local variable 'activeContext'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.context.core{ContextChangeEvent.java" name="activeContext" replace="true" selection="1925 50" stamp="1241217024468" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/.refactorings/2009/5/18/refactorings.index b/org.eclipse.mylyn.context.core/.refactorings/2009/5/18/refactorings.index
new file mode 100644
index 0000000..77e1eaa
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.refactorings/2009/5/18/refactorings.index
@@ -0,0 +1,8 @@
+1241196444890 Rename method 'contextUpdated'
+1241197005843 Convert member type 'ContextChangeEvent' to top level
+1241197018828 Move type
+1241211583906 Rename enum constant 'PRE_ACTIVATE'
+1241211595421 Rename enum constant 'ACTIVATE'
+1241211600281 Rename enum constant 'DEACTIVATE'
+1241211605437 Rename enum constant 'CLEAR'
+1241217024468 Extract local variable 'activeContext'
diff --git a/org.eclipse.mylyn.context.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.context.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.context.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.context.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.context.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.context.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.context.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.context.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.context.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.context.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.context.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.context.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d5b2a51
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.context.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.context.core.ContextCorePlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.internal.context.core;x-friends:="org.eclipse.mylyn.context.ui"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ClassPath: .
diff --git a/org.eclipse.mylyn.context.core/about.html b/org.eclipse.mylyn.context.core/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/build-user.xml b/org.eclipse.mylyn.context.core/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/build.properties b/org.eclipse.mylyn.context.core/build.properties
new file mode 100644
index 0000000..9ba2c22
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = plugin.xml,\
+ about.html,\
+ plugin.properties,\
+ META-INF/,\
+ .
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.context.core/plugin.properties b/org.eclipse.mylyn.context.core/plugin.properties
new file mode 100644
index 0000000..87ff943
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/plugin.properties
@@ -0,0 +1,2 @@
+Bundle-Name = Mylyn Context Core
+Bundle-Vendor = Eclipse Mylyn
diff --git a/org.eclipse.mylyn.context.core/plugin.xml b/org.eclipse.mylyn.context.core/plugin.xml
new file mode 100644
index 0000000..e09de97
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/plugin.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="bridges" name="bridges" schema="schema/bridges.exsd"/>
+ <extension-point id="internalBridges" name="Internal Bridges" schema="schema/internalBridges.exsd"/>
+ <extension-point id="relationProviders" name="relationProviders" schema="schema/relationProviders.exsd"/>
+</plugin>
diff --git a/org.eclipse.mylyn.context.core/schema/bridges.exsd b/org.eclipse.mylyn.context.core/schema/bridges.exsd
new file mode 100644
index 0000000..a1aa230
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/schema/bridges.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.context.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.context.core" id="bridges" name="bridges"/>
+ </appInfo>
+ <documentation>
+ Structure Bridges connect the interaction context model to domain-specific artifacts, such as the Java classes and methods being worked on by a programmer. For more information please see: http://wiki.eclipse.org/index.php/Mylyn_Integrator_Reference#Context_API
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="structureBridge" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="structureBridge">
+ <complexType>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.context.core.AbstractContextStructureBridge"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="parentContentType" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+
+
+
+
+</schema>
diff --git a/org.eclipse.mylyn.context.core/schema/internalBridges.exsd b/org.eclipse.mylyn.context.core/schema/internalBridges.exsd
new file mode 100644
index 0000000..2ee4579
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/schema/internalBridges.exsd
@@ -0,0 +1,89 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.context.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.context.core" id="internalBridges" name="Internal Bridges"/>
+ </appInfo>
+ <documentation>
+ Bridges extension point for internal use only.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="shadow"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="shadow">
+ <annotation>
+ <documentation>
+ Signifies that one bridge shadows another. The bridge specified in shadowedByContent (if it exists) will always be used instead of the bridge specified in baseContent.
+
+The values correspond to the "name" attribute of the bridge.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="baseContent" type="string" use="required">
+ <annotation>
+ <documentation>
+ The bridge to be hidden by shadowedByContent.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="shadowedByContent" type="string" use="required">
+ <annotation>
+ <documentation>
+ The bridge that hides baseContent.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 3.0
+ </documentation>
+ </annotation>
+
+
+
+
+
+</schema>
diff --git a/org.eclipse.mylyn.context.core/schema/relationProviders.exsd b/org.eclipse.mylyn.context.core/schema/relationProviders.exsd
new file mode 100644
index 0000000..cab85fd
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/schema/relationProviders.exsd
@@ -0,0 +1,116 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.context.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.context.core" id="relationProviders" name="relationProviders"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="provider"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="provider">
+ <complexType>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.context.core.AbstractRelationProvider"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="contentType" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/AbstractContextListener.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/AbstractContextListener.java
new file mode 100644
index 0000000..ef87af3
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/AbstractContextListener.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+
+/**
+ * Override {@link #contextChanged(ContextChangeEvent)} to be notified of context change events.
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @since 3.0
+ */
+public abstract class AbstractContextListener {
+
+ /**
+ * Invoked before the context is activated.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void contextPreActivated(IInteractionContext context) {
+ }
+
+ /**
+ * Invoked after the context is activated.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void contextActivated(IInteractionContext context) {
+ }
+
+ /**
+ * Invoked after the context is deactivated.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void contextDeactivated(IInteractionContext context) {
+ }
+
+ /**
+ * The context has been cleared, typically done by the user.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void contextCleared(IInteractionContext context) {
+ }
+
+ /**
+ * The interest level of one or more elements has changed. The last element in the list is the element invoking the
+ * change.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void interestChanged(List<IInteractionElement> elements) {
+ }
+
+ /**
+ * An element with landmark interest has been added to the context.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void landmarkAdded(IInteractionElement element) {
+ }
+
+ /**
+ * An element with landmark interest has been removed from the task context.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void landmarkRemoved(IInteractionElement element) {
+ }
+
+ /**
+ * One or more elements have been deleted from the task context.
+ *
+ * @since 3.0
+ * @deprecated use {@link #contextChanged(ContextChangeEvent)} instead
+ */
+ @Deprecated
+ public void elementsDeleted(List<IInteractionElement> elements) {
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case PRE_ACTIVATED:
+ contextPreActivated(event.getContext());
+ break;
+ case ACTIVATED:
+ contextActivated(event.getContext());
+ break;
+ case DEACTIVATED:
+ contextDeactivated(event.getContext());
+ break;
+ case CLEARED:
+ contextCleared(event.getContext());
+ break;
+ case INTEREST_CHANGED:
+ interestChanged(event.getElements());
+ break;
+ case LANDMARKS_ADDED:
+ for (IInteractionElement element : event.getElements()) {
+ landmarkAdded(element);
+ }
+ break;
+ case LANDMARKS_REMOVED:
+ for (IInteractionElement element : event.getElements()) {
+ landmarkRemoved(element);
+ }
+ break;
+ case ELEMENTS_DELETED:
+ elementsDeleted(event.getElements());
+ break;
+ default:
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN,
+ "Unknown context changed event type")); //$NON-NLS-1$
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/AbstractContextStructureBridge.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/AbstractContextStructureBridge.java
new file mode 100644
index 0000000..4aa343b
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/AbstractContextStructureBridge.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.List;
+
+/**
+ * Maps between domain elements (e.g. Java) and interaction context model elements.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractContextStructureBridge {
+
+ protected String parentContentType = null;
+
+ /**
+ * Used for delagating to when the parent of an element is known by another bridge.
+ */
+ public void setParentContentType(String contentType) {
+ this.parentContentType = contentType;
+ }
+
+ public abstract String getContentType();
+
+ /**
+ * A workspace-unique and robust String identifier for a structured element. For example, in Java these are the
+ * IJavaElement's handle identifier. For XML, this could be an xpath, but due to the fact that xpaths rely on
+ * element ordering for identity they are not robust to element order switching.
+ *
+ * @return null if the given object does not participate in the task context
+ */
+ public abstract String getHandleIdentifier(Object object);
+
+ /**
+ * @since 3.2
+ * @param allowChildBridgeHandles
+ * true if the structure bridge can return the object handle for a child bridge (for the
+ * ResourceStructureBridge)
+ */
+ public String getParentHandle(String handle, boolean allowChildBridgeHandles) {
+ return getParentHandle(handle);
+ }
+
+ /**
+ * @return The handle identifier of the element that is the parent of this element in the containment hierarchy, or
+ * null if no such parent exists.
+ */
+ public abstract String getParentHandle(String handle);
+
+ public abstract Object getObjectForHandle(String handle);
+
+ public abstract List<String> getChildHandles(String handle);
+
+ /**
+ * @return The name or a null String(""). Can't be null since the views displaying the context can't handle null
+ * names
+ */
+ public abstract String getLabel(Object object);
+
+ public abstract boolean canBeLandmark(String handle);
+
+ public abstract boolean acceptsObject(Object object);
+
+ /**
+ * @return false for objects that can not be filtered
+ */
+ public abstract boolean canFilter(Object element);
+
+ /**
+ * @return true if this is a resource that can be opened by an editor (i.e. false for a directory, or a Java method)
+ */
+ public abstract boolean isDocument(String handle);
+
+ /**
+ * TODO 4.0: either remove of make marker coupling explicit
+ *
+ * @param resource
+ * can be anything that has an element accessible via an offset, e.g. a file with a character offset
+ */
+ public abstract String getHandleForOffsetInObject(Object resource, int offset);
+
+ /**
+ * Used for switching kinds based on parent handles
+ */
+ public abstract String getContentType(String elementHandle);
+
+ public String getParentContentType() {
+ return parentContentType;
+ }
+
+ public Object getAdaptedParent(Object object) {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/ContextChangeEvent.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/ContextChangeEvent.java
new file mode 100644
index 0000000..9f48a41
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/ContextChangeEvent.java
@@ -0,0 +1,90 @@
+package org.eclipse.mylyn.context.core;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Shawn Minto
+ * @since 3.2
+ */
+public class ContextChangeEvent {
+
+ /**
+ * @author Shawn Minto
+ * @since 3.2
+ */
+ public enum ContextChangeKind {
+ PRE_ACTIVATED, ACTIVATED, DEACTIVATED, CLEARED, INTEREST_CHANGED, LANDMARKS_ADDED, LANDMARKS_REMOVED, ELEMENTS_DELETED;
+ }
+
+ private final String contextHandle;
+
+ private final IInteractionContext context;
+
+ private final ContextChangeKind eventKind;
+
+ private final List<IInteractionElement> elements;
+
+ public ContextChangeEvent(ContextChangeKind eventKind, String contextHandle, IInteractionContext context,
+ List<IInteractionElement> elements) {
+ Assert.isNotNull(eventKind);
+ this.contextHandle = contextHandle;
+ this.context = context;
+ this.eventKind = eventKind;
+ if (elements == null) {
+ this.elements = Collections.emptyList();
+ } else {
+ this.elements = elements;
+ }
+ }
+
+ /**
+ * The Type of context event that occurred
+ *
+ * @since 3.2
+ */
+ public ContextChangeKind getEventKind() {
+ return eventKind;
+ }
+
+ /**
+ * The elements that were manipulated for the event (may be empty)
+ *
+ * @since 3.2
+ */
+ public List<IInteractionElement> getElements() {
+ return elements;
+ }
+
+ /**
+ * The handle of the context that was changed (Can be null if a composite context with multiple
+ * IInteractionContext's is changed)
+ *
+ * @since 3.2
+ */
+ public String getContextHandle() {
+ return contextHandle;
+ }
+
+ /**
+ * The context that was changed (Can be null e.g. context deleted)
+ *
+ * @since 3.2
+ */
+ public IInteractionContext getContext() {
+ return context;
+ }
+
+ /**
+ * Utility for whether the manipulated context is the active one
+ *
+ * @since 3.2
+ */
+ public boolean isActiveContext() {
+ IInteractionContext activeContext = ContextCore.getContextManager().getActiveContext();
+ return activeContext != null && activeContext.getHandleIdentifier() != null
+ && activeContext.getHandleIdentifier().equals(contextHandle);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/ContextCore.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/ContextCore.java
new file mode 100644
index 0000000..5a17594
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/ContextCore.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public final class ContextCore {
+
+ public static final String CONTENT_TYPE_RESOURCE = "resource"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static IInteractionContextManager getContextManager() {
+ return ContextCorePlugin.getContextManager();
+ }
+
+ public static IInteractionContextScaling getCommonContextScaling() {
+ return ContextCorePlugin.getDefault().getCommonContextScaling();
+ }
+
+ /**
+ * @return null if there are no bridges loaded, null bridge otherwise
+ */
+ public static AbstractContextStructureBridge getStructureBridge(Object object) {
+ return ContextCorePlugin.getDefault().getStructureBridge(object);
+ }
+
+ public static AbstractContextStructureBridge getStructureBridge(String contentType) {
+ return ContextCorePlugin.getDefault().getStructureBridge(contentType);
+ }
+
+ public static Set<String> getContentTypes() {
+ return ContextCorePlugin.getDefault().getContentTypes();
+ }
+
+ public static Set<String> getChildContentTypes(String contentType) {
+ return ContextCorePlugin.getDefault().getChildContentTypes(contentType);
+ }
+
+ public static IContextStore getContextStore() {
+ return ContextCorePlugin.getContextStore();
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IContextStore.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IContextStore.java
new file mode 100644
index 0000000..654a47b
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IContextStore.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * File-based store used for writing Mylyn-specific date such as the task list and task contexts (e.g.
+ * workspace/.metadata/.mylyn folder).
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IContextStore {
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean hasContext(String handleIdentifier);
+
+ /**
+ * @param zipFile
+ * A zip file that contains a context with the specified handle identifier in its root.
+ * @return null if the import failed
+ * @throws CoreException
+ * @since 3.0
+ */
+ public abstract IInteractionContext importContext(String handleIdentifier, File zipFile) throws CoreException;
+
+ /**
+ * Creates a new context if a source context was not found.
+ *
+ * @since 3.0
+ */
+ public abstract IInteractionContext cloneContext(String sourceHandleIdentifier, String destinationHandleIdentifier);
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IDegreeOfInterest.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IDegreeOfInterest.java
new file mode 100644
index 0000000..9aa7dbc
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IDegreeOfInterest.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.List;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Abstraction for capturing the interest level of elements and relations based on interaction events.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IDegreeOfInterest {
+
+ public abstract boolean isPropagated();
+
+ public boolean isPredicted();
+
+ public abstract boolean isLandmark();
+
+ public abstract boolean isInteresting();
+
+ public abstract float getEncodedValue();
+
+ public float getDecayValue();
+
+ public abstract float getValue();
+
+ public abstract List<InteractionEvent> getEvents();
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IImplicitlyIntersting.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IImplicitlyIntersting.java
new file mode 100644
index 0000000..ad1f5c4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IImplicitlyIntersting.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+/**
+ * Tag interface to indicate elements that should not be filtered as uninteresting.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface IImplicitlyIntersting {
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContext.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContext.java
new file mode 100644
index 0000000..a0fb481
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContext.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * A model of task context weighted by interaction based on frequency and recency of access, as determined by the
+ * degree-of-interest weighting mechanism.
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author David Green bug 257977 isInteresting
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @since 2.0
+ */
+public interface IInteractionContext {
+
+ /**
+ * Returns the unique handle identifier of the context.
+ *
+ * @return null if no unique handle, e.g. if a composite context
+ * @since 2.0
+ */
+ public abstract String getHandleIdentifier();
+
+ /**
+ * Returns a list of all interesting interaction elements. Modifying the list will not affect the context.
+ *
+ * @since 2.0
+ */
+ public abstract List<InteractionEvent> getInteractionHistory();
+
+ /**
+ * indicate if the interaction element identified by the given handle is interesting
+ *
+ * @param elementHandle
+ * the {@link IInteractionElement#getHandleIdentifier() handle identifier}
+ *
+ * @return true if an {@link #getInteresting() interesting} interaction element exists with the given handle
+ * @since 3.2
+ */
+ public boolean isInteresting(String elementHandle);
+
+ /**
+ * Returns a list of all interesting interaction elements. Modifying the list will not affect the context.
+ *
+ * @since 2.0
+ */
+ public List<IInteractionElement> getInteresting();
+
+ /**
+ * Returns a list of all interaction elements that are landmarks. Modifying the list will not affect the context.
+ *
+ * @since 2.2
+ */
+ public List<IInteractionElement> getLandmarks();
+
+ /**
+ *
+ * @since 2.0
+ */
+ public abstract IInteractionElement get(String element);
+
+ /**
+ *
+ * @since 2.0
+ */
+ public abstract IInteractionElement getActiveNode();
+
+ /**
+ *
+ * @since 2.0
+ */
+ public abstract void delete(IInteractionElement element);
+
+ /**
+ * @since 3.2
+ */
+ public abstract void delete(Collection<IInteractionElement> elements);
+
+ /**
+ * @since 2.0
+ */
+ public abstract void updateElementHandle(IInteractionElement element, String newHandle);
+
+ /**
+ * Returns a list of all interaction elements. Modifying the list will not affect the context.
+ *
+ * @since 2.0
+ */
+ public abstract List<IInteractionElement> getAllElements();
+
+ /**
+ * @since 3.0
+ */
+ public IInteractionContextScaling getScaling();
+
+ /**
+ * @since 2.2
+ */
+ public String getContentLimitedTo();
+
+ /**
+ * @since 2.2
+ */
+ public void setContentLimitedTo(String contentLimitedTo);
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContextManager.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContextManager.java
new file mode 100644
index 0000000..00f34f1
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContextManager.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ * @noimplement
+ */
+public interface IInteractionContextManager {
+
+ /**
+ * @return null if the element handle is null or if the element is not found in the active task context.
+ */
+ public abstract IInteractionElement getElement(String elementHandle);
+
+ public abstract void addListener(AbstractContextListener listener);
+
+ public abstract void removeListener(AbstractContextListener listener);
+
+ public abstract void activateContext(String handleIdentifier);
+
+ public abstract void deactivateContext(String handleIdentifier);
+
+ public abstract void deleteContext(String handleIdentifier);
+
+ public abstract IInteractionContext getActiveContext();
+
+ public abstract Set<IInteractionElement> getActiveLandmarks();
+
+ public abstract Set<IInteractionElement> getActiveDocuments(IInteractionContext context);
+
+ public abstract void updateHandle(IInteractionElement element, String newHandle);
+
+ public abstract void deleteElement(IInteractionElement element);
+
+ /**
+ * @since 3.2
+ */
+ public abstract void deleteElements(Collection<IInteractionElement> elements);
+
+ public IInteractionElement getActiveElement();
+
+ public IInteractionElement processInteractionEvent(InteractionEvent event);
+
+ public boolean isContextActive();
+
+ /**
+ * Lazily loads set of handles with corresponding contexts.
+ */
+ public boolean hasContext(String handleIdentifier);
+
+ public abstract boolean isContextActivePropertySet();
+
+ public abstract boolean isContextCapturePaused();
+
+ /**
+ * NOTE: If pausing ensure to restore to original state.
+ */
+ public void setContextCapturePaused(boolean paused);
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContextScaling.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContextScaling.java
new file mode 100644
index 0000000..2c345b4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionContextScaling.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ *
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IInteractionContextScaling {
+
+ public abstract float get(InteractionEvent.Kind kind);
+
+ public abstract float getDecay();
+
+ public abstract float getInteresting();
+
+ public abstract float getLandmark();
+
+ public abstract float getForcedLandmark();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionElement.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionElement.java
new file mode 100644
index 0000000..1948145
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionElement.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Collection;
+
+import org.eclipse.mylyn.internal.context.core.InteractionContextRelation;
+
+/**
+ * Virtual proxy for a structured element in the contet model.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IInteractionElement extends IInteractionObject {
+
+ public abstract String getHandleIdentifier();
+
+ public abstract void setHandleIdentifier(String handle);
+
+ public abstract IInteractionContext getContext();
+
+ public abstract Collection<InteractionContextRelation> getRelations();
+
+ /**
+ * @since 3.0
+ */
+ public abstract IInteractionRelation getRelation(String targetHandle);
+
+ public abstract void clearRelations();
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionObject.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionObject.java
new file mode 100644
index 0000000..3104dbc
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionObject.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+/**
+ * Virtual proxy for an element or relation in the context model.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IInteractionObject {
+
+ public abstract IDegreeOfInterest getInterest();
+
+ public abstract String getContentType();
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionRelation.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionRelation.java
new file mode 100644
index 0000000..7a55565
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/IInteractionRelation.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+/**
+ * Virtual proxy for a relation between two elements in the context model.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IInteractionRelation extends IInteractionObject {
+
+ public abstract String getLabel();
+
+ public abstract String getRelationshipHandle();
+
+ public abstract IInteractionElement getTarget();
+
+ public abstract IInteractionElement getSource();
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/InterestComparator.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/InterestComparator.java
new file mode 100644
index 0000000..0b2119c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/context/core/InterestComparator.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Comparator;
+
+/**
+ * Ranks elements by their degree-of-interest.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public class InterestComparator<T> implements Comparator<T> {
+
+ public int compare(T e1, T e2) {
+ if (e1 instanceof IInteractionElement && e2 instanceof IInteractionElement) {
+ IInteractionElement info1 = (IInteractionElement) e1;
+ IInteractionElement info2 = (IInteractionElement) e2;
+ float v1 = info1.getInterest().getValue();
+ float v2 = info2.getInterest().getValue();
+ if (v1 >= v2) {
+ return -1;
+ }
+ if (v1 < v2) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/AbstractRelationProvider.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/AbstractRelationProvider.java
new file mode 100644
index 0000000..6d23561
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/AbstractRelationProvider.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.List;
+
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Used for Active Search.
+ *
+ * NOTE: this facility is not exposed by default in Mylyn 2.0 and likely to change for 3.0.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractRelationProvider extends AbstractContextListener {
+
+ protected final String DOS_0_LABEL = "disabled"; //$NON-NLS-1$
+
+ protected final String DOS_1_LABEL = "landmark resources"; //$NON-NLS-1$
+
+ protected final String DOS_2_LABEL = "interesting resources"; //$NON-NLS-1$
+
+ protected final String DOS_3_LABEL = "interesting projects"; //$NON-NLS-1$
+
+ protected final String DOS_4_LABEL = "project dependencies"; //$NON-NLS-1$
+
+ protected final String DOS_5_LABEL = "entire workspace (slow)"; //$NON-NLS-1$
+
+ private boolean enabled = false;
+
+ private final String id;
+
+ private final String structureKind;
+
+ private int degreeOfSeparation;
+
+ public String getId() {
+ return id;
+ }
+
+ public AbstractRelationProvider(String structureKind, String id) {
+ this.id = id;
+ this.structureKind = structureKind;
+ degreeOfSeparation = getDefaultDegreeOfSeparation();
+ }
+
+ public abstract List<IDegreeOfSeparation> getDegreesOfSeparation();
+
+ protected abstract int getDefaultDegreeOfSeparation();
+
+ protected abstract void findRelated(final IInteractionElement node, int degreeOfSeparation);
+
+ /**
+ * @param limitTo
+ * Only used in thye AbstractJavaRelationshipProvider for the search type
+ */
+ public abstract IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo,
+ int degreeOfSeparation);
+
+ public abstract String getName();
+
+ public boolean acceptResultElement(Object element) {
+ return true;
+ }
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case LANDMARKS_ADDED:
+ if (enabled) {
+ for (IInteractionElement node : event.getElements()) {
+ findRelated(node, degreeOfSeparation);
+ }
+ }
+ break;
+ }
+ }
+
+ protected void searchCompleted(IInteractionElement landmark) {
+ if (landmark.getRelations().size() > 0) {
+ ContextCorePlugin.getContextManager().notifyRelationshipsChanged(landmark);
+ }
+ }
+
+ protected void incrementInterest(IInteractionElement node, String elementKind, String elementHandle,
+ int degreeOfSeparation) {
+ int predictedInterest = 1;// (7-degreeOfSeparation) *
+ // TaskscapeManager.getScalingFactors().getDegreeOfSeparationScale();
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.PREDICTION, elementKind, elementHandle,
+ getSourceId(), getId(), null, predictedInterest);
+ ContextCorePlugin.getContextManager().processInteractionEvent(event, false, false);
+ createEdge(node, elementKind, elementHandle);
+ }
+
+ /**
+ * Public for testing
+ */
+ public void createEdge(IInteractionElement toNode, String elementKind, String targetHandle) {
+ CompositeContextElement targetNode = (CompositeContextElement) ContextCore.getContextManager().getElement(
+ targetHandle);
+ if (targetNode == null) {
+ return;
+ }
+ InteractionContextElement concreteTargetNode = null;
+ if (targetNode.getNodes().size() != 1) {
+ return;
+ } else {
+ concreteTargetNode = targetNode.getNodes().iterator().next();
+ }
+ if (concreteTargetNode != null) {
+ for (InteractionContextElement sourceNode : ((CompositeContextElement) toNode).getNodes()) {
+ InteractionContextRelation edge = new InteractionContextRelation(elementKind, getId(), sourceNode,
+ concreteTargetNode, sourceNode.getContext());
+ sourceNode.addEdge(edge);
+ }
+ }
+ }
+
+ protected abstract String getSourceId();
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public int getCurrentDegreeOfSeparation() {
+ return degreeOfSeparation;
+ }
+
+ @Override
+ public String toString() {
+ return "(provider for: " + id + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public String getStructureKind() {
+ return structureKind;
+ }
+
+ public void setDegreeOfSeparation(int degreeOfSeparation) {
+ this.degreeOfSeparation = degreeOfSeparation;
+ }
+
+ public abstract String getGenericId();
+
+ public abstract void stopAllRunningJobs();
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/AggregateInteractionEvent.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/AggregateInteractionEvent.java
new file mode 100644
index 0000000..17291be
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/AggregateInteractionEvent.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Date;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Shawn Minto
+ */
+public class AggregateInteractionEvent extends InteractionEvent {
+
+ // these are needed for collapsed events so that we can restore the context properly
+ private final int numCollapsedEvents;
+
+ private final int eventCountOnCreation;
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public AggregateInteractionEvent(Kind kind, String structureKind, String handle, String originId,
+ String navigatedRelation, String delta, float interestContribution, int numCollapsedEvents,
+ int eventCountOnCreation) {
+ super(kind, structureKind, handle, originId, navigatedRelation, delta, interestContribution);
+ this.numCollapsedEvents = numCollapsedEvents;
+ this.eventCountOnCreation = eventCountOnCreation;
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public AggregateInteractionEvent(Kind kind, String structureKind, String handle, String originId,
+ String navigatedRelation, String delta, float interestContribution, Date startDate, Date endDate,
+ int numCollapsedEvents, int eventCountOnCreation) {
+
+ super(kind, structureKind, handle, originId, navigatedRelation, delta, interestContribution, startDate, endDate);
+ this.numCollapsedEvents = numCollapsedEvents;
+ this.eventCountOnCreation = eventCountOnCreation;
+ }
+
+ /**
+ * Returns the number of events this event represents
+ */
+ public int getNumCollapsedEvents() {
+ return numCollapsedEvents;
+ }
+
+ /**
+ * Returns the number of user events that had occurred when this was created or -1 to use the context's count
+ */
+ public int getEventCountOnCreation() {
+ return eventCountOnCreation;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeContextElement.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeContextElement.java
new file mode 100644
index 0000000..2965536
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeContextElement.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IDegreeOfInterest;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class CompositeContextElement implements IInteractionElement {
+
+ private final List<InteractionContextElement> nodes;
+
+ private String handle;
+
+ private final IInteractionContextScaling contextScaling;
+
+ public CompositeContextElement(String handle, List<InteractionContextElement> nodes,
+ IInteractionContextScaling contextScaling) {
+ Assert.isNotNull(handle);
+ this.handle = handle;
+ this.nodes = nodes;
+ this.contextScaling = contextScaling;
+ }
+
+ /**
+ * @return the context with the highest value TODO: is this always best?
+ */
+ public IInteractionContext getContext() {
+ IInteractionElement highestValueNode = null;
+ for (IInteractionElement node : nodes) {
+ if (highestValueNode == null || node.getInterest().getValue() < highestValueNode.getInterest().getValue()) {
+ highestValueNode = node;
+ }
+ }
+ if (highestValueNode != null) {
+ return highestValueNode.getContext();
+ } else {
+ return null;
+ }
+ }
+
+ public IDegreeOfInterest getInterest() {
+ if (nodes.size() == 1) {
+ return nodes.iterator().next().getInterest();
+ } else {
+ // TODO: fix this inefficiency, but not currently used by existing code
+ CompositeDegreeOfInterest degreeOfInterest = new CompositeDegreeOfInterest(contextScaling);
+ for (IInteractionElement node : nodes) {
+ degreeOfInterest.getComposedDegreesOfInterest().add(node.getInterest());
+ }
+ return degreeOfInterest;
+ }
+ }
+
+ public String getHandleIdentifier() {
+ return handle;
+ }
+
+ public void setHandleIdentifier(String handle) {
+ Assert.isNotNull(handle);
+ this.handle = handle;
+ for (IInteractionElement node : nodes) {
+ node.setHandleIdentifier(handle);
+ }
+ }
+
+ public List<InteractionContextElement> getNodes() {
+ return nodes;
+ }
+
+ /**
+ * @return empty string if all kinds aren't equal
+ */
+ public String getContentType() {
+ Set<String> kinds = new HashSet<String>();
+ String lastKind = null;
+ for (IInteractionElement node : nodes) {
+ lastKind = node.getContentType();
+ kinds.add(lastKind);
+ }
+ if (kinds.size() == 1) {
+ return lastKind;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * TODO: need composite edges here
+ */
+ public IInteractionRelation getRelation(String targetHandle) {
+ Set<IInteractionRelation> edges = new HashSet<IInteractionRelation>();
+ for (IInteractionElement node : nodes) {
+ edges.add(node.getRelation(targetHandle));
+ }
+ if (edges.size() == 0) {
+ return null;
+ } else if (edges.size() > 1) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Multiple edges found in composite, not supported")); //$NON-NLS-1$
+ }
+ return edges.iterator().next();
+ }
+
+ public Collection<InteractionContextRelation> getRelations() {
+ Set<InteractionContextRelation> edges = new HashSet<InteractionContextRelation>();
+
+ for (InteractionContextElement node : nodes) {
+ edges.addAll(node.getRelations());
+ }
+ return edges;
+ }
+
+ public void clearRelations() {
+ for (InteractionContextElement node : nodes) {
+ node.clearRelations();
+ }
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object == null) {
+ return false;
+ }
+ if (object instanceof CompositeContextElement) {
+ CompositeContextElement element = (CompositeContextElement) object;
+ return this.getHandleIdentifier().equals(element.getHandleIdentifier());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return handle.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "composite" + nodes; //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeDegreeOfInterest.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeDegreeOfInterest.java
new file mode 100644
index 0000000..2c952f5
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeDegreeOfInterest.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylyn.context.core.IDegreeOfInterest;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class CompositeDegreeOfInterest implements IDegreeOfInterest {
+
+ private final Set<IDegreeOfInterest> composed = new HashSet<IDegreeOfInterest>();
+
+ protected IInteractionContextScaling contextScaling;
+
+ public CompositeDegreeOfInterest(IInteractionContextScaling contextScaling) {
+ this.contextScaling = contextScaling;
+ }
+
+ public void addEvent(InteractionEvent event) {
+ for (IDegreeOfInterest info : composed) {
+ ((DegreeOfInterest) info).addEvent(event);
+ }
+ }
+
+ public List<InteractionEvent> getEvents() {
+ Set<InteractionEvent> events = new HashSet<InteractionEvent>();
+ for (IDegreeOfInterest info : composed) {
+ events.addAll(info.getEvents());
+ }
+ return new ArrayList<InteractionEvent>(events);
+ }
+
+ public float getValue() {
+ float value = 0;
+ for (IDegreeOfInterest info : composed) {
+ value += info.getValue();
+ }
+ return value;
+ }
+
+ public float getDecayValue() {
+ float value = 0;
+ for (IDegreeOfInterest info : composed) {
+ value += info.getDecayValue();
+ }
+ return value;
+ }
+
+ public float getEncodedValue() {
+ float value = 0;
+ for (IDegreeOfInterest info : composed) {
+ value += info.getEncodedValue();
+ }
+ return value;
+ }
+
+ /**
+ * @return true if one is interesting
+ */
+ public boolean isInteresting() {
+ boolean isInteresting = false;
+ for (IDegreeOfInterest info : composed) {
+ if (info.isInteresting()) {
+ isInteresting = true;
+ }
+ }
+ return isInteresting;
+ }
+
+ /**
+ * @return true if all are predicted
+ */
+ public boolean isPropagated() {
+ if (composed.isEmpty()) {
+ return false;
+ }
+ boolean allPropagated = true;
+ for (IDegreeOfInterest info : composed) {
+ if (!info.isPropagated()) {
+ allPropagated = false;
+ }
+ }
+ return allPropagated;
+ }
+
+ public boolean isPredicted() {
+ if (composed.isEmpty()) {
+ return false;
+ }
+ boolean allPredicted = true;
+ for (IDegreeOfInterest info : composed) {
+ if (!info.isPredicted()) {
+ allPredicted = false;
+ }
+ }
+ return allPredicted;
+ }
+
+ public boolean isLandmark() {
+ return getValue() >= contextScaling.getLandmark();
+ }
+
+ public Set<IDegreeOfInterest> getComposedDegreesOfInterest() {
+ return composed;
+ }
+
+ @Override
+ public String toString() {
+ StringBuffer result = new StringBuffer();
+ result.append("composite("); //$NON-NLS-1$
+ for (IDegreeOfInterest info : composed) {
+ result.append(info.toString());
+ }
+ result.append(")"); //$NON-NLS-1$
+ return result.toString();
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeInteractionContext.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeInteractionContext.java
new file mode 100644
index 0000000..249a08b
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/CompositeInteractionContext.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Delegates to contained contexts.
+ *
+ * TODO: should info be propagated proportionally to number of taskscapes?
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author David Green bug 257977 isInteresting
+ */
+public class CompositeInteractionContext implements IInteractionContext {
+
+ protected Map<String, InteractionContext> contexts = new HashMap<String, InteractionContext>();
+
+ protected IInteractionElement activeNode = null;
+
+ private final IInteractionContextScaling contextScaling;
+
+ public String contentLimitedTo = null;
+
+ public CompositeInteractionContext(IInteractionContextScaling contextScaling) {
+ this.contextScaling = contextScaling;
+ }
+
+ public IInteractionElement addEvent(InteractionEvent event) {
+ List<InteractionContextElement> nodes = new ArrayList<InteractionContextElement>();
+ for (InteractionContext context : contexts.values()) {
+ InteractionContextElement info = (InteractionContextElement) context.parseEvent(event);
+ nodes.add(info);
+ }
+ CompositeContextElement compositeNode = new CompositeContextElement(event.getStructureHandle(), nodes,
+ contextScaling);
+ return compositeNode;
+ }
+
+ public IInteractionElement get(String handle) {
+ if (handle == null || contexts.values().size() == 0) {
+ return null;
+ }
+ List<InteractionContextElement> nodes = new ArrayList<InteractionContextElement>();
+ for (InteractionContext taskscape : contexts.values()) {
+ InteractionContextElement node = (InteractionContextElement) taskscape.get(handle);
+ if (node != null) {
+ nodes.add(node);
+ }
+ }
+ CompositeContextElement composite = new CompositeContextElement(handle, nodes, contextScaling);
+ return composite;
+ }
+
+ public List<IInteractionElement> getLandmarks() {
+ Set<IInteractionElement> landmarks = new HashSet<IInteractionElement>();
+ for (InteractionContext taskscape : contexts.values()) {
+ for (IInteractionElement concreteNode : taskscape.getLandmarks()) {
+ if (concreteNode != null) {
+ landmarks.add(get(concreteNode.getHandleIdentifier()));
+ }
+ }
+ }
+ return new ArrayList<IInteractionElement>(landmarks);
+ }
+
+ public List<IInteractionElement> getInteresting() {
+ Set<IInteractionElement> landmarks = new HashSet<IInteractionElement>();
+ for (InteractionContext context : contexts.values()) {
+ for (IInteractionElement concreteNode : context.getInteresting()) {
+ if (concreteNode != null) {
+ landmarks.add(get(concreteNode.getHandleIdentifier()));
+ }
+ }
+ }
+ return new ArrayList<IInteractionElement>(landmarks);
+ }
+
+ public boolean isInteresting(String elementHandle) {
+ for (InteractionContext context : contexts.values()) {
+ if (context.isInteresting(elementHandle)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void setActiveElement(IInteractionElement activeElement) {
+ this.activeNode = activeElement;
+ }
+
+ public IInteractionElement getActiveNode() {
+ return activeNode;
+ }
+
+ public void delete(IInteractionElement node) {
+ for (InteractionContext taskscape : contexts.values()) {
+ taskscape.delete(node);
+ }
+ }
+
+ public void delete(Collection<IInteractionElement> nodes) {
+ for (InteractionContext context : contexts.values()) {
+ context.delete(nodes);
+ }
+ }
+
+ public void clear() {
+ for (InteractionContext taskscape : contexts.values()) {
+ taskscape.reset();
+ }
+ }
+
+ public Map<String, InteractionContext> getContextMap() {
+ return contexts;
+ }
+
+ public List<IInteractionElement> getAllElements() {
+ Set<IInteractionElement> nodes = new HashSet<IInteractionElement>();
+ for (InteractionContext context : contexts.values()) {
+ for (IInteractionElement concreteNode : context.getAllElements()) {
+ nodes.add(get(concreteNode.getHandleIdentifier()));
+ }
+ }
+ return new ArrayList<IInteractionElement>(nodes);
+ }
+
+ /**
+ * TODO: sort by date?
+ */
+ public List<InteractionEvent> getInteractionHistory() {
+ Set<InteractionEvent> events = new HashSet<InteractionEvent>();
+ for (InteractionContext taskscape : contexts.values()) {
+ events.addAll(taskscape.getInteractionHistory());
+ }
+ return new ArrayList<InteractionEvent>(events);
+ }
+
+ public void updateElementHandle(IInteractionElement element, String newHandle) {
+ for (InteractionContext context : contexts.values()) {
+ context.updateElementHandle(element, newHandle);
+ }
+ element.setHandleIdentifier(newHandle);
+ }
+
+ /**
+ * Composite contexts do not have a unique handle identifier.
+ *
+ * @return null if no unique handle
+ */
+ public String getHandleIdentifier() {
+ if (contexts.values().size() == 1) {
+ return contexts.keySet().iterator().next();
+ } else {
+ return null;
+ }
+ }
+
+ public IInteractionContextScaling getScaling() {
+ return contextScaling;
+ }
+
+ public String getContentLimitedTo() {
+ return contentLimitedTo;
+ }
+
+ public void setContentLimitedTo(String contentLimitedTo) {
+ this.contentLimitedTo = contentLimitedTo;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/ContextCorePlugin.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/ContextCorePlugin.java
new file mode 100644
index 0000000..b9be34a
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/ContextCorePlugin.java
@@ -0,0 +1,474 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Activator for the Context Core plug-in.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class ContextCorePlugin extends Plugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.core"; //$NON-NLS-1$
+
+ private final Map<String, AbstractContextStructureBridge> bridges = new ConcurrentHashMap<String, AbstractContextStructureBridge>();
+
+ private final Map<String, Set<String>> childContentTypeMap = new ConcurrentHashMap<String, Set<String>>();
+
+ // specifies that one content type should shadow another
+ // the <value> content type shadows the <key> content typee
+ private final Map<String, String> contentTypeToShadowMap = new ConcurrentHashMap<String, String>();
+
+ private AbstractContextStructureBridge defaultBridge = null;
+
+ private static ContextCorePlugin INSTANCE;
+
+ private InteractionContextManager contextManager;
+
+ private static LocalContextStore contextStore;
+
+ private final Map<String, Set<AbstractRelationProvider>> relationProviders = new HashMap<String, Set<AbstractRelationProvider>>();
+
+ private final InteractionContextScaling commonContextScaling = new InteractionContextScaling();
+
+ private static final AbstractContextStructureBridge DEFAULT_BRIDGE = new AbstractContextStructureBridge() {
+
+ @Override
+ public String getContentType() {
+ return null;
+ }
+
+ @Override
+ public String getHandleIdentifier(Object object) {
+ return null;
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ return null;
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ return null;
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return false;
+ }
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ return false;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return true;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return false;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ return getContentType();
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object resource, int offset) {
+ return null;
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return Collections.emptyList();
+ }
+ };
+
+ public ContextCorePlugin() {
+ INSTANCE = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ contextStore = new LocalContextStore(commonContextScaling);
+ contextManager = new InteractionContextManager(contextStore);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ try {
+ super.stop(context);
+ INSTANCE = null;
+ for (AbstractRelationProvider provider : getRelationProviders()) {
+ provider.stopAllRunningJobs();
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Mylyn Core stop failed", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Shadows override existing shadows if present.
+ */
+ private void addShadowsContent(String baseContentType, String shadowedByContentType) {
+ contentTypeToShadowMap.put(baseContentType, shadowedByContentType);
+ }
+
+ private void addRelationProvider(String contentType, AbstractRelationProvider provider) {
+ Set<AbstractRelationProvider> providers = relationProviders.get(contentType);
+ if (providers == null) {
+ providers = new HashSet<AbstractRelationProvider>();
+ relationProviders.put(contentType, providers);
+ }
+ providers.add(provider);
+ // TODO: need facility for removing
+ ContextCore.getContextManager().addListener(provider);
+ }
+
+ /**
+ * @return all relation providers
+ */
+ public Set<AbstractRelationProvider> getRelationProviders() {
+ Set<AbstractRelationProvider> allProviders = new HashSet<AbstractRelationProvider>();
+ for (Set<AbstractRelationProvider> providers : relationProviders.values()) {
+ allProviders.addAll(providers);
+ }
+ return allProviders;
+ }
+
+ public Set<AbstractRelationProvider> getRelationProviders(String contentType) {
+ return relationProviders.get(contentType);
+ }
+
+ public static ContextCorePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ public static InteractionContextManager getContextManager() {
+ return INSTANCE.contextManager;
+ }
+
+ public Map<String, AbstractContextStructureBridge> getStructureBridges() {
+ BridgesExtensionPointReader.initExtensions();
+ return bridges;
+ }
+
+ /**
+ * Finds the shadowed content for the passed in base content
+ *
+ * @param baseContent
+ * @return the shadowed content type or if null there is none
+ */
+ private String getShadowedContentType(String baseContent) {
+ return contentTypeToShadowMap.get(baseContent);
+ }
+
+ public AbstractContextStructureBridge getStructureBridge(String contentType) {
+ BridgesExtensionPointReader.initExtensions();
+ if (contentType != null) {
+ // find the content type that shadows this one
+ // if one exists.
+ String shadowsContentType = getShadowedContentType(contentType);
+ if (shadowsContentType != null) {
+ AbstractContextStructureBridge bridge = bridges.get(shadowsContentType);
+ if (bridge != null) {
+ return bridge;
+ }
+ }
+
+ // no shadowing of content, look at original content type
+ AbstractContextStructureBridge bridge = bridges.get(contentType);
+ if (bridge != null) {
+ return bridge;
+ }
+ }
+ return (defaultBridge == null) ? DEFAULT_BRIDGE : defaultBridge;
+ }
+
+ public Set<String> getContentTypes() {
+ BridgesExtensionPointReader.initExtensions();
+ return bridges.keySet();
+ }
+
+ /**
+ * TODO: cache this to improve performance?
+ */
+ public AbstractContextStructureBridge getStructureBridge(Object object) {
+ BridgesExtensionPointReader.initExtensions();
+
+ for (Map.Entry<String, AbstractContextStructureBridge> entry : bridges.entrySet()) {
+ // check to see if there is shadowing of content types going on.
+ String shadowsContentType = getShadowedContentType(entry.getKey());
+ if (shadowsContentType != null) {
+ AbstractContextStructureBridge structureBridge = bridges.get(shadowsContentType);
+ if (structureBridge.acceptsObject(object)) {
+ return structureBridge;
+ }
+ }
+
+ // no shadowing...look at actual content type
+ AbstractContextStructureBridge bridge = entry.getValue();
+ if (bridge != null && bridge.acceptsObject(object)) {
+ return bridge;
+ }
+ }
+
+ // use the default if not found
+ return (defaultBridge != null && defaultBridge.acceptsObject(object)) ? defaultBridge : DEFAULT_BRIDGE;
+ }
+
+ /**
+ * Recommended bridge registration is via extension point, but bridges can also be added at runtime. Note that only
+ * one bridge per content type is supported. Overriding content types is not supported.
+ */
+ public synchronized void addStructureBridge(AbstractContextStructureBridge bridge) {
+ if (bridge.getContentType().equals(ContextCore.CONTENT_TYPE_RESOURCE)) {
+ defaultBridge = bridge;
+ } else {
+ bridges.put(bridge.getContentType(), bridge);
+ }
+ if (bridge.getParentContentType() != null) {
+ Set<String> childContentTypes = childContentTypeMap.get(bridge.getParentContentType());
+ if (childContentTypes == null) {
+ // CopyOnWriteArrayList handles concurrent access to the content types
+ childContentTypes = new CopyOnWriteArraySet<String>();
+ }
+
+ childContentTypes.add(bridge.getContentType());
+ childContentTypeMap.put(bridge.getParentContentType(), childContentTypes);
+ }
+ }
+
+ public static LocalContextStore getContextStore() {
+// if (!contextStoreRead) {
+// contextStoreRead = true;
+// ContextStoreExtensionReader.initExtensions();
+// if (contextStore != null) {
+// contextStore.init();
+// } else {
+// StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.PLUGIN_ID, "No context store specified"));
+// }
+// }
+ return contextStore;
+ }
+
+// public void setContextStore(AbstractContextStore contextStore) {
+// ContextCorePlugin.contextStore = contextStore;
+// }
+
+// static class ContextStoreExtensionReader {
+//
+// private static final String ELEMENT_CONTEXT_STORE = "contextStore";
+//
+// private static boolean extensionsRead = false;
+//
+// public static void initExtensions() {
+// if (!extensionsRead) {
+// IExtensionRegistry registry = Platform.getExtensionRegistry();
+// IExtensionPoint extensionPoint = registry.getExtensionPoint(BridgesExtensionPointReader.EXTENSION_ID_CONTEXT);
+// IExtension[] extensions = extensionPoint.getExtensions();
+// for (IExtension extension : extensions) {
+// IConfigurationElement[] elements = extension.getConfigurationElements();
+// for (IConfigurationElement element : elements) {
+// if (element.getName().compareTo(ELEMENT_CONTEXT_STORE) == 0) {
+// readStore(element);
+// }
+// }
+// }
+// extensionsRead = true;
+// }
+// }
+//
+// private static void readStore(IConfigurationElement element) {
+// // Currently disabled
+// try {
+// Object object = element.createExecutableExtension(BridgesExtensionPointReader.ATTR_CLASS);
+// if (!(object instanceof AbstractContextStore)) {
+// StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.PLUGIN_ID,
+// "Could not load bridge: " + object.getClass().getCanonicalName() + " must implement "
+// + AbstractContextStructureBridge.class.getCanonicalName()));
+// return;
+// } else {
+// ContextCorePlugin.contextStore = (AbstractContextStore) object;
+// }
+// } catch (CoreException e) {
+// StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.PLUGIN_ID,
+// "Could not load bridge extension", e));
+// }
+// }
+// }
+
+ static class BridgesExtensionPointReader {
+
+ private static final String EXTENSION_ID_CONTEXT = "org.eclipse.mylyn.context.core.bridges"; //$NON-NLS-1$
+
+ private static final String EXTENSION_ID_INTERNAL_CONTEXT = "org.eclipse.mylyn.context.core.internalBridges"; //$NON-NLS-1$
+
+ private static final String EXTENSION_ID_RELATION_PROVIDERS = "org.eclipse.mylyn.context.core.relationProviders"; //$NON-NLS-1$
+
+ private static final String ELEMENT_STRUCTURE_BRIDGE = "structureBridge"; //$NON-NLS-1$
+
+ private static final String ELEMENT_RELATION_PROVIDER = "provider"; //$NON-NLS-1$
+
+ private static final String ELEMENT_SHADOW = "shadow"; //$NON-NLS-1$
+
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ATTR_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+
+ private static final String ATTR_PARENT_CONTENT_TYPE = "parentContentType"; //$NON-NLS-1$
+
+ private static final String ATTR_BASE_CONTENT = "baseContent"; //$NON-NLS-1$
+
+ private static final String ATTR_SHADOWED_BY_CONTENT = "shadowedByContent"; //$NON-NLS-1$
+
+ private static boolean extensionsRead = false;
+
+ public static void initExtensions() {
+ if (!extensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(BridgesExtensionPointReader.EXTENSION_ID_CONTEXT);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().compareTo(BridgesExtensionPointReader.ELEMENT_STRUCTURE_BRIDGE) == 0) {
+ readBridge(element);
+ }
+ }
+ }
+
+ // internal bridges
+ extensionPoint = registry.getExtensionPoint(BridgesExtensionPointReader.EXTENSION_ID_INTERNAL_CONTEXT);
+ extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().compareTo(BridgesExtensionPointReader.ELEMENT_SHADOW) == 0) {
+ readInternalBridge(element);
+ }
+ }
+ }
+
+ extensionPoint = registry.getExtensionPoint(BridgesExtensionPointReader.EXTENSION_ID_RELATION_PROVIDERS);
+ extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().compareTo(BridgesExtensionPointReader.ELEMENT_RELATION_PROVIDER) == 0) {
+ readRelationProvider(element);
+ }
+ }
+ }
+ extensionsRead = true;
+ }
+ }
+
+ private static void readBridge(IConfigurationElement element) {
+ try {
+ Object object = element.createExecutableExtension(BridgesExtensionPointReader.ATTR_CLASS);
+ if (!(object instanceof AbstractContextStructureBridge)) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Could not load bridge: " + object.getClass().getCanonicalName() + " must implement " //$NON-NLS-1$ //$NON-NLS-2$
+ + AbstractContextStructureBridge.class.getCanonicalName()));
+ return;
+ }
+
+ AbstractContextStructureBridge bridge = (AbstractContextStructureBridge) object;
+ if (element.getAttribute(BridgesExtensionPointReader.ATTR_PARENT_CONTENT_TYPE) != null) {
+ String parentContentType = element.getAttribute(BridgesExtensionPointReader.ATTR_PARENT_CONTENT_TYPE);
+ if (parentContentType != null) {
+ bridge.setParentContentType(parentContentType);
+ }
+ }
+ ContextCorePlugin.getDefault().addStructureBridge(bridge);
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Could not load bridge extension", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readInternalBridge(IConfigurationElement element) {
+ String baseContent = element.getAttribute(ATTR_BASE_CONTENT);
+ String shadowedByContent = element.getAttribute(ATTR_SHADOWED_BY_CONTENT);
+
+ if (baseContent == null || shadowedByContent == null) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Ignoring bridge shadowing because of invalid extension point " //$NON-NLS-1$
+ + BridgesExtensionPointReader.ELEMENT_STRUCTURE_BRIDGE, new Exception()));
+ }
+ ContextCorePlugin.getDefault().addShadowsContent(baseContent, shadowedByContent);
+ }
+
+ private static void readRelationProvider(IConfigurationElement element) {
+ try {
+ String contentType = element.getAttribute(BridgesExtensionPointReader.ATTR_CONTENT_TYPE);
+ AbstractRelationProvider relationProvider = (AbstractRelationProvider) element.createExecutableExtension(BridgesExtensionPointReader.ATTR_CLASS);
+ if (contentType != null) {
+ ContextCorePlugin.getDefault().addRelationProvider(contentType, relationProvider);
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Could not load relation provider", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public Set<String> getChildContentTypes(String contentType) {
+ Set<String> contentTypes = childContentTypeMap.get(contentType);
+ if (contentTypes != null) {
+ return contentTypes;
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+ public IInteractionContextScaling getCommonContextScaling() {
+ return commonContextScaling;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/DegreeOfInterest.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/DegreeOfInterest.java
new file mode 100644
index 0000000..28dd8e0
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/DegreeOfInterest.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.context.core.IDegreeOfInterest;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+// TODO: make package-visible
+public class DegreeOfInterest implements IDegreeOfInterest {
+
+ private final List<InteractionEvent> events = new ArrayList<InteractionEvent>();
+
+ private final Map<InteractionEvent.Kind, InteractionEvent> collapsedEvents = new HashMap<InteractionEvent.Kind, InteractionEvent>();
+
+ protected IInteractionContextScaling contextScaling;
+
+ private float edits = 0;
+
+ private float selections = 0;
+
+ private float commands = 0;
+
+ private float predictedBias = 0;
+
+ private float propagatedBias = 0;
+
+ private float manipulationBias = 0;
+
+ private final InteractionContext context;
+
+ private final int eventCountOnCreation;
+
+ public DegreeOfInterest(InteractionContext context, IInteractionContextScaling scaling) {
+ this(context, scaling, context.getUserEventCount());
+ }
+
+ public DegreeOfInterest(InteractionContext context, IInteractionContextScaling scaling, int eventCountOnCreation) {
+ this.context = context;
+ if (eventCountOnCreation <= 0) {
+ this.eventCountOnCreation = context.getUserEventCount();
+ } else {
+ this.eventCountOnCreation = eventCountOnCreation;
+ }
+ this.contextScaling = scaling;
+ }
+
+ /**
+ * TODO: make package-visible
+ */
+ public void addEvent(InteractionEvent event) {
+ events.add(event); // NOTE: was events.add(0, event);
+ InteractionEvent last = collapsedEvents.get(event.getKind());
+ if (last != null) {
+
+ int numCollapsedEvents = 1;
+ if (last instanceof AggregateInteractionEvent) {
+ numCollapsedEvents = ((AggregateInteractionEvent) last).getNumCollapsedEvents();
+ }
+
+ AggregateInteractionEvent aggregateEvent = new AggregateInteractionEvent(event.getKind(),
+ event.getStructureKind(), event.getStructureHandle(), event.getOriginId(), event.getNavigation(),
+ event.getDelta(), last.getInterestContribution() + event.getInterestContribution(), last.getDate(),
+ event.getEndDate(), numCollapsedEvents + 1, eventCountOnCreation);
+ collapsedEvents.put(event.getKind(), aggregateEvent);
+ } else {
+ collapsedEvents.put(event.getKind(), event);
+ }
+
+ updateEventState(event);
+ }
+
+ private void updateEventState(InteractionEvent event) {
+ switch (event.getKind()) {
+ case EDIT:
+ edits += event.getInterestContribution();
+ break;
+ case SELECTION:
+ selections += event.getInterestContribution();
+ break;
+ case COMMAND:
+ commands += event.getInterestContribution();
+ break;
+ case PREDICTION:
+ predictedBias += event.getInterestContribution();
+ break;
+ case PROPAGATION:
+ propagatedBias += event.getInterestContribution();
+ break;
+ case MANIPULATION:
+ manipulationBias += event.getInterestContribution();
+ break;
+ }
+ }
+
+ public float getValue() {
+ float value = getEncodedValue();
+ value += predictedBias;
+ value += propagatedBias;
+ return value;
+ }
+
+ public float getEncodedValue() {
+ float value = 0;
+ value += selections * contextScaling.get(InteractionEvent.Kind.SELECTION);
+ value += edits * contextScaling.get(InteractionEvent.Kind.EDIT);
+ value += commands * contextScaling.get(InteractionEvent.Kind.COMMAND);
+ value += manipulationBias;
+ value -= getDecayValue();
+ return value;
+ }
+
+ /**
+ * @return a scaled decay count based on the number of events since the creation of this interest object
+ */
+ public float getDecayValue() {
+ if (context != null) {
+ return (context.getUserEventCount() - eventCountOnCreation) * contextScaling.getDecay();
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Sums predicted and propagated values
+ */
+ // TODO 3.3 improve method name
+ public boolean isPropagated() {
+ float value = selections * contextScaling.get(InteractionEvent.Kind.SELECTION) + edits
+ * contextScaling.get(InteractionEvent.Kind.EDIT);
+ return value <= 0 && propagatedBias > 0;
+ }
+
+ public boolean isPredicted() {
+ return (getValue() - predictedBias) <= 0 && predictedBias > 0;
+ }
+
+ public boolean isLandmark() {
+ return getValue() >= contextScaling.getLandmark();
+ }
+
+ public boolean isInteresting() {
+ return getValue() > contextScaling.getInteresting();
+ }
+
+ @Override
+ public String toString() {
+ return "(" + "selections: " + selections + ", edits: " + edits + ", commands: " + commands + ", predicted: " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ + predictedBias + ", propagated: " + propagatedBias + ", manipulation: " + manipulationBias + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ /**
+ * TODO: make unmodifiable? Clients should not muck with this list.
+ */
+ public List<InteractionEvent> getEvents() {
+ return events;
+ }
+
+ public List<InteractionEvent> getCollapsedEvents() {
+ return new ArrayList<InteractionEvent>(collapsedEvents.values());
+ }
+
+ // private void writeObject(ObjectOutputStream stream) throws IOException {
+ // stream.defaultWriteObject();
+ // stream.writeObject(events);
+ // }
+ //
+ // @SuppressWarnings(value="unchecked")
+ // private void readObject(ObjectInputStream stream) throws IOException,
+ // ClassNotFoundException {
+ // stream.defaultReadObject();
+ // events = (List<InteractionEvent>)stream.readObject();
+ // init();
+ // for (InteractionEvent event : events) {
+ // updateEventState(event);
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/DegreeOfSeparation.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/DegreeOfSeparation.java
new file mode 100644
index 0000000..56fb79f
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/DegreeOfSeparation.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+/**
+ * @author Shawn Minto
+ */
+public class DegreeOfSeparation implements IDegreeOfSeparation {
+
+ private final String label;
+
+ private final int degree;
+
+ public DegreeOfSeparation(String label, int degree) {
+ this.label = label;
+ this.degree = degree;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public int getDegree() {
+ return degree;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IActiveSearchListener.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IActiveSearchListener.java
new file mode 100644
index 0000000..ba910c8
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IActiveSearchListener.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.List;
+
+/**
+ * Interface for a listener of when the bugzilla search is completed
+ *
+ * @author Shawn Minto
+ */
+public interface IActiveSearchListener {
+ /**
+ * Called when a background search is completed
+ *
+ * @param l
+ * The list of objects that were returned by the search
+ */
+ public void searchCompleted(List<?> l);
+
+ public boolean resultsGathered();
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IActiveSearchOperation.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IActiveSearchOperation.java
new file mode 100644
index 0000000..795af5c
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IActiveSearchOperation.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IActiveSearchOperation {
+
+ public void addListener(IActiveSearchListener listener);
+
+ public void removeListener(IActiveSearchListener listener);
+
+ public IStatus run(IProgressMonitor monitor);
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IContextStoreListener.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IContextStoreListener.java
new file mode 100644
index 0000000..a369cc4
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IContextStoreListener.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.File;
+
+import org.eclipse.mylyn.context.core.IContextStore;
+
+/**
+ * Notified of events where {@link IContextStore} is moved.
+ *
+ * @author Mik Kersten
+ */
+public interface IContextStoreListener {
+
+ /**
+ * @since 3.0
+ */
+ public abstract void contextStoreMoved(File newDirectory);
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IDegreeOfSeparation.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IDegreeOfSeparation.java
new file mode 100644
index 0000000..427aeab
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IDegreeOfSeparation.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+/**
+ * NOTE: not used in current Mylyn distribution, likely to change for 3.0.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface IDegreeOfSeparation {
+
+ public abstract String getLabel();
+
+ public abstract int getDegree();
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IInteractionContextReader.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IInteractionContextReader.java
new file mode 100644
index 0000000..f98ea3f
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IInteractionContextReader.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.File;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public interface IInteractionContextReader {
+
+ public abstract InteractionContext readContext(String handleIdentifier, File file);
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IInteractionContextWriter.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IInteractionContextWriter.java
new file mode 100644
index 0000000..e4118d5
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IInteractionContextWriter.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.mylyn.context.core.IInteractionContext;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IInteractionContextWriter {
+
+ public abstract void setOutputStream(OutputStream outputStream);
+
+ public abstract void writeContextToStream(IInteractionContext context) throws IOException;
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IRelationsListener.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IRelationsListener.java
new file mode 100644
index 0000000..7ae5519
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/IRelationsListener.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import org.eclipse.mylyn.context.core.IInteractionElement;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IRelationsListener {
+
+ public void relationsChanged(IInteractionElement element);
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContext.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContext.java
new file mode 100644
index 0000000..bbbe1fe
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContext.java
@@ -0,0 +1,319 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author David Green bug 257977 isInteresting
+ */
+public class InteractionContext implements IInteractionContext {
+
+ private String handleIdentifier;
+
+ private final List<InteractionEvent> interactionHistory;
+
+ private final Map<String, InteractionContextElement> elementMap;
+
+ private final Map<String, IInteractionElement> landmarkMap;
+
+ /**
+ * The last element that was added to this context.
+ */
+ private InteractionContextElement activeNode;
+
+ private InteractionEvent lastEdgeEvent;
+
+ private InteractionContextElement lastEdgeNode;
+
+ private String contentLimitedTo;
+
+ private int numUserEvents;
+
+ private final IInteractionContextScaling contextScaling;
+
+ public InteractionContext(String id, IInteractionContextScaling scaling) {
+ this.handleIdentifier = id;
+ this.contextScaling = scaling;
+ this.interactionHistory = new ArrayList<InteractionEvent>();
+ this.elementMap = new HashMap<String, InteractionContextElement>();
+ this.landmarkMap = new HashMap<String, IInteractionElement>();
+
+ for (InteractionEvent event : interactionHistory) {
+ parseInteractionEvent(event);
+ }
+
+ for (InteractionContextElement node : elementMap.values()) {
+ if (node.getInterest().isLandmark()) {
+ landmarkMap.put(node.getHandleIdentifier(), node);
+ }
+ }
+
+ activeNode = lastEdgeNode;
+ }
+
+ public synchronized IInteractionElement parseEvent(InteractionEvent event) {
+ interactionHistory.add(event);
+ return parseInteractionEvent(event);
+ }
+
+ /**
+ * Propagations and predictions are not added as edges
+ */
+ private IInteractionElement parseInteractionEvent(InteractionEvent event) {
+ if (event.getStructureHandle() == null || event.getKind() == null) {
+ return null;
+ }
+
+ if (event.getKind().isUserEvent()) {
+ numUserEvents++;
+ }
+
+ InteractionContextElement node = elementMap.get(event.getStructureHandle());
+ if (node == null) {
+ if (event instanceof AggregateInteractionEvent) {
+ node = new InteractionContextElement(event.getStructureKind(), event.getStructureHandle(), this,
+ ((AggregateInteractionEvent) event).getEventCountOnCreation());
+ } else {
+ node = new InteractionContextElement(event.getStructureKind(), event.getStructureHandle(), this);
+ }
+ elementMap.put(event.getStructureHandle(), node);
+ }
+
+ if (event.getKind().isUserEvent() && event instanceof AggregateInteractionEvent) {
+ // add the rest of the events that this event represented
+ numUserEvents += ((AggregateInteractionEvent) event).getNumCollapsedEvents() - 1;
+ }
+
+ if (event.getNavigation() != null
+ && !event.getNavigation().equals("null") && lastEdgeEvent != null //$NON-NLS-1$
+ && lastEdgeNode != null && lastEdgeEvent.getStructureHandle() != null
+ && event.getKind() != InteractionEvent.Kind.PROPAGATION
+ && event.getKind() != InteractionEvent.Kind.PREDICTION) {
+ IInteractionElement navigationSource = elementMap.get(lastEdgeEvent.getStructureHandle());
+ if (navigationSource != null) {
+ InteractionContextRelation edge = lastEdgeNode.getRelation(event.getStructureHandle());
+ if (edge == null) {
+ edge = new InteractionContextRelation(event.getStructureKind(), event.getNavigation(),
+ lastEdgeNode, node, this);
+ lastEdgeNode.addEdge(edge);
+ }
+ DegreeOfInterest doi = (DegreeOfInterest) edge.getInterest();
+ doi.addEvent(event);
+ }
+ }
+ DegreeOfInterest doi = (DegreeOfInterest) node.getInterest();
+
+ doi.addEvent(event);
+ if (doi.isLandmark()) {
+ landmarkMap.put(node.getHandleIdentifier(), node);
+ } else {
+ landmarkMap.remove(node.getHandleIdentifier()); // TODO: redundant
+ }
+ if (event.getKind().isUserEvent()) {
+ lastEdgeEvent = event;
+ lastEdgeNode = node;
+ activeNode = node;
+ }
+ return node;
+ }
+
+ public synchronized IInteractionElement get(String elementHandle) {
+ if (elementHandle == null) {
+ return null;
+ } else {
+ return elementMap.get(elementHandle);
+ }
+ }
+
+ public synchronized boolean isInteresting(String elementHandle) {
+ InteractionContextElement element = elementMap.get(elementHandle);
+ if (element != null) {
+ return element.getInterest().isInteresting();
+ }
+ return false;
+ }
+
+ public synchronized List<IInteractionElement> getInteresting() {
+ List<IInteractionElement> elements = new ArrayList<IInteractionElement>();
+ for (String key : elementMap.keySet()) {
+ InteractionContextElement info = elementMap.get(key);
+ if (info != null && info.getInterest().isInteresting()) {
+ elements.add(info);
+ }
+ }
+ return elements;
+ }
+
+ public synchronized List<IInteractionElement> getLandmarks() {
+ return new ArrayList<IInteractionElement>(landmarkMap.values());
+ }
+
+ public synchronized void updateElementHandle(IInteractionElement element, String newHandle) {
+ InteractionContextElement currElement = elementMap.remove(element.getHandleIdentifier());
+ if (currElement != null) {
+ currElement.setHandleIdentifier(newHandle);
+ elementMap.put(newHandle, currElement);
+ }
+ }
+
+ public synchronized IInteractionElement getActiveNode() {
+ return activeNode;
+ }
+
+ public synchronized void delete(Collection<IInteractionElement> nodes) {
+ // remove elements
+ Set<String> handlesToRemove = new HashSet<String>();
+ for (IInteractionElement node : nodes) {
+ handlesToRemove.add(node.getHandleIdentifier());
+ landmarkMap.remove(node.getHandleIdentifier());
+ elementMap.remove(node.getHandleIdentifier());
+
+ if (activeNode != null && node.getHandleIdentifier().equals(activeNode.getHandleIdentifier())) {
+ activeNode = null;
+ }
+ }
+
+ // remove events
+ List<InteractionEvent> eventsToRemove = new ArrayList<InteractionEvent>();
+ for (InteractionEvent event : interactionHistory) {
+ if (handlesToRemove.contains(event.getStructureHandle())) {
+ eventsToRemove.add(event);
+ }
+ }
+ interactionHistory.removeAll(eventsToRemove);
+ }
+
+ public synchronized void delete(IInteractionElement node) {
+ delete(Collections.singleton(node));
+ }
+
+ public synchronized List<IInteractionElement> getAllElements() {
+ return new ArrayList<IInteractionElement>(elementMap.values());
+ }
+
+ public String getHandleIdentifier() {
+ return handleIdentifier;
+ }
+
+ /**
+ * @since 2.1
+ */
+ public void setHandleIdentifier(String handle) {
+ this.handleIdentifier = handle;
+ }
+
+ @Override
+ public String toString() {
+ return handleIdentifier;
+ }
+
+ public synchronized void reset() {
+ elementMap.clear();
+ interactionHistory.clear();
+ landmarkMap.clear();
+ activeNode = null;
+ numUserEvents = 0;
+ lastEdgeEvent = null;
+ lastEdgeNode = null;
+ }
+
+ public synchronized int getUserEventCount() {
+ return numUserEvents;
+ }
+
+ public synchronized List<InteractionEvent> getInteractionHistory() {
+ return new ArrayList<InteractionEvent>(interactionHistory);
+ }
+
+ public synchronized void collapse() {
+ List<InteractionEvent> collapsedHistory = new ArrayList<InteractionEvent>();
+ for (InteractionContextElement node : elementMap.values()) {
+ if (!node.equals(activeNode)) {
+ collapseNode(collapsedHistory, node);
+ }
+ }
+ if (activeNode != null) {
+ collapseNode(collapsedHistory, activeNode);
+ }
+
+ interactionHistory.clear();
+ interactionHistory.addAll(collapsedHistory);
+ }
+
+ private void collapseNode(List<InteractionEvent> collapsedHistory, InteractionContextElement node) {
+ collapsedHistory.addAll(((DegreeOfInterest) node.getInterest()).getCollapsedEvents());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ InteractionContext other = (InteractionContext) obj;
+ if (contentLimitedTo == null) {
+ if (other.contentLimitedTo != null) {
+ return false;
+ }
+ } else if (!contentLimitedTo.equals(other.contentLimitedTo)) {
+ return false;
+ }
+ if (handleIdentifier == null) {
+ if (other.handleIdentifier != null) {
+ return false;
+ }
+ } else if (!handleIdentifier.equals(other.handleIdentifier)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((contentLimitedTo == null) ? 0 : contentLimitedTo.hashCode());
+ result = prime * result + ((handleIdentifier == null) ? 0 : handleIdentifier.hashCode());
+ return result;
+ }
+
+ public IInteractionContextScaling getScaling() {
+ return contextScaling;
+ }
+
+ public String getContentLimitedTo() {
+ return contentLimitedTo;
+ }
+
+ public void setContentLimitedTo(String contentLimitedTo) {
+ this.contentLimitedTo = contentLimitedTo;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextElement.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextElement.java
new file mode 100644
index 0000000..af72636
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextElement.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.context.core.IDegreeOfInterest;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+
+/**
+ * Can only have one edge from a node to a particular target.
+ *
+ * @author Mik Kersten
+ */
+public class InteractionContextElement implements IInteractionElement {
+
+ private String handle;
+
+ private String kind;
+
+ private final DegreeOfInterest interest;
+
+ private final InteractionContext context;
+
+ private final Map<String/* target handle */, InteractionContextRelation> edges = new HashMap<String, InteractionContextRelation>();
+
+ public InteractionContextElement(String kind, String elementHandle, InteractionContext context) {
+ this(kind, elementHandle, context, -1);
+ }
+
+ public InteractionContextElement(String kind, String elementHandle, InteractionContext context,
+ int eventCountOnCreation) {
+ if (elementHandle == null) {
+ throw new RuntimeException("malformed context: null handle"); //$NON-NLS-1$
+ }
+ interest = new DegreeOfInterest(context, context.getScaling(), eventCountOnCreation);
+ this.handle = elementHandle;
+ this.kind = kind;
+ this.context = context;
+ }
+
+ public String getHandleIdentifier() {
+ return handle;
+ }
+
+ public void setHandleIdentifier(String handle) {
+ this.handle = handle;
+ }
+
+ public String getContentType() {
+ return kind;
+ }
+
+ public void setKind(String kind) {
+ this.kind = kind;
+ }
+
+ public Collection<InteractionContextRelation> getRelations() {
+ return edges.values();
+ }
+
+ public InteractionContextRelation getRelation(String targetHandle) {
+ return edges.get(targetHandle);
+ }
+
+ /**
+ * TODO: reduce visibility
+ */
+ public void addEdge(InteractionContextRelation edge) {
+ edges.put(edge.getTarget().getHandleIdentifier(), edge);
+ }
+
+ public void clearRelations() {
+ edges.clear();
+ }
+
+ void removeEdge(IInteractionRelation edge) {
+ edges.remove(edge.getTarget().getHandleIdentifier());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (this.getHandleIdentifier() == null) {
+ return false;
+ }
+ if (obj instanceof InteractionContextElement) {
+ InteractionContextElement node = (InteractionContextElement) obj;
+ return this.getHandleIdentifier().equals(node.getHandleIdentifier());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ if (handle != null) {
+ return handle.hashCode();
+ } else {
+ return super.hashCode();
+ }
+ }
+
+ public IDegreeOfInterest getInterest() {
+ return interest;
+ }
+
+ public InteractionContext getContext() {
+ return context;
+ }
+
+ @Override
+ public String toString() {
+ return handle;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextExternalizer.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextExternalizer.java
new file mode 100644
index 0000000..887e96a
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextExternalizer.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+
+/**
+ * @author Mik Kersten
+ * @author Jevgeni Holodkov
+ */
+public class InteractionContextExternalizer {
+
+ public static final String ELMNT_INTERACTION_HISTORY_OLD = "interactionEvent"; //$NON-NLS-1$
+
+ public static final String ELMNT_INTERACTION_HISTORY = "InteractionHistory"; //$NON-NLS-1$
+
+ public static final String ATR_STRUCTURE_KIND = "StructureKind"; //$NON-NLS-1$
+
+ public static final String ATR_STRUCTURE_HANDLE = "StructureHandle"; //$NON-NLS-1$
+
+ public static final String ATR_START_DATE = "StartDate"; //$NON-NLS-1$
+
+ public static final String ATR_ORIGIN_ID = "OriginId"; //$NON-NLS-1$
+
+ public static final String ATR_NAVIGATION = "Navigation"; //$NON-NLS-1$
+
+ public static final String ATR_KIND = "Kind"; //$NON-NLS-1$
+
+ public static final String ATR_INTEREST = "Interest"; //$NON-NLS-1$
+
+ public static final String ATR_NUM_EVENTS = "NumEvents"; //$NON-NLS-1$
+
+ public static final String ATR_CREATION_COUNT = "CreationCount"; //$NON-NLS-1$
+
+ public static final String ATR_DELTA = "Delta"; //$NON-NLS-1$
+
+ public static final String ATR_END_DATE = "EndDate"; //$NON-NLS-1$
+
+ public static final String ATR_ID = "Id"; //$NON-NLS-1$
+
+ public static final String ATR_VERSION = "Version"; //$NON-NLS-1$
+
+ static final String DATE_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss.S z"; //$NON-NLS-1$
+
+ static String getFirstContextHandle(File sourceFile) throws CoreException {
+ try {
+ ZipFile zipFile = new ZipFile(sourceFile);
+ try {
+ for (Enumeration<?> e = zipFile.entries(); e.hasMoreElements();) {
+ ZipEntry entry = (ZipEntry) e.nextElement();
+ String name = entry.getName();
+ if (name.endsWith(InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD)) {
+ try {
+ String decodedName = URLDecoder.decode(name,
+ InteractionContextManager.CONTEXT_FILENAME_ENCODING);
+ if (decodedName.length() > InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD.length()) {
+ return decodedName.substring(0, decodedName.length()
+ - InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD.length());
+ }
+ } catch (IllegalArgumentException ignored) {
+ // not a valid context entry
+ }
+ }
+ }
+ return null;
+ } finally {
+ zipFile.close();
+ }
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN,
+ "Could not get context handle from " + sourceFile, e)); //$NON-NLS-1$
+ }
+ }
+
+ public void writeContextToXml(IInteractionContext context, File file) throws IOException {
+ writeContextToXml(context, file, new SaxContextWriter());
+ }
+
+ /**
+ * Public for testing.
+ *
+ * @throws IOException
+ * if writing of context fails
+ */
+ public void writeContextToXml(IInteractionContext context, File file, IInteractionContextWriter writer)
+ throws IOException {
+ if (context.getInteractionHistory().isEmpty()) {
+ return;
+ }
+
+ FileOutputStream fileOutputStream = new FileOutputStream(file);
+ try {
+ ZipOutputStream outputStream = new ZipOutputStream(fileOutputStream);
+ try {
+ writeContext(context, outputStream, writer);
+ } finally {
+ outputStream.close();
+ }
+ } finally {
+ fileOutputStream.close();
+ }
+ }
+
+ public void writeContext(IInteractionContext context, ZipOutputStream outputStream) throws IOException {
+ writeContext(context, outputStream, new SaxContextWriter());
+ }
+
+ /**
+ * For testing
+ */
+ public void writeContext(IInteractionContext context, ZipOutputStream outputStream, IInteractionContextWriter writer)
+ throws IOException {
+ String handleIdentifier = context.getHandleIdentifier();
+ String encoded = URLEncoder.encode(handleIdentifier, InteractionContextManager.CONTEXT_FILENAME_ENCODING);
+ ZipEntry zipEntry = new ZipEntry(encoded + InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD);
+ outputStream.putNextEntry(zipEntry);
+ outputStream.setMethod(ZipOutputStream.DEFLATED);
+
+ writer.setOutputStream(outputStream);
+ writer.writeContextToStream(context);
+ outputStream.flush();
+ outputStream.closeEntry();
+ }
+
+ public IInteractionContext readContextFromXml(String handleIdentifier, File fromFile,
+ IInteractionContextScaling scaling) {
+ return readContextFromXml(handleIdentifier, fromFile, new SaxContextReader(), scaling);
+ }
+
+ /**
+ * Public for testing
+ */
+ public IInteractionContext readContextFromXml(String handleIdentifier, File fromFile,
+ IInteractionContextReader reader, IInteractionContextScaling scaling) {
+ try {
+ if (!fromFile.exists()) {
+ return null;
+ } else {
+ if (reader instanceof SaxContextReader) {
+ ((SaxContextReader) reader).setContextScaling(scaling);
+ }
+
+ InteractionContext context = reader.readContext(handleIdentifier, fromFile);
+ if (context == null) {
+ String firstHandle = getFirstContextHandle(fromFile);
+ if (firstHandle != null && !firstHandle.equals(handleIdentifier)) {
+ context = reader.readContext(firstHandle, fromFile);
+ if (context != null) {
+ context.setHandleIdentifier(handleIdentifier);
+ }
+ }
+ }
+ return context;
+ }
+ } catch (Exception e) {
+ // TODO: propagate exception instead?
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Could not read: " //$NON-NLS-1$
+ + fromFile.getAbsolutePath(), e));
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextManager.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextManager.java
new file mode 100644
index 0000000..b0965c6
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextManager.java
@@ -0,0 +1,1451 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ILock;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextManager;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.context.core.ContextChangeEvent.ContextChangeKind;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
+
+/**
+ * This is the core class resposible for context management.
+ *
+ * @author Mik Kersten
+ * @author Jevgeni Holodkov
+ * @author Shawn Minto
+ */
+public class InteractionContextManager implements IInteractionContextManager {
+
+ public static final String SOURCE_ID_DECAY = "org.eclipse.mylyn.core.model.interest.decay"; //$NON-NLS-1$
+
+ public static final String CONTEXT_FILE_EXTENSION_OLD = ".xml"; //$NON-NLS-1$
+
+ public static final String CONTEXT_FILE_EXTENSION = ".xml.zip"; //$NON-NLS-1$
+
+ public static final String CONTAINMENT_PROPAGATION_ID = "org.eclipse.mylyn.core.model.edges.containment"; //$NON-NLS-1$
+
+ /**
+ * @deprecated not used anymore (used in version < 1.0.1)
+ */
+ @Deprecated
+ public static final String OLD_CONTEXT_HISTORY_FILE_NAME = "context-history"; //$NON-NLS-1$
+
+ public static final String CONTEXT_HISTORY_FILE_NAME = "activity"; //$NON-NLS-1$
+
+ public static final String CONTEXT_FILENAME_ENCODING = "UTF-8"; //$NON-NLS-1$
+
+ public static final String PROPERTY_CONTEXT_ACTIVE = "org.eclipse.mylyn.context.core.context.active"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_STRUCTUREKIND_ACTIVATION = "activation"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_STRUCTUREKIND_TIMING = "timing"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_STRUCTUREKIND_WORKINGSET = "workingset"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_STRUCTUREKIND_LIFECYCLE = "lifecycle"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_ORIGINID_USER = "user"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_ORIGINID_OS = "os"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_ORIGINID_WORKBENCH = "org.eclipse.ui.workbench"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_HANDLE_NONE = "none"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_DELTA_STOPPED = "stopped"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_DELTA_STARTED = "started"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_DELTA_REMOVED = "removed"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_DELTA_ADDED = "added"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_DELTA_ACTIVATED = "activated"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_DELTA_DEACTIVATED = "deactivated"; //$NON-NLS-1$
+
+ // TODO: move constants
+ private static final int MAX_PROPAGATION = 17; // TODO: parametrize this
+
+ private static final ILock metaContextLock = Job.getJobManager().newLock();
+
+ private static final String PREFERENCE_ATTENTION_MIGRATED = "mylyn.attention.migrated"; //$NON-NLS-1$
+
+ private static final String SOURCE_ID_DECAY_CORRECTION = "org.eclipse.mylyn.core.model.interest.decay.correction"; //$NON-NLS-1$
+
+ private static final String SOURCE_ID_MODEL_ERROR = "org.eclipse.mylyn.core.model.interest.propagation"; //$NON-NLS-1$
+
+ private static final String SOURCE_ID_MODEL_PROPAGATION = "org.eclipse.mylyn.core.model.interest.propagation"; //$NON-NLS-1$
+
+ private boolean activationHistorySuppressed = false;
+
+ private final CompositeInteractionContext activeContext = new CompositeInteractionContext(
+ ContextCore.getCommonContextScaling());
+
+ private InteractionContext activityMetaContext = null;
+
+ private final List<AbstractContextListener> activityMetaContextListeners = new CopyOnWriteArrayList<AbstractContextListener>();
+
+ private boolean contextCapturePaused = false;
+
+ private final List<AbstractContextListener> contextListeners = new CopyOnWriteArrayList<AbstractContextListener>();
+
+ private final List<String> errorElementHandles = new ArrayList<String>();
+
+ /**
+ * Global contexts do not participate in the regular activation lifecycle but are instead activated and deactivated
+ * by clients.
+ */
+ private final Collection<IInteractionContext> globalContexts = new HashSet<IInteractionContext>();
+
+ private int numInterestingErrors = 0;
+
+ private boolean suppressListenerNotification = false;
+
+ private final List<AbstractContextListener> waitingContextListeners = new ArrayList<AbstractContextListener>();
+
+ private final LocalContextStore contextStore;
+
+ public InteractionContextManager(LocalContextStore contextStore) {
+ this.contextStore = contextStore;
+ }
+
+ public void activateContext(String handleIdentifier) {
+ try {
+ IInteractionContext loadedContext = activeContext.getContextMap().get(handleIdentifier);
+ final IInteractionContext context;
+ if (loadedContext == null) {
+ context = contextStore.loadContext(handleIdentifier);
+ } else {
+ context = loadedContext;
+ }
+
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.PRE_ACTIVATED,
+ context.getHandleIdentifier(), context, null);
+ listener.contextChanged(event);
+ }
+ });
+ }
+
+ suppressListenerNotification = true;
+ internalActivateContext(context);
+ suppressListenerNotification = false;
+ contextListeners.addAll(waitingContextListeners);
+ waitingContextListeners.clear();
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Could not activate context", t)); //$NON-NLS-1$
+ }
+ }
+
+ public void addActivityMetaContextListener(AbstractContextListener listener) {
+ activityMetaContextListeners.add(listener);
+ }
+
+ /**
+ * Collapse activity events of like handle into one event Grouped by hour.
+ */
+ public void addAttentionEvents(Map<String, List<InteractionEvent>> attention, InteractionContext temp) {
+ try {
+ for (String handle : attention.keySet()) {
+ List<InteractionEvent> activityEvents = attention.get(handle);
+ List<InteractionEvent> collapsedEvents = new ArrayList<InteractionEvent>();
+ if (activityEvents.size() > 1) {
+ collapsedEvents = collapseEventsByHour(activityEvents);
+ } else if (activityEvents.size() == 1) {
+ if (activityEvents.get(0).getEndDate().getTime() - activityEvents.get(0).getDate().getTime() > 0) {
+ collapsedEvents.add(activityEvents.get(0));
+ }
+ }
+ if (!collapsedEvents.isEmpty()) {
+ for (InteractionEvent collapsedEvent : collapsedEvents) {
+ temp.parseEvent(collapsedEvent);
+ }
+ }
+ activityEvents.clear();
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN,
+ "Error during meta activity collapse", e)); //$NON-NLS-1$
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public void addErrorPredictedInterest(String handle, String kind, boolean notify) {
+ if (numInterestingErrors > ((InteractionContextScaling) ContextCore.getCommonContextScaling()).getMaxNumInterestingErrors()
+ || activeContext.getContextMap().isEmpty()) {
+ return;
+ }
+ InteractionEvent errorEvent = new InteractionEvent(InteractionEvent.Kind.PROPAGATION, kind, handle,
+ SOURCE_ID_MODEL_ERROR,
+ ((InteractionContextScaling) ContextCore.getCommonContextScaling()).getErrorInterest());
+ processInteractionEvent(errorEvent, true);
+ errorElementHandles.add(handle);
+ numInterestingErrors++;
+ }
+
+ public void addGlobalContext(IInteractionContext context) {
+ globalContexts.add(context);
+ }
+
+ private IInteractionElement addInteractionEvent(IInteractionContext interactionContext, InteractionEvent event) {
+ if (interactionContext instanceof CompositeInteractionContext) {
+ return ((CompositeInteractionContext) interactionContext).addEvent(event);
+ } else if (interactionContext instanceof InteractionContext) {
+ return ((InteractionContext) interactionContext).parseEvent(event);
+ } else {
+ return null;
+ }
+ }
+
+ public void addListener(AbstractContextListener listener) {
+ Assert.isNotNull(listener);
+ if (suppressListenerNotification && !waitingContextListeners.contains(listener)) {
+ waitingContextListeners.add(listener);
+ } else {
+ if (!contextListeners.contains(listener)) {
+ contextListeners.add(listener);
+ }
+ }
+ }
+
+ protected void checkForLandmarkDeltaAndNotify(float previousInterest, final IInteractionElement node,
+ final IInteractionContext context) {
+ // TODO: don't call interestChanged if it's a landmark?
+ AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault()
+ .getStructureBridge(node.getContentType());
+ if (bridge.canBeLandmark(node.getHandleIdentifier())) {
+ if (previousInterest >= ContextCore.getCommonContextScaling().getLandmark()
+ && !node.getInterest().isLandmark()) {
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ List<IInteractionElement> changed = new ArrayList<IInteractionElement>(1);
+ changed.add(node);
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.LANDMARKS_REMOVED,
+ context.getHandleIdentifier(), context, changed);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ } else if (previousInterest < ContextCore.getCommonContextScaling().getLandmark()
+ && node.getInterest().isLandmark()) {
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ List<IInteractionElement> changed = new ArrayList<IInteractionElement>(1);
+ changed.add(node);
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.LANDMARKS_ADDED,
+ context.getHandleIdentifier(), context, changed);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ public InteractionContext collapseActivityMetaContext(InteractionContext context) {
+ Map<String, List<InteractionEvent>> attention = new HashMap<String, List<InteractionEvent>>();
+ InteractionContext tempContext = new InteractionContext(InteractionContextManager.CONTEXT_HISTORY_FILE_NAME,
+ ContextCore.getCommonContextScaling());
+ for (InteractionEvent event : context.getInteractionHistory()) {
+
+ if (event.getKind().equals(InteractionEvent.Kind.ATTENTION)
+ && event.getDelta().equals(InteractionContextManager.ACTIVITY_DELTA_ADDED)) {
+ if (event.getStructureHandle() == null || event.getStructureHandle().equals("")) { //$NON-NLS-1$
+ continue;
+ }
+ List<InteractionEvent> interactionEvents = attention.get(event.getStructureHandle());
+ if (interactionEvents == null) {
+ interactionEvents = new ArrayList<InteractionEvent>();
+ attention.put(event.getStructureHandle(), interactionEvents);
+ }
+ interactionEvents.add(event);
+ } else {
+ if (!attention.isEmpty()) {
+ addAttentionEvents(attention, tempContext);
+ attention.clear();
+ }
+ tempContext.parseEvent(event);
+ }
+ }
+
+ if (!attention.isEmpty()) {
+ addAttentionEvents(attention, tempContext);
+ }
+
+ return tempContext;
+ }
+
+ /** public for testing * */
+ // TODO: simplify
+ public List<InteractionEvent> collapseEventsByHour(List<InteractionEvent> eventsToCollapse) {
+ List<InteractionEvent> collapsedEvents = new ArrayList<InteractionEvent>();
+ Iterator<InteractionEvent> itr = eventsToCollapse.iterator();
+ InteractionEvent firstEvent = itr.next();
+ long total = 0;
+ Calendar t0 = Calendar.getInstance();
+ Calendar t1 = Calendar.getInstance();
+ while (itr.hasNext()) {
+
+ t0.setTime(firstEvent.getDate());
+ t0.set(Calendar.MINUTE, 0);
+ t0.set(Calendar.MILLISECOND, 0);
+
+ t1.setTime(firstEvent.getDate());
+ t1.set(Calendar.MINUTE, t1.getMaximum(Calendar.MINUTE));
+ t1.set(Calendar.MILLISECOND, t1.getMaximum(Calendar.MILLISECOND));
+
+ InteractionEvent nextEvent = itr.next();
+ if (t0.getTime().compareTo(nextEvent.getDate()) <= 0 && t1.getTime().compareTo(nextEvent.getDate()) >= 0) {
+ // Collapsible event
+ if (total == 0) {
+ total += firstEvent.getEndDate().getTime() - firstEvent.getDate().getTime();
+ }
+ total += nextEvent.getEndDate().getTime() - nextEvent.getDate().getTime();
+
+ if (!itr.hasNext()) {
+ if (total != 0) {
+ Date newEndDate = new Date(firstEvent.getDate().getTime() + total);
+ InteractionEvent aggregateEvent = new InteractionEvent(firstEvent.getKind(),
+ firstEvent.getStructureKind(), firstEvent.getStructureHandle(),
+ firstEvent.getOriginId(), firstEvent.getNavigation(), firstEvent.getDelta(), 1f,
+ firstEvent.getDate(), newEndDate);
+ collapsedEvents.add(aggregateEvent);
+ total = 0;
+ }
+ }
+
+ } else {
+ // Next event isn't collapsible, add collapsed if exists
+ if (total != 0) {
+ Date newEndDate = new Date(firstEvent.getDate().getTime() + total);
+ InteractionEvent aggregateEvent = new InteractionEvent(firstEvent.getKind(),
+ firstEvent.getStructureKind(), firstEvent.getStructureHandle(), firstEvent.getOriginId(),
+ firstEvent.getNavigation(), firstEvent.getDelta(), 1f, firstEvent.getDate(), newEndDate);
+ collapsedEvents.add(aggregateEvent);
+ total = 0;
+ } else {
+ collapsedEvents.add(firstEvent);
+ if (!itr.hasNext()) {
+ collapsedEvents.add(nextEvent);
+ }
+ }
+
+ firstEvent = nextEvent;
+ }
+
+ }
+
+ return collapsedEvents;
+ }
+
+ public void deactivateAllContexts() {
+ Set<String> handles = new HashSet<String>(activeContext.getContextMap().keySet());
+ for (String handleIdentifier : handles) {
+ deactivateContext(handleIdentifier);
+ }
+ }
+
+ public void deactivateContext(String handleIdentifier) {
+ try {
+ System.setProperty(InteractionContextManager.PROPERTY_CONTEXT_ACTIVE, Boolean.FALSE.toString());
+
+ final IInteractionContext context = activeContext.getContextMap().get(handleIdentifier);
+ if (context != null) {
+ contextStore.saveContext(context);
+ activeContext.getContextMap().remove(handleIdentifier);
+
+ setContextCapturePaused(true);
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.DEACTIVATED,
+ context.getHandleIdentifier(), context, null);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ setContextCapturePaused(false);
+ }
+ if (!activationHistorySuppressed) {
+ processActivityMetaContextEvent(new InteractionEvent(InteractionEvent.Kind.COMMAND,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_ACTIVATION, handleIdentifier,
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 1f));
+ }
+// saveActivityMetaContext();
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Could not deactivate context", t)); //$NON-NLS-1$
+ }
+ }
+
+ public void deleteElement(IInteractionElement element) {
+ delete(element, getActiveContext());
+ notifyElementsDeleted(getActiveContext(), Arrays.asList(new IInteractionElement[] { element }));
+ }
+
+ public void deleteElements(Collection<IInteractionElement> elements) {
+ Assert.isNotNull(elements);
+ IInteractionContext context = getActiveContext();
+ if (elements.size() == 0 || context == null) {
+ return;
+ }
+
+ context.delete(elements);
+
+ notifyElementsDeleted(getActiveContext(), new ArrayList<IInteractionElement>(elements));
+ }
+
+ private void delete(IInteractionElement element, IInteractionContext context) {
+ if (element == null || context == null) {
+ return;
+ }
+ context.delete(element);
+ }
+
+ public void deleteContext(final String handleIdentifier) {
+ final IInteractionContext context = activeContext.getContextMap().get(handleIdentifier);
+
+ setContextCapturePaused(true);
+ eraseContext(handleIdentifier);
+
+ contextStore.deleteContext(handleIdentifier);
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.CLEARED, handleIdentifier,
+ context, null);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ setContextCapturePaused(false);
+ }
+
+ private float ensureIsInteresting(IInteractionContext interactionContext, String contentType, String handle,
+ IInteractionElement previous, float previousInterest) {
+ float decayOffset = 0;
+ if (previousInterest < 0) { // reset interest if not interesting
+ decayOffset = (-1) * (previous.getInterest().getValue());
+ addInteractionEvent(interactionContext, new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
+ contentType, handle, SOURCE_ID_DECAY_CORRECTION, decayOffset));
+ }
+ return decayOffset;
+ }
+
+ private void eraseContext(String handleIdentifier) {
+ InteractionContext context = activeContext.getContextMap().get(handleIdentifier);
+ if (context == null) {
+ return;
+ }
+ activeContext.getContextMap().remove(context);
+ context.reset();
+ }
+
+ public IInteractionContext getActiveContext() {
+ return activeContext;
+ }
+
+ public Collection<InteractionContext> getActiveContexts() {
+ return Collections.unmodifiableCollection(activeContext.getContextMap().values());
+ }
+
+ public IInteractionElement getActiveElement() {
+ if (activeContext != null) {
+ return activeContext.getActiveNode();
+ } else {
+ return null;
+ }
+ }
+
+ public Set<IInteractionElement> getActiveLandmarks() {
+ List<IInteractionElement> allLandmarks = activeContext.getLandmarks();
+ Set<IInteractionElement> acceptedLandmarks = new HashSet<IInteractionElement>();
+ for (IInteractionElement node : allLandmarks) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(node.getContentType());
+
+ if (bridge.canBeLandmark(node.getHandleIdentifier())) {
+ acceptedLandmarks.add(node);
+ }
+ }
+ return acceptedLandmarks;
+ }
+
+ public InteractionContext getActivityMetaContext() {
+ try {
+ metaContextLock.acquire();
+ if (activityMetaContext == null) {
+ loadActivityMetaContext();
+ }
+ } finally {
+ metaContextLock.release();
+ }
+ return activityMetaContext;
+ }
+
+ /**
+ * Returns the highest interest context. TODO: refactor this into better multiple context support
+ */
+ @Deprecated
+ public String getDominantContextHandleForElement(IInteractionElement node) {
+ IInteractionElement dominantNode = null;
+ if (node instanceof CompositeContextElement) {
+ CompositeContextElement compositeNode = (CompositeContextElement) node;
+ if (compositeNode.getNodes().isEmpty()) {
+ return null;
+ }
+ dominantNode = (IInteractionElement) compositeNode.getNodes().toArray()[0];
+
+ for (IInteractionElement concreteNode : compositeNode.getNodes()) {
+ if (dominantNode != null
+ && dominantNode.getInterest().getValue() < concreteNode.getInterest().getValue()) {
+ dominantNode = concreteNode;
+ }
+ }
+ } else if (node instanceof InteractionContextElement) {
+ dominantNode = node;
+ }
+ if (dominantNode != null) {
+ return ((InteractionContextElement) dominantNode).getContext().getHandleIdentifier();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @return null if the element handle is null or if the element is not found in the active task context.
+ */
+ public IInteractionElement getElement(String elementHandle) {
+ if (activeContext != null && elementHandle != null) {
+ return activeContext.get(elementHandle);
+ } else {
+ return null;
+ }
+ }
+
+ public Collection<IInteractionContext> getGlobalContexts() {
+ return globalContexts;
+ }
+
+ public Collection<IInteractionElement> getActiveDocuments() {
+ return getActiveDocuments(activeContext);
+ }
+
+ public Set<IInteractionElement> getActiveDocuments(IInteractionContext context) {
+ Set<IInteractionElement> set = new HashSet<IInteractionElement>();
+ if (context == null) {
+ return set;
+ } else {
+ List<IInteractionElement> allIntersting = context.getInteresting();
+ for (IInteractionElement node : allIntersting) {
+ if (ContextCore.getStructureBridge(node.getContentType()).isDocument(node.getHandleIdentifier())) {
+ set.add(node);
+ }
+ }
+ return set;
+ }
+ }
+
+ /**
+ * For testing.
+ */
+ public List<AbstractContextListener> getListeners() {
+ return Collections.unmodifiableList(contextListeners);
+ }
+
+ /**
+ * Lazily loads set of handles with corresponding contexts.
+ */
+ public boolean hasContext(String handleIdentifier) {
+ if (handleIdentifier == null) {
+ return false;
+ }
+
+ if (getActiveContext() != null && handleIdentifier.equals(getActiveContext().getHandleIdentifier())) {
+ return !getActiveContext().getAllElements().isEmpty();
+ } else {
+ return contextStore.hasContext(handleIdentifier);
+ }
+ }
+
+ /**
+ * Public for testing, activate via handle
+ */
+ public void internalActivateContext(final IInteractionContext context) {
+ Assert.isTrue(context instanceof InteractionContext, "Must provide a concrete InteractionContext"); //$NON-NLS-1$
+
+ System.setProperty(InteractionContextManager.PROPERTY_CONTEXT_ACTIVE, Boolean.TRUE.toString());
+ activeContext.getContextMap().put(context.getHandleIdentifier(), (InteractionContext) context);
+// if (contextFiles != null) {
+// contextFiles.add(getFileForContext(context.getHandleIdentifier()));
+// }
+ if (!activationHistorySuppressed) {
+ processActivityMetaContextEvent(new InteractionEvent(InteractionEvent.Kind.COMMAND,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_ACTIVATION, context.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 1f));
+ }
+
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.ACTIVATED,
+ context.getHandleIdentifier(), context, null);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ }
+
+ public List<IInteractionElement> internalProcessInteractionEvent(InteractionEvent event,
+ IInteractionContext interactionContext, boolean propagateToParents) {
+ if (contextCapturePaused || InteractionEvent.Kind.COMMAND.equals(event.getKind())
+ || suppressListenerNotification) {
+ return Collections.emptyList();
+ }
+
+ IInteractionElement previous = interactionContext.get(event.getStructureHandle());
+ float previousInterest = 0;
+ boolean previouslyPredicted = false;
+ boolean previouslyPropagated = false;
+ float decayOffset = 0;
+ if (previous != null) {
+ previousInterest = previous.getInterest().getValue();
+ previouslyPredicted = previous.getInterest().isPredicted();
+ previouslyPropagated = previous.getInterest().isPropagated();
+ }
+ if (event.getKind().isUserEvent()) {
+ decayOffset = ensureIsInteresting(interactionContext, event.getStructureKind(), event.getStructureHandle(),
+ previous, previousInterest);
+ }
+ IInteractionElement element = addInteractionEvent(interactionContext, event);
+ List<IInteractionElement> interestDelta = new ArrayList<IInteractionElement>();
+ if (propagateToParents && !event.getKind().equals(InteractionEvent.Kind.MANIPULATION)) {
+ Set<String> handles = new HashSet<String>();
+ handles.add(element.getHandleIdentifier());
+
+ propegateInterestToParents(interactionContext, event.getKind(), element, previousInterest, decayOffset, 1,
+ interestDelta, event.getOriginId(), null, handles);
+ }
+ if (event.getKind().isUserEvent() && interactionContext instanceof CompositeInteractionContext) {
+ ((CompositeInteractionContext) interactionContext).setActiveElement(element);
+ }
+
+ if (isInterestDelta(previousInterest, previouslyPredicted, previouslyPropagated, element)) {
+ interestDelta.add(element);
+ }
+
+ checkForLandmarkDeltaAndNotify(previousInterest, element, interactionContext);
+ return interestDelta;
+ }
+
+ public boolean isActivationHistorySuppressed() {
+ return activationHistorySuppressed;
+ }
+
+ // TODO consider removing check for pause and making clients explicitly determine this,
+ // or provide a separate method
+ public boolean isContextActive() {
+ return !contextCapturePaused && activeContext.getContextMap().values().size() > 0;
+ }
+
+ @Deprecated
+ public boolean isContextActivePropertySet() {
+ return Boolean.parseBoolean(System.getProperty(InteractionContextManager.PROPERTY_CONTEXT_ACTIVE));
+ }
+
+ public boolean isContextCapturePaused() {
+ return contextCapturePaused;
+ }
+
+ protected boolean isInterestDelta(float previousInterest, boolean previouslyPredicted,
+ boolean previouslyPropagated, IInteractionElement node) {
+ float currentInterest = node.getInterest().getValue();
+ if (previousInterest <= 0 && currentInterest > 0) {
+ return true;
+ } else if (previousInterest > 0 && currentInterest <= 0) {
+ return true;
+ } else if (currentInterest > 0 && previouslyPredicted && !node.getInterest().isPredicted()) {
+ return true;
+ } else if (currentInterest > 0 && previouslyPropagated && !node.getInterest().isPropagated()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void loadActivityMetaContext() {
+ if (contextStore != null) {
+ for (final AbstractContextListener listener : activityMetaContextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.PRE_ACTIVATED,
+ InteractionContextManager.CONTEXT_HISTORY_FILE_NAME, null, null);
+ listener.contextChanged(event);
+ }
+ });
+ }
+
+ try {
+ metaContextLock.acquire();
+
+ activityMetaContext = (InteractionContext) contextStore.loadContext(InteractionContextManager.CONTEXT_HISTORY_FILE_NAME);
+ if (activityMetaContext == null || activityMetaContext.getInteractionHistory().isEmpty()) {
+ File contextHistory = contextStore.getFileForContext(InteractionContextManager.CONTEXT_HISTORY_FILE_NAME);
+ if (restoreSnapshot(contextHistory)) {
+ activityMetaContext = (InteractionContext) contextStore.loadContext(InteractionContextManager.CONTEXT_HISTORY_FILE_NAME);
+ }
+ }
+
+ if (activityMetaContext == null) {
+ resetActivityMetaContext();
+ } else if (!ContextCorePlugin.getDefault().getPluginPreferences().getBoolean(
+ PREFERENCE_ATTENTION_MIGRATED)) {
+ activityMetaContext = migrateLegacyActivity(activityMetaContext);
+ saveActivityMetaContext();
+ ContextCorePlugin.getDefault().getPluginPreferences().setValue(PREFERENCE_ATTENTION_MIGRATED, true);
+ ContextCorePlugin.getDefault().savePluginPreferences();
+ }
+ } finally {
+ metaContextLock.release();
+ }
+
+ for (final AbstractContextListener listener : activityMetaContextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.ACTIVATED,
+ activityMetaContext.getHandleIdentifier(), activityMetaContext, null);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ } else {
+ resetActivityMetaContext();
+ StatusHandler.log(new Status(IStatus.INFO, ContextCorePlugin.ID_PLUGIN,
+ "No context store installed, not restoring activity context.")); //$NON-NLS-1$
+ }
+ }
+
+ public void saveActivityMetaContext() {
+ if (contextStore == null) {
+ return;
+ }
+ boolean wasPaused = contextCapturePaused;
+ try {
+ metaContextLock.acquire();
+ if (!wasPaused) {
+ setContextCapturePaused(true);
+ }
+
+ InteractionContext context = getActivityMetaContext();
+ takeSnapshot(contextStore.getFileForContext(InteractionContextManager.CONTEXT_HISTORY_FILE_NAME));
+ contextStore.saveContext(collapseActivityMetaContext(context),
+ InteractionContextManager.CONTEXT_HISTORY_FILE_NAME);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Could not save activity history", //$NON-NLS-1$
+ t));
+ } finally {
+ metaContextLock.release();
+ if (!wasPaused) {
+ setContextCapturePaused(false);
+ }
+ }
+ }
+
+ /**
+ * COPY: from AbstractExternalizationParticipant
+ */
+ protected boolean takeSnapshot(File file) {
+ if (file.length() > 0) {
+ File originalFile = file.getAbsoluteFile();
+ File backup = new File(file.getParentFile(), "." + file.getName()); //$NON-NLS-1$
+ backup.delete();
+ return originalFile.renameTo(backup);
+ }
+ return false;
+ }
+
+ protected boolean restoreSnapshot(File file) {
+ File backup = new File(file.getParentFile(), "." + file.getName()); //$NON-NLS-1$
+ File originalFile = file.getAbsoluteFile();
+ if (originalFile.exists()) {
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HHmmss", Locale.ENGLISH); //$NON-NLS-1$
+ File failed = new File(file.getParentFile(), "failed-" + format.format(new Date()) + "-" //$NON-NLS-1$ //$NON-NLS-2$
+ + originalFile.getName());
+ originalFile.renameTo(failed);
+ }
+ if (backup.exists()) {
+ return backup.renameTo(originalFile);
+ }
+ return false;
+ }
+
+ /**
+ * Manipulates interest for the active context.
+ */
+ // TODO 3.3 revise or remove this and it's helper
+ public boolean manipulateInterestForElement(IInteractionElement element, boolean increment, boolean forceLandmark,
+ boolean preserveUninteresting, String sourceId) {
+ if (!isContextActive()) {
+ return false;
+ } else {
+ return manipulateInterestForElement(element, increment, forceLandmark, preserveUninteresting, sourceId,
+ activeContext);
+ }
+ }
+
+ /**
+ * @return true if interest was manipulated successfully
+ */
+ public boolean manipulateInterestForElement(IInteractionElement element, boolean increment, boolean forceLandmark,
+ boolean preserveUninteresting, String sourceId, IInteractionContext context) {
+ Set<IInteractionElement> changedElements = new HashSet<IInteractionElement>();
+ boolean manipulated = manipulateInterestForElementHelper(element, increment, forceLandmark,
+ preserveUninteresting, sourceId, context, changedElements, null);
+
+ if (manipulated) {
+ if (preserveUninteresting || increment) {
+ notifyInterestDelta(new ArrayList<IInteractionElement>(changedElements));
+ } else {
+ notifyElementsDeleted(context, new ArrayList<IInteractionElement>(changedElements));
+ }
+ }
+ return manipulated;
+ }
+
+ private boolean manipulateInterestForElementHelper(IInteractionElement element, boolean increment,
+ boolean forceLandmark, boolean preserveUninteresting, String sourceId, IInteractionContext context,
+ Set<IInteractionElement> changedElements, AbstractContextStructureBridge forcedBridge) {
+ if (element == null || context == null) {
+ return false;
+ }
+ float originalValue = element.getInterest().getValue();
+ float changeValue = 0;
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element.getContentType());
+
+ // XXX go through each bridge here?
+ // make sure that we manipulate the interest on all bridges and not just the one that the element
+ // maps to
+ Object objectForHandle = bridge.getObjectForHandle(element.getHandleIdentifier());
+ String parentContentType = bridge.getParentContentType();
+ if (parentContentType != null && objectForHandle != null) {
+ AbstractContextStructureBridge parentBridge = ContextCorePlugin.getDefault().getStructureBridge(
+ parentContentType);
+
+ if (parentBridge != null && parentBridge != forcedBridge) {
+ String parentBridgeHandle = parentBridge.getHandleIdentifier(objectForHandle);
+
+ if (parentBridgeHandle != null) {
+ IInteractionElement parentBridgeElement = context.get(parentBridgeHandle);
+ manipulateInterestForElementHelper(parentBridgeElement, increment, forceLandmark,
+ preserveUninteresting, sourceId, context, changedElements, parentBridge);
+ }
+ }
+ }
+
+ if (forcedBridge != null) {
+ // if there is a forced bridge, we should be using it
+ bridge = forcedBridge;
+ }
+
+ if (!increment) {
+ if (element.getInterest().isLandmark() && bridge.canBeLandmark(element.getHandleIdentifier())) {
+ // keep it interesting
+ changeValue = (-1 * originalValue) + 1;
+ } else {
+ // make uninteresting
+ if (originalValue >= 0) {
+ changeValue = ((-1) * originalValue) - 1;
+ }
+
+ // reduce interest of children
+ for (String childHandle : bridge.getChildHandles(element.getHandleIdentifier())) {
+ IInteractionElement childElement = context.get(childHandle);
+ if (childElement != null /*&& childElement.getInterest().isInteresting()*/
+ && !childElement.equals(element)) {
+ manipulateInterestForElementHelper(childElement, increment, forceLandmark,
+ preserveUninteresting, sourceId, context, changedElements, forcedBridge);
+ }
+ }
+ }
+ } else {
+ if (!forceLandmark && (originalValue > context.getScaling().getLandmark())) {
+ changeValue = 0;
+ } else {
+ if (bridge.canBeLandmark(element.getHandleIdentifier())) {
+ changeValue = (context.getScaling().getForcedLandmark()) - originalValue + 1;
+ } else {
+ return false;
+ }
+ }
+ }
+// if (changeValue > context.getScaling().getInteresting() || preserveUninteresting) {
+ if (increment || preserveUninteresting) {
+ InteractionEvent interactionEvent = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
+ element.getContentType(), element.getHandleIdentifier(), sourceId, changeValue);
+ List<IInteractionElement> interestDelta = internalProcessInteractionEvent(interactionEvent, context, true);
+ changedElements.addAll(interestDelta);
+// notifyInterestDelta(interestDelta);
+ } else { //if (changeValue < context.getScaling().getInteresting()) {
+ changedElements.add(element);
+ delete(element, context);
+ }
+ return true;
+ }
+
+ /**
+ * Used to migrate old activity to new activity events
+ *
+ * @since 2.1
+ */
+ public InteractionContext migrateLegacyActivity(InteractionContext context) {
+ LegacyActivityAdaptor adaptor = new LegacyActivityAdaptor();
+ InteractionContext newMetaContext = new InteractionContext(context.getHandleIdentifier(),
+ ContextCore.getCommonContextScaling());
+ for (InteractionEvent event : context.getInteractionHistory()) {
+ InteractionEvent temp = adaptor.parseInteractionEvent(event);
+ if (temp != null) {
+ newMetaContext.parseEvent(temp);
+ }
+ }
+ return newMetaContext;
+ }
+
+ private void notifyElementsDeleted(final IInteractionContext context, final List<IInteractionElement> interestDelta) {
+ if (!interestDelta.isEmpty()) {
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.ELEMENTS_DELETED,
+ context.getHandleIdentifier(), context, interestDelta);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ }
+ }
+
+ @Deprecated
+ public void notifyInterestDelta(final List<IInteractionElement> interestDelta) {
+ notifyInterestDelta(getActiveContext(), interestDelta);
+ }
+
+ public void notifyInterestDelta(final IInteractionContext context, final List<IInteractionElement> interestDelta) {
+ if (!interestDelta.isEmpty()) {
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.INTEREST_CHANGED,
+ context.getHandleIdentifier(), context, interestDelta);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Copy the listener list in case it is modified during the notificiation.
+ *
+ * @param element
+ */
+ public void notifyRelationshipsChanged(final IInteractionElement element) {
+ if (suppressListenerNotification) {
+ return;
+ }
+ for (final AbstractContextListener listener : contextListeners) {
+ if (listener instanceof IRelationsListener) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ((IRelationsListener) listener).relationsChanged(element);
+ }
+ });
+
+ }
+ }
+ }
+
+ public void processActivityMetaContextEvent(InteractionEvent event) {
+ IInteractionElement element = getActivityMetaContext().parseEvent(event);
+
+ final List<IInteractionElement> changed = Collections.singletonList(element);
+ for (final AbstractContextListener listener : activityMetaContextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.INTEREST_CHANGED,
+ getActivityMetaContext().getHandleIdentifier(), getActivityMetaContext(), changed);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ }
+
+ public IInteractionElement processInteractionEvent(InteractionEvent event) {
+ return processInteractionEvent(event, true);
+ }
+
+ public IInteractionElement processInteractionEvent(InteractionEvent event, boolean propagateToParents) {
+ return processInteractionEvent(event, propagateToParents, true);
+ }
+
+ public IInteractionElement processInteractionEvent(InteractionEvent event, boolean propagateToParents,
+ boolean notifyListeners) {
+ boolean alreadyNotified = false;
+ if (isContextActive()) {
+ List<IInteractionElement> interestDelta = internalProcessInteractionEvent(event, activeContext,
+ propagateToParents);
+ if (notifyListeners) {
+ notifyInterestDelta(interestDelta);
+ }
+ }
+ for (IInteractionContext globalContext : globalContexts) {
+ if (globalContext.getContentLimitedTo().equals(event.getStructureKind())) {
+ List<IInteractionElement> interestDelta = internalProcessInteractionEvent(event, globalContext,
+ propagateToParents);
+ if (notifyListeners && !alreadyNotified) {
+ notifyInterestDelta(interestDelta);
+ }
+ }
+ }
+
+ return activeContext.get(event.getStructureHandle());
+ }
+
+ /**
+ * TODO: consider using IInteractionElement instead, or making other methods consistent
+ */
+ public IInteractionElement processInteractionEvent(Object object, Kind eventKind, String origin,
+ IInteractionContext context) {
+ AbstractContextStructureBridge structureBridge = ContextCore.getStructureBridge(object);
+ if (structureBridge != null) {
+ String structureKind = structureBridge.getContentType();
+ String handle = structureBridge.getHandleIdentifier(object);
+ if (structureKind != null && handle != null) {
+ InteractionEvent event = new InteractionEvent(eventKind, structureKind, handle, origin);
+ List<IInteractionElement> interestDelta = internalProcessInteractionEvent(event, context, true);
+
+ notifyInterestDelta(interestDelta);
+
+ return context.get(event.getStructureHandle());
+ }
+ }
+ return null;
+ }
+
+ public void processInteractionEvents(List<InteractionEvent> events, boolean propagateToParents) {
+ Set<IInteractionElement> compositeDelta = new HashSet<IInteractionElement>();
+ for (InteractionEvent event : events) {
+ if (isContextActive()) {
+ compositeDelta.addAll(internalProcessInteractionEvent(event, activeContext, propagateToParents));
+ }
+ for (IInteractionContext globalContext : globalContexts) {
+ if (globalContext.getContentLimitedTo().equals(event.getStructureKind())) {
+ internalProcessInteractionEvent(event, globalContext, propagateToParents);
+ }
+ }
+ }
+ notifyInterestDelta(new ArrayList<IInteractionElement>(compositeDelta));
+ }
+
+ /**
+ * Policy is that a parent should not have an interest lower than that of one of its children. This meets our goal
+ * of having them decay no faster than the children while having their interest be proportional to the interest of
+ * their children.
+ *
+ * @param forcedBridge
+ * The structure bridge that we should use. Can be null, then we will automatically select
+ * @param handles
+ * Handles that have already been handled in the propagation
+ */
+ private void propegateInterestToParents(IInteractionContext interactionContext, InteractionEvent.Kind kind,
+ IInteractionElement node, float previousInterest, float decayOffset, int level,
+ List<IInteractionElement> interestDelta, String origin, AbstractContextStructureBridge forcedBridge,
+ Set<String> handles) {
+
+ if (level > MAX_PROPAGATION || node == null || node.getHandleIdentifier() == null
+ || node.getInterest().getValue() <= 0) {
+ return;
+ }
+
+ checkForLandmarkDeltaAndNotify(previousInterest, node, interactionContext);
+ level++; // original is 1st level
+
+ // NOTE: original code summed parent interest
+// float propagatedIncrement = node.getInterest().getValue() - previousInterest + decayOffset;
+
+ AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault()
+ .getStructureBridge(node.getContentType());
+
+ // make sure that we propagate the interest on all bridges and not just the one that the element
+ // maps to
+ Object objectForHandle = bridge.getObjectForHandle(node.getHandleIdentifier());
+ String parentBridgeContentType = bridge.getParentContentType();
+ if (parentBridgeContentType != null && objectForHandle != null) {
+ AbstractContextStructureBridge parentBridge = ContextCorePlugin.getDefault().getStructureBridge(
+ parentBridgeContentType);
+
+ if (parentBridge != null && parentBridge != forcedBridge) {
+ String parentHandle = parentBridge.getHandleIdentifier(objectForHandle);
+
+ if (parentHandle != null) {
+ // make sure that the element for the parent bridge is in the context
+ IInteractionElement parentBridgeElement = interactionContext.get(parentHandle);
+ float parentPreviousInterest = 0;
+ float parentDecayOffset = 0;
+ if (parentBridgeElement != null) {
+ parentPreviousInterest = parentBridgeElement.getInterest().getValue();
+ }
+ if (kind.isUserEvent()) {
+ parentDecayOffset = ensureIsInteresting(interactionContext, parentBridge.getContentType(),
+ parentHandle, parentBridgeElement, parentPreviousInterest);
+ }
+ if (!handles.contains(parentHandle)) {
+ handles.add(parentHandle);
+ parentBridgeElement = addInteractionEvent(interactionContext, new InteractionEvent(
+ InteractionEvent.Kind.PROPAGATION, parentBridge.getContentType(), parentHandle, origin));
+ } else {
+ parentBridgeElement = interactionContext.get(parentHandle);
+ }
+
+ propegateInterestToParents(interactionContext, kind, parentBridgeElement, previousInterest,
+ parentDecayOffset, level, interestDelta, origin, parentBridge, handles);
+ }
+ }
+ }
+
+ // ensure we use the forced bridge if we are given one
+ if (forcedBridge != null) {
+ bridge = forcedBridge;
+ }
+ String parentHandle = bridge.getParentHandle(node.getHandleIdentifier(), forcedBridge == null); //false);
+
+ // do not check child bridges if we are using a foced bridge
+ if (forcedBridge == null) {
+ // check if should use child bridge
+ for (String contentType : ContextCore.getChildContentTypes(bridge.getContentType())) {
+ AbstractContextStructureBridge childBridge = ContextCore.getStructureBridge(contentType);
+ Object resolved = childBridge.getObjectForHandle(parentHandle);
+ if (resolved != null) {
+ AbstractContextStructureBridge canonicalBridge = ContextCore.getStructureBridge(resolved);
+ // HACK: hard-coded resource content type
+ if (!canonicalBridge.getContentType().equals(ContextCore.CONTENT_TYPE_RESOURCE)) {
+ // NOTE: resetting bridge
+ bridge = canonicalBridge;
+ }
+ }
+ }
+ }
+
+ if (parentHandle != null) {
+ String parentContentType = bridge.getContentType(parentHandle);
+
+ IInteractionElement parentElement = interactionContext.get(parentHandle);
+ float parentPreviousInterest = 0;
+ if (parentElement != null && parentElement.getInterest() != null) {
+ parentPreviousInterest = parentElement.getInterest().getValue();
+ }
+
+ // NOTE: if element marked as landmark, this propagates the landmark value to all parents
+ float increment = interactionContext.getScaling().getInteresting();
+ if (parentPreviousInterest < node.getInterest().getValue()) {
+ increment = node.getInterest().getValue() - parentPreviousInterest;
+ InteractionEvent propagationEvent = new InteractionEvent(InteractionEvent.Kind.PROPAGATION,
+ parentContentType, parentHandle, SOURCE_ID_MODEL_PROPAGATION,
+ InteractionContextManager.CONTAINMENT_PROPAGATION_ID, increment);
+ if (!handles.contains(parentHandle)) {
+ handles.add(parentHandle);
+ parentElement = addInteractionEvent(interactionContext, propagationEvent);
+ } else {
+ parentElement = interactionContext.get(parentHandle);
+ }
+
+ }
+
+ // NOTE: this might be redundant
+ if (parentElement != null && kind.isUserEvent()
+ && parentElement.getInterest().getValue() < ContextCore.getCommonContextScaling().getInteresting()) {
+ float parentOffset = ContextCore.getCommonContextScaling().getInteresting()
+ - parentElement.getInterest().getValue() + increment;
+ if (!handles.contains(parentHandle)) {
+ handles.add(parentHandle);
+ addInteractionEvent(interactionContext, new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
+ parentElement.getContentType(), parentElement.getHandleIdentifier(),
+ SOURCE_ID_DECAY_CORRECTION, parentOffset));
+ } else {
+ parentElement = interactionContext.get(parentElement.getHandleIdentifier());
+ }
+ }
+
+ if (parentElement != null
+ && isInterestDelta(parentPreviousInterest, parentElement.getInterest().isPredicted(),
+ parentElement.getInterest().isPropagated(), parentElement)) {
+ interestDelta.add(0, parentElement);
+ }
+ propegateInterestToParents(interactionContext, kind, parentElement, parentPreviousInterest, decayOffset,
+ level, interestDelta, origin, forcedBridge, handles);
+ }
+ }
+
+ public void removeActivityMetaContextListener(AbstractContextListener listener) {
+ activityMetaContextListeners.remove(listener);
+ }
+
+ public void removeAllListeners() {
+ waitingContextListeners.clear();
+ contextListeners.clear();
+ }
+
+ /**
+ * TODO: worry about decay-related change if predicted interest dacays
+ */
+ @SuppressWarnings("deprecation")
+ public void removeErrorPredictedInterest(String handle, String kind, boolean notify) {
+ if (activeContext.getContextMap().isEmpty()) {
+ return;
+ }
+ if (handle == null) {
+ return;
+ }
+ final IInteractionElement element = activeContext.get(handle);
+ if (element != null && element.getInterest().isInteresting() && errorElementHandles.contains(handle)) {
+ InteractionEvent errorEvent = new InteractionEvent(InteractionEvent.Kind.MANIPULATION, kind, handle,
+ SOURCE_ID_MODEL_ERROR,
+ ((InteractionContextScaling) ContextCore.getCommonContextScaling()).getErrorInterest());
+ processInteractionEvent(errorEvent, true);
+ numInterestingErrors--;
+ errorElementHandles.remove(handle);
+ // TODO: this results in double-notification
+ if (notify) {
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ // FIXME use singleton list instead that is constructed outside of loop
+ List<IInteractionElement> changed = new ArrayList<IInteractionElement>();
+ changed.add(element);
+ listener.interestChanged(changed);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ public void removeGlobalContext(IInteractionContext context) {
+ globalContexts.remove(context);
+ }
+
+ public void removeListener(AbstractContextListener listener) {
+ waitingContextListeners.remove(listener);
+ contextListeners.remove(listener);
+ }
+
+ public void resetActivityMetaContext() {
+ try {
+ metaContextLock.acquire();
+ activityMetaContext = new InteractionContext(InteractionContextManager.CONTEXT_HISTORY_FILE_NAME,
+ ContextCore.getCommonContextScaling());
+ saveActivityMetaContext();
+ } finally {
+ metaContextLock.release();
+ }
+ }
+
+ public void resetLandmarkRelationshipsOfKind(String reltationKind) {
+ for (IInteractionElement landmark : activeContext.getLandmarks()) {
+ for (IInteractionRelation edge : landmark.getRelations()) {
+ if (edge.getRelationshipHandle().equals(reltationKind)) {
+ landmark.clearRelations();
+ }
+ }
+ }
+ for (final AbstractContextListener listener : contextListeners) {
+ if (listener instanceof IRelationsListener) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ((IRelationsListener) listener).relationsChanged(null);
+ }
+ });
+ }
+ }
+ }
+
+ public void setActivationHistorySuppressed(boolean activationHistorySuppressed) {
+ this.activationHistorySuppressed = activationHistorySuppressed;
+ }
+
+ public void setActiveSearchEnabled(boolean enabled) {
+ for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
+ provider.setEnabled(enabled);
+ }
+ }
+
+ /**
+ * NOTE: If pausing ensure to restore to original state.
+ */
+ public void setContextCapturePaused(boolean paused) {
+ synchronized (InteractionContextManager.this) {
+ this.contextCapturePaused = paused;
+ }
+ }
+
+ public void updateHandle(final IInteractionElement element, String newHandle) {
+ if (element == null) {
+ return;
+ }
+ final IInteractionContext context = getActiveContext();
+ context.updateElementHandle(element, newHandle);
+
+ final List<IInteractionElement> changed = Collections.singletonList(element);
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.INTEREST_CHANGED,
+ context.getHandleIdentifier(), context, changed);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ if (element.getInterest().isLandmark()) {
+ for (final AbstractContextListener listener : contextListeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ List<IInteractionElement> changed = new ArrayList<IInteractionElement>();
+ changed.add(element);
+ ContextChangeEvent event = new ContextChangeEvent(ContextChangeKind.LANDMARKS_ADDED,
+ context.getHandleIdentifier(), context, changed);
+ listener.contextChanged(event);
+ }
+ });
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextRelation.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextRelation.java
new file mode 100644
index 0000000..b509e28
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextRelation.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import org.eclipse.mylyn.context.core.IDegreeOfInterest;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+
+/**
+ * TODO: make immutable?
+ *
+ * @author Mik Kersten
+ */
+public class InteractionContextRelation implements IInteractionRelation {
+
+ private final DegreeOfInterest interest;
+
+ private final String structureKind;
+
+ private final String relationshipHandle;
+
+ private final IInteractionElement source;
+
+ private final IInteractionElement target;
+
+ public InteractionContextRelation(String kind, String edgeKind, IInteractionElement source,
+ IInteractionElement target, InteractionContext context) {
+ interest = new DegreeOfInterest(context, context.getScaling());
+ this.structureKind = kind;
+ this.relationshipHandle = edgeKind;
+ this.target = target;
+ this.source = source;
+ }
+
+ public IInteractionElement getTarget() {
+ return target;
+ }
+
+ public IDegreeOfInterest getInterest() {
+ return interest;
+ }
+
+ @Override
+ public String toString() {
+ return "(rel: " + relationshipHandle + ", source: " + source.getHandleIdentifier() + ", target: " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ + target.getHandleIdentifier() + ")"; //$NON-NLS-1$
+ }
+
+ public String getLabel() {
+ return toString();
+ }
+
+ public String getRelationshipHandle() {
+ return relationshipHandle;
+ }
+
+ public String getContentType() {
+ return structureKind;
+ }
+
+ public IInteractionElement getSource() {
+ return source;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextScaling.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextScaling.java
new file mode 100644
index 0000000..6730007
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/InteractionContextScaling.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Initialized with default values.
+ *
+ * @author Mik Kersten
+ */
+public class InteractionContextScaling implements IInteractionContextScaling {
+
+ private static final float DEFAULT_INTERESTING = 0f;
+
+ private static final float DEFAULT_EVENT = 1f;
+
+ private static final float DEFAULT_EVENT_EDIT = .7f;
+
+ private static final float DEFAULT_DECAY = .017f;
+
+ private static final float DEFAULT_LANDMARK = 30f;
+
+ private static final float DEFAULT_FORCED_LANDMARK = 7 * DEFAULT_LANDMARK;
+
+ private final Map<InteractionEvent.Kind, Float> interactionScalingFactors = new HashMap<InteractionEvent.Kind, Float>();
+
+ private float interesting = DEFAULT_INTERESTING;
+
+ private float landmark = DEFAULT_LANDMARK;
+
+ private float forcedLandmark = DEFAULT_FORCED_LANDMARK;
+
+ private float decay = DEFAULT_DECAY;
+
+ @Deprecated
+ private final float errorInterest = .3f;
+
+ @Deprecated
+ private final int maxNumInterestingErrors = 20;
+
+ public InteractionContextScaling() {
+ interactionScalingFactors.put(InteractionEvent.Kind.EDIT, DEFAULT_EVENT_EDIT);
+ }
+
+ public float get(InteractionEvent.Kind kind) {
+ if (interactionScalingFactors.containsKey(kind)) {
+ return interactionScalingFactors.get(kind);
+ } else {
+ return DEFAULT_EVENT;
+ }
+ }
+
+ public void set(InteractionEvent.Kind kind, float value) {
+ interactionScalingFactors.put(kind, value);
+ }
+
+ public float getDecay() {
+ return decay;
+ }
+
+ public void setDecay(float decay) {
+ this.decay = decay;
+ }
+
+ public float getInteresting() {
+ return interesting;
+ }
+
+ public void setInteresting(float interesting) {
+ this.interesting = interesting;
+ }
+
+ public float getLandmark() {
+ return landmark;
+ }
+
+ public void setLandmark(float landmark) {
+ this.landmark = landmark;
+ }
+
+ @Deprecated
+ public float getErrorInterest() {
+ return errorInterest;
+ }
+
+ @Deprecated
+ public int getMaxNumInterestingErrors() {
+ return maxNumInterestingErrors;
+ }
+
+ public float getForcedLandmark() {
+ return forcedLandmark;
+ }
+
+ public void setForcedLandmark(float userLandmark) {
+ this.forcedLandmark = userLandmark;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/LegacyActivityAdaptor.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/LegacyActivityAdaptor.java
new file mode 100644
index 0000000..710a85a
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/LegacyActivityAdaptor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Adapt any legacy attention events to new form
+ *
+ * @since 2.1
+ * @author Rob Elves
+ */
+public class LegacyActivityAdaptor {
+
+ private static final String LEGACY_HANDLE_ATTENTION = "attention"; //$NON-NLS-1$
+
+ private String currentTask;
+
+ public InteractionEvent parseInteractionEvent(InteractionEvent event) {
+ try {
+ if (event.getDelta() != null && event.getDelta().equals(InteractionContextManager.ACTIVITY_DELTA_ACTIVATED)) {
+ if (event.getStructureHandle() != null && !event.getStructureHandle().equals(LEGACY_HANDLE_ATTENTION)) {
+ String activatedTask = event.getStructureHandle();
+ if (activatedTask != null) {
+ currentTask = event.getStructureHandle();
+ }
+ } else if (event.getStructureHandle() != null
+ && event.getStructureHandle().equals(LEGACY_HANDLE_ATTENTION)) {
+ if (currentTask != null && !currentTask.equals("")) { //$NON-NLS-1$
+ return new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, currentTask,
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, event.getDate(), event.getEndDate());
+ } else if (currentTask == null) {
+ // bogus event remove.
+ return null;
+ }
+ }
+ } else if (event.getDelta() != null
+ && event.getDelta().equals(InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED)) {
+ if (event.getStructureHandle() != null && !event.getStructureHandle().equals(LEGACY_HANDLE_ATTENTION)
+ && currentTask != null && currentTask.equals(event.getStructureHandle())) {
+ currentTask = null;
+ } else if (event.getStructureHandle() != null
+ && event.getStructureHandle().equals(LEGACY_HANDLE_ATTENTION)) {
+ // bogus event remove.
+ return null;
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Error parsing interaction event", //$NON-NLS-1$
+ t));
+ }
+ return event;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/LocalContextStore.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/LocalContextStore.java
new file mode 100644
index 0000000..3713334
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/LocalContextStore.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IContextStore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class LocalContextStore implements IContextStore {
+
+ private File contextDirectory;
+
+ private Set<File> contextFiles = null;
+
+ private final InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+
+ private final IInteractionContextScaling commonContextScaling;
+
+ private final List<IContextStoreListener> listeners = new ArrayList<IContextStoreListener>();
+
+ public LocalContextStore(IInteractionContextScaling commonContextScaling) {
+ this.commonContextScaling = commonContextScaling;
+ }
+
+ public synchronized void setContextDirectory(File directory) {
+ this.contextDirectory = directory;
+ for (IContextStoreListener listener : listeners) {
+ listener.contextStoreMoved(directory);
+ }
+// rootDirectory = new File(TasksUiPlugin.getDefault().getDataDirectory());
+// if (!rootDirectory.exists()) {
+// rootDirectory.mkdir();
+// }
+//
+// contextDirectory = new File(rootDirectory, ITasksCoreConstants.CONTEXTS_DIRECTORY);
+// if (!contextDirectory.exists()) {
+// contextDirectory.mkdir();
+// }
+ }
+
+ public File getContextDirectory() {
+ return contextDirectory;
+ }
+
+ /**
+ * @return false if the map could not be read for any reason
+ */
+ public IInteractionContext loadContext(String handleIdentifier) {
+ return loadContext(handleIdentifier, getFileForContext(handleIdentifier), commonContextScaling);
+ }
+
+ public IInteractionContext importContext(String handleIdentifier, File fromFile) throws CoreException {
+ InteractionContext context;
+ String handleToImportFrom;
+ handleToImportFrom = InteractionContextExternalizer.getFirstContextHandle(fromFile);
+ context = (InteractionContext) loadContext(handleToImportFrom, fromFile, commonContextScaling);
+ context.setHandleIdentifier(handleIdentifier);
+ saveContext(context);
+ return context;
+ }
+
+ /**
+ * @return The loaded context, or a newly created one.
+ */
+ public IInteractionContext loadContext(String handleIdentifier, File fromFile,
+ IInteractionContextScaling contextScaling) {
+ IInteractionContext loadedContext = externalizer.readContextFromXml(handleIdentifier, fromFile, contextScaling);
+ if (loadedContext == null) {
+ return new InteractionContext(handleIdentifier, contextScaling);
+ } else {
+ return loadedContext;
+ }
+ }
+
+ // TODO: interaction activity capture should be locked or queued for the duration of this and other saves
+ public void saveActiveContext() {
+ // FIXME this should not reference the context manager
+ IInteractionContext context = ContextCore.getContextManager().getActiveContext();
+ if (context != null && context.getHandleIdentifier() != null) {
+ saveContext(context);
+ }
+ }
+
+ public void saveContext(IInteractionContext context, String fileName) {
+ try {
+ externalizer.writeContextToXml(context, getFileForContext(fileName));
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Failed to write context " //$NON-NLS-1$
+ + context.getHandleIdentifier(), e));
+ }
+ }
+
+ public void saveContext(IInteractionContext context) {
+ // FIXME this should not reference the context manager
+ boolean wasPaused = ContextCore.getContextManager().isContextCapturePaused();
+ try {
+ // TODO: make this asynchronous by creating a copy
+ if (!wasPaused) {
+ // FIXME this should not reference the context manager
+ ContextCore.getContextManager().setContextCapturePaused(true);
+ }
+
+ if (context instanceof InteractionContext) {
+ ((InteractionContext) context).collapse();
+ }
+ externalizer.writeContextToXml(context, getFileForContext(context.getHandleIdentifier()));
+
+ if (context.getAllElements().size() == 0) {
+ removeFromCache(context);
+ } else {
+ addToCache(context);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "could not save context", t)); //$NON-NLS-1$
+ } finally {
+ if (!wasPaused) {
+ // FIXME this should not reference the context manager
+ ContextCore.getContextManager().setContextCapturePaused(false);
+ }
+ }
+ }
+
+ private boolean addToCache(IInteractionContext context) {
+ initCache();
+ return contextFiles.add(getFileForContext(context.getHandleIdentifier()));
+ }
+
+ private void initCache() {
+ if (contextFiles == null) {
+ contextFiles = new HashSet<File>();
+ File[] files = contextDirectory.listFiles();
+ for (File file : files) {
+ contextFiles.add(file);
+ }
+ }
+ }
+
+ private boolean removeFromCache(IInteractionContext context) {
+ if (contextFiles != null) {
+ return contextFiles.remove(getFileForContext(context.getHandleIdentifier()));
+ } else {
+ return false;
+ }
+ }
+
+ public IInteractionContext cloneContext(String sourceContextHandle, String destinationContextHandle) {
+
+ InteractionContext readContext = (InteractionContext) externalizer.readContextFromXml(sourceContextHandle,
+ getFileForContext(sourceContextHandle), commonContextScaling);
+
+ if (readContext == null) {
+ return new InteractionContext(destinationContextHandle, commonContextScaling);
+ } else {
+ readContext.setHandleIdentifier(destinationContextHandle);
+ saveContext(readContext);
+ }
+
+// IInteractionContext context = importContext(destinationContextHandle, getFileForContext(sourceContextHandle));
+// if (context != null) {
+// saveContext(context);
+// } else {
+// StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, "Could not copy context from: "
+// + sourceContextHandle));
+// }
+ return readContext;
+ }
+
+ public boolean hasContext(String handleIdentifier) {
+ Assert.isNotNull(handleIdentifier);
+ File file = getFileForContext(handleIdentifier);
+ initCache();
+ return contextFiles.contains(file);
+ }
+
+ public File getFileForContext(String handleIdentifier) {
+ String encoded;
+ try {
+ encoded = URLEncoder.encode(handleIdentifier, InteractionContextManager.CONTEXT_FILENAME_ENCODING);
+ File contextDirectory = getContextDirectory();
+ File contextFile = new File(contextDirectory, encoded + InteractionContextManager.CONTEXT_FILE_EXTENSION);
+ return contextFile;
+ } catch (UnsupportedEncodingException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN,
+ "Could not determine path for context", e)); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ public void deleteContext(String handleIdentifier) {
+ try {
+ File file = getFileForContext(handleIdentifier);
+ if (file.exists()) {
+ file.delete();
+ }
+
+ if (contextFiles != null) {
+ contextFiles.remove(getFileForContext(handleIdentifier));
+ }
+ } catch (SecurityException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN,
+ "Could not delete context file, insufficient permissions.", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Can consider making this API, but it should not expose a zip stream.
+ */
+ public void export(String handleIdentifier, ZipOutputStream outputStream) throws IOException {
+ IInteractionContext context = loadContext(handleIdentifier);
+ externalizer.writeContext(context, outputStream);
+ }
+
+ @Deprecated
+ public void addListener(IContextStoreListener listener) {
+ listeners.add(listener);
+ }
+
+ @Deprecated
+ public void removeListener(IContextStoreListener listener) {
+ listeners.remove(listener);
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextContentHandler.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextContentHandler.java
new file mode 100644
index 0000000..3baa6dd
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextContentHandler.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Brock Janiczak 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:
+ * Brock Janiczak - initial API and implementation
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.context.core;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @author Brock Janiczak
+ * @author Mik Kersten
+ */
+public class SaxContextContentHandler extends DefaultHandler {
+
+ private static final int EXPECTING_ROOT = 0;
+
+ private static final int EXPECTING_EVENT = 1;
+
+ private int state = EXPECTING_ROOT;
+
+ private InteractionContext context;
+
+ private final IInteractionContextScaling contextScaling;
+
+ private final String contextHandleIdentifier;
+
+ static final String ATTRIBUTE_INTERACTION_EVENT = "InteractionEvent"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_CONTENT = "Content"; //$NON-NLS-1$
+
+ public SaxContextContentHandler(String contextHandleIdentifier, IInteractionContextScaling contextScaling) {
+ this.contextHandleIdentifier = contextHandleIdentifier;
+ this.contextScaling = contextScaling;
+ }
+
+ public InteractionContext getContext() {
+ return context;
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ switch (state) {
+ case EXPECTING_ROOT:
+ context = new InteractionContext(contextHandleIdentifier, contextScaling);
+ String limitContentTo = attributes.getValue(ATTRIBUTE_CONTENT);
+ if (limitContentTo != null) {
+ context.setContentLimitedTo(limitContentTo);
+ }
+ state = EXPECTING_EVENT;
+ break;
+ case EXPECTING_EVENT:
+ try {
+ InteractionEvent ie = createEventFromAttributes(attributes);
+ context.parseEvent(ie);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN,
+ "Ignored unexpected activity event", e)); //$NON-NLS-1$
+ }
+ break;
+ }
+ }
+
+ @SuppressWarnings( { "deprecation", "restriction" })
+ private InteractionEvent createEventFromAttributes(Attributes attributes) throws ParseException {
+ String delta = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(InteractionContextExternalizer.ATR_DELTA));
+ String endDate = attributes.getValue(InteractionContextExternalizer.ATR_END_DATE);
+ String interest = attributes.getValue(InteractionContextExternalizer.ATR_INTEREST);
+ String kind = attributes.getValue(InteractionContextExternalizer.ATR_KIND);
+ String navigation = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(InteractionContextExternalizer.ATR_NAVIGATION));
+ String originId = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(InteractionContextExternalizer.ATR_ORIGIN_ID));
+ String startDate = attributes.getValue(InteractionContextExternalizer.ATR_START_DATE);
+ String structureHandle = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(InteractionContextExternalizer.ATR_STRUCTURE_HANDLE));
+ String structureKind = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(InteractionContextExternalizer.ATR_STRUCTURE_KIND));
+
+ // the number of events and event count on creation are needed to ensure that the context that is read in is the same as what was written out
+ String numEventsString = attributes.getValue(InteractionContextExternalizer.ATR_NUM_EVENTS);
+ int numEvents = 1;
+ if (numEventsString != null && numEventsString.length() != 0) {
+ try {
+ numEvents = Integer.parseInt(numEventsString);
+ } catch (NumberFormatException nfe) {
+ //ignore.
+ }
+ }
+
+ String eventCountOnCreationString = attributes.getValue(InteractionContextExternalizer.ATR_CREATION_COUNT);
+ int eventCountOnCreation = -1;
+ if (eventCountOnCreationString != null && eventCountOnCreationString.length() != 0) {
+ try {
+ eventCountOnCreation = Integer.parseInt(eventCountOnCreationString);
+ } catch (NumberFormatException nfe) {
+ //ignore.
+ }
+ }
+
+ SimpleDateFormat dateFormat = new SimpleDateFormat(InteractionContextExternalizer.DATE_FORMAT_STRING,
+ Locale.ENGLISH);
+ Date dStartDate = dateFormat.parse(startDate);
+ Date dEndDate = dateFormat.parse(endDate);
+ float iInterest = Float.parseFloat(interest);
+
+ InteractionEvent ie = null;
+ if (numEventsString == null || eventCountOnCreationString == null) {
+ // if we don't have the values for the collapsed event, it must be one that is uncollapsed
+ ie = new InteractionEvent(Kind.fromString(kind), structureKind, structureHandle, originId, navigation,
+ delta, iInterest, dStartDate, dEndDate);
+ } else {
+ ie = new AggregateInteractionEvent(Kind.fromString(kind), structureKind, structureHandle, originId,
+ navigation, delta, iInterest, dStartDate, dEndDate, numEvents, eventCountOnCreation);
+ }
+ return ie;
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextReader.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextReader.java
new file mode 100644
index 0000000..5eaaab5
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextReader.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Brock Janiczak 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:
+ * Brock Janiczak - initial API and implementation
+ * Tasktop Technologies - improvements
+ * Jevgeni Holodkov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.context.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.net.URLEncoder;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Brock Janiczak
+ * @author Mik Kersten (refactoring)
+ */
+public class SaxContextReader implements IInteractionContextReader {
+
+ private IInteractionContextScaling contextScaling;
+
+ public SaxContextReader() {
+ }
+
+ public void setContextScaling(IInteractionContextScaling contextScaling) {
+ this.contextScaling = contextScaling;
+ }
+
+ /**
+ * Reads the first entry in the zip file if an entry matching the handleIdentifier is not found.
+ */
+ public InteractionContext readContext(String handleIdentifier, File file) {
+ if (!file.exists()) {
+ return null;
+ }
+ try {
+ FileInputStream fileInputStream = new FileInputStream(file);
+ try {
+ ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
+ try {
+ // search for context entry
+ String encoded = URLEncoder.encode(handleIdentifier,
+ InteractionContextManager.CONTEXT_FILENAME_ENCODING);
+ String contextFileName = encoded + InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD;
+ ZipEntry entry = zipInputStream.getNextEntry();
+ while (entry != null) {
+ if (contextFileName.equals(entry.getName())) {
+ break;
+ }
+ entry = zipInputStream.getNextEntry();
+ }
+
+ if (entry == null) {
+ return null;
+ }
+
+ SaxContextContentHandler contentHandler = new SaxContextContentHandler(handleIdentifier,
+ contextScaling);
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setContentHandler(contentHandler);
+ reader.parse(new InputSource(zipInputStream));
+ return contentHandler.getContext();
+ } finally {
+ zipInputStream.close();
+ }
+ } finally {
+ fileInputStream.close();
+ }
+ } catch (Exception e) {
+ File saveFile = new File(file.getAbsolutePath() + "-save"); //$NON-NLS-1$
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN,
+ "Error loading context, backup saved to \"" + saveFile + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ file.renameTo(saveFile);
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextWriter.java b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextWriter.java
new file mode 100644
index 0000000..6d58d4f
--- /dev/null
+++ b/org.eclipse.mylyn.context.core/src/org/eclipse/mylyn/internal/context/core/SaxContextWriter.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Brock Janiczak 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:
+ * Brock Janiczak - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.context.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * @author Brock Janiczak
+ * @author Mik Kersten (refactoring)
+ */
+public class SaxContextWriter implements IInteractionContextWriter {
+
+ private OutputStream outputStream;
+
+ public void setOutputStream(OutputStream outputStream) {
+ this.outputStream = outputStream;
+ }
+
+ public void writeContextToStream(IInteractionContext context) throws IOException {
+ if (outputStream == null) {
+ IOException ioe = new IOException("OutputStream not set"); //$NON-NLS-1$
+ throw ioe;
+ }
+
+ try {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.transform(new SAXSource(new SaxWriter(), new InteractionContextInputSource(context)),
+ new StreamResult(outputStream));
+ } catch (TransformerException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextCorePlugin.ID_PLUGIN, "Could not write context", e)); //$NON-NLS-1$
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ private static class InteractionContextInputSource extends InputSource {
+
+ private final IInteractionContext context;
+
+ public InteractionContextInputSource(IInteractionContext context) {
+ this.context = context;
+ }
+
+ public IInteractionContext getContext() {
+ return this.context;
+ }
+
+ }
+
+ private class SaxWriter implements XMLReader {
+
+ private ContentHandler handler;
+
+ private ErrorHandler errorHandler;
+
+ public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
+ return false;
+ }
+
+ public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException {
+
+ }
+
+ public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
+ return null;
+ }
+
+ public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException {
+ }
+
+ public void setEntityResolver(EntityResolver resolver) {
+ }
+
+ public EntityResolver getEntityResolver() {
+ return null;
+ }
+
+ public void setDTDHandler(DTDHandler handler) {
+ }
+
+ public DTDHandler getDTDHandler() {
+ return null;
+ }
+
+ public void setContentHandler(ContentHandler handler) {
+ this.handler = handler;
+
+ }
+
+ public ContentHandler getContentHandler() {
+ return handler;
+ }
+
+ public void setErrorHandler(ErrorHandler handler) {
+ this.errorHandler = handler;
+
+ }
+
+ public ErrorHandler getErrorHandler() {
+ return errorHandler;
+ }
+
+ public void parse(InputSource input) throws IOException, SAXException {
+ if (!(input instanceof InteractionContextInputSource)) {
+ throw new SAXException("Can only parse writable input sources"); //$NON-NLS-1$
+ }
+
+ IInteractionContext context = ((InteractionContextInputSource) input).getContext();
+
+ handler.startDocument();
+ AttributesImpl rootAttributes = new AttributesImpl();
+ rootAttributes.addAttribute("", InteractionContextExternalizer.ATR_ID, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_ID, "", context.getHandleIdentifier()); //$NON-NLS-1$
+ if (context.getContentLimitedTo() != null) {
+ rootAttributes.addAttribute("", SaxContextContentHandler.ATTRIBUTE_CONTENT, //$NON-NLS-1$
+ SaxContextContentHandler.ATTRIBUTE_CONTENT, "", context.getContentLimitedTo()); //$NON-NLS-1$
+ }
+ rootAttributes.addAttribute("", InteractionContextExternalizer.ATR_VERSION, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_VERSION, "", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ handler.startElement("", InteractionContextExternalizer.ELMNT_INTERACTION_HISTORY, //$NON-NLS-1$
+ InteractionContextExternalizer.ELMNT_INTERACTION_HISTORY, rootAttributes);
+ // List could get modified as we're writing
+ for (InteractionEvent ie : context.getInteractionHistory()) {
+ Attributes ieAttributes = createEventAttributes(ie);
+ handler.startElement("", SaxContextContentHandler.ATTRIBUTE_INTERACTION_EVENT, //$NON-NLS-1$
+ SaxContextContentHandler.ATTRIBUTE_INTERACTION_EVENT, ieAttributes);
+ handler.endElement("", SaxContextContentHandler.ATTRIBUTE_INTERACTION_EVENT, //$NON-NLS-1$
+ SaxContextContentHandler.ATTRIBUTE_INTERACTION_EVENT);
+ }
+ handler.endElement("", InteractionContextExternalizer.ELMNT_INTERACTION_HISTORY, //$NON-NLS-1$
+ InteractionContextExternalizer.ELMNT_INTERACTION_HISTORY);
+
+ handler.endDocument();
+ }
+
+ public void parse(String systemId) throws IOException, SAXException {
+ throw new SAXException("Can only parse writable input sources"); //$NON-NLS-1$
+ }
+ }
+
+ @SuppressWarnings( { "deprecation", "restriction" })
+ private Attributes createEventAttributes(InteractionEvent ie) {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(InteractionContextExternalizer.DATE_FORMAT_STRING,
+ Locale.ENGLISH);
+
+ AttributesImpl ieAttributes = new AttributesImpl();
+
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_DELTA, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_DELTA, "", //$NON-NLS-1$
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(ie.getDelta()));
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_END_DATE, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_END_DATE, "", dateFormat.format(ie.getEndDate())); //$NON-NLS-1$
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_INTEREST, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_INTEREST, "", Float.toString(ie.getInterestContribution())); //$NON-NLS-1$
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_KIND, InteractionContextExternalizer.ATR_KIND, //$NON-NLS-1$
+ "", ie.getKind().toString()); //$NON-NLS-1$
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_NAVIGATION, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_NAVIGATION, "", //$NON-NLS-1$
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(ie.getNavigation()));
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_ORIGIN_ID, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_ORIGIN_ID, "", //$NON-NLS-1$
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(ie.getOriginId()));
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_START_DATE, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_START_DATE, "", dateFormat.format(ie.getDate())); //$NON-NLS-1$
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_STRUCTURE_HANDLE, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_STRUCTURE_HANDLE, "", //$NON-NLS-1$
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(ie.getStructureHandle()));
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_STRUCTURE_KIND, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_STRUCTURE_KIND, "", //$NON-NLS-1$
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(ie.getStructureKind()));
+
+ if (ie instanceof AggregateInteractionEvent) {
+ // keep the state of the element (how it was collapsed and when it was created) to ensure that the context is the same after writing
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_NUM_EVENTS, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_NUM_EVENTS, "", //$NON-NLS-1$
+ Integer.toString(((AggregateInteractionEvent) ie).getNumCollapsedEvents()));
+ ieAttributes.addAttribute("", InteractionContextExternalizer.ATR_CREATION_COUNT, //$NON-NLS-1$
+ InteractionContextExternalizer.ATR_CREATION_COUNT, "", //$NON-NLS-1$
+ Integer.toString(((AggregateInteractionEvent) ie).getEventCountOnCreation()));
+ }
+ return ieAttributes;
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/.classpath b/org.eclipse.mylyn.context.tests/.classpath
new file mode 100644
index 0000000..c9c6503
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.context.tests/.cvsignore b/org.eclipse.mylyn.context.tests/.cvsignore
new file mode 100644
index 0000000..0a2b580
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.cvsignore
@@ -0,0 +1,2 @@
+bin
+credentials.properties
diff --git a/org.eclipse.mylyn.context.tests/.project b/org.eclipse.mylyn.context.tests/.project
new file mode 100644
index 0000000..1c3147c
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.context.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..4d51959
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.core.tests' to 'org.eclipse.mylar.core.core.tests' - Original element: 'org.eclipse.mylar.context.tests/src/org.eclipse.mylar.core.tests' - Renamed element: 'org.eclipse.mylar.context.tests/src/org.eclipse.mylar.core.core.tests' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.core.tests'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.core.tests" name="org.eclipse.mylar.core.core.tests" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153105534578" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..fbc511c
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1 @@
+1153105534578 Rename package 'org.eclipse.mylar.core.tests'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2006/9/36/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2006/9/36/refactorings.history
new file mode 100644
index 0000000..6cae94a
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2006/9/36/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.core.core.tests' to 'org.eclipse.mylar.context.tests' - Original project: 'org.eclipse.mylar.context.tests' - Original element: 'org.eclipse.mylar.context.tests/src/org.eclipse.mylar.core.core.tests' - Renamed element: 'org.eclipse.mylar.context.tests/src/org.eclipse.mylar.context.tests' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.core.core.tests'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.core.core.tests" name="org.eclipse.mylar.context.tests" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1157650930421" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2006/9/36/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2006/9/36/refactorings.index
new file mode 100644
index 0000000..701ed1e
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2006/9/36/refactorings.index
@@ -0,0 +1 @@
+1157650930421 Rename package 'org.eclipse.mylar.core.core.tests'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/10/42/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/10/42/refactorings.history
new file mode 100644
index 0000000..aad046a
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/10/42/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.tests.ScalingFactorsTest.testDefaults()' to 'testLandmarkDefaults'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.ScalingFactorsTest.testDefaults()'
- Renamed element: 'org.eclipse.mylyn.context.tests.ScalingFactorsTest.testLandmarkDefaults()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testDefaults'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.tests{ScalingFactorsTest.java[ScalingFactorsTest~testDefaults" name="testLandmarkDefaults" references="true" stamp="1192581567827" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/10/42/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/10/42/refactorings.index
new file mode 100644
index 0000000..42197cf
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/10/42/refactorings.index
@@ -0,0 +1 @@
+1192581567827 Rename method 'testDefaults'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..35a2e2a
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.context.tests.InteractionContextManagerTest' to 'InteractionContextListenerTest'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.InteractionContextManagerTest'
- Renamed element: 'org.eclipse.mylyn.context.tests.InteractionContextListenerTest'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'InteractionContextManagerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.tests{InteractionContextManagerTest.java[InteractionContextManagerTest" matchStrategy="1" name="InteractionContextListenerTest" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1198030339881" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.context.tests.InteractionContextListenerTest' to 'InteractionContextListeningTest'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.InteractionContextListenerTest'
- Renamed element: 'org.eclipse.mylyn.context.tests.InteractionContextListeningTest'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'InteractionContextListenerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.tests{InteractionContextListenerTest.java[InteractionContextListenerTest" matchStrategy="1" name="InteractionContextListeningTest" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1198030375788" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..070fa53
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1,2 @@
+1198030339881 Rename type 'InteractionContextManagerTest'
+1198030375788 Rename type 'InteractionContextListenerTest'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/4/17/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/4/17/refactorings.history
new file mode 100644
index 0000000..894664d
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/4/17/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.context.tests.AllCoreTests' to 'AllContextTests' - Original project: 'org.eclipse.mylar.context.tests' - Original element: 'org.eclipse.mylar.context.tests.AllCoreTests' - Renamed element: 'org.eclipse.mylar.context.tests.AllContextTests' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AllCoreTests'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.tests{AllCoreTests.java[AllCoreTests" matchStrategy="1" name="AllContextTests" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1177323237430" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/4/17/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/4/17/refactorings.index
new file mode 100644
index 0000000..e93bdb9
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/4/17/refactorings.index
@@ -0,0 +1 @@
+1177323237430 Rename type 'AllCoreTests'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..42dd2c2
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.context.tests.MylarContextTest' to 'InteractionContextTest' - Original project: 'org.eclipse.mylar.context.tests' - Original element: 'org.eclipse.mylar.context.tests.MylarContextTest' - Renamed element: 'org.eclipse.mylar.context.tests.InteractionContextTest' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContextTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.tests{MylarContextTest.java[MylarContextTest" matchStrategy="1" name="InteractionContextTest" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180148607862" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.java.tests/src/org.eclipse.mylar.java.tests' - Original project: 'org.eclipse.mylar.context.tests' - Destination element: 'org.eclipse.mylar.java.tests/src/org.eclipse.mylar.java.tests' - Original element: 'org.eclipse.mylar.context.tests.ContextSpecificContextTest.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.java.tests" element1="/src<org.eclipse.mylar.context.tests{ContextSpecificContextTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1180155370704" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..ce94709
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1180148607862 Rename type 'MylarContextTest'
+1180155370704 Move compilation unit
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..3aa000f
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.context.tests.support.MylarTestUtils' to 'TestUtils' - Original project: 'org.eclipse.mylyn.context.tests' - Original element: 'org.eclipse.mylyn.context.tests.support.MylarTestUtils' - Renamed element: 'org.eclipse.mylyn.context.tests.support.TestUtils' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarTestUtils'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.tests.support{MylarTestUtils.java[MylarTestUtils" matchStrategy="1" name="TestUtils" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269115188" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.context.tests.support.TestUtils' to 'TestUtil' - Original project: 'org.eclipse.mylyn.context.tests' - Original element: 'org.eclipse.mylyn.context.tests.support.TestUtils' - Renamed element: 'org.eclipse.mylyn.context.tests.support.TestUtil' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TestUtils'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.tests.support{TestUtils.java[TestUtils" matchStrategy="1" name="TestUtil" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269128776" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.tests' - Original project: 'org.eclipse.mylyn.context.tests' - Original element: 'org.eclipse.mylyn.context.tests.MylarCoreTestsPlugin.java'" description="Delete element" element1="/src<org.eclipse.mylyn.context.tests{MylarCoreTestsPlugin.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181269461325" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.context.tests.MylarCoreTestsPlugin' to 'ContextTestsPlugin' - Original project: 'org.eclipse.mylyn.context.tests' - Original element: 'org.eclipse.mylyn.context.tests.MylarCoreTestsPlugin' - Renamed element: 'org.eclipse.mylyn.context.tests.ContextTestsPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarCoreTestsPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.tests{MylarCoreTestsPlugin.java[MylarCoreTestsPlugin" matchStrategy="1" name="ContextTestsPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269564851" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..2b432a8
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,4 @@
+1181269115188 Rename type 'MylarTestUtils'
+1181269128776 Rename type 'TestUtils'
+1181269461325 Delete element
+1181269564851 Rename type 'MylarCoreTestsPlugin'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/8/35/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/8/35/refactorings.history
new file mode 100644
index 0000000..49e51c5
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/8/35/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.CONTEXT_HANDLE' from expression '"context-externalization"' - Original project: 'org.eclipse.mylyn.context.tests' - Constant name: 'CONTEXT_HANDLE' - Constant expression: '"context-externalization"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CONTEXT_HANDLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.context.tests{ContextExternalizerTest.java" name="CONTEXT_HANDLE" qualify="false" replace="true" selection="1638 25" stamp="1188420149906" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/8/35/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/8/35/refactorings.index
new file mode 100644
index 0000000..dd094f3
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/8/35/refactorings.index
@@ -0,0 +1 @@
+1188420149906 Extract constant 'CONTEXT_HANDLE'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..5b17475
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.tests'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.ContextTransferTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.context.tests{ContextTransferTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1190779129868" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..c6e4a56
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1 @@
+1190779129868 Delete element
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/12/49/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/49/refactorings.history
new file mode 100644
index 0000000..8e4ca00
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/49/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylyn.context.tests.AbstractContextTest.openView(...)' to 'org.eclipse.mylyn.context.tests.support.TestUtil'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.AbstractContextTest.openView(...)'
- Destination type: 'org.eclipse.mylyn.context.tests.support.TestUtil'" delegate="false" deprecate="true" description="Move member 'openView'" element1="/src<org.eclipse.mylyn.context.tests{AbstractContextTest.java[AbstractContextTest~openView~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.tests.support{TestUtil.java[TestUtil" stamp="1228598414998" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/12/49/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/49/refactorings.index
new file mode 100644
index 0000000..d624789
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/49/refactorings.index
@@ -0,0 +1 @@
+1228598414998 Move member 'openView'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/12/52/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/52/refactorings.history
new file mode 100644
index 0000000..5a3c199
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/52/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.tests'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.AbstractManualTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.context.tests{AbstractManualTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1229959650740" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests.manual'
- Original project: 'org.eclipse.mylyn.context.tests'
- Destination element: 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests.manual'
- Original element: 'org.eclipse.mylyn.context.tests.ManualUiTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.tests/src<org.eclipse.mylyn.commons.tests.manual" element1="/src<org.eclipse.mylyn.context.tests{ManualUiTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1229959690241" units="1" version="1.0"/>
<refactoring comment="Extract constant 'ORG_ECLIPSE_UI_RESOURCE_PERSPECTIVE' from expression '"org.eclipse.ui.resourcePerspective"'
- Original project: 'org.eclipse.mylyn.context.tests'
- Constant name: 'ORG_ECLIPSE_UI_RESOURCE_PERSPECTIVE'
- Constant expression: '"org.eclipse.ui.resourcePerspective"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ORG_ECLIPSE_UI_RESOURCE_PERSPECTIVE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.context.tests.ui{ContextPerspectiveManagerTest.java" name="ORG_ECLIPSE_UI_RESOURCE_PERSPECTIVE" qualify="false" replace="true" selection="971 36" stamp="1229968617507" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ui'
- Original project: 'org.eclipse.mylyn.context.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ui'
- Original element: 'org.eclipse.mylyn.context.tests.ui.ContextPerspectiveManagerTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.tests/src<org.eclipse.mylyn.tasks.tests.ui" element1="/src<org.eclipse.mylyn.context.tests.ui{ContextPerspectiveManagerTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1229968842059" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/12/52/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/52/refactorings.index
new file mode 100644
index 0000000..e64cabd
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/12/52/refactorings.index
@@ -0,0 +1,4 @@
+1229959650740 Delete element
+1229959690241 Move compilation unit
+1229968617507 Extract constant 'ORG_ECLIPSE_UI_RESOURCE_PERSPECTIVE'
+1229968842059 Move compilation unit
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..8a0d451
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.context.tests.AbstractContextTest.MOCK_HANDLE' from expression '"<mock-handle>"'
- Original project: 'org.eclipse.mylyn.context.tests'
- Constant name: 'MOCK_HANDLE'
- Constant expression: '"<mock-handle>"'
- Declared visibility: 'protected'
- Replace occurrences of expression with constant" description="Extract constant 'MOCK_HANDLE'" flags="786434" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.context.tests{AbstractContextTest.java" name="MOCK_HANDLE" qualify="false" replace="true" selection="2104 15" stamp="1208461763325" version="1.0" visibility="4"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..d013bcd
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1 @@
+1208461763325 Extract constant 'MOCK_HANDLE'
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/9/39/refactorings.history b/org.eclipse.mylyn.context.tests/.refactorings/2008/9/39/refactorings.history
new file mode 100644
index 0000000..03d9269
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private IInteractionContext writeAndReadContext(File file,InteractionContextExternalizer externalizer)' from 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse()' to 'org.eclipse.mylyn.context.tests.ContextExternalizerTest'
- Original project: 'org.eclipse.mylyn.context.tests'
- Method name: 'writeAndReadContext'
- Destination type: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'writeAndReadContext'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.context.tests{ContextExternalizerTest.java" name="writeAndReadContext" replace="true" selection="8694 617" stamp="1222280473218" version="1.0" visibility="2"/>
<refactoring comment="Rename local variable 'loaded2' in 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse()' to 'loadedContext2'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse().loaded2'
- Renamed element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse().loadedContext2'
- Update references to refactored element" description="Rename local variable 'loaded2'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.tests{ContextExternalizerTest.java" name="loadedContext2" references="true" selection="8315 7" stamp="1222280626765" version="1.0"/>
<refactoring comment="Rename local variable 'loaded' in 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse()' to 'loadedContext'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse().loaded'
- Renamed element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse().loadedContext'
- Update references to refactored element" description="Rename local variable 'loaded'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.tests{ContextExternalizerTest.java" name="loadedContext" references="true" selection="7857 6" stamp="1222280631250" version="1.0"/>
<refactoring comment="Rename local variable 'loaded3' in 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse()' to 'loadedContext3'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse().loaded3'
- Renamed element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.testExternalizationWithCollapse().loadedContext3'
- Update references to refactored element" description="Rename local variable 'loaded3'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.tests{ContextExternalizerTest.java" name="loadedContext3" references="true" selection="9125 7" stamp="1222280766312" version="1.0"/>
<refactoring comment="Rename local variable 'context' in 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.writeAndReadContext(...)' to 'contextToWrite'
- Original project: 'org.eclipse.mylyn.context.tests'
- Original element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.writeAndReadContext(InteractionContext, InteractionContextExternalizer).context'
- Renamed element: 'org.eclipse.mylyn.context.tests.ContextExternalizerTest.writeAndReadContext(InteractionContext, InteractionContextExternalizer).contextToWrite'
- Update references to refactored element" description="Rename local variable 'context'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.tests{ContextExternalizerTest.java" name="contextToWrite" references="true" selection="9397 7" stamp="1222280858187" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.tests/.refactorings/2008/9/39/refactorings.index b/org.eclipse.mylyn.context.tests/.refactorings/2008/9/39/refactorings.index
new file mode 100644
index 0000000..c766b8e
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.refactorings/2008/9/39/refactorings.index
@@ -0,0 +1,5 @@
+1222280473218 Extract method 'writeAndReadContext'
+1222280626765 Rename local variable 'loaded2'
+1222280631250 Rename local variable 'loaded'
+1222280766312 Rename local variable 'loaded3'
+1222280858187 Rename local variable 'context'
diff --git a/org.eclipse.mylyn.context.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.context.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.context.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.context.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.context.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.context.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.context.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e5771b2
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Context Tests
+Bundle-SymbolicName: org.eclipse.mylyn.context.tests
+Bundle-Version: 0.0.0
+Bundle-Activator: org.eclipse.mylyn.context.tests.ContextTestsPlugin
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.junit,
+ org.eclipse.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.pde,
+ org.eclipse.ui.ide,
+ org.eclipse.pde.core,
+ org.eclipse.mylyn.commons.core,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.mylyn.monitor.core
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: mylyn-core-tests.jar
+Export-Package: org.eclipse.mylyn.context.tests;x-internal:=true,
+ org.eclipse.mylyn.context.tests.support;x-internal:=true,
+ org.eclipse.mylyn.context.tests.support.search;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.context.tests/about.html b/org.eclipse.mylyn.context.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/build.properties b/org.eclipse.mylyn.context.tests/build.properties
new file mode 100644
index 0000000..d82b168
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2004, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ mylyn-core-tests.jar,\
+ about.html,\
+ testdata/,\
+ mylyn-core-tests.jar
+src.includes = about.html
+jars.compile.order = mylyn-core-tests.jar
+source.mylyn-core-tests.jar = src/
+output.mylyn-core-tests.jar = bin/
+jre.compilation.profile = J2SE-1.5
+source.mylyn-core-tests.jar = src/
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/AbstractContextTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/AbstractContextTest.java
new file mode 100644
index 0000000..bbc8b2b
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/AbstractContextTest.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractContextTest extends TestCase {
+
+ protected static final String MOCK_HANDLE = "<mock-handle>";
+
+ private static final String MOCK_PROVIDER = "<mock-provider>";
+
+ protected static final String MOCK_ORIGIN = "<mock-origin>";
+
+ protected static final String MOCK_KIND = "java";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ if (ContextCore.getContextManager() != null) {
+ assertFalse("Unexpected context active: "
+ + ((InteractionContextManager) ContextCore.getContextManager()).getActiveContexts(),
+ ContextCore.getContextManager().isContextActive());
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ if (ContextCore.getContextManager() != null) {
+ assertFalse("" + ((InteractionContextManager) ContextCore.getContextManager()).getActiveContexts(),
+ ContextCore.getContextManager().isContextActive());
+ }
+ }
+
+ protected InteractionEvent mockSelection(String handle) {
+ return new InteractionEvent(InteractionEvent.Kind.SELECTION, MOCK_KIND, handle, MOCK_ORIGIN);
+ }
+
+ protected InteractionEvent mockPropagation(String handle) {
+ return new InteractionEvent(InteractionEvent.Kind.PROPAGATION, MOCK_KIND, handle, MOCK_ORIGIN);
+ }
+
+ protected InteractionEvent mockSelection() {
+ return mockSelection(MOCK_HANDLE);
+ }
+
+ protected InteractionEvent mockNavigation(String toHandle) {
+ return new InteractionEvent(InteractionEvent.Kind.SELECTION, MOCK_KIND, toHandle, MOCK_ORIGIN, MOCK_PROVIDER);
+ }
+
+ protected InteractionEvent mockInterestContribution(String handle, String kind, float value) {
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION, kind, handle, MOCK_ORIGIN,
+ value);
+ return event;
+ }
+
+ protected InteractionEvent mockInterestContribution(String handle, float value) {
+ return mockInterestContribution(handle, MOCK_KIND, value);
+ }
+
+ protected InteractionEvent mockPreferenceChange(String handle) {
+ return new InteractionEvent(InteractionEvent.Kind.PREFERENCE, MOCK_KIND, handle, MOCK_ORIGIN);
+ }
+
+ protected boolean compareTaskscapeEquality(IInteractionContext t1, IInteractionContext t2) {
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/AllContextTests.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/AllContextTests.java
new file mode 100644
index 0000000..cf41ba9
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/AllContextTests.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllContextTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.context.tests");
+
+ TestUtil.triggerContextUiLazyStart();
+
+ // $JUnit-BEGIN$
+ suite.addTestSuite(InteractionContextListeningTest.class);
+ suite.addTestSuite(ScalingFactorsTest.class);
+ suite.addTestSuite(InteractionContextTest.class);
+ suite.addTestSuite(ContextExternalizerTest.class);
+ suite.addTestSuite(DegreeOfInterestTest.class);
+ suite.addTestSuite(ContextTest.class);
+ suite.addTestSuite(InteractionEventTest.class);
+ suite.addTestSuite(ShadowsBridgeTest.class);
+ // $JUnit-END$
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextExternalizerTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextExternalizerTest.java
new file mode 100644
index 0000000..b6db631
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextExternalizerTest.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.context.tests.support.DomContextReader;
+import org.eclipse.mylyn.context.tests.support.DomContextWriter;
+import org.eclipse.mylyn.context.tests.support.FileTool;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.SaxContextReader;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class ContextExternalizerTest extends AbstractContextTest {
+
+ private static final String CONTEXT_HANDLE = "context-externalization";
+
+ private InteractionContext context;
+
+ private IInteractionContextScaling scaling;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ scaling = ContextCore.getCommonContextScaling();
+ context = new InteractionContext(CONTEXT_HANDLE, ContextCore.getCommonContextScaling());
+ assertNotNull(ContextCore.getContextManager());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testContentAttributeExternalization() throws Exception {
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+ context.parseEvent(mockSelection("1"));
+ context.setContentLimitedTo("foobar");
+
+ IInteractionContext loaded = writeAndReadContext(context, externalizer);
+
+ assertEquals("foobar", loaded.getContentLimitedTo());
+ }
+
+ public void testSaxExternalizationAgainstDom() throws Exception {
+ File file = FileTool.getFileInPlugin(ContextTestsPlugin.getDefault(), new Path(
+ "testdata/externalizer/testcontext.xml.zip"));
+ assertTrue(file.getAbsolutePath(), file.exists());
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+// externalizer.setReader(new DomContextReader());
+ IInteractionContext domReadContext = externalizer.readContextFromXml(CONTEXT_HANDLE, file,
+ new DomContextReader(), scaling);
+
+// externalizer.setReader(new SaxContextReader());
+ IInteractionContext saxReadContext = externalizer.readContextFromXml(CONTEXT_HANDLE, file,
+ new SaxContextReader(), scaling);
+ assertEquals(284, saxReadContext.getInteractionHistory().size()); // known
+ // from
+ // testdata
+ assertEquals(domReadContext, saxReadContext);
+
+// externalizer.setWriter(new DomContextWriter());
+ File domOut = new File("dom-out.xml");
+ domOut.deleteOnExit();
+ externalizer.writeContextToXml(saxReadContext, domOut, new DomContextWriter());
+
+ //externalizer.setWriter(new DomContextWriter());
+ File saxOut = new File("sax-out.xml");
+ saxOut.deleteOnExit();
+ externalizer.writeContextToXml(saxReadContext, saxOut, new DomContextWriter());
+ assertEquals(domOut.length(), saxOut.length());
+
+ //externalizer.setReader(new DomContextReader());
+ IInteractionContext domReadAfterWrite = externalizer.readContextFromXml(CONTEXT_HANDLE, file,
+ new DomContextReader(), scaling);
+ //externalizer.setReader(new SaxContextReader());
+ IInteractionContext saxReadAfterWrite = externalizer.readContextFromXml(CONTEXT_HANDLE, file,
+ new SaxContextReader(), scaling);
+
+ assertEquals(domReadAfterWrite, saxReadAfterWrite);
+ }
+
+ public void testContextSize() throws Exception {
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+ String path = "extern.xml";
+ File file = new File(path);
+ file.deleteOnExit();
+
+ int ORIGINAL = 100;
+ for (int i = 0; i < ORIGINAL; i++) {
+ context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockPreferenceChange("2"));
+ }
+ context.collapse();
+ externalizer.writeContextToXml(context, file);
+ long size = file.length();
+
+ context.reset();
+ for (int i = 0; i < ORIGINAL * ORIGINAL; i++) {
+ context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockPreferenceChange("2"));
+ }
+ context.collapse();
+ externalizer.writeContextToXml(context, file);
+ long size2 = file.length();
+ assertTrue(size <= size2 * 2);
+ }
+
+ public void testExternalization() throws Exception {
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+
+ IInteractionElement node = context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockNavigation("2"));
+ IInteractionRelation edge = node.getRelation("2");
+ assertNotNull(edge);
+ assertEquals(1, node.getRelations().size());
+ context.parseEvent(mockInterestContribution("3", scaling.getLandmark() + scaling.getDecay() * 3));
+ assertTrue("interest: " + context.get("3").getInterest().getValue(), context.get("3")
+ .getInterest()
+ .isLandmark());
+ float doi = node.getInterest().getValue();
+ assertNotNull(context.getLandmarks());
+
+ // "3" not a user event
+ assertEquals("2", context.getActiveNode().getHandleIdentifier());
+
+ IInteractionContext loaded = writeAndReadContext(context, externalizer);
+ assertEquals(3, loaded.getInteractionHistory().size());
+ IInteractionElement loadedNode = loaded.get("1");
+ IInteractionRelation edgeNode = loadedNode.getRelation("2");
+ assertNotNull(edgeNode);
+ assertEquals(1, loadedNode.getRelations().size());
+
+ IInteractionElement landmark = loaded.get("3");
+ assertNotNull(loadedNode);
+ assertEquals(doi, loadedNode.getInterest().getValue());
+ assertTrue(landmark.getInterest().isLandmark());
+ assertNotNull(loaded.getLandmarks());
+
+ assertEquals("2", loaded.getActiveNode().getHandleIdentifier());
+ }
+
+ /**
+ * What is written and read from disk should always return the same doi for an element when the context is collapsed
+ *
+ * @throws Exception
+ */
+ public void testExternalizationWithCollapse() throws Exception {
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+
+ // create nodes in the context and ensure that writing and reading work properly
+ IInteractionElement node1 = context.parseEvent(mockSelection("1"));
+ IInteractionElement node2 = context.parseEvent(mockSelection("2"));
+ context.parseEvent(mockSelection("2"));
+ context.parseEvent(mockSelection("2"));
+
+ float doi1 = node1.getInterest().getValue();
+ float doi2 = node2.getInterest().getValue();
+
+ int numEvents = context.getUserEventCount();
+
+ // key to this test
+ context.collapse();
+ InteractionContext loadedContext = (InteractionContext) writeAndReadContext(context, externalizer);
+
+ assertEquals(numEvents, loadedContext.getUserEventCount());
+
+ IInteractionElement loadedNode1 = loadedContext.get("1");
+ IInteractionElement loadedNode2 = loadedContext.get("2");
+
+ assertEquals(doi1, loadedNode1.getInterest().getValue());
+ assertEquals(doi2, loadedNode2.getInterest().getValue());
+
+ //
+ // try to write a second time without changes
+ //
+
+ // key to this test
+ loadedContext.collapse();
+ InteractionContext loadedContext2 = (InteractionContext) writeAndReadContext(loadedContext, externalizer);
+
+ assertEquals(numEvents, loadedContext2.getUserEventCount());
+
+ loadedNode1 = loadedContext2.get("1");
+ loadedNode2 = loadedContext2.get("2");
+
+ assertEquals(doi1, loadedNode1.getInterest().getValue());
+ assertEquals(doi2, loadedNode2.getInterest().getValue());
+
+ //
+ // try to change the context that was read and write again
+ //
+ node1 = loadedContext2.parseEvent(mockSelection("1"));
+ node2 = loadedContext2.parseEvent(mockSelection("2"));
+ loadedContext2.parseEvent(mockSelection("2"));
+ loadedContext2.parseEvent(mockSelection("1"));
+
+ doi1 = node1.getInterest().getValue();
+ doi2 = node2.getInterest().getValue();
+
+ numEvents = loadedContext2.getUserEventCount();
+
+ loadedContext2.collapse();
+
+ InteractionContext loadedContext3 = (InteractionContext) writeAndReadContext(loadedContext2, externalizer);
+
+ assertEquals(numEvents, loadedContext3.getUserEventCount());
+
+ loadedNode1 = loadedContext3.get("1");
+ loadedNode2 = loadedContext3.get("2");
+
+ assertEquals(doi1, loadedNode1.getInterest().getValue());
+ assertEquals(doi2, loadedNode2.getInterest().getValue());
+ }
+
+ private IInteractionContext writeAndReadContext(InteractionContext contextToWrite,
+ InteractionContextExternalizer externalizer) throws Exception {
+ File file = ContextCorePlugin.getContextStore().getFileForContext(contextToWrite.getHandleIdentifier());
+ file.deleteOnExit();
+ externalizer.writeContextToXml(contextToWrite, file);
+
+ // TODO: fix up directory refs
+ File dataDirectory = ContextCorePlugin.getContextStore().getContextDirectory().getParentFile();
+ File contextsDirectory = new File(dataDirectory, "contexts"/*WorkspaceAwareContextStore.CONTEXTS_DIRECTORY*/);
+ File zippedContextFile = new File(contextsDirectory, contextToWrite.getHandleIdentifier()
+ + InteractionContextManager.CONTEXT_FILE_EXTENSION);
+ assertTrue(zippedContextFile.exists());
+ IInteractionContext loaded = externalizer.readContextFromXml(CONTEXT_HANDLE, zippedContextFile, scaling);
+ assertNotNull(loaded);
+ return loaded;
+ }
+
+ public void testReadOtherContextHandle() throws Exception {
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+
+ context.setHandleIdentifier("handle-1");
+ context.parseEvent(mockSelection("1"));
+ File file1 = File.createTempFile("context", null);
+ file1.deleteOnExit();
+ externalizer.writeContextToXml(context, file1);
+
+ context.setHandleIdentifier("handle-2");
+ context.parseEvent(mockSelection("2"));
+ File file2 = File.createTempFile("context", null);
+ file2.deleteOnExit();
+ externalizer.writeContextToXml(context, file2);
+
+ context = (InteractionContext) externalizer.readContextFromXml("handle-1", file1, scaling);
+ assertNotNull(context);
+ assertEquals(1, context.getAllElements().size());
+
+ context = (InteractionContext) externalizer.readContextFromXml("handle-1", file2, scaling);
+ assertNotNull(context);
+ assertEquals(2, context.getAllElements().size());
+
+ context = (InteractionContext) externalizer.readContextFromXml("abc", file1, scaling);
+ assertNotNull(context);
+ assertEquals(1, context.getAllElements().size());
+ }
+
+ public void testReadInvalidContextHandle() throws Exception {
+ InteractionContextExternalizer externalizer = new InteractionContextExternalizer();
+ File file = File.createTempFile("context", null);
+ file.deleteOnExit();
+ ZipOutputStream out = new ZipOutputStream(new FileOutputStream(file));
+ try {
+ ZipEntry entry = new ZipEntry("name");
+ out.putNextEntry(entry);
+ } finally {
+ out.close();
+ }
+
+ context = (InteractionContext) externalizer.readContextFromXml("abc", file, scaling);
+ assertNull(context);
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextTest.java
new file mode 100644
index 0000000..15dd8be
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextTest.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextTest extends AbstractContextTest {
+
+ private InteractionContext context;
+
+ private InteractionContextScaling scaling;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ scaling = new InteractionContextScaling();
+ context = new InteractionContext("0", scaling);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testEquality() {
+ InteractionContext context1 = new InteractionContext("1", scaling);
+ context1.parseEvent(mockSelection("1"));
+ InteractionContext context2 = new InteractionContext("2", scaling);
+ context2.parseEvent(mockSelection("2"));
+ assertFalse(context1.equals(context2));
+ }
+
+ public void testReset() {
+ context.parseEvent(mockSelection());
+ context.reset();
+
+ assertNull(context.getActiveNode());
+
+ }
+
+ public void testManipulation() {
+ IInteractionElement node = context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockInterestContribution("1", 40));
+ assertEquals(42 - (scaling.getDecay() * 1), node.getInterest().getValue());
+
+ context.parseEvent(mockInterestContribution("1", -20));
+ assertEquals(22 - (scaling.getDecay() * 1), node.getInterest().getValue());
+ }
+
+ public void testPropagatedInterest() {
+ IInteractionElement node = context.parseEvent(mockPropagation("1"));
+ assertTrue(node.getInterest().isPropagated());
+ context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockInterestContribution("1", -10));
+ assertFalse(node.getInterest().isPropagated());
+ // context.parseEvent(mockInterestContribution("1", 40));
+ // assertEquals(42-(scaling.getDecay().getValue()*1),
+ // node.getDegreeOfInterest().getValue());
+ }
+
+ public void testEdges() {
+ IInteractionElement node = context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockNavigation("2"));
+ IInteractionRelation edge = node.getRelation("2");
+ assertNotNull(edge);
+ assertEquals(edge.getTarget().getHandleIdentifier(), "2");
+ }
+
+ public void testDecay() {
+ float decay = scaling.getDecay();
+ IInteractionElement node1 = context.parseEvent(mockSelection("1"));
+
+ context.parseEvent(mockSelection("2"));
+ for (int i = 0; i < 98; i++) {
+ context.parseEvent(mockSelection("1"));
+ }
+ assertEquals(99 - (decay * 99), node1.getInterest().getValue());
+ }
+
+ public void testLandmarkScaling() {
+ IInteractionElement node1 = context.parseEvent(mockSelection("1"));
+ for (int i = 0; i < scaling.getLandmark() - 2 + (scaling.getLandmark() * scaling.getDecay()); i++) {
+ context.parseEvent(mockSelection("1"));
+ }
+ assertTrue(node1.getInterest().isInteresting());
+ assertFalse(node1.getInterest().isLandmark());
+ context.parseEvent(mockSelection("1"));
+ context.parseEvent(mockSelection("1"));
+ assertTrue(node1.getInterest().isLandmark());
+ }
+
+ public void testSelections() {
+ IInteractionElement missing = context.get("0");
+ assertNull(missing);
+
+ IInteractionElement node = context.parseEvent(mockSelection());
+ assertTrue(node.getInterest().isInteresting());
+ context.parseEvent(mockSelection());
+ assertTrue(node.getInterest().isInteresting());
+ context.parseEvent(mockSelection());
+
+ float doi = node.getInterest().getEncodedValue();
+ assertEquals(3.0f - (2 * scaling.getDecay()), doi);
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextTestsPlugin.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextTestsPlugin.java
new file mode 100644
index 0000000..19446f7
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ContextTestsPlugin.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Mik Kersten
+ */
+public class ContextTestsPlugin extends Plugin {
+ // The shared instance.
+ private static ContextTestsPlugin plugin;
+
+ /**
+ * The constructor.
+ */
+ public ContextTestsPlugin() {
+ super();
+ plugin = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static ContextTestsPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/DegreeOfInterestTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/DegreeOfInterestTest.java
new file mode 100644
index 0000000..99c2be6
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/DegreeOfInterestTest.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.DegreeOfInterest;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class DegreeOfInterestTest extends TestCase {
+
+ private final InteractionContext mockContext = new InteractionContext("doitest", new InteractionContextScaling());
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testPredictedInterest() {
+ DegreeOfInterest doi = new DegreeOfInterest(mockContext, ContextCore.getCommonContextScaling());
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.PREDICTION, "kind", "handle", "source-id",
+ "id", null, 1);
+ doi.addEvent(event);
+
+ assertTrue(doi.isInteresting());
+ assertFalse(doi.isLandmark());
+ assertFalse(doi.isPropagated());
+ assertTrue(doi.isPredicted());
+ }
+
+ public void testPredictedInterestWithPropagated() {
+ DegreeOfInterest doi = new DegreeOfInterest(mockContext, ContextCore.getCommonContextScaling());
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.SELECTION, "kind", "handle", "source-id",
+ "id", null, 20);
+ doi.addEvent(event);
+
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.PREDICTION, "kind", "handle", "source-id",
+ "id", null, 2);
+ doi.addEvent(event2);
+
+ InteractionEvent event3 = new InteractionEvent(InteractionEvent.Kind.PROPAGATION, "kind", "handle",
+ "source-id", "id", null, 750);
+ doi.addEvent(event3);
+
+ InteractionEvent event4 = new InteractionEvent(InteractionEvent.Kind.MANIPULATION, "kind", "handle",
+ "source-id", "id", null, -684);
+ doi.addEvent(event4);
+
+ assertTrue(doi.isInteresting());
+ assertTrue(doi.isLandmark());
+ assertFalse(doi.isPropagated());
+ assertFalse(doi.isPredicted());
+ }
+
+ public void testPropagatedInterest() {
+ DegreeOfInterest doi = new DegreeOfInterest(mockContext, ContextCore.getCommonContextScaling());
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.PROPAGATION, "kind", "handle", "source-id",
+ "id", null, 1);
+ doi.addEvent(event);
+
+ assertTrue(doi.isInteresting());
+ assertFalse(doi.isLandmark());
+ assertTrue(doi.isPropagated());
+ assertFalse(doi.isPredicted());
+ }
+
+ public void testCreation() {
+ DegreeOfInterest doi = new DegreeOfInterest(mockContext, ContextCore.getCommonContextScaling());
+ assertFalse(doi.isInteresting());
+ assertFalse(doi.isLandmark());
+ assertFalse(doi.isPropagated());
+ assertFalse(doi.isPredicted());
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionContextListeningTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionContextListeningTest.java
new file mode 100644
index 0000000..3e2d0d1
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionContextListeningTest.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+
+/**
+ * @author Steffen Pingel
+ */
+public class InteractionContextListeningTest extends TestCase {
+
+ private final InteractionContext mockContext = new InteractionContext("doitest", new InteractionContextScaling());
+
+ private InteractionContextManager contextManager;
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ contextManager.deactivateAllContexts();
+ }
+
+ public void testAddRemoveListenerInContextActivated() {
+ contextManager = ContextCorePlugin.getContextManager();
+ ((CompositeInteractionContext) contextManager.getActiveContext()).getContextMap().put("handle", mockContext);
+
+ final StubContextListener listener = new StubContextListener();
+ try {
+ contextManager.addListener(new AbstractContextListener() {
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ contextManager.addListener(listener);
+ contextManager.removeListener(listener);
+ break;
+ }
+ }
+
+ });
+ contextManager.activateContext("handle");
+
+ contextManager.deactivateContext("handle");
+ contextManager.activateContext("handle");
+
+ assertEquals(0, listener.activationEventCount);
+ } finally {
+ // clean up just in case
+ contextManager.removeListener(listener);
+ }
+ }
+
+ private class StubContextListener extends AbstractContextListener {
+
+ private int activationEventCount;
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ contextManager.removeListener(this);
+ activationEventCount++;
+ break;
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionContextTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionContextTest.java
new file mode 100644
index 0000000..2e91ef3
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionContextTest.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class InteractionContextTest extends AbstractContextTest {
+
+ public void testReset() {
+ InteractionEvent event = mockSelection("aaaaa");
+ InteractionContext context = new InteractionContext("test", new InteractionContextScaling());
+ context.parseEvent(event);
+ assertEquals(1, context.getUserEventCount());
+ assertEquals(1, context.getInteractionHistory().size());
+
+ context.reset();
+ assertEquals(0, context.getUserEventCount());
+ assertEquals(0, context.getInteractionHistory().size());
+ }
+
+ public void testParseEventWithNullHandle() {
+ InteractionEvent event = mockSelection(null);
+ InteractionContext context = new InteractionContext("test", new InteractionContextScaling());
+ assertNull(context.parseEvent(event));
+ }
+
+ public void testSetScalingFactors() {
+ InteractionContextScaling oldScalingFactors = new InteractionContextScaling();
+// InteractionContextScaling newScalingFactors = new InteractionContextScaling();
+// newScalingFactors.get(InteractionEvent.Kind.EDIT).setValue(10f);
+ InteractionContext globalContext = new InteractionContext("global", oldScalingFactors);
+ assertEquals(oldScalingFactors, globalContext.getScaling());
+// globalContext.setScaling(newScalingFactors);
+ ((InteractionContextScaling) globalContext.getScaling()).set(InteractionEvent.Kind.EDIT, 10f);
+// assertEquals(newScalingFactors, globalContext.getScaling());
+ assertEquals(10f, globalContext.getScaling().get(InteractionEvent.Kind.EDIT));
+ }
+
+ public void testScalingFactorSet() {
+ InteractionContextScaling scalingFactors = new InteractionContextScaling();
+ scalingFactors.setDecay(0f);
+ InteractionContext context = new InteractionContext("test", scalingFactors);
+ assertEquals(0f, context.getScaling().getDecay());
+ }
+
+ public void testIsInteresting() {
+ InteractionContext context = new InteractionContext("test", new InteractionContextScaling());
+
+ assertFalse(context.isInteresting("1"));
+
+ context.parseEvent(mockSelection("1"));
+
+ assertTrue(context.isInteresting("1"));
+
+ context.parseEvent(mockInterestContribution("1", -10));
+
+ assertFalse(context.isInteresting("1"));
+ assertNotNull(context.get("1"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionEventTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionEventTest.java
new file mode 100644
index 0000000..896baed
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/InteractionEventTest.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class InteractionEventTest extends AbstractContextTest {
+
+ public void testCopy() throws InterruptedException {
+ InteractionEvent original = mockSelection();
+ Thread.sleep(1000);
+ InteractionEvent copy = InteractionEvent.makeCopy(original, original.getInterestContribution());
+ assertEquals(original, copy);
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ScalingFactorsTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ScalingFactorsTest.java
new file mode 100644
index 0000000..8cb2373
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ScalingFactorsTest.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.core.IInteractionContextScaling;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+
+/**
+ * @author Mik Kersten
+ */
+public class ScalingFactorsTest extends TestCase {
+
+ public void testLandmarkDefaults() {
+ IInteractionContextScaling scalingFactors = new InteractionContextScaling();
+ assertEquals(7 * scalingFactors.getLandmark(), scalingFactors.getForcedLandmark());
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ShadowsBridgeTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ShadowsBridgeTest.java
new file mode 100644
index 0000000..53ca420
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/ShadowsBridgeTest.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Andrew Eisenberg 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:
+ * Andrew Eisenberg - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.context.tests;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+
+/**
+ * This tests that structure bridge shadowing occurs appropriately.
+ *
+ * @author Andrew Eisenberg
+ */
+public class ShadowsBridgeTest extends AbstractContextTest {
+
+ static final String BASE_CONTENT_TYPE = "BASE_CONTENT_TYPE";
+
+ static final String SHADOWS_CONTENT_TYPE = "SHADOWS_CONTENT_TYPE";
+
+ static final String BASE_IDENTIFIER = "BASE_IDENTIFIER";
+
+ static final String SHADOWS_IDENTIFIER = "SHADOWS_IDENTIFIER";
+
+ static final String BASE_LABEL = "BASE_LABEL";
+
+ static final String SHADOWS_LABEL = "SHADOWS_LABEL";
+
+ static final Object BASE_OBJECT = new Object();
+
+ static final Object SHADOWS_OBJECT = new Object();
+
+ class BaseContentStructureBridge extends AbstractContextStructureBridge {
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ return object == BASE_OBJECT || object == SHADOWS_OBJECT;
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return false;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return false;
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return BASE_CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ if (elementHandle == BASE_IDENTIFIER) {
+ return BASE_CONTENT_TYPE;
+ } else if (elementHandle == SHADOWS_IDENTIFIER) {
+ return SHADOWS_IDENTIFIER;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object resource, int offset) {
+ if (resource == BASE_OBJECT) {
+ return BASE_IDENTIFIER;
+ } else if (resource == SHADOWS_OBJECT) {
+ return SHADOWS_IDENTIFIER;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object == BASE_OBJECT) {
+ return BASE_IDENTIFIER;
+ } else if (object == SHADOWS_OBJECT) {
+ return SHADOWS_IDENTIFIER;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object == BASE_OBJECT) {
+ return BASE_LABEL;
+ } else if (object == SHADOWS_OBJECT) {
+ return SHADOWS_LABEL;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ if (handle == BASE_IDENTIFIER) {
+ return BASE_OBJECT;
+ } else if (handle == SHADOWS_IDENTIFIER) {
+ return SHADOWS_OBJECT;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ return null;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return false;
+ }
+
+ }
+
+ class ShadowsContentStructureBridge extends AbstractContextStructureBridge {
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ return object == SHADOWS_OBJECT;
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return false;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return false;
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return SHADOWS_CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ if (elementHandle == SHADOWS_IDENTIFIER) {
+ return SHADOWS_IDENTIFIER;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object resource, int offset) {
+ if (resource == SHADOWS_OBJECT) {
+ return SHADOWS_IDENTIFIER;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object == SHADOWS_OBJECT) {
+ return SHADOWS_IDENTIFIER;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object == SHADOWS_OBJECT) {
+ return SHADOWS_LABEL;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ if (handle == SHADOWS_IDENTIFIER) {
+ return SHADOWS_OBJECT;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ return null;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return false;
+ }
+
+ }
+
+ /**
+ * @throws Exception
+ */
+ public void testShadowsStructureBridge() throws Exception {
+ // 1) Create mock bridge
+ BaseContentStructureBridge baseBridge = new BaseContentStructureBridge();
+
+ // 2) Add it to ContextCorePlugin
+ ContextCorePlugin context = ContextCorePlugin.getDefault();
+ context.addStructureBridge(baseBridge);
+
+ // 3) Check that the bridge is found properly
+ AbstractContextStructureBridge otherBridge;
+
+ otherBridge = context.getStructureBridge(BASE_CONTENT_TYPE);
+ assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);
+
+ otherBridge = context.getStructureBridge(BASE_OBJECT);
+ assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);
+
+// otherBridge = context.getStructureBridge(SHADOWS_CONTENT_TYPE);
+// assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);
+
+ otherBridge = context.getStructureBridge(SHADOWS_OBJECT);
+ assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);
+
+ // 4) Create second mock bridge
+ ShadowsContentStructureBridge shadowsBridge = new ShadowsContentStructureBridge();
+
+ // 5) Add it to ContextCorePlugin
+ context.addStructureBridge(shadowsBridge);
+
+ // 6) Add shadows relationship (must use reflection because it is not exposed)
+ Method addShadowsContentMethod = ContextCorePlugin.class.getDeclaredMethod("addShadowsContent", String.class,
+ String.class);
+ addShadowsContentMethod.setAccessible(true);
+ addShadowsContentMethod.invoke(context, BASE_CONTENT_TYPE, SHADOWS_CONTENT_TYPE);
+
+ // 7) Ensure that the proper kinds of objects are accepted by the shadows bridge instead
+ // now the base content is shadowed and should return the shadows bridge
+ otherBridge = context.getStructureBridge(BASE_CONTENT_TYPE);
+ assertEquals("Should be the same bridges: " + shadowsBridge + " " + otherBridge, shadowsBridge, otherBridge);
+
+ otherBridge = context.getStructureBridge(SHADOWS_CONTENT_TYPE);
+ assertEquals("Should be the same bridges: " + shadowsBridge + " " + otherBridge, shadowsBridge, otherBridge);
+
+ otherBridge = context.getStructureBridge(SHADOWS_OBJECT);
+ assertEquals("Should be the same bridges: " + shadowsBridge + " " + otherBridge, shadowsBridge, otherBridge);
+
+ // since shadows bridge does not accept BASE_OBJECT, we should still be getting base bridge here.
+ otherBridge = context.getStructureBridge(BASE_OBJECT);
+ assertEquals("Should be the same bridges: " + baseBridge + " " + otherBridge, baseBridge, otherBridge);
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/UiTestUtil.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/UiTestUtil.java
new file mode 100644
index 0000000..dc5b55d
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/UiTestUtil.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class UiTestUtil {
+
+ public static int countItemsInTree(Tree tree) {
+ List<TreeItem> collectedItems = new ArrayList<TreeItem>();
+ collectTreeItemsInView(tree.getItems(), collectedItems);
+ return collectedItems.size();
+ }
+
+ public static void collectTreeItemsInView(TreeItem[] items, List<TreeItem> collectedItems) {
+ if (items.length > 0) {
+ for (TreeItem childItem : Arrays.asList(items)) {
+ collectedItems.add(childItem);
+ collectTreeItemsInView(childItem.getItems(), collectedItems);
+ }
+ }
+ }
+
+ public static List<Object> getAllData(Tree tree) {
+ List<TreeItem> items = new ArrayList<TreeItem>();
+ collectTreeItemsInView(tree.getItems(), items);
+ List<Object> dataList = new ArrayList<Object>();
+ for (TreeItem item : items) {
+ dataList.add(item.getData());
+ }
+ return dataList;
+ }
+
+ /**
+ * Ensures that the editor area is visible.
+ */
+ public static void closeWelcomeView() {
+ IViewReference[] views = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getViewReferences();
+ for (IViewReference view : views) {
+ if ("org.eclipse.ui.internal.introview".equals(view.getId())) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().hideView(view);
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().resetPerspective();
+ return;
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/DomContextReader.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/DomContextReader.java
new file mode 100644
index 0000000..61c82f0
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/DomContextReader.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests.support;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.AggregateInteractionEvent;
+import org.eclipse.mylyn.internal.context.core.IInteractionContextReader;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Mik Kersten
+ *
+ * TODO: merge into a single externalizer
+ */
+public class DomContextReader implements IInteractionContextReader {
+
+ public InteractionContext readContext(String handle, File file) {
+ if (!file.exists()) {
+ return null;
+ }
+ try {
+ Document doc = openAsDOM(file);
+ Element root = doc.getDocumentElement();
+ // readVersion = Integer.parseInt(root.getAttribute("Version"));
+ // String id = root.getAttribute("Id");
+ InteractionContext t = new InteractionContext(handle, ContextCore.getCommonContextScaling());
+ NodeList list = root.getChildNodes();
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ InteractionEvent ie = readInteractionEvent(child);
+ if (ie != null) {
+ t.parseEvent(ie);
+ }
+ }
+ return t;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public Document openAsDOM(File inputFile) throws IOException {
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = null;
+ Document document = null;
+ ZipInputStream zipInputStream = null;
+ FileInputStream fileInputStream = null;
+ try {
+ fileInputStream = new FileInputStream(inputFile);
+ zipInputStream = new ZipInputStream(fileInputStream);
+ zipInputStream.getNextEntry();
+ builder = factory.newDocumentBuilder();
+ document = builder.parse(zipInputStream);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+ closeStream(zipInputStream);
+ closeStream(fileInputStream);
+ }
+ return document;
+ }
+
+ @SuppressWarnings( { "deprecation" })
+ public InteractionEvent readInteractionEvent(Node n) {
+ try {
+ Element e = (Element) n;
+ String kind = e.getAttribute("Kind");
+ String startDate = e.getAttribute("StartDate");
+ String endDate = e.getAttribute("EndDate");
+ String originId = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("OriginId"));
+ String structureKind = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("StructureKind"));
+ String structureHandle = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("StructureHandle"));
+ String navigation = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("Navigation"));
+ String delta = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(e.getAttribute("Delta"));
+ String interest = e.getAttribute("Interest");
+ String numEventsString = e.getAttribute("NumEvents");
+ int numEvents = 1;
+ if (numEventsString != null && numEventsString.length() != 0) {
+ try {
+ numEvents = Integer.parseInt(numEventsString);
+ } catch (NumberFormatException nfe) {
+ //ignore.
+ }
+ }
+
+ String eventCountOnCreationString = e.getAttribute("CreationCount");
+ int eventCountOnCreation = -1;
+ if (eventCountOnCreationString != null && eventCountOnCreationString.length() != 0) {
+ try {
+ eventCountOnCreation = Integer.parseInt(eventCountOnCreationString);
+ } catch (NumberFormatException nfe) {
+ //ignore.
+ }
+ }
+
+ String formatString = "yyyy-MM-dd HH:mm:ss.S z";
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+
+ InteractionEvent ie = null;
+ if (numEventsString == null || eventCountOnCreationString == null) {
+ // if we don't have the values for the collapsed event, it must be one that is uncollapsed
+ ie = new InteractionEvent(Kind.fromString(kind), structureKind, structureHandle, originId, navigation,
+ delta, Float.parseFloat(interest), format.parse(startDate), format.parse(endDate));
+ } else {
+ ie = new AggregateInteractionEvent(Kind.fromString(kind), structureKind, structureHandle, originId,
+ navigation, delta, Float.parseFloat(interest), format.parse(startDate), format.parse(endDate),
+ numEvents, eventCountOnCreation);
+ }
+
+ return ie;
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static final void closeStream(Closeable closeable) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/DomContextWriter.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/DomContextWriter.java
new file mode 100644
index 0000000..9fe7304
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/DomContextWriter.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests.support;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.internal.context.core.AggregateInteractionEvent;
+import org.eclipse.mylyn.internal.context.core.IInteractionContextWriter;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * TODO: remove the explicit string references
+ *
+ * @author Mik Kersten
+ */
+public class DomContextWriter implements IInteractionContextWriter {
+
+ private DocumentBuilderFactory dbf = null;
+
+ private Document doc = null;
+
+ private Element root = null;
+
+ private OutputStream outputStream = null;
+
+ private Result result = null;
+
+ public DomContextWriter() throws Exception {
+ dbf = DocumentBuilderFactory.newInstance();
+ doc = dbf.newDocumentBuilder().newDocument();
+ }
+
+ public void writeContextToStream(IInteractionContext context) throws IOException {
+ if (outputStream == null) {
+ IOException ioe = new IOException("OutputStream not set");
+ throw ioe;
+ }
+
+ clearDocument();
+ root = doc.createElement("InteractionHistory");
+ root.setAttribute("Version", "1");
+ root.setAttribute("Id", context.getHandleIdentifier());
+
+ for (InteractionEvent ie : context.getInteractionHistory()) {
+ writeInteractionEvent(ie);
+ }
+ doc.appendChild(root);
+ writeDOMtoStream(doc);
+ return;
+ }
+
+ private void writeDOMtoStream(Document document) {
+ Source source = new DOMSource(document);
+ result = new StreamResult(outputStream);
+ Transformer xformer = null;
+ try {
+ xformer = TransformerFactory.newInstance().newTransformer();
+ xformer.transform(source, result);
+ } catch (TransformerConfigurationException e) {
+ e.printStackTrace();
+ } catch (TransformerFactoryConfigurationError e) {
+ e.printStackTrace();
+ } catch (TransformerException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ @SuppressWarnings( { "deprecation" })
+ private void writeInteractionEvent(InteractionEvent e) {
+ Element node = doc.createElement("InteractionEvent");
+ String f = "yyyy-MM-dd HH:mm:ss.S z";
+ SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH);
+ node.setAttribute("Kind", e.getKind().toString());
+ node.setAttribute("StartDate", format.format(e.getDate()));
+ node.setAttribute("EndDate", format.format(e.getEndDate()));
+ node.setAttribute("OriginId",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getOriginId()));
+ node.setAttribute("StructureKind",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureKind()));
+ node.setAttribute("StructureHandle",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureHandle()));
+ node.setAttribute("Navigation",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getNavigation()));
+ node.setAttribute("Delta",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getDelta()));
+ node.setAttribute("Interest", "" + e.getInterestContribution());
+
+ if (e instanceof AggregateInteractionEvent) {
+ root.setAttribute("NumEvents", "" + ((AggregateInteractionEvent) e).getNumCollapsedEvents());
+ root.setAttribute("CreationCount", "" + ((AggregateInteractionEvent) e).getEventCountOnCreation());
+ }
+ root.appendChild(node);
+ }
+
+ @SuppressWarnings( { "deprecation" })
+ public void writeEventToStream(InteractionEvent e) throws IOException {
+ if (outputStream == null) {
+ IOException ioe = new IOException("OutputStream not set");
+ throw ioe;
+ }
+
+ clearDocument();
+ root = doc.createElement("InteractionEvent");
+ String f = "yyyy-MM-dd HH:mm:ss.S z";
+ SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH);
+ root.setAttribute("Kind", e.getKind().toString());
+ root.setAttribute("StartDate", format.format(e.getDate()));
+ root.setAttribute("EndDate", format.format(e.getEndDate()));
+ root.setAttribute("OriginId",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getOriginId()));
+ root.setAttribute("StructureKind",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureKind()));
+ root.setAttribute("StructureHandle",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getStructureHandle()));
+ root.setAttribute("Navigation",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getNavigation()));
+ root.setAttribute("Delta",
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getDelta()));
+ root.setAttribute("Interest", "" + e.getInterestContribution());
+
+ if (e instanceof AggregateInteractionEvent) {
+ root.setAttribute("NumEvents", "" + ((AggregateInteractionEvent) e).getNumCollapsedEvents());
+ root.setAttribute("CreationCount", "" + ((AggregateInteractionEvent) e).getEventCountOnCreation());
+ }
+
+ writeDOMtoStream(doc);
+ }
+
+ private void clearDocument() {
+ try {
+ this.doc = dbf.newDocumentBuilder().newDocument();
+ } catch (ParserConfigurationException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public OutputStream getOutputStream() {
+ return outputStream;
+ }
+
+ public void setOutputStream(OutputStream outputStream) {
+ this.outputStream = outputStream;
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/FileTool.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/FileTool.java
new file mode 100644
index 0000000..99b1c36
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/FileTool.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.context.tests.support;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+
+public class FileTool {
+
+ private final static int MAX_RETRY = 5;
+
+ /**
+ * A buffer.
+ */
+ private static byte[] buffer = new byte[8192];
+
+ /**
+ * Unzips the given zip file to the given destination directory extracting only those entries the pass through the
+ * given filter.
+ *
+ * @param zipFile
+ * the zip file to unzip
+ * @param dstDir
+ * the destination directory
+ * @throws IOException
+ * in case of problem
+ */
+ public static void unzip(ZipFile zipFile, File dstDir) throws IOException {
+ unzip(zipFile, dstDir, dstDir, 0);
+ }
+
+ private static void unzip(ZipFile zipFile, File rootDstDir, File dstDir, int depth) throws IOException {
+
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+
+ try {
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = entries.nextElement();
+ if (entry.isDirectory()) {
+ continue;
+ }
+ String entryName = entry.getName();
+ File file = new File(dstDir, changeSeparator(entryName, '/', File.separatorChar));
+ file.getParentFile().mkdirs();
+ InputStream src = null;
+ OutputStream dst = null;
+ try {
+ src = zipFile.getInputStream(entry);
+ dst = new FileOutputStream(file);
+ transferData(src, dst);
+ } finally {
+ if (dst != null) {
+ try {
+ dst.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ if (src != null) {
+ try {
+ src.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ }
+ }
+ } finally {
+ try {
+ zipFile.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ }
+
+ /**
+ * Returns the given file path with its separator character changed from the given old separator to the given new
+ * separator.
+ *
+ * @param path
+ * a file path
+ * @param oldSeparator
+ * a path separator character
+ * @param newSeparator
+ * a path separator character
+ * @return the file path with its separator character changed from the given old separator to the given new
+ * separator
+ */
+ public static String changeSeparator(String path, char oldSeparator, char newSeparator) {
+ return path.replace(oldSeparator, newSeparator);
+ }
+
+ /**
+ * Copies all bytes in the given source file to the given destination file.
+ *
+ * @param source
+ * the given source file
+ * @param destination
+ * the given destination file
+ * @throws IOException
+ * in case of error
+ */
+ public static void transferData(File source, File destination) throws IOException {
+ destination.getParentFile().mkdirs();
+ InputStream is = null;
+ OutputStream os = null;
+ try {
+ is = new FileInputStream(source);
+ os = new FileOutputStream(destination);
+ transferData(is, os);
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ }
+ }
+
+ /**
+ * Copies all bytes in the given source stream to the given destination stream. Neither streams are closed.
+ *
+ * @param source
+ * the given source stream
+ * @param destination
+ * the given destination stream
+ * @throws IOException
+ * in case of error
+ */
+ public static void transferData(InputStream source, OutputStream destination) throws IOException {
+ int bytesRead = 0;
+ while (bytesRead != -1) {
+ bytesRead = source.read(buffer, 0, buffer.length);
+ if (bytesRead != -1) {
+ destination.write(buffer, 0, bytesRead);
+ }
+ }
+ }
+
+ /**
+ * Copies the given source file to the given destination file.
+ *
+ * @param src
+ * the given source file
+ * @param dst
+ * the given destination file
+ * @throws IOException
+ * in case of error
+ */
+ public static void copy(File src, File dst) throws IOException {
+ if (src.isDirectory()) {
+ String[] srcChildren = src.list();
+ for (int i = 0; i < srcChildren.length; ++i) {
+ File srcChild = new File(src, srcChildren[i]);
+ File dstChild = new File(dst, srcChildren[i]);
+ copy(srcChild, dstChild);
+ }
+ } else {
+ transferData(src, dst);
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public static File getFileInPlugin(Plugin plugin, IPath path) {
+ try {
+ URL installURL = plugin.getBundle().getEntry(path.toString());
+
+ URL localURL = Platform.asLocalURL(installURL);
+// URL localURL = FileLocator.toFileURL(installURL);//Platform.asLocalURL(installURL);
+ return new File(localURL.getFile());
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public static File createTempFileInPlugin(Plugin plugin, IPath path) {
+ IPath stateLocation = plugin.getStateLocation();
+ stateLocation = stateLocation.append(path);
+ return stateLocation.toFile();
+ }
+
+ public static StringBuffer read(String fileName) throws IOException {
+ return read(new FileReader(fileName));
+ }
+
+ public static StringBuffer read(Reader reader) throws IOException {
+ StringBuffer s = new StringBuffer();
+ try {
+ char[] charBuffer = new char[8196];
+ int chars = reader.read(charBuffer);
+ while (chars != -1) {
+ s.append(charBuffer, 0, chars);
+ chars = reader.read(charBuffer);
+ }
+ } finally {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ return s;
+ }
+
+ public static void write(String fileName, StringBuffer content) throws IOException {
+ Writer writer = new FileWriter(fileName);
+ try {
+ writer.write(content.toString());
+ } finally {
+ try {
+ writer.close();
+ } catch (IOException e) {
+ // don't need to catch this
+ }
+ }
+ }
+
+ public static void delete(File file) {
+ if (file.exists()) {
+ for (int i = 0; i < MAX_RETRY; i++) {
+ if (file.delete()) {
+ i = MAX_RETRY;
+ } else {
+ try {
+ Thread.sleep(1000); // sleep a second
+ } catch (InterruptedException e) {
+ // don't need to catch this
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/ResourceHelper.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/ResourceHelper.java
new file mode 100644
index 0000000..29b3649
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/ResourceHelper.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.context.tests.support;
+
+import java.io.IOException;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.tests.ContextTestsPlugin;
+import org.eclipse.pde.internal.core.natures.PDE;
+import org.eclipse.pde.internal.core.natures.PluginProject;
+
+/**
+ * @since 3.0
+ */
+public class ResourceHelper {
+
+ private final static IProgressMonitor NULL_MONITOR = new NullProgressMonitor();
+
+ private static final int MAX_RETRY = 10;
+
+ public static void deleteProject(String projectName) throws CoreException {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IProject project = root.getProject(projectName);
+ if (project.exists()) {
+ delete(project);
+ }
+ }
+
+ public static void delete(final IResource resource) throws CoreException {
+ IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ for (int i = 0; i < MAX_RETRY; i++) {
+ try {
+ resource.delete(true, null);
+ i = MAX_RETRY;
+ } catch (CoreException e) {
+ if (i == MAX_RETRY - 1) {
+ StatusHandler.log(e.getStatus());
+ throw e;
+ }
+ System.gc(); // help windows to really close file
+ // locks
+ try {
+ Thread.sleep(1000); // sleep a second
+ } catch (InterruptedException e1) {
+ }
+ }
+ }
+ }
+ };
+ ResourcesPlugin.getWorkspace().run(runnable, null);
+
+ }
+
+ private static IProject createProject(String projectName) throws CoreException {
+
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IProject project = root.getProject(projectName);
+ if (!project.exists()) {
+ project.create(NULL_MONITOR);
+ } else {
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ }
+
+ if (!project.isOpen()) {
+ project.open(NULL_MONITOR);
+ }
+
+ return project;
+ }
+
+ private static IJavaProject createPluginProject(IProject project) throws CoreException, JavaModelException {
+
+ if (project == null) {
+ return null;
+ }
+
+ IJavaProject javaProject = JavaCore.create(project);
+
+ // create bin folder
+ IFolder binFolder = project.getFolder("bin");
+ if (!binFolder.exists()) {
+ binFolder.create(false, true, null);
+ }
+
+ // set java nature
+ IProjectDescription description = project.getDescription();
+ description.setNatureIds(new String[] { PDE.PLUGIN_NATURE, JavaCore.NATURE_ID });
+ project.setDescription(description, null);
+
+ // create output folder
+ IPath outputLocation = binFolder.getFullPath();
+ javaProject.setOutputLocation(outputLocation, null);
+
+ PluginProject pluginProject = new PluginProject();
+ pluginProject.setProject(project);
+ pluginProject.configure();
+
+ return javaProject;
+ }
+
+ public static IJavaProject createJavaPluginProjectFromZip(String projectName, String zipFileName)
+ throws CoreException, ZipException, IOException {
+ IProject project = ResourceHelper.createProject(projectName);
+ ZipFile zip = new ZipFile(FileTool.getFileInPlugin(ContextTestsPlugin.getDefault(), new Path(
+ "testdata/projects/" + zipFileName)));
+
+ FileTool.unzip(zip, project.getLocation().toFile());
+
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+
+ IJavaProject javaProject = ResourceHelper.createPluginProject(project);
+ return javaProject;
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/TestMonitor.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/TestMonitor.java
new file mode 100644
index 0000000..60b7e50
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/TestMonitor.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests.support;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class TestMonitor extends AbstractUserInteractionMonitor {
+
+ List<IJavaElement> selections = new ArrayList<IJavaElement>();
+
+ public TestMonitor() {
+ super();
+ }
+
+ public void handleElementSelection(IJavaElement selected) {
+ selections.add(selected);
+ }
+
+ protected void handleUnknownSelection(Object selectedObject) {
+ // don't need to do anything here
+ }
+
+ protected void handleSelection(File file) {
+ // don't need to do anything here
+ }
+
+ public List<IJavaElement> getSelections() {
+ return selections;
+ }
+
+ public void handleReferenceNavigation(IJavaElement from, IJavaElement to) {
+ // don't need to do anything here
+ }
+
+ public void handleImplementorNavigation(IJavaElement from, IJavaElement to) {
+ // don't need to do anything here
+ }
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ // don't need to do anything here
+
+ }
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/TestUtil.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/TestUtil.java
new file mode 100644
index 0000000..2f42d33
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/TestUtil.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests.support;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.net.URL;
+import java.util.Properties;
+
+import junit.framework.AssertionFailedError;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.tests.ContextTestsPlugin;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TestUtil {
+
+ private static boolean contextUiLazyStarted;
+
+ public static final String KEY_CREDENTIALS_FILE = "mylyn.credentials";
+
+ public enum PrivilegeLevel {
+ ANONYMOUS, GUEST, USER, ADMIN
+ };
+
+ public static class Credentials {
+
+ public final String username;
+
+ public final String password;
+
+ public Credentials(String username, String password) {
+ this.username = username;
+ this.password = password;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getName() + " [username=" + username + ",password=" + password + "]";
+ }
+ }
+
+ public static Credentials readCredentials() {
+ return readCredentials(PrivilegeLevel.USER, null);
+ }
+
+ public static Credentials readCredentials(PrivilegeLevel level) {
+ return readCredentials(level, null);
+ }
+
+ public static Credentials readCredentials(PrivilegeLevel level, String realm) {
+ Properties properties = new Properties();
+ try {
+ String filename = System.getProperty(KEY_CREDENTIALS_FILE);
+ if (filename == null) {
+ if (ContextTestsPlugin.getDefault() != null) {
+ URL localURL = FileLocator.toFileURL(ContextTestsPlugin.getDefault().getBundle().getEntry(
+ "credentials.properties"));
+ filename = localURL.getFile();
+ } else {
+ URL localURL = TestUtil.class.getResource("");
+ filename = localURL.getFile() + "../../../../../../../credentials.properties";
+ }
+ }
+ properties.load(new FileInputStream(new File(filename)));
+ } catch (Exception e) {
+ throw new AssertionFailedError("must define credentials in <plug-in dir>/credentials.properties");
+ }
+
+ String defaultPassword = properties.getProperty("pass");
+
+ realm = (realm != null) ? realm + "." : "";
+ switch (level) {
+ case ANONYMOUS:
+ return createCredentials(properties, realm + "anon.", "", "");
+ case GUEST:
+ return createCredentials(properties, realm + "guest.", "guest at mylyn.eclipse.org", defaultPassword);
+ case USER:
+ return createCredentials(properties, realm, "tests at mylyn.eclipse.org", defaultPassword);
+ case ADMIN:
+ return createCredentials(properties, realm + "admin.", "admin at mylyn.eclipse.org", null);
+ }
+
+ throw new AssertionFailedError("invalid privilege level");
+ }
+
+ private static Credentials createCredentials(Properties properties, String prefix, String defaultUsername,
+ String defaultPassword) {
+ String username = properties.getProperty(prefix + "user");
+ String password = properties.getProperty(prefix + "pass");
+
+ if (username == null) {
+ username = defaultUsername;
+ }
+
+ if (password == null) {
+ password = defaultPassword;
+ }
+
+ if (username == null || password == null) {
+ throw new AssertionFailedError(
+ "username or password not found in <plug-in dir>/credentials.properties, make sure file is valid");
+ }
+
+ return new Credentials(username, password);
+ }
+
+ /**
+ * Test cases that rely on lazy startup of Context Ui (e.g. context bridges) need to invoke this method prior to
+ * running the test.
+ */
+ public static void triggerContextUiLazyStart() {
+ if (contextUiLazyStarted) {
+ return;
+ }
+
+ contextUiLazyStarted = true;
+
+ // make sure monitor UI is started and logs the start interaction event
+ MonitorUiPlugin.getDefault();
+
+ ContextCore.getContextManager().activateContext("startup");
+ ContextCore.getContextManager().deactivateContext("startup");
+ }
+
+ public static IViewPart openView(String id) throws PartInitException {
+ return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(id);
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/search/ISearchPluginTest.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/search/ISearchPluginTest.java
new file mode 100644
index 0000000..e4dbcec
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/search/ISearchPluginTest.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests.support.search;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ISearchPluginTest {
+ public List<?> search(int dos, IInteractionElement node) throws IOException, CoreException;
+}
diff --git a/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/search/TestActiveSearchListener.java b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/search/TestActiveSearchListener.java
new file mode 100644
index 0000000..d1b4176
--- /dev/null
+++ b/org.eclipse.mylyn.context.tests/src/org/eclipse/mylyn/context/tests/support/search/TestActiveSearchListener.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.tests.support.search;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+
+/**
+ * @author Mik Kersten
+ */
+public class TestActiveSearchListener implements IActiveSearchListener {
+
+ private AbstractRelationProvider prov = null;
+
+ private List<?> results = null;
+
+ public TestActiveSearchListener(AbstractRelationProvider prov) {
+ this.prov = prov;
+ }
+
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> l) {
+ List<Object> accepted = new ArrayList<Object>(l.size());
+ if (prov != null) {
+ for (Object o : l) {
+ if (prov.acceptResultElement(o)) {
+ accepted.add(o);
+ }
+ }
+ results = accepted;
+ } else {
+ results = l;
+ }
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+
+ public List<?> getResults() {
+ return results;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.tests/testdata/externalizer/testcontext.xml.zip b/org.eclipse.mylyn.context.tests/testdata/externalizer/testcontext.xml.zip
new file mode 100644
index 0000000..ab8ce14
Binary files /dev/null and b/org.eclipse.mylyn.context.tests/testdata/externalizer/testcontext.xml.zip differ
diff --git a/org.eclipse.mylyn.context.tests/testdata/projects/project1.zip b/org.eclipse.mylyn.context.tests/testdata/projects/project1.zip
new file mode 100644
index 0000000..fdb0b93
Binary files /dev/null and b/org.eclipse.mylyn.context.tests/testdata/projects/project1.zip differ
diff --git a/org.eclipse.mylyn.context.tests/testdata/projects/project2.zip b/org.eclipse.mylyn.context.tests/testdata/projects/project2.zip
new file mode 100644
index 0000000..280f4cf
Binary files /dev/null and b/org.eclipse.mylyn.context.tests/testdata/projects/project2.zip differ
diff --git a/org.eclipse.mylyn.context.ui/.classpath b/org.eclipse.mylyn.context.ui/.classpath
new file mode 100644
index 0000000..9ead95c
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.context.ui/.cvsignore b/org.eclipse.mylyn.context.ui/.cvsignore
new file mode 100644
index 0000000..4a98758
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.fbwarnings
diff --git a/org.eclipse.mylyn.context.ui/.project b/org.eclipse.mylyn.context.ui/.project
new file mode 100644
index 0000000..9b088d4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.context.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..124c20f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'ELEMENT_UI_CLASS' in 'org.eclipse.mylar.context.ui.ContextUiPlugin.UiExtensionPointReader' to 'ELEMENT_CLASS' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.context.ui.ContextUiPlugin.UiExtensionPointReader.ELEMENT_UI_CLASS' - Renamed element: 'org.eclipse.mylar.context.ui.ContextUiPlugin.UiExtensionPointReader.ELEMENT_CLASS' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ELEMENT_UI_CLASS'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.context.ui{ContextUiPlugin.java[ContextUiPlugin[UiExtensionPointReader^ELEMENT_UI_CLASS" name="ELEMENT_CLASS" references="true" setter="false" stamp="1161304295265" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.TaskListHighlighterMenuContributor' to 'TaskHighlighterMenuContributor' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.TaskListHighlighterMenuContributor' - Renamed element: 'org.eclipse.mylar.internal.context.ui.TaskHighlighterMenuContributor' - Update references to refactored element - Update fully qualified names in '*.mf, *.plugin.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListHighlighterMenuContributor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui{TaskListHighlighterMenuContributor.java[TaskListHighlighterMenuContributor" matchStrategy="1" name="TaskHighlighterMenuContributor" patterns="*.mf, *.plugin.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161367193656" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.context.ui.actions.EditHighlightersAction.ID_PREFS_HIGHLIGHTERS' from expression '"org.eclipse.mylar.sandbox.ui.preferences"' - Original project: 'org.eclipse.mylar.context.ui' - Constant name: 'ID_PREFS_HIGHLIGHTERS' - Constant expression: '"org.eclipse.mylar.sandbox.ui.preferences"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ID_PREFS_HIGHLIGHTERS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.context.ui.actions{EditHighlightersAction.java" name="ID_PREFS_HIGHLIGHTERS" qualify="false" replace="true" selection="1954 42" stamp="1161367294093" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..1b52cbb
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1,3 @@
+1161304295265 Rename field 'ELEMENT_UI_CLASS'
+1161367193656 Rename type 'TaskListHighlighterMenuContributor'
+1161367294093 Extract constant 'ID_PREFS_HIGHLIGHTERS'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..333473a
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.ui' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.TransferContextAction.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.context.ui.actions{TransferContextAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1164333070484" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.ui.IMylarUiBridge' to 'AbstractMylarUiBridge' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.context.ui.IMylarUiBridge' - Renamed element: 'org.eclipse.mylar.context.ui.AbstractMylarUiBridge' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarUiBridge'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.ui{IMylarUiBridge.java[IMylarUiBridge" matchStrategy="1" name="AbstractMylarUiBridge" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1164406958546" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.ui.AbstractMylarUiBridge' to 'AbstractContextUiBridge' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.context.ui.AbstractMylarUiBridge' - Renamed element: 'org.eclipse.mylar.context.ui.AbstractContextUiBridge' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractMylarUiBridge'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.ui{AbstractMylarUiBridge.java[AbstractMylarUiBridge" matchStrategy="1" name="AbstractContextUiBridge" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1164407034234" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..d35be10
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1,3 @@
+1164333070484 Delete element
+1164406958546 Rename type 'IMylarUiBridge'
+1164407034234 Rename type 'AbstractMylarUiBridge'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..31e697f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylar.context.ui' - Destination element: 'eview16' - Original element: 'active-search.gif'" description="Copy file" destination="icons/eview16" element1="icons/eview16/active-search.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/active-search.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1164711569187" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..debbb59
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1 @@
+1164711569187 Copy file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/12/48/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/48/refactorings.history
new file mode 100644
index 0000000..1908c43
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/48/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'altDown' in 'org.eclipse.mylar.internal.context.ui.BrowseFilteredListener' to 'unfilterKeyDown' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.BrowseFilteredListener.altDown' - Renamed element: 'org.eclipse.mylar.internal.context.ui.BrowseFilteredListener.unfilterKeyDown' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'altDown'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.ui{BrowseFilteredListener.java[BrowseFilteredListener^altDown" name="unfilterKeyDown" references="true" setter="false" stamp="1164976685125" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.MylarPerspectiveManager' to 'ContextPerspectiveManager' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.MylarPerspectiveManager' - Renamed element: 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPerspectiveManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui{MylarPerspectiveManager.java[MylarPerspectiveManager" matchStrategy="1" name="ContextPerspectiveManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165068444000" textual="true" version="1.0"/>
+<refactoring comment="Extract method 'private void showPerspective(String perspectiveId)' from 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager.taskActivated()' to 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'showPerspective' - Destination type: 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager' - Declared visibility: 'private'" comments="false" description="Extract method 'showPerspective'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui{ContextPerspectiveManager.java" name="showPerspective" replace="false" selection="1454 386" stamp="1165078084843" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/12/48/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/48/refactorings.index
new file mode 100644
index 0000000..801dbd2
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/48/refactorings.index
@@ -0,0 +1,3 @@
+1164976685125 Rename field 'altDown'
+1165068444000 Rename type 'MylarPerspectiveManager'
+1165078084843 Extract method 'showPerspective'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..8381982
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.AbstractApplyMylarAction' to 'AbstractFocusViewAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.AbstractApplyMylarAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractApplyMylarAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractApplyMylarAction.java[AbstractApplyMylarAction" matchStrategy="1" name="AbstractFocusViewAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277250782" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.AbstractAutoApplyMylarAction' to 'AbstractAutoFocusViewAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.AbstractAutoApplyMylarAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.AbstractAutoFocusViewAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractAutoApplyMylarAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractAutoApplyMylarAction.java[AbstractAutoApplyMylarAction" matchStrategy="1" name="AbstractAutoFocusViewAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277263079" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.ApplyMylarToTaskListAction' to 'FocusTaskListAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.ApplyMylarToTaskListAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.FocusTaskListAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToTaskListAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{ApplyMylarToTaskListAction.java[ApplyMylarToTaskListAction" matchStrategy="1" name="FocusTaskListAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277434642" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.ApplyMylarToOutlineAction' to 'FocusOutlineAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.ApplyMylarToOutlineAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.FocusOutlineAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToOutlineAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{ApplyMylarToOutlineAction.java[ApplyMylarToOutlineAction" matchStrategy="1" name="FocusOutlineAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277443782" textual="true" version="1.0"/>
+<refactoring comment="Change method 'protected Object org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.resolveSelection(ITextSelection selection)' to 'protected Object resolveSelection(IWorkbenchPart part, ITextSelection selection)' - Original project: 'org.eclipse.mylar.context.ui' - Added parameters: IWorkbenchPart part" default1="null" delegate="false" deprecate="true" description="Change method 'resolveSelection'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java[AbstractFocusViewAction~resolveSelection~QITextSelection;" name="resolveSelection" parameter1="Object newParam -1 IWorkbenchPart part false" parameter2="ITextSelection selection 0 ITextSelection selection false" stamp="1165279361876" version="1.0"/>
+<refactoring comment="Change method 'protected Object org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.resolveSelection(IWorkbenchPart part, ITextSelection selection) throws CoreException' to 'protected Object resolveSelection(IWorkbenchPart part, ITextSelection selection, StructuredViewer viewer) throws CoreException' - Original project: 'org.eclipse.mylar.context.ui' - Added parameters: StructuredViewer viewer" default3="null" delegate="false" deprecate="true" description="Change method 'resolveSelection'" element1="/C:\/Apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java[AbstractFocusViewAction~resolveSelection~QIWorkbenchPart;~QITextSelection;" kind1="0" name="resolveSelection" parameter1="IWorkbenchPart part 0 IWorkbenchPart part false" parameter2="ITextSelection selection 1 ITextSelection selection false" parameter3="Object newParam -1 StructuredViewer viewer false" stamp="1165279616673" version="1.0"/>
+<refactoring comment="Change method 'protected Object org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.resolveSelection(IEditorPart part, ITextSelection selection, StructuredViewer viewer) throws CoreException' to 'protected Object resolveSelection(IEditorPart part, ITextSelection selection, StructuredViewer viewer) throws CoreException' - Original project: 'org.eclipse.mylar.context.ui' - Changed parameters: IWorkbenchPart part" delegate="false" deprecate="true" description="Change method 'resolveSelection'" element1="/C:\/Apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java[AbstractFocusViewAction~resolveSelection~QIWorkbenchPart;~QITextSelection;~QStructuredViewer;" kind1="0" name="resolveSelection" parameter1="IWorkbenchPart part 0 IEditorPart part false" parameter2="ITextSelection selection 1 ITextSelection selection false" parameter3="StructuredViewer viewer 2 StructuredViewer viewer false" stamp="1165281057017" version="1.0"/>
+<refactoring comment="Extract method 'private void select(StructuredViewer viewer,Object toSelect)' from 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.selectionChanged()' to 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'select' - Destination type: 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction' - Declared visibility: 'private'" comments="false" description="Extract method 'select'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java" name="select" replace="false" selection="6896 61" stamp="1165281185939" version="1.0" visibility="2"/>
+
+
+<refactoring comment="Change method 'protected Object org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.resolveSelection(IEditorPart part, ITextSelection selection, StructuredViewer viewer) throws CoreException' to 'protected ISelection resolveSelection(IEditorPart part, ITextSelection selection, StructuredViewer viewer) throws CoreException' - Original project: 'org.eclipse.mylar.context.ui' - New return type: 'ISelection'" delegate="false" deprecate="true" description="Change method 'resolveSelection'" element1="/C:\/Apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java[AbstractFocusViewAction~resolveSelection~QIEditorPart;~QITextSelection;~QStructuredViewer;" kind1="0" name="resolveSelection" parameter1="IEditorPart part 0 IEditorPart part false" parameter2="ITextSelection selection 1 ITextSelection selection false" parameter3="StructuredViewer viewer 2 StructuredViewer viewer false" return="ISelection" stamp="1165281253157" version="1.0"/>
+<refactoring comment="Change method 'protected void org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.select(StructuredViewer viewer, ISelection toSelect)' to 'protected void select(StructuredViewer viewer, ISelection toSelect)' - Original project: 'org.eclipse.mylar.context.ui' - Changed parameters: Object toSelect" delegate="false" deprecate="true" description="Change method 'select'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java[AbstractFocusViewAction~select~QStructuredViewer;~QObject;" name="select" parameter1="StructuredViewer viewer 0 StructuredViewer viewer false" parameter2="Object toSelect 1 ISelection toSelect false" stamp="1165281409126" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.ContextViewerManager' to 'FocusedViewerManager' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.ContextViewerManager' - Renamed element: 'org.eclipse.mylar.internal.context.ui.FocusedViewerManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextViewerManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui{ContextViewerManager.java[ContextViewerManager" matchStrategy="1" name="FocusedViewerManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165282637782" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.CopyContextToAction' to 'ContextCopyAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.CopyContextToAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.ContextCopyAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'CopyContextToAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{CopyContextToAction.java[CopyContextToAction" matchStrategy="1" name="ContextCopyAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165451494250" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..68dfadb
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,12 @@
+1165277250782 Rename type 'AbstractApplyMylarAction'
+1165277263079 Rename type 'AbstractAutoApplyMylarAction'
+1165277434642 Rename type 'ApplyMylarToTaskListAction'
+1165277443782 Rename type 'ApplyMylarToOutlineAction'
+1165279361876 Change method 'resolveSelection'
+1165279616673 Change method 'resolveSelection'
+1165281057017 Change method 'resolveSelection'
+1165281185939 Extract method 'select'
+1165281253157 Change method 'resolveSelection'
+1165281409126 Change method 'select'
+1165282637782 Rename type 'ContextViewerManager'
+1165451494250 Rename type 'CopyContextToAction'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..70b720b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename package 'org.eclipse.mylar.ui' to 'org.eclipse.mylar.provisional.ui'" flags="65542" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.ui" name="org.eclipse.mylar.provisional.ui" project="org.eclipse.mylar.ui" qualified="false" references="true" stamp="1140464845367" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..11e0cf5
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1 @@
+1140464845367 Rename package 'org.eclipse.mylar.ui' to 'org.eclipse.mylar.provisional.ui'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/3/10/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/10/refactorings.history
new file mode 100644
index 0000000..9edf6fa
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/10/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ui.MylarViewerManager.displose()' to 'dispose'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{MylarViewerManager.java[MylarViewerManager~displose" name="dispose" project="org.eclipse.mylar.ui" references="true" stamp="1141758413189"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ui.BrowseFilteredListener.mouseInteractionAccepted(...)' to 'isUnfilterMouseEvent'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{BrowseFilteredListener.java[BrowseFilteredListener~mouseInteractionAccepted~QMouseEvent;" name="isUnfilterMouseEvent" project="org.eclipse.mylar.ui" references="true" stamp="1141769650671"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ui.BrowseFilteredListener.isUnfilterMouseEvent(...)' to 'isUnfilterEvent'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{BrowseFilteredListener.java[BrowseFilteredListener~isUnfilterMouseEvent~QMouseEvent;" name="isUnfilterEvent" project="org.eclipse.mylar.ui" references="true" stamp="1141769658382"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ui.BrowseFilteredListener.keyboardInteractionAccepted(...)' to 'isUnfilterEvent'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{BrowseFilteredListener.java[BrowseFilteredListener~keyboardInteractionAccepted~QKeyEvent;" name="isUnfilterEvent" project="org.eclipse.mylar.ui" references="true" stamp="1141769666153"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/3/10/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/10/refactorings.index
new file mode 100644
index 0000000..18a6712
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/10/refactorings.index
@@ -0,0 +1,4 @@
+1141758413189 Rename method 'org.eclipse.mylar.internal.ui.MylarViewerManager.displose()' to 'dispose'
+1141769650671 Rename method 'org.eclipse.mylar.internal.ui.BrowseFilteredListener.mouseInteractionAccepted(...)' to 'isUnfilterMouseEvent'
+1141769658382 Rename method 'org.eclipse.mylar.internal.ui.BrowseFilteredListener.isUnfilterMouseEvent(...)' to 'isUnfilterEvent'
+1141769666153 Rename method 'org.eclipse.mylar.internal.ui.BrowseFilteredListener.keyboardInteractionAccepted(...)' to 'isUnfilterEvent'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/3/11/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/11/refactorings.history
new file mode 100644
index 0000000..7cc1ef1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/11/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.ui.actions.AbstractInterestManipulationAction.NO_CONTEXT_MESSAGE' from expression '"No task context is active, or element not found in context"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui.actions{AbstractInterestManipulationAction.java" name="NO_CONTEXT_MESSAGE" project="org.eclipse.mylar.ui" qualify="false" replace="true" selection="3100 60" stamp="1142291022438" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.ui.actions.AbstractInterestManipulationAction.NO_CONTEXT_MESSAGE' to 'MESSAGE_NO_CONTEXT'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui.actions{AbstractInterestManipulationAction.java[AbstractInterestManipulationAction^NO_CONTEXT_MESSAGE" name="MESSAGE_NO_CONTEXT" project="org.eclipse.mylar.ui" references="true" setter="false" stamp="1142291033494" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.ui.ColorMap.WHITE' to 'DEFAULT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{ColorMap.java[ColorMap^WHITE" name="DEFAULT" project="org.eclipse.mylar.ui" references="true" setter="false" stamp="1142441335515" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.ui.Highlighter.VAL_DEFAULT' from expression '""'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{Highlighter.java" name="VAL_DEFAULT" project="org.eclipse.mylar.ui" qualify="false" replace="true" selection="7308 2" stamp="1142442523353" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/3/11/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/11/refactorings.index
new file mode 100644
index 0000000..31ea0a8
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/11/refactorings.index
@@ -0,0 +1,4 @@
+1142291022438 Extract constant 'org.eclipse.mylar.internal.ui.actions.AbstractInterestManipulationAction.NO_CONTEXT_MESSAGE' from expression '"No task context is active, or element not found in context"'
+1142291033494 Rename field 'org.eclipse.mylar.internal.ui.actions.AbstractInterestManipulationAction.NO_CONTEXT_MESSAGE' to 'MESSAGE_NO_CONTEXT'
+1142441335515 Rename field 'org.eclipse.mylar.internal.ui.ColorMap.WHITE' to 'DEFAULT'
+1142442523353 Extract constant 'org.eclipse.mylar.internal.ui.Highlighter.VAL_DEFAULT' from expression '""'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..bdb846d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.ui/icons/eview16/mylar-overlay.gif' to 'overlay-mylar.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.ui/icons/eview16/mylar-overlay.gif" name="overlay-mylar.gif" project="org.eclipse.mylar.ui" stamp="1141329647480"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.ui.actions.ClearContextAction' to 'ContextClearAction'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui.actions{ClearContextAction.java[ClearContextAction" matchStrategy="1" name="ContextClearAction" project="org.eclipse.mylar.ui" qualified="false" references="true" similarDeclarations="false" stamp="1141427432145" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.ui.Highlighter.black' to 'COLOR_BLACK'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{Highlighter.java[Highlighter^black" name="COLOR_BLACK" project="org.eclipse.mylar.ui" references="true" setter="false" stamp="1141434854048" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.ui.Highlighter.base' to 'COLOR_WHITE'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{Highlighter.java[Highlighter^base" name="COLOR_WHITE" project="org.eclipse.mylar.ui" references="true" setter="false" stamp="1141434860967" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.ui.Highlighter.ELEVATIONS' to 'gradients'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.internal.ui{Highlighter.java[Highlighter^ELEVATIONS" name="gradients" project="org.eclipse.mylar.ui" references="true" setter="false" stamp="1141435514177" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.ui.InterestFilter.matchesExclusion(...)' to 'isImplicitlyInteresting'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ui/src<org.eclipse.mylar.provisional.ui{InterestFilter.java[InterestFilter~matchesExclusion~QObject;~QIMylarStructureBridge;" name="isImplicitlyInteresting" project="org.eclipse.mylar.ui" references="true" stamp="1141441239780"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..b8543e1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1,6 @@
+1141329647480 Rename resource '/org.eclipse.mylar.ui/icons/eview16/mylar-overlay.gif' to 'overlay-mylar.gif'
+1141427432145 Rename type 'org.eclipse.mylar.internal.ui.actions.ClearContextAction' to 'ContextClearAction'
+1141434854048 Rename field 'org.eclipse.mylar.internal.ui.Highlighter.black' to 'COLOR_BLACK'
+1141434860967 Rename field 'org.eclipse.mylar.internal.ui.Highlighter.base' to 'COLOR_WHITE'
+1141435514177 Rename field 'org.eclipse.mylar.internal.ui.Highlighter.ELEVATIONS' to 'gradients'
+1141441239780 Rename method 'org.eclipse.mylar.provisional.ui.InterestFilter.matchesExclusion(...)' to 'isImplicitlyInteresting'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..6aad6da
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comments="false" description="Extract method 'private boolean isTemporarilyUnfiltered(Object parent)' from 'org.eclipse.mylar.provisional.ui.InterestFilter.select()' to 'org.eclipse.mylar.provisional.ui.InterestFilter'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/provisional/ui/InterestFilter.java" name="isTemporarilyUnfiltered" replace="true" selection="2343 69" stamp="1144300719297" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..95a180e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1 @@
+1144300719297 Extract method 'private boolean isTemporarilyUnfiltered(Object parent)' from 'org.eclipse.mylar.provisional.ui.InterestFilter.select()' to 'org.eclipse.mylar.provisional.ui.InterestFilter'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/4/16/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/16/refactorings.history
new file mode 100644
index 0000000..a4f55cb
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/16/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Change method 'public List<ViewerFilter> org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getExcludedFilters()' to 'public List<Class> getExcludedFilters()'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.ui.actions{AbstractApplyMylarAction.java[AbstractApplyMylarAction~getExcludedFilters" name="getExcludedFilters" return="List<Class>" stamp="1145500112812" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getExcludedFilters()' to 'getPreservedFilters'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ui.actions{AbstractApplyMylarAction.java[AbstractApplyMylarAction~getExcludedFilters" name="getPreservedFilters" references="true" stamp="1145500205175" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/4/16/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/16/refactorings.index
new file mode 100644
index 0000000..6a09912
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1145500112812 Change method 'public List<ViewerFilter> org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getExcludedFilters()' to 'public List<Class> getExcludedFilters()'
+1145500205175 Rename method 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getExcludedFilters()' to 'getPreservedFilters'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/4/17/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/17/refactorings.history
new file mode 100644
index 0000000..7e31251
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/17/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ui.TaskListInterestFilter.isImplicitlyInteresting(...)' to 'isInteresting' - Original element: 'org.eclipse.mylar.internal.ui.TaskListInterestFilter.isImplicitlyInteresting(...)' - Renamed element: 'org.eclipse.mylar.internal.ui.TaskListInterestFilter.isInteresting(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'isImplicitlyInteresting'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestFilter.java[TaskListInterestFilter~isImplicitlyInteresting~QITask;" name="isInteresting" references="true" stamp="1146255224046" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/4/17/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/17/refactorings.index
new file mode 100644
index 0000000..a1d9338
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/4/17/refactorings.index
@@ -0,0 +1 @@
+1146255224046 Rename method 'isImplicitlyInteresting'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..c272d46
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ui.ScrollingInteractionMonitor' to 'ResourceInteractionMonitor' - Original element: 'org.eclipse.mylar.internal.ui.ScrollingInteractionMonitor' - Renamed element: 'org.eclipse.mylar.internal.ui.ResourceInteractionMonitor' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'ScrollingInteractionMonitor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ui{ScrollingInteractionMonitor.java[ScrollingInteractionMonitor" matchStrategy="1" name="ResourceInteractionMonitor" qualified="false" references="true" similarDeclarations="true" stamp="1148002361036" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private int comparePriorities(ITaskListElement element1,ITaskListElement element2)' from 'org.eclipse.mylar.internal.ui.TaskListInterestSorter.compare()' to 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Method name: 'comparePriorities' - Destination type: 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Declared visibility: 'private'" comments="false" description="Extract method 'comparePriorities'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestSorter.java" name="comparePriorities" replace="false" selection="3422 56" stamp="1148063045533" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private int compareKeys(ITask task1,ITask task2)' from 'org.eclipse.mylar.internal.ui.TaskListInterestSorter.compare()' to 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Method name: 'compareKeys' - Destination type: 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Declared visibility: 'private'" comments="false" description="Extract method 'compareKeys'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestSorter.java" name="compareKeys" replace="false" selection="3541 73" stamp="1148063069788" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..986d6e2
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1,3 @@
+1148002361036 Rename type 'ScrollingInteractionMonitor'
+1148063069788 Extract method 'compareKeys'
+1148063045533 Extract method 'comparePriorities'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/5/21/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/21/refactorings.history
new file mode 100644
index 0000000..b7880e1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/21/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getPrefId()' to 'getGlobalPrefId' - Original element: 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getPrefId()' - Renamed element: 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.getGlobalPrefId()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getPrefId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ui.actions{AbstractApplyMylarAction.java[AbstractApplyMylarAction~getPrefId" name="getGlobalPrefId" references="true" stamp="1148606454028" version="1.0"/>
+<refactoring comment="Rename field 'prefId' in 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction' to 'globalPrefId' - Original element: 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.prefId' - Renamed element: 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.globalPrefId' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'prefId'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.ui.actions{AbstractApplyMylarAction.java[AbstractApplyMylarAction^prefId" name="globalPrefId" references="true" setter="false" stamp="1148606466666" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/5/21/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/21/refactorings.index
new file mode 100644
index 0000000..df70d5d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1148606454028 Rename method 'getPrefId'
+1148606466666 Rename field 'prefId'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/6/22/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/22/refactorings.history
new file mode 100644
index 0000000..f4bc45d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/22/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void compareCompleted(ITask task1,ITask task2)' from 'org.eclipse.mylar.internal.ui.TaskListInterestSorter.compare()' to 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Method name: 'compareCompleted' - Destination type: 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Declared visibility: 'private'" comments="false" description="Extract method 'compareCompleted'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestSorter.java" name="compareCompleted" replace="false" selection="2978 267" stamp="1149196472005" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void compareIsThisWeek(ITask task1,ITask task2)' from 'org.eclipse.mylar.internal.ui.TaskListInterestSorter.compare()' to 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Method name: 'compareIsThisWeek' - Destination type: 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Declared visibility: 'private'" comments="false" description="Extract method 'compareIsThisWeek'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestSorter.java" name="compareIsThisWeek" replace="false" selection="3017 575" stamp="1149196493526" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void compareToday(ITask task1,ITask task2)' from 'org.eclipse.mylar.internal.ui.TaskListInterestSorter.compare()' to 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Method name: 'compareToday' - Destination type: 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Declared visibility: 'private'" comments="false" description="Extract method 'compareToday'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestSorter.java" name="compareToday" replace="false" selection="3063 532" stamp="1149196512583" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void compareOverdue(ITask task1,ITask task2)' from 'org.eclipse.mylar.internal.ui.TaskListInterestSorter.compare()' to 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Method name: 'compareOverdue' - Destination type: 'org.eclipse.mylar.internal.ui.TaskListInterestSorter' - Declared visibility: 'private'" comments="false" description="Extract method 'compareOverdue'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ui{TaskListInterestSorter.java" name="compareOverdue" replace="false" selection="3107 285" stamp="1149196527415" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.installInterestFilter(...)' to 'updateInterestFilter' - Original element: 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.installInterestFilter(...)' - Renamed element: 'org.eclipse.mylar.internal.ui.actions.AbstractApplyMylarAction.updateInterestFilter(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'installInterestFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ui.actions{AbstractApplyMylarAction.java[AbstractApplyMylarAction~installInterestFilter~Z~QStructuredViewer;" name="updateInterestFilter" references="true" stamp="1149280496262" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/6/22/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/22/refactorings.index
new file mode 100644
index 0000000..8ad34cf
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/22/refactorings.index
@@ -0,0 +1,5 @@
+1149196472005 Extract method 'compareCompleted'
+1149280496262 Rename method 'installInterestFilter'
+1149196527415 Extract method 'compareOverdue'
+1149196512583 Extract method 'compareToday'
+1149196493526 Extract method 'compareIsThisWeek'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..1b424ca
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ui.preferences.MylarPreferencePage.createInclusionTable(...)' to 'createResourceExclusionTable' - Original element: 'org.eclipse.mylar.internal.ui.preferences.MylarPreferencePage.createInclusionTable(...)' - Renamed element: 'org.eclipse.mylar.internal.ui.preferences.MylarPreferencePage.createResourceExclusionTable(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createInclusionTable'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ui.preferences{MylarPreferencePage.java[MylarPreferencePage~createInclusionTable~QComposite;" name="createResourceExclusionTable" references="true" stamp="1150151246189" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..0b8339b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1 @@
+1150151246189 Rename method 'createInclusionTable'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/6/26/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/26/refactorings.history
new file mode 100644
index 0000000..3a84ba5
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ui.preferences.MylarPreferencePage.createEditorsSection(...)' to 'createUiManagementSection' - Original element: 'org.eclipse.mylar.internal.ui.preferences.MylarPreferencePage.createEditorsSection(...)' - Renamed element: 'org.eclipse.mylar.internal.ui.preferences.MylarPreferencePage.createUiManagementSection(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createEditorsSection'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ui.preferences{MylarPreferencePage.java[MylarPreferencePage~createEditorsSection~QComposite;" name="createUiManagementSection" references="true" stamp="1151555234278" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/6/26/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/26/refactorings.index
new file mode 100644
index 0000000..3de1a1b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/6/26/refactorings.index
@@ -0,0 +1 @@
+1151555234278 Rename method 'createEditorsSection'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..3406c6c
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'bridge' in 'org.eclipse.mylar.internal.ui.actions.ToggleRelationshipProviderAction' to 'structureBridge' - Original element: 'org.eclipse.mylar.internal.ui.actions.ToggleRelationshipProviderAction.bridge' - Renamed element: 'org.eclipse.mylar.internal.ui.actions.ToggleRelationshipProviderAction.structureBridge' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'bridge'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.ui.actions{ToggleRelationshipProviderAction.java[ToggleRelationshipProviderAction^bridge" name="structureBridge" references="true" setter="false" stamp="1152751263296" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.provisional.ui' to 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.ui/src/org.eclipse.mylar.provisional.ui' - Renamed element: 'org.eclipse.mylar.ui/src/org.eclipse.mylar.context.ui' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.provisional.ui'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.provisional.ui" name="org.eclipse.mylar.context.ui" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152774182843" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.ui' to 'org.eclipse.mylar.internal.context.ui' - Original element: 'org.eclipse.mylar.ui/src/org.eclipse.mylar.internal.ui' - Renamed element: 'org.eclipse.mylar.ui/src/org.eclipse.mylar.internal.context.ui' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.ui'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.ui" name="org.eclipse.mylar.internal.context.ui" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152774222562" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.context.ui.MylarUiPlugin.addWorkingSetUpdater(...)' to 'addWorkingSetManager' - Original element: 'org.eclipse.mylar.context.ui.MylarUiPlugin.addWorkingSetUpdater(...)' - Renamed element: 'org.eclipse.mylar.context.ui.MylarUiPlugin.addWorkingSetManager(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'addWorkingSetUpdater'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.context.ui{MylarUiPlugin.java[MylarUiPlugin~addWorkingSetUpdater~QMylarWorkingSetManager;" name="addWorkingSetManager" references="true" stamp="1152832007171" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.context.ui/schema/context.exsd' to 'bridges.exsd' - Original element: 'context.exsd'" description="Rename resource 'context.exsd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="schema/context.exsd" name="bridges.exsd" stamp="1152841247953" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.context.ui.MylarUiPlugin' to 'ContextUiPlugin' - Original element: 'org.eclipse.mylar.context.ui.MylarUiPlugin' - Renamed element: 'org.eclipse.mylar.context.ui.ContextUiPlugin' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarUiPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.context.ui{MylarUiPlugin.java[MylarUiPlugin" matchStrategy="1" name="ContextUiPlugin" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152842517859" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.MylarUiPrefContstants' to 'ContextUiPrefContstants' - Original element: 'org.eclipse.mylar.internal.context.ui.MylarUiPrefContstants' - Renamed element: 'org.eclipse.mylar.internal.context.ui.ContextUiPrefContstants' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarUiPrefContstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui{MylarUiPrefContstants.java[MylarUiPrefContstants" matchStrategy="1" name="ContextUiPrefContstants" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152844372015" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..93f490f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,7 @@
+1152751263296 Rename field 'bridge'
+1152844372015 Rename type 'MylarUiPrefContstants'
+1152842517859 Rename type 'MylarUiPlugin'
+1152841247953 Rename resource 'context.exsd'
+1152832007171 Rename method 'addWorkingSetUpdater'
+1152774222562 Rename package 'org.eclipse.mylar.internal.ui'
+1152774182843 Rename package 'org.eclipse.mylar.provisional.ui'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..6e20015
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Convert member type 'org.eclipse.mylar.internal.context.ui.ActiveSearchView.DoiOrderSorter' in 'org.eclipse.mylar.internal.context.ui.ActiveSearchView' to top level type - Original element: 'org.eclipse.mylar.internal.context.ui.ActiveSearchView.DoiOrderSorter' - Field name: 'view' - Declare field 'final'" description="Convert member type 'DoiOrderSorter' to top level" field="false" fieldName="view" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.internal.context.ui{ActiveSearchView.java[ActiveSearchView[DoiOrderSorter" mandatory="false" possible="false" stamp="1153047640250" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.MylarImages' to 'ContextUiImages' - Original element: 'org.eclipse.mylar.internal.context.ui.MylarImages' - Renamed element: 'org.eclipse.mylar.internal.context.ui.ContextUiImages' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarImages'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui{MylarImages.java[MylarImages" matchStrategy="1" name="ContextUiImages" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153120083625" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..5d5b900
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,2 @@
+1153047640250 Convert member type 'DoiOrderSorter' to top level
+1153120083625 Rename type 'MylarImages'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..4c57657
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.preferences.MylarPreferencePage' to 'ContextUiPreferencePage' - Original element: 'org.eclipse.mylar.internal.context.ui.preferences.MylarPreferencePage' - Renamed element: 'org.eclipse.mylar.internal.context.ui.preferences.ContextUiPreferencePage' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.preferences{MylarPreferencePage.java[MylarPreferencePage" matchStrategy="1" name="ContextUiPreferencePage" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154215437941" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..b1fbe5f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1 @@
+1154215437941 Rename type 'MylarPreferencePage'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..f4b5931
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'filterTreeRefresh' in 'org.eclipse.mylar.internal.context.ui.views.NavigatorFilterBar' to 'refreshPolicy' - Original element: 'org.eclipse.mylar.internal.context.ui.views.NavigatorFilterBar.filterTreeRefresh' - Renamed element: 'org.eclipse.mylar.internal.context.ui.views.NavigatorFilterBar.refreshPolicy' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'filterTreeRefresh'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.ui.views{NavigatorFilterBar.java[NavigatorFilterBar^filterTreeRefresh" name="refreshPolicy" references="true" setter="false" stamp="1154623256218" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.MylarViewerManager' to 'ContextViewerManager' - Original element: 'org.eclipse.mylar.internal.context.ui.MylarViewerManager' - Renamed element: 'org.eclipse.mylar.internal.context.ui.ContextViewerManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarViewerManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui{MylarViewerManager.java[MylarViewerManager" matchStrategy="1" name="ContextViewerManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154623779531" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..4de8c58
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1,2 @@
+1154623256218 Rename field 'filterTreeRefresh'
+1154623779531 Rename type 'MylarViewerManager'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/8/33/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/33/refactorings.history
new file mode 100644
index 0000000..e194d86
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/33/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.ToggleContextCaptureAction' to 'ContextCapturePauseAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.ToggleContextCaptureAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.ContextCapturePauseAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ToggleContextCaptureAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{ToggleContextCaptureAction.java[ToggleContextCaptureAction" matchStrategy="1" name="ContextCapturePauseAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1155960417453" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/8/33/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/33/refactorings.index
new file mode 100644
index 0000000..a4b0933
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/8/33/refactorings.index
@@ -0,0 +1 @@
+1155960417453 Rename type 'ToggleContextCaptureAction'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..5570f46
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.preferences.ContextUiPreferencePage.createTable(...)' to 'createHighlightersTable' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.preferences.ContextUiPreferencePage.createTable(...)' - Renamed element: 'org.eclipse.mylar.internal.context.ui.preferences.ContextUiPreferencePage.createHighlightersTable(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createTable'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui.preferences{ContextUiPreferencePage.java[ContextUiPreferencePage~createTable~QComposite;" name="createHighlightersTable" references="true" stamp="1158729289440" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..448aeaf
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1 @@
+1158729289440 Rename method 'createTable'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/1/1/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/1/1/refactorings.history
new file mode 100644
index 0000000..0b9384f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/1/1/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void run()' from 'org.eclipse.mylar.internal.context.ui.actions.ContextRetrieveAction.run()' to 'org.eclipse.mylar.internal.context.ui.actions.ContextRetrieveAction' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'run' - Destination type: 'org.eclipse.mylar.internal.context.ui.actions.ContextRetrieveAction' - Declared visibility: 'private'" comments="false" description="Extract method 'run'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.actions{ContextRetrieveAction.java" name="run" replace="false" selection="1864 467" stamp="1168013157683" version="1.0" visibility="2"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.ui' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.NavigatorPatternFilter.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.context.ui.views{NavigatorPatternFilter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1168043720551" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.views.NavigatorFilterBar' to 'CommonNavigatorFilterBar' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.NavigatorFilterBar' - Renamed element: 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'NavigatorFilterBar'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.views{NavigatorFilterBar.java[NavigatorFilterBar" matchStrategy="1" name="CommonNavigatorFilterBar" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1168046277832" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar.ResourcePatternFilter' to 'CommonNavigatorPatternFilter' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar.ResourcePatternFilter' - Renamed element: 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar.CommonNavigatorPatternFilter' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'ResourcePatternFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.views{CommonNavigatorFilterBar.java[CommonNavigatorFilterBar[ResourcePatternFilter" matchStrategy="1" name="CommonNavigatorPatternFilter" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1168046301459" textual="true" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar.CommonNavigatorPatternFilter' in 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar' to top level type - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.CommonNavigatorFilterBar.CommonNavigatorPatternFilter' - Field name: 'commonNavigatorFilterBar' - Declare field 'final'" description="Convert member type 'CommonNavigatorPatternFilter' to top level" field="false" fieldName="commonNavigatorFilterBar" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.internal.context.ui.views{CommonNavigatorFilterBar.java[CommonNavigatorFilterBar[CommonNavigatorPatternFilter" mandatory="false" possible="false" stamp="1168046308215" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/1/1/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/1/1/refactorings.index
new file mode 100644
index 0000000..9dc4e7f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/1/1/refactorings.index
@@ -0,0 +1,5 @@
+1168013157683 Extract method 'run'
+1168043720551 Delete element
+1168046277832 Rename type 'NavigatorFilterBar'
+1168046301459 Rename type 'ResourcePatternFilter'
+1168046308215 Convert member type 'CommonNavigatorPatternFilter' to top level
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/10/41/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/41/refactorings.history
new file mode 100644
index 0000000..11676a4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/41/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private IPerspectiveDescriptor getActivePerspective()' from 'org.eclipse.mylyn.internal.context.ui.ContextPerspectiveManager.taskActivated()' to 'org.eclipse.mylyn.internal.context.ui.ContextPerspectiveManager'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'getActivePerspective'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextPerspectiveManager'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'getActivePerspective'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui{ContextPerspectiveManager.java" name="getActivePerspective" replace="true" selection="2043 143" stamp="1192061895445" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.ContextPerspectiveManager.getActivePerspective()' to 'getPerspectiveToRestore'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextPerspectiveManager.getActivePerspective()'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextPerspectiveManager.getPerspectiveToRestore()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getActivePerspective'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{ContextPerspectiveManager.java[ContextPerspectiveManager~getActivePerspective" name="getPerspectiveToRestore" references="true" stamp="1192061917820" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage.SCALE_STEPS' from expression '12'
- Original project: 'org.eclipse.mylyn.context.ui'
- Constant name: 'SCALE_STEPS'
- Constant expression: '12'
- Declared visibility: 'private'" description="Extract constant 'SCALE_STEPS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.context.ui.editors{ContextEditorFormPage.java" name="SCALE_STEPS" qualify="false" replace="false" selection="6456 2" stamp="1192068785103" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/10/41/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/41/refactorings.index
new file mode 100644
index 0000000..ad3d0d4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/41/refactorings.index
@@ -0,0 +1,3 @@
+1192061895445 Extract method 'getActivePerspective'
+1192061917820 Rename method 'getActivePerspective'
+1192068785103 Extract constant 'SCALE_STEPS'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/10/44/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/44/refactorings.history
new file mode 100644
index 0000000..01923f7
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/44/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ActiveSearchViewTracker.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.context.ui{ActiveSearchViewTracker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1193617161223" units="1" version="1.0"/>
<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.context.ui.ContextUiPlugin.start().new ITaskActivityListener() {...}' in 'org.eclipse.mylyn.context.ui.ContextUiPlugin.start()' to nested class
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUiPlugin.start().new ITaskActivityListener() {...}'
- Class name: 'LAZY_STARTUP_LISTENER'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.context.ui{ContextUiPlugin.java" name="LAZY_STARTUP_LISTENER" selection="8284 0" stamp="1193618057255" static="false" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener.lazyStart()' to 'lazyStartOnTaskActivation'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener.lazyStart()'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener.lazyStartOnTaskActivation()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'lazyStart'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{AbstractLazyContextUiStartupListener.java[AbstractLazyContextUiStartupListener~lazyStart" name="lazyStartOnTaskActivation" references="true" stamp="1193620846583" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener.register()' to 'init'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener.register()'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener.init()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'register'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{AbstractLazyContextUiStartupListener.java[AbstractLazyContextUiStartupListener~register" name="init" references="true" stamp="1193621004535" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.context.ui.ContextUiPlugin.LazyStartup' to 'LazyContextUiStart'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUiPlugin.LazyStartup'
- Renamed element: 'org.eclipse.mylyn.context.ui.ContextUiPlugin.LazyContextUiStart'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'LazyStartup'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.ui{ContextUiPlugin.java[ContextUiPlugin[LazyStartup" matchStrategy="1" name="LazyContextUiStart" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1193621057356" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener' to 'AbstractContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.AbstractLazyContextUiStartupListener'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'AbstractLazyContextUiStartupListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui{AbstractLazyContextUiStartupListener.java[AbstractLazyContextUiStartupListener" matchStrategy="1" name="AbstractContextUiPlugin" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1193621876161" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/10/44/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/44/refactorings.index
new file mode 100644
index 0000000..5c55855
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/10/44/refactorings.index
@@ -0,0 +1,6 @@
+1193617161223 Move compilation unit
+1193618057255 Convert anonymous class to nested
+1193620846583 Rename method 'lazyStart'
+1193621004535 Rename method 'register'
+1193621057356 Rename type 'LazyStartup'
+1193621876161 Rename type 'AbstractLazyContextUiStartupListener'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/11/45/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/45/refactorings.history
new file mode 100644
index 0000000..fbaa48d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/45/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.sandbox.dev/src/org.eclipse.mylyn.internal.sandbox.dev'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.dev/src/org.eclipse.mylyn.internal.sandbox.dev'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.InterestDecrementAction.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.sandbox.dev/src<org.eclipse.mylyn.internal.sandbox.dev" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{InterestDecrementAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1194390523838" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/11/45/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/45/refactorings.index
new file mode 100644
index 0000000..d4bdbd1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/45/refactorings.index
@@ -0,0 +1 @@
+1194390523838 Copy compilation unit
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/11/46/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/46/refactorings.history
new file mode 100644
index 0000000..0289040
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void isNotVisible(AbstractTask task)' from 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter.select()' to 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'isNotVisible'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'isNotVisible'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestFilter.java" name="isNotVisible" replace="true" selection="2127 279" stamp="1195269274997" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/11/46/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/46/refactorings.index
new file mode 100644
index 0000000..80a4862
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/11/46/refactorings.index
@@ -0,0 +1 @@
+1195269274997 Extract method 'isNotVisible'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/12/49/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/49/refactorings.history
new file mode 100644
index 0000000..a0999d8
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/49/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void initLazyStart()' from 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin.contextActivated()' to 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'initLazyStart'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin'
- Declared visibility: 'private'" comments="false" description="Extract method 'initLazyStart'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui{AbstractContextUiPlugin.java" name="initLazyStart" replace="false" selection="2335 464" stamp="1196989692446" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'lazyStartComplete' in 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin' to 'lazyStarted'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin.lazyStartComplete'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin.lazyStarted'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'lazyStartComplete'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{AbstractContextUiPlugin.java[AbstractContextUiPlugin^lazyStartComplete" name="lazyStarted" references="true" setter="true" stamp="1196989855145" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/12/49/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/49/refactorings.index
new file mode 100644
index 0000000..47b7160
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/49/refactorings.index
@@ -0,0 +1,2 @@
+1196989692446 Extract method 'initLazyStart'
+1196989855145 Rename field 'lazyStartComplete'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/12/50/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/50/refactorings.history
new file mode 100644
index 0000000..40b28ec
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter.MAX_SUBTASK_DEPTH' from expression '10'
- Original project: 'org.eclipse.mylyn.context.ui'
- Constant name: 'MAX_SUBTASK_DEPTH'
- Constant expression: '10'
- Declared visibility: 'private'" description="Extract constant 'MAX_SUBTASK_DEPTH'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestFilter.java" name="MAX_SUBTASK_DEPTH" qualify="false" replace="false" selection="5089 2" stamp="1197477772828" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/12/50/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/50/refactorings.index
new file mode 100644
index 0000000..407d852
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/12/50/refactorings.index
@@ -0,0 +1 @@
+1197477772828 Extract constant 'MAX_SUBTASK_DEPTH'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..762d231
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.context.ui.editors.ContextPreviewEdtiorFactory.LABEL' from expression '"Context"' - Original project: 'org.eclipse.mylar.context.ui' - Constant name: 'LABEL' - Constant expression: '"Context"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextPreviewEdtiorFactory.java" name="LABEL" qualify="false" replace="true" selection="1564 9" stamp="1171551860080" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.editors.ContextPreviewEdtiorFactory' to 'ContextEdtiorFactory' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.editors.ContextPreviewEdtiorFactory' - Renamed element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEdtiorFactory' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextPreviewEdtiorFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextPreviewEdtiorFactory.java[ContextPreviewEdtiorFactory" matchStrategy="1" name="ContextEdtiorFactory" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1171552019574" textual="true" version="1.0"/>
+<refactoring comment="Extract method 'private void fillBody()' from 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.createFormContent()' to 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'fillBody' - Destination type: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage' - Declared visibility: 'private'" comments="false" description="Extract method 'fillBody'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java" name="fillBody" replace="false" selection="1935 91" stamp="1171582413795" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.ID_VIEWER' from expression '"org.eclipse.mylar.context.ui.navigator.context"' - Original project: 'org.eclipse.mylar.context.ui' - Constant name: 'ID_VIEWER' - Constant expression: '"org.eclipse.mylar.context.ui.navigator.context"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ID_VIEWER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java" name="ID_VIEWER" qualify="false" replace="true" selection="6182 48" stamp="1171597016437" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.makeActions()' to 'makeContextMenuActions' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.makeActions()' - Renamed element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.makeContextMenuActions()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'makeActions'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java[ContextEditorFormPage~makeActions" name="makeContextMenuActions" references="true" stamp="1171604125357" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.DeleteFromContextAction' to 'RemoveFromContextAction' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.DeleteFromContextAction' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'DeleteFromContextAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{DeleteFromContextAction.java[DeleteFromContextAction" matchStrategy="1" name="RemoveFromContextAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1171604155386" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.LABEL' from expression '"Task Context"' - Original project: 'org.eclipse.mylar.context.ui' - Constant name: 'LABEL' - Constant expression: '"Task Context"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java" name="LABEL" qualify="false" replace="true" selection="4174 14" stamp="1171604557195" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private boolean isInteresting(IMylarElement element)' from 'org.eclipse.mylar.context.ui.InterestFilter.select()' to 'org.eclipse.mylar.context.ui.InterestFilter' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'isInteresting' - Destination type: 'org.eclipse.mylar.context.ui.InterestFilter' - Declared visibility: 'private'" comments="false" description="Extract method 'isInteresting'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.context.ui{InterestFilter.java" name="isInteresting" replace="false" selection="3260 189" stamp="1171604905629" version="1.0" visibility="2"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.ui' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorInterestDecorator.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorInterestDecorator.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1171605562178" subPackages="false" version="1.0"/>
+<refactoring comment="Extract method 'private void resolveElement(Set<IMylarElement> toRemove,Object object)' from 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction.run()' to 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'resolveElement' - Destination type: 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction' - Declared visibility: 'private'" comments="false" description="Extract method 'resolveElement'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.actions{RemoveFromContextAction.java" name="resolveElement" replace="false" selection="1832 884" stamp="1171605990221" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void collectChildren(Set<IMylarElement> toRemove,Object object)' from 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction.run()' to 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'collectChildren' - Destination type: 'org.eclipse.mylar.internal.context.ui.actions.RemoveFromContextAction' - Declared visibility: 'private'" comments="false" description="Extract method 'collectChildren'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.actions{RemoveFromContextAction.java" name="collectChildren" replace="false" selection="2089 430" stamp="1171606856195" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.createControlsSection(...)' to 'createActionsSection' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.createControlsSection(...)' - Renamed element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.createActionsSection(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createControlsSection'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java[ContextEditorFormPage~createControlsSection~QComposite;" name="createActionsSection" references="true" stamp="1171607960676" version="1.0"/>
+<refactoring comment="Extract method 'private void run()' from 'org.eclipse.mylar.internal.context.ui.actions.ContextAttachAction.run()' to 'org.eclipse.mylar.internal.context.ui.actions.ContextAttachAction' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'run' - Destination type: 'org.eclipse.mylar.internal.context.ui.actions.ContextAttachAction' - Declared visibility: 'private'" comments="false" description="Extract method 'run'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.actions{ContextAttachAction.java" name="run" replace="false" selection="2113 742" stamp="1171611153073" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.editors.ContextEdtiorFactory' to 'ContextEditorFactory' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEdtiorFactory' - Renamed element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFactory' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextEdtiorFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEdtiorFactory.java[ContextEdtiorFactory" matchStrategy="1" name="ContextEditorFactory" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1171648043535" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..e2a9d40
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1,14 @@
+1171551860080 Extract constant 'LABEL'
+1171552019574 Rename type 'ContextPreviewEdtiorFactory'
+1171582413795 Extract method 'fillBody'
+1171597016437 Extract constant 'ID_VIEWER'
+1171604125357 Rename method 'makeActions'
+1171604155386 Rename type 'DeleteFromContextAction'
+1171604557195 Extract constant 'LABEL'
+1171604905629 Extract method 'isInteresting'
+1171605562178 Delete element
+1171605990221 Extract method 'resolveElement'
+1171606856195 Extract method 'collectChildren'
+1171607960676 Rename method 'createControlsSection'
+1171611153073 Extract method 'run'
+1171648043535 Rename type 'ContextEdtiorFactory'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/3/10/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/10/refactorings.history
new file mode 100644
index 0000000..fc4ce4a
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/10/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.getPreservedFilters()' to 'getPreservedFilterClasses' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.getPreservedFilters()' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.AbstractFocusViewAction.getPreservedFilterClasses()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getPreservedFilters'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui.actions{AbstractFocusViewAction.java[AbstractFocusViewAction~getPreservedFilters" name="getPreservedFilterClasses" references="true" stamp="1172973438051" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/3/10/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/10/refactorings.index
new file mode 100644
index 0000000..c4654a7
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/10/refactorings.index
@@ -0,0 +1 @@
+1172973438051 Rename method 'getPreservedFilters'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..dac5c43
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.context.ui/src/org.eclipse.mylar.internal.context.ui.views' - Original project: 'org.eclipse.mylar.context.ui' - Destination element: 'org.eclipse.mylar.context.ui/src/org.eclipse.mylar.internal.context.ui.views' - Original element: 'org.eclipse.mylar.internal.context.ui.views.ActiveSearchQuickView.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.context.ui.views" element1="/src<org.eclipse.mylar.internal.context.ui.views{ActiveSearchQuickView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.context.ui.views{ActiveSearchQuickView.java	true	true	ContextQuickView.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1174608280822" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.OpenContextQuickView' to 'OpenQuickContextPopupDialog' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.OpenContextQuickView' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.OpenQuickContextPopupDialog' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'OpenContextQuickView'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{OpenContextQuickView.java[OpenContextQuickView" matchStrategy="1" name="OpenQuickContextPopupDialog" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1174609605786" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fNamePatternFilter' in 'org.eclipse.mylar.internal.context.ui.views.QuickContextPopupDialog' to 'namePatternFilter' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.QuickContextPopupDialog.fNamePatternFilter' - Renamed element: 'org.eclipse.mylar.internal.context.ui.views.QuickContextPopupDialog.namePatternFilter' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'fNamePatternFilter'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.ui.views{QuickContextPopupDialog.java[QuickContextPopupDialog^fNamePatternFilter" name="namePatternFilter" references="true" setter="false" stamp="1174611591746" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void hackToForceFlatLayoutForJava()' from 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.createViewer()' to 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'hackToForceFlatLayoutForJava' - Destination type: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage' - Declared visibility: 'private'" comments="false" description="Extract method 'hackToForceFlatLayoutForJava'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java" name="hackToForceFlatLayoutForJava" replace="false" selection="10945 912" stamp="1174612327319" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.hackToForceFlatLayoutForJava(...)' to 'forceFlatLayoutOfJavaContent' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.hackToForceFlatLayoutForJava(...)' - Renamed element: 'org.eclipse.mylar.internal.context.ui.editors.ContextEditorFormPage.forceFlatLayoutOfJavaContent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hackToForceFlatLayoutForJava'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui.editors{ContextEditorFormPage.java[ContextEditorFormPage~hackToForceFlatLayoutForJava~QCommonViewer;" name="forceFlatLayoutOfJavaContent" references="true" stamp="1174612382367" version="1.0"/>
+<refactoring comment="Rename field 'fStringMatcher' in 'org.eclipse.mylar.internal.context.ui.views.QuickOutlineNamePatternFilter' to 'stringMatcher' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.QuickOutlineNamePatternFilter.fStringMatcher' - Renamed element: 'org.eclipse.mylar.internal.context.ui.views.QuickOutlineNamePatternFilter.stringMatcher' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'fStringMatcher'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.context.ui.views{QuickOutlineNamePatternFilter.java[QuickOutlineNamePatternFilter^fStringMatcher" name="stringMatcher" references="true" setter="false" stamp="1174613380616" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.views.QuickOutlineNamePatternFilter' to 'QuickOutlinePatternAndInterestFilter' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.QuickOutlineNamePatternFilter' - Renamed element: 'org.eclipse.mylar.internal.context.ui.views.QuickOutlinePatternAndInterestFilter' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'QuickOutlineNamePatternFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.views{QuickOutlineNamePatternFilter.java[QuickOutlineNamePatternFilter" matchStrategy="1" name="QuickOutlinePatternAndInterestFilter" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1174613778636" textual="false" version="1.0"/>
+
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..1f71c08
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1,7 @@
+1174608280822 Copy compilation unit
+1174609605786 Rename type 'OpenContextQuickView'
+1174611591746 Rename field 'fNamePatternFilter'
+1174612327319 Extract method 'hackToForceFlatLayoutForJava'
+1174612382367 Rename method 'hackToForceFlatLayoutForJava'
+1174613380616 Rename field 'fStringMatcher'
+1174613778636 Rename type 'QuickOutlineNamePatternFilter'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..e597604
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.TaskListInterestFilter.shouldShowInFocusedWorkweeDateContainer(...)' to 'shouldShowInFocusedWorkweekDateContainer' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.TaskListInterestFilter.shouldShowInFocusedWorkweeDateContainer(...)' - Renamed element: 'org.eclipse.mylar.internal.context.ui.TaskListInterestFilter.shouldShowInFocusedWorkweekDateContainer(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'shouldShowInFocusedWorkweeDateContainer'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui{TaskListInterestFilter.java[TaskListInterestFilter~shouldShowInFocusedWorkweeDateContainer~QITask;" name="shouldShowInFocusedWorkweekDateContainer" references="true" stamp="1175020285390" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'elcl16' - Original project: 'org.eclipse.mylar.context.ui' - Destination element: 'elcl16' - Original element: 'context-add.gif'" description="Copy file" element1="icons/etool16/context-add.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/context-add.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1175136750720" target="/org.eclipse.mylar.team/icons/elcl16" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylar.context.ui' - Destination element: 'etool16' - Original element: 'context-transfer.gif'" description="Copy file" element1="icons/elcl16/context-transfer.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/elcl16/context-transfer.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1175185919115" target="/org.eclipse.mylar.tasks.ui/icons/etool16" units="0" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.actions.ContextUiActionFilter' to 'ContextActiveActionFilter' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.actions.ContextUiActionFilter' - Renamed element: 'org.eclipse.mylar.internal.context.ui.actions.ContextActiveActionFilter' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextUiActionFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.actions{ContextUiActionFilter.java[ContextUiActionFilter" matchStrategy="1" name="ContextActiveActionFilter" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1175205872184" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.context.ui' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.views.ContextViewerActionProvider.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.context.ui.views{ContextViewerActionProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1175267394916" subPackages="false" version="1.0"/>
+<refactoring comment="Extract method 'private void setSelection(MouseEvent event)' from 'org.eclipse.mylar.internal.context.ui.views.ContextNodeOpenListener.mouseDown()' to 'org.eclipse.mylar.internal.context.ui.views.ContextNodeOpenListener' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'setSelection' - Destination type: 'org.eclipse.mylar.internal.context.ui.views.ContextNodeOpenListener' - Declared visibility: 'private'" comments="false" description="Extract method 'setSelection'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui.views{ContextNodeOpenListener.java" name="setSelection" replace="false" selection="2500 207" stamp="1175291788654" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..8645281
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1,6 @@
+1175020285390 Rename method 'shouldShowInFocusedWorkweeDateContainer'
+1175136750720 Copy file
+1175185919115 Copy file
+1175205872184 Rename type 'ContextUiActionFilter'
+1175267394916 Delete element
+1175291788654 Extract method 'setSelection'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..67b0701
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void cleanActionSets(IWorkbenchPage page)' from 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager.perspectiveActivated()' to 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager' - Original project: 'org.eclipse.mylar.context.ui' - Method name: 'cleanActionSets' - Destination type: 'org.eclipse.mylar.internal.context.ui.ContextPerspectiveManager' - Declared visibility: 'private'" comments="false" description="Extract method 'cleanActionSets'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.context.ui{ContextPerspectiveManager.java" name="cleanActionSets" replace="false" selection="5161 622" stamp="1179797343554" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..f53dcce
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1 @@
+1179797343554 Extract method 'cleanActionSets'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..20e3e97
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.context.ui.commands.ApplyMylarHandler' to 'FocusViewHandler' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.commands.ApplyMylarHandler' - Renamed element: 'org.eclipse.mylar.internal.context.ui.commands.FocusViewHandler' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.context.ui.commands{ApplyMylarHandler.java[ApplyMylarHandler" matchStrategy="1" name="FocusViewHandler" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180264499706" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.context.ui.BrowseFilteredListener.getFilter(...)' to 'getInterestFilter' - Original project: 'org.eclipse.mylar.context.ui' - Original element: 'org.eclipse.mylar.internal.context.ui.BrowseFilteredListener.getFilter(...)' - Renamed element: 'org.eclipse.mylar.internal.context.ui.BrowseFilteredListener.getInterestFilter(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getFilter'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.context.ui{BrowseFilteredListener.java[BrowseFilteredListener~getFilter~QStructuredViewer;" name="getInterestFilter" references="true" stamp="1180268234819" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..1d71ad1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,2 @@
+1180264499706 Rename type 'ApplyMylarHandler'
+1180268234819 Rename method 'getFilter'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..8258774
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylyn.context.ui/icons/eview16/mylar-apply-activity.gif' to 'focus-tasklist-activity.gif' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'mylar-apply-activity.gif'" description="Rename resource 'mylar-apply-activity.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/eview16/mylar-apply-activity.gif" name="focus-tasklist-activity.gif" stamp="1181267335031" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'mylar-apply-activity-new.gif'" description="Delete element" element1="icons/eview16/mylar-apply-activity-new.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1181267343449" subPackages="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.context.ui/icons/eview16/focus-tasklist-activity.gif' to 'focus-tasklist.gif' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'focus-tasklist-activity.gif'" description="Rename resource 'focus-tasklist-activity.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/eview16/focus-tasklist-activity.gif" name="focus-tasklist.gif" stamp="1181267356678" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.MylarWorkingSetPage' to 'TaskContextWorkingSetPage' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.MylarWorkingSetPage' - Renamed element: 'org.eclipse.mylyn.internal.context.ui.TaskContextWorkingSetPage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarWorkingSetPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui{MylarWorkingSetPage.java[MylarWorkingSetPage" matchStrategy="1" name="TaskContextWorkingSetPage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269361418" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.MylarWorkingSetManager' to 'TaskContextWorkingSetManager' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.MylarWorkingSetManager' - Renamed element: 'org.eclipse.mylyn.internal.context.ui.TaskContextWorkingSetManager' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarWorkingSetManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui{MylarWorkingSetManager.java[MylarWorkingSetManager" matchStrategy="1" name="TaskContextWorkingSetManager" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269382825" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..68875ae
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,5 @@
+1181267335031 Rename resource 'mylar-apply-activity.gif'
+1181267343449 Delete element
+1181267356678 Rename resource 'focus-tasklist-activity.gif'
+1181269361418 Rename type 'MylarWorkingSetPage'
+1181269382825 Rename type 'MylarWorkingSetManager'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..e2a8553
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.ContextCapturePauseAction.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.sandbox.ui.actions" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{ContextCapturePauseAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181659470347" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'elcl16' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'elcl16' - Original element: 'capture-pause.gif'" description="Copy file" element1="icons/elcl16/capture-pause.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/elcl16/capture-pause.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181659579052" target="/org.eclipse.mylyn.sandbox.ui/icons/elcl16" units="0" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.actions.OpenQuickContextPopupDialog' to 'OpenQuickContextPopupDialogAction' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.OpenQuickContextPopupDialog' - Renamed element: 'org.eclipse.mylyn.internal.context.ui.actions.OpenQuickContextPopupDialogAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'OpenQuickContextPopupDialog'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui.actions{OpenQuickContextPopupDialog.java[OpenQuickContextPopupDialog" matchStrategy="1" name="OpenQuickContextPopupDialogAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181679939291" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'MYLAR' in 'org.eclipse.mylyn.internal.context.ui.ContextUiImages' to 'MYLYN' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiImages.MYLAR' - Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextUiImages.MYLYN' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MYLAR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiImages.java[ContextUiImages^MYLAR" name="MYLYN" references="true" setter="false" stamp="1181890245619" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'MYLAR_OVERLAY' in 'org.eclipse.mylyn.internal.context.ui.ContextUiImages' to 'MYLYN_OVERLAY' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiImages.MYLAR_OVERLAY' - Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextUiImages.MYLYN_OVERLAY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MYLAR_OVERLAY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiImages.java[ContextUiImages^MYLAR_OVERLAY" name="MYLYN_OVERLAY" references="true" setter="false" stamp="1181890256206" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.context.ui.actions.ContextAttachAction.ID_ACTION' from expression '"org.eclipse.mylyn.context.ui.repository.task.attach"' - Original project: 'org.eclipse.mylyn.context.ui' - Constant name: 'ID_ACTION' - Constant expression: '"org.eclipse.mylyn.context.ui.repository.task.attach"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ID_ACTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.context.ui.actions{ContextAttachAction.java" name="ID_ACTION" qualify="false" replace="true" selection="2128 53" stamp="1182033829528" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'etool16' - Original element: 'context-clear.gif'" description="Copy file" element1="icons/elcl16/context-clear.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/elcl16/context-clear.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182034890694" target="/org.eclipse.mylyn.tasks.ui/icons/etool16" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'etool16' - Original element: 'context-retrieve.gif'" description="Copy file" element1="icons/etool16/context-retrieve.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/context-retrieve.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182034953187" target="/org.eclipse.mylyn.tasks.ui/icons/etool16" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..6cc88b7
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,8 @@
+1181659470347 Move compilation unit
+1181659579052 Copy file
+1181679939291 Rename type 'OpenQuickContextPopupDialog'
+1181890245619 Rename field 'MYLAR'
+1181890256206 Rename field 'MYLAR_OVERLAY'
+1182033829528 Extract constant 'ID_ACTION'
+1182034890694 Copy file
+1182034953187 Copy file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..051cc68
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.InterestFilter.determineIfFilteringCanBeDisabled(...)' to 'isRootNode' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.context.ui.InterestFilter.determineIfFilteringCanBeDisabled(...)' - Renamed element: 'org.eclipse.mylyn.context.ui.InterestFilter.isRootNode(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'determineIfFilteringCanBeDisabled'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{InterestFilter.java[InterestFilter~determineIfFilteringCanBeDisabled~QObject;" name="isRootNode" references="true" stamp="1182146693249" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.InterestFilter.isRootNode(...)' to 'isRootElementType' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.context.ui.InterestFilter.isRootNode(...)' - Renamed element: 'org.eclipse.mylyn.context.ui.InterestFilter.isRootElementType(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isRootNode'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{InterestFilter.java[InterestFilter~isRootNode~QObject;" name="isRootElementType" references="true" stamp="1182146706055" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.InterestFilter.isRootElementType(...)' to 'isRootElement' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.context.ui.InterestFilter.isRootElementType(...)' - Renamed element: 'org.eclipse.mylyn.context.ui.InterestFilter.isRootElement(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isRootElementType'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{InterestFilter.java[InterestFilter~isRootElementType~QObject;" name="isRootElement" references="true" stamp="1182146721984" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.context.ui/icons/eview16/mylar-apply.gif' to 'focus.gif' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'mylar-apply.gif'" description="Rename resource 'mylar-apply.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/eview16/mylar-apply.gif" name="focus.gif" stamp="1182203692055" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractAutoFocusViewAction.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{AbstractAutoFocusViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182220239079" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractFocusViewAction.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{AbstractFocusViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182220281824" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'elcl16' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'elcl16' - Original element: 'focus-tasklist.gif'" description="Copy file" element1="icons/eview16/focus-tasklist.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/focus-tasklist.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182296871336" target="/org.eclipse.mylyn.java.ui/icons/elcl16" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'elcl16' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'elcl16' - Original element: 'focus-tasklist.gif'" description="Copy file" element1="icons/eview16/focus-tasklist.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/focus-tasklist.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182296901018" target="/org.eclipse.mylyn.java.ui/icons/elcl16" units="0" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.isIncrement()' to 'isRemove' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.isIncrement()' - Renamed element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.isRemove()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isIncrement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui.actions{AbstractInterestManipulationAction.java[AbstractInterestManipulationAction~isIncrement" name="isRemove" references="true" stamp="1182298964467" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'src-old' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.RemoveFromContextAction.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{RemoveFromContextAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylyn/internal/context/ui/actions/RemoveFromContextAction.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182360305687" target="/org.eclipse.mylyn/developer/src-old" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'org.eclipse.mylyn.internal.context.ui.actions.RemoveFromContextAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{RemoveFromContextAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182360313140" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..7273987
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,11 @@
+1182146693249 Rename method 'determineIfFilteringCanBeDisabled'
+1182146706055 Rename method 'isRootNode'
+1182146721984 Rename method 'isRootElementType'
+1182203692055 Rename resource 'mylar-apply.gif'
+1182220239079 Move compilation unit
+1182220281824 Move compilation unit
+1182296871336 Copy file
+1182296901018 Copy file
+1182298964467 Rename method 'isIncrement'
+1182360305687 Copy compilation unit
+1182360313140 Delete element
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..7be4fcd
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylyn.context.ui' - Destination element: 'eview16' - Original element: 'focus-tasklist.gif'" description="Copy file" element1="icons/eview16/focus-tasklist.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/focus-tasklist.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182927538448" target="/org.eclipse.mylyn.tasks.ui/icons/eview16" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..76f8c88
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1 @@
+1182927538448 Copy file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..5b1ac5a
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylyn.context.ui/icons/elcl16/mylar-overlay.gif' to 'mylyn-overlay.gif' - Original project: 'org.eclipse.mylyn.context.ui' - Original element: 'mylar-overlay.gif'" description="Rename resource 'mylar-overlay.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/elcl16/mylar-overlay.gif" name="mylyn-overlay.gif" stamp="1184020745999" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..d81b555
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184020745999 Rename resource 'mylar-overlay.gif'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/8/35/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/8/35/refactorings.history
new file mode 100644
index 0000000..eeaec14
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/8/35/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.selectionToInteractionElement(...)' to 'convertSelectionToInteractionElement'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.selectionToInteractionElement(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.convertSelectionToInteractionElement(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'selectionToInteractionElement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui.actions{AbstractInterestManipulationAction.java[AbstractInterestManipulationAction~selectionToInteractionElement~QObject;" name="convertSelectionToInteractionElement" references="true" stamp="1188196716620" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/8/35/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/8/35/refactorings.index
new file mode 100644
index 0000000..5907325
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/8/35/refactorings.index
@@ -0,0 +1 @@
+1188196716620 Rename method 'selectionToInteractionElement'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..9b797a0
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'wasFocused' in 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction' to 'wasRun'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.wasFocused'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.wasRun'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'wasFocused'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction^wasFocused" name="wasRun" references="true" setter="false" stamp="1190609576065" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.isRemove()' to 'isIncrement'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.isRemove()'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.isIncrement()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isRemove'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui.actions{AbstractInterestManipulationAction.java[AbstractInterestManipulationAction~isRemove" name="isIncrement" references="true" stamp="1190748362253" version="1.0"/>
<refactoring comment="Extract method 'protected void updateEnabledment()' from 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.init()' to 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'updateEnabledment'
- Destination type: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction'
- Declared visibility: 'protected'" comments="false" description="Extract method 'updateEnabledment'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java" name="updateEnabledment" replace="false" selection="5585 405" stamp="1190750855914" version="1.0" visibility="4"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.enabledOnContextActivation()' to 'updateEnablementWithContext'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.enabledOnContextActivation()'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnablementWithContext()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'enabledOnContextActivation'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~enabledOnContextActivation" name="updateEnablementWithContext" references="true" stamp="1190750884403" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnabledment()' to 'updateEnablement'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnabledment()'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnablement()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateEnabledment'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~updateEnabledment" name="updateEnablement" references="true" stamp="1190750892379" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnablementWithContext()' to 'updateEnablementWithContextActivation'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnablementWithContext()'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnablementWithContextActivation()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateEnablementWithContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~updateEnablementWithContext" name="updateEnablementWithContextActivation" references="true" stamp="1190750954736" version="1.0"/>
<refactoring comment="Extract method 'private void updateActionEnablement(IAction action)' from 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.valueChanged()' to 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'updateActionEnablement'
- Destination type: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateActionEnablement'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java" name="updateActionEnablement" replace="false" selection="6449 200" stamp="1190755330494" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateActionEnablement(...)' to 'updateEnablement'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateActionEnablement(...)'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.updateEnablement(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateActionEnablement'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~updateActionEnablement~QIAction;" name="updateEnablement" references="true" stamp="1190755338139" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.TaskContextWorkingSetManager' to 'ContextWorkingSetManager'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.TaskContextWorkingSetManager'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextWorkingSetManager'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskContextWorkingSetManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui{TaskContextWorkingSetManager.java[TaskContextWorkingSetManager" matchStrategy="1" name="ContextWorkingSetManager" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190758018298" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.setLinkingActionEnabled(...)' to 'setManualLinkingAndFiilterEnablement'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.setLinkingActionEnabled(...)'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.setManualLinkingAndFiilterEnablement(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setLinkingActionEnabled'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~setLinkingActionEnabled~Z" name="setManualLinkingAndFiilterEnablement" references="true" stamp="1190765343119" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.setManualLinkingAndFiilterEnablement(...)' to 'setManualFilteringAndLinkingEnabled'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.setManualLinkingAndFiilterEnablement(...)'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.setManualFilteringAndLinkingEnabled(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setManualLinkingAndFiilterEnablement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~setManualLinkingAndFiilterEnablement~Z" name="setManualFilteringAndLinkingEnabled" references="true" stamp="1190765394932" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.ContextMenuContributor.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{ContextMenuContributor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1190825851189" units="1" version="1.0"/>
<refactoring comment="Rename field 'autoEnableExplorerFilter' in 'org.eclipse.mylyn.internal.context.ui.preferences.ContextUiPreferencePage' to 'autoFocusNavigatorsButton'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.preferences.ContextUiPreferencePage.autoEnableExplorerFilter'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.preferences.ContextUiPreferencePage.autoFocusNavigatorsButton'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'autoEnableExplorerFilter'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui.preferences{ContextUiPreferencePage.java[ContextUiPreferencePage^autoEnableExplorerFilter" name="autoFocusNavigatorsButton" references="true" setter="false" stamp="1190830507318" textual="false" version="1.0"/>
<refactoring comment="Rename field 'AUTO_MANAGE_CLOSE_ACTION' in 'org.eclipse.mylyn.internal.context.ui.ContextUiPrefContstants' to 'AUTO_MANAGE_EDITOR_CLOSE_ACTION'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPrefContstants.AUTO_MANAGE_CLOSE_ACTION'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPrefContstants.AUTO_MANAGE_EDITOR_CLOSE_ACTION'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'AUTO_MANAGE_CLOSE_ACTION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPrefContstants.java[ContextUiPrefContstants^AUTO_MANAGE_CLOSE_ACTION" name="AUTO_MANAGE_EDITOR_CLOSE_ACTION" references="true" setter="false" stamp="1190831095247" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'targetSelectoin' in 'org.eclipse.mylyn.internal.context.ui.BrowseFilteredListener.unfilterSelection(...)' to 'targetSelection'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.BrowseFilteredListener.unfilterSelection(TreeViewer, IStructuredSelection).targetSelectoin'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.BrowseFilteredListener.unfilterSelection(TreeViewer, IStructuredSelection).targetSelection'
- Update references to refactored element" description="Rename local variable 'targetSelectoin'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.ui{BrowseFilteredListener.java[BrowseFilteredListener~unfilterSelection~QTreeViewer;~QIStructuredSelection;@targetSelectoin!1730!1765!1751!1765!QIStructuredSelection;" name="targetSelection" references="true" stamp="1190856567445" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..18fce0a
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1,15 @@
+1190609576065 Rename field 'wasFocused'
+1190748362253 Rename method 'isRemove'
+1190750855914 Extract method 'updateEnabledment'
+1190750884403 Rename method 'enabledOnContextActivation'
+1190750892379 Rename method 'updateEnabledment'
+1190750954736 Rename method 'updateEnablementWithContext'
+1190755330494 Extract method 'updateActionEnablement'
+1190755338139 Rename method 'updateActionEnablement'
+1190758018298 Rename type 'TaskContextWorkingSetManager'
+1190765343119 Rename method 'setLinkingActionEnabled'
+1190765394932 Rename method 'setManualLinkingAndFiilterEnablement'
+1190825851189 Copy compilation unit
+1190830507318 Rename field 'autoEnableExplorerFilter'
+1190831095247 Rename field 'AUTO_MANAGE_CLOSE_ACTION'
+1190856567445 Rename local variable 'targetSelectoin'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/1/2/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/2/refactorings.history
new file mode 100644
index 0000000..5da7437
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/2/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'filters' from expression 'previousFilters.get(viewer)'
- Original project: 'org.eclipse.mylyn.context.ui'
- Variable name: 'filters'
- Destination method: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.uninstallInterestFilter()'
- Variable expression: 'previousFilters.get(viewer)'
- Replace occurrences of expression with variable" description="Extract local variable 'filters'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java" name="filters" replace="true" selection="13852 27" stamp="1200080241136" version="1.0"/>
<refactoring comment="Rename local variable 'suppressExpansion' in 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.update(...)' to 'expandAll'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.update(boolean, boolean).suppressExpansion'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.update(boolean, boolean).expandAll'
- Update references to refactored element" description="Rename local variable 'suppressExpansion'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~update~Z~Z at suppressExpansion!7879!7903!7887!7903!Z" name="expandAll" references="true" stamp="1200087358981" version="1.0"/>
<refactoring comment="Rename field 'tempSuppressExpandAll' in 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction' to 'internalSuppressExpandAll'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.tempSuppressExpandAll'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.internalSuppressExpandAll'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'tempSuppressExpandAll'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction^tempSuppressExpandAll" name="internalSuppressExpandAll" references="true" setter="false" stamp="1200096623736" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/1/2/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/2/refactorings.index
new file mode 100644
index 0000000..303b4c4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/2/refactorings.index
@@ -0,0 +1,5 @@
+1200080241136 Extract local variable 'filters'
+1200087358981 Rename local variable 'suppressExpansion'
+1200087358981 Rename local variable 'suppressExpansion'
+1200087358981 Rename local variable 'suppressExpansion'
+1200096623736 Rename field 'tempSuppressExpandAll'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/1/3/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/3/refactorings.history
new file mode 100644
index 0000000..de5c73e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/3/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.compareOverdue(...)' to 'compareOverScheduled'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.compareOverdue(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.compareOverScheduled(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'compareOverdue'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestSorter.java[TaskListInterestSorter~compareOverdue~QAbstractTask;~QAbstractTask;" name="compareOverScheduled" references="true" stamp="1200677948557" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.compareToday(...)' to 'compareScheduledToday'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.compareToday(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.compareScheduledToday(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'compareToday'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestSorter.java[TaskListInterestSorter~compareToday~QAbstractTask;~QAbstractTask;" name="compareScheduledToday" references="true" stamp="1200677954891" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/1/3/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/3/refactorings.index
new file mode 100644
index 0000000..7e42046
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/1/3/refactorings.index
@@ -0,0 +1,2 @@
+1200677948557 Rename method 'compareOverdue'
+1200677954891 Rename method 'compareToday'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/10/42/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/10/42/refactorings.history
new file mode 100644
index 0000000..b00b557
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/10/42/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original elements:
 org.eclipse.mylyn.internal.context.ui.views.CommonNavigatorFilterBar.java
 org.eclipse.mylyn.internal.context.ui.views.CommonNavigatorPatternFilter.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.context.ui.views{CommonNavigatorPatternFilter.java" element2="/src<org.eclipse.mylyn.internal.context.ui.views{CommonNavigatorFilterBar.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1224267044799" subPackages="false" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.views'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.views'
- Original elements:
 org.eclipse.mylyn.internal.context.ui.views.ActiveViewDelegatingDragAdapter.java
 org.eclipse.mylyn.internal.context.ui.views.ContextContentProvider.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.views" element1="/src<org.eclipse.mylyn.internal.context.ui.views{ActiveViewDelegatingDragAdapter.java" element2="/src<org.eclipse.mylyn.internal.context.ui.views{ContextContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1224267148623" units="2" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/10/42/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/10/42/refactorings.index
new file mode 100644
index 0000000..55b51f3
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/10/42/refactorings.index
@@ -0,0 +1,2 @@
+1224267044799 Delete elements
+1224267148623 Move compilation units
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/11/46/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/11/46/refactorings.history
new file mode 100644
index 0000000..8990df4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original elements:
 org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.context.ui.editors{ContextEditorFormPage.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1226204307260" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/11/46/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/11/46/refactorings.index
new file mode 100644
index 0000000..bd610cd
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/11/46/refactorings.index
@@ -0,0 +1 @@
+1226204307260 Infer generic type arguments
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/12/52/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/12/52/refactorings.history
new file mode 100644
index 0000000..2b99ac2
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/12/52/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'ID_CONTEXT_PAGE' in 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin' to 'ID_CONTEXT_PAGE_FACTORY'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.ID_CONTEXT_PAGE'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.ID_CONTEXT_PAGE_FACTORY'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_CONTEXT_PAGE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^ID_CONTEXT_PAGE" name="ID_CONTEXT_PAGE_FACTORY" references="true" setter="true" stamp="1229972130548" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.ID_CONTEXT_PAGE_FACTORY' to 'org.eclipse.mylyn.context.ui.ContextUi'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.ID_CONTEXT_PAGE_FACTORY'
- Destination type: 'org.eclipse.mylyn.context.ui.ContextUi'" delegate="false" deprecate="true" description="Move member 'ID_CONTEXT_PAGE_FACTORY'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^ID_CONTEXT_PAGE_FACTORY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi" stamp="1229972157144" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/12/52/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/12/52/refactorings.index
new file mode 100644
index 0000000..658feb9
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/12/52/refactorings.index
@@ -0,0 +1,2 @@
+1229972130548 Rename field 'ID_CONTEXT_PAGE'
+1229972157144 Move member 'ID_CONTEXT_PAGE_FACTORY'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/2/7/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/2/7/refactorings.history
new file mode 100644
index 0000000..18651d7
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/2/7/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void run(AbstractTask task)' from 'org.eclipse.mylyn.internal.context.ui.actions.ContextClearAction.run()' to 'org.eclipse.mylyn.internal.context.ui.actions.ContextClearAction'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'run'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.actions.ContextClearAction'
- Declared visibility: 'private'" comments="false" description="Extract method 'run'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui.actions{ContextClearAction.java" name="run" replace="false" selection="1595 690" stamp="1202874175580" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextHighlighter.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.context.ui{ContextHighlighter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1203014465515" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.ContextHighlighter' to 'ContextHighlighterInitializer'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextHighlighter'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextHighlighterInitializer'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ContextHighlighter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui{ContextHighlighter.java[ContextHighlighter" matchStrategy="1" name="ContextHighlighterInitializer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1203014489109" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.ContextHighlighterInitializer.initialize()' to 'init'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextHighlighterInitializer.initialize()'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextHighlighterInitializer.init()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'initialize'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{ContextHighlighterInitializer.java[ContextHighlighterInitializer~initialize" name="init" references="true" stamp="1203014608039" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/2/7/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/2/7/refactorings.index
new file mode 100644
index 0000000..a150fa5
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/2/7/refactorings.index
@@ -0,0 +1,4 @@
+1202874175580 Extract method 'run'
+1203014465515 Move compilation unit
+1203014489109 Rename type 'ContextHighlighter'
+1203014608039 Rename method 'initialize'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..b58d416
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.AbstractContextUiPlugin.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui{AbstractContextUiPlugin.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207511931159" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..9b40f58
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1 @@
+1207511931159 Delete element
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..8a30cb1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.views'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.views'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.ActiveSearchView.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.views" element1="/src<org.eclipse.mylyn.internal.context.ui.views{ActiveSearchView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207706791364" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.LinkActiveSearchWithEditorAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.actions" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{LinkActiveSearchWithEditorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207706892584" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.ToggleRelationshipProviderAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.actions" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{ToggleRelationshipProviderAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207706941681" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.ShowQualifiedNamesAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.actions" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{ShowQualifiedNamesAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207706967540" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUiPlugin.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.context.ui{ContextUiPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207710200100" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.views'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.views'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.ActiveSearchQuickView.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.views" element1="/src<org.eclipse.mylyn.internal.context.ui.views{ActiveSearchQuickView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207715246246" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.DelegatingContextLabelProvider.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.views{DelegatingContextLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207716005718" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.DelegatingContextLabelProvider.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.views{DelegatingContextLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207717089439" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.getUiBridge(...)' to 'org.eclipse.mylyn.context.ui.ContextUi'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.getUiBridge(...)'
- Destination type: 'org.eclipse.mylyn.context.ui.ContextUi'" delegate="false" deprecate="true" description="Move member 'getUiBridge'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin~getUiBridge~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi" stamp="1207876543833" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.getUiBridgeForEditor(...)' to 'org.eclipse.mylyn.context.ui.ContextUi'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.getUiBridgeForEditor(...)'
- Destination type: 'org.eclipse.mylyn.context.ui.ContextUi'" delegate="false" deprecate="true" description="Move member 'getUiBridgeForEditor'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin~getUiBridgeForEditor~QIEditorPart;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi" stamp="1207876758949" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..d9f07d3
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,10 @@
+1207706791364 Move compilation unit
+1207706892584 Move compilation unit
+1207706941681 Move compilation unit
+1207706967540 Move compilation unit
+1207710200100 Move compilation unit
+1207715246246 Move compilation unit
+1207716005718 Move compilation unit
+1207717089439 Move compilation unit
+1207876543833 Move member 'getUiBridge'
+1207876758949 Move member 'getUiBridgeForEditor'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..0ead281
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.TaskHighlighterMenuContributor.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.context.ui{TaskHighlighterMenuContributor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208483725064" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original element: 'org.eclipse.mylyn.internal.context.ui.HighlighterList.java'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.highlighter" element1="/src<org.eclipse.mylyn.internal.context.ui{HighlighterList.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="plugin.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1208484010110" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original element: 'org.eclipse.mylyn.internal.context.ui.Highlighter.java'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.highlighter" element1="/src<org.eclipse.mylyn.internal.context.ui{Highlighter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="plugin.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1208484154887" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextHighlighterInitializer'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextHighlighterInitializer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208484175165" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ColorCoordinatesChange.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.highlighter" element1="/src<org.eclipse.mylyn.internal.context.ui{ColorCoordinatesChange.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208484490245" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.saveEditorMemento(...)' to 'writeEditorMemento'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.saveEditorMemento(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.writeEditorMemento(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveEditorMemento'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{ContextEditorManager.java[ContextEditorManager~saveEditorMemento~QAbstractTask;~QString;" name="writeEditorMemento" references="true" stamp="1208556843632" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..0ec6ad4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,6 @@
+1208483725064 Move compilation unit
+1208484010110 Move compilation unit
+1208484154887 Move compilation unit
+1208484175165 Delete element
+1208484490245 Move compilation unit
+1208556843632 Rename method 'saveEditorMemento'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..34f4003
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFactory.createPage().formPage' in 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFactory.createPage()'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFactory.createPage().formPage'" description="Inline local variable 'formPage'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.context.ui.editors{ContextEditorFactory.java" selection="1500 88" stamp="1209365483215" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFactory' to 'ContextPageFactory'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFactory'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.editors.ContextPageFactory'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ContextEditorFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui.editors{ContextEditorFactory.java[ContextEditorFactory" matchStrategy="1" name="ContextPageFactory" qualified="false" references="true" similarDeclarations="false" stamp="1209365599045" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorInput.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui.editors{ContextEditorInput.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209365813632" subPackages="false" version="1.0"/>
<refactoring comment="Extract method 'private static void hasTaskChanges(Object parent,AbstractTask task)' from 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter.hasChanges()' to 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'hasTaskChanges'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter'
- Declared visibility: 'private'" comments="false" description="Extract method 'hasTaskChanges'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestFilter.java" name="hasTaskChanges" replace="false" selection="5756 344" stamp="1209524424602" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..f2dfc13
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,4 @@
+1209365483215 Inline local variable 'formPage'
+1209365599045 Rename type 'ContextEditorFactory'
+1209365813632 Delete element
+1209524424602 Extract method 'hasTaskChanges'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..9d39c3d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.AbstractTaskHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui.commands{AbstractTaskHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210720836822" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.AttachContextHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui.commands" element1="/src<org.eclipse.mylyn.internal.context.ui.commands{AttachContextHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210721005686" units="1" version="1.0"/>
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.internal.context.ui.commands.AbstractTaskAttachmentHandler' from 'org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler'
- Sub types:
 org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler
- Extracted class: 'org.eclipse.mylyn.internal.context.ui.commands.AbstractTaskAttachmentHandler'
- Extracted members:
 org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler.execute(...)
 org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler.execute(...)" delete="2" description="Extract superclass 'AbstractTaskAttachmentHandler'" element1="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextAttachmentHandler.java[RetrieveContextAttachmentHandler~execute~QExecutionEvent;" element2="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextAttachmentHandler.java[RetrieveContextAttachmentHandler~execute~QExecutionEvent;~QITaskAttachment;" element3="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextAttachmentHandler.java[RetrieveContextAttachmentHandler~execute~QExecutionEvent;" element4="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextAttachmentHandler.java[RetrieveContextAttachmentHandler~execute~QExecutionEvent;~QITaskAttachment;" element5="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextAttachmentHandler.java[RetrieveContextAttachmentHandler" extract="2" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextAttachmentHandler.java[RetrieveContextAttachmentHandler" instanceof="true" name="AbstractTaskAttachmentHandler" replace="false" stamp="1210721352490" stubs="true" types="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui.commands" element1="/src<org.eclipse.mylyn.internal.context.ui.commands{RetrieveContextHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210721425470" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.ClearContextHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui.commands" element1="/src<org.eclipse.mylyn.internal.context.ui.commands{ClearContextHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210721928799" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.ContextMenuContributor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{ContextMenuContributor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210723007975" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.IContextAwareEditor.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.ui" element1="/src<org.eclipse.mylyn.internal.context.ui{IContextAwareEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1210822341182" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPrefContstants.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.ui" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPrefContstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210832081140" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.context.ui.ContextUiPrefContstants' to 'IContextUiContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUiPrefContstants'
- Renamed element: 'org.eclipse.mylyn.context.ui.IContextUiContstants'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ContextUiPrefContstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.ui{ContextUiPrefContstants.java[ContextUiPrefContstants" matchStrategy="1" name="IContextUiContstants" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1210832104189" textual="false" version="1.0"/>
<refactoring comment="Rename field 'NAVIGATORS_AUTO_FILTER_ENABLE' in 'org.eclipse.mylyn.context.ui.IContextUiContstants' to 'PREF_NAVIGATORS_AUTO_FOCUS'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.NAVIGATORS_AUTO_FILTER_ENABLE'
- Renamed element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.PREF_NAVIGATORS_AUTO_FOCUS'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'NAVIGATORS_AUTO_FILTER_ENABLE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.ui{IContextUiContstants.java[IContextUiContstants^NAVIGATORS_AUTO_FILTER_ENABLE" name="PREF_NAVIGATORS_AUTO_FOCUS" references="true" setter="true" stamp="1210832511615" textual="false" version="1.0"/>
<refactoring comment="Rename field 'ACTIVE_FOLDING_ENABLED' in 'org.eclipse.mylyn.context.ui.IContextUiContstants' to 'PREF_FOLDING_ENABLED'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.ACTIVE_FOLDING_ENABLED'
- Renamed element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.PREF_FOLDING_ENABLED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ACTIVE_FOLDING_ENABLED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.ui{IContextUiContstants.java[IContextUiContstants^ACTIVE_FOLDING_ENABLED" name="PREF_FOLDING_ENABLED" references="true" setter="true" stamp="1210832547421" textual="false" version="1.0"/>
<refactoring comment="Rename field 'PREF_NAVIGATORS_AUTO_FOCUS' in 'org.eclipse.mylyn.context.ui.IContextUiContstants' to 'PREF_NAVIGATORS_FOCUS_ENABLED'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.PREF_NAVIGATORS_AUTO_FOCUS'
- Renamed element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.PREF_NAVIGATORS_FOCUS_ENABLED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PREF_NAVIGATORS_AUTO_FOCUS'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.ui{IContextUiContstants.java[IContextUiContstants^PREF_NAVIGATORS_AUTO_FOCUS" name="PREF_NAVIGATORS_FOCUS_ENABLED" references="true" setter="true" stamp="1210832558584" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.ui.IContextUiContstants.PREF_NAVIGATORS_FOCUS_ENABLED' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.PREF_NAVIGATORS_FOCUS_ENABLED'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'PREF_NAVIGATORS_FOCUS_ENABLED'" element1="/src<org.eclipse.mylyn.context.ui{IContextUiContstants.java[IContextUiContstants^PREF_NAVIGATORS_FOCUS_ENABLED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1210832653730" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.ui.IContextUiContstants.PERSPECTIVE_NO_ACTIVE_TASK' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiContstants.PERSPECTIVE_NO_ACTIVE_TASK'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'PERSPECTIVE_NO_ACTIVE_TASK'" element1="/src<org.eclipse.mylyn.context.ui{IContextUiContstants.java[IContextUiContstants^PERSPECTIVE_NO_ACTIVE_TASK" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1210832668428" version="1.0"/>
<refactoring comment="Rename field 'INTERSECTION_MODE' in 'org.eclipse.mylyn.internal.context.ui.actions.ToggleDecorateInterestLevelAction' to 'PREF_INTERSECTION_MODE'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.ToggleDecorateInterestLevelAction.INTERSECTION_MODE'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.actions.ToggleDecorateInterestLevelAction.PREF_INTERSECTION_MODE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'INTERSECTION_MODE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui.actions{ToggleDecorateInterestLevelAction.java[ToggleDecorateInterestLevelAction^INTERSECTION_MODE" name="PREF_INTERSECTION_MODE" references="true" setter="true" stamp="1210832741453" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.context.ui.IContextUiContstants' to 'IContextUiPreferenceContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiContstants'
- Renamed element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'IContextUiContstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.context.ui{IContextUiContstants.java[IContextUiContstants" matchStrategy="1" name="IContextUiPreferenceContstants" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1210832858708" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210833214133" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.context.ui" element1="/src<org.eclipse.mylyn.internal.context.ui{IContextUiPreferenceContstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210833277629" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'AUTO_MANAGE_EXPANSION'" element1="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^AUTO_MANAGE_EXPANSION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1210833303111" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'AUTO_MANAGE_PERSPECTIVES'" element1="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^AUTO_MANAGE_PERSPECTIVES" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1210833327908" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'AUTO_MANAGE_EDITORS'" element1="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^AUTO_MANAGE_EDITORS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1210833351380" version="1.0"/>
<refactoring comment="Rename field 'PREF_FOLDING_ENABLED' in 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants' to 'AUTO_FOLDING_ENABLED'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.PREF_FOLDING_ENABLED'
- Renamed element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.AUTO_FOLDING_ENABLED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PREF_FOLDING_ENABLED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^PREF_FOLDING_ENABLED" name="AUTO_FOLDING_ENABLED" references="true" setter="true" stamp="1210833360458" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.AUTO_MANAGE_EDITORS' to 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.AUTO_MANAGE_EDITORS'
- Destination type: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'" delegate="false" deprecate="true" description="Move member 'AUTO_MANAGE_EDITORS'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^AUTO_MANAGE_EDITORS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants" stamp="1210833514930" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.AUTO_MANAGE_PERSPECTIVES' to 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.AUTO_MANAGE_PERSPECTIVES'
- Destination type: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'" delegate="false" deprecate="true" description="Move member 'AUTO_MANAGE_PERSPECTIVES'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^AUTO_MANAGE_PERSPECTIVES" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants" stamp="1210833518482" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.AUTO_MANAGE_EXPANSION' to 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.AUTO_MANAGE_EXPANSION'
- Destination type: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'" delegate="false" deprecate="true" description="Move member 'AUTO_MANAGE_EXPANSION'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^AUTO_MANAGE_EXPANSION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants" stamp="1210833522031" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.PREF_NAVIGATORS_FOCUS_ENABLED' to 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.PREF_NAVIGATORS_FOCUS_ENABLED'
- Destination type: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'" delegate="false" deprecate="true" description="Move member 'PREF_NAVIGATORS_FOCUS_ENABLED'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^PREF_NAVIGATORS_FOCUS_ENABLED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants" stamp="1210833529937" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.PERSPECTIVE_NO_ACTIVE_TASK' to 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.PERSPECTIVE_NO_ACTIVE_TASK'
- Destination type: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants'" delegate="false" deprecate="true" description="Move member 'PERSPECTIVE_NO_ACTIVE_TASK'" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin^PERSPECTIVE_NO_ACTIVE_TASK" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants" stamp="1210833555280" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.IContextUiPreferenceContstants.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.context.ui{IContextUiPreferenceContstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210833617132" units="1" version="1.0"/>
<refactoring comment="Rename field 'PREF_NAVIGATORS_FOCUS_ENABLED' in 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants' to 'NAVIGATORS_FOCUS_ENABLED'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.PREF_NAVIGATORS_FOCUS_ENABLED'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.NAVIGATORS_FOCUS_ENABLED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PREF_NAVIGATORS_FOCUS_ENABLED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^PREF_NAVIGATORS_FOCUS_ENABLED" name="NAVIGATORS_FOCUS_ENABLED" references="true" setter="true" stamp="1210833624319" textual="false" version="1.0"/>
<refactoring comment="Rename field 'NAVIGATORS_FOCUS_ENABLED' in 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants' to 'AUTO_FOCUS_NAVIGATORS'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.NAVIGATORS_FOCUS_ENABLED'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'NAVIGATORS_FOCUS_ENABLED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^NAVIGATORS_FOCUS_ENABLED" name="AUTO_FOCUS_NAVIGATORS" references="true" setter="true" stamp="1210833639294" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'task' in 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.readEditorMemento(...)' to 'context'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.readEditorMemento(IInteractionContext).task'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.readEditorMemento(IInteractionContext).context'
- Update references to refactored element" description="Rename local variable 'task'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.ui{ContextEditorManager.java[ContextEditorManager~readEditorMemento~QIInteractionContext;@task!8366!8389!8386!8389!QIInteractionContext;" name="context" references="true" stamp="1210898986809" version="1.0"/>
<refactoring comment="Rename local variable 'task' in 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.writeEditorMemento(...)' to 'context'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.writeEditorMemento(IInteractionContext, String).task'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextEditorManager.writeEditorMemento(IInteractionContext, String).context'
- Update references to refactored element" description="Rename local variable 'task'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.context.ui{ContextEditorManager.java[ContextEditorManager~writeEditorMemento~QIInteractionContext;~QString;@task!10345!10368!10365!10368!QIInteractionContext;" name="context" references="true" stamp="1210899004597" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextUiUtil.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui{ContextUiUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210899789062" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.highlighter'
- Original element: 'org.eclipse.mylyn.internal.context.ui.actions.EditHighlightersAction.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.highlighter" element1="/src<org.eclipse.mylyn.internal.context.ui.actions{EditHighlightersAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210900168265" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..3e6abbe
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,34 @@
+1210720836822 Delete element
+1210721005686 Copy compilation unit
+1210721352490 Extract superclass 'AbstractTaskAttachmentHandler'
+1210721425470 Copy compilation unit
+1210721928799 Copy compilation unit
+1210723007975 Delete element
+1210822341182 Move compilation unit
+1210832081140 Move compilation unit
+1210832104189 Rename type 'ContextUiPrefContstants'
+1210832511615 Rename field 'NAVIGATORS_AUTO_FILTER_ENABLE'
+1210832547421 Rename field 'ACTIVE_FOLDING_ENABLED'
+1210832558584 Rename field 'PREF_NAVIGATORS_AUTO_FOCUS'
+1210832653730 Move member 'PREF_NAVIGATORS_FOCUS_ENABLED'
+1210832668428 Move member 'PERSPECTIVE_NO_ACTIVE_TASK'
+1210832741453 Rename field 'INTERSECTION_MODE'
+1210832858708 Rename type 'IContextUiContstants'
+1210833214133 Move compilation unit
+1210833277629 Move compilation unit
+1210833303111 Move member 'AUTO_MANAGE_EXPANSION'
+1210833327908 Move member 'AUTO_MANAGE_PERSPECTIVES'
+1210833351380 Move member 'AUTO_MANAGE_EDITORS'
+1210833360458 Rename field 'PREF_FOLDING_ENABLED'
+1210833514930 Move member 'AUTO_MANAGE_EDITORS'
+1210833518482 Move member 'AUTO_MANAGE_PERSPECTIVES'
+1210833522031 Move member 'AUTO_MANAGE_EXPANSION'
+1210833529937 Move member 'PREF_NAVIGATORS_FOCUS_ENABLED'
+1210833555280 Move member 'PERSPECTIVE_NO_ACTIVE_TASK'
+1210833617132 Move compilation unit
+1210833624319 Rename field 'PREF_NAVIGATORS_FOCUS_ENABLED'
+1210833639294 Rename field 'NAVIGATORS_FOCUS_ENABLED'
+1210898986809 Rename local variable 'task'
+1210899004597 Rename local variable 'task'
+1210899789062 Delete element
+1210900168265 Move compilation unit
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..c810bea
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 'org.eclipse.mylyn.internal.context.ui.InterestDecorator.getForegroundForElement(...)' to 'org.eclipse.mylyn.context.ui.ContextUi'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.InterestDecorator.getForegroundForElement(...)'
- Destination type: 'org.eclipse.mylyn.context.ui.ContextUi'" delegate="false" deprecate="true" description="Move member 'getForegroundForElement'" element1="/src<org.eclipse.mylyn.internal.context.ui{InterestDecorator.java[InterestDecorator~getForegroundForElement~QIInteractionElement;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi" stamp="1211259851009" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.ContextUi.getForegroundForElement(...)' to 'getForeground'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUi.getForegroundForElement(...)'
- Renamed element: 'org.eclipse.mylyn.context.ui.ContextUi.getForeground(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getForegroundForElement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi~getForegroundForElement~QIInteractionElement;" name="getForeground" references="true" stamp="1211259883170" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.views'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.views'
- Original elements:
 org.eclipse.mylyn.internal.context.ui.TaskListInterestSorter.java
 org.eclipse.mylyn.internal.context.ui.TaskListInterestFilter.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.views" element1="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestSorter.java" element2="/src<org.eclipse.mylyn.internal.context.ui{TaskListInterestFilter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211260145678" units="2" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction.LABEL_SHELL' from expression '"Interest Manipulation"'
- Original project: 'org.eclipse.mylyn.context.ui'
- Constant name: 'LABEL_SHELL'
- Constant expression: '"Interest Manipulation"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_SHELL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.context.ui.actions{AbstractInterestManipulationAction.java" name="LABEL_SHELL" qualify="false" replace="true" selection="2454 23" stamp="1211260226448" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.ContextCapturePauseHandler.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.commands{ContextCapturePauseHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211325205714" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.ContextUi.isEditorManagementEnabled()' to 'isEditorAutoCloseEnabled'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUi.isEditorManagementEnabled()'
- Renamed element: 'org.eclipse.mylyn.context.ui.ContextUi.isEditorAutoCloseEnabled()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isEditorManagementEnabled'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi~isEditorManagementEnabled" name="isEditorAutoCloseEnabled" references="true" stamp="1211331568381" version="1.0"/>
<refactoring comment="Rename field 'AUTO_MANAGE_EDITOR_CLOSE_ACTION' in 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants' to 'AUTO_MANAGE_EDITOR_CLOSE'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_ACTION'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'AUTO_MANAGE_EDITOR_CLOSE_ACTION'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.context.ui{IContextUiPreferenceContstants.java[IContextUiPreferenceContstants^AUTO_MANAGE_EDITOR_CLOSE_ACTION" name="AUTO_MANAGE_EDITOR_CLOSE" references="true" setter="true" stamp="1211331780093" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'elcl16'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'elcl16'
- Original element: 'interest-landmark.gif'" description="Copy file" element1="icons/elcl16/interest-landmark.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1211416028467" target="/org.eclipse.mylyn.sandbox.ui/icons/elcl16" units="0" version="1.0"/>
<refactoring comment="Extract constant 'TITLE_DIALOG' from expression '"Copy Context"'
- Original project: 'org.eclipse.mylyn.context.ui'
- Constant name: 'TITLE_DIALOG'
- Constant expression: '"Copy Context"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'TITLE_DIALOG'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.context.ui.commands{CopyContextHandler.java" name="TITLE_DIALOG" qualify="false" replace="true" selection="2757 14" stamp="1211420448030" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.views'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.views'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.ActiveViewDropAdapter.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.views" element1="/src<org.eclipse.mylyn.internal.context.ui.views{ActiveViewDropAdapter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211434374704" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.context.ui.ContextWorkingSetManager.getElementsFromTaskscape(...)' to 'getElementsFromContext'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.ContextWorkingSetManager.getElementsFromTaskscape(...)'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.ContextWorkingSetManager.getElementsFromContext(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getElementsFromTaskscape'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.context.ui{ContextWorkingSetManager.java[ContextWorkingSetManager~getElementsFromTaskscape~QList\<QIAdaptable;>;" name="getElementsFromContext" references="true" stamp="1211434856555" version="1.0"/>
<refactoring comment="Extract method 'private void createRefreshJob()' from 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage.refresh()' to 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'createRefreshJob'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'createRefreshJob'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui.editors{ContextEditorFormPage.java" name="createRefreshJob" replace="true" selection="11260 161" stamp="1211710112812" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..7e40eac
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,12 @@
+1211259851009 Move member 'getForegroundForElement'
+1211259883170 Rename method 'getForegroundForElement'
+1211260145678 Move compilation units
+1211260226448 Extract constant 'LABEL_SHELL'
+1211325205714 Move compilation unit
+1211331568381 Rename method 'isEditorManagementEnabled'
+1211331780093 Rename field 'AUTO_MANAGE_EDITOR_CLOSE_ACTION'
+1211416028467 Copy file
+1211420448030 Extract constant 'TITLE_DIALOG'
+1211434374704 Move compilation unit
+1211434856555 Rename method 'getElementsFromTaskscape'
+1211710112812 Extract method 'createRefreshJob'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..18cca8f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.context.ui.commands.AbstractTaskAttachmentHandler' to 'AbstractTaskAttachmentCommandHandler'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.commands.AbstractTaskAttachmentHandler'
- Renamed element: 'org.eclipse.mylyn.internal.context.ui.commands.AbstractTaskAttachmentCommandHandler'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskAttachmentHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.context.ui.commands{AbstractTaskAttachmentHandler.java[AbstractTaskAttachmentHandler" matchStrategy="1" name="AbstractTaskAttachmentCommandHandler" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1212005271541" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.CommonNavigatorFilterBar.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.views{CommonNavigatorFilterBar.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212189762574" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.CommonNavigatorPatternFilter.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui" element1="/src<org.eclipse.mylyn.internal.context.ui.views{CommonNavigatorPatternFilter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212189773850" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..0c82efd
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,3 @@
+1212005271541 Rename type 'AbstractTaskAttachmentHandler'
+1212189762574 Move compilation unit
+1212189773850 Move compilation unit
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..3de2263
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylyn.context.ui.ContextUi.ID_CONTEXT_PAGE' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.ContextUi.ID_CONTEXT_PAGE'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'ID_CONTEXT_PAGE'" element1="/src<org.eclipse.mylyn.context.ui{ContextUi.java[ContextUi^ID_CONTEXT_PAGE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1212640809246" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..b343706
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1 @@
+1212640809246 Move member 'ID_CONTEXT_PAGE'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..0061308
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'offset' from expression '7'
- Original project: 'org.eclipse.mylyn.context.ui'
- Variable name: 'offset'
- Destination method: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.EmptyContextDrawer.handleEvent()'
- Variable expression: '7'
- Replace occurrences of expression with variable" description="Extract local variable 'offset'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java" name="offset" replace="true" selection="4211 1" stamp="1213389941848" version="1.0"/>
<refactoring comment="Extract constant 'LABEL' from expression '"Unfocus or Alt+click"'
- Original project: 'org.eclipse.mylyn.context.ui'
- Constant name: 'LABEL'
- Constant expression: '"Unfocus or Alt+click"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java" name="LABEL" qualify="false" replace="true" selection="4239 22" stamp="1213392051359" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..52cb0a0
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1213389941848 Extract local variable 'offset'
+1213392051359 Extract constant 'LABEL'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..106e47e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.context.ui'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.internal.context.ui.views.ActiveViewResourceDragAdapter.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.context.ui.views{ActiveViewResourceDragAdapter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221049025068" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..bf6c765
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1 @@
+1221049025068 Delete element
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2009/2/7/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2009/2/7/refactorings.history
new file mode 100644
index 0000000..81935ec
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2009/2/7/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'excludedFilters' in 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.installInterestFilter(...)' to 'excludedFilterClasses'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.installInterestFilter(StructuredViewer).excludedFilters'
- Renamed element: 'excludedFilters'
- Update references to refactored element" description="Rename local variable 'excludedFilters'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~installInterestFilter~QStructuredViewer;@excludedFilters!14974!15033!14988!15002!QSet" name="excludedFilterClasses" references="true" stamp="1234309089116" version="1.0"/>
+<refactoring comment="Rename local variable 'excludedFilterClasses' in 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.installInterestFilter(...)' to 'preservedFilterClasses'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.installInterestFilter(StructuredViewer).excludedFilterClasses'
- Renamed element: 'excludedFilterClasses'
- Update references to refactored element" description="Rename local variable 'excludedFilterClasses'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~installInterestFilter~QStructuredViewer;@excludedFilterClasses!15552!15617!15566!15586!QSet" name="preservedFilterClasses" references="true" stamp="1234310374262" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.isCustomFilter(...)' to 'isPreservedFilter'
- Original project: 'org.eclipse.mylyn.context.ui'
- Original element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.isCustomFilter(...)'
- Renamed element: 'org.eclipse.mylyn.context.ui.AbstractFocusViewAction.isPreservedFilter(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isCustomFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.context.ui{AbstractFocusViewAction.java[AbstractFocusViewAction~isCustomFilter~QViewerFilter;" name="isPreservedFilter" references="true" stamp="1234314997161" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2009/2/7/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2009/2/7/refactorings.index
new file mode 100644
index 0000000..66c0498
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2009/2/7/refactorings.index
@@ -0,0 +1,3 @@
+1234309089116 Rename local variable 'excludedFilters'
+1234310374262 Rename local variable 'excludedFilterClasses'
+1234314997161 Rename method 'isCustomFilter'
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2009/3/10/refactorings.history b/org.eclipse.mylyn.context.ui/.refactorings/2009/3/10/refactorings.history
new file mode 100644
index 0000000..f86792d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2009/3/10/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private Object getObjectToRefresh(Object item)' from 'org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.FocusedViewerDelayedRefreshJob.doRefresh()' to 'org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.FocusedViewerDelayedRefreshJob'
- Original project: 'org.eclipse.mylyn.context.ui'
- Method name: 'getObjectToRefresh'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.FocusedViewerManager.FocusedViewerDelayedRefreshJob'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'getObjectToRefresh'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.context.ui{FocusedViewerManager.java" name="getObjectToRefresh" replace="true" selection="4861 396" stamp="1236293163840" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/.refactorings/2009/3/10/refactorings.index b/org.eclipse.mylyn.context.ui/.refactorings/2009/3/10/refactorings.index
new file mode 100644
index 0000000..37a6638
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.refactorings/2009/3/10/refactorings.index
@@ -0,0 +1 @@
+1236293163840 Extract method 'getObjectToRefresh'
diff --git a/org.eclipse.mylyn.context.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..88ef1a8
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Sat Jun 27 14:22:12 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.context.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.context.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.context.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.context.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.context.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.context.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..bb2302a
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.context.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.context.ui.ContextUiPlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.ui.navigator,
+ org.eclipse.ui.views,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.internal.context.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.context.ui.actions;x-internal:=true,
+ org.eclipse.mylyn.internal.context.ui.commands;x-internal:=true,
+ org.eclipse.mylyn.internal.context.ui.editors;x-internal:=true,
+ org.eclipse.mylyn.internal.context.ui.preferences;x-internal:=true,
+ org.eclipse.mylyn.internal.context.ui.views;x-internal:=true,
+ org.eclipse.mylyn.internal.context.ui.wizards;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: com.ibm.icu.text
diff --git a/org.eclipse.mylyn.context.ui/about.html b/org.eclipse.mylyn.context.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/build-user.xml b/org.eclipse.mylyn.context.ui/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/build.properties b/org.eclipse.mylyn.context.ui/build.properties
new file mode 100644
index 0000000..87f64a8
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = plugin.xml,\
+ icons/,\
+ plugin.properties,\
+ META-INF/,\
+ about.html,\
+ .
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/blank.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/blank.gif
new file mode 100644
index 0000000..45b7594
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/blank.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/bug-refresh.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/bug-refresh.gif
new file mode 100644
index 0000000..bb8538b
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/bug-refresh.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/bug.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/bug.gif
new file mode 100644
index 0000000..54525a7
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/bug.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/capture-pause.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/capture-pause.gif
new file mode 100644
index 0000000..98e7743
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/capture-pause.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/capture-resume.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/capture-resume.gif
new file mode 100644
index 0000000..40bf78e
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/capture-resume.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/color-palette.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/color-palette.gif
new file mode 100644
index 0000000..4c94527
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/color-palette.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/context-clear.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/context-clear.gif
new file mode 100644
index 0000000..cbb71be
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/context-clear.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/context-transfer.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/context-transfer.gif
new file mode 100644
index 0000000..0a97a2d
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/context-transfer.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/delete.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/delete.gif
new file mode 100644
index 0000000..b6922ac
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/delete.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/edge-inheritance.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-inheritance.gif
new file mode 100644
index 0000000..bf41cd7
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-inheritance.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/edge-read.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-read.gif
new file mode 100644
index 0000000..5feec34
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-read.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/edge-reference.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-reference.gif
new file mode 100644
index 0000000..9f1a284
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-reference.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/edge-write.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-write.gif
new file mode 100644
index 0000000..b438294
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/edge-write.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/file-xml.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/file-xml.gif
new file mode 100644
index 0000000..8af38f9
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/file-xml.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/file_obj.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/file_obj.gif
new file mode 100644
index 0000000..7ccc6a7
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/file_obj.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/fldr_obj.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/fldr_obj.gif
new file mode 100644
index 0000000..51e703b
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/fldr_obj.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/focus-disabled.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/focus.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/focus.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/import-zip.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/import-zip.gif
new file mode 100644
index 0000000..f3b6648
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/import-zip.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/interest-folding.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-folding.gif
new file mode 100644
index 0000000..360c475
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-folding.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/interest-landmark.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-landmark.gif
new file mode 100644
index 0000000..aad6ec2
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-landmark.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/interest-working-set.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-working-set.gif
new file mode 100644
index 0000000..9e3340d
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/interest-working-set.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/link-with-editor.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/link-with-editor.gif
new file mode 100644
index 0000000..068d4c9
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/link-with-editor.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/mylyn-overlay.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/mylyn-overlay.gif
new file mode 100644
index 0000000..0b145cb
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/mylyn-overlay.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/refresh.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/refresh.gif
new file mode 100644
index 0000000..17002ac
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/refresh.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/remove.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/remove.gif
new file mode 100644
index 0000000..2cd9c54
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/remove.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/stop_all-color.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/stop_all-color.gif
new file mode 100644
index 0000000..6d47276
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/stop_all-color.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/stop_all.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/stop_all.gif
new file mode 100644
index 0000000..ded722b
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/stop_all.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/synched.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/synched.gif
new file mode 100644
index 0000000..870934b
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/synched.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/elcl16/web-document.gif b/org.eclipse.mylyn.context.ui/icons/elcl16/web-document.gif
new file mode 100644
index 0000000..05a2053
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/elcl16/web-document.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/etool16/content-assist-separator.gif b/org.eclipse.mylyn.context.ui/icons/etool16/content-assist-separator.gif
new file mode 100644
index 0000000..25b1176
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/etool16/content-assist-separator.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/etool16/context-attach.gif b/org.eclipse.mylyn.context.ui/icons/etool16/context-attach.gif
new file mode 100644
index 0000000..bee8fc5
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/etool16/context-attach.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/etool16/context-retrieve.gif b/org.eclipse.mylyn.context.ui/icons/etool16/context-retrieve.gif
new file mode 100644
index 0000000..02a46c8
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/etool16/context-retrieve.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/etool16/qualify-names.gif b/org.eclipse.mylyn.context.ui/icons/etool16/qualify-names.gif
new file mode 100644
index 0000000..acbd9dc
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/etool16/qualify-names.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/etool16/wizard-feedback.gif b/org.eclipse.mylyn.context.ui/icons/etool16/wizard-feedback.gif
new file mode 100644
index 0000000..bd69c45
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/etool16/wizard-feedback.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/etool16/wizard-study.gif b/org.eclipse.mylyn.context.ui/icons/etool16/wizard-study.gif
new file mode 100644
index 0000000..936601c
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/etool16/wizard-study.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/eview16/active-search.gif b/org.eclipse.mylyn.context.ui/icons/eview16/active-search.gif
new file mode 100644
index 0000000..2cc3267
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/eview16/active-search.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/eview16/focus-disabled.gif b/org.eclipse.mylyn.context.ui/icons/eview16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/eview16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/eview16/focus-tasklist.gif b/org.eclipse.mylyn.context.ui/icons/eview16/focus-tasklist.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/eview16/focus-tasklist.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/eview16/focus.gif b/org.eclipse.mylyn.context.ui/icons/eview16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/eview16/focus.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/eview16/overlay-mylyn.gif b/org.eclipse.mylyn.context.ui/icons/eview16/overlay-mylyn.gif
new file mode 100644
index 0000000..0b145cb
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/eview16/overlay-mylyn.gif differ
diff --git a/org.eclipse.mylyn.context.ui/icons/wizban/banner-prefs.gif b/org.eclipse.mylyn.context.ui/icons/wizban/banner-prefs.gif
new file mode 100644
index 0000000..ce0f6e3
Binary files /dev/null and b/org.eclipse.mylyn.context.ui/icons/wizban/banner-prefs.gif differ
diff --git a/org.eclipse.mylyn.context.ui/plugin.properties b/org.eclipse.mylyn.context.ui/plugin.properties
new file mode 100644
index 0000000..cb7d2f6
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/plugin.properties
@@ -0,0 +1,54 @@
+###############################################################################
+# Copyright (c) 2004, 2005 Mylyn project committers 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
+###############################################################################
+Bundle-Name = Mylyn Context UI
+Bundle-Vendor = Eclipse Mylyn
+
+InterestDecrementAction.label = Mark Less Interesting
+InterestDecrementAction.tooltip = Mark selected element as uninteresting
+InterestIncrementAction.label = Mark as Landmark
+InterestIncrementAction.tooltip = Make selected element a landmark
+#ContextRetrieveAction.label = Retrieve Context
+
+ContextUiPreferencePage.name = Context
+
+keywords.label = mylyn context focus focused
+
+actionSet.label = Task Context
+actionSet.description = Task Context
+OpenQuickContextPopupDialogAction.label = Quick Context View
+
+commands.category.description = Task-Focused Interface
+commands.category.name = Focused UI
+commands.interest.increment.description = Make Landmark
+commands.interest.increment.name = Make Landmark
+commands.interest.decrement.description = Make Less Interesting
+commands.interest.decrement.name = Make Less Interesting
+commands.open.context.dialog.description = Show Context Quick View
+commands.open.context.dialog.name = Show Context Quick View
+commands.FocusViewHandler.name = Focus View
+commands.FocusViewHandler.commandParameter.name = View ID to Focus
+commands.task.attachContext.name = Attach Context
+commands.task.retrieveContext.name = Retrieve Context
+commands.task.copyContext.name = Copy Context
+commands.task.clearContext.name = Clear Context
+commands.attachment.retrieveContext.name = Retrieve Context Attachment
+
+InterestDecoratorLightweight.label = Task Context Decorator
+InterestDecoratorLightweight.description = Decorates the labels of elements to indicate whether they are a part of the task context.
+
+FocusTaskListAction.label = Focus on Workweek
+FocusTaskListAction.tooltip = Focus on Workweek
+FocusOutlineAction.label = Focus on Active Task
+FocusOutlineAction.tooltip = Focus on Active Task (Alt+click to reveal filtered elements)
+
+menu.task.context.label = Context
+commands.task.attachContext.label = Attach...
+commands.task.retrieveContext.label = Retrieve...
+commands.task.copyContext.label = Copy to...
+commands.task.clearContext.label = Clear
+commands.attachment.retrieveContext.label = Retrieve Context
diff --git a/org.eclipse.mylyn.context.ui/plugin.xml b/org.eclipse.mylyn.context.ui/plugin.xml
new file mode 100644
index 0000000..4ea30d2
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/plugin.xml
@@ -0,0 +1,557 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="bridges" name="bridges" schema="schema/bridges.exsd"/>
+ <extension-point id="startup" name="Context UI Startup" schema="schema/startup.exsd"/>
+
+ <extension
+ point="org.eclipse.mylyn.context.core.bridges">
+ <structureBridge
+ class="org.eclipse.mylyn.internal.context.ui.TaskStructureBridge"/>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.context.ui.bridges">
+ <uiBridge
+ class="org.eclipse.mylyn.internal.context.ui.TaskUiBridge"
+ contentType="meta/task"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.editors">
+ <pageFactory
+ id="org.eclipse.mylyn.context.ui.pageFactory.Context"
+ class="org.eclipse.mylyn.internal.context.ui.editors.ContextPageFactory"/>
+ </extension>
+
+ <extension point = "org.eclipse.ui.popupMenus">
+ <objectContribution
+ id="org.eclipse.mylyn.context.ui.actions.interest.contribution"
+ objectClass="org.eclipse.mylyn.context.core.IInteractionElement">
+ <!-- TODO 3.1: remove? -->
+ <action
+ label="%InterestDecrementAction.label"
+ tooltip="%InterestDecrementAction.tooltip"
+ menubarPath="additions"
+ id="org.eclipse.mylyn.context.ui.actions.interest.decrement"
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestDecrementAction"
+ icon="icons/elcl16/interest-decrease.gif"
+ enablesFor="*"/>
+ <action
+ label="%InterestIncrementAction.label"
+ tooltip="%InterestIncrementAction.tooltip"
+ menubarPath="additions"
+ id="org.eclipse.mylyn.context.ui.actions.interest.increment"
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestIncrementAction"
+ icon="icons/elcl16/interest-increase.gif"
+ enablesFor="*"/>
+ </objectContribution>
+
+ <!--
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.context.ui.tasks.contribution"
+ objectClass="org.eclipse.mylyn.internal.tasks.core.AbstractTask">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.ContextClearAction"
+ enablesFor="1"
+ icon="icons/elcl16/context-clear.gif"
+ id="org.eclipse.mylyn.context.ui.task.clear"
+ label="Clear Context"
+ menubarPath="context"
+ tooltip="Clear Context">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.ContextCopyAction"
+ icon="icons/elcl16/context-transfer.gif"
+ id="org.eclipse.mylyn.context.ui.task.copy.context.to"
+ label="Copy Context to..."
+ menubarPath="context"
+ tooltip="Copy Context to...">
+ </action>
+ </objectContribution>
+ -->
+
+ <!--
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.ui.tasks.repository.hits..action.contribution"
+ objectClass="org.eclipse.mylyn.internal.tasks.core.AbstractTask">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.ContextRetrieveAction"
+ enablesFor="1"
+ icon="icons/etool16/context-retrieve.gif"
+ id="org.eclipse.mylyn.context.ui.repository.task.retrieve"
+ label="Retrieve Context..."
+ menubarPath="context">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.ContextAttachAction"
+ enablesFor="1"
+ icon="icons/etool16/context-attach.gif"
+ id="org.eclipse.mylyn.context.ui.repository.task.attach"
+ label="Attach Context..."
+ menubarPath="context">
+ </action>
+ </objectContribution>
+ -->
+ </extension>
+
+ <!-- See org.eclipse.mylyn.tasks.ui/plugin.xml -->
+ <extension
+ point="org.eclipse.mylyn.context.ui.bridges">
+ <preservedFilters
+ viewId="org.eclipse.ui.navigator.ProjectExplorer">
+ <filter
+ id="org.eclipse.mylyn.tasks.ui.navigator.filters.tasks">
+ </filter>
+ </preservedFilters>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ name="%ContextUiPreferencePage.name"
+ class="org.eclipse.mylyn.internal.context.ui.preferences.ContextUiPreferencePage"
+ id="org.eclipse.mylyn.context.ui.preferences"
+ category="org.eclipse.mylyn.tasks.ui.preferences">
+ <keywordReference id="org.eclipse.mylyn.context.ui.keywords"/>
+ </page>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.keywords">
+ <keyword
+ label="%keywords.label"
+ id="org.eclipse.mylyn.context.ui.keywords"/>
+ </extension>
+
+ <!-- ==================== Common Navigator ==================== -->
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+ <!--
+ <viewer
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context">
+ <popupMenu
+ allowsPlatformContributions="false"
+ id="org.eclipse.mylyn.context.ui.navigator.context#PopupMenu">
+ <insertionPoint name="group.new"/>
+ <insertionPoint
+ name="group.open"
+ separator="true"/>
+ <insertionPoint
+ name="group.openWith"/>
+ <insertionPoint
+ name="additions"
+ separator="true"/>
+ <insertionPoint
+ name="group.port"
+ separator="true"/>
+ <insertionPoint
+ name="group.properties"
+ separator="true"/>
+ </popupMenu>
+ </viewer>
+ -->
+ <viewerContentBinding
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context">
+ <includes>
+ <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
+ </includes>
+ </viewerContentBinding>
+
+ <viewerContentBinding
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context.quick">
+ <includes>
+ <contentExtension pattern="org.eclipse.ui.navigator.resourceContent"/>
+ </includes>
+ </viewerContentBinding>
+
+ <viewerActionBinding
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context">
+ <includes>
+ <actionExtension pattern="org.eclipse.ui.navigator.resources.*" />
+ </includes>
+ </viewerActionBinding>
+ </extension>
+
+ <!-- ==================== Actions ==================== -->
+
+ <extension
+ point="org.eclipse.ui.actionSets">
+ <actionSet
+ label="%actionSet.label"
+ description="%actionSet.description"
+ visible="true"
+ id="org.eclipse.mylyn.context.ui.actionSet">
+ <!--
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestDecrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.decrement"
+ icon="icons/elcl16/interest-decrease.gif"
+ id="org.eclipse.mylyn.context.ui.actions.interest.decrement"
+ label="Mark Less Interesting"
+ menubarPath="navigate/open.ext2">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestIncrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.increment"
+ icon="icons/elcl16/interest-increase.gif"
+ id="org.eclipse.mylyn.context.ui.actions.interest.increment"
+ label="Mark as Landmark"
+ menubarPath="navigate/open.ext2">
+ </action>
+ -->
+ <action
+ definitionId="org.eclipse.mylyn.context.ui.commands.open.context.dialog"
+ label="%OpenQuickContextPopupDialogAction.label"
+ class="org.eclipse.mylyn.internal.context.ui.actions.OpenQuickContextPopupDialogAction"
+ menubarPath="navigate/showIn"
+ id="org.eclipse.mylyn.context.ui.actions.open.context.dialog">
+ </action>
+ </actionSet>
+ </extension>
+
+ <extension point="org.eclipse.ui.commands">
+ <category
+ name="%commands.category.name"
+ description="%commands.category.description"
+ id="org.eclipse.mylyn.context.ui.commands">
+ </category>
+ <command
+ name="%commands.interest.increment.name"
+ description="%commands.interest.increment.description"
+ id="org.eclipse.mylyn.context.ui.commands.interest.increment"
+ categoryId="org.eclipse.mylyn.context.ui.commands">
+ </command>
+ <command
+ name="%commands.interest.decrement.name"
+ description="%commands.interest.decrement.description"
+ id="org.eclipse.mylyn.context.ui.commands.interest.decrement"
+ categoryId="org.eclipse.mylyn.context.ui.commands">
+ </command>
+ <command
+ name="%commands.open.context.dialog.name"
+ description="%commands.open.context.dialog.description"
+ id="org.eclipse.mylyn.context.ui.commands.open.context.dialog"
+ categoryId="org.eclipse.mylyn.context.ui.commands">
+ </command>
+ <command
+ defaultHandler="org.eclipse.mylyn.internal.context.ui.commands.FocusViewHandler"
+ id="org.eclipse.mylyn.context.ui.commands.focus.view"
+ name="%commands.FocusViewHandler.name">
+ <commandParameter
+ id="viewId"
+ name="%commands.FocusViewHandler.commandParameter.name"
+ optional="false">
+ </commandParameter>
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.context.ui.commands"
+ id="org.eclipse.mylyn.context.ui.commands.task.attachContext"
+ name="%commands.task.attachContext.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.context.ui.commands"
+ id="org.eclipse.mylyn.context.ui.commands.task.retrieveContext"
+ name="%commands.task.retrieveContext.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.context.ui.commands"
+ id="org.eclipse.mylyn.context.ui.commands.task.copyContext"
+ name="%commands.task.copyContext.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.context.ui.commands"
+ id="org.eclipse.mylyn.context.ui.commands.task.clearContext"
+ name="%commands.task.clearContext.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.context.ui.commands"
+ id="org.eclipse.mylyn.context.ui.commands.attachment.retrieveContext"
+ name="%commands.attachment.retrieveContext.name">
+ </command>
+ </extension>
+
+ <extension point="org.eclipse.ui.bindings">
+ <key
+ sequence="M1+M2+M3+ARROW_UP"
+ commandId="org.eclipse.mylyn.context.ui.commands.interest.increment"
+ schemeId ="org.eclipse.ui.defaultAcceleratorConfiguration">
+ </key>
+ <key
+ sequence="M1+M2+M3+ARROW_DOWN"
+ commandId="org.eclipse.mylyn.context.ui.commands.interest.decrement"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+ </key>
+ <key
+ sequence="M1+M2+M3+ARROW_RIGHT"
+ commandId="org.eclipse.mylyn.context.ui.commands.open.context.dialog"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+ </key>
+ </extension>
+
+ <extension point="org.eclipse.ui.decorators">
+ <decorator
+ lightweight="true"
+ label="%InterestDecoratorLightweight.label"
+ class="org.eclipse.mylyn.internal.context.ui.InterestDecoratorLightweight"
+ state="true"
+ id="org.eclipse.mylyn.context.ui.decorator.interest">
+ <description>
+ %InterestDecoratorLightweight.description
+ </description>
+ <enablement>
+ <objectClass name="java.lang.Object"/>
+ </enablement>
+ </decorator>
+ </extension>
+
+ <extension point="org.eclipse.ui.viewActions">
+ <viewContribution
+ id="org.eclipse.mylyn.context.ui.taskList.contribution"
+ targetID="org.eclipse.mylyn.tasks.ui.views.tasks">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.FocusTaskListAction"
+ enablesFor="*"
+ icon="icons/eview16/focus-tasklist.gif"
+ id="org.eclipse.mylyn.context.ui.actions.tasklist.focus"
+ label="%FocusTaskListAction.label"
+ menubarPath="additions"
+ style="toggle"
+ toolbarPath="context"
+ tooltip="%FocusTaskListAction.tooltip"/>
+ </viewContribution>
+ <viewContribution
+ id="org.eclipse.mylyn.context.ui.outline.contribution"
+ targetID="org.eclipse.ui.views.ContentOutline">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.FocusOutlineAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.context.ui.contentOutline.focus"
+ label="%FocusOutlineAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusOutlineAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.popup.any?after=operations">
+ <menu
+ id="org.eclipse.mylyn.context.ui.menu.task.context"
+ label="%menu.task.context.label">
+ <visibleWhen
+ checkEnabled="false">
+ <or>
+ <with
+ variable="activeMenuSelection">
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapt>
+ </iterate>
+ </and>
+ </with>
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapt>
+ </iterate>
+ </and>
+ </or>
+ </visibleWhen>
+ <separator
+ name="group.repository"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.mylyn.context.ui.commands.task.attachContext"
+ icon="icons/etool16/context-attach.gif"
+ label="%commands.task.attachContext.label"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.mylyn.context.ui.commands.task.retrieveContext"
+ icon="icons/etool16/context-retrieve.gif"
+ label="%commands.task.retrieveContext.label"
+ style="push">
+ </command>
+ <separator
+ name="group.local"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.mylyn.context.ui.commands.task.copyContext"
+ icon="icons/elcl16/context-transfer.gif"
+ label="%commands.task.copyContext.label"
+ style="push">
+ </command>
+ <command
+ commandId="org.eclipse.mylyn.context.ui.commands.task.clearContext"
+ icon="icons/elcl16/context-clear.gif"
+ label="%commands.task.clearContext.label"
+ style="push">
+ </command>
+ <separator
+ name="additions">
+ </separator>
+ </menu>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.popup.any?after=additions">
+ <command
+ commandId="org.eclipse.mylyn.context.ui.commands.attachment.retrieveContext"
+ icon="icons/etool16/context-retrieve.gif"
+ label="%commands.attachment.retrieveContext.label"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITaskAttachment">
+ <test
+ property="org.eclipse.mylyn.task.attachment.isContext"
+ value="true">
+ </test>
+ </adapt>
+ </iterate>
+ </and>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.mylyn.internal.context.ui.commands.AttachContextHandler"
+ commandId="org.eclipse.mylyn.context.ui.commands.task.attachContext">
+ <enabledWhen>
+ <with
+ variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.canPostAttachment"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextHandler"
+ commandId="org.eclipse.mylyn.context.ui.commands.task.retrieveContext">
+ <enabledWhen>
+ <with
+ variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.canPostAttachment"
+ value="true">
+ </test>
+ <test
+ property="org.eclipse.mylyn.task.hasRepositoryContext"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.context.ui.commands.CopyContextHandler"
+ commandId="org.eclipse.mylyn.context.ui.commands.task.copyContext">
+ <enabledWhen>
+ <with
+ variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.hasLocalContext"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.context.ui.commands.ClearContextHandler"
+ commandId="org.eclipse.mylyn.context.ui.commands.task.clearContext">
+ <enabledWhen>
+ <with
+ variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.hasLocalContext"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </with>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler"
+ commandId="org.eclipse.mylyn.context.ui.commands.attachment.retrieveContext">
+ <enabledWhen>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <and>
+ <instanceof
+ value="org.eclipse.mylyn.tasks.core.ITaskAttachment">
+ </instanceof>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.context.ui/schema/bridges.exsd b/org.eclipse.mylyn.context.ui/schema/bridges.exsd
new file mode 100644
index 0000000..e85460e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/schema/bridges.exsd
@@ -0,0 +1,202 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.context.ui.bridges" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.context.ui.bridges" id="bridges" name="bridges"/>
+ </appInfo>
+ <documentation>
+ UI Bridges connect the UI of domain-specific tool, such as the JDT, to the generic context model UI. For more information please see: http://wiki.eclipse.org/index.php/Mylyn_Integrator_Reference#Context_API
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="uiBridge" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="labelProvider" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="preservedFilters" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="uiBridge">
+ <complexType>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.context.ui.AbstractContextUiBridge"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="contentType" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="activeSearchIcon" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="activeSearchLabel" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="labelProvider">
+ <annotation>
+ <appInfo>
+ <meta.element deprecated="true"/>
+ </appInfo>
+ </annotation>
+ <complexType>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.jface.viewers.ILabelProvider"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="contentType" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="preservedFilters">
+ <complexType>
+ <sequence>
+ <element ref="filter" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="viewId" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="filter">
+ <complexType>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.jface.viewers.ViewerFilter"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+ Specify either a class or an id, not both. NOTE: the id mode will only work for commonFilter extensions where you specify a filterExpression.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+
+
+
+
+</schema>
diff --git a/org.eclipse.mylyn.context.ui/schema/startup.exsd b/org.eclipse.mylyn.context.ui/schema/startup.exsd
new file mode 100644
index 0000000..ba8562b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/schema/startup.exsd
@@ -0,0 +1,96 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.context.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.context.ui" id="startup" name="Context UI Startup"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="startup"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="startup">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.mylyn.context.ui.IContextUiStartup"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractAutoFocusViewAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractAutoFocusViewAction.java
new file mode 100644
index 0000000..d9fbebd
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractAutoFocusViewAction.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Extend to focus a view on task context, e.g. the filtering and expansion of a tree view such as the Package Explorer.
+ * A structure bridge should be implemented or reused to determine the degree-of-interest of elements in the view.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractAutoFocusViewAction extends AbstractFocusViewAction {
+
+ private boolean initialized = false;
+
+ private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void contextActivated(IInteractionContext context) {
+ if (ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS)) {
+ AbstractAutoFocusViewAction.super.internalSuppressExpandAll = true;
+ AbstractAutoFocusViewAction.super.update(true);
+ } else {
+ AbstractAutoFocusViewAction.super.internalSuppressExpandAll = true;
+ AbstractAutoFocusViewAction.super.update(false);
+ }
+ }
+ };
+
+ public AbstractAutoFocusViewAction(InterestFilter interestFilter, boolean manageViewer, boolean manageFilters,
+ boolean manageLinking) {
+ super(interestFilter, manageViewer, manageFilters, manageLinking);
+ super.showEmptyViewMessage = true;
+ ContextCore.getContextManager().addListener(CONTEXT_LISTENER);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ ContextCore.getContextManager().removeListener(CONTEXT_LISTENER);
+ }
+
+ @Override
+ public void init(IViewPart view) {
+ super.init(view);
+ configureAction();
+ }
+
+ @Override
+ public void init(IAction action) {
+ super.init(action);
+ configureAction();
+ }
+
+ private void configureAction() {
+ if (initialized) {
+ return;
+ }
+ initialized = true;
+
+ // can not run this until the view has been initialized
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ @SuppressWarnings("deprecation")
+ public void run() {
+ try {
+ if (ContextCore.getContextManager().isContextActive()
+ && ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS)) {
+ internalSuppressExpandAll = true;
+ update(true);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not toggle focus action on view: " + getPartForAction(), e)); //$NON-NLS-1$
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractContextUiBridge.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractContextUiBridge.java
new file mode 100644
index 0000000..eda0e5b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractContextUiBridge.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.List;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * Extend to bridge between a tool's UI and the generic facilities invoked by the Context UI.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractContextUiBridge {
+
+ public abstract void open(IInteractionElement element);
+
+ public abstract void close(IInteractionElement element);
+
+ public abstract boolean acceptsEditor(IEditorPart editorPart);
+
+ public abstract IInteractionElement getElement(IEditorInput input);
+
+ /**
+ * Note that a single editor part can correspond to multipe outlines (e.g. the PDE manifest editor).
+ *
+ * @return an empty list if none
+ */
+ public abstract List<TreeViewer> getContentOutlineViewers(IEditorPart editorPart);
+
+ public abstract Object getObjectForTextSelection(TextSelection selection, IEditorPart editor);
+
+ public abstract String getContentType();
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractFocusViewAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractFocusViewAction.java
new file mode 100644
index 0000000..40af108
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/AbstractFocusViewAction.java
@@ -0,0 +1,577 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.Messages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Extending this class makes it possible to apply Mylyn management to a structured view (e.g. to provide interest-based
+ * filtering).
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractFocusViewAction extends Action implements IViewActionDelegate, IActionDelegate2,
+ ISelectionListener {
+
+ public static final String PREF_ID_PREFIX = "org.eclipse.mylyn.ui.interest.filter."; //$NON-NLS-1$
+
+ private static Map<IViewPart, AbstractFocusViewAction> partMap = new WeakHashMap<IViewPart, AbstractFocusViewAction>();
+
+ protected String globalPrefId;
+
+ protected IAction initAction = null;
+
+ protected final InterestFilter interestFilter;
+
+ protected IViewPart viewPart;
+
+ protected Map<StructuredViewer, List<ViewerFilter>> previousFilters = new WeakHashMap<StructuredViewer, List<ViewerFilter>>();
+
+ private final boolean manageViewer;
+
+ private final boolean manageFilters;
+
+ private final boolean manageLinking;
+
+ private boolean wasLinkingEnabled = false;
+
+ private boolean wasRun = false;
+
+ private Set<Class<?>> cachedPreservedFilters;
+
+ /**
+ * Work-around for suppressing expansion without breaking API. Will be remove post 3.0
+ */
+ @Deprecated
+ protected boolean internalSuppressExpandAll = false;
+
+ /**
+ * @since 3.0
+ */
+ protected boolean showEmptyViewMessage = false;
+
+ private final Map<StructuredViewer, EmptyContextDrawer> viewerToDrawerMap = new HashMap<StructuredViewer, EmptyContextDrawer>();
+
+ private class EmptyContextDrawer implements Listener {
+
+ private final String LABEL = getEmptyViewMessage();
+
+ private final Image IMAGE = CommonImages.getImage(TasksUiImages.CONTEXT_FOCUS);
+
+ private final Tree tree;
+
+ EmptyContextDrawer(Tree tree) {
+ this.tree = tree;
+ }
+
+ public void handleEvent(Event event) {
+ if (tree != null && tree.getItemCount() == 0) {
+ switch (event.type) {
+ case SWT.Paint: {
+ int offset = 7;
+ event.gc.drawImage(IMAGE, offset, offset);
+ event.gc.drawText(LABEL, offset + IMAGE.getBounds().width + 5, offset);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ if (updateEnablementWithContextActivation()) {
+ updateEnablement(initAction);
+ }
+ break;
+ case DEACTIVATED:
+ if (updateEnablementWithContextActivation()) {
+ updateEnablement(initAction);
+ update(false);
+ }
+ break;
+ }
+ };
+ };
+
+ private final IWorkbenchListener WORKBENCH_LISTENER = new IWorkbenchListener() {
+
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ // restore the viewers' previous state
+ if (wasRun && manageLinking) {
+ setDefaultLinkingEnabled(wasLinkingEnabled);
+ }
+
+ List<StructuredViewer> viewers = getViewers();
+ Set<Class<?>> excludedFilters = getPreservedFilterClasses(false);
+ for (StructuredViewer viewer : viewers) {
+ if (previousFilters.containsKey(viewer)) {
+ for (ViewerFilter filter : previousFilters.get(viewer)) {
+ if (!excludedFilters.contains(filter.getClass())) {
+ try {
+ viewer.addFilter(filter);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Failed to restore filter: " + filter, t)); //$NON-NLS-1$
+ }
+ }
+ }
+ previousFilters.remove(viewer);
+ }
+ }
+ return true;
+ }
+
+ public void postShutdown(IWorkbench workbench) {
+ // ignore
+ }
+ };
+
+ /**
+ * TODO: not thread safe.
+ */
+ public static AbstractFocusViewAction getActionForPart(IViewPart part) {
+ return partMap.get(part);
+ }
+
+ public IViewPart getPartForAction() {
+ if (viewPart == null) {
+ if (this instanceof IWorkbenchWindowActionDelegate) {
+ if (!PlatformUI.getWorkbench().isClosing()) {
+ // ignore, could be called from the Configure Perspective dialog, see bug 2308532
+ }
+ } else {
+ throw new RuntimeException("error: viewPart is null"); //$NON-NLS-1$
+ }
+ }
+ return viewPart;
+ }
+
+ public AbstractFocusViewAction(InterestFilter interestFilter, boolean manageViewer, boolean manageFilters,
+ boolean manageLinking) {
+ super();
+ this.interestFilter = interestFilter;
+ this.manageViewer = manageViewer;
+ this.manageFilters = manageFilters;
+ this.manageLinking = manageLinking;
+ setText(Messages.AbstractFocusViewAction_Apply_Mylyn);
+ setToolTipText(Messages.AbstractFocusViewAction_Apply_Mylyn);
+ setImageDescriptor(TasksUiImages.CONTEXT_FOCUS);
+ PlatformUI.getWorkbench().addWorkbenchListener(WORKBENCH_LISTENER);
+ ContextCore.getContextManager().addListener(CONTEXT_LISTENER);
+ }
+
+ public void dispose() {
+ partMap.remove(getPartForAction());
+ if (viewPart != null && !PlatformUI.getWorkbench().isClosing()) {
+ for (StructuredViewer viewer : getViewers()) {
+ ContextUiPlugin.getViewerManager().removeManagedViewer(viewer, viewPart);
+ }
+ }
+
+ MonitorUi.removeWindowPostSelectionListener(this);
+ ContextCore.getContextManager().removeListener(CONTEXT_LISTENER);
+ PlatformUI.getWorkbench().removeWorkbenchListener(WORKBENCH_LISTENER);
+ }
+
+ public void init(IAction action) {
+ initAction = action;
+ initAction.setChecked(action.isChecked());
+ }
+
+ public void init(IViewPart view) {
+ String id = view.getSite().getId();
+ globalPrefId = PREF_ID_PREFIX + id;
+ viewPart = view;
+ partMap.put(view, this);
+ wasLinkingEnabled = isDefaultLinkingEnabled();
+ }
+
+ protected boolean updateEnablementWithContextActivation() {
+ return true;
+ }
+
+ public void run(IAction action) {
+ setChecked(action.isChecked());
+ valueChanged(action, action.isChecked(), true);
+ wasRun = true;
+ }
+
+ public void runWithEvent(IAction action, Event event) {
+ run(action);
+ }
+
+ /**
+ * Don't update if the preference has not been initialized.
+ */
+ public void update() {
+ if (globalPrefId != null) {
+ update(ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(globalPrefId));
+ }
+ }
+
+ /**
+ * This operation is expensive.
+ */
+ public void update(boolean on) {
+ valueChanged(initAction, on, false);
+ updateEnablement(initAction);
+ }
+
+ protected void valueChanged(IAction action, final boolean on, boolean store) {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return;
+ }
+
+ boolean wasPaused = ContextCore.getContextManager().isContextCapturePaused();
+ try {
+ if (!wasPaused) {
+ ContextCore.getContextManager().setContextCapturePaused(true);
+ }
+ setChecked(on);
+ if (action != null) {
+ action.setChecked(on);
+ }
+ if (store && ContextCorePlugin.getDefault() != null) {
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(globalPrefId, on);
+ }
+
+ List<StructuredViewer> viewers = getViewers();
+ for (StructuredViewer viewer : viewers) {
+ if (viewPart != null && !viewer.getControl().isDisposed() && manageViewer) {
+ ContextUiPlugin.getViewerManager().addManagedViewer(viewer, viewPart);
+ }
+ updateInterestFilter(on, viewer);
+ }
+
+ setManualFilteringAndLinkingEnabled(!on);
+ if (manageLinking) {
+ updateLinking(on);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not install viewer manager on: " + globalPrefId, t)); //$NON-NLS-1$
+ } finally {
+ if (!wasPaused) {
+ ContextCore.getContextManager().setContextCapturePaused(false);
+ }
+ }
+ }
+
+ protected void updateEnablement(IAction action) {
+ if (updateEnablementWithContextActivation()) {
+ if (action != null) {
+ action.setEnabled(ContextCore.getContextManager().isContextActivePropertySet());
+ }
+ }
+ }
+
+ private void updateLinking(boolean on) {
+ if (on) {
+ wasLinkingEnabled = isDefaultLinkingEnabled();
+ MonitorUi.addWindowPostSelectionListener(this);
+ } else {
+ MonitorUi.removeWindowPostSelectionListener(this);
+ setDefaultLinkingEnabled(wasLinkingEnabled);
+ }
+ }
+
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (manageLinking && selection instanceof ITextSelection && part instanceof IEditorPart) {
+ try {
+ List<StructuredViewer> viewers = getViewers();
+ if (viewers.size() == 1) {
+ StructuredViewer viewer = getViewers().get(0);
+ ITextSelection textSelection = (ITextSelection) selection;
+ ISelection toSelect = resolveSelection((IEditorPart) part, textSelection, viewer);
+ if (toSelect != null) {
+ ISelection currentSelection = viewer.getSelection();
+ if (!toSelect.equals(currentSelection)) {
+ select(viewer, toSelect);
+ }
+ }
+ // NOTE: if we could make the code below work we could set the selection the first time the elment is shown
+// boolean canSelectElement = true;
+// if (viewer instanceof TreeViewer) {
+// TreeViewer treeViewer = (TreeViewer) viewer;
+// Object[] expanded = treeViewer.getExpandedElements();
+// canSelectElement = false;
+// if (Arrays.asList(expanded).contains(((StructuredSelection) toSelect).getFirstElement())) {
+// canSelectElement = true;
+// }
+// }
+ }
+ } catch (Throwable t) {
+ // ignore, linking failure is not fatal
+ }
+ }
+ }
+
+ protected void select(StructuredViewer viewer, ISelection selection) {
+ viewer.setSelection(selection, true);
+ }
+
+ /**
+ * Override to provide managed linking
+ */
+ protected ISelection resolveSelection(IEditorPart part, ITextSelection selection, StructuredViewer viewer)
+ throws CoreException {
+ return null;
+ }
+
+ /**
+ * Override to provide managed linking
+ */
+ protected void setDefaultLinkingEnabled(boolean on) {
+ // ignore
+ }
+
+ /**
+ * Override to provide managed linking
+ */
+ protected boolean isDefaultLinkingEnabled() {
+ return false;
+ }
+
+ protected void setManualFilteringAndLinkingEnabled(boolean on) {
+ // ignore
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ updateEnablement(action);
+ }
+
+ /**
+ * Public for testing
+ */
+ public void updateInterestFilter(final boolean on, StructuredViewer viewer) {
+ if (viewer != null) {
+ if (on) {
+ if (showEmptyViewMessage && viewer instanceof TreeViewer) {
+ Tree tree = ((TreeViewer) viewer).getTree();
+ Listener drawingListener = viewerToDrawerMap.get(viewer);
+ if (drawingListener == null) {
+ EmptyContextDrawer drawer = new EmptyContextDrawer(tree);
+ viewerToDrawerMap.put(viewer, drawer);
+ tree.addListener(SWT.Paint, drawer);
+ }
+ }
+
+ installInterestFilter(viewer);
+ ContextUiPlugin.getViewerManager().addFilteredViewer(viewer);
+ } else {
+ if (showEmptyViewMessage && viewer instanceof TreeViewer) {
+ Tree tree = ((TreeViewer) viewer).getTree();
+ EmptyContextDrawer drawer = viewerToDrawerMap.remove(viewer);
+ if (drawer != null) {
+ tree.removeListener(SWT.Paint, drawer);
+ }
+ }
+ ContextUiPlugin.getViewerManager().removeFilteredViewer(viewer);
+ uninstallInterestFilter(viewer);
+ }
+ }
+ }
+
+ /**
+ * Public for testing
+ */
+ public abstract List<StructuredViewer> getViewers();
+
+ /**
+ * @return filters that should not be removed when the interest filter is installed
+ */
+ private Set<Class<?>> getPreservedFilterClasses(boolean cacheFilters) {
+ if (ContextUiPlugin.getDefault() == null || viewPart == null) {
+ return Collections.emptySet();
+ }
+ if (cachedPreservedFilters == null && cacheFilters) {
+ try {
+ cachedPreservedFilters = ContextUiPlugin.getDefault().getPreservedFilterClasses(
+ viewPart.getSite().getId());
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not determine preserved filters", e)); //$NON-NLS-1$
+ }
+ }
+
+ if (cachedPreservedFilters != null) {
+ return cachedPreservedFilters;
+ } else {
+ // fall back for if the preserved filters have never been cached or there was a problem getting them from context core
+ return Collections.emptySet();
+ }
+ }
+
+ protected boolean installInterestFilter(StructuredViewer viewer) {
+ if (viewer == null) {
+ // FIXME Assert.isNotNull(viewer)
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "The viewer to install interest filter is null", new Exception())); //$NON-NLS-1$
+ return false;
+ } else if (viewer.getControl().isDisposed() && manageViewer) {
+ // TODO: do this with part listener, not lazily?
+ return false;
+ } else if (previousFilters.containsKey(viewer)) {
+ // install has already run, this can happen if AbstractAutoFocusViewAction.init() executes
+ // initialization asynchronously
+ return false;
+ }
+
+ try {
+ viewer.getControl().setRedraw(false);
+ previousFilters.put(viewer, Arrays.asList(viewer.getFilters()));
+
+ if (viewPart != null && manageFilters) {
+ Set<ViewerFilter> toAdd = new HashSet<ViewerFilter>();
+ Set<Class<?>> preservedFilterClasses = getPreservedFilterClasses(true);
+
+ for (ViewerFilter filter : previousFilters.get(viewer)) {
+ if (preservedFilterClasses.contains(filter.getClass()) || isPreservedFilter(filter)) {
+ toAdd.add(filter);
+ }
+ }
+
+ toAdd.add(interestFilter);
+ viewer.setFilters(toAdd.toArray(new ViewerFilter[toAdd.size()]));
+ } else {
+ viewer.addFilter(interestFilter);
+ }
+
+ if (viewer instanceof TreeViewer && !internalSuppressExpandAll) {
+ ((TreeViewer) viewer).expandAll();
+ }
+ return true;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not install viewer filter on: " + globalPrefId, t)); //$NON-NLS-1$
+ } finally {
+ viewer.getControl().setRedraw(true);
+ internalSuppressExpandAll = false;
+ }
+ return false;
+ }
+
+ /**
+ * Subclasses can provide additional viewer filters that should not be removed when focusing.
+ *
+ * @since 3.1
+ */
+ protected boolean isPreservedFilter(ViewerFilter filter) {
+ return false;
+ }
+
+ protected void uninstallInterestFilter(StructuredViewer viewer) {
+ if (viewer == null) {
+ // FIXME Assert.isNotNull(viewer)
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "The viewer to uninstall interest filter is null", new Exception())); //$NON-NLS-1$
+ return;
+ } else if (viewer.getControl().isDisposed()) {
+ // TODO: do this with part listener, not lazily?
+ ContextUiPlugin.getViewerManager().removeManagedViewer(viewer, viewPart);
+ return;
+ }
+
+ try {
+ viewer.getControl().setRedraw(false);
+
+ List<ViewerFilter> restoreFilters = previousFilters.remove(viewer);
+ if (restoreFilters != null && viewPart != null && manageFilters) {
+ // install all previous filters and all current filters
+ Set<ViewerFilter> filters = new HashSet<ViewerFilter>(restoreFilters);
+ filters.addAll(Arrays.asList(viewer.getFilters()));
+ // ensure that all interest filters are removed
+ for (Iterator<ViewerFilter> it = filters.iterator(); it.hasNext();) {
+ if (it.next() instanceof InterestFilter) {
+ it.remove();
+ }
+ }
+ viewer.setFilters(filters.toArray(new ViewerFilter[filters.size()]));
+ }
+ viewer.removeFilter(interestFilter);
+ interestFilter.resetTemporarilyUnfiltered();
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not uninstall interest viewer filter on: " + globalPrefId, t)); //$NON-NLS-1$
+ } finally {
+ viewer.getControl().setRedraw(true);
+ }
+ }
+
+ public String getGlobalPrefId() {
+ return globalPrefId;
+ }
+
+ /**
+ * For testing.
+ */
+ public InterestFilter getInterestFilter() {
+ return interestFilter;
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected String getEmptyViewMessage() {
+ return Messages.AbstractFocusViewAction_Empty_task_context;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/ContextUi.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/ContextUi.java
new file mode 100644
index 0000000..44a4019
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/ContextUi.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.ui.ColorMap;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public final class ContextUi {
+
+ /**
+ * @return the corresponding adapter if found, or an adapter with no behavior otherwise (so null is never returned)
+ */
+ public static AbstractContextUiBridge getUiBridge(String contentType) {
+ return ContextUiPlugin.getDefault().getUiBridge(contentType);
+ }
+
+ /**
+ * TODO: cache this to improve performance?
+ */
+ public static AbstractContextUiBridge getUiBridgeForEditor(IEditorPart editorPart) {
+ return ContextUiPlugin.getDefault().getUiBridgeForEditor(editorPart);
+ }
+
+ public static Color getForeground(IInteractionElement node) {
+ if (node == null) {
+ return null;
+ }
+ if (node.getInterest().isPredicted() || node.getInterest().isPropagated()) {
+ return ColorMap.GRAY_MEDIUM;
+ } else if (node.getInterest().isLandmark()) {
+ return ColorMap.LANDMARK;
+ } else if (node.getInterest().isInteresting()) {
+ return null;
+ }
+ return ColorMap.GRAY_MEDIUM;
+ }
+
+ public static boolean isEditorAutoCloseEnabled() {
+ return ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE);
+ }
+
+ public static boolean isEditorAutoManageEnabled() {
+ return ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS);
+ }
+
+ /**
+ * ID of the factory that provides the context page for the task editor.
+ *
+ * @since 3.1
+ * @see AbstractTaskEditorPageFactory
+ */
+ public static String ID_CONTEXT_PAGE_FACTORY = "org.eclipse.mylyn.context.ui.editor.context"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/IContextAwareEditor.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/IContextAwareEditor.java
new file mode 100644
index 0000000..cc23b17
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/IContextAwareEditor.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+/**
+ * Tag interface for editors that do not get closed when a context is deactivated. The editor can specify whether or not
+ * it should closed based on its input.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ */
+// TODO 4.0 consider making this be based on editor inputs, not editors. See bug 208625.
+public interface IContextAwareEditor {
+
+ public boolean canClose();
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/IContextUiStartup.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/IContextUiStartup.java
new file mode 100644
index 0000000..d2d2c70
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/IContextUiStartup.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+/**
+ * Plug-ins that register a context startup extension will be activated before the first context is activated.
+ *
+ * @since 2.3
+ * @author Steffen Pingel
+ */
+public interface IContextUiStartup {
+
+ /**
+ * Invoked before the first context activation.
+ */
+ public abstract void lazyStartup();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/InterestFilter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/InterestFilter.java
new file mode 100644
index 0000000..890758f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/InterestFilter.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * Christian Dupuis - bug 193003
+ * David Green - fix for bug 261446
+ *******************************************************************************/
+
+package org.eclipse.mylyn.context.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IImplicitlyIntersting;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.CompositeContextElement;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.internal.WorkingSet;
+
+/**
+ * A generic degree-of-interest viewer filter that can be applied to any StructuredViewer. It figures out whether an
+ * object is interesting by getting it's handle from the corresponding structure bridge.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public class InterestFilter extends ViewerFilter {
+
+ private Object temporarilyUnfiltered = null;
+
+ @Override
+ public boolean select(Viewer viewer, Object parent, Object object) {
+ try {
+ if (!(viewer instanceof StructuredViewer)) {// || !containsMylarInterestFilter((StructuredViewer) viewer)) {
+ return true;
+ }
+ if (isTemporarilyUnfiltered(parent)) {
+ return true;
+ } else if (temporarilyUnfiltered instanceof Tree
+ && (isRootElement(object) || isRootElement(viewer, parent, object))) {
+ return true;
+ }
+
+ IInteractionElement element = null;
+ if (object instanceof IImplicitlyIntersting) {
+ return true;
+ } else if (object instanceof IInteractionElement) {
+ element = (IInteractionElement) object;
+ } else {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ if (bridge.getContentType() == null) {
+ // try to resolve the resource
+ if (object instanceof IAdaptable) {
+ Object adapted = ((IAdaptable) object).getAdapter(IResource.class);
+ if (adapted instanceof IResource) {
+ object = adapted;
+ }
+ bridge = ContextCore.getStructureBridge(object);
+ } else {
+ return false;
+ }
+ }
+ if (!bridge.canFilter(object)) {
+ return true;
+ }
+
+ if (!object.getClass().getName().equals(Object.class.getCanonicalName())) {
+ String handle = bridge.getHandleIdentifier(object);
+ element = ContextCore.getContextManager().getElement(handle);
+
+ // if we can't find the element, check the parent bridge
+ if (element == null
+ || (element instanceof CompositeContextElement && ((CompositeContextElement) element).getNodes()
+ .isEmpty())) {
+ String parentContentType = bridge.getParentContentType();
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ if (parentBridge != null) {
+ String parentHandle = parentBridge.getHandleIdentifier(object);
+ IInteractionElement parentElement = ContextCore.getContextManager()
+ .getElement(parentHandle);
+ if (parentElement != null && isInteresting(parentElement)) {
+ // do a sanity check to make sure that we are trying to display the element
+ // and not some other representation
+ // If this is removed, you can see the undesired behavior of the parent default
+ // packages showing up in the package explorer
+ Object objectForHandle = parentBridge.getObjectForHandle(parentHandle);
+ return objectForHandle != null && objectForHandle.equals(object);
+ }
+ }
+ }
+
+ } else {
+ return true;
+ }
+ }
+ if (element != null) {
+ return isInteresting(element);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Interest filter failed on viewer: " //$NON-NLS-1$
+ + viewer.getClass(), t));
+ }
+ return false;
+ }
+
+ private boolean isRootElement(Viewer viewer, Object parent, Object object) {
+ if (viewer.getInput() == parent) {
+ return true;
+ }
+ return false;
+ }
+
+ protected boolean isRootElement(Object object) {
+ return object instanceof IProjectNature || object instanceof IProject || object instanceof WorkingSet;
+ }
+
+ protected boolean isInteresting(IInteractionElement element) {
+ // FIXME temporarily disabled, see bug 210011
+ // if (element.getInterest().isPredicted()) {
+// return false;
+// } else {
+ return element.getInterest().isInteresting();
+// }
+ }
+
+ private boolean isTemporarilyUnfiltered(Object parent) {
+ if (parent instanceof TreePath) {
+ TreePath treePath = (TreePath) parent;
+ parent = treePath.getLastSegment();
+ }
+ return temporarilyUnfiltered != null && temporarilyUnfiltered.equals(parent);
+ }
+
+ public void setTemporarilyUnfiltered(Object temprarilyUnfiltered) {
+ this.temporarilyUnfiltered = temprarilyUnfiltered;
+ }
+
+ /**
+ * @return true if there was an unfiltered node
+ */
+ public boolean resetTemporarilyUnfiltered() {
+ if (temporarilyUnfiltered != null) {
+ this.temporarilyUnfiltered = null;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public Object getTemporarilyUnfiltered() {
+ return temporarilyUnfiltered;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/InterestSorter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/InterestSorter.java
new file mode 100644
index 0000000..3c043d0
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/context/ui/InterestSorter.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.InterestComparator;
+
+/**
+ * Sorts view elements by degree-of-interest.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public class InterestSorter extends ViewerSorter {
+
+ protected InterestComparator<Object> comparator = new InterestComparator<Object>();
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ IInteractionElement element1 = getCorresponding(e1);
+ IInteractionElement element2 = getCorresponding(e2);
+ if (element1 != null && element2 != null) {
+ return comparator.compare(element1, element2);
+ } else {
+ return 0;
+ }
+ }
+
+ private IInteractionElement getCorresponding(Object object) {
+ if (object instanceof IInteractionElement) {
+ return (IInteractionElement) object;
+ } else {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ String handle = bridge.getHandleIdentifier(object);
+ return ContextCore.getContextManager().getElement(handle);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/AbstractContextLabelProvider.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/AbstractContextLabelProvider.java
new file mode 100644
index 0000000..256ed68
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/AbstractContextLabelProvider.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * TODO: this delegation idiom is breaking, refactor
+ *
+ * @author Mik Kersten
+ */
+public abstract class AbstractContextLabelProvider implements ILabelProvider {
+
+ public Image getImage(Object object) {
+ if (object instanceof IInteractionRelation) {
+ return getImage((IInteractionRelation) object);
+ } else if (object instanceof IInteractionElement) {
+ return getImage((IInteractionElement) object);
+ } else {
+ return getImageForObject(object);
+ }
+ }
+
+ public String getText(Object object) {
+ if (object instanceof IInteractionRelation) {
+ return getText((IInteractionRelation) object);
+ } else if (object instanceof IInteractionElement) {
+ return getText((IInteractionElement) object);
+ } else {
+ return getTextForObject(object);
+ }
+ }
+
+ protected abstract Image getImage(IInteractionElement node);
+
+ protected abstract Image getImage(IInteractionRelation edge);
+
+ protected abstract Image getImageForObject(Object object);
+
+ protected abstract String getText(IInteractionElement node);
+
+ protected abstract String getTextForObject(Object object);
+
+ protected abstract String getText(IInteractionRelation edge);
+
+ public void addListener(ILabelProviderListener listener) {
+ // TODO Auto-generated method stub
+ }
+
+ public void dispose() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ActiveViewSelectionDragAdapter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ActiveViewSelectionDragAdapter.java
new file mode 100644
index 0000000..7e865d9
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ActiveViewSelectionDragAdapter.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.TransferDragSourceListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.Transfer;
+
+/**
+ * @author Mik Kersten
+ */
+public class ActiveViewSelectionDragAdapter extends DragSourceAdapter implements TransferDragSourceListener {
+
+ private final ISelectionProvider fProvider;
+
+ public ActiveViewSelectionDragAdapter(ISelectionProvider provider) {
+ assert provider != null;
+ fProvider = provider;
+ }
+
+ public Transfer getTransfer() {
+ return LocalSelectionTransfer.getTransfer();
+ }
+
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ ISelection selection = fProvider.getSelection();
+ LocalSelectionTransfer.getTransfer().setSelection(selection);
+ LocalSelectionTransfer.getTransfer().setSelectionSetTime(event.time & 0xFFFFFFFFL);
+ event.doit = isDragable(selection);
+ }
+
+ protected boolean isDragable(ISelection selection) {
+ return true;
+ }
+
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ event.data = LocalSelectionTransfer.getTransfer().getSelection();
+ }
+
+ @Override
+ public void dragFinished(DragSourceEvent event) {
+ assert event.detail != DND.DROP_MOVE;
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ LocalSelectionTransfer.getTransfer().setSelectionSetTime(0);
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/BrowseFilteredListener.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/BrowseFilteredListener.java
new file mode 100644
index 0000000..c245fb3
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/BrowseFilteredListener.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.navigator.CommonViewer;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * @author Mik Kersten
+ */
+public class BrowseFilteredListener implements MouseListener, KeyListener {
+
+ private final StructuredViewer viewer;
+
+ public BrowseFilteredListener(StructuredViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ /**
+ * @param treeViewer
+ * cannot be null
+ * @param targetSelection
+ * cannot be null
+ */
+ public void unfilterSelection(TreeViewer treeViewer, IStructuredSelection targetSelection) {
+ InterestFilter filter = getInterestFilter(treeViewer);
+ Object targetObject = targetSelection.getFirstElement();
+ if (filter != null && targetObject != null) {
+ filter.setTemporarilyUnfiltered(targetObject);
+ if (targetObject instanceof Tree) {
+ treeViewer.refresh();
+ } else {
+ treeViewer.refresh(targetObject, true);
+ treeViewer.expandToLevel(targetObject, 1);
+ }
+ }
+ }
+
+ private void unfilter(final InterestFilter filter, final TreeViewer treeViewer, Object targetObject) {
+ if (targetObject != null) {
+ filter.setTemporarilyUnfiltered(targetObject);
+ if (targetObject instanceof Tree) {
+ treeViewer.refresh();
+ } else {
+ treeViewer.refresh(targetObject, true);
+ treeViewer.expandToLevel(targetObject, 1);
+ }
+ }
+ }
+
+ public void keyPressed(KeyEvent event) {
+ // ignore
+ }
+
+ public void keyReleased(KeyEvent event) {
+ InterestFilter filter = getInterestFilter(viewer);
+
+ if (event.keyCode == SWT.ARROW_RIGHT) {
+ if (filter == null || !(viewer instanceof TreeViewer)) {
+ return;
+ }
+
+ final TreeViewer treeViewer = (TreeViewer) viewer;
+ ISelection selection = treeViewer.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ Object targetObject = ((IStructuredSelection) selection).getFirstElement();
+ unfilter(filter, treeViewer, targetObject);
+ }
+ }
+ }
+
+ public void mouseDown(MouseEvent event) {
+ // ignore
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseUp(MouseEvent event) {
+ final InterestFilter filter = getInterestFilter(viewer);
+ if (filter == null || !(viewer instanceof TreeViewer)) {
+ return;
+ }
+
+ TreeViewer treeViewer = (TreeViewer) viewer;
+ Object selectedObject = null;
+ Object clickedObject = getClickedItem(event);
+ if (clickedObject != null) {
+ selectedObject = clickedObject;
+ } else {
+ selectedObject = treeViewer.getTree();
+ }
+
+ if (isUnfilterEvent(event)) {
+ if (treeViewer instanceof CommonViewer) {
+ CommonViewer commonViewer = (CommonViewer) treeViewer;
+ commonViewer.setSelection(new StructuredSelection(selectedObject), true);
+ }
+ unfilter(filter, treeViewer, selectedObject);
+ } else {
+ if (event.button == 1) {
+ if ((event.stateMask & SWT.MOD1) != 0) {
+ viewer.refresh(selectedObject);
+ } else {
+ final Object unfiltered = filter.getTemporarilyUnfiltered();
+ if (unfiltered != null) {
+ // NOTE: delaying refresh to ensure double click is handled, see bug 208702
+ new UIJob("") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ filter.resetTemporarilyUnfiltered();
+ viewer.refresh(unfiltered);
+ return Status.OK_STATUS;
+ }
+ }.schedule(event.display.getDoubleClickTime() + 50);
+ }
+ }
+ }
+ }
+ }
+
+ private Object getClickedItem(MouseEvent event) {
+ if (event.getSource() instanceof Table) {
+ TableItem item = ((Table) event.getSource()).getItem(new Point(event.x, event.y));
+ if (item != null) {
+ return item.getData();
+ } else {
+ return null;
+ }
+ } else if (event.getSource() instanceof Tree) {
+ TreeItem item = ((Tree) event.getSource()).getItem(new Point(event.x, event.y));
+ if (item != null) {
+ return item.getData();
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public static boolean isUnfilterEvent(MouseEvent event) {
+ return (event.stateMask & SWT.ALT) != 0;
+ }
+
+ private InterestFilter getInterestFilter(StructuredViewer structuredViewer) {
+ ViewerFilter[] filters = structuredViewer.getFilters();
+ for (ViewerFilter filter : filters) {
+ if (filter instanceof InterestFilter) {
+ return (InterestFilter) filter;
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ColorMap.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ColorMap.java
new file mode 100644
index 0000000..f8fc6fc
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ColorMap.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Mik Kersten
+ */
+public class ColorMap {
+
+ // TODO: use themes?
+ public static final Color LANDMARK = new Color(Display.getDefault(), 36, 22, 50);
+
+ public static final Color BACKGROUND_COLOR = new Color(Display.getDefault(), 255, 255, 255);
+
+ public static final Color DEFAULT = null;//Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);//new Color(Display.getDefault(), 255, 255, 255);
+
+ public static final Color GRAY_DARK = new Color(Display.getDefault(), 70, 70, 70);
+
+ public static final Color GRAY_MEDIUM = new Color(Display.getDefault(), 105, 105, 105);
+
+ public static final Color GRAY_LIGHT = new Color(Display.getDefault(), 145, 145, 145);
+
+ public static final Color GRAY_VERY_LIGHT = new Color(Display.getDefault(), 200, 200, 200);
+
+ public static final Color RELATIONSHIP = new Color(Display.getDefault(), 32, 104, 157);
+
+ public static final Color HIGLIGHTER_RED_INTERSECTION = new Color(Display.getDefault(), 200, 0, 0);
+
+ public static final Color HIGHLIGHTER_ORANGE_GRADIENT = new Color(Display.getDefault(), 222, 137, 71);
+
+ public static final Color HIGLIGHTER_BLUE_GRADIENT = new Color(Display.getDefault(), 81, 158, 235);
+
+ public static final Color HIGHLIGHTER_YELLOW = new Color(Display.getDefault(), 255, 238, 99);
+
+ public static final Color PANTONE_PASTEL_YELLOW = new Color(Display.getDefault(), 244, 238, 175);
+
+ public static final Color PANTONE_PASTEL_ROSE = new Color(Display.getDefault(), 254, 179, 190);
+
+ public static final Color PANTONE_PASTEL_MAUVE = new Color(Display.getDefault(), 241, 183, 216);
+
+ public static final Color PANTONE_PASTEL_PURPLE = new Color(Display.getDefault(), 202, 169, 222);
+
+ public static final Color PANTONE_PASTEL_BLUE = new Color(Display.getDefault(), 120, 160, 250);
+
+ public static final Color PANTONE_PASTERL_GREEN = new Color(Display.getDefault(), 162, 231, 215);
+
+ public static final Color COLOR_WHITE = new Color(Display.getCurrent(), 255, 255, 255);
+
+ public static final Color COLOR_BLACK = new Color(Display.getCurrent(), 0, 0, 0);
+
+ public void dispose() {
+ LANDMARK.dispose();
+ BACKGROUND_COLOR.dispose();
+ GRAY_DARK.dispose();
+ GRAY_MEDIUM.dispose();
+ GRAY_LIGHT.dispose();
+ GRAY_VERY_LIGHT.dispose();
+ RELATIONSHIP.dispose();
+ HIGLIGHTER_RED_INTERSECTION.dispose();
+ HIGHLIGHTER_ORANGE_GRADIENT.dispose();
+ HIGHLIGHTER_YELLOW.dispose();
+ PANTONE_PASTERL_GREEN.dispose();
+ PANTONE_PASTEL_BLUE.dispose();
+ PANTONE_PASTEL_MAUVE.dispose();
+ PANTONE_PASTEL_PURPLE.dispose();
+ PANTONE_PASTEL_ROSE.dispose();
+ PANTONE_PASTEL_YELLOW.dispose();
+ COLOR_WHITE.dispose();
+ COLOR_BLACK.dispose();
+
+ // below disposed by registry
+ // DEFAULT.dispose();
+ }
+
+ private GammaSetting gammaSetting = GammaSetting.STANDARD;
+
+ public enum GammaSetting {
+ LIGHTEN, DARKEN, STANDARD;
+
+ public static int compare(GammaSetting gs1, GammaSetting gs2) {
+ if (gs1 == LIGHTEN) {
+ if (gs2 == STANDARD) {
+ return 1;
+ } else if (gs2 == DARKEN) {
+ return 2;
+ } else {
+ return 0;
+ }
+ } else if (gs1 == STANDARD) {
+ if (gs2 == LIGHTEN) {
+ return -1;
+ } else if (gs2 == DARKEN) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } else {
+ if (gs2 == LIGHTEN) {
+ return -2;
+ } else if (gs2 == STANDARD) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+ }
+ }
+
+ public GammaSetting getGammaSetting() {
+ return gammaSetting;
+ }
+
+ public void setGammaSetting(GammaSetting gammaSetting) {
+ this.gammaSetting = gammaSetting;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContentOutlineManager.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContentOutlineManager.java
new file mode 100644
index 0000000..3fc6266
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContentOutlineManager.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.mylyn.internal.context.ui.actions.FocusOutlineAction;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContentOutlineManager implements IPartListener {
+
+ public void partBroughtToTop(final IWorkbenchPart part) {
+ // use the display async due to bug 261977: [context] outline view does not filter contents when new editor is opened
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (part instanceof IEditorPart) {
+ IEditorPart editorPart = (IEditorPart) part;
+ FocusOutlineAction applyAction = FocusOutlineAction.getOutlineActionForEditor(editorPart);
+ if (applyAction != null) {
+ applyAction.update(editorPart);
+ }
+ }
+ }
+ });
+ }
+
+ public void partActivated(IWorkbenchPart part) {
+ // ignore
+ }
+
+ public void partOpened(IWorkbenchPart part) {
+ // ignore
+ }
+
+ public void partClosed(IWorkbenchPart partRef) {
+ // ignore
+ }
+
+ public void partDeactivated(IWorkbenchPart partRef) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextEditorManager.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextEditorManager.java
new file mode 100644
index 0000000..20fc76f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextEditorManager.java
@@ -0,0 +1,444 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.context.ui.IContextAwareEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.XMLMemento;
+import org.eclipse.ui.internal.EditorManager;
+import org.eclipse.ui.internal.IPreferenceConstants;
+import org.eclipse.ui.internal.IWorkbenchConstants;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.internal.WorkbenchPage;
+import org.eclipse.ui.internal.WorkbenchWindow;
+import org.eclipse.ui.preferences.ScopedPreferenceStore;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class ContextEditorManager extends AbstractContextListener {
+
+ private static final String PREFS_PREFIX = "editors.task."; //$NON-NLS-1$
+
+ private static final String KEY_CONTEXT_EDITORS = "ContextOpenEditors"; //$NON-NLS-1$
+
+ private static final String KEY_MONITORED_WINDOW_OPEN_EDITORS = "MonitoredWindowOpenEditors"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_NUMER = "number"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_IS_LAUNCHING = "isLaunching"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_IS_ACTIVE = "isActive"; //$NON-NLS-1$
+
+ private boolean previousCloseEditorsSetting = Workbench.getInstance().getPreferenceStore().getBoolean(
+ IPreferenceConstants.REUSE_EDITORS_BOOLEAN);
+
+ private final IPreferenceStore preferenceStore;
+
+ public ContextEditorManager() {
+ preferenceStore = new ScopedPreferenceStore(new InstanceScope(), "org.eclipse.mylyn.resources.ui"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ openEditorsFromMemento(event.getContext());
+ break;
+ case DEACTIVATED:
+ closeEditorsAndSaveMemento(event.getContext());
+ break;
+ case INTEREST_CHANGED:
+ for (IInteractionElement element : event.getElements()) {
+ closeEditor(element, false);
+ }
+ break;
+ case ELEMENTS_DELETED:
+ for (IInteractionElement element : event.getElements()) {
+ closeEditor(element, true);
+ }
+ break;
+ case CLEARED:
+ // use the handle since the context is null when it is cleared
+ // bug 255588
+ clearEditorMemento(event.getContextHandle(), event.isActiveContext());
+ break;
+
+ }
+ }
+
+ public void openEditorsFromMemento(IInteractionContext context) {
+ if (!Workbench.getInstance().isStarting()
+ && ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS) && !TaskMigrator.isActive()) {
+ Workbench workbench = (Workbench) PlatformUI.getWorkbench();
+ previousCloseEditorsSetting = workbench.getPreferenceStore().getBoolean(
+ IPreferenceConstants.REUSE_EDITORS_BOOLEAN);
+ workbench.getPreferenceStore().setValue(IPreferenceConstants.REUSE_EDITORS_BOOLEAN, false);
+ boolean wasPaused = ContextCore.getContextManager().isContextCapturePaused();
+ try {
+ if (!wasPaused) {
+ ContextCore.getContextManager().setContextCapturePaused(true);
+ }
+ String mementoString = null;
+ // TODO change where memento is stored
+ IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ try {
+ mementoString = readEditorMemento(context);
+ if (mementoString != null && !mementoString.trim().equals("")) { //$NON-NLS-1$
+ IMemento memento = XMLMemento.createReadRoot(new StringReader(mementoString));
+ IMemento[] children = memento.getChildren(KEY_MONITORED_WINDOW_OPEN_EDITORS);
+ if (children.length > 0) {
+ // This code supports restore from multiple windows
+ for (IMemento child : children) {
+ WorkbenchPage page = getWorkbenchPageForMemento(child, activeWindow);
+ if (child != null && page != null) {
+ restoreEditors(page, child, page.getWorkbenchWindow() == activeWindow);
+ }
+ }
+ } else {
+ // This code is for supporting the old editor management - only the active window
+ WorkbenchPage page = (WorkbenchPage) activeWindow.getActivePage();
+ if (memento != null) {
+ restoreEditors(page, memento, true);
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not restore all editors, memento: \"" + mementoString + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ activeWindow.setActivePage(activeWindow.getActivePage());
+ IInteractionElement activeNode = context.getActiveNode();
+ if (activeNode != null) {
+ ContextUi.getUiBridge(activeNode.getContentType()).open(activeNode);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Failed to open editors on activation", e)); //$NON-NLS-1$
+ } finally {
+ ContextCore.getContextManager().setContextCapturePaused(false);
+ }
+ }
+ }
+
+ private WorkbenchPage getWorkbenchPageForMemento(IMemento memento, IWorkbenchWindow activeWindow) {
+
+ String windowToRestoreClassName = memento.getString(ATTRIBUTE_CLASS);
+ if (windowToRestoreClassName == null) {
+ windowToRestoreClassName = ""; //$NON-NLS-1$
+ }
+ Integer windowToRestorenumber = memento.getInteger(ATTRIBUTE_NUMER);
+ if (windowToRestorenumber == null) {
+ windowToRestorenumber = 0;
+ }
+
+ // try to match the open windows to the one that we want to restore
+ Set<IWorkbenchWindow> monitoredWindows = MonitorUi.getMonitoredWindows();
+ for (IWorkbenchWindow window : monitoredWindows) {
+ int windowNumber = 0;
+ if (window instanceof WorkbenchWindow) {
+ windowNumber = ((WorkbenchWindow) window).getNumber();
+ }
+ if (window.getClass().getCanonicalName().equals(windowToRestoreClassName)
+ && windowNumber == windowToRestorenumber) {
+ return (WorkbenchPage) window.getActivePage();
+ }
+ }
+
+ // we don't have a good match here, try to make an educated guess
+ // TODO e3.4 replace by memento.getBoolean()
+ Boolean isActive = Boolean.valueOf(memento.getString(ATTRIBUTE_IS_ACTIVE));
+ if (isActive == null) {
+ isActive = false;
+ }
+
+ // both of these defaulting to true should ensure that all editors are opened even if their previous editor is not around
+ boolean shouldRestoreUnknownWindowToActive = true; // TODO could add a preference here
+ boolean shouldRestoreActiveWindowToActive = true; // TODO could add a preference here
+
+ if (isActive && shouldRestoreActiveWindowToActive) {
+ // if the window that we are trying to restore was the active window, restore it to the active window
+ return (WorkbenchPage) activeWindow.getActivePage();
+ }
+
+ if (shouldRestoreUnknownWindowToActive) {
+ // we can't find a good window, so restore it to the active one
+ return (WorkbenchPage) activeWindow.getActivePage();
+ }
+
+ if (shouldRestoreActiveWindowToActive && shouldRestoreUnknownWindowToActive) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Unable to find window to restore memento to.", new Exception())); //$NON-NLS-1$
+ }
+
+ // we dont have a window that will work, so don't restore the editors
+ // we shouldn't get here if both *WindowToActive booleans are true
+ return null;
+ }
+
+ private String readEditorMemento(IInteractionContext context) {
+ return preferenceStore.getString(PREFS_PREFIX + context.getHandleIdentifier());
+ }
+
+ public void closeEditorsAndSaveMemento(IInteractionContext context) {
+ if (!PlatformUI.getWorkbench().isClosing()
+ && ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS) && !TaskMigrator.isActive()) {
+ closeAllButActiveTaskEditor(context.getHandleIdentifier());
+
+ XMLMemento rootMemento = XMLMemento.createWriteRoot(KEY_CONTEXT_EDITORS);
+
+ IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ IWorkbenchWindow launchingWindow = MonitorUi.getLaunchingWorkbenchWindow();
+ Set<IWorkbenchWindow> monitoredWindows = MonitorUi.getMonitoredWindows();
+
+ for (IWorkbenchWindow window : monitoredWindows) {
+ IMemento memento = rootMemento.createChild(KEY_MONITORED_WINDOW_OPEN_EDITORS);
+
+ memento.putString(ATTRIBUTE_CLASS, window.getClass().getCanonicalName());
+ int number = 0;
+ if (window instanceof WorkbenchWindow) {
+ number = ((WorkbenchWindow) window).getNumber();
+ }
+ memento.putInteger(ATTRIBUTE_NUMER, number);
+ // TODO e3.4 replace by memento.putBoolean()
+ memento.putString(ATTRIBUTE_IS_LAUNCHING, (window == launchingWindow) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
+ memento.putString(ATTRIBUTE_IS_ACTIVE, (window == activeWindow) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
+ ((WorkbenchPage) window.getActivePage()).getEditorManager().saveState(memento);
+ }
+ // TODO: avoid storing with preferences due to bloat?
+ StringWriter writer = new StringWriter();
+ try {
+ rootMemento.save(writer);
+ writeEditorMemento(context.getHandleIdentifier(), writer.getBuffer().toString());
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not store editor state", //$NON-NLS-1$
+ e));
+ }
+
+ Workbench.getInstance().getPreferenceStore().setValue(IPreferenceConstants.REUSE_EDITORS_BOOLEAN,
+ previousCloseEditorsSetting);
+ closeAllEditors();
+ }
+ }
+
+ public void writeEditorMemento(String contextHandle, String memento) {
+ preferenceStore.setValue(PREFS_PREFIX + contextHandle, memento);
+ }
+
+ public void clearEditorMemento(String contextHandle, boolean closeEditors) {
+
+ if (closeEditors) {
+ closeAllButActiveTaskEditor(contextHandle);
+ }
+
+ XMLMemento memento = XMLMemento.createWriteRoot(KEY_CONTEXT_EDITORS);
+
+ // TODO: avoid storing with preferences due to bloat?
+ StringWriter writer = new StringWriter();
+ try {
+ memento.save(writer);
+ writeEditorMemento(contextHandle, writer.getBuffer().toString());
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not store editor state", e)); //$NON-NLS-1$
+ }
+
+ Workbench.getInstance().getPreferenceStore().setValue(IPreferenceConstants.REUSE_EDITORS_BOOLEAN,
+ previousCloseEditorsSetting);
+ if (closeEditors) {
+ closeAllEditors();
+ }
+ }
+
+ /**
+ * HACK: will fail to restore different parts with same name
+ */
+ @SuppressWarnings("unchecked")
+ private void restoreEditors(WorkbenchPage page, IMemento memento, boolean isActiveWindow) {
+ EditorManager editorManager = page.getEditorManager();
+ final ArrayList visibleEditors = new ArrayList(5);
+ final IEditorReference activeEditor[] = new IEditorReference[1];
+ final MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK, "", null); //$NON-NLS-1$
+
+ try {
+ IMemento[] editorMementos = memento.getChildren(IWorkbenchConstants.TAG_EDITOR);
+ Set<IMemento> editorMementoSet = new HashSet<IMemento>();
+ editorMementoSet.addAll(Arrays.asList(editorMementos));
+ // HACK: same parts could have different editors
+ Set<String> restoredPartNames = new HashSet<String>();
+ List<IEditorReference> alreadyVisibleEditors = Arrays.asList(editorManager.getEditors());
+ for (IEditorReference editorReference : alreadyVisibleEditors) {
+ restoredPartNames.add(editorReference.getPartName());
+ }
+ for (IMemento editorMemento : editorMementoSet) {
+ String partName = editorMemento.getString(IWorkbenchConstants.TAG_PART_NAME);
+ if (!restoredPartNames.contains(partName)) {
+ editorManager.restoreEditorState(editorMemento, visibleEditors, activeEditor, result);
+ } else {
+ restoredPartNames.add(partName);
+ }
+ }
+
+ for (int i = 0; i < visibleEditors.size(); i++) {
+ editorManager.setVisibleEditor((IEditorReference) visibleEditors.get(i), false);
+ }
+
+ if (activeEditor[0] != null && isActiveWindow) {
+ IWorkbenchPart editor = activeEditor[0].getPart(true);
+ if (editor != null) {
+ page.activate(editor);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not restore editors", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void closeAllButActiveTaskEditor(String taskHandle) {
+ try {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return;
+ }
+ for (IWorkbenchWindow window : MonitorUi.getMonitoredWindows()) {
+ IWorkbenchPage page = window.getActivePage();
+ if (page != null) {
+ IEditorReference[] references = page.getEditorReferences();
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>();
+ for (IEditorReference reference : references) {
+ if (canClose(reference)) {
+ try {
+ IEditorInput input = reference.getEditorInput();
+ if (input instanceof TaskEditorInput) {
+ ITask task = ((TaskEditorInput) input).getTask();
+ if (task != null && task.getHandleIdentifier().equals(taskHandle)) {
+ // do not close
+ } else {
+ toClose.add(reference);
+ }
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ }
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not auto close editor", t)); //$NON-NLS-1$
+ }
+ }
+
+ public void closeAllEditors() {
+ try {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return;
+ }
+ for (IWorkbenchWindow window : MonitorUi.getMonitoredWindows()) {
+ IWorkbenchPage page = window.getActivePage();
+ if (page != null) {
+ IEditorReference[] references = page.getEditorReferences();
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>();
+ for (IEditorReference reference : references) {
+ if (canClose(reference)) {
+ toClose.add(reference);
+ }
+ }
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not auto close editor", t)); //$NON-NLS-1$
+ }
+ }
+
+ private boolean canClose(final IEditorReference editorReference) {
+ final IEditorPart editor = editorReference.getEditor(false);
+ if (editor != null) {
+ final boolean[] result = new boolean[1];
+ result[0] = true;
+ SafeRunnable.run(new ISafeRunnable() {
+ public void run() throws Exception {
+ if (editor instanceof IContextAwareEditor) {
+ result[0] = ((IContextAwareEditor) editor).canClose();
+ } else {
+ IContextAwareEditor contextAware = (IContextAwareEditor) editor.getAdapter(IContextAwareEditor.class);
+ if (contextAware != null) {
+ result[0] = contextAware.canClose();
+ }
+ }
+ }
+
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Failed to verify editor status", e)); //$NON-NLS-1$
+ }
+ });
+ return result[0];
+ }
+ return true;
+ }
+
+ private void closeEditor(IInteractionElement element, boolean force) {
+ if (ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS)) {
+ if (force || !element.getInterest().isInteresting()) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element.getContentType());
+ if (bridge.isDocument(element.getHandleIdentifier())) {
+ AbstractContextUiBridge uiBridge = ContextUi.getUiBridge(element.getContentType());
+ uiBridge.close(element);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextPerspectiveManager.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextPerspectiveManager.java
new file mode 100644
index 0000000..26a7911
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextPerspectiveManager.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveListener4;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.Perspective;
+import org.eclipse.ui.internal.WorkbenchPage;
+import org.eclipse.ui.internal.registry.IActionSetDescriptor;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class ContextPerspectiveManager implements ITaskActivationListener, IPerspectiveListener4 {
+
+ private final Set<String> managedPerspectiveIds;
+
+ private final Set<String> actionSetsToSuppress;
+
+ private final IPreferenceStore preferenceStore;
+
+ public ContextPerspectiveManager(IPreferenceStore preferenceStore) {
+ this.preferenceStore = preferenceStore;
+ this.managedPerspectiveIds = new HashSet<String>();
+ this.actionSetsToSuppress = new HashSet<String>();
+ actionSetsToSuppress.add("org.eclipse.ui.edit.text.actionSet.annotationNavigation"); //$NON-NLS-1$
+ actionSetsToSuppress.add("org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo"); //$NON-NLS-1$
+ actionSetsToSuppress.add("org.eclipse.ui.externaltools.ExternalToolsSet"); //$NON-NLS-1$
+ }
+
+ public void addManagedPerspective(String id) {
+ managedPerspectiveIds.add(id);
+ }
+
+ public void removeManagedPerspective(String id) {
+ managedPerspectiveIds.remove(id);
+ }
+
+ public void taskActivated(ITask task) {
+ try {
+ IWorkbenchWindow launchingWindow = MonitorUi.getLaunchingWorkbenchWindow();
+ if (launchingWindow != null) {
+ IPerspectiveDescriptor descriptor = launchingWindow.getActivePage().getPerspective();
+ setPerspectiveIdFor(null, descriptor.getId());
+
+ String perspectiveId = getPerspectiveIdFor(task);
+ showPerspective(perspectiveId);
+ }
+ } catch (Exception e) {
+ // ignore, perspective may not have been saved, e.g. due to crash
+ }
+ }
+
+ public void taskDeactivated(ITask task) {
+ try {
+ if (PlatformUI.isWorkbenchRunning()
+ && ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES)) {
+ IWorkbenchWindow launchingWindow = MonitorUi.getLaunchingWorkbenchWindow();
+ if (launchingWindow != null) {
+ IPerspectiveDescriptor descriptor = launchingWindow.getActivePage().getPerspective();
+ setPerspectiveIdFor(task, descriptor.getId());
+
+ String previousPerspectiveId = getPerspectiveIdFor(null);
+ showPerspective(previousPerspectiveId);
+ }
+ }
+ } catch (Exception e) {
+ // ignore, perspective may not have been saved, e.g. due to crash
+ }
+ }
+
+ private void showPerspective(String perspectiveId) {
+ if (perspectiveId != null
+ && perspectiveId.length() > 0
+ && ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES)) {
+ IWorkbenchWindow launchingWindow = MonitorUi.getLaunchingWorkbenchWindow();
+ try {
+ if (launchingWindow != null) {
+ launchingWindow.getShell().setRedraw(false);
+ PlatformUI.getWorkbench().showPerspective(perspectiveId, launchingWindow);
+ }
+ } catch (Exception e) {
+ // perspective's preserved id not found, ignore
+ } finally {
+ if (launchingWindow != null) {
+ launchingWindow.getShell().setRedraw(true);
+ }
+ }
+ }
+ }
+
+ public void perspectivePreDeactivate(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ // ignore
+ }
+
+ public void perspectiveClosed(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ // ignore
+ }
+
+ public void perspectiveDeactivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ // ignore
+ }
+
+ public void perspectiveOpened(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ cleanActionSets(page, perspective);
+ }
+
+ public void perspectiveSavedAs(IWorkbenchPage page, IPerspectiveDescriptor oldPerspective,
+ IPerspectiveDescriptor newPerspective) {
+ // ignore
+ }
+
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective,
+ IWorkbenchPartReference partRef, String changeId) {
+ // ignore
+ }
+
+ public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspectiveDescriptor) {
+ cleanActionSets(page, perspectiveDescriptor);
+ }
+
+ private void cleanActionSets(IWorkbenchPage page, IPerspectiveDescriptor perspectiveDescriptor) {
+ if (managedPerspectiveIds.contains(perspectiveDescriptor.getId())) {
+ if (page instanceof WorkbenchPage) {
+ Perspective perspective = ((WorkbenchPage) page).getActivePerspective();
+
+ Set<IActionSetDescriptor> toRemove = new HashSet<IActionSetDescriptor>();
+ IActionSetDescriptor[] actionSetDescriptors = ((WorkbenchPage) page).getActionSets();
+ for (IActionSetDescriptor actionSetDescriptor : actionSetDescriptors) {
+ if (actionSetsToSuppress.contains(actionSetDescriptor.getId())) {
+ toRemove.add(actionSetDescriptor);
+ }
+ }
+ perspective.turnOffActionSets(toRemove.toArray(new IActionSetDescriptor[toRemove.size()]));
+ }
+ }
+ }
+
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
+ // ignore
+ }
+
+ public void preTaskActivated(ITask task) {
+ // ignore
+ }
+
+ public void preTaskDeactivated(ITask task) {
+ // ignore
+ }
+
+ /**
+ * @param task
+ * can be null to indicate no task
+ */
+ private String getPerspectiveIdFor(ITask task) {
+ if (task != null) {
+ return preferenceStore.getString(IContextUiPreferenceContstants.PREFIX_TASK_TO_PERSPECTIVE
+ + task.getHandleIdentifier());
+ } else {
+ return preferenceStore.getString(IContextUiPreferenceContstants.PERSPECTIVE_NO_ACTIVE_TASK);
+ }
+ }
+
+ /**
+ * @param task
+ * can be null to indicate no task
+ */
+ private void setPerspectiveIdFor(ITask task, String perspectiveId) {
+ if (task != null) {
+ preferenceStore.setValue(IContextUiPreferenceContstants.PREFIX_TASK_TO_PERSPECTIVE
+ + task.getHandleIdentifier(), perspectiveId);
+ } else {
+ preferenceStore.setValue(IContextUiPreferenceContstants.PERSPECTIVE_NO_ACTIVE_TASK, perspectiveId);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextUiImages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextUiImages.java
new file mode 100644
index 0000000..18c807f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextUiImages.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextUiImages {
+
+ private static ImageRegistry imageRegistry;
+
+ private static final String T_ELCL = "elcl16"; //$NON-NLS-1$
+
+ private static final String T_TOOL = "etool16"; //$NON-NLS-1$
+
+ private static final URL baseURL = ContextUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$
+
+ // TODO 3.3 move images below to sandbox
+
+ @Deprecated
+ public static final ImageDescriptor COLOR_PALETTE = create(T_ELCL, "color-palette.gif"); //$NON-NLS-1$
+
+ @Deprecated
+ public static final ImageDescriptor STOP_SEARCH = create(T_ELCL, "stop_all.gif"); //$NON-NLS-1$
+
+ @Deprecated
+ public static final ImageDescriptor QUALIFY_NAMES = create(T_TOOL, "qualify-names.gif"); //$NON-NLS-1$
+
+ @Deprecated
+ public static final ImageDescriptor EDGE_INHERITANCE = create(T_ELCL, "edge-inheritance.gif"); //$NON-NLS-1$
+
+ @Deprecated
+ public static final ImageDescriptor EDGE_REFERENCE = create(T_ELCL, "edge-reference.gif"); //$NON-NLS-1$
+
+ @Deprecated
+ public static final ImageDescriptor EDGE_ACCESS_READ = create(T_ELCL, "edge-read.gif"); //$NON-NLS-1$
+
+ @Deprecated
+ public static final ImageDescriptor EDGE_ACCESS_WRITE = create(T_ELCL, "edge-write.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILE_XML = create(T_ELCL, "file-xml.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FILE_GENERIC = create(T_ELCL, "file_obj.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor FOLDER_GENERIC = create(T_ELCL, "fldr_obj.gif"); //$NON-NLS-1$
+
+ public static ImageDescriptor create(String prefix, String name) {
+ return create(prefix, name, baseURL);
+ }
+
+ public static ImageDescriptor create(String prefix, String name, URL baseURL) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name, baseURL));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name, URL baseURL) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuffer buffer = new StringBuffer(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+ private static ImageRegistry getImageRegistry() {
+ if (imageRegistry == null) {
+ imageRegistry = new ImageRegistry();
+ }
+
+ return imageRegistry;
+ }
+
+ /**
+ * Lazily initializes image map.
+ */
+ public static Image getImage(ImageDescriptor imageDescriptor) {
+ if (imageDescriptor == null) {
+ return null;
+ }
+
+ ImageRegistry imageRegistry = getImageRegistry();
+ Image image = imageRegistry.get("" + imageDescriptor.hashCode()); //$NON-NLS-1$
+ if (image == null) {
+ image = imageDescriptor.createImage();
+ imageRegistry.put("" + imageDescriptor.hashCode(), image); //$NON-NLS-1$
+ }
+ return image;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextUiPlugin.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextUiPlugin.java
new file mode 100644
index 0000000..604dda4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextUiPlugin.java
@@ -0,0 +1,652 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchPlugin;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Main entry point for the Context UI.
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class ContextUiPlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.context.ui"; //$NON-NLS-1$
+
+ private class ContextActivationListener extends AbstractContextListener {
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case PRE_ACTIVATED:
+ initLazyStart();
+ break;
+ }
+ }
+ }
+
+ private final ContextActivationListener contextActivationListener = new ContextActivationListener();
+
+ private final Map<String, AbstractContextUiBridge> bridges = new HashMap<String, AbstractContextUiBridge>();
+
+ private final Map<String, ILabelProvider> contextLabelProviders = new HashMap<String, ILabelProvider>();
+
+ private static ContextUiPlugin INSTANCE;
+
+ private FocusedViewerManager viewerManager;
+
+ private ContextPerspectiveManager perspectiveManager;
+
+ private final ContentOutlineManager contentOutlineManager = new ContentOutlineManager();
+
+ private final Map<AbstractContextUiBridge, ImageDescriptor> activeSearchIcons = new HashMap<AbstractContextUiBridge, ImageDescriptor>();
+
+ private final Map<AbstractContextUiBridge, String> activeSearchLabels = new HashMap<AbstractContextUiBridge, String>();
+
+ private final Map<String, Set<Class<?>>> preservedFilterClasses = new HashMap<String, Set<Class<?>>>();
+
+ private final Map<String, Set<String>> preservedFilterIds = new HashMap<String, Set<String>>();
+
+ private static final AbstractContextLabelProvider DEFAULT_LABEL_PROVIDER = new AbstractContextLabelProvider() {
+
+ @Override
+ protected Image getImage(IInteractionElement node) {
+ return null;
+ }
+
+ @Override
+ protected Image getImage(IInteractionRelation edge) {
+ return null;
+ }
+
+ @Override
+ protected String getText(IInteractionElement node) {
+ return "? " + node; //$NON-NLS-1$
+ }
+
+ @Override
+ protected String getText(IInteractionRelation edge) {
+ return "? " + edge; //$NON-NLS-1$
+ }
+
+ @Override
+ protected Image getImageForObject(Object object) {
+ return null;
+ }
+
+ @Override
+ protected String getTextForObject(Object node) {
+ return "? " + node; //$NON-NLS-1$
+ }
+
+ };
+
+ private static final AbstractContextUiBridge DEFAULT_UI_BRIDGE = new AbstractContextUiBridge() {
+
+ @Override
+ public void open(IInteractionElement node) {
+ // ignore
+ }
+
+ @Override
+ public void close(IInteractionElement node) {
+ // ignore
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return false;
+ }
+
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ return null;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return null;
+ }
+ };
+
+ private static final ITaskActivationListener TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
+
+ @SuppressWarnings( { "deprecation", "restriction" })
+ @Override
+ public void taskActivated(ITask task) {
+ if (CoreUtil.TEST_MODE) {
+ // avoid blocking the test suite
+ return;
+ }
+
+ boolean hasLocalContext = ContextCore.getContextManager().hasContext(task.getHandleIdentifier());
+ if (!hasLocalContext) {
+ if (org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil.hasContextAttachment(task)) {
+ boolean getRemote = MessageDialog.openQuestion(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), Messages.ContextUiPlugin_Task_Activation,
+ Messages.ContextUiPlugin_No_local_task_context_exists);
+ if (getRemote) {
+ new org.eclipse.mylyn.internal.context.ui.actions.ContextRetrieveAction().run(task);
+ }
+ }
+ }
+ }
+ };
+
+ private final AtomicBoolean lazyStarted = new AtomicBoolean(false);
+
+ private ContextEditorManager editorManager;
+
+ public ContextUiPlugin() {
+ INSTANCE = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+
+ initDefaultPrefs(getPreferenceStore());
+
+ viewerManager = new FocusedViewerManager();
+ perspectiveManager = new ContextPerspectiveManager(getPreferenceStore());
+
+ ContextCore.getContextManager().addListener(contextActivationListener);
+ if (ContextCore.getContextManager().isContextActive()) {
+ initLazyStart();
+ }
+ }
+
+ private void initLazyStart() {
+ if (!lazyStarted.getAndSet(true)) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ try {
+ lazyStart(workbench);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, super.getBundle().getSymbolicName(), IStatus.ERROR,
+ "Could not lazy start context plug-in", t)); //$NON-NLS-1$
+ }
+ if (TasksUi.getTaskActivityManager() != null) {
+ ContextCore.getContextManager().removeListener(contextActivationListener);
+ }
+ }
+ }
+
+ @SuppressWarnings("restriction")
+ private void lazyStart(IWorkbench workbench) {
+ try {
+ MonitorUiPlugin.getDefault()
+ .getPreferenceStore()
+ .setValue(MonitorUiPlugin.PREF_USER_ACTIVITY_ENABLED, true);
+ MonitorUiPlugin.getDefault().savePluginPreferences();
+ ContextCore.getContextManager().addListener(viewerManager);
+ MonitorUi.addWindowPartListener(contentOutlineManager);
+ perspectiveManager.addManagedPerspective(ITasksUiConstants.ID_PERSPECTIVE_PLANNING);
+ TasksUi.getTaskActivityManager().addActivationListener(perspectiveManager);
+ MonitorUi.addWindowPerspectiveListener(perspectiveManager);
+ TasksUi.getTaskActivityManager().addActivationListener(TASK_ACTIVATION_LISTENER);
+
+ editorManager = new ContextEditorManager();
+ ContextCore.getContextManager().addListener(editorManager);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Context UI initialization failed", //$NON-NLS-1$
+ e));
+ }
+
+ // activate all UI bridges and load all focused view actions before setting the selections (see below)
+ UiStartupExtensionPointReader.runStartupExtensions();
+
+ try {
+ // NOTE: this needs to be done because some views (e.g. Project Explorer) are not
+ // correctly initialized on startup and do not have the dummy selection event
+ // sent to them. See PartPluginAction and bug 213545.
+ // TODO consider a mechanism to identify only views that provide focus
+ for (IWorkbenchWindow window : PlatformUI.getWorkbench().getWorkbenchWindows()) {
+ if (window.getActivePage() != null) {
+ IViewReference[] views = window.getActivePage().getViewReferences();
+ for (IViewReference viewReference : views) {
+ IViewPart viewPart = viewReference.getView(false);
+ if (viewPart != null) {
+ UiUtil.initializeViewerSelection(viewPart);
+ }
+ }
+ }
+ }
+ viewerManager.forceRefresh();
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not initialize focused viewers", e)); //$NON-NLS-1$
+ }
+ }
+
+ private void lazyStop() {
+ if (editorManager != null) {
+ ContextCore.getContextManager().removeListener(editorManager);
+ }
+
+ ContextCore.getContextManager().removeListener(viewerManager);
+ MonitorUi.removeWindowPartListener(contentOutlineManager);
+
+ TasksUi.getTaskActivityManager().removeActivationListener(perspectiveManager);
+ MonitorUi.removeWindowPerspectiveListener(perspectiveManager);
+ TasksUi.getTaskActivityManager().removeActivationListener(TASK_ACTIVATION_LISTENER);
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (lazyStarted.get()) {
+ lazyStop();
+ }
+ if (TasksUi.getTaskActivityManager() != null) {
+ ContextCore.getContextManager().removeListener(contextActivationListener);
+ }
+
+ super.stop(context);
+ perspectiveManager.removeManagedPerspective(ITasksUiConstants.ID_PERSPECTIVE_PLANNING);
+ viewerManager.dispose();
+ }
+
+ private void initDefaultPrefs(IPreferenceStore store) {
+ store.setDefault(IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS, true);
+ store.setDefault(IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES, false);
+ store.setDefault(IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS, true);
+ store.setDefault(IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION, true);
+ store.setDefault(IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE, true);
+ store.setDefault(IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_WARNING, true);
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static ContextUiPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle, or 'key' if not found.
+ */
+ @Deprecated
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = ContextUiPlugin.getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle, or 'key' if not found.
+ */
+ @Deprecated
+ public static String getMessage(String key) {
+ ResourceBundle bundle = getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the plugin's resource bundle,
+ */
+ @Deprecated
+ public ResourceBundle getResourceBundle() {
+ return null;
+ }
+
+ public List<AbstractContextUiBridge> getUiBridges() {
+ UiExtensionPointReader.initExtensions();
+ return new ArrayList<AbstractContextUiBridge>(bridges.values());
+ }
+
+ /**
+ * @return the corresponding adapter if found, or an adapter with no behavior otherwise (so null is never returned)
+ */
+ public AbstractContextUiBridge getUiBridge(String contentType) {
+ UiExtensionPointReader.initExtensions();
+ AbstractContextUiBridge bridge = bridges.get(contentType);
+ if (bridge != null) {
+ return bridge;
+ } else {
+ return DEFAULT_UI_BRIDGE;
+ }
+ }
+
+ /**
+ * TODO: cache this to improve performance?
+ */
+ public AbstractContextUiBridge getUiBridgeForEditor(IEditorPart editorPart) {
+ UiExtensionPointReader.initExtensions();
+ AbstractContextUiBridge foundBridge = null;
+ for (AbstractContextUiBridge bridge : bridges.values()) {
+ if (bridge.acceptsEditor(editorPart)) {
+ foundBridge = bridge;
+ break;
+ }
+ }
+ if (foundBridge != null) {
+ return foundBridge;
+ } else {
+ return DEFAULT_UI_BRIDGE;
+ }
+ }
+
+ private void internalAddBridge(String extension, AbstractContextUiBridge bridge) {
+ this.bridges.put(extension, bridge);
+ }
+
+ public ILabelProvider getContextLabelProvider(String extension) {
+ ILabelProvider provider = contextLabelProviders.get(extension);
+ if (provider != null) {
+ return provider;
+ } else {
+ return DEFAULT_LABEL_PROVIDER;
+ }
+ }
+
+ private void internalAddContextLabelProvider(String extension, ILabelProvider provider) {
+ this.contextLabelProviders.put(extension, provider);
+ }
+
+ public static FocusedViewerManager getViewerManager() {
+ return INSTANCE.viewerManager;
+ }
+
+ static class UiExtensionPointReader {
+
+ private static boolean extensionsRead = false;
+
+ public static final String EXTENSION_ID_CONTEXT = "org.eclipse.mylyn.context.ui.bridges"; //$NON-NLS-1$
+
+ public static final String ELEMENT_UI_BRIDGE = "uiBridge"; //$NON-NLS-1$
+
+ public static final String ELEMENT_PRESERVED_FILTERS = "preservedFilters"; //$NON-NLS-1$
+
+ public static final String ELEMENT_VIEW_ID = "viewId"; //$NON-NLS-1$
+
+ public static final String ELEMENT_ID = "id"; //$NON-NLS-1$
+
+ public static final String ELEMENT_FILTER = "filter"; //$NON-NLS-1$
+
+ public static final String ELEMENT_CLASS = "class"; //$NON-NLS-1$
+
+ public static final String ELEMENT_UI_CONTEXT_LABEL_PROVIDER = "labelProvider"; //$NON-NLS-1$
+
+ public static final String ELEMENT_UI_BRIDGE_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+
+ public static final String ELEMENT_STRUCTURE_BRIDGE_SEARCH_ICON = "activeSearchIcon"; //$NON-NLS-1$
+
+ public static final String ELEMENT_STRUCTURE_BRIDGE_SEARCH_LABEL = "activeSearchLabel"; //$NON-NLS-1$
+
+ public static void initExtensions() {
+ if (!extensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(UiExtensionPointReader.EXTENSION_ID_CONTEXT);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(UiExtensionPointReader.ELEMENT_UI_BRIDGE)) {
+ readBridge(element);
+ } else if (element.getName().equals(UiExtensionPointReader.ELEMENT_UI_CONTEXT_LABEL_PROVIDER)) {
+ readLabelProvider(element);
+ } else if (element.getName().equals(UiExtensionPointReader.ELEMENT_PRESERVED_FILTERS)) {
+ readPreservedFilters(element);
+ }
+ }
+ }
+ extensionsRead = true;
+ }
+ }
+
+ private static void readLabelProvider(IConfigurationElement element) {
+ try {
+ Object provider = element.createExecutableExtension(UiExtensionPointReader.ELEMENT_CLASS);
+ Object contentType = element.getAttribute(UiExtensionPointReader.ELEMENT_UI_BRIDGE_CONTENT_TYPE);
+ if (provider instanceof ILabelProvider && contentType != null) {
+ ContextUiPlugin.getDefault().internalAddContextLabelProvider((String) contentType,
+ (ILabelProvider) provider);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not load label provider: " + provider.getClass().getCanonicalName() //$NON-NLS-1$
+ + " must implement " + ILabelProvider.class.getCanonicalName())); //$NON-NLS-1$
+ }
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not load label provider extension", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readPreservedFilters(IConfigurationElement element) {
+ String viewId = element.getAttribute(UiExtensionPointReader.ELEMENT_VIEW_ID);
+ IConfigurationElement[] children = element.getChildren();
+ for (IConfigurationElement child : children) {
+ if (child.getName().equals(UiExtensionPointReader.ELEMENT_FILTER)) {
+ try {
+ Object filterClass = child.createExecutableExtension(UiExtensionPointReader.ELEMENT_CLASS);
+ ContextUiPlugin.getDefault().addPreservedFilterClass(viewId, (ViewerFilter) filterClass);
+ } catch (Exception e) {
+ String filterId = child.getAttribute(ELEMENT_ID);
+ ContextUiPlugin.getDefault().addPreservedFilterId(viewId, filterId);
+ }
+ }
+ }
+ }
+
+ private static void readBridge(IConfigurationElement element) {
+ try {
+ Object bridge = element.createExecutableExtension(UiExtensionPointReader.ELEMENT_CLASS);
+ Object contentType = element.getAttribute(UiExtensionPointReader.ELEMENT_UI_BRIDGE_CONTENT_TYPE);
+ if (bridge instanceof AbstractContextUiBridge && contentType != null) {
+ ContextUiPlugin.getDefault().internalAddBridge((String) contentType,
+ (AbstractContextUiBridge) bridge);
+
+ String iconPath = element.getAttribute(ELEMENT_STRUCTURE_BRIDGE_SEARCH_ICON);
+ if (iconPath != null) {
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(
+ element.getDeclaringExtension().getContributor().getName(), iconPath);
+ if (descriptor != null) {
+ ContextUiPlugin.getDefault().setActiveSearchIcon((AbstractContextUiBridge) bridge,
+ descriptor);
+ }
+ }
+ String label = element.getAttribute(ELEMENT_STRUCTURE_BRIDGE_SEARCH_LABEL);
+ if (label != null) {
+ ContextUiPlugin.getDefault().setActiveSearchLabel((AbstractContextUiBridge) bridge, label);
+ }
+
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not load bridge: " //$NON-NLS-1$
+ + bridge.getClass().getCanonicalName() + " must implement " //$NON-NLS-1$
+ + AbstractContextUiBridge.class.getCanonicalName()));
+ }
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not load bridge extension", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ static class UiStartupExtensionPointReader {
+
+ private static final String EXTENSION_ID_STARTUP = "org.eclipse.mylyn.context.ui.startup"; //$NON-NLS-1$
+
+ private static final String ELEMENT_STARTUP = "startup"; //$NON-NLS-1$
+
+ private static final String ELEMENT_CLASS = "class"; //$NON-NLS-1$
+
+ public static void runStartupExtensions() {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_STARTUP);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().compareTo(ELEMENT_STARTUP) == 0) {
+ runStartupExtension(element);
+ }
+ }
+ }
+ }
+
+ private static void runStartupExtension(IConfigurationElement configurationElement) {
+ try {
+ Object object = WorkbenchPlugin.createExtension(configurationElement, ELEMENT_CLASS);
+ if (!(object instanceof IContextUiStartup)) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not : " //$NON-NLS-1$
+ + object.getClass().getCanonicalName() + " must implement " //$NON-NLS-1$
+ + AbstractContextStructureBridge.class.getCanonicalName()));
+ return;
+ }
+
+ IContextUiStartup startup = (IContextUiStartup) object;
+ startup.lazyStartup();
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not load startup extension", e)); //$NON-NLS-1$
+ }
+ }
+
+ }
+
+ private void setActiveSearchIcon(AbstractContextUiBridge bridge, ImageDescriptor descriptor) {
+ activeSearchIcons.put(bridge, descriptor);
+ }
+
+ public ImageDescriptor getActiveSearchIcon(AbstractContextUiBridge bridge) {
+ UiExtensionPointReader.initExtensions();
+ return activeSearchIcons.get(bridge);
+ }
+
+ private void setActiveSearchLabel(AbstractContextUiBridge bridge, String label) {
+ activeSearchLabels.put(bridge, label);
+ }
+
+ public String getActiveSearchLabel(AbstractContextUiBridge bridge) {
+ UiExtensionPointReader.initExtensions();
+ return activeSearchLabels.get(bridge);
+ }
+
+ public void addPreservedFilterClass(String viewId, ViewerFilter filter) {
+ Set<Class<?>> preservedList = preservedFilterClasses.get(viewId);
+ if (preservedList == null) {
+ preservedList = new HashSet<Class<?>>();
+ preservedFilterClasses.put(viewId, preservedList);
+ }
+ preservedList.add(filter.getClass());
+ }
+
+ public Set<Class<?>> getPreservedFilterClasses(String viewId) {
+ UiExtensionPointReader.initExtensions();
+ if (preservedFilterClasses.containsKey(viewId)) {
+ return preservedFilterClasses.get(viewId);
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+ public void addPreservedFilterId(String viewId, String filterId) {
+ Set<String> preservedList = preservedFilterIds.get(viewId);
+ if (preservedList == null) {
+ preservedList = new HashSet<String>();
+ preservedFilterIds.put(viewId, preservedList);
+ }
+ preservedList.add(filterId);
+ }
+
+ public Set<String> getPreservedFilterIds(String viewId) {
+ UiExtensionPointReader.initExtensions();
+ if (preservedFilterIds.containsKey(viewId)) {
+ return preservedFilterIds.get(viewId);
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+ public static ContextEditorManager getEditorManager() {
+ return INSTANCE.editorManager;
+ }
+
+ public static ContextPerspectiveManager getPerspectiveManager() {
+ return INSTANCE.perspectiveManager;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextWorkingSetManager.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextWorkingSetManager.java
new file mode 100644
index 0000000..65831d2
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/ContextWorkingSetManager.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetUpdater;
+
+/**
+ * TODO: consider removing
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class ContextWorkingSetManager implements IWorkingSetUpdater {
+
+ private static ContextWorkingSetManager INSTANCE = new ContextWorkingSetManager();
+
+ private List<ContextWorkingSetManager> workingSetUpdaters = null;
+
+ private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ case DEACTIVATED:
+ case CLEARED:
+ case INTEREST_CHANGED:
+ case ELEMENTS_DELETED:
+ case LANDMARKS_ADDED:
+ case LANDMARKS_REMOVED:
+ updateWorkingSet();
+ break;
+ }
+ }
+
+ };
+
+ public void addWorkingSetManager(ContextWorkingSetManager updater) {
+ if (workingSetUpdaters == null) {
+ workingSetUpdaters = new ArrayList<ContextWorkingSetManager>();
+ }
+ workingSetUpdaters.add(updater);
+ ContextCore.getContextManager().addListener(CONTEXT_LISTENER);
+ }
+
+ public void dispose() {
+ ContextCore.getContextManager().removeListener(CONTEXT_LISTENER);
+ }
+
+ public ContextWorkingSetManager getWorkingSetUpdater() {
+ if (workingSetUpdaters == null) {
+ return null;
+ } else {
+ return workingSetUpdaters.get(0);
+ }
+ }
+
+ /** Should only ever have 1 working set */
+ private final List<IWorkingSet> workingSets = new ArrayList<IWorkingSet>();
+
+ public void add(IWorkingSet workingSet) {
+ workingSets.add(workingSet);
+ }
+
+ public boolean remove(IWorkingSet workingSet) {
+ return workingSets.remove(workingSet);
+
+ }
+
+ public boolean contains(IWorkingSet workingSet) {
+ return workingSets.contains(workingSet);
+ }
+
+ private void updateWorkingSet() {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (workingSets.size() <= 0) {
+ return;
+ }
+ IWorkingSet set = workingSets.get(0);
+ set.setElements(new IAdaptable[] {});
+ List<IAdaptable> elements = new ArrayList<IAdaptable>();
+ getElementsFromContext(elements);
+ set.setElements(elements.toArray(new IAdaptable[elements.size()]));
+ }
+ });
+ }
+
+ public static void getElementsFromContext(List<IAdaptable> elements) {
+ for (IInteractionElement node : ContextCorePlugin.getContextManager().getActiveDocuments()) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(node.getContentType());
+
+ // HACK comparing extension to string
+ // No need to add bugzilla resources to the taskscape
+ // search...really slow and eclipese doesn't know about them
+ if (bridge.getContentType().equals("bugzilla")) { //$NON-NLS-1$
+ continue;
+ }
+
+ Object o = bridge.getObjectForHandle(node.getHandleIdentifier());
+ if (o instanceof IAdaptable) {
+ elements.add((IAdaptable) o);
+ }
+
+ }
+ }
+
+ public IWorkingSet getWorkingSet() {
+ return workingSets.get(0);
+ }
+
+ public static ContextWorkingSetManager getDefault() {
+ return INSTANCE;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/DoiOrderSorter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/DoiOrderSorter.java
new file mode 100644
index 0000000..46164ae
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/DoiOrderSorter.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.context.core.InterestComparator;
+
+/**
+ * @author Mik Kersten
+ */
+public class DoiOrderSorter extends ViewerSorter {
+ protected InterestComparator<Object> comparator = new InterestComparator<Object>();
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return comparator.compare(e1, e2);
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FocusedViewerManager.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FocusedViewerManager.java
new file mode 100644
index 0000000..718ec7f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/FocusedViewerManager.java
@@ -0,0 +1,334 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Encapsulates the element refresh and expansion state policy for all viewers focused on context.
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class FocusedViewerManager extends AbstractContextListener implements ISelectionListener {
+
+ private final CopyOnWriteArrayList<StructuredViewer> managedViewers = new CopyOnWriteArrayList<StructuredViewer>();
+
+ private final CopyOnWriteArrayList<StructuredViewer> filteredViewers = new CopyOnWriteArrayList<StructuredViewer>();
+
+ private final Map<StructuredViewer, BrowseFilteredListener> listenerMap = new HashMap<StructuredViewer, BrowseFilteredListener>();
+
+ private final Map<IWorkbenchPart, StructuredViewer> partToViewerMap = new HashMap<IWorkbenchPart, StructuredViewer>();
+
+ private final Map<StructuredViewer, FocusedViewerDelayedRefreshJob> fullRefreshJobs = new HashMap<StructuredViewer, FocusedViewerDelayedRefreshJob>();
+
+ // TODO: consider merging in order to discard minors when majors come in, see bug 209846
+ private final Map<StructuredViewer, FocusedViewerDelayedRefreshJob> minorRefreshJobs = new HashMap<StructuredViewer, FocusedViewerDelayedRefreshJob>();
+
+ private class FocusedViewerDelayedRefreshJob extends DelayedRefreshJob {
+
+ private boolean minor = false;
+
+ public FocusedViewerDelayedRefreshJob(StructuredViewer viewer, String name, boolean minor) {
+ super(viewer, name);
+ this.minor = minor;
+ }
+
+ @Override
+ protected void doRefresh(Object[] items) {
+
+ if (viewer == null) {
+ return;
+ } else if (viewer.getControl().isDisposed()) {
+ managedViewers.remove(viewer);
+ } else {
+ if (items == null || items.length == 0) {
+ if (!minor) {
+ viewer.refresh(false);
+ FocusedViewerManager.this.updateExpansionState(viewer, null);
+ } else {
+ try {
+ viewer.getControl().setRedraw(false);
+ viewer.refresh(true);
+ FocusedViewerManager.this.updateExpansionState(viewer, null);
+ } finally {
+ viewer.getControl().setRedraw(true);
+ }
+ }
+ } else {
+ if (filteredViewers.contains(viewer)) {
+ try {
+ viewer.getControl().setRedraw(false);
+ viewer.refresh(minor);
+ FocusedViewerManager.this.updateExpansionState(viewer, null);
+ } finally {
+ viewer.getControl().setRedraw(true);
+ }
+ } else { // don't need to worry about content changes
+ try {
+ viewer.getControl().setRedraw(false);
+ for (Object item : items) {
+ Object objectToRefresh = item;
+ if (item instanceof IInteractionElement) {
+ IInteractionElement node = (IInteractionElement) item;
+ AbstractContextStructureBridge structureBridge = ContextCorePlugin.getDefault()
+ .getStructureBridge(node.getContentType());
+ objectToRefresh = structureBridge.getObjectForHandle(node.getHandleIdentifier());
+ }
+ if (objectToRefresh != null) {
+ viewer.update(objectToRefresh, null);
+ FocusedViewerManager.this.updateExpansionState(viewer, objectToRefresh);
+ }
+ }
+ } finally {
+ viewer.getControl().setRedraw(true);
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ /**
+ * For testing.
+ */
+ private boolean syncRefreshMode = false;
+
+// private boolean internalExpandExceptionLogged;
+
+ public FocusedViewerManager() {
+ // NOTE: no longer using viewer part tracker due to bug 162346
+// VIEWER_PART_TRACKER.install(PlatformUI.getWorkbench());
+ }
+
+ public void dispose() {
+// VIEWER_PART_TRACKER.dispose(PlatformUI.getWorkbench());
+ }
+
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ // ignore
+ }
+
+ public void addManagedViewer(StructuredViewer viewer, IWorkbenchPart viewPart) {
+ if (viewer != null && !managedViewers.contains(viewer)) {
+ managedViewers.add(viewer);
+ partToViewerMap.put(viewPart, viewer);
+ BrowseFilteredListener listener = new BrowseFilteredListener(viewer);
+ listenerMap.put(viewer, listener);
+ viewer.getControl().addMouseListener(listener);
+ viewer.getControl().addKeyListener(listener);
+
+ try {
+ // NOTE: this needs to be done because some views (e.g. Project Explorer) are not
+ // correctly initialized on startup and do not have the dummy selection event
+ // sent to them. See PartPluginAction and bug 213545.
+ // TODO consider a mechanism to identify only views that provide focus
+ UiUtil.initializeViewerSelection(viewPart);
+ Set<IInteractionElement> emptySet = Collections.emptySet();
+ refreshViewer(emptySet, true, viewer);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not initialize focused viewer", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public void removeManagedViewer(StructuredViewer viewer, IWorkbenchPart viewPart) {
+ managedViewers.remove(viewer);
+ partToViewerMap.remove(viewPart);
+ BrowseFilteredListener listener = listenerMap.get(viewer);
+ if (listener != null && viewer != null && !viewer.getControl().isDisposed()) {
+ viewer.getControl().removeMouseListener(listener);
+ viewer.getControl().removeKeyListener(listener);
+ }
+ }
+
+ public void addFilteredViewer(StructuredViewer viewer) {
+ if (viewer != null && !filteredViewers.contains(viewer)) {
+ filteredViewers.add(viewer);
+ }
+ }
+
+ public void removeFilteredViewer(StructuredViewer viewer) {
+ filteredViewers.remove(viewer);
+ }
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ refreshViewers();
+ break;
+ case DEACTIVATED:
+ refreshViewers();
+ for (StructuredViewer structuredViewer : managedViewers) {
+ if (structuredViewer instanceof TreeViewer) {
+ ((TreeViewer) structuredViewer).collapseAll();
+ }
+ }
+ break;
+ case CLEARED:
+ if (event.isActiveContext()) {
+ // ensure we dont refresh the viewers if a context other than the active one is deleted or cleared
+ // bug #265688
+ refreshViewers();
+ for (StructuredViewer structuredViewer : managedViewers) {
+ if (structuredViewer instanceof TreeViewer) {
+ ((TreeViewer) structuredViewer).collapseAll();
+ }
+ }
+ }
+ break;
+ case INTEREST_CHANGED:
+ refreshViewers(event.getElements(), false);
+ break;
+ case LANDMARKS_ADDED:
+ refreshViewers(event.getElements(), true);
+ break;
+ case LANDMARKS_REMOVED:
+ refreshViewers(event.getElements(), true);
+ break;
+ case ELEMENTS_DELETED:
+ /*
+ * TODO: consider making this work per-element and parent
+ * Should we collect all parents before calling refresh?
+ */
+ ArrayList<IInteractionElement> toRefresh = new ArrayList<IInteractionElement>();
+ for (IInteractionElement interactionElement : event.getElements()) {
+ AbstractContextStructureBridge structureBridge = ContextCore.getStructureBridge(interactionElement.getContentType());
+ IInteractionElement parent = ContextCore.getContextManager().getElement(
+ structureBridge.getParentHandle(interactionElement.getHandleIdentifier()));
+ if (parent != null) {
+ toRefresh.add(parent);
+ }
+ }
+ refreshViewers(toRefresh, false);
+
+ break;
+ }
+ }
+
+ protected void refreshViewers() {
+ List<IInteractionElement> toRefresh = Collections.emptyList();
+ refreshViewers(toRefresh, true);
+ }
+
+ protected void refreshViewers(IInteractionElement node, boolean updateLabels) {
+ List<IInteractionElement> toRefresh = new ArrayList<IInteractionElement>();
+ toRefresh.add(node);
+ refreshViewers(toRefresh, updateLabels);
+ }
+
+ protected void refreshViewers(final List<IInteractionElement> nodesToRefresh, final boolean updateLabels) {
+ // TODO replace by Assert.isNotNull(nodesToRefresh);
+ if (nodesToRefresh == null) {
+ return;
+ }
+
+ if (syncRefreshMode) {
+ internalRefresh(new HashSet<IInteractionElement>(nodesToRefresh), updateLabels);
+ } else {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ internalRefresh(new HashSet<IInteractionElement>(nodesToRefresh), updateLabels);
+ }
+ });
+ }
+ }
+
+ private void internalRefresh(final Set<IInteractionElement> nodesToRefresh, final boolean updateLabels) {
+ try {
+ for (StructuredViewer viewer : managedViewers) {
+ refreshViewer(nodesToRefresh, updateLabels, viewer);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Could not refresh viewer", t)); //$NON-NLS-1$
+ }
+ }
+
+ public void refreshViewer(final Set<IInteractionElement> nodesToRefresh, final boolean updateLabels,
+ StructuredViewer viewer) {
+
+ Map<StructuredViewer, FocusedViewerDelayedRefreshJob> refreshJobs = null;
+ if (updateLabels) {
+ refreshJobs = minorRefreshJobs;
+ } else {
+ refreshJobs = fullRefreshJobs;
+ }
+ FocusedViewerDelayedRefreshJob job = refreshJobs.get(viewer);
+ if (job == null) {
+ job = new FocusedViewerDelayedRefreshJob(viewer, "refresh viewer", updateLabels); //$NON-NLS-1$
+ refreshJobs.put(viewer, job);
+ }
+ job.refreshElements(nodesToRefresh.toArray());
+
+ }
+
+ private void updateExpansionState(StructuredViewer viewer, Object objectToRefresh) {
+ if (viewer instanceof TreeViewer
+ && filteredViewers.contains(viewer)
+ && ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION)) {
+ TreeViewer treeViewer = (TreeViewer) viewer;
+
+ // HACK to fix bug 278569: [context] errors with Markers view and active Mylyn task
+ if ("org.eclipse.ui.internal.views.markers.MarkersTreeViewer".equals(treeViewer.getClass() //$NON-NLS-1$
+ .getCanonicalName())) {
+ objectToRefresh = null;
+ }
+
+ if (objectToRefresh == null) {
+ treeViewer.expandAll();
+ } else {
+ treeViewer.expandToLevel(objectToRefresh, AbstractTreeViewer.ALL_LEVELS);
+ }
+ }
+ }
+
+ /**
+ * Set to true for testing
+ */
+ public void setSyncRefreshMode(boolean syncRefreshMode) {
+ this.syncRefreshMode = syncRefreshMode;
+ }
+
+ public void forceRefresh() {
+ refreshViewers();
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/HighlighterImageDescriptor.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/HighlighterImageDescriptor.java
new file mode 100644
index 0000000..88619a4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/HighlighterImageDescriptor.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Mik Kersten
+ */
+public class HighlighterImageDescriptor extends ImageDescriptor {
+
+ private final Image image;
+
+ public HighlighterImageDescriptor(Color fromColor, Color toColor) {
+ super();
+ if (fromColor == null) {
+ fromColor = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
+ }
+ if (toColor == null) {
+ toColor = Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
+ }
+ ImageData band = createGradientBand(50, 20, false, new RGB(fromColor.getRed(), fromColor.getGreen(),
+ fromColor.getBlue()), new RGB(toColor.getRed(), toColor.getGreen(), toColor.getBlue()), 7, 7, 7);
+ image = new Image(Display.getCurrent(), band);
+ }
+
+ @Override
+ public void destroyResource(Object previouslyCreatedObject) {
+ image.dispose();
+ super.destroyResource(previouslyCreatedObject);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof HighlighterImageDescriptor && image.equals(((HighlighterImageDescriptor) obj).image);
+ }
+
+ @Override
+ public ImageData getImageData() {
+ return image.getImageData();
+ }
+
+ @Override
+ public int hashCode() {
+ return image.hashCode();
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ // ----------- COPIED FROM ImageData ---------------
+
+ /**
+ * Creates an ImageData containing one band's worth of a gradient filled block. If <code>vertical</code> is true,
+ * the band must be tiled horizontally to fill a region, otherwise it must be tiled vertically.
+ *
+ * @param width
+ * the width of the region to be filled
+ * @param height
+ * the height of the region to be filled
+ * @param vertical
+ * if true sweeps from top to bottom, else sweeps from left to right
+ * @param fromRGB
+ * the color to start with
+ * @param toRGB
+ * the color to end with
+ * @param redBits
+ * the number of significant red bits, 0 for palette modes
+ * @param greenBits
+ * the number of significant green bits, 0 for palette modes
+ * @param blueBits
+ * the number of significant blue bits, 0 for palette modes
+ * @return the new ImageData
+ */
+ static ImageData createGradientBand(int width, int height, boolean vertical, RGB fromRGB, RGB toRGB, int redBits,
+ int greenBits, int blueBits) {
+ /* Gradients are drawn as tiled bands */
+ final int bandWidth, bandHeight, bitmapDepth;
+ final byte[] bitmapData;
+ final PaletteData paletteData;
+ /* Select an algorithm depending on the depth of the screen */
+ if (redBits != 0 && greenBits != 0 && blueBits != 0) {
+ paletteData = new PaletteData(0x0000ff00, 0x00ff0000, 0xff000000);
+ bitmapDepth = 32;
+ if (redBits >= 8 && greenBits >= 8 && blueBits >= 8) {
+ /* Precise color */
+ final int steps;
+ if (vertical) {
+ bandWidth = 1;
+ bandHeight = height;
+ steps = bandHeight > 1 ? bandHeight - 1 : 1;
+ } else {
+ bandWidth = width;
+ bandHeight = 1;
+ steps = bandWidth > 1 ? bandWidth - 1 : 1;
+ }
+ final int bytesPerLine = bandWidth * 4;
+ bitmapData = new byte[bandHeight * bytesPerLine];
+ buildPreciseGradientChannel(fromRGB.blue, toRGB.blue, steps, bandWidth, bandHeight, vertical,
+ bitmapData, 0, bytesPerLine);
+ buildPreciseGradientChannel(fromRGB.green, toRGB.green, steps, bandWidth, bandHeight, vertical,
+ bitmapData, 1, bytesPerLine);
+ buildPreciseGradientChannel(fromRGB.red, toRGB.red, steps, bandWidth, bandHeight, vertical, bitmapData,
+ 2, bytesPerLine);
+ } else {
+ /* Dithered color */
+ final int steps;
+ if (vertical) {
+ bandWidth = (width < 8) ? width : 8;
+ bandHeight = height;
+ steps = bandHeight > 1 ? bandHeight - 1 : 1;
+ } else {
+ bandWidth = width;
+ bandHeight = (height < 8) ? height : 8;
+ steps = bandWidth > 1 ? bandWidth - 1 : 1;
+ }
+ final int bytesPerLine = bandWidth * 4;
+ bitmapData = new byte[bandHeight * bytesPerLine];
+ buildDitheredGradientChannel(fromRGB.blue, toRGB.blue, steps, bandWidth, bandHeight, vertical,
+ bitmapData, 0, bytesPerLine, blueBits);
+ buildDitheredGradientChannel(fromRGB.green, toRGB.green, steps, bandWidth, bandHeight, vertical,
+ bitmapData, 1, bytesPerLine, greenBits);
+ buildDitheredGradientChannel(fromRGB.red, toRGB.red, steps, bandWidth, bandHeight, vertical,
+ bitmapData, 2, bytesPerLine, redBits);
+ }
+ } else {
+ /* Dithered two tone */
+ paletteData = new PaletteData(new RGB[] { fromRGB, toRGB });
+ bitmapDepth = 8;
+ final int blendi;
+ if (vertical) {
+ bandWidth = (width < 8) ? width : 8;
+ bandHeight = height;
+ blendi = (bandHeight > 1) ? 0x1040000 / (bandHeight - 1) + 1 : 1;
+ } else {
+ bandWidth = width;
+ bandHeight = (height < 8) ? height : 8;
+ blendi = (bandWidth > 1) ? 0x1040000 / (bandWidth - 1) + 1 : 1;
+ }
+ final int bytesPerLine = (bandWidth + 3) & -4;
+ bitmapData = new byte[bandHeight * bytesPerLine];
+ if (vertical) {
+ for (int dy = 0, blend = 0, dp = 0; dy < bandHeight; ++dy, blend += blendi, dp += bytesPerLine) {
+ for (int dx = 0; dx < bandWidth; ++dx) {
+ bitmapData[dp + dx] = (blend + DITHER_MATRIX[dy & 7][dx]) < 0x1000000 ? (byte) 0 : (byte) 1;
+ }
+ }
+ } else {
+ for (int dx = 0, blend = 0; dx < bandWidth; ++dx, blend += blendi) {
+ for (int dy = 0, dptr = dx; dy < bandHeight; ++dy, dptr += bytesPerLine) {
+ bitmapData[dptr] = (blend + DITHER_MATRIX[dy][dx & 7]) < 0x1000000 ? (byte) 0 : (byte) 1;
+ }
+ }
+ }
+ }
+ return new ImageData(bandWidth, bandHeight, bitmapDepth, paletteData, 4, bitmapData);
+ }
+
+ /*
+ * Fill in dithered gradated values for a color channel
+ */
+ static final void buildDitheredGradientChannel(int from, int to, int steps, int bandWidth, int bandHeight,
+ boolean vertical, byte[] bitmapData, int dp, int bytesPerLine, int bits) {
+ final int mask = 0xff00 >>> bits;
+ int val = from << 16;
+ final int inc = ((to << 16) - val) / steps + 1;
+ if (vertical) {
+ for (int dy = 0; dy < bandHeight; ++dy, dp += bytesPerLine) {
+ for (int dx = 0, dptr = dp; dx < bandWidth; ++dx, dptr += 4) {
+ final int thresh = DITHER_MATRIX[dy & 7][dx] >>> bits;
+ int temp = val + thresh;
+ if (temp > 0xffffff) {
+ bitmapData[dptr] = -1;
+ } else {
+ bitmapData[dptr] = (byte) ((temp >>> 16) & mask);
+ }
+ }
+ val += inc;
+ }
+ } else {
+ for (int dx = 0; dx < bandWidth; ++dx, dp += 4) {
+ for (int dy = 0, dptr = dp; dy < bandHeight; ++dy, dptr += bytesPerLine) {
+ final int thresh = DITHER_MATRIX[dy][dx & 7] >>> bits;
+ int temp = val + thresh;
+ if (temp > 0xffffff) {
+ bitmapData[dptr] = -1;
+ } else {
+ bitmapData[dptr] = (byte) ((temp >>> 16) & mask);
+ }
+ }
+ val += inc;
+ }
+ }
+ }
+
+ /*
+ * Fill in gradated values for a color channel
+ */
+ static final void buildPreciseGradientChannel(int from, int to, int steps, int bandWidth, int bandHeight,
+ boolean vertical, byte[] bitmapData, int dp, int bytesPerLine) {
+ int val = from << 16;
+ final int inc = ((to << 16) - val) / steps + 1;
+ if (vertical) {
+ for (int dy = 0; dy < bandHeight; ++dy, dp += bytesPerLine) {
+ bitmapData[dp] = (byte) (val >>> 16);
+ val += inc;
+ }
+ } else {
+ for (int dx = 0; dx < bandWidth; ++dx, dp += 4) {
+ bitmapData[dp] = (byte) (val >>> 16);
+ val += inc;
+ }
+ }
+ }
+
+ /**
+ * Scaled 8x8 Bayer dither matrix.
+ */
+ static final int[][] DITHER_MATRIX = {
+ { 0xfc0000, 0x7c0000, 0xdc0000, 0x5c0000, 0xf40000, 0x740000, 0xd40000, 0x540000 },
+ { 0x3c0000, 0xbc0000, 0x1c0000, 0x9c0000, 0x340000, 0xb40000, 0x140000, 0x940000 },
+ { 0xcc0000, 0x4c0000, 0xec0000, 0x6c0000, 0xc40000, 0x440000, 0xe40000, 0x640000 },
+ { 0x0c0000, 0x8c0000, 0x2c0000, 0xac0000, 0x040000, 0x840000, 0x240000, 0xa40000 },
+ { 0xf00000, 0x700000, 0xd00000, 0x500000, 0xf80000, 0x780000, 0xd80000, 0x580000 },
+ { 0x300000, 0xb00000, 0x100000, 0x900000, 0x380000, 0xb80000, 0x180000, 0x980000 },
+ { 0xc00000, 0x400000, 0xe00000, 0x600000, 0xc80000, 0x480000, 0xe80000, 0x680000 },
+ { 0x000000, 0x800000, 0x200000, 0xa00000, 0x080000, 0x880000, 0x280000, 0xa80000 } };
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/IContextUiPreferenceContstants.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/IContextUiPreferenceContstants.java
new file mode 100644
index 0000000..a2b7a7f
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/IContextUiPreferenceContstants.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IContextUiPreferenceContstants {
+
+ public static final String AUTO_MANAGE_EDITOR_CLOSE = "org.eclipse.mylyn.context.ui.close.action.manage"; //$NON-NLS-1$
+
+ public static final String AUTO_MANAGE_EDITOR_CLOSE_WARNING = "org.eclipse.mylyn.context.ui.close.action.manage.warning"; //$NON-NLS-1$
+
+ public static final String AUTO_MANAGE_EDITORS = "org.eclipse.mylyn.context.ui.editors.auto.manage"; //$NON-NLS-1$
+
+ public static final String AUTO_MANAGE_PERSPECTIVES = "org.eclipse.mylyn.ide.ui.perspectives.auto.manage"; //$NON-NLS-1$
+
+ public static final String AUTO_MANAGE_EXPANSION = "org.eclipse.mylyn.ide.ui.expansion.auto.manage"; //$NON-NLS-1$
+
+ public static final String AUTO_FOCUS_NAVIGATORS = "org.eclipse.mylyn.context.ui.navigators.filter.auto.enable"; //$NON-NLS-1$
+
+ public static final String PERSPECTIVE_NO_ACTIVE_TASK = "org.eclipse.mylyn.ui.perspectives.task.none"; //$NON-NLS-1$
+
+ public static final String PREFIX_TASK_TO_PERSPECTIVE = "org.eclipse.mylyn.ui.perspectives.task."; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/InterestDecorator.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/InterestDecorator.java
new file mode 100644
index 0000000..5aa1e56
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/InterestDecorator.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.viewers.IColorDecorator;
+import org.eclipse.jface.viewers.IFontDecorator;
+import org.eclipse.jface.viewers.ILabelDecorator;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.context.core.InteractionContextRelation;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Not currently used.
+ *
+ * @author Mik Kersten
+ */
+ at Deprecated
+public class InterestDecorator implements ILabelDecorator, IFontDecorator, IColorDecorator {
+
+ private IInteractionElement getNode(Object element) {
+ IInteractionElement node = null;
+ if (element instanceof IInteractionElement) {
+ node = (IInteractionElement) element;
+ } else {
+ AbstractContextStructureBridge adapter = ContextCore.getStructureBridge(element);
+ node = ContextCore.getContextManager().getElement(adapter.getHandleIdentifier(element));
+ }
+ return node;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ // don't care about listeners
+ }
+
+ public void dispose() {
+ // don't care when we are disposed
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // don't care about listeners
+ }
+
+ public Image decorateImage(Image image, Object element) {
+ return null;
+ }
+
+ public String decorateText(String text, Object element) {
+ return null;
+ }
+
+ public Font decorateFont(Object element) {
+ IInteractionElement node = getNode(element);
+ if (node != null) {
+ if (node.getInterest().isLandmark() && !node.getInterest().isPropagated()) {
+ return CommonFonts.BOLD;
+ }
+ }
+ return null;
+ }
+
+ public Color decorateForeground(Object element) {
+ IInteractionElement node = getNode(element);
+ if (element instanceof InteractionContextRelation) {
+ return ColorMap.RELATIONSHIP;
+ } else if (node != null) {
+ return ContextUi.getForeground(node);
+ }
+ return null;
+ }
+
+ public Color decorateBackground(Object element) {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/InterestDecoratorLightweight.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/InterestDecoratorLightweight.java
new file mode 100644
index 0000000..461350d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/InterestDecoratorLightweight.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.ConcurrentModificationException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContextRelation;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Mik Kersten
+ */
+public class InterestDecoratorLightweight implements ILightweightLabelDecorator {
+
+ public InterestDecoratorLightweight() {
+ super();
+ }
+
+ public void decorate(Object element, IDecoration decoration) {
+ if (ContextCore.getContextManager() != null && !ContextCore.getContextManager().isContextActive()) {
+ return;
+ }
+
+ AbstractContextStructureBridge bridge = null;
+ try {
+ if (ContextCorePlugin.getDefault() == null) {
+ return;
+ }
+ bridge = ContextCore.getStructureBridge(element);
+ } catch (ConcurrentModificationException cme) {
+ // ignored, because we can add structure bridges during decoration
+ }
+ try {
+ // NOTE: awkward coupling and special rule to deal with tasks, see bug 212639
+ if (!(element instanceof ITask)) {
+ IInteractionElement node = null;
+ if (element instanceof InteractionContextRelation) {
+ decoration.setForegroundColor(ColorMap.RELATIONSHIP);
+ } else if (element instanceof IInteractionElement) {
+ node = (IInteractionElement) element;
+ } else {
+ if (bridge != null && bridge.getContentType() != null) {
+ node = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(element));
+ }
+ }
+ if (node != null) {
+ decoration.setForegroundColor(ContextUi.getForeground(node));
+ if (bridge != null && bridge.canBeLandmark(node.getHandleIdentifier())
+ && node.getInterest().isLandmark() && !node.getInterest().isPropagated()
+ && !node.getInterest().isPredicted()) {
+ decoration.setFont(CommonFonts.BOLD);
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Decoration failed", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ // don't care about listeners
+ }
+
+ public void dispose() {
+ // don't care when we are disposed
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // don't care about listeners
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/Messages.java
new file mode 100644
index 0000000..5dcb50b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/Messages.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ContextUiPlugin_No_local_task_context_exists;
+
+ public static String ContextUiPlugin_Task_Activation;
+
+ public static String TaskContextWorkingSetPage_Cannot_create_another_Active_Taskscape_Working_Set;
+
+ public static String TaskContextWorkingSetPage_CREATE_THE_MYLYN_CONTEXT_WORKING_SET;
+
+ public static String TaskContextWorkingSetPage_Mylyn_Task_Context_Working_Set;
+
+ public static String TaskContextWorkingSetPage_Name;
+
+ public static String TaskContextWorkingSetPage_NOTE_THIS_WORKING_SET_SHOULD_ONLY_BE_USED_FOR_SEARCHS;
+
+ public static String TaskContextWorkingSetPage_TASK_CONTEXT_FOR_SEARCH;
+
+ public static String UiUtil_Mylyn_Interest_Manipulation;
+
+ public static String UiUtil_Not_a_valid_landmark;
+
+ public static String AbstractFocusViewAction_Apply_Mylyn;
+
+ public static String AbstractFocusViewAction_Empty_task_context;
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskContextWorkingSetPage.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskContextWorkingSetPage.java
new file mode 100644
index 0000000..1f56ef1
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskContextWorkingSetPage.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.dialogs.IWorkingSetPage;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Shawn Minto
+ */
+public class TaskContextWorkingSetPage extends WizardPage implements IWorkingSetPage {
+
+ private Text workingSetNameText;
+
+ private IWorkingSet workingSet;
+
+ public static final String WORKING_SET_NAME = Messages.TaskContextWorkingSetPage_TASK_CONTEXT_FOR_SEARCH;
+
+ public TaskContextWorkingSetPage() {
+ super(
+ "org.eclipse.mylyn.monitor.ui.workingSetPage", Messages.TaskContextWorkingSetPage_Mylyn_Task_Context_Working_Set, //$NON-NLS-1$
+ AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.context.ui", //$NON-NLS-1$
+ "icons/wizban/banner-prefs.gif")); //$NON-NLS-1$
+ setDescription(Messages.TaskContextWorkingSetPage_CREATE_THE_MYLYN_CONTEXT_WORKING_SET);
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ setControl(composite);
+
+ Label label = new Label(composite, SWT.WRAP);
+ label.setText(Messages.TaskContextWorkingSetPage_Name);
+ GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL
+ | GridData.VERTICAL_ALIGN_CENTER);
+ label.setLayoutData(gd);
+
+ workingSetNameText = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ workingSetNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+ workingSetNameText.setFocus();
+ workingSetNameText.setEditable(false);
+ workingSetNameText.setText(WORKING_SET_NAME);
+
+ label = new Label(composite, SWT.WRAP);
+ label.setText(""); //$NON-NLS-1$
+ gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+ label.setLayoutData(gd);
+
+ label = new Label(composite, SWT.WRAP);
+ label.setText(Messages.TaskContextWorkingSetPage_NOTE_THIS_WORKING_SET_SHOULD_ONLY_BE_USED_FOR_SEARCHS);
+ label.setFont(CommonFonts.BOLD);
+ gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+ label.setLayoutData(gd);
+
+ label = new Label(composite, SWT.WRAP);
+ label.setText(""); //$NON-NLS-1$
+ gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+ label.setLayoutData(gd);
+
+ // label = new Label(composite, SWT.WRAP);
+ // label.setText("PLEASE DO NOT ACTIVATE THIS WORKING SET AT
+ // ANYTIME.\nTHIS WORKING SET IS ONLY USEFUL FOR SEARCHING.");
+ // label.setFont(UiUtil.BOLD);
+ // gd= new GridData(GridData.GRAB_HORIZONTAL |
+ // GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+ // label.setLayoutData(gd);
+
+ Dialog.applyDialogFont(composite);
+ }
+
+ public IWorkingSet getSelection() {
+ return workingSet;
+ }
+
+ public void setSelection(IWorkingSet workingSet) {
+ // don't need to do anything here
+ }
+
+ public void finish() {
+ String workingSetName = workingSetNameText.getText();
+ ArrayList<IAdaptable> elements = new ArrayList<IAdaptable>(1);
+ ContextWorkingSetManager.getElementsFromContext(elements);
+ if (workingSet == null) {
+ IWorkingSetManager workingSetManager = ContextUiPlugin.getDefault().getWorkbench().getWorkingSetManager();
+ if ((workingSet = workingSetManager.getWorkingSet(workingSetName)) == null) {
+ workingSet = workingSetManager.createWorkingSet(workingSetName,
+ elements.toArray(new IAdaptable[elements.size()]));
+ }
+ }
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ String workingSetName = workingSetNameText.getText();
+ IWorkingSetManager workingSetManager = ContextUiPlugin.getDefault().getWorkbench().getWorkingSetManager();
+ if (workingSetManager.getWorkingSet(workingSetName) != null) {
+ setErrorMessage(Messages.TaskContextWorkingSetPage_Cannot_create_another_Active_Taskscape_Working_Set);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskStructureBridge.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskStructureBridge.java
new file mode 100644
index 0000000..71f040e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskStructureBridge.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskStructureBridge extends AbstractContextStructureBridge {
+
+ public static final String CONTENT_TYPE = "meta/task"; //$NON-NLS-1$
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object instanceof ITask) {
+ return ((ITask) object).getHandleIdentifier();
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ return null;
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ return TasksUi.getRepositoryModel().getTask(handle);
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof ITask) {
+ return ((ITask) object).getSummary();
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return false;
+ }
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ return object instanceof IRepositoryElement;
+ }
+
+ @Override
+ public boolean canFilter(Object object) {
+ return object instanceof ITask;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return getObjectForHandle(handle) instanceof ITask;
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object resource, int offset) {
+ return null;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ return getContentType();
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskUiBridge.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskUiBridge.java
new file mode 100644
index 0000000..da91c4b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/TaskUiBridge.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskUiBridge extends AbstractContextUiBridge {
+
+ @Override
+ public void open(IInteractionElement node) {
+ // ignore
+ }
+
+ @Override
+ public void close(IInteractionElement node) {
+ // ignore
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return editorPart instanceof TaskEditor;
+ }
+
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editorPart) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ return null;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return TaskStructureBridge.CONTENT_TYPE;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/UiUtil.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/UiUtil.java
new file mode 100644
index 0000000..473a78e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/UiUtil.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+// TODO 3.3 move methods to other class
+public class UiUtil {
+
+ public static void initializeViewerSelection(IWorkbenchPart part) {
+ ISelectionProvider selectionProvider = part.getSite().getSelectionProvider();
+ if (selectionProvider != null) {
+ ISelection selection = selectionProvider.getSelection();
+ try {
+ if (selection != null) {
+ selectionProvider.setSelection(selection);
+ } else {
+ selectionProvider.setSelection(StructuredSelection.EMPTY);
+ }
+ } catch (UnsupportedOperationException e) {
+ // ignore if the selection does not support setting a selection, see bug 217634
+ }
+ }
+ }
+
+ public static void displayInterestManipulationFailure() {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
+ Messages.UiUtil_Mylyn_Interest_Manipulation, Messages.UiUtil_Not_a_valid_landmark);
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/AbstractInterestManipulationAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/AbstractInterestManipulationAction.java
new file mode 100644
index 0000000..1731189
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/AbstractInterestManipulationAction.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.UiUtil;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractInterestManipulationAction implements IViewActionDelegate, IWorkbenchWindowActionDelegate {
+
+ public static final String SOURCE_ID = "org.eclipse.mylyn.ui.interest.user"; //$NON-NLS-1$
+
+ protected IViewPart view;
+
+ protected IWorkbenchWindow window;
+
+ protected boolean preserveUninteresting = false;
+
+ private ISelection selection;
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void init(IViewPart view) {
+ this.view = view;
+ }
+
+ @Deprecated
+ protected boolean isRemove() {
+ return !isIncrement();
+ }
+
+ protected abstract boolean isIncrement();
+
+ /**
+ * Override to return a different context.
+ */
+ protected IInteractionContext getContext() {
+ return ContextCore.getContextManager().getActiveContext();
+ }
+
+ public void run(IAction action) {
+ if (!ContextCore.getContextManager().isContextActive()) {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), Messages.AbstractInterestManipulationAction_Interest_Manipulation, Messages.AbstractInterestManipulationAction_No_task_context_is_active);
+ return;
+ }
+
+ boolean increment = !isRemove();
+
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ for (Object object : structuredSelection.toList()) {
+ IInteractionElement node = convertSelectionToInteractionElement(object);
+ if (node != null) {
+ if (!increment) {
+ try {
+ // NOTE: need to set the selection null so the
+ // automatic reselection does not induce interest
+ PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart()
+ .getSite()
+ .getSelectionProvider()
+ .setSelection(null);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ boolean manipulated = ContextCorePlugin.getContextManager().manipulateInterestForElement(node,
+ increment, false, preserveUninteresting, SOURCE_ID, getContext());
+ if (!manipulated) {
+ UiUtil.displayInterestManipulationFailure();
+ }
+ }
+ }
+ } else {
+ IInteractionElement node = ContextCore.getContextManager().getActiveElement();
+ if (node != null) {
+ boolean manipulated = ContextCorePlugin.getContextManager().manipulateInterestForElement(node,
+ increment, false, false, SOURCE_ID, getContext());
+ if (!manipulated) {
+ UiUtil.displayInterestManipulationFailure();
+ }
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), Messages.AbstractInterestManipulationAction_Interest_Manipulation, Messages.AbstractInterestManipulationAction_No_task_context_is_active);
+ }
+ }
+ }
+
+ /**
+ * TODO: consider moving this extensibility to the UI Bridge
+ */
+ protected IInteractionElement convertSelectionToInteractionElement(Object object) {
+ IInteractionElement node = null;
+ if (object instanceof IInteractionElement) {
+ node = (IInteractionElement) object;
+ } else {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ String handle = bridge.getHandleIdentifier(object);
+ node = ContextCore.getContextManager().getElement(handle);
+ }
+ return node;
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selection = selection;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextActiveActionFilter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextActiveActionFilter.java
new file mode 100644
index 0000000..11afdb6
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextActiveActionFilter.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.ui.IActionFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextActiveActionFilter implements IActionFilter {
+
+ public boolean testAttribute(Object target, String name, String value) {
+ return ContextCore.getContextManager().isContextActive();
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextAttachAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextAttachAction.java
new file mode 100644
index 0000000..8068910
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextAttachAction.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.ui.commands.AttachContextHandler;
+import org.eclipse.mylyn.internal.context.ui.wizards.ContextAttachWizard;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @deprecated use {@link AttachContextHandler} instead
+ */
+ at SuppressWarnings("restriction")
+ at Deprecated
+public class ContextAttachAction extends Action implements IViewActionDelegate {
+
+ private ITask task;
+
+ private static final String ID_ACTION = "org.eclipse.mylyn.context.ui.repository.task.attach"; //$NON-NLS-1$
+
+ public ContextAttachAction() {
+ setText(Messages.ContextAttachAction_Attach_);
+ setToolTipText(Messages.ContextAttachAction_Attach_Task_Context);
+ setId(ID_ACTION);
+ setImageDescriptor(TasksUiImages.CONTEXT_ATTACH);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ run(this);
+ }
+
+ public void run(IAction action) {
+ if (task == null) {
+ return;
+ } else {
+ run(task);
+ }
+ }
+
+ public void run(ITask task) {
+ if (task.getSynchronizationState() != SynchronizationState.SYNCHRONIZED) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ContextAttachAction_Context_Attachment,
+ Messages.ContextAttachAction_Task_must_be_synchronized_before_attaching_context);
+ return;
+ }
+
+ ContextAttachWizard wizard = new ContextAttachWizard(task);
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ AbstractTask selectedTask = TaskListView.getSelectedTask(selection);
+ if (selectedTask != null) {
+ task = selectedTask;
+ action.setEnabled(AttachmentUtil.canUploadAttachment(task)
+ && (task.isActive() || ContextCore.getContextManager().hasContext(task.getHandleIdentifier())));
+ } else {
+ task = null;
+ action.setEnabled(false);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextClearAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextClearAction.java
new file mode 100644
index 0000000..baf7a12
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextClearAction.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.ui.commands.ClearContextHandler;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @deprecated use {@link ClearContextHandler} instead
+ */
+ at SuppressWarnings("restriction")
+ at Deprecated
+public class ContextClearAction extends TaskContextAction {
+
+ public static final String ID = "org.eclipse.mylyn.ui.clear.context"; //$NON-NLS-1$
+
+ private static final String ID_ACTION = "org.eclipse.mylyn.context.ui.task.clear"; //$NON-NLS-1$
+
+ public ContextClearAction() {
+ setText(Messages.ContextClearAction_Clear);
+ setToolTipText(Messages.ContextClearAction_Clear);
+ setId(ID_ACTION);
+ setImageDescriptor(TasksUiImages.CONTEXT_CLEAR);
+ }
+
+ public void init(IViewPart view) {
+
+ }
+
+ @Override
+ public void run() {
+ run(this);
+ }
+
+ public void run(IAction action) {
+ ITask task = TaskListView.getFromActivePerspective().getSelectedTask();
+ if (task != null) {
+ run(task);
+ }
+ }
+
+ public boolean run(ITask task) {
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), Messages.ContextClearAction_Confirm_clear_context,
+ Messages.ContextClearAction_Clear_the_context_for_the_selected_task);
+ if (!deleteConfirmed) {
+ return false;
+ }
+
+ ContextCore.getContextManager().deleteContext(task.getHandleIdentifier());
+ TasksUiInternal.getTaskList().notifyElementChanged(task);
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextCopyAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextCopyAction.java
new file mode 100644
index 0000000..9f70ee7
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextCopyAction.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.internal.context.ui.commands.CopyContextHandler;
+import org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialog;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @deprecated use {@link CopyContextHandler} instead
+ */
+ at SuppressWarnings("restriction")
+ at Deprecated
+public class ContextCopyAction extends TaskContextAction {
+
+ private static final String ID_ACTION = "org.eclipse.mylyn.context.ui.task.copy.context.to"; //$NON-NLS-1$
+
+ public ContextCopyAction() {
+ setText(Messages.ContextCopyAction_Copy_to_);
+ setToolTipText(Messages.ContextCopyAction_Copy_Task_Context_to_);
+ setId(ID_ACTION);
+ setImageDescriptor(TasksUiImages.CONTEXT_TRANSFER);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ run(getSelectedTask(selection));
+ }
+
+ public void run(IAction action) {
+ run(getSelectedTask(selection));
+ }
+
+ public void run(ITask sourceTask) {
+ if (sourceTask == null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ContextCopyAction_Copy_Context, Messages.ContextCopyAction_No_source_task_selected);
+ return;
+ }
+
+ TaskSelectionDialog dialog = new TaskSelectionDialog(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell());
+ dialog.setNeedsCreateTask(false);
+ dialog.setTitle(Messages.ContextCopyAction_Select_Target_Task);
+ dialog.setMessage(Messages.ContextCopyAction_Select_the_target_task__);
+
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+
+ Object result = dialog.getFirstResult();
+
+ if (result instanceof ITask) {
+ ITask targetTask = (ITask) result;
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ if (targetTask.equals(sourceTask)) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ContextCopyAction_Copy_Context, Messages.ContextCopyAction_Target_task_can_not_be_the_same_as_source_task);
+ } else {
+ IInteractionContext context = ContextCore.getContextStore().cloneContext(
+ sourceTask.getHandleIdentifier(), targetTask.getHandleIdentifier());
+ if (context == null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ContextCopyAction_Copy_Context, Messages.ContextCopyAction_Source_task_does_not_have_a_context);
+ } else {
+ TasksUi.getTaskActivityManager().activateTask(targetTask);
+ }
+ }
+ } else {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ContextCopyAction_Copy_Context, Messages.ContextCopyAction_No_target_task_selected);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextRetrieveAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextRetrieveAction.java
new file mode 100644
index 0000000..d73eb7d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ContextRetrieveAction.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextAttachmentHandler;
+import org.eclipse.mylyn.internal.context.ui.commands.RetrieveContextHandler;
+import org.eclipse.mylyn.internal.context.ui.wizards.ContextRetrieveWizard;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @deprecated use {@link RetrieveContextHandler} or {@link RetrieveContextAttachmentHandler} instead
+ */
+ at SuppressWarnings("restriction")
+ at Deprecated
+public class ContextRetrieveAction extends Action implements IViewActionDelegate {
+
+ private AbstractTask task;
+
+ private static final String ID_ACTION = "org.eclipse.mylyn.context.ui.repository.task.retrieve"; //$NON-NLS-1$
+
+ public ContextRetrieveAction() {
+ setText(Messages.ContextRetrieveAction_Retrieve_);
+ setToolTipText(Messages.ContextRetrieveAction_Retrieve_Task_Context);
+ setId(ID_ACTION);
+ setImageDescriptor(TasksUiImages.CONTEXT_RETRIEVE);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ run(this);
+ }
+
+ public void run(IAction action) {
+ if (task != null) {
+ run(task);
+ }
+ }
+
+ public void run(ITask task) {
+ ContextRetrieveWizard wizard = new ContextRetrieveWizard(task);
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ AbstractTask selectedTask = TaskListView.getSelectedTask(selection);
+ if (selectedTask != null) {
+ task = selectedTask;
+ action.setEnabled(AttachmentUtil.canDownloadAttachment(task) && AttachmentUtil.hasContextAttachment(task));
+ } else {
+ action.setEnabled(false);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/FocusOutlineAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/FocusOutlineAction.java
new file mode 100644
index 0000000..f058dba
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/FocusOutlineAction.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class FocusOutlineAction extends AbstractFocusViewAction {
+
+ // TODO: move or delete?
+ public static final String ID_CONTENT_OUTLINE = "org.eclipse.ui.views.ContentOutline"; //$NON-NLS-1$
+
+ public FocusOutlineAction() {
+ super(new InterestFilter(), true, false, false);
+ }
+
+ /**
+ * TODO: refactor this optimization?
+ */
+ public void update(IEditorPart editorPart) {
+ if (!super.isChecked()) {
+ return;
+ }
+ boolean on = ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(getGlobalPrefId());
+
+ AbstractContextUiBridge bridge = ContextUi.getUiBridgeForEditor(editorPart);
+ List<TreeViewer> outlineViewers = bridge.getContentOutlineViewers(editorPart);
+ for (TreeViewer viewer : outlineViewers) {
+ if (viewPart != null) {
+ ContextUiPlugin.getViewerManager().addManagedViewer(viewer, viewPart);
+ }
+ updateInterestFilter(on, viewer);
+ configureDecorator(viewer);
+ }
+ }
+
+ /**
+ * TODO: remove once all outlines have platform decorator
+ */
+ private void configureDecorator(TreeViewer viewer) {
+ if (viewer != null) {
+ if (!(viewer.getLabelProvider() instanceof DecoratingLabelProvider)) {
+ viewer.setLabelProvider(new DecoratingLabelProvider((ILabelProvider) viewer.getLabelProvider(),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
+ }
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return viewers;
+ }
+ for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {
+ IWorkbenchPage page = w.getActivePage();
+ if (page != null) {
+ IEditorPart[] parts = page.getEditors();
+ for (IEditorPart part : parts) {
+ AbstractContextUiBridge bridge = ContextUi.getUiBridgeForEditor(part);
+ List<TreeViewer> outlineViewers = bridge.getContentOutlineViewers(part);
+ for (TreeViewer viewer : outlineViewers) {
+ if (viewer != null && !viewers.contains(viewer)) {
+ viewers.add(viewer);
+ }
+ }
+ }
+ }
+ }
+ return viewers;
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ // ignore
+ }
+
+ public static FocusOutlineAction getOutlineActionForEditor(IEditorPart part) {
+ IViewPart outlineView = part.getSite().getPage().findView(ID_CONTENT_OUTLINE);
+ if (outlineView != null) {
+ return (FocusOutlineAction) AbstractFocusViewAction.getActionForPart(outlineView);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/FocusTaskListAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/FocusTaskListAction.java
new file mode 100644
index 0000000..81bca7b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/FocusTaskListAction.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.provisional.commons.ui.IFilteredTreeListener;
+import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListInterestFilter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListInterestSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * TODO: abuses contract from super class
+ *
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class FocusTaskListAction extends AbstractFocusViewAction implements IFilteredTreeListener {
+
+ private final TaskListInterestFilter taskListInterestFilter = new TaskListInterestFilter();
+
+ private final TaskListInterestSorter taskListInterestSorter = new TaskListInterestSorter();
+
+ private Set<AbstractTaskListFilter> previousFilters = new HashSet<AbstractTaskListFilter>();
+
+ private ViewerSorter previousSorter;
+
+ public FocusTaskListAction() {
+ super(new InterestFilter(), false, true, false);
+ }
+
+ @Override
+ public void init(IViewPart view) {
+ super.init(view);
+ IViewPart part = super.getPartForAction();
+ if (part instanceof TaskListView) {
+ ((TaskListView) part).getFilteredTree().getRefreshPolicy().addListener(this);
+ }
+
+ update();
+ ((TaskListView) part).getFilteredTree().setShowProgress(super.isChecked());
+ }
+
+ @Override
+ protected boolean updateEnablementWithContextActivation() {
+ return false;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ IViewPart part = super.getPartForAction();
+ if (part instanceof TaskListView) {
+ ((TaskListView) part).getFilteredTree().getRefreshPolicy().removeListener(this);
+ }
+ }
+
+ @Override
+ public void run(IAction action) {
+ super.run(action);
+// IViewPart part = super.getPartForAction();
+// if (part instanceof TaskListView) {
+// ((TaskListView) part).getFilteredTree().setShowProgress(super.isChecked());
+// }
+ }
+
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ IViewPart part = super.getPartForAction();
+ if (part instanceof TaskListView) {
+ viewers.add(((TaskListView) part).getViewer());
+ }
+ return viewers;
+ }
+
+ @Override
+ protected boolean installInterestFilter(StructuredViewer viewer) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof TaskListView) {
+ final TaskListView taskListView = (TaskListView) part;
+ TasksUiInternal.preservingSelection(taskListView.getViewer(), new Runnable() {
+ public void run() {
+ try {
+ taskListView.getViewer().getControl().setRedraw(false);
+ taskListView.setFocusedMode(true);
+ previousSorter = taskListView.getViewer().getSorter();
+ previousFilters = new HashSet<AbstractTaskListFilter>(taskListView.getFilters());
+ taskListView.clearFilters();
+ if (!taskListView.getFilters().contains(taskListInterestFilter)) {
+ taskListView.addFilter(taskListInterestFilter);
+ }
+ // Setting sorter causes root refresh
+ taskListView.getViewer().setSorter(taskListInterestSorter);
+ taskListView.getViewer().expandAll();
+// taskListView.selectedAndFocusTask(TasksUiPlugin.getTaskList().getActiveTask());
+
+ showProgressBar(taskListView, true);
+ } finally {
+ taskListView.getViewer().getControl().setRedraw(true);
+ }
+ }
+
+ });
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void showProgressBar(TaskListView taskListView, boolean visible) {
+ taskListView.getFilteredTree().setShowProgress(visible);
+ }
+
+ @Override
+ protected void uninstallInterestFilter(StructuredViewer viewer) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof TaskListView) {
+ final TaskListView taskListView = (TaskListView) part;
+ if (taskListView.isFocusedMode()) {
+ TasksUiInternal.preservingSelection(taskListView.getViewer(), new Runnable() {
+ public void run() {
+ try {
+ taskListView.getViewer().getControl().setRedraw(false);
+ taskListView.setFocusedMode(false);
+ taskListView.removeFilter(taskListInterestFilter);
+ for (AbstractTaskListFilter filter : previousFilters) {
+ taskListView.addFilter(filter);
+ }
+ Text textControl = taskListView.getFilteredTree().getFilterControl();
+ if (textControl != null && textControl.getText().length() > 0) {
+ taskListView.getViewer().expandAll();
+ } else {
+ taskListView.getViewer().collapseAll();
+ }
+ taskListView.getViewer().setSorter(previousSorter);
+ showProgressBar(taskListView, false);
+ } finally {
+ taskListView.getViewer().getControl().setRedraw(true);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ // ignore
+ }
+
+ public void filterTextChanged(final String text) {
+ if (isChecked() && (text == null || "".equals(text.trim()))) { //$NON-NLS-1$
+ IViewPart part = FocusTaskListAction.super.getPartForAction();
+ if (part instanceof TaskListView) {
+ ((TaskListView) part).getViewer().expandAll();
+ }
+ }
+ }
+
+ @Override
+ protected String getEmptyViewMessage() {
+ return Messages.FocusTaskListAction_No_tasks_scheduled_for_this_week;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/InterestDecrementAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/InterestDecrementAction.java
new file mode 100644
index 0000000..17c6220
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/InterestDecrementAction.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+/**
+ * @author Mik Kersten
+ */
+// TODO 3.3 rename to RemoveFromContextAction?
+public class InterestDecrementAction extends AbstractInterestManipulationAction {
+
+ @Override
+ protected boolean isIncrement() {
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/InterestIncrementAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/InterestIncrementAction.java
new file mode 100644
index 0000000..7f42d96
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/InterestIncrementAction.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+/**
+ * @author Mik Kersten
+ */
+public class InterestIncrementAction extends AbstractInterestManipulationAction {
+
+ @Override
+ protected boolean isIncrement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/Messages.java
new file mode 100644
index 0000000..1f32fdc
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/Messages.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.actions.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AbstractInterestManipulationAction_Interest_Manipulation;
+
+ public static String AbstractInterestManipulationAction_No_task_context_is_active;
+
+ public static String ContextAttachAction_Attach_;
+
+ public static String ContextAttachAction_Attach_Task_Context;
+
+ public static String ContextAttachAction_Context_Attachment;
+
+ public static String ContextAttachAction_Task_must_be_synchronized_before_attaching_context;
+
+ public static String ContextClearAction_Clear;
+
+ public static String ContextClearAction_Clear_the_context_for_the_selected_task;
+
+ public static String ContextClearAction_Confirm_clear_context;
+
+ public static String ContextCopyAction_Copy_Context;
+
+ public static String ContextCopyAction_Copy_Task_Context_to_;
+
+ public static String ContextCopyAction_Copy_to_;
+
+ public static String ContextCopyAction_No_source_task_selected;
+
+ public static String ContextCopyAction_No_target_task_selected;
+
+ public static String ContextCopyAction_Select_Target_Task;
+
+ public static String ContextCopyAction_Select_the_target_task__;
+
+ public static String ContextCopyAction_Source_task_does_not_have_a_context;
+
+ public static String ContextCopyAction_Target_task_can_not_be_the_same_as_source_task;
+
+ public static String ContextRetrieveAction_Retrieve_;
+
+ public static String ContextRetrieveAction_Retrieve_Task_Context;
+
+ public static String FocusTaskListAction_No_tasks_scheduled_for_this_week;
+
+ public static String ToggleDecorateInterestLevelAction_Decorate_Interest;
+
+ public static String ToggleDecorateInterestLevelAction_Toggle_Interest_Level_Decorator;
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/OpenPrefsAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/OpenPrefsAction.java
new file mode 100644
index 0000000..7255376
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/OpenPrefsAction.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenPrefsAction implements IWorkbenchWindowActionDelegate {
+
+ public void dispose() {
+ // don't care when we are disposed
+ }
+
+ public void init(IWorkbenchWindow window) {
+ // don't have anything to initialize
+ }
+
+ public void run(IAction action) {
+ // don't have anything to run
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // don't care about selection changes
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/OpenQuickContextPopupDialogAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/OpenQuickContextPopupDialogAction.java
new file mode 100644
index 0000000..8c0c87b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/OpenQuickContextPopupDialogAction.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.context.ui.views.QuickContextPopupDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Class to activate the inplace Cross Reference view, via the key binding defined in the plugin.xml.
+ *
+ * @author Mik Kersten
+ */
+public class OpenQuickContextPopupDialogAction implements IWorkbenchWindowActionDelegate {
+
+ private QuickContextPopupDialog inplaceDialog;
+
+ public void dispose() {
+ inplaceDialog = null;
+ }
+
+ public void init(IWorkbenchWindow window) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ inplaceDialog = new QuickContextPopupDialog(parent);
+ inplaceDialog.open();
+ inplaceDialog.setFocus();
+ // inplaceDialog.setLastSelection(XRefUIUtils.getCurrentSelection());
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/TaskContextAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/TaskContextAction.java
new file mode 100644
index 0000000..5855cdd
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/TaskContextAction.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.IViewActionDelegate;
+
+/**
+ * Controls enablement
+ *
+ * @author Mik Kersten
+ */
+public abstract class TaskContextAction extends Action implements IViewActionDelegate {
+
+ protected ISelection selection;
+
+ protected ITask getSelectedTask(ISelection newSelection) {
+ if (selection instanceof StructuredSelection) {
+ Object selectedObject = ((StructuredSelection) selection).getFirstElement();
+ if (selectedObject instanceof ITask) {
+ return (ITask) selectedObject;
+ }
+// else if (selectedObject instanceof AbstractQueryHit) {
+// return ((AbstractQueryHit) selectedObject).getCorrespondingTask();
+// }
+ }
+ return null;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selection = selection;
+ ITask selectedTask = getSelectedTask(selection);
+ if (selectedTask != null) {
+ action.setEnabled(ContextCore.getContextManager().hasContext(selectedTask.getHandleIdentifier()));
+ } else {
+ action.setEnabled(false);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ToggleDecorateInterestLevelAction.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ToggleDecorateInterestLevelAction.java
new file mode 100644
index 0000000..5e06fc4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/ToggleDecorateInterestLevelAction.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleDecorateInterestLevelAction extends Action {
+
+ public static final String PREF_ID = "org.eclipse.mylyn.ui.decorators.interest"; //$NON-NLS-1$
+
+ public static final String PREF_INTERSECTION_MODE = "org.eclipse.mylyn.ui.interest.intersection"; //$NON-NLS-1$
+
+ public ToggleDecorateInterestLevelAction() {
+ super();
+ setText(Messages.ToggleDecorateInterestLevelAction_Decorate_Interest);
+ setToolTipText(Messages.ToggleDecorateInterestLevelAction_Toggle_Interest_Level_Decorator);
+
+ boolean checked = ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(PREF_ID);
+ valueChanged(checked, false);
+ }
+
+ @Override
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ setChecked(on);
+ if (store) {
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(PREF_ID, on);
+ }
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(PREF_INTERSECTION_MODE, true);
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/messages.properties
new file mode 100644
index 0000000..c8d24eb
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/actions/messages.properties
@@ -0,0 +1,29 @@
+AbstractInterestManipulationAction_Interest_Manipulation=Interest Manipulation
+AbstractInterestManipulationAction_No_task_context_is_active=No task context is active, or element not found in context
+
+ContextAttachAction_Attach_=Attach...
+ContextAttachAction_Attach_Task_Context=Attach Task Context
+ContextAttachAction_Context_Attachment=Context Attachment
+ContextAttachAction_Task_must_be_synchronized_before_attaching_context=Task must be synchronized before attaching context
+
+ContextClearAction_Clear=Clear
+ContextClearAction_Clear_the_context_for_the_selected_task=Clear the context for the selected task? This cannot be undone.
+ContextClearAction_Confirm_clear_context=Confirm clear context
+
+ContextCopyAction_Copy_Context=Copy Context
+ContextCopyAction_Copy_Task_Context_to_=Copy Task Context to...
+ContextCopyAction_Copy_to_=Copy to...
+ContextCopyAction_No_source_task_selected=No source task selected.
+ContextCopyAction_No_target_task_selected=No target task selected.
+ContextCopyAction_Select_Target_Task=Select Target Task
+ContextCopyAction_Select_the_target_task__=&Select the target task (? = any character, * = any String):
+ContextCopyAction_Source_task_does_not_have_a_context=Source task does not have a context.
+ContextCopyAction_Target_task_can_not_be_the_same_as_source_task=Target task can not be the same as source task.
+
+ContextRetrieveAction_Retrieve_=Retrieve...
+ContextRetrieveAction_Retrieve_Task_Context=Retrieve Task Context
+
+FocusTaskListAction_No_tasks_scheduled_for_this_week=No tasks scheduled for this week
+
+ToggleDecorateInterestLevelAction_Decorate_Interest=Decorate Interest
+ToggleDecorateInterestLevelAction_Toggle_Interest_Level_Decorator=Toggle Interest Level Decorator
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/AbstractTaskAttachmentCommandHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/AbstractTaskAttachmentCommandHandler.java
new file mode 100644
index 0000000..177ca59
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/AbstractTaskAttachmentCommandHandler.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTaskAttachmentCommandHandler extends AbstractHandler {
+
+ public AbstractTaskAttachmentCommandHandler() {
+ }
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof IStructuredSelection) {
+ Object[] items = ((IStructuredSelection) selection).toArray();
+ for (Object item : items) {
+ if (item instanceof ITaskAttachment) {
+ execute(event, (ITaskAttachment) item);
+ }
+ }
+ }
+ return null;
+ }
+
+ protected void execute(ExecutionEvent event, ITaskAttachment attachment) {
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/AttachContextHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/AttachContextHandler.java
new file mode 100644
index 0000000..5e159c7
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/AttachContextHandler.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.context.ui.wizards.ContextAttachWizard;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AttachContextHandler extends AbstractTaskHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ ContextAttachWizard wizard = new ContextAttachWizard(task);
+ WizardDialog dialog = new WizardDialog(WorkbenchUtil.getShell(), wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/ClearContextHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/ClearContextHandler.java
new file mode 100644
index 0000000..6e730a9
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/ClearContextHandler.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ClearContextHandler extends AbstractTaskHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), Messages.ClearContextHandler_Confirm_clear_context,
+ Messages.ClearContextHandler_CLEAR_THE_CONTEXT_THE_FOR_SELECTED_TASK);
+ if (!deleteConfirmed) {
+ return;
+ }
+
+ ContextCore.getContextManager().deleteContext(task.getHandleIdentifier());
+ TasksUiInternal.getTaskList().notifyElementChanged(task);
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/CopyContextHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/CopyContextHandler.java
new file mode 100644
index 0000000..cc1a93c
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/CopyContextHandler.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialog;
+import org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CopyContextHandler extends AbstractTaskHandler {
+
+ private static final String TITLE_DIALOG = Messages.CopyContextHandler_Copy_Context;
+
+ @Override
+ protected void execute(ExecutionEvent event, ITask sourceTask) throws ExecutionException {
+ if (sourceTask == null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ TITLE_DIALOG, Messages.CopyContextHandler_No_source_task_selected);
+ return;
+ }
+
+ TaskSelectionDialog dialog = new TaskSelectionDialog(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell());
+ dialog.setNeedsCreateTask(false);
+ dialog.setTitle(Messages.CopyContextHandler_Select_Target_Task);
+ dialog.setMessage(Messages.CopyContextHandler_Select_the_target_task__);
+
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+
+ Object result = dialog.getFirstResult();
+
+ if (result instanceof ITask) {
+ ITask targetTask = (ITask) result;
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ if (targetTask.equals(sourceTask)) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ TITLE_DIALOG, Messages.CopyContextHandler_TARGET_TASK_CON_NOT_BE_THE_SAME_AS_SOURCE_TASK);
+ } else {
+ IInteractionContext context = ContextCore.getContextStore().cloneContext(
+ sourceTask.getHandleIdentifier(), targetTask.getHandleIdentifier());
+ if (context == null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ TITLE_DIALOG, Messages.CopyContextHandler_SOURCE_TASK_DOES_HAVE_A_CONTEXT);
+ } else {
+ TasksUi.getTaskActivityManager().activateTask(targetTask);
+ }
+ }
+ } else {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ TITLE_DIALOG, Messages.CopyContextHandler_No_target_task_selected);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/FocusViewHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/FocusViewHandler.java
new file mode 100644
index 0000000..2ea6115
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/FocusViewHandler.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Izzet Safer - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.context.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Izzet Safer
+ */
+public class FocusViewHandler extends AbstractHandler {
+
+ private static final String PARAMETER_VIEW_ID = "viewId"; //$NON-NLS-1$
+
+ private AbstractFocusViewAction applyAction = null;
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ Object returnValue = Boolean.FALSE;
+ String viewId = event.getParameter(PARAMETER_VIEW_ID);
+
+ if (viewId == null) {
+ return returnValue;
+ }
+
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IViewPart viewPart = activePage.findView(viewId);
+ if (viewPart == null) {
+ return returnValue;
+ }
+
+ applyAction = AbstractFocusViewAction.getActionForPart(viewPart);
+
+ if (applyAction != null) {
+ applyAction.update(true);
+ returnValue = Boolean.TRUE;
+ }
+
+ return returnValue;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/Messages.java
new file mode 100644
index 0000000..2657f7d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/Messages.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.commands.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ClearContextHandler_CLEAR_THE_CONTEXT_THE_FOR_SELECTED_TASK;
+
+ public static String ClearContextHandler_Confirm_clear_context;
+
+ public static String CopyContextHandler_Copy_Context;
+
+ public static String CopyContextHandler_No_source_task_selected;
+
+ public static String CopyContextHandler_No_target_task_selected;
+
+ public static String CopyContextHandler_Select_Target_Task;
+
+ public static String CopyContextHandler_Select_the_target_task__;
+
+ public static String CopyContextHandler_SOURCE_TASK_DOES_HAVE_A_CONTEXT;
+
+ public static String CopyContextHandler_TARGET_TASK_CON_NOT_BE_THE_SAME_AS_SOURCE_TASK;
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/RetrieveContextAttachmentHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/RetrieveContextAttachmentHandler.java
new file mode 100644
index 0000000..f787af0
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/RetrieveContextAttachmentHandler.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RetrieveContextAttachmentHandler extends AbstractTaskAttachmentCommandHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, ITaskAttachment attachment) {
+ AttachmentUtil.downloadContext(attachment.getTask(), attachment, PlatformUI.getWorkbench().getProgressService());
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/RetrieveContextHandler.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/RetrieveContextHandler.java
new file mode 100644
index 0000000..1879842
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/RetrieveContextHandler.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.context.ui.wizards.ContextRetrieveWizard;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RetrieveContextHandler extends AbstractTaskHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ ContextRetrieveWizard wizard = new ContextRetrieveWizard(task);
+ WizardDialog dialog = new WizardDialog(WorkbenchUtil.getShell(), wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/messages.properties
new file mode 100644
index 0000000..9325ce3
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/commands/messages.properties
@@ -0,0 +1,10 @@
+ClearContextHandler_CLEAR_THE_CONTEXT_THE_FOR_SELECTED_TASK=Clear the context for the selected task? This cannot be undone.
+ClearContextHandler_Confirm_clear_context=Confirm clear context
+
+CopyContextHandler_Copy_Context=Copy Context
+CopyContextHandler_No_source_task_selected=No source task selected.
+CopyContextHandler_No_target_task_selected=No target task selected.
+CopyContextHandler_Select_Target_Task=Select Target Task
+CopyContextHandler_Select_the_target_task__=&Select the target task (? = any character, * = any String):
+CopyContextHandler_SOURCE_TASK_DOES_HAVE_A_CONTEXT=Source task does not have a context.
+CopyContextHandler_TARGET_TASK_CON_NOT_BE_THE_SAME_AS_SOURCE_TASK=Target task can not be the same as source task.
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ContextEditorFormPage.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ContextEditorFormPage.java
new file mode 100644
index 0000000..143ea18
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ContextEditorFormPage.java
@@ -0,0 +1,552 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.editors;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.actions.ContextAttachAction;
+import org.eclipse.mylyn.internal.context.ui.actions.ContextClearAction;
+import org.eclipse.mylyn.internal.context.ui.actions.ContextCopyAction;
+import org.eclipse.mylyn.internal.context.ui.actions.ContextRetrieveAction;
+import org.eclipse.mylyn.internal.context.ui.views.ContextNodeOpenListener;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DelayedRefreshJob;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+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.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Scale;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.navigator.CommonViewer;
+import org.eclipse.ui.navigator.INavigatorContentExtension;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("deprecation")
+public class ContextEditorFormPage extends FormPage {
+
+ private static final int SCALE_STEPS = 14;
+
+ public static final String ID_VIEWER = "org.eclipse.mylyn.context.ui.navigator.context"; //$NON-NLS-1$
+
+ private ScrolledForm form;
+
+ private Composite sectionClient;
+
+ private FormToolkit toolkit;
+
+ private CommonViewer commonViewer;
+
+ private Hyperlink activateTaskHyperlink;
+
+ private final ScalableInterestFilter interestFilter = new ScalableInterestFilter();
+
+ private Scale doiScale;
+
+ private ITask task;
+
+ private class ContextEditorDelayedRefreshJob extends DelayedRefreshJob {
+
+ public ContextEditorDelayedRefreshJob(StructuredViewer treeViewer, String name) {
+ super(treeViewer, name);
+ }
+
+ @Override
+ protected void doRefresh(Object[] items) {
+ if (commonViewer != null && !commonViewer.getTree().isDisposed()) {
+ commonViewer.refresh();
+ if (items != null) {
+ for (Object item : items) {
+ updateExpansionState(item);
+ }
+ } else {
+ updateExpansionState(null);
+ }
+ }
+ if (invisiblePart != null) {
+ invisiblePart.updateInvisibleElementsSection();
+ }
+ }
+
+ protected void updateExpansionState(Object item) {
+ if (commonViewer != null && !commonViewer.getTree().isDisposed()) {
+ try {
+ commonViewer.getTree().setRedraw(false);
+ if (/*!mouseDown && */item == null) {
+ commonViewer.expandAll();
+ } else if (item != null && item instanceof IInteractionElement) {
+ IInteractionElement node = (IInteractionElement) item;
+ AbstractContextStructureBridge structureBridge = ContextCorePlugin.getDefault()
+ .getStructureBridge(node.getContentType());
+ Object objectToRefresh = structureBridge.getObjectForHandle(node.getHandleIdentifier());
+ if (objectToRefresh != null) {
+ commonViewer.expandToLevel(objectToRefresh, AbstractTreeViewer.ALL_LEVELS);
+ }
+ }
+ } finally {
+ commonViewer.getTree().setRedraw(true);
+ }
+ }
+ }
+
+ }
+
+ private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ Control partControl = getPartControl();
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ if (partControl != null && !partControl.isDisposed()) {
+ updateContentArea();
+ refresh();
+ }
+ break;
+ case DEACTIVATED:
+ if (partControl != null && !partControl.isDisposed()) {
+ updateContentArea();
+ refresh();
+ }
+ break;
+ case CLEARED:
+ if (event.isActiveContext()) {
+ refresh();
+ }
+ break;
+ case ELEMENTS_DELETED:
+ case INTEREST_CHANGED:
+ case LANDMARKS_ADDED:
+ case LANDMARKS_REMOVED:
+ refresh(event.getElements());
+ break;
+ }
+ }
+
+ };
+
+ public ContextEditorFormPage(FormEditor editor, String id, String title) {
+ super(editor, id, title);
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ ContextCore.getContextManager().addListener(CONTEXT_LISTENER);
+ task = ((TaskEditorInput) getEditorInput()).getTask();
+
+ form = managedForm.getForm();
+
+ toolkit = managedForm.getToolkit();
+
+ //form.setImage(TaskListImages.getImage(TaskListImages.TASK_ACTIVE_CENTERED));
+ //form.setText(LABEL);
+ //toolkit.decorateFormHeading(form.getForm());
+
+ form.getBody().setLayout(new FillLayout());
+ Composite composite = new Composite(form.getBody(), SWT.NONE) {
+ @Override
+ public Point computeSize(int widhtHint, int heigtHint, boolean changed) {
+ Rectangle clientArea = getClientArea();
+ return super.computeSize(widhtHint, clientArea.height, changed);
+ }
+ };
+ toolkit.adapt(composite);
+ composite.setLayout(new GridLayout(2, false));
+
+ createActionsSection(composite);
+ createContentSection(composite);
+
+ form.reflow(true);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ // ContextUiPlugin.getViewerManager().removeManagedViewer(commonViewer,
+ // this);
+ ContextCore.getContextManager().removeListener(CONTEXT_LISTENER);
+ }
+
+ private void createActionsSection(Composite composite) {
+ Section section = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
+ section.setText(Messages.ContextEditorFormPage_Actions);
+
+ section.setLayout(new GridLayout());
+ GridData sectionGridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+ sectionGridData.widthHint = 80;
+ section.setLayoutData(sectionGridData);
+
+ Composite sectionClient = toolkit.createComposite(section);
+ section.setClient(sectionClient);
+ sectionClient.setLayout(new GridLayout(2, false));
+ sectionClient.setLayoutData(new GridData());
+
+ ImageHyperlink filterImage = toolkit.createImageHyperlink(sectionClient, SWT.NONE);
+ filterImage.setImage(CommonImages.getImage(CommonImages.FILTER));
+ filterImage.setToolTipText(Messages.ContextEditorFormPage_Show_All_Elements);
+ filterImage.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkActivated(HyperlinkEvent e) {
+ doiScale.setSelection(0);
+ interestFilter.setThreshold(Integer.MIN_VALUE);
+ refresh();
+ }
+
+ public void linkEntered(HyperlinkEvent e) {
+ // ignore
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ // ignore
+ }
+ });
+
+ doiScale = new Scale(sectionClient, SWT.FLAT);
+ GridData scaleGridData = new GridData(GridData.FILL_HORIZONTAL);
+ scaleGridData.heightHint = 36;
+ scaleGridData.widthHint = 80;
+ doiScale.setLayoutData(scaleGridData);
+ doiScale.setPageIncrement(1);
+ doiScale.setMinimum(0);
+ doiScale.setSelection(SCALE_STEPS / 2);
+ doiScale.setMaximum(SCALE_STEPS);
+ doiScale.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ updateFilterThreshold();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // don't care about default selection
+ }
+ });
+
+ if (!isActiveTask()) {
+ doiScale.setEnabled(false);
+ }
+
+ Label attachImage = toolkit.createLabel(sectionClient, ""); //$NON-NLS-1$
+ attachImage.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_ATTACH));
+ attachImage.setEnabled(task != null);
+ Hyperlink attachHyperlink = toolkit.createHyperlink(sectionClient,
+ Messages.ContextEditorFormPage_Attach_context_, SWT.NONE);
+ attachHyperlink.setEnabled(task != null);
+ attachHyperlink.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ new ContextAttachAction().run(task);
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // ignore
+ }
+ });
+
+ Label retrieveImage = toolkit.createLabel(sectionClient, ""); //$NON-NLS-1$
+ retrieveImage.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_RETRIEVE));
+ retrieveImage.setEnabled(task != null);
+ Hyperlink retrieveHyperlink = toolkit.createHyperlink(sectionClient,
+ Messages.ContextEditorFormPage_Retrieve_Context_, SWT.NONE);
+ retrieveHyperlink.setEnabled(task != null);
+ retrieveHyperlink.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ new ContextRetrieveAction().run(task);
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // ignore
+ }
+ });
+
+ Label copyImage = toolkit.createLabel(sectionClient, ""); //$NON-NLS-1$
+ copyImage.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_COPY));
+ Hyperlink copyHyperlink = toolkit.createHyperlink(sectionClient,
+ Messages.ContextEditorFormPage_Copy_Context_to_, SWT.NONE);
+ copyHyperlink.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ new ContextCopyAction().run(task);
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // ignore
+ }
+ });
+
+ Label clearImage = toolkit.createLabel(sectionClient, ""); //$NON-NLS-1$
+ clearImage.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_CLEAR));
+ Hyperlink clearHyperlink = toolkit.createHyperlink(sectionClient, Messages.ContextEditorFormPage_RemoveAll,
+ SWT.NONE);
+ clearHyperlink.addMouseListener(new MouseListener() {
+
+ public void mouseUp(MouseEvent e) {
+ new ContextClearAction().run(task);
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // ignore
+ }
+ });
+ section.setExpanded(true);
+ }
+
+ private ContextEditorDelayedRefreshJob refreshJob;
+
+ private InvisibleContextElementsPart invisiblePart;
+
+ /**
+ * Scales logarithmically to a reasonable interest threshold range (e.g. -10000..10000).
+ */
+ protected void updateFilterThreshold() {
+ if (doiScale.getSelection() == 0) {
+ interestFilter.setThreshold(Integer.MIN_VALUE);
+ } else if (doiScale.getSelection() == SCALE_STEPS) {
+ interestFilter.setThreshold(Integer.MAX_VALUE);
+ } else {
+ double setting = doiScale.getSelection() - (SCALE_STEPS / 2);
+ double threshold = Math.signum(setting) * Math.pow(Math.exp(Math.abs(setting)), 1.5);
+ interestFilter.setThreshold(threshold);
+ }
+ refresh();
+ }
+
+ private void refresh() {
+ createRefreshJob();
+ if (refreshJob != null) {
+ refreshJob.refresh();
+ }
+ }
+
+ private synchronized void createRefreshJob() {
+ if (commonViewer == null) {
+ return;
+ }
+ if (refreshJob == null) {
+ refreshJob = new ContextEditorDelayedRefreshJob(commonViewer, "refresh viewer"); //$NON-NLS-1$
+ }
+ }
+
+ private void refresh(List<IInteractionElement> elements) {
+ createRefreshJob();
+ if (refreshJob != null) {
+ refreshJob.doRefresh(elements.toArray());
+ }
+ }
+
+ private void createContentSection(Composite composite) {
+ Section section = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
+ section.setText(Messages.ContextEditorFormPage_Elements);
+ section.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ sectionClient = toolkit.createComposite(section);
+ sectionClient.setLayout(new FillLayout());
+ section.setClient(sectionClient);
+
+ updateContentArea();
+
+ toolkit.createLabel(composite, " "); //$NON-NLS-1$
+
+ invisiblePart = new InvisibleContextElementsPart(commonViewer);
+ Control invisibleControl = invisiblePart.createControl(toolkit, composite);
+ GridDataFactory.fillDefaults().applyTo(invisibleControl);
+ }
+
+ private void createActivateTaskHyperlink(Composite parent) {
+ activateTaskHyperlink = toolkit.createHyperlink(parent,
+ Messages.ContextEditorFormPage_Activate_task_to_edit_context, SWT.NONE);
+ activateTaskHyperlink.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ TasksUi.getTaskActivityManager().activateTask(task);
+ }
+ });
+ }
+
+ /**
+ * Disposes the viewer when the current task is not active or creates it if task is activated.
+ */
+ private void updateContentArea() {
+ if (isActiveTask()) {
+ doiScale.setEnabled(true);
+ doiScale.setSelection(SCALE_STEPS / 2);
+ if (activateTaskHyperlink != null) {
+ activateTaskHyperlink.dispose();
+ activateTaskHyperlink = null;
+ }
+ if (commonViewer == null) {
+ createViewer(sectionClient);
+ }
+
+ if (invisiblePart != null) {
+ invisiblePart.setCommonViewer(commonViewer);
+ }
+ updateFilterThreshold();
+ } else {
+ doiScale.setEnabled(false);
+ doiScale.setSelection(SCALE_STEPS / 2);
+ if (commonViewer != null) {
+ commonViewer.getControl().dispose();
+ commonViewer = null;
+ if (invisiblePart != null) {
+ invisiblePart.setCommonViewer(commonViewer);
+ }
+ disposeRefreshJob();
+ }
+ if (activateTaskHyperlink == null) {
+ createActivateTaskHyperlink(sectionClient);
+ }
+ }
+ sectionClient.layout();
+ }
+
+ private synchronized void disposeRefreshJob() {
+ if (refreshJob != null) {
+ refreshJob.cancel();
+ refreshJob = null;
+ }
+ }
+
+ private boolean isActiveTask() {
+ return task.equals(TasksUi.getTaskActivityManager().getActiveTask());
+ }
+
+ private void createViewer(Composite parent) {
+ commonViewer = new CommonViewer(ID_VIEWER, parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ commonViewer.setUseHashlookup(true);
+ commonViewer.addFilter(interestFilter);
+ commonViewer.addOpenListener(new ContextNodeOpenListener(commonViewer));
+ try {
+ commonViewer.getControl().setRedraw(false);
+
+ forceFlatLayoutOfJavaContent(commonViewer);
+
+ commonViewer.setInput(getSite().getPage().getInput());
+ getSite().setSelectionProvider(commonViewer);
+ hookContextMenu();
+ commonViewer.expandAll();
+ } finally {
+ commonViewer.getControl().setRedraw(true);
+ }
+ }
+
+ public static void forceFlatLayoutOfJavaContent(CommonViewer commonViewer) {
+ INavigatorContentExtension javaContent = commonViewer.getNavigatorContentService().getContentExtensionById(
+ "org.eclipse.jdt.java.ui.javaContent"); //$NON-NLS-1$
+ if (javaContent != null) {
+ ITreeContentProvider treeContentProvider = javaContent.getContentProvider();
+ // TODO: find a sane way of doing this, perhaps via AbstractContextUiBridge, should be:
+ // if (javaContent.getContentProvider() != null) {
+ // JavaNavigatorContentProvider java =
+ // (JavaNavigatorContentProvider)javaContent.getContentProvider();
+ // java.setIsFlatLayout(true);
+ // }
+ try {
+ Class<?> clazz = treeContentProvider.getClass().getSuperclass();
+ Method method = clazz.getDeclaredMethod("setIsFlatLayout", new Class[] { boolean.class }); //$NON-NLS-1$
+ method.invoke(treeContentProvider, new Object[] { true });
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
+ "Could not set flat layout on Java content provider", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ fillContextMenu(manager);
+ }
+ });
+ Menu menu = menuManager.createContextMenu(commonViewer.getControl());
+ commonViewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(menuManager, commonViewer);
+ }
+
+ protected void fillContextMenu(IMenuManager manager) {
+ //manager.add(removeFromContextAction);
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ public ISelection getSelection() {
+ if (getSite() != null && getSite().getSelectionProvider() != null) {
+ return getSite().getSelectionProvider().getSelection();
+ } else {
+ return StructuredSelection.EMPTY;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ContextPageFactory.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ContextPageFactory.java
new file mode 100644
index 0000000..c7ad101
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ContextPageFactory.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.editors;
+
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.forms.editor.IFormPage;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class ContextPageFactory extends AbstractTaskEditorPageFactory {
+
+ @Override
+ public boolean canCreatePageFor(TaskEditorInput input) {
+ return true;
+ }
+
+ @Override
+ public IFormPage createPage(TaskEditor parentEditor) {
+ return new ContextEditorFormPage(parentEditor, ContextUi.ID_CONTEXT_PAGE_FACTORY, Messages.ContextPageFactory_Context);
+ }
+
+ @Override
+ public int getPriority() {
+ return PRIORITY_CONTEXT;
+ }
+
+ @Override
+ public Image getPageImage() {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_ACTIVE_CENTERED);
+ }
+
+ @Override
+ public String getPageText() {
+ return Messages.ContextPageFactory_Context;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/InvisibleContextElementsPart.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/InvisibleContextElementsPart.java
new file mode 100644
index 0000000..8a90d0b
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/InvisibleContextElementsPart.java
@@ -0,0 +1,421 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.editors;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ColumnPixelData;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.commons.ui.SwtUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.navigator.CommonViewer;
+
+/**
+ * @author Shawn Minto
+ */
+public class InvisibleContextElementsPart {
+
+ private final class InteractionElementTableSorter extends ViewerSorter {
+
+ private int criteria = 0;
+
+ private boolean isDecending = true;
+
+ private final ITableLabelProvider labelProvider;
+
+ public InteractionElementTableSorter(ITableLabelProvider labelProvider) {
+ this.labelProvider = labelProvider;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ int result = 0;
+
+ String value1 = labelProvider.getColumnText(e1, criteria);
+ String value2 = labelProvider.getColumnText(e2, criteria);
+
+ if (value1 == null && value2 != null) {
+ result = -1;
+ } else if (value1 != null && value2 == null) {
+ result = 1;
+ } else if (value1 != null && value2 != null) {
+ result = value1.compareTo(value2);
+ }
+
+ return isDecending() ? (result * -1) : result;
+ }
+
+ public boolean isDecending() {
+ return isDecending;
+ }
+
+ public void setCriteria(int index) {
+ if (criteria == index) {
+ isDecending = !isDecending;
+ } else {
+ isDecending = false;
+ }
+ criteria = index;
+ }
+
+ }
+
+ private final class InteractionElementTableLabelProvider extends LabelProvider implements ITableLabelProvider {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof IInteractionElement) {
+ return ((IInteractionElement) element).getHandleIdentifier();
+ }
+ return super.getText(element);
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof IInteractionElement) {
+ if (columnIndex == 0) {
+ return ((IInteractionElement) element).getHandleIdentifier();
+ } else if (columnIndex == 1) {
+ return ((IInteractionElement) element).getContentType();
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ private final class RemoveInvisibleAction extends Action {
+ public RemoveInvisibleAction() {
+ setText(Messages.ContextEditorFormPage_Remove_Invisible_);
+ setToolTipText(Messages.ContextEditorFormPage_Remove_Invisible_);
+ setImageDescriptor(TasksUiImages.CONTEXT_CLEAR);
+ }
+
+ @Override
+ public void run() {
+ if (commonViewer == null) {
+ MessageDialog.openWarning(WorkbenchUtil.getShell(), Messages.ContextEditorFormPage_Remove_Invisible,
+ Messages.ContextEditorFormPage_Activate_task_to_remove_invisible);
+ return;
+ }
+
+ boolean confirmed = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
+ Messages.ContextEditorFormPage_Remove_Invisible,
+ Messages.ContextEditorFormPage_Remove_every_element_not_visible);
+ if (confirmed) {
+
+ if (ContextCore.getContextManager().isContextActive()) {
+ try {
+ final Collection<Object> allVisible = getAllVisibleElementsInContextPage();
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() {
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException {
+ monitor.beginTask(Messages.InvisibleContextElementsPart_Collecting_all_invisible,
+ IProgressMonitor.UNKNOWN);
+ if (allVisible != null) {
+ IInteractionContext context = ContextCore.getContextManager().getActiveContext();
+ final List<IInteractionElement> allToRemove = getAllInvisibleElements(context,
+ allVisible);
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ ContextCore.getContextManager().deleteElements(allToRemove);
+ }
+ });
+
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
+ Messages.ContextEditorFormPage_Remove_Invisible,
+ Messages.ContextEditorFormPage_No_context_active);
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ } catch (InterruptedException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
+ Messages.ContextEditorFormPage_Remove_Invisible,
+ Messages.ContextEditorFormPage_No_context_active);
+ }
+ }
+ }
+ }
+
+ private TableViewer invisibleTable;
+
+ private Section invisibleSection;
+
+ private CommonViewer commonViewer;
+
+ public InvisibleContextElementsPart(CommonViewer commonViewer) {
+ this.commonViewer = commonViewer;
+ }
+
+ public Control createControl(FormToolkit toolkit, Composite composite) {
+ invisibleSection = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE);
+ invisibleSection.setText(NLS.bind(Messages.InvisibleContextElementsPart_Invisible_elements, "0")); //$NON-NLS-1$
+ invisibleSection.setEnabled(false);
+
+ Composite toolbarComposite = toolkit.createComposite(invisibleSection);
+ toolbarComposite.setBackground(null);
+ invisibleSection.setTextClient(toolbarComposite);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.marginTop = 0;
+ rowLayout.marginBottom = 0;
+ toolbarComposite.setLayout(rowLayout);
+
+ ToolBarManager toolbarManager = new ToolBarManager(SWT.FLAT);
+ toolbarManager.add(new RemoveInvisibleAction());
+ toolbarManager.createControl(toolbarComposite);
+ toolbarManager.markDirty();
+ toolbarManager.update(true);
+
+ Composite invisibleSectionClient = toolkit.createComposite(invisibleSection);
+ invisibleSectionClient.setLayout(new GridLayout());
+ invisibleSection.setClient(invisibleSectionClient);
+
+ Composite tableComposite = toolkit.createComposite(invisibleSectionClient);
+ GridDataFactory.fillDefaults().hint(450, 200).grab(true, false).applyTo(tableComposite);
+ TableColumnLayout layout = new TableColumnLayout();
+ tableComposite.setLayout(layout);
+
+ invisibleTable = new TableViewer(tableComposite, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
+ | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
+ invisibleTable.setColumnProperties(new String[] { Messages.InvisibleContextElementsPart_Structure_handle,
+ Messages.InvisibleContextElementsPart_Structure_kind });
+ invisibleTable.getTable().setHeaderVisible(true);
+
+ Table table = invisibleTable.getTable();
+ toolkit.adapt(table);
+ table.setMenu(null);
+
+ InteractionElementTableLabelProvider labelProvider = new InteractionElementTableLabelProvider();
+ invisibleTable.setLabelProvider(labelProvider);
+ invisibleTable.setContentProvider(new IStructuredContentProvider() {
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // ignore
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection<?>) {
+ return ((Collection<?>) inputElement).toArray();
+ }
+ return new Object[0];
+ }
+ });
+
+ InteractionElementTableSorter invisibleTableSorter = new InteractionElementTableSorter(labelProvider);
+ invisibleTableSorter.setCriteria(0);
+ invisibleTable.setSorter(invisibleTableSorter);
+ createColumn(layout, 0, Messages.InvisibleContextElementsPart_Structure_handle, 340, table,
+ invisibleTableSorter);
+ createColumn(layout, 1, Messages.InvisibleContextElementsPart_Structure_kind, 100, table, invisibleTableSorter);
+ table.setSortColumn(table.getColumn(0));
+ table.setSortDirection(SWT.DOWN);
+ if (ContextCore.getContextManager().isContextActive()) {
+ Collection<Object> allVisible = getAllVisibleElementsInContextPage();
+ if (allVisible != null) {
+ IInteractionContext context = ContextCore.getContextManager().getActiveContext();
+ updateInvisibleSectionInBackground(context, allVisible);
+ }
+ }
+
+ return invisibleSection;
+ }
+
+ private void createColumn(TableColumnLayout layout, final int index, String label, int weight, final Table table,
+ final InteractionElementTableSorter invisibleTableSorter) {
+ final TableColumn column = new TableColumn(table, SWT.LEFT, index);
+ column.setText(label);
+ column.setToolTipText(label);
+ column.setResizable(true);
+
+ layout.setColumnData(column, new ColumnPixelData(weight, true));
+
+ column.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ invisibleTableSorter.setCriteria(index);
+ table.setSortColumn(column);
+ if (invisibleTableSorter.isDecending()) {
+ table.setSortDirection(SWT.UP);
+ } else {
+ table.setSortDirection(SWT.DOWN);
+ }
+ invisibleTable.refresh();
+ }
+
+ });
+ }
+
+ public void updateInvisibleElementsSection() {
+ if (ContextCore.getContextManager().isContextActive()) {
+ Collection<Object> allVisible = getAllVisibleElementsInContextPage();
+ if (allVisible != null) {
+ IInteractionContext context = ContextCore.getContextManager().getActiveContext();
+ updateInvisibleSectionInBackground(context, allVisible);
+ }
+ } else {
+ updateInvisibleSectionInBackground(null, null);
+ }
+ }
+
+ private void updateInvisibleSectionInBackground(final IInteractionContext context,
+ final Collection<Object> allVisible) {
+
+ Job j = new Job(Messages.InvisibleContextElementsPart_Updating_invisible_element_list) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ monitor.beginTask(Messages.InvisibleContextElementsPart_Computing_invisible_elements,
+ IProgressMonitor.UNKNOWN);
+ final List<IInteractionElement> allInvisibleElements = getAllInvisibleElements(context, allVisible);
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ if (invisibleSection != null && !invisibleSection.isDisposed()) {
+ invisibleSection.setText(NLS.bind(Messages.InvisibleContextElementsPart_Invisible_elements,
+ allInvisibleElements.size()));
+ invisibleSection.layout();
+ if (allInvisibleElements.size() == 0) {
+ invisibleSection.setExpanded(false);
+ invisibleSection.setEnabled(false);
+ } else {
+ invisibleSection.setEnabled(true);
+ }
+ }
+
+ if (invisibleTable != null && !invisibleTable.getTable().isDisposed()) {
+ invisibleTable.setInput(allInvisibleElements);
+ }
+ }
+ });
+
+ return Status.OK_STATUS;
+ };
+ };
+ j.schedule();
+
+ }
+
+ private List<IInteractionElement> getAllInvisibleElements(IInteractionContext context, Collection<Object> allVisible) {
+ if (context == null || allVisible == null) {
+ return Collections.emptyList();
+ }
+ List<IInteractionElement> allToRemove = context.getAllElements();
+
+ List<IInteractionElement> allVisibleElements = new ArrayList<IInteractionElement>();
+ for (Object visibleObject : allVisible) {
+ for (AbstractContextStructureBridge bridge : ContextCorePlugin.getDefault().getStructureBridges().values()) {
+// AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault().getStructureBridge(visibleObject);
+ if (bridge != null) {
+ String handle = bridge.getHandleIdentifier(visibleObject);
+ if (handle != null) {
+ IInteractionElement element = context.get(handle);
+ if (element != null) {
+ allVisibleElements.add(element);
+ }
+ }
+ }
+ }
+ AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault().getStructureBridge(
+ ContextCore.CONTENT_TYPE_RESOURCE);
+ if (bridge != null) {
+ String handle = bridge.getHandleIdentifier(visibleObject);
+ if (handle != null) {
+ IInteractionElement element = context.get(handle);
+ if (element != null) {
+ allVisibleElements.add(element);
+ }
+ }
+ }
+ }
+ IInteractionElement emptyElement = context.get(""); //$NON-NLS-1$
+ if (emptyElement != null) {
+ allVisibleElements.add(emptyElement);
+ }
+
+ allToRemove.removeAll(allVisibleElements);
+
+ return allToRemove;
+ }
+
+ private Collection<Object> getAllVisibleElementsInContextPage() {
+ if (commonViewer == null || commonViewer.getTree() == null || commonViewer.getTree().isDisposed()) {
+ return null;
+ }
+ Set<Object> allVisible = new HashSet<Object>();
+ SwtUtil.collectItemData(commonViewer.getTree().getItems(), allVisible);
+ return allVisible;
+ }
+
+ protected void setCommonViewer(CommonViewer commonViewer) {
+ this.commonViewer = commonViewer;
+ updateInvisibleElementsSection();
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/Messages.java
new file mode 100644
index 0000000..be32ee0
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/Messages.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.editors;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.editors.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ContextEditorFormPage_No_context_active;
+
+ public static String ContextEditorFormPage_Actions;
+
+ public static String ContextEditorFormPage_Activate_task_to_edit_context;
+
+ public static String ContextEditorFormPage_Activate_task_to_remove_invisible;
+
+ public static String ContextEditorFormPage_Attach_context_;
+
+ public static String ContextEditorFormPage_Copy_Context_to_;
+
+ public static String ContextEditorFormPage_Elements;
+
+ public static String ContextEditorFormPage_Remove_every_element_not_visible;
+
+ public static String ContextEditorFormPage_Remove_Invisible;
+
+ public static String ContextEditorFormPage_Remove_Invisible_;
+
+ public static String ContextEditorFormPage_RemoveAll;
+
+ public static String ContextEditorFormPage_Retrieve_Context_;
+
+ public static String ContextEditorFormPage_Show_All_Elements;
+
+ public static String ContextPageFactory_Context;
+
+ public static String InvisibleContextElementsPart_Collecting_all_invisible;
+
+ public static String InvisibleContextElementsPart_Computing_invisible_elements;
+
+ public static String InvisibleContextElementsPart_Invisible_elements;
+
+ public static String InvisibleContextElementsPart_Structure_handle;
+
+ public static String InvisibleContextElementsPart_Structure_kind;
+
+ public static String InvisibleContextElementsPart_Updating_invisible_element_list;
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ScalableInterestFilter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ScalableInterestFilter.java
new file mode 100644
index 0000000..2cd69e8
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/ScalableInterestFilter.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.editors;
+
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class ScalableInterestFilter extends InterestFilter {
+
+ private double threshold = 0;
+
+ @Override
+ protected boolean isInteresting(IInteractionElement element) {
+ if (element.getInterest().getEvents().isEmpty()) {
+ return false;
+ } else {
+ return element.getInterest().getValue() >= threshold;
+ }
+ }
+
+ public void setThreshold(double threshold) {
+ this.threshold = threshold;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/messages.properties
new file mode 100644
index 0000000..aa46ef8
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/editors/messages.properties
@@ -0,0 +1,21 @@
+ContextEditorFormPage_No_context_active=No context active.
+ContextEditorFormPage_Actions=Actions
+ContextEditorFormPage_Activate_task_to_edit_context=Activate task to edit context
+ContextEditorFormPage_Activate_task_to_remove_invisible=Activate task to remove invisible elements.
+ContextEditorFormPage_Attach_context_=Attach context...
+ContextEditorFormPage_Copy_Context_to_=Copy Context to...
+ContextEditorFormPage_Elements=Elements
+ContextEditorFormPage_Remove_every_element_not_visible=Remove every element not visible from the task context? This cannot be undone.
+ContextEditorFormPage_Remove_Invisible=Remove Invisible
+ContextEditorFormPage_Remove_Invisible_=Remove Invisible...
+ContextEditorFormPage_RemoveAll=Remove All...
+ContextEditorFormPage_Retrieve_Context_=Retrieve Context...
+ContextEditorFormPage_Show_All_Elements=Show All Elements
+
+ContextPageFactory_Context=Context
+InvisibleContextElementsPart_Collecting_all_invisible=Collecting all invisible elements
+InvisibleContextElementsPart_Computing_invisible_elements=Getting Invisible Elements
+InvisibleContextElementsPart_Invisible_elements={0} Invisible Elements
+InvisibleContextElementsPart_Structure_handle=Structure Handle
+InvisibleContextElementsPart_Structure_kind=Kind
+InvisibleContextElementsPart_Updating_invisible_element_list=Updating Invisible Elements in Context Page
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/messages.properties
new file mode 100644
index 0000000..7058167
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/messages.properties
@@ -0,0 +1,16 @@
+ContextUiPlugin_No_local_task_context_exists=No local task context exists. Retrieve from repository?
+ContextUiPlugin_Task_Activation=Task Activation
+
+TaskContextWorkingSetPage_Cannot_create_another_Active_Taskscape_Working_Set=Cannot create another Active Taskscape Working Set
+TaskContextWorkingSetPage_CREATE_THE_MYLYN_CONTEXT_WORKING_SET=Create the Mylyn Task Context working set. It will be updated automatically to contain\n\
+all of the resources related to the active task.
+TaskContextWorkingSetPage_Mylyn_Task_Context_Working_Set=Mylyn Task Context Working Set
+TaskContextWorkingSetPage_Name=Name
+TaskContextWorkingSetPage_NOTE_THIS_WORKING_SET_SHOULD_ONLY_BE_USED_FOR_SEARCHS=NOTE: this working set should only be used for searches. Do not select it in the Package Explorer.
+TaskContextWorkingSetPage_TASK_CONTEXT_FOR_SEARCH=Task Context (for search)
+
+UiUtil_Mylyn_Interest_Manipulation=Mylyn Interest Manipulation
+UiUtil_Not_a_valid_landmark=Not a valid landmark, select an element within this resource instead.
+
+AbstractFocusViewAction_Apply_Mylyn=Apply Mylyn
+AbstractFocusViewAction_Empty_task_context=Empty task context, unfocus or Alt+click
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/ContextUiPreferencePage.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/ContextUiPreferencePage.java
new file mode 100644
index 0000000..2960823
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/ContextUiPreferencePage.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.dialogs.PreferenceLinkArea;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextUiPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, SelectionListener {
+
+ private Button autoFocusNavigatorsButton = null;
+
+ private Button manageEditorsButton = null;
+
+ private Button mapCloseToRemoveButton = null;
+
+ private Button managePerspectivesButton = null;
+
+ private Button manageExpansionButton = null;
+
+ /**
+ * Constructor - set preference store to ContextUiPlugin store since the tasklist plugin needs access to the values
+ * stored from the preference page because it needs access to the highlighters on start up.
+ *
+ */
+ public ContextUiPreferencePage() {
+ super();
+ setPreferenceStore(ContextUiPlugin.getDefault().getPreferenceStore());
+ setTitle(Messages.ContextUiPreferencePage_Context);
+ setDescription(Messages.ContextUiPreferencePage_CONFIGURE_TASK_FOCUSED_UI_MANAGEMENT_AND_AUTOMATION);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite entryTable = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, false);
+ layout.verticalSpacing = 4;
+ entryTable.setLayout(layout);
+
+ createUiManagementSection(entryTable);
+// createExclusionFilterControl(entryTable);
+
+ applyDialogFont(entryTable);
+ return entryTable;
+ }
+
+ public void init(IWorkbench workbench) {
+ // don't have anything to initialize
+ }
+
+ public void widgetDefaultSelected(SelectionEvent se) {
+ widgetSelected(se);
+ }
+
+ /**
+ * Handle selection of an item in the menu.
+ */
+ public void widgetSelected(SelectionEvent se) {
+ // don't care when the widget is selected
+ }
+
+ @Override
+ public boolean performOk() {
+ getPreferenceStore().setValue(IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS,
+ autoFocusNavigatorsButton.getSelection());
+
+ getPreferenceStore().setValue(IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS,
+ manageEditorsButton.getSelection());
+ getPreferenceStore().setValue(IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES,
+ managePerspectivesButton.getSelection());
+ getPreferenceStore().setValue(IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION,
+ manageExpansionButton.getSelection());
+ getPreferenceStore().setValue(IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE,
+ mapCloseToRemoveButton.getSelection());
+
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST,
+ manageExpansionButton.getSelection());
+
+ return true;
+ }
+
+ /**
+ * Handle Cancel Undo all changes back to what is stored in preference store
+ */
+ @Override
+ public boolean performCancel() {
+ autoFocusNavigatorsButton.setSelection(getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS));
+ return true;
+ }
+
+ /**
+ * Handle RestoreDefaults Note: changes to default are not stored in the preference store until OK or Apply is
+ * pressed
+ */
+ @Override
+ public void performDefaults() {
+ super.performDefaults();
+
+ // NOTE: duplicated policy from ContextUiPlugin.initializeDefaultPreferences
+ autoFocusNavigatorsButton.setSelection(true);
+ manageEditorsButton.setSelection(true);
+ manageExpansionButton.setSelection(true);
+
+ managePerspectivesButton.setSelection(false);
+ mapCloseToRemoveButton.setSelection(false);
+ return;
+ }
+
+ private void createUiManagementSection(Composite parent) {
+ Group groupViews = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ groupViews.setLayout(new GridLayout(1, false));
+ groupViews.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ groupViews.setText(Messages.ContextUiPreferencePage_Views);
+
+ autoFocusNavigatorsButton = new Button(groupViews, SWT.CHECK);
+ autoFocusNavigatorsButton.setText(Messages.ContextUiPreferencePage_Auto_focus_navigator_views_on_task_activation);
+ autoFocusNavigatorsButton.setSelection(getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS));
+
+ manageExpansionButton = new Button(groupViews, SWT.CHECK);
+ manageExpansionButton.setText(Messages.ContextUiPreferencePage_Auto_expand_tree_views_when_focused);
+ manageExpansionButton.setSelection(getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EXPANSION));
+
+ Group groupEditors = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ groupEditors.setLayout(new GridLayout(1, false));
+ groupEditors.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ groupEditors.setText(Messages.ContextUiPreferencePage_Editors);
+
+ manageEditorsButton = new Button(groupEditors, SWT.CHECK);
+ manageEditorsButton.setText(Messages.ContextUiPreferencePage_Manage_open_editors_to_match_task_context);
+ manageEditorsButton.setSelection(getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS));
+
+ if (getContainer() instanceof IWorkbenchPreferenceContainer) {
+ String message = "<a>''{0}''</a> " + Messages.ContextUiPreferencePage_will_be_toggled_with_activation; //$NON-NLS-1$
+ new PreferenceLinkArea(groupEditors, SWT.NONE, "org.eclipse.ui.preferencePages.Editors", message, //$NON-NLS-1$
+ (IWorkbenchPreferenceContainer) getContainer(), null);
+ }
+
+ mapCloseToRemoveButton = new Button(groupEditors, SWT.CHECK);
+ mapCloseToRemoveButton.setText(Messages.ContextUiPreferencePage_Remove_file_from_context_when_editor_is_closed);
+ mapCloseToRemoveButton.setSelection(getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE));
+
+ Group groupPerspectives = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ groupPerspectives.setLayout(new GridLayout(1, false));
+ groupPerspectives.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ groupPerspectives.setText(Messages.ContextUiPreferencePage_Perspectives);
+
+ managePerspectivesButton = new Button(groupPerspectives, SWT.CHECK);
+ managePerspectivesButton.setText(Messages.ContextUiPreferencePage_Open_last_used_perspective_on_task_activation);
+ managePerspectivesButton.setSelection(getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES));
+
+ return;
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/Messages.java
new file mode 100644
index 0000000..a8fecca
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/Messages.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.preferences.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ContextUiPreferencePage_Auto_expand_tree_views_when_focused;
+
+ public static String ContextUiPreferencePage_Auto_focus_navigator_views_on_task_activation;
+
+ public static String ContextUiPreferencePage_CONFIGURE_TASK_FOCUSED_UI_MANAGEMENT_AND_AUTOMATION;
+
+ public static String ContextUiPreferencePage_Context;
+
+ public static String ContextUiPreferencePage_Editors;
+
+ public static String ContextUiPreferencePage_Manage_open_editors_to_match_task_context;
+
+ public static String ContextUiPreferencePage_Open_last_used_perspective_on_task_activation;
+
+ public static String ContextUiPreferencePage_Perspectives;
+
+ public static String ContextUiPreferencePage_Remove_file_from_context_when_editor_is_closed;
+
+ public static String ContextUiPreferencePage_Views;
+
+ public static String ContextUiPreferencePage_will_be_toggled_with_activation;
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/messages.properties
new file mode 100644
index 0000000..64ee89d
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/preferences/messages.properties
@@ -0,0 +1,11 @@
+ContextUiPreferencePage_Auto_expand_tree_views_when_focused=Auto expand tree views when focused
+ContextUiPreferencePage_Auto_focus_navigator_views_on_task_activation=Auto focus navigator views on task activation
+ContextUiPreferencePage_CONFIGURE_TASK_FOCUSED_UI_MANAGEMENT_AND_AUTOMATION=Configure the Task-Focused UI management and automation.
+ContextUiPreferencePage_Context=Context
+ContextUiPreferencePage_Editors=Editors
+ContextUiPreferencePage_Manage_open_editors_to_match_task_context=Manage open editors to match task context
+ContextUiPreferencePage_Open_last_used_perspective_on_task_activation=Open last used perspective on task activation
+ContextUiPreferencePage_Perspectives=Perspectives
+ContextUiPreferencePage_Remove_file_from_context_when_editor_is_closed=Remove file from context when editor is closed
+ContextUiPreferencePage_Views=Views
+ContextUiPreferencePage_will_be_toggled_with_activation="Close editors automatically" will be disabled while a task is active
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/ContextNodeOpenListener.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/ContextNodeOpenListener.java
new file mode 100644
index 0000000..ac795d4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/ContextNodeOpenListener.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.views;
+
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.widgets.Tree;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextNodeOpenListener implements IOpenListener, IDoubleClickListener, MouseListener {
+
+ private final Viewer viewer;
+
+ public ContextNodeOpenListener(Viewer viewer) {
+ this.viewer = viewer;
+ }
+
+ public void open(OpenEvent event) {
+ StructuredSelection selection = (StructuredSelection) viewer.getSelection();
+ Object object = selection.getFirstElement();
+ IInteractionElement node = null;
+ if (object instanceof IInteractionElement) {
+ node = (IInteractionElement) object;
+ } else if (!(object instanceof IInteractionRelation)) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ String handle = bridge.getHandleIdentifier(object);
+ node = ContextCore.getContextManager().getElement(handle);
+ }
+ if (node != null) {
+ ContextUi.getUiBridge(node.getContentType()).open(node);
+ }
+ }
+
+ public void doubleClick(DoubleClickEvent event) {
+ open(null);
+ }
+
+ public void mouseDoubleClick(MouseEvent event) {
+ setSelection(event);
+ }
+
+ public void mouseDown(MouseEvent event) {
+ setSelection(event);
+ }
+
+ private void setSelection(MouseEvent event) {
+ try {
+ Object selection = ((Tree) event.getSource()).getSelection()[0].getData();
+ viewer.setSelection(new StructuredSelection(selection));
+ open(null);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+
+ public void mouseUp(MouseEvent e) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/Messages.java
new file mode 100644
index 0000000..80c2e1a
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.views;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.views.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String QuickContextPopupDialog_Task_Context;
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/QuickContextPopupDialog.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/QuickContextPopupDialog.java
new file mode 100644
index 0000000..baca2f9
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/QuickContextPopupDialog.java
@@ -0,0 +1,473 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.views;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.PopupDialog;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlExtension;
+import org.eclipse.jface.text.IInformationControlExtension2;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.editors.ContextEditorFormPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.misc.StringMatcher;
+import org.eclipse.ui.navigator.CommonViewer;
+
+/**
+ * Derived from {@link QuickOutlinePopupDialog}
+ *
+ * @author Mik Kersten
+ */
+public class QuickContextPopupDialog extends PopupDialog implements IInformationControl, IInformationControlExtension,
+ IInformationControlExtension2, DisposeListener {
+
+ public static final String ID_VIEWER = "org.eclipse.mylyn.context.ui.navigator.context.quick"; //$NON-NLS-1$
+
+ private CommonViewer commonViewer;
+
+ private final InterestFilter interestFilter = new InterestFilter();
+
+ private Text fFilterText;
+
+ private StringMatcher fStringMatcher;
+
+ private QuickOutlinePatternAndInterestFilter namePatternFilter;
+
+ private ContextNodeOpenListener openListener;
+
+ // TODO e3.4 move to new api
+ @SuppressWarnings("deprecation")
+ public QuickContextPopupDialog(Shell parent) {
+ super(parent, SWT.RESIZE, true, true, true, true, null, Messages.QuickContextPopupDialog_Task_Context);
+ create();
+ }
+
+ @Override
+ public boolean close() {
+ // nothing additional to dispose
+ return super.close();
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ createViewer(parent);
+ createUIListenersTreeViewer();
+ addDisposeListener(this);
+
+ return commonViewer.getControl();
+ }
+
+ private void createViewer(Composite parent) {
+ Control composite = super.createDialogArea(parent);
+ commonViewer = createCommonViewer((Composite) composite);
+
+ openListener = new ContextNodeOpenListener(commonViewer);
+
+ commonViewer.addOpenListener(openListener);
+ commonViewer.getTree().addMouseListener(openListener);
+
+ commonViewer.addFilter(interestFilter);
+
+ namePatternFilter = new QuickOutlinePatternAndInterestFilter();
+ commonViewer.addFilter(namePatternFilter);
+
+ try {
+ commonViewer.getControl().setRedraw(false);
+
+ ContextEditorFormPage.forceFlatLayoutOfJavaContent(commonViewer);
+
+ commonViewer.setInput(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getInput());
+ commonViewer.expandAll();
+ } finally {
+ commonViewer.getControl().setRedraw(true);
+ }
+ }
+
+ protected CommonViewer createCommonViewer(Composite parent) {
+ CommonViewer viewer = new CommonViewer(ID_VIEWER, parent, SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setUseHashlookup(true);
+ viewer.getControl().setLayoutData(new GridData(500, 400));
+ return viewer;
+ }
+
+ @Override
+ protected void fillDialogMenu(IMenuManager dialogMenu) {
+ dialogMenu.add(new Separator());
+ super.fillDialogMenu(dialogMenu);
+ }
+
+ private void createUIListenersTreeViewer() {
+ final Tree tree = commonViewer.getTree();
+ tree.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ if (e.character == 0x1B) {
+ // Dispose on ESC key press
+ dispose();
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ // ignore
+ }
+ });
+
+ tree.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ handleTreeViewerMouseUp(tree, e);
+ }
+ });
+
+ tree.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ gotoSelectedElement();
+ }
+ });
+ }
+
+ private void handleTreeViewerMouseUp(final Tree tree, MouseEvent e) {
+ if ((tree.getSelectionCount() < 1) || (e.button != 1) || (tree.equals(e.getSource()) == false)) {
+ return;
+ }
+ // Selection is made in the selection changed listener
+ Object object = tree.getItem(new Point(e.x, e.y));
+ TreeItem selection = tree.getSelection()[0];
+ if (selection.equals(object)) {
+ gotoSelectedElement();
+ }
+ }
+
+ private Object getSelectedElement() {
+ if (commonViewer == null) {
+ return null;
+ }
+ return ((IStructuredSelection) commonViewer.getSelection()).getFirstElement();
+ }
+
+ public void addDisposeListener(DisposeListener listener) {
+ getShell().addDisposeListener(listener);
+ }
+
+ public void addFocusListener(FocusListener listener) {
+ getShell().addFocusListener(listener);
+ }
+
+ public Point computeSizeHint() {
+ // Note that it already has the persisted size if persisting is enabled.
+ return getShell().getSize();
+ }
+
+ public void dispose() {
+ close();
+ }
+
+ public boolean isFocusControl() {
+ if (commonViewer.getControl().isFocusControl() || fFilterText.isFocusControl()) {
+ return true;
+ }
+ return false;
+ }
+
+ public void removeDisposeListener(DisposeListener listener) {
+ getShell().removeDisposeListener(listener);
+ }
+
+ public void removeFocusListener(FocusListener listener) {
+ getShell().removeFocusListener(listener);
+ }
+
+ public void setBackgroundColor(Color background) {
+ applyBackgroundColor(background, getContents());
+ }
+
+ public void setFocus() {
+ getShell().forceFocus();
+ fFilterText.setFocus();
+ }
+
+ public void setForegroundColor(Color foreground) {
+ applyForegroundColor(foreground, getContents());
+ }
+
+ public void setInformation(String information) {
+ // See IInformationControlExtension2
+ }
+
+ // TODO e3.4 move to new api
+ @SuppressWarnings("deprecation")
+ public void setLocation(Point location) {
+ /*
+ * If the location is persisted, it gets managed by PopupDialog - fine. Otherwise, the location is
+ * computed in Window#getInitialLocation, which will center it in the parent shell / main
+ * monitor, which is wrong for two reasons:
+ * - we want to center over the editor / subject control, not the parent shell
+ * - the center is computed via the initalSize, which may be also wrong since the size may
+ * have been updated since via min/max sizing of AbstractInformationControlManager.
+ * In that case, override the location with the one computed by the manager. Note that
+ * the call to constrainShellSize in PopupDialog.open will still ensure that the shell is
+ * entirely visible.
+ */
+ if ((getPersistBounds() == false) || (getDialogSettings() == null)) {
+ getShell().setLocation(location);
+ }
+ }
+
+ public void setSize(int width, int height) {
+ getShell().setSize(width, height);
+ }
+
+ public void setSizeConstraints(int maxWidth, int maxHeight) {
+ // Ignore
+ }
+
+ public void setVisible(boolean visible) {
+ if (visible) {
+ open();
+ } else {
+ saveDialogBounds(getShell());
+ getShell().setVisible(false);
+ }
+ }
+
+ public boolean hasContents() {
+ if ((commonViewer == null) || (commonViewer.getInput() == null)) {
+ return false;
+ }
+ return true;
+ }
+
+ public void setInput(Object input) {
+ // Input comes from PDESourceInfoProvider.getInformation2()
+ // The input should be a model object of some sort
+ // Turn it into a structured selection and set the selection in the tree
+ if (input != null) {
+ commonViewer.setSelection(new StructuredSelection(input));
+ }
+ }
+
+ public void widgetDisposed(DisposeEvent e) {
+ // Note: We do not reuse the dialog
+ commonViewer = null;
+ fFilterText = null;
+ }
+
+ @Override
+ protected Control createTitleControl(Composite parent) {
+ // Applies only to dialog title - not body. See createDialogArea
+ // Create the text widget
+ createUIWidgetFilterText(parent);
+ // Add listeners to the text widget
+ createUIListenersFilterText();
+ // Return the text widget
+ return fFilterText;
+ }
+
+ @Override
+ protected IDialogSettings getDialogSettings() {
+ IDialogSettings dialogSettings = ContextUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings result = dialogSettings.getSection(ID_VIEWER);
+ if (result == null) {
+ result = dialogSettings.addNewSection(ID_VIEWER);
+ }
+ return result;
+ }
+
+ private void createUIWidgetFilterText(Composite parent) {
+ // Create the widget
+ fFilterText = new Text(parent, SWT.NONE);
+ // Set the font
+ GC gc = new GC(parent);
+ gc.setFont(parent.getFont());
+ FontMetrics fontMetrics = gc.getFontMetrics();
+ gc.dispose();
+ // Create the layout
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, 1);
+ data.horizontalAlignment = GridData.FILL;
+ data.verticalAlignment = GridData.CENTER;
+ fFilterText.setLayoutData(data);
+ }
+
+ /**
+ *
+ */
+ private void gotoSelectedElement() {
+ Object selectedElement = getSelectedElement();
+ if (selectedElement == null) {
+ return;
+ }
+ dispose();
+ }
+
+ private void createUIListenersFilterText() {
+ fFilterText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == 0x0D) {
+ // Return key was pressed
+ gotoSelectedElement();
+ } else if (e.keyCode == SWT.ARROW_DOWN) {
+ // Down key was pressed
+ commonViewer.getTree().setFocus();
+ } else if (e.keyCode == SWT.ARROW_UP) {
+ // Up key was pressed
+ commonViewer.getTree().setFocus();
+ } else if (e.character == 0x1B) {
+ // Escape key was pressed
+ dispose();
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ // NO-OP
+ }
+ });
+ // Handle text modify events
+ fFilterText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ String text = ((Text) e.widget).getText();
+ int length = text.length();
+ if (length > 0) {
+ // Append a '*' pattern to the end of the text value if it
+ // does not have one already
+ if (text.charAt(length - 1) != '*') {
+ text = text + '*';
+ }
+ // Prepend a '*' pattern to the beginning of the text value
+ // if it does not have one already
+ if (text.charAt(0) != '*') {
+ text = '*' + text;
+ }
+ }
+ // Set and update the pattern
+ setMatcherString(text, true);
+ }
+ });
+ }
+
+ /**
+ * Sets the patterns to filter out for the receiver.
+ * <p>
+ * The following characters have special meaning: ? => any character * => any string
+ * </p>
+ *
+ * @param pattern
+ * the pattern
+ * @param update
+ * <code>true</code> if the viewer should be updated
+ */
+ private void setMatcherString(String pattern, boolean update) {
+ if (pattern.length() == 0) {
+ fStringMatcher = null;
+ } else {
+ fStringMatcher = new StringMatcher(pattern, true, false);
+ }
+ // Update the name pattern filter on the tree viewer
+ namePatternFilter.setStringMatcher(fStringMatcher);
+ // Update the tree viewer according to the pattern
+ if (update) {
+ stringMatcherUpdated();
+ }
+ }
+
+ /**
+ * The string matcher has been modified. The default implementation refreshes the view and selects the first matched
+ * element
+ */
+ private void stringMatcherUpdated() {
+ // Refresh the tree viewer to re-filter
+ commonViewer.getControl().setRedraw(false);
+ commonViewer.refresh();
+ commonViewer.expandAll();
+ selectFirstMatch();
+ commonViewer.getControl().setRedraw(true);
+ }
+
+ /**
+ * Selects the first element in the tree which matches the current filter pattern.
+ */
+ private void selectFirstMatch() {
+ Tree tree = commonViewer.getTree();
+ Object element = findFirstMatchToPattern(tree.getItems());
+ if (element != null) {
+ commonViewer.setSelection(new StructuredSelection(element), true);
+ } else {
+ commonViewer.setSelection(StructuredSelection.EMPTY);
+ }
+ }
+
+ /**
+ * @param items
+ * @return
+ */
+ private Object findFirstMatchToPattern(TreeItem[] items) {
+ // Match the string pattern against labels
+ ILabelProvider labelProvider = (ILabelProvider) commonViewer.getLabelProvider();
+ // Process each item in the tree
+ for (TreeItem item : items) {
+ Object element = item.getData();
+ // Return the first element if no pattern is set
+ if (fStringMatcher == null) {
+ return element;
+ }
+ // Return the element if it matches the pattern
+ if (element != null) {
+ String label = labelProvider.getText(element);
+ if (fStringMatcher.match(label)) {
+ return element;
+ }
+ }
+ // Recursively check the elements children for a match
+ element = findFirstMatchToPattern(item.getItems());
+ // Return the child element match if found
+ if (element != null) {
+ return element;
+ }
+ }
+ // No match found
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/QuickOutlinePatternAndInterestFilter.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/QuickOutlinePatternAndInterestFilter.java
new file mode 100644
index 0000000..b047911
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/QuickOutlinePatternAndInterestFilter.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.views;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.ui.internal.misc.StringMatcher;
+
+/**
+ * Derived from {@link QuickOutlinePatternAndInterestFilter}
+ *
+ * @author Mik Kersten
+ */
+public class QuickOutlinePatternAndInterestFilter extends ViewerFilter {
+
+ private final InterestFilter interestFilter = new InterestFilter();
+
+ private StringMatcher stringMatcher;
+
+ public QuickOutlinePatternAndInterestFilter() {
+ stringMatcher = null;
+ }
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ boolean isInteresting = interestFilter.select(viewer, parentElement, element);
+ if (!isInteresting) {
+ return false;
+ } else {
+ // Element passes the filter if the string matcher is undefined or
+ // the
+ // viewer is not a tree viewer
+ if ((stringMatcher == null) || ((viewer instanceof TreeViewer) == false)) {
+ return true;
+ }
+ TreeViewer treeViewer = (TreeViewer) viewer;
+ // Match the pattern against the label of the given element
+ String matchName = ((ILabelProvider) treeViewer.getLabelProvider()).getText(element);
+ // Element passes the filter if it matches the pattern
+ if ((matchName != null) && stringMatcher.match(matchName)) {
+ return true;
+ }
+ // Determine whether the element has children that pass the filter
+ return hasUnfilteredChild(treeViewer, element);
+ }
+ }
+
+ /**
+ * @param viewer
+ * @param element
+ * @return
+ */
+ private boolean hasUnfilteredChild(TreeViewer viewer, Object element) {
+ // No point calling hasChildren() because the operation is the same cost
+ // as getting the children
+ // If the element has a child that passes the filter, then we want to
+ // keep the parent around - even if it does not pass the filter itself
+ Object[] children = ((ITreeContentProvider) viewer.getContentProvider()).getChildren(element);
+ for (Object element2 : children) {
+ if (select(viewer, element, element2)) {
+ return true;
+ }
+ }
+ // Element does not pass the filter
+ return false;
+ }
+
+ public void setStringMatcher(StringMatcher stringMatcher) {
+ this.stringMatcher = stringMatcher;
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/messages.properties
new file mode 100644
index 0000000..48ee89c
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/views/messages.properties
@@ -0,0 +1 @@
+QuickContextPopupDialog_Task_Context=Task Context
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextAttachWizard.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextAttachWizard.java
new file mode 100644
index 0000000..4927859
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextAttachWizard.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.wizards;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+ at SuppressWarnings( { "restriction" })
+public class ContextAttachWizard extends Wizard {
+
+ private final TaskRepository repository;
+
+ private final ITask task;
+
+ private ContextAttachWizardPage wizardPage;
+
+ public ContextAttachWizard(ITask task) {
+ this.repository = TasksUi.getRepositoryManager()
+ .getRepository(task.getConnectorKind(), task.getRepositoryUrl());
+ this.task = task;
+ setWindowTitle(Messages.ContextAttachWizard_Attach_Context);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY_CONTEXT);
+ setNeedsProgressMonitor(true);
+ }
+
+ @Override
+ public void addPages() {
+ wizardPage = new ContextAttachWizardPage(repository, task);
+ addPage(wizardPage);
+ super.addPages();
+ }
+
+ @Override
+ public final boolean performFinish() {
+ return AttachmentUtil.uploadContext(repository, task, wizardPage.getComment(), getContainer());
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextAttachWizardPage.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextAttachWizardPage.java
new file mode 100644
index 0000000..4a67f52
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextAttachWizardPage.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.wizards;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Rob Elves
+ */
+public class ContextAttachWizardPage extends WizardPage {
+
+ private final TaskRepository repository;
+
+ private final ITask task;
+
+ private Text commentText;
+
+ protected ContextAttachWizardPage(TaskRepository repository, ITask task) {
+ super(Messages.ContextAttachWizardPage_Enter_comment);
+ this.repository = repository;
+ this.task = task;
+ setTitle(Messages.ContextAttachWizardPage_Enter_comment);
+ setDescription(Messages.ContextAttachWizardPage_Attaches_local_context_to_repository_task);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+
+ Text summary = new Text(composite, SWT.NONE);
+ summary.setText(NLS.bind(Messages.ContextAttachWizardPage_Task, task.getSummary()));
+ summary.setEditable(false);
+ Text repositoryText = new Text(composite, SWT.NONE);
+ repositoryText.setText(Messages.ContextAttachWizardPage_Repository_ + repository.getRepositoryUrl());
+ repositoryText.setEditable(false);
+
+ new Label(composite, SWT.NONE).setText(Messages.ContextAttachWizardPage_Comment_);
+ commentText = new Text(composite, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
+ commentText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ commentText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ getWizard().getContainer().updateButtons();
+ }
+
+ public void keyReleased(KeyEvent e) {
+ getWizard().getContainer().updateButtons();
+ }
+ });
+
+ setControl(composite);
+ commentText.setFocus();
+ Dialog.applyDialogFont(composite);
+ }
+
+ public String getComment() {
+ return commentText.getText();
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextRetrieveWizard.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextRetrieveWizard.java
new file mode 100644
index 0000000..95f1906
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextRetrieveWizard.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.wizards;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+ at SuppressWarnings( { "restriction" })
+public class ContextRetrieveWizard extends Wizard {
+
+ private final TaskRepository repository;
+
+ private final ITask task;
+
+ private ContextRetrieveWizardPage wizardPage;
+
+ public ContextRetrieveWizard(ITask task) {
+ this.task = task;
+ this.repository = TasksUi.getRepositoryManager()
+ .getRepository(task.getConnectorKind(), task.getRepositoryUrl());
+ setWindowTitle(Messages.ContextRetrieveWizard_Retrieve_Context);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY_CONTEXT);
+ setNeedsProgressMonitor(true);
+ }
+
+ @Override
+ public void addPages() {
+ wizardPage = new ContextRetrieveWizardPage(repository, task);
+ addPage(wizardPage);
+ super.addPages();
+ }
+
+ @Override
+ public final boolean performFinish() {
+ ITaskAttachment attachment = wizardPage.getSelectedContext();
+ return AttachmentUtil.downloadContext(task, attachment, getContainer());
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextRetrieveWizardPage.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextRetrieveWizardPage.java
new file mode 100644
index 0000000..4ae506c
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/ContextRetrieveWizardPage.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.wizards;
+
+import com.ibm.icu.text.DateFormat;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+ at SuppressWarnings( { "restriction" })
+public class ContextRetrieveWizardPage extends WizardPage {
+
+ private final TaskRepository repository;
+
+ private final ITask task;
+
+ private final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(false);
+
+ private ITaskAttachment selectedContextAttachment;
+
+ protected ContextRetrieveWizardPage(TaskRepository repository, ITask task) {
+ super(Messages.ContextRetrieveWizardPage_Select_context);
+ this.repository = repository;
+ this.task = task;
+ setDescription(Messages.ContextRetrieveWizardPage_SELECT_A_CONTEXT_TO_RETTRIEVE_FROM_TABLE_BELOW);
+ setTitle(Messages.ContextRetrieveWizardPage_Select_context);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(1, false));
+
+ Text summary = new Text(composite, SWT.NONE);
+ summary.setText(NLS.bind(Messages.ContextRetrieveWizardPage_Task, labelProvider.getText(task)));
+ summary.setEditable(false);
+ // new Label(composite, SWT.NONE).setText("Repository: " +
+ // repository.getUrl());
+ // new Label(composite, SWT.NONE).setText("Select context below:");
+
+ final Table contextTable = new Table(composite, SWT.FULL_SELECTION | SWT.BORDER);
+ contextTable.setHeaderVisible(true);
+ contextTable.setLinesVisible(true);
+
+ contextTable.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (contextTable.getSelectionIndex() > -1) {
+ selectedContextAttachment = (ITaskAttachment) contextTable.getItem(contextTable.getSelectionIndex())
+ .getData();
+ getWizard().getContainer().updateButtons();
+ }
+ }
+ });
+ contextTable.addMouseListener(new MouseListener() {
+
+ public void mouseDoubleClick(MouseEvent e) {
+ selectedContextAttachment = (ITaskAttachment) contextTable.getItem(contextTable.getSelectionIndex())
+ .getData();
+ getWizard().getContainer().updateButtons();
+ getWizard().performFinish();
+ // TODO: is there a better way of closing?
+ getWizard().getContainer().getShell().close();
+ }
+
+ public void mouseDown(MouseEvent e) {
+ }
+
+ public void mouseUp(MouseEvent e) {
+ }
+
+ });
+
+ List<ITaskAttachment> contextAttachments = AttachmentUtil.getContextAttachments(repository, task);
+
+ Collections.sort(contextAttachments, new Comparator<ITaskAttachment>() {
+
+ public int compare(ITaskAttachment attachment1, ITaskAttachment attachment2) {
+
+ Date created1 = null;
+ Date created2 = null;
+ created1 = attachment1.getCreationDate();
+ created2 = attachment2.getCreationDate();
+ if (created1 != null && created2 != null) {
+ return (-1) * created1.compareTo(created2);
+ } else if (created1 == null && created2 != null) {
+ return 1;
+ } else if (created1 != null && created2 == null) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+
+ });
+
+ TableColumn[] columns = new TableColumn[3];
+ columns[0] = new TableColumn(contextTable, SWT.LEFT);
+ columns[0].setText(Messages.ContextRetrieveWizardPage_Date);
+ columns[1] = new TableColumn(contextTable, SWT.LEFT);
+ columns[1].setText(Messages.ContextRetrieveWizardPage_Author);
+ columns[2] = new TableColumn(contextTable, SWT.CENTER);
+ columns[2].setText(Messages.ContextRetrieveWizardPage_Description);
+
+ for (ITaskAttachment attachment : contextAttachments) {
+ TableItem item = new TableItem(contextTable, SWT.NONE);
+ item.setText(0, DateFormat.getInstance().format(attachment.getCreationDate()));
+ IRepositoryPerson author = attachment.getAuthor();
+ if (author != null) {
+ item.setText(1, author.toString());
+ }
+ item.setText(2, attachment.getDescription());
+ item.setData(attachment);
+ }
+
+ for (TableColumn column : columns) {
+ column.pack();
+ }
+
+ contextTable.setLayoutData(new GridData(GridData.FILL_BOTH));
+ setControl(composite);
+ if (contextAttachments.size() > 0) {
+ contextTable.setSelection(0);
+ selectedContextAttachment = contextAttachments.get(0);
+ getWizard().getContainer().updateButtons();
+ }
+ contextTable.setFocus();
+ Dialog.applyDialogFont(composite);
+ }
+
+ public ITaskAttachment getSelectedContext() {
+ return selectedContextAttachment;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (selectedContextAttachment == null) {
+ return false;
+ }
+ return super.isPageComplete();
+ }
+
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/Messages.java b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/Messages.java
new file mode 100644
index 0000000..b0eb38e
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/Messages.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.context.ui.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.context.ui.wizards.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ContextAttachWizard_Attach_Context;
+
+ public static String ContextAttachWizardPage_Enter_comment;
+
+ public static String ContextAttachWizardPage_Attaches_local_context_to_repository_task;
+
+ public static String ContextAttachWizardPage_Comment_;
+
+ public static String ContextAttachWizardPage_Repository_;
+
+ public static String ContextAttachWizardPage_Task;
+
+ public static String ContextRetrieveWizard_Retrieve_Context;
+
+ public static String ContextRetrieveWizardPage_Author;
+
+ public static String ContextRetrieveWizardPage_Date;
+
+ public static String ContextRetrieveWizardPage_Description;
+
+ public static String ContextRetrieveWizardPage_Select_context;
+
+ public static String ContextRetrieveWizardPage_SELECT_A_CONTEXT_TO_RETTRIEVE_FROM_TABLE_BELOW;
+
+ public static String ContextRetrieveWizardPage_Task;
+}
diff --git a/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/messages.properties b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/messages.properties
new file mode 100644
index 0000000..03a70b4
--- /dev/null
+++ b/org.eclipse.mylyn.context.ui/src/org/eclipse/mylyn/internal/context/ui/wizards/messages.properties
@@ -0,0 +1,17 @@
+ContextAttachWizard_Attach_Context=Attach Context
+
+ContextAttachWizardPage_Enter_comment=Enter comment
+ContextAttachWizardPage_Attaches_local_context_to_repository_task=Attaches local context to repository task
+ContextAttachWizardPage_Comment_=Comment:
+ContextAttachWizardPage_Repository_=Repository:
+
+ContextAttachWizardPage_Task=Task: {0}
+
+ContextRetrieveWizard_Retrieve_Context=Retrieve Context
+
+ContextRetrieveWizardPage_Author=Author
+ContextRetrieveWizardPage_Date=Date
+ContextRetrieveWizardPage_Description=Description
+ContextRetrieveWizardPage_Select_context=Select context
+ContextRetrieveWizardPage_SELECT_A_CONTEXT_TO_RETTRIEVE_FROM_TABLE_BELOW=Select a context to retrieve from table below.
+ContextRetrieveWizardPage_Task=Task: {0}
diff --git a/org.eclipse.mylyn.discovery.core/.classpath b/org.eclipse.mylyn.discovery.core/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.discovery.core/.cvsignore b/org.eclipse.mylyn.discovery.core/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.discovery.core/.project b/org.eclipse.mylyn.discovery.core/.project
new file mode 100644
index 0000000..698b41f
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.discovery.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..56e9669
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Tue May 12 20:42:43 PDT 2009
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * Tasktop Technologies - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..5937a85
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Tue May 20 17:39:22 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=2
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f7e3fab
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.discovery.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.3.0",
+ org.eclipse.mylyn.commons.core;bundle-version="3.1.0",
+ org.eclipse.mylyn.commons.net;bundle-version="3.1.0"
+Export-Package: org.eclipse.mylyn.internal.discovery.core;x-friends:="org.eclipse.mylyn.discovery.ui",
+ org.eclipse.mylyn.internal.discovery.core.model;x-friends:="org.eclipse.mylyn.discovery.ui",
+ org.eclipse.mylyn.internal.discovery.core.util;x-friends:="org.eclipse.mylyn.discovery.ui"
diff --git a/org.eclipse.mylyn.discovery.core/OSGI-INF/l10n/bundle.properties b/org.eclipse.mylyn.discovery.core/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000..dcf035c
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,4 @@
+#Properties file for org.eclipse.mylyn.discovery.core
+extension-point.name = Connector Discovery
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Connector Discovery Core
\ No newline at end of file
diff --git a/org.eclipse.mylyn.discovery.core/about.html b/org.eclipse.mylyn.discovery.core/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.discovery.core/build.properties b/org.eclipse.mylyn.discovery.core/build.properties
new file mode 100644
index 0000000..da2d82c
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/build.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2009 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ xsd/,\
+ schema/,\
+ OSGI-INF/
+src.includes = about.html,\
+ schema/,\
+ xsd/
diff --git a/org.eclipse.mylyn.discovery.core/plugin.xml b/org.eclipse.mylyn.discovery.core/plugin.xml
new file mode 100644
index 0000000..e91244b
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/plugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?><!--
+ Copyright (c) 2009 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
+ -->
+<plugin>
+ <extension-point id="connectorDiscovery" name="%extension-point.name" schema="schema/connectorDiscovery.exsd"/>
+
+</plugin>
diff --git a/org.eclipse.mylyn.discovery.core/schema/connectorDiscovery.exsd b/org.eclipse.mylyn.discovery.core/schema/connectorDiscovery.exsd
new file mode 100644
index 0000000..1c407cf
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/schema/connectorDiscovery.exsd
@@ -0,0 +1,391 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.discovery.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.mylyn.discovery.core" id="connectorDiscovery" name="Connector Discovery"/>
+ </appinfo>
+ <documentation>
+ An extension point for contributing to the Mylyn connector discovery mechanism.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="connectorCategory" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="connectorDescriptor" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectorDescriptor">
+ <annotation>
+ <documentation>
+ A description of a connector, including kinds, description, licensing and brand.
+ </documentation>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="featureFilter" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="icon" minOccurs="0" maxOccurs="1"/>
+ <element ref="overview" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="kind" type="string" use="required">
+ <annotation>
+ <documentation>
+ must be a comma-delimited list of the following values: 'document', 'task', 'vcs'
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ the name of the connector including the name of the organization that produces the repository if appropriate, for example 'Mozilla Bugzilla'.
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="provider" type="string" use="required">
+ <annotation>
+ <documentation>
+ The name of the organization that supplies the connector.
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="license" type="string" use="required">
+ <annotation>
+ <documentation>
+ The short name of the license, for example 'EPL 1.0', 'GPL 2.0', or 'Commercial'.
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+ A description of the connector. Plug-ins should provide a description, especially if the description is not self-evident from the @name and @organization.
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="siteUrl" type="string" use="required">
+ <annotation>
+ <documentation>
+ The URL of the update site containing the connector.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ The id of the feature that installs this connector
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="identifier"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="categoryId" type="string" use="required">
+ <annotation>
+ <documentation>
+ the id of the connectorCategory in which this connector belongs
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="identifier"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="platformFilter" type="string">
+ <annotation>
+ <documentation>
+ E.g., "(& (osgi.os=macosx) (osgi.ws=carbon))"
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="groupId" type="string">
+ <annotation>
+ <documentation>
+ The id of the connectorCategory group. See group/@id for more details.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectorCategory">
+ <annotation>
+ <documentation>
+ a category of connectors, which is a way of organizing connectors in top-level groups.
+ </documentation>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="icon" minOccurs="0" maxOccurs="1"/>
+ <element ref="overview" minOccurs="0" maxOccurs="1"/>
+ <element ref="group" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ an id that uniquely identifies the category
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="identifier"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ the name of the category, as it is displayed in the ui.
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+ A description of the category
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="relevance" type="string">
+ <annotation>
+ <documentation>
+ A relevance, which is a number from 0 to 100. Categories with higher relevance are displayed with preference in the UI.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="icon">
+ <complexType>
+ <attribute name="image16" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="image32" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="image48" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="image64" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="image128" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="overview">
+ <annotation>
+ <documentation>
+ An overview that provides more detailed information, which may include a summary, url and screenshot.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="summary" type="string">
+ <annotation>
+ <documentation>
+ A description providing detailed information about the item. Newlines can be used to format the text into multiple paragraphs if necessary. Text must fit into an area 320x240, otherwise it will be truncated in the UI. More lengthy descriptions can be provided on a web page if required, see @url.
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="url" type="string">
+ <annotation>
+ <documentation>
+ An URL that points to a web page with more information relevant to the connector or category.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="screenshot" type="string">
+ <annotation>
+ <documentation>
+ 320x240 PNG, JPEG or GIF
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="resource"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="featureFilter">
+ <annotation>
+ <documentation>
+ A means of specifying that a feature must be present in order for the connectorDescriptor to be presented to the user.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="featureId" type="string" use="required">
+ <annotation>
+ <documentation>
+ The id of the feature to test
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="identifier"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ <attribute name="version" type="string" use="required">
+ <annotation>
+ <documentation>
+ A version specifier, specified in the same manner as version dependencies are specified in an OSGi manifest. For example: "[3.0,4.0)"
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="group">
+ <annotation>
+ <documentation>
+ groups provide a way to anchor connectors in a grouping with other like entries.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ An identifier that identifies the group. Must be unique for a particular connectorCategory.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ 3.2
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="copyright"/>
+ </appinfo>
+ <documentation>
+ Copyright (c) 2009 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/DiscoveryCore.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/DiscoveryCore.java
new file mode 100644
index 0000000..7e198be
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/DiscoveryCore.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core;
+
+/**
+ *
+ * @author David Green
+ */
+public abstract class DiscoveryCore {
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.discovery.core"; //$NON-NLS-1$
+
+ private DiscoveryCore() {
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoverySource.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoverySource.java
new file mode 100644
index 0000000..e2cd84d
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoverySource.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.net.URL;
+
+/**
+ * @author David Green
+ */
+public abstract class AbstractDiscoverySource {
+ private Policy policy = Policy.defaultPolicy();
+
+ /**
+ * an identifier that can be used to determine the origin of the source, typically for logging purposes.
+ */
+ public abstract Object getId();
+
+ /**
+ * get a resource by an URL relative to the root of the source.
+ *
+ * @param relativeUrl
+ * the relative resource name
+ * @return an URL to the resource, or null if it is known that the resource does not exist.
+ */
+ public abstract URL getResource(String resourceName);
+
+ public Policy getPolicy() {
+ return policy;
+ }
+
+ public void setPolicy(Policy policy) {
+ this.policy = policy;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoveryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoveryStrategy.java
new file mode 100644
index 0000000..c46ea89
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoveryStrategy.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * An abstraction of a strategy for discovering connectors and categories. Strategy design pattern. Note that strategies
+ * are not reusable and must be disposed.
+ *
+ * @author David Green
+ */
+public abstract class AbstractDiscoveryStrategy {
+
+ protected List<DiscoveryCategory> categories;
+
+ protected List<DiscoveryConnector> connectors;
+
+ /**
+ * Perform discovery and add discovered items to {@link #getCategories() categories} and {@link #getConnectors()}.
+ *
+ * @param monitor
+ * the monitor
+ */
+ public abstract void performDiscovery(IProgressMonitor monitor) throws CoreException;
+
+ public List<DiscoveryCategory> getCategories() {
+ return categories;
+ }
+
+ public void setCategories(List<DiscoveryCategory> categories) {
+ this.categories = categories;
+ }
+
+ public List<DiscoveryConnector> getConnectors() {
+ return connectors;
+ }
+
+ public void setConnectors(List<DiscoveryConnector> connectors) {
+ this.connectors = connectors;
+ }
+
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoverySource.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoverySource.java
new file mode 100644
index 0000000..1204cbc
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoverySource.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.net.URL;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * @author David Green
+ */
+public class BundleDiscoverySource extends AbstractDiscoverySource {
+
+ private final Bundle bundle;
+
+ public BundleDiscoverySource(Bundle bundle) {
+ if (bundle == null) {
+ throw new IllegalArgumentException();
+ }
+ this.bundle = bundle;
+ }
+
+ @Override
+ public Object getId() {
+ return "bundle:" + bundle.getSymbolicName(); //$NON-NLS-1$
+ }
+
+ @Override
+ public URL getResource(String relativeUrl) {
+ return bundle.getEntry(relativeUrl);
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoveryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoveryStrategy.java
new file mode 100644
index 0000000..1eaaabc
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoveryStrategy.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IContributor;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.Bundle;
+
+/**
+ * a strategy for discovering via installed platform {@link Bundle bundles}.
+ *
+ * @author David Green
+ */
+public class BundleDiscoveryStrategy extends AbstractDiscoveryStrategy {
+
+ @Override
+ public void performDiscovery(IProgressMonitor monitor) throws CoreException {
+ if (connectors == null || categories == null) {
+ throw new IllegalStateException();
+ }
+ IExtensionPoint extensionPoint = getExtensionRegistry().getExtensionPoint(
+ ConnectorDiscoveryExtensionReader.EXTENSION_POINT_ID);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ monitor.beginTask(Messages.BundleDiscoveryStrategy_task_loading_local_extensions, extensions.length == 0 ? 1
+ : extensions.length);
+ try {
+ if (extensions.length > 0) {
+ processExtensions(new SubProgressMonitor(monitor, extensions.length), extensions);
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ protected void processExtensions(IProgressMonitor monitor, IExtension[] extensions) {
+ monitor.beginTask(Messages.BundleDiscoveryStrategy_task_processing_extensions, extensions.length == 0 ? 1
+ : extensions.length);
+ try {
+ ConnectorDiscoveryExtensionReader extensionReader = new ConnectorDiscoveryExtensionReader();
+
+ for (IExtension extension : extensions) {
+ AbstractDiscoverySource discoverySource = computeDiscoverySource(extension.getContributor());
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ try {
+ if (ConnectorDiscoveryExtensionReader.CONNECTOR_DESCRIPTOR.equals(element.getName())) {
+ DiscoveryConnector descriptor = extensionReader.readConnectorDescriptor(element,
+ DiscoveryConnector.class);
+ descriptor.setSource(discoverySource);
+ connectors.add(descriptor);
+ } else if (ConnectorDiscoveryExtensionReader.CONNECTOR_CATEGORY.equals(element.getName())) {
+ DiscoveryCategory category = extensionReader.readConnectorCategory(element,
+ DiscoveryCategory.class);
+ category.setSource(discoverySource);
+ if (!discoverySource.getPolicy().isPermitCategories()) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.BundleDiscoveryStrategy_categoryDisallowed, new Object[] {
+ category.getName(), category.getId(),
+ element.getContributor().getName() }), null));
+ } else {
+ categories.add(category);
+ }
+ } else {
+ throw new ValidationException(NLS.bind(Messages.BundleDiscoveryStrategy_unexpected_element,
+ element.getName()));
+ }
+ } catch (ValidationException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ NLS.bind(Messages.BundleDiscoveryStrategy_3, element.getContributor().getName(),
+ e.getMessage()), e));
+ }
+ }
+ monitor.worked(1);
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ protected AbstractDiscoverySource computeDiscoverySource(IContributor contributor) {
+ Policy policy = new Policy(true);
+ BundleDiscoverySource bundleDiscoverySource = new BundleDiscoverySource(
+ Platform.getBundle(contributor.getName()));
+ bundleDiscoverySource.setPolicy(policy);
+ return bundleDiscoverySource;
+ }
+
+ protected IExtensionRegistry getExtensionRegistry() {
+ return Platform.getExtensionRegistry();
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorCategory.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorCategory.java
new file mode 100644
index 0000000..db83905
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorCategory.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+/**
+ * a category of connectors, which is a way of organizing connectors in top-level groups.
+ *
+ * @author David Green
+ */
+public class ConnectorCategory {
+
+ protected String id;
+
+ protected String name;
+
+ protected String description;
+
+ protected String relevance;
+
+ protected Icon icon;
+
+ protected Overview overview;
+
+ protected java.util.List<Group> group = new java.util.ArrayList<Group>();
+
+ public ConnectorCategory() {
+ }
+
+ /**
+ * an id that uniquely identifies the category
+ */
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * the name of the category, as it is displayed in the ui.
+ */
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * A description of the category
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * A relevance, which is a number from 0 to 100. Categories with higher relevance are displayed with preference in
+ * the UI.
+ */
+ public String getRelevance() {
+ return relevance;
+ }
+
+ public void setRelevance(String relevance) {
+ this.relevance = relevance;
+ }
+
+ public Icon getIcon() {
+ return icon;
+ }
+
+ public void setIcon(Icon icon) {
+ this.icon = icon;
+ }
+
+ public Overview getOverview() {
+ return overview;
+ }
+
+ public void setOverview(Overview overview) {
+ this.overview = overview;
+ }
+
+ public java.util.List<Group> getGroup() {
+ return group;
+ }
+
+ public void setGroup(java.util.List<Group> group) {
+ this.group = group;
+ }
+
+ public void validate() throws ValidationException {
+ if (id == null || id.length() == 0) {
+ throw new ValidationException(Messages.ConnectorCategory_must_specify_connectorCategory_id);
+ }
+ if (name == null || name.length() == 0) {
+ throw new ValidationException(Messages.ConnectorCategory_must_specify_connectorCategory_name);
+ }
+ if (icon != null) {
+ icon.validate();
+ }
+ if (relevance != null) {
+ try {
+ int r = Integer.parseInt(relevance, 10);
+ if (r < 0 || r > 100) {
+ throw new NumberFormatException();
+ }
+ } catch (NumberFormatException e) {
+ throw new ValidationException(Messages.ConnectorCategory_connectorCategory_relevance_invalid);
+ }
+ }
+ if (overview != null) {
+ overview.validate();
+ }
+ for (Group groupItem : group) {
+ groupItem.validate();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptor.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptor.java
new file mode 100644
index 0000000..d81bb83
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptor.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.net.MalformedURLException;
+import java.util.List;
+
+/**
+ * A description of a connector, including kind, description, licensing and brand.
+ *
+ * @author David Green
+ */
+public class ConnectorDescriptor {
+
+ protected java.util.List<ConnectorDescriptorKind> kind = new java.util.ArrayList<ConnectorDescriptorKind>();
+
+ protected String name;
+
+ protected String provider;
+
+ protected String license;
+
+ protected String description;
+
+ protected String siteUrl;
+
+ protected String id;
+
+ protected String categoryId;
+
+ protected String platformFilter;
+
+ protected String groupId;
+
+ protected java.util.List<FeatureFilter> featureFilter = new java.util.ArrayList<FeatureFilter>();
+
+ protected Icon icon;
+
+ protected Overview overview;
+
+ public ConnectorDescriptor() {
+ }
+
+ /**
+ * must be one of 'document', 'task', 'vcs'
+ */
+ public List<ConnectorDescriptorKind> getKind() {
+ return kind;
+ }
+
+ public void setKind(List<ConnectorDescriptorKind> kind) {
+ this.kind = kind;
+ }
+
+ /**
+ * the name of the connector including the name of the organization that produces the repository if appropriate, for
+ * example 'Mozilla Bugzilla'.
+ */
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * The name of the organization that supplies the connector.
+ */
+ public String getProvider() {
+ return provider;
+ }
+
+ public void setProvider(String provider) {
+ this.provider = provider;
+ }
+
+ /**
+ * The short name of the license, for example 'EPL 1.0', 'GPL 2.0', or 'Commercial'.
+ */
+ public String getLicense() {
+ return license;
+ }
+
+ public void setLicense(String license) {
+ this.license = license;
+ }
+
+ /**
+ * A description of the connector. Plug-ins should provide a description, especially if the description is not
+ * self-evident from the @name and
+ *
+ * @organization.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * The URL of the update site containing the connector.
+ */
+ public String getSiteUrl() {
+ return siteUrl;
+ }
+
+ public void setSiteUrl(String siteUrl) {
+ this.siteUrl = siteUrl;
+ }
+
+ /**
+ * The id of the feature that installs this connector
+ */
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * the id of the connectorCategory in which this connector belongs
+ */
+ public String getCategoryId() {
+ return categoryId;
+ }
+
+ public void setCategoryId(String categoryId) {
+ this.categoryId = categoryId;
+ }
+
+ /**
+ * E.g., "(& (osgi.os=macosx) (osgi.ws=carbon))"
+ */
+ public String getPlatformFilter() {
+ return platformFilter;
+ }
+
+ public void setPlatformFilter(String platformFilter) {
+ this.platformFilter = platformFilter;
+ }
+
+ /**
+ * The id of the connectorCategory group. See group/@id for more details.
+ */
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public java.util.List<FeatureFilter> getFeatureFilter() {
+ return featureFilter;
+ }
+
+ public void setFeatureFilter(java.util.List<FeatureFilter> featureFilter) {
+ this.featureFilter = featureFilter;
+ }
+
+ public Icon getIcon() {
+ return icon;
+ }
+
+ public void setIcon(Icon icon) {
+ this.icon = icon;
+ }
+
+ public Overview getOverview() {
+ return overview;
+ }
+
+ public void setOverview(Overview overview) {
+ this.overview = overview;
+ }
+
+ public void validate() throws ValidationException {
+ if (kind == null || kind.isEmpty()) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_kind);
+ }
+ if (name == null || name.length() == 0) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_name);
+ }
+ if (provider == null || provider.length() == 0) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_provider);
+ }
+ if (license == null || license.length() == 0) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_license);
+ }
+ if (siteUrl == null || siteUrl.length() == 0) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_siteUrl);
+ }
+ try {
+ new java.net.URL(siteUrl);
+ } catch (MalformedURLException e) {
+ throw new ValidationException(Messages.ConnectorDescriptor_invalid_connectorDescriptor_siteUrl);
+ }
+ if (id == null || id.length() == 0) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_id);
+ }
+ if (categoryId == null || categoryId.length() == 0) {
+ throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_categoryId);
+ }
+ for (FeatureFilter featureFilterItem : featureFilter) {
+ featureFilterItem.validate();
+ }
+ if (icon != null) {
+ icon.validate();
+ }
+ if (overview != null) {
+ overview.validate();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptorKind.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptorKind.java
new file mode 100644
index 0000000..6b5afc8
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptorKind.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+/**
+ * @author David Green
+ */
+public enum ConnectorDescriptorKind {
+
+ DOCUMENT("document"), //$NON-NLS-1$
+ TASK("task"), //$NON-NLS-1$
+ VCS("vcs"); //$NON-NLS-1$
+
+ private final String value;
+
+ private ConnectorDescriptorKind(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * return the enum constant whose {@link #getValue() value} is the same as the given value.
+ *
+ * @param value
+ * the string value, or null
+ *
+ * @return the corresponding enum constant or null if the given value was null
+ *
+ * @throws IllegalArgumentException
+ * if the given value does not correspond to any enum constant
+ */
+ public static ConnectorDescriptorKind fromValue(String value) throws IllegalArgumentException {
+ if (value == null) {
+ return null;
+ }
+ for (ConnectorDescriptorKind e : values()) {
+ if (e.getValue().equals(value)) {
+ return e;
+ }
+ }
+ throw new IllegalArgumentException(value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscovery.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscovery.java
new file mode 100644
index 0000000..4d4f229
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscovery.java
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IBundleGroup;
+import org.eclipse.core.runtime.IBundleGroupProvider;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
+import org.eclipse.mylyn.internal.discovery.core.util.WebUtil;
+import org.eclipse.osgi.service.resolver.VersionRange;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+
+/**
+ * A means of discovering connectors.
+ *
+ * @author David Green
+ */
+public class ConnectorDiscovery {
+
+ private List<DiscoveryConnector> connectors = Collections.emptyList();
+
+ private List<DiscoveryCategory> categories = Collections.emptyList();
+
+ private List<DiscoveryConnector> filteredConnectors = Collections.emptyList();
+
+ private final List<AbstractDiscoveryStrategy> discoveryStrategies = new ArrayList<AbstractDiscoveryStrategy>();
+
+ private Dictionary<Object, Object> environment = System.getProperties();
+
+ private boolean verifyUpdateSiteAvailability = false;
+
+ private Map<String, Version> featureToVersion = null;
+
+ public ConnectorDiscovery() {
+ }
+
+ /**
+ * get the discovery strategies to use.
+ */
+ public List<AbstractDiscoveryStrategy> getDiscoveryStrategies() {
+ return discoveryStrategies;
+ }
+
+ /**
+ * Initialize this by performing discovery. Discovery may take a long time as it involves network access.
+ * PRECONDITION: must add at least one {@link #getDiscoveryStrategies() discovery strategy} prior to calling.
+ */
+ public void performDiscovery(IProgressMonitor monitor) throws CoreException {
+ if (discoveryStrategies.isEmpty()) {
+ throw new IllegalStateException();
+ }
+ connectors = new ArrayList<DiscoveryConnector>();
+ filteredConnectors = new ArrayList<DiscoveryConnector>();
+ categories = new ArrayList<DiscoveryCategory>();
+
+ final int totalTicks = 100000;
+ final int discoveryTicks = totalTicks - (totalTicks / 10);
+ final int filterTicks = totalTicks - discoveryTicks;
+ monitor.beginTask(Messages.ConnectorDiscovery_task_discovering_connectors, totalTicks);
+ try {
+ for (AbstractDiscoveryStrategy discoveryStrategy : discoveryStrategies) {
+ discoveryStrategy.setCategories(categories);
+ discoveryStrategy.setConnectors(connectors);
+ discoveryStrategy.performDiscovery(new SubProgressMonitor(monitor, discoveryTicks
+ / discoveryStrategies.size()));
+ }
+
+ filterDescriptors();
+ if (verifyUpdateSiteAvailability) {
+ verifySiteAvailability(new SubProgressMonitor(monitor, filterTicks));
+ }
+ connectCategoriesToDescriptors();
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * get the top-level categories
+ *
+ * @return the categories, or an empty list if there are none.
+ */
+ public List<DiscoveryCategory> getCategories() {
+ return categories;
+ }
+
+ /**
+ * get the connectors that were discovered and not filtered
+ *
+ * @return the connectors, or an empty list if there are none.
+ */
+ public List<DiscoveryConnector> getConnectors() {
+ return connectors;
+ }
+
+ /**
+ * get the connectors that were discovered but filtered
+ *
+ * @return the filtered connectors, or an empty list if there were none.
+ */
+ public List<DiscoveryConnector> getFilteredConnectors() {
+ return filteredConnectors;
+ }
+
+ /**
+ * The environment used to resolve {@link ConnectorDescriptor#getPlatformFilter() platform filters}. Defaults to the
+ * current environment.
+ */
+ public Dictionary<Object, Object> getEnvironment() {
+ return environment;
+ }
+
+ /**
+ * The environment used to resolve {@link ConnectorDescriptor#getPlatformFilter() platform filters}. Defaults to the
+ * current environment.
+ */
+ public void setEnvironment(Dictionary<Object, Object> environment) {
+ if (environment == null) {
+ throw new IllegalArgumentException();
+ }
+ this.environment = environment;
+ }
+
+ /**
+ * indicate if update site availability should be verified. The default is false.
+ *
+ * @see DiscoveryConnector#getAvailable()
+ * @see #verifySiteAvailability(IProgressMonitor)
+ */
+ public boolean isVerifyUpdateSiteAvailability() {
+ return verifyUpdateSiteAvailability;
+ }
+
+ /**
+ * indicate if update site availability should be verified. The default is false.
+ *
+ * @see DiscoveryConnector#getAvailable()
+ * @see #verifySiteAvailability(IProgressMonitor)
+ */
+ public void setVerifyUpdateSiteAvailability(boolean verifyUpdateSiteAvailability) {
+ this.verifyUpdateSiteAvailability = verifyUpdateSiteAvailability;
+ }
+
+ /**
+ * <em>not for general use: public for testing purposes only</em> A map of installed features to their version. Used
+ * to resolve {@link ConnectorDescriptor#getFeatureFilter() feature filters}.
+ */
+ public Map<String, Version> getFeatureToVersion() {
+ return featureToVersion;
+ }
+
+ /**
+ * <em>not for general use: public for testing purposes only</em> A map of installed features to their version. Used
+ * to resolve {@link ConnectorDescriptor#getFeatureFilter() feature filters}.
+ */
+ public void setFeatureToVersion(Map<String, Version> featureToVersion) {
+ this.featureToVersion = featureToVersion;
+ }
+
+ private void connectCategoriesToDescriptors() {
+ Map<String, DiscoveryCategory> idToCategory = new HashMap<String, DiscoveryCategory>();
+ for (DiscoveryCategory category : categories) {
+ DiscoveryCategory previous = idToCategory.put(category.getId(), category);
+ if (previous != null) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.ConnectorDiscovery_duplicate_category_id, new Object[] { category.getId(),
+ category.getSource().getId(), previous.getSource().getId() })));
+ }
+ }
+
+ for (DiscoveryConnector connector : connectors) {
+ DiscoveryCategory category = idToCategory.get(connector.getCategoryId());
+ if (category != null) {
+ category.getConnectors().add(connector);
+ connector.setCategory(category);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.ConnectorDiscovery_bundle_references_unknown_category, new Object[] {
+ connector.getCategoryId(), connector.getId(), connector.getSource().getId() })));
+ }
+ }
+ }
+
+ /**
+ * eliminate any connectors whose {@link ConnectorDescriptor#getPlatformFilter() platform filters} don't match
+ */
+ private void filterDescriptors() {
+ for (DiscoveryConnector connector : new ArrayList<DiscoveryConnector>(connectors)) {
+ if (connector.getPlatformFilter() != null && connector.getPlatformFilter().trim().length() > 0) {
+ boolean match = false;
+ try {
+ Filter filter = FrameworkUtil.createFilter(connector.getPlatformFilter());
+ match = filter.match(environment);
+ } catch (InvalidSyntaxException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.ConnectorDiscovery_illegal_filter_syntax, new Object[] {
+ connector.getPlatformFilter(), connector.getId(), connector.getSource().getId() })));
+ }
+ if (!match) {
+ connectors.remove(connector);
+ filteredConnectors.add(connector);
+ }
+ }
+ for (FeatureFilter featureFilter : connector.getFeatureFilter()) {
+ if (featureToVersion == null) {
+ featureToVersion = computeFeatureToVersion();
+ }
+ boolean match = false;
+ Version version = featureToVersion.get(featureFilter.getFeatureId());
+ if (version != null) {
+ VersionRange versionRange = new VersionRange(featureFilter.getVersion());
+ if (versionRange.isIncluded(version)) {
+ match = true;
+ }
+ }
+ if (!match) {
+ connectors.remove(connector);
+ filteredConnectors.add(connector);
+ break;
+ }
+ }
+ }
+ }
+
+ private Map<String, Version> computeFeatureToVersion() {
+ Map<String, Version> featureToVersion = new HashMap<String, Version>();
+ for (IBundleGroupProvider provider : Platform.getBundleGroupProviders()) {
+ for (IBundleGroup bundleGroup : provider.getBundleGroups()) {
+ for (Bundle bundle : bundleGroup.getBundles()) {
+ featureToVersion.put(bundle.getSymbolicName(), bundle.getVersion());
+ }
+ }
+ }
+ return featureToVersion;
+ }
+
+ /**
+ * Determine update site availability. This may be performed automatically as part of discovery when
+ * {@link #isVerifyUpdateSiteAvailability()} is true, or it may be invoked later by calling this method.
+ */
+ public void verifySiteAvailability(IProgressMonitor monitor) {
+ // NOTE: we don't put java.net.URLs in the map since it involves DNS activity when
+ // computing the hash code.
+ Map<String, Collection<DiscoveryConnector>> urlToDescriptors = new HashMap<String, Collection<DiscoveryConnector>>();
+
+ for (DiscoveryConnector descriptor : connectors) {
+ String url = descriptor.getSiteUrl();
+ if (!url.endsWith("/")) { //$NON-NLS-1$
+ url += "/"; //$NON-NLS-1$
+ }
+ Collection<DiscoveryConnector> collection = urlToDescriptors.get(url);
+ if (collection == null) {
+ collection = new ArrayList<DiscoveryConnector>();
+ urlToDescriptors.put(url, collection);
+ }
+ collection.add(descriptor);
+ }
+ final int totalTicks = urlToDescriptors.size();
+ monitor.beginTask(Messages.ConnectorDiscovery_task_verifyingAvailability, totalTicks);
+ try {
+ if (!urlToDescriptors.isEmpty()) {
+ ExecutorService executorService = Executors.newFixedThreadPool(Math.min(urlToDescriptors.size(), 4));
+ try {
+ List<Future<VerifyUpdateSiteJob>> futures = new ArrayList<Future<VerifyUpdateSiteJob>>(
+ urlToDescriptors.size());
+ for (String url : urlToDescriptors.keySet()) {
+ futures.add(executorService.submit(new VerifyUpdateSiteJob(url)));
+ }
+ for (Future<VerifyUpdateSiteJob> jobFuture : futures) {
+ try {
+ for (;;) {
+ try {
+ VerifyUpdateSiteJob job = jobFuture.get(1L, TimeUnit.SECONDS);
+
+ Collection<DiscoveryConnector> descriptors = urlToDescriptors.get(job.url);
+ for (DiscoveryConnector descriptor : descriptors) {
+ descriptor.setAvailable(job.ok);
+ }
+ break;
+ } catch (TimeoutException e) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ monitor.setCanceled(true);
+ return;
+ } catch (ExecutionException e) {
+ if (e.getCause() instanceof OperationCanceledException) {
+ monitor.setCanceled(true);
+ return;
+ }
+ IStatus status;
+ if (e.getCause() instanceof CoreException) {
+ status = ((CoreException) e.getCause()).getStatus();
+ } else {
+ status = new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ Messages.ConnectorDiscovery_unexpected_exception, e.getCause());
+ }
+ StatusHandler.log(status);
+ }
+ monitor.worked(1);
+ }
+ } finally {
+ executorService.shutdownNow();
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private static class VerifyUpdateSiteJob implements Callable<VerifyUpdateSiteJob> {
+
+ private final String url;
+
+ private boolean ok = false;
+
+ public VerifyUpdateSiteJob(String url) {
+ this.url = url;
+ }
+
+ public VerifyUpdateSiteJob call() throws Exception {
+ URL baseUrl = new URL(url);
+ List<WebLocation> locations = new ArrayList<WebLocation>();
+ for (String location : new String[] { "content.jar", "content.xml", "site.xml" }) { //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ locations.add(new WebLocation(new URL(baseUrl, location).toExternalForm()));
+ }
+ ok = WebUtil.verifyAvailability(locations, true, new NullProgressMonitor());
+ return this;
+ }
+
+ }
+
+ public void dispose() {
+ for (final AbstractDiscoveryStrategy strategy : discoveryStrategies) {
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void run() throws Exception {
+ strategy.dispose();
+ }
+
+ public void handleException(Throwable exception) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ Messages.ConnectorDiscovery_exception_disposing + strategy.getClass().getName(), exception));
+ }
+ });
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscoveryExtensionReader.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscoveryExtensionReader.java
new file mode 100644
index 0000000..be0faee
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscoveryExtensionReader.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Task top 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.discovery.core.model;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * Connector Discovery extension point reader, for extension points of type
+ * <tt>org.eclipse.mylyn.discovery.core.connectorDiscovery</tt>
+ *
+ * @author David Green
+ */
+public class ConnectorDiscoveryExtensionReader {
+
+ public static final String EXTENSION_POINT_ID = "org.eclipse.mylyn.discovery.core.connectorDiscovery"; //$NON-NLS-1$
+
+ public static final String CONNECTOR_DESCRIPTOR = "connectorDescriptor"; //$NON-NLS-1$
+
+ public static final String CONNECTOR_CATEGORY = "connectorCategory"; //$NON-NLS-1$
+
+ public static final String ICON = "icon"; //$NON-NLS-1$
+
+ public static final String OVERVIEW = "overview"; //$NON-NLS-1$
+
+ public static final String FEATURE_FILTER = "featureFilter"; //$NON-NLS-1$
+
+ public static final String GROUP = "group"; //$NON-NLS-1$
+
+ public ConnectorDescriptor readConnectorDescriptor(IConfigurationElement element) throws ValidationException {
+ return readConnectorDescriptor(element, ConnectorDescriptor.class);
+ }
+
+ public <T extends ConnectorDescriptor> T readConnectorDescriptor(IConfigurationElement element, Class<T> clazz)
+ throws ValidationException {
+ T connectorDescriptor;
+ try {
+ connectorDescriptor = clazz.newInstance();
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+
+ try {
+ String kinds = element.getAttribute("kind"); //$NON-NLS-1$
+ if (kinds != null) {
+ String[] akinds = kinds.split("\\s*,\\s*"); //$NON-NLS-1$
+ for (String kind : akinds) {
+ connectorDescriptor.getKind().add(ConnectorDescriptorKind.fromValue(kind));
+ }
+ }
+ } catch (IllegalArgumentException e) {
+ throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_value_kind);
+ }
+ connectorDescriptor.setName(element.getAttribute("name")); //$NON-NLS-1$
+ connectorDescriptor.setProvider(element.getAttribute("provider")); //$NON-NLS-1$
+ connectorDescriptor.setLicense(element.getAttribute("license")); //$NON-NLS-1$
+ connectorDescriptor.setDescription(element.getAttribute("description")); //$NON-NLS-1$
+ connectorDescriptor.setSiteUrl(element.getAttribute("siteUrl")); //$NON-NLS-1$
+ connectorDescriptor.setId(element.getAttribute("id")); //$NON-NLS-1$
+ connectorDescriptor.setCategoryId(element.getAttribute("categoryId")); //$NON-NLS-1$
+ connectorDescriptor.setPlatformFilter(element.getAttribute("platformFilter")); //$NON-NLS-1$
+ connectorDescriptor.setGroupId(element.getAttribute("groupId")); //$NON-NLS-1$
+
+ for (IConfigurationElement child : element.getChildren("featureFilter")) { //$NON-NLS-1$
+ FeatureFilter featureFilterItem = readFeatureFilter(child);
+ featureFilterItem.setConnectorDescriptor(connectorDescriptor);
+ connectorDescriptor.getFeatureFilter().add(featureFilterItem);
+ }
+ for (IConfigurationElement child : element.getChildren("icon")) { //$NON-NLS-1$
+ Icon iconItem = readIcon(child);
+ iconItem.setConnectorDescriptor(connectorDescriptor);
+ if (connectorDescriptor.getIcon() != null) {
+ throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_icon);
+ }
+ connectorDescriptor.setIcon(iconItem);
+ }
+ for (IConfigurationElement child : element.getChildren("overview")) { //$NON-NLS-1$
+ Overview overviewItem = readOverview(child);
+ overviewItem.setConnectorDescriptor(connectorDescriptor);
+ if (connectorDescriptor.getOverview() != null) {
+ throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_overview);
+ }
+ connectorDescriptor.setOverview(overviewItem);
+ }
+
+ connectorDescriptor.validate();
+
+ return connectorDescriptor;
+ }
+
+ public ConnectorCategory readConnectorCategory(IConfigurationElement element) throws ValidationException {
+ return readConnectorCategory(element, ConnectorCategory.class);
+ }
+
+ public <T extends ConnectorCategory> T readConnectorCategory(IConfigurationElement element, Class<T> clazz)
+ throws ValidationException {
+ T connectorCategory;
+ try {
+ connectorCategory = clazz.newInstance();
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+
+ connectorCategory.setId(element.getAttribute("id")); //$NON-NLS-1$
+ connectorCategory.setName(element.getAttribute("name")); //$NON-NLS-1$
+ connectorCategory.setDescription(element.getAttribute("description")); //$NON-NLS-1$
+ connectorCategory.setRelevance(element.getAttribute("relevance")); //$NON-NLS-1$
+
+ for (IConfigurationElement child : element.getChildren("icon")) { //$NON-NLS-1$
+ Icon iconItem = readIcon(child);
+ iconItem.setConnectorCategory(connectorCategory);
+ if (connectorCategory.getIcon() != null) {
+ throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_icon);
+ }
+ connectorCategory.setIcon(iconItem);
+ }
+ for (IConfigurationElement child : element.getChildren("overview")) { //$NON-NLS-1$
+ Overview overviewItem = readOverview(child);
+ overviewItem.setConnectorCategory(connectorCategory);
+ if (connectorCategory.getOverview() != null) {
+ throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_overview);
+ }
+ connectorCategory.setOverview(overviewItem);
+ }
+ for (IConfigurationElement child : element.getChildren("group")) { //$NON-NLS-1$
+ Group groupItem = readGroup(child);
+ groupItem.setConnectorCategory(connectorCategory);
+ connectorCategory.getGroup().add(groupItem);
+ }
+
+ connectorCategory.validate();
+
+ return connectorCategory;
+ }
+
+ public Icon readIcon(IConfigurationElement element) throws ValidationException {
+ Icon icon = new Icon();
+
+ icon.setImage16(element.getAttribute("image16")); //$NON-NLS-1$
+ icon.setImage32(element.getAttribute("image32")); //$NON-NLS-1$
+ icon.setImage48(element.getAttribute("image48")); //$NON-NLS-1$
+ icon.setImage64(element.getAttribute("image64")); //$NON-NLS-1$
+ icon.setImage128(element.getAttribute("image128")); //$NON-NLS-1$
+
+ icon.validate();
+
+ return icon;
+ }
+
+ public Overview readOverview(IConfigurationElement element) throws ValidationException {
+ Overview overview = new Overview();
+
+ overview.setSummary(element.getAttribute("summary")); //$NON-NLS-1$
+ overview.setUrl(element.getAttribute("url")); //$NON-NLS-1$
+ overview.setScreenshot(element.getAttribute("screenshot")); //$NON-NLS-1$
+
+ overview.validate();
+
+ return overview;
+ }
+
+ public FeatureFilter readFeatureFilter(IConfigurationElement element) throws ValidationException {
+ FeatureFilter featureFilter = new FeatureFilter();
+
+ featureFilter.setFeatureId(element.getAttribute("featureId")); //$NON-NLS-1$
+ featureFilter.setVersion(element.getAttribute("version")); //$NON-NLS-1$
+
+ featureFilter.validate();
+
+ return featureFilter;
+ }
+
+ public Group readGroup(IConfigurationElement element) throws ValidationException {
+ Group group = new Group();
+
+ group.setId(element.getAttribute("id")); //$NON-NLS-1$
+
+ group.validate();
+
+ return group;
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Directory.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Directory.java
new file mode 100644
index 0000000..bac747a
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Directory.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A directory representing locations of discovery sources.
+ *
+ * @author David Green
+ */
+public class Directory {
+
+ /**
+ * an entry in the directory, which represents a specific discovery source. Future versions of this class may
+ * include policy or other attributes declared by the directory.
+ */
+ public static final class Entry {
+ private String location;
+
+ private boolean permitCategories;
+
+ public Entry() {
+ }
+
+ /**
+ * the location of the entry (an URL)
+ */
+ public String getLocation() {
+ return location;
+ }
+
+ /**
+ * the location of the entry (an URL)
+ */
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ /**
+ * indicate if creation of categories by this location is permitted
+ */
+ public boolean isPermitCategories() {
+ return permitCategories;
+ }
+
+ /**
+ * indicate if creation of categories by this location is permitted
+ */
+ public void setPermitCategories(boolean permitCategories) {
+ this.permitCategories = permitCategories;
+ }
+ }
+
+ private final List<Entry> entries = new ArrayList<Entry>();
+
+ public List<Entry> getEntries() {
+ return entries;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DirectoryParser.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DirectoryParser.java
new file mode 100644
index 0000000..0fd88da
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DirectoryParser.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.io.IOException;
+import java.io.Reader;
+
+import org.eclipse.mylyn.internal.discovery.core.model.Directory.Entry;
+import org.eclipse.mylyn.internal.discovery.core.util.DefaultSaxErrorHandler;
+import org.eclipse.mylyn.internal.discovery.core.util.IOWithCauseException;
+import org.eclipse.osgi.util.NLS;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * A parser for {@link Directory directories}.
+ *
+ * @author David Green
+ */
+public class DirectoryParser {
+ /**
+ * parse the contents of a directory. The caller must close the given reader.
+ *
+ * @param directoryContents
+ * the contents of the directory
+ * @return a directory with 0 or more entries
+ * @throws IOException
+ * if the directory cannot be read.
+ */
+ public Directory parse(Reader directoryContents) throws IOException {
+ XMLReader xmlReader;
+ try {
+ xmlReader = XMLReaderFactory.createXMLReader();
+ } catch (SAXException e) {
+ throw new IOWithCauseException(e.getMessage(), e);
+ }
+ xmlReader.setErrorHandler(new DefaultSaxErrorHandler());
+
+ DirectoryContentHandler contentHandler = new DirectoryContentHandler();
+ xmlReader.setContentHandler(contentHandler);
+
+ try {
+ xmlReader.parse(new InputSource(directoryContents));
+ } catch (SAXException e) {
+ throw new IOWithCauseException(e.getMessage(), e);
+ }
+
+ if (contentHandler.directory == null) {
+ throw new IOException(Messages.DirectoryParser_no_directory);
+ }
+
+ return contentHandler.directory;
+ }
+
+ private class DirectoryContentHandler implements ContentHandler {
+
+ Directory directory;
+
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ // ignore
+ }
+
+ public void endDocument() throws SAXException {
+ // ignore
+ }
+
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ // ignore
+ }
+
+ public void endPrefixMapping(String prefix) throws SAXException {
+ // ignore
+ }
+
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+ // ignore
+ }
+
+ public void processingInstruction(String target, String data) throws SAXException {
+ // ignore
+ }
+
+ public void setDocumentLocator(Locator locator) {
+ // ignore
+ }
+
+ public void skippedEntity(String name) throws SAXException {
+ // ignore
+ }
+
+ public void startDocument() throws SAXException {
+ // ignore
+ }
+
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+ if ("directory".equals(localName)) { //$NON-NLS-1$
+ if (directory != null) {
+ unexpectedElement(localName);
+ }
+ directory = new Directory();
+ } else if (directory != null && "entry".equals(localName)) { //$NON-NLS-1$
+ String url = atts.getValue("", "url"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (url != null && url.length() > 0) {
+ Entry entry = new Entry();
+ entry.setLocation(url);
+ entry.setPermitCategories(Boolean.parseBoolean(atts.getValue("permitCategories"))); //$NON-NLS-1$
+ directory.getEntries().add(entry);
+ }
+ }
+ // else ignore
+ }
+
+ private void unexpectedElement(String localName) throws SAXException {
+ throw new SAXException(NLS.bind(Messages.DirectoryParser_unexpected_element, localName));
+ }
+
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ // ignore
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryCategory.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryCategory.java
new file mode 100644
index 0000000..453e808
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryCategory.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author David Green
+ */
+public class DiscoveryCategory extends ConnectorCategory {
+ private AbstractDiscoverySource source;
+
+ private List<DiscoveryConnector> connectors = new ArrayList<DiscoveryConnector>();
+
+ public List<DiscoveryConnector> getConnectors() {
+ return connectors;
+ }
+
+ public AbstractDiscoverySource getSource() {
+ return source;
+ }
+
+ public void setSource(AbstractDiscoverySource source) {
+ this.source = source;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryConnector.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryConnector.java
new file mode 100644
index 0000000..e3b5799
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryConnector.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+
+/**
+ * @author David Green
+ */
+public class DiscoveryConnector extends ConnectorDescriptor {
+ private AbstractDiscoverySource source;
+
+ private DiscoveryCategory category;
+
+ private boolean selected;
+
+ private Boolean available;
+
+ private final PropertyChangeSupport changeSupport;
+
+ public DiscoveryConnector() {
+ changeSupport = new PropertyChangeSupport(this);
+ }
+
+ public DiscoveryCategory getCategory() {
+ return category;
+ }
+
+ public void setCategory(DiscoveryCategory category) {
+ this.category = category;
+ }
+
+ public AbstractDiscoverySource getSource() {
+ return source;
+ }
+
+ public void setSource(AbstractDiscoverySource source) {
+ this.source = source;
+ }
+
+ /**
+ * support selection
+ *
+ * @return true if the item is selected, otherwise false
+ */
+ public boolean isSelected() {
+ return selected;
+ }
+
+ /**
+ * support selection
+ *
+ * @param selected
+ * true if the item is selected, otherwise false
+ */
+ public void setSelected(boolean selected) {
+ this.selected = selected;
+ }
+
+ /**
+ * indicate if this connector is available
+ *
+ * @return true if available, false if not, or null if availability is unknown
+ */
+ public Boolean getAvailable() {
+ return available;
+ }
+
+ /**
+ * indicate if this connector is available
+ *
+ * @param available
+ * true if available, false if not, or null if availability is unknown
+ */
+ public void setAvailable(Boolean available) {
+ if (available != this.available || (available != null && !available.equals(this.available))) {
+ Boolean previous = this.available;
+ this.available = available;
+ changeSupport.firePropertyChange("available", previous, this.available); //$NON-NLS-1$
+ }
+ }
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ changeSupport.addPropertyChangeListener(listener);
+ }
+
+ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ changeSupport.addPropertyChangeListener(propertyName, listener);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ changeSupport.removePropertyChangeListener(listener);
+ }
+
+ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ changeSupport.removePropertyChangeListener(propertyName, listener);
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryRegistryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryRegistryStrategy.java
new file mode 100644
index 0000000..303cfab
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryRegistryStrategy.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.PropertyResourceBundle;
+import java.util.ResourceBundle;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+import org.eclipse.core.runtime.IContributor;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.spi.IDynamicExtensionRegistry;
+import org.eclipse.core.runtime.spi.RegistryContributor;
+import org.eclipse.core.runtime.spi.RegistryStrategy;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
+import org.eclipse.mylyn.internal.discovery.core.model.Directory.Entry;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author David Green
+ */
+class DiscoveryRegistryStrategy extends RegistryStrategy {
+
+ private final List<JarFile> jars = new ArrayList<JarFile>();
+
+ private final Map<IContributor, File> contributorToJarFile = new HashMap<IContributor, File>();
+
+ private final Map<IContributor, Entry> contributorToDirectoryEntry = new HashMap<IContributor, Entry>();
+
+ private final Object token;
+
+ private Map<File, Entry> bundleFileToDirectoryEntry;
+
+ public DiscoveryRegistryStrategy(File[] storageDirs, boolean[] cacheReadOnly, Object token) {
+ super(storageDirs, cacheReadOnly);
+ this.token = token;
+ }
+
+ @Override
+ public void onStart(IExtensionRegistry registry, boolean loadedFromCache) {
+ super.onStart(registry, loadedFromCache);
+ if (!loadedFromCache) {
+ processDiscoveryCoreBundle(registry);
+ processBundles(registry);
+ }
+ }
+
+ private void processDiscoveryCoreBundle(IExtensionRegistry registry) {
+ // we must add a contribution from the core bundle so that we get the
+ // extension point itself
+ try {
+ Bundle bundle = Platform.getBundle(DiscoveryCore.ID_PLUGIN);
+ IContributor contributor = new RegistryContributor(bundle.getSymbolicName(), bundle.getSymbolicName(),
+ null, null);
+
+ InputStream inputStream = bundle.getEntry("plugin.xml").openStream(); //$NON-NLS-1$
+ try {
+ registry.addContribution(inputStream, contributor, false, bundle.getSymbolicName(), null, token);
+ } finally {
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException();
+ }
+ }
+
+ private void processBundles(IExtensionRegistry registry) {
+ if (bundleFileToDirectoryEntry == null) {
+ throw new IllegalStateException();
+ }
+ for (java.util.Map.Entry<File, Entry> bundleFile : bundleFileToDirectoryEntry.entrySet()) {
+ try {
+ processBundle(registry, bundleFile.getValue(), bundleFile.getKey());
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.DiscoveryRegistryStrategy_cannot_load_bundle, new Object[] {
+ bundleFile.getKey().getName(), bundleFile.getValue().getLocation(), e.getMessage() }),
+ e));
+ }
+ }
+ }
+
+ private void processBundle(IExtensionRegistry registry, Directory.Entry entry, File bundleFile) throws IOException {
+ JarFile jarFile = new JarFile(bundleFile);
+ jars.add(jarFile);
+
+ ZipEntry pluginXmlEntry = jarFile.getEntry("plugin.xml"); //$NON-NLS-1$
+ if (pluginXmlEntry == null) {
+ throw new IOException(Messages.DiscoveryRegistryStrategy_missing_pluginxml);
+ }
+ IContributor contributor = new RegistryContributor(bundleFile.getName(), bundleFile.getName(), null, null);
+ if (((IDynamicExtensionRegistry) registry).hasContributor(contributor)) {
+ jarFile.close();
+ return;
+ }
+ contributorToJarFile.put(contributor, bundleFile);
+ contributorToDirectoryEntry.put(contributor, entry);
+
+ ResourceBundle translationBundle = loadTranslationBundle(jarFile);
+
+ InputStream inputStream = jarFile.getInputStream(pluginXmlEntry);
+ try {
+ registry.addContribution(inputStream, contributor, false, bundleFile.getPath(), translationBundle, token);
+ } finally {
+ inputStream.close();
+ }
+ }
+
+ private ResourceBundle loadTranslationBundle(JarFile jarFile) throws IOException {
+ List<String> bundleNames = computeBundleNames("plugin"); //$NON-NLS-1$
+ for (String bundleName : bundleNames) {
+ ZipEntry entry = jarFile.getEntry(bundleName);
+ if (entry != null) {
+ InputStream inputStream = jarFile.getInputStream(entry);
+ try {
+ PropertyResourceBundle resourceBundle = new PropertyResourceBundle(inputStream);
+ return resourceBundle;
+ } finally {
+ inputStream.close();
+ }
+ }
+ }
+ return null;
+ }
+
+ private List<String> computeBundleNames(String baseName) {
+ String suffix = ".properties"; //$NON-NLS-1$
+ String name = baseName;
+ List<String> bundleNames = new ArrayList<String>();
+ Locale locale = Locale.getDefault();
+ bundleNames.add(name + suffix);
+ if (locale.getLanguage() != null && locale.getLanguage().length() > 0) {
+ name = name + '_' + locale.getLanguage();
+ bundleNames.add(0, name + suffix);
+ }
+ if (locale.getCountry() != null && locale.getCountry().length() > 0) {
+ name = name + '_' + locale.getCountry();
+ bundleNames.add(0, name + suffix);
+ }
+ if (locale.getVariant() != null && locale.getVariant().length() > 0) {
+ name = name + '_' + locale.getVariant();
+ bundleNames.add(0, name + suffix);
+ }
+ return bundleNames;
+ }
+
+ @Override
+ public void onStop(IExtensionRegistry registry) {
+ try {
+ super.onStop(registry);
+ } finally {
+ for (JarFile jar : jars) {
+ try {
+ jar.close();
+ } catch (Exception e) {
+ }
+ }
+ jars.clear();
+ }
+ }
+
+ /**
+ * get the jar file that corresponds to the given contributor.
+ *
+ * @throws IllegalArgumentException
+ * if the given contributor is unknown
+ */
+ public File getJarFile(IContributor contributor) {
+ File file = contributorToJarFile.get(contributor);
+ if (file == null) {
+ throw new IllegalArgumentException(contributor.getName());
+ }
+ return file;
+ }
+
+ /**
+ * get the directory entry that corresponds to the given contributor.
+ *
+ * @throws IllegalArgumentException
+ * if the given contributor is unknown
+ */
+ public Entry getDirectoryEntry(IContributor contributor) {
+ Entry entry = contributorToDirectoryEntry.get(contributor);
+ if (entry == null) {
+ throw new IllegalArgumentException(contributor.getName());
+ }
+ return entry;
+ }
+
+ public void setBundles(Map<File, Entry> bundleFileToDirectoryEntry) {
+ this.bundleFileToDirectoryEntry = bundleFileToDirectoryEntry;
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/FeatureFilter.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/FeatureFilter.java
new file mode 100644
index 0000000..c60e224
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/FeatureFilter.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+/**
+ * A means of specifying that a feature must be present in order for the connectorDescriptor to be presented to the
+ * user.
+ *
+ * @author David Green
+ */
+public class FeatureFilter {
+
+ protected String featureId;
+
+ protected String version;
+
+ protected ConnectorDescriptor connectorDescriptor;
+
+ public FeatureFilter() {
+ }
+
+ /**
+ * The id of the feature to test
+ */
+ public String getFeatureId() {
+ return featureId;
+ }
+
+ public void setFeatureId(String featureId) {
+ this.featureId = featureId;
+ }
+
+ /**
+ * A version specifier, specified in the same manner as version dependencies are specified in an OSGi manifest. For
+ * example: "[3.0,4.0)"
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public ConnectorDescriptor getConnectorDescriptor() {
+ return connectorDescriptor;
+ }
+
+ public void setConnectorDescriptor(ConnectorDescriptor connectorDescriptor) {
+ this.connectorDescriptor = connectorDescriptor;
+ }
+
+ public void validate() throws ValidationException {
+ if (featureId == null || featureId.length() == 0) {
+ throw new ValidationException(Messages.FeatureFilter_must_specify_featureFilter_featureId);
+ }
+ if (version == null || version.length() == 0) {
+ throw new ValidationException(Messages.FeatureFilter_must_specify_featureFilter_version);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Group.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Group.java
new file mode 100644
index 0000000..c3347a3
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Group.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Task top 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.discovery.core.model;
+
+/**
+ * groups provide a way to anchor connectors in a grouping with other like entries.
+ *
+ * @author David Green
+ */
+public class Group {
+
+ protected String id;
+
+ protected ConnectorCategory connectorCategory;
+
+ public Group() {
+ }
+
+ /**
+ * An identifier that identifies the group. Must be unique for a particular connectorCategory.
+ */
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ConnectorCategory getConnectorCategory() {
+ return connectorCategory;
+ }
+
+ public void setConnectorCategory(ConnectorCategory connectorCategory) {
+ this.connectorCategory = connectorCategory;
+ }
+
+ public void validate() throws ValidationException {
+ if (id == null || id.length() == 0) {
+ throw new ValidationException(Messages.Group_must_specify_group_id);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Icon.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Icon.java
new file mode 100644
index 0000000..4058f60
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Icon.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+/**
+ * @author David Green
+ */
+public class Icon {
+
+ protected String image16;
+
+ protected String image32;
+
+ protected String image48;
+
+ protected String image64;
+
+ protected String image128;
+
+ protected ConnectorDescriptor connectorDescriptor;
+
+ protected ConnectorCategory connectorCategory;
+
+ public Icon() {
+ }
+
+ public String getImage16() {
+ return image16;
+ }
+
+ public void setImage16(String image16) {
+ this.image16 = image16;
+ }
+
+ public String getImage32() {
+ return image32;
+ }
+
+ public void setImage32(String image32) {
+ this.image32 = image32;
+ }
+
+ public String getImage48() {
+ return image48;
+ }
+
+ public void setImage48(String image48) {
+ this.image48 = image48;
+ }
+
+ public String getImage64() {
+ return image64;
+ }
+
+ public void setImage64(String image64) {
+ this.image64 = image64;
+ }
+
+ public String getImage128() {
+ return image128;
+ }
+
+ public void setImage128(String image128) {
+ this.image128 = image128;
+ }
+
+ public ConnectorDescriptor getConnectorDescriptor() {
+ return connectorDescriptor;
+ }
+
+ public void setConnectorDescriptor(ConnectorDescriptor connectorDescriptor) {
+ this.connectorDescriptor = connectorDescriptor;
+ }
+
+ public ConnectorCategory getConnectorCategory() {
+ return connectorCategory;
+ }
+
+ public void setConnectorCategory(ConnectorCategory connectorCategory) {
+ this.connectorCategory = connectorCategory;
+ }
+
+ public void validate() throws ValidationException {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/JarDiscoverySource.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/JarDiscoverySource.java
new file mode 100644
index 0000000..5c44acd
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/JarDiscoverySource.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLEncoder;
+
+/**
+ *
+ * @author David Green
+ */
+public class JarDiscoverySource extends AbstractDiscoverySource {
+
+ private final String id;
+
+ private final File jarFile;
+
+ public JarDiscoverySource(String id, File jarFile) {
+ this.id = id;
+ this.jarFile = jarFile;
+ }
+
+ @Override
+ public Object getId() {
+ return id;
+ }
+
+ @Override
+ public URL getResource(String resourceName) {
+ try {
+ String prefix = jarFile.toURI().toURL().toExternalForm();
+
+ return new URL("jar:" + prefix + "!/" + URLEncoder.encode(resourceName, "utf-8")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ } catch (MalformedURLException e) {
+ throw new IllegalStateException(e);
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Messages.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Messages.java
new file mode 100644
index 0000000..73b91ab
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Messages.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.discovery.core.model.messages"; //$NON-NLS-1$
+
+ public static String BundleDiscoveryStrategy_3;
+
+ public static String BundleDiscoveryStrategy_categoryDisallowed;
+
+ public static String BundleDiscoveryStrategy_task_loading_local_extensions;
+
+ public static String BundleDiscoveryStrategy_task_processing_extensions;
+
+ public static String BundleDiscoveryStrategy_unexpected_element;
+
+ public static String ConnectorCategory_connectorCategory_relevance_invalid;
+
+ public static String ConnectorCategory_must_specify_connectorCategory_id;
+
+ public static String ConnectorCategory_must_specify_connectorCategory_name;
+
+ public static String ConnectorDescriptor_invalid_connectorDescriptor_siteUrl;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_categoryId;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_id;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_kind;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_license;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_name;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_provider;
+
+ public static String ConnectorDescriptor_must_specify_connectorDescriptor_siteUrl;
+
+ public static String ConnectorDiscovery_bundle_references_unknown_category;
+
+ public static String ConnectorDiscovery_duplicate_category_id;
+
+ public static String ConnectorDiscovery_exception_disposing;
+
+ public static String ConnectorDiscovery_illegal_filter_syntax;
+
+ public static String ConnectorDiscovery_task_discovering_connectors;
+
+ public static String ConnectorDiscovery_task_verifyingAvailability;
+
+ public static String ConnectorDiscovery_unexpected_exception;
+
+ public static String ConnectorDiscoveryExtensionReader_unexpected_element_icon;
+
+ public static String ConnectorDiscoveryExtensionReader_unexpected_element_overview;
+
+ public static String ConnectorDiscoveryExtensionReader_unexpected_value_kind;
+
+ public static String DirectoryParser_no_directory;
+
+ public static String DirectoryParser_unexpected_element;
+
+ public static String DiscoveryRegistryStrategy_cannot_load_bundle;
+
+ public static String DiscoveryRegistryStrategy_missing_pluginxml;
+
+ public static String FeatureFilter_must_specify_featureFilter_featureId;
+
+ public static String FeatureFilter_must_specify_featureFilter_version;
+
+ public static String Group_must_specify_group_id;
+
+ public static String RemoteBundleDiscoveryStrategy_cannot_download_bundle;
+
+ public static String RemoteBundleDiscoveryStrategy_empty_directory;
+
+ public static String RemoteBundleDiscoveryStrategy_io_failure_discovery_directory;
+
+ public static String RemoteBundleDiscoveryStrategy_io_failure_temp_storage;
+
+ public static String RemoteBundleDiscoveryStrategy_task_remote_discovery;
+
+ public static String RemoteBundleDiscoveryStrategy_unexpectedError;
+
+ public static String RemoteBundleDiscoveryStrategy_unknown_host_discovery_directory;
+
+ public static String RemoteBundleDiscoveryStrategy_unrecognized_discovery_url;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Overview.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Overview.java
new file mode 100644
index 0000000..479e729
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Overview.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+/**
+ * @author David Green
+ */
+public class Overview {
+
+ protected String summary;
+
+ protected String url;
+
+ protected String screenshot;
+
+ protected ConnectorDescriptor connectorDescriptor;
+
+ protected ConnectorCategory connectorCategory;
+
+ public Overview() {
+ }
+
+ /**
+ * A description providing detailed information about the item. Newlines can be used to format the text into
+ * multiple paragraphs if necessary. Text must fit into an area 320x240, otherwise it will be truncated in the UI.
+ * More lengthy descriptions can be provided on a web page if required, see @url.
+ */
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ /**
+ * An URL that points to a web page with more information relevant to the connector or category.
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * 320x240 PNG, JPEG or GIF
+ */
+ public String getScreenshot() {
+ return screenshot;
+ }
+
+ public void setScreenshot(String screenshot) {
+ this.screenshot = screenshot;
+ }
+
+ public ConnectorDescriptor getConnectorDescriptor() {
+ return connectorDescriptor;
+ }
+
+ public void setConnectorDescriptor(ConnectorDescriptor connectorDescriptor) {
+ this.connectorDescriptor = connectorDescriptor;
+ }
+
+ public ConnectorCategory getConnectorCategory() {
+ return connectorCategory;
+ }
+
+ public void setConnectorCategory(ConnectorCategory connectorCategory) {
+ this.connectorCategory = connectorCategory;
+ }
+
+ public void validate() throws ValidationException {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Policy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Policy.java
new file mode 100644
index 0000000..ee7fe55
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Policy.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+/**
+ * a policy defines what is permitted.
+ *
+ * @author David Green
+ */
+public class Policy {
+ /**
+ * Define system property <code>org.eclipse.mylyn.internal.discovery.core.model.Policy.permissive=true</code> to
+ * allow for categories to be permitted by anyone. For testing purposes.
+ */
+ private static final boolean PERMISSIVE = Boolean.getBoolean(Policy.class.getName() + ".permissive"); //$NON-NLS-1$
+
+ private static final Policy DEFAULT = new Policy(false);
+
+ private final boolean permitCategories;
+
+ public Policy(boolean permitCategories) {
+ this.permitCategories = permitCategories;
+ }
+
+ public boolean isPermitCategories() {
+ return permitCategories || PERMISSIVE;
+ }
+
+ public static Policy defaultPolicy() {
+ return DEFAULT;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/RemoteBundleDiscoveryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/RemoteBundleDiscoveryStrategy.java
new file mode 100644
index 0000000..ae78c69
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/RemoteBundleDiscoveryStrategy.java
@@ -0,0 +1,344 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.core.internal.registry.ExtensionRegistry;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IContributor;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
+import org.eclipse.mylyn.internal.discovery.core.model.Directory.Entry;
+import org.eclipse.mylyn.internal.discovery.core.util.WebUtil;
+import org.eclipse.mylyn.internal.discovery.core.util.WebUtil.TextContentProcessor;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * A discovery strategy that downloads a simple directory of remote jars. The directory is first downloaded, then each
+ * remote jar is downloaded.
+ *
+ * @author David Green
+ */
+ at SuppressWarnings("restriction")
+public class RemoteBundleDiscoveryStrategy extends BundleDiscoveryStrategy {
+
+ private String directoryUrl;
+
+ private DiscoveryRegistryStrategy registryStrategy;
+
+ private File temporaryStorage;
+
+ private int maxDiscoveryJarDownloadAttempts = 1;
+
+ @Override
+ public void performDiscovery(IProgressMonitor monitor) throws CoreException {
+ if (connectors == null || categories == null || directoryUrl == null) {
+ throw new IllegalStateException();
+ }
+ if (registryStrategy != null) {
+ throw new IllegalStateException();
+ }
+
+ final int totalTicks = 100000;
+ final int ticksTenPercent = totalTicks / 10;
+ monitor.beginTask(Messages.RemoteBundleDiscoveryStrategy_task_remote_discovery, totalTicks);
+ try {
+ File registryCacheFolder;
+ try {
+ if (temporaryStorage != null && temporaryStorage.exists()) {
+ delete(temporaryStorage);
+ }
+ temporaryStorage = File.createTempFile(RemoteBundleDiscoveryStrategy.class.getSimpleName(), ".tmp"); //$NON-NLS-1$
+ temporaryStorage.delete();
+ if (!temporaryStorage.mkdirs()) {
+ throw new IOException();
+ }
+ registryCacheFolder = new File(temporaryStorage, ".rcache"); //$NON-NLS-1$
+ if (!registryCacheFolder.mkdirs()) {
+ throw new IOException();
+ }
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ Messages.RemoteBundleDiscoveryStrategy_io_failure_temp_storage, e));
+ }
+ if (monitor.isCanceled()) {
+ return;
+ }
+
+ Directory directory;
+
+ WebLocation webLocation = new WebLocation(directoryUrl);
+ try {
+ final Directory[] temp = new Directory[1];
+ WebUtil.readResource(webLocation, new TextContentProcessor() {
+ public void process(Reader reader) throws IOException {
+ DirectoryParser parser = new DirectoryParser();
+ temp[0] = parser.parse(reader);
+ }
+ }, new SubProgressMonitor(monitor, ticksTenPercent));
+ directory = temp[0];
+ if (directory == null) {
+ throw new IllegalStateException();
+ }
+ } catch (UnknownHostException e) {
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.RemoteBundleDiscoveryStrategy_unknown_host_discovery_directory, e.getMessage()), e));
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ Messages.RemoteBundleDiscoveryStrategy_io_failure_discovery_directory, e));
+ }
+ if (monitor.isCanceled()) {
+ return;
+ }
+ if (directory.getEntries().isEmpty()) {
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ Messages.RemoteBundleDiscoveryStrategy_empty_directory));
+ }
+
+ Map<File, Directory.Entry> bundleFileToDirectoryEntry = new HashMap<File, Directory.Entry>();
+
+ ExecutorService executorService = createExecutorService(directory.getEntries().size());
+ try {
+ List<Future<DownloadBundleJob>> futures = new ArrayList<Future<DownloadBundleJob>>();
+ // submit jobs
+ for (Directory.Entry entry : directory.getEntries()) {
+ futures.add(executorService.submit(new DownloadBundleJob(entry, monitor)));
+ }
+ int futureSize = ticksTenPercent * 4 / directory.getEntries().size();
+ // collect job results
+ for (Future<DownloadBundleJob> job : futures) {
+ try {
+ DownloadBundleJob bundleJob;
+ for (;;) {
+ try {
+ bundleJob = job.get(1L, TimeUnit.SECONDS);
+ break;
+ } catch (TimeoutException e) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ }
+ }
+ if (bundleJob.file != null) {
+ bundleFileToDirectoryEntry.put(bundleJob.file, bundleJob.entry);
+ }
+ monitor.worked(futureSize);
+ } catch (ExecutionException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof OperationCanceledException) {
+ monitor.setCanceled(true);
+ return;
+ }
+ IStatus status;
+ if (cause instanceof CoreException) {
+ status = ((CoreException) cause).getStatus();
+ } else {
+ status = new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
+ Messages.RemoteBundleDiscoveryStrategy_unexpectedError, cause);
+ }
+ // log errors but continue on
+ StatusHandler.log(status);
+ } catch (InterruptedException e) {
+ monitor.setCanceled(true);
+ return;
+ }
+ }
+ } finally {
+ executorService.shutdownNow();
+ }
+
+ try {
+ registryStrategy = new DiscoveryRegistryStrategy(new File[] { registryCacheFolder },
+ new boolean[] { false }, this);
+ registryStrategy.setBundles(bundleFileToDirectoryEntry);
+ IExtensionRegistry extensionRegistry = new ExtensionRegistry(registryStrategy, this, this);
+ try {
+ IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(ConnectorDiscoveryExtensionReader.EXTENSION_POINT_ID);
+ if (extensionPoint != null) {
+ IExtension[] extensions = extensionPoint.getExtensions();
+ if (extensions.length > 0) {
+ processExtensions(new SubProgressMonitor(monitor, ticksTenPercent * 3), extensions);
+ }
+ }
+ } finally {
+ extensionRegistry.stop(this);
+ }
+ } finally {
+ registryStrategy = null;
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private class DownloadBundleJob implements Callable<DownloadBundleJob> {
+ private final IProgressMonitor monitor;
+
+ private final Entry entry;
+
+ private File file;
+
+ public DownloadBundleJob(Entry entry, IProgressMonitor monitor) {
+ this.entry = entry;
+ this.monitor = monitor;
+ }
+
+ public DownloadBundleJob call() {
+
+ String bundleUrl = entry.getLocation();
+ for (int attemptCount = 0; attemptCount < maxDiscoveryJarDownloadAttempts; ++attemptCount) {
+ try {
+ if (!bundleUrl.startsWith("http://") && !bundleUrl.startsWith("https://")) { //$NON-NLS-1$//$NON-NLS-2$
+ StatusHandler.log(new Status(IStatus.WARNING, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.RemoteBundleDiscoveryStrategy_unrecognized_discovery_url, bundleUrl)));
+ continue;
+ }
+ String lastPathElement = bundleUrl.lastIndexOf('/') == -1 ? bundleUrl
+ : bundleUrl.substring(bundleUrl.lastIndexOf('/'));
+ File target = File.createTempFile(
+ lastPathElement.replaceAll("^[a-zA-Z0-9_.]", "_") + "_", ".jar", temporaryStorage); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
+
+ if (monitor.isCanceled()) {
+ break;
+ }
+
+ WebUtil.downloadResource(target, new WebLocation(bundleUrl), new NullProgressMonitor() {
+ @Override
+ public boolean isCanceled() {
+ return super.isCanceled() || monitor.isCanceled();
+ }
+ }/*don't use sub progress monitor here*/);
+ file = target;
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
+ Messages.RemoteBundleDiscoveryStrategy_cannot_download_bundle, bundleUrl, e.getMessage()),
+ e));
+ if (isUnknownHostException(e)) {
+ break;
+ }
+ }
+ }
+ return this;
+ }
+ }
+
+ private ExecutorService createExecutorService(int size) {
+ final int maxThreads = 4;
+ return Executors.newFixedThreadPool(Math.min(size, maxThreads));
+ }
+
+ /**
+ * walk the exception chain to determine if the given exception or any of its underlying causes are an
+ * {@link UnknownHostException}.
+ *
+ * @return true if the exception or one of its causes are {@link UnknownHostException}.
+ */
+ private boolean isUnknownHostException(Throwable t) {
+ while (t != null) {
+ if (t instanceof UnknownHostException) {
+ return true;
+ }
+ Throwable t2 = t.getCause();
+ if (t2 == t) {
+ break;
+ }
+ t = t2;
+ }
+ return false;
+ }
+
+ private void delete(File file) {
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ File[] children = file.listFiles();
+ if (children != null) {
+ for (File child : children) {
+ delete(child);
+ }
+ }
+ }
+ if (!file.delete()) {
+ // fail quietly
+ }
+ }
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (temporaryStorage != null) {
+ delete(temporaryStorage);
+ }
+ }
+
+ public String getDirectoryUrl() {
+ return directoryUrl;
+ }
+
+ public void setDirectoryUrl(String directoryUrl) {
+ this.directoryUrl = directoryUrl;
+ }
+
+ @Override
+ protected AbstractDiscoverySource computeDiscoverySource(IContributor contributor) {
+ Entry directoryEntry = registryStrategy.getDirectoryEntry(contributor);
+ Policy policy = new Policy(directoryEntry.isPermitCategories());
+ JarDiscoverySource discoverySource = new JarDiscoverySource(contributor.getName(),
+ registryStrategy.getJarFile(contributor));
+ discoverySource.setPolicy(policy);
+ return discoverySource;
+ }
+
+ /**
+ * indicate how many times discovyer jar downloads should be attempted
+ */
+ public int getMaxDiscoveryJarDownloadAttempts() {
+ return maxDiscoveryJarDownloadAttempts;
+ }
+
+ /**
+ * indicate how many times discovyer jar downloads should be attempted
+ *
+ * @param maxDiscoveryJarDownloadAttempts
+ * a number >= 1
+ */
+ public void setMaxDiscoveryJarDownloadAttempts(int maxDiscoveryJarDownloadAttempts) {
+ if (maxDiscoveryJarDownloadAttempts < 1 || maxDiscoveryJarDownloadAttempts > 2) {
+ throw new IllegalArgumentException();
+ }
+ this.maxDiscoveryJarDownloadAttempts = maxDiscoveryJarDownloadAttempts;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ValidationException.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ValidationException.java
new file mode 100644
index 0000000..1b59235
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ValidationException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.model;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
+
+/**
+ * Indicate that a validation has occurred on the model.
+ *
+ * @author David Green
+ */
+public class ValidationException extends CoreException {
+
+ private static final long serialVersionUID = -7542361242327905294L;
+
+ public ValidationException(String message) {
+ super(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, message));
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/messages.properties b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/messages.properties
new file mode 100644
index 0000000..6b9fcfa
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/messages.properties
@@ -0,0 +1,41 @@
+BundleDiscoveryStrategy_3={0}: {1}
+BundleDiscoveryStrategy_categoryDisallowed=Cannot create category ''{0}'' with id ''{1}'' from {2}: disallowed
+BundleDiscoveryStrategy_task_loading_local_extensions=Loading local extensions
+BundleDiscoveryStrategy_task_processing_extensions=Processing extensions
+BundleDiscoveryStrategy_unexpected_element=unexpected element ''{0}''
+ConnectorCategory_connectorCategory_relevance_invalid=connectorCategory/@relevance must be an integer >= 0 and <= 100
+ConnectorCategory_must_specify_connectorCategory_id=Must specify connectorCategory/@id
+ConnectorCategory_must_specify_connectorCategory_name=Must specify connectorCategory/@name
+ConnectorDescriptor_invalid_connectorDescriptor_siteUrl=Invalid connectorDescriptor/@siteUrl
+ConnectorDescriptor_must_specify_connectorDescriptor_categoryId=Must specify connectorDescriptor/@categoryId
+ConnectorDescriptor_must_specify_connectorDescriptor_id=Must specify connectorDescriptor/@id
+ConnectorDescriptor_must_specify_connectorDescriptor_kind=Must specify connectorDescriptor/@kind
+ConnectorDescriptor_must_specify_connectorDescriptor_license=Must specify connectorDescriptor/@license
+ConnectorDescriptor_must_specify_connectorDescriptor_name=Must specify connectorDescriptor/@name
+ConnectorDescriptor_must_specify_connectorDescriptor_provider=Must specify connectorDescriptor/@provider
+ConnectorDescriptor_must_specify_connectorDescriptor_siteUrl=Must specify connectorDescriptor/@siteUrl
+ConnectorDiscovery_bundle_references_unknown_category=Unknown category ''{0}'' referenced by connector ''{1}'' declared in {2}
+ConnectorDiscovery_duplicate_category_id=Duplicate category id ''{0}'': declaring sources: {1}, {2}
+ConnectorDiscovery_exception_disposing=exception disposing
+ConnectorDiscovery_illegal_filter_syntax=Illegal filter syntax ''{0}'' in connector ''{1}'' declared in {2}
+ConnectorDiscovery_task_discovering_connectors=Retrieving listing from eclipse.org
+ConnectorDiscovery_task_verifyingAvailability=Verifying connector availability
+ConnectorDiscovery_unexpected_exception=Unexpected exception
+ConnectorDiscoveryExtensionReader_unexpected_element_icon=Unexpected element icon
+ConnectorDiscoveryExtensionReader_unexpected_element_overview=Unexpected element overview
+ConnectorDiscoveryExtensionReader_unexpected_value_kind=Unexpected value for kind
+DirectoryParser_no_directory=Unexpected content: no directory available
+DirectoryParser_unexpected_element=Unexpected element ''{0}''
+DiscoveryRegistryStrategy_cannot_load_bundle=Cannot load bundle {0} from url {1}: {2}
+DiscoveryRegistryStrategy_missing_pluginxml=no plugin.xml in bundle
+FeatureFilter_must_specify_featureFilter_featureId=Must specify featureFilter/@featureId
+FeatureFilter_must_specify_featureFilter_version=Must specify featureFilter/@version
+Group_must_specify_group_id=Must specify group/@id
+RemoteBundleDiscoveryStrategy_cannot_download_bundle=Cannot download bundle at {0}: {1}
+RemoteBundleDiscoveryStrategy_empty_directory=Discovery directory is empty
+RemoteBundleDiscoveryStrategy_io_failure_discovery_directory=IO failure: cannot load discovery directory
+RemoteBundleDiscoveryStrategy_io_failure_temp_storage=IO failure: cannot create temporary storage area
+RemoteBundleDiscoveryStrategy_task_remote_discovery=remote discovery
+RemoteBundleDiscoveryStrategy_unexpectedError=Unexpected error
+RemoteBundleDiscoveryStrategy_unknown_host_discovery_directory=Cannot access {0}: unknown host: please check your Internet connection and try again.
+RemoteBundleDiscoveryStrategy_unrecognized_discovery_url=Unrecognized discovery bundle URL: {0}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DefaultSaxErrorHandler.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DefaultSaxErrorHandler.java
new file mode 100644
index 0000000..b3756d9
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DefaultSaxErrorHandler.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.util;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * A default implementation of an error handler that throws exceptions on all errors.
+ *
+ * @author David Green
+ */
+public class DefaultSaxErrorHandler implements ErrorHandler {
+ public void warning(SAXParseException exception) throws SAXException {
+ // ignore
+ }
+
+ public void fatalError(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+
+ public void error(SAXParseException exception) throws SAXException {
+ throw exception;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DiscoveryCategoryComparator.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DiscoveryCategoryComparator.java
new file mode 100644
index 0000000..26c571c
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DiscoveryCategoryComparator.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.util;
+
+import java.util.Comparator;
+
+import org.eclipse.mylyn.internal.discovery.core.model.DiscoveryCategory;
+
+/**
+ * A comparator that orders categories by relevance and name.
+ *
+ * @author David Green
+ */
+public class DiscoveryCategoryComparator implements Comparator<DiscoveryCategory> {
+
+ public int compare(DiscoveryCategory o1, DiscoveryCategory o2) {
+ if (o1 == o2) {
+ return 0;
+ }
+ String r1 = o1.getRelevance();
+ String r2 = o2.getRelevance();
+ int i;
+ if (r1 != null && r2 != null) {
+ // don't have to worry about format, since they were already validated
+ // note that higher relevance appears first, thus the reverse order of
+ // the comparison.
+ i = new Integer(r2).compareTo(new Integer(r1));
+ } else if (r1 == null) {
+ return 1;
+ } else {
+ return -1;
+ }
+ if (i == 0) {
+ i = o1.getName().compareToIgnoreCase(o2.getName());
+ if (i == 0) {
+ i = o1.getId().compareTo(o2.getId());
+ }
+ }
+ return i;
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DiscoveryConnectorComparator.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DiscoveryConnectorComparator.java
new file mode 100644
index 0000000..65d65d4
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DiscoveryConnectorComparator.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.util;
+
+import java.util.Comparator;
+
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorCategory;
+import org.eclipse.mylyn.internal.discovery.core.model.DiscoveryConnector;
+import org.eclipse.mylyn.internal.discovery.core.model.Group;
+
+/**
+ * a comparator that orders connectors by group and alphabetically by their name
+ *
+ * @author David Green
+ */
+public class DiscoveryConnectorComparator implements Comparator<DiscoveryConnector> {
+
+ private final ConnectorCategory category;
+
+ public DiscoveryConnectorComparator(ConnectorCategory category) {
+ if (category == null) {
+ throw new IllegalArgumentException();
+ }
+ this.category = category;
+ }
+
+ /**
+ * compute the index of the group id
+ *
+ * @param groupId
+ * the group id or null
+ * @return the index, or -1 if not found
+ */
+ private int computeGroupIndex(String groupId) {
+ if (groupId != null) {
+ int index = -1;
+ for (Group group : category.getGroup()) {
+ ++index;
+ if (group.getId().equals(groupId)) {
+ return index;
+ }
+ }
+ }
+ return -1;
+ }
+
+ public int compare(DiscoveryConnector o1, DiscoveryConnector o2) {
+ if (o1.getCategory() != category || o2.getCategory() != category) {
+ throw new IllegalArgumentException();
+ }
+ if (o1 == o2) {
+ return 0;
+ }
+ int g1 = computeGroupIndex(o1.getGroupId());
+ int g2 = computeGroupIndex(o2.getGroupId());
+ int i;
+ if (g1 != g2) {
+ if (g1 == -1) {
+ i = 1;
+ } else if (g2 == -1) {
+ i = -1;
+ } else {
+ i = g1 - g2;
+ }
+ } else {
+ i = o1.getName().compareToIgnoreCase(o2.getName());
+ if (i == 0) {
+ i = o1.getId().compareTo(o2.getId());
+ }
+ }
+ return i;
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/IOWithCauseException.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/IOWithCauseException.java
new file mode 100644
index 0000000..f28aed0
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/IOWithCauseException.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.util;
+
+import java.io.IOException;
+
+/**
+ * An IO Exception that allows for {@link #getCause() a cause}.
+ *
+ * @author David Green
+ */
+public class IOWithCauseException extends IOException {
+
+ private static final long serialVersionUID = 1L;
+
+ private final Throwable cause;
+
+ public IOWithCauseException(String message, Throwable cause) {
+ super(message);
+ this.cause = cause;
+ }
+
+ public IOWithCauseException(Throwable cause) {
+ this.cause = cause;
+ }
+
+ @Override
+ public Throwable getCause() {
+ return cause;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/Messages.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/Messages.java
new file mode 100644
index 0000000..8db2893
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.util;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.discovery.core.util.messages"; //$NON-NLS-1$
+
+ public static String WebUtil_cannotDownload;
+
+ public static String WebUtil_task_retrievingUrl;
+
+ public static String WebUtil_task_verifyingUrl;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/WebUtil.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/WebUtil.java
new file mode 100644
index 0000000..a6fec42
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/WebUtil.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.core.util;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.net.UnknownHostException;
+import java.util.List;
+
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.URIException;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * A utility for accessing web resources
+ *
+ * @author David Green
+ */
+public class WebUtil {
+ /**
+ * implementors are capable of processing character content
+ *
+ * @see WebUtil#readResource(AbstractWebLocation, TextContentProcessor, IProgressMonitor)
+ */
+ public interface TextContentProcessor {
+ public void process(Reader reader) throws IOException;
+ }
+
+ /**
+ * Download an HTTP-based resource
+ *
+ * @param target
+ * the target file to which the content is saved
+ * @param location
+ * the web location of the content
+ * @param monitor
+ * the monitor
+ * @throws IOException
+ * if a network or IO problem occurs
+ */
+ public static void downloadResource(File target, AbstractWebLocation location, IProgressMonitor monitor)
+ throws IOException {
+ monitor = Policy.monitorFor(monitor);
+ monitor.beginTask(NLS.bind(Messages.WebUtil_task_retrievingUrl, location.getUrl()), IProgressMonitor.UNKNOWN);
+ try {
+ HttpClient client = new HttpClient();
+ org.eclipse.mylyn.commons.net.WebUtil.configureHttpClient(client, ""); //$NON-NLS-1$
+
+ GetMethod method = new GetMethod(location.getUrl());
+ try {
+ HostConfiguration hostConfiguration = org.eclipse.mylyn.commons.net.WebUtil.createHostConfiguration(
+ client, location, monitor);
+ int result = org.eclipse.mylyn.commons.net.WebUtil.execute(client, hostConfiguration, method, monitor);
+ if (result == HttpStatus.SC_OK) {
+ InputStream in = org.eclipse.mylyn.commons.net.WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ in = new BufferedInputStream(in);
+ OutputStream out = new BufferedOutputStream(new FileOutputStream(target));
+ try {
+ int i;
+ while ((i = in.read()) != -1) {
+ out.write(i);
+ }
+ } catch (IOException e) {
+ // avoid partial content
+ out.close();
+ target.delete();
+ throw e;
+ } finally {
+ out.close();
+ }
+ } finally {
+ in.close();
+ }
+ } else {
+ throw new IOException(NLS.bind(Messages.WebUtil_cannotDownload, location.getUrl(), result));
+ }
+ } finally {
+ method.releaseConnection();
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * Read a web-based resource at the specified location using the given processor.
+ *
+ * @param location
+ * the web location of the content
+ * @param processor
+ * the processor that will handle content
+ * @param monitor
+ * the monitor
+ * @throws IOException
+ * if a network or IO problem occurs
+ */
+ public static void readResource(AbstractWebLocation location, TextContentProcessor processor,
+ IProgressMonitor monitor) throws IOException {
+ monitor = Policy.monitorFor(monitor);
+ monitor.beginTask(NLS.bind(Messages.WebUtil_task_retrievingUrl, location.getUrl()), IProgressMonitor.UNKNOWN);
+ try {
+ HttpClient client = new HttpClient();
+ org.eclipse.mylyn.commons.net.WebUtil.configureHttpClient(client, ""); //$NON-NLS-1$
+
+ GetMethod method = new GetMethod(location.getUrl());
+ try {
+ HostConfiguration hostConfiguration = org.eclipse.mylyn.commons.net.WebUtil.createHostConfiguration(
+ client, location, monitor);
+ int result = org.eclipse.mylyn.commons.net.WebUtil.execute(client, hostConfiguration, method, monitor);
+ if (result == HttpStatus.SC_OK) {
+ InputStream in = org.eclipse.mylyn.commons.net.WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in,
+ method.getResponseCharSet()));
+ processor.process(reader);
+ } finally {
+ in.close();
+ }
+ } else {
+ throw new IOException(NLS.bind(Messages.WebUtil_cannotDownload, location.getUrl(), result));
+ }
+ } finally {
+ method.releaseConnection();
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * Verify availability of resources at the given web locations. Normally this would be done using an HTTP HEAD.
+ *
+ * @param locations
+ * the locations of the resource to verify
+ * @param one
+ * indicate if only one of the resources must exist
+ * @param monitor
+ * the monitor
+ * @return true if the resource exists
+ */
+ public static boolean verifyAvailability(List<? extends AbstractWebLocation> locations, boolean one,
+ IProgressMonitor monitor) {
+ if (locations.isEmpty() || locations.size() > 5) {
+ throw new IllegalArgumentException();
+ }
+ monitor = Policy.monitorFor(monitor);
+ monitor.beginTask(NLS.bind(Messages.WebUtil_task_verifyingUrl, locations.get(0).getUrl()),
+ IProgressMonitor.UNKNOWN);
+ try {
+ HttpClient client = new HttpClient();
+ org.eclipse.mylyn.commons.net.WebUtil.configureHttpClient(client, ""); //$NON-NLS-1$
+
+ HeadMethod method = new HeadMethod();
+ try {
+ int countFound = 0;
+ for (AbstractWebLocation location : locations) {
+ try {
+ method.setURI(new URI(location.getUrl(), true));
+ } catch (URIException e) {
+ if (!one) {
+ break;
+ }
+ }
+ HostConfiguration hostConfiguration = org.eclipse.mylyn.commons.net.WebUtil.createHostConfiguration(
+ client, location, monitor);
+ int result;
+ try {
+ result = org.eclipse.mylyn.commons.net.WebUtil.execute(client, hostConfiguration, method,
+ monitor);
+ } catch (IOException e) {
+ if (!one || e instanceof UnknownHostException) {
+ return false;
+ }
+ continue;
+ }
+ if (result == HttpStatus.SC_OK) {
+ ++countFound;
+ if (one) {
+ return true;
+ }
+ } else {
+ if (!one) {
+ return false;
+ }
+ }
+ }
+ return countFound == locations.size();
+ } finally {
+ method.releaseConnection();
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/messages.properties b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/messages.properties
new file mode 100644
index 0000000..07bfeec
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/messages.properties
@@ -0,0 +1,3 @@
+WebUtil_cannotDownload=Cannot download {0}: HTTP response {1}
+WebUtil_task_retrievingUrl=Retrieving {0}
+WebUtil_task_verifyingUrl=Verifying {0}
diff --git a/org.eclipse.mylyn.discovery.core/xsd/directory.xsd b/org.eclipse.mylyn.discovery.core/xsd/directory.xsd
new file mode 100644
index 0000000..8ffd96c
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/xsd/directory.xsd
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns:tns="http://www.eclipse.org/mylyn/discovery/directory/"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.eclipse.org/mylyn/discovery/directory/">
+
+ <annotation>
+ <documentation>
+ Describes the XML format used by a Mylyn discovery directory.
+ </documentation>
+ </annotation>
+
+ <complexType name="OpenAttrsComplex">
+ <annotation>
+ <documentation>extend this type to allow for attributes from other namespaces</documentation>
+ </annotation>
+ <complexContent>
+ <restriction base="anyType">
+ <anyAttribute namespace="##other" processContents="lax"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+
+
+ <element name="directory">
+ <complexType>
+ <complexContent>
+ <extension base="tns:OpenAttrsComplex">
+ <sequence>
+ <element ref="tns:entry" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+
+ <element name="entry">
+ <complexType>
+ <complexContent>
+ <extension base="tns:OpenAttrsComplex">
+ <attribute name="url" type="anyURI"/>
+ <attribute name="permitCategories" type="boolean"/>
+ </extension>
+ </complexContent>
+ </complexType>
+ </element>
+</schema>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.discovery.ui/.classpath b/org.eclipse.mylyn.discovery.ui/.classpath
new file mode 100644
index 0000000..b6288ed
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/internal/provisional/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.discovery.ui/.cvsignore b/org.eclipse.mylyn.discovery.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.discovery.ui/.project b/org.eclipse.mylyn.discovery.ui/.project
new file mode 100644
index 0000000..78c1ff5
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.discovery.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..654a737
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,339 @@
+#Tue May 12 21:05:03 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..5937a85
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Tue May 20 17:39:22 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=2
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.discovery.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.discovery.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9e9b848
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.discovery.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.core.expressions,
+ org.eclipse.mylyn.discovery.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.equinox.p2.core;bundle-version="1.0.4";resolution:=optional,
+ org.eclipse.equinox.p2.ui;bundle-version="1.0.4";resolution:=optional,
+ org.eclipse.equinox.p2.metadata;bundle-version="1.0.0";resolution:=optional,
+ org.eclipse.equinox.p2.metadata.repository;bundle-version="1.0.0";resolution:=optional,
+ org.eclipse.equinox.p2.repository;bundle-version="1.0.0";resolution:=optional,
+ org.eclipse.equinox.p2.engine;bundle-version="1.0.100";resolution:=optional,
+ org.eclipse.equinox.p2.director;bundle-version="1.0.100";resolution:=optional
+Export-Package: org.eclipse.mylyn.internal.discovery.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.discovery.ui.commands;x-internal:=true,
+ org.eclipse.mylyn.internal.discovery.ui.util;x-internal:=true,
+ org.eclipse.mylyn.internal.discovery.ui.wizards;x-internal:=true
+Import-Package: com.ibm.icu.text
diff --git a/org.eclipse.mylyn.discovery.ui/OSGI-INF/l10n/bundle.properties b/org.eclipse.mylyn.discovery.ui/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 0000000..cbeb3bc
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,5 @@
+#Properties file for org.eclipse.mylyn.discovery.ui
+command.description = shows the connector discovery wizard
+command.name = Discovery Wizard
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Connector Discovery UI
\ No newline at end of file
diff --git a/org.eclipse.mylyn.discovery.ui/about.html b/org.eclipse.mylyn.discovery.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.discovery.ui/build.properties b/org.eclipse.mylyn.discovery.ui/build.properties
new file mode 100644
index 0000000..ba87c3f
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2009 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ icons/,\
+ OSGI-INF/l10n/
+src.includes = about.html
diff --git a/org.eclipse.mylyn.discovery.ui/icons/obj16/message_info.gif b/org.eclipse.mylyn.discovery.ui/icons/obj16/message_info.gif
new file mode 100644
index 0000000..b484d9b
Binary files /dev/null and b/org.eclipse.mylyn.discovery.ui/icons/obj16/message_info.gif differ
diff --git a/org.eclipse.mylyn.discovery.ui/icons/ovr32/message_warning.gif b/org.eclipse.mylyn.discovery.ui/icons/ovr32/message_warning.gif
new file mode 100644
index 0000000..8e054d0
Binary files /dev/null and b/org.eclipse.mylyn.discovery.ui/icons/ovr32/message_warning.gif differ
diff --git a/org.eclipse.mylyn.discovery.ui/plugin.xml b/org.eclipse.mylyn.discovery.ui/plugin.xml
new file mode 100644
index 0000000..218e1f0
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/plugin.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ description="%command.description"
+ id="org.eclipse.mylyn.discovery.ui.discoveryWizardCommand"
+ name="%command.name">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.mylyn.internal.discovery.ui.commands.ShowConnectorDiscoveryWizardCommandHandler"
+ commandId="org.eclipse.mylyn.discovery.ui.discoveryWizardCommand">
+ <enabledWhen>
+ <test
+ property="org.eclipse.core.runtime.isBundleInstalled" args="org.eclipse.equinox.p2.repository"/>
+ </enabledWhen>
+ </handler>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/DiscoveryImages.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/DiscoveryImages.java
new file mode 100644
index 0000000..e26f28e
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/DiscoveryImages.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @author David Green
+ */
+public class DiscoveryImages {
+ private static final String T_OVR_32 = "ovr32"; //$NON-NLS-1$
+
+ private static final String T_OBJ_16 = "obj16"; //$NON-NLS-1$
+
+ private static final URL baseURL = Platform.getBundle(DiscoveryUi.ID_PLUGIN).getEntry("/icons/"); //$NON-NLS-1$
+
+ /**
+ * image descriptor for a warning overlay suitable for use with 32x32 images.
+ */
+ public static final ImageDescriptor OVERLAY_WARNING_32 = create(T_OVR_32, "message_warning.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor MESSAGE_INFO = create(T_OBJ_16, "message_info.gif"); //$NON-NLS-1$
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuilder buffer = new StringBuilder(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/DiscoveryUi.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/DiscoveryUi.java
new file mode 100644
index 0000000..d923293
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/DiscoveryUi.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui;
+
+/**
+ * @author David Green
+ */
+public abstract class DiscoveryUi {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.discovery.ui"; //$NON-NLS-1$
+
+ private DiscoveryUi() {
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/commands/ShowConnectorDiscoveryWizardCommandHandler.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/commands/ShowConnectorDiscoveryWizardCommandHandler.java
new file mode 100644
index 0000000..819d732
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/commands/ShowConnectorDiscoveryWizardCommandHandler.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.discovery.ui.util.DiscoveryUiUtil;
+import org.eclipse.mylyn.internal.discovery.ui.wizards.ConnectorDiscoveryWizard;
+
+/**
+ * A command that causes the {@link ConnectorDiscoveryWizard} to appear in a dialog.
+ *
+ * @author David Green
+ */
+public class ShowConnectorDiscoveryWizardCommandHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ ConnectorDiscoveryWizard wizard = new ConnectorDiscoveryWizard();
+ WizardDialog dialog = new WizardDialog(DiscoveryUiUtil.getShell(), wizard);
+ dialog.open();
+
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/DiscoveryUiUtil.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/DiscoveryUiUtil.java
new file mode 100644
index 0000000..0c9618c
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/DiscoveryUiUtil.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.util;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author David Green
+ * @author Steffen Pingel much of this is copied from TasksUiInternal
+ */
+public abstract class DiscoveryUiUtil {
+ private DiscoveryUiUtil() {
+ }
+
+ public static void logAndDisplayStatus(final String title, final IStatus status) {
+ logAndDisplayStatus(null, title, status);
+ }
+
+ public static void logAndDisplayStatus(Shell shell, final String title, final IStatus status) {
+ StatusHandler.log(status);
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null && !workbench.getDisplay().isDisposed()) {
+ if (shell == null) {
+ shell = getShell();
+ }
+ displayStatus(shell, title, status, true);
+ }
+ }
+
+ public static void displayStatus(final String title, final IStatus status) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null && !workbench.getDisplay().isDisposed()) {
+ displayStatus(getShell(), title, status, false);
+ } else {
+ StatusHandler.log(status);
+ }
+ }
+
+ /**
+ * Utility method to get the best parenting possible for a dialog. If there is a modal shell create it so as to
+ * avoid two modal dialogs. If not then return the shell of the active workbench window. If neither can be found
+ * return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @return Shell or <code>null</code>
+ */
+ public static Shell getShell() {
+ if (!PlatformUI.isWorkbenchRunning() || PlatformUI.getWorkbench().isClosing()) {
+ return null;
+ }
+ Shell modal = getModalShellExcluding(null);
+ if (modal != null) {
+ return modal;
+ }
+ return getNonModalShell();
+ }
+
+ /**
+ * Get the active non modal shell. If there isn't one return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @return Shell
+ */
+ public static Shell getNonModalShell() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ if (windows.length > 0) {
+ return windows[0].getShell();
+ }
+ } else {
+ return window.getShell();
+ }
+
+ return null;
+ }
+
+ /**
+ * Return the modal shell that is currently open. If there isn't one then return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @param shell
+ * A shell to exclude from the search. May be <code>null</code>.
+ * @return Shell or <code>null</code>.
+ */
+ public static Shell getModalShellExcluding(Shell shell) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ Shell[] shells = workbench.getDisplay().getShells();
+ int modal = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL;
+ for (Shell shell2 : shells) {
+ if (shell2.equals(shell)) {
+ break;
+ }
+ // Do not worry about shells that will not block the user.
+ if (shell2.isVisible()) {
+ int style = shell2.getStyle();
+ if ((style & modal) != 0) {
+ return shell2;
+ }
+ }
+ }
+ return null;
+ }
+
+ public static void displayStatus(Shell shell, final String title, final IStatus status, boolean showLinkToErrorLog) {
+ // avoid blocking ui when in test mode
+ if (CoreUtil.TEST_MODE) {
+ StatusHandler.log(status);
+ return;
+ }
+
+ String message = status.getMessage();
+ if (showLinkToErrorLog) {
+ message += Messages.DiscoveryUi_seeErrorLog;
+ }
+ switch (status.getSeverity()) {
+ case IStatus.CANCEL:
+ case IStatus.INFO:
+ createDialog(shell, title, message, MessageDialog.INFORMATION).open();
+ break;
+ case IStatus.WARNING:
+ createDialog(shell, title, message, MessageDialog.WARNING).open();
+ break;
+ case IStatus.ERROR:
+ default:
+ createDialog(shell, title, message, MessageDialog.ERROR).open();
+ break;
+ }
+
+ }
+
+ public static MessageDialog createDialog(Shell shell, String title, String message, int type) {
+ return new MessageDialog(shell, title, null, message, type, new String[] { IDialogConstants.OK_LABEL }, 0);
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/Messages.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/Messages.java
new file mode 100644
index 0000000..256ac0b
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.util;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.discovery.ui.util.messages"; //$NON-NLS-1$
+
+ public static String DiscoveryUi_seeErrorLog;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/messages.properties b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/messages.properties
new file mode 100644
index 0000000..32101cf
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/util/messages.properties
@@ -0,0 +1 @@
+DiscoveryUi_seeErrorLog=\n\nSee error log for details.
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/ConnectorDiscoveryWizard.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/ConnectorDiscoveryWizard.java
new file mode 100644
index 0000000..925ccd7
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/ConnectorDiscoveryWizard.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.equinox.internal.provisional.p2.ui.IProvHelpContextIds;
+import org.eclipse.equinox.internal.provisional.p2.ui.QueryableMetadataRepositoryManager;
+import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.PreselectedIUInstallWizard;
+import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.ProvisioningWizardDialog;
+import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policy;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorDescriptorKind;
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorDiscovery;
+import org.eclipse.mylyn.internal.discovery.ui.DiscoveryUi;
+import org.eclipse.mylyn.internal.discovery.ui.util.DiscoveryUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+/**
+ * A wizard for performing discovery of connectors and selecting connectors to install. When finish is pressed, selected
+ * connectors are downloaded and installed.
+ *
+ * @see PrepareInstallProfileJob
+ * @see ConnectorDiscoveryWizardMainPage
+ * @author David Green
+ */
+ at SuppressWarnings("restriction")
+public class ConnectorDiscoveryWizard extends Wizard {
+
+ private ConnectorDiscoveryWizardMainPage mainPage;
+
+ private final Map<ConnectorDescriptorKind, Boolean> connectorDescriptorKindToVisibility = new HashMap<ConnectorDescriptorKind, Boolean>();
+ {
+ for (ConnectorDescriptorKind kind : ConnectorDescriptorKind.values()) {
+ connectorDescriptorKindToVisibility.put(kind, true);
+ }
+ }
+
+ private boolean showConnectorDescriptorKindFilter = true;
+
+ private boolean showConnectorDescriptorTextFilter = true;
+
+ private Dictionary<Object, Object> environment;
+
+ public ConnectorDiscoveryWizard() {
+ setWindowTitle(Messages.ConnectorDiscoveryWizard_connectorDiscovery);
+ setNeedsProgressMonitor(true);
+ setDefaultPageImageDescriptor(CommonImages.BANNER_DISOVERY);
+ createEnvironment();
+ }
+
+ private void createEnvironment() {
+ environment = new Hashtable<Object, Object>(System.getProperties());
+ // add the installed Mylyn version to the environment so that we can have
+ // connectors that are filtered based on version of Mylyn
+ Bundle bundle = Platform.getBundle("org.eclipse.mylyn.tasks.core"); //$NON-NLS-1$
+ Version version = bundle.getVersion();
+ environment.put("org.eclipse.mylyn.version", version.toString()); //$NON-NLS-1$
+ environment.put("org.eclipse.mylyn.version.major", version.getMajor()); //$NON-NLS-1$
+ environment.put("org.eclipse.mylyn.version.minor", version.getMinor()); //$NON-NLS-1$
+ environment.put("org.eclipse.mylyn.version.micro", version.getMicro()); //$NON-NLS-1$
+ }
+
+ @Override
+ public void addPages() {
+ addPage(mainPage = new ConnectorDiscoveryWizardMainPage());
+ }
+
+ @Override
+ public boolean performFinish() {
+ try {
+ final PrepareInstallProfileJob job = new PrepareInstallProfileJob(mainPage.getInstallableConnectors());
+ getContainer().run(true, true, job);
+
+ if (job.getPlannerResolutionOperation() != null
+ && job.getPlannerResolutionOperation().getProvisioningPlan() != null) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ PreselectedIUInstallWizard wizard = new PreselectedIUInstallWizard(Policy.getDefault(),
+ job.getProfileId(), job.getIUs(), job.getPlannerResolutionOperation(),
+ new QueryableMetadataRepositoryManager(Policy.getDefault().getQueryContext(), false));
+ WizardDialog dialog = new ProvisioningWizardDialog(getShell(), wizard);
+ dialog.create();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
+ IProvHelpContextIds.INSTALL_WIZARD);
+
+ dialog.open();
+ }
+ });
+ }
+ } catch (InvocationTargetException e) {
+ IStatus status = new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN, NLS.bind(
+ Messages.ConnectorDiscoveryWizard_installProblems, new Object[] { e.getCause().getMessage() }),
+ e.getCause());
+ DiscoveryUiUtil.logAndDisplayStatus(Messages.ConnectorDiscoveryWizard_cannotInstall, status);
+ return false;
+ } catch (InterruptedException e) {
+ // canceled
+ }
+ return true;
+ }
+
+ /**
+ * configure the page to show or hide connector descriptors of the given kind
+ *
+ * @see #connectorDescriptorKindVisibilityUpdated()
+ */
+ public void setVisibility(ConnectorDescriptorKind kind, boolean visible) {
+ if (kind == null) {
+ throw new IllegalArgumentException();
+ }
+ connectorDescriptorKindToVisibility.put(kind, visible);
+ }
+
+ /**
+ * indicate if the given kind of connector is currently visible in the wizard
+ *
+ * @see #setVisibility(ConnectorDescriptorKind, boolean)
+ */
+ public boolean isVisible(ConnectorDescriptorKind kind) {
+ if (kind == null) {
+ throw new IllegalArgumentException();
+ }
+ return connectorDescriptorKindToVisibility.get(kind);
+ }
+
+ /**
+ * indicate if the connector descriptor filters should be shown in the UI. Changing this setting only has an effect
+ * before the UI is presented.
+ */
+ public boolean isShowConnectorDescriptorKindFilter() {
+ return showConnectorDescriptorKindFilter;
+ }
+
+ /**
+ * indicate if the connector descriptor filters should be shown in the UI. Changing this setting only has an effect
+ * before the UI is presented.
+ */
+ public void setShowConnectorDescriptorKindFilter(boolean showConnectorDescriptorKindFilter) {
+ this.showConnectorDescriptorKindFilter = showConnectorDescriptorKindFilter;
+ }
+
+ /**
+ * indicate if a text field should be provided to allow the user to filter connector descriptors
+ */
+ public boolean isShowConnectorDescriptorTextFilter() {
+ return showConnectorDescriptorTextFilter;
+ }
+
+ /**
+ * indicate if a text field should be provided to allow the user to filter connector descriptors
+ */
+ public void setShowConnectorDescriptorTextFilter(boolean showConnectorDescriptorTextFilter) {
+ this.showConnectorDescriptorTextFilter = showConnectorDescriptorTextFilter;
+ }
+
+ /**
+ * the environment in which discovery should be performed.
+ *
+ * @see ConnectorDiscovery#getEnvironment()
+ */
+ public Dictionary<Object, Object> getEnvironment() {
+ return environment;
+ }
+
+ /**
+ * the environment in which discovery should be performed.
+ *
+ * @see ConnectorDiscovery#getEnvironment()
+ */
+ public void setEnvironment(Dictionary<Object, Object> environment) {
+ if (environment == null) {
+ throw new IllegalArgumentException();
+ }
+ this.environment = environment;
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/ConnectorDiscoveryWizardMainPage.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/ConnectorDiscoveryWizardMainPage.java
new file mode 100644
index 0000000..5b4d639
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/ConnectorDiscoveryWizardMainPage.java
@@ -0,0 +1,1251 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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
+ * David Green
+ * Shawn Minto bug 275513
+ * Steffen Pingel bug 276012 code review, bug 277191 gradient canvas
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.discovery.ui.wizards;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IBundleGroup;
+import org.eclipse.core.runtime.IBundleGroupProvider;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.discovery.core.model.AbstractDiscoverySource;
+import org.eclipse.mylyn.internal.discovery.core.model.BundleDiscoveryStrategy;
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorDescriptor;
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorDescriptorKind;
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorDiscovery;
+import org.eclipse.mylyn.internal.discovery.core.model.DiscoveryCategory;
+import org.eclipse.mylyn.internal.discovery.core.model.DiscoveryConnector;
+import org.eclipse.mylyn.internal.discovery.core.model.Icon;
+import org.eclipse.mylyn.internal.discovery.core.model.Overview;
+import org.eclipse.mylyn.internal.discovery.core.model.RemoteBundleDiscoveryStrategy;
+import org.eclipse.mylyn.internal.discovery.core.util.DiscoveryCategoryComparator;
+import org.eclipse.mylyn.internal.discovery.core.util.DiscoveryConnectorComparator;
+import org.eclipse.mylyn.internal.discovery.ui.DiscoveryImages;
+import org.eclipse.mylyn.internal.discovery.ui.DiscoveryUi;
+import org.eclipse.mylyn.internal.discovery.ui.util.DiscoveryUiUtil;
+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.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Resource;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.progress.WorkbenchJob;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * The main wizard page that allows users to select connectors that they wish to install.
+ *
+ * @author David Green
+ */
+public class ConnectorDiscoveryWizardMainPage extends WizardPage {
+
+ private static final String DEFAULT_DIRECTORY_URL = "http://www.eclipse.org/mylyn/discovery/directory.xml"; //$NON-NLS-1$
+
+ private static final String SYSTEM_PROPERTY_DIRECTORY_URL = "mylyn.discovery.directory"; //$NON-NLS-1$
+
+ private static final String COLOR_WHITE = "white"; //$NON-NLS-1$
+
+ private static final String COLOR_DARK_GRAY = "DarkGray"; //$NON-NLS-1$
+
+ private static Boolean useNativeSearchField;
+
+ private final List<ConnectorDescriptor> installableConnectors = new ArrayList<ConnectorDescriptor>();
+
+ private ConnectorDiscovery discovery;
+
+ private Composite body;
+
+ private final List<Resource> disposables = new ArrayList<Resource>();
+
+ private Font h2Font;
+
+ private Font h1Font;
+
+ private Color colorWhite;
+
+ private Text filterText;
+
+ private WorkbenchJob refreshJob;
+
+ private String previousFilterText = ""; //$NON-NLS-1$
+
+ private Pattern filterPattern;
+
+ private Label clearFilterTextControl;
+
+ private Set<String> installedFeatures;
+
+ private Image infoImage;
+
+ private Cursor handCursor;
+
+ private Color colorCategoryGradientStart;
+
+ private Color colorCategoryGradientEnd;
+
+ private Color colorDisabled;
+
+ private ScrolledComposite bodyScrolledComposite;
+
+ public ConnectorDiscoveryWizardMainPage() {
+ super(ConnectorDiscoveryWizardMainPage.class.getSimpleName());
+ setTitle(org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_connectorDiscovery);
+ // setImageDescriptor(image);
+ setDescription(org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_pageDescription);
+ setPageComplete(false);
+ }
+
+ public void createControl(Composite parent) {
+ createRefreshJob();
+
+ Composite container = new Composite(parent, SWT.NULL);
+ container.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ refreshJob.cancel();
+ }
+ });
+ container.setLayout(new GridLayout(1, false));
+ //
+ { // header
+ Composite header = new Composite(container, SWT.NULL);
+ GridLayoutFactory.fillDefaults().applyTo(header);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(header);
+
+// TODO: refresh button?
+ if (getWizard().isShowConnectorDescriptorKindFilter() || getWizard().isShowConnectorDescriptorTextFilter()) {
+ Composite filterContainer = new Composite(header, SWT.NULL);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(filterContainer);
+
+ int numColumns = 1; // 1 for label
+ if (getWizard().isShowConnectorDescriptorKindFilter()) {
+ numColumns += ConnectorDescriptorKind.values().length;
+ }
+ if (getWizard().isShowConnectorDescriptorTextFilter()) {
+ ++numColumns;
+ }
+ GridLayoutFactory.fillDefaults().numColumns(numColumns).applyTo(filterContainer);
+ Label label = new Label(filterContainer, SWT.NULL);
+ label.setText(org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_filterLabel);
+
+ if (getWizard().isShowConnectorDescriptorTextFilter()) {
+ Composite textFilterContainer;
+ boolean nativeSearch = useNativeSearchField(header);
+ if (nativeSearch) {
+ textFilterContainer = new Composite(filterContainer, SWT.NULL);
+ } else {
+ textFilterContainer = new Composite(filterContainer, SWT.BORDER);
+ textFilterContainer.setBackground(header.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+ }
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(textFilterContainer);
+ GridLayoutFactory.fillDefaults().numColumns(2).applyTo(textFilterContainer);
+
+ if (nativeSearch) {
+ filterText = new Text(textFilterContainer, SWT.SINGLE | SWT.BORDER | SWT.SEARCH
+ | SWT.ICON_CANCEL);
+ } else {
+ filterText = new Text(textFilterContainer, SWT.SINGLE);
+ }
+
+ filterText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ filterTextChanged();
+ }
+ });
+ if (nativeSearch) {
+ filterText.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ if (e.detail == SWT.ICON_CANCEL) {
+ clearFilterText();
+ }
+ }
+ });
+ GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(filterText);
+ } else {
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(filterText);
+ clearFilterTextControl = createClearFilterTextControl(textFilterContainer, filterText);
+ clearFilterTextControl.setVisible(false);
+ }
+ }
+
+ if (getWizard().isShowConnectorDescriptorKindFilter()) { // filter buttons
+
+ for (final ConnectorDescriptorKind kind : ConnectorDescriptorKind.values()) {
+ final Button checkbox = new Button(filterContainer, SWT.CHECK);
+ checkbox.setSelection(getWizard().isVisible(kind));
+ checkbox.setText(getFilterLabel(kind));
+ checkbox.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ boolean selection = checkbox.getSelection();
+ getWizard().setVisibility(kind, selection);
+ connectorDescriptorKindVisibilityUpdated();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+ }
+ }
+
+ }
+
+ }
+ { // container
+ body = new Composite(container, SWT.NULL);
+ GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 480).applyTo(body);
+ }
+ Dialog.applyDialogFont(container);
+ setControl(container);
+ }
+
+ private static boolean useNativeSearchField(Composite composite) {
+ if (useNativeSearchField == null) {
+ useNativeSearchField = Boolean.FALSE;
+ Text testText = null;
+ try {
+ testText = new Text(composite, SWT.SEARCH | SWT.ICON_CANCEL);
+ useNativeSearchField = new Boolean((testText.getStyle() & SWT.ICON_CANCEL) != 0);
+ } finally {
+ if (testText != null) {
+ testText.dispose();
+ }
+ }
+
+ }
+ return useNativeSearchField;
+ }
+
+ private void createRefreshJob() {
+ refreshJob = new WorkbenchJob("filter") { //$NON-NLS-1$
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (filterText.isDisposed()) {
+ return Status.CANCEL_STATUS;
+ }
+ String text = filterText.getText();
+ text = text.trim();
+
+ if (!previousFilterText.equals(text)) {
+ previousFilterText = text;
+ filterPattern = createPattern(previousFilterText);
+ if (clearFilterTextControl != null) {
+ clearFilterTextControl.setVisible(filterPattern != null);
+ }
+ createBodyContents();
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ refreshJob.setSystem(true);
+ }
+
+ protected Pattern createPattern(String filterText) {
+ if (filterText == null || filterText.length() == 0) {
+ return null;
+ }
+ String regex = filterText;
+ regex.replace("\\", "\\\\").replace("?", ".").replace("*", ".*?"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ return Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
+ }
+
+ private Label createClearFilterTextControl(Composite filterContainer, final Text filterText) {
+ final Image inactiveImage = CommonImages.FIND_CLEAR_DISABLED.createImage();
+ final Image activeImage = CommonImages.FIND_CLEAR.createImage();
+ final Image pressedImage = new Image(filterContainer.getDisplay(), activeImage, SWT.IMAGE_GRAY);
+
+ final Label clearButton = new Label(filterContainer, SWT.NONE);
+ clearButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+ clearButton.setImage(inactiveImage);
+ clearButton.setToolTipText(Messages.ConnectorDiscoveryWizardMainPage_clearButton_toolTip);
+ clearButton.setBackground(filterContainer.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+ clearButton.addMouseListener(new MouseAdapter() {
+ private MouseMoveListener fMoveListener;
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ clearButton.setImage(pressedImage);
+ fMoveListener = new MouseMoveListener() {
+ private boolean fMouseInButton = true;
+
+ public void mouseMove(MouseEvent e) {
+ boolean mouseInButton = isMouseInButton(e);
+ if (mouseInButton != fMouseInButton) {
+ fMouseInButton = mouseInButton;
+ clearButton.setImage(mouseInButton ? pressedImage : inactiveImage);
+ }
+ }
+ };
+ clearButton.addMouseMoveListener(fMoveListener);
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ if (fMoveListener != null) {
+ clearButton.removeMouseMoveListener(fMoveListener);
+ fMoveListener = null;
+ boolean mouseInButton = isMouseInButton(e);
+ clearButton.setImage(mouseInButton ? activeImage : inactiveImage);
+ if (mouseInButton) {
+ clearFilterText();
+ filterText.setFocus();
+ }
+ }
+ }
+
+ private boolean isMouseInButton(MouseEvent e) {
+ Point buttonSize = clearButton.getSize();
+ return 0 <= e.x && e.x < buttonSize.x && 0 <= e.y && e.y < buttonSize.y;
+ }
+ });
+ clearButton.addMouseTrackListener(new MouseTrackListener() {
+ public void mouseEnter(MouseEvent e) {
+ clearButton.setImage(activeImage);
+ }
+
+ public void mouseExit(MouseEvent e) {
+ clearButton.setImage(inactiveImage);
+ }
+
+ public void mouseHover(MouseEvent e) {
+ }
+ });
+ clearButton.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ inactiveImage.dispose();
+ activeImage.dispose();
+ pressedImage.dispose();
+ }
+ });
+ clearButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+ @Override
+ public void getName(AccessibleEvent e) {
+ e.result = Messages.ConnectorDiscoveryWizardMainPage_clearButton_accessibleListener;
+ }
+ });
+ clearButton.getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
+ @Override
+ public void getRole(AccessibleControlEvent e) {
+ e.detail = ACC.ROLE_PUSHBUTTON;
+ }
+ });
+ return clearButton;
+ }
+
+ @Override
+ public ConnectorDiscoveryWizard getWizard() {
+ return (ConnectorDiscoveryWizard) super.getWizard();
+ }
+
+ private void clearFilterText() {
+ filterText.setText(""); //$NON-NLS-1$
+ filterTextChanged();
+ }
+
+ private void filterTextChanged() {
+ refreshJob.cancel();
+ refreshJob.schedule(200L);
+ }
+
+ private String getFilterLabel(ConnectorDescriptorKind kind) {
+ switch (kind) {
+ case DOCUMENT:
+ return org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_filter_documents;
+ case TASK:
+ return org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_filter_tasks;
+ case VCS:
+ return org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_filter_vcs;
+ default:
+ throw new IllegalStateException(kind.name());
+ }
+ }
+
+ /**
+ * cause the UI to respond to a change in visibility filters
+ *
+ * @see #setVisibility(ConnectorDescriptorKind, boolean)
+ */
+ public void connectorDescriptorKindVisibilityUpdated() {
+ createBodyContents();
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ for (Resource resource : disposables) {
+ resource.dispose();
+ }
+ clearDisposables();
+ if (discovery != null) {
+ discovery.dispose();
+ }
+ }
+
+ private void clearDisposables() {
+ disposables.clear();
+ h1Font = null;
+ h2Font = null;
+ infoImage = null;
+ handCursor = null;
+ colorCategoryGradientStart = null;
+ colorCategoryGradientEnd = null;
+ }
+
+ public void createBodyContents() {
+ // remove any existing contents
+ for (Control child : body.getChildren()) {
+ child.dispose();
+ }
+ clearDisposables();
+ initializeCursors();
+ initializeImages();
+ initializeFonts();
+ initializeColors();
+
+ GridLayoutFactory.fillDefaults().applyTo(body);
+
+ bodyScrolledComposite = new ScrolledComposite(body, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+
+ configureLook(bodyScrolledComposite, colorWhite);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(bodyScrolledComposite);
+
+ // FIXME 3.2 does white work for any desktop theme, e.g. an inverse theme?
+ final Composite scrolledContents = new Composite(bodyScrolledComposite, SWT.NONE);
+ configureLook(scrolledContents, colorWhite);
+ scrolledContents.setRedraw(false);
+ try {
+ createDiscoveryContents(scrolledContents);
+ } finally {
+ scrolledContents.layout(true);
+ scrolledContents.setRedraw(true);
+ }
+ Point size = scrolledContents.computeSize(body.getSize().x, SWT.DEFAULT, true);
+ scrolledContents.setSize(size);
+
+ bodyScrolledComposite.setExpandHorizontal(true);
+ bodyScrolledComposite.setMinWidth(100);
+ bodyScrolledComposite.setExpandVertical(true);
+ bodyScrolledComposite.setMinHeight(1);
+
+ bodyScrolledComposite.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ // XXX small offset in case list has a scroll bar
+ Point size = scrolledContents.computeSize(body.getSize().x - 20, SWT.DEFAULT, true);
+ scrolledContents.setSize(size);
+ bodyScrolledComposite.setMinHeight(size.y);
+ }
+ });
+
+ bodyScrolledComposite.setContent(scrolledContents);
+
+ Dialog.applyDialogFont(body);
+ // we've changed it so it needs to know
+ body.layout(true);
+ }
+
+ private void initializeCursors() {
+ if (handCursor == null) {
+ handCursor = new Cursor(getShell().getDisplay(), SWT.CURSOR_HAND);
+ disposables.add(handCursor);
+ }
+ }
+
+ private void initializeImages() {
+ if (infoImage == null) {
+ infoImage = DiscoveryImages.MESSAGE_INFO.createImage();
+ disposables.add(infoImage);
+ }
+ }
+
+ private void initializeColors() {
+ IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+ if (colorWhite == null) {
+ ColorRegistry colorRegistry = JFaceResources.getColorRegistry();
+ if (!colorRegistry.hasValueFor(COLOR_WHITE)) {
+ colorRegistry.put(COLOR_WHITE, new RGB(255, 255, 255));
+ }
+ colorWhite = colorRegistry.get(COLOR_WHITE);
+ }
+ if (colorDisabled == null) {
+ ColorRegistry colorRegistry = JFaceResources.getColorRegistry();
+ if (!colorRegistry.hasValueFor(COLOR_DARK_GRAY)) {
+ colorRegistry.put(COLOR_DARK_GRAY, new RGB(0x69, 0x69, 0x69));
+ }
+ colorDisabled = colorRegistry.get(COLOR_DARK_GRAY);
+ }
+ if (colorCategoryGradientStart == null) {
+ colorCategoryGradientStart = themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_CATEGORY_GRADIENT_START);
+ colorCategoryGradientEnd = themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_CATEGORY_GRADIENT_END);
+ }
+ }
+
+ private void initializeFonts() {
+ // create a level-2 heading font
+ if (h2Font == null) {
+ Font baseFont = JFaceResources.getDialogFont();
+ FontData[] fontData = baseFont.getFontData();
+ for (FontData data : fontData) {
+ data.setStyle(data.getStyle() | SWT.BOLD);
+ data.height = data.height * 1.25f;
+ }
+ h2Font = new Font(Display.getCurrent(), fontData);
+ disposables.add(h2Font);
+ }
+ // create a level-1 heading font
+ if (h1Font == null) {
+ Font baseFont = JFaceResources.getDialogFont();
+ FontData[] fontData = baseFont.getFontData();
+ for (FontData data : fontData) {
+ data.setStyle(data.getStyle() | SWT.BOLD);
+ data.height = data.height * 1.35f;
+ }
+ h1Font = new Font(Display.getCurrent(), fontData);
+ disposables.add(h1Font);
+ }
+ }
+
+ private class ConnectorDescriptorItemUi implements PropertyChangeListener, Runnable {
+ private final DiscoveryConnector connector;
+
+ private final Button checkbox;
+
+ private final Label iconLabel;
+
+ private final Label nameLabel;
+
+ private ToolItem infoButton;
+
+ private final Label providerLabel;
+
+ private final Label description;
+
+ private final Composite checkboxContainer;
+
+ private final Composite connectorContainer;
+
+ private final Display display;
+
+ private Image iconImage;
+
+ private Image warningIconImage;
+
+ public ConnectorDescriptorItemUi(DiscoveryConnector connector, Composite categoryChildrenContainer,
+ Color background) {
+ display = categoryChildrenContainer.getDisplay();
+ this.connector = connector;
+ connector.addPropertyChangeListener(this);
+
+ connectorContainer = new Composite(categoryChildrenContainer, SWT.NULL);
+
+ configureLook(connectorContainer, background);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(connectorContainer);
+ GridLayout layout = new GridLayout(4, false);
+ layout.marginLeft = 7;
+ layout.marginTop = 2;
+ layout.marginBottom = 2;
+ connectorContainer.setLayout(layout);
+
+ checkboxContainer = new Composite(connectorContainer, SWT.NULL);
+ configureLook(checkboxContainer, background);
+ GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.BEGINNING).span(1, 2).applyTo(checkboxContainer);
+ GridLayoutFactory.fillDefaults().spacing(1, 1).numColumns(2).applyTo(checkboxContainer);
+
+ checkbox = new Button(checkboxContainer, SWT.CHECK);
+ checkbox.setText(" "); //$NON-NLS-1$
+ // help UI tests
+ checkbox.setData("connectorId", connector.getId()); //$NON-NLS-1$
+ configureLook(checkbox, background);
+ checkbox.setSelection(installableConnectors.contains(connector));
+ checkbox.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ bodyScrolledComposite.showControl(connectorContainer);
+ }
+ });
+
+ GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(checkbox);
+
+ iconLabel = new Label(checkboxContainer, SWT.NULL);
+ configureLook(iconLabel, background);
+ GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(iconLabel);
+
+ if (connector.getIcon() != null) {
+ iconImage = computeIconImage(connector.getSource(), connector.getIcon(), 32, false);
+ if (iconImage != null) {
+ iconLabel.setImage(iconImage);
+ }
+ }
+
+ nameLabel = new Label(connectorContainer, SWT.NULL);
+ configureLook(nameLabel, background);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(nameLabel);
+ nameLabel.setFont(h2Font);
+ nameLabel.setText(connector.getName());
+
+ providerLabel = new Label(connectorContainer, SWT.NULL);
+ configureLook(providerLabel, background);
+ GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).applyTo(providerLabel);
+ providerLabel.setText(NLS.bind(Messages.ConnectorDiscoveryWizardMainPage_provider_and_license,
+ connector.getProvider(), connector.getLicense()));
+
+ if (hasTooltip(connector)) {
+ ToolBar toolBar = new ToolBar(connectorContainer, SWT.FLAT);
+ toolBar.setBackground(background);
+
+ infoButton = new ToolItem(toolBar, SWT.PUSH);
+ infoButton.setImage(infoImage);
+ infoButton.setToolTipText(Messages.ConnectorDiscoveryWizardMainPage_tooltip_showOverview);
+ hookTooltip(toolBar, infoButton, connectorContainer, nameLabel, connector.getSource(),
+ connector.getOverview());
+ GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).applyTo(toolBar);
+ } else {
+ new Label(connectorContainer, SWT.NULL).setText(" "); //$NON-NLS-1$
+ }
+
+ description = new Label(connectorContainer, SWT.NULL | SWT.WRAP);
+ configureLook(description, background);
+
+ GridDataFactory.fillDefaults().grab(true, false).span(3, 1).hint(100, SWT.DEFAULT).applyTo(description);
+ String descriptionText = connector.getDescription();
+ int maxDescriptionLength = 162;
+ if (descriptionText.length() > maxDescriptionLength) {
+ descriptionText = descriptionText.substring(0, maxDescriptionLength);
+ }
+ description.setText(descriptionText.replaceAll("(\\r\\n)|\\n|\\r", " ")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // always disabled color to make it less prominent
+ providerLabel.setForeground(colorDisabled);
+
+ checkbox.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ boolean selected = checkbox.getSelection();
+ maybeModifySelection(selected);
+ }
+ });
+ MouseListener connectorItemMouseListener = new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ boolean selected = !checkbox.getSelection();
+ if (maybeModifySelection(selected)) {
+ checkbox.setSelection(selected);
+ }
+ }
+ };
+ checkboxContainer.addMouseListener(connectorItemMouseListener);
+ connectorContainer.addMouseListener(connectorItemMouseListener);
+ iconLabel.addMouseListener(connectorItemMouseListener);
+ nameLabel.addMouseListener(connectorItemMouseListener);
+ providerLabel.addMouseListener(connectorItemMouseListener);
+ description.addMouseListener(connectorItemMouseListener);
+ }
+
+ protected boolean maybeModifySelection(boolean selected) {
+ if (selected) {
+ if (connector.getAvailable() == null) {
+ return false;
+ }
+ if (!connector.getAvailable()) {
+ MessageDialog.openWarning(getShell(),
+ Messages.ConnectorDiscoveryWizardMainPage_warningTitleConnectorUnavailable, NLS.bind(
+ Messages.ConnectorDiscoveryWizardMainPage_warningMessageConnectorUnavailable,
+ connector.getName()));
+ return false;
+ }
+ }
+ ConnectorDiscoveryWizardMainPage.this.modifySelection(connector, selected);
+ return true;
+ }
+
+ public void updateAvailability() {
+ boolean enabled = connector.getAvailable() != null && connector.getAvailable();
+
+ checkbox.setEnabled(enabled);
+ nameLabel.setEnabled(enabled);
+ providerLabel.setEnabled(enabled);
+ description.setEnabled(enabled);
+ Color foreground;
+ if (enabled) {
+ foreground = connectorContainer.getForeground();
+ } else {
+ foreground = colorDisabled;
+ }
+ nameLabel.setForeground(foreground);
+ description.setForeground(foreground);
+
+ if (iconImage != null) {
+ boolean unavailable = !enabled && connector.getAvailable() != null;
+ if (unavailable) {
+ if (warningIconImage == null) {
+ warningIconImage = new DecorationOverlayIcon(iconImage, DiscoveryImages.OVERLAY_WARNING_32,
+ IDecoration.BOTTOM_RIGHT).createImage();
+ disposables.add(warningIconImage);
+ }
+ iconLabel.setImage(warningIconImage);
+ } else if (warningIconImage != null) {
+ iconLabel.setImage(iconImage);
+ }
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ display.asyncExec(this);
+ }
+
+ public void run() {
+ if (!connectorContainer.isDisposed()) {
+ updateAvailability();
+ }
+ }
+ }
+
+ private void createDiscoveryContents(Composite container) {
+
+ Color background = container.getBackground();
+
+ if (discovery == null || isEmpty(discovery)) {
+ GridLayoutFactory.fillDefaults().margins(5, 5).applyTo(container);
+
+ boolean atLeastOneKindFiltered = false;
+ for (ConnectorDescriptorKind kind : ConnectorDescriptorKind.values()) {
+ if (!getWizard().isVisible(kind)) {
+ atLeastOneKindFiltered = true;
+ break;
+ }
+ }
+ Control helpTextControl;
+ if (filterPattern != null) {
+ Link link = new Link(container, SWT.WRAP);
+
+ link.setFont(container.getFont());
+ link.setText(org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_noMatchingItems_withFilterText);
+ link.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event event) {
+ clearFilterText();
+ filterText.setFocus();
+ }
+ });
+ helpTextControl = link;
+ } else {
+ Label helpText = new Label(container, SWT.WRAP);
+ helpText.setFont(container.getFont());
+ if (atLeastOneKindFiltered) {
+ helpText.setText(org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_noMatchingItems_filteredType);
+ } else {
+ helpText.setText(org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_noMatchingItems_noFilter);
+ }
+ helpTextControl = helpText;
+ }
+ configureLook(helpTextControl, background);
+ GridDataFactory.fillDefaults().grab(true, false).hint(100, SWT.DEFAULT).applyTo(helpTextControl);
+ } else {
+ GridLayoutFactory.fillDefaults().numColumns(2).spacing(0, 0).applyTo(container);
+
+ List<DiscoveryCategory> categories = new ArrayList<DiscoveryCategory>(discovery.getCategories());
+ Collections.sort(categories, new DiscoveryCategoryComparator());
+
+ Composite categoryChildrenContainer = null;
+ for (DiscoveryCategory category : categories) {
+ if (isEmpty(category)) {
+ // don't add empty categories
+ continue;
+ }
+ { // category header
+ final GradientCanvas categoryHeaderContainer = new GradientCanvas(container, SWT.NONE);
+ categoryHeaderContainer.setSeparatorVisible(true);
+ categoryHeaderContainer.setSeparatorAlignment(SWT.TOP);
+ categoryHeaderContainer.setBackgroundGradient(new Color[] { colorCategoryGradientStart,
+ colorCategoryGradientEnd }, new int[] { 100 }, true);
+ categoryHeaderContainer.putColor(IFormColors.H_BOTTOM_KEYLINE1, colorCategoryGradientStart);
+ categoryHeaderContainer.putColor(IFormColors.H_BOTTOM_KEYLINE2, colorCategoryGradientEnd);
+
+ GridDataFactory.fillDefaults().span(2, 1).applyTo(categoryHeaderContainer);
+ GridLayoutFactory.fillDefaults().numColumns(3).margins(5, 5).equalWidth(false).applyTo(
+ categoryHeaderContainer);
+
+ Label iconLabel = new Label(categoryHeaderContainer, SWT.NULL);
+ if (category.getIcon() != null) {
+ Image image = computeIconImage(category.getSource(), category.getIcon(), 48, true);
+ if (image != null) {
+ iconLabel.setImage(image);
+ }
+ }
+ iconLabel.setBackground(null);
+ GridDataFactory.swtDefaults().align(SWT.CENTER, SWT.BEGINNING).span(1, 2).applyTo(iconLabel);
+
+ Label nameLabel = new Label(categoryHeaderContainer, SWT.NULL);
+ nameLabel.setFont(h1Font);
+ nameLabel.setText(category.getName());
+ nameLabel.setBackground(null);
+
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(nameLabel);
+ if (hasTooltip(category)) {
+ ToolBar toolBar = new ToolBar(categoryHeaderContainer, SWT.FLAT);
+ toolBar.setBackground(null);
+ ToolItem infoButton = new ToolItem(toolBar, SWT.PUSH);
+ infoButton.setImage(infoImage);
+ infoButton.setToolTipText(Messages.ConnectorDiscoveryWizardMainPage_tooltip_showOverview);
+ hookTooltip(toolBar, infoButton, categoryHeaderContainer, nameLabel, category.getSource(),
+ category.getOverview());
+ GridDataFactory.fillDefaults().align(SWT.END, SWT.CENTER).applyTo(toolBar);
+ } else {
+ new Label(categoryHeaderContainer, SWT.NULL).setText(" "); //$NON-NLS-1$
+ }
+ Label description = new Label(categoryHeaderContainer, SWT.WRAP);
+ GridDataFactory.fillDefaults().grab(true, false).span(2, 1).hint(100, SWT.DEFAULT).applyTo(
+ description);
+ description.setBackground(null);
+ description.setText(category.getDescription());
+ }
+
+ categoryChildrenContainer = new Composite(container, SWT.NULL);
+ configureLook(categoryChildrenContainer, background);
+ GridDataFactory.fillDefaults().span(2, 1).grab(true, false).applyTo(categoryChildrenContainer);
+ GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(categoryChildrenContainer);
+
+ int numChildren = 0;
+ List<DiscoveryConnector> connectors = new ArrayList<DiscoveryConnector>(category.getConnectors());
+ Collections.sort(connectors, new DiscoveryConnectorComparator(category));
+ for (final DiscoveryConnector connector : connectors) {
+ if (isFiltered(connector)) {
+ continue;
+ }
+
+ if (++numChildren > 1) {
+ // a separator between connector descriptors
+ Composite border = new Composite(categoryChildrenContainer, SWT.NULL);
+ GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 1).applyTo(border);
+ GridLayoutFactory.fillDefaults().applyTo(border);
+ border.addPaintListener(new ConnectorBorderPaintListener());
+ }
+
+ ConnectorDescriptorItemUi itemUi = new ConnectorDescriptorItemUi(connector,
+ categoryChildrenContainer, background);
+ itemUi.updateAvailability();
+ }
+ }
+ // last one gets a border
+ Composite border = new Composite(categoryChildrenContainer, SWT.NULL);
+ GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 1).applyTo(border);
+ GridLayoutFactory.fillDefaults().applyTo(border);
+ border.addPaintListener(new ConnectorBorderPaintListener());
+ }
+ container.layout(true);
+ container.redraw();
+ }
+
+ private void configureLook(Control control, Color background) {
+ control.setBackground(background);
+ }
+
+ private void hookTooltip(final Control tooltipControl, final ToolItem tipActivator, final Control exitControl,
+ final Control titleControl, AbstractDiscoverySource source, Overview overview) {
+ final OverviewToolTip toolTip = new OverviewToolTip(tooltipControl, source, overview);
+ Listener listener = new Listener() {
+ public void handleEvent(Event event) {
+ switch (event.type) {
+ case SWT.Dispose:
+ case SWT.MouseWheel:
+ toolTip.hide();
+ break;
+ }
+
+ }
+ };
+ tipActivator.addListener(SWT.Dispose, listener);
+ tipActivator.addListener(SWT.MouseWheel, listener);
+ tipActivator.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Point titleAbsLocation = titleControl.getParent().toDisplay(titleControl.getLocation());
+ Point containerAbsLocation = tooltipControl.getParent().toDisplay(tooltipControl.getLocation());
+ Rectangle bounds = titleControl.getBounds();
+ int relativeX = titleAbsLocation.x - containerAbsLocation.x;
+ int relativeY = titleAbsLocation.y - containerAbsLocation.y;
+
+ relativeY += bounds.height + 3;
+ toolTip.show(new Point(relativeX, relativeY));
+ }
+ });
+ Listener exitListener = new Listener() {
+ public void handleEvent(Event event) {
+ switch (event.type) {
+ case SWT.MouseWheel:
+ toolTip.hide();
+ break;
+ case SWT.MouseExit:
+ /*
+ * Check if the mouse exit happened because we move over the
+ * tooltip
+ */
+ Rectangle containerBounds = exitControl.getBounds();
+ Point displayLocation = exitControl.getParent().toDisplay(containerBounds.x, containerBounds.y);
+ containerBounds.x = displayLocation.x;
+ containerBounds.y = displayLocation.y;
+ if (containerBounds.contains(Display.getCurrent().getCursorLocation())) {
+ break;
+ }
+ toolTip.hide();
+ break;
+ }
+ }
+ };
+ hookRecursively(exitControl, exitListener);
+ }
+
+ private void hookRecursively(Control control, Listener listener) {
+ control.addListener(SWT.Dispose, listener);
+ control.addListener(SWT.MouseHover, listener);
+ control.addListener(SWT.MouseMove, listener);
+ control.addListener(SWT.MouseExit, listener);
+ control.addListener(SWT.MouseDown, listener);
+ control.addListener(SWT.MouseWheel, listener);
+ if (control instanceof Composite) {
+ for (Control child : ((Composite) control).getChildren()) {
+ hookRecursively(child, listener);
+ }
+ }
+ }
+
+ private boolean hasTooltip(final DiscoveryConnector connector) {
+ return connector.getOverview() != null && connector.getOverview().getSummary() != null
+ && connector.getOverview().getSummary().length() > 0;
+ }
+
+ private boolean hasTooltip(final DiscoveryCategory category) {
+ return category.getOverview() != null && category.getOverview().getSummary() != null
+ && category.getOverview().getSummary().length() > 0;
+ }
+
+ /**
+ * indicate if there is nothing to display in the UI, given the current state of
+ * {@link ConnectorDiscoveryWizard#isVisible(ConnectorDescriptorKind) filters}.
+ */
+ private boolean isEmpty(ConnectorDiscovery discovery) {
+ for (DiscoveryCategory category : discovery.getCategories()) {
+ if (!isEmpty(category)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * indicate if the category has nothing to display in the UI, given the current state of
+ * {@link ConnectorDiscoveryWizard#isVisible(ConnectorDescriptorKind) filters}.
+ */
+ private boolean isEmpty(DiscoveryCategory category) {
+ if (category.getConnectors().isEmpty()) {
+ return true;
+ }
+ for (ConnectorDescriptor descriptor : category.getConnectors()) {
+ if (!isFiltered(descriptor)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean isFiltered(ConnectorDescriptor descriptor) {
+ boolean kindFiltered = true;
+ for (ConnectorDescriptorKind kind : descriptor.getKind()) {
+ if (getWizard().isVisible(kind)) {
+ kindFiltered = false;
+ break;
+ }
+ }
+ if (kindFiltered) {
+ return true;
+ }
+ if (installedFeatures != null && installedFeatures.contains(descriptor.getId())) {
+ // always filter installed features per bug 275777
+ return true;
+ }
+ if (filterPattern != null) {
+ if (!(filterMatches(descriptor.getName()) || filterMatches(descriptor.getDescription())
+ || filterMatches(descriptor.getProvider()) || filterMatches(descriptor.getLicense()))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean filterMatches(String text) {
+ return text != null && filterPattern.matcher(text).find();
+ }
+
+ private Image computeIconImage(AbstractDiscoverySource discoverySource, Icon icon, int dimension, boolean fallback) {
+ String imagePath;
+ switch (dimension) {
+ case 64:
+ imagePath = icon.getImage64();
+ if (imagePath != null || !fallback) {
+ break;
+ }
+ case 48:
+ imagePath = icon.getImage48();
+ if (imagePath != null || !fallback) {
+ break;
+ }
+ case 32:
+ imagePath = icon.getImage32();
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ if (imagePath != null && imagePath.length() > 0) {
+ URL resource = discoverySource.getResource(imagePath);
+ if (resource != null) {
+ ImageDescriptor descriptor = ImageDescriptor.createFromURL(resource);
+ Image image = descriptor.createImage();
+ if (image != null) {
+ disposables.add(image);
+ return image;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void maybeUpdateDiscovery() {
+ if (!getControl().isDisposed() && isCurrentPage() && discovery == null) {
+ final Dictionary<Object, Object> environment = getWizard().getEnvironment();
+ boolean wasCancelled = false;
+ try {
+ getContainer().run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+
+ if (ConnectorDiscoveryWizardMainPage.this.installedFeatures == null) {
+ Set<String> installedFeatures = new HashSet<String>();
+ IBundleGroupProvider[] bundleGroupProviders = Platform.getBundleGroupProviders();
+ for (IBundleGroupProvider provider : bundleGroupProviders) {
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ IBundleGroup[] bundleGroups = provider.getBundleGroups();
+ for (IBundleGroup group : bundleGroups) {
+ installedFeatures.add(group.getIdentifier());
+ }
+ }
+ ConnectorDiscoveryWizardMainPage.this.installedFeatures = installedFeatures;
+ }
+
+ ConnectorDiscovery connectorDiscovery = new ConnectorDiscovery();
+ connectorDiscovery.getDiscoveryStrategies().add(new BundleDiscoveryStrategy());
+ RemoteBundleDiscoveryStrategy remoteDiscoveryStrategy = new RemoteBundleDiscoveryStrategy();
+
+ remoteDiscoveryStrategy.setDirectoryUrl(System.getProperty(SYSTEM_PROPERTY_DIRECTORY_URL,
+ DEFAULT_DIRECTORY_URL));
+ connectorDiscovery.getDiscoveryStrategies().add(remoteDiscoveryStrategy);
+ connectorDiscovery.setEnvironment(environment);
+ connectorDiscovery.setVerifyUpdateSiteAvailability(false);
+ try {
+ connectorDiscovery.performDiscovery(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ ConnectorDiscoveryWizardMainPage.this.discovery = connectorDiscovery;
+ }
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ IStatus status = computeStatus(e, Messages.ConnectorDiscoveryWizardMainPage_unexpectedException);
+ DiscoveryUiUtil.logAndDisplayStatus(getShell(), Messages.ConnectorDiscoveryWizardMainPage_errorTitle,
+ status);
+ } catch (InterruptedException e) {
+ // cancelled by user so nothing to do here.
+ wasCancelled = true;
+ }
+ if (discovery != null) {
+ discoveryUpdated(wasCancelled);
+ if (!discovery.getConnectors().isEmpty()) {
+ try {
+ getContainer().run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException {
+ discovery.verifySiteAvailability(monitor);
+ }
+ });
+ } catch (InvocationTargetException e) {
+ IStatus status = computeStatus(e, Messages.ConnectorDiscoveryWizardMainPage_unexpectedException);
+ DiscoveryUiUtil.logAndDisplayStatus(getShell(),
+ Messages.ConnectorDiscoveryWizardMainPage_errorTitle, status);
+ } catch (InterruptedException e) {
+ // cancelled by user so nothing to do here.
+ wasCancelled = true;
+ }
+ }
+ // createBodyContents() shouldn't be necessary but for some reason checkboxes don't
+ // regain their enabled state
+ createBodyContents();
+ }
+ // help UI tests
+ body.setData("discoveryComplete", "true"); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ }
+
+ private IStatus computeStatus(InvocationTargetException e, String message) {
+ Throwable cause = e.getCause();
+ IStatus statusCause;
+ if (!(cause instanceof CoreException)) {
+ statusCause = ((CoreException) cause).getStatus();
+ } else {
+ statusCause = new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN, cause.getMessage(), cause);
+ }
+ if (statusCause.getMessage() != null) {
+ message = NLS.bind(Messages.ConnectorDiscoveryWizardMainPage_message_with_cause, message,
+ statusCause.getMessage());
+ }
+ IStatus status = new MultiStatus(DiscoveryUi.ID_PLUGIN, 0, new IStatus[] { statusCause }, message, cause);
+ return status;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible && discovery == null) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ maybeUpdateDiscovery();
+ }
+ });
+ }
+ }
+
+ private void discoveryUpdated(boolean wasCancelled) {
+ createBodyContents();
+ if (discovery != null && !wasCancelled) {
+ int categoryWithConnectorCount = 0;
+ for (DiscoveryCategory category : discovery.getCategories()) {
+ categoryWithConnectorCount += category.getConnectors().size();
+ }
+ if (categoryWithConnectorCount == 0) {
+ // nothing was discovered: notify the user
+ MessageDialog.openWarning(
+ getShell(),
+ org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_noConnectorsFound,
+ org.eclipse.mylyn.internal.discovery.ui.wizards.Messages.ConnectorDiscoveryWizardMainPage_noConnectorsFound_description);
+ }
+ }
+ }
+
+ public List<ConnectorDescriptor> getInstallableConnectors() {
+ return installableConnectors;
+ }
+
+ private void modifySelection(final DiscoveryConnector connector, boolean selected) {
+ connector.setSelected(selected);
+
+ if (selected) {
+ installableConnectors.add(connector);
+ } else {
+ installableConnectors.remove(connector);
+ }
+ setPageComplete(!installableConnectors.isEmpty());
+ }
+
+ public class ConnectorBorderPaintListener implements PaintListener {
+ public void paintControl(PaintEvent e) {
+ Composite composite = (Composite) e.widget;
+ Rectangle bounds = composite.getBounds();
+ GC gc = e.gc;
+ gc.setLineStyle(SWT.LINE_DOT);
+ gc.drawLine(bounds.x, bounds.y, bounds.x + bounds.width, bounds.y);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/Messages.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/Messages.java
new file mode 100644
index 0000000..94b5ae5
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/Messages.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.discovery.ui.wizards.messages"; //$NON-NLS-1$
+
+ public static String ConnectorDescriptorToolTip_detailsLink;
+
+ public static String ConnectorDescriptorToolTip_detailsLink_tooltip;
+
+ public static String ConnectorDiscoveryWizard_cannotInstall;
+
+ public static String ConnectorDiscoveryWizard_connectorDiscovery;
+
+ public static String ConnectorDiscoveryWizard_installProblems;
+
+ public static String InstallConnectorsJob_commaSeparator;
+
+ public static String InstallConnectorsJob_connectorsNotAvailable;
+
+ public static String InstallConnectorsJob_profileProblem;
+
+ public static String InstallConnectorsJob_questionProceed;
+
+ public static String InstallConnectorsJob_questionProceed_long;
+
+ public static String InstallConnectorsJob_task_configuring;
+
+ public static String InstallConnectorsJob_unexpectedError_url;
+
+ public static String ConnectorDiscoveryWizardMainPage_clearButton_accessibleListener;
+
+ public static String ConnectorDiscoveryWizardMainPage_clearButton_toolTip;
+
+ public static String ConnectorDiscoveryWizardMainPage_connectorDiscovery;
+
+ public static String ConnectorDiscoveryWizardMainPage_errorTitle;
+
+ public static String ConnectorDiscoveryWizardMainPage_filter_documents;
+
+ public static String ConnectorDiscoveryWizardMainPage_filter_tasks;
+
+ public static String ConnectorDiscoveryWizardMainPage_filter_vcs;
+
+ public static String ConnectorDiscoveryWizardMainPage_filterLabel;
+
+ public static String ConnectorDiscoveryWizardMainPage_message_with_cause;
+
+ public static String ConnectorDiscoveryWizardMainPage_noConnectorsFound;
+
+ public static String ConnectorDiscoveryWizardMainPage_noConnectorsFound_description;
+
+ public static String ConnectorDiscoveryWizardMainPage_noMatchingItems_filteredType;
+
+ public static String ConnectorDiscoveryWizardMainPage_noMatchingItems_noFilter;
+
+ public static String ConnectorDiscoveryWizardMainPage_noMatchingItems_withFilterText;
+
+ public static String ConnectorDiscoveryWizardMainPage_pageDescription;
+
+ public static String ConnectorDiscoveryWizardMainPage_provider_and_license;
+
+ public static String ConnectorDiscoveryWizardMainPage_tooltip_showOverview;
+
+ public static String ConnectorDiscoveryWizardMainPage_unexpectedException;
+
+ public static String ConnectorDiscoveryWizardMainPage_warningMessageConnectorUnavailable;
+
+ public static String ConnectorDiscoveryWizardMainPage_warningTitleConnectorUnavailable;
+
+ public static String PrepareInstallProfileJob_notFoundDescriptorDetail;
+
+ public static String PrepareInstallProfileJob_calculatingRequirements;
+
+ public static String PrepareInstallProfileJob_computeProfileChangeRequestFailed;
+
+ public static String PrepareInstallProfileJob_errorResolvingHostname;
+
+ public static String PrepareInstallProfileJob_ok;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/OverviewToolTip.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/OverviewToolTip.java
new file mode 100644
index 0000000..bba55a9
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/OverviewToolTip.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.wizards;
+
+import java.net.URL;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.mylyn.internal.discovery.core.model.AbstractDiscoverySource;
+import org.eclipse.mylyn.internal.discovery.core.model.Overview;
+import org.eclipse.mylyn.internal.provisional.commons.ui.GradientToolTip;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+
+/**
+ * @author David Green
+ */
+class OverviewToolTip extends GradientToolTip {
+
+ private static final String COLOR_BLACK = "black"; //$NON-NLS-1$
+
+ private final Overview overview;
+
+ private final AbstractDiscoverySource source;
+
+ private Color colorBlack;
+
+ public OverviewToolTip(Control control, AbstractDiscoverySource source, Overview overview) {
+ super(control, ToolTip.RECREATE, true);
+ if (source == null) {
+ throw new IllegalArgumentException();
+ }
+ if (overview == null) {
+ throw new IllegalArgumentException();
+ }
+ this.source = source;
+ this.overview = overview;
+ setHideOnMouseDown(false); // required for links to work
+ }
+
+ @Override
+ protected Composite createToolTipArea(Event event, final Composite parent) {
+ if (colorBlack == null) {
+ ColorRegistry colorRegistry = JFaceResources.getColorRegistry();
+ if (!colorRegistry.hasValueFor(COLOR_BLACK)) {
+ colorRegistry.put(COLOR_BLACK, new RGB(0, 0, 0));
+ }
+ colorBlack = colorRegistry.get(COLOR_BLACK);
+ }
+
+ GridLayoutFactory.fillDefaults().applyTo(parent);
+
+ Composite container = new Composite(parent, SWT.NULL);
+ container.setBackground(null);
+
+ Image image = null;
+ if (overview.getScreenshot() != null) {
+ image = computeImage(source, overview.getScreenshot());
+ if (image != null) {
+ final Image fimage = image;
+ container.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ fimage.dispose();
+ }
+ });
+ }
+ }
+ final boolean hasLearnMoreLink = overview.getUrl() != null && overview.getUrl().length() > 0;
+
+ final int borderWidth = 1;
+ final int fixedImageHeight = 240;
+ final int fixedImageWidth = 320;
+ final int heightHint = fixedImageHeight + (borderWidth * 2);
+ final int widthHint = fixedImageWidth;
+
+ final int containerWidthHintWithImage = 650;
+ final int containerWidthHintWithoutImage = 500;
+
+ GridDataFactory.fillDefaults().grab(true, true).hint(
+ image == null ? containerWidthHintWithoutImage : containerWidthHintWithImage, SWT.DEFAULT).applyTo(
+ container);
+
+ GridLayoutFactory.fillDefaults().numColumns(2).margins(5, 5).spacing(3, 0).applyTo(container);
+
+ String summary = overview.getSummary();
+
+ Composite summaryContainer = new Composite(container, SWT.NULL);
+ summaryContainer.setBackground(null);
+ GridLayoutFactory.fillDefaults().applyTo(summaryContainer);
+
+ GridDataFactory gridDataFactory = GridDataFactory.fillDefaults()
+ .grab(true, true)
+ .span(image == null ? 2 : 1, 1);
+ if (image != null) {
+ gridDataFactory.hint(widthHint, heightHint);
+ }
+ gridDataFactory.applyTo(summaryContainer);
+
+ Label summaryLabel = new Label(summaryContainer, SWT.WRAP);
+ summaryLabel.setText(summary);
+ summaryLabel.setBackground(null);
+
+ GridDataFactory.fillDefaults().grab(true, true).align(SWT.BEGINNING, SWT.BEGINNING).applyTo(summaryLabel);
+
+ if (image != null) {
+ final Composite imageContainer = new Composite(container, SWT.BORDER);
+ GridLayoutFactory.fillDefaults().applyTo(imageContainer);
+
+ GridDataFactory.fillDefaults().grab(false, false).align(SWT.CENTER, SWT.BEGINNING).hint(
+ widthHint + (borderWidth * 2), heightHint).applyTo(imageContainer);
+
+ Label imageLabel = new Label(imageContainer, SWT.NULL);
+ GridDataFactory.fillDefaults().hint(widthHint, fixedImageHeight).indent(borderWidth, borderWidth).applyTo(
+ imageLabel);
+ imageLabel.setImage(image);
+ imageLabel.setBackground(null);
+ imageLabel.setSize(widthHint, fixedImageHeight);
+
+ // creates a border
+ imageContainer.setBackground(colorBlack);
+ }
+ if (hasLearnMoreLink) {
+ Link link = new Link(summaryContainer, SWT.NULL);
+ GridDataFactory.fillDefaults().grab(false, false).align(SWT.BEGINNING, SWT.CENTER).applyTo(link);
+ link.setText(Messages.ConnectorDescriptorToolTip_detailsLink);
+ link.setBackground(null);
+ link.setToolTipText(NLS.bind(Messages.ConnectorDescriptorToolTip_detailsLink_tooltip, overview.getUrl()));
+ link.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ WorkbenchUtil.openUrl(overview.getUrl(), IWorkbenchBrowserSupport.AS_EXTERNAL);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+ }
+ if (image == null) {
+ // prevent overviews with no image from providing unlimited text.
+ Point optimalSize = summaryContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ if (optimalSize.y > (heightHint + 10)) {
+ ((GridData) summaryContainer.getLayoutData()).heightHint = heightHint;
+ container.layout(true);
+ }
+ }
+ // hack: cause the tooltip to gain focus so that we can capture the escape key
+ // this must be done async since the tooltip is not yet visible.
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ if (!parent.isDisposed()) {
+ parent.setFocus();
+ }
+ }
+ });
+ return container;
+ }
+
+ private Image computeImage(AbstractDiscoverySource discoverySource, String imagePath) {
+ URL resource = discoverySource.getResource(imagePath);
+ if (resource != null) {
+ ImageDescriptor descriptor = ImageDescriptor.createFromURL(resource);
+ Image image = descriptor.createImage();
+ return image;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/PrepareInstallProfileJob.java b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/PrepareInstallProfileJob.java
new file mode 100644
index 0000000..d43eedb
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/PrepareInstallProfileJob.java
@@ -0,0 +1,367 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.discovery.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.equinox.internal.provisional.p2.core.Version;
+import org.eclipse.equinox.internal.provisional.p2.director.ProfileChangeRequest;
+import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
+import org.eclipse.equinox.internal.provisional.p2.engine.IProfileRegistry;
+import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.internal.provisional.p2.metadata.IProvidedCapability;
+import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepository;
+import org.eclipse.equinox.internal.provisional.p2.query.Collector;
+import org.eclipse.equinox.internal.provisional.p2.query.MatchQuery;
+import org.eclipse.equinox.internal.provisional.p2.query.Query;
+import org.eclipse.equinox.internal.provisional.p2.ui.actions.InstallAction;
+import org.eclipse.equinox.internal.provisional.p2.ui.operations.PlannerResolutionOperation;
+import org.eclipse.equinox.internal.provisional.p2.ui.operations.ProvisioningUtil;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.discovery.core.model.ConnectorDescriptor;
+import org.eclipse.mylyn.internal.discovery.ui.DiscoveryUi;
+import org.eclipse.mylyn.internal.discovery.ui.util.DiscoveryUiUtil;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A job that configures a p2 {@link #getInstallAction() install action} for installing one or more
+ * {@link ConnectorDescriptor connectors}. The bulk of the installation work is done by p2; this class just sets up the
+ * p2 repository metadata and selects the appropriate features to install. After running the job the
+ * {@link #getInstallAction() install action} must be run to perform the installation.
+ *
+ * @author David Green
+ */
+ at SuppressWarnings("restriction")
+public class PrepareInstallProfileJob implements IRunnableWithProgress {
+
+ private static final String P2_FEATURE_GROUP_SUFFIX = ".feature.group"; //$NON-NLS-1$
+
+ private final List<ConnectorDescriptor> installableConnectors;
+
+ private PlannerResolutionOperation plannerResolutionOperation;
+
+ private String profileId;
+
+ private IInstallableUnit[] ius;
+
+ private InstallAction installAction;
+
+ public PrepareInstallProfileJob(List<ConnectorDescriptor> installableConnectors) {
+ if (installableConnectors == null || installableConnectors.isEmpty()) {
+ throw new IllegalArgumentException();
+ }
+ this.installableConnectors = new ArrayList<ConnectorDescriptor>(installableConnectors);
+ }
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ doRun(monitor);
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+ } catch (Exception e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+
+ public void doRun(IProgressMonitor monitor) throws CoreException {
+ final int totalWork = installableConnectors.size() * 6;
+ monitor.beginTask(Messages.InstallConnectorsJob_task_configuring, totalWork);
+ try {
+ profileId = computeProfileId();
+ // verify that we can resolve hostnames
+ // this is a pre-emptive check so that we can provide better error handling
+ // than that provided by P2.
+ {
+ Set<String> hostnames = new HashSet<String>();
+ for (ConnectorDescriptor descriptor : installableConnectors) {
+ URL url = new URL(descriptor.getSiteUrl());
+ String host = url.getHost();
+ if (host != null && host.length() > 0 && hostnames.add(host)) {
+ try {
+ InetAddress.getByName(host);
+ } catch (UnknownHostException e) {
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN, NLS.bind(
+ Messages.PrepareInstallProfileJob_errorResolvingHostname, descriptor.getName(),
+ host), e));
+ }
+ }
+ }
+ }
+
+ // Tell p2 that it's okay to use these repositories
+ Set<URL> repositoryURLs = new HashSet<URL>();
+ for (ConnectorDescriptor descriptor : installableConnectors) {
+ URL url = new URL(descriptor.getSiteUrl());
+ if (repositoryURLs.add(url)) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ ProvisioningUtil.addMetadataRepository(url.toURI(), true);
+ ProvisioningUtil.addArtifactRepository(url.toURI(), true);
+ ProvisioningUtil.setColocatedRepositoryEnablement(url.toURI(), true);
+
+ }
+ monitor.worked(1);
+ }
+ if (repositoryURLs.isEmpty()) {
+ // should never happen
+ throw new IllegalStateException();
+ }
+ // Fetch p2's metadata for these repositories
+ List<IMetadataRepository> repositories = new ArrayList<IMetadataRepository>();
+ final Map<IMetadataRepository, URL> repositoryToURL = new HashMap<IMetadataRepository, URL>();
+ {
+ int unit = installableConnectors.size() / repositoryURLs.size();
+ for (URL updateSiteUrl : repositoryURLs) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ IMetadataRepository repository = ProvisioningUtil.loadMetadataRepository(updateSiteUrl.toURI(),
+ new SubProgressMonitor(monitor, unit));
+ repositories.add(repository);
+ repositoryToURL.put(repository, updateSiteUrl);
+ }
+ }
+ // Perform a query to get the installable units. This causes p2 to determine what features are available
+ // in each repository. We select installable units by matching both the feature id and the repository; it
+ // is possible though unlikely that the same feature id is available from more than one of the selected
+ // repositories, and we must ensure that the user gets the one that they asked for.
+ final List<IInstallableUnit> installableUnits = new ArrayList<IInstallableUnit>();
+ {
+ int unit = installableConnectors.size() / repositories.size();
+
+ for (final IMetadataRepository repository : repositories) {
+ if (monitor.isCanceled()) {
+ return;
+ }
+ URL repositoryUrl = repositoryToURL.get(repository);
+ final Set<String> installableUnitIdsThisRepository = new HashSet<String>();
+ // determine all installable units for this repository
+ for (ConnectorDescriptor descriptor : installableConnectors) {
+ try {
+ if (repositoryUrl.equals(new URL(descriptor.getSiteUrl()))) {
+ installableUnitIdsThisRepository.add(descriptor.getId());
+ }
+ } catch (MalformedURLException e) {
+ // will never happen, ignore
+ }
+ }
+ Collector collector = new Collector();
+ Query query = new MatchQuery() {
+ @Override
+ public boolean isMatch(Object object) {
+ if (!(object instanceof IInstallableUnit)) {
+ return false;
+ }
+ IInstallableUnit candidate = (IInstallableUnit) object;
+
+ if ("true".equalsIgnoreCase(candidate.getProperty("org.eclipse.equinox.p2.type.group"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ String id = candidate.getId();
+ if (isQualifyingFeature(installableUnitIdsThisRepository, id)) {
+ IProvidedCapability[] providedCapabilities = candidate.getProvidedCapabilities();
+ if (providedCapabilities != null && providedCapabilities.length > 0) {
+ for (IProvidedCapability capability : providedCapabilities) {
+ if ("org.eclipse.equinox.p2.iu".equals(capability.getNamespace())) { //$NON-NLS-1$
+ String name = capability.getName();
+ if (isQualifyingFeature(installableUnitIdsThisRepository, name)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean isQualifyingFeature(final Set<String> installableUnitIdsThisRepository,
+ String id) {
+ return id.endsWith(P2_FEATURE_GROUP_SUFFIX)
+ && installableUnitIdsThisRepository.contains(id.substring(0,
+ id.indexOf(P2_FEATURE_GROUP_SUFFIX)));
+ }
+ };
+ repository.query(query, collector, new SubProgressMonitor(monitor, unit));
+
+ addAll(installableUnits, collector);
+ }
+ }
+
+ // filter those installable units that have a duplicate in the list with a higher version number.
+ // it's possible that some repositories will host multiple versions of a particular feature. we assume
+ // that the user wants the highest version.
+ {
+ Map<String, Version> symbolicNameToVersion = new HashMap<String, Version>();
+ for (IInstallableUnit unit : installableUnits) {
+ Version version = symbolicNameToVersion.get(unit.getId());
+ if (version == null || version.compareTo(unit.getVersion()) == -1) {
+ symbolicNameToVersion.put(unit.getId(), unit.getVersion());
+ }
+ }
+ if (symbolicNameToVersion.size() != installableUnits.size()) {
+ for (IInstallableUnit unit : new ArrayList<IInstallableUnit>(installableUnits)) {
+ Version version = symbolicNameToVersion.get(unit.getId());
+ if (!version.equals(unit.getVersion())) {
+ installableUnits.remove(unit);
+ }
+ }
+ }
+ }
+
+ // Verify that we found what we were looking for: it's possible that we have connector descriptors
+ // that are no longer available on their respective sites. In that case we must inform the user.
+ // (Unfortunately this is the earliest point at which we can know)
+ if (installableUnits.size() < installableConnectors.size()) {
+ // at least one selected connector could not be found in a repository
+ Set<String> foundIds = new HashSet<String>();
+ for (IInstallableUnit unit : installableUnits) {
+ String id = unit.getId();
+ if (id.endsWith(P2_FEATURE_GROUP_SUFFIX)) {
+ id = id.substring(0, id.indexOf(P2_FEATURE_GROUP_SUFFIX));
+ }
+ foundIds.add(id);
+ }
+
+ final String notFound;
+ {
+ String temp = ""; //$NON-NLS-1$
+ for (ConnectorDescriptor descriptor : installableConnectors) {
+ if (!foundIds.contains(descriptor.getId())) {
+ if (temp.length() > 0) {
+ temp += Messages.InstallConnectorsJob_commaSeparator;
+ }
+ temp += descriptor.getName();
+ }
+ }
+ notFound = temp;
+ }
+ boolean proceed = false;
+ if (!installableUnits.isEmpty()) {
+ // instead of aborting here we ask the user if they wish to proceed anyways
+ final boolean[] okayToProceed = new boolean[1];
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ okayToProceed[0] = MessageDialog.openQuestion(DiscoveryUiUtil.getShell(),
+ Messages.InstallConnectorsJob_questionProceed, NLS.bind(
+ Messages.InstallConnectorsJob_questionProceed_long,
+ new Object[] { notFound }));
+ }
+ });
+ proceed = okayToProceed[0];
+ }
+ if (!proceed) {
+ String notFoundDescription = ""; //$NON-NLS-1$
+ for (ConnectorDescriptor descriptor : installableConnectors) {
+ if (!foundIds.contains(descriptor.getId())) {
+ if (notFoundDescription.length() > 0) {
+ notFoundDescription += Messages.InstallConnectorsJob_commaSeparator;
+ }
+ notFoundDescription += NLS.bind(Messages.PrepareInstallProfileJob_notFoundDescriptorDetail,
+ new Object[] { descriptor.getName(), descriptor.getId(), descriptor.getSiteUrl() });
+ }
+ }
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN, NLS.bind(
+ Messages.InstallConnectorsJob_connectorsNotAvailable, notFoundDescription), null));
+ }
+ } else if (installableUnits.size() > installableConnectors.size()) {
+ // should never ever happen
+ throw new IllegalStateException();
+ }
+
+ MultiStatus status = new MultiStatus(DiscoveryUi.ID_PLUGIN, 0, Messages.PrepareInstallProfileJob_ok, null);
+ ius = installableUnits.toArray(new IInstallableUnit[installableUnits.size()]);
+ ProfileChangeRequest profileChangeRequest = InstallAction.computeProfileChangeRequest(ius, profileId,
+ status, new SubProgressMonitor(monitor, installableConnectors.size()));
+ if (status.getSeverity() > IStatus.WARNING) {
+ throw new CoreException(status);
+ }
+ if (profileChangeRequest == null) {
+ // failed but no indication as to why
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN,
+ Messages.PrepareInstallProfileJob_computeProfileChangeRequestFailed, null));
+ }
+ PlannerResolutionOperation operation = new PlannerResolutionOperation(
+ Messages.PrepareInstallProfileJob_calculatingRequirements, profileId, profileChangeRequest, null,
+ status, true);
+ IStatus operationStatus = operation.execute(new SubProgressMonitor(monitor, installableConnectors.size()));
+ if (operationStatus.getSeverity() > IStatus.WARNING) {
+ throw new CoreException(operationStatus);
+ }
+
+ plannerResolutionOperation = operation;
+
+ } catch (URISyntaxException e) {
+ // should never happen, since we already validated URLs.
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN,
+ Messages.InstallConnectorsJob_unexpectedError_url, e));
+ } catch (MalformedURLException e) {
+ // should never happen, since we already validated URLs.
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN,
+ Messages.InstallConnectorsJob_unexpectedError_url, e));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private boolean addAll(final List<IInstallableUnit> installableUnits, Collector collector) {
+ return installableUnits.addAll(collector.toCollection());
+ }
+
+ private String computeProfileId() throws CoreException {
+ IProfile profile = ProvisioningUtil.getProfile(IProfileRegistry.SELF);
+ if (profile != null) {
+ return profile.getProfileId();
+ }
+ IProfile[] profiles = ProvisioningUtil.getProfiles();
+ if (profiles.length > 0) {
+ return profiles[0].getProfileId();
+ }
+ throw new CoreException(new Status(IStatus.ERROR, DiscoveryUi.ID_PLUGIN,
+ Messages.InstallConnectorsJob_profileProblem, null));
+ }
+
+ public PlannerResolutionOperation getPlannerResolutionOperation() {
+ return plannerResolutionOperation;
+ }
+
+ public String getProfileId() {
+ return profileId;
+ }
+
+ public IInstallableUnit[] getIUs() {
+ return ius;
+ }
+
+ public InstallAction getInstallAction() {
+ return installAction;
+ }
+}
diff --git a/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/messages.properties b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/messages.properties
new file mode 100644
index 0000000..f76fe2c
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.ui/src/org/eclipse/mylyn/internal/discovery/ui/wizards/messages.properties
@@ -0,0 +1,39 @@
+ConnectorDescriptorToolTip_detailsLink=<a>Learn More</a>
+ConnectorDescriptorToolTip_detailsLink_tooltip=Open {0} in an external browser
+ConnectorDiscoveryWizard_cannotInstall=Cannot complete installation
+ConnectorDiscoveryWizard_connectorDiscovery=Install Connectors
+ConnectorDiscoveryWizard_installProblems=Problems occurred while performing installation: {0}
+ConnectorDiscoveryWizardMainPage_clearButton_accessibleListener=Clear filter field
+ConnectorDiscoveryWizardMainPage_clearButton_toolTip=Clear
+ConnectorDiscoveryWizardMainPage_connectorDiscovery=Mylyn Connector Discovery
+ConnectorDiscoveryWizardMainPage_errorTitle=Connector Discovery Error
+ConnectorDiscoveryWizardMainPage_filter_documents=Documents
+ConnectorDiscoveryWizardMainPage_filter_tasks=Tasks
+ConnectorDiscoveryWizardMainPage_filter_vcs=Version Control
+ConnectorDiscoveryWizardMainPage_filterLabel=Find:
+ConnectorDiscoveryWizardMainPage_message_with_cause={0}: {1}
+ConnectorDiscoveryWizardMainPage_noConnectorsFound=No Connectors Found
+ConnectorDiscoveryWizardMainPage_noConnectorsFound_description=Connector discovery completed without finding any connectors. Please check your Internet connection and try again.
+ConnectorDiscoveryWizardMainPage_noMatchingItems_filteredType=There are no connectors of the selected type. Please select another connector type or try again later.
+ConnectorDiscoveryWizardMainPage_noMatchingItems_noFilter=Sorry, there are no available connectors. Please try again later.
+ConnectorDiscoveryWizardMainPage_noMatchingItems_withFilterText=There are no matching connectors. Please <a>clear the filter text</a> or try again later.
+ConnectorDiscoveryWizardMainPage_pageDescription=\
+ Select connectors to install. Press Finish to proceed with installation.\n\
+ Press the information button to see a detailed overview and a link to more information.
+ConnectorDiscoveryWizardMainPage_provider_and_license=by {0}, {1}
+ConnectorDiscoveryWizardMainPage_tooltip_showOverview=Show Overview
+ConnectorDiscoveryWizardMainPage_unexpectedException=Unexpected exception
+ConnectorDiscoveryWizardMainPage_warningMessageConnectorUnavailable=Sorry, {0} is unavailable. Please try again later.
+ConnectorDiscoveryWizardMainPage_warningTitleConnectorUnavailable=Connector Unavailable
+InstallConnectorsJob_commaSeparator=,
+InstallConnectorsJob_connectorsNotAvailable=The following connectors are not available: {0}
+InstallConnectorsJob_profileProblem=Cannot determine p2 profile
+InstallConnectorsJob_questionProceed=Proceed With Installation?
+InstallConnectorsJob_questionProceed_long=The following connectors are not available: {0}\nProceed with the installation anyways?
+InstallConnectorsJob_task_configuring=Configuring installation selection
+InstallConnectorsJob_unexpectedError_url=Unexpected error handling repository URL
+PrepareInstallProfileJob_notFoundDescriptorDetail={0} (id={1}, site={2})
+PrepareInstallProfileJob_calculatingRequirements=Calculating requirements
+PrepareInstallProfileJob_computeProfileChangeRequestFailed=Cannot compute profile change request
+PrepareInstallProfileJob_errorResolvingHostname=Error resolving hostname {1} for '{0}': please check your Internet connection and try again.
+PrepareInstallProfileJob_ok=OK
diff --git a/org.eclipse.mylyn.help.ui/.classpath b/org.eclipse.mylyn.help.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.help.ui/.cvsignore b/org.eclipse.mylyn.help.ui/.cvsignore
new file mode 100644
index 0000000..7c18d5d
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.cvsignore
@@ -0,0 +1,2 @@
+bin
+tmp
diff --git a/org.eclipse.mylyn.help.ui/.externalToolBuilders/org.eclipse.jdt.core.javabuilder.launch b/org.eclipse.mylyn.help.ui/.externalToolBuilders/org.eclipse.jdt.core.javabuilder.launch
new file mode 100644
index 0000000..6ae599b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.externalToolBuilders/org.eclipse.jdt.core.javabuilder.launch
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
+<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="org.eclipse.jdt.core.javabuilder"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+</launchConfiguration>
diff --git a/org.eclipse.mylyn.help.ui/.project b/org.eclipse.mylyn.help.ui/.project
new file mode 100644
index 0000000..2eaa280
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.help.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..acf71ec
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.8.0/track-editor-new.gif' to 'trac-editor-new.gif' - Original project: 'org.eclipse.mylar.doc' - Original element: 'track-editor-new.gif'" description="Rename resource 'track-editor-new.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.8.0/track-editor-new.gif" name="trac-editor-new.gif" stamp="1161446440218" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'doc' - Original project: 'org.eclipse.mylar.doc' - Destination element: 'doc' - Original element: 'new.html'" description="Copy file" destination="doc" element1="doc/new.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="doc/new.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1161451173281" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..9a24fdc
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1,2 @@
+1161446440218 Rename resource 'track-editor-new.gif'
+1161451173281 Copy file
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..9e5ad28
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private GridLayout setSectionLayout(Section section)' from 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog.createDialogArea()' to 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog' - Original project: 'org.eclipse.mylar.doc' - Method name: 'setSectionLayout' - Destination type: 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog' - Declared visibility: 'private'" comments="false" description="Extract method 'setSectionLayout'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.doc.internal.dialogs{UiLegendDialog.java" name="setSectionLayout" replace="false" selection="2568 279" stamp="1164686412046" version="1.0" visibility="2"/>
+<refactoring accessors="false" comment="Delete 1 element(s) from project 'org.eclipse.mylar.doc' - Original project: 'org.eclipse.mylar.doc' - Original element: 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog.createDialogArea(...)'" description="Delete element" element1="/src<org.eclipse.mylar.doc.internal.dialogs{UiLegendDialog.java[UiLegendDialog~createDialogArea~QComposite;" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1164693577437" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..aed0191
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1,2 @@
+1164686412046 Extract method 'setSectionLayout'
+1164693577437 Delete element
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..dd7bcc6
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Rename resource '/org.eclipse.mylar.doc/doc/developer' to 'dev'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="resource://doc/developer" name="dev" stamp="1144101591879" version="1.0"/>
+<refactoring description="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.0/apply-task-markers.gif' to 'apply-to-markers.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="resource://doc/images/0.5.0/apply-task-markers.gif" name="apply-to-markers.gif" stamp="1144462080235" version="1.0"/>
+<refactoring description="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.0/apply-to-markers.gif' to 'apply-to-task-markers.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="resource://doc/images/0.5.0/apply-to-markers.gif" name="apply-to-task-markers.gif" stamp="1144462090710" version="1.0"/>
+<refactoring description="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.0/apply-to-task-markers.gif' to 'apply-task-markers.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="resource://doc/images/0.5.0/apply-to-task-markers.gif" name="apply-task-markers.gif" stamp="1144467223350" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..c1a32c3
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1,4 @@
+1144101591879 Rename resource '/org.eclipse.mylar.doc/doc/developer' to 'dev'
+1144467223350 Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.0/apply-to-task-markers.gif' to 'apply-task-markers.gif'
+1144462090710 Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.0/apply-to-markers.gif' to 'apply-to-task-markers.gif'
+1144462080235 Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.0/apply-task-markers.gif' to 'apply-to-markers.gif'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/4/15/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/15/refactorings.history
new file mode 100644
index 0000000..b1707ca
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Rename resource '/org.eclipse.mylar.doc/doc/new-0.3.html' to 'new-0.4.0.html'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="resource://doc/new-0.3.html" name="new-0.4.0.html" stamp="1144694228115" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/4/15/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/15/refactorings.index
new file mode 100644
index 0000000..cdb746b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/15/refactorings.index
@@ -0,0 +1 @@
+1144694228115 Rename resource '/org.eclipse.mylar.doc/doc/new-0.3.html' to 'new-0.4.0.html'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/4/17/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/17/refactorings.history
new file mode 100644
index 0000000..71e153e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/17/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/new-0.4.0.html' to 'new-0.3.html' - Original element: 'new-0.4.0.html'" description="Rename resource 'new-0.4.0.html'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/new-0.4.0.html" name="new-0.3.html" stamp="1146281179258" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/new-0.5.0.html' to 'new-0.4.html' - Original element: 'new-0.5.0.html'" description="Rename resource 'new-0.5.0.html'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/new-0.5.0.html" name="new-0.4.html" stamp="1146281186558" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/4/17/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/17/refactorings.index
new file mode 100644
index 0000000..ba524c9
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/4/17/refactorings.index
@@ -0,0 +1,2 @@
+1146281179258 Rename resource 'new-0.4.0.html'
+1146281186558 Rename resource 'new-0.5.0.html'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..75d0003
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.2/chage-sets-model-based.gif' to 'changesets-model-based.gif' - Original element: 'chage-sets-model-based.gif'" description="Rename resource 'chage-sets-model-based.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.5.2/chage-sets-model-based.gif" name="changesets-model-based.gif" stamp="1148075096116" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.2/bugzilla-encodings.gif' to 'bugzilla-encodings-settings.gif' - Original element: 'bugzilla-encodings.gif'" description="Rename resource 'bugzilla-encodings.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.5.2/bugzilla-encodings.gif" name="bugzilla-encodings-settings.gif" stamp="1148083930034" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.2/repository-synch.gif' to 'repository-sync.gif' - Original element: 'repository-synch.gif'" description="Rename resource 'repository-synch.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.5.2/repository-synch.gif" name="repository-sync.gif" stamp="1148086832036" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.5.2/repository-sync.gif' to 'task-repository-sync.gif' - Original element: 'repository-sync.gif'" description="Rename resource 'repository-sync.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.5.2/repository-sync.gif" name="task-repository-sync.gif" stamp="1148086854048" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..86a6747
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1,4 @@
+1148075096116 Rename resource 'chage-sets-model-based.gif'
+1148086854048 Rename resource 'repository-sync.gif'
+1148086832036 Rename resource 'repository-synch.gif'
+1148083930034 Rename resource 'bugzilla-encodings.gif'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/5/22/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/22/refactorings.history
new file mode 100644
index 0000000..aed23c9
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/integrating' to 'integrating.html' - Original element: 'integrating'" description="Rename resource 'integrating'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/integrating" name="integrating.html" stamp="1149106149245" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/5/22/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/22/refactorings.index
new file mode 100644
index 0000000..ca45b72
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/5/22/refactorings.index
@@ -0,0 +1 @@
+1149106149245 Rename resource 'integrating'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..e696268
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/faq/changesets-model-based[1].gif' to 'changesets-model-based.gif' - Original element: 'changesets-model-based[1].gif'" description="Rename resource 'changesets-model-based[1].gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/faq/changesets-model-based[1].gif" name="changesets-model-based.gif" stamp="1150493615215" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/faq/changeset-subclipse[1].gif' to 'changeset-subclipse.gif' - Original element: 'changeset-subclipse[1].gif'" description="Rename resource 'changeset-subclipse[1].gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/faq/changeset-subclipse[1].gif" name="changeset-subclipse.gif" stamp="1150493628234" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..9bc8334
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1150493615215 Rename resource 'changesets-model-based[1].gif'
+1150493628234 Rename resource 'changeset-subclipse[1].gif'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..fac6730
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/tips/icon-task-note.gif' to 'icon-task-notes.gif' - Original element: 'icon-task-note.gif'" description="Rename resource 'icon-task-note.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/tips/icon-task-note.gif" name="icon-task-notes.gif" stamp="1153015414186" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..788ce3b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1 @@
+1153015414186 Rename resource 'icon-task-note.gif'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/7/31/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/31/refactorings.history
new file mode 100644
index 0000000..6ffe257
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/31/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.6.1/task-create-error-log.gif' to 'tasks-create-error-log.gif' - Original element: 'task-create-error-log.gif'" description="Rename resource 'task-create-error-log.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.6.1/task-create-error-log.gif" name="tasks-create-error-log.gif" stamp="1154369796803" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/7/31/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/31/refactorings.index
new file mode 100644
index 0000000..93690ce
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/7/31/refactorings.index
@@ -0,0 +1 @@
+1154369796803 Rename resource 'task-create-error-log.gif'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..54ec2a3
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.6.2/package-explorer-hierarhical.gif' to 'package-explorer-hierarchical.gif' - Original project: 'org.eclipse.mylar.doc' - Original element: 'package-explorer-hierarhical.gif'" description="Rename resource 'package-explorer-hierarhical.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.6.2/package-explorer-hierarhical.gif" name="package-explorer-hierarchical.gif" stamp="1156557871250" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.doc' - Original project: 'org.eclipse.mylar.doc' - Original element: 'package-explorer-hierarchical.gif'" description="Delete element" element1="doc/images/0.6.2/package-explorer-hierarchical.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1156558339968" subPackages="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.6.2/package-explorer-hierarchic.gif' to 'package-explorer-hierarchical.gif' - Original project: 'org.eclipse.mylar.doc' - Original element: 'package-explorer-hierarchic.gif'" description="Rename resource 'package-explorer-hierarchic.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.6.2/package-explorer-hierarchic.gif" name="package-explorer-hierarchical.gif" stamp="1156558345156" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'doc' - Original project: 'org.eclipse.mylar.doc' - Destination element: 'doc' - Original element: 'faq.html'" description="Copy file" destination="doc" element1="doc/faq.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="doc/faq.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1156563034859" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'doc' - Original project: 'org.eclipse.mylar.doc' - Destination element: 'doc' - Original element: 'new.html'" description="Copy file" destination="doc" element1="doc/new.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="doc/new.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1156563180625" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..f265106
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1,5 @@
+1156557871250 Rename resource 'package-explorer-hierarhical.gif'
+1156558339968 Delete element
+1156558345156 Rename resource 'package-explorer-hierarchic.gif'
+1156563034859 Copy file
+1156563180625 Copy file
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/9/36/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/36/refactorings.history
new file mode 100644
index 0000000..b8dd11c
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/36/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'MYLAR_NOTIFICATION_LABEL' in 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog' to 'LABEL' - Original project: 'org.eclipse.mylar.doc' - Original element: 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog.MYLAR_NOTIFICATION_LABEL' - Renamed element: 'org.eclipse.mylar.doc.internal.dialogs.UiLegendDialog.LABEL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'MYLAR_NOTIFICATION_LABEL'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.doc.internal.dialogs{UiLegendDialog.java[UiLegendDialog^MYLAR_NOTIFICATION_LABEL" name="LABEL" references="true" setter="false" stamp="1157650455312" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/9/36/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/36/refactorings.index
new file mode 100644
index 0000000..fecd562
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/36/refactorings.index
@@ -0,0 +1 @@
+1157650455312 Rename field 'MYLAR_NOTIFICATION_LABEL'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/9/39/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/39/refactorings.history
new file mode 100644
index 0000000..6ce971e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.doc/doc/images/0.7.0/mark-undread.gif' to 'task-mark-unread.gif' - Original project: 'org.eclipse.mylar.doc' - Original element: 'mark-undread.gif'" description="Rename resource 'mark-undread.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/images/0.7.0/mark-undread.gif" name="task-mark-unread.gif" stamp="1159583637077" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2006/9/39/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/39/refactorings.index
new file mode 100644
index 0000000..4037d29
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2006/9/39/refactorings.index
@@ -0,0 +1 @@
+1159583637077 Rename resource 'mark-undread.gif'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..965c52f
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 2 elements(s) to 'doc' - Original project: 'org.eclipse.mylar.doc' - Destination element: 'doc' - Original elements: new.html new-1.0.html" description="Move files" element1="doc/new.html" element2="doc/new-1.0.html" files="2" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1171683441914" target="/mylar/doc" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..3bb8408
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1 @@
+1171683441914 Move files
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..d55dbff
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.doc' - Original project: 'org.eclipse.mylar.doc' - Destination element: 'org.eclipse.mylar.doc' - Original element: 'images'" description="Move folder" destination="=org.eclipse.mylar.doc" element1="doc/images" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1180248300680" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..d434917
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1 @@
+1180248300680 Move folder
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..13c4456
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylyn.doc.internal.actions' to 'org.eclipse.mylyn.internal.help.ui.actions' - Original project: 'org.eclipse.mylyn.help.ui' - Original element: 'org.eclipse.mylyn.help.ui/src/org.eclipse.mylyn.doc.internal.actions' - Renamed element: 'org.eclipse.mylyn.help.ui/src/org.eclipse.mylyn.internal.help.ui.actions' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.doc.internal.actions'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.doc.internal.actions" name="org.eclipse.mylyn.internal.help.ui.actions" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181359216678" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.doc.internal.dialogs' to 'org.eclipse.mylyn.internal.help.ui.dialogs' - Original project: 'org.eclipse.mylyn.help.ui' - Original element: 'org.eclipse.mylyn.help.ui/src/org.eclipse.mylyn.doc.internal.dialogs' - Renamed element: 'org.eclipse.mylyn.help.ui/src/org.eclipse.mylyn.internal.help.ui.dialogs' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.doc.internal.dialogs'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.doc.internal.dialogs" name="org.eclipse.mylyn.internal.help.ui.dialogs" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181359229981" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..9aecc41
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181359216678 Rename package 'org.eclipse.mylyn.doc.internal.actions'
+1181359229981 Rename package 'org.eclipse.mylyn.doc.internal.dialogs'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..df7161e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.help.ui.dialogs.UiLegendDialog.TITLE' from expression '"Mylyn UI Legend"' - Original project: 'org.eclipse.mylyn.help.ui' - Constant name: 'TITLE' - Constant expression: '"Mylyn UI Legend"' - Declared visibility: 'private'" description="Extract constant 'TITLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.help.ui.dialogs{UiLegendDialog.java" name="TITLE" qualify="false" replace="false" selection="3189 17" stamp="1182026107217" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..ae458df
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1182026107217 Extract constant 'TITLE'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..f4368f9
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.help.ui' - Original project: 'org.eclipse.mylyn.help.ui' - Original element: 'new.html'" description="Delete element" element1="doc/new.html" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182974507121" subPackages="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.help.ui/doc/new-2.0.html' to 'new.html' - Original project: 'org.eclipse.mylyn.help.ui' - Original element: 'new-2.0.html'" description="Rename resource 'new-2.0.html'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="doc/new-2.0.html" name="new.html" stamp="1182974511045" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..be5a134
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1,2 @@
+1182974507121 Delete element
+1182974511045 Rename resource 'new-2.0.html'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..828294b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void addLegendItems(Composite composite,AbstractRepositoryConnector connector,List<ITask> elements)' from 'org.eclipse.mylyn.internal.help.ui.dialogs.UiLegendDialog.createConnectorsSection()' to 'org.eclipse.mylyn.internal.help.ui.dialogs.UiLegendDialog'
- Original project: 'org.eclipse.mylyn.help.ui'
- Method name: 'addLegendItems'
- Destination type: 'org.eclipse.mylyn.internal.help.ui.dialogs.UiLegendDialog'
- Declared visibility: 'private'" comments="false" description="Extract method 'addLegendItems'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.help.ui.dialogs{UiLegendDialog.java" name="addLegendItems" replace="false" selection="16543 1417" stamp="1210888636278" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..42b2a1c
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1 @@
+1210888636278 Extract method 'addLegendItems'
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..eb5228e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'intro'
- Original project: 'org.eclipse.mylyn.help.ui'
- Destination element: 'intro'
- Original element: 'tutorialsExtensionContent.xml'" description="Copy file" element1="intro/tutorialsExtensionContent.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213378661806" target="/org.eclipse.mylyn.java.ui/intro" units="0" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.dialogs'
- Original project: 'org.eclipse.mylyn.help.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.dialogs'
- Original elements:
 org.eclipse.mylyn.internal.help.ui.dialogs.UiLegendControl.java
 org.eclipse.mylyn.internal.help.ui.dialogs.UiLegendDialog.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.dialogs" element1="/src<org.eclipse.mylyn.internal.help.ui.dialogs{UiLegendControl.java" element2="/src<org.eclipse.mylyn.internal.help.ui.dialogs{UiLegendDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1213380653508" units="2" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.help.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.help.ui.actions.ShowMylynLegendAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.help.ui.actions{ShowMylynLegendAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1213380665602" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.help.ui'
- Original project: 'org.eclipse.mylyn.help.ui'
- Original elements:
 org.eclipse.mylyn.help.ui/src/org.eclipse.mylyn.internal.help.ui.actions
 org.eclipse.mylyn.help.ui/src/org.eclipse.mylyn.internal.help.ui.dialogs" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.help.ui.dialogs" element10="/src<org.eclipse.mylyn.internal.help" element11="/src<org.eclipse.mylyn.internal" element12="/src<org.eclipse.mylyn" element13="/src<org.eclipse" element14="/src<org" element2="/src<org.eclipse.mylyn.internal.help.ui" element3="/src<org.eclipse.mylyn.internal.help" element4="/src<org.eclipse.mylyn.internal" element5="/src<org.eclipse.mylyn" element6="/src<org.eclipse" element7="/src<org" element8="/src<org.eclipse.mylyn.internal.help.ui.actions" element9="/src<org.eclipse.mylyn.internal.help.ui" elements="14" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213380704080" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'etool16'
- Original project: 'org.eclipse.mylyn.help.ui'
- Destination element: 'etool16'
- Original element: 'icons-legend.gif'" description="Copy file" element1="icons/etool16/icons-legend.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1213380859007" target="/org.eclipse.mylyn.tasks.ui/icons/etool16" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..64a3307
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,5 @@
+1213378661806 Copy file
+1213380653508 Move compilation units
+1213380665602 Move compilation unit
+1213380704080 Delete elements
+1213380859007 Copy file
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2008/8/32/refactorings.history b/org.eclipse.mylyn.help.ui/.refactorings/2008/8/32/refactorings.history
new file mode 100644
index 0000000..0b68cf6
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2008/8/32/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.help.ui'
- Original project: 'org.eclipse.mylyn.help.ui'
- Destination element: 'org.eclipse.mylyn.help.ui'
- Original element: 'toc.xml'" description="Move file" destination="=org.eclipse.mylyn.help.ui" element1="doc/toc.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1217748325577" units="0" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.help.ui'
- Original project: 'org.eclipse.mylyn.help.ui'
- Original element: 'build-user.xml'" description="Delete element" element1="build-user.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1217748463286" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/.refactorings/2008/8/32/refactorings.index b/org.eclipse.mylyn.help.ui/.refactorings/2008/8/32/refactorings.index
new file mode 100644
index 0000000..f00c1de
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.refactorings/2008/8/32/refactorings.index
@@ -0,0 +1,2 @@
+1217748325577 Move file
+1217748463286 Delete element
diff --git a/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.help.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.help.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.help.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.help.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7134671
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.help.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ui;resolution:=optional,
+ org.eclipse.ui.forms;resolution:=optional,
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)";resolution:=optional,
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)";resolution:=optional,
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)";resolution:=optional,
+ org.apache.ant;bundle-version="1.7.0";resolution:=optional
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.internal.help.ui.anttask;x-internal:=true
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.help.ui/about.html b/org.eclipse.mylyn.help.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/build-helper.xml b/org.eclipse.mylyn.help.ui/build-helper.xml
new file mode 100644
index 0000000..2674558
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/build-helper.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.mylyn.help.ui" default="all">
+ <description>
+ Generate Eclipse help content for the Mylyn user guide
+ </description>
+
+ <property name="mylyn.help.doc.url.base" value="http://wiki.eclipse.org"/>
+ <property name="mylyn.wiki.url.base" value="${mylyn.help.doc.url.base}/Mylyn"/>
+ <property name="imageFolder" value="images"/>
+
+ <path id="tasks.classpath" path="bin"/>
+ <path id="wikitext.tasks.classpath">
+ <pathelement location="../org.eclipse.mylyn.wikitext.core/@dot"/>
+ <pathelement location="../org.eclipse.mylyn.wikitext.core/bin"/>
+ <pathelement location="../org.eclipse.mylyn.wikitext.mediawiki.core/@dot"/>
+ <pathelement location="../org.eclipse.mylyn.wikitext.mediawiki.core/bin"/>
+ </path>
+
+ <taskdef classpathref="tasks.classpath" resource="org/eclipse/mylyn/internal/help/ui/anttask/tasks.properties"/>
+ <taskdef classpathref="wikitext.tasks.classpath" resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties"/>
+
+ <target name="init">
+ <mkdir dir="tmp"/>
+ </target>
+
+ <target name="clean" depends="init">
+ <delete includeemptydirs="true" failonerror="false">
+ <fileset dir="tmp"/>
+ </delete>
+ </target>
+
+ <target name="all" depends="init" description="Generate Eclipse help content for the Mylyn user guide">
+ <eclipse-wiki-to-help
+ help.doc.filenamenoextension="Mylyn Reference"
+ help.doc.url.base="${mylyn.help.doc.url.base}"
+ help.doc.url.html="${mylyn.help.doc.url.base}/Mylyn/User_Guide"
+ help.doc.url.xml="${mylyn.help.doc.url.base}/Special:Export/Mylyn/User_Guide"
+ help.imagefolder="${imageFolder}"
+ targetfolder="userguide"
+ wiki.url.base="${mylyn.help.doc.url.base}/Mylyn"/>
+ </target>
+
+ <macrodef name="eclipse-wiki-to-help">
+ <attribute name="help.doc.url.base"/>
+ <attribute name="wiki.url.base"/>
+ <attribute name="help.doc.url.html"/>
+ <attribute name="help.doc.url.xml"/>
+ <attribute name="help.doc.filenameNoExtension"/>
+ <attribute name="help.imageFolder"/>
+ <attribute name="targetFolder"/>
+ <sequential>
+ <get dest="tmp/help.doc.xml" src="@{help.doc.url.xml}"/>
+ <get dest="tmp/help.doc.html" src="@{help.doc.url.html}"/>
+
+ <copy todir="tmp">
+ <fileset dir="images"/>
+ </copy>
+ <mediawiki-fetch-images src="tmp/help.doc.html" dest="tmp" base="@{help.doc.url.base}"/>
+
+ <xslt style="extract-markup.xsl" in="tmp/help.doc.xml" out="tmp/@{help.doc.filenameNoExtension}.mediawiki"/>
+ <echo append="true" file="tmp/@{help.doc.filenameNoExtension}.mediawiki">
+
+= Updating This Document =
+
+This document is maintained in a collaborative wiki. If you wish to update or modify this document please visit
+@{help.doc.url.html}
+ </echo>
+
+ <wikitext-to-eclipse-help markupLanguage="org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage"
+ multipleOutputFiles="true"
+ navigationImages="true"
+ helpPrefix="@{targetFolder}"
+ internallinkpattern="@{wiki.url.base}/{0}"
+ validate="true"
+ failonvalidationerror="true"
+ prependImagePrefix="${imageFolder}"
+ formatoutput="true"
+ defaultAbsoluteLinkTarget="mylyn_external">
+ <fileset dir="tmp" includes="**/*.mediawiki"/>
+ <stylesheet url="book.css"/>
+ </wikitext-to-eclipse-help>
+
+ <mkdir dir="@{targetFolder}/${imageFolder}"/>
+ <copy todir="@{targetFolder}/${imageFolder}" overwrite="true">
+ <fileset dir="tmp">
+ <include name="*.gif"/>
+ <include name="*.png"/>
+ </fileset>
+ </copy>
+ <copy todir="@{targetFolder}" overwrite="true">
+ <fileset dir="tmp">
+ <include name="*.html"/>
+ <include name="*toc.xml"/>
+ <exclude name="help.doc.html"/>
+ </fileset>
+ </copy>
+ <antcall target="test"/>
+ </sequential>
+ </macrodef>
+
+
+ <target name="test" depends="init" description="verify that all of the HTML files are well-formed XML">
+ <echo level="info">
+Validating help content XML and HTML files: The Eclipse help system expects well-formed XML
+
+If validation fails it is because either:
+
+* the userguide source code is poorly formed, or
+* the WikiText MediaWiki parser has a bug
+
+Problems with userguide source are usually caused by improper use of HTML markup in the MediaWiki source,
+or inadvertently starting a line with a space character (in MediaWiki this starts a preformatted block)
+ </echo>
+
+ <!--
+ Don't bother with DTD validation: we only care if the files are well-formed.
+ We therefore provide an empty DTD
+ -->
+ <echo file="tmp/__empty.dtd" message=""/>
+ <xmlvalidate lenient="true">
+ <fileset dir="userguide">
+ <include name="**/*.xml"/>
+ </fileset>
+ <fileset dir="userguide">
+ <include name="**/*.html"/>
+ </fileset>
+ <dtd publicid="-//W3C//DTD XHTML 1.0 Transitional//EN" location="${basedir}/tmp/__empty.dtd"/>
+ </xmlvalidate>
+ </target>
+</project>
diff --git a/org.eclipse.mylyn.help.ui/build.properties b/org.eclipse.mylyn.help.ui/build.properties
new file mode 100644
index 0000000..450ffed
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/build.properties
@@ -0,0 +1,25 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Mylyn project committers 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
+###############################################################################
+bin.includes = plugin.xml,\
+ META-INF/,\
+ doc/,\
+ about.html,\
+ .,\
+ icons/,\
+ intro/,\
+ images/,\
+ cheatsheets/,\
+ toc.xml,\
+ userguide/,\
+ plugin.properties
+src.includes = about.html
+source.. = src/
+jars.compile.order = .
+source.. = src/
+
+customBuildCallbacks=customBuildCallbacks.xml
diff --git a/org.eclipse.mylyn.help.ui/cheatsheets/Query.xml b/org.eclipse.mylyn.help.ui/cheatsheets/Query.xml
new file mode 100644
index 0000000..5c33de0
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/cheatsheets/Query.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<cheatsheet title="Create a query from bugs.eclipse.org">
+ <intro>
+ <description>
+ This cheat sheet shows you how to create a query from bugs.eclipse.org.<br/>
+ </description>
+ </intro>
+ <item title="Open the Task List view" dialog="true" skip="false">
+ <description>
+ If the Task List view is not opened, select in the main menu <b>Window > Show View > Task List</b> or click on the "Click to Perform" link below.
+ </description>
+ <command serialization="org.eclipse.ui.views.showView(org.eclipse.ui.views.showView.viewId=org.eclipse.mylyn.tasks.ui.views.tasks)" confirm="true">
+ </command>
+ </item>
+ <item title="Setup Task Repository" dialog="true" skip="true">
+ <description>
+ In this step you can learn how to setup your Bugzilla account, but you can skip it.
+<br/><br/>
+If the Task Repositories view isn't opened, select in the main menu <b>Window > Show View > Other... > Mylyn > Task Repositry</b>.
+<br/><br/>
+In the Task Repositories view you can see <b>Eclipse.org</b>. Right click on it and select <b>Properties</b>.<br/>
+Check out the <b>Anonymous Access</b> checkbox.<br/>
+Enter your user id for the <b>User ID</b> and password for the <b>Password</b>. <br/>
+Click on the <b>Validate Settings</b> button to check your given parameters.<br/>
+If you do not have an account you can register one, if you click on the <b>Create new accout</b> link.<br/>
+Click on the <b>Finish</b> button to save the values and close the dialog.
+ </description>
+ </item>
+ <item title="Create a new Query" dialog="true" skip="false">
+ <description>
+ In the Task List view, click on the right mouse button then select <b>New > Query</b> or click on the "Click to Perform" link below.
+ </description>
+ <command serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.mylyn.tasks.ui.wizards.new.query)" confirm="true">
+ </command>
+ </item>
+ <item title="Setup the query" dialog="true" skip="false">
+ <description>
+ Select <b>Eclipse.org</b> then click on the <b>Next</b> button.<br/>
+ Select <b>Create a query using form</b> then click on the <b>Next</b> button.<br/>
+ Enter <b>Mylyn bugs</b> for the query's title.
+ Select <b>Mylyn</b> from the Product and <b>P1, P2</b> from the Priority then click on the <b>Finish</b> button.
+ </description>
+ </item>
+</cheatsheet>
diff --git a/org.eclipse.mylyn.help.ui/cheatsheets/TaskFocus.xml b/org.eclipse.mylyn.help.ui/cheatsheets/TaskFocus.xml
new file mode 100644
index 0000000..6c941ff
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/cheatsheets/TaskFocus.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<cheatsheet title="Use Task-Focused UI">
+ <intro>
+ <description>
+ This cheat sheet shows you how to handle a task lifecycle and how to use task-focused UI.
+<br/>
+You need an existing project for this sheet.
+ </description>
+ </intro>
+ <item title="Open the Task List view" dialog="true" skip="false">
+ <description>
+ If the Task List view is not opened, select in the main menu <b>Window > Show View > Other... > Mylyn > Task List</b> or click on the "Click to Perform" link below.
+ </description>
+ <command serialization="org.eclipse.ui.views.showView(org.eclipse.ui.views.showView.viewId=org.eclipse.mylyn.tasks.ui.views.tasks)" confirm="true">
+ </command>
+ </item>
+ <item title="Create and activate a task" dialog="true" skip="false">
+ <description>
+ In the Task List view, click on the right mouse button, then select <b>New > Category</b>. Enter <b>Tutorials</b> for the category's name.
+<br/><br/>
+Then right click on the <b>Tutorials</b> category and select <b>New > Task</b>. In the <b>New Task</b> dialog select <b>Local</b> then click on the <b>Finish</b> button.
+ Enter <b>Learn task-focus</b> for the task's title and change the priority to <b>High</b>. You can add some notes, too.
+<br/><br/>
+Right click on the new task and select <b>Activate</b> to activate the task.
+ </description>
+ </item>
+ <item title="Focus on the task" dialog="true" skip="false">
+ <description>
+ In the <b>Package Explorer</b> the task-focus turns on automatically if you activate a task.<br/>
+You can turn on or off this function if you click on the <b>Focus on Active Task</b> toogle button in the view's toolbar.<br/>
+You can use this function in the <b>Outline</b> view too. Turn it on in this view as well.
+ </description>
+ </item>
+ <item title="Open the file" dialog="true" skip="false">
+ <description>
+ Press down the <b>Alt</b> button and click on the <b>left</b> mouse button on the <b>Package Explorer</b> view. Now you can see all of your projects in the view.
+<br/><br/>
+Next <b>Alt+click</b> on an arbitrary project and you can see the files wich are in the project.
+<br/><br/>
+With this method, select a class from the project.<br/>
+After the file is opened you can see the class both in the <b>Package Explorer</b> and in the <b>Outline</b> view.
+ </description>
+ </item>
+ <item title="Add method to focus" dialog="true" skip="false">
+ <description>
+ Select in the Editor a method then you can see this method in the <b>Outline</b> view and in the <b>Package Explorer</b> under the class file.
+<br/><br/>
+Next press the Alt button and click on the class in the <b>Outline</b> view.<br/>
+Now you can see all methods. Methods which aren't in the focus are in <b>grey</b> color. Select another method from the list. After that all methods will disappear which aren't in the focus.
+ </description>
+ </item>
+ <item title="Landmark" dialog="true" skip="false">
+ <description>
+ If an element's interest rank is high enough, it becomes a landmark, which is an implicitly created bookmark. Landmarks are showed in bold font.
+<br/><br/>
+Select the a method in the <b>Outline</b> view or in the <b>Package Explorer</b>. Right click on the method and select <b>Mark as Landmark</b>. After then this method becomes a landmark.
+<br/><br/>
+Also you can use key bindings. <b>Ctrl+Shift+Alt+UpArrow</b> to mark the element as landmark or <b>Ctrl+Shift+Alt+DownArrow</b> to mark less interesting for the element.
+ </description>
+ </item>
+ <item title="Remove method from focus" dialog="true" skip="false">
+ <description>
+ Right click on a method which is in the focus and select <b>Remove from Focus</b>. After then this method will disappear from the list.
+ </description>
+ </item>
+ <item title="Open another file" dialog="true" skip="false">
+ <description>
+ Press down the <b>Alt</b> button and <b>click</b> on the <b>project</b>. Select an arbitrary file from the list with <b>Alt+click</b>. After you open the new file you can see it in the focus and all files will disappear which aren't in the focus.
+<br/>
+You can use <b>Alt+RightArrow</b> instead of <b>Alt+click</b>.
+ </description>
+ </item>
+ <item title="Quick Context View" dialog="true" skip="false">
+ <description>
+ Press down <b>Ctrl+Shift+Alt+RightArrow</b> buttons, then you can see all elements which are in the focus.
+ </description>
+ </item>
+ <item title="Complete task" dialog="true" skip="false">
+ <description>
+ In the Task List view, click on the right mouse button on the <b>Learn task-focus</b> task and select deactivate.
+<br/>
+Click again on the task with the right mouse button and select <b>Mark > Complete</b>. <br/>
+After then the task's name will be struck through.
+ </description>
+ </item>
+</cheatsheet>
diff --git a/org.eclipse.mylyn.help.ui/customBuildCallbacks.xml b/org.eclipse.mylyn.help.ui/customBuildCallbacks.xml
new file mode 100644
index 0000000..53cc6be
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/customBuildCallbacks.xml
@@ -0,0 +1,161 @@
+<!-- ===================================================================== -->
+<!-- Custom targets called from a project's generated build.xml -->
+<!-- Set customBuildCallbacks=<path/to/this/file> in your build.properties.-->
+<!-- ===================================================================== -->
+<project name="Build specific targets and properties" default="noDefault">
+
+ <!-- ===================================================================== -->
+ <!-- Default target -->
+ <!-- ===================================================================== -->
+ <target name="noDefault">
+ <echo message="This file must be called with explicit targets" />
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.jars">
+ <!-- automatic generation of the user guide is disabled, see bug 242979
+ <ant antfile="build-helper.xml" target="all"/>
+ -->
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.jars">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="pre.name">
+ </target>
+
+ <target name="pre. at dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do during the compilation target <name>, after the compile -->
+ <!-- but before jaring. Substitute "name" with the name of the compilation-->
+ <!-- target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.compile.name">
+ </target>
+
+ <target name="post.compile. at dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- jar.location - the location of the compilation results -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.name">
+ </target>
+
+ <target name="post. at dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target clean -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.clean">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target clean -->
+ <!-- Available parameters : -->
+ <!-- plugin.destination - final destination of the build -->
+ <!-- build.result.folder - results of the compilation -->
+ <!-- temp.folder - temporary folder -->
+ <!-- ===================================================================== -->
+ <target name="post.clean">
+ </target>
+</project>
diff --git a/org.eclipse.mylyn.help.ui/doc/book.css b/org.eclipse.mylyn.help.ui/doc/book.css
new file mode 100644
index 0000000..faa4199
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0/ui-legend.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0/ui-legend.gif
new file mode 100644
index 0000000..6778787
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0/ui-legend.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0/welcome.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0/welcome.gif
new file mode 100644
index 0000000..3fe38ce
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0/welcome.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0/working-sets-edit.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0/working-sets-edit.gif
new file mode 100644
index 0000000..d33b015
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0/working-sets-edit.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0/working-sets-switch.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0/working-sets-switch.gif
new file mode 100644
index 0000000..986cdae
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0/working-sets-switch.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M1/bugzilla-local-users.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/bugzilla-local-users.gif
new file mode 100644
index 0000000..a81f8f0
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/bugzilla-local-users.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M1/bugzilla-time-tracking.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/bugzilla-time-tracking.gif
new file mode 100644
index 0000000..2e947ea
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/bugzilla-time-tracking.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M1/java-editor-hyperlink.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/java-editor-hyperlink.gif
new file mode 100644
index 0000000..0b5b392
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/java-editor-hyperlink.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M1/jira-editor-hyperlink.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/jira-editor-hyperlink.gif
new file mode 100644
index 0000000..cbbf011
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/jira-editor-hyperlink.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M1/task-context-editor.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/task-context-editor.gif
new file mode 100644
index 0000000..d7e9eea
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/task-context-editor.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M1/task-editor-progress.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/task-editor-progress.gif
new file mode 100644
index 0000000..2ed5c86
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M1/task-editor-progress.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/bugzilla-due-dates.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/bugzilla-due-dates.gif
new file mode 100644
index 0000000..7218936
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/bugzilla-due-dates.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/context-apply-attachments.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/context-apply-attachments.gif
new file mode 100644
index 0000000..2313d4d
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/context-apply-attachments.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/context-quick-view.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/context-quick-view.gif
new file mode 100644
index 0000000..1a96ed3
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/context-quick-view.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/hyperlinks-text.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/hyperlinks-text.gif
new file mode 100644
index 0000000..319712a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/hyperlinks-text.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/jira-java-hyperlinks.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/jira-java-hyperlinks.gif
new file mode 100644
index 0000000..b0f02ff
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/jira-java-hyperlinks.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/repository-settings-proxy.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/repository-settings-proxy.gif
new file mode 100644
index 0000000..1d4fd8d
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/repository-settings-proxy.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/synchronize-view-add.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/synchronize-view-add.gif
new file mode 100644
index 0000000..011daf2
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/synchronize-view-add.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/task-editor-warning.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/task-editor-warning.gif
new file mode 100644
index 0000000..14b638e
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/task-editor-warning.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/tasklist-schedule.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/tasklist-schedule.gif
new file mode 100644
index 0000000..babced6
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/tasklist-schedule.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M2/trac-hyperlinks.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/trac-hyperlinks.gif
new file mode 100644
index 0000000..ff8c1d1
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M2/trac-hyperlinks.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/annotation-hyperlinks.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/annotation-hyperlinks.gif
new file mode 100644
index 0000000..b62aeaa
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/annotation-hyperlinks.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/bugzilla-subtasks.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/bugzilla-subtasks.gif
new file mode 100644
index 0000000..f5043b0
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/bugzilla-subtasks.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/jira-attachments.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/jira-attachments.gif
new file mode 100644
index 0000000..fbb0aa9
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/jira-attachments.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/task-editor-error.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/task-editor-error.gif
new file mode 100644
index 0000000..38d20f8
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/task-editor-error.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/task-tooltip-incoming.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/task-tooltip-incoming.gif
new file mode 100644
index 0000000..3392eff
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/task-tooltip-incoming.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasklist-tree.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasklist-tree.gif
new file mode 100644
index 0000000..e80931f
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasklist-tree.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasks-content-assist.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasks-content-assist.gif
new file mode 100644
index 0000000..169ae90
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasks-content-assist.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasks-working-sets.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasks-working-sets.gif
new file mode 100644
index 0000000..6030cbc
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/tasks-working-sets.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/team-hyperlinks-annotations.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/team-hyperlinks-annotations.gif
new file mode 100644
index 0000000..d3e8c8d
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/team-hyperlinks-annotations.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/team-hyperlinks-history.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/team-hyperlinks-history.gif
new file mode 100644
index 0000000..e9888c2
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/team-hyperlinks-history.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/ui-legend-connectors.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/ui-legend-connectors.gif
new file mode 100644
index 0000000..696ef1e
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/ui-legend-connectors.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.0M3/ui-usage-report.gif b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/ui-usage-report.gif
new file mode 100644
index 0000000..c7402cb
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.0M3/ui-usage-report.gif differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-cached-config.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-cached-config.png
new file mode 100644
index 0000000..9bfa3a3
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-cached-config.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-custom-resolutions.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-custom-resolutions.png
new file mode 100644
index 0000000..6f77eda
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-custom-resolutions.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-search-keywords.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-search-keywords.png
new file mode 100644
index 0000000..bcac354
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/bugzilla-search-keywords.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/screenshot-capture.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/screenshot-capture.png
new file mode 100644
index 0000000..66e35cd
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/screenshot-capture.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/spelling-corrections.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/spelling-corrections.png
new file mode 100644
index 0000000..8f90c06
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/spelling-corrections.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/task-editor-hyperlinks.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/task-editor-hyperlinks.png
new file mode 100644
index 0000000..df97d0f
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/task-editor-hyperlinks.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/2.1M1/tasklist-search.png b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/tasklist-search.png
new file mode 100644
index 0000000..08acba8
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/2.1M1/tasklist-search.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/images/mylyn-2.0.png b/org.eclipse.mylyn.help.ui/doc/images/mylyn-2.0.png
new file mode 100644
index 0000000..566b2eb
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/doc/images/mylyn-2.0.png differ
diff --git a/org.eclipse.mylyn.help.ui/doc/new.html b/org.eclipse.mylyn.help.ui/doc/new.html
new file mode 100644
index 0000000..0e8fa9b
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/new.html
@@ -0,0 +1,916 @@
+<html>
+<body bgcolor="FFFFFF">
+
+<p><b><a href="http://www.eclipse.org/mylyn/new/">The up-to-date New &
+Noteworthy for Mylyn 2.3 is available online</a>
+ </b>along with other Mylyn documentation.</p>
+
+<table border="1" style="border-collapse: collapse" width="100%" id="table128" cellpadding="4" bordercolor="#FFFFFF">
+ <tr>
+ <td bgcolor="#595791" width="7%" align="center"><b>
+ <font color="#FFFFFF" size="1">Release</font></b></td>
+ <td bgcolor="#595791" width="5%" align="center"><b>
+ <font color="#FFFFFF" size="1">Resolved
+ </font></b></td>
+ <td bgcolor="#595791" width="*" align="center"><b>
+ <font color="#FFFFFF" size="1">Community Contributions</font></b></td>
+ </tr>
+ <tr>
+ <td bgcolor="#E0D0E6"><font size="1">2.3<br>
+ <i>Feb 27, 2008</i></font></td>
+ <td bgcolor="#E0D0E6" align="center">
+ <a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&classification=Tools&product=Mylyn&component=Bugzilla&component=Core&component=Doc&component=Java&component=Jira&component=Monitor&component=Tasks&component=Trac&component=UI&component=Web&component=XML&component=XPlanner&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=2007-12-21&chfieldto=2008-02-28&chfield=resolution&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=">
+ <font size="1"><i>384</i></font></a></td>
+ <td bgcolor="#E0D0E6"><font size="1">David Green helped with task editor layout performance</font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#FAF7FB"><font size="1">2.2<br>
+ <i>Dec 19, 2007</i></font></td>
+ <td bgcolor="#FAF7FB" align="center">
+ <a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&classification=Tools&product=Mylyn&component=Bugzilla&component=Core&component=Doc&component=Java&component=Jira&component=Monitor&component=Tasks&component=Trac&component=UI&component=Web&component=XML&component=XPlanner&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=2007-09-29&chfieldto=2007-12-20&chfield=resolution&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=">
+ <font size="1"><i>384</i></font></a><i><a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&classification=Tools&product=Mylyn&component=Bugzilla&component=Core&component=Doc&component=Java&component=Jira&component=Monitor&component=Tasks&component=Trac&component=UI&component=Web&component=XML&component=XPlanner&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=2007-09-29&chfieldto=2007-12-20&chfield=resolution&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0="><br><font size="1">bugs</font></a></i></td>
+ <td bgcolor="#FAF7FB"><font size="1">Frank Becker resolved a total of 19
+ bugs with Bugzilla and the task editor. Willian Mitsuda contributed to
+ screenshot capture and provided several other improvements. Maarten
+ Meijer provided performance improvements and tests. Shawn Minto provided
+ task context and UI fixes. Benjamin Pasero provided the
+ notification popup shell rendering. Additional useful contributions, fixes
+ and patches were provided by Helen Bershadskaya, Leo Dos Santos, Michael
+ Valenta, Kevin Bracey, Chris Aniszczyk, George Lindholm, Jakum
+ Jurkiewicz, Ketan Padegoankar and Nathan Hapke.</font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#FAF7FB"><font size="1">2.1<br>
+ <i>Sep 28, 2007</i></font></td>
+ <td bgcolor="#FAF7FB" align="center">
+ <a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&classification=Tools&product=Mylyn&component=Bugzilla&component=Core&component=Doc&component=Java&component=Jira&component=Monitor&component=Tasks&component=Trac&component=UI&component=Web&component=XML&component=XPlanner&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=2007-08-29&chfieldto=2007-09-28&chfield=resolution&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=">
+ <font size="1">167</font><br><font size="1">bugs</font></a></td>
+ <td bgcolor="#FAF7FB"><font size="1">Jevgeni Holodkov added new import
+ and export functionality. Shawn Minto provided several fixes for the
+ Task List. Maarten Meijer added task cloning support. Helen
+ Bershadskaya improved the XPlanner connector and Leo Dos Santos fixed
+ export for Mac.</font></td>
+ </tr>
+ <tr>
+ <td bgcolor="#FAF7FB"><font size="1">2.1M<br>
+ <i>Aug 27, 2007</i></font></td>
+ <td bgcolor="#FAF7FB" align="center">
+ <a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&short_desc_type=allwordssubstr&short_desc=&classification=Tools&product=Mylyn&component=Bugzilla&component=Core&component=Doc&component=Java&component=Jira&component=Monitor&component=Tasks&component=Trac&component=UI&component=Web&component=XML&component=XPlanner&long_desc_type=allwordssubstr&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&votes=&chfieldfrom=2007-07-01&chfieldto=2007-08-28&chfield=resolution&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=">
+ <font size="1">295</font><br><font size="1">bugs</font></a></td>
+ <td bgcolor="#FAF7FB"><font size="1">Balazs Brinkus contributed the
+ screenshot attachment and provided new user experience improvements.
+ Xiaoyang Guan provided prototype wiki integration for Trac. Frank
+ Becker provided numerous improvements including custom resolutions for
+ Bugzilla. Jevgeni Holodkov contributed prototype task and query import
+ export facilities. Helen Bershadskaya contributed several XPlanner
+ connector improvements including the new task editor. Raphael Ackermann
+ provided several improvements including spell checking in task
+ summaries. Shawn Minto provided over a dozen useful bug fixes.
+ Additional useful patches were provided by George Lindholm, Leo Dos
+ Santos, Maarten Meijer, Toomas Romer, David Green, Willian Mitsuda,
+ Meghan Allen and Jacek Pospychala.</font></td>
+ </tr>
+ </table>
+
+<p><b>Also see the New & Noteworthy for:
+<a href="http://eclipse.org/mylyn/new/new-2.0.html">Mylyn 2.0</a>,
+<a href="http://eclipse.org/mylyn/new/new-1.0.html">Mylyn 1.0-0.6</a>, <a href="http://eclipse.org/mylyn/new/new-0.5.html">
+Mylyn 0.5</a>,
+<a href="http://eclipse.org/mylyn/new/new-0.4.html">Mylyn 0.4</a>, <a href="http://eclipse.org/mylyn/new/new-0.3.html">
+Mylyn 0.3</a></b></p>
+<p><b>Updating</b>: If using a version prior to 2.0, must upgrade to 2.0
+before installing Mylyn 2.2.</p>
+
+<!--
+
+<p><b>Update Notes</b> <br>
+ - We recommend using the Eclipse 3.3M7 release due to the
+numerous UI improvements (see Eclipse 3.3 only items below).<br>
+ - 2.0M2 and later releases will reset your task activity
+timings (Mylyn now uses a new and much more robust timing mechanism).<br>
+ - The offline task data cache will be reset, so submit outgoing changes before
+ updating.<br>
+ - If upgrading from a 0.x version, first update to Mylyn 1.0
+and see the corresponding <a href="http://eclipse.org/mylyn/doc/new-1.0.html">
+update notes</a>.<br>
+ - Trac xml-rpc users: you will
+<a href="http://wiki.eclipse.org/index.php/Mylyn_FAQ#Trac_Connector">need the
+latest</a> XmlRpcPlugin.<br> </p>
+
+<p><b>Mylar -> Mylyn Migration</b></p>
+<ul>
+ <li>No uninstall necessary during the update, the old plug-ins will
+ automatically be disabled.</li>
+ <li>Can delete all old plug-ins/features either manually or via the Update
+ Manager.</li>
+ <li>All Mylyn preferences will need to be reset. If you set a custom
+ data directory this will need to be reset on start.</li>
+ <li>Project to Task Repository associations will need to be reset.</li>
+</ul>
+<p><b>UI Cleanup</b></p>
+<p>The following things have moved into the Sandbox either because they are not
+at the 2.0 quality level or because they are experimental features.</p>
+<ul>
+ <li>Pause Context Capture</li>
+ <li>Active Task on open</li>
+ <li>Synchronize view style overlays</li>
+ <li>Task Activity report</li>
+ <li>Legend moved to view menu</li>
+</ul>
+-->
+<hr>
+
+<table cellpadding="10" cellspacing="0" id="table392">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#E0D0E6>
+ <p align="right"><b>IN PROGRESS</b></p>
+ </td>
+ <td valign="top" width="70%">
+ Need UI review:<ul>
+ <li>Revised task scheduling</li>
+ <li>Reversing of comment ordering</li>
+ <li>Minor: report as bug includes sub-entries if present</li>
+ <li>JIRA: wiki markup supported</li>
+ <li>Focusing of All Markers view is supported (should we
+ suppress showing empty grouping nodes?)</li>
+ <li>Attachment can be compared (add icon?)</li>
+ <li>Screenshot markup and preview</li>
+ <li>Linking with editor improved</li>
+ </ul>
+ <p>Done:</p>
+ <ul>
+ <li>Major Task Editor performance improvements, especially for
+ editor open</li>
+ <li>Warnings when attempting to commit resources across task
+ repositories</li>
+ <li>Strikethrough fonts for dependent bugs and in task editor
+ comments</li>
+ <li>Bugzilla: improved synchronization performance</li>
+ <li>Bugzilla: query on multiple email fields</li>
+ <li>Task Search: groupings show number [should we make this show
+ up in lighter color?]</li>
+ <li>Local tasks can be promoted to repository tasks via clone</li>
+ <li>Bugzilla: file sizes are shown</li>
+ </ul>
+ <p>XPlanner:</p>
+ <ul>
+ <li>The XPlanner connector now allows using Mylyn's automatic
+ time tracking to be incorporated in the actual time setting for
+ an XPlanner task. The XPlanner Task editor actions section has a
+ checkbox that allows the user to turn automatic time tracking on
+ or off (default is off). There are also options for allowing the
+ automatically tracked time to be added to or replace the current
+ actual time (default is adding -- actual update is done when the
+ Submit button is pressed), and rounding the automatically
+ tracked time to the nearest half hour (default is to round). The
+ user still has the option of putting in actual time manually,
+ however, if automatic actual time tracking is enabled, the last
+ entered user value will be overridden with the latest tracked
+ time.<br>
+ <a href="https://bugs.eclipse.org/bugs/attachment.cgi?id=87934">
+ https://bugs.eclipse.org/bugs/attachment.cgi?id=87934</a> </li>
+ </ul>
+ </td>
+ </tr>
+</table>
+
+<p>See <span style="background-color: #E0D0E6">what's new</span> for: </p>
+<ul>
+ <li><a href="#task-list">Task List</a></li>
+ <li><a href="#task-editor">Task Editor</a></li>
+ <li><a href="#focused-ui">Task-Focused UI</a></li>
+ <li><a href="#bugzilla">Bugzilla Connector</a></li>
+ <li><a href="#trac">Trac Connector</a></li>
+ <li><a href="#jira">JIRA Connector</a></li>
+</ul>
+<h2><a name="task-list">Task List</a><br>
+ </h2>
+
+<table cellpadding="10" cellspacing="0" id="table393">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#E0D0E6>
+ <p align="right"><b>...</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">...</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/tasklist-archive.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table380">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Task Archive is Gone</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">The problematic <i>Archive </i>category is finally
+ gone. It has been replaced by<i> Unmatched </i>containers,
+ which will contain every task that you have accessed, but that's not
+ currently matched by a query or has not been added to a category.
+ If you notice a large number of tasks in an<i> Unmatched</i>
+ container, you have the following options:</p>
+ <ul>
+ <li>
+ <p align="left">Update your queries so that the unmatched tasks
+ are matched by a query. For example, if querying per
+ person, we recommend including all closed tasks so that these
+ don't drop into the <i>Unmatched</i> container.</p></li>
+ <li>
+ <p align="left">Delete tasks from the <i>Unmatched</i>
+ container. These will be permanently removed from the <i>
+ Task List</i> and will not participate in synchronization.</p>
+ </li>
+ </ul>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/tasklist-archive.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table376">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>New Notification Popups</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">The rendering of the notification popups has been
+ improved, and on Eclipse 3.4 the popups fade into and out of view
+ (Compositing window manager required on Linux). The popups can
+ be interacted with and will not disappear when the mouse is over
+ them. Click the incoming arrow to mark the task read, or the
+ hyperlink to open the task. </p><p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/tasklist-notification.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table378">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Create Task from JUnit Failure</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">A new task can be created from a JUnit test failure.
+ The failure trace will populate the description of the task.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/task-from-junit.png"><p class="MsoPlainText">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table379">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Easier Working Set Creation</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">Mylyn's task and resource working sets can now be
+ created and edited more easily if you map projects to task
+ repositories (<i>Project -> Properties -> Task Repository</i>).
+ In the screenshot below, we see that every Mylyn project is
+ associated with the Eclipse task repository, and that all Mylyn
+ projects can be added to the "Mylyn" working set with a single
+ click.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/working-set-creation.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table382">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Open Task Dialog Improved</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">The filtering, layout and performance of the <i>Open
+ Task</i> (Ctrl+F12) dialog have been improved.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/open-task.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table383">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Search Results Grouping by Owner</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">Task search results can now be grouped by owner, via
+ the popup menu in the <i>Search</i> view. </p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/search-grouping.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table377">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Task Navigation Key Bindings</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">The Task List now provides
+ <a href="http://wiki.eclipse.org/Mylyn_User_Guide#Keybindings">
+ additional key bindings</a> for task reading and navigation.</p></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table365">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Subtask Improvements</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Support for subtasks has been improved and
+ is now on by default for all connectors including Bugzilla.
+ Note that for Bugzilla the "depends on" attribute is used for
+ subtask grouping.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/subtasks-option.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table367">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Import, Export and Cloning</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">In addition to being able to Import/Export
+ your entire<i> Task List</i>, individual tasks and queries can now
+ be imported and exported to a zip file. Exported tasks will
+ include task contexts, and importing a repository task or query will
+ automatically import the corresponding<i> Task Repository</i> if it
+ does not exist. Import and Export can also be performed via
+ drag-and-drop to and from external windows. <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/tasklist-import-export.png"><p class="MsoPlainText">
+ Both tasks and queries can now be cloned. Cloning of queries
+ allows you to easily modify an existing query. Cloning of
+ tasks will bring up a new <i>Task Editor </i>that contains
+ information about the task being cloned. Note that this can be
+ done across repositories (e.g., from Bugzilla to JIRA,
+ as visible below).<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/tasks-clone.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table371">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Popup Menu Improvements</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">The <i>Schedule for</i> menu now uses <i>Not
+ Scheduled</i> instead of <i>Clear</i> action so that it can indicate
+ when a task has not been scheduled. The <i>New</i> menu now provides
+ a shortcut for creating local tasks without a wizard. The
+ keyboard shortcut creating new local tasks is the Insert key on Platforms that
+ support it, or Alt+Shift+N, T on all platforms (note that this might
+ require resetting the <i>Perspective</i> in order to see the new
+ Mylyn actions). </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table355">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Open Repository Tasks</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">The opening of repository tasks has been
+ streamlined and integrated into the top of the <i>Task Search</i> (Ctrl+H)
+ dialog, and facilitates opening tasks that are not in the <i>
+ Task List</i> by their key/ID. Entering text into the<i> Find</i> box of the <i>
+ Task List</i> will cause a hyperlink to the search dialog to appear
+ just below the box.
+ If the contents of the <i>Find</i> box look like a task key/ID, they
+ will be used to populate
+ the <i>Task Search</i> dialog. The Ctrl+Shift+F12 shortcut can
+ also be used to invoke this action, and will additionally inspect the contents of
+ the clipboard to look for a task key/ID to populate the <i>Task Search</i>
+ dialog with. The Ctrl+F12 <i>Open Task</i> dialog also
+ provides a link to the <i>Task Search </i>page. <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/tasklist-search.png" width="531" height="341"><p class="MsoPlainText">
+ Note that off a task
+ is selected in the active editor or the <i>Task List,</i> the repository in the <i>Search </i>dialog
+ will be now automatically set to the corresponding repository,
+ otherwise the previous repository will be used.
+ The previous <i>Open Repository Task</i> dialog, disabled by default
+ in Mylyn 2.0, can still be accessed via Ctrl+Shift+F12. Since
+ the new functionality replaces this dialog the plan is to remove the
+ old dialog for Mylyn 2.1 (see
+ <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=193423">bug
+ 193423</a>).</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<h2> </h2>
+<h2><a name="task-editor">Task Editor</a></h2>
+
+<table cellpadding="10" cellspacing="0" id="table390">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Create Task from Text Selection</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">A new task can be created from any selection in the
+ task editor.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/task-from-comment.png"><p class="MsoPlainText">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table385">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Comment Coloring</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">Quoted comments are colored to make them stand out
+ from other comment text.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/comment-coloring.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table384">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Screenshot Capture Improved</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">Screenshot capture has been improved, and now uses a
+ non-modal wizard, so that you can interact with Eclipse in order to
+ prepare the screenshot. In order to attach a screenshot to a
+ repository task, use <i>Task Editor -> Attachments -> Attach File...
+ </i>and choose <i>Screenshot</i> as the attachment source.
+ You can then use the <i>Capture</i> button one or more times in
+ order to grab your entire desktop. In order to only submit a
+ part of the desktop, create a crop rectangle by dragging the mouse,
+ then submit the screenshot. Use the<i> Fit image </i>button in
+ order to zoom in to see the screenshot at its native resolution.
+ Screenshots are attached in the JPEG format.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/screenshot-capture.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table357">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Spelling Proposals</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Spelling proposals and dictionary additions
+ can now be invoked via Ctrl+1 in the <i>Task Editor</i>.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/spelling-corrections.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table359">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Hyperlink Hovers</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Hyperlink hovers showing task descriptions
+ are now available in more places than previously, including in the
+ <i>New Comment</i> area of the task editor. Hyperlinks are now
+ available from task summary fields, along with spell checking.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/task-editor-hyperlinks.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<p class="MsoPlainText"> </p>
+<h2><a name="focused-ui">Task-Focused UI</a></h2>
+
+<table cellpadding="10" cellspacing="0" id="table373">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Task Context</b></p>
+ </td>
+ <td valign="top" width="70%">
+ The slider <i>Context</i> tab on the Task Editor can now be used to
+ view all elements still present in the workspace that have at any
+ point been a part of the task context. This can be useful for
+ pruning the task context before sharing it, for example, in order to
+ remove private files that have been accessed. In addition,
+ removing large numbers of elements from the task context is now
+ instant.
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/context-slider.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table375">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Focus for Bookmarks</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">The <i>Bookmarks</i> view now has a <i>Focus on
+ Active Task</i> action, along with the two other Eclipse views that
+ show markers (<i>Problems</i> and <i>Tasks</i>).</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/focus-bookmarks.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table389">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Commit Comment Templates</b></p>
+ </td>
+ <td valign="top" width="70%">
+ In addition to being configurable globally for the workspace (<i>Preferences
+ -> Mylyn -> Team</i>), commit comment templates can now be
+ configured per-project and checked in to source control.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/team-templates-project.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table374">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Alt+click Navigation</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">
+ <a href="http://wiki.eclipse.org/Mylyn_User_Guide#Alt.2BClick_navigation">
+ Alt+click navigation</a>, used for quick access to filtered items,
+ now supports Ctrl+clicking items to bring multiple items into the
+ task context. Additional improvements include support for
+ single click to make the temporarily unfiltered items to disappear,
+ and Alt+click then double-click for quickly opening files.</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table369">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Alt+click and Popup Menu Improvements</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Since the
+ <a href="http://wiki.eclipse.org/index.php/Mylyn_User_Guide#Alt.2BClick_navigation">
+ Alt+click navigation</a> mechanism is a new concept and has not been
+ discoverable enough, showing the filtered children of an element can now be invoked via the popup
+ menu as well. Note that this action is only visible when a
+ task is active. It is currently limited to Java elements. <p class="MsoPlainText">In addition, the <i>Remove from Context</i> and <i>Mark as Landmark</i>
+ actions have moved to a more appropriate position in the popup menu,
+ and will only show when a task is active, and only on the elements
+ that they can be applied to. For example, a project cannot be made a
+ landmark, and as visible below no longer shows this action. <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/show-filtered.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table370">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Filtering and Linking Management</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">When a view is focused on the active task,
+ it's manual linking and filtering facilities get disabled.
+ This is now made explicit in the UI of views including the <i>Package
+ Explorer</i>, <i>Project Explorer</i> and <i>Navigator </i>by the
+ corresponding actions getting grayed out. Doing so also ensures
+ that the view cannot be put into an inconsistent state by having
+ some of it's filters enabled when in Focused mode. When Focus
+ is toggled off or the task is deactivated the manual linking and
+ filtering will be re-enabled and restored to their previous state.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/focus-linking-disable.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table368">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Editor Management Configuration</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">A frequent new user confusion of the
+ Task-Focused UI was the fact that files are automatically removed
+ from the task context when they are closed. This facility will now
+ show a popup the first time it is invoked, and prompt that it can disabled
+ via the preferences. Previously it could only be disabled by
+ disabling all editor management (which restores
+ editors and ensures that elements whose interest had decayed have
+ their editors closed, preventing open editor bloat). However,
+ removing files from context on close is still recommended because it
+ ensures that the open editors match the task context.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/context-preferences.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<h2> </h2>
+
+<h2><a name="bugzilla">Bugzilla Connector</a></h2>
+
+<table cellpadding="10" cellspacing="0" id="table381">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Subtask Creation</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p align="left">Subtasks can be created from the editor's toolbar,
+ bypassing the new task creation wizard.</p>
+ <p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/bugzilla-subtasks.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table386">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Support for Real Names</b></p>
+ </td>
+ <td valign="top" width="70%">
+ Real names are now support for Bugzilla versions of 3.0 and later.
+ Hover over the name to see the email address.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/bugzilla-real-names.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table361">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Custom Resolutions</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Custom resolutions are now supported by the
+ <i>Task Editor</i>.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/bugzilla-custom-resolutions.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table358">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Keyword Search</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Bugzilla Search now supports keywords,
+ invoked via the <i>Select...</i> button visible below.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/bugzilla-search-keywords.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table360">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Configuration Caching</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">If
+ <a href="http://wiki.eclipse.org/Mylyn_User_Guide#Tips_for_server_administrators">
+ supported by the server</a>, the Bugzilla configuration is retrieved
+ from a cached copy. This can significantly reduce network
+ traffic on very large repositories such as bugs.eclipse.org.</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<p class="MsoPlainText"> </p>
+<h2><a name="trac">Trac Connector</a></h2>
+
+<table cellpadding="10" cellspacing="0" id="table362">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Wiki Formatting</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Trac comments can be created with wiki
+ markup and previewed before submission. When preview use the
+ <i>Edit</i> button to switch back into plain text editing mode.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/trac-wiki-preview.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<p class="MsoPlainText"> </p>
+<h2><a name="jira">JIRA Connector</a></h2>
+
+<table cellpadding="10" cellspacing="0" id="table388">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Change Assignee on Creation</b></p>
+ </td>
+ <td valign="top" width="70%">
+ Issue assignees can be set on creation. Use the Ctrl+Space
+ content assist to choose from assignees.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/jira-assign.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table391">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Password Prompting</b></p>
+ </td>
+ <td valign="top" width="70%">
+ If a Trac or JIRA repository is missing a password, but a
+ synchronization is requested, a dialog will pop up. In
+ addition, storing the password is now optional.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.2/password-prompting.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" id="table366">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>Subtask Creation</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">Support for JIRA subtasks has been improved,
+ and these can be created both from the<i> Task Editor</i> toolbar.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/jira-subtask-create-editor.png"><p class="MsoPlainText">
+ and from the popup menu in the <i>Task List</i>:<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1/jira-subtask-create.png"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<p class="MsoPlainText"> </p>
+<h2><a name="xplanner">XPlanner Connector</a></h2>
+
+<table cellpadding="10" cellspacing="0" id="table356">
+ <tr>
+ <td align="left" valign="top" width="15%" bgcolor=#FAF7FB>
+ <p align="right"><b>New Task Editor</b></p>
+ </td>
+ <td valign="top" width="70%">
+ <p class="MsoPlainText">The XPlanner connector now provides a rich
+ editor for creating new tasks.<p class="MsoPlainText">
+ <img border="0" src="../../mylyn/new/images/2.1M1/xplanner-new-task-editor.jpg"></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/doc/notices.html b/org.eclipse.mylyn.help.ui/doc/notices.html
new file mode 100644
index 0000000..99a80e5
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/notices.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+
+<meta name="copyright" content="Copyright (c) 2004, 2008 Mylyn project committers and others. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <LINK REL="STYLESHEET" HREF="book.css" CHARSET="ISO-8859-1" TYPE="text/css">
+ <title>Legal Notices</title>
+</head>
+<body>
+
+<h3>
+<a NAME="Notices"></a>Notices</h3>
+<p>
+The material in this guide is Copyright (c) 2004, 2008 Mylyn project committers and others.
+</p>
+<p>
+<a href="../about.html">Terms and conditions regarding the use of this guide.</a>
+</p>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.help.ui/doc/overview.html b/org.eclipse.mylyn.help.ui/doc/overview.html
new file mode 100644
index 0000000..7c81f1e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/doc/overview.html
@@ -0,0 +1,63 @@
+<html>
+<head>
+<meta name="copyright"
+ content="Copyright (c) IBM Corporation and others 2000, 2007. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page.">
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<style>
+td {
+ border-top: solid thin black;
+}
+
+img[alt] {
+ background-color: #ffdddd;
+}
+
+tr {
+ vertical-align: top;
+}
+</style>
+<title>Mylyn Overview</title>
+<script language="JavaScript"
+ src="PLUGINS_ROOT/org.eclipse.help/livehelp.js"> </script>
+</head>
+
+<body>
+
+<h2>Mylyn Overview</h2>
+
+<p>Mylyn documentation is available online at: <b>
+<a href="http://eclipse.org/mylyn/start/">http://eclipse.org/mylyn/start</a>
+</b></p>
+<p>The New & Noteworthy for Mylyn 2.3 is at: <b>
+<a href="http://www.eclipse.org/mylyn/new">http://eclipse.org/mylyn/new</a> </b> </p>
+<p>Mylyn is a task-focused UI for Eclipse that makes working with very large
+workspaces as easy as working with small ones. Mylyn extends Eclipse with rich
+facilities for keeping track of the tasks that you work and collaborate on. A
+task is defined as any unit of work that you want to recall or share with
+others, such as a bug reported by a user or a note to yourself about improving a
+feature. You can store tasks locally in your workspace, or they can come from
+one or more task repositories. To connect to a task repository, for example a
+bug tracker such as Bugzilla, you must have a connector that supports that
+repository. </p>
+<p>Once your tasks are integrated, Mylyn monitors your work activity
+on those tasks to identify information relevant to the task-at-hand.
+System artifacts such as files, types, methods, and fields get assigned
+a degree-of-interest based on how recently and frequently you interact
+with them. This results in uninteresting elements being filtered from
+view within Eclipse, allowing you to focus on on what is important. From
+this, Mylyn creates a task context, which is the set of all artifacts
+related to your task. These can include methods you have edited, APIs
+you have referred to, and documents you have browsed. Mylyn uses this
+task context to focus the Eclipse UI on interesting information, hide
+what's uninteresting, and automatically find what's related. Having the
+information you need to get your work done at your fingertips improves
+your productivity by reducing the time you spend searching, scrolling,
+and navigating. By making task context explicit, Mylyn also facilitates
+multitasking, planning, reusing past efforts, and sharing expertise.</p>
+
+<img src=images/mylyn-2.0.png>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.help.ui/extract-markup.xsl b/org.eclipse.mylyn.help.ui/extract-markup.xsl
new file mode 100644
index 0000000..4c4e731
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/extract-markup.xsl
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.3/">
+ <xsl:output method="text"/>
+
+ <xsl:template match="/">
+ <xsl:value-of select="//mw:text"/>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/org.eclipse.mylyn.help.ui/icons/etool16/icons-legend.gif b/org.eclipse.mylyn.help.ui/icons/etool16/icons-legend.gif
new file mode 100644
index 0000000..f40ce6b
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/icons/etool16/icons-legend.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/mylyn-overview-small.gif b/org.eclipse.mylyn.help.ui/images/mylyn-overview-small.gif
new file mode 100644
index 0000000..2e88b0b
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/mylyn-overview-small.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/mylyn-overview.gif b/org.eclipse.mylyn.help.ui/images/mylyn-overview.gif
new file mode 100644
index 0000000..7440945
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/mylyn-overview.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/ov_legend48.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_legend48.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_legend48.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/ov_legend48_hov.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_legend48_hov.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_legend48_hov.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/ov_mylyn48.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_mylyn48.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_mylyn48.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/ov_mylyn48_hov.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_mylyn48_hov.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/ov_mylyn48_hov.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/tu_query48.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_query48.gif
new file mode 100644
index 0000000..d6c5de2
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_query48.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/tu_query48_hov.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_query48_hov.gif
new file mode 100644
index 0000000..d6c5de2
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_query48_hov.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/tu_task48.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_task48.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_task48.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/tu_task48_hov.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_task48_hov.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/tu_task48_hov.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/wn_mylyn48.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/wn_mylyn48.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/wn_mylyn48.gif differ
diff --git a/org.eclipse.mylyn.help.ui/images/topiclabel/wn_mylyn48_hov.gif b/org.eclipse.mylyn.help.ui/images/topiclabel/wn_mylyn48_hov.gif
new file mode 100644
index 0000000..5a37f3a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/images/topiclabel/wn_mylyn48_hov.gif differ
diff --git a/org.eclipse.mylyn.help.ui/intro/css/overview.css b/org.eclipse.mylyn.help.ui/intro/css/overview.css
new file mode 100644
index 0000000..e014813
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/css/overview.css
@@ -0,0 +1,15 @@
+a#mylyn-overview img {
+ background-image: url(../../images/topiclabel/ov_mylyn48.gif);
+}
+
+a#mylyn-overview:hover img {
+ background-image: url(../../images/topiclabel/ov_mylyn48_hov.gif);
+}
+
+a#mylyn-legend img {
+ background-image: url(../../images/topiclabel/ov_legend48.gif);
+}
+
+a#mylyn-legend:hover img {
+ background-image: url(../../images/topiclabel/ov_legend48_hov.gif);
+}
diff --git a/org.eclipse.mylyn.help.ui/intro/css/overview.properties b/org.eclipse.mylyn.help.ui/intro/css/overview.properties
new file mode 100644
index 0000000..c028a26
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/css/overview.properties
@@ -0,0 +1,4 @@
+overview.mylyn-overview.link-icon = images/topiclabel/ov_mylyn48.gif
+overview.mylyn-overview.hover-icon = images/topiclabel/ov_mylyn48_hov.gif
+overview.mylyn-legend.link-icon = images/topiclabel/ov_legend48.gif
+overview.mylyn-legend.hover-icon = images/topiclabel/ov_legend48_hov.gif
diff --git a/org.eclipse.mylyn.help.ui/intro/css/tutorials.css b/org.eclipse.mylyn.help.ui/intro/css/tutorials.css
new file mode 100644
index 0000000..f2d3616
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/css/tutorials.css
@@ -0,0 +1,15 @@
+a#mylyn-query img {
+ background-image: url(../../images/topiclabel/tu_query48.gif);
+}
+
+a#mylyn-query:hover img {
+ background-image: url(../../images/topiclabel/tu_query48_hov.gif);
+}
+
+a#mylyn-task img {
+ background-image: url(../../images/topiclabel/tu_task48.gif);
+}
+
+a#mylyn-task:hover img {
+ background-image: url(../../images/topiclabel/tu_task48_hov.gif);
+}
diff --git a/org.eclipse.mylyn.help.ui/intro/css/tutorials.properties b/org.eclipse.mylyn.help.ui/intro/css/tutorials.properties
new file mode 100644
index 0000000..6d8dac3
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/css/tutorials.properties
@@ -0,0 +1,4 @@
+tutorials.mylyn-query.link-icon = images/topiclabel/tu_query48.gif
+tutorials.mylyn-query.hover-icon = images/topiclabel/tu_query48_hov.gif
+tutorials.mylyn-task.link-icon = images/topiclabel/tu_task48.gif
+tutorials.mylyn-task.hover-icon = images/topiclabel/tu_task48_hov.gif
diff --git a/org.eclipse.mylyn.help.ui/intro/css/whatsnew.css b/org.eclipse.mylyn.help.ui/intro/css/whatsnew.css
new file mode 100644
index 0000000..3bcb8da
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/css/whatsnew.css
@@ -0,0 +1,7 @@
+a#mylyn-noteworthy img {
+ background-image: url(../../images/topiclabel/wn_mylyn48.gif);
+}
+
+a#mylyn-noteworthy:hover img {
+ background-image: url(../../images/topiclabel/wn_mylyn48_hov.gif);
+}
diff --git a/org.eclipse.mylyn.help.ui/intro/css/whatsnew.properties b/org.eclipse.mylyn.help.ui/intro/css/whatsnew.properties
new file mode 100644
index 0000000..af2e13d
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/css/whatsnew.properties
@@ -0,0 +1,2 @@
+whatsnew.mylyn-noteworthy.link-icon = images/topiclabel/wn_mylyn48.gif
+whatsnew.mylyn-noteworthy.hover-icon = images/topiclabel/wn_mylyn48_hov.gif
diff --git a/org.eclipse.mylyn.help.ui/intro/overviewExtensionContent.xml b/org.eclipse.mylyn.help.ui/intro/overviewExtensionContent.xml
new file mode 100644
index 0000000..3ca189e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/overviewExtensionContent.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.mylyn" name="Mylyn"
+ style="css/overview.css" alt-style="css/overview.properties" path="overview/@">
+ <group id="content-group" style-id="content-group">
+ <!--
+ <link label="Mylyn"
+ url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.mylyn.help.ui/doc/overview.html"
+ id="mylyn-overview" style-id="content-link">
+ <text>Learn more about how Mylyn will help you focus on tasks</text>
+ </link>
+ -->
+ <link label="Mylyn"
+ url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.mylyn.help.ui&class=org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction&id=org.eclipse.mylyn.doc.legend.show.action"
+ id="mylyn-overview" style-id="content-link">
+ <text>See the Tasks UI Legend and open the Task List</text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
diff --git a/org.eclipse.mylyn.help.ui/intro/tutorialsExtensionContent.xml b/org.eclipse.mylyn.help.ui/intro/tutorialsExtensionContent.xml
new file mode 100644
index 0000000..c54ac80
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/tutorialsExtensionContent.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.mylyn" name="Mylyn"
+ style="css/tutorials.css" alt-style="css/tutorials.properties" path="tutorials/@">
+ <group label="Task-focused programming" id="mylyn" style-id="content-group">
+ <link
+ url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&input=org.eclipse.mylyn.cheatsheet.query"
+ label="Use the Task List" id="mylyn-query" style-id="content-link">
+ <text>Learn how to create tasks and task repository queries</text>
+ </link>
+ <link
+ url="http://www.eclipse.org/mylyn/start/"
+ label="Visit the Mylyn homepage" id="mylyn-task" style-id="content-link">
+ <text>Learn about the benefits of task-focused programming with Mylyn</text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
+
+<!--
+<link
+ url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&input=org.eclipse.mylyn.cheatsheet.taskfocus"
+ label="Focus on Java" id="mylyn-task" style-id="content-link">
+ <text>Learn how to reduce information overload and multitask with ease.</text>
+</link>
+-->
diff --git a/org.eclipse.mylyn.help.ui/intro/whatsnewExtensionContent.xml b/org.eclipse.mylyn.help.ui/intro/whatsnewExtensionContent.xml
new file mode 100644
index 0000000..aad68cc
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/intro/whatsnewExtensionContent.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.mylyn" name="Mylyn"
+ style="css/whatsnew.css" alt-style="css/whatsnew.properties" path="whatsnew/@">
+ <group id="content-group" style-id="content-group">
+ <link label="Mylyn"
+ url="http://www.eclipse.org/mylyn/new/"
+ id="mylyn-noteworthy" style-id="content-link">
+ <text>
+ Find out the significant changes made to Mylyn
+ </text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
+
+<!--
+ url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.mylyn.help.ui/doc/new.html"
+-->
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/plugin.properties b/org.eclipse.mylyn.help.ui/plugin.properties
new file mode 100644
index 0000000..63bd435
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/plugin.properties
@@ -0,0 +1,9 @@
+#Properties file for org.eclipse.mylyn.help.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Help
+
+cheatsheet.category.name = Tasks
+cheatsheet.query.name = Create a task repository query
+cheatsheet.query.description = Learn how to work with task and queries using the Task List
+cheatsheet.taskfocus.name = Work with task context
+cheatsheet.taskfocus.description = Learn how to activate tasks and use the Task-Focused UI
diff --git a/org.eclipse.mylyn.help.ui/plugin.xml b/org.eclipse.mylyn.help.ui/plugin.xml
new file mode 100644
index 0000000..f5c2850
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/plugin.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension
+ id="org.eclipse.mylyn.helpDocs"
+ name="Tasks"
+ point="org.eclipse.help.toc">
+ <toc
+ file="toc.xml"
+ primary="true">
+ </toc>
+ <toc
+ file="userguide/Mylyn Reference-toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.intro.configExtension">
+ <configExtension
+ configId="org.eclipse.ui.intro.universalConfig"
+ content="$nl$/intro/overviewExtensionContent.xml">
+ </configExtension>
+ <configExtension
+ configId="org.eclipse.ui.intro.universalConfig"
+ content="$nl$/intro/whatsnewExtensionContent.xml">
+ </configExtension>
+ <configExtension
+ configId="org.eclipse.ui.intro.universalConfig"
+ content="$nl$/intro/tutorialsExtensionContent.xml">
+ </configExtension>
+ </extension>
+ <extension
+ point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+ <category
+ id="org.eclipse.mylyn.cheatsheet"
+ name="%cheatsheet.category.name">
+ </category>
+ <cheatsheet
+ category="org.eclipse.mylyn.cheatsheet"
+ contentFile="$nl$/cheatsheets/Query.xml"
+ id="org.eclipse.mylyn.cheatsheet.query"
+ name="%cheatsheet.query.name">
+ <description>
+ %cheatsheet.query.description
+ </description>
+ </cheatsheet>
+ <cheatsheet
+ category="org.eclipse.mylyn.cheatsheet"
+ contentFile="$nl$/cheatsheets/TaskFocus.xml"
+ id="org.eclipse.mylyn.cheatsheet.taskfocus"
+ name="%cheatsheet.taskfocus.name">
+ <description>
+ %cheatsheet.taskfocus.description
+ </description>
+ </cheatsheet>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.help.ui/src/org/eclipse/mylyn/internal/help/ui/anttask/MediaWikiImageFetcher.java b/org.eclipse.mylyn.help.ui/src/org/eclipse/mylyn/internal/help/ui/anttask/MediaWikiImageFetcher.java
new file mode 100644
index 0000000..8726b81
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/src/org/eclipse/mylyn/internal/help/ui/anttask/MediaWikiImageFetcher.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.help.ui.anttask;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Get;
+
+/**
+ * Fetch images from a MediaWiki-generated HTML page source
+ *
+ * @author David Green
+ */
+public class MediaWikiImageFetcher extends Task {
+
+ private String base;
+
+ private File dest;
+
+ private File src;
+
+ @Override
+ public void execute() throws BuildException {
+ if (dest == null) {
+ throw new BuildException("Must specify @dest"); //$NON-NLS-1$
+ }
+ if (!dest.exists()) {
+ throw new BuildException("@dest does not exist: " + dest); //$NON-NLS-1$
+ }
+ if (!dest.isDirectory()) {
+ throw new BuildException("@dest is not a directory: " + dest); //$NON-NLS-1$
+ }
+ if (src == null) {
+ throw new BuildException("Must specify @src"); //$NON-NLS-1$
+ }
+ if (!src.exists()) {
+ throw new BuildException("@src does not exist: " + src); //$NON-NLS-1$
+ }
+ if (!src.isFile()) {
+ throw new BuildException("@src is not a file: " + src); //$NON-NLS-1$
+ }
+ if (base == null) {
+ throw new BuildException("Must specify @base"); //$NON-NLS-1$
+ }
+ if (base.endsWith("/")) { //$NON-NLS-1$
+ base = base.substring(0, base.length() - 1);
+ }
+ Pattern fragmentUrlPattern = Pattern.compile("src=\"([^\"]+)\""); //$NON-NLS-1$
+ Pattern imagePattern = Pattern.compile("alt=\"Image:([^\"]*)\"([^>]+)", Pattern.MULTILINE); //$NON-NLS-1$
+ String htmlSrc;
+ try {
+ htmlSrc = readSrc();
+ } catch (IOException e) {
+ throw new BuildException("Cannot read src: " + src + ": " + e.getMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ log("Parsing " + src, Project.MSG_INFO); //$NON-NLS-1$
+ int fileCount = 0;
+ Matcher imagePatternMatcher = imagePattern.matcher(htmlSrc);
+ while (imagePatternMatcher.find()) {
+ String alt = imagePatternMatcher.group(1);
+ String imageFragment = imagePatternMatcher.group(2);
+ if (imageFragment != null) {
+ Matcher fragmentUrlMatcher = fragmentUrlPattern.matcher(imageFragment);
+ if (fragmentUrlMatcher.find()) {
+ String url = fragmentUrlMatcher.group(1);
+ String qualifiedUrl = base + url;
+ log("Fetching " + qualifiedUrl, Project.MSG_INFO); //$NON-NLS-1$
+ Get get = new Get();
+ get.setProject(getProject());
+ get.setLocation(getLocation());
+ try {
+ get.setSrc(new URL(qualifiedUrl));
+ } catch (MalformedURLException e) {
+ log("Skipping " + url + ": " + e.getMessage(), Project.MSG_WARN); //$NON-NLS-1$ //$NON-NLS-2$
+ continue;
+ }
+ // note: we use the alt text for the name since for some files there is a case-difference between
+ // the server URL and the text used in the image src of the markup
+ String name = alt == null ? url.substring(url.lastIndexOf('/')) : alt;
+ get.setDest(new File(dest, name));
+ get.execute();
+ ++fileCount;
+ }
+ }
+ }
+ log("Fetched " + fileCount + " image files for " + src, Project.MSG_INFO); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public String getBase() {
+ return base;
+ }
+
+ public File getDest() {
+ return dest;
+ }
+
+ public File getSrc() {
+ return src;
+ }
+
+ private String readSrc() throws IOException {
+ StringBuilder buf = new StringBuilder((int) src.length());
+ Reader reader = new BufferedReader(new FileReader(src));
+ try {
+ int i;
+ while ((i = reader.read()) != -1) {
+ buf.append((char) i);
+ }
+ } finally {
+ reader.close();
+ }
+ return buf.toString();
+ }
+
+ public void setBase(String base) {
+ this.base = base;
+ }
+
+ public void setDest(File dest) {
+ this.dest = dest;
+ }
+
+ public void setSrc(File src) {
+ this.src = src;
+ }
+
+}
diff --git a/org.eclipse.mylyn.help.ui/src/org/eclipse/mylyn/internal/help/ui/anttask/tasks.properties b/org.eclipse.mylyn.help.ui/src/org/eclipse/mylyn/internal/help/ui/anttask/tasks.properties
new file mode 100644
index 0000000..b3c14e6
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/src/org/eclipse/mylyn/internal/help/ui/anttask/tasks.properties
@@ -0,0 +1 @@
+mediawiki-fetch-images=org.eclipse.mylyn.internal.help.ui.anttask.MediaWikiImageFetcher
diff --git a/org.eclipse.mylyn.help.ui/toc.xml b/org.eclipse.mylyn.help.ui/toc.xml
new file mode 100644
index 0000000..2518823
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/toc.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc label="Tasks User Guide">
+ <anchor id="before-reference" />
+ <topic label="Feature Reference">
+ <anchor id="before-reference-content"/>
+ <link toc="userguide/Mylyn Reference-toc.xml"/>
+ <anchor id="after-reference-content"/>
+ <anchor id="additions-reference" />
+ </topic>
+ <anchor id="after-reference" />
+ <anchor id="additions" />
+ <topic href="doc/notices.html" label="Legal" />
+</toc>
+
+
diff --git a/org.eclipse.mylyn.help.ui/userguide/Mylyn Reference-toc.xml b/org.eclipse.mylyn.help.ui/userguide/Mylyn Reference-toc.xml
new file mode 100644
index 0000000..89a3893
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Mylyn Reference-toc.xml
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<toc topic="userguide/Mylyn Reference.html" label="Mylyn Reference">
+ <topic href="userguide/Mylyn Reference.html" label="Task List">
+ <topic href="userguide/Mylyn Reference.html#Task_List_Presentation" label="Task List Presentation"></topic>
+ <topic href="userguide/Mylyn Reference.html#Icon_Legend_and_Color_Coding" label="Icon Legend and Color Coding"></topic>
+ <topic href="userguide/Mylyn Reference.html#Creating_new_Tasks" label="Creating new Tasks">
+ <topic href="userguide/Mylyn Reference.html#Local_Tasks" label="Local Tasks"></topic>
+ <topic href="userguide/Mylyn Reference.html#Repository_Tasks" label="Repository Tasks"></topic>
+ </topic>
+ <topic href="userguide/Mylyn Reference.html#Creating_new_Queries" label="Creating new Queries"></topic>
+ <topic href="userguide/Mylyn Reference.html#Scheduling" label="Scheduling"></topic>
+ <topic href="userguide/Mylyn Reference.html#Synchronization" label="Synchronization"></topic>
+ <topic href="userguide/Mylyn Reference.html#Incoming_Changes" label="Incoming Changes"></topic>
+ <topic href="userguide/Mylyn Reference.html#Reviewing_Tasks" label="Reviewing Tasks"></topic>
+ <topic href="userguide/Mylyn Reference.html#Task_Progress_Indicators" label="Task Progress Indicators"></topic>
+ <topic href="userguide/Mylyn Reference.html#Task_List_Settings_and_Operations" label="Task List Settings and Operations"></topic>
+ </topic>
+ <topic href="userguide/Task-Repositories.html" label="Task Repositories"></topic>
+ <topic href="userguide/Task-Editor.html" label="Task Editor">
+ <topic href="userguide/Task-Editor.html#Repository_Task_Details" label="Repository Task Details"></topic>
+ <topic href="userguide/Task-Editor.html#Context" label="Context"></topic>
+ <topic href="userguide/Task-Editor.html#Planning" label="Planning"></topic>
+ </topic>
+ <topic href="userguide/Task-Focused-Interface.html" label="Task-Focused Interface">
+ <topic href="userguide/Task-Focused-Interface.html#Focusing_Navigator_Views" label="Focusing Navigator Views"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Alt.2BClick_Navigation" label="Alt+Click Navigation"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Focusing_Editors" label="Focusing Editors"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Task-focused_Ordering" label="Task-focused Ordering"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Working_Set_Integration" label="Working Set Integration"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Open_Task_dialog" label="Open Task dialog"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Task_Hyperlinking" label="Task Hyperlinking"></topic>
+ <topic href="userguide/Task-Focused-Interface.html#Reporting_Bugs_from_the_Error_Log" label="Reporting Bugs from the Error Log"></topic>
+ </topic>
+ <topic href="userguide/Team-Support.html" label="Team Support">
+ <topic href="userguide/Team-Support.html#Task-focused_Change_Sets" label="Task-focused Change Sets"></topic>
+ <topic href="userguide/Team-Support.html#Automatic_Commit_Messages" label="Automatic Commit Messages"></topic>
+ <topic href="userguide/Team-Support.html#Working_with_Patches" label="Working with Patches"></topic>
+ </topic>
+ <topic href="userguide/Shortcuts.html" label="Shortcuts"></topic>
+ <topic href="userguide/Preferences.html" label="Preferences">
+ <topic href="userguide/Preferences.html#Tasks" label="Tasks"></topic>
+ <topic href="userguide/Preferences.html#Context_2" label="Context"></topic>
+ <topic href="userguide/Preferences.html#Resources" label="Resources"></topic>
+ <topic href="userguide/Preferences.html#Team" label="Team"></topic>
+ <topic href="userguide/Preferences.html#Shortcuts_2" label="Shortcuts"></topic>
+ </topic>
+ <topic href="userguide/Task-Repository-Connectors.html" label="Task Repository Connectors">
+ <topic href="userguide/Task-Repository-Connectors.html#Bugzilla_Connector" label="Bugzilla Connector"></topic>
+ <topic href="userguide/Task-Repository-Connectors.html#Trac_Connector" label="Trac Connector"></topic>
+ <topic href="userguide/Task-Repository-Connectors.html#JIRA_Connector" label="JIRA Connector"></topic>
+ <topic href="userguide/Task-Repository-Connectors.html#Generic_Web_Templates_Connector" label="Generic Web Templates Connector"></topic>
+ <topic href="userguide/Task-Repository-Connectors.html#XPlanner_Connector" label="XPlanner Connector"></topic>
+ </topic>
+ <topic href="userguide/Updating-This-Document.html" label="Updating This Document"></topic>
+</toc>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Mylyn Reference.html b/org.eclipse.mylyn.help.ui/userguide/Mylyn Reference.html
new file mode 100644
index 0000000..8836e91
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Mylyn Reference.html
@@ -0,0 +1,409 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Mylyn Reference</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left"></td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Repositories.html" title="Task Repositories">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top"></td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task Repositories</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Task_List">Task List</h1>
+ <p>Use the Task List to view and manage your tasks. If the task list view is not visible, you can open it by navigating to Window -> Show View -> Other... -> Mylyn -> Task List. The Task List contains both "Local Tasks" and shared "repository tasks" that are stored in a task repository such as Bugzilla or Jira. See how to create new tasks. Local tasks are typically contained in categories, which you can create by right-clicking on the task list and selecting new -> category. Repository tasks are contained in special categories that represent queries.</p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Task-List-Categorized.png"/>
+ </p>
+ <p>At the top of the Task List, you will find the following buttons and features:</p>
+ <ul>
+ <li>
+ <b>New Task</b> - Create a new local or repository task.
+ </li>
+ <li>
+ <b>Synchronize</b> - Update repository tasks with changes from the server.
+ </li>
+ <li>
+ <b>Task Presentation</b> - Toggle between Scheduled and Categorized presentations.
+ </li>
+ <li>
+ <b>Focus on Workweek</b> - See only tasks scheduled for this week.
+ </li>
+ <li>
+ <b>Find</b> - search for a task by typing in words from the task summary
+ </li>
+ <li>
+ <b>Working set indicator</b> - Indicates the currently active working set. Use the black arrow on the left to change the working set.
+ </li>
+ <li>
+ <b>Current task indicator</b> - Indicates the currently active task. Use the black arrow on the left to re-activate a recently active task.
+ </li>
+ </ul>
+ <h2 id="Task_List_Presentation">Task List Presentation</h2>
+ <p>The task list supports several ways to present tasks. You can toggle between the following modes by using the "Task Presentation" button in the toolbar.</p>
+ <ul>
+ <li>
+ <b>Categorized</b> - View tasks grouped by their category
+ </li>
+ <li>
+ <b>Scheduled</b> - View tasks grouped by the "
+ <i>scheduled</i> date"
+ </li>
+ </ul>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Task-List-Presentation-Select.png"/>
+ </p>
+ <p>In either presentation, you can toggle the "Focus on Workweek" button. In this mode, only the following tasks will be visible:</p>
+ <ul>
+ <li>Tasks scheduled for this week.</li>
+ <li>Overdue tasks.</li>
+ <li>Tasks with unread changes from your task repository.</li>
+ </ul>
+ <h2 id="Icon_Legend_and_Color_Coding">Icon Legend and Color Coding</h2>
+ <p>See the legend below to interpret the icons and color coding in the task list. You can view this legend by selecting "Show UI Legend" from the menu that appears when you click the white down arrow next to the minimize button in the top right corner of the Task List view. </p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-UI-Legend.png"/>
+ </p>
+ <h2 id="Creating_new_Tasks">Creating new Tasks</h2>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-New-Task.png"/>
+ </p>
+ <p>You can create new tasks by clicking on the "New Task" button in the Task List's toolbar. This will open the "New Task" dialog and prompt you to select a repository. There are two main types of tasks, local tasks and repository tasks.</p>
+ <h3 id="Local_Tasks">Local Tasks</h3>
+ <p>Use local tasks if you do not have a shared task repository or if you would like to create a private, personal task that is local to your workspace. To create a local task, select
+ <b>Local Task</b> and "Finish" from the New Task dialog.
+ </p>
+ <p>You can then provide the following details about the task.</p>
+ <ul>
+ <li>'''Task Description - Your task is called "New Task" by default. Replace this with a brief task description.</li>
+ <li>
+ <b>Priority</b> - Set the priority of your task. This will affect the task's icon and order in the task list.
+ </li>
+ <li>
+ <b>Status</b> - Set your task to "complete" or "incomplete". In your task list, completed tasks have a strikethrough font and will appear lower in the list.
+ </li>
+ <li>
+ <b>URL</b> - You can associate a URL with this task.
+ <ul>
+ <li>"Retrieve Task Description from URL" button - Set the task description to the title of the associated URL (page)</li>
+ <li>"Open with Web Browser" button - Open the URL in the integrated web browser</li>
+ </ul>
+ </li>
+ <li>
+ <b>Scheduled For</b> - Set the date when you will work on this task. Tasks scheduled for today or a date in the past will appear in blue in your task list. Tasks scheduled for future days will appear in black. If your task list is in focused mode, only tasks for the current week will be visible (unless they have unread changes).
+ </li>
+ <li>
+ <b>Due</b> - Set the date when your task must be completed. Overdue tasks and tasks due today will appear in red in your task list.
+ </li>
+ <li>
+ <b>Estimated Hours</b> - Estimate the number of hours it will take to complete this task.
+ </li>
+ <li>
+ <b>Active</b> - Displays the total time that you have worked on this task. Time is only recorded when this task is active and you are actively interacting with the system.
+ </li>
+ <li>
+ <b>Notes</b> - Record your personal notes about this task.
+ </li>
+ </ul>
+ <p>
+ <img border="0" src="images/Feature-Guide-3.0-Local-Task.png"/>
+ </p>
+ <h3 id="Repository_Tasks">Repository Tasks</h3>
+ <p>Create a new repository task when you would like to share information about the task with your team using a task repository such as Bugzilla or JIRA. To create a new repository task, click on the "New Task" button in the Task List's toolbar. You can then select the repository where you would like to create a task. If you don't see your team's task repository, you will need to configure it in the task repositories view. Once you have selected a repository, click "Next". If you are connecting to a Bugzilla repository, select a "Product" as a top-level category for your task and click "Finish".</p>
+ <p>A new task editor will appear. If you are using Bugzilla, you can enter the following information:</p>
+ <p>Required</p>
+ <ul>
+ <li>
+ <b>Description</b> - Enter a brief task description in the text box at the top (this box does not have a label).
+ </li>
+ <li>
+ <b>Component</b> - Specify a "Component" to further categorize this task within the previously selected "Product".
+ </li>
+ <li>
+ <b>Description</b> - Describe the task in detail.
+ </li>
+ </ul>
+ <p>Optional</p>
+ <ul>
+ <li>You can specify additional information about your tasks in the "Attributes" section.</li>
+ <li>
+ <b>Personal Planning</b> - You can enter information in this section that will be local to your workspace and
+ <b>not</b> available on your team's task repository. See "Local Tasks" for more information about the personal planning fields.
+ </li>
+ <li>
+ <b>Assigned to</b> - Specify who should work on the task. Type the first several characters of the person's email address, and then press ctrl+space to select the address from a list. A task can be assigned to only one person at a time.
+ </li>
+ <li>
+ <b>Add CC</b> - Add the addresses of people who should be notified of changes to this task. You can add multiple addresses, separated by a comma, e.g. (mik.kersten at tasktop.com, steffen.pingel at tasktop.com).
+ </li>
+ </ul>
+ <p>When finished, click "Submit" to add your new task to your team's shared task repository.</p>
+ <h2 id="Creating_new_Queries">Creating new Queries</h2>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-New-Query-Combined.png"/>
+ </p>
+ <p>Once you have configured your team's task repository, you can use Queries to add tasks to your task list.</p>
+ <ul>
+ <li>If the Task List is not visible, navigate to
+ <i>Window -> Show View -> Other -> Mylyn -> Task List</i>
+ </li>
+ <li>Right-click on the Task List and select "New -> Query..."</li>
+ <li>Select the repository whose tasks you would like to download and click "Next".</li>
+ <li>If you are prompted to select a query type, select "Create query using form" and click "Next".</li>
+ <li>Complete the form to define which tasks will be downloaded as part of this query, and then click "Finish". You can provide values for only as many parameters as necessary to filter the query results.</li>
+ </ul>
+ <p>If you are using the Bugzilla connector, you can specify the following parameters by default. The parameters for most other connectors will be similar.</p>
+ <ul>
+ <li>
+ <b>Query Title</b> - Label that appears in your task list.
+ </li>
+ <li>
+ <b>Summary</b> - Specify words that must appear in the summary of tasks matched by this query.
+ </li>
+ <li>
+ <b>Comment</b> - Words that must appear in the comments of matching tasks.
+ </li>
+ <li>
+ <b>Email</b> - Specify all or part of an email address. This address is used together with the following options:
+ <ul>
+ <li>
+ <b>Owner</b> - The specified email must match the person who the task is assigned to
+ </li>
+ <li>
+ <b>Reporter</b> - The specified email must match the person who created the task
+ </li>
+ <li>
+ <b>CC</b> - The person with the specified email address must be CC'd on the task
+ </li>
+ <li>
+ <b>Commenter</b> - The person with the specified email address must have commented on the task
+ </li>
+ <li>You can choose from the following options to specify how the email address will be matched:
+ <ul>
+ <li>
+ <b>substring</b> - Only a part of the specified address must match
+ </li>
+ <li>
+ <b>exact</b> - The specified email address must match exactly
+ </li>
+ <li>
+ <b>regexp</b> - The email address must match the specified regular expression
+ </li>
+ <li>
+ <b>notregexp</b> - The email address must NOT match the specified regular expression
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <b>Email 2</b> - You can use this parameter to specify another email address to further restrict the results
+ </li>
+ <li>
+ <b>Keywords</b> - Click the "Select..." button to specify a keyword that must be associated with matching tasks
+ </li>
+ <li>
+ <b>Product, Component, Version, ...</b> - Optionally select parameters to restrict the results to a particular product, version, etc.
+ </li>
+ <li>
+ <b>Update Attributes from Repository</b> - Click this to refresh the available parameters if the project structure on the task respository has changed recently.
+ </li>
+ <li>
+ <b>Changed in:</b> - Only tasks modified within the specified number of days will appear in the query results
+ </li>
+ </ul>
+ <h2 id="Scheduling">Scheduling</h2>
+ <p>Two kinds of dates for scheduling are provided.</p>
+ <p>
+ <b>Scheduled Date</b>
+ </p>
+ <ul>
+ <li>A soft date used for personal scheduling that can be easily deferred as priorities change. The scheduled date is the date you plan to start working on the task.</li>
+ <li>When a task reaches its scheduled date it will turn blue, indicating that the task should be activated and worked on today.</li>
+ <li>Scheduled dates are private to your local workspace</li>
+ </ul>
+ <p>
+ <b>Due Date</b>
+ </p>
+ <ul>
+ <li>A hard date when the task must be completed. This is often related to external constraints such as deadlines.</li>
+ <li>If you are using a shared task repository, due dates become an attribute of the shared task and will be visible to other team members.</li>
+ <li>A task with a due date has a small clock overlay that is blue before the due date and red after.</li>
+ </ul>
+ <h2 id="Synchronization">Synchronization</h2>
+ <p>Repository tasks and queries are synchronized to reflect the latest changes on the server.
+ Tasks are synchronized the following ways:</p>
+ <ul>
+ <li>
+ <b>Automatic Synchronization.</b> By default, tasks will be synchronized with the repository every 20 minutes. Automatic synchronization can be disabled via the
+ <i>Synchronize Automatically</i> option in the view menu (e.g. when working with intermittently available connectivity). The synchronization interval can be changed via
+ <i>Preferences -> Mylyn -> Task List</i>.
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>On Task Open.</b> Tasks are synchronized automatically in the background when a task editor is opened.
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>Manually.</b> Individual tasks and queries can be synchronized manually by right-clicking on them in the Task List and selecting "Synchronize", or via the toolbar button. Clicking the toolbar button will synchronize all queries in your task list.
+ </li>
+ </ul>
+ <p>
+ <br/>
+
+ <b>Disconnected Mode</b>
+ <br/>
+ A task repository can be put into Disconnected mode via the right-click menu in the
+ <i>Task Repositories</i> view. This can be useful if the task repository is not currently in use (e.g. you are no longer engaged with the project, or the repository is no longer available). The offline support will ensure that you can still access tasks that you have worked with via their offline copies, and the Disconnected mode will ensure that synchronization warnings do not appear. Note that it is not necessary to turn off synchronization or work in Disconnected Mode when working offline.
+ </p>
+ <h2 id="Incoming_Changes">Incoming Changes</h2>
+ <p>A blue arrow to the left of a task indicates that the task has changed in the shared repository. Double-click the task to view it in the task editor. Changes to the task will be highlighted in blue.</p>
+ <p>To quickly review the differences since the task was last read, hover over the task in the Task List to view a summary in a tooltip. You can also press F4 to display a tooltip. You may also wish to view the task list in "Focus on Workweek" mode, which will filter out tasks without incoming changes that are not scheduled or due this week. You can toggle "Focus on Workweek" using a button in the Task List's toolbar.</p>
+ <h2 id="Reviewing_Tasks">Reviewing Tasks</h2>
+ <p>The task list has been carefully designed to support quickly reviewing tasks. Task reviewing is best done by configuring a query to show the tasks that you want to review. Once the tasks are displayed in the Task List they can be reviewed one at a time by scrolling through them using the keyboard up/down arrows. The task tooltip should provide enough detail to do a review and will display information relevant to the currently selected task. </p>
+ <p>To edit the selected task press the enter key, use Ctrl+Enter to open the task in the background. To quickly jump to the next unread task hold down the Alt-key when pressing up or down. To mark a task as read while navigating use Alt+shift+up/down. When reviewing tasks in this way, it is best to avoid mouse-based and gesture-based scrolling.</p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Task-List-Tooltip.png"/>
+ </p>
+ <h2 id="Task_Progress_Indicators">Task Progress Indicators</h2>
+ <p>
+ <b>Weekly progress</b>
+ <br/>
+ When in
+ <i>Focus on Workweek</i> mode (right-most toolbar button), the Task List will show a progress bar that indicates progress on the tasks scheduled for the current week. Each task that is scheduled for the week but not yet completed adds to the bar. A task completed by you adds to the green progress in the bar. Deferring a task to a future week will also add to the apparent progress because it will remove the task from the current week. Mousing over the bar will indicate details about your progress, such as the number of tasks and hours completed. To avoid the need for manual estimation by default every task is estimated for 1 hour, but if you have longer or shorter running tasks that week you can adjust the estimate in the task editor's
+ <i>Planning</i> page to ensure that the progress bar is accurate.
+ </p>
+ <p>Note that when in
+ <i>Focus on Workweek</i> mode the
+ <i>Task List</i> will show each of the tasks scheduled for this week. However, overdue tasks and those with incoming changes will also show, making the number of tasks visible not be a reliable indicator of progress on the tasks planned for the week.
+ </p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Weekly-Progress.png"/>
+ </p>
+ <p>
+ <br/>
+
+ <b>Category Progress</b>
+ <br/>
+ You can hover over categories in the task list to display a tooltip that displays a summary of complete and incomplete tasks.
+ </p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Category-Progress.png"/>
+ </p>
+ <h2 id="Task_List_Settings_and_Operations">Task List Settings and Operations</h2>
+ <p>Click the small white arrow in the top left of the task list to access the following settings:</p>
+ <ul>
+ <li>
+ <b>Go Up to Root</b> - Return to the normal presentation after previously selecting "Go Into" to see only the tasks in a particular category.
+ </li>
+ <li>
+ <b>Sort</b> - Open a dialog to set the sort order for the task list. This option is only availabe when the task list is not in "Focus on Workweek" mode.
+ </li>
+ <li>
+ <b>Filter priority lower than</b> - Hide tasks with a priority less than the priority you select. This option is only availabe when the task list is not in "Focus on Workweek" mode.
+ </li>
+ <li>
+ <b>Filter completed tasks</b> - Hide local and repository tasks that are in a completed state.
+ </li>
+ <li>
+ <b>Search Repository</b> - Opens a dialog to search for repository tasks. Search results will appear in a separate search results view.
+ </li>
+ <li>
+ <b>Restore Tasks from History</b> - Opens a dialog for restoring lost tasks.
+ </li>
+ <li>
+ <b>Synchronize Changed</b> - Updates the task list with any changes on the task repository.
+ </li>
+ <li>
+ <b>Synchronize Automatically</b> - When checked, the task list will update from the task repository on an interval specified in Window -> Preferences -> Tasks -> Synchronization
+ </li>
+ <li>
+ <b>Show UI Legend</b> - Displays a legend explaining icons and color-coding.
+ </li>
+ <li>
+ <b>Focus on Workweek</b> - Displays only tasks that are scheduled for this week, overdue, or have unread changes.
+ </li>
+ <li>
+ <b>Link with Editor</b> - Automatically selects the task corresponding to the active task editor.
+ </li>
+ <li>
+ <b>Preferences</b> - Access additional Task List preferences.
+ </li>
+ </ul>
+ <p>
+ <br/>
+ Right-clicking in the task list provides access to the following operations
+ </p>
+ <ul>
+ <li>
+ <b>New...</b> - Create new categories, queries, and tasks.
+ </li>
+ <li>
+ <b>Open with Browser</b> - Open the task in a web browser tab rather than the rich editor.
+ </li>
+ <li>
+ <b>Schedule for</b> - Set the soft date when you intend to work on the task.
+ </li>
+ <li>
+ <b>Mark as</b> - Mark a task as read or unread as you would an email message.
+ </li>
+ <li>
+ <b>Copy Details</b> - Places the task summary and html link in the clipboard so you can paste it into an email, document, etc.
+ </li>
+ <li>
+ <b>Delete</b> - Deletes local tasks. For repository tasks, the all downloaded data and local task information will be cleared but the task will re-appear if it still matches a query.
+ </li>
+ <li>
+ <b>Rename</b> - Rename a task.
+ </li>
+ <li>
+ <b>Go into</b> (queries only) - Show only the tasks in the selected category.
+ </li>
+ <li>
+ <b>Import and Export</b> - Access functionality for importing and exporting task data.
+ </li>
+ <li>
+ <b>Repository</b> (queries only) - Update repository settings
+ </li>
+ <li>
+ <b>Synchronize</b> - Update the selected tasks or queries from the shared task repository
+ </li>
+ <li>
+ <b>Properties</b> - Edit the settings for a repository query
+ </li>
+ </ul><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left"></td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Repositories.html" title="Task Repositories">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top"></td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task Repositories</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Preferences.html b/org.eclipse.mylyn.help.ui/userguide/Preferences.html
new file mode 100644
index 0000000..f71953d
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Preferences.html
@@ -0,0 +1,143 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Preferences</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Preferences</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Shortcuts.html" title="Shortcuts">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Repository-Connectors.html" title="Task Repository Connectors">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Shortcuts</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task Repository Connectors</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Preferences">Preferences</h1>
+ <p>You can access the following Mylyn preference pages by navigating to Window -> Preferences -> Tasks.</p>
+ <h2 id="Tasks">Tasks</h2>
+ <ul>
+ <li>
+ <b>Synchronization</b> - Set how often queries in your task list should update from your task repository. The default is 20 minutes.
+ </li>
+ <li>
+ <b>Scheduling</b> - Set the day when your week begins. This is used to determine whether tasks should appear as scheduled for this week.
+ </li>
+ <li>
+ <b>Task Editing</b> - Select whether tasks should be opened in the rich editor or an integrated browser window displaying the web interface for the task.
+ </li>
+ </ul>
+ <p>
+ <br/>
+ Click "Advanced" to reveal the following additional settings.
+ </p>
+ <ul>
+ <li>
+ <b>Task Timing</b> - When a task is active, the time spent working on the task is recorded. If you check "Enable inactivity timeouts", time will not be accumulated while you are not actively working. You can set the number of minutes after which time will stop being accumulated toward the active task.
+ </li>
+ <li>
+ <b>Task Data</b> - Specify the location where your task list and task context data is stored.
+ </li>
+ </ul>
+ <h2 id="Context_2">Context</h2>
+ <p>Use the following checkboxes to set your preferences for the task-focused interface.</p>
+ <ul>
+ <li>
+ <b>Auto focus navigator view on task activation</b> - Automatically toggle "Focus on Active Task" on when activating a task in navigation views such as the Package Explorer.
+ </li>
+ <li>
+ <b>Auto expand tree views when focused</b> - When toggling "Focus on Active Task", automatically expand trees so that all interesting elements are visible.
+ </li>
+ <li>
+ <b>Manage open editors to match task context</b> - When checked, activating a task will automatically open editors corresponding to the most interesting files in the task context. When deactivating a task, all editors will automatically close. While a task is active, files that become less interesting will automatically close as you work.
+ </li>
+ <li>
+ <b>Remove file from context when editor is closed</b> - When this option is checked, closing an editor will be considered an indication that you not interested in the corresponding file. Therefore, files you close will be removed from the task context. If you tend to close editors for files that you may want to return to, try unchecking this setting.
+ </li>
+ <li>
+ <b>Open last used perspective on task activation</b> - When this option is checked, activating a task will automatically switch to the perspective that was in use when the task was last active.
+ </li>
+ </ul>
+ <h2 id="Resources">Resources</h2>
+ <p>Use this preference page to add or remove resources that should not be included in the context of a task. Typically, excluded files are hidden backup or lock files that are not intented to be opened directly by the user of an application.</p>
+ <h2 id="Team">Team</h2>
+ <ul>
+ <li>
+ <b>Automatically create and manage with task context</b> - Enables automatic change set management. Change sets will be created automatically so that you can commit or update only resources that are in a task's context.
+ </li>
+ <li>
+ <b>Commit Message Template</b> - Set the values that will appear in commit messages that are automatically generated when committing resources associated with a task.
+ </li>
+ </ul>
+ <h2 id="Shortcuts_2">Shortcuts</h2>
+ <p> <b> Task List view</b>
+ <ul>
+ <li><code>Ctrl+C</code>: copy taks/query URL and description</li>
+ <li><code>Ctrl+F</code>: find</li>
+ <li><code>Insert</code>: new personal task</li>
+ <li><code>F5</code>: synchronize selected</li>
+ <li>When dragging URLs to the Task List: in Mozilla/Firefox just drag, in Internet Explorer <code>Ctrl+drag</code></li>
+ </ul>
+ <b> General</b>
+ <ul>
+ <li><code>Alt+click</code> or <code>Alt+RightArrow</code>: show all children of an element in a focused view, then click to select. Hold down alt to keep drilling in, click on whitespace in view to show all root elements.</li>
+ <li><code>Ctrl+Shift+Alt+RightArrow</code> Quick Context View</li>
+ <li><code>Ctrl+F9</code>: activate task dialog</li>
+ <li><code>Ctrl+Shift+F9</code>: deactivate task</li>
+ <li><code>Ctrl+F12</code>: open task dialog</li>
+ <li><code>Ctrl+Shift+F12</code>: open repository task dialog</li>
+ </ul>
+ <b> Interest manipulation</b>
+ <ul>
+ <li><code>Ctrl+Shift+Up</code>: mark as landmark</li>
+ <li><code>Ctrl+Shift+Down</code>: mark less interesting</li>
+ </ul>
+ <b> Useful Eclipse shortcuts</b>
+ <ul>
+ <li><code>Alt+Shift+Q, K</code>: show
+ <i>Task List</i> view</li>
+ <li><code>Ctrl+F10</code>: invoke view menu or ruler menu in editor</li>
+ </ul>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Shortcuts.html" title="Shortcuts">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Repository-Connectors.html" title="Task Repository Connectors">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Shortcuts</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task Repository Connectors</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Shortcuts.html b/org.eclipse.mylyn.help.ui/userguide/Shortcuts.html
new file mode 100644
index 0000000..ef3a6ab
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Shortcuts.html
@@ -0,0 +1,95 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Shortcuts</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Shortcuts</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Team-Support.html" title="Team Support">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Preferences.html" title="Preferences">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Team Support</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Preferences</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Shortcuts">Shortcuts</h1>
+ <p><b> Task List view</b>
+<ul>
+<li> F2: rename</li>
+<li> F4: show tooltip</li>
+<li> F5: synchronize</li>
+<li> Alt + Down: go to next unread</li>
+<li> Alt + Up: go to previous unread</li>
+<li> Alt + Shift + R: mark as read</li>
+<li> Alt + Shift + U: mark as unread</li>
+<li> Esc: hide tooltip</li>
+<li> Enter: open task</li>
+<li> Insert: new local task</li>
+<li> Ctrl+C: Copy details</li>
+<li> Ctrl+F: Find</li>
+<li> When dragging URLs to the Task List: in Mozilla/Firefox just drag, in Internet Explorer <code>Ctrl+drag</code></li>
+</ul>
+ <b> General</b>
+ <ul>
+ <li><code>Alt+click</code> or <code>Alt+RightArrow</code>: show all children of an element in a focused view, then click to select. Hold down alt to keep drilling in, click on whitespace in view to show all root elements.</li>
+ <li><code>Ctrl+Shift+Alt+RightArrow</code> Quick Context View</li>
+ <li><code>Ctrl+F9</code>: activate task dialog</li>
+ <li><code>Ctrl+Shift+F9</code>: deactivate task</li>
+ <li><code>Ctrl+F12</code>: open task dialog</li>
+ <li><code>Ctrl+Shift+F12</code>: open repository task dialog</li>
+ </ul>
+ <b> Interest manipulation</b>
+ <ul>
+ <li><code>Ctrl+Shift+Up</code>: mark as landmark</li>
+ <li><code>Ctrl+Shift+Down</code>: mark less interesting</li>
+ </ul>
+ <b> Useful Eclipse shortcuts</b>
+ <ul>
+ <li><code>Alt+Shift+Q, K</code>: show
+ <i>Task List</i> view</li>
+ <li><code>Ctrl+F10</code>: invoke view menu or ruler menu in editor</li>
+ </ul>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Team-Support.html" title="Team Support">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Preferences.html" title="Preferences">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Team Support</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Preferences</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Task-Editor.html b/org.eclipse.mylyn.help.ui/userguide/Task-Editor.html
new file mode 100644
index 0000000..294c565
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Task-Editor.html
@@ -0,0 +1,217 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Task Editor</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Task Editor</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Repositories.html" title="Task Repositories">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Focused-Interface.html" title="Task-Focused Interface">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task Repositories</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task-Focused Interface</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Task_Editor">Task Editor</h1>
+ <p>The task editor allows you to view and edit the tasks in your task list. Double-click on a task in your task list to open the editor. The features of the task editor will vary depending on whether it is a local task or a shared repository task. For shared repository tasks, there are some differences depending on the type of repository (and corresponding connector) that you are using (link: connectors). </p>
+ <h2 id="Repository_Task_Details">Repository Task Details</h2>
+ <p>In this section, we describe the task editor for shared bugs in a Bugzilla repository. Task editors for other repository types such as JIRA offer similar functionality.</p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Task-Editor-Top.png"/>
+ </p>
+ <p>
+ <b>Editor toolbar buttons</b>
+ </p>
+ <ul>
+ <li>
+ <b>Synchronize Incoming Changes</b> - Updates the local copy of the task to reflect any changes on the server.
+ </li>
+ <li>
+ <b>Create a new subtask</b> - Creates a new task that will be considered a prerequisite to completing the current task. Subtasks appear nested under their parent task in the task list. In Bugzilla terminology, the subtask "Blocks" the parent task and the subtask's ID will appear in the "Blocks:" field of the parent task.
+ </li>
+ <li>
+ <b>History</b> - Displays the task's change history in an internal browser using the web interface.
+ </li>
+ <li>
+ <b>Open with Web Browser</b> - Displays the web interface for the task in an internal web browser.
+ </li>
+ <li>
+ <b>Activate</b> - Toggles the activation and deactivation of the task.
+ </li>
+ </ul>
+ <p>
+ <b>Attributes</b>
+ Use the Attributes section to add or update structured information about the task.
+ </p>
+ <p>
+ <b>Team Planning</b>
+ The Team Planning section contains time-related information about the task that will be shared with your team. You can use the
+ <b>Due</b> field to set a due date for your task. On the due date, the task will appear in red in your task list.
+ </p>
+ <p>
+ <b>Attachments</b>
+ You can attach a file to this task so that a copy will be uploaded to your task repository and become available to anyone who can access the task.
+ </p>
+ <p>To attach a file</p>
+ <ul>
+ <li>click the "Attach..." button, which will open a wizard.</li>
+ <li>Select from one of the following:
+ <ul>
+ <li>
+ <b>File</b> - Uploads a file from your system. Click "Browse" on the right to select the file.
+ </li>
+ <li>
+ <b>Clipboard</b> -
+ </li>
+ <li>
+ <b>Workspace</b> - Uploads a file from your workspace. Select the file from the box below.
+ </li>
+ </ul>
+ </li>
+ <li>Click next to enter attachment details:
+ <ul>
+ <li>
+ <b>Description</b> - Provide a brief description of the file. This description will appear in the attachment list in the task editor.
+ </li>
+ <li>
+ <b>Comment</b> - Provide a comment about the file. This comment will appear in the comments section of the task editor.
+ </li>
+ <li>
+ <b>Content Type</b> - Optionally specify a content type for the file
+ </li>
+ <li>
+ <b>Patch</b> - Check this if the attachment is a source code patch file
+ </li>
+ <li>
+ <b>Attach Context</b> - Check this if you would also like to attach the context of your task. This context describes the resources that are most relevant to the task. If you attach a context, others can download it and focus the UI on the same resources that are relevant to you.
+ </li>
+ <li>Click "Next" to preview your file. If your file is an image, a preview of the file will appear.</li>
+ <li>Click "Finish" to upload the file to the task repository. Files are uploaded without the need to click "submit" at the bottom of the task editor.</li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+ <b>Duplicate Detection</b>
+ When submitting bug reports, you can avoid duplicates by clicking the "Search" button. This will search the repository for a stack trace that matches a stack trace in the task's Description field. The results of the duplicate detection show up in the Search view. If a match is found, you can open it and comment instead of creating a new bug report.
+ </p>
+ <p>
+ <b>Comments</b>
+ Use this section to add new comments about the task and view all previous comments. Comments you have read previously are folded. You can expand and re-read individual comments or click the "+" at the top right to expand all comments.
+ </p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Task-Editor-Bottom.png"/>
+ </p>
+ <p>
+ <b>Actions</b>
+ Use this section to change the task's status or reassign the task to another person.
+ </p>
+ <ul>
+ <li>
+ <b>Attach Context</b> - Uploads information about the resources that you have interacted with to the server. The context will appear in the attachments list so that others can download it and focus their UI on the resources that you found relevant for this task.
+ </li>
+ <li>
+ <b>Submit</b> - Submits all local changes to the task to your team's shared task repository.
+ </li>
+ </ul>
+ <p>
+ <b>People</b>
+ This section shows the people who are collaborating on the task.
+ </p>
+ <ul>
+ <li>
+ <b>Assigned to</b> - This is the person who is responsible for completing the task
+ </li>
+ <li>
+ <b>Reporter</b> - This person created the task
+ </li>
+ <li>
+ <b>QA Contact</b> -
+ </li>
+ <li>
+ <b>Add CC</b> - Use this box to add new people to the "CC" list. People on the "CC" list will be notified of any changes to this task. To add a new person, type the start of their email address and then press ctrl+space to complete the address using content assist. You can add several addresses, separated with a comma.
+ </li>
+ <li>
+ <b>CC</b> - This box shows the people who are currently on the "CC" list. To remove a person, simply select their email address so that it is highlighted and click "Submit". You can hold down ctrl to select multiple people.
+ </li>
+ </ul>
+ <h2 id="Context">Context</h2>
+ <p>The context tab allows you to manage the context of resources associated with the task. You can view the context tab by selecting it in the lower left of the editor window.</p>
+ <p>
+ <b>Elements</b>
+ <br/>
+ This section lists the resources that are part of the task's context. Because the number of elements may be large, you can adjust the level of detail using the slider at the top of the
+ <i>Actions</i> section. Sliding the control all the way to the left will show you all elements in your task context. As you slide to the right, only the elements with a high level of interest will be displayed. You can manually remove elements from your task context by right-clicking and selecting "Remove From Context". You may choose to view all elements and prune irrelevant items in this way before attaching the context to the task so that others can download it.
+ </p>
+ <p>
+ <b>Actions</b>
+ <br/>
+ </p>
+ <ul>
+ <li>
+ <b>Element Detail Slider</b> - Adjusts the minimum level of interest required for an element to be displayed in the
+ <i>Elements</i> section.
+ </li>
+ <li>
+ <b>Attach Context</b> - Attaches the context to the task so that it is available for download from the shared task repository. The context consists of the elements shown on the right.
+ </li>
+ <li>
+ <b>Retrieve Context</b> - Replaces the current task context with one that is attached to the task in the shared task repository.
+ </li>
+ <li>
+ <b>Copy Context to...</b> - Copy the task context to another task. That task will then have the same context as the current task.
+ </li>
+ <li>
+ <b>Clear Context.</b> - Removes all context information from the task.
+ </li>
+ </ul>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Context-Tab.png"/>
+ </p>
+ <h2 id="Planning">Planning</h2>
+ <p>Use the planning tab to access local information about the task that is private to your workspace. You can view the planning tab by selecting it in the lower left of the editor window. This tab contains a large area where you can enter personal notes about the task. See the local task section for more information about fields in the Personal Planning section.</p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Planning-Tab.png"/>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Repositories.html" title="Task Repositories">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Focused-Interface.html" title="Task-Focused Interface">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task Repositories</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task-Focused Interface</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Task-Focused-Interface.html b/org.eclipse.mylyn.help.ui/userguide/Task-Focused-Interface.html
new file mode 100644
index 0000000..5dc7e9e
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Task-Focused-Interface.html
@@ -0,0 +1,107 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Task-Focused Interface</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Task-Focused Interface</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Editor.html" title="Task Editor">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Team-Support.html" title="Team Support">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task Editor</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Team Support</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Task-Focused_Interface">Task-Focused Interface</h1>
+ <p>The task-focused interface is oriented around tasks and offers several ways to focus the interface on only what is relevant for the currently active task.</p>
+ <h2 id="Focusing_Navigator_Views">Focusing Navigator Views</h2>
+ <p>You can focus navigator views (e.g. Package Explorer, Project Explorer, Navigator) by toggling the "Focus on Active Task" button in the toolbar. When focused, the view will show only the resources that are "interesting" for the currently active task.</p>
+ <p>
+ <img border="0" src="images/Feature-Guide-3.0-Package-Explorer-Focused.png"/>
+ </p>
+ <h2 id="Alt.2BClick_Navigation">Alt+Click Navigation</h2>
+ <p>To navigate to a new resource that is not a part of the active task's context, you can toggle "Focus on Active Task" off, browse to the resource, and then click "Focus on Active Task" again to see only relevant resources. A more efficient way to add new resources is to use Alt+Click navigation (Clicking the mouse while holding the Alt key).</p>
+ <p>When a view is in Focused mode, you can Alt+Click a node to temporarily show all of its children. </p>
+ <ul>
+ <li>Once an element that was previously not interesting is selected with the mouse, it becomes interesting the other child elements will disappear. The clicked element is now a part of the task's context.</li>
+ <li>Alt can be held down while clicking to drill down from a top-level element to a deeply nested element that is to be added to the task context.</li>
+ <li>Multiple Alt+Clicks are supported so that you can add several elements to the task context. As soon as a normal click is made, uninteresting elements will disappear.</li>
+ <li>Ctrl+Clicks (i.e. disjoint selections, use Command key on Mac) are also supported and will cause each element clicked to become interesting. The first normal click will cause uninteresting elements to disappear. Note that Ctrl+clicked elements will become interesting (turn from gray to black) but only the most recently-clicked one will be selected while Alt is held down.</li>
+ </ul>
+ <h2 id="Focusing_Editors">Focusing Editors</h2>
+ <p>Some editors such as the Java editor support focusing. Clicking the Focus button in the toolbar will fold all declarations that are not part of the active task context.</p>
+ <p>
+ <img border="0" src="images/Feature-Guide-3.0-Focused-Editor.png"/>
+ </p>
+ <h2 id="Task-focused_Ordering">Task-focused Ordering</h2>
+ <p>When a task is active, elements that are interesting are displayed more prominently. For example, when you open the Java Open Type dialog (Ctrl+Shift+T), types that are interesting for the active task are shown first. Similarly, when you use ctrl+space to autocomplete a method name in a Java source file, methods that are in the task context are displayed at the top.</p>
+ <h2 id="Working_Set_Integration">Working Set Integration</h2>
+ <p>When Focus is applied to a navigator view, the working sets filter for that navigator view will be disabled. This ensures that you see all interesting elements when working on a task that spans working sets. To enforce visibility of only elements within one working set, do the following:</p>
+ <ul>
+ <li>Set the view to show working sets as top-level elements.</li>
+ <li>Use the
+ <i>Go Into</i> action on the popup menu of the working set node in the view to scope the view down to just the working set.
+ </li>
+ </ul>
+ <h2 id="Open_Task_dialog">Open Task dialog</h2>
+ <p>An
+ <i>Open Type</i> style dialog is available for opening tasks (<code>Ctrl+F12</code>) and for activating tasks (<code>Ctrl+F9</code>). The list is initially populated by recently active tasks. The active task can also be deactivated via <code>Ctrl+Shift+F9</code>. This can be used as a keyboard-only alternative for multi-tasking without the
+ <i>Task List</i> view visible. These actions appear in the
+ <i>Navigate</i> menu.
+ </p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Open-Task.png"/>
+ </p>
+ <h2 id="Task_Hyperlinking">Task Hyperlinking</h2>
+ <p>In the task editor, comments that include text of the form bug#123 or task#123 or bug 123 will be hyperlinked. Ctrl+clicking on this text will open the task or bug in the rich task editor.</p>
+ <p>To support hyperlinks within other text editors such as code or .txt files, the project that contains the file must be associated with a particular task repository. This is configured by right-clicking on the project and navigating to "Properties" > "Task Repository" and selecting the task repository used when working with this project.</p>
+ <h2 id="Reporting_Bugs_from_the_Error_Log">Reporting Bugs from the Error Log</h2>
+ <p>Bugs can created directly from events in the
+ <i>Error Log</i> view. This will create a new repository task editor with the summary and description populated with the error event's details. If the Connector you are using does not have a rich editor, the event details will be placed into the clipboard so that you can paste them into the web-based editor that will be opened automatically.
+ </p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Error-Log.png"/>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Editor.html" title="Task Editor">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Team-Support.html" title="Team Support">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task Editor</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Team Support</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Task-Repositories.html b/org.eclipse.mylyn.help.ui/userguide/Task-Repositories.html
new file mode 100644
index 0000000..71cb2a9
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Task-Repositories.html
@@ -0,0 +1,76 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Task Repositories</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Task Repositories</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Mylyn Reference.html" title="Task List">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Editor.html" title="Task Editor">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task List</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task Editor</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Task_Repositories">Task Repositories</h1>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Add-Task-Repository.png"/>
+ </p>
+ <p>Use the Task Repositories view to configure Mylyn to connect to your team's shared task repository (bug or issue tracker):</p>
+ <ul>
+ <li>Open the task repositories view by navigating to
+ <i>Window -> Show View -> Other -> Mylyn -> Task Repositories</i>
+ </li>
+ <li>Click the "Add Task Repository" button located in the view's toolbar.</li>
+ <li>Select the type of repository you wish to connect to and click "Next". If you don't see your repository type, you will need to install the appropriate connector.</li>
+ <li>Enter the repository's address and your login credentials. After filling in these details, press the
+ <i>Validate</i> button to ensure the repository exists and your login credentials are valid. Once the settings validate, Click Finish. Note that the settings will vary somewhat depending on the type of repository that you are connecting to. The screenshot shows the settings fore connecting to a Bugzilla repository.
+ </li>
+ <li>You should now see the new repository in the
+ <i>Task Repositories</i> view.
+ </li>
+ <li>Now that you have created a repository, you may add queries to the Task List.</li>
+ </ul><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Mylyn Reference.html" title="Task List">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Task-Editor.html" title="Task Editor">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task List</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Task Editor</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Task-Repository-Connectors.html b/org.eclipse.mylyn.help.ui/userguide/Task-Repository-Connectors.html
new file mode 100644
index 0000000..032fd3c
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Task-Repository-Connectors.html
@@ -0,0 +1,200 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Task Repository Connectors</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Task Repository Connectors</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Preferences.html" title="Preferences">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Updating-This-Document.html" title="Updating This Document">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Preferences</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Updating This Document</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Task_Repository_Connectors">Task Repository Connectors</h1>
+ <p>Mylyn allows you to collaborate on tasks via a shared task repository, also known as bug tracking systems. In order to collaborate, you need to have a
+ <b>Connector</b> to your particular repository.
+ </p>
+ <p>See
+ <a href="http://wiki.eclipse.org/Mylyn/Extensions" title="Mylyn/Extensions" target="mylyn_external">Mylyn Extensions</a> for a list of available connectors.
+ </p>
+ <h2 id="Bugzilla_Connector">Bugzilla Connector</h2>
+ <p>See
+ <a href="http://wiki.eclipse.org/Mylyn/FAQ#Bugzilla_Connector" title="Mylyn/FAQ#Bugzilla_Connector" target="mylyn_external">Bugzilla Connector Troubleshooting</a>.
+ </p>
+ <h2 id="Trac_Connector">Trac Connector</h2>
+ <p>See
+ <a href="http://wiki.eclipse.org/Mylyn/Mylyn_FAQ#Trac_Connector_troubleshooting" title="Mylyn_FAQ#Trac_Connector_troubleshooting" target="mylyn_external">Trac Connector Troubleshooting</a>.
+ </p>
+ <h2 id="JIRA_Connector">JIRA Connector</h2>
+ <p>See
+ <a href="http://confluence.atlassian.com/display/JIRAEXT/Mylyn" target="mylyn_external">this page</a> for install instructions and additional screen shots. Note that the Mylyn JIRA connector requires at least JIRA version 3.3.3 and SOAP/RPC services have to be enabled on the server.
+ </p>
+ <p>See also
+ <a href="http://wiki.eclipse.org/Mylyn/Mylyn_FAQ#JIRA_Connector_troubleshooting" title="Mylyn_FAQ#JIRA_Connector_troubleshooting" target="mylyn_external">JIRA Connector Troubleshooting</a>.
+ </p>
+ <h2 id="Generic_Web_Templates_Connector">Generic Web Templates Connector</h2>
+ <p>The generic web repository connector is NOT part of the default Mylyn install. You can install it from the incubator update site. See
+ <a href="http://www.eclipse.org/mylyn/downloads/" target="mylyn_external">Mylyn download page</a> for more details.
+ </p>
+ <p>The web connector allow to retrieve tasks from repositories that don't have rich connectors, but can show list of tasks on the web UI. Out of the box connector provides configuration templates for the following issue tracking systems:</p>
+ <ul>
+ <li>Google Code Hosting (<code>code.google.com</code>)</li>
+ <li>IssueZilla (<code>java.net, dev2dev, tigris.org</code>)</li>
+ <li>GForge (<code>objectweb.org</code>)</li>
+ <li>SourceForge (<code>sf.net</code>), see
+ <a href="http://wiki.eclipse.org/Mylyn/Using_Sourceforge_with_Mylyn" title="Using Sourceforge with Mylyn" target="mylyn_external">Using Sourceforge with Mylyn</a>
+ </li>
+ <li>Mantis (<code>www.futureware.biz/mantis</code>)</li>
+ <li>ChangeLogic (<code>changelogic.araneaframework.org</code>)</li>
+ <li>OTRS (<code>otrs.org</code>)</li>
+ <li>phpBB</li>
+ <li>vBulletin</li>
+ </ul>
+ <p>Lists of issues can be extracted from existing web pages using simple parsing configuration. Configuration can be also parametrized to make it easier to customize it for a specific project.</p>
+ <p>The parameters used for configuring project properties are typically substituted into the URLs used to access the repository. Substitution and matching rules can be edited under the
+ <i>Advanced Configuration</i> section on both the
+ <i>Repository Settings</i> page and the
+ <i>Edit Query</i> page.
+ </p>
+ <p>See
+ <a href="http://wiki.eclipse.org/Mylyn/FAQ#Generic_Web_Repository_Connector" title="Mylyn/FAQ#Generic_Web_Repository_Connector" target="mylyn_external">FAQ</a> for the troubleshooting tips.
+ </p>
+ <p>
+ <b>For example</b>, consider the configuration steps for GlassFish project at <code>java.net</code>:
+ </p>
+ <p>
+ <b>1.</b> Create new Generic web-based repository (in the Task Repository view). GlassFish is using IssueZilla and has a preconfigured template that can be selected by server url
+ <i>
+ <a href="https://glassfish.dev.java.net/issues" target="mylyn_external">https://glassfish.dev.java.net/issues</a>
+ </i>. You can also specify all fields manually in the
+ <i>Advanced Configuration</i> section. For GlassFish the following settings are required:
+ </p>
+ <ul>
+ <li>Task URL: <code>${serverUrl}/show_bug.cgi?id=</code></li>
+ <li>New Task URL: <code>${serverUrl}/enter_bug.cgi?issue_type=DEFECT</code></li>
+ <li>Query URL: <code>${serverUrl}/buglist.cgi?component=glassfish&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED&order=Issue+Number</code></li>
+ <li>Query Pattern: <code><a href="show_bug.cgi\?id\=(.+?)">.+?<span class="summary">(.+?)</span></code></li>
+ </ul>
+ <dl>
+ <dd>
+ <b>Note:</b>
+ <i>Query Pattern</i> field should be a <code>regexp</code> with 1st matching group on
+ <i>Issue ID</i> and 2nd on
+ <i>Issue Description</i>. Alternatively, you could use named matching groups: ({Id}.+?), ({Description}.+?), ({Status}.+?), ({Owner}.+?) and ({Type}.+?), then they can appear in query <code>regexp</code> in an arbitrary order. The second option requires build 2.0.0v20070717 or later.
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ <b>Note:</b> the above fields are using parameter substitution <code>${..}</code>. Variables <code>serverUrl, userId</code> and <code>password</code> are substituted from the values of corresponding fields of the repository preference page. In addition you can specify any arbitrary parameters and their values that will be also substituted into the template fields.
+ </dd>
+ </dl>
+ <dl>
+ <dd>
+ <b>Note:</b> the SourceForge template included with connector assume that
+ <i>single repository is used for all projects</i>. User should create multiple queries, and set project parameters at the query level. Because web connector don't support actions like "open repository task" there is really no need to create separate repositories per project and if you think about it that is how it work for connectors for Bugzilla and JIRA. However, it is still possible to setup separate repository per project using repository url like http://sourceforge.net/tracker/?group_id=172199 and accordingly updating derived urls is the advanced repository settings.
+ </dd>
+ </dl>
+ <p><!-- TODO need login setup for above GlassFish example -->
+
+ <b>For the web repository that require user to login, use advanced configuration in following way.</b>
+<i> This configuration is for GForge, you might need to change it for other repositories</i>:
+ </p>
+ <ul>
+ <li>Login Request URL - an address that form is using to submit login request: <code>${serverUrl}/account/login.php?return_to=&form_loginname=${userId}&form_pw=${password}&login=Login
+ <b>(POST)</b></code>
+ </li>
+ <li>Login Form URL - an address where login form is located
+ <i>(only needed if server need a login token in the parameters of the Login Request URL)</i>: <code>${serverUrl}/account/login.php</code>
+ </li>
+ <li>Login Token Pattern - pattern to extract value of the <code>loginToken</code> parameter from the form page
+ <i>(only needed if server need a login token in the parameters of the Login Request URL and Login Form URL is specified)</i>: <code>session_ser=(.+?)</code>
+ </li>
+ </ul>
+ <p>
+ <b>2.</b> Create a new query for the GlassFish task repository created above (either from popup context menu in the Task List view or using a "New..." wizard from File -> New... -> Other... menu).
+ </p>
+ <ul>
+ <li>
+ <i>Query URL</i> and
+ <i>Query Pattern</i> in the
+ <i>Repository Preferences</i> are used as default query parameters and can be overwritten in
+ <i>Advanced Configuration</i> section in
+ <i>Query Preferences</i>. Custom parameter values can also be overridden here as well as new parameters for substitution into the specific query.
+ </li>
+ </ul>
+ <ul>
+ <li>In the
+ <i>Advanced Configuration</i> section of the "New Query" dialog, there is a "Preview" button. You can use it to test your query pattern.
+ </li>
+ </ul>
+ <p>
+ <img border="0" src="images/Generic-web-repository-settings.gif"/>
+ </p>
+ <h2 id="XPlanner_Connector">XPlanner Connector</h2>
+ <p>The XPlanner connector is currently in the Experimental state. It supports XPlanner version .7.</p>
+ <p>
+ <b>Query</b>
+ </p>
+ <p>XPlanner Connector supports creating queries from your XPlanner repository. You can select to create a query for your own in progress tasks (the default), or select projects or iterations or user stories from a list. You can also select ones assigned to you, or all. Currently you can choose to group the results by tasks or user stories. If you group the results by tasks, this will result in a single query with the applicable tasks underneath it. If you choose to group the results by user stories, this will result in multiple queries added to the task list, each one corresponding to a user story, with the applicable tasks underneath it:</p>
+ <p>
+ <img border="0" src="images/XPlannerQuery.jpg"/>
+ </p>
+ <p>
+ <b>Task Editor</b>
+ </p>
+ <p>A rich editor for editing XPlanner tasks is available. It currently doesn't support all of the attributes you can change in XPlanner itself, but allows you to modify the basic ones necessary for XP development -- e.g. summary, description, estimated time. The attributes section of the editor displays an XPlanner-like view of the meaningful attributes, some of which are not editable.</p>
+ <p>
+ <img border="0" src="images/XPlannerTaskEditor.gif"/>
+ </p>
+ <p>
+ <b>User Story Editor</b>
+ </p>
+ <p>If you open an XPlanner element by id, using the "Open Repository Task by Key/ID" dialog, and that id is a user story id, you will see the read-only user story editor. This editor is just useful for seeing the major details of a user story -- no items in it can be changed, since there is no really good mapping between a user story and a Mylyn task.</p>
+ <p>
+ <img border="0" src="images/XPlannerUserStoryEditor.gif"/>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Preferences.html" title="Preferences">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Updating-This-Document.html" title="Updating This Document">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Preferences</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Updating This Document</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Team-Support.html b/org.eclipse.mylyn.help.ui/userguide/Team-Support.html
new file mode 100644
index 0000000..60e3483
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Team-Support.html
@@ -0,0 +1,106 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Team Support</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Team Support</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Focused-Interface.html" title="Task-Focused Interface">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right">
+ <a href="Shortcuts.html" title="Shortcuts">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task-Focused Interface</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Shortcuts</td>
+ </tr>
+ </table><hr/>
+ <h1 id="Team_Support">Team Support</h1>
+ <p>The task-focused interface provides several ways to improve your work flow when working with a source code repository such as CVS or Subversion. CVS support is available out-of-the-box and task-focused interface integration for Subversion is available via the Subclipse or Subversive plugins.</p>
+ <h2 id="Task-focused_Change_Sets">Task-focused Change Sets</h2>
+ <p>When working with a source code repository, you can commit or update only the resources that are in the context of a particular task. This helps you work on several tasks concurrently and avoid polluting your workspace with changes that are not relevant to the current task.</p>
+ <p>To enable this functionality, locate the "Synchronize" view. If the view is not visible, you can open it by navigating to Window -> Show View -> Other... -> Team -> Synchronize. Next, click the small black arrow next to "Show File System Resources" in the Synchronize view toolbar and select "Change Sets".</p>
+ <p>You can now synchronize resources in your workspace as usual (e.g. by right-clicking on a resource in the navigator and selecting "Team" -> "Synchronize with Repository". Your resources will now be grouped by change sets corresponding to tasks. Expanding the task shows individual resources. Changed resources that are not a part of any task context will appear under the root of the Synchronize view. If needed missing resources can be added to the task context Change Set via the Synchronize View by right+clicking the resource and selecting "Add to" and then selecting the corresponding task. Select "no set" to remove a resource from a change set.</p>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Change-Sets.png"/>
+ </p>
+ <p>You can use buttons in the toolbar of the Synchronize view to change modes as follows:</p>
+ <ul>
+ <li>
+ <b>Incoming Mode</b> - See only updates to be retrieved from the server
+ </li>
+ <li>
+ <b>Outgoing Mode</b> - See only your local changes to be committed to the server
+ </li>
+ <li>
+ <b>Incoming/Outgoing Mode</b> - See both incoming and outgoing changes
+ </li>
+ </ul>
+ <p>Right-clicking a Change Set provides access to the following operations:</p>
+ <ul>
+ <li>
+ <b>Add to Task Context</b> - Adds all changed files to the active task context, see
+ <a href="Team-Support.html#Working_with_Patches">Working with Patches</a> for more information
+ </li>
+ <li>
+ <b>Open Corresponding Task</b> - Opens the task associated with the Change Set in the Task Editor
+ </li>
+ </ul>
+ <h2 id="Automatic_Commit_Messages">Automatic Commit Messages</h2>
+ <p>When using task-focused change sets as described above, commit messages are automatically be generated based on the task whose resources are being commited. By default, the commit message includes information such as the task ID, description, and URL. To change the template for these commit messages, navigate to Window -> Preferences -> Tasks -> Team.</p>
+ <h2 id="Working_with_Patches">Working with Patches</h2>
+ <p>When applying patches, the preferred scenario is to have a task context attached to the task along with the patch. Since this is not always feasible, Mylyn provides an action in the popup menu of the
+ <i>Synchronize</i> view that supports adding changed elements to the task context.
+ </p>
+ <ol>
+ <li>Activate the task containing the patch.</li>
+ <li>Apply the patch. If you are using automatic change sets, this will cause the change set created by Mylyn to contain the outoing changes. If it doesn't you can use the
+ <i>Add to</i> action on the popup menu to add the elements to the corresponding change set.
+ </li>
+ <li>Invoke the
+ <i>Add to Task Context</i> action on the change set node, causing all of the changed files to be added to the task context. You can also invoke this action on a selection one or more elements (e.g. files) in the view.
+ </li>
+ </ol>
+ <p>
+ <img border="0" src="images/Feature-Reference-3.0-Add-To-Context.png"/>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Focused-Interface.html" title="Task-Focused Interface">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right">
+ <a href="Shortcuts.html" title="Shortcuts">
+ <img alt="Next" border="0" src="images/images/next.gif"/>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task-Focused Interface</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top">Shortcuts</td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/Updating-This-Document.html b/org.eclipse.mylyn.help.ui/userguide/Updating-This-Document.html
new file mode 100644
index 0000000..bfc1a39
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/Updating-This-Document.html
@@ -0,0 +1,54 @@
+<?xml version='1.0' encoding='utf-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <title>Mylyn Reference - Updating This Document</title>
+ <link type="text/css" rel="stylesheet" href="book.css"/>
+ </head>
+ <body>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <th style="width: 100%" align="center" colspan="3">Updating This Document</th>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Repository-Connectors.html" title="Task Repository Connectors">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right"></td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task Repository Connectors</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top"></td>
+ </tr>
+ </table><hr/>
+ <h1 id="Updating_This_Document">Updating This Document</h1>
+ <p>This document is maintained in a collaborative wiki. If you wish to update or modify this document please visit
+
+ <a href="http://wiki.eclipse.org/Mylyn/User_Guide" target="mylyn_external">http://wiki.eclipse.org/Mylyn/User_Guide</a>
+ </p><hr/>
+ <table class="navigation" style="width: 100%;" border="0" summary="navigation">
+ <tr>
+ <td style="width: 20%" align="left">
+ <a href="Task-Repository-Connectors.html" title="Task Repository Connectors">
+ <img alt="Previous" border="0" src="images/images/prev.gif"/>
+ </a>
+ </td>
+ <td style="width: 60%" align="center">
+ <a href="Mylyn Reference.html" title="Mylyn Reference">
+ <img alt="Mylyn Reference" border="0" src="images/images/home.gif"/>
+ </a>
+ </td>
+ <td style="width: 20%" align="right"></td>
+ </tr>
+ <tr>
+ <td style="width: 20%" align="left" valign="top">Task Repository Connectors</td>
+ <td style="width: 60%" align="center"></td>
+ <td style="width: 20%" align="right" valign="top"></td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.help.ui/userguide/book.css b/org.eclipse.mylyn.help.ui/userguide/book.css
new file mode 100644
index 0000000..faa4199
--- /dev/null
+++ b/org.eclipse.mylyn.help.ui/userguide/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Focused-Editor.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Focused-Editor.png
new file mode 100644
index 0000000..8bff3c9
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Focused-Editor.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Local-Task.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Local-Task.png
new file mode 100644
index 0000000..07d702a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Local-Task.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Package-Explorer-Focused.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Package-Explorer-Focused.png
new file mode 100644
index 0000000..a33cc75
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Guide-3.0-Package-Explorer-Focused.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Add-Task-Repository.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Add-Task-Repository.png
new file mode 100644
index 0000000..3c00757
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Add-Task-Repository.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Add-To-Context.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Add-To-Context.png
new file mode 100644
index 0000000..e0e920a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Add-To-Context.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Category-Progress.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Category-Progress.png
new file mode 100644
index 0000000..111cb8a
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Category-Progress.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Change-Sets.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Change-Sets.png
new file mode 100644
index 0000000..def07df
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Change-Sets.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Context-Tab.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Context-Tab.png
new file mode 100644
index 0000000..e592219
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Context-Tab.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Error-Log.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Error-Log.png
new file mode 100644
index 0000000..8dbf370
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Error-Log.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-New-Query-Combined.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-New-Query-Combined.png
new file mode 100644
index 0000000..77015c7
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-New-Query-Combined.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-New-Task.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-New-Task.png
new file mode 100644
index 0000000..d76413d
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-New-Task.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Open-Task.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Open-Task.png
new file mode 100644
index 0000000..6077ede
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Open-Task.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Planning-Tab.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Planning-Tab.png
new file mode 100644
index 0000000..2b497af
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Planning-Tab.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-Editor-Bottom.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-Editor-Bottom.png
new file mode 100644
index 0000000..fecfde9
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-Editor-Bottom.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-Editor-Top.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-Editor-Top.png
new file mode 100644
index 0000000..f422e7c
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-Editor-Top.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Categorized.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Categorized.png
new file mode 100644
index 0000000..650c053
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Categorized.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Presentation-Select.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Presentation-Select.png
new file mode 100644
index 0000000..6784a64
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Presentation-Select.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Tooltip.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Tooltip.png
new file mode 100644
index 0000000..1b760b1
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Task-List-Tooltip.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-UI-Legend.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-UI-Legend.png
new file mode 100644
index 0000000..9601382
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-UI-Legend.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Weekly-Progress.png b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Weekly-Progress.png
new file mode 100644
index 0000000..b6b52d7
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Feature-Reference-3.0-Weekly-Progress.png differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/Generic-web-repository-settings.gif b/org.eclipse.mylyn.help.ui/userguide/images/Generic-web-repository-settings.gif
new file mode 100644
index 0000000..1f3b766
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/Generic-web-repository-settings.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/XPlannerTaskEditor.gif b/org.eclipse.mylyn.help.ui/userguide/images/XPlannerTaskEditor.gif
new file mode 100644
index 0000000..8266a4c
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/XPlannerTaskEditor.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/XPlannerUserStoryEditor.gif b/org.eclipse.mylyn.help.ui/userguide/images/XPlannerUserStoryEditor.gif
new file mode 100644
index 0000000..06b688e
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/XPlannerUserStoryEditor.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/images/home.gif b/org.eclipse.mylyn.help.ui/userguide/images/images/home.gif
new file mode 100644
index 0000000..4472e8c
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/images/home.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/images/next.gif b/org.eclipse.mylyn.help.ui/userguide/images/images/next.gif
new file mode 100644
index 0000000..e2f8c3e
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/images/next.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/images/prev.gif b/org.eclipse.mylyn.help.ui/userguide/images/images/prev.gif
new file mode 100644
index 0000000..4fb4150
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/images/prev.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/mylyn-overview-small.gif b/org.eclipse.mylyn.help.ui/userguide/images/mylyn-overview-small.gif
new file mode 100644
index 0000000..2e88b0b
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/mylyn-overview-small.gif differ
diff --git a/org.eclipse.mylyn.help.ui/userguide/images/mylyn-overview.gif b/org.eclipse.mylyn.help.ui/userguide/images/mylyn-overview.gif
new file mode 100644
index 0000000..7440945
Binary files /dev/null and b/org.eclipse.mylyn.help.ui/userguide/images/mylyn-overview.gif differ
diff --git a/org.eclipse.mylyn.ide-feature/.project b/org.eclipse.mylyn.ide-feature/.project
new file mode 100644
index 0000000..4495674
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.ide-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..4c9ebcf
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:51 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..867c6c1
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:08:35 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.ide-feature/about.html b/org.eclipse.mylyn.ide-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide-feature/build.properties b/org.eclipse.mylyn.ide-feature/build.properties
new file mode 100644
index 0000000..dcaa2fa
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.ide-feature/epl-v10.html b/org.eclipse.mylyn.ide-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide-feature/feature.properties b/org.eclipse.mylyn.ide-feature/feature.properties
new file mode 100644
index 0000000..3d9a9ef
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Bridge: Eclipse IDE
+description=Mylyn Task-Focused UI extensions for the Eclipse IDE. Provides focusing of common IDE views and editors.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.ide-feature/feature.xml b/org.eclipse.mylyn.ide-feature/feature.xml
new file mode 100644
index 0000000..f51019b
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/feature.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.ide_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.team.core"/>
+ <import plugin="org.eclipse.team.cvs.ui"/>
+ <import plugin="org.eclipse.team.cvs.core"/>
+ <import plugin="org.eclipse.jface"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.ui.workbench"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.team.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.resources.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.ui.navigator"/>
+ <import plugin="org.eclipse.ui.ide" version="3.4.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.mylyn.context.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ <import feature="org.eclipse.mylyn.context_feature" version="3.2.1.qualifier" match="perfect"/>
+ <import feature="org.eclipse.mylyn.team_feature" version="3.2.1.qualifier" match="perfect"/>
+ <import plugin="org.eclipse.team.ui"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import feature="org.eclipse.cvs" version="1.1.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.team.cvs"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.bugzilla.ide"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.ide.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.tasks.bugs"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.help.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.ide-feature/license.html b/org.eclipse.mylyn.ide-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.ide-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.ide.ant/.classpath b/org.eclipse.mylyn.ide.ant/.classpath
new file mode 100644
index 0000000..206998b
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.classpath
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ant/internal/ui/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/resources/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/views/markers/internal/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.ide.ant/.cvsignore b/org.eclipse.mylyn.ide.ant/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.ide.ant/.project b/org.eclipse.mylyn.ide.ant/.project
new file mode 100644
index 0000000..f42a717
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.ide.ant</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.ide.ant/.refactorings/2007/12/50/refactorings.history b/org.eclipse.mylyn.ide.ant/.refactorings/2007/12/50/refactorings.history
new file mode 100644
index 0000000..cdb21e9
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.refactorings/2007/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'resource' in 'org.eclipse.mylyn.internal.ide.ant.AntStructureBridge.getHandleForOffsetInObject(...)' to 'markerResource'
- Original project: 'org.eclipse.mylyn.ide.ant'
- Original element: 'org.eclipse.mylyn.internal.ide.ant.AntStructureBridge.getHandleForOffsetInObject(Object, int).resource'
- Renamed element: 'org.eclipse.mylyn.internal.ide.ant.AntStructureBridge.getHandleForOffsetInObject(Object, int).markerResource'
- Update references to refactored element" description="Rename local variable 'resource'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.ide.ant{AntStructureBridge.java[AntStructureBridge~getHandleForOffsetInObject~QObject;~I at resource!9020!9045!9030!9037!QIResource;" name="markerResource" references="true" stamp="1197438538939" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ant/.refactorings/2007/12/50/refactorings.index b/org.eclipse.mylyn.ide.ant/.refactorings/2007/12/50/refactorings.index
new file mode 100644
index 0000000..27c269a
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.refactorings/2007/12/50/refactorings.index
@@ -0,0 +1 @@
+1197438538939 Rename local variable 'resource'
diff --git a/org.eclipse.mylyn.ide.ant/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.ide.ant/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..25dd110
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylyn.ide.ant/pugin.xml' to 'plugin.xml' - Original project: 'org.eclipse.mylyn.ide.ant' - Original element: 'pugin.xml'" description="Rename resource 'pugin.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="pugin.xml" name="plugin.xml" stamp="1181353540288" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.pde.ui' - Original project: 'org.eclipse.mylyn.ide.ant' - Destination element: 'org.eclipse.mylyn.pde.ui' - Original element: 'plugin.xml'" description="Copy file" destination="=org.eclipse.mylyn.pde.ui" element1="plugin.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="plugin.xml	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181354272421" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.ide.ant' - Original project: 'org.eclipse.mylyn.ide.ant' - Original element: 'etool16'" description="Delete element" element1="icons/etool16" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1181354595675" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.ide.ant' - Original project: 'org.eclipse.mylyn.ide.ant' - Original elements: task-bug.gif task-repository.gif" description="Delete elements" element1="icons/elcl16/task-bug.gif" element2="icons/elcl16/task-repository.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="2" stamp="1181354598297" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ant/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.ide.ant/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..361102e
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,4 @@
+1181353540288 Rename resource 'pugin.xml'
+1181354272421 Copy file
+1181354595675 Delete element
+1181354598297 Delete elements
diff --git a/org.eclipse.mylyn.ide.ant/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.ide.ant/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..b32104e
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'p' in 'org.eclipse.mylyn.internal.ide.ant.AntUiBridge.openInEditor(...)' to 'page'
- Original project: 'org.eclipse.mylyn.ide.ant'
- Original element: 'org.eclipse.mylyn.internal.ide.ant.AntUiBridge.openInEditor(IFile, boolean).p'
- Renamed element: 'org.eclipse.mylyn.internal.ide.ant.AntUiBridge.openInEditor(IFile, boolean).page'
- Update references to refactored element" description="Rename local variable 'p'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.ide.ant{AntUiBridge.java[AntUiBridge~openInEditor~QIFile;~Z at p!4178!4265!4193!4193!QIWorkbenchPage;" name="page" references="true" stamp="1210836709249" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ant/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.ide.ant/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..f66346e
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1 @@
+1210836709249 Rename local variable 'p'
diff --git a/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.ide.ant/META-INF/MANIFEST.MF b/org.eclipse.mylyn.ide.ant/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6608a57
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.ide.ant;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.ant.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.debug.ui,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.views,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.ide.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Activator: org.eclipse.mylyn.internal.ide.ant.AntUiBridgePlugin
+Bundle-ClassPath: .
+Export-Package: org.eclipse.mylyn.internal.ide.ant;x-internal:=true
+Bundle-ActivationPolicy: lazy
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.ide.ant/about.html b/org.eclipse.mylyn.ide.ant/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ant/build.properties b/org.eclipse.mylyn.ide.ant/build.properties
new file mode 100644
index 0000000..69f9f86
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ icons/,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.ide.ant/icons/elcl16/edge-ref-xml.gif b/org.eclipse.mylyn.ide.ant/icons/elcl16/edge-ref-xml.gif
new file mode 100644
index 0000000..38bf351
Binary files /dev/null and b/org.eclipse.mylyn.ide.ant/icons/elcl16/edge-ref-xml.gif differ
diff --git a/org.eclipse.mylyn.ide.ant/icons/elcl16/file-xml.gif b/org.eclipse.mylyn.ide.ant/icons/elcl16/file-xml.gif
new file mode 100644
index 0000000..8af38f9
Binary files /dev/null and b/org.eclipse.mylyn.ide.ant/icons/elcl16/file-xml.gif differ
diff --git a/org.eclipse.mylyn.ide.ant/icons/elcl16/focus-disabled.gif b/org.eclipse.mylyn.ide.ant/icons/elcl16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.ide.ant/icons/elcl16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.ide.ant/icons/elcl16/focus.gif b/org.eclipse.mylyn.ide.ant/icons/elcl16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.ide.ant/icons/elcl16/focus.gif differ
diff --git a/org.eclipse.mylyn.ide.ant/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.ide.ant/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.ide.ant/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.ide.ant/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.ide.ant/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.ide.ant/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.ide.ant/plugin.properties b/org.eclipse.mylyn.ide.ant/plugin.properties
new file mode 100644
index 0000000..6543e89
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/plugin.properties
@@ -0,0 +1,6 @@
+#Properties file for org.eclipse.mylyn.ide.ant
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Ant Bridge
+
+AntStructureBridge.name = Ant Structure Bridge
+bridges.activeSearchLabel=XML Search
diff --git a/org.eclipse.mylyn.ide.ant/plugin.xml b/org.eclipse.mylyn.ide.ant/plugin.xml
new file mode 100644
index 0000000..e3a4c46
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension point="org.eclipse.mylyn.context.core.bridges">
+ <structureBridge
+ class="org.eclipse.mylyn.internal.ide.ant.AntStructureBridge"
+ name="%AntStructureBridge.name"
+ parentContentType="resource"/>
+ </extension>
+
+ <extension point="org.eclipse.mylyn.context.ui.bridges">
+ <uiBridge
+ class="org.eclipse.mylyn.internal.ide.ant.AntUiBridge"
+ contentType="build.xml"
+ activeSearchIcon="icons/elcl16/edge-ref-xml.gif"
+ activeSearchLabel="%bridges.activeSearchLabel"/>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntContextLabelProvider.java b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntContextLabelProvider.java
new file mode 100644
index 0000000..c5465e9
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntContextLabelProvider.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ant;
+
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.internal.context.ui.AbstractContextLabelProvider;
+import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
+import org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class AntContextLabelProvider extends AbstractContextLabelProvider {
+
+ public static final String LABEL_RELATION = Messages.AntContextLabelProvider_referenced_by;
+
+ @Override
+ protected Image getImage(IInteractionElement node) {
+ return ContextUiImages.getImage(ContextUiImages.FILE_XML);
+ }
+
+ @Override
+ protected Image getImage(IInteractionRelation edge) {
+ return ContextUiImages.getImage(IdeUiBridgePlugin.EDGE_REF_XML);
+ }
+
+ @Override
+ protected String getText(IInteractionElement node) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(AntStructureBridge.CONTENT_TYPE);
+ return bridge.getLabel(bridge.getObjectForHandle(node.getHandleIdentifier()));
+ }
+
+ @Override
+ protected String getText(IInteractionRelation edge) {
+ return LABEL_RELATION;
+ }
+
+ @Override
+ protected Image getImageForObject(Object object) {
+ return ContextUiImages.getImage(ContextUiImages.FILE_XML);
+ }
+
+ @Override
+ protected String getTextForObject(Object object) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(AntStructureBridge.CONTENT_TYPE);
+ return bridge.getLabel(object);
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntEditingMonitor.java b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntEditingMonitor.java
new file mode 100644
index 0000000..3f43352
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntEditingMonitor.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ant;
+
+import org.eclipse.ant.internal.ui.editor.AntEditor;
+import org.eclipse.ant.internal.ui.model.AntElementNode;
+import org.eclipse.ant.internal.ui.model.AntModel;
+import org.eclipse.ant.internal.ui.model.AntProjectNode;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class AntEditingMonitor extends AbstractUserInteractionMonitor {
+
+ public AntEditingMonitor() {
+ super();
+ }
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ if (part instanceof AntEditor) {
+
+ TextSelection textSelection = null;
+ IEditorInput in = null;
+
+ // assume that we are editing an xml file due to the editor used
+ // this is the build.xml and other ant file editor
+ AntEditor editor = (AntEditor) part;
+
+ if (!(editor.getSelectionProvider().getSelection() instanceof TextSelection)) {
+ return;
+ }
+
+ textSelection = (TextSelection) editor.getSelectionProvider().getSelection();
+ in = editor.getEditorInput();
+
+ // check if we have a text selection
+ if (textSelection != null && editor.getAntModel() != null) {
+ try {
+ AntElementNode node = editor.getAntModel().getNode(textSelection.getOffset(), false);
+ if (node == null) {
+ return;
+ }
+
+ FileEditorInput fei = (FileEditorInput) in;
+// Method method = AntElementNode.class.getDeclaredMethod("getElementPath", new Class[] {});
+// method.setAccessible(true);
+// String path = (String) method.invoke(node, new Object[] {});
+ String path = node.getElementPath();
+ if (path == null) {
+ return;
+ }
+ XmlNodeHelper xnode = new XmlNodeHelper(fei.getFile().getFullPath().toString(), path);
+ super.handleElementSelection(part, xnode, contributeToContext);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, AntUiBridgePlugin.ID_PLUGIN,
+ "Resolving selection failed", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ return;
+ }
+
+ public static AntElementNode getNode(AntModel antModel, String elementPath) throws SecurityException,
+ NoSuchMethodException {
+ AntProjectNode topNode;
+ try {
+ topNode = antModel.getProjectNode();
+ return getNode(topNode, elementPath);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * HACK: using reflection to gain accessibility
+ */
+ private static AntElementNode getNode(AntElementNode topNode, String elementPath) throws NoSuchMethodException,
+ IllegalAccessException {
+ if (topNode == null) {
+ return null;
+ }
+
+// Method method = AntElementNode.class.getDeclaredMethod("getElementPath", new Class[] {});
+// method.setAccessible(true);
+// String path = (String) method.invoke(topNode, new Object[] {});
+ String path = topNode.getElementPath();
+ if (path.compareTo(elementPath) == 0) {
+ return topNode;
+ }
+
+ if (topNode.getChildNodes() == null) {
+ return null;
+ }
+
+ for (Object obj : topNode.getChildNodes()) {
+ if (obj instanceof AntElementNode) {
+ AntElementNode node = (AntElementNode) obj;
+// path = (String) method.invoke(node, new Object[] {});
+ path = node.getElementPath();
+ if (path.compareTo(elementPath) == 0) {
+ return node;
+ } else {
+ AntElementNode node2 = getNode(node, elementPath);
+ if (node2 != null) {
+ return node2;
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntStructureBridge.java b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntStructureBridge.java
new file mode 100644
index 0000000..1897946
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntStructureBridge.java
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ant;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.ant.internal.ui.editor.AntEditor;
+import org.eclipse.ant.internal.ui.editor.text.AntAnnotationModel;
+import org.eclipse.ant.internal.ui.model.AntElementNode;
+import org.eclipse.ant.internal.ui.model.AntModel;
+import org.eclipse.ant.internal.ui.model.IProblemRequestor;
+import org.eclipse.ant.internal.ui.model.LocationProvider;
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.core.internal.resources.Marker;
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.views.markers.internal.ConcreteMarker;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class AntStructureBridge extends AbstractContextStructureBridge {
+
+ public final static String CONTENT_TYPE = "build.xml"; //$NON-NLS-1$
+
+ private static final char HANDLE_PATH_SEPARATOR = ';';
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getContentType()
+ */
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ if (elementHandle.endsWith(".xml")) { //$NON-NLS-1$
+ return parentContentType;
+ } else {
+ return CONTENT_TYPE;
+ }
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return Collections.emptyList();
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getParentHandle(java.lang.String)
+ */
+ @Override
+ public String getParentHandle(String handle) {
+ Object o = getObjectForHandle(handle);
+
+ // we can only get the parent if the element is an AntElementNode
+ if (o instanceof AntElementNode) {
+
+ // try to get the parent node
+ AntElementNode parent = ((AntElementNode) o).getParentNode();
+
+ if (parent != null) {
+ // get the handle for the parent node
+ return getHandleIdentifier(parent);
+ } else {
+ // if the parent is null, we just need to return the handle for
+ // the file
+ int delimeterIndex = handle.indexOf(";"); //$NON-NLS-1$
+ if (delimeterIndex != -1) {
+ String parentHandle = handle.substring(0, delimeterIndex);
+ return parentHandle;
+ } else {
+ return null;
+ }
+ }
+ } else if (o instanceof IFile) {
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ return parentBridge.getParentHandle(handle);
+ } else {
+ // return null if we can't get a parents
+ return null;
+ }
+ }
+
+ /**
+ * TODO: performance issue?
+ */
+ @Override
+ public Object getObjectForHandle(String handle) {
+ try {
+ if (handle == null) {
+ return null;
+ }
+ int first = handle.indexOf(HANDLE_PATH_SEPARATOR);
+ String filename = ""; //$NON-NLS-1$
+ if (first == -1) {
+ // we have just the filename, so return the IFile for this
+ // filename
+ filename = handle;
+ IPath path = new Path(filename);
+ IFile f = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+ return f;
+ } else {
+ // we have an element since there is a line number
+ // get the filename from the handle
+ filename = handle.substring(0, first);
+ }
+
+ // get the file and create a new FileEditorInput
+ IPath path = new Path(filename);
+ IFile file = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+ FileEditorInput fei = new FileEditorInput(file);
+
+ // get the line number that the element is on
+ String elementPath = handle.substring(first + 1);
+ if (elementPath.equals("")) { //$NON-NLS-1$
+ return file;
+ } else {
+ // XXX needed if the editor is the only way to get the model
+ // get the active editor, which should be the ant editor so we
+ // can get the AntModel
+ IEditorPart editorPart = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActiveEditor();
+ if (editorPart instanceof AntEditor) {
+ AntModel antModel = ((AntEditor) editorPart).getAntModel();
+ if (antModel != null) {
+ return AntEditingMonitor.getNode(antModel, elementPath);
+ }
+ } else {
+ String content = XmlNodeHelper.getContents(file.getContents());
+ IDocument d = new Document(content);
+ // create the ant model and get the element from it
+ IProblemRequestor p = new AntAnnotationModel(file);
+ AntModel am = new AntModel(d, p, new LocationProvider(fei));
+ am.reconcile();
+ return AntEditingMonitor.getNode(am, elementPath);
+ }
+ }
+ } catch (Throwable t) {
+ // ignore this, means that the file or node doesn't exist
+ }
+ return null;
+ }
+
+ /**
+ * Handle is filename;XPath
+ *
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getHandleIdentifier(java.lang.Object)
+ */
+ @Override
+ public String getHandleIdentifier(Object object) {
+ // we can only create handles for AntElementNodes and build.xml Files
+ if (object instanceof XmlNodeHelper) {
+ return ((XmlNodeHelper) object).getHandle();
+ } else if (object instanceof AntElementNode) {
+ AntElementNode node = (AntElementNode) object;
+ String path = node.getElementPath();
+ if (path == null || node.getIFile() == null) {
+ return null;
+ }
+ XmlNodeHelper helper = new XmlNodeHelper(node.getIFile().getFullPath().toString(), path);
+ return helper.getHandle();
+ } else if (object instanceof File) {
+ File file = (File) object;
+ // get the handle for the build.xml file
+ if (file.getFullPath().toString().endsWith("build.xml")) { //$NON-NLS-1$
+ return file.getFullPath().toString();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getLabel(java.lang.Object)
+ */
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof AntElementNode) {
+ AntElementNode n = (AntElementNode) object;
+ String name = n.getIFile().getName() + ": " + n.getName(); //$NON-NLS-1$
+ return name;
+ } else if (object instanceof File) {
+ File file = (File) object;
+ if (file.getFullPath().toString().endsWith("build.xml")) { //$NON-NLS-1$
+ return "build.xml"; //$NON-NLS-1$
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#canBeLandmark(Object) TODO: make a non-handle
+ * based test
+ */
+ @Override
+ public boolean canBeLandmark(String handle) {
+ if (handle != null) {
+ return handle.indexOf(';') == -1;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#acceptsObject(java.lang.Object)
+ */
+ @Override
+ public boolean acceptsObject(Object object) {
+ // we accept AntElementNode and build.xml File objects
+ if (object instanceof AntElementNode) {
+ return true;
+ } else if (object instanceof XmlNodeHelper) {
+ if (((XmlNodeHelper) object).getFilename().endsWith("build.xml")) { //$NON-NLS-1$
+ return true;
+ }
+ } else if (object instanceof File) {
+ File file = (File) object;
+ if (file.getFullPath().toString().endsWith("build.xml")) { //$NON-NLS-1$
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#canFilter(java.lang.Object)
+ */
+ @Override
+ public boolean canFilter(Object element) {
+ return true;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#isDocument(java.lang.String)
+ */
+ @Override
+ public boolean isDocument(String handle) {
+ return handle.indexOf(';') == -1;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getHandleForOffsetInObject(Object, int)
+ */
+ @Override
+ public String getHandleForOffsetInObject(Object object, int offset) {
+ if (object == null) {
+ return null;
+ }
+
+ IResource markerResource = null;
+ try {
+ if (object instanceof ConcreteMarker) {
+ markerResource = ((ConcreteMarker) object).getMarker().getResource();
+ } else if (object instanceof Marker) {
+ markerResource = ((Marker) object).getResource();
+ } else {
+ return null;
+ }
+ } catch (Exception e) {
+ return null;
+ }
+
+ if (markerResource != null) {
+ // we can only return a handle if the resource is build.xml
+ try {
+ if (markerResource instanceof IFile) {
+ IFile file = (IFile) markerResource;
+ if (file.getFullPath().toString().endsWith("build.xml")) { //$NON-NLS-1$
+ return file.getFullPath().toString();
+ } else {
+ return null;
+ }
+ }
+ return null;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, AntUiBridgePlugin.ID_PLUGIN, "Could not find element for: " //$NON-NLS-1$
+ + object, t));
+ return null;
+ }
+ } else if (object instanceof IFile) {
+ try {
+ IFile file = (IFile) object;
+ if (file.getFullPath().toString().endsWith("build.xml")) { //$NON-NLS-1$
+ FileEditorInput fei = new FileEditorInput(file);
+ String content = XmlNodeHelper.getContents(file.getContents());
+ IDocument d = new Document(content);
+ // create the ant model and get the element from it
+ IProblemRequestor p = new AntAnnotationModel(file);
+ AntModel am = new AntModel(d, p, new LocationProvider(fei));
+ am.reconcile();
+
+ AntElementNode node = am.getNode(offset, false);
+// Method method = AntElementNode.class.getDeclaredMethod("getElementPath", new Class[] {});
+// method.setAccessible(true);
+// String path = (String) method.invoke(node, new Object[] {});
+ String path = node.getElementPath();
+ if (path == null) {
+ return null;
+ }
+ String handle = new XmlNodeHelper(file.getFullPath().toString(), path).getHandle();
+ return handle;
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.WARNING, AntUiBridgePlugin.ID_PLUGIN,
+ "Unable to get handle for offset in object", e)); //$NON-NLS-1$
+ }
+ }
+ return null;
+ }
+
+// public IProject getProjectForObject(Object object) {
+// while (!(object instanceof IFile)) {
+// String handle = getParentHandle(getHandleIdentifier(object));
+// if (handle == null)
+// break;
+// object = getObjectForHandle(handle);
+// }
+// if (object instanceof IFile && acceptsObject(object)) {
+// return ((IFile) object).getProject();
+// }
+// return null;
+// }
+}
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntUiBridge.java b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntUiBridge.java
new file mode 100644
index 0000000..ddf7e37
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntUiBridge.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ant;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.ant.internal.ui.editor.AntEditor;
+import org.eclipse.ant.internal.ui.editor.outline.AntEditorContentOutlinePage;
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Mik Kersten
+ */
+public class AntUiBridge extends AbstractContextUiBridge {
+
+ /**
+ * @see org.eclipse.mylyn.context.ui.AbstractContextUiBridge#open(org.eclipse.mylyn.context.core.IInteractionElement)
+ */
+ @Override
+ public void open(IInteractionElement node) {
+ // get the handle of the node
+ String handle = node.getHandleIdentifier();
+
+ int first = handle.indexOf(";"); //$NON-NLS-1$
+ String filename = ""; //$NON-NLS-1$
+ if (first == -1) {
+ filename = handle;
+ } else {
+ filename = handle.substring(0, first);
+ }
+
+ try {
+ // get the file
+ IPath path = new Path(filename);
+ IFile f = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+
+ // open the xml file looking at the proper line
+ IEditorPart editor = openInEditor(f, true);
+
+ // if the editor is null, we had a problem and should return
+ if (editor == null) {
+ StatusHandler.log(new Status(IStatus.ERROR, AntUiBridgePlugin.ID_PLUGIN,
+ "Unable to open editor for file: " + filename)); //$NON-NLS-1$
+ return;
+ }
+
+ // get the contents and create a new document so that we can get
+ // the offsets to highlight
+ // String content = XmlNodeHelper.getContents(f.getContents());
+
+ // IDocument d = new Document(content);
+
+ // if(first != -1){
+ // int start = Integer.parseInt(handle.substring(first + 1));
+ //
+ // // get the offsets for the element
+ // int startOffset = d.getLineOffset(start);
+ // int length = 0;
+ //
+ // // set the selection if the selection provider is not null
+ // ISelectionProvider selectionProvider =
+ // editor.getEditorSite().getSelectionProvider();
+ // if(selectionProvider != null)
+ // selectionProvider.setSelection(new TextSelection(startOffset,
+ // length));
+ // }
+
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, AntUiBridgePlugin.ID_PLUGIN, "Could not open XML editor", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Open a file in the appropriate editor
+ *
+ * @param file
+ * The IFile to open
+ * @param activate
+ * Whether to activate the editor or not
+ * @return The IEditorPart that the file opened in
+ * @throws PartInitException
+ */
+ private IEditorPart openInEditor(IFile file, boolean activate) throws PartInitException {
+ if (file != null) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null && file.exists()) {
+ try {
+ IEditorPart editorPart = IDE.openEditor(page, file, activate);
+ return editorPart;
+ } catch (Exception e) {
+ // ignore this
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void close(IInteractionElement node) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>();
+ for (IEditorReference reference : page.getEditorReferences()) {
+ try {
+ if (reference.getEditorInput() instanceof IFileEditorInput) {
+ IFileEditorInput input = (IFileEditorInput) reference.getEditorInput();
+ if (input.getFile().getFullPath().toString().equals(node.getHandleIdentifier())) {
+ toClose.add(reference);
+ }
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ if (toClose.size() > 0) {
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return editorPart instanceof AntEditor;
+ }
+
+ /**
+ * HACK: use reflection to get the TreeViewer
+ */
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) {
+ List<TreeViewer> viewers = new ArrayList<TreeViewer>();
+ if (editor instanceof AntEditor) {
+ try {
+ AntEditor ae = (AntEditor) editor;
+ AntEditorContentOutlinePage outline = (AntEditorContentOutlinePage) ae.getAdapter(IContentOutlinePage.class);
+ Class<?> clazz = ContentOutlinePage.class;
+ Method method = clazz.getDeclaredMethod("getTreeViewer", new Class[] {}); //$NON-NLS-1$
+ method.setAccessible(true);
+ viewers.add((TreeViewer) method.invoke(outline, new Object[] {}));
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.WARNING, AntUiBridgePlugin.ID_PLUGIN, "Unable to get outline", e)); //$NON-NLS-1$
+ }
+ }
+ return viewers;
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ return null;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return AntStructureBridge.CONTENT_TYPE;
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntUiBridgePlugin.java b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntUiBridgePlugin.java
new file mode 100644
index 0000000..8229312
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/AntUiBridgePlugin.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ant;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class AntUiBridgePlugin extends Plugin {
+
+ public static class AntUiBridgePluginStartup implements IContextUiStartup {
+
+ public void lazyStartup() {
+ AntUiBridgePlugin.getDefault().lazyStart();
+ }
+
+ }
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.ide.ant"; //$NON-NLS-1$
+
+ private static AntUiBridgePlugin INSTANCE;
+
+ public static AntUiBridgePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ private AntEditingMonitor antEditingMonitor;
+
+ public AntUiBridgePlugin() {
+ INSTANCE = this;
+ }
+
+ private void lazyStart() {
+ antEditingMonitor = new AntEditingMonitor();
+ MonitorUi.getSelectionMonitors().add(antEditingMonitor);
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (antEditingMonitor != null) {
+ MonitorUi.getSelectionMonitors().remove(antEditingMonitor);
+ }
+
+ super.stop(context);
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/Messages.java b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/Messages.java
new file mode 100644
index 0000000..80e59ee
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ant;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.ide.ant.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AntContextLabelProvider_referenced_by;
+}
diff --git a/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/messages.properties b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/messages.properties
new file mode 100644
index 0000000..fa835be
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ant/src/org/eclipse/mylyn/internal/ide/ant/messages.properties
@@ -0,0 +1 @@
+AntContextLabelProvider_referenced_by=referenced by
diff --git a/org.eclipse.mylyn.ide.tests/.classpath b/org.eclipse.mylyn.ide.tests/.classpath
new file mode 100644
index 0000000..77f8017
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.ide.tests/.cvsignore b/org.eclipse.mylyn.ide.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.ide.tests/.project b/org.eclipse.mylyn.ide.tests/.project
new file mode 100644
index 0000000..d0c5ed3
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.ide.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/41/refactorings.history b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/41/refactorings.history
new file mode 100644
index 0000000..0e1a97d
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/41/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.ide.tests.CommitMessageTest' to 'CommitTemplateTest' - Original project: 'org.eclipse.mylar.ide.tests' - Original element: 'org.eclipse.mylar.ide.tests.CommitMessageTest' - Renamed element: 'org.eclipse.mylar.ide.tests.CommitTemplateTest' - Update references to refactored element - Update fully qualified names in '*.mf, *.plugin.xml' files - Update textual occurrences in comments and strings" description="Rename type 'CommitMessageTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.ide.tests{CommitMessageTest.java[CommitMessageTest" matchStrategy="1" name="CommitTemplateTest" patterns="*.mf, *.plugin.xml" qualified="true" references="true" similarDeclarations="false" stamp="1160782153468" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.ide.tests.CommitTemplateTest.testBugzillaCommentParsing()' to 'testRepositoryTaskCommentParsing' - Original project: 'org.eclipse.mylar.ide.tests' - Original element: 'org.eclipse.mylar.ide.tests.CommitTemplateTest.testBugzillaCommentParsing()' - Renamed element: 'org.eclipse.mylar.ide.tests.CommitTemplateTest.testRepositoryTaskCommentParsing()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testBugzillaCommentParsing'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.ide.tests{CommitTemplateTest.java[CommitTemplateTest~testBugzillaCommentParsing" name="testRepositoryTaskCommentParsing" references="true" stamp="1160783799437" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/41/refactorings.index b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/41/refactorings.index
new file mode 100644
index 0000000..213cdbe
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/41/refactorings.index
@@ -0,0 +1,2 @@
+1160782153468 Rename type 'CommitMessageTest'
+1160783799437 Rename method 'testBugzillaCommentParsing'
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..88d9fa1
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.ide.tests' - Original project: 'org.eclipse.mylar.ide.tests' - Original element: 'org.eclipse.mylar.ide.tests.OpenCorrespondingTaskTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.ide.tests{OpenCorrespondingTaskTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1160967600843" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..1459043
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1 @@
+1160967600843 Delete element
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/5/21/refactorings.history b/org.eclipse.mylyn.ide.tests/.refactorings/2006/5/21/refactorings.history
new file mode 100644
index 0000000..463302b
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.ide.tests.ResourcesContextTest' to 'ResourceContextTest' - Original element: 'org.eclipse.mylar.ide.tests.ResourcesContextTest' - Renamed element: 'org.eclipse.mylar.ide.tests.ResourceContextTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'ResourcesContextTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.ide.tests{ResourcesContextTest.java[ResourcesContextTest" matchStrategy="1" name="ResourceContextTest" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1148487498298" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/5/21/refactorings.index b/org.eclipse.mylyn.ide.tests/.refactorings/2006/5/21/refactorings.index
new file mode 100644
index 0000000..2344a08
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/5/21/refactorings.index
@@ -0,0 +1 @@
+1148487498298 Rename type 'ResourcesContextTest'
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.ide.tests/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..97d768d
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.ide.tests.XMLResultUpdaterSearchListener' to 'XmlResultUpdaterSearchListener' - Original element: 'org.eclipse.mylar.ide.tests.XMLResultUpdaterSearchListener' - Renamed element: 'org.eclipse.mylar.ide.tests.XmlResultUpdaterSearchListener' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'XMLResultUpdaterSearchListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.ide.tests{XMLResultUpdaterSearchListener.java[XMLResultUpdaterSearchListener" matchStrategy="1" name="XmlResultUpdaterSearchListener" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153185876999" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.ide.tests.XMLSearchPluginTest' to 'XmlSearchPluginTest' - Original element: 'org.eclipse.mylar.ide.tests.XMLSearchPluginTest' - Renamed element: 'org.eclipse.mylar.ide.tests.XmlSearchPluginTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'XMLSearchPluginTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.ide.tests{XMLSearchPluginTest.java[XMLSearchPluginTest" matchStrategy="1" name="XmlSearchPluginTest" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153185892186" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.ide.tests.XMLTestActiveSearchListener' to 'XmlTestActiveSearchListener' - Original element: 'org.eclipse.mylar.ide.tests.XMLTestActiveSearchListener' - Renamed element: 'org.eclipse.mylar.ide.tests.XmlTestActiveSearchListener' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'XMLTestActiveSearchListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.ide.tests{XMLTestActiveSearchListener.java[XMLTestActiveSearchListener" matchStrategy="1" name="XmlTestActiveSearchListener" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153185904389" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.ide.tests/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..7d0597d
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,3 @@
+1153185876999 Rename type 'XMLResultUpdaterSearchListener'
+1153185904389 Rename type 'XMLTestActiveSearchListener'
+1153185892186 Rename type 'XMLSearchPluginTest'
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.ide.tests/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..7057adf
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.team.tests/src/org.eclipse.mylyn.team.tests' - Original project: 'org.eclipse.mylyn.ide.tests' - Destination element: 'org.eclipse.mylyn.team.tests/src/org.eclipse.mylyn.team.tests' - Original element: 'org.eclipse.mylyn.ide.tests.CommitTemplateTest.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.team.tests" element1="/src<org.eclipse.mylyn.ide.tests{CommitTemplateTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181356330384" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.team.tests/src/org.eclipse.mylyn.team.tests' - Original project: 'org.eclipse.mylyn.ide.tests' - Destination element: 'org.eclipse.mylyn.team.tests/src/org.eclipse.mylyn.team.tests' - Original element: 'org.eclipse.mylyn.ide.tests.ChangeSetManagerTest.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.team.tests" element1="/src<org.eclipse.mylyn.ide.tests{ChangeSetManagerTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181356404503" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.tests/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.ide.tests/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..a57bb78
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181356330384 Move compilation unit
+1181356404503 Move compilation unit
diff --git a/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.ide.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.ide.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59cd799
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn IDE Tests
+Bundle-SymbolicName: org.eclipse.mylyn.ide.tests
+Bundle-Version: 0.0.0
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jface,
+ org.eclipse.ui.workbench,
+ org.junit,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.team.ui,
+ org.eclipse.mylyn.resources.ui
+Export-Package: org.eclipse.mylyn.ide.tests;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.ide.tests/about.html b/org.eclipse.mylyn.ide.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.tests/build.properties b/org.eclipse.mylyn.ide.tests/build.properties
new file mode 100644
index 0000000..a64e887
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html
+jre.compilation.profile = J2SE-1.5
+src.includes = about.html
diff --git a/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/AllIdeTests.java b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/AllIdeTests.java
new file mode 100644
index 0000000..f9e03cc
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/AllIdeTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllIdeTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.ide.tests");
+
+ // $JUnit-BEGIN$
+ suite.addTestSuite(OpenCorrespondingTaskActionTest.class);
+ suite.addTestSuite(IdeStartupTest.class);
+ suite.addTestSuite(IdePreferencesTest.class);
+ // $JUnit-END$
+
+ return suite;
+ }
+}
diff --git a/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/IdePreferencesTest.java b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/IdePreferencesTest.java
new file mode 100644
index 0000000..0fc0705
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/IdePreferencesTest.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.tests;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class IdePreferencesTest extends TestCase {
+
+ public void testExclusionPatterns() {
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(new HashSet<String>());
+ assertEquals(0, ResourcesUiBridgePlugin.getDefault().getExcludedResourcePatterns().size());
+
+ Set<String> ignored = new HashSet<String>();
+ ignored.add("one*");
+ ignored.add(".two");
+
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(ignored);
+ Set<String> read = ResourcesUiBridgePlugin.getDefault().getExcludedResourcePatterns();
+ assertEquals(2, read.size());
+ assertTrue(read.contains("one*"));
+ assertTrue(read.contains(".two"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/IdeStartupTest.java b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/IdeStartupTest.java
new file mode 100644
index 0000000..7c6a042
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/IdeStartupTest.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.team.ui.ContextActiveChangeSetManager;
+
+/**
+ * @author Mik Kersten
+ */
+public class IdeStartupTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ TestUtil.triggerContextUiLazyStart();
+ }
+
+ public void testChangeSetsStartup() {
+ List<AbstractContextListener> listeners = ContextCorePlugin.getContextManager().getListeners();
+ boolean containsManager = false;
+ for (AbstractContextListener listener : listeners) {
+ if (listener instanceof ContextActiveChangeSetManager) {
+ containsManager = true;
+ }
+ }
+ assertTrue(containsManager);
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/OpenCorrespondingTaskActionTest.java b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/OpenCorrespondingTaskActionTest.java
new file mode 100644
index 0000000..49721a0
--- /dev/null
+++ b/org.eclipse.mylyn.ide.tests/src/org/eclipse/mylyn/ide/tests/OpenCorrespondingTaskActionTest.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.team.ui.actions.OpenCorrespondingTaskAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenCorrespondingTaskActionTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ // ignore
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // ignore
+ super.tearDown();
+ }
+
+ public void test07LegacyMatching() {
+ String label = "Progress on: 123: foo \nhttps://bugs.eclipse.org";
+ String id = OpenCorrespondingTaskAction.getTaskIdFromLegacy07Label(label);
+ assertEquals("123", id);
+ }
+
+ public void testUrlMatching() {
+ String label = "bla bla\nhttp://foo.bar-123 bla bla";
+ String id = OpenCorrespondingTaskAction.getUrlFromComment(label);
+ assertEquals("http://foo.bar-123", id);
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.ui/.classpath b/org.eclipse.mylyn.ide.ui/.classpath
new file mode 100644
index 0000000..e1ecf4b
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/views/markers/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/views/markers/internal/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.ide.ui/.cvsignore b/org.eclipse.mylyn.ide.ui/.cvsignore
new file mode 100644
index 0000000..4a98758
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.fbwarnings
diff --git a/org.eclipse.mylyn.ide.ui/.project b/org.eclipse.mylyn.ide.ui/.project
new file mode 100644
index 0000000..52080aa
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.ide.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..4f165e2
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void updateSelection()' from 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProjectExplorerAction.run()' to 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProjectExplorerAction' - Original project: 'org.eclipse.mylar.ide' - Method name: 'updateSelection' - Destination type: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProjectExplorerAction' - Declared visibility: 'private'" comments="false" description="Extract method 'updateSelection'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToProjectExplorerAction.java" name="updateSelection" replace="false" selection="1957 1033" stamp="1161303215203" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..57fbe0f
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1 @@
+1161303215203 Extract method 'updateSelection'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/11/45/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/11/45/refactorings.history
new file mode 100644
index 0000000..49b86a0
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/11/45/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'elcl16' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'elcl16' - Original element: 'edge-ref-xml.gif'" description="Copy file" destination="icons/elcl16" element1="icons/elcl16/edge-ref-xml.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/elcl16/edge-ref-xml.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1162876605312" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/11/45/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/11/45/refactorings.index
new file mode 100644
index 0000000..08d66f1
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/11/45/refactorings.index
@@ -0,0 +1 @@
+1162876605312 Copy file
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..eb882f0
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToNavigatorAction' to 'FocusNavigatorAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToNavigatorAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusNavigatorAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToNavigatorAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToNavigatorAction.java[ApplyMylarToNavigatorAction" matchStrategy="1" name="FocusNavigatorAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277281814" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProjectExplorerAction' to 'FocusProjectExplorerAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProjectExplorerAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToProjectExplorerAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToProjectExplorerAction.java[ApplyMylarToProjectExplorerAction" matchStrategy="1" name="FocusProjectExplorerAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277341235" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.AbstractApplyMylartoMarkerViewAction' to 'AbstractFocusMarkerViewAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.AbstractApplyMylartoMarkerViewAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.AbstractFocusMarkerViewAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractApplyMylartoMarkerViewAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{AbstractApplyMylartoMarkerViewAction.java[AbstractApplyMylartoMarkerViewAction" matchStrategy="1" name="AbstractFocusMarkerViewAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277389798" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..5819109
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,3 @@
+1165277281814 Rename type 'ApplyMylarToNavigatorAction'
+1165277341235 Rename type 'ApplyMylarToProjectExplorerAction'
+1165277389798 Rename type 'AbstractApplyMylartoMarkerViewAction'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/51/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/51/refactorings.history
new file mode 100644
index 0000000..0433e19
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/51/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.xml.XmlReferencesProvider' to 'XmlJavaReferencesProvider' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.xml.XmlReferencesProvider' - Renamed element: 'org.eclipse.mylar.internal.ide.xml.XmlJavaReferencesProvider' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'XmlReferencesProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.xml{XmlReferencesProvider.java[XmlReferencesProvider" matchStrategy="1" name="XmlJavaReferencesProvider" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1166667139984" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original element: 'org.eclipse.mylar.internal.ide.xml.XmlJavaReferencesProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.java.search" element1="/src<org.eclipse.mylar.internal.ide.xml{XmlJavaReferencesProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1166667184765" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/51/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/51/refactorings.index
new file mode 100644
index 0000000..084504c
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/12/51/refactorings.index
@@ -0,0 +1,2 @@
+1166667139984 Rename type 'XmlReferencesProvider'
+1166667184765 Move compilation unit
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/13/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/13/refactorings.history
new file mode 100644
index 0000000..e2cbdc4
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/13/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction.updateLabelProvider(...)' to 'updateMarkerViewLabelProvider'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToMarkerTasksAction.java[ApplyMylarToMarkerTasksAction~updateLabelProvider~QStructuredViewer;" name="updateMarkerViewLabelProvider" references="true" stamp="1143750849320" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.ide.ui.ProblemsListLabelProvider' to 'MarkerViewLabelProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.ui{ProblemsListLabelProvider.java[ProblemsListLabelProvider" matchStrategy="1" name="MarkerViewLabelProvider" qualified="false" references="true" similarDeclarations="true" stamp="1143750875117" textual="false" version="1.0"/>
+<refactoring comments="false" description="Extract method 'private boolean isImplicitlyInteresting(ConcreteMarker marker)' from 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestFilter.select()' to 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestFilter'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/internal/ide/ui/ProblemsListInterestFilter.java" name="isImplicitlyInteresting" replace="false" selection="1753 101" stamp="1143752370337" version="1.0" visibility="2"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestFilter' to 'ResourceMarkerInterestFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.ui{ProblemsListInterestFilter.java[ProblemsListInterestFilter" matchStrategy="1" name="ResourceMarkerInterestFilter" qualified="false" references="true" similarDeclarations="true" stamp="1143753541661" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.ide.ui.ResourceMarkerInterestFilter' to 'MarkerInterestFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.ui{ResourceMarkerInterestFilter.java[ResourceMarkerInterestFilter" matchStrategy="1" name="MarkerInterestFilter" qualified="false" references="true" similarDeclarations="true" stamp="1143753575990" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/13/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/13/refactorings.index
new file mode 100644
index 0000000..6bd9372
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/13/refactorings.index
@@ -0,0 +1,5 @@
+1143750849320 Rename method 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction.updateLabelProvider(...)' to 'updateMarkerViewLabelProvider'
+1143753575990 Rename type 'org.eclipse.mylar.internal.ide.ui.ResourceMarkerInterestFilter' to 'MarkerInterestFilter'
+1143753541661 Rename type 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestFilter' to 'ResourceMarkerInterestFilter'
+1143752370337 Extract method 'private boolean isImplicitlyInteresting(ConcreteMarker marker)' from 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestFilter.select()' to 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestFilter'
+1143750875117 Rename type 'org.eclipse.mylar.internal.ide.ui.ProblemsListLabelProvider' to 'MarkerViewLabelProvider'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..8c1c753
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.getIssueIdFromComment(...)' to 'getTaskIdFromComment'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.team{MylarContextChangeSet.java[MylarContextChangeSet~getIssueIdFromComment~QString;" name="getTaskIdFromComment" project="org.eclipse.mylar.ide" references="true" stamp="1141323285188"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.PREFIX_DELIM' from expression '" "'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.team{MylarContextChangeSet.java" name="PREFIX_DELIM" project="org.eclipse.mylar.ide" qualify="false" replace="true" selection="5659 3" stamp="1141325505189" visibility="2"/>
+<refactoring comment="" comments="false" description="Extract method 'private static String fixUpDelimIfPresent(String completedPrefix)' from 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.generateComment()' to 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.team{MylarContextChangeSet.java" name="fixUpDelimIfPresent" project="org.eclipse.mylar.ide" replace="true" selection="5655 169" stamp="1141325732676" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..f59be1c
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1,3 @@
+1141323285188 Rename method 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.getIssueIdFromComment(...)' to 'getTaskIdFromComment'
+1141325505189 Extract constant 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.PREFIX_DELIM' from expression '" "'
+1141325732676 Extract method 'private static String fixUpDelimIfPresent(String completedPrefix)' from 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.generateComment()' to 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/13/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/13/refactorings.history
new file mode 100644
index 0000000..309faee
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.getTaskIdFromComment(...)' to 'getTaskIdFromCommentOrLabel'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.ide/src<org.eclipse.mylar.internal.ide.team{MylarContextChangeSet.java[MylarContextChangeSet~getTaskIdFromComment~QString;" name="getTaskIdFromCommentOrLabel" references="true" stamp="1143860351816" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/13/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/13/refactorings.index
new file mode 100644
index 0000000..41d5e75
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/13/refactorings.index
@@ -0,0 +1 @@
+1143860351816 Rename method 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet.getTaskIdFromComment(...)' to 'getTaskIdFromCommentOrLabel'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..382e7b4
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comments="false" description="Extract method 'private void getAffectedFiles(final List<IResource> changedResources,IResourceDelta delta)' from 'org.eclipse.mylar.internal.ide.ResourceChangeMonitor.resourceChanged().new IResourceDeltaVisitor() {...}.visit()' to 'org.eclipse.mylar.internal.ide.ResourceChangeMonitor'" destination="1" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/internal/ide/ResourceChangeMonitor.java" name="getAffectedFiles" replace="false" selection="2323 272" stamp="1144434975220" version="1.0" visibility="2"/>
+<refactoring description="Rename resource '/org.eclipse.mylar.ide/doc/interest.html' to 'concepts.html'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="resource://doc/interest.html" name="concepts.html" stamp="1144461106895" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..e6daa0a
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1,2 @@
+1144434975220 Extract method 'private void getAffectedFiles(final List<IResource> changedResources,IResourceDelta delta)' from 'org.eclipse.mylar.internal.ide.ResourceChangeMonitor.resourceChanged().new IResourceDeltaVisitor() {...}.visit()' to 'org.eclipse.mylar.internal.ide.ResourceChangeMonitor'
+1144461106895 Rename resource '/org.eclipse.mylar.ide/doc/interest.html' to 'concepts.html'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/17/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/17/refactorings.history
new file mode 100644
index 0000000..77df6d2
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/17/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comments="false" description="Extract method 'private void isActiveTaskEditor(ITask activeTask,IEditorInput input)' from 'org.eclipse.mylar.internal.ide.MylarEditorManager.closeAllEditors()' to 'org.eclipse.mylar.internal.ide.MylarEditorManager'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ide{MylarEditorManager.java" name="isActiveTaskEditor" replace="false" selection="4001 300" stamp="1146081082183" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/17/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/17/refactorings.index
new file mode 100644
index 0000000..d85350b
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/4/17/refactorings.index
@@ -0,0 +1 @@
+1146081082183 Extract method 'private void isActiveTaskEditor(ITask activeTask,IEditorInput input)' from 'org.eclipse.mylar.internal.ide.MylarEditorManager.closeAllEditors()' to 'org.eclipse.mylar.internal.ide.MylarEditorManager'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/18/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/18/refactorings.history
new file mode 100644
index 0000000..4dc26ce
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/18/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet' to 'MylarActiveChangeSet' - Original element: 'org.eclipse.mylar.internal.ide.team.MylarContextChangeSet' - Renamed element: 'org.eclipse.mylar.internal.ide.team.MylarActiveChangeSet' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'MylarContextChangeSet'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.team{MylarContextChangeSet.java[MylarContextChangeSet" matchStrategy="1" name="MylarActiveChangeSet" qualified="false" references="true" similarDeclarations="true" stamp="1146681802167" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/18/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/18/refactorings.index
new file mode 100644
index 0000000..9a063a5
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/18/refactorings.index
@@ -0,0 +1 @@
+1146681802167 Rename type 'MylarContextChangeSet'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..7f99d55
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ResourceSelectionMonitor' to 'ResourceInteractionMonitor' - Original element: 'org.eclipse.mylar.internal.ide.ResourceSelectionMonitor' - Renamed element: 'org.eclipse.mylar.internal.ide.ResourceInteractionMonitor' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'ResourceSelectionMonitor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide{ResourceSelectionMonitor.java[ResourceSelectionMonitor" matchStrategy="1" name="ResourceInteractionMonitor" qualified="false" references="true" similarDeclarations="true" stamp="1148002434562" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..cc55a61
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1 @@
+1148002434562 Rename type 'ResourceSelectionMonitor'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/21/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/21/refactorings.history
new file mode 100644
index 0000000..2d8f5b0
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ide.ui.IdeUiUtil.getResourceNavigator()' to 'getNavigatorFromActivePage' - Original element: 'org.eclipse.mylar.internal.ide.ui.IdeUiUtil.getResourceNavigator()' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.IdeUiUtil.getNavigatorFromActivePage()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getResourceNavigator'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ide.ui{IdeUiUtil.java[IdeUiUtil~getResourceNavigator" name="getNavigatorFromActivePage" references="true" stamp="1148607462107" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/21/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/21/refactorings.index
new file mode 100644
index 0000000..217b04a
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/5/21/refactorings.index
@@ -0,0 +1 @@
+1148607462107 Rename method 'getResourceNavigator'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/23/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/23/refactorings.history
new file mode 100644
index 0000000..293a11a
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.InterestManipulatingEditorTracker' to 'EditorInteractionMonitor' - Original element: 'org.eclipse.mylar.internal.ide.InterestManipulatingEditorTracker' - Renamed element: 'org.eclipse.mylar.internal.ide.EditorInteractionMonitor' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'InterestManipulatingEditorTracker'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide{InterestManipulatingEditorTracker.java[InterestManipulatingEditorTracker" matchStrategy="1" name="EditorInteractionMonitor" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149886637607" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/23/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/23/refactorings.index
new file mode 100644
index 0000000..c901c17
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/23/refactorings.index
@@ -0,0 +1 @@
+1149886637607 Rename type 'InterestManipulatingEditorTracker'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..79b9f4a
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.IInterestPreservedOnClose' to 'ICustomEditor' - Original element: 'org.eclipse.mylar.internal.ide.IInterestPreservedOnClose' - Renamed element: 'org.eclipse.mylar.internal.ide.ICustomEditor' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'IInterestPreservedOnClose'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide{IInterestPreservedOnClose.java[IInterestPreservedOnClose" matchStrategy="1" name="ICustomEditor" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1150131719204" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ICustomEditor' to 'IContextIgnoringEditor' - Original element: 'org.eclipse.mylar.internal.ide.ICustomEditor' - Renamed element: 'org.eclipse.mylar.internal.ide.IContextIgnoringEditor' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'ICustomEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide{ICustomEditor.java[ICustomEditor" matchStrategy="1" name="IContextIgnoringEditor" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1150131766692" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'addNewButton' in 'org.eclipse.mylar.internal.ide.ui.preferences.MylarResourcesPreferencePage' to 'resourceMonitoringButton' - Original element: 'org.eclipse.mylar.internal.ide.ui.preferences.MylarResourcesPreferencePage.addNewButton' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.preferences.MylarResourcesPreferencePage.resourceMonitoringButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'addNewButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.ide.ui.preferences{MylarResourcesPreferencePage.java[MylarResourcesPreferencePage^addNewButton" name="resourceMonitoringButton" references="true" setter="false" stamp="1150163283932" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ide.MylarIdePlugin.getIgnoredResourcePatterns()' to 'getExcludedResourcePatterns' - Original element: 'org.eclipse.mylar.internal.ide.MylarIdePlugin.getIgnoredResourcePatterns()' - Renamed element: 'org.eclipse.mylar.internal.ide.MylarIdePlugin.getExcludedResourcePatterns()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getIgnoredResourcePatterns'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ide{MylarIdePlugin.java[MylarIdePlugin~getIgnoredResourcePatterns" name="getExcludedResourcePatterns" references="true" stamp="1150164648243" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ide.MylarIdePlugin.setIgnoredResourcePatterns(...)' to 'setExcludedResourcePatterns' - Original element: 'org.eclipse.mylar.internal.ide.MylarIdePlugin.setIgnoredResourcePatterns(...)' - Renamed element: 'org.eclipse.mylar.internal.ide.MylarIdePlugin.setExcludedResourcePatterns(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setIgnoredResourcePatterns'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ide{MylarIdePlugin.java[MylarIdePlugin~setIgnoredResourcePatterns~QSet\<QString;>;" name="setExcludedResourcePatterns" references="true" stamp="1150164700148" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.ProblemsListDoiSorter' to 'ProblemsListInterestSorter' - Original element: 'org.eclipse.mylar.internal.ide.ui.ProblemsListDoiSorter' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestSorter' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'ProblemsListDoiSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui{ProblemsListDoiSorter.java[ProblemsListDoiSorter" matchStrategy="1" name="ProblemsListInterestSorter" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1150169479370" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.EXT_POINT_TEAM_REPOSITORY_PROVIDER' from expression '"teamRepositoryProvider"' - Constant name: 'EXT_POINT_TEAM_REPOSITORY_PROVIDER' - Constant expression: '"teamRepositoryProvider"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'EXT_POINT_TEAM_REPOSITORY_PROVIDER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.ide.team{TeamRespositoriesManager.java" name="EXT_POINT_TEAM_REPOSITORY_PROVIDER" qualify="false" replace="true" selection="1673 24" stamp="1150549559031" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.ELEM_REPOSITORY_PROVIDER' from expression '"repositoryProvider"' - Constant name: 'ELEM_REPOSITORY_PROVIDER' - Constant expression: '"repositoryProvider"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ELEM_REPOSITORY_PROVIDER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.ide.team{TeamRespositoriesManager.java" name="ELEM_REPOSITORY_PROVIDER" qualify="false" replace="true" selection="2247 20" stamp="1150549813843" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.ATTR_CLASS' from expression '"class"' - Constant name: 'ATTR_CLASS' - Constant expression: '"class"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTR_CLASS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.ide.team{TeamRespositoriesManager.java" name="ATTR_CLASS" qualify="false" replace="true" selection="3120 7" stamp="1150550384734" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..ef195d6
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1,9 @@
+1150131719204 Rename type 'IInterestPreservedOnClose'
+1150550384734 Extract constant 'ATTR_CLASS'
+1150549813843 Extract constant 'ELEM_REPOSITORY_PROVIDER'
+1150549559031 Extract constant 'EXT_POINT_TEAM_REPOSITORY_PROVIDER'
+1150169479370 Rename type 'ProblemsListDoiSorter'
+1150164700148 Rename method 'setIgnoredResourcePatterns'
+1150164648243 Rename method 'getIgnoredResourcePatterns'
+1150163283932 Rename field 'addNewButton'
+1150131766692 Rename type 'ICustomEditor'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..88de9eb
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.ide/schema/teamRepositoryProvider.exsd' to 'teamProviders.exsd' - Original element: 'teamRepositoryProvider.exsd'" description="Rename resource 'teamRepositoryProvider.exsd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="schema/teamRepositoryProvider.exsd" name="teamProviders.exsd" stamp="1150915631302" version="1.0"/>
+<refactoring comment="Rename local variable 'teamRepositoryProvider' in 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.readExtensions()' to 'teamProvider' - Original element: 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.readExtensions().teamRepositoryProvider' - Renamed element: 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.readExtensions().teamProvider' - Update references to refactored element" description="Rename local variable 'teamRepositoryProvider'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.ide.team{TeamRespositoriesManager.java" name="teamProvider" references="true" selection="2219 22" stamp="1150915739618" version="1.0"/>
+<refactoring comment="Extract method 'private void run(StructuredSelection selection)' from 'org.eclipse.mylar.internal.ide.ui.actions.OpenCorrespondingTaskAction.run()' to 'org.eclipse.mylar.internal.ide.ui.actions.OpenCorrespondingTaskAction' - Method name: 'run' - Destination type: 'org.eclipse.mylar.internal.ide.ui.actions.OpenCorrespondingTaskAction' - Declared visibility: 'private'" comments="false" description="Extract method 'run'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.ide.ui.actions{OpenCorrespondingTaskAction.java" name="run" replace="false" selection="2236 2238" stamp="1151027650703" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.ide.ui.actions.OpenCorrespondingTaskAction.LABEL' from expression '"Open Corresponding Task"' - Constant name: 'LABEL' - Constant expression: '"Open Corresponding Task"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.ide.ui.actions{OpenCorrespondingTaskAction.java" name="LABEL" qualify="false" replace="true" selection="1907 25" stamp="1151027936078" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.ide.team.TeamRepositoryProvider.managesResources(...)' to 'hasOutgoingChanges' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.provisional.ide.team.TeamRepositoryProvider.managesResources(...)' - Renamed element: 'org.eclipse.mylar.provisional.ide.team.TeamRepositoryProvider.hasOutgoingChanges(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'managesResources'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.ide.team{TeamRepositoryProvider.java[TeamRepositoryProvider~managesResources~\[QIResource;" name="hasOutgoingChanges" references="true" stamp="1151121412500" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.getProvider()' to 'getProviders' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.getProvider()' - Renamed element: 'org.eclipse.mylar.internal.ide.team.TeamRespositoriesManager.getProviders()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.ide.team{TeamRespositoriesManager.java[TeamRespositoriesManager~getProvider" name="getProviders" references="true" stamp="1151121724234" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..1875dcc
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,6 @@
+1150915631302 Rename resource 'teamRepositoryProvider.exsd'
+1151121724234 Rename method 'getProvider'
+1151121412500 Rename method 'managesResources'
+1151027936078 Extract constant 'LABEL'
+1151027650703 Extract method 'run'
+1150915739618 Rename local variable 'teamRepositoryProvider'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..ad4acb3
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.ide' to 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.ide/src/org.eclipse.mylar.internal.ide' - Renamed element: 'org.eclipse.mylar.ide/src/org.eclipse.mylar.ide' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.ide'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.ide" name="org.eclipse.mylar.ide" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153105602390" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.ide' to 'org.eclipse.mylar.internal.ide' - Original element: 'org.eclipse.mylar.ide/src/org.eclipse.mylar.ide' - Renamed element: 'org.eclipse.mylar.ide/src/org.eclipse.mylar.internal.ide' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.ide'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.ide" name="org.eclipse.mylar.internal.ide" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153105751765" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..4462607
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,2 @@
+1153105602390 Rename package 'org.eclipse.mylar.internal.ide'
+1153105751765 Rename package 'org.eclipse.mylar.ide'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..83a9ea3
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.ide' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerViewAction.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToMarkerViewAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1158966979592" subPackages="false" version="1.0"/>
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylartoMarkerViewAction' from 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction' - Sub types: org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction - Extracted class: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylartoMarkerViewAction' - Extracted members: org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction.interestSorter - Use super type where possible" delete="0" description="Extract superclass 'ApplyMylartoMarkerViewAction'" element1="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToMarkerTasksAction.java[ApplyMylarToMarkerTasksAction^interestSorter" element2="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToMarkerTasksAction.java[ApplyMylarToMarkerTasksAction" extract="1" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToMarkerTasksAction.java[ApplyMylarToMarkerTasksAction" instanceof="false" name="ApplyMylartoMarkerViewAction" replace="true" stamp="1158967027871" stubs="true" types="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction' to 'ApplyMylarToTaskMarkersAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToMarkerTasksAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToTaskMarkersAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToMarkerTasksAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToMarkerTasksAction.java[ApplyMylarToMarkerTasksAction!2" matchStrategy="1" name="ApplyMylarToTaskMarkersAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1158967300974" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'cachedProblemsTableViewer' in 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProblemsListAction' to 'cachedViewer' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProblemsListAction.cachedProblemsTableViewer' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProblemsListAction.cachedViewer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'cachedProblemsTableViewer'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToProblemsListAction.java[ApplyMylarToProblemsListAction^cachedProblemsTableViewer" name="cachedViewer" references="true" setter="false" stamp="1158967335284" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'cachedTasksViewer' in 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToTaskMarkersAction' to 'cachedViewer' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToTaskMarkersAction.cachedTasksViewer' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToTaskMarkersAction.cachedViewer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'cachedTasksViewer'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToTaskMarkersAction.java[ApplyMylarToTaskMarkersAction^cachedTasksViewer" name="cachedViewer" references="true" setter="false" stamp="1158967356414" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylartoMarkerViewAction' to 'AbstractApplyMylartoMarkerViewAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylartoMarkerViewAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.AbstractApplyMylartoMarkerViewAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylartoMarkerViewAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylartoMarkerViewAction.java[ApplyMylartoMarkerViewAction" matchStrategy="1" name="AbstractApplyMylartoMarkerViewAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1158967750911" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'src-old' - Original element: 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestSorter.java'" description="Copy compilation unit" destination="developer/src-old" element1="/src<org.eclipse.mylar.internal.ide.ui{ProblemsListInterestSorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/ide/ui/ProblemsListInterestSorter.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1158968054368" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestSorter' to 'MarkerViewerInterestSorter' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.ProblemsListInterestSorter' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.MarkerViewerInterestSorter' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ProblemsListInterestSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui{ProblemsListInterestSorter.java[ProblemsListInterestSorter" matchStrategy="1" name="MarkerViewerInterestSorter" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1158968078662" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..060fcd1
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1,8 @@
+1158966979592 Delete element
+1158967027871 Extract superclass 'ApplyMylartoMarkerViewAction'
+1158967300974 Rename type 'ApplyMylarToMarkerTasksAction'
+1158967335284 Rename field 'cachedProblemsTableViewer'
+1158967356414 Rename field 'cachedTasksViewer'
+1158967750911 Rename type 'ApplyMylartoMarkerViewAction'
+1158968054368 Copy compilation unit
+1158968078662 Rename type 'ProblemsListInterestSorter'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/1/1/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2007/1/1/refactorings.history
new file mode 100644
index 0000000..001901f
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/1/1/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.FocusNavigatorAction' to 'FocusResourceNavigatorAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusNavigatorAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusResourceNavigatorAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'FocusNavigatorAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusNavigatorAction.java[FocusNavigatorAction" matchStrategy="1" name="FocusResourceNavigatorAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1168041933787" textual="true" version="1.0"/>
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.internal.ide.ui.actions.FocusCommonNavigatorAction' from 'org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction' - Sub types: org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction - Extracted class: 'org.eclipse.mylar.internal.ide.ui.actions.FocusCommonNavigatorAction' - Extracted members: org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.linkService org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.commonNavigator org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.resolveSelection(...) org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.select(...) org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.setDefaultLinkingEnabled(...) org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.isDefaultLinkingEnabled() org.eclipse.mylar.internal.ide.ui.actions.FocusProjectExplorerAction.mergeSelection(...) - Use super type where possible" delete="5" description="Extract superclass 'FocusCommonNavigatorAction'" element1="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction^linkService" element10="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~resolveSelection~QIEditorPart;~QITextSelection;~QStructuredViewer;" element11="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~select~QStructuredViewer;~QISelection;" element12="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~setDefaultLinkingEnabled~Z" element13="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction" element2="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~resolveSelectio" element3="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~resolveSelection~QIEditorPart;~QITextSelection;~QStructuredViewer;" element4="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~setDefaultLinkingEnabled~ZQISelection;" element5="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~setDefaultLinkingEnabled~Z" element6="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~mergeSelection~QIStruct" element7="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~mergeSelection~QIStructuredSelection;~QIStructuredSelection;" element8="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~mergeSelection~QIStruct" element9="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction~mergeSelection~QIStructuredSelection;~QIStructuredSelection;" extract="7" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusProjectExplorerAction.java[FocusProjectExplorerAction" instanceof="false" name="FocusCommonNavigatorAction" replace="true" stamp="1168042218662" stubs="true" types="1" version="1.0"/>
+
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.resources/src/org.eclipse.mylar.resources' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'org.eclipse.mylar.resources/src/org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusCommonNavigatorAction.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.resources" element1="/src<org.eclipse.mylar.internal.ide.ui.actions{FocusCommonNavigatorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1168042478672" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/1/1/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2007/1/1/refactorings.index
new file mode 100644
index 0000000..cccfad7
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/1/1/refactorings.index
@@ -0,0 +1,3 @@
+1168041933787 Rename type 'FocusNavigatorAction'
+1168042218662 Extract superclass 'FocusCommonNavigatorAction'
+1168042478672 Move compilation unit
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..a315f79
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.context.ui/src/org.eclipse.mylar.internal.context.ui.actions' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'org.eclipse.mylar.context.ui/src/org.eclipse.mylar.internal.context.ui.actions' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.OpenRelatedElementsQuickView.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.context.ui.actions" element1="/src<org.eclipse.mylar.internal.ide.ui.actions{OpenRelatedElementsQuickView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.ide.ui.actions{OpenRelatedElementsQuickView.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1174608421107" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..6d4e141
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1 @@
+1174608421107 Copy compilation unit
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/4/15/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2007/4/15/refactorings.history
new file mode 100644
index 0000000..bbd52ea
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/4/15/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.xml.XmlJavaReferencesProvider' to 'XmlJavaRelationProvider' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.xml.XmlJavaReferencesProvider' - Renamed element: 'org.eclipse.mylar.internal.ide.xml.XmlJavaRelationProvider' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'XmlJavaReferencesProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.xml{XmlJavaReferencesProvider.java[XmlJavaReferencesProvider" matchStrategy="1" name="XmlJavaRelationProvider" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1176146566140" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original element: 'org.eclipse.mylar.internal.ide.xml.XmlJavaRelationProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.java.search" element1="/src<org.eclipse.mylar.internal.ide.xml{XmlJavaRelationProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1176149325180" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original element: 'org.eclipse.mylar.internal.ide.xml.XmlActiveSearchUpdater.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.java.search" element1="/src<org.eclipse.mylar.internal.ide.xml{XmlActiveSearchUpdater.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1176149339575" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original project: 'org.eclipse.mylar.ide' - Destination element: 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.search' - Original element: 'org.eclipse.mylar.internal.ide.xml.pde.PdeContextLabelProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.java.search" element1="/src<org.eclipse.mylar.internal.ide.xml.pde{PdeContextLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1176149353565" units="1" version="1.0"/>
+<refactoring comment="Rename field 'NAME' in 'org.eclipse.mylar.internal.ide.xml.ant.AntContextLabelProvider' to 'LABEL_RELATION' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.xml.ant.AntContextLabelProvider.NAME' - Renamed element: 'org.eclipse.mylar.internal.ide.xml.ant.AntContextLabelProvider.LABEL_RELATION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'NAME'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.ide.xml.ant{AntContextLabelProvider.java[AntContextLabelProvider^NAME" name="LABEL_RELATION" references="true" setter="false" stamp="1176149459411" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/4/15/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2007/4/15/refactorings.index
new file mode 100644
index 0000000..82c4a9e
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/4/15/refactorings.index
@@ -0,0 +1,5 @@
+1176146566140 Rename type 'XmlJavaReferencesProvider'
+1176149325180 Move compilation unit
+1176149339575 Move compilation unit
+1176149353565 Move compilation unit
+1176149459411 Rename field 'NAME'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..8ceab04
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProblemsListAction' to 'FocusProblemsListAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToProblemsListAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusProblemsListAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToProblemsListAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToProblemsListAction.java[ApplyMylarToProblemsListAction" matchStrategy="1" name="FocusProblemsListAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180264512713" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToTaskMarkersAction' to 'FocusTaskMarkersViewAction' - Original project: 'org.eclipse.mylar.ide' - Original element: 'org.eclipse.mylar.internal.ide.ui.actions.ApplyMylarToTaskMarkersAction' - Renamed element: 'org.eclipse.mylar.internal.ide.ui.actions.FocusTaskMarkersViewAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToTaskMarkersAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.ide.ui.actions{ApplyMylarToTaskMarkersAction.java[ApplyMylarToTaskMarkersAction" matchStrategy="1" name="FocusTaskMarkersViewAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180264553032" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..91e6ef6
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,2 @@
+1180264512713 Rename type 'ApplyMylarToProblemsListAction'
+1180264553032 Rename type 'ApplyMylarToTaskMarkersAction'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..7131a76
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.ide.MylarIdePlugin' to 'FocusedIdePlugin' - Original project: 'org.eclipse.mylyn.ide' - Original element: 'org.eclipse.mylyn.internal.ide.MylarIdePlugin' - Renamed element: 'org.eclipse.mylyn.internal.ide.FocusedIdePlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarIdePlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.ide{MylarIdePlugin.java[MylarIdePlugin" matchStrategy="1" name="FocusedIdePlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268284921" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.ide.FocusedIdePlugin' to 'IdeUiBridgePlugin' - Original project: 'org.eclipse.mylyn.ide' - Original element: 'org.eclipse.mylyn.internal.ide.FocusedIdePlugin' - Renamed element: 'org.eclipse.mylyn.internal.ide.IdeUiBridgePlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'FocusedIdePlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.ide{FocusedIdePlugin.java[FocusedIdePlugin" matchStrategy="1" name="IdeUiBridgePlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181330114855" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.ui' - Original element: 'org.eclipse.mylyn.internal.ide.IdeUiBridgePlugin.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.ide.ui" element1="/src<org.eclipse.mylyn.internal.ide{IdeUiBridgePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181353308126" units="1" version="1.0"/>
+<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylyn.ide.ant/src/org.eclipse.mylyn.internal.ide.ant' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'org.eclipse.mylyn.ide.ant/src/org.eclipse.mylyn.internal.ide.ant' - Original elements: org.eclipse.mylyn.internal.ide.xml.ant.AntStructureBridge.java org.eclipse.mylyn.internal.ide.xml.ant.AntContextLabelProvider.java org.eclipse.mylyn.internal.ide.xml.ant.AntUiBridge.java org.eclipse.mylyn.internal.ide.xml.ant.AntEditingMonitor.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.ide.ant" element1="/src<org.eclipse.mylyn.internal.ide.xml.ant{AntStructureBridge.java" element2="/src<org.eclipse.mylyn.internal.ide.xml.ant{AntContextLabelProvider.java" element3="/src<org.eclipse.mylyn.internal.ide.xml.ant{AntUiBridge.java" element4="/src<org.eclipse.mylyn.internal.ide.xml.ant{AntEditingMonitor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181353375982" units="4" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.ide.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Original element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.xml.ant'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.ide.xml.ant" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181354190996" subPackages="false" version="1.0"/>
+<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylyn.pde.ui/src/org.eclipse.mylyn.internal.pde.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'org.eclipse.mylyn.pde.ui/src/org.eclipse.mylyn.internal.pde.ui' - Original elements: org.eclipse.mylyn.internal.ide.xml.pde.PdeEditingMonitor.java org.eclipse.mylyn.internal.ide.xml.pde.PdeContextLabelProvider.java org.eclipse.mylyn.internal.ide.xml.pde.PdeStructureBridge.java org.eclipse.mylyn.internal.ide.xml.pde.PdeUiBridge.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.pde.ui" element1="/src<org.eclipse.mylyn.internal.ide.xml.pde{PdeEditingMonitor.java" element2="/src<org.eclipse.mylyn.internal.ide.xml.pde{PdeContextLabelProvider.java" element3="/src<org.eclipse.mylyn.internal.ide.xml.pde{PdeStructureBridge.java" element4="/src<org.eclipse.mylyn.internal.ide.xml.pde{PdeUiBridge.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181354244703" units="4" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.ide.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Original element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.xml.pde'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.ide.xml.pde" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181354249849" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.ide.ant' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'org.eclipse.mylyn.ide.ant' - Original element: 'icons'" description="Copy folder" destination="=org.eclipse.mylyn.ide.ant" element1="icons" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log="icons	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181354473949" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.pde.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'org.eclipse.mylyn.pde.ui' - Original element: 'icons'" description="Copy folder" destination="=org.eclipse.mylyn.pde.ui" element1="icons" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log="icons	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181354477982" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.ide.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Original element: 'etool16'" description="Delete element" element1="icons/etool16" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1181354496932" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.ide.ui' - Original project: 'org.eclipse.mylyn.ide.ui' - Original elements: task-bug.gif task-repository.gif" description="Delete elements" element1="icons/elcl16/task-bug.gif" element2="icons/elcl16/task-repository.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="2" stamp="1181354501760" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..0d26801
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,11 @@
+1181268284921 Rename type 'MylarIdePlugin'
+1181330114855 Rename type 'FocusedIdePlugin'
+1181353308126 Move compilation unit
+1181353375982 Move compilation units
+1181354190996 Delete element
+1181354244703 Move compilation units
+1181354249849 Delete element
+1181354473949 Copy folder
+1181354477982 Copy folder
+1181354496932 Delete element
+1181354501760 Delete elements
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..fbe98e3
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.ide/src/org.eclipse.mylyn.internal.bugzilla.ide.actions' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'org.eclipse.mylyn.bugzilla.ide/src/org.eclipse.mylyn.internal.bugzilla.ide.actions' - Original element: 'org.eclipse.mylyn.internal.ide.ui.actions.NewTaskFromErrorAction.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.bugzilla.ide.actions" element1="/src<org.eclipse.mylyn.internal.ide.ui.actions{NewTaskFromErrorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182864105971" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'icons' - Original project: 'org.eclipse.mylyn.ide.ui' - Destination element: 'icons' - Original element: 'etool16'" description="Copy folder" element1="icons/etool16" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log="icons/etool16	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182864155843" target="/org.eclipse.mylyn.bugzilla.ide/icons" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..a94070c
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1,2 @@
+1182864105971 Move compilation unit
+1182864155843 Copy folder
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..f1d9122
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.ide.ui.actions.OpenRelatedElementsQuickView.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.actions" element1="/src<org.eclipse.mylyn.internal.ide.ui.actions{OpenRelatedElementsQuickView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207715277203" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..8b4adad
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1 @@
+1207715277203 Move compilation unit
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..94054f6
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.ui'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Destination element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.ui'
- Original element: 'org.eclipse.mylyn.internal.ide.xml.XmlNodeHelper.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.ide.ui" element1="/src<org.eclipse.mylyn.internal.ide.xml{XmlNodeHelper.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210836549459" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.ide.ui'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Original element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.xml'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.ide.xml" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210836557533" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..f779e2e
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,2 @@
+1210836549459 Move compilation unit
+1210836557533 Delete element
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..53b9756
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.ui'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Destination element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.internal.ide.ui'
- Original element: 'org.eclipse.mylyn.internal.ide.ui.actions.AbstractFocusMarkerViewAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.ide.ui" element1="/src<org.eclipse.mylyn.internal.ide.ui.actions{AbstractFocusMarkerViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211259619902" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.ide.ui'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Destination element: 'org.eclipse.mylyn.ide.ui/src/org.eclipse.mylyn.ide.ui'
- Original element: 'org.eclipse.mylyn.internal.ide.ui.AbstractFocusMarkerViewAction.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.ide.ui" element1="/src<org.eclipse.mylyn.internal.ide.ui{AbstractFocusMarkerViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211259664788" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..fe396ec
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1211259619902 Move compilation unit
+1211259664788 Move compilation unit
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..385a617
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Original element: 'org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.ide.ui{IdeUiBridgePlugin.java[IdeUiBridgePlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213246478735" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..0a5fe2a
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1 @@
+1213246478735 Rename field 'PLUGIN_ID'
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2009/2/9/refactorings.history b/org.eclipse.mylyn.ide.ui/.refactorings/2009/2/9/refactorings.history
new file mode 100644
index 0000000..68494b2
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2009/2/9/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'method' in 'org.eclipse.mylyn.internal.ide.ui.MarkerInterestFilter' to 'markerCategoryMethod'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Original element: 'org.eclipse.mylyn.internal.ide.ui.MarkerInterestFilter.method'
- Renamed element: 'org.eclipse.mylyn.internal.ide.ui.MarkerInterestFilter.markerCategoryMethod'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'method'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.ide.ui{MarkerInterestFilter.java[MarkerInterestFilter^method" name="markerCategoryMethod" references="true" setter="true" stamp="1235674813410" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'object' in 'org.eclipse.mylyn.internal.ide.ui.MarkerInterestFilter.select(...)' to 'markerEntry'
- Original project: 'org.eclipse.mylyn.ide.ui'
- Original element: 'org.eclipse.mylyn.internal.ide.ui.MarkerInterestFilter.select(Viewer, Object, Object).object'
- Renamed element: 'object'
- Update references to refactored element" description="Rename local variable 'object'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.ide.ui{MarkerInterestFilter.java[MarkerInterestFilter~select~QViewer;~QObject;~QObject;@object!1945!1957!1952!1957!QObject;" name="markerEntry" references="true" stamp="1235675302202" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/.refactorings/2009/2/9/refactorings.index b/org.eclipse.mylyn.ide.ui/.refactorings/2009/2/9/refactorings.index
new file mode 100644
index 0000000..8a8ba5d
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.refactorings/2009/2/9/refactorings.index
@@ -0,0 +1,2 @@
+1235674813410 Rename field 'method'
+1235675302202 Rename local variable 'object'
diff --git a/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..5937a85
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Tue May 20 17:39:22 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=2
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.ide.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.ide.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ce6e222
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.ide.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.ui.navigator,
+ org.eclipse.ui.ide;bundle-version="3.4.0",
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.resources.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.internal.ide.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.ide.ui.actions;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.ide.ui/about.html b/org.eclipse.mylyn.ide.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/build-user.xml b/org.eclipse.mylyn.ide.ui/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/build.properties b/org.eclipse.mylyn.ide.ui/build.properties
new file mode 100644
index 0000000..e4d6cf5
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ plugin.xml,\
+ icons/,\
+ doc/,\
+ about.html,\
+ .,\
+ plugin.properties
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.ide.ui/doc/book.css b/org.eclipse.mylyn.ide.ui/doc/book.css
new file mode 100644
index 0000000..faa4199
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/doc/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.ide.ui/doc/concepts.html b/org.eclipse.mylyn.ide.ui/doc/concepts.html
new file mode 100644
index 0000000..2ce56b3
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/doc/concepts.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Degree of Interest</h2>
+<p>After you have activated a task, Mylar builds up a <i>degree of interest</i> model
+and uses this model to filter Eclipse views. Press the Mylar glasses on
+the view to toggle the filtering. To temporarily un filter a node Alt+click it.</p><p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/filtering-navigator.gif" width="353" height="195"></p>
+ You can also directly manually manipulate the
+ interest level of one or more elements by right clicking them and using the two
+ Mylar actions in the popup menu. Keyboard shortcuts for these
+ are Ctrl+Alt+Shift+Up Arrow for Make Landmark, and
+ Ctrl+Alt+Shift+Down Arrow for Make Less Interesting. <p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/interest-manipulate.gif" width="262" height="65"></p>Resources that are always
+ considered interesting can be configured to always show when the
+ interest filter is on, via the root Mylar preference page.
+ Note that the parent of the resource, e.g. the project or folder,
+ needs to be interesting for it's children to show.
+ <p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/filtering-exclusion.gif" width="420" height="240">
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.ide.ui/doc/navigation.html b/org.eclipse.mylyn.ide.ui/doc/navigation.html
new file mode 100644
index 0000000..34b1f7d
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/doc/navigation.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Workbench Navigation and Search</h2>
+The automatically updated Mylar Task
+ Context working set can be searched as any other working set, either
+ via the popup menus or using the search dialog. For example,
+ to find all System.out/err calls before checking in, search for
+ "System." within the task context. To quickly search all references
+ click Alt+Shift+G.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/search-context.gif" width="470" height="133"></p>
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.ide.ui/doc/toc.xml b/org.eclipse.mylyn.ide.ui/doc/toc.xml
new file mode 100644
index 0000000..f8f85bd
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/doc/toc.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.mylyn.doc/doc/toc.xml#concepts" label="Concepts">
+ <!-- <topic label="Concepts" href="doc/concepts.html">
+ </topic>
+ -->
+</toc>
+
+
+
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/edge-ref-xml.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/edge-ref-xml.gif
new file mode 100644
index 0000000..38bf351
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/edge-ref-xml.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/file-xml.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/file-xml.gif
new file mode 100644
index 0000000..8af38f9
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/file-xml.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/focus-disabled.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/focus.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/focus.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/elcl16/task-repository.gif b/org.eclipse.mylyn.ide.ui/icons/elcl16/task-repository.gif
new file mode 100644
index 0000000..78470a3
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/elcl16/task-repository.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/icons/etool16/task-repository-new.gif b/org.eclipse.mylyn.ide.ui/icons/etool16/task-repository-new.gif
new file mode 100644
index 0000000..5f33961
Binary files /dev/null and b/org.eclipse.mylyn.ide.ui/icons/etool16/task-repository-new.gif differ
diff --git a/org.eclipse.mylyn.ide.ui/plugin.properties b/org.eclipse.mylyn.ide.ui/plugin.properties
new file mode 100644
index 0000000..0ba91a4
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/plugin.properties
@@ -0,0 +1,17 @@
+#Properties file for org.eclipse.mylyn.ide.ui
+
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn IDE UI
+
+FocusProjectExplorerAction.label = Focus on Active Task
+FocusProjectExplorerAction.tooltip = Focus on Active Task (Alt+click to reveal filtered elements)
+FocusResourceNavigatorAction.label = Focus on Active Task
+FocusResourceNavigatorAction.tooltip = Focus on Active Task (Alt+click to reveal filtered elements)
+FocusProblemsListAction.label = Focus on Active Task
+FocusProblemsListAction.tooltip = Focus on Active Task
+FocusAllMarkersViewAction.label = Focus on Active Task
+FocusAllMarkersViewAction.tooltip = Focus on Active Task
+FocusTaskMarkersViewAction.label = Focus on Active Task
+FocusTaskMarkersViewAction.tooltip = Focus on Active Task
+FocusBookmarkMarkersViewAction.label = Focus on Active Task
+FocusBookmarkMarkersViewAction.tooltip = Focus on Active Task
diff --git a/org.eclipse.mylyn.ide.ui/plugin.xml b/org.eclipse.mylyn.ide.ui/plugin.xml
new file mode 100644
index 0000000..576e019
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/plugin.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension point="org.eclipse.ui.viewActions">
+ <viewContribution
+ id="org.eclipse.mylyn.ui.projectexplorer.filter"
+ targetID="org.eclipse.ui.navigator.ProjectExplorer">
+ <action
+ class="org.eclipse.mylyn.internal.ide.ui.actions.FocusProjectExplorerAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ide.ui.actions.focus.projectExplorer"
+ label="%FocusProjectExplorerAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusProjectExplorerAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+
+ <viewContribution
+ id="org.eclipse.mylyn.ui.resource.navigator.filter"
+ targetID="org.eclipse.ui.views.ResourceNavigator">
+ <action
+ class="org.eclipse.mylyn.internal.ide.ui.actions.FocusResourceNavigatorAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ide.ui.actions.focus.resourceNavigator"
+ label="%FocusResourceNavigatorAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusResourceNavigatorAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+ <viewContribution
+ id="org.eclipse.mylyn.problems.contribution"
+ targetID="org.eclipse.ui.views.ProblemView">
+ <action
+ class="org.eclipse.mylyn.internal.ide.ui.actions.FocusProblemsListAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ide.ui.actions.focus.markers.problems"
+ label="%FocusProblemsListAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusProblemsListAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+
+ <viewContribution
+ id="org.eclipse.mylyn.markers.all.contribution"
+ targetID="org.eclipse.ui.views.AllMarkersView">
+ <action
+ class="org.eclipse.mylyn.internal.ide.ui.actions.FocusAllMarkersViewAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ide.ui.actions.focus.markers.all"
+ label="%FocusAllMarkersViewAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusAllMarkersViewAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+
+ <viewContribution
+ id="org.eclipse.mylyn.markers.tasks.contribution"
+ targetID="org.eclipse.ui.views.TaskList">
+ <action
+ class="org.eclipse.mylyn.internal.ide.ui.actions.FocusTaskMarkersViewAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ide.ui.actions.focus.markers.tasks"
+ label="%FocusTaskMarkersViewAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusTaskMarkersViewAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+ <viewContribution
+ id="org.eclipse.mylyn.markers.bookmarks.contribution"
+ targetID="org.eclipse.ui.views.BookmarkView">
+ <action
+ class="org.eclipse.mylyn.internal.ide.ui.actions.FocusBookmarkMarkersViewAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ide.ui.actions.focus.markers.bookmarks"
+ label="%FocusBookmarkMarkersViewAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusBookmarkMarkersViewAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.context.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin$IdeUiBridgeStartup">
+ </startup>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/ide/ui/AbstractFocusMarkerViewAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/ide/ui/AbstractFocusMarkerViewAction.java
new file mode 100644
index 0000000..db4e98f
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/ide/ui/AbstractFocusMarkerViewAction.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin;
+import org.eclipse.mylyn.internal.ide.ui.MarkerInterestFilter;
+import org.eclipse.mylyn.internal.ide.ui.MarkerViewLabelProvider;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.internal.views.markers.ExtendedMarkersView;
+import org.eclipse.ui.internal.views.markers.MarkersTreeViewer;
+import org.eclipse.ui.views.markers.internal.TableViewLabelProvider;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public abstract class AbstractFocusMarkerViewAction extends AbstractFocusViewAction {
+
+ private StructuredViewer cachedViewer = null;
+
+ public AbstractFocusMarkerViewAction() {
+ super(new MarkerInterestFilter(), true, true, false);
+ }
+
+ public AbstractFocusMarkerViewAction(InterestFilter interestFilter, boolean manageViewer, boolean manageFilters,
+ boolean manageLinking) {
+ super(interestFilter, manageFilters, manageFilters, manageLinking);
+ }
+
+ /**
+ * HACK: should use platform decorating label provider
+ *
+ * @param viewer
+ */
+ protected void updateMarkerViewLabelProvider(StructuredViewer viewer) {
+ if (viewer != null) {
+ IBaseLabelProvider currentProvider = viewer.getLabelProvider();
+ if (currentProvider instanceof TableViewLabelProvider
+ && !(currentProvider instanceof MarkerViewLabelProvider)) {
+ viewer.setLabelProvider(new MarkerViewLabelProvider((TableViewLabelProvider) currentProvider));
+ }
+ }
+ }
+
+ /**
+ * HACK: changing accessibility
+ */
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ if (cachedViewer == null) {
+ try {
+ IViewPart viewPart = super.getPartForAction();
+ if (viewPart != null) {
+ // NOTE: following code is Eclipse 3.4 specific
+ Class<?> clazz = ExtendedMarkersView.class;
+ Field field = clazz.getDeclaredField("viewer"); //$NON-NLS-1$
+ field.setAccessible(true);
+ cachedViewer = (MarkersTreeViewer) field.get(viewPart);
+ if (cachedViewer != null && !cachedViewer.getControl().isDisposed()) {
+ updateMarkerViewLabelProvider(cachedViewer);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, IdeUiBridgePlugin.ID_PLUGIN,
+ "Could not get problems view viewer", e)); //$NON-NLS-1$
+ }
+ }
+ if (cachedViewer != null) {
+ viewers.add(cachedViewer);
+ }
+ return viewers;
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ cachedViewer = null;
+ for (StructuredViewer viewer : getViewers()) {
+ if (viewer instanceof TableViewer) {
+ TableViewer tableViewer = (TableViewer) viewer;
+ if (!(tableViewer.getLabelProvider() instanceof MarkerViewLabelProvider)) {
+ tableViewer.setLabelProvider(new MarkerViewLabelProvider(
+ (TableViewLabelProvider) tableViewer.getLabelProvider()));
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/ide/ui/AbstractMarkerInterestFilter.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/ide/ui/AbstractMarkerInterestFilter.java
new file mode 100644
index 0000000..be1a7d6
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/ide/ui/AbstractMarkerInterestFilter.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public abstract class AbstractMarkerInterestFilter extends InterestFilter {
+
+ protected boolean isInteresting(IMarker marker, Viewer viewer, Object parent) {
+ if (isImplicitlyInteresting(marker)) {
+ return true;
+ } else {
+ String handle = ContextCore.getStructureBridge(marker.getResource().getFileExtension())
+ .getHandleForOffsetInObject(marker, 0);
+ if (handle == null) {
+ return false;
+ } else {
+ return super.select(viewer, parent, ContextCore.getContextManager().getElement(handle));
+ }
+ }
+ }
+
+ protected abstract boolean isImplicitlyInteresting(IMarker marker);
+
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/IdeUiBridgePlugin.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/IdeUiBridgePlugin.java
new file mode 100644
index 0000000..a28c943
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/IdeUiBridgePlugin.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ */
+public class IdeUiBridgePlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.ide"; //$NON-NLS-1$
+
+ private static IdeUiBridgePlugin INSTANCE;
+
+ public static final ImageDescriptor EDGE_REF_XML = getImageDescriptor("icons/elcl16/edge-ref-xml.gif"); //$NON-NLS-1$
+
+ public static class IdeUiBridgeStartup implements IContextUiStartup {
+
+ public void lazyStartup() {
+ // ignore, it is sufficient that the bundle is activated on context ui startup
+ }
+
+ }
+
+ public IdeUiBridgePlugin() {
+ INSTANCE = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ }
+
+ public static IdeUiBridgePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in relative path.
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.ide", path); //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/IdeUiUtil.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/IdeUiUtil.java
new file mode 100644
index 0000000..1b80581
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/IdeUiUtil.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.navigator.ResourceNavigator;
+
+/**
+ * @author Mik Kersten
+ */
+public class IdeUiUtil {
+
+ public static final String ID_VIEW_SYNCHRONIZE = "org.eclipse.team.sync.views.SynchronizeView"; //$NON-NLS-1$
+
+ public static final String ID_NAVIGATOR = "org.eclipse.ui.views.ResourceNavigator"; //$NON-NLS-1$
+
+ public static IViewPart getView(String id) {
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (activePage == null) {
+ return null;
+ }
+ IViewPart view = activePage.findView(id);
+ return view;
+ }
+
+// public static void forceSynchronizeViewUpdate() {
+// IViewPart view = getView(ID_VIEW_SYNCHRONIZE);
+// if (view instanceof SynchronizeView) {
+// SynchronizeView syncView = (SynchronizeView)view;
+// IPage currentPage = syncView.getCurrentPage();
+// if (currentPage instanceof ModelSynchronizePage) {
+// ModelSynchronizePage modelPage = (ModelSynchronizePage)currentPage;
+//// String currentProvider = (String)modelPage.getConfiguration().getProperty(ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER);
+//// modelPage.getConfiguration().setProperty(
+//// ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER,
+//// ResourceModelProvider.RESOURCE_MODEL_PROVIDER_ID);
+//
+// modelPage.getConfiguration().setProperty(
+// ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER,
+// ChangeSetModelProvider.ID);
+//
+// }
+// }
+// }
+
+ public static ResourceNavigator getNavigatorFromActivePage() {
+ if (PlatformUI.getWorkbench() == null || PlatformUI.getWorkbench().getActiveWorkbenchWindow() == null) {
+ return null;
+ }
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (activePage == null) {
+ return null;
+ }
+ IViewPart view = activePage.findView(ID_NAVIGATOR);
+ if (view instanceof ResourceNavigator) {
+ return (ResourceNavigator) view;
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerInterestFilter.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerInterestFilter.java
new file mode 100644
index 0000000..61b4af7
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerInterestFilter.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import java.lang.reflect.Method;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.ide.ui.AbstractMarkerInterestFilter;
+import org.eclipse.ui.views.markers.MarkerItem;
+
+/**
+ * @author Mik Kersten
+ */
+public class MarkerInterestFilter extends AbstractMarkerInterestFilter {
+
+ private Method markerCategoryMethod = null;
+
+ @Override
+ public boolean select(Viewer viewer, Object parent, Object element) {
+
+ if (element instanceof MarkerItem) {
+ if (element.getClass().getSimpleName().equals("MarkerCategory")) { //$NON-NLS-1$
+ try {
+ if (markerCategoryMethod == null) {
+ Class<?> markerCategoryClass = Class.forName("org.eclipse.ui.internal.views.markers.MarkerCategory"); //$NON-NLS-1$
+ markerCategoryMethod = markerCategoryClass.getDeclaredMethod("getChildren", new Class[] {}); //$NON-NLS-1$
+ markerCategoryMethod.setAccessible(true);
+ }
+
+ Object[] entries = (Object[]) markerCategoryMethod.invoke(element, new Object[] {});
+ if (entries != null && entries.length == 0) {
+ return false;
+ } else if (entries != null && entries.length != 0) {
+ // PERFORMANCE: need to look down children, so O(n^2) complexity
+ for (Object markerEntry : entries) {
+ if (markerEntry.getClass().getSimpleName().equals("MarkerEntry") //$NON-NLS-1$
+ && isInteresting(((MarkerItem) markerEntry).getMarker(), viewer, parent)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, IdeUiBridgePlugin.ID_PLUGIN,
+ "Could not access marker view elements.")); //$NON-NLS-1$
+ }
+
+ return true;
+ } else if (element.getClass().getSimpleName().equals("MarkerEntry")) { //$NON-NLS-1$
+ return isInteresting(((MarkerItem) element).getMarker(), viewer, parent);
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ protected boolean isImplicitlyInteresting(IMarker marker) {
+ try {
+ Object severity = marker.getAttribute(IMarker.SEVERITY);
+ return severity != null && severity.equals(IMarker.SEVERITY_ERROR);
+ } catch (CoreException e) {
+ // ignore
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerViewLabelProvider.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerViewLabelProvider.java
new file mode 100644
index 0000000..613d05b
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerViewLabelProvider.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.markers.internal.ConcreteMarker;
+import org.eclipse.ui.views.markers.internal.TableViewLabelProvider;
+
+/**
+ * @author Mik Kersten
+ */
+public class MarkerViewLabelProvider implements ITableLabelProvider, IColorProvider, IFontProvider {
+
+ private final TableViewLabelProvider provider;
+
+ public MarkerViewLabelProvider(TableViewLabelProvider provider) {
+ this.provider = provider;
+ }
+
+ public Font getFont(Object element) {
+ if (element instanceof ConcreteMarker) {
+ String handle = ContextCore.getStructureBridge(((ConcreteMarker) element).getResource().getFileExtension())
+ .getHandleForOffsetInObject((element), 0);
+ IInteractionElement node = ContextCore.getContextManager().getElement(handle);
+ if (node != null) {
+ if (node.getInterest().isLandmark() && !node.getInterest().isPropagated()) {
+ return CommonFonts.BOLD;
+ }
+ }
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return provider.getColumnImage(element, columnIndex);
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ return provider.getColumnText(element, columnIndex);
+ }
+
+ public Color getForeground(Object element) {
+ if (element instanceof ConcreteMarker) {
+ String handle = ContextCore.getStructureBridge(((ConcreteMarker) element).getResource().getFileExtension())
+ .getHandleForOffsetInObject((element), 0);
+ return ContextUi.getForeground(ContextCore.getContextManager().getElement(handle));
+ } else {
+ return null;
+ }
+ }
+
+ public Color getBackground(Object element) {
+ return null;
+// if (element instanceof ConcreteMarker) {
+// String handle = ContextCore.getStructureBridge(
+// ((ConcreteMarker) element).getResource().getFileExtension()).getHandleForOffsetInObject((element),
+// 0);
+// return UiUtil.getBackgroundForElement(ContextCorePlugin.getContextManager().getElement(handle));
+// } else {
+// return null;
+// }
+ }
+
+ /**
+ * TODO: handle listeners?
+ */
+ public void addListener(ILabelProviderListener listener) {
+ // provider.addListener(listener);
+ }
+
+ public void dispose() {
+ provider.dispose();
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return provider.isLabelProperty(element, property);
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // removeListener(listener);
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerViewerInterestSorter.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerViewerInterestSorter.java
new file mode 100644
index 0000000..1803670
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/MarkerViewerInterestSorter.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.InterestComparator;
+import org.eclipse.ui.views.markers.internal.ProblemMarker;
+
+/**
+ * @author Mik Kersten
+ */
+public class MarkerViewerInterestSorter extends ViewerSorter {
+
+ protected InterestComparator<IInteractionElement> interestComparator = new InterestComparator<IInteractionElement>();
+
+ @Override
+ public int compare(Viewer viewer, Object obj1, Object obj2) {
+ if (obj1 instanceof ProblemMarker && obj1 instanceof ProblemMarker) {
+ ProblemMarker marker1 = (ProblemMarker) obj1;
+ ProblemMarker marker2 = (ProblemMarker) obj2;
+ if (marker1.getSeverity() == IMarker.SEVERITY_ERROR && marker2.getSeverity() < IMarker.SEVERITY_ERROR) {
+ return -1;
+ } else if (marker2.getSeverity() == IMarker.SEVERITY_ERROR
+ && marker1.getSeverity() < IMarker.SEVERITY_ERROR) {
+ return 1;
+ } else {
+ if (ContextCore.getContextManager().isContextActive()) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(marker1.getResource()
+ .getFileExtension());
+ IInteractionElement node1 = ContextCore.getContextManager().getElement(
+ bridge.getHandleForOffsetInObject(marker1, 0));
+ IInteractionElement node2 = ContextCore.getContextManager().getElement(
+ bridge.getHandleForOffsetInObject(marker2, 0));
+ return interestComparator.compare(node1, node2);
+ }
+ }
+ }
+ return super.compare(viewer, obj1, obj2);
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/XmlNodeHelper.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/XmlNodeHelper.java
new file mode 100644
index 0000000..25ad42b
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/XmlNodeHelper.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+
+/**
+ * Class to help get the handle for an xml file
+ *
+ * @author Shawn Minto
+ */
+public class XmlNodeHelper {
+
+ /** The filename of the xml file */
+ private String filename;
+
+ /** The start line of the node */
+ private String end;
+
+ public XmlNodeHelper(String handle) {
+ int first = handle.indexOf(";"); //$NON-NLS-1$
+ if (first == -1) {
+ filename = handle;
+ end = ""; //$NON-NLS-1$
+ } else {
+ filename = handle.substring(0, first);
+ end = handle.substring(first + 1);
+ }
+ }
+
+ /**
+ * Constructor - used for pde
+ *
+ * @param filename
+ * The filename
+ * @param startOffset
+ * The start line for the node
+ */
+ public XmlNodeHelper(String filename, int s) {
+ this.filename = filename;
+ this.end = "" + s; //$NON-NLS-1$
+ }
+
+ /**
+ * Constructor - used for ant
+ *
+ * @param filename
+ * The filename
+ * @param startOffset
+ * The start line for the node
+ */
+ public XmlNodeHelper(String filename, String s) {
+ this.filename = filename;
+ this.end = s;
+ }
+
+ /**
+ * Get the handle for the node Format: filename;startOffset
+ *
+ * @return The to the node handle in String form
+ */
+ public String getHandle() {
+ return filename + ";" + getValue(); //$NON-NLS-1$
+ }
+
+ public String getFilename() {
+ if (filename != null) {
+ filename = filename.trim();
+ }
+ return filename;
+ }
+
+ public String getValue() {
+ return end;
+ }
+
+ @Override
+ public boolean equals(Object e) {
+ if (e instanceof XmlNodeHelper) {
+ XmlNodeHelper xnode = ((XmlNodeHelper) e);
+ return xnode.getHandle().equals(getHandle());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return getHandle().hashCode();
+ }
+
+ /**
+ * Get the contents of an InputStream
+ *
+ * @param is
+ * The InputStream to get the contents for
+ * @return The <code>String</code> representing the contents
+ */
+ public static String getContents(InputStream is) {
+ String contents = ""; //$NON-NLS-1$
+
+ // create a new reader for the stream
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ try {
+
+ // get the contents
+ String s = ""; //$NON-NLS-1$
+ char[] cbuf = new char[512];
+ while (br.read(cbuf) != -1) {
+ s = new String(cbuf);
+ contents += s;
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, IdeUiBridgePlugin.ID_PLUGIN, "Could not get contents", e)); //$NON-NLS-1$
+ }
+ return contents;
+ }
+
+ // XXX needed if we are parsing the data again to get info instead of using
+ // the xml models
+ //
+ // private void parseContents(IDocument d, String contents){
+ // String [] lines = contents.split("\n");
+ // boolean inQuote = false;
+ // boolean attr = false;
+ // String attrName = "";
+ // String attrVal = "";
+ // String oldAttrVal = "";
+ // char prevChar = ' ';
+ // for(int i = endLine - 1; i >= 0; i--){
+ // // parse backwards
+ //
+ // String line = lines[i];
+ // for(int cpos = line.length()-1; cpos >=0; cpos--){
+ //
+ // if(attr){
+ // if(attrName.length() != 0 && (isWhitespace(line.charAt(cpos))))
+ // {
+ // attr = false;
+ // if(attrName.toLowerCase(Locale.ENGLISH).equals("name"))
+ // {
+ // name = oldAttrVal;
+ // }
+ // }
+ // attrName = line.charAt(cpos) + attrName;
+ // }
+ //
+ // if(line.charAt(cpos) == '"' && inQuote){
+ // inQuote = false;
+ // }else if(line.charAt(cpos) == '"' && !inQuote){
+ // inQuote = true;
+ // }else if(!inQuote && line.charAt(cpos) == '<' && prevChar != '/'){
+ // int space = line.indexOf(" ", cpos);
+ // if(space == -1)
+ // tagName = line.substring(cpos + 1);
+ // else
+ // tagName = line.substring(cpos + 1, space);
+ // return;
+ // }else if(!inQuote && line.charAt(cpos) =='='){
+ // attr = true;
+ // attrName = "";
+ // oldAttrVal = attrVal;
+ // attrVal = "";
+ // }else if(inQuote){
+ // attrVal = line.charAt(cpos) + attrVal;
+ // }
+ // prevChar = line.charAt(cpos);
+ // }
+ // }
+ // }
+ //
+ // private boolean isWhitespace(char c){
+ // return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+ // }
+ //
+ // public String getCanName()
+ // {
+ // int slash = filename.lastIndexOf("/");
+ // String file = slash==-1?filename:filename.substring(slash+1);
+ // String s = file + ": " + getTagName();
+ // if(getName() != null)
+ // s += " \"" + getName() + "\"";
+ // s += " : " + startOffset;
+ // return s;
+ // }
+ //
+ // public String getTagName() {
+ // if(tagName != null)
+ // tagName = tagName.trim();
+ // return tagName;
+ // }
+
+ // public void setTagName(String tagName) {
+ // this.tagName = tagName;
+ // }
+
+ // public String getName() {
+ // if(name != null)
+ // name = name.trim();
+ // return name;
+ // }
+
+ // public void setName(String name) {
+ // this.name = name;
+ // }
+
+ //
+ // public int getEndLine() {
+ // return endLine;
+ // }
+ //
+ //
+ // public void setEndLine(int endLine) {
+ // this.endLine = endLine;
+ // }
+
+ //
+ //
+ // public void setStartLine(int startOffset) {
+ // this.startLine = startOffset;
+ // }
+
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusAllMarkersViewAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusAllMarkersViewAction.java
new file mode 100644
index 0000000..ecb09d2
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusAllMarkersViewAction.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui.actions;
+
+import org.eclipse.mylyn.ide.ui.AbstractFocusMarkerViewAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusAllMarkersViewAction extends AbstractFocusMarkerViewAction {
+
+ public FocusAllMarkersViewAction() {
+ super();
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusBookmarkMarkersViewAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusBookmarkMarkersViewAction.java
new file mode 100644
index 0000000..b9f17bb
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusBookmarkMarkersViewAction.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui.actions;
+
+import org.eclipse.mylyn.ide.ui.AbstractFocusMarkerViewAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusBookmarkMarkersViewAction extends AbstractFocusMarkerViewAction {
+
+ public FocusBookmarkMarkersViewAction() {
+ super();
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusProblemsListAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusProblemsListAction.java
new file mode 100644
index 0000000..db7a203
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusProblemsListAction.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui.actions;
+
+import org.eclipse.mylyn.ide.ui.AbstractFocusMarkerViewAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusProblemsListAction extends AbstractFocusMarkerViewAction {
+
+ public FocusProblemsListAction() {
+ super();
+ }
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusProjectExplorerAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusProjectExplorerAction.java
new file mode 100644
index 0000000..e46e063
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusProjectExplorerAction.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.navigator.CommonNavigator;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusProjectExplorerAction extends FocusCommonNavigatorAction {
+
+ public FocusProjectExplorerAction() {
+ super(new InterestFilter(), true, true, true);
+ }
+
+ protected FocusProjectExplorerAction(InterestFilter filter) {
+ super(filter, true, true, true);
+ }
+
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+
+ IViewPart view = super.getPartForAction();
+ if (view instanceof CommonNavigator) {
+ CommonNavigator navigator = (CommonNavigator) view;
+ viewers.add(navigator.getCommonViewer());
+ }
+ return viewers;
+ }
+
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusResourceNavigatorAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusResourceNavigatorAction.java
new file mode 100644
index 0000000..c79f3ab
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusResourceNavigatorAction.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylyn.context.ui.AbstractAutoFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.views.navigator.FilterSelectionAction;
+import org.eclipse.ui.views.navigator.IResourceNavigator;
+import org.eclipse.ui.views.navigator.ResourceNavigator;
+import org.eclipse.ui.views.navigator.ToggleLinkingAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusResourceNavigatorAction extends AbstractAutoFocusViewAction {
+
+ public FocusResourceNavigatorAction() {
+ super(new InterestFilter(), true, true, true);
+ }
+
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ IViewPart part = super.getPartForAction();
+ if (part instanceof ResourceNavigator) {
+ viewers.add(((ResourceNavigator) part).getTreeViewer());
+ }
+ return viewers;
+ }
+
+ @Override
+ protected ISelection resolveSelection(IEditorPart part, ITextSelection changedSelection, StructuredViewer viewer)
+ throws CoreException {
+ IEditorInput input = part.getEditorInput();
+ Object adapted = input.getAdapter(IResource.class);
+ if (adapted instanceof IResource) {
+ return new StructuredSelection(adapted);
+ } else {
+ return null;
+ }
+ }
+
+ // TODO: should have better way of doing this
+ @Override
+ protected void setManualFilteringAndLinkingEnabled(boolean on) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof IResourceNavigator) {
+ for (IContributionItem item : ((IResourceNavigator) part).getViewSite()
+ .getActionBars()
+ .getToolBarManager()
+ .getItems()) {
+ if (item instanceof ActionContributionItem) {
+ ActionContributionItem actionItem = (ActionContributionItem) item;
+ if (actionItem.getAction() instanceof ToggleLinkingAction) {
+ actionItem.getAction().setEnabled(on);
+ }
+ }
+ }
+ for (IContributionItem item : ((IResourceNavigator) part).getViewSite()
+ .getActionBars()
+ .getMenuManager()
+ .getItems()) {
+ if (item instanceof ActionContributionItem) {
+ ActionContributionItem actionItem = (ActionContributionItem) item;
+ // TODO: consider filing bug asking for extensibility
+ if (actionItem.getAction() instanceof FilterSelectionAction) {
+ actionItem.getAction().setEnabled(on);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void setDefaultLinkingEnabled(boolean on) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof IResourceNavigator) {
+ ((IResourceNavigator) part).setLinkingEnabled(on);
+ }
+ }
+
+ @Override
+ protected boolean isDefaultLinkingEnabled() {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof IResourceNavigator) {
+ return ((IResourceNavigator) part).isLinkingEnabled();
+ }
+ return false;
+ }
+
+// private Set<String> getPreservedFilterPatterns() {
+// Set<String> preservedIds = ContextUiPlugin.getDefault().getPreservedFilterIds(viewPart.getSite().getId());
+// IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(
+// "org.eclipse.ui.ide.resourceFilters"); //$NON-NLS-1$
+// Set<String> filters = new HashSet<String>();
+// if (extension != null) {
+// IExtension[] extensions = extension.getExtensions();
+// for (IExtension extension2 : extensions) {
+// IConfigurationElement[] configElements = extension2.getConfigurationElements();
+// if (extension2.getUniqueIdentifier() != null && preservedIds.contains(extension2.getUniqueIdentifier())) {
+// for (IConfigurationElement configElement : configElements) {
+// String pattern = configElement.getAttribute("pattern");//$NON-NLS-1$
+// if (pattern != null) {
+// filters.add(pattern);
+// }
+// }
+// }
+//
+// }
+// }
+// return filters;
+// }
+
+// @Override
+// protected boolean isPreservedFilter(ViewerFilter filter) {
+// if (filter instanceof ResourcePatternFilter) {
+// Set<String> preservedFilterPatterns = getPreservedFilterPatterns();
+// //NOTE: since the resource filters are all contained in one filter, if one is preserved, then we preserve all filters
+// for (String pattern : ((ResourcePatternFilter) filter).getPatterns()) {
+// if (preservedFilterPatterns.contains(pattern)) {
+// return true;
+// }
+// }
+// }
+// return super.isPreservedFilter(filter);
+// }
+
+}
diff --git a/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusTaskMarkersViewAction.java b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusTaskMarkersViewAction.java
new file mode 100644
index 0000000..7257da8
--- /dev/null
+++ b/org.eclipse.mylyn.ide.ui/src/org/eclipse/mylyn/internal/ide/ui/actions/FocusTaskMarkersViewAction.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ide.ui.actions;
+
+import org.eclipse.mylyn.ide.ui.AbstractFocusMarkerViewAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusTaskMarkersViewAction extends AbstractFocusMarkerViewAction {
+
+ public FocusTaskMarkersViewAction() {
+ super();
+ }
+}
diff --git a/org.eclipse.mylyn.java-feature/.project b/org.eclipse.mylyn.java-feature/.project
new file mode 100644
index 0000000..8f5654d
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.java-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.java-feature/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.java-feature/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..8d37d25
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 7 elements(s) to 'org.eclipse.mylyn.context-feature' - Original project: 'org.eclipse.mylyn.java-feature' - Destination element: 'org.eclipse.mylyn.context-feature' - Original elements: feature.xml build.properties about.html license.html .project epl-v10.html .settings" description="Copy elements" element1="feature.xml" element2="build.properties" element3="about.html" element4="license.html" element5=".project" element6="epl-v10.html" element7=".settings" files="6" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log="feature.xml	true	false about.html	true	false build.properties	true	false license.html	true	false epl-v10.html	true	false .settings	true	false .project	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181871057193" target="/scratch/org.eclipse.mylyn/org.eclipse.mylyn.context-feature" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java-feature/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.java-feature/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..7dd4dbc
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181871057193 Copy elements
diff --git a/org.eclipse.mylyn.java-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.java-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.java-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..4c9ebcf
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:51 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.java-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..c5074cd
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:08:31 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.java-feature/about.html b/org.eclipse.mylyn.java-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java-feature/build.properties b/org.eclipse.mylyn.java-feature/build.properties
new file mode 100644
index 0000000..dcaa2fa
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.java-feature/epl-v10.html b/org.eclipse.mylyn.java-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java-feature/feature.properties b/org.eclipse.mylyn.java-feature/feature.properties
new file mode 100644
index 0000000..90bd455
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Bridge: Java Development
+description=Mylyn Task-Focused UI extensions for JDT. Provides focusing of Java element views and editors.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.java-feature/feature.xml b/org.eclipse.mylyn.java-feature/feature.xml
new file mode 100644
index 0000000..4b13feb
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/feature.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.java_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.debug.ui"/>
+ <import plugin="org.eclipse.jdt.core"/>
+ <import plugin="org.eclipse.jdt.debug"/>
+ <import plugin="org.eclipse.jdt.debug.ui"/>
+ <import plugin="org.eclipse.jdt.junit"/>
+ <import plugin="org.eclipse.jdt.launching"/>
+ <import plugin="org.eclipse.jdt.ui"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.search"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.resources.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.ide.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.ui.navigator"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.ant.ui"/>
+ <import feature="org.eclipse.mylyn.context_feature" version="3.2.1.qualifier" match="perfect"/>
+ <import feature="org.eclipse.jdt" version="3.4.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.java.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.java.tasks"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.ide.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.ide.ant"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.java-feature/license.html b/org.eclipse.mylyn.java-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.java-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.java.tasks/.classpath b/org.eclipse.mylyn.java.tasks/.classpath
new file mode 100644
index 0000000..81bbfc0
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/jdt/internal/debug/ui/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/jdt/internal/junit/model/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.java.tasks/.cvsignore b/org.eclipse.mylyn.java.tasks/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.java.tasks/.project b/org.eclipse.mylyn.java.tasks/.project
new file mode 100644
index 0000000..4648426
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.java.tasks</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.java.tasks/.refactorings/2008/10/42/refactorings.history b/org.eclipse.mylyn.java.tasks/.refactorings/2008/10/42/refactorings.history
new file mode 100644
index 0000000..e896f56
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.refactorings/2008/10/42/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.java.tasks.JavaStackTraceHyperlinkDetector.detectHyperlinks().offset' in 'org.eclipse.mylyn.internal.java.tasks.JavaStackTraceHyperlinkDetector.detectHyperlinks()'
- Original project: 'org.eclipse.mylyn.java.tasks'
- Original element: 'org.eclipse.mylyn.internal.java.tasks.JavaStackTraceHyperlinkDetector.detectHyperlinks().offset'" description="Inline local variable 'offset'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.java.tasks{JavaStackTraceHyperlinkDetector.java" selection="1366 27" stamp="1223786285748" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tasks/.refactorings/2008/10/42/refactorings.index b/org.eclipse.mylyn.java.tasks/.refactorings/2008/10/42/refactorings.index
new file mode 100644
index 0000000..55cedc1
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.refactorings/2008/10/42/refactorings.index
@@ -0,0 +1 @@
+1223786285748 Inline local variable 'offset'
diff --git a/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..5e70d08
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Sat Mar 01 03:38:47 PST 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.java.tasks/META-INF/MANIFEST.MF b/org.eclipse.mylyn.java.tasks/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0518384
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.java.tasks;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.debug.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.debug.ui,
+ org.eclipse.jdt.junit,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.internal.java.tasks;x-internal:=true
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.java.tasks/about.html b/org.eclipse.mylyn.java.tasks/about.html
new file mode 100644
index 0000000..0dd939c
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 7, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tasks/build.properties b/org.eclipse.mylyn.java.tasks/build.properties
new file mode 100644
index 0000000..2089240
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
+
diff --git a/org.eclipse.mylyn.java.tasks/icons/etool16/task-new.gif b/org.eclipse.mylyn.java.tasks/icons/etool16/task-new.gif
new file mode 100644
index 0000000..e2cde50
Binary files /dev/null and b/org.eclipse.mylyn.java.tasks/icons/etool16/task-new.gif differ
diff --git a/org.eclipse.mylyn.java.tasks/plugin.properties b/org.eclipse.mylyn.java.tasks/plugin.properties
new file mode 100644
index 0000000..5d0469c
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/plugin.properties
@@ -0,0 +1,7 @@
+#Properties file for org.eclipse.mylyn.java.tasks
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Java Tasks
+
+JavaStackTraceHyperlinkDetector.name = Mylyn Stack Trace
+
+NewTaskFromJunitResultViewAction.label = New Task from Failure...
diff --git a/org.eclipse.mylyn.java.tasks/plugin.xml b/org.eclipse.mylyn.java.tasks/plugin.xml
new file mode 100644
index 0000000..a0e744f
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+ <hyperlinkDetector
+ class="org.eclipse.mylyn.internal.java.tasks.JavaStackTraceHyperlinkDetector"
+ id="org.eclipse.mylyn.java.hyperlink.detector.stack"
+ name="%JavaStackTraceHyperlinkDetector.name"
+ targetId="org.eclipse.ui.DefaultTextEditor"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ id="org.eclipse.mylyn.bugzilla.ui.contribution"
+ targetID="org.eclipse.jdt.junit.ResultView">
+ <action
+ class="org.eclipse.mylyn.internal.java.tasks.NewTaskFromJunitResultViewAction"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.bugzilla.actions.newTaskFromJunitResultView"
+ label="%NewTaskFromJunitResultViewAction.label"
+ menubarPath="org.eclipse.jdt.junit.ResultView"/>
+ </viewerContribution>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/JavaStackTraceFileHyperlink.java b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/JavaStackTraceFileHyperlink.java
new file mode 100644
index 0000000..214d57d
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/JavaStackTraceFileHyperlink.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.tasks;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
+import org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.tasks.ui.IHighlightingHyperlink;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Rob Elves
+ */
+public class JavaStackTraceFileHyperlink implements IHyperlink, IHighlightingHyperlink {
+
+ private final IRegion region;
+
+ private final String traceLine;
+
+ private final IRegion highlightingRegion;
+
+ public JavaStackTraceFileHyperlink(IRegion region, String traceLine, IRegion highlightingRegion) {
+ this.region = region;
+ this.traceLine = traceLine;
+ this.highlightingRegion = highlightingRegion;
+ }
+
+ public IRegion getHyperlinkRegion() {
+ return region;
+ }
+
+ public String getHyperlinkText() {
+ // ignore
+ return null;
+ }
+
+ public String getTypeLabel() {
+ // ignore
+ return null;
+ }
+
+ public void open() {
+
+ try {
+
+ String typeName = getTypeName();
+ int lineNumber = getLineNumber();
+
+ // documents start at 0
+ if (lineNumber > 0) {
+ lineNumber--;
+ }
+
+ startSourceSearch(typeName, lineNumber);
+
+ } catch (CoreException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.JavaStackTraceFileHyperlink_Open_Type,
+ Messages.JavaStackTraceFileHyperlink_Failed_to_open_type);
+ return;
+ }
+
+ }
+
+ /**
+ * Starts a search for the type with the given name. Reports back to 'searchCompleted(...)'.
+ *
+ * @param typeName
+ * the type to search for
+ */
+ protected void startSourceSearch(final String typeName, final int lineNumber) {
+ Job search = new Job(Messages.JavaStackTraceFileHyperlink_Searching_) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ // search for the type in the workspace
+ Object result = OpenTypeAction.findTypeInWorkspace(typeName);
+ searchCompleted(result, typeName, lineNumber, null);
+ } catch (CoreException e) {
+ searchCompleted(null, typeName, lineNumber, e.getStatus());
+ }
+ return Status.OK_STATUS;
+ }
+
+ };
+ search.schedule();
+ }
+
+ protected void searchCompleted(final Object source, final String typeName, final int lineNumber,
+ final IStatus status) {
+ UIJob job = new UIJob(Messages.JavaStackTraceFileHyperlink_link_search_complete) {
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (source == null) {
+ // did not find source
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.JavaStackTraceFileHyperlink_Open_Type,
+ Messages.JavaStackTraceFileHyperlink_Type_could_not_be_located);
+ } else {
+ processSearchResult(source, typeName, lineNumber);
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ job.setSystem(true);
+ job.schedule();
+ }
+
+ /**
+ * The search succeeded with the given result
+ *
+ * @param source
+ * resolved source object for the search
+ * @param typeName
+ * type name searched for
+ * @param lineNumber
+ * line number on link
+ */
+ protected void processSearchResult(Object source, String typeName, int lineNumber) {
+ IDebugModelPresentation presentation = JDIDebugUIPlugin.getDefault().getModelPresentation();
+ IEditorInput editorInput = presentation.getEditorInput(source);
+ if (editorInput != null) {
+ String editorId = presentation.getEditorId(editorInput, source);
+ if (editorId != null) {
+ try {
+ IEditorPart editorPart = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .openEditor(editorInput, editorId);
+ if (editorPart instanceof ITextEditor && lineNumber >= 0) {
+ ITextEditor textEditor = (ITextEditor) editorPart;
+ IDocumentProvider provider = textEditor.getDocumentProvider();
+ provider.connect(editorInput);
+ IDocument document = provider.getDocument(editorInput);
+ try {
+ IRegion line = document.getLineInformation(lineNumber);
+ textEditor.selectAndReveal(line.getOffset(), line.getLength());
+ } catch (BadLocationException e) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), Messages.JavaStackTraceFileHyperlink_Open_Type,
+ Messages.JavaStackTraceFileHyperlink_Line_not_found_in_type);
+ }
+ provider.disconnect(editorInput);
+ }
+ } catch (CoreException e) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.JavaStackTraceFileHyperlink_Open_Type,
+ Messages.JavaStackTraceFileHyperlink_Failed_to_open_type);
+ }
+ }
+ }
+ }
+
+ // adapted from JavaStackTraceHyperlink
+ private String getTypeName() {
+ int start = traceLine.indexOf('(');
+ int end = traceLine.indexOf(':');
+ if (start >= 0 && end > start) {
+
+ // get File name (w/o .java)
+ String typeName = traceLine.substring(start + 1, end);
+ typeName = typeName.substring(0, typeName.indexOf(".")); //$NON-NLS-1$
+
+ String qualifier = traceLine.substring(0, start);
+ // remove the method name
+ start = qualifier.lastIndexOf('.');
+
+ if (start >= 0) {
+ // remove the class name
+ start = (qualifier.subSequence(0, start).toString()).lastIndexOf('.');
+ if (start == -1) {
+ start = 0; // default package
+ }
+ }
+
+ if (start >= 0) {
+ qualifier = qualifier.substring(0, start);
+ }
+
+ if (qualifier.length() > 0) {
+ typeName = qualifier + "." + typeName; //$NON-NLS-1$
+ }
+ return typeName.trim();
+ }
+
+ return "error"; // TODO: Complain //$NON-NLS-1$
+ }
+
+ // adapted from JavaStackTraceHyperlink
+ private int getLineNumber() throws CoreException {
+ int index = traceLine.lastIndexOf(':');
+ if (index >= 0) {
+ String numText = traceLine.substring(index + 1);
+ index = numText.indexOf(')');
+ if (index >= 0) {
+ numText = numText.substring(0, index);
+ }
+ try {
+ return Integer.parseInt(numText);
+ } catch (NumberFormatException e) {
+ throw new CoreException(null);
+ }
+ }
+
+ throw new CoreException(null);
+ }
+
+ public IRegion getHighlightingRegion() {
+ return (highlightingRegion != null) ? highlightingRegion : region;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/JavaStackTraceHyperlinkDetector.java b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/JavaStackTraceHyperlinkDetector.java
new file mode 100644
index 0000000..5c2c9cc
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/JavaStackTraceHyperlinkDetector.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.tasks;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class JavaStackTraceHyperlinkDetector extends AbstractTaskHyperlinkDetector {
+
+ private static final Pattern stackTracePattern = Pattern.compile("\\S*\\(([\\w\\$]*\\.java:\\d*)\\)", //$NON-NLS-1$
+ Pattern.CASE_INSENSITIVE);
+
+ private static IRegion determineRegion(int textOffset, Matcher m, int group) {
+ return new Region(textOffset + m.start(group), m.end(group) - m.start(group));
+ }
+
+ private static boolean isInRegion(int offsetInText, Matcher m) {
+ return (offsetInText == -1) || (offsetInText >= m.start() && offsetInText <= m.end());
+ }
+
+ @Override
+ protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int offsetInContent,
+ int contentOffset) {
+ List<IHyperlink> links = null;
+ Matcher m = stackTracePattern.matcher(content);
+ while (m.find()) {
+ if (isInRegion(offsetInContent, m)) {
+ if (links == null) {
+ links = new ArrayList<IHyperlink>();
+ }
+ links.add(new JavaStackTraceFileHyperlink(determineRegion(contentOffset, m, 0), m.group(),
+ determineRegion(contentOffset, m, 1)));
+ }
+ }
+ return links;
+ }
+
+// private static final Pattern stackTracePattern = Pattern.compile("\\S*\\.java:\\d*\\)", Pattern.CASE_INSENSITIVE);
+//
+// public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+// IDocument document = textViewer.getDocument();
+// if (document == null) {
+// return null;
+// }
+//
+// IRegion lineInfo;
+// String line;
+// try {
+// lineInfo = document.getLineInformationOfOffset(region.getOffset());
+// line = document.get(lineInfo.getOffset(), lineInfo.getLength());
+// } catch (BadLocationException ex) {
+// return null;
+// }
+//
+// Matcher m = stackTracePattern.matcher(line);
+// if (m.find()) {
+// IRegion urlRegion = new Region(lineInfo.getOffset() + m.start(), m.end() - m.start());
+// return new IHyperlink[] { new JavaStackTraceFileHyperlink(urlRegion, m.group()) };
+// }
+//
+// return null;
+// }
+
+}
diff --git a/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/Messages.java b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/Messages.java
new file mode 100644
index 0000000..50171f2
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/Messages.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.tasks;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.java.tasks.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String JavaStackTraceFileHyperlink_Failed_to_open_type;
+
+ public static String JavaStackTraceFileHyperlink_Line_not_found_in_type;
+
+ public static String JavaStackTraceFileHyperlink_link_search_complete;
+
+ public static String JavaStackTraceFileHyperlink_Open_Type;
+
+ public static String JavaStackTraceFileHyperlink_Searching_;
+
+ public static String JavaStackTraceFileHyperlink_Type_could_not_be_located;
+}
diff --git a/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/NewTaskFromJunitResultViewAction.java b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/NewTaskFromJunitResultViewAction.java
new file mode 100644
index 0000000..c11995f
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/NewTaskFromJunitResultViewAction.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.tasks;
+
+import org.eclipse.jdt.internal.junit.model.TestCaseElement;
+import org.eclipse.jdt.internal.junit.model.TestElement;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Creates a new task from the selected JUnit Test.
+ *
+ * @author Frank Becker
+ */
+public class NewTaskFromJunitResultViewAction implements IViewActionDelegate, ISelectionChangedListener {
+
+ public static final String ID = "org.eclipse.mylyn.bugzilla.actions.newTaskFromJunitResultView"; //$NON-NLS-1$
+
+ private String traceString;
+
+ private TestCaseElement testCaseElement;
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void run() {
+ if (traceString == null || testCaseElement == null) {
+ return;
+ }
+
+ // TODO NLS externalize strings
+ final StringBuilder sb = new StringBuilder();
+ sb.append("\n-- Error Log from JUnit --\nClass: "); //$NON-NLS-1$
+ sb.append(testCaseElement.getTestClassName());
+ sb.append("\nMethod: "); //$NON-NLS-1$
+ sb.append(testCaseElement.getTestMethodName());
+ sb.append("\nActual: "); //$NON-NLS-1$
+ sb.append(testCaseElement.getActual());
+ sb.append("\nExpected: "); //$NON-NLS-1$
+ sb.append(testCaseElement.getExpected());
+ sb.append("\nStack Trace:\n"); //$NON-NLS-1$
+ sb.append(traceString);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ TaskMapping taskMapping = new TaskMapping() {
+ @Override
+ public String getDescription() {
+ return sb.toString();
+ }
+ };
+ TasksUiUtil.openNewTaskEditor(shell, taskMapping, null);
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ // ignore
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ traceString = null;
+ testCaseElement = null;
+ if (selection instanceof TreeSelection) {
+ TreeSelection t = (TreeSelection) selection;
+ TestElement testElement = (TestElement) t.getFirstElement();
+ if (testElement instanceof TestCaseElement) {
+ testCaseElement = (TestCaseElement) testElement;
+ traceString = testCaseElement.getTrace();
+ }
+ }
+ action.setEnabled(traceString != null);
+ }
+}
diff --git a/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/messages.properties b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/messages.properties
new file mode 100644
index 0000000..faf2fab
--- /dev/null
+++ b/org.eclipse.mylyn.java.tasks/src/org/eclipse/mylyn/internal/java/tasks/messages.properties
@@ -0,0 +1,6 @@
+JavaStackTraceFileHyperlink_Failed_to_open_type=Failed to open type.
+JavaStackTraceFileHyperlink_Line_not_found_in_type=Line not found in type.
+JavaStackTraceFileHyperlink_link_search_complete=link search complete
+JavaStackTraceFileHyperlink_Open_Type=Open Type
+JavaStackTraceFileHyperlink_Searching_=Searching...
+JavaStackTraceFileHyperlink_Type_could_not_be_located=Type could not be located.
diff --git a/org.eclipse.mylyn.java.tests/.classpath b/org.eclipse.mylyn.java.tests/.classpath
new file mode 100644
index 0000000..77f8017
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.java.tests/.cvsignore b/org.eclipse.mylyn.java.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.java.tests/.project b/org.eclipse.mylyn.java.tests/.project
new file mode 100644
index 0000000..a41c7aa
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.java.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2006/4/17/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2006/4/17/refactorings.history
new file mode 100644
index 0000000..9ff78bd
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2006/4/17/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.java.tests.EditorManagementTest' to 'EditorManagemerTest' - Original element: 'org.eclipse.mylar.java.tests.EditorManagementTest' - Renamed element: 'org.eclipse.mylar.java.tests.EditorManagemerTest' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'EditorManagementTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.java.tests{EditorManagementTest.java[EditorManagementTest" matchStrategy="1" name="EditorManagemerTest" qualified="false" references="true" similarDeclarations="true" stamp="1146079214317" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.java.tests.EditorManagemerTest' to 'EditorManagerTest' - Original element: 'org.eclipse.mylar.java.tests.EditorManagemerTest' - Renamed element: 'org.eclipse.mylar.java.tests.EditorManagerTest' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'EditorManagemerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.java.tests{EditorManagemerTest.java[EditorManagemerTest" matchStrategy="1" name="EditorManagerTest" qualified="false" references="true" similarDeclarations="true" stamp="1146079240575" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2006/4/17/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2006/4/17/refactorings.index
new file mode 100644
index 0000000..4209334
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2006/4/17/refactorings.index
@@ -0,0 +1,2 @@
+1146079214317 Rename type 'EditorManagementTest'
+1146079240575 Rename type 'EditorManagemerTest'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2006/5/19/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2006/5/19/refactorings.history
new file mode 100644
index 0000000..682a147
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2006/5/19/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.java.tests.ResourceStructureTest' to 'ResourceStructureMappingTest' - Original element: 'org.eclipse.mylar.java.tests.ResourceStructureTest' - Renamed element: 'org.eclipse.mylar.java.tests.ResourceStructureMappingTest' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'ResourceStructureTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.java.tests{ResourceStructureTest.java[ResourceStructureTest" matchStrategy="1" name="ResourceStructureMappingTest" qualified="false" references="true" similarDeclarations="true" stamp="1147304061216" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2006/5/19/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2006/5/19/refactorings.index
new file mode 100644
index 0000000..797dcb2
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2006/5/19/refactorings.index
@@ -0,0 +1 @@
+1147304061216 Rename type 'ResourceStructureTest'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..73c893c
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.java.tests.ContextSpecificContextTest' to 'ContentSpecificContextTest' - Original project: 'org.eclipse.mylar.java.tests' - Original element: 'org.eclipse.mylar.java.tests.ContextSpecificContextTest' - Renamed element: 'org.eclipse.mylar.java.tests.ContentSpecificContextTest' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextSpecificContextTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.java.tests{ContextSpecificContextTest.java[ContextSpecificContextTest" matchStrategy="1" name="ContentSpecificContextTest" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180242169264" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.java.tests.ApplyMylarActionTest' to 'FocusViewActionTest' - Original project: 'org.eclipse.mylar.java.tests' - Original element: 'org.eclipse.mylar.java.tests.ApplyMylarActionTest' - Renamed element: 'org.eclipse.mylar.java.tests.FocusViewActionTest' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarActionTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.java.tests{ApplyMylarActionTest.java[ApplyMylarActionTest" matchStrategy="1" name="FocusViewActionTest" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180264474204" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..97feab7
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,2 @@
+1180242169264 Rename type 'ContextSpecificContextTest'
+1180264474204 Rename type 'ApplyMylarActionTest'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..96258e6
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename local variable 'file' in 'org.eclipse.mylyn.java.tests.ContextManagerTest.testTransferContext()' to 'sourceFile'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.ContextManagerTest.testTransferContext().file'
- Renamed element: 'org.eclipse.mylyn.java.tests.ContextManagerTest.testTransferContext().sourceFile'
- Update references to refactored element" description="Rename local variable 'file'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.java.tests{ContextManagerTest.java[ContextManagerTest~testTransferContext at file!6083!6181!6088!6091!QFile;" name="sourceFile" references="true" stamp="1190781506581" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.java.tests.ContextManagerTest.testTransferContext()' to 'testCopyContext'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.ContextManagerTest.testTransferContext()'
- Renamed element: 'org.eclipse.mylyn.java.tests.ContextManagerTest.testCopyContext()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testTransferContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.java.tests{ContextManagerTest.java[ContextManagerTest~testTransferContext" name="testCopyContext" references="true" stamp="1190781880864" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..a94531c
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1,2 @@
+1190781506581 Rename local variable 'file'
+1190781880864 Rename method 'testTransferContext'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..ec7cddb
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.tests'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: '.api_filters'" description="Delete element" element1=".settings/.api_filters" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1207702124174" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests'
- Original project: 'org.eclipse.mylyn.java.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests'
- Original element: 'org.eclipse.mylyn.java.tests.ActiveSearchTest.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.tests/src<org.eclipse.mylyn.sandbox.tests" element1="/src<org.eclipse.mylyn.java.tests{ActiveSearchTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207706823106" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests'
- Original project: 'org.eclipse.mylyn.java.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests'
- Original element: 'org.eclipse.mylyn.java.tests.ActiveHierarchyTest.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.tests/src<org.eclipse.mylyn.sandbox.tests" element1="/src<org.eclipse.mylyn.java.tests{ActiveHierarchyTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207714782936" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.java.tests.search.ActiveSearchNotifier' to 'ContextSearchNotifier'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.search.ActiveSearchNotifier'
- Renamed element: 'org.eclipse.mylyn.java.tests.search.ContextSearchNotifier'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ActiveSearchNotifier'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.java.tests.search{ActiveSearchNotifier.java[ActiveSearchNotifier" matchStrategy="1" name="ContextSearchNotifier" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1207715126304" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.java.tests.search.ContextSearchNotifier' to 'ActiveSearchNotifier'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.search.ContextSearchNotifier'
- Renamed element: 'org.eclipse.mylyn.java.tests.search.ActiveSearchNotifier'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ContextSearchNotifier'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.java.tests.search{ContextSearchNotifier.java[ContextSearchNotifier" matchStrategy="1" name="ActiveSearchNotifier" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1207715408458" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..3e8b3d1
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,5 @@
+1207702124174 Delete element
+1207706823106 Move compilation unit
+1207714782936 Move compilation unit
+1207715126304 Rename type 'ActiveSearchNotifier'
+1207715408458 Rename type 'ContextSearchNotifier'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..7bdad00
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.java.tests.ContextManagerTest' to 'InteractionContextManagerTest'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.ContextManagerTest'
- Renamed element: 'org.eclipse.mylyn.java.tests.InteractionContextManagerTest'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ContextManagerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.java.tests{ContextManagerTest.java[ContextManagerTest" matchStrategy="1" name="InteractionContextManagerTest" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1208461544399" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..b3a18fb
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1 @@
+1208461544399 Rename type 'ContextManagerTest'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..92f2818
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'context' in 'org.eclipse.mylyn.java.tests.AbstractJavaContextTest' to 'fromContext'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.AbstractJavaContextTest.context'
- Renamed element: 'org.eclipse.mylyn.java.tests.AbstractJavaContextTest.fromContext'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'context'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.java.tests{AbstractJavaContextTest.java[AbstractJavaContextTest^context" name="fromContext" references="true" setter="true" stamp="1213249318927" textual="false" version="1.0"/>
<refactoring comment="Rename field 'fromContext' in 'org.eclipse.mylyn.java.tests.AbstractJavaContextTest' to 'context'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'org.eclipse.mylyn.java.tests.AbstractJavaContextTest.fromContext'
- Renamed element: 'org.eclipse.mylyn.java.tests.AbstractJavaContextTest.context'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fromContext'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.java.tests{AbstractJavaContextTest.java[AbstractJavaContextTest^fromContext" name="context" references="true" setter="true" stamp="1213249567213" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..862b1d7
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1213249318927 Rename field 'context'
+1213249567213 Rename field 'fromContext'
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.java.tests/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..2586664
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.tests'
- Original project: 'org.eclipse.mylyn.java.tests'
- Original element: 'hs_err_pid528.log'" description="Delete element" element1="hs_err_pid528.log" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1221175797727" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tests/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.java.tests/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..bec19e5
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1 @@
+1221175797727 Delete element
diff --git a/org.eclipse.mylyn.java.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.java.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.java.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.java.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.java.tests/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..9e97525
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,145 @@
+#Tue Apr 08 17:49:21 PDT 2008
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_LEAK=Ignore
+API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
+ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Ignore
+ILLEGAL_IMPLEMENT=Ignore
+ILLEGAL_INSTANTIATE=Ignore
+ILLEGAL_OVERRIDE=Ignore
+ILLEGAL_REFERENCE=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
diff --git a/org.eclipse.mylyn.java.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a475fb3
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,44 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Java Tests
+Bundle-SymbolicName: org.eclipse.mylyn.java.tests
+Bundle-Version: 0.0.0
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.ui,
+ org.eclipse.core.resources,
+ org.eclipse.jface,
+ org.eclipse.jface.text,
+ org.eclipse.ui.workbench,
+ org.junit,
+ org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.jdt.core,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.junit,
+ org.eclipse.ui,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.mylyn.resources.ui,
+ org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.jdt.launching,
+ org.eclipse.mylyn.ide.tests,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.search,
+ org.eclipse.mylyn.resources.tests,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.pde.ui,
+ org.eclipse.mylyn.context.tests
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: mylyn-java-tests.jar
+Export-Package: org.eclipse.mylyn.java.tests;x-internal:=true,
+ org.eclipse.mylyn.java.tests.search;x-internal:=true,
+ org.eclipse.mylyn.java.tests.xml;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.java.tests/about.html b/org.eclipse.mylyn.java.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.tests/build.properties b/org.eclipse.mylyn.java.tests/build.properties
new file mode 100644
index 0000000..1acc2e8
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2004, 2005 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ about.html,\
+ src/,\
+ about.html,\
+ mylyn-java-tests.jar
+jars.compile.order = mylyn-java-tests.jar
+jre.compilation.profile = J2SE-1.5
+source.mylyn-java-tests.jar = src/
+src.includes = about.html
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/AbstractJavaContextTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/AbstractJavaContextTest.java
new file mode 100644
index 0000000..c44acb6
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/AbstractJavaContextTest.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.java.ui.JavaEditingMonitor;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.mylyn.resources.tests.ResourceTestUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractJavaContextTest extends AbstractContextTest {
+
+ protected InteractionContextManager manager = ContextCorePlugin.getContextManager();
+
+ protected JavaEditingMonitor monitor = new JavaEditingMonitor();
+
+ protected TestJavaProject project;
+
+ protected TestProject nonJavaProject;
+
+ protected IPackageFragment p1;
+
+ protected IType type1;
+
+ protected String contextId = this.getClass().getSimpleName();
+
+ protected InteractionContext context;
+
+ protected InteractionContextScaling scaling = new InteractionContextScaling();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TestUtil.triggerContextUiLazyStart();
+ assertNotNull(JavaPlugin.getDefault());
+ assertNotNull(JavaUiBridgePlugin.getDefault());
+ project = new TestJavaProject(this.getClass().getSimpleName());
+ nonJavaProject = new TestProject(this.getClass().getSimpleName() + "nonJava");
+ p1 = project.createPackage("p1");
+ type1 = project.createType(p1, "Type1.java", "public class Type1 { }");
+ context = new InteractionContext(contextId, scaling);
+ context.reset();
+ manager.internalActivateContext(context);
+ assertNotNull(JavaUiBridgePlugin.getDefault());
+ assertTrue(ContextCorePlugin.getDefault().getStructureBridges().toString().indexOf(
+ JavaStructureBridge.class.getCanonicalName()) != -1);
+
+ ContextUiPlugin.getViewerManager().setSyncRefreshMode(true);
+ ResourcesUiBridgePlugin.getDefault().setResourceMonitoringEnabled(false);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ ResourcesUiBridgePlugin.getDefault().setResourceMonitoringEnabled(true);
+ context.reset();
+ assertTrue(context.getInteresting().isEmpty());
+ manager.deactivateContext(contextId);
+ manager.deleteContext(contextId);
+ ContextCorePlugin.getContextStore().getFileForContext(contextId).delete();
+
+ ResourceTestUtil.deleteProject(project.getProject());
+ ResourceTestUtil.deleteProject(nonJavaProject.getProject());
+
+ for (InteractionContext context : manager.getActiveContexts()) {
+ manager.deactivateContext(context.getHandleIdentifier());
+ }
+ assertFalse(manager.isContextActive());
+ waitForAutoBuild();
+ super.tearDown();
+ }
+
+ public static void waitForAutoBuild() {
+ boolean wasInterrupted = false;
+ do {
+ try {
+ Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
+ wasInterrupted = false;
+ } catch (OperationCanceledException e) {
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ wasInterrupted = true;
+ }
+ } while (wasInterrupted);
+ }
+
+ class TestProgressMonitor implements IProgressMonitor {
+
+ boolean done = false;
+
+ public void beginTask(String name, int totalWork) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void done() {
+ done = true;
+ }
+
+ public void internalWorked(double work) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean isCanceled() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void setCanceled(boolean value) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setTaskName(String name) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void subTask(String name) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void worked(int work) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean isDone() {
+ return done;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/AllJavaTests.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/AllJavaTests.java
new file mode 100644
index 0000000..18db58c
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/AllJavaTests.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.java.tests.search.JUnitReferencesSearchPluginTest;
+import org.eclipse.mylyn.java.tests.search.JavaImplementorsSearchPluginTest;
+import org.eclipse.mylyn.java.tests.search.JavaReadAccessSearchPluginTest;
+import org.eclipse.mylyn.java.tests.search.JavaReferencesSearchTest;
+import org.eclipse.mylyn.java.tests.search.JavaWriteAccessSearchPluginTest;
+import org.eclipse.mylyn.java.tests.xml.XmlSearchPluginTest;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllJavaTests {
+
+ public static Test suite() {
+ TestUtil.triggerContextUiLazyStart();
+
+ TestSuite suite = new TestSuite("Tests for org.eclipse.mylyn.java.tests");
+ suite.addTestSuite(ContentSpecificContextTest.class);
+ suite.addTestSuite(ResourceStructureMappingTest.class);
+ suite.addTestSuite(InterestManipulationTest.class);
+ suite.addTestSuite(EditorManagerTest.class);
+ suite.addTestSuite(RefactoringTest.class);
+ suite.addTestSuite(ContentOutlineRefreshTest.class);
+ suite.addTestSuite(TypeHistoryManagerTest.class);
+ suite.addTestSuite(PackageExplorerRefreshTest.class);
+ // XXX reenable test case?
+ //suite.addTestSuite(ResultUpdaterTest.class);
+ suite.addTestSuite(ProblemsListTest.class);
+ suite.addTestSuite(InterestFilterTest.class);
+ suite.addTestSuite(InteractionContextManagerTest.class);
+ suite.addTestSuite(JavaStructureTest.class);
+ suite.addTestSuite(JavaImplementorsSearchPluginTest.class);
+ suite.addTestSuite(JavaReadAccessSearchPluginTest.class);
+ suite.addTestSuite(JavaReferencesSearchTest.class);
+ suite.addTestSuite(JavaWriteAccessSearchPluginTest.class);
+ suite.addTestSuite(JUnitReferencesSearchPluginTest.class);
+ suite.addTestSuite(XmlSearchPluginTest.class);
+ suite.addTestSuite(JavaEditingMonitorTest.class);
+ return suite;
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ContentOutlineRefreshTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ContentOutlineRefreshTest.java
new file mode 100644
index 0000000..d2e8fb1
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ContentOutlineRefreshTest.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.tests.UiTestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.actions.FocusOutlineAction;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContentOutlineRefreshTest extends AbstractJavaContextTest {
+
+ private IViewPart view;
+
+ private FocusOutlineAction action;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ view = TestUtil.openView(FocusOutlineAction.ID_CONTENT_OUTLINE);
+ assertNotNull(view);
+ assertNotNull(ContextUiPlugin.getDefault());
+ assertNotNull(JavaUiBridgePlugin.getDefault());
+ action = new FocusOutlineAction();
+
+ UiTestUtil.closeWelcomeView();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testContents() throws JavaModelException, PartInitException {
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+ TestUtil.openView("org.eclipse.ui.views.ContentOutline");
+ JavaUI.openInEditor(m1);
+
+ // FocusOutlineAction.getDefault().update(true);
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ IEditorPart[] parts = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditors();
+ for (IEditorPart part : parts) {
+ if (part.getTitle().equals("Type1.java")) {
+ AbstractContextUiBridge bridge = ContextUi.getUiBridgeForEditor(part);
+ List<TreeViewer> outlineViewers = bridge.getContentOutlineViewers(part);
+ for (TreeViewer viewer : outlineViewers) {
+ if (viewer != null && !viewers.contains(viewer)) {
+ viewers.add(viewer);
+ }
+ }
+ }
+ }
+ assertEquals(1, viewers.size());
+ TreeViewer viewer = (TreeViewer) viewers.get(0);
+ assertEquals(3, UiTestUtil.countItemsInTree(viewer.getTree()));
+
+// action.run();
+ action.updateInterestFilter(true, viewer);
+
+ assertEquals(0, UiTestUtil.countItemsInTree(viewer.getTree()));
+
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(view, sm1);
+ viewer.refresh();
+ assertEquals(2, UiTestUtil.countItemsInTree(viewer.getTree()));
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ContentSpecificContextTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ContentSpecificContextTest.java
new file mode 100644
index 0000000..f324ee0
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ContentSpecificContextTest.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class ContentSpecificContextTest extends AbstractContextTest {
+
+ public void testEventProcessing() {
+ InteractionContext context = new InteractionContext("global-id", new InteractionContextScaling());
+ context.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
+ ContextCorePlugin.getContextManager().addGlobalContext(context);
+
+ ContextCore.getContextManager().processInteractionEvent(
+ new InteractionEvent(InteractionEvent.Kind.PROPAGATION, "foo-kind", "h0", MOCK_ORIGIN));
+ assertEquals(0, context.getAllElements().size());
+ ContextCorePlugin.getContextManager().processInteractionEvent(mockSelection("h1"), false, false);
+ assertEquals(1, context.getAllElements().size());
+ ContextCorePlugin.getContextManager().removeGlobalContext(context);
+ }
+
+ public void testEventProcessingCompositeContext() {
+ InteractionContext context1 = new InteractionContext("global-id-1", new InteractionContextScaling());
+ InteractionContext context2 = new InteractionContext("global-id-2", new InteractionContextScaling());
+ context1.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
+ context2.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
+
+ CompositeInteractionContext context = new CompositeInteractionContext(new InteractionContextScaling());
+ context.getContextMap().put(context1.getHandleIdentifier(), context1);
+ context.getContextMap().put(context2.getHandleIdentifier(), context2);
+ context.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
+ ContextCorePlugin.getContextManager().addGlobalContext(context);
+
+ ContextCore.getContextManager().processInteractionEvent(
+ new InteractionEvent(InteractionEvent.Kind.PROPAGATION, "foo-kind", "h0", MOCK_ORIGIN));
+ assertEquals(0, context.getAllElements().size());
+ assertEquals(0, context1.getAllElements().size());
+ assertEquals(0, context2.getAllElements().size());
+ ContextCorePlugin.getContextManager().processInteractionEvent(mockSelection("h1"), false, false);
+ assertEquals(1, context.getAllElements().size());
+ assertEquals(1, context1.getAllElements().size());
+ assertEquals(1, context2.getAllElements().size());
+
+ context.getContextMap().remove(context2.getHandleIdentifier());
+
+ ContextCore.getContextManager().processInteractionEvent(
+ new InteractionEvent(InteractionEvent.Kind.PROPAGATION, "foo-kind", "h0", MOCK_ORIGIN));
+ assertEquals(1, context.getAllElements().size());
+ assertEquals(1, context1.getAllElements().size());
+ assertEquals(1, context2.getAllElements().size());
+ ContextCorePlugin.getContextManager().processInteractionEvent(mockSelection("h2"), false, false);
+ assertEquals(2, context.getAllElements().size());
+ assertEquals(2, context1.getAllElements().size());
+ assertEquals(1, context2.getAllElements().size());
+
+ ContextCorePlugin.getContextManager().removeGlobalContext(context);
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/EditorManagerTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/EditorManagerTest.java
new file mode 100644
index 0000000..15d489d
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/EditorManagerTest.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.UiTestUtil;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
+import org.eclipse.mylyn.internal.java.ui.ActiveFoldingEditorTracker;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * @author Mik Kersten
+ */
+public class EditorManagerTest extends AbstractJavaContextTest {
+
+ private IWorkbenchPage page;
+
+ private IViewPart view;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ assertNotNull(page);
+ view = PackageExplorerPart.openInActivePerspective();
+ assertNotNull(view);
+ assertTrue(ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITORS));
+
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_WARNING, false);
+ UiTestUtil.closeWelcomeView();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ ContextUiPlugin.getEditorManager().closeAllEditors();
+
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_WARNING,
+ ContextUiPlugin.getDefault().getPreferenceStore().getDefaultBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_WARNING));
+ }
+
+ // XXX: Put back
+// @SuppressWarnings("deprecation")
+// public void testAutoOpen() throws JavaModelException, InvocationTargetException, InterruptedException,
+// PartInitException {
+// // need a task for mementos
+// AbstractTask task = new LocalTask(contextId, contextId);
+// TasksUiPlugin.getTaskList().addTask(task);
+// manager.deleteContext(contextId);
+// ResourcesUiBridgePlugin.getEditorManager().closeAllEditors();
+// assertEquals(0, page.getEditors().length);
+//
+// manager.activateContext(contextId);
+// // assertEquals(0, page.getEditors().length);
+//
+// IType typeA = project.createType(p1, "TypeA.java", "public class TypeA{ }");
+// IType typeB = project.createType(p1, "TypeB.java", "public class TypeB{ }");
+//
+// JavaUI.openInEditor(typeA);
+// JavaUI.openInEditor(typeB);
+// // monitor.selectionChanged(view, new StructuredSelection(typeA));
+// // monitor.selectionChanged(view, new StructuredSelection(typeB));
+//
+// assertEquals(2, page.getEditors().length);
+//
+// manager.deactivateContext(contextId);
+// assertEquals(0, page.getEditors().length);
+//
+// manager.activateContext(contextId);
+// // TODO: verify number
+// assertEquals(2, page.getEditors().length);
+// TasksUiPlugin.getTaskList().deleteTask(task);
+// }
+
+ public void testInterestCapturedForResourceOnFocus() throws CoreException, InvocationTargetException,
+ InterruptedException {
+
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false);
+ ContextCore.getContextManager().setContextCapturePaused(true);
+
+ IType typeA = project.createType(p1, "TypeAa.java", "public class TypeD{ }");
+ IType typeB = project.createType(p1, "TypeBb.java", "public class TypeC{ }");
+
+ IFile fileA = (IFile) typeA.getAdapter(IResource.class);
+ IFile fileB = (IFile) typeB.getAdapter(IResource.class);
+
+ AbstractContextStructureBridge structureBridge = ContextCore.getStructureBridge(fileA);
+
+ IInteractionElement elementA = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(fileA));
+ IInteractionElement elementB = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(fileB));
+
+ assertFalse(elementA.getInterest().isInteresting());
+ assertFalse(elementB.getInterest().isInteresting());
+ ContextCore.getContextManager().setContextCapturePaused(false);
+
+ elementA = ContextCore.getContextManager().getElement(structureBridge.getHandleIdentifier(fileA));
+ assertFalse(elementA.getInterest().isInteresting());
+
+ IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), fileA, true);
+ elementA = ContextCore.getContextManager().getElement(structureBridge.getHandleIdentifier(fileA));
+ float selectionFactor = ContextCore.getCommonContextScaling().get(InteractionEvent.Kind.SELECTION);
+ // TODO: should use selectionFactor test instead
+ assertTrue(elementA.getInterest().isInteresting());
+ assertTrue(elementA.getInterest().getValue() <= selectionFactor);
+// assertEquals(selectionFactor, elementA.getInterest().getValue());
+ IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), fileB, true);
+ IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), fileA, true);
+ elementA = ContextCore.getContextManager().getElement(structureBridge.getHandleIdentifier(fileA));
+ // TODO: punting on decay
+// assertEquals(selectionFactor-decayFactor*2, elementA.getInterest().getValue());
+ assertTrue(elementA.getInterest().getValue() > 1 && elementA.getInterest().getValue() < 2);
+// MylarContextManager.getScalingFactors().getDecay().setValue(decayFactor);
+ }
+
+ public void testWaitingListenersDoNotLeakOnEditorActivation() throws JavaModelException {
+ manager.deleteContext(contextId);
+ ContextUiPlugin.getEditorManager().closeAllEditors();
+
+ int initialNumListeners = manager.getListeners().size();
+ manager.activateContext(contextId);
+ assertEquals(initialNumListeners, manager.getListeners().size());
+
+ IType typeA = project.createType(p1, "TypeA.java", "public class TypeA{ }");
+ monitor.selectionChanged(view, new StructuredSelection(typeA));
+ manager.deactivateContext(contextId);
+ assertEquals(initialNumListeners, manager.getListeners().size());
+
+ manager.activateContext(contextId);
+ assertEquals(initialNumListeners + 1, manager.getListeners().size());
+ manager.deactivateContext(contextId);
+ assertEquals(initialNumListeners, manager.getListeners().size());
+
+ manager.activateContext(contextId);
+ manager.deactivateContext(contextId);
+ assertEquals(initialNumListeners, manager.getListeners().size());
+
+ manager.activateContext(contextId);
+ manager.deactivateContext(contextId);
+ assertEquals(initialNumListeners, manager.getListeners().size());
+ }
+
+ public void testEditorTrackerListenerRegistration() throws JavaModelException {
+ ContextUiPlugin.getEditorManager().closeAllEditors();
+
+ ActiveFoldingEditorTracker tracker = JavaUiBridgePlugin.getDefault().getEditorTracker();
+ assertTrue(tracker.getEditorListenerMap().isEmpty());
+
+ AbstractContextUiBridge bridge = ContextUi.getUiBridge(JavaStructureBridge.CONTENT_TYPE);
+ IMethod m1 = type1.createMethod("void m111() { }", null, true, null);
+ monitor.selectionChanged(view, new StructuredSelection(m1));
+
+ int numListeners = ContextCorePlugin.getContextManager().getListeners().size();
+ IInteractionElement element = ContextCore.getContextManager().getElement(type1.getHandleIdentifier());
+ bridge.open(element);
+
+ assertEquals(numListeners + 1, ContextCorePlugin.getContextManager().getListeners().size());
+ assertEquals(1, page.getEditorReferences().length);
+ assertEquals(1, tracker.getEditorListenerMap().size());
+ ContextUiPlugin.getEditorManager().closeAllEditors();
+
+ assertEquals(numListeners, ContextCorePlugin.getContextManager().getListeners().size());
+ assertEquals(0, page.getEditorReferences().length);
+ assertEquals(0, tracker.getEditorListenerMap().size());
+ }
+
+ public void testActivationPreservesActiveTaskEditor() throws JavaModelException, InvocationTargetException,
+ InterruptedException {
+ assertEquals(0, page.getEditorReferences().length);
+ AbstractTask task = new LocalTask(contextId, contextId);
+ TasksUiUtil.openTask(task);
+ assertEquals(1, page.getEditorReferences().length);
+ manager.activateContext(contextId);
+ assertEquals(1, page.getEditorReferences().length);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testAutoCloseWithDecay() throws JavaModelException, InvocationTargetException, InterruptedException {
+ ContextUiPlugin.getEditorManager().closeAllEditors();
+ assertEquals(0, page.getEditors().length);
+ AbstractContextUiBridge bridge = ContextUi.getUiBridge(JavaStructureBridge.CONTENT_TYPE);
+ IMethod m1 = type1.createMethod("void m111() { }", null, true, null);
+ monitor.selectionChanged(view, new StructuredSelection(m1));
+ IInteractionElement element = ContextCore.getContextManager().getElement(type1.getHandleIdentifier());
+ bridge.open(element);
+
+ IType typeA = project.createType(p1, "TypeA.java", "public class TypeA{ }");
+ monitor.selectionChanged(view, new StructuredSelection(typeA));
+ IInteractionElement elementA = ContextCore.getContextManager().getElement(typeA.getHandleIdentifier());
+ bridge.open(elementA);
+
+ assertEquals(2, page.getEditors().length);
+ for (int i = 0; i < 1 / (scaling.getDecay()) * 3; i++) {
+ ContextCore.getContextManager().processInteractionEvent(mockSelection());
+ }
+ assertFalse(element.getInterest().isInteresting());
+ assertFalse(elementA.getInterest().isInteresting());
+ IType typeB = project.createType(p1, "TypeB.java", "public class TypeB{ }");
+ monitor.selectionChanged(view, new StructuredSelection(typeB));
+ IInteractionElement elementB = ContextCore.getContextManager().getElement(typeB.getHandleIdentifier());
+ bridge.open(elementB);
+ monitor.selectionChanged(view, new StructuredSelection(typeB));
+ assertEquals(1, page.getEditors().length);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testAutoClose() throws JavaModelException, InvocationTargetException, InterruptedException {
+ ContextUiPlugin.getEditorManager().closeAllEditors();
+ assertEquals(0, page.getEditors().length);
+ AbstractContextUiBridge bridge = ContextUi.getUiBridge(JavaStructureBridge.CONTENT_TYPE);
+ IMethod m1 = type1.createMethod("void m111() { }", null, true, null);
+ monitor.selectionChanged(view, new StructuredSelection(m1));
+ IInteractionElement element = ContextCore.getContextManager().getElement(type1.getHandleIdentifier());
+ bridge.open(element);
+
+ assertEquals(1, page.getEditors().length);
+ manager.deactivateContext(contextId);
+ assertEquals(0, page.getEditors().length);
+ }
+
+ public void testCloseOnUninteresting() {
+ // fail();
+ }
+
+ // private int getNumActiveEditors() {
+ // return ;
+ // for (int i = 0; i < page.getEditors().length; i++) {
+ // IEditorPart editor = page.getEditors()[i];
+
+ // if (editor instanceof AbstractDecoratedTextEditor) {
+ // manager.contextDeactivated(contextId, contextId);
+ // assertEquals(0, page.getEditors().length);
+ // }
+ // }
+ // }
+
+ // assertEquals(1, page.getEditors().length);
+ // WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+ // protected void execute(IProgressMonitor monitor) throws CoreException {
+
+ // }
+ // };
+ // IProgressService service =
+ // PlatformUI.getWorkbench().getProgressService();
+ // service.run(true, true, op);
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/FocusViewActionTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/FocusViewActionTest.java
new file mode 100644
index 0000000..c5a9b75
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/FocusViewActionTest.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.tests.UiTestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.actions.FocusOutlineAction;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusViewActionTest extends AbstractJavaContextTest {
+
+ private IViewPart view;
+
+ private FocusOutlineAction action;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ view = TestUtil.openView(FocusOutlineAction.ID_CONTENT_OUTLINE);
+ assertNotNull(view);
+ assertNotNull(ContextUiPlugin.getDefault());
+ assertNotNull(JavaUiBridgePlugin.getDefault());
+ action = new FocusOutlineAction();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testPreservationOfContextPause() {
+ FocusPackageExplorerAction action = new FocusPackageExplorerAction();
+ ContextCore.getContextManager().setContextCapturePaused(true);
+ action.update(true);
+ assertTrue(ContextCore.getContextManager().isContextCapturePaused());
+
+ ContextCore.getContextManager().setContextCapturePaused(false);
+ action.update(false);
+ assertFalse(ContextCore.getContextManager().isContextCapturePaused());
+ action.update(true);
+ assertFalse(ContextCore.getContextManager().isContextCapturePaused());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testContents() throws JavaModelException, PartInitException {
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+ TestUtil.openView("org.eclipse.ui.views.ContentOutline");
+ JavaUI.openInEditor(m1);
+
+// FocusOutlineAction.getDefault().update(true);
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ IEditorPart[] parts = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditors();
+ for (IEditorPart part : parts) {
+ if (part.getTitle().equals("Type1.java")) {
+ AbstractContextUiBridge bridge = ContextUi.getUiBridgeForEditor(part);
+ List<TreeViewer> outlineViewers = bridge.getContentOutlineViewers(part);
+ for (TreeViewer viewer : outlineViewers) {
+ if (viewer != null && !viewers.contains(viewer)) {
+ viewers.add(viewer);
+ }
+ }
+ }
+ }
+ assertEquals(1, viewers.size());
+ TreeViewer viewer = (TreeViewer) viewers.get(0);
+ assertEquals(3, UiTestUtil.countItemsInTree(viewer.getTree()));
+
+ action.updateInterestFilter(true, viewer);
+ assertEquals(0, UiTestUtil.countItemsInTree(viewer.getTree()));
+
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(view, sm1);
+ viewer.refresh();
+ assertEquals(2, UiTestUtil.countItemsInTree(viewer.getTree()));
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InteractionContextManagerTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InteractionContextManagerTest.java
new file mode 100644
index 0000000..5725c26
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InteractionContextManagerTest.java
@@ -0,0 +1,454 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.JavaModel;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.context.core.LocalContextStore;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class InteractionContextManagerTest extends AbstractJavaContextTest {
+
+ private PackageExplorerPart explorer;
+
+ private LocalContextStore contextStore;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ explorer = PackageExplorerPart.openInActivePerspective();
+ contextStore = ContextCorePlugin.getContextStore();
+ assertNotNull(explorer);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ };
+
+ class LandmarksModelListener extends AbstractContextListener {
+
+ public int numAdditions = 0;
+
+ public int numDeletions = 0;
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case LANDMARKS_ADDED:
+ numAdditions += event.getElements().size();
+ break;
+ case LANDMARKS_REMOVED:
+ numDeletions += event.getElements().size();
+ break;
+ }
+ }
+ }
+
+ public void testHandleToPathConversion() throws IOException {
+ String handle = "https://bugs.eclipse.org/bugs-123";
+ File file = contextStore.getFileForContext(handle);
+ assertFalse(file.exists());
+ file.createNewFile();
+ assertTrue(file.exists());
+ }
+
+ public void testPauseAndResume() throws JavaModelException {
+ ContextCore.getContextManager().setContextCapturePaused(true);
+ ContextCore.getContextManager().processInteractionEvent(mockInterestContribution("paused", 3));
+ IInteractionElement paused = ContextCore.getContextManager().getElement("paused");
+ assertFalse(paused.getInterest().isInteresting());
+
+ ContextCore.getContextManager().setContextCapturePaused(false);
+ ContextCore.getContextManager().processInteractionEvent(mockInterestContribution("paused", 3));
+ IInteractionElement resumed = ContextCore.getContextManager().getElement("paused");
+ assertTrue(resumed.getInterest().isInteresting());
+ }
+
+ public void testShellLifecycleActivityStart() {
+ List<InteractionEvent> events = manager.getActivityMetaContext().getInteractionHistory();
+ assertEquals(InteractionContextManager.ACTIVITY_DELTA_STARTED, events.get(0).getDelta());
+ assertEquals(InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, events.get(1).getDelta());
+ }
+
+ public void testActivityHistory() {
+ manager.resetActivityMetaContext();
+ InteractionContext history = manager.getActivityMetaContext();
+ assertNotNull(history);
+ assertEquals(0, manager.getActivityMetaContext().getInteractionHistory().size());
+
+ manager.internalActivateContext(contextStore.loadContext("1"));
+ assertEquals(1, manager.getActivityMetaContext().getInteractionHistory().size());
+
+ manager.deactivateContext("2");
+ assertEquals(2, manager.getActivityMetaContext().getInteractionHistory().size());
+ }
+
+ public void testChangeHandle() {
+ ContextCore.getContextManager().processInteractionEvent(mockInterestContribution("old", 3));
+ IInteractionElement old = ContextCore.getContextManager().getElement("old");
+ assertTrue(old.getInterest().isInteresting());
+
+ ContextCore.getContextManager().getActiveContext().updateElementHandle(old, "new");
+ IInteractionElement changed = ContextCore.getContextManager().getElement("new");
+ assertTrue(changed.getInterest().isInteresting());
+ }
+
+ public void testCopyContext() {
+ File sourceFile = contextStore.getFileForContext(context.getHandleIdentifier());
+ context.parseEvent(mockSelection("1"));
+ assertFalse(context.getInteractionHistory().isEmpty());
+ contextStore.saveContext(context);
+ assertTrue(sourceFile.exists());
+
+ File toFile = contextStore.getFileForContext("toContext");
+ assertFalse(toFile.exists());
+
+ contextStore.cloneContext(context.getHandleIdentifier(), "toContext");
+ assertTrue(toFile.exists());
+
+ manager.activateContext("toContext");
+ IInteractionContext toContext = manager.getActiveContext();
+ assertFalse(toContext.getInteractionHistory().isEmpty());
+// assertEquals(((CompositeInteractionContext) manager.getActiveContext()).get("toContext").getHandleIdentifier(),
+// toContext.getHandleIdentifier());
+
+ toFile.delete();
+ assertFalse(toFile.delete());
+ manager.deactivateAllContexts();
+ }
+
+ public void testHasContext() {
+ contextStore.getFileForContext("1").delete();
+ assertFalse(contextStore.getFileForContext("1").exists());
+ assertFalse(manager.hasContext("1"));
+ manager.internalActivateContext(contextStore.loadContext("1"));
+ assertTrue(manager.isContextActive());
+
+ manager.deactivateContext("1");
+ assertFalse(manager.hasContext("1"));
+
+ manager.internalActivateContext(contextStore.loadContext("1"));
+ manager.processInteractionEvent(mockSelection());
+ manager.deactivateContext("1");
+ assertTrue(manager.hasContext("1"));
+ contextStore.getFileForContext("1").delete();
+ }
+
+ public void testDelete() {
+ contextStore.getFileForContext("1").delete();
+ manager.deleteContext("1");
+ assertFalse(contextStore.getFileForContext("1").exists());
+ assertFalse(manager.hasContext("1"));
+ manager.internalActivateContext(contextStore.loadContext("1"));
+ assertTrue(manager.isContextActive());
+
+ InteractionContext activeContext = ((CompositeInteractionContext) manager.getActiveContext()).getContextMap()
+ .values()
+ .iterator()
+ .next();
+ activeContext.parseEvent(mockSelection());
+ assertTrue(containsHandle(activeContext, MOCK_HANDLE));
+ activeContext.delete(activeContext.get(MOCK_HANDLE));
+ assertFalse(containsHandle(activeContext, MOCK_HANDLE));
+
+ manager.deactivateContext("1");
+ assertFalse(manager.hasContext("1"));
+
+ manager.activateContext("1");
+ activeContext = ((CompositeInteractionContext) manager.getActiveContext()).getContextMap()
+ .values()
+ .iterator()
+ .next();
+ assertFalse(containsHandle(activeContext, MOCK_HANDLE));
+
+ manager.internalActivateContext(contextStore.loadContext("1"));
+ manager.processInteractionEvent(mockSelection());
+ manager.deactivateContext("1");
+ assertTrue(manager.hasContext("1"));
+ contextStore.getFileForContext("1").delete();
+ }
+
+ private boolean containsHandle(InteractionContext context, String mockHandle) {
+ for (IInteractionElement element : context.getAllElements()) {
+ if (element.getHandleIdentifier().equals(mockHandle)) {
+ return true;
+ }
+ }
+
+ for (InteractionEvent element : context.getInteractionHistory()) {
+ if (element.getStructureHandle().equals(mockHandle)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void testEdgeReset() throws CoreException, InterruptedException, InvocationTargetException {
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("public void m1() { }", null, true, null);
+ IPackageFragment p2 = project.createPackage("p2");
+
+ IType type2 = project.createType(p2, "Type2.java", "public class Type2 { }");
+ IMethod m2 = type2.createMethod("void m2() { }", null, true, null);
+
+ assertTrue(m1.exists());
+ assertEquals(1, type1.getMethods().length);
+
+ monitor.selectionChanged(part, new StructuredSelection(m1));
+ IInteractionElement m1Node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(m1Node.getInterest().isInteresting());
+ monitor.selectionChanged(part, new StructuredSelection(m2));
+ IInteractionElement m2Node = ContextCore.getContextManager().getElement(m2.getHandleIdentifier());
+ manager.processInteractionEvent(mockInterestContribution(m2.getHandleIdentifier(), scaling.getLandmark()));
+ assertTrue(m2Node.getInterest().isLandmark());
+
+ AbstractRelationProvider provider = ContextCorePlugin.getDefault()
+ .getRelationProviders("java")
+ .iterator()
+ .next();
+ provider.createEdge(m2Node, m1Node.getContentType(), m2.getHandleIdentifier());
+
+ assertEquals(1, m2Node.getRelations().size());
+
+ manager.resetLandmarkRelationshipsOfKind(provider.getId());
+
+ assertEquals(0, m2Node.getRelations().size());
+ }
+
+ public void testPredictedInterest() {
+ IInteractionElement node = ContextCore.getContextManager().getElement("doesn't exist");
+ assertFalse(node.getInterest().isInteresting());
+ assertFalse(node.getInterest().isPropagated());
+ }
+
+ public void testParentInterestAfterDecay() throws JavaModelException {
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(part, sm1);
+
+ IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+ AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault()
+ .getStructureBridge(node.getContentType());
+ IInteractionElement parent = ContextCore.getContextManager().getElement(
+ bridge.getParentHandle(node.getHandleIdentifier()));
+ assertTrue(parent.getInterest().isInteresting());
+ assertTrue(parent.getInterest().isPropagated());
+
+ for (int i = 0; i < 1 / (scaling.getDecay()) * 3; i++) {
+ ContextCore.getContextManager().processInteractionEvent(mockSelection());
+ }
+
+ assertFalse(ContextCore.getContextManager().getElement(m1.getHandleIdentifier()).getInterest().isInteresting());
+ ContextCore.getContextManager().processInteractionEvent(mockSelection(m1.getHandleIdentifier()));
+ assertTrue(ContextCore.getContextManager().getElement(m1.getHandleIdentifier()).getInterest().isInteresting());
+ }
+
+ public void testPropagation() throws JavaModelException, Exception {
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+ IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertFalse(node.getInterest().isInteresting());
+
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
+ new JavaStructureBridge().getContentType(), m1.getHandleIdentifier(), "source");
+ ContextCorePlugin.getContextManager().processInteractionEvent(event, true);
+
+ node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+
+ project.build();
+ IJavaElement parent = m1.getParent();
+ IInteractionElement parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
+ assertFalse(parentNode.getInterest().isInteresting());
+
+ InteractionEvent selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION,
+ new JavaStructureBridge().getContentType(), m1.getHandleIdentifier(), "source");
+ ContextCorePlugin.getContextManager().processInteractionEvent(selectionEvent, true);
+ parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
+ assertTrue(parentNode.getInterest().isInteresting());
+ }
+
+ public void testIncremenOfParentDoi() throws JavaModelException, Exception {
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+ IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertFalse(node.getInterest().isInteresting());
+
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(part, sm1);
+ node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+
+ project.build();
+ IJavaElement parent = m1.getParent();
+ int level = 1;
+ do {
+ level++;
+ IInteractionElement parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
+ if (!(parent instanceof JavaModel)) {
+ assertEquals("failed on: " + parent.getClass(), node.getInterest().getValue(), parentNode.getInterest()
+ .getValue());
+ }
+ parent = parent.getParent();
+ } while (parent != null);
+ }
+
+ public void testIncremenOfParentDoiAfterForcedDecay() throws JavaModelException, Exception {
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+ IMethod m2 = type1.createMethod("void m2() { }", null, true, null);
+ IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertFalse(node.getInterest().isInteresting());
+
+ monitor.selectionChanged(part, new StructuredSelection(m1));
+ node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+
+ // make all the parents interest propated to have negative interest
+ IJavaElement parent = m1.getParent();
+ int level = 1;
+ do {
+ level++;
+ IInteractionElement parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
+ if (!(parent instanceof JavaModel)) {
+ assertTrue(parentNode.getInterest().isInteresting());
+ ContextCore.getContextManager().processInteractionEvent(
+ mockInterestContribution(parentNode.getHandleIdentifier(), -2
+ * parentNode.getInterest().getValue()));
+ IInteractionElement updatedParent = ContextCore.getContextManager().getElement(
+ parent.getHandleIdentifier());
+ assertFalse(updatedParent.getInterest().isInteresting());
+ }
+ parent = parent.getParent();
+ } while (parent != null);
+
+// assertFalse(node.getInterest().isInteresting());
+
+ // select the element, should propagate up
+ monitor.selectionChanged(part, new StructuredSelection(m2));
+ monitor.selectionChanged(part, new StructuredSelection(m1));
+ node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+
+ project.build();
+ parent = m1.getParent();
+ level = 1;
+ do {
+ level++;
+ IInteractionElement parentNode = ContextCore.getContextManager().getElement(parent.getHandleIdentifier());
+ if (!(parent instanceof JavaModel)) {
+ assertTrue(parentNode.getInterest().isInteresting());
+// assertEquals("failed on: " + parent.getClass(), node.getInterest().getValue(), parentNode.getInterest()
+// .getValue());
+ }
+ parent = parent.getParent();
+ } while (parent != null);
+ }
+
+ public void testLandmarks() throws CoreException, IOException {
+ LandmarksModelListener listener = new LandmarksModelListener();
+ try {
+ manager.addListener(listener);
+
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("void m1() { }", null, true, null);
+
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(part, sm1);
+ manager.processInteractionEvent(mockInterestContribution(m1.getHandleIdentifier(), scaling.getLandmark()));
+ // packages can't be landmarks
+ manager.processInteractionEvent(mockInterestContribution(m1.getCompilationUnit()
+ .getParent()
+ .getHandleIdentifier(), scaling.getLandmark()));
+ // source folders can't be landmarks
+ manager.processInteractionEvent(mockInterestContribution(m1.getCompilationUnit()
+ .getParent()
+ .getParent()
+ .getHandleIdentifier(), scaling.getLandmark()));
+ // projects can't be landmarks
+ manager.processInteractionEvent(mockInterestContribution(m1.getCompilationUnit()
+ .getParent()
+ .getParent()
+ .getParent()
+ .getHandleIdentifier(), scaling.getLandmark()));
+
+ assertEquals(1, ContextCore.getContextManager().getActiveLandmarks().size());
+ assertEquals(1, listener.numAdditions);
+
+ manager.processInteractionEvent(mockInterestContribution(m1.getHandleIdentifier(), -scaling.getLandmark()));
+ assertEquals(1, listener.numDeletions);
+ } finally {
+ manager.removeListener(listener);
+ }
+ }
+
+ public void testEventProcessWithObject() throws JavaModelException {
+ InteractionContext context = new InteractionContext("global-id", new InteractionContextScaling());
+ context.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
+ ContextCorePlugin.getContextManager().addGlobalContext(context);
+
+ assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
+ assertEquals(0, context.getAllElements().size());
+ ContextCorePlugin.getContextManager().processInteractionEvent(type1, InteractionEvent.Kind.SELECTION,
+ MOCK_ORIGIN, context);
+ assertEquals(9, context.getAllElements().size());
+ assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
+ ContextCorePlugin.getContextManager().removeGlobalContext(context);
+ }
+
+ public void testEventProcessWithNonExistentObject() throws JavaModelException {
+ InteractionContext context = new InteractionContext("global-id", new InteractionContextScaling());
+ context.setContentLimitedTo(JavaStructureBridge.CONTENT_TYPE);
+ ContextCorePlugin.getContextManager().addGlobalContext(context);
+
+ assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
+ assertEquals(0, context.getAllElements().size());
+ ContextCorePlugin.getContextManager().processInteractionEvent(new String("non existent"),
+ InteractionEvent.Kind.SELECTION, MOCK_ORIGIN, context);
+ assertEquals(0, context.getAllElements().size());
+ assertEquals(0, ContextCore.getContextManager().getActiveContext().getAllElements().size());
+ ContextCorePlugin.getContextManager().removeGlobalContext(context);
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InterestFilterTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InterestFilterTest.java
new file mode 100644
index 0000000..b44c2a9
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InterestFilterTest.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.filters.ImportDeclarationFilter;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class InterestFilterTest extends AbstractJavaContextTest {
+
+ private InterestFilter filter;
+
+ private PackageExplorerPart explorer;
+
+ private AbstractFocusViewAction applyAction;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ explorer = PackageExplorerPart.openInActivePerspective();
+ assertNotNull(explorer);
+ applyAction = AbstractFocusViewAction.getActionForPart(explorer);
+ assertTrue(applyAction instanceof FocusPackageExplorerAction);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testPreservedFilterRemovalExclusion() throws JavaModelException {
+ List<Class<?>> filterClasses = new ArrayList<Class<?>>();
+ for (ViewerFilter filter : Arrays.asList(explorer.getTreeViewer().getFilters())) {
+ filterClasses.add(filter.getClass());
+ }
+ assertTrue(filterClasses.contains(ImportDeclarationFilter.class));
+
+ applyAction.update(true);
+ filterClasses = new ArrayList<Class<?>>();
+ for (ViewerFilter filter : Arrays.asList(explorer.getTreeViewer().getFilters())) {
+ filterClasses.add(filter.getClass());
+ }
+ assertTrue(filterClasses.contains(ImportDeclarationFilter.class));
+ }
+
+ public void testFilterRemovalAndRestore() throws JavaModelException {
+ applyAction.update(false);
+ ViewerFilter[] previousFilters = explorer.getTreeViewer().getFilters();
+ assertTrue(previousFilters.length > 1);
+ for (ViewerFilter viewerFilter : previousFilters) {
+ if (viewerFilter instanceof InterestFilter) {
+ fail();
+ }
+ }
+ applyAction.update(true);
+ ViewerFilter[] afterInstall = explorer.getTreeViewer().getFilters();
+ // more than 1 since we preserve some filters
+ assertEquals(3, afterInstall.length);
+
+ applyAction.update(false);
+ ViewerFilter[] restoredFilters = explorer.getTreeViewer().getFilters();
+ assertEquals(previousFilters.length, restoredFilters.length);
+ }
+
+ public void testInterestFilter() throws JavaModelException {
+
+ applyAction.update(true);
+ filter = applyAction.getInterestFilter();
+ assertNotNull(filter);
+
+ IMethod m1 = type1.createMethod("public void m10() { }", null, true, null);
+
+ assertFalse(filter.select(explorer.getTreeViewer(), null, type1));
+ monitor.selectionChanged(PackageExplorerPart.getFromActivePerspective(), new StructuredSelection(type1));
+ manager.internalActivateContext(context);
+
+ monitor.selectionChanged(PackageExplorerPart.getFromActivePerspective(), new StructuredSelection(type1));
+ assertTrue(filter.select(explorer.getTreeViewer(), null, type1));
+
+ assertFalse(filter.select(explorer.getTreeViewer(), null, m1));
+
+// filter.setExcludedMatches("*1*");
+// assertTrue(filter.select(explorer.getTreeViewer(), null, m1));
+// // teardown
+// filter.setExcludedMatches(null);
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InterestManipulationTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InterestManipulationTest.java
new file mode 100644
index 0000000..324a3f2
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/InterestManipulationTest.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction;
+import org.eclipse.mylyn.internal.resources.ui.ResourceInteractionMonitor;
+import org.eclipse.mylyn.internal.resources.ui.ResourceStructureBridge;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class InterestManipulationTest extends AbstractJavaContextTest {
+
+ private IInteractionElement method;
+
+ private IInteractionElement clazz;
+
+ private IInteractionElement cu;
+
+ private IMethod javaMethod;
+
+ private IType javaType;
+
+ private ICompilationUnit javaCu;
+
+ private IPackageFragment javaPackage;
+
+ private final IWorkbenchPart part = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ javaMethod = type1.createMethod("void testDecrement() { }", null, true, null);
+ javaType = (IType) javaMethod.getParent();
+ javaCu = (ICompilationUnit) javaType.getParent();
+ javaPackage = (IPackageFragment) javaCu.getParent();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testDecrementNonJavaProject() throws CoreException, InvocationTargetException, InterruptedException {
+ IFile file = nonJavaProject.getProject().getFile("foo.txt");
+ file.create(null, true, null);
+ ResourceStructureBridge bridge = new ResourceStructureBridge();
+ new ResourceInteractionMonitor().selectionChanged(part, new StructuredSelection(file));
+
+ IInteractionElement fileElement = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(file));
+
+ IInteractionElement projectElement = ContextCore.getContextManager().getElement(
+ new ResourceStructureBridge().getHandleIdentifier(nonJavaProject.getProject()));
+
+ assertTrue(fileElement.getInterest().isInteresting());
+ assertTrue(projectElement.getInterest().isInteresting());
+
+ assertTrue(ContextCorePlugin.getContextManager().manipulateInterestForElement(projectElement, false, false,
+ false, "test"));
+
+ projectElement = ContextCore.getContextManager().getElement(
+ new ResourceStructureBridge().getHandleIdentifier(nonJavaProject.getProject()));
+
+ fileElement = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(file));
+
+ assertFalse(projectElement.getInterest().isInteresting());
+ assertFalse(fileElement.getInterest().isInteresting());
+ }
+
+ public void testDecrementAcrossBridges() throws CoreException, InvocationTargetException, InterruptedException {
+ monitor.selectionChanged(part, new StructuredSelection(javaMethod));
+ method = ContextCore.getContextManager().getElement(javaMethod.getHandleIdentifier());
+
+ IFile file = project.getProject().getFile("foo.txt");
+ file.create(null, true, null);
+ // IFile file = (IFile)javaCu.getAdapter(IResource.class);
+ ResourceStructureBridge bridge = new ResourceStructureBridge();
+ new ResourceInteractionMonitor().selectionChanged(part, new StructuredSelection(file));
+
+ IInteractionElement fileElement = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(file));
+ IInteractionElement projectElement = ContextCore.getContextManager().getElement(
+ javaCu.getJavaProject().getHandleIdentifier());
+
+ assertTrue(fileElement.getInterest().isInteresting());
+ assertTrue(method.getInterest().isInteresting());
+
+ assertTrue(ContextCorePlugin.getContextManager().manipulateInterestForElement(projectElement, false, false,
+ false, "test"));
+
+ fileElement = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(file));
+ assertFalse(fileElement.getInterest().isInteresting());
+ // TODO: re-enable, fails in AllTests
+ // assertFalse(method.getInterest().isInteresting());
+ }
+
+ public void testDecrementInterestOfCompilationUnit() throws JavaModelException {
+ monitor.selectionChanged(part, new StructuredSelection(javaMethod));
+ monitor.selectionChanged(part, new StructuredSelection(javaCu));
+ method = ContextCore.getContextManager().getElement(javaMethod.getHandleIdentifier());
+ clazz = ContextCore.getContextManager().getElement(javaType.getHandleIdentifier());
+ cu = ContextCore.getContextManager().getElement(javaCu.getHandleIdentifier());
+
+ IInteractionElement packageNode = ContextCore.getContextManager().getElement(javaPackage.getHandleIdentifier());
+
+ assertTrue(method.getInterest().isInteresting());
+ assertTrue(clazz.getInterest().isInteresting());
+ assertTrue(cu.getInterest().isInteresting());
+
+ assertTrue(ContextCorePlugin.getContextManager().manipulateInterestForElement(packageNode, false, false, false,
+ "test"));
+
+ method = ContextCore.getContextManager().getElement(javaMethod.getHandleIdentifier());
+ clazz = ContextCore.getContextManager().getElement(javaType.getHandleIdentifier());
+ cu = ContextCore.getContextManager().getElement(javaCu.getHandleIdentifier());
+
+ packageNode = ContextCore.getContextManager().getElement(javaPackage.getHandleIdentifier());
+
+ assertFalse(packageNode.getInterest().isInteresting());
+ assertFalse(cu.getInterest().isInteresting());
+ assertFalse(clazz.getInterest().isInteresting());
+ assertFalse(method.getInterest().isInteresting());
+ }
+
+ public void testManipulation() throws JavaModelException {
+ InterestManipulationAction action = new InterestManipulationAction();
+
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("void m22() { }", null, true, null);
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(part, sm1);
+ IInteractionElement node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertFalse(node.getInterest().isLandmark());
+ assertNotNull(ContextCore.getContextManager().getActiveElement());
+ action.changeInterestForSelected(true);
+ assertTrue(node.getInterest().isLandmark());
+ action.changeInterestForSelected(true);
+
+ assertEquals((scaling.getForcedLandmark()) + scaling.get(InteractionEvent.Kind.SELECTION), node.getInterest()
+ .getValue());
+
+ action.changeInterestForSelected(false);
+
+ node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertFalse(node.getInterest().isLandmark());
+ assertTrue(node.getInterest().isInteresting());
+ action.changeInterestForSelected(false);
+ assertFalse(node.getInterest().isInteresting());
+ assertEquals(node.getInterest().getValue(), -scaling.get(InteractionEvent.Kind.SELECTION));
+ action.changeInterestForSelected(false);
+ assertEquals(node.getInterest().getValue(), -scaling.get(InteractionEvent.Kind.SELECTION));
+ }
+
+ class InterestManipulationAction extends AbstractInterestManipulationAction {
+
+ @Override
+ protected boolean isIncrement() {
+ return true;
+ }
+
+ public void changeInterestForSelected(boolean increment) {
+ assertTrue(ContextCorePlugin.getContextManager().manipulateInterestForElement(
+ ContextCore.getContextManager().getActiveElement(), increment, false, true, ""));
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/JavaEditingMonitorTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/JavaEditingMonitorTest.java
new file mode 100644
index 0000000..428fae3
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/JavaEditingMonitorTest.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Jingwen Ou 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:
+ * Jingwen Ou - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.java.tests;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.mylyn.internal.java.ui.JavaEditingMonitor;
+import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.resources.tests.ResourceTestUtil;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Jingwen Ou
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+public class JavaEditingMonitorTest extends AbstractJavaContextTest {
+
+ private IMethod callee;
+
+ private IMethod caller;
+
+ private int editingCount;
+
+ private final JavaEditingMonitor monitor = new JavaEditingMonitor();
+
+ private IPackageFragment pkg;
+
+ private TestJavaProject project;
+
+ private int selectingCount;
+
+ private IType typeFoo;
+
+ private IInteractionEventListener listener;
+
+ @Override
+ protected void setUp() throws Exception {
+ project = new TestJavaProject(this.getClass().getName());
+ pkg = project.createPackage("pkg1");
+ typeFoo = project.createType(pkg, "Foo.java", "public class Foo { }");
+ caller = typeFoo.createMethod("void caller() { }", null, true, null);
+ callee = typeFoo.createMethod("void callee() { }", callee, true, null);
+
+ listener = new IInteractionEventListener() {
+ public void interactionObserved(InteractionEvent event) {
+ if (event.getKind() == Kind.EDIT) {
+ editingCount++;
+ } else if (event.getKind() == Kind.SELECTION) {
+ selectingCount++;
+ }
+ }
+
+ public void startMonitoring() {
+ // ignore
+ }
+
+ public void stopMonitoring() {
+ // ignore
+ }
+ };
+ MonitorUi.addInteractionListener(listener);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (listener != null) {
+ MonitorUi.removeInteractionListener(listener);
+ }
+
+ ResourceTestUtil.deleteProject(project.getProject());
+ }
+
+ /**
+ * Selects a method twice to see whether the editing is handled correctly. Note: Two sequential selections on the
+ * same element are deemed to be an edit of the selection as this is the best guess that can be made. See bug
+ * 252306.
+ */
+ public void testHandleElementEdit() throws PartInitException, JavaModelException, InterruptedException {
+ CompilationUnitEditor editorPart = (CompilationUnitEditor) JavaUI.openInEditor(caller);
+ Document document = new Document(typeFoo.getCompilationUnit().getSource());
+
+ // select callee
+ TextSelection calleeSelection = new TextSelection(document, typeFoo.getCompilationUnit().getSource().indexOf(
+ "callee()"), "callee".length());
+ editorPart.setHighlightRange(calleeSelection.getOffset(), calleeSelection.getLength(), true);
+
+ // select it once
+ monitor.handleWorkbenchPartSelection(editorPart, calleeSelection, false);
+
+ assertEquals(0, editingCount);
+ assertEquals(6, selectingCount);
+
+ // select it again
+ monitor.handleWorkbenchPartSelection(editorPart, calleeSelection, false);
+
+ assertEquals(1, editingCount);
+ assertEquals(6, selectingCount);
+ }
+
+ public void testHandleElementSelection() throws PartInitException, JavaModelException, InterruptedException {
+ CompilationUnitEditor editorPart = (CompilationUnitEditor) JavaUI.openInEditor(caller);
+ Document document = new Document(typeFoo.getCompilationUnit().getSource());
+
+ // select callee
+ TextSelection calleeSelection = new TextSelection(document, typeFoo.getCompilationUnit().getSource().indexOf(
+ "callee()"), "callee".length());
+ editorPart.setHighlightRange(calleeSelection.getOffset(), calleeSelection.getLength(), true);
+
+ // select it once
+ monitor.handleWorkbenchPartSelection(editorPart, calleeSelection, false);
+
+ assertEquals(0, editingCount);
+ assertEquals(1, selectingCount);
+
+ TextSelection callerSelection = new TextSelection(document, typeFoo.getCompilationUnit().getSource().indexOf(
+ "caller()"), "caller".length());
+ editorPart.setHighlightRange(callerSelection.getOffset(), callerSelection.getLength(), true);
+ // select a different element
+ monitor.handleWorkbenchPartSelection(editorPart, callerSelection, false);
+
+ assertEquals(0, editingCount);
+ assertEquals(2, selectingCount);
+
+ // select a different element
+ monitor.handleWorkbenchPartSelection(editorPart, callerSelection, false);
+
+ assertEquals(1, editingCount);
+ assertEquals(2, selectingCount);
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/JavaStructureTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/JavaStructureTest.java
new file mode 100644
index 0000000..ab4e0b1
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/JavaStructureTest.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.java.ui.JavaEditingMonitor;
+import org.eclipse.mylyn.resources.tests.ResourceTestUtil;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaStructureTest extends AbstractJavaContextTest {
+
+ private final InteractionContextManager manager = ContextCorePlugin.getContextManager();
+
+ private final JavaEditingMonitor monitor = new JavaEditingMonitor();
+
+ private final IWorkbenchPart part = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart();
+
+ private TestJavaProject project;
+
+ private IPackageFragment pkg;
+
+ private IType typeFoo;
+
+ private IMethod caller;
+
+ private IMethod callee;
+
+ private InteractionContext taskscape;
+
+ private final InteractionContextScaling scaling = new InteractionContextScaling();
+
+ @Override
+ protected void setUp() throws Exception {
+ project = new TestJavaProject(this.getClass().getName());
+ pkg = project.createPackage("pkg1");
+ typeFoo = project.createType(pkg, "Foo.java", "public class Foo { }");
+ caller = typeFoo.createMethod("void caller() { callee(); }", null, true, null);
+ callee = typeFoo.createMethod("void callee() { }", callee, true, null);
+
+ taskscape = new InteractionContext("12312", scaling);
+ manager.internalActivateContext(taskscape);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ manager.deactivateContext("12312");
+ ResourceTestUtil.deleteProject(project.getProject());
+ }
+
+ public void testNavigation() throws JavaModelException, PartInitException {
+ CompilationUnitEditor editorPart = (CompilationUnitEditor) JavaUI.openInEditor(caller);
+
+ monitor.selectionChanged(part, new StructuredSelection(caller));
+
+ Document document = new Document(typeFoo.getCompilationUnit().getSource());
+
+ TextSelection callerSelection = new TextSelection(document, typeFoo.getCompilationUnit().getSource().indexOf(
+ "callee();"), "callee".length());
+ editorPart.setHighlightRange(callerSelection.getOffset(), callerSelection.getLength(), true);
+ monitor.selectionChanged(editorPart, callerSelection);
+
+ TextSelection calleeSelection = new TextSelection(document, callee.getSourceRange().getOffset(),
+ callee.getSourceRange().getLength());
+ editorPart.setHighlightRange(callerSelection.getOffset(), callerSelection.getLength(), true);
+ monitor.selectionChanged(editorPart, calleeSelection);
+
+ IInteractionElement callerNode = manager.getElement(caller.getHandleIdentifier());
+ IInteractionElement calleeNode = manager.getElement(callee.getHandleIdentifier());
+ assertTrue(callerNode.getInterest().isInteresting());
+ assertTrue(calleeNode.getInterest().isInteresting());
+ assertEquals(1, callerNode.getRelations().size());
+
+ TextSelection callerAgain = new TextSelection(document, typeFoo.getCompilationUnit().getSource().indexOf(
+ "callee();"), "callee".length());
+ editorPart.setHighlightRange(callerAgain.getOffset(), callerAgain.getLength(), true);
+ monitor.selectionChanged(editorPart, callerSelection);
+ assertTrue(calleeNode.getRelations().size() == 1);
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/PackageExplorerRefreshTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/PackageExplorerRefreshTest.java
new file mode 100644
index 0000000..7f96156
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/PackageExplorerRefreshTest.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.context.tests.UiTestUtil;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class PackageExplorerRefreshTest extends AbstractJavaContextTest {
+
+ private PackageExplorerPart view;
+
+ private TreeViewer viewer;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ view = PackageExplorerPart.openInActivePerspective();
+ viewer = view.getTreeViewer();
+ ContextUiPlugin.getViewerManager().setSyncRefreshMode(true);
+ AbstractFocusViewAction.getActionForPart(view).update(true);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testIsEmptyAfterDeactivation() throws JavaModelException, InterruptedException {
+ IMethod m1 = type1.createMethod("void m111() { }", null, true, null);
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(view, sm1);
+ viewer.expandAll();
+
+ assertTrue(UiTestUtil.countItemsInTree(viewer.getTree()) > 0);
+ assertNotNull(viewer.testFindItem(m1));
+ assertNotNull(viewer.testFindItem(m1.getParent()));
+
+ manager.deactivateContext(contextId);
+ AbstractFocusViewAction.getActionForPart(view).update(true);
+ assertTrue("num items: " + UiTestUtil.countItemsInTree(viewer.getTree()),
+ UiTestUtil.countItemsInTree(viewer.getTree()) == 0);
+ AbstractFocusViewAction.getActionForPart(view).update();
+ }
+
+ public void testFocusPackageExplorerFilterAddition() {
+ AbstractFocusViewAction.getActionForPart(view).update(false);
+ List<ViewerFilter> filters = Arrays.asList(viewer.getFilters());
+
+ for (ViewerFilter viewerFilter : filters) {
+ if (viewerFilter instanceof InterestFilter) {
+ fail();
+ }
+ }
+
+ AbstractFocusViewAction.getActionForPart(view).update(true);
+ AbstractFocusViewAction.getActionForPart(view).update(true);
+
+ filters = Arrays.asList(viewer.getFilters());
+ int filterCount = 0;
+ for (ViewerFilter viewerFilter : filters) {
+ if (viewerFilter instanceof InterestFilter) {
+ filterCount++;
+ }
+ }
+ assertEquals(1, filterCount);
+ }
+
+ public void testPropagation() throws JavaModelException {
+ IMethod m1 = type1.createMethod("void m111() { }", null, true, null);
+ StructuredSelection sm1 = new StructuredSelection(m1);
+ monitor.selectionChanged(view, sm1);
+ viewer.expandAll();
+
+ assertNotNull(viewer.testFindItem(m1));
+ assertNotNull(viewer.testFindItem(m1.getParent()));
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ProblemsListTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ProblemsListTest.java
new file mode 100644
index 0000000..aa1699f
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ProblemsListTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaModelMarker;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.mylyn.internal.ide.ui.MarkerViewerInterestSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.views.markers.internal.ProblemMarker;
+
+/**
+ * @author Mik Kersten
+ */
+public class ProblemsListTest extends AbstractJavaContextTest {
+
+ boolean done = false;
+
+ public void testInterestSorting() throws CoreException, InvocationTargetException, InterruptedException {
+ IViewPart problemsPart = JavaPlugin.getActivePage().showView("org.eclipse.ui.views.ProblemView");
+ assertNotNull(problemsPart);
+
+ IMethod m1 = type1.createMethod("void m1() { int a; }\n", null, true, null);
+ IMethod m2 = type1.createMethod("void m2() { int b; }\n", null, true, null);
+ type1.createMethod("void m3() { c; }", null, true, null);
+ project.build();
+
+ manager.processInteractionEvent(mockInterestContribution(m1.getHandleIdentifier(), 3f));
+ manager.processInteractionEvent(mockInterestContribution(m2.getHandleIdentifier(), 2f));
+
+ TableViewer viewer = new TableViewer(new Table(problemsPart.getViewSite().getShell(), SWT.NULL));
+ viewer.setSorter(new MarkerViewerInterestSorter());
+
+ IMarker[] markers = type1.getResource().findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false,
+ IResource.DEPTH_INFINITE);
+ List<ProblemMarker> problemMarkers = new ArrayList<ProblemMarker>();
+ for (IMarker marker2 : markers) {
+ ProblemMarker marker = new ProblemMarker(marker2);
+ problemMarkers.add(marker);
+ viewer.add(marker);
+ }
+
+ // TODO: re-enable
+ // // item 0 should be error
+ // assertEquals(problemMarkers.get(0),
+ // viewer.getTable().getItem(1).getData());
+ // viewer.refresh();
+ // manager.handleInteractionEvent(mockInterestContribution(m2.getHandleIdentifier(),
+ // 4f));
+ // for (int i = 0; i < markers.length; i++) viewer.add(new
+ // ProblemMarker(markers[i]));
+ // assertEquals(problemMarkers.get(1),
+ // viewer.getTable().getItem(1).getData());
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/RefactoringTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/RefactoringTest.java
new file mode 100644
index 0000000..7b7f879
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/RefactoringTest.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.java.ui.InterestUpdateDeltaListener;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class RefactoringTest extends AbstractJavaContextTest {
+
+ private IViewPart view;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ view = PackageExplorerPart.openInActivePerspective();
+ InterestUpdateDeltaListener.setAsyncExecMode(false);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testDelete() throws CoreException, InvocationTargetException, InterruptedException {
+ IType type = project.createType(p1, "Refactor.java", "public class Refactor { }");
+
+ IMethod method = type.createMethod("public void deleteMe() { }", null, true, null);
+ monitor.selectionChanged(view, new StructuredSelection(method));
+ IInteractionElement node = ContextCore.getContextManager().getElement(method.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+ project.build();
+ TestProgressMonitor monitor = new TestProgressMonitor();
+ method.delete(true, monitor);
+ if (!monitor.isDone()) {
+ Thread.sleep(100);
+ }
+ IInteractionElement deletedNode = ContextCore.getContextManager().getElement(method.getHandleIdentifier());
+ assertFalse(deletedNode.getInterest().isInteresting());
+ }
+
+ // XXX: Put back
+ /**
+ * Limitation: only interest of compilation unit is preserved
+ */
+ public void testTypeRename() throws CoreException, InterruptedException, InvocationTargetException {
+ IType type = project.createType(p1, "Refactor.java", "public class Refactor { }");
+ monitor.selectionChanged(view, new StructuredSelection(type));
+ monitor.selectionChanged(view, new StructuredSelection(type.getParent()));
+ project.build();
+ IInteractionElement node = ContextCore.getContextManager().getElement(type.getHandleIdentifier());
+ IInteractionElement parentNode = ContextCore.getContextManager().getElement(
+ type.getParent().getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+ assertTrue(parentNode.getInterest().isInteresting());
+
+ TestProgressMonitor monitor = new TestProgressMonitor();
+ type.rename("NewName", true, monitor);
+ if (!monitor.isDone()) {
+ Thread.sleep(200);
+ }
+ project.build();
+ ICompilationUnit unit = (ICompilationUnit) p1.getChildren()[0];
+
+ IType newType = unit.getTypes()[0];
+ IInteractionElement oldParentNode = ContextCore.getContextManager()
+ .getElement(parentNode.getHandleIdentifier());
+ assertFalse(oldParentNode.getInterest().isInteresting());
+ IInteractionElement newParentNode = ContextCore.getContextManager().getElement(
+ newType.getParent().getHandleIdentifier());
+ assertTrue(newParentNode.getInterest().isInteresting());
+ }
+
+ public void testMethodRename() throws CoreException, InterruptedException, InvocationTargetException {
+ IType type = project.createType(p1, "Refactor.java", "public class Refactor { }");
+ IMethod method = type.createMethod("public void refactorMe() { }", null, true, null);
+
+ assertTrue(method.exists());
+ assertEquals(1, type.getMethods().length);
+
+ monitor.selectionChanged(view, new StructuredSelection(method));
+ IInteractionElement node = ContextCore.getContextManager().getElement(method.getHandleIdentifier());
+ assertTrue(node.getInterest().isInteresting());
+
+ project.build();
+ TestProgressMonitor monitor = new TestProgressMonitor();
+ method.rename("refactored", true, monitor);
+ if (!monitor.isDone()) {
+ Thread.sleep(200);
+ }
+ IMethod newMethod = type.getMethods()[0];
+ assertTrue(newMethod.getElementName().equals("refactored"));
+ IInteractionElement newNode = ContextCore.getContextManager().getElement(newMethod.getHandleIdentifier());
+ assertTrue(newNode.getInterest().isInteresting());
+
+ IInteractionElement goneNode = ContextCore.getContextManager().getElement(node.getHandleIdentifier());
+ assertFalse(goneNode.getInterest().isInteresting());
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ResourceStructureMappingTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ResourceStructureMappingTest.java
new file mode 100644
index 0000000..7b3712a
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/ResourceStructureMappingTest.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceStructureMappingTest extends AbstractJavaContextTest {
+
+ public void testParentResourceMapping() throws CoreException {
+ IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
+ IMethod m1 = type1.createMethod("public void m1() { }", null, true, null);
+
+ monitor.selectionChanged(part, new StructuredSelection(m1));
+ IInteractionElement m1Node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
+ assertTrue(m1Node.getInterest().isInteresting());
+
+ IResource containingResource = ResourcesUiBridgePlugin.getDefault().getResourceForElement(m1Node, true);
+ assertEquals(m1.getCompilationUnit().getAdapter(IResource.class), containingResource);
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TestJavaProject.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TestJavaProject.java
new file mode 100644
index 0000000..f00a88c
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TestJavaProject.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.core.search.SearchPattern;
+import org.eclipse.jdt.core.search.TypeNameRequestor;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * From Erich Gamma's "Contributing to Eclipse" book.
+ *
+ * @author Mik Kersten
+ */
+public class TestJavaProject {
+ public IProject project;
+
+ public IJavaProject javaProject;
+
+ private IPackageFragmentRoot sourceFolder;
+
+ public TestJavaProject(final String name) throws CoreException, InvocationTargetException, InterruptedException {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ project = root.getProject(name);
+ project.create(null);
+ project.open(null);
+
+ javaProject = JavaCore.create(project);
+ IFolder binFolder = createBinFolder();
+ setJavaNature();
+ javaProject.setRawClasspath(new IClasspathEntry[0], null);
+ createOutputFolder(binFolder);
+ addSystemLibraries();
+ }
+
+ public IProject getProject() {
+ return project;
+ }
+
+ public IJavaProject getJavaProject() {
+ return javaProject;
+ }
+
+ public void build() throws CoreException, InvocationTargetException, InterruptedException {
+ WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+ @Override
+ protected void execute(IProgressMonitor monitor) throws CoreException {
+ project.build(IncrementalProjectBuilder.FULL_BUILD, null);
+ };
+ };
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.run(true, true, op);
+ }
+
+ public IPackageFragment createPackage(String name) throws CoreException {
+ if (sourceFolder == null) {
+ sourceFolder = createSourceFolder();
+ }
+ return sourceFolder.createPackageFragment(name, false, null);
+ }
+
+ public IType createType(IPackageFragment pack, String cuName, String source) throws JavaModelException {
+ StringBuffer buf = new StringBuffer();
+ buf.append("package " + pack.getElementName() + ";\n");
+ buf.append("\n");
+ buf.append(source);
+ ICompilationUnit cu = pack.createCompilationUnit(cuName, buf.toString(), false, null);
+ return cu.getTypes()[0];
+ }
+
+ private IFolder createBinFolder() throws CoreException {
+ IFolder binFolder = project.getFolder("bin");
+ binFolder.create(false, true, null);
+ return binFolder;
+ }
+
+ private void setJavaNature() throws CoreException {
+ IProjectDescription description = project.getDescription();
+ description.setNatureIds(new String[] { JavaCore.NATURE_ID });
+ project.setDescription(description, null);
+ }
+
+ private void createOutputFolder(IFolder binFolder) throws JavaModelException {
+ IPath outputLocation = binFolder.getFullPath();
+ javaProject.setOutputLocation(outputLocation, null);
+ }
+
+ private IPackageFragmentRoot createSourceFolder() throws CoreException {
+ IFolder folder = project.getFolder("src");
+ folder.create(false, true, null);
+ IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(folder);
+
+ IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
+ IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
+ System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
+ newEntries[oldEntries.length] = JavaCore.newSourceEntry(root.getPath());
+ javaProject.setRawClasspath(newEntries, null);
+ return root;
+ }
+
+ private void addSystemLibraries() throws JavaModelException {
+ IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
+ IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
+ System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
+ newEntries[oldEntries.length] = JavaRuntime.getDefaultJREContainerEntry();
+ javaProject.setRawClasspath(newEntries, null);
+ }
+
+ public void addJar(Plugin plugin, String jar) throws MalformedURLException, IOException, JavaModelException {
+ Path result = findFileInPlugin(plugin, jar);
+ IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
+ IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
+ System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
+ newEntries[oldEntries.length] = JavaCore.newLibraryEntry(result, null, null);
+ javaProject.setRawClasspath(newEntries, null);
+ }
+
+ private Path findFileInPlugin(Plugin plugin, String file) throws MalformedURLException, IOException {
+ // Plugin p = Platform.getPlugin(plugin);
+ URL pluginURL = plugin.getBundle().getEntry("/");
+ URL jarURL = new URL(pluginURL, file);
+ URL localJarURL = FileLocator.toFileURL(jarURL);//Platform.asLocalURL(jarURL);
+ return new Path(localJarURL.getPath());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void waitForIndexer() throws JavaModelException {
+ new SearchEngine().searchAllTypeNames(null, null, SearchPattern.R_EXACT_MATCH, IJavaSearchConstants.CLASS,
+ SearchEngine.createJavaSearchScope(new IJavaElement[0]), new TypeNameRequestor() {
+ // nothing needs to be done here...we accept everything
+ }, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TestProject.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TestProject.java
new file mode 100644
index 0000000..bbf5af4
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TestProject.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Shawn Minto
+ */
+public class TestProject {
+ public IProject project;
+
+ public TestProject(final String name) throws CoreException, InvocationTargetException, InterruptedException {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ project = root.getProject(name);
+ project.create(null);
+ project.open(null);
+ }
+
+ public IProject getProject() {
+ return project;
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TypeHistoryManagerTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TypeHistoryManagerTest.java
new file mode 100644
index 0000000..8f3dbf6
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/TypeHistoryManagerTest.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.corext.util.OpenTypeHistory;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.java.ui.TypeHistoryManager;
+
+/**
+ * @author Mik Kersten
+ */
+public class TypeHistoryManagerTest extends AbstractJavaContextTest {
+
+ private TypeHistoryManager manager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ manager = new TypeHistoryManager();
+// ContextCorePlugin.getContextManager().addListener(manager);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+// ContextCorePlugin.getContextManager().removeListener(manager);
+ }
+
+ public void testPredictedElementPopulationOfTypeHistory() throws JavaModelException {
+ manager.clearTypeHistory();
+ assertEquals(0, OpenTypeHistory.getInstance().getTypeInfos().length);
+
+ StructuredSelection sm1 = new StructuredSelection(type1);
+ monitor.selectionChanged(PackageExplorerPart.openInActivePerspective(), sm1);
+ assertEquals(1, OpenTypeHistory.getInstance().getTypeInfos().length);
+
+ IType type2 = project.createType(p1, "Type2.java", "public class Type2 { }");
+ IMethod m1 = type2.createMethod("void m1() { }", null, true, null);
+ StructuredSelection sm2 = new StructuredSelection(m1);
+ monitor.selectionChanged(PackageExplorerPart.openInActivePerspective(), sm2);
+ assertEquals(2, OpenTypeHistory.getInstance().getTypeInfos().length);
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/ActiveSearchNotifier.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/ActiveSearchNotifier.java
new file mode 100644
index 0000000..16597f9
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/ActiveSearchNotifier.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Shawn Minto
+ */
+public class ActiveSearchNotifier extends AbstractContextTest {
+
+ private CompositeInteractionContext context;
+
+ private final String source;
+
+ public ActiveSearchNotifier(CompositeInteractionContext context, String source) {
+ this.context = context;
+ this.source = source;
+ }
+
+ public IInteractionElement mockLowerInterest(IInteractionElement node) {
+ return context.addEvent(mockUserEvent(node.getHandleIdentifier(), node.getContentType(), source, -3));
+ }
+
+ public IInteractionElement mockRaiseInterest(IInteractionElement node) {
+ return context.addEvent(mockUserEvent(node.getHandleIdentifier(), node.getContentType(), source, 2));
+ }
+
+ public IInteractionElement mockLowerInterest(String handle, String kind) {
+ return mockLowerInterest(mockEditorSelection(handle, kind));
+ }
+
+ public IInteractionElement mockRaiseInterest(String handle, String kind) {
+ return mockRaiseInterest(mockEditorSelection(handle, kind));
+ }
+
+ public IInteractionElement mockEditorSelection(String handle, String kind) {
+ context.addEvent(mockSelection(handle, kind, source));
+ return context.addEvent(mockSelection(handle, kind, source));
+ }
+
+ public IInteractionElement getElement(String handle, String kind) {
+ IInteractionElement node = context.addEvent(mockSelection(handle, kind, source));
+ ContextCorePlugin.getContextManager().processInteractionEvent(
+ mockUserEvent(handle, kind, source, (1 / ContextCore.getCommonContextScaling().getLandmark()) * -2),
+ true);
+ return node;
+ }
+
+ public void clearContext() throws IOException, CoreException {
+ WorkspaceSetupHelper.clearDoiModel();
+ try {
+ InteractionContext workspaceContext = WorkspaceSetupHelper.getContext();
+ ContextCore.getContextManager().activateContext(workspaceContext.getHandleIdentifier());
+ context = (CompositeInteractionContext) ContextCore.getContextManager().getActiveContext();
+ } catch (Exception e) {
+ fail();
+ }
+ }
+
+ private InteractionEvent mockSelection(String handle, String kind, String origin) {
+ return new InteractionEvent(InteractionEvent.Kind.SELECTION, kind, handle, origin);
+ }
+
+ private InteractionEvent mockUserEvent(String handle, String kind, String origin, float scale) {
+ InteractionEvent e = new InteractionEvent(InteractionEvent.Kind.MANIPULATION, kind, handle, origin, scale
+ * ContextCore.getCommonContextScaling().getLandmark());
+ e.getInterestContribution();
+ return e;
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JUnitReferencesSearchPluginTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JUnitReferencesSearchPluginTest.java
new file mode 100644
index 0000000..e81c039
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JUnitReferencesSearchPluginTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.java.ui.search.JUnitReferencesProvider;
+
+/**
+ * @author Mik Kersten
+ */
+public class JUnitReferencesSearchPluginTest extends TestCase implements ISearchPluginTest {
+
+ // TESTCASENEEDED need a project that has a method that starts with test,
+ // but doesn't extend junit.framework.TestCase
+
+ public void testJUnitReferencesSearchDOS1() {
+ // List<?> results = search(1);
+ }
+
+ //
+ // public void testJUnitReferencesSearchDOS2(){
+ // List<?> results = search(2);
+ // }
+ //
+ // public void testJUnitReferencesSearchDOS3(){
+ // List<?> results = search(3);
+ // }
+ //
+ // public void testJUnitReferencesSearchDOS4(){
+ // List<?> results = search(4);
+ // }
+ //
+ // public void testJUnitReferencesSearchDOS5(){
+ // List<?> results = search(5);
+ // }
+
+ public List<?> search(int dos, IInteractionElement node) {
+
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ JUnitReferencesProvider prov = new JUnitReferencesProvider();
+
+ TestActiveSearchListener l = new TestActiveSearchListener(prov);
+ IActiveSearchOperation o = prov.getSearchOperation(node, IJavaSearchConstants.REFERENCES, dos);
+ SearchPluginTestHelper.search(o, l);
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaImplementorsSearchPluginTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaImplementorsSearchPluginTest.java
new file mode 100644
index 0000000..d5cdeda
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaImplementorsSearchPluginTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.java.ui.search.JavaImplementorsProvider;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaImplementorsSearchPluginTest extends TestCase implements ISearchPluginTest {
+
+ @Override
+ protected void setUp() throws Exception {
+ // nothing to do here yet
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // nothing to do here yet
+ }
+
+ public void testJavaImplementorsSearchDOS1() throws InterruptedException {
+ // List<?> results = search(1);
+ }
+
+ //
+ // public void testJavaImplementorsSearchDOS2(){
+ // List<?> results = search(2);
+ // }
+ //
+ // public void testJavaImplementorsSearchDOS3(){
+ // List<?> results = search(3);
+ // }
+ //
+ // public void testJavaImplementorsSearchDOS4(){
+ // List<?> results = search(4);
+ // }
+ //
+ // public void testJavaImplementorsSearchDOS5(){
+ // List<?> results = search(5);
+ // }
+
+ public List<?> search(int dos, IInteractionElement node) {
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ JavaImplementorsProvider prov = new JavaImplementorsProvider();
+
+ IActiveSearchOperation o = prov.getSearchOperation(node, IJavaSearchConstants.IMPLEMENTORS, dos);
+ TestActiveSearchListener l = new TestActiveSearchListener(prov);
+ SearchPluginTestHelper.search(o, l);
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaReadAccessSearchPluginTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaReadAccessSearchPluginTest.java
new file mode 100644
index 0000000..66d4bd0
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaReadAccessSearchPluginTest.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.java.ui.search.JavaReadAccessProvider;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaReadAccessSearchPluginTest extends TestCase implements ISearchPluginTest {
+
+ public void testJavaReadAccessSearchDOS1() {
+ // List<?> results = search(1);
+ }
+
+ //
+ // public void testJavaReadAccessSearchDOS2(){
+ // List<?> results = search(2);
+ // }
+ //
+ // public void testJavaReadAccessSearchDOS3(){
+ // List<?> results = search(3);
+ // }
+ //
+ // public void testJavaReadAccessSearchDOS4(){
+ // List<?> results = search(4);
+ // }
+ //
+ // public void testJavaReadAccessSearchDOS5(){
+ // List<?> results = search(5);
+ // }
+
+ public List<?> search(int dos, IInteractionElement node) {
+
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ JavaReadAccessProvider prov = new JavaReadAccessProvider();
+
+ TestActiveSearchListener l = new TestActiveSearchListener(null);
+ IActiveSearchOperation o = prov.getSearchOperation(node, IJavaSearchConstants.READ_ACCESSES, dos);
+ SearchPluginTestHelper.search(o, l);
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaReferencesSearchTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaReferencesSearchTest.java
new file mode 100644
index 0000000..cbe6e7b
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaReferencesSearchTest.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.io.IOException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.search.JavaReferencesProvider;
+import org.eclipse.mylyn.internal.pde.ui.PdeStructureBridge;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class JavaReferencesSearchTest extends TestCase implements ISearchPluginTest {
+
+ private IType type1;
+
+ private IType type11;
+
+ private IType type2;
+
+ private IFile plugin1;
+
+ private IJavaProject jp1;
+
+ private IJavaProject jp2;
+
+ private static final String SOURCE_ID = "JavaReferencesSearchTest";
+
+ private SearchPluginTestHelper helper;
+
+ @Override
+ protected void setUp() throws Exception {
+ // TODO: clear the relationship providers?
+ WorkspaceSetupHelper.setupWorkspace();
+ jp1 = WorkspaceSetupHelper.getProject1();
+ jp2 = WorkspaceSetupHelper.getProject2();
+ type1 = WorkspaceSetupHelper.getType(jp1, "org.eclipse.mylar.tests.project1.views.SampleView");
+ type11 = WorkspaceSetupHelper.getType(jp1, "org.eclipse.mylar.tests.project1.Project1Plugin");
+ type2 = WorkspaceSetupHelper.getType(jp2, "org.eclipse.mylar.tests.project2.builder.ToggleNatureAction");
+ plugin1 = WorkspaceSetupHelper.getFile(jp1, "plugin.xml");
+
+ InteractionContext context = WorkspaceSetupHelper.getContext();
+ ContextCore.getContextManager().activateContext(context.getHandleIdentifier());
+ helper = new SearchPluginTestHelper(this);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ WorkspaceSetupHelper.clearDoiModel();
+ ContextCore.getContextManager().deactivateContext(WorkspaceSetupHelper.getContext().getHandleIdentifier());
+ assertFalse(ContextCore.getContextManager().isContextActive());
+ }
+
+ public void testJavaReferencesSearchDOS1() throws IOException, CoreException {
+
+ int dos = 1;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ // results should be null since the scope would be null.
+ // There are no landmarks to search over
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, but have no references since the landmark
+ // is an element in a different project
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 0);
+
+ // results should be not null, but have no java references since the
+ // landmark
+ // is an element in the same project, but there are no references in it
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type11.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 1);
+
+ // results should be not null, but have no references
+ // This file type should never affect the scope
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, plugin1.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos);
+
+ // results should be not null, and there should be 1 reference since we
+ // are searching
+ // the file with the element in it
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+ }
+
+ public void testJavaReferencesSearchDOS2() throws CoreException, IOException {
+ int dos = 2;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ // results should be null since the scope would be null.
+ // There are no landmarks to search over
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, but have no references since the landmark
+ // is an element in a different project
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 0);
+
+ // results should be not null, but have no references since the
+ // interesting element
+ // is an element in the same project, but no references in it
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type11.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 1);
+
+ // results should be not null, but have no references
+ // This file type should never affect the scope
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, plugin1.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos);
+
+ // results should be not null, and we should get 1 result back
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+
+ // results should be null, since we have nothing to search
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, and we should get 1 result back
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNullInteresting(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+ }
+
+ public void testJavaReferencesSearchDOS3() throws Exception {
+ int dos = 3;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ // results should be null since the scope would be null.
+ // There are no landmarks to search over
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, but have no references since the landmark
+ // is an element in a different project
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 0);
+
+ // results should be not null, and have 1 reference since the project is
+ // the same
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNullInteresting(notifier, type11.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE, searchNode, dos, 2);
+
+ // results should be not null, and have 1 reference
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, plugin1.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+
+ // results should be not null, and we should get 1 result back
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+
+ // results should be null, since we have nothing to search
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, and we should get 1 result back
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNullInteresting(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+ }
+
+ public void testJavaReferencesSearchDOS4() throws Exception {
+ // TODO this is the same as 3, but there are some flags to search
+ // libraries...we should check this too
+
+ int dos = 4;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ // results should be null since the scope would be null.
+ // There are no landmarks to search over
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, but have no references since the landmark
+ // is an element in a different project
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 0);
+
+ // results should be not null, and have 1 reference since the project is
+ // the same
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNullInteresting(notifier, type11.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE, searchNode, dos, 2);
+
+ // results should be not null, and have 1 reference
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, plugin1.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+
+ // results should be not null, and we should get 1 result back
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+
+ // results should be null, since we have nothing to search
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, searchNode, dos);
+
+ // results should be not null, and we should get 1 result back
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNullInteresting(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 2);
+ }
+
+ public void testJavaReferencesSearchDOS5() throws IOException, CoreException {
+ int dos = 5;
+
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ // we should have 1 result since we are searching the entire workspace
+ helper.searchResultsNotNull(notifier, searchNode, dos, 2);
+
+ // we should have no results since there are no java references in the
+ // workspace
+ // NOTE: as of 3.2M3 there is a plugin.xml reference
+ searchNode = notifier.getElement(type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 1);
+ }
+
+ public List<?> search(int dos, IInteractionElement node) {
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ JavaReferencesProvider prov = new JavaReferencesProvider();
+
+ TestActiveSearchListener l = new TestActiveSearchListener(prov);
+ IActiveSearchOperation o = prov.getSearchOperation(node, IJavaSearchConstants.REFERENCES, dos);
+ if (o == null) {
+ return null;
+ }
+
+ SearchPluginTestHelper.search(o, l);
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaWriteAccessSearchPluginTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaWriteAccessSearchPluginTest.java
new file mode 100644
index 0000000..8f2d10b
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/JavaWriteAccessSearchPluginTest.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.java.ui.search.JavaWriteAccessProvider;
+
+public class JavaWriteAccessSearchPluginTest extends TestCase implements ISearchPluginTest {
+
+ public void testJavaWriteAccessSearchDOS1() {
+ // List<?> results = search(1);
+ }
+
+ //
+ // public void testJavaWriteAccessSearchDOS2(){
+ // List<?> results = search(2);
+ // }
+ //
+ // public void testJavaWriteAccessSearchDOS3(){
+ // List<?> results = search(3);
+ // }
+ //
+ // public void testJavaWriteAccessSearchDOS4(){
+ // List<?> results = search(4);
+ // }
+ //
+ // public void testJavaWriteAccessSearchDOS5(){
+ // List<?> results = search(5);
+ // }
+
+ public List<?> search(int dos, IInteractionElement node) {
+
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ JavaWriteAccessProvider prov = new JavaWriteAccessProvider();
+
+ TestActiveSearchListener l = new TestActiveSearchListener(prov);
+ IActiveSearchOperation o = prov.getSearchOperation(node, IJavaSearchConstants.WRITE_ACCESSES, dos);
+ SearchPluginTestHelper.search(o, l);
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/SearchPluginTestHelper.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/SearchPluginTestHelper.java
new file mode 100644
index 0000000..dc057eb
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/SearchPluginTestHelper.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+
+/**
+ * @author Shawn Minto
+ */
+public class SearchPluginTestHelper extends TestCase {
+
+ private final ISearchPluginTest test;
+
+ /**
+ * maximum time to wait for search results * 2. so 60 = 30sec - only sleeping 500ms at a time instead of 1 sec
+ */
+ private static final long MAXWAIT = 360;
+
+ public SearchPluginTestHelper(ISearchPluginTest test) {
+ this.test = test;
+ }
+
+ public void searchResultsNotNull(ActiveSearchNotifier notifier, String handle, String kind,
+ IInteractionElement searchNode, int dos, int expected) throws IOException, CoreException {
+ notifier.mockRaiseInterest(handle, kind);
+
+ List<?> results = test.search(dos, searchNode);
+ assertNotNull("Results Null", results);
+ assertEquals("Wrong number search results", expected, results.size());
+ notifier.clearContext();
+ }
+
+ public void searchResultsNotNullInteresting(ActiveSearchNotifier notifier, String handle, String kind,
+ IInteractionElement searchNode, int dos, int expected) throws IOException, CoreException {
+ notifier.mockEditorSelection(handle, kind);
+
+ List<?> results = test.search(dos, searchNode);
+ assertNotNull("Results Null", results);
+ assertEquals("Wrong number search results", expected, results.size());
+ notifier.clearContext();
+ }
+
+ public void searchResultsNotNull(ActiveSearchNotifier notifier, IInteractionElement searchNode, int dos,
+ int expected) throws IOException, CoreException {
+ List<?> results = test.search(dos, searchNode);
+ assertNotNull("Results Null", results);
+ assertEquals("Wrong number search results", expected, results.size());
+ notifier.clearContext();
+ }
+
+ public void searchResultsNull(ActiveSearchNotifier notifier, String handle, String kind,
+ IInteractionElement searchNode, int dos) throws IOException, CoreException {
+ notifier.mockRaiseInterest(handle, kind);
+
+ List<?> results = test.search(dos, searchNode);
+ assertNull("Results Not Null", results);
+ notifier.clearContext();
+ }
+
+ public void searchResultsNull(ActiveSearchNotifier notifier, IInteractionElement searchNode, int dos)
+ throws IOException, CoreException {
+ List<?> results = test.search(dos, searchNode);
+ assertNull("Results Not Null", results);
+ notifier.clearContext();
+ }
+
+ /**
+ * @return -1 if there was a prob, else the search time in seconds
+ */
+ public static long search(IActiveSearchOperation op, IActiveSearchListener listener) {
+ if (op == null) {
+ return -1;
+ }
+
+ op.addListener(listener);
+
+ long start = new Date().getTime();
+
+ op.run(new NullProgressMonitor());
+
+ for (int i = 0; i < MAXWAIT && !listener.resultsGathered(); i++) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ // don't need to do anything here
+ }
+ }
+
+ long time = (new Date().getTime() - start) / 1000;
+
+ if (!listener.resultsGathered()) {
+ return -1;
+ }
+ return time;
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/WorkspaceSetupHelper.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/WorkspaceSetupHelper.java
new file mode 100644
index 0000000..0fb942f
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/search/WorkspaceSetupHelper.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.search;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.tests.support.ResourceHelper;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.java.tests.TestJavaProject;
+
+public class WorkspaceSetupHelper {
+
+ private static final String HELPER_CONTEXT_ID = "helper-context";
+
+ private static boolean isSetup = false;
+
+ private static InteractionContext taskscape;
+
+ private static IJavaProject project1;
+
+ private static IJavaProject project2;
+
+ private static TestJavaProject jdtCoreDomProject;
+
+ private static IWorkspaceRoot workspaceRoot;
+
+ public static void clearWorkspace() throws CoreException, IOException {
+ isSetup = false;
+ ResourcesPlugin.getWorkspace().getRoot().delete(true, true, new NullProgressMonitor());
+ clearDoiModel();
+ }
+
+ public static IWorkspaceRoot setupWorkspace() throws CoreException, IOException, InvocationTargetException,
+ InterruptedException {
+ if (isSetup) {
+ clearDoiModel();
+ return workspaceRoot;
+ }
+ taskscape = new InteractionContext(HELPER_CONTEXT_ID, new InteractionContextScaling());
+
+ workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
+
+ project1 = ResourceHelper.createJavaPluginProjectFromZip("project1", "project1.zip");
+ project2 = ResourceHelper.createJavaPluginProjectFromZip("project2", "project2.zip");
+
+ jdtCoreDomProject = new TestJavaProject("workspace-helper-project");
+ IPackageFragment jdtCoreDomPkg = jdtCoreDomProject.createPackage("org.eclipse.jdt.core.dom");
+ IType astNodeType = jdtCoreDomProject.createType(jdtCoreDomPkg, "ASTNode.java", "public class ASTNode { }");
+ astNodeType.createMethod("public final void setSourceRange(int startPosition, int length) { }", null, false,
+ null);
+ isSetup = true;
+
+ project1.open(new NullProgressMonitor());
+ project2.open(new NullProgressMonitor());
+ jdtCoreDomProject.getJavaProject().open(new NullProgressMonitor());
+
+ return workspaceRoot;
+ }
+
+ public static void clearDoiModel() throws CoreException {
+ ContextCore.getContextManager().deleteContext(HELPER_CONTEXT_ID);
+ taskscape = new InteractionContext(HELPER_CONTEXT_ID, new InteractionContextScaling());
+ }
+
+ public static InteractionContext getContext() throws CoreException, IOException, InvocationTargetException,
+ InterruptedException {
+ if (!isSetup) {
+ setupWorkspace();
+ }
+ return taskscape;
+ }
+
+ public static IJavaProject getJdtCoreDomProject() throws CoreException, IOException, InvocationTargetException,
+ InterruptedException {
+ if (!isSetup) {
+ setupWorkspace();
+ }
+ return jdtCoreDomProject.getJavaProject();
+ }
+
+ public static IJavaProject getProject1() throws CoreException, IOException, InvocationTargetException,
+ InterruptedException {
+ if (!isSetup) {
+ setupWorkspace();
+ }
+ return project1;
+ }
+
+ public static IJavaProject getProject2() throws CoreException, IOException, InvocationTargetException,
+ InterruptedException {
+ if (!isSetup) {
+ setupWorkspace();
+ }
+ return project2;
+ }
+
+ public static IWorkspaceRoot getWorkspaceRoot() throws CoreException, IOException, InvocationTargetException,
+ InterruptedException {
+ if (!isSetup) {
+ setupWorkspace();
+ }
+ return workspaceRoot;
+ }
+
+ public static IFile getFile(IJavaProject jp, String name) throws JavaModelException {
+ if (jp == null || name == null) {
+ return null;
+ }
+ Object[] files = jp.getNonJavaResources();
+ for (Object o : files) {
+ if (o instanceof IFile && ((IFile) o).getName().equals(name)) {
+ return (IFile) o;
+ }
+ }
+ return null;
+ }
+
+ public static IType getType(IJavaProject jp, String fullyQualifiedName) throws JavaModelException {
+ if (jp == null || fullyQualifiedName == null) {
+ return null;
+ }
+ IType t = jp.findType(fullyQualifiedName);
+ return t;
+ }
+
+ public static IMethod getMethod(IType t, String methodName, String[] params) {
+ if (t == null || methodName == null || params == null) {
+ return null;
+ }
+ return t.getMethod(methodName, params);
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/ResultUpdaterTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/ResultUpdaterTest.java
new file mode 100644
index 0000000..0f548f6
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/ResultUpdaterTest.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.xml;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.ResourceHelper;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextRelation;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.pde.ui.XmlJavaRelationProvider;
+import org.eclipse.mylyn.java.tests.search.ActiveSearchNotifier;
+import org.eclipse.mylyn.java.tests.search.SearchPluginTestHelper;
+import org.eclipse.mylyn.java.tests.search.WorkspaceSetupHelper;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResultUpdaterTest extends TestCase implements ISearchPluginTest {
+ private IType type1;
+
+ private IFile plugin1;
+
+ private IJavaProject jp1;
+
+ private static final String SOURCE_ID = "XMLSearchResultUpdaterTest";
+
+ private SearchPluginTestHelper helper;
+
+ @Override
+ protected void setUp() throws Exception {
+ // TODO: clear the relationship providers?
+ WorkspaceSetupHelper.setupWorkspace();
+ jp1 = WorkspaceSetupHelper.getProject1();
+ type1 = WorkspaceSetupHelper.getType(jp1, "org.eclipse.mylar.tests.project1.views.SampleView");
+ plugin1 = WorkspaceSetupHelper.getFile(jp1, "plugin.xml");
+
+ InteractionContext t = WorkspaceSetupHelper.getContext();
+ ContextCore.getContextManager().activateContext(t.getHandleIdentifier());// ,
+ // t.getId());
+ helper = new SearchPluginTestHelper(this);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ WorkspaceSetupHelper.clearWorkspace();
+ WorkspaceSetupHelper.clearDoiModel();
+ }
+
+ public void testRemoveFile() throws Exception {
+
+ int dos = 4;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ //
+ // we should get all results since we are searching the entire workspace
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 3);
+ //
+ //
+
+ Collection<InteractionContextRelation> edges = searchNode.getRelations();
+ assertEquals(3, edges.size());
+
+ ResourceHelper.delete(plugin1);
+
+ Collection<InteractionContextRelation> edgesAfterRemove = searchNode.getRelations();
+ assertEquals(0, edgesAfterRemove.size());
+ }
+
+ public void testRemoveProject() throws Exception {
+ int dos = 4;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ //
+ // we should get all results since we are searching the entire workspace
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 3);
+ //
+ //
+
+ Collection<InteractionContextRelation> edges = searchNode.getRelations();
+ assertEquals(3, edges.size());
+
+ ResourceHelper.deleteProject(jp1.getProject().getName());
+
+ Collection<InteractionContextRelation> edgesAfterRemove = searchNode.getRelations();
+ assertEquals(0, edgesAfterRemove.size());
+ ;
+ }
+
+ public List<?> search(int dos, IInteractionElement node) throws IOException, CoreException {
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ XmlJavaRelationProvider prov = new XmlJavaRelationProvider();
+
+ IActiveSearchOperation o = prov.getSearchOperation(node, 0, dos);
+ if (o == null) {
+ return null;
+ }
+
+ XmlResultUpdaterSearchListener l = new XmlResultUpdaterSearchListener(prov, node, dos);
+ SearchPluginTestHelper.search(o, l);
+
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlResultUpdaterSearchListener.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlResultUpdaterSearchListener.java
new file mode 100644
index 0000000..fc90313
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlResultUpdaterSearchListener.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.xml;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.mylyn.internal.pde.ui.PdeStructureBridge;
+import org.eclipse.mylyn.internal.pde.ui.XmlJavaRelationProvider;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.search.internal.ui.text.FileSearchResult;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @author Mik Kersten
+ */
+public class XmlResultUpdaterSearchListener extends TestActiveSearchListener {
+
+ private List<IInteractionElement> results = null;
+
+ private final IInteractionElement node;
+
+ private final int degreeOfSeparation;
+
+ public XmlResultUpdaterSearchListener(AbstractRelationProvider prov, IInteractionElement searchNode,
+ int degreeOfSeparation) {
+ super(prov);
+ this.node = searchNode;
+ this.degreeOfSeparation = degreeOfSeparation;
+ }
+
+ private boolean gathered = false;
+
+ @Override
+ public void searchCompleted(List<?> l) {
+ results = new ArrayList<IInteractionElement>();
+
+ if (l.isEmpty()) {
+ return;
+ }
+
+ Map<String, String> nodes = new HashMap<String, String>();
+
+ if (l.get(0) instanceof FileSearchResult) {
+ FileSearchResult fsr = (FileSearchResult) l.get(0);
+
+ Object[] far = fsr.getElements();
+ for (Object element : far) {
+ Match[] mar = fsr.getMatches(element);
+
+ if (element instanceof File) {
+ File f = (File) element;
+
+ // change the file into a document
+ FileEditorInput fei = new FileEditorInput(f);
+
+ for (Match m : mar) {
+ try {
+ XmlNodeHelper xnode = new XmlNodeHelper(fei.getFile().getFullPath().toString(),
+ m.getOffset());
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(f.getName());
+ String handle = xnode.getHandle();
+ Object o = bridge.getObjectForHandle(handle);
+ String name = bridge.getLabel(o);
+ if (o != null) {
+ nodes.put(handle, name);
+ results.add(node);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ for (String handle : nodes.keySet()) {
+ incrementInterest(node, PdeStructureBridge.CONTENT_TYPE, handle, degreeOfSeparation);
+ }
+ gathered = true;
+ }
+
+ protected void incrementInterest(IInteractionElement node, String elementKind, String elementHandle,
+ int degreeOfSeparation) {
+ int predictedInterest = 1;// (7-degreeOfSeparation) *
+ // TaskscapeManager.getScalingFactors().getDegreeOfSeparationScale();
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.PREDICTION, elementKind, elementHandle,
+ XmlJavaRelationProvider.SOURCE_ID, XmlJavaRelationProvider.SOURCE_ID, null, predictedInterest);
+ ContextCore.getContextManager().processInteractionEvent(event);
+
+ }
+
+ @Override
+ public boolean resultsGathered() {
+ return gathered;
+ }
+
+ @Override
+ public List<?> getResults() {
+ return results;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlSearchPluginTest.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlSearchPluginTest.java
new file mode 100644
index 0000000..3c8883a
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlSearchPluginTest.java
@@ -0,0 +1,334 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.xml;
+
+import java.io.IOException;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.search.ISearchPluginTest;
+import org.eclipse.mylyn.internal.context.core.CompositeInteractionContext;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.pde.ui.PdeStructureBridge;
+import org.eclipse.mylyn.internal.pde.ui.XmlJavaRelationProvider;
+import org.eclipse.mylyn.internal.resources.ui.ResourceStructureBridge;
+import org.eclipse.mylyn.java.tests.search.ActiveSearchNotifier;
+import org.eclipse.mylyn.java.tests.search.SearchPluginTestHelper;
+import org.eclipse.mylyn.java.tests.search.WorkspaceSetupHelper;
+
+/**
+ * TEST CASES TO HANDLE 1. all dos - with and without results TODO - in both the plugin.xml and the build.xml 2.
+ * different type of xml file with and without reference - shouldn't have result
+ *
+ * DEGREE OF SEPARATIONS 1 xml landmark files 2 projects of any landmark 3 workspace 4 workspace 5 NONE
+ *
+ * @author Shawn Minto
+ */
+public class XmlSearchPluginTest extends TestCase implements ISearchPluginTest {
+
+ private IType type1;
+
+ private IType type2;
+
+ private IFile plugin1;
+
+ private IFile plugin2;
+
+ private IFile tocRefs;
+
+ private IFile tocNoRefs;
+
+ private IJavaProject jp1;
+
+ private IJavaProject jp2;
+
+ private static final String SOURCE_ID = "XMLSearchTest";
+
+ private SearchPluginTestHelper helper;
+
+ @Override
+ protected void setUp() throws Exception {
+ // TODO: clear the relationship providers?
+ WorkspaceSetupHelper.setupWorkspace();
+ jp1 = WorkspaceSetupHelper.getProject1();
+ jp2 = WorkspaceSetupHelper.getProject2();
+ type1 = WorkspaceSetupHelper.getType(jp1, "org.eclipse.mylar.tests.project1.views.SampleView");
+ type2 = WorkspaceSetupHelper.getType(jp2,
+ "org.eclipse.mylar.tests.project2.builder.SampleBuilder.SampleResourceVisitor");
+ plugin1 = WorkspaceSetupHelper.getFile(jp1, "plugin.xml");
+ tocRefs = WorkspaceSetupHelper.getFile(jp1, "toc-refs.xml");
+ tocNoRefs = WorkspaceSetupHelper.getFile(jp1, "toc-no-refs.xml");
+ plugin2 = WorkspaceSetupHelper.getFile(jp2, "plugin.xml");
+
+ InteractionContext t = WorkspaceSetupHelper.getContext();
+ ContextCore.getContextManager().activateContext(t.getHandleIdentifier());
+ helper = new SearchPluginTestHelper(this);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ WorkspaceSetupHelper.clearDoiModel();
+ ContextCore.getContextManager().deactivateContext(WorkspaceSetupHelper.getContext().getHandleIdentifier());
+ assertFalse(ContextCore.getContextManager().isContextActive());
+ }
+
+ public void testXMLSearchDOS1() throws IOException, CoreException {
+
+ int dos = 1;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ //
+ // results should be null since the scope would be null.
+ // There are no landmarks to search over
+ helper.searchResultsNull(notifier, searchNode, dos);
+ //
+ //
+
+ //
+ // add an element to the taskscape, results should still be null
+ // There is a landmark, but not one that is an xml file that we care
+ // about
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, type1.getHandleIdentifier(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos);
+
+ //
+ //
+
+ //
+ // add an element to the taskscape, results should still be null
+ // There is a landmark that has references in it, but not one that is an
+ // xml file that we care about
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, tocRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos);
+ //
+ //
+
+ //
+ // add an element to the taskscape, results should still be null
+ // There is a landmark, but not one that is an xml file that we care
+ // about
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNull(notifier, tocNoRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos);
+ //
+ //
+
+ //
+ // add the plugin.xml from a different project to the taskscape, should
+ // have non null results, but 0 size
+ // There is a lanmark that can be added to create a scope with the
+ // proper xml file type
+ // but it is in the wrong project and shouldn't have any references
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, plugin2.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 0);
+ //
+ //
+
+ //
+ // add the plugin.xml to the taskscape, should have results now
+ // We should get the results now since we have the proper xml file as
+ // the landmark now
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, plugin1.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 3);
+ //
+ //
+ }
+
+ public void testXMLSearchDOS2() throws IOException, CoreException {
+
+ int dos = 2;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+// // results should be null since the scope would be null.
+// // There are no landmarks and therefore no projects to search over
+// searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+// helper.searchResultsNull(notifier, searchNode, dos);
+//
+// // add an element to the taskscape, results should not be null
+// // There is a landmark with references in it, but not one that is an xml
+// // file that we care about
+// // therefore, we still only get 3 references - landmark is in the same
+// // project
+// searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+// helper.searchResultsNotNull(notifier, tocRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+// searchNode, dos, 3);
+//
+// // add an element to the taskscape, results should not be null, but only
+// // 3
+// // There is a landmark, but not one that is an xml file that we care
+// // about - landmark is in the same project
+// searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+// helper.searchResultsNotNull(notifier, tocNoRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+// searchNode, dos, 3);
+//
+// // add the plugin.xml from a different project to the taskscape, should
+// // have non null results, but 0 size
+// searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+// helper.searchResultsNotNull(notifier, plugin2.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+// searchNode, dos, 0);
+//
+// // add java element from the same project, should get result since we
+// // are looking at the projects
+// searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+// helper.searchResultsNotNull(notifier, type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+// searchNode, dos, 3);
+
+ // add a java element from a different project, should get non null
+ // result, but 0 size
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 0);
+
+ // add the plugin.xml from the same project to the taskscape, should
+ // have results
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, plugin1.getFullPath().toString(), PdeStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 3);
+ }
+
+ public void testXMLSearchDOS3() throws IOException, CoreException {
+
+ int dos = 3;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ //
+ // add an element to the taskscape, results should not be null
+ // There is a landmark with references in it, but not one that is an xml
+ // file that we care about
+ // therefore, we still only get 3 references
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, tocRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 3);
+ //
+ //
+
+ //
+ // add an element to the taskscape, results should still be null
+ // There is a landmark, but not one that is an xml file that we care
+ // about
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, tocNoRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 3);
+ //
+ //
+
+ //
+ // we should get all results since we are searching the entire workspace
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 3);
+ //
+ //
+
+ //
+ // we should get 0 results since there should be no references to the
+ // type we are looking at
+ searchNode = notifier.getElement(type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 0);
+ //
+ //
+ }
+
+ public void testXMLSearchDOS4() throws IOException, CoreException {
+ // right now, dos 3 and 4 are exactly the same, workspace scope
+
+ int dos = 4;
+
+ CompositeInteractionContext t = (CompositeInteractionContext) ContextCore.getContextManager()
+ .getActiveContext();
+ ActiveSearchNotifier notifier = new ActiveSearchNotifier(t, SOURCE_ID);
+ IInteractionElement searchNode = notifier.getElement(type1.getHandleIdentifier(),
+ JavaStructureBridge.CONTENT_TYPE);
+
+ //
+ // add an element to the taskscape, results should not be null
+ // There is a landmark with references in it, but not one that is an xml
+ // file that we care about
+ // therefore, we still only get 3 references
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, tocRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 3);
+ //
+ //
+
+ //
+ // add an element to the taskscape, results should still be null
+ // There is a landmark, but not one that is an xml file that we care
+ // about
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, tocNoRefs.getFullPath().toString(), ResourceStructureBridge.CONTENT_TYPE,
+ searchNode, dos, 3);
+ //
+ //
+
+ //
+ // we should get all results since we are searching the entire workspace
+ searchNode = notifier.getElement(type1.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 3);
+ //
+ //
+
+ //
+ // we should get 0 results since there should be no references to the
+ // type we are looking at
+ searchNode = notifier.getElement(type2.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE);
+ helper.searchResultsNotNull(notifier, searchNode, dos, 0);
+ //
+ //
+ }
+
+ public List<?> search(int dos, IInteractionElement node) throws IOException, CoreException {
+ if (node == null) {
+ return null;
+ }
+
+ // test with each of the sepatations
+ XmlJavaRelationProvider prov = new XmlJavaRelationProvider();
+
+ IActiveSearchOperation o = prov.getSearchOperation(node, 0, dos);
+ if (o == null) {
+ return null;
+ }
+
+ XmlTestActiveSearchListener l = new XmlTestActiveSearchListener(prov);
+ SearchPluginTestHelper.search(o, l);
+
+ return l.getResults();
+ }
+}
diff --git a/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlTestActiveSearchListener.java b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlTestActiveSearchListener.java
new file mode 100644
index 0000000..8c1f2b7
--- /dev/null
+++ b/org.eclipse.mylyn.java.tests/src/org/eclipse/mylyn/java/tests/xml/XmlTestActiveSearchListener.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.tests.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.search.internal.ui.text.FileSearchResult;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Shawn Minto
+ */
+public class XmlTestActiveSearchListener extends TestActiveSearchListener {
+
+ private List<?> results = null;
+
+ public XmlTestActiveSearchListener(AbstractRelationProvider prov) {
+ super(prov);
+ }
+
+ private boolean gathered = false;
+
+ @Override
+ public void searchCompleted(List<?> l) {
+
+ results = l;
+
+ // deal with File
+ if (l.isEmpty()) {
+ gathered = true;
+ return;
+ }
+
+ if (l.get(0) instanceof FileSearchResult) {
+ FileSearchResult fsr = (FileSearchResult) l.get(0);
+ List<Object> nodes = new ArrayList<Object>();
+ Object[] far = fsr.getElements();
+ for (Object element : far) {
+ Match[] mar = fsr.getMatches(element);
+
+ if (element instanceof File) {
+ File f = (File) element;
+
+ for (Match m : mar) {
+ try {
+
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(f.getName());
+
+ String handle = bridge.getHandleForOffsetInObject(f, m.getOffset());
+
+ XmlNodeHelper node = new XmlNodeHelper(handle);
+ nodes.add(node);
+ } catch (Exception e) {
+ e.printStackTrace();
+ // don't care
+ }
+ }
+ }
+ }
+ results = nodes;
+ }
+ gathered = true;
+ }
+
+ @Override
+ public boolean resultsGathered() {
+ return gathered;
+ }
+
+ @Override
+ public List<?> getResults() {
+ return results;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/.classpath b/org.eclipse.mylyn.java.ui/.classpath
new file mode 100644
index 0000000..b692d67
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.classpath
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/resources/Marker"/>
+ <accessrule kind="accessible" pattern="org/eclipse/debug/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/jdt/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/search/internal/ui/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/search2/internal/ui/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/views/markers/internal/ConcreteMarker"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.java.ui/.cvsignore b/org.eclipse.mylyn.java.ui/.cvsignore
new file mode 100644
index 0000000..4a98758
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.fbwarnings
diff --git a/org.eclipse.mylyn.java.ui/.project b/org.eclipse.mylyn.java.ui/.project
new file mode 100644
index 0000000..8de69d8
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.java.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/12/48/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/48/refactorings.history
new file mode 100644
index 0000000..fdeef07
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/48/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylar.java' - Destination element: 'eview16' - Original element: 'active-hierarchy.gif'" description="Copy file" destination="icons/eview16" element1="icons/eview16/active-hierarchy.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/active-hierarchy.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1164992604000" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/12/48/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/48/refactorings.index
new file mode 100644
index 0000000..230270a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/48/refactorings.index
@@ -0,0 +1 @@
+1164992604000 Copy file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..d447cd1
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.ui.actions.ApplyMylarToPackageExplorerAction' to 'FocusPackageExplorerAction' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.actions.ApplyMylarToPackageExplorerAction' - Renamed element: 'org.eclipse.mylar.internal.java.ui.actions.FocusPackageExplorerAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToPackageExplorerAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui.actions{ApplyMylarToPackageExplorerAction.java[ApplyMylarToPackageExplorerAction" matchStrategy="1" name="FocusPackageExplorerAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277351126" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.ui.actions.ApplyMylarToBrowsingPerspectiveAction' to 'FocusBrowsingPerspectiveAction' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.actions.ApplyMylarToBrowsingPerspectiveAction' - Renamed element: 'org.eclipse.mylar.internal.java.ui.actions.FocusBrowsingPerspectiveAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToBrowsingPerspectiveAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui.actions{ApplyMylarToBrowsingPerspectiveAction.java[ApplyMylarToBrowsingPerspectiveAction" matchStrategy="1" name="FocusBrowsingPerspectiveAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277401439" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.ui.actions.ApplyMylarToDebugView' to 'FocusDebugViewAction' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.actions.ApplyMylarToDebugView' - Renamed element: 'org.eclipse.mylar.internal.java.ui.actions.FocusDebugViewAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ApplyMylarToDebugView'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui.actions{ApplyMylarToDebugView.java[ApplyMylarToDebugView" matchStrategy="1" name="FocusDebugViewAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165277416345" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylar.java' - Destination element: 'src-old' - Original element: 'org.eclipse.mylar.internal.java.PackageExplorerManager.java'" description="Copy compilation unit" destination="developer/src-old" element1="/src<org.eclipse.mylar.internal.java{PackageExplorerManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/java/PackageExplorerManager.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1165283012423" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.java' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.PackageExplorerManager.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.java{PackageExplorerManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165283016579" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..9744f80
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,5 @@
+1165277351126 Rename type 'ApplyMylarToPackageExplorerAction'
+1165277401439 Rename type 'ApplyMylarToBrowsingPerspectiveAction'
+1165277416345 Rename type 'ApplyMylarToDebugView'
+1165283012423 Copy compilation unit
+1165283016579 Delete element
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/12/51/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/51/refactorings.history
new file mode 100644
index 0000000..b3e8704
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/51/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.ide/src/org.eclipse.mylar.internal.ide.xml' - Original project: 'org.eclipse.mylar.java' - Destination element: 'org.eclipse.mylar.ide/src/org.eclipse.mylar.internal.ide.xml' - Original element: 'org.eclipse.mylar.internal.java.search.XmlJavaReferencesProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.ide.xml" element1="/src<org.eclipse.mylar.internal.java.search{XmlJavaReferencesProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1166667469125" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/12/51/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/51/refactorings.index
new file mode 100644
index 0000000..a05cc49
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/12/51/refactorings.index
@@ -0,0 +1 @@
+1166667469125 Move compilation unit
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..e64d777
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Extract local variable 'mylarContentAssist' from expression 'preferencePage.isMylarContentAssistDefault()'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="=org.eclipse.mylar.java/src<org.eclipse.mylar.internal.java.ui.wizards{MylarPreferenceWizard.java" name="mylarContentAssist" project="org.eclipse.mylar.java" replace="true" selection="3737 44" stamp="1140545051967"/>
+<refactoring comment="" comments="false" description="Extract method 'private void installContentAssist(boolean mylarContentAssist)' from 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizard.setPreferences()' to 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizard'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="=org.eclipse.mylar.java/src<org.eclipse.mylar.internal.java.ui.wizards{MylarPreferenceWizard.java" name="installContentAssist" project="org.eclipse.mylar.java" replace="false" selection="3411 901" stamp="1140545126073" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizard.installContentAssist(...) to {1}" element1="=org.eclipse.mylar.java/src<org.eclipse.mylar.internal.java.ui.wizards{MylarPreferenceWizard.java[MylarPreferenceWizard~installContentAssist~QIPreferenceStore;~Z" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.java/src<org.eclipse.mylar.internal.java.ui{JavaUiUtil.java[JavaUiUtil" project="org.eclipse.mylar.java" stamp="1140545221621"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..1db8a3d
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1,3 @@
+1140545051967 Extract local variable 'mylarContentAssist' from expression 'preferencePage.isMylarContentAssistDefault()'
+1140545126073 Extract method 'private void installContentAssist(boolean mylarContentAssist)' from 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizard.setPreferences()' to 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizard'
+1140545221621 Move org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizard.installContentAssist(...) to {1}
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/4/16/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/4/16/refactorings.history
new file mode 100644
index 0000000..32fc97f
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/4/16/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Rename type 'org.eclipse.mylar.internal.java.PackageExplorerExpansionManager' to 'PackageExplorerManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java{PackageExplorerExpansionManager.java[PackageExplorerExpansionManager" matchStrategy="1" name="PackageExplorerManager" qualified="false" references="true" similarDeclarations="true" stamp="1145414074099" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.java.MylarJavaPrefConstants.AUTO_FOLDING_ENABLED' to 'ACTIVE_FOLDING_ENABLED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.java{MylarJavaPrefConstants.java[MylarJavaPrefConstants^AUTO_FOLDING_ENABLED" name="ACTIVE_FOLDING_ENABLED" references="true" setter="false" stamp="1145494140224" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.java.ui.MembersFilter' to 'JavaDeclarationsMembersFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui{MembersFilter.java[MembersFilter" matchStrategy="1" name="JavaDeclarationsMembersFilter" qualified="false" references="true" similarDeclarations="true" stamp="1145500356032" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.java.ui.JavaDeclarationsMembersFilter' to 'JavaDeclarationsFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui{JavaDeclarationsMembersFilter.java[JavaDeclarationsMembersFilter" matchStrategy="1" name="JavaDeclarationsFilter" qualified="false" references="true" similarDeclarations="true" stamp="1145500362431" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/4/16/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/4/16/refactorings.index
new file mode 100644
index 0000000..bcf1123
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/4/16/refactorings.index
@@ -0,0 +1,4 @@
+1145414074099 Rename type 'org.eclipse.mylar.internal.java.PackageExplorerExpansionManager' to 'PackageExplorerManager'
+1145500362431 Rename type 'org.eclipse.mylar.internal.java.ui.JavaDeclarationsMembersFilter' to 'JavaDeclarationsFilter'
+1145500356032 Rename type 'org.eclipse.mylar.internal.java.ui.MembersFilter' to 'JavaDeclarationsMembersFilter'
+1145494140224 Rename field 'org.eclipse.mylar.internal.java.MylarJavaPrefConstants.AUTO_FOLDING_ENABLED' to 'ACTIVE_FOLDING_ENABLED'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/5/19/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/19/refactorings.history
new file mode 100644
index 0000000..d7df894
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/19/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'DEFAULT_EDITOR' in 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage' to 'CONTENT_ASSIST' - Original element: 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage.DEFAULT_EDITOR' - Renamed element: 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage.CONTENT_ASSIST' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'DEFAULT_EDITOR'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.java.ui.wizards{MylarPreferenceWizardPage.java[MylarPreferenceWizardPage^DEFAULT_EDITOR" name="CONTENT_ASSIST" references="true" setter="false" stamp="1147197528883" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/5/19/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/19/refactorings.index
new file mode 100644
index 0000000..d9e8b5a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/19/refactorings.index
@@ -0,0 +1 @@
+1147197528883 Rename field 'DEFAULT_EDITOR'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..ad7fa3c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage.DESCRIPTION' from expression '"Configures Mylar preferences to the recommended defaults. To alter these go" + "to re-invoke this wizard via the \"New\" menu."' - Constant name: 'DESCRIPTION' - Constant expression: '"Configures Mylar preferences to the recommended defaults. To alter these go" + "to re-invoke this wizard via the \"New\" menu."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DESCRIPTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.java.ui.wizards{MylarPreferenceWizardPage.java" name="DESCRIPTION" qualify="false" replace="true" selection="2605 133" stamp="1147748265580" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..ce6aa9a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1 @@
+1147748265580 Extract constant 'DESCRIPTION'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/6/26/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/6/26/refactorings.history
new file mode 100644
index 0000000..2b204e2
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'workingSet' in 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage' to 'createWorkingSet' - Original element: 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage.workingSet' - Renamed element: 'org.eclipse.mylar.internal.java.ui.wizards.MylarPreferenceWizardPage.createWorkingSet' - Update references to refactored element - Update textual occurrences in comments and strings - Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'workingSet'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.java.ui.wizards{MylarPreferenceWizardPage.java[MylarPreferenceWizardPage^workingSet" name="createWorkingSet" references="true" setter="false" stamp="1151608641359" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/6/26/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/6/26/refactorings.index
new file mode 100644
index 0000000..399d1e5
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/6/26/refactorings.index
@@ -0,0 +1 @@
+1151608641359 Rename field 'workingSet'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..534da81
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.ui.actions.FindReferencesInTaskscapeAction' to 'FindReferencesInContextAction' - Original element: 'org.eclipse.mylar.internal.java.ui.actions.FindReferencesInTaskscapeAction' - Renamed element: 'org.eclipse.mylar.internal.java.ui.actions.FindReferencesInContextAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'FindReferencesInTaskscapeAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui.actions{FindReferencesInTaskscapeAction.java[FindReferencesInTaskscapeAction" matchStrategy="1" name="FindReferencesInContextAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152748713000" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..20a3362
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1 @@
+1152748713000 Rename type 'FindReferencesInTaskscapeAction'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..8b0ab75
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.java.MylarJavaPlugin.setPreferenceDefaults()' to 'initDefaultPrefs' - Original element: 'org.eclipse.mylar.internal.java.MylarJavaPlugin.setPreferenceDefaults()' - Renamed element: 'org.eclipse.mylar.internal.java.MylarJavaPlugin.initDefaultPrefs()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setPreferenceDefaults'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.java{MylarJavaPlugin.java[MylarJavaPlugin~setPreferenceDefaults" name="initDefaultPrefs" references="true" stamp="1153121256578" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..1ade092
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1 @@
+1153121256578 Rename method 'setPreferenceDefaults'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..5f166fc
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.java.ui.JavaContextLabelProvider.LABEL_ELEMENT_MISSING' from expression '"<missing element>"' - Constant name: 'LABEL_ELEMENT_MISSING' - Constant expression: '"<missing element>"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_ELEMENT_MISSING'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.java.ui{JavaContextLabelProvider.java" name="LABEL_ELEMENT_MISSING" qualify="false" replace="true" selection="2881 19" stamp="1154208056734" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..ed6a0d8
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1 @@
+1154208056734 Extract constant 'LABEL_ELEMENT_MISSING'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/31/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/31/refactorings.history
new file mode 100644
index 0000000..487a831
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/31/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.JavaProblemListener' to 'InterestInducingProblemListener' - Original element: 'org.eclipse.mylar.internal.java.JavaProblemListener' - Renamed element: 'org.eclipse.mylar.internal.java.InterestInducingProblemListener' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'JavaProblemListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java{JavaProblemListener.java[JavaProblemListener" matchStrategy="1" name="InterestInducingProblemListener" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154222652957" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/7/31/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/31/refactorings.index
new file mode 100644
index 0000000..8eb3255
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/7/31/refactorings.index
@@ -0,0 +1 @@
+1154222652957 Rename type 'JavaProblemListener'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..196ed6d
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.ui.preferences.MylarJavaPreferencePage' to 'MylarSandboxPreferencePage' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.preferences.MylarJavaPreferencePage' - Renamed element: 'org.eclipse.mylar.internal.java.ui.preferences.MylarSandboxPreferencePage' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJavaPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui.preferences{MylarJavaPreferencePage.java[MylarJavaPreferencePage" matchStrategy="1" name="MylarSandboxPreferencePage" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1158729221202" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.sandbox/src/org.eclipse.mylar.internal.sandbox' - Original project: 'org.eclipse.mylar.java' - Destination element: 'org.eclipse.mylar.sandbox/src/org.eclipse.mylar.internal.sandbox' - Original element: 'org.eclipse.mylar.internal.java.ui.preferences.MylarSandboxPreferencePage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.sandbox" element1="/src<org.eclipse.mylar.internal.java.ui.preferences{MylarSandboxPreferencePage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1158729251826" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.java' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.java/src/org.eclipse.mylar.internal.java.ui.preferences'" description="Delete element" element1="/src<org.eclipse.mylar.internal.java.ui.preferences" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1158729754799" subPackages="false" version="1.0"/>
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.internal.java.ui.junit.AbstractMylarLaunchConfiguration' from 'org.eclipse.mylar.internal.java.ui.junit.MylarJUnitLaunchConfiguration' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.junit.MylarJUnitLaunchConfiguration' - Sub types: org.eclipse.mylar.internal.java.ui.junit.MylarJUnitLaunchConfiguration - Extracted class: 'org.eclipse.mylar.internal.java.ui.junit.AbstractMylarLaunchConfiguration' - Extracted members: org.eclipse.mylar.internal.java.ui.junit.MylarJUnitLaunchConfiguration.customFindTestTypes(...) org.eclipse.mylar.internal.java.ui.junit.MylarJUnitLaunchConfiguration.launch(...) org.eclipse.mylar.internal.java.ui.junit.MylarJUnitLaunchConfiguration.launchTypes(...) - Use super type where possible" delete="3" description="Extract superclass 'AbstractMylarLaunchConfiguration'" element1="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration~customFindTestTypes~QILaunchConfiguration;~QIProgressMonitor;" element2="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration~launch~QILaunchConfiguration;~QString;~QILaunch;~QIProgressMonitor;" element3="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration~launchTypes~QILaunchConfiguration;~QString;~QTestSearchResult;~I" element4="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration~customFindTestTypes~QILaunchConfiguration;~QIProgressMonitor;" element5="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration~launch~QILaunchConfiguration;~QString;~QILaunch;~QIProgressMonitor;" element6="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration~launchTypes~QILaunchConfiguration;~QString;~QTestSearchResult;~I" element7="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration" extract="3" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration" instanceof="false" name="AbstractMylarLaunchConfiguration" replace="true" stamp="1158970950302" stubs="true" types="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.java' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.junit.AbstractMylarLaunchConfiguration.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.java.ui.junit{AbstractMylarLaunchConfiguration.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1158971077995" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..411447b
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1,5 @@
+1158729221202 Rename type 'MylarJavaPreferencePage'
+1158729251826 Move compilation unit
+1158729754799 Delete element
+1158970950302 Extract superclass 'AbstractMylarLaunchConfiguration'
+1158971077995 Delete element
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..ad00138
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 3 element(s) from project 'org.eclipse.mylar.java' - Original project: 'org.eclipse.mylar.java' - Original elements: MylarContextTestUtil.java.rej MylarJUnitLaunchConfiguration.java.rej MylarPdeJUnitLaunchConfiguration.java.rej" description="Delete elements" element1="src/org/eclipse/mylar/internal/java/ui/junit/MylarPdeJUnitLaunchConfiguration.java.rej" element2="src/org/eclipse/mylar/internal/java/ui/junit/MylarContextTestUtil.java.rej" element3="src/org/eclipse/mylar/internal/java/ui/junit/MylarJUnitLaunchConfiguration.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="3" stamp="1169253645397" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..ece241d
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1 @@
+1169253645397 Delete elements
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/10/44/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/10/44/refactorings.history
new file mode 100644
index 0000000..1143e50
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/10/44/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.actions'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.actions'
- Original element: 'org.eclipse.mylyn.java.ui.BrowseFilteredAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.java.ui.actions" element1="/src<org.eclipse.mylyn.java.ui{BrowseFilteredAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1193861399280" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.actions.BrowseFilteredAction' to 'ShowFilteredChildrenAction'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.actions.BrowseFilteredAction'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.actions.ShowFilteredChildrenAction'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'BrowseFilteredAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.actions{BrowseFilteredAction.java[BrowseFilteredAction" matchStrategy="1" name="ShowFilteredChildrenAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1193861437590" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/10/44/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/10/44/refactorings.index
new file mode 100644
index 0000000..0f378cb
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/10/44/refactorings.index
@@ -0,0 +1,2 @@
+1193861399280 Move compilation unit
+1193861437590 Rename type 'BrowseFilteredAction'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..464644c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.java.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original elements:
 org.eclipse.mylyn.internal.java.ui.JavaEditingMonitor.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.java.ui{JavaEditingMonitor.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1198036673333" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..90e466d
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1 @@
+1198036673333 Infer generic type arguments
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/4/15/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/4/15/refactorings.history
new file mode 100644
index 0000000..a87ebcb
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.ide/src/org.eclipse.mylar.internal.ide.xml.pde' - Original project: 'org.eclipse.mylar.java' - Destination element: 'org.eclipse.mylar.ide/src/org.eclipse.mylar.internal.ide.xml.pde' - Original element: 'org.eclipse.mylar.internal.java.search.PdeContextLabelProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.ide.xml.pde" element1="/src<org.eclipse.mylar.internal.java.search{PdeContextLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1176149379787" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/4/15/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/4/15/refactorings.index
new file mode 100644
index 0000000..f417019
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/4/15/refactorings.index
@@ -0,0 +1 @@
+1176149379787 Move compilation unit
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..d53e675
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.java.ui.junit.MylarContextTestUtil' to 'InteractionContextTestUtil' - Original project: 'org.eclipse.mylar.java' - Original element: 'org.eclipse.mylar.internal.java.ui.junit.MylarContextTestUtil' - Renamed element: 'org.eclipse.mylar.internal.java.ui.junit.InteractionContextTestUtil' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarContextTestUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.java.ui.junit{MylarContextTestUtil.java[MylarContextTestUtil" matchStrategy="1" name="InteractionContextTestUtil" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1180148655000" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..1e9b7e0
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1 @@
+1180148655000 Rename type 'MylarContextTestUtil'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..e10c255
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.editor.MylarCompilationUnitEditor' to 'FocusedCompilationUnitEditor' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.editor.MylarCompilationUnitEditor' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedCompilationUnitEditor' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarCompilationUnitEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.editor{MylarCompilationUnitEditor.java[MylarCompilationUnitEditor" matchStrategy="1" name="FocusedCompilationUnitEditor" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268246149" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaNoTypeProposalComputer' to 'FocusedJavaNoTypeProposalComputer' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaNoTypeProposalComputer' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaNoTypeProposalComputer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJavaNoTypeProposalComputer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.editor{MylarJavaNoTypeProposalComputer.java[MylarJavaNoTypeProposalComputer" matchStrategy="1" name="FocusedJavaNoTypeProposalComputer" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268300051" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.MylarJavaPlugin' to 'FocusedJavaPlugin' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.MylarJavaPlugin' - Renamed element: 'org.eclipse.mylyn.internal.java.FocusedJavaPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJavaPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java{MylarJavaPlugin.java[MylarJavaPlugin" matchStrategy="1" name="FocusedJavaPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268411156" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.MylarJavaPrefConstants.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.java{MylarJavaPrefConstants.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181268465307" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaProposalProcessor' to 'FocusedJavaProposalProcessor' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaProposalProcessor' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJavaProposalProcessor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.editor{MylarJavaProposalProcessor.java[MylarJavaProposalProcessor" matchStrategy="1" name="FocusedJavaProposalProcessor" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268645912" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaSourceViewerConfiguration' to 'FocusedJavaSourceViewerConfiguration' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaSourceViewerConfiguration' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaSourceViewerConfiguration' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJavaSourceViewerConfiguration'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.editor{MylarJavaSourceViewerConfiguration.java[MylarJavaSourceViewerConfiguration" matchStrategy="1" name="FocusedJavaSourceViewerConfiguration" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268658692" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaTypeProposalComputer' to 'FocusedJavaTypeProposalComputer' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.editor.MylarJavaTypeProposalComputer' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaTypeProposalComputer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJavaTypeProposalComputer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.editor{MylarJavaTypeProposalComputer.java[MylarJavaTypeProposalComputer" matchStrategy="1" name="FocusedJavaTypeProposalComputer" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268668028" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.junit.MylarPdeJUnitLaunchConfiguration' to 'TaskContextPdeJUnitLaunchConfiguration' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.junit.MylarPdeJUnitLaunchConfiguration' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.junit.TaskContextPdeJUnitLaunchConfiguration' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPdeJUnitLaunchConfiguration'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.junit{MylarPdeJUnitLaunchConfiguration.java[MylarPdeJUnitLaunchConfiguration" matchStrategy="1" name="TaskContextPdeJUnitLaunchConfiguration" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268699256" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.junit.MylarJUnitTabGroup' to 'TaskContextJUnitTabGroup' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.junit.MylarJUnitTabGroup' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitTabGroup' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJUnitTabGroup'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.junit{MylarJUnitTabGroup.java[MylarJUnitTabGroup" matchStrategy="1" name="TaskContextJUnitTabGroup" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268706685" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.junit.MylarPdeJUnitTabGroup' to 'TaskContextPdeJUnitTabGroup' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.junit.MylarPdeJUnitTabGroup' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.junit.TaskContextPdeJUnitTabGroup' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPdeJUnitTabGroup'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.junit{MylarPdeJUnitTabGroup.java[MylarPdeJUnitTabGroup" matchStrategy="1" name="TaskContextPdeJUnitTabGroup" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268715526" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.junit.MylarJUnitLaunchConfiguration' to 'TaskContextJUnitLaunchConfiguration' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.junit.MylarJUnitLaunchConfiguration' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitLaunchConfiguration' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJUnitLaunchConfiguration'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.junit{MylarJUnitLaunchConfiguration.java[MylarJUnitLaunchConfiguration" matchStrategy="1" name="TaskContextJUnitLaunchConfiguration" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268725278" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.junit.MylarJUnitMainTab' to 'TaskContextJUnitMainTab' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.junit.MylarJUnitMainTab' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitMainTab' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarJUnitMainTab'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.junit{MylarJUnitMainTab.java[MylarJUnitMainTab" matchStrategy="1" name="TaskContextJUnitMainTab" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268734675" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.views.MylarPerspectiveFactory.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.java.ui.views{MylarPerspectiveFactory.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181268789658" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.wizards.MylarPreferenceWizard' to 'RecommendedPreferencesWizard' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.wizards.MylarPreferenceWizard' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizard' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPreferenceWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.wizards{MylarPreferenceWizard.java[MylarPreferenceWizard" matchStrategy="1" name="RecommendedPreferencesWizard" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268821119" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.wizards.MylarPreferenceWizardPage' to 'RecommendedPreferencesWizardPage' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.wizards.MylarPreferenceWizardPage' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizardPage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPreferenceWizardPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.wizards{MylarPreferenceWizardPage.java[MylarPreferenceWizardPage" matchStrategy="1" name="RecommendedPreferencesWizardPage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268837562" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.MylarProposalSeparator' to 'FocusedProposalSeparator' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.MylarProposalSeparator' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.FocusedProposalSeparator' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'MylarProposalSeparator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java.ui.editor{FocusedJavaProposalProcessor.java[FocusedJavaProposalProcessor[MylarProposalSeparator" matchStrategy="1" name="FocusedProposalSeparator" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269661074" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'MARKER_ID_LANDMARK' in 'org.eclipse.mylyn.internal.java.ui.LandmarkMarkerManager' to 'ID_MARKER_LANDMARK' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.ui.LandmarkMarkerManager.MARKER_ID_LANDMARK' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.LandmarkMarkerManager.ID_MARKER_LANDMARK' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MARKER_ID_LANDMARK'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui{LandmarkMarkerManager.java[LandmarkMarkerManager^MARKER_ID_LANDMARK" name="ID_MARKER_LANDMARK" references="true" setter="false" stamp="1181327516551" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.FocusedJavaPlugin' to 'JavaBridgeUiPlugin' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.FocusedJavaPlugin' - Renamed element: 'org.eclipse.mylyn.internal.java.JavaBridgeUiPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'FocusedJavaPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java{FocusedJavaPlugin.java[FocusedJavaPlugin" matchStrategy="1" name="JavaBridgeUiPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181330037311" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.java.JavaBridgeUiPlugin' to 'JavaUiBridgePlugin' - Original project: 'org.eclipse.mylyn.java' - Original element: 'org.eclipse.mylyn.internal.java.JavaBridgeUiPlugin' - Renamed element: 'org.eclipse.mylyn.internal.java.JavaUiBridgePlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'JavaBridgeUiPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.java{JavaBridgeUiPlugin.java[JavaBridgeUiPlugin" matchStrategy="1" name="JavaUiBridgePlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181330063489" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.compatibility' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.compatibility' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.compatibility" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181349847645" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.pde.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.pde.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.pde.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181349853704" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.ide.ant' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.ide.ant' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.ide.ant" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181349868058" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.web.core' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.web.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.web.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181349931155" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.compatibility' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.compatibility' - Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.compatibility" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log=".settings	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181350061142" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.ide.ant' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.ide.ant' - Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.ide.ant" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log=".settings	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181350065520" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.pde.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.pde.ui' - Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.pde.ui" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log=".settings	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181350069760" units="0" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.pde.ui/src/org.eclipse.mylyn.internal.pde.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.pde.ui/src/org.eclipse.mylyn.internal.pde.ui' - Original element: 'org.eclipse.mylyn.internal.java.search.XmlJavaRelationProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.pde.ui" element1="/src<org.eclipse.mylyn.internal.java.search{XmlJavaRelationProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181354895486" units="1" version="1.0"/>
+<refactoring comment="Move 7 elements(s) to 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui' - Original elements: org.eclipse.mylyn.internal.java.InterestUpdateDeltaListener.java org.eclipse.mylyn.internal.java.JavaUiBridgePlugin.java org.eclipse.mylyn.internal.java.InterestInducingProblemListener.java org.eclipse.mylyn.internal.java.ActiveFoldingEditorTracker.java org.eclipse.mylyn.internal.java.JavaStructureBridge.java org.eclipse.mylyn.internal.java.JavaDebugStructureBridge.java org.eclipse.mylyn.internal.java.TypeHistoryManager.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.java.ui" element1="/src<org.eclipse.mylyn.internal.java{InterestUpdateDeltaListener.java" element2="/src<org.eclipse.mylyn.internal.java{JavaUiBridgePlugin.java" element3="/src<org.eclipse.mylyn.internal.java{InterestInducingProblemListener.java" element4="/src<org.eclipse.mylyn.internal.java{ActiveFoldingEditorTracker.java" element5="/src<org.eclipse.mylyn.internal.java{JavaDebugStructureBridge" element6="/src<org.eclipse.mylyn.internal.java{JavaDebugStructureBridge.java" element7="/src<org.eclipse.mylyn.internal.java{TypeHistoryManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181359393217" units="7" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.internal.java.search' to 'org.eclipse.mylyn.internal.java.ui.search' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.search' - Renamed element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.search' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.java.search'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.java.search" name="org.eclipse.mylyn.internal.java.ui.search" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181359414299" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..ac8af25
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,29 @@
+1181268246149 Rename type 'MylarCompilationUnitEditor'
+1181268300051 Rename type 'MylarJavaNoTypeProposalComputer'
+1181268411156 Rename type 'MylarJavaPlugin'
+1181268465307 Delete element
+1181268645912 Rename type 'MylarJavaProposalProcessor'
+1181268658692 Rename type 'MylarJavaSourceViewerConfiguration'
+1181268668028 Rename type 'MylarJavaTypeProposalComputer'
+1181268699256 Rename type 'MylarPdeJUnitLaunchConfiguration'
+1181268706685 Rename type 'MylarJUnitTabGroup'
+1181268715526 Rename type 'MylarPdeJUnitTabGroup'
+1181268725278 Rename type 'MylarJUnitLaunchConfiguration'
+1181268734675 Rename type 'MylarJUnitMainTab'
+1181268789658 Delete element
+1181268821119 Rename type 'MylarPreferenceWizard'
+1181268837562 Rename type 'MylarPreferenceWizardPage'
+1181269661074 Rename type 'MylarProposalSeparator'
+1181327516551 Rename field 'MARKER_ID_LANDMARK'
+1181330037311 Rename type 'FocusedJavaPlugin'
+1181330063489 Rename type 'JavaBridgeUiPlugin'
+1181349847645 Copy file
+1181349853704 Copy file
+1181349868058 Copy file
+1181349931155 Copy file
+1181350061142 Copy folder
+1181350065520 Copy folder
+1181350069760 Copy folder
+1181354895486 Move compilation unit
+1181359393217 Move compilation units
+1181359414299 Rename package 'org.eclipse.mylyn.internal.java.search'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..4109d5f
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.pde.ui/src/org.eclipse.mylyn.internal.pde.ui.junit' - Original project: 'org.eclipse.mylyn.java.ui' - Destination element: 'org.eclipse.mylyn.pde.ui/src/org.eclipse.mylyn.internal.pde.ui.junit' - Original elements: org.eclipse.mylyn.internal.java.ui.junit.TaskContextPdeJUnitTabGroup.java org.eclipse.mylyn.internal.java.ui.junit.TaskContextPdeJUnitLaunchConfiguration.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.pde.ui.junit" element1="/src<org.eclipse.mylyn.internal.java.ui.junit{TaskContextPdeJUnitTabGroup.java" element2="/src<org.eclipse.mylyn.internal.java.ui.junit{TaskContextPdeJUnitLaunchConfiguration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181869359962" units="2" version="1.0"/>
+
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..0a0cb63
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181869359962 Move compilation units
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..39e7a45
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'mylar.gif'" description="Delete element" element1="icons/eview16/mylar.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182296830710" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'editor-mylar-java.gif'" description="Delete element" element1="icons/eview16/editor-mylar-java.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182296865184" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'interest-filtering.gif'" description="Delete element" element1="icons/elcl16/interest-filtering.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182296886934" subPackages="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.java.ui/icons/elcl16/focus-tasklist.gif' to 'interest-filtering.gif' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'focus-tasklist.gif'" description="Rename resource 'focus-tasklist.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/elcl16/focus-tasklist.gif" name="interest-filtering.gif" stamp="1182296894216" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'interest-folding.gif'" description="Delete element" element1="icons/elcl16/interest-folding.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182296898149" subPackages="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.java.ui/icons/elcl16/focus-tasklist.gif' to 'interest-folding.gif' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'focus-tasklist.gif'" description="Rename resource 'focus-tasklist.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/elcl16/focus-tasklist.gif" name="interest-folding.gif" stamp="1182296922313" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..d8b2021
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,6 @@
+1182296830710 Delete element
+1182296865184 Delete element
+1182296886934 Delete element
+1182296894216 Rename resource 'focus-tasklist.gif'
+1182296898149 Delete element
+1182296922313 Rename resource 'focus-tasklist.gif'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..34a41ec
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'MYLAR_FIRST_RUN' in 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizard' to 'MYLYN_FIRST_RUN' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizard.MYLAR_FIRST_RUN' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizard.MYLYN_FIRST_RUN' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MYLAR_FIRST_RUN'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui.wizards{RecommendedPreferencesWizard.java[RecommendedPreferencesWizard^MYLAR_FIRST_RUN" name="MYLYN_FIRST_RUN" references="true" setter="false" stamp="1184021879518" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizardPage.isMylarContentAssistDefault()' to 'isMylynContentAssistDefault' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizardPage.isMylarContentAssistDefault()' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizardPage.isMylynContentAssistDefault()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isMylarContentAssistDefault'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.java.ui.wizards{RecommendedPreferencesWizardPage.java[RecommendedPreferencesWizardPage~isMylarContentAssistDefault" name="isMylynContentAssistDefault" references="true" stamp="1184021901534" version="1.0"/>
+<refactoring comment="Rename field 'ASSIST_MYLAR_TYPE' in 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil' to 'ASSIST_MYLYN_TYPE' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.ASSIST_MYLAR_TYPE' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.ASSIST_MYLYN_TYPE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ASSIST_MYLAR_TYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui{JavaUiUtil.java[JavaUiUtil^ASSIST_MYLAR_TYPE" name="ASSIST_MYLYN_TYPE" references="true" setter="false" stamp="1184022002273" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ASSIST_MYLAR_NOTYPE' in 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil' to 'ASSIST_MYLYN_NOTYPE' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.ASSIST_MYLAR_NOTYPE' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.ASSIST_MYLYN_NOTYPE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ASSIST_MYLAR_NOTYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui{JavaUiUtil.java[JavaUiUtil^ASSIST_MYLAR_NOTYPE" name="ASSIST_MYLYN_NOTYPE" references="true" setter="false" stamp="1184022016598" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ASSIST_MYLAR_TEMPLATE' in 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil' to 'ASSIST_MYLYN_TEMPLATE' - Original project: 'org.eclipse.mylyn.java.ui' - Original element: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.ASSIST_MYLAR_TEMPLATE' - Renamed element: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.ASSIST_MYLYN_TEMPLATE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ASSIST_MYLAR_TEMPLATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui{JavaUiUtil.java[JavaUiUtil^ASSIST_MYLAR_TEMPLATE" name="ASSIST_MYLYN_TEMPLATE" references="true" setter="false" stamp="1184022026163" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..bd8490e
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1,5 @@
+1184021879518 Rename field 'MYLAR_FIRST_RUN'
+1184021901534 Rename method 'isMylarContentAssistDefault'
+1184022002273 Rename field 'ASSIST_MYLAR_TYPE'
+1184022016598 Rename field 'ASSIST_MYLAR_NOTYPE'
+1184022026163 Rename field 'ASSIST_MYLAR_TEMPLATE'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..f12502b
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename resource '/org.eclipse.mylyn.java.ui/icons/elcl16/interest-filtering.gif' to 'focus'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'interest-filtering.gif'" description="Rename resource 'interest-filtering.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/elcl16/interest-filtering.gif" name="focus" stamp="1190751574860" version="1.0"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.java.ui/icons/elcl16/focus' to 'focus.gif'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'focus'" description="Rename resource 'focus'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/elcl16/focus" name="focus.gif" stamp="1190751580681" version="1.0"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.java.ui/icons/elcl16/interest-filtering-disabled.gif' to 'focus-disabled.gif'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'interest-filtering-disabled.gif'" description="Rename resource 'interest-filtering-disabled.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/elcl16/interest-filtering-disabled.gif" name="focus-disabled.gif" stamp="1190751594061" version="1.0"/>
<refactoring comment="Rename local variable 'on' in 'org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction.setManualLinkingAndFiilterEnablement(...)' to 'enabled'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction.setManualLinkingAndFiilterEnablement(boolean).on'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction.setManualLinkingAndFiilterEnablement(boolean).enabled'
- Update references to refactored element" description="Rename local variable 'on'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.java.ui.actions{FocusPackageExplorerAction.java[FocusPackageExplorerAction~setManualLinkingAndFiilterEnablement~Z at on!3044!3053!3052!3053!Z" name="enabled" references="true" stamp="1190765361671" version="1.0"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.java.ui/icons/etool16/presentation.gif' to 'browse-filtered.gif'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'presentation.gif'" description="Rename resource 'presentation.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/presentation.gif" name="browse-filtered.gif" stamp="1190857480414" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..27d000a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1,5 @@
+1190751574860 Rename resource 'interest-filtering.gif'
+1190751580681 Rename resource 'focus'
+1190751594061 Rename resource 'interest-filtering-disabled.gif'
+1190765361671 Rename local variable 'on'
+1190857480414 Rename resource 'presentation.gif'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/1/2/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2008/1/2/refactorings.history
new file mode 100644
index 0000000..b18784e
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/1/2/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedCompilationUnitEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.java.ui.editor{FocusedCompilationUnitEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1200101549894" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/1/2/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2008/1/2/refactorings.index
new file mode 100644
index 0000000..280ca10
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/1/2/refactorings.index
@@ -0,0 +1 @@
+1200101549894 Delete element
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..3b946ec
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.InterestInducingProblemListener.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.java.ui{InterestInducingProblemListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207710443901" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.views'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.views'
- Original element: 'org.eclipse.mylyn.internal.java.ui.views.ActiveHierarchyView.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.views" element1="/src<org.eclipse.mylyn.internal.java.ui.views{ActiveHierarchyView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207714904488" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.views'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.java.ui.views" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207714914011" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.java.ui.BrowseFilteredAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.java.ui{BrowseFilteredAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207715737601" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.java.ui'" description="Delete element" element1="/src<org.eclipse.mylyn.java.ui" element2="/src<org.eclipse.mylyn.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207715742015" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.JavaContextLabelProvider.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.java.ui{JavaContextLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207716037038" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.JavaContextLabelProvider.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui" element1="/src<org.eclipse.mylyn.internal.java.ui{JavaContextLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207717080260" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..9379286
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,7 @@
+1207710443901 Move compilation unit
+1207714904488 Move compilation unit
+1207714914011 Delete element
+1207715737601 Delete element
+1207715742015 Delete element
+1207716037038 Move compilation unit
+1207717080260 Move compilation unit
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..41f0828
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin'
- Original element: 'org.eclipse.mylyn.internal.java.ui.wizards.RecommendedPreferencesWizard.MYLYN_FIRST_RUN'
- Textual move only" description="Move field" destination="/src<org.eclipse.mylyn.internal.java.ui{JavaUiBridgePlugin.java[JavaUiBridgePlugin" element1="/src<org.eclipse.mylyn.internal.java.ui.wizards{RecommendedPreferencesWizard.java[RecommendedPreferencesWizard^MYLYN_FIRST_RUN" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1208554311159" version="1.0"/>
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui{JavaUiBridgePlugin.java[JavaUiBridgePlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1208554360143" textual="true" version="1.0"/>
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin'
- Original element: 'org.eclipse.mylyn.internal.java.ui.JavaUiBridge.ID_PLUGIN'
- Textual move only" description="Move field" destination="/src<org.eclipse.mylyn.internal.java.ui{JavaUiBridgePlugin.java[JavaUiBridgePlugin" element1="/src<org.eclipse.mylyn.internal.java.ui{JavaUiBridge.java[JavaUiBridge^ID_PLUGIN" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1208554365430" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.java.ui'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.wizards'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.java.ui.wizards" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208554415364" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.java.tasks/src/org.eclipse.mylyn.internal.java.tasks'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.java.tasks/src/org.eclipse.mylyn.internal.java.tasks'
- Original element: 'org.eclipse.mylyn.internal.java.ui.JavaStackTraceHyperlinkDetector.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.java.tasks/src<org.eclipse.mylyn.internal.java.tasks" element1="/src<org.eclipse.mylyn.internal.java.ui{JavaStackTraceHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208554583676" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.java.tasks/src/org.eclipse.mylyn.internal.java.tasks'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.java.tasks/src/org.eclipse.mylyn.internal.java.tasks'
- Original element: 'org.eclipse.mylyn.internal.java.ui.actions.NewTaskFromJunitResultViewAction.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.java.tasks/src<org.eclipse.mylyn.internal.java.tasks" element1="/src<org.eclipse.mylyn.internal.java.ui.actions{NewTaskFromJunitResultViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208554597042" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'etool16'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'etool16'
- Original element: 'task-new.gif'" description="Move file" element1="icons/etool16/task-new.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208554814547" target="/org.eclipse.mylyn.java.tasks/icons/etool16" units="0" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.java.tasks/src/org.eclipse.mylyn.internal.java.tasks'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.java.tasks/src/org.eclipse.mylyn.internal.java.tasks'
- Original element: 'org.eclipse.mylyn.internal.java.ui.JavaStackTraceFileHyperlink.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.java.tasks/src<org.eclipse.mylyn.internal.java.tasks" element1="/src<org.eclipse.mylyn.internal.java.ui{JavaStackTraceFileHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208554860891" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..33b470a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,8 @@
+1208554311159 Move field
+1208554360143 Rename field 'PLUGIN_ID'
+1208554365430 Move field
+1208554415364 Delete element
+1208554583676 Move compilation unit
+1208554597042 Move compilation unit
+1208554814547 Move file
+1208554860891 Move compilation unit
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..33b56a5
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.java.ui.actions.FindReferencesInContextAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.actions" element1="/src<org.eclipse.mylyn.internal.java.ui.actions{FindReferencesInContextAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1210647845572" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..608dd5c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1 @@
+1210647845572 Move compilation unit
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..cb1bf5b
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.actions'
- Original project: 'org.eclipse.mylyn.java.ui'
- Destination element: 'org.eclipse.mylyn.java.ui/src/org.eclipse.mylyn.internal.java.ui.actions'
- Original element: 'FocusBreakpointsViewAction.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.java.ui.actions" element1="/src<{FocusBreakpointsViewAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211260080300" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..9b0b1f6
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1 @@
+1211260080300 Move compilation unit
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..c604384
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private static Set<String> getDisabledIds(IPreferenceStore javaPrefs)' from 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil.installContentAssist()' to 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil'
- Original project: 'org.eclipse.mylyn.java.ui'
- Method name: 'getDisabledIds'
- Destination type: 'org.eclipse.mylyn.internal.java.ui.JavaUiUtil'
- Declared visibility: 'private'" comments="false" description="Extract method 'getDisabledIds'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.java.ui{JavaUiUtil.java" name="getDisabledIds" replace="false" selection="3004 325" stamp="1212197890857" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..43f6191
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1 @@
+1212197890857 Extract method 'getDisabledIds'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2009/2/9/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2009/2/9/refactorings.history
new file mode 100644
index 0000000..3520adb
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2009/2/9/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'THRESHOLD_IMPLICIT_INTEREST' in 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor' to 'THRESHOLD_IMPLICIT_INTEREST_JDT'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.THRESHOLD_IMPLICIT_INTEREST'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.THRESHOLD_IMPLICIT_INTEREST_JDT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THRESHOLD_IMPLICIT_INTEREST'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui.editor{FocusedJavaProposalProcessor.java[FocusedJavaProposalProcessor^THRESHOLD_IMPLICIT_INTEREST!2" name="THRESHOLD_IMPLICIT_INTEREST_JDT" references="true" setter="true" stamp="1235704047922" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THRESHOLD_IMPLICIT_INTEREST_JDT' in 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor' to 'THRESHOLD_IMPLICIT_INTEREST_JAVA'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.THRESHOLD_IMPLICIT_INTEREST_JDT'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.THRESHOLD_IMPLICIT_INTEREST_JAVA'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THRESHOLD_IMPLICIT_INTEREST_JDT'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui.editor{FocusedJavaProposalProcessor.java[FocusedJavaProposalProcessor^THRESHOLD_IMPLICIT_INTEREST_JDT" name="THRESHOLD_IMPLICIT_INTEREST_JAVA" references="true" setter="true" stamp="1235704292968" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THRESHOLD_IMPLICIT_INTEREST_JAVA' in 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor' to 'RELEVANCE_IMPLICIT_INTEREST_JAVA'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.THRESHOLD_IMPLICIT_INTEREST_JAVA'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.RELEVANCE_IMPLICIT_INTEREST_JAVA'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THRESHOLD_IMPLICIT_INTEREST_JAVA'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui.editor{FocusedJavaProposalProcessor.java[FocusedJavaProposalProcessor^THRESHOLD_IMPLICIT_INTEREST_JAVA" name="RELEVANCE_IMPLICIT_INTEREST_JAVA" references="true" setter="true" stamp="1235704330863" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THRESHOLD_IMPLICIT_INTEREST_MISC' in 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor' to 'RELEVANCE_IMPLICIT_INTEREST_MISC'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.THRESHOLD_IMPLICIT_INTEREST_MISC'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaProposalProcessor.RELEVANCE_IMPLICIT_INTEREST_MISC'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THRESHOLD_IMPLICIT_INTEREST_MISC'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.java.ui.editor{FocusedJavaProposalProcessor.java[FocusedJavaProposalProcessor^THRESHOLD_IMPLICIT_INTEREST_MISC" name="RELEVANCE_IMPLICIT_INTEREST_MISC" references="true" setter="true" stamp="1235704338895" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2009/2/9/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2009/2/9/refactorings.index
new file mode 100644
index 0000000..652f034
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2009/2/9/refactorings.index
@@ -0,0 +1,4 @@
+1235704047922 Rename field 'THRESHOLD_IMPLICIT_INTEREST'
+1235704292968 Rename field 'THRESHOLD_IMPLICIT_INTEREST_JDT'
+1235704330863 Rename field 'THRESHOLD_IMPLICIT_INTEREST_JAVA'
+1235704338895 Rename field 'THRESHOLD_IMPLICIT_INTEREST_MISC'
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2009/5/18/refactorings.history b/org.eclipse.mylyn.java.ui/.refactorings/2009/5/18/refactorings.history
new file mode 100644
index 0000000..6395a02
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2009/5/18/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.java.ui.LandmarkMarkerManager.updateLandmarkMarkers(...)' to 'addLandmarkMarkers'
- Original project: 'org.eclipse.mylyn.java.ui'
- Original element: 'org.eclipse.mylyn.internal.java.ui.LandmarkMarkerManager.updateLandmarkMarkers(...)'
- Renamed element: 'org.eclipse.mylyn.internal.java.ui.LandmarkMarkerManager.addLandmarkMarkers(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateLandmarkMarkers'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.java.ui{LandmarkMarkerManager.java[LandmarkMarkerManager~updateLandmarkMarkers~QIInteractionElement;" name="addLandmarkMarkers" references="true" stamp="1241199106843" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/.refactorings/2009/5/18/refactorings.index b/org.eclipse.mylyn.java.ui/.refactorings/2009/5/18/refactorings.index
new file mode 100644
index 0000000..97b80d7
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.refactorings/2009/5/18/refactorings.index
@@ -0,0 +1 @@
+1241199106843 Rename method 'updateLandmarkMarkers'
diff --git a/org.eclipse.mylyn.java.ui/.settings/.api_filters b/org.eclipse.mylyn.java.ui/.settings/.api_filters
new file mode 100644
index 0000000..af84df3
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.settings/.api_filters
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.mylyn.java.ui" version="2">
+ <resource path="src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaSourceViewerConfiguration.java" type="org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaSourceViewerConfiguration">
+ <filter id="571473929">
+ <message_arguments>
+ <message_argument value="JavaSourceViewerConfiguration"/>
+ <message_argument value="FocusedJavaSourceViewerConfiguration"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitMainTab.java" type="org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitMainTab">
+ <filter id="571473929">
+ <message_arguments>
+ <message_argument value="JUnitLaunchConfigurationTab"/>
+ <message_argument value="TaskContextJUnitMainTab"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/mylyn/internal/java/ui/search/AbstractJavaRelationProvider.java" type="org.eclipse.mylyn.internal.java.ui.search.AbstractJavaRelationProvider">
+ <filter id="572522506">
+ <message_arguments>
+ <message_argument value="ElementQuerySpecification"/>
+ <message_argument value="AbstractJavaRelationProvider"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/org.eclipse.mylyn.java.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7b6172c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:47 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.java.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.java.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.java.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.java.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..761c56f
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Tue May 20 17:40:40 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=2
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.internal=1
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.java.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.java.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..99ae296
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.java.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.debug.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.debug,
+ org.eclipse.jdt.debug.ui,
+ org.eclipse.jdt.junit,
+ org.eclipse.jdt.launching,
+ org.eclipse.jdt.ui,
+ org.eclipse.jface.text,
+ org.eclipse.search,
+ org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.forms,
+ org.eclipse.ui.views,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.resources.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.ide.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: org.eclipse.mylyn.internal.java.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.java.ui.actions;x-internal:=true,
+ org.eclipse.mylyn.internal.java.ui.editor;x-internal:=true,
+ org.eclipse.mylyn.internal.java.ui.junit;x-internal:=true,
+ org.eclipse.mylyn.internal.java.ui.search;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.java.ui/about.html b/org.eclipse.mylyn.java.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/build-user.xml b/org.eclipse.mylyn.java.ui/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/build.properties b/org.eclipse.mylyn.java.ui/build.properties
new file mode 100644
index 0000000..1119465
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = plugin.xml,\
+ icons/,\
+ plugin.properties,\
+ META-INF/,\
+ about.html,\
+ doc/,\
+ .
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.java.ui/doc/active-views.html b/org.eclipse.mylyn.java.ui/doc/active-views.html
new file mode 100644
index 0000000..6e9b190
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/doc/active-views.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Active Views</h2>As you work and elements become landmarks
+ (bold decoration), Active Search eagerly finds related elements.
+ To force an element to populate the Active Search view manually make
+ it a landmark by right-clicking or hitting Ctrl+Alt+Shift+Up Arrow.
+ Use the pull-downs on the toolbar to alter the degree-of-separation
+ scope of the search. Note that elements with predicted
+ interest are gray.<p>
+ <img border="0" src="images/active-search.gif" width="340" height="309"><p>Similar to Active Search, this view actively
+ finds and presents the type hierarchy of the current set of
+ landmarks.</p>
+<p>
+ <img border="0" src="images/active-hierarchy.gif" width="364" height="145"><p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.java.ui/doc/book.css b/org.eclipse.mylyn.java.ui/doc/book.css
new file mode 100644
index 0000000..faa4199
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/doc/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.java.ui/doc/editing.html b/org.eclipse.mylyn.java.ui/doc/editing.html
new file mode 100644
index 0000000..4b8fc68
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/doc/editing.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Java Editing</h2><b>Interest-based content assist</b><p>The top of the content assist menu will put the items that are in
+ your task context on top of the list, to enable quick selection via
+ arrow keys. Once you start typing the menu will work as usual. Note
+ that the Mylar Java Editor needs to be set as default for ".java"
+ files (this is the only new functionality that comes from the Mylar
+ Java editor).</p>
+<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/interest-content-assist.gif" width="432" height="131"></p>
+ <b>Toggle auto folding</b><p>Pressing the editor toolbar button with the Mylar glasses on it will
+ enable/disable Mylar's automatic folding. This can be useful
+ when needing to browse through the code, or copy/paste code around
+ (since Eclipse's folding support can cause odd expansions when
+ copying folded regions,
+ <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104648">bug
+ 104648</a>).</p>
+<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/folding-toggle.gif" width="276" height="127"></p><b>Support Ctrl+click in Java Editor to navigate to
+ bug</b><p><span style="background-color: #FFFFFF">Ctrl+click on a comment that
+ contains one of the following forms will open the bug with the given
+ id: bug# 123, bug 123, Bug #123, Bug#123. (Note that all of these
+ are case insensitive and can be followed by a colon or whitespace).</span></p>
+<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/bugzilla-hyperlink.gif" width="381" height="102"></p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.java.ui/doc/images/active-hierarchy.gif b/org.eclipse.mylyn.java.ui/doc/images/active-hierarchy.gif
new file mode 100644
index 0000000..35651b1
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/doc/images/active-hierarchy.gif differ
diff --git a/org.eclipse.mylyn.java.ui/doc/images/active-search.gif b/org.eclipse.mylyn.java.ui/doc/images/active-search.gif
new file mode 100644
index 0000000..63af2fd
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/doc/images/active-search.gif differ
diff --git a/org.eclipse.mylyn.java.ui/doc/images/interest-error.gif b/org.eclipse.mylyn.java.ui/doc/images/interest-error.gif
new file mode 100644
index 0000000..d57c90d
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/doc/images/interest-error.gif differ
diff --git a/org.eclipse.mylyn.java.ui/doc/java.html b/org.eclipse.mylyn.java.ui/doc/java.html
new file mode 100644
index 0000000..3978411
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/doc/java.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Java Support</h2>
+<p> </p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.java.ui/doc/navigation.html b/org.eclipse.mylyn.java.ui/doc/navigation.html
new file mode 100644
index 0000000..b5e5344
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/doc/navigation.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Java Program Navigation</h2><b>Show all filtered children</b><p>When you are using filtering in a Mylar view you have the option of
+ temporarily showing all children of a filtered node by <alt>clicking
+ a node that is not currently selected. For example, you can
+ <alt>click a source folder, keep the <alt> key down, and continue
+ drilling down until you find a method of interest.
+ </p>
+ <p>
+ <img src="../../org.eclipse.mylar.doc/doc/images/0.3/alt-click.gif" alt="Alt Click"
+ title="New Java Project Wizard"></p>
+ <p><b>Predicted interest of errors</b></p>
+ Only available in Phase 2 of
+ the user study. Java elements that have errors get a predicted
+ interest, which means that they show up in views such as a the
+ package explorer. Once the errors are fixed the predicted
+ interest goes away.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/interest-error.gif" width="233" height="189"><p><b>Filter declarations in Package Explorer </b>
+</p>
+ If you don't like Mylar's constant showing of Java members in the
+ Package Explorer, select the drop-down menu, then "Filters..." and
+ enable the "Mylar Java Declarations Filter". It will then
+ stick in the menu in case you want to toggle between modes.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/filtering-declarations.gif" width="441" height="211"></p>
+ <p><b>Automatic interest filter toggling</b></p>
+ By default the interest
+ filter will automatically be toggled on the Package Explorer when a
+ task with context is activated, and toggled off when the task is
+ deactivated. This preference is under Mylar -> Java.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/filter-auto-toggle.gif" width="414" height="47"></p>
+<p>
+ <b>Interest filtering for the Java Browsing
+ perspective</b></p>Interest filtering can be toggled for
+ the Packages, Types, and Members views simultaneously by clicking
+ the leftmost toolbar button visible below.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/interest-java-browsing.gif" width="404" height="100"></p>
+
+ </body>
+</html>
diff --git a/org.eclipse.mylyn.java.ui/doc/toc.xml b/org.eclipse.mylyn.java.ui/doc/toc.xml
new file mode 100644
index 0000000..d09f51b
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/doc/toc.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.mylyn.doc/doc/toc.xml#java" label="Java Development">
+ <!--
+ <topic label="Java Support" href="doc/java.html">
+ <topic label="Editing" href="doc/editing.html"/>
+ <topic label="Navigation" href="doc/navigation.html"/>
+ <topic label="Active Views" href="doc/active-views.html"/>
+ </topic>
+ -->
+</toc>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/edge-ref-java.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/edge-ref-java.gif
new file mode 100644
index 0000000..a20a2ba
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/edge-ref-java.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/edge-ref-junit.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/edge-ref-junit.gif
new file mode 100644
index 0000000..32bcf89
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/edge-ref-junit.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/focus-browsing.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/focus-browsing.gif
new file mode 100644
index 0000000..c3ca8c4
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/focus-browsing.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/focus-disabled.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/focus.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/focus.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/interest-folding.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/interest-folding.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/interest-folding.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/mylyn-overlay.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/mylyn-overlay.gif
new file mode 100644
index 0000000..6b16d40
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/mylyn-overlay.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/proposals-other.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/proposals-other.gif
new file mode 100644
index 0000000..28f69f0
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/proposals-other.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/proposals-type.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/proposals-type.gif
new file mode 100644
index 0000000..b709469
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/proposals-type.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/elcl16/templateprop_co.gif b/org.eclipse.mylyn.java.ui/icons/elcl16/templateprop_co.gif
new file mode 100644
index 0000000..fdde5fb
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/elcl16/templateprop_co.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/browse-filtered.gif b/org.eclipse.mylyn.java.ui/icons/etool16/browse-filtered.gif
new file mode 100644
index 0000000..273bda0
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/browse-filtered.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/junit-tab.gif b/org.eclipse.mylyn.java.ui/icons/etool16/junit-tab.gif
new file mode 100644
index 0000000..956ec81
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/junit-tab.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/launch-junit-pde.gif b/org.eclipse.mylyn.java.ui/icons/etool16/launch-junit-pde.gif
new file mode 100644
index 0000000..bef090f
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/launch-junit-pde.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/launch-junit.gif b/org.eclipse.mylyn.java.ui/icons/etool16/launch-junit.gif
new file mode 100644
index 0000000..d3c85e3
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/launch-junit.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/link-with-editor.gif b/org.eclipse.mylyn.java.ui/icons/etool16/link-with-editor.gif
new file mode 100644
index 0000000..068d4c9
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/link-with-editor.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/no-scroll.gif b/org.eclipse.mylyn.java.ui/icons/etool16/no-scroll.gif
new file mode 100644
index 0000000..33f40b9
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/no-scroll.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/etool16/wizard-prefs.gif b/org.eclipse.mylyn.java.ui/icons/etool16/wizard-prefs.gif
new file mode 100644
index 0000000..9bb095d
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/etool16/wizard-prefs.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/eview16/active-hierarchy.gif b/org.eclipse.mylyn.java.ui/icons/eview16/active-hierarchy.gif
new file mode 100644
index 0000000..f3aa87a
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/eview16/active-hierarchy.gif differ
diff --git a/org.eclipse.mylyn.java.ui/icons/wizban/banner-prefs.gif b/org.eclipse.mylyn.java.ui/icons/wizban/banner-prefs.gif
new file mode 100644
index 0000000..ce0f6e3
Binary files /dev/null and b/org.eclipse.mylyn.java.ui/icons/wizban/banner-prefs.gif differ
diff --git a/org.eclipse.mylyn.java.ui/plugin.properties b/org.eclipse.mylyn.java.ui/plugin.properties
new file mode 100644
index 0000000..37edf88
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/plugin.properties
@@ -0,0 +1,51 @@
+###############################################################################
+# Copyright (c) 2004, 2005 Mylyn project committers 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
+###############################################################################
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Java Bridge
+
+JavaUiBridge.activeSearch.label = Java Search
+
+javaCompletionProposalComputer.javaAllProposalCategory.name = J&ava Proposals (Task-Focused)
+javaCompletionProposalComputer.javaNoTypeProposalCategory.name = Other Java Proposals (Focused)
+javaCompletionProposalComputer.javaTypeProposalCategory.name = Type Proposals (Focused)
+javaCompletionProposalComputer.templateProposalCategory.name = Template Proposals (Focused)
+
+JavaStructureBridge.name = Java Structure Bridge
+JavaDebugStructureBridge.name = Java Debug Structure Bridge
+
+TaskContextJUnitLaunchConfiguration.name = Task Context Test
+TaskContextJUnitTabGroup.description = Test suite automatically populated by elements in the task context.
+
+FocusPackageExplorerAction.label = Focus on Active Task
+FocusPackageExplorerAction.tooltip = Focus on Active Task (Alt+click to reveal filtered elements)
+FocusBreakpointsViewAction.label = Focus on Active Task
+FocusBreakpointsViewAction.tooltip = Focus on Active Task
+FocusDebugViewAction.label = Focus on Active Task (Experimental)
+FocusDebugViewAction.tooltip = Focus on Active Task (Experimental)
+InterestIncrementAction.label = Mark as Landmark
+InterestIncrementAction.tooltip = Mark the selected element as a landmark
+InterestDecrementAction.label = Remove from Context
+InterestDecrementAction.tooltip = Mark selected element as uninteresting
+
+ShowFilteredChildrenAction.label = Show Filtered Children (Alt+click)
+
+actionSet.label = Java Task Context
+ToggleActiveFoldingAction.label = Focus Editor on Active Task
+ToggleActiveFoldingAction.tooltip = Automatically Fold Uninteresting Elements
+
+actionSet.browsing.label = Java Browsing Task Context
+FocusBrowsingPerspectiveAction.label = Focus Browsing Perspective
+FocusBrowsingPerspectiveAction.tooltip = Focus Java Browsing Views on Active Task
+
+JavaDeclarationsFilter.description = Java Declarations Filter
+JavaDeclarationsFilter.name = Java Members
+
+commands.category.description = Java Task-Focused Interface Commands
+commands.category.name = Java Context
+command.folding.auto.description = Toggle Active Folding
+command.folding.auto.name = Toggle Active Folding
diff --git a/org.eclipse.mylyn.java.ui/plugin.xml b/org.eclipse.mylyn.java.ui/plugin.xml
new file mode 100644
index 0000000..10363ef
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/plugin.xml
@@ -0,0 +1,529 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="javaEditorContributor"
+ name="Task-Focused Java Editor Contributor"
+ schema="schema/javaEditorContributor.exsd"/>
+
+ <extension
+ point="org.eclipse.mylyn.context.core.bridges">
+ <structureBridge
+ class="org.eclipse.mylyn.internal.java.ui.JavaStructureBridge"
+ name="%JavaStructureBridge.name"
+ parentContentType="resource"/>
+ <structureBridge
+ class="org.eclipse.mylyn.internal.java.ui.JavaDebugStructureBridge"
+ name="%JavaDebugStructureBridge.name"/>
+ </extension>
+
+ <extension point="org.eclipse.mylyn.context.ui.bridges">
+ <uiBridge
+ class="org.eclipse.mylyn.internal.java.ui.JavaUiBridge"
+ contentType="java"
+ activeSearchIcon="icons/elcl16/edge-ref-java.gif"
+ activeSearchLabel="%JavaUiBridge.activeSearch.label"/>
+ <preservedFilters
+ viewId="org.eclipse.jdt.ui.PackageExplorer">
+ <filter
+ class="org.eclipse.jdt.internal.ui.filters.ImportDeclarationFilter">
+ </filter>
+ <filter
+ class="org.eclipse.jdt.internal.ui.filters.PackageDeclarationFilter">
+ </filter>
+ <filter
+ class="org.eclipse.mylyn.internal.java.ui.JavaDeclarationsFilter">
+ </filter>
+ <filter
+ class="org.eclipse.jdt.internal.ui.filters.ClosedProjectFilter">
+ </filter>
+ </preservedFilters>
+ <preservedFilters
+ viewId="org.eclipse.ui.navigator.ProjectExplorer">
+ <filter
+ class="org.eclipse.jdt.internal.ui.filters.PackageDeclarationFilter">
+ </filter>
+ <filter
+ class="org.eclipse.jdt.internal.ui.filters.ImportDeclarationFilter">
+ </filter>
+ </preservedFilters>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.context.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin$JavaUiBridgeStartup">
+ </startup>
+ </extension>
+
+ <!-- ==================== Context Editing Common Navigator ==================== -->
+
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+ <viewerContentBinding
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context">
+ <includes>
+ <contentExtension pattern="org.eclipse.jdt.java.ui.javaContent" />
+ </includes>
+ </viewerContentBinding>
+ <viewerContentBinding
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context.quick">
+ <includes>
+ <contentExtension pattern="org.eclipse.jdt.java.ui.javaContent" />
+ </includes>
+ </viewerContentBinding>
+ </extension>
+
+ <!-- ==================== Content Assist ==================== -->
+
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="javaAllProposalCategory"
+ name="%javaCompletionProposalComputer.javaAllProposalCategory.name">
+ <proposalCategory
+ icon="icons/elcl16/proposals-other.gif"/>
+ </extension>
+ <!-- e3.4 and earlier -->
+ <!--
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="javaNoTypeProposalCategory"
+ name="%javaCompletionProposalComputer.javaNoTypeProposalCategory.name">
+ <proposalCategory
+ icon="icons/elcl16/proposals-other.gif"/>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="javaTypeProposalCategory"
+ name="%javaCompletionProposalComputer.javaTypeProposalCategory.name">
+ <proposalCategory
+ icon="icons/elcl16/proposals-type.gif"/>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="templateProposalCategory"
+ name="%javaCompletionProposalComputer.templateProposalCategory.name">
+ <proposalCategory
+ icon="/icons/elcl16/templateprop_co.gif"/>
+ </extension>
+ -->
+
+ <!-- java completions -->
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="javaAllCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaAllProposalCategory"
+ class="org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaAllProposalComputer">
+ <partition type="__dftl_partition_content_type"/>
+ <partition type="__java_string"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <!-- e3.4 and earlier -->
+ <!--
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="javaTypeCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaTypeProposalCategory"
+ class="org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaTypeProposalComputer">
+ <partition type="__dftl_partition_content_type"/>
+ <partition type="__java_string"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="javaNoTypeCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaNoTypeProposalCategory"
+ class="org.eclipse.mylyn.internal.java.ui.editor.FocusedJavaNoTypeProposalComputer">
+ <partition type="__dftl_partition_content_type"/>
+ <partition type="__java_string"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ -->
+ <!-- templates -->
+ <!--
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="templateProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.templateProposalCategory"
+ class="org.eclipse.jdt.internal.ui.text.java.TemplateCompletionProposalComputer">
+ <partition type="__dftl_partition_content_type"/>
+ <partition type="__java_singleline_comment"/>
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ -->
+ <!-- javadoc completions -->
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="LegacyJavadocCompletionProposalComputer_all">
+ <javaCompletionProposalComputer
+ class="org.eclipse.jdt.internal.ui.text.javadoc.LegacyJavadocCompletionProposalComputer"
+ categoryId="org.eclipse.mylyn.java.ui.javaAllProposalCategory">
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="JavadocCompletionProposalComputer_all">
+ <javaCompletionProposalComputer
+ class="org.eclipse.jdt.internal.ui.text.javadoc.JavadocCompletionProposalComputer"
+ categoryId="org.eclipse.mylyn.java.ui.javaAllProposalCategory">
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="JavadocHTMLCompletionProposalComputer_all">
+ <javaCompletionProposalComputer
+ class="org.eclipse.jdt.internal.ui.text.javadoc.HTMLTagCompletionProposalComputer"
+ categoryId="org.eclipse.mylyn.java.ui.javaAllProposalCategory">
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <!-- e3.4 and earlier -->
+ <!--
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="org.eclipse.mylyn.java.editor.LegacyJavadocCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaNoTypeProposalCategory"
+ class="org.eclipse.jdt.internal.ui.text.javadoc.LegacyJavadocCompletionProposalComputer">
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="org.eclipse.mylyn.java.editor.JavadocCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaNoTypeProposalCategory"
+ class="org.eclipse.jdt.internal.ui.text.javadoc.JavadocCompletionProposalComputer">
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
+ id="org.eclipse.mylyn.java.editor.JavadocHTMLCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaNoTypeProposalCategory"
+ class="org.eclipse.jdt.internal.ui.text.javadoc.HTMLTagCompletionProposalComputer">
+ <partition type="__java_javadoc"/>
+ </javaCompletionProposalComputer>
+ </extension>
+ -->
+ <!-- ==================== Launch Configurations ==================== -->
+
+ <extension
+ point="org.eclipse.debug.core.launchConfigurationTypes">
+ <launchConfigurationType
+ name="%TaskContextJUnitLaunchConfiguration.name"
+ delegate="org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitLaunchConfiguration"
+ modes="run, debug"
+ id="org.eclipse.mylyn.java.junit.launchconfig"
+ sourceLocatorId="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"
+ sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer">
+ </launchConfigurationType>
+ </extension>
+
+ <extension point="org.eclipse.debug.ui.launchConfigurationTypeImages">
+ <launchConfigurationTypeImage
+ id="org.eclipse.mylyn.pde.junit.launchconfig.image"
+ configTypeID="org.eclipse.mylyn.pde.junit.launchconfig"
+ icon="icons/etool16/launch-junit-pde.gif">
+ </launchConfigurationTypeImage>
+ </extension>
+
+ <extension point="org.eclipse.debug.ui.launchConfigurationTypeImages">
+ <launchConfigurationTypeImage
+ id="org.eclipse.mylyn.java.junit.launchconfig.image"
+ configTypeID="org.eclipse.mylyn.java.junit.launchconfig"
+ icon="icons/etool16/launch-junit.gif">
+ </launchConfigurationTypeImage>
+ </extension>
+
+ <extension
+ point="org.eclipse.debug.ui.launchConfigurationTabGroups">
+ <launchConfigurationTabGroup
+ type="org.eclipse.mylyn.java.junit.launchconfig"
+ helpContextId="org.eclipse.jdt.junit.junit_tab_group"
+ class="org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitTabGroup"
+ id="org.eclipse.mylyn.java.junit.launchconfig.tabgroup">
+ <launchMode
+ perspective="org.eclipse.debug.ui.DebugPerspective"
+ description="%TaskContextJUnitTabGroup.description"
+ mode="debug">
+ </launchMode>
+ <launchMode
+ description="%TaskContextJUnitTabGroup.description"
+ mode="run">
+ </launchMode>
+ </launchConfigurationTabGroup>
+ </extension>
+
+ <extension point="org.eclipse.ui.viewActions">
+ <viewContribution
+ id="org.eclipse.mylyn.java.explorer.contribution"
+ targetID="org.eclipse.jdt.ui.PackageExplorer">
+ <action
+ class="org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.java.actions.focus.packageExplorer"
+ label="%FocusPackageExplorerAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusPackageExplorerAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+ <viewContribution
+ id="org.eclipse.mylyn.ui.views.active.search.contribution"
+ targetID="org.eclipse.mylyn.ui.views.active.search">
+ </viewContribution>
+
+ <viewContribution
+ id="org.eclipse.mylyn.java.ui.markers.breakpoints.contribution"
+ targetID="org.eclipse.debug.ui.BreakpointView">
+ <action
+ class="org.eclipse.mylyn.internal.java.ui.actions.FocusBreakpointsViewAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.java.ui.actions.focus.markers.breakpoints"
+ label="%FocusBreakpointsViewAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusBreakpointsViewAction.tooltip">
+ </action>
+ </viewContribution>
+
+ <viewContribution
+ id="org.eclipse.mylyn.ui.debug.view.contribution"
+ targetID="org.eclipse.debug.ui.DebugView">
+ <action
+ class="org.eclipse.mylyn.internal.java.ui.actions.FocusDebugViewAction"
+ disabledIcon="icons/elcl16/focus-disabled.gif"
+ enablesFor="*"
+ icon="icons/elcl16/focus.gif"
+ id="org.eclipse.mylyn.ui.actions.FilterResourceNavigatorAction"
+ label="%FocusDebugViewAction.label"
+ menubarPath="mylyn"
+ style="toggle"
+ toolbarPath="mylyn"
+ tooltip="%FocusDebugViewAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </viewContribution>
+ </extension>
+
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.java.ui.interest.increase.contribution"
+ objectClass="org.eclipse.jdt.core.IJavaElement">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestIncrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.increment"
+ enablesFor="*"
+ icon="icons/elcl16/interest-increase.gif"
+ id="org.eclipse.mylyn.java.ui.interest.increase.element"
+ label="%InterestIncrementAction.label"
+ menubarPath="group.reorganize"
+ tooltip="%InterestIncrementAction.tooltip">
+ </action>
+ <visibility>
+ <and>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ <objectClass
+ name="org.eclipse.jdt.core.IMember">
+ </objectClass>
+ </and>
+ </visibility>
+ </objectContribution>
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.java.ui.interest.remove.contribution.elements"
+ objectClass="org.eclipse.jdt.core.IJavaElement">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestDecrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.decrement"
+ enablesFor="*"
+ icon="icons/elcl16/interest-decrease.gif"
+ id="org.eclipse.mylyn.java.ui.interest.remove.element"
+ label="%InterestDecrementAction.label"
+ menubarPath="group.reorganize"
+ tooltip="%InterestDecrementAction.tooltip">
+ </action>
+ <visibility>
+ <and>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ <or>
+ <objectClass
+ name="org.eclipse.jdt.core.IMethod">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.jdt.core.IField">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.jdt.core.IClassFile">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.jdt.internal.compiler.env.IBinaryType">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.jdt.internal.core.JarPackageFragment">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.jdt.internal.core.JarPackageFragmentRoot">
+ </objectClass>
+ </or>
+ </and>
+ </visibility>
+ </objectContribution>
+ <viewerContribution
+ id="org.eclipse.mylyn.context.ui.browse.filtered.contribution"
+ targetID="org.eclipse.jdt.ui.PackageExplorer">
+ <action
+ class="org.eclipse.mylyn.internal.java.ui.actions.ShowFilteredChildrenAction"
+ enablesFor="1"
+ icon="icons/etool16/browse-filtered.gif"
+ id="org.eclipse.mylyn.java.ui.action.browse.filtered"
+ label="%ShowFilteredChildrenAction.label"
+ menubarPath="group.reorganize">
+ </action>
+ <visibility>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </visibility>
+ </viewerContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ id="org.eclipse.mylyn.java.actionSet"
+ label="%actionSet.label"
+ visible="false">
+ <action
+ class="org.eclipse.mylyn.internal.java.ui.actions.ToggleActiveFoldingAction"
+ definitionId="org.eclipse.mylyn.java.ui.editor.folding.auto"
+ icon="icons/elcl16/interest-folding.gif"
+ id="org.eclipse.mylyn.java.ui.editor.folding.auto"
+ label="%ToggleActiveFoldingAction.label"
+ style="toggle"
+ toolbarPath="org.eclipse.ui.edit.text.actionSet.presentation/Presentation"
+ tooltip="%ToggleActiveFoldingAction.tooltip">
+ </action>
+ <!--
+ <action
+ definitionId="org.eclipse.mylyn.java.ui.search.context"
+ label="Search the current task context"
+ class="org.eclipse.mylyn.internal.sandbox.ui.actions.FindReferencesInContextAction"
+ id="org.eclipse.mylyn.java.ui.search.context">
+ </action>
+ -->
+ </actionSet>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.actionSetPartAssociations">
+ <actionSetPartAssociation
+ targetID="org.eclipse.mylyn.java.actionSet">
+ <part
+ id="org.eclipse.jdt.ui.CompilationUnitEditor">
+ </part>
+ <part
+ id="org.eclipse.jdt.ui.ClassFileEditor">
+ </part>
+ </actionSetPartAssociation>
+ </extension>
+
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ id="org.eclipse.mylyn.java.actionSet.browsing"
+ label="%actionSet.browsing.label"
+ visible="false">
+ <action
+ class="org.eclipse.mylyn.internal.java.ui.actions.FocusBrowsingPerspectiveAction"
+ id="org.eclipse.mylyn.java.ui.actions.ApplyMylynToBrowsingPerspectiveAction"
+ style="toggle"
+ label="%FocusBrowsingPerspectiveAction.label"
+ icon="icons/elcl16/focus-browsing.gif"
+ tooltip="%FocusBrowsingPerspectiveAction.tooltip"
+ toolbarPath="mylyn"
+ enablesFor="*">
+ </action>
+ </actionSet>
+ </extension>
+
+ <extension point="org.eclipse.ui.actionSetPartAssociations">
+ <actionSetPartAssociation targetID="org.eclipse.mylyn.java.actionSet.browsing">
+ <part id="org.eclipse.jdt.ui.MembersView"/>
+ <part id="org.eclipse.jdt.ui.PackagesView"/>
+ <part id="org.eclipse.jdt.ui.TypesView"/>
+ </actionSetPartAssociation>
+ </extension>
+
+ <extension point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension
+ targetID="org.eclipse.jdt.ui.JavaBrowsingPerspective">
+ <actionSet id="org.eclipse.mylyn.java.actionSet.browsing"/>
+ </perspectiveExtension>
+ </extension>
+
+ <extension point="org.eclipse.jdt.ui.javaElementFilters">
+ <filter
+ targetId="org.eclipse.jdt.ui.PackageExplorer"
+ name="%JavaDeclarationsFilter.name"
+ enabled="false"
+ description="%JavaDeclarationsFilter.description"
+ class="org.eclipse.mylyn.internal.java.ui.JavaDeclarationsFilter"
+ id="org.eclipse.mylyn.java.ui.MembersFilter">
+ </filter>
+ </extension>
+
+ <extension point="org.eclipse.ui.commands">
+ <category
+ name="%commands.category.name"
+ description="%commands.category.description"
+ id="org.eclipse.mylyn.java.ui.commands">
+ </category>
+ <command
+ categoryId="org.eclipse.mylyn.java.ui.commands"
+ description="%command.folding.auto.description"
+ id="org.eclipse.mylyn.java.ui.editor.folding.auto"
+ name="%command.folding.auto.name">
+ </command>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.java.ui/schema/javaEditorContributor.exsd b/org.eclipse.mylyn.java.ui/schema/javaEditorContributor.exsd
new file mode 100644
index 0000000..669ecbc
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/schema/javaEditorContributor.exsd
@@ -0,0 +1,122 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.java.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.java.ui" id="javaEditorContributor" name="Mylyn Java Editor Contributor"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="hyperlinkDetector" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="hyperlinkDetector">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/ActiveFoldingEditorTracker.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/ActiveFoldingEditorTracker.java
new file mode 100644
index 0000000..14ee324
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/ActiveFoldingEditorTracker.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.mylyn.internal.java.ui.editor.ActiveFoldingListener;
+import org.eclipse.mylyn.monitor.ui.AbstractEditorTracker;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class ActiveFoldingEditorTracker extends AbstractEditorTracker {
+
+ protected Map<JavaEditor, ActiveFoldingListener> editorListenerMap = new HashMap<JavaEditor, ActiveFoldingListener>();
+
+ @Override
+ public void editorOpened(IEditorPart part) {
+ if (part instanceof JavaEditor) {
+ registerEditor((JavaEditor) part);
+ }
+ }
+
+ @Override
+ public void editorClosed(IEditorPart part) {
+ if (part instanceof JavaEditor) {
+ unregisterEditor((JavaEditor) part);
+ }
+ }
+
+ public void registerEditor(final JavaEditor editor) {
+ if (editorListenerMap.containsKey(editor)) {
+ return;
+ } else {
+ ActiveFoldingListener listener = new ActiveFoldingListener(editor);
+ editorListenerMap.put(editor, listener);
+ }
+ }
+
+ public void unregisterEditor(JavaEditor editor) {
+ ActiveFoldingListener listener = editorListenerMap.get(editor);
+ if (listener != null) {
+ listener.dispose();
+ }
+ editorListenerMap.remove(editor);
+ }
+
+ /**
+ * For testing.
+ */
+ public Map<JavaEditor, ActiveFoldingListener> getEditorListenerMap() {
+ return editorListenerMap;
+ }
+
+ @Override
+ protected void editorBroughtToTop(IEditorPart part) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/BreakpointsInterestFilter.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/BreakpointsInterestFilter.java
new file mode 100644
index 0000000..e252a7e
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/BreakpointsInterestFilter.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.ide.ui.AbstractMarkerInterestFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class BreakpointsInterestFilter extends AbstractMarkerInterestFilter {
+
+ @Override
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ if (element instanceof IJavaLineBreakpoint) {
+ IJavaLineBreakpoint breakpoint = (IJavaLineBreakpoint) element;
+ return isInteresting(breakpoint.getMarker(), viewer, parent);
+ }
+ if (element instanceof IBreakpoint) {
+ IBreakpoint breakpoint = (IBreakpoint) element;
+ // TODO: could consider use breakpoint.isEnabled() to make enabled breakpoints implicitly interesting
+ return isInteresting(breakpoint.getMarker(), viewer, parent);
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean isImplicitlyInteresting(IMarker marker) {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/InterestUpdateDeltaListener.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/InterestUpdateDeltaListener.java
new file mode 100644
index 0000000..5145d2c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/InterestUpdateDeltaListener.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.ElementChangedEvent;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IElementChangedListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class InterestUpdateDeltaListener implements IElementChangedListener {
+
+ private static boolean asyncExecMode = true;
+
+ public void elementChanged(ElementChangedEvent event) {
+ IJavaElementDelta delta = event.getDelta();
+ handleDelta(delta.getAffectedChildren());
+ }
+
+ /**
+ * Only handles first addition/removal
+ */
+ private void handleDelta(IJavaElementDelta[] delta) {
+ try {
+ IJavaElement added = null;
+ IJavaElement removed = null;
+ for (IJavaElementDelta child : delta) {
+ if (child.getElement() instanceof ICompilationUnit) {
+ if (((ICompilationUnit) child.getElement()).getOwner() != null) {
+ // see bug 195361, do not reduce interest of temporary working copy
+ return;
+ }
+ }
+
+ if (child.getKind() == IJavaElementDelta.ADDED) {
+ if (added == null) {
+ added = child.getElement();
+ }
+ } else if (child.getKind() == IJavaElementDelta.REMOVED) {
+ if (removed == null) {
+ removed = child.getElement();
+ }
+ }
+ handleDelta(child.getAffectedChildren());
+ }
+
+ if (added != null && removed != null) {
+ IInteractionElement element = ContextCore.getContextManager().getElement(removed.getHandleIdentifier());
+ if (element != null) {
+ resetHandle(element, added.getHandleIdentifier());
+ }
+ } else if (removed != null) {
+
+ IInteractionElement element = ContextCore.getContextManager().getElement(removed.getHandleIdentifier());
+ if (element != null) {
+ delete(element);
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Delta update failed", t)); //$NON-NLS-1$
+ }
+ }
+
+ private void resetHandle(final IInteractionElement element, final String newHandle) {
+ if (!asyncExecMode) {
+ ContextCore.getContextManager().updateHandle(element, newHandle);
+ } else {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null) {
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ContextCore.getContextManager().updateHandle(element, newHandle);
+ }
+ });
+ }
+ }
+ }
+
+ private void delete(final IInteractionElement element) {
+ if (!asyncExecMode) {
+ ContextCore.getContextManager().deleteElement(element);
+ } else {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null) {
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ContextCore.getContextManager().deleteElement(element);
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * For testing
+ */
+ public static void setAsyncExecMode(boolean asyncExecMode) {
+ InterestUpdateDeltaListener.asyncExecMode = asyncExecMode;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaDebugStructureBridge.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaDebugStructureBridge.java
new file mode 100644
index 0000000..9d7829a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaDebugStructureBridge.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.debug.core.model.RuntimeProcess;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
+import org.eclipse.jdt.internal.debug.core.model.JDIDebugElement;
+import org.eclipse.jdt.internal.debug.core.model.JDIStackFrame;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaDebugStructureBridge extends AbstractContextStructureBridge {
+
+ public final static String CONTENT_TYPE = "java/debug"; //$NON-NLS-1$
+
+ private final JavaStructureBridge javaStructureBridge = new JavaStructureBridge();
+
+ /**
+ * Needed due to slowness in resolving type names. We expect the stack frame elements to disappear, they are never
+ * explicitly removed.
+ *
+ * TODO: consider clearing on each re-launch
+ */
+ private final Map<JDIStackFrame, IType> stackFrameMap = new WeakHashMap<JDIStackFrame, IType>();
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ return object instanceof ILaunch || object instanceof JDIDebugElement || object instanceof RuntimeProcess;
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return false;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+// return element instanceof JDIStackFrame;
+ if (element instanceof JDIStackFrame) {
+ JDIStackFrame stackFrame = (JDIStackFrame) element;
+ try {
+ IStackFrame[] frames = stackFrame.getThread().getStackFrames();
+
+ int indexOfInterestingFrame = 0;
+ int indexOfCurrentFrame = 0;
+ for (int i = 0; i < frames.length; i++) {
+ IStackFrame frame = frames[i];
+ if (stackFrame.getName().equals(frame.getName())) {
+ indexOfCurrentFrame = i;
+ }
+
+ IInteractionElement correspondingElement = ContextCore.getContextManager().getElement(
+ getHandleIdentifier(frame));
+ if (correspondingElement != null && correspondingElement.getInterest().isInteresting()) {
+ indexOfInterestingFrame = i;
+ }
+ }
+ return indexOfCurrentFrame > indexOfInterestingFrame;
+ } catch (DebugException e) {
+ return false;
+ }
+ }
+ return element instanceof JDIStackFrame;
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ return getContentType();
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object resource, int offset) {
+ return null;
+ }
+
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object instanceof JDIStackFrame) {
+ JDIStackFrame stackFrame = (JDIStackFrame) object;
+ IType type = null;
+ if (stackFrameMap.containsKey(stackFrame)) {
+ type = stackFrameMap.get(stackFrame);
+ } else {
+ try {
+ type = JavaDebugUtils.resolveDeclaringType(stackFrame);
+ stackFrameMap.put(stackFrame, type);
+ } catch (CoreException e) {
+ // ignore
+ }
+ }
+ if (type != null && type.exists()) {
+ return javaStructureBridge.getHandleIdentifier(type);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ return "" + object; //$NON-NLS-1$
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ return javaStructureBridge.getObjectForHandle(handle);
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ return null;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaDeclarationsFilter.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaDeclarationsFilter.java
new file mode 100644
index 0000000..27a0e11
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaDeclarationsFilter.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaDeclarationsFilter extends ViewerFilter {
+
+ @Override
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ return !(element instanceof IMember || element instanceof IType);
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaEditingMonitor.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaEditingMonitor.java
new file mode 100644
index 0000000..8e5dcaa
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaEditingMonitor.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IImportContainer;
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageDeclaration;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.java.ui.search.JavaImplementorsProvider;
+import org.eclipse.mylyn.internal.java.ui.search.JavaReferencesProvider;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaEditingMonitor extends AbstractUserInteractionMonitor {
+
+ protected IJavaElement lastSelectedElement = null;
+
+ protected IJavaElement lastResolvedElement = null;
+
+ protected JavaEditor currentEditor;
+
+ protected StructuredSelection currentSelection = null;
+
+ public JavaEditingMonitor() {
+ super();
+ }
+
+ /**
+ * Only public for testing. Note: Two sequential selections on the same element are deemed to be an edit of the
+ * selection as this is the best guess that can be made. See bug 252306.
+ */
+ @Override
+ public void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ try {
+ IJavaElement selectedElement = null;
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+
+ if (structuredSelection.equals(currentSelection)) {
+ return;
+ }
+ currentSelection = structuredSelection;
+
+ for (Iterator<?> iterator = structuredSelection.iterator(); iterator.hasNext();) {
+ Object selectedObject = iterator.next();
+ if (selectedObject instanceof IJavaElement) {
+ IJavaElement checkedElement = checkIfAcceptedAndPromoteIfNecessary((IJavaElement) selectedObject);
+ if (checkedElement == null) {
+ return;
+ } else {
+ selectedElement = checkedElement;
+ }
+ }
+ if (selectedElement != null) {
+ super.handleElementSelection(part, selectedElement, contributeToContext);
+ }
+ }
+ } else {
+ if (selection instanceof TextSelection && part instanceof JavaEditor) {
+ currentEditor = (JavaEditor) part;
+ TextSelection textSelection = (TextSelection) selection;
+ selectedElement = SelectionConverter.resolveEnclosingElement(currentEditor, textSelection);
+ if (selectedElement instanceof IPackageDeclaration) {
+ // HACK: ignoring these selections
+ return;
+ }
+ IJavaElement[] resolved = SelectionConverter.codeResolve(currentEditor);
+ if (resolved != null && resolved.length == 1 && !resolved[0].equals(selectedElement)) {
+ lastResolvedElement = resolved[0];
+ }
+
+ boolean selectionResolved = false;
+ if (selectedElement instanceof IMethod && lastSelectedElement instanceof IMethod) {
+ // navigation between two elements
+ if (lastResolvedElement != null && lastSelectedElement != null
+ && lastResolvedElement.equals(selectedElement)
+ && !lastSelectedElement.equals(lastResolvedElement)) {
+ super.handleNavigation(part, selectedElement, JavaReferencesProvider.ID,
+ contributeToContext);
+ selectionResolved = true;
+ } else if (lastSelectedElement != null && lastSelectedElement.equals(lastResolvedElement)
+ && !lastSelectedElement.equals(selectedElement)) {
+ super.handleNavigation(part, selectedElement, JavaReferencesProvider.ID,
+ contributeToContext);
+ selectionResolved = true;
+ }
+ } else if (selectedElement != null && lastSelectedElement != null
+ && !lastSelectedElement.equals(selectedElement)) {
+ if (lastSelectedElement.getElementName().equals(selectedElement.getElementName())) {
+ // navigation between two elements
+ if (selectedElement instanceof IMethod && lastSelectedElement instanceof IMethod) {
+ super.handleNavigation(part, selectedElement, JavaImplementorsProvider.ID,
+ contributeToContext);
+ selectionResolved = true;
+ } else if (selectedElement instanceof IType && lastSelectedElement instanceof IType) {
+ super.handleNavigation(part, selectedElement, JavaImplementorsProvider.ID,
+ contributeToContext);
+ selectionResolved = true;
+ }
+ }
+ }
+ if (selectedElement != null) {
+ // selection of an element
+ if (!selectionResolved && selectedElement.equals(lastSelectedElement)) {
+ super.handleElementEdit(part, selectedElement, contributeToContext);
+ } else if (!selectedElement.equals(lastSelectedElement)) {
+ super.handleElementSelection(part, selectedElement, contributeToContext);
+ }
+ }
+
+ IJavaElement checkedElement = checkIfAcceptedAndPromoteIfNecessary(selectedElement);
+ if (checkedElement == null) {
+ return;
+ } else {
+ selectedElement = checkedElement;
+ }
+ }
+ }
+ if (selectedElement != null) {
+ lastSelectedElement = selectedElement;
+ }
+ } catch (JavaModelException e) {
+ // ignore, fine to fail to resolve an element if the model is not up-to-date
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Failed to update model based on selection", t)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @return null for elements that aren't modeled
+ */
+ protected IJavaElement checkIfAcceptedAndPromoteIfNecessary(IJavaElement element) {
+ // if (element instanceof IPackageDeclaration) return null;
+ if (element instanceof IImportContainer) {
+ return element.getParent();
+ } else if (element instanceof IImportDeclaration) {
+ return element.getParent().getParent();
+ } else {
+ return element;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaStructureBridge.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaStructureBridge.java
new file mode 100644
index 0000000..b06ba80
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaStructureBridge.java
@@ -0,0 +1,395 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.Marker;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IClassFile;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IParent;
+import org.eclipse.jdt.core.ISourceReference;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.JarEntryFile;
+import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
+import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
+import org.eclipse.jdt.internal.ui.packageview.PackageFragmentRootContainer;
+import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.ui.internal.WorkingSet;
+import org.eclipse.ui.views.markers.internal.ConcreteMarker;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaStructureBridge extends AbstractContextStructureBridge {
+
+ public final static String CONTENT_TYPE = "java"; //$NON-NLS-1$
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public Object getAdaptedParent(Object object) {
+ if (object instanceof IFile) {
+ IFile file = (IFile) object;
+ return JavaCore.create(file.getParent());
+ } else {
+ return super.getAdaptedParent(object);
+ }
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ IJavaElement javaElement = (IJavaElement) getObjectForHandle(handle);
+ if (javaElement != null && javaElement.getParent() != null) {
+ return getHandleIdentifier(javaElement.getParent());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ Object object = getObjectForHandle(handle);
+ if (object instanceof IJavaElement) {
+ IJavaElement element = (IJavaElement) object;
+ if (element instanceof IParent) {
+ IParent parent = (IParent) element;
+ IJavaElement[] children;
+ try {
+ children = parent.getChildren();
+ List<String> childHandles = new ArrayList<String>();
+ for (IJavaElement element2 : children) {
+ String childHandle = getHandleIdentifier(element2);
+ if (childHandle != null) {
+ childHandles.add(childHandle);
+ }
+ }
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ if (parentBridge != null && ContextCore.CONTENT_TYPE_RESOURCE.equals(parentBridge.getContentType())) {
+ if (element.getElementType() < IJavaElement.TYPE) {
+ List<String> resourceChildren = parentBridge.getChildHandles(handle);
+ if (!resourceChildren.isEmpty()) {
+ childHandles.addAll(resourceChildren);
+ }
+ }
+ }
+
+ return childHandles;
+ } catch (JavaModelException e) {
+ // NOTE: it would be better if this was not hard-wired but used the parent/child bridge mapping
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(ContextCore.CONTENT_TYPE_RESOURCE);
+ return parentBridge.getChildHandles(handle);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not get children", //$NON-NLS-1$
+ e));
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ try {
+ return JavaCore.create(handle);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.WARNING, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not create java element for handle: " + handle, t)); //$NON-NLS-1$
+ return null;
+ }
+ }
+
+ /**
+ * Uses resource-compatible path for projects
+ */
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object instanceof IJavaElement) {
+ return ((IJavaElement) object).getHandleIdentifier();
+ } else {
+ if (object instanceof IAdaptable) {
+ Object adapter = ((IAdaptable) object).getAdapter(IJavaElement.class);
+ if (adapter instanceof IJavaElement) {
+ return ((IJavaElement) adapter).getHandleIdentifier();
+ }
+ } else if (isWtpClass(object)) {
+ return getWtpElementHandle(object);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * TODO: remove after WTP 1.5.1 is generally available
+ */
+ private String getWtpElementHandle(Object object) {
+ Class<?> objectClass = object.getClass();
+ try {
+ Method getProjectMethod = objectClass.getMethod("getProject", new Class[0]); //$NON-NLS-1$
+ Object javaProject = getProjectMethod.invoke(object, new Object[0]);
+ if (javaProject instanceof IJavaProject) {
+ return ((IJavaElement) javaProject).getHandleIdentifier();
+ }
+ } catch (Exception e) {
+ // ignore
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private boolean isWtpClass(Object object) {
+ try {
+ return object != null && object.getClass().getSimpleName().equals("CompressedJavaProject"); //$NON-NLS-1$
+ } catch (Throwable t) {
+ // could have malformed name, see bug 165065
+ return false;
+ }
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof IJavaElement) {
+ return ((IJavaElement) object).getElementName();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ IJavaElement element = (IJavaElement) getObjectForHandle(handle);
+ if ((element instanceof IMember || element instanceof IType) && element.exists()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * TODO: figure out if the non IJavaElement stuff is needed
+ */
+ @Override
+ public boolean acceptsObject(Object object) {
+ if (object instanceof IResource) {
+ Object adapter = ((IResource) object).getAdapter(IJavaElement.class);
+ return adapter instanceof IJavaElement;
+ }
+
+ boolean accepts = object instanceof IJavaElement || object instanceof PackageFragmentRootContainer
+ || object instanceof ClassPathContainer.RequiredProjectWrapper || object instanceof JarEntryFile
+ || object instanceof IPackageFragment || object instanceof WorkingSet || isWtpClass(object);
+
+ return accepts;
+ }
+
+ /**
+ * Uses special rules for classpath containers since these do not have an associated interest, i.e. they're not
+ * IJavaElement(s).
+ */
+ @Override
+ public boolean canFilter(Object object) {
+ if (object instanceof ClassPathContainer.RequiredProjectWrapper) {
+ return true;
+ } else if (object instanceof PackageFragmentRootContainer) {
+ // since not in model, check if it contains anything interesting
+ PackageFragmentRootContainer container = (PackageFragmentRootContainer) object;
+
+ Object[] children = container.getChildren();
+ for (Object element2 : children) {
+ if (element2 instanceof JarPackageFragmentRoot) {
+ JarPackageFragmentRoot element = (JarPackageFragmentRoot) element2;
+ IInteractionElement node = ContextCore.getContextManager()
+ .getElement(element.getHandleIdentifier());
+ if (node != null && node.getInterest().isInteresting()) {
+ return false;
+ }
+ }
+ }
+ } else if (object instanceof WorkingSet) {
+ try {
+ WorkingSet workingSet = (WorkingSet) object;
+ IAdaptable[] elements = workingSet.getElements();
+ for (IAdaptable adaptable : elements) {
+ IInteractionElement interactionElement = ContextCore.getContextManager().getElement(
+ getHandleIdentifier(adaptable));
+ if (interactionElement != null && interactionElement.getInterest().isInteresting()) {
+ return false;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ IJavaElement element = (IJavaElement) getObjectForHandle(handle);
+ return element instanceof ICompilationUnit || element instanceof IClassFile;
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object object, int offset) {
+ IMarker marker;
+ if (object instanceof ConcreteMarker) {
+ marker = ((ConcreteMarker) object).getMarker();
+ } else if (object instanceof Marker) {
+ marker = (Marker) object;
+ } else {
+ return null;
+ }
+
+ try {
+ ICompilationUnit compilationUnit = null;
+ IResource resource = marker.getResource();
+ if (resource instanceof IFile) {
+ IFile file = (IFile) resource;
+ // TODO: get rid of file extension check
+ if (file.getFileExtension().equals("java")) { //$NON-NLS-1$
+ compilationUnit = JavaCore.createCompilationUnitFrom(file);
+ } else {
+ return null;
+ }
+ }
+ if (compilationUnit != null) {
+ // first try to resolve the character start, then the line number if not present
+ int charStart = 0;
+ Object attribute = marker.getAttribute(IMarker.CHAR_START, 0);
+ if (attribute instanceof Integer) {
+ charStart = ((Integer) attribute).intValue();
+ }
+ IJavaElement javaElement = null;
+ if (charStart != -1) {
+ javaElement = compilationUnit.getElementAt(charStart);
+ } else {
+ int lineNumber = 0;
+ Object lineNumberAttribute = marker.getAttribute(IMarker.LINE_NUMBER, 0);
+ if (lineNumberAttribute instanceof Integer) {
+ lineNumber = ((Integer) lineNumberAttribute).intValue();
+ }
+ if (lineNumber != -1) {
+ // could do finer granularity by uncommenting what's below, see bug 132092
+// Document document = new Document(compilationUnit.getSource());
+// IRegion region = document.getLineInformation(lineNumber);
+// javaElement = compilationUnit.getElementAt(region.getOffset());
+ javaElement = compilationUnit;
+ }
+ }
+
+ if (javaElement != null) {
+ if (javaElement instanceof IImportDeclaration) {
+ javaElement = javaElement.getParent().getParent();
+ }
+ return javaElement.getHandleIdentifier();
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ } catch (JavaModelException ex) {
+ if (!ex.isDoesNotExist()) {
+ ExceptionHandler.handle(ex, "error", "could not find java element"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return null;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not find element for: " //$NON-NLS-1$
+ + marker, t));
+ return null;
+ }
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ return getContentType();
+ }
+
+ /**
+ * Some copying from:
+ *
+ * @see org.eclipse.jdt.ui.ProblemsLabelDecorator
+ */
+ public boolean containsProblem(IInteractionElement node) {
+ try {
+ IJavaElement element = (IJavaElement) getObjectForHandle(node.getHandleIdentifier());
+ switch (element.getElementType()) {
+ case IJavaElement.JAVA_PROJECT:
+ case IJavaElement.PACKAGE_FRAGMENT_ROOT:
+ return getErrorTicksFromMarkers(element.getResource(), IResource.DEPTH_INFINITE, null);
+ case IJavaElement.PACKAGE_FRAGMENT:
+ case IJavaElement.COMPILATION_UNIT:
+ case IJavaElement.CLASS_FILE:
+ return getErrorTicksFromMarkers(element.getResource(), IResource.DEPTH_ONE, null);
+ case IJavaElement.PACKAGE_DECLARATION:
+ case IJavaElement.IMPORT_DECLARATION:
+ case IJavaElement.IMPORT_CONTAINER:
+ case IJavaElement.TYPE:
+ case IJavaElement.INITIALIZER:
+ case IJavaElement.METHOD:
+ case IJavaElement.FIELD:
+ case IJavaElement.LOCAL_VARIABLE:
+ ICompilationUnit cu = (ICompilationUnit) element.getAncestor(IJavaElement.COMPILATION_UNIT);
+ if (cu != null) {
+ return getErrorTicksFromMarkers(element.getResource(), IResource.DEPTH_ONE, null);
+ }
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+ return false;
+ }
+
+ private boolean getErrorTicksFromMarkers(IResource res, int depth, ISourceReference sourceElement)
+ throws CoreException {
+ if (res == null || !res.isAccessible()) {
+ return false;
+ }
+ IMarker[] markers = res.findMarkers(IMarker.PROBLEM, true, depth);
+ if (markers != null) {
+ for (IMarker curr : markers) {
+ if (sourceElement == null) {
+ int priority = curr.getAttribute(IMarker.SEVERITY, -1);
+ if (priority == IMarker.SEVERITY_ERROR) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiBridge.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiBridge.java
new file mode 100644
index 0000000..fb4d6ee
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiBridge.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * Remy Chi Jian Suen - Bug 256071 Reduce/remove reflection usage in Java bridge
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaUiBridge extends AbstractContextUiBridge {
+
+ @Override
+ public void open(IInteractionElement node) {
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+ if (javaElement == null || !javaElement.exists()) {
+ return;
+ }
+ try {
+ IEditorPart part = JavaUI.openInEditor(javaElement);
+ JavaUI.revealInEditor(part, javaElement);
+ } catch (Throwable t) {
+ StatusHandler.fail(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not open editor for: " //$NON-NLS-1$
+ + node, t));
+ }
+ }
+
+ @Override
+ public void close(IInteractionElement node) {
+ try {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>(4);
+ for (IEditorReference reference : page.getEditorReferences()) {
+ try {
+ IJavaElement input = (IJavaElement) reference.getEditorInput().getAdapter(IJavaElement.class);
+ if (input != null && node.getHandleIdentifier().equals(input.getHandleIdentifier())) {
+ toClose.add(reference);
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ if (toClose.size() > 0) {
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not auto close editor", t)); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return editorPart instanceof JavaEditor;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ Object adapter = input.getAdapter(IJavaElement.class);
+ if (adapter instanceof IJavaElement) {
+ IJavaElement javaElement = (IJavaElement) adapter;
+ String handle = ContextCore.getStructureBridge(javaElement).getHandleIdentifier(javaElement);
+ return ContextCore.getContextManager().getElement(handle);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editorPart) {
+ if (editorPart == null) {
+ return null;
+ }
+ List<TreeViewer> viewers = new ArrayList<TreeViewer>();
+ Object out = editorPart.getAdapter(IContentOutlinePage.class);
+ if (out instanceof Page) {
+ Page page = (Page) out;
+ if (page.getControl() != null) {
+ IWorkbenchSite site = page.getSite();
+ if (site != null) {
+ ISelectionProvider provider = site.getSelectionProvider();
+ if (provider instanceof TreeViewer) {
+ viewers.add((TreeViewer) provider);
+ }
+ }
+ }
+ }
+ return viewers;
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ if (editor instanceof JavaEditor) {
+ TextSelection textSelection = selection;
+ try {
+ if (selection != null) {
+ return SelectionConverter.resolveEnclosingElement((JavaEditor) editor, textSelection);
+ } else {
+ Object element = ((JavaEditor) editor).getEditorInput().getAdapter(IJavaElement.class);
+ if (element instanceof IJavaElement) {
+ return element;
+ }
+ }
+ } catch (JavaModelException e) {
+ // ignore
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return JavaStructureBridge.CONTENT_TYPE;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiBridgePlugin.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiBridgePlugin.java
new file mode 100644
index 0000000..bf8dbd1
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiBridgePlugin.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+import org.eclipse.mylyn.internal.java.ui.editor.ActiveFoldingListener;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.progress.UIJob;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class JavaUiBridgePlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.java.ui"; //$NON-NLS-1$
+
+ public static final String AUTO_FOLDING_ENABLED = "org.eclipse.mylyn.context.ui.editor.folding.enabled"; //$NON-NLS-1$
+
+ private static JavaUiBridgePlugin INSTANCE;
+
+ private ActiveFoldingEditorTracker editorTracker;
+
+ private TypeHistoryManager typeHistoryManager;
+
+ private LandmarkMarkerManager landmarkMarkerManager;
+
+ private JavaEditingMonitor javaEditingMonitor;
+
+ private InterestUpdateDeltaListener javaElementChangeListener;
+
+ private static final String MYLYN_PREVIOUS_RUN = "org.eclipse.mylyn.ui.first.run.0_4_9"; //$NON-NLS-1$
+
+ private static final String MYLYN_RUN_COUNT = "org.eclipse.mylyn.java.ui.run.count.3_1_0"; //$NON-NLS-1$
+
+ private static final String NUM_COMPUTERS_PREF_KEY = "content_assist_number_of_computers"; //$NON-NLS-1$
+
+ public JavaUiBridgePlugin() {
+ }
+
+ /**
+ * Startup order is critical.
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ INSTANCE = this;
+
+ IPreferenceStore javaPrefs = JavaPlugin.getDefault().getPreferenceStore();
+ // NOTE: moved out of wizard and first task activation to avoid bug 194766
+ int count = getPreferenceStore().getInt(MYLYN_RUN_COUNT);
+ if (count < 1) {
+ getPreferenceStore().setValue(MYLYN_RUN_COUNT, count + 1);
+
+ // Mylyn 3.1 removes 2 computers, migrate JDT setting on first run to avoid prevent JDT from displaying a warning dialog
+ if (count == 0 && getPreferenceStore().contains(MYLYN_PREVIOUS_RUN)) {
+ if (javaPrefs.contains(NUM_COMPUTERS_PREF_KEY)) {
+ int lastNumberOfComputers = javaPrefs.getInt(NUM_COMPUTERS_PREF_KEY);
+ if (lastNumberOfComputers > 0) {
+ javaPrefs.putValue(NUM_COMPUTERS_PREF_KEY, Integer.toString(lastNumberOfComputers - 2));
+ }
+ }
+ }
+
+ // try installing Task-Focused content assist twice
+ new UIJob("Initialize Content Assist") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ IPreferenceStore store = JavaPlugin.getDefault().getPreferenceStore();
+ JavaUiUtil.installContentAssist(store, true);
+ return Status.OK_STATUS;
+ }
+ }.schedule();
+ }
+
+ // the Task-Focused category should be disabled if the user reverts to the default
+ String defaultValue = javaPrefs.getDefaultString(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES);
+ javaPrefs.setDefault(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES, defaultValue
+ + JavaUiUtil.ASSIST_MYLYN_ALL + JavaUiUtil.SEPARATOR_CODEASSIST);
+ }
+
+ private void lazyStart() {
+ landmarkMarkerManager = new LandmarkMarkerManager();
+ ContextCore.getContextManager().addListener(landmarkMarkerManager);
+
+ javaEditingMonitor = new JavaEditingMonitor();
+ MonitorUi.getSelectionMonitors().add(javaEditingMonitor);
+ installEditorTracker(PlatformUI.getWorkbench());
+
+ javaElementChangeListener = new InterestUpdateDeltaListener();
+ JavaCore.addElementChangedListener(javaElementChangeListener);
+
+ try {
+ typeHistoryManager = new TypeHistoryManager();
+ ContextCore.getContextManager().addListener(typeHistoryManager);
+ } catch (Throwable t) {
+ // FIXME review error message
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not install type history manager: incompatible Eclipse version", t)); //$NON-NLS-1$
+ }
+ }
+
+ private void lazyStop() {
+ if (typeHistoryManager != null) {
+ ContextCore.getContextManager().removeListener(typeHistoryManager);
+ }
+ if (landmarkMarkerManager != null) {
+ ContextCore.getContextManager().removeListener(landmarkMarkerManager);
+ }
+ if (javaEditingMonitor != null) {
+ MonitorUi.getSelectionMonitors().remove(javaEditingMonitor);
+ }
+ if (javaElementChangeListener != null) {
+ JavaCore.removeElementChangedListener(javaElementChangeListener);
+ }
+ // TODO: uninstall editor tracker
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ lazyStop();
+
+ super.stop(context);
+ INSTANCE = null;
+ }
+
+ private void installEditorTracker(IWorkbench workbench) {
+ editorTracker = new ActiveFoldingEditorTracker();
+ editorTracker.install(workbench);
+ // workbench.addWindowListener(editorTracker);
+ // IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
+ // for (int i = 0; i < windows.length; i++) {
+ // windows[i].addPageListener(editorTracker);
+ // IWorkbenchPage[] pages = windows[i].getPages();
+ // for (int j = 0; j < pages.length; j++) {
+ // pages[j].addPartListener(editorTracker);
+ // }
+ // }
+
+ // update editors that are already opened
+ for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {
+ IWorkbenchPage page = w.getActivePage();
+ if (page != null) {
+ IEditorReference[] references = page.getEditorReferences();
+ for (IEditorReference reference : references) {
+ IEditorPart part = reference.getEditor(false);
+ if (part != null && part instanceof JavaEditor) {
+ JavaEditor editor = (JavaEditor) part;
+ editorTracker.registerEditor(editor);
+ ActiveFoldingListener.resetProjection(editor);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static JavaUiBridgePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in relative path.
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin(ID_PLUGIN, path);
+ }
+
+ /**
+ * For testing.
+ */
+ public ActiveFoldingEditorTracker getEditorTracker() {
+ return editorTracker;
+ }
+
+ public static class JavaUiBridgeStartup implements IContextUiStartup {
+
+ public void lazyStartup() {
+ JavaUiBridgePlugin.getDefault().lazyStart();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiUtil.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiUtil.java
new file mode 100644
index 0000000..6a97e7c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/JavaUiUtil.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.text.java.CompletionProposalCategory;
+import org.eclipse.jdt.internal.ui.text.java.CompletionProposalComputerRegistry;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaUiUtil {
+
+ static final String SEPARATOR_CODEASSIST = "\0"; //$NON-NLS-1$
+
+ public static final String ASSIST_MYLYN_ALL = "org.eclipse.mylyn.java.ui.javaAllProposalCategory"; //$NON-NLS-1$
+
+// public static final String ASSIST_MYLYN_TYPE = "org.eclipse.mylyn.java.javaTypeProposalCategory"; //$NON-NLS-1$
+
+// public static final String ASSIST_MYLYN_NOTYPE = "org.eclipse.mylyn.java.javaNoTypeProposalCategory"; //$NON-NLS-1$
+
+ public static final String ASSIST_JDT_ALL = "org.eclipse.jdt.ui.javaAllProposalCategory"; //$NON-NLS-1$
+
+ public static final String ASSIST_JDT_TYPE = "org.eclipse.jdt.ui.javaTypeProposalCategory"; //$NON-NLS-1$
+
+ public static final String ASSIST_JDT_NOTYPE = "org.eclipse.jdt.ui.javaNoTypeProposalCategory"; //$NON-NLS-1$
+
+ private static final String ASSIST_JDT_TEMPLATE = "org.eclipse.jdt.ui.templateProposalCategory"; //$NON-NLS-1$
+
+ public static boolean isDefaultAssistActive(String computerId) {
+ if (JavaUiUtil.ASSIST_JDT_ALL.equals(computerId)) {
+ CompletionProposalCategory category = getProposalCategory(computerId);
+ return (category != null) ? category.isEnabled() && category.isIncluded() : false;
+ }
+ Set<String> disabledIds = getDisabledIds(JavaPlugin.getDefault().getPreferenceStore());
+ return !disabledIds.contains(computerId);
+ }
+
+ public static CompletionProposalCategory getProposalCategory(String computerId) {
+ List<?> computers = CompletionProposalComputerRegistry.getDefault().getProposalCategories();
+ for (Object object : computers) {
+ CompletionProposalCategory proposalCategory = (CompletionProposalCategory) object;
+ if (computerId.equals((proposalCategory).getId())) {
+ return proposalCategory;
+ }
+ }
+ return null;
+ }
+
+ public static void installContentAssist(IPreferenceStore javaPrefs, boolean mylynContentAssist) {
+ Set<String> disabledIds = getDisabledIds(javaPrefs);
+ if (!mylynContentAssist) {
+ disabledIds.remove(ASSIST_JDT_ALL);
+ disabledIds.remove(ASSIST_JDT_TYPE);
+ disabledIds.remove(ASSIST_JDT_NOTYPE);
+ //disabledIds.remove(ASSIST_JDT_TEMPLATE);
+ disabledIds.add(ASSIST_MYLYN_ALL);
+ //disabledIds.add(ASSIST_MYLYN_TYPE);
+ //disabledIds.add(ASSIST_MYLYN_TEMPLATE);
+ } else {
+ disabledIds.add(ASSIST_JDT_ALL);
+ disabledIds.add(ASSIST_JDT_TYPE);
+ disabledIds.add(ASSIST_JDT_NOTYPE);
+ // re-enable, Mylyn versions <3.1 had a focused template computer that has been removed
+ disabledIds.remove(ASSIST_JDT_TEMPLATE);
+ disabledIds.remove(ASSIST_MYLYN_ALL);
+ //disabledIds.remove(ASSIST_MYLYN_NOTYPE);
+ //disabledIds.remove(ASSIST_MYLYN_TYPE);
+ //disabledIds.remove(ASSIST_MYLYN_TEMPLATE);
+ }
+ StringBuilder sb = new StringBuilder();
+ for (String id : disabledIds) {
+ sb.append(id);
+ sb.append(SEPARATOR_CODEASSIST);
+ }
+ javaPrefs.setValue(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES, sb.toString());
+
+ CompletionProposalComputerRegistry.getDefault().reload();
+ }
+
+ public static Set<String> getDisabledIds(IPreferenceStore javaPrefs) {
+ String oldValue = javaPrefs.getString(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES);
+ StringTokenizer tokenizer = new StringTokenizer(oldValue, SEPARATOR_CODEASSIST);
+ Set<String> disabledIds = new HashSet<String>();
+ while (tokenizer.hasMoreTokens()) {
+ disabledIds.add((String) tokenizer.nextElement());
+ }
+ return disabledIds;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/LandmarkMarkerManager.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/LandmarkMarkerManager.java
new file mode 100644
index 0000000..4d7a0eb
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/LandmarkMarkerManager.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.ISourceReference;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+
+/**
+ * @author Mik Kersten
+ */
+public class LandmarkMarkerManager extends AbstractContextListener {
+
+ private static final String ID_MARKER_LANDMARK = "org.eclipse.mylyn.context.ui.markers.landmark"; //$NON-NLS-1$
+
+ private final Map<IInteractionElement, Long> markerMap = new HashMap<IInteractionElement, Long>();
+
+ public LandmarkMarkerManager() {
+ super();
+ }
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ case DEACTIVATED:
+ modelUpdated();
+ break;
+ case CLEARED:
+ if (event.isActiveContext()) {
+ modelUpdated();
+ }
+ break;
+ case LANDMARKS_ADDED:
+ for (IInteractionElement element : event.getElements()) {
+ addLandmarkMarker(element);
+ }
+ break;
+ case LANDMARKS_REMOVED:
+ for (IInteractionElement element : event.getElements()) {
+ removeLandmarkMarker(element);
+ }
+ break;
+
+ }
+ }
+
+ private void modelUpdated() {
+ try {
+ for (IInteractionElement node : markerMap.keySet()) {
+ removeLandmarkMarker(node);
+ }
+ markerMap.clear();
+ for (IInteractionElement node : ContextCore.getContextManager().getActiveLandmarks()) {
+ addLandmarkMarker(node);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not update landmark markers", t)); //$NON-NLS-1$
+ }
+ }
+
+ public void addLandmarkMarker(final IInteractionElement node) {
+ if (node == null || node.getContentType() == null) {
+ return;
+ }
+ if (node.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
+ final IJavaElement element = JavaCore.create(node.getHandleIdentifier());
+ if (!element.exists()) {
+ return;
+ }
+ if (element instanceof IMember) {
+ try {
+ final ISourceRange range = ((IMember) element).getNameRange();
+ final IResource resource = element.getUnderlyingResource();
+ if (resource instanceof IFile) {
+ IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ IMarker marker = resource.createMarker(ID_MARKER_LANDMARK);
+ if (marker != null && range != null) {
+ marker.setAttribute(IMarker.CHAR_START, range.getOffset());
+ marker.setAttribute(IMarker.CHAR_END, range.getOffset() + range.getLength());
+ marker.setAttribute(IMarker.MESSAGE, "Mylyn Landmark"); //$NON-NLS-1$
+ marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
+ markerMap.put(node, marker.getId());
+ }
+ }
+ };
+ resource.getWorkspace().run(runnable, null);
+ }
+ } catch (JavaModelException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not update marker", e)); //$NON-NLS-1$
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not update marker", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ public void removeLandmarkMarker(final IInteractionElement node) {
+ if (node == null) {
+ return;
+ }
+ if (node.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
+ IJavaElement element = JavaCore.create(node.getHandleIdentifier());
+ if (!element.exists()) {
+ return;
+ }
+ if (element.getAncestor(IJavaElement.COMPILATION_UNIT) != null // stuff
+ // from .class files
+ && element instanceof ISourceReference) {
+ try {
+ final IResource resource = element.getUnderlyingResource();
+ IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ if (resource != null) {
+ try {
+ if (markerMap.containsKey(node)) {
+ long id = markerMap.get(node);
+ IMarker marker = resource.getMarker(id);
+ if (marker != null) {
+ marker.delete();
+ }
+ }
+ } catch (NullPointerException e) {
+ // FIXME avoid NPE
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not update marker", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ };
+ resource.getWorkspace().run(runnable, null);
+ } catch (JavaModelException e) {
+ // ignore the Java Model errors
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not update landmark marker", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/TypeHistoryManager.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/TypeHistoryManager.java
new file mode 100644
index 0000000..9d73757
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/TypeHistoryManager.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.TypeNameMatch;
+import org.eclipse.jdt.internal.core.search.JavaSearchTypeNameMatch;
+import org.eclipse.jdt.internal.corext.util.OpenTypeHistory;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class TypeHistoryManager extends AbstractContextListener {
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ clearTypeHistory();
+ for (IInteractionElement node : event.getContext().getInteresting()) {
+ updateTypeHistory(node, true);
+ }
+ break;
+ case DEACTIVATED:
+ clearTypeHistory();
+ break;
+ case CLEARED:
+ if (event.isActiveContext()) {
+ clearTypeHistory();
+ }
+ break;
+ case INTEREST_CHANGED:
+ for (IInteractionElement node : event.getElements()) {
+ updateTypeHistory(node, true);
+ }
+ break;
+ case ELEMENTS_DELETED:
+ for (IInteractionElement element : event.getElements()) {
+ updateTypeHistory(element, false);
+ }
+ break;
+ }
+ }
+
+ /**
+ * Path has to be compatible with ITypeNameRequestor
+ */
+ private void updateTypeHistory(IInteractionElement node, boolean add) {
+ IJavaElement element = JavaCore.create(node.getHandleIdentifier());
+ if (element instanceof IType) {
+ IType type = (IType) element;
+ try {
+ if (type.exists() && !type.isAnonymous() && !isAspectjType(type)) {
+ JavaSearchTypeNameMatch typeNameMatch = new JavaSearchTypeNameMatch(type, type.getFlags());
+
+ if (add && !OpenTypeHistory.getInstance().contains(typeNameMatch)) {
+ OpenTypeHistory.getInstance().accessed(typeNameMatch);
+ } else {
+ OpenTypeHistory.getInstance().remove(typeNameMatch);
+ }
+ }
+ } catch (JavaModelException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Failed to update history for a type", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * HACK: to avoid adding AspectJ types, for example:
+ *
+ * class: =TJP Example/src<tjp{Demo.java[Demo aspect: =TJP Example/src<tjp*GetInfo.aj}GetInfo
+ */
+ private boolean isAspectjType(IType type) {
+ if (type.getHandleIdentifier().indexOf('}') != -1) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Public for testing
+ */
+ public void clearTypeHistory() {
+ TypeNameMatch[] typeInfos = OpenTypeHistory.getInstance().getTypeInfos();
+ for (TypeNameMatch typeInfo : typeInfos) {
+ OpenTypeHistory.getInstance().remove(typeInfo);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FilterMembersAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FilterMembersAction.java
new file mode 100644
index 0000000..b8be66e
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FilterMembersAction.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.internal.java.ui.JavaDeclarationsFilter;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class FilterMembersAction extends Action implements IViewActionDelegate {
+
+ public static final String PREF_ID = "org.eclipse.mylyn.java.ui.explorer.filter.members"; //$NON-NLS-1$
+
+ public FilterMembersAction() {
+ super();
+ // setChecked(true);
+ // try {
+ // boolean checked=
+ // ContextCore.getPreferenceStore().getBoolean(PREF_ID);
+ // valueChanged(true, true);
+ // } catch (Exception e) {
+ //
+ // }
+ }
+
+ public void run(IAction action) {
+ valueChanged(isChecked(), true);
+
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ if (store) {
+ JavaUiBridgePlugin.getDefault().getPreferenceStore().setValue(PREF_ID, on);
+ }
+
+ setChecked(true);
+ PackageExplorerPart packageExplorer = PackageExplorerPart.getFromActivePerspective();
+ ViewerFilter existingFilter = null;
+ for (int i = 0; i < packageExplorer.getTreeViewer().getFilters().length; i++) {
+ ViewerFilter filter = packageExplorer.getTreeViewer().getFilters()[i];
+ if (filter instanceof JavaDeclarationsFilter) {
+ existingFilter = filter;
+ }
+ }
+ if (existingFilter != null) {
+ packageExplorer.getTreeViewer().removeFilter(existingFilter);
+ } else {
+ packageExplorer.getTreeViewer().addFilter(new JavaDeclarationsFilter());
+ }
+ }
+
+ public void init(IViewPart view) {
+ // don't need to do anything on init
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // don't care when the selection changes
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusBreakpointsViewAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusBreakpointsViewAction.java
new file mode 100644
index 0000000..68e20be
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusBreakpointsViewAction.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylyn.ide.ui.AbstractFocusMarkerViewAction;
+import org.eclipse.mylyn.internal.java.ui.BreakpointsInterestFilter;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusBreakpointsViewAction extends AbstractFocusMarkerViewAction {
+
+ public FocusBreakpointsViewAction() {
+ super(new BreakpointsInterestFilter(), true, true, false);
+ }
+
+ @Override
+ public final List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ IViewPart viewPart = super.getPartForAction();
+ if (viewPart instanceof BreakpointsView) {
+ BreakpointsView view = (BreakpointsView) viewPart;
+ updateMarkerViewLabelProvider(view.getCheckboxViewer());
+ viewers.add(view.getCheckboxViewer());
+ }
+ return viewers;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusBrowsingPerspectiveAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusBrowsingPerspectiveAction.java
new file mode 100644
index 0000000..7ed228f
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusBrowsingPerspectiveAction.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * Remy Chi Jian Suen - Bug 256071 Reduce/remove reflection usage in Java bridge
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+/**
+ * This class is a bit weird since it doesn't obey the same contract as the other subclasses
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class FocusBrowsingPerspectiveAction extends AbstractFocusViewAction implements IWorkbenchWindowActionDelegate {
+
+ private final String[] viewNames = { "org.eclipse.jdt.ui.MembersView", "org.eclipse.jdt.ui.PackagesView", //$NON-NLS-1$ //$NON-NLS-2$
+ "org.eclipse.jdt.ui.TypesView" }; //$NON-NLS-1$
+
+ private final String[] classNames = { "org.eclipse.jdt.internal.ui.browsing.MembersView", //$NON-NLS-1$
+ "org.eclipse.jdt.internal.ui.browsing.PackagesView", "org.eclipse.jdt.internal.ui.browsing.TypesView" }; //$NON-NLS-1$ //$NON-NLS-2$
+
+ private IWorkbenchWindow initWindow;
+
+ public FocusBrowsingPerspectiveAction() {
+ super(new InterestFilter(), true, true, false);
+ globalPrefId = PREF_ID_PREFIX + "javaBrowsing"; //$NON-NLS-1$
+ }
+
+ public void init(IWorkbenchWindow window) {
+ initWindow = window;
+ IWorkbenchPage activePage = initWindow.getActivePage();
+ super.viewPart = activePage.findView(viewNames[0]);
+ }
+
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ for (int i = 0; i < viewNames.length; i++) {
+ StructuredViewer viewer = getBrowsingViewerFromActivePerspective(viewNames[i], classNames[i]);
+ if (viewer != null) {
+ viewers.add(viewer);
+ }
+ }
+ return viewers;
+ }
+
+ private StructuredViewer getBrowsingViewerFromActivePerspective(String id, String className) {
+ IWorkbenchPage activePage = initWindow.getActivePage();
+ if (activePage == null) {
+ return null;
+ }
+ try {
+ IViewPart viewPart = activePage.findView(id);
+ if (viewPart == null) {
+ // view is not open, just return null
+ return null;
+ }
+
+ IWorkbenchPartSite site = viewPart.getSite();
+ if (site == null) {
+ // no site found, view still being initialized, return null
+ return null;
+ }
+
+ ISelectionProvider provider = site.getSelectionProvider();
+ if (!(provider instanceof StructuredViewer)) {
+ // provider not a StructuredViewer, return null
+ return null;
+ }
+
+ return (StructuredViewer) provider;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not get \"" + id //$NON-NLS-1$
+ + "\" view tree viewer", e)); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ // TODO Auto-generated method stub
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusDebugViewAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusDebugViewAction.java
new file mode 100644
index 0000000..235b4fc
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusDebugViewAction.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.debug.internal.ui.views.launch.LaunchView;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusDebugViewAction extends AbstractFocusViewAction {
+
+ public FocusDebugViewAction() {
+ super(new InterestFilter(), true, true, false);
+ }
+
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ IViewPart view = super.getPartForAction();
+ if (view instanceof LaunchView) {
+ LaunchView launchView = (LaunchView) view;
+ viewers.add((StructuredViewer) launchView.getViewer());
+ }
+ return viewers;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusPackageExplorerAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusPackageExplorerAction.java
new file mode 100644
index 0000000..abf1f93
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/FocusPackageExplorerAction.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jdt.internal.ui.packageview.ToggleLinkingAction;
+import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.context.ui.AbstractAutoFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.java.ui.JavaDeclarationsFilter;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusPackageExplorerAction extends AbstractAutoFocusViewAction {
+
+ public FocusPackageExplorerAction() {
+ super(new InterestFilter(), true, true, true);
+ }
+
+ @Override
+ protected ISelection resolveSelection(IEditorPart part, ITextSelection changedSelection, StructuredViewer viewer)
+ throws CoreException {
+ Object elementToSelect = null;
+ if (changedSelection instanceof TextSelection && part instanceof JavaEditor) {
+ TextSelection textSelection = (TextSelection) changedSelection;
+ IJavaElement javaElement = SelectionConverter.resolveEnclosingElement((JavaEditor) part, textSelection);
+ if (javaElement != null) {
+ elementToSelect = javaElement;
+ }
+ }
+
+ if (elementToSelect != null) {
+ StructuredSelection currentSelection = (StructuredSelection) viewer.getSelection();
+ if (currentSelection.size() <= 1) {
+ if (elementToSelect instanceof IMember) {
+ if (viewer.getContentProvider() instanceof StandardJavaElementContentProvider) {
+ if (!((StandardJavaElementContentProvider) viewer.getContentProvider()).getProvideMembers()) {
+ elementToSelect = ((IMember) elementToSelect).getCompilationUnit();
+ return new StructuredSelection(elementToSelect);
+ }
+ }
+
+ for (ViewerFilter filter : Arrays.asList(viewer.getFilters())) {
+ if (filter instanceof JavaDeclarationsFilter) {
+ elementToSelect = ((IMember) elementToSelect).getCompilationUnit();
+ return new StructuredSelection(elementToSelect);
+ }
+ }
+ }
+ }
+ return new StructuredSelection(elementToSelect);
+ } else {
+ return null;
+ }
+ }
+
+ // TODO: should have better way of doing this
+ @Override
+ protected void setManualFilteringAndLinkingEnabled(boolean enabled) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof PackageExplorerPart) {
+ for (IContributionItem item : ((PackageExplorerPart) part).getViewSite()
+ .getActionBars()
+ .getToolBarManager()
+ .getItems()) {
+ if (item instanceof ActionContributionItem) {
+ ActionContributionItem actionItem = (ActionContributionItem) item;
+ if (actionItem.getAction() instanceof ToggleLinkingAction) {
+ actionItem.getAction().setEnabled(enabled);
+ }
+ }
+ }
+ for (IContributionItem item : ((PackageExplorerPart) part).getViewSite()
+ .getActionBars()
+ .getMenuManager()
+ .getItems()) {
+ if (item instanceof ActionContributionItem) {
+ ActionContributionItem actionItem = (ActionContributionItem) item;
+ // TODO: file bug asking for extensibility
+ if (actionItem.getAction().getClass().getSimpleName().equals("ShowFilterDialogAction")) { //$NON-NLS-1$
+ actionItem.getAction().setEnabled(enabled);
+ }
+ }
+ // NOTE: turning off dynamically contributed filter items is not currently feasible
+// else if (item instanceof ContributionItem) {
+// ContributionItem contributionItem = (ContributionItem) item;
+//
+// if (contributionItem.getClass().getSimpleName().equals("FilterActionMenuContributionItem")) {
+// try {
+// Class<?> clazz = contributionItem.getClass();
+// Field field = clazz.getDeclaredField("fActionGroup");
+// field.setAccessible(true);
+// Object object = field.get(contributionItem);
+// if (object instanceof CustomFiltersActionGroup) {
+// CustomFiltersActionGroup group = (CustomFiltersActionGroup) object;
+// group.setFilters(new String[] { });
+// }
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+// }
+ }
+ }
+ }
+
+ @Override
+ protected void setDefaultLinkingEnabled(boolean on) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof PackageExplorerPart) {
+ ((PackageExplorerPart) part).setLinkingEnabled(on);
+ }
+ }
+
+ @Override
+ protected boolean isDefaultLinkingEnabled() {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof PackageExplorerPart) {
+ return ((PackageExplorerPart) part).isLinkingEnabled();
+ }
+ return false;
+ }
+
+ @Override
+ public List<StructuredViewer> getViewers() {
+ List<StructuredViewer> viewers = new ArrayList<StructuredViewer>();
+ // TODO: get from super
+ IViewPart part = super.getPartForAction();
+ if (part instanceof PackageExplorerPart) {
+ viewers.add(((PackageExplorerPart) part).getTreeViewer());
+ }
+ return viewers;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/Messages.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/Messages.java
new file mode 100644
index 0000000..8bf91a5
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.java.ui.actions.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ToggleActiveFoldingAction_Active_folding;
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/ShowFilteredChildrenAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/ShowFilteredChildrenAction.java
new file mode 100644
index 0000000..686b2b1
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/ShowFilteredChildrenAction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.internal.context.ui.BrowseFilteredListener;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+ at Deprecated
+public class ShowFilteredChildrenAction extends Action implements IObjectActionDelegate, IViewActionDelegate {
+
+ private BrowseFilteredListener browseFilteredListener;
+
+ private TreeViewer treeViewer;
+
+ private IStructuredSelection selection;
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ if (targetPart instanceof PackageExplorerPart) {
+ treeViewer = ((PackageExplorerPart) targetPart).getTreeViewer();
+ browseFilteredListener = new BrowseFilteredListener(treeViewer);
+ }
+ }
+
+ public void init(IViewPart targetPart) {
+ if (targetPart instanceof PackageExplorerPart) {
+ treeViewer = ((PackageExplorerPart) targetPart).getTreeViewer();
+ browseFilteredListener = new BrowseFilteredListener(treeViewer);
+ }
+ }
+
+ public void run(IAction action) {
+ if (selection != null) {
+ browseFilteredListener.unfilterSelection(treeViewer, selection);
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ this.selection = (IStructuredSelection) selection;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/ToggleActiveFoldingAction.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/ToggleActiveFoldingAction.java
new file mode 100644
index 0000000..2a73499
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/ToggleActiveFoldingAction.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.actions;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IActionDelegate2;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleActiveFoldingAction extends Action implements IWorkbenchWindowActionDelegate, IActionDelegate2 {
+
+ private static ToggleActiveFoldingAction INSTANCE;
+
+ private IAction parentAction = null;
+
+ public ToggleActiveFoldingAction() {
+ super();
+ INSTANCE = this;
+ setText(Messages.ToggleActiveFoldingAction_Active_folding);
+ setImageDescriptor(TasksUiImages.CONTEXT_FOCUS);
+ }
+
+ public static void toggleFolding(boolean on) {
+ if (INSTANCE.parentAction != null) {
+ INSTANCE.valueChanged(INSTANCE.parentAction, on);
+ }
+ }
+
+ public void run(IAction action) {
+ valueChanged(action, action.isChecked());
+ }
+
+ private void valueChanged(IAction action, final boolean on) {
+ try {
+ if (on) {
+ JavaPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.EDITOR_FOLDING_ENABLED, true);
+ }
+ action.setChecked(on);
+ JavaUiBridgePlugin.getDefault().getPreferenceStore().setValue(JavaUiBridgePlugin.AUTO_FOLDING_ENABLED, on);
+ } catch (Throwable t) {
+ StatusHandler.fail(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not enable editor management", t)); //$NON-NLS-1$
+ }
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ // don't care when the active editor changes
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // don't care when the selection changes
+ }
+
+ public void init(IAction action) {
+ this.parentAction = action;
+ valueChanged(action, JavaUiBridgePlugin.getDefault().getPreferenceStore().getBoolean(
+ JavaUiBridgePlugin.AUTO_FOLDING_ENABLED));
+ }
+
+ public void dispose() {
+ // don't need to do anything
+
+ }
+
+ public void runWithEvent(IAction action, Event event) {
+ run(action);
+ }
+
+ public void init(IWorkbenchWindow window) {
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/messages.properties b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/messages.properties
new file mode 100644
index 0000000..9d1daaa
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/actions/messages.properties
@@ -0,0 +1 @@
+ToggleActiveFoldingAction_Active_folding=Active folding
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/AbstractEditorHyperlinkDetector.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/AbstractEditorHyperlinkDetector.java
new file mode 100644
index 0000000..a27d428
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/AbstractEditorHyperlinkDetector.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractEditorHyperlinkDetector implements IHyperlinkDetector {
+
+ private ITextEditor editor;
+
+ public abstract IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
+ boolean canShowMultipleHyperlinks);
+
+ public ITextEditor getEditor() {
+ return editor;
+ }
+
+ public void setEditor(ITextEditor editor) {
+ this.editor = editor;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/ActiveFoldingListener.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/ActiveFoldingListener.java
new file mode 100644
index 0000000..05335c8
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/ActiveFoldingListener.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
+import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IParent;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jdt.ui.text.folding.IJavaFoldingStructureProvider;
+import org.eclipse.jdt.ui.text.folding.IJavaFoldingStructureProviderExtension;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class ActiveFoldingListener extends AbstractContextListener {
+
+ private final JavaEditor editor;
+
+ private IJavaFoldingStructureProviderExtension updater;
+
+ private static JavaStructureBridge bridge = (JavaStructureBridge) ContextCore.getStructureBridge(JavaStructureBridge.CONTENT_TYPE);
+
+ private boolean enabled = false;
+
+ private final IPropertyChangeListener PREFERENCE_LISTENER = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(JavaUiBridgePlugin.AUTO_FOLDING_ENABLED)) {
+ if (event.getNewValue().equals(Boolean.TRUE.toString())) {
+ enabled = true;
+ } else {
+ enabled = false;
+ }
+ updateFolding();
+ }
+ }
+ };
+
+ public ActiveFoldingListener(JavaEditor editor) {
+ this.editor = editor;
+ ContextCore.getContextManager().addListener(this);
+ JavaUiBridgePlugin.getDefault().getPluginPreferences().addPropertyChangeListener(PREFERENCE_LISTENER);
+
+ enabled = JavaUiBridgePlugin.getDefault().getPreferenceStore().getBoolean(
+ JavaUiBridgePlugin.AUTO_FOLDING_ENABLED);
+ try {
+ Object adapter = editor.getAdapter(IJavaFoldingStructureProvider.class);
+ if (adapter instanceof IJavaFoldingStructureProviderExtension) {
+ updater = (IJavaFoldingStructureProviderExtension) adapter;
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not install active folding on provider: " + adapter + ", must extend " //$NON-NLS-1$ //$NON-NLS-2$
+ + IJavaFoldingStructureProviderExtension.class.getName()));
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not install auto folding, reflection denied", e)); //$NON-NLS-1$
+ }
+ updateFolding();
+ }
+
+ public void dispose() {
+ ContextCore.getContextManager().removeListener(this);
+ JavaUiBridgePlugin.getDefault().getPluginPreferences().removePropertyChangeListener(PREFERENCE_LISTENER);
+ }
+
+ public static void resetProjection(JavaEditor javaEditor) {
+ // XXX 3.3 remove?
+ }
+
+ public void updateFolding() {
+ if (!enabled || !ContextCore.getContextManager().isContextActive()) {
+ editor.resetProjection();
+ } else if (editor.getEditorInput() == null) {
+ return;
+ } else {
+ try {
+ List<IJavaElement> toExpand = new ArrayList<IJavaElement>();
+ List<IJavaElement> toCollapse = new ArrayList<IJavaElement>();
+
+ IJavaElement element = JavaUI.getEditorInputJavaElement(editor.getEditorInput());
+ if (element instanceof ICompilationUnit) {
+ ICompilationUnit compilationUnit = (ICompilationUnit) element;
+ List<IJavaElement> allChildren = getAllChildren(compilationUnit);
+ for (IJavaElement child : allChildren) {
+ IInteractionElement interactionElement = ContextCore.getContextManager().getElement(
+ bridge.getHandleIdentifier(child));
+ if (interactionElement != null && interactionElement.getInterest().isInteresting()) {
+ toExpand.add(child);
+ } else {
+ toCollapse.add(child);
+ }
+ }
+ }
+ if (updater != null) {
+ updater.collapseComments();
+ updater.collapseMembers();
+ updater.expandElements(toExpand.toArray(new IJavaElement[toExpand.size()]));
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not update folding", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private static List<IJavaElement> getAllChildren(IParent parentElement) {
+ List<IJavaElement> allChildren = new ArrayList<IJavaElement>();
+ try {
+ for (IJavaElement child : parentElement.getChildren()) {
+ allChildren.add(child);
+ if (child instanceof IParent) {
+ allChildren.addAll(getAllChildren((IParent) child));
+ }
+ }
+ } catch (JavaModelException e) {
+ // ignore failures
+ }
+ return allChildren;
+ }
+
+ public void updateFolding(List<IInteractionElement> elements) {
+ for (IInteractionElement element : elements) {
+ if (updater == null || !enabled) {
+ return;
+ } else {
+ Object object = bridge.getObjectForHandle(element.getHandleIdentifier());
+ if (object instanceof IMember) {
+ IMember member = (IMember) object;
+ if (element.getInterest().isInteresting()) {
+ updater.expandElements(new IJavaElement[] { member });
+ // expand the next 2 children down (e.g. anonymous types)
+ try {
+ IJavaElement[] children = ((IParent) member).getChildren();
+ if (children.length == 1) {
+ updater.expandElements(new IJavaElement[] { children[0] });
+ if (children[0] instanceof IParent) {
+ IJavaElement[] childsChildren = ((IParent) children[0]).getChildren();
+ if (childsChildren.length == 1) {
+ updater.expandElements(new IJavaElement[] { childsChildren[0] });
+ }
+ }
+ }
+ } catch (JavaModelException e) {
+ // ignore
+ }
+ } else {
+ updater.collapseElements(new IJavaElement[] { member });
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ case DEACTIVATED:
+ if (JavaUiBridgePlugin.getDefault()
+ .getPreferenceStore()
+ .getBoolean(JavaUiBridgePlugin.AUTO_FOLDING_ENABLED)) {
+ updateFolding();
+ }
+ break;
+ case CLEARED:
+ if (event.isActiveContext()) {
+ if (JavaUiBridgePlugin.getDefault().getPreferenceStore().getBoolean(
+ JavaUiBridgePlugin.AUTO_FOLDING_ENABLED)) {
+ updateFolding();
+ }
+ }
+ break;
+ case INTEREST_CHANGED:
+ updateFolding(event.getElements());
+ break;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/AutoFoldPreferenceBlock.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/AutoFoldPreferenceBlock.java
new file mode 100644
index 0000000..2385d48
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/AutoFoldPreferenceBlock.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Mik Kersten
+ */
+public class AutoFoldPreferenceBlock implements IJavaFoldingPreferenceBlock {
+
+ // XXX never read
+ // private IPreferenceStore preferences;
+ // private Map checkBoxes = new HashMap();
+ // private Text minimumLines;
+
+ public AutoFoldPreferenceBlock() {
+ // preferences = ContextCore.getPreferenceStore(); XXX
+ // never used
+ }
+
+ public Control createControl(Composite parent) {
+ try {
+ Composite inner = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, true);
+ layout.verticalSpacing = 3;
+ layout.marginWidth = 0;
+ inner.setLayout(layout);
+
+ Label label = new Label(inner, SWT.LEFT);
+ label.setText(Messages.AutoFoldPreferenceBlock_Elements_of_low_interest_will_be_automatically_folded);
+
+ // Label label= new Label(inner, SWT.LEFT);
+ // label.setText( "collapse.title"); //$NON-NLS-1$
+
+ // addCheckBox(inner, "collapse.header", "collapse.header", 0);
+ // //$NON-NLS-1$
+ // addCheckBox(inner, "collapse.imports",
+ // FoldingKeys.COLLAPSE_IMPORTS, 0); //$NON-NLS-1$
+ // addCheckBox(inner, "collapse.inner_type",
+ // FoldingKeys.COLLAPSE_INNER_TYPES, 0); //$NON-NLS-1$
+ // addCheckBox(inner, "collapse.static_initializers",
+ // FoldingKeys.COLLAPSE_STATICS, 0); //$NON-NLS-1$
+ //
+ // addCheckBox(inner, "collapse.comment_blocks",
+ // FoldingKeys.COLLAPSE_COMMENT_BLOCKS, 0); //$NON-NLS-1$
+ // addCheckBox(inner, "collapse.javadocs",
+ // FoldingKeys.COLLAPSE_JAVADOCS, 0); //$NON-NLS-1$
+
+ // Label label2 = new Label(inner, SWT.LEFT);
+ // label2.setText( "minSize.title");
+ //
+ // minimumLines = new Text(inner, SWT.BORDER | SWT.SINGLE);
+ // GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ // gd.horizontalSpan= 1;
+ // gd.grabExcessVerticalSpace= false;
+ // minimumLines.setLayoutData(gd);
+
+ return inner;
+ } catch (Throwable t) {
+ StatusHandler.fail(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Could not create folding preferences page", t)); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock#initialize()
+ */
+ public void initialize() {
+
+ // Iterator it= checkBoxes.keySet().iterator();
+ // while (it.hasNext()) {
+ // Button b= (Button) it.next();
+ // String key= (String) checkBoxes.get(b);
+ // b.setSelection(preferences.getBoolean(key));
+ // }
+
+ // minimumLines.setText(String.valueOf(preferences.getInt(FoldingKeys.MINIMUM_SIZE)));
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jdt.ui.text.folding.IJavaFoldingPreferenceBlock#performOk()
+ */
+ public void performOk() {
+ // Iterator it = checkBoxes.keySet().iterator();
+ // while(it.hasNext()) {
+ // Button b = (Button) it.next();
+ // String key = (String) checkBoxes.get(b);
+ // preferences.setValue(key, b.getSelection());
+ // }
+ //
+ // int minLines = Integer.parseInt(minimumLines.getText());
+ // preferences.setValue(FoldingKeys.MINIMUM_SIZE, minLines);
+
+ }
+
+ // private Button addCheckBox(Composite parent, String label, String key,
+ // int indentation) {
+ // Button checkBox= new Button(parent, SWT.CHECK);
+ // checkBox.setText(label);
+ //
+ // GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ // gd.horizontalIndent= indentation;
+ // gd.horizontalSpan= 1;
+ // gd.grabExcessVerticalSpace= false;
+ // checkBox.setLayoutData(gd);
+ //
+ // checkBoxes.put(checkBox, key);
+ //
+ // return checkBox;
+ // }
+
+ public void performDefaults() {
+ initialize();
+ }
+
+ public void dispose() {
+ // don't care if we are disposed
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaAllProposalComputer.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaAllProposalComputer.java
new file mode 100644
index 0000000..ee0cbf9
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaAllProposalComputer.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ * Tasktop Technologies - changes for bug 219692
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.ui.editor;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.text.JavaHeuristicScanner;
+import org.eclipse.jdt.internal.ui.text.Symbols;
+import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer;
+import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.mylyn.internal.java.ui.JavaUiUtil;
+
+/**
+ * Based on org.eclipse.jdt.internal.ui.text.java.JavaAllCompletionProposalComputer.
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+// TODO e3.5 extend org.eclipse.jdt.internal.ui.text.java.JavaAllCompletionProposalComputer
+public class FocusedJavaAllProposalComputer extends JavaCompletionProposalComputer {
+
+ /**
+ * @see CompletionProposal#METHOD_REF_WITH_CASTED_RECEIVER
+ */
+ // TODO e3.4 replace by CompletionProposal.METHOD_REF_WITH_CASTED_RECEIVER
+ public static final int METHOD_REF_WITH_CASTED_RECEIVER = 24;
+
+ /**
+ * @see CompletionProposal#METHOD_REF_WITH_CASTED_RECEIVER
+ */
+ // TODO e3.4 replace by CompletionProposal.METHOD_REF_WITH_CASTED_RECEIVER
+ public static final int FIELD_REF_WITH_CASTED_RECEIVER = 25;
+
+ /**
+ * @see CompletionProposal#CONSTRUCTOR_INVOCATION
+ */
+ // TODO e3.5 replace by CompletionProposal.CONSTRUCTOR_INVOCATION
+ public static final int CONSTRUCTOR_INVOCATION = 26;
+
+ /**
+ * @see CompletionProposal#ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION
+ */
+ // TODO e3.5 replace by CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION
+ public static final int ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION = 27;
+
+ public FocusedJavaAllProposalComputer() {
+ FocusedJavaProposalProcessor.getDefault().addMonitoredComputer(this);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ if (shouldReturnResults()) {
+ List proposals = super.computeCompletionProposals(context, monitor);
+ return FocusedJavaProposalProcessor.getDefault().projectInterestModel(this, proposals);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ private boolean shouldReturnResults() {
+ if (JavaUiUtil.isDefaultAssistActive(JavaUiUtil.ASSIST_JDT_ALL)) {
+ // do not return duplicates if the default JDT processor is already enabled on Eclipse 3.5
+ return false;
+ }
+ Set<String> disabledIds = JavaUiUtil.getDisabledIds(JavaPlugin.getDefault().getPreferenceStore());
+ if (!disabledIds.contains(JavaUiUtil.ASSIST_JDT_NOTYPE) && !disabledIds.contains(JavaUiUtil.ASSIST_JDT_TYPE)) {
+ // do not return duplicates if the default JDT processors are already enabled on on Eclipse 3.3 and 3.4
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @see org.eclipse.jdt.internal.ui.text.java.JavaAllCompletionProposalComputer#createCollector(JavaContentAssistInvocationContext)
+ */
+ @Override
+ protected CompletionProposalCollector createCollector(JavaContentAssistInvocationContext context) {
+ CompletionProposalCollector collector = super.createCollector(context);
+ collector.setIgnored(CompletionProposal.ANNOTATION_ATTRIBUTE_REF, false);
+ collector.setIgnored(CompletionProposal.ANONYMOUS_CLASS_DECLARATION, false);
+ try {
+ collector.setIgnored(ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, false);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ collector.setIgnored(CompletionProposal.FIELD_REF, false);
+ try {
+ collector.setIgnored(FIELD_REF_WITH_CASTED_RECEIVER, false);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ collector.setIgnored(CompletionProposal.KEYWORD, false);
+ collector.setIgnored(CompletionProposal.LABEL_REF, false);
+ collector.setIgnored(CompletionProposal.LOCAL_VARIABLE_REF, false);
+ collector.setIgnored(CompletionProposal.METHOD_DECLARATION, false);
+ collector.setIgnored(CompletionProposal.METHOD_NAME_REFERENCE, false);
+ collector.setIgnored(CompletionProposal.METHOD_REF, false);
+ try {
+ collector.setIgnored(CONSTRUCTOR_INVOCATION, false);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ try {
+ collector.setIgnored(METHOD_REF_WITH_CASTED_RECEIVER, false);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ collector.setIgnored(CompletionProposal.PACKAGE_REF, false);
+ collector.setIgnored(CompletionProposal.POTENTIAL_METHOD_DECLARATION, false);
+ collector.setIgnored(CompletionProposal.VARIABLE_DECLARATION, false);
+ collector.setIgnored(CompletionProposal.TYPE_REF, false);
+ return collector;
+ }
+
+ /**
+ * @see org.eclipse.jdt.internal.ui.text.java.JavaAllCompletionProposalComputer#guessContextInformationPosition(ContentAssistInvocationContext)
+ */
+ @Override
+ protected int guessContextInformationPosition(ContentAssistInvocationContext context) {
+ int invocationOffset = context.getInvocationOffset();
+ int typeContext = super.guessContextInformationPosition(context);
+ int methodContext = guessMethodContextInformationPosition2(context);
+ if (typeContext != invocationOffset && typeContext > methodContext) {
+ return typeContext;
+ } else if (methodContext != invocationOffset) {
+ return methodContext;
+ } else {
+ return invocationOffset;
+ }
+ }
+
+ // renamed, since guessMethodContextInformationPosition(ContentAssistInvocationContext) is final
+ protected final int guessMethodContextInformationPosition2(ContentAssistInvocationContext context) {
+ final int contextPosition = context.getInvocationOffset();
+
+ IDocument document = context.getDocument();
+ JavaHeuristicScanner scanner = new JavaHeuristicScanner(document);
+ int bound = Math.max(-1, contextPosition - 200);
+
+ // try the innermost scope of parentheses that looks like a method call
+ int pos = contextPosition - 1;
+ do {
+ int paren = scanner.findOpeningPeer(pos, bound, '(', ')');
+ if (paren == JavaHeuristicScanner.NOT_FOUND) {
+ break;
+ }
+ int token = scanner.previousToken(paren - 1, bound);
+ // next token must be a method name (identifier) or the closing angle of a
+ // constructor call of a parameterized type.
+ if (token == Symbols.TokenIDENT || token == Symbols.TokenGREATERTHAN) {
+ return paren + 1;
+ }
+ pos = paren - 1;
+ } while (true);
+
+ return contextPosition;
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaNoTypeProposalComputer.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaNoTypeProposalComputer.java
new file mode 100644
index 0000000..fd0ff96
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaNoTypeProposalComputer.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.internal.ui.text.java.JavaNoTypeCompletionProposalComputer;
+import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
+import org.eclipse.mylyn.internal.java.ui.JavaUiUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusedJavaNoTypeProposalComputer extends JavaNoTypeCompletionProposalComputer {
+
+ public FocusedJavaNoTypeProposalComputer() {
+ FocusedJavaProposalProcessor.getDefault().addMonitoredComputer(this);
+ }
+
+ @Override
+ protected CompletionProposalCollector createCollector(JavaContentAssistInvocationContext context) {
+ return super.createCollector(context);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ if (!JavaUiUtil.isDefaultAssistActive(JavaUiUtil.ASSIST_JDT_NOTYPE)) {
+ List proposals = super.computeCompletionProposals(context, monitor);
+ return FocusedJavaProposalProcessor.getDefault().projectInterestModel(this, proposals);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaProposalProcessor.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaProposalProcessor.java
new file mode 100644
index 0000000..d31b64d
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaProposalProcessor.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.text.java.AbstractJavaCompletionProposal;
+import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposal;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+
+/**
+ * TODO: parametrize relevance levels (requires JDT changes, bug 119063)
+ *
+ * @author Mik Kersten
+ */
+public class FocusedJavaProposalProcessor {
+
+ /**
+ * Range above which elements are part of the context.
+ */
+ private static final int THRESHOLD_INTEREST = 10000;
+
+ /**
+ * Range for implicitly interesting element, such as method parameters.
+ */
+ private static final int THRESHOLD_IMPLICIT_INTEREST = THRESHOLD_INTEREST * 2;
+
+ /**
+ * Threshold for determining which JDT proposals should be implicitly interesting.
+ */
+ private static final int RELEVANCE_IMPLICIT_INTEREST_JAVA = 600;
+
+ /**
+ * Threshold for implicit interest of IJavaElement proposals.
+ */
+ private static final int RELEVANCE_IMPLICIT_INTEREST_MISC = 300;
+
+ private static final String IDENTIFIER_THIS = "this"; //$NON-NLS-1$
+
+ public static final String LABEL_SEPARATOR = " -------------------------------------------- "; //$NON-NLS-1$
+
+ public static final FocusedProposalSeparator PROPOSAL_SEPARATOR = new FocusedProposalSeparator();
+
+ private final List<IJavaCompletionProposalComputer> monitoredProposalComputers = new ArrayList<IJavaCompletionProposalComputer>();
+
+ private final List<IJavaCompletionProposalComputer> alreadyComputedProposals = new ArrayList<IJavaCompletionProposalComputer>();
+
+ private final List<IJavaCompletionProposalComputer> alreadyContainSeparator = new ArrayList<IJavaCompletionProposalComputer>();
+
+ private final List<IJavaCompletionProposalComputer> containsSingleInterestingProposal = new ArrayList<IJavaCompletionProposalComputer>();
+
+ private static FocusedJavaProposalProcessor INSTANCE = new FocusedJavaProposalProcessor();
+
+ private FocusedJavaProposalProcessor() {
+ }
+
+ public static FocusedJavaProposalProcessor getDefault() {
+ return INSTANCE;
+ }
+
+ public void addMonitoredComputer(IJavaCompletionProposalComputer proposalComputer) {
+ monitoredProposalComputers.add(proposalComputer);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List projectInterestModel(IJavaCompletionProposalComputer proposalComputer, List proposals) {
+ try {
+ if (!ContextCore.getContextManager().isContextActive()) {
+ return proposals;
+ } else {
+ boolean hasInterestingProposals = false;
+ for (Object object : proposals) {
+ if (object instanceof AbstractJavaCompletionProposal) {
+ boolean foundInteresting = boostRelevanceWithInterest((AbstractJavaCompletionProposal) object);
+ if (!hasInterestingProposals && foundInteresting) {
+ hasInterestingProposals = true;
+ }
+ }
+ }
+
+ // NOTE: this annoying state needs to be maintainted to ensure
+ // the
+ // separator is added only once, and not added for single
+ // proposals
+ if (containsSingleInterestingProposal.size() > 0 && proposals.size() > 0) {
+ proposals.add(FocusedJavaProposalProcessor.PROPOSAL_SEPARATOR);
+ } else if (hasInterestingProposals && alreadyContainSeparator.isEmpty()) {
+ if (proposals.size() == 1) {
+ containsSingleInterestingProposal.add(proposalComputer);
+ } else {
+ proposals.add(FocusedJavaProposalProcessor.PROPOSAL_SEPARATOR);
+ alreadyContainSeparator.add(proposalComputer);
+ }
+ }
+
+ alreadyComputedProposals.add(proposalComputer);
+ if (alreadyComputedProposals.size() == monitoredProposalComputers.size()) {
+ alreadyComputedProposals.clear();
+ alreadyContainSeparator.clear();
+ containsSingleInterestingProposal.clear();
+ }
+
+ return proposals;
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
+ "Failed to project interest onto propsals", t)); //$NON-NLS-1$
+ return proposals;
+ }
+ }
+
+ private boolean boostRelevanceWithInterest(AbstractJavaCompletionProposal proposal) {
+ boolean hasInteresting = false;
+ IJavaElement javaElement = proposal.getJavaElement();
+ if (javaElement != null) {
+ IInteractionElement interactionElement = ContextCore.getContextManager().getElement(
+ javaElement.getHandleIdentifier());
+ float interest = interactionElement.getInterest().getValue();
+ if (interest > ContextCore.getCommonContextScaling().getInteresting()) {
+ // TODO: losing precision here, only going to one decimal place
+ proposal.setRelevance(THRESHOLD_INTEREST + (int) (interest * 10));
+ hasInteresting = true;
+ } else if (proposal.getRelevance() > RELEVANCE_IMPLICIT_INTEREST_JAVA) {
+ proposal.setRelevance(THRESHOLD_IMPLICIT_INTEREST + proposal.getRelevance());
+ }
+ } else if (isImplicitlyInteresting(proposal)) {
+ proposal.setRelevance(THRESHOLD_IMPLICIT_INTEREST + proposal.getRelevance());
+ hasInteresting = true;
+ }
+ return hasInteresting;
+ }
+
+ public boolean isImplicitlyInteresting(AbstractJavaCompletionProposal proposal) {
+ return proposal.getRelevance() > RELEVANCE_IMPLICIT_INTEREST_MISC
+ && !IDENTIFIER_THIS.equals(proposal.getDisplayString());
+ }
+
+ static class FocusedProposalSeparator extends JavaCompletionProposal {
+ public FocusedProposalSeparator() {
+ super("", 0, 0, CommonImages.getImage(CommonImages.SEPARATOR_LIST), LABEL_SEPARATOR, //$NON-NLS-1$
+ FocusedJavaProposalProcessor.THRESHOLD_INTEREST);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaSourceViewerConfiguration.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaSourceViewerConfiguration.java
new file mode 100644
index 0000000..cdecc7e
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaSourceViewerConfiguration.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * Installs Mylyn content assist and hyperlink detection
+ *
+ * @author Mik Kersten
+ */
+public class FocusedJavaSourceViewerConfiguration extends JavaSourceViewerConfiguration {
+
+ public FocusedJavaSourceViewerConfiguration(IColorManager colorManager, IPreferenceStore preferenceStore,
+ ITextEditor editor, String partitioning) {
+ super(colorManager, preferenceStore, editor, partitioning);
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaTypeProposalComputer.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaTypeProposalComputer.java
new file mode 100644
index 0000000..3a5f24f
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/FocusedJavaTypeProposalComputer.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.internal.ui.text.java.JavaTypeCompletionProposalComputer;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.mylyn.internal.java.ui.JavaUiUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusedJavaTypeProposalComputer extends JavaTypeCompletionProposalComputer {
+
+ public FocusedJavaTypeProposalComputer() {
+ FocusedJavaProposalProcessor.getDefault().addMonitoredComputer(this);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ if (!JavaUiUtil.isDefaultAssistActive(JavaUiUtil.ASSIST_JDT_TYPE)) {
+ List proposals = super.computeCompletionProposals(context, monitor);
+ return FocusedJavaProposalProcessor.getDefault().projectInterestModel(this, proposals);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/Messages.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/Messages.java
new file mode 100644
index 0000000..670e65c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.editor;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.java.ui.editor.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AutoFoldPreferenceBlock_Elements_of_low_interest_will_be_automatically_folded;
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/messages.properties b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/messages.properties
new file mode 100644
index 0000000..0095740
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/editor/messages.properties
@@ -0,0 +1 @@
+AutoFoldPreferenceBlock_Elements_of_low_interest_will_be_automatically_folded=Elements of low interest will be automatically folded.
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/InteractionContextTestUtil.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/InteractionContextTestUtil.java
new file mode 100644
index 0000000..a598631
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/InteractionContextTestUtil.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.junit;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants;
+import org.eclipse.jdt.internal.junit.launcher.TestKindRegistry;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.internal.java.ui.search.JUnitReferencesProvider;
+
+/**
+ * @author Mik Kersten
+ */
+public class InteractionContextTestUtil {
+
+ public static void setupTestConfiguration(Set<IType> contextTestCases, ILaunchConfiguration configuration,
+ IProgressMonitor pm) throws CoreException {
+ String testKindId = TestKindRegistry.JUNIT3_TEST_KIND_ID;
+
+ IJavaProject javaProject = null;
+ for (IType type : contextTestCases) {
+ IProjectNature nature = type.getJavaProject().getProject().getNature("org.eclipse.pde.PluginNature"); //$NON-NLS-1$
+ if (nature != null) {
+ // HACK: might want another project
+ javaProject = type.getJavaProject();
+ }
+ }
+
+ ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
+ if (javaProject != null) {
+ workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, javaProject.getElementName());
+ }
+
+ // HACK: only checks first type
+ if (contextTestCases.size() > 0) {
+ testKindId = TestKindRegistry.getContainerTestKindId(contextTestCases.iterator().next());
+ workingCopy.setAttribute(JUnitLaunchConfigurationConstants.ATTR_TEST_RUNNER_KIND, testKindId);
+ // testKind = TestKindRegistry.getDefault().getKind(configuration);// contextTestCases.iterator().next());
+ }
+ workingCopy.doSave();
+ }
+
+ public static Set<IType> getTestCasesInContext() {
+ Set<IType> testTypes = new HashSet<IType>();
+ List<IInteractionElement> interesting = ContextCore.getContextManager().getActiveContext().getInteresting();
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(JavaStructureBridge.CONTENT_TYPE);
+ try {
+ for (IInteractionElement element : interesting) {
+ if (element.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
+ Object javaElement = bridge.getObjectForHandle(element.getHandleIdentifier());
+ if (javaElement instanceof IType) {
+ IType type = (IType) javaElement;
+ if (isTestType(type)) {
+ testTypes.add(type);
+ }
+ }
+ for (IInteractionRelation relation : element.getRelations()) {
+ if (relation.getRelationshipHandle().equals(JUnitReferencesProvider.ID)) {
+ IInteractionElement target = relation.getTarget();
+ Object targetObject = bridge.getObjectForHandle(target.getHandleIdentifier());
+ if (targetObject instanceof IMethod) {
+ IMethod testMethod = (IMethod) targetObject;
+ if (isTestType((IType) testMethod.getParent())) {
+ testTypes.add((IType) testMethod.getParent());
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not add all test types", e)); //$NON-NLS-1$
+ }
+ return testTypes;
+ }
+
+ public static boolean isTestType(IType type) {
+ ITypeHierarchy hierarchy;
+ try {
+ if (Flags.isAbstract(type.getFlags())) {
+ return false;
+ }
+ } catch (JavaModelException e) {
+ return false;
+ }
+ try {
+ hierarchy = type.newSupertypeHierarchy(null);
+ IType[] supertypes = hierarchy.getAllSuperclasses(type);
+ for (IType supertype : supertypes) {
+ if (supertype.getFullyQualifiedName().equals("junit.framework.TestCase")) { //$NON-NLS-1$
+ return true;
+ }
+ }
+ } catch (JavaModelException e) {
+ // ContextCorePlugin.log(e, "could not determine test type");
+ // ignore, hierarchy is probably inconsistent
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/Messages.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/Messages.java
new file mode 100644
index 0000000..9460c01
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/Messages.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.junit;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.java.ui.junit.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TaskContextJUnitLaunchConfiguration_Context_Test_Suite;
+
+ public static String TaskContextJUnitLaunchConfiguration_No_test_types_found_in_the_active_task_context;
+
+ public static String TaskContextJUnitMainTab_SUBCLASSES_OF_TESTCASE_AUTOMATICALLY_ADD_TO_SUITE;
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitLaunchConfiguration.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitLaunchConfiguration.java
new file mode 100644
index 0000000..b8a9340
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitLaunchConfiguration.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.junit;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskContextJUnitLaunchConfiguration extends JUnitLaunchConfigurationDelegate {
+
+ @Override
+ protected IMember[] evaluateTests(ILaunchConfiguration configuration, IProgressMonitor monitor)
+ throws CoreException {
+ Set<IType> contextTestCases = InteractionContextTestUtil.getTestCasesInContext();
+ InteractionContextTestUtil.setupTestConfiguration(contextTestCases, configuration, monitor);
+
+ if (contextTestCases.isEmpty()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), Messages.TaskContextJUnitLaunchConfiguration_Context_Test_Suite,
+ Messages.TaskContextJUnitLaunchConfiguration_No_test_types_found_in_the_active_task_context);
+ }
+ });
+ }
+ return contextTestCases.toArray(new IMember[contextTestCases.size()]);
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitMainTab.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitMainTab.java
new file mode 100644
index 0000000..3d72db6
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitMainTab.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.junit;
+
+import java.util.Set;
+
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationTab;
+import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.swt.SWT;
+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.Label;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskContextJUnitMainTab extends JUnitLaunchConfigurationTab {
+
+ private boolean isPdeMode = false;
+
+ private final Image image;
+
+ public TaskContextJUnitMainTab(boolean isPdeMode) {
+ this.isPdeMode = isPdeMode;
+ image = JavaUiBridgePlugin.getImageDescriptor("icons/etool16/junit-tab.gif").createImage(); //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean isValid(ILaunchConfiguration config) {
+ return true;
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ setControl(comp);
+
+ GridLayout topLayout = new GridLayout();
+ topLayout.numColumns = 3;
+ comp.setLayout(topLayout);
+
+ new Label(comp, SWT.NONE);
+ Label label = new Label(comp, SWT.NONE);
+ GridData gd = new GridData();
+ gd.horizontalSpan = 3;
+ label.setLayoutData(gd);
+
+ label.setText(Messages.TaskContextJUnitMainTab_SUBCLASSES_OF_TESTCASE_AUTOMATICALLY_ADD_TO_SUITE);
+ }
+
+ @Override
+ public void performApply(ILaunchConfigurationWorkingCopy config) {
+ if (!isPdeMode) {
+ Set<IType> types = InteractionContextTestUtil.getTestCasesInContext();
+ if (!types.isEmpty()) {
+ IType firstType = types.iterator().next();
+ String projectName = firstType.getJavaProject().getElementName();
+ config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, projectName);
+ }
+ }
+ }
+
+ @Override
+ public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+ // ignore
+ }
+
+ @Override
+ public void initializeFrom(ILaunchConfiguration config) {
+ // ignore
+ }
+
+ @Override
+ public String getName() {
+ return "JUnit"; //$NON-NLS-1$
+ }
+
+ @Override
+ public Image getImage() {
+ // IMAGE
+ return image;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (image != null && !image.isDisposed()) {
+ image.dispose();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitTabGroup.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitTabGroup.java
new file mode 100644
index 0000000..318ebb1
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/TaskContextJUnitTabGroup.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.junit;
+
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.EnvironmentTab;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;
+
+/**
+ * Derived from: JUnitTabGroup
+ *
+ * @author Mik Kersten
+ */
+public class TaskContextJUnitTabGroup extends AbstractLaunchConfigurationTabGroup {
+
+ public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+ ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] { new TaskContextJUnitMainTab(false),
+ new JavaArgumentsTab(), new JavaClasspathTab(), new JavaJRETab(), new SourceLookupTab(),
+ new EnvironmentTab(), new CommonTab() };
+ setTabs(tabs);
+ }
+
+ @Override
+ public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+ super.setDefaults(config);
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/messages.properties b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/messages.properties
new file mode 100644
index 0000000..e18b093
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/junit/messages.properties
@@ -0,0 +1,4 @@
+TaskContextJUnitLaunchConfiguration_Context_Test_Suite=Context Test Suite
+TaskContextJUnitLaunchConfiguration_No_test_types_found_in_the_active_task_context=No test types found in the active task context.
+
+TaskContextJUnitMainTab_SUBCLASSES_OF_TESTCASE_AUTOMATICALLY_ADD_TO_SUITE=Subclasses of TestCase in the active task context automatically added to suite.
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/AbstractJavaRelationProvider.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/AbstractJavaRelationProvider.java
new file mode 100644
index 0000000..c49b6b4
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/AbstractJavaRelationProvider.java
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IInitializer;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.search.IJavaSearchConstants;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.internal.core.JavaProject;
+import org.eclipse.jdt.internal.ui.search.JavaSearchQuery;
+import org.eclipse.jdt.internal.ui.search.JavaSearchResult;
+import org.eclipse.jdt.ui.search.ElementQuerySpecification;
+import org.eclipse.jdt.ui.search.QuerySpecification;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.DegreeOfSeparation;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.context.core.IDegreeOfSeparation;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search2.internal.ui.InternalSearchUI;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public abstract class AbstractJavaRelationProvider extends AbstractRelationProvider {
+
+ public static final String ID_GENERIC = "org.eclipse.mylyn.java.relation"; //$NON-NLS-1$
+
+ public static final String NAME = "Java relationships"; //$NON-NLS-1$
+
+ private static final int DEFAULT_DEGREE = 2;
+
+ private static final List<Job> runningJobs = new ArrayList<Job>();
+
+ @Override
+ public String getGenericId() {
+ return ID_GENERIC;
+ }
+
+ protected AbstractJavaRelationProvider(String structureKind, String id) {
+ super(structureKind, id);
+ }
+
+ @Override
+ public List<IDegreeOfSeparation> getDegreesOfSeparation() {
+ List<IDegreeOfSeparation> separations = new ArrayList<IDegreeOfSeparation>();
+ separations.add(new DegreeOfSeparation(DOS_0_LABEL, 0));
+ separations.add(new DegreeOfSeparation(DOS_1_LABEL, 1));
+ separations.add(new DegreeOfSeparation(DOS_2_LABEL, 2));
+ separations.add(new DegreeOfSeparation(DOS_3_LABEL, 3));
+ separations.add(new DegreeOfSeparation(DOS_4_LABEL, 4));
+ separations.add(new DegreeOfSeparation(DOS_5_LABEL, 5));
+ return separations;
+ }
+
+ @Override
+ protected void findRelated(final IInteractionElement node, int degreeOfSeparation) {
+ if (node == null) {
+ return;
+ }
+ if (node.getContentType() == null) {
+ StatusHandler.log(new Status(IStatus.WARNING, JavaUiBridgePlugin.ID_PLUGIN, "Null content type for: " //$NON-NLS-1$
+ + node));
+ return;
+ }
+ if (!node.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
+ return;
+ }
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+ if (!acceptElement(javaElement) || !javaElement.exists() || javaElement instanceof IInitializer) {
+ return;
+ }
+
+ IJavaSearchScope scope = createJavaSearchScope(javaElement, degreeOfSeparation);
+ if (scope != null) {
+ runJob(node, degreeOfSeparation, getId());
+ }
+ }
+
+ private IJavaSearchScope createJavaSearchScope(IJavaElement element, int degreeOfSeparation) {
+ Set<IInteractionElement> landmarks = ContextCore.getContextManager().getActiveLandmarks();
+ List<IInteractionElement> interestingElements = ContextCore.getContextManager()
+ .getActiveContext()
+ .getInteresting();
+
+ Set<IJavaElement> searchElements = new HashSet<IJavaElement>();
+ int includeMask = IJavaSearchScope.SOURCES;
+ if (degreeOfSeparation == 1) {
+ for (IInteractionElement landmark : landmarks) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(landmark.getContentType());
+ if (includeNodeInScope(landmark, bridge)) {
+ Object o = bridge.getObjectForHandle(landmark.getHandleIdentifier());
+ if (o instanceof IJavaElement) {
+ IJavaElement landmarkElement = (IJavaElement) o;
+ if (landmarkElement.exists()) {
+ if (landmarkElement instanceof IMember && !landmark.getInterest().isPropagated()) {
+ searchElements.add(((IMember) landmarkElement).getCompilationUnit());
+ } else if (landmarkElement instanceof ICompilationUnit) {
+ searchElements.add(landmarkElement);
+ }
+ }
+ }
+ }
+ }
+ } else if (degreeOfSeparation == 2) {
+ for (IInteractionElement interesting : interestingElements) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(interesting.getContentType());
+ if (includeNodeInScope(interesting, bridge)) {
+ Object object = bridge.getObjectForHandle(interesting.getHandleIdentifier());
+ if (object instanceof IJavaElement) {
+ IJavaElement interestingElement = (IJavaElement) object;
+ if (interestingElement.exists()) {
+ if (interestingElement instanceof IMember && !interesting.getInterest().isPropagated()) {
+ searchElements.add(((IMember) interestingElement).getCompilationUnit());
+ } else if (interestingElement instanceof ICompilationUnit) {
+ searchElements.add(interestingElement);
+ }
+ }
+ }
+ }
+ }
+ } else if (degreeOfSeparation == 3 || degreeOfSeparation == 4) {
+ for (IInteractionElement interesting : interestingElements) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(interesting.getContentType());
+ if (includeNodeInScope(interesting, bridge)) {
+ // TODO what to do when the element is not a java element,
+ // how determine if a javaProject?
+ IResource resource = ResourcesUiBridgePlugin.getDefault().getResourceForElement(interesting, true);
+ if (resource != null) {
+ IProject project = resource.getProject();
+ if (project != null && JavaProject.hasJavaNature(project) && project.exists()) {
+ IJavaProject javaProject = JavaCore.create(project);// ((IJavaElement)o).getJavaProject();
+ if (javaProject != null && javaProject.exists()) {
+ searchElements.add(javaProject);
+ }
+ }
+ }
+ }
+ }
+ if (degreeOfSeparation == 4) {
+
+ includeMask = IJavaSearchScope.SOURCES | IJavaSearchScope.APPLICATION_LIBRARIES
+ | IJavaSearchScope.SYSTEM_LIBRARIES;
+ }
+ } else if (degreeOfSeparation == 5) {
+ return SearchEngine.createWorkspaceScope();
+ }
+
+ if (searchElements.size() == 0) {
+ return null;
+ } else {
+ IJavaElement[] elements = new IJavaElement[searchElements.size()];
+ int j = 0;
+ for (IJavaElement searchElement : searchElements) {
+ elements[j] = searchElement;
+ j++;
+ }
+ return SearchEngine.createJavaSearchScope(elements, includeMask);
+ }
+ }
+
+ /**
+ * Only include Java elements and files.
+ */
+ private boolean includeNodeInScope(IInteractionElement interesting, AbstractContextStructureBridge bridge) {
+ if (interesting == null || bridge == null) {
+ return false;
+ } else {
+ if (interesting.getContentType() == null) {
+ // TODO: remove
+ StatusHandler.log(new Status(IStatus.WARNING, JavaUiBridgePlugin.ID_PLUGIN, "Null content type for: " //$NON-NLS-1$
+ + interesting.getHandleIdentifier()));
+ return false;
+ } else {
+ return interesting.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)
+ || bridge.isDocument(interesting.getHandleIdentifier());
+ }
+ }
+ }
+
+ protected boolean acceptResultElement(IJavaElement element) {
+ return !(element instanceof IImportDeclaration);
+ }
+
+ protected boolean acceptElement(IJavaElement javaElement) {
+ return javaElement != null && (javaElement instanceof IMember || javaElement instanceof IType);
+ }
+
+ private void runJob(final IInteractionElement node, final int degreeOfSeparation, final String kind) {
+
+ int limitTo = 0;
+ if (kind.equals(JavaReferencesProvider.ID)) {
+ limitTo = IJavaSearchConstants.REFERENCES;
+ } else if (kind.equals(JavaImplementorsProvider.ID)) {
+ limitTo = IJavaSearchConstants.IMPLEMENTORS;
+ } else if (kind.equals(JUnitReferencesProvider.ID)) {
+ limitTo = IJavaSearchConstants.REFERENCES;
+ } else if (kind.equals(JavaReadAccessProvider.ID)) {
+ limitTo = IJavaSearchConstants.REFERENCES;
+ } else if (kind.equals(JavaWriteAccessProvider.ID)) {
+ limitTo = IJavaSearchConstants.REFERENCES;
+ }
+
+ final JavaSearchOperation query = (JavaSearchOperation) getSearchOperation(node, limitTo, degreeOfSeparation);
+ if (query == null) {
+ return;
+ }
+
+ JavaSearchJob job = new JavaSearchJob(query.getLabel(), query);
+ query.addListener(new IActiveSearchListener() {
+
+ private boolean gathered = false;
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void searchCompleted(List l) {
+ if (l == null) {
+ return;
+ }
+ List<IJavaElement> relatedHandles = new ArrayList<IJavaElement>();
+ Object[] elements = l.toArray();
+ for (Object element : elements) {
+ if (element instanceof IJavaElement) {
+ relatedHandles.add((IJavaElement) element);
+ }
+ }
+
+ for (IJavaElement element : relatedHandles) {
+ if (!acceptResultElement(element)) {
+ continue;
+ }
+ incrementInterest(node, JavaStructureBridge.CONTENT_TYPE, element.getHandleIdentifier(),
+ degreeOfSeparation);
+ }
+ gathered = true;
+ AbstractJavaRelationProvider.this.searchCompleted(node);
+ }
+
+ });
+ InternalSearchUI.getInstance();
+
+ runningJobs.add(job);
+ job.setPriority(Job.DECORATE - 10);
+ job.schedule();
+ }
+
+ @Override
+ public IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo, int degreeOfSeparation) {
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+ if (javaElement == null || !javaElement.exists()) {
+ return null;
+ }
+
+ IJavaSearchScope scope = createJavaSearchScope(javaElement, degreeOfSeparation);
+
+ if (scope == null) {
+ return null;
+ }
+
+ QuerySpecification specs = new ElementQuerySpecification(javaElement, limitTo, scope,
+ Messages.AbstractJavaRelationProvider_Mylyn_degree_of_separation + degreeOfSeparation);
+
+ return new JavaSearchOperation(specs);
+ }
+
+ protected static class JavaSearchJob extends Job {
+
+ private final JavaSearchOperation op;
+
+ public JavaSearchJob(String name, JavaSearchOperation op) {
+ super(name);
+ this.op = op;
+ }
+
+ /**
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ return op.run(monitor);
+ }
+
+ }
+
+ protected static class JavaSearchOperation extends JavaSearchQuery implements IActiveSearchOperation {
+ private ISearchResult result = null;
+
+ @Override
+ public ISearchResult getSearchResult() {
+ if (result == null) {
+ result = new JavaSearchResult(this);
+ }
+ new JavaActiveSearchResultUpdater((JavaSearchResult) result);
+ return result;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ IStatus runStatus = super.run(monitor);
+ ISearchResult result = getSearchResult();
+ if (result instanceof JavaSearchResult) {
+ // TODO make better
+ Object[] objs = ((JavaSearchResult) result).getElements();
+ if (objs == null) {
+ notifySearchCompleted(null);
+ } else {
+ List<Object> l = new ArrayList<Object>();
+ for (Object obj : objs) {
+ l.add(obj);
+ }
+ notifySearchCompleted(l);
+ }
+ }
+ return runStatus;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Java search failed", t)); //$NON-NLS-1$
+ }
+
+ IStatus status = new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, IStatus.OK,
+ Messages.AbstractJavaRelationProvider_could_not_run_Java_search, null);
+ notifySearchCompleted(null);
+ return status;
+ }
+
+ /**
+ * Constructor
+ *
+ * @param data
+ */
+ public JavaSearchOperation(QuerySpecification data) {
+ super(data);
+
+ }
+
+ /** List of listeners wanting to know about the searches */
+ private final List<IActiveSearchListener> listeners = new ArrayList<IActiveSearchListener>();
+
+ /**
+ * Add a listener for when the bugzilla search is completed
+ *
+ * @param l
+ * The listener to add
+ */
+ public void addListener(IActiveSearchListener l) {
+ // add the listener to the list
+ listeners.add(l);
+ }
+
+ /**
+ * Remove a listener for when the bugzilla search is completed
+ *
+ * @param l
+ * The listener to remove
+ */
+ public void removeListener(IActiveSearchListener l) {
+ // remove the listener from the list
+ listeners.remove(l);
+ }
+
+ /**
+ * Notify all of the listeners that the bugzilla search is completed
+ *
+ * @param doiList
+ * A list of BugzillaSearchHitDoiInfo
+ * @param member
+ * The IMember that the search was performed on
+ */
+ public void notifySearchCompleted(List<Object> l) {
+ // go through all of the listeners and call
+ // searchCompleted(colelctor,
+ // member)
+ for (IActiveSearchListener listener : listeners) {
+ listener.searchCompleted(l);
+ }
+ }
+
+ }
+
+ @Override
+ public void stopAllRunningJobs() {
+ for (Job j : runningJobs) {
+ j.cancel();
+ }
+ runningJobs.clear();
+ }
+
+ @Override
+ protected int getDefaultDegreeOfSeparation() {
+ return DEFAULT_DEGREE;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JUnitReferencesProvider.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JUnitReferencesProvider.java
new file mode 100644
index 0000000..50dfeb6
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JUnitReferencesProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+import org.eclipse.mylyn.internal.java.ui.junit.InteractionContextTestUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class JUnitReferencesProvider extends AbstractJavaRelationProvider {
+
+ public static final String ID = ID_GENERIC + ".junitreferences"; //$NON-NLS-1$
+
+ public static final String NAME = "tested by"; //$NON-NLS-1$
+
+ public JUnitReferencesProvider() {
+ super(JavaStructureBridge.CONTENT_TYPE, ID);
+ }
+
+ @Override
+ protected boolean acceptResultElement(IJavaElement element) {
+ if (element instanceof IMethod) {
+ IMethod method = (IMethod) element;
+ boolean isTestMethod = false;
+ boolean isTestCase = false;
+ if (method.getElementName().startsWith("test")) { //$NON-NLS-1$
+ isTestMethod = true;
+ }
+
+ IJavaElement parent = method.getParent();
+ if (parent instanceof IType) {
+ IType type = (IType) parent;
+ isTestCase = InteractionContextTestUtil.isTestType(type);
+ }
+ return isTestMethod && isTestCase;
+ }
+ return false;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaActiveSearchResultUpdater.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaActiveSearchResultUpdater.java
new file mode 100644
index 0000000..81b794c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaActiveSearchResultUpdater.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.jdt.core.ElementChangedEvent;
+import org.eclipse.jdt.core.IElementChangedListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.search.JavaSearchResult;
+import org.eclipse.search.ui.IQueryListener;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * COPIED FROM: org.eclipse.jdt.internal.ui.search.SearchResultUpdater
+ *
+ * @author Shawn Minto
+ */
+ at SuppressWarnings("unchecked")
+public class JavaActiveSearchResultUpdater implements IElementChangedListener, IQueryListener {
+
+ private final JavaSearchResult fResult;
+
+ private static final int REMOVED_FLAGS = IJavaElementDelta.F_MOVED_TO | IJavaElementDelta.F_REMOVED_FROM_CLASSPATH
+ | IJavaElementDelta.F_CLOSED | IJavaElementDelta.F_CONTENT;
+
+ public JavaActiveSearchResultUpdater(JavaSearchResult result) {
+ fResult = result;
+ NewSearchUI.addQueryListener(this);
+ JavaCore.addElementChangedListener(this);
+ // TODO make this work with resources
+ }
+
+ public void elementChanged(ElementChangedEvent event) {
+ // long t0= System.currentTimeMillis();
+ IJavaElementDelta delta = event.getDelta();
+ Set removedElements = new HashSet();
+ Set potentiallyRemovedElements = new HashSet();
+ collectRemoved(potentiallyRemovedElements, removedElements, delta);
+ if (removedElements.size() > 0) {
+ handleRemoved(removedElements);
+ }
+ if (potentiallyRemovedElements.size() > 0) {
+ handleRemoved(potentiallyRemovedElements);
+ }
+ }
+
+ private void handleRemoved(Set removedElements) {
+ Object[] elements = fResult.getElements();
+ for (Object element : elements) {
+ if (isContainedInRemoved(removedElements, element)) {
+ if (element instanceof IJavaElement) {
+ IJavaElement je = (IJavaElement) element;
+ if (!je.exists()) {
+ Match[] matches = fResult.getMatches(element);
+ for (Match matche : matches) {
+ fResult.removeMatch(matche);
+ }
+ // XXX remove edge and element
+ }
+ } else if (element instanceof IResource) {
+ IResource resource = (IResource) element;
+ if (!resource.exists()) {
+ Match[] matches = fResult.getMatches(element);
+ for (Match matche : matches) {
+ fResult.removeMatch(matche);
+ }
+ // XXX remove edge and element
+ }
+
+ }
+ }
+ }
+ }
+
+ private boolean isContainedInRemoved(Set removedElements, Object object) {
+ for (Iterator elements = removedElements.iterator(); elements.hasNext();) {
+ if (isParentOf(elements.next(), object)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isParentOf(Object ancestor, Object descendant) {
+ while (descendant != null && !ancestor.equals(descendant)) {
+ descendant = getParent(descendant);
+ }
+ return descendant != null;
+ }
+
+ private Object getParent(Object object) {
+ if (object instanceof IJavaElement) {
+ return ((IJavaElement) object).getParent();
+ } else if (object instanceof IResource) {
+ return ((IResource) object).getParent();
+ }
+ return null;
+ }
+
+ private void collectRemoved(Set potentiallyRemovedSet, Set removedElements, IJavaElementDelta delta) {
+ if (delta.getKind() == IJavaElementDelta.REMOVED) {
+ removedElements.add(delta.getElement());
+ } else if (delta.getKind() == IJavaElementDelta.CHANGED) {
+ int flags = delta.getFlags();
+ if ((flags & REMOVED_FLAGS) != 0) {
+ potentiallyRemovedSet.add(delta.getElement());
+ } else {
+ IJavaElementDelta[] childDeltas = delta.getAffectedChildren();
+ for (IJavaElementDelta childDelta : childDeltas) {
+ collectRemoved(potentiallyRemovedSet, removedElements, childDelta);
+ }
+ }
+ }
+ IResourceDelta[] resourceDeltas = delta.getResourceDeltas();
+ if (resourceDeltas != null) {
+ for (IResourceDelta resourceDelta : resourceDeltas) {
+ collectRemovals(removedElements, resourceDelta);
+ }
+ }
+ }
+
+ public void queryAdded(ISearchQuery query) {
+ // don't care
+ }
+
+ public void queryRemoved(ISearchQuery query) {
+ if (fResult.equals(query.getSearchResult())) {
+ JavaCore.removeElementChangedListener(this);
+ NewSearchUI.removeQueryListener(this);
+ }
+ }
+
+ private void collectRemovals(Set removals, IResourceDelta delta) {
+ if (delta.getKind() == IResourceDelta.REMOVED) {
+ removals.add(delta.getResource());
+ } else {
+ IResourceDelta[] children = delta.getAffectedChildren();
+ for (IResourceDelta element : children) {
+ collectRemovals(removals, element);
+ }
+ }
+ }
+
+ public void queryStarting(ISearchQuery query) {
+ // not interested
+ }
+
+ public void queryFinished(ISearchQuery query) {
+ // not interested
+ }
+
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaImplementorsProvider.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaImplementorsProvider.java
new file mode 100644
index 0000000..1c36b8c
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaImplementorsProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaImplementorsProvider extends AbstractJavaRelationProvider {
+
+ public static final String ID = ID_GENERIC + ".implementors"; //$NON-NLS-1$
+
+ public static final String NAME = "implemented by"; //$NON-NLS-1$
+
+ public JavaImplementorsProvider() {
+ super(JavaStructureBridge.CONTENT_TYPE, ID);
+ }
+
+ @Override
+ protected boolean acceptElement(IJavaElement javaElement) {
+ return javaElement != null && javaElement instanceof IType;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaReadAccessProvider.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaReadAccessProvider.java
new file mode 100644
index 0000000..4fa4e65
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaReadAccessProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaReadAccessProvider extends AbstractJavaRelationProvider {
+
+ public static final String ID = ID_GENERIC + ".readaccess"; //$NON-NLS-1$
+
+ public static final String NAME = "read by"; //$NON-NLS-1$
+
+ public JavaReadAccessProvider() {
+ super(JavaStructureBridge.CONTENT_TYPE, ID);
+ }
+
+ @Override
+ protected boolean acceptElement(IJavaElement javaElement) {
+ return javaElement instanceof IField;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaReferencesProvider.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaReferencesProvider.java
new file mode 100644
index 0000000..f3bc754
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaReferencesProvider.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaReferencesProvider extends AbstractJavaRelationProvider {
+
+ public static final String ID = ID_GENERIC + ".references"; //$NON-NLS-1$
+
+ public static final String NAME = "referenced by"; //$NON-NLS-1$
+
+ public JavaReferencesProvider() {
+ super(JavaStructureBridge.CONTENT_TYPE, ID);
+ }
+
+ @Override
+ protected boolean acceptResultElement(IJavaElement element) {
+ if (element instanceof IImportDeclaration) {
+ return false;
+ }
+ if (element instanceof IMethod) {
+ IMethod method = (IMethod) element;
+ if (method.getElementName().startsWith("test")) { //$NON-NLS-1$
+ return false; // HACK
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaWriteAccessProvider.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaWriteAccessProvider.java
new file mode 100644
index 0000000..da45042
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/JavaWriteAccessProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
+
+/**
+ * @author Mik Kersten
+ */
+public class JavaWriteAccessProvider extends AbstractJavaRelationProvider {
+
+ public static final String ID = ID_GENERIC + ".writeaccess"; //$NON-NLS-1$
+
+ public static final String NAME = "written by"; //$NON-NLS-1$
+
+ public JavaWriteAccessProvider() {
+ super(JavaStructureBridge.CONTENT_TYPE, ID);
+ }
+
+ @Override
+ protected boolean acceptElement(IJavaElement javaElement) {
+ return javaElement instanceof IField;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/Messages.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/Messages.java
new file mode 100644
index 0000000..8082528
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.java.ui.search.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AbstractJavaRelationProvider_could_not_run_Java_search;
+
+ public static String AbstractJavaRelationProvider_Mylyn_degree_of_separation;
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/XmlActiveSearchUpdater.java b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/XmlActiveSearchUpdater.java
new file mode 100644
index 0000000..c8eef01
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/XmlActiveSearchUpdater.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.java.ui.search;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.search.internal.ui.text.FileSearchResult;
+import org.eclipse.search.ui.IQueryListener;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * COPIED FROM: org.eclipse.search.internal.ui.text.SearchResultUpdater
+ *
+ * @author Shawn Minto
+ *
+ */
+public class XmlActiveSearchUpdater implements IResourceChangeListener, IQueryListener {
+ private final FileSearchResult fResult;
+
+ public XmlActiveSearchUpdater(FileSearchResult result) {
+ fResult = result;
+ NewSearchUI.addQueryListener(this);
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+ }
+
+ public void resourceChanged(IResourceChangeEvent event) {
+ IResourceDelta delta = event.getDelta();
+ if (delta != null) {
+ handleDelta(delta);
+ }
+ }
+
+ private void handleDelta(IResourceDelta d) {
+ try {
+ d.accept(new IResourceDeltaVisitor() {
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ switch (delta.getKind()) {
+ case IResourceDelta.ADDED:
+ return false;
+ case IResourceDelta.REMOVED:
+ IResource res = delta.getResource();
+ if (res instanceof IFile) {
+ Match[] matches = fResult.getMatches(res);
+ fResult.removeMatches(matches);
+
+// for (Match matche : matches) {
+// Match m = matches[j];
+// XmlNodeHelper xnode =
+// XmlJavaReferencesProvider.nodeMap.remove(m);
+// System.out.println("REMOVED RES: " +
+// xnode.getHandle());
+// System.out.println(XmlJavaReferencesProvider.nodeMap);
+// }
+ }
+ break;
+ case IResourceDelta.CHANGED:
+ // TODO want to do something on chages to invalidate
+ // handle changed resource
+ break;
+ }
+ return true;
+ }
+ });
+ } catch (CoreException e) {
+ StatusHandler.log(e.getStatus());
+ }
+ }
+
+ public void queryAdded(ISearchQuery query) {
+ // don't care
+ }
+
+ public void queryRemoved(ISearchQuery query) {
+ if (fResult.equals(query.getSearchResult())) {
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+ NewSearchUI.removeQueryListener(this);
+ }
+ }
+
+ public void queryStarting(ISearchQuery query) {
+ // don't care
+ }
+
+ public void queryFinished(ISearchQuery query) {
+ // don't care
+ }
+}
diff --git a/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/messages.properties b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/messages.properties
new file mode 100644
index 0000000..c26a60a
--- /dev/null
+++ b/org.eclipse.mylyn.java.ui/src/org/eclipse/mylyn/internal/java/ui/search/messages.properties
@@ -0,0 +1,2 @@
+AbstractJavaRelationProvider_could_not_run_Java_search=could not run Java search
+AbstractJavaRelationProvider_Mylyn_degree_of_separation=Mylyn degree of separation:
diff --git a/org.eclipse.mylyn.monitor-feature/.project b/org.eclipse.mylyn.monitor-feature/.project
new file mode 100644
index 0000000..f9bf4cb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.monitor-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..ad8ffe0
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:08:18 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor-feature/about.html b/org.eclipse.mylyn.monitor-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor-feature/build.properties b/org.eclipse.mylyn.monitor-feature/build.properties
new file mode 100644
index 0000000..704561e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ about.html,\
+ license.html,\
+ epl-v10.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.monitor-feature/epl-v10.html b/org.eclipse.mylyn.monitor-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor-feature/feature.properties b/org.eclipse.mylyn.monitor-feature/feature.properties
new file mode 100644
index 0000000..bf990c1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn UI Usage Reporting
+description=Generate personal usage data reports and optionally share usage statistics with the eclipse.org community.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn Incubator for Eclipse 3.3 and 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.monitor-feature/feature.xml b/org.eclipse.mylyn.monitor-feature/feature.xml
new file mode 100644
index 0000000..d92edf5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/feature.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.monitor_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/incubator"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.update.ui"/>
+ <import plugin="org.eclipse.update.core"/>
+ <import plugin="org.eclipse.ui.browser"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.core.filesystem"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.net" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.apache.commons.codec" version="1.3.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.httpclient" version="3.1.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.lang" version="2.3.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.logging" version="1.0.4" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.core.net"/>
+ <import feature="org.eclipse.rcp" version="3.3.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.usage"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.commons.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.commons.net"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.context.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.monitor.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.monitor-feature/license.html b/org.eclipse.mylyn.monitor-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.monitor.core/.classpath b/org.eclipse.mylyn.monitor.core/.classpath
new file mode 100644
index 0000000..41e559d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/runtime/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.monitor.core/.cvsignore b/org.eclipse.mylyn.monitor.core/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.monitor.core/.project b/org.eclipse.mylyn.monitor.core/.project
new file mode 100644
index 0000000..003236e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.monitor.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..0711605
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.core.TimerThread' to 'ActivityTimerThread' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core.TimerThread' - Renamed element: 'org.eclipse.mylar.monitor.core.ActivityTimerThread' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TimerThread'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.core{TimerThread.java[TimerThread" matchStrategy="1" name="ActivityTimerThread" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170473912720" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..988b643
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1 @@
+1170473912720 Rename type 'TimerThread'
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..ee98d52
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.core.logging.InteractionEventLogger.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.monitor.core.logging{InteractionEventLogger.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170815623425" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original elements: org.eclipse.mylar.monitor.core.html.HtmlTag.java org.eclipse.mylar.monitor.core.html.HtmlStreamTokenizer.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.core.net" element1="/src<org.eclipse.mylar.monitor.core.html{HtmlTag.java" element2="/src<org.eclipse.mylar.monitor.core.html{HtmlStreamTokenizer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170818545620" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.html'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.core.html" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170818596883" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core.logging.AbstractMonitorLog.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core" element1="/src<org.eclipse.mylar.monitor.core.logging{AbstractMonitorLog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170818633978" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.core.collectors" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170818845448" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.core.InteractionEventObfuscator.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage" element1="/src<org.eclipse.mylar.monitor.core{InteractionEventObfuscator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170819056047" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original element: 'org.eclipse.mylar.monitor.core.collectors.AbstractMylarUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core.collectors" element1="/src<org.eclipse.mylar.monitor.core.collectors{AbstractMylarUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819706918" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original element: 'org.eclipse.mylar.monitor.core.collectors.PerspectiveUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core.collectors" element1="/src<org.eclipse.mylar.monitor.core.collectors{PerspectiveUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819897253" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.core.collectors.Util' to 'InteractionEventUtil' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core.collectors.Util' - Renamed element: 'org.eclipse.mylar.monitor.core.collectors.InteractionEventUtil' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'Util'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.core.collectors{Util.java[Util" matchStrategy="1" name="InteractionEventUtil" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170820123682" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui' - Original project: 'org.eclipse.mylar.monitor.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui' - Original element: 'org.eclipse.mylar.monitor.core.collectors.InteractionEventSummarySorter.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage.ui" element1="/src<org.eclipse.mylar.monitor.core.collectors{InteractionEventSummarySorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820374833" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.core.collectors' to 'org.eclipse.mylar.monitor.core.collection' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Renamed element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collection' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.core.collectors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.core.collectors" name="org.eclipse.mylar.monitor.core.collection" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170820412668" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.logging'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.core.logging" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170868071765" subPackages="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.core.collection' to 'org.eclipse.mylar.internal.monitor.core.collection' - Original project: 'org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collection' - Renamed element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.internal.monitor.core.collection' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.core.collection'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.core.collection" name="org.eclipse.mylar.internal.monitor.core.collection" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170868139648" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..1739822
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,13 @@
+1170815623425 Move compilation unit
+1170818545620 Move compilation units
+1170818596883 Delete element
+1170818633978 Move compilation unit
+1170818845448 Delete element
+1170819056047 Move compilation unit
+1170819706918 Move compilation unit
+1170819897253 Move compilation unit
+1170820123682 Rename type 'Util'
+1170820374833 Move compilation unit
+1170820412668 Rename package 'org.eclipse.mylar.monitor.core.collectors'
+1170868071765 Delete element
+1170868139648 Rename package 'org.eclipse.mylar.monitor.core.collection'
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..03e0962
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.util.DateUtil.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{DateUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181334620271" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.monitor.core.util' to 'org.eclipse.mylyn.internal.monitor.core.util' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core.util' - Renamed element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core.util' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.monitor.core.util'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.monitor.core.util" name="org.eclipse.mylyn.internal.monitor.core.util" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181352154623" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..bf27356
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181334620271 Move compilation unit
+1181352154623 Rename package 'org.eclipse.mylyn.monitor.core.util'
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..7a32a00
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.monitor.core.util.StatusHandler' to 'StatusManager' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.util.StatusHandler' - Renamed element: 'org.eclipse.mylyn.internal.monitor.core.util.StatusManager' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'StatusHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.monitor.core.util{StatusHandler.java[StatusHandler" matchStrategy="1" name="StatusManager" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181944304394" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..a6aa5dc
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181944304394 Rename type 'StatusHandler'
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..592c5ef
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.core.XmlUtil' to 'XmlCleaner' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.monitor.core.XmlUtil' - Renamed element: 'org.eclipse.mylyn.monitor.core.XmlCleaner' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'XmlUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.core{XmlUtil.java[XmlUtil" matchStrategy="1" name="XmlCleaner" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182278817359" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original element: 'org.eclipse.mylyn.monitor.core.XmlUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.web.core" element1="/src<org.eclipse.mylyn.monitor.core{XmlUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182281734593" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.util.StatusManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{StatusManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182568808865" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.core.StatusManager' to 'StatusHandler' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.monitor.core.StatusManager' - Renamed element: 'org.eclipse.mylyn.monitor.core.StatusHandler' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'StatusManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.core{StatusManager.java[StatusManager" matchStrategy="1" name="StatusHandler" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182568887619" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..fd6b39b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,4 @@
+1182278817359 Rename type 'XmlUtil'
+1182281734593 Move compilation unit
+1182568808865 Move compilation unit
+1182568887619 Rename type 'StatusManager'
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..77cf6b5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.core' - Original project: 'org.eclipse.mylyn.monitor.core' - Original element: 'org.eclipse.mylyn.internal.monitor.core.collection.asdf.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.monitor.core.collection{asdf.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1184030298564" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..61a714d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184030298564 Delete element
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..f2137a3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.internal.monitor.core.AggregateInteractionEvent.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.context.core/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.internal.monitor.core{AggregateInteractionEvent.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1223001659743" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..43cf249
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1 @@
+1223001659743 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..6af492c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core'
- Original element: 'org.eclipse.mylyn.internal.monitor.core.util.IStatusHandler.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{IStatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207704372900" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..9fb14b8
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1 @@
+1207704372900 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..2f986df
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 5 elements(s) to 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.commons.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Destination element: 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.commons.core'
- Original elements:
 org.eclipse.mylyn.monitor.core.IStatusHandler.java
 org.eclipse.mylyn.monitor.core.AbstractErrorReporter.java
 org.eclipse.mylyn.monitor.core.DateUtil.java
 org.eclipse.mylyn.monitor.core.CoreUtil.java
 org.eclipse.mylyn.monitor.core.StatusHandler.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.commons.core/src<org.eclipse.mylyn.commons.core" element1="/src<org.eclipse.mylyn.monitor.core{IStatusHandler.java" element2="/src<org.eclipse.mylyn.monitor.core{AbstractErrorReporter.java" element3="/src<org.eclipse.mylyn.monitor.core{DateUtil.java" element4="/src<org.eclipse.mylyn.monitor.core{CoreUtil.java" element5="/src<org.eclipse.mylyn.monitor.core{StatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209508302631" units="5" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Destination element: 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original elements:
 org.eclipse.mylyn.internal.monitor.core.IMonitorCoreConstants.java
 org.eclipse.mylyn.internal.monitor.core.ErrorReporterManager.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.commons.core/src<org.eclipse.mylyn.internal.commons.core" element1="/src<org.eclipse.mylyn.internal.monitor.core{IMonitorCoreConstants.java" element2="/src<org.eclipse.mylyn.internal.monitor.core{ErrorReporterManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209509161052" units="2" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Destination element: 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original elements:
 org.eclipse.mylyn.internal.monitor.core.util.ZipFileUtil.java
 org.eclipse.mylyn.internal.monitor.core.util.XmlStringConverter.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.commons.core/src<org.eclipse.mylyn.internal.commons.core" element1="/src<org.eclipse.mylyn.internal.monitor.core.util{ZipFileUtil.java" element2="/src<org.eclipse.mylyn.internal.monitor.core.util{XmlStringConverter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209509989081" units="2" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Original element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core.util'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.monitor.core.util" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209509995759" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..f3fe9b2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,4 @@
+1209508302631 Move compilation units
+1209509161052 Move compilation units
+1209509989081 Move compilation units
+1209509995759 Delete element
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/5/19/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2008/5/19/refactorings.history
new file mode 100644
index 0000000..e5cfa64
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/5/19/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Original element: 'schema'" description="Delete element" element1="schema" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1210120180469" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Original element: 'plugin.xml'" description="Delete element" element1="plugin.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1210120213678" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/5/19/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2008/5/19/refactorings.index
new file mode 100644
index 0000000..fd713e3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/5/19/refactorings.index
@@ -0,0 +1,2 @@
+1210120180469 Delete element
+1210120213678 Delete element
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.monitor.core/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..06bc7f4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.core'
- Original project: 'org.eclipse.mylyn.monitor.core'
- Original element: 'org.eclipse.mylyn.monitor.core.ActivityTimerThread.java'" description="Delete element" element1="/src<org.eclipse.mylyn.monitor.core{ActivityTimerThread.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212608785952" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.core/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.monitor.core/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..6cf4d05
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1 @@
+1212608785952 Delete element
diff --git a/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.monitor.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.monitor.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..60c7862
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.monitor.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.internal.monitor.core;x-friends:="org.eclipse.mylyn.monitor.ui",
+ org.eclipse.mylyn.internal.monitor.core.collection;x-friends:="org.eclipse.mylyn.monitor.ui",
+ org.eclipse.mylyn.monitor.core
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-ClassPath: .
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.monitor.core/about.html b/org.eclipse.mylyn.monitor.core/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.core/build.properties b/org.eclipse.mylyn.monitor.core/build.properties
new file mode 100644
index 0000000..08efb18
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/build.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = about.html,\
+ META-INF/,\
+ .,\
+ plugin.properties
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.monitor.core/plugin.properties b/org.eclipse.mylyn.monitor.core/plugin.properties
new file mode 100644
index 0000000..4940dc8
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.monitor.core
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Monitor Core
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/IMonitorCoreConstants.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/IMonitorCoreConstants.java
new file mode 100644
index 0000000..e2cf087
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/IMonitorCoreConstants.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core;
+
+/**
+ * @author Steffen Pingel
+ */
+public interface IMonitorCoreConstants {
+
+ public static String ID_PLUGIN = "org.eclipse.mylyn.monitor.core"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/CommandUsageCollector.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/CommandUsageCollector.java
new file mode 100644
index 0000000..061bd65
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/CommandUsageCollector.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.core.collection;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ */
+public class CommandUsageCollector implements IUsageCollector {
+
+ private final InteractionByTypeSummary commands = new InteractionByTypeSummary();
+
+ private final Set<Integer> userIdSet = new HashSet<Integer>();
+
+ public void consumeEvent(InteractionEvent event, int userId) {
+ userIdSet.add(userId);
+ if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
+ commands.setUserCount(userId, InteractionEventUtil.getCleanOriginId(event), commands.getUserCount(userId,
+ InteractionEventUtil.getCleanOriginId(event)) + 1);
+ }
+ }
+
+ public List<String> getReport() {
+ return Collections.emptyList();
+ }
+
+ public String getReportTitle() {
+ return Messages.CommandUsageCollector_Command_Usage;
+ }
+
+ public void exportAsCSVFile(String directoryName) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public InteractionByTypeSummary getCommands() {
+ return commands;
+ }
+
+ public List<String> getPlainTextReport() {
+ return Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/DataOverviewCollector.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/DataOverviewCollector.java
new file mode 100644
index 0000000..1a02190
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/DataOverviewCollector.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class DataOverviewCollector implements IUsageCollector {
+
+ private static long FIVEMININMS = 5 * 60 * 1000;
+
+ private final Map<Integer, Integer> interactionHistorySizes = new HashMap<Integer, Integer>();
+
+ private final Map<Integer, List<Date>> interactionHistoryRanges = new HashMap<Integer, List<Date>>();
+
+ private final Map<Integer, Long> interactionHistoryActiveDuration = new HashMap<Integer, Long>();
+
+ // For calculating active milliseconds
+ private int currentUser = -1;
+
+ private InteractionEvent lastUserEvent;
+
+ private static int startDatePosition = 0;
+
+ private static int endDatePosition = 1;
+
+ private String filePrefix = ""; //$NON-NLS-1$
+
+ public DataOverviewCollector(String prefix) {
+ filePrefix = prefix;
+ }
+
+ public String getReportTitle() {
+ return Messages.DataOverviewCollector_Data_Overview;
+ }
+
+ public void consumeEvent(InteractionEvent event, int userId) {
+
+ // Add to size of history
+ if (!interactionHistorySizes.containsKey(userId)) {
+ interactionHistorySizes.put(userId, 0);
+ }
+ interactionHistorySizes.put(userId, interactionHistorySizes.get(userId) + 1);
+
+ // Record start and end date of history
+ List<Date> dateRange;
+ if (!interactionHistoryRanges.containsKey(userId)) {
+ // There are two positions in the array: start and end date
+ dateRange = new ArrayList<Date>(2);
+ interactionHistoryRanges.put(userId, dateRange);
+ }
+ dateRange = interactionHistoryRanges.get(userId);
+ if (dateRange.size() == 0) {
+ dateRange.add(event.getDate());
+ } else if (dateRange.size() == 1) {
+ dateRange.add(event.getDate());
+ } else {
+ dateRange.set(endDatePosition, event.getDate());
+ }
+
+ // Accumulate active duration -- assumes see all of events of a user in
+ // order
+ if (currentUser == -1 || currentUser != userId) {
+ lastUserEvent = event;
+ currentUser = userId;
+ }
+ // Restart accumulation if greater than 5 min has elapsed between events
+ long elapsed = event.getDate().getTime() - lastUserEvent.getDate().getTime();
+ if (elapsed < FIVEMININMS) {
+ if (!interactionHistoryActiveDuration.containsKey(userId)) {
+ interactionHistoryActiveDuration.put(userId, new Long(0));
+ }
+ interactionHistoryActiveDuration.put(userId, interactionHistoryActiveDuration.get(userId) + elapsed);
+ }
+ lastUserEvent = event;
+
+ }
+
+ public List<String> getReport() {
+ List<String> report = new ArrayList<String>();
+ report.add(Messages.DataOverviewCollector__h4_Data_Overview_h4_);
+ report.add(Messages.DataOverviewCollector_Number_of_Users_ + interactionHistorySizes.keySet().size() + "<br>"); //$NON-NLS-1$
+ for (Map.Entry<Integer, Integer> entry : interactionHistorySizes.entrySet()) {
+ report.add(entry.getKey() + ": " + entry.getValue() + Messages.DataOverviewCollector_events); //$NON-NLS-1$
+ report.add(InteractionEventClassifier.formatDuration(interactionHistoryActiveDuration.get(entry.getKey()))
+ + Messages.DataOverviewCollector_active_use);
+ List<Date> dateRange = interactionHistoryRanges.get(entry.getKey());
+ long duration = dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime();
+ report.add(MessageFormat.format(Messages.DataOverviewCollector_TO_PERIOD_OF_HOURS,
+ dateRange.get(startDatePosition), dateRange.get(endDatePosition),
+ InteractionEventClassifier.formatDuration(duration)));
+
+ report.add("<br><br>"); //$NON-NLS-1$
+ }
+ return report;
+ }
+
+ public void exportAsCSVFile(String directory) {
+
+ String filename = directory + File.separator + filePrefix + "baseLine.csv"; //$NON-NLS-1$
+
+ try {
+ BufferedWriter writer = new BufferedWriter(new FileWriter(new File(filename)));
+
+ // Write the header
+ writer.write(Messages.DataOverviewCollector_CSV_USER);
+ writer.write(","); //$NON-NLS-1$
+ writer.write(Messages.DataOverviewCollector_CSV_EVENTS);
+ writer.write(","); //$NON-NLS-1$
+ writer.write(Messages.DataOverviewCollector_CSV_START);
+ writer.write(","); //$NON-NLS-1$
+ writer.write(Messages.DataOverviewCollector_CSV_END);
+ writer.write(","); //$NON-NLS-1$
+ writer.write(Messages.DataOverviewCollector_CSV_ACTIVE_USE);
+ writer.write(","); //$NON-NLS-1$
+ writer.write(Messages.DataOverviewCollector_CSV_ELAPSED_USE);
+ writer.newLine();
+
+ // Writer the rows
+ for (Map.Entry<Integer, Integer> entry : interactionHistorySizes.entrySet()) {
+ writer.write(entry.getKey().toString());
+ writer.write(","); //$NON-NLS-1$
+ writer.write(entry.getValue().toString());
+ writer.write(","); //$NON-NLS-1$
+ List<Date> dateRange = interactionHistoryRanges.get(entry.getKey());
+ writer.write(dateRange.get(startDatePosition).toString());
+ writer.write(","); //$NON-NLS-1$
+ writer.write(dateRange.get(endDatePosition).toString());
+ writer.write(","); //$NON-NLS-1$
+ long elapsed = interactionHistoryActiveDuration.get(entry.getKey());
+ writer.write(InteractionEventClassifier.formatDuration(elapsed));
+ writer.write(","); //$NON-NLS-1$
+ long duration = dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime();
+ writer.write(InteractionEventClassifier.formatDuration(duration));
+ writer.newLine();
+ }
+
+ writer.flush();
+ writer.close();
+
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, "org.eclipse.mylyn.monitor.core", "Unable to write CVS file <" //$NON-NLS-1$//$NON-NLS-2$
+ + filename + ">", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * For testing - return active use of a user
+ */
+ public long getActiveUseOfUser(int userid) {
+ if (interactionHistoryActiveDuration.containsKey(userid)) {
+ return interactionHistoryActiveDuration.get(userid);
+ }
+ return -1;
+ }
+
+ /**
+ * For testing - return number of users
+ */
+ public int getNumberOfUsers() {
+ return interactionHistorySizes.size();
+ }
+
+ /**
+ * For testing - return duration of use
+ */
+ public long getDurationUseOfUser(int userid) {
+ if (interactionHistoryRanges.containsKey(userid)) {
+ List<Date> dateRange = interactionHistoryRanges.get(userid);
+ return (dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime());
+ }
+ return -1;
+ }
+
+ /**
+ * For testing - return size of interaction history
+ */
+ public int getSizeOfHistory(int userid) {
+ if (interactionHistorySizes.containsKey(userid)) {
+ return interactionHistorySizes.get(userid);
+ }
+ return -1;
+ }
+
+ public List<String> getPlainTextReport() {
+ List<String> report = new ArrayList<String>();
+ report.add(Messages.DataOverviewCollector_Data_Overview);
+ report.add(Messages.DataOverviewCollector_Number_of_Users_ + interactionHistorySizes.keySet().size());
+ for (Map.Entry<Integer, Integer> entry : interactionHistorySizes.entrySet()) {
+ report.add(entry.getKey() + ": " + entry.getValue() + Messages.DataOverviewCollector_events); //$NON-NLS-1$
+ report.add(InteractionEventClassifier.formatDuration(interactionHistoryActiveDuration.get(entry.getKey()))
+ + Messages.DataOverviewCollector_active_use);
+ List<Date> dateRange = interactionHistoryRanges.get(entry.getKey());
+ long duration = dateRange.get(endDatePosition).getTime() - dateRange.get(startDatePosition).getTime();
+ report.add(MessageFormat.format(Messages.DataOverviewCollector_TO_PERIOD_OF_HOURS,
+ dateRange.get(startDatePosition), dateRange.get(endDatePosition),
+ InteractionEventClassifier.formatDuration(duration)));
+
+ }
+ return report;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/DelegatingUsageCollector.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/DelegatingUsageCollector.java
new file mode 100644
index 0000000..3606960
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/DelegatingUsageCollector.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class DelegatingUsageCollector implements IUsageCollector {
+
+ protected List<IUsageScanner> scanners = new ArrayList<IUsageScanner>();
+
+ public void addScanner(IUsageScanner aScanner) {
+ scanners.add(aScanner);
+ }
+
+ private List<IUsageCollector> delegates = new ArrayList<IUsageCollector>();
+
+ private String reportTitle = ""; //$NON-NLS-1$
+
+ public List<IUsageCollector> getDelegates() {
+ return delegates;
+ }
+
+ public void setDelegates(List<IUsageCollector> delegates) {
+ this.delegates = delegates;
+ }
+
+ public void consumeEvent(InteractionEvent event, int userId) {
+ for (IUsageCollector collector : delegates) {
+ collector.consumeEvent(event, userId);
+ }
+ }
+
+ public List<String> getReport() {
+ List<String> combinedReports = new ArrayList<String>();
+ for (IUsageCollector collector : delegates) {
+ combinedReports.add("<h3>" + collector.getReportTitle() + "</h3>"); //$NON-NLS-1$ //$NON-NLS-2$
+ combinedReports.addAll(collector.getReport());
+ }
+ return combinedReports;
+ }
+
+ public void exportAsCSVFile(String directory) {
+
+ }
+
+ public String getReportTitle() {
+ return reportTitle;
+ }
+
+ public void setReportTitle(String reportTitle) {
+ this.reportTitle = reportTitle;
+ }
+
+ public List<String> getPlainTextReport() {
+ List<String> combinedReports = new ArrayList<String>();
+ for (IUsageCollector collector : delegates) {
+ combinedReports.add(collector.getReportTitle());
+ combinedReports.addAll(collector.getPlainTextReport());
+ }
+ return combinedReports;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/IUsageCollector.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/IUsageCollector.java
new file mode 100644
index 0000000..ee1d37e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/IUsageCollector.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.core.collection;
+
+import java.util.List;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ */
+public interface IUsageCollector {
+
+ public String getReportTitle();
+
+ public abstract void consumeEvent(InteractionEvent event, int userId);
+
+ /**
+ * TODO: return report as HTML
+ *
+ * @return a list corresponding to all of the lines of the report
+ */
+ public abstract List<String> getReport();
+
+ /**
+ * return report as plain text
+ *
+ * @return a list corresponding to all of the lines of the report
+ */
+ public abstract List<String> getPlainTextReport();
+
+ /**
+ * Implementors will need to generate a unique filename given the directory in which to place the file
+ *
+ * @param directory
+ */
+ public abstract void exportAsCSVFile(String directory);
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/IUsageScanner.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/IUsageScanner.java
new file mode 100644
index 0000000..b1e6c61
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/IUsageScanner.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * A usage scanner will see all events for a user before any consumers
+ *
+ * @author Gail Murphy
+ */
+public interface IUsageScanner {
+
+ public void scanEvent(InteractionEvent event, int userId);
+
+ public boolean accept(int userId);
+
+ public Set<Integer> acceptedUsers();
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionByTypeSummary.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionByTypeSummary.java
new file mode 100644
index 0000000..14edf89
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionByTypeSummary.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Leah Findlater - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.core.collection;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Set;
+
+/**
+ * @author Leah Findlater
+ */
+public class InteractionByTypeSummary {
+ HashMap<String, HashMap<Integer, Integer>> usageMap;
+
+ public InteractionByTypeSummary() {
+ usageMap = new HashMap<String, HashMap<Integer, Integer>>();
+ }
+
+ public void setUserCount(int userId, String originId, int count) {
+ if (!usageMap.containsKey(originId)) {
+ usageMap.put(originId, new HashMap<Integer, Integer>());
+ }
+ usageMap.get(originId).put(userId, count);
+ }
+
+ public int getUserCount(int userId, String originId) {
+ if (usageMap.containsKey(originId) && usageMap.get(originId).containsKey(userId)) {
+ return usageMap.get(originId).get(userId);
+ } else {
+ return 0;
+ }
+ }
+
+ public int getTotalCount(String originId) {
+ int count = 0;
+ for (Integer userId : usageMap.get(originId).keySet()) {
+ count = count + usageMap.get(originId).get(userId);
+ }
+
+ return count;
+ }
+
+ public void printOut(Set<Integer> allUserIdsList) {
+ System.out.print("EventId"); //$NON-NLS-1$
+ // Collections.sort(allUserIdsList);
+ for (Integer userId : allUserIdsList) {
+ System.out.print("\t" + userId); //$NON-NLS-1$
+ }
+ System.out.println();
+
+ for (String originId : usageMap.keySet()) {
+ System.out.print(originId);
+ Set<Integer> userIdSet = usageMap.get(originId).keySet();
+ for (int userId : allUserIdsList) {
+ if (userIdSet.contains(userId)) {
+ System.out.print("\t1"); //$NON-NLS-1$
+ } else {
+ System.out.print("\t0"); //$NON-NLS-1$
+ }
+ }
+ System.out.println();
+
+ /*
+ * for (int userId : usageMap.get(originId).keySet()) {
+ * System.out.print("\t" + userId); } System.out.println();
+ */
+ }
+ }
+
+ public ArrayList<String> getOriginIdList() {
+ ArrayList<String> originIdList = new ArrayList<String>(usageMap.keySet());
+
+ return originIdList;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventClassifier.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventClassifier.java
new file mode 100644
index 0000000..c76df47
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventClassifier.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Test whether an InteractionEvent meets particular criteria
+ *
+ * @author Gail Murphy
+ * @author Mik Kersten
+ */
+public class InteractionEventClassifier {
+
+ /**
+ * isEdit currently classifies selections in editor as edits. May need to split off a different version
+ */
+ public static boolean isEdit(InteractionEvent event) {
+ return event.getKind().equals(InteractionEvent.Kind.EDIT)
+ || (event.getKind().equals(InteractionEvent.Kind.SELECTION) && isSelectionInEditor(event));
+ }
+
+ public static boolean isSelection(InteractionEvent event) {
+ return event.getKind().equals(InteractionEvent.Kind.SELECTION) && !isSelectionInEditor(event);
+ }
+
+ public static boolean isCommand(InteractionEvent event) {
+ return event.getKind().equals(InteractionEvent.Kind.COMMAND);
+ }
+
+ public static boolean isJavaEdit(InteractionEvent event) {
+ return event.getKind().equals(InteractionEvent.Kind.EDIT)
+ && (event.getOriginId().contains("java") || event.getOriginId().contains("jdt.ui")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static boolean isJDTEvent(InteractionEvent event) {
+ return (isEdit(event) || isSelection(event) || isCommand(event)) && getCleanOriginId(event).contains("jdt"); //$NON-NLS-1$
+ }
+
+ public static boolean isSelectionInEditor(InteractionEvent event) {
+ return event.getOriginId().contains("Editor") || event.getOriginId().contains("editor") //$NON-NLS-1$ //$NON-NLS-2$
+ || event.getOriginId().contains("source"); //$NON-NLS-1$
+ }
+
+ public static String getCleanOriginId(InteractionEvent event) {
+ String cleanOriginId = ""; //$NON-NLS-1$
+ String originId = event.getOriginId();
+
+ if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
+ for (int i = 0; i < originId.length(); i++) {
+ char curChar = originId.charAt(i);
+ if (!(curChar == '&')) {
+ if (Character.getType(curChar) == Character.CONTROL) {
+ cleanOriginId = cleanOriginId.concat(" "); //$NON-NLS-1$
+ } else {
+ cleanOriginId = cleanOriginId.concat(String.valueOf(curChar));
+ }
+ }
+ }
+ return cleanOriginId;
+ } else {
+ return originId;
+ }
+ }
+
+ public static String formatDuration(long timeToFormatInms) {
+ long timeInSeconds = timeToFormatInms / 1000;
+ long hours, minutes;
+ hours = timeInSeconds / 3600;
+ timeInSeconds = timeInSeconds - (hours * 3600);
+ minutes = timeInSeconds / 60;
+ timeInSeconds = timeInSeconds - (minutes * 60);
+ return hours + "." + minutes; //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventComparator.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventComparator.java
new file mode 100644
index 0000000..47e74b7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventComparator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import java.util.Comparator;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Comparator of InteractionEvents
+ *
+ * @author Gail Murphy
+ */
+public class InteractionEventComparator implements Comparator<InteractionEvent> {
+
+ public int compare(InteractionEvent arg0, InteractionEvent arg1) {
+ if (arg0.equals(arg1)) {
+ return 0;
+ }
+ if (arg0.getDate().before(arg1.getDate())) {
+ return -1;
+ }
+ return 1;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventSummary.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventSummary.java
new file mode 100644
index 0000000..9e66467
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventSummary.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Leah Findalter - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.core.collection;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Stores the type, ID, name, and usage count of a single function that can be stored in the context.
+ *
+ * @author Leah Findlater
+ * @author Mik Kersten
+ */
+public class InteractionEventSummary {
+ private String type;
+
+ private String name;
+
+ private int usageCount;
+
+ private float interestContribution;
+
+ private String delta;
+
+ private Set<Integer> userIds = new HashSet<Integer>();
+
+ public InteractionEventSummary(String type, String name, int usageCount) {
+ this.type = type;
+ this.name = name;
+ this.usageCount = usageCount;
+
+ }
+
+ public InteractionEventSummary() {
+ type = ""; //$NON-NLS-1$
+ name = ""; //$NON-NLS-1$
+ usageCount = 0;
+ }
+
+ public InteractionEventSummary(InteractionEventSummary another) {
+ this.type = another.type;
+ this.name = another.name;
+ this.usageCount = another.usageCount;
+ this.userIds.addAll(another.getUserIds());
+ }
+
+ public void combine(InteractionEventSummary another) {
+ this.usageCount = this.usageCount + another.getUsageCount();
+ this.userIds.addAll(another.getUserIds());
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name
+ * The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return Returns the type.
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * @param type
+ * The type to set.
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * @return Returns the usageCount.
+ */
+ public int getUsageCount() {
+ return usageCount;
+ }
+
+ /**
+ * @param usageCount
+ * The usageCount to set.
+ */
+ public void setUsageCount(int usageCount) {
+ this.usageCount = usageCount;
+ }
+
+ public float getInterestContribution() {
+ return interestContribution;
+ }
+
+ public void setInterestContribution(float interestContribution) {
+ this.interestContribution = interestContribution;
+ }
+
+ public String getDelta() {
+ if ("null".equals(delta)) { //$NON-NLS-1$
+ return ""; //$NON-NLS-1$
+ } else {
+ return delta;
+ }
+ }
+
+ public void setDelta(String delta) {
+ this.delta = delta;
+ }
+
+ public Set<Integer> getUserIds() {
+ return userIds;
+ }
+
+ public void setUserIds(Set<Integer> userIds) {
+ this.userIds = userIds;
+ }
+
+ public void addUserId(int userId) {
+ if (!userIds.contains(userId)) {
+ this.userIds.add(userId);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventUtil.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventUtil.java
new file mode 100644
index 0000000..c7ba9e3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/InteractionEventUtil.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class InteractionEventUtil {
+
+ public static String getCleanOriginId(InteractionEvent event) {
+ String cleanOriginId = ""; //$NON-NLS-1$
+ String originId = event.getOriginId();
+
+ if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
+ for (int i = 0; i < originId.length(); i++) {
+ char curChar = originId.charAt(i);
+ if (!(curChar == '&')) {
+ if (Character.getType(curChar) == Character.CONTROL) {
+ cleanOriginId = cleanOriginId.concat(" "); //$NON-NLS-1$
+ } else {
+ cleanOriginId = cleanOriginId.concat(String.valueOf(curChar));
+ }
+ }
+ }
+ return cleanOriginId;
+ } else {
+ return originId;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/Messages.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/Messages.java
new file mode 100644
index 0000000..5233ff5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/Messages.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.monitor.core.collection.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String CommandUsageCollector_Command_Usage;
+
+ public static String DataOverviewCollector_active_use;
+
+ public static String DataOverviewCollector_CSV_ACTIVE_USE;
+
+ public static String DataOverviewCollector_CSV_ELAPSED_USE;
+
+ public static String DataOverviewCollector_CSV_END;
+
+ public static String DataOverviewCollector_CSV_EVENTS;
+
+ public static String DataOverviewCollector_CSV_START;
+
+ public static String DataOverviewCollector_CSV_USER;
+
+ public static String DataOverviewCollector_Data_Overview;
+
+ public static String DataOverviewCollector_events;
+
+ public static String DataOverviewCollector__h4_Data_Overview_h4_;
+
+ public static String DataOverviewCollector_Number_of_Users_;
+
+ public static String DataOverviewCollector_TO_PERIOD_OF_HOURS;
+
+ public static String SummaryCollector_END_DATE;
+
+ public static String SummaryCollector_Number_of_commands_;
+
+ public static String SummaryCollector_Number_of_events_;
+
+ public static String SummaryCollector_Number_of_preference_changes;
+
+ public static String SummaryCollector_Number_of_selections_;
+
+ public static String SummaryCollector_Start_date_;
+
+ public static String SummaryCollector_Summary;
+
+ public static String ViewUsageCollector_View_Usage;
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/PercentUsageComparator.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/PercentUsageComparator.java
new file mode 100644
index 0000000..a1c644c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/PercentUsageComparator.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.core.collection;
+
+import java.util.Comparator;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ */
+public class PercentUsageComparator implements Comparator<String> {
+ public int compare(String o1, String o2) {
+ int index1 = o1.indexOf('%');
+ int index2 = o2.indexOf('%');
+ if (index1 != -1 && index2 != -1) {
+ String s1 = o1.substring(0, index1);
+ String s2 = o2.substring(0, index2);
+ return (-1) * new Float(s1).compareTo(new Float(s2));
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/SummaryCollector.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/SummaryCollector.java
new file mode 100644
index 0000000..ce770f1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/SummaryCollector.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core.collection;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class SummaryCollector implements IUsageCollector {
+
+ protected int numSelections = 0;
+
+ protected int numEdits = 0;
+
+ protected int numUserEvents = 0;
+
+ protected Date leastRecentDate = new Date();
+
+ protected Date mostRecentDate = new Date(0);
+
+ protected int numCommands = 0;
+
+ protected int numPreference = 0;
+
+ public void consumeEvent(InteractionEvent event, int userId) {
+ if (mostRecentDate.compareTo(event.getDate()) == -1) {
+ mostRecentDate = event.getDate();
+ }
+ if (leastRecentDate.compareTo(event.getDate()) == 1) {
+ leastRecentDate = event.getDate();
+ }
+
+ if (event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
+ numSelections++;
+ } else if (event.getKind().equals(InteractionEvent.Kind.EDIT)) {
+ numEdits++;
+ } else if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
+ numCommands++;
+ } else if (event.getKind().equals(InteractionEvent.Kind.PREFERENCE)) {
+ numPreference++;
+ }
+ numUserEvents++;
+ }
+
+ public List<String> getReport() {
+ List<String> summaries = new ArrayList<String>();
+
+ summaries.add(Messages.SummaryCollector_Start_date_ + leastRecentDate + Messages.SummaryCollector_END_DATE + mostRecentDate + "<br>"); //$NON-NLS-1$
+
+ summaries.add(Messages.SummaryCollector_Number_of_events_ + numUserEvents + "<br>"); //$NON-NLS-1$
+ summaries.add(Messages.SummaryCollector_Number_of_commands_ + numCommands + "<br>"); //$NON-NLS-1$
+ summaries.add(Messages.SummaryCollector_Number_of_preference_changes + numPreference + "<br>"); //$NON-NLS-1$
+ summaries.add(Messages.SummaryCollector_Number_of_selections_ + numSelections + "<br>"); //$NON-NLS-1$
+ return summaries;
+ }
+
+ public String getReportTitle() {
+ return Messages.SummaryCollector_Summary;
+ }
+
+ public void exportAsCSVFile(String directory) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public List<String> getPlainTextReport() {
+ List<String> summaries = new ArrayList<String>();
+
+ summaries.add(Messages.SummaryCollector_Start_date_ + leastRecentDate + Messages.SummaryCollector_END_DATE + mostRecentDate);
+
+ summaries.add(Messages.SummaryCollector_Number_of_events_ + numUserEvents);
+ summaries.add(Messages.SummaryCollector_Number_of_commands_ + numCommands);
+ summaries.add(Messages.SummaryCollector_Number_of_preference_changes + numPreference);
+ summaries.add(Messages.SummaryCollector_Number_of_selections_ + numSelections);
+ return summaries;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/ViewUsageCollector.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/ViewUsageCollector.java
new file mode 100644
index 0000000..ec23931
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/ViewUsageCollector.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.core.collection;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ */
+public class ViewUsageCollector implements IUsageCollector {
+
+ protected Map<Integer, Integer> usersNumSelections = new HashMap<Integer, Integer>();
+
+ protected Map<Integer, Map<String, Integer>> usersNormalViewSelections = new HashMap<Integer, Map<String, Integer>>();
+
+ protected int maxViewsToReport = -1;
+
+ public void consumeEvent(InteractionEvent event, int userId) {
+ if (!usersNumSelections.containsKey(userId)) {
+ usersNumSelections.put(userId, 0);
+ }
+
+ Map<String, Integer> normalViewSelections = usersNormalViewSelections.get(userId);
+ if (normalViewSelections == null) {
+ normalViewSelections = new HashMap<String, Integer>();
+ usersNormalViewSelections.put(userId, normalViewSelections);
+ }
+
+ if (event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
+ if (!usersNumSelections.containsKey(userId)) {
+ usersNumSelections.put(userId, 0);
+ }
+ int numEvents = usersNumSelections.get(userId) + 1;
+ usersNumSelections.put(userId, numEvents);
+
+ String viewId = event.getOriginId();
+ if (!normalViewSelections.containsKey(viewId)) {
+ normalViewSelections.put(viewId, 0);
+ }
+ int normal = normalViewSelections.get(viewId) + 1;
+ normalViewSelections.put(viewId, normal);
+ }
+ }
+
+ public List<String> getSummary(int userId, boolean html) {
+ Map<String, Integer> normalViewSelections = usersNormalViewSelections.get(userId);
+
+ float numSelections = usersNumSelections.get(userId);
+
+ List<String> summaries = new ArrayList<String>();
+ List<String> viewUsage = new ArrayList<String>();
+ for (String view : normalViewSelections.keySet()) {
+ float viewUse = ((float) (normalViewSelections.get(view))) / numSelections;
+ String formattedViewUse = formatAsPercentage(viewUse);
+ String ending = ""; //$NON-NLS-1$
+ if (html) {
+ ending = "<br>"; //$NON-NLS-1$
+ }
+ viewUsage.add(formattedViewUse + ": " + view + " (" + normalViewSelections.get(view) + ")" + ending); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ Collections.sort(viewUsage, new PercentUsageComparator());
+ int numViewsToReport = 0;
+ for (String viewUsageSummary : viewUsage) {
+ if (maxViewsToReport == -1 || numViewsToReport < maxViewsToReport || viewUsageSummary.contains("mylar")) { //$NON-NLS-1$
+ summaries.add(viewUsageSummary);
+ numViewsToReport++;
+ }
+ }
+ return summaries;
+ }
+
+ private String formatAsPercentage(float viewUse) {
+ String formattedViewUse = ("" + viewUse * 100); //$NON-NLS-1$
+
+ // sometimes the floats are so small that formattedViewUsage ends up
+ // being
+ // something like 7.68334E-4, which would get formatted to 7.68% without
+ // this check
+ if (formattedViewUse.contains("E")) { //$NON-NLS-1$
+ return "0.00%"; //$NON-NLS-1$
+ }
+
+ int indexOf2ndDecimal = formattedViewUse.indexOf('.') + 3;
+ if (indexOf2ndDecimal <= formattedViewUse.length()) {
+ formattedViewUse = formattedViewUse.substring(0, indexOf2ndDecimal);
+ }
+ return formattedViewUse + "%"; //$NON-NLS-1$
+ }
+
+ public List<String> getReport() {
+ List<String> summaries = new ArrayList<String>();
+ for (int userId : usersNormalViewSelections.keySet()) {
+ summaries.addAll(getSummary(userId, true));
+ }
+ return summaries;
+ }
+
+ public String getReportTitle() {
+ return Messages.ViewUsageCollector_View_Usage;
+ }
+
+ public void exportAsCSVFile(String directory) {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * For testing.
+ */
+ public Map<String, Integer> getNormalViewSelections() {
+ Map<String, Integer> normalViewSelections = new HashMap<String, Integer>();
+ for (int userId : usersNormalViewSelections.keySet()) {
+ normalViewSelections.putAll(usersNormalViewSelections.get(userId));
+ }
+ return normalViewSelections;
+ }
+
+ public void setMaxViewsToReport(int maxViewsToReport) {
+ this.maxViewsToReport = maxViewsToReport;
+ }
+
+ public Map<Integer, Map<String, Integer>> getUsersNormalViewSelections() {
+ return usersNormalViewSelections;
+ }
+
+ public List<String> getPlainTextReport() {
+ List<String> summaries = new ArrayList<String>();
+ for (int userId : usersNormalViewSelections.keySet()) {
+ summaries.addAll(getSummary(userId, false));
+ }
+ return summaries;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/messages.properties b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/messages.properties
new file mode 100644
index 0000000..f503edd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/internal/monitor/core/collection/messages.properties
@@ -0,0 +1,24 @@
+CommandUsageCollector_Command_Usage=Command Usage
+
+DataOverviewCollector_active_use=\ active use;
+DataOverviewCollector_CSV_ACTIVE_USE=Active Use
+DataOverviewCollector_CSV_ELAPSED_USE=Elapsed Use
+DataOverviewCollector_CSV_END=End
+DataOverviewCollector_CSV_EVENTS=Events
+DataOverviewCollector_CSV_START=Start
+DataOverviewCollector_CSV_USER=User
+DataOverviewCollector_Data_Overview=Data Overview
+DataOverviewCollector_events=\ events;
+DataOverviewCollector__h4_Data_Overview_h4_=<h4>Data Overview</h4>
+DataOverviewCollector_Number_of_Users_=Number of Users:
+DataOverviewCollector_TO_PERIOD_OF_HOURS={0} to {1}, a period of {2} hours.
+
+SummaryCollector_END_DATE=, End date:
+SummaryCollector_Number_of_commands_=Number of commands:
+SummaryCollector_Number_of_events_=Number of events:
+SummaryCollector_Number_of_preference_changes=Number of preference changes:
+SummaryCollector_Number_of_selections_=Number of selections:
+SummaryCollector_Start_date_=Start date:
+SummaryCollector_Summary=Summary
+
+ViewUsageCollector_View_Usage=View Usage
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/AbstractMonitorLog.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/AbstractMonitorLog.java
new file mode 100644
index 0000000..c1835e4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/AbstractMonitorLog.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.core.IMonitorCoreConstants;
+
+/**
+ * Used for logging interaction events.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractMonitorLog {
+
+ protected File outputFile;
+
+ protected FileOutputStream outputStream;
+
+ protected boolean started = false;
+
+ public AbstractMonitorLog() {
+ super();
+ }
+
+ public void startMonitoring() {
+ synchronized (this) {
+ if (started) {
+ return;
+ } else {
+ started = true;
+ }
+ }
+ try {
+ if (!outputFile.exists()) {
+ outputFile.createNewFile();
+ }
+ outputStream = new FileOutputStream(outputFile, true);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, IMonitorCoreConstants.ID_PLUGIN, "Could not log to file: " //$NON-NLS-1$
+ + outputFile.getAbsolutePath(), e));
+ }
+ }
+
+ public void stopMonitoring() {
+ try {
+ if (outputStream != null) {
+ outputStream.flush();
+ outputStream.close();
+ }
+ started = false;
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, IMonitorCoreConstants.ID_PLUGIN,
+ "Could not close interaction event stream", e)); //$NON-NLS-1$
+ }
+ }
+
+ public File moveOutputFile(String newPath) {
+ stopMonitoring();
+ File newFile = new File(newPath);
+ try {
+ if (outputFile.exists() && !newFile.exists()) {
+ outputFile.renameTo(newFile);
+ } else if (!newFile.exists()) {
+ newFile.createNewFile();
+ outputFile.delete();
+ } else {
+ outputFile.delete();
+ }
+ this.outputFile = newFile;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, IMonitorCoreConstants.ID_PLUGIN,
+ "Could not set logger output file", e)); //$NON-NLS-1$
+ }
+ startMonitoring();
+ return newFile;
+ }
+
+ public File getOutputFile() {
+ return outputFile;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/IInteractionEventListener.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/IInteractionEventListener.java
new file mode 100644
index 0000000..4846c39
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/IInteractionEventListener.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core;
+
+/**
+ * Notified of interaction events and the logging lifecycle.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface IInteractionEventListener {
+
+ public abstract void interactionObserved(InteractionEvent event);
+
+ public abstract void startMonitoring();
+
+ public abstract void stopMonitoring();
+}
diff --git a/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/InteractionEvent.java b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/InteractionEvent.java
new file mode 100644
index 0000000..87b89c2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.core/src/org/eclipse/mylyn/monitor/core/InteractionEvent.java
@@ -0,0 +1,381 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.core;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * Immutable. Encapsulates interaction made by the user or on behalf of the user.
+ *
+ * Also see: http://wiki.eclipse.org/index.php/Mylyn_Integrator_Reference#Monitor_API
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public class InteractionEvent {
+
+ /**
+ * Determines the type of interaction that took place, either initiated by the user or done on behalf of the user.
+ */
+ public enum Kind {
+ /**
+ * User selection of elements, issued by the Eclipse post-selection mechanism.
+ */
+ SELECTION,
+
+ /**
+ * Edit events that are created by text selections in an editor.
+ */
+ EDIT,
+
+ /**
+ * Commands and actions invoked via buttons, menus, and keyboard shortcuts.
+ */
+ COMMAND,
+
+ /**
+ * Workbench preference changes, sometimes made by the user, sometimes automatically on behalf of the user.
+ */
+ PREFERENCE,
+
+ /**
+ * Candidates for future interaction.
+ */
+ PREDICTION,
+
+ /**
+ * Indirect user interaction with elements (e.g. parent gets implicitly selected when element is selected).
+ */
+ PROPAGATION,
+
+ /**
+ * Direct manipulation of interest via actions such as "Mark as Landmark" and "Mark Less Interesting".
+ */
+ MANIPULATION,
+
+ /**
+ * Capture interaction with tasks, the workbench, and lifecycle events that define where the user's attention is
+ * directed.
+ */
+ ATTENTION;
+
+ /**
+ * TODO: add PREFERENCE?
+ */
+ public boolean isUserEvent() {
+ return this == SELECTION || this == EDIT || this == COMMAND || this == PREFERENCE;
+ }
+
+ /**
+ * @return Simple string representation of the event kind or "null" if no such kind.
+ */
+ @Override
+ public String toString() {
+ switch (this) {
+ case SELECTION:
+ return "selection"; //$NON-NLS-1$
+ case EDIT:
+ return "edit"; //$NON-NLS-1$
+ case COMMAND:
+ return "command"; //$NON-NLS-1$
+ case PREFERENCE:
+ return "preference"; //$NON-NLS-1$
+ case PREDICTION:
+ return "prediction"; //$NON-NLS-1$
+ case PROPAGATION:
+ return "propagation"; //$NON-NLS-1$
+ case MANIPULATION:
+ return "manipulation"; //$NON-NLS-1$
+ case ATTENTION:
+ return "attention"; //$NON-NLS-1$
+ default:
+ return "null"; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @return The corresponding event based on the string provided, or null if no such STring.
+ */
+ public static Kind fromString(String string) {
+ if (string == null) {
+ return null;
+ }
+ if (string.equals("selection")) { //$NON-NLS-1$
+ return SELECTION;
+ }
+ if (string.equals("edit")) { //$NON-NLS-1$
+ return EDIT;
+ }
+ if (string.equals("command")) { //$NON-NLS-1$
+ return COMMAND;
+ }
+ if (string.equals("preference")) { //$NON-NLS-1$
+ return PREFERENCE;
+ }
+ if (string.equals("prediction")) { //$NON-NLS-1$
+ return PREDICTION;
+ }
+ if (string.equals("propagation")) { //$NON-NLS-1$
+ return PROPAGATION;
+ }
+ if (string.equals("manipulation")) { //$NON-NLS-1$
+ return MANIPULATION;
+ }
+ if (string.equals("attention")) { //$NON-NLS-1$
+ return ATTENTION;
+ }
+ return null;
+ }
+ }
+
+ private final Kind kind;
+
+ private final Date date;
+
+ private final Date endDate;
+
+ private final String originId;
+
+ private final String structureKind;
+
+ private final String structureHandle;
+
+ private final String navigation;
+
+ private final String delta;
+
+ private final float interestContribution;
+
+ /**
+ * Use to specify an uknown identifier, e.g. for an originId.
+ */
+ public static final String ID_UNKNOWN = "?"; //$NON-NLS-1$
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public InteractionEvent(Kind kind, String structureKind, String handle, String originId) {
+ this(kind, structureKind, handle, originId, 1f);
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation) {
+ this(kind, structureKind, handle, originId, navigatedRelation, "null", 1f); //$NON-NLS-1$
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation,
+ float interestContribution) {
+ this(kind, structureKind, handle, originId, navigatedRelation, "null", interestContribution); //$NON-NLS-1$
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public static InteractionEvent makeCommand(String originId, String delta) {
+ return new InteractionEvent(InteractionEvent.Kind.COMMAND, "null", "null", originId, "null", delta, 1); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public static InteractionEvent makeCopy(InteractionEvent originalEvent, float newInterestContribution) {
+ return new InteractionEvent(originalEvent.getKind(), originalEvent.getStructureKind(),
+ originalEvent.getStructureHandle(), originalEvent.getOriginId(), originalEvent.getNavigation(),
+ originalEvent.getDelta(), newInterestContribution, originalEvent.getDate(), originalEvent.getEndDate());
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public static InteractionEvent makePreference(String originId, String delta) {
+ return new InteractionEvent(InteractionEvent.Kind.PREFERENCE, "null", "null", originId, "null", delta, 1); // default //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ // contribution
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public InteractionEvent(Kind kind, String structureKind, String handle, String originId, float interestContribution) {
+ this(kind, structureKind, handle, originId, "null", "null", interestContribution); // default //$NON-NLS-1$ //$NON-NLS-2$
+ // contribution
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation,
+ String delta, float interestContribution) {
+ Assert.isNotNull(kind);
+ Assert.isNotNull(originId);
+ this.kind = kind;
+ this.structureKind = structureKind;
+ this.structureHandle = handle;
+ this.originId = originId;
+ this.navigation = navigatedRelation;
+ this.delta = delta;
+ this.interestContribution = interestContribution;
+ this.date = Calendar.getInstance().getTime();
+ this.endDate = this.date;
+ }
+
+ /**
+ * For parameter description see this class's getters.
+ */
+ public InteractionEvent(Kind kind, String structureKind, String handle, String originId, String navigatedRelation,
+ String delta, float interestContribution, Date startDate, Date endDate) {
+ Assert.isNotNull(kind);
+ Assert.isNotNull(originId);
+ Assert.isNotNull(startDate);
+ Assert.isNotNull(endDate);
+ this.kind = kind;
+ this.structureKind = structureKind;
+ this.structureHandle = handle;
+ this.originId = originId;
+ this.navigation = navigatedRelation;
+ this.delta = delta;
+ this.interestContribution = interestContribution;
+ this.date = startDate;
+ this.endDate = endDate;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object == null || !(object instanceof InteractionEvent)) {
+ return false;
+ }
+ InteractionEvent event = (InteractionEvent) object;
+ return (date == null ? event.date == null : date.equals(event.date))
+ && (endDate == null ? event.endDate == null : endDate.equals(event.endDate))
+ && (kind == null ? event.kind == null : kind.equals(event.kind))
+ && (structureKind == null ? event.structureKind == null : structureKind.equals(event.structureKind))
+ && (structureHandle == null ? event.structureHandle == null
+ : structureHandle.equals(event.structureHandle))
+ && (originId == null ? event.originId == null : originId.equals(event.originId))
+ && (navigation == null ? event.navigation == null : navigation.equals(event.navigation))
+ && (delta == null ? event.delta == null : delta.equals(event.delta))
+ && interestContribution == event.interestContribution;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 0;
+ if (date != null) {
+ hashCode += date.hashCode();
+ }
+ if (endDate != null) {
+ hashCode += endDate.hashCode();
+ }
+ if (kind != null) {
+ hashCode += kind.hashCode();
+ }
+ if (structureKind != null) {
+ hashCode += structureKind.hashCode();
+ }
+ if (structureHandle != null) {
+ hashCode += structureHandle.hashCode();
+ }
+ if (originId != null) {
+ hashCode += originId.hashCode();
+ }
+ if (navigation != null) {
+ hashCode += navigation.hashCode();
+ }
+ if (delta != null) {
+ hashCode += delta.hashCode();
+ }
+ // TODO: could this lose precision?
+ hashCode += new Float(interestContribution).hashCode();
+ return hashCode;
+ }
+
+ @Override
+ public String toString() {
+ return "(date: " + date + ", kind: " + kind + ", sourceHandle: " + structureHandle + ", origin: " + originId //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ + ", delta: " + delta + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public boolean isValidStructureHandle() {
+ return structureHandle != null && !structureHandle.equals("null") && !structureHandle.trim().equals(ID_UNKNOWN); //$NON-NLS-1$
+ }
+
+ // TODO 4.0 change to getHandleIdentifier()
+ public String getStructureHandle() {
+ return structureHandle;
+ }
+
+ /**
+ * @return The content type of the element being interacted with.
+ */
+ public String getStructureKind() {
+ return structureKind;
+ }
+
+ /**
+ * @return Time stamp for the occurrence of the event.
+ */
+ public Date getDate() {
+ return date;
+ }
+
+ /**
+ * Can be used for extensibility, e.g. by adding an XML-encoded String.
+ *
+ * @return Additional information relevant to interaction monitoring.
+ */
+ public String getDelta() {
+ return delta;
+ }
+
+ /**
+ * @return Defines the kind of interaction that took place.
+ */
+ public Kind getKind() {
+ return kind;
+ }
+
+ /**
+ * @return The UI affordance that the event was issued from.
+ */
+ public String getOriginId() {
+ return originId;
+ }
+
+ /**
+ * @return If an aggregate event, amount of interest of all contained events.
+ */
+ // TODO: consider refactoring in order to de-couple events from interest.
+ public float getInterestContribution() {
+ return interestContribution;
+ }
+
+ /**
+ * @return If an aggregate event, time stamp of the last occurrence.
+ */
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ /**
+ * @return An identifier for the kind of relation that corresponds to the navigation to this element.
+ */
+ public String getNavigation() {
+ return navigation;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.tests/.classpath b/org.eclipse.mylyn.monitor.tests/.classpath
new file mode 100644
index 0000000..71ff97d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry excluding="org/eclipse/mylar/monitor/usage/tests/" kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.monitor.tests/.cvsignore b/org.eclipse.mylyn.monitor.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.monitor.tests/.project b/org.eclipse.mylyn.monitor.tests/.project
new file mode 100644
index 0000000..47490df
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.monitor.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.monitor.tests/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..dfa0d52
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Original element: 'org.eclipse.mylar.monitor.usage.tests.MylarMonitorUsageTestsPlugin.java'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.usage.tests{MylarMonitorUsageTestsPlugin.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1163543855613" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.tests' - Destination element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage' - Original element: 'AllMonitorUsageTests.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage" element1="/src\/org\/eclipse\/mylar\/monitor\/usage\/tests<{AllMonitorUsageTests.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1163546572445" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.tests' - Destination element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage' - Original element: 'FileDisplayDialogTest.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage" element1="/src\/org\/eclipse\/mylar\/monitor\/usage\/tests<{FileDisplayDialogTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1163546576836" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Original element: 'org.eclipse.mylar.monitor.tests/src/org/eclipse/mylar/monitor/usage/tests'" description="Delete element" element1="/src\/org\/eclipse\/mylar\/monitor\/usage\/tests" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1163546580414" subPackages="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.usage' to 'org.eclipse.mylar.monitor.usage.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Original element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage' - Renamed element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage.tests' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylar.monitor.usage'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.usage" name="org.eclipse.mylar.monitor.usage.tests" qualified="false" references="true" stamp="1163546656743" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Original element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.usage" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1163546976809" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 package(s) to 'org.eclipse.mylar.monitor.tests/src' - Original project: 'org.eclipse.mylar.monitor.tests' - Destination element: 'org.eclipse.mylar.monitor.tests/src' - Original element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.reports.tests'" description="Copy package" destination="/src" element1="/src<org.eclipse.mylar.monitor.reports.tests" flags="589830" fragments="1" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.monitor.reports.tests	true	true	org.eclipse.mylar.monitor.usage.tests" policy="org.eclipse.jdt.ui.copyPackages" stamp="1163547132546" version="1.0"/>
+<refactoring accessors="true" comment="Delete 4 element(s) from project 'org.eclipse.mylar.monitor.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Original elements: AllMonitorReportTests.java ContextParsingTest.java DataOverviewCollectorTest.java FileTool.java" description="Delete elements" element1="src/org/eclipse/mylar/monitor/usage/tests/ContextParsingTest.java" element2="src/org/eclipse/mylar/monitor/usage/tests/DataOverviewCollectorTest.java" element3="src/org/eclipse/mylar/monitor/usage/tests/AllMonitorReportTests.java" element4="src/org/eclipse/mylar/monitor/usage/tests/FileTool.java" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="4" stamp="1163547145687" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Original element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.usage'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.usage" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1163547153312" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.tests.usage.tests' - Original project: 'org.eclipse.mylar.monitor.tests' - Destination element: 'org.eclipse.mylar.monitor.tests/src/org.eclipse.mylar.monitor.tests.usage.tests' - Original element: 'org.eclipse.mylar.monitor.tests.FileDisplayDialogTest.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.tests.usage.tests" element1="/src<org.eclipse.mylar.monitor.tests{FileDisplayDialogTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1163547439597" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.monitor.tests/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..10e9505
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1,10 @@
+1163543855613 Delete element
+1163546572445 Move compilation unit
+1163546576836 Move compilation unit
+1163546580414 Delete element
+1163546656743 Rename package 'org.eclipse.mylar.monitor.usage'
+1163546976809 Delete element
+1163547132546 Copy package
+1163547145687 Delete elements
+1163547153312 Delete element
+1163547439597 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..d3c1863
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.tests.MylarMonitorTestsPlugin' to 'MonitorTestsPlugin' - Original project: 'org.eclipse.mylar.monitor.tests' - Original element: 'org.eclipse.mylar.monitor.tests.MylarMonitorTestsPlugin' - Renamed element: 'org.eclipse.mylar.monitor.tests.MonitorTestsPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarMonitorTestsPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.tests{MylarMonitorTestsPlugin.java[MylarMonitorTestsPlugin" matchStrategy="1" name="MonitorTestsPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1179859763441" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..e2e5374
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1 @@
+1179859763441 Rename type 'MylarMonitorTestsPlugin'
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..cae78de
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests' - Original project: 'org.eclipse.mylyn.monitor.tests' - Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.sandbox.tests' - Original element: 'org.eclipse.mylyn.monitor.tests.StatisticsReportingTest.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.sandbox.tests" element1="/src<org.eclipse.mylyn.monitor.tests{StatisticsReportingTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181674104725" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..50c3d58
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181674104725 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..fdbc543
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.tests'
- Original project: 'org.eclipse.mylyn.monitor.tests'
- Original element: 'org.eclipse.mylyn.monitor.tests.StatusHandlerTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.monitor.tests{StatusHandlerTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211327633311" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..83ed864
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1 @@
+1211327633311 Delete element
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..4fed974
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.tests'
- Original project: 'org.eclipse.mylyn.monitor.tests'
- Original element: 'org.eclipse.mylyn.monitor.tests.ActiveTimerTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.monitor.tests{ActiveTimerTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212608821547" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.tests/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..8867470
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1 @@
+1212608821547 Delete element
diff --git a/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..6c30227
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..d51268c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,145 @@
+#Tue Apr 08 17:50:00 PDT 2008
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_LEAK=Ignore
+API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
+ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Ignore
+ILLEGAL_IMPLEMENT=Ignore
+ILLEGAL_INSTANTIATE=Ignore
+ILLEGAL_OVERRIDE=Ignore
+ILLEGAL_REFERENCE=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
diff --git a/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.monitor.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.monitor.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f387ffb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Monitor Tests
+Bundle-SymbolicName: org.eclipse.mylyn.monitor.tests
+Bundle-Version: 0.0.0
+Bundle-Activator: org.eclipse.mylyn.monitor.tests.MonitorTestsPlugin
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.eclipse.core.runtime,
+ org.junit,
+ org.eclipse.jface,
+ org.eclipse.ui.workbench,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.jdt.ui,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.monitor.usage,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.commons.core
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: mylyn-monitor-tests.jar
+Export-Package: org.eclipse.mylyn.monitor.reports.tests;x-internal:=true,
+ org.eclipse.mylyn.monitor.tests;x-internal:=true,
+ org.eclipse.mylyn.monitor.tests.usage.tests;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.monitor.tests/about.html b/org.eclipse.mylyn.monitor.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.tests/build.properties b/org.eclipse.mylyn.monitor.tests/build.properties
new file mode 100644
index 0000000..4f3a7d7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2005 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ mylyn-monitor-tests.jar,\
+ about.html,\
+ testdata/,\
+ test-log.xml
+jars.compile.order = mylyn-monitor-tests.jar
+source.mylyn-monitor-tests.jar = src/
+output.mylyn-monitor-tests.jar = bin/
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/AllMonitorReportTests.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/AllMonitorReportTests.java
new file mode 100644
index 0000000..0b2ebea
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/AllMonitorReportTests.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.reports.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Gail Murphy
+ */
+public class AllMonitorReportTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.monitor.ui.report.tests");
+
+ // $JUnit-BEGIN$
+ // TODO: Add tests as they are developed
+ suite.addTestSuite(DataOverviewCollectorTest.class);
+ suite.addTestSuite(ContextParsingTest.class);
+ // $JUnit-END$
+
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/ContextParsingTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/ContextParsingTest.java
new file mode 100644
index 0000000..89be346
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/ContextParsingTest.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.reports.tests;
+
+import java.io.File;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.tests.MonitorTestsPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextParsingTest extends TestCase {
+
+ private static final String PATH_USAGE_FILE = "testdata/usage-parsing.zip";
+
+ private List<InteractionEvent> events;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ File file;
+ if (MonitorTestsPlugin.getDefault() != null) {
+ file = FileTool.getFileInPlugin(MonitorTestsPlugin.getDefault(), new Path(PATH_USAGE_FILE));
+ } else {
+ file = new File(PATH_USAGE_FILE);
+ }
+ InteractionEventLogger logger = new InteractionEventLogger(file);
+ events = logger.getHistoryFromFile(file);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ events.clear();
+ }
+
+ public void testOriginIdValidity() {
+ for (InteractionEvent event : events) {
+ if (event.isValidStructureHandle()) {
+ assertFalse(event.getStructureHandle().equals("null"));
+ }
+ }
+ }
+
+ public void testHistoryParsingWithDecayReset() {
+ InteractionContextScaling scalingFactors = new InteractionContextScaling();
+ // scalingFactors.setDecay(new ScalingFactor("decay", .05f));
+ InteractionContext context = new InteractionContext("test", scalingFactors);
+ int numEvents = 0;
+ for (InteractionEvent event : events) {
+ if (event.isValidStructureHandle()) {
+ // if (SelectionMonitor.isValidStructureHandle(event)) {
+ InteractionEvent newEvent = InteractionEvent.makeCopy(event, 1f);
+ context.parseEvent(newEvent);
+ if (event.isValidStructureHandle() && event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
+ // if (SelectionMonitor.isValidStructureHandle(event) &&
+ // event.getKind().equals(InteractionEvent.Kind.SELECTION))
+ // {
+ IInteractionElement element = context.parseEvent(event);
+
+ // reset decay if not selected
+ if (element.getInterest().getValue() < 0) {
+ float decayOffset = (-1) * (element.getInterest().getValue()) + 1;
+ element = context.parseEvent(new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
+ event.getStructureKind(), event.getStructureHandle(), "test-decay", decayOffset));
+ }
+
+ assertTrue("should be positive: " + element.getInterest().getValue(), element.getInterest()
+ .getValue() >= 0);
+ numEvents++;
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/DataOverviewCollectorTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/DataOverviewCollectorTest.java
new file mode 100644
index 0000000..76669e9
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/DataOverviewCollectorTest.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.reports.tests;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.internal.monitor.core.collection.DataOverviewCollector;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.mylyn.monitor.core.AbstractMonitorLog;
+import org.eclipse.mylyn.monitor.tests.MonitorTestsPlugin;
+
+/**
+ *
+ * @author Gail Murphy
+ */
+public class DataOverviewCollectorTest extends TestCase {
+
+ private DataOverviewCollector dataOverviewCollector = null;
+
+ public void testNumberOfUsers() {
+ assertTrue(dataOverviewCollector.getNumberOfUsers() == 2);
+ }
+
+ public void testActiveUse() {
+ long activeUse = dataOverviewCollector.getActiveUseOfUser(1);
+ assertTrue("User 1 Use", getHoursOfDuration(activeUse) == 0);
+ activeUse = dataOverviewCollector.getActiveUseOfUser(2);
+ assertTrue("User 2 Use", getHoursOfDuration(activeUse) == 0);
+
+ }
+
+ public void testTimePeriodOfUse() {
+ long durationOfUse = dataOverviewCollector.getDurationUseOfUser(1);
+ assertTrue("User 1 duration", getHoursOfDuration(durationOfUse) == 24);
+ durationOfUse = dataOverviewCollector.getDurationUseOfUser(2);
+ assertTrue("User 2 duration", getHoursOfDuration(durationOfUse) == 24);
+ }
+
+ public void testSizeOfHistory() {
+ int size = dataOverviewCollector.getSizeOfHistory(1);
+ assertTrue("User 1 size", size == 21);
+ size = dataOverviewCollector.getSizeOfHistory(2);
+ assertTrue("User 2 size", size == 21);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ List<File> interactionHistoryFiles = new ArrayList<File>();
+
+ // Access two interaction history files that are copies of each other
+ File firstInteractionHistoryFile = FileTool.getFileInPlugin(MonitorTestsPlugin.getDefault(), new Path(
+ "testdata/USAGE-1.1.1-usage-1-2005-12-05-1-1-1.zip"));
+ interactionHistoryFiles.add(firstInteractionHistoryFile);
+ File secondInteractionHistoryFile = FileTool.getFileInPlugin(MonitorTestsPlugin.getDefault(), new Path(
+ "testdata/USAGE-1.1.1-usage-2-2005-12-05-1-1-1.zip"));
+ interactionHistoryFiles.add(secondInteractionHistoryFile);
+
+ // Initialize fake logger
+ File logFile = new File("test-log.xml");
+ logFile.delete();
+ AbstractMonitorLog logger = new InteractionEventLogger(logFile);
+ logger.startMonitoring();
+
+ // Prepare collectors
+ List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
+ dataOverviewCollector = new DataOverviewCollector("test-");
+ collectors.add(dataOverviewCollector);
+
+ ReportGenerator generator = new ReportGenerator(UiUsageMonitorPlugin.getDefault().getInteractionLogger(),
+ collectors);
+ generator.forceSyncForTesting(true);
+ generator.getStatisticsFromInteractionHistories(interactionHistoryFiles, null);
+
+ // cleanup
+ logFile.delete();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ private long getHoursOfDuration(long duration) {
+ long timeInSeconds = duration / 1000;
+ long hours = timeInSeconds / 3600;
+ return hours;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/FileTool.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/FileTool.java
new file mode 100644
index 0000000..ba7c0e3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/reports/tests/FileTool.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.reports.tests;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+
+/**
+ * Provides access to files for testing. TODO: Copied from the bugzilla component - consider refactoring as common
+ * utility
+ */
+public class FileTool {
+
+ private final static int MAX_RETRY = 5;
+
+ /**
+ * A buffer.
+ */
+ private static byte[] buffer = new byte[8192];
+
+ /**
+ * Unzips the given zip file to the given destination directory extracting only those entries the pass through the
+ * given filter.
+ *
+ * @param zipFile
+ * the zip file to unzip
+ * @param dstDir
+ * the destination directory
+ * @throws IOException
+ * in case of problem
+ */
+ public static void unzip(ZipFile zipFile, File dstDir) throws IOException {
+ unzip(zipFile, dstDir, dstDir, 0);
+ }
+
+ private static void unzip(ZipFile zipFile, File rootDstDir, File dstDir, int depth) throws IOException {
+
+ Enumeration<? extends ZipEntry> entries = zipFile.entries();
+
+ try {
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = entries.nextElement();
+ if (entry.isDirectory()) {
+ continue;
+ }
+ String entryName = entry.getName();
+ File file = new File(dstDir, changeSeparator(entryName, '/', File.separatorChar));
+ file.getParentFile().mkdirs();
+ InputStream src = null;
+ OutputStream dst = null;
+ try {
+ src = zipFile.getInputStream(entry);
+ dst = new FileOutputStream(file);
+ transferData(src, dst);
+ } finally {
+ if (dst != null) {
+ try {
+ dst.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ if (src != null) {
+ try {
+ src.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ }
+ }
+ } finally {
+ try {
+ zipFile.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ }
+
+ /**
+ * Returns the given file path with its separator character changed from the given old separator to the given new
+ * separator.
+ *
+ * @param path
+ * a file path
+ * @param oldSeparator
+ * a path separator character
+ * @param newSeparator
+ * a path separator character
+ * @return the file path with its separator character changed from the given old separator to the given new
+ * separator
+ */
+ public static String changeSeparator(String path, char oldSeparator, char newSeparator) {
+ return path.replace(oldSeparator, newSeparator);
+ }
+
+ /**
+ * Copies all bytes in the given source file to the given destination file.
+ *
+ * @param source
+ * the given source file
+ * @param destination
+ * the given destination file
+ * @throws IOException
+ * in case of error
+ */
+ public static void transferData(File source, File destination) throws IOException {
+ destination.getParentFile().mkdirs();
+ InputStream is = null;
+ OutputStream os = null;
+ try {
+ is = new FileInputStream(source);
+ os = new FileOutputStream(destination);
+ transferData(is, os);
+ } finally {
+ if (os != null) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ }
+ }
+
+ /**
+ * Copies all bytes in the given source stream to the given destination stream. Neither streams are closed.
+ *
+ * @param source
+ * the given source stream
+ * @param destination
+ * the given destination stream
+ * @throws IOException
+ * in case of error
+ */
+ public static void transferData(InputStream source, OutputStream destination) throws IOException {
+ int bytesRead = 0;
+ while (bytesRead != -1) {
+ bytesRead = source.read(buffer, 0, buffer.length);
+ if (bytesRead != -1) {
+ destination.write(buffer, 0, bytesRead);
+ }
+ }
+ }
+
+ /**
+ * Copies the given source file to the given destination file.
+ *
+ * @param src
+ * the given source file
+ * @param dst
+ * the given destination file
+ * @throws IOException
+ * in case of error
+ */
+ public static void copy(File src, File dst) throws IOException {
+ if (src.isDirectory()) {
+ String[] srcChildren = src.list();
+ for (int i = 0; i < srcChildren.length; ++i) {
+ File srcChild = new File(src, srcChildren[i]);
+ File dstChild = new File(dst, srcChildren[i]);
+ copy(srcChild, dstChild);
+ }
+ } else {
+ transferData(src, dst);
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public static File getFileInPlugin(Plugin plugin, IPath path) {
+ try {
+ URL installURL = plugin.getBundle().getEntry(path.toString());
+ URL localURL = Platform.asLocalURL(installURL);
+ return new File(localURL.getFile());
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public static File createTempFileInPlugin(Plugin plugin, IPath path) {
+ IPath stateLocation = plugin.getStateLocation();
+ stateLocation = stateLocation.append(path);
+ return stateLocation.toFile();
+ }
+
+ public static StringBuffer read(String fileName) throws IOException {
+ return read(new FileReader(fileName));
+ }
+
+ public static StringBuffer read(Reader reader) throws IOException {
+ StringBuffer s = new StringBuffer();
+ try {
+ char[] charBuffer = new char[8196];
+ int chars = reader.read(charBuffer);
+ while (chars != -1) {
+ s.append(charBuffer, 0, chars);
+ chars = reader.read(charBuffer);
+ }
+ } finally {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ return s;
+ }
+
+ public static void write(String fileName, StringBuffer content) throws IOException {
+ Writer writer = new FileWriter(fileName);
+ try {
+ writer.write(content.toString());
+ } finally {
+ try {
+ writer.close();
+ } catch (IOException e) {
+ // don't worry in the finally
+ }
+ }
+ }
+
+ public static void delete(File file) {
+ if (file.exists()) {
+ for (int i = 0; i < MAX_RETRY; i++) {
+ if (file.delete()) {
+ i = MAX_RETRY;
+ } else {
+ try {
+ Thread.sleep(1000); // sleep a second
+ } catch (InterruptedException e) {
+ // don't care if the sleep is interrupted
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/AllMonitorTests.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/AllMonitorTests.java
new file mode 100644
index 0000000..d84ada2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/AllMonitorTests.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.monitor.reports.tests.AllMonitorReportTests;
+import org.eclipse.mylyn.monitor.tests.usage.tests.AllMonitorUsageTests;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllMonitorTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.monitor.ui.tests");
+ suite.addTest(AllMonitorUsageTests.suite());
+ suite.addTest(AllMonitorReportTests.suite());
+ suite.addTestSuite(InteractionLoggerTest.class);
+ suite.addTestSuite(StatisticsLoggingTest.class);
+ suite.addTestSuite(MonitorTest.class);
+ suite.addTestSuite(InteractionEventExternalizationTest.class);
+ suite.addTestSuite(MonitorPackagingTest.class);
+ suite.addTestSuite(MultiWindowMonitorTest.class);
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/CheckActivityJobTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/CheckActivityJobTest.java
new file mode 100644
index 0000000..88b6e48
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/CheckActivityJobTest.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob;
+import org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CheckActivityJobTest extends TestCase {
+
+ private StubCallback callback;
+
+ private TestableCheckActivityJob job;
+
+ @Override
+ protected void setUp() throws Exception {
+ callback = new StubCallback();
+ job = new TestableCheckActivityJob(callback);
+ }
+
+ public void testInactivityTimeout() throws Exception {
+ callback.lastEventTime = System.currentTimeMillis() - 41;
+ job.setInactivityTimeout(40);
+ job.run();
+ assertFalse(job.isActive());
+ job.run();
+ assertFalse(job.isActive());
+ callback.lastEventTime = System.currentTimeMillis();
+ job.run();
+ assertTrue(job.isActive());
+ assertEquals(0, callback.activeTime);
+ Thread.sleep(6);
+ job.run();
+ assertTrue(job.isActive());
+ assertTrue("expected less than 5 < activeTime < 20, got " + callback.activeTime, callback.activeTime > 5
+ && callback.activeTime < 20);
+ }
+
+ public void testResumeFromSleepNoTimeout() throws Exception {
+ job.setInactivityTimeout(0);
+ job.run();
+ assertTrue(job.isActive());
+ job.run();
+ assertTrue(job.isActive());
+ assertEquals(1, callback.eventCount);
+ job.run();
+ assertEquals(2, callback.eventCount);
+ assertTrue(job.isActive());
+ Thread.sleep(11);
+ job.run();
+ assertTrue(job.isActive());
+ assertTrue("expected more than 10 ms, got " + callback.activeTime, callback.activeTime > 10);
+ assertEquals(3, callback.eventCount);
+ }
+
+ public void testResumeFromSleepTimeoutNoEvent() throws Exception {
+ callback.lastEventTime = System.currentTimeMillis();
+ job.setInactivityTimeout(20);
+ job.setTick(20);
+ job.run();
+ assertTrue(job.isActive());
+ job.run();
+ assertTrue(job.isActive());
+ assertEquals(1, callback.eventCount);
+ Thread.sleep(61);
+ // resume from sleep past timeout
+ job.run();
+ assertFalse(job.isActive());
+ job.run();
+ assertFalse(job.isActive());
+ assertTrue("expected less than 10 ms, got " + callback.activeTime, callback.activeTime < 10);
+ assertEquals(1, callback.eventCount);
+ assertEquals(callback.lastEventTime, callback.startTime);
+ }
+
+ public void testResumeFromSleepTimeoutEvent() throws Exception {
+ callback.lastEventTime = System.currentTimeMillis();
+ job.setInactivityTimeout(20);
+ job.setTick(20);
+ job.run();
+ assertTrue(job.isActive());
+ job.run();
+ assertTrue(job.isActive());
+ assertEquals(1, callback.eventCount);
+ Thread.sleep(41);
+ // resume from sleep past timeout
+ job.run();
+ assertTrue(callback.inactive);
+ assertFalse(job.isActive());
+ Thread.sleep(11);
+ // should still discard events
+ job.run();
+ assertFalse(job.isActive());
+ // start activity
+ callback.lastEventTime = System.currentTimeMillis();
+ job.run();
+ assertTrue(job.isActive());
+ assertEquals(1, callback.eventCount);
+ Thread.sleep(11);
+ job.run();
+ // check if time sleeping was logged
+ assertTrue("expected less than 10 < activeTime < 20, got " + callback.activeTime, callback.activeTime > 10
+ && callback.activeTime < 20);
+ assertEquals(2, callback.eventCount);
+ }
+
+ public void testResumeFromSleepTimeoutEventDiscarded() throws Exception {
+ callback.lastEventTime = System.currentTimeMillis();
+ job.setInactivityTimeout(20);
+ job.setTick(20);
+ job.run();
+ assertTrue(job.isActive());
+ job.run();
+ assertTrue(job.isActive());
+ assertEquals(1, callback.eventCount);
+ Thread.sleep(61);
+ // resume from sleep past timeout
+ callback.lastEventTime = System.currentTimeMillis();
+ job.run();
+ assertFalse(callback.inactive);
+ assertTrue(job.isActive());
+ Thread.sleep(6);
+ job.run();
+ assertTrue(job.isActive());
+ // check if time sleeping was logged
+ assertTrue("expected less than 5 < activeTime < 10, got " + callback.activeTime, callback.activeTime > 5
+ && callback.activeTime < 10);
+ assertEquals(2, callback.eventCount);
+ }
+
+ private class TestableCheckActivityJob extends CheckActivityJob {
+
+ public TestableCheckActivityJob(IActivityManagerCallback callback) {
+ super(callback);
+ }
+
+ public IStatus run() {
+ return super.run(new NullProgressMonitor());
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ return true;
+ }
+
+ public void setPreviousEventTime(long previousEventTime) {
+ this.previousEventTime = previousEventTime;
+ }
+
+ public void setTick(long tick) {
+ this.tick = tick;
+ }
+
+ @Override
+ public void reschedule() {
+ // ignore, job is called explicitly from test
+ }
+
+ }
+
+ private class StubCallback implements IActivityManagerCallback {
+
+ private boolean inactive;
+
+ private long lastEventTime;
+
+ private long activeTime;
+
+ private long eventCount;
+
+ private long startTime;
+
+ public void addMonitoredActivityTime(long startTime, long endTime) {
+ this.startTime = startTime;
+ this.activeTime += endTime - startTime;
+ this.eventCount++;
+ }
+
+ public void inactive() {
+ this.inactive = true;
+ }
+
+ public long getLastEventTime() {
+ return this.lastEventTime;
+ }
+
+ public void active() {
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/InteractionEventExternalizationTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/InteractionEventExternalizationTest.java
new file mode 100644
index 0000000..d1c626d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/InteractionEventExternalizationTest.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("deprecation")
+public class InteractionEventExternalizationTest extends AbstractContextTest {
+
+ private static final String PATH = "test-log.xml";
+
+ public void testXmlStringConversion() {
+ String testStrings[] = { "single", "simple string with spaces", "<embedded-xml>",
+ "<more complicated=\"xml\"><example with='comp:licated'/></more>",
+ "<embedded>\rcarriage-returns\nnewlines\tand tabs" };
+ for (String s : testStrings) {
+ assertEquals(
+ s,
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(s)));
+ }
+ }
+
+ public void testManualExternalization() throws IOException {
+ UiUsageMonitorPlugin.getPrefs().setValue(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE, false);
+
+ List<InteractionEvent> events = new ArrayList<InteractionEvent>();
+ File f = new File(PATH);
+ if (f.exists()) {
+ f.delete();
+ }
+ InteractionEventLogger logger = new InteractionEventLogger(f);
+ logger.clearInteractionHistory();
+ logger.startMonitoring();
+ String handle = "";
+ for (int i = 0; i < 100; i++) {
+ handle += "1";
+ InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", handle,
+ "originId", "navigatedRelation", "delta", 2f, new Date(), new Date());
+ events.add(event);
+ logger.interactionObserved(event);
+ }
+ logger.stopMonitoring();
+
+ File infile = new File(PATH);
+ List<InteractionEvent> readEvents = logger.getHistoryFromFile(infile);
+ for (int i = 0; i < events.size(); i++) {
+ // NOTE: shouldn't use toString(), but get timezone failures
+ assertEquals(events.get(i), readEvents.get(i));
+ // assertEquals(events.get(i), readEvents.get(i));
+ }
+
+ infile.delete();
+ UiUsageMonitorPlugin.getPrefs().setValue(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE, true);
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/InteractionLoggerTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/InteractionLoggerTest.java
new file mode 100644
index 0000000..57e47fb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/InteractionLoggerTest.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class InteractionLoggerTest extends TestCase {
+
+ private final InteractionEventLogger logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ }
+
+ public void testClearHistory() throws IOException {
+ logger.startMonitoring();
+ File monitorFile = logger.getOutputFile();
+ assertTrue(monitorFile.exists());
+ logger.interactionObserved(InteractionEvent.makeCommand("a", "b"));
+ logger.stopMonitoring();
+ assertTrue(monitorFile.length() > 0);
+ logger.clearInteractionHistory();
+ assertEquals(monitorFile.length(), 0);
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MockSelectionMonitor.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MockSelectionMonitor.java
new file mode 100644
index 0000000..afd879e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MockSelectionMonitor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class MockSelectionMonitor extends AbstractUserInteractionMonitor {
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ handleElementSelection(part, selection, contributeToContext);
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorPackagingTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorPackagingTest.java
new file mode 100644
index 0000000..e074001
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorPackagingTest.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.internal.commons.core.ZipFileUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class MonitorPackagingTest extends AbstractContextTest {
+
+ public void testCreateUploadPackage() throws IOException, InterruptedException {
+ UiUsageMonitorPlugin.getDefault().getInteractionLogger().stopMonitoring();
+
+ File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+
+ List<File> files = new ArrayList<File>();
+ files.add(monitorFile);
+ // files.add(logFile);
+
+ File zipFile = new File(ContextCorePlugin.getContextStore().getContextDirectory().getParentFile()
+ + "/mylarUpload.zip");
+
+ ZipFileUtil.createZipFile(zipFile, files);
+
+ // MylarMonitorPlugin.getDefault().startLog();
+ UiUsageMonitorPlugin.getDefault().getInteractionLogger().startMonitoring();
+
+ // pretend to upload
+ Thread.sleep(1000);
+
+ zipFile = new File(ContextCorePlugin.getContextStore().getContextDirectory().getParentFile()
+ + "/mylarUpload.zip");
+
+ // Open the ZIP file
+ ZipFile zf = new ZipFile(zipFile);
+
+ int numEntries = 0;
+
+ // Enumerate each entry
+ for (Enumeration<? extends ZipEntry> entries = zf.entries(); entries.hasMoreElements();) {
+ numEntries++;
+ String zipEntryName = ((ZipEntry) entries.nextElement()).getName();
+ assertTrue("Unknown Entry: " + zipEntryName, zipEntryName.compareTo(monitorFile.getName()) == 0);// ||
+ // zipEntryName.compareTo(logFile.getName())
+ // ==
+ // 0);
+ }
+ assertEquals("Results not correct size", 1, numEntries);
+
+ // check the length of the zip
+ // long fileLength = monitorFile.length() + logFile.length();
+ // if(monitorFile.length() != 0 || logFile.length() != 0)
+ // assertTrue("Zip didn't help", fileLength > zipFile.length());
+
+ // delete it
+ zipFile.delete();
+ }
+
+ public void testCreateLargeUploadPackage() throws IOException, InterruptedException {
+
+ for (int i = 0; i < 20000; i++) {
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(mockSelection());
+ }
+ testCreateUploadPackage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorTest.java
new file mode 100644
index 0000000..40a36d9
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorTest.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.monitor.ui.BrowserMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.KeybindingCommandMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.PerspectiveChangeMonitor;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.IMonitorLifecycleListener;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveRegistry;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class MonitorTest extends TestCase implements IMonitorLifecycleListener {
+
+ private final InteractionEventLogger logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
+
+ private final MockSelectionMonitor selectionMonitor = new MockSelectionMonitor();
+
+ private final KeybindingCommandMonitor commandMonitor = new KeybindingCommandMonitor();
+
+ private final BrowserMonitor browserMonitor = new BrowserMonitor();
+
+ private final PerspectiveChangeMonitor perspectiveMonitor = new PerspectiveChangeMonitor();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testEnablement() throws IOException {
+ File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+ assertTrue(monitorFile.exists());
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ logger.clearInteractionHistory();
+ assertEquals(0, logger.getHistoryFromFile(monitorFile).size());
+ generateSelection();
+ assertEquals(0, logger.getHistoryFromFile(monitorFile).size());
+
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ generateSelection();
+ assertEquals(1, logger.getHistoryFromFile(monitorFile).size());
+
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ generateSelection();
+ assertEquals(1, logger.getHistoryFromFile(monitorFile).size());
+
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ generateSelection();
+ assertEquals(2, logger.getHistoryFromFile(monitorFile).size());
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ }
+
+ public void testUrlFilter() {
+ browserMonitor.setAcceptedUrls("url1,url2,url3");
+ assertEquals(3, browserMonitor.getAcceptedUrls().size());
+
+ browserMonitor.setAcceptedUrls(null);
+ assertEquals(0, browserMonitor.getAcceptedUrls().size());
+
+ browserMonitor.setAcceptedUrls("");
+ assertEquals(0, browserMonitor.getAcceptedUrls().size());
+ }
+
+ @SuppressWarnings( { "deprecation", "unchecked" })
+ public void testLogging() throws InterruptedException {
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ logger.stopMonitoring();
+ UiUsageMonitorPlugin.getDefault().getMonitorLogFile().delete();
+ logger.startMonitoring();
+
+ generateSelection();
+ commandMonitor.preExecute("foo.command", new ExecutionEvent(new HashMap(), "trigger", "context"));
+ File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+ assertTrue(monitorFile.exists());
+ logger.stopMonitoring();
+ List<InteractionEvent> events = logger.getHistoryFromFile(monitorFile);
+ assertTrue("" + events.size(), events.size() >= 2);
+
+ logger.stopMonitoring();
+ events = logger.getHistoryFromFile(monitorFile);
+ assertTrue(events.size() >= 0);
+ UiUsageMonitorPlugin.getDefault().getMonitorLogFile().delete();
+ logger.startMonitoring();
+
+ generatePerspectiveSwitch();
+ assertTrue(monitorFile.exists());
+ logger.stopMonitoring();
+ events = logger.getHistoryFromFile(monitorFile);
+ assertTrue(events.size() >= 1);
+ }
+
+ private void generateSelection() {
+ selectionMonitor.selectionChanged(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart(), new StructuredSelection("yo"));
+ }
+
+ private void generatePerspectiveSwitch() {
+ IPerspectiveRegistry registry = PlatformUI.getWorkbench().getPerspectiveRegistry();
+ IPerspectiveDescriptor perspective = registry.clonePerspective("newId", "newLabel",
+ registry.getPerspectives()[0]);
+
+ perspectiveMonitor.perspectiveActivated(null, perspective);
+ }
+
+ boolean monitorRunning = false;
+
+ public void startMonitoring() {
+ monitorRunning = true;
+ }
+
+ public void stopMonitoring() {
+ monitorRunning = false;
+ }
+
+ public void testLifecycleCallbacks() {
+ assertFalse(monitorRunning);
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ UiUsageMonitorPlugin.getDefault().addMonitoringLifecycleListener(this);
+ assertTrue(monitorRunning);
+
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ assertTrue(monitorRunning);
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ assertFalse(monitorRunning);
+
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ assertTrue(monitorRunning);
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ assertFalse(monitorRunning);
+
+ UiUsageMonitorPlugin.getDefault().removeMonitoringLifecycleListener(this);
+ }
+}
+
+// public void testLogFileMove() throws IOException {
+// File defaultFile = MylarMonitorPlugin.getDefault().getMonitorLogFile();
+// MylarMonitorPlugin.getDefault().stopMonitoring();
+// assertTrue(logger.clearInteractionHistory());
+//
+// MylarMonitorPlugin.getDefault().startMonitoring();
+// generateSelection();
+// generateSelection();
+// assertEquals(2, logger.getHistoryFromFile(defaultFile).size());
+//
+// File newFile =
+// MylarMonitorPlugin.getDefault().moveMonitorLogFile(ContextCore.getMylarDataDirectory()
+// + "/monitor-test-new.xml");
+// assertNotNull(newFile);
+// File movedFile = MylarMonitorPlugin.getDefault().getMonitorLogFile();
+// assertTrue(!newFile.equals(defaultFile));
+// assertEquals(newFile, movedFile);
+// assertEquals(newFile, logger.getOutputFile());
+// assertEquals(2, logger.getHistoryFromFile(newFile).size());
+// assertEquals(0, logger.getHistoryFromFile(defaultFile).size());
+//
+// generateSelection();
+// assertEquals(3, logger.getHistoryFromFile(newFile).size());
+// File restoredFile =
+// MylarMonitorPlugin.getDefault().moveMonitorLogFile(defaultFile.getAbsolutePath());
+// assertNotNull(restoredFile);
+// }
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorTestsPlugin.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorTestsPlugin.java
new file mode 100644
index 0000000..69ad783
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MonitorTestsPlugin.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Mik Kersten
+ */
+public class MonitorTestsPlugin extends Plugin {
+
+ private static MonitorTestsPlugin plugin;
+
+ /**
+ * The constructor.
+ */
+ public MonitorTestsPlugin() {
+ super();
+ plugin = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static MonitorTestsPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MultiWindowMonitorTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MultiWindowMonitorTest.java
new file mode 100644
index 0000000..0758122
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/MultiWindowMonitorTest.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Brian de Alwis - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.monitor.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.window.WindowManager;
+import org.eclipse.mylyn.internal.monitor.ui.IMonitoredWindow;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.XMLMemento;
+import org.eclipse.ui.internal.IWorkbenchConstants;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.internal.WorkbenchWindow;
+
+/**
+ * @author Brian de Alwis
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class MultiWindowMonitorTest extends TestCase {
+
+ private class ContextAwareWorkbenchWindow extends WorkbenchWindow implements IMonitoredWindow {
+
+ private boolean monitored = true;
+
+ public ContextAwareWorkbenchWindow(int number, boolean monitored) {
+ super(number);
+ this.monitored = monitored;
+ }
+
+ public boolean isMonitored() {
+ return monitored;
+ }
+
+ public boolean isPerspectiveManaged() {
+ return false;
+ }
+ }
+
+ private class MockWorkbench {
+ private final Workbench wBench;
+
+ private WindowManager parentManager = null;
+
+ private MockWorkbench() {
+ wBench = Workbench.getInstance();
+
+ Field wManagerField;
+ try {
+ wManagerField = Workbench.class.getDeclaredField("windowManager");
+ wManagerField.setAccessible(true);
+ parentManager = (WindowManager) wManagerField.get(wBench);
+
+ } catch (Exception e) {
+ }
+ }
+
+ private int getNewWindowNumber() {
+ Window[] windows = parentManager.getWindows();
+ int count = windows.length;
+
+ boolean checkArray[] = new boolean[count];
+ for (int nX = 0; nX < count; nX++) {
+ if (windows[nX] instanceof WorkbenchWindow) {
+ WorkbenchWindow ww = (WorkbenchWindow) windows[nX];
+ int index = ww.getNumber() - 1;
+ if (index >= 0 && index < count) {
+ checkArray[index] = true;
+ }
+ }
+ }
+
+ for (int index = 0; index < count; index++) {
+ if (!checkArray[index]) {
+ return index + 1;
+ }
+ }
+ return count + 1;
+ }
+
+ private ContextAwareWorkbenchWindow newWorkbenchWindow(boolean isMonitored) {
+ return new ContextAwareWorkbenchWindow(getNewWindowNumber(), isMonitored);
+ }
+
+ public ContextAwareWorkbenchWindow restoreState(IMemento memento, boolean isMonitored) {
+
+ ContextAwareWorkbenchWindow newWindow = newWorkbenchWindow(isMonitored);
+ newWindow.create();
+
+ parentManager.add(newWindow);
+
+ boolean opened = false;
+
+ try {
+ newWindow.restoreState(memento, null);
+ newWindow.open();
+ opened = true;
+ } finally {
+ if (!opened) {
+ newWindow.close();
+ }
+ }
+
+ return newWindow;
+ }
+ }
+
+ private final InteractionEventLogger logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
+
+ private final MockSelectionMonitor selectionMonitor = new MockSelectionMonitor();
+
+ private IWorkbenchWindow window1;
+
+ private IWorkbenchWindow window2;
+
+ private IWorkbenchWindow window3;
+
+ private IWorkbenchWindow window4;
+
+ private boolean monitoringWasEnabled;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ monitoringWasEnabled = UiUsageMonitorPlugin.getDefault().isMonitoringEnabled();
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+
+ // make sure the MonitorUiPlugin is fully initialized
+ while (PlatformUI.getWorkbench().getDisplay().readAndDispatch()) {
+ }
+
+ window1 = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ assertTrue(MonitorUiPlugin.getDefault().getMonitoredWindows().contains(window1));
+ window2 = duplicateWindow(window1);
+ assertNotNull(window2);
+ assertTrue(MonitorUiPlugin.getDefault().getMonitoredWindows().contains(window2));
+ window3 = createContextAwareWindow(true, window1);
+ assertNotNull(window3);
+ assertTrue(MonitorUiPlugin.getDefault().getMonitoredWindows().contains(window3));
+ window4 = createContextAwareWindow(false, window1);
+ assertNotNull(window4);
+ assertFalse(MonitorUiPlugin.getDefault().getMonitoredWindows().contains(window4));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ window2.close();
+ window3.close();
+ window4.close();
+ if (monitoringWasEnabled) {
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ }
+ }
+
+ protected void generateSelection(IWorkbenchWindow w) {
+ selectionMonitor.selectionChanged(w.getActivePage().getActivePart(), new StructuredSelection("yo"));
+ }
+
+ public void testMultipleWindows() throws IOException {
+ File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+ logger.clearInteractionHistory();
+ assertEquals(0, logger.getHistoryFromFile(monitorFile).size());
+
+ generateSelection(window1);
+ assertEquals(0, logger.getHistoryFromFile(monitorFile).size());
+
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ generateSelection(window1);
+ generateSelection(window2);
+ generateSelection(window3);
+ generateSelection(window4);
+ assertEquals(3, logger.getHistoryFromFile(monitorFile).size());
+ }
+
+ protected IWorkbenchWindow duplicateWindow(IWorkbenchWindow window) {
+ WorkbenchWindow w = (WorkbenchWindow) window;
+ XMLMemento memento = XMLMemento.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
+ IStatus status = w.saveState(memento);
+ if (!status.isOK()) {
+ fail("failed to duplicate window: " + status);
+ }
+ return restoreWorkbenchWindow((Workbench) w.getWorkbench(), memento);
+ }
+
+ private IWorkbenchWindow createContextAwareWindow(boolean monitored, IWorkbenchWindow window) {
+ WorkbenchWindow w = (WorkbenchWindow) window;
+ XMLMemento memento = XMLMemento.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
+ IStatus status = w.saveState(memento);
+ if (!status.isOK()) {
+ fail("failed to duplicate window: " + status);
+ }
+ return new MockWorkbench().restoreState(memento, monitored);
+ }
+
+ protected IWorkbenchWindow restoreWorkbenchWindow(Workbench workbench, IMemento memento) {
+ return (IWorkbenchWindow) invokeMethod(workbench, "restoreWorkbenchWindow", new Class[] { IMemento.class },
+ new Object[] { memento });
+ }
+
+ protected Object invokeMethod(Object instance, String methodName, Class<?> argTypes[], Object arguments[]) {
+ Class<?> clas = instance.getClass();
+ try {
+ Method method = clas.getDeclaredMethod(methodName, argTypes);
+ method.setAccessible(true);
+ return method.invoke(instance, arguments);
+ } catch (Exception ex) {
+ fail("exception during reflective invocation of " + clas.getName() + "." + methodName + ": " + ex);
+ return null;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/StatisticsLoggingTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/StatisticsLoggingTest.java
new file mode 100644
index 0000000..62852fa
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/StatisticsLoggingTest.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.mylyn.context.tests.ContextTest;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
+import org.eclipse.mylyn.internal.monitor.core.collection.SummaryCollector;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
+
+/**
+ * @author Mik Kersten
+ */
+public class StatisticsLoggingTest extends ContextTest {
+
+ private File logFile;
+
+ private InteractionEventLogger logger;
+
+ private ReportGenerator report;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ logFile = new File("test-log.xml");
+ logFile.delete();
+ logger = new InteractionEventLogger(logFile);
+ logger.startMonitoring();
+ List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
+ collectors.add(new SummaryCollector());
+ report = new ReportGenerator(logger, collectors);
+ report.forceSyncForTesting(true);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ logFile.delete();
+ }
+
+ public void testFileReading() {
+ logger.interactionObserved(mockSelection());
+ mockUserDelay();
+ logger.interactionObserved(mockSelection());
+ logger.stopMonitoring();
+
+ report.getStatisticsFromInteractionHistory(logFile, new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ List<InteractionEventSummary> summary = report.getLastParsedSummary().getSingleSummaries();
+ assertEquals(1, summary.size());
+ InteractionEventSummary first = summary.get(0);
+ assertEquals(2, first.getUsageCount());
+ }
+ });
+
+ }
+
+ /**
+ * Delay enough to make replicated events different
+ */
+ private void mockUserDelay() {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException ie) {
+ ;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/AllMonitorUsageTests.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/AllMonitorUsageTests.java
new file mode 100644
index 0000000..06624de
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/AllMonitorUsageTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.monitor.tests.usage.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Meghan Allen
+ */
+public class AllMonitorUsageTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.monitor.ui.usage.tests");
+ suite.addTestSuite(FileDisplayDialogTest.class);
+ suite.addTestSuite(DefaultPreferenceConfigTest.class);
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/DefaultPreferenceConfigTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/DefaultPreferenceConfigTest.java
new file mode 100644
index 0000000..dc24ed5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/DefaultPreferenceConfigTest.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.tests.usage.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class DefaultPreferenceConfigTest extends TestCase {
+
+ public void testMonitorPreferences() {
+ assertNotNull(UiUsageMonitorPlugin.getDefault());
+ assertTrue(UiUsageMonitorPlugin.getPrefs().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE));
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/FileDisplayDialogTest.java b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/FileDisplayDialogTest.java
new file mode 100644
index 0000000..0a8e6d7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/src/org/eclipse/mylyn/monitor/tests/usage/tests/FileDisplayDialogTest.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.monitor.tests.usage.tests;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Calendar;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.context.tests.support.FileTool;
+import org.eclipse.mylyn.internal.monitor.usage.FileDisplayDialog;
+import org.eclipse.mylyn.monitor.tests.MonitorTestsPlugin;
+
+/**
+ * @author Meghan Allen
+ */
+public class FileDisplayDialogTest extends TestCase {
+
+ private static final long TWO_SECONDS = 2 * 1000;
+
+ File monitorFile;
+
+ @Override
+ protected void setUp() throws Exception {
+ monitorFile = FileTool.getFileInPlugin(MonitorTestsPlugin.getDefault(), new Path("testdata/monitor-log.xml"));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+
+ }
+
+ public void testGetContents() throws FileNotFoundException {
+ long startTime = Calendar.getInstance().getTimeInMillis();
+ FileDisplayDialog.getContents(monitorFile);
+ long endTime = Calendar.getInstance().getTimeInMillis();
+
+ assertTrue(endTime - startTime <= TWO_SECONDS);
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.tests/test-log.xml b/org.eclipse.mylyn.monitor.tests/test-log.xml
new file mode 100644
index 0000000..74b8fca
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/test-log.xml
@@ -0,0 +1,1100 @@
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.975 GMT</date>
+ <endDate>2007-10-11 00:31:59.975 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.975 GMT</date>
+ <endDate>2007-10-11 00:31:59.975 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.975 GMT</date>
+ <endDate>2007-10-11 00:31:59.975 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.975 GMT</date>
+ <endDate>2007-10-11 00:31:59.975 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.976 GMT</date>
+ <endDate>2007-10-11 00:31:59.976 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.977 GMT</date>
+ <endDate>2007-10-11 00:31:59.977 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.978 GMT</date>
+ <endDate>2007-10-11 00:31:59.978 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.979 GMT</date>
+ <endDate>2007-10-11 00:31:59.979 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.980 GMT</date>
+ <endDate>2007-10-11 00:31:59.980 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.980 GMT</date>
+ <endDate>2007-10-11 00:31:59.980 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.980 GMT</date>
+ <endDate>2007-10-11 00:31:59.980 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.980 GMT</date>
+ <endDate>2007-10-11 00:31:59.980 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.980 GMT</date>
+ <endDate>2007-10-11 00:31:59.980 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.980 GMT</date>
+ <endDate>2007-10-11 00:31:59.980 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.981 GMT</date>
+ <endDate>2007-10-11 00:31:59.981 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.981 GMT</date>
+ <endDate>2007-10-11 00:31:59.981 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.981 GMT</date>
+ <endDate>2007-10-11 00:31:59.981 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.982 GMT</date>
+ <endDate>2007-10-11 00:31:59.982 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.982 GMT</date>
+ <endDate>2007-10-11 00:31:59.982 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.982 GMT</date>
+ <endDate>2007-10-11 00:31:59.982 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.982 GMT</date>
+ <endDate>2007-10-11 00:31:59.982 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.982 GMT</date>
+ <endDate>2007-10-11 00:31:59.982 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.982 GMT</date>
+ <endDate>2007-10-11 00:31:59.982 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.983 GMT</date>
+ <endDate>2007-10-11 00:31:59.983 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.984 GMT</date>
+ <endDate>2007-10-11 00:31:59.984 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.985 GMT</date>
+ <endDate>2007-10-11 00:31:59.985 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.985 GMT</date>
+ <endDate>2007-10-11 00:31:59.985 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.985 GMT</date>
+ <endDate>2007-10-11 00:31:59.985 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.985 GMT</date>
+ <endDate>2007-10-11 00:31:59.985 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.986 GMT</date>
+ <endDate>2007-10-11 00:31:59.986 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.987 GMT</date>
+ <endDate>2007-10-11 00:31:59.987 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.988 GMT</date>
+ <endDate>2007-10-11 00:31:59.988 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.989 GMT</date>
+ <endDate>2007-10-11 00:31:59.989 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.991 GMT</date>
+ <endDate>2007-10-11 00:31:59.991 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.991 GMT</date>
+ <endDate>2007-10-11 00:31:59.991 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.991 GMT</date>
+ <endDate>2007-10-11 00:31:59.991 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.992 GMT</date>
+ <endDate>2007-10-11 00:31:59.992 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2007-10-11 00:31:59.993 GMT</date>
+ <endDate>2007-10-11 00:31:59.993 GMT</endDate>
+ <originId>originId</originId>
+ <structureKind>structureKind</structureKind>
+ <structureHandle>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</structureHandle>
+ <navigation>navigatedRelation</navigation>
+ <delta>delta</delta>
+ <interestContribution>2.0</interestContribution>
+</interactionEvent>
diff --git a/org.eclipse.mylyn.monitor.tests/testdata/USAGE-1.1.1-usage-1-2005-12-05-1-1-1.zip b/org.eclipse.mylyn.monitor.tests/testdata/USAGE-1.1.1-usage-1-2005-12-05-1-1-1.zip
new file mode 100644
index 0000000..aa3eb20
Binary files /dev/null and b/org.eclipse.mylyn.monitor.tests/testdata/USAGE-1.1.1-usage-1-2005-12-05-1-1-1.zip differ
diff --git a/org.eclipse.mylyn.monitor.tests/testdata/USAGE-1.1.1-usage-2-2005-12-05-1-1-1.zip b/org.eclipse.mylyn.monitor.tests/testdata/USAGE-1.1.1-usage-2-2005-12-05-1-1-1.zip
new file mode 100644
index 0000000..aa3eb20
Binary files /dev/null and b/org.eclipse.mylyn.monitor.tests/testdata/USAGE-1.1.1-usage-2-2005-12-05-1-1-1.zip differ
diff --git a/org.eclipse.mylyn.monitor.tests/testdata/monitor-log.xml b/org.eclipse.mylyn.monitor.tests/testdata/monitor-log.xml
new file mode 100644
index 0000000..407798a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.tests/testdata/monitor-log.xml
@@ -0,0 +1,14476 @@
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:47:08.725 PST</date>
+ <endDate>2006-03-10 19:47:08.725 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:47:13.933 PST</date>
+ <endDate>2006-03-10 19:47:13.933 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:47:13.983 PST</date>
+ <endDate>2006-03-10 19:47:13.983 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:47:16.547 PST</date>
+ <endDate>2006-03-10 19:47:16.547 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:47:16.547 PST</date>
+ <endDate>2006-03-10 19:47:16.547 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:47:18.389 PST</date>
+ <endDate>2006-03-10 19:47:18.389 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:47:18.389 PST</date>
+ <endDate>2006-03-10 19:47:18.389 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:47:25.900 PST</date>
+ <endDate>2006-03-10 19:47:25.900 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:47:25.920 PST</date>
+ <endDate>2006-03-10 19:47:25.920 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:47:30.266 PST</date>
+ <endDate>2006-03-10 19:47:30.266 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:47:30.266 PST</date>
+ <endDate>2006-03-10 19:47:30.266 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:05.958 PST</date>
+ <endDate>2006-03-10 19:48:05.958 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:05.968 PST</date>
+ <endDate>2006-03-10 19:48:05.968 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:08.782 PST</date>
+ <endDate>2006-03-10 19:48:08.782 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:08.782 PST</date>
+ <endDate>2006-03-10 19:48:08.782 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:11.746 PST</date>
+ <endDate>2006-03-10 19:48:11.746 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:11.746 PST</date>
+ <endDate>2006-03-10 19:48:11.746 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:13.418 PST</date>
+ <endDate>2006-03-10 19:48:13.418 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:13.418 PST</date>
+ <endDate>2006-03-10 19:48:13.418 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:27.889 PST</date>
+ <endDate>2006-03-10 19:48:27.889 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:27.909 PST</date>
+ <endDate>2006-03-10 19:48:27.909 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:32.275 PST</date>
+ <endDate>2006-03-10 19:48:32.275 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:32.275 PST</date>
+ <endDate>2006-03-10 19:48:32.275 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:50.171 PST</date>
+ <endDate>2006-03-10 19:48:50.171 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:50.191 PST</date>
+ <endDate>2006-03-10 19:48:50.191 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:48:54.858 PST</date>
+ <endDate>2006-03-10 19:48:54.858 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:48:54.858 PST</date>
+ <endDate>2006-03-10 19:48:54.858 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:06.64 PST</date>
+ <endDate>2006-03-10 19:49:06.64 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:06.94 PST</date>
+ <endDate>2006-03-10 19:49:06.94 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:08.227 PST</date>
+ <endDate>2006-03-10 19:49:08.227 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:08.227 PST</date>
+ <endDate>2006-03-10 19:49:08.227 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:21.757 PST</date>
+ <endDate>2006-03-10 19:49:21.757 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:21.767 PST</date>
+ <endDate>2006-03-10 19:49:21.767 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:23.669 PST</date>
+ <endDate>2006-03-10 19:49:23.669 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:23.669 PST</date>
+ <endDate>2006-03-10 19:49:23.669 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:25.592 PST</date>
+ <endDate>2006-03-10 19:49:25.592 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:25.592 PST</date>
+ <endDate>2006-03-10 19:49:25.592 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:28.346 PST</date>
+ <endDate>2006-03-10 19:49:28.346 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:28.346 PST</date>
+ <endDate>2006-03-10 19:49:28.346 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:38.250 PST</date>
+ <endDate>2006-03-10 19:49:38.250 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:38.250 PST</date>
+ <endDate>2006-03-10 19:49:38.250 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:39.853 PST</date>
+ <endDate>2006-03-10 19:49:39.853 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:39.853 PST</date>
+ <endDate>2006-03-10 19:49:39.853 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:48.755 PST</date>
+ <endDate>2006-03-10 19:49:48.755 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:48.765 PST</date>
+ <endDate>2006-03-10 19:49:48.765 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:49:50.348 PST</date>
+ <endDate>2006-03-10 19:49:50.348 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:49:50.348 PST</date>
+ <endDate>2006-03-10 19:49:50.348 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:50:11.288 PST</date>
+ <endDate>2006-03-10 19:50:11.288 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:50:11.308 PST</date>
+ <endDate>2006-03-10 19:50:11.308 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:50:13.531 PST</date>
+ <endDate>2006-03-10 19:50:13.531 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:50:13.531 PST</date>
+ <endDate>2006-03-10 19:50:13.531 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:50:53.789 PST</date>
+ <endDate>2006-03-10 19:50:53.789 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:50:53.809 PST</date>
+ <endDate>2006-03-10 19:50:53.809 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:50:55.622 PST</date>
+ <endDate>2006-03-10 19:50:55.622 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:50:55.622 PST</date>
+ <endDate>2006-03-10 19:50:55.622 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:51:46.875 PST</date>
+ <endDate>2006-03-10 19:51:46.875 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:51:46.915 PST</date>
+ <endDate>2006-03-10 19:51:46.915 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:04.621 PST</date>
+ <endDate>2006-03-10 19:52:04.621 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:04.621 PST</date>
+ <endDate>2006-03-10 19:52:04.621 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:27.113 PST</date>
+ <endDate>2006-03-10 19:52:27.113 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:27.123 PST</date>
+ <endDate>2006-03-10 19:52:27.123 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:29.176 PST</date>
+ <endDate>2006-03-10 19:52:29.176 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:29.176 PST</date>
+ <endDate>2006-03-10 19:52:29.176 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:30.678 PST</date>
+ <endDate>2006-03-10 19:52:30.678 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:30.678 PST</date>
+ <endDate>2006-03-10 19:52:30.678 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:32.821 PST</date>
+ <endDate>2006-03-10 19:52:32.821 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:32.821 PST</date>
+ <endDate>2006-03-10 19:52:32.821 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:38.960 PST</date>
+ <endDate>2006-03-10 19:52:38.960 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:39.0 PST</date>
+ <endDate>2006-03-10 19:52:39.0 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:40.673 PST</date>
+ <endDate>2006-03-10 19:52:40.673 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:40.673 PST</date>
+ <endDate>2006-03-10 19:52:40.673 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:42.585 PST</date>
+ <endDate>2006-03-10 19:52:42.585 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:42.585 PST</date>
+ <endDate>2006-03-10 19:52:42.585 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:56.495 PST</date>
+ <endDate>2006-03-10 19:52:56.495 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:56.505 PST</date>
+ <endDate>2006-03-10 19:52:56.505 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:52:58.68 PST</date>
+ <endDate>2006-03-10 19:52:58.68 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:52:58.68 PST</date>
+ <endDate>2006-03-10 19:52:58.68 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:53:00.411 PST</date>
+ <endDate>2006-03-10 19:53:00.411 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:00.411 PST</date>
+ <endDate>2006-03-10 19:53:00.411 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:53:22.353 PST</date>
+ <endDate>2006-03-10 19:53:22.353 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:22.363 PST</date>
+ <endDate>2006-03-10 19:53:22.363 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-10 19:53:23.965 PST</date>
+ <endDate>2006-03-10 19:53:23.965 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:23.965 PST</date>
+ <endDate>2006-03-10 19:53:23.965 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:29.142 PST</date>
+ <endDate>2006-03-10 19:53:29.142 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:29.182 PST</date>
+ <endDate>2006-03-10 19:53:29.182 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:29.182 PST</date>
+ <endDate>2006-03-10 19:53:29.182 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-10 19:53:29.182 PST</date>
+ <endDate>2006-03-10 19:53:29.182 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 09:04:54.835 PST</date>
+ <endDate>2006-03-12 09:04:54.835 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 09:16:45.56 PST</date>
+ <endDate>2006-03-12 09:16:45.56 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 09:21:14.83 PST</date>
+ <endDate>2006-03-12 09:21:14.83 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 09:21:23.817 PST</date>
+ <endDate>2006-03-12 09:21:23.817 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:31:56.894 PST</date>
+ <endDate>2006-03-12 10:31:56.894 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:31:56.944 PST</date>
+ <endDate>2006-03-12 10:31:56.944 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:31:56.944 PST</date>
+ <endDate>2006-03-12 10:31:56.944 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:31:56.944 PST</date>
+ <endDate>2006-03-12 10:31:56.944 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:32:19.537 PST</date>
+ <endDate>2006-03-12 10:32:19.537 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:32:48.218 PST</date>
+ <endDate>2006-03-12 10:32:48.218 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:35:07.558 PST</date>
+ <endDate>2006-03-12 10:35:07.558 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:36:08.796 PST</date>
+ <endDate>2006-03-12 10:36:08.796 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:36:08.816 PST</date>
+ <endDate>2006-03-12 10:36:08.816 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:36:08.816 PST</date>
+ <endDate>2006-03-12 10:36:08.816 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:36:08.816 PST</date>
+ <endDate>2006-03-12 10:36:08.816 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:36:26.482 PST</date>
+ <endDate>2006-03-12 10:36:26.482 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:39:50.575 PST</date>
+ <endDate>2006-03-12 10:39:50.575 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:39:50.595 PST</date>
+ <endDate>2006-03-12 10:39:50.595 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:39:50.595 PST</date>
+ <endDate>2006-03-12 10:39:50.595 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:39:50.595 PST</date>
+ <endDate>2006-03-12 10:39:50.595 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:40:37.553 PST</date>
+ <endDate>2006-03-12 10:40:37.553 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:40:51.332 PST</date>
+ <endDate>2006-03-12 10:40:51.332 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:43:03.753 PST</date>
+ <endDate>2006-03-12 10:43:03.753 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:43:03.783 PST</date>
+ <endDate>2006-03-12 10:43:03.783 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:43:03.783 PST</date>
+ <endDate>2006-03-12 10:43:03.783 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 10:43:03.783 PST</date>
+ <endDate>2006-03-12 10:43:03.783 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:43:35.418 PST</date>
+ <endDate>2006-03-12 10:43:35.418 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 10:44:18.60 PST</date>
+ <endDate>2006-03-12 10:44:18.60 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:00:30.703 PST</date>
+ <endDate>2006-03-12 11:00:30.703 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:00:30.763 PST</date>
+ <endDate>2006-03-12 11:00:30.763 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:00:30.773 PST</date>
+ <endDate>2006-03-12 11:00:30.773 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:00:30.773 PST</date>
+ <endDate>2006-03-12 11:00:30.773 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:24:30.323 PST</date>
+ <endDate>2006-03-12 11:24:30.323 PST</endDate>
+ <originId>org.eclipse.jdt.ui.navigate.open.type</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:34.78 PST</date>
+ <endDate>2006-03-12 11:24:34.78 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:38.805 PST</date>
+ <endDate>2006-03-12 11:24:38.805 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:38.845 PST</date>
+ <endDate>2006-03-12 11:24:38.845 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:24:39.126 PST</date>
+ <endDate>2006-03-12 11:24:39.126 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>T=Fbk2uIUeLKpXi5BRC75ZAyBok=/XYAyujRQ7UXxpW=PAK1+ACp1l0I=:T=Fbk2uIUeLKpXi5BRC75ZAyBok=</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:39.136 PST</date>
+ <endDate>2006-03-12 11:24:39.136 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:39.136 PST</date>
+ <endDate>2006-03-12 11:24:39.136 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:24:46.436 PST</date>
+ <endDate>2006-03-12 11:24:46.436 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:47.648 PST</date>
+ <endDate>2006-03-12 11:24:47.648 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:47.648 PST</date>
+ <endDate>2006-03-12 11:24:47.648 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:24:47.708 PST</date>
+ <endDate>2006-03-12 11:24:47.708 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/KfybdB7uQ=44EtvNKZs=3mXPO34=:KfybdB7uQ=44EtvNKZs=3mXPO34=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:24:49.10 PST</date>
+ <endDate>2006-03-12 11:24:49.10 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/KfybdB7uQ=44EtvNKZs=3mXPO34=:KfybdB7uQ=44EtvNKZs=3mXPO34=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:50.672 PST</date>
+ <endDate>2006-03-12 11:24:50.672 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:24:50.712 PST</date>
+ <endDate>2006-03-12 11:24:50.712 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/KfybdB7uQ=44EtvNKZs=3mXPO34=:KfybdB7uQ=44EtvNKZs=3mXPO34=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:24:50.852 PST</date>
+ <endDate>2006-03-12 11:24:50.852 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/KfybdB7uQ=44EtvNKZs=3mXPO34=:Z68L15gNPPARgMj7gcPErrbiDIw=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:24:52.815 PST</date>
+ <endDate>2006-03-12 11:24:52.815 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:24:52.855 PST</date>
+ <endDate>2006-03-12 11:24:52.855 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/KfybdB7uQ=44EtvNKZs=3mXPO34=:Z68L15gNPPARgMj7gcPErrbiDIw=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:24:53.406 PST</date>
+ <endDate>2006-03-12 11:24:53.406 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/KfybdB7uQ=44EtvNKZs=3mXPO34=:q44TuySdcJZKGCfzyxAr4skdUYk=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:25:01.968 PST</date>
+ <endDate>2006-03-12 11:25:01.968 PST</endDate>
+ <originId>org.eclipse.search.ui.openSearchDialog</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:06.855 PST</date>
+ <endDate>2006-03-12 11:25:06.855 PST</endDate>
+ <originId>org.eclipse.search.ui.views.SearchView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: viewShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:06.855 PST</date>
+ <endDate>2006-03-12 11:25:06.855 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: viewShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:25:10.350 PST</date>
+ <endDate>2006-03-12 11:25:10.350 PST</endDate>
+ <originId>org.eclipse.search.ui.openSearchDialog</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:17.701 PST</date>
+ <endDate>2006-03-12 11:25:17.701 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:SvJjKJMTOvImC5qopXiyMHcMItQ=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:17.821 PST</date>
+ <endDate>2006-03-12 11:25:17.821 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:17.831 PST</date>
+ <endDate>2006-03-12 11:25:17.831 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:18.592 PST</date>
+ <endDate>2006-03-12 11:25:18.592 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:LGpmJfjPFhGG80bNCx+3R2C4yJU=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:25.102 PST</date>
+ <endDate>2006-03-12 11:25:25.102 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:32rRkDfJeYfE=5eSgQwOFFNWcXw=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:26.404 PST</date>
+ <endDate>2006-03-12 11:25:26.404 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:26.544 PST</date>
+ <endDate>2006-03-12 11:25:26.544 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceType</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:FSUKUH18S4jMvVlW+WkMrc7xB9Q=</structureHandle>
+ <navigation>null</navigation>
+ <delta>predicted</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:25:27.605 PST</date>
+ <endDate>2006-03-12 11:25:27.605 PST</endDate>
+ <originId>null$item.label.&Open	F3</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:27.625 PST</date>
+ <endDate>2006-03-12 11:25:27.625 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:25:27.665 PST</date>
+ <endDate>2006-03-12 11:25:27.665 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceType</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:FSUKUH18S4jMvVlW+WkMrc7xB9Q=</structureHandle>
+ <navigation>null</navigation>
+ <delta>predicted</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:28.206 PST</date>
+ <endDate>2006-03-12 11:25:28.206 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:28.256 PST</date>
+ <endDate>2006-03-12 11:25:28.256 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceType</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:FSUKUH18S4jMvVlW+WkMrc7xB9Q=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:28.336 PST</date>
+ <endDate>2006-03-12 11:25:28.336 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:LGpmJfjPFhGG80bNCx+3R2C4yJU=</structureHandle>
+ <navigation>null</navigation>
+ <delta>predicted</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:25:31.891 PST</date>
+ <endDate>2006-03-12 11:25:31.891 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestDecrementAction$item.label.Mylar: Mark Less Interesting</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:25:33.293 PST</date>
+ <endDate>2006-03-12 11:25:33.293 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:25:33.323 PST</date>
+ <endDate>2006-03-12 11:25:33.323 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:LGpmJfjPFhGG80bNCx+3R2C4yJU=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:25:33.934 PST</date>
+ <endDate>2006-03-12 11:25:33.934 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:LGpmJfjPFhGG80bNCx+3R2C4yJU=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:38.671 PST</date>
+ <endDate>2006-03-12 11:25:38.671 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:38.681 PST</date>
+ <endDate>2006-03-12 11:25:38.681 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 11:25:38.741 PST</date>
+ <endDate>2006-03-12 11:25:38.741 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:25:57.839 PST</date>
+ <endDate>2006-03-12 11:25:57.839 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:LGpmJfjPFhGG80bNCx+3R2C4yJU=</structureHandle>
+ <navigation>null</navigation>
+ <delta>predicted</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:58.410 PST</date>
+ <endDate>2006-03-12 11:25:58.410 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:h=hGtoFuNRNSjB4cyrq00dVTK08=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 11:25:59.651 PST</date>
+ <endDate>2006-03-12 11:25:59.651 PST</endDate>
+ <originId>org.eclipse.search.ui.views.SearchView</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:26:02.666 PST</date>
+ <endDate>2006-03-12 11:26:02.666 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:h=hGtoFuNRNSjB4cyrq00dVTK08=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:26:06.341 PST</date>
+ <endDate>2006-03-12 11:26:06.341 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:h=hGtoFuNRNSjB4cyrq00dVTK08=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-12 11:26:12.970 PST</date>
+ <endDate>2006-03-12 11:26:12.970 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:h=hGtoFuNRNSjB4cyrq00dVTK08=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.506 PST</date>
+ <endDate>2006-03-12 11:34:09.506 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.556 PST</date>
+ <endDate>2006-03-12 11:34:09.556 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.556 PST</date>
+ <endDate>2006-03-12 11:34:09.556 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.556 PST</date>
+ <endDate>2006-03-12 11:34:09.556 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.816 PST</date>
+ <endDate>2006-03-12 11:34:09.816 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.816 PST</date>
+ <endDate>2006-03-12 11:34:09.816 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.846 PST</date>
+ <endDate>2006-03-12 11:34:09.846 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.846 PST</date>
+ <endDate>2006-03-12 11:34:09.846 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 11:34:09.846 PST</date>
+ <endDate>2006-03-12 11:34:09.846 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 12:10:18.955 PST</date>
+ <endDate>2006-03-12 12:10:18.955 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/SvJjKJMTOvImC5qopXiyMHcMItQ=:SvJjKJMTOvImC5qopXiyMHcMItQ=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:10:25.344 PST</date>
+ <endDate>2006-03-12 12:10:25.344 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:10:25.344 PST</date>
+ <endDate>2006-03-12 12:10:25.344 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:10:29.110 PST</date>
+ <endDate>2006-03-12 12:10:29.110 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:10:29.110 PST</date>
+ <endDate>2006-03-12 12:10:29.110 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:10:42.369 PST</date>
+ <endDate>2006-03-12 12:10:42.369 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:10:42.369 PST</date>
+ <endDate>2006-03-12 12:10:42.369 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:11:42.5 PST</date>
+ <endDate>2006-03-12 12:11:42.5 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:11:42.5 PST</date>
+ <endDate>2006-03-12 12:11:42.5 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:11:43.907 PST</date>
+ <endDate>2006-03-12 12:11:43.907 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:11:43.907 PST</date>
+ <endDate>2006-03-12 12:11:43.907 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:16:27.505 PST</date>
+ <endDate>2006-03-12 12:16:27.505 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:27.505 PST</date>
+ <endDate>2006-03-12 12:16:27.505 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:16:29.568 PST</date>
+ <endDate>2006-03-12 12:16:29.568 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:29.578 PST</date>
+ <endDate>2006-03-12 12:16:29.578 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:16:41.15 PST</date>
+ <endDate>2006-03-12 12:16:41.15 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.collapse.all$item.label.Collapse All</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:16:45.151 PST</date>
+ <endDate>2006-03-12 12:16:45.151 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:45.171 PST</date>
+ <endDate>2006-03-12 12:16:45.171 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:45.171 PST</date>
+ <endDate>2006-03-12 12:16:45.171 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:45.171 PST</date>
+ <endDate>2006-03-12 12:16:45.171 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:45.191 PST</date>
+ <endDate>2006-03-12 12:16:45.191 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:45.381 PST</date>
+ <endDate>2006-03-12 12:16:45.381 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:16:51.229 PST</date>
+ <endDate>2006-03-12 12:16:51.229 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:51.239 PST</date>
+ <endDate>2006-03-12 12:16:51.239 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:16:51.239 PST</date>
+ <endDate>2006-03-12 12:16:51.239 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:16:58.370 PST</date>
+ <endDate>2006-03-12 12:16:58.370 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:18:06.868 PST</date>
+ <endDate>2006-03-12 12:18:06.868 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.collapse.all$item.label.Collapse All</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:18:09.852 PST</date>
+ <endDate>2006-03-12 12:18:09.852 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:18:09.852 PST</date>
+ <endDate>2006-03-12 12:18:09.852 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:18:11.625 PST</date>
+ <endDate>2006-03-12 12:18:11.625 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:18:11.625 PST</date>
+ <endDate>2006-03-12 12:18:11.625 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:18:21.28 PST</date>
+ <endDate>2006-03-12 12:18:21.28 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:18:21.28 PST</date>
+ <endDate>2006-03-12 12:18:21.28 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:18:23.462 PST</date>
+ <endDate>2006-03-12 12:18:23.462 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:18:23.462 PST</date>
+ <endDate>2006-03-12 12:18:23.462 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:18:25.715 PST</date>
+ <endDate>2006-03-12 12:18:25.715 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:18:25.715 PST</date>
+ <endDate>2006-03-12 12:18:25.715 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:22:32.740 PST</date>
+ <endDate>2006-03-12 12:22:32.740 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:22:32.760 PST</date>
+ <endDate>2006-03-12 12:22:32.760 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:22:32.760 PST</date>
+ <endDate>2006-03-12 12:22:32.760 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:22:32.760 PST</date>
+ <endDate>2006-03-12 12:22:32.760 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:08.662 PST</date>
+ <endDate>2006-03-12 12:23:08.662 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:13.299 PST</date>
+ <endDate>2006-03-12 12:23:13.299 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:23:13.299 PST</date>
+ <endDate>2006-03-12 12:23:13.299 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:15.71 PST</date>
+ <endDate>2006-03-12 12:23:15.71 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:23:15.71 PST</date>
+ <endDate>2006-03-12 12:23:15.71 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:38.685 PST</date>
+ <endDate>2006-03-12 12:23:38.685 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:23:38.685 PST</date>
+ <endDate>2006-03-12 12:23:38.685 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:40.428 PST</date>
+ <endDate>2006-03-12 12:23:40.428 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:23:40.428 PST</date>
+ <endDate>2006-03-12 12:23:40.428 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:50.622 PST</date>
+ <endDate>2006-03-12 12:23:50.622 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:23:50.622 PST</date>
+ <endDate>2006-03-12 12:23:50.622 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:23:52.245 PST</date>
+ <endDate>2006-03-12 12:23:52.245 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:23:52.245 PST</date>
+ <endDate>2006-03-12 12:23:52.245 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:25:25.919 PST</date>
+ <endDate>2006-03-12 12:25:25.919 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:25:25.919 PST</date>
+ <endDate>2006-03-12 12:25:25.919 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:25:28.183 PST</date>
+ <endDate>2006-03-12 12:25:28.183 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:25:28.183 PST</date>
+ <endDate>2006-03-12 12:25:28.183 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:25:29.815 PST</date>
+ <endDate>2006-03-12 12:25:29.815 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:25:29.815 PST</date>
+ <endDate>2006-03-12 12:25:29.815 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:25:31.467 PST</date>
+ <endDate>2006-03-12 12:25:31.467 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:25:31.467 PST</date>
+ <endDate>2006-03-12 12:25:31.467 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:25:56.133 PST</date>
+ <endDate>2006-03-12 12:25:56.133 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:25:56.143 PST</date>
+ <endDate>2006-03-12 12:25:56.143 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:32:39.403 PST</date>
+ <endDate>2006-03-12 12:32:39.403 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:32:39.413 PST</date>
+ <endDate>2006-03-12 12:32:39.413 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:32:41.75 PST</date>
+ <endDate>2006-03-12 12:32:41.75 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:32:41.85 PST</date>
+ <endDate>2006-03-12 12:32:41.85 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:32:43.148 PST</date>
+ <endDate>2006-03-12 12:32:43.148 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:32:43.148 PST</date>
+ <endDate>2006-03-12 12:32:43.148 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:32:45.151 PST</date>
+ <endDate>2006-03-12 12:32:45.151 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:32:45.161 PST</date>
+ <endDate>2006-03-12 12:32:45.161 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:10.618 PST</date>
+ <endDate>2006-03-12 12:33:10.618 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:10.618 PST</date>
+ <endDate>2006-03-12 12:33:10.618 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:12.370 PST</date>
+ <endDate>2006-03-12 12:33:12.370 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:12.380 PST</date>
+ <endDate>2006-03-12 12:33:12.380 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:14.153 PST</date>
+ <endDate>2006-03-12 12:33:14.153 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:14.163 PST</date>
+ <endDate>2006-03-12 12:33:14.163 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:16.847 PST</date>
+ <endDate>2006-03-12 12:33:16.847 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:16.847 PST</date>
+ <endDate>2006-03-12 12:33:16.847 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:19.580 PST</date>
+ <endDate>2006-03-12 12:33:19.580 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:19.580 PST</date>
+ <endDate>2006-03-12 12:33:19.580 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:23.276 PST</date>
+ <endDate>2006-03-12 12:33:23.276 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:23.276 PST</date>
+ <endDate>2006-03-12 12:33:23.276 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:37.116 PST</date>
+ <endDate>2006-03-12 12:33:37.116 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.mark.completed$item.label.Mark Complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:45.448 PST</date>
+ <endDate>2006-03-12 12:33:45.448 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:45.448 PST</date>
+ <endDate>2006-03-12 12:33:45.448 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:33:53.990 PST</date>
+ <endDate>2006-03-12 12:33:53.990 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:33:53.990 PST</date>
+ <endDate>2006-03-12 12:33:53.990 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:34:11.405 PST</date>
+ <endDate>2006-03-12 12:34:11.405 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.mark.incomplete$item.label.Mark Incomplete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:34:43.942 PST</date>
+ <endDate>2006-03-12 12:34:43.942 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 12:34:44.713 PST</date>
+ <endDate>2006-03-12 12:34:44.713 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.JavaProject</structureKind>
+ <structureHandle>(non-source element)</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:34:48.909 PST</date>
+ <endDate>2006-03-12 12:34:48.909 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:35:09.378 PST</date>
+ <endDate>2006-03-12 12:35:09.378 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.view.go.into$item.label.Go Into Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:35:11.642 PST</date>
+ <endDate>2006-03-12 12:35:11.642 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.view.go.up$item.label.Go Up To Root</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:15.503 PST</date>
+ <endDate>2006-03-12 12:36:15.503 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:18.538 PST</date>
+ <endDate>2006-03-12 12:36:18.538 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:24.677 PST</date>
+ <endDate>2006-03-12 12:36:24.677 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:28.642 PST</date>
+ <endDate>2006-03-12 12:36:28.642 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:36.524 PST</date>
+ <endDate>2006-03-12 12:36:36.524 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:37.805 PST</date>
+ <endDate>2006-03-12 12:36:37.805 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:36:37.805 PST</date>
+ <endDate>2006-03-12 12:36:37.805 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:39.959 PST</date>
+ <endDate>2006-03-12 12:36:39.959 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:36:59.577 PST</date>
+ <endDate>2006-03-12 12:36:59.577 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:36:59.577 PST</date>
+ <endDate>2006-03-12 12:36:59.577 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:37:01.570 PST</date>
+ <endDate>2006-03-12 12:37:01.570 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:37:01.570 PST</date>
+ <endDate>2006-03-12 12:37:01.570 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:37:02.862 PST</date>
+ <endDate>2006-03-12 12:37:02.862 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:37:02.892 PST</date>
+ <endDate>2006-03-12 12:37:02.892 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:37:02.892 PST</date>
+ <endDate>2006-03-12 12:37:02.892 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:37:02.892 PST</date>
+ <endDate>2006-03-12 12:37:02.892 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:49:40.451 PST</date>
+ <endDate>2006-03-12 12:49:40.451 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.create.category$item.label.New Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 12:53:00.128 PST</date>
+ <endDate>2006-03-12 12:53:00.128 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.remove$item.label.Remove From Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:55:10.325 PST</date>
+ <endDate>2006-03-12 12:55:10.325 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:55:10.365 PST</date>
+ <endDate>2006-03-12 12:55:10.365 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:55:10.365 PST</date>
+ <endDate>2006-03-12 12:55:10.365 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 12:55:10.365 PST</date>
+ <endDate>2006-03-12 12:55:10.365 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 13:38:34.119 PST</date>
+ <endDate>2006-03-12 13:38:34.119 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.remove$item.label.Remove From Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 13:38:35.822 PST</date>
+ <endDate>2006-03-12 13:38:35.822 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 13:38:35.872 PST</date>
+ <endDate>2006-03-12 13:38:35.872 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 13:38:35.872 PST</date>
+ <endDate>2006-03-12 13:38:35.872 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 13:38:35.872 PST</date>
+ <endDate>2006-03-12 13:38:35.872 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:09.272 PST</date>
+ <endDate>2006-03-12 15:37:09.272 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:09.292 PST</date>
+ <endDate>2006-03-12 15:37:09.292 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:11.365 PST</date>
+ <endDate>2006-03-12 15:37:11.365 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:11.546 PST</date>
+ <endDate>2006-03-12 15:37:11.546 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:28.790 PST</date>
+ <endDate>2006-03-12 15:37:28.790 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:28.860 PST</date>
+ <endDate>2006-03-12 15:37:28.860 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:28.860 PST</date>
+ <endDate>2006-03-12 15:37:28.860 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:37:28.860 PST</date>
+ <endDate>2006-03-12 15:37:28.860 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:38:28.246 PST</date>
+ <endDate>2006-03-12 15:38:28.246 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:38:35.977 PST</date>
+ <endDate>2006-03-12 15:38:35.977 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:38:36.7 PST</date>
+ <endDate>2006-03-12 15:38:36.7 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:38:39.632 PST</date>
+ <endDate>2006-03-12 15:38:39.632 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:38:39.632 PST</date>
+ <endDate>2006-03-12 15:38:39.632 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:39:20.781 PST</date>
+ <endDate>2006-03-12 15:39:20.781 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:39:20.781 PST</date>
+ <endDate>2006-03-12 15:39:20.781 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:39:22.324 PST</date>
+ <endDate>2006-03-12 15:39:22.324 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:39:36.33 PST</date>
+ <endDate>2006-03-12 15:39:36.33 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:39:43.724 PST</date>
+ <endDate>2006-03-12 15:39:43.724 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:39:43.724 PST</date>
+ <endDate>2006-03-12 15:39:43.724 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:40:27.127 PST</date>
+ <endDate>2006-03-12 15:40:27.127 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:40:27.127 PST</date>
+ <endDate>2006-03-12 15:40:27.127 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 15:47:17.947 PST</date>
+ <endDate>2006-03-12 15:47:17.947 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 15:47:17.978 PST</date>
+ <endDate>2006-03-12 15:47:17.978 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:47:18.48 PST</date>
+ <endDate>2006-03-12 15:47:18.48 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:47:26.870 PST</date>
+ <endDate>2006-03-12 15:47:26.870 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:47:28.232 PST</date>
+ <endDate>2006-03-12 15:47:28.232 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:47:42.22 PST</date>
+ <endDate>2006-03-12 15:47:42.22 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 15:47:43.3 PST</date>
+ <endDate>2006-03-12 15:47:43.3 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:47:53.529 PST</date>
+ <endDate>2006-03-12 15:47:53.529 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:47:53.559 PST</date>
+ <endDate>2006-03-12 15:47:53.559 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:47:53.559 PST</date>
+ <endDate>2006-03-12 15:47:53.559 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 15:47:53.559 PST</date>
+ <endDate>2006-03-12 15:47:53.559 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 16:56:30.158 PST</date>
+ <endDate>2006-03-12 16:56:30.158 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 16:56:38.510 PST</date>
+ <endDate>2006-03-12 16:56:38.510 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.properties$item.label.Properties</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:56:45.871 PST</date>
+ <endDate>2006-03-12 16:56:45.871 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.bugzilla</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>[obfuscated]</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:56:46.21 PST</date>
+ <endDate>2006-03-12 16:56:46.21 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.bugzilla</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>[obfuscated]</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 16:57:24.176 PST</date>
+ <endDate>2006-03-12 16:57:24.176 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 16:57:42.452 PST</date>
+ <endDate>2006-03-12 16:57:42.452 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.properties$item.label.Properties</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:57:55.310 PST</date>
+ <endDate>2006-03-12 16:57:55.310 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.bugzilla</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>[obfuscated]</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:57:55.401 PST</date>
+ <endDate>2006-03-12 16:57:55.401 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.bugzilla</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>[obfuscated]</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 16:57:58.595 PST</date>
+ <endDate>2006-03-12 16:57:58.595 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:59:29.626 PST</date>
+ <endDate>2006-03-12 16:59:29.626 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:59:29.676 PST</date>
+ <endDate>2006-03-12 16:59:29.676 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:59:29.676 PST</date>
+ <endDate>2006-03-12 16:59:29.676 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 16:59:29.676 PST</date>
+ <endDate>2006-03-12 16:59:29.676 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 17:02:02.185 PST</date>
+ <endDate>2006-03-12 17:02:02.185 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 17:02:02.236 PST</date>
+ <endDate>2006-03-12 17:02:02.236 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 17:02:02.236 PST</date>
+ <endDate>2006-03-12 17:02:02.236 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 17:02:02.236 PST</date>
+ <endDate>2006-03-12 17:02:02.236 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:18:06.208 PST</date>
+ <endDate>2006-03-12 18:18:06.208 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:18:47.197 PST</date>
+ <endDate>2006-03-12 18:18:47.197 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:19:06.24 PST</date>
+ <endDate>2006-03-12 18:19:06.24 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:19:19.974 PST</date>
+ <endDate>2006-03-12 18:19:19.974 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:19:44.269 PST</date>
+ <endDate>2006-03-12 18:19:44.269 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:19:44.319 PST</date>
+ <endDate>2006-03-12 18:19:44.319 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:19:44.319 PST</date>
+ <endDate>2006-03-12 18:19:44.319 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:19:44.319 PST</date>
+ <endDate>2006-03-12 18:19:44.319 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:22:41.865 PST</date>
+ <endDate>2006-03-12 18:22:41.865 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:22:53.912 PST</date>
+ <endDate>2006-03-12 18:22:53.912 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:23:01.563 PST</date>
+ <endDate>2006-03-12 18:23:01.563 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:01.573 PST</date>
+ <endDate>2006-03-12 18:23:01.573 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:23:03.446 PST</date>
+ <endDate>2006-03-12 18:23:03.446 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:03.446 PST</date>
+ <endDate>2006-03-12 18:23:03.446 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:16.54 PST</date>
+ <endDate>2006-03-12 18:23:16.54 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:16.54 PST</date>
+ <endDate>2006-03-12 18:23:16.54 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:20.320 PST</date>
+ <endDate>2006-03-12 18:23:20.320 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:20.400 PST</date>
+ <endDate>2006-03-12 18:23:20.400 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:29.133 PST</date>
+ <endDate>2006-03-12 18:23:29.133 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:29.133 PST</date>
+ <endDate>2006-03-12 18:23:29.133 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:32.598 PST</date>
+ <endDate>2006-03-12 18:23:32.598 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:32.648 PST</date>
+ <endDate>2006-03-12 18:23:32.648 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:23:40.689 PST</date>
+ <endDate>2006-03-12 18:23:40.689 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:46.758 PST</date>
+ <endDate>2006-03-12 18:23:46.758 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:46.758 PST</date>
+ <endDate>2006-03-12 18:23:46.758 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:23:50.43 PST</date>
+ <endDate>2006-03-12 18:23:50.43 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:52.466 PST</date>
+ <endDate>2006-03-12 18:23:52.466 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:23:52.496 PST</date>
+ <endDate>2006-03-12 18:23:52.496 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:24:03.742 PST</date>
+ <endDate>2006-03-12 18:24:03.742 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.open$item.label.Open</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:04.113 PST</date>
+ <endDate>2006-03-12 18:24:04.113 PST</endDate>
+ <originId>org.eclipse.ui.browser.editor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:04.123 PST</date>
+ <endDate>2006-03-12 18:24:04.123 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:07.748 PST</date>
+ <endDate>2006-03-12 18:24:07.748 PST</endDate>
+ <originId>org.eclipse.ui.browser.editor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:07.808 PST</date>
+ <endDate>2006-03-12 18:24:07.808 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:24:14.338 PST</date>
+ <endDate>2006-03-12 18:24:14.338 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.open$item.label.Open</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:24:42.829 PST</date>
+ <endDate>2006-03-12 18:24:42.829 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:24:47.545 PST</date>
+ <endDate>2006-03-12 18:24:47.545 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:55.627 PST</date>
+ <endDate>2006-03-12 18:24:55.627 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:55.677 PST</date>
+ <endDate>2006-03-12 18:24:55.677 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:55.677 PST</date>
+ <endDate>2006-03-12 18:24:55.677 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:24:55.677 PST</date>
+ <endDate>2006-03-12 18:24:55.677 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 18:25:11.320 PST</date>
+ <endDate>2006-03-12 18:25:11.320 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 18:25:11.920 PST</date>
+ <endDate>2006-03-12 18:25:11.920 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-12 18:25:11.920 PST</date>
+ <endDate>2006-03-12 18:25:11.920 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:25:16.36 PST</date>
+ <endDate>2006-03-12 18:25:16.36 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:25:20.723 PST</date>
+ <endDate>2006-03-12 18:25:20.723 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:26:05.497 PST</date>
+ <endDate>2006-03-12 18:26:05.497 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:26:20.158 PST</date>
+ <endDate>2006-03-12 18:26:20.158 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:26:33.818 PST</date>
+ <endDate>2006-03-12 18:26:33.818 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:27:11.793 PST</date>
+ <endDate>2006-03-12 18:27:11.793 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.create.category$item.label.New Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:27:20.15 PST</date>
+ <endDate>2006-03-12 18:27:20.15 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:32:31.703 PST</date>
+ <endDate>2006-03-12 18:32:31.703 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.addQuery$item.label.New Repository Query</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:33:16.778 PST</date>
+ <endDate>2006-03-12 18:33:16.778 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:33:30.337 PST</date>
+ <endDate>2006-03-12 18:33:30.337 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:33:30.347 PST</date>
+ <endDate>2006-03-12 18:33:30.347 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:33:33.1 PST</date>
+ <endDate>2006-03-12 18:33:33.1 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:33:33.1 PST</date>
+ <endDate>2006-03-12 18:33:33.1 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:33:51.878 PST</date>
+ <endDate>2006-03-12 18:33:51.878 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:33:51.878 PST</date>
+ <endDate>2006-03-12 18:33:51.878 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:33:55.613 PST</date>
+ <endDate>2006-03-12 18:33:55.613 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:33:55.694 PST</date>
+ <endDate>2006-03-12 18:33:55.694 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:01.41 PST</date>
+ <endDate>2006-03-12 18:34:01.41 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:06.719 PST</date>
+ <endDate>2006-03-12 18:34:06.719 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:17.685 PST</date>
+ <endDate>2006-03-12 18:34:17.685 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:18.526 PST</date>
+ <endDate>2006-03-12 18:34:18.526 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:19.448 PST</date>
+ <endDate>2006-03-12 18:34:19.448 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:20.399 PST</date>
+ <endDate>2006-03-12 18:34:20.399 PST</endDate>
+ <originId>null$item.label.Normal</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:34:20.399 PST</date>
+ <endDate>2006-03-12 18:34:20.399 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P3</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:20.950 PST</date>
+ <endDate>2006-03-12 18:34:20.950 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:34:21.981 PST</date>
+ <endDate>2006-03-12 18:34:21.981 PST</endDate>
+ <originId>null$item.label.Very Low</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:34:21.981 PST</date>
+ <endDate>2006-03-12 18:34:21.981 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P5</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:56:29.480 PST</date>
+ <endDate>2006-03-12 18:56:29.480 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:56:29.530 PST</date>
+ <endDate>2006-03-12 18:56:29.530 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:56:29.530 PST</date>
+ <endDate>2006-03-12 18:56:29.530 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:56:29.530 PST</date>
+ <endDate>2006-03-12 18:56:29.530 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:56:56.950 PST</date>
+ <endDate>2006-03-12 18:56:56.950 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.addQuery$item.label.New Repository Query</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:57:37.258 PST</date>
+ <endDate>2006-03-12 18:57:37.258 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.addQuery$item.label.New Repository Query</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:58:00.371 PST</date>
+ <endDate>2006-03-12 18:58:00.371 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:20.400 PST</date>
+ <endDate>2006-03-12 18:58:20.400 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:20.410 PST</date>
+ <endDate>2006-03-12 18:58:20.410 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:58:31.796 PST</date>
+ <endDate>2006-03-12 18:58:31.796 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:34.210 PST</date>
+ <endDate>2006-03-12 18:58:34.210 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:34.290 PST</date>
+ <endDate>2006-03-12 18:58:34.290 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:58:38.125 PST</date>
+ <endDate>2006-03-12 18:58:38.125 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:58:47.98 PST</date>
+ <endDate>2006-03-12 18:58:47.98 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:58:51.805 PST</date>
+ <endDate>2006-03-12 18:58:51.805 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:51.815 PST</date>
+ <endDate>2006-03-12 18:58:51.815 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:58:54.178 PST</date>
+ <endDate>2006-03-12 18:58:54.178 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:54.178 PST</date>
+ <endDate>2006-03-12 18:58:54.178 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:57.153 PST</date>
+ <endDate>2006-03-12 18:58:57.153 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:58:57.153 PST</date>
+ <endDate>2006-03-12 18:58:57.153 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:59:05.975 PST</date>
+ <endDate>2006-03-12 18:59:05.975 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:59:06.5 PST</date>
+ <endDate>2006-03-12 18:59:06.5 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:59:13.75 PST</date>
+ <endDate>2006-03-12 18:59:13.75 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:59:13.75 PST</date>
+ <endDate>2006-03-12 18:59:13.75 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 18:59:14.698 PST</date>
+ <endDate>2006-03-12 18:59:14.698 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 18:59:14.698 PST</date>
+ <endDate>2006-03-12 18:59:14.698 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 19:00:07.924 PST</date>
+ <endDate>2006-03-12 19:00:07.924 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:07.934 PST</date>
+ <endDate>2006-03-12 19:00:07.934 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:07.934 PST</date>
+ <endDate>2006-03-12 19:00:07.934 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 19:00:09.316 PST</date>
+ <endDate>2006-03-12 19:00:09.316 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-12 19:00:38.68 PST</date>
+ <endDate>2006-03-12 19:00:38.68 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:47.972 PST</date>
+ <endDate>2006-03-12 19:00:47.972 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:47.972 PST</date>
+ <endDate>2006-03-12 19:00:47.972 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:52.418 PST</date>
+ <endDate>2006-03-12 19:00:52.418 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:52.458 PST</date>
+ <endDate>2006-03-12 19:00:52.458 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:57.135 PST</date>
+ <endDate>2006-03-12 19:00:57.135 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:57.165 PST</date>
+ <endDate>2006-03-12 19:00:57.165 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:57.165 PST</date>
+ <endDate>2006-03-12 19:00:57.165 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 19:00:57.165 PST</date>
+ <endDate>2006-03-12 19:00:57.165 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 20:32:03.825 PST</date>
+ <endDate>2006-03-12 20:32:03.825 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 20:32:03.895 PST</date>
+ <endDate>2006-03-12 20:32:03.895 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 20:32:03.895 PST</date>
+ <endDate>2006-03-12 20:32:03.895 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-12 20:32:03.895 PST</date>
+ <endDate>2006-03-12 20:32:03.895 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:41:29.145 PST</date>
+ <endDate>2006-03-13 10:41:29.145 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:41:37.346 PST</date>
+ <endDate>2006-03-13 10:41:37.346 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:41:51.116 PST</date>
+ <endDate>2006-03-13 10:41:51.116 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:41:51.166 PST</date>
+ <endDate>2006-03-13 10:41:51.166 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:41:51.166 PST</date>
+ <endDate>2006-03-13 10:41:51.166 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:41:51.166 PST</date>
+ <endDate>2006-03-13 10:41:51.166 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:42:20.118 PST</date>
+ <endDate>2006-03-13 10:42:20.118 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:42:22.461 PST</date>
+ <endDate>2006-03-13 10:42:22.461 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:42:22.461 PST</date>
+ <endDate>2006-03-13 10:42:22.461 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:42:27.228 PST</date>
+ <endDate>2006-03-13 10:42:27.228 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:42:27.228 PST</date>
+ <endDate>2006-03-13 10:42:27.228 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:42:28.890 PST</date>
+ <endDate>2006-03-13 10:42:28.890 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:42:43.381 PST</date>
+ <endDate>2006-03-13 10:42:43.381 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:43:05.603 PST</date>
+ <endDate>2006-03-13 10:43:05.603 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:43:05.603 PST</date>
+ <endDate>2006-03-13 10:43:05.603 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:43:14.526 PST</date>
+ <endDate>2006-03-13 10:43:14.526 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:43:14.526 PST</date>
+ <endDate>2006-03-13 10:43:14.526 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:43:43.508 PST</date>
+ <endDate>2006-03-13 10:43:43.508 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:43:53.202 PST</date>
+ <endDate>2006-03-13 10:43:53.202 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.collapse.all$item.label.Collapse All</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:44:02.235 PST</date>
+ <endDate>2006-03-13 10:44:02.235 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.remove$item.label.Remove From Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:44:09.605 PST</date>
+ <endDate>2006-03-13 10:44:09.605 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:14.92 PST</date>
+ <endDate>2006-03-13 10:44:14.92 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:14.132 PST</date>
+ <endDate>2006-03-13 10:44:14.132 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:14.132 PST</date>
+ <endDate>2006-03-13 10:44:14.132 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:14.132 PST</date>
+ <endDate>2006-03-13 10:44:14.132 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:44:38.897 PST</date>
+ <endDate>2006-03-13 10:44:38.897 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:43.764 PST</date>
+ <endDate>2006-03-13 10:44:43.764 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104022</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:44.105 PST</date>
+ <endDate>2006-03-13 10:44:44.105 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:44.105 PST</date>
+ <endDate>2006-03-13 10:44:44.105 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:45.897 PST</date>
+ <endDate>2006-03-13 10:44:45.897 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:45.978 PST</date>
+ <endDate>2006-03-13 10:44:45.978 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:44:48.291 PST</date>
+ <endDate>2006-03-13 10:44:48.291 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.remove$item.label.Remove From Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:44:55.631 PST</date>
+ <endDate>2006-03-13 10:44:55.631 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:58.466 PST</date>
+ <endDate>2006-03-13 10:44:58.466 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:58.496 PST</date>
+ <endDate>2006-03-13 10:44:58.496 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:58.496 PST</date>
+ <endDate>2006-03-13 10:44:58.496 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:44:58.496 PST</date>
+ <endDate>2006-03-13 10:44:58.496 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:47:05.58 PST</date>
+ <endDate>2006-03-13 10:47:05.58 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:47:09.434 PST</date>
+ <endDate>2006-03-13 10:47:09.434 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:47:11.246 PST</date>
+ <endDate>2006-03-13 10:47:11.246 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:47:11.256 PST</date>
+ <endDate>2006-03-13 10:47:11.256 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:47:17.616 PST</date>
+ <endDate>2006-03-13 10:47:17.616 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:47:17.656 PST</date>
+ <endDate>2006-03-13 10:47:17.656 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:47:17.656 PST</date>
+ <endDate>2006-03-13 10:47:17.656 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:47:17.656 PST</date>
+ <endDate>2006-03-13 10:47:17.656 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:49:38.638 PST</date>
+ <endDate>2006-03-13 10:49:38.638 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:49:51.958 PST</date>
+ <endDate>2006-03-13 10:49:51.958 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:50:32.856 PST</date>
+ <endDate>2006-03-13 10:50:32.856 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:50:32.866 PST</date>
+ <endDate>2006-03-13 10:50:32.866 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:50:34.659 PST</date>
+ <endDate>2006-03-13 10:50:34.659 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:50:34.659 PST</date>
+ <endDate>2006-03-13 10:50:34.659 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:50:55.919 PST</date>
+ <endDate>2006-03-13 10:50:55.919 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:50:55.919 PST</date>
+ <endDate>2006-03-13 10:50:55.919 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:50:57.782 PST</date>
+ <endDate>2006-03-13 10:50:57.782 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:50:57.782 PST</date>
+ <endDate>2006-03-13 10:50:57.782 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:51:01.908 PST</date>
+ <endDate>2006-03-13 10:51:01.908 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:53:29.290 PST</date>
+ <endDate>2006-03-13 10:53:29.290 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:53:29.290 PST</date>
+ <endDate>2006-03-13 10:53:29.290 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:53:31.363 PST</date>
+ <endDate>2006-03-13 10:53:31.363 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:53:31.363 PST</date>
+ <endDate>2006-03-13 10:53:31.363 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:53:36.831 PST</date>
+ <endDate>2006-03-13 10:53:36.831 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:53:36.861 PST</date>
+ <endDate>2006-03-13 10:53:36.861 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:53:36.871 PST</date>
+ <endDate>2006-03-13 10:53:36.871 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:53:36.871 PST</date>
+ <endDate>2006-03-13 10:53:36.871 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:54:39.851 PST</date>
+ <endDate>2006-03-13 10:54:39.851 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:54:43.76 PST</date>
+ <endDate>2006-03-13 10:54:43.76 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:54:44.919 PST</date>
+ <endDate>2006-03-13 10:54:44.919 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:54:44.929 PST</date>
+ <endDate>2006-03-13 10:54:44.929 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:57:13.623 PST</date>
+ <endDate>2006-03-13 10:57:13.623 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:57:15.515 PST</date>
+ <endDate>2006-03-13 10:57:15.515 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:57:15.525 PST</date>
+ <endDate>2006-03-13 10:57:15.525 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:57:23.627 PST</date>
+ <endDate>2006-03-13 10:57:23.627 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:59:40.934 PST</date>
+ <endDate>2006-03-13 10:59:40.934 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:59:42.997 PST</date>
+ <endDate>2006-03-13 10:59:42.997 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:59:42.997 PST</date>
+ <endDate>2006-03-13 10:59:42.997 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:59:52.191 PST</date>
+ <endDate>2006-03-13 10:59:52.191 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:59:54.384 PST</date>
+ <endDate>2006-03-13 10:59:54.384 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:59:54.384 PST</date>
+ <endDate>2006-03-13 10:59:54.384 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 10:59:56.747 PST</date>
+ <endDate>2006-03-13 10:59:56.747 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 10:59:56.747 PST</date>
+ <endDate>2006-03-13 10:59:56.747 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:00.62 PST</date>
+ <endDate>2006-03-13 11:00:00.62 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:20.842 PST</date>
+ <endDate>2006-03-13 11:00:20.842 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:00:20.842 PST</date>
+ <endDate>2006-03-13 11:00:20.842 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:22.664 PST</date>
+ <endDate>2006-03-13 11:00:22.664 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:00:22.664 PST</date>
+ <endDate>2006-03-13 11:00:22.664 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:24.287 PST</date>
+ <endDate>2006-03-13 11:00:24.287 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:00:24.287 PST</date>
+ <endDate>2006-03-13 11:00:24.287 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:33.290 PST</date>
+ <endDate>2006-03-13 11:00:33.290 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:00:33.290 PST</date>
+ <endDate>2006-03-13 11:00:33.290 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:43.214 PST</date>
+ <endDate>2006-03-13 11:00:43.214 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:00:45.888 PST</date>
+ <endDate>2006-03-13 11:00:45.888 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:02:13.704 PST</date>
+ <endDate>2006-03-13 11:02:13.704 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:02:13.704 PST</date>
+ <endDate>2006-03-13 11:02:13.704 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:03:15.152 PST</date>
+ <endDate>2006-03-13 11:03:15.152 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:03:15.213 PST</date>
+ <endDate>2006-03-13 11:03:15.213 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:03:15.213 PST</date>
+ <endDate>2006-03-13 11:03:15.213 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:03:15.213 PST</date>
+ <endDate>2006-03-13 11:03:15.213 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:03:48.601 PST</date>
+ <endDate>2006-03-13 11:03:48.601 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:04:52.793 PST</date>
+ <endDate>2006-03-13 11:04:52.793 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:04:53.744 PST</date>
+ <endDate>2006-03-13 11:04:53.744 PST</endDate>
+ <originId>null$item.label.Very High</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:04:53.754 PST</date>
+ <endDate>2006-03-13 11:04:53.754 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P1</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:05:01.816 PST</date>
+ <endDate>2006-03-13 11:05:01.816 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:05:01.816 PST</date>
+ <endDate>2006-03-13 11:05:01.816 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:06:53.146 PST</date>
+ <endDate>2006-03-13 11:06:53.146 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:06:53.146 PST</date>
+ <endDate>2006-03-13 11:06:53.146 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:06:56.591 PST</date>
+ <endDate>2006-03-13 11:06:56.591 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:06:56.591 PST</date>
+ <endDate>2006-03-13 11:06:56.591 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:07.316 PST</date>
+ <endDate>2006-03-13 11:07:07.316 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:07:07.316 PST</date>
+ <endDate>2006-03-13 11:07:07.316 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:11.753 PST</date>
+ <endDate>2006-03-13 11:07:11.753 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:12.594 PST</date>
+ <endDate>2006-03-13 11:07:12.594 PST</endDate>
+ <originId>null$item.label.Very Low</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:07:12.594 PST</date>
+ <endDate>2006-03-13 11:07:12.594 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P5</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:17.371 PST</date>
+ <endDate>2006-03-13 11:07:17.371 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:07:17.371 PST</date>
+ <endDate>2006-03-13 11:07:17.371 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:26.414 PST</date>
+ <endDate>2006-03-13 11:07:26.414 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:38.651 PST</date>
+ <endDate>2006-03-13 11:07:38.651 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:39.352 PST</date>
+ <endDate>2006-03-13 11:07:39.352 PST</endDate>
+ <originId>null$item.label.Very High</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:07:39.352 PST</date>
+ <endDate>2006-03-13 11:07:39.352 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P1</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:07:59.762 PST</date>
+ <endDate>2006-03-13 11:07:59.762 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:07:59.782 PST</date>
+ <endDate>2006-03-13 11:07:59.782 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:07:59.902 PST</date>
+ <endDate>2006-03-13 11:07:59.902 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:08:42.83 PST</date>
+ <endDate>2006-03-13 11:08:42.83 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:08:42.83 PST</date>
+ <endDate>2006-03-13 11:08:42.83 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:09:59.133 PST</date>
+ <endDate>2006-03-13 11:09:59.133 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:09:59.183 PST</date>
+ <endDate>2006-03-13 11:09:59.183 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:09:59.183 PST</date>
+ <endDate>2006-03-13 11:09:59.183 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:09:59.183 PST</date>
+ <endDate>2006-03-13 11:09:59.183 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:21.673 PST</date>
+ <endDate>2006-03-13 11:16:21.673 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:25.990 PST</date>
+ <endDate>2006-03-13 11:16:25.990 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:25.990 PST</date>
+ <endDate>2006-03-13 11:16:25.990 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:37.416 PST</date>
+ <endDate>2006-03-13 11:16:37.416 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:37.416 PST</date>
+ <endDate>2006-03-13 11:16:37.416 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:42.503 PST</date>
+ <endDate>2006-03-13 11:16:42.503 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:46.539 PST</date>
+ <endDate>2006-03-13 11:16:46.539 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:46.609 PST</date>
+ <endDate>2006-03-13 11:16:46.609 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:48.893 PST</date>
+ <endDate>2006-03-13 11:16:48.893 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:48.893 PST</date>
+ <endDate>2006-03-13 11:16:48.893 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:50.655 PST</date>
+ <endDate>2006-03-13 11:16:50.655 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:50.655 PST</date>
+ <endDate>2006-03-13 11:16:50.655 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:58.216 PST</date>
+ <endDate>2006-03-13 11:16:58.216 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:58.226 PST</date>
+ <endDate>2006-03-13 11:16:58.226 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:59.137 PST</date>
+ <endDate>2006-03-13 11:16:59.137 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:16:59.858 PST</date>
+ <endDate>2006-03-13 11:16:59.858 PST</endDate>
+ <originId>null$item.label.Very Low</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:16:59.858 PST</date>
+ <endDate>2006-03-13 11:16:59.858 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P5</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:17:01.451 PST</date>
+ <endDate>2006-03-13 11:17:01.451 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:18:25.872 PST</date>
+ <endDate>2006-03-13 11:18:25.872 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:26.72 PST</date>
+ <endDate>2006-03-13 11:18:26.72 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:28.756 PST</date>
+ <endDate>2006-03-13 11:18:28.756 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:28.766 PST</date>
+ <endDate>2006-03-13 11:18:28.766 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:28.766 PST</date>
+ <endDate>2006-03-13 11:18:28.766 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:29.207 PST</date>
+ <endDate>2006-03-13 11:18:29.207 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:29.207 PST</date>
+ <endDate>2006-03-13 11:18:29.207 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:29.557 PST</date>
+ <endDate>2006-03-13 11:18:29.557 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:29.557 PST</date>
+ <endDate>2006-03-13 11:18:29.557 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:30.178 PST</date>
+ <endDate>2006-03-13 11:18:30.178 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:30.178 PST</date>
+ <endDate>2006-03-13 11:18:30.178 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:18:31.580 PST</date>
+ <endDate>2006-03-13 11:18:31.580 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/zRai1dz4fqCs8EYWbB7QgLfSLhc=:zRai1dz4fqCs8EYWbB7QgLfSLhc=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:31.750 PST</date>
+ <endDate>2006-03-13 11:18:31.750 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 11:18:33.273 PST</date>
+ <endDate>2006-03-13 11:18:33.273 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/0jtZh1BMGz3khL8uR8dvdau3lNM=/Csx=rbyONyqld0zn1ZNHTi5h8Vk=/HHwe682WKFlWYnodEABqZ1bZwrQ=/nzOnx5ivb9arsoBJ2cGz7fov0ko=/lKBCbo0yA9pUaMzwxiT5PLN2AeI=/NVnXrM8ANglxlhyhiYmtwGFAicA=/zRai1dz4fqCs8EYWbB7QgLfSLhc=:zRai1dz4fqCs8EYWbB7QgLfSLhc=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:18:33.593 PST</date>
+ <endDate>2006-03-13 11:18:33.593 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:18:36.577 PST</date>
+ <endDate>2006-03-13 11:18:36.577 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:36.577 PST</date>
+ <endDate>2006-03-13 11:18:36.577 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:18:38.801 PST</date>
+ <endDate>2006-03-13 11:18:38.801 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:38.801 PST</date>
+ <endDate>2006-03-13 11:18:38.801 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:18:40.223 PST</date>
+ <endDate>2006-03-13 11:18:40.223 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:40.253 PST</date>
+ <endDate>2006-03-13 11:18:40.253 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:40.253 PST</date>
+ <endDate>2006-03-13 11:18:40.253 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:40.253 PST</date>
+ <endDate>2006-03-13 11:18:40.253 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:40.253 PST</date>
+ <endDate>2006-03-13 11:18:40.253 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:40.293 PST</date>
+ <endDate>2006-03-13 11:18:40.293 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:18:40.483 PST</date>
+ <endDate>2006-03-13 11:18:40.483 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:19:03.176 PST</date>
+ <endDate>2006-03-13 11:19:03.176 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:19:03.176 PST</date>
+ <endDate>2006-03-13 11:19:03.176 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:19:05.179 PST</date>
+ <endDate>2006-03-13 11:19:05.179 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:19:05.179 PST</date>
+ <endDate>2006-03-13 11:19:05.179 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:19:47.740 PST</date>
+ <endDate>2006-03-13 11:19:47.740 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:19:47.740 PST</date>
+ <endDate>2006-03-13 11:19:47.740 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:19:49.542 PST</date>
+ <endDate>2006-03-13 11:19:49.542 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:19:49.542 PST</date>
+ <endDate>2006-03-13 11:19:49.542 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:20:04.754 PST</date>
+ <endDate>2006-03-13 11:20:04.754 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:20:04.754 PST</date>
+ <endDate>2006-03-13 11:20:04.754 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:21:28.4 PST</date>
+ <endDate>2006-03-13 11:21:28.4 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:21:28.4 PST</date>
+ <endDate>2006-03-13 11:21:28.4 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:21:32.380 PST</date>
+ <endDate>2006-03-13 11:21:32.380 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:21:32.380 PST</date>
+ <endDate>2006-03-13 11:21:32.380 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:21:38.359 PST</date>
+ <endDate>2006-03-13 11:21:38.359 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:21:38.359 PST</date>
+ <endDate>2006-03-13 11:21:38.359 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:21:38.359 PST</date>
+ <endDate>2006-03-13 11:21:38.359 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:21:39.941 PST</date>
+ <endDate>2006-03-13 11:21:39.941 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:21:48.163 PST</date>
+ <endDate>2006-03-13 11:21:48.163 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:21:50.857 PST</date>
+ <endDate>2006-03-13 11:21:50.857 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:21:50.857 PST</date>
+ <endDate>2006-03-13 11:21:50.857 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:21:50.857 PST</date>
+ <endDate>2006-03-13 11:21:50.857 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:22:06.59 PST</date>
+ <endDate>2006-03-13 11:22:06.59 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:22:08.212 PST</date>
+ <endDate>2006-03-13 11:22:08.212 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:22:15.242 PST</date>
+ <endDate>2006-03-13 11:22:15.242 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:22:27.610 PST</date>
+ <endDate>2006-03-13 11:22:27.610 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:23:11.503 PST</date>
+ <endDate>2006-03-13 11:23:11.503 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:23:11.523 PST</date>
+ <endDate>2006-03-13 11:23:11.523 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:23:11.523 PST</date>
+ <endDate>2006-03-13 11:23:11.523 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:23:11.533 PST</date>
+ <endDate>2006-03-13 11:23:11.533 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:23:59.802 PST</date>
+ <endDate>2006-03-13 11:23:59.802 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:24:08.865 PST</date>
+ <endDate>2006-03-13 11:24:08.865 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:25:06.778 PST</date>
+ <endDate>2006-03-13 11:25:06.778 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:25:09.583 PST</date>
+ <endDate>2006-03-13 11:25:09.583 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:25:09.583 PST</date>
+ <endDate>2006-03-13 11:25:09.583 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:25:21.530 PST</date>
+ <endDate>2006-03-13 11:25:21.530 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:25:21.530 PST</date>
+ <endDate>2006-03-13 11:25:21.530 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:25:25.916 PST</date>
+ <endDate>2006-03-13 11:25:25.916 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:25:44.172 PST</date>
+ <endDate>2006-03-13 11:25:44.172 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:26:26.643 PST</date>
+ <endDate>2006-03-13 11:26:26.643 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:28:37.832 PST</date>
+ <endDate>2006-03-13 11:28:37.832 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:28:37.862 PST</date>
+ <endDate>2006-03-13 11:28:37.862 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:28:37.862 PST</date>
+ <endDate>2006-03-13 11:28:37.862 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:28:37.862 PST</date>
+ <endDate>2006-03-13 11:28:37.862 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:29:43.727 PST</date>
+ <endDate>2006-03-13 11:29:43.727 PST</endDate>
+ <originId>null$item.label..Clear</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:29:45.730 PST</date>
+ <endDate>2006-03-13 11:29:45.730 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:29:45.740 PST</date>
+ <endDate>2006-03-13 11:29:45.740 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:30:37.804 PST</date>
+ <endDate>2006-03-13 11:30:37.804 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:37.804 PST</date>
+ <endDate>2006-03-13 11:30:37.804 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:30:45.15 PST</date>
+ <endDate>2006-03-13 11:30:45.15 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:45.15 PST</date>
+ <endDate>2006-03-13 11:30:45.15 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:30:46.817 PST</date>
+ <endDate>2006-03-13 11:30:46.817 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:46.817 PST</date>
+ <endDate>2006-03-13 11:30:46.817 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:59.85 PST</date>
+ <endDate>2006-03-13 11:30:59.85 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:59.135 PST</date>
+ <endDate>2006-03-13 11:30:59.135 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:59.135 PST</date>
+ <endDate>2006-03-13 11:30:59.135 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:30:59.135 PST</date>
+ <endDate>2006-03-13 11:30:59.135 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:54:58.84 PST</date>
+ <endDate>2006-03-13 11:54:58.84 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.rename$item.label.Rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:06.126 PST</date>
+ <endDate>2006-03-13 11:55:06.136 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.rename$item.label.Rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:55:13.997 PST</date>
+ <endDate>2006-03-13 11:55:13.997 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.catEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:55:13.997 PST</date>
+ <endDate>2006-03-13 11:55:13.997 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:18.193 PST</date>
+ <endDate>2006-03-13 11:55:18.193 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:55:19.866 PST</date>
+ <endDate>2006-03-13 11:55:19.866 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.catEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:55:19.956 PST</date>
+ <endDate>2006-03-13 11:55:19.956 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:27.456 PST</date>
+ <endDate>2006-03-13 11:55:27.456 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:36.590 PST</date>
+ <endDate>2006-03-13 11:55:36.590 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:41.987 PST</date>
+ <endDate>2006-03-13 11:55:41.987 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:42.538 PST</date>
+ <endDate>2006-03-13 11:55:42.538 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:43.530 PST</date>
+ <endDate>2006-03-13 11:55:43.530 PST</endDate>
+ <originId>null$item.label.Very Low</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:44.872 PST</date>
+ <endDate>2006-03-13 11:55:44.872 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:55:45.713 PST</date>
+ <endDate>2006-03-13 11:55:45.713 PST</endDate>
+ <originId>null$item.label.Low</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:55:45.723 PST</date>
+ <endDate>2006-03-13 11:55:45.723 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P4</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:21.170 PST</date>
+ <endDate>2006-03-13 11:57:21.170 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:26.137 PST</date>
+ <endDate>2006-03-13 11:57:26.137 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:27.99 PST</date>
+ <endDate>2006-03-13 11:57:27.99 PST</endDate>
+ <originId>null$item.label.Normal</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:57:27.99 PST</date>
+ <endDate>2006-03-13 11:57:27.99 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P3</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:27.980 PST</date>
+ <endDate>2006-03-13 11:57:27.980 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:28.921 PST</date>
+ <endDate>2006-03-13 11:57:28.921 PST</endDate>
+ <originId>null$item.label.Very Low</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:57:28.921 PST</date>
+ <endDate>2006-03-13 11:57:28.921 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.priority</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>P5</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:30.984 PST</date>
+ <endDate>2006-03-13 11:57:30.984 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:57:30.984 PST</date>
+ <endDate>2006-03-13 11:57:30.984 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:57:33.488 PST</date>
+ <endDate>2006-03-13 11:57:33.488 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.completed$item.label.Filter Completed Tasks</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 11:57:33.488 PST</date>
+ <endDate>2006-03-13 11:57:33.488 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.complete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:58:47.704 PST</date>
+ <endDate>2006-03-13 11:58:47.704 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:58:47.765 PST</date>
+ <endDate>2006-03-13 11:58:47.765 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:58:54.504 PST</date>
+ <endDate>2006-03-13 11:58:54.504 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 11:58:59.582 PST</date>
+ <endDate>2006-03-13 11:58:59.582 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 11:59:04.939 PST</date>
+ <endDate>2006-03-13 11:59:04.939 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 13:30:21.724 PST</date>
+ <endDate>2006-03-13 13:30:21.724 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 13:30:23.357 PST</date>
+ <endDate>2006-03-13 13:30:23.357 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 13:30:24.689 PST</date>
+ <endDate>2006-03-13 13:30:24.689 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 13:30:32.790 PST</date>
+ <endDate>2006-03-13 13:30:32.790 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:30:35.985 PST</date>
+ <endDate>2006-03-13 13:30:35.985 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:30:36.35 PST</date>
+ <endDate>2006-03-13 13:30:36.35 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:30:36.35 PST</date>
+ <endDate>2006-03-13 13:30:36.35 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:30:36.35 PST</date>
+ <endDate>2006-03-13 13:30:36.35 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 13:31:46.697 PST</date>
+ <endDate>2006-03-13 13:31:46.697 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 13:31:50.783 PST</date>
+ <endDate>2006-03-13 13:31:50.783 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 13:31:55.19 PST</date>
+ <endDate>2006-03-13 13:31:55.19 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 13:31:57.642 PST</date>
+ <endDate>2006-03-13 13:31:57.642 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:04.502 PST</date>
+ <endDate>2006-03-13 13:32:04.502 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:04.502 PST</date>
+ <endDate>2006-03-13 13:32:04.502 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 13:32:09.800 PST</date>
+ <endDate>2006-03-13 13:32:09.800 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:11.492 PST</date>
+ <endDate>2006-03-13 13:32:11.492 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:11.542 PST</date>
+ <endDate>2006-03-13 13:32:11.542 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:12.834 PST</date>
+ <endDate>2006-03-13 13:32:12.834 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:12.864 PST</date>
+ <endDate>2006-03-13 13:32:12.864 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:12.864 PST</date>
+ <endDate>2006-03-13 13:32:12.864 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 13:32:12.864 PST</date>
+ <endDate>2006-03-13 13:32:12.864 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:28.982 PST</date>
+ <endDate>2006-03-13 14:11:28.982 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:28.982 PST</date>
+ <endDate>2006-03-13 14:11:28.982 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:11:31.185 PST</date>
+ <endDate>2006-03-13 14:11:31.185 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:34.360 PST</date>
+ <endDate>2006-03-13 14:11:34.360 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:34.430 PST</date>
+ <endDate>2006-03-13 14:11:34.430 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:42.221 PST</date>
+ <endDate>2006-03-13 14:11:42.221 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104023</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:42.311 PST</date>
+ <endDate>2006-03-13 14:11:42.311 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:42.311 PST</date>
+ <endDate>2006-03-13 14:11:42.311 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:47.629 PST</date>
+ <endDate>2006-03-13 14:11:47.629 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:47.649 PST</date>
+ <endDate>2006-03-13 14:11:47.649 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:53.357 PST</date>
+ <endDate>2006-03-13 14:11:53.357 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:53.357 PST</date>
+ <endDate>2006-03-13 14:11:53.357 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:56.291 PST</date>
+ <endDate>2006-03-13 14:11:56.291 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:11:56.311 PST</date>
+ <endDate>2006-03-13 14:11:56.311 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:14:05.748 PST</date>
+ <endDate>2006-03-13 14:14:05.748 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:14:05.748 PST</date>
+ <endDate>2006-03-13 14:14:05.748 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:14:08.882 PST</date>
+ <endDate>2006-03-13 14:14:08.882 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:14:10.244 PST</date>
+ <endDate>2006-03-13 14:14:10.244 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:14:10.284 PST</date>
+ <endDate>2006-03-13 14:14:10.284 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:14:36.432 PST</date>
+ <endDate>2006-03-13 14:14:36.432 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:14:36.432 PST</date>
+ <endDate>2006-03-13 14:14:36.432 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:14:40.598 PST</date>
+ <endDate>2006-03-13 14:14:40.598 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:33:42.830 PST</date>
+ <endDate>2006-03-13 14:33:42.830 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:33:42.880 PST</date>
+ <endDate>2006-03-13 14:33:42.880 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:33:42.880 PST</date>
+ <endDate>2006-03-13 14:33:42.880 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:33:42.910 PST</date>
+ <endDate>2006-03-13 14:33:42.910 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:33:42.910 PST</date>
+ <endDate>2006-03-13 14:33:42.910 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:33:42.910 PST</date>
+ <endDate>2006-03-13 14:33:42.910 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:34:08.497 PST</date>
+ <endDate>2006-03-13 14:34:08.497 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.navigate.previous$item.label..Previous Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:34:11.361 PST</date>
+ <endDate>2006-03-13 14:34:11.361 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.navigate.previous$item.label..Previous Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:34:53.342 PST</date>
+ <endDate>2006-03-13 14:34:53.342 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.navigate.previous$item.label..Previous Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:34:57.808 PST</date>
+ <endDate>2006-03-13 14:34:57.808 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:34:57.818 PST</date>
+ <endDate>2006-03-13 14:34:57.818 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:35:00.782 PST</date>
+ <endDate>2006-03-13 14:35:00.782 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:35:00.782 PST</date>
+ <endDate>2006-03-13 14:35:00.782 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:35:07.832 PST</date>
+ <endDate>2006-03-13 14:35:07.832 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.navigate.previous$item.label..Previous Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:35:25.488 PST</date>
+ <endDate>2006-03-13 14:35:25.488 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.navigate.previous$item.label..Previous Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:35:33.189 PST</date>
+ <endDate>2006-03-13 14:35:33.189 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.navigate.previous$item.label..Previous Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:37:11.711 PST</date>
+ <endDate>2006-03-13 14:37:11.711 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:39:10.131 PST</date>
+ <endDate>2006-03-13 14:39:10.131 PST</endDate>
+ <originId>org.eclipse.debug.internal.ui.actions.DebugDropDownAction$item.label..Debug</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:39:15.318 PST</date>
+ <endDate>2006-03-13 14:39:15.318 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:39:15.368 PST</date>
+ <endDate>2006-03-13 14:39:15.368 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:39:15.368 PST</date>
+ <endDate>2006-03-13 14:39:15.368 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:39:15.368 PST</date>
+ <endDate>2006-03-13 14:39:15.368 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:39:39.403 PST</date>
+ <endDate>2006-03-13 14:39:39.403 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:39:59.171 PST</date>
+ <endDate>2006-03-13 14:39:59.171 PST</endDate>
+ <originId>null$item.label..Filter Priority Lower Than</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:40:11.149 PST</date>
+ <endDate>2006-03-13 14:40:11.149 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:40:11.189 PST</date>
+ <endDate>2006-03-13 14:40:11.189 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:40:11.189 PST</date>
+ <endDate>2006-03-13 14:40:11.189 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:40:11.189 PST</date>
+ <endDate>2006-03-13 14:40:11.189 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 14:59:35.743 PST</date>
+ <endDate>2006-03-13 14:59:35.743 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:59:35.813 PST</date>
+ <endDate>2006-03-13 14:59:35.813 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 14:59:36.114 PST</date>
+ <endDate>2006-03-13 14:59:36.114 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:59:40.450 PST</date>
+ <endDate>2006-03-13 14:59:40.450 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 14:59:41.261 PST</date>
+ <endDate>2006-03-13 14:59:41.261 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.JavaProject</structureKind>
+ <structureHandle>(non-source element)</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 14:59:43.815 PST</date>
+ <endDate>2006-03-13 14:59:43.815 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:3P1bDJLoKMIhAVuk+pQt1WZcfVI=</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:59:46.198 PST</date>
+ <endDate>2006-03-13 14:59:46.198 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestIncrementAction$item.label.Mylar: Mark as Landmark</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 14:59:47.780 PST</date>
+ <endDate>2006-03-13 14:59:47.780 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 14:59:47.790 PST</date>
+ <endDate>2006-03-13 14:59:47.790 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 14:59:49.683 PST</date>
+ <endDate>2006-03-13 14:59:49.683 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 14:59:51.125 PST</date>
+ <endDate>2006-03-13 14:59:51.125 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:01:54.142 PST</date>
+ <endDate>2006-03-13 15:01:54.142 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:01:54.152 PST</date>
+ <endDate>2006-03-13 15:01:54.152 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:3P1bDJLoKMIhAVuk+pQt1WZcfVI=</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:01:55.624 PST</date>
+ <endDate>2006-03-13 15:01:55.624 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestIncrementAction$item.label.Mylar: Mark as Landmark</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:01:58.288 PST</date>
+ <endDate>2006-03-13 15:01:58.288 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:01:58.298 PST</date>
+ <endDate>2006-03-13 15:01:58.298 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:01:58.308 PST</date>
+ <endDate>2006-03-13 15:01:58.308 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:01:58.398 PST</date>
+ <endDate>2006-03-13 15:01:58.398 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:02:01.292 PST</date>
+ <endDate>2006-03-13 15:02:01.292 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:02:01.302 PST</date>
+ <endDate>2006-03-13 15:02:01.302 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:3P1bDJLoKMIhAVuk+pQt1WZcfVI=</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:02:03.526 PST</date>
+ <endDate>2006-03-13 15:02:03.526 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestIncrementAction$item.label.Mylar: Mark as Landmark</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:02:04.707 PST</date>
+ <endDate>2006-03-13 15:02:04.707 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:02:04.747 PST</date>
+ <endDate>2006-03-13 15:02:04.747 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:02:04.777 PST</date>
+ <endDate>2006-03-13 15:02:04.777 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:02:04.777 PST</date>
+ <endDate>2006-03-13 15:02:04.777 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:02:04.777 PST</date>
+ <endDate>2006-03-13 15:02:04.777 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:02:28.772 PST</date>
+ <endDate>2006-03-13 15:02:28.772 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:njipS1EKh2F8=ZO7yoaeJqJ46Mk=</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:02:30.715 PST</date>
+ <endDate>2006-03-13 15:02:30.715 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestIncrementAction$item.label.Mylar: Mark as Landmark</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:02:59.626 PST</date>
+ <endDate>2006-03-13 15:02:59.626 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestIncrementAction$item.label.Mylar: Mark as Landmark</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:17.492 PST</date>
+ <endDate>2006-03-13 15:03:17.492 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:03:17.502 PST</date>
+ <endDate>2006-03-13 15:03:17.502 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:03:17.512 PST</date>
+ <endDate>2006-03-13 15:03:17.512 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:03:17.602 PST</date>
+ <endDate>2006-03-13 15:03:17.602 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:18.654 PST</date>
+ <endDate>2006-03-13 15:03:18.654 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:03:18.664 PST</date>
+ <endDate>2006-03-13 15:03:18.664 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:njipS1EKh2F8=ZO7yoaeJqJ46Mk=</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:03:20.306 PST</date>
+ <endDate>2006-03-13 15:03:20.306 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.InterestDecrementAction$item.label.Mylar: Mark Less Interesting</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:23.70 PST</date>
+ <endDate>2006-03-13 15:03:23.70 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:23.110 PST</date>
+ <endDate>2006-03-13 15:03:23.110 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:23.140 PST</date>
+ <endDate>2006-03-13 15:03:23.140 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:23.140 PST</date>
+ <endDate>2006-03-13 15:03:23.140 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:03:23.140 PST</date>
+ <endDate>2006-03-13 15:03:23.140 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:30:50.78 PST</date>
+ <endDate>2006-03-13 15:30:50.78 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:30:50.649 PST</date>
+ <endDate>2006-03-13 15:30:50.649 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:31:22.245 PST</date>
+ <endDate>2006-03-13 15:31:22.245 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:31:45.939 PST</date>
+ <endDate>2006-03-13 15:31:45.939 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:32:23.102 PST</date>
+ <endDate>2006-03-13 15:32:23.102 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:32:52.84 PST</date>
+ <endDate>2006-03-13 15:32:52.84 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:33:30.749 PST</date>
+ <endDate>2006-03-13 15:33:30.749 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:34:26.780 PST</date>
+ <endDate>2006-03-13 15:34:26.780 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:34:55.912 PST</date>
+ <endDate>2006-03-13 15:34:55.912 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:36:31.890 PST</date>
+ <endDate>2006-03-13 15:36:31.890 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:36:31.960 PST</date>
+ <endDate>2006-03-13 15:36:31.960 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:38:30.50 PST</date>
+ <endDate>2006-03-13 15:38:30.50 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:48:41.409 PST</date>
+ <endDate>2006-03-13 15:48:41.409 PST</endDate>
+ <originId>null$item.label.&File/&New	Alt+Shift+N/&Other...</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:48:50.842 PST</date>
+ <endDate>2006-03-13 15:48:50.842 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:48:50.943 PST</date>
+ <endDate>2006-03-13 15:48:50.943 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:51:56.930 PST</date>
+ <endDate>2006-03-13 15:51:56.930 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:56:42.20 PST</date>
+ <endDate>2006-03-13 15:56:42.20 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.tasklist.addNew$item.label..New Repository Task</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:56:57.252 PST</date>
+ <endDate>2006-03-13 15:56:57.252 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 15:56:57.272 PST</date>
+ <endDate>2006-03-13 15:56:57.272 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 15:56:58.83 PST</date>
+ <endDate>2006-03-13 15:56:58.83 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:56:59.665 PST</date>
+ <endDate>2006-03-13 15:56:59.665 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:56:59.715 PST</date>
+ <endDate>2006-03-13 15:56:59.715 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:56:59.715 PST</date>
+ <endDate>2006-03-13 15:56:59.715 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 15:56:59.715 PST</date>
+ <endDate>2006-03-13 15:56:59.715 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:10:46.995 PST</date>
+ <endDate>2006-03-13 16:10:46.995 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:10:47.405 PST</date>
+ <endDate>2006-03-13 16:10:47.405 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:11:17.989 PST</date>
+ <endDate>2006-03-13 16:11:17.989 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:11:17.989 PST</date>
+ <endDate>2006-03-13 16:11:17.989 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:11:31.469 PST</date>
+ <endDate>2006-03-13 16:11:31.469 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:11:31.469 PST</date>
+ <endDate>2006-03-13 16:11:31.469 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:11:35.745 PST</date>
+ <endDate>2006-03-13 16:11:35.745 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:11:37.467 PST</date>
+ <endDate>2006-03-13 16:11:37.467 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:11:37.538 PST</date>
+ <endDate>2006-03-13 16:11:37.538 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:11:42.425 PST</date>
+ <endDate>2006-03-13 16:11:42.425 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:11:42.425 PST</date>
+ <endDate>2006-03-13 16:11:42.425 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:14:56.554 PST</date>
+ <endDate>2006-03-13 16:14:56.554 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:14:56.584 PST</date>
+ <endDate>2006-03-13 16:14:56.584 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:14:56.584 PST</date>
+ <endDate>2006-03-13 16:14:56.584 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:14:56.584 PST</date>
+ <endDate>2006-03-13 16:14:56.584 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:16:32.582 PST</date>
+ <endDate>2006-03-13 16:16:32.582 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:16:32.592 PST</date>
+ <endDate>2006-03-13 16:16:32.592 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:16:50.488 PST</date>
+ <endDate>2006-03-13 16:16:50.488 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:16:50.488 PST</date>
+ <endDate>2006-03-13 16:16:50.488 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:17:01.564 PST</date>
+ <endDate>2006-03-13 16:17:01.564 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:17:01.664 PST</date>
+ <endDate>2006-03-13 16:17:01.664 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:17:58.946 PST</date>
+ <endDate>2006-03-13 16:17:58.946 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:17:58.946 PST</date>
+ <endDate>2006-03-13 16:17:58.946 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:28.198 PST</date>
+ <endDate>2006-03-13 16:18:28.198 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:28.238 PST</date>
+ <endDate>2006-03-13 16:18:28.238 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:32.725 PST</date>
+ <endDate>2006-03-13 16:18:32.725 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:32.755 PST</date>
+ <endDate>2006-03-13 16:18:32.755 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:37.441 PST</date>
+ <endDate>2006-03-13 16:18:37.441 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:37.441 PST</date>
+ <endDate>2006-03-13 16:18:37.441 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:18:52.213 PST</date>
+ <endDate>2006-03-13 16:18:52.213 PST</endDate>
+ <originId>org.eclipse.ui.file.close</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:52.213 PST</date>
+ <endDate>2006-03-13 16:18:52.213 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:52.263 PST</date>
+ <endDate>2006-03-13 16:18:52.263 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:57.620 PST</date>
+ <endDate>2006-03-13 16:18:57.620 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:18:57.620 PST</date>
+ <endDate>2006-03-13 16:18:57.620 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:19:53.831 PST</date>
+ <endDate>2006-03-13 16:19:53.831 PST</endDate>
+ <originId>org.eclipse.ui.edit.copy</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 16:19:56.205 PST</date>
+ <endDate>2006-03-13 16:19:56.205 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.copy$item.label.Copy Description	Ctrl+c</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:21:06.476 PST</date>
+ <endDate>2006-03-13 16:21:06.476 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:21:06.516 PST</date>
+ <endDate>2006-03-13 16:21:06.516 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:21:06.516 PST</date>
+ <endDate>2006-03-13 16:21:06.516 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:21:06.546 PST</date>
+ <endDate>2006-03-13 16:21:06.546 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:21:06.546 PST</date>
+ <endDate>2006-03-13 16:21:06.546 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 16:21:06.546 PST</date>
+ <endDate>2006-03-13 16:21:06.546 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:02.710 PST</date>
+ <endDate>2006-03-13 17:25:02.710 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:13.766 PST</date>
+ <endDate>2006-03-13 17:25:13.766 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:25:13.766 PST</date>
+ <endDate>2006-03-13 17:25:13.766 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:14.987 PST</date>
+ <endDate>2006-03-13 17:25:14.987 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:25:14.987 PST</date>
+ <endDate>2006-03-13 17:25:14.987 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:24.992 PST</date>
+ <endDate>2006-03-13 17:25:24.992 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:25:24.992 PST</date>
+ <endDate>2006-03-13 17:25:24.992 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:25.653 PST</date>
+ <endDate>2006-03-13 17:25:25.653 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:25:25.653 PST</date>
+ <endDate>2006-03-13 17:25:25.653 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:29.789 PST</date>
+ <endDate>2006-03-13 17:25:29.789 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:25:29.789 PST</date>
+ <endDate>2006-03-13 17:25:29.789 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:34.375 PST</date>
+ <endDate>2006-03-13 17:25:34.375 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:25:40.3 PST</date>
+ <endDate>2006-03-13 17:25:40.3 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:26:30.256 PST</date>
+ <endDate>2006-03-13 17:26:30.256 PST</endDate>
+ <originId>org.eclipse.ui.file.refresh</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:26:32.28 PST</date>
+ <endDate>2006-03-13 17:26:32.28 PST</endDate>
+ <originId>org.eclipse.ui.file.refresh</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:26:34.572 PST</date>
+ <endDate>2006-03-13 17:26:34.572 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:26:37.506 PST</date>
+ <endDate>2006-03-13 17:26:37.506 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:26:55.271 PST</date>
+ <endDate>2006-03-13 17:26:55.271 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:26:59.568 PST</date>
+ <endDate>2006-03-13 17:26:59.568 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:27:14.28 PST</date>
+ <endDate>2006-03-13 17:27:14.28 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:27:17.293 PST</date>
+ <endDate>2006-03-13 17:27:17.293 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:27:23.632 PST</date>
+ <endDate>2006-03-13 17:27:23.632 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:27:33.476 PST</date>
+ <endDate>2006-03-13 17:27:33.476 PST</endDate>
+ <originId>org.eclipse.ui.edit.rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:27:36.341 PST</date>
+ <endDate>2006-03-13 17:27:36.341 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:27:36.421 PST</date>
+ <endDate>2006-03-13 17:27:36.421 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:27:36.421 PST</date>
+ <endDate>2006-03-13 17:27:36.421 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:27:36.421 PST</date>
+ <endDate>2006-03-13 17:27:36.421 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 17:29:06.230 PST</date>
+ <endDate>2006-03-13 17:29:06.230 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.rename$item.label.Rename</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:34:31.848 PST</date>
+ <endDate>2006-03-13 17:34:31.848 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:34:31.878 PST</date>
+ <endDate>2006-03-13 17:34:31.878 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:34:31.878 PST</date>
+ <endDate>2006-03-13 17:34:31.878 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 17:34:31.878 PST</date>
+ <endDate>2006-03-13 17:34:31.878 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:06:47.692 PST</date>
+ <endDate>2006-03-13 18:06:47.692 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:06:47.752 PST</date>
+ <endDate>2006-03-13 18:06:47.752 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:06:47.752 PST</date>
+ <endDate>2006-03-13 18:06:47.752 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:06:47.752 PST</date>
+ <endDate>2006-03-13 18:06:47.752 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:09:06.381 PST</date>
+ <endDate>2006-03-13 18:09:06.381 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:09:06.411 PST</date>
+ <endDate>2006-03-13 18:09:06.411 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:09:06.411 PST</date>
+ <endDate>2006-03-13 18:09:06.411 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:09:06.411 PST</date>
+ <endDate>2006-03-13 18:09:06.411 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:02.362 PST</date>
+ <endDate>2006-03-13 18:10:02.362 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:02.412 PST</date>
+ <endDate>2006-03-13 18:10:02.412 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:02.412 PST</date>
+ <endDate>2006-03-13 18:10:02.412 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:02.412 PST</date>
+ <endDate>2006-03-13 18:10:02.412 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:10:31.564 PST</date>
+ <endDate>2006-03-13 18:10:31.564 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:31.594 PST</date>
+ <endDate>2006-03-13 18:10:31.594 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:10:33.516 PST</date>
+ <endDate>2006-03-13 18:10:33.516 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.actions.ApplyMylarToOutlineAction$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:33.516 PST</date>
+ <endDate>2006-03-13 18:10:33.516 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.mylyn.tasks.ui.views.TaskListView</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:43.781 PST</date>
+ <endDate>2006-03-13 18:10:43.781 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:43.831 PST</date>
+ <endDate>2006-03-13 18:10:43.831 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:43.831 PST</date>
+ <endDate>2006-03-13 18:10:43.831 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:10:43.831 PST</date>
+ <endDate>2006-03-13 18:10:43.831 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 18:11:00.936 PST</date>
+ <endDate>2006-03-13 18:11:00.936 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:11:00.996 PST</date>
+ <endDate>2006-03-13 18:11:00.996 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 18:11:01.276 PST</date>
+ <endDate>2006-03-13 18:11:01.276 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:09.788 PST</date>
+ <endDate>2006-03-13 18:11:09.788 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104024</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:10.109 PST</date>
+ <endDate>2006-03-13 18:11:10.109 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:10.109 PST</date>
+ <endDate>2006-03-13 18:11:10.109 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:14.906 PST</date>
+ <endDate>2006-03-13 18:11:14.906 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:14.966 PST</date>
+ <endDate>2006-03-13 18:11:14.966 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:11:14.976 PST</date>
+ <endDate>2006-03-13 18:11:14.976 PST</endDate>
+ <originId>org.eclipse.ui.edit.delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:20.965 PST</date>
+ <endDate>2006-03-13 18:11:20.965 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104025</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:21.55 PST</date>
+ <endDate>2006-03-13 18:11:21.55 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:21.55 PST</date>
+ <endDate>2006-03-13 18:11:21.55 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:23.498 PST</date>
+ <endDate>2006-03-13 18:11:23.498 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:23.518 PST</date>
+ <endDate>2006-03-13 18:11:23.518 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:11:23.518 PST</date>
+ <endDate>2006-03-13 18:11:23.518 PST</endDate>
+ <originId>org.eclipse.ui.edit.delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:25.101 PST</date>
+ <endDate>2006-03-13 18:11:25.101 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:25.131 PST</date>
+ <endDate>2006-03-13 18:11:25.131 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:25.131 PST</date>
+ <endDate>2006-03-13 18:11:25.131 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:11:25.131 PST</date>
+ <endDate>2006-03-13 18:11:25.131 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:15:44.814 PST</date>
+ <endDate>2006-03-13 18:15:44.814 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104026</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:15:45.104 PST</date>
+ <endDate>2006-03-13 18:15:45.104 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:15:45.104 PST</date>
+ <endDate>2006-03-13 18:15:45.104 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:03.150 PST</date>
+ <endDate>2006-03-13 18:16:03.150 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:03.250 PST</date>
+ <endDate>2006-03-13 18:16:03.250 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:16:07.36 PST</date>
+ <endDate>2006-03-13 18:16:07.36 PST</endDate>
+ <originId>org.eclipse.ui.edit.delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:16:34.35 PST</date>
+ <endDate>2006-03-13 18:16:34.35 PST</endDate>
+ <originId>org.eclipse.ui.edit.delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:37.690 PST</date>
+ <endDate>2006-03-13 18:16:37.690 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104027</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:37.800 PST</date>
+ <endDate>2006-03-13 18:16:37.800 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:37.800 PST</date>
+ <endDate>2006-03-13 18:16:37.800 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:40.604 PST</date>
+ <endDate>2006-03-13 18:16:40.604 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:40.624 PST</date>
+ <endDate>2006-03-13 18:16:40.624 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:16:40.624 PST</date>
+ <endDate>2006-03-13 18:16:40.624 PST</endDate>
+ <originId>org.eclipse.ui.edit.delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 18:16:43.919 PST</date>
+ <endDate>2006-03-13 18:16:43.919 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 18:16:43.929 PST</date>
+ <endDate>2006-03-13 18:16:43.929 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:16:43.999 PST</date>
+ <endDate>2006-03-13 18:16:43.999 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:53.22 PST</date>
+ <endDate>2006-03-13 18:16:53.22 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:53.52 PST</date>
+ <endDate>2006-03-13 18:16:53.52 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:53.52 PST</date>
+ <endDate>2006-03-13 18:16:53.52 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:16:53.52 PST</date>
+ <endDate>2006-03-13 18:16:53.52 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:32:42.888 PST</date>
+ <endDate>2006-03-13 18:32:42.888 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:32:42.948 PST</date>
+ <endDate>2006-03-13 18:32:42.948 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:32:42.948 PST</date>
+ <endDate>2006-03-13 18:32:42.948 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:32:42.948 PST</date>
+ <endDate>2006-03-13 18:32:42.948 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:34:56.730 PST</date>
+ <endDate>2006-03-13 18:34:56.730 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.repositories.add$item.label..Add Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 18:38:05.322 PST</date>
+ <endDate>2006-03-13 18:38:05.322 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:38:23.307 PST</date>
+ <endDate>2006-03-13 18:38:23.307 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:42:11.586 PST</date>
+ <endDate>2006-03-13 18:42:11.586 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.delete$item.label.Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:42:15.231 PST</date>
+ <endDate>2006-03-13 18:42:15.241 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.addQuery$item.label.New Repository Query</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:43:34.214 PST</date>
+ <endDate>2006-03-13 18:43:34.214 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:34.224 PST</date>
+ <endDate>2006-03-13 18:43:34.224 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:43:36.7 PST</date>
+ <endDate>2006-03-13 18:43:36.7 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:36.7 PST</date>
+ <endDate>2006-03-13 18:43:36.7 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:43:44.529 PST</date>
+ <endDate>2006-03-13 18:43:44.529 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:44.529 PST</date>
+ <endDate>2006-03-13 18:43:44.529 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:43:46.602 PST</date>
+ <endDate>2006-03-13 18:43:46.602 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.filter.archive$item.label.Filter Archive Category</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:46.602 PST</date>
+ <endDate>2006-03-13 18:43:46.602 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.filter.archive</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:49.747 PST</date>
+ <endDate>2006-03-13 18:43:49.747 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:49.747 PST</date>
+ <endDate>2006-03-13 18:43:49.747 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:43:53.132 PST</date>
+ <endDate>2006-03-13 18:43:53.132 PST</endDate>
+ <originId>org.eclipse.ui.file.save</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>keybinding</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:54.554 PST</date>
+ <endDate>2006-03-13 18:43:54.554 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:43:54.664 PST</date>
+ <endDate>2006-03-13 18:43:54.664 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 18:48:12.114 PST</date>
+ <endDate>2006-03-13 18:48:12.114 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:51:14.296 PST</date>
+ <endDate>2006-03-13 18:51:14.296 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:51:14.326 PST</date>
+ <endDate>2006-03-13 18:51:14.326 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:51:14.326 PST</date>
+ <endDate>2006-03-13 18:51:14.326 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:51:14.326 PST</date>
+ <endDate>2006-03-13 18:51:14.326 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:59:15.768 PST</date>
+ <endDate>2006-03-13 18:59:15.768 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:59:15.798 PST</date>
+ <endDate>2006-03-13 18:59:15.798 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:59:15.798 PST</date>
+ <endDate>2006-03-13 18:59:15.798 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 18:59:15.798 PST</date>
+ <endDate>2006-03-13 18:59:15.798 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:16:05.681 PST</date>
+ <endDate>2006-03-13 19:16:05.681 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:16:05.761 PST</date>
+ <endDate>2006-03-13 19:16:05.761 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:16:05.771 PST</date>
+ <endDate>2006-03-13 19:16:05.771 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:16:09.316 PST</date>
+ <endDate>2006-03-13 19:16:09.316 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:16:10.888 PST</date>
+ <endDate>2006-03-13 19:16:10.888 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:16:10.928 PST</date>
+ <endDate>2006-03-13 19:16:10.928 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:16:10.928 PST</date>
+ <endDate>2006-03-13 19:16:10.928 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:16:10.928 PST</date>
+ <endDate>2006-03-13 19:16:10.928 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:33:34.469 PST</date>
+ <endDate>2006-03-13 19:33:34.469 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:33:52.675 PST</date>
+ <endDate>2006-03-13 19:33:52.675 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:33:52.725 PST</date>
+ <endDate>2006-03-13 19:33:52.725 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:33:52.725 PST</date>
+ <endDate>2006-03-13 19:33:52.725 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:33:52.725 PST</date>
+ <endDate>2006-03-13 19:33:52.725 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:34:29.418 PST</date>
+ <endDate>2006-03-13 19:34:29.418 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:34:39.612 PST</date>
+ <endDate>2006-03-13 19:34:39.612 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:34:51.389 PST</date>
+ <endDate>2006-03-13 19:34:51.389 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:35:32.769 PST</date>
+ <endDate>2006-03-13 19:35:32.769 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:06.440 PST</date>
+ <endDate>2006-03-13 19:38:06.440 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:12.48 PST</date>
+ <endDate>2006-03-13 19:38:12.48 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:20.610 PST</date>
+ <endDate>2006-03-13 19:38:20.610 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.userid</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>104028</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:20.910 PST</date>
+ <endDate>2006-03-13 19:38:20.910 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:20.910 PST</date>
+ <endDate>2006-03-13 19:38:20.910 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:24.175 PST</date>
+ <endDate>2006-03-13 19:38:24.175 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.ui.taskEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:24.255 PST</date>
+ <endDate>2006-03-13 19:38:24.255 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:38:30.434 PST</date>
+ <endDate>2006-03-13 19:38:30.434 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:30.484 PST</date>
+ <endDate>2006-03-13 19:38:30.484 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:30.484 PST</date>
+ <endDate>2006-03-13 19:38:30.484 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:32.617 PST</date>
+ <endDate>2006-03-13 19:38:32.617 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:34.640 PST</date>
+ <endDate>2006-03-13 19:38:34.640 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.JavaProject</structureKind>
+ <structureHandle>(non-source element)</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:38:40.128 PST</date>
+ <endDate>2006-03-13 19:38:40.128 PST</endDate>
+ <originId>null$item.label.Ne&w/&File</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:43.703 PST</date>
+ <endDate>2006-03-13 19:38:43.703 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:43.813 PST</date>
+ <endDate>2006-03-13 19:38:43.813 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:43.853 PST</date>
+ <endDate>2006-03-13 19:38:43.853 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:43.853 PST</date>
+ <endDate>2006-03-13 19:38:43.853 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:45.916 PST</date>
+ <endDate>2006-03-13 19:38:45.916 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:45.966 PST</date>
+ <endDate>2006-03-13 19:38:45.966 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:38:49.331 PST</date>
+ <endDate>2006-03-13 19:38:49.331 PST</endDate>
+ <originId>null$item.label.&Delete	Delete</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:51.645 PST</date>
+ <endDate>2006-03-13 19:38:51.645 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:51.685 PST</date>
+ <endDate>2006-03-13 19:38:51.685 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:52.576 PST</date>
+ <endDate>2006-03-13 19:38:52.576 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:53.207 PST</date>
+ <endDate>2006-03-13 19:38:53.207 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:53.968 PST</date>
+ <endDate>2006-03-13 19:38:53.968 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:54.128 PST</date>
+ <endDate>2006-03-13 19:38:54.138 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:54.158 PST</date>
+ <endDate>2006-03-13 19:38:54.158 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:54.158 PST</date>
+ <endDate>2006-03-13 19:38:54.158 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:54.158 PST</date>
+ <endDate>2006-03-13 19:38:54.158 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:38:56.752 PST</date>
+ <endDate>2006-03-13 19:38:56.752 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:56.802 PST</date>
+ <endDate>2006-03-13 19:38:56.802 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:58.565 PST</date>
+ <endDate>2006-03-13 19:38:58.565 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:u1AbU5VY3lCqthZeC1B85+I27Fg=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:38:59.115 PST</date>
+ <endDate>2006-03-13 19:38:59.115 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:u1AbU5VY3lCqthZeC1B85+I27Fg=</structureHandle>
+ <navigation>null</navigation>
+ <delta>new</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:00.37 PST</date>
+ <endDate>2006-03-13 19:39:00.37 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:u1AbU5VY3lCqthZeC1B85+I27Fg=</structureHandle>
+ <navigation>null</navigation>
+ <delta>new</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:01.218 PST</date>
+ <endDate>2006-03-13 19:39:01.218 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:01.238 PST</date>
+ <endDate>2006-03-13 19:39:01.238 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:01.459 PST</date>
+ <endDate>2006-03-13 19:39:01.459 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:01.469 PST</date>
+ <endDate>2006-03-13 19:39:01.469 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:01.469 PST</date>
+ <endDate>2006-03-13 19:39:01.469 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:02.170 PST</date>
+ <endDate>2006-03-13 19:39:02.170 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:02.220 PST</date>
+ <endDate>2006-03-13 19:39:02.220 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:u1AbU5VY3lCqthZeC1B85+I27Fg=</structureHandle>
+ <navigation>null</navigation>
+ <delta>new</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:02.270 PST</date>
+ <endDate>2006-03-13 19:39:02.270 PST</endDate>
+ <originId>org.eclipse.mylyn.actions.filter.packageExplorer$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:04.703 PST</date>
+ <endDate>2006-03-13 19:39:04.703 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:04.824 PST</date>
+ <endDate>2006-03-13 19:39:04.824 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:04.914 PST</date>
+ <endDate>2006-03-13 19:39:04.914 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:04.914 PST</date>
+ <endDate>2006-03-13 19:39:04.914 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:04.944 PST</date>
+ <endDate>2006-03-13 19:39:04.944 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:05.84 PST</date>
+ <endDate>2006-03-13 19:39:05.84 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:06.176 PST</date>
+ <endDate>2006-03-13 19:39:06.176 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.296 PST</date>
+ <endDate>2006-03-13 19:39:06.296 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.366 PST</date>
+ <endDate>2006-03-13 19:39:06.366 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.366 PST</date>
+ <endDate>2006-03-13 19:39:06.366 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.666 PST</date>
+ <endDate>2006-03-13 19:39:06.666 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.666 PST</date>
+ <endDate>2006-03-13 19:39:06.666 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.666 PST</date>
+ <endDate>2006-03-13 19:39:06.666 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:06.736 PST</date>
+ <endDate>2006-03-13 19:39:06.736 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:06.746 PST</date>
+ <endDate>2006-03-13 19:39:06.746 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:09.40 PST</date>
+ <endDate>2006-03-13 19:39:09.40 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:09.80 PST</date>
+ <endDate>2006-03-13 19:39:09.80 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:09.80 PST</date>
+ <endDate>2006-03-13 19:39:09.80 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:09.110 PST</date>
+ <endDate>2006-03-13 19:39:09.110 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:09.150 PST</date>
+ <endDate>2006-03-13 19:39:09.150 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:10.191 PST</date>
+ <endDate>2006-03-13 19:39:10.191 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.312 PST</date>
+ <endDate>2006-03-13 19:39:10.312 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.362 PST</date>
+ <endDate>2006-03-13 19:39:10.362 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.362 PST</date>
+ <endDate>2006-03-13 19:39:10.362 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.552 PST</date>
+ <endDate>2006-03-13 19:39:10.552 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.562 PST</date>
+ <endDate>2006-03-13 19:39:10.562 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.562 PST</date>
+ <endDate>2006-03-13 19:39:10.562 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:39:10.612 PST</date>
+ <endDate>2006-03-13 19:39:10.612 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:10.622 PST</date>
+ <endDate>2006-03-13 19:39:10.622 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:14.628 PST</date>
+ <endDate>2006-03-13 19:39:14.628 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:14.648 PST</date>
+ <endDate>2006-03-13 19:39:14.648 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:u1AbU5VY3lCqthZeC1B85+I27Fg=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:14.728 PST</date>
+ <endDate>2006-03-13 19:39:14.728 PST</endDate>
+ <originId>org.eclipse.mylyn.actions.filter.packageExplorer$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:14.728 PST</date>
+ <endDate>2006-03-13 19:39:14.728 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:14.768 PST</date>
+ <endDate>2006-03-13 19:39:14.768 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.CompilationUnit</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:u1AbU5VY3lCqthZeC1B85+I27Fg=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:18.964 PST</date>
+ <endDate>2006-03-13 19:39:18.964 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.JavaProject</structureKind>
+ <structureHandle>(non-source element)</structureHandle>
+ <navigation>null</navigation>
+ <delta>predicted</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:30.551 PST</date>
+ <endDate>2006-03-13 19:39:30.551 PST</endDate>
+ <originId>export$item.label.&File/Exp&ort...</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:47.906 PST</date>
+ <endDate>2006-03-13 19:39:47.906 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:49.207 PST</date>
+ <endDate>2006-03-13 19:39:49.207 PST</endDate>
+ <originId>org.eclipse.mylyn.actions.filter.packageExplorer$item.label..Apply Mylar</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:49.207 PST</date>
+ <endDate>2006-03-13 19:39:49.207 PST</endDate>
+ <originId>org.eclipse.mylyn.ui.interest.filter.org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:51.711 PST</date>
+ <endDate>2006-03-13 19:39:51.711 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:51.871 PST</date>
+ <endDate>2006-03-13 19:39:51.871 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:51.921 PST</date>
+ <endDate>2006-03-13 19:39:51.921 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:51.921 PST</date>
+ <endDate>2006-03-13 19:39:51.921 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:51.951 PST</date>
+ <endDate>2006-03-13 19:39:51.951 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:52.1 PST</date>
+ <endDate>2006-03-13 19:39:52.1 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:39:52.833 PST</date>
+ <endDate>2006-03-13 19:39:52.833 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:53.3 PST</date>
+ <endDate>2006-03-13 19:39:53.3 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:53.63 PST</date>
+ <endDate>2006-03-13 19:39:53.63 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:53.63 PST</date>
+ <endDate>2006-03-13 19:39:53.63 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:53.223 PST</date>
+ <endDate>2006-03-13 19:39:53.223 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:53.233 PST</date>
+ <endDate>2006-03-13 19:39:53.233 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:53.233 PST</date>
+ <endDate>2006-03-13 19:39:53.233 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:54.505 PST</date>
+ <endDate>2006-03-13 19:39:54.505 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:54.555 PST</date>
+ <endDate>2006-03-13 19:39:54.555 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:54.585 PST</date>
+ <endDate>2006-03-13 19:39:54.585 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:54.585 PST</date>
+ <endDate>2006-03-13 19:39:54.585 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:54.585 PST</date>
+ <endDate>2006-03-13 19:39:54.585 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:57.269 PST</date>
+ <endDate>2006-03-13 19:39:57.269 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:57.319 PST</date>
+ <endDate>2006-03-13 19:39:57.319 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:39:59.302 PST</date>
+ <endDate>2006-03-13 19:39:59.302 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:39:59.392 PST</date>
+ <endDate>2006-03-13 19:39:59.392 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:40:00.704 PST</date>
+ <endDate>2006-03-13 19:40:00.704 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:00.764 PST</date>
+ <endDate>2006-03-13 19:40:00.764 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:00.764 PST</date>
+ <endDate>2006-03-13 19:40:00.764 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:00.774 PST</date>
+ <endDate>2006-03-13 19:40:00.774 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:00.804 PST</date>
+ <endDate>2006-03-13 19:40:00.804 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:00.874 PST</date>
+ <endDate>2006-03-13 19:40:00.874 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:40:01.695 PST</date>
+ <endDate>2006-03-13 19:40:01.695 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:01.836 PST</date>
+ <endDate>2006-03-13 19:40:01.836 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:01.886 PST</date>
+ <endDate>2006-03-13 19:40:01.886 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:01.886 PST</date>
+ <endDate>2006-03-13 19:40:01.886 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:02.46 PST</date>
+ <endDate>2006-03-13 19:40:02.46 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:02.46 PST</date>
+ <endDate>2006-03-13 19:40:02.46 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:02.46 PST</date>
+ <endDate>2006-03-13 19:40:02.46 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:02.56 PST</date>
+ <endDate>2006-03-13 19:40:02.56 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:40:02.76 PST</date>
+ <endDate>2006-03-13 19:40:02.76 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:40:02.76 PST</date>
+ <endDate>2006-03-13 19:40:02.76 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:41:47.518 PST</date>
+ <endDate>2006-03-13 19:41:47.518 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:47.568 PST</date>
+ <endDate>2006-03-13 19:41:47.568 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:47.568 PST</date>
+ <endDate>2006-03-13 19:41:47.568 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:47.658 PST</date>
+ <endDate>2006-03-13 19:41:47.658 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:41:48.739 PST</date>
+ <endDate>2006-03-13 19:41:48.739 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:48.859 PST</date>
+ <endDate>2006-03-13 19:41:48.859 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:48.930 PST</date>
+ <endDate>2006-03-13 19:41:48.930 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:48.930 PST</date>
+ <endDate>2006-03-13 19:41:48.930 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.110 PST</date>
+ <endDate>2006-03-13 19:41:49.110 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:49.170 PST</date>
+ <endDate>2006-03-13 19:41:49.170 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.170 PST</date>
+ <endDate>2006-03-13 19:41:49.170 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.170 PST</date>
+ <endDate>2006-03-13 19:41:49.170 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.340 PST</date>
+ <endDate>2006-03-13 19:41:49.340 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:41:49.370 PST</date>
+ <endDate>2006-03-13 19:41:49.370 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.370 PST</date>
+ <endDate>2006-03-13 19:41:49.370 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.370 PST</date>
+ <endDate>2006-03-13 19:41:49.370 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.380 PST</date>
+ <endDate>2006-03-13 19:41:49.380 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:49.400 PST</date>
+ <endDate>2006-03-13 19:41:49.400 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:49.400 PST</date>
+ <endDate>2006-03-13 19:41:49.400 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:41:51.93 PST</date>
+ <endDate>2006-03-13 19:41:51.93 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:51.153 PST</date>
+ <endDate>2006-03-13 19:41:51.153 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:51.153 PST</date>
+ <endDate>2006-03-13 19:41:51.153 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:51.153 PST</date>
+ <endDate>2006-03-13 19:41:51.153 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:51.233 PST</date>
+ <endDate>2006-03-13 19:41:51.233 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:41:52.254 PST</date>
+ <endDate>2006-03-13 19:41:52.254 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.415 PST</date>
+ <endDate>2006-03-13 19:41:52.415 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.475 PST</date>
+ <endDate>2006-03-13 19:41:52.475 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.475 PST</date>
+ <endDate>2006-03-13 19:41:52.475 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.675 PST</date>
+ <endDate>2006-03-13 19:41:52.675 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:52.715 PST</date>
+ <endDate>2006-03-13 19:41:52.715 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.715 PST</date>
+ <endDate>2006-03-13 19:41:52.715 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.715 PST</date>
+ <endDate>2006-03-13 19:41:52.715 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.895 PST</date>
+ <endDate>2006-03-13 19:41:52.895 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:41:52.985 PST</date>
+ <endDate>2006-03-13 19:41:52.985 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.985 PST</date>
+ <endDate>2006-03-13 19:41:52.985 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.985 PST</date>
+ <endDate>2006-03-13 19:41:52.985 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:52.995 PST</date>
+ <endDate>2006-03-13 19:41:52.995 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:53.15 PST</date>
+ <endDate>2006-03-13 19:41:53.15 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:53.15 PST</date>
+ <endDate>2006-03-13 19:41:53.15 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:55.699 PST</date>
+ <endDate>2006-03-13 19:41:55.699 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:55.709 PST</date>
+ <endDate>2006-03-13 19:41:55.709 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>kgasQrUy746YNHDCUfTho2X9Y2w=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:55.950 PST</date>
+ <endDate>2006-03-13 19:41:55.950 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.JavaProject</structureKind>
+ <structureHandle>(non-source element)</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:57.502 PST</date>
+ <endDate>2006-03-13 19:41:57.502 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>bGEKxMN6Bg6Hkug7j+UsoKhFN0Q=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:58.483 PST</date>
+ <endDate>2006-03-13 19:41:58.483 PST</endDate>
+ <originId>org.eclipse.jdt.ui.PackageExplorer</originId>
+ <structureKind>?: class org.eclipse.core.internal.resources.File</structureKind>
+ <structureHandle>bGEKxMN6Bg6Hkug7j+UsoKhFN0Q=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:59.755 PST</date>
+ <endDate>2006-03-13 19:41:59.755 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:41:59.765 PST</date>
+ <endDate>2006-03-13 19:41:59.765 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>?: class org.eclipse.pde.internal.core.text.plugin.PluginExtensionNode</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:59.765 PST</date>
+ <endDate>2006-03-13 19:41:59.765 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:41:59.765 PST</date>
+ <endDate>2006-03-13 19:41:59.765 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:01.728 PST</date>
+ <endDate>2006-03-13 19:42:01.728 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:01.778 PST</date>
+ <endDate>2006-03-13 19:42:01.778 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:42:04.222 PST</date>
+ <endDate>2006-03-13 19:42:04.222 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:04.292 PST</date>
+ <endDate>2006-03-13 19:42:04.292 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:04.292 PST</date>
+ <endDate>2006-03-13 19:42:04.292 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:04.292 PST</date>
+ <endDate>2006-03-13 19:42:04.292 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:04.292 PST</date>
+ <endDate>2006-03-13 19:42:04.292 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:04.322 PST</date>
+ <endDate>2006-03-13 19:42:04.322 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:04.452 PST</date>
+ <endDate>2006-03-13 19:42:04.452 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:42:05.654 PST</date>
+ <endDate>2006-03-13 19:42:05.654 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:05.824 PST</date>
+ <endDate>2006-03-13 19:42:05.824 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:05.904 PST</date>
+ <endDate>2006-03-13 19:42:05.904 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:05.904 PST</date>
+ <endDate>2006-03-13 19:42:05.904 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:06.174 PST</date>
+ <endDate>2006-03-13 19:42:06.174 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>?: class org.eclipse.pde.internal.core.text.plugin.PluginExtensionNode</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.184 PST</date>
+ <endDate>2006-03-13 19:42:06.184 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.184 PST</date>
+ <endDate>2006-03-13 19:42:06.184 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.365 PST</date>
+ <endDate>2006-03-13 19:42:06.365 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:06.385 PST</date>
+ <endDate>2006-03-13 19:42:06.385 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.395 PST</date>
+ <endDate>2006-03-13 19:42:06.395 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.395 PST</date>
+ <endDate>2006-03-13 19:42:06.395 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.595 PST</date>
+ <endDate>2006-03-13 19:42:06.595 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:42:06.645 PST</date>
+ <endDate>2006-03-13 19:42:06.645 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.645 PST</date>
+ <endDate>2006-03-13 19:42:06.645 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.645 PST</date>
+ <endDate>2006-03-13 19:42:06.645 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.655 PST</date>
+ <endDate>2006-03-13 19:42:06.655 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:06.715 PST</date>
+ <endDate>2006-03-13 19:42:06.715 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>?: class org.eclipse.pde.internal.core.text.plugin.PluginExtensionNode</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:06.715 PST</date>
+ <endDate>2006-03-13 19:42:06.715 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:42:10.971 PST</date>
+ <endDate>2006-03-13 19:42:10.971 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:11.21 PST</date>
+ <endDate>2006-03-13 19:42:11.21 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:11.21 PST</date>
+ <endDate>2006-03-13 19:42:11.21 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:11.21 PST</date>
+ <endDate>2006-03-13 19:42:11.21 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:11.21 PST</date>
+ <endDate>2006-03-13 19:42:11.21 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:11.111 PST</date>
+ <endDate>2006-03-13 19:42:11.111 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:42:12.233 PST</date>
+ <endDate>2006-03-13 19:42:12.233 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.423 PST</date>
+ <endDate>2006-03-13 19:42:12.423 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.473 PST</date>
+ <endDate>2006-03-13 19:42:12.473 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.473 PST</date>
+ <endDate>2006-03-13 19:42:12.473 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:12.714 PST</date>
+ <endDate>2006-03-13 19:42:12.714 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>?: class org.eclipse.pde.internal.core.text.plugin.PluginExtensionNode</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.714 PST</date>
+ <endDate>2006-03-13 19:42:12.714 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.714 PST</date>
+ <endDate>2006-03-13 19:42:12.714 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.844 PST</date>
+ <endDate>2006-03-13 19:42:12.844 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:12.854 PST</date>
+ <endDate>2006-03-13 19:42:12.854 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.854 PST</date>
+ <endDate>2006-03-13 19:42:12.854 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:12.884 PST</date>
+ <endDate>2006-03-13 19:42:12.884 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:13.24 PST</date>
+ <endDate>2006-03-13 19:42:13.24 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:42:13.44 PST</date>
+ <endDate>2006-03-13 19:42:13.44 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:13.64 PST</date>
+ <endDate>2006-03-13 19:42:13.64 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:13.64 PST</date>
+ <endDate>2006-03-13 19:42:13.64 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:13.74 PST</date>
+ <endDate>2006-03-13 19:42:13.74 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:13.104 PST</date>
+ <endDate>2006-03-13 19:42:13.104 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>?: class org.eclipse.pde.internal.core.text.plugin.PluginExtensionNode</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:13.104 PST</date>
+ <endDate>2006-03-13 19:42:13.104 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:14.637 PST</date>
+ <endDate>2006-03-13 19:42:14.637 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:42:14.687 PST</date>
+ <endDate>2006-03-13 19:42:14.687 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:15.788 PST</date>
+ <endDate>2006-03-13 19:42:15.788 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:njipS1EKh2F8=ZO7yoaeJqJ46Mk=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:42:16.649 PST</date>
+ <endDate>2006-03-13 19:42:16.649 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:njipS1EKh2F8=ZO7yoaeJqJ46Mk=</structureHandle>
+ <navigation>null</navigation>
+ <delta>new</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:42:17.991 PST</date>
+ <endDate>2006-03-13 19:42:17.991 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.deactivate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:18.92 PST</date>
+ <endDate>2006-03-13 19:42:18.92 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:18.92 PST</date>
+ <endDate>2006-03-13 19:42:18.92 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:18.92 PST</date>
+ <endDate>2006-03-13 19:42:18.92 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:18.92 PST</date>
+ <endDate>2006-03-13 19:42:18.92 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:18.122 PST</date>
+ <endDate>2006-03-13 19:42:18.122 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:18.202 PST</date>
+ <endDate>2006-03-13 19:42:18.202 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-13 19:42:19.93 PST</date>
+ <endDate>2006-03-13 19:42:19.93 PST</endDate>
+ <originId>org.eclipse.mylyn.tasklist.actions.context.activate</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta></delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.253 PST</date>
+ <endDate>2006-03-13 19:42:19.253 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>false</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.353 PST</date>
+ <endDate>2006-03-13 19:42:19.353 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.353 PST</date>
+ <endDate>2006-03-13 19:42:19.353 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:19.674 PST</date>
+ <endDate>2006-03-13 19:42:19.674 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>?: class org.eclipse.pde.internal.core.text.plugin.PluginExtensionNode</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.674 PST</date>
+ <endDate>2006-03-13 19:42:19.674 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.674 PST</date>
+ <endDate>2006-03-13 19:42:19.674 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.854 PST</date>
+ <endDate>2006-03-13 19:42:19.854 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:19.894 PST</date>
+ <endDate>2006-03-13 19:42:19.894 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.894 PST</date>
+ <endDate>2006-03-13 19:42:19.894 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:19.894 PST</date>
+ <endDate>2006-03-13 19:42:19.894 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:20.74 PST</date>
+ <endDate>2006-03-13 19:42:20.74 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:20.104 PST</date>
+ <endDate>2006-03-13 19:42:20.104 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>file</structureKind>
+ <structureHandle>9nvG2tdPCNTYthh=ySR2taKqSis=/1z1W9bf52gqYBhte9cvzHd08qaA=/RNYZ2FMQ9x4lk3abnwOVAJklFKI=/vcNIv3WAHFJ=Uc3t3I7fAn9+81o=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:20.104 PST</date>
+ <endDate>2006-03-13 19:42:20.104 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:20.104 PST</date>
+ <endDate>2006-03-13 19:42:20.104 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorOpen</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:20.134 PST</date>
+ <endDate>2006-03-13 19:42:20.134 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>edit</kind>
+ <date>2006-03-13 19:42:20.175 PST</date>
+ <endDate>2006-03-13 19:42:20.175 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.PackageDeclaration</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:qUqP5cyxm6YcTAhz05Hph5gvu9M=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:42:20.195 PST</date>
+ <endDate>2006-03-13 19:42:20.195 PST</endDate>
+ <originId>org.eclipse.jdt.ui.packages.linktoeditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>true</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-13 19:42:20.685 PST</date>
+ <endDate>2006-03-13 19:42:20.685 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>java:class org.eclipse.jdt.internal.core.SourceMethod</structureKind>
+ <structureHandle>8n=t4iILzTJq7j6G3f1OvQ=ljLk=/qUqP5cyxm6YcTAhz05Hph5gvu9M=/u1AbU5VY3lCqthZeC1B85+I27Fg=:njipS1EKh2F8=ZO7yoaeJqJ46Mk=</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.227 PST</date>
+ <endDate>2006-03-13 19:43:24.227 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.357 PST</date>
+ <endDate>2006-03-13 19:43:24.357 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.357 PST</date>
+ <endDate>2006-03-13 19:43:24.357 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.357 PST</date>
+ <endDate>2006-03-13 19:43:24.357 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.357 PST</date>
+ <endDate>2006-03-13 19:43:24.357 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.697 PST</date>
+ <endDate>2006-03-13 19:43:24.697 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.697 PST</date>
+ <endDate>2006-03-13 19:43:24.697 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.737 PST</date>
+ <endDate>2006-03-13 19:43:24.737 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.737 PST</date>
+ <endDate>2006-03-13 19:43:24.737 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-13 19:43:24.747 PST</date>
+ <endDate>2006-03-13 19:43:24.747 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-14 09:00:02.667 PST</date>
+ <endDate>2006-03-14 09:00:02.667 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-14 09:00:02.697 PST</date>
+ <endDate>2006-03-14 09:00:02.697 PST</endDate>
+ <originId>null$item.label..Delete Log</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>toolbar</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-14 09:00:02.797 PST</date>
+ <endDate>2006-03-14 09:00:02.797 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-14 09:00:50.65 PST</date>
+ <endDate>2006-03-14 09:00:50.65 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-14 09:01:10.344 PST</date>
+ <endDate>2006-03-14 09:01:10.344 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-14 09:01:41.319 PST</date>
+ <endDate>2006-03-14 09:01:41.319 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-14 09:02:16.880 PST</date>
+ <endDate>2006-03-14 09:02:16.880 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>command</kind>
+ <date>2006-03-14 09:02:53.723 PST</date>
+ <endDate>2006-03-14 09:02:53.723 PST</endDate>
+ <originId>org.eclipse.mylyn.bugzilla.ui.popup.refresh$item.label.Synchronize with Repository</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>menu</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-14 09:03:11.869 PST</date>
+ <endDate>2006-03-14 09:03:11.869 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-14 09:03:12.19 PST</date>
+ <endDate>2006-03-14 09:03:12.19 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-14 09:03:12.19 PST</date>
+ <endDate>2006-03-14 09:03:12.19 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>selection</kind>
+ <date>2006-03-14 09:03:14.12 PST</date>
+ <endDate>2006-03-14 09:03:14.12 PST</endDate>
+ <originId>org.eclipse.pde.runtime.LogView</originId>
+ <structureKind>?: class org.eclipse.pde.internal.runtime.logview.LogEntry</structureKind>
+ <structureHandle>?</structureHandle>
+ <navigation>null</navigation>
+ <delta>selected</delta>
+ <interestContribution>0.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:30.886 PST</date>
+ <endDate>2006-03-14 09:03:30.886 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: actionSetShow</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:30.936 PST</date>
+ <endDate>2006-03-14 09:03:30.936 PST</endDate>
+ <originId>org.eclipse.ui.DefaultTextEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:30.936 PST</date>
+ <endDate>2006-03-14 09:03:30.936 PST</endDate>
+ <originId>org.eclipse.pde.ui.manifestEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:30.936 PST</date>
+ <endDate>2006-03-14 09:03:30.936 PST</endDate>
+ <originId>org.eclipse.jdt.ui.CompilationUnitEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:30.936 PST</date>
+ <endDate>2006-03-14 09:03:30.936 PST</endDate>
+ <originId>org.eclipse.ant.ui.internal.editor.AntEditor</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:31.116 PST</date>
+ <endDate>2006-03-14 09:03:31.116 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective changed: editorClose</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:31.116 PST</date>
+ <endDate>2006-03-14 09:03:31.116 PST</endDate>
+ <originId>org.eclipse.jdt.ui.JavaPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:31.177 PST</date>
+ <endDate>2006-03-14 09:03:31.177 PST</endDate>
+ <originId>org.eclipse.team.ui.TeamSynchronizingPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:31.177 PST</date>
+ <endDate>2006-03-14 09:03:31.177 PST</endDate>
+ <originId>org.eclipse.team.cvs.ui.cvsPerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
+<interactionEvent>
+ <kind>preference</kind>
+ <date>2006-03-14 09:03:31.177 PST</date>
+ <endDate>2006-03-14 09:03:31.177 PST</endDate>
+ <originId>org.eclipse.ui.resourcePerspective</originId>
+ <structureKind>null</structureKind>
+ <structureHandle>null</structureHandle>
+ <navigation>null</navigation>
+ <delta>perspective closed</delta>
+ <interestContribution>1.0</interestContribution>
+</interactionEvent>
diff --git a/org.eclipse.mylyn.monitor.tests/testdata/usage-parsing.zip b/org.eclipse.mylyn.monitor.tests/testdata/usage-parsing.zip
new file mode 100644
index 0000000..a7da65f
Binary files /dev/null and b/org.eclipse.mylyn.monitor.tests/testdata/usage-parsing.zip differ
diff --git a/org.eclipse.mylyn.monitor.ui/.classpath b/org.eclipse.mylyn.monitor.ui/.classpath
new file mode 100644
index 0000000..594bdc7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.monitor.ui/.cvsignore b/org.eclipse.mylyn.monitor.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.monitor.ui/.project b/org.eclipse.mylyn.monitor.ui/.project
new file mode 100644
index 0000000..fc60588
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.monitor.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..3327b0b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.isObfuscatingStrings()' to 'isObfuscatingEnabled'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor.monitors{SelectionMonitor.java[SelectionMonitor~isObfuscatingStrings" name="isObfuscatingEnabled" references="true" stamp="1144122119515" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.isObfuscatingEnabled()' to 'isObfuscationEnabled'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor.monitors{SelectionMonitor.java[SelectionMonitor~isObfuscatingEnabled" name="isObfuscationEnabled" references="true" stamp="1144122124402" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_PREVIOUS_TRANSMIT_DATE to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants" element1="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^PREF_PREVIOUS_TRANSMIT_DATE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPreferenceConstants.java[MylarMonitorPreferenceConstants" stamp="1144122334073" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_NUM_USER_EVENTS to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants" element1="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^PREF_NUM_USER_EVENTS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPreferenceConstants.java[MylarMonitorPreferenceConstants" stamp="1144122341874" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_MONITORING_ENABLED to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants" element1="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^PREF_MONITORING_ENABLED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPreferenceConstants.java[MylarMonitorPreferenceConstants" stamp="1144122362054" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_MONITORING_OBFUSCATE to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants" element1="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^PREF_MONITORING_OBFUSCATE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor{MylarMonitorPreferenceConstants.java[MylarMonitorPreferenceConstants" stamp="1144122418425" version="1.0"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.ENCRYPTION_SHA' from expression '"SHA"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/monitor/monitors/SelectionMonitor.java" name="ENCRYPTION_SHA" qualify="false" replace="true" selection="7045 5" stamp="1144169088611" version="1.0" visibility="2"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.ENCRYPTION_SHA' to 'ENCRYPTION_ALGORITHM'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.monitor/src<org.eclipse.mylar.internal.monitor.monitors{SelectionMonitor.java[SelectionMonitor^ENCRYPTION_SHA" name="ENCRYPTION_ALGORITHM" references="true" setter="false" stamp="1144169154406" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..9da46c1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1,8 @@
+1144122119515 Rename method 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.isObfuscatingStrings()' to 'isObfuscatingEnabled'
+1144169154406 Rename field 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.ENCRYPTION_SHA' to 'ENCRYPTION_ALGORITHM'
+1144169088611 Extract constant 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.ENCRYPTION_SHA' from expression '"SHA"'
+1144122418425 Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_MONITORING_OBFUSCATE to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants
+1144122362054 Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_MONITORING_ENABLED to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants
+1144122341874 Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_NUM_USER_EVENTS to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants
+1144122334073 Move org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREF_PREVIOUS_TRANSMIT_DATE to org.eclipse.mylar.internal.monitor.MylarMonitorPreferenceConstants
+1144122124402 Rename method 'org.eclipse.mylar.internal.monitor.monitors.SelectionMonitor.isObfuscatingEnabled()' to 'isObfuscationEnabled'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/6/23/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/6/23/refactorings.history
new file mode 100644
index 0000000..a7e939a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/6/23/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'PREFERENCE_LISTENER' in 'org.eclipse.mylar.internal.monitor.MylarMonitorPlugin' to 'DATA_DIR_MOVE_LISTENER' - Original element: 'org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.PREFERENCE_LISTENER' - Renamed element: 'org.eclipse.mylar.internal.monitor.MylarMonitorPlugin.DATA_DIR_MOVE_LISTENER' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'PREFERENCE_LISTENER'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^PREFERENCE_LISTENER" name="DATA_DIR_MOVE_LISTENER" references="true" setter="false" stamp="1149460439167" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.ElementObfuscator' to 'ObfuscationUtil' - Original element: 'org.eclipse.mylar.internal.monitor.ElementObfuscator' - Renamed element: 'org.eclipse.mylar.internal.monitor.ObfuscationUtil' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'ElementObfuscator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor{ElementObfuscator.java[ElementObfuscator" matchStrategy="1" name="ObfuscationUtil" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149460844260" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.ObfuscationUtil' to 'HandleObfuscator' - Original element: 'org.eclipse.mylar.internal.monitor.ObfuscationUtil' - Renamed element: 'org.eclipse.mylar.internal.monitor.HandleObfuscator' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'ObfuscationUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor{ObfuscationUtil.java[ObfuscationUtil" matchStrategy="1" name="HandleObfuscator" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149463242438" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.monitor.HandleObfuscator.DELIM_PATH' from expression ''/'' - Constant name: 'DELIM_PATH' - Constant expression: ''/'' - Declared visibility: 'private'" description="Extract constant 'DELIM_PATH'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.monitor{HandleObfuscator.java" name="DELIM_PATH" qualify="false" replace="false" selection="3216 3" stamp="1149464237218" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/6/23/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/6/23/refactorings.index
new file mode 100644
index 0000000..95f894a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/6/23/refactorings.index
@@ -0,0 +1,4 @@
+1149460439167 Rename field 'PREFERENCE_LISTENER'
+1149464237218 Extract constant 'DELIM_PATH'
+1149463242438 Rename type 'ObfuscationUtil'
+1149460844260 Rename type 'ElementObfuscator'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..2582848
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.monitor.InteractionEventLogger.readEvent(...)' to 'readLegacyEvent' - Original element: 'org.eclipse.mylar.internal.monitor.InteractionEventLogger.readEvent(...)' - Renamed element: 'org.eclipse.mylar.internal.monitor.InteractionEventLogger.readLegacyEvent(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'readEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.monitor{InteractionEventLogger.java[InteractionEventLogger~readEvent~QString;" name="readLegacyEvent" references="true" stamp="1152055382281" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.monitor.InteractionEventLogger.interactionEventToXml(...)' to 'writeLegacyEvent' - Original element: 'org.eclipse.mylar.internal.monitor.InteractionEventLogger.interactionEventToXml(...)' - Renamed element: 'org.eclipse.mylar.internal.monitor.InteractionEventLogger.writeLegacyEvent(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'interactionEventToXml'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.monitor{InteractionEventLogger.java[InteractionEventLogger~interactionEventToXml~QInteractionEvent;" name="writeLegacyEvent" references="true" stamp="1152055410171" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..3ea855b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1,2 @@
+1152055382281 Rename method 'readEvent'
+1152055410171 Rename method 'interactionEventToXml'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..9ac92de
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.MylarMonitorPlugin' to 'MylarUsageMonitorPlugin' - Original element: 'org.eclipse.mylar.internal.monitor.MylarMonitorPlugin' - Renamed element: 'org.eclipse.mylar.internal.monitor.MylarUsageMonitorPlugin' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarMonitorPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin" matchStrategy="1" name="MylarUsageMonitorPlugin" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152753486828" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.monitors' to 'org.eclipse.mylar.monitor.workbench' - Original element: 'org.eclipse.mylar.monitor/src/org.eclipse.mylar.monitor.monitors' - Renamed element: 'org.eclipse.mylar.monitor/src/org.eclipse.mylar.monitor.workbench' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.monitors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.monitors" name="org.eclipse.mylar.monitor.workbench" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152810091421" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..7e39df1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,2 @@
+1152753486828 Rename type 'MylarMonitorPlugin'
+1152810091421 Rename package 'org.eclipse.mylar.monitor.monitors'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/10/41/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/10/41/refactorings.history
new file mode 100644
index 0000000..e0151ca
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/10/41/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.ui.IContextAwareWindow' to 'IMonitoredWindow'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.IContextAwareWindow'
- Renamed element: 'org.eclipse.mylyn.monitor.ui.IMonitoredWindow'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'IContextAwareWindow'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.ui{IContextAwareWindow.java[IContextAwareWindow" matchStrategy="1" name="IMonitoredWindow" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1191961224479" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.monitor.ui.IMonitoredWindow.canBeMonitored()' to 'isMonitored'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.IMonitoredWindow.canBeMonitored()'
- Renamed element: 'org.eclipse.mylyn.monitor.ui.IMonitoredWindow.isMonitored()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'canBeMonitored'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.monitor.ui{IMonitoredWindow.java[IMonitoredWindow~canBeMonitored" name="isMonitored" references="true" stamp="1191961372189" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.IMonitoredWindow.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui{IMonitoredWindow.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1191961461962" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/10/41/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/10/41/refactorings.index
new file mode 100644
index 0000000..ec3d4d5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/10/41/refactorings.index
@@ -0,0 +1,3 @@
+1191961224479 Rename type 'IContextAwareWindow'
+1191961372189 Rename method 'canBeMonitored'
+1191961461962 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..cefe46c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ActivityListener' to 'ActivityContextManager' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.ActivityListener' - Renamed element: 'org.eclipse.mylar.monitor.ActivityContextManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ActivityListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{ActivityListener.java[ActivityListener" matchStrategy="1" name="ActivityContextManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170463435978" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'study.exsd'" description="Delete element" element1="schema/study.exsd" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1170463951504" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.AbstractActivityTimer' to 'AbstractUserActivityTimer' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.AbstractActivityTimer' - Renamed element: 'org.eclipse.mylar.monitor.AbstractUserActivityTimer' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractActivityTimer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{AbstractActivityTimer.java[AbstractActivityTimer" matchStrategy="1" name="AbstractUserActivityTimer" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170464447415" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.AbstractUserActivityTimer' to 'AbstractUserActivityTimter' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.AbstractUserActivityTimer' - Renamed element: 'org.eclipse.mylar.monitor.AbstractUserActivityTimter' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractUserActivityTimer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{AbstractUserActivityTimer.java[AbstractUserActivityTimer" matchStrategy="1" name="AbstractUserActivityTimter" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170464466419" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.AbstractUserActivityTimter' to 'AbstractUserActivityTimer' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.AbstractUserActivityTimter' - Renamed element: 'org.eclipse.mylar.monitor.AbstractUserActivityTimer' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractUserActivityTimter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{AbstractUserActivityTimter.java[AbstractUserActivityTimter" matchStrategy="1" name="AbstractUserActivityTimer" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170464494882" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'monitors.exsd'" description="Delete element" element1="schema/monitors.exsd" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1170464532968" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'user.exsd'" description="Delete element" element1="schema/user.exsd" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1170464659498" subPackages="false" version="1.0"/>
+<refactoring comment="Rename field 'platformSpecificActivityTimer' in 'org.eclipse.mylar.monitor.MylarMonitorPlugin' to 'osActivityTimer' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.MylarMonitorPlugin.platformSpecificActivityTimer' - Renamed element: 'org.eclipse.mylar.monitor.MylarMonitorPlugin.osActivityTimer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'platformSpecificActivityTimer'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^platformSpecificActivityTimer" name="osActivityTimer" references="true" setter="false" stamp="1170465837187" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'timer' in 'org.eclipse.mylar.monitor.ActivityContextManager' to 'userActivityTimer' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.ActivityContextManager.timer' - Renamed element: 'org.eclipse.mylar.monitor.ActivityContextManager.userActivityTimer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'timer'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.monitor{ActivityContextManager.java[ActivityContextManager^timer" name="userActivityTimer" references="true" setter="false" stamp="1170466216644" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.WorkbenchActivityTimer' to 'WorkbenchUserActivityTimer' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.WorkbenchActivityTimer' - Renamed element: 'org.eclipse.mylar.monitor.WorkbenchUserActivityTimer' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'WorkbenchActivityTimer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{WorkbenchActivityTimer.java[WorkbenchActivityTimer" matchStrategy="1" name="WorkbenchUserActivityTimer" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170466285959" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'activityListener' in 'org.eclipse.mylar.monitor.MylarMonitorPlugin' to 'activityContextManager' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.MylarMonitorPlugin.activityListener' - Renamed element: 'org.eclipse.mylar.monitor.MylarMonitorPlugin.activityContextManager' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'activityListener'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.monitor{MylarMonitorPlugin.java[MylarMonitorPlugin^activityListener" name="activityContextManager" references="true" setter="false" stamp="1170467102797" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.monitor.ActivityContextManager.stopTimer()' to 'stop' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.ActivityContextManager.stopTimer()' - Renamed element: 'org.eclipse.mylar.monitor.ActivityContextManager.stop()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'stopTimer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.monitor{ActivityContextManager.java[ActivityContextManager~stopTimer" name="stop" references="true" stamp="1170467185464" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ActivityContextManager' to 'ActivityMetaContextManager' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.ActivityContextManager' - Renamed element: 'org.eclipse.mylar.monitor.ActivityMetaContextManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ActivityContextManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{ActivityContextManager.java[ActivityContextManager" matchStrategy="1" name="ActivityMetaContextManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170467659747" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ActivityMetaContextManager' to 'ActivityContextManager' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.ActivityMetaContextManager' - Renamed element: 'org.eclipse.mylar.monitor.ActivityContextManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ActivityMetaContextManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor{ActivityMetaContextManager.java[ActivityMetaContextManager" matchStrategy="1" name="ActivityContextManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170467858935" textual="true" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor' to 'org.eclipse.mylar.monitor.ui' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor/src/org.eclipse.mylar.monitor' - Renamed element: 'org.eclipse.mylar.monitor/src/org.eclipse.mylar.monitor.ui' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor" name="org.eclipse.mylar.monitor.ui" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170469409298" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ui.MylarMonitorPlugin' to 'MylarMonitorUiPlugin' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor.ui.MylarMonitorPlugin' - Renamed element: 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarMonitorPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.ui{MylarMonitorPlugin.java[MylarMonitorPlugin" matchStrategy="1" name="MylarMonitorUiPlugin" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170469491187" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor/src/org.eclipse.mylar.monitor'" description="Delete element" element1="/src<org.eclipse.mylar.monitor" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170474821869" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..7e48fcf
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1,17 @@
+1170463435978 Rename type 'ActivityListener'
+1170463951504 Delete element
+1170464447415 Rename type 'AbstractActivityTimer'
+1170464466419 Rename type 'AbstractUserActivityTimer'
+1170464494882 Rename type 'AbstractUserActivityTimter'
+1170464532968 Delete element
+1170464659498 Delete element
+1170465837187 Rename field 'platformSpecificActivityTimer'
+1170466216644 Rename field 'timer'
+1170466285959 Rename type 'WorkbenchActivityTimer'
+1170467102797 Rename field 'activityListener'
+1170467185464 Rename method 'stopTimer'
+1170467659747 Rename type 'ActivityContextManager'
+1170467858935 Rename type 'ActivityMetaContextManager'
+1170469409298 Rename package 'org.eclipse.mylar.monitor'
+1170469491187 Rename type 'MylarMonitorPlugin'
+1170474821869 Delete element
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..5b6e32d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor' - Original project: 'org.eclipse.mylar.monitor' - Original element: 'org.eclipse.mylar.monitor/src/org.eclipse.mylar.monitor.workbench'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.workbench" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170813611081" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylar.monitor.ui' - Original project: 'org.eclipse.mylar.monitor.ui' - Original elements: org.eclipse.mylar.monitor.ui/src/org.eclipse.mylar.monitor.ui org.eclipse.mylar.monitor.ui/src/org.eclipse.mylar.monitor.ui.workbench" description="Delete elements" element1="/src<org.eclipse.mylar.monitor.ui.workbench" element2="/src<org.eclipse.mylar.monitor.ui" element3="/src<org.eclipse.mylar.monitor" element4="/src<org.eclipse.mylar" element5="/src<org.eclipse" element6="/src<org" elements="6" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170861807600" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.ui' - Original project: 'org.eclipse.mylar.monitor.ui' - Original element: 'org.eclipse.mylar.monitor.ui.IUserAttentionListener.java'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.ui{IUserAttentionListener.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170879006067" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..cc5907f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,3 @@
+1170813611081 Delete element
+1170861807600 Delete elements
+1170879006067 Delete element
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..c8b9ade
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.monitor.ui.workbench.MenuCommandMonitor.obfuscateValueIfContainsPath(...)' to 'obfuscateItemText' - Original project: 'org.eclipse.mylar.monitor.ui' - Original element: 'org.eclipse.mylar.monitor.ui.workbench.MenuCommandMonitor.obfuscateValueIfContainsPath(...)' - Renamed element: 'org.eclipse.mylar.monitor.ui.workbench.MenuCommandMonitor.obfuscateItemText(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'obfuscateValueIfContainsPath'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.monitor.ui.workbench{MenuCommandMonitor.java[MenuCommandMonitor~obfuscateValueIfContainsPath~QString;" name="obfuscateItemText" references="true" stamp="1175115605642" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..83acf2e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1 @@
+1175115605642 Rename method 'obfuscateValueIfContainsPath'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/4/14/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/4/14/refactorings.history
new file mode 100644
index 0000000..2093e76
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/4/14/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ui.AbstractUserActivityTimer' to 'AbstractUserActivityMonitor' - Original project: 'org.eclipse.mylar.monitor.ui' - Original element: 'org.eclipse.mylar.monitor.ui.AbstractUserActivityTimer' - Renamed element: 'org.eclipse.mylar.monitor.ui.AbstractUserActivityMonitor' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractUserActivityTimer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.ui{AbstractUserActivityTimer.java[AbstractUserActivityTimer" matchStrategy="1" name="AbstractUserActivityMonitor" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1175634649890" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ui.WorkbenchUserActivityTimer' to 'WorkbenchUserActivityMonitor' - Original project: 'org.eclipse.mylar.monitor.ui' - Original element: 'org.eclipse.mylar.monitor.ui.WorkbenchUserActivityTimer' - Renamed element: 'org.eclipse.mylar.monitor.ui.WorkbenchUserActivityMonitor' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'WorkbenchUserActivityTimer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.ui{WorkbenchUserActivityTimer.java[WorkbenchUserActivityTimer" matchStrategy="1" name="WorkbenchUserActivityMonitor" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1175636666859" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/4/14/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/4/14/refactorings.index
new file mode 100644
index 0000000..f3ecedd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/4/14/refactorings.index
@@ -0,0 +1,2 @@
+1175634649890 Rename type 'AbstractUserActivityTimer'
+1175636666859 Rename type 'WorkbenchUserActivityTimer'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..eebd2e5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void addListenersToWindow(IWorkbenchWindow window)' from 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin.new IWindowListener() {...}.windowOpened()' to 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin.new IWindowListener() {...}' - Original project: 'org.eclipse.mylar.monitor.ui' - Method name: 'addListenersToWindow' - Destination type: 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin.new IWindowListener() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'addListenersToWindow'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.monitor.ui{MylarMonitorUiPlugin.java" name="addListenersToWindow" replace="false" selection="3256 465" stamp="1178821994430" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void removeListenersFromWindow(IWorkbenchWindow window)' from 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin.new IWindowListener() {...}.windowClosed()' to 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin.new IWindowListener() {...}' - Original project: 'org.eclipse.mylar.monitor.ui' - Method name: 'removeListenersFromWindow' - Destination type: 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin.new IWindowListener() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'removeListenersFromWindow'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.monitor.ui{MylarMonitorUiPlugin.java" name="removeListenersFromWindow" replace="false" selection="3895 474" stamp="1178822005576" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..5d114dc
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1,2 @@
+1178821994430 Extract method 'addListenersToWindow'
+1178822005576 Extract method 'removeListenersFromWindow'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..e6fbbad
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin' to 'MonitorUiPlugin' - Original project: 'org.eclipse.mylar.monitor.ui' - Original element: 'org.eclipse.mylar.monitor.ui.MylarMonitorUiPlugin' - Renamed element: 'org.eclipse.mylar.monitor.ui.MonitorUiPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarMonitorUiPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.ui{MylarMonitorUiPlugin.java[MylarMonitorUiPlugin" matchStrategy="1" name="MonitorUiPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1179859667995" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..612bf6a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1 @@
+1179859667995 Rename type 'MylarMonitorUiPlugin'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..fd45941
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui.WorkbenchUserActivityMonitor.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui{WorkbenchUserActivityMonitor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469047958" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui.ShellLifecycleListener.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui{ShellLifecycleListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469065679" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui.ActivityContextManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui{ActivityContextManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469098674" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui.workbench.AbstractEditorTracker.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui.workbench{AbstractEditorTracker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469154260" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui.workbench.AbstractPartTracker.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui.workbench{AbstractPartTracker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469179064" units="1" version="1.0"/>
+<refactoring comment="Move 8 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui' - Original elements: org.eclipse.mylyn.monitor.ui.workbench.ActivityChangeMonitor.java org.eclipse.mylyn.monitor.ui.workbench.WindowChangeMonitor.java org.eclipse.mylyn.monitor.ui.workbench.ActionExecutionMonitor.java org.eclipse.mylyn.monitor.ui.workbench.BrowserMonitor.java org.eclipse.mylyn.monitor.ui.workbench.PerspectiveChangeMonitor.java org.eclipse.mylyn.monitor.ui.workbench.KeybindingCommandMonitor.java org.eclipse.mylyn.monitor.ui.workbench.MenuCommandMonitor.java org.eclipse.mylyn.monitor.ui.workbench.PreferenceChangeMonitor.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui.workbench{ActivityChangeMonitor.java" element2="/src<org.eclipse.mylyn.monitor.ui.workbench{WindowChangeMonitor.java" element3="/src<org.eclipse.mylyn.monitor.ui.workbench{ActionExecutionMonitor.java" element4="/src<org.eclipse.mylyn.monitor.ui.workbench{BrowserMonitor.java" element5="/src<org.eclipse.mylyn.monitor.ui.workbench{PerspectiveChangeMonitor.java" element6="/src<org.eclipse.mylyn.monitor.ui.workbench{KeybindingCommandMonitor.java" element7="/src<org.eclipse.mylyn.monitor.ui.workbench{MenuCommandMonitor.java" element8="/src<org.eclipse.mylyn.monitor.ui.workbench{PreferenceChangeMonitor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469254395" units="8" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.ui' - Original project: 'org.eclipse.mylyn.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui.workbench'" description="Delete element" element1="/src<org.eclipse.mylyn.monitor.ui.workbench" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182469259110" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..8af913e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,7 @@
+1182469047958 Move compilation unit
+1182469065679 Move compilation unit
+1182469098674 Move compilation unit
+1182469154260 Move compilation unit
+1182469179064 Move compilation unit
+1182469254395 Move compilation units
+1182469259110 Delete element
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/8/34/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/8/34/refactorings.history
new file mode 100644
index 0000000..5f28022
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/8/34/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.MonitorUiExtensionPointReader.readActivityTimer(...)' to 'readActivityMonitor' - Original project: 'org.eclipse.mylyn.monitor.ui' - Original element: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.MonitorUiExtensionPointReader.readActivityTimer(...)' - Renamed element: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.MonitorUiExtensionPointReader.readActivityMonitor(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readActivityTimer'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin[MonitorUiExtensionPointReader~readActivityTimer~QIConfigurationElement;" name="readActivityMonitor" references="true" stamp="1187823732968" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2007/8/34/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/8/34/refactorings.index
new file mode 100644
index 0000000..dff3011
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2007/8/34/refactorings.index
@@ -0,0 +1 @@
+1187823732968 Rename method 'readActivityTimer'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/1/5/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/1/5/refactorings.history
new file mode 100644
index 0000000..67adb21
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/1/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'npe' in 'org.eclipse.mylyn.monitor.ui.AbstractCommandMonitor.AbstractCommandMonitor()' to 'e'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.AbstractCommandMonitor.AbstractCommandMonitor().npe'
- Renamed element: 'org.eclipse.mylyn.monitor.ui.AbstractCommandMonitor.AbstractCommandMonitor().e'
- Update references to refactored element" description="Rename local variable 'npe'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.monitor.ui{AbstractCommandMonitor.java[AbstractCommandMonitor~AbstractCommandMonitor at npe!1458!1481!1479!1481!QNullPointerException;" name="e" references="true" stamp="1201739435864" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/1/5/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/1/5/refactorings.index
new file mode 100644
index 0000000..dcaba38
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/1/5/refactorings.index
@@ -0,0 +1 @@
+1201739435864 Rename local variable 'npe'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/41/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/41/refactorings.history
new file mode 100644
index 0000000..e1a7be2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/41/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.CheckActivityJob' in 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager' to top level type
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.CheckActivityJob'
- Field name: 'activityContextManager'
- Declare field 'final'" description="Convert member type 'CheckActivityJob' to top level" field="false" fieldName="activityContextManager" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager[CheckActivityJob" mandatory="false" possible="false" stamp="1223430583994" version="1.0"/>
<refactoring comment="Extract method 'private void timedout()' from 'org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob.run()' to 'org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Method name: 'timedout'
- Destination type: 'org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'timedout'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{CheckActivityJob.java" name="timedout" replace="true" selection="1829 101" stamp="1223431176558" version="1.0" visibility="2"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob.run().localRunTime' in 'org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob.run()'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.CheckActivityJob.run().localRunTime'" description="Inline local variable 'localRunTime'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.monitor.ui{CheckActivityJob.java" selection="2246 32" stamp="1223434636416" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/41/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/41/refactorings.index
new file mode 100644
index 0000000..611e078
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/41/refactorings.index
@@ -0,0 +1,3 @@
+1223430583994 Convert member type 'CheckActivityJob' to top level
+1223431176558 Extract method 'timedout'
+1223434636416 Inline local variable 'localRunTime'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/42/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/42/refactorings.history
new file mode 100644
index 0000000..a640ef1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/42/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.fireInactive()' to 'handleInactive'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.fireInactive()'
- Renamed element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.handleInactive()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'fireInactive'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{IActivityManagerCallback.java[IActivityManagerCallback~fireInactive" name="handleInactive" references="true" stamp="1223777068732" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.handleActive()' to 'active'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.handleActive()'
- Renamed element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.active()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleActive'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{IActivityManagerCallback.java[IActivityManagerCallback~handleActive" name="active" references="true" stamp="1223777108082" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.handleInactive()' to 'inactive'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.handleInactive()'
- Renamed element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityManagerCallback.inactive()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleInactive'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{IActivityManagerCallback.java[IActivityManagerCallback~handleInactive" name="inactive" references="true" stamp="1223777118357" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/42/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/42/refactorings.index
new file mode 100644
index 0000000..b6225df
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/10/42/refactorings.index
@@ -0,0 +1,3 @@
+1223777068732 Rename method 'fireInactive'
+1223777108082 Rename method 'handleActive'
+1223777118357 Rename method 'handleInactive'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/11/45/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/11/45/refactorings.history
new file mode 100644
index 0000000..cda8204
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/11/45/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.monitor.ui'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'ActivityContextManager.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/monitor/ui/ActivityContextManager.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1225925539397" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/11/45/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/11/45/refactorings.index
new file mode 100644
index 0000000..ce27ee5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/11/45/refactorings.index
@@ -0,0 +1 @@
+1225925539397 Delete element
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/2/8/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/2/8/refactorings.history
new file mode 100644
index 0000000..89ac2b3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/2/8/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.DEFAULT_ACTIVITY_TIMEOUT' from expression '180000'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Constant name: 'DEFAULT_ACTIVITY_TIMEOUT'
- Constant expression: '180000'
- Declared visibility: 'private'" description="Extract constant 'DEFAULT_ACTIVITY_TIMEOUT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java" name="DEFAULT_ACTIVITY_TIMEOUT" qualify="false" replace="false" selection="5535 6" stamp="1203557233370" version="1.0" visibility="2"/>
<refactoring comment="Move 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.ACTIVITY_TIMEOUT_ENABLED' to 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.ACTIVITY_TIMEOUT_ENABLED'
- Destination type: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_TIMEOUT_ENABLED'" element1="/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin^ACTIVITY_TIMEOUT_ENABLED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager" stamp="1203557761584" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.ACTIVITY_TIMEOUT' to 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.ACTIVITY_TIMEOUT'
- Destination type: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_TIMEOUT'" element1="/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin^ACTIVITY_TIMEOUT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager" stamp="1203557772674" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/2/8/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/2/8/refactorings.index
new file mode 100644
index 0000000..a2e4b81
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/2/8/refactorings.index
@@ -0,0 +1,3 @@
+1203557233370 Extract constant 'DEFAULT_ACTIVITY_TIMEOUT'
+1203557761584 Move member 'ACTIVITY_TIMEOUT_ENABLED'
+1203557772674 Move member 'ACTIVITY_TIMEOUT'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/3/13/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/3/13/refactorings.history
new file mode 100644
index 0000000..a337c0c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void init()' from 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.start().new Runnable() {...}.run()' to 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Method name: 'init'
- Destination type: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin'
- Declared visibility: 'private'" comments="false" description="Extract method 'init'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java" name="init" replace="false" selection="5591 941" stamp="1206856240399" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/3/13/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/3/13/refactorings.index
new file mode 100644
index 0000000..eda4f9c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/3/13/refactorings.index
@@ -0,0 +1 @@
+1206856240399 Extract method 'init'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..73f35f1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.ui.IMylarMonitorLifecycleListener' to 'IMonitorLifecycleListener'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.IMylarMonitorLifecycleListener'
- Renamed element: 'org.eclipse.mylyn.monitor.ui.IMonitorLifecycleListener'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'IMylarMonitorLifecycleListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.ui{IMylarMonitorLifecycleListener.java[IMylarMonitorLifecycleListener" matchStrategy="1" name="IMonitorLifecycleListener" qualified="false" references="true" similarDeclarations="false" stamp="1207019906621" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..6c8fc4a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1 @@
+1207019906621 Rename type 'IMylarMonitorLifecycleListener'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..a33d703
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207944765667" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin.getSelectionMonitors()' to 'org.eclipse.mylyn.monitor.ui.MonitorUi'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin.getSelectionMonitors()'
- Destination type: 'org.eclipse.mylyn.monitor.ui.MonitorUi'" delegate="false" deprecate="true" description="Move member 'getSelectionMonitors'" element1="/src<org.eclipse.mylyn.internal.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin~getSelectionMonitors" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.monitor.ui{MonitorUi.java[MonitorUi" stamp="1207945036344" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin.addInteractionListener(...)' to 'org.eclipse.mylyn.monitor.ui.MonitorUi'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin.addInteractionListener(...)'
- Destination type: 'org.eclipse.mylyn.monitor.ui.MonitorUi'" delegate="false" deprecate="true" description="Move member 'addInteractionListener'" element1="/src<org.eclipse.mylyn.internal.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin~addInteractionListener~QIInteractionEventListener;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.monitor.ui{MonitorUi.java[MonitorUi" stamp="1207945046844" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin.removeInteractionListener(...)' to 'org.eclipse.mylyn.monitor.ui.MonitorUi'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin.removeInteractionListener(...)'
- Destination type: 'org.eclipse.mylyn.monitor.ui.MonitorUi'" delegate="false" deprecate="true" description="Move member 'removeInteractionListener'" element1="/src<org.eclipse.mylyn.internal.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin~removeInteractionListener~QIInteractionEventListener;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.monitor.ui{MonitorUi.java[MonitorUi" stamp="1207945055156" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..3f81369
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,4 @@
+1207944765667 Move compilation unit
+1207945036344 Move member 'getSelectionMonitors'
+1207945046844 Move member 'addInteractionListener'
+1207945055156 Move member 'removeInteractionListener'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..3cb707a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.fireActive(...)' to 'addActivityTime'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.fireActive(...)'
- Renamed element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.addActivityTime(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'fireActive'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager~fireActive~J~J" name="addActivityTime" references="true" stamp="1208380489634" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.monitor.ui.IActivityContextManager' from 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Extracted interface: 'org.eclipse.mylyn.internal.monitor.ui.IActivityContextManager'
- Extracted members:
 org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.addActivityTime(...)
 org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.removeActivityTime(...)
 org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.setInactivityTimeout(...)
- Use super type where possible" comments="true" description="Extract interface 'IActivityContextManager'" element1="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager~addActivityTime~J~J" element2="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager~removeActivityTime~QString;~J~J" element3="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager~setInactivityTimeout~I" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java[ActivityContextManager" instanceof="false" name="IActivityContextManager" public="true" replace="true" stamp="1208467905709" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityContextManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.ui" element1="/src<org.eclipse.mylyn.internal.monitor.ui{IActivityContextManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208468040819" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..7ba4cab
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,3 @@
+1208380489634 Rename method 'fireActive'
+1208467905709 Extract interface 'IActivityContextManager'
+1208468040819 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..7c4d18f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Inline method 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.getOriginId()' in 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.getOriginId()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'getOriginId'" flags="786438" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java" mode="1" selection="6554 0" stamp="1211435559234" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.getStructureKind()' in 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.getStructureKind()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'getStructureKind'" flags="786438" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java" mode="1" selection="6590 0" stamp="1211435569991" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..57f3a7c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,2 @@
+1211435559234 Inline method 'getOriginId'
+1211435569991 Inline method 'getStructureKind'
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..d709dbb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.internal.monitor.ui'
- Original element: 'org.eclipse.mylyn.monitor.ui.IActivityContextManager.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.ui" element1="/src<org.eclipse.mylyn.monitor.ui{IActivityContextManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212641448723" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Destination element: 'org.eclipse.mylyn.monitor.ui/src/org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.IActivityContextManager.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.monitor.ui" element1="/src<org.eclipse.mylyn.internal.monitor.ui{IActivityContextManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212641513041" units="1" version="1.0"/>
<refactoring comment="Convert local variable 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.updateWorkingSetSelection().new Runnable() {...}.run().workingSets' in 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.updateWorkingSetSelection().new Runnable() {...}.run()' to field
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Original element: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.updateWorkingSetSelection().new Runnable() {...}.run().workingSets'
- Field name: 'workingSets'
- Initialize field in method
- Declared visibility: 'private'" description="Convert local variable 'workingSets' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java" name="workingSets" selection="3724 11" stamp="1212785342204" static="false" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void processWorkbenchEvent(String handle,long start,long end)' from 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager.addMonitoredActivityTime()' to 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Original project: 'org.eclipse.mylyn.monitor.ui'
- Method name: 'processWorkbenchEvent'
- Destination type: 'org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager'
- Declared visibility: 'private'" comments="false" description="Extract method 'processWorkbenchEvent'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.monitor.ui{ActivityContextManager.java" name="processWorkbenchEvent" replace="false" selection="4742 404" stamp="1212789311485" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..1bbf0f4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,4 @@
+1212641448723 Move compilation unit
+1212641513041 Move compilation unit
+1212785342204 Convert local variable 'workingSets' to field
+1212789311485 Extract method 'processWorkbenchEvent'
diff --git a/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.monitor.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.monitor.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e2a3c98
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.monitor.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.browser,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: org.eclipse.mylyn.internal.monitor.ui;x-internal:=true,
+ org.eclipse.mylyn.monitor.ui
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.monitor.ui/about.html b/org.eclipse.mylyn.monitor.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/build-user.xml b/org.eclipse.mylyn.monitor.ui/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/build.properties b/org.eclipse.mylyn.monitor.ui/build.properties
new file mode 100644
index 0000000..46da6ce
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = META-INF/,\
+ about.html,\
+ .,\
+ plugin.xml,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.monitor.ui/plugin.properties b/org.eclipse.mylyn.monitor.ui/plugin.properties
new file mode 100644
index 0000000..5482a7c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.monitor.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Monitor UI
diff --git a/org.eclipse.mylyn.monitor.ui/plugin.xml b/org.eclipse.mylyn.monitor.ui/plugin.xml
new file mode 100644
index 0000000..16fec85
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/plugin.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="user" name="User Monitoring" schema="schema/user.exsd"/>
+</plugin>
diff --git a/org.eclipse.mylyn.monitor.ui/schema/user.exsd b/org.eclipse.mylyn.monitor.ui/schema/user.exsd
new file mode 100644
index 0000000..712f25b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/schema/user.exsd
@@ -0,0 +1,110 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.monitor.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.monitor.ui" id="user" name="User Monitoring"/>
+ </appInfo>
+ <documentation>
+ Provides user-specific monitor extensions, for example, for tracking periods of user activity/inactivity.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="osActivityTimer"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="osActivityTimer">
+ <annotation>
+ <documentation>
+ Only one extension is permitted per workbench instance. If more than one plug-in specifies this extension point, only one will be used.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.monitor.ui.AbstractUserActivityMonitor:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActionExecutionMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActionExecutionMonitor.java
new file mode 100644
index 0000000..ca2f59f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActionExecutionMonitor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.IActionExecutionListener;
+
+/**
+ * @author Mik Kersten
+ */
+public class ActionExecutionMonitor implements IActionExecutionListener {
+
+ public void actionObserved(IAction action) {
+ InteractionEvent interactionEvent = InteractionEvent.makeCommand(action.getId(), ""); //$NON-NLS-1$
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActivityChangeMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActivityChangeMonitor.java
new file mode 100644
index 0000000..c9f5242
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActivityChangeMonitor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.activities.ActivityManagerEvent;
+import org.eclipse.ui.activities.IActivityManagerListener;
+
+/**
+ * @author Mik Kersten
+ */
+public class ActivityChangeMonitor implements IActivityManagerListener {
+
+ private static final String ACTIVITIES_CHANGED = "activities changed"; //$NON-NLS-1$
+
+ public void activityManagerChanged(ActivityManagerEvent activityManagerEvent) {
+ if (activityManagerEvent.haveEnabledActivityIdsChanged()) {
+ String source = activityManagerEvent.getActivityManager().toString();
+ String delta = activityManagerEvent.getActivityManager().getEnabledActivityIds().toString();
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, ACTIVITIES_CHANGED + ": " //$NON-NLS-1$
+ + delta);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActivityContextManager.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActivityContextManager.java
new file mode 100644
index 0000000..065e2c1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ActivityContextManager.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.AbstractUserActivityMonitor;
+import org.eclipse.mylyn.monitor.ui.IActivityContextManager;
+import org.eclipse.mylyn.monitor.ui.IUserAttentionListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Manages the meta task-activity context.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @since 2.0
+ */
+ at SuppressWarnings("restriction")
+public class ActivityContextManager implements IActivityContextManager {
+
+ private AbstractUserActivityMonitor userActivityMonitor;
+
+ private final Set<IUserAttentionListener> attentionListeners = new CopyOnWriteArraySet<IUserAttentionListener>();
+
+ private final CheckActivityJob checkJob;
+
+ private IWorkingSet[] workingSets;
+
+ private final ArrayList<AbstractUserActivityMonitor> activityMonitors;
+
+ public static final String ACTIVITY_TIMEOUT = "org.eclipse.mylyn.monitor.ui.activity.timeout"; //$NON-NLS-1$
+
+ public static final String ACTIVITY_TIMEOUT_ENABLED = "org.eclipse.mylyn.monitor.ui.activity.timeout.enabled"; //$NON-NLS-1$
+
+ private final IPropertyChangeListener WORKING_SET_CHANGE_LISTENER = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(event.getProperty())) {
+ updateWorkingSetSelection();
+ }
+ }
+ };
+
+ public ActivityContextManager(ArrayList<AbstractUserActivityMonitor> monitors) {
+ this.activityMonitors = monitors;
+ checkJob = new CheckActivityJob(new IActivityManagerCallback() {
+ public void addMonitoredActivityTime(long localStartTime, long currentTime) {
+ ActivityContextManager.this.addMonitoredActivityTime(localStartTime, currentTime);
+ }
+
+ public void inactive() {
+ ActivityContextManager.this.fireInactive();
+ }
+
+ public long getLastEventTime() {
+ return ActivityContextManager.this.getLastEventTime();
+ }
+
+ public void active() {
+ ActivityContextManager.this.fireActive();
+ }
+ });
+ checkJob.setSystem(true);
+ checkJob.setPriority(Job.INTERACTIVE);
+ }
+
+ protected void updateWorkingSetSelection() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ workingSets = page.getWorkingSets();
+ }
+ }
+ });
+ }
+
+ public void start() {
+ for (AbstractUserActivityMonitor monitor : activityMonitors) {
+ monitor.start();
+ }
+ updateWorkingSetSelection();
+ PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(WORKING_SET_CHANGE_LISTENER);
+ checkJob.reschedule();
+ }
+
+ public void stop() {
+ for (AbstractUserActivityMonitor monitor : activityMonitors) {
+ monitor.stop();
+ }
+ PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(WORKING_SET_CHANGE_LISTENER);
+ checkJob.cancel();
+ }
+
+ public void addListener(IUserAttentionListener listener) {
+ attentionListeners.add(listener);
+ }
+
+ public void removeListener(IUserAttentionListener listener) {
+ attentionListeners.remove(listener);
+ }
+
+ private void addMonitoredActivityTime(long start, long end) {
+ if ((end > 0 && start > 0) && (end > start)) {
+
+ String origin = InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH;
+
+ if (userActivityMonitor != null && userActivityMonitor.getOriginId() != null) {
+ origin = userActivityMonitor.getOriginId();
+ }
+
+ String handle = getStructureHandle();
+ if (handle == null) {
+ if (workingSets != null && workingSets.length > 0) {
+ for (IWorkingSet workingSet : workingSets) {
+ String workingSetName = workingSet.getName();
+ processWorkbenchEvent(origin, InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET,
+ workingSetName, start, end);
+ }
+ } else {
+ processWorkbenchEvent(origin, InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET,
+ InteractionContextManager.ACTIVITY_HANDLE_NONE, start, end);
+ }
+ } else {
+ processWorkbenchEvent(origin, InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, handle, start,
+ end);
+ }
+ }
+ }
+
+ private void processWorkbenchEvent(String origin, String structureKind, String handle, long start, long end) {
+ ContextCorePlugin.getContextManager().processActivityMetaContextEvent(
+ new InteractionEvent(InteractionEvent.Kind.ATTENTION, structureKind, handle, origin, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, new Date(start), new Date(end)));
+ }
+
+ public void addActivityTime(String handle, long start, long end) {
+ if (handle != null) {
+ ContextCorePlugin.getContextManager().processActivityMetaContextEvent(
+ new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, handle,
+ InteractionContextManager.ACTIVITY_ORIGINID_USER, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, new Date(start), new Date(end)));
+ }
+ }
+
+ public void removeActivityTime(String handle, long start, long end) {
+ if (handle != null) {
+ ContextCorePlugin.getContextManager().processActivityMetaContextEvent(
+ new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, handle,
+ InteractionContextManager.ACTIVITY_ORIGINID_USER, null,
+ InteractionContextManager.ACTIVITY_DELTA_REMOVED, 1f, new Date(start), new Date(end)));
+ }
+ }
+
+ private void fireInactive() {
+ for (IUserAttentionListener attentionListener : attentionListeners) {
+ attentionListener.userAttentionLost();
+ }
+ }
+
+ private void fireActive() {
+ for (IUserAttentionListener attentionListener : attentionListeners) {
+ attentionListener.userAttentionGained();
+ }
+ }
+
+ private long getLastEventTime() {
+ for (AbstractUserActivityMonitor monitor : activityMonitors) {
+ if (monitor.isEnabled()) {
+ userActivityMonitor = monitor;
+ return userActivityMonitor.getLastInteractionTime();
+ }
+ }
+
+ return -1;
+ }
+
+ public void setInactivityTimeout(int inactivityTimeout) {
+ checkJob.setInactivityTimeout(inactivityTimeout);
+ }
+
+ public int getInactivityTimeout() {
+ return checkJob.getInactivityTimeout();
+ }
+
+ /**
+ * @return null when no task is active
+ */
+ public String getStructureHandle() {
+ if (ContextCore.getContextManager().getActiveContext().getHandleIdentifier() != null) {
+ return ContextCore.getContextManager().getActiveContext().getHandleIdentifier();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/BrowserMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/BrowserMonitor.java
new file mode 100644
index 0000000..1eed263
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/BrowserMonitor.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.browser.LocationListener;
+import org.eclipse.ui.IPageListener;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.internal.browser.BrowserViewer;
+import org.eclipse.ui.internal.browser.WebBrowserEditor;
+
+/**
+ * @author Mik Kersten
+ */
+// TODO e3.3 move to web.ui or tests
+public class BrowserMonitor extends AbstractUserInteractionMonitor implements IPartListener, IWindowListener,
+ IPageListener {
+
+ public static final String URL_LIST_DELIM = ","; //$NON-NLS-1$
+
+ private final UrlTrackingListener urlTrackingListener = new UrlTrackingListener();
+
+ private List<String> acceptedUrls = new ArrayList<String>();
+
+ class UrlTrackingListener implements LocationListener {
+
+ public void changing(LocationEvent event) {
+ // ignore
+ }
+
+ public void changed(LocationEvent locationEvent) {
+ String url = locationEvent.location;
+ boolean accept = false;
+ for (String urlMatch : acceptedUrls) {
+ if (url.indexOf(urlMatch) != -1) {
+ accept = true;
+ }
+ }
+ if (accept) {
+ InteractionEvent interactionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION, "url", url, //$NON-NLS-1$
+ WebBrowserEditor.WEB_BROWSER_EDITOR_ID, "null", "", 0); //$NON-NLS-1$ //$NON-NLS-2$
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent); // TODO:
+ // move
+ }
+ }
+ }
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ // ignore, this is a special case
+ }
+
+ // ---- Part Listener
+
+ public void partOpened(IWorkbenchPart part) {
+ if (part instanceof WebBrowserEditor) {
+ Browser browser = getBrowser((WebBrowserEditor) part);
+ if (browser != null) {
+ browser.addLocationListener(urlTrackingListener);
+ }
+ }
+ }
+
+ public void partClosed(IWorkbenchPart part) {
+ if (part instanceof WebBrowserEditor) {
+ Browser browser = getBrowser((WebBrowserEditor) part);
+ if (browser != null && !browser.isDisposed()) {
+ browser.removeLocationListener(urlTrackingListener);
+ }
+ }
+ }
+
+ public void partActivated(IWorkbenchPart part) {
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part) {
+ }
+
+ public void partDeactivated(IWorkbenchPart part) {
+ }
+
+ private Browser getBrowser(final WebBrowserEditor browserEditor) {
+ try { // HACK: using reflection to gain accessibility
+ Class<?> browserClass = browserEditor.getClass();
+ Field browserField = browserClass.getDeclaredField("webBrowser"); //$NON-NLS-1$
+ browserField.setAccessible(true);
+ Object browserObject = browserField.get(browserEditor);
+ if (browserObject != null && browserObject instanceof BrowserViewer) {
+ return ((BrowserViewer) browserObject).getBrowser();
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.WARNING, MonitorUiPlugin.ID_PLUGIN, "Could not add browser listener", //$NON-NLS-1$
+ e));
+ }
+ return null;
+ }
+
+ // --- Window listener
+
+ public void windowActivated(IWorkbenchWindow window) {
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ window.removePageListener(this);
+ }
+
+ public void windowOpened(IWorkbenchWindow window) {
+ window.addPageListener(this);
+ }
+
+ // ---- IPageListener
+
+ public void pageActivated(IWorkbenchPage page) {
+ }
+
+ public void pageClosed(IWorkbenchPage page) {
+ page.removePartListener(this);
+ }
+
+ public void pageOpened(IWorkbenchPage page) {
+ page.addPartListener(this);
+ }
+
+ public List<String> getAcceptedUrls() {
+ return acceptedUrls;
+ }
+
+ public void setAcceptedUrls(String urlBuffer) {
+ acceptedUrls = new ArrayList<String>();
+
+ if (urlBuffer != null) {
+ StringTokenizer token = new StringTokenizer(urlBuffer, URL_LIST_DELIM);
+ while (token.hasMoreTokens()) {
+ acceptedUrls.add(token.nextToken());
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/CheckActivityJob.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/CheckActivityJob.java
new file mode 100644
index 0000000..c28ec40
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/CheckActivityJob.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * A job that is scheduled periodically to check for user activity.
+ *
+ * @author Robert Elves
+ * @author Steffen Pingel
+ */
+public class CheckActivityJob extends Job {
+
+ /**
+ * If true, the user is assumed to be active.
+ */
+ private boolean active;
+
+ /**
+ * The rescheduling interval in ms when active. Should be reasonably short to provide accurate tracking.
+ */
+ private final int ACTIVE_TICK = 30 * 1000;
+
+ private final IActivityManagerCallback callback;
+
+ /**
+ * The timeout when to assume a user is inactive. If set to 0 it is assumed that a user is always active.
+ */
+ private int inactivityTimeout;
+
+ protected long previousEventTime;
+
+ /**
+ * Protected for testing.
+ */
+ protected long tick = ACTIVE_TICK;
+
+ public CheckActivityJob(IActivityManagerCallback callback) {
+ super(Messages.CheckActivityJob_Activity_Monitor_Job);
+ this.callback = callback;
+ }
+
+ public int getInactivityTimeout() {
+ return this.inactivityTimeout;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ protected boolean isEnabled() {
+ return Platform.isRunning() && !MonitorUiPlugin.getDefault().getWorkbench().isClosing();
+ }
+
+ /**
+ * Uses a short interval when inactive. This makes event notifications more accurate when switching from an inactive
+ * to an active state, e.g. to ensure lively updates of the UI.
+ */
+ public void reschedule() {
+ schedule(active ? tick : tick / 6);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (isEnabled()) {
+ try {
+ long lastEventTime = callback.getLastEventTime();
+ long currentTime = System.currentTimeMillis();
+ // check if the last activity exceeds timeout
+ if ((currentTime - lastEventTime) >= inactivityTimeout && inactivityTimeout != 0) {
+ if (active) {
+ // time out
+ active = false;
+ callback.inactive();
+ }
+ } else {
+ if (!active) {
+ active = true;
+ // back, start recording activity
+ if (inactivityTimeout != 0) {
+ previousEventTime = lastEventTime;
+ } else {
+ // if timeouts are disabled only the currentTime is relevant for tracking activity
+ previousEventTime = currentTime;
+ }
+ callback.active();
+ } else {
+ // check if the activity internal is unreasonably long, it is likely that
+ // the computer came back from sleep at worst difference should be tick * 2
+ if (currentTime - previousEventTime > tick * 3) {
+ if (inactivityTimeout != 0) {
+ // check for recent event
+ if (currentTime - lastEventTime <= tick) {
+ // event since resume
+ previousEventTime = lastEventTime;
+ } else {
+ // time out
+ active = false;
+ callback.inactive();
+ }
+ } else {
+ // if timeouts are disabled only the currentTime is relevant for tracking activity
+ previousEventTime = currentTime;
+ }
+ } else {
+ callback.addMonitoredActivityTime(previousEventTime, currentTime);
+ previousEventTime = currentTime;
+ }
+ }
+ }
+ } finally {
+ reschedule();
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ public void setInactivityTimeout(int inactivityTimeout) {
+ this.inactivityTimeout = inactivityTimeout;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/IActivityManagerCallback.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/IActivityManagerCallback.java
new file mode 100644
index 0000000..13b2482
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/IActivityManagerCallback.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+public interface IActivityManagerCallback {
+
+ public abstract void inactive();
+
+ public abstract void active();
+
+ public abstract void addMonitoredActivityTime(long localStartTime, long currentTime);
+
+ public abstract long getLastEventTime();
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/IMonitoredWindow.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/IMonitoredWindow.java
new file mode 100644
index 0000000..ad0354e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/IMonitoredWindow.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+/**
+ * TODO: consider changing to abstract class
+ *
+ * @author Shawn Minto
+ */
+public interface IMonitoredWindow {
+
+ public boolean isMonitored();
+
+ public boolean isPerspectiveManaged();
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/KeybindingCommandMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/KeybindingCommandMonitor.java
new file mode 100644
index 0000000..f8e4353
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/KeybindingCommandMonitor.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.AbstractCommandMonitor;
+
+/**
+ * @author Mik Kersten
+ */
+public class KeybindingCommandMonitor extends AbstractCommandMonitor {
+
+ public static final String COMMAND_INVOKED = "keybinding"; //$NON-NLS-1$
+
+ @Override
+ protected void handleCommandExecution(String commandId, ExecutionEvent event) {
+ InteractionEvent interactionEvent = InteractionEvent.makeCommand(commandId, COMMAND_INVOKED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/MenuCommandMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/MenuCommandMonitor.java
new file mode 100644
index 0000000..b8c777b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/MenuCommandMonitor.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Item;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolItem;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ *
+ */
+public class MenuCommandMonitor implements Listener {
+
+ public static final String MENU_ITEM_ID = "item.label."; //$NON-NLS-1$
+
+ public static final String MENU_ITEM_SELECTED = "menu"; //$NON-NLS-1$
+
+ public static final String TOOLBAR_ITEM_SELECTED = "toolbar"; //$NON-NLS-1$
+
+ public static final String MENU_PATH_DELIM = "/"; //$NON-NLS-1$
+
+ public void handleEvent(Event event) {
+ try {
+ if (!(event.widget instanceof Item)) {
+ return;
+ }
+ Item item = (Item) event.widget;
+ if (item.getData() == null) {
+ return;
+ }
+ Object target = event.widget.getData();
+ String id = null;
+ String delta = null;
+ if (target instanceof IContributionItem) {
+ id = ((IContributionItem) target).getId();
+ }
+ if (id == null && target instanceof ActionContributionItem) {
+ IAction action = ((ActionContributionItem) target).getAction();
+ if (action.getId() != null) {
+ id = action.getId();
+ } else {
+ id = action.getClass().getName();
+ }
+ } else if (id == null) {
+ id = target.getClass().getName();
+ }
+
+ if (item instanceof MenuItem) {
+ MenuItem menu = (MenuItem) item;
+ Menu parentMenu = menu.getParent();
+ String location = ""; //$NON-NLS-1$
+ if (parentMenu != null) {
+ while (parentMenu.getParentItem() != null) {
+ location = parentMenu.getParentItem().getText() + MENU_PATH_DELIM + location;
+ parentMenu = parentMenu.getParentMenu();
+ }
+ }
+ if (id == null) {
+ return;
+ // TODO: would be good to put back this info in some form
+ // but it can contain private data, bug 178604
+
+// if (id == null)
+// id = "null";
+// String itemText = obfuscateItemText(item.getText());
+// id = id + "$" + MENU_ITEM_ID + location + itemText;
+ }
+
+ delta = MENU_ITEM_SELECTED;
+ } else if (item instanceof ToolItem) {
+ // TODO: would be good to put back this info in some form
+ // but it can contain private data, bug 178604
+ // ToolItem tool = (ToolItem) item;
+ // if (id == null)
+ // id = "null";
+ // id = id + "$" + MENU_ITEM_ID + '.' + tool.getToolTipText();
+ delta = TOOLBAR_ITEM_SELECTED;
+ }
+ InteractionEvent interactionEvent = InteractionEvent.makeCommand(id, delta);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN, "Could not log selection", t)); //$NON-NLS-1$
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/Messages.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/Messages.java
new file mode 100644
index 0000000..5a8afbd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.monitor.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String CheckActivityJob_Activity_Monitor_Job;
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/MonitorUiPlugin.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/MonitorUiPlugin.java
new file mode 100644
index 0000000..d3edfc9
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/MonitorUiPlugin.java
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.AbstractUserActivityMonitor;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.mylyn.monitor.ui.IActivityContextManager;
+import org.eclipse.ui.IPageListener;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPerspectiveListener;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @since 3.0
+ */
+public class MonitorUiPlugin extends AbstractUIPlugin {
+
+ private static final int DEFAULT_ACTIVITY_TIMEOUT = 180000;
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.monitor.ui"; //$NON-NLS-1$
+
+ private static MonitorUiPlugin INSTANCE;
+
+ private ShellLifecycleListener shellLifecycleListener;
+
+ private final List<AbstractUserInteractionMonitor> selectionMonitors = new ArrayList<AbstractUserInteractionMonitor>();
+
+ /**
+ * TODO: this could be merged with context interaction events rather than requiring update from the monitor.
+ */
+ private final List<IInteractionEventListener> interactionListeners = new ArrayList<IInteractionEventListener>();
+
+ private ActivityContextManager activityContextManager;
+
+ private final ArrayList<AbstractUserActivityMonitor> monitors = new ArrayList<AbstractUserActivityMonitor>();
+
+ protected Set<IPartListener> partListeners = new HashSet<IPartListener>();
+
+ protected Set<IPageListener> pageListeners = new HashSet<IPageListener>();
+
+ protected Set<IPerspectiveListener> perspectiveListeners = new HashSet<IPerspectiveListener>();
+
+ protected Set<ISelectionListener> postSelectionListeners = new HashSet<ISelectionListener>();
+
+ private final Set<IWorkbenchWindow> monitoredWindows = new HashSet<IWorkbenchWindow>();
+
+ public static final String OBFUSCATED_LABEL = "[obfuscated]"; //$NON-NLS-1$
+
+ public static final String PREF_USER_ACTIVITY_ENABLED = "org.eclipse.mylyn.monitor.user.activity.enabled"; //$NON-NLS-1$
+
+ private IWorkbenchWindow launchingWorkbenchWindow = null;
+
+ private final org.eclipse.jface.util.IPropertyChangeListener PROPERTY_LISTENER = new org.eclipse.jface.util.IPropertyChangeListener() {
+
+ public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
+ if (event.getProperty().equals(ActivityContextManager.ACTIVITY_TIMEOUT)
+ || event.getProperty().equals(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED)) {
+ updateActivityTimout();
+ } else if (event.getProperty().equals(PREF_USER_ACTIVITY_ENABLED)) {
+ if (getPreferenceStore().getBoolean(PREF_USER_ACTIVITY_ENABLED)) {
+ activityContextManager.start();
+ } else {
+ activityContextManager.stop();
+ }
+
+ }
+ }
+
+ };
+
+ protected IWindowListener WINDOW_LISTENER = new IWindowListener() {
+ public void windowActivated(IWorkbenchWindow window) {
+ // ignore
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+ // ignore
+ }
+
+ public void windowOpened(IWorkbenchWindow window) {
+ if (getWorkbench().isClosing()) {
+ return;
+ }
+
+ if (window instanceof IMonitoredWindow) {
+ IMonitoredWindow awareWindow = (IMonitoredWindow) window;
+ if (!awareWindow.isMonitored()) {
+ return;
+ }
+ }
+
+ addListenersToWindow(window);
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ removeListenersFromWindow(window);
+ if (window == launchingWorkbenchWindow) {
+ launchingWorkbenchWindow = null;
+ }
+ }
+ };
+
+ public MonitorUiPlugin() {
+ INSTANCE = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+
+ getPreferenceStore().setDefault(ActivityContextManager.ACTIVITY_TIMEOUT, DEFAULT_ACTIVITY_TIMEOUT);
+ getPreferenceStore().setDefault(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED, true);
+
+ if (CoreUtil.TEST_MODE) {
+ init();
+ } else {
+ // FIXME: use UIJob
+ // delay initialization until workbench is realized
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ init();
+ }
+ });
+ }
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ try {
+ if (Platform.isRunning()) {
+ if (activityContextManager != null) {
+ activityContextManager.stop();
+ }
+ getPreferenceStore().removePropertyChangeListener(PROPERTY_LISTENER);
+ if (getWorkbench() != null && !getWorkbench().isClosing()) {
+ getWorkbench().removeWindowListener(WINDOW_LISTENER);
+
+ if (getWorkbench().getActiveWorkbenchWindow() != null
+ && getWorkbench().getActiveWorkbenchWindow().getShell() != null
+ && !getWorkbench().getActiveWorkbenchWindow().getShell().isDisposed()) {
+ getWorkbench().getActiveWorkbenchWindow()
+ .getShell()
+ .removeShellListener(shellLifecycleListener);
+ }
+
+ for (IWorkbenchWindow window : monitoredWindows) {
+ removeListenersFromWindow(window);
+ }
+ }
+
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN, "Monitor UI stop failed", e)); //$NON-NLS-1$
+ }
+ INSTANCE = null;
+ }
+
+ public ShellLifecycleListener getShellLifecycleListener() {
+ return shellLifecycleListener;
+ }
+
+ public void addWindowPartListener(IPartListener listener) {
+ partListeners.add(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ window.getPartService().addPartListener(listener);
+ }
+ }
+
+ public void removeWindowPartListener(IPartListener listener) {
+ partListeners.remove(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ window.getPartService().removePartListener(listener);
+ }
+ }
+
+ public void addWindowPageListener(IPageListener listener) {
+ pageListeners.add(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ window.addPageListener(listener);
+ }
+ }
+
+ public void removeWindowPageListener(IPageListener listener) {
+ pageListeners.remove(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ window.removePageListener(listener);
+ }
+ }
+
+ public void addWindowPerspectiveListener(IPerspectiveListener listener) {
+ perspectiveListeners.add(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ window.addPerspectiveListener(listener);
+ }
+ }
+
+ public void removeWindowPerspectiveListener(IPerspectiveListener listener) {
+ perspectiveListeners.remove(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ window.removePerspectiveListener(listener);
+ }
+ }
+
+ public void addWindowPostSelectionListener(ISelectionListener listener) {
+ postSelectionListeners.add(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ ISelectionService service = window.getSelectionService();
+ service.addPostSelectionListener(listener);
+ }
+ }
+
+ public void removeWindowPostSelectionListener(ISelectionListener listener) {
+ getDefault().postSelectionListeners.remove(listener);
+ for (IWorkbenchWindow window : monitoredWindows) {
+ ISelectionService service = window.getSelectionService();
+ service.removePostSelectionListener(listener);
+ }
+ }
+
+ public static MonitorUiPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ public List<AbstractUserInteractionMonitor> getSelectionMonitors() {
+ return selectionMonitors;
+ }
+
+ public void addInteractionListener(IInteractionEventListener listener) {
+ interactionListeners.add(listener);
+ }
+
+ public void removeInteractionListener(IInteractionEventListener listener) {
+ interactionListeners.remove(listener);
+ }
+
+ /**
+ * TODO: refactor this, it's awkward
+ */
+ public void notifyInteractionObserved(InteractionEvent interactionEvent) {
+ for (IInteractionEventListener listener : interactionListeners) {
+ listener.interactionObserved(interactionEvent);
+ }
+ }
+
+ public List<IInteractionEventListener> getInteractionListeners() {
+ return interactionListeners;
+ }
+
+ class MonitorUiExtensionPointReader {
+
+ public static final String EXTENSION_ID_USER = "org.eclipse.mylyn.monitor.ui.user"; //$NON-NLS-1$
+
+ public static final String ELEMENT_ACTIVITY_TIMER = "osActivityTimer"; //$NON-NLS-1$
+
+ public static final String ELEMENT_CLASS = "class"; //$NON-NLS-1$
+
+ private boolean extensionsRead = false;
+
+ public void initExtensions() {
+ try {
+ if (!extensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_USER);
+ if (extensionPoint != null) {
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().compareTo(ELEMENT_ACTIVITY_TIMER) == 0) {
+ readActivityMonitor(element);
+ }
+ }
+ }
+ extensionsRead = true;
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN,
+ "Could not read monitor extension", t)); //$NON-NLS-1$
+ }
+ }
+
+ private void readActivityMonitor(IConfigurationElement element) throws CoreException {
+ try {
+ if (element.getAttribute(ELEMENT_CLASS) != null) {
+ Object activityTimer = element.createExecutableExtension(ELEMENT_CLASS);
+ if (activityTimer instanceof AbstractUserActivityMonitor) {
+ monitors.add(0, (AbstractUserActivityMonitor) activityTimer);
+ }
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN, "Could not load activity timer", //$NON-NLS-1$
+ e));
+ }
+ }
+ }
+
+ public IActivityContextManager getActivityContextManager() {
+ return activityContextManager;
+ }
+
+ public boolean suppressConfigurationWizards() {
+ List<String> commandLineArgs = Arrays.asList(Platform.getCommandLineArgs());
+ if (commandLineArgs.contains("-showMylynWizards")) { //$NON-NLS-1$
+ return false;
+ } else {
+ return commandLineArgs.contains("-pdelaunch"); //$NON-NLS-1$
+ }
+ }
+
+ private void removeListenersFromWindow(IWorkbenchWindow window) {
+ for (IPageListener listener : pageListeners) {
+ window.removePageListener(listener);
+ }
+ for (IPartListener listener : partListeners) {
+ window.getPartService().removePartListener(listener);
+ }
+ for (IPerspectiveListener listener : perspectiveListeners) {
+ window.removePerspectiveListener(listener);
+ }
+ for (ISelectionListener listener : postSelectionListeners) {
+ window.getSelectionService().removePostSelectionListener(listener);
+ }
+ monitoredWindows.remove(window);
+ }
+
+ // TODO: consider making API
+ private void addListenersToWindow(IWorkbenchWindow window) {
+ for (IPageListener listener : pageListeners) {
+ window.addPageListener(listener);
+ }
+ for (IPartListener listener : partListeners) {
+ window.getPartService().addPartListener(listener);
+ }
+ for (IPerspectiveListener listener : perspectiveListeners) {
+ window.addPerspectiveListener(listener);
+ }
+ for (ISelectionListener listener : postSelectionListeners) {
+ window.getSelectionService().addPostSelectionListener(listener);
+ }
+
+ monitoredWindows.add(window);
+ }
+
+ /**
+ * @since 2.2
+ */
+ public Set<IWorkbenchWindow> getMonitoredWindows() {
+ return monitoredWindows;
+ }
+
+ /**
+ * @since 2.2
+ */
+ public IWorkbenchWindow getLaunchingWorkbenchWindow() {
+ return launchingWorkbenchWindow;
+ }
+
+ private void init() {
+ try {
+ getWorkbench().addWindowListener(WINDOW_LISTENER);
+ launchingWorkbenchWindow = getWorkbench().getActiveWorkbenchWindow();
+
+ for (IWorkbenchWindow window : getWorkbench().getWorkbenchWindows()) {
+ addListenersToWindow(window);
+ }
+
+ shellLifecycleListener = new ShellLifecycleListener(ContextCorePlugin.getContextManager());
+ getWorkbench().getActiveWorkbenchWindow().getShell().addShellListener(shellLifecycleListener);
+
+ monitors.add(new WorkbenchUserActivityMonitor());
+ new MonitorUiExtensionPointReader().initExtensions();
+
+ activityContextManager = new ActivityContextManager(monitors);
+
+ updateActivityTimout();
+
+ if (getPreferenceStore().getBoolean(PREF_USER_ACTIVITY_ENABLED)) {
+ activityContextManager.start();
+ }
+
+ getPreferenceStore().addPropertyChangeListener(PROPERTY_LISTENER);
+
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN, "Monitor UI start failed", e)); //$NON-NLS-1$
+ }
+ }
+
+ private void updateActivityTimout() {
+ if (getPreferenceStore().getBoolean(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED)) {
+ activityContextManager.setInactivityTimeout(getPreferenceStore().getInt(
+ ActivityContextManager.ACTIVITY_TIMEOUT));
+ } else {
+ activityContextManager.setInactivityTimeout(0);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/PerspectiveChangeMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/PerspectiveChangeMonitor.java
new file mode 100644
index 0000000..a1cff64
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/PerspectiveChangeMonitor.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Lean Findlater - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.ui;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PerspectiveAdapter;
+import org.eclipse.ui.internal.registry.PerspectiveDescriptor;
+
+/**
+ * @author Leah Findlater
+ * @author Mik Kersten
+ */
+public class PerspectiveChangeMonitor extends PerspectiveAdapter {
+
+ public static final String PERSPECTIVE_SAVED = "perspective saved"; //$NON-NLS-1$
+
+ public static final String PERSPECTIVE_OPENED = "perspective opened"; //$NON-NLS-1$
+
+ public static final String PERSPECTIVE_CLOSED = "perspective closed"; //$NON-NLS-1$
+
+ public static final String PERSPECTIVE_CHANGED = "perspective changed"; //$NON-NLS-1$
+
+ public static final String PERSPECTIVE_ACTIVATED = "perspective activated"; //$NON-NLS-1$
+
+ @Override
+ public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ String source = this.getPerspectiveId(perspective);
+
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, PERSPECTIVE_ACTIVATED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ @Override
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective,
+ IWorkbenchPartReference partRef, String changeId) {
+ if (partRef != null) {
+ String source = partRef.getId();
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, PERSPECTIVE_CHANGED + ": " //$NON-NLS-1$
+ + changeId);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+ }
+
+ @Override
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {
+ String source = this.getPerspectiveId(perspective);
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, PERSPECTIVE_CHANGED + ": " //$NON-NLS-1$
+ + changeId);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ @Override
+ public void perspectiveClosed(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ String source = this.getPerspectiveId(perspective);
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, PERSPECTIVE_CLOSED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ @Override
+ public void perspectiveOpened(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
+ String source = this.getPerspectiveId(perspective);
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, PERSPECTIVE_OPENED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ @Override
+ public void perspectiveSavedAs(IWorkbenchPage page, IPerspectiveDescriptor oldPerspective,
+ IPerspectiveDescriptor newPerspective) {
+ String source = this.getPerspectiveId(newPerspective);
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(source, PERSPECTIVE_SAVED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ private String getPerspectiveId(IPerspectiveDescriptor perspective) {
+ String id;
+
+ if (perspective instanceof PerspectiveDescriptor) {
+ String originalId = ((PerspectiveDescriptor) perspective).getOriginalId();
+ if (!originalId.equals(perspective.getId())) {
+ id = originalId + "[customized]"; //$NON-NLS-1$
+ } else {
+ id = perspective.getId();
+ }
+ } else {
+ id = perspective.getId();
+ }
+ return id;
+ }
+
+}
+
+/* Perspective listener methods */
+
+// TODO Should we comment out the more detailed perspective listener methods and
+// just use this one instead? This one logs the open set of views and editors
+// whenever that changes.
+/*
+ * @Override public void perspectiveChanged(IWorkbenchPage page,
+ * IPerspectiveDescriptor perspective, String changeId) {
+ * super.perspectiveChanged(page, perspective, changeId);
+ *
+ * if(changeId.startsWith("view") || changeId.startsWith("editor")) {
+ * IWorkbenchPage workbenchPage =
+ * PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ * IViewReference[] viewList = workbenchPage.getViewReferences();
+ * IEditorReference[] editorList = workbenchPage.getEditorReferences();
+ *
+ * String delta = ""; for(int i = 0; i < viewList.length; i++) { delta = delta +
+ * viewList[i].getTitle() + ","; } delta = delta + "Editor (" +
+ * editorList.length + " open)";
+ *
+ * String source = "perspective." + perspective.getLabel(); InteractionEvent
+ * interactionEvent = new InteractionEvent( source, delta );
+ * logger.interactionObserved(interactionEvent); } }
+ */
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/PreferenceChangeMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/PreferenceChangeMonitor.java
new file mode 100644
index 0000000..4fe6e80
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/PreferenceChangeMonitor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
+import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ */
+public class PreferenceChangeMonitor implements IPropertyChangeListener {
+
+ public void propertyChange(PropertyChangeEvent event) {
+ String newValue = obfuscateValueIfContainsPath(event.getNewValue().toString());
+ InteractionEvent interactionEvent = InteractionEvent.makePreference(event.getProperty(), newValue);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ private String obfuscateValueIfContainsPath(String preferenceValue) {
+ if (preferenceValue.indexOf(java.io.File.separator) != -1 || preferenceValue.indexOf('/') != -1) {
+ return MonitorUiPlugin.OBFUSCATED_LABEL;
+ } else {
+ return preferenceValue;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ShellLifecycleListener.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ShellLifecycleListener.java
new file mode 100644
index 0000000..66fbf89
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/ShellLifecycleListener.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
+
+/**
+ * Translates interaction with the shell/window to interaction events.
+ *
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class ShellLifecycleListener implements ShellListener {
+
+ private final InteractionContextManager manager;
+
+ public ShellLifecycleListener(InteractionContextManager manager) {
+ this.manager = manager;
+
+ String productId = InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH;
+ if (Platform.getProduct() != null) {
+ productId = Platform.getProduct().getId();
+ }
+
+ manager.processActivityMetaContextEvent(new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_LIFECYCLE, productId,
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_STARTED, 1f));
+ }
+
+ public void shellClosed(ShellEvent shellEvent) {
+ // XXX: if this is only used for saving this is not right
+ manager.deactivateAllContexts();
+
+ String productId = InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH;
+ if (Platform.getProduct() != null) {
+ productId = Platform.getProduct().getId();
+ }
+
+ manager.processActivityMetaContextEvent(new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_LIFECYCLE, productId,
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_STOPPED, 1f));
+// ContextCore.getContextManager().saveActivityMetaContext();
+ }
+
+ public void shellDeactivated(ShellEvent arg0) {
+ // ignore
+ }
+
+ public void shellActivated(ShellEvent arg0) {
+ // ignore
+ }
+
+ public void shellDeiconified(ShellEvent arg0) {
+ // ignore
+ }
+
+ public void shellIconified(ShellEvent arg0) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/WindowChangeMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/WindowChangeMonitor.java
new file mode 100644
index 0000000..17414c7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/WindowChangeMonitor.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.ui;
+
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * Logs all bug root window selections (i.e. the window that the workbench is launced with).
+ *
+ * @author Mik Kersten
+ * @author Leah Findlater
+ *
+ */
+public class WindowChangeMonitor implements IWindowListener {
+
+ public static final String WINDOW_CLOSED = "closed"; //$NON-NLS-1$
+
+ public static final String WINDOW_OPENED = "opened"; //$NON-NLS-1$
+
+ public static final String WINDOW_ACTIVATED = "activated"; //$NON-NLS-1$
+
+ public static final String WINDOW_DEACTIVATED = "deactivated"; //$NON-NLS-1$
+
+ public WindowChangeMonitor() {
+ super();
+ }
+
+ // TODO: Should we add the default set of monitors to the new window as
+ // well?
+ public void windowOpened(IWorkbenchWindow window) {
+ InteractionEvent interactionEvent = InteractionEvent.makeCommand(getWindowOrigin(window), WINDOW_OPENED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ InteractionEvent interactionEvent = InteractionEvent.makeCommand(getWindowOrigin(window), WINDOW_CLOSED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+// InteractionEvent interactionEvent = InteractionEvent.makeCommand(getWindowOrigin(window),
+// WINDOW_DEACTIVATED);
+// MylynMonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ public void windowActivated(IWorkbenchWindow window) {
+ InteractionEvent interactionEvent = InteractionEvent.makeCommand(getWindowOrigin(window), WINDOW_ACTIVATED);
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(interactionEvent);
+ }
+
+ protected String getWindowOrigin(IWorkbenchWindow window) {
+ return window.getClass().getCanonicalName();// + "@" + window.hashCode();
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/WorkbenchUserActivityMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/WorkbenchUserActivityMonitor.java
new file mode 100644
index 0000000..d74f4f7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/WorkbenchUserActivityMonitor.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.mylyn.monitor.ui.AbstractUserActivityMonitor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class WorkbenchUserActivityMonitor extends AbstractUserActivityMonitor {
+
+ private Listener interactionActivityListener;
+
+ private Display display;
+
+ @Override
+ public void start() {
+ display = MonitorUiPlugin.getDefault().getWorkbench().getDisplay();
+ interactionActivityListener = new Listener() {
+ public void handleEvent(Event event) {
+ setLastEventTime(System.currentTimeMillis());
+ }
+ };
+
+ display.addFilter(SWT.KeyUp, interactionActivityListener);
+ display.addFilter(SWT.MouseUp, interactionActivityListener);
+ }
+
+ @Override
+ public void stop() {
+ if (display != null && !display.isDisposed() && interactionActivityListener != null) {
+ display.removeFilter(SWT.KeyUp, interactionActivityListener);
+ display.removeFilter(SWT.MouseUp, interactionActivityListener);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/messages.properties b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/messages.properties
new file mode 100644
index 0000000..1e43bce
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/internal/monitor/ui/messages.properties
@@ -0,0 +1 @@
+CheckActivityJob_Activity_Monitor_Job=Activity Monitor Job
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractCommandMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractCommandMonitor.java
new file mode 100644
index 0000000..80043d5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractCommandMonitor.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IExecutionListener;
+import org.eclipse.core.commands.NotHandledException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+
+/**
+ * Self-registering on construction. Monitors the execution of commands within the workbench.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractCommandMonitor implements IExecutionListener {
+
+ /**
+ * Workbench must be active.
+ */
+ public AbstractCommandMonitor() {
+ try {
+ ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getAdapter(
+ ICommandService.class);
+ commandService.addExecutionListener(this);
+ } catch (NullPointerException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN,
+ "Monitors can not be instantiated until the workbench is active.", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void dispose() {
+ try {
+ ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getAdapter(
+ ICommandService.class);
+ commandService.removeExecutionListener(this);
+ } catch (NullPointerException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, MonitorUiPlugin.ID_PLUGIN, "Could not dispose monitor.", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void postExecuteFailure(String commandId, ExecutionException exception) {
+ // don't care about this
+ }
+
+ public void notHandled(String commandId, NotHandledException exception) {
+ // don't care about this
+ }
+
+ public void postExecuteSuccess(String commandId, Object returnValue) {
+ // don't care about this
+ }
+
+ public void preExecute(String commandId, ExecutionEvent event) {
+ if (commandId != null) {
+ handleCommandExecution(commandId, event);
+ }
+ }
+
+ protected abstract void handleCommandExecution(String commandId, ExecutionEvent event);
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractEditorTracker.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractEditorTracker.java
new file mode 100644
index 0000000..4993f49
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractEditorTracker.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Tracks interaction with workbench editors.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractEditorTracker extends AbstractPartTracker {
+
+ @Override
+ public void partClosed(IWorkbenchPart part) {
+ if (part instanceof IEditorPart) {
+ editorClosed((IEditorPart) part);
+ }
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPart part) {
+ if (part instanceof IEditorPart) {
+ editorOpened((IEditorPart) part);
+ }
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPart part) {
+ if (part instanceof IEditorPart) {
+ editorBroughtToTop((IEditorPart) part);
+ }
+ }
+
+ protected abstract void editorOpened(IEditorPart part);
+
+ protected abstract void editorClosed(IEditorPart part);
+
+ protected abstract void editorBroughtToTop(IEditorPart part);
+
+ @Override
+ public void partActivated(IWorkbenchPart part) {
+ // ignore
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPart part) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractPartTracker.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractPartTracker.java
new file mode 100644
index 0000000..3b511b2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractPartTracker.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Monitors interaction with workbench parts.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractPartTracker implements IPartListener {
+
+ public void install(IWorkbench workbench) {
+ MonitorUiPlugin.getDefault().addWindowPartListener(this);
+ }
+
+ public void dispose(IWorkbench workbench) {
+ MonitorUiPlugin.getDefault().removeWindowPartListener(this);
+ }
+
+ public abstract void partActivated(IWorkbenchPart part);
+
+ public abstract void partBroughtToTop(IWorkbenchPart part);
+
+ public abstract void partClosed(IWorkbenchPart part);
+
+ public abstract void partDeactivated(IWorkbenchPart part);
+
+ public abstract void partOpened(IWorkbenchPart part);
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractUserActivityMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractUserActivityMonitor.java
new file mode 100644
index 0000000..85f4335
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractUserActivityMonitor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+/**
+ * Extend to monitor periods of user activity and inactivity.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @since 2.0
+ */
+public abstract class AbstractUserActivityMonitor {
+
+ private long lastEventTimeStamp = -1;
+
+ /**
+ * @since 2.0
+ */
+ public long getLastInteractionTime() {
+ synchronized (this) {
+ return lastEventTimeStamp;
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setLastEventTime(long lastEventTime) {
+ synchronized (this) {
+ lastEventTimeStamp = lastEventTime;
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public abstract void start();
+
+ /**
+ * @since 2.0
+ */
+ public abstract void stop();
+
+ /**
+ * @return false if monitor unable to run (i.e. startup failures of any kind)
+ * @since 2.0
+ */
+ public boolean isEnabled() {
+ return true;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public String getOriginId() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractUserInteractionMonitor.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractUserInteractionMonitor.java
new file mode 100644
index 0000000..d844439
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/AbstractUserInteractionMonitor.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.monitor.ui.IMonitoredWindow;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * Self-registering on construction. Encapsulates users' interaction with the context model.
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @since 2.0
+ */
+public abstract class AbstractUserInteractionMonitor implements ISelectionListener {
+
+ protected Object lastSelectedElement = null;
+
+ /**
+ * Requires workbench to be active.
+ */
+ public AbstractUserInteractionMonitor() {
+ try {
+ MonitorUiPlugin.getDefault().addWindowPostSelectionListener(this);
+ } catch (NullPointerException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, MonitorUiPlugin.ID_PLUGIN,
+ "Monitors can not be instantiated until the workbench is active", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void dispose() {
+ try {
+ MonitorUiPlugin.getDefault().removeWindowPostSelectionListener(this);
+ } catch (NullPointerException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, MonitorUiPlugin.ID_PLUGIN, "Could not dispose monitor", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (part.getSite() != null && part.getSite().getWorkbenchWindow() != null) {
+ IWorkbenchWindow window = part.getSite().getWorkbenchWindow();
+ if (window instanceof IMonitoredWindow && !((IMonitoredWindow) window).isMonitored()) {
+ return;
+ }
+ }
+ if (selection == null || selection.isEmpty()) {
+ return;
+ }
+ if (!ContextCore.getContextManager().isContextActive()) {
+ handleWorkbenchPartSelection(part, selection, false);
+ } else {
+ handleWorkbenchPartSelection(part, selection, true);
+ }
+ }
+
+ protected abstract void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection,
+ boolean contributeToContext);
+
+ /**
+ * Intended to be called back by subclasses.
+ */
+ protected InteractionEvent handleElementSelection(IWorkbenchPart part, Object selectedElement,
+ boolean contributeToContext) {
+ return handleElementSelection(part.getSite().getId(), selectedElement, contributeToContext);
+ }
+
+ /**
+ * Intended to be called back by subclasses.
+ */
+ protected void handleElementEdit(IWorkbenchPart part, Object selectedElement, boolean contributeToContext) {
+ handleElementEdit(part.getSite().getId(), selectedElement, contributeToContext);
+ }
+
+ /**
+ * Intended to be called back by subclasses.
+ */
+ protected void handleNavigation(IWorkbenchPart part, Object targetElement, String kind, boolean contributeToContext) {
+ handleNavigation(part.getSite().getId(), targetElement, kind, contributeToContext);
+ }
+
+ /**
+ * Intended to be called back by subclasses. *
+ *
+ * @since 3.1
+ */
+ protected void handleNavigation(String partId, Object targetElement, String kind, boolean contributeToContext) {
+ AbstractContextStructureBridge adapter = ContextCore.getStructureBridge(targetElement);
+ if (adapter.getContentType() != null) {
+ String handleIdentifier = adapter.getHandleIdentifier(targetElement);
+ InteractionEvent navigationEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION,
+ adapter.getContentType(), handleIdentifier, partId, kind);
+ if (handleIdentifier != null && contributeToContext) {
+ ContextCore.getContextManager().processInteractionEvent(navigationEvent);
+ }
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(navigationEvent);
+ }
+ }
+
+ /**
+ * Intended to be called back by subclasses.
+ *
+ * @since 3.1
+ */
+ protected void handleElementEdit(String partId, Object selectedElement, boolean contributeToContext) {
+ if (selectedElement == null) {
+ return;
+ }
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(selectedElement);
+ String handleIdentifier = bridge.getHandleIdentifier(selectedElement);
+ InteractionEvent editEvent = new InteractionEvent(InteractionEvent.Kind.EDIT, bridge.getContentType(),
+ handleIdentifier, partId);
+ if (handleIdentifier != null && contributeToContext) {
+ ContextCore.getContextManager().processInteractionEvent(editEvent);
+ }
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(editEvent);
+ }
+
+ /**
+ * Intended to be called back by subclasses. *
+ *
+ * @since 3.1
+ */
+ protected InteractionEvent handleElementSelection(String partId, Object selectedElement, boolean contributeToContext) {
+ if (selectedElement == null || selectedElement.equals(lastSelectedElement)) {
+ return null;
+ }
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(selectedElement);
+ String handleIdentifier = bridge.getHandleIdentifier(selectedElement);
+ InteractionEvent selectionEvent;
+ if (bridge.getContentType() != null) {
+ selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION, bridge.getContentType(),
+ handleIdentifier, partId);
+ } else {
+ selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION, null, null, partId);
+ }
+ if (handleIdentifier != null && contributeToContext) {
+ ContextCore.getContextManager().processInteractionEvent(selectionEvent);
+ }
+ MonitorUiPlugin.getDefault().notifyInteractionObserved(selectionEvent);
+ return selectionEvent;
+ }
+
+ public Kind getEventKind() {
+ return InteractionEvent.Kind.SELECTION;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IActionExecutionListener.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IActionExecutionListener.java
new file mode 100644
index 0000000..51d1a4c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IActionExecutionListener.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import org.eclipse.jface.action.IAction;
+
+/**
+ * Notified of user action executions.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface IActionExecutionListener {
+
+ public void actionObserved(IAction action);
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IActivityContextManager.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IActivityContextManager.java
new file mode 100644
index 0000000..1ca41e5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IActivityContextManager.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IActivityContextManager {
+
+ public abstract void removeActivityTime(String handle, long start, long end);
+
+ public abstract void setInactivityTimeout(int inactivityTimeout);
+
+ public abstract int getInactivityTimeout();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IMonitorLifecycleListener.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IMonitorLifecycleListener.java
new file mode 100644
index 0000000..f2b7540
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IMonitorLifecycleListener.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Brian de Alwis - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.monitor.ui;
+
+/**
+ * Notified of monitor life-cycle changes.
+ *
+ * @author Brian de Alwis
+ * @since 3.0
+ */
+public interface IMonitorLifecycleListener {
+
+ public void startMonitoring();
+
+ public void stopMonitoring();
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IUserAttentionListener.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IUserAttentionListener.java
new file mode 100644
index 0000000..16f7240
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/IUserAttentionListener.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+/**
+ * Notified of user activity and inactivity events.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface IUserAttentionListener {
+
+ public void userAttentionGained();
+
+ public void userAttentionLost();
+
+}
diff --git a/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/MonitorUi.java b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/MonitorUi.java
new file mode 100644
index 0000000..f7f8ba5
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.ui/src/org/eclipse/mylyn/monitor/ui/MonitorUi.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.ui;
+
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPerspectiveListener;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ * @author Steffen Pingel
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class MonitorUi {
+
+ public static void addWindowPostSelectionListener(ISelectionListener listener) {
+ MonitorUiPlugin.getDefault().addWindowPostSelectionListener(listener);
+ }
+
+ public static void removeWindowPostSelectionListener(ISelectionListener listener) {
+ MonitorUiPlugin.getDefault().removeWindowPostSelectionListener(listener);
+ }
+
+ public static void addInteractionListener(IInteractionEventListener listener) {
+ MonitorUiPlugin.getDefault().addInteractionListener(listener);
+ }
+
+ public static List<AbstractUserInteractionMonitor> getSelectionMonitors() {
+ return MonitorUiPlugin.getDefault().getSelectionMonitors();
+ }
+
+ public static void removeInteractionListener(IInteractionEventListener listener) {
+ MonitorUiPlugin.getDefault().removeInteractionListener(listener);
+ }
+
+ public static IActivityContextManager getActivityContextManager() {
+ return MonitorUiPlugin.getDefault().getActivityContextManager();
+ }
+
+ public static IWorkbenchWindow getLaunchingWorkbenchWindow() {
+ return MonitorUiPlugin.getDefault().getLaunchingWorkbenchWindow();
+ }
+
+ public static Set<IWorkbenchWindow> getMonitoredWindows() {
+ return MonitorUiPlugin.getDefault().getMonitoredWindows();
+ }
+
+ public static void addWindowPartListener(IPartListener listener) {
+ MonitorUiPlugin.getDefault().addWindowPartListener(listener);
+ }
+
+ public static void removeWindowPartListener(IPartListener listener) {
+ MonitorUiPlugin.getDefault().removeWindowPartListener(listener);
+ }
+
+ public static void addWindowPerspectiveListener(IPerspectiveListener listener) {
+ MonitorUiPlugin.getDefault().addWindowPerspectiveListener(listener);
+ }
+
+ public static void removeWindowPerspectiveListener(IPerspectiveListener listener) {
+ MonitorUiPlugin.getDefault().removeWindowPerspectiveListener(listener);
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/.classpath b/org.eclipse.mylyn.monitor.usage/.classpath
new file mode 100644
index 0000000..aafa820
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/update/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.monitor.usage/.cvsignore b/org.eclipse.mylyn.monitor.usage/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.monitor.usage/.project b/org.eclipse.mylyn.monitor.usage/.project
new file mode 100644
index 0000000..a7a2341
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.monitor.usage</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..0cde48a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.IQuestionnairePage.java'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.usage{IQuestionnairePage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161124855212" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.IBackgroundPage.java'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.usage{IBackgroundPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161124859055" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..594f757
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1,2 @@
+1161124855212 Delete element
+1161124859055 Delete element
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..1e270e3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'icons' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'icons' - Original element: 'wizard-feedback.gif'" description="Copy file" destination="icons" element1="icons/etool16/wizard-feedback.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/wizard-feedback.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1162411316113" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..b71cb61
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1 @@
+1162411316113 Copy file
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..a501011
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.sandbox/src/org.eclipse.mylar.sandbox.usage.upload' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.sandbox/src/org.eclipse.mylar.sandbox.usage.upload' - Original element: 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.sandbox.usage.upload" element1="/src<org.eclipse.mylar.monitor.usage{MylarUsageMonitorPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.monitor.usage{MylarUsageMonitorPlugin.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1164915753750" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..ab3783b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1 @@
+1164915753750 Copy compilation unit
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/12/48/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/12/48/refactorings.history
new file mode 100644
index 0000000..aeaed75
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/12/48/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.core' - Original element: 'org.eclipse.mylar.internal.monitor.usage.UsageStatisticsSummary.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage.core" element1="/src<org.eclipse.mylar.internal.monitor.usage{UsageStatisticsSummary.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164990557296" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.core' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ReportGenerator.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage.core" element1="/src<org.eclipse.mylar.internal.monitor.usage{ReportGenerator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164990567125" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original element: 'org.eclipse.mylar.internal.monitor.usage.core.UsageStatisticsSummary.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core" element1="/src<org.eclipse.mylar.internal.monitor.usage.core{UsageStatisticsSummary.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164990818031" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original element: 'org.eclipse.mylar.internal.monitor.usage.core.ReportGenerator.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core" element1="/src<org.eclipse.mylar.internal.monitor.usage.core{ReportGenerator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164990840718" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.core'" description="Delete element" element1="/src<org.eclipse.mylar.internal.monitor.usage.core" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1164990858796" subPackages="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.editors' to 'org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.editors' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.editors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.monitor.usage.ui.editors" name="org.eclipse.mylar.monitor.usage.core.collectors" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1164990951734" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.wizards' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.wizards' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.NewUsageSummaryEditorWizard.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage.ui.wizards" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{NewUsageSummaryEditorWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164991019234" units="1" version="1.0"/>
+<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.editors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.editors' - Original elements: org.eclipse.mylar.monitor.usage.core.collectors.UsageEditorPart.java org.eclipse.mylar.monitor.usage.core.collectors.UsageStatsEditorInput.java org.eclipse.mylar.monitor.usage.core.collectors.UsageReportEditorPart.java org.eclipse.mylar.monitor.usage.core.collectors.UsageStatsEditorPart.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.monitor.usage.ui.editors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{UsageEditorPart.java" element2="/src<org.eclipse.mylar.monitor.usage.core.collectors{UsageStatsEditorInput.java" element3="/src<org.eclipse.mylar.monitor.usage.core.collectors{UsageReportEditorPart.java" element4="/src<org.eclipse.mylar.monitor.usage.core.collectors{UsageStatsEditorPart.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164991045171" units="4" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.DelegatingUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core{DelegatingUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164991061843" units="1" version="1.0"/>
+<refactoring comment="Move 10 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core.collectors' - Original elements: org.eclipse.mylar.internal.monitor.reports.collectors.ViewUsageCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.SummaryCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.AbstractMylarUsageCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.PerspectiveUsageCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.MylarViewUsageCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.MylarUsageAnalysisCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.MylarUsageDetector.java org.eclipse.mylar.internal.monitor.reports.collectors.PercentUsageComparator.java org.eclipse.mylar.internal.monitor.reports.collectors.CommandUsageCollector.java org.eclipse.mylar.internal.monitor.reports.collectors.DataOverviewCollector.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.monitor.usage.core.collectors" element1="/src<org.eclipse.mylar.internal.monitor.reports.collectors{ViewUsageCollector.java" element10="/src<org.eclipse.mylar.internal.monitor.reports.collectors{DataOverviewCollector.java" element2="/src<org.eclipse.mylar.internal.monitor.reports.collectors{SummaryCollector.java" element3="/src<org.eclipse.mylar.internal.monitor.reports.collectors{AbstractMylarUsageCollector.java" element4="/src<org.eclipse.mylar.internal.monitor.reports.collectors{PerspectiveUsageCollector.java" element5="/src<org.eclipse.mylar.internal.monitor.reports.collectors{MylarViewUsageCollector.java" element6="/src<org.eclipse.mylar.internal.monitor.reports.collectors{MylarUsageAnalysisCollector.java" element7="/src<org.eclipse.mylar.internal.monitor.reports.collectors{MylarUsageDetector.java" element8="/src<org.eclipse.mylar.internal.monitor.reports.collectors{PercentUsageComparator.java" element9="/src<org.eclipse.mylar.internal.monitor.reports.collectors{CommandUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164991173375" units="10" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/12/48/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/12/48/refactorings.index
new file mode 100644
index 0000000..8531e6b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/12/48/refactorings.index
@@ -0,0 +1,10 @@
+1164990557296 Move compilation unit
+1164990567125 Move compilation unit
+1164990818031 Move compilation unit
+1164990840718 Move compilation unit
+1164990858796 Delete element
+1164990951734 Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.editors'
+1164991019234 Move compilation unit
+1164991045171 Move compilation units
+1164991061843 Move compilation unit
+1164991173375 Move compilation units
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..fcce439
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'USER_ID' in 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin' to 'PREF_USER_ID' - Original element: 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.USER_ID' - Renamed element: 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.PREF_USER_ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'USER_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.monitor.usage{MylarUsageMonitorPlugin.java[MylarUsageMonitorPlugin^USER_ID" name="PREF_USER_ID" references="true" setter="false" stamp="1152767185250" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.monitor' to 'org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.monitor'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.monitor" name="org.eclipse.mylar.internal.monitor.usage" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152811281328" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..1292c0a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,2 @@
+1152767185250 Rename field 'USER_ID'
+1152811281328 Rename package 'org.eclipse.mylar.internal.monitor'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..aa67651
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogger' from 'org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger' - Original element: 'org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger' - Sub types: org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger - Extracted class: 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogger' - Extracted members: org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.outputFile org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.outputStream org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.startObserving() org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.stopObserving() org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.moveOutputFile(...) org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.getOutputFile() - Use super type where possible" delete="4" description="Extract superclass 'AbstractMonitorLogger'" element1="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger^outputFile" element10="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~stopObserving" element11="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger" element2="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger^outputStream" element3="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~startObserving" element4="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~stopObserving" element5="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~moveOutputFile~QString;" element6="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~getOutputFile" element7="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~getOutputFile" element8="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~moveOutputFile~QString;" element9="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger~startObserving" extract="6" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java[InteractionEventLogger" instanceof="false" name="AbstractMonitorLogger" replace="true" stamp="1154624812054" stubs="true" types="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogger' to 'AbstractMonitorLogFile' - Original element: 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogger' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogFile' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractMonitorLogger'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage{AbstractMonitorLogger.java[AbstractMonitorLogger" matchStrategy="1" name="AbstractMonitorLogFile" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154625313398" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogFile' to 'AbstractMonitorLog' - Original element: 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLogFile' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLog' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractMonitorLogFile'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage{AbstractMonitorLogFile.java[AbstractMonitorLogFile" matchStrategy="1" name="AbstractMonitorLog" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154625326054" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..d63942e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1,3 @@
+1154624812054 Extract superclass 'AbstractMonitorLogger'
+1154625326054 Rename type 'AbstractMonitorLogFile'
+1154625313398 Rename type 'AbstractMonitorLogger'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..83e602d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.usage.upload/WEB-INF/src/upload' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage.upload/WEB-INF/src/upload' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.PercentUsageComparator.java'" description="Copy compilation unit" destination="/WEB-INF\/src<upload" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{PercentUsageComparator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.monitor.usage.core.collectors{PercentUsageComparator.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1169156223177" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.usage.upload/WEB-INF/src/upload' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage.upload/WEB-INF/src/upload' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.PercentUsageComparator.java'" description="Copy compilation unit" destination="/WEB-INF\/src<upload" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{PercentUsageComparator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.monitor.usage.core.collectors{PercentUsageComparator.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1169231007484" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.IFeedbackPage.java'" description="Delete element" element1="/src<org.eclipse.mylar.monitor.usage{IFeedbackPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1169231979012" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..1252d20
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1,3 @@
+1169156223177 Copy compilation unit
+1169231007484 Copy compilation unit
+1169231979012 Delete element
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..cb4da2f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.HtmlStreamTokenizer.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.monitor.usage{HtmlStreamTokenizer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1169681257662" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.HtmlTag.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.monitor.usage{HtmlTag.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1169681266435" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..1ca6738
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1,2 @@
+1169681257662 Delete element
+1169681266435 Delete element
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..6677452
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor' - Original element: 'plugin.xml'" description="Copy file" destination="=org.eclipse.mylar.monitor" element1="plugin.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="plugin.xml	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1170463843061" units="0" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.MonitorExtensionPointReader' to 'MonitorUsageExtensionPointReader' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.MonitorExtensionPointReader' - Renamed element: 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.MonitorUsageExtensionPointReader' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'MonitorExtensionPointReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.usage{MylarUsageMonitorPlugin.java[MylarUsageMonitorPlugin[MonitorExtensionPointReader" matchStrategy="1" name="MonitorUsageExtensionPointReader" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170464769611" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..30fe995
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1,2 @@
+1170463843061 Copy file
+1170464769611 Rename type 'MonitorExtensionPointReader'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..94922b2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'MylarMonitorPreferenceConstants.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/monitor/usage/MylarMonitorPreferenceConstants.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1170815257760" subPackages="false" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.html' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.html' - Original elements: org.eclipse.mylar.internal.monitor.usage.HtmlTag.java org.eclipse.mylar.internal.monitor.usage.HtmlStreamTokenizer.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.monitor.core.html" element1="/src<org.eclipse.mylar.internal.monitor.usage{HtmlTag.java" element2="/src<org.eclipse.mylar.internal.monitor.usage{HtmlStreamTokenizer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170815325595" units="2" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.logging' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.logging' - Original elements: org.eclipse.mylar.internal.monitor.usage.AbstractMonitorLog.java org.eclipse.mylar.internal.monitor.usage.InteractionEventLogger.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.monitor.core.logging" element1="/src<org.eclipse.mylar.internal.monitor.usage{AbstractMonitorLog.java" element2="/src<org.eclipse.mylar.internal.monitor.usage{InteractionEventLogger.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170815349517" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.reports.collectors'" description="Delete element" element1="/src<org.eclipse.mylar.internal.monitor.reports.collectors" element2="/src<org.eclipse.mylar.internal.monitor.reports" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170815359255" subPackages="false" version="1.0"/>
+
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.usage.HandleObfuscator' to 'InteractionEventHandleObfuscator' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.HandleObfuscator' - Renamed element: 'org.eclipse.mylar.monitor.usage.InteractionEventHandleObfuscator' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'HandleObfuscator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.usage{HandleObfuscator.java[HandleObfuscator" matchStrategy="1" name="InteractionEventHandleObfuscator" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170818902136" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.monitor.usage.InteractionEventHandleObfuscator' to 'InteractionEventObfuscator' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.InteractionEventHandleObfuscator' - Renamed element: 'org.eclipse.mylar.monitor.usage.InteractionEventObfuscator' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'InteractionEventHandleObfuscator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.monitor.usage{InteractionEventHandleObfuscator.java[InteractionEventHandleObfuscator" matchStrategy="1" name="InteractionEventObfuscator" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170818913097" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core' - Original element: 'org.eclipse.mylar.monitor.usage.InteractionEventObfuscator.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core" element1="/src<org.eclipse.mylar.monitor.usage{InteractionEventObfuscator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170819010036" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original element: 'org.eclipse.mylar.monitor.usage.InteractionEventObfuscator.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core" element1="/src<org.eclipse.mylar.monitor.usage{InteractionEventObfuscator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819172390" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original element: 'org.eclipse.mylar.monitor.usage.IQuestionnairePage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core" element1="/src<org.eclipse.mylar.monitor.usage{IQuestionnairePage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170819205579" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Original element: 'org.eclipse.mylar.monitor.usage.IBackgroundPage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.usage.core" element1="/src<org.eclipse.mylar.monitor.usage{IBackgroundPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170819346304" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.AbstractMylarUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{AbstractMylarUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819425844" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.CommandUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{CommandUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819500523" units="1" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original elements: org.eclipse.mylar.monitor.usage.core.InteractionEventClassifier.java org.eclipse.mylar.monitor.usage.core.InteractionEventComparator.java org.eclipse.mylar.monitor.usage.core.InteractionByTypeSummary.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core{InteractionEventClassifier.java" element2="/src<org.eclipse.mylar.monitor.usage.core{InteractionEventComparator.java" element3="/src<org.eclipse.mylar.monitor.usage.core{InteractionByTypeSummary.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819532360" units="3" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.DelegatingUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{DelegatingUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819551771" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.SummaryCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{SummaryCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819675885" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.DataOverviewCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{DataOverviewCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819684790" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.PercentUsageComparator.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{PercentUsageComparator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819699218" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.IUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core{IUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819726088" units="1" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.monitor.usage.core.ReportGenerator.getCleanOriginId(...)' to 'org.eclipse.mylar.monitor.core.collectors.Util' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.core.ReportGenerator.getCleanOriginId(...)' - Destination type: 'org.eclipse.mylar.monitor.core.collectors.Util'" delegate="false" deprecate="true" description="Move member 'getCleanOriginId'" element1="/src<org.eclipse.mylar.monitor.usage.core{ReportGenerator.java[ReportGenerator~getCleanOriginId~QInteractionEvent;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.monitor.core.collectors{Util.java[Util" stamp="1170819809014" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.IUsageScanner.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core{IUsageScanner.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819847108" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.PerspectiveUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{PerspectiveUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170819875960" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage.MylarUsageMonitorPlugin.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.monitor.usage{MylarUsageMonitorPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820005143" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.collectors.ViewUsageCollector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core.collectors{ViewUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820076957" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.InteractionEventSummary.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core{InteractionEventSummary.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820321379" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.core/src/org.eclipse.mylar.monitor.core.collectors' - Original element: 'org.eclipse.mylar.monitor.usage.core.InteractionEventSummarySorter.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.monitor.core.collectors" element1="/src<org.eclipse.mylar.monitor.usage.core{InteractionEventSummarySorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820333130" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.usage.core' to 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.core' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.usage.core'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.usage.core" name="org.eclipse.mylar.monitor.usage" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170867949960" textual="true" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.monitor.usage.collectors' to 'org.eclipse.mylar.internal.monitor.usage.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.monitor.usage.collectors' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.collectors' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.monitor.usage.collectors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.monitor.usage.collectors" name="org.eclipse.mylar.internal.monitor.usage.collectors" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170868056494" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.ui.MonitorImages' to 'MonitorUsageImages' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ui.MonitorImages' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.ui.MonitorUsageImages' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MonitorImages'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.ui{MonitorImages.java[MonitorImages" matchStrategy="1" name="MonitorUsageImages" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170868179619" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.ui.MonitorUsageImages' to 'UsageMonitorImages' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ui.MonitorUsageImages' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.ui.UsageMonitorImages' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MonitorUsageImages'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.ui{MonitorUsageImages.java[MonitorUsageImages" matchStrategy="1" name="UsageMonitorImages" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170868207328" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ui.UsageMonitorImages.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.internal.monitor.usage.ui{UsageMonitorImages.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170868218503" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ui.FileDisplayDialog.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.internal.monitor.usage.ui{FileDisplayDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170868230494" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ui.InteractionEventSummarySorter.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.internal.monitor.usage.ui{InteractionEventSummarySorter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170868239462" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.ui.WebBrowserDialog.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.internal.monitor.usage.ui{WebBrowserDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170868246878" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.editors' to 'org.eclipse.mylar.internal.monitor.usage.editors' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.editors' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.editors' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.editors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.monitor.usage.ui.editors" name="org.eclipse.mylar.internal.monitor.usage.editors" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170868268004" textual="true" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.preferences' to 'org.eclipse.mylar.internal.monitor.usage.preferences' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.preferences' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.preferences' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.preferences'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.monitor.usage.ui.preferences" name="org.eclipse.mylar.internal.monitor.usage.preferences" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170868285567" textual="true" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.wizards' to 'org.eclipse.mylar.internal.monitor.usage.wizards' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.ui.wizards' - Renamed element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage.wizards' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.wizards'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.monitor.usage.ui.wizards" name="org.eclipse.mylar.internal.monitor.usage.wizards" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170868301992" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..fa35417
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,36 @@
+1170815257760 Delete element
+1170815325595 Move compilation units
+1170815349517 Move compilation units
+1170815359255 Delete element
+1170818902136 Rename type 'HandleObfuscator'
+1170818913097 Rename type 'InteractionEventHandleObfuscator'
+1170819010036 Move compilation unit
+1170819172390 Move compilation unit
+1170819205579 Move compilation unit
+1170819346304 Move compilation unit
+1170819425844 Move compilation unit
+1170819500523 Move compilation unit
+1170819532360 Move compilation units
+1170819551771 Move compilation unit
+1170819675885 Move compilation unit
+1170819684790 Move compilation unit
+1170819699218 Move compilation unit
+1170819726088 Move compilation unit
+1170819809014 Move member 'getCleanOriginId'
+1170819847108 Move compilation unit
+1170819875960 Move compilation unit
+1170820005143 Move compilation unit
+1170820076957 Move compilation unit
+1170820321379 Move compilation unit
+1170820333130 Move compilation unit
+1170867949960 Rename package 'org.eclipse.mylar.monitor.usage.core'
+1170868056494 Rename package 'org.eclipse.mylar.monitor.usage.collectors'
+1170868179619 Rename type 'MonitorImages'
+1170868207328 Rename type 'MonitorUsageImages'
+1170868218503 Move compilation unit
+1170868230494 Move compilation unit
+1170868239462 Move compilation unit
+1170868246878 Move compilation unit
+1170868268004 Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.editors'
+1170868285567 Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.preferences'
+1170868301992 Rename package 'org.eclipse.mylar.internal.monitor.usage.ui.wizards'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..a0f4afd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'wizard-study.gif'" description="Delete element" element1="icons/etool16/wizard-study.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1174687916696" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'eview16' - Original element: 'wizard-feedback.gif'" description="Move file" element1="icons/etool16/wizard-feedback.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1174688077821" target="/org.eclipse.mylar.examples.monitor.study/icons/eview16" units="0" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'eview16' - Original element: 'editor-usage.gif'" description="Move file" element1="icons/etool16/editor-usage.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1174689535879" target="/org.eclipse.mylar.monitor.usage/icons/eview16" units="0" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.editors.UsageReportEditorPart' to 'UsageSummaryReportEditorPart' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageReportEditorPart' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageSummaryReportEditorPart' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'UsageReportEditorPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.editors{UsageReportEditorPart.java[UsageReportEditorPart" matchStrategy="1" name="UsageSummaryReportEditorPart" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1174689972340" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.editors.UsageStatsEditorPart' to 'UserStudyEditorPart' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageStatsEditorPart' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.editors.UserStudyEditorPart' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'UsageStatsEditorPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.editors{UsageStatsEditorPart.java[UsageStatsEditorPart" matchStrategy="1" name="UserStudyEditorPart" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1174690266073" textual="false" version="1.0"/>
+
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.examples.monitor.study/src/org.eclipse.mylar.examples.monitor.study.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.examples.monitor.study/src/org.eclipse.mylar.examples.monitor.study.collectors' - Original elements: org.eclipse.mylar.internal.monitor.usage.collectors.MylarViewUsageCollector.java org.eclipse.mylar.internal.monitor.usage.collectors.MylarUsageAnalysisCollector.java org.eclipse.mylar.internal.monitor.usage.collectors.MylarUsageDetector.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.examples.monitor.study.collectors" element1="/src<org.eclipse.mylar.internal.monitor.usage.collectors{MylarViewUsageCollector.java" element2="/src<org.eclipse.mylar.internal.monitor.usage.collectors{MylarUsageAnalysisCollector.java" element3="/src<org.eclipse.mylar.internal.monitor.usage.collectors{MylarUsageDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1174690783450" units="3" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.monitor.usage.editors.UsageSummaryReportEditorPart.URL_USAGE_SERVLET' from expression '"http://mylar.eclipse.org/monitor/upload/UsageAnalysisServlet"' - Original project: 'org.eclipse.mylar.monitor.usage' - Constant name: 'URL_USAGE_SERVLET' - Constant expression: '"http://mylar.eclipse.org/monitor/upload/UsageAnalysisServlet"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'URL_USAGE_SERVLET'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.monitor.usage.editors{UsageSummaryReportEditorPart.java" name="URL_USAGE_SERVLET" qualify="false" replace="true" selection="4501 62" stamp="1174690840072" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'URL_USAGE_SERVLET' in 'org.eclipse.mylar.internal.monitor.usage.editors.UsageSummaryReportEditorPart' to 'URL_SERVLET_USAGE' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageSummaryReportEditorPart.URL_USAGE_SERVLET' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageSummaryReportEditorPart.URL_SERVLET_USAGE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'URL_USAGE_SERVLET'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.monitor.usage.editors{UsageSummaryReportEditorPart.java[UsageSummaryReportEditorPart^URL_USAGE_SERVLET" name="URL_SERVLET_USAGE" references="true" setter="false" stamp="1174690858705" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.examples.monitor.study/src/org.eclipse.mylar.examples.monitor.study.collectors' - Original project: 'org.eclipse.mylar.monitor.usage' - Destination element: 'org.eclipse.mylar.examples.monitor.study/src/org.eclipse.mylar.examples.monitor.study.collectors' - Original element: 'org.eclipse.mylar.internal.monitor.usage.collectors.AbstractMylarUsageCollector.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.examples.monitor.study.collectors" element1="/src<org.eclipse.mylar.internal.monitor.usage.collectors{AbstractMylarUsageCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1174691058426" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.preferences.MylarMonitorPreferencePage' to 'UsageDataPreferencePage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.preferences.MylarMonitorPreferencePage' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.preferences.UsageDataPreferencePage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarMonitorPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.preferences{MylarMonitorPreferencePage.java[MylarMonitorPreferencePage" matchStrategy="1" name="UsageDataPreferencePage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1174692407145" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..4a823fd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1,10 @@
+1174687916696 Delete element
+1174688077821 Move file
+1174689535879 Move file
+1174689972340 Rename type 'UsageReportEditorPart'
+1174690266073 Rename type 'UsageStatsEditorPart'
+1174690783450 Move compilation units
+1174690840072 Extract constant 'URL_USAGE_SERVLET'
+1174690858705 Rename field 'URL_USAGE_SERVLET'
+1174691058426 Move compilation unit
+1174692407145 Rename type 'MylarMonitorPreferencePage'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..db1c953
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'monitor' in 'org.eclipse.mylar.internal.monitor.usage.MonitorFileRolloverJob.run(...)' to 'progressMonitor' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.MonitorFileRolloverJob.run(IProgressMonitor).monitor' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.MonitorFileRolloverJob.run(IProgressMonitor).progressMonitor' - Update references to refactored element" description="Rename local variable 'monitor'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.monitor.usage{MonitorFileRolloverJob.java" name="progressMonitor" references="true" selection="3558 7" stamp="1175189975812" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..ba7611c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1 @@
+1175189975812 Rename local variable 'monitor'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/4/16/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/4/16/refactorings.history
new file mode 100644
index 0000000..7855fe9
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/4/16/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSummaryEditorWizardPage' to 'UsageFileSelectionWizardPage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSummaryEditorWizardPage' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageFileSelectionWizardPage' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'UsageSummaryEditorWizardPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.wizards{UsageSummaryEditorWizardPage.java[UsageSummaryEditorWizardPage" matchStrategy="1" name="UsageFileSelectionWizardPage" qualified="false" references="true" similarDeclarations="false" stamp="1176830828484" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSubmissionWizardPage' to 'UsageSubmissionWizardPage2' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSubmissionWizardPage' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSubmissionWizardPage2' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'UsageSubmissionWizardPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.wizards{UsageSubmissionWizardPage.java[UsageSubmissionWizardPage" matchStrategy="1" name="UsageSubmissionWizardPage2" qualified="false" references="true" similarDeclarations="false" stamp="1176831139953" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageFileSelectionWizardPage' to 'UsageSubmissionWizardPage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageFileSelectionWizardPage' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSubmissionWizardPage' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'UsageFileSelectionWizardPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.wizards{UsageFileSelectionWizardPage.java[UsageFileSelectionWizardPage" matchStrategy="1" name="UsageSubmissionWizardPage" qualified="false" references="true" similarDeclarations="false" stamp="1176831229375" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSubmissionWizardPage2' to 'UsageFileSelectionWizardPage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageSubmissionWizardPage2' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.wizards.UsageFileSelectionWizardPage' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'UsageSubmissionWizardPage2'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage.wizards{UsageSubmissionWizardPage2.java[UsageSubmissionWizardPage2" matchStrategy="1" name="UsageFileSelectionWizardPage" qualified="false" references="true" similarDeclarations="false" stamp="1176831258406" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'MonitorFileRolloverJob.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/monitor/usage/MonitorFileRolloverJob.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1176831570000" subPackages="false" version="1.0"/>
+<refactoring comment="Rename field 'BACKUP_FILE_PREFIX' in 'org.eclipse.mylar.internal.monitor.usage.MonitorFileRolloverJob' to 'BACKUP_FILE_SUFFIX' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.MonitorFileRolloverJob.BACKUP_FILE_PREFIX' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.MonitorFileRolloverJob.BACKUP_FILE_SUFFIX' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'BACKUP_FILE_PREFIX'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.monitor.usage{MonitorFileRolloverJob.java[MonitorFileRolloverJob^BACKUP_FILE_PREFIX" name="BACKUP_FILE_SUFFIX" references="true" setter="false" stamp="1176831962015" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'UsageSubmissionWizard.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/monitor/usage/wizards/UsageSubmissionWizard.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1176834721781" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/4/16/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/4/16/refactorings.index
new file mode 100644
index 0000000..30d5730
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/4/16/refactorings.index
@@ -0,0 +1,7 @@
+1176830828484 Rename type 'UsageSummaryEditorWizardPage'
+1176831139953 Rename type 'UsageSubmissionWizardPage'
+1176831229375 Rename type 'UsageFileSelectionWizardPage'
+1176831258406 Rename type 'UsageSubmissionWizardPage2'
+1176831570000 Delete element
+1176831962015 Rename field 'BACKUP_FILE_PREFIX'
+1176834721781 Delete element
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..27ac1bb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.monitor.usage.MylarUsageMonitorPlugin.getUserTransimitDelay()' to 'getUserTransmitDelay' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.MylarUsageMonitorPlugin.getUserTransimitDelay()' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.MylarUsageMonitorPlugin.getUserTransmitDelay()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUserTransimitDelay'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.monitor.usage{MylarUsageMonitorPlugin.java[MylarUsageMonitorPlugin~getUserTransimitDelay" name="getUserTransmitDelay" references="true" stamp="1178559462015" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.monitor.usage.MylarUsageMonitorPlugin.getUserTransmitDelay()' to 'getUserPromptDelay' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.MylarUsageMonitorPlugin.getUserTransmitDelay()' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.MylarUsageMonitorPlugin.getUserPromptDelay()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUserTransmitDelay'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.monitor.usage{MylarUsageMonitorPlugin.java[MylarUsageMonitorPlugin~getUserTransmitDelay" name="getUserPromptDelay" references="true" stamp="1178578010828" version="1.0"/>
+<refactoring comment="Rename field 'sform' in 'org.eclipse.mylar.internal.monitor.usage.editors.UsageEditorPart' to 'form' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageEditorPart.sform' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageEditorPart.form' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'sform'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.monitor.usage.editors{UsageEditorPart.java[UsageEditorPart^sform" name="form" references="true" setter="false" stamp="1178917833953" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'form' in 'org.eclipse.mylar.internal.monitor.usage.editors.UsageEditorPart' to 'sForm' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageEditorPart.form' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.editors.UsageEditorPart.sForm' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'form'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.monitor.usage.editors{UsageEditorPart.java[UsageEditorPart^form" name="sForm" references="true" setter="false" stamp="1178917993500" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..76e64fc
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1,4 @@
+1178559462015 Rename method 'getUserTransimitDelay'
+1178578010828 Rename method 'getUserTransmitDelay'
+1178917833953 Rename field 'sform'
+1178917993500 Rename field 'form'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/20/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/20/refactorings.history
new file mode 100644
index 0000000..e06d0c0
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/20/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.monitor.usage/icons/wizban/new_statcon_wiz.gif' to 'banner-usage' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'new_statcon_wiz.gif'" description="Rename resource 'new_statcon_wiz.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/wizban/new_statcon_wiz.gif" name="banner-usage" stamp="1179469139239" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.monitor.usage/icons/wizban/banner-usage' to 'banner-usage.gif' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'banner-usage'" description="Rename resource 'banner-usage'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/wizban/banner-usage" name="banner-usage.gif" stamp="1179469144484" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/20/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/20/refactorings.index
new file mode 100644
index 0000000..ef67578
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/20/refactorings.index
@@ -0,0 +1,2 @@
+1179469139239 Rename resource 'new_statcon_wiz.gif'
+1179469144484 Rename resource 'banner-usage'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..f5ae84f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.monitor.usage.MylarMonitorPreferenceConstants' to 'MonitorPreferenceConstants' - Original project: 'org.eclipse.mylar.monitor.usage' - Original element: 'org.eclipse.mylar.internal.monitor.usage.MylarMonitorPreferenceConstants' - Renamed element: 'org.eclipse.mylar.internal.monitor.usage.MonitorPreferenceConstants' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarMonitorPreferenceConstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.monitor.usage{MylarMonitorPreferenceConstants.java[MylarMonitorPreferenceConstants" matchStrategy="1" name="MonitorPreferenceConstants" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1179859750612" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..be2c3a3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1 @@
+1179859750612 Rename type 'MylarMonitorPreferenceConstants'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..8c53b54
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.monitor.usage.MylarUsageMonitorPlugin' to 'UiUsageMonitorPlugin' - Original project: 'org.eclipse.mylyn.monitor.usage' - Original element: 'org.eclipse.mylyn.internal.monitor.usage.MylarUsageMonitorPlugin' - Renamed element: 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarUsageMonitorPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.monitor.usage{MylarUsageMonitorPlugin.java[MylarUsageMonitorPlugin" matchStrategy="1" name="UiUsageMonitorPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269443804" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..27b398a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1 @@
+1181269443804 Rename type 'MylarUsageMonitorPlugin'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..1d0620e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.usage.IBackgroundPage' to 'AbstractUserStudyBackgroundPage' - Original project: 'org.eclipse.mylyn.monitor.usage' - Original element: 'org.eclipse.mylyn.monitor.usage.IBackgroundPage' - Renamed element: 'org.eclipse.mylyn.monitor.usage.AbstractUserStudyBackgroundPage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'IBackgroundPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.usage{IBackgroundPage.java[IBackgroundPage" matchStrategy="1" name="AbstractUserStudyBackgroundPage" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182469347607" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.usage/src/org.eclipse.mylyn.internal.monitor.usage' - Original project: 'org.eclipse.mylyn.monitor.usage' - Destination element: 'org.eclipse.mylyn.monitor.usage/src/org.eclipse.mylyn.internal.monitor.usage' - Original element: 'org.eclipse.mylyn.monitor.usage.InteractionEventObfuscator.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.usage" element1="/src<org.eclipse.mylyn.monitor.usage{InteractionEventObfuscator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469397345" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.usage.AbstractUserStudyBackgroundPage' to 'AbstractStudyBackgroundPage' - Original project: 'org.eclipse.mylyn.monitor.usage' - Original element: 'org.eclipse.mylyn.monitor.usage.AbstractUserStudyBackgroundPage' - Renamed element: 'org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractUserStudyBackgroundPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.usage{AbstractUserStudyBackgroundPage.java[AbstractUserStudyBackgroundPage" matchStrategy="1" name="AbstractStudyBackgroundPage" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182469442499" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.monitor.usage.IQuestionnairePage' to 'AbstractStudyQuestionnairePage' - Original project: 'org.eclipse.mylyn.monitor.usage' - Original element: 'org.eclipse.mylyn.monitor.usage.IQuestionnairePage' - Renamed element: 'org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'IQuestionnairePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.monitor.usage{IQuestionnairePage.java[IQuestionnairePage" matchStrategy="1" name="AbstractStudyQuestionnairePage" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182469474546" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.usage/src/org.eclipse.mylyn.internal.monitor.usage' - Original project: 'org.eclipse.mylyn.monitor.usage' - Destination element: 'org.eclipse.mylyn.monitor.usage/src/org.eclipse.mylyn.internal.monitor.usage' - Original element: 'org.eclipse.mylyn.monitor.usage.UsageStatisticsSummary.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.usage" element1="/src<org.eclipse.mylyn.monitor.usage{UsageStatisticsSummary.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182469545996" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..8c8e8b7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,5 @@
+1182469347607 Rename type 'IBackgroundPage'
+1182469397345 Move compilation unit
+1182469442499 Rename type 'AbstractUserStudyBackgroundPage'
+1182469474546 Rename type 'IQuestionnairePage'
+1182469545996 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..5f4299e
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'PREF_MONITORING_MYLAR_ECLIPSE_ORG_CONSENT_VIEWED' in 'org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants' to 'PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED' - Original project: 'org.eclipse.mylyn.monitor.usage' - Original element: 'org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants.PREF_MONITORING_MYLAR_ECLIPSE_ORG_CONSENT_VIEWED' - Renamed element: 'org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PREF_MONITORING_MYLAR_ECLIPSE_ORG_CONSENT_VIEWED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.monitor.usage{MonitorPreferenceConstants.java[MonitorPreferenceConstants^PREF_MONITORING_MYLAR_ECLIPSE_ORG_CONSENT_VIEWED" name="PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED" references="true" setter="false" stamp="1184023620309" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..51a84ea
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184023620309 Rename field 'PREF_MONITORING_MYLAR_ECLIPSE_ORG_CONSENT_VIEWED'
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..e9aa967
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.usage/src/org.eclipse.mylyn.internal.monitor.usage'
- Original project: 'org.eclipse.mylyn.monitor.usage'
- Destination element: 'org.eclipse.mylyn.monitor.usage/src/org.eclipse.mylyn.internal.monitor.usage'
- Original element: 'org.eclipse.mylyn.monitor.usage.ReportGenerator.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.usage" element1="/src<org.eclipse.mylyn.monitor.usage{ReportGenerator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207945555393" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..be0eb59
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1 @@
+1207945555393 Move compilation unit
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..97cbb88
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.monitor.usage'
- Original element: 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.monitor.usage{UiUsageMonitorPlugin.java[UiUsageMonitorPlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213246437199" textual="false" version="1.0"/>
<refactoring comment="Rename field 'UI_PLUGIN_ID' in 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin' to 'ID_UI_PLUGIN'
- Original project: 'org.eclipse.mylyn.monitor.usage'
- Original element: 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin.UI_PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin.ID_UI_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'UI_PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.monitor.usage{UiUsageMonitorPlugin.java[UiUsageMonitorPlugin^UI_PLUGIN_ID" name="ID_UI_PLUGIN" references="true" setter="true" stamp="1213246506800" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.usage/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..18ba4ba
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1213246437199 Rename field 'PLUGIN_ID'
+1213246506800 Rename field 'UI_PLUGIN_ID'
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..4233beb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.monitor.usage/META-INF/MANIFEST.MF b/org.eclipse.mylyn.monitor.usage/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2499d13
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Usage Monitor
+Bundle-SymbolicName: org.eclipse.mylyn.monitor.usage;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jface.text,
+ org.eclipse.update.ui,
+ org.eclipse.update.core,
+ org.eclipse.ui.browser,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.forms,
+ org.eclipse.core.filesystem,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Mylyn
+Export-Package:
+ org.eclipse.mylyn.internal.monitor.usage;x-internal:=true,
+ org.eclipse.mylyn.internal.monitor.usage.collectors;x-internal:=true,
+ org.eclipse.mylyn.internal.monitor.usage.editors;x-internal:=true,
+ org.eclipse.mylyn.internal.monitor.usage.preferences;x-internal:=true,
+ org.eclipse.mylyn.internal.monitor.usage.wizards;x-internal:=true,
+ org.eclipse.mylyn.monitor.usage
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.monitor.usage/about.html b/org.eclipse.mylyn.monitor.usage/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.usage/build-user.xml b/org.eclipse.mylyn.monitor.usage/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.usage/build.properties b/org.eclipse.mylyn.monitor.usage/build.properties
new file mode 100644
index 0000000..dfd66f7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = plugin.xml,\
+ icons/,\
+ META-INF/,\
+ doc/,\
+ about.html,\
+ .
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.monitor.usage/doc/book.css b/org.eclipse.mylyn.monitor.usage/doc/book.css
new file mode 100644
index 0000000..6ee38f3
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/doc/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.monitor.usage/doc/images/logo-ubc.gif b/org.eclipse.mylyn.monitor.usage/doc/images/logo-ubc.gif
new file mode 100644
index 0000000..cd5f55e
Binary files /dev/null and b/org.eclipse.mylyn.monitor.usage/doc/images/logo-ubc.gif differ
diff --git a/org.eclipse.mylyn.monitor.usage/doc/index.html b/org.eclipse.mylyn.monitor.usage/doc/index.html
new file mode 100644
index 0000000..47044aa
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/doc/index.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar Documentation</title>
+</head>
+<body>
+<h2>Mylar Monitor</h2><p>The Mylar monitor watches programming activity in order
+to assist planning tools and support user studies intended to measure the
+effectiveness of the tool.
+ </p>
+
+ </body>
+</html>
diff --git a/org.eclipse.mylyn.monitor.usage/doc/readme.html b/org.eclipse.mylyn.monitor.usage/doc/readme.html
new file mode 100644
index 0000000..ab10e18
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/doc/readme.html
@@ -0,0 +1,160 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html> <head>
+ <meta http-equiv="Content-Language" content="en-us">
+ <title>Changes in AspectJ</title>
+<STYLE TYPE="text/css">
+<!--
+
+ /* FOR THE SDA PAGE */
+
+ /*
+ BODY {margin-top: 15px; margin-left: 15px; margin-right: 15px;}
+ */
+
+ A:link {
+ color:#4756AC;
+ }
+ A:visited {
+ color:#60657B;
+ }
+ A:hover {
+ color:red
+ }
+
+ INPUT {font:12px "Courier New", sans-serif;}
+
+ H2 {
+ font:18px/18px Verdana, Arial, Helvetica, sans-serif;
+ color:black;
+ font-weight:bold;
+ margin-left: 10px;
+ line-height:110%;
+ }
+ H3 {
+ font:17px/17px Verdana, Arial, Helvetica, sans-serif;
+ color:black;
+ //font-weight:bold;
+ margin-left: 10px;
+ line-height:110%;
+ }
+ H4 {
+ font:15px/16px Verdana, Arial, Helvetica, sans-serif;
+ color:black;
+ font-weight:bold;
+ margin-left: 10px;
+ line-height:140%;
+ }
+ P {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ margin-left: 10px;
+ line-height:130%;
+ }
+ .paragraph {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ margin-left: 10px;
+ line-height:130%;
+ }
+ .smallParagraph {
+ font:11px/11px Verdana, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ margin-left: 10px;
+ line-height:130%;
+ }
+ LI {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ text-align:justify;
+ margin-right: 10px;
+ margin-left: 15px;
+ line-height:120%;
+ }
+ /*
+ UL {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ text-align:justify;
+ margin-right: 10px;
+ margin-left: 15px;
+ line-height:120%;
+ }*/
+
+ DL {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ text-align:justify;
+ margin-right: 10px;
+ margin-left: 15px;
+ line-height:120%;
+ }
+ B { font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ font-weight:bold;
+ line-height:140%;
+ }
+ .footer {
+ font:10px/10px Verdana, Arial, Helvetica, sans-serif;
+ color:#888888;
+ text-align:left
+ }
+ .figureTitle {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ text-align:justify;
+ text-align:center
+ }
+ .copyrightNotice {
+ font:10px/10px Verdana, Arial, Helvetica, sans-serif;
+ color:#999999;
+ line-height:110%;
+ }
+ .smallHeading {
+ font:13px/13px Verdana, Arial, Helvetica, sans-serif;
+ font-weight:bold;
+ line-height:110%;
+ }
+ .tinyHeading {
+ font:11px/11px Verdana, Arial, Helvetica, sans-serif;
+ font-weight:bold;
+ line-height:120%;
+ }
+ .newsText {
+ font:11px/11px Verdana, Arial, Helvetica, sans-serif;
+ line-height:130%;
+ }
+ .smallParagraph {
+ font:11px/11px Verdana, Arial, Helvetica, sans-serif;
+ line-height:130%;
+ }
+ .fancyHeading {
+ font:20px/20px Chantilly, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ color:#6f7a92;
+ margin-left: 10px;
+ line-height:130%;
+ }
+
+-->
+</STYLE>
+</head>
+<body>
+
+<h2>Mylar Monitor</h2>
+<h4>Usage</h4>
+<p>To enable the monitor, the "Usage Statistics" view must be opened.
+Statistics and the usage log are gathered to the two corresponding files in the
+workspace root. If the "link" button is pressed the statistics will be
+updated live in the view as well.</p>
+<h4>Extending</h4>
+<p>To extend the monitor extend the ca.ubc.mylar.monitor.MylarMonitor class and
+implement the abstract methods. For example, to log every distinct
+IJavaElement selected do the following:</p>
+<p> public void handleElementSelection(IJavaElement
+selected, IJavaElement lastSelected, IJavaElement lastResolved) {<br>
+ if (!selected.equals(lastSelected)) {<br>
+
+MonitorPlugin.log("IJavaElement selected: " + selected.getElementName());<br>
+ } <br>
+ }</p>
+<p>Now you need to register your monitor by calling: </p>
+<p> MonitorPlugin.getDefault().getMonitors().add(new
+MyNewMonitor());</p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.monitor.usage/doc/toc.xml b/org.eclipse.mylyn.monitor.usage/doc/toc.xml
new file mode 100644
index 0000000..e7a6d35
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/doc/toc.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.mylyn.doc/doc/toc.xml#monitor" label="Monitor">
+ <topic label="Monitor" href="doc/index.html">
+ <topic label="UBC User Study" href="doc/study-info.html"/>
+ </topic>
+</toc>
diff --git a/org.eclipse.mylyn.monitor.usage/icons/etool16/monitor.gif b/org.eclipse.mylyn.monitor.usage/icons/etool16/monitor.gif
new file mode 100644
index 0000000..3ea4ad7
Binary files /dev/null and b/org.eclipse.mylyn.monitor.usage/icons/etool16/monitor.gif differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/eview16/editor-usage.gif b/org.eclipse.mylyn.monitor.usage/icons/eview16/editor-usage.gif
new file mode 100644
index 0000000..02a5c6c
Binary files /dev/null and b/org.eclipse.mylyn.monitor.usage/icons/eview16/editor-usage.gif differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-submission.gif b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-submission.gif
new file mode 100644
index 0000000..abc75e4
Binary files /dev/null and b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-submission.gif differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-usage.gif b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-usage.gif
new file mode 100644
index 0000000..2c5fe6d
Binary files /dev/null and b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-usage.gif differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-user.gif b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-user.gif
new file mode 100644
index 0000000..d61b8ad
Binary files /dev/null and b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-user.gif differ
diff --git a/org.eclipse.mylyn.monitor.usage/plugin.xml b/org.eclipse.mylyn.monitor.usage/plugin.xml
new file mode 100644
index 0000000..68bec6d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="study" name="UI Usage Monitor" schema="schema/study.exsd"/>
+
+ <extension
+ name="UI Usage Monitoring Startup"
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin$UiUsageMonitorStartup">
+ </startup>
+ </extension>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ name="Usage Data"
+ class="org.eclipse.mylyn.internal.monitor.usage.preferences.UsageDataPreferencePage"
+ id="org.eclipse.mylyn.monitor.ui.ui.preferences"
+ category="org.eclipse.mylyn.tasks.ui.preferences">
+ <keywordReference id="org.eclipse.mylyn.monitor.ui.keywords"/>
+ </page>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.keywords">
+ <keyword
+ label="mylyn UI Usage Monitor Data"
+ id="org.eclipse.mylyn.monitor.ui.keywords"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.newWizards">
+ <wizard
+ canFinishEarly="false"
+ category="org.eclipse.mylyn.ui.wizards.new"
+ class="org.eclipse.mylyn.internal.monitor.usage.wizards.NewUsageSummaryEditorWizard"
+ hasPages="true"
+ icon="icons/eview16/editor-usage.gif"
+ id="org.eclipse.mylyn.sandbox.wizard.usageSummary"
+ name="UI Usage Report"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.editors">
+ <editor
+ icon="icons/eview16/editor-usage.gif"
+ class="org.eclipse.mylyn.internal.monitor.usage.editors.UsageSummaryReportEditorPart"
+ name="UI Usage Report"
+ id="org.eclipse.mylyn.monitor.usage.summary.editor"/>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.monitor.usage/schema/study.exsd b/org.eclipse.mylyn.monitor.usage/schema/study.exsd
new file mode 100644
index 0000000..041e31f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/schema/study.exsd
@@ -0,0 +1,214 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylar.monitor.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylar.monitor.ui" id="study" name="Mylar Monitor Study"/>
+ </appInfo>
+ <documentation>
+ Provides a mechanism to connect a user study plug-in with the Mylyn Monitors usage monitoring facilities. For more information please see: http://wiki.eclipse.org/index.php/Mylyn_Integrator_Reference#Monitor_API
+ </documentation>
+ </annotation>
+
+ <element name="study">
+ <complexType>
+ <sequence>
+ <element ref="scripts"/>
+ <element ref="ui"/>
+ <element ref="monitors"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="scripts">
+ <complexType>
+ <attribute name="url" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="upload" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="userId" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="questionnaire" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="background" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="version" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="ui">
+ <complexType>
+ <attribute name="title" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="daysBetweenUpload" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="questionnairePage" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="backgroundPage" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="consentForm" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="useContactField" type="boolean">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="monitors">
+ <complexType>
+ <attribute name="browserUrlFilter" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ See the org.eclipse.mylyn.examples.monitor.study plug-in for a reference implementation.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/FileDisplayDialog.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/FileDisplayDialog.java
new file mode 100644
index 0000000..2ff2e7d
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/FileDisplayDialog.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.swt.SWT;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog that displays the contents of a file to the user
+ *
+ * @author Shawn Minto
+ */
+public class FileDisplayDialog extends MessageDialog {
+
+ private static String contents = "";
+
+ public FileDisplayDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage,
+ int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String contents) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ }
+
+ public static int openShowFile(Shell parent, String title, String message, File file) throws FileNotFoundException {
+ contents = getContents(file);
+ return showFile(parent, title, message);
+ }
+
+ public static int openShowFile(Shell parent, String title, String message, File file, int maxNumLines)
+ throws FileNotFoundException {
+ contents = getContents(file, maxNumLines);
+ return showFile(parent, title, message);
+ }
+
+ private static int showFile(Shell parent, String title, String message) {
+ FileDisplayDialog dialog = new FileDisplayDialog(parent, title, null, // accept
+ // the
+ // default
+ // window
+ // icon
+ message, NONE, new String[] { IDialogConstants.OK_LABEL }, 0, contents);
+ // ok is the default
+ return dialog.open();
+ }
+
+ @Override
+ public Control createCustomArea(Composite parent) {
+ GridLayout layout = new GridLayout();
+ parent.setLayout(layout);
+ layout.numColumns = 1;
+
+ Text t = new Text(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 1;
+ gd.verticalSpan = 50;
+ t.setLayoutData(gd);
+ t.setEditable(false);
+ t.setText(contents);
+ return parent;
+ }
+
+ /**
+ * Get the contents of an InputStream
+ *
+ * @param is
+ * The InputStream to get the contents for
+ * @return The <code>String</code> representing the contents
+ */
+ public static String getContents(File f) throws FileNotFoundException {
+ return getContents(f, -1);
+ }
+
+ /**
+ * Get the contents of an InputStream
+ *
+ * @param is
+ * The InputStream to get the contents for
+ * @return The <code>String</code> representing the contents
+ */
+ public static String getContents(File f, int maxNumLines) throws FileNotFoundException {
+
+ // create a new reader for the stream
+ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
+ StringBuilder sb = new StringBuilder();
+ int i = 0;
+ try {
+
+ // get the contents
+ String s = "";
+ while ((s = br.readLine()) != null && (i < maxNumLines || maxNumLines == -1)) {
+ sb.append(s);
+ sb.append("\n");
+ i++;
+ }
+
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Could not get contents", e));
+ }
+ return sb.toString();
+ }
+
+}
+
+/*
+ * stringbuffer sb = new stringbuffer(); for (int i = 1; i <= n; i++) {
+ * sb.append("*"); } string str2 = sb.tostring();
+ */
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventLogger.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventLogger.java
new file mode 100644
index 0000000..82d155f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventLogger.java
@@ -0,0 +1,364 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - XML serialization
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer;
+import org.eclipse.mylyn.monitor.core.AbstractMonitorLog;
+import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
+
+/**
+ * @author Mik Kersten
+ *
+ * TODO: use buffered output stream for better performance?
+ */
+public class InteractionEventLogger extends AbstractMonitorLog implements IInteractionEventListener {
+
+ private int eventAccumulartor = 0;
+
+ private final List<InteractionEvent> queue = new CopyOnWriteArrayList<InteractionEvent>();
+
+ private final InteractionEventObfuscator handleObfuscator = new InteractionEventObfuscator();
+
+ private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S z", Locale.ENGLISH);
+
+ public InteractionEventLogger(File outputFile) {
+ this.outputFile = outputFile;
+ }
+
+ public synchronized void interactionObserved(InteractionEvent event) {
+// System.err.println("> " + event);
+ if (UiUsageMonitorPlugin.getDefault() == null) {
+ StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Attempted to log event before usage monitor start"));
+ }
+ if (UiUsageMonitorPlugin.getDefault().isObfuscationEnabled()) {
+ String obfuscatedHandle = handleObfuscator.obfuscateHandle(event.getStructureKind(),
+ event.getStructureHandle());
+ event = new InteractionEvent(event.getKind(), event.getStructureKind(), obfuscatedHandle,
+ event.getOriginId(), event.getNavigation(), event.getDelta(), event.getInterestContribution());
+ }
+ try {
+ if (started) {
+ String xml = getXmlForEvent(event);
+ outputStream.write(xml.getBytes());
+ } else if (event != null) {
+ queue.add(event);
+ }
+ eventAccumulartor++;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not log interaction event", t));
+ }
+ }
+
+ @Override
+ public void startMonitoring() {
+ super.startMonitoring();
+ for (InteractionEvent queuedEvent : queue) {
+ interactionObserved(queuedEvent);
+ }
+ queue.clear();
+ }
+
+ @Override
+ public void stopMonitoring() {
+ super.stopMonitoring();
+ if (UiUsageMonitorPlugin.getDefault() != null) {
+ UiUsageMonitorPlugin.getDefault().incrementObservedEvents(eventAccumulartor);
+ }
+ eventAccumulartor = 0;
+ }
+
+ private String getXmlForEvent(InteractionEvent event) {
+ return writeLegacyEvent(event);
+ }
+
+ /**
+ * @return true if successfully cleared
+ */
+ public synchronized void clearInteractionHistory() throws IOException {
+ this.clearInteractionHistory(true);
+ }
+
+ public synchronized void clearInteractionHistory(boolean startMonitoring) throws IOException {
+ stopMonitoring();
+ outputStream = new FileOutputStream(outputFile, false);
+ outputStream.flush();
+ outputStream.close();
+ outputFile.delete();
+ outputFile.createNewFile();
+ if (startMonitoring) {
+ startMonitoring();
+ }
+ }
+
+ public List<InteractionEvent> getHistoryFromFile(File file) {
+ List<InteractionEvent> events = new ArrayList<InteractionEvent>();
+ try {
+ // The file may be a zip file...
+ if (file.getName().endsWith(".zip")) {
+ ZipFile zip = new ZipFile(file);
+ if (zip.entries().hasMoreElements()) {
+ ZipEntry entry = zip.entries().nextElement();
+ getHistoryFromStream(zip.getInputStream(entry), events);
+ }
+ } else {
+ InputStream reader = new FileInputStream(file);
+ getHistoryFromStream(reader, events);
+ reader.close();
+ }
+
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not read interaction history", e));
+ }
+ return events;
+ }
+
+ /**
+ * @param events
+ * @param tag
+ * @param endl
+ * @param buf
+ */
+ private void getHistoryFromStream(InputStream reader, List<InteractionEvent> events) throws IOException {
+ String xml;
+ int index;
+ String buf = "";
+ String tag = "</" + InteractionContextExternalizer.ELMNT_INTERACTION_HISTORY_OLD + ">";
+ String endl = "\r\n";
+ byte[] buffer = new byte[1000];
+ int bytesRead = 0;
+ while ((bytesRead = reader.read(buffer)) != -1) {
+ buf = buf + new String(buffer, 0, bytesRead);
+ while ((index = buf.indexOf(tag)) != -1) {
+ index += tag.length();
+ xml = buf.substring(0, index);
+ InteractionEvent event = readLegacyEvent(xml);
+ if (event != null) {
+ events.add(event);
+ }
+
+ if (index + endl.length() > buf.length()) {
+ buf = "";
+ } else {
+ buf = buf.substring(index + endl.length(), buf.length());
+ }
+ }
+ buffer = new byte[1000];
+ }
+ }
+
+ private static final String OPEN = "<";
+
+ private static final String CLOSE = ">";
+
+ private static final String SLASH = "/";
+
+ private static final String ENDL = "\n";
+
+ private static final String TAB = "\t";
+
+ @Deprecated
+ public String writeLegacyEvent(InteractionEvent e) {
+ try {
+ StringBuffer res = new StringBuffer();
+ String tag = "interactionEvent";
+ res.append(OPEN);
+ res.append(tag);
+ res.append(CLOSE);
+ res.append(ENDL);
+
+ openElement(res, "kind");
+ formatContent(res, e.getKind());
+ closeElement(res, "kind");
+
+ openElement(res, "date");
+ formatContent(res, e.getDate());
+ closeElement(res, "date");
+
+ openElement(res, "endDate");
+ formatContent(res, e.getEndDate());
+ closeElement(res, "endDate");
+
+ openElement(res, "originId");
+ formatContent(res, e.getOriginId());
+ closeElement(res, "originId");
+
+ openElement(res, "structureKind");
+ formatContent(res, e.getStructureKind());
+ closeElement(res, "structureKind");
+
+ openElement(res, "structureHandle");
+ formatContent(res, e.getStructureHandle());
+ closeElement(res, "structureHandle");
+
+ openElement(res, "navigation");
+ formatContent(res, e.getNavigation());
+ closeElement(res, "navigation");
+
+ openElement(res, "delta");
+ formatContent(res, e.getDelta());
+ closeElement(res, "delta");
+
+ openElement(res, "interestContribution");
+ formatContent(res, e.getInterestContribution());
+ closeElement(res, "interestContribution");
+
+ res.append(OPEN);
+ res.append(SLASH);
+ res.append(tag);
+ res.append(CLOSE);
+ res.append(ENDL);
+ return res.toString();
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Could not write event", t));
+ return "";
+ }
+ }
+
+ private void formatContent(StringBuffer buffer, float interestContribution) {
+ buffer.append(interestContribution);
+ }
+
+ @SuppressWarnings("deprecation")
+ private void formatContent(StringBuffer buffer, String content) {
+ if (content != null && content.length() > 0) {
+ String xmlContent;
+ xmlContent = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(content);
+ xmlContent = xmlContent.replace("\n", "\n\t\t");
+ buffer.append(xmlContent);
+ }
+ }
+
+ private void formatContent(StringBuffer buffer, Kind kind) {
+ buffer.append(kind.toString());
+ }
+
+ private void formatContent(StringBuffer buffer, Date date) {
+ buffer.append(dateFormat.format(date));
+ }
+
+ private void openElement(StringBuffer buffer, String tag) {
+ buffer.append(TAB);
+ buffer.append(OPEN);
+ buffer.append(tag);
+ buffer.append(CLOSE);
+ }
+
+ private void closeElement(StringBuffer buffer, String tag) {
+ buffer.append(OPEN);
+ buffer.append(SLASH);
+ buffer.append(tag);
+ buffer.append(CLOSE);
+ buffer.append(ENDL);
+ }
+
+ public InteractionEvent readLegacyEvent(String xml) {
+ Reader reader = new StringReader(xml);
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
+ String kind = "";
+ String startDate = "";
+ String endDate = "";
+ String originId = "";
+ String structureKind = "";
+ String structureHandle = "";
+ String navigation = "";
+ String delta = "";
+ String interest = "";
+ try {
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getValue().toString().equals("<kind>")) {
+ kind = readStringContent(tokenizer, "</kind>");
+ kind = kind.toLowerCase(Locale.ENGLISH);
+ } else if (token.getValue().toString().equals("<date>")) {
+ startDate = readStringContent(tokenizer, "</date>");
+ } else if (token.getValue().toString().equals("<endDate>")) {
+ endDate = readStringContent(tokenizer, "</endDate>");
+ } else if (token.getValue().toString().equals("<originId>")) {
+ originId = readStringContent(tokenizer, "</originId>");
+ } else if (token.getValue().toString().equals("<structureKind>")) {
+ structureKind = readStringContent(tokenizer, "</structureKind>");
+ } else if (token.getValue().toString().equals("<structureHandle>")) {
+ structureHandle = readStringContent(tokenizer, "</structureHandle>");
+ } else if (token.getValue().toString().equals("<navigation>")) {
+ navigation = readStringContent(tokenizer, "</navigation>");
+ } else if (token.getValue().toString().equals("<delta>")) {
+ delta = readStringContent(tokenizer, "</delta>");
+ } else if (token.getValue().toString().equals("<interestContribution>")) {
+ interest = readStringContent(tokenizer, "</interestContribution>");
+ }
+ }
+ float interestFloatVal = 0;
+ try {
+ interestFloatVal = Float.parseFloat(interest);
+ } catch (NumberFormatException nfe) {
+ // ignore for empty interest values
+ }
+ InteractionEvent event = new InteractionEvent(Kind.fromString(kind), structureKind, structureHandle,
+ originId, navigation, delta, interestFloatVal, dateFormat.parse(startDate),
+ dateFormat.parse(endDate));
+ return event;
+
+ } catch (ParseException e) {
+ System.err.println("readevent: " + xml);
+ e.printStackTrace();
+ } catch (IOException e) {
+ System.err.println("readevent: " + xml);
+ e.printStackTrace();
+ } catch (Exception e) {
+ System.err.println("readevent: " + xml);
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ private String readStringContent(HtmlStreamTokenizer tokenizer, String endTag) throws IOException, ParseException {
+ StringBuffer content = new StringBuffer();
+ Token token = tokenizer.nextToken();
+ while (!token.getValue().toString().equals(endTag)) {
+ if (content.length() > 0) {
+ content.append(' ');
+ }
+ content.append(token.getValue().toString());
+ token = tokenizer.nextToken();
+ }
+ return org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(content.toString()).trim();
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventObfuscator.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventObfuscator.java
new file mode 100644
index 0000000..5c11e47
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventObfuscator.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.eclipse.core.internal.preferences.Base64;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+
+/**
+ * Provides one way hashing of events for the purpose of ensuring privacy of element handles.
+ *
+ * @author Mik Kersten
+ */
+public class InteractionEventObfuscator {
+
+ private static final char DELIM_PATH = '/';
+
+ public static final String LABEL_FAILED_TO_OBFUSCATE = "<failed to obfuscate>";
+
+ public static final String ENCRYPTION_ALGORITHM = "SHA";
+
+ public String obfuscateHandle(String structureKind, String structureHandle) {
+ if (structureHandle == null || structureHandle.equals("")) {
+ return structureHandle;
+ }
+ StringBuilder obfuscated = new StringBuilder();
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(structureKind);
+ Object object = bridge.getObjectForHandle(structureHandle);
+ if (object instanceof IAdaptable) {
+ Object adapter = ((IAdaptable) object).getAdapter(IResource.class);
+ if (adapter instanceof IResource) {
+ obfuscated.append(obfuscateResourcePath(((IResource) adapter).getFullPath()));
+ obfuscated.append(DELIM_PATH);
+ }
+ }
+ obfuscated.append(obfuscateString(structureHandle));
+ return obfuscated.toString();
+ }
+
+ /**
+ * Encrypts the string using SHA, then makes it reasonable to print.
+ */
+ public String obfuscateString(String string) {
+ String obfuscatedString = null;
+ try {
+ MessageDigest md = MessageDigest.getInstance(ENCRYPTION_ALGORITHM);
+ md.update(string.getBytes());
+ byte[] digest = md.digest();
+ obfuscatedString = new String(Base64.encode(digest)).replace(DELIM_PATH, '=');
+ // obfuscatedString = "" + new String(digest).hashCode();
+ } catch (NoSuchAlgorithmException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.ID_PLUGIN, "SHA not available", e));
+ obfuscatedString = LABEL_FAILED_TO_OBFUSCATE;
+ }
+ return obfuscatedString;
+ }
+
+ public String obfuscateResourcePath(IPath path) {
+ if (path == null) {
+ return "";
+ } else {
+ StringBuffer obfuscatedPath = new StringBuffer();
+ for (int i = 0; i < path.segmentCount(); i++) {
+ obfuscatedPath.append(obfuscateString(path.segments()[i]));
+ if (i < path.segmentCount() - 1) {
+ obfuscatedPath.append(DELIM_PATH);
+ }
+ }
+ return obfuscatedPath.toString();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventSummarySorter.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventSummarySorter.java
new file mode 100644
index 0000000..5f13a86
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventSummarySorter.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
+
+/**
+ * Sorts SingleSummary objects based on type, id, name, or usage count.
+ */
+public class InteractionEventSummarySorter extends ViewerSorter {
+
+ /**
+ * Constructor argument values that indicate to sort items by different columns.
+ */
+ public final static int TYPE = 1;
+
+ public final static int ID = 2;
+
+ public final static int NAME = 3;
+
+ public final static int USAGE_COUNT = 4;
+
+ // Criteria that the instance uses
+ private final int criteria;
+
+ /**
+ * Creates a resource sorter that will use the given sort criteria.
+ *
+ * @param criteria
+ * the sort criterion to use: one of <code>LABEL_VIEW_REPOSITORIES</code> or <code>TYPE</code>
+ */
+ public InteractionEventSummarySorter(int criteria) {
+ super();
+ this.criteria = criteria;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object obj1, Object obj2) {
+ InteractionEventSummary summary1 = (InteractionEventSummary) obj1;
+ InteractionEventSummary summary2 = (InteractionEventSummary) obj2;
+
+ switch (criteria) {
+ case TYPE:
+ return compareTypes(summary1, summary2);
+ case NAME:
+ return compareNames(summary1, summary2);
+ case USAGE_COUNT:
+ return compareUsageCount(summary2, summary1);
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Returns a number reflecting the collation order of the given summaries based on their usage count.
+ *
+ * @param summary1
+ * @param summary2
+ * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
+ * first element is equal to the second element; and a positive number if the first element is greater than
+ * the second element
+ */
+ private int compareUsageCount(InteractionEventSummary summary1, InteractionEventSummary summary2) {
+ int result = summary1.getUsageCount() - summary2.getUsageCount();
+ result = result < 0 ? -1 : (result > 0) ? 1 : 0;
+ return result;
+ }
+
+ /**
+ * Returns a number reflecting the collation order of the given summaries based on their names.
+ *
+ * @param summary1
+ * the first task element to be ordered
+ * @param summary2
+ * the second task element to be ordered
+ * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
+ * first element is equal to the second element; and a positive number if the first element is greater than
+ * the second element
+ */
+ @SuppressWarnings("unchecked")
+ protected int compareNames(InteractionEventSummary summary1, InteractionEventSummary summary2) {
+ return getComparator().compare(summary1.getName(), summary2.getName());
+ }
+
+ /**
+ * Returns a number reflecting the collation order of the given summaries based on their types.
+ *
+ * @param summary1
+ * the first task element to be ordered
+ * @param summary2
+ * the second task element to be ordered
+ * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
+ * first element is equal to the second element; and a positive number if the first element is greater than
+ * the second element
+ */
+ @SuppressWarnings("unchecked")
+ protected int compareTypes(InteractionEventSummary summary1, InteractionEventSummary summary2) {
+ return getComparator().compare(summary1.getType(), summary2.getType());
+ }
+
+ /**
+ * Returns the sort criteria of this this sorter.
+ *
+ * @return the sort criterion
+ */
+ public int getCriteria() {
+ return criteria;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorFileRolloverJob.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorFileRolloverJob.java
new file mode 100644
index 0000000..ccbd72c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorFileRolloverJob.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.usage.editors.UsageStatsEditorInput;
+import org.eclipse.mylyn.internal.monitor.usage.editors.UsageSummaryReportEditorPart;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Job that performs the rollover of the monitor interaction history log file (modelled after
+ * org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportJob). Overwrites destination if exists!
+ *
+ * @author Meghan Allen
+ *
+ */
+public class MonitorFileRolloverJob extends Job implements IJobChangeListener {
+
+ private static final String JOB_LABEL = "Mylyn Monitor Log Rollover";
+
+ // XXX: needs to be the same as NAME_DATA_DIR in org.eclipse.mylyn.tasks.ui.TasksUIPlugin
+ private static final String NAME_DATA_DIR = ".mylyn";
+
+ private static final String DIRECTORY_MONITOR_BACKUP = "monitor";
+
+ private static final String ZIP_EXTENSION = ".zip";
+
+ private List<IUsageCollector> collectors = null;
+
+ private ReportGenerator generator = null;
+
+ private IEditorInput input = null;
+
+ private boolean forceSyncForTesting = false;
+
+ public static final String BACKUP_FILE_SUFFIX = "monitor-log";
+
+ public MonitorFileRolloverJob(List<IUsageCollector> collectors) {
+ super(JOB_LABEL);
+ this.collectors = collectors;
+ }
+
+ @SuppressWarnings("deprecation")
+ private String getYear(InteractionEvent event) {
+ return "" + (event.getDate().getYear() + 1900);
+ }
+
+ public void forceSyncForTesting(boolean forceSync) {
+ this.forceSyncForTesting = forceSync;
+ }
+
+ private String getMonth(int month) {
+ switch (month) {
+ case 0:
+ return "01";
+ case 1:
+ return "02";
+ case 2:
+ return "03";
+ case 3:
+ return "04";
+ case 4:
+ return "05";
+ case 5:
+ return "06";
+ case 6:
+ return "07";
+ case 7:
+ return "08";
+ case 8:
+ return "09";
+ case 9:
+ return "10";
+ case 10:
+ return "11";
+ case 11:
+ return "12";
+ default:
+ return "";
+
+ }
+ }
+
+ public static String getZippedMonitorFileDirPath() {
+ return ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + File.separatorChar + NAME_DATA_DIR
+ + File.separatorChar + DIRECTORY_MONITOR_BACKUP;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public IStatus run(final IProgressMonitor progressMonitor) {
+
+ progressMonitor.beginTask(JOB_LABEL, IProgressMonitor.UNKNOWN);
+
+ final File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+ InteractionEventLogger logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
+
+ logger.stopMonitoring();
+
+ List<InteractionEvent> events = logger.getHistoryFromFile(monitorFile);
+ progressMonitor.worked(1);
+
+ int nowMonth = Calendar.getInstance().get(Calendar.MONTH);
+ if (events.size() > 0 && events.get(0).getDate().getMonth() != nowMonth) {
+ int currMonth = events.get(0).getDate().getMonth();
+
+ String fileName = getYear(events.get(0)) + "-" + getMonth(currMonth) + "-" + BACKUP_FILE_SUFFIX;
+
+ File dir = new File(getZippedMonitorFileDirPath());
+
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ try {
+ File currBackupZipFile = new File(dir, fileName + ZIP_EXTENSION);
+ if (!currBackupZipFile.exists()) {
+ currBackupZipFile.createNewFile();
+ }
+ ZipOutputStream zipFileStream;
+
+ zipFileStream = new ZipOutputStream(new FileOutputStream(currBackupZipFile));
+ zipFileStream.putNextEntry(new ZipEntry(UiUsageMonitorPlugin.getDefault().getMonitorLogFile().getName()));
+
+ for (InteractionEvent event : events) {
+ int monthOfCurrEvent = event.getDate().getMonth();
+ if (monthOfCurrEvent == currMonth) {
+ // put in curr zip
+ String xml = logger.writeLegacyEvent(event);
+
+ zipFileStream.write(xml.getBytes());
+
+ } else if (monthOfCurrEvent != nowMonth) {
+ // we are finished backing up currMonth, but now need to
+ // start backing up monthOfCurrEvent
+ progressMonitor.worked(1);
+ zipFileStream.closeEntry();
+ zipFileStream.close();
+
+ fileName = getYear(event) + "-" + getMonth(monthOfCurrEvent) + "-" + BACKUP_FILE_SUFFIX;
+ currBackupZipFile = new File(dir, fileName + ZIP_EXTENSION);
+ if (!currBackupZipFile.exists()) {
+
+ currBackupZipFile.createNewFile();
+
+ }
+ zipFileStream = new ZipOutputStream(new FileOutputStream(currBackupZipFile));
+ zipFileStream.putNextEntry(new ZipEntry(UiUsageMonitorPlugin.getDefault()
+ .getMonitorLogFile()
+ .getName()));
+ currMonth = monthOfCurrEvent;
+ String xml = logger.writeLegacyEvent(event);
+ zipFileStream.write(xml.getBytes());
+ } else if (monthOfCurrEvent == nowMonth) {
+ // if these events are from the current event, just put
+ // them back in the current log (first clear the log,
+ // since we are putting them all back)
+
+ logger.clearInteractionHistory(false);
+ logger.interactionObserved(event);
+ }
+ }
+ zipFileStream.closeEntry();
+ zipFileStream.close();
+ } catch (IOException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Mylyn monitor log rollover failed", e));
+ }
+
+ }
+ progressMonitor.worked(1);
+ logger.startMonitoring();
+
+ generator = new ReportGenerator(UiUsageMonitorPlugin.getDefault().getInteractionLogger(), collectors, this,
+ forceSyncForTesting);
+
+ progressMonitor.worked(1);
+ final List<File> files = new ArrayList<File>();
+
+ files.add(monitorFile);
+ input = new UsageStatsEditorInput(files, generator);
+
+ progressMonitor.done();
+
+ if (forceSyncForTesting) {
+ try {
+ final IEditorInput input = this.input;
+
+ IWorkbenchPage page = UiUsageMonitorPlugin.getDefault()
+ .getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage();
+ if (page == null) {
+ return new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, IStatus.OK, "Mylyn Usage Summary",
+ null);
+ }
+ if (input != null) {
+ page.openEditor(input, UsageSummaryReportEditorPart.ID);
+ }
+
+ } catch (PartInitException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not show usage summary", e));
+ }
+
+ }
+
+ return Status.OK_STATUS;
+ }
+
+ public void aboutToRun(IJobChangeEvent event) {
+ // ignore
+
+ }
+
+ public void awake(IJobChangeEvent event) {
+ // ignore
+
+ }
+
+ public void done(IJobChangeEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ final IWorkbenchPage page = UiUsageMonitorPlugin.getDefault()
+ .getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage();
+ if (page == null) {
+ return;
+ }
+
+ if (input != null) {
+ page.openEditor(input, UsageSummaryReportEditorPart.ID);
+ }
+
+ } catch (PartInitException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not show usage summary", e));
+ }
+ }
+ });
+
+ }
+
+ public void running(IJobChangeEvent event) {
+ // ignore
+
+ }
+
+ public void scheduled(IJobChangeEvent event) {
+ // ignore
+
+ }
+
+ public void sleeping(IJobChangeEvent event) {
+ // ignore
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorPreferenceConstants.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorPreferenceConstants.java
new file mode 100644
index 0000000..4c59b3a
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorPreferenceConstants.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+/**
+ * @author Mik Kersten
+ */
+public class MonitorPreferenceConstants {
+
+ public static final String PREF_PREVIOUS_TRANSMIT_DATE = "org.eclipse.mylyn.monitor.ui.upload.previousTransmit";
+
+ public static final String PREF_NUM_USER_EVENTS = "org.eclipse.mylyn.monitor.ui.events.observed";
+
+ public static final String PREF_MONITORING_ENABLED = "org.eclipse.mylyn.monitor.ui.enabled";
+
+ public static final String PREF_MONITORING_OBFUSCATE = "org.eclipse.mylyn.monitor.ui.obfuscate";
+
+ public static final String PREF_MONITORING_ENABLE_SUBMISSION = "org.eclipse.mylyn.monitor.enable.submission";
+
+ public static final String PREF_MONITORING_SUBMIT_FREQUENCY = "org.eclipse.mylyn.monitor.submission.frequency";
+
+ public static final String PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED = "org.eclipse.mylyn.monitor.mylyn.eclipse.org.consent.viewed";
+
+ public static final String PREF_MONITORING_STARTED = "org.eclipse.mylyn.monitor.monitoring.started";
+
+ public static final String PREF_MONITORING_INITIALLY_ENABLED = "org.eclipse.mylyn.monitor.initially.enabled";
+
+ public static final String PREF_MONITORING_ENABLE_SUBMISSION_INITITALLY_ENABLED = "org.eclipse.mylyn.monitor.submission.initially.enabled";
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/ReportGenerator.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/ReportGenerator.java
new file mode 100644
index 0000000..41633ca
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/ReportGenerator.java
@@ -0,0 +1,382 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageScanner;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventComparator;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventUtil;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Used for generating reports of user activity.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class ReportGenerator {
+
+ public static final String SUMMARY_SEPARATOR = "<hr><br>";
+
+ private final InteractionEventLogger logger;
+
+ private UsageStatisticsSummary lastParsedSummary = null;
+
+ private final Set<Integer> userIds = new HashSet<Integer>();
+
+ private final List<IUsageCollector> collectors;
+
+ private List<IUsageScanner> scanners;
+
+ private Map<Integer, Map<String, SortedSet<InteractionEvent>>> allUserEvents;
+
+ private boolean saveAllUserEvents = false;
+
+ private IJobChangeListener listener = null;
+
+ private boolean forceSyncForTesting = false;
+
+ public ReportGenerator(InteractionEventLogger logger, IUsageCollector collector, boolean saveAllUserEvents) {
+ this(logger, collector);
+ this.saveAllUserEvents = saveAllUserEvents;
+ }
+
+ public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors, boolean saveAllUserEvents) {
+ this(logger, collectors);
+ this.saveAllUserEvents = saveAllUserEvents;
+ }
+
+ public ReportGenerator(InteractionEventLogger logger, IUsageCollector collector) {
+ List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
+ collectors.add(collector);
+ this.logger = logger;
+ this.collectors = collectors;
+ }
+
+ public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors) {
+ this.logger = logger;
+ this.collectors = collectors;
+ }
+
+ public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors,
+ List<IUsageScanner> scanners, IJobChangeListener listener) {
+ this(logger, collectors);
+ this.scanners = scanners;
+ }
+
+ public ReportGenerator(InteractionEventLogger logger, IUsageCollector collector, IJobChangeListener listener) {
+ this(logger, collector);
+ this.listener = listener;
+ }
+
+ public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors,
+ IJobChangeListener listener, boolean forceSyncForTesting) {
+ this(logger, collectors);
+ this.listener = listener;
+ this.forceSyncForTesting = forceSyncForTesting;
+ }
+
+ public void setScanners(List<IUsageScanner> scanners) {
+ this.scanners = scanners;
+ }
+
+ public void getStatisticsFromInteractionHistory(File source, IJobChangeListener listener) {
+ List<File> sources = new ArrayList<File>();
+ sources.add(source);
+ getStatisticsFromInteractionHistories(sources, listener);
+ }
+
+ public void getStatisticsFromInteractionHistories(List<File> sources, IJobChangeListener jobChangeListener) {
+
+ GenerateStatisticsJob job = new GenerateStatisticsJob(this, sources);
+ if (jobChangeListener != null) {
+ job.addJobChangeListener(jobChangeListener);
+ }
+ if (this.listener != null) {
+ job.addJobChangeListener(this.listener);
+ }
+ job.setPriority(Job.LONG);
+ if (forceSyncForTesting) {
+ job.run(new NullProgressMonitor());
+ } else {
+ job.schedule();
+ }
+
+ }
+
+ public UsageStatisticsSummary getLastParsedSummary() {
+ return lastParsedSummary;
+ }
+
+ /**
+ * Assuming the file naming convention of <phase>-<version>-usage-<userID>-<date and time>.zip
+ */
+ private int getUserId(File source) {
+ String userIDText = source.getName();
+ int userId = -1;
+ String prefix = "-usage-";
+
+ if (source.getName().indexOf(prefix) >= 0) {
+ try {
+ userIDText = userIDText.substring(userIDText.indexOf(prefix) + prefix.length(), userIDText.length());
+ userIDText = userIDText.substring(0, userIDText.indexOf("-"));
+ userId = Integer.valueOf(userIDText);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not parse user ID from source file", t));
+ }
+ }
+
+ return userId;
+ }
+
+ private String getPhase(File source) {
+ String userIDText = source.getName();
+ String phase = "unknown";
+ String terminator = "-";
+
+ if (source.getName().indexOf(terminator) >= 0) {
+ try {
+ phase = userIDText.substring(0, userIDText.indexOf(terminator) - 1);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not parse user ID from source file", t));
+ }
+ }
+ return phase;
+ }
+
+ class GenerateStatisticsJob extends Job {
+
+ private static final String JOB_LABEL = "Mylyn Usage Summary Generation";
+
+ private final ReportGenerator generator;
+
+ private final List<File> sources;
+
+ public GenerateStatisticsJob(ReportGenerator generator, List<File> sources) {
+ super("Generate statistics job");
+ this.generator = generator;
+ this.sources = sources;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+
+ if (saveAllUserEvents) {
+ allUserEvents = new HashMap<Integer, Map<String, SortedSet<InteractionEvent>>>();
+ }
+
+ UsageStatisticsSummary statistics = new UsageStatisticsSummary();
+ Map<Integer, Map<String, InteractionEventSummary>> summaryMap = new HashMap<Integer, Map<String, InteractionEventSummary>>();
+
+ Map<Integer, List<File>> filesPerUser = new HashMap<Integer, List<File>>();
+ try {
+
+ // Go through the files to determine which users we have to
+ // process (by user id)
+ for (File source : sources) {
+ int userId = getUserId(source);
+ userIds.add(userId);
+ List<File> filesForUser = null;
+ if (filesPerUser.containsKey(userId)) {
+ filesForUser = filesPerUser.get(userId);
+ }
+ if (filesForUser == null) {
+ filesForUser = new ArrayList<File>();
+ }
+ filesForUser.add(source);
+ filesPerUser.put(userId, filesForUser);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not generate usage report", t));
+ }
+
+ try {
+ // There are three processing events per user
+ monitor.beginTask(JOB_LABEL, userIds.size() * 3);
+
+ // Process the files for each user
+ for (Integer aUser : filesPerUser.keySet()) {
+ Map<String, SortedSet<InteractionEvent>> userEvents = new HashMap<String, SortedSet<InteractionEvent>>();
+
+ for (File aFile : filesPerUser.get(aUser)) {
+ String phase = getPhase(aFile);
+
+ // orderedEvents must be a set because the
+ // monitor-log.xml file contains some duplicate
+ // events and we want to be sure that we ignore the
+ // duplicates in the reporting. Sets
+ // cannot contain duplicates, so orderedEvents will only
+ // accept the unique events.
+ SortedSet<InteractionEvent> orderedEvents;
+ if (userEvents.get(phase) == null) {
+ orderedEvents = new TreeSet<InteractionEvent>(new InteractionEventComparator());
+ orderedEvents.addAll(this.generator.logger.getHistoryFromFile(aFile));
+ } else {
+ orderedEvents = userEvents.get(phase);
+ orderedEvents.addAll(this.generator.logger.getHistoryFromFile(aFile));
+ }
+ userEvents.put(phase, orderedEvents);
+ }
+ monitor.worked(1);
+
+ // If there are scanners registered, give each event to each
+ // scanner in turn
+ if (this.generator.scanners != null && this.generator.scanners.size() > 0) {
+
+ for (Map.Entry<String, SortedSet<InteractionEvent>> eventsPerPhase : userEvents.entrySet()) {
+ // String phaseToProcess = eventsPerPhase.getKey();
+ SortedSet<InteractionEvent> events = eventsPerPhase.getValue();
+
+ for (InteractionEvent event : events) {
+ for (IUsageScanner scanner : this.generator.scanners) {
+ scanner.scanEvent(event, aUser);
+ }
+ }
+ }
+ }
+ monitor.worked(1);
+
+ if (allUserEvents != null) {
+ allUserEvents.put(aUser, userEvents);
+ }
+
+ // Consume all events
+ for (Map.Entry<String, SortedSet<InteractionEvent>> eventsPerPhase : userEvents.entrySet()) {
+ // String phaseToProcess = eventsPerPhase.getKey();
+ SortedSet<InteractionEvent> events = eventsPerPhase.getValue();
+
+ for (InteractionEvent event : events) {
+
+ if (event.getKind().isUserEvent()) { // TODO:
+ // some
+ // collectors
+ // may want
+ // non-user
+ // events
+ for (IUsageCollector collector : this.generator.collectors) {
+ collector.consumeEvent(event, aUser);
+ }
+ }
+ createUsageTableData(summaryMap, event, aUser);
+ }
+ }
+ monitor.worked(1);
+ }
+
+ for (IUsageCollector collector : this.generator.collectors) {
+ statistics.add(collector);
+ }
+
+ // Flatten the summaries for the command usage table
+ List<InteractionEventSummary> flattenedSummaries = new ArrayList<InteractionEventSummary>();
+ Map<String, InteractionEventSummary> combinedUserSummary = new HashMap<String, InteractionEventSummary>();
+
+ // Go through the summary for each user and combine the
+ // information into a table sorted by the command
+ for (Map<String, InteractionEventSummary> userSummary : summaryMap.values()) {
+ for (InteractionEventSummary aSummary : userSummary.values()) {
+ if (!combinedUserSummary.containsKey(aSummary.getName())) {
+ combinedUserSummary.put(aSummary.getName(), new InteractionEventSummary(aSummary));
+ } else {
+ // Could be simplified; but written this way for
+ // clarity
+ InteractionEventSummary combinedSummary = combinedUserSummary.get(aSummary.getName());
+ combinedSummary.combine(aSummary);
+ combinedUserSummary.put(aSummary.getName(), combinedSummary);
+ }
+ }
+
+ }
+
+ flattenedSummaries.addAll(combinedUserSummary.values());
+
+ statistics.setSingleSummaries(flattenedSummaries);
+ this.generator.lastParsedSummary = statistics;
+ monitor.done();
+
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not generate usage report", t));
+ }
+
+ return Status.OK_STATUS;
+ }
+
+ private void createUsageTableData(Map<Integer, Map<String, InteractionEventSummary>> summaryMap,
+ InteractionEvent event, int userId) {
+ Map<String, InteractionEventSummary> usersSummary = summaryMap.get(userId);
+ if (usersSummary == null) {
+ usersSummary = new HashMap<String, InteractionEventSummary>();
+ summaryMap.put(userId, usersSummary);
+ }
+
+ InteractionEventSummary summary = usersSummary.get(getIdentifier(event));
+ if (summary == null) {
+ summary = new InteractionEventSummary(event.getKind().toString(),
+ InteractionEventUtil.getCleanOriginId(event), 0);
+ usersSummary.put(getIdentifier(event), summary);
+ }
+ summary.setUsageCount(summary.getUsageCount() + 1);
+ summary.setInterestContribution(summary.getInterestContribution() + event.getInterestContribution());
+ summary.setDelta(event.getDelta());
+ summary.addUserId(userId);
+ }
+
+ public String getIdentifier(InteractionEvent event) {
+ return event.getKind().toString() + ':' + InteractionEventUtil.getCleanOriginId(event);
+ }
+
+ }
+
+ public static String formatPercentage(float percentage) {
+ String percentageString = "" + percentage;
+ int indexOf2ndDecimal = percentageString.indexOf('.') + 3;
+ if (indexOf2ndDecimal <= percentageString.length()) {
+ percentageString = percentageString.substring(0, indexOf2ndDecimal);
+ }
+ return percentageString;
+ }
+
+ public List<IUsageCollector> getCollectors() {
+ return collectors;
+ }
+
+ public Map<Integer, Map<String, SortedSet<InteractionEvent>>> getAllUsers() {
+ return allUserEvents;
+ }
+
+ public void forceSyncForTesting(boolean syncForTesting) {
+ this.forceSyncForTesting = syncForTesting;
+
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/StudyParameters.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/StudyParameters.java
new file mode 100644
index 0000000..89c8a43
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/StudyParameters.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage;
+
+import org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage;
+import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ */
+public class StudyParameters {
+
+ private String title = UiUsageMonitorPlugin.DEFAULT_TITLE;
+
+ private String description = UiUsageMonitorPlugin.DEFAULT_DESCRIPTION;
+
+ private AbstractStudyQuestionnairePage questionnairePage = null;
+
+ private AbstractStudyBackgroundPage backgroundPage = null;
+
+ private long transmitPromptPeriod = UiUsageMonitorPlugin.DEFAULT_DELAY_BETWEEN_TRANSMITS;
+
+ private String acceptedUrlList = UiUsageMonitorPlugin.DEFAULT_ACCEPTED_URL_LIST;
+
+ private String useContactField = UiUsageMonitorPlugin.DEFAULT_CONTACT_CONSENT_FIELD;
+
+ private String formsConsent = UiUsageMonitorPlugin.DEFAULT_ETHICS_FORM;
+
+ private String version = UiUsageMonitorPlugin.DEFAULT_VERSION;
+
+ private String servletUrl = UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVER;
+
+ public String getServletUrl() {
+ return servletUrl;
+ }
+
+ public void setServletUrl(String servletServerUrl) {
+ if (servletUrl != null) {
+ this.servletUrl = servletServerUrl;
+ }
+ }
+
+ public String getFormsConsent() {
+ return formsConsent;
+ }
+
+ public void setFormsConsent(String formsConsent) {
+ if (formsConsent != null) {
+ this.formsConsent = formsConsent;
+ }
+ }
+
+ public long getTransmitPromptPeriod() {
+ return transmitPromptPeriod;
+ }
+
+ public void setTransmitPromptPeriod(long transmitPromptPeriod) {
+ this.transmitPromptPeriod = transmitPromptPeriod;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ if (description != null) {
+ this.description = description;
+ }
+ }
+
+ public AbstractStudyQuestionnairePage getQuestionnairePage() {
+ return questionnairePage;
+ }
+
+ public void setQuestionnairePage(AbstractStudyQuestionnairePage questionnairePage) {
+ if (questionnairePage != null) {
+ this.questionnairePage = questionnairePage;
+ }
+ }
+
+ public AbstractStudyBackgroundPage getBackgroundPage() {
+ return backgroundPage;
+ }
+
+ public void setBackgroundPage(AbstractStudyBackgroundPage backgroundPage) {
+ if (backgroundPage != null) {
+ this.backgroundPage = backgroundPage;
+ }
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ if (title != null) {
+ this.title = title;
+ }
+ }
+
+ public String getAcceptedUrlList() {
+ return this.acceptedUrlList;
+ }
+
+ public void setAcceptedUrlList(String acceptedUrlList) {
+ if (acceptedUrlList != null) {
+ this.acceptedUrlList = acceptedUrlList;
+ }
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ if (version != null) {
+ this.version = version;
+ }
+ }
+
+ public String getUseContactField() {
+ return useContactField;
+ }
+
+ public void setUseContactField(String useContactField) {
+ if (useContactField != null) {
+ this.useContactField = useContactField;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UiUsageMonitorPlugin.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UiUsageMonitorPlugin.java
new file mode 100644
index 0000000..f49a7fd
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UiUsageMonitorPlugin.java
@@ -0,0 +1,813 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.monitor.ui.ActionExecutionMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.ActivityChangeMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.KeybindingCommandMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.MenuCommandMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.internal.monitor.ui.PerspectiveChangeMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.PreferenceChangeMonitor;
+import org.eclipse.mylyn.internal.monitor.ui.WindowChangeMonitor;
+import org.eclipse.mylyn.internal.monitor.usage.wizards.NewUsageSummaryEditorWizard;
+import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
+import org.eclipse.mylyn.monitor.ui.AbstractCommandMonitor;
+import org.eclipse.mylyn.monitor.ui.IActionExecutionListener;
+import org.eclipse.mylyn.monitor.ui.IMonitorLifecycleListener;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage;
+import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.events.ShellListener;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.update.internal.ui.security.Authentication;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class UiUsageMonitorPlugin extends AbstractUIPlugin {
+
+ public static final String PREF_USER_ID = "org.eclipse.mylyn.user.id";
+
+ public static String VERSION = "1.0";
+
+ public static String UPLOAD_FILE_LABEL = "USAGE";
+
+ private static final long HOUR = 3600 * 1000;
+
+ private static final long DAY = HOUR * 24;
+
+ private static final long DELAY_ON_USER_REQUEST = 5 * DAY;
+
+ public static final String DEFAULT_TITLE = "Mylyn Feedback";
+
+ public static final String DEFAULT_DESCRIPTION = "Fill out the following form to help us improve Mylyn based on your input.\n";
+
+ public static final long DEFAULT_DELAY_BETWEEN_TRANSMITS = 21 * 24 * HOUR;
+
+ public static final String DEFAULT_ETHICS_FORM = "doc/study-ethics.html";
+
+ public static final String DEFAULT_VERSION = "";
+
+ public static final String DEFAULT_UPLOAD_SERVER = "http://mylyn.eclipse.org/monitor/upload";
+
+ public static final String DEFAULT_UPLOAD_SERVLET_ID = "/GetUserIDServlet";
+
+ public static final String DEFAULT_UPLOAD_SERVLET = "/MylarUsageUploadServlet";
+
+ public static final String DEFAULT_ACCEPTED_URL_LIST = "";
+
+ public static final String DEFAULT_CONTACT_CONSENT_FIELD = "false";
+
+ public static final String ID_UI_PLUGIN = "org.eclipse.mylyn.ui";
+
+ public static final String MONITOR_LOG_NAME = "monitor-log";
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.monitor.usage";
+
+ private InteractionEventLogger interactionLogger;
+
+ private String customizingPlugin = null;
+
+ private PreferenceChangeMonitor preferenceMonitor;
+
+ private PerspectiveChangeMonitor perspectiveMonitor;
+
+ private ActivityChangeMonitor activityMonitor;
+
+ private MenuCommandMonitor menuMonitor;
+
+ private WindowChangeMonitor windowMonitor;
+
+ private KeybindingCommandMonitor keybindingCommandMonitor;
+
+ private static UiUsageMonitorPlugin plugin;
+
+ private final List<IActionExecutionListener> actionExecutionListeners = new ArrayList<IActionExecutionListener>();
+
+ private final List<AbstractCommandMonitor> commandMonitors = new ArrayList<AbstractCommandMonitor>();
+
+ private ResourceBundle resourceBundle;
+
+ private static Date lastTransmit = null;
+
+ private final Authentication uploadAuthentication = null;
+
+ private static boolean performingUpload = false;
+
+ private boolean questionnaireEnabled = true;
+
+ private boolean backgroundEnabled = false;
+
+ private final StudyParameters studyParameters = new StudyParameters();
+
+ private final ListenerList lifecycleListeners = new ListenerList();
+
+ public static class UiUsageMonitorStartup implements IStartup {
+
+ public void earlyStartup() {
+ // everything happens on normal start
+ }
+ }
+
+ private final IWindowListener WINDOW_LISTENER = new IWindowListener() {
+ public void windowActivated(IWorkbenchWindow window) {
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ if (window.getShell() != null) {
+ window.getShell().removeShellListener(SHELL_LISTENER);
+ }
+ }
+
+ public void windowOpened(IWorkbenchWindow window) {
+ if (window.getShell() != null && !PlatformUI.getWorkbench().isClosing()) {
+ window.getShell().addShellListener(SHELL_LISTENER);
+ }
+ }
+ };
+
+ private final ShellListener SHELL_LISTENER = new ShellListener() {
+
+ public void shellDeactivated(ShellEvent arg0) {
+ if (!isPerformingUpload() && ContextCorePlugin.getDefault() != null) {
+ for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
+ listener.stopMonitoring();
+ }
+ }
+ }
+
+ public void shellActivated(ShellEvent arg0) {
+// if (!MonitorUiPlugin.getDefault().suppressConfigurationWizards() && ContextCorePlugin.getDefault() != null) {
+// checkForStatisticsUpload();
+// }
+ if (!isPerformingUpload() && ContextCorePlugin.getDefault() != null) {
+ for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
+ listener.startMonitoring();
+ }
+ }
+ }
+
+ public void shellDeiconified(ShellEvent arg0) {
+ }
+
+ public void shellIconified(ShellEvent arg0) {
+ }
+
+ public void shellClosed(ShellEvent arg0) {
+ }
+ };
+
+ private LogMoveUtility logMoveUtility;
+
+ /**
+ * NOTE: this needs to be a separate class in order to avoid loading ..mylyn.context.core on eager startup
+ */
+ private class LogMoveUtility {
+
+// private final IContextStoreListener DATA_DIR_MOVE_LISTENER = new IContextStoreListener() {
+//
+// public void contextStoreMoved(File file) {
+// if (!isPerformingUpload()) {
+// for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
+// listener.stopMonitoring();
+// }
+// interactionLogger.moveOutputFile(getMonitorLogFile().getAbsolutePath());
+// for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
+// listener.startMonitoring();
+// }
+// }
+// }
+// };
+
+ void start() {
+// ContextCore.getContextStore().addListener(DATA_DIR_MOVE_LISTENER);
+ }
+
+ void stop() {
+// ContextCore.getContextStore().removeListener(DATA_DIR_MOVE_LISTENER);
+ }
+ }
+
+ public UiUsageMonitorPlugin() {
+ plugin = this;
+
+ }
+
+ private void initDefaultPrefs() {
+ getPreferenceStore().setDefault(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE, true);
+
+ if (!getPreferenceStore().contains(MonitorPreferenceConstants.PREF_MONITORING_INITIALLY_ENABLED)) {
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_INITIALLY_ENABLED, true);
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLED, true);
+ }
+
+ if (!getPreferenceStore().contains(
+ MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION_INITITALLY_ENABLED)) {
+ getPreferenceStore().setValue(
+ MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION_INITITALLY_ENABLED, true);
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION, true);
+
+ }
+
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_STARTED, false);
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ initDefaultPrefs();
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ // ------- moved from synch start
+ new MonitorUsageExtensionPointReader().initExtensions();
+
+ if (preferenceMonitor == null) {
+ preferenceMonitor = new PreferenceChangeMonitor();
+ }
+
+ interactionLogger = new InteractionEventLogger(getMonitorLogFile());
+ perspectiveMonitor = new PerspectiveChangeMonitor();
+ activityMonitor = new ActivityChangeMonitor();
+ windowMonitor = new WindowChangeMonitor();
+ menuMonitor = new MenuCommandMonitor();
+ keybindingCommandMonitor = new KeybindingCommandMonitor();
+
+ // browserMonitor = new BrowserMonitor();
+ // setAcceptedUrlMatchList(studyParameters.getAcceptedUrlList());
+
+ studyParameters.setServletUrl(DEFAULT_UPLOAD_SERVER + DEFAULT_UPLOAD_SERVLET);
+ // ------- moved from synch start
+
+ if (getPreferenceStore().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_ENABLED)) {
+ startMonitoring();
+ }
+
+ if (plugin.getPreferenceStore().contains(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE)) {
+ lastTransmit = new Date(plugin.getPreferenceStore().getLong(
+ MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE));
+ } else {
+ lastTransmit = new Date();
+ plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
+ lastTransmit.getTime());
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Monitor failed to start", t));
+ }
+ }
+ });
+ }
+
+ public void startMonitoring() {
+ if (getPreferenceStore().contains(MonitorPreferenceConstants.PREF_MONITORING_STARTED)) {
+ return;
+ }
+ interactionLogger.startMonitoring();
+ for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
+ listener.startMonitoring();
+ }
+
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ MonitorUi.addInteractionListener(interactionLogger);
+ getCommandMonitors().add(keybindingCommandMonitor);
+
+ getActionExecutionListeners().add(new ActionExecutionMonitor());
+ workbench.addWindowListener(WINDOW_LISTENER);
+ for (IWorkbenchWindow w : MonitorUiPlugin.getDefault().getMonitoredWindows()) {
+ if (w.getShell() != null) {
+ w.getShell().addShellListener(SHELL_LISTENER);
+ }
+ }
+
+ if (logMoveUtility == null) {
+ logMoveUtility = new LogMoveUtility();
+ }
+ logMoveUtility.start();
+
+ MonitorUiPlugin.getDefault().addWindowPerspectiveListener(perspectiveMonitor);
+ workbench.getActivitySupport().getActivityManager().addActivityManagerListener(activityMonitor);
+ workbench.getDisplay().addFilter(SWT.Selection, menuMonitor);
+ workbench.addWindowListener(windowMonitor);
+
+ // installBrowserMonitor(workbench);
+
+ for (Object listener : lifecycleListeners.getListeners()) {
+ ((IMonitorLifecycleListener) listener).startMonitoring();
+ }
+
+ if (!MonitorUiPlugin.getDefault().suppressConfigurationWizards()) {
+ checkForFirstMonitorUse();
+ }
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_STARTED, true);
+ }
+
+ public void addMonitoredPreferences(Preferences preferences) {
+ if (preferenceMonitor == null) {
+ preferenceMonitor = new PreferenceChangeMonitor();
+ }
+ preferences.addPropertyChangeListener(preferenceMonitor);
+ }
+
+ public void removeMonitoredPreferences(Preferences preferences) {
+ if (preferenceMonitor != null) {
+ preferences.removePropertyChangeListener(preferenceMonitor);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.ID_PLUGIN,
+ "UI Usage Monitor not started", new Exception()));
+ }
+ }
+
+ public boolean isObfuscationEnabled() {
+ return UiUsageMonitorPlugin.getPrefs().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE);
+ }
+
+ public void stopMonitoring() {
+ if (!getPreferenceStore().contains(MonitorPreferenceConstants.PREF_MONITORING_STARTED)) {
+ return;
+ }
+
+ for (Object listener : lifecycleListeners.getListeners()) {
+ ((IMonitorLifecycleListener) listener).stopMonitoring();
+ }
+
+ for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
+ listener.stopMonitoring();
+ }
+
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ MonitorUi.removeInteractionListener(interactionLogger);
+
+ getCommandMonitors().remove(keybindingCommandMonitor);
+ getActionExecutionListeners().remove(new ActionExecutionMonitor());
+
+ workbench.removeWindowListener(WINDOW_LISTENER);
+ for (IWorkbenchWindow w : MonitorUiPlugin.getDefault().getMonitoredWindows()) {
+ if (w.getShell() != null) {
+ w.getShell().removeShellListener(SHELL_LISTENER);
+ }
+ }
+ logMoveUtility.stop();
+ // ContextCore.getPluginPreferences().removePropertyChangeListener(DATA_DIR_MOVE_LISTENER);
+
+ MonitorUiPlugin.getDefault().removeWindowPerspectiveListener(perspectiveMonitor);
+ workbench.getActivitySupport().getActivityManager().removeActivityManagerListener(activityMonitor);
+ workbench.getDisplay().removeFilter(SWT.Selection, menuMonitor);
+ workbench.removeWindowListener(windowMonitor);
+
+ // uninstallBrowserMonitor(workbench);
+ interactionLogger.stopMonitoring();
+
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_STARTED, false);
+ }
+
+ public void addMonitoringLifecycleListener(IMonitorLifecycleListener listener) {
+ lifecycleListeners.add(listener);
+ if (isMonitoringEnabled()) {
+ listener.startMonitoring();
+ }
+ }
+
+ public void removeMonitoringLifecycleListener(IMonitorLifecycleListener listener) {
+ lifecycleListeners.remove(listener);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ resourceBundle = null;
+ }
+
+ public void actionObserved(IAction action, String info) {
+ for (IActionExecutionListener listener : actionExecutionListeners) {
+ listener.actionObserved(action);
+ }
+ }
+
+ public List<IActionExecutionListener> getActionExecutionListeners() {
+ return actionExecutionListeners;
+ }
+
+ public List<AbstractCommandMonitor> getCommandMonitors() {
+ return commandMonitors;
+ }
+
+ /**
+ * Parallels TasksUiPlugin.getDefaultDataDirectory()
+ */
+ public File getMonitorLogFile() {
+ File rootDir = new File(ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + "/.metadata/.mylyn");
+ File file = new File(rootDir, MONITOR_LOG_NAME + InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD);
+ if (!file.exists() || !file.canWrite()) {
+ try {
+ file.createNewFile();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not create monitor file", e));
+ }
+ }
+ return file;
+ }
+
+ private long getUserPromptDelay() {
+ return DELAY_ON_USER_REQUEST / DAY;
+ }
+
+ public void userCancelSubmitFeedback(Date currentTime, boolean wait3Hours) {
+ if (wait3Hours) {
+ lastTransmit.setTime(currentTime.getTime() + DELAY_ON_USER_REQUEST
+ - studyParameters.getTransmitPromptPeriod());
+ plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
+ lastTransmit.getTime());
+ } else {
+ long day = HOUR * 24;
+ lastTransmit.setTime(currentTime.getTime() + day - studyParameters.getTransmitPromptPeriod());
+ plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
+ lastTransmit.getTime());
+ }
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static UiUsageMonitorPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle, or 'key' if not found.
+ */
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = UiUsageMonitorPlugin.getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the plugin's resource bundle,
+ */
+ public ResourceBundle getResourceBundle() {
+ try {
+ if (resourceBundle == null) {
+ resourceBundle = ResourceBundle.getBundle("org.eclipse.mylyn.monitor.ui.MonitorPluginResources");
+ }
+ } catch (MissingResourceException x) {
+ resourceBundle = null;
+ }
+ return resourceBundle;
+ }
+
+ // TODO: remove
+ private void checkForFirstMonitorUse() {
+
+ }
+
+ // NOTE: not currently used
+ synchronized void checkForStatisticsUpload() {
+ if (!isMonitoringEnabled()) {
+ return;
+ }
+ if (plugin == null || plugin.getPreferenceStore() == null) {
+ return;
+ }
+
+ if (plugin.getPreferenceStore().contains(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE)) {
+
+ lastTransmit = new Date(plugin.getPreferenceStore().getLong(
+ MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE));
+ } else {
+ lastTransmit = new Date();
+ plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
+ lastTransmit.getTime());
+ }
+ Date currentTime = new Date();
+
+ if (currentTime.getTime() > lastTransmit.getTime() + studyParameters.getTransmitPromptPeriod()
+ && getPreferenceStore().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION)) {
+
+ String ending = getUserPromptDelay() == 1 ? "" : "s";
+ MessageDialog message = new MessageDialog(
+ Display.getDefault().getActiveShell(),
+ "Send Usage Feedback",
+ null,
+ "To help improve the Eclipse and Mylyn user experience please consider uploading your UI usage statistics.",
+ MessageDialog.QUESTION, new String[] { "Open UI Usage Report",
+ "Remind me in " + getUserPromptDelay() + " day" + ending, "Don't ask again" }, 0);
+ int result = 0;
+ if ((result = message.open()) == 0) {
+ // time must be stored right away into preferences, to prevent
+ // other threads
+ lastTransmit.setTime(new Date().getTime());
+ plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
+ currentTime.getTime());
+
+ if (!plugin.getPreferenceStore().contains(
+ MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED)
+ || !plugin.getPreferenceStore().getBoolean(
+ MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED)) {
+ MessageDialog consentMessage = new MessageDialog(
+ Display.getDefault().getActiveShell(),
+ "Consent",
+ null,
+ "All data that is submitted to mylyn.eclipse.org will be publicly available under the "
+ + "Eclipse Public License (EPL). By submitting your data, you are agreeing that it can be publicly "
+ + "available. Please press cancel on the submission dialog box if you do not wish to share your data.",
+ MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0);
+ consentMessage.open();
+ plugin.getPreferenceStore().setValue(
+ MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED, true);
+ }
+
+ NewUsageSummaryEditorWizard wizard = new NewUsageSummaryEditorWizard();
+ wizard.init(PlatformUI.getWorkbench(), null);
+ // Instantiates the wizard container with the wizard and
+ // opens it
+ WizardDialog dialog = new WizardDialog(Display.getDefault().getActiveShell(), wizard);
+ dialog.create();
+ dialog.open();
+ /*
+ * the UI usage report is loaded asynchronously so there's no
+ * synchronous way to know if it failed if (wizard.failed()) {
+ * lastTransmit.setTime(currentTime.getTime() + DELAY_ON_FAILURE -
+ * studyParameters.getTransmitPromptPeriod());
+ * plugin.getPreferenceStore().setValue(MylynMonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
+ * currentTime.getTime()); }
+ */
+
+ } else {
+ if (result == 1) {
+ userCancelSubmitFeedback(currentTime, true);
+ } else {
+ plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION,
+ false);
+ }
+ }
+ message.close();
+ }
+ }
+
+ public void incrementObservedEvents(int increment) {
+ int numEvents = getPreferenceStore().getInt(MonitorPreferenceConstants.PREF_NUM_USER_EVENTS);
+ numEvents += increment;
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_NUM_USER_EVENTS, numEvents);
+ }
+
+ public void configureProxy(HttpClient httpClient, String uploadScript) {
+ WebUtil.configureHttpClient(httpClient, null);
+ HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, new WebLocation(uploadScript,
+ uploadAuthentication.getUser(), uploadAuthentication.getPassword()), null);
+ httpClient.setHostConfiguration(hostConfiguration);
+ }
+
+ public static IPreferenceStore getPrefs() {
+ return getDefault().getPreferenceStore();
+ }
+
+ public static boolean isPerformingUpload() {
+ return performingUpload;
+ }
+
+ public static void setPerformingUpload(boolean performingUpload) {
+ UiUsageMonitorPlugin.performingUpload = performingUpload;
+ }
+
+ public InteractionEventLogger getInteractionLogger() {
+ return interactionLogger;
+ }
+
+ public boolean isQuestionnaireEnabled() {
+ return questionnaireEnabled;
+ }
+
+ public void setQuestionnaireEnabled(boolean questionnaireEnabled) {
+ this.questionnaireEnabled = questionnaireEnabled;
+ }
+
+ class MonitorUsageExtensionPointReader {
+
+ public static final String EXTENSION_ID_STUDY = "org.eclipse.mylyn.monitor.ui.study";
+
+ public static final String ELEMENT_SCRIPTS = "scripts";
+
+ public static final String ELEMENT_SCRIPTS_VERSION = "version";
+
+ public static final String ELEMENT_SCRIPTS_SERVER_URL = "url";
+
+ public static final String ELEMENT_SCRIPTS_UPLOAD_USAGE = "upload";
+
+ public static final String ELEMENT_SCRIPTS_GET_USER_ID = "userId";
+
+ public static final String ELEMENT_SCRIPTS_UPLOAD_QUESTIONNAIRE = "questionnaire";
+
+ public static final String ELEMENT_UI = "ui";
+
+ public static final String ELEMENT_UI_TITLE = "title";
+
+ public static final String ELEMENT_UI_DESCRIPTION = "description";
+
+ public static final String ELEMENT_UI_UPLOAD_PROMPT = "daysBetweenUpload";
+
+ public static final String ELEMENT_UI_QUESTIONNAIRE_PAGE = "questionnairePage";
+
+ public static final String ELEMENT_UI_BACKGROUND_PAGE = "backgroundPage";
+
+ public static final String ELEMENT_UI_CONSENT_FORM = "consentForm";
+
+ public static final String ELEMENT_UI_CONTACT_CONSENT_FIELD = "useContactField";
+
+ public static final String ELEMENT_MONITORS = "monitors";
+
+ public static final String ELEMENT_MONITORS_BROWSER_URL = "browserUrlFilter";
+
+ private boolean extensionsRead = false;
+
+ // private MonitorUsageExtensionPointReader thisReader = new
+ // MonitorUsageExtensionPointReader();
+
+ public void initExtensions() {
+ try {
+ if (!extensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_STUDY);
+ if (extensionPoint != null) {
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().compareTo(ELEMENT_SCRIPTS) == 0) {
+ readScripts(element);
+ } else if (element.getName().compareTo(ELEMENT_UI) == 0) {
+ readForms(element);
+ } else if (element.getName().compareTo(ELEMENT_MONITORS) == 0) {
+ readMonitors(element);
+ }
+ }
+ customizingPlugin = extension.getContributor().getName();
+ }
+ extensionsRead = true;
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not read monitor extension", t));
+ }
+ }
+
+ private void readScripts(IConfigurationElement element) {
+ studyParameters.setVersion(element.getAttribute(ELEMENT_SCRIPTS_VERSION));
+ }
+
+ private void readForms(IConfigurationElement element) throws CoreException {
+ studyParameters.setTitle(element.getAttribute(ELEMENT_UI_TITLE));
+ studyParameters.setDescription(element.getAttribute(ELEMENT_UI_DESCRIPTION));
+ if (element.getAttribute(ELEMENT_UI_UPLOAD_PROMPT) != null) {
+ Integer uploadInt = new Integer(element.getAttribute(ELEMENT_UI_UPLOAD_PROMPT));
+ studyParameters.setTransmitPromptPeriod(HOUR * 24 * uploadInt);
+ }
+ studyParameters.setUseContactField(element.getAttribute(ELEMENT_UI_CONTACT_CONSENT_FIELD));
+
+ try {
+ if (element.getAttribute(ELEMENT_UI_QUESTIONNAIRE_PAGE) != null) {
+ Object questionnaireObject = element.createExecutableExtension(ELEMENT_UI_QUESTIONNAIRE_PAGE);
+ if (questionnaireObject instanceof AbstractStudyQuestionnairePage) {
+ AbstractStudyQuestionnairePage page = (AbstractStudyQuestionnairePage) questionnaireObject;
+ studyParameters.setQuestionnairePage(page);
+ }
+ } else {
+ UiUsageMonitorPlugin.getDefault().setQuestionnaireEnabled(false);
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not load questionaire", e));
+ UiUsageMonitorPlugin.getDefault().setQuestionnaireEnabled(false);
+ }
+
+ try {
+ if (element.getAttribute(ELEMENT_UI_BACKGROUND_PAGE) != null) {
+ Object backgroundObject = element.createExecutableExtension(ELEMENT_UI_BACKGROUND_PAGE);
+ if (backgroundObject instanceof AbstractStudyBackgroundPage) {
+ AbstractStudyBackgroundPage page = (AbstractStudyBackgroundPage) backgroundObject;
+ studyParameters.setBackgroundPage(page);
+ UiUsageMonitorPlugin.getDefault().setBackgroundEnabled(true);
+ }
+ } else {
+ UiUsageMonitorPlugin.getDefault().setBackgroundEnabled(false);
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not load background page", e));
+ UiUsageMonitorPlugin.getDefault().setBackgroundEnabled(false);
+ }
+
+ studyParameters.setFormsConsent("/" + element.getAttribute(ELEMENT_UI_CONSENT_FORM));
+
+ }
+
+ private void readMonitors(IConfigurationElement element) throws CoreException {
+ // TODO: This should parse a list of filters but right now it takes
+ // the
+ // entire string as a single filter.
+ // ArrayList<String> urlList = new ArrayList<String>();
+ String urlList = element.getAttribute(ELEMENT_MONITORS_BROWSER_URL);
+ studyParameters.setAcceptedUrlList(urlList);
+ }
+ }
+
+ public StudyParameters getStudyParameters() {
+ return studyParameters;
+ }
+
+ public String getCustomizingPlugin() {
+ return customizingPlugin;
+ }
+
+ public boolean isMonitoringEnabled() {
+ return getPreferenceStore().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_ENABLED);
+ }
+
+ public String getCustomizedByMessage() {
+ String customizedBy = UiUsageMonitorPlugin.getDefault().getCustomizingPlugin();
+ String message = "NOTE: You have previously downloaded the Mylyn monitor and a user study plug-in with id: "
+ + customizedBy + "\n" + "If you are not familiar with this plug-in do not upload data.";
+ return message;
+ }
+
+ public boolean isBackgroundEnabled() {
+ return backgroundEnabled;
+ }
+
+ public void setBackgroundEnabled(boolean backgroundEnabled) {
+ this.backgroundEnabled = backgroundEnabled;
+ }
+
+ public String getExtensionVersion() {
+ return studyParameters.getVersion();
+ }
+
+ public boolean usingContactField() {
+ if (studyParameters.getUseContactField().equals("true")) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageMonitorImages.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageMonitorImages.java
new file mode 100644
index 0000000..d1e01d0
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageMonitorImages.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class UsageMonitorImages {
+
+ private static ImageRegistry imageRegistry;
+
+ private static final String T_ELCL = "elcl16";
+
+ private static final String T_EVIEW = "eview16";
+
+ private static final URL baseURL = UiUsageMonitorPlugin.getDefault().getBundle().getEntry("/icons/");
+
+ public static final ImageDescriptor REFRESH = create(T_ELCL, "refresh.gif");
+
+ public static final ImageDescriptor SYNCHED = create(T_ELCL, "synched.gif");
+
+ public static final ImageDescriptor REMOVE = create(T_ELCL, "remove.gif");
+
+ public static final ImageDescriptor MONITOR = create(T_EVIEW, "monitor.gif");
+
+ public static final ImageDescriptor ZIP_FILE = create(T_ELCL, "import-zip.gif");
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuffer buffer = new StringBuffer(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+ private static ImageRegistry getImageRegistry() {
+ if (imageRegistry == null) {
+ imageRegistry = new ImageRegistry();
+ }
+
+ return imageRegistry;
+ }
+
+ /**
+ * Lazily initializes image map.
+ */
+ public static Image getImage(ImageDescriptor imageDescriptor) {
+ ImageRegistry imageRegistry = getImageRegistry();
+
+ Image image = imageRegistry.get("" + imageDescriptor.hashCode());
+ if (image == null) {
+ image = imageDescriptor.createImage();
+ imageRegistry.put("" + imageDescriptor.hashCode(), image);
+ }
+ return image;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageStatisticsSummary.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageStatisticsSummary.java
new file mode 100644
index 0000000..41b2a53
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageStatisticsSummary.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
+
+/**
+ * Container for statistics
+ *
+ * @author Mik Kersten
+ */
+public class UsageStatisticsSummary {
+
+ private List<InteractionEventSummary> singleSummaries = new ArrayList<InteractionEventSummary>();
+
+ private final List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
+
+ public List<InteractionEventSummary> getSingleSummaries() {
+ return singleSummaries;
+ }
+
+ public void setSingleSummaries(List<InteractionEventSummary> singleSummaries) {
+ this.singleSummaries = singleSummaries;
+ }
+
+ public void add(int index, IUsageCollector collector) {
+ collectors.add(index, collector);
+ }
+
+ public void add(IUsageCollector collector) {
+ collectors.add(collector);
+ }
+
+ public List<IUsageCollector> getCollectors() {
+ return collectors;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/WebBrowserDialog.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/WebBrowserDialog.java
new file mode 100644
index 0000000..5a7f24f
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/WebBrowserDialog.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+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.Shell;
+
+/**
+ * Dialog to show the contents of an html page to the user
+ *
+ * @author Shawn Minto
+ */
+public class WebBrowserDialog extends MessageDialog {
+
+ private String data = null;
+
+ private boolean isUrl = false;
+
+ public WebBrowserDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage,
+ int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String data, boolean isUrl) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.data = data;
+ this.isUrl = isUrl;
+ }
+
+ public static int openAcceptAgreement(Shell parent, String title, String message, String data, boolean isUrl) {
+ WebBrowserDialog dialog = new WebBrowserDialog(parent, title, null, // accept
+ // the
+ // default
+ // window
+ // icon
+ message, NONE, new String[] { IDialogConstants.OK_LABEL }, 0, data, isUrl);
+ // ok is the default
+ return dialog.open();
+ }
+
+ @Override
+ public Control createCustomArea(Composite parent) {
+ // super.createCustomArea(parent);
+ // Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ parent.setLayout(layout);
+ layout.numColumns = 1;
+
+ Browser b = new Browser(parent, SWT.NONE);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 1;
+ gd.verticalSpan = 50;
+ b.setLayoutData(gd);
+ if (isUrl) {
+ b.setUrl(data);
+ } else {
+ b.setText(data);
+ }
+
+ return parent;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/collectors/PerspectiveUsageCollector.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/collectors/PerspectiveUsageCollector.java
new file mode 100644
index 0000000..66d3375
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/collectors/PerspectiveUsageCollector.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.collectors;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.core.collection.PercentUsageComparator;
+import org.eclipse.mylyn.internal.monitor.ui.PerspectiveChangeMonitor;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @author Leah Findlater
+ *
+ * TODO: put unclassified events in dummy perspective
+ */
+public class PerspectiveUsageCollector implements IUsageCollector {
+
+ private final Map<String, Integer> perspectiveUsage = new HashMap<String, Integer>();
+
+ private String currentPerspective = "";
+
+ private int numUnassociatedEvents = 0;
+
+ private int numEvents = 0;
+
+ public void consumeEvent(InteractionEvent event, int userId) {
+ numEvents++;
+ if (event.getKind().equals(InteractionEvent.Kind.PREFERENCE)) {
+ if (event.getDelta().equals(PerspectiveChangeMonitor.PERSPECTIVE_ACTIVATED)) {
+ currentPerspective = event.getOriginId();
+ if (!perspectiveUsage.containsKey(event.getOriginId())) {
+ perspectiveUsage.put(event.getOriginId(), 1);
+ }
+ }
+ }
+
+ if (!perspectiveUsage.containsKey(currentPerspective)) {
+ numUnassociatedEvents++;
+ return;
+ }
+
+ perspectiveUsage.put(currentPerspective, perspectiveUsage.get(currentPerspective) + 1);
+ }
+
+ public List<String> getReport() {
+ return getReport(true);
+ }
+
+ public String getReportTitle() {
+ return "Perspective Usage";
+ }
+
+ public void exportAsCSVFile(String directory) {
+ String filename = directory + File.separator + "PerspectiveUsage.csv";
+
+ try {
+ BufferedWriter writer = new BufferedWriter(new FileWriter(new File(filename)));
+
+ // Write header
+ writer.write("Perspective");
+ writer.write(",");
+ writer.write("Events");
+ writer.newLine();
+
+ // Write Data
+ for (String perspective : perspectiveUsage.keySet()) {
+ writer.write(perspective);
+ writer.write(",");
+ writer.write(new Integer(perspectiveUsage.get(perspective)).toString());
+ writer.newLine();
+ }
+
+ writer.write("Unclassified");
+ writer.write(",");
+ writer.write(numUnassociatedEvents);
+ writer.newLine();
+
+ writer.flush();
+ writer.close();
+
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, "org.eclipse.mylyn.monitor.core", "Unable to write CVS file <" //$NON-NLS-1$//$NON-NLS-2$
+ + filename + ">", e)); //$NON-NLS-1$
+ }
+
+ }
+
+ public List<String> getPlainTextReport() {
+ return getReport(false);
+ }
+
+ private List<String> getReport(boolean html) {
+ List<String> summaries = new ArrayList<String>();
+ summaries.add("Perspectives (based on total user events, with " + numUnassociatedEvents
+ + " unclassified events)");
+ summaries.add(" ");
+
+ List<String> perspectiveUsageList = new ArrayList<String>();
+ for (String perspective : perspectiveUsage.keySet()) {
+ float perspectiveUse = 100 * perspectiveUsage.get(perspective) / (numEvents);
+ String formattedPerspectiveUse = ("" + perspectiveUse);
+ int indexOf2ndDecimal = formattedPerspectiveUse.indexOf('.') + 3;
+ if (indexOf2ndDecimal <= formattedPerspectiveUse.length()) {
+ formattedPerspectiveUse = formattedPerspectiveUse.substring(0, indexOf2ndDecimal);
+ }
+ String perspectiveName = perspective; // .substring(perspective.lastIndexOf(".")+1,
+ // perspective.length());
+ if (perspectiveName.contains("Perspective")) {
+ perspectiveName = perspectiveName.substring(0, perspectiveName.indexOf("Perspective"));
+ }
+ perspectiveUsageList.add(formattedPerspectiveUse + "%: " + perspectiveName + " ("
+ + perspectiveUsage.get(perspective) + ")");
+ }
+ Collections.sort(perspectiveUsageList, new PercentUsageComparator());
+ for (String perspectiveUsageSummary : perspectiveUsageList) {
+ if (html) {
+ summaries.add("<br>" + perspectiveUsageSummary);
+ } else {
+ summaries.add(perspectiveUsageSummary);
+ }
+ }
+
+ if (perspectiveUsage.size() % 2 != 0) {
+ summaries.add(" ");
+ }
+ return summaries;
+
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountContentProvider.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountContentProvider.java
new file mode 100644
index 0000000..3fd4c27
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountContentProvider.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage.editors;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
+import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
+
+/**
+ * Acts as proxy to the Taskscape model.
+ *
+ * @author Mik Kersten
+ */
+class UsageCountContentProvider implements IStructuredContentProvider {
+
+ private final ReportGenerator parser;
+
+ public UsageCountContentProvider(ReportGenerator parser) {
+ this.parser = parser;
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+
+ }
+
+ public void dispose() {
+ // model.removeChangeListener(this);
+ }
+
+ // Return the individual stat summaries as an array of Objects
+
+ public Object[] getElements(Object parent) {
+ if (parser.getLastParsedSummary() == null) {
+ return new Object[] {};
+ } else {
+ List<InteractionEventSummary> stats = parser.getLastParsedSummary().getSingleSummaries();
+ return stats.toArray();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountLabelProvider.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountLabelProvider.java
new file mode 100644
index 0000000..317aab1
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountLabelProvider.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Leah Findlater - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.editors;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Provides labels for TableViewer 'viewer'.
+ *
+ * @author Leah Findlater
+ * @author Mik Kersten
+ */
+class UsageCountLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+ public String getColumnText(Object obj, int index) {
+ String labelText;
+ switch (index) {
+ case 0:
+ labelText = ((InteractionEventSummary) obj).getType();
+ break;
+ case 1:
+ labelText = ((InteractionEventSummary) obj).getName();
+ break;
+ case 2:
+ labelText = String.valueOf(((InteractionEventSummary) obj).getUsageCount());
+ break;
+ // case 3:
+ // labelText = String.valueOf(((InteractionEventSummary)
+ // obj).getInterestContribution());
+ // break;
+ case 3:
+ labelText = String.valueOf(((InteractionEventSummary) obj).getDelta());
+ break;
+ case 4:
+ labelText = ((InteractionEventSummary) obj).getUserIds().toString();
+ break;
+ default:
+ labelText = "";
+ }
+ return labelText;
+ }
+
+ public Image getColumnImage(Object obj, int index) {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageEditorPart.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageEditorPart.java
new file mode 100644
index 0000000..759ff4c
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageEditorPart.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Meghan Allen - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.editors;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class UsageEditorPart extends EditorPart {
+
+ protected UsageStatsEditorInput editorInput;
+
+ protected FormToolkit toolkit;
+
+ protected ScrolledForm sForm;
+
+ protected Composite editorComposite;
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ }
+
+ @Override
+ public void doSaveAs() {
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ setSite(site);
+ setInput(input);
+ editorInput = (UsageStatsEditorInput) input;
+ setPartName(editorInput.getName());
+ }
+
+ @Override
+ public boolean isDirty() {
+ return false;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ toolkit = new FormToolkit(parent.getDisplay());
+ sForm = toolkit.createScrolledForm(parent);
+ sForm.getBody().setLayout(new GridLayout());// TableWrapLayout());
+ editorComposite = sForm.getBody();
+ sForm.setText("Usage Summary");
+ toolkit.decorateFormHeading(sForm.getForm());
+ createSummaryStatsSection(editorComposite, toolkit);
+ addSections(editorComposite, toolkit);
+ createActionSection(editorComposite, toolkit);
+ }
+
+ protected void addSections(Composite composite, FormToolkit toolkit) {
+ // none
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ protected void createActionSection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ section.setText("Actions");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite container = toolkit.createComposite(section);
+ section.setClient(container);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+
+ Button exportHtml = toolkit.createButton(container, "Export as HTML", SWT.PUSH | SWT.CENTER);
+ exportHtml.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ exportToHtml();
+ }
+ });
+
+ Button export = toolkit.createButton(container, "Export as CSV Files", SWT.PUSH | SWT.CENTER);
+ export.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ exportToCSV();
+ }
+ });
+ }
+
+ protected void createSummaryStatsSection(Composite parent, FormToolkit toolkit) {
+ for (IUsageCollector collector : editorInput.getReportGenerator().getLastParsedSummary().getCollectors()) {
+ List<String> summary = collector.getPlainTextReport();
+ if (!summary.isEmpty()) {
+ Section summarySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR
+ | ExpandableComposite.TWISTIE);
+ summarySection.setText(collector.getReportTitle());
+ summarySection.setLayout(new GridLayout());
+ summarySection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite summaryContainer = toolkit.createComposite(summarySection);
+ summaryContainer.setLayout(new GridLayout());
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.horizontalSpan = 1;
+ data.grabExcessHorizontalSpace = true;
+ summaryContainer.setLayoutData(data);
+
+ // GridDataFactory.fillDefaults().grab(true,
+ // false).applyTo(summaryContainer);
+ summarySection.setClient(summaryContainer);
+ /*
+ *
+ * GridLayout attributesLayout = new GridLayout();
+ * attributesLayout.numColumns = 4;
+ * attributesLayout.horizontalSpacing = 5;
+ * attributesLayout.verticalSpacing = 4;
+ * attributesComposite.setLayout(attributesLayout); GridData
+ * attributesData = new GridData(GridData.FILL_BOTH);
+ * attributesData.horizontalSpan = 1;
+ * attributesData.grabExcessVerticalSpace = false;
+ * attributesComposite.setLayoutData(attributesData);
+ * attributesSection.setClient(attributesComposite);
+ */
+
+ StyledText t = new StyledText(summaryContainer, SWT.NONE);
+ t.setEditable(false);
+ for (String description : summary) {
+ t.append(description + System.getProperty("line.separator"));
+
+ }
+ /*
+ * Browser browser = new Browser(summaryContainer, SWT.NONE);
+ * GridData browserLayout = new GridData(GridData.FILL_BOTH);
+ * browserLayout.heightHint = summary.size() * 25; //
+ * browserLayout.widthHint = 500;
+ * browser.setLayoutData(browserLayout); String htmlText = "<html><head><LINK
+ * REL=STYLESHEET HREF=\"http://eclipse.org/default_style.css\"
+ * TYPE=\"text/css\"></head><body topmargin=0 leftmargin=0
+ * rightmargin=0><font size=-1>\n"; for (String description :
+ * summary) { htmlText += description; } htmlText += "</font></body></html>";
+ * browser.setText(htmlText);
+ */
+ // if (description.equals(ReportGenerator.SUMMARY_SEPARATOR)) {
+ // toolkit.createLabel(summaryContainer,
+ // "---------------------------------");
+ // toolkit.createLabel(summaryContainer,
+ // "---------------------------------");
+ // } else {
+ // Label label = toolkit.createLabel(summaryContainer,
+ // description);
+ // if (!description.startsWith("<h"));
+ // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ // label.setLayoutData(new
+ // TableWrapData(TableWrapData.FILL_GRAB));
+ // }
+ // }
+ }
+ }
+ }
+
+ protected void exportToCSV() {
+
+ // Ask the user to pick a directory into which to place multiple CSV
+ // files
+ try {
+ DirectoryDialog dialog = new DirectoryDialog(getSite().getWorkbenchWindow().getShell());
+ dialog.setText("Specify a directory for the CSV files");
+ String directoryName = dialog.open();
+
+ File outputFile;
+ FileOutputStream outputStream;
+
+ String filename = directoryName + File.separator + "Usage.csv";
+ outputFile = new File(filename);
+
+ outputStream = new FileOutputStream(outputFile, false);
+
+ // Delegate to all collectors
+ for (IUsageCollector collector : editorInput.getReportGenerator().getCollectors()) {
+ collector.exportAsCSVFile(directoryName);
+ }
+
+ outputStream.flush();
+ outputStream.close();
+
+ } catch (SWTException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Unable to get directory name",
+ e));
+ } catch (FileNotFoundException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Could not resolve file", e));
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Could not write to file", e));
+ }
+ }
+
+ protected void exportToHtml() {
+ File outputFile;
+ try {
+ FileDialog dialog = new FileDialog(getSite().getWorkbenchWindow().getShell());
+ dialog.setText("Specify a file name");
+ dialog.setFilterExtensions(new String[] { "*.html", "*.*" });
+
+ String filename = dialog.open();
+ if (!filename.endsWith(".html")) {
+ filename += ".html";
+ }
+ outputFile = new File(filename);
+ // outputStream = new FileOutputStream(outputFile, true);
+ BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
+ writer.write("<html><head>");
+ for (IUsageCollector collector : editorInput.getReportGenerator().getCollectors()) {
+ writer.write("<h3>" + collector.getReportTitle() + "</h3>");
+ for (String reportLine : collector.getReport()) {
+ writer.write(reportLine);
+ }
+ writer.write("<br><hr>");
+ }
+ writer.write("</body></html>");
+ writer.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Cound not write to file", e));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageStatsEditorInput.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageStatsEditorInput.java
new file mode 100644
index 0000000..90084a7
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageStatsEditorInput.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage.editors;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Mik Kersten
+ */
+public class UsageStatsEditorInput implements IEditorInput {
+
+ private final ReportGenerator reportGenerator;
+
+ private final List<File> usageFiles;
+
+ /**
+ * Supports either the single workspace file or multiple zip files.
+ */
+ public UsageStatsEditorInput(List<File> files, ReportGenerator reportGenerator) {
+ // try {
+ this.reportGenerator = reportGenerator;
+ usageFiles = files;
+ reportGenerator.getStatisticsFromInteractionHistories(usageFiles, null);
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return "Usage Summary";
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return "Mylyn Usage Statistics";
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public List<File> getInputFiles() {
+ return usageFiles;
+ }
+
+ public ReportGenerator getReportGenerator() {
+ return reportGenerator;
+ }
+
+ private final byte[] buffer = new byte[8192];
+
+ public void transferData(InputStream sourceStream, OutputStream destination) throws IOException {
+ int bytesRead = 0;
+ while (bytesRead != -1) {
+ bytesRead = sourceStream.read(buffer, 0, buffer.length);
+ if (bytesRead != -1) {
+ destination.write(buffer, 0, bytesRead);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageSummaryReportEditorPart.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageSummaryReportEditorPart.java
new file mode 100644
index 0000000..e9ca498
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageSummaryReportEditorPart.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.editors;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventSummarySorter;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.program.Program;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.internal.browser.WebBrowserPreference;
+import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
+
+/**
+ * @author Meghan Allen
+ */
+public class UsageSummaryReportEditorPart extends UsageEditorPart {
+
+ public static final String ID = "org.eclipse.mylyn.monitor.usage.summary.editor";
+
+ private static final long MAX_FILE_LENGTH = 1024 * 1024;
+
+ private static final String URL_USAGE_PAGE = "http://mylyn.eclipse.org/monitor/upload/usageSummary.html";
+
+ private static final String DATE_FORMAT_STRING = "MMMMM d, h:mm a";
+
+ // private static final int MAX_NUM_LINES = 1000;
+
+ private Table table;
+
+ private TableViewer tableViewer;
+
+ private final String[] columnNames = new String[] { "Kind", "ID", "Count" };
+
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+ sForm.setText(new SimpleDateFormat(DATE_FORMAT_STRING).format(new Date()));
+ }
+
+ @Override
+ protected void addSections(Composite composite, FormToolkit toolkit) {
+ if (editorInput.getReportGenerator().getLastParsedSummary().getSingleSummaries().size() > 0) {
+ createUsageSection(editorComposite, toolkit);
+ }
+ }
+
+ private void createUsageSection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ section.setText("Usage Details");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite container = toolkit.createComposite(section);
+ section.setClient(container);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+
+ createTable(container, toolkit);
+ createTableViewer();
+ toolkit.paintBordersFor(container);
+ }
+
+ @Override
+ protected void createActionSection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ section.setText("Actions");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite topContainer = toolkit.createComposite(section);
+ GridLayout topContainerLayout = new GridLayout();
+ topContainerLayout.numColumns = 1;
+ topContainer.setLayout(topContainerLayout);
+ section.setClient(topContainer);
+
+ Composite buttonContainer = toolkit.createComposite(topContainer);
+ GridLayout buttonContainerLayout = new GridLayout();
+ buttonContainerLayout.numColumns = 3;
+ buttonContainer.setLayout(buttonContainerLayout);
+
+ Button submitData = toolkit.createButton(buttonContainer, "Submit to Eclipse.org", SWT.PUSH | SWT.CENTER);
+ submitData.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ submitData();
+ }
+ });
+
+ Button viewFile = toolkit.createButton(buttonContainer, "View File", SWT.PUSH | SWT.CENTER);
+ viewFile.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ viewFile();
+ }
+ });
+
+ Button viewStats = toolkit.createButton(buttonContainer, "View Community Statistics", SWT.PUSH | SWT.CENTER);
+ viewStats.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ viewStats();
+ }
+ });
+ Composite labelContainer = toolkit.createComposite(topContainer);
+ GridLayout labelContainerLayout = new GridLayout();
+ labelContainerLayout.numColumns = 1;
+ labelContainer.setLayout(labelContainerLayout);
+ Label submissionLabel = new Label(labelContainer, SWT.NONE);
+ submissionLabel.setText("Only usage of org.eclipse.* IDs will be submitted to Eclipse.org");
+ }
+
+ /**
+ * TODO: move to Mylyn Web UI stuff
+ */
+ private void viewStats() {
+ try {
+ if (WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.EXTERNAL) {
+ try {
+ IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
+ support.getExternalBrowser().openURL(new URL(URL_USAGE_PAGE));
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not open task url", e));
+ }
+ } else {
+ IWebBrowser browser = null;
+ int flags = 0;
+ if (WorkbenchBrowserSupport.getInstance().isInternalWebBrowserAvailable()) {
+ flags = IWorkbenchBrowserSupport.AS_EDITOR | IWorkbenchBrowserSupport.LOCATION_BAR
+ | IWorkbenchBrowserSupport.NAVIGATION_BAR;
+
+ } else {
+ flags = IWorkbenchBrowserSupport.AS_EXTERNAL | IWorkbenchBrowserSupport.LOCATION_BAR
+ | IWorkbenchBrowserSupport.NAVIGATION_BAR;
+ }
+
+ String generatedId = "org.eclipse.mylyn.web.browser-" + Calendar.getInstance().getTimeInMillis();
+ browser = WorkbenchBrowserSupport.getInstance().createBrowser(flags, generatedId, null, null);
+ browser.openURL(new URL(URL_USAGE_PAGE));
+ }
+ } catch (PartInitException e) {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Browser init error",
+ "Browser could not be initiated");
+ } catch (MalformedURLException e) {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "URL not found", "URL Could not be opened");
+ }
+ }
+
+ /**
+ * Only opens in workbench if file is small enough not to blow it up.
+ */
+ private void viewFile() {
+ File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+
+ if (monitorFile.length() <= MAX_FILE_LENGTH) {
+ IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(monitorFile.getAbsolutePath()));
+ if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ IDE.openEditorOnFileStore(page, fileStore);
+ } catch (PartInitException e) {
+ }
+ }
+ } else {
+ boolean failed = false;
+ failed = !Program.launch(monitorFile.getAbsolutePath());
+ if (failed) {
+ Program p = Program.findProgram(".txt");
+ if (p != null) {
+ p.execute(monitorFile.getAbsolutePath());
+ }
+ }
+ }
+ }
+
+ private void submitData() {
+
+ UsageSubmissionWizard submissionWizard = new UsageSubmissionWizard();
+
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ submissionWizard);
+ dialog.open();
+
+ }
+
+ private void createTable(Composite parent, FormToolkit toolkit) {
+ int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+ table = toolkit.createTable(parent, style);
+ TableLayout tlayout = new TableLayout();
+ table.setLayout(tlayout);
+ GridData wd = new GridData(GridData.FILL_HORIZONTAL);
+ wd.heightHint = 300;
+ table.setLayoutData(wd);
+
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+ column.setText(columnNames[0]);
+ column.setWidth(60);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.TYPE));
+
+ }
+ });
+
+ column = new TableColumn(table, SWT.LEFT, 1);
+ column.setText(columnNames[1]);
+ column.setWidth(370);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.NAME));
+ }
+ });
+
+ column = new TableColumn(table, SWT.LEFT, 2);
+ column.setText(columnNames[2]);
+ column.setWidth(50);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.USAGE_COUNT));
+ }
+ });
+
+ }
+
+ private void createTableViewer() {
+ tableViewer = new TableViewer(table);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setColumnProperties(columnNames);
+
+ tableViewer.setContentProvider(new UsageCountContentProvider(editorInput.getReportGenerator()));
+ tableViewer.setLabelProvider(new UsageCountLabelProvider());
+ tableViewer.setInput(editorInput);
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UserStudyEditorPart.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UserStudyEditorPart.java
new file mode 100644
index 0000000..11c2378
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UserStudyEditorPart.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Meghan Allen - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.editors;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventSummarySorter;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+/**
+ * @author Mik Kersten
+ */
+public class UserStudyEditorPart extends UsageEditorPart {
+
+ private Table table;
+
+ private TableViewer tableViewer;
+
+ private final String[] columnNames = new String[] { "Kind", "ID", "Num", "Last Delta", "Users" };
+
+ public UserStudyEditorPart(String id, String title) {
+ // super(id, title);
+ }
+
+ @Override
+ protected void addSections(Composite composite, FormToolkit toolkit) {
+ if (editorInput.getReportGenerator().getLastParsedSummary().getSingleSummaries().size() > 0) {
+ createUsageSection(editorComposite, toolkit);
+ }
+ }
+
+ private void createUsageSection(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ section.setText("Usage Details");
+ section.setLayout(new TableWrapLayout());
+ section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ Composite container = toolkit.createComposite(section);
+ section.setClient(container);
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+
+ createTable(container, toolkit);
+ createTableViewer();
+ toolkit.paintBordersFor(container);
+ }
+
+ private void createTable(Composite parent, FormToolkit toolkit) {
+ int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+ table = toolkit.createTable(parent, style);
+ TableLayout tlayout = new TableLayout();
+ table.setLayout(tlayout);
+ TableWrapData wd = new TableWrapData(TableWrapData.FILL_GRAB);
+ wd.heightHint = 300;
+ wd.grabVertical = true;
+ table.setLayoutData(wd);
+
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+ column.setText(columnNames[0]);
+ column.setWidth(60);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.TYPE));
+
+ }
+ });
+
+ column = new TableColumn(table, SWT.LEFT, 1);
+ column.setText(columnNames[1]);
+ column.setWidth(370);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.NAME));
+ }
+ });
+
+ column = new TableColumn(table, SWT.LEFT, 2);
+ column.setText(columnNames[2]);
+ column.setWidth(50);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.USAGE_COUNT));
+ }
+ });
+
+ // column = new TableColumn(table, SWT.LEFT, 3);
+ // column.setText(columnNames[3]);
+ // column.setWidth(60);
+
+ column = new TableColumn(table, SWT.LEFT, 3);
+ column.setText(columnNames[3]);
+ column.setWidth(60);
+
+ column = new TableColumn(table, SWT.LEFT, 4);
+ column.setText(columnNames[4]);
+ column.setWidth(60);
+ }
+
+ private void createTableViewer() {
+ tableViewer = new TableViewer(table);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setColumnProperties(columnNames);
+
+ tableViewer.setContentProvider(new UsageCountContentProvider(editorInput.getReportGenerator()));
+ tableViewer.setLabelProvider(new UsageCountLabelProvider());
+ tableViewer.setInput(editorInput);
+ }
+
+ @Override
+ protected void exportToCSV() {
+
+ // Ask the user to pick a directory into which to place multiple CSV
+ // files
+ try {
+ DirectoryDialog dialog = new DirectoryDialog(getSite().getWorkbenchWindow().getShell());
+ dialog.setText("Specify a directory for the CSV files");
+ String directoryName = dialog.open();
+
+ File outputFile;
+ FileOutputStream outputStream;
+
+ String filename = directoryName + File.separator + "Usage.csv";
+ outputFile = new File(filename);
+
+ outputStream = new FileOutputStream(outputFile, false);
+
+ // Delegate to all collectors
+ for (IUsageCollector collector : editorInput.getReportGenerator().getCollectors()) {
+ collector.exportAsCSVFile(directoryName);
+ }
+
+ int columnCount = table.getColumnCount();
+ for (TableItem item : table.getItems()) {
+
+ for (int i = 0; i < columnCount - 1; i++) {
+
+ outputStream.write((item.getText(i) + ",").getBytes());
+ }
+
+ outputStream.write(item.getText(columnCount - 1).getBytes());
+ outputStream.write(("\n").getBytes());
+
+ }
+ outputStream.flush();
+ outputStream.close();
+ } catch (SWTException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Unable to get directory name",
+ e));
+ } catch (FileNotFoundException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Could not resolve file", e));
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Could not write to file", e));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/preferences/UsageDataPreferencePage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/preferences/UsageDataPreferencePage.java
new file mode 100644
index 0000000..6256e64
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/preferences/UsageDataPreferencePage.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventObfuscator;
+import org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ */
+public class UsageDataPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ private static final String DESCRIPTION = "If enabled the Mylyn Monitor logs selections, edits, commands, and preference changes. "
+ + "If you would like to help improve the user experience by anonymously sharing non-private "
+ + "parts of this data, enable automatic feedback submission or submit your data via the "
+ + "Usage Summary Wizard.";
+
+ private static final long DAYS_IN_MS = 1000 * 60 * 60 * 24;
+
+ private Button enableMonitoring;
+
+ private Button enableObfuscation;
+
+ private Button enableSubmission;
+
+ private Text logFileText;
+
+ private Text uploadUrl;
+
+ private Text submissionTime;
+
+ public UsageDataPreferencePage() {
+ super();
+ setPreferenceStore(UiUsageMonitorPlugin.getPrefs());
+ setDescription(DESCRIPTION);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+
+ if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
+ Label label = new Label(parent, SWT.NULL);
+ label.setText(UiUsageMonitorPlugin.getDefault().getCustomizedByMessage());
+ label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ }
+
+ createLogFileSection(container);
+ createUsageSection(container);
+ updateEnablement();
+ return container;
+ }
+
+ public void init(IWorkbench workbench) {
+ // Nothing to init
+ }
+
+ private void updateEnablement() {
+ if (!enableMonitoring.getSelection()) {
+ logFileText.setEnabled(false);
+ enableSubmission.setEnabled(false);
+ submissionTime.setEnabled(false);
+ } else {
+ logFileText.setEnabled(true);
+ enableSubmission.setEnabled(true);
+ if (!enableSubmission.getSelection()) {
+ submissionTime.setEnabled(false);
+ } else {
+ submissionTime.setEnabled(true);
+ }
+ }
+
+ }
+
+ private void createLogFileSection(Composite parent) {
+ final Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText("Monitoring");
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ enableMonitoring = new Button(group, SWT.CHECK);
+ enableMonitoring.setText("Enable logging to: ");
+ enableMonitoring.setSelection(getPreferenceStore().getBoolean(
+ MonitorPreferenceConstants.PREF_MONITORING_ENABLED));
+ enableMonitoring.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ updateEnablement();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+
+ String logFilePath = UiUsageMonitorPlugin.getDefault().getMonitorLogFile().getPath();
+ logFilePath = logFilePath.replaceAll("\\\\", "/");
+ logFileText = new Text(group, SWT.BORDER);
+ logFileText.setText(logFilePath);
+ logFileText.setEditable(false);
+ logFileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ enableObfuscation = new Button(group, SWT.CHECK);
+ enableObfuscation.setText("Obfuscate elements using: ");
+ enableObfuscation.setSelection(getPreferenceStore().getBoolean(
+ MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE));
+ Label obfuscationLablel = new Label(group, SWT.NULL);
+ obfuscationLablel.setText(InteractionEventObfuscator.ENCRYPTION_ALGORITHM + " message digest one-way hash");
+ }
+
+ private void createUsageSection(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText("Usage Feedback");
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label label = new Label(group, SWT.NULL);
+ label.setText(" Upload URL: ");
+ uploadUrl = new Text(group, SWT.BORDER);
+ uploadUrl.setEditable(false);
+ uploadUrl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ uploadUrl.setText(UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl());
+
+ Label events = new Label(group, SWT.NULL);
+ events.setText(" Events since upload:");
+ Label logged = new Label(group, SWT.NULL);
+ logged.setText("" + getPreferenceStore().getInt(MonitorPreferenceConstants.PREF_NUM_USER_EVENTS));
+
+ Composite enableSubmissionComposite = new Composite(group, SWT.NULL);
+ GridLayout submissionGridLayout = new GridLayout(4, false);
+ submissionGridLayout.marginWidth = 0;
+ submissionGridLayout.marginHeight = 0;
+ enableSubmissionComposite.setLayout(submissionGridLayout);
+ enableSubmission = new Button(enableSubmissionComposite, SWT.CHECK);
+
+ enableSubmission.setText("Enable submission every");
+ enableSubmission.setSelection(getPreferenceStore().getBoolean(
+ MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION));
+ enableSubmission.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ updateEnablement();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+ submissionTime = new Text(enableSubmissionComposite, SWT.BORDER | SWT.RIGHT);
+ GridData gridData = new GridData();
+ gridData.widthHint = 15;
+ submissionTime.setLayoutData(gridData);
+ long submissionFreq = UiUsageMonitorPlugin.DEFAULT_DELAY_BETWEEN_TRANSMITS;
+ if (UiUsageMonitorPlugin.getPrefs().contains(MonitorPreferenceConstants.PREF_MONITORING_SUBMIT_FREQUENCY)) {
+ submissionFreq = UiUsageMonitorPlugin.getPrefs().getLong(
+ MonitorPreferenceConstants.PREF_MONITORING_SUBMIT_FREQUENCY);
+ }
+ long submissionFreqInDays = submissionFreq / DAYS_IN_MS;
+ submissionTime.setText("" + submissionFreqInDays);
+ submissionTime.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+
+ }
+ });
+ Label label2 = new Label(enableSubmissionComposite, SWT.NONE);
+ label2.setText("days");
+
+ }
+
+ @Override
+ public void performDefaults() {
+ super.performDefaults();
+ logFileText.setText(UiUsageMonitorPlugin.getDefault().getMonitorLogFile().getPath());
+ }
+
+ @Override
+ public boolean performOk() {
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE,
+ enableObfuscation.getSelection());
+ if (enableMonitoring.getSelection()) {
+ UiUsageMonitorPlugin.getDefault().startMonitoring();
+ } else {
+ UiUsageMonitorPlugin.getDefault().stopMonitoring();
+ }
+
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION,
+ enableSubmission.getSelection());
+
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLED,
+ enableMonitoring.getSelection());
+
+ long transmitFrequency = UiUsageMonitorPlugin.DEFAULT_DELAY_BETWEEN_TRANSMITS;
+
+ String submissionFrequency = submissionTime.getText();
+
+ try {
+ transmitFrequency = Integer.parseInt(submissionFrequency);
+ transmitFrequency *= DAYS_IN_MS;
+ } catch (NumberFormatException nfe) {
+ // do nothing, transmitFrequency will have the default value
+ }
+
+ getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_SUBMIT_FREQUENCY, transmitFrequency);
+
+ UiUsageMonitorPlugin.getDefault().getStudyParameters().setTransmitPromptPeriod(transmitFrequency);
+ return true;
+ }
+
+ @Override
+ public boolean performCancel() {
+ enableMonitoring.setSelection(getPreferenceStore().getBoolean(
+ MonitorPreferenceConstants.PREF_MONITORING_ENABLED));
+ enableObfuscation.setSelection(getPreferenceStore().getBoolean(
+ MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE));
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/GetNewUserIdPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/GetNewUserIdPage.java
new file mode 100644
index 0000000..94c3fa8
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/GetNewUserIdPage.java
@@ -0,0 +1,557 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage.wizards;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Page to get a user study id for the user.
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class GetNewUserIdPage extends WizardPage {
+
+ private static final String SELECT_BELOW = "<Select Below>";
+
+ private Text firstName;
+
+ private Text lastName;
+
+ private Text emailAddress;
+
+ private Button contactAgreement;
+
+ // private Button anonymous;
+ private Button getNewUid;
+
+ private Button getExistingUid;
+
+ private String first;
+
+ private String last;
+
+ private String email;
+
+ private boolean contactEmail = false;
+
+ private boolean anon;
+
+ private boolean hasValidated = false;
+
+ private String jobFunction = SELECT_BELOW;
+
+ private String companySize = SELECT_BELOW;
+
+ private String companyFunction = SELECT_BELOW;
+
+ private final UsageSubmissionWizard wizard;
+
+ private final boolean performUpload;
+
+ private boolean extendedMonitor = false;
+
+ public GetNewUserIdPage(UsageSubmissionWizard wizard, boolean performUpload) {
+ super("Statistics Wizard");
+ this.performUpload = performUpload;
+ setTitle("Get Mylyn Feedback User ID");
+ setDescription("In order to submit usage feedback you first need to get a User ID.\n");
+ this.wizard = wizard;
+ if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
+ extendedMonitor = true;
+ String customizedTitle = UiUsageMonitorPlugin.getDefault().getStudyParameters().getTitle();
+ if (!customizedTitle.equals("")) {
+ setTitle(customizedTitle + ": Consent Form and User ID");
+ }
+ }
+ }
+
+ /**
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 1;
+ if (extendedMonitor) {
+ createBrowserSection(container);
+ // createAnonymousSection(container);
+ createInstructionSection(container);
+ createNamesSection(container);
+ createJobDetailSection(container);
+ if (UiUsageMonitorPlugin.getDefault().usingContactField()) {
+ createContactSection(container);
+ }
+ createUserIdButtons(container);
+ } else {
+ createAnonymousParticipationButtons(container);
+ }
+ setControl(container);
+ }
+
+ @SuppressWarnings("deprecation")
+ private void createBrowserSection(Composite parent) {
+ if (extendedMonitor) {
+ Label label = new Label(parent, SWT.NULL);
+ label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ label.setText(UiUsageMonitorPlugin.getDefault().getCustomizedByMessage());
+
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 1;
+ Browser browser = new Browser(parent, SWT.NONE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.heightHint = 200;
+ gd.widthHint = 600;
+ browser.setLayoutData(gd);
+
+ URL url = Platform.getBundle(UiUsageMonitorPlugin.getDefault().getCustomizingPlugin()).getEntry(
+ UiUsageMonitorPlugin.getDefault().getStudyParameters().getFormsConsent());
+ try {
+ URL localURL = Platform.asLocalURL(url);
+ browser.setUrl(localURL.toString());
+ } catch (Exception e) {
+ browser.setText("Feedback description could not be located.");
+ }
+ } else {
+ Label label = new Label(parent, SWT.NULL);
+ label.setText("bla bla");
+ }
+ }
+
+ // private void createAnonymousSection(Composite parent) {
+ // Composite container = new Composite(parent, SWT.NULL);
+ // GridLayout layout = new GridLayout();
+ // container.setLayout(layout);
+ // layout.numColumns = 1;
+ //
+ // anonymous = new Button(container, SWT.CHECK);
+ // GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ // anonymous.setLayoutData(gd);
+ // anonymous.setSelection(false);
+ // anonymous.setText("Anonymous (you must still provide your name and email
+ // for consent purposes)");
+ // anonymous.addSelectionListener(new SelectionListener() {
+ // public void widgetSelected(SelectionEvent e) {
+ // if (e.widget instanceof Button) {
+ // Button b = (Button) e.widget;
+ // anon = b.getSelection();
+ // updateEnablement();
+ // // boolean edit = !anon;
+ // // firstName.setEditable(edit);
+ // // lastName.setEditable(edit);
+ // // emailAddress.setEditable(edit);
+ // GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ // }
+ // }
+ // public void widgetDefaultSelected(SelectionEvent e) {
+ // // don't care about default selection
+ // }
+ // });
+ // }
+
+ private void createNamesSection(Composite parent) {
+ Composite names = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(6, true);
+ layout.verticalSpacing = 9;
+ layout.horizontalSpacing = 4;
+ names.setLayout(layout);
+
+ Label label = new Label(names, SWT.NULL);
+ label.setText("First Name:");
+
+ firstName = new Text(names, SWT.BORDER | SWT.SINGLE);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.horizontalSpan = 2;
+ firstName.setLayoutData(gd);
+ firstName.setEditable(true);
+ firstName.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ first = firstName.getText();
+ updateEnablement();
+ GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ }
+ });
+
+ label = new Label(names, SWT.NULL);
+ label.setText("Last Name:");
+
+ lastName = new Text(names, SWT.BORDER | SWT.SINGLE);
+ gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.horizontalSpan = 2;
+ lastName.setLayoutData(gd);
+ lastName.setEditable(true);
+ lastName.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ last = lastName.getText();
+ updateEnablement();
+ GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ }
+ });
+
+ label = new Label(names, SWT.NONE);
+ label.setText("Email Address:");
+
+ emailAddress = new Text(names, SWT.BORDER | SWT.SINGLE);
+ gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH);
+ gd.horizontalSpan = 5;
+ emailAddress.setLayoutData(gd);
+ emailAddress.setEditable(true);
+ emailAddress.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ email = emailAddress.getText();
+ updateEnablement();
+ GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ }
+ });
+ }
+
+ private void createJobDetailSection(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 2;
+
+ Label l = new Label(container, SWT.NULL);
+ l.setText("Job Function:");
+ final Combo jobFunctionCombo = new Combo(container, SWT.DROP_DOWN);
+ jobFunctionCombo.setText(jobFunction);
+ jobFunctionCombo.add("Application Developer");
+ jobFunctionCombo.add("QA/Testing");
+ jobFunctionCombo.add("Program Director");
+ jobFunctionCombo.add("CIO/CTO");
+ jobFunctionCombo.add("VP Development Systems Integrator");
+ jobFunctionCombo.add("Application Architect");
+ jobFunctionCombo.add("Project Manager");
+ jobFunctionCombo.add("Student");
+ jobFunctionCombo.add("Faculty");
+ jobFunctionCombo.add("Business");
+ jobFunctionCombo.add("Analyst");
+ jobFunctionCombo.add("Database Administrator");
+ jobFunctionCombo.add("Other");
+ jobFunctionCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ jobFunction = jobFunctionCombo.getText();
+ updateEnablement();
+ }
+ });
+
+ l = new Label(container, SWT.NULL);
+ l.setText("Company Size:");
+ final Combo companySizecombo = new Combo(container, SWT.DROP_DOWN);
+ companySizecombo.setText(companySize);
+ companySizecombo.add("Individual");
+ companySizecombo.add("<50");
+ companySizecombo.add("50-100");
+ companySizecombo.add("100-500");
+ companySizecombo.add("500-1000");
+ companySizecombo.add("1000-2500");
+ companySizecombo.add(">2500");
+ companySizecombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ companySize = companySizecombo.getText();
+ updateEnablement();
+ }
+ });
+
+ l = new Label(container, SWT.NULL);
+ l.setText("Company Business");
+ final Combo companyBuisnesscombo = new Combo(container, SWT.DROP_DOWN);
+ companyBuisnesscombo.setText(companyFunction);
+ companyBuisnesscombo.add("Financial service/insurance");
+ companyBuisnesscombo.add("Energy");
+ companyBuisnesscombo.add("Government");
+ companyBuisnesscombo.add("Hardware Manufacturer");
+ companyBuisnesscombo.add("Networking");
+ companyBuisnesscombo.add("Pharmaceutical/Medical");
+ companyBuisnesscombo.add("Automotive");
+ companyBuisnesscombo.add("Software Manufacturer");
+ companyBuisnesscombo.add("Communications");
+ companyBuisnesscombo.add("Transportation");
+ companyBuisnesscombo.add("Retail");
+ companyBuisnesscombo.add("Utilities");
+ companyBuisnesscombo.add("Other Manufacturing");
+ companyBuisnesscombo.add("Academic/Education");
+ companyBuisnesscombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ companyFunction = companyBuisnesscombo.getText();
+ updateEnablement();
+ }
+ });
+ }
+
+ private void createInstructionSection(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ container.setLayout(layout);
+
+ Label l = new Label(container, SWT.NONE);
+ // l.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ l.setText("To create a user ID please fill in the following information. If you already have an ID please fill out the information again to retrieve it.");
+
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ l.setLayoutData(gd);
+ }
+
+ private void createContactSection(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ container.setLayout(layout);
+
+ contactAgreement = new Button(container, SWT.CHECK);
+ contactAgreement.setText("I would be willing to receive email about my participation in this study.");
+ contactAgreement.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ contactEmail = contactAgreement.getSelection();
+ }
+ });
+ }
+
+ private void createUserIdButtons(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ container.setLayout(layout);
+
+ Label l = new Label(container, SWT.NONE);
+ l.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ l.setText("By clicking \"I consent\" you acknowledge that you have received this consent form, and are consenting to participate in the study.");
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ l.setLayoutData(gd);
+
+ container = new Composite(parent, SWT.NULL);
+ layout = new GridLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+
+ getNewUid = new Button(container, SWT.PUSH);
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ getNewUid.setLayoutData(gd);
+ getNewUid.setSelection(false);
+ getNewUid.setText("I consent; get me a new user ID");
+ getNewUid.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ if (e.widget instanceof Button) {
+ if (hasAllFields(false)) {
+ if (wizard.getNewUid(first, last, email, anon, jobFunction, companySize, companyFunction,
+ contactEmail) != -1) {
+ if (wizard.getUploadPage() != null) {
+ wizard.getUploadPage().updateUid();
+ }
+ hasValidated = true;
+ MessageDialog.openInformation(Display.getDefault().getActiveShell(), "Mylyn User Study ID",
+ "Your Mylyn user study ID is: " + wizard.getUid());
+ }
+ } else {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Incomplete Form Input",
+ "Please complete all of the fields.");
+ }
+ GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // don't care about default selected
+ }
+ });
+
+ getExistingUid = new Button(container, SWT.PUSH);
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ getExistingUid.setLayoutData(gd);
+ getExistingUid.setSelection(false);
+ getExistingUid.setText("I have already consented; retrieve my existing user ID");
+ getExistingUid.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ if (e.widget instanceof Button) {
+ if (hasAllFields(true)) {
+ if (wizard.getExistingUid(first, last, email, anon) != -1) {
+ if (wizard.getUploadPage() != null) {
+ wizard.getUploadPage().updateUid();
+ }
+ hasValidated = true;
+ MessageDialog.openInformation(
+ Display.getDefault().getActiveShell(),
+ "Mylyn Feedback User ID",
+ "Your Mylyn feedback ID is: "
+ + wizard.getUid()
+ + "\n\nPlease record this number if you are using multiple copies of eclipse so that you do not have to register again.\n\nYou can also retrieve this ID by repeating the consent process at a later time.");
+ }
+ } else {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Incomplete Form Input",
+ "Please complete all of the fields.");
+ }
+ GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // don't care about default selected
+ }
+ });
+
+ updateEnablement();
+ }
+
+ private void createAnonymousParticipationButtons(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ container.setLayout(layout);
+
+ Label label = new Label(container, SWT.NONE);
+ label.setText("Your data will not be traceable back to you, but an ID helps us analyze the usage statistics.");
+ label = new Label(container, SWT.NONE);
+ label.setText("Before switching workspaces please retrieve this ID from the Mylyn Preferences so that you can use it again.");
+ // GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ // label.setLayoutData(gd);
+
+ container = new Composite(parent, SWT.NULL);
+ layout = new GridLayout();
+ layout.numColumns = 2;
+ container.setLayout(layout);
+
+ getNewUid = new Button(container, SWT.PUSH);
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ getNewUid.setLayoutData(gd);
+ getNewUid.setSelection(false);
+ getNewUid.setText("Create or Retrieve ID");
+ getNewUid.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ if (e.widget instanceof Button) {
+ if (wizard.getNewUid(null, null, null, true, null, null, null, false) != -1) {
+ if (wizard.getUploadPage() != null) {
+ wizard.getUploadPage().updateUid();
+ }
+ hasValidated = true;
+ MessageDialog.openInformation(
+ Display.getDefault().getActiveShell(),
+ "Mylyn User Study ID",
+ "Your Mylyn user study id is: "
+ + wizard.getUid()
+ + "\n Please record this number if you are using multiple copies of eclipse so that you do not have to register again.");
+ }
+ GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // don't care about default selected
+ }
+ });
+ updateEnablement();
+ }
+
+ private void updateEnablement() {
+ if (!extendedMonitor) {
+ return;
+ }
+ boolean nameFilled = (!firstName.getText().equals("") && !lastName.getText().equals("") && !emailAddress.getText()
+ .equals(""))
+ || anon;
+ // if(nameFilled){
+ // getExistingUid.setEnabled(true);
+ boolean jobFilled = !jobFunction.equals(SELECT_BELOW) && !companyFunction.equals(SELECT_BELOW)
+ && !companySize.equals(SELECT_BELOW);
+ // if(jobFilled){
+ // getNewUid.setEnabled(true);
+ // } else {
+ // getNewUid.setEnabled(false);
+ // }
+ if (nameFilled && jobFilled) {
+ getNewUid.setEnabled(true);
+ getExistingUid.setEnabled(true);
+ } else {
+ getExistingUid.setEnabled(false);
+ getNewUid.setEnabled(false);
+ }
+ }
+
+ public boolean hasAllFields(boolean existing) {
+ if (!extendedMonitor) {
+ return true;
+ }
+ boolean nameFilled = !firstName.getText().equals("") && !lastName.getText().equals("")
+ && !emailAddress.getText().equals("");
+ if (!existing) {
+ boolean jobFilled = !jobFunction.equals(SELECT_BELOW) && !companyFunction.equals(SELECT_BELOW)
+ && !companySize.equals(SELECT_BELOW);
+ return (jobFilled && nameFilled);
+ } else {
+ return nameFilled || anon;
+ }
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (hasAllFields(true) && hasValidated) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ if (isPageComplete() && performUpload) {
+ wizard.addPage(wizard.getUploadPage());
+ }
+
+ return super.getNextPage();
+
+ }
+
+ public boolean isAnonymous() {
+ return anon;
+ }
+
+ public String getEmailAddress() {
+ return email;
+ }
+
+ public String getFirstName() {
+ return first;
+ }
+
+ public String getLastName() {
+ return last;
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/NewUsageSummaryEditorWizard.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/NewUsageSummaryEditorWizard.java
new file mode 100644
index 0000000..045f3f4
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/NewUsageSummaryEditorWizard.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.wizards;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
+import org.eclipse.mylyn.internal.monitor.core.collection.ViewUsageCollector;
+import org.eclipse.mylyn.internal.monitor.usage.MonitorFileRolloverJob;
+import org.eclipse.mylyn.internal.monitor.usage.collectors.PerspectiveUsageCollector;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Meghan Allen
+ */
+public class NewUsageSummaryEditorWizard extends Wizard implements INewWizard {
+
+ private static final String TITLE = "New Usage Summary Report";
+
+ private UsageSummaryEditorWizardPage usageSummaryPage;
+
+ public NewUsageSummaryEditorWizard() {
+ super();
+ init();
+ setWindowTitle(TITLE);
+ }
+
+ private void init() {
+ usageSummaryPage = new UsageSummaryEditorWizardPage();
+ }
+
+ @Override
+ public boolean performFinish() {
+
+ if (!usageSummaryPage.includePerspective() && !usageSummaryPage.includeViews()) {
+ return false;
+ }
+
+ List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
+
+ if (usageSummaryPage.includePerspective()) {
+ collectors.add(new PerspectiveUsageCollector());
+ }
+ if (usageSummaryPage.includeViews()) {
+ ViewUsageCollector mylynViewUsageCollector = new ViewUsageCollector();
+ collectors.add(mylynViewUsageCollector);
+ }
+
+ MonitorFileRolloverJob job = new MonitorFileRolloverJob(collectors);
+ job.setPriority(Job.LONG);
+ job.schedule();
+
+ return true;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // ignore
+
+ }
+
+ @Override
+ public void addPages() {
+ addPage(usageSummaryPage);
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageFileSelectionWizardPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageFileSelectionWizardPage.java
new file mode 100644
index 0000000..8a7b3da
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageFileSelectionWizardPage.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.wizards;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.monitor.usage.MonitorFileRolloverJob;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+public class UsageFileSelectionWizardPage extends WizardPage {
+
+ private final static String PAGE_TITLE = "Select any archived Mylyn usage files you wish to upload";
+
+ private static final String DESCRIPTION = "Please select the archived usage files you want to upload to eclipse.org";
+
+ private Table zippedFilesTable;
+
+ public static final String SUBMISSION_LOG_FILE_NAME = "submittedUsageLogs.txt";
+
+ protected UsageFileSelectionWizardPage(String pageName) {
+ super("org.eclipse.mylyn.monitor.usage.fileSelectionPage", PAGE_TITLE,
+ AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.ID_PLUGIN,
+ "icons/wizban/banner-submission.gif"));
+ setDescription(DESCRIPTION);
+ }
+
+ private static List<File> getBackupFiles() {
+ ArrayList<File> backupFiles = new ArrayList<File>();
+ try {
+
+ String destination = MonitorFileRolloverJob.getZippedMonitorFileDirPath();
+
+ File backupFolder = new File(destination);
+
+ if (backupFolder.exists()) {
+ File[] files = backupFolder.listFiles();
+ File submissionLogFile = new File(destination, SUBMISSION_LOG_FILE_NAME);
+
+ if (!submissionLogFile.exists()) {
+ submissionLogFile.createNewFile();
+ }
+
+ FileInputStream inputStream = new FileInputStream(submissionLogFile);
+
+ int bytesRead = 0;
+ byte[] buffer = new byte[1000];
+
+ String fileContents = "";
+
+ if (submissionLogFile.exists()) {
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ fileContents += new String(buffer, 0, bytesRead);
+
+ }
+ }
+ for (File file : files) {
+ if (file.getName().contains(MonitorFileRolloverJob.BACKUP_FILE_SUFFIX)
+ && !fileContents.contains(file.getName())) {
+ backupFiles.add(file);
+ }
+ }
+
+ }
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+
+ }
+ return backupFiles;
+ }
+
+ public static boolean unsubmittedLogsExist() {
+ List<File> backupFiles = getBackupFiles();
+ return backupFiles.size() > 0;
+ }
+
+ private void addZippedFileView(Composite composite) {
+ zippedFilesTable = new Table(composite, SWT.BORDER | SWT.MULTI);
+
+ GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).grab(true, true).applyTo(zippedFilesTable);
+
+ TableColumn filenameColumn = new TableColumn(zippedFilesTable, SWT.LEFT);
+ filenameColumn.setWidth(200);
+
+ List<File> backupFiles = getBackupFiles();
+
+ File[] backupFileArray = backupFiles.toArray(new File[backupFiles.size()]);
+
+ if (backupFileArray != null && backupFileArray.length > 0) {
+ Arrays.sort(backupFileArray, new Comparator<File>() {
+ public int compare(File file1, File file2) {
+ return (new Long((file1).lastModified()).compareTo(new Long((file2).lastModified()))) * -1;
+ }
+
+ });
+ for (File file : backupFileArray) {
+ TableItem item = new TableItem(zippedFilesTable, SWT.NONE);
+ item.setData(file.getAbsolutePath());
+ item.setText(file.getName());
+ }
+ }
+ }
+
+ public void createControl(Composite parent) {
+ try {
+ Composite container = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(3, false);
+ layout.verticalSpacing = 15;
+ container.setLayout(layout);
+ addZippedFileView(container);
+ setControl(container);
+ // setPageComplete(validate());
+ } catch (RuntimeException e) {
+ // FIXME what exception is caught here?
+ StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Could not create import wizard page", e));
+ }
+ }
+
+ public List<String> getZipFilesSelected() {
+
+ List<String> list = new ArrayList<String>();
+ if (zippedFilesTable.getSelectionCount() >= 1) {
+ TableItem[] selectedItems = zippedFilesTable.getSelection();
+ for (TableItem selectedItem : selectedItems) {
+ list.add(selectedItem.getText());
+ }
+ } else {
+ list.add("<unspecified>");
+ }
+ return list;
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSubmissionWizard.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSubmissionWizard.java
new file mode 100644
index 0000000..4784165
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSubmissionWizard.java
@@ -0,0 +1,740 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage.wizards;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
+import java.net.NoRouteToHostException;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.multipart.FilePart;
+import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
+import org.apache.commons.httpclient.methods.multipart.Part;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.commons.core.ZipFileUtil;
+import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
+import org.eclipse.mylyn.internal.monitor.usage.MonitorFileRolloverJob;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage;
+import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * A wizard for uploading the Mylyn statistics to a website
+ *
+ * @author Shawn Minto
+ */
+public class UsageSubmissionWizard extends Wizard implements INewWizard {
+
+ public static final String LOG = "log";
+
+ public static final String STATS = "usage";
+
+ public static final String QUESTIONAIRE = "questionaire";
+
+ public static final String BACKGROUND = "background";
+
+ private static final String ORG_ECLIPSE_PREFIX = "org.eclipse.";
+
+ public static final int HTTP_SERVLET_RESPONSE_SC_OK = 200;
+
+ public static final int SIZE_OF_INT = 8;
+
+ private boolean failed = false;
+
+ private boolean displayBackgroundPage = false;
+
+ private boolean displayFileSelectionPage = false;
+
+ /** The id of the user */
+ private int uid;
+
+ private final File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+
+ private static int processedFileCount = 1;
+
+ private UsageUploadWizardPage uploadPage;
+
+ private UsageFileSelectionWizardPage fileSelectionPage;
+
+ // private GetNewUserIdPage getUidPage;
+
+ private AbstractStudyQuestionnairePage questionnairePage;
+
+ private AbstractStudyBackgroundPage backgroundPage;
+
+ private boolean performUpload = true;
+
+ private List<String> backupFilesToUpload;
+
+ public UsageSubmissionWizard() {
+ super();
+ setTitles();
+ init(true);
+ }
+
+ public UsageSubmissionWizard(boolean performUpload) {
+ super();
+ setTitles();
+ init(performUpload);
+ }
+
+ private void setTitles() {
+ super.setDefaultPageImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.ID_PLUGIN,
+ "icons/wizban/banner-user.gif"));
+ super.setWindowTitle("Mylyn Feedback");
+ }
+
+ private void init(boolean performUpload) {
+ this.performUpload = performUpload;
+ setNeedsProgressMonitor(true);
+ uid = UiUsageMonitorPlugin.getDefault().getPreferenceStore().getInt(UiUsageMonitorPlugin.PREF_USER_ID);
+ if (uid == 0 || uid == -1) {
+ uid = this.getNewUid();
+ UiUsageMonitorPlugin.getDefault().getPreferenceStore().setValue(UiUsageMonitorPlugin.PREF_USER_ID, uid);
+ }
+ uploadPage = new UsageUploadWizardPage(this);
+ fileSelectionPage = new UsageFileSelectionWizardPage("TODO, change this string");
+ if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled()) {
+ AbstractStudyBackgroundPage page = UiUsageMonitorPlugin.getDefault()
+ .getStudyParameters()
+ .getBackgroundPage();
+ backgroundPage = page;
+ }
+ if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload) {
+ AbstractStudyQuestionnairePage page = UiUsageMonitorPlugin.getDefault()
+ .getStudyParameters()
+ .getQuestionnairePage();
+ questionnairePage = page;
+ }
+ super.setForcePreviousAndNextButtons(true);
+
+ }
+
+ private File questionnaireFile = null;
+
+ private File backgroundFile = null;
+
+ @Override
+ public boolean performFinish() {
+
+ if (!performUpload) {
+ return true;
+ }
+ if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload && questionnairePage != null) {
+ questionnaireFile = questionnairePage.createFeedbackFile();
+ }
+ if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled() && performUpload && displayBackgroundPage
+ && backgroundPage != null) {
+ backgroundFile = backgroundPage.createFeedbackFile();
+ }
+
+ if (displayFileSelectionPage) {
+ backupFilesToUpload = fileSelectionPage.getZipFilesSelected();
+ }
+
+ // final WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+ // protected void execute(final IProgressMonitor monitor) throws
+ // CoreException {
+ // monitor.beginTask("Uploading user statistics", 3);
+ // performUpload(monitor);
+ // monitor.done();
+ // }
+ // };
+
+ Job j = new Job("Upload User Statistics") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ monitor.beginTask("Uploading user statistics", 3);
+ performUpload(monitor);
+ monitor.done();
+ // op.run(monitor);
+ return Status.OK_STATUS;
+ } catch (Exception e) {
+ Status status = new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, IStatus.ERROR,
+ "Error uploading statistics", e);
+ StatusHandler.log(status);
+ return status;
+ }
+ }
+ };
+ // j.setUser(true);
+ j.setPriority(Job.DECORATE);
+ j.schedule();
+ return true;
+ }
+
+ public void performUpload(IProgressMonitor monitor) {
+ if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled() && performUpload && backgroundFile != null) {
+ upload(backgroundFile, BACKGROUND, monitor);
+
+ if (failed) {
+ failed = false;
+ }
+
+ if (backgroundFile.exists()) {
+ backgroundFile.delete();
+ }
+ }
+
+ if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload && questionnaireFile != null) {
+ upload(questionnaireFile, QUESTIONAIRE, monitor);
+
+ if (failed) {
+ failed = false;
+ }
+
+ if (questionnaireFile.exists()) {
+ questionnaireFile.delete();
+ }
+ }
+ File zipFile = zipFilesForUpload();
+ if (zipFile == null) {
+ return;
+ }
+
+ upload(zipFile, STATS, monitor);
+
+ if (zipFile.exists()) {
+ zipFile.delete();
+ }
+
+ if (!failed) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ // popup a dialog telling the user that the upload was good
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Successful Upload",
+ "Your usage statistics have been successfully uploaded.\n Thank you for participating.");
+ }
+ });
+ }
+
+ UiUsageMonitorPlugin.getDefault().getInteractionLogger().startMonitoring();
+ UiUsageMonitorPlugin.setPerformingUpload(false);
+ return;
+ }
+
+ @Override
+ public boolean performCancel() {
+ UiUsageMonitorPlugin.getDefault().userCancelSubmitFeedback(new Date(), true);
+ return true;
+ }
+
+ @Override
+ public boolean canFinish() {
+ if (!performUpload) {
+ return true;// getUidPage.isPageComplete();
+ } else {
+ return this.getContainer().getCurrentPage() == uploadPage || !performUpload;
+ }
+ }
+
+ public UsageUploadWizardPage getUploadPage() {
+ return uploadPage;
+ }
+
+ /**
+ * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+ * org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // no initialization needed
+ }
+
+ @Override
+ public void addPages() {
+ if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload && questionnairePage != null) {
+ addPage(questionnairePage);
+ }
+ if (performUpload) {
+ if (UsageFileSelectionWizardPage.unsubmittedLogsExist()) {
+ addPage(fileSelectionPage);
+ displayFileSelectionPage = true;
+ }
+ addPage(uploadPage);
+ }
+ }
+
+ public void addBackgroundPage() {
+ if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled() && backgroundPage != null) {
+ addPage(backgroundPage);
+ displayBackgroundPage = true;
+ }
+ }
+
+ /**
+ * Method to upload a file to a cgi script
+ *
+ * @param f
+ * The file to upload
+ */
+ private void upload(File f, String type, IProgressMonitor monitor) {
+ if (failed) {
+ return;
+ }
+
+ int status = 0;
+
+ try {
+ String servletUrl = UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl();
+ final PostMethod filePost = new PostMethod(servletUrl);
+
+ Part[] parts = { new FilePart("temp.txt", f) };
+
+ filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
+
+ final HttpClient client = new HttpClient();
+
+ status = client.executeMethod(filePost);
+ filePost.releaseConnection();
+
+ } catch (final Exception e) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user and log the exception
+ failed = true;
+ if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading", "There was an error uploading the file"
+ + ": \n" + "No network connection. Please try again later");
+ }
+ });
+ } else {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading", "There was an error uploading the file"
+ + ": \n" + e.getClass().getCanonicalName());
+ }
+ });
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Error uploading", e));
+ }
+ }
+
+ monitor.worked(1);
+
+ final String filedesc = f.getName();
+
+ final int httpResponseStatus = status;
+
+ if (status == 401) {
+ // The uid was incorrect so inform the user
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading", "There was an error uploading the " + filedesc
+ + ": \n" + "Your uid was incorrect: " + uid + "\n");
+ }
+ });
+ } else if (status == 407) {
+ failed = true;
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading",
+ "Could not upload because proxy server authentication failed. Please check your proxy server settings.");
+ }
+ });
+ } else if (status != 200) {
+ failed = true;
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading", "There was an error uploading the " + filedesc
+ + ": \n" + "HTTP Response Code " + httpResponseStatus + "\n" + "Please try again later");
+ }
+ });
+ } else {
+ // the file was uploaded successfully
+ }
+
+ }
+
+ public String getMonitorFileName() {
+ return monitorFile.getAbsolutePath();
+ }
+
+ /** The status from the http request */
+ private int status;
+
+ /** the response for the http request */
+ private String resp;
+
+ public int getExistingUid(String firstName, String lastName, String emailAddress, boolean anonymous) {
+ if (failed) {
+ return -1;
+ }
+ try {
+
+ // TODO, do this method properly
+ // create a new post method
+ String url = UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl()
+ + UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl();
+ final GetMethod getUidMethod = new GetMethod(url);
+
+ NameValuePair first = new NameValuePair("firstName", firstName);
+ NameValuePair last = new NameValuePair("lastName", lastName);
+ NameValuePair email = new NameValuePair("email", emailAddress);
+ NameValuePair job = new NameValuePair("jobFunction", "");
+ NameValuePair size = new NameValuePair("companySize", "");
+ NameValuePair buisness = new NameValuePair("companyBuisness", "");
+ NameValuePair contact = new NameValuePair("contact", "");
+ NameValuePair anon = null;
+ if (anonymous) {
+ anon = new NameValuePair("anonymous", "true");
+ } else {
+ anon = new NameValuePair("anonymous", "false");
+ }
+
+ if (UiUsageMonitorPlugin.getDefault().usingContactField()) {
+ getUidMethod.setQueryString(new NameValuePair[] { first, last, email, job, size, buisness, anon,
+ contact });
+ } else {
+ getUidMethod.setQueryString(new NameValuePair[] { first, last, email, job, size, buisness, anon });
+ }
+
+ // create a new client and upload the file
+ final HttpClient client = new HttpClient();
+ UiUsageMonitorPlugin.getDefault().configureProxy(client, url);
+
+ ProgressMonitorDialog pmd = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
+ pmd.run(false, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ monitor.beginTask("Get User Id", 1);
+
+ try {
+ status = client.executeMethod(getUidMethod);
+
+ resp = getData(getUidMethod.getResponseBodyAsStream());
+
+ // release the connection to the server
+ getUidMethod.releaseConnection();
+ } catch (final Exception e) {
+ // there was a problem with the file upload so throw up
+ // an error
+ // dialog to inform the user and log the exception
+ failed = true;
+ if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading",
+ "There was an error getting a new user id: \n"
+ + "No network connection. Please try again later");
+ }
+ });
+ } else {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading",
+ "There was an error getting a new user id: \n"
+ + e.getClass().getCanonicalName() + e.getMessage());
+ }
+ });
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Error uploading", e));
+ }
+ }
+ monitor.worked(1);
+ monitor.done();
+ }
+ });
+
+ if (status != 200) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user
+
+ failed = true;
+
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Getting User ID",
+ "There was an error getting a user id: \n" + "HTTP Response Code " + status + "\n"
+ + "Please try again later");
+ }
+ });
+ } else {
+ resp = resp.substring(resp.indexOf(":") + 1).trim();
+ uid = Integer.parseInt(resp);
+ UiUsageMonitorPlugin.getDefault().getPreferenceStore().setValue(UiUsageMonitorPlugin.PREF_USER_ID, uid);
+ return uid;
+ }
+
+ } catch (final Exception e) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user and log the exception
+ failed = true;
+ if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
+ + "No network connection. Please try again later");
+ }
+ });
+ } else {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
+ + e.getClass().getCanonicalName());
+ }
+ });
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Error uploading", e));
+ }
+ }
+ return -1;
+ }
+
+ public int getNewUid() {
+ final PostMethod filePost = new PostMethod(UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVER
+ + UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVLET_ID);
+
+ filePost.addParameter(new NameValuePair("MylarUserID", ""));
+ final HttpClient client = new HttpClient();
+ int status = 0;
+
+ try {
+ status = client.executeMethod(filePost);
+
+ if (status == HTTP_SERVLET_RESPONSE_SC_OK) {
+ InputStream inputStream = filePost.getResponseBodyAsStream();
+ byte[] buffer = new byte[SIZE_OF_INT];
+ int numBytesRead = inputStream.read(buffer);
+ int uid = new Integer(new String(buffer, 0, numBytesRead)).intValue();
+ filePost.releaseConnection();
+
+ return uid;
+ } else {
+ return -1;
+ }
+
+ } catch (final Exception e) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user and log the exception
+ return -1;
+
+ }
+ }
+
+ public int getNewUid(String firstName, String lastName, String emailAddress, boolean anonymous, String jobFunction,
+ String companySize, String companyFunction, boolean contactEmail) {
+ if (failed) {
+ return -1;
+ }
+ try {
+ addBackgroundPage();
+
+ final PostMethod filePost = new PostMethod(UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVER
+ + UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVLET_ID);
+ filePost.addParameter(new NameValuePair("MylarUserID", ""));
+ final HttpClient client = new HttpClient();
+ int status = 0;
+
+ try {
+ status = client.executeMethod(filePost);
+
+ if (status == 202) {
+ InputStream inputStream = filePost.getResponseBodyAsStream();
+ byte[] buffer = new byte[8];
+ int numBytesRead = inputStream.read(buffer);
+ int uid = new Integer(new String(buffer, 0, numBytesRead)).intValue();
+ filePost.releaseConnection();
+
+ return uid;
+ } else {
+ return -1;
+ }
+
+ } catch (final Exception e) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user and log the exception
+ }
+
+ // NameValuePair first = new NameValuePair("firstName", firstName);
+ // NameValuePair last = new NameValuePair("lastName", lastName);
+ // NameValuePair email = new NameValuePair("email", emailAddress);
+ // NameValuePair job = new NameValuePair("jobFunction",
+ // jobFunction);
+ // NameValuePair size = new NameValuePair("companySize",
+ // companySize);
+ // NameValuePair buisness = new NameValuePair("companyBuisness",
+ // companyFunction);
+ // NameValuePair contact = null;
+ // if (contactEmail) {
+ // contact = new NameValuePair("contact", "true");
+ // } else {
+ // contact = new NameValuePair("contact", "false");
+ // }
+ // NameValuePair anon = null;
+ // if (anonymous) {
+ // anon = new NameValuePair("anonymous", "true");
+ // } else {
+ // anon = new NameValuePair("anonymous", "false");
+ // }
+
+ if (status != 200) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user
+
+ failed = true;
+
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user
+ MessageDialog.openError(null, "Error Getting User ID", "There was an error getting a user id: \n"
+ + "HTTP Response Code " + status + "\n" + "Please try again later");
+ } else {
+ resp = resp.substring(resp.indexOf(":") + 1).trim();
+ uid = Integer.parseInt(resp);
+ UiUsageMonitorPlugin.getDefault().getPreferenceStore().setValue(UiUsageMonitorPlugin.PREF_USER_ID, uid);
+ return uid;
+ }
+
+ } catch (Exception e) {
+ // there was a problem with the file upload so throw up an error
+ // dialog to inform the user and log the exception
+ failed = true;
+ if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
+ MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
+ + "No network connection. Please try again later");
+ } else {
+ MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
+ + e.getClass().getCanonicalName());
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Error uploading", e));
+ }
+ }
+ return -1;
+ }
+
+ private String getData(InputStream i) {
+ String s = "";
+ String data = "";
+ BufferedReader br = new BufferedReader(new InputStreamReader(i));
+ try {
+ while ((s = br.readLine()) != null) {
+ data += s;
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Error uploading", e));
+ }
+ return data;
+ }
+
+ public int getUid() {
+ return uid;
+ }
+
+ public boolean failed() {
+ return failed;
+ }
+
+ private File processMonitorFile(File monitorFile) {
+ File processedFile = new File("processed-" + UiUsageMonitorPlugin.MONITOR_LOG_NAME + processedFileCount++
+ + ".xml");
+ InteractionEventLogger logger = new InteractionEventLogger(processedFile);
+ logger.startMonitoring();
+ List<InteractionEvent> eventList = logger.getHistoryFromFile(monitorFile);
+
+ if (eventList.size() > 0) {
+ for (InteractionEvent event : eventList) {
+ if (event.getOriginId().startsWith(ORG_ECLIPSE_PREFIX)) {
+ logger.interactionObserved(event);
+ }
+ }
+ }
+
+ return processedFile;
+ }
+
+ private void addToSubmittedLogFile(String fileName) {
+ File submissionLogFile = new File(MonitorFileRolloverJob.getZippedMonitorFileDirPath(),
+ UsageFileSelectionWizardPage.SUBMISSION_LOG_FILE_NAME);
+ try {
+ FileWriter fileWriter = new FileWriter(submissionLogFile, true);
+ fileWriter.append(fileName + "\n");
+ fileWriter.flush();
+ fileWriter.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Error unzipping backup monitor log files", e));
+ }
+ }
+
+ private File zipFilesForUpload() {
+ UiUsageMonitorPlugin.setPerformingUpload(true);
+ UiUsageMonitorPlugin.getDefault().getInteractionLogger().stopMonitoring();
+
+ List<File> files = new ArrayList<File>();
+ File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
+ File fileToUpload = this.processMonitorFile(monitorFile);
+ files.add(fileToUpload);
+
+ if (displayFileSelectionPage && backupFilesToUpload.size() > 0) {
+ for (String currFilePath : backupFilesToUpload) {
+ File file = new File(MonitorFileRolloverJob.getZippedMonitorFileDirPath(), currFilePath);
+ if (file.exists()) {
+ List<File> unzippedFiles;
+ try {
+ unzippedFiles = ZipFileUtil.unzipFiles(file, System.getProperty("java.io.tmpdir"),
+ new NullProgressMonitor());
+
+ if (unzippedFiles.size() > 0) {
+ for (File f : unzippedFiles) {
+ files.add(this.processMonitorFile(f));
+ this.addToSubmittedLogFile(currFilePath);
+ }
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN,
+ "Error unzipping backup monitor log files", e));
+ }
+ }
+ }
+ }
+
+ UiUsageMonitorPlugin.getDefault().getInteractionLogger().startMonitoring();
+ try {
+ File zipFile = File.createTempFile(uid + ".", ".zip");
+ ZipFileUtil.createZipFile(zipFile, files);
+ return zipFile;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.ID_PLUGIN, "Error uploading", e));
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSummaryEditorWizardPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSummaryEditorWizardPage.java
new file mode 100644
index 0000000..5ebb1d2
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSummaryEditorWizardPage.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.monitor.usage.wizards;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Meghan Allen
+ */
+public class UsageSummaryEditorWizardPage extends WizardPage implements IWizardPage {
+
+ private static final String TITLE = "Usage Summary and Submission";
+
+ private static final String DESCRIPTION = "Summarizes usage and provides mechanism for uploading to eclipse.org \n"
+ + "server for usage analysis. May take a lot of memory for large histories.";
+
+ private Button perspectiveCheckbox = null;
+
+ private Button viewCheckbox = null;
+
+ public UsageSummaryEditorWizardPage() {
+ super(TITLE);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.ID_PLUGIN,
+ "icons/wizban/banner-usage.gif"));
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.FILL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 1;
+
+ Label label = new Label(container, SWT.LEFT);
+ label.setText("This will run in the background because it may take a long time for large histories.\n"
+ + "The editor will open when the summary has been generated.");
+
+ createCheckboxes(container);
+
+ setControl(container);
+
+ }
+
+ private void createCheckboxes(Composite parent) {
+ Group checkboxGroup = new Group(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+
+ checkboxGroup.setLayout(layout);
+ checkboxGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+ checkboxGroup.setText("Show usage summaries for:");
+ checkboxGroup.setFont(parent.getFont());
+
+ perspectiveCheckbox = new Button(checkboxGroup, SWT.CHECK | SWT.LEFT | SWT.NO_FOCUS);
+ perspectiveCheckbox.setText("Use of perspectives");
+ perspectiveCheckbox.setSelection(true);
+ perspectiveCheckbox.addSelectionListener(new CheckboxSelectionListener());
+
+ viewCheckbox = new Button(checkboxGroup, SWT.CHECK | SWT.LEFT | SWT.NO_FOCUS);
+ viewCheckbox.setText("Use of views");
+ viewCheckbox.setSelection(true);
+ viewCheckbox.addSelectionListener(new CheckboxSelectionListener());
+ }
+
+ public boolean includePerspective() {
+ return perspectiveCheckbox.getSelection();
+ }
+
+ public boolean includeViews() {
+ return viewCheckbox.getSelection();
+ }
+
+ private class CheckboxSelectionListener extends SelectionAdapter {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!perspectiveCheckbox.getSelection() && !viewCheckbox.getSelection()) {
+ setPageComplete(false);
+ } else {
+ setPageComplete(true);
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageUploadWizardPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageUploadWizardPage.java
new file mode 100644
index 0000000..794f37b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageUploadWizardPage.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage.wizards;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Page to upload the file to the server
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class UsageUploadWizardPage extends WizardPage {
+
+ // private static final int MAX_NUM_LINES = 1000;
+
+ /** A text box to hold the address of the server */
+ private Text serverAddrText;
+
+ /** A text box to hold the location of the usage statistics file */
+ private Text usageFileText;
+
+ // /** A text box to hold the location of the log file */
+ // private Text logFileText;
+
+ /** A text file to show the id of the user */
+ private Text idText;
+
+ private final UsageSubmissionWizard wizard;
+
+ /**
+ * Constructor
+ */
+ public UsageUploadWizardPage(UsageSubmissionWizard wizard) {
+ super("Usage Data Submission Wizard");
+
+ setTitle("Usage Data Submission");
+ if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
+ String customizedTitle = UiUsageMonitorPlugin.getDefault().getStudyParameters().getTitle();
+ if (!customizedTitle.equals("")) {
+ setTitle(customizedTitle + ": Usage Data Upload");
+ }
+ }
+
+ setDescription("The usage file listed below will be uploaded along with the archived files you selected (there may not have been any to select from).\n"
+ + "Information about program elements that you worked with is obfuscated to ensure privacy.");
+ // setDescription(
+ // "The files listed below will be uploaded. Information about program
+ // elements that you "
+ // + "worked with is obfuscated to ensure privacy.");
+ this.wizard = wizard;
+ }
+
+ /**
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 1;
+
+ Composite topContainer = new Composite(container, SWT.NULL);
+ GridLayout topContainerLayout = new GridLayout();
+ topContainer.setLayout(topContainerLayout);
+ topContainerLayout.numColumns = 2;
+ topContainerLayout.verticalSpacing = 9;
+
+ Label label;
+ if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
+ label = new Label(parent, SWT.NULL);
+ label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ label.setText(UiUsageMonitorPlugin.getDefault().getCustomizedByMessage());
+ }
+
+ label = new Label(topContainer, SWT.NULL);
+ label.setText("Upload URL:");
+
+ serverAddrText = new Text(topContainer, SWT.BORDER | SWT.SINGLE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ serverAddrText.setLayoutData(gd);
+ serverAddrText.setEditable(false);
+ serverAddrText.setText(UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl());
+
+ label = new Label(topContainer, SWT.NULL);
+ label.setText("Usage file location:");
+
+ usageFileText = new Text(topContainer, SWT.BORDER | SWT.SINGLE);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ usageFileText.setLayoutData(gd);
+ usageFileText.setEditable(false);
+
+ usageFileText.setText(wizard.getMonitorFileName());
+
+ Composite bottomContainer = new Composite(container, SWT.NULL);
+ GridLayout bottomContainerLayout = new GridLayout();
+ bottomContainer.setLayout(bottomContainerLayout);
+ bottomContainerLayout.numColumns = 2;
+
+ Label submissionLabel = new Label(bottomContainer, SWT.NONE);
+ submissionLabel.setText("Only events from org.eclipse.* packages will be submitted to Eclipse.org");
+
+ setControl(container);
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ return null;
+ }
+
+ public void updateUid() {
+ if (idText != null && !idText.isDisposed()) {
+ idText.setText(wizard.getUid() + "");
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyBackgroundPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyBackgroundPage.java
new file mode 100644
index 0000000..95b620b
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyBackgroundPage.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Leah Findlater - initial API and implementation
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.monitor.usage;
+
+import java.io.File;
+
+import org.eclipse.jface.wizard.IWizardPage;
+
+/**
+ * Extend to provide a custom background page.
+ *
+ * @author Leah Findlater
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractStudyBackgroundPage implements IWizardPage {
+
+ public abstract File createFeedbackFile();
+}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyQuestionnairePage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyQuestionnairePage.java
new file mode 100644
index 0000000..2188601
--- /dev/null
+++ b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyQuestionnairePage.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.monitor.usage;
+
+import java.io.File;
+
+import org.eclipse.jface.wizard.WizardPage;
+
+/**
+ * Extend to provide a custom questionnaire page.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractStudyQuestionnairePage extends WizardPage {
+
+ public AbstractStudyQuestionnairePage(String name) {
+ super(name);
+ }
+
+ public abstract File createFeedbackFile();
+}
diff --git a/org.eclipse.mylyn.pde-feature/.project b/org.eclipse.mylyn.pde-feature/.project
new file mode 100644
index 0000000..0eac22e
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.pde-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.pde-feature/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.pde-feature/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..1f0ab58
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 7 elements(s) to 'org.eclipse.mylyn.team-feature'
- Original project: 'org.eclipse.mylyn.pde-feature'
- Destination element: 'org.eclipse.mylyn.team-feature'
- Original elements:
 epl-v10.html
 license.html
 .project
 feature.xml
 about.html
 build.properties
 .settings" description="Copy elements" element1="epl-v10.html" element2="license.html" element3=".project" element4="feature.xml" element5="about.html" element6="build.properties" element7=".settings" files="6" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208492530060" target="/scratch/org.eclipse.mylyn/org.eclipse.mylyn.team-feature" units="0" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.pde-feature'
- Original project: 'org.eclipse.mylyn.pde-feature'
- Original element: 'org.eclipse.mylar.tasklist.prefs'" description="Delete element" element1=".settings/org.eclipse.mylar.tasklist.prefs" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208549268432" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.pde-feature/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.pde-feature/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..d68a5d5
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1208492530060 Copy elements
+1208549268432 Delete element
diff --git a/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..4c9ebcf
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:51 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..992908d
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:12:43 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.pde-feature/about.html b/org.eclipse.mylyn.pde-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.pde-feature/build.properties b/org.eclipse.mylyn.pde-feature/build.properties
new file mode 100644
index 0000000..dcaa2fa
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.pde-feature/epl-v10.html b/org.eclipse.mylyn.pde-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.pde-feature/feature.properties b/org.eclipse.mylyn.pde-feature/feature.properties
new file mode 100644
index 0000000..1187583
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Bridge: Plug-in Development
+description=Mylyn Task-Focused UI extensions for PDE, Ant, Team Support and CVS.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.pde-feature/feature.xml b/org.eclipse.mylyn.pde-feature/feature.xml
new file mode 100644
index 0000000..c4d8a0d
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/feature.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.pde_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.ui" version="3.4.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.pde.ui" version="3.4.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.pde.api.tools.ui"/>
+ <import plugin="org.eclipse.debug.ui"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.search"/>
+ <import plugin="org.eclipse.jdt.core"/>
+ <import plugin="org.eclipse.mylyn.java.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.jdt.launching"/>
+ <import plugin="org.eclipse.jdt.junit"/>
+ <import plugin="org.eclipse.jdt.debug.ui"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.ide.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.resources.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import feature="org.eclipse.mylyn.java_feature" version="3.2.1.qualifier" match="perfect"/>
+ <import feature="org.eclipse.pde" version="3.4.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.pde.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.pde-feature/license.html b/org.eclipse.mylyn.pde-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.pde-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.pde.ui/.classpath b/org.eclipse.mylyn.pde.ui/.classpath
new file mode 100644
index 0000000..30862ad
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/resources/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/search/internal/ui/text/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/pde/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/views/markers/internal/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.pde.ui/.cvsignore b/org.eclipse.mylyn.pde.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.pde.ui/.project b/org.eclipse.mylyn.pde.ui/.project
new file mode 100644
index 0000000..3ae6195
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.pde.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.pde.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.pde.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..26215a6
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.pde.ui' - Original project: 'org.eclipse.mylyn.pde.ui' - Original elements: task-bug.gif task-repository.gif" description="Delete elements" element1="icons/elcl16/task-bug.gif" element2="icons/elcl16/task-repository.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="2" stamp="1181354487183" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.pde.ui' - Original project: 'org.eclipse.mylyn.pde.ui' - Original element: 'etool16'" description="Delete element" element1="icons/etool16" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1181354491145" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.pde.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.pde.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..cff342a
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181354487183 Delete elements
+1181354491145 Delete element
diff --git a/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.pde.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.pde.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8f4eba5
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.pde.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.forms,
+ org.eclipse.jface.text,
+ org.eclipse.ui.ide,
+ org.eclipse.pde.ui;bundle-version="3.4.0",
+ org.eclipse.pde.api.tools.ui,
+ org.eclipse.debug.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.search,
+ org.eclipse.jdt.core,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.jdt.launching,
+ org.eclipse.jdt.junit,
+ org.eclipse.jdt.debug.ui,
+ org.eclipse.jdt.ui,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.ide.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.java.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.resources.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-Activator: org.eclipse.mylyn.internal.pde.ui.PdeUiBridgePlugin
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
+Export-Package: org.eclipse.mylyn.internal.pde.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.pde.ui.junit;x-internal:=true
+Bundle-Localization: plugin
+
diff --git a/org.eclipse.mylyn.pde.ui/about.html b/org.eclipse.mylyn.pde.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.pde.ui/build.properties b/org.eclipse.mylyn.pde.ui/build.properties
new file mode 100644
index 0000000..96a5bea
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ src/,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.pde.ui/icons/elcl16/edge-ref-xml.gif b/org.eclipse.mylyn.pde.ui/icons/elcl16/edge-ref-xml.gif
new file mode 100644
index 0000000..38bf351
Binary files /dev/null and b/org.eclipse.mylyn.pde.ui/icons/elcl16/edge-ref-xml.gif differ
diff --git a/org.eclipse.mylyn.pde.ui/icons/elcl16/file-xml.gif b/org.eclipse.mylyn.pde.ui/icons/elcl16/file-xml.gif
new file mode 100644
index 0000000..8af38f9
Binary files /dev/null and b/org.eclipse.mylyn.pde.ui/icons/elcl16/file-xml.gif differ
diff --git a/org.eclipse.mylyn.pde.ui/icons/elcl16/focus-disabled.gif b/org.eclipse.mylyn.pde.ui/icons/elcl16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.pde.ui/icons/elcl16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.pde.ui/icons/elcl16/focus.gif b/org.eclipse.mylyn.pde.ui/icons/elcl16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.pde.ui/icons/elcl16/focus.gif differ
diff --git a/org.eclipse.mylyn.pde.ui/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.pde.ui/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.pde.ui/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.pde.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.pde.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.pde.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.pde.ui/plugin.properties b/org.eclipse.mylyn.pde.ui/plugin.properties
new file mode 100644
index 0000000..6aeb550
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/plugin.properties
@@ -0,0 +1,11 @@
+#Properties file for org.eclipse.mylyn.pde.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn PDE Bridge
+
+javaCompletionProposalComputer.name = PDE API Tools Proposals (Focused)
+
+bridges.activeSearchLabel=XML Search
+PdeStructureBridge.name = PDE Structure Bridge
+
+TaskContextPdeJUnitLaunchConfiguration.name = Task Context Plug-in Test
+TaskContextPdeJUnitTabGroup.description = Test suite automatically populated by elements in the task context.
diff --git a/org.eclipse.mylyn.pde.ui/plugin.xml b/org.eclipse.mylyn.pde.ui/plugin.xml
new file mode 100644
index 0000000..891461f
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/plugin.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension point="org.eclipse.mylyn.context.ui.bridges">
+ <uiBridge
+ class="org.eclipse.mylyn.internal.pde.ui.PdeUiBridge"
+ contentType="plugin.xml"
+ activeSearchIcon="icons/elcl16/edge-ref-xml.gif"
+ activeSearchLabel="%bridges.activeSearchLabel"/>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.context.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.pde.ui.PdeUiBridgePlugin$PdeUiBrideStartup">
+ </startup>
+ </extension>
+
+ <extension point="org.eclipse.mylyn.context.core.bridges">
+ <structureBridge
+ class="org.eclipse.mylyn.internal.pde.ui.PdeStructureBridge"
+ name="%PdeStructureBridge.name"
+ parentContentType="resource"/>
+ </extension>
+
+
+ <extension
+ id="apitools_javadoc_proposals"
+ name="%javaCompletionProposalComputer.name"
+ point="org.eclipse.jdt.ui.javaCompletionProposalComputer">
+ <javaCompletionProposalComputer
+ activate="true"
+ categoryId="org.eclipse.mylyn.java.ui.javaAllProposalCategory"
+ class="org.eclipse.mylyn.internal.pde.ui.FocusedApiToolsJavadocCompletionProposalComputer">
+ <partition
+ type="__java_javadoc">
+ </partition>
+ </javaCompletionProposalComputer>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.debug.core.launchConfigurationTypes">
+ <launchConfigurationType
+ sourceLocatorId="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"
+ name="%TaskContextPdeJUnitLaunchConfiguration.name"
+ sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer"
+ delegate="org.eclipse.mylyn.internal.pde.ui.junit.TaskContextPdeJUnitLaunchConfiguration"
+ modes="run, debug"
+ id="org.eclipse.mylyn.pde.junit.launchconfig">
+ </launchConfigurationType>
+ </extension>
+
+ <extension
+ point="org.eclipse.debug.ui.launchConfigurationTabGroups">
+ <launchConfigurationTabGroup
+ type="org.eclipse.mylyn.pde.junit.launchconfig"
+ helpContextId="org.eclipse.jdt.junit.junit_tab_group"
+ class="org.eclipse.mylyn.internal.pde.ui.junit.TaskContextPdeJUnitTabGroup"
+ id="org.eclipse.mylyn.pde.junit.launchconfig.tabgroup">
+ <launchMode
+ perspective="org.eclipse.debug.ui.DebugPerspective"
+ description="%TaskContextPdeJUnitTabGroup.description"
+ mode="debug">
+ </launchMode>
+ <launchMode
+ description="%TaskContextPdeJUnitTabGroup.description"
+ mode="run">
+ </launchMode>
+ </launchConfigurationTabGroup>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/FocusedApiToolsJavadocCompletionProposalComputer.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/FocusedApiToolsJavadocCompletionProposalComputer.java
new file mode 100644
index 0000000..64e3e35
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/FocusedApiToolsJavadocCompletionProposalComputer.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
+import org.eclipse.mylyn.internal.java.ui.JavaUiUtil;
+import org.eclipse.pde.api.tools.ui.internal.completion.APIToolsJavadocCompletionProposalComputer;
+
+/**
+ * Legacy computer that support API tooling content assist on Eclipse 3.4.
+ *
+ * @author Steffen Pingel
+ */
+// TODO e3.5 remove this class
+ at SuppressWarnings("restriction")
+public class FocusedApiToolsJavadocCompletionProposalComputer extends APIToolsJavadocCompletionProposalComputer {
+
+ private static final String ASSIST_API_TOOLS = "org.eclipse.pde.api.tools.ui.apitools_proposal_category"; //$NON-NLS-1$
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
+ if (JavaUiUtil.getProposalCategory(ASSIST_API_TOOLS) == null
+ && !JavaUiUtil.isDefaultAssistActive(JavaUiUtil.ASSIST_JDT_NOTYPE)) {
+ // on Eclipse 3.4 this was part of javaNoTypeProposalCategory, only return results if that is not enabled to avoid duplicates
+ return super.computeCompletionProposals(context, monitor);
+ } else {
+ // on Eclipse 3.5 this is a separate computer contributed by API tooling, don't do anything in that case
+ return Collections.emptyList();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/Messages.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/Messages.java
new file mode 100644
index 0000000..5dda055
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.pde.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String PdeContextLabelProvider_referenced_by;
+
+ public static String XmlJavaRelationProvider_Skipped_XML_search;
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeContextLabelProvider.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeContextLabelProvider.java
new file mode 100644
index 0000000..5fa6977
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeContextLabelProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.internal.context.ui.AbstractContextLabelProvider;
+import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
+import org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class PdeContextLabelProvider extends AbstractContextLabelProvider {
+
+ public static final String LABEL_RELATION = Messages.PdeContextLabelProvider_referenced_by;
+
+ @Override
+ protected Image getImage(IInteractionElement node) {
+ return ContextUiImages.getImage(ContextUiImages.FILE_XML);
+ }
+
+ @Override
+ protected Image getImage(IInteractionRelation edge) {
+ return ContextUiImages.getImage(IdeUiBridgePlugin.EDGE_REF_XML);
+ }
+
+ @Override
+ protected String getText(IInteractionElement node) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(PdeStructureBridge.CONTENT_TYPE);
+ return bridge.getLabel(bridge.getObjectForHandle(node.getHandleIdentifier()));
+ }
+
+ @Override
+ protected String getText(IInteractionRelation edge) {
+ return LABEL_RELATION;
+ }
+
+ @Override
+ protected Image getImageForObject(Object object) {
+ return ContextUiImages.getImage(ContextUiImages.FILE_XML);
+ }
+
+ @Override
+ protected String getTextForObject(Object object) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(PdeStructureBridge.CONTENT_TYPE);
+ return bridge.getLabel(object);
+ }
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeEditingMonitor.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeEditingMonitor.java
new file mode 100644
index 0000000..a6f79a9
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeEditingMonitor.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import java.util.Locale;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.plugin.IPluginObject;
+import org.eclipse.pde.internal.core.plugin.ImportObject;
+import org.eclipse.pde.internal.core.text.IDocumentAttributeNode;
+import org.eclipse.pde.internal.core.text.IDocumentElementNode;
+import org.eclipse.pde.internal.core.text.plugin.PluginModel;
+import org.eclipse.pde.internal.core.text.plugin.PluginObjectNode;
+import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
+import org.eclipse.pde.internal.ui.editor.plugin.ManifestSourcePage;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class PdeEditingMonitor extends AbstractUserInteractionMonitor {
+
+ public PdeEditingMonitor() {
+ super();
+ }
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ if (part instanceof ManifestEditor) {
+ TextSelection textSelection = null;
+ IEditorInput in = null;
+
+ // assume that we are editing an xml file due to the editor used
+ // this is the plugin.xml editor
+
+ ManifestEditor editor = (ManifestEditor) part;
+
+ // fix bug when user is looking in the cvs repository since the
+ // input
+ // is not a FileEditorInput
+ if (!(editor.getEditorInput() instanceof FileEditorInput)) {
+ return;
+ }
+
+ // make sure that the selection is a text selection
+ if (!(editor.getSelection() instanceof TextSelection || editor.getSelection() instanceof StructuredSelection)) {
+ return;
+ } else if (editor.getSelection() instanceof StructuredSelection) {
+ StructuredSelection s = (StructuredSelection) editor.getSelection();
+ if (s.getFirstElement() instanceof PluginObjectNode) {
+ PluginObjectNode n = (PluginObjectNode) s.getFirstElement();
+ textSelection = new TextSelection(n.getOffset(), n.getLength());
+ } else if (s.getFirstElement() instanceof ImportObject) {
+ ImportObject io = (ImportObject) s.getFirstElement();
+ if (io.getImport() instanceof PluginObjectNode) {
+ PluginObjectNode n = (PluginObjectNode) io.getImport();
+ textSelection = new TextSelection(n.getOffset(), n.getLength());
+ }
+ } else {
+ return;
+ }
+ } else {
+ // get the selection and the editor input
+ textSelection = (TextSelection) editor.getSelection();
+ }
+ in = editor.getEditorInput();
+
+ // check if we have a text selection
+ if (textSelection != null) {
+ try {
+
+ // get the node for the selection
+ int offset = textSelection.getOffset();
+ PluginObjectNode node = getNode(editor, offset, false);
+
+ if (node != null) {
+ FileEditorInput fei = (FileEditorInput) in;
+
+ // fix a bug when there is a selection and the editor
+ // input is the manifest.mf file
+ // not the plugin.xml
+ if (fei.getFile().getFullPath().toString().toLowerCase(Locale.ENGLISH).endsWith("/manifest.mf")) { //$NON-NLS-1$
+ return;
+ }
+
+ String nodeString = getStringOfNode(node);
+ if (nodeString == null) {
+ return;
+ }
+
+ // create the helper to get the handle for the node
+ XmlNodeHelper xnode = new XmlNodeHelper(fei.getFile().getFullPath().toString(),
+ nodeString.hashCode());
+
+ // get the name for the node
+// String name = node.getXMLAttributeValue("name");
+// if (name == null)
+// name = node.getXMLTagName();
+ super.handleElementSelection(part, xnode, contributeToContext);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN,
+ "Could not resolve selection", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ public static String getStringOfNode(IDocumentElementNode node) {
+ if (node == null) {
+ return null;
+ }
+ String s = node.getXMLTagName();
+ for (IDocumentAttributeNode a : node.getNodeAttributes()) {
+ s += a.getAttributeName() + "=" + a.getAttributeValue(); //$NON-NLS-1$
+ }
+ return s;
+ }
+
+ /**
+ * COPIED FROM ManifestSourcePage - from a getRangeElement body
+ */
+ public static PluginObjectNode getNode(ManifestEditor editor, int offset, boolean hashCode) {
+ ManifestSourcePage page = (ManifestSourcePage) editor.findPage("plugin-context"); //$NON-NLS-1$
+ if (page != null) {
+ IPluginModelBase model = (IPluginModelBase) page.getInputContext().getModel();
+ PluginObjectNode node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getLibraries(),
+ offset, hashCode);
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getImports(), offset,
+ hashCode);
+ }
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getExtensionPoints(),
+ offset, hashCode);
+ }
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getExtensions(), offset,
+ hashCode);
+ }
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(new IPluginObject[] { model.getPluginBase() },
+ offset, hashCode);
+ }
+ return node;
+ }
+ return null;
+ }
+
+ public static PluginObjectNode getNode(IDocument d, IFile f, int num, boolean hashCode) throws CoreException {
+ PluginModel model = new PluginModel(d, true);
+ model.setUnderlyingResource(f);
+ if (!model.isLoaded()) {
+ model.load();
+ model.setEnabled(true);
+ }
+
+ PluginObjectNode node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getLibraries(),
+ num, hashCode);
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getImports(), num, hashCode);
+ }
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getExtensionPoints(), num,
+ hashCode);
+ }
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(model.getPluginBase().getExtensions(), num, hashCode);
+ }
+ if (node == null) {
+ node = (PluginObjectNode) PdeEditingMonitor.findNode(new IPluginObject[] { model.getPluginBase() }, num,
+ hashCode);
+ }
+ return node;
+ }
+
+ /**
+ * COPIED FROM ManifestSourcePage
+ */
+ private static IDocumentElementNode findNode(IPluginObject[] nodes, int offset, boolean hashCode) {
+ for (IPluginObject node3 : nodes) {
+ IDocumentElementNode node = (IDocumentElementNode) node3;
+ IDocumentElementNode[] children = node.getChildNodes();
+
+ // changed region - added to check the children to make it work
+ // properly
+ IDocumentElementNode node2 = null;
+ if (children.length > 0) {
+ node2 = PdeEditingMonitor.findNode(children, offset, hashCode);
+ // end changed region
+ }
+
+ if (node2 != null && node2 instanceof IPluginObject) {
+ return node2;
+ }
+
+ if (!hashCode) {
+ if (offset >= node.getOffset() && offset < node.getOffset() + node.getLength()) {
+ return node;
+ }
+ } else {
+ if (getStringOfNode(node).hashCode() == offset) {
+ return node;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Copy of previous, taking different arguments
+ */
+ private static IDocumentElementNode findNode(IDocumentElementNode[] nodes, int offset, boolean hashCode) {
+ for (IDocumentElementNode node : nodes) {
+ IDocumentElementNode[] children = node.getChildNodes();
+ IDocumentElementNode node2 = null;
+ if (children.length > 0) {
+ node2 = PdeEditingMonitor.findNode(children, offset, hashCode);
+ }
+ if (node2 != null) {
+ return node2;
+ }
+
+ if (!hashCode) {
+ if (offset >= node.getOffset() && offset < node.getOffset() + node.getLength()) {
+ return node;
+ }
+ } else {
+ if (getStringOfNode(node).hashCode() == offset) {
+ return node;
+ }
+ }
+ }
+ return null;
+ }
+}
+
+// XXX used if we support the xmen editor
+// if (part instanceof XMLTextEditor) {
+// XMLTextEditor editor = (XMLTextEditor)part;
+// TextSelection textSelection =
+// (TextSelection)editor.getSelectionProvider().getSelection();
+// if (textSelection != null) {
+//
+// try{
+// // get the model for the xml elements
+// XMLReconciler rec = editor.getModel();
+//
+// int start = textSelection.getStartLine();
+// int end = textSelection.getEndLine();
+//
+// // get the node that was selected
+// XMLNode node = rec.getNodeFromLine(start);
+//
+// ContextCorePlugin.getTaskscapeManager().handleElementSelected(
+// node.getHandle(), node.getCanName(),
+// IDegreeOfInterest.Value.Selections,
+// ITaskscapeNode.Kind.XML);
+//
+// }catch(Exception e){
+// //handle properly
+// }
+// }
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeStructureBridge.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeStructureBridge.java
new file mode 100644
index 0000000..21ce4bf
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeStructureBridge.java
@@ -0,0 +1,361 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.core.internal.resources.Marker;
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.pde.internal.core.text.build.BuildEntry;
+import org.eclipse.pde.internal.core.text.plugin.PluginNode;
+import org.eclipse.pde.internal.core.text.plugin.PluginObjectNode;
+import org.eclipse.pde.internal.ui.editor.PDEFormPage;
+import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.markers.internal.ConcreteMarker;
+
+/**
+ * @author Mik Kersten
+ *
+ */
+ at SuppressWarnings("restriction")
+public class PdeStructureBridge extends AbstractContextStructureBridge {
+
+ public final static String CONTENT_TYPE = "plugin.xml"; //$NON-NLS-1$
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ if (elementHandle.endsWith(".xml")) { //$NON-NLS-1$
+ return parentContentType;
+ } else {
+ return CONTENT_TYPE;
+ }
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ // we can only get the parent if we have a PluginObjectNode
+
+ Object object = getObjectForHandle(handle);
+ if (object instanceof PluginObjectNode) {
+ PluginObjectNode parent = (PluginObjectNode) ((PluginObjectNode) object).getParentNode();
+ if (parent != null) {
+ return getHandleIdentifier(parent);
+ } else {
+ // the parent is the plugin.xml file, so return that handle
+ int delimeterIndex = handle.indexOf(";"); //$NON-NLS-1$
+ if (delimeterIndex != -1) {
+ String parentHandle = handle.substring(0, delimeterIndex);
+ return parentHandle;
+ } else {
+ return null;
+ }
+ }
+ } else if (object instanceof PluginNode) {
+ PluginNode parent = (PluginNode) ((PluginNode) object).getParentNode();
+ if (parent != null) {
+ return getHandleIdentifier(parent);
+ } else {
+ // the parent is the plugin.xml file, so return that handle
+ int delimeterIndex = handle.indexOf(";"); //$NON-NLS-1$
+ if (delimeterIndex != -1) {
+ String parentHandle = handle.substring(0, delimeterIndex);
+ return parentHandle;
+ } else {
+ return null;
+ }
+ }
+ } else if (object instanceof IFile) {
+ // String fileHandle = parentBridge.getParentHandle(handle);
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ return parentBridge.getParentHandle(handle);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getObjectForHandle(java.lang.String)
+ */
+ @Override
+ public Object getObjectForHandle(String handle) {
+ if (handle == null) {
+ return null;
+ }
+ int first = handle.indexOf(";"); //$NON-NLS-1$
+ String filename = ""; //$NON-NLS-1$
+ if (first == -1) {
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ return parentBridge.getObjectForHandle(handle);
+ } else {
+ // extract the filename from the handle since it represents a node
+ filename = handle.substring(0, first);
+ }
+
+ try {
+ // get the file and create a FileEditorInput
+ IPath path = new Path(filename);
+ IFile f = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+
+ // get the start line for the element
+ int start = Integer.parseInt(handle.substring(first + 1));
+
+ // // get the content and the document so that we can get the offset
+ // String content = XmlNodeHelper.getContents(f.getContents());
+ // IDocument d = new Document(content);
+
+ // get the offsets for the element
+ // make sure that we are on a character and not whitespace
+ // int offset = d.getLineOffset(start);
+ // while(d.getChar(offset) == ' ')
+ // offset++;
+
+ // get the current editor which should be the ManifestEditor so that
+ // we can get the element that we want
+ IEditorPart editorPart = null;
+ try {
+ editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+ } catch (NullPointerException e) {
+ // do nothing, this just means that there is no active page
+ }
+ if (editorPart != null && editorPart instanceof ManifestEditor) {
+ PluginObjectNode node = PdeEditingMonitor.getNode((ManifestEditor) editorPart, start, true);
+ // get the element based on the offset
+ return node;
+ } else {
+ String content = XmlNodeHelper.getContents(f.getContents());
+ IDocument d = new Document(content);
+ PluginObjectNode node = PdeEditingMonitor.getNode(d, f, start, true);
+ return node;
+ }
+ } catch (Exception e) {
+ // ignore, means file doesn't exist
+ // ContextCorePlugin.log(e, "handle failed");
+ }
+ return null;
+ }
+
+ /**
+ * Handle is filename;hashcodeOfElementAndAttributes
+ *
+ * @see org.eclipse.mylyn.context.core.AbstractContextStructureBridge#getHandleIdentifier(java.lang.Object)
+ */
+ @Override
+ public String getHandleIdentifier(Object object) {
+ // we can only create handles for PluginObjectNodes and plugin.xml files
+ if (object instanceof XmlNodeHelper) {
+ return ((XmlNodeHelper) object).getHandle();
+ } else if (object instanceof PluginObjectNode) {
+ PluginObjectNode node = (PluginObjectNode) object;
+ try {
+ // get the handle for the PluginObjectNode
+ if (node.getModel() == null || node.getModel().getUnderlyingResource() == null
+ || node.getModel().getUnderlyingResource().getFullPath() == null) {
+ // ContextCorePlugin.log("PDE xml node's resource or model is
+ // null: " + node.getName(), this);
+ return null;
+ }
+ IPath path = new Path(node.getModel().getUnderlyingResource().getFullPath().toString());
+ IFile file = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+ String handle = new XmlNodeHelper(file.getFullPath().toString(),
+ PdeEditingMonitor.getStringOfNode(node).hashCode()).getHandle();
+ return handle;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN, "Could not get handle", e)); //$NON-NLS-1$
+ }
+ } else if (object instanceof PluginNode) {
+ PluginNode node = (PluginNode) object;
+ try {
+ if (node.getModel() == null || node.getModel().getUnderlyingResource() == null
+ || node.getModel().getUnderlyingResource().getFullPath() == null) {
+ // ContextCorePlugin.log("PDE xml node's resource or model is
+ // null: " + node.getName(), this);
+ return null;
+ }
+ IPath path = new Path(node.getModel().getUnderlyingResource().getFullPath().toString());
+ IFile file = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+ String handle = new XmlNodeHelper(file.getFullPath().toString(),
+ PdeEditingMonitor.getStringOfNode(node).hashCode()).getHandle();
+ return handle;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN, "Could not get handle", e)); //$NON-NLS-1$
+ }
+
+ } else if (object instanceof File) {
+ // get the handle for the file if it is plugin.xml
+ File file = (File) object;
+ if (file.getFullPath().toString().endsWith("plugin.xml")) { //$NON-NLS-1$
+ return file.getFullPath().toString();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof PluginObjectNode) {
+ PluginObjectNode node = (PluginObjectNode) object;
+ String name = node.getXMLAttributeValue("name"); //$NON-NLS-1$
+ if (name == null) {
+ name = node.getXMLTagName();
+ }
+ name = node.getModel().getUnderlyingResource().getName() + ": " + name; //$NON-NLS-1$
+ return name;
+ } else if (object instanceof File) {
+ File file = (File) object;
+ if (file.getFullPath().toString().endsWith("plugin.xml")) { //$NON-NLS-1$
+ return "plugin.xml"; //$NON-NLS-1$
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * TODO: make a non-handle based test
+ */
+ @Override
+ public boolean canBeLandmark(String handle) {
+ if (handle == null) {
+ return false;
+ } else {
+ return handle.indexOf(';') == -1;
+ }
+ }
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ // we only accept PluginObjectNodes and plugin.xml Files
+ if (object instanceof PluginNode || object instanceof PluginObjectNode || object instanceof BuildEntry
+ || object instanceof PDEFormPage) {
+ return true;
+ } else if (object instanceof XmlNodeHelper) {
+ if (((XmlNodeHelper) object).getFilename().endsWith("plugin.xml")) { //$NON-NLS-1$
+ return true;
+ }
+ } else if (object instanceof File) {
+ File file = (File) object;
+ if (file.getFullPath().toString().endsWith("plugin.xml")) { //$NON-NLS-1$
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return true;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return handle.indexOf(';') == -1;
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object object, int offset) {
+ if (object == null) {
+ return null;
+ }
+
+ IResource markerResource = null;
+ try {
+ if (object instanceof ConcreteMarker) {
+ markerResource = ((ConcreteMarker) object).getMarker().getResource();
+ } else if (object instanceof Marker) {
+ markerResource = ((Marker) object).getResource();
+ }
+ } catch (Exception e) {
+ return null;
+ }
+
+ if (markerResource != null) {
+ // we can only get a handle for a marker with the resource
+ // plugin.xml
+ try {
+ if (markerResource instanceof IFile) {
+ IFile file = (IFile) markerResource;
+ if (file.getFullPath().toString().endsWith("plugin.xml")) { //$NON-NLS-1$
+ return file.getFullPath().toString();
+ } else {
+ return null;
+ }
+ }
+ return null;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.WARNING, PdeUiBridgePlugin.ID_PLUGIN,
+ "Could not find element for: " + object)); //$NON-NLS-1$
+ return null;
+ }
+ } else if (object instanceof IFile) {
+ try {
+ IFile file = (IFile) object;
+ if (file.getFullPath().toString().endsWith("plugin.xml")) { //$NON-NLS-1$
+ String content = XmlNodeHelper.getContents(file.getContents());
+ IDocument d = new Document(content);
+ PluginObjectNode node = PdeEditingMonitor.getNode(d, file, offset, false);
+ String handle = new XmlNodeHelper(file.getFullPath().toString(), PdeEditingMonitor.getStringOfNode(
+ node).hashCode()).getHandle();
+ return handle;
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN,
+ "Unable to get handle for offset in object", e)); //$NON-NLS-1$
+ }
+ }
+ return null;
+ }
+
+// public IProject getProjectForObject(Object object) {
+// while (!(object instanceof IFile)) {
+// String handle = getParentHandle(getHandleIdentifier(object));
+// if (handle == null)
+// break;
+// object = getObjectForHandle(handle);
+// }
+// if (object instanceof IFile && acceptsObject(object)) {
+// return ((IFile) object).getProject();
+// }
+// return null;
+// }
+
+ public boolean containsProblem(IInteractionElement node) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeUiBridge.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeUiBridge.java
new file mode 100644
index 0000000..89fcd4b
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeUiBridge.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.pde.internal.core.text.plugin.PluginObjectNode;
+import org.eclipse.pde.internal.ui.editor.FormOutlinePage;
+import org.eclipse.pde.internal.ui.editor.ISortableContentOutlinePage;
+import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
+import org.eclipse.pde.internal.ui.editor.PDESourcePage;
+import org.eclipse.pde.internal.ui.editor.SourceOutlinePage;
+import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
+import org.eclipse.pde.internal.ui.editor.plugin.PluginInputContext;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class PdeUiBridge extends AbstractContextUiBridge {
+
+ private final TreeViewerListener treeSelectionChangedListener;
+
+ public PdeUiBridge() {
+ treeSelectionChangedListener = new TreeViewerListener();
+ }
+
+ /**
+ * @see org.eclipse.mylyn.context.ui.AbstractContextUiBridge#open(org.eclipse.mylyn.context.core.IInteractionElement)
+ */
+ @Override
+ public void open(IInteractionElement node) {
+ // get the handle of the node
+ String handle = node.getHandleIdentifier();
+
+ int first = handle.indexOf(";"); //$NON-NLS-1$
+ String filename = ""; //$NON-NLS-1$
+ if (first == -1) {
+ filename = handle;
+ } else {
+ filename = handle.substring(0, first);
+ }
+
+ try {
+ // get the file
+ IPath path = new Path(filename);
+ IFile f = (IFile) ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+
+ // open the xml file looking at the proper line
+ IEditorPart editor = openInEditor(f, true);
+
+ // if the editor is null, we had a problem and should return
+ if (editor == null) {
+ StatusHandler.log(new Status(IStatus.WARNING, PdeUiBridgePlugin.ID_PLUGIN,
+ "Unable to open editor for file: " + filename)); //$NON-NLS-1$
+ return;
+ }
+
+ // get the contents and create a new document so that we can get
+ // the offsets to highlight
+ // String content = XmlNodeHelper.getContents(f.getContents());
+ //
+ // IDocument d = new Document(content);
+
+ // if(first != -1){
+ // int start = Integer.parseInt(handle.substring(first + 1));
+ //
+ // // get the offsets for the element
+ // int startOffset = d.getLineOffset(start);
+ // int length = 0;
+ //
+ // // set the selection if the selection provider is not null
+ // ISelectionProvider selectionProvider =
+ // editor.getEditorSite().getSelectionProvider();
+ // if(selectionProvider != null)
+ // selectionProvider.setSelection(new TextSelection(startOffset,
+ // length));
+ // }
+
+ } catch (Exception e) {
+ // ContextCorePlugin.log(e, "ERROR OPENING XML EDITOR\n" +
+ // e.getMessage());
+ }
+ }
+
+ /**
+ * Open a file in the appropriate editor
+ *
+ * @param file
+ * The IFile to open
+ * @param activate
+ * Whether to activate the editor or not
+ * @return The IEditorPart that the file opened in
+ * @throws PartInitException
+ */
+ private IEditorPart openInEditor(IFile file, boolean activate) throws PartInitException {
+ if (file != null) {
+ IWorkbenchPage p = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (p != null && file.exists()) {
+ IEditorPart editorPart = IDE.openEditor(p, file, activate);
+ // initializeHighlightRange(editorPart);
+ return editorPart;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void close(IInteractionElement node) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ IEditorReference[] references = page.getEditorReferences();
+ for (IEditorReference reference : references) {
+ IEditorPart part = reference.getEditor(false);
+ if (part != null) {
+ // HACK: find better way to get the filename other than the tooltip
+ if (("/" + part.getTitleToolTip()).equals(node.getHandleIdentifier())) { //$NON-NLS-1$
+ if (part instanceof FormEditor) {
+ ((FormEditor) part).close(true);
+ } else if (part instanceof AbstractTextEditor) {
+ ((AbstractTextEditor) part).close(true);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return editorPart instanceof ManifestEditor;
+ }
+
+ /**
+ * HACK: use a lot of reflection to get the TreeViewer
+ */
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) {
+ if (editor instanceof PDEFormEditor) {
+ PDESourcePage sp = null;
+ List<TreeViewer> viewers = new ArrayList<TreeViewer>(2);
+ if ((sp = (PDESourcePage) ((PDEFormEditor) editor).findPage(PluginInputContext.CONTEXT_ID)) != null) {
+ ISortableContentOutlinePage page = sp.getContentOutline();
+ if (page != null && page.getControl() != null) {
+ try {
+ if (page instanceof SourceOutlinePage) {
+ // get the tree viewer for the outline
+ Class<?> clazz2 = page.getClass();
+ Field field2 = clazz2.getDeclaredField("viewer"); //$NON-NLS-1$
+ field2.setAccessible(true);
+ Object f2 = field2.get(page);
+ if (f2 != null && f2 instanceof TreeViewer) {
+ viewers.add((TreeViewer) f2);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN,
+ "Failed to get tree viewers", e)); //$NON-NLS-1$
+ return null;
+ }
+ }
+ }
+
+ try {
+ // get the current page of the outline
+ Class<?> clazz = PDEFormEditor.class;
+ Field field = null;
+ try {
+ field = clazz.getDeclaredField("formOutline"); //$NON-NLS-1$
+ } catch (NoSuchFieldException e) {
+ field = clazz.getDeclaredField("fFormOutline"); //$NON-NLS-1$
+ }
+ field.setAccessible(true);
+ Object f = field.get(editor);
+ if (f != null && f instanceof FormOutlinePage) {
+ // get the tree viewer for the outline
+ Class<?> clazz2 = FormOutlinePage.class;
+ Field field2 = null;
+ try {
+ field2 = clazz2.getDeclaredField("treeViewer"); //$NON-NLS-1$
+ } catch (NoSuchFieldException e) {
+ field2 = clazz2.getDeclaredField("fTreeViewer"); //$NON-NLS-1$
+ }
+ field2.setAccessible(true);
+ Object f2 = field2.get(f);
+ if (f2 != null && f2 instanceof TreeViewer) {
+ TreeViewer treeViewer = (TreeViewer) f2;
+ viewers.add(treeViewer);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN, "Could not get PDE outline", e)); //$NON-NLS-1$
+ return Collections.emptyList();
+ }
+
+ // add a listener so that when the selection changes, the view is
+ // refreshed to attempt to keep the ui model the same as the
+ // taskscape one
+ for (TreeViewer viewer : viewers) {
+ viewer.addSelectionChangedListener(treeSelectionChangedListener);
+ viewer.addTreeListener(treeSelectionChangedListener);
+ }
+
+ return viewers;
+ }
+ return Collections.emptyList();
+ }
+
+ public void refreshOutline(Object element, boolean updateLabels, boolean setSelection) {
+ IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+ List<TreeViewer> treeViewers = getContentOutlineViewers(editorPart);
+ for (TreeViewer treeViewer : treeViewers) {
+ if (treeViewer != null) {
+ if (element == null) {
+ treeViewer.getControl().setRedraw(false);
+ treeViewer.refresh(true);
+ treeViewer.getControl().setRedraw(true);
+ treeViewer.expandAll();
+ } else if (element instanceof PluginObjectNode) {
+ treeViewer.getControl().setRedraw(false);
+ treeViewer.refresh(element, true);
+ treeViewer.getControl().setRedraw(true);
+ treeViewer.expandAll();
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Class to listen to the tree views to attempt to refresh them more frequently to keep the ui model consistant with
+ * the user selections
+ *
+ * @author Shawn Minto
+ */
+ private class TreeViewerListener implements ISelectionChangedListener, ITreeViewerListener {
+ public void selectionChanged(SelectionChangedEvent event) {
+ Object o = event.getSource();
+ if (o instanceof TreeViewer) {
+ ((TreeViewer) o).refresh();
+ ((TreeViewer) o).expandAll();
+ }
+ }
+
+ public void treeCollapsed(TreeExpansionEvent event) {
+ Object o = event.getSource();
+ if (o instanceof TreeViewer) {
+ ((TreeViewer) o).refresh();
+ }
+
+ }
+
+ public void treeExpanded(TreeExpansionEvent event) {
+ Object o = event.getSource();
+ if (o instanceof TreeViewer) {
+ ((TreeViewer) o).refresh();
+ }
+ }
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ return null;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return PdeStructureBridge.CONTENT_TYPE;
+ }
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeUiBridgePlugin.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeUiBridgePlugin.java
new file mode 100644
index 0000000..bce4002
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/PdeUiBridgePlugin.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class PdeUiBridgePlugin extends Plugin {
+
+ public static class PdeUiBrideStartup implements IContextUiStartup {
+
+ public void lazyStartup() {
+ PdeUiBridgePlugin.getDefault().lazyStart();
+ }
+
+ }
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.pde.ui"; //$NON-NLS-1$
+
+ private static PdeUiBridgePlugin INSTANCE;
+
+ public static PdeUiBridgePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ private PdeEditingMonitor pdeEditingMonitor;
+
+ public PdeUiBridgePlugin() {
+ }
+
+ private void lazyStart() {
+ pdeEditingMonitor = new PdeEditingMonitor();
+ MonitorUi.getSelectionMonitors().add(pdeEditingMonitor);
+ }
+
+ private void lazyStop() {
+ if (pdeEditingMonitor != null) {
+ MonitorUi.getSelectionMonitors().remove(pdeEditingMonitor);
+ }
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ INSTANCE = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ lazyStop();
+
+ super.stop(context);
+ INSTANCE = null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/XmlJavaRelationProvider.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/XmlJavaRelationProvider.java
new file mode 100644
index 0000000..2487917
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/XmlJavaRelationProvider.java
@@ -0,0 +1,443 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.DegreeOfSeparation;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.context.core.IDegreeOfSeparation;
+import org.eclipse.mylyn.internal.ide.ui.XmlNodeHelper;
+import org.eclipse.mylyn.internal.java.ui.search.XmlActiveSearchUpdater;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.search.core.text.TextSearchScope;
+import org.eclipse.search.internal.ui.text.FileSearchQuery;
+import org.eclipse.search.internal.ui.text.FileSearchResult;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search.ui.text.FileTextSearchScope;
+import org.eclipse.search.ui.text.Match;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class XmlJavaRelationProvider extends AbstractRelationProvider {
+
+ public static final String SOURCE_ID = "org.eclipse.mylyn.xml.search.references"; //$NON-NLS-1$
+
+ public static final String NAME = "referenced by"; //$NON-NLS-1$
+
+ public static final int DEFAULT_DEGREE = 3;
+
+ public static final List<Job> runningJobs = new ArrayList<Job>();
+
+ public static final Map<Match, XmlNodeHelper> nodeMap = new HashMap<Match, XmlNodeHelper>();
+
+ public XmlJavaRelationProvider() {
+ // TODO: should this be a generic XML extension?
+ super(PdeStructureBridge.CONTENT_TYPE, SOURCE_ID);
+ }
+
+ @Override
+ public List<IDegreeOfSeparation> getDegreesOfSeparation() {
+ List<IDegreeOfSeparation> separations = new ArrayList<IDegreeOfSeparation>();
+ separations.add(new DegreeOfSeparation(DOS_0_LABEL, 0));
+ separations.add(new DegreeOfSeparation(DOS_1_LABEL, 1));
+ separations.add(new DegreeOfSeparation(DOS_2_LABEL, 2));
+ separations.add(new DegreeOfSeparation(DOS_3_LABEL, 3));
+ separations.add(new DegreeOfSeparation(DOS_4_LABEL, 4));
+ separations.add(new DegreeOfSeparation(DOS_5_LABEL, 5));
+ return separations;
+ }
+
+ @Override
+ protected void findRelated(final IInteractionElement node, int degreeOfSeparation) {
+ if (!node.getContentType().equals("java")) { //$NON-NLS-1$
+ return;
+ }
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+ if (javaElement == null || javaElement instanceof ICompilationUnit || !javaElement.exists()) {
+ return;
+ }
+ if (!acceptElement(javaElement)) {
+ return;
+ }
+
+ TextSearchScope scope = createTextSearchScope(degreeOfSeparation);
+ if (scope != null) {
+ runJob(node, javaElement, degreeOfSeparation, getId());
+ }
+ }
+
+ protected TextSearchScope createTextSearchScope(int degreeOfSeparation) {
+ Set<IInteractionElement> landmarks = ContextCore.getContextManager().getActiveLandmarks();
+
+ switch (degreeOfSeparation) {
+ case 1:
+ // create a search scope for the projects of landmarks
+ Set<IResource> l = new HashSet<IResource>();
+ for (IInteractionElement landmark : landmarks) {
+ if (landmark.getContentType().equals(PdeStructureBridge.CONTENT_TYPE)) {
+ // ||
+ // landmark.getContentType().equals(AntStructureBridge.CONTENT_TYPE))
+ // {
+ String handle = landmark.getHandleIdentifier();
+ IResource element = null;
+ int first = handle.indexOf(";"); //$NON-NLS-1$
+ String filename = handle;
+ if (first != -1) {
+ filename = handle.substring(0, first);
+ }
+ try {
+ // change the file into a document
+ IPath path = new Path(filename);
+ element = ((Workspace) ResourcesPlugin.getWorkspace()).newResource(path, IResource.FILE);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.WARNING, PdeUiBridgePlugin.ID_PLUGIN,
+ "Scope creation failed", e)); //$NON-NLS-1$
+ }
+ l.add(element);
+ }
+ }
+
+ IResource[] res = new IResource[l.size()];
+ res = l.toArray(res);
+ TextSearchScope doiScope = FileTextSearchScope.newSearchScope(res,
+ new String[] { PdeStructureBridge.CONTENT_TYPE }, false);
+ return l.isEmpty() ? null : doiScope;
+ case 2:
+ // create a search scope for the projects of landmarks
+ Set<IProject> projectsToSearch = new HashSet<IProject>();
+ for (IInteractionElement landmark : landmarks) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(landmark.getContentType());
+ IResource resource = ResourcesUiBridgePlugin.getDefault().getResourceForElement(landmark, true);
+ IProject project = null;
+ if (resource != null) {
+ project = resource.getProject();
+ } else {
+ Object object = bridge.getObjectForHandle(landmark.getHandleIdentifier());
+ if (object instanceof IJavaElement) {
+ project = ((IJavaElement) object).getJavaProject().getProject();
+ }
+ }
+ if (project != null) {
+ projectsToSearch.add(project);
+ }
+ }
+
+ res = new IProject[projectsToSearch.size()];
+ res = projectsToSearch.toArray(res);
+ TextSearchScope projScope = FileTextSearchScope.newSearchScope(res,
+ new String[] { PdeStructureBridge.CONTENT_TYPE }, false);
+
+ return projectsToSearch.isEmpty() ? null : projScope;
+ case 3:
+ // create a search scope for the workspace
+ return FileTextSearchScope.newSearchScope(new IResource[] { ResourcesPlugin.getWorkspace().getRoot() },
+ new String[] { PdeStructureBridge.CONTENT_TYPE }, false);
+ case 4:
+ // create a search scope for the workspace
+ return FileTextSearchScope.newSearchScope(new IResource[] { ResourcesPlugin.getWorkspace().getRoot() },
+ new String[] { PdeStructureBridge.CONTENT_TYPE }, false);
+ default:
+ return null;
+ }
+
+ }
+
+ protected boolean acceptElement(IJavaElement javaElement) {
+ return javaElement != null && (javaElement instanceof IMember || javaElement instanceof IType);
+ }
+
+ private void runJob(final IInteractionElement node, final IJavaElement javaElement, final int degreeOfSeparation,
+ final String kind) {
+
+ // get the fully qualified name and if it is null, don't search
+ String fullyQualifiedName = getFullyQualifiedName(javaElement);
+
+ if (fullyQualifiedName == null) {
+ return;
+ }
+
+ // Create the search query
+ final XMLSearchOperation query = (XMLSearchOperation) getSearchOperation(node, 0, degreeOfSeparation);
+ if (query != null) {
+ XMLSearchJob job = new XMLSearchJob(query.getLabel(), query);
+ query.addListener(new IActiveSearchListener() {
+
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> l) {
+ // deal with File
+ if (l.isEmpty()) {
+ return;
+ }
+
+ Map<String, String> nodes = new HashMap<String, String>();
+
+ if (l.get(0) instanceof FileSearchResult) {
+ FileSearchResult fsr = (FileSearchResult) l.get(0);
+
+ Object[] far = fsr.getElements();
+ for (Object element : far) {
+ Match[] mar = fsr.getMatches(element);
+
+ if (element instanceof File) {
+ File f = (File) element;
+
+ // change the file into a document
+ // FileEditorInput fei = new FileEditorInput(f);
+
+ for (Match m : mar) {
+ try {
+ AbstractContextStructureBridge bridge = ContextCorePlugin.getDefault()
+ .getStructureBridge(f.getName());
+ String handle = bridge.getHandleForOffsetInObject(f, m.getOffset());
+ if (handle != null) {
+ String second = handle.substring(handle.indexOf(";")); //$NON-NLS-1$
+
+ XmlNodeHelper xnode = new XmlNodeHelper(f.getFullPath().toString(), second);
+ nodeMap.put(m, xnode);
+ Object o = bridge.getObjectForHandle(handle);
+ String name = bridge.getLabel(o);
+ if (o != null) {
+ nodes.put(handle, name);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, PdeUiBridgePlugin.ID_PLUGIN,
+ "Unable to create match", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+
+ for (String handle : nodes.keySet()) {
+
+ incrementInterest(node, PdeStructureBridge.CONTENT_TYPE, handle, degreeOfSeparation);
+ }
+ gathered = true;
+ XmlJavaRelationProvider.this.searchCompleted(node);
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ });
+ runningJobs.add(job);
+ job.setPriority(Job.DECORATE - 10);
+ job.schedule();
+ }
+ }
+
+ @Override
+ public IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo, int degreeOfSeparation) {
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+ TextSearchScope scope = createTextSearchScope(degreeOfSeparation);
+ if (scope == null) {
+ return null;
+ }
+
+ String fullyQualifiedName = getFullyQualifiedName(javaElement);
+
+ return new XMLSearchOperation(scope, fullyQualifiedName);
+ }
+
+ private String getFullyQualifiedName(IJavaElement je) {
+ if (!(je instanceof IMember)) {
+ return null;
+ }
+
+ IMember m = (IMember) je;
+ if (m.getDeclaringType() == null) {
+ return ((IType) m).getFullyQualifiedName();
+ } else {
+ return m.getDeclaringType().getFullyQualifiedName() + "." + m.getElementName(); //$NON-NLS-1$
+ }
+ }
+
+ public static class XMLSearchJob extends Job {
+
+ private final XMLSearchOperation op;
+
+ /**
+ * Constructor
+ *
+ * @param name
+ */
+ public XMLSearchJob(String name, XMLSearchOperation op) {
+ super(name);
+ this.op = op;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ return op.run(monitor);
+ }
+
+ }
+
+ public static class XMLSearchOperation extends FileSearchQuery implements IActiveSearchOperation {
+
+ @Override
+ public ISearchResult getSearchResult() {
+ try {
+ // get the current page of the outline
+ Class<?> clazz = FileSearchQuery.class;
+ Field field = clazz.getDeclaredField("fResult"); //$NON-NLS-1$
+ field.setAccessible(true);
+ FileSearchResult fResult = (FileSearchResult) field.get(this);
+ if (fResult == null) {
+ fResult = new FileSearchResult(this);
+ field.set(this, fResult);
+ new XmlActiveSearchUpdater(fResult);
+ }
+ return fResult;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.WARNING, PdeUiBridgePlugin.ID_PLUGIN,
+ "Failed to get search result: " + e.getMessage())); //$NON-NLS-1$
+ }
+ return super.getSearchResult();
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ super.run(monitor);
+ ISearchResult result = getSearchResult();
+ if (result instanceof FileSearchResult) {
+ List<Object> l = new ArrayList<Object>();
+ if (((FileSearchResult) result).getElements().length != 0) {
+ l.add(result);
+ }
+
+ notifySearchCompleted(l);
+ }
+ return Status.OK_STATUS;
+ } catch (Throwable t) {
+ return new Status(IStatus.WARNING, ContextCorePlugin.ID_PLUGIN, 0,
+ Messages.XmlJavaRelationProvider_Skipped_XML_search, null);
+ }
+ }
+
+ /**
+ * Constructor
+ *
+ * @param data
+ */
+ public XMLSearchOperation(TextSearchScope scope, String searchString) {
+ super(searchString, false, true, (FileTextSearchScope) scope);
+ }
+
+ /** List of listeners wanting to know about the searches */
+ private final List<IActiveSearchListener> listeners = new ArrayList<IActiveSearchListener>();
+
+ /**
+ * Add a listener for when the bugzilla search is completed
+ *
+ * @param l
+ * The listener to add
+ */
+ public void addListener(IActiveSearchListener l) {
+ // add the listener to the list
+ listeners.add(l);
+ }
+
+ /**
+ * Remove a listener for when the bugzilla search is completed
+ *
+ * @param l
+ * The listener to remove
+ */
+ public void removeListener(IActiveSearchListener l) {
+ // remove the listener from the list
+ listeners.remove(l);
+ }
+
+ /**
+ * Notify all of the listeners that the bugzilla search is completed
+ *
+ * @param doiList
+ * A list of BugzillaSearchHitDoiInfo
+ * @param member
+ * The IMember that the search was performed on
+ */
+ public void notifySearchCompleted(List<Object> l) {
+ // go through all of the listeners and call
+ // searchCompleted(colelctor,
+ // member)
+ for (IActiveSearchListener listener : listeners) {
+ listener.searchCompleted(l);
+ }
+ }
+
+ }
+
+ @Override
+ public String getGenericId() {
+ return SOURCE_ID;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return SOURCE_ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ @Override
+ public void stopAllRunningJobs() {
+ for (Job j : runningJobs) {
+ j.cancel();
+ }
+ runningJobs.clear();
+ }
+
+ @Override
+ protected int getDefaultDegreeOfSeparation() {
+ return DEFAULT_DEGREE;
+ }
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/Messages.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/Messages.java
new file mode 100644
index 0000000..70d18b4
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui.junit;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.pde.ui.junit.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TaskContextPdeJUnitLaunchConfiguration_Context_Test_Suite;
+
+ public static String TaskContextPdeJUnitLaunchConfiguration_No_test_types_found_in_the_active_task_context;
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/TaskContextPdeJUnitLaunchConfiguration.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/TaskContextPdeJUnitLaunchConfiguration.java
new file mode 100644
index 0000000..de4b937
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/TaskContextPdeJUnitLaunchConfiguration.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui.junit;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.java.ui.junit.InteractionContextTestUtil;
+import org.eclipse.pde.ui.launcher.JUnitLaunchConfigurationDelegate;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class TaskContextPdeJUnitLaunchConfiguration extends JUnitLaunchConfigurationDelegate {
+
+ @Override
+ protected IMember[] evaluateTests(ILaunchConfiguration configuration, IProgressMonitor monitor)
+ throws CoreException {
+ Set<IType> contextTestCases = InteractionContextTestUtil.getTestCasesInContext();
+ InteractionContextTestUtil.setupTestConfiguration(contextTestCases, configuration, monitor);
+
+ if (contextTestCases.isEmpty()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), Messages.TaskContextPdeJUnitLaunchConfiguration_Context_Test_Suite,
+ Messages.TaskContextPdeJUnitLaunchConfiguration_No_test_types_found_in_the_active_task_context);
+ }
+ });
+ }
+ return contextTestCases.toArray(new IMember[contextTestCases.size()]);
+ }
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/TaskContextPdeJUnitTabGroup.java b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/TaskContextPdeJUnitTabGroup.java
new file mode 100644
index 0000000..e150d27
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/TaskContextPdeJUnitTabGroup.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.pde.ui.junit;
+
+import org.eclipse.debug.ui.CommonTab;
+import org.eclipse.debug.ui.EnvironmentTab;
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
+import org.eclipse.mylyn.internal.java.ui.junit.TaskContextJUnitMainTab;
+import org.eclipse.pde.ui.launcher.ConfigurationTab;
+import org.eclipse.pde.ui.launcher.JUnitTabGroup;
+import org.eclipse.pde.ui.launcher.PluginJUnitMainTab;
+import org.eclipse.pde.ui.launcher.PluginsTab;
+import org.eclipse.pde.ui.launcher.TracingTab;
+
+/**
+ * Copied from: JUnitTabGroup
+ *
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class TaskContextPdeJUnitTabGroup extends JUnitTabGroup {
+
+ @Override
+ public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+
+ ILaunchConfigurationTab[] tabs = null;
+ tabs = new ILaunchConfigurationTab[] { new TaskContextJUnitMainTab(true),
+// new JUnitLaunchConfigurationTab(),
+ new PluginJUnitMainTab(), new JavaArgumentsTab(), new PluginsTab(false), new ConfigurationTab(true),
+ new TracingTab(), new EnvironmentTab(), new CommonTab() };
+ setTabs(tabs);
+ }
+
+}
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/messages.properties b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/messages.properties
new file mode 100644
index 0000000..80f98fb
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/junit/messages.properties
@@ -0,0 +1,2 @@
+TaskContextPdeJUnitLaunchConfiguration_Context_Test_Suite=Context Test Suite
+TaskContextPdeJUnitLaunchConfiguration_No_test_types_found_in_the_active_task_context=No test types found in the active task context.
diff --git a/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/messages.properties b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/messages.properties
new file mode 100644
index 0000000..a240f4c
--- /dev/null
+++ b/org.eclipse.mylyn.pde.ui/src/org/eclipse/mylyn/internal/pde/ui/messages.properties
@@ -0,0 +1,3 @@
+PdeContextLabelProvider_referenced_by=referenced by
+
+XmlJavaRelationProvider_Skipped_XML_search=Skipped XML search
diff --git a/org.eclipse.mylyn.resources.tests/.classpath b/org.eclipse.mylyn.resources.tests/.classpath
new file mode 100644
index 0000000..a915bf7
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ <accessrule kind="accessible" pattern="**/tests/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.resources.tests/.cvsignore b/org.eclipse.mylyn.resources.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.resources.tests/.project b/org.eclipse.mylyn.resources.tests/.project
new file mode 100644
index 0000000..3045a45
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.resources.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.resources.tests/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.resources.tests/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..7861be6
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tests.xml.AllXmlTests' to 'AllResourcesTests' - Original element: 'org.eclipse.mylar.tests.xml.AllXmlTests' - Renamed element: 'org.eclipse.mylar.tests.xml.AllResourcesTests' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AllXmlTests'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tests.xml{AllXmlTests.java[AllXmlTests" matchStrategy="1" name="AllResourcesTests" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153185784061" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.tests.xml' to 'org.eclipse.mylar.resources.tests' - Original element: 'org.eclipse.mylar.resources.tests/src/org.eclipse.mylar.tests.xml' - Renamed element: 'org.eclipse.mylar.resources.tests/src/org.eclipse.mylar.resources.tests' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.tests.xml'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.tests.xml" name="org.eclipse.mylar.resources.tests" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153186678217" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.tests/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.resources.tests/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..d9e0aa3
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,2 @@
+1153185784061 Rename type 'AllXmlTests'
+1153186678217 Rename package 'org.eclipse.mylar.tests.xml'
diff --git a/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..4233beb
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.resources.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.resources.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fd64ed2
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Resources Tests
+Bundle-SymbolicName: org.eclipse.mylyn.resources.tests
+Bundle-Version: 0.0.0
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui.ide,
+ org.eclipse.jface.text,
+ org.eclipse.jdt,
+ org.eclipse.jdt.core,
+ org.junit,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.java.ui,
+ org.eclipse.mylyn.resources.ui,
+ org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.jface,
+ org.eclipse.ui,
+ org.eclipse.mylyn.context.ui
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: mylyn-xml-tests.jar
+Export-Package: org.eclipse.mylyn.resources.tests;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.resources.tests/about.html b/org.eclipse.mylyn.resources.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.tests/build.properties b/org.eclipse.mylyn.resources.tests/build.properties
new file mode 100644
index 0000000..d841904
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/build.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2004, 2005 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ mylyn-xml-tests.jar,\
+ about.html
+jars.compile.order = mylyn-xml-tests.jar
+source.mylyn-xml-tests.jar = src/
+output.mylyn-xml-tests.jar = bin/
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/AbstractResourceContextTest.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/AbstractResourceContextTest.java
new file mode 100644
index 0000000..94911c1
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/AbstractResourceContextTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.tests;
+
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin;
+import org.eclipse.mylyn.internal.ide.ui.IdeUiUtil;
+import org.eclipse.mylyn.internal.resources.ui.ResourceInteractionMonitor;
+import org.eclipse.mylyn.internal.resources.ui.ResourceStructureBridge;
+import org.eclipse.ui.views.navigator.ResourceNavigator;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractResourceContextTest extends AbstractContextTest {
+
+ protected InteractionContextManager manager = ContextCorePlugin.getContextManager();
+
+ protected ResourceInteractionMonitor monitor = new ResourceInteractionMonitor();
+
+ protected ResourceStructureBridge structureBridge = new ResourceStructureBridge();
+
+ protected TestProject project;
+
+ protected InteractionContext context;
+
+ protected InteractionContextScaling scaling = new InteractionContextScaling();
+
+ protected String taskId = this.getClass().getName();
+
+ protected ResourceNavigator navigator;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertNotNull(IdeUiBridgePlugin.getDefault());
+ project = new TestProject(this.getClass().getName());
+ context = new InteractionContext(taskId, scaling);
+ context.reset();
+ manager.internalActivateContext(context);
+ ContextUiPlugin.getViewerManager().setSyncRefreshMode(true);
+ navigator = (ResourceNavigator) TestUtil.openView(IdeUiUtil.ID_NAVIGATOR);
+ assertNotNull(navigator);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ context.reset();
+ assertTrue(context.getInteresting().isEmpty());
+ manager.deactivateContext(taskId);
+ manager.deleteContext(taskId);
+ ContextCorePlugin.getContextStore().getFileForContext(taskId).delete();
+ ResourceTestUtil.deleteProject(project.getProject());
+ super.tearDown();
+ }
+}
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/AllResourcesTests.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/AllResourcesTests.java
new file mode 100644
index 0000000..9b5a667
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/AllResourcesTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllResourcesTests {
+
+ public static Test suite() {
+ TestUtil.triggerContextUiLazyStart();
+
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.resources.tests");
+ suite.addTestSuite(ResourceChangeMonitorTest.class);
+ suite.addTestSuite(ResourceContextTest.class);
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
new file mode 100644
index 0000000..ec596bc
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.tests;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.internal.events.ResourceChangeEvent;
+import org.eclipse.core.internal.events.ResourceDelta;
+import org.eclipse.core.internal.events.ResourceDeltaInfo;
+import org.eclipse.core.internal.resources.ResourceInfo;
+import org.eclipse.core.internal.resources.Workspace;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiPreferenceInitializer;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+public class ResourceChangeMonitorTest extends AbstractResourceContextTest {
+
+ private static class MockResourceDelta extends ResourceDelta {
+
+ protected MockResourceDelta(IPath path, ResourceDeltaInfo deltaInfo) {
+ super(path, deltaInfo);
+
+ }
+
+ static MockResourceDelta createMockDelta(String path, String[] childPaths, int status, int resourceType) {
+ // create the delta and fill it with information
+
+ ResourceDeltaInfo deltaInfo = new ResourceDeltaInfo((Workspace) ResourcesPlugin.getWorkspace(), null, null);
+ MockResourceDelta result = new MockResourceDelta(new Path(path), deltaInfo);
+
+ ResourceInfo info = new ResourceInfo();
+
+ info.setType(resourceType);
+
+ result.setNewInfo(info);
+ result.setOldInfo(info);
+
+ Set<MockResourceDelta> children = new HashSet<MockResourceDelta>();
+
+ if (childPaths != null) {
+ for (String childPath : childPaths) {
+ children.add(createMockDelta(path + childPath, null, status, IResource.FILE));
+ }
+ }
+
+ result.setChildren(children.toArray(new MockResourceDelta[0]));
+ result.setStatus(status);
+
+ return result;
+ }
+
+ @Override
+ public void setChildren(ResourceDelta[] children) {
+ super.setChildren(children);
+ }
+ }
+
+ private ResourceChangeMonitor changeMonitor;
+
+ private IFolder folder;
+
+ private IFile fileInFolder;
+
+ private IFile file;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ changeMonitor = new ResourceChangeMonitor();
+ ResourcesUiBridgePlugin.getInterestUpdater().setSyncExec(true);
+
+ ContextCore.getContextManager().setContextCapturePaused(true);
+
+ file = project.getProject().getFile("test.txt");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+
+ folder = project.getProject().getFolder("testFolder");
+ folder.create(true, true, null);
+ assertTrue(folder.exists());
+
+ fileInFolder = folder.getFile("test.txt");
+ fileInFolder.create(null, true, null);
+ assertTrue(fileInFolder.exists());
+
+ ContextCore.getContextManager().setContextCapturePaused(false);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ ResourcesUiBridgePlugin.getInterestUpdater().setSyncExec(false);
+ super.tearDown();
+ }
+
+ public void testForcedExclusionPatterns() {
+ String pattern = "file:/foo";
+ try {
+ ResourcesUiPreferenceInitializer.addForcedExclusionPattern(pattern);
+ assertTrue(ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns().contains(pattern));
+ assertFalse(ResourcesUiPreferenceInitializer.getExcludedResourcePatterns().contains(pattern));
+ } finally {
+ ResourcesUiPreferenceInitializer.removeForcedExclusionPattern(pattern);
+ }
+ }
+
+ public void testFileUriExclusionPattern() throws URISyntaxException {
+ URI uri = new URI("file:/C:");
+ assertTrue(ResourceChangeMonitor.isUriExcluded(uri.toString(),
+ ResourceChangeMonitor.createRegexFromPattern("file:/C:")));
+
+ uri = new URI("file:/C:/foo/bar");
+ assertTrue(ResourceChangeMonitor.isUriExcluded(uri.toString(),
+ ResourceChangeMonitor.createRegexFromPattern("file:/C:")));
+ }
+
+ public void testExclusionPattern() {
+ Set<String> patterns = new HashSet<String>();
+ patterns.add(ResourceChangeMonitor.createRegexFromPattern(".*"));
+ patterns.add(ResourceChangeMonitor.createRegexFromPattern("target"));
+
+ IPath path1 = new Path(".foo");
+ assertTrue(ResourceChangeMonitor.isExcluded(path1, null, patterns));
+
+ IPath path2 = new Path("target/bar");
+ assertTrue(ResourceChangeMonitor.isExcluded(path2, null, patterns));
+
+ IPath path3 = new Path("bar/target/bar");
+ assertTrue(ResourceChangeMonitor.isExcluded(path3, null, patterns));
+
+ IPath path4 = new Path("bla/bla");
+ assertFalse(ResourceChangeMonitor.isExcluded(path4, null, patterns));
+ }
+
+ public void testInclusion() {
+ IPath path4 = new Path("bla/bla");
+ assertFalse(ResourceChangeMonitor.isExcluded(path4, null, new HashSet<String>()));
+ }
+
+ public void testCreatedFile() throws CoreException {
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ new String[] { "/test.txt" }, (IResourceDelta.ADDED | IResourceDelta.CONTENT), IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNotNull(element);
+ assertTrue(element.getInterest().isPropagated());
+ }
+
+ public void testModifiedFile() throws CoreException {
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ new String[] { "/test.txt" }, (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNotNull(element);
+ assertTrue(element.getInterest().isPredicted());
+ }
+
+ public void testDerrivedFileChanged() throws CoreException {
+ fileInFolder.setDerived(true);
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ new String[] { "/test.txt" }, (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(fileInFolder).getHandleIdentifier(fileInFolder);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ }
+
+ public void testDerrivedFolderChanged() throws CoreException {
+ folder.setDerived(true);
+ fileInFolder.setDerived(false);
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(), null,
+ (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.PROJECT);
+
+ MockResourceDelta child = MockResourceDelta.createMockDelta("/" + project.getProject().getName() + "/"
+ + folder.getName(), new String[] { "/" + folder.getName() + "/test.txt" },
+ (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.FOLDER);
+
+ delta.setChildren(new ResourceDelta[] { child });
+
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(fileInFolder).getHandleIdentifier(folder);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ handle = ContextCore.getStructureBridge(fileInFolder).getHandleIdentifier(fileInFolder);
+ assertNotNull(handle);
+ element = context.get(handle);
+ assertNull(element);
+ }
+
+ public void testExcluded() throws CoreException {
+ try {
+ ResourcesUiPreferenceInitializer.addForcedExclusionPattern("*.txt");
+
+ MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+ new String[] { "/test.txt" }, (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.PROJECT);
+ IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+ changeMonitor.resourceChanged(event);
+ String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+ assertNotNull(handle);
+ IInteractionElement element = context.get(handle);
+ assertNull(element);
+ } finally {
+ ResourcesUiPreferenceInitializer.removeForcedExclusionPattern("*.txt");
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceContextTest.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceContextTest.java
new file mode 100644
index 0000000..c7b3b7d
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceContextTest.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.tests;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceContextTest extends AbstractResourceContextTest {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+// ResourcesUiBridgePlugin.getDefault().setResourceMonitoringEnabled(true);
+ ResourcesUiBridgePlugin.getInterestUpdater().setSyncExec(true);
+
+ TestUtil.triggerContextUiLazyStart();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ ResourcesUiBridgePlugin.getInterestUpdater().setSyncExec(false);
+ }
+
+ public void testResourceSelect() throws CoreException {
+ ContextCore.getContextManager().setContextCapturePaused(true);
+ IFile file = project.getProject().getFile("file");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+
+ IInteractionElement element = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(file));
+ assertFalse(element.getInterest().isInteresting());
+ ContextCore.getContextManager().setContextCapturePaused(false);
+
+ monitor.selectionChanged(navigator, new StructuredSelection(file));
+ element = ContextCore.getContextManager().getElement(structureBridge.getHandleIdentifier(file));
+ assertTrue(element.getInterest().isInteresting());
+ }
+
+ public void testFileNotAddedIfExcluded() throws CoreException {
+ Set<String> previousExcludions = ResourcesUiBridgePlugin.getDefault().getExcludedResourcePatterns();
+ Set<String> exclude = new HashSet<String>();
+ exclude.add("boring");
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(exclude);
+
+ IFile file = project.getProject().getFile("boring");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+
+ IInteractionElement element = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(file));
+ assertFalse(element.getInterest().isInteresting());
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(previousExcludions);
+ }
+
+ public void testPatternNotAddedIfExcluded() throws CoreException {
+ Set<String> previousExcludions = ResourcesUiBridgePlugin.getDefault().getExcludedResourcePatterns();
+ Set<String> exclude = new HashSet<String>();
+ exclude.add("b*.txt");
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(exclude);
+
+ IFile file = project.getProject().getFile("boring.txt");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+
+ IInteractionElement element = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(file));
+ assertFalse(element.getInterest().isInteresting());
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(previousExcludions);
+ }
+
+ public void testPatternNotAddedMatching() throws CoreException {
+ Set<String> previousExcludions = ResourcesUiBridgePlugin.getDefault().getExcludedResourcePatterns();
+ Set<String> exclude = new HashSet<String>();
+ exclude.add(".*");
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(exclude);
+
+ String pattern = ".*";
+ String segment = "boring";
+
+ String s = pattern.replaceAll("\\.", "\\\\.").replaceAll("\\*", ".*");
+ assertFalse(segment.matches(s));
+ assertTrue(".boring".matches(s));
+
+ IFile file = project.getProject().getFile(".boring");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+ IInteractionElement element = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(file));
+ assertFalse(element.getInterest().isInteresting());
+
+ file = project.getProject().getFile("boring");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+ element = ContextCore.getContextManager().getElement(structureBridge.getHandleIdentifier(file));
+ assertTrue(element.getInterest().isInteresting());
+
+ ResourcesUiBridgePlugin.getDefault().setExcludedResourcePatterns(previousExcludions);
+ }
+
+ public void testFileAdded() throws CoreException {
+ IFile file = project.getProject().getFile("new-file.txt");
+ file.create(null, true, null);
+ assertTrue(file.exists());
+
+ IInteractionElement element = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(file));
+ assertTrue(element.getInterest().isInteresting());
+ }
+
+ public void testFolderAddedOnCreation() throws CoreException {
+ IFolder folder = project.getProject().getFolder("folder");
+ folder.create(true, true, null);
+ assertTrue(folder.exists());
+
+ IInteractionElement element = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(folder));
+ assertTrue(element.getInterest().isInteresting());
+ }
+
+ // XXX: Put back
+// public void testDecrementOfFile() throws CoreException, InvocationTargetException, InterruptedException {
+// IFolder folder = project.getProject().getFolder("folder");
+// folder.create(true, true, null);
+// IFile file = project.getProject().getFile(new Path("folder/foo.txt"));
+// file.create(null, true, null);
+//
+// monitor.selectionChanged(navigator, new StructuredSelection(file));
+// monitor.selectionChanged(navigator, new StructuredSelection(folder));
+//
+// IInteractionElement fileElement = ContextCorePlugin.getContextManager().getElement(
+// structureBridge.getHandleIdentifier(file));
+// IInteractionElement folderElement = ContextCorePlugin.getContextManager().getElement(
+// structureBridge.getHandleIdentifier(folder));
+//
+// assertTrue(fileElement.getInterest().isInteresting());
+// assertTrue(folderElement.getInterest().isInteresting());
+//
+// assertTrue(ContextCorePlugin.getContextManager().manipulateInterestForElement(folderElement, false, false,
+// "test"));
+//
+// assertFalse(folderElement.getInterest().isInteresting());
+// assertFalse(fileElement.getInterest().isInteresting());
+// }
+}
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceTestUtil.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceTestUtil.java
new file mode 100644
index 0000000..b7152cc
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceTestUtil.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.tests;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceTestUtil {
+
+ public static void deleteProject(IProject project) throws CoreException {
+ if (project.exists() && !project.isOpen()) { // force opening so that
+ // project can be
+ // deleted without
+ // logging (see bug
+ // 23629)
+ project.open(null);
+ }
+ deleteResource(project);
+ }
+
+ public static void deleteResource(IResource resource) throws CoreException {
+ CoreException lastException = null;
+ try {
+ resource.delete(true, null);
+ } catch (CoreException e) {
+ lastException = e;
+ // just print for info
+ System.out.println("(CoreException): " + e.getMessage() + ", resource " + resource.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (IllegalArgumentException iae) {
+ // just print for info
+ System.out.println("(IllegalArgumentException): " + iae.getMessage() + ", resource " + resource.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ int retryCount = 60; // wait 1 minute at most
+ while (resource.isAccessible() && --retryCount >= 0) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ }
+ try {
+ resource.delete(true, null);
+ } catch (CoreException e) {
+ lastException = e;
+ // just print for info
+ System.out.println("(CoreException) Retry " + retryCount + ": " + e.getMessage() + ", resource " + resource.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ } catch (IllegalArgumentException iae) {
+ // just print for info
+ System.out.println("(IllegalArgumentException) Retry " + retryCount + ": " + iae.getMessage() + ", resource " + resource.getFullPath()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ }
+ if (!resource.isAccessible()) {
+ return;
+ }
+ System.err.println("Failed to delete " + resource.getFullPath()); //$NON-NLS-1$
+ if (lastException != null) {
+ throw lastException;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/TestProject.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/TestProject.java
new file mode 100644
index 0000000..1d3a65f
--- /dev/null
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/TestProject.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.tests;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Mik Kersten
+ */
+public class TestProject {
+
+ public IProject project;
+
+ public TestProject(final String name) throws CoreException, InvocationTargetException, InterruptedException {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ project = root.getProject(name);
+ project.create(null);
+ project.open(null);
+ }
+
+ public IProject getProject() {
+ return project;
+ }
+
+ public IFolder createFolder(String name) throws CoreException {
+ IFolder folder = project.getFolder(name);
+ folder.create(false, true, null);
+ return folder;
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/.classpath b/org.eclipse.mylyn.resources.ui/.classpath
new file mode 100644
index 0000000..58e7b31
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.classpath
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/markers/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/compare/internal/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/core/internal/resources/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/views/markers/internal/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.resources.ui/.cvsignore b/org.eclipse.mylyn.resources.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.resources.ui/.project b/org.eclipse.mylyn.resources.ui/.project
new file mode 100644
index 0000000..58ce90e
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.resources.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..e67edba
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.resources.ui.MylarEditorManager' to 'ContextEditorManager' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.ui.MylarEditorManager' - Renamed element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarEditorManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.resources.ui{MylarEditorManager.java[MylarEditorManager" matchStrategy="1" name="ContextEditorManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1164328832218" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..ee46dc8
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1 @@
+1164328832218 Rename type 'MylarEditorManager'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..025d1b4
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.xml' to 'org.eclipse.mylar.internal.ide.xml' - Original element: 'org.eclipse.mylar.resources/src/org.eclipse.mylar.internal.xml' - Renamed element: 'org.eclipse.mylar.resources/src/org.eclipse.mylar.internal.ide.xml' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.xml'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.xml" name="org.eclipse.mylar.internal.ide.xml" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153043639718" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.resources.MylarXmlPlugin' to 'MylarResourcesPlugin' - Original element: 'org.eclipse.mylar.resources.MylarXmlPlugin' - Renamed element: 'org.eclipse.mylar.resources.MylarResourcesPlugin' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarXmlPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.resources{MylarXmlPlugin.java[MylarXmlPlugin" matchStrategy="1" name="MylarResourcesPlugin" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153044403062" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..a0e38e3
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,2 @@
+1153043639718 Rename package 'org.eclipse.mylar.internal.xml'
+1153044403062 Rename type 'MylarXmlPlugin'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/1/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/1/refactorings.history
new file mode 100644
index 0000000..0b3df5f
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/1/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.resources/src/org.eclipse.mylar.internal.resources.ui' - Original project: 'org.eclipse.mylar.resources' - Destination element: 'org.eclipse.mylar.resources/src/org.eclipse.mylar.internal.resources.ui' - Original element: 'org.eclipse.mylar.resources.FocusCommonNavigatorAction.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.resources.ui" element1="/src<org.eclipse.mylar.resources{FocusCommonNavigatorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1168042499890" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/1/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/1/refactorings.index
new file mode 100644
index 0000000..2344205
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/1/refactorings.index
@@ -0,0 +1 @@
+1168042499890 Move compilation unit
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..f28feeb
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isUnsubmittedEdtior(...)' to 'isUnsubmittedTaskEditor' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isUnsubmittedEdtior(...)' - Renamed element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isUnsubmittedTaskEditor(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isUnsubmittedEdtior'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java[ContextEditorManager~isUnsubmittedEdtior~QIEditorReference;" name="isUnsubmittedTaskEditor" references="true" stamp="1169573870083" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..5b6ee84
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1 @@
+1169573870083 Rename method 'isUnsubmittedEdtior'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/10/41/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/10/41/refactorings.history
new file mode 100644
index 0000000..092f455
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/10/41/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void isUriExcluded(IResource resource,String pattern)' from 'org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor.isExcluded()' to 'org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Method name: 'isUriExcluded'
- Destination type: 'org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor'
- Declared visibility: 'private'" comments="false" description="Extract method 'isUriExcluded'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.resources.ui{ResourceChangeMonitor.java" name="isUriExcluded" replace="false" selection="3658 108" stamp="1192224503484" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/10/41/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/10/41/refactorings.index
new file mode 100644
index 0000000..9c7041f
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/10/41/refactorings.index
@@ -0,0 +1 @@
+1192224503484 Extract method 'isUriExcluded'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..0ee5c34
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.context.core/src/org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar.resources' - Destination element: 'org.eclipse.mylar.context.core/src/org.eclipse.mylar.context.core' - Original element: 'org.eclipse.mylar.internal.resources.IElementContainer.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.context.core" element1="/src<org.eclipse.mylar.internal.resources{IElementContainer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1172286439835" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..945427b
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1 @@
+1172286439835 Move compilation unit
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..7d98b5c
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.resources' - Original project: 'org.eclipse.mylar.resources' - Original element: 'MylarResourcesPlugin.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/resources/MylarResourcesPlugin.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1175191880770" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.resources.preferences.MylarPreferencesInitializer' to 'MylarResourcesPreferenceInitializer' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.preferences.MylarPreferencesInitializer' - Renamed element: 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesPreferenceInitializer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPreferencesInitializer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.resources.preferences{MylarPreferencesInitializer.java[MylarPreferencesInitializer" matchStrategy="1" name="MylarResourcesPreferenceInitializer" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1175192007948" textual="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.resources/schema/mylar_resources_to_ignore.exsd' to 'changeMonitoring.exsd' - Original project: 'org.eclipse.mylar.resources' - Original element: 'mylar_resources_to_ignore.exsd'" description="Rename resource 'mylar_resources_to_ignore.exsd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="schema/mylar_resources_to_ignore.exsd" name="changeMonitoring.exsd" stamp="1175197278181" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.resources.preferences.ExtensionHelper' to 'MylarResourcesExtensionPointReader' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.preferences.ExtensionHelper' - Renamed element: 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ExtensionHelper'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.resources.preferences{ExtensionHelper.java[ExtensionHelper" matchStrategy="1" name="MylarResourcesExtensionPointReader" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1175197840676" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'IGNORE' in 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader' to 'EXTENSION_CHANGE_MONITORING' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader.IGNORE' - Renamed element: 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader.EXTENSION_CHANGE_MONITORING' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'IGNORE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.resources.preferences{MylarResourcesExtensionPointReader.java[MylarResourcesExtensionPointReader^IGNORE" name="EXTENSION_CHANGE_MONITORING" references="true" setter="false" stamp="1175197879897" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader.getResourceExclusions()' to 'getDefaultResourceExclusions' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader.getResourceExclusions()' - Renamed element: 'org.eclipse.mylar.internal.resources.preferences.MylarResourcesExtensionPointReader.getDefaultResourceExclusions()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getResourceExclusions'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.resources.preferences{MylarResourcesExtensionPointReader.java[MylarResourcesExtensionPointReader~getResourceExclusions" name="getDefaultResourceExclusions" references="true" stamp="1175199556201" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.resources' - Original project: 'org.eclipse.mylar.resources' - Original element: 'plugin.xml.rej'" description="Delete element" element1="plugin.xml.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1175204058750" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..e0bce74
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1,7 @@
+1175191880770 Delete element
+1175192007948 Rename type 'MylarPreferencesInitializer'
+1175197278181 Rename resource 'mylar_resources_to_ignore.exsd'
+1175197840676 Rename type 'ExtensionHelper'
+1175197879897 Rename field 'IGNORE'
+1175199556201 Rename method 'getResourceExclusions'
+1175204058750 Delete element
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/16/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/16/refactorings.history
new file mode 100644
index 0000000..10ae2aa
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/16/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void restoreEditors(WorkbenchPage page,EditorManager editorManager,IMemento memento)' from 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.contextActivated()' to 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager' - Original project: 'org.eclipse.mylar.resources' - Method name: 'restoreEditors' - Destination type: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager' - Declared visibility: 'private'" comments="false" description="Extract method 'restoreEditors'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java" name="restoreEditors" replace="false" selection="3921 1160" stamp="1177096300753" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.KEY_SAVED_EDITORS' from expression '"SavedEditorState"' - Original project: 'org.eclipse.mylar.resources' - Constant name: 'KEY_SAVED_EDITORS' - Constant expression: '"SavedEditorState"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'KEY_SAVED_EDITORS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java" name="KEY_SAVED_EDITORS" qualify="false" replace="true" selection="4552 18" stamp="1177099985924" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/16/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/16/refactorings.index
new file mode 100644
index 0000000..95d658c
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1177096300753 Extract method 'restoreEditors'
+1177099985924 Extract constant 'KEY_SAVED_EDITORS'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/17/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/17/refactorings.history
new file mode 100644
index 0000000..b6958b5
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/17/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.PREFS_PREFIX' from expression '"editors."' - Original project: 'org.eclipse.mylar.resources' - Constant name: 'PREFS_PREFIX' - Constant expression: '"editors."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'PREFS_PREFIX'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java" name="PREFS_PREFIX" qualify="false" replace="true" selection="3839 10" stamp="1177328195943" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/17/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/17/refactorings.index
new file mode 100644
index 0000000..3d22752
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/4/17/refactorings.index
@@ -0,0 +1 @@
+1177328195943 Extract constant 'PREFS_PREFIX'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/18/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/18/refactorings.history
new file mode 100644
index 0000000..bbf974b
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/18/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.resources.ui.IContextIgnoringEditor' to 'IContextAwareEditor' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.ui.IContextIgnoringEditor' - Renamed element: 'org.eclipse.mylar.internal.resources.ui.IContextAwareEditor' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IContextIgnoringEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.resources.ui{IContextIgnoringEditor.java[IContextIgnoringEditor" matchStrategy="1" name="IContextAwareEditor" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178234009107" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isContextIgnoringEditor(...)' to 'isContextAwareEditor' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isContextIgnoringEditor(...)' - Renamed element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isContextAwareEditor(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isContextIgnoringEditor'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java[ContextEditorManager~isContextIgnoringEditor~QIEditorReference;" name="isContextAwareEditor" references="true" stamp="1178235050914" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isContextAwareEditor(...)' to 'canClose' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.isContextAwareEditor(...)' - Renamed element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.canClose(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isContextAwareEditor'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java[ContextEditorManager~isContextAwareEditor~QIEditorReference;" name="canClose" references="true" stamp="1178235062705" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/18/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/18/refactorings.index
new file mode 100644
index 0000000..e1fad1e
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/18/refactorings.index
@@ -0,0 +1,3 @@
+1178234009107 Rename type 'IContextIgnoringEditor'
+1178235050914 Rename method 'isContextIgnoringEditor'
+1178235062705 Rename method 'isContextAwareEditor'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..3f51163
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'restoredEditorPartNamesHack' in 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.restoreEditors(...)' to 'avoidRestoringDuplicatePartNamesHack' - Original project: 'org.eclipse.mylar.resources' - Original element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.restoreEditors(WorkbenchPage, IMemento).restoredEditorPartNamesHack' - Renamed element: 'org.eclipse.mylar.internal.resources.ui.ContextEditorManager.restoreEditors(WorkbenchPage, IMemento).avoidRestoringDuplicatePartNamesHack' - Update references to refactored element" description="Rename local variable 'restoredEditorPartNamesHack'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.resources.ui{ContextEditorManager.java" name="avoidRestoringDuplicatePartNamesHack" references="true" selection="7003 27" stamp="1178909153538" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..09d6144
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1 @@
+1178909153538 Rename local variable 'restoredEditorPartNamesHack'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..d761805
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.resources.MylarResourcesPlugin' to 'FocusedResourcesPlugin' - Original project: 'org.eclipse.mylyn.resources' - Original element: 'org.eclipse.mylyn.resources.MylarResourcesPlugin' - Renamed element: 'org.eclipse.mylyn.resources.FocusedResourcesPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarResourcesPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.resources{MylarResourcesPlugin.java[MylarResourcesPlugin" matchStrategy="1" name="FocusedResourcesPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269003549" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.resources.ui.preferences.MylarResourcesPreferencePage' to 'FocusedResourcesPreferencePage' - Original project: 'org.eclipse.mylyn.resources' - Original element: 'org.eclipse.mylyn.internal.resources.ui.preferences.MylarResourcesPreferencePage' - Renamed element: 'org.eclipse.mylyn.internal.resources.ui.preferences.FocusedResourcesPreferencePage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarResourcesPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.resources.ui.preferences{MylarResourcesPreferencePage.java[MylarResourcesPreferencePage" matchStrategy="1" name="FocusedResourcesPreferencePage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269476198" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.resources.preferences.MylarResourcesPreferenceInitializer' to 'FocusedResourcesPreferenceInitializer' - Original project: 'org.eclipse.mylyn.resources' - Original element: 'org.eclipse.mylyn.internal.resources.preferences.MylarResourcesPreferenceInitializer' - Renamed element: 'org.eclipse.mylyn.internal.resources.preferences.FocusedResourcesPreferenceInitializer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarResourcesPreferenceInitializer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.resources.preferences{MylarResourcesPreferenceInitializer.java[MylarResourcesPreferenceInitializer" matchStrategy="1" name="FocusedResourcesPreferenceInitializer" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269493779" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.resources.preferences.MylarResourcesExtensionPointReader' to 'FocusedResourcesExtensionPointReader' - Original project: 'org.eclipse.mylyn.resources' - Original element: 'org.eclipse.mylyn.internal.resources.preferences.MylarResourcesExtensionPointReader' - Renamed element: 'org.eclipse.mylyn.internal.resources.preferences.FocusedResourcesExtensionPointReader' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarResourcesExtensionPointReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.resources.preferences{MylarResourcesExtensionPointReader.java[MylarResourcesExtensionPointReader" matchStrategy="1" name="FocusedResourcesExtensionPointReader" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269514972" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.resources.FocusedResourcesPlugin' to 'ResourcesUiBridgePlugin' - Original project: 'org.eclipse.mylyn.resources' - Original element: 'org.eclipse.mylyn.resources.FocusedResourcesPlugin' - Renamed element: 'org.eclipse.mylyn.resources.ResourcesUiBridgePlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'FocusedResourcesPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.resources{FocusedResourcesPlugin.java[FocusedResourcesPlugin" matchStrategy="1" name="ResourcesUiBridgePlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181330314075" textual="false" version="1.0"/>
+<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui' - Original project: 'org.eclipse.mylyn.resources.ui' - Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui' - Original elements: org.eclipse.mylyn.internal.resources.ResourceChangeMonitor.java org.eclipse.mylyn.internal.resources.ResourceStructureBridge.java org.eclipse.mylyn.internal.resources.ResourceInterestUpdater.java org.eclipse.mylyn.internal.resources.ResourceInteractionMonitor.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.resources.ui" element1="/src<org.eclipse.mylyn.internal.resources{ResourceChangeMonitor.java" element2="/src<org.eclipse.mylyn.internal.resources{ResourceStructureBridge.java" element3="/src<org.eclipse.mylyn.internal.resources{ResourceInterestUpdater.java" element4="/src<org.eclipse.mylyn.internal.resources{ResourceInteractionMonitor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181359610397" units="4" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui' - Original project: 'org.eclipse.mylyn.resources.ui' - Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui' - Original element: 'org.eclipse.mylyn.internal.resources.preferences.FocusedResourcesPreferenceInitializer.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.resources.ui" element1="/src<org.eclipse.mylyn.internal.resources.preferences{FocusedResourcesPreferenceInitializer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181359631799" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui' - Original project: 'org.eclipse.mylyn.resources.ui' - Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui' - Original element: 'org.eclipse.mylyn.internal.resources.preferences.FocusedResourcesExtensionPointReader.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.resources.ui" element1="/src<org.eclipse.mylyn.internal.resources.preferences{FocusedResourcesExtensionPointReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181359640061" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.resources.ui' - Original project: 'org.eclipse.mylyn.resources.ui' - Original element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.preferences'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.resources.preferences" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181359645723" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.resources.ui.FocusedResourcesPreferenceInitializer' to 'ResourcesUiPreferenceInitializer' - Original project: 'org.eclipse.mylyn.resources.ui' - Original element: 'org.eclipse.mylyn.internal.resources.ui.FocusedResourcesPreferenceInitializer' - Renamed element: 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiPreferenceInitializer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'FocusedResourcesPreferenceInitializer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.resources.ui{FocusedResourcesPreferenceInitializer.java[FocusedResourcesPreferenceInitializer" matchStrategy="1" name="ResourcesUiPreferenceInitializer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181359659571" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.resources.ui.FocusedResourcesExtensionPointReader' to 'ResourcesUiExtensionPointReader' - Original project: 'org.eclipse.mylyn.resources.ui' - Original element: 'org.eclipse.mylyn.internal.resources.ui.FocusedResourcesExtensionPointReader' - Renamed element: 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiExtensionPointReader' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'FocusedResourcesExtensionPointReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.resources.ui{FocusedResourcesExtensionPointReader.java[FocusedResourcesExtensionPointReader" matchStrategy="1" name="ResourcesUiExtensionPointReader" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181359670601" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..262505a
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,11 @@
+1181269003549 Rename type 'MylarResourcesPlugin'
+1181269476198 Rename type 'MylarResourcesPreferencePage'
+1181269493779 Rename type 'MylarResourcesPreferenceInitializer'
+1181269514972 Rename type 'MylarResourcesExtensionPointReader'
+1181330314075 Rename type 'FocusedResourcesPlugin'
+1181359610397 Move compilation units
+1181359631799 Move compilation unit
+1181359640061 Move compilation unit
+1181359645723 Delete element
+1181359659571 Rename type 'FocusedResourcesPreferenceInitializer'
+1181359670601 Rename type 'FocusedResourcesExtensionPointReader'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..6c794cf
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void closeEditor(IInteractionElement element)' from 'org.eclipse.mylyn.internal.resources.ui.ContextEditorManager.interestChanged()' to 'org.eclipse.mylyn.internal.resources.ui.ContextEditorManager' - Original project: 'org.eclipse.mylyn.resources.ui' - Method name: 'closeEditor' - Destination type: 'org.eclipse.mylyn.internal.resources.ui.ContextEditorManager' - Declared visibility: 'private'" comments="false" description="Extract method 'closeEditor'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.resources.ui{ContextEditorManager.java" name="closeEditor" replace="false" selection="12260 537" stamp="1182728264250" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..1a93be3
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1 @@
+1182728264250 Extract method 'closeEditor'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..6cc8ea1
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private String createRegexFromPattern(String pattern)' from 'org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor.getExclusionPatterns()' to 'org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Method name: 'createRegexFromPattern'
- Destination type: 'org.eclipse.mylyn.internal.resources.ui.ResourceChangeMonitor'
- Declared visibility: 'private'" comments="false" description="Extract method 'createRegexFromPattern'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.resources.ui{ResourceChangeMonitor.java" name="createRegexFromPattern" replace="false" selection="4180 135" stamp="1222880876906" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..c3cb95b
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1 @@
+1222880876906 Extract method 'createRegexFromPattern'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..d22de10
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ResourcesUiBridgePlugin.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.resources.ui" element1="/src<org.eclipse.mylyn.resources{ResourcesUiBridgePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207875540112" units="1" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.resources' to 'org.eclipse.mylyn.resources.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.resources'
- Renamed element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.resources.ui'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.resources'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.resources" name="org.eclipse.mylyn.resources.ui" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1207875585132" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.resources.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.resources.ui" element1="/src<org.eclipse.mylyn.internal.resources.ui{ResourcesUiBridgePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207875823517" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.internal.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui.ResourcesUiBridgePlugin.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.resources.ui" element1="/src<org.eclipse.mylyn.resources.ui{ResourcesUiBridgePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207876146703" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..ff37f41
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,4 @@
+1207875540112 Move compilation unit
+1207875585132 Rename package 'org.eclipse.mylyn.resources'
+1207875823517 Move compilation unit
+1207876146703 Move compilation unit
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..ae12881
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.internal.resources.ui.ContextEditorManager.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.internal.resources.ui{ContextEditorManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208556146865" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.internal.resources.ui.IContextAwareEditor.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.internal.resources.ui{IContextAwareEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208556285597" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin.getEditorManager()' to 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin.getEditorManager()'
- Destination type: 'org.eclipse.mylyn.internal.context.ui.ContextUiPlugin'" delegate="false" deprecate="true" description="Move member 'getEditorManager'" element1="/src<org.eclipse.mylyn.internal.resources.ui{ResourcesUiBridgePlugin.java[ResourcesUiBridgePlugin~getEditorManager" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui{ContextUiPlugin.java[ContextUiPlugin" stamp="1208559993707" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..6a49c56
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,3 @@
+1208556146865 Move compilation unit
+1208556285597 Move compilation unit
+1208559993707 Move member 'getEditorManager'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..b11b1db
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.resources.ui'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Destination element: 'org.eclipse.mylyn.resources.ui/src/org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.internal.resources.ui.FocusCommonNavigatorAction.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.resources.ui" element1="/src<org.eclipse.mylyn.internal.resources.ui{FocusCommonNavigatorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210901842023" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..ca7f2b8
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1 @@
+1210901842023 Move compilation unit
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..6ffb7f4
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.resources.ui{ResourcesUiBridgePlugin.java[ResourcesUiBridgePlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213246428418" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..18529b7
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1 @@
+1213246428418 Rename field 'PLUGIN_ID'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2009/1/5/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2009/1/5/refactorings.history
new file mode 100644
index 0000000..4be310b
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2009/1/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void showEditorCloseWarning()' from 'org.eclipse.mylyn.internal.resources.ui.EditorInteractionMonitor.editorClosed()' to 'org.eclipse.mylyn.internal.resources.ui.EditorInteractionMonitor'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Method name: 'showEditorCloseWarning'
- Destination type: 'org.eclipse.mylyn.internal.resources.ui.EditorInteractionMonitor'
- Declared visibility: 'private'" comments="false" description="Extract method 'showEditorCloseWarning'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.resources.ui{EditorInteractionMonitor.java" name="showEditorCloseWarning" replace="false" selection="4180 885" stamp="1233101794318" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2009/1/5/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2009/1/5/refactorings.index
new file mode 100644
index 0000000..6178fa4
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2009/1/5/refactorings.index
@@ -0,0 +1 @@
+1233101794318 Extract method 'showEditorCloseWarning'
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2009/2/7/refactorings.history b/org.eclipse.mylyn.resources.ui/.refactorings/2009/2/7/refactorings.history
new file mode 100644
index 0000000..5aa44e4
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2009/2/7/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename local variable 'field1' in 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.isPreservedFilter(...)' to 'filterExpressionField1'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.isPreservedFilter(ViewerFilter).field1'
- Renamed element: 'field1'
- Update references to refactored element" description="Rename local variable 'field1'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.resources.ui{FocusCommonNavigatorAction.java[FocusCommonNavigatorAction~isPreservedFilter~QViewerFilter;@field1!7728!7786!7734!7739!QField;" name="filterExpressionField1" references="true" stamp="1234315572339" version="1.0"/>
<refactoring comment="Rename local variable 'filterExpressionField1' in 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.isPreservedFilter(...)' to 'filterExpressionField2'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.isPreservedFilter(ViewerFilter).filterExpressionField1'
- Renamed element: 'filterExpressionField1'
- Update references to refactored element" description="Rename local variable 'filterExpressionField1'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.resources.ui{FocusCommonNavigatorAction.java[FocusCommonNavigatorAction~isPreservedFilter~QViewerFilter;@filterExpressionField1!7728!7802!7734!7755!QField;" name="filterExpressionField2" references="true" stamp="1234315580336" version="1.0"/>
<refactoring comment="Rename local variable 'field2' in 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.isPreservedFilter(...)' to 'filterExpressionField1'
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.isPreservedFilter(ViewerFilter).field2'
- Renamed element: 'field2'
- Update references to refactored element" description="Rename local variable 'field2'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.resources.ui{FocusCommonNavigatorAction.java[FocusCommonNavigatorAction~isPreservedFilter~QViewerFilter;@field2!8032!8090!8038!8043!QField;" name="filterExpressionField1" references="true" stamp="1234315592283" version="1.0"/>
<refactoring comment="Convert local variable 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.installInterestFilter().filterExpressionField2' in 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.installInterestFilter()' to field
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.installInterestFilter().filterExpressionField2'
- Field name: 'filterExpressionField2'
- Initialize field in method
- Declared visibility: 'private'" description="Convert local variable 'filterExpressionField2' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylyn.resources.ui{FocusCommonNavigatorAction.java" name="filterExpressionField2" selection="3188 0" stamp="1234315657460" static="false" version="1.0" visibility="2"/>
<refactoring comment="Convert local variable 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.installInterestFilter().filterExpressionField1' in 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.installInterestFilter()' to field
- Original project: 'org.eclipse.mylyn.resources.ui'
- Original element: 'org.eclipse.mylyn.resources.ui.FocusCommonNavigatorAction.installInterestFilter().filterExpressionField1'
- Field name: 'filterExpressionField1'
- Initialize field in method
- Declared visibility: 'private'" description="Convert local variable 'filterExpressionField1' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylyn.resources.ui{FocusCommonNavigatorAction.java" name="filterExpressionField1" selection="3396 0" stamp="1234315664549" static="false" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/.refactorings/2009/2/7/refactorings.index b/org.eclipse.mylyn.resources.ui/.refactorings/2009/2/7/refactorings.index
new file mode 100644
index 0000000..ff9e458
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.refactorings/2009/2/7/refactorings.index
@@ -0,0 +1,5 @@
+1234315572339 Rename local variable 'field1'
+1234315580336 Rename local variable 'filterExpressionField1'
+1234315592283 Rename local variable 'field2'
+1234315657460 Convert local variable 'filterExpressionField2' to field
+1234315664549 Convert local variable 'filterExpressionField1' to field
diff --git a/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.resources.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.resources.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d127a36
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.resources.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin
+Require-Bundle: org.eclipse.ui.ide,
+ org.eclipse.core.runtime,
+ org.eclipse.ui,
+ org.eclipse.core.resources,
+ org.eclipse.ui.navigator,
+ org.eclipse.jface.text,
+ org.eclipse.compare,
+ org.eclipse.core.expressions,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: org.eclipse.mylyn.internal.resources.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.resources.ui.preferences;x-internal:=true,
+ org.eclipse.mylyn.resources.ui
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.resources.ui/about.html b/org.eclipse.mylyn.resources.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/build-user.xml b/org.eclipse.mylyn.resources.ui/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.resources.ui/build.properties b/org.eclipse.mylyn.resources.ui/build.properties
new file mode 100644
index 0000000..1c7c982
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = plugin.xml,\
+ icons/,\
+ META-INF/,\
+ about.html,\
+ doc/,\
+ .,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.resources.ui/doc/ant.html b/org.eclipse.mylyn.resources.ui/doc/ant.html
new file mode 100644
index 0000000..1f17a2e
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/doc/ant.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Ant Editing</h2>Interest-based filtering is
+ now supported in the Ant editor's Outline view by toggling the
+ glasses.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/filtering-ant.gif" width="464" height="113"></p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.resources.ui/doc/book.css b/org.eclipse.mylyn.resources.ui/doc/book.css
new file mode 100644
index 0000000..faa4199
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/doc/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.resources.ui/doc/pde.html b/org.eclipse.mylyn.resources.ui/doc/pde.html
new file mode 100644
index 0000000..53cd888
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/doc/pde.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>Plug-in Development</h2>
+<p>...</p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.resources.ui/doc/toc.xml b/org.eclipse.mylyn.resources.ui/doc/toc.xml
new file mode 100644
index 0000000..924706c
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/doc/toc.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.mylyn.doc/doc/toc.xml#xml" label="XML Support">
+ <topic label="XML Support" href="doc/xml.html">
+ <topic label="Ant Editing" href="doc/ant.html"/>
+ </topic>
+</toc>
+
+
+
diff --git a/org.eclipse.mylyn.resources.ui/doc/xml.html b/org.eclipse.mylyn.resources.ui/doc/xml.html
new file mode 100644
index 0000000..c6bc86c
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/doc/xml.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+<meta http-equiv="Content-Language" content="en-us">
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
+ type="text/css">
+<title>Mylar New & Noteworthy</title>
+</head>
+<body>
+<h2>XML Editing Support</h2>
+<p> </p>
+<p></p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.resources.ui/icons/elcl16/edge-ref-xml.gif b/org.eclipse.mylyn.resources.ui/icons/elcl16/edge-ref-xml.gif
new file mode 100644
index 0000000..38bf351
Binary files /dev/null and b/org.eclipse.mylyn.resources.ui/icons/elcl16/edge-ref-xml.gif differ
diff --git a/org.eclipse.mylyn.resources.ui/icons/elcl16/focus-disabled.gif b/org.eclipse.mylyn.resources.ui/icons/elcl16/focus-disabled.gif
new file mode 100644
index 0000000..24bbeae
Binary files /dev/null and b/org.eclipse.mylyn.resources.ui/icons/elcl16/focus-disabled.gif differ
diff --git a/org.eclipse.mylyn.resources.ui/icons/elcl16/focus.gif b/org.eclipse.mylyn.resources.ui/icons/elcl16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.resources.ui/icons/elcl16/focus.gif differ
diff --git a/org.eclipse.mylyn.resources.ui/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.resources.ui/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.resources.ui/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.resources.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.resources.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.resources.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.resources.ui/plugin.properties b/org.eclipse.mylyn.resources.ui/plugin.properties
new file mode 100644
index 0000000..49f0691
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/plugin.properties
@@ -0,0 +1,14 @@
+#Properties file for org.eclipse.mylyn.resources.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Resources UI
+
+FocusedResourcesPreferencePage.name = Resources
+
+keywords.label = mylyn resources
+
+ResourceStructureBridge.name = Resource Structure Bridge
+
+InterestDecrementAction.label = Remove from Context
+InterestDecrementAction.tooltip = Mark selected element as uninteresting
+InterestIncrementAction.label = Mark as Landmark
+InterestIncrementAction.tooltip = Make selected element a landmark
diff --git a/org.eclipse.mylyn.resources.ui/plugin.xml b/org.eclipse.mylyn.resources.ui/plugin.xml
new file mode 100644
index 0000000..44c43b7
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/plugin.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension-point id="changeMonitoring" name="Resource Change Monitorin" schema="schema/changeMonitoring.exsd"/>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ name="%FocusedResourcesPreferencePage.name"
+ class="org.eclipse.mylyn.internal.resources.ui.preferences.FocusedResourcesPreferencePage"
+ id="org.eclipse.mylyn.resources.ui.preferences.resources"
+ category="org.eclipse.mylyn.tasks.ui.preferences">
+ <keywordReference id="org.eclipse.mylyn.resources.ui.keywords"/>
+ </page>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.keywords">
+ <keyword
+ label="%keywords.label"
+ id="org.eclipse.mylyn.resources.ui.keywords"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.resources.ui.changeMonitoring">
+ <exclude
+ pattern=".*"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.context.core.bridges">
+ <structureBridge
+ class="org.eclipse.mylyn.internal.resources.ui.ResourceStructureBridge"
+ name="%ResourceStructureBridge.name"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.context.ui.bridges">
+ <uiBridge
+ class="org.eclipse.mylyn.internal.resources.ui.ResourceUiBridge"
+ contentType="resource"/>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.context.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin$ResourcesUiBridgeStartup">
+ </startup>
+ </extension>
+
+ <extension point="org.eclipse.core.runtime.preferences">
+ <initializer class="org.eclipse.mylyn.internal.resources.ui.ResourcesUiPreferenceInitializer"/>
+ </extension>
+
+
+ <!--
+ <extension
+ point="org.eclipse.ui.navigator.viewer">
+ <dragAssistant
+ class="org.eclipse.ui.navigator.resources.ResourceDragAdapterAssistant"
+ viewerId="org.eclipse.mylyn.context.ui.navigator.context"/>
+ </extension>
+ -->
+
+ <extension point = "org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="true"
+ id="org.eclipse.mylyn.ui.interest"
+ objectClass="org.eclipse.core.resources.IResource">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestDecrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.decrement"
+ enablesFor="*"
+ icon="icons/elcl16/interest-decrease.gif"
+ id="org.eclipse.mylyn.resources.ui.ui.interest.remove.element"
+ label="%InterestDecrementAction.label"
+ menubarPath="group.reorganize"
+ tooltip="%InterestDecrementAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </objectContribution>
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.ui.interest"
+ objectClass="org.eclipse.core.resources.IFile">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestIncrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.increment"
+ enablesFor="*"
+ icon="icons/elcl16/interest-increase.gif"
+ id="org.eclipse.mylyn.resources.ui.ui.interest.increase.element"
+ label="%InterestIncrementAction.label"
+ menubarPath="group.reorganize"
+ tooltip="%InterestIncrementAction.tooltip">
+ <enablement>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </enablement>
+ </action>
+ </objectContribution>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.resources.ui/schema/changeMonitoring.exsd b/org.eclipse.mylyn.resources.ui/schema/changeMonitoring.exsd
new file mode 100644
index 0000000..f1c80d7
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/schema/changeMonitoring.exsd
@@ -0,0 +1,67 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.resources.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.resources.ui" id="changeMonitoring" name="changeMonitoring"/>
+ </appInfo>
+ <documentation>
+ This extension point is used so that plugins may contribute extensions that should be ignored by default (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=178931 for details)
+ </documentation>
+ </annotation>
+
+ <element name="changeMonitoring">
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="exclude" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+ </element>
+
+ <element name="exclude">
+ <complexType>
+ <attribute name="pattern" type="string" use="required">
+ <annotation>
+ <documentation>
+ Pattern can include URI syntax su
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ Use example:
+
+ <extension point="org.eclipse.mylyn.resources.ui.mylyn_resources_to_ignore">
+ <resource_to_ignore pattern="*.pyc"/>
+ <resource_to_ignore pattern="*.pyo"/>
+ </extension>
+ </documentation>
+ </annotation>
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ In the preferences initializer it will search for plugins that supply this extension point and add those as defaults.
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/EditorInteractionMonitor.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/EditorInteractionMonitor.java
new file mode 100644
index 0000000..f1b0af7
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/EditorInteractionMonitor.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.compare.internal.CompareEditor;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.context.ui.ContextUi;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.monitor.ui.AbstractEditorTracker;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class EditorInteractionMonitor extends AbstractEditorTracker {
+
+ public static final String SOURCE_ID = "org.eclipse.mylyn.resources.ui.editor.tracker.interest"; //$NON-NLS-1$
+
+ @Override
+ protected void editorBroughtToTop(IEditorPart part) {
+ Object object = part.getEditorInput().getAdapter(IResource.class);
+ if (object instanceof IResource) {
+ IResource resource = (IResource) object;
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(resource);
+ InteractionEvent selectionEvent = new InteractionEvent(InteractionEvent.Kind.SELECTION,
+ bridge.getContentType(), bridge.getHandleIdentifier(resource), part.getSite().getId());
+ ContextCore.getContextManager().processInteractionEvent(selectionEvent);
+ }
+ }
+
+ @Override
+ public void editorOpened(IEditorPart editorPartOpened) {
+ if (!ContextUi.isEditorAutoManageEnabled() || ContextCore.getContextManager().isContextCapturePaused()) {
+ return;
+ }
+ IWorkbenchPage page = editorPartOpened.getSite().getPage();
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>();
+ for (IEditorReference editorReference : page.getEditorReferences()) {
+ try {
+ IInteractionElement element = null;
+ Object adapter;
+ adapter = editorReference.getEditorInput().getAdapter(IResource.class);
+ if (adapter instanceof IFile) {
+ String handle = ContextCore.getStructureBridge(adapter).getHandleIdentifier(adapter);
+ element = ContextCore.getContextManager().getElement(handle);
+ }
+ if (element != null && !element.getInterest().isInteresting()
+ && !isSameEditor(editorPartOpened, editorReference)) {
+ toClose.add(editorReference);
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ if (toClose.size() > 0) {
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+
+ private boolean isSameEditor(IEditorPart editorPart1, IEditorReference editorReference2) throws PartInitException {
+ if (editorPart1 == null || editorReference2 == null) {
+ return false;
+ } else {
+ return editorPart1.getEditorInput().equals(editorReference2.getEditorInput());
+ }
+ }
+
+ /**
+ * Decrement interest if an editor for a resource is closed.
+ */
+ @SuppressWarnings("restriction")
+ @Override
+ public void editorClosed(IEditorPart editorPart) {
+ if (PlatformUI.getWorkbench().isClosing()) {
+ return;
+ } else if (ContextUi.isEditorAutoCloseEnabled() && !otherEditorsOpenForResource(editorPart)
+ && !(editorPart instanceof CompareEditor)) {
+
+ IInteractionElement element = null;
+ AbstractContextUiBridge uiBridge = ContextUi.getUiBridgeForEditor(editorPart);
+ Object object = uiBridge.getObjectForTextSelection(null, editorPart);
+ if (object != null) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ element = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(object));
+ }
+ // TODO: probably should be refactored into delegation
+ if (element == null) {
+ Object adapter = editorPart.getEditorInput().getAdapter(IResource.class);
+ if (adapter instanceof IResource) {
+ IResource resource = (IResource) adapter;
+ AbstractContextStructureBridge resourceBridge = ContextCore.getStructureBridge(resource);
+ element = ContextCore.getContextManager().getElement(resourceBridge.getHandleIdentifier(resource));
+ }
+ }
+ if (element != null) {
+ showEditorCloseWarning();
+ ContextCorePlugin.getContextManager().manipulateInterestForElement(element, false, false, false,
+ SOURCE_ID);
+ }
+ }
+ }
+
+ private void showEditorCloseWarning() {
+ if (ContextCore.getContextManager().isContextActive()
+ && org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.getDefault()
+ .getPreferenceStore()
+ .getBoolean(
+ org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_WARNING)) {
+ try {
+ if (!CoreUtil.TEST_MODE) {
+ MessageDialog.openInformation(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ "Mylyn", //$NON-NLS-1$
+ Messages.EditorInteractionMonitor_Closing_a_file_automatically_removes_it_from_the_Task_Context);
+ }
+ } finally {
+ org.eclipse.mylyn.internal.context.ui.ContextUiPlugin.getDefault()
+ .getPreferenceStore()
+ .setValue(
+ org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants.AUTO_MANAGE_EDITOR_CLOSE_WARNING,
+ false);
+ }
+ }
+ }
+
+ private boolean otherEditorsOpenForResource(IEditorPart editorPart) {
+ Object adapter = editorPart.getEditorInput().getAdapter(IResource.class);
+ if (adapter instanceof IResource) {
+ IResource resource = (IResource) adapter;
+ IWorkbenchPage page = editorPart.getSite().getPage();
+ for (IEditorReference editorReference : page.getEditorReferences()) {
+ try {
+ Object otherAdapter;
+ otherAdapter = editorReference.getEditorInput().getAdapter(IResource.class);
+ if (otherAdapter instanceof IResource && otherAdapter.equals(resource)) {
+ return true;
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/Messages.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/Messages.java
new file mode 100644
index 0000000..edd09ca
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.resources.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String EditorInteractionMonitor_Closing_a_file_automatically_removes_it_from_the_Task_Context;
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
new file mode 100644
index 0000000..d5543fd
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.resources.ui.ResourcesUi;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceChangeMonitor implements IResourceChangeListener {
+
+ private class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+
+ private final Set<IResource> addedResources;
+
+ private final Set<IResource> changedResources;
+
+ private final Set<String> excludedPatterns;
+
+ private boolean haveTeamPrivateMember;
+
+ public ResourceDeltaVisitor() {
+ Set<String> excludedResourcePatterns = ResourcesUiPreferenceInitializer.getExcludedResourcePatterns();
+ excludedResourcePatterns.addAll(ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns());
+ this.excludedPatterns = new HashSet<String>();
+ for (String pattern : excludedResourcePatterns) {
+ if (pattern != null && pattern.length() > 0) {
+ pattern = createRegexFromPattern(pattern);
+ this.excludedPatterns.add(pattern);
+ }
+ }
+ this.addedResources = new HashSet<IResource>();
+ this.changedResources = new HashSet<IResource>();
+ }
+
+ public boolean hasValidResult() {
+ return !haveTeamPrivateMember;
+ }
+
+ public boolean visit(IResourceDelta delta) {
+ if (haveTeamPrivateMember) {
+ return false;
+ }
+ if (delta.getResource().isTeamPrivateMember()) {
+ haveTeamPrivateMember = true;
+ return false;
+ }
+ if (isExcluded(delta.getResource().getProjectRelativePath(), delta.getResource(), excludedPatterns)) {
+ return false;
+ }
+
+ IResourceDelta[] added = delta.getAffectedChildren(IResourceDelta.ADDED);
+ for (IResourceDelta element : added) {
+ IResource resource = element.getResource();
+ if ((resource instanceof IFile || resource instanceof IFolder)
+ && !isExcluded(resource.getProjectRelativePath(), resource, excludedPatterns)) {
+ addedResources.add(resource);
+ }
+ }
+
+ IResourceDelta[] changed = delta.getAffectedChildren(IResourceDelta.CHANGED | IResourceDelta.REMOVED);
+ for (IResourceDelta element : changed) {
+ IResource resource = element.getResource();
+ // special rule for feature.xml files: bug 249856
+ if (resource instanceof IFile
+ && !isExcluded(resource.getProjectRelativePath(), resource, excludedPatterns)
+ && !"feature.xml".equals(resource.getName())) { //$NON-NLS-1$
+ if (element.getKind() == IResourceDelta.CHANGED
+ && (element.getFlags() & IResourceDelta.CONTENT) == 0) {
+ // make sure that there was a content change and not just a markers change
+ continue;
+ }
+ changedResources.add(resource);
+ }
+ }
+ return true;
+ }
+
+ public Set<IResource> getChangedResources() {
+ return changedResources;
+ }
+
+ public Set<IResource> getAddedResources() {
+ return addedResources;
+ }
+
+ };
+
+ // TODO e3.4 replace with IContainer.INCLUDE_HIDDEN
+ private static final int INCLUDE_HIDDEN = 8;
+
+ private boolean enabled;
+
+ public ResourceChangeMonitor() {
+ this.enabled = true;
+ }
+
+ public void resourceChanged(IResourceChangeEvent event) {
+ if (!enabled || !ContextCore.getContextManager().isContextActive()) {
+ return;
+ }
+ if (event.getType() != IResourceChangeEvent.POST_CHANGE) {
+ return;
+ }
+ IResourceDelta rootDelta = event.getDelta();
+ if (rootDelta != null) {
+ ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+ try {
+ rootDelta.accept(visitor, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | INCLUDE_HIDDEN);
+ if (visitor.hasValidResult()) {
+ ResourcesUi.addResourceToContext(visitor.getChangedResources(), InteractionEvent.Kind.PREDICTION);
+ ResourcesUi.addResourceToContext(visitor.getAddedResources(), InteractionEvent.Kind.PROPAGATION);
+ }
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Could not accept marker visitor", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * Public for testing.
+ */
+ public static String createRegexFromPattern(String pattern) {
+ // prepare the pattern to be a regex
+ pattern = pattern.replaceAll("\\.", "\\\\."); //$NON-NLS-1$ //$NON-NLS-2$
+ pattern = pattern.replaceAll("\\*", ".*"); //$NON-NLS-1$ //$NON-NLS-2$
+ return pattern;
+ }
+
+ /**
+ * Public for testing.
+ *
+ * @param resource
+ * can be null
+ */
+ public static boolean isExcluded(IPath path, IResource resource, Set<String> excludedPatterns) {
+ if (resource != null && resource.isDerived()) {
+ return true;
+ }
+ boolean excluded = false;
+ // NOTE: n^2 time complexity, but should not be a bottleneck
+ for (String pattern : excludedPatterns) {
+ if (resource != null && pattern.startsWith("file:/")) { //$NON-NLS-1$
+ excluded |= isUriExcluded(resource.getLocationURI().toString(), pattern);
+ } else {
+ for (String segment : path.segments()) {
+ excluded |= segment.matches(pattern);
+
+ // minor performance improvement
+ if (excluded) {
+ break;
+ }
+ }
+ }
+
+ if (excluded) {
+ break;
+ }
+ }
+ return excluded;
+ }
+
+ /**
+ * Public for testing.
+ */
+ public static boolean isUriExcluded(String uri, String pattern) {
+ if (uri != null && uri.startsWith(pattern)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceContextLabelProvider.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceContextLabelProvider.java
new file mode 100644
index 0000000..e79c596
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceContextLabelProvider.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.internal.context.ui.AbstractContextLabelProvider;
+import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("restriction")
+public class ResourceContextLabelProvider extends AbstractContextLabelProvider {
+
+ @Override
+ public Image getImage(IInteractionElement node) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(ResourceStructureBridge.CONTENT_TYPE);
+ Object object = bridge.getObjectForHandle(node.getHandleIdentifier());
+ return getImageForObject(object);
+ }
+
+ @Override
+ protected Image getImageForObject(Object object) {
+ if (object instanceof IFile) {
+ return ContextUiImages.getImage(ContextUiImages.FILE_GENERIC);
+ } else if (object instanceof IContainer) {
+ return ContextUiImages.getImage(ContextUiImages.FOLDER_GENERIC);
+ }
+ return null;
+ }
+
+ @Override
+ protected String getTextForObject(Object object) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ return bridge.getLabel(object);
+ }
+
+ /**
+ * TODO: slow?
+ */
+ @Override
+ public String getText(IInteractionElement node) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(ResourceStructureBridge.CONTENT_TYPE);
+ return bridge.getLabel(bridge.getObjectForHandle(node.getHandleIdentifier()));
+ }
+
+ @Override
+ protected Image getImage(IInteractionRelation edge) {
+ return null;
+ }
+
+ @Override
+ protected String getText(IInteractionRelation edge) {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceInteractionMonitor.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceInteractionMonitor.java
new file mode 100644
index 0000000..3be59ea
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceInteractionMonitor.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceInteractionMonitor extends AbstractUserInteractionMonitor {
+
+ private static final String ID_SYNCHRONIZE_VIEW = "org.eclipse.team.sync.views.SynchronizeView"; //$NON-NLS-1$
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ // ignore events from the synchronize view to avoid files jumping between change sets when selected
+ if (ID_SYNCHRONIZE_VIEW.equals(part.getSite().getId())) {
+ return;
+ }
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+
+// Object selectedObject = structuredSelection.getFirstElement();
+ for (Iterator<?> iterator = structuredSelection.iterator(); iterator.hasNext();) {
+ Object selectedObject = iterator.next();
+ IResource resource;
+ if (selectedObject instanceof IResource) {
+ resource = (IResource) selectedObject;
+ super.handleElementSelection(part, resource, contributeToContext);
+ }
+
+ }
+ } else if (selection instanceof TextSelection) {
+ if (part instanceof EditorPart) {
+ try {
+ Object object = ((EditorPart) part).getEditorInput().getAdapter(IResource.class);
+ if (object instanceof IFile) {
+ IFile file = (IFile) object;
+ if (file.getFileExtension() != null
+ && !ContextCore.getContentTypes().contains(file.getFileExtension())) {
+ super.handleElementEdit(part, object, contributeToContext);
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Failed to resolve resource edit", t)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceInterestUpdater.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceInterestUpdater.java
new file mode 100644
index 0000000..be94c57
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceInterestUpdater.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceInterestUpdater {
+
+ /**
+ * In Mylyn 2.0 was: "org.eclipse.mylyn.ide.resource.interest.updater"
+ */
+ public static final String SOURCE_ID = "org.eclipse.mylyn.resources.ui.interest.updater"; //$NON-NLS-1$
+
+ private boolean syncExec = false;
+
+ public void addResourceToContext(final Set<IResource> resources, final InteractionEvent.Kind interactionKind) {
+ try {
+ if (!resources.isEmpty()) {
+ if (syncExec) {
+ internalAddResourceToContext(resources, interactionKind);
+ } else {
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ if (!workbench.isClosing() && !workbench.getDisplay().isDisposed()) {
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ internalAddResourceToContext(resources, interactionKind);
+ }
+ });
+ }
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN, "" //$NON-NLS-1$
+ + "Could not add resource to context: \"" + resources + "\"", t)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ @SuppressWarnings("restriction")
+ private void internalAddResourceToContext(Set<IResource> resources, InteractionEvent.Kind interactionKind) {
+ List<InteractionEvent> interactionEvents = new ArrayList<InteractionEvent>();
+ for (IResource resource : resources) {
+ if (acceptResource(resource)) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(resource);
+ String handle = bridge.getHandleIdentifier(resource);
+ if (handle != null) {
+ IInteractionElement element = ContextCore.getContextManager().getElement(handle);
+ if (element != null && !element.getInterest().isInteresting()) {
+ InteractionEvent interactionEvent = new InteractionEvent(interactionKind,
+ bridge.getContentType(), handle, SOURCE_ID);
+ interactionEvents.add(interactionEvent);
+ }
+ }
+ }
+ }
+ ContextCorePlugin.getContextManager().processInteractionEvents(interactionEvents, true);
+// if (InteractionEvent.Kind.SELECTION.equals(interactionKind)) {
+// ContextCorePlugin.getContextManager().processInteractionEvents(interactionEvents, true);
+// } else {
+// ContextCorePlugin.getContextManager().processInteractionEvents(interactionEvents, false);
+// }
+ }
+
+ private boolean acceptResource(IResource resource) {
+ if (resource.isAccessible() && !resource.isDerived() && !resource.isPhantom()) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * For testing.
+ */
+ public void setSyncExec(boolean syncExec) {
+ this.syncExec = syncExec;
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceStructureBridge.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceStructureBridge.java
new file mode 100644
index 0000000..2f44ac7
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceStructureBridge.java
@@ -0,0 +1,236 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.Marker;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.ui.views.markers.internal.ConcreteMarker;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceStructureBridge extends AbstractContextStructureBridge {
+
+ public final static String CONTENT_TYPE = ContextCore.CONTENT_TYPE_RESOURCE;
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getParentHandle(String handle, boolean allowChildBridgeHandles) {
+ if (allowChildBridgeHandles) {
+ return getParentHandle(handle);
+ } else {
+ IResource resource = (IResource) getObjectForHandle(handle);
+ if (resource != null) {
+ IContainer parent = resource.getParent();
+ return getHandleIdentifier(parent);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+
+ IResource resource = (IResource) getObjectForHandle(handle);
+ if (resource != null) {
+ IContainer parent = resource.getParent();
+ // try to adapt to the corresponding content type's parent
+ if (resource instanceof IFile) {
+ for (String contentType : ContextCore.getChildContentTypes(CONTENT_TYPE)) {
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(contentType);
+ Object adaptedParent = parentBridge.getAdaptedParent(resource);
+ // HACK: only returns first
+ if (adaptedParent != null) {
+ return parentBridge.getHandleIdentifier(adaptedParent);
+ }
+ }
+ }
+ return getHandleIdentifier(parent);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ Object object = getObjectForHandle(handle);
+ if (object instanceof IResource) {
+ IResource resource = (IResource) object;
+ if (resource instanceof IContainer) {
+ IContainer container = (IContainer) resource;
+ IResource[] children;
+ try {
+ // make sure that we dont try to get the children of a closed project as this can cause an exception
+ if (container.isAccessible()) {
+ children = container.members();
+ List<String> childHandles = new ArrayList<String>();
+ for (IResource element : children) {
+ String childHandle = getHandleIdentifier(element);
+ if (childHandle != null) {
+ childHandles.add(childHandle);
+ }
+ }
+ return childHandles;
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN, "" //$NON-NLS-1$
+ + "Could not get child", e)); //$NON-NLS-1$
+ }
+ } else if (resource instanceof IFile) {
+ // delegate to child bridges
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ /**
+ * Uses java-style path for projects.
+ */
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object instanceof IProject) {
+ String path = ((IResource) object).getFullPath().toPortableString();
+ String javaCoreStylePath = "=" + path.substring(1); //$NON-NLS-1$
+ return javaCoreStylePath;
+ }
+ if (object instanceof IResource) {
+ return ((IResource) object).getFullPath().toPortableString();
+
+ } else if (object instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) object;
+ Object adapter = adaptable.getAdapter(IResource.class);
+ if (adapter instanceof IResource) {
+ return ((IResource) adapter).getFullPath().toPortableString();
+ }
+
+ }
+ return null;
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ if (handle == null) {
+ return null;
+ }
+ IPath path = new Path(handle);
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ if (path.segmentCount() == 1) {
+ String projectName = handle.substring(1);
+ try {
+ return workspace.getRoot().getProject(projectName);
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ } else if (path.segmentCount() > 1) {
+ return workspace.getRoot().findMember(path);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof IResource) {
+ return ((IResource) object).getName();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ Object element = getObjectForHandle(handle);
+ return element instanceof IFile;
+ }
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ if (object instanceof IResource) {
+ return true;
+ }
+ if (object instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) object;
+ Object adapter = adaptable.getAdapter(IResource.class);
+ if (adapter instanceof IResource) {
+ return true;
+ }
+
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return true;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return getObjectForHandle(handle) instanceof IFile;
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object object, int offset) {
+ IResource markerResource = null;
+ try {
+ if (object instanceof ConcreteMarker) {
+ markerResource = ((ConcreteMarker) object).getMarker().getResource();
+ } else if (object instanceof Marker) {
+ markerResource = ((Marker) object).getResource();
+ } else {
+ return null;
+ }
+ } catch (Exception e) {
+ return null;
+ }
+
+ // we can only get a handle for a marker with the resource plugin.xml
+ try {
+ if (markerResource instanceof IFile) {
+ IFile file = (IFile) markerResource;
+ return getHandleIdentifier(file);
+ }
+ return null;
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Could not find element for: \"" + object + "\"", t)); //$NON-NLS-1$ //$NON-NLS-2$
+ return null;
+ }
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ return getContentType();
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceUiBridge.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceUiBridge.java
new file mode 100644
index 0000000..836ca35
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceUiBridge.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * @author Mik Kersten
+ */
+public class ResourceUiBridge extends AbstractContextUiBridge {
+
+ @Override
+ public void open(IInteractionElement element) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element.getContentType());
+ if (bridge == null) {
+ return;
+ } else {
+ IResource resource = (IResource) bridge.getObjectForHandle(element.getHandleIdentifier());
+ if (resource instanceof IFile && resource.exists()) {
+ internalOpenEditor((IFile) resource, true);
+ }
+ }
+ }
+
+ private void internalOpenEditor(IFile file, boolean activate) {
+ try {
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IEditorDescriptor editorDescriptor = IDE.getDefaultEditor(file);
+ if (editorDescriptor != null && editorDescriptor.isInternal() && !editorDescriptor.isOpenInPlace()
+ && !isContextIgnoring(editorDescriptor)) {
+ IDE.openEditor(activePage, file, activate);
+ }
+ } catch (PartInitException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Failed to open editor for: \"" + file + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ private boolean isContextIgnoring(IEditorDescriptor editorDescriptor) {
+ // TODO: could find a better mechanism than tagging the ID
+ if (editorDescriptor.getId() != null && editorDescriptor.getId().endsWith(".contextIgnoring")) { //$NON-NLS-1$
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void close(IInteractionElement element) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element.getContentType());
+ Object object = bridge.getObjectForHandle(element.getHandleIdentifier());
+ if (object instanceof IFile) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>(0);
+ for (IEditorReference reference : page.getEditorReferences()) {
+ try {
+ IResource input = (IResource) reference.getEditorInput().getAdapter(IResource.class);
+ if (input instanceof IFile && ((IFile) input).equals(object)) {
+ toClose.add(reference);
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ if (toClose.size() > 0) {
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return false;
+ }
+
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ return null;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ Object adapter = input.getAdapter(IResource.class);
+ if (adapter instanceof IFile) {
+ IFile javaElement = (IFile) adapter;
+ String handle = ContextCore.getStructureBridge(javaElement).getHandleIdentifier(javaElement);
+ return ContextCore.getContextManager().getElement(handle);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getContentType() {
+ return ResourceStructureBridge.CONTENT_TYPE;
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiBridgePlugin.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiBridgePlugin.java
new file mode 100644
index 0000000..2c5617d
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiBridgePlugin.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Main entry point for the Resource Structure Bridge. Initialization order is very important.
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class ResourcesUiBridgePlugin extends AbstractUIPlugin {
+
+ /**
+ * @since 3.0
+ */
+ public static class ResourcesUiBridgeStartup implements IContextUiStartup {
+
+ public void lazyStartup() {
+ ResourcesUiBridgePlugin.getDefault().lazyStart();
+ }
+
+ }
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.resources.ui"; //$NON-NLS-1$
+
+ private static ResourcesUiBridgePlugin INSTANCE;
+
+ private ResourceChangeMonitor resourceChangeMonitor;
+
+ private ResourceInteractionMonitor resourceInteractionMonitor;
+
+ private EditorInteractionMonitor interestEditorTracker;
+
+ private ResourceInterestUpdater interestUpdater;
+
+ private static final String PREF_STORE_DELIM = ", "; //$NON-NLS-1$
+
+ public static final String PREF_RESOURCES_IGNORED = "org.eclipse.mylyn.ide.resources.ignored.pattern"; //$NON-NLS-1$
+
+ public static final String PREF_VAL_DEFAULT_RESOURCES_IGNORED = ".*" + PREF_STORE_DELIM; //$NON-NLS-1$
+
+ public ResourcesUiBridgePlugin() {
+ super();
+ INSTANCE = this;
+ }
+
+ /**
+ * This method is called upon plug-in activation
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ initPreferenceDefaults();
+ interestUpdater = new ResourceInterestUpdater();
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void lazyStart() {
+ resourceChangeMonitor = new ResourceChangeMonitor();
+ resourceInteractionMonitor = new ResourceInteractionMonitor();
+ interestEditorTracker = new EditorInteractionMonitor();
+
+ MonitorUi.getSelectionMonitors().add(resourceInteractionMonitor);
+
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeMonitor,
+ IResourceChangeEvent.POST_CHANGE);
+
+ interestEditorTracker.install(PlatformUI.getWorkbench());
+ }
+
+ protected void lazyStop() {
+ if (resourceChangeMonitor != null) {
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeMonitor);
+ }
+ if (resourceInteractionMonitor != null) {
+ MonitorUi.getSelectionMonitors().remove(resourceInteractionMonitor);
+ }
+ if (interestEditorTracker != null) {
+ interestEditorTracker.dispose(PlatformUI.getWorkbench());
+ }
+ }
+
+ /**
+ * This method is called when the plug-in is stopped
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ lazyStop();
+
+ super.stop(context);
+ INSTANCE = null;
+ }
+
+ private void initPreferenceDefaults() {
+ getPreferenceStore().setDefault(PREF_RESOURCES_IGNORED, PREF_VAL_DEFAULT_RESOURCES_IGNORED);
+ }
+
+ public List<IResource> getInterestingResources(IInteractionContext context) {
+ List<IResource> interestingResources = new ArrayList<IResource>();
+ Collection<IInteractionElement> resourceElements = ContextCore.getContextManager().getActiveDocuments(context);
+ for (IInteractionElement element : resourceElements) {
+ IResource resource = getResourceForElement(element, false);
+ if (resource != null) {
+ interestingResources.add(resource);
+ }
+ }
+ return interestingResources;
+ }
+
+ public void setExcludedResourcePatterns(Set<String> patterns) {
+ StringBuilder store = new StringBuilder();
+ for (String string : patterns) {
+ store.append(string);
+ store.append(PREF_STORE_DELIM);
+ }
+ getPreferenceStore().setValue(PREF_RESOURCES_IGNORED, store.toString());
+ }
+
+ public Set<String> getExcludedResourcePatterns() {
+ Set<String> ignored = new HashSet<String>();
+ String read = getPreferenceStore().getString(PREF_RESOURCES_IGNORED);
+ if (read != null) {
+ StringTokenizer st = new StringTokenizer(read, PREF_STORE_DELIM);
+ while (st.hasMoreTokens()) {
+ ignored.add(st.nextToken());
+ }
+ }
+ return ignored;
+ }
+
+ public static ResourceInterestUpdater getInterestUpdater() {
+ return INSTANCE.interestUpdater;
+ }
+
+ public IResource getResourceForElement(IInteractionElement element, boolean findContainingResource) {
+ if (element == null) {
+ return null;
+ }
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element.getContentType());
+ Object object = bridge.getObjectForHandle(element.getHandleIdentifier());
+ if (object instanceof IResource) {
+ return (IResource) object;
+ } else if (object instanceof IAdaptable) {
+ Object adapted = ((IAdaptable) object).getAdapter(IResource.class);
+ if (adapted instanceof IResource) {
+ return (IResource) adapted;
+ }
+ }
+ if (findContainingResource) { // recurse if not found
+ String parentHandle = bridge.getParentHandle(element.getHandleIdentifier());
+ if (element.getHandleIdentifier().equals(parentHandle)) {
+ return null;
+ } else {
+ return getResourceForElement(ContextCore.getContextManager().getElement(parentHandle), true);
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setResourceMonitoringEnabled(boolean enabled) {
+ resourceChangeMonitor.setEnabled(enabled);
+ }
+
+ public static ResourcesUiBridgePlugin getDefault() {
+ return INSTANCE;
+ }
+
+ @Deprecated
+ public ResourceBundle getResourceBundle() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiExtensionPointReader.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiExtensionPointReader.java
new file mode 100644
index 0000000..eb7403c
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiExtensionPointReader.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Fabio Zadrozny - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.resources.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * Helper to get extension point contributors
+ *
+ * @author Fabio Zadrozny
+ */
+public class ResourcesUiExtensionPointReader {
+
+ public final static String EXTENSION_CHANGE_MONITORING = "changeMonitoring"; //$NON-NLS-1$
+
+ public final static String ELEMENT_EXCLUDE = "exclude"; //$NON-NLS-1$
+
+ public final static String ATTR_PATTERN = "pattern"; //$NON-NLS-1$
+
+ private static Set<String> resourceExclusionPatterns = new HashSet<String>();
+
+ private static boolean extensionsRead = false;
+
+ public static Set<String> getDefaultResourceExclusions() {
+ if (!extensionsRead) {
+ readExtensions();
+ }
+ return resourceExclusionPatterns;
+ }
+
+ private static void readExtensions() {
+ IExtensionPoint teamProvider = Platform.getExtensionRegistry().getExtensionPoint(
+ ResourcesUiBridgePlugin.ID_PLUGIN + '.' + EXTENSION_CHANGE_MONITORING);
+ IExtension[] extensions = teamProvider.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+
+ for (IConfigurationElement element : elements) {
+ if (ELEMENT_EXCLUDE.equals(element.getName())) {
+ readLinkProvider(element);
+ }
+ }
+ }
+ extensionsRead = true;
+ }
+
+ private static void readLinkProvider(IConfigurationElement element) {
+ String exclude = element.getAttribute(ATTR_PATTERN);
+ if (exclude != null) {
+ resourceExclusionPatterns.add(exclude);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiPreferenceInitializer.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiPreferenceInitializer.java
new file mode 100644
index 0000000..11426bd
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourcesUiPreferenceInitializer.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Fabio Zadrozny - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.resources.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+
+/**
+ * This class is responsible for creating, storing and retrieving the values for the default context in the preference
+ * store. It is registered as an initializer class for the 'org.eclipse.core.runtime.preferences' extension point.
+ *
+ * @author Fabio (bug 178931)
+ * @author Mik Kersten
+ */
+public class ResourcesUiPreferenceInitializer extends AbstractPreferenceInitializer {
+
+ // XXX these constants are duplicated in ResourcesUiBridgePlugin
+ public static final String PREF_DEFAULT_SCOPE = "org.eclipse.mylyn.ide.resources"; //$NON-NLS-1$
+
+ private static final String PREF_STORE_DELIM = ", "; //$NON-NLS-1$
+
+ public static final String PREF_RESOURCES_IGNORED = PREF_DEFAULT_SCOPE + ".ignored.pattern"; //$NON-NLS-1$
+
+ public static Set<String> forcedExclusionPatterns = new HashSet<String>();
+
+ @Override
+ public void initializeDefaultPreferences() {
+ // ignore, default comes from extension point
+ }
+
+ /**
+ * Restores the default values for the patterns to ignore.
+ */
+ public static void restoreDefaultExcludedResourcePatterns() {
+ setExcludedResourcePatterns(ResourcesUiExtensionPointReader.getDefaultResourceExclusions());
+ }
+
+ public static void setExcludedResourcePatterns(Set<String> patterns) {
+ StringBuilder store = new StringBuilder();
+ for (String string : patterns) {
+ store.append(string);
+ store.append(PREF_STORE_DELIM);
+ }
+ ResourcesUiBridgePlugin.getDefault().getPreferenceStore().setValue(PREF_RESOURCES_IGNORED, store.toString());
+ }
+
+ public static Set<String> getExcludedResourcePatterns() {
+ Set<String> exclusions = new HashSet<String>();
+ String read = ResourcesUiBridgePlugin.getDefault().getPreferenceStore().getString(PREF_RESOURCES_IGNORED);
+ if (read != null) {
+ StringTokenizer st = new StringTokenizer(read, PREF_STORE_DELIM);
+ while (st.hasMoreTokens()) {
+ exclusions.add(st.nextToken());
+ }
+ }
+ return exclusions;
+ }
+
+ public static Set<String> getForcedExcludedResourcePatterns() {
+ return forcedExclusionPatterns;
+ }
+
+ /**
+ * TODO: move and consider for API
+ */
+ public static void addForcedExclusionPattern(String pattern) {
+ forcedExclusionPatterns.add(pattern);
+ }
+
+ public static void removeForcedExclusionPattern(String pattern) {
+ forcedExclusionPatterns.remove(pattern);
+ }
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/messages.properties b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/messages.properties
new file mode 100644
index 0000000..eb27f95
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/messages.properties
@@ -0,0 +1,3 @@
+EditorInteractionMonitor_Closing_a_file_automatically_removes_it_from_the_Task_Context=Closing a file automatically removes it from the Task Context. This is recommended in order to make the open editors match the focused views. It can be disabled via Preferences -> Mylyn -> Context.\n\
+\n\
+This dialog will not show again.
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/FocusedResourcesPreferencePage.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/FocusedResourcesPreferencePage.java
new file mode 100644
index 0000000..3f72398
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/FocusedResourcesPreferencePage.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui.preferences;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiPreferenceInitializer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusedResourcesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public static final Color GRAY = new Color(Display.getDefault(), 100, 100, 100);
+
+ private static final String LABEL_AUTOMATIC = Messages.FocusedResourcesPreferencePage__automatic_;
+
+ private Table ignoreTable;
+
+ private Button addButton;
+
+ private Button removeButton;
+
+ public void init(IWorkbench workbench) {
+ // ignore
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ createExcludesTable(parent);
+
+ return parent;
+ }
+
+ private void createExcludesTable(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText(Messages.FocusedResourcesPreferencePage_Resource_Monitoring_Exclusions);
+ GridLayout layout = new GridLayout(1, false);
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ group.setLayout(layout);
+
+ Composite composite = new Composite(group, SWT.NULL);
+ layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.numColumns = 2;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label l1 = new Label(composite, SWT.NULL);
+ l1.setText(Messages.FocusedResourcesPreferencePage_Matching_file_or_directory_names_will_not_be_added_automatically_to_the_context);
+ GridData data = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+ data.horizontalSpan = 2;
+ l1.setLayoutData(data);
+
+ ignoreTable = new Table(composite, SWT.BORDER);
+ data = new GridData(GridData.FILL_BOTH);
+ // gd.widthHint = convertWidthInCharsToPixels(30);
+ data.heightHint = 60;
+ ignoreTable.setLayoutData(data);
+ ignoreTable.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ handleSelection();
+ }
+ });
+
+ Composite buttons = new Composite(composite, SWT.NULL);
+ buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+ layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ buttons.setLayout(layout);
+
+ addButton = new Button(buttons, SWT.PUSH);
+ addButton.setText(Messages.FocusedResourcesPreferencePage_Add_);
+ addButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ addIgnore();
+ }
+ });
+
+ removeButton = new Button(buttons, SWT.PUSH);
+ removeButton.setText(Messages.FocusedResourcesPreferencePage_Remove);
+ removeButton.setEnabled(false);
+ removeButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ removeIgnore();
+ }
+ });
+ fillTable(ResourcesUiPreferenceInitializer.getExcludedResourcePatterns(),
+ ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns());
+ Dialog.applyDialogFont(group);
+ setButtonLayoutData(addButton);
+ setButtonLayoutData(removeButton);
+ }
+
+ /**
+ * Do anything necessary because the OK button has been pressed.
+ *
+ * @return whether it is okay to close the preference page
+ */
+ @Override
+ public boolean performOk() {
+ Set<String> patterns = new HashSet<String>();
+ TableItem[] items = ignoreTable.getItems();
+ for (int i = 0; i < items.length; i++) {
+ if (!items[i].getText().endsWith(LABEL_AUTOMATIC)) {
+ patterns.add(items[i].getText());
+ }
+ }
+ ResourcesUiPreferenceInitializer.setExcludedResourcePatterns(patterns);
+ return true;
+ }
+
+ @Override
+ protected void performDefaults() {
+ super.performDefaults();
+ ignoreTable.removeAll();
+ ResourcesUiPreferenceInitializer.restoreDefaultExcludedResourcePatterns();
+ fillTable(ResourcesUiPreferenceInitializer.getExcludedResourcePatterns(),
+ ResourcesUiPreferenceInitializer.getForcedExcludedResourcePatterns());
+ }
+
+ /**
+ * @param ignore
+ */
+ private void fillTable(Set<String> ignored, Set<String> forced) {
+ for (String pattern : ignored) {
+ TableItem item = new TableItem(ignoreTable, SWT.NONE);
+ item.setText(pattern);
+ }
+ for (String pattern : forced) {
+ TableItem item = new TableItem(ignoreTable, SWT.NONE);
+ item.setText(pattern + " " + LABEL_AUTOMATIC); //$NON-NLS-1$
+ item.setForeground(GRAY);
+ }
+ }
+
+ private void addIgnore() {
+ InputDialog dialog = new InputDialog(getShell(), Messages.FocusedResourcesPreferencePage_Add__IGNORED_RESOURCE, Messages.FocusedResourcesPreferencePage_Enter_pattern_____any_string_,
+ null, null); //
+ dialog.open();
+ if (dialog.getReturnCode() != Window.OK) {
+ return;
+ }
+ String pattern = dialog.getValue();
+ if (pattern.equals("")) { //$NON-NLS-1$
+ return;
+ }
+ TableItem item = new TableItem(ignoreTable, SWT.NONE);
+ item.setText(pattern);
+ item.setChecked(true);
+ }
+
+ private void removeIgnore() {
+ int[] selection = ignoreTable.getSelectionIndices();
+ ignoreTable.remove(selection);
+ }
+
+ private void handleSelection() {
+ if (ignoreTable.getSelectionCount() > 0) {
+ removeButton.setEnabled(true);
+ } else {
+ removeButton.setEnabled(false);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/Messages.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/Messages.java
new file mode 100644
index 0000000..dc05f9f
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.resources.ui.preferences.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String FocusedResourcesPreferencePage_Add_;
+ public static String FocusedResourcesPreferencePage_Add__IGNORED_RESOURCE;
+ public static String FocusedResourcesPreferencePage__automatic_;
+ public static String FocusedResourcesPreferencePage_Enter_pattern_____any_string_;
+ public static String FocusedResourcesPreferencePage_Matching_file_or_directory_names_will_not_be_added_automatically_to_the_context;
+ public static String FocusedResourcesPreferencePage_Remove;
+ public static String FocusedResourcesPreferencePage_Resource_Monitoring_Exclusions;
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/messages.properties b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/messages.properties
new file mode 100644
index 0000000..aa42689
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/preferences/messages.properties
@@ -0,0 +1,7 @@
+FocusedResourcesPreferencePage_Add_=Add...
+FocusedResourcesPreferencePage_Add__IGNORED_RESOURCE=Add Ignored Resource
+FocusedResourcesPreferencePage__automatic_=[automatic]
+FocusedResourcesPreferencePage_Enter_pattern_____any_string_=Enter pattern (* = any string)
+FocusedResourcesPreferencePage_Matching_file_or_directory_names_will_not_be_added_automatically_to_the_context=Matching file or directory names will not be added automatically to the context
+FocusedResourcesPreferencePage_Remove=Remove
+FocusedResourcesPreferencePage_Resource_Monitoring_Exclusions=Resource Monitoring Exclusions
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/resources/ui/FocusCommonNavigatorAction.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/resources/ui/FocusCommonNavigatorAction.java
new file mode 100644
index 0000000..8ad6e50
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/resources/ui/FocusCommonNavigatorAction.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.expressions.Expression;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.ui.AbstractAutoFocusViewAction;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.internal.navigator.NavigatorContentService;
+import org.eclipse.ui.internal.navigator.actions.LinkEditorAction;
+import org.eclipse.ui.internal.navigator.filters.CommonFilterDescriptor;
+import org.eclipse.ui.internal.navigator.filters.CommonFilterDescriptorManager;
+import org.eclipse.ui.internal.navigator.filters.CoreExpressionFilter;
+import org.eclipse.ui.internal.navigator.filters.SelectFiltersAction;
+import org.eclipse.ui.navigator.CommonNavigator;
+import org.eclipse.ui.navigator.ILinkHelper;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public abstract class FocusCommonNavigatorAction extends AbstractAutoFocusViewAction {
+
+ private Object linkService;
+
+ private Method linkServiceMethod;
+
+ private boolean resolveFailed;
+
+ private CommonNavigator commonNavigator;
+
+ private CommonFilterDescriptor[] filterDescriptors;
+
+ private Field filterExpressionField1;
+
+ private Field filterExpressionField2;
+
+ public FocusCommonNavigatorAction(InterestFilter interestFilter, boolean manageViewer, boolean manageFilters,
+ boolean manageLinking) {
+ super(interestFilter, manageViewer, manageFilters, manageLinking);
+ }
+
+ @Override
+ protected boolean installInterestFilter(StructuredViewer viewer) {
+ if (commonNavigator == null) {
+ commonNavigator = (CommonNavigator) super.getPartForAction();
+ }
+
+ try {
+ // XXX: reflection
+ Class<?> clazz2 = CoreExpressionFilter.class;
+ filterExpressionField1 = clazz2.getDeclaredField("filterExpression"); //$NON-NLS-1$
+ filterExpressionField1.setAccessible(true);
+
+ Class<?> clazz1 = CommonFilterDescriptor.class;
+ filterExpressionField2 = clazz1.getDeclaredField("filterExpression"); //$NON-NLS-1$
+ filterExpressionField2.setAccessible(true);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Could not determine filter", e)); //$NON-NLS-1$
+ }
+
+ filterDescriptors = CommonFilterDescriptorManager.getInstance().findVisibleFilters(
+ commonNavigator.getNavigatorContentService());
+
+ return super.installInterestFilter(viewer);
+ }
+
+ @Override
+ protected ISelection resolveSelection(IEditorPart editor, ITextSelection changedSelection, StructuredViewer viewer)
+ throws CoreException {
+ if (resolveFailed) {
+ return null;
+ }
+ if (linkServiceMethod == null) {
+ // TODO e3.5 replace with call to CommonNavigator.getLinkHelperService()
+ try {
+ try {
+ // e3.5: get helper from common navigator
+ Method method = CommonNavigator.class.getDeclaredMethod("getLinkHelperService"); //$NON-NLS-1$
+ method.setAccessible(true);
+ linkService = method.invoke(commonNavigator);
+ } catch (NoSuchMethodException e) {
+ // e3.3, e3.4: instantiate helper
+ Class<?> clazz = Class.forName("org.eclipse.ui.internal.navigator.extensions.LinkHelperService"); //$NON-NLS-1$
+ Constructor<?> constructor = clazz.getConstructor(NavigatorContentService.class);
+ linkService = constructor.newInstance((NavigatorContentService) commonNavigator.getCommonViewer()
+ .getNavigatorContentService());
+ }
+ linkServiceMethod = linkService.getClass().getDeclaredMethod("getLinkHelpersFor", IEditorInput.class); //$NON-NLS-1$
+ } catch (Throwable e) {
+ resolveFailed = true;
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Initialization of LinkHelperService failed", e)); //$NON-NLS-1$
+ }
+ }
+
+ IEditorInput input = editor.getEditorInput();
+ // TODO e3.5 replace with call to linkService.getLinkHelpersFor(editor.getEditorInput());
+ ILinkHelper[] helpers;
+ try {
+ helpers = (ILinkHelper[]) linkServiceMethod.invoke(linkService, editor.getEditorInput());
+ } catch (Exception e) {
+ return null;
+ }
+
+ IStructuredSelection selection = StructuredSelection.EMPTY;
+ IStructuredSelection newSelection = StructuredSelection.EMPTY;
+
+ for (ILinkHelper helper : helpers) {
+ selection = helper.findSelection(input);
+ if (selection != null && !selection.isEmpty()) {
+ newSelection = mergeSelection(newSelection, selection);
+ }
+ }
+ if (!newSelection.isEmpty()) {
+ return newSelection;
+ }
+ return null;
+ }
+
+ @Override
+ protected void select(StructuredViewer viewer, ISelection toSelect) {
+ if (commonNavigator == null) {
+ commonNavigator = (CommonNavigator) super.getPartForAction();
+ }
+ if (commonNavigator != null) {
+ commonNavigator.selectReveal(toSelect);
+ }
+ }
+
+ // TODO: should have better way of doing this
+ @Override
+ protected void setManualFilteringAndLinkingEnabled(boolean on) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof CommonNavigator) {
+ for (IContributionItem item : ((CommonNavigator) part).getViewSite()
+ .getActionBars()
+ .getToolBarManager()
+ .getItems()) {
+ if (item instanceof ActionContributionItem) {
+ ActionContributionItem actionItem = (ActionContributionItem) item;
+ if (actionItem.getAction() instanceof LinkEditorAction) {
+ actionItem.getAction().setEnabled(on);
+ }
+ }
+ }
+ for (IContributionItem item : ((CommonNavigator) part).getViewSite()
+ .getActionBars()
+ .getMenuManager()
+ .getItems()) {
+ if (item instanceof ActionContributionItem) {
+ ActionContributionItem actionItem = (ActionContributionItem) item;
+ if (actionItem.getAction() instanceof SelectFiltersAction) {
+ actionItem.getAction().setEnabled(on);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void setDefaultLinkingEnabled(boolean on) {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof CommonNavigator) {
+ ((CommonNavigator) part).setLinkingEnabled(on);
+ }
+ }
+
+ @Override
+ protected boolean isDefaultLinkingEnabled() {
+ IViewPart part = super.getPartForAction();
+ if (part instanceof CommonNavigator) {
+ return ((CommonNavigator) part).isLinkingEnabled();
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean isPreservedFilter(ViewerFilter filter) {
+ if (filter instanceof CoreExpressionFilter) {
+ CoreExpressionFilter expressionFilter = (CoreExpressionFilter) filter;
+
+ Set<String> preservedIds = ContextUiPlugin.getDefault().getPreservedFilterIds(viewPart.getSite().getId());
+ if (!preservedIds.isEmpty()) {
+ try {
+ Expression expression2 = (Expression) filterExpressionField1.get(expressionFilter);
+
+ for (CommonFilterDescriptor commonFilterDescriptor : filterDescriptors) {
+ if (preservedIds.contains(commonFilterDescriptor.getId())) {
+ Expression expression1 = (Expression) filterExpressionField2.get(commonFilterDescriptor);
+ if (expression1 != null && expression1.equals(expression2)) {
+ return true;
+ }
+ }
+ }
+ } catch (IllegalArgumentException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Could not determine filter", e)); //$NON-NLS-1$
+ } catch (IllegalAccessException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
+ "Could not determine filter", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Copied from
+ *
+ * @{link LinkEditorAction}
+ */
+ @SuppressWarnings("unchecked")
+ private IStructuredSelection mergeSelection(IStructuredSelection aBase, IStructuredSelection aSelectionToAppend) {
+ if (aBase == null || aBase.isEmpty()) {
+ return (aSelectionToAppend != null) ? aSelectionToAppend : StructuredSelection.EMPTY;
+ } else if (aSelectionToAppend == null || aSelectionToAppend.isEmpty()) {
+ return aBase;
+ } else {
+ List newItems = new ArrayList(aBase.toList());
+ newItems.addAll(aSelectionToAppend.toList());
+ return new StructuredSelection(newItems);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/resources/ui/ResourcesUi.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/resources/ui/ResourcesUi.java
new file mode 100644
index 0000000..344e40b
--- /dev/null
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/resources/ui/ResourcesUi.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.resources.ui;
+
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public final class ResourcesUi {
+
+ public static void addResourceToContext(final Set<IResource> resources, final InteractionEvent.Kind interactionKind) {
+ ResourcesUiBridgePlugin.getInterestUpdater().addResourceToContext(resources, interactionKind);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/.classpath b/org.eclipse.mylyn.tasks.bugs/.classpath
new file mode 100644
index 0000000..6a35776
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/views/log/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/internal/tasks/ui/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.tasks.bugs/.cvsignore b/org.eclipse.mylyn.tasks.bugs/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.tasks.bugs/.project b/org.eclipse.mylyn.tasks.bugs/.project
new file mode 100644
index 0000000..dfca764
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.tasks.bugs</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..ea7ed58
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.bugs/src/org.eclipse.mylyn.internal.tasks.bugs'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Destination element: 'org.eclipse.mylyn.tasks.bugs/src/org.eclipse.mylyn.internal.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugWizard.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.bugs" element1="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards{ReportBugWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1211338409158" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.bugs'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.ReportBugWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.bugs{ReportBugWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211338413097" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugWizard' to 'ReportBugOrEnhancementWizard'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugWizard'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugOrEnhancementWizard'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'ReportBugWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards{ReportBugWizard.java[ReportBugWizard" matchStrategy="1" name="ReportBugOrEnhancementWizard" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1211338466997" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.bugs/src/org.eclipse.mylyn.internal.tasks.bugs.wizards'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Destination element: 'org.eclipse.mylyn.tasks.bugs/src/org.eclipse.mylyn.internal.tasks.bugs.wizards'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.SelectProductPage.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards" element1="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards{SelectProductPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1211338508173" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.bugs'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.KeyValueParser.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.bugs{KeyValueParser.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211339548591" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'REPOSITORY_KIND' in 'org.eclipse.mylyn.internal.tasks.bugs.IRepositoryConstants' to 'CONNECTOR_KIND'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.IRepositoryConstants.REPOSITORY_KIND'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.bugs.IRepositoryConstants.CONNECTOR_KIND'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_KIND'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.bugs{IRepositoryConstants.java[IRepositoryConstants^REPOSITORY_KIND" name="CONNECTOR_KIND" references="true" setter="true" stamp="1211339984632" textual="false" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.bugs.PluginRepositoryMappingManager.readMapping().attributeElements' in 'org.eclipse.mylyn.internal.tasks.bugs.PluginRepositoryMappingManager.readMapping()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.PluginRepositoryMappingManager.readMapping().attributeElements'" description="Inline local variable 'attributeElements'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{PluginRepositoryMappingManager.java" selection="2206 59" stamp="1211340284624" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.bugs.PluginRepositoryMappingManager.readMapping().name' in 'org.eclipse.mylyn.internal.tasks.bugs.PluginRepositoryMappingManager.readMapping()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.PluginRepositoryMappingManager.readMapping().name'" description="Inline local variable 'name'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{PluginRepositoryMappingManager.java" selection="3152 61" stamp="1211340645195" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..2af4e08
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,8 @@
+1211338409158 Copy compilation unit
+1211338413097 Delete element
+1211338466997 Rename type 'ReportBugWizard'
+1211338508173 Copy compilation unit
+1211339548591 Delete element
+1211339984632 Rename field 'REPOSITORY_KIND'
+1211340284624 Inline local variable 'attributeElements'
+1211340645195 Inline local variable 'name'
diff --git a/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..fb6809d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private AttributeTaskMapper preProcess(final IStatus status)' from 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter.handle()' to 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Method name: 'preProcess'
- Destination type: 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter'
- Declared visibility: 'private'" comments="false" description="Extract method 'preProcess'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.bugs{TaskErrorReporter.java" name="preProcess" replace="false" selection="2146 245" stamp="1211855811659" version="1.0" visibility="2"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter.preProcess().mapper' in 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter.preProcess()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter.preProcess().mapper'" description="Inline local variable 'mapper'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{TaskErrorReporter.java" selection="2833 44" stamp="1211855923154" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorPage.createControl().layout' in 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorPage.createControl()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorPage.createControl().layout'" description="Inline local variable 'layout'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards{ReportErrorPage.java" selection="1804 32" stamp="1211858897305" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorPage.createControl().layout' in 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorPage.createControl()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorPage.createControl().layout'" description="Inline local variable 'layout'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards{ReportErrorPage.java" selection="1641 32" stamp="1211858899958" version="1.0"/>
<refactoring comment="Extract local variable 'newWizard' from expression 'new ReportErrorWizard(TaskErrorReporter.this,status)'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Variable name: 'newWizard'
- Destination method: 'org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter.handle().new Runnable() {...}.run()'
- Variable expression: 'new ReportErrorWizard(TaskErrorReporter.this,status)'
- Replace occurrences of expression with variable" description="Extract local variable 'newWizard'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{TaskErrorReporter.java" name="newWizard" replace="true" selection="2822 60" stamp="1211859201697" version="1.0"/>
<refactoring comment="Extract local variable 'workbench' from expression 'PlatformUI.getWorkbench()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Variable name: 'workbench'
- Destination method: 'org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin.Reporter.handle()'
- Variable expression: 'PlatformUI.getWorkbench()'
- Replace occurrences of expression with variable" description="Extract local variable 'workbench'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{TasksBugsPlugin.java" name="workbench" replace="true" selection="1076 25" stamp="1211859578861" version="1.0"/>
<refactoring comment="Extract local variable 'display' from expression 'workbench.getDisplay()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Variable name: 'display'
- Destination method: 'org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin.Reporter.handle()'
- Variable expression: 'workbench.getDisplay()'
- Replace occurrences of expression with variable" description="Extract local variable 'display'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{TasksBugsPlugin.java" name="display" replace="true" selection="1191 22" stamp="1211859592116" version="1.0"/>
<refactoring comment="Extract local variable 'taskMapping' from expression 'getTaskMapping()'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Variable name: 'taskMapping'
- Destination method: 'org.eclipse.mylyn.internal.tasks.bugs.AttributeTaskMapper.createTaskData()'
- Variable expression: 'getTaskMapping()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskMapping'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.bugs{AttributeTaskMapper.java" name="taskMapping" replace="true" selection="2881 16" stamp="1211862988571" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..41c551f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,8 @@
+1211855811659 Extract method 'preProcess'
+1211855923154 Inline local variable 'mapper'
+1211858897305 Inline local variable 'layout'
+1211858899958 Inline local variable 'layout'
+1211859201697 Extract local variable 'newWizard'
+1211859578861 Extract local variable 'workbench'
+1211859592116 Extract local variable 'display'
+1211862988571 Extract local variable 'taskMapping'
diff --git a/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..16c0170
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.bugs'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.bugs.wizards{ReportBugWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212554081536" subPackages="false" version="1.0"/>
<refactoring comment="Rename package 'org.eclipse.mylyn.tasks.bugs' to 'org.eclipse.mylyn.internal.provisional.tasks.bugs'
- Original project: 'org.eclipse.mylyn.tasks.bugs'
- Original element: 'org.eclipse.mylyn.tasks.bugs/src/org.eclipse.mylyn.tasks.bugs'
- Renamed element: 'org.eclipse.mylyn.tasks.bugs/src/org.eclipse.mylyn.internal.provisional.tasks.bugs'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF,*.exsd' files
- Update textual occurrences in comments and strings
- Rename subpackages of the package" description="Rename package 'org.eclipse.mylyn.tasks.bugs'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.tasks.bugs" name="org.eclipse.mylyn.internal.provisional.tasks.bugs" patterns="plugin.xml,MANIFEST.MF,*.exsd" qualified="true" references="true" stamp="1212631060237" textual="false" version="1.0"/>

</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..29a4398
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1212554081536 Delete element
+1212631060237 Rename package 'org.eclipse.mylyn.tasks.bugs'
diff --git a/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f1554b1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.tasks.bugs/META-INF/MANIFEST.MF b/org.eclipse.mylyn.tasks.bugs/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..eb07a67
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.tasks.bugs;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui,
+ org.eclipse.ui.views.log;resolution:=optional,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-Vendor: %Bundle-Vendor
+Bundle-ClassPath: .
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.internal.provisional.tasks.bugs,
+ org.eclipse.mylyn.internal.tasks.bugs;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.bugs.actions;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.bugs.wizards;x-internal:=true
+Bundle-Localization: plugin
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin
diff --git a/org.eclipse.mylyn.tasks.bugs/about.html b/org.eclipse.mylyn.tasks.bugs/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.bugs/build.properties b/org.eclipse.mylyn.tasks.bugs/build.properties
new file mode 100644
index 0000000..1f473cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = META-INF/,\
+ plugin.xml,\
+ about.html,\
+ .,\
+ icons/,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.tasks.bugs/icons/etool16/report-bug.gif b/org.eclipse.mylyn.tasks.bugs/icons/etool16/report-bug.gif
new file mode 100644
index 0000000..f88ff0a
Binary files /dev/null and b/org.eclipse.mylyn.tasks.bugs/icons/etool16/report-bug.gif differ
diff --git a/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-bug-new.gif b/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-bug-new.gif
new file mode 100644
index 0000000..04f3028
Binary files /dev/null and b/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-bug-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-new.gif b/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-new.gif
new file mode 100644
index 0000000..e2cde50
Binary files /dev/null and b/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-repository-new.gif b/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-repository-new.gif
new file mode 100644
index 0000000..5f33961
Binary files /dev/null and b/org.eclipse.mylyn.tasks.bugs/icons/etool16/task-repository-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.bugs/plugin.properties b/org.eclipse.mylyn.tasks.bugs/plugin.properties
new file mode 100644
index 0000000..797c915
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/plugin.properties
@@ -0,0 +1,17 @@
+#Properties file for org.eclipse.mylyn.tasks.bugs
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Bug Reporting
+
+action.label = Report as Bug
+NewTaskFromErrorAction.label = Report as Bug
+
+ReportBugAction.label = Report Bug or Enhancement...
+ReportBugAction.tooltip = Report Bug or Enhancement
+
+commands.newTaskFromMarker.description = Report as Bug from Marker
+commands.newTaskFromMarker.name = New Task from Marker...
+commands.newTaskFromMarker.mnemonic = New Task from Marker
+
+BugReporter.label = Report Bug
+
+actionSet.label=Tasks Help
diff --git a/org.eclipse.mylyn.tasks.bugs/plugin.xml b/org.eclipse.mylyn.tasks.bugs/plugin.xml
new file mode 100644
index 0000000..541e8bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/plugin.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="pluginRepositoryMappings" name="Plug-in to Repository Mappings" schema="schema/pluginRepositoryMappings.exsd"/>
+ <extension-point id="support" name="Integrated Support" schema="schema/support.exsd"/>
+ <extension-point id="taskContributors" name="Task Contributors" schema="schema/taskContributors.exsd"/>
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.internal.provisional.tasks.bugs.objectContribution"
+ objectClass="org.eclipse.ui.internal.views.log.LogEntry">
+ <action
+ class="org.eclipse.mylyn.internal.tasks.bugs.actions.NewTaskFromErrorAction"
+ enablesFor="1"
+ icon="icons/etool16/task-bug-new.gif"
+ menubarPath="org.eclipse.pde.runtime.LogView"
+ id="org.eclipse.mylyn.tasklist.actions.newTaskFromErrorLog"
+ label="%NewTaskFromErrorAction.label">
+ </action>
+ </objectContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ id="org.eclipse.mylyn.doc.actionSet"
+ label="%actionSet.label"
+ visible="true">
+ <action
+ class="org.eclipse.mylyn.internal.tasks.bugs.actions.ReportBugAction"
+ icon="icons/etool16/task-bug-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.bug.report"
+ label="%ReportBugAction.label"
+ menubarPath="help/helpStart"
+ style="push"
+ tooltip="%ReportBugAction.tooltip"/>
+ </actionSet>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.bugs.actions.NewTaskFromMarkerHandler"
+ commandId="org.eclipse.mylyn.tasks.bugs.commands.newTaskFromMarker">
+ <activeWhen>
+ <with variable="activePart">
+ <test
+ args="any"
+ property="org.eclipse.ui.ide.contentGenerator">
+ </test>
+ </with>
+ </activeWhen>
+ <enabledWhen>
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <instanceof
+ value="org.eclipse.ui.internal.views.markers.MarkerEntry">
+ </instanceof>
+ </iterate>
+ </and>
+ </enabledWhen>
+ </handler>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ description="%commands.newTaskFromMarker.description"
+ id="org.eclipse.mylyn.tasks.bugs.commands.newTaskFromMarker"
+ name="%commands.newTaskFromMarker.name">
+ </command>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.ide.MarkersView?after=org.eclipse.ui.ide.markCompleted">
+ <command
+ commandId="org.eclipse.mylyn.tasks.bugs.commands.newTaskFromMarker"
+ icon="icons/etool16/task-new.gif"
+ mnemonic="%commands.newTaskFromMarker.mnemonic"
+ style="push">
+ <visibleWhen
+ checkEnabled="true">
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.commons.core.errorReporters">
+ <errorReporter
+ class="org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin$BugReporter"
+ id="org.eclipse.mylyn.tasks.bugs.taskReporter"
+ label="%BugReporter.label">
+ </errorReporter>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.tasks.bugs/schema/pluginRepositoryMappings.exsd b/org.eclipse.mylyn.tasks.bugs/schema/pluginRepositoryMappings.exsd
new file mode 100644
index 0000000..d9f0259
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/schema/pluginRepositoryMappings.exsd
@@ -0,0 +1,181 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.bugs" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.bugs" id="pluginRepositoryMappings" name="Plug-in to Repository Mappings"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element deprecated="true" internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="mapping" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="mapping">
+ <complexType>
+ <sequence>
+ <element ref="repository" minOccurs="0" maxOccurs="1"/>
+ <element ref="branding" minOccurs="0" maxOccurs="1"/>
+ <element ref="product" minOccurs="0" maxOccurs="1"/>
+ <element ref="component" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="pluginIdPrefix" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="repository">
+ <complexType>
+ <attribute name="url" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="kind" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="component" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="branding">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="category" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="product">
+ <complexType>
+ <attribute name="value" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="component">
+ <complexType>
+ <attribute name="value" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.bugs/schema/support.exsd b/org.eclipse.mylyn.tasks.bugs/schema/support.exsd
new file mode 100644
index 0000000..8ceb469
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/schema/support.exsd
@@ -0,0 +1,348 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.bugs" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.bugs" id="support" name="Integrated Support Extensions"/>
+ </appInfo>
+ <documentation>
+ Allows client to provide information for integrated bug reporting.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="category" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="mapping" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="product" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="provider" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="handler" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="mapping">
+ <complexType>
+ <sequence>
+ <element ref="repository" minOccurs="0" maxOccurs="1"/>
+ <element ref="property" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="namespace" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="productId" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="repository">
+ <complexType>
+ <attribute name="url" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="kind" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="product">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="providerId" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string">
+ <annotation>
+ <documentation>
+ A 32x32 branding icon.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="url" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="featureId" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="pluginId" type="string">
+ <annotation>
+ <documentation>
+ If specified the product is only listed if the referenced plug-in is installed.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="property">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="value" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="category">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="weight" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="provider">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="categoryId" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string">
+ <annotation>
+ <documentation>
+ A 32x32 branding icon.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="url" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="handler">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.internal.provisional.tasks.bugs.AbstractSupportHandler:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 3.2
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ <extension point="org.eclipse.mylyn.tasks.bugs.support">
+<category
+ id="org.eclipse.mylyn.tasks.bugs.openSource"
+ name="Open-Source"
+ description="Community supported Open-Source projects"/>
+<organization
+ id="org.eclipse"
+ name="Eclipse.org"
+ description="Eclipse Open-Source projects"
+ icon="icons/32/eclipse.png"/>
+<product
+ id="org.eclipse.mylyn"
+ name="Mylyn"
+ description="Task Management and Task-Focused Interface"
+ pluginId="org.eclipse.mylyn" (for branding icon, installed version) />
+<productRepositoryMapping
+ namespace="org.eclipse.mylyn"
+ productId="org.eclipse.mylyn"
+ <repository
+ kind="bugzilla"
+ url="https://bugs.eclipse.org/bugs">
+ </repository>
+ <property
+ name="product"
+ value="Mylyn">
+ </property>
+/>
+<productRepositoryMapping
+ namespace="org.eclipse.mylyn.tasks"
+ productId="org.eclipse.mylyn"
+ <property
+ name="component"
+ value="Tasks">
+ </property>
+</product>
+</extension>
+ </documentation>
+ </annotation>
+
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2009 Tasktop Technologies and others.
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.bugs/schema/taskContributors.exsd b/org.eclipse.mylyn.tasks.bugs/schema/taskContributors.exsd
new file mode 100644
index 0000000..1760eb0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/schema/taskContributors.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.bugs" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.bugs" id="taskContributors" name="Task Contributors"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element deprecated="true" internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="contributor"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="contributor">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.internal.provisional.tasks.bugs.AbstractTaskContributor:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/AbstractSupportHandler.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/AbstractSupportHandler.java
new file mode 100644
index 0000000..46acb1d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/AbstractSupportHandler.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.2
+ */
+public class AbstractSupportHandler {
+
+ /**
+ * @since 3.2
+ */
+ public void preProcess(ISupportRequest request) {
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void process(ITaskContribution contribution, IProgressMonitor monitor) {
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void postProcess(ISupportResponse response, IProgressMonitor monitor) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/AbstractTaskContributor.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/AbstractTaskContributor.java
new file mode 100644
index 0000000..3323170
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/AbstractTaskContributor.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @deprecated use {@link AbstractSupportHandler} instead, as of 3.2 all taskContributor extensions are ignored
+ */
+ at Deprecated
+public abstract class AbstractTaskContributor {
+
+ /**
+ * @since 3.2
+ */
+ public void preProcess(ISupportRequest request) {
+ }
+
+ /**
+ * @since 3.0
+ */
+ public abstract Map<String, String> getAttributes(IStatus status);
+
+ /**
+ * Returns the id of an editor that should be used to open the {@link TaskEditorInput} with the task.
+ *
+ * @param status
+ * the status
+ * @return id of editor
+ * @since 3.0
+ */
+ public String getEditorId(IStatus status) {
+ return null;
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void process(ITaskContribution contribution) {
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void postProcess(IStatus status, TaskData taskData) {
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void postProcess(ISupportResponse response) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/IProduct.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/IProduct.java
new file mode 100644
index 0000000..f4076ac
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/IProduct.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.2
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface IProduct {
+
+ public abstract String getName();
+
+ public abstract String getDescription();
+
+ public abstract String getId();
+
+ public abstract IProvider getProvider();
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/IProvider.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/IProvider.java
new file mode 100644
index 0000000..4a7bf86
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/IProvider.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.2
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface IProvider {
+
+ public abstract String getName();
+
+ public abstract String getDescription();
+
+ public abstract String getId();
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ISupportRequest.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ISupportRequest.java
new file mode 100644
index 0000000..3ca6990
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ISupportRequest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.2
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface ISupportRequest {
+
+ public ITaskContribution getOrCreateContribution(IProduct product);
+
+ public ITaskContribution getDefaultContribution();
+
+ public IStatus getStatus();
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ISupportResponse.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ISupportResponse.java
new file mode 100644
index 0000000..de85c10
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ISupportResponse.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.2
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface ISupportResponse {
+
+ public IProduct getProduct();
+
+ public IStatus getStatus();
+
+ public TaskData getTaskData();
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ITaskContribution.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ITaskContribution.java
new file mode 100644
index 0000000..0e56d27
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/provisional/tasks/bugs/ITaskContribution.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.bugs;
+
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.2
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface ITaskContribution {
+
+ /**
+ * Appends <code>text</code> to the description of the task.
+ */
+ public abstract void appendToDescription(String text);
+
+ public abstract String getAttribute(String name);
+
+ public abstract IProduct getProduct();
+
+ public abstract IStatus getStatus();
+
+ public abstract boolean isHandled();
+
+ public abstract void setAttribute(String name, String value);
+
+ public abstract void setHandled(boolean handled);
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AbstractSupportElement.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AbstractSupportElement.java
new file mode 100644
index 0000000..464be30
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AbstractSupportElement.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+public class AbstractSupportElement {
+
+ private String description;
+
+ private ImageDescriptor icon;
+
+ private String id;
+
+ private String name;
+
+ private String url;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public ImageDescriptor getIcon() {
+ return icon;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setIcon(ImageDescriptor icon) {
+ this.icon = icon;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java
new file mode 100644
index 0000000..d58f6de
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/AttributeTaskMapper.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ISupportResponse;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ITaskContribution;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AttributeTaskMapper implements ITaskContribution, ISupportResponse {
+
+ private final Map<String, String> attributes;
+
+ private final IProduct product;
+
+ private final IStatus status;
+
+ private TaskData taskData;
+
+ private boolean handled;
+
+ public AttributeTaskMapper(IStatus status, IProduct product) {
+ Assert.isNotNull(status);
+ Assert.isNotNull(product);
+ this.status = status;
+ this.product = product;
+ this.attributes = new HashMap<String, String>();
+ }
+
+ public void appendToDescription(String text) {
+ String description = getAttribute(IRepositoryConstants.DESCRIPTION);
+ setAttribute(IRepositoryConstants.DESCRIPTION, (description != null) ? description + text : text);
+ }
+
+ public TaskData createTaskData(IProgressMonitor monitor) throws CoreException {
+ ITaskMapping taskMapping = getTaskMapping();
+ return TasksUiInternal.createTaskData(getTaskRepository(), taskMapping, taskMapping, monitor);
+ }
+
+ public String getAttribute(String name) {
+ return attributes.get(name);
+ }
+
+ public Map<String, String> getAttributes() {
+ return attributes;
+ }
+
+ public IProduct getProduct() {
+ return product;
+ }
+
+ public IStatus getStatus() {
+ return status;
+ }
+
+ public TaskData getTaskData() {
+ return taskData;
+ }
+
+ public ITaskMapping getTaskMapping() {
+ return new KeyValueMapping(attributes);
+ }
+
+ public TaskRepository getTaskRepository() {
+ TaskRepository taskRepository = null;
+ String repositoryUrl = attributes.get(IRepositoryConstants.REPOSITORY_URL);
+ if (repositoryUrl != null) {
+ String connectorKind = attributes.get(IRepositoryConstants.CONNECTOR_KIND);
+ if (connectorKind != null) {
+ taskRepository = TasksUi.getRepositoryManager().getRepository(connectorKind, repositoryUrl);
+ }
+ }
+ return taskRepository;
+ }
+
+ public boolean isMappingComplete() {
+ return getAttribute(IRepositoryConstants.MAPPING_COMPLETE) != null || getTaskRepository() != null;
+ }
+
+ public void setAttribute(String name, String value) {
+ attributes.put(name, value);
+ }
+
+ void setTaskData(TaskData taskData) {
+ this.taskData = taskData;
+ }
+
+ public boolean isHandled() {
+ return handled;
+ }
+
+ public void setHandled(boolean handled) {
+ this.handled = handled;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultSupportHandler.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultSupportHandler.java
new file mode 100644
index 0000000..3b52620
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/DefaultSupportHandler.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IBundleGroup;
+import org.eclipse.core.runtime.IProduct;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.AbstractSupportHandler;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ISupportRequest;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ISupportResponse;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ITaskContribution;
+import org.eclipse.mylyn.internal.tasks.bugs.wizards.ErrorLogStatus;
+import org.eclipse.mylyn.internal.tasks.bugs.wizards.ProductStatus;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.Bundle;
+
+/**
+ * @author Steffen Pingel
+ */
+public class DefaultSupportHandler extends AbstractSupportHandler {
+
+ @Override
+ public void preProcess(ISupportRequest request) {
+ ITaskContribution contribution = request.getDefaultContribution();
+ String description = getDescription(contribution.getStatus());
+ if (description != null) {
+ contribution.appendToDescription(description);
+ }
+ }
+
+ @Override
+ public void process(ITaskContribution contribution, IProgressMonitor monitor) {
+ if (contribution.getAttribute(IRepositoryConstants.DESCRIPTION) == null) {
+ String description = getDescription(contribution.getStatus());
+ if (description != null) {
+ contribution.appendToDescription(description);
+ }
+ }
+ }
+
+ @Override
+ public void postProcess(ISupportResponse response, IProgressMonitor monitor) {
+ IStatus contribution = response.getStatus();
+ TaskData taskData = response.getTaskData();
+ if (contribution instanceof ProductStatus) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskData.getConnectorKind());
+ ITaskMapping mapping = connector.getTaskMapping(taskData);
+ mapping.merge(new TaskMapping() {
+ @Override
+ public String getSeverity() {
+ return "enhancement"; //$NON-NLS-1$
+ }
+ });
+ }
+ if (response.getProduct() != null) {
+ IBundleGroup bundleGroup = ((SupportProduct) response.getProduct()).getBundleGroup();
+ if (bundleGroup != null) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.VERSION);
+ if (attribute != null) {
+ final String version = getBestMatch(bundleGroup.getVersion(), attribute.getOptions());
+ if (version.length() > 0) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskData.getConnectorKind());
+ ITaskMapping mapping = connector.getTaskMapping(taskData);
+ mapping.merge(new TaskMapping() {
+ @Override
+ public String getVersion() {
+ return version;
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+
+ private String getBestMatch(String version, Map<String, String> options) {
+ String match = ""; //$NON-NLS-1$
+ for (String option : options.values()) {
+ if (version.startsWith(option) && option.length() > match.length()) {
+ match = option;
+ }
+ }
+ return match;
+ }
+
+ public void appendErrorDetails(StringBuilder sb, IStatus status, Date date) {
+ sb.append("\n\n"); //$NON-NLS-1$
+ sb.append(Messages.DefaultTaskContributor_Error_Details);
+ if (date != null) {
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(NLS.bind(Messages.DefaultSupportHandler_Date_X, date));
+ }
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(NLS.bind(Messages.DefaultSupportHandler_Message_X, status.getMessage()));
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(NLS.bind(Messages.DefaultSupportHandler_Severity_X, getSeverityText(status.getSeverity())));
+ appendProductInformation(sb);
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(NLS.bind(Messages.DefaultSupportHandler_Plugin_X, status.getPlugin()));
+ }
+
+ private void appendProductInformation(StringBuilder sb) {
+ IProduct product = Platform.getProduct();
+ if (product != null) {
+ sb.append("\n"); //$NON-NLS-1$
+ if (product.getName() != null) {
+ sb.append(NLS.bind(Messages.DefaultSupportHandler_Product_X, product.getName()));
+ } else {
+ sb.append(NLS.bind(Messages.DefaultSupportHandler_Product_X, product.getId()));
+ }
+ Bundle definingBundle = product.getDefiningBundle();
+ if (definingBundle != null) {
+ Object version = definingBundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$
+ if (version != null) {
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(version);
+ }
+ }
+ if (product.getName() != null) {
+ sb.append(NLS.bind(" ({0})", product.getId())); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public String getDescription(IStatus status) {
+ if (status instanceof ProductStatus) {
+ SupportProduct product = (SupportProduct) ((ProductStatus) status).getProduct();
+ if (product.getBundleGroup() != null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n\n\n"); //$NON-NLS-1$
+ sb.append(Messages.DefaultSupportHandler_Configuration_Details);
+ appendProductInformation(sb);
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(Messages.DefaultSupportHandler_Installed_Features);
+ sb.append("\n"); //$NON-NLS-1$
+ for (IBundleGroup bundleGroup : new IBundleGroup[] { product.getBundleGroup() }) {
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(bundleGroup.getIdentifier());
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(bundleGroup.getVersion());
+ sb.append("\n"); //$NON-NLS-1$
+
+// Bundle[] bundles = bundleGroup.getBundles();
+// if (bundles != null) {
+// for (Bundle bundle : bundles) {
+// sb.append(" "); //$NON-NLS-1$
+// sb.append(bundle.getSymbolicName());
+// String version = (String) bundle.getHeaders().get(
+// Messages.DefaultTaskContributor_Bundle_Version);
+// if (version != null) {
+// sb.append(" "); //$NON-NLS-1$
+// sb.append(version);
+// }
+// sb.append("\n"); //$NON-NLS-1$
+// }
+// }
+ }
+ return sb.toString();
+ }
+ } else if (status instanceof ErrorLogStatus) {
+ ErrorLogStatus errorLogStatus = (ErrorLogStatus) status;
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n\n"); //$NON-NLS-1$
+ sb.append(Messages.DefaultSupportHandler_What_steps_message);
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(Messages.DefaultSupportHandler_Step_1);
+ sb.append(Messages.DefaultSupportHandler_Step_2);
+ sb.append(Messages.DefaultSupportHandler_Step_3);
+ appendErrorDetails(sb, errorLogStatus, errorLogStatus.getDate());
+ if (errorLogStatus.getLogSessionData() != null) {
+ sb.append(Messages.DefaultTaskContributor_SESSION_DATA);
+ sb.append(errorLogStatus.getLogSessionData());
+ }
+ if (errorLogStatus.getStack() != null) {
+ sb.append(Messages.DefaultTaskContributor_EXCEPTION_STACK_TRACE);
+ sb.append(errorLogStatus.getStack());
+ }
+ return sb.toString();
+ } else {
+ StringBuilder sb = new StringBuilder();
+ appendErrorDetails(sb, status, new Date());
+ if (status.getException() != null) {
+ sb.append(Messages.DefaultTaskContributor_EXCEPTION_STACK_TRACE);
+ StringWriter writer = new StringWriter();
+ status.getException().printStackTrace(new PrintWriter(writer));
+ sb.append(writer.getBuffer());
+ }
+ return sb.toString();
+ }
+ return null;
+ }
+
+ private String getSeverityText(int severity) {
+ switch (severity) {
+ case IStatus.ERROR:
+ return Messages.DefaultTaskContributor_Error;
+ case IStatus.WARNING:
+ return Messages.DefaultTaskContributor_Warning;
+ case IStatus.INFO:
+ return Messages.DefaultTaskContributor_Info;
+ case IStatus.OK:
+ return Messages.DefaultTaskContributor_OK;
+ }
+ return "?"; //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java
new file mode 100644
index 0000000..910ccc5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/IRepositoryConstants.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+/**
+ * @author Steffen Pingel
+ */
+public class IRepositoryConstants {
+
+ @Deprecated
+ public static final String BRANDING = "branding"; //$NON-NLS-1$
+
+ public static final String COMPONENT = "component"; //$NON-NLS-1$
+
+ public static final String CONNECTOR_KIND = "repositoryKind"; //$NON-NLS-1$
+
+ public static final String DESCRIPTION = "description"; //$NON-NLS-1$
+
+ public static final String PRODUCT = "product"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String PRODUCT_CATEGORY = "productCategory"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String PRODUCT_DESCRIPTION = "productDescription"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String PRODUCT_NAME = "productName"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String PRODUCT_TITLE = "productTitle"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String REPOSITORY_KIND = "repositoryKind"; //$NON-NLS-1$
+
+ public static final String REPOSITORY_URL = "repositoryUrl"; //$NON-NLS-1$
+
+ public static final String SEVERITY = "severity"; //$NON-NLS-1$
+
+ public static final String VERSION = "version"; //$NON-NLS-1$
+
+ public static final String SUMMARY = "summary"; //$NON-NLS-1$
+
+ public static final String PRIORITY = "priority"; //$NON-NLS-1$
+
+ public static final String MAPPING_COMPLETE = "org.eclipse.mylyn.tasks.bugs.mappingComplete"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/KeyValueMapping.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/KeyValueMapping.java
new file mode 100644
index 0000000..2e3c2d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/KeyValueMapping.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+
+/**
+ * @author Steffen Pingel
+ */
+public class KeyValueMapping extends TaskMapping {
+
+ private final Map<String, String> attributes;
+
+ public KeyValueMapping(Map<String, String> attributes) {
+ Assert.isNotNull(attributes);
+ this.attributes = attributes;
+ }
+
+ @Override
+ public String getComponent() {
+ return attributes.get(IRepositoryConstants.COMPONENT);
+ }
+
+ @Override
+ public String getDescription() {
+ return attributes.get(IRepositoryConstants.DESCRIPTION);
+ }
+
+ @Override
+ public List<String> getKeywords() {
+ // TODO implement
+ return null;
+ }
+
+ @Override
+ public String getOwner() {
+ // TODO implement
+ return null;
+ }
+
+ @Override
+ public String getPriority() {
+ return attributes.get(IRepositoryConstants.PRIORITY);
+ }
+
+ @Override
+ public String getProduct() {
+ return attributes.get(IRepositoryConstants.PRODUCT);
+ }
+
+ @Override
+ public String getSeverity() {
+ return attributes.get(IRepositoryConstants.SEVERITY);
+ }
+
+ @Override
+ public String getSummary() {
+ return attributes.get(IRepositoryConstants.SUMMARY);
+ }
+
+ @Override
+ public String getTaskKind() {
+ // TODO implement
+ return null;
+ }
+
+ @Override
+ public String getVersion() {
+ return attributes.get(IRepositoryConstants.VERSION);
+ }
+
+ @Override
+ public void merge(ITaskMapping source) {
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/Messages.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/Messages.java
new file mode 100644
index 0000000..e87bc88
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/Messages.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.bugs.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String DefaultSupportHandler_Configuration_Details;
+
+ public static String DefaultSupportHandler_Date_X;
+
+ public static String DefaultSupportHandler_Installed_Features;
+
+ public static String DefaultSupportHandler_Message_X;
+
+ public static String DefaultSupportHandler_Plugin_X;
+
+ public static String DefaultSupportHandler_Product_X;
+
+ public static String DefaultSupportHandler_Severity_X;
+
+ public static String DefaultSupportHandler_Step_1;
+
+ public static String DefaultSupportHandler_Step_2;
+
+ public static String DefaultSupportHandler_Step_3;
+
+ public static String DefaultSupportHandler_What_steps_message;
+
+ public static String DefaultTaskContributor_Error;
+
+ public static String DefaultTaskContributor_Error_Details;
+
+ public static String DefaultTaskContributor_EXCEPTION_STACK_TRACE;
+
+ public static String DefaultTaskContributor_Info;
+
+ public static String DefaultTaskContributor_OK;
+
+ public static String DefaultTaskContributor_SESSION_DATA;
+
+ public static String DefaultTaskContributor_Warning;
+
+ public static String TaskErrorReporter_Create_Task_Error_Message;
+
+ public static String TaskErrorReporter_Create_Task_Error_Title;
+
+ public static String TaskErrorReporter_Job_Progress_Process_support_request;
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/ProductRepositoryMapping.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/ProductRepositoryMapping.java
new file mode 100644
index 0000000..7bb3f9b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/ProductRepositoryMapping.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ProductRepositoryMapping {
+
+ private final Map<String, String> attributes;
+
+ private final String namespace;
+
+// private IProduct product;
+
+ public ProductRepositoryMapping(String namespace) {
+ this.namespace = namespace;
+ this.attributes = new HashMap<String, String>();
+ }
+
+ public void addAttributes(Map<String, String> attributes) {
+ this.attributes.putAll(attributes);
+ }
+
+ public Map<String, String> getAttributes() {
+ return attributes;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+// public IProduct getProduct() {
+// return product;
+// }
+//
+// public void setProduct(IProduct product) {
+// this.product = product;
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportCategory.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportCategory.java
new file mode 100644
index 0000000..5f8f634
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportCategory.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProvider;
+
+public class SupportCategory extends AbstractSupportElement {
+
+ private static final int DEFAULT_WEIGHT = 1000;
+
+ private List<IProvider> providers;
+
+ private int weight;
+
+ public SupportCategory() {
+ setWeight(DEFAULT_WEIGHT);
+ }
+
+ public void add(IProvider provider) {
+ if (providers == null) {
+ providers = new ArrayList<IProvider>();
+ }
+ providers.add(provider);
+ }
+
+ public void remove(IProvider provider) {
+ if (providers != null) {
+ providers.remove(provider);
+ }
+ }
+
+ public List<IProvider> getProviders() {
+ if (providers == null) {
+ return Collections.emptyList();
+ }
+ return new ArrayList<IProvider>(providers);
+ }
+
+ public int getWeight() {
+ return weight;
+ }
+
+ public void setWeight(int weight) {
+ this.weight = weight;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportHandlerManager.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportHandlerManager.java
new file mode 100644
index 0000000..961ec94
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportHandlerManager.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.AbstractSupportHandler;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ISupportResponse;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ITaskContribution;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SupportHandlerManager {
+
+ private static final String ELEMENT_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ELEMENT_TASK_HANDLER = "handler"; //$NON-NLS-1$
+
+ private static final String EXTENSION_ID_TASK_CONTRIBUTORS = "org.eclipse.mylyn.tasks.bugs.support"; //$NON-NLS-1$
+
+ private final DefaultSupportHandler defaultSupportHandler = new DefaultSupportHandler();
+
+ private boolean readExtensions;
+
+ private final List<AbstractSupportHandler> taskContributors = new CopyOnWriteArrayList<AbstractSupportHandler>();
+
+ public SupportHandlerManager() {
+ }
+
+ public void addErrorReporter(AbstractSupportHandler taskContributor) {
+ taskContributors.add(taskContributor);
+ }
+
+ public void process(final ITaskContribution contribution, final IProgressMonitor monitor) {
+ readExtensions();
+
+ for (final AbstractSupportHandler contributor : taskContributors) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ contributor.process(contribution, monitor);
+ }
+ });
+ if (contribution.isHandled()) {
+ break;
+ }
+ }
+ if (!contribution.isHandled()) {
+ defaultSupportHandler.process(contribution, monitor);
+ }
+ }
+
+ public void postProcess(final ISupportResponse response, final IProgressMonitor monitor) {
+ readExtensions();
+
+ for (final AbstractSupportHandler contributor : taskContributors) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ contributor.postProcess(response, monitor);
+ }
+ });
+ }
+ defaultSupportHandler.postProcess(response, monitor);
+ }
+
+ public void preProcess(final SupportRequest request) {
+ readExtensions();
+
+ for (final AbstractSupportHandler contributor : taskContributors) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN, "Task contributor failed", e)); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ contributor.preProcess(request);
+ }
+ });
+ }
+ defaultSupportHandler.preProcess(request);
+ }
+
+ private synchronized void readExtensions() {
+ if (readExtensions) {
+ return;
+ }
+ readExtensions = true;
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_TASK_CONTRIBUTORS);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELEMENT_TASK_HANDLER)) {
+ readTaskContributor(element);
+ }
+ }
+ }
+ }
+
+ private void readTaskContributor(IConfigurationElement element) {
+ try {
+ Object object = element.createExecutableExtension(ELEMENT_CLASS);
+ if (object instanceof AbstractSupportHandler) {
+ taskContributors.add((AbstractSupportHandler) object);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN,
+ "Could not load task contributor extenstion: \"" + object.getClass().getCanonicalName() + "\"" //$NON-NLS-1$ //$NON-NLS-2$
+ + " does not implement \"" + AbstractSupportHandler.class.getCanonicalName() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN,
+ "Could not load task contributor extension", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void removeErrorReporter(AbstractSupportHandler taskContributor) {
+ taskContributors.remove(taskContributor);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProduct.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProduct.java
new file mode 100644
index 0000000..26080cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProduct.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.IBundleGroup;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProvider;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SupportProduct extends AbstractSupportElement implements IProduct {
+
+ private IBundleGroup bundleGroup;
+
+ private boolean installed;
+
+ TreeMap<String, ProductRepositoryMapping> mappingByNamespace;
+
+ private String pluginId;
+
+ private IProvider provider;
+
+ public SupportProduct() {
+ mappingByNamespace = new TreeMap<String, ProductRepositoryMapping>();
+ }
+
+ public void addRepositoryMapping(ProductRepositoryMapping mapping) {
+ ProductRepositoryMapping existingMapping = mappingByNamespace.get(mapping.getNamespace());
+ if (existingMapping != null) {
+ existingMapping.getAttributes().putAll(mapping.getAttributes());
+ } else {
+ mappingByNamespace.put(mapping.getNamespace(), mapping);
+ }
+ }
+
+ public Map<String, String> getAllAttributes(String prefix) {
+ Map<String, String> attributes = null;
+ for (int i = 0; i <= prefix.length(); i++) {
+ ProductRepositoryMapping mapping = getMapping(prefix.substring(0, i));
+ if (mapping != null) {
+ if (attributes == null) {
+ attributes = new HashMap<String, String>();
+ }
+ attributes.putAll(mapping.getAttributes());
+ }
+ }
+ if (attributes != null) {
+ return attributes;
+ } else {
+ return new HashMap<String, String>();
+ }
+ }
+
+ public String getAttribute(String prefix, String key) {
+ for (int i = prefix.length() - 1; i >= 0; i--) {
+ ProductRepositoryMapping mapping = getMapping(prefix.substring(0, i));
+ if (mapping != null) {
+ String value = mapping.getAttributes().get(key);
+ if (value != null) {
+ return value;
+ }
+ }
+ }
+ return null;
+ }
+
+ public IBundleGroup getBundleGroup() {
+ return bundleGroup;
+ }
+
+ public ProductRepositoryMapping getMapping(String prefix) {
+ return mappingByNamespace.get(prefix);
+ }
+
+ public String getPluginId() {
+ return pluginId;
+ }
+
+ public IProvider getProvider() {
+ return provider;
+ }
+
+ public boolean hasMappings() {
+ return !mappingByNamespace.isEmpty();
+ }
+
+ /**
+ * @deprecated Use {@link #isInstalled()} instead
+ */
+ @Deprecated
+ public boolean isEnabled() {
+ return isInstalled();
+ }
+
+ public boolean isInstalled() {
+ return installed;
+ }
+
+ public void setBundleGroup(IBundleGroup bundleGroup) {
+ this.bundleGroup = bundleGroup;
+ }
+
+ /**
+ * @deprecated Use {@link #setInstalled(boolean)} instead
+ */
+ @Deprecated
+ public void setEnabled(boolean enabled) {
+ setInstalled(enabled);
+ }
+
+ public void setInstalled(boolean enabled) {
+ this.installed = enabled;
+ }
+
+ public void setPluginId(String pluginId) {
+ this.pluginId = pluginId;
+ }
+
+ public void setProvider(IProvider provider) {
+ this.provider = provider;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProvider.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProvider.java
new file mode 100644
index 0000000..c78130c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProvider.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProvider;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SupportProvider extends AbstractSupportElement implements IProvider {
+
+ private SupportCategory category;
+
+ private List<IProduct> products;
+
+ public SupportProvider() {
+ }
+
+ public SupportCategory getCategory() {
+ return category;
+ }
+
+ public void setCategory(SupportCategory category) {
+ this.category = category;
+ }
+
+ public void add(IProduct provider) {
+ if (products == null) {
+ products = new ArrayList<IProduct>();
+ }
+ products.add(provider);
+ }
+
+ public void remove(IProduct provider) {
+ if (products != null) {
+ products.remove(provider);
+ }
+ }
+
+ public List<IProduct> getProducts() {
+ return new ArrayList<IProduct>(products);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProviderManager.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProviderManager.java
new file mode 100644
index 0000000..6519046
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportProviderManager.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IBundleGroup;
+import org.eclipse.core.runtime.IBundleGroupProvider;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.branding.IBundleGroupConstants;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SupportProviderManager {
+
+ private static final String ATTRIBUTE_CATEGORY_ID = "categoryId"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_DESCRIPTION = "description"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_FEATURE_ID = "featureId"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_ICON = "icon"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_NAMESPACE = "namespace"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_PLUGIN_ID = "pluginId"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_PRODUCT_ID = "productId"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_PROVIDER_ID = "providerId"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_REPOSITORY_KIND = "kind"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_REPOSITORY_URL = "url"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_URL = "url"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
+
+ private static final String ATTRIBUTE_WEIGHT = "weight"; //$NON-NLS-1$
+
+ private static final String ELEMENT_CATEGORY = "category"; //$NON-NLS-1$
+
+ private static final String ELEMENT_MAPPING = "mapping"; //$NON-NLS-1$
+
+ private static final String ELEMENT_PRODUCT = "product"; //$NON-NLS-1$
+
+ private static final String ELEMENT_PROPERTY = "property"; //$NON-NLS-1$
+
+ private static final String ELEMENT_PROVIDER = "provider"; //$NON-NLS-1$
+
+ private static final String ELEMENT_REPOSITORY = "repository"; //$NON-NLS-1$
+
+ private static final String EXTENSION_ID_PLUGIN_SUPPORT = "org.eclipse.mylyn.tasks.bugs.support"; //$NON-NLS-1$
+
+ private HashMap<String, IBundleGroup> bundleGroupById;
+
+ private List<SupportCategory> categories;
+
+ private SupportProduct defaultProduct;
+
+ private Map<String, SupportProduct> productById;
+
+ private Map<String, SupportProvider> providerById;
+
+ public SupportProviderManager() {
+ readExtensions();
+ }
+
+ public void addCategory(SupportCategory category) {
+ categories.add(category);
+ }
+
+ public boolean addProduct(SupportProduct product) {
+ if (providerById.containsKey(product.getId())) {
+ return false;
+ }
+ productById.put(product.getId(), product);
+ return true;
+ }
+
+ public boolean addProvider(SupportProvider provider) {
+ if (providerById.containsKey(provider.getId())) {
+ return false;
+ }
+ providerById.put(provider.getId(), provider);
+ return true;
+ }
+
+ private IBundleGroup getBundleGroup(String featureId) {
+ if (bundleGroupById == null) {
+ bundleGroupById = new HashMap<String, IBundleGroup>();
+ IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
+ if (providers != null) {
+ for (IBundleGroupProvider provider : providers) {
+ for (IBundleGroup bundleGroup : provider.getBundleGroups()) {
+ bundleGroupById.put(bundleGroup.getIdentifier(), bundleGroup);
+ }
+ }
+ }
+ }
+ return bundleGroupById.get(featureId);
+ }
+
+ public Collection<SupportCategory> getCategories() {
+ return Collections.unmodifiableList(categories);
+ }
+
+ public SupportCategory getCategory(String categoryId) {
+ for (SupportCategory category : categories) {
+ if (category.getId().equals(categoryId)) {
+ return category;
+ }
+ }
+ return null;
+ }
+
+ public SupportProduct getDefaultProduct() {
+ return defaultProduct;
+ }
+
+ public SupportProduct getProduct(String productId) {
+ return productById.get(productId);
+ }
+
+ public Collection<SupportProduct> getProducts() {
+ return Collections.unmodifiableCollection(productById.values());
+ }
+
+ public SupportProvider getProvider(String providerId) {
+ return providerById.get(providerId);
+ }
+
+ public Collection<SupportProvider> getProviders() {
+ return Collections.unmodifiableCollection(providerById.values());
+ }
+
+ private boolean readAttributes(IConfigurationElement element, AbstractSupportElement item) {
+ item.setId(element.getAttribute(ATTRIBUTE_ID));
+ item.setName(element.getAttribute(ATTRIBUTE_NAME));
+ item.setDescription(element.getAttribute(ATTRIBUTE_DESCRIPTION));
+ item.setUrl(element.getAttribute(ATTRIBUTE_URL));
+ String iconPath = element.getAttribute(ATTRIBUTE_ICON);
+ if (iconPath != null) {
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(element.getContributor().getName(),
+ iconPath);
+ if (descriptor != null) {
+ item.setIcon(descriptor);
+ }
+ }
+
+ // optionally complement data from referenced feature
+ String featureId = element.getAttribute(ATTRIBUTE_FEATURE_ID);
+ if (featureId != null) {
+ IBundleGroup bundleGroup = getBundleGroup(featureId);
+ if (bundleGroup == null) {
+ // indicate that the specified feature was not found
+ return false;
+ } else {
+ if (item.getName() == null) {
+ item.setName(bundleGroup.getName());
+ }
+ if (item.getDescription() == null) {
+ item.setDescription(bundleGroup.getDescription());
+ }
+ if (item.getIcon() == null) {
+ String imageUrl = bundleGroup.getProperty(IBundleGroupConstants.FEATURE_IMAGE);
+ if (imageUrl != null) {
+ try {
+ item.setIcon(ImageDescriptor.createFromURL(new URL(imageUrl)));
+ } catch (MalformedURLException e) {
+ // ignore
+ }
+ }
+ }
+ if (item instanceof SupportProduct) {
+ ((SupportProduct) item).setBundleGroup(bundleGroup);
+ }
+ }
+ }
+ return true;
+ }
+
+ private void readCategory(IConfigurationElement element) {
+ SupportCategory category = new SupportCategory();
+ readAttributes(element, category);
+ String weight = element.getAttribute(ATTRIBUTE_WEIGHT);
+ if (weight != null) {
+ try {
+ category.setWeight(Integer.parseInt(weight));
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ categories.add(category);
+ }
+
+ private void readExtensions() {
+ categories = new ArrayList<SupportCategory>();
+ productById = new HashMap<String, SupportProduct>();
+ providerById = new HashMap<String, SupportProvider>();
+ defaultProduct = new SupportProduct();
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_PLUGIN_SUPPORT);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELEMENT_CATEGORY)) {
+ readCategory(element);
+ }
+ }
+ }
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELEMENT_PROVIDER)) {
+ readProvider(element);
+ }
+ }
+ }
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELEMENT_PRODUCT)) {
+ readProduct(element);
+ }
+ }
+ }
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELEMENT_MAPPING)) {
+ readMapping(element);
+ }
+ }
+ }
+
+ // clear cache
+ bundleGroupById = null;
+ }
+
+ private ProductRepositoryMapping readMapping(IConfigurationElement element) {
+ String namespace = element.getAttribute(ATTRIBUTE_NAMESPACE);
+ String productId = element.getAttribute(ATTRIBUTE_PRODUCT_ID);
+ Map<String, String> attributes = new HashMap<String, String>();
+ // repository
+ for (IConfigurationElement attributeElement : element.getChildren(ELEMENT_REPOSITORY)) {
+ String repositoryUrl = attributeElement.getAttribute(ATTRIBUTE_REPOSITORY_URL);
+ attributes.put(IRepositoryConstants.REPOSITORY_URL, repositoryUrl);
+ String connectorKind = attributeElement.getAttribute(ATTRIBUTE_REPOSITORY_KIND);
+ attributes.put(IRepositoryConstants.CONNECTOR_KIND, connectorKind);
+ }
+ // attributes
+ for (IConfigurationElement attributeElement : element.getChildren(ELEMENT_PROPERTY)) {
+ String name = attributeElement.getAttribute(ATTRIBUTE_NAME);
+ String value = attributeElement.getAttribute(ATTRIBUTE_VALUE);
+ attributes.put(name, value);
+ }
+
+ if (!attributes.isEmpty()) {
+ ProductRepositoryMapping mapping = new ProductRepositoryMapping(namespace);
+ mapping.addAttributes(attributes);
+
+ final SupportProduct product;
+ if (productId == null) {
+ product = defaultProduct;
+ } else {
+ product = getProduct(productId);
+ if (product == null) {
+ StatusHandler.log(new Status(
+ IStatus.WARNING,
+ TasksBugsPlugin.ID_PLUGIN,
+ NLS.bind(
+ "Mapping contributed by {0} with namespace ''{1}'' ignored, invalid product id ''{1}'' specified", //$NON-NLS-1$
+ new String[] { element.getNamespaceIdentifier(), namespace, productId })));
+ return null;
+ }
+ }
+ product.addRepositoryMapping(mapping);
+ return mapping;
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, NLS.bind(
+ "Mapping contributed by {0} with namespace ''{1}'' ignored, no attributes specified", //$NON-NLS-1$
+ new String[] { element.getNamespaceIdentifier(), namespace })));
+ return null;
+ }
+ }
+
+ private SupportProduct readProduct(IConfigurationElement element) {
+ String id = element.getAttribute(ATTRIBUTE_ID);
+ String providerId = element.getAttribute(ATTRIBUTE_PROVIDER_ID);
+ IProvider provider = getProvider(providerId);
+ if (provider == null) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, NLS.bind(
+ "Product contributed by {0} with id ''{1}'' ignored, product id ''{2}'' is invalid", //$NON-NLS-1$
+ new String[] { element.getNamespaceIdentifier(), id, providerId })));
+ return null;
+ }
+ boolean enabled = true;
+ String pluginId = element.getAttribute(ATTRIBUTE_PLUGIN_ID);
+ if (pluginId != null) {
+ enabled &= Platform.getBundle(pluginId) != null;
+ }
+ SupportProduct product = new SupportProduct();
+ enabled &= readAttributes(element, product);
+ // disable products that do not have a corresponding plug-in or feature installed
+ product.setInstalled(enabled);
+ product.setProvider(provider);
+ if (!addProduct(product)) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, NLS.bind(
+ "Product contributed by {0} ignored, id ''{1}'' already present", //$NON-NLS-1$
+ element.getNamespaceIdentifier(), id)));
+ return null;
+ }
+ ((SupportProvider) provider).add(product);
+ productById.put(id, product);
+ return product;
+ }
+
+ private SupportProvider readProvider(IConfigurationElement element) {
+ String id = element.getAttribute(ATTRIBUTE_ID);
+ SupportProvider provider = new SupportProvider();
+ readAttributes(element, provider);
+ if (!addProvider(provider)) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, NLS.bind(
+ "Provider contributed by {0} ignored, id ''{1}'' already present", //$NON-NLS-1$
+ element.getNamespaceIdentifier(), id)));
+ return null;
+ }
+ String categoryId = element.getAttribute(ATTRIBUTE_CATEGORY_ID);
+ SupportCategory category = getCategory(categoryId);
+ if (category == null) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksBugsPlugin.ID_PLUGIN, NLS.bind(
+ "Provider contributed by {0} ignored with id ''{1}'' ignored, category id ''{2}'' is invalid", //$NON-NLS-1$
+ new String[] { element.getNamespaceIdentifier(), id, categoryId })));
+ return null;
+ }
+ providerById.put(id, provider);
+ category.add(provider);
+ provider.setCategory(category);
+ return provider;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportRequest.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportRequest.java
new file mode 100644
index 0000000..8d6cc52
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/SupportRequest.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ISupportRequest;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ITaskContribution;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SupportRequest implements ISupportRequest {
+
+ private final Map<String, ITaskContribution> contributionByProductId;
+
+ private final IStatus status;
+
+ private final SupportProviderManager providerManager;
+
+ private AttributeTaskMapper defaultContribution;
+
+ private final IProduct product;
+
+ public SupportRequest(SupportProviderManager providerManager, IStatus status, IProduct product) {
+ this.providerManager = providerManager;
+ this.status = status;
+ this.contributionByProductId = new HashMap<String, ITaskContribution>();
+ if (product != null) {
+ this.product = product;
+ this.defaultContribution = process(getNamespace(), (SupportProduct) product);
+ } else {
+ this.product = null;
+ process();
+ }
+ }
+
+ public SupportRequest(SupportProviderManager providerManager, IStatus status) {
+ this(providerManager, status, null);
+ }
+
+ public ITaskContribution getOrCreateContribution(IProduct product) {
+ ITaskContribution contribution = contributionByProductId.get(product.getId());
+ if (contribution == null) {
+ contribution = new AttributeTaskMapper(status, product);
+ contributionByProductId.put(product.getId(), contribution);
+ }
+ return contribution;
+// ITaskContribution contribution = taskContributionByProductId.get(productId);
+// if (contribution == null) {
+// SupportProduct product = providerManager.getProduct(productId);
+// if (product == null) {
+// throw new IllegalArgumentException(NLS.bind("Invalid product id ''{0}''", productId)); //$NON-NLS-1$
+// }
+// contribution = new AttributeTaskMapper(status, product);
+// taskContributionByProductId.put(productId, contribution);
+// }
+// return contribution;
+ }
+
+ public ITaskContribution getDefaultContribution() {
+ if (defaultContribution == null) {
+ String namespace = getNamespace();
+ Map<String, String> attributes = providerManager.getDefaultProduct().getAllAttributes(namespace);
+
+ defaultContribution = new AttributeTaskMapper(status, providerManager.getDefaultProduct());
+ defaultContribution.getAttributes().putAll(attributes);
+ }
+ return defaultContribution;
+ }
+
+ public IProduct getProduct() {
+ return product;
+ }
+
+ public IStatus getStatus() {
+ return status;
+ }
+
+ private void process() {
+ String namespace = getNamespace();
+ Collection<SupportProduct> products = providerManager.getProducts();
+ for (SupportProduct product : products) {
+ process(namespace, product);
+ }
+ }
+
+ private AttributeTaskMapper process(String namespace, SupportProduct product) {
+ Map<String, String> productAttributes = product.getAllAttributes(namespace);
+ if (!productAttributes.isEmpty()) {
+ // merge global and more specific product attributes
+ Map<String, String> attributes = providerManager.getDefaultProduct().getAllAttributes(namespace);
+ attributes.putAll(productAttributes);
+
+ AttributeTaskMapper contribution = (AttributeTaskMapper) getOrCreateContribution(product);
+ contribution.getAttributes().putAll(attributes);
+ return contribution;
+ }
+ return null;
+ }
+
+ private String getNamespace() {
+ return status.getPlugin();
+ }
+
+ public List<ITaskContribution> getContributions() {
+ return new ArrayList<ITaskContribution>(contributionByProductId.values());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java
new file mode 100644
index 0000000..7960a38
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TaskErrorReporter.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ITaskContribution;
+import org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportErrorWizard;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskErrorReporter {
+
+ private final SupportHandlerManager handlerManager;
+
+ private final SupportProviderManager providerManager;
+
+ public TaskErrorReporter() {
+ this.handlerManager = new SupportHandlerManager();
+ this.providerManager = new SupportProviderManager();
+ }
+
+ public SupportHandlerManager getHandlerManager() {
+ return handlerManager;
+ }
+
+ public SupportRequest preProcess(IStatus status, IProduct product) {
+ Assert.isNotNull(status);
+ //Map<String, String> attributes = mappingManager.getAllAttributes(namespace);
+ SupportRequest request = new SupportRequest(providerManager, status, product);
+ handlerManager.preProcess(request);
+ return request;
+ }
+
+ public boolean process(final ITaskContribution response, IRunnableContext context) {
+ Assert.isNotNull(response);
+ ICoreRunnable runner = new ICoreRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask(Messages.TaskErrorReporter_Job_Progress_Process_support_request, IProgressMonitor.UNKNOWN);
+ process((AttributeTaskMapper) response, monitor);
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ try {
+ CommonUiUtil.run(context, runner);
+ } catch (CoreException e) {
+ TasksUiInternal.logAndDisplayStatus(Messages.TaskErrorReporter_Create_Task_Error_Title, new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN,
+ Messages.TaskErrorReporter_Create_Task_Error_Message, e));
+ return false;
+ } catch (OperationCanceledException e) {
+ return false;
+ }
+ return true;
+ }
+
+ public void process(AttributeTaskMapper mapper, IProgressMonitor monitor) throws CoreException {
+ Assert.isNotNull(mapper);
+ handlerManager.process(mapper, monitor);
+ if (!mapper.isHandled()) {
+ final TaskData taskData = mapper.createTaskData(monitor);
+ mapper.setTaskData(taskData);
+ handlerManager.postProcess(mapper, monitor);
+ // XXX open task asynchronously to make sure the workbench is active
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ TasksUiInternal.createAndOpenNewTask(taskData);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksBugsPlugin.ID_PLUGIN,
+ "Unexpected error while creating task", e)); //$NON-NLS-1$
+ }
+ }
+ });
+ }
+ }
+
+ public void handle(final IStatus status) {
+ ReportErrorWizard wizard = new ReportErrorWizard(this, status);
+ WizardDialog dialog = new WizardDialog(WorkbenchUtil.getShell(), wizard);
+ dialog.setBlockOnOpen(false);
+ dialog.setPageSize(500, 200);
+ dialog.open();
+ }
+
+ public SupportProviderManager getProviderManager() {
+ return providerManager;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java
new file mode 100644
index 0000000..056e6a5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/TasksBugsPlugin.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.commons.core.AbstractErrorReporter;
+import org.eclipse.mylyn.internal.tasks.bugs.wizards.ErrorLogStatus;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TasksBugsPlugin extends AbstractUIPlugin {
+
+ public static class BugReporter extends AbstractErrorReporter {
+
+ @Override
+ public int getPriority(IStatus status) {
+ if (status instanceof ErrorLogStatus) {
+ return PRIORITY_DEFAULT;
+ }
+ return PRIORITY_NONE;
+ //return getTaskErrorReporter().getPriority(status);
+ }
+
+ @Override
+ public void handle(final IStatus status) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null) {
+ Display display = workbench.getDisplay();
+ if (display != null && !display.isDisposed()) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ getTaskErrorReporter().handle(status);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.tasks.bugs"; //$NON-NLS-1$
+
+ private static TasksBugsPlugin INSTANCE;
+
+ private static TaskErrorReporter taskErrorReporter;
+
+ public static TasksBugsPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ public static synchronized TaskErrorReporter getTaskErrorReporter() {
+ if (taskErrorReporter == null) {
+ taskErrorReporter = new TaskErrorReporter();
+ }
+ return taskErrorReporter;
+ }
+
+ public TasksBugsPlugin() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ INSTANCE = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ INSTANCE = null;
+ super.stop(context);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/Messages.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/Messages.java
new file mode 100644
index 0000000..dc90dab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/Messages.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.bugs.actions.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String NewTaskFromErrorAction_ERROR_LOG_DATE;
+
+ public static String NewTaskFromErrorAction_MESSGAE;
+
+ public static String NewTaskFromErrorAction_no_stack_trace_available;
+
+ public static String NewTaskFromErrorAction_PLUGIN_ID;
+
+ public static String NewTaskFromErrorAction_SEVERITY;
+
+ public static String NewTaskFromErrorAction_STACK_TRACE;
+
+ public static String NewTaskFromMarkerHandler_LOCATION_LINE;
+
+ public static String NewTaskFromMarkerHandler_New_Task_from_Marker;
+
+ public static String NewTaskFromMarkerHandler_No_marker_selected;
+
+ public static String NewTaskFromMarkerHandler_Resource_;
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java
new file mode 100644
index 0000000..5f0aafe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromErrorAction.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Jeff Pound - intial API and implementation
+ * Tasktop Technologies - improvements
+ * Chris Aniszczyk <zx at us.ibm.com> - bug 208819
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.bugs.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.commons.core.ErrorReporterManager;
+import org.eclipse.mylyn.internal.tasks.bugs.wizards.ErrorLogStatus;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.internal.views.log.LogEntry;
+import org.eclipse.ui.internal.views.log.LogSession;
+
+/**
+ * Creates a new task from the selected error log entry.
+ *
+ * @author Jeff Pound
+ * @author Steffen Pingel
+ */
+public class NewTaskFromErrorAction implements IObjectActionDelegate {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.ui.repositories.actions.create"; //$NON-NLS-1$
+
+ private LogEntry entry;
+
+ /**
+ * Fills a {@link StringBuilder} with {@link LogEntry} information, optionally including subentries too
+ *
+ * @param entry
+ * The {@link LogEntry} who provides the information
+ * @param sb
+ * An {@link StringBuilder} to be filled with
+ * @param includeChildren
+ * Indicates if it should include subentries, if the {@link LogEntry} have any
+ */
+ private void buildDescriptionFromLogEntry(LogEntry entry, StringBuilder sb, boolean includeChildren) {
+ sb.append(Messages.NewTaskFromErrorAction_ERROR_LOG_DATE);
+ sb.append(entry.getDate());
+ sb.append(Messages.NewTaskFromErrorAction_MESSGAE);
+ sb.append(entry.getMessage());
+ sb.append(Messages.NewTaskFromErrorAction_SEVERITY + entry.getSeverityText());
+ sb.append(Messages.NewTaskFromErrorAction_PLUGIN_ID);
+ sb.append(entry.getPluginId());
+ sb.append(Messages.NewTaskFromErrorAction_STACK_TRACE);
+ if (entry.getStack() == null) {
+ sb.append(Messages.NewTaskFromErrorAction_no_stack_trace_available);
+ } else {
+ sb.append(entry.getStack());
+ }
+
+ if (includeChildren && entry.hasChildren()) {
+ Object[] children = entry.getChildren(null);
+ for (Object child : children) {
+ if (child instanceof LogEntry) {
+ buildDescriptionFromLogEntry((LogEntry) child, sb, includeChildren);
+ }
+ }
+ }
+ }
+
+ private void createTask(LogEntry entry) {
+ // FIXME reenable
+// Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+// boolean includeChildren = false;
+//
+// if (entry.hasChildren()
+// && MessageDialog.openQuestion(shell, "Report Bug", "Include children of this entry in the report?")) {
+// includeChildren = true;
+// }
+// StringBuilder sb = new StringBuilder();
+// buildDescriptionFromLogEntry(entry, sb, true);
+
+ ErrorLogStatus status = createStatus(entry);
+
+ new ErrorReporterManager().fail(status);
+ }
+
+ private ErrorLogStatus createStatus(LogEntry entry) {
+ ErrorLogStatus status = new ErrorLogStatus(entry.getSeverity(), entry.getPluginId(), entry.getCode(),
+ entry.getMessage());
+ try {
+ status.setDate(entry.getDate());
+ status.setStack(entry.getStack());
+ LogSession session = entry.getSession();
+ if (session != null) {
+ status.setLogSessionData(session.getSessionData());
+ }
+
+ if (entry.hasChildren()) {
+ Object[] children = entry.getChildren(entry);
+ if (children != null) {
+ for (Object child : children) {
+ if (child instanceof LogEntry) {
+ ErrorLogStatus childStatus = createStatus((LogEntry) child);
+ status.add(childStatus);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ // ignore any errors for setting additional attributes
+ }
+ return status;
+ }
+
+ public void run() {
+ createTask(entry);
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ Object object = ((IStructuredSelection) selection).getFirstElement();
+ if (object instanceof LogEntry) {
+ entry = (LogEntry) object;
+ }
+ }
+
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromMarkerHandler.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromMarkerHandler.java
new file mode 100644
index 0000000..d164ada
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/NewTaskFromMarkerHandler.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.bugs.actions;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.views.markers.MarkerViewHandler;
+import org.eclipse.ui.views.markers.internal.MarkerType;
+import org.eclipse.ui.views.markers.internal.MarkerTypesModel;
+
+/**
+ * Creates a new task from the selected marker entry.
+ *
+ * @author Frank Becker
+ * @since 3.0
+ */
+ at SuppressWarnings("restriction")
+public class NewTaskFromMarkerHandler extends MarkerViewHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IMarker[] markers = getSelectedMarkers(event);
+ if (markers.length == 0 || markers[0] == null) {
+ MessageDialog.openInformation(null, Messages.NewTaskFromMarkerHandler_New_Task_from_Marker,
+ Messages.NewTaskFromMarkerHandler_No_marker_selected);
+ return null;
+ }
+ final IMarker marker = markers[0];
+ TaskMapping mapping = new TaskMapping() {
+
+ @Override
+ public String getSummary() {
+ StringBuilder sb = new StringBuilder();
+ try {
+ MarkerType type = MarkerTypesModel.getInstance().getType(marker.getType());
+ sb.append(type.getLabel() + ": "); //$NON-NLS-1$
+ } catch (CoreException e) {
+ // ignore
+ }
+
+ return sb.toString() + marker.getAttribute("message", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public String getDescription() {
+ return buildDescriptionFromMarkerItem(marker);
+ }
+
+ };
+
+ TasksUiUtil.openNewTaskEditor(WorkbenchUtil.getShell(), mapping, null);
+ return null;
+ }
+
+ private String buildDescriptionFromMarkerItem(IMarker marker) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(Messages.NewTaskFromMarkerHandler_Resource_
+ + marker.getResource().getFullPath().removeLastSegments(1).toString().substring(1) + "/" //$NON-NLS-1$
+ + marker.getResource().getName());
+ int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, -1);
+ if (lineNumber != -1) {
+ sb.append(Messages.NewTaskFromMarkerHandler_LOCATION_LINE + lineNumber);
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java
new file mode 100644
index 0000000..a770909
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/ReportBugAction.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.tasks.bugs.wizards.ReportBugOrEnhancementWizard;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ReportBugAction implements IWorkbenchWindowActionDelegate {
+
+ private IWorkbenchWindow window;
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void run(IAction action) {
+ WizardDialog dialog = new WizardDialog(window.getShell(), new ReportBugOrEnhancementWizard());
+ dialog.open();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/messages.properties b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/messages.properties
new file mode 100644
index 0000000..25866a6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/actions/messages.properties
@@ -0,0 +1,11 @@
+NewTaskFromErrorAction_ERROR_LOG_DATE=\n\n-- Error Log --\nDate:
+NewTaskFromErrorAction_MESSGAE=\nMessage:
+NewTaskFromErrorAction_no_stack_trace_available=no stack trace available
+NewTaskFromErrorAction_PLUGIN_ID=\nPlugin ID:
+NewTaskFromErrorAction_SEVERITY=\nSeverity:
+NewTaskFromErrorAction_STACK_TRACE=\nStack Trace:\n
+
+NewTaskFromMarkerHandler_LOCATION_LINE=\nLocation: line
+NewTaskFromMarkerHandler_New_Task_from_Marker=New Task from Marker
+NewTaskFromMarkerHandler_No_marker_selected=No marker selected.
+NewTaskFromMarkerHandler_Resource_=Resource:
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/messages.properties b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/messages.properties
new file mode 100644
index 0000000..f71a2eb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/messages.properties
@@ -0,0 +1,21 @@
+DefaultSupportHandler_Configuration_Details=-- Configuration Details --
+DefaultSupportHandler_Date_X=Date: {0}
+DefaultSupportHandler_Installed_Features=Installed Features:
+DefaultSupportHandler_Message_X=Message: {0}
+DefaultSupportHandler_Plugin_X=Plugin: {0}
+DefaultSupportHandler_Product_X=Product: {0}
+DefaultSupportHandler_Severity_X=Severity: {0}
+DefaultSupportHandler_Step_1=1. \n
+DefaultSupportHandler_Step_2=2. \n
+DefaultSupportHandler_Step_3=3. \n
+DefaultSupportHandler_What_steps_message=What steps will reproduce the problem?
+DefaultTaskContributor_Error=Error
+DefaultTaskContributor_Error_Details=-- Error Details --
+DefaultTaskContributor_EXCEPTION_STACK_TRACE=\nException Stack Trace:\n
+DefaultTaskContributor_Info=Info
+DefaultTaskContributor_OK=OK
+DefaultTaskContributor_SESSION_DATA=\nSession Data:\n
+DefaultTaskContributor_Warning=Warning
+TaskErrorReporter_Create_Task_Error_Message=Unexpected error while creating task for error report
+TaskErrorReporter_Create_Task_Error_Title=Error Reporting
+TaskErrorReporter_Job_Progress_Process_support_request=Processing support request
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ErrorLogStatus.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ErrorLogStatus.java
new file mode 100644
index 0000000..fc571bc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ErrorLogStatus.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.MultiStatus;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ErrorLogStatus extends MultiStatus {
+
+ private String logSessionData;
+
+ private String stack;
+
+ private Date date;
+
+ public ErrorLogStatus(int severity, String pluginId, int code, String message) {
+ super(pluginId, code, message, null);
+
+ setSeverity(severity);
+ }
+
+ public String getLogSessionData() {
+ return logSessionData;
+ }
+
+ public void setLogSessionData(String logSessionData) {
+ this.logSessionData = logSessionData;
+ }
+
+ public String getStack() {
+ return stack;
+ }
+
+ public void setStack(String stack) {
+ this.stack = stack;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/Messages.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/Messages.java
new file mode 100644
index 0000000..ab95627
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/Messages.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.bugs.wizards.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ReportBugOrEnhancementWizard_Report_Bug_or_Enhancement;
+
+ public static String ReportErrorPage_Details;
+
+ public static String ReportErrorPage_Report_as_Bug;
+
+ public static String ReportErrorPage_Report_to;
+
+ public static String ReportErrorPage_Report_to_Label;
+
+ public static String ReportErrorPage_Select_repository;
+
+ public static String ReportErrorPage_AN_UNEXPETED_ERROR_HAS_OCCURED_IN_PLUGIN;
+
+ public static String ReportErrorPage_Xprovider_Xproduct;
+
+ public static String ReportErrorWizard_Report_as_Bug;
+
+ public static String SelectSupportElementPage_No_products_Message;
+
+ public static String SelectSupportElementPage_No_support_providers_Error0;
+
+ public static String SelectSupportElementPage_Support_Product_Description;
+
+ public static String SelectSupportElementPage_Support_Provider_Description;
+
+ public static String SelectSupportElementPage_Support_Provider_Title;
+
+ public static String SelectSupportElementPage_Supported_Product_Title;
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ProductStatus.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ProductStatus.java
new file mode 100644
index 0000000..375be23
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ProductStatus.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ProductStatus extends Status {
+
+ private final IProduct product;
+
+ public ProductStatus(IProduct product) {
+ super(IStatus.INFO, product.getId(), ""); //$NON-NLS-1$
+ this.product = product;
+ }
+
+ public IProduct getProduct() {
+ return product;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportBugOrEnhancementWizard.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportBugOrEnhancementWizard.java
new file mode 100644
index 0000000..04bb8e7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportBugOrEnhancementWizard.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProvider;
+import org.eclipse.mylyn.internal.tasks.bugs.AbstractSupportElement;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportCategory;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportProduct;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportProvider;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportProviderManager;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportRequest;
+import org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter;
+import org.eclipse.mylyn.internal.tasks.bugs.TasksBugsPlugin;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ReportBugOrEnhancementWizard extends Wizard {
+
+ private class SupportContentProvider implements IStructuredContentProvider {
+
+ private SupportProviderManager providerManager;
+
+ private Object input;
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof SupportProvider) {
+ List<SupportProduct> providerProducts = getProdcuts(inputElement);
+ return providerProducts.toArray();
+ } else if (input == inputElement) {
+ List<AbstractSupportElement> elements = new ArrayList<AbstractSupportElement>();
+ Collection<SupportCategory> categories = providerManager.getCategories();
+ for (SupportCategory category : categories) {
+ List<IProvider> providers = category.getProviders();
+ if (!providers.isEmpty()) {
+ elements.add(category);
+ for (IProvider provider : providers) {
+ elements.add((AbstractSupportElement) provider);
+ }
+ }
+ }
+ return elements.toArray();
+ } else {
+ return new Object[0];
+ }
+ }
+
+ private List<SupportProduct> getProdcuts(Object inputElement) {
+ Collection<SupportProduct> products = providerManager.getProducts();
+ SupportProvider provider = (SupportProvider) inputElement;
+ List<SupportProduct> providerProducts = new ArrayList<SupportProduct>();
+ for (SupportProduct product : products) {
+ if (provider.equals(product.getProvider()) && product.isInstalled()) {
+ providerProducts.add(product);
+ }
+ }
+ return providerProducts;
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.input = newInput;
+ this.providerManager = TasksBugsPlugin.getTaskErrorReporter().getProviderManager();
+ }
+
+ }
+
+ public ReportBugOrEnhancementWizard() {
+ setForcePreviousAndNextButtons(true);
+ setNeedsProgressMonitor(true);
+ setWindowTitle(Messages.ReportBugOrEnhancementWizard_Report_Bug_or_Enhancement);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPORT_BUG);
+ }
+
+ @Override
+ public void addPages() {
+ SelectSupportElementPage page = new SelectSupportElementPage("selectProvider", new SupportContentProvider()); //$NON-NLS-1$
+ page.setInput(new Object());
+ addPage(page);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return getSelectedElement() instanceof SupportProduct;
+ }
+
+ public AbstractSupportElement getSelectedElement() {
+ IWizardPage page = getContainer().getCurrentPage();
+ if (page != null) {
+ return ((SelectSupportElementPage) page).getSelectedElement();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean performFinish() {
+ final AbstractSupportElement product = getSelectedElement();
+ if (!(product instanceof SupportProduct)) {
+ return false;
+ }
+
+ TaskErrorReporter reporter = TasksBugsPlugin.getTaskErrorReporter();
+ IStatus status = new ProductStatus((IProduct) product);
+ SupportRequest request = reporter.preProcess(status, ((ProductStatus) status).getProduct());
+ return reporter.process(request.getDefaultContribution(), getContainer());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java
new file mode 100644
index 0000000..b1f43d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorPage.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProduct;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.ITaskContribution;
+import org.eclipse.mylyn.internal.tasks.bugs.AttributeTaskMapper;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportRequest;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ReportErrorPage extends WizardPage {
+
+ private final IStatus status;
+
+ private final List<AttributeTaskMapper> contributions;
+
+ private AttributeTaskMapper selectedContribution;
+
+ private Combo contributionCombo;
+
+ public ReportErrorPage(SupportRequest request, IStatus status) {
+ super("reportError"); //$NON-NLS-1$
+ this.status = status;
+ this.contributions = new ArrayList<AttributeTaskMapper>();
+ addContributions(request.getContributions());
+ setTitle(Messages.ReportErrorPage_Report_as_Bug);
+ setMessage(MessageFormat.format(Messages.ReportErrorPage_AN_UNEXPETED_ERROR_HAS_OCCURED_IN_PLUGIN,
+ status.getPlugin()));
+ }
+
+ private void addContributions(List<ITaskContribution> contributions) {
+ for (ITaskContribution contribution : contributions) {
+ if (((AttributeTaskMapper) contribution).isMappingComplete()) {
+ this.contributions.add((AttributeTaskMapper) contribution);
+ }
+ }
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+
+// Group errorGroup = new Group(composite, SWT.NONE);
+// GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(errorGroup);
+// errorGroup.setText("Details");
+// errorGroup.setLayout(new GridLayout(1, true));
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setText(Messages.ReportErrorPage_Details);
+
+ Text text = new Text(composite, SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER);
+ text.setText(status.getMessage());
+ GridDataFactory.fillDefaults().span(2, 1).grab(true, true).applyTo(text);
+
+ // space
+ label = new Label(composite, SWT.NONE);
+ GridDataFactory.fillDefaults().span(2, 1).applyTo(label);
+
+ selectedContribution = null;
+ if (!contributions.isEmpty()) {
+ final Button defaultRepositoryButton = new Button(composite, SWT.RADIO);
+ defaultRepositoryButton.setSelection(true);
+ selectedContribution = contributions.get(0);
+ if (contributions.size() == 1) {
+ defaultRepositoryButton.setText(NLS.bind(Messages.ReportErrorPage_Report_to,
+ getLabel(selectedContribution)));
+ GridDataFactory.fillDefaults().span(2, 1).applyTo(defaultRepositoryButton);
+ } else {
+ defaultRepositoryButton.setText(Messages.ReportErrorPage_Report_to_Label);
+ contributionCombo = new Combo(composite, SWT.READ_ONLY);
+ for (AttributeTaskMapper contribution : contributions) {
+ contributionCombo.add(getLabel(contribution));
+ }
+ contributionCombo.select(0);
+ contributionCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ int selectionIndex = contributionCombo.getSelectionIndex();
+ if (selectionIndex != -1) {
+ selectedContribution = contributions.get(selectionIndex);
+ }
+ }
+ });
+ }
+
+ final Button selectRepositoryButton = new Button(composite, SWT.RADIO);
+ selectRepositoryButton.setText(Messages.ReportErrorPage_Select_repository);
+ GridDataFactory.fillDefaults().span(2, 1).applyTo(selectRepositoryButton);
+
+ defaultRepositoryButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (defaultRepositoryButton.getSelection()) {
+ selectRepositoryButton.setSelection(false);
+ }
+ if (contributionCombo != null) {
+ contributionCombo.setEnabled(true);
+ selectedContribution = contributions.get(contributionCombo.getSelectionIndex());
+ } else {
+ selectedContribution = contributions.get(0);
+ }
+ getContainer().updateButtons();
+ }
+ });
+
+ selectRepositoryButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (selectRepositoryButton.getSelection()) {
+ defaultRepositoryButton.setSelection(false);
+ if (contributionCombo != null) {
+ contributionCombo.setEnabled(false);
+ }
+ }
+ selectedContribution = null;
+ getContainer().updateButtons();
+ }
+ });
+ }
+ setControl(composite);
+ Dialog.applyDialogFont(composite);
+ }
+
+ private String getLabel(AttributeTaskMapper contribution) {
+ IProduct product = contribution.getProduct();
+ if (product.getName() != null) {
+ return NLS.bind(Messages.ReportErrorPage_Xprovider_Xproduct, product.getProvider().getName(),
+ product.getName());
+ } else {
+ return product.getProvider().getName();
+ }
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return selectedContribution == null;
+ }
+
+ public AttributeTaskMapper getSelectedContribution() {
+ return selectedContribution;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java
new file mode 100644
index 0000000..0ab9b88
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/ReportErrorWizard.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.bugs.AttributeTaskMapper;
+import org.eclipse.mylyn.internal.tasks.bugs.KeyValueMapping;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportRequest;
+import org.eclipse.mylyn.internal.tasks.bugs.TaskErrorReporter;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskPage;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ReportErrorWizard extends Wizard {
+
+ private final IStatus status;
+
+ private final SupportRequest request;
+
+ private ReportErrorPage reportErrorPage;
+
+ private NewTaskPage newTaskPage;
+
+ private final TaskErrorReporter taskErrorReporter;
+
+ public ReportErrorWizard(TaskErrorReporter taskErrorReporter, IStatus status) {
+ this.taskErrorReporter = taskErrorReporter;
+ this.status = status;
+ this.request = taskErrorReporter.preProcess(status, null);
+ setWindowTitle(Messages.ReportErrorWizard_Report_as_Bug);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPORT_BUG);
+ setNeedsProgressMonitor(true);
+ }
+
+ @Override
+ public void addPages() {
+ reportErrorPage = new ReportErrorPage(request, status);
+ addPage(reportErrorPage);
+ KeyValueMapping defaultMapping = new KeyValueMapping(
+ ((AttributeTaskMapper) request.getDefaultContribution()).getAttributes());
+ newTaskPage = new NewTaskPage(ITaskRepositoryFilter.CAN_CREATE_NEW_TASK, defaultMapping);
+ addPage(newTaskPage);
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (reportErrorPage.getSelectedContribution() != null) {
+ return taskErrorReporter.process(reportErrorPage.getSelectedContribution(), getContainer());
+ } else {
+ return newTaskPage.performFinish();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/SelectSupportElementPage.java b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/SelectSupportElementPage.java
new file mode 100644
index 0000000..0e900e0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/SelectSupportElementPage.java
@@ -0,0 +1,404 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugs.wizards;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.commons.ui.ControlListItem;
+import org.eclipse.mylyn.internal.commons.ui.ControlListViewer;
+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.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.provisional.tasks.bugs.IProvider;
+import org.eclipse.mylyn.internal.tasks.bugs.AbstractSupportElement;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportCategory;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportProduct;
+import org.eclipse.mylyn.internal.tasks.bugs.SupportProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Steffen Pingel
+ */
+ at SuppressWarnings("restriction")
+public class SelectSupportElementPage extends WizardPage {
+
+ private class SupportElementItem extends ControlListItem {
+
+ private static final int ICON_GAP = 10;
+
+ private ToolBar toolBar;
+
+ private Label titleLabel;
+
+ private Label iconLabel;
+
+ private Label descriptionLabel;
+
+ private ToolBarManager toolBarManager;
+
+ private boolean gradientBackground;
+
+ private GradientCanvas canvas;
+
+ public SupportElementItem(Composite parent, int style, Object element) {
+ super(parent, style, element);
+ registerChild(titleLabel);
+ registerChild(iconLabel);
+ registerChild(descriptionLabel);
+ registerChild(toolBar);
+ }
+
+ public void setGradientBackground(boolean gradientBackground) {
+ this.gradientBackground = gradientBackground;
+
+ if (gradientBackground) {
+ IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+ Color colorCategoryGradientStart = themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_CATEGORY_GRADIENT_START);
+ Color colorCategoryGradientEnd = themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_CATEGORY_GRADIENT_END);
+
+ canvas.setSeparatorVisible(true);
+ canvas.setSeparatorAlignment(SWT.TOP);
+ canvas.setBackgroundGradient(new Color[] { colorCategoryGradientStart, colorCategoryGradientEnd },
+ new int[] { 100 }, true);
+ canvas.putColor(GradientCanvas.H_BOTTOM_KEYLINE1, colorCategoryGradientStart);
+ canvas.putColor(GradientCanvas.H_BOTTOM_KEYLINE2, colorCategoryGradientEnd);
+
+ }
+ }
+
+ public boolean isGradientBackground() {
+ return gradientBackground;
+ }
+
+ @Override
+ protected void createContent() {
+ setLayout(new FillLayout());
+
+ canvas = new GradientCanvas(this, SWT.NONE);
+
+ FormLayout layout = new FormLayout();
+ layout.marginHeight = 3;
+ layout.marginWidth = 3;
+ canvas.setLayout(layout);
+
+ iconLabel = new Label(canvas, SWT.NONE);
+ FormData fd = new FormData();
+ fd.left = new FormAttachment(0);
+ iconLabel.setLayoutData(fd);
+
+ titleLabel = new Label(canvas, SWT.NONE);
+ titleLabel.setFont(JFaceResources.getBannerFont());
+ fd = new FormData();
+ fd.left = new FormAttachment(iconLabel, ICON_GAP);
+ titleLabel.setLayoutData(fd);
+
+ descriptionLabel = new Label(canvas, SWT.WRAP);
+
+ toolBarManager = new ToolBarManager(SWT.FLAT);
+ toolBar = toolBarManager.createControl(canvas);
+
+ fd = new FormData();
+ fd.top = new FormAttachment(titleLabel, 5);
+ fd.left = new FormAttachment(iconLabel, 10);
+ fd.right = new FormAttachment(toolBar, -5);
+ descriptionLabel.setLayoutData(fd);
+
+ fd = new FormData();
+ fd.right = new FormAttachment(100);
+ toolBar.setLayoutData(fd);
+
+ refresh();
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ toolBarManager.dispose();
+ }
+
+ @Override
+ public void setBackground(Color color) {
+ if (isGradientBackground()) {
+ return;
+ }
+ super.setBackground(color);
+ }
+
+ @Override
+ public void setForeground(Color color) {
+ if (isGradientBackground()) {
+ // ignore
+ return;
+ }
+ super.setForeground(color);
+ if (isSelected()) {
+ titleLabel.setForeground(color);
+ descriptionLabel.setForeground(color);
+ } else {
+ titleLabel.setForeground(color);
+ descriptionLabel.setForeground(getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
+ }
+ }
+
+ @Override
+ protected void refresh() {
+ AbstractSupportElement data = (AbstractSupportElement) getData();
+ Image image = getImage(data);
+ if (image == null) {
+ // left align with column
+ ((FormData) titleLabel.getLayoutData()).left = new FormAttachment(0);
+ ((FormData) descriptionLabel.getLayoutData()).left = new FormAttachment(0);
+ } else {
+ // leave space between icon and text
+ ((FormData) titleLabel.getLayoutData()).left = new FormAttachment(iconLabel, ICON_GAP);
+ ((FormData) descriptionLabel.getLayoutData()).left = new FormAttachment(iconLabel, ICON_GAP);
+ }
+ iconLabel.setImage(image);
+ titleLabel.setText(data.getName());
+ descriptionLabel.setText(data.getDescription());
+
+ toolBarManager.removeAll();
+ final String url = data.getUrl();
+ if (url != null) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ WorkbenchUtil.openUrl(url, IWorkbenchBrowserSupport.AS_EXTERNAL);
+ }
+ };
+ action.setImageDescriptor(CommonImages.INFORMATION);
+ toolBarManager.add(action);
+ }
+ toolBarManager.update(false);
+ }
+
+ @Override
+ public void setHot(boolean hot) {
+ super.setHot(hot);
+ updateToolBar();
+ }
+
+ @Override
+ public void setSelected(boolean select) {
+ super.setSelected(select);
+ updateToolBar();
+ canvas.redraw();
+ }
+
+ private void updateToolBar() {
+ if (toolBar != null) {
+ toolBar.setVisible(isHot() || isSelected());
+ }
+ }
+
+ }
+
+ public class SupportElementViewer extends ControlListViewer {
+
+ public SupportElementViewer(Composite parent, int style) {
+ super(parent, style);
+ // ignore
+ }
+
+ @Override
+ protected ControlListItem doCreateItem(Composite parent, Object element) {
+ if (element instanceof SupportCategory) {
+ SupportElementItem item = new SupportElementItem(parent, SWT.NONE, element);
+ item.setGradientBackground(true);
+ return item;
+ }
+ return new SupportElementItem(parent, SWT.NONE, element);
+ }
+
+ @Override
+ protected void doCreateNoEntryArea(Composite parent) {
+ parent.setLayout(new FillLayout());
+
+ Label label = new Label(parent, SWT.WRAP);
+ label.setText(Messages.SelectSupportElementPage_No_support_providers_Error0);
+ }
+
+ }
+
+ private static final int TABLE_HEIGHT = 200;
+
+ private AbstractSupportElement selectedElement;
+
+ private ImageRegistry imageRegistry;
+
+ private final IStructuredContentProvider contentProvider;
+
+ private Object input;
+
+ public SelectSupportElementPage(String pageName, IStructuredContentProvider contentProvider) {
+ super(pageName);
+ this.contentProvider = contentProvider;
+ }
+
+ public Image getImage(AbstractSupportElement data) {
+ if (imageRegistry == null) {
+ imageRegistry = new ImageRegistry(getShell().getDisplay());
+ }
+ Image image = imageRegistry.get(data.getId());
+ if (image == null && data.getIcon() != null) {
+ imageRegistry.put(data.getId(), data.getIcon());
+ image = imageRegistry.get(data.getId());
+ }
+ return image;
+ }
+
+ public void setInput(Object input) {
+ this.input = input;
+
+ if (input instanceof IProvider) {
+ setTitle(Messages.SelectSupportElementPage_Supported_Product_Title);
+ setMessage(Messages.SelectSupportElementPage_Support_Product_Description);
+ } else {
+ setTitle(Messages.SelectSupportElementPage_Support_Provider_Title);
+ setMessage(Messages.SelectSupportElementPage_Support_Provider_Description);
+ }
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, true);
+ container.setLayout(layout);
+
+ ControlListViewer viewer = new SupportElementViewer(container, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL);
+ GridDataFactory.fillDefaults().grab(true, true).hint(500, TABLE_HEIGHT).applyTo(viewer.getControl());
+ viewer.setContentProvider(contentProvider);
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ Object object = selection.getFirstElement();
+ if (object instanceof AbstractSupportElement) {
+ selectedElement = (AbstractSupportElement) object;
+ } else {
+ selectedElement = null;
+ }
+ updatePageStatus();
+ }
+ });
+ viewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ if (getWizard().performFinish()) {
+ ((WizardDialog) getContainer()).close();
+ }
+ }
+ });
+ viewer.setSorter(new ViewerSorter() {
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object o1, Object o2) {
+ int cat1 = category(o1);
+ int cat2 = category(o2);
+ if (cat1 != cat2) {
+ return cat1 - cat2;
+ }
+ if (o1 instanceof AbstractSupportElement && o2 instanceof AbstractSupportElement) {
+ return getComparator().compare(((AbstractSupportElement) o1).getName(),
+ ((AbstractSupportElement) o2).getName());
+ }
+ return super.compare(viewer, o1, o2);
+ }
+
+ @Override
+ public int category(Object element) {
+ if (element instanceof SupportCategory) {
+ return ((SupportCategory) element).getWeight() * 2;
+ } else if (element instanceof SupportProvider) {
+ if (((SupportProvider) element).getCategory() != null) {
+ return ((SupportProvider) element).getCategory().getWeight() * 2 + 1;
+ }
+ }
+ return super.category(element);
+ }
+ });
+ viewer.setInput(input);
+
+ setPageComplete(false);
+ setControl(container);
+ Dialog.applyDialogFont(container);
+ }
+
+ @Override
+ public void dispose() {
+ if (imageRegistry != null) {
+ imageRegistry.dispose();
+ }
+ super.dispose();
+ }
+
+ public AbstractSupportElement getSelectedElement() {
+ return selectedElement;
+ }
+
+ private void updatePageStatus() {
+ if (selectedElement instanceof SupportProvider) {
+ if (contentProvider.getElements(selectedElement).length > 0) {
+ setErrorMessage(null);
+ setPageComplete(true);
+ } else {
+ setErrorMessage(Messages.SelectSupportElementPage_No_products_Message);
+ setPageComplete(false);
+ }
+ } else if (selectedElement instanceof SupportProduct) {
+ setErrorMessage(null);
+ setPageComplete(true);
+ } else {
+ setErrorMessage(null);
+ setPageComplete(false);
+ }
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ if (selectedElement instanceof SupportProvider) {
+ SelectSupportElementPage page = new SelectSupportElementPage(selectedElement.getId(), contentProvider);
+ page.setInput(selectedElement);
+ page.setWizard(getWizard());
+ return page;
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/messages.properties b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/messages.properties
new file mode 100644
index 0000000..6bfaf80
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.bugs/src/org/eclipse/mylyn/internal/tasks/bugs/wizards/messages.properties
@@ -0,0 +1,18 @@
+ReportBugOrEnhancementWizard_Report_Bug_or_Enhancement=Report Bug or Enhancement
+
+ReportErrorPage_Details=Details:
+ReportErrorPage_Report_as_Bug=Report as Bug
+ReportErrorPage_Report_to=Report to: {0}
+ReportErrorPage_Report_to_Label=Report to:
+ReportErrorPage_Select_repository=Select repository
+ReportErrorPage_AN_UNEXPETED_ERROR_HAS_OCCURED_IN_PLUGIN=An unexpected error has occured in plug-in {0}
+ReportErrorPage_Xprovider_Xproduct={0} - {1}
+
+ReportErrorWizard_Report_as_Bug=Report as Bug
+
+SelectSupportElementPage_No_products_Message=The selected provider does not specify supported products or none of the supported products are installed.
+SelectSupportElementPage_No_support_providers_Error0=No support providers are available.
+SelectSupportElementPage_Support_Product_Description=Select a supported product from the list.
+SelectSupportElementPage_Support_Provider_Description=Select a support provider from the list.
+SelectSupportElementPage_Support_Provider_Title=Support Provider
+SelectSupportElementPage_Supported_Product_Title=Supported Product
diff --git a/org.eclipse.mylyn.tasks.core/.classpath b/org.eclipse.mylyn.tasks.core/.classpath
new file mode 100644
index 0000000..97b36d4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.tasks.core/.cvsignore b/org.eclipse.mylyn.tasks.core/.cvsignore
new file mode 100644
index 0000000..4a98758
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.fbwarnings
diff --git a/org.eclipse.mylyn.tasks.core/.project b/org.eclipse.mylyn.tasks.core/.project
new file mode 100644
index 0000000..27ace4c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.tasks.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/41/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/41/refactorings.history
new file mode 100644
index 0000000..6d97394
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/41/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskList.getLargestTaskNum()' to 'getLastTaskNum' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.getLargestTaskNum()' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.getLastTaskNum()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getLargestTaskNum'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~getLargestTaskNum" name="getLastTaskNum" references="true" stamp="1160765175062" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskList.setLargestTaskNum(...)' to 'setLastTaskNum' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.setLargestTaskNum(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.setLastTaskNum(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setLargestTaskNum'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~setLargestTaskNum~I" name="setLastTaskNum" references="true" stamp="1160765185906" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/41/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/41/refactorings.index
new file mode 100644
index 0000000..3350c90
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/41/refactorings.index
@@ -0,0 +1,2 @@
+1160765175062 Rename method 'getLargestTaskNum'
+1160765185906 Rename method 'setLargestTaskNum'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..c832035
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.getTaskPrefix()' to 'getTaskIdPrefix' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.getTaskPrefix()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.getTaskIdPrefix()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskPrefix'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getTaskPrefix" name="getTaskIdPrefix" references="true" stamp="1161014894843" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskList.getQueryHitForHandle(...)' to 'getQueryHit' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.getQueryHitForHandle(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.getQueryHit(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getQueryHitForHandle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~getQueryHitForHandle~QString;" name="getQueryHit" references="true" stamp="1161028408796" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskList.getQueryHitsForHandle(...)' to 'getQueryHits' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.getQueryHitsForHandle(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.getQueryHits(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getQueryHitsForHandle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~getQueryHitsForHandle~QString;" name="getQueryHits" references="true" stamp="1161028429812" version="1.0"/>
+<refactoring comment="Change method 'public Set<AbstractQueryHit> org.eclipse.mylar.tasks.core.TaskList.getQueryHits(Set<String> handles)' to 'public Set<AbstractQueryHit> getQueryHits(Set<String> handles)' - Original project: 'org.eclipse.mylar.tasks.core' - Changed parameters: String handle" delegate="false" deprecate="true" description="Change method 'getQueryHits'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~getQueryHits~QString;" name="getQueryHits" parameter1="String handle 0 Set<String> handles false" stamp="1161028465562" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.AbstractRepositoryQuery.addHit(AbstractQueryHit hit, TaskList taskList)' to 'public void addHit(AbstractQueryHit hit)' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: TaskList taskList" delegate="false" deprecate="true" description="Change method 'addHit'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~addHit~QAbstractQueryHit;~QTaskList;" name="addHit" parameter1="AbstractQueryHit hit 0 AbstractQueryHit hit false" parameter2="TaskList taskList 1 TaskList taskList true" stamp="1161030783687" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..16aa2d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1,5 @@
+1161014894843 Rename method 'getTaskPrefix'
+1161028408796 Rename method 'getQueryHitForHandle'
+1161028429812 Rename method 'getQueryHitsForHandle'
+1161028465562 Change method 'getQueryHits'
+1161030783687 Change method 'addHit'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/43/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/43/refactorings.history
new file mode 100644
index 0000000..8f794b1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/43/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.getReminderDate()' to 'getScheduledForDate' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.getReminderDate()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.getScheduledForDate()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getReminderDate'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~getReminderDate" name="getScheduledForDate" references="true" stamp="1161642809812" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.RepositoryConfiguration.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.internal.tasks.core{RepositoryConfiguration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.core{RepositoryConfiguration.java	true	true	CopyOfRepositoryConfiguration.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1161998825921" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/43/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/43/refactorings.index
new file mode 100644
index 0000000..4a29a89
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/43/refactorings.index
@@ -0,0 +1,2 @@
+1161642809812 Rename method 'getReminderDate'
+1161998825921 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/44/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/44/refactorings.history
new file mode 100644
index 0000000..41cf909
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/44/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'bugzilla' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'bugzilla' - Original element: 'org.eclipse.mylar.internal.tasks.core.CopyOfRepositoryConfiguration.java'" description="Copy compilation unit" destination="developer/src-old/bugzilla" element1="/src<org.eclipse.mylar.internal.tasks.core{CopyOfRepositoryConfiguration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/tasks/core/CopyOfRepositoryConfiguration.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1162163281671" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.CopyOfRepositoryConfiguration.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.core{CopyOfRepositoryConfiguration.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1162163303390" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.bugzilla.core/src/org.eclipse.mylar.internal.bugzilla.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.RepositoryConfiguration.java' - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.core" element1="/src<org.eclipse.mylar.internal.tasks.core{RepositoryConfiguration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1162330939093" units="1" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateAttributes(TaskRepository repository, Proxy proxy, IProgressMonitor monitor) throws CoreException' to 'public void updateAttributes(TaskRepository repository, IProgressMonitor monitor) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxy" delegate="false" deprecate="true" description="Change method 'updateAttributes'" element1="/C:\/apps\/eclipse-3.3M2\/plugins\/org.eclipse.equinox.common_3.3.0.v20060906.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateAttributes~QTaskRepository;~QProxy;~QIProgressMonitor;" kind1="0" name="updateAttributes" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Proxy proxy 1 Proxy proxy true" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1162332393484" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/44/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/44/refactorings.index
new file mode 100644
index 0000000..9448330
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/10/44/refactorings.index
@@ -0,0 +1,4 @@
+1162163281671 Copy compilation unit
+1162163303390 Delete element
+1162330939093 Move compilation unit
+1162332393484 Change method 'updateAttributes'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..13bbbec
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getRepositoryForTaskUrl(...)' to 'getConnectorForTaskUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getRepositoryForTaskUrl(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getConnectorForTaskUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryForTaskUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryForTaskUrl~QString;" name="getConnectorForTaskUrl" references="true" stamp="1162605053531" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getConnectorForTaskUrl(...)' to 'getConnectorForRepositoryTaskUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getConnectorForTaskUrl(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getConnectorForRepositoryTaskUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getConnectorForTaskUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getConnectorForTaskUrl~QString;" name="getConnectorForRepositoryTaskUrl" references="true" stamp="1162605094218" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..d137630
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1,2 @@
+1162605053531 Rename method 'getRepositoryForTaskUrl'
+1162605094218 Rename method 'getConnectorForTaskUrl'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..d766bad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTaskState(AbstractRepositoryTask repositoryTask)' to 'public void updateTask(TaskRepository repository, AbstractRepositoryTask repositoryTask)' - Original project: 'org.eclipse.mylar.tasks.core' - New name: 'updateTask' - Added parameters: TaskRepository repository" default1="null" delegate="false" deprecate="true" description="Change method 'updateTaskState'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateTaskState~QAbstractRepositoryTask;" name="updateTask" parameter1="Object newParam -1 TaskRepository repository false" parameter2="AbstractRepositoryTask repositoryTask 0 AbstractRepositoryTask repositoryTask false" stamp="1163294073598" version="1.0"/>
+<refactoring comment="Change method 'public IStatus org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.performQuery(AbstractRepositoryQuery query, TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor, QueryHitCollector resultCollector)' to 'public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, QueryHitCollector resultCollector)' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QTaskRepository;~QProxy;~QIProgressMonitor;~QQueryHitCollector;" name="performQuery" parameter1="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="Proxy proxySettings 2 Proxy proxySettings true" parameter4="IProgressMonitor monitor 3 IProgressMonitor monitor false" parameter5="QueryHitCollector resultCollector 4 QueryHitCollector resultCollector false" stamp="1163810407734" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.attachContext(TaskRepository repository, AbstractRepositoryTask task, String longComment, Proxy proxySettings) throws CoreException' to 'public boolean attachContext(TaskRepository repository, AbstractRepositoryTask task, String longComment) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'attachContext'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~attachContext~QTaskRepository;~QAbstractRepositoryTask;~QString;~QProxy;" kind1="0" name="attachContext" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="AbstractRepositoryTask task 1 AbstractRepositoryTask task false" parameter3="String longComment 2 String longComment false" parameter4="Proxy proxySettings 3 Proxy proxySettings true" stamp="1163810603671" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.IAttachmentHandler.uploadAttachment(TaskRepository repository, AbstractRepositoryTask task, String comment, String description, File file, String contentType, boolean isPatch, Proxy proxySettings) throws CoreException' to 'public void uploadAttachment(TaskRepository repository, AbstractRepositoryTask task, String comment, String description, File file, String contentType, boolean isPatch) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'uploadAttachment'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{IAttachmentHandler.java[IAttachmentHandler~uploadAttachment~QTaskRepository;~QAbstractRepositoryTask;~QString;~QString;~QFile;~QString;~Z~QProxy;" kind1="0" name="uploadAttachment" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="AbstractRepositoryTask task 1 AbstractRepositoryTask task false" parameter3="String comment 2 String comment false" parameter4="String description 3 String description false" parameter5="File file 4 File file false" parameter6="String contentType 5 String contentType false" parameter7="boolean isPatch 6 boolean isPatch false" parameter8="Proxy proxySettings 7 Proxy proxySettings true" stamp="1163810623609" version="1.0"/>
+<refactoring comment="Change method 'public RepositoryTaskData org.eclipse.mylar.tasks.core.IOfflineTaskHandler.downloadTaskData(TaskRepository repository, String taskId, Proxy proxySettings) throws CoreException' to 'public RepositoryTaskData downloadTaskData(TaskRepository repository, String taskId) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'downloadTaskData'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{IOfflineTaskHandler.java[IOfflineTaskHandler~downloadTaskData~QTaskRepository;~QString;~QProxy;" kind1="0" name="downloadTaskData" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String taskId 1 String taskId false" parameter3="Proxy proxySettings 2 Proxy proxySettings true" stamp="1163810812984" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.retrieveContext(TaskRepository repository, AbstractRepositoryTask task, RepositoryAttachment attachment, Proxy proxySettings, String destinationPath) throws CoreException' to 'public boolean retrieveContext(TaskRepository repository, AbstractRepositoryTask task, RepositoryAttachment attachment, String destinationPath) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'retrieveContext'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~retrieveContext~QTaskRepository;~QAbstractRepositoryTask;~QRepositoryAttachment;~QProxy;~QString;" kind1="0" name="retrieveContext" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="AbstractRepositoryTask task 1 AbstractRepositoryTask task false" parameter3="RepositoryAttachment attachment 2 RepositoryAttachment attachment false" parameter4="Proxy proxySettings 3 Proxy proxySettings true" parameter5="String destinationPath 4 String destinationPath false" stamp="1163810888593" version="1.0"/>
+<refactoring comment="Change method 'public Set<AbstractRepositoryTask> org.eclipse.mylar.tasks.core.IOfflineTaskHandler.getChangedSinceLastSync(TaskRepository repository, Set<AbstractRepositoryTask> tasks, Proxy proxySettings) throws CoreException, UnsupportedEncodingException' to 'public Set<AbstractRepositoryTask> getChangedSinceLastSync(TaskRepository repository, Set<AbstractRepositoryTask> tasks) throws CoreException, UnsupportedEncodingException' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'getChangedSinceLastSync'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" element2="/C:\/Program Files\/Java\/jdk1.5.0_09\/jre\/lib\/rt.jar<java.io(UnsupportedEncodingException.class[UnsupportedEncodingException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{IOfflineTaskHandler.java[IOfflineTaskHandler~getChangedSinceLastSync~QTaskRepository;~QSet\<QAbstractRepositoryTask;>;~QProxy;" kind1="0" kind2="0" name="getChangedSinceLastSync" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Set<AbstractRepositoryTask> tasks 1 Set<AbstractRepositoryTask> tasks false" parameter3="Proxy proxySettings 2 Proxy proxySettings true" stamp="1163810923171" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..38d438b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1,7 @@
+1163294073598 Change method 'updateTaskState'
+1163810407734 Change method 'performQuery'
+1163810603671 Change method 'attachContext'
+1163810623609 Change method 'uploadAttachment'
+1163810812984 Change method 'downloadTaskData'
+1163810888593 Change method 'retrieveContext'
+1163810923171 Change method 'getChangedSinceLastSync'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..5925009
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITaskListElement.getDescription()' to 'getSummary' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITaskListElement.getDescription()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITaskListElement.getSummary()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITaskListElement.java[ITaskListElement~getDescription" name="getSummary" references="true" stamp="1164223460390" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.addOptionValue(...)' to 'addOption' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.addOptionValue(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.addOption(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'addOptionValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{RepositoryTaskAttribute.java[RepositoryTaskAttribute~addOptionValue~QString;~QString;" name="addOption" references="true" stamp="1164328656515" version="1.0"/>
+<refactoring comment="Change method 'public org.eclipse.mylar.tasks.core.TaskComment.TaskComment(AbstractAttributeFactory attributeFactory, RepositoryTaskData report, int num)' to 'public TaskComment(AbstractAttributeFactory attributeFactory, int num)' - Original project: 'org.eclipse.mylar.tasks.core' - Removed parameters: RepositoryTaskData report" delegate="false" deprecate="true" description="Change method 'TaskComment'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{TaskComment.java[TaskComment~TaskComment~QAbstractAttributeFactory;~QRepositoryTaskData;~I" name="TaskComment" parameter1="AbstractAttributeFactory attributeFactory 0 AbstractAttributeFactory attributeFactory false" parameter2="RepositoryTaskData report 1 RepositoryTaskData report true" parameter3="int num 2 int num false" stamp="1164341732140" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..d933050
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1,3 @@
+1164223460390 Rename method 'getDescription'
+1164328656515 Rename method 'addOptionValue'
+1164341732140 Change method 'TaskComment'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..d1b6d49
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.RepositoryTaskData.isLocallyCreated()' to 'isNew' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.RepositoryTaskData.isLocallyCreated()' - Renamed element: 'org.eclipse.mylar.tasks.core.RepositoryTaskData.isNew()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'isLocallyCreated'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{RepositoryTaskData.java[RepositoryTaskData~isLocallyCreated" name="isNew" references="true" stamp="1164531815500" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.core.IOfflineTaskHandler' to 'ITaskDataHandler' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.IOfflineTaskHandler' - Renamed element: 'org.eclipse.mylar.tasks.core.ITaskDataHandler' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'IOfflineTaskHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.core{IOfflineTaskHandler.java[IOfflineTaskHandler" matchStrategy="1" name="ITaskDataHandler" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1164558306828" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITaskDataHandler.downloadTaskData(...)' to 'getTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITaskDataHandler.downloadTaskData(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.ITaskDataHandler.getTaskData(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'downloadTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITaskDataHandler.java[ITaskDataHandler~downloadTaskData~QTaskRepository;~QString;" name="getTaskData" references="true" stamp="1164558345500" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.getOfflineTaskHandler()' to 'getTaskDataHandler' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.getOfflineTaskHandler()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.getTaskDataHandler()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getOfflineTaskHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getOfflineTaskHandler" name="getTaskDataHandler" references="true" stamp="1164559678000" version="1.0"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingKey(TaskRepository repository, String id, Proxy proxySettings) throws CoreException' to 'public ITask createTaskFromExistingKey(TaskRepository repository, String id) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Keep original element as delegate to refactored element - Removed parameters: Proxy proxySettings" delegate="true" deprecate="false" description="Change method 'createTaskFromExistingKey'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~createTaskFromExistingKey~QTaskRepository;~QString;~QProxy;" kind1="0" name="createTaskFromExistingKey" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String id 1 String id false" parameter3="Proxy proxySettings 2 Proxy proxySettings true" stamp="1164571814359" version="1.0"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingKey(TaskRepository repository, String id) throws CoreException' to 'public AbstractRepositoryTask createTaskFromExistingKey(TaskRepository repository, String id) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - New return type: 'AbstractRepositoryTask'" delegate="false" deprecate="false" description="Change method 'createTaskFromExistingKey'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~createTaskFromExistingKey~QTaskRepository;~QString;" kind1="0" name="createTaskFromExistingKey" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String id 1 String id false" return="AbstractRepositoryTask" stamp="1164576574906" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..0f64def
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1,6 @@
+1164531815500 Rename method 'isLocallyCreated'
+1164558306828 Rename type 'IOfflineTaskHandler'
+1164558345500 Rename method 'downloadTaskData'
+1164559678000 Rename method 'getOfflineTaskHandler'
+1164571814359 Change method 'createTaskFromExistingKey'
+1164576574906 Change method 'createTaskFromExistingKey'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..ffdfc3f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Original elements: org.eclipse.mylar.internal.tasks.core.HtmlStreamTokenizer.java org.eclipse.mylar.internal.tasks.core.HtmlTag.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.tasks.core.html" element1="/src<org.eclipse.mylar.internal.tasks.core{HtmlStreamTokenizer.java" element2="/src<org.eclipse.mylar.internal.tasks.core{HtmlTag.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165460921218" units="2" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.core.html' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.core.html' - Original elements: org.eclipse.mylar.tasks.core.html.HTML2TextReader.java org.eclipse.mylar.tasks.core.html.SubstitutionTextReader.java org.eclipse.mylar.tasks.core.html.SingleCharReader.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.jira.core.html" element1="/src<org.eclipse.mylar.tasks.core.html{HTML2TextReader.java" element2="/src<org.eclipse.mylar.tasks.core.html{SubstitutionTextReader.java" element3="/src<org.eclipse.mylar.tasks.core.html{SingleCharReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165461152671" units="3" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Original element: 'org.eclipse.mylar.internal.tasks.core.WebClientUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core.html" element1="/src<org.eclipse.mylar.internal.tasks.core{WebClientUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165461200656" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.tasks.core.html' to 'org.eclipse.mylar.tasks.core.web' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Renamed element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.web' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.tasks.core.html'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.tasks.core.html" name="org.eclipse.mylar.tasks.core.web" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1165461226062" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.UnrecognizedReponseException.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.internal.tasks.core{UnrecognizedReponseException.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462200562" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.getTaskType()' to 'getTaskKind' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.getTaskType()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.getTaskKind()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskType'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~getTaskType" name="getTaskKind" references="true" stamp="1165522905015" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.setReminderDate(...)' to 'setScheduledForDate' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.setReminderDate(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.setScheduledForDate(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setReminderDate'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~setReminderDate~QDate;" name="setScheduledForDate" references="true" stamp="1165522986609" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..3b46fe8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,7 @@
+1165460921218 Move compilation units
+1165461152671 Move compilation units
+1165461200656 Move compilation unit
+1165461226062 Rename package 'org.eclipse.mylar.tasks.core.html'
+1165462200562 Move compilation unit
+1165522905015 Rename method 'getTaskType'
+1165522986609 Rename method 'setReminderDate'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/3/13/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/3/13/refactorings.history
new file mode 100644
index 0000000..21b84eb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Rename compilation unit 'org.eclipse.mylar.internal.bugs.java.fpp.java' to 'JavaStackTraceHyperlinkAdapter.java'" flags="589830" id="org.eclipse.jdt.ui.rename.compilationunit" input="unit://src/org/eclipse/mylar/internal/bugs/java/fpp.java" name="JavaStackTraceHyperlinkAdapter.java" stamp="1143848035235" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/3/13/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/3/13/refactorings.index
new file mode 100644
index 0000000..4061544
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/3/13/refactorings.index
@@ -0,0 +1 @@
+1143848035235 Rename compilation unit 'org.eclipse.mylar.internal.bugs.java.fpp.java' to 'JavaStackTraceHyperlinkAdapter.java'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/6/22/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/6/22/refactorings.history
new file mode 100644
index 0000000..41daa9d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/6/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.bugs.BugzillaReportElement' to 'BugzillaReportInfo' - Original element: 'org.eclipse.mylar.internal.bugs.BugzillaReportElement' - Renamed element: 'org.eclipse.mylar.internal.bugs.BugzillaReportInfo' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaReportElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.bugs{BugzillaReportElement.java[BugzillaReportElement" matchStrategy="1" name="BugzillaReportInfo" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149295676190" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/6/22/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/6/22/refactorings.index
new file mode 100644
index 0000000..f3d0903
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/6/22/refactorings.index
@@ -0,0 +1 @@
+1149295676190 Rename type 'BugzillaReportElement'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..13dc33d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.core.Comment' to 'TaskComment' - Original element: 'org.eclipse.mylar.tasks.core.Comment' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskComment' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'Comment'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.core{Comment.java[Comment" matchStrategy="1" name="TaskComment" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152831477781" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.core.WebRepositoryInfo' to 'RepositoryTemplate' - Original element: 'org.eclipse.mylar.tasks.core.WebRepositoryInfo' - Renamed element: 'org.eclipse.mylar.tasks.core.RepositoryTemplate' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'WebRepositoryInfo'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.core{WebRepositoryInfo.java[WebRepositoryInfo" matchStrategy="1" name="RepositoryTemplate" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1152909003281" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..8565a9e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,2 @@
+1152831477781 Rename type 'Comment'
+1152909003281 Rename type 'WebRepositoryInfo'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..2c6309e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.tasks.core.util' to 'org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.util' - Renamed element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.tasks.core.util'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.tasks.core.util" name="org.eclipse.mylar.internal.tasks.core" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153105897703" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'queryUrl' in 'org.eclipse.mylar.tasks.core.AbstractTaskContainer' to 'url' - Original element: 'org.eclipse.mylar.tasks.core.AbstractTaskContainer.queryUrl' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractTaskContainer.url' - Update references to refactored element - Update textual occurrences in comments and strings - Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'queryUrl'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer^queryUrl" name="url" references="true" setter="true" stamp="1153390688602" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryQuery.getQueryUrl()' to 'getUrl' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryQuery.getQueryUrl()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryQuery.getUrl()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getQueryUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~getQueryUrl" name="getUrl" references="true" stamp="1153390743681" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.core.TrustAll' to 'RepositoryTrustManager' - Original element: 'org.eclipse.mylar.internal.tasks.core.TrustAll' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.RepositoryTrustManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TrustAll'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.core{TrustAll.java[TrustAll" matchStrategy="1" name="RepositoryTrustManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153449550187" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.core.TrustAllSslProtocolSocketFactory' to 'SslProtocolSocketFactory' - Original element: 'org.eclipse.mylar.internal.tasks.core.TrustAllSslProtocolSocketFactory' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.SslProtocolSocketFactory' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TrustAllSslProtocolSocketFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.core{TrustAllSslProtocolSocketFactory.java[TrustAllSslProtocolSocketFactory" matchStrategy="1" name="SslProtocolSocketFactory" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153449563640" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.TaskList.notifyQueryUpdated(AbstractTaskContainer container)' to 'public void notifyContainerUpdated(AbstractTaskContainer container)' - New name: 'notifyContainerUpdated' - Changed parameters: AbstractRepositoryQuery query" delegate="false" deprecate="true" description="Change method 'notifyQueryUpdated'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~notifyQueryUpdated~QAbstractRepositoryQuery;" name="notifyContainerUpdated" parameter1="AbstractRepositoryQuery query 0 AbstractTaskContainer container false" stamp="1153503058089" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..0678f76
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,6 @@
+1153105897703 Rename package 'org.eclipse.mylar.tasks.core.util'
+1153503058089 Change method 'notifyQueryUpdated'
+1153449563640 Rename type 'TrustAllSslProtocolSocketFactory'
+1153449550187 Rename type 'TrustAll'
+1153390743681 Rename method 'getQueryUrl'
+1153390688602 Rename field 'queryUrl'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..94f508b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil.getSslPort(...)' to 'getPort' - Original element: 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil.getSslPort(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil.getPort(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getSslPort'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{UrlConnectionUtil.java[UrlConnectionUtil~getSslPort~QString;" name="getPort" references="true" stamp="1154018801211" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil' to 'WebClientUtil' - Original element: 'org.eclipse.mylar.internal.tasks.core.UrlConnectionUtil' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.WebClientUtil' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'UrlConnectionUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.core{UrlConnectionUtil.java[UrlConnectionUtil" matchStrategy="1" name="WebClientUtil" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154048255625" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..965af27
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1,2 @@
+1154018801211 Rename method 'getSslPort'
+1154048255625 Rename type 'UrlConnectionUtil'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..87b0056
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'ATTR_FILENAME' in 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute' to 'ATTACHMENT_FILENAME' - Original element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.ATTR_FILENAME' - Renamed element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.ATTACHMENT_FILENAME' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTR_FILENAME'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{RepositoryTaskAttribute.java[RepositoryTaskAttribute^ATTR_FILENAME" name="ATTACHMENT_FILENAME" references="true" setter="false" stamp="1154544096119" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..debb68e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1 @@
+1154544096119 Rename field 'ATTR_FILENAME'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/36/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/36/refactorings.history
new file mode 100644
index 0000000..4c1ac41
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/36/refactorings.history
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'public RepositoryTaskData org.eclipse.mylar.tasks.core.IOfflineTaskHandler.downloadTaskData(AbstractRepositoryTask repositoryTask, TaskRepository repository, Proxy proxySettings) throws CoreException, LoginException' to 'public RepositoryTaskData downloadTaskData(AbstractRepositoryTask repositoryTask, TaskRepository repository, Proxy proxySettings) throws CoreException, LoginException' - Original project: 'org.eclipse.mylar.tasks.core' - Changed parameters: Proxy proxy" delegate="false" deprecate="true" description="Change method 'downloadTaskData'" element1="/C:\/Apps\/eclipse-3.2\/plugins\/org.eclipse.equinox.common_3.2.0.v20060603.jar<org.eclipse.core.runtime(CoreException.class[CoreException" element2="/C:\/Program Files\/Java\/jre1.5.0_07\/lib\/rt.jar<javax.security.auth.login(LoginException.class[LoginException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{IOfflineTaskHandler.java[IOfflineTaskHandler~downloadTaskData~QAbstractRepositoryTask;~QTaskRepository;~QProxy;" kind1="0" kind2="0" name="downloadTaskData" parameter1="AbstractRepositoryTask repositoryTask 0 AbstractRepositoryTask repositoryTask false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="Proxy proxy 2 Proxy proxySettings false" stamp="1157671180500" version="1.0"/>
+<refactoring comment="Change method 'public Set<AbstractRepositoryTask> org.eclipse.mylar.tasks.core.IOfflineTaskHandler.getChangedSinceLastSync(TaskRepository repository, Set<AbstractRepositoryTask> tasks, Proxy proxySettings) throws Exception' to 'public Set<AbstractRepositoryTask> getChangedSinceLastSync(TaskRepository repository, Set<AbstractRepositoryTask> tasks, Proxy proxySettings)' - Original project: 'org.eclipse.mylar.tasks.core' - Removed exceptions: Exception" delegate="false" deprecate="true" description="Change method 'getChangedSinceLastSync'" element1="/C:\/Program Files\/Java\/jre1.5.0_07\/lib\/rt.jar<java.lang(Exception.class[Exception" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{IOfflineTaskHandler.java[IOfflineTaskHandler~getChangedSinceLastSync~QTaskRepository;~QSet\<QAbstractRepositoryTask;>;~QProxy;" kind1="2" name="getChangedSinceLastSync" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Set<AbstractRepositoryTask> tasks 1 Set<AbstractRepositoryTask> tasks false" parameter3="Proxy proxySettings 2 Proxy proxySettings false" stamp="1157671241187" version="1.0"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingKey(TaskRepository repository, String id)' to 'public ITask createTaskFromExistingKey(TaskRepository repository, String id, Proxy proxySettings)' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: Proxy proxySettings" default3="null" delegate="false" deprecate="true" description="Change method 'createTaskFromExistingKey'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~createTaskFromExistingKey~QTaskRepository;~QString;" name="createTaskFromExistingKey" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String id 1 String id false" parameter3="Object newParam -1 Proxy proxySettings false" stamp="1157672758125" version="1.0"/>
+<refactoring comment="Change method 'public IStatus org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.performQuery(AbstractRepositoryQuery query, IProgressMonitor monitor, IQueryHitCollector resultCollector)' to 'public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository taskRepository, IProgressMonitor monitor, IQueryHitCollector resultCollector)' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: TaskRepository taskRepository" default2="null" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QIProgressMonitor;~QIQueryHitCollector;" name="performQuery" parameter1="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter2="Object newParam -1 TaskRepository taskRepository false" parameter3="IProgressMonitor monitor 1 IProgressMonitor monitor false" parameter4="IQueryHitCollector resultCollector 2 IQueryHitCollector resultCollector false" stamp="1157672944859" version="1.0"/>
+<refactoring comment="Change method 'public IStatus org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, IQueryHitCollector resultCollector)' to 'public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, IQueryHitCollector resultCollector)' - Original project: 'org.eclipse.mylar.tasks.core' - Changed parameters: TaskRepository taskRepository" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QTaskRepository;~QIProgressMonitor;~QIQueryHitCollector;" name="performQuery" parameter1="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter2="TaskRepository taskRepository 1 TaskRepository repository false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" parameter4="IQueryHitCollector resultCollector 3 IQueryHitCollector resultCollector false" stamp="1157672962812" version="1.0"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingKey(TaskRepository repository, String id, Proxy proxySettings)' to 'public ITask createTaskFromExistingKey(TaskRepository repository, String id, Proxy proxySettings) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Added exceptions: CoreException" delegate="false" deprecate="true" description="Change method 'createTaskFromExistingKey'" element1="/C:\/Apps\/eclipse-3.2\/plugins\/org.eclipse.equinox.common_3.2.0.v20060603.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~createTaskFromExistingKey~QTaskRepository;~QString;~QProxy;" kind1="1" name="createTaskFromExistingKey" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String id 1 String id false" parameter3="Proxy proxySettings 2 Proxy proxySettings false" stamp="1157673398375" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateAttributes(TaskRepository repository, IProgressMonitor monitor)' to 'public void updateAttributes(TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor)' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: Proxy proxySettings" default2="null" delegate="false" deprecate="true" description="Change method 'updateAttributes'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateAttributes~QTaskRepository;~QIProgressMonitor;" name="updateAttributes" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Object newParam -1 Proxy proxySettings false" parameter3="IProgressMonitor monitor 1 IProgressMonitor monitor false" stamp="1157676714718" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateAttributes(TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor)' to 'public void updateAttributes(TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor) throws GeneralSecurityException, IOException' - Original project: 'org.eclipse.mylar.tasks.core' - Added exceptions: GeneralSecurityException IOException" delegate="false" deprecate="true" description="Change method 'updateAttributes'" element1="/C:\/Program Files\/Java\/jre1.5.0_07\/lib\/rt.jar<java.security(GeneralSecurityException.class[GeneralSecurityException" element2="/C:\/Program Files\/Java\/jre1.5.0_07\/lib\/rt.jar<java.io(IOException.class[IOException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateAttributes~QTaskRepository;~QProxy;~QIProgressMonitor;" kind1="1" kind2="1" name="updateAttributes" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Proxy proxySettings 1 Proxy proxySettings false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1157677063328" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateAttributes(TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor) throws GeneralSecurityException, IOException' to 'public void updateAttributes(TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.core' - Added exceptions: CoreException - Removed exceptions: GeneralSecurityException IOException" delegate="false" deprecate="true" description="Change method 'updateAttributes'" element1="/C:\/Program Files\/Java\/jre1.5.0_07\/lib\/rt.jar<java.security(GeneralSecurityException.class[GeneralSecurityException" element2="/C:\/Program Files\/Java\/jre1.5.0_07\/lib\/rt.jar<java.io(IOException.class[IOException" element3="/C:\/Apps\/eclipse-3.2\/plugins\/org.eclipse.equinox.common_3.2.0.v20060603.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateAttributes~QTaskRepository;~QProxy;~QIProgressMonitor;" kind1="2" kind2="2" kind3="1" name="updateAttributes" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="Proxy proxySettings 1 Proxy proxySettings false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1157677104765" version="1.0"/>
+<refactoring comment="Change method 'public IStatus org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.performQuery(AbstractRepositoryQuery query, TaskRepository repository, IProgressMonitor monitor, IQueryHitCollector resultCollector)' to 'public IStatus performQuery(AbstractRepositoryQuery query, TaskRepository repository, Proxy proxySettings, IProgressMonitor monitor, IQueryHitCollector resultCollector)' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: Proxy proxySettings" default3="0" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QTaskRepository;~QIProgressMonitor;~QIQueryHitCollector;" name="performQuery" parameter1="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="Object newParam -1 Proxy proxySettings false" parameter4="IProgressMonitor monitor 2 IProgressMonitor monitor false" parameter5="IQueryHitCollector resultCollector 3 IQueryHitCollector resultCollector false" stamp="1157679297578" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.core.BugzillaResultCollector' to 'QueryHitCollector' - Original element: 'org.eclipse.mylar.tasks.core.BugzillaResultCollector' - Renamed element: 'org.eclipse.mylar.tasks.core.QueryHitCollector' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaResultCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.core{BugzillaResultCollector.java[BugzillaResultCollector" matchStrategy="1" name="QueryHitCollector" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1157759743531" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.core.AbstractQueryHitCollector' to 'QueryHitCollector' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHitCollector' - Renamed element: 'org.eclipse.mylar.tasks.core.QueryHitCollector' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'AbstractQueryHitCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.core{AbstractQueryHitCollector.java[AbstractQueryHitCollector" matchStrategy="1" name="QueryHitCollector" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1157759929609" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/36/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/36/refactorings.index
new file mode 100644
index 0000000..20a5d40
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/36/refactorings.index
@@ -0,0 +1,12 @@
+1157671180500 Change method 'downloadTaskData'
+1157759929609 Rename type 'AbstractQueryHitCollector'
+1157759743531 Rename type 'BugzillaResultCollector'
+1157671241187 Change method 'getChangedSinceLastSync'
+1157672758125 Change method 'createTaskFromExistingKey'
+1157672944859 Change method 'performQuery'
+1157672962812 Change method 'performQuery'
+1157673398375 Change method 'createTaskFromExistingKey'
+1157676714718 Change method 'updateAttributes'
+1157677063328 Change method 'updateAttributes'
+1157677104765 Change method 'updateAttributes'
+1157679297578 Change method 'performQuery'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/37/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/37/refactorings.history
new file mode 100644
index 0000000..ccaa9a9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.QueryHitCollector.getResults()' to 'getHits' - Original element: 'org.eclipse.mylar.tasks.core.QueryHitCollector.getResults()' - Renamed element: 'org.eclipse.mylar.tasks.core.QueryHitCollector.getHits()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getResults'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{QueryHitCollector.java[QueryHitCollector~getResults" name="getHits" references="true" stamp="1157931543046" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/37/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/37/refactorings.index
new file mode 100644
index 0000000..b4296f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/37/refactorings.index
@@ -0,0 +1 @@
+1157931543046 Rename method 'getResults'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..f9fb2fc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.setModifiedDateStamp(...)' to 'setLastSyncDateStamp' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.setModifiedDateStamp(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.setLastSyncDateStamp(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setModifiedDateStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~setModifiedDateStamp~QString;" name="setLastSyncDateStamp" references="true" stamp="1158616534859" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getLastModifiedDateStamp()' to 'getLastSyncDateStamp' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getLastModifiedDateStamp()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getLastSyncDateStamp()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getLastModifiedDateStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~getLastModifiedDateStamp" name="getLastSyncDateStamp" references="true" stamp="1158618547640" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.WebClientUtil.getUrlConnection(...)' to 'openUrlConnection' - Original element: 'org.eclipse.mylar.internal.tasks.core.WebClientUtil.getUrlConnection(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.WebClientUtil.openUrlConnection(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getUrlConnection'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{WebClientUtil.java[WebClientUtil~getUrlConnection~QURL;~QProxy;~Z" name="openUrlConnection" references="true" stamp="1158626765500" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..4097e72
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1,3 @@
+1158616534859 Rename method 'setModifiedDateStamp'
+1158626765500 Rename method 'getUrlConnection'
+1158618547640 Rename method 'getLastModifiedDateStamp'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/2/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/2/refactorings.history
new file mode 100644
index 0000000..d9e918b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/2/refactorings.history
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.MylarMessages.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.tasks.core{MylarMessages.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1168536788500" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.core.ITaskStatus' to 'IMylarStatusConstants' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITaskStatus' - Renamed element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.core{ITaskStatus.java[ITaskStatus" matchStrategy="1" name="IMylarStatusConstants" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1168537327562" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskStatus.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.tasks.core{TaskStatus.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1168537826500" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.core.TaskStatus' to 'MylarStatus' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskStatus' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.MylarStatus' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.core{TaskStatus.java[TaskStatus" matchStrategy="1" name="MylarStatus" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1168537933968" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.tasks.core{IMylarStatusConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1168540264296" units="1" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.core/src/org/eclipse/mylar/internal/tasks/core/messages.properties' to 'MylarMessages.properties' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'messages.properties'" description="Rename resource 'messages.properties'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="src/org/eclipse/mylar/internal/tasks/core/messages.properties" name="MylarMessages.properties" stamp="1168540351781" version="1.0"/>
+<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original elements: org.eclipse.mylar.internal.tasks.core.MylarStatus.java org.eclipse.mylar.internal.tasks.core.MylarMessages.java org.eclipse.mylar.internal.tasks.core.IMylarStatusConstants.java MylarMessages.properties - Update references to refactored element" description="Move elements" destination="/src<org.eclipse.mylar.tasks.core" element1="src/org/eclipse/mylar/internal/tasks/core/MylarMessages.properties" element2="/src<org.eclipse.mylar.internal.tasks.core{MylarStatus.java" element3="/src<org.eclipse.mylar.internal.tasks.core{MylarMessages.java" element4="/src<org.eclipse.mylar.internal.tasks.core{IMylarStatusConstants.java" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1168542260390" units="3" version="1.0"/>
+<refactoring comment="Rename field 'NETWORK_ERROR' in 'org.eclipse.mylar.tasks.core.IMylarStatusConstants' to 'IO_ERROR' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.NETWORK_ERROR' - Renamed element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.IO_ERROR' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'NETWORK_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^NETWORK_ERROR" name="IO_ERROR" references="true" setter="false" stamp="1168544531375" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'network_error' in 'org.eclipse.mylar.tasks.core.MylarMessages' to 'io_error' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.MylarMessages.network_error' - Renamed element: 'org.eclipse.mylar.tasks.core.MylarMessages.io_error' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'network_error'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{MylarMessages.java[MylarMessages^network_error" name="io_error" references="true" setter="false" stamp="1168544557500" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_COMMENT_REQUIRED' in 'org.eclipse.mylar.tasks.core.IMylarStatusConstants' to 'COMMENT_REQUIRED' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.REPOSITORY_COMMENT_REQUIRED' - Renamed element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.COMMENT_REQUIRED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_COMMENT_REQUIRED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^REPOSITORY_COMMENT_REQUIRED" name="COMMENT_REQUIRED" references="true" setter="false" stamp="1168549961640" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'comment_required' in 'org.eclipse.mylar.tasks.core.MylarMessages' to 'operation_comment_reqd' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.MylarMessages.comment_required' - Renamed element: 'org.eclipse.mylar.tasks.core.MylarMessages.operation_comment_reqd' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'comment_required'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{MylarMessages.java[MylarMessages^comment_required" name="operation_comment_reqd" references="true" setter="false" stamp="1168712712468" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'COMMENT_REQUIRED' in 'org.eclipse.mylar.tasks.core.IMylarStatusConstants' to 'REPOSITORY_COMMENT_REQD' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.COMMENT_REQUIRED' - Renamed element: 'org.eclipse.mylar.tasks.core.IMylarStatusConstants.REPOSITORY_COMMENT_REQD' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'COMMENT_REQUIRED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^COMMENT_REQUIRED" name="REPOSITORY_COMMENT_REQD" references="true" setter="false" stamp="1168720407066" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/2/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/2/refactorings.index
new file mode 100644
index 0000000..21b11f3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/2/refactorings.index
@@ -0,0 +1,12 @@
+1168536788500 Move compilation unit
+1168537327562 Rename type 'ITaskStatus'
+1168537826500 Move compilation unit
+1168537933968 Rename type 'TaskStatus'
+1168540264296 Move compilation unit
+1168540351781 Rename resource 'messages.properties'
+1168542260390 Move elements
+1168544531375 Rename field 'NETWORK_ERROR'
+1168544557500 Rename field 'network_error'
+1168549961640 Rename field 'REPOSITORY_COMMENT_REQUIRED'
+1168712712468 Rename field 'comment_required'
+1168720407066 Rename field 'COMMENT_REQUIRED'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..40b41aa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.core.TaskRepository.KIND_UNKNOWN' from expression '"<unknown>"' - Original project: 'org.eclipse.mylar.tasks.core' - Constant name: 'KIND_UNKNOWN' - Constant expression: '"<unknown>"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'KIND_UNKNOWN'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.core{TaskRepository.java" name="KIND_UNKNOWN" qualify="false" replace="true" selection="10088 11" stamp="1169061235030" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..123a6c0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1 @@
+1169061235030 Extract constant 'KIND_UNKNOWN'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..4c77513
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 2 elements(s) to 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.monitor.usage/src/org.eclipse.mylar.internal.monitor.usage' - Original elements: org.eclipse.mylar.tasks.core.web.HtmlStreamTokenizer.java org.eclipse.mylar.tasks.core.web.HtmlTag.java" description="Copy compilation units" destination="/src<org.eclipse.mylar.internal.monitor.usage" element1="/src<org.eclipse.mylar.tasks.core.web{HtmlStreamTokenizer.java" element2="/src<org.eclipse.mylar.tasks.core.web{HtmlTag.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.tasks.core.web{HtmlTag.java	true	false /src<org.eclipse.mylar.tasks.core.web{HtmlStreamTokenizer.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1169681386834" units="2" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..233b3fa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1 @@
+1169681386834 Copy compilation units
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/5/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/5/refactorings.history
new file mode 100644
index 0000000..998673b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/5/refactorings.history
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.put(...)' to 'saveIncoming' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.put(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.saveIncoming(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'put'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~put~QRepositoryTaskData;" name="saveIncoming" references="true" stamp="1170114119515" version="1.0"/>
+<refactoring comment="Rename field 'oldTaskDataMap' in 'org.eclipse.mylar.internal.tasks.core.TaskDataManager' to 'incomingTaskDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.oldTaskDataMap' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.incomingTaskDataMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'oldTaskDataMap'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager^oldTaskDataMap" name="incomingTaskDataMap" references="true" setter="false" stamp="1170122277687" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'newTaskDataMap' in 'org.eclipse.mylar.internal.tasks.core.TaskDataManager' to 'outgoingTaskDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.newTaskDataMap' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.outgoingTaskDataMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'newTaskDataMap'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager^newTaskDataMap" name="outgoingTaskDataMap" references="true" setter="false" stamp="1170122289937" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'unsubmittedTaskData' in 'org.eclipse.mylar.internal.tasks.core.TaskDataManager' to 'newTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.unsubmittedTaskData' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.newTaskData' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'unsubmittedTaskData'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager^unsubmittedTaskData" name="newTaskData" references="true" setter="false" stamp="1170122307000" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldDataMap()' to 'getIncomingDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldDataMap()' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getIncomingDataMap()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldDataMap'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getOldDataMap" name="getIncomingDataMap" references="true" stamp="1170122329890" version="1.0"/>
+<refactoring comment="Rename field 'incomingTaskDataMap' in 'org.eclipse.mylar.internal.tasks.core.TaskDataManager' to 'synchronizedTaskDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.incomingTaskDataMap' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.synchronizedTaskDataMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'incomingTaskDataMap'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager^incomingTaskDataMap" name="synchronizedTaskDataMap" references="true" setter="false" stamp="1170122374515" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getNewDataMap()' to 'getOutgoingDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getNewDataMap()' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOutgoingDataMap()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNewDataMap'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getNewDataMap" name="getOutgoingDataMap" references="true" stamp="1170122403390" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getUnsubmittedTaskData()' to 'getNewTaskDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getUnsubmittedTaskData()' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getNewTaskDataMap()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUnsubmittedTaskData'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getUnsubmittedTaskData" name="getNewTaskDataMap" references="true" stamp="1170122421734" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.discardNewTaskData(...)' to 'discardOutgoingTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.discardNewTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.discardOutgoingTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'discardNewTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~discardNewTaskData~QString;" name="discardOutgoingTaskData" references="true" stamp="1170122546375" version="1.0"/>
+<refactoring comment="Rename field 'synchronizedTaskDataMap' in 'org.eclipse.mylar.internal.tasks.core.TaskDataManager' to 'incomingTaskDataMap' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.synchronizedTaskDataMap' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.incomingTaskDataMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'synchronizedTaskDataMap'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager^synchronizedTaskDataMap" name="incomingTaskDataMap" references="true" setter="false" stamp="1170174051000" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.putUnsubmitted(...)' to 'saveUnsubmitted' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.putUnsubmitted(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.saveUnsubmitted(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'putUnsubmitted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~putUnsubmitted~QRepositoryTaskData;" name="saveUnsubmitted" references="true" stamp="1170174120437" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.saveUnsubmitted(...)' to 'saveNewData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.saveUnsubmitted(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.saveNewData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveUnsubmitted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~saveUnsubmitted~QRepositoryTaskData;" name="saveNewData" references="true" stamp="1170174153718" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getUnsubmitted()' to 'getNewData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getUnsubmitted()' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getNewData()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUnsubmitted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getUnsubmitted" name="getNewData" references="true" stamp="1170174161796" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.removeUnsubmitted(...)' to 'removeNewData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.removeUnsubmitted(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.removeNewData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'removeUnsubmitted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~removeUnsubmitted~QString;" name="removeNewData" references="true" stamp="1170174174156" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' to 'getIncomingData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getIncomingData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getOldTaskData~QString;" name="getIncomingData" references="true" stamp="1170174263046" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' to 'getIncomingData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getIncomingData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getOldTaskData~QString;~QString;" name="getIncomingData" references="true" stamp="1170174271765" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' to 'getOutgoingData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOutgoingData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getTaskData~QString;" name="getOutgoingData" references="true" stamp="1170174314093" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' to 'getOutgoingData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOutgoingData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getTaskData~QString;~QString;" name="getOutgoingData" references="true" stamp="1170174357062" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/5/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/5/refactorings.index
new file mode 100644
index 0000000..dc482d7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/1/5/refactorings.index
@@ -0,0 +1,18 @@
+1170114119515 Rename method 'put'
+1170122277687 Rename field 'oldTaskDataMap'
+1170122289937 Rename field 'newTaskDataMap'
+1170122307000 Rename field 'unsubmittedTaskData'
+1170122329890 Rename method 'getOldDataMap'
+1170122374515 Rename field 'incomingTaskDataMap'
+1170122403390 Rename method 'getNewDataMap'
+1170122421734 Rename method 'getUnsubmittedTaskData'
+1170122546375 Rename method 'discardNewTaskData'
+1170174051000 Rename field 'synchronizedTaskDataMap'
+1170174120437 Rename method 'putUnsubmitted'
+1170174153718 Rename method 'saveUnsubmitted'
+1170174161796 Rename method 'getUnsubmitted'
+1170174174156 Rename method 'removeUnsubmitted'
+1170174263046 Rename method 'getOldTaskData'
+1170174271765 Rename method 'getOldTaskData'
+1170174314093 Rename method 'getTaskData'
+1170174357062 Rename method 'getTaskData'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/49/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/49/refactorings.history
new file mode 100644
index 0000000..8ceac09
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/49/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UnfiledCategory.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{UnfiledCategory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1196888061065" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.OrphanedTasks' to 'OrphanedTasksContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.OrphanedTasks'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.OrphanedTasksContainer'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in '*.xml, *.xsd' files
- Update textual occurrences in comments and strings" description="Rename type 'OrphanedTasks'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{OrphanedTasks.java[OrphanedTasks" matchStrategy="1" name="OrphanedTasksContainer" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1196889544235" textual="false" version="1.0"/>
<refactoring comment="Rename field 'orphanedTaskContainers' in 'org.eclipse.mylyn.tasks.core.TaskList' to 'repositoryOrphansMap'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.orphanedTaskContainers'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.repositoryOrphansMap'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'orphanedTaskContainers'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList^orphanedTaskContainers" name="repositoryOrphansMap" references="true" setter="false" stamp="1196902163343" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.getOrphanedContainer(...)' to 'getOrphanContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.getOrphanedContainer(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.getOrphanContainer(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOrphanedContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~getOrphanedContainer~QString;" name="getOrphanContainer" references="true" stamp="1196916697413" version="1.0"/>
<refactoring comment="Rename field 'REPOSITORY_KIND' in 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector' to 'CONNECTOR_KIND'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.REPOSITORY_KIND'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.CONNECTOR_KIND'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_KIND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{LocalRepositoryConnector.java[LocalRepositoryConnector^REPOSITORY_KIND" name="CONNECTOR_KIND" references="true" setter="false" stamp="1196923680591" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/49/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/49/refactorings.index
new file mode 100644
index 0000000..118e94d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/49/refactorings.index
@@ -0,0 +1,5 @@
+1196888061065 Copy compilation unit
+1196889544235 Rename type 'OrphanedTasks'
+1196902163343 Rename field 'orphanedTaskContainers'
+1196916697413 Rename method 'getOrphanedContainer'
+1196923680591 Rename field 'REPOSITORY_KIND'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/50/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/50/refactorings.history
new file mode 100644
index 0000000..874f967
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/50/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.core.TaskList.MAX_ORPHAN_DEPTH' from expression '10'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'MAX_ORPHAN_DEPTH'
- Constant expression: '10'
- Declared visibility: 'private'" description="Extract constant 'MAX_ORPHAN_DEPTH'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java" name="MAX_ORPHAN_DEPTH" qualify="false" replace="false" selection="3215 2" stamp="1197444181049" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'MAX_ORPHAN_DEPTH' in 'org.eclipse.mylyn.tasks.core.TaskList' to 'MAX_SUBTASK_DEPTH'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.MAX_ORPHAN_DEPTH'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.MAX_SUBTASK_DEPTH'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MAX_ORPHAN_DEPTH'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList^MAX_ORPHAN_DEPTH" name="MAX_SUBTASK_DEPTH" references="true" setter="false" stamp="1197481653716" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/50/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/50/refactorings.index
new file mode 100644
index 0000000..9475009
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/12/50/refactorings.index
@@ -0,0 +1,2 @@
+1197444181049 Extract constant 'MAX_ORPHAN_DEPTH'
+1197481653716 Rename field 'MAX_ORPHAN_DEPTH'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..3d59703
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.put(...)' to 'push' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.put(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.push(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'put'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~put~QRepositoryTaskData;" name="push" references="true" stamp="1170351519375" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..cc3fca4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1 @@
+1170351519375 Rename method 'put'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..b2e042a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' to 'getRepositoryTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getRepositoryTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getTaskData~QString;" name="getRepositoryTaskData" references="true" stamp="1170609325171" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' to 'getRepsitoryTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getRepsitoryTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getTaskData~QString;~QString;" name="getRepsitoryTaskData" references="true" stamp="1170609346687" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' to 'getOldRepositoryTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldRepositoryTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getOldTaskData~QString;" name="getOldRepositoryTaskData" references="true" stamp="1170609373843" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' to 'getOldRepositoryTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldRepositoryTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getOldTaskData~QString;~QString;" name="getOldRepositoryTaskData" references="true" stamp="1170609387765" version="1.0"/>
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original elements: org.eclipse.mylar.tasks.core.web.HtmlStreamTokenizer.java org.eclipse.mylar.tasks.core.web.HtmlTag.java" description="Delete elements" element1="/src<org.eclipse.mylar.tasks.core.web{HtmlStreamTokenizer.java" element2="/src<org.eclipse.mylar.tasks.core.web{HtmlTag.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170815709894" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original element: 'org.eclipse.mylar.internal.tasks.core.SslProtocolSocketFactory.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core.net" element1="/src<org.eclipse.mylar.internal.tasks.core{SslProtocolSocketFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170825835761" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original element: 'org.eclipse.mylar.tasks.core.web.WebClientUtil.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.core.net" element1="/src<org.eclipse.mylar.tasks.core.web{WebClientUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170826070432" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original element: 'org.eclipse.mylar.internal.tasks.core.AuthenticatedProxy.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core.net" element1="/src<org.eclipse.mylar.internal.tasks.core{AuthenticatedProxy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170826202188" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Original element: 'org.eclipse.mylar.internal.tasks.core.RepositoryTrustManager.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core.net" element1="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTrustManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170826389171" units="1" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getHandle(...)' to 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getHandle(...)' - Destination type: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil'" delegate="false" deprecate="true" description="Move member 'getHandle'" element1="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~getHandle~QString;~I" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTaskHandleUtil.java[RepositoryTaskHandleUtil" stamp="1171076236550" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getHandle(...)' to 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getHandle(...)' - Destination type: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil'" delegate="false" deprecate="true" description="Move member 'getHandle'" element1="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~getHandle~QString;~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTaskHandleUtil.java[RepositoryTaskHandleUtil" stamp="1171076356720" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getRepositoryUrl(...)' to 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getRepositoryUrl(...)' - Destination type: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil'" delegate="false" deprecate="true" description="Move member 'getRepositoryUrl'" element1="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~getRepositoryUrl~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTaskHandleUtil.java[RepositoryTaskHandleUtil" stamp="1171076547638" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.HANDLE_DELIM' to 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.HANDLE_DELIM' - Destination type: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil'" delegate="false" deprecate="true" description="Move member 'HANDLE_DELIM'" element1="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask^HANDLE_DELIM" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTaskHandleUtil.java[RepositoryTaskHandleUtil" stamp="1171077035062" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getTaskId(...)' to 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getTaskId(...)' - Destination type: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil'" delegate="false" deprecate="true" description="Move member 'getTaskId'" element1="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~getTaskId~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTaskHandleUtil.java[RepositoryTaskHandleUtil" stamp="1171077141526" version="1.0"/>
+<refactoring comment="Rename field 'MISSING_REPOSITORY_HANDLE' in 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil' to 'MISSING_REPOSITORY' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil.MISSING_REPOSITORY_HANDLE' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.RepositoryTaskHandleUtil.MISSING_REPOSITORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MISSING_REPOSITORY_HANDLE'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.core{RepositoryTaskHandleUtil.java[RepositoryTaskHandleUtil^MISSING_REPOSITORY_HANDLE" name="MISSING_REPOSITORY" references="true" setter="false" stamp="1171077229610" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'url' in 'org.eclipse.mylar.tasks.core.Task' to 'taskUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.Task.url' - Renamed element: 'org.eclipse.mylar.tasks.core.Task.taskUrl' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'url'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{Task.java[Task^url" name="taskUrl" references="true" setter="false" stamp="1171078206039" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.setUrl(...)' to 'setTaskUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.setUrl(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.setTaskUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~setUrl~QString;" name="setTaskUrl" references="true" stamp="1171078309994" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.getUrl()' to 'getTaskUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.getUrl()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.getTaskUrl()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~getUrl" name="getTaskUrl" references="true" stamp="1171078364246" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getIdLabel()' to 'getIdentifyingLabel' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getIdLabel()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryTask.getIdentifyingLabel()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getIdLabel'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask~getIdLabel" name="getIdentifyingLabel" references="true" stamp="1171078530694" version="1.0"/>
+<refactoring comment="Rename local variable 'oldUrl' in 'org.eclipse.mylar.tasks.core.TaskList.refactorRepositoryUrl(...)' to 'oldRepositoryUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.refactorRepositoryUrl(String, String).oldUrl' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.refactorRepositoryUrl(String, String).oldRepositoryUrl' - Update references to refactored element" description="Rename local variable 'oldUrl'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasks.core{TaskList.java" name="oldRepositoryUrl" references="true" selection="2905 6" stamp="1171079526936" version="1.0"/>
+<refactoring comment="Rename local variable 'newUrl' in 'org.eclipse.mylar.tasks.core.TaskList.refactorRepositoryUrl(...)' to 'newRepositoryUrl' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.refactorRepositoryUrl(String, String).newUrl' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.refactorRepositoryUrl(String, String).newRepositoryUrl' - Update references to refactored element" description="Rename local variable 'newUrl'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasks.core{TaskList.java" name="newRepositoryUrl" references="true" selection="2930 6" stamp="1171079532514" version="1.0"/>
+<refactoring comment="Rename field 'id' in 'org.eclipse.mylar.tasks.core.AbstractQueryHit' to 'taskId' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.id' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.taskId' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'id'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java[AbstractQueryHit^id" name="taskId" references="true" setter="false" stamp="1171081266304" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractQueryHit.getId()' to 'getTaskId' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.getId()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.getTaskId()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java[AbstractQueryHit~getId" name="getTaskId" references="true" stamp="1171081290128" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..e3de73f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,23 @@
+1170609325171 Rename method 'getTaskData'
+1170609346687 Rename method 'getTaskData'
+1170609373843 Rename method 'getOldTaskData'
+1170609387765 Rename method 'getOldTaskData'
+1170815709894 Delete elements
+1170825835761 Move compilation unit
+1170826070432 Move compilation unit
+1170826202188 Move compilation unit
+1170826389171 Move compilation unit
+1171076236550 Move member 'getHandle'
+1171076356720 Move member 'getHandle'
+1171076547638 Move member 'getRepositoryUrl'
+1171077035062 Move member 'HANDLE_DELIM'
+1171077141526 Move member 'getTaskId'
+1171077229610 Rename field 'MISSING_REPOSITORY_HANDLE'
+1171078206039 Rename field 'url'
+1171078309994 Rename method 'setUrl'
+1171078364246 Rename method 'getUrl'
+1171078530694 Rename method 'getIdLabel'
+1171079526936 Rename local variable 'oldUrl'
+1171079532514 Rename local variable 'newUrl'
+1171081266304 Rename field 'id'
+1171081290128 Rename method 'getId'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..f98a1a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void readLegacyHandleFormat(ITask task,Element element) throws TaskExternalizationException ' from 'org.eclipse.mylar.tasks.core.DelegatingTaskExternalizer.readTaskInfo()' to 'org.eclipse.mylar.tasks.core.DelegatingTaskExternalizer' - Original project: 'org.eclipse.mylar.tasks.core' - Method name: 'readLegacyHandleFormat' - Destination type: 'org.eclipse.mylar.tasks.core.DelegatingTaskExternalizer' - Declared visibility: 'private'" comments="false" description="Extract method 'readLegacyHandleFormat'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.core{DelegatingTaskExternalizer.java" name="readLegacyHandleFormat" replace="false" selection="10208 802" stamp="1171331408293" version="1.0" visibility="2"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.ITaskListExternalizer.createTask(Node node, TaskList tlist, AbstractTaskContainer category, ITask parent) throws TaskExternalizationException' to 'public ITask createTask(String taskId, String repositoryUrl, Node node, TaskList tlist, AbstractTaskContainer category, ITask parent) throws TaskExternalizationException' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: String taskId String repositoryUrl" default1="null" default2="null" delegate="false" deprecate="true" description="Change method 'createTask'" element1="/src<org.eclipse.mylar.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer~createTask~QNode;~QTaskList;~QAbstractTaskContainer;~QITask;" kind1="0" name="createTask" parameter1=" -1 String taskId false" parameter2=" -1 String repositoryUrl false" parameter3="Node node 0 Node node false" parameter4="TaskList tlist 1 TaskList tlist false" parameter5="AbstractTaskContainer category 2 AbstractTaskContainer category false" parameter6="ITask parent 3 ITask parent false" stamp="1171343430763" version="1.0"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.ITaskListExternalizer.createTask(String repositoryUrl, String taskId, Element element, TaskList tlist, AbstractTaskContainer category, ITask parent) throws TaskExternalizationException' to 'public ITask createTask(String repositoryUrl, String taskId, Element element, TaskList tlist, AbstractTaskContainer category, ITask parent) throws TaskExternalizationException' - Original project: 'org.eclipse.mylar.tasks.core'" delegate="false" deprecate="true" description="Change method 'createTask'" element1="/src<org.eclipse.mylar.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer~createTask~QString;~QString;~QElement;~QTaskList;~QAbstractTaskContainer;~QITask;" kind1="0" name="createTask" parameter1="String repositoryUrl 1 String repositoryUrl false" parameter2="String taskId 0 String taskId false" parameter3="Element element 2 Element element false" parameter4="TaskList tlist 3 TaskList tlist false" parameter5="AbstractTaskContainer category 4 AbstractTaskContainer category false" parameter6="ITask parent 5 ITask parent false" stamp="1171346095937" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.tasks.core.ITaskListExternalizer.readQueryHit(Element element, TaskList tlist, AbstractRepositoryQuery query) throws TaskExternalizationException' to 'public void readQueryHit(Element element, TaskList tlist, AbstractRepositoryQuery query) throws TaskExternalizationException' - Original project: 'org.eclipse.mylar.tasks.core' - Changed parameters: Node node" delegate="false" deprecate="true" description="Change method 'readQueryHit'" element1="/src<org.eclipse.mylar.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer~readQueryHit~QNode;~QTaskList;~QAbstractRepositoryQuery;" kind1="0" name="readQueryHit" parameter1="Node node 0 Element element false" parameter2="TaskList tlist 1 TaskList tlist false" parameter3="AbstractRepositoryQuery query 2 AbstractRepositoryQuery query false" stamp="1171346809166" version="1.0"/>
+<refactoring comment="Rename field 'description' in 'org.eclipse.mylar.tasks.core.AbstractQueryHit' to 'summary' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.description' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.summary' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'description'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java[AbstractQueryHit^description" name="summary" references="true" setter="false" stamp="1171347888236" textual="true" version="1.0"/>
+<refactoring comment="Change method 'public AbstractQueryHit org.eclipse.mylar.tasks.core.ITaskListExternalizer.createQueryHit(Element element, TaskList tlist, AbstractRepositoryQuery query) throws TaskExternalizationException' to 'public AbstractQueryHit createQueryHit(String repositoryUrl, String taskId, Element element, TaskList tlist, AbstractRepositoryQuery query) throws TaskExternalizationException' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: String repositoryUrl String taskId" default1="null" default2="null" delegate="false" deprecate="true" description="Change method 'createQueryHit'" element1="/src<org.eclipse.mylar.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer~createQueryHit~QElement;~QTaskList;~QAbstractRepositoryQuery;" kind1="0" name="createQueryHit" parameter1=" -1 String repositoryUrl false" parameter2=" -1 String taskId false" parameter3="Element element 0 Element element false" parameter4="TaskList tlist 1 TaskList tlist false" parameter5="AbstractRepositoryQuery query 2 AbstractRepositoryQuery query false" stamp="1171404658031" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractQueryHit.setDescription(...)' to 'setSummary' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.setDescription(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.setSummary(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java[AbstractQueryHit~setDescription~QString;" name="setSummary" references="true" stamp="1171405186125" version="1.0"/>
+<refactoring comment="Change method 'public AbstractQueryHit org.eclipse.mylar.tasks.core.ITaskListExternalizer.createQueryHit(String repositoryUrl, String taskId, Element element, TaskList tlist, AbstractRepositoryQuery query) throws TaskExternalizationException' to 'public AbstractQueryHit createQueryHit(String repositoryUrl, String taskId, String summary, Element element, TaskList tlist, AbstractRepositoryQuery query) throws TaskExternalizationException' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: String summary" default3="null" delegate="false" deprecate="true" description="Change method 'createQueryHit'" element1="/src<org.eclipse.mylar.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer~createQueryHit~QString;~QString;~QElement;~QTaskList;~QAbstractRepositoryQuery;" kind1="0" name="createQueryHit" parameter1="String repositoryUrl 0 String repositoryUrl false" parameter2="String taskId 1 String taskId false" parameter3=" -1 String summary false" parameter4="Element element 2 Element element false" parameter5="TaskList tlist 3 TaskList tlist false" parameter6="AbstractRepositoryQuery query 4 AbstractRepositoryQuery query false" stamp="1171405332803" version="1.0"/>
+<refactoring comment="Change method 'public ITask org.eclipse.mylar.tasks.core.ITaskListExternalizer.createTask(String repositoryUrl, String taskId, Element element, TaskList tlist, AbstractTaskContainer category, ITask parent) throws TaskExternalizationException' to 'public ITask createTask(String repositoryUrl, String taskId, String summary, Element element, TaskList tlist, AbstractTaskContainer category, ITask parent) throws TaskExternalizationException' - Original project: 'org.eclipse.mylar.tasks.core' - Added parameters: String summary" default3="null" delegate="false" deprecate="true" description="Change method 'createTask'" element1="/src<org.eclipse.mylar.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer~createTask~QString;~QString;~QElement;~QTaskList;~QAbstractTaskContainer;~QITask;" kind1="0" name="createTask" parameter1="String repositoryUrl 0 String repositoryUrl false" parameter2="String taskId 1 String taskId false" parameter3=" -1 String summary false" parameter4="Element element 2 Element element false" parameter5="TaskList tlist 3 TaskList tlist false" parameter6="AbstractTaskContainer category 4 AbstractTaskContainer category false" parameter7="ITask parent 5 ITask parent false" stamp="1171405728692" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractQueryHit.getIdLabel()' to 'getIdentifyingLabel' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.getIdLabel()' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.getIdentifyingLabel()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getIdLabel'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java[AbstractQueryHit~getIdLabel" name="getIdentifyingLabel" references="true" stamp="1171473699497" version="1.0"/>
+
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..5e85f8d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1,10 @@
+1171331408293 Extract method 'readLegacyHandleFormat'
+1171343430763 Change method 'createTask'
+1171346095937 Change method 'createTask'
+1171346809166 Change method 'readQueryHit'
+1171347888236 Rename field 'description'
+1171404658031 Change method 'createQueryHit'
+1171405186125 Rename method 'setDescription'
+1171405332803 Change method 'createQueryHit'
+1171405728692 Change method 'createTask'
+1171473699497 Rename method 'getIdLabel'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..29401df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.tasks.core.RepositoryTaskData.DEFAULT_TASK_KIND' to 'org.eclipse.mylar.tasks.core.Task' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.RepositoryTaskData.DEFAULT_TASK_KIND' - Destination type: 'org.eclipse.mylar.tasks.core.Task'" delegate="false" deprecate="false" description="Move member 'DEFAULT_TASK_KIND'" element1="/src<org.eclipse.mylar.tasks.core{RepositoryTaskData.java[RepositoryTaskData^DEFAULT_TASK_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.tasks.core{Task.java[Task" stamp="1172018218343" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.getDueData()' to 'getDueDate' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.getDueData()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.getDueDate()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDueData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~getDueData" name="getDueDate" references="true" stamp="1172082225484" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'Task.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/tasks/core/Task.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1172190680083" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..bd5fdb5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,3 @@
+1172018218343 Move member 'DEFAULT_TASK_KIND'
+1172082225484 Rename method 'getDueData'
+1172190680083 Delete element
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..51cf349
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'AbstractRepositoryConnector.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/tasks/core/AbstractRepositoryConnector.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1174269134328" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.NUM_CHANGES_BEFORE_SAVE' from expression '10' - Original project: 'org.eclipse.mylar.tasks.core' - Constant name: 'NUM_CHANGES_BEFORE_SAVE' - Constant expression: '10' - Declared visibility: 'private'" description="Extract constant 'NUM_CHANGES_BEFORE_SAVE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java" name="NUM_CHANGES_BEFORE_SAVE" qualify="false" replace="false" selection="10329 2" stamp="1174527290828" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..4e4ea9d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1,2 @@
+1174269134328 Delete element
+1174527290828 Extract constant 'NUM_CHANGES_BEFORE_SAVE'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..f4597e8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.getID()' to 'getId' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.getID()' - Renamed element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.getId()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getID'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{RepositoryTaskAttribute.java[RepositoryTaskAttribute~getID" name="getId" references="true" stamp="1174936223781" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.getId()' to 'getID' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.getId()' - Renamed element: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute.getID()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{RepositoryTaskAttribute.java[RepositoryTaskAttribute~getId" name="getID" references="true" stamp="1174959871937" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..bc663c3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1,2 @@
+1174936223781 Rename method 'getID'
+1174959871937 Rename method 'getId'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/14/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/14/refactorings.history
new file mode 100644
index 0000000..e3a6f35
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.Activator.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.core{Activator.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1175792055078" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/14/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/14/refactorings.index
new file mode 100644
index 0000000..b87f6cd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/14/refactorings.index
@@ -0,0 +1 @@
+1175792055078 Delete element
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/16/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/16/refactorings.history
new file mode 100644
index 0000000..67fb85f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/16/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingKey(...)' to 'createTaskFromExistingId' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingKey(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTaskFromExistingId(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createTaskFromExistingKey'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~createTaskFromExistingKey~QTaskRepository;~QString;" name="createTaskFromExistingId" references="true" stamp="1176762372578" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.setDescription(...)' to 'setSummary' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.setDescription(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.setSummary(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~setDescription~QString;" name="setSummary" references="true" stamp="1176764611531" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/16/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/16/refactorings.index
new file mode 100644
index 0000000..0393b13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1176762372578 Rename method 'createTaskFromExistingKey'
+1176764611531 Rename method 'setDescription'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/17/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/17/refactorings.history
new file mode 100644
index 0000000..b9e701d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/17/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.push(...)' to 'setNewTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.push(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.setNewTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'push'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~push~QString;~QRepositoryTaskData;" name="setNewTaskData" references="true" stamp="1177532682296" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldRepositoryTaskData(...)' to 'getOldTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldRepositoryTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getOldTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldRepositoryTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getOldRepositoryTaskData~QString;" name="getOldTaskData" references="true" stamp="1177532730796" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getRepositoryTaskData(...)' to 'getNewTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getRepositoryTaskData(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.getNewTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java[TaskDataManager~getRepositoryTaskData~QString;" name="getNewTaskData" references="true" stamp="1177532769500" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/17/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/17/refactorings.index
new file mode 100644
index 0000000..d2f1d7a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/4/17/refactorings.index
@@ -0,0 +1,3 @@
+1177532682296 Rename method 'push'
+1177532730796 Rename method 'getOldRepositoryTaskData'
+1177532769500 Rename method 'getRepositoryTaskData'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..e536870
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTask(...)' to 'updateTaskFromRepository' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTask(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTaskFromRepository(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateTask~QTaskRepository;~QAbstractRepositoryTask;" name="updateTaskFromRepository" references="true" stamp="1178557623906" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTask(...)' to 'updateTaskFromTaskData' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTask(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.updateTaskFromTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateTask~QTaskRepository;~QAbstractRepositoryTask;~QRepositoryTaskData;" name="updateTaskFromTaskData" references="true" stamp="1178557698750" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.core.RepositoryTemplate.java' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.core.RepositoryTemplate.java' - Original element: 'org.eclipse.mylar.tasks.core.TaskArchive.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.tasks.core{RepositoryTemplate.java" element1="/src<org.eclipse.mylar.tasks.core{TaskArchive.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.tasks.core{TaskArchive.java	true	true	RootCategory.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1178909705125" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.TaskList.getRootCategory()' to 'getUncategorizedCategory' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskList.getRootCategory()' - Renamed element: 'org.eclipse.mylar.tasks.core.TaskList.getUncategorizedCategory()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRootCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{TaskList.java[TaskList~getRootCategory" name="getUncategorizedCategory" references="true" stamp="1178909998656" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..95dd013
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1,4 @@
+1178557623906 Rename method 'updateTask'
+1178557698750 Rename method 'updateTask'
+1178909705125 Copy compilation unit
+1178909998656 Rename method 'getRootCategory'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/20/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/20/refactorings.history
new file mode 100644
index 0000000..08bdfa4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/20/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.core.TaskDataManager.OFFLINE_REPORTS' from expression '"offlineReports"' - Original project: 'org.eclipse.mylar.tasks.core' - Constant name: 'OFFLINE_REPORTS' - Constant expression: '"offlineReports"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'OFFLINE_REPORTS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.core{TaskDataManager.java" name="OFFLINE_REPORTS" qualify="false" replace="true" selection="2259 16" stamp="1179361290890" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/20/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/20/refactorings.index
new file mode 100644
index 0000000..bd13da7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/20/refactorings.index
@@ -0,0 +1 @@
+1179361290890 Extract constant 'OFFLINE_REPORTS'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..a21ce53
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.core.WebQueryHit.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.core{WebQueryHit.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180487674953" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.QueryHitCollector.getHits()' to 'getTaskHits' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.QueryHitCollector.getHits()' - Renamed element: 'org.eclipse.mylar.tasks.core.QueryHitCollector.getTaskHits()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getHits'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{QueryHitCollector.java[QueryHitCollector~getHits" name="getTaskHits" references="true" stamp="1180550124390" version="1.0"/>
+
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.core.RepositorySynchronizationManager.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui" element1="/src<org.eclipse.mylar.tasks.core{RepositorySynchronizationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1180636955156" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..37ad851
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,3 @@
+1180487674953 Delete element
+1180550124390 Rename method 'getHits'
+1180636955156 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/22/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/22/refactorings.history
new file mode 100644
index 0000000..ee66283
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.makeTask(...)' to 'createTask' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.makeTask(...)' - Renamed element: 'org.eclipse.mylar.tasks.core.AbstractRepositoryConnector.createTask(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'makeTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~makeTask~QString;~QString;~QString;" name="createTask" references="true" stamp="1180711984062" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/22/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/22/refactorings.index
new file mode 100644
index 0000000..21105b7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/22/refactorings.index
@@ -0,0 +1 @@
+1180711984062 Rename method 'makeTask'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..c7cc45f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.LocalAttachment.getFilePath()' to 'getFilename' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.LocalAttachment.getFilePath()' - Renamed element: 'org.eclipse.mylar.tasks.core.LocalAttachment.getFilename()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getFilePath'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{LocalAttachment.java[LocalAttachment~getFilePath" name="getFilename" references="true" stamp="1180836196779" version="1.0"/>
+<refactoring accessors="false" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.TaskRepositoryManager.getAttachmentContents(...)'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getAttachmentContents~QRepositoryAttachment;" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180910326126" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylar.tasks.core' - Destination element: 'src-old' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/tasks/core/AbstractQueryHit.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181099228656" target="/org.eclipse.mylar/developer/src-old" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.AbstractQueryHit.java'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.core{AbstractQueryHit.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181099239750" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.getChildren()' to 'getSubTasks' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.getChildren()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.getSubTasks()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getChildren'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~getChildren" name="getSubTasks" references="true" stamp="1181160845656" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.core.ITask.getSubTasks()' to 'getChildren' - Original project: 'org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.core.ITask.getSubTasks()' - Renamed element: 'org.eclipse.mylar.tasks.core.ITask.getChildren()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSubTasks'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.core{ITask.java[ITask~getSubTasks" name="getChildren" references="true" stamp="1181162791843" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.MylarMessages' to 'TasksMessages' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.MylarMessages' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarMessages'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{MylarMessages.java[MylarMessages" matchStrategy="1" name="TasksMessages" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269690359" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'INTERNAL_ERROR' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_INTERNAL' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.INTERNAL_ERROR' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_INTERNAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'INTERNAL_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^INTERNAL_ERROR" name="ERROR_INTERNAL" references="true" setter="false" stamp="1181269890460" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'IO_ERROR' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_IO' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.IO_ERROR' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_IO' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'IO_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^IO_ERROR" name="ERROR_IO" references="true" setter="false" stamp="1181269898361" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'LOGGED_OUT_OF_REPOSITORY' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'REPOSITORY_LOGGED_OUT' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.LOGGED_OUT_OF_REPOSITORY' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.REPOSITORY_LOGGED_OUT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'LOGGED_OUT_OF_REPOSITORY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^LOGGED_OUT_OF_REPOSITORY" name="REPOSITORY_LOGGED_OUT" references="true" setter="false" stamp="1181269915646" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'NETWORK_ERROR' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_NETWORK' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.NETWORK_ERROR' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_NETWORK' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'NETWORK_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^NETWORK_ERROR" name="ERROR_NETWORK" references="true" setter="false" stamp="1181269923559" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'PERMISSION_DENIED_ERROR' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_PERMISSION_DENIED' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.PERMISSION_DENIED_ERROR' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_PERMISSION_DENIED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PERMISSION_DENIED_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^PERMISSION_DENIED_ERROR" name="ERROR_PERMISSION_DENIED" references="true" setter="false" stamp="1181269934522" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_COMMENT_REQD' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'REPOSITORY_COMMENT_REQUIRED' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.REPOSITORY_COMMENT_REQD' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.REPOSITORY_COMMENT_REQUIRED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_COMMENT_REQD'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^REPOSITORY_COMMENT_REQD" name="REPOSITORY_COMMENT_REQUIRED" references="true" setter="false" stamp="1181269944855" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_ERROR' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_REPOSITORY' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.REPOSITORY_ERROR' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_REPOSITORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^REPOSITORY_ERROR" name="ERROR_REPOSITORY" references="true" setter="false" stamp="1181269976226" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_LOGIN_ERROR' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_REPOSITORY_LOGIN' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.REPOSITORY_LOGIN_ERROR' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_REPOSITORY_LOGIN' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_LOGIN_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^REPOSITORY_LOGIN_ERROR" name="ERROR_REPOSITORY_LOGIN" references="true" setter="false" stamp="1181269989694" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_NOT_FOUND' in 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'ERROR_REPOSITORY_NOT_FOUND' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.REPOSITORY_NOT_FOUND' - Renamed element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants.ERROR_REPOSITORY_NOT_FOUND' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_NOT_FOUND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants^REPOSITORY_NOT_FOUND" name="ERROR_REPOSITORY_NOT_FOUND" references="true" setter="false" stamp="1181269999048" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' to 'IRepositoryStatusConstants' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IMylarStatusConstants' - Renamed element: 'org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'IMylarStatusConstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IMylarStatusConstants.java[IMylarStatusConstants" matchStrategy="1" name="IRepositoryStatusConstants" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181270087404" textual="false" version="1.0"/>
+<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylyn.tasks.core.RepositoryStatus' to 'org.eclipse.mylyn.tasks.core.MylarStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.RepositoryStatus.repositoryUrl org.eclipse.mylyn.tasks.core.RepositoryStatus.getRepositoryUrl() org.eclipse.mylyn.tasks.core.RepositoryStatus.createStatus(...) org.eclipse.mylyn.tasks.core.RepositoryStatus.createStatus(...) org.eclipse.mylyn.tasks.core.RepositoryStatus.createLoginError(...) org.eclipse.mylyn.tasks.core.RepositoryStatus.createNotFoundError(...) org.eclipse.mylyn.tasks.core.RepositoryStatus.createCollisionError(...) org.eclipse.mylyn.tasks.core.RepositoryStatus.createCommentRequiredError(...) org.eclipse.mylyn.tasks.core.RepositoryStatus.createHtmlStatus(...) - Destination type: 'org.eclipse.mylyn.tasks.core.MylarStatus' - Use super type where possible" delete="8" description="Pull up members to 'MylarStatus'" element1="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus^repositoryUrl" element10="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createCollisionError~QString;~QString;" element11="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createCommentRequiredError~QString;~QString;" element12="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createHtmlStatus~QString;~I~QString;~I~QString;~QString;" element13="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createLoginError~QString;~QString;" element14="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createStatus~QString;~I~QString;~QStr" element15="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createStatus~QString;~I~QString;~QString;" element16="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~getRepositoryUrlskRepository;~I~QString;~QString;" element17="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~getRepositoryUrl" element2="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createStatus~QTa" element3="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createStatus~QTaskRepository;~I~QString;~QString;" element4="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createLoginError~QString;~QString;String;" element5="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createLoginError~QString;~QString;" element6="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createCollisionError~QString;~QString" element7="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createCollisionError~QString;~QString;" element8="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createHtmlStatus~QString;~I~QString;~I~QStri" element9="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus~createHtmlStatus~QString;~I~QString;~I~QString;~QString;" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylyn.tasks.core{MylarStatus.java[MylarStatus" instanceof="false" pull="9" replace="true" stamp="1181270290456" stubs="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.RepositoryStatus.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181270331680" subPackages="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_INTERNAL' to 'org.eclipse.mylyn.tasks.core.RepositoryStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_INTERNAL' - Destination type: 'org.eclipse.mylyn.tasks.core.RepositoryStatus'" delegate="false" deprecate="true" description="Move member 'ERROR_INTERNAL'" element1="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_INTERNAL" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus" stamp="1181270582627" version="1.0"/>
+<refactoring comment="Move 10 members to 'org.eclipse.mylyn.tasks.core.RepositoryStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_NETWORK org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_REPOSITORY org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.OPERATION_CANCELLED org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.REPOSITORY_COLLISION org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_IO org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.REPOSITORY_LOGGED_OUT org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_REPOSITORY_LOGIN org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_REPOSITORY_NOT_FOUND org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.ERROR_PERMISSION_DENIED org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.REPOSITORY_COMMENT_REQUIRED - Destination type: 'org.eclipse.mylyn.tasks.core.RepositoryStatus'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_NETWORK" element10="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^REPOSITORY_COMMENT_REQUIRED" element2="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_REPOSITORY" element3="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^OPERATION_CANCELLED" element4="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^REPOSITORY_COLLISION" element5="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_IO" element6="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^REPOSITORY_LOGGED_OUT" element7="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_REPOSITORY_LOGIN" element8="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_REPOSITORY_NOT_FOUND" element9="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java[IRepositoryStatusConstants^ERROR_PERMISSION_DENIED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{RepositoryStatus.java[RepositoryStatus" stamp="1181270608843" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IRepositoryStatusConstants.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{IRepositoryStatusConstants.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181270613702" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..38a6db3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,22 @@
+1180836196779 Rename method 'getFilePath'
+1180910326126 Delete element
+1181099228656 Copy compilation unit
+1181099239750 Delete element
+1181160845656 Rename method 'getChildren'
+1181162791843 Rename method 'getSubTasks'
+1181269690359 Rename type 'MylarMessages'
+1181269890460 Rename field 'INTERNAL_ERROR'
+1181269898361 Rename field 'IO_ERROR'
+1181269915646 Rename field 'LOGGED_OUT_OF_REPOSITORY'
+1181269923559 Rename field 'NETWORK_ERROR'
+1181269934522 Rename field 'PERMISSION_DENIED_ERROR'
+1181269944855 Rename field 'REPOSITORY_COMMENT_REQD'
+1181269976226 Rename field 'REPOSITORY_ERROR'
+1181269989694 Rename field 'REPOSITORY_LOGIN_ERROR'
+1181269999048 Rename field 'REPOSITORY_NOT_FOUND'
+1181270087404 Rename type 'IMylarStatusConstants'
+1181270290456 Pull up members to 'MylarStatus'
+1181270331680 Delete element
+1181270582627 Move member 'ERROR_INTERNAL'
+1181270608843 Move members
+1181270613702 Delete element
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..ebdd653
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'DESCRIPTION_DEFAULT' in 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector' to 'DEFAULT_SUMMARY' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DESCRIPTION_DEFAULT' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector.DEFAULT_SUMMARY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'DESCRIPTION_DEFAULT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{LocalRepositoryConnector.java[LocalRepositoryConnector^DESCRIPTION_DEFAULT" name="DEFAULT_SUMMARY" references="true" setter="false" stamp="1181677842500" textual="true" version="1.0"/>
+<refactoring comment="Push down members from 'org.eclipse.mylyn.tasks.core.Task' - Original project: 'org.eclipse.mylyn.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.Task.active org.eclipse.mylyn.tasks.core.Task.hasReminded org.eclipse.mylyn.tasks.core.Task.summary org.eclipse.mylyn.tasks.core.Task.priority org.eclipse.mylyn.tasks.core.Task.notes org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours org.eclipse.mylyn.tasks.core.Task.completed org.eclipse.mylyn.tasks.core.Task.taskUrl org.eclipse.mylyn.tasks.core.Task.parentCategory org.eclipse.mylyn.tasks.core.Task.completionDate org.eclipse.mylyn.tasks.core.Task.creationDate org.eclipse.mylyn.tasks.core.Task.scheduledForDate org.eclipse.mylyn.tasks.core.Task.dueDate org.eclipse.mylyn.tasks.core.Task.kind org.eclipse.mylyn.tasks.core.Task.toString() org.eclipse.mylyn.tasks.core.Task.setActive(...) org.eclipse.mylyn.tasks.core.Task.isActive() org.eclipse.mylyn.tasks.core.Task.equals(...) org.eclipse.mylyn.tasks.core.Task.hashCode() org.eclipse.mylyn.tasks.core.Task.isCompleted() org.eclipse.mylyn.tasks.core.Task.setCompleted(...) org.eclipse.mylyn.tasks.core.Task.getPriority() org.eclipse.mylyn.tasks.core.Task.setPriority(...) org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...) org.eclipse.mylyn.tasks.core.Task.getTaskUrl() org.eclipse.mylyn.tasks.core.Task.getNotes() org.eclipse.mylyn.tasks.core.Task.setNotes(...) org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours() org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...) org.eclipse.mylyn.tasks.core.Task.setContainer(...) org.eclipse.mylyn.tasks.core.Task.getContainer() org.eclipse.mylyn.tasks.core.Task.getSummary() org.eclipse.mylyn.tasks.core.Task.getCompletionDate() org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...) org.eclipse.mylyn.tasks.core.Task.getScheduledForDate() org.eclipse.mylyn.tasks.core.Task.hasBeenReminded() org.eclipse.mylyn.tasks.core.Task.setReminded(...) org.eclipse.mylyn.tasks.core.Task.getCreationDate() org.eclipse.mylyn.tasks.core.Task.setCreationDate(...) org.eclipse.mylyn.tasks.core.Task.setSummary(...) org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...) org.eclipse.mylyn.tasks.core.Task.isPastReminder() org.eclipse.mylyn.tasks.core.Task.hasValidUrl() org.eclipse.mylyn.tasks.core.Task.getTaskKind() org.eclipse.mylyn.tasks.core.Task.setKind(...) org.eclipse.mylyn.tasks.core.Task.compareTo(...) org.eclipse.mylyn.tasks.core.Task.getDueDate() org.eclipse.mylyn.tasks.core.Task.setDueDate(...) - Pushed members: org.eclipse.mylyn.tasks.core.Task.active org.eclipse.mylyn.tasks.core.Task.hasReminded org.eclipse.mylyn.tasks.core.Task.summary org.eclipse.mylyn.tasks.core.Task.priority org.eclipse.mylyn.tasks.core.Task.notes org.eclipse.mylyn.tasks.core.Task.estimatedTimeHours org.eclipse.mylyn.tasks.core.Task.completed org.eclipse.mylyn.tasks.core.Task.taskUrl org.eclipse.mylyn.tasks.core.Task.parentCategory org.eclipse.mylyn.tasks.core.Task.completionDate org.eclipse.mylyn.tasks.core.Task.creationDate org.eclipse.mylyn.tasks.core.Task.scheduledForDate org.eclipse.mylyn.tasks.core.Task.dueDate org.eclipse.mylyn.tasks.core.Task.kind org.eclipse.mylyn.tasks.core.Task.toString() org.eclipse.mylyn.tasks.core.Task.setActive(...) org.eclipse.mylyn.tasks.core.Task.isActive() org.eclipse.mylyn.tasks.core.Task.equals(...) org.eclipse.mylyn.tasks.core.Task.hashCode() org.eclipse.mylyn.tasks.core.Task.isCompleted() org.eclipse.mylyn.tasks.core.Task.setCompleted(...) org.eclipse.mylyn.tasks.core.Task.getPriority() org.eclipse.mylyn.tasks.core.Task.setPriority(...) org.eclipse.mylyn.tasks.core.Task.setTaskUrl(...) org.eclipse.mylyn.tasks.core.Task.getTaskUrl() org.eclipse.mylyn.tasks.core.Task.getNotes() org.eclipse.mylyn.tasks.core.Task.setNotes(...) org.eclipse.mylyn.tasks.core.Task.getEstimateTimeHours() org.eclipse.mylyn.tasks.core.Task.setEstimatedTimeHours(...) org.eclipse.mylyn.tasks.core.Task.setContainer(...) org.eclipse.mylyn.tasks.core.Task.getContainer() org.eclipse.mylyn.tasks.core.Task.getSummary() org.eclipse.mylyn.tasks.core.Task.getCompletionDate() org.eclipse.mylyn.tasks.core.Task.setScheduledForDate(...) org.eclipse.mylyn.tasks.core.Task.getScheduledForDate() org.eclipse.mylyn.tasks.core.Task.hasBeenReminded() org.eclipse.mylyn.tasks.core.Task.setReminded(...) org.eclipse.mylyn.tasks.core.Task.getCreationDate() org.eclipse.mylyn.tasks.core.Task.setCreationDate(...) org.eclipse.mylyn.tasks.core.Task.setSummary(...) org.eclipse.mylyn.tasks.core.Task.setCompletionDate(...) org.eclipse.mylyn.tasks.core.Task.isPastReminder() org.eclipse.mylyn.tasks.core.Task.hasValidUrl() org.eclipse.mylyn.tasks.core.Task.getTaskKind() org.eclipse.mylyn.tasks.core.Task.setKind(...) org.eclipse.mylyn.tasks.core.Task.compareTo(...) org.eclipse.mylyn.tasks.core.Task.getDueDate() org.eclipse.mylyn.tasks.core.Task.setDueDate(...)" description="Push down" element1="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^active" element10="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^completionDate" element11="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^creationDate" element12="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^scheduledForDate" element13="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^dueDate" element14="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~toSt" element15="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~toString" element16="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isActivee~Z" element17="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isActive" element18="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~hashCodeObject;" element19="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~hashCode" element2="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element20="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isCompleted" element21="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getPriorityd~Z" element22="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getPriority" element23="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;;" element24="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setTaskUrl~QString;" element25="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getNotesrl" element26="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getNotes" element27="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHo" element28="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getEstimateTimeHours" element29="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^summarymatedTimeHours~I" element3="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^summary" element30="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer~QAbstractTaskContainer;" element31="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getContainer" element32="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getComplet" element33="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getCompletionDate" element34="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate~QDate;" element35="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getScheduledForDate" element36="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Zed" element37="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setReminded~Z" element38="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate" element39="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setCreationDate~QDate;" element4="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setSumma" element40="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setSummary~QString;" element41="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminderate~QDate;" element42="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~isPastReminder" element43="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element44="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~getTaskKind" element45="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITask" element46="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~compareTo~QITaskListElement;" element47="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate" element48="/src<org.eclipse.mylyn.tasks.core{Task.java[Task~setDueDate~QDate;" element5="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^estim" element6="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^estimatedTimeHours" element7="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrled" element8="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^taskUrl" element9="/src<org.eclipse.mylyn.tasks.core{Task.java[Task^parentCategory" flags="589830" id="org.eclipse.jdt.ui.push.down" input="/src<org.eclipse.mylyn.tasks.core{Task.java[Task" push1="true" push10="true" push11="true" push12="true" push13="true" push14="true" push15="true" push16="true" push17="true" push18="true" push19="true" push2="true" push20="true" push21="true" push22="true" push23="true" push24="true" push25="true" push26="true" push27="true" push28="true" push29="true" push3="true" push30="true" push31="true" push32="true" push33="true" push34="true" push35="true" push36="true" push37="true" push38="true" push39="true" push4="true" push40="true" push41="true" push42="true" push43="true" push44="true" push45="true" push46="true" push47="true" push48="true" push5="true" push6="true" push7="true" push8="true" push9="true" stamp="1181700191533" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask.java' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask.java' - Original element: 'org.eclipse.mylyn.tasks.core.Task.PriorityLevel' - Textual move only" description="Move type" destination="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryTask.java" element1="/src<org.eclipse.mylyn.tasks.core{Task.java[Task[PriorityLevel" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1181700244505" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask' - Original element: 'org.eclipse.mylyn.tasks.core.PriorityLevel' - Textual move only" description="Move type" destination="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryTask.java[AbstractRepositoryTask" element1="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryTask.java[PriorityLevel" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1181700442946" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.Task.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{Task.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181705665437" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITask' to 'AbstractTask' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITask' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ITask'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITask.java[ITask" matchStrategy="1" name="AbstractTask" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181716748507" textual="false" version="1.0"/>
+<refactoring comment="Rename compilation unit 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask.java' to 'AbstractTask.java' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask.java' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.java'" description="Rename compilation unit 'AbstractRepositoryTask.java'" flags="2" id="org.eclipse.jdt.ui.rename.compilationunit" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryTask.java" name="AbstractTask.java" references="false" stamp="1181716778518" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' to 'AbstractTaskListElement' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer" matchStrategy="1" name="AbstractTaskListElement" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181717946586" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' to 'AbstractTaskElement' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskElement' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskListElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListElement.java[AbstractTaskListElement" matchStrategy="1" name="AbstractTaskElement" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181717988323" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskListElement' to 'AbstractTaskListElement' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskListElement' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskListElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElement.java[ITaskListElement" matchStrategy="1" name="AbstractTaskListElement" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181718034197" textual="false" version="1.0"/>
+<refactoring comment="Rename compilation unit 'org.eclipse.mylyn.tasks.core.AbstractTaskElement.java' to 'AbstractTaskListElement.java' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskElement.java' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement.java'" description="Rename compilation unit 'AbstractTaskElement.java'" flags="2" id="org.eclipse.jdt.ui.rename.compilationunit" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskElement.java" name="AbstractTaskListElement.java" references="false" stamp="1181718054733" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.TaskList' to 'getAllCategories' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList' - Renamed element: 'org.eclipse.mylyn.tasks.core.getAllCategories' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskList'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList" matchStrategy="1" name="getAllCategories" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181720379901" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setContainer(...)' to 'setCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setContainer(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setCategory(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setContainer~QAbstractTaskContainer;" name="setCategory" references="true" stamp="1181754809236" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.getAllCategories' to 'TaskList' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.getAllCategories' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'getAllCategories'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{getAllCategories.java[getAllCategories" matchStrategy="1" name="TaskList" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181754886948" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.UncategorizedCategory' to 'AutomaticCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.UncategorizedCategory' - Renamed element: 'org.eclipse.mylyn.tasks.core.AutomaticCategory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'UncategorizedCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{UncategorizedCategory.java[UncategorizedCategory" matchStrategy="1" name="AutomaticCategory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181754951279" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.getUncategorizedCategory()' to 'getAutomaticCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.getUncategorizedCategory()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.getAutomaticCategory()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUncategorizedCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~getUncategorizedCategory" name="getAutomaticCategory" references="true" stamp="1181755625202" version="1.0"/>
+<refactoring comment="Rename field 'uncategorizedCategory' in 'org.eclipse.mylyn.tasks.core.TaskList' to 'automaticCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.uncategorizedCategory' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.automaticCategory' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'uncategorizedCategory'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList^uncategorizedCategory" name="automaticCategory" references="true" setter="false" stamp="1181755635699" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AutomaticCategory' to 'UnfiledCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AutomaticCategory' - Renamed element: 'org.eclipse.mylyn.tasks.core.UnfiledCategory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AutomaticCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AutomaticCategory.java[AutomaticCategory" matchStrategy="1" name="UnfiledCategory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181766086073" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.UnfiledCategory.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{UnfiledCategory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181766121554" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.DateRangeActivityDelegate.java org.eclipse.mylyn.tasks.core.DateRangeContainer.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{DateRangeActivityDelegate.java" element2="/src<org.eclipse.mylyn.tasks.core{DateRangeContainer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181766148799" units="2" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskArchive.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskArchive.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181766292096" units="1" version="1.0"/>
+
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' to 'AbstractTaskCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskCategory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer" matchStrategy="1" name="AbstractTaskCategory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181767911702" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' to 'AbstractTaskContainer' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElement' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskListElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListElement.java[AbstractTaskListElement" matchStrategy="1" name="AbstractTaskContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181767990694" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer' to 'ScheduledTaskContainer' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeContainer' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'DateRangeContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{DateRangeContainer.java[DateRangeContainer" matchStrategy="1" name="ScheduledTaskContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181769454884" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate' to 'ScheduledTaskDelegate' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.DateRangeActivityDelegate' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskDelegate' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'DateRangeActivityDelegate'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{DateRangeActivityDelegate.java[DateRangeActivityDelegate" matchStrategy="1" name="ScheduledTaskDelegate" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181769501743" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.notifyLocalInfoChanged(...)' to 'notifyTaskChanged' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.notifyLocalInfoChanged(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.notifyTaskChanged(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifyLocalInfoChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~notifyLocalInfoChanged~QAbstractTask;" name="notifyTaskChanged" references="true" stamp="1181781818576" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.add(...)' to 'addChild' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.add(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.addChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'add'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~add~QAbstractTask;" name="addChild" references="true" stamp="1181788002784" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.remove(...)' to 'removeChild' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.remove(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.removeChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'remove'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~remove~QAbstractTask;" name="removeChild" references="true" stamp="1181788017786" version="1.0"/>
+<refactoring comment="Rename field 'automaticCategory' in 'org.eclipse.mylyn.tasks.core.TaskList' to 'defaultCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.automaticCategory' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.defaultCategory' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'automaticCategory'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList^automaticCategory" name="defaultCategory" references="true" setter="false" stamp="1181803285976" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.getAutomaticCategory()' to 'getDefaultCategory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.getAutomaticCategory()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.getDefaultCategory()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getAutomaticCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~getAutomaticCategory" name="getDefaultCategory" references="true" stamp="1181803314502" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.TaskList.moveToContainer(AbstractTask task, AbstractTaskCategory toContainer)' to 'public void moveToContainer(AbstractTask task, AbstractTaskCategory toContainer)' - Original project: 'org.eclipse.mylyn.tasks.core'" delegate="false" deprecate="true" description="Change method 'moveToContainer'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~moveToContainer~QAbstractTaskCategory;~QAbstractTask;" name="moveToContainer" parameter1="AbstractTask task 1 AbstractTask task false" parameter2="AbstractTaskCategory toContainer 0 AbstractTaskCategory toContainer false" stamp="1181808412801" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.internal.web.tasks' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.internal.web.tasks' - Original element: 'org.eclipse.mylyn.internal.tasks.core.WebTask.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.web.tasks" element1="/src<org.eclipse.mylyn.internal.tasks.core{WebTask.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181852705645" units="1" version="1.0"/>
+<refactoring comment="Rename enum constant 'CHANGED' of 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind' to 'CHANGED_LOCAL' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CHANGED' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CHANGED_LOCAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'CHANGED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.tasks.core{TaskContainerDelta.java[TaskContainerDelta[Kind^CHANGED" name="CHANGED_LOCAL" references="true" setter="false" stamp="1181857285064" textual="false" version="1.0"/>
+<refactoring comment="Rename enum constant 'DATA' of 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind' to 'CHANGED_REMOTE' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.DATA' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CHANGED_REMOTE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'DATA'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.tasks.core{TaskContainerDelta.java[TaskContainerDelta[Kind^DATA" name="CHANGED_REMOTE" references="true" setter="false" stamp="1181857308990" textual="false" version="1.0"/>
+<refactoring comment="Rename enum constant 'CHANGED_LOCAL' of 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind' to 'CHANGED' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CHANGED_LOCAL' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CHANGED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'CHANGED_LOCAL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.tasks.core{TaskContainerDelta.java[TaskContainerDelta[Kind^CHANGED_LOCAL" name="CHANGED" references="true" setter="false" stamp="1181857348844" textual="false" version="1.0"/>
+<refactoring comment="Rename enum constant 'CHANGED_REMOTE' of 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind' to 'CONTENT' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CHANGED_REMOTE' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskContainerDelta.Kind.CONTENT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'CHANGED_REMOTE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.tasks.core{TaskContainerDelta.java[TaskContainerDelta[Kind^CHANGED_REMOTE" name="CONTENT" references="true" setter="false" stamp="1181857358034" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.core.LocalTask.SYNC_DATE_NOW' from expression '"now"' - Original project: 'org.eclipse.mylyn.tasks.core' - Constant name: 'SYNC_DATE_NOW' - Constant expression: '"now"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'SYNC_DATE_NOW'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core{LocalTask.java" name="SYNC_DATE_NOW" qualify="false" replace="true" selection="1171 5" stamp="1181865589494" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java	true	true	CopyOfTaskDataManager.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1181957955671" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..a42ede9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,38 @@
+1181677842500 Rename field 'DESCRIPTION_DEFAULT'
+1181700191533 Push down
+1181700244505 Move type
+1181700442946 Move type
+1181705665437 Delete element
+1181716748507 Rename type 'ITask'
+1181716778518 Rename compilation unit 'AbstractRepositoryTask.java'
+1181717946586 Rename type 'AbstractTaskContainer'
+1181717988323 Rename type 'AbstractTaskListElement'
+1181718034197 Rename type 'ITaskListElement'
+1181718054733 Rename compilation unit 'AbstractTaskElement.java'
+1181720379901 Rename type 'TaskList'
+1181754809236 Rename method 'setContainer'
+1181754886948 Rename type 'getAllCategories'
+1181754951279 Rename type 'UncategorizedCategory'
+1181755625202 Rename method 'getUncategorizedCategory'
+1181755635699 Rename field 'uncategorizedCategory'
+1181766086073 Rename type 'AutomaticCategory'
+1181766121554 Move compilation unit
+1181766148799 Move compilation units
+1181766292096 Move compilation unit
+1181767911702 Rename type 'AbstractTaskContainer'
+1181767990694 Rename type 'AbstractTaskListElement'
+1181769454884 Rename type 'DateRangeContainer'
+1181769501743 Rename type 'DateRangeActivityDelegate'
+1181781818576 Rename method 'notifyLocalInfoChanged'
+1181788002784 Rename method 'add'
+1181788017786 Rename method 'remove'
+1181803285976 Rename field 'automaticCategory'
+1181803314502 Rename method 'getAutomaticCategory'
+1181808412801 Change method 'moveToContainer'
+1181852705645 Move compilation unit
+1181857285064 Rename enum constant 'CHANGED'
+1181857308990 Rename enum constant 'DATA'
+1181857348844 Rename enum constant 'CHANGED_LOCAL'
+1181857358034 Rename enum constant 'CHANGED_REMOTE'
+1181865589494 Extract constant 'SYNC_DATE_NOW'
+1181957955671 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..b3869e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.ITaskDataStorage.removeTaskDataState(...)' to 'remove' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskDataStorage.removeTaskDataState(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ITaskDataStorage.remove(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'removeTaskDataState'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{ITaskDataStorage.java[ITaskDataStorage~removeTaskDataState~QString;~QString;" name="remove" references="true" stamp="1182093894562" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.CopyOfTaskDataManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{CopyOfTaskDataManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182116742640" subPackages="false" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskDataManager.setNewTaskData(String taskHandle, RepositoryTaskData data)' to 'public void setNewTaskData(RepositoryTaskData data)' - Original project: 'org.eclipse.mylyn.tasks.core' - Removed parameters: String taskHandle" delegate="false" deprecate="false" description="Change method 'setNewTaskData'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java[TaskDataManager~setNewTaskData~QString;~QRepositoryTaskData;" name="setNewTaskData" parameter1="String taskHandle 0 String taskHandle true" parameter2="RepositoryTaskData data 1 RepositoryTaskData data false" stamp="1182202763890" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskDataManager.setOldTaskData(String taskHandle, RepositoryTaskData data)' to 'public void setOldTaskData(RepositoryTaskData data)' - Original project: 'org.eclipse.mylyn.tasks.core' - Removed parameters: String taskHandle" delegate="false" deprecate="false" description="Change method 'setOldTaskData'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java[TaskDataManager~setOldTaskData~QString;~QRepositoryTaskData;" name="setOldTaskData" parameter1="String taskHandle 0 String taskHandle true" parameter2="RepositoryTaskData data 1 RepositoryTaskData data false" stamp="1182202887281" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getHits()' to 'getChildren' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getHits()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getChildren()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getHits'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~getHits" name="getChildren" references="true" stamp="1182217422437" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskDataHandler' to 'AbstractTaskDataHandler' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskDataHandler' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskDataHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskDataHandler.java[ITaskDataHandler" matchStrategy="1" name="AbstractTaskDataHandler" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182230640031" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler.getTaskData(...)' to 'getMultiTaskData' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler.getTaskData(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler.getMultiTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskDataHandler.java[AbstractTaskDataHandler~getTaskData~QTaskRepository;~QSet\<QString;>;~QIProgressMonitor;" name="getMultiTaskData" references="true" stamp="1182289410531" version="1.0"/>
+<refactoring comment="Rename field 'delegateExternalizers' in 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer' to 'taskListFactories' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.delegateExternalizers' - Renamed element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.taskListFactories' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'delegateExternalizers'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^delegateExternalizers" name="taskListFactories" references="true" setter="false" stamp="1182301501110" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskListExternalizer' to 'ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskListExternalizer' - Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskListExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskListExternalizer.java[ITaskListExternalizer" matchStrategy="1" name="ITaskListElementFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182301523048" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'taskListFactories' in 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer' to 'elementFactories' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.taskListFactories' - Renamed element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.elementFactories' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'taskListFactories'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^taskListFactories" name="elementFactories" references="true" setter="false" stamp="1182301533417" textual="false" version="1.0"/>
+<refactoring comment="Move 2 members to 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original elements: org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_QUERY org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_QUERY_HIT - Destination type: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_QUERY" element2="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_QUERY_HIT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" stamp="1182301658360" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_LAST_REFRESH' to 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_LAST_REFRESH' - Destination type: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory'" delegate="false" deprecate="true" description="Move member 'KEY_LAST_REFRESH'" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_LAST_REFRESH" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" stamp="1182301717746" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_NAME' to 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_NAME' - Destination type: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory'" delegate="false" deprecate="true" description="Move member 'KEY_NAME'" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_NAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" stamp="1182301753897" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_QUERY_STRING' to 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_QUERY_STRING' - Destination type: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory'" delegate="false" deprecate="true" description="Move member 'KEY_QUERY_STRING'" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_QUERY_STRING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" stamp="1182301763918" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_REPOSITORY_URL' to 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_REPOSITORY_URL' - Destination type: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory'" delegate="false" deprecate="true" description="Move member 'KEY_REPOSITORY_URL'" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_REPOSITORY_URL" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" stamp="1182301774583" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory.readQuery(...)' to 'createQuery' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory.readQuery(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory.createQuery(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readQuery'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory~readQuery~QNode;~QTaskList;" name="createQuery" references="true" stamp="1182302715716" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_TASK' to 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.KEY_TASK' - Destination type: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory'" delegate="false" deprecate="true" description="Move member 'KEY_TASK'" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_TASK" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" stamp="1182304657623" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' to 'AbstractTaskListElementFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskListElementFactory' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElementFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskListElementFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskListElementFactory.java[ITaskListElementFactory" matchStrategy="1" name="AbstractTaskListElementFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182304671703" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.DelegatingTaskExternalizer.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{DelegatingTaskExternalizer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182387004194" units="1" version="1.0"/>
+
+<refactoring comment="Change method 'public AbstractRepositoryQuery org.eclipse.mylyn.tasks.core.AbstractTaskListElementFactory.createQuery(Element element, TaskList tlist, String repositoryUrl, String queryString, String label) throws TaskExternalizationException' to 'public AbstractRepositoryQuery createQuery(Element element, String repositoryUrl, String queryString, String label) throws TaskExternalizationException' - Original project: 'org.eclipse.mylyn.tasks.core' - Removed parameters: TaskList tlist" delegate="false" deprecate="true" description="Change method 'createQuery'" element1="/src<org.eclipse.mylyn.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListElementFactory.java[AbstractTaskListElementFactory~createQuery~QElement;~QTaskList;~QString;~QString;~QString;" kind1="0" name="createQuery" parameter1="Element element 0 Element element false" parameter2="TaskList tlist 1 TaskList tlist true" parameter3="String repositoryUrl 2 String repositoryUrl false" parameter4="String queryString 3 String queryString false" parameter5="String label 4 String label false" stamp="1182395094439" version="1.0"/>
+<refactoring comment="Change method 'public AbstractTask org.eclipse.mylyn.tasks.core.AbstractTaskListElementFactory.createTask(String repositoryUrl, String taskId, String summary, Element element, TaskList tlist, AbstractTaskContainer category, AbstractTask parent) throws TaskExternalizationException' to 'public AbstractTask createTask(String repositoryUrl, String taskId, String summary, Element element) throws TaskExternalizationException' - Original project: 'org.eclipse.mylyn.tasks.core' - Removed parameters: TaskList tlist AbstractTaskContainer category AbstractTask parent" delegate="false" deprecate="true" description="Change method 'createTask'" element1="/src<org.eclipse.mylyn.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListElementFactory.java[AbstractTaskListElementFactory~createTask~QString;~QString;~QString;~QElement;~QTaskList;~QAbstractTaskContainer;~QAbstractTask;" kind1="0" name="createTask" parameter1="String repositoryUrl 0 String repositoryUrl false" parameter2="String taskId 1 String taskId false" parameter3="String summary 2 String summary false" parameter4="Element element 3 Element element false" parameter5="TaskList tlist 4 TaskList tlist true" parameter6="AbstractTaskContainer category 5 AbstractTaskContainer category true" parameter7="AbstractTask parent 6 AbstractTask parent true" stamp="1182395802622" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTaskListElementFactory' to 'AbstractTaskListFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListElementFactory' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskListElementFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListElementFactory.java[AbstractTaskListElementFactory" matchStrategy="1" name="AbstractTaskListFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182400185437" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.LocalTaskExternalizer' to 'LocalTaskListFactory' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.LocalTaskExternalizer' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.LocalTaskListFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'LocalTaskExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{LocalTaskExternalizer.java[LocalTaskExternalizer" matchStrategy="1" name="LocalTaskListFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182400222111" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util' - Original element: 'org.eclipse.mylyn.internal.tasks.core.DelegatingTaskExternalizer.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.util" element1="/src<org.eclipse.mylyn.internal.tasks.core{DelegatingTaskExternalizer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182400665770" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.canCreateElementFor(...)' to 'canCreate' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.canCreateElementFor(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.canCreate(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'canCreateElementFor'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~canCreateElementFor~QAbstractRepositoryQuery;" name="canCreate" references="true" stamp="1182409667932" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getQueryTagNameForElement(...)' to 'getElementName' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getQueryTagNameForElement(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getElementName(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getQueryTagNameForElement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~getQueryTagNameForElement~QAbstractRepositoryQuery;" name="getElementName" references="true" stamp="1182409703979" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getElementName(...)' to 'getQueryElementName' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getElementName(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getQueryElementName(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getElementName'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~getElementName~QAbstractRepositoryQuery;" name="getQueryElementName" references="true" stamp="1182409722330" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getTaskTagName()' to 'getTaskElementName' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getTaskTagName()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getTaskElementName()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskTagName'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~getTaskTagName" name="getTaskElementName" references="true" stamp="1182409728195" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getQueryTagNames()' to 'getQueryElementNames' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getQueryTagNames()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.getQueryElementNames()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getQueryTagNames'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~getQueryTagNames" name="getQueryElementNames" references="true" stamp="1182409741793" version="1.0"/>
+<refactoring comment="Change method 'public AbstractRepositoryQuery org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.createQuery(String repositoryUrl, String queryString, String label, Element element) throws TaskExternalizationException' to 'public AbstractRepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element) throws TaskExternalizationException' - Original project: 'org.eclipse.mylyn.tasks.core'" delegate="false" deprecate="true" description="Change method 'createQuery'" element1="/src<org.eclipse.mylyn.tasks.core{TaskExternalizationException.java[TaskExternalizationException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~createQuery~QElement;~QString;~QString;~QString;" kind1="0" name="createQuery" parameter1="String repositoryUrl 1 String repositoryUrl false" parameter2="String queryString 2 String queryString false" parameter3="String label 3 String label false" parameter4="Element element 0 Element element false" stamp="1182409793791" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.canCreateElementFor(...)' to 'canCreate' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.canCreateElementFor(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.canCreate(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'canCreateElementFor'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java[AbstractTaskListFactory~canCreateElementFor~QAbstractTask;" name="canCreate" references="true" stamp="1182409835482" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractAttributeFactory.getIsHidden(...)' to 'isHidden' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractAttributeFactory.getIsHidden(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractAttributeFactory.isHidden(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getIsHidden'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractAttributeFactory.java[AbstractAttributeFactory~getIsHidden~QString;" name="isHidden" references="true" stamp="1182549598545" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IAttachmentHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{IAttachmentHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182550182134" subPackages="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MYLAR_CONTEXT_DESCRIPTION' to 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MYLAR_CONTEXT_DESCRIPTION' - Destination type: 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler'" delegate="false" deprecate="true" description="Move member 'MYLAR_CONTEXT_DESCRIPTION'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector^MYLAR_CONTEXT_DESCRIPTION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler" stamp="1182550640520" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MYLAR_CONTEXT_FILENAME' to 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MYLAR_CONTEXT_FILENAME' - Destination type: 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler'" delegate="false" deprecate="true" description="Move member 'MYLAR_CONTEXT_FILENAME'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector^MYLAR_CONTEXT_FILENAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler" stamp="1182550648037" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MYLAR_CONTEXT_DESCRIPTION_LEGACY' to 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MYLAR_CONTEXT_DESCRIPTION_LEGACY' - Destination type: 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler'" delegate="false" deprecate="true" description="Move member 'MYLAR_CONTEXT_DESCRIPTION_LEGACY'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector^MYLAR_CONTEXT_DESCRIPTION_LEGACY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler" stamp="1182550656335" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MESSAGE_ATTACHMENTS_NOT_SUPPORTED' to 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.MESSAGE_ATTACHMENTS_NOT_SUPPORTED' - Destination type: 'org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler'" delegate="false" deprecate="true" description="Move member 'MESSAGE_ATTACHMENTS_NOT_SUPPORTED'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector^MESSAGE_ATTACHMENTS_NOT_SUPPORTED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler" stamp="1182550671162" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskWebUrl(...)' to 'getTaskUrl' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskWebUrl(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getTaskUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskWebUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getTaskWebUrl~QString;~QString;" name="getTaskUrl" references="true" stamp="1182551938473" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.repositoryPropertyNames()' to 'getPepositoryPropertyNames' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.repositoryPropertyNames()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getPepositoryPropertyNames()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'repositoryPropertyNames'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~repositoryPropertyNames" name="getPepositoryPropertyNames" references="true" stamp="1182551978110" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getRepositoryType()' to 'getConnectorKind' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getRepositoryType()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.getConnectorKind()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryType'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getRepositoryType" name="getConnectorKind" references="true" stamp="1182552155546" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setCurrentlySynchronizing(...)' to 'setSynchronizing' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setCurrentlySynchronizing(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setSynchronizing(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setCurrentlySynchronizing'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~setCurrentlySynchronizing~Z" name="setSynchronizing" references="true" stamp="1182552197748" version="1.0"/>
+<refactoring comment="Rename local variable 'currentlySynchronizing' in 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setSynchronizing(...)' to 'synchronizing' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setSynchronizing(boolean).currentlySynchronizing' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setSynchronizing(boolean).synchronizing' - Update references to refactored element" description="Rename local variable 'currentlySynchronizing'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java" name="synchronizing" references="true" selection="2157 22" stamp="1182552206215" version="1.0"/>
+<refactoring comment="Rename field 'currentlySynchronizing' in 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery' to 'synchronizing' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.currentlySynchronizing' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.synchronizing' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'currentlySynchronizing'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery^currentlySynchronizing" name="synchronizing" references="true" setter="false" stamp="1182552210993" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'lastRefreshTimeStamp' in 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery' to 'lastSynchronizedStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.lastRefreshTimeStamp' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.lastSynchronizedStamp' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'lastRefreshTimeStamp'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery^lastRefreshTimeStamp" name="lastSynchronizedStamp" references="true" setter="false" stamp="1182552231976" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getLastRefreshTimeStamp()' to 'getLastSynchronizedTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getLastRefreshTimeStamp()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getLastSynchronizedTimeStamp()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLastRefreshTimeStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~getLastRefreshTimeStamp" name="getLastSynchronizedTimeStamp" references="true" stamp="1182552241651" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setLastRefreshTimeStamp(...)' to 'setLastSynchronizedStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setLastRefreshTimeStamp(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setLastSynchronizedStamp(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setLastRefreshTimeStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~setLastRefreshTimeStamp~QString;" name="setLastSynchronizedStamp" references="true" stamp="1182552251286" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getStatus()' to 'getSynchronizationStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getStatus()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.getSynchronizationStatus()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~getStatus" name="getSynchronizationStatus" references="true" stamp="1182552329463" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setStatus(...)' to 'setSynchronizationStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setStatus(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.setSynchronizationStatus(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java[AbstractRepositoryQuery~setStatus~QIStatus;" name="setSynchronizationStatus" references="true" stamp="1182552343252" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryTask.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryTask.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182552400409" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getRepositoryKind()' to 'getConnectorKind' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getRepositoryKind()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getConnectorKind()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryKind'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getRepositoryKind" name="getConnectorKind" references="true" stamp="1182552547950" version="1.0"/>
+<refactoring comment="Rename field 'lastSynchronizedDateStamp' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'lastReadTimeDateStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.lastSynchronizedDateStamp' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.lastReadTimeDateStamp' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'lastSynchronizedDateStamp'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^lastSynchronizedDateStamp" name="lastReadTimeDateStamp" references="true" setter="false" stamp="1182552606002" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'lastReadTimeDateStamp' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'lastReadTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.lastReadTimeDateStamp' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.lastReadTimeStamp' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'lastReadTimeDateStamp'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^lastReadTimeDateStamp" name="lastReadTimeStamp" references="true" setter="false" stamp="1182552613584" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'lastSyncDateStamp' in 'org.eclipse.mylyn.tasks.core.AbstractTask.setLastSyncDateStamp(...)' to 'lastReadTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setLastSyncDateStamp(String).lastSyncDateStamp' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setLastSyncDateStamp(String).lastReadTimeStamp' - Update references to refactored element" description="Rename local variable 'lastSyncDateStamp'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java" name="lastReadTimeStamp" references="true" selection="4608 17" stamp="1182552631061" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getLastSyncDateStamp()' to 'getLastReadTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getLastSyncDateStamp()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getLastReadTimeStamp()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLastSyncDateStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getLastSyncDateStamp" name="getLastReadTimeStamp" references="true" stamp="1182552647035" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setKind(...)' to 'setTaskKind' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setKind(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setTaskKind(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setKind'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setKind~QString;" name="setTaskKind" references="true" stamp="1182552706973" version="1.0"/>
+<refactoring comment="Rename field 'kind' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'taskKind' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.kind' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.taskKind' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'kind'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^kind" name="taskKind" references="true" setter="false" stamp="1182552714148" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getStatus()' to 'getSynchronizationStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getStatus()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getSynchronizationStatus()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getStatus" name="getSynchronizationStatus" references="true" stamp="1182552808827" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setStatus(...)' to 'setSynchronizationStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setStatus(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizationStatus(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setStatus~QIStatus;" name="setSynchronizationStatus" references="true" stamp="1182552819586" version="1.0"/>
+<refactoring comment="Rename field 'errorStatus' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'synchronizationStatus' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.errorStatus' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.synchronizationStatus' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'errorStatus'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^errorStatus" name="synchronizationStatus" references="true" setter="false" stamp="1182552826815" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getSyncState()' to 'getSynchronizationState' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getSyncState()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getSynchronizationState()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSyncState'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getSyncState" name="getSynchronizationState" references="true" stamp="1182552859076" version="1.0"/>
+<refactoring comment="Rename field 'syncState' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'synchronizationState' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.syncState' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.synchronizationState' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'syncState'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^syncState" name="synchronizationState" references="true" setter="false" stamp="1182552867630" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setSyncState(...)' to 'setSynchronizationState' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setSyncState(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizationState(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setSyncState'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSyncState~QRepositoryTaskSyncState;" name="setSynchronizationState" references="true" stamp="1182552879485" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setCurrentlySynchronizing(...)' to 'setSynchronizing' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setCurrentlySynchronizing(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizing(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setCurrentlySynchronizing'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setCurrentlySynchronizing~Z" name="setSynchronizing" references="true" stamp="1182552895261" version="1.0"/>
+<refactoring comment="Rename field 'currentlySynchronizing' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'synchronizing' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.currentlySynchronizing' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.synchronizing' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'currentlySynchronizing'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^currentlySynchronizing" name="synchronizing" references="true" setter="false" stamp="1182552899769" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'currentlySychronizing' in 'org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizing(...)' to 'sychronizing' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizing(boolean).currentlySychronizing' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizing(boolean).sychronizing' - Update references to refactored element" description="Rename local variable 'currentlySychronizing'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java" name="sychronizing" references="true" selection="5027 21" stamp="1182552905631" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.hasBeenReminded()' to 'isReminded' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.hasBeenReminded()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.isReminded()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasBeenReminded'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~hasBeenReminded" name="isReminded" references="true" stamp="1182552946024" version="1.0"/>
+<refactoring comment="Rename field 'hasReminded' in 'org.eclipse.mylyn.tasks.core.AbstractTask' to 'reminded' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.hasReminded' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.reminded' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'hasReminded'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask^hasReminded" name="reminded" references="true" setter="false" stamp="1182552951593" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setLastSyncDateStamp(...)' to 'setLastReadTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setLastSyncDateStamp(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setLastReadTimeStamp(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setLastSyncDateStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setLastSyncDateStamp~QString;" name="setLastReadTimeStamp" references="true" stamp="1182553082437" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setTaskUrl(...)' to 'setUrl' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setTaskUrl(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setTaskUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setTaskUrl~QString;" name="setUrl" references="true" stamp="1182554506134" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getTaskUrl()' to 'getUrl' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getTaskUrl()' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getUrl()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getTaskUrl" name="getUrl" references="true" stamp="1182554537742" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.setDescription(...)' to 'setSummary' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.setDescription(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.setSummary(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~setDescription~QString;" name="setSummary" references="true" stamp="1182554666948" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskElement.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTaskElement.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182555118534" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ILinkedTaskInfo.getTaskFullUrl()' to 'getTaskUrl' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ILinkedTaskInfo.getTaskFullUrl()' - Renamed element: 'org.eclipse.mylyn.tasks.core.ILinkedTaskInfo.getTaskUrl()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskFullUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ILinkedTaskInfo.java[ILinkedTaskInfo~getTaskFullUrl" name="getTaskUrl" references="true" stamp="1182555361695" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ITaskCollector.getTaskHits()' to 'getTasks' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskCollector.getTaskHits()' - Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskCollector.getTasks()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskHits'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ITaskCollector.java[ITaskCollector~getTaskHits" name="getTasks" references="true" stamp="1182555621055" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.ITaskListExternalizer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskListExternalizer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182555951301" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.LocalAttachment.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{LocalAttachment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182556057099" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getCC()' to 'getCc' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getCC()' - Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getCc()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCC'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData~getCC" name="getCc" references="true" stamp="1182556366584" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.removeCC(...)' to 'removeCc' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.removeCC(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.removeCc(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'removeCC'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData~removeCC~QString;" name="removeCc" references="true" stamp="1182556464689" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskCategory.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskCategory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182556526291" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskExternalizationException.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskExternalizationException.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182559603062" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.setLastTaskNum(...)' to 'setLastLocalTaskId' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.setLastTaskNum(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.setLastLocalTaskId(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setLastTaskNum'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~setLastTaskNum~I" name="setLastLocalTaskId" references="true" stamp="1182559811314" version="1.0"/>
+<refactoring comment="Rename field 'lastTaskNum' in 'org.eclipse.mylyn.tasks.core.TaskList' to 'lastLocalTaskId' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.lastTaskNum' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.lastLocalTaskId' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'lastTaskNum'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList^lastTaskNum" name="lastLocalTaskId" references="true" setter="false" stamp="1182559817115" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.getNextTaskNum()' to 'getNextLocalTaskId' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.getNextTaskNum()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.getNextLocalTaskId()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNextTaskNum'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~getNextTaskNum" name="getNextLocalTaskId" references="true" stamp="1182559825199" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.getLastTaskNum()' to 'getLastLocalTaskId' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.getLastTaskNum()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.getLastLocalTaskId()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLastTaskNum'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~getLastTaskNum" name="getLastLocalTaskId" references="true" stamp="1182559840765" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.findLargestTaskHandle()' to 'findLargestTaskId' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.findLargestTaskHandle()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.findLargestTaskId()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'findLargestTaskHandle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~findLargestTaskHandle" name="findLargestTaskId" references="true" stamp="1182559854460" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskList.largestTaskHandleHelper(...)' to 'largestTaskIdHelper' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskList.largestTaskHandleHelper(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskList.largestTaskIdHelper(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'largestTaskHandleHelper'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskList.java[TaskList~largestTaskHandleHelper~QCollection\<QAbstractTask;>;" name="largestTaskIdHelper" references="true" stamp="1182560398760" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.getSyncTimeStamp()' to 'getSynchronizationTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getSyncTimeStamp()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getSynchronizationTimeStamp()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSyncTimeStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~getSyncTimeStamp" name="getSynchronizationTimeStamp" references="true" stamp="1182560473732" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.setSyncTimeStamp(...)' to 'setSynchronizationTimeStamp' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.setSyncTimeStamp(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.setSynchronizationTimeStamp(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setSyncTimeStamp'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~setSyncTimeStamp~QString;" name="setSynchronizationTimeStamp" references="true" stamp="1182560548508" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.useDefaultProxy()' to 'isDefaultProxyEnabled' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.useDefaultProxy()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.isDefaultProxyEnabled()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'useDefaultProxy'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~useDefaultProxy" name="isDefaultProxyEnabled" references="true" stamp="1182560613027" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryFilter.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskRepositoryFilter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182560684730" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.setSyncTime(...)' to 'setSynchronizationTime' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.setSyncTime(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.setSynchronizationTime(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setSyncTime'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~setSyncTime~QTaskRepository;~QString;~QString;" name="setSynchronizationTime" references="true" stamp="1182560810469" version="1.0"/>
+<refactoring comment="Rename field 'repository_login_failure' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'repositoryLoginFailure' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repository_login_failure' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repositoryLoginFailure' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repository_login_failure'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^repository_login_failure" name="repositoryLoginFailure" references="true" setter="false" stamp="1182560844451" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.getKind()' to 'getConnectorKind' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getKind()' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getConnectorKind()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getKind'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~getKind" name="getConnectorKind" references="true" stamp="1182560898348" version="1.0"/>
+<refactoring comment="Rename field 'repository_not_found' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'repositoryNotFound' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repository_not_found' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repositoryNotFound' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repository_not_found'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^repository_not_found" name="repositoryNotFound" references="true" setter="false" stamp="1182560910935" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'repository_comment_reqd' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'repositoryCommentReqd' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repository_comment_reqd' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repositoryCommentReqd' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repository_comment_reqd'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^repository_comment_reqd" name="repositoryCommentReqd" references="true" setter="false" stamp="1182560917410" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'repository_collision' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'repositoryCollision' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repository_collision' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repositoryCollision' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repository_collision'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^repository_collision" name="repositoryCollision" references="true" setter="false" stamp="1182560921078" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'operation_cancelled' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'operationCancelled' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.operation_cancelled' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.operationCancelled' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'operation_cancelled'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^operation_cancelled" name="operationCancelled" references="true" setter="false" stamp="1182560924802" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'network_error' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'networkError' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.network_error' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.networkError' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'network_error'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^network_error" name="networkError" references="true" setter="false" stamp="1182560938418" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'networkError' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'errorNetwork' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.networkError' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.errorNetwork' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'networkError'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^networkError" name="errorNetwork" references="true" setter="false" stamp="1182560948865" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'io_error' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'errorIo' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.io_error' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.errorIo' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'io_error'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^io_error" name="errorIo" references="true" setter="false" stamp="1182560954868" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'internal_error' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'errorInternal' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.internal_error' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.errorInternal' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'internal_error'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^internal_error" name="errorInternal" references="true" setter="false" stamp="1182560978223" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'repository_error' in 'org.eclipse.mylyn.tasks.core.TasksMessages' to 'errorRepository' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.repository_error' - Renamed element: 'org.eclipse.mylyn.tasks.core.TasksMessages.errorRepository' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repository_error'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java[TasksMessages^repository_error" name="errorRepository" references="true" setter="false" stamp="1182560986377" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core' - Original element: 'org.eclipse.mylyn.tasks.core.TasksMessages.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.bugzilla.core" element1="/src<org.eclipse.mylyn.tasks.core{TasksMessages.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182561124679" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core' - Original element: 'MylarMessages.properties'" description="Move file" destination="/src<org.eclipse.mylyn.internal.bugzilla.core" element1="src/org/eclipse/mylyn/tasks/core/MylarMessages.properties" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182561154446" units="0" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core' - Original element: 'org.eclipse.mylyn.tasks.core.UnrecognizedReponseException.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.bugzilla.core" element1="/src<org.eclipse.mylyn.tasks.core{UnrecognizedReponseException.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182561256130" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.IRepositoryConstants.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{IRepositoryConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562505658" units="1" version="1.0"/>
+<refactoring comment="Rename field 'PROPERTY_KIND' in 'org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants' to 'PROPERTY_CONNECTOR_KIND' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants.PROPERTY_KIND' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants.PROPERTY_CONNECTOR_KIND' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PROPERTY_KIND'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{IRepositoryConstants.java[IRepositoryConstants^PROPERTY_KIND" name="PROPERTY_CONNECTOR_KIND" references="true" setter="false" stamp="1182562520129" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.addChild(...)' to 'internalAddChild' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.addChild(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.internalAddChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addChild'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~addChild~QAbstractTask;" name="internalAddChild" references="true" stamp="1182567482153" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.removeChild(...)' to 'internalRemoveChild' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.removeChild(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.internalRemoveChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'removeChild'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~removeChild~QAbstractTask;" name="internalRemoveChild" references="true" stamp="1182567491124" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.notifyRepositorySettingsChagned(...)' to 'notifyRepositorySettingsChanged' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.notifyRepositorySettingsChagned(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.notifyRepositorySettingsChanged(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifyRepositorySettingsChagned'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~notifyRepositorySettingsChagned~QTaskRepository;" name="notifyRepositorySettingsChanged" references="true" stamp="1182574310164" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..22beffd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,110 @@
+1182093894562 Rename method 'removeTaskDataState'
+1182116742640 Delete element
+1182202763890 Change method 'setNewTaskData'
+1182202887281 Change method 'setOldTaskData'
+1182217422437 Rename method 'getHits'
+1182230640031 Rename type 'ITaskDataHandler'
+1182289410531 Rename method 'getTaskData'
+1182301501110 Rename field 'delegateExternalizers'
+1182301523048 Rename type 'ITaskListExternalizer'
+1182301533417 Rename field 'taskListFactories'
+1182301658360 Move members
+1182301717746 Move member 'KEY_LAST_REFRESH'
+1182301753897 Move member 'KEY_NAME'
+1182301763918 Move member 'KEY_QUERY_STRING'
+1182301774583 Move member 'KEY_REPOSITORY_URL'
+1182302715716 Rename method 'readQuery'
+1182304657623 Move member 'KEY_TASK'
+1182304671703 Rename type 'ITaskListElementFactory'
+1182387004194 Move compilation unit
+1182395094439 Change method 'createQuery'
+1182395802622 Change method 'createTask'
+1182400185437 Rename type 'AbstractTaskListElementFactory'
+1182400222111 Rename type 'LocalTaskExternalizer'
+1182400665770 Move compilation unit
+1182409667932 Rename method 'canCreateElementFor'
+1182409703979 Rename method 'getQueryTagNameForElement'
+1182409722330 Rename method 'getElementName'
+1182409728195 Rename method 'getTaskTagName'
+1182409741793 Rename method 'getQueryTagNames'
+1182409793791 Change method 'createQuery'
+1182409835482 Rename method 'canCreateElementFor'
+1182549598545 Rename method 'getIsHidden'
+1182550182134 Delete element
+1182550640520 Move member 'MYLAR_CONTEXT_DESCRIPTION'
+1182550648037 Move member 'MYLAR_CONTEXT_FILENAME'
+1182550656335 Move member 'MYLAR_CONTEXT_DESCRIPTION_LEGACY'
+1182550671162 Move member 'MESSAGE_ATTACHMENTS_NOT_SUPPORTED'
+1182551938473 Rename method 'getTaskWebUrl'
+1182551978110 Rename method 'repositoryPropertyNames'
+1182552155546 Rename method 'getRepositoryType'
+1182552197748 Rename method 'setCurrentlySynchronizing'
+1182552206215 Rename local variable 'currentlySynchronizing'
+1182552210993 Rename field 'currentlySynchronizing'
+1182552231976 Rename field 'lastRefreshTimeStamp'
+1182552241651 Rename method 'getLastRefreshTimeStamp'
+1182552251286 Rename method 'setLastRefreshTimeStamp'
+1182552329463 Rename method 'getStatus'
+1182552343252 Rename method 'setStatus'
+1182552400409 Delete element
+1182552547950 Rename method 'getRepositoryKind'
+1182552606002 Rename field 'lastSynchronizedDateStamp'
+1182552613584 Rename field 'lastReadTimeDateStamp'
+1182552631061 Rename local variable 'lastSyncDateStamp'
+1182552647035 Rename method 'getLastSyncDateStamp'
+1182552706973 Rename method 'setKind'
+1182552714148 Rename field 'kind'
+1182552808827 Rename method 'getStatus'
+1182552819586 Rename method 'setStatus'
+1182552826815 Rename field 'errorStatus'
+1182552859076 Rename method 'getSyncState'
+1182552867630 Rename field 'syncState'
+1182552879485 Rename method 'setSyncState'
+1182552895261 Rename method 'setCurrentlySynchronizing'
+1182552899769 Rename field 'currentlySynchronizing'
+1182552905631 Rename local variable 'currentlySychronizing'
+1182552946024 Rename method 'hasBeenReminded'
+1182552951593 Rename field 'hasReminded'
+1182553082437 Rename method 'setLastSyncDateStamp'
+1182554506134 Rename method 'setTaskUrl'
+1182554537742 Rename method 'getTaskUrl'
+1182554666948 Rename method 'setDescription'
+1182555118534 Delete element
+1182555361695 Rename method 'getTaskFullUrl'
+1182555621055 Rename method 'getTaskHits'
+1182555951301 Delete element
+1182556057099 Move compilation unit
+1182556366584 Rename method 'getCC'
+1182556464689 Rename method 'removeCC'
+1182556526291 Move compilation unit
+1182559603062 Move compilation unit
+1182559811314 Rename method 'setLastTaskNum'
+1182559817115 Rename field 'lastTaskNum'
+1182559825199 Rename method 'getNextTaskNum'
+1182559840765 Rename method 'getLastTaskNum'
+1182559854460 Rename method 'findLargestTaskHandle'
+1182560398760 Rename method 'largestTaskHandleHelper'
+1182560473732 Rename method 'getSyncTimeStamp'
+1182560548508 Rename method 'setSyncTimeStamp'
+1182560613027 Rename method 'useDefaultProxy'
+1182560684730 Move compilation unit
+1182560810469 Rename method 'setSyncTime'
+1182560844451 Rename field 'repository_login_failure'
+1182560898348 Rename method 'getKind'
+1182560910935 Rename field 'repository_not_found'
+1182560917410 Rename field 'repository_comment_reqd'
+1182560921078 Rename field 'repository_collision'
+1182560924802 Rename field 'operation_cancelled'
+1182560938418 Rename field 'network_error'
+1182560948865 Rename field 'networkError'
+1182560954868 Rename field 'io_error'
+1182560978223 Rename field 'internal_error'
+1182560986377 Rename field 'repository_error'
+1182561124679 Move compilation unit
+1182561154446 Move file
+1182561256130 Move compilation unit
+1182562505658 Move compilation unit
+1182562520129 Rename field 'PROPERTY_KIND'
+1182567482153 Rename method 'addChild'
+1182567491124 Rename method 'removeChild'
+1182574310164 Rename method 'notifyRepositorySettingsChagned'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..6b59fd7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'handle' in 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer' to 'handleIdentifier' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.handle' - Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.handleIdentifier' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'handle'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer^handle" name="handleIdentifier" references="true" setter="false" stamp="1182735165474" textual="false" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740840937" target="/org.eclipse.mylyn.aspectj/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740844558" target="/org.eclipse.mylyn.bugzilla.core/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740852710" target="/org.eclipse.mylyn.bugzilla.ide/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740862824" target="/org.eclipse.mylyn.bugzilla.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740867692" target="/org.eclipse.mylyn.bugzilla.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740876920" target="/org.eclipse.mylyn.context.core/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740882784" target="/org.eclipse.mylyn.context.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740887817" target="/org.eclipse.mylyn.context.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740894639" target="/org.eclipse.mylyn.examples.monitor.study/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740904631" target="/org.eclipse.mylyn.help.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740912688" target="/org.eclipse.mylyn.ide.ant/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740917067" target="/org.eclipse.mylyn.ide.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740922271" target="/org.eclipse.mylyn.ide.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740929864" target="/org.eclipse.mylyn.java.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740936398" target="/org.eclipse.mylyn.java.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740942902" target="/org.eclipse.mylyn.jira.core/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740946278" target="/org.eclipse.mylyn.jira.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740951433" target="/org.eclipse.mylyn.jira.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740958357" target="/org.eclipse.mylyn.monitor.core/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740961956" target="/org.eclipse.mylyn.monitor.reports/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740967175" target="/org.eclipse.mylyn.monitor.server/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740970852" target="/org.eclipse.mylyn.monitor.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740975852" target="/org.eclipse.mylyn.monitor.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740980241" target="/org.eclipse.mylyn.monitor.usage/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740985701" target="/org.eclipse.mylyn.pde.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740992980" target="/org.eclipse.mylyn.resources.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182740997076" target="/org.eclipse.mylyn.resources.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741002206" target="/org.eclipse.mylyn.sandbox.dev/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741008980" target="/org.eclipse.mylyn.sandbox.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741013055" target="/org.eclipse.mylyn.sandbox.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741021276" target="/org.eclipse.mylyn.tasks.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741027078" target="/org.eclipse.mylyn.tasks.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741031845" target="/org.eclipse.mylyn.team.cvs/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741035877" target="/org.eclipse.mylyn.team.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741041036" target="/org.eclipse.mylyn.team.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741044784" target="/org.eclipse.mylyn.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741049511" target="/org.eclipse.mylyn.trac.core/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741053331" target="/org.eclipse.mylyn.trac.tests/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741059852" target="/org.eclipse.mylyn.trac.ui/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741063745" target="/org.eclipse.mylyn.web.core/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741068658" target="/org.eclipse.mylyn.web.tasks/.settings" units="0" version="1.0"/>
+<refactoring comment="Copy 7 elements(s) to '.settings' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: '.settings' - Original elements: org.eclipse.mylyn.tasks.ui.prefs org.eclipse.jdt.core.prefs org.eclipse.jdt.ui.prefs org.eclipse.pde.prefs org.eclipse.ltk.core.refactoring.prefs org.eclipse.mylar.tasklist.prefs org.eclipse.mylyn.tasklist.prefs" description="Copy files" element1=".settings/org.eclipse.mylyn.tasks.ui.prefs" element2=".settings/org.eclipse.jdt.core.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.pde.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.mylar.tasklist.prefs" element7=".settings/org.eclipse.mylyn.tasklist.prefs" files="7" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log=".settings/org.eclipse.mylyn.tasks.ui.prefs	true	false .settings/org.eclipse.jdt.core.prefs	true	false .settings/org.eclipse.jdt.ui.prefs	true	false .settings/org.eclipse.pde.prefs	true	false .settings/org.eclipse.mylar.tasklist.prefs	true	false .settings/org.eclipse.ltk.core.refactoring.prefs	true	false .settings/org.eclipse.mylyn.tasklist.prefs	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182741072563" target="/org.eclipse.mylyn.web.ui/.settings" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..e7b80cd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1,43 @@
+1182735165474 Rename field 'handle'
+1182740840937 Copy files
+1182740844558 Copy files
+1182740852710 Copy files
+1182740862824 Copy files
+1182740867692 Copy files
+1182740876920 Copy files
+1182740882784 Copy files
+1182740887817 Copy files
+1182740894639 Copy files
+1182740904631 Copy files
+1182740912688 Copy files
+1182740917067 Copy files
+1182740922271 Copy files
+1182740929864 Copy files
+1182740936398 Copy files
+1182740942902 Copy files
+1182740946278 Copy files
+1182740951433 Copy files
+1182740958357 Copy files
+1182740961956 Copy files
+1182740967175 Copy files
+1182740970852 Copy files
+1182740975852 Copy files
+1182740980241 Copy files
+1182740985701 Copy files
+1182740992980 Copy files
+1182740997076 Copy files
+1182741002206 Copy files
+1182741008980 Copy files
+1182741013055 Copy files
+1182741021276 Copy files
+1182741027078 Copy files
+1182741031845 Copy files
+1182741035877 Copy files
+1182741041036 Copy files
+1182741044784 Copy files
+1182741049511 Copy files
+1182741053331 Copy files
+1182741059852 Copy files
+1182741063745 Copy files
+1182741068658 Copy files
+1182741072563 Copy files
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/8/35/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/8/35/refactorings.history
new file mode 100644
index 0000000..a8a2b12
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/8/35/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1188173810687" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskActivityUtil.isAfterThisWeek(...)' to 'isAfterCurrentWeek' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskActivityUtil.isAfterThisWeek(...)' - Renamed element: 'org.eclipse.mylyn.tasks.core.TaskActivityUtil.isAfterCurrentWeek(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isAfterThisWeek'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskActivityUtil.java[TaskActivityUtil~isAfterThisWeek~QCalendar;" name="isAfterCurrentWeek" references="true" stamp="1188250795531" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core' - Original element: 'org.eclipse.mylyn.tasks.core.TaskActivityUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskActivityUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1188272969328" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/8/35/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/8/35/refactorings.index
new file mode 100644
index 0000000..54635e9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/8/35/refactorings.index
@@ -0,0 +1,3 @@
+1188173810687 Delete element
+1188250795531 Rename method 'isAfterThisWeek'
+1188272969328 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/36/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/36/refactorings.history
new file mode 100644
index 0000000..b3ae09a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/36/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isScheduledForLater(...)' to 'isScheduledForFuture' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isScheduledForLater(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isScheduledForFuture(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isScheduledForLater'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isScheduledForLater~QAbstractTask;" name="isScheduledForFuture" references="true" stamp="1188947622703" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/36/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/36/refactorings.index
new file mode 100644
index 0000000..307cf1b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/36/refactorings.index
@@ -0,0 +1 @@
+1188947622703 Rename method 'isScheduledForLater'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/37/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/37/refactorings.history
new file mode 100644
index 0000000..0f7b2ab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core' - Original project: 'org.eclipse.mylyn.tasks.core' - Original element: 'TaskList.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/tasks/core/TaskList.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1189543085031" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/37/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/37/refactorings.index
new file mode 100644
index 0000000..247b52b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/37/refactorings.index
@@ -0,0 +1 @@
+1189543085031 Delete element
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/38/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/38/refactorings.history
new file mode 100644
index 0000000..ba3d7bc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/38/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryFilter' to 'ITaskRepositoryFilter'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryFilter'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskRepositoryFilter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryFilter.java[TaskRepositoryFilter" matchStrategy="1" name="ITaskRepositoryFilter" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190318598274" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/38/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/38/refactorings.index
new file mode 100644
index 0000000..f5c285d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/38/refactorings.index
@@ -0,0 +1 @@
+1190318598274 Rename type 'TaskRepositoryFilter'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..b7701a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private boolean containsHelper(String handle)' from 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.contains()' to 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'containsHelper'
- Destination type: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'
- Declared visibility: 'private'" comments="false" description="Extract method 'containsHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java" name="containsHelper" replace="false" selection="1952 275" stamp="1190672212402" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..cfd8d28
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1 @@
+1190672212402 Extract method 'containsHelper'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/4/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/4/refactorings.history
new file mode 100644
index 0000000..e92bce5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/4/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.UnfiledCategory' to 'UncategorizedContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UnfiledCategory'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.UncategorizedContainer'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'UnfiledCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{UnfiledCategory.java[UnfiledCategory" matchStrategy="1" name="UncategorizedContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1201041169876" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.OrphanedTasksContainer' to 'UnmatchedContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.OrphanedTasksContainer'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.UnmatchedContainer'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'OrphanedTasksContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{OrphanedTasksContainer.java[OrphanedTasksContainer" matchStrategy="1" name="UnmatchedContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1201041192378" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.UnmatchedContainer' to 'UnmatchedTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UnmatchedContainer'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'UnmatchedContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{UnmatchedContainer.java[UnmatchedContainer" matchStrategy="1" name="UnmatchedTaskContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1201041205691" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.UncategorizedContainer' to 'UncategorizedTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UncategorizedContainer'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'UncategorizedContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{UncategorizedContainer.java[UncategorizedContainer" matchStrategy="1" name="UncategorizedTaskContainer" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1201041236005" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.isFloatingScheduledDate()' to 'internalIsFloatingScheduledDate'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.isFloatingScheduledDate()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.internalIsFloatingScheduledDate()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isFloatingScheduledDate'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isFloatingScheduledDate" name="internalIsFloatingScheduledDate" references="true" stamp="1201239812853" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.setFloatingScheduledDate(...)' to 'internalSetFloatingScheduledDate'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.setFloatingScheduledDate(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.internalSetFloatingScheduledDate(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setFloatingScheduledDate'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setFloatingScheduledDate~Z" name="internalSetFloatingScheduledDate" references="true" stamp="1201239824237" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/4/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/4/refactorings.index
new file mode 100644
index 0000000..78572c4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/4/refactorings.index
@@ -0,0 +1,6 @@
+1201041169876 Rename type 'UnfiledCategory'
+1201041192378 Rename type 'OrphanedTasksContainer'
+1201041205691 Rename type 'UnmatchedContainer'
+1201041236005 Rename type 'UncategorizedContainer'
+1201239812853 Rename method 'isFloatingScheduledDate'
+1201239824237 Rename method 'setFloatingScheduledDate'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/5/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/5/refactorings.history
new file mode 100644
index 0000000..caf4eee
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/5/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void isScheduledForThisWeek(Date reminder)' from 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isScheduledForThisWeek()' to 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'isScheduledForThisWeek'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager'
- Declared visibility: 'private'" comments="false" description="Extract method 'isScheduledForThisWeek'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java" name="isScheduledForThisWeek" replace="false" selection="17380 158" stamp="1201634686622" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void isScheduledForFuture(Date reminder)' from 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isScheduledForFuture()' to 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'isScheduledForFuture'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager'
- Declared visibility: 'private'" comments="false" description="Extract method 'isScheduledForFuture'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java" name="isScheduledForFuture" replace="false" selection="17210 153" stamp="1201634986769" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/5/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/5/refactorings.index
new file mode 100644
index 0000000..b8719fc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/1/5/refactorings.index
@@ -0,0 +1,2 @@
+1201634686622 Extract method 'isScheduledForThisWeek'
+1201634986769 Extract method 'isScheduledForFuture'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..f0b2891
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.java'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.java'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core{WeekDateRange.java" element1="/src<org.eclipse.mylyn.internal.tasks.core{WeekDateRange.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1222880741189" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'tasks'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'tasks'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory.java'" description="Move compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractTaskListFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1223000802835" target="/org.eclipse.mylyn/developer/src-old/tasks" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1223000811143" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..78d4ff4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1,3 @@
+1222880741189 Copy compilation unit
+1223000802835 Move compilation unit
+1223000811143 Delete element
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/11/45/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/11/45/refactorings.history
new file mode 100644
index 0000000..84d6e10
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/11/45/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'TYPE_TIMESTAMP' in 'org.eclipse.mylyn.tasks.core.data.TaskAttribute' to 'TYPE_DATETIME'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.TYPE_TIMESTAMP'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.TYPE_DATETIME'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TYPE_TIMESTAMP'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute^TYPE_TIMESTAMP" name="TYPE_DATETIME" references="true" setter="false" stamp="1225740051259" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.bugzilla.core/src/org.eclipse.mylyn.internal.bugzilla.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.BugzillaFlagMapper.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.bugzilla.core/src<org.eclipse.mylyn.internal.bugzilla.core" element1="/src<org.eclipse.mylyn.tasks.core.data{BugzillaFlagMapper.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1226060100716" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/11/45/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/11/45/refactorings.index
new file mode 100644
index 0000000..db56b86
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/11/45/refactorings.index
@@ -0,0 +1,2 @@
+1225740051259 Rename field 'TYPE_TIMESTAMP'
+1226060100716 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/2/7/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/2/7/refactorings.history
new file mode 100644
index 0000000..d226e7b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/2/7/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.core.TaskSelection.IdentityAttributeFactory.ABSTRACT_ATTRIBUTE_MAPPER' from expression 'new AbstractAttributeMapper(this){@Override public String getType(RepositoryTaskAttribute taskAttribute){return RepositoryTaskAttribute.TYPE_SHORT_TEXT;}}'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'ABSTRACT_ATTRIBUTE_MAPPER'
- Constant expression: 'new AbstractAttributeMapper(this){@Override public String getType(RepositoryTaskAttribute taskAttribute){return RepositoryTaskAttribute.TYPE_SHORT_TEXT;}}'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ABSTRACT_ATTRIBUTE_MAPPER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.core{TaskSelection.java" name="ABSTRACT_ATTRIBUTE_MAPPER" qualify="false" replace="true" selection="2566 184" stamp="1203033299127" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'attributeMapper' from expression 'taskData.getAttributeFactory().getAttributeMapper()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'attributeMapper'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.DefaultTaskSchema.setValue()'
- Variable expression: 'taskData.getAttributeFactory().getAttributeMapper()'
- Replace occurrences of expression with variable" description="Extract local variable 'attributeMapper'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core{DefaultTaskSchema.java" name="attributeMapper" replace="true" selection="3978 51" stamp="1203041581217" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/2/7/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/2/7/refactorings.index
new file mode 100644
index 0000000..601f3a3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/2/7/refactorings.index
@@ -0,0 +1,2 @@
+1203033299127 Extract constant 'ABSTRACT_ATTRIBUTE_MAPPER'
+1203041581217 Extract local variable 'attributeMapper'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/13/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/13/refactorings.history
new file mode 100644
index 0000000..9e53d54
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/13/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractTask.getEstimateTimeHours()' to 'getEstimatedTimeHours'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getEstimateTimeHours()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.getEstimatedTimeHours()'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'getEstimateTimeHours'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getEstimateTimeHours" name="getEstimatedTimeHours" references="true" stamp="1206641945024" version="1.0"/>
<refactoring comment="Move 3 element(s) to 'org.eclipse.mylyn.internal.context.ui.ContextUiUtil'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.internal.context.ui.ContextUiUtil'
- Original elements:
 org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler.getContextAttachments(...)
 org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler.hasRepositoryContext(...)
 org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler.retrieveContext(...)
- Textual move only" description="Move methods" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui{ContextUiUtil.java[ContextUiUtil" element1="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler~getContextAttachments~QTaskRepository;~QAbstractTask;" element2="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler~hasRepositoryContext~QTaskRepository;~QAbstractTask;" element3="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java[AbstractAttachmentHandler~retrieveContext~QTaskRepository;~QAbstractTask;~QRepositoryAttachment;~QString;~QIProgressMonitor;" flags="589830" id="org.eclipse.jdt.ui.move" members="3" policy="org.eclipse.jdt.ui.moveMembers" stamp="1206835584399" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getInstance()' to 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getInstance()'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin'" delegate="true" deprecate="true" description="Move member 'getInstance'" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getInstance" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" stamp="1206843348771" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/13/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/13/refactorings.index
new file mode 100644
index 0000000..cc639fa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/13/refactorings.index
@@ -0,0 +1,3 @@
+1206641945024 Rename method 'getEstimateTimeHours'
+1206835584399 Move methods
+1206843348771 Move member 'getInstance'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/14/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/14/refactorings.history
new file mode 100644
index 0000000..7f31442
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getRepositoryKind()' to 'getConnectorKind'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getRepositoryKind()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getConnectorKind()'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'getRepositoryKind'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData~getRepositoryKind" name="getConnectorKind" references="true" stamp="1206943552016" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/14/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/14/refactorings.index
new file mode 100644
index 0000000..5ea3875
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/3/14/refactorings.index
@@ -0,0 +1 @@
+1206943552016 Rename method 'getRepositoryKind'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..ed2f575
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getInstance()' to 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getInstance()'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin'" delegate="false" deprecate="true" description="Move member 'getInstance'" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getInstance" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" stamp="1207014956530" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskCollector' to 'AbstractTaskCollector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskCollector'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTaskCollector'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ITaskCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskCollector.java[ITaskCollector" matchStrategy="1" name="AbstractTaskCollector" qualified="false" references="true" similarDeclarations="false" stamp="1207439635477" textual="false" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.tasks.core.TaskSelection.IdentityAttributeFactory' in 'org.eclipse.mylyn.tasks.core.TaskSelection' to top level type
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskSelection.IdentityAttributeFactory'
- Field name: 'taskSelection'
- Declare field 'final'" description="Convert member type 'IdentityAttributeFactory' to top level" field="false" fieldName="taskSelection" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.tasks.core{TaskSelection.java[TaskSelection[IdentityAttributeFactory" mandatory="false" possible="false" stamp="1207441276752" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.DefaultTaskSchema.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{DefaultTaskSchema.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207441484263" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getId()' to 'getTaskId'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getId()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getTaskId()'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'getId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData~getId" name="getTaskId" references="true" stamp="1207444032366" version="1.0"/>
<refactoring comment="Extract method 'private void updateTask(AbstractTask task)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob.updateFromRepository()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'updateTask'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeTasksJob.java" name="updateTask" replace="false" selection="6541 308" stamp="1207448654927" version="1.0" visibility="2"/>
<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.QueryHitCollector.MAX_HITS' to 'org.eclipse.mylyn.tasks.core.AbstractTaskCollector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.QueryHitCollector.MAX_HITS'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.tasks.core.AbstractTaskCollector'" delegate="true" deprecate="true" description="Move member 'MAX_HITS'" element1="/src<org.eclipse.mylyn.tasks.core{QueryHitCollector.java[QueryHitCollector^MAX_HITS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskCollector.java[AbstractTaskCollector" stamp="1207458672937" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskCoreUtil.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{TaskCoreUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207459631084" subPackages="false" version="1.0"/>


<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.preSynchronization(TaskRepository repository, SynchronizationEvent event, IProgressMonitor monitor) throws CoreException' to 'public void preSynchronization(SynchronizationEvent event, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.preSynchronization(...)'
- Removed parameters:
 TaskRepository repository" delegate="false" deprecate="true" description="Change method 'preSynchronization'" element1="/\/usr\/local\/eclipse-3.4M6\/plugins\/org.eclipse.equinox.common_3.4.0.v20080320.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~preSynchronization~QTaskRepository;~QSynchronizationEvent;~QIProgressMonitor;" kind1="0" name="preSynchronization" parameter1="TaskRepository repository 0 {deleted} {deleted} true" parameter2="SynchronizationEvent event 1 SynchronizationEvent event false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1207461106897" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.postSynchronization(TaskRepository repository, SynchronizationEvent event, IProgressMonitor monitor) throws CoreException' to 'public void postSynchronization(SynchronizationEvent event, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.postSynchronization(...)'
- Removed parameters:
 TaskRepository repository" delegate="false" deprecate="true" description="Change method 'postSynchronization'" element1="/\/usr\/local\/eclipse-3.4M6\/plugins\/org.eclipse.equinox.common_3.4.0.v20080320.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~postSynchronization~QTaskRepository;~QSynchronizationEvent;~QIProgressMonitor;" kind1="0" name="postSynchronization" parameter1="TaskRepository repository 0 {deleted} {deleted} true" parameter2="SynchronizationEvent event 1 SynchronizationEvent event false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1207461118363" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateTaskFromTaskData(TaskRepository repository, AbstractTask repositoryTask, RepositoryTaskData taskData)' to 'public boolean updateTaskFromTaskData(TaskRepository repository, AbstractTask repositoryTask, RepositoryTaskData taskData)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateTaskFromTaskData(...)'
- New return type: 'boolean'" delegate="false" deprecate="true" description="Change method 'updateTaskFromTaskData'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateTaskFromTaskData~QTaskRepository;~QAbstractTask;~QRepositoryTaskData;" name="updateTaskFromTaskData" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="AbstractTask repositoryTask 1 AbstractTask repositoryTask false" parameter3="RepositoryTaskData taskData 2 RepositoryTaskData taskData false" return="boolean" stamp="1207468326145" version="1.0"/>
<refactoring comment="Change method 'public IStatus org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.performQuery(TaskRepository repository, AbstractRepositoryQuery query, AbstractTaskCollector resultCollector, IProgressMonitor monitor)' to 'public IStatus performQuery(TaskRepository repository, AbstractRepositoryQuery query, AbstractTaskCollector resultCollector, SynchronizationEvent event, IProgressMonitor monitor)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.performQuery(...)'
- Added parameters:
 SynchronizationEvent event" default4="null" delegate="false" deprecate="true" description="Change method 'performQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~performQuery~QAbstractRepositoryQuery;~QTaskRepository;~QIProgressMonitor;~QAbstractTaskCollector;" name="performQuery" parameter1="TaskRepository repository 1 TaskRepository repository false" parameter2="AbstractRepositoryQuery query 0 AbstractRepositoryQuery query false" parameter3="AbstractTaskCollector resultCollector 3 AbstractTaskCollector resultCollector false" parameter4="{added} {added} -1 SynchronizationEvent event false" parameter5="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1207468613694" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..4d539ef
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1,12 @@
+1207014956530 Move member 'getInstance'
+1207439635477 Rename type 'ITaskCollector'
+1207441276752 Convert member type 'IdentityAttributeFactory' to top level
+1207441484263 Move compilation unit
+1207444032366 Rename method 'getId'
+1207448654927 Extract method 'updateTask'
+1207458672937 Move member 'MAX_HITS'
+1207459631084 Delete element
+1207461106897 Change method 'preSynchronization'
+1207461118363 Change method 'postSynchronization'
+1207468326145 Change method 'updateTaskFromTaskData'
+1207468613694 Change method 'performQuery'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..9e921f8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getTaskId()' to 'getId'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getTaskId()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getId()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData~getTaskId" name="getId" references="true" stamp="1207601851860" version="1.0"/>
<refactoring comment="Rename field 'complete' in 'org.eclipse.mylyn.tasks.core.RepositoryTaskData' to 'partial'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.complete'
- Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.partial'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'complete'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData^complete" name="partial" references="true" setter="true" stamp="1207605175878" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.getUrl()' to 'getRepositoryUrl'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getUrl()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getRepositoryUrl()'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'getUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~getUrl" name="getRepositoryUrl" references="true" stamp="1207608833210" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.setUrl(...)' to 'setRepositoryUrl'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.setUrl(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.setRepositoryUrl(...)'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'setUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~setUrl~QString;" name="setRepositoryUrl" references="true" stamp="1207608852755" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getId()' to 'getTaskId'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getId()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.getTaskId()'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'getId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java[RepositoryTaskData~getId" name="getTaskId" references="true" stamp="1207608894954" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.AbstractAttributeMapper.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{AbstractAttributeMapper.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207718090629" units="1" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.ITaskDataManager' from 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.ITaskDataManager'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.TaskDataManager.getNewTaskData(...)
- Use super type where possible" comments="true" description="Extract interface 'ITaskDataManager'" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java[TaskDataManager~getNewTaskData~QString;~QString;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java[TaskDataManager" instanceof="false" name="ITaskDataManager" public="true" replace="true" stamp="1207719498799" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskDataManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{ITaskDataManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207719533170" units="1" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.sync.IRepositorySynchronizationManager' from 'org.eclipse.mylyn.internal.tasks.core.sync.RepositorySynchronizationManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.sync.RepositorySynchronizationManager'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.sync.IRepositorySynchronizationManager'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.sync.RepositorySynchronizationManager.saveIncoming(...)
- Use super type where possible" comments="true" description="Extract interface 'IRepositorySynchronizationManager'" element1="/src<org.eclipse.mylyn.internal.tasks.core.sync{RepositorySynchronizationManager.java[RepositorySynchronizationManager~saveIncoming~QAbstractTask;~QRepositoryTaskData;~Z" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{RepositorySynchronizationManager.java[RepositorySynchronizationManager" instanceof="false" name="IRepositorySynchronizationManager" public="true" replace="true" stamp="1207719697254" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.sync'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.sync'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.sync.IRepositorySynchronizationManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.sync" element1="/src<org.eclipse.mylyn.internal.tasks.core.sync{IRepositorySynchronizationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.tasks.core	/src<org.eclipse.mylyn.tasks.core.sync" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207719713614" units="1" version="1.0"/>
<refactoring comment="Extract method 'private void updateRepositoryConfiguration(final TaskRepository repository,AbstractRepositoryConnector connector,Set<AbstractRepositoryQuery> queries)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob.run()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'updateRepositoryConfiguration'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateRepositoryConfiguration'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeRepositoriesJob.java" name="updateRepositoryConfiguration" replace="false" selection="3059 1270" stamp="1207786742888" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void updateRepositoryConfiguration(IProgressMonitor monitor,final TaskRepository repository,final AbstractRepositoryConnector connector) throws InterruptedException ' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob.run()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'updateRepositoryConfiguration'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateRepositoryConfiguration'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeRepositoriesJob.java" name="updateRepositoryConfiguration" replace="false" selection="3091 777" stamp="1207787651018" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'value' from expression 'getValue(RepositoryTaskAttribute.PRIORITY)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'value'
- Destination method: 'org.eclipse.mylyn.tasks.core.DefaultTaskSchema.getPriority()'
- Variable expression: 'getValue(RepositoryTaskAttribute.PRIORITY)'" description="Extract local variable 'value'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.core{DefaultTaskSchema.java" name="value" replace="false" selection="3270 42" stamp="1207794313227" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.preSynchronization(SynchronizationEvent event, IProgressMonitor monitor) throws CoreException' to 'public void preSynchronization(AbstractTaskCollector resultCollector, SynchronizationEvent event, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.preSynchronization(...)'
- Added parameters:
 AbstractTaskCollector resultCollector" default1="abc" delegate="false" deprecate="true" description="Change method 'preSynchronization'" element1="=org.eclipse.mylyn.web.tasks/\/usr\/local\/eclipse-3.4M6-20080408\/plugins\/org.eclipse.equinox.common_3.4.0.v20080407.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~preSynchronization~QSynchronizationEvent;~QIProgressMonitor;" kind1="0" name="preSynchronization" parameter1="{added} {added} -1 AbstractTaskCollector resultCollector false" parameter2="SynchronizationEvent event 0 SynchronizationEvent event false" parameter3="IProgressMonitor monitor 1 IProgressMonitor monitor false" stamp="1207796810220" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.postSynchronization(SynchronizationEvent event, IProgressMonitor monitor) throws CoreException' to 'public void postSynchronization(AbstractTaskCollector resultCollector, SynchronizationEvent event, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.postSynchronization(...)'
- Added parameters:
 AbstractTaskCollector resultCollector" default1="abc" delegate="false" deprecate="true" description="Change method 'postSynchronization'" element1="=org.eclipse.mylyn.web.tasks/\/usr\/local\/eclipse-3.4M6-20080408\/plugins\/org.eclipse.equinox.common_3.4.0.v20080407.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~postSynchronization~QSynchronizationEvent;~QIProgressMonitor;" kind1="0" name="postSynchronization" parameter1="{added} {added} -1 AbstractTaskCollector resultCollector false" parameter2="SynchronizationEvent event 0 SynchronizationEvent event false" parameter3="IProgressMonitor monitor 1 IProgressMonitor monitor false" stamp="1207796840239" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.preSynchronization(AbstractTaskCollector resultCollector, SynchronizationEvent event, IProgressMonitor monitor) throws CoreException' to 'public void preSynchronization(SynchronizationEvent event, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.preSynchronization(...)'
- Removed parameters:
 AbstractTaskCollector resultCollector" delegate="false" deprecate="true" description="Change method 'preSynchronization'" element1="=org.eclipse.mylyn.web.tasks/\/usr\/local\/eclipse-3.4M6-20080408\/plugins\/org.eclipse.equinox.common_3.4.0.v20080407.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~preSynchronization~QAbstractTaskCollector;~QSynchronizationEvent;~QIProgressMonitor;" kind1="0" name="preSynchronization" parameter1="AbstractTaskCollector resultCollector 0 {deleted} {deleted} true" parameter2="SynchronizationEvent event 1 SynchronizationEvent event false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1207797394303" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.postSynchronization(AbstractTaskCollector resultCollector, SynchronizationEvent event, IProgressMonitor monitor) throws CoreException' to 'public void postSynchronization(SynchronizationEvent event, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.postSynchronization(...)'
- Removed parameters:
 AbstractTaskCollector resultCollector" delegate="false" deprecate="true" description="Change method 'postSynchronization'" element1="=org.eclipse.mylyn.web.tasks/\/usr\/local\/eclipse-3.4M6-20080408\/plugins\/org.eclipse.equinox.common_3.4.0.v20080407.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~postSynchronization~QAbstractTaskCollector;~QSynchronizationEvent;~QIProgressMonitor;" kind1="0" name="postSynchronization" parameter1="AbstractTaskCollector resultCollector 0 {deleted} {deleted} true" parameter2="SynchronizationEvent event 1 SynchronizationEvent event false" parameter3="IProgressMonitor monitor 2 IProgressMonitor monitor false" stamp="1207797406739" version="1.0"/>
<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob' to 'org.eclipse.mylyn.tasks.core.SynchronizeJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original elements:
 org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.synchronizeChangedTasks
 org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.setSynchronizeChangedTasks(...)
- Destination type: 'org.eclipse.mylyn.tasks.core.SynchronizeJob'
- Use super type where possible" delete="1" description="Pull up members to 'SynchronizeJob'" element1="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java[SynchronizeQueriesJob^synchronizeChangedTasks" element2="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java[SynchronizeQueriesJob~setSynchronizeChangedTasks~Z" element3="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java[SynchronizeQueriesJob~setSynchronizeChangedTasks~Z" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylyn.tasks.core{SynchronizeJob.java[SynchronizeJob" instanceof="false" pull="2" replace="true" stamp="1207799991923" stubs="true" version="1.0"/>
<refactoring comment="Rename field 'synchronizeChangedTasks' in 'org.eclipse.mylyn.tasks.core.SynchronizeJob' to 'changedTasksSynchronization'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.SynchronizeJob.synchronizeChangedTasks'
- Renamed element: 'org.eclipse.mylyn.tasks.core.SynchronizeJob.changedTasksSynchronization'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'synchronizeChangedTasks'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{SynchronizeJob.java[SynchronizeJob^synchronizeChangedTasks" name="changedTasksSynchronization" references="true" setter="true" stamp="1207800064751" textual="false" version="1.0"/>
<refactoring comment="Extract local variable 'tasks2' from expression 'repToTasks.get(taskRepository)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'tasks2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeAllTasksJob.run()'
- Variable expression: 'repToTasks.get(taskRepository)'" description="Extract local variable 'tasks2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeAllTasksJob.java" name="tasks2" replace="false" selection="2895 30" stamp="1207802591963" version="1.0"/>
<refactoring comment="Extract local variable 'rule' from expression 'new MutexRule(repository)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'rule'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.run()'
- Variable expression: 'new MutexRule(repository)'
- Replace occurrences of expression with variable" description="Extract local variable 'rule'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java" name="rule" replace="true" selection="5504 25" stamp="1207805758219" version="1.0"/>

<refactoring comment="Extract method 'private void firePreSynchronization(IProgressMonitor monitor,SynchronizationEvent event)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.run()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'firePreSynchronization'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'firePreSynchronization'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java" name="firePreSynchronization" replace="false" selection="5910 462" stamp="1207870005541" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void firePostSynchronization(IProgressMonitor monitor,SynchronizationEvent event)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.run()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'firePostSynchronization'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'firePostSynchronization'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java" name="firePostSynchronization" replace="false" selection="7247 333" stamp="1207870088958" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void synchronizeQueries(IProgressMonitor monitor,SynchronizationEvent event)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.run()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'synchronizeQueries'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'synchronizeQueries'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java" name="synchronizeQueries" replace="false" selection="6083 445" stamp="1207870197098" version="1.0" visibility="2"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.ITaskActivityListener.activityChanged(ScheduledTaskContainer week)' to 'public void activityChanged()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskActivityListener.activityChanged(...)'
- Removed parameters:
 ScheduledTaskContainer week" delegate="false" deprecate="true" description="Change method 'activityChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener~activityChanged~QScheduledTaskContainer;" name="activityChanged" parameter1="ScheduledTaskContainer week 0 {deleted} {deleted} true" stamp="1207945984427" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskActivityListener2.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener2.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207946021360" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskRepositoryManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207961471992" units="1" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryManager' from 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryManager'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.getRepositoryConnector(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.getRepositoryConnector(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.addRepository(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.addListener(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.removeListener(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.getRepository(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.getRepository(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.getRepositories(...)
 org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.getRepository(...)
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'ITaskRepositoryManager'" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryConnector~QString;" element2="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryConnector~QAbstractTask;" element3="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~addRepository~QTaskRepository;~QString;" element4="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~addListener~QITaskRepositoryListener;" element5="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepository~QString;~QString;Listener;" element6="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepository~QString;~QString;" element7="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepositories~QStrin" element8="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepositories~QString;" element9="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~getRepository~QAbstractTask;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager" instanceof="true" name="ITaskRepositoryManager" public="true" replace="true" stamp="1207977024703" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{ITaskRepositoryManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207977127070" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.sync'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.sync'
- Original element: 'org.eclipse.mylyn.tasks.core.SynchronizeJob.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.sync" element1="/src<org.eclipse.mylyn.tasks.core{SynchronizeJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208054321435" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.sync'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.sync'
- Original element: 'org.eclipse.mylyn.tasks.core.SynchronizationEvent.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.sync" element1="/src<org.eclipse.mylyn.tasks.core{SynchronizationEvent.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208054331890" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.sync.SynchronizeJob' to 'SynchronizationJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.sync.SynchronizeJob'
- Renamed element: 'org.eclipse.mylyn.tasks.core.sync.SynchronizationJob'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'SynchronizeJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core.sync{SynchronizeJob.java[SynchronizeJob" matchStrategy="1" name="SynchronizationJob" qualified="false" references="true" similarDeclarations="false" stamp="1208054345905" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskCollector.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTaskCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.tasks.core	/src<org.eclipse.mylyn.tasks.core.data" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208054391957" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.data.AbstractTaskCollector' to 'AbstractTaskDataCollector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.AbstractTaskCollector'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.AbstractTaskDataCollector'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core.data{AbstractTaskCollector.java[AbstractTaskCollector" matchStrategy="1" name="AbstractTaskDataCollector" qualified="false" references="true" similarDeclarations="false" stamp="1208054934080" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateAttributes(...)' to 'updateRepositoryConfiguration'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateAttributes(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.updateRepositoryConfiguration(...)'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'updateAttributes'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateAttributes~QTaskRepository;~QIProgressMonitor;" name="updateRepositoryConfiguration" references="true" stamp="1208060488797" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'AbstractAttributeMapper.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/tasks/core/AbstractAttributeMapper.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208061385478" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'RepositoryTaskData.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/tasks/core/RepositoryTaskData.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208061401539" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.tasks.core.RepositoryTaskData.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208061744521" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.tasks.core.AttributeContainer.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.tasks.core{AttributeContainer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208061773887" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..a2c20db
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,39 @@
+1207601851860 Rename method 'getTaskId'
+1207605175878 Rename field 'complete'
+1207608833210 Rename method 'getUrl'
+1207608852755 Rename method 'setUrl'
+1207608894954 Rename method 'getId'
+1207718090629 Move compilation unit
+1207719498799 Extract interface 'ITaskDataManager'
+1207719533170 Move compilation unit
+1207719697254 Extract interface 'IRepositorySynchronizationManager'
+1207719713614 Move compilation unit
+1207786742888 Extract method 'updateRepositoryConfiguration'
+1207787651018 Extract method 'updateRepositoryConfiguration'
+1207794313227 Extract local variable 'value'
+1207796810220 Change method 'preSynchronization'
+1207796840239 Change method 'postSynchronization'
+1207797394303 Change method 'preSynchronization'
+1207797406739 Change method 'postSynchronization'
+1207799991923 Pull up members to 'SynchronizeJob'
+1207800064751 Rename field 'synchronizeChangedTasks'
+1207802591963 Extract local variable 'tasks2'
+1207805758219 Extract local variable 'rule'
+1207870005541 Extract method 'firePreSynchronization'
+1207870088958 Extract method 'firePostSynchronization'
+1207870197098 Extract method 'synchronizeQueries'
+1207945984427 Change method 'activityChanged'
+1207946021360 Delete element
+1207961471992 Move compilation unit
+1207977024703 Extract interface 'ITaskRepositoryManager'
+1207977127070 Move compilation unit
+1208054321435 Move compilation unit
+1208054331890 Move compilation unit
+1208054345905 Rename type 'SynchronizeJob'
+1208054391957 Move compilation unit
+1208054934080 Rename type 'AbstractTaskCollector'
+1208060488797 Rename method 'updateAttributes'
+1208061385478 Delete element
+1208061401539 Delete element
+1208061744521 Copy compilation unit
+1208061773887 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..da2b0b7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskListIntegrityException.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{TaskListIntegrityException.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208129490023" subPackages="false" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.isRepositoryConfigurationStale(TaskRepository repository) throws CoreException' to 'public boolean isRepositoryConfigurationStale(TaskRepository repository, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.isRepositoryConfigurationStale(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'isRepositoryConfigurationStale'" element1="=org.eclipse.mylyn.bugzilla.core/C:\/apps\/eclipse-3.4\/M5\/eclipse\/plugins\/org.eclipse.equinox.common_3.4.0.v20080201.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~isRepositoryConfigurationStale~QTaskRepository;" kind1="0" name="isRepositoryConfigurationStale" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1208146968302" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskList.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{TaskList.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208223667855" units="1" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.ITaskList' from 'org.eclipse.mylyn.internal.tasks.core.TaskList'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.ITaskList'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.TaskList.addTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.addTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.addCategory(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.removeFromContainer(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.addQuery(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.deleteTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.deleteCategory(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.deleteQuery(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.addChangeListener(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.removeChangeListener(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.getCategories()
 org.eclipse.mylyn.internal.tasks.core.TaskList.getQueries()
 org.eclipse.mylyn.internal.tasks.core.TaskList.getTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.getTaskByKey(...)
 org.eclipse.mylyn.internal.tasks.core.TaskList.notifyTaskChanged(...)
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'ITaskList'" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~addTask~QAbstractTask;" element10="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~removeChangeListener~QITaskListChangeListener;" element11="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getCategories" element12="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getQueries" element13="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getTaskByKey~QString;~QSt" element14="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getTaskByKey~QString;~QString;" element15="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~addTask~QAbstractTask;~QAbstractTa" element2="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~addTask~QAbstractTask;~QAbstractTaskContainer;" element3="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~removeFromContainer~QAbstr" element4="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~removeFromContainer~QAbstractTaskContainer;~QAbstractTask;" element5="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~deleteTask~QAbstractTask;oryQuery;" element6="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~deleteTask~QAbstractTask;" element7="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~deleteQuery~QAbstractRepositoryQuery;" element8="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~deleteQuery~QAbstractRepositoryQuery;" element9="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~addChangeListener~QITaskListChangeListener;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList" instanceof="true" name="ITaskList" public="true" replace="true" stamp="1208224336139" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskList.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{ITaskList.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208224549948" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.getOrphanContainer(...)' to 'getUnmatchedContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getOrphanContainer(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getUnmatchedContainer(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOrphanContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getOrphanContainer~QString;" name="getUnmatchedContainer" references="true" stamp="1208232615625" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.getOrphanContainers()' to 'getUnmatchedContainers'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getOrphanContainers()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getUnmatchedContainers()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOrphanContainers'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getOrphanContainers" name="getUnmatchedContainers" references="true" stamp="1208232765020" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.addOrphanContainer(...)' to 'addUnmatchedContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.addOrphanContainer(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.addUnmatchedContainer(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addOrphanContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~addOrphanContainer~QUnmatchedTaskContainer;" name="addUnmatchedContainer" references="true" stamp="1208232807739" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.removeOrphanContainer(...)' to 'removeUnmatchedContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.removeOrphanContainer(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.removeUnmatchedContainer(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'removeOrphanContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~removeOrphanContainer~QString;" name="removeUnmatchedContainer" references="true" stamp="1208232976631" version="1.0"/>
<refactoring comment="Extract method 'private void fireDelta(Set<TaskContainerDelta> delta)' from 'org.eclipse.mylyn.internal.tasks.core.TaskList.removeFromContainer()' to 'org.eclipse.mylyn.internal.tasks.core.TaskList'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'fireDelta'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.TaskList'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'fireDelta'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java" name="fireDelta" replace="true" selection="11193 103" stamp="1208233782432" version="1.0" visibility="2"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.core.TaskList.getTask().task' in 'org.eclipse.mylyn.internal.tasks.core.TaskList.getTask()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getTask().task'" description="Inline local variable 'task'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java" selection="17462 22" stamp="1208238294476" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskArchive.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskArchive.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208244257029" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskListManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{ITaskListManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208244480761" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.moveTask(...)' to 'addTask'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.moveTask(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.addTask(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'moveTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~moveTask~QAbstractTask;~QAbstractTaskContainer;" name="addTask" references="true" stamp="1208289520511" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.AbstractTaskAttachment.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{AbstractTaskAttachment.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208412067299" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208412664946" units="1" version="1.0"/>
<refactoring comment="Extract local variable 'handler' from expression 'new TaskDataSaxHandler()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'handler'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.readTaskData()'
- Variable expression: 'new TaskDataSaxHandler()'
- Replace occurrences of expression with variable" description="Extract local variable 'handler'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" name="handler" replace="true" selection="7730 24" stamp="1208499499730" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.TaskDataSaxHandler' in 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2' to top level type
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.TaskDataSaxHandler'
- Field name: 'taskDataManager2'
- Declare field 'final'" description="Convert member type 'TaskDataSaxHandler' to top level" field="false" fieldName="taskDataManager2" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java[TaskDataManager2[TaskDataSaxHandler" mandatory="false" possible="false" stamp="1208499853845" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataSaxHandler.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataSaxHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.internal.tasks.core	/src<org.eclipse.mylyn.internal.tasks.core.data" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208499871482" units="1" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataSaxHandler.ElementHandler' in 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataSaxHandler' to top level type
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataSaxHandler.ElementHandler'
- Field name: 'taskDataSaxHandler'
- Declare field 'final'" description="Convert member type 'ElementHandler' to top level" field="false" fieldName="taskDataSaxHandler" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataSaxHandler.java[TaskDataSaxHandler[ElementHandler" mandatory="false" possible="false" stamp="1208501899257" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskAttachment.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskAttachment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208506282947" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskComment.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.tasks.core{TaskComment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208595118203" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskComment.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.tasks.core.data{TaskComment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208597056251" units="1" version="1.0"/>
<refactoring comment="Rename field 'commentId' in 'org.eclipse.mylyn.tasks.core.data.TaskOperation' to 'operationId'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskOperation.commentId'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskOperation.operationId'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Keep original element as deprecated delegate to refactored element
- Rename getter method for field" delegate="true" deprecate="true" description="Rename field 'commentId'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core.data{TaskOperation.java[TaskOperation^commentId" name="operationId" references="true" setter="false" stamp="1208597117344" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataSaxHandler' to 'TaskDataStateReader'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataSaxHandler'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskDataSaxHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataSaxHandler.java[TaskDataSaxHandler" matchStrategy="1" name="TaskDataStateReader" qualified="false" references="true" similarDeclarations="false" stamp="1208641067771" textual="false" version="1.0"/>
<refactoring comment="Extract local variable 'in' from expression 'new FileInputStream(getFile(task,kind))'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'in'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.setNewTaskData()'
- Variable expression: 'new FileInputStream(getFile(task,kind))'
- Replace occurrences of expression with variable" description="Extract local variable 'in'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" name="in" replace="true" selection="2174 40" stamp="1208641912045" version="1.0"/>
<refactoring comment="Extract method 'private void readState(AbstractTask task,String kind,RepositoryTaskData data) throws FileNotFoundException, CoreException ' from 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.setNewTaskData()' to 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'readState'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2'
- Declared visibility: 'private'" comments="false" description="Extract method 'readState'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" name="readState" replace="false" selection="2141 443" stamp="1208643171338" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'file' from expression 'getFile(task,kind)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'file'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.readState()'
- Variable expression: 'getFile(task,kind)'
- Replace occurrences of expression with variable" description="Extract local variable 'file'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" name="file" replace="true" selection="2603 19" stamp="1208643236969" version="1.0"/>
<refactoring comment="Extract method 'private void writeState(AbstractTask task,String kind,TaskDataState state) throws CoreException ' from 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.setNewTaskData()' to 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'writeState'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2'
- Declared visibility: 'private'" comments="false" description="Extract method 'writeState'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" name="writeState" replace="false" selection="2255 226" stamp="1208643316911" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'out' from expression 'new FileOutputStream(getFile(task,kind))'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'out'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.writeState()'
- Variable expression: 'new FileOutputStream(getFile(task,kind))'
- Replace occurrences of expression with variable" description="Extract local variable 'out'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" name="out" replace="true" selection="2422 41" stamp="1208643333616" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataState.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataState.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208647856413" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskDataManager2.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskDataManager2.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208648621672" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.util" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208652124403" units="1" version="1.0"/>
<refactoring comment="Move 36 members to 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataConstants'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original elements:
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_META
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_EDITS_DATA
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_NEW_DATA
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_VERSION
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_ID
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_INPUT_NAME
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_TASK_STATE
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_OPERATION
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_TASK_KIND
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_REPOSITORY_KIND
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_NUMBER
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_KNOB_NAME
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_ATTACHMENT
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_VALUE
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_NAME
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_KEY
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_OPTION_SELECTION
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_IS_PATCH
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_READONLY
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_IS_CHECKED
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_VALUE
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_HIDDEN
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_HAS_ATTACHMENT
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_OPTION_NAME
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_OLD_DATA
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_OPERATION_NAME
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_CREATOR
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_NAME
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_INPUT_VALUE
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_IS_OBSOLETE
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_PARAMETER
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_OPTION
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_ATTACHMENT_ID
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_ATTRIBUTE
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ELEMENT_COMMENT
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTRIBUTE_REPOSITORY_URL
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataConstants'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_META" element10="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_REPOSITORY_KIND" element11="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_NUMBER" element12="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_KNOB_NAME" element13="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_ATTACHMENT" element14="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_VALUE" element15="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_NAME" element16="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_KEY" element17="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_OPTION_SELECTION" element18="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_IS_PATCH" element19="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_READONLY" element2="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_IS_CHECK" element20="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_IS_CHECKED" element21="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_HIDDE" element22="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_HIDDEN" element23="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_OPTION_NAMEENT" element24="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_OPTION_NAME" element25="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_OPERAT" element26="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_OPERATION_NAME" element27="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_NAMETOR" element28="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_NAME" element29="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_NEW_DATAVALUE" element3="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_NEW_DATA" element30="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_PARAMETERTE" element31="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_PARAMETER" element32="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_ATTA" element33="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_ATTACHMENT_ID" element34="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_COMMENTTE" element35="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_COMMENT" element36="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_VERSIONORY_URL" element4="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_VERSION" element5="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_IN" element6="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTRIBUTE_INPUT_NAME" element7="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_OPERATIONE" element8="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ELEMENT_OPERATION" element9="/src<org.eclipse.mylyn.internal.tasks.core.data{ITaskDataConstants.java[ITaskDataConstantser^ATTRIBUTE_TASK_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.core.data{ITaskDataConstants.java[ITaskDataConstants" stamp="1208653585352" version="1.0"/>
<refactoring comment="Extract local variable 'optionalValue' from expression 'getOptionalValue(attributes,ITaskDataConstants.ATTRIBUTE_OPTION_NAME)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'optionalValue'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.OperationHandler.start()'
- Variable expression: 'getOptionalValue(attributes,ITaskDataConstants.ATTRIBUTE_OPTION_NAME)'" description="Extract local variable 'optionalValue'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java" name="optionalValue" replace="false" selection="11717 70" stamp="1208655966151" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractAttributeMapper.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.tasks.core{AbstractAttributeMapper.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208657383480" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IdentityAttributeFactory' to 'IdentityAttributeMapper'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeFactory'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeMapper'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'IdentityAttributeFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IdentityAttributeFactory.java[IdentityAttributeFactory" matchStrategy="1" name="IdentityAttributeMapper" qualified="false" references="true" similarDeclarations="false" stamp="1208657746321" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeFactory.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{IdentityAttributeFactory.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208657899936" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IdentityAttributeMapper' to 'IdentityAttributeFactory'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeMapper'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeFactory'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'IdentityAttributeMapper'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IdentityAttributeMapper.java[IdentityAttributeMapper" matchStrategy="1" name="IdentityAttributeFactory" qualified="false" references="true" similarDeclarations="false" stamp="1208657909183" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDataValue(...)' to 'getMetaData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDataValue(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMetaDataValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~getMetaDataValue~QString;" name="getMetaData" references="true" stamp="1208658273407" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData()' to 'getMetaDatas'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDatas()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMetaData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~getMetaData" name="getMetaDatas" references="true" stamp="1208658281491" version="1.0"/>
<refactoring comment="Extract method 'private String getValue(TaskAttribute attribute)' from 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.TaskDataAccessor.getValue()' to 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.TaskDataAccessor'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'getValue'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.TaskDataAccessor'
- Declared visibility: 'private'" comments="false" description="Extract method 'getValue'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataUtil.java" name="getValue" replace="false" selection="9223 82" stamp="1208659667171" version="1.0" visibility="2"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.DefaultTaskSchema.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{DefaultTaskSchema.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208660953584" units="1" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.core.TaskScheme.setBooleanValue().attributeMapper' in 'org.eclipse.mylyn.tasks.core.TaskScheme.setBooleanValue()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskScheme.setBooleanValue().attributeMapper'" description="Inline local variable 'attributeMapper'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.core{TaskScheme.java" selection="4440 47" stamp="1208661498683" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.core.TaskScheme.setValue().attributeMapper' in 'org.eclipse.mylyn.tasks.core.TaskScheme.setValue()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskScheme.setValue().attributeMapper'" description="Inline local variable 'attributeMapper'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.core{TaskScheme.java" selection="6458 47" stamp="1208661511236" version="1.0"/>
<refactoring comment="Extract local variable 'options' from expression 'associatedAttribute.getOptions()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'options'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.TaskDataAccessor.mapOperation()'
- Variable expression: 'associatedAttribute.getOptions()'
- Replace occurrences of expression with variable" description="Extract local variable 'options'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataUtil.java" name="options" replace="true" selection="8493 32" stamp="1208663221070" version="1.0"/>
<refactoring comment="Extract local variable 'mapOperation' from expression 'accessor.mapOperation(child,factory)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'mapOperation'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.toLegacyData()'
- Variable expression: 'accessor.mapOperation(child,factory)'
- Replace occurrences of expression with variable" description="Extract local variable 'mapOperation'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataUtil.java" name="mapOperation" replace="true" selection="2346 37" stamp="1208663361772" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskData.getAttribute(...)' to 'getMappedAttribute'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskData.getAttribute(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskData.getMappedAttribute(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getAttribute'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskData.java[TaskData~getAttribute~QString;" name="getMappedAttribute" references="true" stamp="1208682791173" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..a6bc5b9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,48 @@
+1208129490023 Delete element
+1208146968302 Change method 'isRepositoryConfigurationStale'
+1208223667855 Move compilation unit
+1208224336139 Extract interface 'ITaskList'
+1208224549948 Move compilation unit
+1208232615625 Rename method 'getOrphanContainer'
+1208232765020 Rename method 'getOrphanContainers'
+1208232807739 Rename method 'addOrphanContainer'
+1208232976631 Rename method 'removeOrphanContainer'
+1208233782432 Extract method 'fireDelta'
+1208238294476 Inline local variable 'task'
+1208244257029 Delete element
+1208244480761 Move compilation unit
+1208289520511 Rename method 'moveTask'
+1208412067299 Delete element
+1208412664946 Copy compilation unit
+1208499499730 Extract local variable 'handler'
+1208499853845 Convert member type 'TaskDataSaxHandler' to top level
+1208499871482 Move compilation unit
+1208501899257 Convert member type 'ElementHandler' to top level
+1208506282947 Move compilation unit
+1208595118203 Copy compilation unit
+1208597056251 Copy compilation unit
+1208597117344 Rename field 'commentId'
+1208641067771 Rename type 'TaskDataSaxHandler'
+1208641912045 Extract local variable 'in'
+1208643171338 Extract method 'readState'
+1208643236969 Extract local variable 'file'
+1208643316911 Extract method 'writeState'
+1208643333616 Extract local variable 'out'
+1208647856413 Copy compilation unit
+1208648621672 Move compilation unit
+1208652124403 Move compilation unit
+1208653585352 Move members
+1208655966151 Extract local variable 'optionalValue'
+1208657383480 Move compilation unit
+1208657746321 Rename type 'IdentityAttributeFactory'
+1208657899936 Delete element
+1208657909183 Rename type 'IdentityAttributeMapper'
+1208658273407 Rename method 'getMetaDataValue'
+1208658281491 Rename method 'getMetaData'
+1208659667171 Extract method 'getValue'
+1208660953584 Copy compilation unit
+1208661498683 Inline local variable 'attributeMapper'
+1208661511236 Inline local variable 'attributeMapper'
+1208663221070 Extract local variable 'options'
+1208663361772 Extract local variable 'mapOperation'
+1208682791173 Rename method 'getAttribute'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/17/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/17/refactorings.history
new file mode 100644
index 0000000..6dfb83a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/17/refactorings.history
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataManager2' from 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager2'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager2'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataManager2'
- Use super type where possible" comments="true" description="Extract interface 'ITaskDataManager2'" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataManager2.java[TaskDataManager2" instanceof="false" name="ITaskDataManager2" public="true" replace="true" stamp="1208747386926" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataManager2.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{ITaskDataManager2.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208747486410" units="1" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataState' from 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataState'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataState'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataState'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataState.getEditsTaskData()
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataState.getNewTaskData()
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataState.getOldTaskData()
- Use super type where possible" comments="true" description="Extract interface 'ITaskDataState'" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataState.java[TaskDataState~getEditsTaskData" element2="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataState.java[TaskDataState~getNewTaskData" element3="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataState.java[TaskDataState~getOldTaskData" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataState.java[TaskDataState" instanceof="false" name="ITaskDataState" public="true" replace="true" stamp="1208747520124" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.ITaskDataState.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{ITaskDataState.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208747527178" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getNewTaskData()' to 'getRepositoryData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getNewTaskData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getRepositoryData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNewTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{ITaskDataState.java[ITaskDataState~getNewTaskData" name="getRepositoryData" references="true" stamp="1208747591780" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getEditsTaskData()' to 'getLocalData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getEditsTaskData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getLocalData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getEditsTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{ITaskDataState.java[ITaskDataState~getEditsTaskData" name="getLocalData" references="true" stamp="1208747602797" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getOldTaskData()' to 'getLastReadData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getOldTaskData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataState.getLastReadData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOldTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{ITaskDataState.java[ITaskDataState~getOldTaskData" name="getLastReadData" references="true" stamp="1208747616588" version="1.0"/>
+<refactoring comment="Extract local variable 'readState' from expression 'readState(task,kind)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'readState'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager2.createWorkingCopy()'
- Variable expression: 'readState(task,kind)'
- Replace occurrences of expression with variable" description="Extract local variable 'readState'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataManager2.java" name="readState" replace="true" selection="4987 21" stamp="1208755513453" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.getSearchHitCollector(...)' to 'getDiplicatesQuery'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.getSearchHitCollector(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.getDiplicatesQuery(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSearchHitCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractDuplicateDetector.java[AbstractDuplicateDetector~getSearchHitCollector~QTaskRepository;~QRepositoryTaskData;" name="getDiplicatesQuery" references="true" stamp="1208900536859" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskListModifyOperation.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.core{TaskListModifyOperation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208908610926" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.MylynSaveManager.MylynBackgroundSaveJob' to 'MylynSaveJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.MylynSaveManager.MylynBackgroundSaveJob'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.MylynSaveManager.MylynSaveJob'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'MylynBackgroundSaveJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{MylynSaveManager.java[MylynSaveManager[MylynBackgroundSaveJob" matchStrategy="1" name="MylynSaveJob" qualified="false" references="true" similarDeclarations="false" stamp="1209077012958" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.MylynSaveManager' to 'TasklistSaveManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.MylynSaveManager'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TasklistSaveManager'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'MylynSaveManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{MylynSaveManager.java[MylynSaveManager" matchStrategy="1" name="TasklistSaveManager" qualified="false" references="true" similarDeclarations="false" stamp="1209084950141" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IMylynSaveParticipant' to 'ISaveParticipant'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IMylynSaveParticipant'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ISaveParticipant'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'IMylynSaveParticipant'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IMylynSaveParticipant.java[IMylynSaveParticipant" matchStrategy="1" name="ISaveParticipant" qualified="false" references="true" similarDeclarations="false" stamp="1209085013425" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.TasklistSaveManager' to 'ExternalizationManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TasklistSaveManager'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TasklistSaveManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{TasklistSaveManager.java[TasklistSaveManager" matchStrategy="1" name="ExternalizationManager" qualified="false" references="true" similarDeclarations="false" stamp="1209085027534" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ISaveParticipant' to 'IExternalizationParticipant'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ISaveParticipant'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IExternalizationParticipant'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ISaveParticipant'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ISaveParticipant.java[ISaveParticipant" matchStrategy="1" name="IExternalizationParticipant" qualified="false" references="true" similarDeclarations="false" stamp="1209085037190" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskListWriter.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.externalization" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskListWriter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209085252682" units="1" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListWriter.ERROR_READING_TASKLIST' from expression '"Failure occurred reading task list"'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'ERROR_READING_TASKLIST'
- Constant expression: '"Failure occurred reading task list"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ERROR_READING_TASKLIST'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListWriter.java" name="ERROR_READING_TASKLIST" qualify="false" replace="true" selection="15850 36" stamp="1209086069125" version="1.0" visibility="2"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskExternalizationException.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskExternalizationException.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209086423119" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.MylynSaveJob' to 'ExternalizationJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.MylynSaveJob'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.ExternalizationJob'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'MylynSaveJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{ExternalizationManager.java[ExternalizationManager[MylynSaveJob" matchStrategy="1" name="ExternalizationJob" qualified="false" references="true" similarDeclarations="false" stamp="1209156788471" textual="false" version="1.0"/>
+<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.status' in 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.status'
- Getter method name: 'getStatus'
- Setter method name: 'setStatus'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'status'" flags="589830" getter="getStatus" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.tasks.core{ExternalizationManager.java[ExternalizationManager^status" insertion="8" setter="setStatus" stamp="1209168489255" version="1.0" visibility="1"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IMylynSaveContext' to 'IExternalizationContext'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IMylynSaveContext'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IExternalizationContext'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'IMylynSaveContext'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IMylynSaveContext.java[IMylynSaveContext" matchStrategy="1" name="IExternalizationContext" qualified="false" references="true" similarDeclarations="false" stamp="1209168841180" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.IExternalizationContext.getDestinationFolder()' to 'getRootPath'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IExternalizationContext.getDestinationFolder()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IExternalizationContext.getRootPath()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDestinationFolder'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{IExternalizationContext.java[IExternalizationContext~getDestinationFolder" name="getRootPath" references="true" stamp="1209168940965" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.IExternalizationParticipant.save(...)' to 'execute'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IExternalizationParticipant.save(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IExternalizationParticipant.execute(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'save'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{IExternalizationParticipant.java[IExternalizationParticipant~save~QIExternalizationContext;~QIProgressMonitor;" name="execute" references="true" stamp="1209169133364" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.createSaveJob()' to 'createJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.createSaveJob()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.createJob()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSaveJob'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{ExternalizationManager.java[ExternalizationManager~createSaveJob" name="createJob" references="true" stamp="1209170463203" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/17/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/17/refactorings.index
new file mode 100644
index 0000000..1b1a972
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/17/refactorings.index
@@ -0,0 +1,24 @@
+1208747386926 Extract interface 'ITaskDataManager2'
+1208747486410 Move compilation unit
+1208747520124 Extract interface 'ITaskDataState'
+1208747527178 Move compilation unit
+1208747591780 Rename method 'getNewTaskData'
+1208747602797 Rename method 'getEditsTaskData'
+1208747616588 Rename method 'getOldTaskData'
+1208755513453 Extract local variable 'readState'
+1208900536859 Rename method 'getSearchHitCollector'
+1208908610926 Move compilation unit
+1209077012958 Rename type 'MylynBackgroundSaveJob'
+1209084950141 Rename type 'MylynSaveManager'
+1209085013425 Rename type 'IMylynSaveParticipant'
+1209085027534 Rename type 'TasklistSaveManager'
+1209085037190 Rename type 'ISaveParticipant'
+1209085252682 Move compilation unit
+1209086069125 Extract constant 'ERROR_READING_TASKLIST'
+1209086423119 Delete element
+1209156788471 Rename type 'MylynSaveJob'
+1209168489255 Encapsulate field 'status'
+1209168841180 Rename type 'IMylynSaveContext'
+1209168940965 Rename method 'getDestinationFolder'
+1209169133364 Rename method 'save'
+1209170463203 Rename method 'createSaveJob'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..f4ba33a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.readStart()' to 'preTaskListRead'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.readStart()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.preTaskListRead()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readStart'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~readStart" name="preTaskListRead" references="true" stamp="1209425992226" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.readComplete()' to 'postTaskListRead'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.readComplete()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.postTaskListRead()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readComplete'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~readComplete" name="postTaskListRead" references="true" stamp="1209426016981" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListWriter.ERROR_TASKLIST_READ' from expression '"Failed to load Task List"'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'ERROR_TASKLIST_READ'
- Constant expression: '"Failed to load Task List"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ERROR_TASKLIST_READ'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListWriter.java" name="ERROR_TASKLIST_READ" qualify="false" replace="true" selection="14355 26" stamp="1209427932935" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListWriter2' to 'TaskListExternalizer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListWriter2'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskListWriter2'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListWriter2.java[TaskListWriter2" matchStrategy="1" name="TaskListExternalizer" qualified="false" references="true" similarDeclarations="false" stamp="1209434653361" textual="false" version="1.0"/>
+<refactoring comment="Convert local variable 'org.eclipse.mylyn.internal.tasks.core.TaskList.addTask().delta' in 'org.eclipse.mylyn.internal.tasks.core.TaskList.addTask()' to field
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.addTask().delta'
- Field name: 'delta'
- Initialize field in method
- Declared visibility: 'private'" description="Convert local variable 'delta' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java" name="delta" selection="4345 41" stamp="1209435866673" static="false" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.getStatus()' to 'getLoadStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.getStatus()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.getLoadStatus()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{ExternalizationManager.java[ExternalizationManager~getStatus" name="getLoadStatus" references="true" stamp="1209438748631" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ITaskListWriter.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ITaskListWriter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209438869735" subPackages="false" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original elements:
 org.eclipse.mylyn.tasks.core.IExternalizationContext.java
 org.eclipse.mylyn.tasks.core.IExternalizationParticipant.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core.externalization" element1="/src<org.eclipse.mylyn.tasks.core{IExternalizationContext.java" element2="/src<org.eclipse.mylyn.tasks.core{IExternalizationParticipant.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209441219024" units="2" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ExternalizationManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.externalization" element1="/src<org.eclipse.mylyn.internal.tasks.core{ExternalizationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209441266119" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListSnapshotManager.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.util" element1="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListSnapshotManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209446845927" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.BackupRunnable.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core.externalization{BackupRunnable.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209446888972" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.isReadComplete()' to 'isInitialized'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.isReadComplete()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.isInitialized()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isReadComplete'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~isReadComplete" name="isInitialized" references="true" stamp="1209469159922" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITasksJobFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{ITasksJobFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209519692157" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITasksJobFactory' to 'ITaskJobFactory'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITasksJobFactory'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskJobFactory'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'ITasksJobFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITasksJobFactory.java[ITasksJobFactory" matchStrategy="1" name="ITaskJobFactory" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1209519728525" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{IdentityAttributeFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209521659537" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskTimingListener.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskTimingListener.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209522087697" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTask.RepositoryTaskSyncState' to 'SyncronizationState'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.RepositoryTaskSyncState'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SyncronizationState'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'RepositoryTaskSyncState'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask[RepositoryTaskSyncState" matchStrategy="1" name="SyncronizationState" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1209523503361" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractTask.SyncronizationState' to 'SynchronizationState'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SyncronizationState'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'SyncronizationState'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask[SyncronizationState" matchStrategy="1" name="SynchronizationState" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1209523560046" textual="true" version="1.0"/>
+<refactoring comment="Rename enum constant 'UNREAD' of 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState' to 'INCOMING_NEW'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState.UNREAD'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState.INCOMING_NEW'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'UNREAD'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask[SynchronizationState^UNREAD" name="INCOMING_NEW" references="true" setter="false" stamp="1209524200927" textual="true" version="1.0"/>
+<refactoring comment="Rename enum constant 'UNSUBMITTED' of 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState' to 'OUTGOING_NEW'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState.UNSUBMITTED'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractTask.SynchronizationState.OUTGOING_NEW'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'UNSUBMITTED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask[SynchronizationState^UNSUBMITTED" name="OUTGOING_NEW" references="true" setter="false" stamp="1209524242668" textual="true" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager.putUpdatedTaskData().new ITaskListRunnable() {...}.execute().state' in 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager.putUpdatedTaskData().new ITaskListRunnable() {...}.execute()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager.putUpdatedTaskData().new ITaskListRunnable() {...}.execute().state'" description="Inline local variable 'state'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataManager.java" selection="7226 38" stamp="1209525087658" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskJobFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{ITaskJobFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209543307580" units="1" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.SNAPSHOT_PREFIX' from expression '"."'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'SNAPSHOT_PREFIX'
- Constant expression: '"."'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'SNAPSHOT_PREFIX'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizationParticipant.java" name="SNAPSHOT_PREFIX" qualify="false" replace="true" selection="4727 3" stamp="1209578118803" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..95935a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,23 @@
+1209425992226 Rename method 'readStart'
+1209426016981 Rename method 'readComplete'
+1209427932935 Extract constant 'ERROR_TASKLIST_READ'
+1209434653361 Rename type 'TaskListWriter2'
+1209435866673 Convert local variable 'delta' to field
+1209438748631 Rename method 'getStatus'
+1209438869735 Delete element
+1209441219024 Move compilation units
+1209441266119 Move compilation unit
+1209446845927 Move compilation unit
+1209446888972 Delete element
+1209469159922 Rename method 'isReadComplete'
+1209519692157 Move compilation unit
+1209519728525 Rename type 'ITasksJobFactory'
+1209521659537 Move compilation unit
+1209522087697 Delete element
+1209523503361 Rename type 'RepositoryTaskSyncState'
+1209523560046 Rename type 'SyncronizationState'
+1209524200927 Rename enum constant 'UNREAD'
+1209524242668 Rename enum constant 'UNSUBMITTED'
+1209525087658 Inline local variable 'state'
+1209543307580 Move compilation unit
+1209578118803 Extract constant 'SNAPSHOT_PREFIX'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/18/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/18/refactorings.history
new file mode 100644
index 0000000..4120d65
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'TIMESTAMP_FORMAT' in 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants' to 'FILENAME_TIMESTAMP_FORMAT'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.TIMESTAMP_FORMAT'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.FILENAME_TIMESTAMP_FORMAT'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TIMESTAMP_FORMAT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants^TIMESTAMP_FORMAT" name="FILENAME_TIMESTAMP_FORMAT" references="true" setter="false" stamp="1209612642562" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskAttachmentModel.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskAttachmentModel.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209625977923" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.sync.SubmitJobListener.taskDataPosted(...)' to 'taskSubmitted'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.sync.SubmitJobListener.taskDataPosted(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.sync.SubmitJobListener.taskSubmitted(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'taskDataPosted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.sync{SubmitJobListener.java[SubmitJobListener~taskDataPosted~QSubmitJobEvent;~QIProgressMonitor;" name="taskSubmitted" references="true" stamp="1209701317477" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.sync.SubmitJob.fireTaskDataPosted(...)' to 'fireTaskSubmitted'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.sync.SubmitJob.fireTaskDataPosted(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.sync.SubmitJob.fireTaskSubmitted(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'fireTaskDataPosted'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.sync{SubmitJob.java[SubmitJob~fireTaskDataPosted~QIProgressMonitor;" name="fireTaskSubmitted" references="true" stamp="1209701333334" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSubmitJob(...)' to 'createSubmitTaskJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSubmitJob(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSubmitTaskJob(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSubmitJob'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{ITaskJobFactory.java[ITaskJobFactory~createSubmitJob~QAbstractRepositoryConnector;~QTaskRepository;~QAbstractTask;~QTaskData;~QSet\<QTaskAttribute;>;" name="createSubmitTaskJob" references="true" stamp="1209701804853" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.sync.SubmitJobAdapter.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core.sync{SubmitJobAdapter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209702549987" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskCalendarUtil.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskCalendarUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209778196487" subPackages="false" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.notifyRepositoryUrlChanged(TaskRepository repository, String oldUrl, String newUrl)' to 'public void notifyRepositoryUrlChanged(TaskRepository repository, String oldUrl)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager.notifyRepositoryUrlChanged(...)'
- Removed parameters:
 String newUrl" delegate="false" deprecate="true" description="Change method 'notifyRepositoryUrlChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryManager.java[TaskRepositoryManager~notifyRepositoryUrlChanged~QTaskRepository;~QString;~QString;" name="notifyRepositoryUrlChanged" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String oldUrl 1 String oldUrl false" parameter3="String newUrl 2 {deleted} {deleted} true" stamp="1209779689735" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.ITaskRepositoryListener.repositoryUrlChanged(TaskRepository repository, String oldUrl, String newUrl)' to 'public void repositoryUrlChanged(TaskRepository repository, String oldUrl)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskRepositoryListener.repositoryUrlChanged(...)'
- Removed parameters:
 String newUrl" delegate="false" deprecate="true" description="Change method 'repositoryUrlChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskRepositoryListener.java[ITaskRepositoryListener~repositoryUrlChanged~QTaskRepository;~QString;~QString;" name="repositoryUrlChanged" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String oldUrl 1 String oldUrl false" parameter3="String newUrl 2 {deleted} {deleted} true" stamp="1209779710729" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()' to 'clearMetaDatas'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDatas()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'clearMetaData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~clearMetaData" name="clearMetaDatas" references="true" stamp="1209799691940" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDatas()' to 'clearMetaData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDatas()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'clearMetaDatas'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~clearMetaDatas" name="clearMetaData" references="true" stamp="1209799744995" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()' to 'clearMetaDatas'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDatas()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'clearMetaData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~clearMetaData" name="clearMetaDatas" references="true" stamp="1209799755679" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskComment.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.data{ITaskComment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209843467856" units="1" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.tasks.core.data.ITaskRepositoryPerson' from 'org.eclipse.mylyn.tasks.core.data.RepositoryPerson'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.RepositoryPerson'
- Extracted interface: 'org.eclipse.mylyn.tasks.core.data.ITaskRepositoryPerson'
- Extracted members:
 org.eclipse.mylyn.tasks.core.data.RepositoryPerson.getName()
 org.eclipse.mylyn.tasks.core.data.RepositoryPerson.setName(...)
 org.eclipse.mylyn.tasks.core.data.RepositoryPerson.getPersonId()
 org.eclipse.mylyn.tasks.core.data.RepositoryPerson.getConnectorKind()
 org.eclipse.mylyn.tasks.core.data.RepositoryPerson.getRepositoryUrl()
- Use super type where possible" comments="true" description="Extract interface 'ITaskRepositoryPerson'" element1="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java[RepositoryPerson~getName" element2="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java[RepositoryPerson~setName~QString;" element3="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java[RepositoryPerson~getPersonId" element4="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java[RepositoryPerson~getConnectorKind" element5="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java[RepositoryPerson~getRepositoryUrl" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java[RepositoryPerson" instanceof="false" name="ITaskRepositoryPerson" public="true" replace="true" stamp="1209843533593" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.RepositoryPerson.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.data{RepositoryPerson.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209843546932" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskRepositoryPerson.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.data{ITaskRepositoryPerson.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209848336513" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.data.TaskAttachment' to 'TaskAttachmentMapper'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttachment'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskAttachment'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttachment.java[TaskAttachment" matchStrategy="1" name="TaskAttachmentMapper" qualified="false" references="true" similarDeclarations="false" stamp="1209848417468" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.data.TaskComment' to 'TaskCommentMapper'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskComment'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskCommentMapper'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskComment'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core.data{TaskComment.java[TaskComment" matchStrategy="1" name="TaskCommentMapper" qualified="false" references="true" similarDeclarations="false" stamp="1209848447124" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.TaskScheme' to 'TaskMapper'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskScheme'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskMapper'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskScheme'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{TaskScheme.java[TaskScheme" matchStrategy="1" name="TaskMapper" qualified="false" references="true" similarDeclarations="false" stamp="1209848545312" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskCommentMapper.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.data{TaskCommentMapper.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209848596356" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskAttachment2.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.data{ITaskAttachment2.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209848810614" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.data{TaskAttachmentMapper.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209848864998" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskRepositoryPersonWorkingCopy.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskRepositoryPersonWorkingCopy.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209852088170" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskAttachmentWorkingCopy.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskAttachmentWorkingCopy.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209852119148" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.RepositoryPerson' to 'TaskRepositoryPerson'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryPerson'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryPerson'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'RepositoryPerson'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryPerson.java[RepositoryPerson" matchStrategy="1" name="TaskRepositoryPerson" qualified="false" references="true" similarDeclarations="false" stamp="1209852228566" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IdentityAttributeMapper.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{IdentityAttributeMapper.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209852999505" subPackages="false" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.createAttribute().attribute' in 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.createAttribute()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.createAttribute().attribute'" description="Inline local variable 'attribute'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java" selection="8242 48" stamp="1209856196040" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector' to 'AbstractLegacyRepositoryConnector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryConnector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector" matchStrategy="1" name="AbstractLegacyRepositoryConnector" qualified="false" references="true" similarDeclarations="false" stamp="1209868864517" textual="false" version="1.0"/>
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector' from 'org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector'
- Sub types:
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector
- Extracted class: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector'
- Extracted members:
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.init(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskDataHandler2()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getRepositoryUrlFromTaskUrl(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskIdFromTaskUrl(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskUrl(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskData(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskIdsFromComment(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.canCreateTaskFromKey(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.canCreateNewTask(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.canQuery(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.performQuery(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getLabel()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getShortLabel()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getConnectorKind()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskIdPrefix()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.updateRepositoryConfiguration(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.isRepositoryConfigurationStale(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.setUserManaged(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.isUserManaged()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.hasCredentialsManagement()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.preSynchronization(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.postSynchronization(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.hasChanged(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.updateTaskFromTaskData(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskData2(...)
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskAttachmentHandler()
 org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.getTaskScheme(...)
- Use super type where possible
- Use super type in 'instanceof' expressions" delete="27" description="Extract superclass 'AbstractRepositoryConnector'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~init~QITaskDataManager;" element10="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~canQuery~QTaskRepository;" element11="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~performQuery~QTaskRepository;~QAbstractRepositoryQuery;~QTaskDataCollector;~QSynchronizationContext;~QIProgressMonitor;" element12="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getLabel" element13="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getShortLabel" element14="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdPrefixd" element15="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdPrefix" element16="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~isRepositoryConfigurationStale~QTaskRepository;~QIProgressMonitor" element17="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~isRepositoryConfigurationStale~QTaskRepository;~QIProgressMonitor;" element18="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~isUserManagedd~Z" element19="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~isUserManaged" element2="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~hasCredentialsManag" element20="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~hasCredentialsManagement" element21="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~postSynchronization~QSynchronizationContext;~QIProgressMonitor" element22="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~postSynchronization~QSynchronizationContext;~QIProgressMonitor;" element23="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~updateTaskFromTaskData~QTaskReposito" element24="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~updateTaskFromTaskData~QTaskRepository;~QAbstractTask;~QTaskData;" element25="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskAttachmentHandlertory;~QString;~QIProgressMonitor;" element26="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskAttachmentHandler" element27="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~canCreateNewTask~QTaskRe" element28="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~canCreateNewTask~QTaskRepository;" element29="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getRepositoryUrlFromTaskUrl~QString;;" element3="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getRepositoryUrlFromTaskUrl~QString;" element30="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getConnectorKindpository;" element31="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getConnectorKind" element32="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getRepos" element33="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getRepositoryUrlFromTaskUrl~QString;" element34="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskAttach" element35="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskAttachmentHandler" element36="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskData2~QTaskRepository;~QString;~QIProgressMonitor" element37="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskData2~QTaskRepository;~QString;~QIProgressMonitor;" element38="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdFromTaskUr" element39="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdFromTaskUrl~QString;" element4="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdPrefixskUrl~QString;" element40="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdPrefix" element41="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskScheme~QTaskData;askRepository;~QString;" element42="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskScheme~QTaskData;" element43="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~hasChanged~QAbstractTask;~QT" element44="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~hasChanged~QAbstractTask;~QTaskData;" element45="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~init~QITaskDataManager;t" element46="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~init~QITaskDataManager;" element47="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~isUserManagedonfigurationStale~QTaskRepository;~QIProgressMonitor;" element48="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~isUserManaged" element49="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskUrl~QString;~QString;;~QAbstractRepositoryQuery;~QTaskDataCollector;~QSynchronizationContext;~QIProgressMonitor;" element5="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskUrl~QString;~QString;" element50="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~preSynchronization~QSynchronizationContext;~QIProgressMonitor;;" element51="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~preSynchronization~QSynchronizationContext;~QIProgressMonitor;" element52="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~updateRepository" element53="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~updateRepositoryConfiguration~QTaskRepository;~QIProgressMonitor;" element54="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~updateTaskFromTaskData~QTaskRepository;~QAbstractTask;~QTaskData;" element55="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector" element6="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdsFromComment~QTaskRepository;~QString;sMonitor;" element7="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskIdsFromComment~QTaskRepository;~QString;" element8="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~canCreateNewTask~QTaskRepository;ory;" element9="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~canCreateNewTask~QTaskRepository;" extract="27" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector" instanceof="true" name="AbstractRepositoryConnector" replace="true" stamp="1209869112458" stubs="true" types="1" version="1.0"/>

<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractLegacyRepositoryConnector.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.tasks.core{AbstractLegacyRepositoryConnector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209870998494" units="1" version="1.0"/>
<refactoring comment="Move 5 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original elements:
 org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.java
 org.eclipse.mylyn.tasks.core.AbstractTaskListFactory.java
 org.eclipse.mylyn.tasks.core.AbstractAttachmentHandler.java
 org.eclipse.mylyn.tasks.core.AbstractTaskDataHandler.java
 org.eclipse.mylyn.tasks.core.AbstractAttributeFactory.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.tasks.core{AbstractDuplicateDetector.java" element2="/src<org.eclipse.mylyn.tasks.core{AbstractTaskListFactory.java" element3="/src<org.eclipse.mylyn.tasks.core{AbstractAttachmentHandler.java" element4="/src<org.eclipse.mylyn.tasks.core{AbstractTaskDataHandler.java" element5="/src<org.eclipse.mylyn.tasks.core{AbstractAttributeFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871206135" units="5" version="1.0"/>
<refactoring comment="Move 5 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original elements:
 org.eclipse.mylyn.tasks.core.FileAttachment.java
 org.eclipse.mylyn.tasks.core.AttributeContainer.java
 org.eclipse.mylyn.tasks.core.ITaskCollector.java
 org.eclipse.mylyn.tasks.core.DefaultTaskSchema.java
 org.eclipse.mylyn.tasks.core.ITaskAttachment.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.tasks.core{FileAttachment.java" element2="/src<org.eclipse.mylyn.tasks.core{AttributeContainer.java" element3="/src<org.eclipse.mylyn.tasks.core{ITaskCollector.java" element4="/src<org.eclipse.mylyn.tasks.core{DefaultTaskSchema.java" element5="/src<org.eclipse.mylyn.tasks.core{ITaskAttachment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871238387" units="5" version="1.0"/>
<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original elements:
 org.eclipse.mylyn.tasks.core.RepositoryTaskData.java
 org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute.java
 org.eclipse.mylyn.tasks.core.TaskComment.java
 org.eclipse.mylyn.tasks.core.RepositoryAttachment.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskData.java" element2="/src<org.eclipse.mylyn.tasks.core{RepositoryTaskAttribute.java" element3="/src<org.eclipse.mylyn.tasks.core{TaskComment.java" element4="/src<org.eclipse.mylyn.tasks.core{RepositoryAttachment.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871272887" units="4" version="1.0"/>
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original elements:
 org.eclipse.mylyn.tasks.core.TaskSelection.java
 org.eclipse.mylyn.tasks.core.ITaskFactory.java
 org.eclipse.mylyn.tasks.core.RepositoryOperation.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.tasks.core{TaskSelection.java" element2="/src<org.eclipse.mylyn.tasks.core{ITaskFactory.java" element3="/src<org.eclipse.mylyn.tasks.core{RepositoryOperation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871314962" units="3" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.core.QueryHitCollector.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.tasks.core{QueryHitCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871334518" units="1" version="1.0"/>
<refactoring comment="Change method 'public AbstractLegacyRepositoryConnector org.eclipse.mylyn.tasks.core.ITaskRepositoryManager.getRepositoryConnector(String connectorKind)' to 'public AbstractRepositoryConnector getRepositoryConnector(String connectorKind)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskRepositoryManager.getRepositoryConnector(...)'
- New return type: 'AbstractRepositoryConnector'" delegate="false" deprecate="true" description="Change method 'getRepositoryConnector'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskRepositoryManager.java[ITaskRepositoryManager~getRepositoryConnector~QString;" name="getRepositoryConnector" parameter1="String connectorKind 0 String connectorKind false" return="AbstractRepositoryConnector" stamp="1209871399952" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskRepositoryPerson' to 'IPerson'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskRepositoryPerson'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IPerson'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ITaskRepositoryPerson'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskRepositoryPerson.java[ITaskRepositoryPerson" matchStrategy="1" name="IPerson" qualified="false" references="true" similarDeclarations="false" stamp="1209871443222" textual="false" version="1.0"/>
<refactoring comment="Change method 'public SynchronizationJob org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSynchronizeTasksJob(AbstractRepositoryConnector connector, TaskRepository taskRepository, Set<AbstractTask> tasks)' to 'public SynchronizationJob createSynchronizeTasksJob(AbstractRepositoryConnector connector, TaskRepository taskRepository, Set<AbstractTask> tasks)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSynchronizeTasksJob(...)'
- Changed parameters:
 AbstractLegacyRepositoryConnector connector" delegate="false" deprecate="true" description="Change method 'createSynchronizeTasksJob'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{ITaskJobFactory.java[ITaskJobFactory~createSynchronizeTasksJob~QAbstractLegacyRepositoryConnector;~QTaskRepository;~QSet\<QAbstractTask;>;" name="createSynchronizeTasksJob" parameter1="AbstractLegacyRepositoryConnector connector 0 AbstractRepositoryConnector connector false" parameter2="TaskRepository taskRepository 1 TaskRepository taskRepository false" parameter3="Set<AbstractTask> tasks 2 Set<AbstractTask> tasks false" stamp="1209871642992" version="1.0"/>
<refactoring comment="Change method 'public SynchronizationJob org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSynchronizeQueriesJob(AbstractRepositoryConnector connector, TaskRepository repository, Set<AbstractRepositoryQuery> queries)' to 'public SynchronizationJob createSynchronizeQueriesJob(AbstractRepositoryConnector connector, TaskRepository repository, Set<AbstractRepositoryQuery> queries)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSynchronizeQueriesJob(...)'
- Changed parameters:
 AbstractLegacyRepositoryConnector connector" delegate="false" deprecate="true" description="Change method 'createSynchronizeQueriesJob'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{ITaskJobFactory.java[ITaskJobFactory~createSynchronizeQueriesJob~QAbstractLegacyRepositoryConnector;~QTaskRepository;~QSet\<QAbstractRepositoryQuery;>;" name="createSynchronizeQueriesJob" parameter1="AbstractLegacyRepositoryConnector connector 0 AbstractRepositoryConnector connector false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="Set<AbstractRepositoryQuery> queries 2 Set<AbstractRepositoryQuery> queries false" stamp="1209871653659" version="1.0"/>
<refactoring comment="Change method 'public SubmitJob org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSubmitTaskJob(AbstractRepositoryConnector connector, TaskRepository taskRepository, AbstractTask task, TaskData taskData, Set<TaskAttribute> changedAttributes)' to 'public SubmitJob createSubmitTaskJob(AbstractRepositoryConnector connector, TaskRepository taskRepository, AbstractTask task, TaskData taskData, Set<TaskAttribute> changedAttributes)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory.createSubmitTaskJob(...)'
- Changed parameters:
 AbstractLegacyRepositoryConnector connector" delegate="false" deprecate="true" description="Change method 'createSubmitTaskJob'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{ITaskJobFactory.java[ITaskJobFactory~createSubmitTaskJob~QAbstractLegacyRepositoryConnector;~QTaskRepository;~QAbstractTask;~QTaskData;~QSet\<QTaskAttribute;>;" name="createSubmitTaskJob" parameter1="AbstractLegacyRepositoryConnector connector 0 AbstractRepositoryConnector connector false" parameter2="TaskRepository taskRepository 1 TaskRepository taskRepository false" parameter3="AbstractTask task 2 AbstractTask task false" parameter4="TaskData taskData 3 TaskData taskData false" parameter5="Set<TaskAttribute> changedAttributes 4 Set<TaskAttribute> changedAttributes false" stamp="1209871669557" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskActivationListener.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskActivationListener.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209877375383" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractDuplicateDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209878646475" units="1" version="1.0"/>

<refactoring comment="Rename field 'kind' in 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector' to 'connectorKind'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.kind'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.connectorKind'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'kind'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core{AbstractDuplicateDetector.java[AbstractDuplicateDetector^kind" name="connectorKind" references="true" setter="true" stamp="1209878816047" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractTaskListFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209879239190" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.IPerson' to 'IRepositoryPerson'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IPerson'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IRepositoryPerson'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'IPerson'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{IPerson.java[IPerson" matchStrategy="1" name="IRepositoryPerson" qualified="false" references="true" similarDeclarations="false" stamp="1209879705796" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryPerson' to 'RepositoryPerson'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskRepositoryPerson'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryPerson'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskRepositoryPerson'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskRepositoryPerson.java[TaskRepositoryPerson" matchStrategy="1" name="RepositoryPerson" qualified="false" references="true" similarDeclarations="false" stamp="1209879727958" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskAttachment2' to 'ITaskAttachment'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskAttachment2'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskAttachment'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ITaskAttachment2'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskAttachment2.java[ITaskAttachment2" matchStrategy="1" name="ITaskAttachment" qualified="false" references="true" similarDeclarations="false" stamp="1209879871035" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler2' to 'AbstractTaskDataHandler'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler2'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskDataHandler2'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core.data{AbstractTaskDataHandler2.java[AbstractTaskDataHandler2" matchStrategy="1" name="AbstractTaskDataHandler" qualified="false" references="true" similarDeclarations="false" stamp="1209879961573" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector.getTaskDataHandler()' to 'getLegacyTaskDataHandler'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector.getTaskDataHandler()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector.getLegacyTaskDataHandler()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskDataHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractLegacyRepositoryConnector.java[AbstractLegacyRepositoryConnector~getTaskDataHandler" name="getLegacyTaskDataHandler" references="true" stamp="1209880092364" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.TaskRepositoryListenerAdapter' to 'TaskRepositoryAdapter'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryListenerAdapter'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepositoryAdapter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskRepositoryListenerAdapter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{TaskRepositoryListenerAdapter.java[TaskRepositoryListenerAdapter" matchStrategy="1" name="TaskRepositoryAdapter" qualified="false" references="true" similarDeclarations="false" stamp="1209880243701" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskListManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ITaskListManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209881262550" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/18/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/18/refactorings.index
new file mode 100644
index 0000000..cccff93
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/18/refactorings.index
@@ -0,0 +1,51 @@
+1209612642562 Rename field 'TIMESTAMP_FORMAT'
+1209625977923 Move compilation unit
+1209701317477 Rename method 'taskDataPosted'
+1209701333334 Rename method 'fireTaskDataPosted'
+1209701804853 Rename method 'createSubmitJob'
+1209702549987 Delete element
+1209778196487 Delete element
+1209779689735 Change method 'notifyRepositoryUrlChanged'
+1209779710729 Change method 'repositoryUrlChanged'
+1209799691940 Rename method 'clearMetaData'
+1209799744995 Rename method 'clearMetaDatas'
+1209799755679 Rename method 'clearMetaData'
+1209843467856 Move compilation unit
+1209843533593 Extract interface 'ITaskRepositoryPerson'
+1209843546932 Move compilation unit
+1209848336513 Move compilation unit
+1209848417468 Rename type 'TaskAttachment'
+1209848447124 Rename type 'TaskComment'
+1209848545312 Rename type 'TaskScheme'
+1209848596356 Copy compilation unit
+1209848810614 Move compilation unit
+1209848864998 Copy compilation unit
+1209852088170 Delete element
+1209852119148 Delete element
+1209852228566 Rename type 'RepositoryPerson'
+1209852999505 Delete element
+1209856196040 Inline local variable 'attribute'
+1209868864517 Rename type 'AbstractRepositoryConnector'
+1209869112458 Extract superclass 'AbstractRepositoryConnector'
+1209870998494 Move compilation unit
+1209871206135 Move compilation units
+1209871238387 Move compilation units
+1209871272887 Move compilation units
+1209871314962 Move compilation units
+1209871334518 Move compilation unit
+1209871399952 Change method 'getRepositoryConnector'
+1209871443222 Rename type 'ITaskRepositoryPerson'
+1209871642992 Change method 'createSynchronizeTasksJob'
+1209871653659 Change method 'createSynchronizeQueriesJob'
+1209871669557 Change method 'createSubmitTaskJob'
+1209877375383 Delete element
+1209878646475 Copy compilation unit
+1209878816047 Rename field 'kind'
+1209879239190 Move compilation unit
+1209879705796 Rename type 'IPerson'
+1209879727958 Rename type 'TaskRepositoryPerson'
+1209879871035 Rename type 'ITaskAttachment2'
+1209879961573 Rename type 'AbstractTaskDataHandler2'
+1209880092364 Rename method 'getTaskDataHandler'
+1209880243701 Rename type 'TaskRepositoryListenerAdapter'
+1209881262550 Delete element
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/19/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/19/refactorings.history
new file mode 100644
index 0000000..287c5f1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/19/refactorings.history
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.provisional.ITaskElement.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core.provisional{ITaskElement.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209968377806" subPackages="false" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.tasks.core.ITaskElement' from 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer'
- Extracted interface: 'org.eclipse.mylyn.tasks.core.ITaskElement'
- Extracted members:
 org.eclipse.mylyn.tasks.core.AbstractTaskContainer.getChildren()
 org.eclipse.mylyn.tasks.core.AbstractTaskContainer.getSummary()
 org.eclipse.mylyn.tasks.core.AbstractTaskContainer.getHandleIdentifier()
 org.eclipse.mylyn.tasks.core.AbstractTaskContainer.getUrl()
 org.eclipse.mylyn.tasks.core.AbstractTaskContainer.getPriority()
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'ITaskElement'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~getChildren" element2="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~getSummary" element3="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~getHandleIdentifier" element4="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~getUrl" element5="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer~getPriority" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java[AbstractTaskContainer" instanceof="true" name="ITaskElement" public="true" replace="true" stamp="1209968441201" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.provisional.ITask.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core.provisional{ITask.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209968461660" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.provisional'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.provisional'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskElement.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core.provisional" element1="/src<org.eclipse.mylyn.tasks.core{ITaskElement.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209968494632" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.provisional.ITaskElement.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core.provisional{ITaskElement.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209968621880" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.provisional'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core.provisional" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209968639635" subPackages="false" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.tasks.core.ITask' from 'org.eclipse.mylyn.tasks.core.AbstractTask'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask'
- Extracted interface: 'org.eclipse.mylyn.tasks.core.ITask'
- Extracted members:
 org.eclipse.mylyn.tasks.core.AbstractTask.getHandleIdentifier()
 org.eclipse.mylyn.tasks.core.AbstractTask.isLocal()
 org.eclipse.mylyn.tasks.core.AbstractTask.getConnectorKind()
 org.eclipse.mylyn.tasks.core.AbstractTask.getLastReadTimeStamp()
 org.eclipse.mylyn.tasks.core.AbstractTask.setLastReadTimeStamp(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizationState(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getSynchronizationState()
 org.eclipse.mylyn.tasks.core.AbstractTask.isSynchronizing()
 org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizing(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.isNotified()
 org.eclipse.mylyn.tasks.core.AbstractTask.setNotified(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getOwner()
 org.eclipse.mylyn.tasks.core.AbstractTask.setOwner(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getSynchronizationStatus()
 org.eclipse.mylyn.tasks.core.AbstractTask.setSynchronizationStatus(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getTaskId()
 org.eclipse.mylyn.tasks.core.AbstractTask.getRepositoryUrl()
 org.eclipse.mylyn.tasks.core.AbstractTask.getTaskKey()
 org.eclipse.mylyn.tasks.core.AbstractTask.isSubmitting()
 org.eclipse.mylyn.tasks.core.AbstractTask.setSubmitting(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.isCompleted()
 org.eclipse.mylyn.tasks.core.AbstractTask.getPriority()
 org.eclipse.mylyn.tasks.core.AbstractTask.setPriority(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getNotes()
 org.eclipse.mylyn.tasks.core.AbstractTask.setNotes(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getEstimatedTimeHours()
 org.eclipse.mylyn.tasks.core.AbstractTask.setEstimatedTimeHours(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getParentContainers()
 org.eclipse.mylyn.tasks.core.AbstractTask.getSummary()
 org.eclipse.mylyn.tasks.core.AbstractTask.getCompletionDate()
 org.eclipse.mylyn.tasks.core.AbstractTask.setScheduledForDate(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getScheduledForDate()
 org.eclipse.mylyn.tasks.core.AbstractTask.isReminded()
 org.eclipse.mylyn.tasks.core.AbstractTask.setReminded(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getCreationDate()
 org.eclipse.mylyn.tasks.core.AbstractTask.setCreationDate(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.setSummary(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.setCompletionDate(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.hasValidUrl()
 org.eclipse.mylyn.tasks.core.AbstractTask.getTaskKind()
 org.eclipse.mylyn.tasks.core.AbstractTask.setTaskKind(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getDueDate()
 org.eclipse.mylyn.tasks.core.AbstractTask.setDueDate(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.isStale()
 org.eclipse.mylyn.tasks.core.AbstractTask.setStale(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.getModificationDate()
 org.eclipse.mylyn.tasks.core.AbstractTask.setModificationDate(...)
 org.eclipse.mylyn.tasks.core.AbstractTask.setMarkReadPending(...)
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'ITask'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getHandleIdentifier" element10="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isNotified" element11="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setNotified~Z" element12="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getOwner" element13="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setOwner~QString;" element14="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSynchronizationStatus" element15="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSynchronizationStatus~QIStatus;" element16="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getReposi" element17="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getRepositoryUrl" element18="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isSubmitti" element19="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isSubmitting" element2="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSubm" element20="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSubmitting~Z" element21="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getPriority" element22="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getPriority" element23="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getNotesity~QString;" element24="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getNotes" element25="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getEstimatedTimeH" element26="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getEstimatedTimeHours" element27="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getParentContainersrs~I" element28="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getParentContainers" element29="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getConnect" element3="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getConnectorKind" element30="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setScheduledForDa" element31="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setScheduledForDate~QDate;" element32="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isRemindededForDate" element33="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isReminded" element34="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getCreationDa" element35="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getCreationDate" element36="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSummary~QString;te;" element37="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSummary~QString;" element38="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~hasValidUrlonDate~QDate;" element39="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~hasValidUrl" element4="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getTaskKindTimeStamp" element40="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getTaskKind" element41="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getDueDated~QString;" element42="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getDueDate" element43="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isStaleate~QDate;" element44="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isStale" element45="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getModific" element46="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~getModificationDate" element47="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setMarkReadPending~ZQDate;" element48="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setMarkReadPending~Z" element5="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSynchronizationState~QSync" element6="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSynchronizationState~QSynchronizationState;" element7="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isSynchronizingionState" element8="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~isSynchronizing" element9="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask~setSynchronizing~Z" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java[AbstractTask" instanceof="true" name="ITask" public="true" replace="true" stamp="1209968810071" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.ITaskActivityListener.taskActivated(ITask task)' to 'public void taskActivated(ITask task)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskActivityListener.taskActivated(...)'
- Changed parameters:
 AbstractTask task" delegate="false" deprecate="true" description="Change method 'taskActivated'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener~taskActivated~QAbstractTask;" name="taskActivated" parameter1="AbstractTask task 0 ITask task false" stamp="1209969580052" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.deactivateTask(ITask task)' to 'public void deactivateTask(ITask task)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.deactivateTask(...)'
- Changed parameters:
 AbstractTask task" delegate="false" deprecate="true" description="Change method 'deactivateTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~deactivateTask~QAbstractTask;" name="deactivateTask" parameter1="AbstractTask task 0 ITask task false" stamp="1209970305280" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(ITask task)' to 'public void activateTask(ITask task)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(...)'
- Changed parameters:
 AbstractTask task" delegate="false" deprecate="true" description="Change method 'activateTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~activateTask~QAbstractTask;" name="activateTask" parameter1="AbstractTask task 0 ITask task false" stamp="1209970416994" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(AbstractTask task, ITask addToHistory)' to 'public void activateTask(AbstractTask task, ITask addToHistory)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(...)'
- Changed parameters:
 boolean addToHistory" delegate="false" deprecate="true" description="Change method 'activateTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~activateTask~QAbstractTask;~Z" name="activateTask" parameter1="AbstractTask task 0 AbstractTask task false" parameter2="boolean addToHistory 1 ITask addToHistory false" stamp="1209970437541" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(ITask task, boolean addToHistory)' to 'public void activateTask(ITask task, boolean addToHistory)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(...)'
- Changed parameters:
 AbstractTask task
 ITask addToHistory" delegate="false" deprecate="true" description="Change method 'activateTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~activateTask~QAbstractTask;~QITask;" name="activateTask" parameter1="AbstractTask task 0 ITask task false" parameter2="ITask addToHistory 1 boolean addToHistory false" stamp="1209970477216" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.ITaskList.notifyTaskChanged(ITask task, boolean content)' to 'public void notifyTaskChanged(ITask task, boolean content)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskList.notifyTaskChanged(...)'
- Changed parameters:
 AbstractTask task" delegate="false" deprecate="true" description="Change method 'notifyTaskChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskList.java[ITaskList~notifyTaskChanged~QAbstractTask;~Z" name="notifyTaskChanged" parameter1="AbstractTask task 0 ITask task false" parameter2="boolean content 1 boolean content false" stamp="1209970553703" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTask.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf, *.properties' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTask.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf, *.properties" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1210004371630" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractTaskContainer.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTaskContainer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1210004423604" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original elements:
 org.eclipse.mylyn.tasks.core.AbstractTaskCategory.java
 org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{AbstractTaskCategory.java" element2="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1210004469341" units="2" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.core.ITaskActivityManager' from 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.core.ITaskActivityManager'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getEndHour()
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.addActivityListener(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.addScheduledTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.addDueTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.activateTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.deactivateAllTasks()
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.deactivateTask(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getActiveTasks(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getScheduledTasks(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getDueTasks(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getElapsedTime(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getElapsedTime(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getActiveTask()
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.setScheduledFor(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.setDueDate(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isCompletedToday(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isDueToday(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isOverdue(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isActiveThisWeek(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isDueThisWeek(...)
 org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.isFloatingThisWeek(...)
- Use super type where possible" comments="true" description="Extract interface 'ITaskActivityManager'" element1="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getEndHour" element10="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getDueTasks~QCalendar;~QCalendar;" element11="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getElapsedTime~QITask;" element12="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getElapsedTime~QITask;~QCalendar;~QCalendar;" element13="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getActiveTask" element14="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~setScheduledFor~QITask;~QDate;" element15="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~setDueDate~QITask;~QDate;" element16="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isCompletedToday~QITask;" element17="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isDueToday~QITask;" element18="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isOverdue~QITask;" element19="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isActiveThisWeek~QITask;" element2="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~addActivityListener~QITaskActivityListener;" element20="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isDueThisWeek~QITask;" element21="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~isFloatingThisWeek~QAbstractTask;" element3="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~addScheduledTask~QITask;" element4="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~addDueTask~QITask;" element5="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~activateTask~QITask;" element6="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~deactivateAllTasks" element7="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~deactivateTask~QITask;" element8="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getActiveTasks~QCalendar;~QCalendar;" element9="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getScheduledTasks~QCalendar;~QCalendar;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager" instanceof="false" name="ITaskActivityManager" public="true" replace="true" stamp="1210020900899" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskActivityManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.core{ITaskActivityManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210023501573" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ITaskActivityManager.deactivateAllTasks()' to 'deactivateActiveTask'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskActivityManager.deactivateAllTasks()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskActivityManager.deactivateActiveTask()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'deactivateAllTasks'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ITaskActivityManager.java[ITaskActivityManager~deactivateAllTasks" name="deactivateActiveTask" references="true" stamp="1210024226420" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ActivityContextExternalizationParticipant.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ActivityContextExternalizationParticipant.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210026639316" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledTaskDelegate.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{ScheduledTaskDelegate.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210041050635" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ScheduledDate.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{ScheduledDate.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210102125481" subPackages="false" version="1.0"/>
+<refactoring comment="Change method 'public Date org.eclipse.mylyn.tasks.core.ITask.getScheduledForDate()' to 'public DateRange getScheduledForDate()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITask.getScheduledForDate()'
- New return type: 'DateRange'" delegate="false" deprecate="true" description="Change method 'getScheduledForDate'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITask.java[ITask~getScheduledForDate" name="getScheduledForDate" return="DateRange" stamp="1210104106574" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.setScheduledFor(ITask task, DateRange reminderDate, boolean floating)' to 'public void setScheduledFor(ITask task, DateRange reminderDate)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.setScheduledFor(...)'
- Removed parameters:
 boolean floating
- Changed parameters:
 Date reminderDate" delegate="false" deprecate="true" description="Change method 'setScheduledFor'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~setScheduledFor~QITask;~QDate;~Z" name="setScheduledFor" parameter1="ITask task 0 ITask task false" parameter2="Date reminderDate 1 DateRange reminderDate false" parameter3="boolean floating 2 {deleted} {deleted} true" stamp="1210137309069" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.getNextWeek()' to 'next'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.getNextWeek()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.next()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNextWeek'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{WeekDateRange.java[WeekDateRange~getNextWeek" name="next" references="true" stamp="1210194833935" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.isWeekDay(...)' to 'isCurrentWeekDay'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.isWeekDay(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.WeekDateRange.isCurrentWeekDay(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isWeekDay'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{WeekDateRange.java[WeekDateRange~isWeekDay~QDateRange;" name="isCurrentWeekDay" references="true" stamp="1210209627277" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.DayDateRange'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core{DayDateRange.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210221254583" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskList.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.core{ITaskList.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210232644062" units="1" version="1.0"/>
+<refactoring comment="Change method 'public RepositoryQuery org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory.createQuery(String repositoryUrl, String queryString, String label, Element element)' to 'public IRepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory.createQuery(...)'
- New return type: 'IRepositoryQuery'" delegate="false" deprecate="true" description="Change method 'createQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractTaskListFactory.java[AbstractTaskListFactory~createQuery~QString;~QString;~QString;~QElement;" name="createQuery" parameter1="String repositoryUrl 0 String repositoryUrl false" parameter2="String queryString 1 String queryString false" parameter3="String label 2 String label false" parameter4="Element element 3 Element element false" return="IRepositoryQuery" stamp="1210286623774" version="1.0"/>
+<refactoring comment="Change method 'public RepositoryQuery org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector.getDuplicatesQuery(TaskRepository repository, RepositoryTaskData taskData)' to 'public IRepositoryQuery getDuplicatesQuery(TaskRepository repository, RepositoryTaskData taskData)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector.getDuplicatesQuery(...)'
- New return type: 'IRepositoryQuery'" delegate="false" deprecate="true" description="Change method 'getDuplicatesQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractDuplicateDetector.java[AbstractDuplicateDetector~getDuplicatesQuery~QTaskRepository;~QRepositoryTaskData;" name="getDuplicatesQuery" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="RepositoryTaskData taskData 1 RepositoryTaskData taskData false" return="IRepositoryQuery" stamp="1210286708922" version="1.0"/>
+<refactoring comment="Change method 'public IRepositoryQuery org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector.getDuplicatesQuery(TaskRepository repository, RepositoryTaskData taskData)' to 'public RepositoryQuery getDuplicatesQuery(TaskRepository repository, RepositoryTaskData taskData)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector.getDuplicatesQuery(...)'
- New return type: 'RepositoryQuery'" delegate="false" deprecate="true" description="Change method 'getDuplicatesQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractDuplicateDetector.java[AbstractDuplicateDetector~getDuplicatesQuery~QTaskRepository;~QRepositoryTaskData;" name="getDuplicatesQuery" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="RepositoryTaskData taskData 1 RepositoryTaskData taskData false" return="RepositoryQuery" stamp="1210286761908" version="1.0"/>
+<refactoring comment="Change method 'public IRepositoryQuery org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory.createQuery(String repositoryUrl, String queryString, String label, Element element)' to 'public RepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory.createQuery(...)'
- New return type: 'RepositoryQuery'" delegate="false" deprecate="true" description="Change method 'createQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractTaskListFactory.java[AbstractTaskListFactory~createQuery~QString;~QString;~QString;~QElement;" name="createQuery" parameter1="String repositoryUrl 0 String repositoryUrl false" parameter2="String queryString 1 String queryString false" parameter3="String label 2 String label false" parameter4="Element element 3 Element element false" return="RepositoryQuery" stamp="1210287305947" version="1.0"/>
+<refactoring comment="Extract local variable 'attribute' from expression 'childElement.getAttribute(DelegatingTaskExternalizer.KEY_HANDLE)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'attribute'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.readQuery()'
- Variable expression: 'childElement.getAttribute(DelegatingTaskExternalizer.KEY_HANDLE)'
- Replace occurrences of expression with variable" description="Extract local variable 'attribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizer.java" name="attribute" replace="true" selection="9480 64" stamp="1210288998112" version="1.0"/>
+<refactoring comment="Extract local variable 'removedChildren' from expression 'collector.getRemovedChildren()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'removedChildren'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob.synchronizeQuery()'
- Variable expression: 'collector.getRemovedChildren()'
- Replace occurrences of expression with variable" description="Extract local variable 'removedChildren'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeQueriesJob.java" name="removedChildren" replace="true" selection="10773 30" stamp="1210291409187" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.createAttributes().node2' in 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.createAttributes()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.createAttributes().node2'" description="Inline local variable 'node2'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{DelegatingTaskExternalizer.java" selection="9714 48" stamp="1210365934448" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/19/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/19/refactorings.index
new file mode 100644
index 0000000..a46bc62
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/19/refactorings.index
@@ -0,0 +1,35 @@
+1209968377806 Delete element
+1209968441201 Extract interface 'ITaskElement'
+1209968461660 Delete element
+1209968494632 Move compilation unit
+1209968621880 Move compilation unit
+1209968639635 Delete element
+1209968810071 Extract interface 'ITask'
+1209969580052 Change method 'taskActivated'
+1209970305280 Change method 'deactivateTask'
+1209970416994 Change method 'activateTask'
+1209970437541 Change method 'activateTask'
+1209970477216 Change method 'activateTask'
+1209970553703 Change method 'notifyTaskChanged'
+1210004371630 Move compilation unit
+1210004423604 Move compilation unit
+1210004469341 Move compilation units
+1210020900899 Extract interface 'ITaskActivityManager'
+1210023501573 Move compilation unit
+1210024226420 Rename method 'deactivateAllTasks'
+1210026639316 Move compilation unit
+1210041050635 Delete element
+1210102125481 Delete element
+1210104106574 Change method 'getScheduledForDate'
+1210137309069 Change method 'setScheduledFor'
+1210194833935 Rename method 'getNextWeek'
+1210209627277 Rename method 'isWeekDay'
+1210221254583 Delete element
+1210232644062 Move compilation unit
+1210286623774 Change method 'createQuery'
+1210286708922 Change method 'getDuplicatesQuery'
+1210286761908 Change method 'getDuplicatesQuery'
+1210287305947 Change method 'createQuery'
+1210288998112 Extract local variable 'attribute'
+1210291409187 Extract local variable 'removedChildren'
+1210365934448 Inline local variable 'node2'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..e59548e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void requestSave()' from 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.repositoryAdded()' to 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'requestSave'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'requestSave'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java" name="requestSave" replace="true" selection="3867 122" stamp="1210611763540" version="1.0" visibility="2"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.ITaskRepositoryManager.addRepository(TaskRepository repository, String repositoryFilePath)' to 'public void addRepository(TaskRepository repository)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskRepositoryManager.addRepository(...)'
- Removed parameters:
 String repositoryFilePath" delegate="false" deprecate="true" description="Change method 'addRepository'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskRepositoryManager.java[ITaskRepositoryManager~addRepository~QTaskRepository;~QString;" name="addRepository" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="String repositoryFilePath 1 {deleted} {deleted} true" stamp="1210612582910" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.addNoTaskActiveTime(...)' to 'addElapsedNoTaskActive'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.addNoTaskActiveTime(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.addElapsedNoTaskActive(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addNoTaskActiveTime'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~addNoTaskActiveTime~QDate;~QDate;" name="addElapsedNoTaskActive" references="true" stamp="1210631756666" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector' to 'AbstractLegacyDuplicateDetector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractDuplicateDetector'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyDuplicateDetector'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'AbstractDuplicateDetector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core.deprecated{AbstractDuplicateDetector.java[AbstractDuplicateDetector" matchStrategy="1" name="AbstractLegacyDuplicateDetector" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1210734344656" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.getStackTraceFromDescription(...)' to 'org.eclipse.mylyn.internal.tasks.core.StackTraceDuplicateDetector'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector.getStackTraceFromDescription(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.StackTraceDuplicateDetector'" delegate="false" deprecate="true" description="Move member 'getStackTraceFromDescription'" element1="/src<org.eclipse.mylyn.tasks.core{AbstractDuplicateDetector.java[AbstractDuplicateDetector~getStackTraceFromDescription~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.core{StackTraceDuplicateDetector.java[StackTraceDuplicateDetector" stamp="1210734500233" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.search'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.search'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.StackTraceDuplicateDetector.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.internal.tasks.ui.search" element1="/src<org.eclipse.mylyn.internal.tasks.core{StackTraceDuplicateDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210734987136" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.setFactories(...)' to 'initialize'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.setFactories(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.initialize(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setFactories'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer~setFactories~QList\<QAbstractTaskListFactory;>;" name="initialize" references="true" stamp="1210802046932" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.readTaskList().queryChildren' in 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.readTaskList()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.readTaskList().queryChildren'" description="Inline local variable 'queryChildren'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizer.java" selection="12794 37" stamp="1210806992864" version="1.0"/>
<refactoring comment="Extract method 'private void resetStatus(ITask task)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob.synchronizeTask()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'resetStatus'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'resetStatus'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeTasksJob.java" name="resetStatus" replace="false" selection="6434 85" stamp="1210820736964" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeAllTasksJob.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeAllTasksJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210820933267" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.deprecated'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.sync.TaskFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.core.deprecated" element1="/src<org.eclipse.mylyn.internal.tasks.core.sync{TaskFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210823175964" units="1" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.readTaskInfo().key' in 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.readTaskInfo()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.readTaskInfo().key'" description="Inline local variable 'key'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{DelegatingTaskExternalizer.java" selection="20987 35" stamp="1210827108619" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.getRepositoriesFile(...)' to 'getFile'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.getRepositoriesFile(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.getFile(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoriesFile'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java[RepositoryExternalizationParticipant~getRepositoriesFile~QString;" name="getFile" references="true" stamp="1210886796771" version="1.0"/>
<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant' to 'org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original elements:
 org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.getFileName()
 org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.getFile(...)
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant'
- Use super type where possible" delete="2" description="Pull up members to 'AbstractExternalizationParticipant'" element1="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java[RepositoryExternalizationParticipant~getFileName" element2="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java[RepositoryExternalizationParticipant~getFile~QString;" element3="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java[RepositoryExternalizationParticipant~getFile~QString;" element4="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java[RepositoryExternalizationParticipant~getFileName" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{AbstractExternalizationParticipant.java[AbstractExternalizationParticipant" instanceof="false" pull="2" replace="true" stamp="1210886999820" stubs="true" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.EXTERNALIZER_ID' from expression '"Task List"'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'EXTERNALIZER_ID'
- Constant expression: '"Task List"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'EXTERNALIZER_ID'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizationParticipant.java" name="EXTERNALIZER_ID" qualify="false" replace="true" selection="3704 11" stamp="1210887153333" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'EXTERNALIZER_ID' in 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant' to 'DESCRIPTION'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.EXTERNALIZER_ID'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.DESCRIPTION'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'EXTERNALIZER_ID'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizationParticipant.java[TaskListExternalizationParticipant^EXTERNALIZER_ID" name="DESCRIPTION" references="true" setter="false" stamp="1210887172282" textual="false" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant.DESCRIPTION' from expression '"Task Repositories"'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'DESCRIPTION'
- Constant expression: '"Task Repositories"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'DESCRIPTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryExternalizationParticipant.java" name="DESCRIPTION" qualify="false" replace="true" selection="1792 19" stamp="1210887453821" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void resetTaskList()' from 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.load().new ITaskListRunnable() {...}.resetAndLoad()' to 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.load().new ITaskListRunnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'resetTaskList'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.load().new ITaskListRunnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'resetTaskList'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizationParticipant.java" name="resetTaskList" replace="false" selection="3090 49" stamp="1210959504083" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..e677965
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,14 @@
+1210611763540 Extract method 'requestSave'
+1210612582910 Change method 'addRepository'
+1210631756666 Rename method 'addNoTaskActiveTime'
+1210734344656 Rename type 'AbstractDuplicateDetector'
+1210734500233 Move member 'getStackTraceFromDescription'
+1210734987136 Move compilation unit
+1210802046932 Rename method 'setFactories'
+1210806992864 Inline local variable 'queryChildren'
+1210886796771 Rename method 'getRepositoriesFile'
+1210886999820 Pull up members to 'AbstractExternalizationParticipant'
+1210887153333 Extract constant 'EXTERNALIZER_ID'
+1210887172282 Rename field 'EXTERNALIZER_ID'
+1210887453821 Extract constant 'DESCRIPTION'
+1210959504083 Extract method 'resetTaskList'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..191c944
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private TaskAttribute createAttribute(String attributeKey)' from 'org.eclipse.mylyn.tasks.core.data.TaskMapper.setBooleanValue()' to 'org.eclipse.mylyn.tasks.core.data.TaskMapper'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'createAttribute'
- Destination type: 'org.eclipse.mylyn.tasks.core.data.TaskMapper'
- Declared visibility: 'private'" comments="false" description="Extract method 'createAttribute'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskMapper.java" name="createAttribute" replace="false" selection="4696 167" stamp="1211313883228" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.ITaskList.notifySyncStateChanged(...)' to 'notifySynchronizationStateChanged'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.ITaskList.notifySyncStateChanged(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.ITaskList.notifySynchronizationStateChanged(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifySyncStateChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{ITaskList.java[ITaskList~notifySyncStateChanged~QITaskElement;" name="notifySynchronizationStateChanged" references="true" stamp="1211487643905" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.notifySyncStateChanged(...)' to 'notifySynchronizationStateChanged'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.notifySyncStateChanged(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.notifySynchronizationStateChanged(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'notifySyncStateChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~notifySyncStateChanged~QSet\<+QITaskElement;>;" name="notifySynchronizationStateChanged" references="true" stamp="1211487655045" version="1.0"/>
<refactoring comment="Extract local variable 'integerValue' from expression 'mapper.getIntegerValue(taskAttribute)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'integerValue'
- Destination method: 'org.eclipse.mylyn.tasks.core.data.TaskCommentMapper.createFrom()'
- Variable expression: 'mapper.getIntegerValue(taskAttribute)'
- Replace occurrences of expression with variable" description="Extract local variable 'integerValue'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.core.data{TaskCommentMapper.java" name="integerValue" replace="true" selection="2033 37" stamp="1211488164883" version="1.0"/>
<refactoring comment="Extract constant '_0' from expression '0'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: '_0'
- Constant expression: '0'
- Declared visibility: 'private'" description="Extract constant '_0'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.core.data{TaskCommentMapper.java" name="_0" qualify="false" replace="false" selection="2115 1" stamp="1211488195261" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'DATE_MODIFIED' in 'org.eclipse.mylyn.tasks.core.data.TaskAttribute' to 'DATE_MODIFICATION'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.DATE_MODIFIED'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.DATE_MODIFICATION'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'DATE_MODIFIED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute^DATE_MODIFIED" name="DATE_MODIFICATION" references="true" setter="true" stamp="1211585501905" textual="false" version="1.0"/>
<refactoring comment="Rename field 'TYPE_NUMBER' in 'org.eclipse.mylyn.tasks.core.data.TaskAttribute' to 'TYPE_INTEGER'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.TYPE_NUMBER'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.TYPE_INTEGER'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'TYPE_NUMBER'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute^TYPE_NUMBER" name="TYPE_INTEGER" references="true" setter="true" stamp="1211587155609" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataUtil.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataUtil.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211598492312" subPackages="false" version="1.0"/>
<refactoring comment="Move 3 members to 'org.eclipse.mylyn.tasks.core.data.TaskAttribute'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original elements:
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.OPERATION_PREFIX
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.ATTACHMENT_PREFIX
 org.eclipse.mylyn.internal.tasks.core.data.TaskDataStateReader.COMMENT_PREFIX
- Destination type: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^OPERATION_PREFIX" element2="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^ATTACHMENT_PREFIX" element3="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataStateReader.java[TaskDataStateReader^COMMENT_PREFIX" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute" stamp="1211599674122" version="1.0"/>
<refactoring comment="Rename field 'ATTACHMENT_PREFIX' in 'org.eclipse.mylyn.tasks.core.data.TaskAttribute' to 'PREFIX_ATTACHMENT'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.ATTACHMENT_PREFIX'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.PREFIX_ATTACHMENT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ATTACHMENT_PREFIX'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute^ATTACHMENT_PREFIX" name="PREFIX_ATTACHMENT" references="true" setter="true" stamp="1211600423531" textual="false" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.core.data.TaskOperation.createFrom().operationId' in 'org.eclipse.mylyn.tasks.core.data.TaskOperation.createFrom()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskOperation.createFrom().operationId'" description="Inline local variable 'operationId'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.core.data{TaskOperation.java" selection="1532 38" stamp="1211603614951" version="1.0"/>
<refactoring comment="Extract local variable 'taskAttribute' from expression 'taskOperation.getTaskAttribute()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'taskAttribute'
- Destination method: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getAssoctiatedAttribute()'
- Variable expression: 'taskOperation.getTaskAttribute()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskAttribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java" name="taskAttribute" replace="true" selection="2243 32" stamp="1211605221562" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setTaskOperation(...)' to 'setActiveOperation'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setTaskOperation(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setActiveOperation(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setTaskOperation'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java[TaskAttributeMapper~setTaskOperation~QTaskData;~QTaskOperation;" name="setActiveOperation" references="true" stamp="1211605403835" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setActiveOperation(...)' to 'setOperationValue'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setActiveOperation(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setOperationValue(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setActiveOperation'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java[TaskAttributeMapper~setActiveOperation~QTaskAttribute;~QTaskOperation;" name="setOperationValue" references="true" stamp="1211606198142" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setOperationValue(...)' to 'setTaskOperationValue'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setOperationValue(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setTaskOperationValue(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setOperationValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java[TaskAttributeMapper~setOperationValue~QTaskAttribute;~QTaskOperation;" name="setTaskOperationValue" references="true" stamp="1211606206969" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getActiveOperation(...)' to 'getTaskOperationValue'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getActiveOperation(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getTaskOperationValue(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getActiveOperation'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java[TaskAttributeMapper~getActiveOperation~QTaskAttribute;" name="getTaskOperationValue" references="true" stamp="1211606252977" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setTaskOperationValue(...)' to 'setTaskOperation'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setTaskOperationValue(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.setTaskOperation(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setTaskOperationValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java[TaskAttributeMapper~setTaskOperationValue~QTaskAttribute;~QTaskOperation;" name="setTaskOperation" references="true" stamp="1211607828270" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getTaskOperationValue(...)' to 'getTaskOperation'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getTaskOperationValue(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper.getTaskOperation(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskOperationValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeMapper.java[TaskAttributeMapper~getTaskOperationValue~QTaskAttribute;" name="getTaskOperation" references="true" stamp="1211607841227" version="1.0"/>
<refactoring comment="Rename field 'source' in 'org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta' to 'element'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta.source'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta.element'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'source'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskContainerDelta.java[TaskContainerDelta^source" name="element" references="true" setter="false" stamp="1211612174868" textual="false" version="1.0"/>
<refactoring comment="Rename field 'target' in 'org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta' to 'parent'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta.target'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta.parent'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'target'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskContainerDelta.java[TaskContainerDelta^target" name="parent" references="true" setter="false" stamp="1211612251274" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData(...)' to 'getMetaDatum'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDatum(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMetaData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~getMetaData~QString;" name="getMetaDatum" references="true" stamp="1211614382636" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDatas()' to 'getMetaData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDatas()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMetaDatas'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~getMetaDatas" name="getMetaData" references="true" stamp="1211614391692" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.putMetaDataValue(...)' to 'putMetaDatum'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.putMetaDataValue(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.putMetaDatum(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'putMetaDataValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~putMetaDataValue~QString;~QString;" name="putMetaDatum" references="true" stamp="1211614410406" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDatas()' to 'clearMetaData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDatas()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'clearMetaDatas'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~clearMetaDatas" name="clearMetaData" references="true" stamp="1211614421129" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData()' to 'getMetaDataMap'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaDataMap()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMetaData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~getMetaData" name="getMetaDataMap" references="true" stamp="1211615681006" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.data.TaskAttributeProperties' to 'TaskAttributeMetaData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeProperties'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskAttributeProperties'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttributeProperties.java[TaskAttributeProperties" matchStrategy="1" name="TaskAttributeMetaData" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1211615734617" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getProperties()' to 'getMetaData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getProperties()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.getMetaData()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getProperties'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~getProperties" name="getMetaData" references="true" stamp="1211615759981" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()' to 'clearMetaDataMap'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaData()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.clearMetaDataMap()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'clearMetaData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~clearMetaData" name="clearMetaDataMap" references="true" stamp="1211616248336" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.removeMetaDataValue(...)' to 'removeMetaDatum'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.removeMetaDataValue(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskAttribute.removeMetaDatum(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'removeMetaDataValue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskAttribute.java[TaskAttribute~removeMetaDataValue~QString;" name="removeMetaDatum" references="true" stamp="1211616295405" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.data.TaskData.getMappedAttribute(...)' to 'getRootMappedAttribute'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.TaskData.getMappedAttribute(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.data.TaskData.getRootMappedAttribute(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMappedAttribute'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskData.java[TaskData~getMappedAttribute~QString;" name="getRootMappedAttribute" references="true" stamp="1211617008995" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..8d5e24b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,30 @@
+1211313883228 Extract method 'createAttribute'
+1211487643905 Rename method 'notifySyncStateChanged'
+1211487655045 Rename method 'notifySyncStateChanged'
+1211488164883 Extract local variable 'integerValue'
+1211488195261 Extract constant '_0'
+1211585501905 Rename field 'DATE_MODIFIED'
+1211587155609 Rename field 'TYPE_NUMBER'
+1211598492312 Delete element
+1211599674122 Move members
+1211600423531 Rename field 'ATTACHMENT_PREFIX'
+1211603614951 Inline local variable 'operationId'
+1211605221562 Extract local variable 'taskAttribute'
+1211605403835 Rename method 'setTaskOperation'
+1211606198142 Rename method 'setActiveOperation'
+1211606206969 Rename method 'setOperationValue'
+1211606252977 Rename method 'getActiveOperation'
+1211607828270 Rename method 'setTaskOperationValue'
+1211607841227 Rename method 'getTaskOperationValue'
+1211612174868 Rename field 'source'
+1211612251274 Rename field 'target'
+1211614382636 Rename method 'getMetaData'
+1211614391692 Rename method 'getMetaDatas'
+1211614410406 Rename method 'putMetaDataValue'
+1211614421129 Rename method 'clearMetaDatas'
+1211615681006 Rename method 'getMetaData'
+1211615734617 Rename type 'TaskAttributeProperties'
+1211615759981 Rename method 'getProperties'
+1211616248336 Rename method 'clearMetaData'
+1211616295405 Rename method 'removeMetaDataValue'
+1211617008995 Rename method 'getMappedAttribute'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..76f5de8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.tasks.core.ITaskActivationListener' from 'org.eclipse.mylyn.tasks.core.ITaskActivityListener'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskActivityListener'
- Extracted interface: 'org.eclipse.mylyn.tasks.core.ITaskActivationListener'
- Extracted members:
 org.eclipse.mylyn.tasks.core.ITaskActivityListener.preTaskActivated(...)
 org.eclipse.mylyn.tasks.core.ITaskActivityListener.preTaskDeactivated(...)
 org.eclipse.mylyn.tasks.core.ITaskActivityListener.taskActivated(...)
 org.eclipse.mylyn.tasks.core.ITaskActivityListener.taskDeactivated(...)
- Use super type where possible" comments="true" description="Extract interface 'ITaskActivationListener'" element1="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener~preTaskActivated~QITask;" element2="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener~preTaskDeactivated~QITask;" element3="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener~taskActivated~QITask;" element4="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener~taskDeactivated~QITask;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.tasks.core{ITaskActivityListener.java[ITaskActivityListener" instanceof="false" name="ITaskActivationListener" public="true" replace="true" stamp="1211829852956" version="1.0"/>
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.tasks.core.TaskActivationAdapter' from 'org.eclipse.mylyn.tasks.core.TaskActivityAdapter'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskActivityAdapter'
- Sub types:
 org.eclipse.mylyn.tasks.core.TaskActivityAdapter
- Extracted class: 'org.eclipse.mylyn.tasks.core.TaskActivationAdapter'
- Extracted members:
 org.eclipse.mylyn.tasks.core.TaskActivityAdapter.preTaskActivated(...)
 org.eclipse.mylyn.tasks.core.TaskActivityAdapter.preTaskDeactivated(...)
 org.eclipse.mylyn.tasks.core.TaskActivityAdapter.taskActivated(...)
 org.eclipse.mylyn.tasks.core.TaskActivityAdapter.taskDeactivated(...)
- Use super type where possible" delete="4" description="Extract superclass 'TaskActivationAdapter'" element1="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~preTaskActivated~QITask;" element2="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~preTaskDeactivated~QITask;" element3="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~taskActivated~QITask;" element4="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~taskDeactivated~QITask;" element5="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~preTaskActivated~QITask;" element6="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~taskActivated~QITask;Task;" element7="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~taskActivated~QITask;" element8="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter~taskDeactivated~QITask;" element9="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter" extract="4" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.tasks.core{TaskActivityAdapter.java[TaskActivityAdapter" instanceof="false" name="TaskActivationAdapter" replace="true" stamp="1211830026173" stubs="true" types="1" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.hasChanged(ITask task, TaskData taskData)' to 'public boolean hasChanged(TaskRepository taskRepository, ITask task, TaskData taskData)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.hasChanged(...)'
- Added parameters:
 TaskRepository taskRepository" default1="xxx" delegate="false" deprecate="true" description="Change method 'hasChanged'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~hasChanged~QITask;~QTaskData;" name="hasChanged" parameter1="{added} {added} -1 TaskRepository taskRepository false" parameter2="ITask task 0 ITask task false" parameter3="TaskData taskData 1 TaskData taskData false" stamp="1211838373549" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy.save(Set<TaskAttribute> edits, IProgressMonitor monitor) throws CoreException' to 'public void save(Set<TaskAttribute> edits, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy.save(...)'" delegate="false" deprecate="true" description="Change method 'save'" element1="=org.eclipse.mylyn.tasks.ui/\/usr\/local\/eclipse-3.4RC2\/plugins\/org.eclipse.equinox.common_3.4.0.v20080421-2006.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core.data{ITaskDataWorkingCopy.java[ITaskDataWorkingCopy~save~QIProgressMonitor;~QSet\<QTaskAttribute;>;" kind1="0" name="save" parameter1="Set<TaskAttribute> edits 1 Set<TaskAttribute> edits false" parameter2="IProgressMonitor monitor 0 IProgressMonitor monitor false" stamp="1211844956044" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler.canInitializeSubTaskData(ITask task)' to 'public boolean canInitializeSubTaskData(TaskRepository taskRepository, ITask task)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler.canInitializeSubTaskData(...)'
- Added parameters:
 TaskRepository taskRepository" default1="null" delegate="false" deprecate="true" description="Change method 'canInitializeSubTaskData'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core.data{AbstractTaskDataHandler.java[AbstractTaskDataHandler~canInitializeSubTaskData~QITask;" name="canInitializeSubTaskData" parameter1="{added} {added} -1 TaskRepository taskRepository false" parameter2="ITask task 0 ITask task false" stamp="1211850280143" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler.canGetMultiTaskData()' to 'public boolean canGetMultiTaskData(TaskRepository taskRepository)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler.canGetMultiTaskData()'
- Added parameters:
 TaskRepository taskRepository" default1="null" delegate="false" deprecate="true" description="Change method 'canGetMultiTaskData'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core.data{AbstractTaskDataHandler.java[AbstractTaskDataHandler~canGetMultiTaskData" name="canGetMultiTaskData" parameter1="{added} {added} -1 TaskRepository taskRepository false" stamp="1211850295478" version="1.0"/>
<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original elements:
 org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.tasks.core{ScheduledTaskContainer.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1212020604558" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.sync.TaskJob.getErrorStatus()' to 'getStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.sync.TaskJob.getErrorStatus()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.sync.TaskJob.getStatus()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getErrorStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.sync{TaskJob.java[TaskJob~getErrorStatus" name="getStatus" references="true" stamp="1212021167614" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ITask.getErrorStatus()' to 'getStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITask.getErrorStatus()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ITask.getStatus()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getErrorStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ITask.java[ITask~getErrorStatus" name="getStatus" references="true" stamp="1212021582780" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.getErrorStatus()' to 'getStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getErrorStatus()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.getStatus()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getErrorStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~getErrorStatus" name="getStatus" references="true" stamp="1212021634900" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.TaskRepository.setErrorStatus(...)' to 'setStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.setErrorStatus(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.TaskRepository.setStatus(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setErrorStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository~setErrorStatus~QIStatus;" name="setStatus" references="true" stamp="1212021641516" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.RepositoryQuery.getSynchronizationStatus()' to 'getStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryQuery.getSynchronizationStatus()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryQuery.getStatus()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSynchronizationStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryQuery.java[RepositoryQuery~getSynchronizationStatus" name="getStatus" references="true" stamp="1212022100199" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.RepositoryQuery.setSynchronizationStatus(...)' to 'setStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryQuery.setSynchronizationStatus(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryQuery.setStatus(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setSynchronizationStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{RepositoryQuery.java[RepositoryQuery~setSynchronizationStatus~QIStatus;" name="setStatus" references="true" stamp="1212022109569" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.tasks.core.ITaskContainer' from 'org.eclipse.mylyn.tasks.core.ITaskElement'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskElement'
- Extracted interface: 'org.eclipse.mylyn.tasks.core.ITaskContainer'
- Extracted members:
 org.eclipse.mylyn.tasks.core.ITaskElement.getChildren()
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'ITaskContainer'" element1="/src<org.eclipse.mylyn.tasks.core{ITaskElement.java[ITaskElement~getChildren" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.tasks.core{ITaskElement.java[ITaskElement" instanceof="true" name="ITaskContainer" public="true" replace="true" stamp="1212028523630" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.core.ITaskElement' to 'IRepositoryElement'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskElement'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IRepositoryElement'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ITaskElement'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.core{ITaskElement.java[ITaskElement" matchStrategy="1" name="IRepositoryElement" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1212028696769" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskList.getTaskContainers()' to 'getTaskCategories'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getTaskContainers()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskList.getTaskCategories()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskContainers'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskList.java[TaskList~getTaskContainers" name="getTaskCategories" references="true" stamp="1212100946887" version="1.0"/>
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.tasks.core.TaskRepository.propertyChangeListeners' in 'org.eclipse.mylyn.tasks.core.TaskRepository'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskRepository.propertyChangeListeners'
- Getter method name: 'getPropertyChangeListeners'
- Setter method name: 'setPropertyChangeListeners'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'propertyChangeListeners'" flags="589830" getter="getPropertyChangeListeners" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.tasks.core{TaskRepository.java[TaskRepository^propertyChangeListeners" insertion="64" setter="setPropertyChangeListeners" stamp="1212113634318" version="1.0" visibility="1"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ICapabilityContext.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{ICapabilityContext.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212129003943" subPackages="false" version="1.0"/>

<refactoring comment="Extract method 'private void updateTaskFromTaskData(final TaskData taskData,final AbstractTask task,final AbstractRepositoryConnector connector,final TaskRepository repository,final boolean changed,final boolean[] elementChanged)' from 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager.putUpdatedTaskData().new ITaskListRunnable() {...}.execute()' to 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager.putUpdatedTaskData().new ITaskListRunnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'updateTaskFromTaskData'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager.putUpdatedTaskData().new ITaskListRunnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateTaskFromTaskData'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataManager.java" name="updateTaskFromTaskData" replace="false" selection="8119 505" stamp="1212171086207" version="1.0" visibility="2"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.readTaskInfo().syncState' in 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.readTaskInfo()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.DelegatingTaskExternalizer.readTaskInfo().syncState'" description="Inline local variable 'syncState'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{DelegatingTaskExternalizer.java" selection="20587 48" stamp="1212191951377" version="1.0"/>
<refactoring comment="Extract method 'private void migrate(final TaskDataState taskDataState,final TaskRepository taskRepository,final AbstractTaskDataHandler taskDataHandler)' from 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataExternalizer.migrate()' to 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataExternalizer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'migrate'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.data.TaskDataExternalizer'
- Declared visibility: 'private'" comments="false" description="Extract method 'migrate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.data{TaskDataExternalizer.java" name="migrate" replace="false" selection="2604 322" stamp="1212265561707" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..7e0e5a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,21 @@
+1211829852956 Extract interface 'ITaskActivationListener'
+1211830026173 Extract superclass 'TaskActivationAdapter'
+1211838373549 Change method 'hasChanged'
+1211844956044 Change method 'save'
+1211850280143 Change method 'canInitializeSubTaskData'
+1211850295478 Change method 'canGetMultiTaskData'
+1212020604558 Infer generic type arguments
+1212021167614 Rename method 'getErrorStatus'
+1212021582780 Rename method 'getErrorStatus'
+1212021634900 Rename method 'getErrorStatus'
+1212021641516 Rename method 'setErrorStatus'
+1212022100199 Rename method 'getSynchronizationStatus'
+1212022109569 Rename method 'setSynchronizationStatus'
+1212028523630 Extract interface 'ITaskContainer'
+1212028696769 Rename type 'ITaskElement'
+1212100946887 Rename method 'getTaskContainers'
+1212113634318 Encapsulate field 'propertyChangeListeners'
+1212129003943 Delete element
+1212171086207 Extract method 'updateTaskFromTaskData'
+1212191951377 Inline local variable 'syncState'
+1212265561707 Extract method 'migrate'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/22/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/22/refactorings.history
new file mode 100644
index 0000000..2c3adf2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private TaskAttribute getAttribute(String attributeKey)' from 'org.eclipse.mylyn.tasks.core.data.TaskMapper.setDateValue()' to 'org.eclipse.mylyn.tasks.core.data.TaskMapper'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'getAttribute'
- Destination type: 'org.eclipse.mylyn.tasks.core.data.TaskMapper'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'getAttribute'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.core.data{TaskMapper.java" name="getAttribute" replace="true" selection="6253 189" stamp="1212286022136" version="1.0" visibility="2"/>
<refactoring comment="Change method 'public String[] org.eclipse.mylyn.tasks.core.ITaskMapping.getCc()' to 'public List<String> getCc()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskMapping.getCc()'
- New return type: 'List<String>'" delegate="false" deprecate="true" description="Change method 'getCc'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskMapping.java[ITaskMapping~getCc" name="getCc" return="List<String>" stamp="1212286263863" version="1.0"/>
<refactoring comment="Change method 'public String[] org.eclipse.mylyn.tasks.core.ITaskMapping.getKeywords()' to 'public List<String> getKeywords()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskMapping.getKeywords()'
- New return type: 'List<String>'" delegate="false" deprecate="true" description="Change method 'getKeywords'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.core{ITaskMapping.java[ITaskMapping~getKeywords" name="getKeywords" return="List<String>" stamp="1212286283923" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/22/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/22/refactorings.index
new file mode 100644
index 0000000..17acfd8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/22/refactorings.index
@@ -0,0 +1,3 @@
+1212286022136 Extract method 'getAttribute'
+1212286263863 Change method 'getCc'
+1212286283923 Change method 'getKeywords'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..3036949
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession.putUpdatedTaskData(...)' to 'putTaskData'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession.putUpdatedTaskData(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession.putTaskData(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'putUpdatedTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core.sync{ISynchronizationSession.java[ISynchronizationSession~putUpdatedTaskData~QITask;~QTaskData;" name="putTaskData" references="true" stamp="1212377409575" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.hasChanged(...)' to 'hasTaskChanged'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.hasChanged(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector.hasTaskChanged(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{AbstractRepositoryConnector.java[AbstractRepositoryConnector~hasChanged~QTaskRepository;~QITask;~QTaskData;" name="hasTaskChanged" references="true" stamp="1212380332166" version="1.0"/>
<refactoring comment="Extract local variable 'legacyParentCategoryMap' from expression 'delagatingExternalizer.getLegacyParentCategoryMap()'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Variable name: 'legacyParentCategoryMap'
- Destination method: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.readTaskList()'
- Variable expression: 'delagatingExternalizer.getLegacyParentCategoryMap()'
- Replace occurrences of expression with variable" description="Extract local variable 'legacyParentCategoryMap'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizer.java" name="legacyParentCategoryMap" replace="true" selection="13018 51" stamp="1212454549425" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.createTaskListRoot()' in 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.createTaskListRoot()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'createTaskListRoot'" flags="786434" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizer.java" mode="1" selection="7418 0" stamp="1212462044402" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.writeTaskList()' in 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer.writeTaskList()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'writeTaskList'" flags="786434" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizer.java" mode="1" selection="5454 0" stamp="1212462173973" version="1.0"/>

<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.TasksModel' to 'RepositoryModel'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TasksModel'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.RepositoryModel'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TasksModel'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core{TasksModel.java[TasksModel" matchStrategy="1" name="RepositoryModel" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1212463643920" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.IRepositoryModel.createQuery(...)' to 'createRepositoryQuery'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.IRepositoryModel.createQuery(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.IRepositoryModel.createRepositoryQuery(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createQuery'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{IRepositoryModel.java[IRepositoryModel~createQuery~QTaskRepository;" name="createRepositoryQuery" references="true" stamp="1212468845234" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.saveNow(IProgressMonitor monitor)' to 'public void saveNow(boolean force, IProgressMonitor monitor)'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.saveNow(...)'
- Added parameters:
 boolean force" default1="false" delegate="false" deprecate="true" description="Change method 'saveNow'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ExternalizationManager.java[ExternalizationManager~saveNow~QIProgressMonitor;" name="saveNow" parameter1="{added} {added} -1 boolean force false" parameter2="IProgressMonitor monitor 0 IProgressMonitor monitor false" stamp="1212523697508" version="1.0"/>
<refactoring comment="Extract constant '_3000' from expression '3000'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: '_3000'
- Constant expression: '3000'
- Declared visibility: 'private'" description="Extract constant '_3000'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ExternalizationManager.java" name="_3000" qualify="false" replace="false" selection="3974 4" stamp="1212547062242" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.setStatus(...)' to 'setLoadStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.setStatus(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.setLoadStatus(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ExternalizationManager.java[ExternalizationManager~setStatus~QMultiStatus;" name="setLoadStatus" references="true" stamp="1212547345310" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationContext.KIND' to 'Kind'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationContext.KIND'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationContext.Kind'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'KIND'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{IExternalizationContext.java[IExternalizationContext[KIND" matchStrategy="1" name="Kind" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1212547533722" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.reLoad()' to 'load'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.reLoad()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.load()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'reLoad'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ExternalizationManager.java[ExternalizationManager~reLoad" name="load" references="true" stamp="1212547753358" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.saveNow(...)' to 'requestSaveAndWait'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.saveNow(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager.requestSaveAndWait(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveNow'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{ExternalizationManager.java[ExternalizationManager~saveNow~Z~QIProgressMonitor;" name="requestSaveAndWait" references="true" stamp="1212548370644" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ITaskMapping.copyFrom(...)' to 'merge'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskMapping.copyFrom(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskMapping.merge(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'copyFrom'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ITaskMapping.java[ITaskMapping~copyFrom~QITaskMapping;" name="merge" references="true" stamp="1212631675852" version="1.0"/>
<refactoring comment="Rename field 'attemptRestore20Tasklist' in 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant' to 'restore20Tasklist'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.attemptRestore20Tasklist'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizationParticipant.restore20Tasklist'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'attemptRestore20Tasklist'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{TaskListExternalizationParticipant.java[TaskListExternalizationParticipant^attemptRestore20Tasklist" name="restore20Tasklist" references="true" setter="false" stamp="1212706398807" textual="false" version="1.0"/>
<refactoring comment="Extract method 'private void performLoad(IProgressMonitor monitor,final File dataFile) throws CoreException ' from 'org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant.execute()' to 'org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'performLoad'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant'
- Declared visibility: 'private'" comments="false" description="Extract method 'performLoad'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{AbstractExternalizationParticipant.java" name="performLoad" replace="false" selection="2925 270" stamp="1212707832783" version="1.0" visibility="2"/>
<refactoring comment="Change method 'protected boolean org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant.performLoad(File dataFile, IProgressMonitor monitor) throws CoreException' to 'protected boolean performLoad(File dataFile, IProgressMonitor monitor) throws CoreException'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant.performLoad(...)'" delegate="false" deprecate="true" description="Change method 'performLoad'" element1="=org.eclipse.mylyn.tasks.ui/C:\/apps\/eclipse-3.4\/RC3\/head\/plugins\/org.eclipse.equinox.common_3.4.0.v20080421-2006.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.core.externalization{AbstractExternalizationParticipant.java[AbstractExternalizationParticipant~performLoad~QIProgressMonitor;~QFile;" kind1="0" name="performLoad" parameter1="File dataFile 1 File dataFile false" parameter2="IProgressMonitor monitor 0 IProgressMonitor monitor false" stamp="1212708026187" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..2b5c7f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,17 @@
+1212377409575 Rename method 'putUpdatedTaskData'
+1212380332166 Rename method 'hasChanged'
+1212454549425 Extract local variable 'legacyParentCategoryMap'
+1212462044402 Inline method 'createTaskListRoot'
+1212462173973 Inline method 'writeTaskList'
+1212463643920 Rename type 'TasksModel'
+1212468845234 Rename method 'createQuery'
+1212523697508 Change method 'saveNow'
+1212547062242 Extract constant '_3000'
+1212547345310 Rename method 'setStatus'
+1212547533722 Rename type 'KIND'
+1212547753358 Rename method 'reLoad'
+1212548370644 Rename method 'saveNow'
+1212631675852 Rename method 'copyFrom'
+1212706398807 Rename field 'attemptRestore20Tasklist'
+1212707832783 Extract method 'performLoad'
+1212708026187 Change method 'performLoad'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..a0f8efc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.core.ITaskMapping.getPriority()' to 'getPriorityLevel'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.core.ITaskMapping.getPriority()'
- Renamed element: 'org.eclipse.mylyn.tasks.core.ITaskMapping.getPriorityLevel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getPriority'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.core{ITaskMapping.java[ITaskMapping~getPriority" name="getPriorityLevel" references="true" stamp="1213069545028" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.AbstractTask.setErrorStatus(...)' to 'setStatus'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.AbstractTask.setErrorStatus(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.AbstractTask.setStatus(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setErrorStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{AbstractTask.java[AbstractTask~setErrorStatus~QIStatus;" name="setStatus" references="true" stamp="1213242671085" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..7559f3b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1213069545028 Rename method 'getPriority'
+1213242671085 Rename method 'setErrorStatus'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/7/27/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/7/27/refactorings.history
new file mode 100644
index 0000000..7d00bd4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/7/27/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer' from 'org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer'
- Sub types:
 org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer
- Extracted class: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer.repositoryUrl" delete="0" description="Extract superclass 'AutomaticRepositoryTaskContainer'" element1="/src<org.eclipse.mylyn.internal.tasks.core{UnmatchedTaskContainer.java[UnmatchedTaskContainer^repositoryUrl" element2="/src<org.eclipse.mylyn.internal.tasks.core{UnmatchedTaskContainer.java[UnmatchedTaskContainer" extract="1" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.internal.tasks.core{UnmatchedTaskContainer.java[UnmatchedTaskContainer" instanceof="true" name="AutomaticRepositoryTaskContainer" replace="false" stamp="1214882001335" stubs="true" types="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCustomHandle()' to 'getCommonHandle'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCustomHandle()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCommonHandle()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCustomHandle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{AutomaticRepositoryTaskContainer.java[AutomaticRepositoryTaskContainer~getCustomHandle" name="getCommonHandle" references="true" stamp="1214882482290" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCommonHandle()' to 'getCommonHandleSuffix'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCommonHandle()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCommonHandleSuffix()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCommonHandle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{AutomaticRepositoryTaskContainer.java[AutomaticRepositoryTaskContainer~getCommonHandle" name="getCommonHandleSuffix" references="true" stamp="1214882491810" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCommonHandleSuffix()' to 'getHandleSuffix'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getCommonHandleSuffix()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer.getHandleSuffix()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCommonHandleSuffix'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{AutomaticRepositoryTaskContainer.java[AutomaticRepositoryTaskContainer~getCommonHandleSuffix" name="getHandleSuffix" references="true" stamp="1214882494998" version="1.0"/>
<refactoring comment="Extract method 'private SynchronizeQueriesJob updateQueries(TaskRepository repository,final AbstractRepositoryConnector connector,Set<RepositoryQuery> queries,IProgressMonitor monitor)' from 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob.run()' to 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Method name: 'updateQueries'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateQueries'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.core.sync{SynchronizeRepositoriesJob.java" name="updateQueries" replace="false" selection="3121 630" stamp="1215139956581" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/7/27/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/7/27/refactorings.index
new file mode 100644
index 0000000..eaf9d1b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/7/27/refactorings.index
@@ -0,0 +1,5 @@
+1214882001335 Extract superclass 'AutomaticRepositoryTaskContainer'
+1214882482290 Rename method 'getCustomHandle'
+1214882491810 Rename method 'getCommonHandle'
+1214882494998 Rename method 'getCommonHandleSuffix'
+1215139956581 Extract method 'updateQueries'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..85e4e55
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getScheduledForThisWeek()' to 'getScheduledForADayThisWeek'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getScheduledForThisWeek()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.core.TaskActivityManager.getScheduledForADayThisWeek()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getScheduledForThisWeek'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.core{TaskActivityManager.java[TaskActivityManager~getScheduledForThisWeek" name="getScheduledForADayThisWeek" references="true" stamp="1220915591099" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..53c14c9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1 @@
+1220915591099 Rename method 'getScheduledForThisWeek'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2009/3/14/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2009/3/14/refactorings.history
new file mode 100644
index 0000000..5fcd70d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2009/3/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'APPLICATION_XML' from expression '"application/xml"'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'APPLICATION_XML'
- Constant expression: '"application/xml"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'APPLICATION_XML'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.data{FileTaskAttachmentSource.java" name="APPLICATION_XML" qualify="false" replace="true" selection="2388 17" stamp="1238424176897" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'TEXT_PLAIN' from expression '"text/plain"'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Constant name: 'TEXT_PLAIN'
- Constant expression: '"text/plain"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'TEXT_PLAIN'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.core.data{FileTaskAttachmentSource.java" name="TEXT_PLAIN" qualify="false" replace="true" selection="1875 12" stamp="1238424208097" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2009/3/14/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2009/3/14/refactorings.index
new file mode 100644
index 0000000..a54cf56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2009/3/14/refactorings.index
@@ -0,0 +1,2 @@
+1238424176897 Extract constant 'APPLICATION_XML'
+1238424208097 Extract constant 'TEXT_PLAIN'
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2009/5/19/refactorings.history b/org.eclipse.mylyn.tasks.core/.refactorings/2009/5/19/refactorings.history
new file mode 100644
index 0000000..d05e4b6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2009/5/19/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer.LABEL' in 'org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786438" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.core{UnmatchedTaskContainer.java" remove="true" replace="true" selection="832 0" stamp="1241757605429" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer.LABEL' in 'org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer'
- Original project: 'org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.core{UnsubmittedTaskContainer.java" remove="true" replace="true" selection="766 0" stamp="1241757626824" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/.refactorings/2009/5/19/refactorings.index b/org.eclipse.mylyn.tasks.core/.refactorings/2009/5/19/refactorings.index
new file mode 100644
index 0000000..6c31e2e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.refactorings/2009/5/19/refactorings.index
@@ -0,0 +1,2 @@
+1241757605429 Inline constant 'LABEL'
+1241757626824 Inline constant 'LABEL'
diff --git a/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6f004ad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.tasks.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.net,
+ org.eclipse.equinox.security,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)"
+Export-Package: org.eclipse.mylyn.internal.provisional.tasks.core;x-internal:=true,
+ 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.sync;x-friends:="org.eclipse.mylyn.tasks.ui,org.eclipse.mylyn.tasks.bugs",
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.tasks.core.data,
+ org.eclipse.mylyn.tasks.core.sync
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.tasks.core/about.html b/org.eclipse.mylyn.tasks.core/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/build-user.xml b/org.eclipse.mylyn.tasks.core/build-user.xml
new file mode 100644
index 0000000..6097713
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/build-user.xml
@@ -0,0 +1,3 @@
+<target name="help">
+ <echo message="Please run: $ ant -v -projecthelp"/>
+</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/build.properties b/org.eclipse.mylyn.tasks.core/build.properties
new file mode 100644
index 0000000..36dd8a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ plugin.xml,\
+ .,\
+ about.html,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.tasks.core/icons/elcl16/edge-ref-bug.gif b/org.eclipse.mylyn.tasks.core/icons/elcl16/edge-ref-bug.gif
new file mode 100644
index 0000000..9cfd7ec
Binary files /dev/null and b/org.eclipse.mylyn.tasks.core/icons/elcl16/edge-ref-bug.gif differ
diff --git a/org.eclipse.mylyn.tasks.core/plugin.properties b/org.eclipse.mylyn.tasks.core/plugin.properties
new file mode 100644
index 0000000..536aadb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.tasks.core
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Tasks Core
diff --git a/org.eclipse.mylyn.tasks.core/plugin.xml b/org.eclipse.mylyn.tasks.core/plugin.xml
new file mode 100644
index 0000000..e218e14
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/plugin.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="templates" name="templates" schema="schema/templates.exsd"/>
+
+ <!--
+ <extension
+ point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+ <hyperlinkDetector class="org.eclipse.mylyn.internal.bugs.java.BugzillaHyperLinkDetector"/>
+ </extension>
+ -->
+
+<!--
+ <extension
+ point="org.eclipse.mylyn.core.context">
+ <structureBridge
+ activeSearchIcon="icons/elcl16/edge-ref-bug.gif"
+ activeSearchLabel="Bugzilla References"
+ class="org.eclipse.mylyn.bugs.BugzillaStructureBridge"
+ name="Bugzilla Structure Bridge"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.ui.context">
+ <uiBridge
+ class="org.eclipse.mylyn.bugs.BugzillaUiBridge"
+ contentType="bugzilla"/>
+ </extension>
+-->
+</plugin>
diff --git a/org.eclipse.mylyn.tasks.core/schema/templates.exsd b/org.eclipse.mylyn.tasks.core/schema/templates.exsd
new file mode 100644
index 0000000..9038e77
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/schema/templates.exsd
@@ -0,0 +1,194 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.core" id="templates" name="templates"/>
+ </appInfo>
+ <documentation>
+ Templates describing default parameters for new repository configurations.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="repository" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="repository">
+ <complexType>
+ <sequence>
+ <element ref="attribute" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="label" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="urlRepository" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="repositoryKind" type="string" use="required">
+ <annotation>
+ <documentation>
+ Connector Kind, as declared by the Connector (e.g. "bugzilla").
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="version" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="urlNewAccount" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="characterEncoding" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="urlNewTask" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="urlTask" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="urlTaskQuery" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="addAutomatically" type="boolean">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="anonymous" type="boolean">
+ <annotation>
+ <documentation>
+ True if an anonymous login is accepted for this repository.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="attribute">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="value" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/provisional/tasks/core/RepositoryClientManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/provisional/tasks/core/RepositoryClientManager.java
new file mode 100644
index 0000000..d3064a6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/provisional/tasks/core/RepositoryClientManager.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+
+/**
+ * TODO: fix class loading problems caused by serialization and make API
+ *
+ * @author Steffen Pingel
+ */
+abstract class RepositoryClientManager<T, C extends Serializable> implements IRepositoryListener {
+
+ private final Map<String, T> clientByUrl = new HashMap<String, T>();
+
+ private final Map<String, C> clientDataByUrl = new HashMap<String, C>();
+
+ private final File cacheFile;
+
+ private TaskRepositoryLocationFactory taskRepositoryLocationFactory;
+
+ public RepositoryClientManager(File cacheFile) {
+ Assert.isNotNull(cacheFile);
+ this.cacheFile = cacheFile;
+ readCache();
+ }
+
+ public synchronized T getClient(TaskRepository taskRepository) {
+ Assert.isNotNull(taskRepository);
+ T client = clientByUrl.get(taskRepository.getRepositoryUrl());
+ if (client == null) {
+ C data = clientDataByUrl.get(taskRepository.getRepositoryUrl());
+ if (data == null) {
+ data = createRepositoryConfiguration();
+ clientDataByUrl.put(taskRepository.getRepositoryUrl(), data);
+ }
+
+ client = createClient(taskRepository, data);
+ clientByUrl.put(taskRepository.getRepositoryUrl(), client);
+ }
+ return client;
+ }
+
+ protected abstract C createRepositoryConfiguration();
+
+ protected abstract T createClient(TaskRepository taskRepository, C data);
+
+ public void repositoriesRead() {
+ // ignore
+ }
+
+ public synchronized void repositoryAdded(TaskRepository repository) {
+ removeClient(repository);
+ clientDataByUrl.remove(repository.getRepositoryUrl());
+ }
+
+ private void removeClient(TaskRepository repository) {
+ clientByUrl.remove(repository.getRepositoryUrl());
+ }
+
+ public synchronized void repositoryRemoved(TaskRepository repository) {
+ removeClient(repository);
+ clientDataByUrl.remove(repository.getRepositoryUrl());
+ }
+
+ public synchronized void repositorySettingsChanged(TaskRepository repository) {
+ removeClient(repository);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void readCache() {
+ if (cacheFile == null || !cacheFile.exists()) {
+ return;
+ }
+
+ ObjectInputStream in = null;
+ try {
+ in = new ObjectInputStream(new FileInputStream(cacheFile));
+ int size = in.readInt();
+ for (int i = 0; i < size; i++) {
+ String url = (String) in.readObject();
+ C data = (C) in.readObject();
+ if (url != null && data != null) {
+ clientDataByUrl.put(url, data);
+ }
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "The respository configuration cache could not be read", e)); //$NON-NLS-1$
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+
+ }
+
+ public void writeCache() {
+ if (cacheFile == null) {
+ return;
+ }
+
+ ObjectOutputStream out = null;
+ try {
+ out = new ObjectOutputStream(new FileOutputStream(cacheFile));
+ out.writeInt(clientDataByUrl.size());
+ for (String url : clientDataByUrl.keySet()) {
+ out.writeObject(url);
+ out.writeObject(clientDataByUrl.get(url));
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "The respository configuration cache could not be written", e)); //$NON-NLS-1$
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ public TaskRepositoryLocationFactory getTaskRepositoryLocationFactory() {
+ return taskRepositoryLocationFactory;
+ }
+
+ public void setTaskRepositoryLocationFactory(TaskRepositoryLocationFactory taskRepositoryLocationFactory) {
+ this.taskRepositoryLocationFactory = taskRepositoryLocationFactory;
+ }
+
+ public void repositoryUrlChanged(TaskRepository repository, String oldUrl) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/provisional/tasks/core/TasksUtil.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/provisional/tasks/core/TasksUtil.java
new file mode 100644
index 0000000..b70be4a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/provisional/tasks/core/TasksUtil.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.core;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TasksUtil {
+
+ public static String decode(String text) {
+ boolean escaped = false;
+ StringBuffer sb = new StringBuffer(text.length());
+ StringBuffer escapedText = new StringBuffer(4);
+ char[] chars = text.toCharArray();
+ for (char c : chars) {
+ if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {
+ if (escaped) {
+ escapedText.append(c);
+ } else {
+ sb.append(c);
+ }
+ } else if (c == '%') {
+ if (escaped) {
+ throw new IllegalArgumentException("Unexpected '%' sign in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ escaped = !escaped;
+ } else if (c == '_') {
+ if (!escaped) {
+ throw new IllegalArgumentException("Unexpected '_' sign in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ try {
+ sb.append((char) Integer.parseInt(escapedText.toString(), 16));
+ escapedText.setLength(0);
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("Invalid escape code in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ escaped = !escaped;
+ } else {
+ throw new IllegalArgumentException("Unexpected character '" + c + "' in '" + text + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ }
+ return sb.toString();
+ }
+
+ public static String encode(String text) {
+ StringBuffer sb = new StringBuffer(text.length());
+ char[] chars = text.toCharArray();
+ for (char c : chars) {
+ if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {
+ sb.append(c);
+ } else {
+ sb.append("%" + Integer.toHexString(c).toUpperCase() + "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractSearchHandler.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractSearchHandler.java
new file mode 100644
index 0000000..576a10e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractSearchHandler.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * Note: This is provisional API that is used by connectors.
+ * <p>
+ * DO NOT CHANGE.
+ *
+ * @author Steffen Pingel
+ */
+public abstract class AbstractSearchHandler {
+
+ public abstract String getConnectorKind();
+
+ public abstract boolean queryForText(TaskRepository taskRepository, IRepositoryQuery query, TaskData taskData,
+ String searchString);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTask.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTask.java
new file mode 100644
index 0000000..235dde3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTask.java
@@ -0,0 +1,513 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Encapsulates tasks that reside on a repository or local computer and participate in synchronization with the source
+ * that contains their data.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @since 2.0
+ */
+public abstract class AbstractTask extends AbstractTaskContainer implements ITask, ITaskRepositoryElement {
+
+ public static final String DEFAULT_TASK_KIND = "task"; //$NON-NLS-1$
+
+ private String repositoryUrl;
+
+ private String taskKind = DEFAULT_TASK_KIND;
+
+ private final String taskId;
+
+ private String owner;
+
+ private boolean active = false;
+
+ private String summary;
+
+ private String priority = PriorityLevel.getDefault().toString();
+
+ private boolean isNotifiedIncoming = false;
+
+ private boolean reminded = false;
+
+ private final Set<AbstractTaskContainer> containers = new HashSet<AbstractTaskContainer>();
+
+ // ************ Synch ****************
+
+ /** The last time this task's bug report was in a synchronized (read?) state. */
+ private String lastReadTimeStamp;
+
+ private boolean synchronizing;
+
+ private boolean submitting;
+
+ private SynchronizationState synchronizationState = SynchronizationState.SYNCHRONIZED;
+
+ // transient
+ private IStatus status = null;
+
+ private boolean stale = false;
+
+ private Date completionDate = null;
+
+ private Date creationDate = null;
+
+ private Date modificationDate = null;
+
+ private DateRange scheduledForDate = null;
+
+ private Date dueDate = null;
+
+ private String notes = ""; //$NON-NLS-1$
+
+ private int estimatedTimeHours = 1;
+
+ private boolean markReadPending;
+
+ // TODO 4.0 make private
+ protected String taskKey;
+
+ private AttributeMap attributeMap;
+
+ private boolean changed;
+
+ public AbstractTask(String repositoryUrl, String taskId, String summary) {
+ super(RepositoryTaskHandleUtil.getHandle(repositoryUrl, taskId));
+ this.repositoryUrl = repositoryUrl;
+ this.taskId = taskId;
+ this.summary = summary;
+ }
+
+ /**
+ * Final to preserve the handle identifier format required by the framework.
+ */
+ @Override
+ public final String getHandleIdentifier() {
+ return super.getHandleIdentifier();
+ }
+
+ /**
+ * True for tasks that can be modified without a round-trip to a server. For example, such a task can be marked
+ * completed via the Task List.
+ *
+ * @deprecated use <code>task instanceof LocalTask</code> instead
+ */
+ @Deprecated
+ public abstract boolean isLocal();
+
+ public abstract String getConnectorKind();
+
+ @Deprecated
+ public String getLastReadTimeStamp() {
+ return lastReadTimeStamp;
+ }
+
+ @Deprecated
+ public void setLastReadTimeStamp(String lastReadTimeStamp) {
+ this.lastReadTimeStamp = lastReadTimeStamp;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setSynchronizationState(SynchronizationState syncState) {
+ Assert.isNotNull(syncState);
+ this.synchronizationState = syncState;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public SynchronizationState getSynchronizationState() {
+ return synchronizationState;
+ }
+
+ public boolean isSynchronizing() {
+ return synchronizing;
+ }
+
+ public void setSynchronizing(boolean sychronizing) {
+ this.synchronizing = sychronizing;
+ }
+
+ public boolean isNotified() {
+ return isNotifiedIncoming;
+ }
+
+ public void setNotified(boolean notified) {
+ isNotifiedIncoming = notified;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ if (!areEqual(this.owner, owner)) {
+ String oldValue = this.owner;
+ this.owner = owner;
+ firePropertyChange("owner", oldValue, owner); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Return the status, such as an error or warning, associated with this task.
+ */
+ public IStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(IStatus status) {
+ this.status = status;
+ }
+
+ public final String getTaskId() {
+ return taskId;
+ }
+
+ public final String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ @Override
+ public final void setHandleIdentifier(String handleIdentifier) {
+ throw new RuntimeException("Cannot set the handle identifier of a task, set repository URL instead."); //$NON-NLS-1$
+ }
+
+ public final void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ super.setHandleIdentifier(RepositoryTaskHandleUtil.getHandle(repositoryUrl, taskId));
+ }
+
+ /**
+ * User identifiable key for the task to be used in UI facilities such as label displays and hyperlinked references.
+ * Can return the same as the ID (e.g. in the case of Bugzilla). Can return null if no such label exists.
+ */
+ public String getTaskKey() {
+ return (taskKey == null) ? taskId : taskKey;
+ }
+
+ @Deprecated
+ public boolean isSubmitting() {
+ return submitting;
+ }
+
+ @Deprecated
+ public void setSubmitting(boolean submitting) {
+ this.submitting = submitting;
+ }
+
+ @Override
+ public String toString() {
+ return summary;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof AbstractTask) {
+ return this.getHandleIdentifier().equals(((ITask) obj).getHandleIdentifier());
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return taskId.hashCode();
+ }
+
+ public boolean isCompleted() {
+ return completionDate != null;
+ }
+
+ /**
+ * @deprecated use setCompletionDate()
+ */
+ @Deprecated
+ public void setCompleted(boolean completed) {
+ if (completed) {
+ completionDate = new Date();
+ } else {
+ completionDate = null;
+ }
+ }
+
+ @Override
+ public String getPriority() {
+ return priority;
+ }
+
+ public void setPriority(String priority) {
+ if (!areEqual(this.priority, priority)) {
+ String oldValue = this.priority;
+ this.priority = priority;
+ firePropertyChange("priority", oldValue, priority); //$NON-NLS-1$
+ }
+ }
+
+ public String getNotes() {
+ // TODO: removed check for null once xml updated.
+ if (notes == null) {
+ notes = ""; //$NON-NLS-1$
+ }
+ return notes;
+ }
+
+ public void setNotes(String notes) {
+ this.notes = notes;
+ }
+
+ /**
+ * @deprecated Use {@link #getEstimatedTimeHours()} instead
+ */
+ @Deprecated
+ public int getEstimateTimeHours() {
+ return getEstimatedTimeHours();
+ }
+
+ public int getEstimatedTimeHours() {
+ return estimatedTimeHours;
+ }
+
+ public void setEstimatedTimeHours(int estimated) {
+ this.estimatedTimeHours = estimated;
+ }
+
+ void addParentContainer(AbstractTaskContainer container) {
+ containers.add(container);
+ }
+
+ void removeParentContainer(AbstractTaskContainer container) {
+ containers.remove(container);
+ }
+
+ public Set<AbstractTaskContainer> getParentContainers() {
+ return new HashSet<AbstractTaskContainer>(containers);
+ }
+
+ @Override
+ public String getSummary() {
+ return summary;
+ }
+
+ public Date getCompletionDate() {
+ return completionDate;
+ }
+
+ public void setScheduledForDate(DateRange reminderDate) {
+ scheduledForDate = reminderDate;
+ }
+
+ public DateRange getScheduledForDate() {
+ return scheduledForDate;
+ }
+
+ public boolean isReminded() {
+ return reminded;
+ }
+
+ public void setReminded(boolean reminded) {
+ this.reminded = reminded;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ if (!areEqual(this.creationDate, creationDate)) {
+ Date oldValue = this.creationDate;
+ this.creationDate = creationDate;
+ firePropertyChange("creationDate", oldValue, creationDate); //$NON-NLS-1$
+ }
+ }
+
+ public void setSummary(String summary) {
+ Assert.isNotNull(summary);
+ if (!areEqual(this.summary, summary)) {
+ String oldValue = this.summary;
+ this.summary = summary;
+ firePropertyChange("summary", oldValue, summary); //$NON-NLS-1$
+ }
+ }
+
+ public void setCompletionDate(Date completionDate) {
+ if (!areEqual(this.completionDate, completionDate)) {
+ Date oldValue = this.completionDate;
+ this.completionDate = completionDate;
+ firePropertyChange("completionDate", oldValue, completionDate); //$NON-NLS-1$
+ }
+ }
+
+ private boolean areEqual(Object oldValue, Object newValue) {
+ return (oldValue != null) ? oldValue.equals(newValue) : oldValue == newValue;
+ }
+
+ private void firePropertyChange(String key, Object oldValue, Object newValue) {
+// PropertyChangeEvent event = new PropertyChangeEvent(this, key, oldValue, newValue);
+// for (PropertyChangeListener listener : propertyChangeListeners) {
+// listener.propertyChange(event);
+// }
+ changed = true;
+ }
+
+ public boolean isChanged() {
+ return changed;
+ }
+
+ public void setChanged(boolean changed) {
+ this.changed = changed;
+ }
+
+ /**
+ * @deprecated use {@link TaskActivityManager#isPastReminder(AbstractTask)} instead
+ */
+ @Deprecated
+ public boolean isPastReminder() {
+ if (isCompleted() || scheduledForDate == null || !(getScheduledForDate() instanceof DayDateRange)) {
+ return false;
+ } else {
+ if (/*!internalIsFloatingScheduledDate() && */scheduledForDate.getEndDate().compareTo(
+ TaskActivityUtil.getCalendar()) < 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ public String getTaskKind() {
+ return taskKind;
+ }
+
+ public void setTaskKind(String taskKind) {
+ if (!areEqual(this.taskKind, taskKind)) {
+ String oldValue = this.taskKind;
+ this.taskKind = taskKind;
+ firePropertyChange("taskKind", oldValue, taskKind); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public int compareTo(IRepositoryElement taskListElement) {
+ return summary.compareTo(((AbstractTask) taskListElement).summary);
+ }
+
+ public Date getDueDate() {
+ return dueDate;
+ }
+
+ public void setDueDate(Date date) {
+ if (!areEqual(this.dueDate, date)) {
+ Date oldValue = this.dueDate;
+ this.dueDate = date;
+ firePropertyChange("dueDate", oldValue, date); //$NON-NLS-1$
+ }
+ }
+
+ @Deprecated
+ public boolean isStale() {
+ return stale;
+ }
+
+ @Deprecated
+ public void setStale(boolean stale) {
+ this.stale = stale;
+ }
+
+ public Date getModificationDate() {
+ return modificationDate;
+ }
+
+ public void setModificationDate(Date modificationDate) {
+ if (!areEqual(this.modificationDate, modificationDate)) {
+ Date oldValue = this.modificationDate;
+ this.modificationDate = modificationDate;
+ firePropertyChange("modificationDate", oldValue, modificationDate); //$NON-NLS-1$
+ }
+ }
+
+ public boolean isMarkReadPending() {
+ return markReadPending;
+ }
+
+ public void setMarkReadPending(boolean markReadPending) {
+ this.markReadPending = markReadPending;
+ }
+
+ public void setTaskKey(String taskKey) {
+ if (!areEqual(this.taskKey, taskKey)) {
+ String oldValue = this.taskKey;
+ this.taskKey = taskKey;
+ firePropertyChange("taskKey", oldValue, taskKey); //$NON-NLS-1$
+ }
+ }
+
+ public synchronized String getAttribute(String key) {
+ return (attributeMap != null) ? attributeMap.getAttribute(key) : null;
+ }
+
+ public synchronized Map<String, String> getAttributes() {
+ if (attributeMap != null) {
+ return attributeMap.getAttributes();
+ } else {
+ return Collections.emptyMap();
+ }
+ }
+
+ public void setAttribute(String key, String value) {
+ String oldValue;
+ synchronized (this) {
+ if (attributeMap == null) {
+ attributeMap = new AttributeMap();
+ }
+ oldValue = attributeMap.getAttribute(key);
+ if (!areEqual(oldValue, value)) {
+ attributeMap.setAttribute(key, value);
+ } else {
+ return;
+ }
+ }
+ firePropertyChange(key, oldValue, value);
+ }
+
+ @Override
+ public void setUrl(String url) {
+ String oldValue = getUrl();
+ if (!areEqual(oldValue, url)) {
+ super.setUrl(url);
+ firePropertyChange("url", oldValue, url); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTaskCategory.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTaskCategory.java
new file mode 100644
index 0000000..cade406
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTaskCategory.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * A container that stores tasks from any repository. A task can only have a single AbstractTaskCategory parent (only be
+ * in one category at a time).
+ *
+ * @author Mik Kersten
+ */
+public abstract class AbstractTaskCategory extends AbstractTaskContainer {
+
+ public AbstractTaskCategory(String handleAndDescription) {
+ super(handleAndDescription);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTaskContainer.java
new file mode 100644
index 0000000..781a8bf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AbstractTaskContainer.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * Top-level Task List element that can contain other Task List elements.
+ *
+ * @author Mik Kersten
+ */
+public abstract class AbstractTaskContainer extends PlatformObject implements IRepositoryElement, ITaskContainer {
+
+ private String handleIdentifier = ""; //$NON-NLS-1$
+
+ private final Collection<ITask> children = new CopyOnWriteArrayList<ITask>();
+
+ /**
+ * Optional URL corresponding to the web resource associated with this container.
+ */
+ private String url;
+
+ public AbstractTaskContainer(String handleAndDescription) {
+ Assert.isNotNull(handleAndDescription);
+ this.handleIdentifier = handleAndDescription;
+ }
+
+ /**
+ * Use {@link TaskList} methods instead.
+ */
+ public void internalAddChild(AbstractTask task) {
+ Assert.isNotNull(task);
+ children.add(task);
+ }
+
+ /**
+ * Use {@link TaskList} methods instead.
+ *
+ * @return
+ * @since 3.0
+ */
+ public boolean internalRemoveChild(ITask task) {
+ return children.remove(task);
+ }
+
+ /**
+ * Removes any cyclic dependencies in children.
+ *
+ * TODO: review to make sure that this is too expensive, or move to creation.
+ *
+ * @since 3.0
+ */
+ public Collection<ITask> getChildren() {
+ return Collections.unmodifiableCollection(children);
+ }
+
+ /**
+ * Maxes out at a depth of 10.
+ *
+ * TODO: review policy
+ */
+ public boolean contains(String handle) {
+ Assert.isNotNull(handle);
+ return containsHelper(children, handle, new HashSet<IRepositoryElement>());
+ }
+
+ private boolean containsHelper(Collection<ITask> children, String handle, Set<IRepositoryElement> visitedContainers) {
+ for (ITask child : children) {
+ if (visitedContainers.contains(child)) {
+ continue;
+ }
+ visitedContainers.add(child);
+ if (child instanceof ITaskContainer) {
+ if (handle.equals(child.getHandleIdentifier())
+ || containsHelper(((ITaskContainer) child).getChildren(), handle, visitedContainers)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public String getSummary() {
+ return handleIdentifier;
+ }
+
+ public boolean isEmpty() {
+ return children.isEmpty();
+ }
+
+ public String getHandleIdentifier() {
+ return handleIdentifier;
+ }
+
+ public void setHandleIdentifier(String handleIdentifier) {
+ this.handleIdentifier = handleIdentifier;
+ }
+
+ @Override
+ public int hashCode() {
+ return handleIdentifier.hashCode();
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * @return can be null
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object == null) {
+ return false;
+ }
+ if (object instanceof AbstractTaskContainer) {
+ IRepositoryElement compare = (IRepositoryElement) object;
+ return this.getHandleIdentifier().equals(compare.getHandleIdentifier());
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "container: " + handleIdentifier; //$NON-NLS-1$
+ }
+
+ public String getPriority() {
+ String highestPriority = PriorityLevel.P5.toString();
+ Collection<ITask> tasks = getChildren();
+ if (tasks.isEmpty()) {
+ return PriorityLevel.P1.toString();
+ }
+ for (ITask task : tasks) {
+ if (highestPriority.compareTo(task.getPriority()) > 0) {
+ highestPriority = task.getPriority();
+ }
+ }
+ return highestPriority;
+ }
+
+ /**
+ * The handle for most containers is their summary. Override to specify a different natural ordering.
+ */
+ public int compareTo(IRepositoryElement taskListElement) {
+ return getHandleIdentifier().compareTo(taskListElement.getHandleIdentifier());
+ }
+
+ /**
+ * If false, user is unable to manipulate (i.e. rename/delete), no preferences are available.
+ *
+ * @since 2.3
+ */
+ public boolean isUserManaged() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AttributeMap.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AttributeMap.java
new file mode 100644
index 0000000..70b5888
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AttributeMap.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AttributeMap {
+
+ private final Map<String, String> attributes;
+
+ public AttributeMap() {
+ attributes = new HashMap<String, String>();
+ }
+
+ public String getAttribute(String key) {
+ return attributes.get(key);
+ }
+
+ public Map<String, String> getAttributes() {
+ return new HashMap<String, String>(attributes);
+ }
+
+ public void setAttribute(String key, String value) {
+ Assert.isNotNull(key);
+ if (value == null) {
+ attributes.remove(key);
+ } else {
+ attributes.put(key, value);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AutomaticRepositoryTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AutomaticRepositoryTaskContainer.java
new file mode 100644
index 0000000..78db9ce
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/AutomaticRepositoryTaskContainer.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AutomaticRepositoryTaskContainer extends AbstractTaskCategory implements ITaskRepositoryElement {
+
+ protected String repositoryUrl;
+
+ private final String connectorKind;
+
+ private final String handleSuffix;
+
+ public AutomaticRepositoryTaskContainer(String handleSuffix, String connectorKind, String repositoryUrl) {
+ super(repositoryUrl + "-" + handleSuffix); //$NON-NLS-1$
+ this.handleSuffix = handleSuffix;
+ this.connectorKind = connectorKind;
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ @Override
+ public boolean isUserManaged() {
+ return false;
+ }
+
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ @Override
+ public String getPriority() {
+ return PriorityLevel.P1.toString();
+ }
+
+ /**
+ * setting will also refactor handle
+ */
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ setHandleIdentifier(repositoryUrl + "-" + handleSuffix); //$NON-NLS-1$
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/CommentQuoter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/CommentQuoter.java
new file mode 100644
index 0000000..f0c2c04
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/CommentQuoter.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+/**
+ * Utility class to handle many text quoting scenarios
+ * <p>
+ * Each line of text is quoted individually and wrapped, according to the {@link lineSize} attribute
+ * <p>
+ * The wrapping policy is the following:
+ * <p>
+ * <ol>
+ * <li>A substring of {@link lineSize} characters is extracted and examined
+ * <li>If the next character after the substring is a blank space, the substring is quoted
+ * <li>If don't, the substring is searched backwards for a blank space; if one is found, the substring until the blank
+ * space is quoted
+ * <li>If no blank space is found, the entire substring is quoted
+ * <li>The remaining of substring + line are reevaluated on step 1
+ * </ol>
+ *
+ * @author Willian Mitsuda
+ */
+public class CommentQuoter {
+
+ public static final int DEFAULT_WRAP_SIZE = 80;
+
+ private final int lineSize;
+
+ public CommentQuoter() {
+ this(DEFAULT_WRAP_SIZE);
+ }
+
+ public CommentQuoter(int lineSize) {
+ this.lineSize = lineSize;
+ }
+
+ /**
+ * Quote a text, wrapping if necessary
+ */
+ public String quote(String text) {
+ StringBuilder sb = new StringBuilder(text.length() + text.length() / lineSize);
+
+ String[] lines = text.split("\n"); //$NON-NLS-1$
+ for (String line : lines) {
+ if (line.trim().equals("")) { //$NON-NLS-1$
+ sb.append("> \n"); //$NON-NLS-1$
+ continue;
+ }
+
+ int pos = 0;
+ while (pos < line.length()) {
+ int wrapPos = pos + lineSize;
+ if (wrapPos < line.length()) {
+ // Try to find a space to wrap the line
+ while (wrapPos > pos) {
+ char wrapChar = line.charAt(wrapPos);
+ if (Character.isSpaceChar(wrapChar)) {
+ break;
+ }
+ wrapPos--;
+ }
+ if (wrapPos == pos) {
+ // There is no space; don't break the line and find the
+ // next space after the limit...
+ wrapPos = pos + lineSize;
+ while (wrapPos < line.length()) {
+ if (Character.isSpaceChar(line.charAt(wrapPos))) {
+ break;
+ }
+ wrapPos++;
+ }
+ }
+
+ // Extract the substring and recalculate the next search
+ // start point
+ String wrappedLine = line.substring(pos, wrapPos).trim();
+ sb.append("> " + wrappedLine + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ pos = wrapPos + 1;
+ } else {
+ sb.append("> " + line.substring(pos).trim() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ }
+ }
+ }
+
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DateRange.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DateRange.java
new file mode 100644
index 0000000..90533ef
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DateRange.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.text.DateFormat;
+import java.util.Calendar;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class DateRange implements Comparable<DateRange> {
+ protected static final long DAY = 1000 * 60 * 60 * 24;
+
+ private final Calendar startDate;
+
+ private final Calendar endDate;
+
+ /**
+ * create an instance of a date range that represents a finite point in time
+ */
+ public DateRange(Calendar time) {
+ startDate = time;
+ endDate = time;
+ }
+
+ public DateRange(Calendar startDate, Calendar endDate) {
+ Assert.isNotNull(startDate);
+ Assert.isNotNull(endDate);
+ this.startDate = startDate;
+ this.endDate = endDate;
+ }
+
+ public boolean includes(DateRange range) {
+ return (startDate.getTimeInMillis() <= range.getStartDate().getTimeInMillis())
+ && (endDate.getTimeInMillis() >= range.getEndDate().getTimeInMillis());
+ }
+
+ public boolean includes(Calendar cal) {
+ return (startDate.getTimeInMillis() <= cal.getTimeInMillis())
+ && (endDate.getTimeInMillis() >= cal.getTimeInMillis());
+ }
+
+ public Calendar getStartDate() {
+ return startDate;
+ }
+
+ public Calendar getEndDate() {
+ return endDate;
+ }
+
+ /**
+ * TODO: Move into label provider
+ */
+ @Override
+ public String toString() {
+ return toString(true);
+ }
+
+ public String toString(boolean useDayOfWeekForNextWeek) {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(startDate.getTime());
+ /* + " to "+ DateFormat.getDateInstance(DateFormat.MEDIUM).format(endDate.getTime());*/
+ }
+
+// protected DateRange create(int field, int multiplier) {
+// Calendar previousStart = (Calendar) getStartDate().clone();
+// Calendar previousEnd = (Calendar) getEndDate().clone();
+// previousStart.add(field, 1 * multiplier);
+// previousEnd.add(field, 1 * multiplier);
+// return new DateRange(previousStart, previousEnd);
+// }
+
+// public boolean isDay() {
+// return ((getEndDate().getTimeInMillis() - getStartDate().getTimeInMillis()) == DAY - 1);
+// }
+//
+// public boolean isWeek() {
+// return ((getEndDate().getTimeInMillis() - getStartDate().getTimeInMillis()) == (DAY * 7) - 1);
+// }
+
+ public boolean isPresent() {
+ return this.getStartDate().before(Calendar.getInstance()) && this.getEndDate().after(Calendar.getInstance());
+ }
+
+ public boolean isPast() {
+ return getEndDate().compareTo(Calendar.getInstance()) < 0;
+ }
+
+ public boolean isFuture() {
+ return !isPresent() && this.getStartDate().after(Calendar.getInstance());
+ }
+
+ public boolean isBefore(DateRange scheduledDate) {
+ return this.getEndDate().compareTo(scheduledDate.getStartDate()) < 0;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((endDate == null) ? 0 : endDate.hashCode());
+ result = prime * result + ((startDate == null) ? 0 : startDate.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof DateRange)) {
+ return false;
+ }
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+// if (getClass() != obj.getClass()) {
+// return false;
+// }
+ DateRange other = (DateRange) obj;
+ if (endDate == null) {
+ if (other.endDate != null) {
+ return false;
+ }
+ } else if (!endDate.equals(other.endDate)) {
+ return false;
+ }
+ if (startDate == null) {
+ if (other.startDate != null) {
+ return false;
+ }
+ } else if (!startDate.equals(other.startDate)) {
+ return false;
+ }
+ return true;
+ }
+
+ public boolean before(Calendar cal) {
+ return getEndDate().before(cal);
+ }
+
+ public boolean after(Calendar cal) {
+ return cal.before(getEndDate());
+ }
+
+ public int compareTo(DateRange range) {
+ if (range.getStartDate().equals(startDate) && range.getEndDate().equals(endDate)) {
+ return 0;
+ } else if (includes(range)) {
+ return 1;
+ } else if (before(range.getStartDate())) {
+ return -1;
+ } else if (after(range.getEndDate())) {
+ return 1;
+ }
+ return -1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DayDateRange.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DayDateRange.java
new file mode 100644
index 0000000..0203ff3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DayDateRange.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Calendar;
+
+import org.eclipse.mylyn.internal.provisional.commons.core.CommonMessages;
+
+/**
+ * @author Rob Elves
+ */
+public class DayDateRange extends DateRange {
+
+ public DayDateRange(Calendar startDate, Calendar endDate) {
+ super(startDate, endDate);
+ }
+
+ public DayDateRange next() {
+ return create(Calendar.DAY_OF_YEAR, 1);
+ }
+
+ public DayDateRange previous() {
+ return create(Calendar.DAY_OF_YEAR, -1);
+ }
+
+ protected DayDateRange create(int field, int multiplier) {
+ Calendar previousStart = (Calendar) getStartDate().clone();
+ Calendar previousEnd = (Calendar) getEndDate().clone();
+ previousStart.add(field, 1 * multiplier);
+ previousEnd.add(field, 1 * multiplier);
+ return new DayDateRange(previousStart, previousEnd);
+ }
+
+ @Override
+ public String toString(boolean useDayOfWeekForNextWeek) {
+ boolean isThisWeek = TaskActivityUtil.getCurrentWeek().includes(this);
+ Calendar endNextWeek = TaskActivityUtil.getCalendar();
+ endNextWeek.add(Calendar.DAY_OF_YEAR, 7);
+ boolean isNextWeek = TaskActivityUtil.getNextWeek().includes(this) && this.before(endNextWeek);
+ if (isThisWeek || (useDayOfWeekForNextWeek && isNextWeek)) {
+ String day = ""; //$NON-NLS-1$
+ switch (getStartDate().get(Calendar.DAY_OF_WEEK)) {
+ case Calendar.MONDAY:
+ day = CommonMessages.Monday;
+ break;
+ case Calendar.TUESDAY:
+ day = CommonMessages.Tuesday;
+ break;
+ case Calendar.WEDNESDAY:
+ day = CommonMessages.Wednesday;
+ break;
+ case Calendar.THURSDAY:
+ day = CommonMessages.Thursday;
+ break;
+ case Calendar.FRIDAY:
+ day = CommonMessages.Friday;
+ break;
+ case Calendar.SATURDAY:
+ day = CommonMessages.Saturday;
+ break;
+ case Calendar.SUNDAY:
+ day = CommonMessages.Sunday;
+ break;
+ }
+ if (isPresent()) {
+ return day + Messages.DayDateRange___Today;
+ } else {
+ return day;
+ }
+ }
+ return super.toString(useDayOfWeekForNextWeek);
+ }
+
+ public static boolean isDayRange(Calendar calStart, Calendar calEnd) {
+ // bug 248683
+ long diff = (calEnd.getTimeInMillis() - calStart.getTimeInMillis()) - (DAY - 1);
+ return Math.abs(diff) <= 60 * 60 * 1000;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DefaultTaskMapping.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DefaultTaskMapping.java
new file mode 100644
index 0000000..a4bbceb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/DefaultTaskMapping.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ */
+public class DefaultTaskMapping extends TaskMapping {
+
+ public Map<String, String> values = new HashMap<String, String>();
+
+ @Override
+ public String getDescription() {
+ return values.get(TaskAttribute.DESCRIPTION);
+ }
+
+ @Override
+ public String getSummary() {
+ return values.get(TaskAttribute.SUMMARY);
+ }
+
+ public void setDescription(String value) {
+ values.put(TaskAttribute.DESCRIPTION, value);
+ }
+
+ public void setSummary(String value) {
+ values.put(TaskAttribute.SUMMARY, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java
new file mode 100644
index 0000000..5105c9e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryConstants.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface IRepositoryConstants {
+
+ public static final String OLD_PROPERTY_SYNCTIME = "synctime"; //$NON-NLS-1$
+
+ public static final String PROPERTY_SYNCTIMESTAMP = "lastsynctimestamp"; //$NON-NLS-1$
+
+ public static final String PROPERTY_TIMEZONE = "timezone"; //$NON-NLS-1$
+
+ public static final String PROPERTY_ENCODING = "encoding"; //$NON-NLS-1$
+
+ public static final String PROPERTY_VERSION = "version"; //$NON-NLS-1$
+
+ public static final String PROPERTY_CONNECTOR_KIND = "kind"; //$NON-NLS-1$
+
+ public static final String PROPERTY_URL = "url"; //$NON-NLS-1$
+
+ public static final String PROPERTY_LABEL = "label"; //$NON-NLS-1$
+
+ public static final String PROPERTY_DELIM = ":"; //$NON-NLS-1$
+
+ public static final String KIND_UNKNOWN = "<unknown>"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryModelListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryModelListener.java
new file mode 100644
index 0000000..1c35c82
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/IRepositoryModelListener.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IRepositoryModelListener {
+
+ public void loaded();
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskJobFactory.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskJobFactory.java
new file mode 100644
index 0000000..e2fb1e4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskJobFactory.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+import org.eclipse.mylyn.tasks.core.sync.TaskJob;
+
+/**
+ * @author Steffen Pingel
+ * @author Mik Kersten
+ */
+public interface ITaskJobFactory {
+
+ public abstract SynchronizationJob createSynchronizeTasksJob(AbstractRepositoryConnector connector,
+ TaskRepository taskRepository, Set<ITask> tasks);
+
+ public abstract SynchronizationJob createSynchronizeQueriesJob(AbstractRepositoryConnector connector,
+ TaskRepository repository, Set<RepositoryQuery> queries);
+
+ public abstract SynchronizationJob createSynchronizeRepositoriesJob(Set<TaskRepository> repositories);
+
+ public abstract SubmitJob createSubmitTaskJob(AbstractRepositoryConnector connector, TaskRepository taskRepository,
+ ITask task, TaskData taskData, Set<TaskAttribute> changedAttributes);
+
+ public abstract TaskJob createUpdateRepositoryConfigurationJob(AbstractRepositoryConnector connector,
+ TaskRepository taskRepository);
+
+ public abstract SubmitJob createSubmitTaskAttachmentJob(AbstractRepositoryConnector connector,
+ TaskRepository taskRepository, ITask task, AbstractTaskAttachmentSource source, String comment,
+ TaskAttribute attachmentAttribute);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java
new file mode 100644
index 0000000..83c7eb7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskList.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Steffen Pingel
+ * @author Robert Elves
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public interface ITaskList {
+
+ public abstract void addChangeListener(ITaskListChangeListener listener);
+
+ public abstract void addQuery(RepositoryQuery query) throws IllegalArgumentException;
+
+ /**
+ * Add orphaned task to the task list
+ */
+ public abstract void addTask(ITask task) throws IllegalArgumentException;
+
+ /**
+ * Precondition: {@code container} already exists in tasklist (be it a parent task, category, or query) If the
+ * parentContainer is null the task is considered an orphan and added to the appropriate repository's orphaned tasks
+ * container.
+ *
+ * @param task
+ * to be added
+ * @param container
+ * task container, query or parent task must not be null
+ */
+ public abstract boolean addTask(ITask task, AbstractTaskContainer parentContainer);
+
+ public abstract void deleteCategory(AbstractTaskCategory category);
+
+ public abstract void deleteQuery(RepositoryQuery query);
+
+ /**
+ * TODO: refactor around querying containers for their tasks
+ *
+ * Task is removed from all containers: root, archive, category, and orphan bin
+ *
+ * Currently subtasks are not deleted but rather are rather potentially orphaned
+ */
+ public abstract void deleteTask(ITask task);
+
+ public abstract Set<AbstractTaskCategory> getCategories();
+
+ public abstract Set<RepositoryQuery> getQueries();
+
+ /**
+ * @since 2.0
+ */
+ public abstract ITask getTask(String repositoryUrl, String taskId);
+
+ /**
+ * @param task
+ * list element
+ */
+ public abstract void notifyElementChanged(IRepositoryElement element);
+
+ public abstract void notifySynchronizationStateChanged(IRepositoryElement element);
+
+ public abstract void removeChangeListener(ITaskListChangeListener listener);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void removeFromContainer(AbstractTaskContainer container, ITask task);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskListChangeListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskListChangeListener.java
new file mode 100644
index 0000000..84cbeef
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskListChangeListener.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Set;
+
+/**
+ * Listener for task list modifications and task content modifications.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public interface ITaskListChangeListener {
+
+ public abstract void containersChanged(Set<TaskContainerDelta> containers);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskListRunnable.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskListRunnable.java
new file mode 100644
index 0000000..d47651a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskListRunnable.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Rob Elves
+ */
+public interface ITaskListRunnable {
+
+ public void execute(IProgressMonitor monitor) throws CoreException;
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskRepositoryElement.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskRepositoryElement.java
new file mode 100644
index 0000000..391ba37
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskRepositoryElement.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Steffen Pingel
+ */
+public interface ITaskRepositoryElement {
+
+ public String getConnectorKind();
+
+ public String getRepositoryUrl();
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskRepositoryFilter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskRepositoryFilter.java
new file mode 100644
index 0000000..3d9b191
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITaskRepositoryFilter.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Task repository filter to build list of repositories with required capabilities.
+ *
+ * @author Eugene Kleshov
+ * @since 2.0
+ */
+public interface ITaskRepositoryFilter {
+
+ public static ITaskRepositoryFilter ALL = new ITaskRepositoryFilter() {
+ public boolean accept(TaskRepository repository, AbstractRepositoryConnector connector) {
+ return true;
+ }
+ };
+
+ public static ITaskRepositoryFilter CAN_QUERY = new ITaskRepositoryFilter() {
+ public boolean accept(TaskRepository repository, AbstractRepositoryConnector connector) {
+ return !(connector instanceof LocalRepositoryConnector) && !repository.isOffline()
+ && connector.canQuery(repository);
+ }
+ };
+
+ public static ITaskRepositoryFilter CAN_CREATE_NEW_TASK = new ITaskRepositoryFilter() {
+ public boolean accept(TaskRepository repository, AbstractRepositoryConnector connector) {
+ return connector.canCreateNewTask(repository) && !repository.isOffline();
+ }
+ };
+
+ public static ITaskRepositoryFilter CAN_CREATE_TASK_FROM_KEY = new ITaskRepositoryFilter() {
+ public boolean accept(TaskRepository repository, AbstractRepositoryConnector connector) {
+ return connector.canCreateTaskFromKey(repository) && !repository.isOffline();
+ }
+ };
+
+ public static ITaskRepositoryFilter IS_USER_MANAGED = new ITaskRepositoryFilter() {
+ public boolean accept(TaskRepository repository, AbstractRepositoryConnector connector) {
+ return connector.isUserManaged();
+ }
+ };
+
+ public abstract boolean accept(TaskRepository repository, AbstractRepositoryConnector connector);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java
new file mode 100644
index 0000000..112fee6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITasksCoreConstants.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+
+/**
+ * @author Rob Elves
+ */
+public interface ITasksCoreConstants {
+
+ public static final int MAX_SUBTASK_DEPTH = 10;
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.tasks.core"; //$NON-NLS-1$
+
+ public static final String OLD_TASK_LIST_FILE = "tasklist.xml"; //$NON-NLS-1$
+
+ public static final String FILENAME_ENCODING = "UTF-8"; //$NON-NLS-1$
+
+ public static final String OLD_PREFIX_TASKLIST = "tasklist"; //$NON-NLS-1$
+
+ public static final String PREFIX_TASKS = "tasks"; //$NON-NLS-1$
+
+ public static final String DEFAULT_BACKUP_FOLDER_NAME = "backup"; //$NON-NLS-1$
+
+ public static final String EXPORT_FILE_NAME = "mylyn-tasks"; //$NON-NLS-1$
+
+ public static final String FILE_EXTENSION = ".xml.zip"; //$NON-NLS-1$
+
+ public static final String OLD_FILENAME_TIMESTAMP_FORMAT = "yyyy-MM-dd"; //$NON-NLS-1$
+
+ public static final String FILENAME_TIMESTAMP_FORMAT = "yyyy-MM-dd-HHmmss"; //$NON-NLS-1$
+
+ public static final String OLD_M_2_TASKLIST_FILENAME = OLD_PREFIX_TASKLIST + FILE_EXTENSION;
+
+ public static final String DEFAULT_TASK_LIST_FILE = PREFIX_TASKS + FILE_EXTENSION;
+
+ public static final String CONTEXTS_DIRECTORY = "contexts"; //$NON-NLS-1$
+
+ public static final ISchedulingRule ACTIVITY_SCHEDULING_RULE = new MutexSchedulingRule();
+
+ public static final ISchedulingRule TASKLIST_SCHEDULING_RULE = new MutexSchedulingRule();
+
+ public static final ISchedulingRule ROOT_SCHEDULING_RULE = new RootSchedulingRule();
+
+ public static final String ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL = "outgoingNewRepositoryUrl"; //$NON-NLS-1$
+
+ public static final String ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND = "outgoingNewConnectorKind"; //$NON-NLS-1$
+
+ public static final String PROPERTY_USE_SECURE_STORAGE = "org.eclipse.mylyn.tasklist.repositories.configuration.securestorage"; //$NON-NLS-1$
+
+ /**
+ * Jobs that have the same instances of this rule set are mutually exclusive.
+ */
+ public static class MutexSchedulingRule extends RootSchedulingRule {
+
+ public MutexSchedulingRule() {
+ }
+
+ @Override
+ public boolean contains(ISchedulingRule rule) {
+ return rule == this;
+ }
+
+ @Override
+ public boolean isConflicting(ISchedulingRule rule) {
+ return rule == ROOT_SCHEDULING_RULE || rule == this;
+ }
+ }
+
+ /**
+ * The parent of all scheduling rules that modify task data.
+ *
+ * @see ITasksCoreConstants#ROOT_SCHEDULING_RULE
+ */
+ public static class RootSchedulingRule implements ISchedulingRule {
+
+ protected RootSchedulingRule() {
+ }
+
+ public boolean contains(ISchedulingRule rule) {
+ return rule instanceof RootSchedulingRule;
+ }
+
+ public boolean isConflicting(ISchedulingRule rule) {
+ return rule instanceof RootSchedulingRule;
+ }
+ }
+
+ /**
+ * Jobs that have an instances of this rule set which references the same object are mutually exclusive.
+ */
+ public static class ObjectSchedulingRule extends RootSchedulingRule {
+
+ private final Object object;
+
+ public ObjectSchedulingRule(Object object) {
+ Assert.isNotNull(object);
+ this.object = object;
+ }
+
+ @Override
+ public boolean contains(ISchedulingRule rule) {
+ return rule == this;
+ }
+
+ @Override
+ public boolean isConflicting(ISchedulingRule rule) {
+ if (rule == ROOT_SCHEDULING_RULE) {
+ return true;
+ }
+ if (rule instanceof ObjectSchedulingRule) {
+ return object.equals(((ObjectSchedulingRule) rule).object);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " [" + object + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ }
+
+ public static final String COMMAND_LINE_NO_ACTIVATE_TASK = "-no-activate-task"; //$NON-NLS-1$
+
+ public static final String PROPERTY_LINK_PROVIDER_TIMEOUT = "org.eclipse.mylyn.linkProviderTimeout"; //$NON-NLS-1$
+
+ /**
+ * Boolean value that indicates that queries participate in automatic synchronizations.
+ */
+ public static final String ATTRIBUTE_AUTO_UPDATE = "org.eclipse.mylyn.tasks.core.synchronization.auto"; //$NON-NLS-1$
+
+ public static final Object JOB_FAMILY_SYNCHRONIZATION = new Object();
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITransferList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITransferList.java
new file mode 100644
index 0000000..a08c4e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ITransferList.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Minimal task list interface required for externalization.
+ *
+ * @author Steffen Pingel
+ */
+public interface ITransferList {
+
+ public abstract void addCategory(TaskCategory category);
+
+ public abstract void addQuery(RepositoryQuery query);
+
+ public abstract void addTask(ITask task);
+
+ public abstract boolean addTask(ITask task, AbstractTaskContainer parentContainer);
+
+ public AbstractTaskCategory getContainerForHandle(String handle);
+
+ public abstract Collection<AbstractTask> getAllTasks();
+
+ public abstract Set<AbstractTaskCategory> getCategories();
+
+ public abstract Set<RepositoryQuery> getQueries();
+
+ public AbstractTask getTask(String handleIdentifier);
+
+ public abstract ITask getTask(String repositoryUrl, String taskId);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java
new file mode 100644
index 0000000..39dc4ad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalRepositoryConnector.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+
+/**
+ * @author Rob Elves
+ */
+public class LocalRepositoryConnector extends AbstractRepositoryConnector {
+
+ public static final String REPOSITORY_LABEL = Messages.LocalRepositoryConnector_Local;
+
+ public static final String CONNECTOR_KIND = "local"; //$NON-NLS-1$
+
+ public static final String REPOSITORY_URL = "local"; //$NON-NLS-1$
+
+ public static final String REPOSITORY_VERSION = "1"; //$NON-NLS-1$
+
+ public static final String DEFAULT_SUMMARY = Messages.LocalRepositoryConnector_New_Task;
+
+ @Override
+ public boolean canCreateNewTask(TaskRepository repository) {
+ return true;
+ }
+
+ @Override
+ public boolean canCreateTaskFromKey(TaskRepository repository) {
+ return false;
+ }
+
+ @Override
+ public String getLabel() {
+ return Messages.LocalRepositoryConnector_Local_Task_Repository;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return CONNECTOR_KIND;
+ }
+
+ @Override
+ public String getRepositoryUrlFromTaskUrl(String taskFullUrl) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public String getTaskIdFromTaskUrl(String taskFullUrl) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public String getTaskUrl(String repositoryUrl, String taskId) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public IStatus performQuery(TaskRepository repository, IRepositoryQuery query, TaskDataCollector resultCollector,
+ ISynchronizationSession event, IProgressMonitor monitor) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
+ // ignore
+ }
+
+ @Override
+ public boolean isUserManaged() {
+ return false;
+ }
+
+ @Override
+ public TaskData getTaskData(TaskRepository taskRepository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ // ignore
+ return false;
+ }
+
+ @Override
+ public void updateTaskFromTaskData(TaskRepository repository, ITask task, TaskData taskData) {
+ // ignore
+ }
+
+ @Override
+ public boolean hasLocalCompletionState(TaskRepository taskRepository, ITask task) {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalTask.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalTask.java
new file mode 100644
index 0000000..afa5ded
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/LocalTask.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Rob Elves
+ */
+public class LocalTask extends AbstractTask {
+
+ public static final String SYNC_DATE_NOW = "now"; //$NON-NLS-1$
+
+ public LocalTask(String taskId, String summary) {
+ super(LocalRepositoryConnector.REPOSITORY_URL, taskId, summary);
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return LocalRepositoryConnector.CONNECTOR_KIND;
+ }
+
+ @Override
+ public boolean isNotified() {
+ return true;
+ }
+
+ @Override
+ public String getLastReadTimeStamp() {
+ return SYNC_DATE_NOW;
+ }
+
+ @Override
+ public String getOwner() {
+ return LocalRepositoryConnector.CONNECTOR_KIND;
+ }
+
+ @Override
+ public String getTaskKey() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java
new file mode 100644
index 0000000..c328f78
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Messages.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.core.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String DayDateRange___Today;
+
+ public static String LocalRepositoryConnector_Local;
+
+ public static String LocalRepositoryConnector_Local_Task_Repository;
+
+ public static String LocalRepositoryConnector_New_Task;
+
+ public static String RepositoryExternalizationParticipant_Task_Repositories;
+
+ public static String TaskRepositoryManager_No_repository_available;
+
+ public static String UncategorizedTaskContainer_Uncategorized;
+
+ public static String UnmatchedTaskContainer_Unmatched;
+
+ public static String UnsubmittedTaskContainer_Unsubmitted;
+
+ public static String WeekDateRange_Next_Week;
+
+ public static String WeekDateRange_Previous_Week;
+
+ public static String WeekDateRange_This_Week;
+
+ public static String WeekDateRange_Two_Weeks;
+
+ public static String PriorityLevel_High;
+
+ public static String PriorityLevel_Low;
+
+ public static String PriorityLevel_Normal;
+
+ public static String PriorityLevel_Very_High;
+
+ public static String PriorityLevel_Very_Low;
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Person.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Person.java
new file mode 100644
index 0000000..79088d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/Person.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Rob Elves
+ */
+public class Person extends AbstractTaskContainer implements ITaskRepositoryElement {
+
+ private final String connectorKind;
+
+ private final String repositoryUrl;
+
+ public Person(String email, String connectorKind, String repositoryUrl) {
+ super(email);
+ this.connectorKind = connectorKind;
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java
new file mode 100644
index 0000000..5b92741
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryExternalizationParticipant.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant;
+import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class RepositoryExternalizationParticipant extends AbstractExternalizationParticipant implements
+ IRepositoryListener {
+
+ private static final String DESCRIPTION = Messages.RepositoryExternalizationParticipant_Task_Repositories;
+
+ private final TaskRepositoryManager repositoryManager;
+
+ private final ExternalizationManager externalizationManager;
+
+ private boolean dirty = false;
+
+ public RepositoryExternalizationParticipant(ExternalizationManager exManager, TaskRepositoryManager manager) {
+ this.repositoryManager = manager;
+ this.externalizationManager = exManager;
+ this.repositoryManager.addListener(this);
+ }
+
+ @Override
+ public String getDescription() {
+ return DESCRIPTION;
+ }
+
+ @Override
+ public ISchedulingRule getSchedulingRule() {
+ return ITasksCoreConstants.TASKLIST_SCHEDULING_RULE;
+ }
+
+ @Override
+ public boolean isDirty() {
+ return dirty;
+ }
+
+ private void requestSave() {
+ synchronized (RepositoryExternalizationParticipant.this) {
+ dirty = true;
+ }
+ externalizationManager.requestSave();
+ }
+
+ @Override
+ public void load(File sourceFile, IProgressMonitor monitor) throws CoreException {
+ repositoryManager.readRepositories(sourceFile.getAbsolutePath());
+ }
+
+ @Override
+ public void save(File targetFile, IProgressMonitor monitor) throws CoreException {
+ synchronized (RepositoryExternalizationParticipant.this) {
+ dirty = false;
+ }
+ repositoryManager.saveRepositories(targetFile.getAbsolutePath());
+ }
+
+ @Override
+ public String getFileName() {
+ return TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE;
+ }
+
+ public void repositoryUrlChanged(TaskRepository repository, String oldUrl) {
+ requestSave();
+ }
+
+ public void repositoriesRead() {
+ // ignore
+ }
+
+ public void repositoryAdded(TaskRepository repository) {
+ requestSave();
+ }
+
+ public void repositoryRemoved(TaskRepository repository) {
+ requestSave();
+ }
+
+ public void repositorySettingsChanged(TaskRepository repository) {
+ requestSave();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryModel.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryModel.java
new file mode 100644
index 0000000..9bd519f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryModel.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * David Green - fixes for bug 265682
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryModel;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositoryModel implements IRepositoryModel {
+
+ private final IRepositoryManager repositoryManager;
+
+ private final Map<String, ITask> taskByHandle = new WeakHashMap<String, ITask>();
+
+ private final TaskList taskList;
+
+ public RepositoryModel(TaskList taskList, IRepositoryManager repositoryManager) {
+ this.taskList = taskList;
+ this.repositoryManager = repositoryManager;
+ initialize();
+ }
+
+ private void initialize() {
+ repositoryManager.addListener(new TaskRepositoryAdapter() {
+ @Override
+ public void repositoryAdded(TaskRepository repository) {
+ taskList.addUnmatchedContainer(new UnmatchedTaskContainer(repository.getConnectorKind(),
+ repository.getRepositoryUrl()));
+ }
+
+ @Override
+ public void repositoryRemoved(TaskRepository repository) {
+ // TODO
+ //taskList.removeUnmatchedContainer(taskList.getUnmatchedContainer(repository.getRepositoryUrl()));
+ }
+ });
+ }
+
+ public IRepositoryQuery createRepositoryQuery(TaskRepository taskRepository) {
+ String handle = taskList.getUniqueHandleIdentifier();
+ RepositoryQuery query = new RepositoryQuery(taskRepository.getConnectorKind(), handle);
+ query.setRepositoryUrl(taskRepository.getRepositoryUrl());
+ return query;
+ }
+
+ public synchronized ITask createTask(TaskRepository taskRepository, String taskId) {
+ String handle = getTaskHandle(taskRepository, taskId);
+ ITask task = taskByHandle.get(handle);
+ if (task == null) {
+ task = new TaskTask(taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(), taskId);
+ taskByHandle.put(handle, task);
+ }
+ return task;
+ }
+
+ public ITaskAttachment createTaskAttachment(TaskAttribute taskAttribute) {
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskRepository taskRepository = repositoryManager.getRepository(taskData.getConnectorKind(),
+ taskData.getRepositoryUrl());
+ ITask task = getTask(taskRepository, taskData.getTaskId());
+ if (task == null) {
+ return null;
+ }
+ TaskAttachment taskAttachment = new TaskAttachment(taskRepository, task, taskAttribute);
+ taskData.getAttributeMapper().updateTaskAttachment(taskAttachment, taskAttribute);
+ return taskAttachment;
+ }
+
+ public ITaskComment createTaskComment(TaskAttribute taskAttribute) {
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskRepository taskRepository = repositoryManager.getRepository(taskData.getConnectorKind(),
+ taskData.getRepositoryUrl());
+ ITask task = getTask(taskRepository, taskData.getTaskId());
+ if (task == null) {
+ return null;
+ }
+ TaskComment taskComment = new TaskComment(taskRepository, task, taskAttribute);
+ taskData.getAttributeMapper().updateTaskComment(taskComment, taskAttribute);
+ return taskComment;
+ }
+
+ public synchronized ITask getTask(String handleIdentifier) {
+ ITask task = taskByHandle.get(handleIdentifier);
+ if (task == null) {
+ task = taskList.getTask(handleIdentifier);
+ }
+ return task;
+ }
+
+ public synchronized ITask getTask(TaskRepository taskRepository, String taskId) {
+ return getTask(getTaskHandle(taskRepository, taskId));
+ }
+
+ public synchronized ITask getTaskByKey(TaskRepository repository, String taskKey) {
+ return taskList.getTaskByKey(repository.getUrl(), taskKey);
+ }
+
+ private String getTaskHandle(TaskRepository taskRepository, String taskId) {
+ return RepositoryTaskHandleUtil.getHandle(taskRepository.getRepositoryUrl(), taskId);
+ }
+
+ public TaskRepository getTaskRepository(String connectorKind, String repositoryUrl) {
+ TaskRepository taskRepository = repositoryManager.getRepository(connectorKind, repositoryUrl);
+ if (taskRepository == null) {
+ taskRepository = new TaskRepository(connectorKind, repositoryUrl);
+ repositoryManager.addRepository(taskRepository);
+ }
+ return taskRepository;
+ }
+
+ public synchronized void clear() {
+ taskByHandle.clear();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryPerson.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryPerson.java
new file mode 100644
index 0000000..87358d8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryPerson.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositoryPerson implements IRepositoryPerson {
+
+ private String name;
+
+ private final String personId;
+
+ private final TaskRepository taskRepository;
+
+ public RepositoryPerson(TaskRepository taskRepository, String personId) {
+ this.taskRepository = taskRepository;
+ this.personId = personId;
+ }
+
+ public String getConnectorKind() {
+ return taskRepository.getConnectorKind();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getPersonId() {
+ return personId;
+ }
+
+ public String getRepositoryUrl() {
+ return taskRepository.getRepositoryUrl();
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ if (getName() == null) {
+ return getPersonId();
+ } else {
+ return getName() + " <" + getPersonId() + ">"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryQuery.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryQuery.java
new file mode 100644
index 0000000..84c1ade
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryQuery.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ * @author Rob Elves
+ */
+public class RepositoryQuery extends AbstractTaskContainer implements IRepositoryQuery, ITaskRepositoryElement {
+
+ private final String connectorKind;
+
+ protected String lastSynchronizedStamp = "<never>"; //$NON-NLS-1$
+
+ protected String repositoryUrl;
+
+ protected IStatus status;
+
+ private boolean synchronizing;
+
+ private String summary;
+
+ private AttributeMap attributeMap;
+
+ public RepositoryQuery(String connectorKind, String handle) {
+ super(handle);
+ this.connectorKind = connectorKind;
+ setSummary(handle);
+ }
+
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ // TODO: should be a date
+ public String getLastSynchronizedTimeStamp() {
+ return lastSynchronizedStamp;
+ }
+
+ @Override
+ public String getPriority() {
+ if (super.isEmpty()) {
+ return PriorityLevel.P1.toString();
+ }
+ String highestPriority = PriorityLevel.P5.toString();
+ for (ITask hit : getChildren()) {
+ if (highestPriority.compareTo(hit.getPriority()) > 0) {
+ highestPriority = hit.getPriority();
+ }
+ }
+ return highestPriority;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public IStatus getStatus() {
+ return status;
+ }
+
+ // TODO: move higher up and merge with AbstractTask
+ public boolean isSynchronizing() {
+ return synchronizing;
+ }
+
+ public void setLastSynchronizedStamp(String lastRefreshTimeStamp) {
+ this.lastSynchronizedStamp = lastRefreshTimeStamp;
+ }
+
+ public void setRepositoryUrl(String newRepositoryUrl) {
+ String url = getUrl();
+ if (repositoryUrl != null && url != null && url.startsWith(repositoryUrl)) {
+ // change corresponding part of the query URL
+ setUrl(newRepositoryUrl + url.substring(repositoryUrl.length()));
+ }
+ this.repositoryUrl = newRepositoryUrl;
+ }
+
+ public void setStatus(IStatus status) {
+ this.status = status;
+ }
+
+ public void setSynchronizing(boolean synchronizing) {
+ this.synchronizing = synchronizing;
+ }
+
+ @Override
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public synchronized String getAttribute(String key) {
+ return (attributeMap != null) ? attributeMap.getAttribute(key) : null;
+ }
+
+ public synchronized Map<String, String> getAttributes() {
+ if (attributeMap != null) {
+ return attributeMap.getAttributes();
+ } else {
+ return Collections.emptyMap();
+ }
+ }
+
+ public synchronized void setAttribute(String key, String value) {
+ if (attributeMap == null) {
+ attributeMap = new AttributeMap();
+ }
+ attributeMap.setAttribute(key, value);
+ }
+
+ public boolean getAutoUpdate() {
+ String value = getAttribute(ITasksCoreConstants.ATTRIBUTE_AUTO_UPDATE);
+ return value == null || Boolean.valueOf(value);
+ }
+
+ public void setAutoUpdate(boolean autoUpdate) {
+ setAttribute(ITasksCoreConstants.ATTRIBUTE_AUTO_UPDATE, Boolean.toString(autoUpdate));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryTaskHandleUtil.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryTaskHandleUtil.java
new file mode 100644
index 0000000..a02978a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryTaskHandleUtil.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Mik Kersten
+ */
+public class RepositoryTaskHandleUtil {
+
+ public static final String HANDLE_DELIM = "-"; //$NON-NLS-1$
+
+ private static final String MISSING_REPOSITORY = "norepository"; //$NON-NLS-1$
+
+ public static String getHandle(String repositoryUrl, String taskId) {
+ if (!isValidTaskId(taskId)) {
+ throw new RuntimeException("invalid handle for task, can not contain: " + HANDLE_DELIM + ", was: " + taskId); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ if (repositoryUrl == null) {
+ return MISSING_REPOSITORY + HANDLE_DELIM + taskId;
+ } else {
+ return (repositoryUrl + HANDLE_DELIM + taskId).intern();
+ }
+ }
+
+ public static String getRepositoryUrl(String taskHandle) {
+ int index = taskHandle.lastIndexOf(RepositoryTaskHandleUtil.HANDLE_DELIM);
+ String url = null;
+ if (index != -1) {
+ url = taskHandle.substring(0, index);
+ }
+ return url;
+ }
+
+ public static String getTaskId(String taskHandle) {
+ int index = taskHandle.lastIndexOf(HANDLE_DELIM);
+ if (index != -1) {
+ String id = taskHandle.substring(index + 1);
+ return id;
+ }
+ return null;
+ }
+
+ public static boolean isValidTaskId(String taskId) {
+ return !taskId.contains(HANDLE_DELIM);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryTemplateManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryTemplateManager.java
new file mode 100644
index 0000000..5ae388a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/RepositoryTemplateManager.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositoryTemplateManager {
+
+ private Map<String, Set<RepositoryTemplate>> templateByConnectorKind;
+
+ public synchronized void addTemplate(String connectorKind, RepositoryTemplate template) {
+ getTemplates(connectorKind).add(template);
+ }
+
+ public synchronized Set<RepositoryTemplate> getTemplates(String connectorKind) {
+ if (templateByConnectorKind == null) {
+ templateByConnectorKind = new HashMap<String, Set<RepositoryTemplate>>();
+ }
+ Set<RepositoryTemplate> templates = templateByConnectorKind.get(connectorKind);
+ if (templates == null) {
+ templates = new LinkedHashSet<RepositoryTemplate>();
+ templateByConnectorKind.put(connectorKind, templates);
+ }
+ return templates;
+ }
+
+ public synchronized void removeTemplate(String connectorKind, RepositoryTemplate template) {
+ getTemplates(connectorKind).remove(template);
+ }
+
+ /**
+ * Returns null if template not found.
+ */
+ public synchronized RepositoryTemplate getTemplate(String connectorKind, String label) {
+ for (RepositoryTemplate template : getTemplates(connectorKind)) {
+ if (template.label.equals(label)) {
+ return template;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/SaxRepositoriesContentHandler.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/SaxRepositoriesContentHandler.java
new file mode 100644
index 0000000..220a3d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/SaxRepositoriesContentHandler.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Adapted from SaxContextContentHandler
+ *
+ * @author Rob Elves
+ */
+public class SaxRepositoriesContentHandler extends DefaultHandler {
+
+ static final String ATTRIBUTE_INTERACTION_EVENT = "InteractionEvent"; //$NON-NLS-1$
+
+ private final Set<TaskRepository> taskRepositories = new HashSet<TaskRepository>();
+
+ @SuppressWarnings( { "deprecation", "restriction" })
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ try {
+ if (localName.equals(TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORY) && attributes != null) {
+ String kind = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(IRepositoryConstants.PROPERTY_CONNECTOR_KIND));
+ String url = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(IRepositoryConstants.PROPERTY_URL));
+ if (kind != null && kind.length() > 0 && url != null && url.length() > 0) {
+ TaskRepository repository = new TaskRepository(kind, url);
+ for (int index = 0; index < attributes.getLength(); index++) {
+ String key = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getLocalName(index));
+ String value = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attributes.getValue(index));
+ repository.setProperty(key, value);
+ }
+ taskRepositories.add(repository);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public Set<TaskRepository> getRepositories() {
+ return taskRepositories;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/SaxRepositoriesWriter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/SaxRepositoriesWriter.java
new file mode 100644
index 0000000..1bae465
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/SaxRepositoriesWriter.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * Adapted from SaxContextWriter
+ *
+ * @author Rob Elves
+ */
+public class SaxRepositoriesWriter {
+
+ private OutputStream outputStream;
+
+ public void setOutputStream(OutputStream outputStream) {
+ this.outputStream = outputStream;
+ }
+
+ public void writeRepositoriesToStream(Collection<TaskRepository> repositories) throws IOException {
+ if (outputStream == null) {
+ IOException ioe = new IOException("OutputStream not set"); //$NON-NLS-1$
+ throw ioe;
+ }
+
+ try {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.transform(
+ new SAXSource(new RepositoriesWriter(), new TaskRepositoriesInputSource(repositories)),
+ new StreamResult(outputStream));
+ } catch (TransformerException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Could not write repositories", //$NON-NLS-1$
+ e));
+ throw new IOException(e.getMessage());
+ }
+
+ }
+
+ private static class TaskRepositoriesInputSource extends InputSource {
+ private final Collection<TaskRepository> repositories;
+
+ public TaskRepositoriesInputSource(Collection<TaskRepository> repositories) {
+ this.repositories = repositories;
+ }
+
+ public Collection<TaskRepository> getRepositories() {
+ return this.repositories;
+ }
+
+ }
+
+ private static class RepositoriesWriter implements XMLReader {
+
+// private static final String ELEMENT_TASK_REPOSITORIES = "TaskRepositories";
+//
+// public static final String ELEMENT_TASK_REPOSITORY = "TaskRepository";
+//
+// private static final String ATTRIBUTE_VERSION = "xmlVersion";
+
+// private static final String ATTRIBUTE_URL = "Url";
+//
+// private static final String ATTRIBUTE_KIND = "Kind";
+
+ private ContentHandler handler;
+
+ private ErrorHandler errorHandler;
+
+ public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
+ return false;
+ }
+
+ public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException {
+
+ }
+
+ public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
+ return null;
+ }
+
+ public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException {
+ }
+
+ public void setEntityResolver(EntityResolver resolver) {
+ }
+
+ public EntityResolver getEntityResolver() {
+ return null;
+ }
+
+ public void setDTDHandler(DTDHandler handler) {
+ }
+
+ public DTDHandler getDTDHandler() {
+ return null;
+ }
+
+ public void setContentHandler(ContentHandler handler) {
+ this.handler = handler;
+
+ }
+
+ public ContentHandler getContentHandler() {
+ return handler;
+ }
+
+ public void setErrorHandler(ErrorHandler handler) {
+ this.errorHandler = handler;
+
+ }
+
+ public ErrorHandler getErrorHandler() {
+ return errorHandler;
+ }
+
+ @SuppressWarnings( { "deprecation", "restriction" })
+ public void parse(InputSource input) throws IOException, SAXException {
+ if (!(input instanceof TaskRepositoriesInputSource)) {
+ throw new SAXException("Can only parse writable input sources"); //$NON-NLS-1$
+ }
+
+ Collection<TaskRepository> repositories = ((TaskRepositoriesInputSource) input).getRepositories();
+
+ handler.startDocument();
+ AttributesImpl rootAttributes = new AttributesImpl();
+ rootAttributes.addAttribute("", TaskRepositoriesExternalizer.ATTRIBUTE_VERSION, //$NON-NLS-1$
+ TaskRepositoriesExternalizer.ATTRIBUTE_VERSION, "", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ handler.startElement("", TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORIES, //$NON-NLS-1$
+ TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORIES, rootAttributes);
+
+ for (TaskRepository repository : new ArrayList<TaskRepository>(repositories)) {
+
+ AttributesImpl ieAttributes = new AttributesImpl();
+ for (String key : repository.getProperties().keySet()) {
+ ieAttributes.addAttribute(
+ "", //$NON-NLS-1$
+ key,
+ key,
+ "", //$NON-NLS-1$
+ org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(repository.getProperties()
+ .get(key)));
+ }
+
+ handler.startElement("", TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORY, //$NON-NLS-1$
+ TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORY, ieAttributes);
+ handler.endElement("", TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORY, //$NON-NLS-1$
+ TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORY);
+ }
+ handler.endElement("", TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORIES, //$NON-NLS-1$
+ TaskRepositoriesExternalizer.ELEMENT_TASK_REPOSITORIES);
+
+ handler.endDocument();
+ }
+
+ public void parse(String systemId) throws IOException, SAXException {
+ throw new SAXException("Can only parse writable input sources"); //$NON-NLS-1$
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java
new file mode 100644
index 0000000..26a669b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/ScheduledTaskContainer.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class ScheduledTaskContainer extends AbstractTaskContainer {
+
+ private final TaskActivityManager activityManager;
+
+ private final String summary;
+
+ private final DateRange range;
+
+ public ScheduledTaskContainer(TaskActivityManager activityManager, DateRange range, String summary) {
+ super(summary == null ? range.toString(false) : summary);
+ this.activityManager = activityManager;
+ this.range = range;
+ if (summary == null) {
+ this.summary = range.toString(false);
+ } else {
+ this.summary = summary;
+ }
+ }
+
+ public ScheduledTaskContainer(TaskActivityManager taskActivityManager, DateRange day) {
+ this(taskActivityManager, day, null);
+ }
+
+ public boolean isFuture() {
+ return !isPresent() && range.getStartDate().after(Calendar.getInstance());
+ }
+
+ public boolean isPresent() {
+ return range.getStartDate().before(Calendar.getInstance()) && range.getEndDate().after(Calendar.getInstance());
+ }
+
+// public boolean isWeekDay() {
+// return TaskActivityUtil.getCurrentWeek().isCurrentWeekDay(range);
+// }
+
+// public boolean isToday() {
+// if (range instanceof DayDateRange) {
+// return ((DayDateRange) range).isToday();
+// }
+// return false;
+// }
+
+// public Collection<ITask> getChildren() {
+// Set<ITask> children = new HashSet<ITask>();
+// Calendar beginning = TaskActivityUtil.getCalendar();
+// beginning.setTimeInMillis(0);
+// if (isFloating() && !isFuture()) {
+// for (ITask task : activityManager.getScheduledTasks(rangebeginning, getEndDate())) {
+// if (task.internalIsFloatingScheduledDate()) {
+// children.add(task);
+// }
+// }
+// } else if (isPresent()) {
+// // add all due/overdue
+// Calendar end = TaskActivityUtil.getCalendar();
+// end.set(5000, 12, 1);
+// for (ITask task : activityManager.getDueTasks(beginning, getEndDate())) {
+// if (activityManager.isOwnedByUser(task)) {
+// children.add(task);
+// }
+// }
+//
+// // add all scheduled/overscheduled
+// for (ITask task : activityManager.getScheduledTasks(beginning, getEndDate())) {
+// if (!task.internalIsFloatingScheduledDate() && !task.isCompleted()) {
+// children.add(task);
+// }
+// }
+//
+// // if not scheduled or due in future, and is active, place in today bin
+// ITask activeTask = activityManager.getActiveTask();
+// if (activeTask != null && !children.contains(activeTask)) {
+// Set<ITask> futureScheduled = activityManager.getScheduledTasks(getStartDate(), end);
+// for (ITask task : activityManager.getDueTasks(getStartDate(), end)) {
+// if (activityManager.isOwnedByUser(task)) {
+// futureScheduled.add(task);
+// }
+// }
+// if (!futureScheduled.contains(activeTask)) {
+// children.add(activeTask);
+// }
+// }
+// } else if (isFuture()) {
+// children.addAll(activityManager.getScheduledTasks(getStartDate(), getEndDate()));
+// for (ITask task : activityManager.getDueTasks(getStartDate(), getEndDate())) {
+// if (activityManager.isOwnedByUser(task)) {
+// children.add(task);
+// }
+// }
+// } else {
+// children.addAll(activityManager.getActiveTasks(range.getStartDate(), range.getEndDate()));
+// }
+// return children;
+// }
+
+ @Override
+ public Collection<ITask> getChildren() {
+
+ // TODO: Cache this information until the next modification to pertinent data
+
+ Set<ITask> children = new HashSet<ITask>();
+
+ // All tasks scheduled for this date range
+ for (ITask task : activityManager.getScheduledTasks(range)) {
+ if (!task.isCompleted()
+ || (task.isCompleted() && TaskActivityUtil.getDayOf(task.getCompletionDate()).isPresent())) {
+ children.add(task);
+ }
+ }
+
+ // Add due tasks if not the This Week container
+ if (!(range instanceof WeekDateRange && ((WeekDateRange) range).isPresent())) {
+ for (ITask task : activityManager.getDueTasks(range.getStartDate(), range.getEndDate())) {
+ if (activityManager.isOwnedByUser(task)) {
+ children.add(task);
+ }
+ }
+ }
+
+ // All over due/scheduled tasks are present in the Today folder
+ if ((range instanceof DayDateRange) && ((DayDateRange) range).isPresent()) {
+ for (ITask task : activityManager.getOverScheduledTasks()) {
+ if (task instanceof AbstractTask
+ && !(((AbstractTask) task).getScheduledForDate() instanceof WeekDateRange)) {
+ children.add(task);
+ }
+ }
+ children.addAll(activityManager.getOverDueTasks());
+ // if not scheduled or due in future, and is active, place in today bin
+ ITask activeTask = activityManager.getActiveTask();
+ if (activeTask != null && !children.contains(activeTask)) {
+ children.add(activeTask);
+ }
+ }
+
+ if (range instanceof WeekDateRange && ((WeekDateRange) range).isThisWeek()) {
+ for (ITask task : activityManager.getOverScheduledTasks()) {
+ if (task instanceof AbstractTask
+ && ((AbstractTask) task).getScheduledForDate() instanceof WeekDateRange) {
+ children.add(task);
+ }
+ }
+ }
+
+ return children;
+ }
+
+ @Override
+ public String getSummary() {
+ if (summary != null) {
+ return summary;
+ }
+ return range.toString();
+ }
+
+ @Override
+ public String getHandleIdentifier() {
+ return summary;
+ }
+
+ @Override
+ public String getPriority() {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getUrl() {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public int compareTo(IRepositoryElement element) {
+ if (element instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer container = ((ScheduledTaskContainer) element);
+ return range.compareTo(container.getDateRange());
+ }
+ return 0;
+ }
+
+ public DateRange getDateRange() {
+ return range;
+ }
+
+ public Calendar getEnd() {
+ return range.getEndDate();
+ }
+
+ public Calendar getStart() {
+ return range.getStartDate();
+ }
+
+ public boolean includes(Calendar pastWeeksTaskStart) {
+ return range.includes(pastWeeksTaskStart);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivationHistory.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivationHistory.java
new file mode 100644
index 0000000..8828f7d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivationHistory.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - original prototype
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * Maintains a list of tasks that have been activated in the past. Each task only occurs once in the list. The list is
+ * sorted by most recent activation, i.e. the task with the highest index is the task that was most recently activated.
+ *
+ * @author Wesley Coelho (Added persistent tasks)
+ * @author Mik Kersten (hardening)
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskActivationHistory {
+
+ /**
+ * The most recently activated task has the highest index in the list.
+ */
+ private final List<AbstractTask> history = new ArrayList<AbstractTask>();
+
+ /**
+ * Index pointing to the task that was previously active.
+ */
+ private int previousIndex = -1;
+
+ public void addTask(AbstractTask task) {
+ boolean isPreviousTask = false;
+ // optimization: do not modify list, if task is already last
+ if (history.isEmpty() || history.get(history.size() - 1) != task) {
+ if (previousIndex >= 0 && previousIndex < history.size() && history.get(previousIndex) == task) {
+ isPreviousTask = true;
+ }
+ history.remove(task);
+ history.add(task);
+ }
+ if (isPreviousTask) {
+ // the previous task was activated, move the cursor
+ previousIndex--;
+ } else {
+ previousIndex = history.size() - 2;
+ }
+ }
+
+ public boolean containsTask(ITask task) {
+ return history.contains(task);
+ }
+
+ public boolean removeTask(ITask task) {
+ return history.remove(task);
+ }
+
+ public AbstractTask getPreviousTask() {
+ if (history.isEmpty()) {
+ return null;
+ }
+ AbstractTask currentTask = history.get(history.size() - 1);
+ if (currentTask.isActive() && previousIndex >= 0 && previousIndex < history.size()) {
+ return history.get(previousIndex);
+ } else {
+ return currentTask;
+ }
+ }
+
+ public List<AbstractTask> getPreviousTasks() {
+ return Collections.unmodifiableList(new ArrayList<AbstractTask>(history));
+ }
+
+ /**
+ * Returns task activation history for tasks present in <code>containers</code>
+ */
+ public List<AbstractTask> getPreviousTasks(Set<AbstractTaskContainer> containers) {
+ if (containers.isEmpty()) {
+ return getPreviousTasks();
+ }
+ Set<ITask> allWorkingSetTasks = new HashSet<ITask>();
+ for (ITaskContainer container : containers) {
+ allWorkingSetTasks.addAll(container.getChildren());
+ }
+ List<AbstractTask> allScopedTasks = new ArrayList<AbstractTask>(getPreviousTasks());
+ for (Iterator<AbstractTask> it = allScopedTasks.iterator(); it.hasNext();) {
+ AbstractTask task = it.next();
+ if (!allWorkingSetTasks.contains(task)) {
+ it.remove();
+ }
+ }
+ return Collections.unmodifiableList(allScopedTasks);
+ }
+
+ public boolean hasPrevious() {
+ return getPreviousTask() != null;
+ }
+
+ public void clear() {
+ history.clear();
+ previousIndex = -1;
+ }
+
+ public int indexOf(ITask task) {
+ return history.indexOf(task);
+
+ }
+
+ public int getSize() {
+ return history.size();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java
new file mode 100644
index 0000000..ffc37c1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityManager.java
@@ -0,0 +1,849 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+import org.eclipse.mylyn.tasks.core.ITaskActivityManager;
+
+/**
+ * Manages task elapsed time, scheduling, due dates, and the date ranges
+ *
+ * @since 2.1
+ * @author Rob Elves
+ */
+public class TaskActivityManager implements ITaskActivityManager {
+
+ private final TaskActivationHistory taskActivationHistory = new TaskActivationHistory();
+
+ private final List<ITaskActivityListener> activityListeners = new ArrayList<ITaskActivityListener>();
+
+ private final List<ITaskActivationListener> activationListeners = new ArrayList<ITaskActivationListener>();
+
+ private final Set<ITask> allScheduledTasks = new HashSet<ITask>();
+
+ private final Set<ITask> allDueTasks = new HashSet<ITask>();
+
+ private final SortedMap<DateRange, Set<ITask>> scheduledTasks = Collections.synchronizedSortedMap(new TreeMap<DateRange, Set<ITask>>());
+
+ private final SortedMap<Calendar, Set<ITask>> dueTasks = Collections.synchronizedSortedMap(new TreeMap<Calendar, Set<ITask>>());
+
+ // Map of Calendar (hour) to Tasks active during that hour
+ private final SortedMap<Calendar, Set<AbstractTask>> activeTasks = Collections.synchronizedSortedMap(new TreeMap<Calendar, Set<AbstractTask>>());
+
+ // For a given task maps Calendar Hour to duration of time spent (milliseconds) with task active
+ private final Map<AbstractTask, SortedMap<Calendar, Long>> taskElapsedTimeMap = new ConcurrentHashMap<AbstractTask, SortedMap<Calendar, Long>>();
+
+ private final Map<String, SortedMap<Calendar, Long>> workingSetElapsedTimeMap = new ConcurrentHashMap<String, SortedMap<Calendar, Long>>();
+
+ private final TaskList taskList;
+
+ private final TaskRepositoryManager repositoryManager;
+
+ private ITask activeTask;
+
+ private int startDay = Calendar.MONDAY;
+
+ private final ITaskListChangeListener TASKLIST_CHANGE_LISTENER = new ITaskListChangeListener() {
+
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (taskContainerDelta.getKind() == TaskContainerDelta.Kind.ROOT) {
+ reloadPlanningData();
+ }
+ }
+ }
+ };
+
+ public TaskActivityManager(TaskRepositoryManager repositoryManager, TaskList taskList) {
+ this.taskList = taskList;
+ this.repositoryManager = repositoryManager;
+ this.taskList.addChangeListener(TASKLIST_CHANGE_LISTENER);
+ clear();
+ }
+
+ /**
+ * Get the user specified first day of the week (Calendar.SUNDAY | Calendar.MONDAY)
+ *
+ * @see http://en.wikipedia.org/wiki/Days_of_the_week#First_day_of_the_week
+ */
+ public int getWeekStartDay() {
+ return startDay;
+ }
+
+ /**
+ * Set the first day of the week (Calendar.SUNDAY | Calendar.MONDAY)
+ *
+ * @see http://en.wikipedia.org/wiki/Days_of_the_week#First_day_of_the_week
+ *
+ * @param startDay
+ * (Calendar.SUNDAY | Calendar.MONDAY)
+ */
+ public void setWeekStartDay(int startDay) {
+ TaskActivityUtil.setStartDay(startDay);
+ this.startDay = startDay;
+ for (ITaskActivityListener listener : activityListeners) {
+ listener.activityReset();
+ }
+ }
+
+ public void addActivityListener(ITaskActivityListener listener) {
+ activityListeners.add(listener);
+ }
+
+ public void removeActivityListener(ITaskActivityListener listener) {
+ activityListeners.remove(listener);
+ }
+
+ public void addActivationListener(ITaskActivationListener listener) {
+ activationListeners.add(listener);
+ }
+
+ public void removeActivationListener(ITaskActivationListener listener) {
+ activationListeners.remove(listener);
+ }
+
+ public void clear() {
+ dueTasks.clear();
+ allDueTasks.clear();
+ scheduledTasks.clear();
+ allScheduledTasks.clear();
+ clearActivity();
+ }
+
+ public void clearActivity() {
+ activeTasks.clear();
+ taskActivationHistory.clear();
+ taskElapsedTimeMap.clear();
+ workingSetElapsedTimeMap.clear();
+ }
+
+ public void reloadPlanningData() {
+ reloadScheduledData();
+ for (ITaskActivityListener listener : activityListeners) {
+ listener.activityReset();
+ }
+ }
+
+ public void removeElapsedTime(ITask task, Date startDate, Date endDate) {
+ Assert.isNotNull(task);
+ Assert.isNotNull(startDate);
+ Assert.isNotNull(endDate);
+ // remove any time that has already accumulated in data structures
+ SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
+ if (activityMap != null) {
+ Calendar start = TaskActivityUtil.getCalendar();
+ start.setTime(startDate);
+ TaskActivityUtil.snapStartOfHour(start);
+ Calendar end = TaskActivityUtil.getCalendar();
+ end.setTime(endDate);
+ TaskActivityUtil.snapEndOfHour(end);
+ activityMap = activityMap.subMap(start, end);
+ for (Calendar cal : new HashSet<Calendar>(activityMap.keySet())) {
+ activityMap.remove(cal);
+ }
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
+ try {
+ listener.elapsedTimeUpdated(task, getElapsedTime(task));
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task activity listener failed: \"" + listener + "\"", t)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+
+ }
+
+ /**
+ * @param workingSetIds
+ * working set ids
+ */
+ public void addWorkingSetElapsedTime(String workingSetName, Date startDate, Date endDate) {
+ Assert.isNotNull(workingSetName);
+ Assert.isNotNull(startDate);
+ Assert.isNotNull(endDate);
+
+ long attentionSpan = endDate.getTime() - startDate.getTime();
+
+ // Ignore any potential negative or zero times
+ if (attentionSpan <= 0) {
+ return;
+ }
+
+ // granularity to the hour
+ Calendar hourOfDay = TaskActivityUtil.getCalendar();
+ hourOfDay.setTime(startDate);
+ snapToStartOfHour(hourOfDay);
+ SortedMap<Calendar, Long> noTaskActiveMap = workingSetElapsedTimeMap.get(workingSetName);
+ if (noTaskActiveMap == null) {
+ noTaskActiveMap = Collections.synchronizedSortedMap(new TreeMap<Calendar, Long>());
+ workingSetElapsedTimeMap.put(workingSetName, noTaskActiveMap);
+ }
+ Long daysActivity = noTaskActiveMap.get(hourOfDay);
+ if (daysActivity == null) {
+ daysActivity = new Long(0);
+ }
+
+ daysActivity = daysActivity.longValue() + attentionSpan;
+
+ noTaskActiveMap.put(hourOfDay, daysActivity);
+ }
+
+ public long getElapsedForWorkingSet(String workingSetId, Calendar startDate, Calendar endDate) {
+
+ Calendar startRange = snapToStartOfHour(getNewInstance(startDate));
+
+ Calendar endRange = snapToEndOfHour(getNewInstance(endDate));
+
+ long result = 0;
+
+ SortedMap<Calendar, Long> noTaskActiveMap = workingSetElapsedTimeMap.get(workingSetId);
+ if (noTaskActiveMap != null) {
+
+ Map<Calendar, Long> subMap = noTaskActiveMap.subMap(startRange, endRange);
+ for (Long time : subMap.values()) {
+ if (time != null && time > 0) {
+ result += time.longValue();
+ }
+ }
+ }
+ return result;
+ }
+
+ public Set<String> getWorkingSets() {
+ return workingSetElapsedTimeMap.keySet();
+ }
+
+ public void addElapsedTime(AbstractTask task, Date startDate, Date endDate) {
+ Assert.isNotNull(task);
+ Assert.isNotNull(startDate);
+ Assert.isNotNull(endDate);
+
+ SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
+ if (activityMap == null) {
+ activityMap = Collections.synchronizedSortedMap(new TreeMap<Calendar, Long>());
+ taskElapsedTimeMap.put(task, activityMap);
+ }
+
+ long attentionSpan = endDate.getTime() - startDate.getTime();
+
+ // Ignore any potential negative or zero times
+ if (attentionSpan <= 0) {
+ return;
+ }
+
+ // granularity to the hour
+ Calendar hourOfDay = TaskActivityUtil.getCalendar();
+ hourOfDay.setTime(startDate);
+ snapToStartOfHour(hourOfDay);
+ Long daysActivity = activityMap.get(hourOfDay);
+ if (daysActivity == null) {
+ daysActivity = new Long(0);
+ }
+
+ daysActivity = daysActivity.longValue() + attentionSpan;
+
+ activityMap.put(hourOfDay, daysActivity);
+
+ Set<AbstractTask> active = activeTasks.get(hourOfDay);
+ if (active == null) {
+ active = new HashSet<AbstractTask>();
+ activeTasks.put(hourOfDay, active);
+ }
+ active.add(task);
+
+ long totalElapsed = getElapsedTime(activityMap);
+
+ for (ITaskActivityListener listener : new ArrayList<ITaskActivityListener>(activityListeners)) {
+ try {
+ listener.elapsedTimeUpdated(task, totalElapsed);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task activity listener failed: \"" + listener + "\"", t)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+
+ private Calendar getNewInstance(Calendar cal) {
+ Calendar newCal = TaskActivityUtil.getCalendar();
+ newCal.setTimeInMillis(cal.getTimeInMillis());
+ return newCal;
+ }
+
+ public void addScheduledTask(AbstractTask task) {
+ DateRange range = task.getScheduledForDate();
+ if (range != null) {
+ Set<ITask> tasks = scheduledTasks.get(range);
+ if (tasks == null) {
+ tasks = new CopyOnWriteArraySet<ITask>();
+ scheduledTasks.put(range, tasks);
+ }
+ tasks.add(task);
+ allScheduledTasks.add(task);
+ } else {
+ removeScheduledTask(task);
+ }
+ }
+
+ public void removeScheduledTask(ITask task) {
+ synchronized (scheduledTasks) {
+ for (Set<ITask> setOfTasks : scheduledTasks.values()) {
+ setOfTasks.remove(task);
+ }
+ allScheduledTasks.remove(task);
+ }
+ }
+
+ public Set<ITask> getScheduledTasks(DateRange range) {
+ Set<ITask> resultingTasks = new HashSet<ITask>();
+ synchronized (scheduledTasks) {
+ Set<ITask> result = scheduledTasks.get(range);
+ if (result != null && !result.isEmpty()) {
+ resultingTasks.addAll(result);
+ } else if (!(range instanceof WeekDateRange)) {
+ return getScheduledTasks(range.getStartDate(), range.getEndDate());
+ }
+ if (range instanceof WeekDateRange && TaskActivityUtil.getNextWeek().next().compareTo(range) == 0) {
+ resultingTasks.addAll(getScheduledTasks(range.getStartDate(), range.getEndDate()));
+ }
+ }
+ return resultingTasks;
+ }
+
+ public Set<ITask> getScheduledTasks(Calendar start, Calendar end) {
+ Set<ITask> resultingTasks = new HashSet<ITask>();
+ synchronized (scheduledTasks) {
+ DateRange startRange = new DateRange(start);
+ Calendar endExclusive = TaskActivityUtil.getCalendar();
+ endExclusive.setTimeInMillis(end.getTimeInMillis() + 1);
+ DateRange endRange = new DateRange(endExclusive);
+
+ SortedMap<DateRange, Set<ITask>> result = scheduledTasks.subMap(startRange, endRange);
+ for (DateRange range : result.keySet()) {
+ if (start.compareTo(range.getStartDate()) > 0 || end.compareTo(range.getEndDate()) < 0) {
+ continue;
+ }
+ resultingTasks.addAll(result.get(range));
+ }
+ }
+ return resultingTasks;
+ }
+
+ public void addDueTask(ITask task) {
+ if (task.getDueDate() == null) {
+ removeDueTask(task);
+ return;
+ }
+ Calendar time = TaskActivityUtil.getCalendar();
+ time.setTime(task.getDueDate());
+ snapToStartOfHour(time);
+ synchronized (dueTasks) {
+ Set<ITask> tasks = dueTasks.get(time);
+ if (tasks == null) {
+ tasks = new CopyOnWriteArraySet<ITask>();
+ dueTasks.put(time, tasks);
+ }
+ tasks.add(task);
+ allDueTasks.add(task);
+ }
+
+ }
+
+ public void removeDueTask(ITask task) {
+ synchronized (dueTasks) {
+ for (Set<ITask> setOfTasks : dueTasks.values()) {
+ setOfTasks.remove(task);
+ }
+ allDueTasks.remove(task);
+ }
+ }
+
+ public Set<ITask> getDueTasks(Calendar start, Calendar end) {
+ Set<ITask> resultingTasks = new HashSet<ITask>();
+ SortedMap<Calendar, Set<ITask>> result = dueTasks.subMap(start, end);
+ synchronized (dueTasks) {
+ for (Set<ITask> set : result.values()) {
+ resultingTasks.addAll(set);
+ }
+ }
+ return resultingTasks;
+ }
+
+ public void activateTask(ITask task) {
+ deactivateActiveTask();
+
+ if (taskList.getTask(task.getRepositoryUrl(), task.getTaskId()) == null) {
+ taskList.addTask(task, taskList.getDefaultCategory());
+ }
+
+ // notify that a task is about to be activated
+ for (ITaskActivationListener listener : new ArrayList<ITaskActivationListener>(activationListeners)) {
+ try {
+ listener.preTaskActivated(task);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task activity listener failed: " + listener, t)); //$NON-NLS-1$
+ }
+ }
+
+ activeTask = task;
+ ((AbstractTask) activeTask).setActive(true);
+
+ for (ITaskActivationListener listener : new ArrayList<ITaskActivationListener>(activationListeners)) {
+ try {
+ listener.taskActivated(task);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task activity listener failed: " + listener, t)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public void deactivateActiveTask() {
+ if (activeTask != null) {
+ deactivateTask(activeTask);
+ }
+ }
+
+ public void deactivateTask(ITask task) {
+ if (task == null) {
+ return;
+ }
+
+ if (task.isActive() && task == activeTask) {
+ // notify that a task is about to be deactivated
+ for (ITaskActivationListener listener : new ArrayList<ITaskActivationListener>(activationListeners)) {
+ try {
+ listener.preTaskDeactivated(task);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Notification failed for: " + listener, t)); //$NON-NLS-1$
+ }
+ }
+
+ ((AbstractTask) activeTask).setActive(false);
+ activeTask = null;
+
+ for (ITaskActivationListener listener : new ArrayList<ITaskActivationListener>(activationListeners)) {
+ try {
+ listener.taskDeactivated(task);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Notification failed for: " + listener, t)); //$NON-NLS-1$
+ }
+ }
+ } else {
+ ((AbstractTask) task).setActive(false);
+ }
+ }
+
+ /**
+ * returns active tasks from start to end (exclusive) where both are snapped to the beginning of the hour
+ */
+ public Set<AbstractTask> getActiveTasks(Calendar start, Calendar end) {
+ Set<AbstractTask> resultingTasks = new HashSet<AbstractTask>();
+ Calendar startInternal = TaskActivityUtil.getCalendar();
+ startInternal.setTimeInMillis(start.getTimeInMillis());
+ TaskActivityUtil.snapStartOfHour(startInternal);
+
+ Calendar endInternal = TaskActivityUtil.getCalendar();
+ endInternal.setTimeInMillis(end.getTimeInMillis());
+ TaskActivityUtil.snapStartOfHour(endInternal);
+
+ synchronized (activeTasks) {
+ SortedMap<Calendar, Set<AbstractTask>> result = activeTasks.subMap(startInternal, endInternal);
+ for (Set<AbstractTask> set : result.values()) {
+ resultingTasks.addAll(set);
+ }
+ }
+ return resultingTasks;
+ }
+
+ /** total elapsed time based on activation history */
+ public long getElapsedTime(ITask task) {
+ SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
+ return getElapsedTime(activityMap);
+ }
+
+ private long getElapsedTime(SortedMap<Calendar, Long> activityMap) {
+ // TODO: Keep a running total instead of recalculating all the time
+ long result = 0;
+ if (activityMap != null) {
+ synchronized (activityMap) {
+ for (Long time : activityMap.values()) {
+ if (time != null) {
+ result += time.longValue();
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * total elapsed time based on activation history
+ */
+ public long getElapsedTime(ITask task, Calendar start, Calendar end) {
+
+ if (task == null) {
+ // TODO: return total elapsed with no task active
+ return 0;
+ }
+
+ long result = 0;
+
+ Calendar startRange = snapToStartOfHour(getNewInstance(start));
+
+ Calendar endRange = snapToEndOfHour(getNewInstance(end));
+
+ SortedMap<Calendar, Long> activityMap = taskElapsedTimeMap.get(task);
+ if (activityMap != null) {
+ synchronized (activityMap) {
+ activityMap = activityMap.subMap(startRange, endRange);
+ for (Long time : activityMap.values()) {
+ if (time != null) {
+ result += time.longValue();
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ /** total elapsed time based on activation history */
+ public long getElapsedTime(ITask task, DateRange range) {
+ return getElapsedTime(task, range.getStartDate(), range.getEndDate());
+ }
+
+ // TODO: remove, copied from TaskListManager
+ private Calendar snapToStartOfHour(Calendar cal) {
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ cal.getTime();
+ return cal;
+ }
+
+ // TODO: remove, copied from TaskListManager
+ private Calendar snapToEndOfHour(Calendar cal) {
+ cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
+ cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
+ cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
+ cal.getTime();
+ return cal;
+ }
+
+ public ITask getActiveTask() {
+ return activeTask;
+ }
+
+ private void reloadScheduledData() {
+ for (AbstractTask task : taskList.getAllTasks()) {
+ if (task.getScheduledForDate() != null) {
+ addScheduledTask(task);
+ }
+ if (task.getDueDate() != null) {
+ addDueTask(task);
+ }
+ }
+ }
+
+ public void setScheduledFor(AbstractTask task, DateRange reminderDate) {
+ Assert.isNotNull(task);
+ if (reminderDate != null && !reminderDate.equals(task.getScheduledForDate())) {
+ (task).setReminded(false);
+ }
+
+ (task).setScheduledForDate(reminderDate);
+ if (reminderDate == null) {
+ removeScheduledTask(task);
+ } else {
+ removeScheduledTask(task);
+ addScheduledTask(task);
+ }
+ taskList.notifyElementChanged(task);
+ }
+
+ public void setDueDate(ITask task, Date dueDate) {
+ task.setDueDate(dueDate);
+ if (dueDate == null) {
+ removeDueTask(task);
+ } else {
+ removeDueTask(task);
+ addDueTask(task);
+ }
+ taskList.notifyElementChanged(task);
+ }
+
+ /**
+ * @return if a repository task, will only return true if the user is a
+ */
+ public boolean isCompletedToday(ITask task) {
+ if (task != null) {
+ boolean isOwnedByUser = repositoryManager.isOwnedByUser(task);
+ if (!isOwnedByUser) {
+ return false;
+ } else {
+
+ Date completionDate = task.getCompletionDate();
+ if (completionDate != null) {
+ Calendar completedTime = TaskActivityUtil.getCalendar();
+ completedTime.setTime(completionDate);
+ return TaskActivityUtil.isToday(completedTime);
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean isPastReminder(AbstractTask task) {
+ if (task == null || task.isCompleted() || task.getScheduledForDate() == null) {
+ return false;
+ } else {
+ return isPastReminder(task.getScheduledForDate(), task.isCompleted());
+ }
+ }
+
+ public boolean isPastReminder(DateRange date, boolean isComplete) {
+ if (date == null || isComplete) {
+ return false;
+ } else {
+ if (date.getEndDate().compareTo(TaskActivityUtil.getCalendar()) < 0 && date instanceof DayDateRange) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ public boolean isDueToday(ITask task) {
+ if (repositoryManager.isOwnedByUser(task) && !task.isCompleted() && task.getDueDate() != null) {
+ Calendar cal = TaskActivityUtil.getCalendar();
+ cal.setTimeInMillis(task.getDueDate().getTime());
+ if (TaskActivityUtil.isToday(cal)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isOverdue(ITask task) {
+ return (!task.isCompleted() && task.getDueDate() != null && new Date().after(task.getDueDate()))
+ && repositoryManager.isOwnedByUser(task);
+ }
+
+ public boolean isOwnedByUser(ITask task) {
+ return repositoryManager.isOwnedByUser(task);
+ }
+
+ public boolean isActiveThisWeek(ITask task) {
+ Calendar calStart = TaskActivityUtil.getCalendar();
+ TaskActivityUtil.snapStartOfWorkWeek(calStart);
+ Calendar calEnd = TaskActivityUtil.getCalendar();
+ TaskActivityUtil.snapEndOfWeek(calEnd);
+ return getElapsedTime(task, calStart, calEnd) > 0;
+ }
+
+ public boolean isScheduledForToday(AbstractTask task) {
+ if (task != null && task.getScheduledForDate() != null) {
+ return isScheduledForToday(task.getScheduledForDate());
+ }
+ return false;
+ }
+
+ public boolean isScheduledForToday(DateRange range) {
+ if (range != null) {
+ return TaskActivityUtil.getCurrentWeek().getToday().compareTo(range) == 0;
+ }
+ return false;
+ }
+
+ public boolean isScheduledAfterThisWeek(AbstractTask task) {
+ if (task != null && task.getScheduledForDate() != null) {
+ return isScheduledAfterThisWeek(task.getScheduledForDate());
+ }
+
+ return false;
+ }
+
+ public boolean isScheduledAfterThisWeek(DateRange range) {
+ if (range != null) {
+ return TaskActivityUtil.isAfterCurrentWeek(range.getStartDate());
+ }
+ return false;
+ }
+
+ public boolean isScheduledForFuture(AbstractTask task) {
+ if (task != null && task.getScheduledForDate() != null) {
+ return isScheduledForFuture(task.getScheduledForDate());
+ }
+ return false;
+ }
+
+ public boolean isScheduledForFuture(DateRange reminder) {
+ if (reminder != null) {
+ return TaskActivityUtil.isFuture(reminder.getStartDate());
+ }
+ return false;
+ }
+
+ public boolean isScheduledForThisWeek(AbstractTask task) {
+ boolean result = false;
+ if (task != null && task.getScheduledForDate() != null) {
+ result = isScheduledForThisWeek(task.getScheduledForDate());
+ }
+ return result;
+ }
+
+ public boolean isScheduledForThisWeek(DateRange range) {
+ if (range != null) {
+
+ return TaskActivityUtil.getCurrentWeek().isCurrentWeekDay(range)
+ || TaskActivityUtil.getCurrentWeek().compareTo(range) == 0;
+ }
+ return false;
+ }
+
+ public boolean isSheduledForPastWeek(AbstractTask task) {
+ boolean result = false;
+ if (task != null && task.getScheduledForDate() != null) {
+ result = isSheduledForPastWeek(task.getScheduledForDate());
+ }
+ return result;
+ }
+
+ private boolean isSheduledForPastWeek(DateRange range) {
+ if (range != null) {
+ return (range instanceof WeekDateRange && range.isPast());
+ }
+ return false;
+ }
+
+ public boolean isScheduledForNextWeek(AbstractTask task) {
+ if (task != null) {
+ DateRange range = task.getScheduledForDate();
+ if (range != null) {
+ return TaskActivityUtil.isNextWeek(range.getStartDate());
+ }
+ }
+ return false;
+ }
+
+ public void scheduleNewTask(AbstractTask newTask) {
+ newTask.setCreationDate(new Date());
+ // TODO: set based on preference? see bug#158461
+ setScheduledFor(newTask, TaskActivityUtil.getCurrentWeek());
+ }
+
+ public boolean isDueThisWeek(ITask task) {
+ Date due = task.getDueDate();
+ if (due != null && repositoryManager.isOwnedByUser(task)) {
+ Calendar cal = TaskActivityUtil.getCalendar();
+ cal.setTime(due);
+ return TaskActivityUtil.isThisWeek(cal);
+ }
+ return false;
+ }
+
+ /**
+ * Note: Returns all task scheduled for a SPECIFIC day this week. Not those in the "This Week" / Someday bin
+ */
+ public Set<ITask> getScheduledForADayThisWeek() {
+ DateRange current = TaskActivityUtil.getCurrentWeek();
+ return getScheduledTasks(current.getStartDate(), current.getEndDate());
+ }
+
+ public TaskActivationHistory getTaskActivationHistory() {
+ return taskActivationHistory;
+ }
+
+ public Set<ITask> getAllScheduledTasks() {
+ return new HashSet<ITask>(allScheduledTasks);
+ }
+
+ public Set<AbstractTask> getAllScheduledTasksInternal() {
+ Set<AbstractTask> tasks = new HashSet<AbstractTask>();
+ synchronized (scheduledTasks) {
+ for (ITask task : allScheduledTasks) {
+ if (task instanceof AbstractTask) {
+ tasks.add((AbstractTask) task);
+ }
+ }
+ }
+ return tasks;
+ }
+
+ public Set<ITask> getAllDueTasks() {
+ return new HashSet<ITask>(allDueTasks);
+ }
+
+ public Set<ITask> getOverScheduledTasks() {
+ Set<ITask> children = new HashSet<ITask>();
+ Calendar start = TaskActivityUtil.getCalendar();
+ start.setTimeInMillis(0);
+ Calendar end = TaskActivityUtil.getCalendar();
+ TaskActivityUtil.snapStartOfDay(end);
+ for (ITask task : getScheduledTasks(start, end)) {
+ if (!task.isCompleted()) {
+ children.add(task);
+ }
+ }
+ return children;
+
+ }
+
+ public Collection<? extends ITask> getOverDueTasks() {
+ Set<ITask> children = new HashSet<ITask>();
+ Calendar start = TaskActivityUtil.getCalendar();
+ start.setTimeInMillis(0);
+ Calendar end = TaskActivityUtil.getCalendar();
+ TaskActivityUtil.snapStartOfHour(end);
+ for (ITask task : getDueTasks(start, end)) {
+ if (!task.isCompleted() && repositoryManager.isOwnedByUser(task)) {
+ children.add(task);
+ }
+ }
+ return children;
+ }
+
+ public Collection<AbstractTask> getUnscheduled() {
+ Set<AbstractTask> allTasks = new HashSet<AbstractTask>(taskList.getAllTasks());
+ for (ITask abstractTask : getAllScheduledTasks()) {
+ allTasks.remove(abstractTask);
+ }
+ return allTasks;
+ }
+
+ public boolean isActive(ITask task) {
+ Assert.isNotNull(task);
+ return task.equals(getActiveTask());
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityUtil.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityUtil.java
new file mode 100644
index 0000000..b69923f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskActivityUtil.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskActivityUtil {
+
+ private static int startDay = Calendar.MONDAY;
+
+ private static int endHour = 17;
+
+ public static Calendar snapStartOfDay(Calendar cal) {
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ cal.getTime();
+ return cal;
+ }
+
+ public static Calendar snapStartOfHour(Calendar cal) {
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ cal.getTime();
+ return cal;
+ }
+
+ public static Calendar snapEndOfHour(Calendar cal) {
+ cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
+ cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
+ cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
+ cal.getTime();
+ return cal;
+ }
+
+ public static Calendar snapEndOfDay(Calendar cal) {
+ cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY));
+ cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE));
+ cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND));
+ cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND));
+ cal.getTime();
+ return cal;
+ }
+
+ public static void snapToNextDay(Calendar cal) {
+ cal.add(Calendar.DAY_OF_MONTH, 1);
+ TaskActivityUtil.snapStartOfDay(cal);
+ }
+
+ public static Calendar snapNextDay(Calendar cal) {
+ cal.add(Calendar.DAY_OF_MONTH, 1);
+ snapStartOfDay(cal);
+ return cal;
+ }
+
+ public static Calendar snapStartOfWorkWeek(Calendar cal) {
+ cal.set(Calendar.DAY_OF_WEEK, startDay);
+ snapStartOfDay(cal);
+ return cal;
+ }
+
+ public static Calendar snapEndOfWeek(Calendar cal) {
+
+ cal.set(Calendar.DAY_OF_WEEK, getLastCalDayInt(cal));
+
+ snapEndOfDay(cal);
+ return cal;
+ }
+
+ private static int getLastCalDayInt(Calendar cal) {
+ int last = cal.getFirstDayOfWeek() - 1;
+
+ if (last == 0) {
+ last = Calendar.SATURDAY;
+ }
+
+ return last;
+ }
+
+ public static Calendar snapEndOfNextWeek(Calendar cal) {
+ snapEndOfWeek(cal);
+ cal.add(Calendar.WEEK_OF_MONTH, 1);
+ return cal;
+ }
+
+ public static Calendar snapForwardNumDays(Calendar calendar, int days) {
+ calendar.add(Calendar.DAY_OF_MONTH, days);
+ calendar.set(Calendar.HOUR_OF_DAY, endHour);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar;
+ }
+
+ public static Calendar snapEndOfWorkDay(Calendar calendar) {
+ calendar.set(Calendar.HOUR_OF_DAY, endHour);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar;
+ }
+
+ public static Calendar snapNextWorkWeek(Calendar calendar) {
+ calendar.add(Calendar.WEEK_OF_MONTH, 1);
+ snapStartOfWorkWeek(calendar);
+ return calendar;
+ }
+
+ public static boolean isAfterCurrentWeek(Calendar time) {
+ if (time != null) {
+ Calendar cal = getCalendar();
+ return time.compareTo(snapNextWorkWeek(cal)) > -1;
+ }
+ return false;
+ }
+
+ /**
+ * @return true if time is in or past Future bin
+ */
+ public static boolean isFuture(Calendar time) {
+ if (time != null) {
+ Calendar cal = getCalendar();
+ cal.add(Calendar.WEEK_OF_MONTH, 2);
+ snapStartOfWorkWeek(cal);
+ return time.compareTo(cal) > -1;
+ }
+ return false;
+ }
+
+ public static boolean isThisWeek(Calendar time) {
+ if (time != null) {
+ Calendar weekStart = getCalendar();
+ snapStartOfWorkWeek(weekStart);
+ Calendar weekEnd = getCalendar();
+ snapEndOfWeek(weekEnd);
+ return (time.compareTo(weekStart) >= 0 && time.compareTo(weekEnd) <= 0);
+ }
+ return false;
+ }
+
+ public static boolean isNextWeek(Calendar time) {
+ if (time != null) {
+ Calendar weekStart = getCalendar();
+ snapNextWorkWeek(weekStart);
+ Calendar weekEnd = getCalendar();
+ snapNextWorkWeek(weekEnd);
+ snapEndOfWeek(weekEnd);
+ return (time.compareTo(weekStart) >= 0 && time.compareTo(weekEnd) <= 0);
+ }
+ return false;
+ }
+
+ public static boolean isToday(Calendar time) {
+ if (time != null) {
+ Calendar dayStart = getCalendar();
+ snapStartOfDay(dayStart);
+ Calendar midnight = getCalendar();
+ snapEndOfDay(midnight);
+ return (time.compareTo(dayStart) >= 0 && time.compareTo(midnight) <= 0);
+ }
+ return false;
+ }
+
+ public static boolean isToday(DateRange time) {
+ if (time != null) {
+ return getCurrentWeek().getToday().compareTo(time) == 0;
+ }
+ return false;
+ }
+
+ public static Calendar getCalendar() {
+ Calendar cal = Calendar.getInstance();
+ cal.setFirstDayOfWeek(startDay);
+ cal.getTime();
+ return cal;
+ }
+
+ public static Calendar getStartOfCurrentWeek() {
+ Calendar cal = getCalendar();
+ return snapStartOfWorkWeek(cal);
+ }
+
+ public static Calendar getStartOfNextWeek() {
+ Calendar cal = getCalendar();
+ snapNextWorkWeek(cal);
+ return snapStartOfWorkWeek(cal);
+ }
+
+ public static Calendar getEndOfCurrentWeek() {
+ Calendar cal = getCalendar();
+ return snapEndOfWeek(cal);
+ }
+
+ public static boolean isBetween(Calendar time, Calendar start, Calendar end) {
+ return (time.compareTo(start) >= 0 && time.compareTo(end) <= 0);
+ }
+
+ protected static void setStartDay(int startDay) {
+ TaskActivityUtil.startDay = startDay;
+ }
+
+ protected static int getStartDay() {
+ return TaskActivityUtil.startDay;
+ }
+
+ public static void setEndHour(int endHour) {
+ TaskActivityUtil.endHour = endHour;
+ }
+
+ public static WeekDateRange getCurrentWeek() {
+ Calendar weekStart = getCalendar();
+ snapStartOfWorkWeek(weekStart);
+ Calendar weekEnd = getCalendar();
+ snapEndOfWeek(weekEnd);
+ return new WeekDateRange(weekStart, weekEnd);
+ }
+
+ public static WeekDateRange getNextWeek() {
+ Calendar weekStart = getCalendar();
+ snapNextWorkWeek(weekStart);
+ Calendar weekEnd = getCalendar();
+ weekEnd.setTimeInMillis(weekStart.getTimeInMillis());
+ snapEndOfWeek(weekEnd);
+ return new WeekDateRange(weekStart, weekEnd);
+ }
+
+ public static WeekDateRange getWeekOf(Date date) {
+ Calendar weekStart = getCalendar();
+ weekStart.setTime(date);
+ Calendar weekEnd = getCalendar();
+ weekEnd.setTime(date);
+
+ snapStartOfWorkWeek(weekStart);
+ snapEndOfWeek(weekEnd);
+ return new WeekDateRange(weekStart, weekEnd);
+ }
+
+ public static DayDateRange getDayOf(Date date) {
+ Calendar dayStart = getCalendar();
+ dayStart.setTime(date);
+ Calendar dayEnd = getCalendar();
+ dayEnd.setTime(date);
+
+ snapStartOfDay(dayStart);
+ snapEndOfDay(dayEnd);
+ return new DayDateRange(dayStart, dayEnd);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskAttachment.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskAttachment.java
new file mode 100644
index 0000000..b956e9d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskAttachment.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskAttachment implements ITaskAttachment {
+
+ private IRepositoryPerson author;
+
+ private String comment;
+
+ private String contentType;
+
+ private Date creationDate;
+
+ private boolean deprecated;
+
+ private String description;
+
+ private String fileName;
+
+ private long length;
+
+ private boolean patch;
+
+ private final ITask task;
+
+ private final TaskAttribute taskAttribute;
+
+ private final TaskRepository taskRepository;
+
+ private String url;
+
+ public TaskAttachment(TaskRepository taskRepository, ITask task, TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(task);
+ Assert.isNotNull(taskAttribute);
+ this.taskRepository = taskRepository;
+ this.task = task;
+ this.taskAttribute = taskAttribute;
+ }
+
+ public IRepositoryPerson getAuthor() {
+ return author;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public String getConnectorKind() {
+ return taskRepository.getConnectorKind();
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public long getLength() {
+ return length;
+ }
+
+ public String getRepositoryUrl() {
+ return taskRepository.getRepositoryUrl();
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public TaskAttribute getTaskAttribute() {
+ return taskAttribute;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public boolean isDeprecated() {
+ return deprecated;
+ }
+
+ public boolean isPatch() {
+ return patch;
+ }
+
+ public void setAuthor(IRepositoryPerson author) {
+ this.author = author;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public void setDeprecated(boolean deprecated) {
+ this.deprecated = deprecated;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public void setLength(long length) {
+ this.length = length;
+ }
+
+ public void setPatch(boolean patch) {
+ this.patch = patch;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java
new file mode 100644
index 0000000..9fddb03
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskCategory.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * @author Mik Kersten
+ */
+public final class TaskCategory extends AbstractTaskCategory {
+
+ private String summary;
+
+ public TaskCategory(String handle, String summary) {
+ super(handle);
+ setSummary(summary);
+ }
+
+ public TaskCategory(String handleAndDescription) {
+ this(handleAndDescription, handleAndDescription);
+ }
+
+ /**
+ * null if no parent category
+ */
+ public static AbstractTaskCategory getParentTaskCategory(ITask task) {
+ AbstractTaskCategory category = null;
+ if (task != null) {
+ for (ITaskContainer container : ((AbstractTask) task).getParentContainers()) {
+ if (container instanceof AbstractTaskCategory) {
+ category = (AbstractTaskCategory) container;
+ }
+ }
+ }
+ return category;
+ }
+
+ @Override
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskComment.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskComment.java
new file mode 100644
index 0000000..a9fdc37
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskComment.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * A comment posted by a user on a task.
+ *
+ * @author Steffen Pingel
+ */
+public class TaskComment implements ITaskComment {
+
+ private IRepositoryPerson author;
+
+ private Date creationDate;
+
+ private int number;
+
+ private final ITask task;
+
+ private final TaskAttribute taskAttribute;
+
+ private final TaskRepository taskRepository;
+
+ private String text;
+
+ private String url;
+
+ public TaskComment(TaskRepository taskRepository, ITask task, TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(task);
+ Assert.isNotNull(taskAttribute);
+ this.taskRepository = taskRepository;
+ this.task = task;
+ this.taskAttribute = taskAttribute;
+ }
+
+ public IRepositoryPerson getAuthor() {
+ return author;
+ }
+
+ public String getConnectorKind() {
+ return taskRepository.getConnectorKind();
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public String getRepositoryUrl() {
+ return taskRepository.getRepositoryUrl();
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public TaskAttribute getTaskAttribute() {
+ return taskAttribute;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setAuthor(IRepositoryPerson author) {
+ this.author = author;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskContainerDelta.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskContainerDelta.java
new file mode 100644
index 0000000..91a1cdc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskContainerDelta.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * Immutable. Defines changes to Task List elements.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public final class TaskContainerDelta {
+
+ public enum Kind {
+ /**
+ * One container (source) added to another (target)
+ */
+ ADDED,
+
+ /**
+ * One container (source) removed from another (target)
+ */
+ REMOVED,
+
+ /**
+ * The internal state of the container (target) has changed, e.g. attributes, summary, priority, etc
+ */
+ CONTENT,
+
+ /**
+ * The element has been deleted from the tasklist
+ */
+ DELETED,
+
+ /**
+ * The root of the data structure has changed.
+ */
+ ROOT
+ }
+
+ private final ITaskContainer parent;
+
+ private final IRepositoryElement element;
+
+ private final Kind kind;
+
+ private boolean isTransient;
+
+ /**
+ * @param element
+ * - object being moved/added/removed, source assumed to be root
+ * @since 3.0
+ */
+ public TaskContainerDelta(IRepositoryElement element, Kind kind) {
+ this.element = element;
+ this.parent = null;
+ this.kind = kind;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskContainerDelta(IRepositoryElement element, ITaskContainer parent, Kind kind) {
+ this.element = element;
+ this.parent = parent;
+ this.kind = kind;
+ }
+
+ /**
+ * The <code>target</code> is the container that the <code>source</code> is being moved from/to
+ *
+ * @since 3.0
+ */
+ public ITaskContainer getParent() {
+ return parent;
+ }
+
+ /**
+ * The element being ADDED or REMOVED wrt the <code>target</code>
+ *
+ * @since 3.0
+ */
+ public IRepositoryElement getElement() {
+ return element;
+ }
+
+ public Kind getKind() {
+ return kind;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setTransient(boolean isTransient) {
+ this.isTransient = isTransient;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isTransient() {
+ return isTransient;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskExternalizationException.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskExternalizationException.java
new file mode 100644
index 0000000..3070c5d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskExternalizationException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ */
+public class TaskExternalizationException extends Exception {
+
+ private static final long serialVersionUID = 5804522104992031907L;
+
+ public TaskExternalizationException() {
+ super();
+ }
+
+ public TaskExternalizationException(String detailMessage) {
+ super(detailMessage);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java
new file mode 100644
index 0000000..b62c057
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskGroup.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eugen Kuleshov - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+/**
+ * NOTE: this class is likely to change or become API for 3.0
+ *
+ * @author Eugene Kuleshov
+ * @since 2.1
+ */
+public class TaskGroup extends AbstractTaskContainer {
+
+ private final String summary;
+
+ private final String groupBy;
+
+ public TaskGroup(String parentHandle, String summary, String groupBy) {
+ super(parentHandle + summary);
+ this.summary = summary;
+ this.groupBy = groupBy;
+ }
+
+ @Override
+ public String getSummary() {
+ return summary;
+ }
+
+ @Override
+ public boolean isUserManaged() {
+ return false;
+ }
+
+ public String getGroupBy() {
+ return groupBy;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java
new file mode 100644
index 0000000..039260b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskList.java
@@ -0,0 +1,723 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ILock;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+
+/**
+ * Stores and manages task list elements and their containment hierarchy.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class TaskList implements ITaskList, ITransferList {
+
+ private static String DEFAULT_HANDLE_PREFIX = "handle-"; //$NON-NLS-1$
+
+ private static ILock lock = Job.getJobManager().newLock();
+
+ private Map<String, AbstractTaskCategory> categories;
+
+ private final Set<ITaskListChangeListener> changeListeners = new CopyOnWriteArraySet<ITaskListChangeListener>();
+
+ private UncategorizedTaskContainer defaultCategory;
+
+ private int maxLocalTaskId;
+
+ private Map<String, RepositoryQuery> queries;
+
+ private Map<String, UnmatchedTaskContainer> repositoryOrphansMap;
+
+ private Map<String, UnsubmittedTaskContainer> unsubmittedTasksMap;
+
+ private Map<String, AbstractTask> tasks;
+
+ private Set<TaskContainerDelta> delta;
+
+ private int nextHandle = 1;
+
+ public TaskList() {
+ reset();
+ }
+
+ public void addCategory(TaskCategory category) {
+ Assert.isNotNull(category);
+ try {
+ lock();
+ if (categories.containsKey(category.getHandleIdentifier())) {
+ throw new IllegalArgumentException("Handle " + category.getHandleIdentifier() //$NON-NLS-1$
+ + " already exists in task list"); //$NON-NLS-1$
+ }
+ categories.put(category.getHandleIdentifier(), category);
+ delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.ADDED));
+ } finally {
+ unlock();
+ }
+ }
+
+ public void addChangeListener(ITaskListChangeListener listener) {
+ changeListeners.add(listener);
+ }
+
+ /**
+ * precondition: task must not be null and must exist in the task list
+ */
+ private void addOrphan(AbstractTask task, Set<TaskContainerDelta> delta) {
+ if (!task.getParentContainers().isEmpty()) {
+ // Current policy is not to archive/orphan if the task exists in some other container
+ return;
+ }
+
+ AbstractTaskContainer orphans = getUnmatchedContainer(task.getRepositoryUrl());
+ if (orphans != null) {
+ task.addParentContainer(orphans);
+ orphans.internalAddChild(task);
+ delta.add(new TaskContainerDelta(task, orphans, TaskContainerDelta.Kind.ADDED));
+ }
+ }
+
+ public void addQuery(RepositoryQuery query) throws IllegalArgumentException {
+ Assert.isNotNull(query);
+ try {
+ lock();
+ if (queries.containsKey(query.getHandleIdentifier())) {
+ throw new IllegalArgumentException("Handle " + query.getHandleIdentifier() //$NON-NLS-1$
+ + " already exists in task list"); //$NON-NLS-1$
+ }
+ queries.put(query.getHandleIdentifier(), query);
+ delta.add(new TaskContainerDelta(query, TaskContainerDelta.Kind.ADDED));
+ } finally {
+ unlock();
+ }
+ }
+
+ /**
+ * Add orphaned task to the task list
+ */
+ public void addTask(ITask task) {
+ addTask(task, null);
+ }
+
+ public boolean addTask(ITask itask, AbstractTaskContainer container) {
+ AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ Assert.isLegal(!(container instanceof UnmatchedTaskContainer));
+
+ try {
+ lock();
+ task = getOrCreateTask(task);
+ if (task.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) {
+ String repositoryUrl = task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL);
+ if (repositoryUrl != null) {
+ container = getUnsubmittedContainer(repositoryUrl);
+ }
+ }
+ if (container == null) {
+ container = getUnmatchedContainer(task.getRepositoryUrl());
+ } else {
+ container = getValidElement(container);
+ }
+
+ if (container instanceof UnsubmittedTaskContainer && container.isEmpty()) {
+ delta.add(new TaskContainerDelta(container, TaskContainerDelta.Kind.ROOT));
+ }
+
+ // ensure parent is valid and does not contain task already
+ if (container == null || task.equals(container) || task.getParentContainers().contains(container)) {
+ return false;
+ }
+
+ // ensure that we don't create cycles
+ if ((task).contains(container.getHandleIdentifier())) {
+ return false;
+ }
+
+ if (task instanceof LocalTask && task.getParentContainers().size() > 0) {
+ // local tasks should only have 1 parent
+ for (AbstractTaskContainer parent : task.getParentContainers()) {
+ removeFromContainerInternal(parent, task, delta);
+ }
+ } else if (container instanceof AbstractTaskCategory) {
+ // tasks can only be in one task category at a time
+ AbstractTaskCategory tempCat = TaskCategory.getParentTaskCategory(task);
+ if (tempCat != null) {
+ removeFromContainerInternal(tempCat, task, delta);
+ }
+ }
+
+ removeOrphan(task, delta);
+
+ (task).addParentContainer(container);
+ container.internalAddChild(task);
+ delta.add(new TaskContainerDelta(task, container, TaskContainerDelta.Kind.ADDED));
+ } finally {
+ unlock();
+ }
+
+ return true;
+ }
+
+ public void addUnmatchedContainer(UnmatchedTaskContainer orphanedTasksContainer) {
+ repositoryOrphansMap.put(orphanedTasksContainer.getRepositoryUrl(), orphanedTasksContainer);
+ unsubmittedTasksMap.put(orphanedTasksContainer.getRepositoryUrl(), new UnsubmittedTaskContainer(
+ orphanedTasksContainer.getConnectorKind(), orphanedTasksContainer.getRepositoryUrl()));
+ }
+
+ public void deleteCategory(AbstractTaskCategory category) {
+ try {
+ lock();
+ categories.remove(category.getHandleIdentifier());
+ for (ITask task : category.getChildren()) {
+ ((AbstractTask) task).removeParentContainer(category);
+ addOrphan((AbstractTask) task, delta);
+ }
+ delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.REMOVED));
+ delta.add(new TaskContainerDelta(category, TaskContainerDelta.Kind.DELETED));
+ } finally {
+ unlock();
+ }
+ }
+
+ public void deleteQuery(RepositoryQuery query) {
+ try {
+ lock();
+ queries.remove(query.getHandleIdentifier());
+ for (ITask task : query.getChildren()) {
+ ((AbstractTask) task).removeParentContainer(query);
+ addOrphan((AbstractTask) task, delta);
+ }
+ delta.add(new TaskContainerDelta(query, TaskContainerDelta.Kind.REMOVED));
+ delta.add(new TaskContainerDelta(query, TaskContainerDelta.Kind.DELETED));
+ } finally {
+ unlock();
+ }
+ }
+
+ /**
+ * Task is removed from all containers. Currently subtasks are not deleted but rather are rather potentially
+ * orphaned.
+ */
+ public void deleteTask(ITask itask) {
+ Assert.isNotNull(itask);
+ AbstractTask task = (AbstractTask) itask;
+ try {
+ lock();
+
+ // remove task from all parent containers
+ for (AbstractTaskContainer container : task.getParentContainers()) {
+ removeFromContainerInternal(container, task, delta);
+ }
+
+ // remove this task as a parent for all subtasks
+ for (ITask child : task.getChildren()) {
+ removeFromContainerInternal(task, child, delta);
+ addOrphan((AbstractTask) child, delta);
+ }
+
+ tasks.remove(task.getHandleIdentifier());
+ delta.add(new TaskContainerDelta(task, TaskContainerDelta.Kind.REMOVED));
+ delta.add(new TaskContainerDelta(task, TaskContainerDelta.Kind.DELETED));
+ } finally {
+ unlock();
+ }
+ }
+
+ private void fireDelta(HashSet<TaskContainerDelta> deltasToFire) {
+ for (ITaskListChangeListener listener : changeListeners) {
+ try {
+ listener.containersChanged(Collections.unmodifiableSet(deltasToFire));
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Notification failed for: " //$NON-NLS-1$
+ + listener, t));
+ }
+ }
+ }
+
+ public Collection<AbstractTask> getAllTasks() {
+ return Collections.unmodifiableCollection(tasks.values());
+ }
+
+ public Set<AbstractTaskCategory> getCategories() {
+ return Collections.unmodifiableSet(new HashSet<AbstractTaskCategory>(categories.values()));
+ }
+
+ /**
+ * Exposed for unit testing
+ *
+ * @return unmodifiable collection of ITaskActivityListeners
+ */
+ public Set<ITaskListChangeListener> getChangeListeners() {
+ return Collections.unmodifiableSet(changeListeners);
+ }
+
+ public AbstractTaskCategory getContainerForHandle(String categoryHandle) {
+ Assert.isNotNull(categoryHandle);
+ for (AbstractTaskCategory cat : categories.values()) {
+ if (cat.getHandleIdentifier().equals(categoryHandle)) {
+ return cat;
+ }
+ }
+ return null;
+ }
+
+ public AbstractTaskCategory getDefaultCategory() {
+ return defaultCategory;
+ }
+
+ public int getLastLocalTaskId() {
+ return maxLocalTaskId;
+ }
+
+ public int getNextLocalTaskId() {
+ try {
+ lock();
+ return ++maxLocalTaskId;
+ } finally {
+ unlock();
+ }
+ }
+
+ private AbstractTask getOrCreateTask(AbstractTask taskListElement) {
+ AbstractTask task = tasks.get(taskListElement.getHandleIdentifier());
+ if (task == null) {
+ tasks.put(taskListElement.getHandleIdentifier(), taskListElement);
+ task = taskListElement;
+ if (task instanceof LocalTask) {
+ try {
+ int taskId = Integer.parseInt(task.getTaskId());
+ maxLocalTaskId = Math.max(maxLocalTaskId, taskId);
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ }
+ return task;
+ }
+
+ public Set<RepositoryQuery> getQueries() {
+ return Collections.unmodifiableSet(new HashSet<RepositoryQuery>(queries.values()));
+ }
+
+ /**
+ * return all queries for the given repository url
+ */
+ public Set<RepositoryQuery> getRepositoryQueries(String repositoryUrl) {
+ Assert.isNotNull(repositoryUrl);
+
+ Set<RepositoryQuery> repositoryQueries = new HashSet<RepositoryQuery>();
+ for (RepositoryQuery query : queries.values()) {
+ if (query.getRepositoryUrl().equals(repositoryUrl)) {
+ repositoryQueries.add(query);
+ }
+ }
+ return repositoryQueries;
+ }
+
+ public Set<AbstractTaskContainer> getRootElements() {
+ Set<AbstractTaskContainer> roots = new HashSet<AbstractTaskContainer>();
+ roots.add(defaultCategory);
+ for (AbstractTaskCategory cat : categories.values()) {
+ roots.add(cat);
+ }
+ for (RepositoryQuery query : queries.values()) {
+ roots.add(query);
+ }
+ for (UnmatchedTaskContainer orphanContainer : repositoryOrphansMap.values()) {
+ roots.add(orphanContainer);
+ }
+ for (UnsubmittedTaskContainer unsubmitedTaskContainer : unsubmittedTasksMap.values()) {
+ roots.add(unsubmitedTaskContainer);
+ }
+ return roots;
+ }
+
+ /**
+ * TODO: consider removing, if everything becomes a repository task
+ *
+ * @return null if no such task.
+ */
+ public AbstractTask getTask(String handleIdentifier) {
+ if (handleIdentifier == null) {
+ return null;
+ } else {
+ return tasks.get(handleIdentifier);
+ }
+ }
+
+ public ITask getTask(String repositoryUrl, String taskId) {
+ if (!RepositoryTaskHandleUtil.isValidTaskId(taskId)) {
+ return null;
+ }
+
+ String handle = RepositoryTaskHandleUtil.getHandle(repositoryUrl, taskId);
+ return getTask(handle);
+ }
+
+ public AbstractTask getTaskByKey(String repositoryUrl, String taskKey) {
+ for (AbstractTask task : tasks.values()) {
+ String currentTaskKey = task.getTaskKey();
+ if (currentTaskKey != null && currentTaskKey.equals(taskKey)
+ && task.getRepositoryUrl().equals(repositoryUrl)) {
+ return task;
+ }
+ }
+ return null;
+ }
+
+ public Set<AbstractTaskCategory> getTaskCategories() {
+ Set<AbstractTaskCategory> containers = new HashSet<AbstractTaskCategory>();
+ for (AbstractTaskCategory container : categories.values()) {
+ if (container instanceof TaskCategory) {
+ containers.add(container);
+ }
+ }
+ return containers;
+ }
+
+ /**
+ * Returns all tasks for the given repository url.
+ */
+ public Set<ITask> getTasks(String repositoryUrl) {
+ Set<ITask> repositoryTasks = new HashSet<ITask>();
+ if (repositoryUrl != null) {
+ for (ITask task : tasks.values()) {
+ if (task.getRepositoryUrl().equals(repositoryUrl)) {
+ repositoryTasks.add(task);
+ }
+ }
+ }
+ return repositoryTasks;
+ }
+
+ public AbstractTaskContainer getUnmatchedContainer(String repositoryUrl) {
+ if (LocalRepositoryConnector.REPOSITORY_URL.equals(repositoryUrl)) {
+ return defaultCategory;
+ } else {
+ UnmatchedTaskContainer orphans = repositoryOrphansMap.get(repositoryUrl);
+ if (orphans == null) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Failed to find unmatched container for repository \"" + repositoryUrl + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return orphans;
+ }
+ }
+
+ public Set<UnmatchedTaskContainer> getUnmatchedContainers() {
+ return Collections.unmodifiableSet(new HashSet<UnmatchedTaskContainer>(repositoryOrphansMap.values()));
+ }
+
+ /**
+ * Task added if does not exist already. Ensures the element exists in the task list
+ *
+ * @throws IllegalAgumentException
+ * if null argument passed or element does not exist in task list
+ * @return element as passed in or instance from task list with same handle if exists
+ */
+ private AbstractTaskContainer getValidElement(IRepositoryElement taskListElement) {
+ AbstractTaskContainer result = null;
+ if (taskListElement instanceof ITask) {
+ result = tasks.get(taskListElement.getHandleIdentifier());
+ } else if (taskListElement instanceof UncategorizedTaskContainer) {
+ result = defaultCategory;
+ } else if (taskListElement instanceof UnmatchedTaskContainer) {
+ result = repositoryOrphansMap.get(((UnmatchedTaskContainer) taskListElement).getRepositoryUrl());
+ } else if (taskListElement instanceof UnsubmittedTaskContainer) {
+ result = unsubmittedTasksMap.get(((UnsubmittedTaskContainer) taskListElement).getRepositoryUrl());
+ } else if (taskListElement instanceof TaskCategory) {
+ result = categories.get(taskListElement.getHandleIdentifier());
+ } else if (taskListElement instanceof IRepositoryQuery) {
+ result = queries.get(taskListElement.getHandleIdentifier());
+ }
+
+ if (result == null) {
+ throw new IllegalArgumentException("Element " + taskListElement.getHandleIdentifier() //$NON-NLS-1$
+ + " does not exist in the task list."); //$NON-NLS-1$
+ } else {
+ return result;
+ }
+ }
+
+ public void notifyElementsChanged(Set<? extends IRepositoryElement> elements) {
+ HashSet<TaskContainerDelta> deltas = new HashSet<TaskContainerDelta>();
+ if (elements == null) {
+ deltas.add(new TaskContainerDelta(null, TaskContainerDelta.Kind.ROOT));
+ } else {
+ for (IRepositoryElement element : elements) {
+ deltas.add(new TaskContainerDelta(element, TaskContainerDelta.Kind.CONTENT));
+ }
+ }
+
+ fireDelta(deltas);
+ }
+
+ // TODO rename: this indicates a change of the synchronizing/status flag, not of the synchronization state
+ public void notifySynchronizationStateChanged(Set<? extends IRepositoryElement> elements) {
+ HashSet<TaskContainerDelta> taskChangeDeltas = new HashSet<TaskContainerDelta>();
+ for (IRepositoryElement abstractTaskContainer : elements) {
+ TaskContainerDelta delta = new TaskContainerDelta(abstractTaskContainer, TaskContainerDelta.Kind.CONTENT);
+ delta.setTransient(true);
+ taskChangeDeltas.add(delta);
+ }
+
+ fireDelta(taskChangeDeltas);
+ }
+
+ // TODO rename: this indicates a change of the synchronizing/status flag, not of the synchronization state
+ public void notifySynchronizationStateChanged(IRepositoryElement element) {
+ notifySynchronizationStateChanged(Collections.singleton(element));
+ }
+
+ public void notifyElementChanged(IRepositoryElement element) {
+ notifyElementsChanged(Collections.singleton(element));
+ }
+
+ public void refactorRepositoryUrl(String oldRepositoryUrl, String newRepositoryUrl) {
+ Assert.isNotNull(oldRepositoryUrl);
+ Assert.isNotNull(newRepositoryUrl);
+
+ try {
+ lock();
+ for (AbstractTask task : tasks.values()) {
+ if (oldRepositoryUrl.equals(RepositoryTaskHandleUtil.getRepositoryUrl(task.getHandleIdentifier()))) {
+ tasks.remove(task.getHandleIdentifier());
+ task.setRepositoryUrl(newRepositoryUrl);
+ tasks.put(task.getHandleIdentifier(), task);
+ String taskUrl = task.getUrl();
+ if (taskUrl != null && taskUrl.startsWith(oldRepositoryUrl)) {
+ task.setUrl(newRepositoryUrl + taskUrl.substring(oldRepositoryUrl.length()));
+ }
+ }
+ if (oldRepositoryUrl.equals(task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL))) {
+ task.setAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL, newRepositoryUrl);
+ }
+ }
+
+ for (RepositoryQuery query : queries.values()) {
+ if (query.getRepositoryUrl().equals(oldRepositoryUrl)) {
+ query.setRepositoryUrl(newRepositoryUrl);
+ delta.add(new TaskContainerDelta(query, TaskContainerDelta.Kind.CONTENT));
+ }
+ }
+
+ for (UnmatchedTaskContainer orphans : repositoryOrphansMap.values()) {
+ if (orphans.getRepositoryUrl().equals(oldRepositoryUrl)) {
+ repositoryOrphansMap.remove(oldRepositoryUrl);
+ //categories.remove(orphans.getHandleIdentifier());
+ orphans.setRepositoryUrl(newRepositoryUrl);
+ repositoryOrphansMap.put(newRepositoryUrl, orphans);
+ //categories.put(orphans.getHandleIdentifier(), orphans);
+ delta.add(new TaskContainerDelta(orphans, TaskContainerDelta.Kind.CONTENT));
+ }
+ }
+ for (UnsubmittedTaskContainer unsubmitted : unsubmittedTasksMap.values()) {
+ if (unsubmitted.getRepositoryUrl().equals(oldRepositoryUrl)) {
+ unsubmittedTasksMap.remove(oldRepositoryUrl);
+ unsubmitted.setRepositoryUrl(newRepositoryUrl);
+ unsubmittedTasksMap.put(newRepositoryUrl, unsubmitted);
+ delta.add(new TaskContainerDelta(unsubmitted, TaskContainerDelta.Kind.CONTENT));
+ }
+ }
+ } finally {
+ unlock();
+ }
+ }
+
+ public void removeChangeListener(ITaskListChangeListener listener) {
+ changeListeners.remove(listener);
+ }
+
+ public void removeFromContainer(AbstractTaskContainer container, ITask task) {
+ Assert.isNotNull(container);
+ Assert.isNotNull(task);
+
+ removeFromContainer(container, Collections.singleton(task));
+ }
+
+ public void removeFromContainer(AbstractTaskContainer container, Set<ITask> tasks) {
+ Assert.isNotNull(container);
+ Assert.isNotNull(tasks);
+ try {
+ lock();
+ for (ITask task : tasks) {
+ removeFromContainerInternal(container, task, delta);
+ addOrphan((AbstractTask) task, delta);
+ }
+ } finally {
+ unlock();
+ }
+ }
+
+ /**
+ * Note: does not add <code>task</code> to the unmatched container.
+ */
+ private void removeFromContainerInternal(AbstractTaskContainer container, ITask task, Set<TaskContainerDelta> delta) {
+ assert container.getChildren().contains(task);
+
+ container.internalRemoveChild(task);
+ ((AbstractTask) task).removeParentContainer(container);
+
+ delta.add(new TaskContainerDelta(task, container, TaskContainerDelta.Kind.REMOVED));
+ }
+
+ private void removeOrphan(AbstractTask task, Set<TaskContainerDelta> delta) {
+ AbstractTaskContainer orphans = getUnmatchedContainer(task.getRepositoryUrl());
+ if (orphans != null) {
+ if (orphans.internalRemoveChild(task)) {
+ delta.add(new TaskContainerDelta(task, orphans, TaskContainerDelta.Kind.REMOVED));
+ task.removeParentContainer(orphans);
+ }
+ }
+ }
+
+ /**
+ * TODO separate category/query handle from name
+ *
+ * @deprecated
+ */
+ @Deprecated
+ public void renameContainer(AbstractTaskContainer container, String newDescription) {
+ Assert.isLegal(!(container instanceof ITask));
+ Assert.isLegal(!(container instanceof UnmatchedTaskContainer));
+ try {
+ lock();
+ if (container instanceof TaskCategory) {
+ ((TaskCategory) container).setSummary(newDescription);
+ } else if (container instanceof RepositoryQuery) {
+ ((RepositoryQuery) container).setSummary(newDescription);
+ }
+ delta.add(new TaskContainerDelta(container, TaskContainerDelta.Kind.CONTENT));
+ } finally {
+ unlock();
+ }
+ }
+
+ /**
+ * Public for testing.
+ */
+ public void reset() {
+ try {
+ lock();
+ tasks = new ConcurrentHashMap<String, AbstractTask>();
+
+ repositoryOrphansMap = new ConcurrentHashMap<String, UnmatchedTaskContainer>();
+ unsubmittedTasksMap = new ConcurrentHashMap<String, UnsubmittedTaskContainer>();
+ categories = new ConcurrentHashMap<String, AbstractTaskCategory>();
+ queries = new ConcurrentHashMap<String, RepositoryQuery>();
+
+ defaultCategory = new UncategorizedTaskContainer();
+
+ maxLocalTaskId = 0;
+ categories.put(defaultCategory.getHandleIdentifier(), defaultCategory);
+ } finally {
+ unlock();
+ }
+ }
+
+ public void run(ITaskListRunnable runnable) throws CoreException {
+ run(runnable, null);
+ }
+
+ public void run(ITaskListRunnable runnable, IProgressMonitor monitor) throws CoreException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ lock(monitor);
+
+ runnable.execute(monitor);
+
+ } finally {
+ unlock();
+ }
+ }
+
+ private void lock() {
+ lock.acquire();
+ if (lock.getDepth() == 1) {
+ delta = new HashSet<TaskContainerDelta>();
+ }
+ }
+
+ private void lock(IProgressMonitor monitor) throws CoreException {
+ while (!monitor.isCanceled()) {
+ try {
+ if (lock.acquire(3000)) {
+ if (lock.getDepth() == 1) {
+ delta = new HashSet<TaskContainerDelta>();
+ }
+ return;
+ }
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+ throw new OperationCanceledException();
+ }
+
+ private void unlock() {
+ HashSet<TaskContainerDelta> toFire = null;
+ if (lock.getDepth() == 1) {
+ toFire = new HashSet<TaskContainerDelta>(delta);
+ }
+ lock.release();
+ if (toFire != null && toFire.size() > 0) {
+ fireDelta(toFire);
+ }
+ }
+
+ public static ISchedulingRule getSchedulingRule() {
+ return ITasksCoreConstants.TASKLIST_SCHEDULING_RULE;
+ }
+
+ public String getUniqueHandleIdentifier() {
+ try {
+ lock();
+ while (nextHandle < Integer.MAX_VALUE) {
+ String handle = DEFAULT_HANDLE_PREFIX + nextHandle;
+ nextHandle++;
+ if (!categories.containsKey(handle) && !queries.containsKey(handle)
+ && !repositoryOrphansMap.containsKey(handle) && !tasks.containsKey(handle)) {
+ return handle;
+ }
+ }
+ throw new RuntimeException("No more unique handles for task list"); //$NON-NLS-1$
+ } finally {
+ unlock();
+ }
+ }
+
+ public UnsubmittedTaskContainer getUnsubmittedContainer(String repositoryUrl) {
+ return unsubmittedTasksMap.get(repositoryUrl);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoriesExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoriesExternalizer.java
new file mode 100644
index 0000000..93d61fd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoriesExternalizer.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jevgeni Holodkov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Rob Elves
+ * @author Jevgeni Holodkov
+ */
+public class TaskRepositoriesExternalizer {
+
+ private final SaxRepositoriesWriter writer = new SaxRepositoriesWriter();
+
+ public static final String ELEMENT_TASK_REPOSITORIES = "TaskRepositories"; //$NON-NLS-1$
+
+ public static final String ELEMENT_TASK_REPOSITORY = "TaskRepository"; //$NON-NLS-1$
+
+ public static final String ATTRIBUTE_VERSION = "OutputVersion"; //$NON-NLS-1$
+
+ public void writeRepositoriesToXML(Collection<TaskRepository> repositories, File file) {
+ ZipOutputStream outputStream = null;
+ try {
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+
+ outputStream = new ZipOutputStream(new FileOutputStream(file));
+ writeRepositories(repositories, outputStream);
+ outputStream.close();
+
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Could not write: " //$NON-NLS-1$
+ + file.getAbsolutePath(), e));
+ } finally {
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Could not close: " //$NON-NLS-1$
+ + file.getAbsolutePath(), e));
+ }
+ }
+ }
+ }
+
+ /**
+ * @param repositories
+ * @param outputStream
+ * @throws IOException
+ */
+ public void writeRepositories(Collection<TaskRepository> repositories, ZipOutputStream outputStream)
+ throws IOException {
+ ZipEntry zipEntry = new ZipEntry(TaskRepositoryManager.OLD_REPOSITORIES_FILE);
+ outputStream.putNextEntry(zipEntry);
+ outputStream.setMethod(ZipOutputStream.DEFLATED);
+
+ // OutputStream stream = new FileOutputStream(file);
+ writer.setOutputStream(outputStream);
+ writer.writeRepositoriesToStream(repositories);
+ outputStream.flush();
+ outputStream.closeEntry();
+ }
+
+ public Set<TaskRepository> readRepositoriesFromXML(File file) {
+
+ if (!file.exists()) {
+ return null;
+ }
+ InputStream inputStream = null;
+ try {
+ inputStream = new ZipInputStream(new FileInputStream(file));
+
+ // search for REPOSITORIES entry
+ ZipEntry entry = ((ZipInputStream) inputStream).getNextEntry();
+ while (entry != null) {
+ if (TaskRepositoryManager.OLD_REPOSITORIES_FILE.equals(entry.getName())) {
+ break;
+ }
+ entry = ((ZipInputStream) inputStream).getNextEntry();
+ }
+
+ if (entry == null) {
+ return null;
+ }
+
+ SaxRepositoriesContentHandler contentHandler = new SaxRepositoriesContentHandler();
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ reader.setContentHandler(contentHandler);
+ reader.parse(new InputSource(inputStream));
+ return contentHandler.getRepositories();
+ } catch (Throwable e) {
+ file.renameTo(new File(file.getAbsolutePath() + "-save")); //$NON-NLS-1$
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error reading context file", e)); //$NON-NLS-1$
+ return null;
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Error closing context file", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryAdapter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryAdapter.java
new file mode 100644
index 0000000..40a4d89
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryAdapter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class TaskRepositoryAdapter implements IRepositoryListener {
+
+ public void repositoryAdded(TaskRepository repository) {
+ // ignore
+ }
+
+ public void repositoryRemoved(TaskRepository repository) {
+ // ignore
+ }
+
+ public void repositorySettingsChanged(TaskRepository repository) {
+ // ignore
+ }
+
+ public void repositoryUrlChanged(TaskRepository repository, String oldUrl) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryLocation.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryLocation.java
new file mode 100644
index 0000000..3f50f5d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryLocation.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.net.Proxy;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryLocation extends AbstractWebLocation {
+
+ protected final TaskRepository taskRepository;
+
+ public TaskRepositoryLocation(TaskRepository taskRepository) {
+ super(taskRepository.getRepositoryUrl());
+ this.taskRepository = taskRepository;
+ }
+
+ @Override
+ public Proxy getProxyForHost(String host, String proxyType) {
+ if (!taskRepository.isDefaultProxyEnabled()) {
+ String proxyHost = taskRepository.getProperty(TaskRepository.PROXY_HOSTNAME);
+ String proxyPort = taskRepository.getProperty(TaskRepository.PROXY_PORT);
+ if (proxyHost != null && proxyHost.length() > 0 && proxyPort != null) {
+ try {
+ int proxyPortNum = Integer.parseInt(proxyPort);
+ AuthenticationCredentials credentials = taskRepository.getCredentials(AuthenticationType.PROXY);
+ return WebUtil.createProxy(proxyHost, proxyPortNum, credentials);
+ } catch (NumberFormatException e) {
+ StatusHandler.log(new RepositoryStatus(taskRepository, IStatus.ERROR,
+ ITasksCoreConstants.ID_PLUGIN, 0, "Error occured while configuring proxy. Invalid port \"" //$NON-NLS-1$
+ + proxyPort + "\" specified.", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ return WebUtil.getProxy(host, proxyType);
+ }
+
+ @Override
+ public AuthenticationCredentials getCredentials(AuthenticationType type) {
+ return taskRepository.getCredentials(type);
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java
new file mode 100644
index 0000000..41cc0f4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskRepositoryManager.java
@@ -0,0 +1,413 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jevgeni Holodkov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Provides facilities for managing the life-cycle of and access to task repositories.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Jevgeni Holodkov
+ * @since 3.0
+ */
+public class TaskRepositoryManager implements IRepositoryManager {
+
+ public static final String OLD_REPOSITORIES_FILE = "repositories.xml"; //$NON-NLS-1$
+
+ public static final String DEFAULT_REPOSITORIES_FILE = "repositories.xml.zip"; //$NON-NLS-1$
+
+ public static final String PREF_REPOSITORIES = "org.eclipse.mylyn.tasklist.repositories."; //$NON-NLS-1$
+
+ private final Map<String, AbstractRepositoryConnector> repositoryConnectors = new HashMap<String, AbstractRepositoryConnector>();
+
+ private final Map<String, Set<TaskRepository>> repositoryMap = new HashMap<String, Set<TaskRepository>>();
+
+ private final Set<IRepositoryListener> listeners = new CopyOnWriteArraySet<IRepositoryListener>();
+
+ private final Set<TaskRepository> orphanedRepositories = new HashSet<TaskRepository>();
+
+ public static final String MESSAGE_NO_REPOSITORY = Messages.TaskRepositoryManager_No_repository_available;
+
+ public static final String PREFIX_LOCAL = "local-"; //$NON-NLS-1$
+
+ private final PropertyChangeListener PROPERTY_CHANGE_LISTENER = new PropertyChangeListener() {
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ TaskRepositoryManager.this.notifyRepositorySettingsChanged((TaskRepository) evt.getSource());
+ }
+ };
+
+ private final TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer();
+
+ public TaskRepositoryManager() {
+ }
+
+ public Collection<AbstractRepositoryConnector> getRepositoryConnectors() {
+ return Collections.unmodifiableCollection(repositoryConnectors.values());
+ }
+
+ public AbstractRepositoryConnector getRepositoryConnector(String connectorKind) {
+ return repositoryConnectors.get(connectorKind);
+ }
+
+ /**
+ * primarily for testing
+ */
+ public AbstractRepositoryConnector removeRepositoryConnector(String connectorKind) {
+ return repositoryConnectors.remove(connectorKind);
+ }
+
+ public void addRepositoryConnector(AbstractRepositoryConnector repositoryConnector) {
+ if (!repositoryConnectors.values().contains(repositoryConnector)) {
+ repositoryConnectors.put(repositoryConnector.getConnectorKind(), repositoryConnector);
+ }
+ }
+
+ public boolean hasUserManagedRepositoryConnectors() {
+ for (AbstractRepositoryConnector connector : repositoryConnectors.values()) {
+ if (connector.isUserManaged()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void addRepository(final TaskRepository repository) {
+ Set<TaskRepository> repositories;
+ if (!repositoryMap.containsKey(repository.getConnectorKind())) {
+ repositories = new HashSet<TaskRepository>();
+ repositoryMap.put(repository.getConnectorKind(), repositories);
+ } else {
+ repositories = repositoryMap.get(repository.getConnectorKind());
+ }
+ repositories.add(repository);
+ repository.addChangeListener(PROPERTY_CHANGE_LISTENER);
+ for (final IRepositoryListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ listener.repositoryAdded(repository);
+ }
+ });
+ }
+ }
+
+ public void removeRepository(final TaskRepository repository, String repositoryFilePath) {
+ Set<TaskRepository> repositories = repositoryMap.get(repository.getConnectorKind());
+ if (repositories != null) {
+ repository.flushAuthenticationCredentials();
+ repositories.remove(repository);
+ }
+ repository.removeChangeListener(PROPERTY_CHANGE_LISTENER);
+ saveRepositories(repositoryFilePath);
+ for (final IRepositoryListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ listener.repositoryRemoved(repository);
+ }
+ });
+ }
+ }
+
+ public void addListener(IRepositoryListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(IRepositoryListener listener) {
+ listeners.remove(listener);
+ }
+
+ /* Public for testing. */
+ public static String stripSlashes(String url) {
+ Assert.isNotNull(url);
+ StringBuilder sb = new StringBuilder(url.trim());
+ while (sb.length() > 0 && sb.charAt(sb.length() - 1) == '/') {
+ sb.deleteCharAt(sb.length() - 1);
+ }
+ return sb.toString();
+ }
+
+ public TaskRepository getRepository(String kind, String urlString) {
+ Assert.isNotNull(kind);
+ Assert.isNotNull(urlString);
+ urlString = stripSlashes(urlString);
+ if (repositoryMap.containsKey(kind)) {
+ for (TaskRepository repository : repositoryMap.get(kind)) {
+ if (stripSlashes(repository.getRepositoryUrl()).equals(urlString)) {
+ return repository;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return first repository that matches the given url
+ */
+ public TaskRepository getRepository(String urlString) {
+ Assert.isNotNull(urlString);
+ urlString = stripSlashes(urlString);
+ for (String kind : repositoryMap.keySet()) {
+ for (TaskRepository repository : repositoryMap.get(kind)) {
+ if (stripSlashes(repository.getRepositoryUrl()).equals(urlString)) {
+ return repository;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return the first connector to accept the URL
+ */
+ public AbstractRepositoryConnector getConnectorForRepositoryTaskUrl(String url) {
+ Assert.isNotNull(url);
+ for (AbstractRepositoryConnector connector : getRepositoryConnectors()) {
+ if (connector.getRepositoryUrlFromTaskUrl(url) != null) {
+ for (TaskRepository repository : getRepositories(connector.getConnectorKind())) {
+ if (url.startsWith(repository.getRepositoryUrl())) {
+ return connector;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public Set<TaskRepository> getRepositories(String kind) {
+ Assert.isNotNull(kind);
+ if (repositoryMap.containsKey(kind)) {
+ return repositoryMap.get(kind);
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+ public List<TaskRepository> getAllRepositories() {
+ List<TaskRepository> repositories = new ArrayList<TaskRepository>();
+ for (AbstractRepositoryConnector repositoryConnector : repositoryConnectors.values()) {
+ if (repositoryMap.containsKey(repositoryConnector.getConnectorKind())) {
+ repositories.addAll(repositoryMap.get(repositoryConnector.getConnectorKind()));
+ }
+ }
+ return repositories;
+ }
+
+ /**
+ * TODO: implement default support, this just returns first found
+ */
+ public TaskRepository getDefaultRepository(String kind) {
+ // HACK: returns first repository found
+ if (repositoryMap.containsKey(kind)) {
+ for (TaskRepository repository : repositoryMap.get(kind)) {
+ return repository;
+ }
+ } else {
+ Collection<Set<TaskRepository>> values = repositoryMap.values();
+ if (!values.isEmpty()) {
+ Set<TaskRepository> repoistorySet = values.iterator().next();
+ return repoistorySet.iterator().next();
+ }
+ }
+ return null;
+ }
+
+ Map<String, Set<TaskRepository>> readRepositories(String repositoriesFilePath) {
+
+ repositoryMap.clear();
+ orphanedRepositories.clear();
+
+ loadRepositories(repositoriesFilePath);
+
+// for (IRepositoryListener listener : listeners) {
+// try {
+// listener.repositoriesRead();
+// } catch (Throwable t) {
+// StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+// "Repository listener failed", t));
+// }
+// }
+ return repositoryMap;
+ }
+
+ private void loadRepositories(String repositoriesFilePath) {
+ boolean migration = false;
+ // String dataDirectory =
+ // TasksUiPlugin.getDefault().getDataDirectory();
+ File repositoriesFile = new File(repositoriesFilePath);
+
+ // Will only load repositories for which a connector exists
+ for (AbstractRepositoryConnector repositoryConnector : repositoryConnectors.values()) {
+ repositoryMap.put(repositoryConnector.getConnectorKind(), new HashSet<TaskRepository>());
+ }
+ if (repositoriesFile.exists()) {
+ Set<TaskRepository> repositories = externalizer.readRepositoriesFromXML(repositoriesFile);
+ if (repositories != null && repositories.size() > 0) {
+ for (TaskRepository repository : repositories) {
+ if (removeHttpAuthMigration(repository)) {
+ migration = true;
+ }
+ if (repositoryMap.containsKey(repository.getConnectorKind())) {
+ repositoryMap.get(repository.getConnectorKind()).add(repository);
+ repository.addChangeListener(PROPERTY_CHANGE_LISTENER);
+ } else {
+ orphanedRepositories.add(repository);
+ }
+ }
+ }
+ if (migration) {
+ saveRepositories(repositoriesFilePath);
+ }
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private boolean removeHttpAuthMigration(TaskRepository repository) {
+ String httpusername = repository.getProperty(TaskRepository.AUTH_HTTP_USERNAME);
+ String httppassword = repository.getProperty(TaskRepository.AUTH_HTTP_PASSWORD);
+ if (httpusername != null && httppassword != null) {
+ repository.removeProperty(TaskRepository.AUTH_HTTP_USERNAME);
+ repository.removeProperty(TaskRepository.AUTH_HTTP_PASSWORD);
+ if (httpusername.length() > 0 && httppassword.length() > 0) {
+ repository.setHttpAuthenticationCredentials(httpusername, httppassword);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ protected synchronized boolean saveRepositories(String destinationPath) {
+// if (!Platform.isRunning()) {// || TasksUiPlugin.getDefault() == null) {
+// return false;
+// }
+ Set<TaskRepository> repositoriesToWrite = new HashSet<TaskRepository>(getAllRepositories());
+ // if for some reason a repository is added/changed to equal one in the
+ // orphaned set the orphan is discarded
+ for (TaskRepository repository : orphanedRepositories) {
+ if (!repositoriesToWrite.contains(repository)) {
+ repositoriesToWrite.add(repository);
+ }
+ }
+
+ try {
+ File repositoriesFile = new File(destinationPath);
+ externalizer.writeRepositoriesToXML(repositoriesToWrite, repositoriesFile);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Could not save repositories", t)); //$NON-NLS-1$
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * For testing.
+ */
+ public void clearRepositories(String repositoriesFilePath) {
+ repositoryMap.clear();
+ orphanedRepositories.clear();
+ saveRepositories(repositoriesFilePath);
+ }
+
+ public void notifyRepositorySettingsChanged(final TaskRepository repository) {
+ for (final IRepositoryListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ listener.repositorySettingsChanged(repository);
+ }
+ });
+ }
+ }
+
+ public void insertRepositories(Set<TaskRepository> repositories, String repositoryFilePath) {
+ for (TaskRepository repository : repositories) {
+ if (getRepository(repository.getConnectorKind(), repository.getRepositoryUrl()) == null) {
+ addRepository(repository);
+ }
+ }
+ }
+
+ public boolean isOwnedByUser(ITask task) {
+ if (task instanceof LocalTask) {
+ return true;
+ }
+
+ ITask repositoryTask = task;
+ TaskRepository repository = getRepository(repositoryTask.getConnectorKind(), repositoryTask.getRepositoryUrl());
+ if (repository != null && repositoryTask.getOwner() != null) {
+ return repositoryTask.getOwner().equals(repository.getUserName());
+ }
+
+ return false;
+ }
+
+ /**
+ * @param repository
+ * with new url
+ * @param oldUrl
+ * previous url for this repository
+ */
+ public void notifyRepositoryUrlChanged(final TaskRepository repository, final String oldUrl) {
+ for (final IRepositoryListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), e));
+ }
+
+ public void run() throws Exception {
+ listener.repositoryUrlChanged(repository, oldUrl);
+ }
+ });
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskTask.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskTask.java
new file mode 100644
index 0000000..000f754
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TaskTask.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskTask extends AbstractTask {
+
+ private final String connectorKind;
+
+ public TaskTask(String connectorKind, String repositoryUrl, String taskId) {
+ super(repositoryUrl, taskId, ""); //$NON-NLS-1$
+ this.connectorKind = connectorKind;
+ this.taskKey = taskId;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ @Override
+ public String getTaskKey() {
+ return taskKey;
+ }
+
+ @Override
+ public boolean isLocal() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TransferList.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TransferList.java
new file mode 100644
index 0000000..a144aea
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/TransferList.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Used to externalize queries.
+ *
+ * @author Steffen
+ */
+public class TransferList implements ITransferList {
+
+ private final Set<RepositoryQuery> queries;
+
+ private final List<AbstractTask> tasks;
+
+ private final Set<AbstractTaskCategory> categories;
+
+ public TransferList() {
+ this.queries = new HashSet<RepositoryQuery>();
+ this.tasks = new ArrayList<AbstractTask>();
+ this.categories = new HashSet<AbstractTaskCategory>();
+ }
+
+ public TransferList(Set<AbstractTaskCategory> categories, Set<RepositoryQuery> queries, List<AbstractTask> tasks) {
+ this.tasks = new ArrayList<AbstractTask>(tasks);
+ this.queries = new HashSet<RepositoryQuery>(queries);
+ this.categories = new HashSet<AbstractTaskCategory>(categories);
+ }
+
+ public void addCategory(TaskCategory category) {
+ categories.add(category);
+ }
+
+ public void addQuery(RepositoryQuery query) {
+ queries.add(query);
+ }
+
+ public void addTask(ITask task) {
+ tasks.add((AbstractTask) task);
+ }
+
+ public boolean addTask(ITask task, AbstractTaskContainer parentContainer) {
+ tasks.add((AbstractTask) task);
+ return true;
+ }
+
+ public Collection<AbstractTask> getAllTasks() {
+ return tasks;
+ }
+
+ public Set<AbstractTaskCategory> getCategories() {
+ return categories;
+ }
+
+ public AbstractTaskCategory getContainerForHandle(String handle) {
+ Assert.isNotNull(handle);
+ for (AbstractTaskCategory category : categories) {
+ if (category.getHandleIdentifier().equals(handle)) {
+ return category;
+ }
+ }
+ return null;
+ }
+
+ public Set<RepositoryQuery> getQueries() {
+ return queries;
+ }
+
+ public AbstractTask getTask(String handleIdentifier) {
+ Assert.isNotNull(handleIdentifier);
+ for (AbstractTask task : tasks) {
+ if (task.getHandleIdentifier().equals(handleIdentifier)) {
+ return task;
+ }
+ }
+ return null;
+ }
+
+ public ITask getTask(String repositoryUrl, String taskId) {
+ Assert.isNotNull(repositoryUrl);
+ Assert.isNotNull(taskId);
+ for (AbstractTask task : tasks) {
+ if (task.getRepositoryUrl().equals(repositoryUrl) && task.getTaskId().equals(taskId)) {
+ return task;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java
new file mode 100644
index 0000000..7495124
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UncategorizedTaskContainer.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * Category created for the user to hold uncategorized tasks.
+ *
+ * @author Rob Elves
+ */
+public class UncategorizedTaskContainer extends AbstractTaskCategory {
+
+ public static final String LABEL = Messages.UncategorizedTaskContainer_Uncategorized;
+
+ public static final String HANDLE = LABEL;
+
+ public UncategorizedTaskContainer() {
+ super(HANDLE);
+ }
+
+ @Override
+ public String getPriority() {
+ return PriorityLevel.P1.toString();
+ }
+
+ @Override
+ public String getHandleIdentifier() {
+ return HANDLE;
+ }
+
+ @Override
+ public String getSummary() {
+ return LABEL;
+ }
+
+ @Override
+ public boolean isUserManaged() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnmatchedTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnmatchedTaskContainer.java
new file mode 100644
index 0000000..32c7e5f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnmatchedTaskContainer.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * Holds orphaned or uncategorized tasks for a given repository
+ *
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class UnmatchedTaskContainer extends AutomaticRepositoryTaskContainer {
+
+ private static final String HANDLE = "orphans"; //$NON-NLS-1$
+
+ public UnmatchedTaskContainer(String connectorKind, String repositoryUrl) {
+ super(HANDLE, connectorKind, repositoryUrl);
+ }
+
+ @Override
+ public String getSummary() {
+ return Messages.UnmatchedTaskContainer_Unmatched;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnsubmittedTaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnsubmittedTaskContainer.java
new file mode 100644
index 0000000..624d777
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/UnsubmittedTaskContainer.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class UnsubmittedTaskContainer extends AutomaticRepositoryTaskContainer {
+
+ private static final String HANDLE = "unsubmitted"; //$NON-NLS-1$
+
+ public UnsubmittedTaskContainer(String connectorKind, String repositoryUrl) {
+ super(HANDLE, connectorKind, repositoryUrl);
+ }
+
+ @Override
+ public String getSummary() {
+ return Messages.UnsubmittedTaskContainer_Unsubmitted;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/WeekDateRange.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/WeekDateRange.java
new file mode 100644
index 0000000..7c3b398
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/WeekDateRange.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * @author Rob Elves
+ */
+public class WeekDateRange extends DateRange {
+
+ private static final String DESCRIPTION_WEEK_AFTER_NEXT = Messages.WeekDateRange_Two_Weeks;
+
+ private static final String DESCRIPTION_PREVIOUS_WEEK = Messages.WeekDateRange_Previous_Week;
+
+ private static final String DESCRIPTION_THIS_WEEK = Messages.WeekDateRange_This_Week;
+
+ private static final String DESCRIPTION_NEXT_WEEK = Messages.WeekDateRange_Next_Week;
+
+ private final List<DayDateRange> days = new ArrayList<DayDateRange>();
+
+ public WeekDateRange(Calendar startDate, Calendar endDate) {
+ super(startDate, endDate);
+ }
+
+ public List<DateRange> getRemainingDays() {
+ List<DateRange> remainingDays = new ArrayList<DateRange>();
+ for (DateRange dayDateRange : getDaysOfWeek()) {
+ if (!dayDateRange.isPast()) {
+ remainingDays.add(dayDateRange);
+ }
+ }
+ return remainingDays;
+ }
+
+ public List<DayDateRange> getDaysOfWeek() {
+ if (days.isEmpty()) {
+ for (int x = TaskActivityUtil.getStartDay(); x < (TaskActivityUtil.getStartDay() + 7); x++) {
+ Calendar dayStart = TaskActivityUtil.getCalendar();
+ dayStart.setTime(getStartDate().getTime());
+ TaskActivityUtil.snapStartOfDay(dayStart);
+
+ Calendar dayEnd = TaskActivityUtil.getCalendar();
+ dayEnd.setTime(getStartDate().getTime());
+ TaskActivityUtil.snapEndOfDay(dayEnd);
+
+ if (x > 7) {
+ dayStart.set(Calendar.DAY_OF_WEEK, x % 7);
+ dayEnd.set(Calendar.DAY_OF_WEEK, x % 7);
+ } else {
+ dayStart.set(Calendar.DAY_OF_WEEK, x);
+ dayEnd.set(Calendar.DAY_OF_WEEK, x);
+ }
+
+ days.add(new DayDateRange(dayStart, dayEnd));
+ }
+ }
+ return days;
+ }
+
+ /**
+ * @return today's DayDateRange, null if does not exist (now > endDate)
+ */
+ public DayDateRange getToday() {
+ DayDateRange today = null;
+ Calendar now = TaskActivityUtil.getCalendar();
+ for (DayDateRange range : getDaysOfWeek()) {
+ if (range.includes(now)) {
+ today = range;
+ break;
+ }
+ }
+ if (today == null) {
+ Calendar todayStart = TaskActivityUtil.getCalendar();
+ TaskActivityUtil.snapStartOfDay(todayStart);
+ Calendar todayEnd = TaskActivityUtil.getCalendar();
+ TaskActivityUtil.snapEndOfDay(todayEnd);
+ today = new DayDateRange(todayStart, todayEnd);
+ }
+ return today;
+ }
+
+ public boolean isCurrentWeekDay(DateRange range) {
+ if (range == null) {
+ return false;
+ }
+ return getDaysOfWeek().contains(range);
+ }
+
+ private boolean isNextWeek() {
+ return TaskActivityUtil.getNextWeek().compareTo(this) == 0;
+ }
+
+ public boolean isThisWeek() {
+ //if (isWeek()) {
+ return this.includes(Calendar.getInstance());
+ //}
+ //return false;
+ }
+
+ private boolean isPreviousWeek() {
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.WEEK_OF_YEAR, -1);
+ return this.includes(cal);
+ }
+
+ private boolean isWeekAfterNext() {
+ return TaskActivityUtil.getNextWeek().next().compareTo(this) == 0;
+ }
+
+ public WeekDateRange next() {
+ return create(Calendar.WEEK_OF_YEAR, 1);
+ }
+
+ public WeekDateRange previous() {
+ return create(Calendar.WEEK_OF_YEAR, -1);
+ }
+
+ protected WeekDateRange create(int field, int multiplier) {
+ Calendar previousStart = (Calendar) getStartDate().clone();
+ Calendar previousEnd = (Calendar) getEndDate().clone();
+ previousStart.add(field, 1 * multiplier);
+ previousEnd.add(field, 1 * multiplier);
+ return new WeekDateRange(previousStart, previousEnd);
+ }
+
+ @Override
+ public String toString(boolean useDayOfWeekForNextWeek) {
+ if (isWeekAfterNext()) {
+ return DESCRIPTION_WEEK_AFTER_NEXT;
+ } else if (isThisWeek()) {
+ return DESCRIPTION_THIS_WEEK;
+ } else if (isNextWeek()) {
+ return DESCRIPTION_NEXT_WEEK;
+ } else if (isPreviousWeek()) {
+ return DESCRIPTION_PREVIOUS_WEEK;
+ }
+ return super.toString(useDayOfWeekForNextWeek);
+ }
+
+ public DateRange getDayOfWeek(int dayNum) {
+ if (dayNum > 0 && dayNum <= 7) {
+ for (DateRange day : getDaysOfWeek()) {
+ if (day.getStartDate().get(Calendar.DAY_OF_WEEK) == dayNum) {
+ return day;
+ }
+ }
+ }
+ throw new IllegalArgumentException("Valid day values are 1 - 7"); //$NON-NLS-1$
+ }
+
+ public static boolean isWeekRange(Calendar calStart, Calendar calEnd) {
+ // bug 248683
+ long diff = (calEnd.getTimeInMillis() - calStart.getTimeInMillis()) - (DAY * 7 - 1);
+ return Math.abs(diff) <= 60 * 60 * 1000;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ElementHandler.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ElementHandler.java
new file mode 100644
index 0000000..5d251ad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ElementHandler.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+class ElementHandler extends DefaultHandler {
+
+ protected final StringBuilder currentElementText;
+
+ private ElementHandler currentHandler;
+
+ private final String elementName;
+
+ private final Map<String, ElementHandler> handlers;
+
+ private final ElementHandler parent;
+
+ public ElementHandler(ElementHandler parent, String elementName) {
+ this.parent = parent;
+ this.elementName = elementName;
+ this.handlers = new HashMap<String, ElementHandler>();
+ this.currentElementText = new StringBuilder();
+ }
+
+ public void addElementHandler(ElementHandler handler) {
+ handlers.put(handler.getElementName(), handler);
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ if (currentHandler != null) {
+ currentHandler.characters(ch, start, length);
+ } else {
+ currentElementText.append(ch, start, length);
+ }
+ }
+
+ protected void done(ElementHandler elementHandler) {
+ currentHandler = null;
+ }
+
+ protected void end(String uri, String localName, String name) {
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String name) throws SAXException {
+ if (currentHandler != null) {
+ currentHandler.endElement(uri, localName, name);
+ } else if (elementName.equals(localName)) {
+ end(uri, localName, name);
+ if (parent != null) {
+ parent.done(this);
+ }
+ }
+ }
+
+ protected void clearCurrentElementText() {
+ currentElementText.setLength(0);
+ }
+
+ protected String getCurrentElementText() {
+ return currentElementText.toString();
+ }
+
+ public String getElementName() {
+ return elementName;
+ }
+
+ protected String getOptionalValue(Attributes attributes, String name) throws SAXException {
+ String value = attributes.getValue(name);
+ if (value == null) {
+ return ""; //$NON-NLS-1$
+ }
+ return value;
+ }
+
+ public ElementHandler getParent() {
+ return parent;
+ }
+
+ protected String getValue(Attributes attributes, String name) throws SAXException {
+ String value = attributes.getValue(name);
+ if (value == null) {
+ throw new SAXException("Missing required attribute \"" + name + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return value;
+ }
+
+ public void removeElementHandler(ElementHandler handler) {
+ handlers.remove(handler.getElementName());
+ }
+
+ protected void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ if (currentHandler == null) {
+ ElementHandler handler = handlers.get(name);
+ if (handler != null) {
+ currentHandler = handler;
+ currentHandler.start(uri, localName, name, attributes);
+ }
+ } else if (currentHandler != null) {
+ currentHandler.startElement(uri, localName, name, attributes);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/FileTaskAttachmentSource.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/FileTaskAttachmentSource.java
new file mode 100644
index 0000000..c14c224
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/FileTaskAttachmentSource.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * David Green - fix for 267960
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core.data;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+
+/**
+ * @author Steffen Pingel
+ * @author David Green
+ */
+public class FileTaskAttachmentSource extends AbstractTaskAttachmentSource {
+ /**
+ * mime type for text/plain
+ */
+ private static final String TEXT_PLAIN = "text/plain"; //$NON-NLS-1$
+
+ /**
+ * mime type for application/xml
+ */
+ private static final String APPLICATION_XML = "application/xml"; //$NON-NLS-1$
+
+ public static final String APPLICATION_OCTET_STREAM = "application/octet-stream"; //$NON-NLS-1$
+
+ private static Map<String, String> extensions2Types;
+
+ static {
+ // see http://www.iana.org/assignments/media-types/
+ extensions2Types = new HashMap<String, String>();
+ extensions2Types.put("txt", TEXT_PLAIN); //$NON-NLS-1$
+ extensions2Types.put("html", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$
+ extensions2Types.put("htm", "text/html"); //$NON-NLS-1$ //$NON-NLS-2$
+ extensions2Types.put("xhtml", "application/xhtml+xml"); //$NON-NLS-1$//$NON-NLS-2$
+ extensions2Types.put("jpg", "image/jpeg"); //$NON-NLS-1$ //$NON-NLS-2$
+ extensions2Types.put("jpeg", "image/jpeg"); //$NON-NLS-1$ //$NON-NLS-2$
+ extensions2Types.put("gif", "image/gif"); //$NON-NLS-1$ //$NON-NLS-2$
+ extensions2Types.put("png", "image/png"); //$NON-NLS-1$ //$NON-NLS-2$
+ extensions2Types.put("xml", APPLICATION_XML); //$NON-NLS-1$
+ extensions2Types.put("zip", APPLICATION_OCTET_STREAM); //$NON-NLS-1$
+ extensions2Types.put("tar", APPLICATION_OCTET_STREAM); //$NON-NLS-1$
+ extensions2Types.put("gz", APPLICATION_OCTET_STREAM); //$NON-NLS-1$
+ }
+
+ public static String getContentTypeFromFilename(String fileName) {
+ int index = fileName.lastIndexOf("."); //$NON-NLS-1$
+ if (index > 0 && index < fileName.length()) {
+ String ext = fileName.substring(index + 1);
+ String type = extensions2Types.get(ext.toLowerCase(Locale.ENGLISH));
+ if (type != null) {
+ return type;
+ }
+ // bug 267960 attempt to detect the mime type from the content type
+ IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
+ // platform may not be available when running standalone
+ if (contentTypeManager != null) {
+ IContentType contentType = contentTypeManager.findContentTypeFor(fileName);
+ while (contentType != null) {
+ if (IContentTypeManager.CT_TEXT.equals(contentType.getId())) {
+ return TEXT_PLAIN;
+ } else if ("org.eclipse.core.runtime.xml".equals(contentType.getId())) { //$NON-NLS-1$
+ return APPLICATION_XML;
+ }
+ contentType = contentType.getBaseType();
+ }
+ }
+ }
+
+ // fall back to a safe mime type
+ return APPLICATION_OCTET_STREAM;
+ }
+
+ private String contentType;
+
+ private String description;
+
+ private final File file;
+
+ private String name;
+
+ public FileTaskAttachmentSource(File file) {
+ this.file = file;
+ this.name = file.getName();
+ this.contentType = getContentTypeFromFilename(name);
+ }
+
+ @Override
+ public InputStream createInputStream(IProgressMonitor monitor) throws CoreException {
+ try {
+ return new FileInputStream(file);
+ } catch (FileNotFoundException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, e.getMessage(), e));
+ }
+ }
+
+ @Override
+ public String getContentType() {
+ return contentType;
+ }
+
+ @Override
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public long getLength() {
+ return file.length();
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ITaskDataConstants.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ITaskDataConstants.java
new file mode 100644
index 0000000..114ebf4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ITaskDataConstants.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+public interface ITaskDataConstants {
+
+ static final String ATTRIBUTE_TASK_KIND = "taskKind"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_IS_PATCH = "isPatch"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_IS_OBSOLETE = "isObsolete"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_CREATOR = "creator"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_NUMBER = "number"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_HAS_ATTACHMENT = "hasAttachment"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_ATTACHMENT_ID = "attachmentId"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_KNOB_NAME = "knob_name"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_OPERATION_NAME = "operationName"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_OPTION_NAME = "optionName"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_OPTION_SELECTION = "optionSelection"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_IS_CHECKED = "isChecked"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_INPUT_NAME = "inputName"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_INPUT_VALUE = "inputValue"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_READONLY = "readonly"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_HIDDEN = "hidden"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_PARAMETER = "parameter"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_VALUE = "value"; //$NON-NLS-1$
+
+ static final String ELEMENT_META = "meta"; //$NON-NLS-1$
+
+ static final String ELEMENT_OPTION = "option"; //$NON-NLS-1$
+
+ static final String ELEMENT_VALUE = "value"; //$NON-NLS-1$
+
+ static final String ELEMENT_ATTRIBUTE = "Attribute"; //$NON-NLS-1$
+
+ static final String ELEMENT_NAME = "name"; //$NON-NLS-1$
+
+ static final String ELEMENT_VALUES = "values"; //$NON-NLS-1$
+
+ static final String ELEMENT_OPTIONS = "options"; //$NON-NLS-1$
+
+ static final String ELEMENT_META_DATA = "MetaData"; //$NON-NLS-1$
+
+ static final String ELEMENT_OPERATION = "Operation"; //$NON-NLS-1$
+
+ static final String ELEMENT_COMMENT = "Comment"; //$NON-NLS-1$
+
+ static final String ELEMENT_ATTACHMENT = "Attachment"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_REPOSITORY_KIND = "repositoryKind"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_CONNECTOR_KIND = "connectorKind"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_REPOSITORY_URL = "repositoryUrl"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_KEY = "key"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_NAME = "name"; //$NON-NLS-1$
+
+ static final String ELEMENT_EDITS_DATA = "EditsData"; //$NON-NLS-1$
+
+ static final String ELEMENT_OLD_DATA = "OldData"; //$NON-NLS-1$
+
+ static final String ELEMENT_NEW_DATA = "NewData"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_VERSION = "version"; //$NON-NLS-1$
+
+ static final String ELEMENT_TASK_STATE = "TaskState"; //$NON-NLS-1$
+
+ static final String ELEMENT_KEY = "key"; //$NON-NLS-1$
+
+ static final String ATTRIBUTE_TASK_ID = "taskId"; //$NON-NLS-1$
+
+ static final String ELEMENT_ATTRIBUTES = "Attributes"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ITaskDataManagerListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ITaskDataManagerListener.java
new file mode 100644
index 0000000..b166495
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/ITaskDataManagerListener.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+/**
+ * @author Steffen Pingel
+ */
+public interface ITaskDataManagerListener {
+
+ public abstract void taskDataUpdated(TaskDataManagerEvent event);
+
+ public abstract void editsDiscarded(TaskDataManagerEvent event);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataExternalizer.java
new file mode 100644
index 0000000..4336296
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataExternalizer.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataExternalizer {
+
+ private final IRepositoryManager taskRepositoryManager;
+
+ public TaskDataExternalizer(IRepositoryManager taskRepositoryManager) {
+ this.taskRepositoryManager = taskRepositoryManager;
+ }
+
+ private void migrate(final TaskDataState taskDataState) throws IOException {
+ // for testing
+ if (taskRepositoryManager == null) {
+ return;
+ }
+
+ String connectorKind = taskDataState.getConnectorKind();
+ AbstractRepositoryConnector connector = taskRepositoryManager.getRepositoryConnector(connectorKind);
+ if (connector == null) {
+ throw new IOException("No repository connector for kind \"" + connectorKind + "\" found"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ String repositoryUrl = taskDataState.getRepositoryUrl();
+ final TaskRepository taskRepository = taskRepositoryManager.getRepository(connectorKind, repositoryUrl);
+ if (taskRepository == null) {
+ throw new IOException("Repository \"" + repositoryUrl + "\" not found for kind \"" + connectorKind + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ final AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ if (taskDataHandler != null) {
+ migrate(taskDataState.getLastReadData(), taskRepository, taskDataHandler);
+ migrate(taskDataState.getRepositoryData(), taskRepository, taskDataHandler);
+ migrate(taskDataState.getEditsData(), taskRepository, taskDataHandler);
+ }
+ }
+
+ private void migrate(final TaskData taskData, final TaskRepository taskRepository,
+ final AbstractTaskDataHandler taskDataHandler) {
+ if (taskData != null) {
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ // ignore
+ }
+
+ public void run() throws Exception {
+ taskDataHandler.migrateTaskData(taskRepository, taskData);
+ }
+
+ });
+ }
+ }
+
+ public TaskDataState readState(InputStream in) throws IOException {
+ try {
+ XMLReader parser = XMLReaderFactory.createXMLReader();
+ TaskDataStateReader handler = new TaskDataStateReader(taskRepositoryManager);
+ parser.setContentHandler(handler);
+ parser.parse(new InputSource(in));
+ TaskDataState taskDataState = handler.getTaskDataState();
+ if (taskDataState != null) {
+ migrate(taskDataState);
+ }
+ return taskDataState;
+ } catch (SAXException e) {
+ //e.printStackTrace();
+ throw new IOException("Error parsing task data: " + e.getMessage()); //$NON-NLS-1$
+ }
+ }
+
+ public void writeState(OutputStream out, ITaskDataWorkingCopy state) throws IOException {
+ try {
+ SAXTransformerFactory transformerFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
+ TransformerHandler handler = transformerFactory.newTransformerHandler();
+ Transformer serializer = handler.getTransformer();
+ serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
+ serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+ handler.setResult(new StreamResult(out));
+ TaskDataStateWriter writer = new TaskDataStateWriter(handler);
+ writer.write(state);
+ } catch (TransformerException e) {
+ throw new IOException("Error writing task data" + e.getMessageAndLocation()); //$NON-NLS-1$
+ } catch (SAXException e) {
+ throw new IOException("Error writing task data" + e.getMessage()); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java
new file mode 100644
index 0000000..c54a8de
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManager.java
@@ -0,0 +1,548 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataManager;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * Encapsulates synchronization policy.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskDataManager implements ITaskDataManager {
+
+ private static final String ENCODING_UTF_8 = "UTF-8"; //$NON-NLS-1$
+
+ private static final String EXTENSION = ".zip"; //$NON-NLS-1$
+
+ private static final String FOLDER_TASKS = "tasks"; //$NON-NLS-1$
+
+ private static final String FOLDER_DATA = "offline"; //$NON-NLS-1$
+
+ private static final String FOLDER_TASKS_1_0 = "offline"; //$NON-NLS-1$
+
+ private String dataPath;
+
+ private final IRepositoryManager repositoryManager;
+
+ private final TaskDataStore taskDataStore;
+
+ private final TaskList taskList;
+
+ private final TaskActivityManager taskActivityManager;
+
+ private final List<ITaskDataManagerListener> listeners = new CopyOnWriteArrayList<ITaskDataManagerListener>();
+
+ public TaskDataManager(TaskDataStore taskDataStore, IRepositoryManager repositoryManager, TaskList taskList,
+ TaskActivityManager taskActivityManager) {
+ this.taskDataStore = taskDataStore;
+ this.repositoryManager = repositoryManager;
+ this.taskList = taskList;
+ this.taskActivityManager = taskActivityManager;
+ }
+
+ public void addListener(ITaskDataManagerListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(ITaskDataManagerListener listener) {
+ listeners.remove(listener);
+ }
+
+ public ITaskDataWorkingCopy createWorkingCopy(final ITask task, final TaskData taskData) {
+ Assert.isNotNull(task);
+ final TaskDataState state = new TaskDataState(taskData.getConnectorKind(), taskData.getRepositoryUrl(),
+ taskData.getTaskId());
+ state.setRepositoryData(taskData);
+ state.setLastReadData(taskData);
+ state.init(TaskDataManager.this, task);
+ state.setSaved(false);
+ state.revert();
+ return state;
+ }
+
+ public ITaskDataWorkingCopy getWorkingCopy(final ITask itask) throws CoreException {
+ return getWorkingCopy(itask, true);
+ }
+
+ public ITaskDataWorkingCopy getWorkingCopy(final ITask itask, final boolean markRead) throws CoreException {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ final TaskDataState[] result = new TaskDataState[1];
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ final File file = getMigratedFile(task, kind);
+ final TaskDataState state = taskDataStore.getTaskDataState(file);
+ if (state == null) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Task data at \"" //$NON-NLS-1$
+ + file + "\" not found")); //$NON-NLS-1$
+ }
+ if (task.isMarkReadPending()) {
+ state.setLastReadData(state.getRepositoryData());
+ }
+ state.init(TaskDataManager.this, task);
+ state.revert();
+ if (markRead) {
+ switch (task.getSynchronizationState()) {
+ case INCOMING:
+ case INCOMING_NEW:
+ task.setSynchronizationState(SynchronizationState.SYNCHRONIZED);
+ break;
+ case CONFLICT:
+ task.setSynchronizationState(SynchronizationState.OUTGOING);
+ break;
+ }
+ task.setMarkReadPending(true);
+ }
+ result[0] = state;
+ }
+ });
+ taskList.notifyElementChanged(task);
+ return result[0];
+ }
+
+ public void saveWorkingCopy(final ITask itask, final TaskDataState state) throws CoreException {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ final File file = getFile(task, kind);
+ taskDataStore.putTaskData(ensurePathExists(file), state);
+ switch (task.getSynchronizationState()) {
+ case SYNCHRONIZED:
+ task.setSynchronizationState(SynchronizationState.OUTGOING);
+ }
+ taskList.addTask(task);
+ }
+ });
+ taskList.notifyElementChanged(task);
+ }
+
+ public void putUpdatedTaskData(final ITask itask, final TaskData taskData, final boolean user) throws CoreException {
+ putUpdatedTaskData(itask, taskData, user, null);
+ }
+
+ public void putUpdatedTaskData(final ITask itask, final TaskData taskData, final boolean user, Object token)
+ throws CoreException {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ Assert.isNotNull(taskData);
+ final AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(task.getConnectorKind());
+ final TaskRepository repository = repositoryManager.getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ final boolean taskDataChanged = connector.hasTaskChanged(repository, task, taskData);
+ final TaskDataManagerEvent event = new TaskDataManagerEvent(this, itask, taskData, token);
+ event.setTaskDataChanged(taskDataChanged);
+ final boolean[] synchronizationStateChanged = new boolean[1];
+ if (taskDataChanged || user) {
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ if (!taskData.isPartial()) {
+ File file = getMigratedFile(task, task.getConnectorKind());
+ taskDataStore.putTaskData(ensurePathExists(file), taskData, task.isMarkReadPending(), user);
+ task.setMarkReadPending(false);
+ event.setTaskDataUpdated(true);
+ }
+
+ boolean taskChanged = updateTaskFromTaskData(taskData, task, connector, repository);
+ event.setTaskChanged(taskChanged);
+
+ if (taskDataChanged) {
+ switch (task.getSynchronizationState()) {
+ case OUTGOING:
+ task.setSynchronizationState(SynchronizationState.CONFLICT);
+ break;
+ case SYNCHRONIZED:
+ task.setSynchronizationState(SynchronizationState.INCOMING);
+ break;
+ }
+ }
+ if (task.isSynchronizing()) {
+ task.setSynchronizing(false);
+ synchronizationStateChanged[0] = true;
+ }
+ }
+ });
+ } else {
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ if (task.isSynchronizing()) {
+ task.setSynchronizing(false);
+ synchronizationStateChanged[0] = true;
+ }
+ }
+ });
+ }
+ if (event.getTaskChanged() || event.getTaskDataChanged()) {
+ taskList.notifyElementChanged(task);
+ fireTaskDataUpdated(event);
+ } else {
+ if (synchronizationStateChanged[0]) {
+ taskList.notifySynchronizationStateChanged(task);
+ }
+ if (event.getTaskDataUpdated()) {
+ fireTaskDataUpdated(event);
+ }
+ }
+ }
+
+ private boolean updateTaskFromTaskData(final TaskData taskData, final AbstractTask task,
+ final AbstractRepositoryConnector connector, final TaskRepository repository) {
+ task.setChanged(false);
+ Date oldDueDate = task.getDueDate();
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ // XXX move this to AbstractTask or use model listener to notify task activity
+ // manager of due date changes
+ Date newDueDate = task.getDueDate();
+ if (oldDueDate != null && !oldDueDate.equals(newDueDate) || newDueDate != oldDueDate) {
+ taskActivityManager.setDueDate(task, newDueDate);
+ }
+ return task.isChanged();
+ }
+
+ private File ensurePathExists(File file) {
+ if (!file.getParentFile().exists()) {
+ file.getParentFile().mkdirs();
+ }
+ return file;
+ }
+
+ private File getMigratedFile(ITask task, String kind) throws CoreException {
+ Assert.isNotNull(task);
+ Assert.isNotNull(kind);
+ File file = getFile(task, kind);
+ if (!file.exists()) {
+ File oldFile = getFile10(task, kind);
+ if (oldFile.exists()) {
+ TaskDataState state = taskDataStore.getTaskDataState(oldFile);
+ // save migrated task data right away
+ taskDataStore.putTaskData(ensurePathExists(file), state);
+ }
+ }
+ return file;
+ }
+
+ public void discardEdits(final ITask itask) throws CoreException {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ File dataFile = getFile(task, kind);
+ if (dataFile.exists()) {
+ taskDataStore.discardEdits(dataFile);
+ }
+ switch (task.getSynchronizationState()) {
+ case OUTGOING:
+ task.setSynchronizationState(SynchronizationState.SYNCHRONIZED);
+ break;
+ case CONFLICT:
+ task.setSynchronizationState(SynchronizationState.INCOMING);
+ break;
+ }
+ }
+ });
+ taskList.notifyElementChanged(task);
+ final TaskDataManagerEvent event = new TaskDataManagerEvent(this, itask);
+ fireEditsDiscarded(event);
+ }
+
+ private File findFile(ITask task, String kind) {
+ File file = getFile(task, kind);
+ if (file.exists()) {
+ return file;
+ }
+ return getFile10(task, kind);
+ }
+
+ public String getDataPath() {
+ return dataPath;
+ }
+
+ private File getFile(ITask task, String kind) {
+ return getFile(task.getRepositoryUrl(), task, kind);
+ }
+
+ private File getFile(String repositoryUrl, ITask task, String kind) {
+// String pathName = task.getConnectorKind() + "-"
+// + URLEncoder.encode(task.getRepositoryUrl(), ENCODING_UTF_8);
+// String fileName = kind + "-" + URLEncoder.encode(task.getTaskId(), ENCODING_UTF_8) + EXTENSION;
+ String repositoryPath = task.getConnectorKind() + "-" + encode(repositoryUrl); //$NON-NLS-1$
+ String fileName = encode(task.getTaskId()) + EXTENSION;
+ File path = new File(dataPath + File.separator + FOLDER_TASKS + File.separator + repositoryPath
+ + File.separator + FOLDER_DATA);
+ return new File(path, fileName);
+ }
+
+ private static String encode(String text) {
+ StringBuffer sb = new StringBuffer(text.length());
+ char[] chars = text.toCharArray();
+ for (char c : chars) {
+ if (c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '.') {
+ sb.append(c);
+ } else {
+ sb.append("%" + Integer.toHexString(c).toUpperCase()); //$NON-NLS-1$
+ }
+ }
+ return sb.toString();
+ }
+
+ private File getFile10(ITask task, String kind) {
+ try {
+ String pathName = URLEncoder.encode(task.getRepositoryUrl(), ENCODING_UTF_8);
+ String fileName = task.getTaskId() + EXTENSION;
+ File path = new File(dataPath + File.separator + FOLDER_TASKS_1_0, pathName);
+ return new File(path, fileName);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public TaskData getTaskData(ITask task) throws CoreException {
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ TaskDataState state = taskDataStore.getTaskDataState(findFile(task, kind));
+ if (state == null) {
+ return null;
+ }
+ return state.getRepositoryData();
+ }
+
+ public TaskDataState getTaskDataState(ITask task) throws CoreException {
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ // TODO check that repository task data != null for returned task data state
+ return taskDataStore.getTaskDataState(findFile(task, kind));
+ }
+
+ public TaskData getTaskData(TaskRepository taskRepository, String taskId) throws CoreException {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(taskId);
+ TaskDataState state = taskDataStore.getTaskDataState(findFile(new TaskTask(taskRepository.getConnectorKind(),
+ taskRepository.getRepositoryUrl(), taskId), taskRepository.getConnectorKind()));
+ if (state == null) {
+ return null;
+ }
+ return state.getRepositoryData();
+ }
+
+ public boolean hasTaskData(ITask task) {
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ return findFile(task, kind).exists();
+ }
+
+ public void putSubmittedTaskData(final ITask itask, final TaskData taskData) throws CoreException {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ Assert.isNotNull(taskData);
+ final AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(task.getConnectorKind());
+ final TaskRepository repository = repositoryManager.getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ final TaskDataManagerEvent event = new TaskDataManagerEvent(this, itask, taskData, null);
+ event.setTaskDataChanged(true);
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ if (!taskData.isPartial()) {
+ File file = getMigratedFile(task, task.getConnectorKind());
+ taskDataStore.setTaskData(ensurePathExists(file), taskData);
+ task.setMarkReadPending(false);
+ event.setTaskDataUpdated(true);
+ }
+
+ boolean taskChanged = updateTaskFromTaskData(taskData, task, connector, repository);
+ event.setTaskChanged(taskChanged);
+
+ task.setSynchronizationState(SynchronizationState.SYNCHRONIZED);
+ task.setSynchronizing(false);
+ }
+ });
+ taskList.notifyElementChanged(task);
+ fireTaskDataUpdated(event);
+ }
+
+ public void deleteTaskData(final ITask itask) throws CoreException {
+ Assert.isTrue(itask instanceof AbstractTask);
+ final AbstractTask task = (AbstractTask) itask;
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ File file = getFile(task, task.getConnectorKind());
+ if (file.exists()) {
+ taskDataStore.deleteTaskData(file);
+ task.setSynchronizationState(SynchronizationState.SYNCHRONIZED);
+ }
+ }
+ });
+ taskList.notifyElementChanged(task);
+ }
+
+ public void setDataPath(String dataPath) {
+ this.dataPath = dataPath;
+ }
+
+ /**
+ * @param task
+ * repository task to mark as read or unread
+ * @param read
+ * true to mark as read, false to mark as unread
+ */
+ public void setTaskRead(final ITask itask, final boolean read) {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ try {
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ if (read) {
+ switch (task.getSynchronizationState()) {
+ case INCOMING:
+ case INCOMING_NEW:
+ task.setSynchronizationState(SynchronizationState.SYNCHRONIZED);
+ task.setMarkReadPending(true);
+ break;
+ case CONFLICT:
+ task.setSynchronizationState(SynchronizationState.OUTGOING);
+ task.setMarkReadPending(true);
+ break;
+ }
+ } else {
+ switch (task.getSynchronizationState()) {
+ case SYNCHRONIZED:
+ task.setSynchronizationState(SynchronizationState.INCOMING);
+ task.setMarkReadPending(false);
+ break;
+ }
+ }
+ }
+ });
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Unexpected error while marking task read", e)); //$NON-NLS-1$
+ }
+ taskList.notifyElementChanged(task);
+ }
+
+ void putEdits(final ITask itask, final TaskData editsData) throws CoreException {
+ final AbstractTask task = (AbstractTask) itask;
+ Assert.isNotNull(task);
+ final String kind = task.getConnectorKind();
+ Assert.isNotNull(editsData);
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ taskDataStore.putEdits(getFile(task, kind), editsData);
+ switch (task.getSynchronizationState()) {
+ case INCOMING:
+ case INCOMING_NEW:
+ // TODO throw exception instead?
+ task.setSynchronizationState(SynchronizationState.CONFLICT);
+ break;
+ case SYNCHRONIZED:
+ task.setSynchronizationState(SynchronizationState.OUTGOING);
+ break;
+ }
+ }
+ });
+ taskList.notifySynchronizationStateChanged(task);
+ }
+
+ private void fireTaskDataUpdated(final TaskDataManagerEvent event) {
+ ITaskDataManagerListener[] array = listeners.toArray(new ITaskDataManagerListener[0]);
+ if (array.length > 0) {
+ for (final ITaskDataManagerListener listener : array) {
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ // ignore
+ }
+
+ public void run() throws Exception {
+ listener.taskDataUpdated(event);
+ }
+
+ });
+ }
+ }
+ }
+
+ private void fireEditsDiscarded(final TaskDataManagerEvent event) {
+ ITaskDataManagerListener[] array = listeners.toArray(new ITaskDataManagerListener[0]);
+ if (array.length > 0) {
+ for (final ITaskDataManagerListener listener : array) {
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ // ignore
+ }
+
+ public void run() throws Exception {
+ listener.editsDiscarded(event);
+ }
+
+ });
+ }
+ }
+ }
+
+ public void refactorRepositoryUrl(final ITask itask, final String newStorageRepositoryUrl,
+ final String newRepositoryUrl) throws CoreException {
+ Assert.isTrue(itask instanceof AbstractTask);
+ final AbstractTask task = (AbstractTask) itask;
+ final String kind = task.getConnectorKind();
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ File file = getMigratedFile(task, kind);
+ if (file.exists()) {
+ TaskDataState oldState = taskDataStore.getTaskDataState(file);
+ if (oldState != null) {
+ File newFile = getFile(newStorageRepositoryUrl, task, kind);
+ TaskDataState newState = new TaskDataState(oldState.getConnectorKind(), newRepositoryUrl,
+ oldState.getTaskId());
+ newState.merge(oldState);
+ taskDataStore.putTaskData(ensurePathExists(newFile), newState);
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManagerEvent.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManagerEvent.java
new file mode 100644
index 0000000..1cd4196
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataManagerEvent.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.util.EventObject;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataManager;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataManagerEvent extends EventObject {
+
+ private static final long serialVersionUID = 1L;
+
+ private final ITask task;
+
+ private boolean taskChanged;
+
+ private final TaskData taskData;
+
+ private boolean taskDataChanged;
+
+ private boolean taskDataUpdated;
+
+ private final Object token;
+
+ public TaskDataManagerEvent(ITaskDataManager source, ITask task, TaskData taskData, Object token) {
+ super(source);
+ Assert.isNotNull(task);
+ Assert.isNotNull(taskData);
+ this.task = task;
+ this.taskData = taskData;
+ this.token = token;
+ }
+
+ public TaskDataManagerEvent(ITaskDataManager source, ITask task) {
+ super(source);
+ Assert.isNotNull(task);
+ this.task = task;
+ this.taskData = null;
+ this.token = null;
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public boolean getTaskChanged() {
+ return taskChanged;
+ }
+
+ public TaskData getTaskData() {
+ return taskData;
+ }
+
+ public boolean getTaskDataChanged() {
+ return taskDataChanged;
+ }
+
+ public boolean getTaskDataUpdated() {
+ return taskDataUpdated;
+ }
+
+ public Object getToken() {
+ return token;
+ }
+
+ public void setTaskChanged(boolean taskChanged) {
+ this.taskChanged = taskChanged;
+ }
+
+ public void setTaskDataChanged(boolean taskDataChanged) {
+ this.taskDataChanged = taskDataChanged;
+ }
+
+ public void setTaskDataUpdated(boolean taskDataUpdated) {
+ this.taskDataUpdated = taskDataUpdated;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java
new file mode 100644
index 0000000..016e0f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataState.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskDataState implements ITaskDataWorkingCopy {
+
+ private final String connectorKind;
+
+ private TaskData editsTaskData;
+
+ private TaskData lastReadTaskData;
+
+ private TaskData localTaskData;
+
+ private boolean saved;
+
+ private TaskData repositoryTaskData;
+
+ private final String repositoryUrl;
+
+ private ITask task;
+
+ private final String taskId;
+
+ private TaskDataManager taskDataManager;
+
+ public TaskDataState(String connectorKind, String repositoryUrl, String taskId) {
+ Assert.isNotNull(connectorKind);
+ Assert.isNotNull(repositoryUrl);
+ Assert.isNotNull(taskId);
+ this.connectorKind = connectorKind;
+ this.repositoryUrl = repositoryUrl;
+ this.taskId = taskId;
+ this.saved = true;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TaskDataState other = (TaskDataState) obj;
+ return connectorKind.equals(other.connectorKind) && repositoryUrl.equals(other.repositoryUrl)
+ && taskId.equals(other.taskId);
+ }
+
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ public TaskData getEditsData() {
+ return editsTaskData;
+ }
+
+ public TaskData getLastReadData() {
+ return lastReadTaskData;
+ }
+
+ public TaskData getLocalData() {
+ return localTaskData;
+ }
+
+ public TaskData getRepositoryData() {
+ return repositoryTaskData;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public String getTaskId() {
+ return taskId;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + connectorKind.hashCode();
+ result = prime * result + taskId.hashCode();
+ result = prime * result + repositoryUrl.hashCode();
+ return result;
+ }
+
+ void init(TaskDataManager taskSynchronizationManager, ITask task) {
+ this.taskDataManager = taskSynchronizationManager;
+ this.task = task;
+ }
+
+ public boolean isSaved() {
+ return saved;
+ }
+
+ public void refresh(IProgressMonitor monitor) throws CoreException {
+ ITaskDataWorkingCopy state = taskDataManager.getWorkingCopy(task);
+ setRepositoryData(state.getRepositoryData());
+ setEditsData(state.getEditsData());
+ setLastReadData(state.getLastReadData());
+ revert();
+ }
+
+ public void revert() {
+ localTaskData = new TaskData(repositoryTaskData.getAttributeMapper(), repositoryTaskData.getConnectorKind(),
+ repositoryTaskData.getRepositoryUrl(), repositoryTaskData.getTaskId());
+ localTaskData.setVersion(repositoryTaskData.getVersion());
+ deepCopyChildren(repositoryTaskData.getRoot(), localTaskData.getRoot());
+ if (editsTaskData != null) {
+ deepCopyChildren(editsTaskData.getRoot(), localTaskData.getRoot());
+ } else {
+ editsTaskData = new TaskData(repositoryTaskData.getAttributeMapper(),
+ repositoryTaskData.getConnectorKind(), repositoryTaskData.getRepositoryUrl(),
+ repositoryTaskData.getTaskId());
+ editsTaskData.setVersion(repositoryTaskData.getVersion());
+ }
+ }
+
+ private void deepCopyChildren(TaskAttribute source, TaskAttribute target) {
+ for (TaskAttribute child : source.getAttributes().values()) {
+ target.deepAddCopy(child);
+ }
+ }
+
+ public void save(Set<TaskAttribute> edits, IProgressMonitor monitor) throws CoreException {
+ if (edits != null) {
+ for (TaskAttribute edit : edits) {
+ editsTaskData.getRoot().deepAddCopy(edit);
+ }
+ }
+ if (saved) {
+ taskDataManager.putEdits(task, editsTaskData);
+ } else {
+ taskDataManager.saveWorkingCopy(task, this);
+ setSaved(true);
+ }
+ }
+
+ public void setEditsData(TaskData editsTaskData) {
+ this.editsTaskData = editsTaskData;
+ }
+
+ public void setLastReadData(TaskData oldTaskData) {
+ this.lastReadTaskData = oldTaskData;
+ }
+
+ public void setLocalTaskData(TaskData localTaskData) {
+ this.localTaskData = localTaskData;
+ }
+
+ void setSaved(boolean saved) {
+ this.saved = saved;
+ }
+
+ public void setRepositoryData(TaskData newTaskData) {
+ this.repositoryTaskData = newTaskData;
+ }
+
+ public void merge(TaskDataState oldState) {
+ setEditsData(createCopy(oldState.getEditsData()));
+ setLocalTaskData(createCopy(oldState.getLocalData()));
+ setRepositoryData(createCopy(oldState.getRepositoryData()));
+ }
+
+ private TaskData createCopy(TaskData oldData) {
+ if (oldData == null) {
+ return null;
+ }
+ TaskData newData = new TaskData(oldData.getAttributeMapper(), getConnectorKind(), getRepositoryUrl(),
+ getTaskId());
+ newData.setVersion(oldData.getVersion());
+ for (TaskAttribute child : oldData.getRoot().getAttributes().values()) {
+ newData.getRoot().deepAddCopy(child);
+ }
+ return newData;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStateReader.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStateReader.java
new file mode 100644
index 0000000..6738994
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStateReader.java
@@ -0,0 +1,626 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataStateReader extends DefaultHandler {
+
+ private class AttachmentHandler10 extends ElementHandler {
+
+ private int id;
+
+ private TaskAttribute attribute;
+
+ private final TaskAttribute parentAttribute;
+
+ public AttachmentHandler10(ElementHandler parent, TaskAttribute parentAttribute) {
+ super(parent, ITaskDataConstants.ELEMENT_ATTACHMENT);
+ this.parentAttribute = parentAttribute;
+ }
+
+ @Override
+ protected void end(String uri, String localName, String name) {
+ TaskAttribute child = attribute.getAttribute(TaskAttribute.ATTACHMENT_ID);
+ if (child != null) {
+ attribute.setValue(child.getValue());
+ }
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ // create a unique id for each attachment since the actual id is in a child attribute
+ attribute = createAttribute(parentAttribute, TaskAttribute.PREFIX_ATTACHMENT + ++id);
+ attribute.getMetaData().defaults().setReadOnly(true).setType(TaskAttribute.TYPE_ATTACHMENT);
+ // the actual attachment id is stored in a child node an correctly set in end()
+ attribute.setValue(id + ""); //$NON-NLS-1$
+
+ TaskAttribute child = createAttribute(attribute, TaskAttribute.ATTACHMENT_AUTHOR);
+ child.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_CREATOR));
+ child.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_PERSON);
+
+ child = createAttribute(attribute, TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ child.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_IS_OBSOLETE));
+ child.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_BOOLEAN);
+
+ child = createAttribute(attribute, TaskAttribute.ATTACHMENT_IS_PATCH);
+ child.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_IS_PATCH));
+ child.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_BOOLEAN);
+
+ addElementHandler(new AttributeHandler10(this, attribute) {
+ @Override
+ protected String mapId(String value) {
+ // migrate key for description
+ if (TaskAttribute.DESCRIPTION.equals(value)) {
+ return TaskAttribute.ATTACHMENT_DESCRIPTION;
+ }
+ return super.mapId(value);
+ }
+ });
+ }
+
+ }
+
+ private class AttributeHandler10 extends ElementHandler {
+
+ private TaskAttribute attribute;
+
+ private final TaskAttribute parentAttribute;
+
+ public AttributeHandler10(ElementHandler parent, TaskAttribute parentAttribute) {
+ super(parent, ITaskDataConstants.ELEMENT_ATTRIBUTE);
+ this.parentAttribute = parentAttribute;
+ }
+
+ @Override
+ protected void end(String uri, String localName, String name) {
+ // detect type
+ if (attribute.getOptions().size() > 0) {
+ if (attribute.getValues().size() > 1) {
+ attribute.getMetaData()
+ .putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_MULTI_SELECT);
+ } else {
+ attribute.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE,
+ TaskAttribute.TYPE_SINGLE_SELECT);
+ }
+ }
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ String id = mapId(getValue(attributes, ITaskDataConstants.ATTRIBUTE_ID));
+ String label = getValue(attributes, ITaskDataConstants.ATTRIBUTE_NAME);
+ boolean hidden = Boolean.parseBoolean(getValue(attributes, ITaskDataConstants.ATTRIBUTE_HIDDEN));
+ boolean readOnly = Boolean.parseBoolean(getValue(attributes, ITaskDataConstants.ATTRIBUTE_READONLY));
+ attribute = parentAttribute.createAttribute(id);
+ String kind = (hidden) ? null : TaskAttribute.KIND_DEFAULT;
+ attribute.getMetaData().defaults().setLabel(label).setReadOnly(readOnly).setKind(kind);
+
+ addElementHandler(new OptionHandler10(this, attribute));
+ addElementHandler(new ValueHandler10(this, attribute));
+ addElementHandler(new MetaDataHandler10(this, attribute));
+ }
+
+ protected String mapId(String value) {
+ return value;
+ }
+
+ }
+
+ private class AttributeHandler20 extends ElementHandler {
+
+ private TaskAttribute attribute;
+
+ private final TaskAttribute parentAttribute;
+
+ public AttributeHandler20(ElementHandler parent, TaskAttribute parentAttribute) {
+ super(parent, ITaskDataConstants.ELEMENT_ATTRIBUTE);
+ this.parentAttribute = parentAttribute;
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ String id = getValue(attributes, ITaskDataConstants.ATTRIBUTE_ID);
+ attribute = parentAttribute.createAttribute(id);
+
+ addElementHandler(new ValueHandler20(this, attribute));
+ addElementHandler(new MapHandler20(this, attribute, ITaskDataConstants.ELEMENT_OPTION));
+ addElementHandler(new MapHandler20(this, attribute, ITaskDataConstants.ELEMENT_META));
+ addElementHandler(new AttributeHandler20(this, attribute));
+ }
+
+ }
+
+ private class CommentHandler10 extends ElementHandler {
+
+ private int id;
+
+ private TaskAttribute attribute;
+
+ private final TaskAttribute parentAttribute;
+
+ public CommentHandler10(ElementHandler parent, TaskAttribute parentAttribute) {
+ super(parent, ITaskDataConstants.ELEMENT_COMMENT);
+ this.parentAttribute = parentAttribute;
+ }
+
+ @Override
+ protected void end(String uri, String localName, String name) {
+ TaskAttribute child = attribute.getMappedAttribute(TaskAttribute.COMMENT_TEXT);
+ if (child != null) {
+ child.getMetaData().putValue(TaskAttribute.META_READ_ONLY, Boolean.toString(true));
+ child.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_LONG_RICH_TEXT);
+ }
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ attribute = createAttribute(parentAttribute, TaskAttribute.PREFIX_COMMENT + ++id);
+ attribute.getMetaData().defaults().setReadOnly(true).setType(TaskAttribute.TYPE_COMMENT);
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, TaskAttribute.COMMENT_TEXT);
+ attribute.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_NUMBER));
+
+ TaskAttribute child = createAttribute(attribute, TaskAttribute.COMMENT_ATTACHMENT_ID);
+ child.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_ATTACHMENT_ID));
+
+ child = createAttribute(attribute, TaskAttribute.COMMENT_HAS_ATTACHMENT);
+ child.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_HAS_ATTACHMENT));
+ child.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_BOOLEAN);
+
+ child = createAttribute(attribute, TaskAttribute.COMMENT_NUMBER);
+ child.setValue(getValue(attributes, ITaskDataConstants.ATTRIBUTE_NUMBER));
+ child.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_INTEGER);
+
+ addElementHandler(new AttributeHandler10(this, attribute));
+ }
+
+ }
+
+ private class MetaDataHandler10 extends ElementHandler {
+
+ private final TaskAttribute attribute;
+
+ private String key;
+
+ public MetaDataHandler10(ElementHandler parent, TaskAttribute attribute) {
+ super(parent, ITaskDataConstants.ELEMENT_META);
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void end(String uri, String localName, String name) {
+ attribute.getMetaData().putValue(key, getCurrentElementText());
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ key = getValue(attributes, ITaskDataConstants.ATTRIBUTE_KEY);
+ clearCurrentElementText();
+ }
+
+ }
+
+ private class NameHandler extends ElementHandler {
+
+ private final TaskAttribute attribute;
+
+ private String value;
+
+ public NameHandler(ElementHandler parent, TaskAttribute attribute) {
+ super(parent, ITaskDataConstants.ELEMENT_NAME);
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void end(String uri, String localName, String name) {
+ attribute.putOption(value, getCurrentElementText());
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ value = getValue(attributes, ITaskDataConstants.ATTRIBUTE_VALUE);
+ clearCurrentElementText();
+ }
+
+ }
+
+ private class OperationHandler10 extends ElementHandler {
+
+ private TaskAttribute attribute;
+
+ private final TaskAttribute operationAttribute;
+
+ private final TaskAttribute parentAttribute;
+
+ private int id;
+
+ public OperationHandler10(ElementHandler parent, TaskAttribute parentAttribute) {
+ super(parent, ITaskDataConstants.ELEMENT_OPERATION);
+ this.parentAttribute = parentAttribute;
+ this.operationAttribute = createAttribute(parentAttribute, TaskAttribute.OPERATION);
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ attribute = createAttribute(parentAttribute, TaskAttribute.PREFIX_OPERATION + ++id);
+ attribute.getMetaData().putValue(TaskAttribute.META_ATTRIBUTE_TYPE, TaskAttribute.TYPE_OPERATION);
+ attribute.getMetaData().putValue(TaskAttribute.META_LABEL,
+ getValue(attributes, ITaskDataConstants.ATTRIBUTE_OPERATION_NAME));
+ String operationId = getValue(attributes, ITaskDataConstants.ATTRIBUTE_KNOB_NAME);
+ attribute.setValue(operationId);
+
+ if (Boolean.parseBoolean(getValue(attributes, ITaskDataConstants.ATTRIBUTE_IS_CHECKED))) {
+ operationAttribute.setValue(operationId);
+ }
+
+ String value = getOptionalValue(attributes, ITaskDataConstants.ATTRIBUTE_OPTION_NAME);
+ TaskAttribute child;
+ if (value.length() > 0) {
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, value);
+ child = createAttribute(attribute, value);
+ child.setValue(getOptionalValue(attributes, ITaskDataConstants.ATTRIBUTE_OPTION_SELECTION));
+ child.getMetaData().defaults().setReadOnly(false).setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ addElementHandler(new NameHandler(this, child));
+ } else {
+ value = getOptionalValue(attributes, ITaskDataConstants.ATTRIBUTE_INPUT_NAME);
+ if (value.length() > 0) {
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, value);
+ child = createAttribute(attribute, value);
+ child.setValue(getOptionalValue(attributes, ITaskDataConstants.ATTRIBUTE_INPUT_VALUE));
+ child.getMetaData().defaults().setReadOnly(false).setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ }
+
+ }
+
+ private class OptionHandler10 extends ElementHandler {
+
+ private final TaskAttribute attribute;
+
+ private String parameter;
+
+ public OptionHandler10(ElementHandler parent, TaskAttribute attribute) {
+ super(parent, ITaskDataConstants.ELEMENT_OPTION);
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void end(String uri, String localName, String name) {
+ attribute.putOption(parameter, getCurrentElementText());
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ parameter = getValue(attributes, ITaskDataConstants.ATTRIBUTE_PARAMETER);
+ clearCurrentElementText();
+ }
+
+ }
+
+ private class TaskDataHandler10 extends ElementHandler {
+
+ private TaskData taskData;
+
+ public TaskDataHandler10(TaskStateHandler parent, String elementName) {
+ super(parent, elementName);
+ }
+
+ public TaskData getTaskData() {
+ return taskData;
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ taskData = ((TaskStateHandler) getParent()).createTaskData(attributes);
+ String taskKind = getOptionalValue(attributes, ITaskDataConstants.ATTRIBUTE_TASK_KIND);
+ if (taskKind != null) {
+ createAttribute(taskData.getRoot(), TaskAttribute.TASK_KIND).setValue(taskKind);
+ }
+
+ addElementHandler(new AttributeHandler10(this, taskData.getRoot()));
+ addElementHandler(new CommentHandler10(this, taskData.getRoot()));
+ addElementHandler(new AttachmentHandler10(this, taskData.getRoot()));
+ addElementHandler(new OperationHandler10(this, taskData.getRoot()));
+ // the selected operation was never serialized, no need to read it
+ }
+
+ }
+
+ private class TaskDataHandler20 extends ElementHandler {
+
+ private TaskData taskData;
+
+ public TaskDataHandler20(TaskStateHandler parent, String elementName) {
+ super(parent, elementName);
+ }
+
+ public TaskData getTaskData() {
+ return taskData;
+ }
+
+ @Override
+ public void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ taskData = ((TaskStateHandler) getParent()).createTaskData(attributes);
+
+ // skip the root node
+ ElementHandler handler = new ElementHandler(this, ITaskDataConstants.ELEMENT_ATTRIBUTE);
+ handler.addElementHandler(new AttributeHandler20(handler, taskData.getRoot()));
+ addElementHandler(handler);
+ }
+
+ }
+
+ private class TaskStateHandler extends ElementHandler {
+
+ private TaskAttributeMapper attributeMapper;
+
+ private TaskDataState state;
+
+ private final String version;
+
+ public TaskStateHandler(String version) {
+ super(null, ITaskDataConstants.ELEMENT_TASK_STATE);
+ this.version = version;
+
+ if ("1.0".equals(version)) { //$NON-NLS-1$
+ addElementHandler(new TaskDataHandler10(this, ITaskDataConstants.ELEMENT_NEW_DATA));
+ addElementHandler(new TaskDataHandler10(this, ITaskDataConstants.ELEMENT_OLD_DATA));
+ addElementHandler(new TaskDataHandler10(this, ITaskDataConstants.ELEMENT_EDITS_DATA));
+ } else if ("2.0".equals(version)) { //$NON-NLS-1$
+ addElementHandler(new TaskDataHandler20(this, ITaskDataConstants.ELEMENT_NEW_DATA));
+ addElementHandler(new TaskDataHandler20(this, ITaskDataConstants.ELEMENT_OLD_DATA));
+ addElementHandler(new TaskDataHandler20(this, ITaskDataConstants.ELEMENT_EDITS_DATA));
+ }
+ }
+
+ public TaskData createTaskData(Attributes attributes) throws SAXException {
+ TaskData taskData;
+ if (state == null) {
+ String connectorKind = getValue(attributes, ITaskDataConstants.ATTRIBUTE_REPOSITORY_KIND);
+ String repositoryUrl = getValue(attributes, ITaskDataConstants.ATTRIBUTE_REPOSITORY_URL);
+ String taskId = getValue(attributes, ITaskDataConstants.ATTRIBUTE_ID);
+ attributeMapper = getAttributeMapper(connectorKind, repositoryUrl);
+ taskData = new TaskData(attributeMapper, connectorKind, repositoryUrl, taskId);
+ } else {
+ taskData = new TaskData(attributeMapper, state.getConnectorKind(), state.getRepositoryUrl(),
+ state.getTaskId());
+ }
+ String taskDataVersion = getOptionalValue(attributes, ITaskDataConstants.ATTRIBUTE_VERSION);
+ if (taskDataVersion.length() > 0) {
+ taskData.setVersion(taskDataVersion);
+ }
+ return taskData;
+ }
+
+ @Override
+ public void done(ElementHandler elementHandler) {
+ TaskData taskData;
+ if (elementHandler instanceof TaskDataHandler10) {
+ TaskDataHandler10 taskDataHandler = (TaskDataHandler10) elementHandler;
+ TaskData data = taskDataHandler.getTaskData();
+ if (state == null) {
+ state = new TaskDataState(data.getConnectorKind(), data.getRepositoryUrl(), data.getTaskId());
+ }
+ taskData = taskDataHandler.getTaskData();
+ } else {
+ TaskDataHandler20 taskDataHandler = (TaskDataHandler20) elementHandler;
+ taskData = taskDataHandler.getTaskData();
+ }
+
+ if (ITaskDataConstants.ELEMENT_NEW_DATA.equals(elementHandler.getElementName())) {
+ state.setRepositoryData(taskData);
+ } else if (ITaskDataConstants.ELEMENT_OLD_DATA.equals(elementHandler.getElementName())) {
+ state.setLastReadData(taskData);
+ } else if (ITaskDataConstants.ELEMENT_EDITS_DATA.equals(elementHandler.getElementName())) {
+ state.setEditsData(taskData);
+ }
+ super.done(elementHandler);
+ }
+
+ public TaskDataState getState() {
+ return state;
+ }
+
+ @Override
+ protected void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ if ("2.0".equals(version)) { //$NON-NLS-1$
+ String connectorKind = getValue(attributes, ITaskDataConstants.ATTRIBUTE_CONNECTOR_KIND);
+ String repositoryUrl = getValue(attributes, ITaskDataConstants.ATTRIBUTE_REPOSITORY_URL);
+ String taskId = getValue(attributes, ITaskDataConstants.ATTRIBUTE_TASK_ID);
+ attributeMapper = getAttributeMapper(connectorKind, repositoryUrl);
+ state = new TaskDataState(connectorKind, repositoryUrl, taskId);
+ }
+ }
+ }
+
+ private class ValueHandler10 extends ElementHandler {
+
+ private final TaskAttribute attribute;
+
+ public ValueHandler10(ElementHandler parent, TaskAttribute attribute) {
+ super(parent, ITaskDataConstants.ELEMENT_VALUE);
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void end(String uri, String localName, String name) {
+ attribute.addValue(getCurrentElementText());
+ }
+
+ @Override
+ protected void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ clearCurrentElementText();
+ }
+
+ }
+
+ private class ValueHandler20 extends ElementHandler {
+
+ private final TaskAttribute attribute;
+
+ public ValueHandler20(ElementHandler parent, TaskAttribute attribute) {
+ super(parent, ITaskDataConstants.ELEMENT_VALUE);
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void end(String uri, String localName, String name) {
+ attribute.addValue(getCurrentElementText());
+ }
+
+ @Override
+ protected void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ clearCurrentElementText();
+ }
+
+ }
+
+ private class MapHandler20 extends ElementHandler {
+
+ private final TaskAttribute attribute;
+
+ private String key = ""; //$NON-NLS-1$
+
+ private String value = ""; //$NON-NLS-1$
+
+ public MapHandler20(ElementHandler parent, TaskAttribute attribute, String elementName) {
+ super(parent, elementName);
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void end(String uri, String localName, String name) {
+ if (ITaskDataConstants.ELEMENT_OPTION.equals(getElementName())) {
+ attribute.putOption(key, value);
+ } else if (ITaskDataConstants.ELEMENT_META.equals(getElementName())) {
+ attribute.getMetaData().putValue(key, value);
+ }
+ key = ""; //$NON-NLS-1$
+ value = ""; //$NON-NLS-1$
+ }
+
+ @Override
+ protected void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ addElementHandler(new TextHandler20(this, ITaskDataConstants.ELEMENT_KEY));
+ addElementHandler(new TextHandler20(this, ITaskDataConstants.ELEMENT_VALUE));
+ }
+
+ @Override
+ protected void done(ElementHandler handler) {
+ if (ITaskDataConstants.ELEMENT_KEY.equals(handler.getElementName())) {
+ key = handler.getCurrentElementText();
+ } else if (ITaskDataConstants.ELEMENT_VALUE.equals(handler.getElementName())) {
+ value = handler.getCurrentElementText();
+ }
+ super.done(handler);
+ }
+
+ }
+
+ private class TextHandler20 extends ElementHandler {
+
+ public TextHandler20(ElementHandler parent, String elementName) {
+ super(parent, elementName);
+ }
+
+ @Override
+ protected void start(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ clearCurrentElementText();
+ }
+
+ }
+
+ private TaskStateHandler handler;
+
+ private final IRepositoryManager repositoryManager;
+
+ private TaskDataState result;
+
+ public TaskDataStateReader(IRepositoryManager repositoryManager) {
+ this.repositoryManager = repositoryManager;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ if (handler != null) {
+ handler.characters(ch, start, length);
+ }
+ }
+
+ private TaskAttribute createAttribute(TaskAttribute parent, String id) {
+ TaskAttribute attribute = parent.createAttribute(id);
+ attribute.getMetaData().defaults();
+ return attribute;
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String name) throws SAXException {
+ if (handler != null) {
+ handler.endElement(uri, localName, name);
+ if (ITaskDataConstants.ELEMENT_TASK_STATE.equals(name)) {
+ result = handler.getState();
+ handler = null;
+ }
+ }
+ }
+
+ private TaskAttributeMapper getAttributeMapper(String connectorKind, String repositoryUrl) throws SAXException {
+ AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(connectorKind);
+ if (connector == null) {
+ throw new SAXException("No repository connector for kind \"" + connectorKind + "\" found"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ TaskRepository taskRepository = repositoryManager.getRepository(connectorKind, repositoryUrl);
+ if (taskRepository == null) {
+ throw new SAXException("Repository \"" + repositoryUrl + "\" not found for kind \"" + connectorKind + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ final TaskAttributeMapper attributeMapper;
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ if (taskDataHandler != null) {
+ attributeMapper = taskDataHandler.getAttributeMapper(taskRepository);
+ } else {
+ attributeMapper = new TaskAttributeMapper(taskRepository);
+ }
+ return attributeMapper;
+ }
+
+ public TaskDataState getTaskDataState() {
+ return result;
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ if (handler != null) {
+ handler.startElement(uri, localName, name, attributes);
+ }
+ if (ITaskDataConstants.ELEMENT_TASK_STATE.equals(name)) {
+ String version = attributes.getValue(ITaskDataConstants.ATTRIBUTE_VERSION);
+ handler = new TaskStateHandler(version);
+ handler.start(uri, localName, name, attributes);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStateWriter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStateWriter.java
new file mode 100644
index 0000000..0139ac4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStateWriter.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.sax.TransformerHandler;
+
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataStateWriter {
+
+ private static final String TASK_DATA_STATE_VERSION = "2.0"; //$NON-NLS-1$
+
+ private static final String CDATA = "CDATA"; //$NON-NLS-1$
+
+ private final TransformerHandler handler;
+
+ public TaskDataStateWriter(TransformerHandler handler) {
+ this.handler = handler;
+ }
+
+ public void write(ITaskDataWorkingCopy state) throws SAXException {
+ handler.startDocument();
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_CONNECTOR_KIND, CDATA, state.getConnectorKind()); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_REPOSITORY_URL, CDATA, state.getRepositoryUrl()); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_TASK_ID, CDATA, state.getTaskId()); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_VERSION, CDATA, TASK_DATA_STATE_VERSION); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_TASK_STATE, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ if (state.getRepositoryData() != null) {
+ writeTaskData(state.getRepositoryData(), ITaskDataConstants.ELEMENT_NEW_DATA);
+ }
+ if (state.getLastReadData() != null) {
+ writeTaskData(state.getLastReadData(), ITaskDataConstants.ELEMENT_OLD_DATA);
+ }
+ if (state.getEditsData() != null) {
+ writeTaskData(state.getEditsData(), ITaskDataConstants.ELEMENT_EDITS_DATA);
+ }
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_TASK_STATE); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.endDocument();
+ }
+
+ private void writeTaskData(TaskData taskData, String elementName) throws SAXException {
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_CONNECTOR_KIND, CDATA, taskData.getConnectorKind()); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_REPOSITORY_URL, CDATA, taskData.getRepositoryUrl()); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_TASK_ID, CDATA, taskData.getTaskId()); //$NON-NLS-1$ //$NON-NLS-2$
+ if (taskData.getVersion() != null) {
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_VERSION, CDATA, taskData.getVersion()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ handler.startElement("", "", elementName, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.clear();
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_ATTRIBUTES, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ writeTaskAttribute(taskData.getRoot());
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_ATTRIBUTES); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.endElement("", "", elementName); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void writeTaskAttribute(TaskAttribute attribute) throws SAXException {
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("", "", ITaskDataConstants.ATTRIBUTE_ID, CDATA, attribute.getId()); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_ATTRIBUTE, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ atts.clear();
+
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_VALUES, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ List<String> values = attribute.getValues();
+ for (String value : values) {
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_VALUE, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.characters(value.toCharArray(), 0, value.length());
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_VALUE); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_VALUES); //$NON-NLS-1$ //$NON-NLS-2$
+
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_OPTIONS, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ writeMap(atts, attribute.getOptions(), ITaskDataConstants.ELEMENT_OPTION);
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_OPTIONS); //$NON-NLS-1$ //$NON-NLS-2$
+
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_META_DATA, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ writeMap(atts, attribute.getMetaData().getValues(), ITaskDataConstants.ELEMENT_META);
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_META_DATA); //$NON-NLS-1$ //$NON-NLS-2$
+
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_ATTRIBUTES, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ Map<String, TaskAttribute> children = attribute.getAttributes();
+ for (TaskAttribute child : children.values()) {
+ writeTaskAttribute(child);
+ }
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_ATTRIBUTES); //$NON-NLS-1$ //$NON-NLS-2$
+
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_ATTRIBUTE); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void writeMap(AttributesImpl atts, Map<String, String> options, String elementName) throws SAXException {
+ for (String key : options.keySet()) {
+ String value = options.get(key);
+ handler.startElement("", "", elementName, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_KEY, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.characters(key.toCharArray(), 0, key.length());
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_KEY); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_VALUE, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.characters(value.toCharArray(), 0, value.length());
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_VALUE); //$NON-NLS-1$ //$NON-NLS-2$
+ handler.endElement("", "", elementName); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStore.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStore.java
new file mode 100644
index 0000000..9dd1e69
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TaskDataStore.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataStore {
+
+ private static final String FILE_NAME_INTERNAL = "data.xml"; //$NON-NLS-1$
+
+ private final TaskDataExternalizer externalizer;
+
+ public TaskDataStore(IRepositoryManager taskRepositoryManager) {
+ this.externalizer = new TaskDataExternalizer(taskRepositoryManager);
+ }
+
+ public synchronized TaskDataState discardEdits(File file) throws CoreException {
+ TaskDataState state = readState(file);
+ if (state != null) {
+ state.setEditsData(null);
+ }
+ writeState(file, state);
+ return state;
+ }
+
+ public synchronized TaskDataState getTaskDataState(File file) throws CoreException {
+ return readState(file);
+ }
+
+ public synchronized void putEdits(File file, TaskData data) throws CoreException {
+ Assert.isNotNull(file);
+ Assert.isNotNull(data);
+ TaskDataState state = readState(file);
+ if (state == null) {
+ state = new TaskDataState(data.getConnectorKind(), data.getRepositoryUrl(), data.getTaskId());
+ }
+ state.setEditsData(data);
+ writeState(file, state);
+ }
+
+ public synchronized void putTaskData(File file, TaskData data, boolean setLastRead, boolean user)
+ throws CoreException {
+ Assert.isNotNull(file);
+ Assert.isNotNull(data);
+ TaskDataState state = null;
+ try {
+ state = readState(file);
+ } catch (CoreException e) {
+ if (!user) {
+ throw new CoreException(
+ new Status(
+ IStatus.ERROR,
+ ITasksCoreConstants.ID_PLUGIN,
+ "Reading of existing task data failed. Forcing synchronization will override outgoing changes.", //$NON-NLS-1$
+ e));
+ }
+ }
+ if (state == null) {
+ state = new TaskDataState(data.getConnectorKind(), data.getRepositoryUrl(), data.getTaskId());
+ }
+ if (setLastRead) {
+ state.setLastReadData(state.getRepositoryData());
+ }
+ state.setRepositoryData(data);
+ writeState(file, state);
+ }
+
+ public synchronized void setTaskData(File file, TaskData data) throws CoreException {
+ Assert.isNotNull(file);
+ Assert.isNotNull(data);
+
+ // TODO consider reading old task data and compare submitted results to check if all outgoing changes were accepted by repository
+
+ TaskDataState state = new TaskDataState(data.getConnectorKind(), data.getRepositoryUrl(), data.getTaskId());
+ state.setRepositoryData(data);
+ state.setEditsData(null);
+ state.setLastReadData(data);
+ writeState(file, state);
+ }
+
+ private TaskDataState readState(File file) throws CoreException {
+ try {
+ if (file.exists()) {
+ ZipInputStream in = new ZipInputStream(new BufferedInputStream(new FileInputStream(file)));
+ try {
+ in.getNextEntry();
+ return externalizer.readState(in);
+ } finally {
+ in.close();
+ }
+ }
+ return null;
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error reading task data", //$NON-NLS-1$
+ e));
+ }
+ }
+
+ private void writeState(File file, TaskDataState state) throws CoreException {
+ try {
+ ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
+ try {
+ out.setMethod(ZipOutputStream.DEFLATED);
+
+ ZipEntry entry = new ZipEntry(FILE_NAME_INTERNAL);
+ out.putNextEntry(entry);
+
+ externalizer.writeState(out, state);
+ } finally {
+ out.close();
+ }
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error writing task data", //$NON-NLS-1$
+ e));
+ }
+ }
+
+// public synchronized void putLastRead(File file, TaskData data) throws CoreException {
+// Assert.isNotNull(file);
+// Assert.isNotNull(data);
+//
+// TaskDataState state = readState(file);
+// if (state == null) {
+// state = new TaskDataState(data.getConnectorKind(), data.getRepositoryUrl(), data.getTaskId());
+// }
+// state.setLastReadData(data);
+// writeState(file, state);
+// }
+
+ public synchronized void putTaskData(File file, TaskDataState state) throws CoreException {
+ writeState(file, state);
+ }
+
+ public synchronized boolean deleteTaskData(File file) {
+ return file.delete();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TextTaskAttachmentSource.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TextTaskAttachmentSource.java
new file mode 100644
index 0000000..7f1602c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/TextTaskAttachmentSource.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+
+public class TextTaskAttachmentSource extends AbstractTaskAttachmentSource {
+
+ private final String contents;
+
+ public TextTaskAttachmentSource(String contents) {
+ this.contents = contents;
+ }
+
+ @Override
+ public InputStream createInputStream(IProgressMonitor monitor) throws CoreException {
+ return new ByteArrayInputStream(contents.getBytes());
+ }
+
+ @Override
+ public String getContentType() {
+ return "text/plain"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getDescription() {
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public long getLength() {
+ return contents.getBytes().length;
+ }
+
+ @Override
+ public String getName() {
+ return "clipboard.txt"; //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java
new file mode 100644
index 0000000..f43006d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/AbstractExternalizationParticipant.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.externalization;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+
+/**
+ * File based externalization participant
+ *
+ * @author Rob Elves
+ */
+public abstract class AbstractExternalizationParticipant implements IExternalizationParticipant {
+
+ public static final String SNAPSHOT_PREFIX = "."; //$NON-NLS-1$
+
+ public abstract void load(File sourceFile, IProgressMonitor monitor) throws CoreException;
+
+ public abstract void save(File targetFile, IProgressMonitor monitor) throws CoreException;
+
+ public abstract String getDescription();
+
+ public abstract ISchedulingRule getSchedulingRule();
+
+ public abstract boolean isDirty();
+
+ public abstract String getFileName();
+
+ public AbstractExternalizationParticipant() {
+ super();
+ }
+
+ protected boolean takeSnapshot(File file) {
+ if (file.length() > 0) {
+ File originalFile = file.getAbsoluteFile();
+ File backup = new File(file.getParentFile(), SNAPSHOT_PREFIX + file.getName());
+ backup.delete();
+ return originalFile.renameTo(backup);
+ }
+ return false;
+ }
+
+ public void execute(IExternalizationContext context, IProgressMonitor monitor) throws CoreException {
+ Assert.isNotNull(context);
+ monitor = Policy.monitorFor(monitor);
+ final File dataFile = getFile(context.getRootPath());
+ switch (context.getKind()) {
+ case SAVE:
+ if (dataFile != null) {
+ takeSnapshot(dataFile);
+ }
+ save(dataFile, monitor);
+ break;
+ case LOAD:
+ performLoad(dataFile, monitor);
+ break;
+ case SNAPSHOT:
+ break;
+ }
+
+ }
+
+ protected boolean performLoad(final File dataFile, IProgressMonitor monitor) throws CoreException {
+ try {
+ load(dataFile, monitor);
+ return true;
+ } catch (CoreException e) {
+ if (dataFile != null) {
+ File backup = new File(dataFile.getParentFile(), SNAPSHOT_PREFIX + dataFile.getName());
+ if (backup.exists()) {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Failed to load " //$NON-NLS-1$
+ + dataFile.getName() + ", restoring from snapshot", e)); //$NON-NLS-1$
+ load(backup, monitor);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public File getFile(String rootPath) throws CoreException {
+ String fileName = getFileName();
+ if (fileName != null) {
+ String filePath = rootPath + File.separator + getFileName();
+ return new File(filePath);
+ }
+
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java
new file mode 100644
index 0000000..2ca1125
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/DelegatingTaskExternalizer.java
@@ -0,0 +1,805 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - XML serialization support
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core.externalization;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.DayDateRange;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.ITransferList;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskExternalizationException;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
+import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
+import org.eclipse.mylyn.tasks.core.IAttributeContainer;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * Subclass externalizers must override the get*TagName() methods for the types of externalized items they support to
+ * ensure that their externalizer does not externalize tasks from other connectors incorrectly.
+ *
+ * These tag names uniquely identify the externalizer to be used to read the task from externalized form on disk.
+ *
+ * The canCreateElementFor methods specify which tasks the externalizer should write to disk.
+ *
+ * The TaskList is read on startup, so externalizers extending this should not perform any slow (i.e., network)
+ * operations when overriding methods.
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public final class DelegatingTaskExternalizer {
+
+ static final String DEFAULT_PRIORITY = PriorityLevel.P3.toString();
+
+ static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.S z"; //$NON-NLS-1$
+
+ static final String KEY_NOTIFIED_INCOMING = "NotifiedIncoming"; //$NON-NLS-1$
+
+ public static final String KEY_NAME = "Name"; //$NON-NLS-1$
+
+ public static final String KEY_LABEL = "Label"; //$NON-NLS-1$
+
+ public static final String KEY_QUERY = "Query"; //$NON-NLS-1$
+
+ public static final String KEY_QUERY_STRING = "QueryString"; //$NON-NLS-1$
+
+ static final String KEY_HANDLE = "Handle"; //$NON-NLS-1$
+
+ public static final String KEY_REPOSITORY_URL = "RepositoryUrl"; //$NON-NLS-1$
+
+ public static final String KEY_CATEGORY = "Category"; //$NON-NLS-1$
+
+ static final String VAL_ROOT = "Root"; //$NON-NLS-1$
+
+ static final String KEY_SUBTASK = "SubTask"; //$NON-NLS-1$
+
+ static final String KEY_KIND = "Kind"; //$NON-NLS-1$
+
+ static final String KEY_TASK_CATEGORY = "Task" + KEY_CATEGORY; //$NON-NLS-1$
+
+ static final String KEY_LINK = "Link"; //$NON-NLS-1$
+
+ static final String KEY_PLAN = "Plan"; //$NON-NLS-1$
+
+ static final String KEY_TIME_ESTIMATED = "Estimated"; //$NON-NLS-1$
+
+ static final String KEY_ISSUEURL = "IssueURL"; //$NON-NLS-1$
+
+ static final String KEY_NOTES = "Notes"; //$NON-NLS-1$
+
+ static final String KEY_ACTIVE = "Active"; //$NON-NLS-1$
+
+ static final String KEY_PRIORITY = "Priority"; //$NON-NLS-1$
+
+ static final String KEY_PATH = "Path"; //$NON-NLS-1$
+
+ static final String VAL_FALSE = "false"; //$NON-NLS-1$
+
+ static final String VAL_TRUE = "true"; //$NON-NLS-1$
+
+ static final String KEY_DATE_END = "EndDate"; //$NON-NLS-1$
+
+ static final String KEY_QUERY_HIT = "QueryHit"; //$NON-NLS-1$
+
+ static final String KEY_TASK_REFERENCE = "TaskReference"; //$NON-NLS-1$
+
+ static final String KEY_DATE_CREATION = "CreationDate"; //$NON-NLS-1$
+
+ static final String KEY_DATE_REMINDER = "ReminderDate"; //$NON-NLS-1$
+
+ static final String KEY_DATE_SCHEDULED_START = "ScheduledStartDate"; //$NON-NLS-1$
+
+ static final String KEY_DATE_SCHEDULED_END = "ScheduledEndDate"; //$NON-NLS-1$
+
+ static final String KEY_DATE_MODIFICATION = "ModificationDate"; //$NON-NLS-1$
+
+ static final String KEY_DATE_DUE = "DueDate"; //$NON-NLS-1$
+
+ static final String KEY_REMINDED = "Reminded"; //$NON-NLS-1$
+
+ static final String KEY_FLOATING = "Floating"; //$NON-NLS-1$
+
+ /**
+ * This element holds the date stamp recorded upon last transition to a synchronized state.
+ */
+ static final String KEY_LAST_MOD_DATE = "LastModified"; //$NON-NLS-1$
+
+ static final String KEY_DIRTY = "Dirty"; //$NON-NLS-1$
+
+ static final String KEY_SYNC_STATE = "offlineSyncState"; //$NON-NLS-1$
+
+ static final String KEY_OWNER = "Owner"; //$NON-NLS-1$
+
+ static final String KEY_MARK_READ_PENDING = "MarkReadPending"; //$NON-NLS-1$
+
+ static final String KEY_STALE = "Stale"; //$NON-NLS-1$
+
+ static final String KEY_CONNECTOR_KIND = "ConnectorKind"; //$NON-NLS-1$
+
+ static final String KEY_TASK_ID = "TaskId"; //$NON-NLS-1$
+
+ public static final String KEY_LAST_REFRESH = "LastRefreshTimeStamp"; //$NON-NLS-1$
+
+ static final String NODE_ATTRIBUTE = "Attribute"; //$NON-NLS-1$
+
+ static final String NODE_QUERY = "Query"; //$NON-NLS-1$
+
+ static final String NODE_TASK = "Task"; //$NON-NLS-1$
+
+ static final String KEY_KEY = "Key"; //$NON-NLS-1$
+
+ // 2.0 -> 3.0 migration holds tasks to category handles
+ private final Map<AbstractTask, String> parentCategoryMap;
+
+ private final RepositoryModel repositoryModel;
+
+ private List<AbstractTaskListMigrator> migrators;
+
+ private boolean taskActivated;
+
+ private final IRepositoryManager repositoryManager;
+
+ private final List<IStatus> errors;
+
+ public DelegatingTaskExternalizer(RepositoryModel repositoryModel, IRepositoryManager repositoryManager) {
+ Assert.isNotNull(repositoryModel);
+ Assert.isNotNull(repositoryManager);
+ this.repositoryModel = repositoryModel;
+ this.repositoryManager = repositoryManager;
+ this.parentCategoryMap = new HashMap<AbstractTask, String>();
+ this.errors = new ArrayList<IStatus>();
+ this.migrators = Collections.emptyList();
+ }
+
+ public void initialize(List<AbstractTaskListMigrator> migrators) {
+ Assert.isNotNull(migrators);
+ this.migrators = migrators;
+ }
+
+ public Element createCategoryElement(AbstractTaskCategory category, Document doc, Element parent) {
+ Element node = doc.createElement(getCategoryTagName());
+ node.setAttribute(DelegatingTaskExternalizer.KEY_HANDLE, category.getHandleIdentifier());
+ node.setAttribute(DelegatingTaskExternalizer.KEY_NAME, category.getSummary());
+ parent.appendChild(node);
+ for (ITask task : category.getChildren()) {
+ createTaskReference(KEY_TASK_REFERENCE, task, doc, node);
+ }
+ return node;
+ }
+
+ @SuppressWarnings("deprecation")
+ public Element createTaskElement(final AbstractTask task, Document doc, Element parent) {
+ final Element node;
+ if (task.getClass() == TaskTask.class || task instanceof LocalTask) {
+ node = doc.createElement(NODE_TASK);
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "No externalizer for task: " + task)); //$NON-NLS-1$
+ return null;
+ }
+
+ node.setAttribute(KEY_CONNECTOR_KIND, task.getConnectorKind());
+ node.setAttribute(KEY_REPOSITORY_URL, task.getRepositoryUrl());
+ node.setAttribute(KEY_TASK_ID, task.getTaskId());
+ if (task.getTaskKey() != null) {
+ node.setAttribute(KEY_KEY, task.getTaskKey());
+ }
+ node.setAttribute(KEY_HANDLE, task.getHandleIdentifier());
+ node.setAttribute(KEY_LABEL, stripControlCharacters(task.getSummary()));
+
+ node.setAttribute(KEY_PRIORITY, task.getPriority());
+ node.setAttribute(KEY_KIND, task.getTaskKind());
+
+ if (task.isActive()) {
+ node.setAttribute(KEY_ACTIVE, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_ACTIVE, VAL_FALSE);
+ }
+
+ if (task.getUrl() != null) {
+ node.setAttribute(KEY_ISSUEURL, task.getUrl());
+ }
+ node.setAttribute(KEY_NOTES, stripControlCharacters(task.getNotes()));
+ node.setAttribute(KEY_TIME_ESTIMATED, "" + task.getEstimatedTimeHours()); //$NON-NLS-1$
+ node.setAttribute(KEY_DATE_END, formatExternDate(task.getCompletionDate()));
+ node.setAttribute(KEY_DATE_CREATION, formatExternDate(task.getCreationDate()));
+ node.setAttribute(KEY_DATE_MODIFICATION, formatExternDate(task.getModificationDate()));
+ node.setAttribute(KEY_DATE_DUE, formatExternDate(task.getDueDate()));
+ if (task.getScheduledForDate() != null) {
+ node.setAttribute(KEY_DATE_SCHEDULED_START, formatExternCalendar(task.getScheduledForDate().getStartDate()));
+ node.setAttribute(KEY_DATE_SCHEDULED_END, formatExternCalendar(task.getScheduledForDate().getEndDate()));
+ }
+ if (task.isReminded()) {
+ node.setAttribute(KEY_REMINDED, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_REMINDED, VAL_FALSE);
+ }
+ if (task.isStale()) {
+ node.setAttribute(KEY_STALE, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_STALE, VAL_FALSE);
+ }
+ if (task.isMarkReadPending()) {
+ node.setAttribute(KEY_MARK_READ_PENDING, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_MARK_READ_PENDING, VAL_FALSE);
+ }
+ if (task.getLastReadTimeStamp() != null) {
+ node.setAttribute(KEY_LAST_MOD_DATE, task.getLastReadTimeStamp());
+ }
+ if (task.isNotified()) {
+ node.setAttribute(KEY_NOTIFIED_INCOMING, VAL_TRUE);
+ } else {
+ node.setAttribute(KEY_NOTIFIED_INCOMING, VAL_FALSE);
+ }
+ if (task.getSynchronizationState() != null) {
+ node.setAttribute(KEY_SYNC_STATE, task.getSynchronizationState().name());
+ } else {
+ node.setAttribute(KEY_SYNC_STATE, SynchronizationState.SYNCHRONIZED.name());
+ }
+ if (task.getOwner() != null) {
+ node.setAttribute(KEY_OWNER, task.getOwner());
+ }
+ createAttributes(task, doc, node);
+ for (ITask t : task.getChildren()) {
+ createTaskReference(KEY_SUBTASK, t, doc, node);
+ }
+
+ parent.appendChild(node);
+ return node;
+ }
+
+ private void createAttributes(IAttributeContainer container, Document doc, Element parent) {
+ Map<String, String> attributes = container.getAttributes();
+ for (Map.Entry<String, String> entry : attributes.entrySet()) {
+ Element node = doc.createElement(NODE_ATTRIBUTE);
+ node.setAttribute(KEY_KEY, entry.getKey());
+ node.setTextContent(entry.getValue());
+ parent.appendChild(node);
+ }
+
+ }
+
+ /**
+ * creates nested task reference nodes named nodeName which include a handle to the task
+ *
+ * @return
+ */
+ public Element createTaskReference(String nodeName, ITask task, Document doc, Element parent) {
+ Element node = doc.createElement(nodeName);
+ node.setAttribute(KEY_HANDLE, task.getHandleIdentifier());
+ parent.appendChild(node);
+ return node;
+ }
+
+ /**
+ * create tasks from the nodes provided and places them within the given container
+ */
+ public void readTaskReferences(AbstractTaskContainer task, NodeList nodes, ITransferList tasklist) {
+ for (int j = 0; j < nodes.getLength(); j++) {
+ Node child = nodes.item(j);
+ Element element = (Element) child;
+ if (element.hasAttribute(KEY_HANDLE)) {
+ String handle = element.getAttribute(KEY_HANDLE);
+ AbstractTask subTask = tasklist.getTask(handle);
+ if (subTask != null) {
+ tasklist.addTask(subTask, task);
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Failed to add subtask with handle \"" + handle + "\" to \"" + task + "\"")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings( { "restriction" })
+ private String stripControlCharacters(String text) {
+ if (text == null) {
+ return ""; //$NON-NLS-1$
+ }
+ return org.eclipse.mylyn.internal.commons.core.XmlStringConverter.cleanXmlString(text);
+ }
+
+ private String formatExternDate(Date date) {
+ if (date == null) {
+ return ""; //$NON-NLS-1$
+ }
+ String f = DATE_FORMAT;
+ SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH);
+ return format.format(date);
+ }
+
+ private String formatExternCalendar(Calendar date) {
+ if (date == null) {
+ return ""; //$NON-NLS-1$
+ }
+ String f = DATE_FORMAT;
+ SimpleDateFormat format = new SimpleDateFormat(f, Locale.ENGLISH);
+ return format.format(date.getTime());
+ }
+
+ public void readCategory(Node node, ITransferList taskList) {
+ Element element = (Element) node;
+ AbstractTaskCategory category = null;
+ if (element.hasAttribute(KEY_NAME)) {
+ String name = element.getAttribute(KEY_NAME);
+ String handle = name;
+ if (element.hasAttribute(KEY_HANDLE)) {
+ handle = element.getAttribute(KEY_HANDLE);
+ }
+ category = taskList.getContainerForHandle(handle);
+ if (category == null) {
+ category = new TaskCategory(handle, name);
+ taskList.addCategory((TaskCategory) category);
+ } else if (!UncategorizedTaskContainer.HANDLE.equals(handle)) {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Category with handle \"" + name //$NON-NLS-1$
+ + "\" already exists in task list")); //$NON-NLS-1$
+ }
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Category is missing name attribute")); //$NON-NLS-1$
+ // LEGACY: registry categories did not have names
+ // category = taskList.getArchiveContainer();
+ // a null category will now go into appropriate orphaned category
+ }
+
+ NodeList list = node.getChildNodes();
+ readTaskReferences(category, list, taskList);
+ }
+
+ @SuppressWarnings("deprecation")
+ public final AbstractTask readTask(Node node, AbstractTaskCategory legacyCategory, ITask parent)
+ throws CoreException {
+ String handle;
+ String taskId;
+ String repositoryUrl;
+ String summary = ""; //$NON-NLS-1$
+ final Element element = (Element) node;
+ if (element.hasAttribute(KEY_REPOSITORY_URL) && element.hasAttribute(KEY_TASK_ID)
+ && element.hasAttribute(KEY_HANDLE)) {
+ handle = element.getAttribute(KEY_HANDLE);
+ repositoryUrl = element.getAttribute(KEY_REPOSITORY_URL);
+ taskId = element.getAttribute(KEY_TASK_ID);
+ } else if (element.hasAttribute(KEY_HANDLE)) {
+ handle = element.getAttribute(KEY_HANDLE);
+ repositoryUrl = RepositoryTaskHandleUtil.getRepositoryUrl(handle);
+ taskId = RepositoryTaskHandleUtil.getTaskId(handle);
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Task is missing handle attribute")); //$NON-NLS-1$
+ return null;
+ }
+ if (element.hasAttribute(KEY_LABEL)) {
+ summary = element.getAttribute(KEY_LABEL);
+ }
+
+ AbstractTask task = null;
+ AbstractTaskListMigrator taskMigrator = null;
+ if (NODE_TASK.equals(node.getNodeName())) {
+ String connectorKind = element.getAttribute(DelegatingTaskExternalizer.KEY_CONNECTOR_KIND);
+ task = readDefaultTask(connectorKind, repositoryUrl, taskId, summary, element);
+ }
+ // attempt migration from < 3.0 task list
+ if (task == null) {
+ for (AbstractTaskListMigrator migrator : migrators) {
+ if (node.getNodeName().equals(migrator.getTaskElementName())) {
+ task = readDefaultTask(migrator.getConnectorKind(), repositoryUrl, taskId, summary, element);
+ taskMigrator = migrator;
+ break;
+ }
+ }
+ }
+ // populate common attributes
+ if (task != null) {
+ if (repositoryManager.getRepositoryConnector(task.getConnectorKind()) == null) {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Missing connector for task with kind \"" + task.getConnectorKind() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ return null;
+ }
+
+ readTaskInfo(task, element, parent, legacyCategory);
+ readAttributes(task, element);
+ if (taskMigrator != null) {
+ if (task.getSynchronizationState() == SynchronizationState.INCOMING
+ && task.getLastReadTimeStamp() == null) {
+ task.setSynchronizationState(SynchronizationState.INCOMING_NEW);
+ }
+ task.setTaskKey(task.getTaskId());
+ final AbstractTaskListMigrator finalTaskMigrator = taskMigrator;
+ final AbstractTask finalTask = task;
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void handleException(Throwable e) {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Task migration failed for task \"" + finalTask + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ finalTaskMigrator.migrateTask(finalTask, element);
+ }
+
+ });
+ }
+ return task;
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Missing connector for task node \"" //$NON-NLS-1$
+ + node.getNodeName() + "\"")); //$NON-NLS-1$
+ return null;
+ }
+ }
+
+ private void readAttributes(IAttributeContainer container, Element parent) {
+ NodeList list = parent.getChildNodes();
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ if (child instanceof Element && child.getNodeName().equals(NODE_ATTRIBUTE)) {
+ Element element = (Element) child;
+ String key = element.getAttribute(KEY_KEY);
+ if (key.length() > 0) {
+ container.setAttribute(key, element.getTextContent());
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private void readTaskInfo(AbstractTask task, Element element, ITask parent, AbstractTaskCategory legacyCategory) {
+ if (element.hasAttribute(KEY_CATEGORY)) {
+ // Migration 2.0 -> 3.0 task list. Category no longer maintained on the task element but
+ // task handles held within category nodes similar to query children
+ String categoryHandle = element.getAttribute(KEY_CATEGORY);
+ if (categoryHandle.equals(VAL_ROOT)) {
+ categoryHandle = UncategorizedTaskContainer.HANDLE;
+ }
+ //task.setCategoryHandle(categoryHandle);
+ parentCategoryMap.put(task, categoryHandle);
+ }
+ if (element.hasAttribute(KEY_PRIORITY)) {
+ task.setPriority(element.getAttribute(KEY_PRIORITY));
+ } else {
+ task.setPriority(DEFAULT_PRIORITY);
+ }
+ if (element.hasAttribute(KEY_KIND)) {
+ task.setTaskKind(element.getAttribute(KEY_KIND));
+ }
+ if (!taskActivated && element.getAttribute(KEY_ACTIVE).compareTo(VAL_TRUE) == 0) {
+ task.setActive(true);
+ taskActivated = true;
+ } else {
+ task.setActive(false);
+ }
+ if (element.hasAttribute(KEY_ISSUEURL)) {
+ task.setUrl(element.getAttribute(KEY_ISSUEURL));
+ } else {
+ task.setUrl(""); //$NON-NLS-1$
+ }
+ if (element.hasAttribute(KEY_NOTES)) {
+ task.setNotes(element.getAttribute(KEY_NOTES));
+ } else {
+ task.setNotes(""); //$NON-NLS-1$
+ }
+ if (element.hasAttribute(KEY_TIME_ESTIMATED)) {
+ String est = element.getAttribute(KEY_TIME_ESTIMATED);
+ try {
+ int estimate = Integer.parseInt(est);
+ task.setEstimatedTimeHours(estimate);
+ } catch (Exception e) {
+ task.setEstimatedTimeHours(0);
+ }
+ } else {
+ task.setEstimatedTimeHours(0);
+ }
+ if (element.hasAttribute(KEY_DATE_END)) {
+ task.setCompletionDate(getDateFromString(element.getAttribute(KEY_DATE_END)));
+ } else {
+ task.setCompletionDate(null);
+ }
+ if (element.hasAttribute(KEY_DATE_CREATION)) {
+ task.setCreationDate(getDateFromString(element.getAttribute(KEY_DATE_CREATION)));
+ } else {
+ task.setCreationDate(null);
+ }
+ if (element.hasAttribute(KEY_DATE_MODIFICATION)) {
+ task.setModificationDate(getDateFromString(element.getAttribute(KEY_DATE_MODIFICATION)));
+ } else {
+ task.setModificationDate(null);
+ }
+ if (element.hasAttribute(KEY_DATE_DUE)) {
+ task.setDueDate(getDateFromString(element.getAttribute(KEY_DATE_DUE)));
+ } else {
+ task.setDueDate(null);
+ }
+ // Legacy 2.3.2 -> 3.0 migration of scheduled date
+ boolean isFloating = false;
+ if (element.hasAttribute(KEY_FLOATING) && element.getAttribute(KEY_FLOATING).compareTo(VAL_TRUE) == 0) {
+ isFloating = true;
+ } else {
+ isFloating = false;
+ }
+ if (element.hasAttribute(KEY_DATE_REMINDER)) {
+ Date date = getDateFromString(element.getAttribute(KEY_DATE_REMINDER));
+ if (date != null) {
+ if (isFloating) {
+ task.setScheduledForDate(TaskActivityUtil.getWeekOf(date));
+ } else {
+ task.setScheduledForDate(TaskActivityUtil.getDayOf(date));
+ }
+ }
+ }
+ // Scheduled date range (3.0)
+ if (element.hasAttribute(KEY_DATE_SCHEDULED_START) && element.hasAttribute(KEY_DATE_SCHEDULED_END)) {
+ Date startDate = getDateFromString(element.getAttribute(KEY_DATE_SCHEDULED_START));
+ Date endDate = getDateFromString(element.getAttribute(KEY_DATE_SCHEDULED_END));
+ if (startDate != null && endDate != null && startDate.compareTo(endDate) <= 0) {
+ Calendar calStart = TaskActivityUtil.getCalendar();
+ calStart.setTime(startDate);
+ Calendar calEnd = TaskActivityUtil.getCalendar();
+ calEnd.setTime(endDate);
+ if (DayDateRange.isDayRange(calStart, calEnd)) {
+ task.setScheduledForDate(new DayDateRange(calStart, calEnd));
+ } else if (WeekDateRange.isWeekRange(calStart, calEnd)) {
+ task.setScheduledForDate(new WeekDateRange(calStart, calEnd));
+ } else {
+ // Neither week nor day found, default to today
+ task.setScheduledForDate(TaskActivityUtil.getDayOf(new Date()));
+ }
+ }
+ }
+ if (element.hasAttribute(KEY_REMINDED) && element.getAttribute(KEY_REMINDED).compareTo(VAL_TRUE) == 0) {
+ task.setReminded(true);
+ } else {
+ task.setReminded(false);
+ }
+ if (element.hasAttribute(KEY_STALE) && element.getAttribute(KEY_STALE).compareTo(VAL_TRUE) == 0) {
+ task.setStale(true);
+ } else {
+ task.setStale(false);
+ }
+ if (element.hasAttribute(KEY_MARK_READ_PENDING)
+ && element.getAttribute(KEY_MARK_READ_PENDING).compareTo(VAL_TRUE) == 0) {
+ task.setMarkReadPending(true);
+ } else {
+ task.setMarkReadPending(false);
+ }
+ task.setSynchronizing(false);
+ if (element.hasAttribute(KEY_REPOSITORY_URL)) {
+ task.setRepositoryUrl(element.getAttribute(KEY_REPOSITORY_URL));
+ }
+ if (element.hasAttribute(KEY_LAST_MOD_DATE) && !element.getAttribute(KEY_LAST_MOD_DATE).equals("")) { //$NON-NLS-1$
+ task.setLastReadTimeStamp(element.getAttribute(KEY_LAST_MOD_DATE));
+ }
+ if (element.hasAttribute(KEY_OWNER)) {
+ task.setOwner(element.getAttribute(KEY_OWNER));
+ }
+ if (VAL_TRUE.equals(element.getAttribute(KEY_NOTIFIED_INCOMING))) {
+ task.setNotified(true);
+ } else {
+ task.setNotified(false);
+ }
+ if (element.hasAttribute(KEY_SYNC_STATE)) {
+ try {
+ SynchronizationState state = SynchronizationState.valueOf(element.getAttribute(KEY_SYNC_STATE));
+ task.setSynchronizationState(state);
+ } catch (IllegalArgumentException e) {
+ // invalid sync state, ignore
+ // TODO log this to a multi-status
+ }
+ }
+ if (element.hasAttribute(KEY_KEY)) {
+ task.setTaskKey(element.getAttribute(KEY_KEY));
+ } else {
+ task.setTaskKey(null);
+ }
+ }
+
+ private Date getDateFromString(String dateString) {
+ Date date = null;
+ if ("".equals(dateString)) { //$NON-NLS-1$
+ return null;
+ }
+ String formatString = DATE_FORMAT;
+ SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
+ try {
+ date = format.parse(dateString);
+ } catch (ParseException e) {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Could not parse date \"" //$NON-NLS-1$
+ + dateString + "\"", e)); //$NON-NLS-1$
+ }
+ return date;
+ }
+
+ private String getCategoryTagName() {
+ return KEY_TASK_CATEGORY;
+ }
+
+ public Element createQueryElement(final RepositoryQuery query, Document doc, Element parent) {
+ final Element node;
+ if (query.getClass() == RepositoryQuery.class) {
+ node = doc.createElement(NODE_QUERY);
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Missing factory to externalize query \"" + query + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ return null;
+ }
+
+ node.setAttribute(KEY_HANDLE, query.getHandleIdentifier());
+ node.setAttribute(KEY_CONNECTOR_KIND, query.getConnectorKind());
+ node.setAttribute(KEY_NAME, query.getSummary());
+ node.setAttribute(KEY_QUERY_STRING, query.getUrl());
+ node.setAttribute(KEY_REPOSITORY_URL, query.getRepositoryUrl());
+ if (query.getLastSynchronizedTimeStamp() != null) {
+ node.setAttribute(KEY_LAST_REFRESH, query.getLastSynchronizedTimeStamp());
+ }
+ createAttributes(query, doc, node);
+ for (ITask hit : query.getChildren()) {
+ createTaskReference(KEY_QUERY_HIT, hit, doc, node);
+ }
+
+ parent.appendChild(node);
+ return node;
+ }
+
+ public Map<AbstractTask, String> getLegacyParentCategoryMap() {
+ return parentCategoryMap;
+ }
+
+ /**
+ * Reads the Query from the specified Node. If taskList is not null, then also adds this query to the TaskList
+ *
+ * @throws TaskExternalizationException
+ */
+ public RepositoryQuery readQuery(Node node) {
+ final Element element = (Element) node;
+ String repositoryUrl = element.getAttribute(DelegatingTaskExternalizer.KEY_REPOSITORY_URL);
+ String queryString = element.getAttribute(KEY_QUERY_STRING);
+ if (queryString.length() == 0) { // fall back for legacy
+ queryString = element.getAttribute(KEY_QUERY);
+ }
+ String label = element.getAttribute(DelegatingTaskExternalizer.KEY_NAME);
+ if (label.length() == 0) { // fall back for legacy
+ label = element.getAttribute(DelegatingTaskExternalizer.KEY_LABEL);
+ }
+
+ AbstractTaskListMigrator queryMigrator = null;
+ RepositoryQuery query = null;
+ if (NODE_QUERY.equals(node.getNodeName())) {
+ String connectorKind = element.getAttribute(DelegatingTaskExternalizer.KEY_CONNECTOR_KIND);
+ query = readDefaultQuery(connectorKind, repositoryUrl, queryString, label, element);
+ }
+ // attempt migration from < 3.0 task list
+ if (query == null) {
+ for (AbstractTaskListMigrator migrator : migrators) {
+ Set<String> queryTagNames = migrator.getQueryElementNames();
+ if (queryTagNames != null && queryTagNames.contains(node.getNodeName())) {
+ query = readDefaultQuery(migrator.getConnectorKind(), repositoryUrl, queryString, label, element);
+ queryMigrator = migrator;
+ break;
+ }
+ }
+ }
+ // populate common attributes
+ if (query != null) {
+ if (repositoryManager.getRepositoryConnector(query.getConnectorKind()) == null) {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Missing connector for query with kind \"" + query.getConnectorKind() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ return null;
+ }
+
+ if (element.getAttribute(DelegatingTaskExternalizer.KEY_LAST_REFRESH) != null
+ && !element.getAttribute(DelegatingTaskExternalizer.KEY_LAST_REFRESH).equals("")) { //$NON-NLS-1$
+ query.setLastSynchronizedStamp(element.getAttribute(DelegatingTaskExternalizer.KEY_LAST_REFRESH));
+ }
+ String handle = element.getAttribute(DelegatingTaskExternalizer.KEY_HANDLE);
+ if (handle.length() > 0) {
+ query.setHandleIdentifier(handle);
+ }
+ readAttributes(query, element);
+ if (queryMigrator != null) {
+ query.setHandleIdentifier(label);
+ final AbstractTaskListMigrator finalQueryMigrator = queryMigrator;
+ final RepositoryQuery finalQuery = query;
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void handleException(Throwable e) {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Query migration failed for query \"" + finalQuery + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ finalQueryMigrator.migrateQuery(finalQuery, element);
+ }
+
+ });
+ }
+ return query;
+ } else {
+ errors.add(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, "Missing connector for query node \"" //$NON-NLS-1$
+ + node.getNodeName() + "\"")); //$NON-NLS-1$
+ return null;
+ }
+ }
+
+ private RepositoryQuery readDefaultQuery(String connectorKind, String repositoryUrl, String queryString,
+ String label, Element childElement) {
+ TaskRepository taskRepository = repositoryModel.getTaskRepository(connectorKind, repositoryUrl);
+ IRepositoryQuery query = repositoryModel.createRepositoryQuery(taskRepository);
+ query.setSummary(label);
+ query.setUrl(queryString);
+ return (RepositoryQuery) query;
+ }
+
+ private AbstractTask readDefaultTask(String connectorKind, String repositoryUrl, String taskId, String summary,
+ Element element) {
+ TaskRepository taskRepository = repositoryModel.getTaskRepository(connectorKind, repositoryUrl);
+ if (repositoryUrl.equals(LocalRepositoryConnector.REPOSITORY_URL)) {
+ LocalTask task = new LocalTask(taskId, summary);
+ return task;
+ }
+ ITask task = repositoryModel.createTask(taskRepository, taskId);
+ task.setSummary(summary);
+ return (AbstractTask) task;
+ }
+
+ public void reset() {
+ parentCategoryMap.clear();
+ errors.clear();
+ }
+
+ public void clearErrorStatus() {
+ errors.clear();
+ }
+
+ public Status getErrorStatus() {
+ if (errors.size() > 0) {
+ return new MultiStatus(ITasksCoreConstants.ID_PLUGIN, 0, errors.toArray(new IStatus[0]),
+ "Problems encounted while externalizing task list", null); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java
new file mode 100644
index 0000000..b9a94a7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/ExternalizationManager.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.externalization;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationContext.Kind;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class ExternalizationManager {
+
+ private static final int SAVE_DELAY = 90 * 1000;
+
+ private final ExternalizationJob saveJob;
+
+ private IStatus loadStatus;
+
+ private String rootFolderPath;
+
+ private static volatile boolean saveDisabled = false;
+
+ private final List<IExternalizationParticipant> externalizationParticipants;
+
+ private boolean forceSave = false;
+
+ public ExternalizationManager(String rootFolderPath) {
+ Assert.isNotNull(rootFolderPath);
+ this.externalizationParticipants = new CopyOnWriteArrayList<IExternalizationParticipant>();
+ this.forceSave = false;
+ this.saveJob = createJob();
+ setRootFolderPath(rootFolderPath);
+ }
+
+ private ExternalizationJob createJob() {
+ ExternalizationJob job = new ExternalizationJob(Messages.ExternalizationManager_Task_List_Save_Job);
+ job.setUser(false);
+ job.setSystem(true);
+ return job;
+ }
+
+ public void addParticipant(IExternalizationParticipant participant) {
+ Assert.isNotNull(participant);
+ externalizationParticipants.add(participant);
+ }
+
+ public IStatus load() {
+ try {
+ saveDisabled = true;
+ loadStatus = null;
+
+ List<IStatus> statusList = new ArrayList<IStatus>();
+ IProgressMonitor monitor = Policy.monitorFor(null);
+ for (IExternalizationParticipant participant : externalizationParticipants) {
+ IStatus status = load(participant, monitor);
+ if (status != null) {
+ statusList.add(status);
+ }
+ }
+
+ if (statusList.size() > 0) {
+ loadStatus = new MultiStatus(ITasksCoreConstants.ID_PLUGIN, IStatus.ERROR,
+ statusList.toArray(new IStatus[0]), "Failed to load Task List", null); //$NON-NLS-1$
+ }
+ return loadStatus;
+ } finally {
+ saveDisabled = false;
+ }
+ }
+
+ public IStatus load(final IExternalizationParticipant participant, final IProgressMonitor monitor) {
+ final IStatus[] result = new IStatus[1];
+ final ExternalizationContext context = new ExternalizationContext(Kind.LOAD, rootFolderPath);
+ ISchedulingRule rule = participant.getSchedulingRule();
+ try {
+ Job.getJobManager().beginRule(rule, monitor);
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ if (e instanceof CoreException) {
+ result[0] = ((CoreException) e).getStatus();
+ } else {
+ result[0] = new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Load participant failed", //$NON-NLS-1$
+ e);
+ }
+ }
+
+ public void run() throws Exception {
+ participant.execute(context, monitor);
+ }
+ });
+ } finally {
+ Job.getJobManager().endRule(rule);
+ }
+ return result[0];
+ }
+
+ public void setRootFolderPath(String rootFolderPath) {
+ Assert.isNotNull(rootFolderPath);
+ this.rootFolderPath = rootFolderPath;
+ saveJob.setContext(new ExternalizationContext(Kind.SAVE, rootFolderPath));
+ }
+
+ public void requestSave() {
+ if (!saveDisabled) {
+ if (!CoreUtil.TEST_MODE) {
+ saveJob.schedule(SAVE_DELAY);
+ } else {
+ saveJob.run(new NullProgressMonitor());
+ }
+ }
+ }
+
+ public void stop() {
+ try {
+ saveDisabled = true;
+
+ // run save job as early as possible
+ saveJob.wakeUp();
+ saveJob.join();
+ } catch (InterruptedException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task List save on shutdown canceled.", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Clients invoking this method must hold all necessary scheduling rules.
+ */
+ public void save(boolean force) {
+ try {
+ forceSave = force;
+ saveJob.run(new NullProgressMonitor());
+ } finally {
+ forceSave = false;
+ }
+ }
+
+ public IStatus getLoadStatus() {
+ return loadStatus;
+ }
+
+ private class ExternalizationJob extends Job {
+
+ private volatile IExternalizationContext context;
+
+ public ExternalizationJob(String jobTitle) {
+ super(jobTitle);
+ }
+
+ public IExternalizationContext getContext() {
+ return context;
+ }
+
+ public void setContext(IExternalizationContext saveContext) {
+ this.context = saveContext;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IExternalizationContext context = this.context;
+ switch (context.getKind()) {
+ case SAVE:
+ try {
+ monitor.beginTask(Messages.ExternalizationManager_Saving_, externalizationParticipants.size());
+ for (IExternalizationParticipant participant : externalizationParticipants) {
+ ISchedulingRule rule = participant.getSchedulingRule();
+ if (forceSave || participant.isDirty()) {
+ try {
+ Job.getJobManager().beginRule(rule, monitor);
+ monitor.setTaskName(MessageFormat.format(Messages.ExternalizationManager_Saving_X,
+ participant.getDescription()));
+ participant.execute(context, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Save failed for " + participant.getDescription(), e)); //$NON-NLS-1$
+ } finally {
+ Job.getJobManager().endRule(rule);
+ }
+ }
+ monitor.worked(1);
+ }
+ } finally {
+ monitor.done();
+ }
+ break;
+ default:
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Unsupported externalization kind: " + context.getKind())); //$NON-NLS-1$
+ }
+ return Status.OK_STATUS;
+ }
+ }
+
+ private class ExternalizationContext implements IExternalizationContext {
+
+ private final Kind kind;
+
+ private final String rootPath;
+
+ public ExternalizationContext(IExternalizationContext.Kind kind, String rootPath) {
+ this.kind = kind;
+ this.rootPath = rootPath;
+ }
+
+ public Kind getKind() {
+ return kind;
+ }
+
+ public String getRootPath() {
+ return rootPath;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationContext.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationContext.java
new file mode 100644
index 0000000..3e11638
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationContext.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.externalization;
+
+/**
+ * @author Rob Elves
+ */
+public interface IExternalizationContext {
+
+ public enum Kind {
+ SAVE, SNAPSHOT, LOAD;
+ }
+
+ public abstract Kind getKind();
+
+ public abstract String getRootPath();
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java
new file mode 100644
index 0000000..a55cbe2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/IExternalizationParticipant.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.externalization;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+
+/**
+ * @author Rob Elves
+ */
+public interface IExternalizationParticipant {
+
+ public abstract boolean isDirty();
+
+ public abstract ISchedulingRule getSchedulingRule();
+
+ public abstract void execute(IExternalizationContext context, IProgressMonitor monitor) throws CoreException;
+
+ public abstract String getDescription();
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/Messages.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/Messages.java
new file mode 100644
index 0000000..792f462
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.externalization;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.core.externalization.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ExternalizationManager_Saving_X;
+
+ public static String ExternalizationManager_Saving_;
+
+ public static String ExternalizationManager_Task_List_Save_Job;
+
+ public static String TaskListExternalizationParticipant_Task_List;
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java
new file mode 100644
index 0000000..2c90dad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizationParticipant.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.externalization;
+
+import java.io.File;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListExternalizationParticipant extends AbstractExternalizationParticipant implements
+ IExternalizationParticipant, ITaskListChangeListener, ITaskActivationListener {
+
+ private static final String DESCRIPTION = Messages.TaskListExternalizationParticipant_Task_List;
+
+ private final ExternalizationManager manager;
+
+ private final TaskListExternalizer taskListWriter;
+
+ private final TaskList taskList;
+
+ private boolean dirty;
+
+ private final TaskRepositoryManager taskRepositoryManager;
+
+ private final RepositoryModel repositoryModel;
+
+ public TaskListExternalizationParticipant(RepositoryModel repositoryModel, TaskList taskList,
+ TaskListExternalizer taskListExternalizer, ExternalizationManager manager,
+ TaskRepositoryManager repositoryManager) {
+ this.repositoryModel = repositoryModel;
+ this.manager = manager;
+ this.taskList = taskList;
+ this.taskListWriter = taskListExternalizer;
+ this.taskRepositoryManager = repositoryManager;
+ }
+
+ @Override
+ public ISchedulingRule getSchedulingRule() {
+ return TaskList.getSchedulingRule();
+ }
+
+ @Override
+ public boolean isDirty() {
+ return dirty;
+ }
+
+ @Override
+ public void load(final File sourceFile, IProgressMonitor monitor) throws CoreException {
+ ITaskListRunnable loadRunnable = new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ resetTaskList();
+ taskListWriter.readTaskList(taskList, sourceFile);
+ }
+ };
+
+ taskList.run(loadRunnable, monitor);
+ }
+
+ @Override
+ protected boolean performLoad(File dataFile, IProgressMonitor monitor) throws CoreException {
+ if (super.performLoad(dataFile, monitor)) {
+ return true;
+ } else {
+ try {
+ // attempt restore of old Mylyn tasklist.xml.zip
+ File oldTasklist = new File(dataFile.getParent(), ITasksCoreConstants.OLD_M_2_TASKLIST_FILENAME);
+ if (oldTasklist.exists()) {
+ load(oldTasklist, monitor);
+ return true;
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+ }
+ return false;
+ }
+
+ /**
+ * public for tests
+ */
+ public void resetTaskList() {
+ repositoryModel.clear();
+ taskList.reset();
+ prepareOrphanContainers();
+ }
+
+ private void prepareOrphanContainers() {
+ for (TaskRepository repository : taskRepositoryManager.getAllRepositories()) {
+ if (!repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) {
+ taskList.addUnmatchedContainer(new UnmatchedTaskContainer(repository.getConnectorKind(),
+ repository.getRepositoryUrl()));
+ }
+ }
+ }
+
+ @Override
+ public void save(final File targetFile, IProgressMonitor monitor) throws CoreException {
+ ITaskListRunnable saveRunnable = new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ synchronized (TaskListExternalizationParticipant.this) {
+ dirty = false;
+ }
+ taskListWriter.writeTaskList(taskList, targetFile);
+ }
+ };
+
+ taskList.run(saveRunnable, monitor);
+ }
+
+ @Override
+ public String getDescription() {
+ return DESCRIPTION;
+ }
+
+ @Override
+ public String getFileName() {
+ return ITasksCoreConstants.DEFAULT_TASK_LIST_FILE;
+ }
+
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (!taskContainerDelta.isTransient()) {
+ synchronized (TaskListExternalizationParticipant.this) {
+ dirty = true;
+ }
+ manager.requestSave();
+ return;
+ }
+ }
+ }
+
+ public void preTaskActivated(ITask task) {
+ // ignore
+
+ }
+
+ public void preTaskDeactivated(ITask task) {
+ // ignore
+
+ }
+
+ public void taskActivated(ITask task) {
+ synchronized (TaskListExternalizationParticipant.this) {
+ dirty = true;
+ }
+ manager.requestSave();
+ return;
+ }
+
+ public void taskDeactivated(ITask task) {
+ synchronized (TaskListExternalizationParticipant.this) {
+ dirty = true;
+ }
+ manager.requestSave();
+ return;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java
new file mode 100644
index 0000000..8f72625
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/TaskListExternalizer.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - improvements
+ * Jevgeni Holodkov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core.externalization;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.ITransferList;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskListExternalizer {
+
+ private static final String ERROR_TASKLIST_READ = "Failed to load Task List"; //$NON-NLS-1$
+
+ private static final String TRANSFORM_PROPERTY_VERSION = "version"; //$NON-NLS-1$
+
+ // May 2007: There was a bug when reading in 1.1
+ // Result was an infinite loop within the parser
+ private static final String XML_VERSION = "1.0"; //$NON-NLS-1$
+
+ public static final String ATTRIBUTE_VERSION = "Version"; //$NON-NLS-1$
+
+ public static final String ELEMENT_TASK_LIST = "TaskList"; //$NON-NLS-1$
+
+ // Mylyn 3.0
+ private static final String VALUE_VERSION = "2.0"; //$NON-NLS-1$
+
+ // Mylyn 2.3.2
+ //private static final String VALUE_VERSION_1_0_1 = "1.0.1";
+
+ private static final String VALUE_VERSION_1_0_0 = "1.0.0"; //$NON-NLS-1$
+
+ private final DelegatingTaskExternalizer delegatingExternalizer;
+
+ private final List<Node> orphanedNodes = new ArrayList<Node>();
+
+ private String readVersion = ""; //$NON-NLS-1$
+
+ public TaskListExternalizer(RepositoryModel repositoryModel, IRepositoryManager repositoryManager) {
+ this.delegatingExternalizer = new DelegatingTaskExternalizer(repositoryModel, repositoryManager);
+ }
+
+ public void initialize(List<AbstractTaskListMigrator> migrators) {
+ this.delegatingExternalizer.initialize(migrators);
+ }
+
+ public void writeTaskList(ITransferList taskList, File outFile) throws CoreException {
+ try {
+ FileOutputStream outStream = new FileOutputStream(outFile);
+ try {
+ Document doc = createTaskListDocument(taskList);
+
+ ZipOutputStream zipOutStream = new ZipOutputStream(outStream);
+
+ ZipEntry zipEntry = new ZipEntry(ITasksCoreConstants.OLD_TASK_LIST_FILE);
+ zipOutStream.putNextEntry(zipEntry);
+ zipOutStream.setMethod(ZipOutputStream.DEFLATED);
+
+ writeDocument(doc, zipOutStream);
+
+ zipOutStream.flush();
+ zipOutStream.closeEntry();
+ zipOutStream.finish();
+ } finally {
+ outStream.close();
+ }
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Saving Task List failed", //$NON-NLS-1$
+ e));
+ }
+ }
+
+ private Document createTaskListDocument(ITransferList taskList) throws CoreException {
+ Document doc = createDocument();
+
+ delegatingExternalizer.clearErrorStatus();
+
+ Element root = doc.createElement(ELEMENT_TASK_LIST);
+ root.setAttribute(ATTRIBUTE_VERSION, VALUE_VERSION);
+ doc.appendChild(root);
+
+ // create task nodes...
+ for (AbstractTask task : taskList.getAllTasks()) {
+ delegatingExternalizer.createTaskElement(task, doc, root);
+ }
+
+ // create the category nodes...
+ for (AbstractTaskCategory category : taskList.getCategories()) {
+ delegatingExternalizer.createCategoryElement(category, doc, root);
+ }
+
+ // create query nodes...
+ for (RepositoryQuery query : taskList.getQueries()) {
+ delegatingExternalizer.createQueryElement(query, doc, root);
+ }
+
+ // Persist orphaned tasks...
+ for (Node node : orphanedNodes) {
+ Node tempNode = doc.importNode(node, true);
+ if (tempNode != null) {
+ root.appendChild(tempNode);
+ }
+ }
+
+ if (delegatingExternalizer.getErrorStatus() != null) {
+ StatusHandler.log(delegatingExternalizer.getErrorStatus());
+ }
+
+ return doc;
+ }
+
+ private void writeDocument(Document doc, OutputStream outputStream) throws CoreException {
+ Source source = new DOMSource(doc);
+ Result result = new StreamResult(outputStream);
+ try {
+ Transformer xformer = TransformerFactory.newInstance().newTransformer();
+ xformer.setOutputProperty(TRANSFORM_PROPERTY_VERSION, XML_VERSION);
+ xformer.transform(source, result);
+ } catch (TransformerException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Failed write task list", //$NON-NLS-1$
+ e));
+ }
+ }
+
+ private Document createDocument() throws CoreException {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db;
+ try {
+ db = dbf.newDocumentBuilder();
+ return db.newDocument();
+ } catch (ParserConfigurationException e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Failed to create document", e)); //$NON-NLS-1$
+ }
+ }
+
+ public void readTaskList(ITransferList taskList, File inFile) throws CoreException {
+ if (!inFile.exists()) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task list file not found \"" + inFile.getAbsolutePath() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (inFile.length() == 0) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task list file contains no data \"" + inFile.getAbsolutePath() + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ delegatingExternalizer.reset();
+ orphanedNodes.clear();
+
+ Document doc = openTaskList(inFile);
+ Element root = doc.getDocumentElement();
+ readVersion = root.getAttribute(ATTRIBUTE_VERSION);
+ if (readVersion.equals(VALUE_VERSION_1_0_0)) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Task list version \"" //$NON-NLS-1$
+ + readVersion + "\" not supported")); //$NON-NLS-1$
+ }
+
+ NodeList list = root.getChildNodes();
+
+ // read tasks
+ Map<AbstractTask, NodeList> tasksWithSubtasks = new HashMap<AbstractTask, NodeList>();
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ if (!child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_CATEGORY)
+ && !child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_QUERY)) {
+ AbstractTask task = delegatingExternalizer.readTask(child, null, null);
+ if (task != null) {
+ taskList.addTask(task);
+ if (child.getChildNodes() != null && child.getChildNodes().getLength() > 0) {
+ tasksWithSubtasks.put(task, child.getChildNodes());
+ }
+ } else {
+ orphanedNodes.add(child);
+ }
+ }
+ }
+ // create subtask hierarchy
+ for (AbstractTask task : tasksWithSubtasks.keySet()) {
+ NodeList nodes = tasksWithSubtasks.get(task);
+ delegatingExternalizer.readTaskReferences(task, nodes, taskList);
+ }
+
+ // read queries
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ if (child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_QUERY)) {
+ RepositoryQuery query = delegatingExternalizer.readQuery(child);
+ if (query != null) {
+ taskList.addQuery(query);
+ if (child.getChildNodes() != null && child.getChildNodes().getLength() > 0) {
+ delegatingExternalizer.readTaskReferences(query, child.getChildNodes(), taskList);
+ }
+ } else {
+ orphanedNodes.add(child);
+ }
+ }
+ }
+
+ // Read Categories
+ for (int i = 0; i < list.getLength(); i++) {
+ Node child = list.item(i);
+ if (child.getNodeName().endsWith(DelegatingTaskExternalizer.KEY_CATEGORY)) {
+ delegatingExternalizer.readCategory(child, taskList);
+ }
+ }
+
+ // Legacy migration for task nodes that have the old Category handle on the element
+ Map<AbstractTask, String> legacyParentCategoryMap = delegatingExternalizer.getLegacyParentCategoryMap();
+ if (legacyParentCategoryMap.size() > 0) {
+ for (AbstractTask task : legacyParentCategoryMap.keySet()) {
+ AbstractTaskCategory category = taskList.getContainerForHandle(legacyParentCategoryMap.get(task));
+ if (category != null) {
+ taskList.addTask(task, category);
+ }
+ }
+ }
+
+// if (delegatingExternalizer.getErrorStatus() != null) {
+// StatusHandler.log(delegatingExternalizer.getErrorStatus());
+// }
+ }
+
+ /**
+ * Opens the specified XML file and parses it into a DOM Document.
+ *
+ * Filename - the name of the file to open Return - the Document built from the XML file Throws - XMLException if
+ * the file cannot be parsed as XML - IOException if the file cannot be opened
+ *
+ * @throws CoreException
+ *
+ */
+ private Document openTaskList(File inputFile) throws CoreException {
+ InputStream in = null;
+ try {
+ if (inputFile.getName().endsWith(ITasksCoreConstants.FILE_EXTENSION)) {
+ in = new ZipInputStream(new FileInputStream(inputFile));
+ ZipEntry entry = ((ZipInputStream) in).getNextEntry();
+ while (entry != null) {
+ if (ITasksCoreConstants.OLD_TASK_LIST_FILE.equals(entry.getName())) {
+ break;
+ }
+ entry = ((ZipInputStream) in).getNextEntry();
+ }
+ if (entry == null) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Task list file contains no entry for the task list")); //$NON-NLS-1$
+ }
+ } else {
+ in = new FileInputStream(inputFile);
+ }
+
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ return builder.parse(in);
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, ERROR_TASKLIST_READ, e));
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Failed to close task list", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/messages.properties b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/messages.properties
new file mode 100644
index 0000000..399cfc7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/externalization/messages.properties
@@ -0,0 +1,5 @@
+ExternalizationManager_Saving_X=Saving {0}
+ExternalizationManager_Saving_=Saving...
+ExternalizationManager_Task_List_Save_Job=Task List Save Job
+
+TaskListExternalizationParticipant_Task_List=Task List
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties
new file mode 100644
index 0000000..59e5baf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/messages.properties
@@ -0,0 +1,26 @@
+DayDateRange___Today=\ - Today
+
+LocalRepositoryConnector_Local=Local
+LocalRepositoryConnector_Local_Task_Repository=Local Task Repository
+LocalRepositoryConnector_New_Task=New Task
+
+RepositoryExternalizationParticipant_Task_Repositories=Task Repositories
+
+TaskRepositoryManager_No_repository_available=No repository available, please add one using the Task Repositories view.
+
+UncategorizedTaskContainer_Uncategorized=Uncategorized
+
+UnmatchedTaskContainer_Unmatched=Unmatched
+
+UnsubmittedTaskContainer_Unsubmitted=Unsubmitted
+
+WeekDateRange_Next_Week=Next Week
+WeekDateRange_Previous_Week=Previous Week
+WeekDateRange_This_Week=This Week
+WeekDateRange_Two_Weeks=Two Weeks
+
+PriorityLevel_High=High
+PriorityLevel_Low=Low
+PriorityLevel_Normal=Normal
+PriorityLevel_Very_High=Very High
+PriorityLevel_Very_Low=Very Low
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/Messages.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/Messages.java
new file mode 100644
index 0000000..d9ae21c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/Messages.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.core.sync.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String SubmitTaskAttachmentJob_Sending_data;
+
+ public static String SubmitTaskAttachmentJob_Submitting_attachment;
+
+ public static String SubmitTaskAttachmentJob_Updating_task;
+
+ public static String SubmitTaskJob_Receiving_data;
+
+ public static String SubmitTaskJob_Sending_data;
+
+ public static String SubmitTaskJob_Submitting_task;
+
+ public static String SynchronizeQueriesJob_Max_allowed_number_of_hits_returned_exceeded;
+
+ public static String SynchronizeQueriesJob_Processing;
+
+ public static String SynchronizeQueriesJob_Querying_repository;
+
+ public static String SynchronizeQueriesJob_Receiving_related_tasks;
+
+ public static String SynchronizeQueriesJob_Synchronizing_Queries;
+
+ public static String SynchronizeQueriesJob_Synchronizing_query_X;
+
+ public static String SynchronizeQueriesJob_Updating_repository_state;
+
+ public static String SynchronizeRepositoriesJob_Processing;
+
+ public static String SynchronizeRepositoriesJob_Processing_;
+
+ public static String SynchronizeRepositoriesJob_Synchronizing_Task_List;
+
+ public static String SynchronizeRepositoriesJob_Updating_repository_configuration_for_X;
+
+ public static String SynchronizeTasksJob_Processing;
+
+ public static String SynchronizeTasksJob_Receiving_task_X;
+
+ public static String SynchronizeTasksJob_Synchronizing_Tasks__X_;
+
+ public static String SynchronizeTasksJob_Receiving_X_tasks_from_X;
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskAttachmentJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskAttachmentJob.java
new file mode 100644
index 0000000..1248fbe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskAttachmentJob.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.MutexSchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SubmitTaskAttachmentJob extends SubmitJob {
+
+ private final TaskAttribute attachmentAttribute;
+
+ private final String comment;
+
+ private final AbstractRepositoryConnector connector;
+
+ private IStatus errorStatus;
+
+ private final AbstractTaskAttachmentSource source;
+
+ private final ITask task;
+
+ private final TaskRepository taskRepository;
+
+ private final TaskDataManager taskDataManager;
+
+ public SubmitTaskAttachmentJob(TaskDataManager taskDataManager, AbstractRepositoryConnector connector,
+ TaskRepository taskRepository, ITask task, AbstractTaskAttachmentSource source, String comment,
+ TaskAttribute attachmentAttribute) {
+ super("Submitting Attachment"); //$NON-NLS-1$
+ this.taskDataManager = taskDataManager;
+ this.connector = connector;
+ this.taskRepository = taskRepository;
+ this.task = task;
+ this.source = source;
+ this.comment = comment;
+ this.attachmentAttribute = attachmentAttribute;
+ setRule(new MutexSchedulingRule());
+ }
+
+ @Override
+ public RepositoryResponse getResponse() {
+ return null;
+ }
+
+ @Override
+ public IStatus getStatus() {
+ return errorStatus;
+ }
+
+ @Override
+ public ITask getTask() {
+ return task;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ final AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
+ if (attachmentHandler == null) {
+ errorStatus = new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "The task repository does not support attachments."); //$NON-NLS-1$
+ return Status.OK_STATUS;
+ }
+ try {
+ monitor.beginTask(Messages.SubmitTaskAttachmentJob_Submitting_attachment,
+ 2 * (1 + getSubmitJobListeners().length) * 100);
+ monitor.subTask(Messages.SubmitTaskAttachmentJob_Sending_data);
+ attachmentHandler.postContent(taskRepository, task, source, comment, attachmentAttribute,
+ Policy.subMonitorFor(monitor, 100));
+ fireTaskSubmitted(monitor);
+ monitor.subTask(Messages.SubmitTaskAttachmentJob_Updating_task);
+ TaskData taskData = connector.getTaskData(taskRepository, task.getTaskId(), Policy.subMonitorFor(monitor,
+ 100));
+ taskDataManager.putUpdatedTaskData(task, taskData, true);
+ fireTaskSynchronized(monitor);
+ } catch (CoreException e) {
+ errorStatus = e.getStatus();
+ } catch (OperationCanceledException e) {
+ errorStatus = Status.CANCEL_STATUS;
+ } finally {
+ monitor.done();
+ }
+ fireDone();
+ return (errorStatus == Status.CANCEL_STATUS) ? Status.CANCEL_STATUS : Status.OK_STATUS;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskJob.java
new file mode 100644
index 0000000..1ae57cd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SubmitTaskJob.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.MutexSchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SubmitTaskJob extends SubmitJob {
+
+ private final TaskRepository taskRepository;
+
+ private final TaskData taskData;
+
+ private final AbstractRepositoryConnector connector;
+
+ private IStatus errorStatus;
+
+ private ITask task;
+
+ private final Set<TaskAttribute> oldAttributes;
+
+ private final TaskDataManager taskDataManager;
+
+ private RepositoryResponse response;
+
+ public SubmitTaskJob(TaskDataManager taskDataManager, AbstractRepositoryConnector connector,
+ TaskRepository taskRepository, ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes) {
+ super("Submitting Task"); //$NON-NLS-1$
+ this.taskDataManager = taskDataManager;
+ this.connector = connector;
+ this.taskRepository = taskRepository;
+ this.task = task;
+ this.taskData = taskData;
+ this.oldAttributes = oldAttributes;
+ setRule(new MutexSchedulingRule());
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor jobMonitor) {
+ monitor.attach(jobMonitor);
+ try {
+ monitor.beginTask(Messages.SubmitTaskJob_Submitting_task, 2 * (1 + getSubmitJobListeners().length) * 100);
+
+ // post task data
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ monitor.subTask(Messages.SubmitTaskJob_Sending_data);
+ response = taskDataHandler.postTaskData(taskRepository, taskData, oldAttributes, Policy.subMonitorFor(
+ monitor, 100));
+ if (response == null || response.getTaskId() == null) {
+ throw new CoreException(new RepositoryStatus(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL,
+ "Task could not be created. No additional information was provided by the connector.")); //$NON-NLS-1$
+ }
+ fireTaskSubmitted(monitor);
+
+ // update task in task list
+ String taskId = response.getTaskId();
+ monitor.subTask(Messages.SubmitTaskJob_Receiving_data);
+ TaskData updatedTaskData = connector.getTaskData(taskRepository, taskId, Policy.subMonitorFor(monitor, 100));
+ task = createTask(monitor, updatedTaskData);
+ taskDataManager.putSubmittedTaskData(task, updatedTaskData);
+ fireTaskSynchronized(monitor);
+ } catch (CoreException e) {
+ errorStatus = e.getStatus();
+ } catch (OperationCanceledException e) {
+ errorStatus = Status.CANCEL_STATUS;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Unexpected error during task submission", e)); //$NON-NLS-1$
+ errorStatus = new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Unexpected error: " //$NON-NLS-1$
+ + e.getMessage(), e);
+ } finally {
+ monitor.done();
+ }
+ fireDone();
+ return (errorStatus == Status.CANCEL_STATUS) ? Status.CANCEL_STATUS : Status.OK_STATUS;
+ }
+
+ private ITask createTask(IProgressMonitor monitor, TaskData updatedTaskData) throws CoreException {
+ if (taskData.isNew()) {
+ task = new TaskTask(connector.getConnectorKind(), taskRepository.getRepositoryUrl(),
+ updatedTaskData.getTaskId());
+ }
+ return task;
+ }
+
+ @Override
+ public RepositoryResponse getResponse() {
+ return response;
+ }
+
+ @Override
+ public IStatus getStatus() {
+ return errorStatus;
+ }
+
+ @Override
+ public ITask getTask() {
+ return task;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizationSession.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizationSession.java
new file mode 100644
index 0000000..feeb216
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizationSession.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class SynchronizationSession implements ISynchronizationSession {
+
+ private Set<ITask> changedTasks;
+
+ private Object data;
+
+ private boolean fullSynchronization;
+
+ private boolean performQueries;
+
+ private Set<ITask> staleTasks;
+
+ private IStatus status;
+
+ private TaskDataManager taskDataManager;
+
+ private TaskRepository taskRepository;
+
+ private Set<ITask> tasks;
+
+ private boolean user;
+
+ public SynchronizationSession() {
+ }
+
+ public SynchronizationSession(TaskDataManager taskDataManager) {
+ this.taskDataManager = taskDataManager;
+ }
+
+ public Set<ITask> getChangedTasks() {
+ return changedTasks;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public Set<ITask> getStaleTasks() {
+ return staleTasks;
+ }
+
+ public IStatus getStatus() {
+ return status;
+ }
+
+ public TaskDataManager getTaskDataManager() {
+ return taskDataManager;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public Set<ITask> getTasks() {
+ return tasks;
+ }
+
+ public boolean isFullSynchronization() {
+ return fullSynchronization;
+ }
+
+ public boolean isUser() {
+ return user;
+ }
+
+ public void markStale(ITask task) {
+ if (staleTasks == null) {
+ staleTasks = new HashSet<ITask>();
+ }
+ staleTasks.add(task);
+ }
+
+ public boolean needsPerformQueries() {
+ return performQueries;
+ }
+
+ public void putTaskData(ITask task, TaskData taskData) throws CoreException {
+ if (taskDataManager != null) {
+ taskDataManager.putUpdatedTaskData(task, taskData, false);
+ }
+ }
+
+ public void setChangedTasks(Set<ITask> changedTasks) {
+ this.changedTasks = changedTasks;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ public void setFullSynchronization(boolean fullSynchronization) {
+ this.fullSynchronization = fullSynchronization;
+ }
+
+ public void setNeedsPerformQueries(boolean performQueries) {
+ this.performQueries = performQueries;
+ }
+
+ public void setStatus(IStatus status) {
+ this.status = status;
+ }
+
+ public void setTaskRepository(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ public void setTasks(Set<ITask> tasks) {
+ this.tasks = tasks;
+ }
+
+ public void setUser(boolean user) {
+ this.user = user;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java
new file mode 100644
index 0000000..edb65cc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeQueriesJob.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.DelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.IDelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.ObjectSchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryModel;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class SynchronizeQueriesJob extends SynchronizationJob {
+
+ private class TaskCollector extends TaskDataCollector {
+
+ private final Set<ITask> removedQueryResults;
+
+ private final RepositoryQuery repositoryQuery;
+
+ private int resultCount;
+
+ private final SynchronizationSession session;
+
+ public TaskCollector(RepositoryQuery repositoryQuery, SynchronizationSession session) {
+ this.repositoryQuery = repositoryQuery;
+ this.session = session;
+ this.removedQueryResults = new HashSet<ITask>(repositoryQuery.getChildren());
+ }
+
+ @Override
+ public void accept(TaskData taskData) {
+ ITask task = taskList.getTask(taskData.getRepositoryUrl(), taskData.getTaskId());
+ if (task == null) {
+ task = tasksModel.createTask(repository, taskData.getTaskId());
+ ((AbstractTask) task).setSynchronizationState(SynchronizationState.INCOMING_NEW);
+ if (taskData.isPartial() && connector.canSynchronizeTask(repository, task)) {
+ session.markStale(task);
+ }
+ } else {
+ removedQueryResults.remove(task);
+ }
+ try {
+ session.putTaskData(task, taskData);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Failed to save task", e)); //$NON-NLS-1$
+ }
+ taskList.addTask(task, repositoryQuery);
+ resultCount++;
+ }
+
+ public Set<ITask> getRemovedChildren() {
+ return removedQueryResults;
+ }
+
+ public int getResultCount() {
+ return resultCount;
+ }
+
+ }
+
+ public static final String MAX_HITS_REACHED = Messages.SynchronizeQueriesJob_Max_allowed_number_of_hits_returned_exceeded;
+
+ private final AbstractRepositoryConnector connector;
+
+ private final Set<RepositoryQuery> queries;
+
+ private final TaskRepository repository;
+
+ private final TaskDataManager taskDataManager;
+
+ private final TaskList taskList;
+
+ private final IRepositoryModel tasksModel;
+
+ private final List<IStatus> statuses;
+
+ private final IDelegatingProgressMonitor monitor;
+
+ public SynchronizeQueriesJob(TaskList taskList, TaskDataManager taskDataManager, IRepositoryModel tasksModel,
+ AbstractRepositoryConnector connector, TaskRepository repository, Set<RepositoryQuery> queries) {
+ super(Messages.SynchronizeQueriesJob_Synchronizing_Queries + " (" + repository.getRepositoryLabel() + ")"); //$NON-NLS-1$//$NON-NLS-2$
+ this.taskList = taskList;
+ this.taskDataManager = taskDataManager;
+ this.tasksModel = tasksModel;
+ this.connector = connector;
+ this.repository = repository;
+ this.queries = queries;
+ this.statuses = new ArrayList<IStatus>();
+ this.monitor = new DelegatingProgressMonitor();
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor jobMonitor) {
+ monitor.attach(jobMonitor);
+ try {
+ monitor.beginTask(Messages.SynchronizeQueriesJob_Processing, 20 + queries.size() * 20 + 40 + 10);
+
+ Set<ITask> allTasks;
+ if (!isFullSynchronization()) {
+ allTasks = new HashSet<ITask>();
+ for (RepositoryQuery query : queries) {
+ allTasks.addAll(query.getChildren());
+ }
+ } else {
+ allTasks = taskList.getTasks(repository.getRepositoryUrl());
+ }
+
+ ObjectSchedulingRule rule = new ObjectSchedulingRule(repository);
+ try {
+ Job.getJobManager().beginRule(rule, monitor);
+
+ final Map<String, TaskRelation[]> relationsByTaskId = new HashMap<String, TaskRelation[]>();
+ SynchronizationSession session = new SynchronizationSession(taskDataManager) {
+ @Override
+ public void putTaskData(ITask task, TaskData taskData) throws CoreException {
+ boolean changed = connector.hasTaskChanged(repository, task, taskData);
+ taskDataManager.putUpdatedTaskData(task, taskData, isUser(), this);
+ if (taskData.isPartial()) {
+ if (changed && connector.canSynchronizeTask(repository, task)) {
+ markStale(task);
+ }
+ } else {
+ Collection<TaskRelation> relations = connector.getTaskRelations(taskData);
+ if (relations != null) {
+ relationsByTaskId.put(task.getTaskId(), relations.toArray(new TaskRelation[0]));
+ }
+ }
+ }
+ };
+ session.setTaskRepository(repository);
+ session.setFullSynchronization(isFullSynchronization());
+ session.setTasks(Collections.unmodifiableSet(allTasks));
+ session.setNeedsPerformQueries(true);
+ session.setUser(isUser());
+
+ updateQueryStatus(null);
+ try {
+ boolean success = preSynchronization(session, new SubProgressMonitor(monitor, 20));
+
+ if ((success && session.needsPerformQueries()) || isUser()) {
+ // synchronize queries, tasks changed within query are added to set of tasks to be synchronized
+ synchronizeQueries(monitor, session);
+ } else {
+ monitor.worked(queries.size() * 20);
+ }
+ } finally {
+ for (RepositoryQuery repositoryQuery : queries) {
+ repositoryQuery.setSynchronizing(false);
+ }
+ taskList.notifySynchronizationStateChanged(queries);
+ }
+
+ Set<ITask> tasksToBeSynchronized = new HashSet<ITask>();
+ if (session.getStaleTasks() != null) {
+ for (ITask task : session.getStaleTasks()) {
+ tasksToBeSynchronized.add(task);
+ ((AbstractTask) task).setSynchronizing(true);
+ }
+ }
+
+ // synchronize tasks that were marked by the connector
+ SynchronizeTasksJob job = new SynchronizeTasksJob(taskList, taskDataManager, tasksModel, connector,
+ repository, tasksToBeSynchronized);
+ job.setUser(isUser());
+ job.setSession(session);
+ if (!tasksToBeSynchronized.isEmpty()) {
+ Policy.checkCanceled(monitor);
+ IStatus result = job.run(new SubProgressMonitor(monitor, 30));
+ if (result == Status.CANCEL_STATUS) {
+ throw new OperationCanceledException();
+ }
+ statuses.addAll(job.getStatuses());
+ }
+ monitor.subTask(Messages.SynchronizeQueriesJob_Receiving_related_tasks);
+ job.synchronizedTaskRelations(monitor, relationsByTaskId);
+ monitor.worked(10);
+
+ session.setChangedTasks(tasksToBeSynchronized);
+ if (statuses.size() > 0) {
+ Status status = new MultiStatus(ITasksCoreConstants.ID_PLUGIN, 0, statuses.toArray(new IStatus[0]),
+ "Query synchronization failed", null); //$NON-NLS-1$
+ session.setStatus(status);
+ }
+
+ // hook into the connector for synchronization time stamp management
+ postSynchronization(session, new SubProgressMonitor(monitor, 10));
+ } finally {
+ Job.getJobManager().endRule(rule);
+ }
+ } catch (OperationCanceledException e) {
+ return Status.CANCEL_STATUS;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Synchronization failed", e)); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ private void synchronizeQueries(IProgressMonitor monitor, SynchronizationSession session) {
+ for (RepositoryQuery repositoryQuery : queries) {
+ Policy.checkCanceled(monitor);
+ monitor.subTask(MessageFormat.format(Messages.SynchronizeQueriesJob_Synchronizing_query_X,
+ repositoryQuery.getSummary()));
+ synchronizeQuery(repositoryQuery, session, new SubProgressMonitor(monitor, 20));
+ }
+ }
+
+ private boolean postSynchronization(SynchronizationSession event, IProgressMonitor monitor) {
+ try {
+ Policy.checkCanceled(monitor);
+ monitor.subTask(Messages.SynchronizeQueriesJob_Updating_repository_state);
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+ connector.postSynchronization(event, monitor);
+ return true;
+ } catch (CoreException e) {
+ updateQueryStatus(e.getStatus());
+ return false;
+ }
+ }
+
+ private boolean preSynchronization(ISynchronizationSession event, IProgressMonitor monitor) {
+ try {
+ Policy.checkCanceled(monitor);
+ monitor.subTask(Messages.SynchronizeQueriesJob_Querying_repository);
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+ connector.preSynchronization(event, monitor);
+ return true;
+ } catch (CoreException e) {
+ // synchronization is unlikely to succeed, inform user and exit
+ updateQueryStatus(e.getStatus());
+ statuses.add(e.getStatus());
+ return false;
+ }
+ }
+
+ private void synchronizeQuery(RepositoryQuery repositoryQuery, SynchronizationSession event,
+ IProgressMonitor monitor) {
+ TaskCollector collector = new TaskCollector(repositoryQuery, event);
+
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+ IStatus result = connector.performQuery(repository, repositoryQuery, collector, event, monitor);
+ if (result == null || result.isOK()) {
+ if (collector.getResultCount() >= TaskDataCollector.MAX_HITS) {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN, MAX_HITS_REACHED + "\n" //$NON-NLS-1$
+ + repositoryQuery.getSummary()));
+ }
+
+ Set<ITask> removedChildren = collector.getRemovedChildren();
+ if (!removedChildren.isEmpty()) {
+ taskList.removeFromContainer(repositoryQuery, removedChildren);
+ }
+
+ repositoryQuery.setLastSynchronizedStamp(new SimpleDateFormat("MMM d, H:mm:ss").format(new Date())); //$NON-NLS-1$
+ } else if (result.getSeverity() == IStatus.CANCEL) {
+ throw new OperationCanceledException();
+ } else {
+ repositoryQuery.setStatus(result);
+ statuses.add(result);
+ }
+ }
+
+ private void updateQueryStatus(final IStatus status) {
+ for (RepositoryQuery repositoryQuery : queries) {
+ repositoryQuery.setStatus(status);
+ }
+ taskList.notifySynchronizationStateChanged(queries);
+ }
+
+ public Collection<IStatus> getStatuses() {
+ return Collections.unmodifiableCollection(statuses);
+ }
+
+ public IDelegatingProgressMonitor getMonitor() {
+ return monitor;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeRepositoriesJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeRepositoriesJob.java
new file mode 100644
index 0000000..01005e9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeRepositoriesJob.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+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.Job;
+import org.eclipse.mylyn.commons.core.DelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.IDelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryModel;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+
+/**
+ * Updates the task list.
+ *
+ * @author Steffen Pingel
+ */
+public class SynchronizeRepositoriesJob extends SynchronizationJob {
+
+ private final TaskList taskList;
+
+ private final TaskDataManager taskDataManager;
+
+ private final IRepositoryManager repositoryManager;
+
+ private Set<TaskRepository> repositories;
+
+ private final IRepositoryModel tasksModel;
+
+ private final IDelegatingProgressMonitor monitor;
+
+ public SynchronizeRepositoriesJob(TaskList taskList, TaskDataManager taskDataManager, IRepositoryModel tasksModel,
+ IRepositoryManager repositoryManager) {
+ super(Messages.SynchronizeRepositoriesJob_Synchronizing_Task_List);
+ this.taskList = taskList;
+ this.taskDataManager = taskDataManager;
+ this.tasksModel = tasksModel;
+ this.repositoryManager = repositoryManager;
+ this.monitor = new DelegatingProgressMonitor();
+ }
+
+ public Collection<TaskRepository> getRepositories() {
+ return Collections.unmodifiableCollection(repositories);
+ }
+
+ public void setRepositories(Collection<TaskRepository> repositories) {
+ if (repositories != null) {
+ this.repositories = new HashSet<TaskRepository>(repositories);
+ } else {
+ this.repositories = null;
+ }
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor jobMonitor) {
+ monitor.attach(jobMonitor);
+ // get the current list of repositories
+ Set<TaskRepository> repositories = this.repositories;
+ if (repositories == null) {
+ repositories = new HashSet<TaskRepository>(repositoryManager.getAllRepositories());
+ }
+ try {
+ monitor.beginTask(Messages.SynchronizeRepositoriesJob_Processing, repositories.size() * 100);
+
+ for (TaskRepository repository : repositories) {
+ if (monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ if (repository.isOffline()) {
+ monitor.worked(100);
+ continue;
+ }
+
+ monitor.setTaskName(MessageFormat.format(Messages.SynchronizeRepositoriesJob_Processing_,
+ repository.getRepositoryLabel()));
+
+ final AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(repository.getConnectorKind());
+ Set<RepositoryQuery> queries = new HashSet<RepositoryQuery>(
+ taskList.getRepositoryQueries(repository.getRepositoryUrl()));
+ // remove queries that are not configured for auto update
+ if (!isUser()) {
+ for (Iterator<RepositoryQuery> it = queries.iterator(); it.hasNext();) {
+ if (!it.next().getAutoUpdate()) {
+ it.remove();
+ }
+ }
+ }
+
+ if (isUser() || queries.isEmpty()) {
+ monitor.worked(20);
+ } else {
+ // occasionally request update of repository configuration attributes as part of background synchronizations
+ updateRepositoryConfiguration(repository, connector, new SubProgressMonitor(monitor, 20));
+ }
+
+ updateQueries(repository, connector, queries, monitor);
+ }
+
+ // it's better to remove the job from the progress view instead of having it blocked until all child jobs finish
+// if (isUser()) {
+// Job.getJobManager().join(family, monitor);
+// }
+ } catch (InterruptedException e) {
+ return Status.CANCEL_STATUS;
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ private void updateQueries(TaskRepository repository, final AbstractRepositoryConnector connector,
+ Set<RepositoryQuery> queries, IProgressMonitor monitor) {
+ if (isUser()) {
+ for (RepositoryQuery query : queries) {
+ query.setSynchronizing(true);
+ }
+ taskList.notifySynchronizationStateChanged(queries);
+ }
+
+ SynchronizeQueriesJob job = new SynchronizeQueriesJob(taskList, taskDataManager, tasksModel, connector,
+ repository, queries) {
+ @Override
+ public boolean belongsTo(Object family) {
+ return ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION == family;
+ }
+ };
+ job.setUser(isUser());
+ job.setFullSynchronization(true);
+ job.setPriority(Job.DECORATE);
+ if (isUser()) {
+ job.schedule();
+ } else {
+ job.run(new SubProgressMonitor(monitor, 80));
+ }
+ }
+
+ @Override
+ public boolean belongsTo(Object family) {
+ return ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION == family;
+ }
+
+ private void updateRepositoryConfiguration(TaskRepository repository, AbstractRepositoryConnector connector,
+ IProgressMonitor monitor) throws InterruptedException {
+ try {
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+ monitor.beginTask(MessageFormat.format(
+ Messages.SynchronizeRepositoriesJob_Updating_repository_configuration_for_X,
+ repository.getRepositoryUrl()), 100);
+ if (connector.isRepositoryConfigurationStale(repository, monitor)) {
+ connector.updateRepositoryConfiguration(repository, monitor);
+ repository.setConfigurationDate(new Date());
+ }
+ } catch (CoreException e) {
+ repository.setStatus(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Updating of repository configuration failed", e)); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public IDelegatingProgressMonitor getMonitor() {
+ return monitor;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java
new file mode 100644
index 0000000..02e0b95
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/SynchronizeTasksJob.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sync;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.commons.core.DelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.IDelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.MutexSchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryModel;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation.Direction;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation.Kind;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class SynchronizeTasksJob extends SynchronizationJob {
+
+ private final AbstractRepositoryConnector connector;
+
+ private final TaskDataManager taskDataManager;
+
+ private final TaskList taskList;
+
+ private final Set<ITask> allTasks;
+
+ private final IRepositoryManager repositoryManager;
+
+ private TaskRepository taskRepository;
+
+ private Map<String, TaskRelation[]> relationsByTaskId;
+
+ private boolean updateRelations;
+
+ private final IRepositoryModel tasksModel;
+
+ private SynchronizationSession session;
+
+ private final List<IStatus> statuses;
+
+ private final IDelegatingProgressMonitor monitor;
+
+ public SynchronizeTasksJob(TaskList taskList, TaskDataManager synchronizationManager, IRepositoryModel tasksModel,
+ AbstractRepositoryConnector connector, TaskRepository taskRepository, Set<ITask> tasks) {
+ this(taskList, synchronizationManager, tasksModel, connector, (IRepositoryManager) null, tasks);
+ this.taskRepository = taskRepository;
+ }
+
+ public SynchronizeTasksJob(TaskList taskList, TaskDataManager synchronizationManager, IRepositoryModel tasksModel,
+ AbstractRepositoryConnector connector, IRepositoryManager repositoryManager, Set<ITask> tasks) {
+ super("Synchronizing Tasks (" + tasks.size() + " tasks)"); //$NON-NLS-1$ //$NON-NLS-2$
+ this.taskList = taskList;
+ this.taskDataManager = synchronizationManager;
+ this.tasksModel = tasksModel;
+ this.connector = connector;
+ this.repositoryManager = repositoryManager;
+ this.allTasks = tasks;
+ this.statuses = new ArrayList<IStatus>();
+ setRule(new MutexSchedulingRule());
+ this.monitor = new DelegatingProgressMonitor();
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor jobMonitor) {
+ monitor.attach(jobMonitor);
+ try {
+ if (taskRepository == null) {
+ try {
+ monitor.beginTask(Messages.SynchronizeTasksJob_Processing, allTasks.size() * 100);
+ // group tasks by repository
+ Map<TaskRepository, Set<ITask>> tasksByRepository = new HashMap<TaskRepository, Set<ITask>>();
+ for (ITask task : allTasks) {
+ TaskRepository repository = repositoryManager.getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ Set<ITask> tasks = tasksByRepository.get(repository);
+ if (tasks == null) {
+ tasks = new HashSet<ITask>();
+ tasksByRepository.put(repository, tasks);
+ }
+ tasks.add(task);
+ }
+ // synchronize tasks for each repositories
+ for (TaskRepository taskRepository : tasksByRepository.keySet()) {
+ setName(MessageFormat.format(Messages.SynchronizeTasksJob_Synchronizing_Tasks__X_,
+ taskRepository.getRepositoryLabel()));
+ this.taskRepository = taskRepository;
+ Set<ITask> repositoryTasks = tasksByRepository.get(taskRepository);
+ run(repositoryTasks, new SubProgressMonitor(monitor, repositoryTasks.size() * 100));
+ }
+ } finally {
+ monitor.done();
+ }
+ } else {
+ run(allTasks, monitor);
+ }
+ } catch (OperationCanceledException e) {
+ for (ITask task : allTasks) {
+ ((AbstractTask) task).setSynchronizing(false);
+ taskList.notifyElementChanged(task);
+ }
+ return Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
+ }
+
+ private void run(Set<ITask> tasks, IProgressMonitor monitor) {
+ relationsByTaskId = new HashMap<String, TaskRelation[]>();
+ updateRelations = true;
+ runInternal(tasks, monitor);
+ synchronizedTaskRelations(monitor, relationsByTaskId);
+ }
+
+ public void synchronizedTaskRelations(IProgressMonitor monitor, Map<String, TaskRelation[]> relationsByTaskId) {
+ updateRelations = false;
+ for (String taskId : relationsByTaskId.keySet()) {
+ ITask parentTask = taskList.getTask(taskRepository.getRepositoryUrl(), taskId);
+ if (parentTask instanceof ITaskContainer) {
+ Set<ITask> removedChildTasks = new HashSet<ITask>(((ITaskContainer) parentTask).getChildren());
+
+ TaskRelation[] relations = relationsByTaskId.get(taskId);
+ for (TaskRelation relation : relations) {
+ if (relation.getDirection() == Direction.OUTWARD && relation.getKind() == Kind.CONTAINMENT) {
+ ITask task = taskList.getTask(taskRepository.getRepositoryUrl(), relation.getTaskId());
+ if (task == null) {
+ try {
+ task = synchronizeTask(monitor, relation.getTaskId());
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Synchronization failed", e)); //$NON-NLS-1$
+ }
+ } else {
+ removedChildTasks.remove(task);
+ }
+
+ if (task != null) {
+ taskList.addTask(task, (AbstractTaskContainer) parentTask);
+ }
+ }
+ }
+
+ for (ITask task : removedChildTasks) {
+ taskList.removeFromContainer((AbstractTaskContainer) parentTask, task);
+ }
+ }
+ }
+ }
+
+ private void runInternal(Set<ITask> tasks, IProgressMonitor monitor) {
+ try {
+ monitor.beginTask(Messages.SynchronizeTasksJob_Processing, tasks.size() * 100);
+ if (canGetMultiTaskData(taskRepository)) {
+ try {
+ for (ITask task : tasks) {
+ resetStatus(task);
+ }
+ synchronizeTasks(new SubProgressMonitor(monitor, tasks.size() * 100), taskRepository, tasks);
+ } catch (CoreException e) {
+ for (ITask task : tasks) {
+ updateStatus(taskRepository, task, e.getStatus());
+ }
+ }
+ } else {
+ for (ITask task : tasks) {
+ Policy.checkCanceled(monitor);
+ resetStatus(task);
+ try {
+ synchronizeTask(new SubProgressMonitor(monitor, 100), task);
+ } catch (CoreException e) {
+ updateStatus(taskRepository, task, e.getStatus());
+ }
+ }
+ }
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Synchronization failed", e)); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private boolean canGetMultiTaskData(TaskRepository taskRepository) {
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ return taskDataHandler != null && taskDataHandler.canGetMultiTaskData(taskRepository);
+ }
+
+ private void synchronizeTask(IProgressMonitor monitor, ITask task) throws CoreException {
+ monitor.subTask(MessageFormat.format(Messages.SynchronizeTasksJob_Receiving_task_X, task.getSummary()));
+ resetStatus(task);
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+ String taskId = task.getTaskId();
+ TaskData taskData = connector.getTaskData(taskRepository, taskId, monitor);
+ if (taskData != null) {
+ updateFromTaskData(taskRepository, task, taskData);
+ return;
+ }
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Connector failed to return task data for task \"" + task + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private ITask synchronizeTask(IProgressMonitor monitor, String taskId) throws CoreException {
+ monitor.subTask(MessageFormat.format(Messages.SynchronizeTasksJob_Receiving_task_X, taskId));
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+
+ TaskData taskData = connector.getTaskData(taskRepository, taskId, monitor);
+ if (taskData != null) {
+ return createFromTaskData(taskRepository, taskId, taskData);
+ }
+
+ throw new CoreException(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Connector failed to return task data for task \"" + taskId + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void resetStatus(ITask task) {
+ ((AbstractTask) task).setStatus(null);
+ taskList.notifySynchronizationStateChanged(task);
+ }
+
+ private void synchronizeTasks(IProgressMonitor monitor, final TaskRepository repository, Set<ITask> tasks)
+ throws CoreException {
+ monitor.subTask(MessageFormat.format(Messages.SynchronizeTasksJob_Receiving_X_tasks_from_X, tasks.size(),
+ repository.getRepositoryLabel()));
+
+ final Map<String, ITask> idToTask = new HashMap<String, ITask>();
+ for (ITask task : tasks) {
+ idToTask.put(task.getTaskId(), task);
+ }
+
+ TaskDataCollector collector = new TaskDataCollector() {
+ @Override
+ public void accept(TaskData taskData) {
+ ITask task = idToTask.remove(taskData.getTaskId());
+ if (task != null) {
+ updateFromTaskData(repository, task, taskData);
+ }
+ }
+ };
+
+ if (!isUser()) {
+ monitor = Policy.backgroundMonitorFor(monitor);
+ }
+ Set<String> taskIds = Collections.unmodifiableSet(new HashSet<String>(idToTask.keySet()));
+ connector.getTaskDataHandler().getMultiTaskData(repository, taskIds, collector, monitor);
+ }
+
+ private void updateFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ try {
+ taskDataManager.putUpdatedTaskData(task, taskData, isUser(), getSession());
+ if (updateRelations) {
+ Collection<TaskRelation> relations = connector.getTaskRelations(taskData);
+ if (relations != null) {
+ relationsByTaskId.put(task.getTaskId(), relations.toArray(new TaskRelation[0]));
+ }
+ }
+ } catch (CoreException e) {
+ updateStatus(taskRepository, task, e.getStatus());
+ }
+ }
+
+ private ITask createFromTaskData(TaskRepository taskRepository, String taskId, TaskData taskData)
+ throws CoreException {
+ ITask task = tasksModel.createTask(taskRepository, taskData.getTaskId());
+ ((AbstractTask) task).setSynchronizationState(SynchronizationState.INCOMING_NEW);
+ taskDataManager.putUpdatedTaskData(task, taskData, isUser(), getSession());
+ return task;
+ }
+
+ private void updateStatus(TaskRepository repository, ITask task, IStatus status) {
+ statuses.add(status);
+ ((AbstractTask) task).setStatus(status);
+ if (!isUser()) {
+ ((AbstractTask) task).setSynchronizing(false);
+ }
+ taskList.notifyElementChanged(task);
+ }
+
+ public SynchronizationSession getSession() {
+ return session;
+ }
+
+ public void setSession(SynchronizationSession session) {
+ this.session = session;
+ }
+
+ public Collection<IStatus> getStatuses() {
+ return Collections.unmodifiableCollection(statuses);
+ }
+
+ public IDelegatingProgressMonitor getMonitor() {
+ return monitor;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/messages.properties b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/messages.properties
new file mode 100644
index 0000000..fb2d725
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/sync/messages.properties
@@ -0,0 +1,24 @@
+SubmitTaskAttachmentJob_Sending_data=Sending data
+SubmitTaskAttachmentJob_Submitting_attachment=Submitting attachment
+SubmitTaskAttachmentJob_Updating_task=Updating task
+
+SubmitTaskJob_Receiving_data=Receiving data
+SubmitTaskJob_Sending_data=Sending data
+SubmitTaskJob_Submitting_task=Submitting task
+
+SynchronizeQueriesJob_Max_allowed_number_of_hits_returned_exceeded=Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.
+SynchronizeQueriesJob_Processing=Processing
+SynchronizeQueriesJob_Querying_repository=Querying repository
+SynchronizeQueriesJob_Receiving_related_tasks=Receiving related tasks
+SynchronizeQueriesJob_Synchronizing_Queries=Synchronizing Queries
+SynchronizeQueriesJob_Synchronizing_query_X=Synchronizing query: {0}
+SynchronizeQueriesJob_Updating_repository_state=Updating repository state
+
+SynchronizeRepositoriesJob_Processing=Processing
+SynchronizeRepositoriesJob_Processing_=Processing {0}
+SynchronizeRepositoriesJob_Synchronizing_Task_List=Synchronizing Task List
+SynchronizeRepositoriesJob_Updating_repository_configuration_for_X=Updating repository configuration for {0}
+SynchronizeTasksJob_Processing=Processing
+SynchronizeTasksJob_Receiving_task_X=Receiving task {0}
+SynchronizeTasksJob_Synchronizing_Tasks__X_=Synchronizing Tasks ({0})
+SynchronizeTasksJob_Receiving_X_tasks_from_X=Receiving {0} tasks from {1}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java
new file mode 100644
index 0000000..de006f9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractDuplicateDetector.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * Extend to provide task duplicate detection facilities to the task editor (e.g. Java stack trace matching).
+ *
+ * @author Gail Murphy
+ * @author Robert Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractDuplicateDetector {
+
+ private String name;
+
+ private String connectorKind;
+
+ public abstract IRepositoryQuery getDuplicatesQuery(TaskRepository repository, TaskData taskData)
+ throws CoreException;
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setConnectorKind(String kind) {
+ this.connectorKind = kind;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getConnectorKind() {
+ return this.connectorKind;
+ }
+
+ public boolean canQuery(TaskData taskData) {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java
new file mode 100644
index 0000000..7ed6a76
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractRepositoryConnector.java
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Collection;
+import java.util.Date;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+
+/**
+ * Encapsulates common operations that can be performed on a task repository. Extend to connect with a Java API or WS
+ * API for accessing the repository.
+ *
+ * Only methods that take a progress monitor can do network I/O.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Shawn Minto
+ * @since 2.0
+ */
+public abstract class AbstractRepositoryConnector {
+
+ private static final long REPOSITORY_CONFIGURATION_UPDATE_INTERVAL = 24 * 60 * 60 * 1000;
+
+ /**
+ * Returns true, if the connector provides a wizard for creating new tasks.
+ *
+ * @since 2.0
+ */
+ // TODO move this to ConnectorUi.hasNewTaskWizard()
+ public abstract boolean canCreateNewTask(TaskRepository repository);
+
+ /**
+ * Returns true, if the connector supports retrieval of tasks based on String keys.
+ *
+ * @since 2.0
+ */
+ public abstract boolean canCreateTaskFromKey(TaskRepository repository);
+
+ /**
+ * @since 3.0
+ */
+ public boolean canQuery(TaskRepository repository) {
+ return true;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean canSynchronizeTask(TaskRepository taskRepository, ITask task) {
+ return true;
+ }
+
+ /**
+ * @return the unique kind of the repository, e.g. "bugzilla"
+ * @since 2.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * The connector's summary i.e. "JIRA (supports 3.3.1 and later)"
+ *
+ * @since 2.0
+ */
+ public abstract String getLabel();
+
+ /**
+ * Can return null if URLs are not used to identify tasks.
+ */
+ public abstract String getRepositoryUrlFromTaskUrl(String taskFullUrl);
+
+ /**
+ * Returns a short label for the connector, e.g. Bugzilla.
+ *
+ * @since 2.3
+ */
+ public String getShortLabel() {
+ String label = getLabel();
+ if (label == null) {
+ return null;
+ }
+
+ int i = label.indexOf("("); //$NON-NLS-1$
+ if (i != -1) {
+ return label.substring(0, i).trim();
+ }
+
+ i = label.indexOf(" "); //$NON-NLS-1$
+ if (i != -1) {
+ return label.substring(0, i).trim();
+ }
+
+ return label;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public AbstractTaskAttachmentHandler getTaskAttachmentHandler() {
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getTaskData(TaskRepository taskRepository, String taskId, IProgressMonitor monitor)
+ throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public AbstractTaskDataHandler getTaskDataHandler() {
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public abstract String getTaskIdFromTaskUrl(String taskFullUrl);
+
+ /**
+ * Used for referring to the task in the UI.
+ */
+ public String getTaskIdPrefix() {
+ return "task"; //$NON-NLS-1$
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String[] getTaskIdsFromComment(TaskRepository repository, String comment) {
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public ITaskMapping getTaskMapping(TaskData taskData) {
+ return new TaskMapper(taskData);
+ }
+
+ /**
+ * Connectors can override to return other tasks associated with this task.
+ *
+ * @since 3.0
+ */
+ public Collection<TaskRelation> getTaskRelations(TaskData taskData) {
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public abstract String getTaskUrl(String repositoryUrl, String taskId);
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData);
+
+ /**
+ * @since 3.0
+ */
+ public boolean hasLocalCompletionState(TaskRepository taskRepository, ITask task) {
+ return false;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean hasRepositoryDueDate(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ return false;
+ }
+
+ /**
+ * Default implementation returns true every 24hrs.
+ *
+ * @return true to indicate that the repository configuration is stale and requires update
+ * @since 3.0
+ */
+ public boolean isRepositoryConfigurationStale(TaskRepository repository, IProgressMonitor monitor)
+ throws CoreException {
+ Date configDate = repository.getConfigurationDate();
+ if (configDate != null) {
+ return (new Date().getTime() - configDate.getTime()) > REPOSITORY_CONFIGURATION_UPDATE_INTERVAL;
+ }
+ return true;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean isUserManaged() {
+ return true;
+ }
+
+ /**
+ * Runs <code>query</code> on <code>repository</code>, results are passed to <code>collector</code>. If a repository
+ * does not return the full task data for a result, {@link TaskData#isPartial()} will return true.
+ *
+ * <p>
+ * Implementors must complete executing <code>query</code> before returning from this method.
+ *
+ * @param repository
+ * task repository to run query against
+ * @param query
+ * query to run
+ * @param collector
+ * callback for returning results
+ * @param session
+ * provides additional information for running the query, may be <code>null</code>
+ * @param monitor
+ * for reporting progress
+ * @return {@link Status#OK_STATUS} in case of success, an error status otherwise
+ * @throws OperationCanceledException
+ * if the query was canceled
+ * @since 3.0
+ */
+ public abstract IStatus performQuery(TaskRepository repository, IRepositoryQuery query,
+ TaskDataCollector collector, ISynchronizationSession session, IProgressMonitor monitor);
+
+ /**
+ * Hook into the synchronization process.
+ *
+ * @since 3.0
+ */
+ public void postSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask("", 1); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * Hook into the synchronization process.
+ *
+ * @since 3.0
+ */
+ public void preSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask("", 1); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * Reset and update the repository attributes from the server (e.g. products, components)
+ *
+ * @since 3.0
+ */
+ public abstract void updateRepositoryConfiguration(TaskRepository taskRepository, IProgressMonitor monitor)
+ throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskListMigrator.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskListMigrator.java
new file mode 100644
index 0000000..ab18983
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/AbstractTaskListMigrator.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Set;
+
+import org.w3c.dom.Element;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractTaskListMigrator {
+
+ public static final String KEY_QUERY = "Query"; //$NON-NLS-1$
+
+ public static final String KEY_TASK = "Task"; //$NON-NLS-1$
+
+ public static final String KEY_LAST_MOD_DATE = "LastModified"; //$NON-NLS-1$
+
+ public abstract String getTaskElementName();
+
+ public abstract Set<String> getQueryElementNames();
+
+ public abstract void migrateQuery(IRepositoryQuery query, Element element);
+
+ public abstract void migrateTask(ITask task, Element element);
+
+ public abstract String getConnectorKind();
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IAttributeContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IAttributeContainer.java
new file mode 100644
index 0000000..cf2f66d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IAttributeContainer.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Map;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IAttributeContainer {
+
+ public abstract String getAttribute(String key);
+
+ public abstract void setAttribute(String key, String value);
+
+ public abstract Map<String, String> getAttributes();
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryElement.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryElement.java
new file mode 100644
index 0000000..c8e5b8b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryElement.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IRepositoryElement extends Comparable<IRepositoryElement>, IAdaptable {
+
+ /**
+ * Returns a readable description of the element.
+ */
+ public abstract String getSummary();
+
+ /**
+ * Returns an identifier for unique to where it resides. For tasks this is an identifier unique to the repository in
+ * which the tasks resides, such as the local machine or a web service. For elements in the Task List such as
+ * queries or categories, this identifier may only be unique to that Task List.
+ */
+ public abstract String getHandleIdentifier();
+
+ /**
+ * Used for elements that reside in web services and can be used for URL-based access to resources on the local
+ * machine. Optional, can be null.
+ */
+ public abstract String getUrl();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryListener.java
new file mode 100644
index 0000000..ae34860
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryListener.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * Notified of change to the life-cycle of task repositories.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public interface IRepositoryListener {
+
+ /**
+ * A task repository has been added.
+ *
+ * @since 3.0
+ */
+ public abstract void repositoryAdded(TaskRepository repository);
+
+ /**
+ * A task repository has been removed.
+ *
+ * @since 3.0
+ */
+ public abstract void repositoryRemoved(TaskRepository repository);
+
+ /**
+ * The settings of a repository have been updated.
+ *
+ * @since 3.0
+ */
+ public abstract void repositorySettingsChanged(TaskRepository repository);
+
+ /**
+ * TODO: Refactor into general delta notification
+ *
+ * @since 3.0
+ */
+ public abstract void repositoryUrlChanged(TaskRepository repository, String oldUrl);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryManager.java
new file mode 100644
index 0000000..719a3cf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryManager.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IRepositoryManager {
+
+ public abstract void addListener(IRepositoryListener listener);
+
+ public abstract void addRepository(TaskRepository repository);
+
+ public abstract List<TaskRepository> getAllRepositories();
+
+ public abstract Set<TaskRepository> getRepositories(String connectorKind);
+
+ public abstract TaskRepository getRepository(String connectorKind, String repositoryUrl);
+
+ public abstract AbstractRepositoryConnector getRepositoryConnector(String connectorKind);
+
+ public abstract Collection<AbstractRepositoryConnector> getRepositoryConnectors();
+
+ public abstract void removeListener(IRepositoryListener listener);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryModel.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryModel.java
new file mode 100644
index 0000000..e2add13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryModel.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * @since 3.0
+ * @author Steffen Pingel
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IRepositoryModel {
+
+ /**
+ * @since 3.0
+ */
+ public abstract IRepositoryQuery createRepositoryQuery(TaskRepository taskRepository);
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITask createTask(TaskRepository taskRepository, String taskId);
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITask getTask(TaskRepository taskRepository, String taskId);
+
+ /**
+ * Gets a task by its {@link ITask#getTaskKey() key}.
+ *
+ * @return the task or null if no such task was found
+ * @since 3.2
+ */
+ public abstract ITask getTaskByKey(TaskRepository repository, String taskKey);
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITask getTask(String handle);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryPerson.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryPerson.java
new file mode 100644
index 0000000..8a005fe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryPerson.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IRepositoryPerson {
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getName();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getPersonId();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getRepositoryUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskRepository getTaskRepository();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setName(String name);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryQuery.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryQuery.java
new file mode 100644
index 0000000..88a7dab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/IRepositoryQuery.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface IRepositoryQuery extends IAttributeContainer {
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getRepositoryUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setUrl(String url);
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getSummary();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setSummary(String summary);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITask.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITask.java
new file mode 100644
index 0000000..1d58964
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITask.java
@@ -0,0 +1,338 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Date;
+
+import org.eclipse.mylyn.internal.tasks.core.Messages;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITask extends IRepositoryElement, IAttributeContainer {
+
+ /**
+ * @since 3.0
+ */
+ public enum SynchronizationState {
+ CONFLICT, INCOMING, INCOMING_NEW, OUTGOING, OUTGOING_NEW, SYNCHRONIZED;
+
+ /**
+ * @since 3.0
+ */
+ public boolean isIncoming() {
+ switch (this) {
+ case INCOMING:
+ case INCOMING_NEW:
+ case CONFLICT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isOutgoing() {
+ switch (this) {
+ case OUTGOING:
+ case OUTGOING_NEW:
+ case CONFLICT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isSynchronized() {
+ switch (this) {
+ case SYNCHRONIZED:
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public enum PriorityLevel {
+ P1, P2, P3, P4, P5;
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case P1:
+ return "P1"; //$NON-NLS-1$
+ case P2:
+ return "P2"; //$NON-NLS-1$
+ case P3:
+ return "P3"; //$NON-NLS-1$
+ case P4:
+ return "P4"; //$NON-NLS-1$
+ case P5:
+ return "P5"; //$NON-NLS-1$
+ default:
+ return "P3"; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getDescription() {
+ switch (this) {
+ case P1:
+ return Messages.PriorityLevel_Very_High;
+ case P2:
+ return Messages.PriorityLevel_High;
+ case P3:
+ return Messages.PriorityLevel_Normal;
+ case P4:
+ return Messages.PriorityLevel_Low;
+ case P5:
+ return Messages.PriorityLevel_Very_Low;
+ default:
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static PriorityLevel fromLevel(int level) {
+ if (level <= 1) {
+ return P1;
+ }
+ if (level == 2) {
+ return P2;
+ }
+ if (level == 3) {
+ return P3;
+ }
+ if (level == 4) {
+ return P4;
+ }
+ if (level >= 5) {
+ return P5;
+ }
+ return getDefault();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static PriorityLevel fromString(String string) {
+ if ("P1".equals(string)) { //$NON-NLS-1$
+ return P1;
+ }
+ if ("P2".equals(string)) { //$NON-NLS-1$
+ return P2;
+ }
+ if ("P3".equals(string)) { //$NON-NLS-1$
+ return P3;
+ }
+ if ("P4".equals(string)) { //$NON-NLS-1$
+ return P4;
+ }
+ if ("P5".equals(string)) { //$NON-NLS-1$
+ return P5;
+ }
+ return getDefault();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static PriorityLevel fromDescription(String string) {
+ if (string == null) {
+ return null;
+ }
+ if (string.equals(Messages.PriorityLevel_Very_High)) {
+ return P1;
+ }
+ if (string.equals(Messages.PriorityLevel_High)) {
+ return P2;
+ }
+ if (string.equals(Messages.PriorityLevel_Normal)) {
+ return P3;
+ }
+ if (string.equals(Messages.PriorityLevel_Low)) {
+ return P4;
+ }
+ if (string.equals(Messages.PriorityLevel_Very_Low)) {
+ return P5;
+ }
+ return getDefault();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static PriorityLevel getDefault() {
+ return P3;
+ }
+ }
+
+ /**
+ * Returns the date that the task was completed.
+ *
+ * @since 3.0
+ */
+ public abstract Date getCompletionDate();
+
+ /**
+ * Returns the identifier that uniquely distinguishes the repository connector associated with this task.
+ *
+ * @since 3.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * Returns the date that this task was created.
+ *
+ * @since 3.0
+ */
+ public abstract Date getCreationDate();
+
+ /**
+ * Returns the date after which this task will become overdue.
+ *
+ * @since 3.0
+ */
+ public abstract Date getDueDate();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getHandleIdentifier();
+
+ /**
+ * Returns the date that the repository contents of this task were last modified.
+ *
+ * @since 3.0
+ */
+ public abstract Date getModificationDate();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getOwner();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getPriority();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getRepositoryUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getSummary();
+
+ /**
+ * @since 3.0
+ */
+ public abstract SynchronizationState getSynchronizationState();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getTaskId();
+
+ /**
+ * User identifiable key for the task to be used in UI facilities such as label displays and hyperlinked references.
+ * Can return the same as the ID (e.g. in the case of Bugzilla). Can return null if no such label exists.
+ *
+ * @since 3.0
+ */
+ public abstract String getTaskKey();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getTaskKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isActive();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isCompleted();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setCompletionDate(Date completionDate);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setCreationDate(Date date);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setDueDate(Date date);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setModificationDate(Date modificationDate);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setOwner(String owner);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setPriority(String priority);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setSummary(String summary);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setTaskKind(String kind);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setUrl(String taskUrl);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setTaskKey(String taskKey);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivationListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivationListener.java
new file mode 100644
index 0000000..a57f290
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivationListener.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public interface ITaskActivationListener {
+
+ /**
+ * @since 3.0
+ */
+ public abstract void preTaskActivated(ITask task);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void preTaskDeactivated(ITask task);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void taskActivated(ITask task);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void taskDeactivated(ITask task);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivityListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivityListener.java
new file mode 100644
index 0000000..fb0e56c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivityListener.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * Notified of task activity changes.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Shawn Minto
+ * @since 2.0
+ */
+public interface ITaskActivityListener {
+
+ /**
+ * @since 3.0
+ */
+ public abstract void activityReset();
+
+ /**
+ * Warning: This is called frequently (i.e. every 15s) Implementers are responsible for launching jobs for long
+ * running activity.
+ *
+ * @since 3.0
+ */
+ public abstract void elapsedTimeUpdated(ITask task, long newElapsedTime);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivityManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivityManager.java
new file mode 100644
index 0000000..02dd0ca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskActivityManager.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Calendar;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public interface ITaskActivityManager {
+
+ /**
+ * activate the given <code>task</code>
+ */
+ public abstract void activateTask(ITask task);
+
+ /**
+ * deactivate the currently active task (if any). There are no negative side effects if this method is called when
+ * no task is active
+ */
+ public abstract void deactivateActiveTask();
+
+ /**
+ * deactivate the given task
+ */
+ public abstract void deactivateTask(ITask task);
+
+ /**
+ * returns all tasks that where active between <code>start</code> and <code>end</end> (exclusive)
+ * both ranges are floored to the hour
+ */
+ public abstract Set<AbstractTask> getActiveTasks(Calendar start, Calendar end);
+
+ /**
+ * @return the currently active task if any
+ */
+ public abstract ITask getActiveTask();
+
+ /**
+ * returns all tasks with a due date set
+ */
+ public abstract Set<ITask> getAllDueTasks();
+
+ /**
+ * returns all tasks due between the given dates
+ */
+ public abstract Set<ITask> getDueTasks(Calendar start, Calendar end);
+
+ /** total elapsed time based on activation history */
+ public abstract long getElapsedTime(ITask task);
+
+ /**
+ * return the total elapsed time based on activation history between <code>start</code> and <code>end</code> If task
+ * is null, the elapsed time for the range with no task active is returned
+ */
+ public abstract long getElapsedTime(ITask task, Calendar start, Calendar end);
+
+ public abstract void addActivityListener(ITaskActivityListener listener);
+
+ public abstract void removeActivityListener(ITaskActivityListener listener);
+
+ public abstract void addActivationListener(ITaskActivationListener listener);
+
+ public abstract void removeActivationListener(ITaskActivationListener listener);
+
+ /**
+ * @param task
+ * cannot be null
+ * @return whether the task is the single currently active task
+ */
+ public abstract boolean isActive(ITask task);
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskAttachment.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskAttachment.java
new file mode 100644
index 0000000..f29862b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskAttachment.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Date;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITaskAttachment {
+
+ /**
+ * @since 3.0
+ */
+ public abstract IRepositoryPerson getAuthor();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getComment();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getContentType();
+
+ /**
+ * @since 3.0
+ */
+ public abstract Date getCreationDate();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getDescription();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getFileName();
+
+ /**
+ * @since 3.0
+ */
+ public abstract long getLength();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getRepositoryUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITask getTask();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskAttribute getTaskAttribute();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskRepository getTaskRepository();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isDeprecated();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isPatch();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setAuthor(IRepositoryPerson author);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setContentType(String contentType);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setCreationDate(Date creationDate);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setDeprecated(boolean deprecated);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setDescription(String description);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setFileName(String fileName);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setLength(long length);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setPatch(boolean patch);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setUrl(String url);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskComment.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskComment.java
new file mode 100644
index 0000000..e200401
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskComment.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Date;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * A comment posted by a user on a task.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITaskComment {
+
+ /**
+ * @since 3.0
+ */
+ public abstract IRepositoryPerson getAuthor();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract Date getCreationDate();
+
+ /**
+ * @since 3.0
+ */
+ public abstract int getNumber();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getRepositoryUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITask getTask();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskAttribute getTaskAttribute();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskRepository getTaskRepository();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getText();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setAuthor(IRepositoryPerson author);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setCreationDate(Date creationDate);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setNumber(int number);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setText(String text);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setUrl(String url);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskContainer.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskContainer.java
new file mode 100644
index 0000000..8954ae9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskContainer.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Collection;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITaskContainer {
+
+ /**
+ * Returns the children of this task, as defined by a containment hierarchy such as the Task List's categories,
+ * queries and substasks. Never returns null.
+ *
+ * @since 3.0
+ */
+ public abstract Collection<ITask> getChildren();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java
new file mode 100644
index 0000000..af7d4eb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/ITaskMapping.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients. Extend {@link TaskMapping} instead.
+ */
+public interface ITaskMapping {
+
+ public void merge(ITaskMapping source);
+
+ public abstract List<String> getCc();
+
+ public abstract Date getCompletionDate();
+
+ public abstract String getComponent();
+
+ public abstract Date getCreationDate();
+
+ public abstract String getDescription();
+
+ public abstract Date getDueDate();
+
+ public abstract List<String> getKeywords();
+
+ public abstract Date getModificationDate();
+
+ public abstract String getOwner();
+
+ public abstract String getPriority();
+
+ public abstract PriorityLevel getPriorityLevel();
+
+ public abstract String getProduct();
+
+ public abstract String getReporter();
+
+ public abstract String getResolution();
+
+ /**
+ * @since 3.2
+ */
+ public abstract String getSeverity();
+
+ public abstract String getSummary();
+
+ public abstract String getStatus();
+
+ public abstract TaskData getTaskData();
+
+ public abstract String getTaskKey();
+
+ public abstract String getTaskKind();
+
+ public abstract String getTaskStatus();
+
+ public abstract String getTaskUrl();
+
+ /**
+ * @since 3.2
+ */
+ public abstract String getVersion();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryResponse.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryResponse.java
new file mode 100644
index 0000000..a9afe19
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryResponse.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * Clients may subclass.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class RepositoryResponse {
+
+ public enum ResponseKind {
+ TASK_CREATED, TASK_UPDATED;
+ };
+
+ private final String taskId;
+
+ private final ResponseKind reposonseKind;
+
+ public RepositoryResponse(ResponseKind reposonseKind, String taskId) {
+ this.reposonseKind = reposonseKind;
+ this.taskId = taskId;
+ }
+
+ public RepositoryResponse() {
+ this(null, null);
+ }
+
+ public String getTaskId() {
+ return taskId;
+ }
+
+ public ResponseKind getReposonseKind() {
+ return reposonseKind;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryStatus.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryStatus.java
new file mode 100644
index 0000000..c08c948
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryStatus.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Utility for working and capturing status specific to repository connections.
+ *
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public class RepositoryStatus extends Status {
+
+ public final static int ERROR_IO = 5;
+
+ public final static int ERROR_NETWORK = 11;
+
+ public final static int ERROR_PERMISSION_DENIED = 12;
+
+ /**
+ * requires construction with repositoryUrl and error message
+ */
+ public final static int ERROR_REPOSITORY = 1;
+
+ public final static int ERROR_REPOSITORY_LOGIN = 3;
+
+ public final static int ERROR_REPOSITORY_NOT_FOUND = 4;
+
+ public final static int OPERATION_CANCELLED = 8;
+
+ public final static int REPOSITORY_COLLISION = 6;
+
+ public final static int REPOSITORY_COMMENT_REQUIRED = 9;
+
+ public final static int REPOSITORY_LOGGED_OUT = 10;
+
+ public final static int ERROR_INTERNAL = 7;
+
+ private String htmlMessage;
+
+ protected String repositoryUrl;
+
+ public RepositoryStatus(TaskRepository repository, int severity, String pluginId, int code, String message) {
+ this(repository.getRepositoryUrl(), severity, pluginId, code, message, null);
+ }
+
+ public RepositoryStatus(TaskRepository repository, int severity, String pluginId, int code, String message,
+ Throwable e) {
+ this(repository.getRepositoryUrl(), severity, pluginId, code, message, e);
+ }
+
+ public RepositoryStatus(String repositoryUrl, int severity, String pluginId, int code, String message) {
+ this(repositoryUrl, severity, pluginId, code, message, null);
+ }
+
+ public RepositoryStatus(String repositoryUrl, int severity, String pluginId, int code, String message, Throwable e) {
+ super(severity, pluginId, code, message, e);
+
+ if (repositoryUrl == null) {
+ throw new IllegalArgumentException("repositoryUrl must not be null"); //$NON-NLS-1$
+ }
+
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ /**
+ * Constructs a status object with a message.
+ */
+ public RepositoryStatus(int severity, String pluginId, int code, String message) {
+ super(severity, pluginId, code, message, null);
+ }
+
+ /**
+ * Constructs a status object with a message and an exception. that caused the error.
+ */
+ public RepositoryStatus(int severity, String pluginId, int code, String message, Throwable e) {
+ super(severity, pluginId, code, message, e);
+ }
+
+ /**
+ * Returns the message that is relevant to the code of this status.
+ */
+ @Override
+ public String getMessage() {
+ String message = super.getMessage();
+ if (message != null && !"".equals(message)) { //$NON-NLS-1$
+ return message;
+ }
+
+ Throwable exception = getException();
+ if (exception != null) {
+ if (exception.getMessage() != null) {
+ return exception.getMessage();
+ }
+ return exception.toString();
+ }
+
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ protected void setMessage(String message) {
+ super.setMessage((message != null) ? message : ""); //$NON-NLS-1$
+ }
+
+ protected void setHtmlMessage(String htmlMessage) {
+ this.htmlMessage = htmlMessage;
+ }
+
+ public String getHtmlMessage() {
+ return htmlMessage;
+ }
+
+ public boolean isHtmlMessage() {
+ return htmlMessage != null;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public static RepositoryStatus createInternalError(String pluginId, String message, Throwable t) {
+ return new RepositoryStatus(IStatus.ERROR, pluginId, RepositoryStatus.ERROR_INTERNAL, message, t);
+ }
+
+ public static RepositoryStatus createHtmlStatus(int severity, String pluginId, int code, String message,
+ String htmlMessage) {
+ if (htmlMessage == null) {
+ throw new IllegalArgumentException("htmlMessage must not be null"); //$NON-NLS-1$
+ }
+
+ RepositoryStatus status = new RepositoryStatus(severity, pluginId, code, message);
+ status.setHtmlMessage(htmlMessage);
+ return status;
+ }
+
+ public static RepositoryStatus createStatus(TaskRepository repository, int severity, String pluginId, String message) {
+ return createStatus(repository.getRepositoryUrl(), severity, pluginId, message);
+ }
+
+ public static RepositoryStatus createStatus(String repositoryUrl, int severity, String pluginId, String message) {
+ return new RepositoryStatus(repositoryUrl, severity, pluginId, RepositoryStatus.ERROR_REPOSITORY, message);
+ }
+
+ public static RepositoryStatus createLoginError(String repositoryUrl, String pluginId) {
+ return new RepositoryStatus(repositoryUrl, IStatus.ERROR, pluginId, RepositoryStatus.ERROR_REPOSITORY_LOGIN,
+ NLS.bind("Unable to login to {0}. Please validate credentials via Task Repositories view.", //$NON-NLS-1$
+ repositoryUrl));
+ }
+
+ public static RepositoryStatus createNotFoundError(String repositoryUrl, String pluginId) {
+ return new RepositoryStatus(repositoryUrl, IStatus.ERROR, pluginId,
+ RepositoryStatus.ERROR_REPOSITORY_NOT_FOUND, NLS.bind("Repository {0} could not be found.", //$NON-NLS-1$
+ repositoryUrl));
+ }
+
+ public static RepositoryStatus createCollisionError(String repositoryUrl, String pluginId) {
+ return new RepositoryStatus(
+ repositoryUrl,
+ IStatus.ERROR,
+ pluginId,
+ RepositoryStatus.REPOSITORY_COLLISION,
+ NLS.bind(
+ "Mid-air collision occurred while submitting to {0}.\n\nSynchronize task and re-submit changes.", //$NON-NLS-1$
+ repositoryUrl));
+ }
+
+ public static RepositoryStatus createCommentRequiredError(String repositoryUrl, String pluginId) {
+ return new RepositoryStatus(repositoryUrl, IStatus.ERROR, pluginId,
+ RepositoryStatus.REPOSITORY_COMMENT_REQUIRED,
+ "You have to specify a new comment when making this change. Please comment on the reason for this change."); //$NON-NLS-1$
+ }
+
+ public static RepositoryStatus createHtmlStatus(String repositoryUrl, int severity, String pluginId, int code,
+ String message, String htmlMessage) {
+ if (htmlMessage == null) {
+ throw new IllegalArgumentException("htmlMessage must not be null"); //$NON-NLS-1$
+ }
+
+ RepositoryStatus status = new RepositoryStatus(repositoryUrl, severity, pluginId, code, message);
+ status.setHtmlMessage(htmlMessage);
+ return status;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryTemplate.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryTemplate.java
new file mode 100644
index 0000000..412834b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/RepositoryTemplate.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.core;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Specifies attributes for a task repository.
+ *
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public final class RepositoryTemplate {
+
+ public final Map<String, String> genericAttributes = new LinkedHashMap<String, String>();
+
+ public final String label;
+
+ public final String repositoryUrl;
+
+ public final String newTaskUrl;
+
+ public final String taskPrefixUrl;
+
+ public final String taskQueryUrl;
+
+ public final String newAccountUrl;
+
+ public final boolean anonymous;
+
+ public final String version;
+
+ public final boolean addAutomatically;
+
+ public final String characterEncoding;
+
+ public RepositoryTemplate(String label, String repositoryUrl, String characterEncoding, String version,
+ String newTaskUrl, String taskPrefix, String taskQuery, String newAccountUrl, boolean anonymous,
+ boolean addAutomatically) {
+ this.label = label;
+ this.repositoryUrl = repositoryUrl;
+ this.newTaskUrl = newTaskUrl;
+ this.taskPrefixUrl = taskPrefix;
+ this.taskQueryUrl = taskQuery;
+ this.newAccountUrl = newAccountUrl;
+ this.version = version;
+ this.anonymous = anonymous;
+ this.characterEncoding = characterEncoding;
+ this.addAutomatically = addAutomatically;
+ }
+
+ public void addAttribute(String name, String value) {
+ genericAttributes.put(name, value);
+ }
+
+ public String getAttribute(String name) {
+ return genericAttributes.get(name);
+ }
+
+ public Map<String, String> getAttributes() {
+ return this.genericAttributes;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java
new file mode 100644
index 0000000..127a667
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskActivationAdapter.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * @author Rob Elves
+ * @since 3.0
+ */
+public class TaskActivationAdapter implements ITaskActivationListener {
+
+ public void preTaskActivated(ITask task) {
+ }
+
+ public void preTaskDeactivated(ITask task) {
+ }
+
+ public void taskActivated(ITask task) {
+ }
+
+ public void taskDeactivated(ITask task) {
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskActivityAdapter.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskActivityAdapter.java
new file mode 100644
index 0000000..43eba8a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskActivityAdapter.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskActivityAdapter implements ITaskActivityListener {
+
+ public void activityReset() {
+ }
+
+ public void elapsedTimeUpdated(ITask task, long newElapsedTime) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskMapping.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskMapping.java
new file mode 100644
index 0000000..c2b3896
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskMapping.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * Clients may subclass.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskMapping implements ITaskMapping {
+
+ /**
+ * @since 3.0
+ */
+ public void merge(ITaskMapping source) {
+ // ignore
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Date getCompletionDate() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getComponent() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Date getCreationDate() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getDescription() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Date getDueDate() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Date getModificationDate() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getOwner() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public PriorityLevel getPriorityLevel() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getProduct() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getSummary() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskData getTaskData() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getTaskKey() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getTaskKind() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getTaskUrl() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public List<String> getCc() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public List<String> getKeywords() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getReporter() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getResolution() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getTaskStatus() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getStatus() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getPriority() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.2
+ */
+ public String getSeverity() {
+ // ignore
+ return null;
+ }
+
+ /**
+ * @since 3.2
+ */
+ public String getVersion() {
+ // ignore
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepository.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepository.java
new file mode 100644
index 0000000..a9da8d3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepository.java
@@ -0,0 +1,926 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.core;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.equinox.security.storage.EncodingUtils;
+import org.eclipse.equinox.security.storage.ISecurePreferences;
+import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
+import org.eclipse.equinox.security.storage.StorageException;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryPerson;
+
+/**
+ * Note that task repositories use Strings for storing time stamps because using Date objects led to the following
+ * problems:
+ * <ul>
+ * <li>Often we are unable to get the time zone of the repository so interpreting the date string correctly doesn't
+ * work.</li>
+ * <li>Even if we do know the time zone information the local clock may be wrong. This can cause lost incoming when
+ * asking the repository for all changes since date X.</li>
+ * <li>The solution we have come up with thus far is not to interpret the date as a DATE object but rather simply use
+ * the date string given to us by the repository itself.</li>
+ * </ul>
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ * @since 2.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+ at SuppressWarnings("deprecation")
+public final class TaskRepository extends PlatformObject {
+
+ public static final String DEFAULT_CHARACTER_ENCODING = "UTF-8"; //$NON-NLS-1$
+
+ private static final String USERNAME = ".username"; //$NON-NLS-1$
+
+ private static final String PASSWORD = ".password"; //$NON-NLS-1$
+
+ private static final String SAVE_PASSWORD = ".savePassword"; //$NON-NLS-1$
+
+ private static final String ENABLED = ".enabled"; //$NON-NLS-1$
+
+ private static final String AUTH_REPOSITORY = "org.eclipse.mylyn.tasklist.repositories"; //$NON-NLS-1$
+
+ // transient
+ private IStatus errorStatus = null;
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
+ * credentials
+ */
+ @Deprecated
+ public static final String AUTH_PASSWORD = AUTH_REPOSITORY + PASSWORD;
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
+ * credentials
+ */
+ @Deprecated
+ public static final String AUTH_USERNAME = AUTH_REPOSITORY + USERNAME;
+
+ @Deprecated
+ public static final String ANONYMOUS_LOGIN = "org.eclipse.mylyn.tasklist.repositories.anonymous"; //$NON-NLS-1$
+
+ private static final String AUTH_HTTP = "org.eclipse.mylyn.tasklist.repositories.httpauth"; //$NON-NLS-1$
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
+ * credentials
+ */
+ @Deprecated
+ public static final String AUTH_HTTP_PASSWORD = AUTH_HTTP + PASSWORD;
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
+ * credentials
+ */
+ @Deprecated
+ public static final String AUTH_HTTP_USERNAME = AUTH_HTTP + USERNAME;
+
+ public static final String NO_VERSION_SPECIFIED = "unknown"; //$NON-NLS-1$
+
+ private static final String AUTH_SCHEME = "Basic"; //$NON-NLS-1$
+
+ private static final String AUTH_REALM = ""; //$NON-NLS-1$
+
+ private static final URL DEFAULT_URL;
+
+ private static final String PROPERTY_CONFIG_TIMESTAMP = "org.eclipse.mylyn.tasklist.repositories.configuration.timestamp"; //$NON-NLS-1$
+
+ public static final String PROXY_USEDEFAULT = "org.eclipse.mylyn.tasklist.repositories.proxy.usedefault"; //$NON-NLS-1$
+
+ public static final String PROXY_HOSTNAME = "org.eclipse.mylyn.tasklist.repositories.proxy.hostname"; //$NON-NLS-1$
+
+ public static final String PROXY_PORT = "org.eclipse.mylyn.tasklist.repositories.proxy.port"; //$NON-NLS-1$
+
+ private static final String AUTH_PROXY = "org.eclipse.mylyn.tasklist.repositories.proxy"; //$NON-NLS-1$
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
+ * credentials
+ */
+ @Deprecated
+ public static final String PROXY_USERNAME = AUTH_PROXY + USERNAME;
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} to access
+ * credentials
+ */
+ @Deprecated
+ public static final String PROXY_PASSWORD = AUTH_PROXY + PASSWORD;
+
+ public static final String OFFLINE = "org.eclipse.mylyn.tasklist.repositories.offline"; //$NON-NLS-1$
+
+ // HACK: Lock used to work around race condition in
+ // Platform.add/get/flushAuthorizationInfo()
+ private static final Object LOCK = new Object();
+
+ private final Set<PropertyChangeListener> propertyChangeListeners = new HashSet<PropertyChangeListener>();
+
+ // HACK: private credentials for headless operation
+ private static Map<String, Map<String, String>> credentials = new HashMap<String, Map<String, String>>();
+
+ static {
+ URL url = null;
+ try {
+ url = new URL("http://eclipse.org/mylyn"); //$NON-NLS-1$
+ } catch (Exception ex) {
+ // TODO ?
+ }
+ DEFAULT_URL = url;
+ }
+
+ private static String getKeyPrefix(AuthenticationType type) {
+ switch (type) {
+ case HTTP:
+ return AUTH_HTTP;
+ case PROXY:
+ return AUTH_PROXY;
+ case REPOSITORY:
+ return AUTH_REPOSITORY;
+ }
+ throw new IllegalArgumentException("Unknown authentication type: " + type); //$NON-NLS-1$
+ }
+
+ private boolean isCachedUserName;
+
+ private String cachedUserName;
+
+ private final Map<String, String> properties = new LinkedHashMap<String, String>();
+
+ /**
+ * Stores properties that are not persisted. Note that this map is currently cleared when flushCredentials() is
+ * invoked.
+ */
+ private final Map<String, String> transientProperties = new HashMap<String, String>();
+
+ /*
+ * TODO: should be externalized and added to extension point, see bug 183606
+ */
+ private boolean isBugRepository = false;
+
+ private transient volatile boolean updating;
+
+ public TaskRepository(String connectorKind, String repositoryUrl) {
+ this(connectorKind, repositoryUrl, NO_VERSION_SPECIFIED);
+ }
+
+ /**
+ * @deprecated use {@link #setProperty(String, String)} instead of passing a map
+ */
+ @Deprecated
+ public TaskRepository(String kind, String serverUrl, Map<String, String> properties) {
+ setProperty(IRepositoryConstants.PROPERTY_CONNECTOR_KIND, kind);
+ setProperty(IRepositoryConstants.PROPERTY_URL, serverUrl);
+ this.properties.putAll(properties);
+ // use platform proxy by default (headless will need to set this to false)
+ this.setProperty(TaskRepository.PROXY_USEDEFAULT, new Boolean(true).toString());
+ }
+
+ /**
+ * for testing purposes sets repository time zone to local default time zone sets character encoding to
+ * DEFAULT_CHARACTER_ENCODING
+ */
+ @Deprecated
+ public TaskRepository(String kind, String serverUrl, String version) {
+ this(kind, serverUrl, version, DEFAULT_CHARACTER_ENCODING, TimeZone.getDefault().getID());
+ }
+
+ @Deprecated
+ public TaskRepository(String connectorKind, String repositoryUrl, String version, String encoding, String timeZoneId) {
+ Assert.isNotNull(connectorKind);
+ Assert.isNotNull(repositoryUrl);
+ setProperty(IRepositoryConstants.PROPERTY_CONNECTOR_KIND, connectorKind);
+ setProperty(IRepositoryConstants.PROPERTY_URL, repositoryUrl);
+ setProperty(IRepositoryConstants.PROPERTY_VERSION, version);
+ setProperty(IRepositoryConstants.PROPERTY_ENCODING, encoding);
+ setProperty(IRepositoryConstants.PROPERTY_TIMEZONE, timeZoneId);
+ // use platform proxy by default (headless will need to set this to false)
+ this.setProperty(TaskRepository.PROXY_USEDEFAULT, new Boolean(true).toString());
+
+ // for backwards compatibility to versions prior to 2.2
+ this.setProperty(AUTH_REPOSITORY + SAVE_PASSWORD, String.valueOf(true));
+ this.setProperty(AUTH_HTTP + SAVE_PASSWORD, String.valueOf(true));
+ this.setProperty(AUTH_PROXY + SAVE_PASSWORD, String.valueOf(true));
+ }
+
+ private ISecurePreferences getSecurePreferences() {
+ ISecurePreferences securePreferences = SecurePreferencesFactory.getDefault()
+ .node(ITasksCoreConstants.ID_PLUGIN);
+ securePreferences = securePreferences.node(EncodingUtils.encodeSlashes(getRepositoryUrl()));
+ return securePreferences;
+ }
+
+ private void addAuthInfo(String username, String password, String userProperty, String passwordProperty) {
+ synchronized (LOCK) {
+ if (Platform.isRunning()) {
+ if (useSecureStorage()) {
+ try {
+ ISecurePreferences securePreferences = getSecurePreferences();
+ if (userProperty.equals(getKeyPrefix(AuthenticationType.REPOSITORY) + USERNAME)) {
+ this.setProperty(userProperty, username);
+ } else {
+ securePreferences.put(userProperty, username, false);
+ }
+ securePreferences.put(passwordProperty, password, true);
+ } catch (StorageException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not store authorization credentials", e)); //$NON-NLS-1$
+ }
+ } else {
+ Map<String, String> map = getAuthInfo();
+ if (map == null) {
+ map = new HashMap<String, String>();
+ }
+ try {
+ try {
+ map.put(userProperty, username);
+ map.put(passwordProperty, password);
+ Platform.addAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM, AUTH_SCHEME, map);
+ } catch (MalformedURLException ex) {
+ Platform.addAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(), AUTH_SCHEME, map);
+ }
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not set authorization credentials", e)); //$NON-NLS-1$
+ }
+ }
+ } else {
+ Map<String, String> headlessCreds = credentials.get(getRepositoryUrl());
+ if (headlessCreds == null) {
+ headlessCreds = new HashMap<String, String>();
+ credentials.put(getRepositoryUrl(), headlessCreds);
+ }
+ headlessCreds.put(userProperty, username);
+ headlessCreds.put(passwordProperty, password);
+ }
+ }
+ }
+
+ @SuppressWarnings( { "unchecked" })
+ private Map<String, String> getAuthInfo() {
+ synchronized (LOCK) {
+ if (Platform.isRunning()) {
+ try {
+ return Platform.getAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM, AUTH_SCHEME);
+ } catch (MalformedURLException ex) {
+ return Platform.getAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(), AUTH_SCHEME);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not retrieve authorization credentials", e)); //$NON-NLS-1$
+ }
+ } else {
+ Map<String, String> headlessCreds = credentials.get(getRepositoryUrl());
+ if (headlessCreds == null) {
+ headlessCreds = new HashMap<String, String>();
+ credentials.put(getRepositoryUrl(), headlessCreds);
+ }
+ return headlessCreds;
+ }
+ return null;
+ }
+ }
+
+ /**
+ * @deprecated use {@code flushAuthenticationCredentials()}
+ */
+ @Deprecated
+ public void clearCredentials() {
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object == this) {
+ return true;
+ }
+ if (object instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) object;
+ return getConnectorKind().equals(repository.getConnectorKind())
+ && getRepositoryUrl().equals(repository.getRepositoryUrl());
+ }
+ return false;
+ }
+
+ public void flushAuthenticationCredentials() {
+ // legacy support for versions prior to 2.2 that did not set the enable flag
+ setProperty(getKeyPrefix(AuthenticationType.HTTP) + ENABLED, null);
+ setProperty(getKeyPrefix(AuthenticationType.PROXY) + ENABLED, null);
+ setProperty(getKeyPrefix(AuthenticationType.REPOSITORY) + ENABLED, null);
+
+ synchronized (LOCK) {
+ isCachedUserName = false;
+ transientProperties.clear();
+
+ if (Platform.isRunning()) {
+ if (useSecureStorage()) {
+ if (Platform.isRunning()) {
+ ISecurePreferences securePreferences = getSecurePreferences();
+ securePreferences.removeNode();
+ this.setProperty(AuthenticationType.REPOSITORY + USERNAME, ""); //$NON-NLS-1$
+ } else {
+ Map<String, String> headlessCreds = credentials.get(getRepositoryUrl());
+ if (headlessCreds != null) {
+ headlessCreds.clear();
+ }
+ }
+ } else {
+ try {
+ try {
+ Platform.flushAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM, AUTH_SCHEME);
+ } catch (MalformedURLException ex) {
+ Platform.flushAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(), AUTH_SCHEME);
+ }
+ } catch (CoreException e) {
+ // FIXME propagate exception?
+ StatusHandler.fail(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not flush authorization credentials", e)); //$NON-NLS-1$
+ }
+ }
+ } else {
+ Map<String, String> headlessCreds = credentials.get(getRepositoryUrl());
+ if (headlessCreds != null) {
+ headlessCreds.clear();
+ }
+ }
+ }
+ }
+
+ private boolean useSecureStorage() {
+ String useSecure = getProperty(ITasksCoreConstants.PROPERTY_USE_SECURE_STORAGE);
+ if (useSecure != null) {
+ return "true".equals(useSecure); //$NON-NLS-1$
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ private String getAuthInfo(String property) {
+ synchronized (LOCK) {
+ if (Platform.isRunning()) {
+ if (useSecureStorage()) {
+ String propertyValue = null;
+ if (property.equals(getKeyPrefix(AuthenticationType.REPOSITORY) + USERNAME)) {
+ propertyValue = this.getProperty(property);
+ } else {
+ try {
+ ISecurePreferences securePreferences = getSecurePreferences();
+ propertyValue = securePreferences.get(property, null);
+ } catch (StorageException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not retrieve authorization credentials", e)); //$NON-NLS-1$
+ }
+ if (propertyValue == null) {
+ propertyValue = getFromLegacyKeystore(property);
+ }
+ }
+ return propertyValue;
+ } else {
+ try {
+ Map<String, String> map = Platform.getAuthorizationInfo(new URL(getRepositoryUrl()),
+ AUTH_REALM, AUTH_SCHEME);
+ if (map != null) {
+ String propertyValue = map.get(property);
+ return propertyValue;
+ }
+ } catch (MalformedURLException ex) {
+ Map<String, String> map = Platform.getAuthorizationInfo(DEFAULT_URL, getRepositoryUrl(),
+ AUTH_SCHEME);
+ if (map != null) {
+ String propertyValue = map.get(property);
+ return propertyValue;
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not retrieve authorization credentials", e)); //$NON-NLS-1$
+ }
+ return null;
+ }
+ } else {
+ Map<String, String> headlessCreds = credentials.get(getRepositoryUrl());
+ if (headlessCreds == null) {
+ headlessCreds = new HashMap<String, String>();
+ credentials.put(getRepositoryUrl(), headlessCreds);
+ }
+ return headlessCreds.get(property);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private String getFromLegacyKeystore(String property) {
+ String propertyValue = null;
+ try {
+ Map<String, String> map = Platform.getAuthorizationInfo(new URL(getRepositoryUrl()), AUTH_REALM,
+ AUTH_SCHEME);
+ if (map != null) {
+ propertyValue = map.get(property);
+ if (propertyValue != null) {
+ ISecurePreferences securePreferences = getSecurePreferences();
+ securePreferences.put(property, propertyValue, property.endsWith(PASSWORD));
+ map.remove(property);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Could not retrieve authorization credentials", e)); //$NON-NLS-1$
+ }
+ return propertyValue;
+
+ }
+
+ public String getCharacterEncoding() {
+ final String encoding = properties.get(IRepositoryConstants.PROPERTY_ENCODING);
+ return encoding == null || "".equals(encoding) ? DEFAULT_CHARACTER_ENCODING : encoding; //$NON-NLS-1$
+ }
+
+ /**
+ * Get the last refresh date as initialized {@link Date} object, null if not set<br />
+ *
+ * @return {@link Date} configuration date, null if not set
+ */
+ public Date getConfigurationDate() {
+ Date configDate = null;
+ String value = this.getProperty(PROPERTY_CONFIG_TIMESTAMP);
+ try {
+ configDate = new Date(Long.valueOf(value).longValue());
+
+ } catch (Exception e) {
+
+ }
+ return configDate;
+ }
+
+ /**
+ * @return "<unknown>" if kind is unknown
+ */
+ public String getConnectorKind() {
+ String kind = properties.get(IRepositoryConstants.PROPERTY_CONNECTOR_KIND);
+ if (kind != null) {
+ return kind;
+ } else {
+ return IRepositoryConstants.KIND_UNKNOWN;
+ }
+ }
+
+ /**
+ * Returns the credentials for an authentication type.
+ *
+ * @param authType
+ * the type of authentication
+ * @return null, if no credentials are set for <code>authType</code>
+ * @since 3.0
+ */
+ public synchronized AuthenticationCredentials getCredentials(AuthenticationType authType) {
+ String key = getKeyPrefix(authType);
+
+ String enabled = getProperty(key + ENABLED);
+ if (enabled == null || "true".equals(enabled)) { //$NON-NLS-1$
+ String userName = getAuthInfo(key + USERNAME);
+ String password;
+
+ String savePassword = getProperty(key + SAVE_PASSWORD);
+ if (savePassword != null && "true".equals(savePassword)) { //$NON-NLS-1$
+ password = getAuthInfo(key + PASSWORD);
+ } else {
+ password = transientProperties.get(key + PASSWORD);
+ }
+
+ if (userName == null) {
+ userName = ""; //$NON-NLS-1$
+ }
+ if (password == null) {
+ password = ""; //$NON-NLS-1$
+ }
+
+ if (enabled == null && userName.length() == 0) {
+ // API30: legacy support for versions prior to 2.2 that did not set the enable flag, remove for 3.0
+ return null;
+ }
+
+ return new AuthenticationCredentials(userName, password);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @deprecated use {@link #getCredentials(AuthenticationType)} instead
+ */
+ @Deprecated
+ public String getHttpPassword() {
+ return getPassword(AuthenticationType.HTTP);
+ }
+
+ /**
+ * @deprecated use {@link #getCredentials(AuthenticationType)} instead
+ */
+ @Deprecated
+ public String getHttpUser() {
+ return getUserName(AuthenticationType.HTTP);
+ }
+
+ /**
+ * @deprecated use {@link #getCredentials(AuthenticationType)} instead
+ */
+ @Deprecated
+ public String getPassword() {
+ return getPassword(AuthenticationType.REPOSITORY);
+ }
+
+ /**
+ * Legacy support for < 2.2. Remove in 2.3.
+ */
+ private String getPassword(AuthenticationType authType) {
+ AuthenticationCredentials credentials = getCredentials(authType);
+ return (credentials != null) ? credentials.getPassword() : null;
+ }
+
+ public Map<String, String> getProperties() {
+ return new LinkedHashMap<String, String>(this.properties);
+ }
+
+ public String getProperty(String name) {
+ return this.properties.get(name);
+ }
+
+ /**
+ * @deprecated use {@link #getCredentials(AuthenticationType)} instead
+ */
+ @Deprecated
+ public String getProxyPassword() {
+ return getPassword(AuthenticationType.PROXY);
+ }
+
+ /**
+ * @deprecated use {@link #getCredentials(AuthenticationType)} instead
+ */
+ @Deprecated
+ public String getProxyUsername() {
+ return getUserName(AuthenticationType.PROXY);
+ }
+
+ /**
+ * @return the URL if the label property is not set
+ */
+ public String getRepositoryLabel() {
+ String label = properties.get(IRepositoryConstants.PROPERTY_LABEL);
+ if (label != null && label.length() > 0) {
+ return label;
+ } else {
+ return getRepositoryUrl();
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean getSavePassword(AuthenticationType authType) {
+ String value = getProperty(getKeyPrefix(authType) + SAVE_PASSWORD);
+ return value != null && "true".equals(value); //$NON-NLS-1$
+ }
+
+ public String getSynchronizationTimeStamp() {
+ return this.properties.get(IRepositoryConstants.PROPERTY_SYNCTIMESTAMP);
+ }
+
+ public String getTimeZoneId() {
+ final String timeZoneId = properties.get(IRepositoryConstants.PROPERTY_TIMEZONE);
+ return timeZoneId == null || "".equals(timeZoneId) ? TimeZone.getDefault().getID() : timeZoneId; //$NON-NLS-1$
+ }
+
+ public String getUrl() {
+ return getRepositoryUrl();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getRepositoryUrl() {
+ return properties.get(IRepositoryConstants.PROPERTY_URL);
+ }
+
+ /**
+ * The username is cached since it needs to be retrieved frequently (e.g. for Task List decoration).
+ */
+ public String getUserName() {
+ // NOTE: if anonymous, user name is "" string so we won't go to keyring
+ if (!isCachedUserName) {
+ cachedUserName = getUserName(AuthenticationType.REPOSITORY);
+ isCachedUserName = true;
+ }
+ return cachedUserName;
+ }
+
+ /**
+ * Legacy support for < 2.2. Remove in 2.3.
+ */
+ private String getUserName(AuthenticationType authType) {
+ AuthenticationCredentials credentials = getCredentials(authType);
+ return (credentials != null) ? credentials.getUserName() : null;
+ }
+
+ public String getVersion() {
+ final String version = properties.get(IRepositoryConstants.PROPERTY_VERSION);
+ return version == null || "".equals(version) ? NO_VERSION_SPECIFIED : version; //$NON-NLS-1$
+ }
+
+ /**
+ * @deprecated use #getCredentials(AuthenticationType) instead
+ */
+ @Deprecated
+ public boolean hasCredentials() {
+ String username = getUserName();
+ String password = getPassword();
+ return username != null && username.length() > 0 && password != null && password.length() > 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return getRepositoryUrl().hashCode() * 31 + getConnectorKind().hashCode();
+ }
+
+ public boolean hasProperty(String name) {
+ String value = getProperty(name);
+ return value != null && value.trim().length() > 0;
+ }
+
+ /**
+ * @deprecated #getCredentials(AuthenticationType) == null instead
+ */
+ @Deprecated
+ public boolean isAnonymous() {
+ return getProperty(ANONYMOUS_LOGIN) == null || "true".equals(getProperty(ANONYMOUS_LOGIN)); //$NON-NLS-1$
+ }
+
+ public boolean isBugRepository() {
+ return isBugRepository;
+ }
+
+ /**
+ * Use platform proxy settings
+ */
+ public boolean isDefaultProxyEnabled() {
+ return "true".equals(getProperty(PROXY_USEDEFAULT)); //$NON-NLS-1$
+ }
+
+ public boolean isOffline() {
+ return getProperty(OFFLINE) != null && "true".equals(getProperty(OFFLINE)); //$NON-NLS-1$
+ }
+
+ public void removeProperty(String key) {
+ this.properties.remove(key);
+ }
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} instead
+ */
+ @Deprecated
+ public void setAuthenticationCredentials(String username, String password) {
+ setCredentials(AuthenticationType.REPOSITORY, username, password);
+ }
+
+ public void setBugRepository(boolean isBugRepository) {
+ this.isBugRepository = isBugRepository;
+ }
+
+ public void setCharacterEncoding(String characterEncoding) {
+ properties.put(IRepositoryConstants.PROPERTY_ENCODING, characterEncoding == null ? DEFAULT_CHARACTER_ENCODING
+ : characterEncoding);
+ }
+
+ /**
+ * Set the Configuration date to the {@link Date} indicated.
+ *
+ * @param configuration
+ * date {@link {@link Date}
+ */
+ final public void setConfigurationDate(final Date date) {
+ this.setProperty(PROPERTY_CONFIG_TIMESTAMP, String.valueOf(date.getTime()));
+ // should persist here, but that can only be done by the TaskRepositoryManager
+ // However this is also included when persisting ordinary sync time
+ }
+
+ /**
+ * Sets the credentials for <code>authType</code>.
+ *
+ * @param authType
+ * the type of authentication
+ * @param credentials
+ * the credentials, if null, the credentials for <code>authType</code> will be flushed
+ * @param savePassword
+ * if true, the password will be persisted in the platform key ring; otherwise it will be stored in
+ * memory only
+ * @since 3.0
+ */
+ public synchronized void setCredentials(AuthenticationType authType, AuthenticationCredentials credentials,
+ boolean savePassword) {
+ String key = getKeyPrefix(authType);
+
+ setProperty(key + SAVE_PASSWORD, String.valueOf(savePassword));
+
+ if (credentials == null) {
+ setProperty(key + ENABLED, String.valueOf(false));
+ transientProperties.remove(key + PASSWORD);
+ addAuthInfo("", "", key + USERNAME, key + PASSWORD); //$NON-NLS-1$ //$NON-NLS-2$
+ } else {
+ setProperty(key + ENABLED, String.valueOf(true));
+ if (savePassword) {
+ addAuthInfo(credentials.getUserName(), credentials.getPassword(), key + USERNAME, key + PASSWORD);
+ transientProperties.remove(key + PASSWORD);
+ } else {
+ addAuthInfo(credentials.getUserName(), "", key + USERNAME, key + PASSWORD); //$NON-NLS-1$
+ transientProperties.put(key + PASSWORD, credentials.getPassword());
+ }
+ }
+
+ if (authType == AuthenticationType.REPOSITORY) {
+ if (credentials == null) {
+ this.cachedUserName = null;
+ this.isCachedUserName = false;
+ } else {
+ this.cachedUserName = credentials.getUserName();
+ this.isCachedUserName = true;
+ }
+ }
+ }
+
+ /**
+ * Legacy support for < 2.2. Remove in 2.3.
+ */
+ private void setCredentials(AuthenticationType type, String username, String password) {
+ if (username == null) {
+ setCredentials(type, null, true);
+ } else {
+ setCredentials(type, new AuthenticationCredentials(username, password), true);
+ }
+
+ }
+
+ /**
+ * @deprecated use esetCredentials(AuthenticationType, AuthenticationCredentials, boolean)
+ */
+ @Deprecated
+ public void setHttpAuthenticationCredentials(String username, String password) {
+ setCredentials(AuthenticationType.HTTP, username, password);
+ }
+
+ public void setOffline(boolean offline) {
+ properties.put(OFFLINE, String.valueOf(offline));
+ }
+
+ /**
+ * @deprecated use {@link #setCredentials(AuthenticationType, AuthenticationCredentials, boolean)} instead
+ */
+ @Deprecated
+ public void setProxyAuthenticationCredentials(String username, String password) {
+ setCredentials(AuthenticationType.PROXY, username, password);
+ }
+
+ public void setRepositoryLabel(String repositoryLabel) {
+ setProperty(IRepositoryConstants.PROPERTY_LABEL, repositoryLabel);
+ }
+
+ /**
+ * ONLY for use by IRepositoryConstants. To set the sync time call IRepositoryConstants.setSyncTime(repository,
+ * date);
+ */
+ public void setSynchronizationTimeStamp(String syncTime) {
+ setProperty(IRepositoryConstants.PROPERTY_SYNCTIMESTAMP, syncTime);
+ }
+
+ public void setProperty(String key, String newValue) {
+ String oldValue = this.properties.get(key);
+ if ((oldValue != null && !oldValue.equals(newValue)) || (oldValue == null && newValue != null)) {
+ this.properties.put(key, newValue);
+ notifyChangeListeners(key, oldValue, newValue);
+ }
+ }
+
+ private void notifyChangeListeners(String key, String old, String value) {
+ PropertyChangeEvent event = new PropertyChangeEvent(this, key, old, value);
+ for (PropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChange(event);
+ }
+ }
+
+ public void setTimeZoneId(String timeZoneId) {
+ setProperty(IRepositoryConstants.PROPERTY_TIMEZONE, timeZoneId == null ? TimeZone.getDefault().getID()
+ : timeZoneId);
+ }
+
+ /**
+ * @deprecated Use {@link #setRepositoryUrl(String)} instead
+ */
+ @Deprecated
+ public void setUrl(String newUrl) {
+ setRepositoryUrl(newUrl);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setRepositoryUrl(String repositoryUrl) {
+ Assert.isNotNull(repositoryUrl);
+ properties.put(IRepositoryConstants.PROPERTY_URL, repositoryUrl);
+ }
+
+ public void setVersion(String ver) {
+ properties.put(IRepositoryConstants.PROPERTY_VERSION, ver == null ? NO_VERSION_SPECIFIED : ver);
+ }
+
+ @Override
+ public String toString() {
+ return getRepositoryUrl();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isUpdating() {
+ return updating;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setUpdating(boolean updating) {
+ this.updating = updating;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public IRepositoryPerson createPerson(String personId) {
+ return new RepositoryPerson(this, personId);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public IStatus getStatus() {
+ return errorStatus;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setStatus(IStatus errorStatus) {
+ this.errorStatus = errorStatus;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void addChangeListener(PropertyChangeListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void removeChangeListener(PropertyChangeListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ /**
+ * @since 3.1
+ */
+ public void setDefaultProxyEnabled(boolean useDefaultProxy) {
+ setProperty(TaskRepository.PROXY_USEDEFAULT, String.valueOf(useDefaultProxy));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryLocationFactory.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryLocationFactory.java
new file mode 100644
index 0000000..376b898
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/TaskRepositoryLocationFactory.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryLocation;
+
+/**
+ * @since 2.2
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryLocationFactory {
+
+ /**
+ * @since 3.0
+ */
+ public AbstractWebLocation createWebLocation(final TaskRepository taskRepository) {
+ return new TaskRepositoryLocation(taskRepository);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskAttachmentHandler.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskAttachmentHandler.java
new file mode 100644
index 0000000..5d3df4e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskAttachmentHandler.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Subclass to provide facility for uploading and downloading files from task repositories.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractTaskAttachmentHandler {
+
+ public abstract boolean canGetContent(TaskRepository repository, ITask task);
+
+ public abstract boolean canPostContent(TaskRepository repository, ITask task);
+
+ public abstract InputStream getContent(TaskRepository repository, ITask task, TaskAttribute attachmentAttribute,
+ IProgressMonitor monitor) throws CoreException;
+
+ public abstract void postContent(TaskRepository repository, ITask task, AbstractTaskAttachmentSource source,
+ String comment, TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws CoreException;
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskAttachmentSource.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskAttachmentSource.java
new file mode 100644
index 0000000..ae37c34
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskAttachmentSource.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Clients may subclass.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractTaskAttachmentSource {
+
+ public abstract InputStream createInputStream(IProgressMonitor monitor) throws CoreException;
+
+ public abstract boolean isLocal();
+
+ public abstract long getLength();
+
+ public abstract String getName();
+
+ public abstract String getContentType();
+
+ public abstract String getDescription();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java
new file mode 100644
index 0000000..29cae91
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/AbstractTaskDataHandler.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.core.data;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Responsible for retrieving and posting task data to a repository. Clients may subclass.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractTaskDataHandler {
+
+ /**
+ * Download task data for each id provided
+ *
+ * Override getMultiTaskData() to return true and implement this method if connector supports download of multiple
+ * task data in one request.
+ *
+ * @since 3.0
+ */
+ public void getMultiTaskData(TaskRepository repository, Set<String> taskIds, TaskDataCollector collector,
+ IProgressMonitor monitor) throws CoreException {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Return a reference to the newly created report in the case of new task submission, null otherwise
+ */
+ public abstract RepositoryResponse postTaskData(TaskRepository repository, TaskData taskData,
+ Set<TaskAttribute> oldAttributes, IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * Initialize a new task data object with default attributes and values
+ */
+ public abstract boolean initializeTaskData(TaskRepository repository, TaskData data,
+ ITaskMapping initializationData, IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * @since 2.2
+ * @return false if this operation is not supported by the connector, true if initialized
+ */
+ public boolean initializeSubTaskData(TaskRepository repository, TaskData taskData, TaskData parentTaskData,
+ IProgressMonitor monitor) throws CoreException {
+ return false;
+ }
+
+ /**
+ * @param taskRepository
+ * TODO
+ * @param task
+ * the parent task, may be null
+ * @param task
+ * the parent task data, may be null
+ * @since 2.2
+ */
+ public boolean canInitializeSubTaskData(TaskRepository taskRepository, ITask task) {
+ return false;
+ }
+
+ public abstract TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository);
+
+ /**
+ * @param taskRepository
+ * TODO
+ * @return true if connector support downloading multiple task data in single request, false otherwise. If true,
+ * override and implement getMultiTaskData
+ */
+ public boolean canGetMultiTaskData(TaskRepository taskRepository) {
+ return false;
+ }
+
+ public void migrateTaskData(TaskRepository taskRepository, TaskData taskData) {
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/ITaskDataManager.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/ITaskDataManager.java
new file mode 100644
index 0000000..5aece1f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/ITaskDataManager.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITaskDataManager {
+
+ /**
+ * @since 3.0
+ */
+ public ITaskDataWorkingCopy createWorkingCopy(ITask task, TaskData taskData);
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITaskDataWorkingCopy getWorkingCopy(ITask task) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract void discardEdits(ITask task) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getTaskData(ITask task) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getTaskData(TaskRepository task, String taskId) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean hasTaskData(ITask task);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/ITaskDataWorkingCopy.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/ITaskDataWorkingCopy.java
new file mode 100644
index 0000000..1ff63b3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/ITaskDataWorkingCopy.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITaskDataWorkingCopy {
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getEditsData();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getLastReadData();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getLocalData();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskData getRepositoryData();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isSaved();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void revert();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void refresh(IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract void save(Set<TaskAttribute> edits, IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getRepositoryUrl();
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getTaskId();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentMapper.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentMapper.java
new file mode 100644
index 0000000..4007e61
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentMapper.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+
+/**
+ * @since 3.0
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentMapper {
+
+ private IRepositoryPerson author;
+
+ private String comment;
+
+ private String contentType;
+
+ private Date creationDate;
+
+ private Boolean deprecated;
+
+ private String description;
+
+ private String fileName;
+
+ private Long length;
+
+ private Boolean patch;
+
+ private String url;
+
+ private String attachmentId;
+
+ public TaskAttachmentMapper() {
+ }
+
+ public String getAttachmentId() {
+ return attachmentId;
+ }
+
+ public IRepositoryPerson getAuthor() {
+ return author;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public Long getLength() {
+ return length;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public Boolean isDeprecated() {
+ return deprecated;
+ }
+
+ public Boolean isPatch() {
+ return patch;
+ }
+
+ public void setAttachmentId(String attachmentId) {
+ this.attachmentId = attachmentId;
+ }
+
+ public void setAuthor(IRepositoryPerson author) {
+ this.author = author;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public void setDeprecated(Boolean deprecated) {
+ this.deprecated = deprecated;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public void setLength(Long length) {
+ this.length = length;
+ }
+
+ public void setPatch(Boolean patch) {
+ this.patch = patch;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public static TaskAttachmentMapper createFrom(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskAttributeMapper mapper = taskAttribute.getTaskData().getAttributeMapper();
+ TaskAttachmentMapper attachment = new TaskAttachmentMapper();
+ attachment.setAttachmentId(mapper.getValue(taskAttribute));
+ TaskAttribute child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_AUTHOR);
+ if (child != null) {
+ attachment.setAuthor(mapper.getRepositoryPerson(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_CONTENT_TYPE);
+ if (child != null) {
+ attachment.setContentType(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_DATE);
+ if (child != null) {
+ attachment.setCreationDate(mapper.getDateValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_DESCRIPTION);
+ if (child != null) {
+ attachment.setDescription(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_FILENAME);
+ if (child != null) {
+ attachment.setFileName(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ if (child != null) {
+ attachment.setDeprecated(mapper.getBooleanValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_IS_PATCH);
+ if (child != null) {
+ attachment.setPatch(mapper.getBooleanValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_SIZE);
+ if (child != null) {
+ Long value = mapper.getLongValue(child);
+ if (value != null) {
+ attachment.setLength(value);
+ }
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.ATTACHMENT_URL);
+ if (child != null) {
+ attachment.setUrl(mapper.getValue(child));
+ }
+ return attachment;
+ }
+
+ public void applyTo(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskAttributeMapper mapper = taskData.getAttributeMapper();
+ taskAttribute.getMetaData().defaults().setType(TaskAttribute.TYPE_ATTACHMENT);
+ if (getAttachmentId() != null) {
+ mapper.setValue(taskAttribute, getAttachmentId());
+ }
+ if (getAuthor() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_AUTHOR);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_PERSON);
+ mapper.setRepositoryPerson(child, getAuthor());
+ }
+ if (getContentType() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_CONTENT_TYPE);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ mapper.setValue(child, getContentType());
+ }
+ if (getCreationDate() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_DATE);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_DATE);
+ mapper.setDateValue(child, getCreationDate());
+ }
+ if (getDescription() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_DESCRIPTION);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ mapper.setValue(child, getDescription());
+ }
+ if (getFileName() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_FILENAME);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_SHORT_TEXT);
+ mapper.setValue(child, getFileName());
+ }
+ if (isDeprecated() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_IS_DEPRECATED);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_BOOLEAN);
+ mapper.setBooleanValue(child, isDeprecated());
+ }
+ if (isPatch() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_IS_PATCH);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_BOOLEAN);
+ mapper.setBooleanValue(child, isPatch());
+ }
+ if (getLength() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_SIZE);
+ mapper.setLongValue(child, getLength());
+ }
+ if (getUrl() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.ATTACHMENT_URL);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_URL);
+ mapper.setValue(child, getUrl());
+ }
+ }
+
+ public void applyTo(ITaskAttachment taskAttachment) {
+ Assert.isNotNull(taskAttachment);
+ if (getAuthor() != null) {
+ taskAttachment.setAuthor(getAuthor());
+ }
+ if (getContentType() != null) {
+ taskAttachment.setContentType(getContentType());
+ }
+ if (getCreationDate() != null) {
+ taskAttachment.setCreationDate(getCreationDate());
+ }
+ if (getDescription() != null) {
+ taskAttachment.setDescription(getDescription());
+ }
+ if (getFileName() != null) {
+ taskAttachment.setFileName(getFileName());
+ }
+ if (isDeprecated() != null) {
+ taskAttachment.setDeprecated(isDeprecated());
+ }
+ if (isPatch() != null) {
+ taskAttachment.setPatch(isPatch());
+ }
+ if (getLength() != null) {
+ taskAttachment.setLength(getLength());
+ }
+ if (url != null) {
+ taskAttachment.setUrl(getUrl());
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof TaskAttachmentMapper)) {
+ return false;
+ }
+ TaskAttachmentMapper other = (TaskAttachmentMapper) obj;
+ if ((other.attachmentId != null && this.attachmentId != null) && !other.attachmentId.equals(this.attachmentId)) {
+ return false;
+ }
+ if ((other.deprecated != null && this.deprecated != null) && !(other.deprecated == this.deprecated)) {
+ return false;
+ }
+ if ((other.patch != null && this.patch != null) && !(other.patch == this.patch)) {
+ return false;
+ }
+ if ((other.description != null && this.description != null) && !other.description.equals(this.description)) {
+ return false;
+ }
+ if ((other.contentType != null && this.contentType != null) && !other.contentType.equals(this.contentType)) {
+ return false;
+ }
+ if ((other.fileName != null && this.fileName != null) && !other.fileName.equals(this.fileName)) {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentModel.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentModel.java
new file mode 100644
index 0000000..933dd9f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentModel.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskAttachmentModel {
+
+ private boolean attachContext;
+
+ private final TaskAttribute attribute;
+
+ private String comment;
+
+ private AbstractTaskAttachmentSource source;
+
+ private final ITask task;
+
+ private final TaskRepository taskRepository;
+
+ private String contentType;
+
+ public TaskAttachmentModel(TaskRepository taskRepository, ITask task, TaskAttribute attribute) {
+ this.taskRepository = taskRepository;
+ this.task = task;
+ this.attribute = attribute;
+ }
+
+ public boolean getAttachContext() {
+ return attachContext;
+ }
+
+ public TaskAttribute getAttribute() {
+ return attribute;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public AbstractTaskAttachmentSource getSource() {
+ return source;
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public void setAttachContext(boolean attachContext) {
+ this.attachContext = attachContext;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public void setSource(AbstractTaskAttachmentSource source) {
+ this.source = source;
+ }
+
+ public String getContentType() {
+ if (contentType == null && getSource() != null) {
+ return getSource().getContentType();
+ }
+ return contentType;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentPartSource.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentPartSource.java
new file mode 100644
index 0000000..97287f6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttachmentPartSource.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.httpclient.methods.multipart.PartSource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+
+/**
+ * @since 3.1
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentPartSource implements PartSource {
+
+ private final AbstractTaskAttachmentSource attachment;
+
+ private final String filename;
+
+ public TaskAttachmentPartSource(AbstractTaskAttachmentSource attachment, String filename) {
+ this.attachment = attachment;
+ this.filename = filename;
+ }
+
+ public InputStream createInputStream() throws IOException {
+ try {
+ return attachment.createInputStream(null);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error attaching file", e)); //$NON-NLS-1$
+ throw new IOException("Failed to create source stream"); //$NON-NLS-1$
+ }
+ }
+
+ public String getFileName() {
+ return filename;
+ }
+
+ public long getLength() {
+ return attachment.getLength();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java
new file mode 100644
index 0000000..d6b3e00
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttribute.java
@@ -0,0 +1,563 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * Encapsulates attributes for task data.
+ *
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public final class TaskAttribute {
+
+ /**
+ * Boolean attribute. If true, repository user needs to be added to the cc list.
+ */
+ public static final String ADD_SELF_CC = "task.common.addselfcc"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_AUTHOR = "task.common.attachment.author"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_CONTENT_TYPE = "task.common.attachment.ctype"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_DATE = "task.common.attachment.date"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_DESCRIPTION = "task.common.attachment.description"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_FILENAME = "filename"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_ID = "task.common.attachment.id"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_IS_DEPRECATED = "task.common.attachment.deprecated"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_IS_PATCH = "task.common.attachment.patch"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_SIZE = "task.common.attachment.size"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_URL = "task.common.attachment.url"; //$NON-NLS-1$
+
+ public static final String COMMENT_ATTACHMENT_ID = "task.common.comment.attachment.id"; //$NON-NLS-1$
+
+ public static final String COMMENT_AUTHOR = "task.common.comment.author"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String COMMENT_AUTHOR_NAME = "task.common.comment.author.name"; //$NON-NLS-1$
+
+ public static final String COMMENT_DATE = "task.common.comment.date"; //$NON-NLS-1$
+
+ public static final String COMMENT_HAS_ATTACHMENT = "task.common.comment.attachment"; //$NON-NLS-1$
+
+ public static final String COMMENT_NEW = "task.common.comment.new"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String COMMENT_NUMBER = "task.common.comment.number"; //$NON-NLS-1$
+
+ public static final String COMMENT_TEXT = "task.common.comment.text"; //$NON-NLS-1$
+
+ public static final String COMMENT_URL = "task.common.comment.url"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String COMPONENT = "task.common.component"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String DATE_COMPLETION = "task.common.date.completed"; //$NON-NLS-1$
+
+ public static final String DATE_CREATION = "task.common.date.created"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String DATE_DUE = "task.common.date.due"; //$NON-NLS-1$
+
+ public static final String DATE_MODIFICATION = "task.common.date.modified"; //$NON-NLS-1$
+
+ public static final String DESCRIPTION = "task.common.description"; //$NON-NLS-1$
+
+ public static final String KEYWORDS = "task.common.keywords"; //$NON-NLS-1$
+
+ public static final String KIND_DEFAULT = "task.common.kind.default"; //$NON-NLS-1$
+
+ public static final String KIND_OPERATION = "task.common.kind.operation"; //$NON-NLS-1$
+
+ public static final String KIND_PEOPLE = "task.common.kind.people"; //$NON-NLS-1$
+
+ //public static final String META_SHOW_IN_ATTRIBUTES_SECTION = "task.meta.showInTaskEditorAttributesSection";
+
+ public static final String META_ASSOCIATED_ATTRIBUTE_ID = "task.meta.associated.attribute"; //$NON-NLS-1$
+
+ public static final String META_ATTRIBUTE_KIND = "task.meta.attributeKind"; //$NON-NLS-1$
+
+ public static final String META_ATTRIBUTE_TYPE = "task.meta.type"; //$NON-NLS-1$
+
+ public static final String META_DEFAULT_OPTION = "task.meta.defaultOption"; //$NON-NLS-1$
+
+// public static final String META_DETAIL_LEVEL = "task.meta.detailLevel";
+
+ public static final String META_LABEL = "task.meta.label"; //$NON-NLS-1$
+
+ public static final String META_READ_ONLY = "task.meta.readOnly"; //$NON-NLS-1$
+
+ public static final String NEW_ATTACHMENT = "task.common.new.attachment"; //$NON-NLS-1$
+
+ // XXX merge with USER_CC
+ //public static final String NEW_CC = "task.common.newcc";
+
+ public static final String OPERATION = "task.common.operation"; //$NON-NLS-1$
+
+ public static final String PERSON_NAME = "task.common.person.name"; //$NON-NLS-1$
+
+ public static final String PREFIX_ATTACHMENT = "task.common.attachment-"; //$NON-NLS-1$
+
+ public static final String PREFIX_COMMENT = "task.common.comment-"; //$NON-NLS-1$
+
+ // XXX merge with USER_CC
+ //public static final String REMOVE_CC = "task.common.removecc";
+
+ public static final String PREFIX_OPERATION = "task.common.operation-"; //$NON-NLS-1$
+
+ public static final String PRIORITY = "task.common.priority"; //$NON-NLS-1$
+
+ public static final String PRODUCT = "task.common.product"; //$NON-NLS-1$
+
+ public static final String RESOLUTION = "task.common.resolution"; //$NON-NLS-1$
+
+ public static final String STATUS = "task.common.status"; //$NON-NLS-1$
+
+ public static final String SUMMARY = "task.common.summary"; //$NON-NLS-1$
+
+ public static final String TASK_KEY = "task.common.key"; //$NON-NLS-1$
+
+ public static final String TASK_KIND = "task.common.kind"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TASK_URL = "task.common.url"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_ATTACHMENT = "attachment"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_BOOLEAN = "boolean"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_COMMENT = "comment"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_CONTAINER = "container"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_DATE = "date"; //$NON-NLS-1$
+
+ /**
+ * @since 3.1
+ */
+ public static final String TYPE_DATETIME = "dateTime"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_INTEGER = "integer"; //$NON-NLS-1$
+
+ /**
+ * @since 3.1
+ */
+ public static final String TYPE_LONG = "long"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_LONG_RICH_TEXT = "longRichText"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_LONG_TEXT = "longText"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_MULTI_SELECT = "multiSelect"; //$NON-NLS-1$
+
+ public static final String TYPE_OPERATION = "operation"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_PERSON = "person"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_SHORT_RICH_TEXT = "shortRichText"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_SHORT_TEXT = "shortText"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_SINGLE_SELECT = "singleSelect"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String TYPE_TASK_DEPENDENCY = "taskDepenedency"; //$NON-NLS-1$
+
+ public static final String TYPE_URL = "url"; //$NON-NLS-1$
+
+ public static final String USER_ASSIGNED = "task.common.user.assigned"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String USER_ASSIGNED_NAME = "task.common.user.assigned.name"; //$NON-NLS-1$
+
+ public static final String USER_CC = "task.common.user.cc"; //$NON-NLS-1$
+
+ public static final String USER_REPORTER = "task.common.user.reporter"; //$NON-NLS-1$
+
+ @Deprecated
+ public static final String USER_REPORTER_NAME = "task.common.user.reporter.name"; //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final String SEVERITY = "task.common.severity"; //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final String VERSION = "task.common.version"; //$NON-NLS-1$
+
+ private Map<String, TaskAttribute> attributeById;
+
+ private final String attributeId;
+
+ private Map<String, String> metaData;
+
+ private Map<String, String> optionByKey;
+
+ private final TaskAttribute parentAttribute;
+
+ private final TaskData taskData;
+
+ /**
+ * Attribute's values (selected or added)
+ */
+ private final List<String> values;
+
+ public TaskAttribute(TaskAttribute parentAttribute, String attributeId) {
+ Assert.isNotNull(parentAttribute);
+ Assert.isNotNull(attributeId);
+ this.parentAttribute = parentAttribute;
+ this.attributeId = attributeId;
+ this.taskData = parentAttribute.getTaskData();
+ this.values = new ArrayList<String>(1);
+ parentAttribute.add(this);
+ }
+
+ /**
+ * Constructor for the root node.
+ */
+ TaskAttribute(TaskData taskData) {
+ Assert.isNotNull(taskData);
+ this.parentAttribute = null;
+ this.taskData = taskData;
+ this.attributeId = "root"; //$NON-NLS-1$
+ this.values = new ArrayList<String>(1);
+ }
+
+ private void add(TaskAttribute attribute) {
+ if (attributeById == null) {
+ attributeById = new LinkedHashMap<String, TaskAttribute>();
+ }
+ attributeById.put(attribute.getId(), attribute);
+ }
+
+ public void addValue(String value) {
+ Assert.isNotNull(value);
+ values.add(value);
+ }
+
+ public void clearAttributes() {
+ attributeById = null;
+ }
+
+ void clearMetaDataMap() {
+ metaData = null;
+ }
+
+ public void clearOptions() {
+ optionByKey = null;
+ }
+
+ public void clearValues() {
+ values.clear();
+ }
+
+ public TaskAttribute createAttribute(String attributeId) {
+ return new TaskAttribute(this, attributeId);
+ }
+
+ public void deepAddCopy(TaskAttribute source) {
+ TaskAttribute target = createAttribute(source.getId());
+ target.values.addAll(source.values);
+ if (source.metaData != null) {
+ target.metaData = new LinkedHashMap<String, String>(source.metaData);
+ }
+ if (source.optionByKey != null) {
+ target.optionByKey = new LinkedHashMap<String, String>(source.optionByKey);
+ }
+ if (source.attributeById != null) {
+ for (TaskAttribute child : source.attributeById.values()) {
+ target.deepAddCopy(child);
+ }
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final TaskAttribute other = (TaskAttribute) obj;
+ if (attributeId == null) {
+ if (other.attributeId != null) {
+ return false;
+ }
+ } else if (!attributeId.equals(other.attributeId)) {
+ return false;
+ }
+ return true;
+ }
+
+ public TaskAttribute getAttribute(String attributeId) {
+ Assert.isNotNull(attributeId);
+ return (attributeById != null) ? attributeById.get(attributeId) : null;
+ }
+
+ public Map<String, TaskAttribute> getAttributes() {
+ if (attributeById != null) {
+ return Collections.unmodifiableMap(attributeById);
+ } else {
+ return Collections.emptyMap();
+ }
+ }
+
+ public String getId() {
+ return attributeId;
+ }
+
+ public TaskAttribute getMappedAttribute(String attributeId) {
+ Assert.isNotNull(attributeId);
+ return (attributeById != null) ? attributeById.get(getTaskData().getAttributeMapper().mapToRepositoryKey(this,
+ attributeId)) : null;
+ }
+
+ public TaskAttribute getMappedAttribute(String[] path) {
+ TaskAttribute attribute = this;
+ for (String id : path) {
+ attribute = attribute.getMappedAttribute(id);
+ if (attribute == null) {
+ break;
+ }
+ }
+ return attribute;
+ }
+
+ String getMetaDatum(String key) {
+ return (metaData != null) ? metaData.get(key) : null;
+ }
+
+ Map<String, String> getMetaDataMap() {
+ if (metaData != null) {
+ return Collections.unmodifiableMap(metaData);
+ } else {
+ return Collections.emptyMap();
+ }
+ }
+
+ public String getOption(String key) {
+ return (optionByKey != null) ? optionByKey.get(key) : null;
+ }
+
+ public Map<String, String> getOptions() {
+ if (optionByKey != null) {
+ return Collections.unmodifiableMap(optionByKey);
+ } else {
+ return Collections.emptyMap();
+ }
+ }
+
+ public TaskAttribute getParentAttribute() {
+ return parentAttribute;
+ }
+
+ public String[] getPath() {
+ List<String> path = new ArrayList<String>();
+ TaskAttribute attribute = this;
+ while (attribute.getParentAttribute() != null) {
+ path.add(attribute.getId());
+ attribute = attribute.getParentAttribute();
+ }
+ Collections.reverse(path);
+ return path.toArray(new String[0]);
+ }
+
+ public TaskAttributeMetaData getMetaData() {
+ return new TaskAttributeMetaData(this);
+ }
+
+ public TaskData getTaskData() {
+ return taskData;
+ }
+
+ public String getValue() {
+ if (values.size() > 0) {
+ return values.get(0);
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public List<String> getValues() {
+ return Collections.unmodifiableList(values);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((attributeId == null) ? 0 : attributeId.hashCode());
+ return result;
+ }
+
+ void putMetaDatum(String key, String value) {
+ Assert.isNotNull(key);
+ Assert.isNotNull(value);
+ if (metaData == null) {
+ metaData = new LinkedHashMap<String, String>();
+ }
+ metaData.put(key, value);
+ }
+
+ /**
+ * Adds an attribute option value
+ *
+ * @param readableValue
+ * The value displayed on the screen
+ * @param parameterValue
+ * The option value used when sending the form to the server
+ */
+ public void putOption(String key, String value) {
+ Assert.isNotNull(key);
+ Assert.isNotNull(value);
+ if (optionByKey == null) {
+ optionByKey = new LinkedHashMap<String, String>();
+ }
+ optionByKey.put(key, value);
+ }
+
+ public void removeAttribute(String attributeId) {
+ if (attributeById != null) {
+ attributeById.remove(attributeId);
+ }
+ }
+
+ void removeMetaDatum(String metaDataId) {
+ if (metaData != null) {
+ metaData.remove(metaDataId);
+ }
+ }
+
+ public void removeValue(String value) {
+ values.remove(value);
+ }
+
+ public void setValue(String value) {
+ Assert.isNotNull(value);
+ if (values.size() > 0) {
+ values.clear();
+ }
+ values.add(value);
+ }
+
+ public void setValues(List<String> values) {
+ this.values.clear();
+ this.values.addAll(values);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ toString(sb, ""); //$NON-NLS-1$
+ return sb.toString();
+ }
+
+ private void toString(StringBuilder sb, String prefix) {
+ sb.append(prefix);
+ sb.append("TaskAttribute[id="); //$NON-NLS-1$
+ sb.append(attributeId);
+ sb.append(",values="); //$NON-NLS-1$
+ sb.append(values);
+ sb.append(",options="); //$NON-NLS-1$
+ sb.append(optionByKey);
+ sb.append(",metaData="); //$NON-NLS-1$
+ sb.append(metaData);
+ sb.append("]"); //$NON-NLS-1$
+ if (attributeById != null) {
+ for (TaskAttribute child : attributeById.values()) {
+ sb.append("\n"); //$NON-NLS-1$
+ child.toString(sb, prefix + " "); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public TaskAttribute createMappedAttribute(String attributeId) {
+ Assert.isNotNull(attributeId);
+ String mappedAttributeId = getTaskData().getAttributeMapper().mapToRepositoryKey(this, attributeId);
+ Assert.isNotNull(mappedAttributeId);
+ return new TaskAttribute(this, mappedAttributeId);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttributeMapper.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttributeMapper.java
new file mode 100644
index 0000000..98e5c31
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttributeMapper.java
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskAttributeMapper {
+
+ private final TaskRepository taskRepository;
+
+ public TaskAttributeMapper(TaskRepository taskRepository) {
+ Assert.isNotNull(taskRepository);
+ this.taskRepository = taskRepository;
+ }
+
+ public TaskAttribute createTaskAttachment(TaskData taskData) {
+ TaskAttribute taskAttribute = taskData.getRoot().createAttribute(
+ mapToRepositoryKey(taskData.getRoot(), TaskAttribute.NEW_ATTACHMENT));
+// TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(taskAttribute);
+// mapper.setContentType("");
+// mapper.setFileName("");
+// mapper.setContentType("");
+// mapper.applyTo(taskAttribute);
+ return taskAttribute;
+ }
+
+ public boolean equals(TaskAttribute newAttribute, TaskAttribute oldAttribute) {
+ return newAttribute.getValues().equals(oldAttribute.getValues());
+ }
+
+ public TaskAttribute getAssoctiatedAttribute(TaskAttribute taskAttribute) {
+ String id = taskAttribute.getMetaDatum(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID);
+ if (id != null) {
+ // look up as nested attribute first
+ TaskAttribute associatedAttribute = taskAttribute.getAttribute(id);
+ if (associatedAttribute != null) {
+ return associatedAttribute;
+ }
+ // fall back to root
+ return taskAttribute.getTaskData().getRoot().getAttribute(id);
+ }
+ return null;
+ }
+
+ public TaskAttribute getAssoctiatedAttribute(TaskOperation taskOperation) {
+ TaskAttribute taskAttribute = taskOperation.getTaskAttribute();
+ if (taskAttribute != null) {
+ return getAssoctiatedAttribute(taskAttribute);
+ }
+ return null;
+ }
+
+ public List<TaskAttribute> getAttributesByType(TaskData taskData, String type) {
+ Assert.isNotNull(taskData);
+ Assert.isNotNull(type);
+ List<TaskAttribute> result = new ArrayList<TaskAttribute>();
+ for (TaskAttribute taskAttribute : taskData.getRoot().getAttributes().values()) {
+ if (type.equals(taskAttribute.getMetaData().getType())) {
+ result.add(taskAttribute);
+ }
+ }
+ return result;
+ }
+
+ public boolean getBooleanValue(TaskAttribute attribute) {
+ String booleanString = attribute.getValue();
+ if (booleanString != null && booleanString.length() > 0) {
+ return Boolean.parseBoolean(booleanString);
+ }
+ return false;
+ }
+
+ public Date getDateValue(TaskAttribute attribute) {
+ String dateString = attribute.getValue();
+ try {
+ if (dateString != null && dateString.length() > 0) {
+ return new Date(Long.parseLong(dateString));
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ public String getDefaultOption(TaskAttribute taskAttribute) {
+ return taskAttribute.getMetaData().getDefaultOption();
+ }
+
+ public Integer getIntegerValue(TaskAttribute attribute) {
+ String integerString = attribute.getValue();
+ try {
+ if (integerString != null) {
+ return Integer.parseInt(integerString);
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ public String getLabel(TaskAttribute taskAttribute) {
+ return taskAttribute.getMetaData().getLabel();
+ }
+
+ public Long getLongValue(TaskAttribute attribute) {
+ String longString = attribute.getValue();
+ try {
+ if (longString != null) {
+ return Long.parseLong(longString);
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ /**
+ * Returns labelByValue.
+ */
+ public Map<String, String> getOptions(TaskAttribute attribute) {
+ return attribute.getOptions();
+ }
+
+ public IRepositoryPerson getRepositoryPerson(TaskAttribute taskAttribute) {
+ IRepositoryPerson person = taskRepository.createPerson(taskAttribute.getValue());
+ TaskAttribute child = taskAttribute.getMappedAttribute(TaskAttribute.PERSON_NAME);
+ if (child != null) {
+ person.setName(getValue(child));
+ }
+ return person;
+ }
+
+ public List<TaskOperation> getTaskOperations(TaskAttribute operationsAttribute) {
+ Assert.isNotNull(operationsAttribute);
+ TaskData taskData = operationsAttribute.getTaskData();
+ List<TaskOperation> result = new ArrayList<TaskOperation>();
+ for (TaskAttribute taskAttribute : taskData.getRoot().getAttributes().values()) {
+ if (TaskAttribute.TYPE_OPERATION.equals(taskAttribute.getMetaData().getType())
+ && !taskAttribute.getId().equals(mapToRepositoryKey(taskData.getRoot(), TaskAttribute.OPERATION))) {
+ result.add(TaskOperation.createFrom(taskAttribute));
+ }
+ }
+ return result;
+ }
+
+ public TaskOperation getTaskOperation(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ return TaskOperation.createFrom(taskAttribute);
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public String getValue(TaskAttribute taskAttribute) {
+ return taskAttribute.getValue();
+ }
+
+ public String getValueLabel(TaskAttribute taskAttribute) {
+ List<String> labels = getValueLabels(taskAttribute);
+ StringBuilder sb = new StringBuilder();
+ String sep = ""; //$NON-NLS-1$
+ for (String value : labels) {
+ sb.append(sep).append(value);
+ sep = ", "; //$NON-NLS-1$
+ }
+ return sb.toString();
+ }
+
+ public List<String> getValueLabels(TaskAttribute taskAttribute) {
+ List<String> values = taskAttribute.getValues();
+ Map<String, String> options = getOptions(taskAttribute);
+ List<String> result = new ArrayList<String>(values.size());
+ for (String value : values) {
+ String option = options.get(value);
+ if (option != null) {
+ value = option;
+ }
+ result.add(value);
+ }
+ return result;
+ }
+
+ public List<String> getValues(TaskAttribute attribute) {
+ return new ArrayList<String>(attribute.getValues());
+ }
+
+ public boolean hasValue(TaskAttribute attribute) {
+ return attribute.getValues().size() > 0;
+ }
+
+ public String mapToRepositoryKey(TaskAttribute parent, String key) {
+ return key;
+ }
+
+ public void setBooleanValue(TaskAttribute attribute, Boolean value) {
+ attribute.setValue(Boolean.toString(value));
+ }
+
+ public void setDateValue(TaskAttribute attribute, Date date) {
+ if (date != null) {
+ attribute.setValue(Long.toString(date.getTime()));
+ } else {
+ attribute.clearValues();
+ }
+ }
+
+ public void setIntegerValue(TaskAttribute attribute, Integer value) {
+ if (value != null) {
+ attribute.setValue(value.toString());
+ } else {
+ attribute.clearValues();
+ }
+ }
+
+ public void setLongValue(TaskAttribute attribute, Long value) {
+ if (value != null) {
+ attribute.setValue(value.toString());
+ } else {
+ attribute.clearValues();
+ }
+ }
+
+ public void setRepositoryPerson(TaskAttribute taskAttribute, IRepositoryPerson person) {
+ setValue(taskAttribute, person.getPersonId());
+ if (person.getName() != null) {
+ TaskAttribute child = taskAttribute.createAttribute(TaskAttribute.PERSON_NAME);
+ setValue(child, person.getName());
+ }
+ }
+
+ public void setTaskOperation(TaskAttribute taskAttribute, TaskOperation taskOperation) {
+ Assert.isNotNull(taskAttribute);
+ Assert.isNotNull(taskOperation);
+ TaskOperation.applyTo(taskAttribute, taskOperation.getOperationId(), taskOperation.getLabel());
+ }
+
+ public void setValue(TaskAttribute attribute, String value) {
+ attribute.setValue(value);
+ }
+
+ public void setValues(TaskAttribute attribute, List<String> values) {
+ attribute.setValues(values);
+ }
+
+ public void updateTaskAttachment(ITaskAttachment taskAttachment, TaskAttribute taskAttribute) {
+ TaskAttachmentMapper.createFrom(taskAttribute).applyTo(taskAttachment);
+ }
+
+ public void updateTaskComment(ITaskComment taskComment, TaskAttribute taskAttribute) {
+ TaskCommentMapper.createFrom(taskAttribute).applyTo(taskComment);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttributeMetaData.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttributeMetaData.java
new file mode 100644
index 0000000..ab1833a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskAttributeMetaData.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.Map;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class TaskAttributeMetaData {
+
+// public enum DetailLevel {
+// /** A little bit of detail, e.g. a task showing in the Task List. */
+// LOW,
+// /** More detail, e.g. a task showing in a tool tip. */
+// MEDIUM,
+// /** A lot of detail, e.g. a task showing in an editor. */
+// //HIGH
+// };
+
+ private final TaskAttribute taskAttribute;
+
+ TaskAttributeMetaData(TaskAttribute taskAttribute) {
+ this.taskAttribute = taskAttribute;
+ }
+
+ public TaskAttributeMetaData defaults() {
+ setLabel(null);
+ setKind(null);
+ setReadOnly(true);
+ setType(TaskAttribute.TYPE_SHORT_TEXT);
+ return this;
+ }
+
+ public TaskAttributeMetaData clear() {
+ taskAttribute.clearMetaDataMap();
+ return this;
+ }
+
+ public String getDefaultOption() {
+ return taskAttribute.getMetaDatum(TaskAttribute.META_DEFAULT_OPTION);
+ }
+
+// public DetailLevel getDetailLevel() {
+// try {
+// return DetailLevel.valueOf(taskAttribute.getMetaDatum(TaskAttribute.META_DEFAULT_OPTION));
+// } catch (IllegalArgumentException e) {
+// return null;
+// }
+// }
+
+ public String getKind() {
+ return taskAttribute.getMetaDatum(TaskAttribute.META_ATTRIBUTE_KIND);
+ }
+
+ public String getLabel() {
+ return taskAttribute.getMetaDatum(TaskAttribute.META_LABEL);
+ }
+
+ public String getType() {
+ return taskAttribute.getMetaDatum(TaskAttribute.META_ATTRIBUTE_TYPE);
+ }
+
+ public String getValue(String key) {
+ return taskAttribute.getMetaDatum(key);
+ }
+
+ public Map<String, String> getValues() {
+ return taskAttribute.getMetaDataMap();
+ }
+
+ public boolean isReadOnly() {
+ return Boolean.parseBoolean(taskAttribute.getMetaDatum(TaskAttribute.META_READ_ONLY));
+ }
+
+ public TaskAttributeMetaData putValue(String key, String value) {
+ taskAttribute.putMetaDatum(key, value);
+ return this;
+ }
+
+ public TaskAttributeMetaData setDefaultOption(String defaultOption) {
+ if (defaultOption != null) {
+ taskAttribute.putMetaDatum(TaskAttribute.META_DEFAULT_OPTION, defaultOption);
+ } else {
+ taskAttribute.removeMetaDatum(TaskAttribute.META_DEFAULT_OPTION);
+ }
+ return this;
+ }
+
+// public TaskAttributeMetaData setDetailLevel(DetailLevel detailLevel) {
+// if (detailLevel != null) {
+// taskAttribute.putMetaDatum(TaskAttribute.META_DETAIL_LEVEL, detailLevel.name());
+// } else {
+// taskAttribute.removeMetaDatum(TaskAttribute.META_DETAIL_LEVEL);
+// }
+// return this;
+// }
+
+ public TaskAttributeMetaData setKind(String value) {
+ if (value != null) {
+ taskAttribute.putMetaDatum(TaskAttribute.META_ATTRIBUTE_KIND, value);
+ } else {
+ taskAttribute.removeMetaDatum(TaskAttribute.META_ATTRIBUTE_KIND);
+ }
+ return this;
+ }
+
+ public TaskAttributeMetaData setLabel(String value) {
+ if (value != null) {
+ taskAttribute.putMetaDatum(TaskAttribute.META_LABEL, value);
+ } else {
+ taskAttribute.removeMetaDatum(TaskAttribute.META_LABEL);
+ }
+ return this;
+ }
+
+ public TaskAttributeMetaData setReadOnly(boolean value) {
+ taskAttribute.putMetaDatum(TaskAttribute.META_READ_ONLY, Boolean.toString(value));
+ return this;
+ }
+
+ public TaskAttributeMetaData setType(String value) {
+ if (value != null) {
+ taskAttribute.putMetaDatum(TaskAttribute.META_ATTRIBUTE_TYPE, value);
+ } else {
+ taskAttribute.removeMetaDatum(TaskAttribute.META_ATTRIBUTE_TYPE);
+ }
+ return this;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskCommentMapper.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskCommentMapper.java
new file mode 100644
index 0000000..d70c229
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskCommentMapper.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskCommentMapper {
+
+ private IRepositoryPerson author;
+
+ private String commentId;
+
+ private Date creationDate;
+
+ private Integer number;
+
+ private String text;
+
+ private String url;
+
+ public TaskCommentMapper() {
+ }
+
+ public IRepositoryPerson getAuthor() {
+ return author;
+ }
+
+ public String getCommentId() {
+ return commentId;
+ }
+
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public Integer getNumber() {
+ return number;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setAuthor(IRepositoryPerson author) {
+ this.author = author;
+ }
+
+ public void setCommentId(String commentId) {
+ this.commentId = commentId;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ public void setNumber(Integer number) {
+ this.number = number;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ @SuppressWarnings("deprecation")
+ public static TaskCommentMapper createFrom(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskAttributeMapper mapper = taskData.getAttributeMapper();
+ TaskCommentMapper comment = new TaskCommentMapper();
+ comment.setCommentId(mapper.getValue(taskAttribute));
+ TaskAttribute child = taskAttribute.getMappedAttribute(TaskAttribute.COMMENT_AUTHOR);
+ if (child != null) {
+ IRepositoryPerson person = mapper.getRepositoryPerson(child);
+ if (person.getName() == null) {
+ child = taskAttribute.getMappedAttribute(TaskAttribute.COMMENT_AUTHOR_NAME);
+ if (child != null) {
+ person.setName(child.getValue());
+ }
+ }
+ comment.setAuthor(person);
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.COMMENT_DATE);
+ if (child != null) {
+ comment.setCreationDate(mapper.getDateValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.COMMENT_NUMBER);
+ if (child != null) {
+ comment.setNumber(mapper.getIntegerValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.COMMENT_URL);
+ if (child != null) {
+ comment.setUrl(mapper.getValue(child));
+ }
+ child = taskAttribute.getMappedAttribute(TaskAttribute.COMMENT_TEXT);
+ if (child != null) {
+ comment.setText(mapper.getValue(child));
+ }
+ return comment;
+ }
+
+ public void applyTo(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskAttributeMapper mapper = taskData.getAttributeMapper();
+ taskAttribute.getMetaData().defaults().setType(TaskAttribute.TYPE_COMMENT);
+ if (getCommentId() != null) {
+ mapper.setValue(taskAttribute, getCommentId());
+ }
+ if (getAuthor() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.COMMENT_AUTHOR);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_PERSON);
+ mapper.setRepositoryPerson(child, getAuthor());
+ }
+ if (getCreationDate() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.COMMENT_DATE);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_DATE);
+ mapper.setDateValue(child, getCreationDate());
+ }
+ if (getNumber() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.COMMENT_NUMBER);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_INTEGER);
+ mapper.setIntegerValue(child, getNumber());
+ }
+ if (getUrl() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.COMMENT_URL);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_URL);
+ mapper.setValue(child, getUrl());
+ }
+ if (getText() != null) {
+ TaskAttribute child = taskAttribute.createMappedAttribute(TaskAttribute.COMMENT_TEXT);
+ child.getMetaData().defaults().setType(TaskAttribute.TYPE_LONG_RICH_TEXT);
+ mapper.setValue(child, getText());
+ taskAttribute.putMetaDatum(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, child.getId());
+ }
+ }
+
+ public void applyTo(ITaskComment taskComment) {
+ Assert.isNotNull(taskComment);
+ if (getAuthor() != null) {
+ taskComment.setAuthor(getAuthor());
+ }
+ if (getCreationDate() != null) {
+ taskComment.setCreationDate(getCreationDate());
+ }
+ if (getNumber() != null) {
+ taskComment.setNumber(getNumber());
+ }
+ if (getUrl() != null) {
+ taskComment.setUrl(getUrl());
+ }
+ if (getText() != null) {
+ taskComment.setText(getText());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskData.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskData.java
new file mode 100644
index 0000000..464d93f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskData.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public final class TaskData {
+
+ private final String connectorKind;
+
+ private boolean partial;
+
+ private String version;
+
+ private final String repositoryUrl;
+
+ private final String taskId;
+
+ private final TaskAttributeMapper mapper;
+
+ private final TaskAttribute root;
+
+ public TaskData(TaskAttributeMapper mapper, String connectorKind, String repositoryUrl, String taskId) {
+ Assert.isNotNull(mapper);
+ Assert.isNotNull(connectorKind);
+ Assert.isNotNull(repositoryUrl);
+ Assert.isNotNull(taskId);
+ this.mapper = mapper;
+ this.connectorKind = connectorKind;
+ this.repositoryUrl = repositoryUrl;
+ this.taskId = taskId;
+ this.root = new TaskAttribute(this);
+ }
+
+ public TaskAttribute getRoot() {
+ return root;
+ }
+
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public String getTaskId() {
+ return taskId;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ /**
+ * Returns true if this is a new, unsubmitted task; false otherwise.
+ */
+ public boolean isNew() {
+ return getTaskId().length() == 0;
+ }
+
+ /**
+ * Returns true, if this task data does not have all task attributes.
+ */
+ public boolean isPartial() {
+ return partial;
+ }
+
+ /**
+ * Set <code>partial</code> to true to indicate that this task data does not have all task attributes.
+ *
+ * @see #isPartial()
+ * @see AbstractRepositoryConnector#performQuery(org.eclipse.mylyn.tasks.core.TaskRepository,
+ * org.eclipse.mylyn.tasks.core.IRepositoryQuery, TaskDataCollector,
+ * org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession, org.eclipse.core.runtime.IProgressMonitor)
+ * @see AbstractRepositoryConnector#getTaskData(org.eclipse.mylyn.tasks.core.TaskRepository, String,
+ * org.eclipse.core.runtime.IProgressMonitor)
+ * @see #isPartial()
+ */
+ public void setPartial(boolean partial) {
+ this.partial = partial;
+ }
+
+ public TaskAttributeMapper getAttributeMapper() {
+ return mapper;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataCollector.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataCollector.java
new file mode 100644
index 0000000..4dda0f0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataCollector.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+/**
+ * This class is used for collecting tasks, e.g. when performing queries on a repository.
+ *
+ * @author Rob Elves
+ * @since 3.0
+ */
+public abstract class TaskDataCollector {
+
+ /**
+ * @since 3.0
+ */
+ public static final int MAX_HITS = 5000;
+
+ public abstract void accept(TaskData taskData);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModel.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModel.java
new file mode 100644
index 0000000..f02f092
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModel.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelEvent.EventKind;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class TaskDataModel {
+
+ private List<TaskDataModelListener> listeners;
+
+ private final ITask task;
+
+ private final TaskRepository taskRepository;
+
+ private final Set<TaskAttribute> unsavedChangedAttributes;
+
+ private final ITaskDataWorkingCopy workingCopy;
+
+ public TaskDataModel(TaskRepository taskRepository, ITask task, ITaskDataWorkingCopy taskDataState) {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(task);
+ Assert.isNotNull(taskDataState);
+ this.task = task;
+ this.taskRepository = taskRepository;
+ this.workingCopy = taskDataState;
+ this.unsavedChangedAttributes = new HashSet<TaskAttribute>();
+ }
+
+ public void addModelListener(TaskDataModelListener listener) {
+ if (listeners == null) {
+ listeners = new ArrayList<TaskDataModelListener>();
+ }
+ listeners.add(listener);
+ }
+
+ /**
+ * Invoke upon change to attribute value.
+ *
+ * @param attribute
+ * changed attribute
+ */
+ public void attributeChanged(TaskAttribute attribute) {
+ if (attribute.getParentAttribute() != getTaskData().getRoot()) {
+ throw new RuntimeException(
+ "Editing is only supported for attributes that are attached to the root of task data"); //$NON-NLS-1$
+ }
+
+ unsavedChangedAttributes.add(attribute);
+
+ if (this.listeners != null) {
+ final TaskDataModelEvent event = new TaskDataModelEvent(this, EventKind.CHANGED, attribute);
+ TaskDataModelListener[] listeners = this.listeners.toArray(new TaskDataModelListener[0]);
+ for (final TaskDataModelListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Listener failed", e)); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ listener.attributeChanged(event);
+ }
+ });
+ }
+ }
+ }
+
+ public Set<TaskAttribute> getChangedAttributes() {
+ Set<TaskAttribute> changedAttributes = new LinkedHashSet<TaskAttribute>();
+ changedAttributes.addAll(workingCopy.getEditsData().getRoot().getAttributes().values());
+ changedAttributes.addAll(unsavedChangedAttributes);
+ return changedAttributes;
+ }
+
+ public Set<TaskAttribute> getChangedOldAttributes() {
+ Set<TaskAttribute> newChangedAttributes = getChangedAttributes();
+ Set<TaskAttribute> oldAttributes = new LinkedHashSet<TaskAttribute>();
+ TaskData repositoryReadData = workingCopy.getRepositoryData();
+ if (repositoryReadData != null) {
+ for (TaskAttribute taskAttribute : newChangedAttributes) {
+ TaskAttribute attOld = repositoryReadData.getRoot().getAttribute(taskAttribute.getId());
+ if (attOld != null) {
+ oldAttributes.add(attOld);
+ }
+ }
+ }
+ return oldAttributes;
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public TaskData getTaskData() {
+ return workingCopy.getLocalData();
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public boolean hasBeenRead() {
+ return workingCopy.getLastReadData() != null;
+ }
+
+ public boolean hasIncomingChanges(TaskAttribute taskAttribute) {
+ TaskData lastReadData = workingCopy.getLastReadData();
+ if (lastReadData == null) {
+ return true;
+ }
+
+ if (hasOutgoingChanges(taskAttribute)) {
+ return false;
+ }
+
+ TaskAttribute oldAttribute = lastReadData.getRoot().getMappedAttribute(taskAttribute.getPath());
+ if (oldAttribute == null) {
+ return true;
+ }
+
+ return !getTaskData().getAttributeMapper().equals(taskAttribute, oldAttribute);
+ }
+
+ public boolean hasOutgoingChanges(TaskAttribute taskAttribute) {
+ return workingCopy.getEditsData().getRoot().getMappedAttribute(taskAttribute.getPath()) != null;
+ }
+
+ public boolean isDirty() {
+ return unsavedChangedAttributes.size() > 0 || !workingCopy.isSaved();
+ }
+
+ public void refresh(IProgressMonitor monitor) throws CoreException {
+ workingCopy.refresh(monitor);
+ }
+
+ public void removeModelListener(TaskDataModelListener listener) {
+ listeners.remove(listener);
+ }
+
+ public void revert() {
+ workingCopy.revert();
+ unsavedChangedAttributes.clear();
+ }
+
+ public void save(IProgressMonitor monitor) throws CoreException {
+ workingCopy.save(unsavedChangedAttributes, monitor);
+ unsavedChangedAttributes.clear();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModelEvent.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModelEvent.java
new file mode 100644
index 0000000..cf96be2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModelEvent.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ */
+public final class TaskDataModelEvent {
+
+ public enum EventKind {
+ CHANGED
+ }
+
+ private final EventKind kind;
+
+ private final TaskDataModel model;
+
+ private final TaskAttribute taskAttribute;;
+
+ public TaskDataModelEvent(TaskDataModel model, EventKind kind, TaskAttribute taskAttribute) {
+ this.model = model;
+ this.kind = kind;
+ this.taskAttribute = taskAttribute;
+ }
+
+ public EventKind getKind() {
+ return kind;
+ }
+
+ public TaskDataModel getModel() {
+ return model;
+ }
+
+ public TaskAttribute getTaskAttribute() {
+ return taskAttribute;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModelListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModelListener.java
new file mode 100644
index 0000000..adde251
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskDataModelListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class TaskDataModelListener {
+
+ /**
+ * @since 3.0
+ */
+ public abstract void attributeChanged(TaskDataModelEvent event);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java
new file mode 100644
index 0000000..9c66104
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskMapper.java
@@ -0,0 +1,465 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+// TODO 3.3 add setTaskKey() method
+public class TaskMapper implements ITaskMapping {
+
+ private final boolean createNonExistingAttributes;
+
+ private final TaskData taskData;
+
+ public TaskMapper(TaskData taskData) {
+ this(taskData, false);
+ }
+
+ public TaskMapper(TaskData taskData, boolean createNonExistingAttributes) {
+ this.createNonExistingAttributes = createNonExistingAttributes;
+ Assert.isNotNull(taskData);
+ this.taskData = taskData;
+ }
+
+ public boolean applyTo(ITask task) {
+ boolean changed = false;
+ if (hasChanges(task.getCompletionDate(), getCompletionDate(), TaskAttribute.DATE_COMPLETION)) {
+ task.setCompletionDate(getCompletionDate());
+ changed = true;
+ }
+ if (hasChanges(task.getCreationDate(), getCreationDate(), TaskAttribute.DATE_CREATION)) {
+ task.setCreationDate(getCreationDate());
+ changed = true;
+ }
+ if (hasChanges(task.getModificationDate(), getModificationDate(), TaskAttribute.DATE_MODIFICATION)) {
+ task.setModificationDate(getModificationDate());
+ changed = true;
+ }
+ if (hasChanges(task.getDueDate(), getDueDate(), TaskAttribute.DATE_DUE)) {
+ task.setDueDate(getDueDate());
+ changed = true;
+ }
+ if (hasChanges(task.getOwner(), getOwner(), TaskAttribute.USER_ASSIGNED)) {
+ task.setOwner(getOwner());
+ changed = true;
+ }
+ if (hasChanges(task.getPriority(), getPriorityLevelString(), TaskAttribute.PRIORITY)) {
+ task.setPriority(getPriorityLevelString());
+ changed = true;
+ }
+ if (hasChanges(task.getSummary(), getSummary(), TaskAttribute.SUMMARY)) {
+ task.setSummary(getSummary());
+ changed = true;
+ }
+ if (hasChanges(task.getTaskKey(), getTaskKey(), TaskAttribute.TASK_KEY)) {
+ task.setTaskKey(getTaskKey());
+ changed = true;
+ }
+ if (hasChanges(task.getTaskKind(), getTaskKind(), TaskAttribute.TASK_KIND)) {
+ task.setTaskKind(getTaskKind());
+ changed = true;
+ }
+ if (hasChanges(task.getUrl(), getTaskUrl(), TaskAttribute.TASK_URL)) {
+ task.setUrl(getTaskUrl());
+ changed = true;
+ }
+ return changed;
+ }
+
+ private String getPriorityLevelString() {
+ return (getPriorityLevel() != null) ? getPriorityLevel().toString() : PriorityLevel.getDefault().toString();
+ }
+
+ private boolean hasChanges(Object existingValue, Object newValue, String attributeId) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeId);
+ if (attribute != null) {
+ return areNotEquals(existingValue, newValue);
+ }
+ return false;
+ }
+
+ private boolean areNotEquals(Object existingProperty, Object newProperty) {
+ return (existingProperty != null) ? !existingProperty.equals(newProperty) : newProperty != null;
+ }
+
+ private void copyAttributeValue(TaskAttribute sourceAttribute, TaskAttribute targetAttribute) {
+ if (targetAttribute == null) {
+ return;
+ }
+ if (!targetAttribute.getMetaData().isReadOnly()) {
+ targetAttribute.clearValues();
+ if (targetAttribute.getOptions().size() > 0) {
+ List<String> values = sourceAttribute.getValues();
+ for (String value : values) {
+ if (targetAttribute.getOptions().containsKey(value)) {
+ targetAttribute.addValue(value);
+ }
+ }
+ } else {
+ List<String> values = sourceAttribute.getValues();
+ for (String value : values) {
+ targetAttribute.addValue(value);
+ }
+ }
+ }
+ }
+
+ /**
+ * TODO update comment Sets attribute values from <code>sourceTaskData</code> on <code>targetTaskData</code>. Sets
+ * the following attributes:
+ * <ul>
+ * <li>summary
+ * <li>description
+ * </ul>
+ * Other attribute values are only set if they exist on <code>sourceTaskData</code> and <code>targetTaskData</code>.
+ *
+ * @param sourceTaskData
+ * the source task data values are copied from, the connector kind of repository of
+ * <code>sourceTaskData</code> can be different from <code>targetTaskData</code>
+ * @param targetTaskData
+ * the target task data values are copied to, the connector kind matches the one of this task data
+ * handler
+ * @since 2.2
+ */
+ public void merge(ITaskMapping source) {
+ if (source.getTaskData() != null && this.getTaskData() != null
+ && source.getTaskData().getConnectorKind().equals(this.getTaskData().getConnectorKind())) {
+ // task data objects are from the same connector, copy all attributes
+ for (TaskAttribute sourceAttribute : source.getTaskData().getRoot().getAttributes().values()) {
+ copyAttributeValue(sourceAttribute, this.getTaskData().getRoot().getAttribute(sourceAttribute.getId()));
+ }
+ } else {
+ if (source.getCc() != null) {
+ setCc(source.getCc());
+ }
+ if (source.getDescription() != null) {
+ setDescription(source.getDescription());
+ }
+ if (source.getComponent() != null) {
+ setComponent(source.getComponent());
+ }
+ if (source.getKeywords() != null) {
+ setKeywords(source.getKeywords());
+ }
+ if (source.getOwner() != null) {
+ setOwner(source.getOwner());
+ }
+ if (source.getPriorityLevel() != null) {
+ setPriorityLevel(source.getPriorityLevel());
+ }
+ if (source.getProduct() != null) {
+ setProduct(source.getProduct());
+ }
+ if (source.getSeverity() != null) {
+ setSeverity(source.getSeverity());
+ }
+ if (source.getSummary() != null) {
+ setSummary(source.getSummary());
+ }
+ if (source.getVersion() != null) {
+ setVersion(source.getVersion());
+ }
+ }
+ }
+
+ private TaskAttribute createAttribute(String attributeKey, String type) {
+ attributeKey = taskData.getAttributeMapper().mapToRepositoryKey(taskData.getRoot(), attributeKey);
+ TaskAttribute attribute = taskData.getRoot().createAttribute(attributeKey);
+ attribute.getMetaData().defaults().setType(type);
+ return attribute;
+ }
+
+ public List<String> getCc() {
+ return getValues(TaskAttribute.USER_CC);
+ }
+
+ public Date getCompletionDate() {
+ return getDateValue(TaskAttribute.DATE_COMPLETION);
+ }
+
+ public String getComponent() {
+ return getValue(TaskAttribute.COMPONENT);
+ }
+
+ public Date getCreationDate() {
+ return getDateValue(TaskAttribute.DATE_CREATION);
+ }
+
+ private Date getDateValue(String attributeKey) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
+ if (attribute != null) {
+ return taskData.getAttributeMapper().getDateValue(attribute);
+ }
+ return null;
+ }
+
+ public String getDescription() {
+ return getValue(TaskAttribute.DESCRIPTION);
+ }
+
+ public Date getDueDate() {
+ return getDateValue(TaskAttribute.DATE_DUE);
+ }
+
+ public List<String> getKeywords() {
+ return getValues(TaskAttribute.KEYWORDS);
+ }
+
+ private TaskAttribute getWriteableAttribute(String attributeKey, String type) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
+ if (createNonExistingAttributes) {
+ if (attribute == null) {
+ attribute = createAttribute(attributeKey, type);
+ }
+ } else if (attribute != null && attribute.getMetaData().isReadOnly()) {
+ return null;
+ }
+ return attribute;
+ }
+
+ public Date getModificationDate() {
+ return getDateValue(TaskAttribute.DATE_MODIFICATION);
+ }
+
+ public String getOwner() {
+ return getValue(TaskAttribute.USER_ASSIGNED);
+ }
+
+ public String getPriority() {
+ return getValue(TaskAttribute.PRIORITY);
+ }
+
+ public PriorityLevel getPriorityLevel() {
+ String value = getPriority();
+ return (value != null) ? PriorityLevel.fromString(value) : null;
+ }
+
+ public String getProduct() {
+ return getValue(TaskAttribute.PRODUCT);
+ }
+
+ public String getReporter() {
+ return getValue(TaskAttribute.USER_REPORTER);
+ }
+
+ public String getResolution() {
+ return getValue(TaskAttribute.RESOLUTION);
+ }
+
+ /**
+ * @since 3.2
+ */
+ public String getSeverity() {
+ return getValue(TaskAttribute.SEVERITY);
+ }
+
+ public String getSummary() {
+ return getValue(TaskAttribute.SUMMARY);
+ }
+
+ public String getStatus() {
+ return getValue(TaskAttribute.STATUS);
+ }
+
+ public TaskData getTaskData() {
+ return taskData;
+ }
+
+ public String getTaskKey() {
+ return getValue(TaskAttribute.TASK_KEY);
+ }
+
+ public String getTaskKind() {
+ return getValue(TaskAttribute.TASK_KIND);
+ }
+
+ public String getTaskStatus() {
+ return getValue(TaskAttribute.STATUS);
+ }
+
+ public String getTaskUrl() {
+ return getValue(TaskAttribute.TASK_URL);
+ }
+
+ public String getValue(String attributeKey) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
+ if (attribute != null) {
+ return taskData.getAttributeMapper().getValueLabel(attribute);
+ }
+ return null;
+ }
+
+ private List<String> getValues(String attributeKey) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
+ if (attribute != null) {
+ return taskData.getAttributeMapper().getValueLabels(attribute);
+ }
+ return null;
+ }
+
+ /**
+ * @since 3.2
+ */
+ public String getVersion() {
+ return getValue(TaskAttribute.VERSION);
+ }
+
+ public boolean hasChanges(ITask task) {
+ boolean changed = false;
+ changed |= hasChanges(task.getCompletionDate(), getCompletionDate(), TaskAttribute.DATE_COMPLETION);
+ changed |= hasChanges(task.getCreationDate(), getCreationDate(), TaskAttribute.DATE_CREATION);
+ changed |= hasChanges(task.getModificationDate(), getModificationDate(), TaskAttribute.DATE_MODIFICATION);
+ changed |= hasChanges(task.getDueDate(), getDueDate(), TaskAttribute.DATE_DUE);
+ changed |= hasChanges(task.getOwner(), getOwner(), TaskAttribute.USER_ASSIGNED);
+ changed |= hasChanges(task.getPriority(), getPriorityLevelString(), TaskAttribute.PRIORITY);
+ changed |= hasChanges(task.getSummary(), getSummary(), TaskAttribute.SUMMARY);
+ changed |= hasChanges(task.getTaskKey(), getTaskKey(), TaskAttribute.TASK_KEY);
+ changed |= hasChanges(task.getTaskKind(), getTaskKind(), TaskAttribute.TASK_KIND);
+ changed |= hasChanges(task.getUrl(), getTaskUrl(), TaskAttribute.TASK_URL);
+ return changed;
+ }
+
+// private boolean hasChanges(Object value, String attributeKey) {
+// TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
+// if (attribute != null) {
+// if (TaskAttribute.TYPE_BOOLEAN.equals(attribute.getMetaData().getType())) {
+// return areNotEquals(value, taskData.getAttributeMapper().getBooleanValue(attribute));
+// } else if (TaskAttribute.TYPE_DATE.equals(attribute.getMetaData().getType())) {
+// return areNotEquals(value, taskData.getAttributeMapper().getDateValue(attribute));
+// } else if (TaskAttribute.TYPE_INTEGER.equals(attribute.getMetaData().getType())) {
+// return areNotEquals(value, taskData.getAttributeMapper().getIntegerValue(attribute));
+// } else {
+// return areNotEquals(value, taskData.getAttributeMapper().getValue(attribute));
+// }
+// }
+// return false;
+// }
+
+ public void setCc(List<String> cc) {
+ setValues(TaskAttribute.USER_CC, cc);
+ }
+
+ public void setCompletionDate(Date dateCompleted) {
+ setDateValue(TaskAttribute.DATE_COMPLETION, dateCompleted);
+ }
+
+ public void setComponent(String component) {
+ setValue(TaskAttribute.COMPONENT, component);
+ }
+
+ public void setCreationDate(Date dateCreated) {
+ setDateValue(TaskAttribute.DATE_CREATION, dateCreated);
+ }
+
+ private TaskAttribute setDateValue(String attributeKey, Date value) {
+ TaskAttribute attribute = getWriteableAttribute(attributeKey, TaskAttribute.TYPE_DATE);
+ if (attribute != null) {
+ taskData.getAttributeMapper().setDateValue(attribute, value);
+ }
+ return attribute;
+ }
+
+ public void setDescription(String description) {
+ setValue(TaskAttribute.DESCRIPTION, description);
+ }
+
+ public void setDueDate(Date value) {
+ setDateValue(TaskAttribute.DATE_DUE, value);
+ }
+
+ public void setKeywords(List<String> keywords) {
+ setValues(TaskAttribute.KEYWORDS, keywords);
+ }
+
+ public void setModificationDate(Date dateModified) {
+ setDateValue(TaskAttribute.DATE_MODIFICATION, dateModified);
+ }
+
+ // TODO use Person class?
+ public void setOwner(String owner) {
+ setValue(TaskAttribute.USER_ASSIGNED, owner);
+ }
+
+ public void setPriority(String priority) {
+ setValue(TaskAttribute.PRIORITY, priority);
+ }
+
+ public void setPriorityLevel(PriorityLevel priority) {
+ setPriority(priority.toString());
+ }
+
+ public void setProduct(String product) {
+ setValue(TaskAttribute.PRODUCT, product);
+ }
+
+ // TODO use Person class?
+ public void setReporter(String reporter) {
+ setValue(TaskAttribute.USER_REPORTER, reporter);
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void setSeverity(String severity) {
+ setValue(TaskAttribute.SEVERITY, severity);
+ }
+
+ public void setSummary(String summary) {
+ setValue(TaskAttribute.SUMMARY, summary);
+ }
+
+ public void setStatus(String status) {
+ setValue(TaskAttribute.STATUS, status);
+ }
+
+ public void setTaskKind(String taskKind) {
+ setValue(TaskAttribute.TASK_KIND, taskKind);
+ }
+
+ public void setTaskUrl(String taskUrl) {
+ setValue(TaskAttribute.TASK_URL, taskUrl);
+ }
+
+ /**
+ * @since 3.2
+ */
+ public void setVersion(String version) {
+ setValue(TaskAttribute.VERSION, version);
+ }
+
+ public TaskAttribute setValue(String attributeKey, String value) {
+ TaskAttribute attribute = getWriteableAttribute(attributeKey, TaskAttribute.TYPE_SHORT_TEXT);
+ if (attribute != null) {
+ taskData.getAttributeMapper().setValue(attribute, value);
+ }
+ return attribute;
+ }
+
+ private TaskAttribute setValues(String attributeKey, List<String> values) {
+ TaskAttribute attribute = getWriteableAttribute(attributeKey, TaskAttribute.TYPE_SHORT_TEXT);
+ if (attribute != null) {
+ taskData.getAttributeMapper().setValues(attribute, values);
+ }
+ return attribute;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskOperation.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskOperation.java
new file mode 100644
index 0000000..e44d826
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskOperation.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskOperation {
+
+ /**
+ * @since 3.0
+ */
+ public static void applyTo(TaskAttribute taskAttribute, String operationId, String label) {
+ TaskData taskData = taskAttribute.getTaskData();
+ taskData.getAttributeMapper().setValue(taskAttribute, operationId);
+ taskAttribute.getMetaData().defaults().setType(TaskAttribute.TYPE_OPERATION).setLabel(label);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static TaskOperation createFrom(TaskAttribute taskAttribute) {
+ Assert.isNotNull(taskAttribute);
+ TaskData taskData = taskAttribute.getTaskData();
+ TaskOperation operation = new TaskOperation(taskData.getConnectorKind(), taskData.getRepositoryUrl(),
+ taskData.getTaskId(), taskAttribute.getValue());
+ operation.setLabel(taskAttribute.getMetaData().getLabel());
+ operation.setTaskAttribute(taskAttribute);
+ return operation;
+ }
+
+ private final String connectorKind;
+
+ private String label;
+
+ private final String operationId;
+
+ private final String repositoryUrl;
+
+ private TaskAttribute taskAttribute;
+
+ private final String taskId;
+
+ /**
+ * @since 3.0
+ */
+ public TaskOperation(String connectorKind, String repositoryUrl, String taskId, String operationId) {
+ Assert.isNotNull(connectorKind);
+ Assert.isNotNull(repositoryUrl);
+ Assert.isNotNull(taskId);
+ Assert.isNotNull(operationId);
+ this.connectorKind = connectorKind;
+ this.repositoryUrl = repositoryUrl;
+ this.taskId = taskId;
+ this.operationId = operationId;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TaskOperation other = (TaskOperation) obj;
+ if (!connectorKind.equals(other.connectorKind)) {
+ return false;
+ }
+ if (!operationId.equals(other.operationId)) {
+ return false;
+ }
+ if (!repositoryUrl.equals(other.repositoryUrl)) {
+ return false;
+ }
+ if (!taskId.equals(other.taskId)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getLabel() {
+ return label;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getOperationId() {
+ return operationId;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskAttribute getTaskAttribute() {
+ return taskAttribute;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getTaskId() {
+ return taskId;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + connectorKind.hashCode();
+ result = prime * result + operationId.hashCode();
+ result = prime * result + repositoryUrl.hashCode();
+ result = prime * result + taskId.hashCode();
+ return result;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setTaskAttribute(TaskAttribute taskAttribute) {
+ this.taskAttribute = taskAttribute;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java
new file mode 100644
index 0000000..55cdfb6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/data/TaskRelation.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.data;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskRelation {
+
+ private final String taskId;
+
+ private final Kind kind;
+
+ private final Direction direction;
+
+ /**
+ * @since 3.0
+ */
+ public enum Direction {
+ INWARD, OUTWARD
+ };
+
+ /**
+ * @since 3.0
+ */
+ public enum Kind {
+ CONTAINMENT, DEPENDENCY, DUPLICATE
+ }
+
+ private TaskRelation(Kind kind, Direction direction, String taskId) {
+ Assert.isNotNull(kind);
+ Assert.isNotNull(direction);
+ Assert.isNotNull(taskId);
+ this.kind = kind;
+ this.direction = direction;
+ this.taskId = taskId;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getTaskId() {
+ return taskId;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Kind getKind() {
+ return kind;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Direction getDirection() {
+ return direction;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static TaskRelation parentTask(String taskId) {
+ return new TaskRelation(Kind.CONTAINMENT, Direction.INWARD, taskId);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static TaskRelation subtask(String taskId) {
+ return new TaskRelation(Kind.CONTAINMENT, Direction.OUTWARD, taskId);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static TaskRelation dependency(String taskId, Direction direction) {
+ return new TaskRelation(Kind.DEPENDENCY, direction, taskId);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + direction.hashCode();
+ result = prime * result + kind.hashCode();
+ result = prime * result + taskId.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TaskRelation other = (TaskRelation) obj;
+ return direction.equals(other.direction) && kind.equals(other.kind) && taskId.equals(other.taskId);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/ISynchronizationSession.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/ISynchronizationSession.java
new file mode 100644
index 0000000..a700412
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/ISynchronizationSession.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.sync;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataManager;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @since 3.0
+ * @author Steffen Pingel
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ISynchronizationSession {
+
+ /**
+ * @since 3.0
+ */
+ public abstract Set<ITask> getChangedTasks();
+
+ /**
+ * @since 3.0
+ */
+ public abstract Object getData();
+
+ /**
+ * @since 3.0
+ */
+ public abstract IStatus getStatus();
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITaskDataManager getTaskDataManager();
+
+ /**
+ * @since 3.0
+ */
+ public abstract TaskRepository getTaskRepository();
+
+ /**
+ * @since 3.0
+ */
+ public abstract Set<ITask> getTasks();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isFullSynchronization();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean isUser();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean needsPerformQueries();
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setData(Object data);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void setNeedsPerformQueries(boolean performQueries);
+
+ /**
+ * @since 3.0
+ */
+ public abstract void markStale(ITask task);
+
+ /**
+ * @since 3.0
+ */
+ // TODO m4.0 pass TaskDataCollector to preSynchronization() instead
+ public abstract void putTaskData(ITask task, TaskData taskData) throws CoreException;
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJob.java
new file mode 100644
index 0000000..20da223
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJob.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.sync;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.DelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.IDelegatingProgressMonitor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public abstract class SubmitJob extends TaskJob {
+
+ private final List<SubmitJobListener> submitJobListeners = Collections.synchronizedList(new ArrayList<SubmitJobListener>());
+
+ /**
+ * @since 3.2
+ */
+ protected final IDelegatingProgressMonitor monitor;
+
+ /**
+ * @since 3.0
+ */
+ public SubmitJob(String name) {
+ super(name);
+ this.monitor = new DelegatingProgressMonitor();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void addSubmitJobListener(SubmitJobListener listener) {
+ submitJobListeners.add(listener);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void removeSubmitJobListener(SubmitJobListener listener) {
+ submitJobListeners.remove(listener);
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected SubmitJobListener[] getSubmitJobListeners() {
+ return submitJobListeners.toArray(new SubmitJobListener[0]);
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void fireTaskSubmitted(final IProgressMonitor monitor) throws CoreException {
+ SubmitJobListener[] listeners = submitJobListeners.toArray(new SubmitJobListener[0]);
+ if (listeners.length > 0) {
+ final SubmitJobEvent event = new SubmitJobEvent(this);
+ for (final SubmitJobListener listener : listeners) {
+ listener.taskSubmitted(event, Policy.subMonitorFor(monitor, 100));
+ }
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void fireTaskSynchronized(final IProgressMonitor monitor) throws CoreException {
+ SubmitJobListener[] listeners = submitJobListeners.toArray(new SubmitJobListener[0]);
+ if (listeners.length > 0) {
+ final SubmitJobEvent event = new SubmitJobEvent(this);
+ for (final SubmitJobListener listener : listeners) {
+ listener.taskSynchronized(event, Policy.subMonitorFor(monitor, 100));
+ }
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void fireDone() {
+ SubmitJobListener[] listeners = submitJobListeners.toArray(new SubmitJobListener[0]);
+ if (listeners.length > 0) {
+ final SubmitJobEvent event = new SubmitJobEvent(this);
+ for (final SubmitJobListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Listener failed", e)); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ listener.done(event);
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITask getTask();
+
+ /**
+ * Returns the connector specific result of the submission.
+ *
+ * @return the response from the repository, null if no response was received or the submission failed
+ * @since 3.2
+ */
+ public abstract RepositoryResponse getResponse();
+
+ /**
+ * @since 3.2
+ */
+ public IDelegatingProgressMonitor getMonitor() {
+ return monitor;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJobEvent.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJobEvent.java
new file mode 100644
index 0000000..1143cf3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJobEvent.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.sync;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class SubmitJobEvent {
+
+ private final SubmitJob job;
+
+ /**
+ * @since 3.0
+ */
+ public SubmitJobEvent(SubmitJob job) {
+ this.job = job;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public SubmitJob getJob() {
+ return job;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJobListener.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJobListener.java
new file mode 100644
index 0000000..1cba03c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SubmitJobListener.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.sync;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class SubmitJobListener {
+
+ /**
+ * @since 3.0
+ */
+ public abstract void taskSubmitted(SubmitJobEvent event, IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract void taskSynchronized(SubmitJobEvent event, IProgressMonitor monitor) throws CoreException;
+
+ /**
+ * @since 3.0
+ */
+ public abstract void done(SubmitJobEvent event);
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SynchronizationJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SynchronizationJob.java
new file mode 100644
index 0000000..d8ebb7c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/SynchronizationJob.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.sync;
+
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public abstract class SynchronizationJob extends Job {
+
+// private boolean changedTasksSynchronization = true;
+
+ private boolean fullSynchronization = false;
+
+ /**
+ * @since 3.0
+ */
+ public SynchronizationJob(String name) {
+ super(name);
+ }
+
+// public boolean isChangedTasksSynchronization() {
+// return changedTasksSynchronization;
+// }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isFullSynchronization() {
+ return fullSynchronization;
+ }
+
+// public void setChangedTasksSynchronization(boolean synchronizeChangedTasks) {
+// this.changedTasksSynchronization = synchronizeChangedTasks;
+// }
+
+ /**
+ * @since 3.0
+ */
+ public void setFullSynchronization(boolean fullSynchronization) {
+ this.fullSynchronization = fullSynchronization;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/TaskJob.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/TaskJob.java
new file mode 100644
index 0000000..c292bc4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/tasks/core/sync/TaskJob.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core.sync;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public abstract class TaskJob extends Job {
+
+ /**
+ * @since 3.0
+ */
+ public TaskJob(String name) {
+ super(name);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public abstract IStatus getStatus();
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/.classpath b/org.eclipse.mylyn.tasks.tests/.classpath
new file mode 100644
index 0000000..77f8017
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.tasks.tests/.cvsignore b/org.eclipse.mylyn.tasks.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.tasks.tests/.project b/org.eclipse.mylyn.tasks.tests/.project
new file mode 100644
index 0000000..7098e87
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.tasks.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..c9f94ac
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'empty.txt'" description="Delete element" element1="testdata/tasklistdatamigrationtest/empty.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1161234648812" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..615f382
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1 @@
+1161234648812 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..0f13f2d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'empty.txt'" description="Delete element" element1="testdata/tasklistdatamigrationtest/empty.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1162489628359" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..f6aba38
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1 @@
+1162489628359 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..b620f49
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.OfflineTaskManagerTest' to 'TaskDataManagerTest' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.OfflineTaskManagerTest' - Renamed element: 'org.eclipse.mylar.tasks.tests.TaskDataManagerTest' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'OfflineTaskManagerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests{OfflineTaskManagerTest.java[OfflineTaskManagerTest" matchStrategy="1" name="TaskDataManagerTest" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1164332086906" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..13b9c73
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1 @@
+1164332086906 Rename type 'OfflineTaskManagerTest'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..3f94cfc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.CommentWrappingTest' to 'CommentWrapperTest' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.CommentWrappingTest' - Renamed element: 'org.eclipse.mylar.tasks.tests.CommentWrapperTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'CommentWrappingTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests{CommentWrappingTest.java[CommentWrappingTest" matchStrategy="1" name="CommentWrapperTest" qualified="false" references="true" similarDeclarations="false" stamp="1165172034250" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.CommentWrapperTest' to 'CommentQuoterTest' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.CommentWrapperTest' - Renamed element: 'org.eclipse.mylar.tasks.tests.CommentQuoterTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'CommentWrapperTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests{CommentWrapperTest.java[CommentWrapperTest" matchStrategy="1" name="CommentQuoterTest" qualified="false" references="true" similarDeclarations="false" stamp="1165173091609" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'policy' in 'org.eclipse.mylar.tasks.tests.BackgroundSaveTest' to 'saveManager' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.BackgroundSaveTest.policy' - Renamed element: 'org.eclipse.mylar.tasks.tests.BackgroundSaveTest.saveManager' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'policy'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.tests{BackgroundSaveTest.java[BackgroundSaveTest^policy" name="saveManager" references="true" setter="false" stamp="1165363879921" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..d7da2b2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,2 @@
+1165172034250 Rename type 'CommentWrappingTest'
+1165173091609 Rename type 'CommentWrapperTest'1165363879921 Rename field 'policy'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..79f32f9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml" name="tasklist_0_4_8.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140390227932"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml" name="tasklist_0_4_8.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140395736126"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml" name="tasklist_0_4_8.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140395883137"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml" name="tasklist_0_4_8.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140396057608"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml" name="tasklist_0_4_8.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140397259396"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8-save.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml" name="tasklist_0_4_8-save.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140397340763"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist_0_4_8-.xml' to 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist_0_4_8-.xml" name="tasklist_0_4_8.xml" project="org.eclipse.mylar.tasklist.tests" stamp="1140397486633"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..66c5fee
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1,7 @@
+1140390227932 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'
+1140395736126 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'
+1140395883137 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'
+1140396057608 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'
+1140397259396 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8.xml'
+1140397340763 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist.xml' to 'tasklist_0_4_8-save.xml'
+1140397486633 Rename resource '/org.eclipse.mylar.tasklist.tests/testdata/legacy/tasklist_0_4_8-.xml' to 'tasklist_0_4_8.xml'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/10/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/10/refactorings.history
new file mode 100644
index 0000000..e6ba62a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/10/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Extract local variable 'task' from expression 'new Task("1","",true)'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="=org.eclipse.mylar.tasklist.tests/src<org.eclipse.mylar.tasklist.tests{TabelSorterTest.java" name="task" project="org.eclipse.mylar.tasklist.tests" replace="true" selection="1171 23" stamp="1141843320075"/>
+<refactoring comment="" description="Extract local variable 'category' from expression 'new TaskCategory("cat")'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="=org.eclipse.mylar.tasklist.tests/src<org.eclipse.mylar.tasklist.tests{TabelSorterTest.java" name="category" project="org.eclipse.mylar.tasklist.tests" replace="true" selection="1217 23" stamp="1141843341225"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/10/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/10/refactorings.index
new file mode 100644
index 0000000..00201ff
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/10/refactorings.index
@@ -0,0 +1,2 @@
+1141843320075 Extract local variable 'task' from expression 'new Task("1","",true)'
+1141843341225 Extract local variable 'category' from expression 'new TaskCategory("cat")'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..7d7ef4c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.tasklist.tests.SmartComparatorTest' to 'TaskKeyComparatorTest'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist.tests/src<org.eclipse.mylar.tasklist.tests{SmartComparatorTest.java[SmartComparatorTest" matchStrategy="1" name="TaskKeyComparatorTest" project="org.eclipse.mylar.tasklist.tests" qualified="false" references="true" similarDeclarations="false" stamp="1141185818906" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..bbe46f3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1 @@
+1141185818906 Rename type 'org.eclipse.mylar.tasklist.tests.SmartComparatorTest' to 'TaskKeyComparatorTest'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..f431dea
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasklist.tests.FiltersTest' to 'InterestFilterTest' - Original element: 'org.eclipse.mylar.tasklist.tests.FiltersTest' - Renamed element: 'org.eclipse.mylar.tasklist.tests.InterestFilterTest' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'FiltersTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasklist.tests{FiltersTest.java[FiltersTest" matchStrategy="1" name="InterestFilterTest" qualified="false" references="true" similarDeclarations="true" stamp="1147798134073" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasklist.tests.InterestFilterTest' to 'TaskListFiltersTest' - Original element: 'org.eclipse.mylar.tasklist.tests.InterestFilterTest' - Renamed element: 'org.eclipse.mylar.tasklist.tests.TaskListFiltersTest' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'InterestFilterTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasklist.tests{InterestFilterTest.java[InterestFilterTest" matchStrategy="1" name="TaskListFiltersTest" qualified="false" references="true" similarDeclarations="true" stamp="1147803640271" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..b98b27f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1,2 @@
+1147798134073 Rename type 'FiltersTest'
+1147803640271 Rename type 'InterestFilterTest'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..5a21de5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasklist.tests.AllTasklistTests' to 'AllTaskListTests' - Original element: 'org.eclipse.mylar.tasklist.tests.AllTasklistTests' - Renamed element: 'org.eclipse.mylar.tasklist.tests.AllTaskListTests' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AllTasklistTests'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasklist.tests{AllTasklistTests.java[AllTasklistTests" matchStrategy="1" name="AllTaskListTests" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1150333685079" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..4a31f69
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1 @@
+1150333685079 Rename type 'AllTasklistTests'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..0ff4856
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.tasklist.tests.BugzillaTaskTest.creation_ts_date_format' to 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask' - Original element: 'org.eclipse.mylar.tasklist.tests.BugzillaTaskTest.creation_ts_date_format' - Destination type: 'org.eclipse.mylar.internal.bugzilla.ui.tasklist.BugzillaTask'" delegate="false" deprecate="true" description="Move member 'creation_ts_date_format'" element1="/src<org.eclipse.mylar.tasklist.tests{BugzillaTaskTest.java[BugzillaTaskTest^creation_ts_date_format" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaTask.java[BugzillaTask" stamp="1150736097734" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasklist.tests.ContextExternalizerTest' to 'TaskRepositoriesExternalizerTest' - Original element: 'org.eclipse.mylar.tasklist.tests.ContextExternalizerTest' - Renamed element: 'org.eclipse.mylar.tasklist.tests.TaskRepositoriesExternalizerTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'ContextExternalizerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasklist.tests{ContextExternalizerTest.java[ContextExternalizerTest" matchStrategy="1" name="TaskRepositoriesExternalizerTest" patterns="*.xml" qualified="false" references="true" similarDeclarations="false" stamp="1151012752889" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasklist.tests.TaskRepositoriesExternalizerTest.SUFFIX' from expression '"2"' - Constant name: 'SUFFIX' - Constant expression: '"2"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'SUFFIX'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasklist.tests{TaskRepositoriesExternalizerTest.java" name="SUFFIX" qualify="false" replace="true" selection="1972 3" stamp="1151017289889" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasklist.tests.mockconnector.MockRepositoryConnector.REPOSITORY_TYPE' from expression '"mock"' - Constant name: 'REPOSITORY_TYPE' - Constant expression: '"mock"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'REPOSITORY_TYPE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasklist.tests.mockconnector{MockRepositoryConnector.java" name="REPOSITORY_TYPE" qualify="false" replace="true" selection="2782 6" stamp="1151077008107" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.URL1' from expression '"http://www.eclipse.org/mylar"' - Constant name: 'URL1' - Constant expression: '"http://www.eclipse.org/mylar"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'URL1'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasklist.tests{RepositoryTaskSynchronizationTest.java" name="URL1" qualify="false" replace="true" selection="2112 30" stamp="1151078117654" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.HANDLE1' from expression '"handle1"' - Constant name: 'HANDLE1' - Constant expression: '"handle1"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'HANDLE1'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasklist.tests{RepositoryTaskSynchronizationTest.java" name="HANDLE1" qualify="false" replace="true" selection="2046 9" stamp="1151078132967" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.getTaskConfiguration(...)' to 'primeTaskAndRepository' - Original element: 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.getTaskConfiguration(...)' - Renamed element: 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.primeTaskAndRepository(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getTaskConfiguration'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasklist.tests{RepositoryTaskSynchronizationTest.java[RepositoryTaskSynchronizationTest~getTaskConfiguration~QRepositoryTaskSyncState;~QRepositoryTaskSyncState;" name="primeTaskAndRepository" references="true" stamp="1151091880670" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.DATE_STAMP_1' from expression '"2006-06-21 15:29:40"' - Constant name: 'DATE_STAMP_1' - Constant expression: '"2006-06-21 15:29:40"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DATE_STAMP_1'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasklist.tests{RepositoryTaskSynchronizationTest.java" name="DATE_STAMP_1" qualify="false" replace="true" selection="11140 21" stamp="1151098846811" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasklist.tests.RepositoryTaskSynchronizationTest.DATE_STAMP_2' from expression '"2006-06-21 15:29:41"' - Constant name: 'DATE_STAMP_2' - Constant expression: '"2006-06-21 15:29:41"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DATE_STAMP_2'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasklist.tests{RepositoryTaskSynchronizationTest.java" name="DATE_STAMP_2" qualify="false" replace="true" selection="10886 21" stamp="1151098862998" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..437ffc2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,9 @@
+1150736097734 Move member 'creation_ts_date_format'
+1151098862998 Extract constant 'DATE_STAMP_2'
+1151098846811 Extract constant 'DATE_STAMP_1'
+1151091880670 Rename method 'getTaskConfiguration'
+1151078132967 Extract constant 'HANDLE1'
+1151078117654 Extract constant 'URL1'
+1151077008107 Extract constant 'REPOSITORY_TYPE'
+1151017289889 Extract constant 'SUFFIX'
+1151012752889 Rename type 'ContextExternalizerTest'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/26/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/26/refactorings.history
new file mode 100644
index 0000000..2244205
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/26/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'sampleFile' from expression '"TaskAttachmentActionsTest.testfile"' - Variable name: 'sampleFile' - Destination method: 'org.eclipse.mylar.tasklist.tests.TaskAttachmentActionsTest.testSaveRemoteFileAction()' - Variable expression: '"TaskAttachmentActionsTest.testfile"' - Replace occurrences of expression with variable" description="Extract local variable 'sampleFile'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.tasklist.tests{TaskAttachmentActionsTest.java" name="sampleFile" replace="true" selection="1649 36" stamp="1151347326548" version="1.0"/>
+<refactoring comment="Rename local variable 'i' in 'org.eclipse.mylar.tasklist.tests.TaskAttachmentActionsTest.testSaveRemoteFileAction()' to 'lines' - Original element: 'org.eclipse.mylar.tasklist.tests.TaskAttachmentActionsTest.testSaveRemoteFileAction().i' - Renamed element: 'org.eclipse.mylar.tasklist.tests.TaskAttachmentActionsTest.testSaveRemoteFileAction().lines' - Update references to refactored element" description="Rename local variable 'i'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasklist.tests{TaskAttachmentActionsTest.java" name="lines" references="true" selection="2384 1" stamp="1151347979844" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/26/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/26/refactorings.index
new file mode 100644
index 0000000..2246612
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/6/26/refactorings.index
@@ -0,0 +1,2 @@
+1151347326548 Extract local variable 'sampleFile'
+1151347979844 Rename local variable 'i'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..13e26a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'page' in 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor()' to 'currentPage' - Original element: 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor().page' - Renamed element: 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor().currentPage' - Update references to refactored element" description="Rename local variable 'page'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasklist.tests{TaskEditorTest.java" name="currentPage" references="true" selection="1864 4" stamp="1152644075753" version="1.0"/>
+<refactoring comment="Rename local variable 'currentPage' in 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor()' to 'page' - Original element: 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor().currentPage' - Renamed element: 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor().page' - Update references to refactored element" description="Rename local variable 'currentPage'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasklist.tests{TaskEditorTest.java" name="page" references="true" selection="1864 11" stamp="1152644163089" version="1.0"/>
+<refactoring comment="Extract local variable 'desc' from expression '"description"' - Variable name: 'desc' - Destination method: 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor()' - Variable expression: '"description"' - Replace occurrences of expression with variable" description="Extract local variable 'desc'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.tasklist.tests{TaskEditorTest.java" name="desc" replace="true" selection="2369 13" stamp="1152644718066" version="1.0"/>
+<refactoring comment="Extract local variable 'summary' from expression '"summary"' - Variable name: 'summary' - Destination method: 'org.eclipse.mylar.tasklist.tests.TaskEditorTest.testAccessNewEditor()' - Variable expression: '"summary"' - Replace occurrences of expression with variable" description="Extract local variable 'summary'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.tasklist.tests{TaskEditorTest.java" name="summary" replace="true" selection="2336 9" stamp="1152644731115" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.tasklist.tests' to 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests/src/org.eclipse.mylar.tasklist.tests' - Renamed element: 'org.eclipse.mylar.tasks.tests/src/org.eclipse.mylar.tasks.tests' - Update references to refactored element - Update fully qualified names in non-Java files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.tasklist.tests'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.tasklist.tests" name="org.eclipse.mylar.tasks.tests" qualified="true" references="true" stamp="1152909988000" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..593fb5b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,5 @@
+1152644075753 Rename local variable 'page'
+1152909988000 Rename package 'org.eclipse.mylar.tasklist.tests'
+1152644731115 Extract local variable 'summary'
+1152644718066 Extract local variable 'desc'
+1152644163089 Rename local variable 'currentPage'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..9a452f5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.tasks.tests.mockconnector' to 'org.eclipse.mylar.tasks.tests.connector' - Original element: 'org.eclipse.mylar.tasks.tests/src/org.eclipse.mylar.tasks.tests.mockconnector' - Renamed element: 'org.eclipse.mylar.tasks.tests/src/org.eclipse.mylar.tasks.tests.connector' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.tasks.tests.mockconnector'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.tasks.tests.mockconnector" name="org.eclipse.mylar.tasks.tests.connector" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1153106879484" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.AllTaskListTests' to 'AllTasksTests' - Original element: 'org.eclipse.mylar.tasks.tests.AllTaskListTests' - Renamed element: 'org.eclipse.mylar.tasks.tests.AllTasksTests' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AllTaskListTests'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests{AllTaskListTests.java[AllTaskListTests" matchStrategy="1" name="AllTasksTests" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153107897171" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..10767eb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,2 @@
+1153106879484 Rename package 'org.eclipse.mylar.tasks.tests.mockconnector'
+1153107897171 Rename type 'AllTaskListTests'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..e15bf33
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'REPOSITORY_TYPE' in 'org.eclipse.mylar.tasks.tests.connector.MockRepositoryConnector' to 'REPOSITORY_KIND' - Original element: 'org.eclipse.mylar.tasks.tests.connector.MockRepositoryConnector.REPOSITORY_TYPE' - Renamed element: 'org.eclipse.mylar.tasks.tests.connector.MockRepositoryConnector.REPOSITORY_KIND' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'REPOSITORY_TYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.tests.connector{MockRepositoryConnector.java[MockRepositoryConnector^REPOSITORY_TYPE" name="REPOSITORY_KIND" references="true" setter="false" stamp="1153791862043" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..db312f2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1 @@
+1153791862043 Rename field 'REPOSITORY_TYPE'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/33/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/33/refactorings.history
new file mode 100644
index 0000000..df7051c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/33/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.tests.TaskListManagerTest.MOCK_REPOSITORY_URL' from expression '"http://mock.repository"' - Constant name: 'MOCK_REPOSITORY_URL' - Constant expression: '"http://mock.repository"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MOCK_REPOSITORY_URL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.tests{TaskListManagerTest.java" name="MOCK_REPOSITORY_URL" qualify="false" replace="true" selection="2496 24" stamp="1155666695718" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/33/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/33/refactorings.index
new file mode 100644
index 0000000..b72ac83
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/33/refactorings.index
@@ -0,0 +1 @@
+1155666695718 Extract constant 'MOCK_REPOSITORY_URL'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..1bc3c67
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.CompletionChangeTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.tests{CompletionChangeTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1156373618750" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.connector.MockConnectorUi' to 'MockRepositoryUi' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.connector.MockConnectorUi' - Renamed element: 'org.eclipse.mylar.tasks.tests.connector.MockRepositoryUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'MockConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests.connector{MockConnectorUi.java[MockConnectorUi" matchStrategy="1" name="MockRepositoryUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156521180781" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..13cc86a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1,2 @@
+1156373618750 Delete element
+1156521180781 Rename type 'MockConnectorUi'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/37/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/37/refactorings.history
new file mode 100644
index 0000000..1b574cd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.tests/testdata/tasklistdatamigration' to 'tasklistdatamigrationtest' - Original element: 'tasklistdatamigration'" description="Rename resource 'tasklistdatamigration'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="testdata/tasklistdatamigration" name="tasklistdatamigrationtest" stamp="1158093237156" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/37/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/37/refactorings.index
new file mode 100644
index 0000000..d996966
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/37/refactorings.index
@@ -0,0 +1 @@
+1158093237156 Rename resource 'tasklistdatamigration'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..9261ba4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.tests.ProjectRepositoryAssociationTest.REPOSITORY_KIND' from expression '"bugzilla"' - Constant name: 'REPOSITORY_KIND' - Constant expression: '"bugzilla"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'REPOSITORY_KIND'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.tests{ProjectRepositoryAssociationTest.java" name="REPOSITORY_KIND" qualify="false" replace="true" selection="1444 10" stamp="1158947736725" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.tests.ProjectRepositoryAssociationTest.REPOSITORY_URL' from expression '"http://mylar.eclipse.org/bugs222"' - Constant name: 'REPOSITORY_URL' - Constant expression: '"http://mylar.eclipse.org/bugs222"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'REPOSITORY_URL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.tests{ProjectRepositoryAssociationTest.java" name="REPOSITORY_URL" qualify="false" replace="true" selection="1521 34" stamp="1158947747256" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..bf69e64
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1,2 @@
+1158947736725 Extract constant 'REPOSITORY_KIND'
+1158947747256 Extract constant 'REPOSITORY_URL'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..28da907
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.TaskListDataMigrationTest' to 'TaskList06DataMigrationTest' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.TaskListDataMigrationTest' - Renamed element: 'org.eclipse.mylar.tasks.tests.TaskList06DataMigrationTest' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListDataMigrationTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests{TaskListDataMigrationTest.java[TaskListDataMigrationTest" matchStrategy="1" name="TaskList06DataMigrationTest" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1169229699857" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'mylardata-2007-01-19.zip'" description="Delete element" element1="testdata/taskdataimporttest/mylardata-2007-01-19.zip" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1169245900296" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..0b66217
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1,2 @@
+1169229699857 Rename type 'TaskListDataMigrationTest'
+1169245900296 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/11/47/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/11/47/refactorings.history
new file mode 100644
index 0000000..cec083b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/11/47/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.LinkProviderTest.MockLinkProvider' to 'LinkProviderStub'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.LinkProviderTest.MockLinkProvider'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.LinkProviderTest.LinkProviderStub'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'MockLinkProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{LinkProviderTest.java[LinkProviderTest[MockLinkProvider" matchStrategy="1" name="LinkProviderStub" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1195690733276" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/11/47/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/11/47/refactorings.index
new file mode 100644
index 0000000..6a2b72b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/11/47/refactorings.index
@@ -0,0 +1 @@
+1195690733276 Rename type 'MockLinkProvider'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..fc55493
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private IWorkingSet createWorkingSet(MockRepositoryQuery element)' from 'org.eclipse.mylyn.tasks.tests.TaskWorkingSetTest.testRenameQuery()' to 'org.eclipse.mylyn.tasks.tests.TaskWorkingSetTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Method name: 'createWorkingSet'
- Destination type: 'org.eclipse.mylyn.tasks.tests.TaskWorkingSetTest'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'createWorkingSet'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.tests{TaskWorkingSetTest.java" name="createWorkingSet" replace="true" selection="2009 345" stamp="1198102803516" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..6bc3afc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1 @@
+1198102803516 Extract method 'createWorkingSet'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..af0f419
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tests/src/org.eclipse.mylar.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Destination element: 'org.eclipse.mylar.tests/src/org.eclipse.mylar.tests' - Original element: 'org.eclipse.mylar.tasks.tests.WebRepositoryConnectorTest.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tests" element1="/src<org.eclipse.mylar.tasks.tests{WebRepositoryConnectorTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170722068384" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..2391912
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1 @@
+1170722068384 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..45d1139
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.tests.TaskActivityViewTest' to 'TaskActivityTest' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.TaskActivityViewTest' - Renamed element: 'org.eclipse.mylar.tasks.tests.TaskActivityTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskActivityViewTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.tests{TaskActivityViewTest.java[TaskActivityViewTest" matchStrategy="1" name="TaskActivityTest" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1175132179703" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..4245bbc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1 @@
+1175132179703 Rename type 'TaskActivityViewTest'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/4/15/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/4/15/refactorings.history
new file mode 100644
index 0000000..efcc468
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/4/15/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'activity.xml.zip'" description="Delete element" element1="testdata/activity.xml.zip" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1176448092000" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/4/15/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/4/15/refactorings.index
new file mode 100644
index 0000000..31e12f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/4/15/refactorings.index
@@ -0,0 +1 @@
+1176448092000 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..021a292
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.tests.connector.MockQueryHit.java'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.tests.connector{MockQueryHit.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180646969921" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..66aad1e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1 @@
+1180646969921 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..948aba6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.MylarTasksTestsPlugin' to 'TasksTestsPlugin' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.MylarTasksTestsPlugin' - Renamed element: 'org.eclipse.mylyn.tasks.tests.TasksTestsPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarTasksTestsPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{MylarTasksTestsPlugin.java[MylarTasksTestsPlugin" matchStrategy="1" name="TasksTestsPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268978301" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..1a28a64
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1 @@
+1181268978301 Rename type 'MylarTasksTestsPlugin'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..bba7bb7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'nrOfCategoriesMinusArchiveContainer' in 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testGetSubMenuManagerContainsAllCategoriesPlusNewCategory()' to 'numCategoriesMinusArchiveContainer' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testGetSubMenuManagerContainsAllCategoriesPlusNewCategory().nrOfCategoriesMinusArchiveContainer' - Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testGetSubMenuManagerContainsAllCategoriesPlusNewCategory().numCategoriesMinusArchiveContainer' - Update references to refactored element" description="Rename local variable 'nrOfCategoriesMinusArchiveContainer'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.tests{TaskListUiTest.java" name="numCategoriesMinusArchiveContainer" references="true" selection="9312 35" stamp="1182034649788" version="1.0"/>
+<refactoring comment="Rename local variable 'nrOfSeparators' in 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testGetSubMenuManagerContainsAllCategoriesPlusNewCategory()' to 'numSeparators' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testGetSubMenuManagerContainsAllCategoriesPlusNewCategory().nrOfSeparators' - Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testGetSubMenuManagerContainsAllCategoriesPlusNewCategory().numSeparators' - Update references to refactored element" description="Rename local variable 'nrOfSeparators'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.tests{TaskListUiTest.java" name="numSeparators" references="true" selection="9406 14" stamp="1182034653991" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..f4494be
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1182034649788 Rename local variable 'nrOfCategoriesMinusArchiveContainer'
+1182034653991 Rename local variable 'nrOfSeparators'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..63777cf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests' - Original project: 'org.eclipse.mylyn.tasks.tests' - Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.FileSystemTaskDataStorageTest.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests" element1="/src<org.eclipse.mylyn.tasks.tests{FileSystemTaskDataStorageTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylyn.tasks.tests{FileSystemTaskDataStorageTest.java	true	true	CachingOfflineStorageTest.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1182103561703" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.FileSystemTaskDataStorageTest' to 'OfflineXMLStorageTest' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.FileSystemTaskDataStorageTest' - Renamed element: 'org.eclipse.mylyn.tasks.tests.OfflineXMLStorageTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'FileSystemTaskDataStorageTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{FileSystemTaskDataStorageTest.java[FileSystemTaskDataStorageTest" matchStrategy="1" name="OfflineXMLStorageTest" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182103621687" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.OfflineXMLStorageTest' to 'OfflineXmlStorageTest' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.OfflineXMLStorageTest' - Renamed element: 'org.eclipse.mylyn.tasks.tests.OfflineXmlStorageTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'OfflineXMLStorageTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{OfflineXMLStorageTest.java[OfflineXMLStorageTest" matchStrategy="1" name="OfflineXmlStorageTest" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182103638140" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.CachingOfflineStorageTest' to 'OfflineCachingStorageTest' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.CachingOfflineStorageTest' - Renamed element: 'org.eclipse.mylyn.tasks.tests.OfflineCachingStorageTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'CachingOfflineStorageTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{CachingOfflineStorageTest.java[CachingOfflineStorageTest" matchStrategy="1" name="OfflineCachingStorageTest" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182103665234" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.OfflineXmlStorageTest' to 'OfflineStorageTest' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.OfflineXmlStorageTest' - Renamed element: 'org.eclipse.mylyn.tasks.tests.OfflineStorageTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'OfflineXmlStorageTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{OfflineXmlStorageTest.java[OfflineXmlStorageTest" matchStrategy="1" name="OfflineStorageTest" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182103708843" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.tests.OfflineCachingStorageTest.MOCK_ID' from expression '"1"' - Original project: 'org.eclipse.mylyn.tasks.tests' - Constant name: 'MOCK_ID' - Constant expression: '"1"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MOCK_ID'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.tests{OfflineCachingStorageTest.java" name="MOCK_ID" qualify="false" replace="true" selection="3287 3" stamp="1182105507625" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryExternalizer' to 'MockTaskListFactory' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryExternalizer' - Renamed element: 'org.eclipse.mylyn.tasks.tests.connector.MockTaskListFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'MockRepositoryExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests.connector{MockRepositoryExternalizer.java[MockRepositoryExternalizer" matchStrategy="1" name="MockTaskListFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182400233042" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryUi' to 'MockTaskConnectorUi' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryUi' - Renamed element: 'org.eclipse.mylyn.tasks.tests.connector.MockTaskConnectorUi' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'MockRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests.connector{MockRepositoryUi.java[MockRepositoryUi" matchStrategy="1" name="MockTaskConnectorUi" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182561752922" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..e787501
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,8 @@
+1182103561703 Copy compilation unit
+1182103621687 Rename type 'FileSystemTaskDataStorageTest'
+1182103638140 Rename type 'OfflineXMLStorageTest'
+1182103665234 Rename type 'CachingOfflineStorageTest'
+1182103708843 Rename type 'OfflineXmlStorageTest'
+1182105507625 Extract constant 'MOCK_ID'
+1182400233042 Rename type 'MockRepositoryExternalizer'
+1182561752922 Rename type 'MockRepositoryUi'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/33/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/33/refactorings.history
new file mode 100644
index 0000000..268b827
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/33/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests' - Original project: 'org.eclipse.mylyn.tasks.tests' - Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.TaskActivityTest.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests" element1="/src<org.eclipse.mylyn.tasks.tests{TaskActivityTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylyn.tasks.tests{TaskActivityTest.java	true	true	TaskSchedulingTest.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1187030525718" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.TaskSchedulingTest' to 'TaskActivityTimingTest' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.TaskSchedulingTest' - Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskActivityTimingTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskSchedulingTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{TaskSchedulingTest.java[TaskSchedulingTest" matchStrategy="1" name="TaskActivityTimingTest" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1187031226609" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.TaskActivityTest' to 'ScheduledPresentationTest' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.TaskActivityTest' - Renamed element: 'org.eclipse.mylyn.tasks.tests.ScheduledPresentationTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskActivityTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{TaskActivityTest.java[TaskActivityTest" matchStrategy="1" name="ScheduledPresentationTest" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1187031317875" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.tests.ScheduledPresentationTest.testDateRangeContainer()' to 'testScheduledTaskContainer' - Original project: 'org.eclipse.mylyn.tasks.tests' - Original element: 'org.eclipse.mylyn.tasks.tests.ScheduledPresentationTest.testDateRangeContainer()' - Renamed element: 'org.eclipse.mylyn.tasks.tests.ScheduledPresentationTest.testScheduledTaskContainer()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testDateRangeContainer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.tests{ScheduledPresentationTest.java[ScheduledPresentationTest~testDateRangeContainer" name="testScheduledTaskContainer" references="true" stamp="1187037656109" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/33/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/33/refactorings.index
new file mode 100644
index 0000000..3fa49cc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/33/refactorings.index
@@ -0,0 +1,4 @@
+1187030525718 Copy compilation unit
+1187031226609 Rename type 'TaskSchedulingTest'
+1187031317875 Rename type 'TaskActivityTest'
+1187037656109 Rename method 'testDateRangeContainer'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/34/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/34/refactorings.history
new file mode 100644
index 0000000..cfc9861
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/34/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.PersonProposalProviderTest.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests" element1="/src<org.eclipse.mylyn.internal.tasks.ui{PersonProposalProviderTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1187828907944" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.internal.tasks.ui'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui" element2="/src<org.eclipse.mylyn.internal.tasks" element3="/src<org.eclipse.mylyn.internal" elements="3" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1187828931586" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.QueryCreationTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests{QueryCreationTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1187829016394" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/34/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/34/refactorings.index
new file mode 100644
index 0000000..a079555
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/34/refactorings.index
@@ -0,0 +1,3 @@
+1187828907944 Move compilation unit
+1187828931586 Delete element
+1187829016394 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/35/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/35/refactorings.history
new file mode 100644
index 0000000..48f1fb8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/35/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'presentations' from expression 'TaskListView.getPresentations()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'presentations'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TaskListPresentationTest.testDefaultPresentations()'
- Variable expression: 'TaskListView.getPresentations()'
- Replace occurrences of expression with variable" description="Extract local variable 'presentations'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskListPresentationTest.java" name="presentations" replace="true" selection="786 31" stamp="1188268150225" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/35/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/35/refactorings.index
new file mode 100644
index 0000000..fe97929
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/8/35/refactorings.index
@@ -0,0 +1 @@
+1188268150225 Extract local variable 'presentations'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/9/38/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/9/38/refactorings.history
new file mode 100644
index 0000000..045d551
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/9/38/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.tests.TaskActivationActionTest.testNotification()' to 'testUpdateOnExternalActivation'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskActivationActionTest.testNotification()'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskActivationActionTest.testUpdateOnExternalActivation()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testNotification'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.tests{TaskActivationActionTest.java[TaskActivationActionTest~testNotification" name="testUpdateOnExternalActivation" references="true" stamp="1190315602832" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.RepositorySelectionTest' to 'RepositorySelectionForTaskCreationTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.RepositorySelectionTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.RepositorySelectionForTaskCreationTest'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'RepositorySelectionTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{RepositorySelectionTest.java[RepositorySelectionTest" matchStrategy="1" name="RepositorySelectionForTaskCreationTest" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190319603911" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.RepositorySelectionForTaskCreationTest' to 'NewTaskWizardRepositorySelectionTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.RepositorySelectionForTaskCreationTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'RepositorySelectionForTaskCreationTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{RepositorySelectionForTaskCreationTest.java[RepositorySelectionForTaskCreationTest" matchStrategy="1" name="NewTaskWizardRepositorySelectionTest" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190319614557" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testSelectRepositoryPageSelection()' to 'testFirstElementSelection'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testSelectRepositoryPageSelection()'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testFirstElementSelection()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testSelectRepositoryPageSelection'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.tests{NewTaskWizardRepositorySelectionTest.java[NewTaskWizardRepositorySelectionTest~testSelectRepositoryPageSelection" name="testFirstElementSelection" references="true" stamp="1190319633136" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.connector.MockTaskConnectorUi' to 'MockRepositoryConnectorUi'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockTaskConnectorUi'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'MockTaskConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests.connector{MockTaskConnectorUi.java[MockTaskConnectorUi" matchStrategy="1" name="MockRepositoryConnectorUi" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190328068018" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testFirstElementSelection()' to 'testDefaultWithNoTaskListSelection'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testFirstElementSelection()'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testDefaultWithNoTaskListSelection()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testFirstElementSelection'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.tests{NewTaskWizardRepositorySelectionTest.java[NewTaskWizardRepositorySelectionTest~testFirstElementSelection" name="testDefaultWithNoTaskListSelection" references="true" stamp="1190328262910" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testWorkbenchSelectionPreSelected()' to 'testRepositorySettingWithTaskListSelection'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testWorkbenchSelectionPreSelected()'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.NewTaskWizardRepositorySelectionTest.testRepositorySettingWithTaskListSelection()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testWorkbenchSelectionPreSelected'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.tests{NewTaskWizardRepositorySelectionTest.java[NewTaskWizardRepositorySelectionTest~testWorkbenchSelectionPreSelected" name="testRepositorySettingWithTaskListSelection" references="true" stamp="1190328285947" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2007/9/38/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/9/38/refactorings.index
new file mode 100644
index 0000000..2c06a73
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2007/9/38/refactorings.index
@@ -0,0 +1,7 @@
+1190315602832 Rename method 'testNotification'
+1190319603911 Rename type 'RepositorySelectionTest'
+1190319614557 Rename type 'RepositorySelectionForTaskCreationTest'
+1190319633136 Rename method 'testSelectRepositoryPageSelection'
+1190328068018 Rename type 'MockTaskConnectorUi'
+1190328262910 Rename method 'testFirstElementSelection'
+1190328285947 Rename method 'testWorkbenchSelectionPreSelected'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..fb660ce
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private TaskHyperlinkDetector createHyperlinkDetector()' from 'org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest.detect()' to 'org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Method name: 'createHyperlinkDetector'
- Destination type: 'org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest'
- Declared visibility: 'private'" comments="false" description="Extract method 'createHyperlinkDetector'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.tests.ui{TaskHyperlinkDetectorTest.java" name="createHyperlinkDetector" replace="false" selection="1615 313" stamp="1222831458442" version="1.0" visibility="2"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ui'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ui'
- Original element: 'org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests.ui" element1="/src<org.eclipse.mylyn.tasks.tests.ui{TaskHyperlinkDetectorTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1222831499911" units="1" version="1.0"/>
<refactoring comment="Move 1 package(s) to 'org.eclipse.mylyn.sandbox.tests/src'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src'
- Original element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.web'" description="Move package" destination="=org.eclipse.mylyn.sandbox.tests/src" element1="/src<org.eclipse.mylyn.tasks.tests.web" flags="589830" fragments="1" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.movePackages" stamp="1222912188323" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockTaskListFactory.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests.connector{MockTaskListFactory.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222928157476" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..36558e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1,4 @@
+1222831458442 Extract method 'createHyperlinkDetector'
+1222831499911 Copy compilation unit
+1222912188323 Move package
+1222928157476 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/12/52/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/12/52/refactorings.history
new file mode 100644
index 0000000..5ad8a8c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/12/52/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private String getActivePerspective()' from 'org.eclipse.mylyn.tasks.tests.ui.ContextPerspectiveManagerTest.testActivate()' to 'org.eclipse.mylyn.tasks.tests.ui.ContextPerspectiveManagerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Method name: 'getActivePerspective'
- Destination type: 'org.eclipse.mylyn.tasks.tests.ui.ContextPerspectiveManagerTest'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'getActivePerspective'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.tests.ui{ContextPerspectiveManagerTest.java" name="getActivePerspective" replace="true" selection="2595 95" stamp="1229969176133" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/12/52/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/12/52/refactorings.index
new file mode 100644
index 0000000..b9f0d42
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/12/52/refactorings.index
@@ -0,0 +1 @@
+1229969176133 Extract method 'getActivePerspective'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/3/9/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/3/9/refactorings.history
new file mode 100644
index 0000000..7938ded
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/3/9/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tests/src/org.eclipse.mylyn.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.tests/src/org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.UrlConnectionUtilTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tests/src<org.eclipse.mylyn.tests" element1="/src<org.eclipse.mylyn.tasks.tests{UrlConnectionUtilTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1204408864718" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/3/9/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/3/9/refactorings.index
new file mode 100644
index 0000000..58cf343
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/3/9/refactorings.index
@@ -0,0 +1 @@
+1204408864718 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..68a3453
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryTask' to 'MockTask'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryTask'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.connector.MockTask'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'MockRepositoryTask'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests.connector{MockRepositoryTask.java[MockRepositoryTask" matchStrategy="1" name="MockTask" qualified="false" references="true" similarDeclarations="true" stamp="1207120968983" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.tests.TaskKeyComparatorTest.java'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests.TaskKeyComparatorTest.java'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests{TaskKeyComparatorTest.java" element1="/src<org.eclipse.mylyn.tasks.tests{TaskListBackupManagerTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1207333746916" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..33207db
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1,2 @@
+1207120968983 Rename type 'MockRepositoryTask'
+1207333746916 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..ecf8b36
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'repositories.xml'" description="Delete element" element1="repositories.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208477534336" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ubgs'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests.ubgs" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208553792631" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..93ceb55
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1208477534336 Delete element
+1208553792631 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/17/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/17/refactorings.history
new file mode 100644
index 0000000..9489099
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/17/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.data.TaskDataManagerTest' to 'TaskDataExternalizerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.data.TaskDataManagerTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.data.TaskDataExternalizerTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskDataManagerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests.data{TaskDataManagerTest.java[TaskDataManagerTest" matchStrategy="1" name="TaskDataExternalizerTest" qualified="false" references="true" similarDeclarations="false" stamp="1209105118552" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.TaskDataManagerTest' to 'TaskDataStorageManagerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskDataManagerTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskDataStorageManagerTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskDataManagerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{TaskDataManagerTest.java[TaskDataManagerTest" matchStrategy="1" name="TaskDataStorageManagerTest" qualified="false" references="true" similarDeclarations="false" stamp="1209106219973" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/17/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/17/refactorings.index
new file mode 100644
index 0000000..d0b2548
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/17/refactorings.index
@@ -0,0 +1,2 @@
+1209105118552 Rename type 'TaskDataManagerTest'
+1209106219973 Rename type 'TaskDataManagerTest'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..ff3ccd2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'activePage' from expression 'TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TasksUiUtilTest.testOpenTaskFromTask()'
- Variable expression: 'TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TasksUiUtilTest.java" name="activePage" replace="true" selection="2483 99" stamp="1209580835079" version="1.0"/>

<refactoring comment="Extract local variable 'activePage' from expression 'TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TasksUiUtilTest.testOpenTaskFromString()'
- Variable expression: 'TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TasksUiUtilTest.java" name="activePage" replace="true" selection="3320 99" stamp="1209580907287" version="1.0"/>
<refactoring comment="Extract local variable 'activePage' from expression 'TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TasksUiUtilTest.testOpenUrl()'
- Variable expression: 'TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TasksUiUtilTest.java" name="activePage" replace="true" selection="3829 99" stamp="1209580916369" version="1.0"/>
<refactoring comment="Extract local variable 'editor' from expression 'activePage.getEditorReferences()[0].getEditor(true)'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'editor'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TasksUiUtilTest.testOpenUrl()'
- Variable expression: 'activePage.getEditorReferences()[0].getEditor(true)'
- Replace occurrences of expression with variable" description="Extract local variable 'editor'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TasksUiUtilTest.java" name="editor" replace="true" selection="3492 51" stamp="1209581261039" version="1.0"/>

<refactoring comment="Extract local variable 'editor2' from expression 'activePage.getEditorReferences()[1].getEditor(true)'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'editor2'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TasksUiUtilTest.testOpenUrl()'
- Variable expression: 'activePage.getEditorReferences()[1].getEditor(true)'
- Replace occurrences of expression with variable" description="Extract local variable 'editor2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TasksUiUtilTest.java" name="editor2" replace="true" selection="4126 51" stamp="1209581300673" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..266bedb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,5 @@
+1209580835079 Extract local variable 'activePage'
+1209580907287 Extract local variable 'activePage'
+1209580916369 Extract local variable 'activePage'
+1209581261039 Extract local variable 'editor'
+1209581300673 Extract local variable 'editor2'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/19/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/19/refactorings.history
new file mode 100644
index 0000000..04aedb8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/19/refactorings.history
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to '0.4.8'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: '0.4.8'
- Original element: 'tasklist_0_4_8.xml'" description="Copy file" element1="testdata/legacy/tasklist_0_4_8.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210012051575" target="/org.eclipse.mylyn.tasks.tests/testdata/legacy/0.4.8" units="0" version="1.0"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.tests/testdata/legacy/0.4.8/tasklist_0_4_8.xml' to 'tasklist.xml'" description="Rename resource 'tasklist_0_4_8.xml'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="testdata/legacy/0.4.8/tasklist_0_4_8.xml" name="tasklist.xml" stamp="1210012059842" updateReferences="true"/>

</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/19/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/19/refactorings.index
new file mode 100644
index 0000000..124637c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/19/refactorings.index
@@ -0,0 +1,2 @@
+1210012051575 Copy file
+1210012059842 Rename resource 'tasklist_0_4_8.xml'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..1cf415d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.RetrieveTitleFromUrlTest.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.tests/src<org.eclipse.mylyn.commons.tests" element1="/src<org.eclipse.mylyn.tasks.tests{RetrieveTitleFromUrlTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211308002394" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockStatusHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests.connector{MockStatusHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211327371079" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.bugs.KeyValueParserTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests.bugs{KeyValueParserTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211342100566" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..f8978d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,3 @@
+1211308002394 Move compilation unit
+1211327371079 Delete element
+1211342100566 Delete element
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..bd11abd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Inline method 'org.eclipse.mylyn.tasks.tests.TaskDiffUtilTest.testComment()' in 'org.eclipse.mylyn.tasks.tests.TaskDiffUtilTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskDiffUtilTest.testComment()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'testComment'" flags="786434" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.tasks.tests{TaskDiffUtilTest.java" mode="1" selection="2048 0" stamp="1212388678204" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.tasks.tests.TaskDiffUtilTest.testClean()' in 'org.eclipse.mylyn.tasks.tests.TaskDiffUtilTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskDiffUtilTest.testClean()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'testClean'" flags="786434" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.tasks.tests{TaskDiffUtilTest.java" mode="1" selection="2129 0" stamp="1212388684209" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..6b59481
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1212388678204 Inline method 'testComment'
+1212388684209 Inline method 'testClean'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/38/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/38/refactorings.history
new file mode 100644
index 0000000..a35adbd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/38/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.AbstractTaskContainerTest' to 'TaskContainerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.AbstractTaskContainerTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskContainerTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskContainerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{AbstractTaskContainerTest.java[AbstractTaskContainerTest" matchStrategy="1" name="TaskContainerTest" qualified="false" references="true" similarDeclarations="false" stamp="1221629849833" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.TaskMappingTest' to 'TaskMapperTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskMappingTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskMapperTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskMappingTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{TaskMappingTest.java[TaskMappingTest" matchStrategy="1" name="TaskMapperTest" qualified="false" references="true" similarDeclarations="false" stamp="1221629874310" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.OfflineCachingStorageTest' to 'TaskDataStoreTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.OfflineCachingStorageTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskDataStoreTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'OfflineCachingStorageTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{OfflineCachingStorageTest.java[OfflineCachingStorageTest" matchStrategy="1" name="TaskDataStoreTest" qualified="false" references="true" similarDeclarations="false" stamp="1221634141355" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.OfflineStorageTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests{OfflineStorageTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221634228337" subPackages="false" version="1.0"/>
<refactoring comment="Extract method 'private void assertData() throws CoreException ' from 'org.eclipse.mylyn.tasks.tests.TaskDataStoreTest.testAttributes()' to 'org.eclipse.mylyn.tasks.tests.TaskDataStoreTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Method name: 'assertData'
- Destination type: 'org.eclipse.mylyn.tasks.tests.TaskDataStoreTest'
- Declared visibility: 'private'" comments="false" description="Extract method 'assertData'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.tests{TaskDataStoreTest.java" name="assertData" replace="false" selection="5457 240" stamp="1221634617541" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskHistoryTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests{TaskHistoryTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221636274531" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskDataStorageManagerTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests{TaskDataStorageManagerTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221636510514" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.TaskListDnDTest' to 'TaskListDropAdapterTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListDnDTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskListDropAdapterTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskListDnDTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{TaskListDnDTest.java[TaskListDnDTest" matchStrategy="1" name="TaskListDropAdapterTest" qualified="false" references="true" similarDeclarations="false" stamp="1221636714533" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockAttributeFactory.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests.connector{MockAttributeFactory.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221694168871" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests.connector{MockRepositoryQuery.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221694177252" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.RepositoryTaskSynchronizationTest' to 'TaskDataManagerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.RepositoryTaskSynchronizationTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskDataManagerTest'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'RepositoryTaskSynchronizationTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{RepositoryTaskSynchronizationTest.java[RepositoryTaskSynchronizationTest" matchStrategy="1" name="TaskDataManagerTest" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1221695320145" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.tests.TaskActivityListenerTest' to 'TaskActivityManagerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskActivityListenerTest'
- Renamed element: 'org.eclipse.mylyn.tasks.tests.TaskActivityManagerTest'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskActivityListenerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.tests{TaskActivityListenerTest.java[TaskActivityListenerTest" matchStrategy="1" name="TaskActivityManagerTest" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1221696821663" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListManagerTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests{TaskListManagerTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221697540234" subPackages="false" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.tests.TaskListTest.testRenameCategory().newDesc' in 'org.eclipse.mylyn.tasks.tests.TaskListTest.testRenameCategory()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListTest.testRenameCategory().newDesc'" description="Inline local variable 'newDesc'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskListTest.java" selection="14941 26" stamp="1221698310240" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.tasks.tests.TaskListExternalizationTest.reloadTaskList()' in 'org.eclipse.mylyn.tasks.tests.TaskListExternalizationTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListExternalizationTest.reloadTaskList()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'reloadTaskList'" flags="786434" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.tasks.tests{TaskListExternalizationTest.java" mode="1" selection="1905 0" stamp="1221792832698" version="1.0"/>
<refactoring comment="Extract local variable 'serverUrl' from expression 'new URL("http://mylyn")'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'serverUrl'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TaskRepositoryTest.testAuthHandlerAvailable()'
- Variable expression: 'new URL("http://mylyn")'
- Replace occurrences of expression with variable" description="Extract local variable 'serverUrl'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskRepositoryTest.java" name="serverUrl" replace="true" selection="1385 23" stamp="1221794657523" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/38/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/38/refactorings.index
new file mode 100644
index 0000000..413b747
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/38/refactorings.index
@@ -0,0 +1,16 @@
+1221629849833 Rename type 'AbstractTaskContainerTest'
+1221629874310 Rename type 'TaskMappingTest'
+1221634141355 Rename type 'OfflineCachingStorageTest'
+1221634228337 Delete element
+1221634617541 Extract method 'assertData'
+1221636274531 Delete element
+1221636510514 Delete element
+1221636714533 Rename type 'TaskListDnDTest'
+1221694168871 Delete element
+1221694177252 Delete element
+1221695320145 Rename type 'RepositoryTaskSynchronizationTest'
+1221696821663 Rename type 'TaskActivityListenerTest'
+1221697540234 Delete element
+1221698310240 Inline local variable 'newDesc'
+1221792832698 Inline method 'reloadTaskList'
+1221794657523 Extract local variable 'serverUrl'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/39/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/39/refactorings.history
new file mode 100644
index 0000000..b7d5a19
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.tests'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskList06DataMigrationTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.tests{TaskList06DataMigrationTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221966262780" subPackages="false" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.setUp().backupFolder' in 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.setUp()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.setUp().backupFolder'" description="Inline local variable 'backupFolder'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskListBackupManagerTest.java" selection="1345 63" stamp="1221966936094" version="1.0"/>
<refactoring comment="Extract local variable 'taskList' from expression 'manager.getTaskList()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'taskList'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.setUp()'
- Variable expression: 'manager.getTaskList()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskList'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskListUiTest.java" name="taskList" replace="true" selection="3147 21" stamp="1221968586027" version="1.0"/>
<refactoring comment="Extract method 'private void addTaskAndRefreshView(LocalTask localTask)' from 'org.eclipse.mylyn.tasks.tests.ui.MarkTaskHandlerTest.testMarkLocalTaskCompleted()' to 'org.eclipse.mylyn.tasks.tests.ui.MarkTaskHandlerTest'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Method name: 'addTaskAndRefreshView'
- Destination type: 'org.eclipse.mylyn.tasks.tests.ui.MarkTaskHandlerTest'
- Declared visibility: 'private'" comments="false" description="Extract method 'addTaskAndRefreshView'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.tests.ui{MarkTaskHandlerTest.java" name="addTaskAndRefreshView" replace="false" selection="2523 159" stamp="1221973375197" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/39/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/39/refactorings.index
new file mode 100644
index 0000000..e77dced
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2008/9/39/refactorings.index
@@ -0,0 +1,4 @@
+1221966262780 Delete element
+1221966936094 Inline local variable 'backupFolder'
+1221968586027 Extract local variable 'taskList'
+1221973375197 Extract method 'addTaskAndRefreshView'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2009/1/2/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/1/2/refactorings.history
new file mode 100644
index 0000000..6c7bc5c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/1/2/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.core'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.core'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskRepositoryLocationTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests.core" element1="/src<org.eclipse.mylyn.tasks.tests{TaskRepositoryLocationTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1231095642273" units="1" version="1.0"/>
<refactoring comment="Extract local variable 'orphanedTasksContainer' from expression 'new UnmatchedTaskContainer(MockRepositoryConnector.REPOSITORY_KIND,MockRepositoryConnector.REPOSITORY_URL)'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'orphanedTasksContainer'
- Destination method: 'org.eclipse.mylyn.tasks.tests.OrphanedTasksTest.setUp()'
- Variable expression: 'new UnmatchedTaskContainer(MockRepositoryConnector.REPOSITORY_KIND,MockRepositoryConnector.REPOSITORY_URL)'
- Replace occurrences of expression with variable" description="Extract local variable 'orphanedTasksContainer'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{OrphanedTasksTest.java" name="orphanedTasksContainer" replace="true" selection="1442 111" stamp="1231096450808" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.core'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.core'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListUnmatchedContainerTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.tests.core" element1="/src<org.eclipse.mylyn.tasks.tests{TaskListUnmatchedContainerTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1231096535407" units="1" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.setUp().backupFileFolder' in 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.setUp()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Original element: 'org.eclipse.mylyn.tasks.tests.TaskListBackupManagerTest.setUp().backupFileFolder'" description="Inline local variable 'backupFileFolder'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskListBackupManagerTest.java" selection="1230 77" stamp="1231113110173" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2009/1/2/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/1/2/refactorings.index
new file mode 100644
index 0000000..0bb5d9a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/1/2/refactorings.index
@@ -0,0 +1,4 @@
+1231095642273 Move compilation unit
+1231096450808 Extract local variable 'orphanedTasksContainer'
+1231096535407 Move compilation unit
+1231113110173 Inline local variable 'backupFileFolder'
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2009/7/30/refactorings.history b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/7/30/refactorings.history
new file mode 100644
index 0000000..82cbaa3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'activePage' from expression 'PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.tests'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.tasks.tests.TaskListUiTest.testListenersRemoved()'
- Variable expression: 'PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.tests{TaskListUiTest.java" name="activePage" replace="true" selection="6536 68" stamp="1248130579211" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/.refactorings/2009/7/30/refactorings.index b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/7/30/refactorings.index
new file mode 100644
index 0000000..fb5db94
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.refactorings/2009/7/30/refactorings.index
@@ -0,0 +1 @@
+1248130579211 Extract local variable 'activePage'
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/.api_filters b/org.eclipse.mylyn.tasks.tests/.settings/.api_filters
new file mode 100644
index 0000000..e90b8b1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/.api_filters
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.mylyn.tasks.tests" version="2">
+ <resource path="src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskUrlHyperlinkDetectorTest.java" type="org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest">
+ <filter id="571519004">
+ <message_arguments>
+ <message_argument value="org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest.detect(String, int, int)"/>
+ <message_argument value="TextViewer"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java" type="org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest">
+ <filter id="571519004">
+ <message_arguments>
+ <message_argument value="org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest.detect(String, int, int)"/>
+ <message_argument value="TextViewer"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..606a24a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,151 @@
+#Tue May 20 10:45:34 PDT 2008
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
+ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INVALID_JAVADOC_TAG=Ignore
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
diff --git a/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..299a8e8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,43 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Tasks Tests
+Bundle-SymbolicName: org.eclipse.mylyn.tasks.tests;singleton:=true
+Bundle-Version: 0.0.0
+Bundle-Activator: org.eclipse.mylyn.tasks.tests.TasksTestsPlugin
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.net,
+ org.junit,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.commons.tests,
+ org.eclipse.jdt.core,
+ org.eclipse.core.resources,
+ org.eclipse.ui,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.mylyn.resources.tests,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.commons.ui,
+ org.eclipse.jface.text,
+ org.eclipse.test.performance,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.tasks.bugs,
+ org.eclipse.mylyn.commons.core,
+ org.eclipse.ui.browser,
+ org.eclipse.core.expressions
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: mylyn-tasklist-tests.jar
+Export-Package: org.eclipse.mylyn.tasks.tests;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.connector;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.core;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.data;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.performance;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.ui;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.ui.editor;x-internal:=true,
+ org.eclipse.mylyn.tasks.tests.util;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.tasks.tests/about.html b/org.eclipse.mylyn.tasks.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/build.properties b/org.eclipse.mylyn.tasks.tests/build.properties
new file mode 100644
index 0000000..f2fb726
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = META-INF/,\
+ mylyn-tasklist-tests.jar,\
+ about.html,\
+ plugin.xml,\
+ testdata/
+jars.compile.order = mylyn-tasklist-tests.jar
+source.mylyn-tasklist-tests.jar = src/
+output.mylyn-tasklist-tests.jar = bin/
+src.includes = about.html
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.tasks.tests/plugin.xml b/org.eclipse.mylyn.tasks.tests/plugin.xml
new file mode 100644
index 0000000..af8838a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/plugin.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ id="org.eclipse.mylyn.jira.repository"
+ name="JIRA Repository"
+ point="org.eclipse.mylyn.tasks.ui.repositories">
+ <connectorCore
+ class="org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector"
+ id="org.eclipse.mylyn.tasks.tests.repositories"
+ name="Mock Repository Client"/>
+ <connectorUi
+ class="org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi"
+ id="org.eclipse.mylyn.tasks.tests.repositories.ui"
+ name="Mock Repository Connector UI">
+ </connectorUi>
+ </extension>
+
+ <extension
+ point="org.eclipse.core.runtime.contentTypes">
+ <!-- content types used in tests -->
+ <content-type
+ base-type="org.eclipse.core.runtime.text"
+ file-extensions="mylyn-test-text"
+ id="org.eclipse.mylyn.tasks.tests.content-txt"
+ name="Test text content type"
+ priority="normal">
+ </content-type>
+ <content-type
+ base-type="org.eclipse.core.runtime.xml"
+ file-extensions="mylyn-test-xml"
+ id="org.eclipse.mylyn.tasks.tests.content-xml"
+ name="Test XML content type"
+ priority="normal">
+ </content-type>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksPerformanceTests.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksPerformanceTests.java
new file mode 100644
index 0000000..a9d1ccf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksPerformanceTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.tasks.tests.performance.TaskContainerTest;
+import org.eclipse.mylyn.tasks.tests.performance.TaskListPerformanceTest;
+
+public class AllTasksPerformanceTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.tests.performance");
+ suite.addTestSuite(TaskContainerTest.class);
+ suite.addTestSuite(TaskListPerformanceTest.class);
+ return suite;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java
new file mode 100644
index 0000000..f079283
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.tasks.tests.core.FileTaskAttachmentSourceTest;
+import org.eclipse.mylyn.tasks.tests.core.ITasksCoreConstantsTest;
+import org.eclipse.mylyn.tasks.tests.core.TaskListUnmatchedContainerTest;
+import org.eclipse.mylyn.tasks.tests.core.TaskRepositoryLocationTest;
+import org.eclipse.mylyn.tasks.tests.ui.ContextPerspectiveManagerTest;
+import org.eclipse.mylyn.tasks.tests.ui.RetrieveTitleFromUrlTest;
+import org.eclipse.mylyn.tasks.tests.ui.TaskAttachmentPropertyTesterTest;
+import org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest;
+import org.eclipse.mylyn.tasks.tests.ui.TaskRelationHyperlinkDetectorTest;
+import org.eclipse.mylyn.tasks.tests.ui.editor.EditorUtilTest;
+import org.eclipse.mylyn.tasks.tests.ui.editor.TaskEditorPartDescriptorTest;
+import org.eclipse.mylyn.tasks.tests.ui.editor.TaskUrlHyperlinkDetectorTest;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class AllTasksTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.tasks.tests");
+ suite.addTestSuite(TasksUiUtilTest.class);
+ suite.addTestSuite(TaskListUiTest.class);
+ suite.addTestSuite(TaskRepositoryTest.class);
+ suite.addTestSuite(LinkProviderTest.class);
+ suite.addTestSuite(TaskActivationActionTest.class);
+ suite.addTestSuite(TaskListPresentationTest.class);
+ suite.addTestSuite(TaskRepositorySorterTest.class);
+ suite.addTestSuite(CopyDetailsActionTest.class);
+ suite.addTestSuite(NewTaskFromSelectionActionTest.class);
+ suite.addTestSuite(TaskListTest.class);
+ suite.addTestSuite(ProjectRepositoryAssociationTest.class);
+ // FIXME re-enable test
+ //suite.addTestSuite(TaskPlanningEditorTest.class);
+ suite.addTestSuite(TaskListExternalizationTest.class);
+ suite.addTestSuite(TaskDataManagerTest.class);
+ suite.addTestSuite(TaskRepositoryManagerTest.class);
+ suite.addTestSuite(TaskRepositoriesExternalizerTest.class);
+ suite.addTestSuite(TaskListContentProviderTest.class);
+ suite.addTestSuite(TaskListBackupManagerTest.class);
+ suite.addTestSuite(TaskListSorterTest.class);
+ suite.addTestSuite(TaskKeyComparatorTest.class);
+ suite.addTestSuite(TaskTest.class);
+ suite.addTestSuite(TaskListDropAdapterTest.class);
+ suite.addTestSuite(TaskDataExportTest.class);
+ suite.addTestSuite(ScheduledPresentationTest.class);
+ suite.addTestSuite(TaskActivityTimingTest.class);
+ suite.addTestSuite(TaskAttachmentTest.class);
+ suite.addTestSuite(RepositorySettingsPageTest.class);
+ suite.addTestSuite(CommentQuoterTest.class);
+ suite.addTestSuite(TaskDataStoreTest.class);
+ suite.addTestSuite(TaskExportImportTest.class);
+ suite.addTestSuite(PersonProposalProviderTest.class);
+ suite.addTestSuite(TaskRepositoryLocationTest.class);
+ suite.addTestSuite(AttachmentSizeFormatterTest.class);
+ suite.addTestSuite(TaskMapperTest.class);
+ suite.addTestSuite(TaskListUnmatchedContainerTest.class);
+ suite.addTestSuite(TaskWorkingSetTest.class);
+ suite.addTestSuite(TaskActivationHistoryTest.class);
+ suite.addTestSuite(TaskActivityManagerTest.class);
+ suite.addTestSuite(TaskRepositoryFilterTests.class);
+ suite.addTestSuite(TaskDiffUtilTest.class);
+ suite.addTestSuite(RefactorRepositoryUrlOperationTest.class);
+ suite.addTestSuite(StackTraceDuplicateDetectorTest.class);
+ // XXX fix and reenable
+ //suite.addTestSuite(MarkTaskHandlerTest.class);
+ suite.addTestSuite(RepositoryTemplateManagerTest.class);
+ suite.addTestSuite(TaskHyperlinkDetectorTest.class);
+ suite.addTestSuite(TaskRelationHyperlinkDetectorTest.class);
+ suite.addTestSuite(TaskUrlHyperlinkDetectorTest.class);
+ suite.addTestSuite(TaskEditorPartDescriptorTest.class);
+ suite.addTestSuite(TaskAttachmentPropertyTesterTest.class);
+ suite.addTestSuite(CommentGroupStrategyTest.class);
+ suite.addTestSuite(ContextPerspectiveManagerTest.class);
+ suite.addTestSuite(ITasksCoreConstantsTest.class);
+ suite.addTestSuite(RetrieveTitleFromUrlTest.class);
+ suite.addTestSuite(EditorUtilTest.class);
+ suite.addTestSuite(FileTaskAttachmentSourceTest.class);
+
+ // XXX long running tests, put back?
+ //suite.addTestSuite(TaskDataImportTest.class);
+ //suite.addTestSuite(QueryExportImportTest.class);
+ //suite.addTestSuite(BackgroundSaveTest.class);
+
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AttachmentSizeFormatterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AttachmentSizeFormatterTest.java
new file mode 100644
index 0000000..0a4cf1b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AttachmentSizeFormatterTest.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.Locale;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentSizeFormatter;
+
+/**
+ * Tests attachment size value formatting.
+ *
+ * @author Willian Mitsuda
+ * @author Frank Becker
+ */
+public class AttachmentSizeFormatterTest extends TestCase {
+
+ public void testInvalidString() {
+ AttachmentSizeFormatter formatter = AttachmentSizeFormatter.getInstance();
+ assertEquals(AttachmentSizeFormatter.UNKNOWN_SIZE, formatter.format(null));
+ assertEquals(AttachmentSizeFormatter.UNKNOWN_SIZE, formatter.format("x"));
+ }
+
+ public void testNotAValidNumber() {
+ AttachmentSizeFormatter formatter = AttachmentSizeFormatter.getInstance();
+ assertEquals(AttachmentSizeFormatter.UNKNOWN_SIZE, formatter.format("-5"));
+ assertEquals(AttachmentSizeFormatter.UNKNOWN_SIZE, formatter.format("1.0"));
+ }
+
+ public void testByteFormatter() {
+ AttachmentSizeFormatter formatter = new AttachmentSizeFormatter(Locale.ENGLISH);
+ assertEquals("1 byte", formatter.format("1"));
+ assertEquals("2 bytes", formatter.format("2"));
+ assertEquals("1023 bytes", formatter.format("1023"));
+ }
+
+ public void testKBFormatter() {
+ AttachmentSizeFormatter formatterEnglish = new AttachmentSizeFormatter(Locale.ENGLISH);
+ assertEquals("1.00 KB", formatterEnglish.format("1024"));
+ assertEquals("1024.00 KB", formatterEnglish.format("1048575"));
+
+ AttachmentSizeFormatter formatterGerman = new AttachmentSizeFormatter(Locale.GERMAN);
+ assertEquals("1,00 KB", formatterGerman.format("1024"));
+ assertEquals("1024,00 KB", formatterGerman.format("1048575"));
+ }
+
+ public void testMBFormatter() {
+ AttachmentSizeFormatter formatterEnglish = new AttachmentSizeFormatter(Locale.ENGLISH);
+ assertEquals("1.00 MB", formatterEnglish.format("1048576"));
+ assertEquals("1024.00 MB", formatterEnglish.format("1073741823"));
+
+ AttachmentSizeFormatter formatterGerman = new AttachmentSizeFormatter(Locale.GERMAN);
+ assertEquals("1,00 MB", formatterGerman.format("1048576"));
+ assertEquals("1024,00 MB", formatterGerman.format("1073741823"));
+ }
+
+ public void testGBFormatter() {
+ AttachmentSizeFormatter formatterEnglish = new AttachmentSizeFormatter(Locale.ENGLISH);
+ assertEquals("1.00 GB", formatterEnglish.format("1073741824"));
+
+ AttachmentSizeFormatter formatterGerman = new AttachmentSizeFormatter(Locale.GERMAN);
+ assertEquals("1,00 GB", formatterGerman.format("1073741824"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/BackgroundSaveTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/BackgroundSaveTest.java
new file mode 100644
index 0000000..2d918bb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/BackgroundSaveTest.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Locale;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+
+/**
+ * Tests the mechanism for saving the task data periodically.
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten (rewrite)
+ */
+public class BackgroundSaveTest extends TestCase {
+
+ public void testBackgroundSave() throws InterruptedException, IOException {
+ if (System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("linux")) {
+ System.out.println("> BackgroundSaveTest.testBackgroundSave() not run on Linux due to IO concurrency");
+ } else {
+ LocalTask task = new LocalTask("1", "summary");
+ String filePath = TasksUiPlugin.getDefault().getDataDirectory() + File.separator
+ + ITasksCoreConstants.DEFAULT_TASK_LIST_FILE;
+
+ final File file = new File(filePath);
+ long previouslyModified = file.lastModified();
+ TasksUiPlugin.getTaskList().addTask(task);
+ TasksUiPlugin.getExternalizationManager().requestSave();
+ Thread.sleep(5000);
+ assertTrue(file.lastModified() > previouslyModified);
+ TasksUiPlugin.getTaskList().deleteTask(task);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CommentGroupStrategyTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CommentGroupStrategyTest.java
new file mode 100644
index 0000000..5300c30
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CommentGroupStrategyTest.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jingwen Ou 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:
+ * Jingwen Ou - initial implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.RepositoryPerson;
+import org.eclipse.mylyn.internal.tasks.core.TaskComment;
+import org.eclipse.mylyn.internal.tasks.ui.editors.CommentGroupStrategy;
+import org.eclipse.mylyn.internal.tasks.ui.editors.CommentGroupStrategy.CommentGroup;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Jingwen Ou
+ */
+public class CommentGroupStrategyTest extends TestCase {
+
+ private static final String MOCK_CURRENT_PERSON_ID = "mockCurrentPersonId";
+
+ private static final String MOCK_TASK_ATTRIBUTE = "mockTaskAttribute";
+
+ private static final String MOCK_TEXT = "mockText";
+
+ private final List<ITaskComment> comments;
+
+ private final TaskRepository repository;
+
+ private final CommentGroupStrategy strategy;
+
+ private final ITask task;
+
+ private final TaskData taskData;
+
+ public CommentGroupStrategyTest() {
+ repository = TaskTestUtil.createMockRepository();
+ task = TaskTestUtil.createMockTask("1");
+ taskData = TaskTestUtil.createMockTaskData("1");
+ comments = new ArrayList<ITaskComment>();
+ strategy = new CommentGroupStrategy();
+ }
+
+ private TaskComment mockComment(int number, String personId, Date date) {
+ return mockComment(number, personId, date, MOCK_TEXT);
+ }
+
+ private TaskComment mockComment(int number, String personId, Date date, String text) {
+ TaskAttribute taskAttribute = taskData.getRoot().createAttribute(MOCK_TASK_ATTRIBUTE + comments.size());
+ TaskComment comment = new TaskComment(repository, task, taskAttribute);
+ comment.setNumber(number);
+ comment.setAuthor(new RepositoryPerson(repository, personId));
+ comment.setCreationDate(date);
+ comment.setText(text);
+ return comment;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ comments.clear();
+ }
+
+ public void testGroupCommentsAuthoredLatestComment() {
+ int recentComments = CommentGroupStrategy.MAX_CURRENT;
+
+ // didn't author previous comments
+ for (int i = 0; i < recentComments; i++) {
+ comments.add(mockComment(i + 1, "OtherPerson", new Date(i + 1)));
+ }
+ // authored the latest comment
+ comments.add(mockComment(recentComments + 1, MOCK_CURRENT_PERSON_ID, new Date(recentComments + 1)));
+
+ List<CommentGroup> group = strategy.groupComments(comments, MOCK_CURRENT_PERSON_ID);
+
+ assertEquals(2, group.size());
+
+ CommentGroup recentGroup = group.get(0);
+ assertEquals(CommentGroup.RECENT, recentGroup.getGroupName());
+ assertEquals(recentComments, recentGroup.getComments().size());
+
+ CommentGroup currentGroup = group.get(1);
+ assertEquals(CommentGroup.CURRENT, currentGroup.getGroupName());
+ assertEquals(1, currentGroup.getComments().size());
+ }
+
+ public void testGroupCommentsMaxCurrent() {
+ // one less than max current
+ int oneLessThanMaxCurrent = CommentGroupStrategy.MAX_CURRENT - 1;
+
+ for (int i = 0; i < oneLessThanMaxCurrent; i++) {
+ comments.add(mockComment(i + 1, MOCK_CURRENT_PERSON_ID, new Date(i + 1)));
+ }
+
+ List<CommentGroup> group = strategy.groupComments(comments, MOCK_CURRENT_PERSON_ID);
+
+ assertEquals(1, group.size());
+
+ CommentGroup currentGroup = group.get(0);
+ assertEquals(CommentGroup.CURRENT, currentGroup.getGroupName());
+ assertEquals(oneLessThanMaxCurrent, currentGroup.getComments().size());
+ }
+
+ public void testGroupCommentsNotAuthoredLastestComment() {
+ // didn't author previous comments
+ for (int i = 0; i < CommentGroupStrategy.MAX_CURRENT; i++) {
+ comments.add(mockComment(i + 1, "OtherPerson", new Date(i + 1)));
+ }
+ // not even the latest comment
+ comments.add(mockComment(CommentGroupStrategy.MAX_CURRENT + 1, "OtherPerson", new Date(
+ CommentGroupStrategy.MAX_CURRENT + 1)));
+
+ List<CommentGroup> group = strategy.groupComments(comments, MOCK_CURRENT_PERSON_ID);
+
+ assertEquals(2, group.size());
+
+ CommentGroup recentGroup = group.get(0);
+ assertEquals(CommentGroup.RECENT, recentGroup.getGroupName());
+ assertEquals(1, recentGroup.getComments().size());
+
+ CommentGroup currentGroup = group.get(1);
+ assertEquals(CommentGroup.CURRENT, currentGroup.getGroupName());
+ assertEquals(CommentGroupStrategy.MAX_CURRENT, currentGroup.getComments().size());
+ }
+
+ public void testGroupComments_RecentAndOlder() {
+ int total = CommentGroupStrategy.MAX_CURRENT + CommentGroupStrategy.MAX_RECENT;
+ // didn't author previous comments
+ for (int i = 0; i < total; i++) {
+ comments.add(mockComment(i + 1, "OtherPerson", new Date(i + 1)));
+ }
+ // not even the latest comment
+ comments.add(mockComment(total + 1, "OtherPerson", new Date(total + 1)));
+
+ List<CommentGroup> group = strategy.groupComments(comments, MOCK_CURRENT_PERSON_ID);
+
+ assertEquals(3, group.size());
+
+ CommentGroup olderGroup = group.get(0);
+ assertEquals(CommentGroup.OLDER, olderGroup.getGroupName());
+ assertEquals(1, olderGroup.getComments().size());
+
+ CommentGroup recentGroup = group.get(1);
+ assertEquals(CommentGroup.RECENT, recentGroup.getGroupName());
+ assertEquals(CommentGroupStrategy.MAX_RECENT, recentGroup.getComments().size());
+
+ CommentGroup currentGroup = group.get(2);
+ assertEquals(CommentGroup.CURRENT, currentGroup.getGroupName());
+ assertEquals(CommentGroupStrategy.MAX_CURRENT, currentGroup.getComments().size());
+ }
+
+ public void testGroupCommentsRecentAndOlder2() {
+ int older = 10;
+ int recent = CommentGroupStrategy.MAX_RECENT;
+ int total = older + recent;
+ // author previous comments
+ for (int i = 0; i < total; i++) {
+ comments.add(mockComment(i + 1, MOCK_CURRENT_PERSON_ID, new Date(i + 1)));
+ }
+ // even the latest comment
+ comments.add(mockComment(total + 1, MOCK_CURRENT_PERSON_ID, new Date(total + 1)));
+
+ List<CommentGroup> group = strategy.groupComments(comments, MOCK_CURRENT_PERSON_ID);
+
+ assertEquals(3, group.size());
+
+ CommentGroup olderGroup = group.get(0);
+ assertEquals(CommentGroup.OLDER, olderGroup.getGroupName());
+ assertEquals(older, olderGroup.getComments().size());
+
+ CommentGroup recentGroup = group.get(1);
+ assertEquals(CommentGroup.RECENT, recentGroup.getGroupName());
+ assertEquals(recent, recentGroup.getComments().size());
+
+ CommentGroup currentGroup = group.get(2);
+ assertEquals(CommentGroup.CURRENT, currentGroup.getGroupName());
+ assertEquals(1, currentGroup.getComments().size());
+ }
+
+ // 2: current person
+ // 1: current person
+ public void testIsCurrentAuthoredPreviousComment() {
+ comments.add(mockComment(2, MOCK_CURRENT_PERSON_ID, new Date(2)));
+ boolean isCurrent = strategy.isCurrent(comments, mockComment(1, MOCK_CURRENT_PERSON_ID, new Date(1)),
+ MOCK_CURRENT_PERSON_ID);
+ assertEquals(false, isCurrent);
+ }
+
+ // 2: current person - system generated, e.g. mylyn/context/zip
+ // 1: current person
+ public void testIsCurrentAuthoredPreviousCommentButSystemGenerated() {
+ comments.add(mockComment(2, MOCK_CURRENT_PERSON_ID, new Date(2), AttachmentUtil.CONTEXT_DESCRIPTION));
+ boolean isCurrent = strategy.isCurrent(comments, mockComment(1, MOCK_CURRENT_PERSON_ID, new Date(1)),
+ MOCK_CURRENT_PERSON_ID);
+ assertEquals(true, isCurrent);
+ }
+
+ // test max current
+ public void testIsCurrentMaxCurrent() {
+ for (int i = 0; i < CommentGroupStrategy.MAX_CURRENT; i++) {
+ comments.add(mockComment(i + 1, MOCK_CURRENT_PERSON_ID, new Date(i + 1)));
+ }
+
+ boolean isCurrent = strategy.isCurrent(comments, mockComment(CommentGroupStrategy.MAX_CURRENT + 1,
+ MOCK_CURRENT_PERSON_ID, new Date(CommentGroupStrategy.MAX_CURRENT + 1)), MOCK_CURRENT_PERSON_ID);
+ assertEquals(false, isCurrent);
+ }
+
+ // no comment
+ public void testIsCurrentNoComment() {
+ boolean isCurrent = strategy.isCurrent(comments, mockComment(1, MOCK_CURRENT_PERSON_ID, new Date(1)),
+ MOCK_CURRENT_PERSON_ID);
+ assertEquals(true, isCurrent);
+ }
+
+ // 2: another person
+ // 1: current person
+ public void testIsCurrentNotAuthoredPreviousComment() {
+ comments.add(mockComment(2, "AnotherPerson", new Date(2), MOCK_TEXT));
+ boolean isCurrent = strategy.isCurrent(comments, mockComment(1, MOCK_CURRENT_PERSON_ID, new Date(1)),
+ MOCK_CURRENT_PERSON_ID);
+ assertEquals(true, isCurrent);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CommentQuoterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CommentQuoterTest.java
new file mode 100644
index 0000000..fa74cc6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CommentQuoterTest.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.CommentQuoter;
+
+/**
+ * Test many quoting scenarios
+ *
+ * @author Willian Mitsuda
+ */
+public class CommentQuoterTest extends TestCase {
+
+ public void testNoWrapping() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababa");
+ assertEquals("> bababa\n", quotedText);
+ }
+
+ public void testSimpleWrapping() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababa bobobo");
+ assertEquals("> bababa\n> bobobo\n", quotedText);
+ }
+
+ public void testNoWayToWrap() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("babababababa");
+ assertEquals("> babababababa\n", quotedText);
+ }
+
+ public void testExactWrap() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababababa");
+ assertEquals("> bababababa\n", quotedText);
+ }
+
+ public void testMultiLineNoWrapping() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababa\nbobobo");
+ assertEquals("> bababa\n> bobobo\n", quotedText);
+ }
+
+ public void testMultiLineWithWrapping() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababa bebebe\nbibibibibibi bibi\nbobobo bububu");
+ assertEquals("> bababa\n> bebebe\n> bibibibibibi\n> bibi\n> bobobo\n> bububu\n", quotedText);
+ }
+
+ public void testExcessiveSpacingWrapping() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababa bobobo");
+ assertEquals("> bababa\n> bobobo\n", quotedText);
+ }
+
+ public void testBlankLineQuoting() {
+ CommentQuoter quoter = new CommentQuoter(10);
+ String quotedText = quoter.quote("bababa\n\nbobobo");
+ assertEquals("> bababa\n> \n> bobobo\n", quotedText);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CopyDetailsActionTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CopyDetailsActionTest.java
new file mode 100644
index 0000000..2de6d6a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/CopyDetailsActionTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Mik Kersten
+ */
+public class CopyDetailsActionTest extends TestCase {
+
+ public void testIdLabelIncluded() {
+ MockTask task = new MockTask("123");
+ String text = CopyTaskDetailsAction.getTextForTask(task);
+ assertTrue(text.startsWith(task.getTaskKey()));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/DateRangeTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/DateRangeTest.java
new file mode 100644
index 0000000..e875995
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/DateRangeTest.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TimeZone;
+import java.util.TreeMap;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.DayDateRange;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Rob Elves
+ */
+public class DateRangeTest extends TestCase {
+
+ private static final int HOUR = 60 * 60 * 1000;
+
+ public void testCompareInstant() {
+ DateRange range1 = new DateRange(TaskActivityUtil.getCurrentWeek().getToday().previous().getStartDate());
+ DateRange range2 = new DateRange(TaskActivityUtil.getCurrentWeek().getToday().getStartDate());
+ assertEquals(-1, range1.compareTo(range2));
+ assertEquals(1, range2.compareTo(range1));
+ }
+
+ public void testCompareRanges() {
+ DateRange range1 = TaskActivityUtil.getCurrentWeek().getToday().previous();
+ DateRange range2 = TaskActivityUtil.getCurrentWeek().getToday();
+ assertEquals(-1, range1.compareTo(range2));
+ assertEquals(1, range2.compareTo(range1));
+ }
+
+ public void testQueryDateRange() {
+ SortedMap<DateRange, Set<ITask>> scheduledTasks = Collections.synchronizedSortedMap(new TreeMap<DateRange, Set<ITask>>());
+ DateRange range1 = TaskActivityUtil.getCurrentWeek().getToday().previous();
+ Set<ITask> tasks = new HashSet<ITask>();
+ tasks.add(new LocalTask("1", "summaryForLocalTask"));
+ scheduledTasks.put(range1, tasks);
+ assertFalse(scheduledTasks.isEmpty());
+ assertNotNull(scheduledTasks.get(range1));
+
+ DateRange rangeTest = TaskActivityUtil.getCurrentWeek().getToday().previous();
+ assertNotNull(scheduledTasks.get(rangeTest));
+
+ DateRange range2 = TaskActivityUtil.getCurrentWeek().getToday();
+ tasks = new HashSet<ITask>();
+ tasks.add(new LocalTask("2", "summaryForLocalTask2"));
+ scheduledTasks.put(range2, tasks);
+
+ SortedMap<DateRange, Set<ITask>> result = scheduledTasks.subMap(range1, range2);
+ assertEquals(1, result.size());
+
+ DateRange range0 = TaskActivityUtil.getCurrentWeek().getToday().previous().previous();
+ DateRange range3 = TaskActivityUtil.getCurrentWeek().getToday().next();
+ result = scheduledTasks.subMap(range0, range3);
+ assertEquals(2, result.size());
+ }
+
+ public void testIsWeekRange() {
+ TimeZone defaultTimeZone = TimeZone.getDefault();
+ try {
+ TimeZone.setDefault(TimeZone.getTimeZone("PST"));
+ Calendar time = TaskActivityUtil.getCalendar();
+
+ time.set(2008, 9, 1);
+ DateRange range = TaskActivityUtil.getWeekOf(time.getTime());
+ assertTrue(WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() + 1);
+ assertTrue("1 ms longer than a week, expected to be within legal interval", WeekDateRange.isWeekRange(
+ range.getStartDate(), range.getEndDate()));
+ range = TaskActivityUtil.getDayOf(time.getTime());
+ assertFalse("only a day", WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+
+ // PST changes to PDT on Mar 9th 2008
+ time.set(2008, 2, 9);
+ range = TaskActivityUtil.getWeekOf(time.getTime());
+ assertEquals(0, range.getStartDate().get(Calendar.DST_OFFSET));
+ assertEquals(HOUR, range.getEndDate().get(Calendar.DST_OFFSET));
+ assertTrue(WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() + 1);
+ assertFalse("1 ms too long", WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+ range = TaskActivityUtil.getDayOf(time.getTime());
+ assertFalse(WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+
+ // PDT changes to PST on Nov 2nd 2008
+ time.set(2008, 10, 2);
+ range = TaskActivityUtil.getWeekOf(time.getTime());
+ assertEquals(HOUR, range.getStartDate().get(Calendar.DST_OFFSET));
+ assertEquals(0, range.getEndDate().get(Calendar.DST_OFFSET));
+ assertTrue(WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() - 1);
+ assertFalse("1 ms too short", WeekDateRange.isWeekRange(range.getStartDate(), range.getEndDate()));
+ } finally {
+ TimeZone.setDefault(defaultTimeZone);
+ }
+ }
+
+ public void testIsDayRange() {
+ TimeZone defaultTimeZone = TimeZone.getDefault();
+ try {
+ TimeZone.setDefault(TimeZone.getTimeZone("PST"));
+ Calendar time = TaskActivityUtil.getCalendar();
+ time.set(2008, 9, 1);
+ DateRange range = TaskActivityUtil.getDayOf(time.getTime());
+ assertTrue(DayDateRange.isDayRange(range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() + 1);
+ assertTrue("1 ms longer than a day, expected to be within legal interval", DayDateRange.isDayRange(
+ range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() + HOUR);
+ assertFalse("1 hour + 1 ms longer than a day", DayDateRange.isDayRange(range.getStartDate(),
+ range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() - 2 * HOUR - 2);
+ assertFalse("1 hour + 1 ms shorter than a day", DayDateRange.isDayRange(range.getStartDate(),
+ range.getEndDate()));
+ range = TaskActivityUtil.getDayOf(time.getTime());
+ assertTrue("a week", DayDateRange.isDayRange(range.getStartDate(), range.getEndDate()));
+
+ // PDT changes to PST on Mar 9th 2008
+ time.set(2008, 2, 9);
+ range = TaskActivityUtil.getDayOf(time.getTime());
+ assertEquals(0, range.getStartDate().get(Calendar.DST_OFFSET));
+ assertEquals(HOUR, range.getEndDate().get(Calendar.DST_OFFSET));
+ assertTrue(DayDateRange.isDayRange(range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() + 1);
+ assertFalse("1 ms too long", DayDateRange.isDayRange(range.getStartDate(), range.getEndDate()));
+
+ // PST changes to PDT on Nov 2nd 2008
+ time.set(2008, 10, 2);
+ range = TaskActivityUtil.getDayOf(time.getTime());
+ assertEquals(HOUR, range.getStartDate().get(Calendar.DST_OFFSET));
+ assertEquals(0, range.getEndDate().get(Calendar.DST_OFFSET));
+ assertTrue(DayDateRange.isDayRange(range.getStartDate(), range.getEndDate()));
+ range.getStartDate().setTimeInMillis(range.getStartDate().getTimeInMillis() - 1);
+ assertFalse("1 ms too short", DayDateRange.isDayRange(range.getStartDate(), range.getEndDate()));
+ } finally {
+ TimeZone.setDefault(defaultTimeZone);
+ }
+ }
+
+ public void testNext() {
+ Calendar time = TaskActivityUtil.getCalendar();
+ time.set(2008, 11, 31);
+ DayDateRange day = TaskActivityUtil.getDayOf(time.getTime());
+ assertEquals(2009, day.next().getStartDate().get(Calendar.YEAR));
+ assertEquals(2008, day.getStartDate().get(Calendar.YEAR));
+ assertEquals(day, day.next().previous());
+
+ WeekDateRange week = TaskActivityUtil.getWeekOf(time.getTime());
+ assertEquals(2009, week.next().getStartDate().get(Calendar.YEAR));
+ assertEquals(2008, week.getStartDate().get(Calendar.YEAR));
+ assertEquals(week, week.next().previous());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/LinkProviderTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/LinkProviderTest.java
new file mode 100644
index 0000000..6b2a361
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/LinkProviderTest.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class LinkProviderTest extends TestCase {
+
+ public class LinkProviderStub extends AbstractTaskRepositoryLinkProvider {
+
+ int executions = 0;
+
+ int timeout = 0;
+
+ @Override
+ public TaskRepository getTaskRepository(IResource resource, IRepositoryManager repositoryManager) {
+ executions++;
+ try {
+ Thread.sleep(timeout);
+ } catch (InterruptedException e) {
+ fail();
+ }
+ return null;
+ }
+ }
+
+ private String defaultTimeout;
+
+ private LinkProviderStub provider;
+
+ @Override
+ protected void setUp() throws Exception {
+ defaultTimeout = System.getProperty(ITasksCoreConstants.PROPERTY_LINK_PROVIDER_TIMEOUT, "");
+ provider = new LinkProviderStub();
+ TasksUiPlugin.getDefault().addRepositoryLinkProvider(provider);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TasksUiPlugin.getDefault().removeRepositoryLinkProvider(provider);
+ System.setProperty(ITasksCoreConstants.PROPERTY_LINK_PROVIDER_TIMEOUT, defaultTimeout);
+ }
+
+ public void testTimeout() {
+ System.setProperty(ITasksCoreConstants.PROPERTY_LINK_PROVIDER_TIMEOUT, "50");
+
+ provider.timeout = 40;
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(1, provider.executions);
+
+ provider.timeout = 60;
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(2, provider.executions);
+
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(2, provider.executions);
+ }
+
+ public void testTimeoutInfinite() {
+ System.setProperty(ITasksCoreConstants.PROPERTY_LINK_PROVIDER_TIMEOUT, "50");
+
+ provider.timeout = 40;
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(1, provider.executions);
+
+ System.setProperty(ITasksCoreConstants.PROPERTY_LINK_PROVIDER_TIMEOUT, "-1");
+
+ provider.timeout = 0;
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(2, provider.executions);
+
+ provider.timeout = 60;
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(3, provider.executions);
+
+ TasksUiPlugin.getDefault().getRepositoryForResource(ResourcesPlugin.getWorkspace().getRoot());
+ assertEquals(4, provider.executions);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/NewTaskFromSelectionActionTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/NewTaskFromSelectionActionTest.java
new file mode 100644
index 0000000..bb8af8e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/NewTaskFromSelectionActionTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.TaskComment;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class NewTaskFromSelectionActionTest extends TestCase {
+
+ // FIXME causes display of modal dialog
+// public void testNoSelection() throws Exception {
+// NewTaskFromSelectionAction action = new NewTaskFromSelectionAction();
+// assertNull(action.getTaskSelection());
+// action.run();
+// action.selectionChanged(null);
+// assertNull(action.getTaskSelection());
+// }
+
+ public void testComment() throws Exception {
+ TaskRepository taskRepository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ TaskData taskData = new TaskData(new TaskAttributeMapper(taskRepository), "kind", "http://url", "1");
+ TaskComment comment = new TaskComment(taskRepository, new MockTask("1"), taskData.getRoot().createAttribute(
+ "id"));
+
+ NewTaskFromSelectionAction action = new NewTaskFromSelectionAction();
+ action.selectionChanged(new StructuredSelection(comment));
+ assertNotNull(action.getTaskMapping());
+ }
+
+ public void testText() throws Exception {
+ NewTaskFromSelectionAction action = new NewTaskFromSelectionAction();
+ action.selectionChanged(new TextSelection(0, 0) {
+ @Override
+ public String getText() {
+ return "text";
+ }
+ });
+ assertNotNull(action.getTaskMapping());
+
+ action.selectionChanged(new TextSelection(0, 0));
+ assertNull(action.getTaskMapping());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/NewTaskWizardRepositorySelectionTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/NewTaskWizardRepositorySelectionTest.java
new file mode 100644
index 0000000..21e05d5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/NewTaskWizardRepositorySelectionTest.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.MultiRepositoryAwareWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.SelectRepositoryPage;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class NewTaskWizardRepositorySelectionTest extends TestCase {
+
+ // see bug 203801
+ public void testRepositorySettingWithTaskListSelection() {
+ TaskRepository mockRepository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(mockRepository);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ TaskListView view = (TaskListView) TasksUiUtil.openTasksViewInActivePerspective();
+ MockTask mockTask = new MockTask("mock.task");
+ TasksUiPlugin.getTaskActivityManager().scheduleNewTask(mockTask);
+ TasksUiPlugin.getTaskList().addTask(mockTask);
+
+ view.setFocusedMode(true);
+ view.getViewer().refresh();
+ view.getViewer().expandAll();
+ view.getViewer().setSelection(new StructuredSelection(mockTask), true);
+ assertEquals(mockTask, ((StructuredSelection) view.getViewer().getSelection()).getFirstElement());
+
+ MultiRepositoryAwareWizard wizard = TasksUiInternal.createNewTaskWizard(null);
+ WizardDialog dialog = null;
+ dialog = new WizardDialog(shell, wizard);
+ dialog.setBlockOnOpen(false);
+ dialog.open();
+
+ SelectRepositoryPage page = (SelectRepositoryPage) wizard.getPages()[0];
+ assertTrue(page.getRepositories().contains(mockRepository));
+ assertEquals(mockRepository, ((IStructuredSelection) page.getViewer().getSelection()).getFirstElement());
+
+ TasksUiPlugin.getRepositoryManager().removeRepository(mockRepository,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TasksUiPlugin.getTaskList().deleteTask(mockTask);
+ wizard.dispose();
+ dialog.close();
+ }
+
+ // see bug bug 202184
+ public void testDefaultWithNoTaskListSelection() {
+ TaskListView view = (TaskListView) TasksUiUtil.openTasksViewInActivePerspective();
+ view.getViewer().setSelection(new StructuredSelection());
+
+ NewTaskWizard wizard = new NewTaskWizard(null, null);
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ WizardDialog dialog = null;
+ dialog = new WizardDialog(shell, wizard);
+ dialog.setBlockOnOpen(false);
+ dialog.open();
+
+ SelectRepositoryPage page = (SelectRepositoryPage) wizard.getPages()[0];
+ TaskRepository localRepository = TasksUiPlugin.getRepositoryManager().getRepositories(
+ LocalRepositoryConnector.CONNECTOR_KIND).iterator().next();
+ assertEquals(localRepository, ((IStructuredSelection) page.getViewer().getSelection()).getFirstElement());
+
+ wizard.dispose();
+ dialog.close();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/PersonProposalProviderTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/PersonProposalProviderTest.java
new file mode 100644
index 0000000..417ef22
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/PersonProposalProviderTest.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.PersonContentProposal;
+import org.eclipse.mylyn.internal.tasks.ui.PersonProposalProvider;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class PersonProposalProviderTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+ }
+
+ public void testGetProposalsNullParameters() {
+ PersonProposalProvider provider = new PersonProposalProvider((AbstractTask) null, (TaskData) null);
+ IContentProposal[] result = provider.getProposals("", 0);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+
+ result = provider.getProposals(" ", 1);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+ }
+
+ public void testGetProposalsCurrentTask() {
+ MockTask task = new MockTask(null, "1", null);
+ task.setOwner("foo");
+ PersonProposalProvider provider = new PersonProposalProvider(task, (TaskData) null);
+ IContentProposal[] result = provider.getProposals("", 0);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo", result[0].getContent());
+
+ result = provider.getProposals("a", 1);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+
+ result = provider.getProposals("fo", 2);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo", result[0].getContent());
+
+ result = provider.getProposals("", 0);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo", result[0].getContent());
+ }
+
+ public void testGetProposalsMultipleAddresses() {
+ IContentProposal[] result;
+
+ MockTask task = new MockTask(null, "1", null);
+ task.setOwner("foo");
+ PersonProposalProvider provider = new PersonProposalProvider(task, (TaskData) null);
+
+ result = provider.getProposals("f,xx", 1);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo,xx", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(3, result[0].getCursorPosition());
+
+ result = provider.getProposals("f xx", 1);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo xx", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(3, result[0].getCursorPosition());
+
+ result = provider.getProposals("a,xx", 1);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+
+ result = provider.getProposals("xx,f", 4);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("xx,foo", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(6, result[0].getCursorPosition());
+
+ result = provider.getProposals("xx f", 4);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("xx foo", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(6, result[0].getCursorPosition());
+
+ result = provider.getProposals("xx,a", 4);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+
+ result = provider.getProposals("xyz,f,yy", 4);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("xyz,foo,yy", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(7, result[0].getCursorPosition());
+
+ result = provider.getProposals("xx f yy", 4);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("xx foo yy", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(6, result[0].getCursorPosition());
+
+ result = provider.getProposals("xx,a,yy", 4);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+
+ result = provider.getProposals("xx,,yy", 3);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("xx,foo,yy", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(6, result[0].getCursorPosition());
+
+ result = provider.getProposals("x yy", 2);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("x foo", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(5, result[0].getCursorPosition());
+
+ result = provider.getProposals(", ", 1);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals(",foo ", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(4, result[0].getCursorPosition());
+
+ result = provider.getProposals(", ", 0);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo, ", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(3, result[0].getCursorPosition());
+ }
+
+ public void testConstructorRepositoryUrlKind() throws Exception {
+ MockTask task1 = new MockTask(MockRepositoryConnector.REPOSITORY_URL, "1");
+ task1.setOwner("foo");
+ PersonProposalProvider provider = new PersonProposalProvider(MockRepositoryConnector.REPOSITORY_URL,
+ MockRepositoryConnector.REPOSITORY_KIND);
+ MockRepositoryQuery query = new MockRepositoryQuery("summary");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ TasksUiPlugin.getTaskList().addTask(task1, query);
+
+ IContentProposal[] result = provider.getProposals("f,xx", 1);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertEquals("foo,xx", result[0].getContent());
+ assertEquals("foo", result[0].getLabel());
+ assertEquals(3, result[0].getCursorPosition());
+ }
+
+ public void testCurrentUser() throws Exception {
+ TaskTask task = TaskTestUtil.createMockTask("1");
+ task.setOwner("user");
+ TasksUiPlugin.getTaskList().addTask(task);
+ TaskRepository repository = TaskTestUtil.createMockRepository();
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("user", ""), false);
+ TasksUi.getRepositoryManager().addRepository(repository);
+
+ PersonProposalProvider provider = new PersonProposalProvider(MockRepositoryConnector.REPOSITORY_URL,
+ MockRepositoryConnector.REPOSITORY_KIND);
+ IContentProposal[] result = provider.getProposals("user", 1);
+ assertNotNull(result);
+ assertEquals(1, result.length);
+ assertTrue(((PersonContentProposal) result[0]).isCurrentUser());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ProjectRepositoryAssociationTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ProjectRepositoryAssociationTest.java
new file mode 100644
index 0000000..4855906
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ProjectRepositoryAssociationTest.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.resources.tests.ResourceTestUtil;
+import org.eclipse.mylyn.resources.tests.TestProject;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Rob Elves
+ */
+public class ProjectRepositoryAssociationTest extends TestCase {
+
+ private static final String REPOSITORY_URL = "http://mylyn.eclipse.org/bugs222";
+
+ private static final String REPOSITORY_KIND = "bugzilla";
+
+ private TestProject projectWrapper;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ projectWrapper = new TestProject(this.getClass().getName());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ ResourceTestUtil.deleteProject(projectWrapper.getProject());
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ public void testRepositoryForProject() throws CoreException {
+ assertNull(TasksUiPlugin.getDefault().getRepositoryForResource(projectWrapper.getProject()));
+ TaskRepository repository = new TaskRepository(REPOSITORY_KIND, REPOSITORY_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ TasksUiPlugin.getDefault().setRepositoryForResource(projectWrapper.getProject(), repository);
+ TaskRepository returnedRepository = TasksUiPlugin.getDefault().getRepositoryForResource(
+ projectWrapper.getProject());
+ assertNotNull(returnedRepository);
+ assertEquals(REPOSITORY_KIND, returnedRepository.getConnectorKind());
+ assertEquals(REPOSITORY_URL, returnedRepository.getRepositoryUrl());
+
+ TasksUiPlugin.getRepositoryManager().removeRepository(repository,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ public void testRepositoryForFolder() throws CoreException {
+ IFolder folder = projectWrapper.createFolder("testFolder");
+ assertTrue(folder.exists());
+ assertNull(TasksUiPlugin.getDefault().getRepositoryForResource(folder));
+ TaskRepository repository = new TaskRepository(REPOSITORY_KIND, REPOSITORY_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ TasksUiPlugin.getDefault().setRepositoryForResource(folder, repository);
+ TaskRepository returnedRepository = TasksUiPlugin.getDefault().getRepositoryForResource(folder);
+ assertNotNull(returnedRepository);
+ assertEquals(REPOSITORY_KIND, returnedRepository.getConnectorKind());
+ assertEquals(REPOSITORY_URL, returnedRepository.getRepositoryUrl());
+
+ TasksUiPlugin.getRepositoryManager().removeRepository(repository,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java
new file mode 100644
index 0000000..9525be8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/QueryExportImportTest.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Jevgeni Holodkov - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Jevgeni Holodkov
+ */
+// FIXME fix test
+public class QueryExportImportTest extends TestCase {
+
+ public void testRewriteTestCases() {
+ }
+
+// private File dest;
+//
+// private TaskListElementImporter taskListWriter;
+//
+// @Override
+// protected void setUp() throws Exception {
+// removeFiles(new File(TasksUiPlugin.getDefault().getDataDirectory()));
+//
+// // Create test export destination directory
+// dest = new File(TasksUiPlugin.getDefault().getDataDirectory() + File.separator + "TestDir");
+// if (dest.exists()) {
+// removeFiles(dest);
+// } else {
+// dest.mkdir();
+// }
+// assertTrue(dest.exists());
+// taskListWriter = TasksUiPlugin.getTaskListWriter();
+//
+// TaskTestUtil.resetTaskListAndRepositories();
+// }
+//
+// @Override
+// protected void tearDown() throws Exception {
+// removeFiles(dest);
+// dest.delete();
+// assertFalse(dest.exists());
+//
+// TaskTestUtil.resetTaskListAndRepositories();
+// }
+//
+// public void testExportImportQuery() throws Exception {
+// List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+//
+// MockRepositoryQuery query1 = new MockRepositoryQuery("Test Query");
+// query1.setRepositoryUrl(MockRepositoryConnector.REPOSITORY_URL);
+// MockRepositoryQuery query2 = new MockRepositoryQuery("Test Query 2");
+// query2.setRepositoryUrl(MockRepositoryConnector.REPOSITORY_URL);
+// queries.add(query1);
+// queries.add(query2);
+//
+// File outFile = new File(dest, "test-query.xml.zip");
+//
+// taskListWriter.writeQueries(queries, outFile);
+// assertTrue(outFile.exists());
+//
+// File inFile = new File(dest, "test-query.xml.zip");
+// List<RepositoryQuery> resultQueries = taskListWriter.readQueries(inFile);
+// assertEquals("2 Queries is imported", 2, resultQueries.size());
+// }
+//
+// public void testImportedQueriesNameConflictResolving1() {
+// TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+// MockRepositoryConnector.REPOSITORY_URL);
+// TasksUiPlugin.getRepositoryManager().addRepository(repository);
+//
+// // create test data
+// List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+//
+// MockRepositoryQuery query1 = new MockRepositoryQuery("Test Query");
+// query1.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query2 = new MockRepositoryQuery("Test Query");
+// query2.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query3 = new MockRepositoryQuery("Test Query");
+// query3.setRepositoryUrl(repository.getRepositoryUrl());
+//
+// queries.add(query1);
+// queries.add(query2);
+// queries.add(query3);
+//
+// // run tested functionality
+// QueryImportAction action = new QueryImportAction();
+// action.insertQueries(queries);
+//
+// // extract results
+// Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries();
+// Map<String, RepositoryQuery> queriesMap = new HashMap<String, RepositoryQuery>();
+// for (RepositoryQuery query : queriesSet) {
+// queriesMap.put(query.getHandleIdentifier(), query);
+// }
+//
+// // check that the actual result is correct
+// assertTrue("'Test Query' query inserted", queriesMap.containsKey("Test Query"));
+// assertTrue("'Test Query[1]' query inserted", queriesMap.containsKey("Test Query[1]"));
+// assertTrue("'Test Query[2]' query inserted", queriesMap.containsKey("Test Query[2]"));
+// }
+//
+// public void testImportedQueriesNameConflictResolving2() {
+// TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+// MockRepositoryConnector.REPOSITORY_URL);
+// TasksUiPlugin.getRepositoryManager().addRepository(repository);
+//
+// // create test data
+// List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+//
+// MockRepositoryQuery query1 = new MockRepositoryQuery("Test2");
+// query1.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query2 = new MockRepositoryQuery("Test2[1]");
+// query2.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query3 = new MockRepositoryQuery("Test2");
+// query3.setRepositoryUrl(repository.getRepositoryUrl());
+//
+// queries.add(query1);
+// queries.add(query2);
+// queries.add(query3);
+//
+// // run tested functionality
+// QueryImportAction action = new QueryImportAction();
+// action.insertQueries(queries);
+//
+// // extract results
+// Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries();
+// Map<String, RepositoryQuery> queriesMap = new HashMap<String, RepositoryQuery>();
+// for (RepositoryQuery query : queriesSet) {
+// queriesMap.put(query.getHandleIdentifier(), query);
+// }
+//
+// // check that the actual result is correct
+// assertTrue("'Test2' query inserted", queriesMap.containsKey("Test2"));
+// assertTrue("'Test2[1]' query inserted", queriesMap.containsKey("Test2[1]"));
+// assertTrue("'Test2[2]' query inserted", queriesMap.containsKey("Test2[2]"));
+//
+// }
+//
+// public void testImportedBadQueriesNameConflictResolving() {
+// TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+// MockRepositoryConnector.REPOSITORY_URL);
+// TasksUiPlugin.getRepositoryManager().addRepository(repository);
+//
+// // create test data
+// List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+//
+// MockRepositoryQuery query1 = new MockRepositoryQuery("Test[-10]");
+// query1.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query2 = new MockRepositoryQuery("Test[ABC]");
+// query2.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query3 = new MockRepositoryQuery("Test[1]");
+// query3.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query4 = new MockRepositoryQuery("Test");
+// query4.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query5 = new MockRepositoryQuery("Test");
+// query5.setRepositoryUrl(repository.getRepositoryUrl());
+//
+// queries.add(query1);
+// queries.add(query2);
+// queries.add(query3);
+// queries.add(query4);
+// queries.add(query5);
+//
+// // run tested functionality
+// QueryImportAction action = new QueryImportAction();
+// action.insertQueries(queries);
+//
+// // extract results
+// Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries();
+// Map<String, RepositoryQuery> queriesMap = new HashMap<String, RepositoryQuery>();
+// for (RepositoryQuery query : queriesSet) {
+// queriesMap.put(query.getHandleIdentifier(), query);
+// }
+//
+// // check that the actual result is correct
+// assertTrue("'Test[-10]' query inserted", queriesMap.containsKey("Test[-10]"));
+// assertTrue("'Test[ABC]' query inserted", queriesMap.containsKey("Test[ABC]"));
+// assertTrue("'Test[1]' query inserted", queriesMap.containsKey("Test[1]"));
+// assertTrue("'Test' query inserted", queriesMap.containsKey("Test"));
+// assertTrue("Another 'Test' query inserted", queriesMap.containsKey("Test[2]"));
+// }
+//
+// public void testImportedBadQueries() {
+// TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+// MockRepositoryConnector.REPOSITORY_URL);
+// TasksUiPlugin.getRepositoryManager().addRepository(repository);
+//
+// // create test data
+// List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+//
+// MockRepositoryQuery query1 = new MockRepositoryQuery("Test Query");
+// query1.setRepositoryUrl(repository.getRepositoryUrl());
+// MockRepositoryQuery query2 = new MockRepositoryQuery("Bad Query");
+// query2.setRepositoryUrl("bad url");
+//
+// queries.add(query1);
+// queries.add(query2);
+//
+// // run tested functionality
+// QueryImportAction action = new QueryImportAction();
+// List<RepositoryQuery> badQueries = action.insertQueries(queries);
+//
+// // extract results
+// Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries();
+// Map<String, RepositoryQuery> queriesMap = new HashMap<String, RepositoryQuery>();
+// for (RepositoryQuery query : queriesSet) {
+// queriesMap.put(query.getHandleIdentifier(), query);
+// }
+//
+// // check that the actual result is correct
+// assertEquals("There is a bad query", 1, badQueries.size());
+// assertEquals(query2, badQueries.get(0));
+// assertTrue("'Test Query' query inserted", queriesMap.containsKey("Test Query"));
+// }
+//
+// public void testExportImportQueryWithRepositoryInfo() throws Exception {
+// TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+// MockRepositoryConnector.REPOSITORY_URL);
+// TasksUiPlugin.getRepositoryManager().addRepository(repository);
+//
+// // create test data
+// List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+// MockRepositoryQuery query1 = new MockRepositoryQuery("Test Query");
+// query1.setRepositoryUrl(repository.getRepositoryUrl());
+// queries.add(query1);
+//
+// File outFile = new File(dest, "test-repository-query.xml.zip");
+//
+// taskListWriter.writeQueries(queries, outFile);
+//
+// assertTrue(outFile.exists());
+//
+// List<String> files = new ArrayList<String>();
+// ZipInputStream inputStream = new ZipInputStream(new FileInputStream(outFile));
+// ZipEntry entry = null;
+// while ((entry = inputStream.getNextEntry()) != null) {
+// files.add(entry.getName());
+// }
+// inputStream.close();
+//
+// assertTrue("exported file contains a file with queries", files.contains(ITasksCoreConstants.OLD_TASK_LIST_FILE));
+// assertTrue("exported file contains a file with repositories",
+// files.contains(TaskRepositoryManager.OLD_REPOSITORIES_FILE));
+//
+// TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+// assertTrue("There are currently no repositories defined", TasksUiPlugin.getRepositoryManager().getRepository(
+// MockRepositoryConnector.REPOSITORY_URL) == null);
+//
+// List<RepositoryQuery> resultQueries = taskListWriter.readQueries(outFile);
+// Set<TaskRepository> repositories = taskListWriter.readRepositories(outFile);
+//
+// TasksUiPlugin.getRepositoryManager().insertRepositories(repositories,
+// TasksUiPlugin.getDefault().getRepositoriesFilePath());
+// QueryImportAction action = new QueryImportAction();
+// action.insertQueries(resultQueries);
+//
+// // extract results
+// Set<RepositoryQuery> queriesSet = TasksUiPlugin.getTaskList().getQueries();
+// Map<String, RepositoryQuery> queriesMap = new HashMap<String, RepositoryQuery>();
+// for (RepositoryQuery query : queriesSet) {
+// queriesMap.put(query.getHandleIdentifier(), query);
+// }
+//
+// // check that the actual result is correct
+// assertTrue("'Test Query' query inserted", queriesMap.containsKey("Test Query"));
+// assertTrue("1 repository is loaded", TasksUiPlugin.getRepositoryManager().getRepository(
+// MockRepositoryConnector.REPOSITORY_URL) != null);
+// }
+//
+// private void removeFiles(File root) {
+// if (root.isDirectory()) {
+// for (File file : root.listFiles()) {
+// if (file.isDirectory()) {
+// removeFiles(file);
+// }
+// file.delete();
+// }
+// }
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RefactorRepositoryUrlOperationTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RefactorRepositoryUrlOperationTest.java
new file mode 100644
index 0000000..1f2c123
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RefactorRepositoryUrlOperationTest.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.util.Calendar;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlOperation;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * @author Robert Elves
+ * @author Steffen Pingel
+ */
+public class RefactorRepositoryUrlOperationTest extends TestCase {
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ taskList = TasksUiPlugin.getTaskList();
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testMigrateTaskContextFiles() throws Exception {
+ File fileA = ContextCorePlugin.getContextStore().getFileForContext("http://a-1");
+ fileA.createNewFile();
+ fileA.deleteOnExit();
+ assertTrue(fileA.exists());
+ new RefactorRepositoryUrlOperation("http://a", "http://b").run(new NullProgressMonitor());
+ File fileB = ContextCorePlugin.getContextStore().getFileForContext("http://b-1");
+ assertTrue(fileB.exists());
+ assertFalse(fileA.exists());
+ }
+
+ public void testMigrateQueryUrlHandles() throws Exception {
+ RepositoryQuery query = new MockRepositoryQuery("mquery");
+ query.setRepositoryUrl("http://foo.bar");
+ query.setUrl("http://foo.bar/b");
+ taskList.addQuery(query);
+ assertTrue(taskList.getRepositoryQueries("http://foo.bar").size() > 0);
+ new RefactorRepositoryUrlOperation("http://foo.bar", "http://bar.baz").run(new NullProgressMonitor());
+ assertTrue(taskList.getRepositoryQueries("http://foo.bar").size() == 0);
+ assertTrue(taskList.getRepositoryQueries("http://bar.baz").size() > 0);
+ IRepositoryQuery changedQuery = taskList.getRepositoryQueries("http://bar.baz").iterator().next();
+ assertEquals("http://bar.baz/b", changedQuery.getUrl());
+ }
+
+ public void testMigrateQueryHandles() throws Exception {
+ RepositoryQuery query = new MockRepositoryQuery("mquery");
+ query.setRepositoryUrl("http://a");
+ taskList.addQuery(query);
+ new RefactorRepositoryUrlOperation("http://a", "http://b").run(new NullProgressMonitor());
+ assertFalse(taskList.getRepositoryQueries("http://b").isEmpty());
+ assertTrue(taskList.getRepositoryQueries("http://a").isEmpty());
+ }
+
+ public void testMigrateTaskHandles() throws Exception {
+ AbstractTask task = new MockTask("http://a", "123");
+ AbstractTask task2 = new MockTask("http://other", "other");
+ taskList.addTask(task);
+ taskList.addTask(task2);
+
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://a");
+ TasksUi.getRepositoryManager().addRepository(repository);
+ TaskRepository repository2 = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://other");
+ TasksUi.getRepositoryManager().addRepository(repository2);
+
+ try {
+ TaskData taskData = new TaskData(new TaskAttributeMapper(repository), task.getConnectorKind(),
+ task.getRepositoryUrl(), task.getTaskId());
+ TasksUiPlugin.getTaskDataManager().putUpdatedTaskData(task, taskData, true);
+
+ TaskData taskData2 = new TaskData(new TaskAttributeMapper(repository2), task2.getConnectorKind(),
+ task2.getRepositoryUrl(), task2.getTaskId());
+ taskData2.getRoot().createAttribute("comment").setValue("TEST");
+ TasksUiPlugin.getTaskDataManager().putUpdatedTaskData(task2, taskData2, true);
+
+ new RefactorRepositoryUrlOperation("http://a", "http://b").run(new NullProgressMonitor());
+ repository.setRepositoryUrl("http://b");
+ assertNull(taskList.getTask("http://a-123"));
+ assertNotNull(taskList.getTask("http://b-123"));
+ assertNotNull(TasksUi.getTaskDataManager().getTaskData(task));
+ TaskData otherData = TasksUi.getTaskDataManager().getTaskData(task2);
+ assertNotNull(otherData);
+ assertEquals("TEST", otherData.getRoot().getAttribute("comment").getValue());
+ } finally {
+ TasksUiPlugin.getTaskDataManager().deleteTaskData(task);
+ TasksUiPlugin.getTaskDataManager().deleteTaskData(task2);
+ }
+ }
+
+ public void testMigrateTaskHandlesWithExplicitSet() throws Exception {
+ AbstractTask task = new MockTask("http://aa", "123");
+ task.setUrl("http://aa/task/123");
+ taskList.addTask(task);
+ new RefactorRepositoryUrlOperation("http://aa", "http://bb").run(new NullProgressMonitor());
+ assertNull(taskList.getTask("http://aa-123"));
+ assertNotNull(taskList.getTask("http://bb-123"));
+ assertEquals("http://bb/task/123", task.getUrl());
+ }
+
+ public void testRefactorMetaContextHandles() throws Exception {
+ String firstUrl = "http://repository1.com/bugs";
+ String secondUrl = "http://repository2.com/bugs";
+ AbstractTask task1 = new MockTask(firstUrl, "1");
+ AbstractTask task2 = new MockTask(firstUrl, "2");
+ taskList.addTask(task1);
+ taskList.addTask(task2);
+ Calendar startDate = Calendar.getInstance();
+ Calendar endDate = Calendar.getInstance();
+ endDate.add(Calendar.MINUTE, 5);
+
+ Calendar startDate2 = Calendar.getInstance();
+ startDate2.add(Calendar.MINUTE, 15);
+ Calendar endDate2 = Calendar.getInstance();
+ endDate2.add(Calendar.MINUTE, 25);
+
+ ContextCorePlugin.getContextManager().resetActivityMetaContext();
+ InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ assertEquals(0, metaContext.getInteractionHistory().size());
+
+ ContextCorePlugin.getContextManager().processActivityMetaContextEvent(
+ new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(), "origin",
+ null, InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startDate.getTime(),
+ endDate.getTime()));
+
+ ContextCorePlugin.getContextManager().processActivityMetaContextEvent(
+ new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task2.getHandleIdentifier(), "origin",
+ null, InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startDate2.getTime(),
+ endDate2.getTime()));
+
+ assertEquals(2, metaContext.getInteractionHistory().size());
+ assertEquals(60 * 1000 * 5, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ assertEquals(2 * 60 * 1000 * 5, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task2));
+ new RefactorRepositoryUrlOperation(firstUrl, secondUrl).run(new NullProgressMonitor());
+ metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ assertEquals(2, metaContext.getInteractionHistory().size());
+ assertEquals(60 * 1000 * 5, TasksUiPlugin.getTaskActivityManager().getElapsedTime(new MockTask(secondUrl, "1")));
+ assertEquals(2 * 60 * 1000 * 5, TasksUiPlugin.getTaskActivityManager().getElapsedTime(
+ new MockTask(secondUrl, "2")));
+ assertEquals(secondUrl + "-1", metaContext.getInteractionHistory().get(0).getStructureHandle());
+ }
+
+ public void testMigrateTaskHandlesUnsubmittedTask() throws Exception {
+ ITask task = TasksUiUtil.createOutgoingNewTask(MockRepositoryConnector.REPOSITORY_KIND, "http://a");
+ String handleIdentifier = task.getHandleIdentifier();
+ taskList.addTask(task);
+ assertEquals("http://a", task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL));
+
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://a");
+ TasksUi.getRepositoryManager().addRepository(repository);
+
+ try {
+ TaskData taskData = new TaskData(new TaskAttributeMapper(repository), repository.getConnectorKind(),
+ repository.getRepositoryUrl(), "");
+ ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(task, taskData);
+ workingCopy.save(null, null);
+
+ new RefactorRepositoryUrlOperation("http://a", "http://b").run(new NullProgressMonitor());
+ repository.setRepositoryUrl("http://b");
+ assertEquals(task, taskList.getTask(handleIdentifier));
+ assertEquals("http://b", task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL));
+ taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ assertNotNull(taskData);
+ assertEquals("http://b", taskData.getRepositoryUrl());
+ } finally {
+ TasksUiPlugin.getTaskDataManager().deleteTaskData(task);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RepositorySettingsPageTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RepositorySettingsPageTest.java
new file mode 100644
index 0000000..8034618
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RepositorySettingsPageTest.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositorySettingsPageTest extends TestCase {
+
+ public void testNeedsEncoding() {
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://localhost/");
+ repository.setCharacterEncoding("UTF-8");
+
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(repository);
+ page.setNeedsEncoding(true);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ page.setVisible(true);
+
+ TaskRepository repository2 = page.createTaskRepository();
+ assertEquals("UTF-8", repository2.getCharacterEncoding());
+ }
+
+ public void testNeedsEncodingFalse() {
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(null);
+ page.setNeedsEncoding(false);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ page.setVisible(true);
+
+ page.createTaskRepository();
+ }
+
+ public void testNeedsAnonyoumousLoginFalse() {
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(null);
+ page.setNeedsAnonymousLogin(false);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ page.setVisible(true);
+
+ assertNull(page.getAnonymousButton());
+ }
+
+ public void testNeedsAnonyoumousLoginNoRepository() {
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(null);
+ page.setNeedsAnonymousLogin(true);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ page.setVisible(true);
+
+ assertNotNull(page.getAnonymousButton());
+
+ assertTrue(page.getAnonymousButton().getSelection());
+ assertFalse(page.getUserNameEditor().getTextControl(page.getParent()).isEnabled());
+ assertFalse(page.getPasswordEditor().getTextControl(page.getParent()).isEnabled());
+ assertEquals("", page.getUserName());
+ assertEquals("", page.getPassword());
+ page.getAnonymousButton().setSelection(false);
+ }
+
+ public void testNeedsAnonyoumousLogin() {
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://localhost/");
+
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(new MockRepositoryConnectorUi());
+
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(repository);
+ page.setNeedsAnonymousLogin(true);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ page.setVisible(true);
+
+ assertNotNull(page.getAnonymousButton());
+
+ assertTrue(page.getAnonymousButton().getSelection());
+ assertFalse(page.getUserNameEditor().getTextControl(page.getParent()).isEnabled());
+ assertFalse(page.getPasswordEditor().getTextControl(page.getParent()).isEnabled());
+ assertEquals("", page.getUserName());
+ assertEquals("", page.getPassword());
+
+ page.getAnonymousButton().setSelection(false);
+ page.getAnonymousButton().notifyListeners(SWT.Selection, new Event());
+ assertTrue(page.getUserNameEditor().getTextControl(page.getParent()).isEnabled());
+ assertTrue(page.getPasswordEditor().getTextControl(page.getParent()).isEnabled());
+ page.getUserNameEditor().setStringValue("user");
+ page.getPasswordEditor().setStringValue("password");
+ assertEquals("user", page.getUserName());
+ assertEquals("password", page.getPassword());
+
+ page.getAnonymousButton().setSelection(true);
+ page.getAnonymousButton().notifyListeners(SWT.Selection, new Event());
+ assertFalse(page.getUserNameEditor().getTextControl(page.getParent()).isEnabled());
+ assertFalse(page.getPasswordEditor().getTextControl(page.getParent()).isEnabled());
+ assertEquals("", page.getUserName());
+ assertEquals("", page.getPassword());
+
+ page.getAnonymousButton().setSelection(false);
+ page.getAnonymousButton().notifyListeners(SWT.Selection, new Event());
+ assertTrue(page.getUserNameEditor().getTextControl(page.getParent()).isEnabled());
+ assertTrue(page.getPasswordEditor().getTextControl(page.getParent()).isEnabled());
+ assertEquals("user", page.getUserNameEditor().getStringValue());
+ assertEquals("password", page.getPasswordEditor().getStringValue());
+ assertEquals("user", page.getUserName());
+ assertEquals("password", page.getPassword());
+ }
+
+ public void testSavePassword() {
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://localhost/");
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(new MockRepositoryConnectorUi());
+
+ assertTrue(repository.getSavePassword(AuthenticationType.REPOSITORY));
+
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(repository);
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ assertTrue(page.getSavePassword());
+ } finally {
+ page.dispose();
+ }
+
+ repository.setCredentials(AuthenticationType.REPOSITORY, null, false);
+ page = new MockRepositorySettingsPage(repository);
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ assertFalse(page.getSavePassword());
+ } finally {
+ page.dispose();
+ }
+ }
+
+ public void testSaveHttpPassword() {
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://localhost/");
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(new MockRepositoryConnectorUi());
+
+ assertTrue(repository.getSavePassword(AuthenticationType.HTTP));
+
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(repository);
+ page.setNeedsHttpAuth(true);
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ assertTrue(page.getSaveHttpPassword());
+ } finally {
+ page.dispose();
+ }
+
+ repository.setCredentials(AuthenticationType.HTTP, null, false);
+// page = new MockRepositorySettingsPage(repository);
+ page.setNeedsHttpAuth(true);
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ assertFalse(page.getSaveHttpPassword());
+ } finally {
+ page.dispose();
+ }
+ }
+
+ public void testSaveProxyPassword() {
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, "http://localhost/");
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(new MockRepositoryConnectorUi());
+
+ assertTrue(repository.getSavePassword(AuthenticationType.PROXY));
+
+ MockRepositorySettingsPage page = new MockRepositorySettingsPage(repository);
+ page.setNeedsProxy(true);
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ assertTrue(page.getSaveProxyPassword());
+ } finally {
+ page.dispose();
+ }
+
+ repository.setCredentials(AuthenticationType.PROXY, null, false);
+ page = new MockRepositorySettingsPage(repository);
+ page.setNeedsProxy(true);
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ assertFalse(page.getSaveProxyPassword());
+ } finally {
+ page.dispose();
+ }
+ }
+
+ private class MockRepositorySettingsPage extends AbstractRepositorySettingsPage {
+
+ public MockRepositorySettingsPage(TaskRepository taskRepository) {
+ super("title", "summary", taskRepository);
+ }
+
+ @Override
+ protected void createAdditionalControls(Composite parent) {
+ // ignore
+ }
+
+ @Override
+ protected boolean isValidUrl(String name) {
+ // ignore
+ return false;
+ }
+
+ @Override
+ protected void validateSettings() {
+ // ignore
+ }
+
+ Button getAnonymousButton() {
+ return anonymousButton;
+ }
+
+ StringFieldEditor getUserNameEditor() {
+ return repositoryUserNameEditor;
+ }
+
+ StringFieldEditor getPasswordEditor() {
+ return repositoryPasswordEditor;
+ }
+
+ Composite getParent() {
+ return compositeContainer;
+ }
+
+ @Override
+ protected Validator getValidator(TaskRepository repository) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return MockRepositoryConnector.REPOSITORY_KIND;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RepositoryTemplateManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RepositoryTemplateManagerTest.java
new file mode 100644
index 0000000..e6aa8e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/RepositoryTemplateManagerTest.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTemplateManager;
+import org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryUtil;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositoryTemplateManagerTest extends TestCase {
+
+ private RepositoryTemplateManager manager;
+
+ @Override
+ protected void setUp() throws Exception {
+ manager = TasksUiPlugin.getRepositoryTemplateManager();
+ }
+
+ public void testTemplateDeletion() {
+ RepositoryTemplate template = new RepositoryTemplate("Mock", MockRepositoryConnector.REPOSITORY_URL, "", "",
+ "", "", "", "", false, true);
+ try {
+ manager.addTemplate(MockRepositoryConnector.REPOSITORY_KIND, template);
+ assertFalse(TaskRepositoryUtil.isAddAutomaticallyDisabled(MockRepositoryConnector.REPOSITORY_URL));
+ TaskRepositoryUtil.disableAddAutomatically(MockRepositoryConnector.REPOSITORY_URL);
+ assertTrue(TaskRepositoryUtil.isAddAutomaticallyDisabled(MockRepositoryConnector.REPOSITORY_URL));
+ } finally {
+ manager.removeTemplate(MockRepositoryConnector.REPOSITORY_KIND, template);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ScheduledPresentationTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ScheduledPresentationTest.java
new file mode 100644
index 0000000..c64bc7a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ScheduledPresentationTest.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Calendar;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListInterestFilter;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * @author Rob Elves
+ */
+public class ScheduledPresentationTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ ContextCorePlugin.getContextManager().getActivityMetaContext().reset();
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ TaskTestUtil.resetTaskList();
+ TasksUiPlugin.getExternalizationManager().requestSave();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskList();
+ TasksUiPlugin.getExternalizationManager().requestSave();
+ }
+
+ public void testWeekStartChange() {
+ TaskListInterestFilter filter = new TaskListInterestFilter();
+ TasksUiPlugin.getTaskActivityManager().setWeekStartDay(Calendar.MONDAY);
+ DateRange lastDay = TaskActivityUtil.getCurrentWeek().getDayOfWeek(Calendar.SUNDAY);
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(task1, lastDay);
+ assertTrue(filter.isInterestingForThisWeek(null, task1));
+
+ TasksUiPlugin.getTaskActivityManager().setWeekStartDay(Calendar.SUNDAY);
+ assertFalse(filter.isInterestingForThisWeek(null, task1));
+
+ }
+
+// public void testResetAndRollOver() {
+//
+// ScheduledTaskContainer pastWeeks = TasksUiPlugin.getTaskActivityManager().getActivityPast();
+// ScheduledTaskContainer thisWeek = TasksUiPlugin.getTaskActivityManager().getActivityThisWeek();
+// ScheduledTaskContainer nextWeek = TasksUiPlugin.getTaskActivityManager().getActivityNextWeek();
+// ScheduledTaskContainer futureWeeks = TasksUiPlugin.getTaskActivityManager().getActivityFuture();
+//
+// assertEquals(0, thisWeek.getChildren().size());
+// assertTrue(thisWeek.isPresent());
+// assertTrue(nextWeek.isFuture());
+//
+// long pastStartTime = pastWeeks.getEnd().getTimeInMillis();
+// long thisWeekStartTime = thisWeek.getStart().getTimeInMillis();
+// long nextStartTime = nextWeek.getStart().getTimeInMillis();
+// long futureStartTime = futureWeeks.getStart().getTimeInMillis();
+//
+// Calendar pastWeeksTaskStart = Calendar.getInstance();
+// pastWeeksTaskStart.setTimeInMillis(pastStartTime - 10);
+// assertTrue(pastWeeks.includes(pastWeeksTaskStart));
+//
+// Calendar thisWeekTaskStart = Calendar.getInstance();
+// thisWeekTaskStart.setTimeInMillis(thisWeekStartTime + 10);
+// assertTrue(thisWeek.includes(thisWeekTaskStart));
+//
+// Calendar thisWeekTaskStop = Calendar.getInstance();
+// thisWeekTaskStop.setTimeInMillis(thisWeek.getEnd().getTimeInMillis() - 10);
+// assertTrue(thisWeek.includes(thisWeekTaskStop));
+//
+// Calendar nextWeekTaskStart = Calendar.getInstance();
+// nextWeekTaskStart.setTimeInMillis(nextStartTime + 10);
+// assertTrue(nextWeek.includes(nextWeekTaskStart));
+//
+// Calendar futureWeekTaskStart = Calendar.getInstance();
+// futureWeekTaskStart.setTimeInMillis(futureStartTime + 10);
+// assertTrue(futureWeeks.includes(futureWeekTaskStart));
+//
+// AbstractTask task1 = new LocalTask("task 1", "Task 1");
+// TasksUiPlugin.getTaskList().addTask(task1);
+//
+// assertEquals(0, TasksUiPlugin.getTaskActivityManager()
+// .getScheduledTasks(thisWeek.getStart(), thisWeek.getEnd())
+// .size());
+//
+// TasksUiPlugin.getTaskActivityManager().setScheduledFor(task1, thisWeek.getStart().getTime());
+//
+//// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+// assertEquals(1, TasksUiPlugin.getTaskActivityManager()
+// .getScheduledTasks(thisWeek.getStart(), thisWeek.getEnd())
+// .size());
+// // assertEquals(thisWeekTaskStop.getTime().getTime() -
+// // thisWeekTaskStart.getTime().getTime(), thisWeek
+// // .getTotalElapsed());
+//
+// // ROLL OVER
+// Date oldStart = TasksUiPlugin.getTaskActivityManager().getStartTime();
+// Calendar newStart = Calendar.getInstance();
+// newStart.setTime(oldStart);
+// newStart.add(Calendar.WEEK_OF_MONTH, 1);
+// //TasksUiPlugin.getTaskListManager().snapToStartOfWeek(newStart);
+//
+// TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+//
+// //ScheduledTaskContainer newPastWeeks = TasksUiPlugin.getTaskListManager().getActivityPast();
+// ScheduledTaskContainer newPreviousWeek = TasksUiPlugin.getTaskActivityManager().getActivityPrevious();
+// ScheduledTaskContainer newThisWeek = TasksUiPlugin.getTaskActivityManager().getActivityThisWeek();
+// ScheduledTaskContainer newNextWeek = TasksUiPlugin.getTaskActivityManager().getActivityNextWeek();
+// // DateRangeContainer newFutureWeeks =
+// // MylarTaskListPlugin.getTaskListManager().getActivityFuture();
+//
+// assertTrue(newPreviousWeek.includes(thisWeekTaskStart));
+// assertTrue(newThisWeek.includes(nextWeekTaskStart));
+// assertTrue(newNextWeek.includes(futureWeekTaskStart));
+//
+// assertFalse(newThisWeek.includes(thisWeekTaskStart));
+// assertFalse(newThisWeek.isPresent());
+// assertTrue(newThisWeek.isFuture());
+//
+// assertEquals(0, TasksUiPlugin.getTaskActivityManager().getScheduledTasks(newThisWeek.getStart(),
+// newThisWeek.getEnd()).size());
+// assertEquals(1, TasksUiPlugin.getTaskActivityManager().getScheduledTasks(newPreviousWeek.getStart(),
+// newPreviousWeek.getEnd()).size());
+//
+// TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+// }
+
+ public void testScheduledTaskContainer() {
+
+ Calendar startDate = Calendar.getInstance();
+ startDate.setTimeInMillis(1000);
+ Calendar endDate = Calendar.getInstance();
+ endDate.setTimeInMillis(2000);
+
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ AbstractTask task2 = new LocalTask("task 2", "Task 2");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ TasksUiPlugin.getTaskList().addTask(task2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, startDate.getTime(), endDate.getTime());
+
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task2.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, startDate.getTime(), endDate.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+ Calendar start = TaskActivityUtil.getCalendar();
+ start.setTimeInMillis(0);
+ Calendar end = TaskActivityUtil.getCalendar();
+ end.add(Calendar.MINUTE, 2);
+ Set<AbstractTask> tasks = TasksUiPlugin.getTaskActivityManager().getActiveTasks(start, end);
+ assertEquals(2, tasks.size());
+ assertEquals(1000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ assertEquals(1000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task2));
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/StackTraceDuplicateDetectorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/StackTraceDuplicateDetectorTest.java
new file mode 100644
index 0000000..a392926
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/StackTraceDuplicateDetectorTest.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.search.StackTraceDuplicateDetector;
+
+/**
+ * @author Jeff Pound
+ */
+public class StackTraceDuplicateDetectorTest extends TestCase {
+
+ public void testStackTrace() throws Exception {
+ String stackTrace = "java.lang.NullPointerException\nat jeff.testing.stack.trace.functionality(jeff.java:481)";
+ assertNotNull(StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testNoStackTrace() throws Exception {
+ String stackTrace = "this is not really a stacktrace";
+ assertNull(StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testStackTraceWithAppendedText() throws Exception {
+ String stackTrace = "java.lang.NullPointerException\nat jeff.testing.stack.trace.functionality(jeff.java:481)";
+ String extraText = "\nExtra text that isnt' part of the stack trace java:";
+ assertEquals(stackTrace + "\n", StackTraceDuplicateDetector.getStackTraceFromDescription(extraText + "\n"
+ + stackTrace + "\n"));
+ }
+
+ public void testStackTraceMisaligned() throws Exception {
+ String stackTrace = "java.lang.IllegalStateException: zip file closed\n"
+ + " at java.util.zip.ZipFile.ensureOpen (ZipFile.java:518)\n"
+ + "at java.util.zip.ZipFile.getEntry (ZipFile.java:251)\n"
+ + " at java.util.jar.JarFile.getEntry(JarFile.java:200)\n"
+ + "at sun.net.www.protocol.jar.URLJarFile.getEntry\n" + " (URLJarFile.java:90)\n"
+ + "at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:112)\n"
+ + "at sun.net.www.protocol.jar.JarURLConnection.getInputStream\n" + "(JarURLConnection.java:124)\n"
+ + "at org.eclipse.jdt.internal.core.JavaElement\n.getURLContents(JavaElement.java:734)";
+ assertEquals(stackTrace, StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testStackTraceSUN() throws Exception {
+ // SUN, IBM (no space before brackets, one set of brackets)
+ String stackTrace = "java.lang.IllegalStateException: zip file closed\n"
+ + " at java.util.zip.ZipFile.ensureOpen(ZipFile.java:518)\n"
+ + " at java.util.zip.ZipFile.getEntry(ZipFile.java:251)\n"
+ + " at java.util.jar.JarFile.getEntry(JarFile.java:200)\n"
+ + " at sun.net.www.protocol.jar.URLJarFile.getEntry(URLJarFile.java:90)\n"
+ + " at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:112)\n"
+ + " at sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:124)\n"
+ + " at org.eclipse.jdt.internal.core.JavaElement.getURLContents(JavaElement.java:734)";
+ assertEquals(stackTrace, StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testStackTraceGCJ() throws Exception {
+ // gcj/gij (path and lib names in additional brackets)
+ String stackTrace = "java.lang.Error: Something bad happened\n"
+ + " at testcase.main(java.lang.String[]) (Unknown Source)\n"
+ + " at gnu.java.lang.MainThread.call_main() (/usr/lib/libgcj.so.6.0.0)\n"
+ + " at gnu.java.lang.MainThread.run() (/usr/lib/libgcj.so.6.0.0)";
+ assertEquals(stackTrace, StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testStackTraceNoLineNums() throws Exception {
+ // ikvm (no line numbers)
+ String stackTrace = "java.lang.Error: Something bad happened\n" + " at testcase.main (testcase.java)\n"
+ + " at java.lang.reflect.Method.Invoke (Method.java)";
+ assertEquals(stackTrace, StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testStackTraceJRockit() throws Exception {
+ // jrockit (slash delimiters)
+ String stackTrace = "java.lang.Error: Something bad happened\n"
+ + " at java/io/BufferedReader.readLine(BufferedReader.java:331)\n"
+ + " at java/io/BufferedReader.readLine(BufferedReader.java:362)\n"
+ + " at java/util/Properties.load(Properties.java:192)\n"
+ + " at java/util/logging/LogManager.readConfiguration(L:555)";
+ assertEquals(stackTrace, StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+ public void testStackTraceOther() throws Exception {
+ // jamvm, sablevm, kaffe, cacao (space before brackets, one set of brackets)
+ String stackTrace = "java.lang.Error: Something bad happened\n" + " at testcase.main (testcase.java:3)\n"
+ + " at java.lang.VirtualMachine.invokeMain (VirtualMachine.java)\n"
+ + " at java.lang.VirtualMachine.main (VirtualMachine.java:108)";
+ assertEquals(stackTrace, StackTraceDuplicateDetector.getStackTraceFromDescription(stackTrace));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivationActionTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivationActionTest.java
new file mode 100644
index 0000000..1c2e62d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivationActionTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskActivationActionTest extends TestCase {
+
+ @Override
+ protected void tearDown() throws Exception {
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ }
+
+ public void testUpdateOnExternalActivation() {
+ MockTask task = new MockTask("test:activation");
+ ToggleTaskActivationAction action = new ToggleTaskActivationAction(task);
+ assertFalse(action.isChecked());
+
+ TasksUi.getTaskActivityManager().activateTask(task);
+ assertTrue(action.isChecked());
+
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ assertFalse(action.isChecked());
+
+ action.dispose();
+
+ TasksUi.getTaskActivityManager().activateTask(task);
+ assertFalse(action.isChecked());
+
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ assertFalse(action.isChecked());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivationHistoryTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivationHistoryTest.java
new file mode 100644
index 0000000..ff24f93
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivationHistoryTest.java
@@ -0,0 +1,328 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.TaskActivateAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Frank Becker
+ * @author Wesley Coelho
+ */
+public class TaskActivationHistoryTest extends TestCase {
+
+ private TaskActivationHistory history;
+
+ private TaskList taskList;
+
+ private AbstractTask task1;
+
+ private AbstractTask task2;
+
+ private AbstractTask task3;
+
+ private AbstractTask task4;
+
+ private AbstractTask task5;
+
+ private ActivateTaskHistoryDropDownAction previousTaskAction;
+
+ private TaskActivityManager taskActivityManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskActivityManager = TasksUiPlugin.getTaskActivityManager();
+ history = taskActivityManager.getTaskActivationHistory();
+ taskList = TasksUiPlugin.getTaskList();
+
+ taskActivityManager.deactivateActiveTask();
+ taskActivityManager.clear();
+ ContextCorePlugin.getContextManager().resetActivityMetaContext();
+
+ TaskTestUtil.resetTaskList();
+
+ task1 = TasksUiInternal.createNewLocalTask("task 1");
+ taskList.addTask(task1);
+ task2 = TasksUiInternal.createNewLocalTask("task 2");
+ taskList.addTask(task2);
+ task3 = TasksUiInternal.createNewLocalTask("task 3");
+ taskList.addTask(task3);
+ task4 = TasksUiInternal.createNewLocalTask("task 4");
+ taskList.addTask(task4);
+ task5 = TasksUiInternal.createNewLocalTask("task 5");
+ taskList.addTask(task5);
+
+ previousTaskAction = new ActivateTaskHistoryDropDownAction();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskList();
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(new HashSet<IWorkingSet>(0));
+ }
+
+ public void testWithWorkingSet() {
+ MockRepositoryQuery query1 = new MockRepositoryQuery("Query 1");
+ MockRepositoryQuery query2 = new MockRepositoryQuery("Query 2");
+
+ AbstractTask task11 = TasksUiInternal.createNewLocalTask("Query1 Task 1");
+ AbstractTask task12 = TasksUiInternal.createNewLocalTask("Query1 Task 2");
+ AbstractTask task21 = TasksUiInternal.createNewLocalTask("Query2 Task 1");
+ AbstractTask task22 = TasksUiInternal.createNewLocalTask("Query2 Task 2");
+ taskList.addQuery(query1);
+ taskList.addQuery(query2);
+ createWorkingSet(query1);
+ (new TaskActivateAction()).run(task11);
+ history.addTask(task11);
+ taskList.addTask(task11, query1);
+ (new TaskActivateAction()).run(task12);
+ history.addTask(task12);
+ taskList.addTask(task12, query1);
+
+ (new TaskActivateAction()).run(task21);
+ history.addTask(task21);
+ taskList.addTask(task21, query2);
+ (new TaskActivateAction()).run(task22);
+ history.addTask(task22);
+ taskList.addTask(task22, query2);
+
+ List<AbstractTask> prevHistoryList = history.getPreviousTasks();
+
+ // Check that the previous history list looks right
+ assertTrue(prevHistoryList.size() >= 3);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task22);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 2) == task21);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 3) == task12);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 4) == task11);
+
+ prevHistoryList = history.getPreviousTasks(TasksUiInternal.getContainersFromWorkingSet(TaskWorkingSetUpdater.getActiveWorkingSets(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow())));
+
+ // Check that the previous history list looks right
+ assertTrue(prevHistoryList.size() >= 2);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task12);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 2) == task11);
+
+ prevHistoryList = history.getPreviousTasks(new HashSet<AbstractTaskContainer>());
+
+ // Check that the previous history list looks right
+ assertTrue(prevHistoryList.size() >= 3);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task22);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 2) == task21);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 3) == task12);
+ assertTrue(prevHistoryList.get(prevHistoryList.size() - 4) == task11);
+ }
+
+ private IWorkingSet createWorkingSet(IAdaptable element) {
+ IWorkingSetManager workingSetManager1 = ContextUiPlugin.getDefault().getWorkbench().getWorkingSetManager();
+ IWorkingSet workingSet = workingSetManager1.createWorkingSet("Task Working Set", new IAdaptable[] { element });
+ workingSet.setId(TaskWorkingSetUpdater.ID_TASK_WORKING_SET);
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(element));
+ Set<IWorkingSet> sets = TaskWorkingSetUpdater.getActiveWorkingSets(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow());
+ sets.add(workingSet);
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(sets);
+ return workingSet;
+ }
+
+ /**
+ * Tests the next task and previous task navigation.
+ */
+ public void testBasicHistoryNavigation() {
+ // NOTE: legacy test
+ TasksUi.getTaskActivityManager().activateTask(task1);
+ history.addTask(task1);
+ TasksUi.getTaskActivityManager().activateTask(task2);
+ history.addTask(task2);
+ TasksUi.getTaskActivityManager().activateTask(task3);
+ history.addTask(task3);
+
+ assertTrue(task3.isActive());
+ assertFalse(task2.isActive());
+ assertFalse(task1.isActive());
+ // order 1 (2) 3
+
+ previousTaskAction.run();
+ // order (1) 3 2
+ assertEquals(task2, taskActivityManager.getActiveTask());
+ assertTrue(task2.isActive());
+
+ previousTaskAction.run();
+ // order (1) 2 3
+ assertEquals(task1, taskActivityManager.getActiveTask());
+ assertTrue(task1.isActive());
+
+ previousTaskAction.run();
+ // order (1) 2 3
+ assertEquals(task1, taskActivityManager.getActiveTask());
+ assertTrue(task1.isActive());
+
+ // taskView.getPreviousTaskAction().run();
+ // assertTrue(task1.isActive());
+ //
+ // taskView.getPreviousTaskAction().run();
+ // assertTrue(task1.isActive());
+
+ // taskView.getNextTaskAction().run();
+ // assertTrue(task2.isActive());
+ //
+ // taskView.getNextTaskAction().run();
+ // assertTrue(task3.isActive());
+ //
+ // taskView.getNextTaskAction().run();
+ // assertTrue(task3.isActive());
+ //
+ // taskView.getPreviousTaskAction().run();
+ // assertTrue(task2.isActive());
+ //
+ // taskView.getNextTaskAction().run();
+ // assertTrue(task3.isActive());
+ //
+ // TasksUi.getTaskActivityManager().activateTask(task4);
+ // history.addTask(task4); // Simulate clicking on it rather
+ // // than navigating next or previous
+ // assertTrue(task4.isActive());
+ //
+ // taskView.getNextTaskAction().run();
+ // assertTrue(task4.isActive());
+ //
+ // taskView.getPreviousTaskAction().run();
+ // assertTrue(task3.isActive());
+ //
+ // taskView.getNextTaskAction().run();
+ // assertTrue(task4.isActive());
+
+ }
+
+ /**
+ * Tests navigation to previous/next tasks that are chosen from a list rather than being sequentially navigated
+ */
+ public void testArbitraryHistoryNavigation() {
+ // Simulate activating the tasks by clicking rather than
+ // navigating previous/next
+ TasksUi.getTaskActivityManager().activateTask(task1);
+ history.addTask(task1);
+ TasksUi.getTaskActivityManager().activateTask(task2);
+ history.addTask(task2);
+ TasksUi.getTaskActivityManager().activateTask(task3);
+ history.addTask(task3);
+ TasksUi.getTaskActivityManager().activateTask(task4);
+ history.addTask(task4);
+
+ assertTrue(task4.isActive());
+ //TaskActivationHistory taskHistory = taskView.getTaskActivationHistory();
+ List<AbstractTask> prevHistoryList = history.getPreviousTasks();
+
+ // Check that the previous history list looks right
+ assertTrue(prevHistoryList.size() >= 3);
+ assertEquals(task3, prevHistoryList.get(prevHistoryList.size() - 2));
+ assertEquals(task2, prevHistoryList.get(prevHistoryList.size() - 3));
+ assertEquals(task1, prevHistoryList.get(prevHistoryList.size() - 4));
+
+ // Get a task from the list and activate it
+ TasksUi.getTaskActivityManager().activateTask(task2);
+ assertEquals(task2, taskActivityManager.getActiveTask());
+ assertTrue(task2.isActive());
+
+ // Now check that the next and prev lists look right
+ prevHistoryList = history.getPreviousTasks();
+ assertEquals(task2, prevHistoryList.get(prevHistoryList.size() - 1));
+ assertEquals(task4, prevHistoryList.get(prevHistoryList.size() - 2));
+ assertEquals(task1, prevHistoryList.get(prevHistoryList.size() - 4));
+ assertEquals(task3, prevHistoryList.get(prevHistoryList.size() - 3));
+
+ // Activation of task outside of history navigation tool
+ history.addTask(task3);
+
+ prevHistoryList = history.getPreviousTasks();
+ assertEquals(task3, prevHistoryList.get(prevHistoryList.size() - 1));
+ assertEquals(task2, prevHistoryList.get(prevHistoryList.size() - 2));
+ assertEquals(task4, prevHistoryList.get(prevHistoryList.size() - 3));
+ assertEquals(task1, prevHistoryList.get(prevHistoryList.size() - 4));
+
+ // Pick a task from drop down history
+ TasksUi.getTaskActivityManager().activateTask(task4);
+ assertEquals(task4, taskActivityManager.getActiveTask());
+ assertTrue(task4.isActive());
+
+ prevHistoryList = history.getPreviousTasks();
+ assertEquals(task4, prevHistoryList.get(prevHistoryList.size() - 1));
+ assertEquals(task3, prevHistoryList.get(prevHistoryList.size() - 2));
+ assertEquals(task2, prevHistoryList.get(prevHistoryList.size() - 3));
+ assertEquals(task1, prevHistoryList.get(prevHistoryList.size() - 4));
+
+ // Hit previous task button
+ previousTaskAction.run();
+ assertEquals(task3, taskActivityManager.getActiveTask());
+ assertTrue(task3.isActive());
+
+ prevHistoryList = history.getPreviousTasks();
+ assertEquals(task3, prevHistoryList.get(prevHistoryList.size() - 1));
+ assertEquals(task4, prevHistoryList.get(prevHistoryList.size() - 2));
+ assertEquals(task2, prevHistoryList.get(prevHistoryList.size() - 3));
+ assertEquals(task1, prevHistoryList.get(prevHistoryList.size() - 4));
+
+ TasksUi.getTaskActivityManager().deactivateTask(task3);
+
+ // List<ITask> nextHistoryList = taskHistory.getNextTasks();
+ // assertTrue(nextHistoryList.get(0) == task3);
+ // assertTrue(nextHistoryList.get(1) == task4);
+ //
+ // // Navigate to a next item
+ // NextTaskDropDownAction nextAction = new
+ // NextTaskDropDownAction(taskView, taskHistory);
+ // navigateAction = nextAction.new TaskNavigateAction(task4);
+ // navigateAction.run();
+ // taskHistory.navigatedToTask(task4);
+ //
+ // assertTrue(task4.isActive());
+ //
+ // // Check that the prev and next lists look right
+ // nextHistoryList = taskHistory.getNextTasks();
+ // prevHistoryList = taskHistory.getPreviousTasks();
+ // assertTrue(nextHistoryList.size() == 0);
+ // assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task3);
+ // assertTrue(prevHistoryList.get(prevHistoryList.size() - 2) == task2);
+ // assertTrue(prevHistoryList.get(prevHistoryList.size() - 3) == task1);
+ //
+ // // Check that a deactivated task appears first on the history list
+ // TasksUi.getTaskActivityManager().activateTask(task5);
+ // (new TaskDeactivateAction()).run(task5);
+ // taskView.addTaskToHistory(task5);
+ // prevHistoryList = taskHistory.getPreviousTasks();
+ // assertTrue(prevHistoryList.get(prevHistoryList.size() - 1) == task5);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java
new file mode 100644
index 0000000..239952a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityManagerTest.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Shawn Minto
+ * @author Robert Elves
+ */
+public class TaskActivityManagerTest extends TestCase {
+
+ private class MockTaskActivationListener extends TaskActivationAdapter {
+
+ private boolean hasActivated = false;
+
+ private boolean hasPreActivated = false;
+
+ private boolean hasDeactivated = false;
+
+ private boolean hasPreDeactivated = false;
+
+ public void reset() {
+ hasActivated = false;
+ hasPreActivated = false;
+
+ hasDeactivated = false;
+ hasPreDeactivated = false;
+
+ }
+
+ @Override
+ public void preTaskActivated(ITask task) {
+ assertFalse(hasActivated);
+ hasPreActivated = true;
+ }
+
+ @Override
+ public void preTaskDeactivated(ITask task) {
+ assertFalse(hasDeactivated);
+ hasPreDeactivated = true;
+ }
+
+ @Override
+ public void taskActivated(ITask task) {
+ assertTrue(hasPreActivated);
+ hasActivated = true;
+ }
+
+ @Override
+ public void taskDeactivated(ITask task) {
+ assertTrue(hasPreDeactivated);
+ hasDeactivated = true;
+ }
+
+ }
+
+ private TaskActivityManager taskActivityManager;
+
+ private TaskList taskList;
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskActivityManager = TasksUiPlugin.getTaskActivityManager();
+ taskActivityManager.deactivateActiveTask();
+ taskList = TasksUiPlugin.getTaskList();
+
+ TaskTestUtil.resetTaskListAndRepositories();
+
+ repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ }
+
+ public void testWeekEnd() {
+ AbstractTask task = new LocalTask("12", "task-12");
+ assertFalse(taskActivityManager.isScheduledForToday(task));
+
+ // test end of next week
+ Calendar end = TaskActivityUtil.getNextWeek().getEndDate();
+ Calendar start = TaskActivityUtil.getCalendar();
+ start.setTimeInMillis(end.getTimeInMillis());
+ TaskActivityUtil.snapStartOfDay(start);
+ taskActivityManager.setScheduledFor(task, new DateRange(start, end));
+ assertTrue(taskActivityManager.isScheduledForNextWeek(task));
+ taskActivityManager.setScheduledFor(task, TaskActivityUtil.getNextWeek());
+ assertTrue(taskActivityManager.isScheduledForNextWeek(task));
+ assertEquals(0, taskActivityManager.getScheduledTasks(new DateRange(start, end)).size());
+
+ // test end of two weeks
+ end = TaskActivityUtil.getNextWeek().next().getEndDate();
+ start = TaskActivityUtil.getCalendar();
+ start.setTimeInMillis(end.getTimeInMillis());
+ TaskActivityUtil.snapStartOfDay(start);
+ taskActivityManager.setScheduledFor(task, new DateRange(start, end));
+ assertEquals(1, taskActivityManager.getScheduledTasks(new DateRange(start, end)).size());
+ assertEquals(1, taskActivityManager.getScheduledTasks(TaskActivityUtil.getNextWeek().next()).size());
+
+ }
+
+ public void testTaskActivation() {
+ MockTask task = new MockTask("test:activation");
+ MockTaskActivationListener listener = new MockTaskActivationListener();
+ try {
+ taskActivityManager.addActivationListener(listener);
+ try {
+ taskActivityManager.activateTask(task);
+ assertTrue(listener.hasPreActivated);
+ assertTrue(listener.hasActivated);
+ assertFalse(listener.hasPreDeactivated);
+ assertFalse(listener.hasDeactivated);
+
+ listener.reset();
+ } finally {
+ taskActivityManager.deactivateTask(task);
+ }
+ assertFalse(listener.hasPreActivated);
+ assertFalse(listener.hasActivated);
+ assertTrue(listener.hasPreDeactivated);
+ assertTrue(listener.hasDeactivated);
+ } finally {
+ taskActivityManager.removeActivationListener(listener);
+ }
+ }
+
+ public void testIsActiveToday() {
+ AbstractTask task = new LocalTask("1", "task-1");
+ assertFalse(taskActivityManager.isScheduledForToday(task));
+
+ task.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday());
+ assertTrue(taskActivityManager.isScheduledForToday(task));
+
+ task.setReminded(true);
+ assertTrue(taskActivityManager.isScheduledForToday(task));
+ task.setReminded(true);
+
+// Calendar inAnHour = Calendar.getInstance();
+// inAnHour.set(Calendar.HOUR_OF_DAY, inAnHour.get(Calendar.HOUR_OF_DAY) + 1);
+// inAnHour.getTime();
+// task.setScheduledForDate(inAnHour.getTime());
+// Calendar tomorrow = Calendar.getInstance();
+// TaskActivityUtil.snapToNextDay(tomorrow);
+// assertEquals(-1, inAnHour.compareTo(tomorrow));
+// assertTrue(taskActivityManager.isScheduledForToday(task));
+ }
+
+ public void testScheduledForToday() {
+ AbstractTask task = new LocalTask("1", "task-1");
+ task.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday());
+ assertTrue(taskActivityManager.isScheduledForToday(task));
+ task.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday().next());
+ assertFalse(taskActivityManager.isScheduledForToday(task));
+ }
+
+ public void testSchedulePastEndOfMonth() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.MONTH, Calendar.SEPTEMBER);
+ calendar.set(Calendar.DAY_OF_MONTH, 30);
+ TaskActivityUtil.snapForwardNumDays(calendar, 1);
+ assertEquals("Should be October", Calendar.OCTOBER, calendar.get(Calendar.MONTH));
+ }
+
+ public void testIsCompletedToday() {
+ ITask task = new LocalTask("1", "task 1");
+ task.setCompletionDate(new Date());
+ assertTrue(taskActivityManager.isCompletedToday(task));
+
+ MockTask mockTask = new MockTask("1");
+ mockTask.setOwner("unknown");
+ taskList.addTask(mockTask);
+ mockTask.setCompletionDate(new Date());
+ assertFalse("completed: " + mockTask.getCompletionDate(), taskActivityManager.isCompletedToday(mockTask));
+
+ mockTask = new MockTask("2");
+ taskList.addTask(mockTask);
+ mockTask.setCompletionDate(new Date());
+ mockTask.setOwner("testUser");
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("testUser", ""), false);
+ assertTrue(taskActivityManager.isCompletedToday(mockTask));
+ }
+
+ public void testAllTasksDeactivation() {
+ AbstractTask task1 = new LocalTask("task1", "description1");
+ AbstractTask task2 = new LocalTask("task2", "description2");
+ taskList.addTask(task1);
+ taskList.addTask(task2);
+ assertNull(taskActivityManager.getActiveTask());
+
+ taskActivityManager.activateTask(task2);
+ assertEquals(task2, taskActivityManager.getActiveTask());
+
+ taskActivityManager.deactivateActiveTask();
+ assertNull(taskActivityManager.getActiveTask());
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityTimingTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityTimingTest.java
new file mode 100644
index 0000000..4dd86d4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskActivityTimingTest.java
@@ -0,0 +1,1331 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.context.tests.support.FileTool;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.context.core.InteractionContextScaling;
+import org.eclipse.mylyn.internal.context.core.LegacyActivityAdaptor;
+import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskActivityTimingTest extends TestCase {
+
+ private TaskActivityManager activityManager;
+
+ private ITaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ activityManager = (TaskActivityManager) TasksUi.getTaskActivityManager();
+ taskList = TasksUiInternal.getTaskList();
+ TaskTestUtil.resetTaskListAndRepositories();
+ TaskTestUtil.saveAndReadTasklist();
+ ContextCorePlugin.getContextManager().getActivityMetaContext().reset();
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ ContextCorePlugin.getContextManager().getActivityMetaContext().reset();
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testLoadCorruptContext() throws Exception {
+ String contextPath = TasksUiPlugin.getDefault().getDataDirectory() + '/' + "contexts" + '/';
+ File contexts = new File(contextPath);
+ if (!contexts.exists()) {
+ contexts.mkdir();
+ }
+ File backup = new File(contexts, ".activity.xml.zip");
+
+ File good = FileTool.getFileInPlugin(TasksTestsPlugin.getDefault(), new Path(
+ "testdata/activityTests/.activity.xml.zip"));
+
+ copy(good, backup);
+
+ File corrupt = new File(contexts, "activity.xml.zip");
+
+ File corruptSource = FileTool.getFileInPlugin(TasksTestsPlugin.getDefault(), new Path(
+ "testdata/activityTests/activity.xml.zip"));
+
+ copy(corruptSource, corrupt);
+
+ InteractionContextManager manager = ContextCorePlugin.getContextManager();
+ manager.loadActivityMetaContext();
+ assertFalse(manager.getActivityMetaContext().getInteractionHistory().isEmpty());
+ }
+
+ public void testConstantWriting() throws Exception {
+
+ String contextPath = TasksUiPlugin.getDefault().getDataDirectory() + '/' + "contexts" + '/';
+ File contexts = new File(contextPath);
+ if (!contexts.exists()) {
+ contexts.mkdir();
+ }
+ File backup = new File(contexts, ".activity.xml.zip");
+
+ File good = FileTool.getFileInPlugin(TasksTestsPlugin.getDefault(), new Path(
+ "testdata/activityTests/.activity.xml.zip"));
+
+ copy(good, backup);
+
+ InteractionContextManager manager = ContextCorePlugin.getContextManager();
+ manager.loadActivityMetaContext();
+ assertFalse(manager.getActivityMetaContext().getInteractionHistory().isEmpty());
+
+ for (int i = 0; i < 50; i++) {
+ manager.saveActivityMetaContext();
+ }
+
+ manager.loadActivityMetaContext();
+ assertFalse(manager.getActivityMetaContext().getInteractionHistory().isEmpty());
+
+ }
+
+ private void copy(File inFile, File outFile) throws Exception {
+
+ FileOutputStream outStream = new FileOutputStream(outFile);
+ FileInputStream inStream = new FileInputStream(inFile);
+
+ byte[] buffer = new byte[1024];
+ while (inStream.read(buffer) != -1) {
+ outStream.write(buffer);
+ }
+ inStream.close();
+ outStream.close();
+
+ }
+
+ public void testActivityWithNoTaskActive() {
+ Calendar start = Calendar.getInstance();
+ Calendar end = Calendar.getInstance();
+ end.setTimeInMillis(start.getTimeInMillis());
+ end.add(Calendar.HOUR_OF_DAY, 2);
+
+ Calendar start2 = Calendar.getInstance();
+ start2.add(Calendar.DAY_OF_MONTH, 1);
+ Calendar end2 = Calendar.getInstance();
+ end2.setTime(start2.getTime());
+ end2.add(Calendar.HOUR_OF_DAY, 2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET, "none", "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(), end.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET, "none", "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start2.getTime(), end2.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ long expectedTotalTime = end.getTime().getTime() - start.getTime().getTime();
+ assertEquals(2 * expectedTotalTime, activityManager.getElapsedForWorkingSet("none", start, end2));
+
+ }
+
+ public void testActivityWithNoTaskActive2() {
+ Calendar start = Calendar.getInstance();
+ Calendar end = Calendar.getInstance();
+ end.setTimeInMillis(start.getTimeInMillis());
+ end.add(Calendar.HOUR_OF_DAY, 2);
+
+ Calendar start2 = Calendar.getInstance();
+ start2.add(Calendar.DAY_OF_MONTH, 1);
+ Calendar end2 = Calendar.getInstance();
+ end2.setTime(start2.getTime());
+ end2.add(Calendar.HOUR_OF_DAY, 2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET, "set 1", "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(), end.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET, "set 2", "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start2.getTime(), end2.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ long expectedTotalTime = end.getTime().getTime() - start.getTime().getTime();
+ assertEquals(0, activityManager.getElapsedForWorkingSet("bogus", start, end2));
+ assertEquals(0, activityManager.getElapsedForWorkingSet("none", start, end2));
+ assertEquals(expectedTotalTime, activityManager.getElapsedForWorkingSet("set 1", start, end2));
+ assertEquals(expectedTotalTime, activityManager.getElapsedForWorkingSet("set 2", start, end2));
+ assertTrue(activityManager.getWorkingSets().contains("set 1"));
+ assertTrue(activityManager.getWorkingSets().contains("set 2"));
+ }
+
+ public void testActivityCaptured() {
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ taskList.addTask(task1);
+ assertEquals(0, activityManager.getElapsedTime(task1));
+
+ Calendar start = Calendar.getInstance();
+ Calendar end = Calendar.getInstance();
+ end.setTimeInMillis(start.getTimeInMillis());
+ end.add(Calendar.HOUR_OF_DAY, 2);
+
+ Calendar start2 = Calendar.getInstance();
+ start2.add(Calendar.DAY_OF_MONTH, 1);
+ Calendar end2 = Calendar.getInstance();
+ end2.setTime(start2.getTime());
+ end2.add(Calendar.HOUR_OF_DAY, 2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(), end.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start2.getTime(), end2.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ long expectedTotalTime = end.getTime().getTime() - start.getTime().getTime();
+ assertEquals(2 * expectedTotalTime, activityManager.getElapsedTime(task1));
+ Calendar startEarly = Calendar.getInstance();
+ startEarly.setTimeInMillis(start.getTimeInMillis());
+ startEarly.add(Calendar.MONTH, -1);
+ Calendar endLate = Calendar.getInstance();
+ endLate.setTimeInMillis(end.getTimeInMillis() + 60 * 5000);
+ assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, startEarly, end));
+ assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start2, end2));
+ assertEquals(2 * expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start, end2));
+ }
+
+ public void testActivityDelete() {
+
+ AbstractTask task1 = new LocalTask("1", "Task 1");
+ taskList.addTask(task1);
+ assertEquals(0, activityManager.getElapsedTime(task1));
+
+ Calendar start = Calendar.getInstance();
+ Calendar end = Calendar.getInstance();
+ end.setTimeInMillis(start.getTimeInMillis());
+ end.add(Calendar.HOUR_OF_DAY, 2);
+
+ Calendar start2 = Calendar.getInstance();
+ start2.add(Calendar.DAY_OF_MONTH, 1);
+ Calendar end2 = Calendar.getInstance();
+ end2.setTime(start2.getTime());
+ end2.add(Calendar.HOUR_OF_DAY, 2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(), end.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start2.getTime(), end2.getTime());
+
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ long expectedTotalTime = end.getTime().getTime() - start.getTime().getTime();
+ assertEquals(2 * expectedTotalTime, activityManager.getElapsedTime(task1));
+ Calendar startEarly = Calendar.getInstance();
+ startEarly.setTimeInMillis(start.getTimeInMillis());
+ startEarly.add(Calendar.MONTH, -1);
+ Calendar endLate = Calendar.getInstance();
+ endLate.setTimeInMillis(end.getTimeInMillis() + 60 * 5000);
+ assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, startEarly, end));
+ assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start2, end2));
+ assertEquals(2 * expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start, end2));
+
+ MonitorUiPlugin.getDefault().getActivityContextManager().removeActivityTime(task1.getHandleIdentifier(),
+ start.getTimeInMillis(), end.getTimeInMillis());
+ // Half gone since end date is exclusive (removes up to but not including hour)
+ assertEquals(expectedTotalTime, activityManager.getElapsedTime(task1));
+
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+
+ assertEquals(expectedTotalTime, activityManager.getElapsedTime(task1));
+
+ MonitorUiPlugin.getDefault().getActivityContextManager().removeActivityTime(task1.getHandleIdentifier(),
+ start2.getTimeInMillis(), end2.getTimeInMillis());
+
+ assertEquals(0, activityManager.getElapsedTime(task1));
+ }
+
+// public void testActivityReset() {
+//
+// AbstractTask task1 = new LocalTask("1", "Task 1");
+// taskList.addTask(task1);
+// assertEquals(0, activityManager.getElapsedTime(task1));
+//
+// Calendar start = Calendar.getInstance();
+// Calendar end = Calendar.getInstance();
+// end.setTimeInMillis(start.getTimeInMillis());
+// end.add(Calendar.HOUR_OF_DAY, 2);
+//
+// Calendar start2 = Calendar.getInstance();
+// start2.add(Calendar.DAY_OF_MONTH, 1);
+// Calendar end2 = Calendar.getInstance();
+// end2.setTime(start2.getTime());
+// end2.add(Calendar.HOUR_OF_DAY, 2);
+//
+// InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// IInteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(), end.getTime());
+// InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// IInteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start2.getTime(), end2.getTime());
+//
+// ContextCore.getContextManager().getActivityMetaContext().parseEvent(event1);
+// TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1);
+// ContextCore.getContextManager().getActivityMetaContext().parseEvent(event2);
+// TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2);
+//
+// long expectedTotalTime = end.getTime().getTime() - start.getTime().getTime();
+// assertEquals(2 * expectedTotalTime, activityManager.getElapsedTime(task1));
+// Calendar startEarly = Calendar.getInstance();
+// startEarly.setTimeInMillis(start.getTimeInMillis());
+// startEarly.add(Calendar.MONTH, -1);
+// Calendar endLate = Calendar.getInstance();
+// endLate.setTimeInMillis(end.getTimeInMillis() + 60 * 5000);
+// assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, startEarly, end));
+// assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start2, end2));
+// assertEquals(2 * expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start, end2));
+//
+// MonitorUiPlugin.getDefault().getActivityContextManager().clearActivityTime(task1.getHandleIdentifier(),
+// start.getTimeInMillis(), end.getTimeInMillis());
+// // Half gone since end date is exclusive (removes up to but not including hour)
+// assertEquals(expectedTotalTime, activityManager.getElapsedTime(task1));
+// assertTrue(activityManager.getActiveTasks(start, end).isEmpty());
+// assertFalse(activityManager.getActiveTasks(start2, end2).isEmpty());
+//
+// MonitorUiPlugin.getDefault().getActivityContextManager().clearActivityTime(task1.getHandleIdentifier(),
+// start.getTimeInMillis(), end2.getTimeInMillis() + (1000 * 60 * 60));
+//
+// // with end = hour beyond should result in zero
+// assertEquals(0, activityManager.getElapsedTime(task1));
+//
+// TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2);
+// // one event blocked now by activity date filter so only half time collected
+// assertEquals(expectedTotalTime, activityManager.getElapsedTime(task1));
+// assertFalse(activityManager.getActiveTasks(start, end).isEmpty());
+// assertTrue(activityManager.getActiveTasks(start2, end2).isEmpty());
+//
+// ContextCore.getContextManager().saveActivityContext();
+// ContextCore.getContextManager().loadActivityMetaContext();
+// TasksUiPlugin.getTaskListManager().resetAndRollOver();
+//
+//// assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, startEarly, end));
+//// assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start2, end2));
+//// assertEquals(2 * expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start, end2));
+//
+// // reset still valid after restart
+// assertEquals(expectedTotalTime, activityManager.getElapsedTime(task1));
+// assertFalse(activityManager.getActiveTasks(start, end).isEmpty());
+// assertTrue(activityManager.getActiveTasks(start2, end2).isEmpty());
+//
+// }
+
+ public void testNegativeActivity() {
+
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ taskList.addTask(task1);
+ assertEquals(0, activityManager.getElapsedTime(task1));
+
+ Calendar start = Calendar.getInstance();
+ Calendar end = Calendar.getInstance();
+ end.add(Calendar.HOUR_OF_DAY, 2);
+
+ Calendar start2 = Calendar.getInstance();
+ start2.add(Calendar.DAY_OF_MONTH, 1);
+ Calendar end2 = Calendar.getInstance();
+ end2.setTime(start2.getTime());
+ end2.add(Calendar.HOUR_OF_DAY, 2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, end.getTime(), start.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, end2.getTime(), start2.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ assertEquals(0, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ assertEquals(0, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start, end));
+ assertEquals(0, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start2, end2));
+ assertEquals(0, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1, start, end2));
+
+ }
+
+ public void testNullTaskHandle() {
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ taskList.addTask(task1);
+ assertEquals(0, activityManager.getElapsedTime(task1));
+
+ Calendar start = Calendar.getInstance();
+ Calendar end = Calendar.getInstance();
+ end.add(Calendar.HOUR_OF_DAY, 2);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind", null,
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(),
+ end.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION, "structureKind", "",
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, start.getTime(),
+ end.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+ assertEquals(0, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ }
+
+ public void testActivityNotLoggedTwice() {
+ InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ metaContext.reset();
+ assertEquals(0, metaContext.getInteractionHistory().size());
+
+ ITask task1 = new LocalTask("local 1", "Task 1");
+ ITask task2 = new LocalTask("local 2", "Task 2");
+
+ Calendar startTime1 = Calendar.getInstance();
+ TaskActivityUtil.snapStartOfHour(startTime1);
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.setTime(startTime1.getTime());
+ endTime1.add(Calendar.SECOND, 20);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.setTime(endTime1.getTime());
+ startTime2.add(Calendar.SECOND, 20);
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTime(startTime2.getTime());
+ endTime2.add(Calendar.MINUTE, 2);
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ InteractionEvent activityEvent3 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task2.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), startTime1.getTime());
+
+ // to activity events both within same hour will get collapsed
+ metaContext.parseEvent(activityEvent1);
+ metaContext.parseEvent(activityEvent2);
+ // This is a bogus 3rd event with zero activity and shouldn't be recorded
+ // this use to result in a second write of activity1 to the context
+ metaContext.parseEvent(activityEvent3);
+ metaContext = ContextCorePlugin.getContextManager().collapseActivityMetaContext(metaContext);
+ assertEquals(1, metaContext.getInteractionHistory().size());
+ }
+
+ public void testDoubleBookKeeping() {
+ AbstractTask task1 = new LocalTask("testDoubleBookKeeping", "testDoubleBookKeeping");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ {
+ Calendar startActiveTime = Calendar.getInstance();
+ Calendar endActiveTime = Calendar.getInstance();
+ endActiveTime.setTime(startActiveTime.getTime());
+ endActiveTime.add(Calendar.SECOND, 20);
+
+ Calendar startTime = Calendar.getInstance();
+ startTime.setTime(startActiveTime.getTime());
+ startTime.add(Calendar.SECOND, 5);
+ Calendar endTime = Calendar.getInstance();
+ endTime.setTime(endActiveTime.getTime());
+ endTime.add(Calendar.SECOND, -5);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH,
+ "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f,
+ startActiveTime.getTime(), startActiveTime.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH,
+ "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f,
+ endActiveTime.getTime(), endActiveTime.getTime());
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime.getTime(), endTime.getTime());
+
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(activityEvent1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ long elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1);
+ assertEquals(10000, elapsed);
+
+ // 2nd activation - no activity
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1);
+ assertEquals(10000, elapsed);
+ assertTrue(TasksUiPlugin.getTaskActivityManager().isActiveThisWeek(task1));
+ }
+
+ assertEquals(10000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ ///--- 2nd activity on same task
+ {
+ Calendar startActiveTime2 = Calendar.getInstance();
+ Calendar endActiveTime2 = Calendar.getInstance();
+ endActiveTime2.add(Calendar.SECOND, 20);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.setTimeInMillis(startActiveTime2.getTimeInMillis() + 2000);
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTimeInMillis(endActiveTime2.getTimeInMillis() - 2000);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH,
+ "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f,
+ startActiveTime2.getTime(), startActiveTime2.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH,
+ "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f,
+ endActiveTime2.getTime(), endActiveTime2.getTime());
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(activityEvent1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+ }
+
+ assertEquals(26000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+
+ assertEquals(26000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+
+ }
+
+ public void testAfterReloading() {
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+
+ Calendar startTime = Calendar.getInstance();
+ Calendar endTime = Calendar.getInstance();
+ endTime.add(Calendar.SECOND, 20);
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, startTime.getTime(), startTime.getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, startTime.getTime(), startTime.getTime());
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime.getTime(), endTime.getTime());
+
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(activityEvent1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent1, false);
+ ContextCorePlugin.getContextManager().getActivityMetaContext().parseEvent(event2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+ assertEquals(20000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+
+ assertEquals(20000, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+
+ }
+
+ public void testCollapsedTiming() {
+ Calendar startTime1 = Calendar.getInstance();
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.add(Calendar.SECOND, 20);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.setTimeInMillis(endTime1.getTimeInMillis());
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTimeInMillis(startTime2.getTimeInMillis() + 20 * 1000);
+
+ Calendar startTime3 = Calendar.getInstance();
+ startTime3.setTimeInMillis(endTime2.getTimeInMillis());
+ Calendar endTime3 = Calendar.getInstance();
+ endTime3.setTimeInMillis(startTime3.getTimeInMillis() + 20 * 1000);
+
+ InteractionContext mockContext = new InteractionContext("doitest", new InteractionContextScaling());
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ InteractionEvent activityEvent3 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime3.getTime(), endTime3.getTime());
+
+ mockContext.parseEvent(activityEvent1);
+ mockContext.parseEvent(activityEvent2);
+ mockContext.parseEvent(activityEvent3);
+ assertEquals(3, mockContext.getInteractionHistory().size());
+ mockContext = ContextCorePlugin.getContextManager().collapseActivityMetaContext(mockContext);
+ assertEquals(1, mockContext.getInteractionHistory().size());
+
+ assertEquals(60 * 1000, mockContext.getInteractionHistory().get(0).getEndDate().getTime()
+ - mockContext.getInteractionHistory().get(0).getDate().getTime());
+ }
+
+ /**
+ * test that total collapsed time is same when events are separated in time
+ */
+ public void testCollapsedTiming2() {
+ Calendar startTime1 = Calendar.getInstance();
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.add(Calendar.SECOND, 20);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.setTimeInMillis(endTime1.getTimeInMillis());
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTimeInMillis(startTime2.getTimeInMillis() + 20 * 1000);
+
+ Calendar startTime3 = Calendar.getInstance();
+ startTime3.setTimeInMillis(endTime2.getTimeInMillis());
+ Calendar endTime3 = Calendar.getInstance();
+ endTime3.setTimeInMillis(startTime3.getTimeInMillis() + 50 * 1000);
+
+ InteractionContext mockContext = new InteractionContext("doitest", new InteractionContextScaling());
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent3 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime3.getTime(), endTime3.getTime());
+
+ mockContext.parseEvent(activityEvent1);
+ mockContext.parseEvent(activityEvent3);
+ assertEquals(2, mockContext.getInteractionHistory().size());
+ mockContext = ContextCorePlugin.getContextManager().collapseActivityMetaContext(mockContext);
+ assertEquals(1, mockContext.getInteractionHistory().size());
+ assertEquals(70 * 1000, mockContext.getInteractionHistory().get(0).getEndDate().getTime()
+ - mockContext.getInteractionHistory().get(0).getDate().getTime());
+ }
+
+ public void testCollapsedExternalization() {
+
+ Calendar startTime1 = Calendar.getInstance();
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.setTime(startTime1.getTime());
+ endTime1.add(Calendar.SECOND, 20);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.add(Calendar.DAY_OF_MONTH, 1);
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTime(startTime2.getTime());
+ endTime2.add(Calendar.SECOND, 20);
+
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ metaContext.reset();
+ assertEquals(0, metaContext.getInteractionHistory().size());
+
+ TasksUiPlugin.getTaskActivityManager().activateTask(task1);
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ metaContext.parseEvent(activityEvent1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent1, false);
+ metaContext.parseEvent(activityEvent2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent2, false);
+ TasksUiPlugin.getTaskActivityManager().deactivateActiveTask();
+ assertEquals(4, ContextCorePlugin.getContextManager().getActivityMetaContext().getInteractionHistory().size());
+
+ TaskTestUtil.saveTaskList();
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ ContextCorePlugin.getContextManager().getActivityMetaContext().reset();
+ assertEquals(0, ContextCorePlugin.getContextManager().getActivityMetaContext().getInteractionHistory().size());
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+
+ assertEquals(4, ContextCorePlugin.getContextManager().getActivityMetaContext().getInteractionHistory().size());
+
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+ assertEquals((endTime1.getTimeInMillis() - startTime1.getTimeInMillis())
+ + (endTime2.getTimeInMillis() - startTime2.getTimeInMillis()), TasksUiPlugin.getTaskActivityManager()
+ .getElapsedTime(task1));
+ }
+
+ public void testCollapsedTwoTasks() {
+ // test collapsing of attention events when two or more
+ // task attention events occur sequentially
+ Calendar startTime1 = Calendar.getInstance();
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.add(Calendar.SECOND, 20);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.setTime(endTime1.getTime());
+ startTime2.add(Calendar.SECOND, 2);
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTime(startTime2.getTime());
+ endTime2.add(Calendar.SECOND, 20);
+
+ InteractionContext mockContext = new InteractionContext("doitest", new InteractionContextScaling());
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle1",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, "handle2",
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ mockContext.parseEvent(activityEvent1);
+ mockContext.parseEvent(activityEvent2);
+
+ // Since these event times are within same hour, normally they would get collapsed
+ // here we test that if the event belongs to two different tasks remain discrete
+
+ assertEquals(2, mockContext.getInteractionHistory().size());
+ mockContext = ContextCorePlugin.getContextManager().collapseActivityMetaContext(mockContext);
+ assertEquals(2, mockContext.getInteractionHistory().size());
+ }
+
+ public void testCollapeedByTheHour() {
+ Calendar startTime1 = Calendar.getInstance();
+ startTime1.set(Calendar.MINUTE, 2);
+ startTime1.set(Calendar.SECOND, 0);
+ startTime1.set(Calendar.MILLISECOND, 0);
+
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.setTime(startTime1.getTime());
+ endTime1.add(Calendar.MINUTE, 2);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.add(Calendar.HOUR_OF_DAY, 1);
+ startTime2.set(Calendar.MINUTE, 2);
+ startTime2.set(Calendar.SECOND, 0);
+ startTime2.set(Calendar.MILLISECOND, 0);
+
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTime(startTime2.getTime());
+ endTime2.add(Calendar.MINUTE, 3);
+
+ Calendar startTime3 = Calendar.getInstance();
+ startTime3.add(Calendar.HOUR_OF_DAY, 1);
+ startTime3.set(Calendar.MINUTE, 20);
+ startTime3.set(Calendar.SECOND, 0);
+ startTime3.set(Calendar.MILLISECOND, 0);
+
+ Calendar endTime3 = Calendar.getInstance();
+ endTime3.setTime(startTime3.getTime());
+ endTime3.add(Calendar.MINUTE, 5);
+
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ InteractionEvent activityEvent3 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime3.getTime(), endTime3.getTime());
+
+ List<InteractionEvent> events = new ArrayList<InteractionEvent>();
+ events.add(activityEvent1);
+ events.add(activityEvent2);
+ events.add(activityEvent3);
+ List<InteractionEvent> collapsedEvents = ContextCorePlugin.getContextManager().collapseEventsByHour(events);
+
+ assertEquals(2, collapsedEvents.size());
+ }
+
+ public void testTaskListManagerInactivity() {
+
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+
+ ScheduledTaskContainer activityThisWeek = new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(),
+ TaskActivityUtil.getCurrentWeek());
+ assertNotNull(activityThisWeek);
+ assertEquals(0, activityThisWeek.getChildren().size());
+
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, activityThisWeek.getStart().getTime(),
+ activityThisWeek.getStart().getTime());
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+ task1.getHandleIdentifier(), "originId", "navigatedRelation",
+ InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, activityThisWeek.getEnd().getTime(),
+ activityThisWeek.getEnd().getTime());
+
+ Calendar activityStart = Calendar.getInstance();
+ Calendar activityEnd = Calendar.getInstance();
+ activityEnd.add(Calendar.HOUR_OF_DAY, 1);
+
+ InteractionEvent activityEvent = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, activityStart.getTime(), activityEnd.getTime());
+
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event1, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent, false);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(event2, false);
+
+ long expectedTotalTime = (activityEnd.getTime().getTime() - activityStart.getTime().getTime());
+ assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ }
+
+ public void testElapsedSameAfterRead() {
+ // test that granularity of elapsed time map is retained after
+ // being re-read from disk
+
+ Calendar startTime1 = Calendar.getInstance();
+ startTime1.set(Calendar.MINUTE, 2);
+ startTime1.set(Calendar.SECOND, 0);
+ startTime1.set(Calendar.MILLISECOND, 0);
+
+ Calendar endTime1 = Calendar.getInstance();
+ endTime1.setTime(startTime1.getTime());
+ endTime1.add(Calendar.MINUTE, 2);
+
+ Calendar startTime2 = Calendar.getInstance();
+ startTime2.add(Calendar.HOUR_OF_DAY, 1);
+ startTime2.set(Calendar.MINUTE, 2);
+ startTime2.set(Calendar.SECOND, 0);
+ startTime2.set(Calendar.MILLISECOND, 0);
+
+ Calendar endTime2 = Calendar.getInstance();
+ endTime2.setTime(startTime2.getTime());
+ endTime2.add(Calendar.MINUTE, 3);
+
+ Calendar startTime3 = Calendar.getInstance();
+ startTime3.add(Calendar.HOUR_OF_DAY, 1);
+ startTime3.set(Calendar.MINUTE, 20);
+ startTime3.set(Calendar.SECOND, 0);
+ startTime3.set(Calendar.MILLISECOND, 0);
+
+ Calendar endTime3 = Calendar.getInstance();
+ endTime3.setTime(startTime3.getTime());
+ endTime3.add(Calendar.MINUTE, 5);
+
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ TasksUiPlugin.getTaskActivityManager().activateTask(task1);
+ InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ metaContext.reset();
+ assertEquals(0, metaContext.getInteractionHistory().size());
+
+ InteractionEvent activityEvent1 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime1.getTime(), endTime1.getTime());
+
+ InteractionEvent activityEvent2 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime2.getTime(), endTime2.getTime());
+
+ InteractionEvent activityEvent3 = new InteractionEvent(InteractionEvent.Kind.ATTENTION,
+ InteractionContextManager.ACTIVITY_STRUCTUREKIND_TIMING, task1.getHandleIdentifier(),
+ InteractionContextManager.ACTIVITY_ORIGINID_WORKBENCH, null,
+ InteractionContextManager.ACTIVITY_DELTA_ADDED, 1f, startTime3.getTime(), endTime3.getTime());
+
+ metaContext.parseEvent(activityEvent1);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent1, false);
+ metaContext.parseEvent(activityEvent2);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent2, false);
+ metaContext.parseEvent(activityEvent3);
+ TasksUiPlugin.getTaskActivityMonitor().parseInteractionEvent(activityEvent3, false);
+
+ assertEquals(1000 * 60 * 10, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ assertEquals(1000 * 60 * 2, activityManager.getElapsedTime(task1, startTime1, endTime1));
+ assertEquals(1000 * 60 * 8, activityManager.getElapsedTime(task1, startTime2, endTime2));
+
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ assertEquals(4, ContextCorePlugin.getContextManager().getActivityMetaContext().getInteractionHistory().size());
+ TaskTestUtil.saveTaskList();
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ ContextCorePlugin.getContextManager().getActivityMetaContext().reset();
+ assertEquals(0, ContextCorePlugin.getContextManager().getActivityMetaContext().getInteractionHistory().size());
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+ assertEquals(0, activityManager.getElapsedTime(task1));
+ assertEquals(0, activityManager.getElapsedTime(task1, startTime1, endTime1));
+ assertEquals(0, activityManager.getElapsedTime(task1, startTime2, endTime2));
+
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+ assertEquals(3, ContextCorePlugin.getContextManager().getActivityMetaContext().getInteractionHistory().size());
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+
+ startTime1 = Calendar.getInstance();
+ startTime1.set(Calendar.MINUTE, 0);
+ startTime1.set(Calendar.SECOND, 0);
+ startTime1.set(Calendar.MILLISECOND, 0);
+
+ assertEquals(1000 * 60 * 10, activityManager.getElapsedTime(task1));
+ assertEquals(1000 * 60 * 2, activityManager.getElapsedTime(task1, startTime1, endTime1));
+ assertEquals(1000 * 60 * 8, activityManager.getElapsedTime(task1, startTime2, endTime2));
+ }
+
+ /**
+ * @author Yuri Baburov (burchik at gmail.com)
+ * @author Rob Elves adaption to test LegacyActivityAdaptor
+ */
+ public void testLegacyTimingMigration() {
+ AbstractTask task1 = new LocalTask("task 1", "Task 1");
+ TasksUiPlugin.getTaskList().addTask(task1);
+
+// ScheduledTaskContainer thisWeekActivity = new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(),
+// TaskActivityUtil.getCurrentWeek());
+//
+// assertNotNull(thisWeekActivity);
+// assertEquals(0, thisWeekActivity.getChildren().size());
+// thisWeekActivity.getStart().setTimeInMillis(1149490800000L);
+// // Start
+// // of
+// // the
+// // week
+// // Jun 5
+// // 2006
+// // - Jun
+// // 11
+// // 2006,
+// // NOVST
+// thisWeekActivity.getEnd().setTimeInMillis(1150095600000L); // End of
+// // the week
+
+ Date time1 = new Date(1150007053171L); // Sun Jun 11 13:24:13 NOVST
+ // 2006 - task 1 - activated
+ Date time2 = new Date(1150007263468L); // Sun Jun 11 13:27:43 NOVST
+ // 2006 - attention -
+ // deactivated
+ Date time3 = new Date(1150021535953L); // Sun Jun 11 17:25:35 NOVST
+ // 2006 - attention - activated
+ Date time4 = new Date(1150021658500L); // Sun Jun 11 17:27:38 NOVST
+ // 2006 - attention -
+ // deactivated
+ Date time5 = new Date(1150031089250L); // Sun Jun 11 20:04:49 NOVST
+ // 2006 - attention - activated
+ Date time6 = new Date(1150031111578L); // Sun Jun 11 20:05:11 NOVST
+ // 2006 - attention -
+ // deactivated
+ Date time7 = new Date(1150031111578L); // Sun Jun 11 20:05:11 NOVST
+ // 2006 - task 1 - deactivated
+
+ String task1handle = task1.getHandleIdentifier();
+ InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task1handle,
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time1, time1);
+
+ InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", "attention",
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time1, time2);
+ InteractionEvent event3 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", "attention",
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time3, time4);
+ InteractionEvent event5 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", "attention",
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time5, time6);
+ InteractionEvent event7 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task1handle,
+ "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, time7, time7);
+
+ LegacyActivityAdaptor legacyAdaptor = new LegacyActivityAdaptor();
+ TasksUiPlugin.getTaskActivityMonitor()
+ .parseInteractionEvent(legacyAdaptor.parseInteractionEvent(event1), false);
+ TasksUiPlugin.getTaskActivityMonitor()
+ .parseInteractionEvent(legacyAdaptor.parseInteractionEvent(event2), false);
+ TasksUiPlugin.getTaskActivityMonitor()
+ .parseInteractionEvent(legacyAdaptor.parseInteractionEvent(event3), false);
+ // TasksUiPlugin.getTaskListManager().parseInteractionEvent(event4);
+ TasksUiPlugin.getTaskActivityMonitor()
+ .parseInteractionEvent(legacyAdaptor.parseInteractionEvent(event5), false);
+ // TaskActivityManager.getInstance().parseInteractionEvent(event6);
+ TasksUiPlugin.getTaskActivityMonitor()
+ .parseInteractionEvent(legacyAdaptor.parseInteractionEvent(event7), false);
+ long expectedTotalTime = time6.getTime() - time5.getTime() + time4.getTime() - time3.getTime()
+ + time2.getTime() - time1.getTime();
+ assertEquals(expectedTotalTime, TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1));
+ }
+
+// DND: OLD ACTIVITY TESTS - Will be using to test activity report/view
+// public void testInterleavedActivation() {
+//
+// AbstractTask task1 = new LocalTask("task 1", "Task 1");
+// TasksUiPlugin.getTaskList().addTask(task1);
+//
+// ScheduledTaskContainer activityThisWeek = TasksUiPlugin.getTaskListManager().getActivityThisWeek();
+// assertNotNull(activityThisWeek);
+// assertEquals(0, activityThisWeek.getChildren().size());
+//
+// Calendar taskActivationStart = GregorianCalendar.getInstance();
+// taskActivationStart.add(Calendar.MILLISECOND, 15);
+// Calendar taskActivationStop = GregorianCalendar.getInstance();
+// taskActivationStop.add(Calendar.MILLISECOND, 25);
+//
+// Calendar inactivityStart1 = GregorianCalendar.getInstance();
+// inactivityStart1.add(Calendar.MILLISECOND, 5);
+// Calendar inactivityStop1 = GregorianCalendar.getInstance();
+// inactivityStop1.add(Calendar.MILLISECOND, 10);
+//
+// Calendar inactivityStart2 = GregorianCalendar.getInstance();
+// inactivityStart2.add(Calendar.MILLISECOND, 18);
+// Calendar inactivityStop2 = GregorianCalendar.getInstance();
+// inactivityStop2.add(Calendar.MILLISECOND, 25);
+//
+// InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, taskActivationStart.getTime(),
+// taskActivationStart.getTime());
+// InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, taskActivationStop.getTime(),
+// taskActivationStop.getTime());
+//
+// InteractionEvent inactivityEvent1 = new InteractionEvent(InteractionEvent.Kind.COMMAND, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, inactivityStart1.getTime(),
+// inactivityStop1.getTime());
+// InteractionEvent inactivityEvent2 = new InteractionEvent(InteractionEvent.Kind.COMMAND, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, inactivityStart2.getTime(),
+// inactivityStop2.getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(inactivityEvent1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(inactivityEvent2);
+// assertEquals(1, activityThisWeek.getChildren().size());
+//
+// // long expectedTotalTime = taskActivationStop.getTimeInMillis() -
+// // taskActivationStart.getTimeInMillis();
+// long expectedTotalTime = 0;
+// assertEquals(expectedTotalTime, activityThisWeek.getTotalElapsed());
+// assertEquals(expectedTotalTime, activityThisWeek.getElapsed(new ScheduledTaskDelegate(activityThisWeek, task1,
+// null, null)));
+// }
+//
+// public void testInterleavedActivation2() {
+//
+// AbstractTask task1 = new LocalTask("task 1", "Task 1");
+// TasksUiPlugin.getTaskList().addTask(task1);
+//
+// ScheduledTaskContainer activityThisWeek = TasksUiPlugin.getTaskListManager().getActivityThisWeek();
+// assertNotNull(activityThisWeek);
+// assertEquals(0, activityThisWeek.getChildren().size());
+//
+// Calendar taskActivationStart = GregorianCalendar.getInstance();
+// taskActivationStart.add(Calendar.MILLISECOND, 10);
+// Calendar taskActivationStop = GregorianCalendar.getInstance();
+// taskActivationStop.add(Calendar.MILLISECOND, 25);
+//
+// Calendar inactivityStart = GregorianCalendar.getInstance();
+// inactivityStart.add(Calendar.MILLISECOND, 15);
+// Calendar inactivityStop = GregorianCalendar.getInstance();
+// inactivityStop.add(Calendar.MILLISECOND, 20);
+//
+// InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, taskActivationStart.getTime(),
+// taskActivationStart.getTime());
+// InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, taskActivationStop.getTime(),
+// taskActivationStop.getTime());
+//
+// InteractionEvent inactivityEvent1 = new InteractionEvent(InteractionEvent.Kind.COMMAND, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ADDED, 2f, inactivityStart.getTime(),
+// inactivityStop.getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(inactivityEvent1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(inactivityEvent1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+//
+// assertEquals(1, activityThisWeek.getChildren().size());
+//
+// long expectedTotalTime = 2 * (inactivityStart.getTimeInMillis() - taskActivationStart.getTimeInMillis());
+// assertEquals(expectedTotalTime, activityThisWeek.getTotalElapsed());
+// assertEquals(expectedTotalTime, activityThisWeek.getElapsed(new ScheduledTaskDelegate(activityThisWeek, task1,
+// null, null)));
+// }
+//
+//
+// /**
+// * Some 'attention' events when all tasks are inactive
+// *
+// * @author Yuri Baburov (burchik at gmail.com)
+// */
+// public void testTaskListManagerActivity2() {
+// AbstractTask task1 = new LocalTask("task 1", "Task 1");
+// TasksUiPlugin.getTaskList().addTask(task1);
+// ScheduledTaskContainer thisWeekActivity = TasksUiPlugin.getTaskListManager().getActivityThisWeek();
+// assertNotNull(thisWeekActivity);
+// assertEquals(0, thisWeekActivity.getChildren().size());
+// assertEquals(0, thisWeekActivity.getTotalElapsed());
+// thisWeekActivity.getStart().setTimeInMillis(1149490800000L); // Start
+// // of
+// // the
+// // week
+// // Jun 5
+// // 2006
+// // - Jun
+// // 11
+// // 2006,
+// // NOVST
+// thisWeekActivity.getEnd().setTimeInMillis(1150095600000L); // End of
+// // the week
+//
+// Date time1 = new Date(1149911820812L); // Sat Jun 10 10:57:00 NOVST
+// // 2006 - task 1 - activated
+// Date time2 = new Date(1149911820812L); // Sat Jun 10 10:57:00 NOVST
+// // 2006 - task 1 - deactivated
+// Date time3 = new Date(1149911840812L); // Sat Jun 10 10:57:20 NOVST
+// // 2006 - attention -
+// // deactivated
+// Date time4 = new Date(1149911941765L); // Sat Jun 10 10:59:01 NOVST
+// // 2006 - attention - activated
+// Date time5 = new Date(1149911948953L); // Sat Jun 10 10:59:08 NOVST
+// // 2006 - task 1 - activated
+// Date time6 = new Date(1149911988781L); // Sat Jun 10 10:59:48 NOVST
+// // 2006 - task 1 - deactivated
+//
+// String task1handle = task1.getHandleIdentifier();
+// InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task1handle,
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time1, time1);
+// InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task1handle,
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, time2, time2);
+// InteractionEvent event3 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", "attention",
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, time3, time3);
+// InteractionEvent event4 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", "attention",
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time4, time4);
+// InteractionEvent event5 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task1handle,
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, time5, time5);
+// InteractionEvent event6 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task1handle,
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, time6, time6);
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event3);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event4);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event5);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event6);
+// assertEquals(1, thisWeekActivity.getChildren().size());
+// long expectedTotalTime = 0;// time6.getTime() - time5.getTime() +
+// // time2.getTime() - time1.getTime();
+// assertEquals(expectedTotalTime, thisWeekActivity.getTotalElapsed());
+// assertEquals(expectedTotalTime, TasksUiPlugin.getTaskListManager().getElapsedTime(task1));
+// assertEquals(expectedTotalTime, thisWeekActivity.getElapsed(new ScheduledTaskDelegate(thisWeekActivity, task1,
+// null, null)));
+// }
+//
+// public void testTaskListManagerActivity() {
+//
+// AbstractTask task1 = new LocalTask("task 1", "Task 1");
+// AbstractTask task2 = new LocalTask("task 2", "Task 2");
+// TasksUiPlugin.getTaskList().addTask(task1);
+// TasksUiPlugin.getTaskList().addTask(task2);
+//
+// // test this week
+// ScheduledTaskContainer thisWeekActivity = TasksUiPlugin.getTaskListManager().getActivityThisWeek();
+// assertNotNull(thisWeekActivity);
+// assertEquals(0, thisWeekActivity.getChildren().size());
+// assertEquals(0, thisWeekActivity.getTotalElapsed());
+// Calendar thisWeekCalendarStart = GregorianCalendar.getInstance();
+// thisWeekCalendarStart.setTime(thisWeekActivity.getStart().getTime());
+// Calendar thisWeekCalendarStop = GregorianCalendar.getInstance();
+// thisWeekCalendarStop.setTime(thisWeekActivity.getStart().getTime());
+// thisWeekCalendarStop.add(Calendar.MILLISECOND, 2);
+// assertTrue(thisWeekActivity.includes(thisWeekCalendarStart));
+//
+// InteractionEvent event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, thisWeekCalendarStart.getTime(),
+// thisWeekCalendarStart.getTime());
+// InteractionEvent event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task1.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, thisWeekCalendarStop.getTime(),
+// thisWeekCalendarStop.getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+// assertEquals(1, thisWeekActivity.getChildren().size());
+// assertEquals(0, thisWeekActivity.getTotalElapsed());
+// // assertEquals(thisWeekCalendarStop.getTime().getTime() -
+// // thisWeekCalendarStart.getTime().getTime(),
+// // thisWeekActivity.getTotalElapsed());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+// assertEquals(1, thisWeekActivity.getChildren().size());
+// // assertEquals(2 * (thisWeekCalendarStop.getTime().getTime() -
+// // thisWeekCalendarStart.getTime().getTime()),
+// // thisWeekActivity.getTotalElapsed());
+// // assertEquals(2 * (thisWeekCalendarStop.getTime().getTime() -
+// // thisWeekCalendarStart.getTime().getTime()),
+// // thisWeekActivity.getElapsed(new
+// // DateRangeActivityDelegate(thisWeekActivity, task1, null, null)));
+//
+// // multiple tasks in category
+// event1 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task2.getHandleIdentifier(),
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f,
+// thisWeekCalendarStart.getTime(), thisWeekCalendarStart.getTime());
+// event2 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind", task2.getHandleIdentifier(),
+// "originId", "navigatedRelation", InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f,
+// thisWeekCalendarStop.getTime(), thisWeekCalendarStop.getTime());
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event1);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event2);
+// assertEquals(2, thisWeekActivity.getChildren().size());
+//
+// // test Past
+// ScheduledTaskContainer pastActivity = TasksUiPlugin.getTaskListManager().getActivityPast();
+// assertNotNull(pastActivity);
+// assertEquals(0, pastActivity.getChildren().size());
+//
+// InteractionEvent event3 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, pastActivity.getStart().getTime(),
+// pastActivity.getStart().getTime());
+// InteractionEvent event4 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, pastActivity.getEnd().getTime(),
+// pastActivity.getEnd().getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event3);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event4);
+// assertEquals(1, pastActivity.getChildren().size());
+//
+// // test Future
+// ScheduledTaskContainer futureActivity = TasksUiPlugin.getTaskListManager().getActivityFuture();
+// assertNotNull(futureActivity);
+// assertEquals(0, futureActivity.getChildren().size());
+//
+// InteractionEvent event5 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, futureActivity.getStart().getTime(),
+// futureActivity.getStart().getTime());
+// InteractionEvent event6 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, futureActivity.getEnd().getTime(),
+// futureActivity.getEnd().getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event5);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event6);
+// // No longer adding activity to future bins (days of week, next week, or
+// // future)
+// assertEquals(0, futureActivity.getChildren().size());
+//
+// // test Next week activity
+// ScheduledTaskContainer activityNextWeek = TasksUiPlugin.getTaskListManager().getActivityNextWeek();
+// assertNotNull(activityNextWeek);
+// assertEquals(0, activityNextWeek.getChildren().size());
+//
+// InteractionEvent event7 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, activityNextWeek.getStart().getTime(),
+// activityNextWeek.getStart().getTime());
+// InteractionEvent event8 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, activityNextWeek.getEnd().getTime(),
+// activityNextWeek.getEnd().getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event7);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event8);
+// // No longer adding activity to future bins (days of week, next week, or
+// // future)
+// assertEquals(0, activityNextWeek.getChildren().size());
+//
+// // test Previous week activity
+// ScheduledTaskContainer activityPreviousWeek = TasksUiPlugin.getTaskListManager().getActivityPrevious();
+// assertNotNull(activityPreviousWeek);
+// assertEquals(0, activityPreviousWeek.getChildren().size());
+//
+// InteractionEvent event9 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_ACTIVATED, 2f, activityPreviousWeek.getStart().getTime(),
+// activityPreviousWeek.getStart().getTime());
+// InteractionEvent event10 = new InteractionEvent(InteractionEvent.Kind.SELECTION, "structureKind",
+// task2.getHandleIdentifier(), "originId", "navigatedRelation",
+// InteractionContextManager.ACTIVITY_DELTA_DEACTIVATED, 2f, activityPreviousWeek.getEnd().getTime(),
+// activityPreviousWeek.getEnd().getTime());
+//
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event9);
+// TasksUiPlugin.getTaskListManager().parseInteractionEvent(event10);
+// assertEquals(1, activityPreviousWeek.getChildren().size());
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskAttachmentTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskAttachmentTest.java
new file mode 100644
index 0000000..b0e134b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskAttachmentTest.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.RandomAccessFile;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.tasks.core.TaskAttachment;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.CopyAttachmentToClipboardJob;
+import org.eclipse.mylyn.internal.tasks.ui.util.DownloadAttachmentJob;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.tests.connector.MockAttachmentHandler;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Test task attachment jobs.
+ *
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentTest extends TestCase {
+
+ private TaskRepositoryManager manager;
+
+ private MockRepositoryConnector connector;
+
+ private MockAttachmentHandler attachmentHandler;
+
+ private TaskRepository repository;
+
+ private ITaskAttachment attachment;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ manager = TasksUiPlugin.getRepositoryManager();
+
+ repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL);
+ manager.addRepository(repository);
+
+ attachmentHandler = new MockAttachmentHandler();
+
+ connector = new MockRepositoryConnector();
+ connector.setTaskAttachmentHandler(attachmentHandler);
+ manager.addRepositoryConnector(connector);
+
+ TaskData taskData = new TaskData(new TaskAttributeMapper(repository), MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL, "1");
+ attachment = new TaskAttachment(repository, new MockTask("1"), taskData.getRoot().createAttribute("attachment"));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ manager.removeRepository(repository, TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ public void testCopyToClipboardAction() throws Exception {
+ String expected = "attachment content";
+ attachmentHandler.setAttachmentData(expected.getBytes());
+
+ CopyAttachmentToClipboardJob job = new CopyAttachmentToClipboardJob(attachment);
+ job.schedule();
+ job.join();
+
+ Clipboard clipboard = new Clipboard(PlatformUI.getWorkbench().getDisplay());
+ assertEquals(expected, clipboard.getContents(TextTransfer.getInstance()));
+ }
+
+ public void testDownloadAttachmentJob() throws Exception {
+ File file = File.createTempFile("mylyn", null);
+ file.deleteOnExit();
+
+ String expected = "attachment\ncontent";
+ attachmentHandler.setAttachmentData(expected.getBytes());
+
+ DownloadAttachmentJob job = new DownloadAttachmentJob(attachment, file);
+ job.schedule();
+ job.join();
+
+ assertEquals(Status.OK_STATUS, job.getResult());
+
+ RandomAccessFile raf = new RandomAccessFile(file, "r");
+ byte[] data = new byte[expected.getBytes().length];
+ try {
+ raf.readFully(data);
+ } finally {
+ raf.close();
+ }
+ assertEquals(expected, new String(data));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskContainerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskContainerTest.java
new file mode 100644
index 0000000..e65783e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskContainerTest.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskContainerTest extends TestCase {
+
+ public void testGetChildren() {
+ MockTask task1 = new MockTask("1");
+ MockTask task2 = new MockTask("2");
+ MockTask task3 = new MockTask("3");
+ MockTask task4 = new MockTask("4");
+
+ task1.internalAddChild(task2);
+ task2.internalAddChild(task3);
+ task3.internalAddChild(task1);
+ task3.internalAddChild(task4);
+
+ assertTrue(task1.contains(task4.getHandleIdentifier()));
+ assertTrue(task3.contains(task4.getHandleIdentifier()));
+ assertFalse(task3.contains("abc"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataExportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataExportTest.java
new file mode 100644
index 0000000..c38bb68
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataExportTest.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.tests.support.CommonsTestUtil;
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDataSnapshotOperation;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataExportWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataExportWizardPage;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Test case for the Task Export Wizard
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten (fixes)
+ */
+public class TaskDataExportTest extends AbstractContextTest {
+
+ private TaskDataExportWizard wizard;
+
+ private TaskDataExportWizardPage wizardPage;
+
+ private File destinationDir;
+
+ private File mylynFolder;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // Create the export wizard
+ wizard = new TaskDataExportWizard();
+ wizard.addPages();
+ wizard.createPageControls(new Shell());
+ wizardPage = (TaskDataExportWizardPage) wizard.getPage("org.eclipse.mylyn.tasklist.exportPage");
+ assertNotNull(wizardPage);
+
+ // Create test export destination directory
+ mylynFolder = new File(TasksUiPlugin.getDefault().getDataDirectory());
+ destinationDir = new File(mylynFolder.getParent(), "TestDir");
+ CommonsTestUtil.deleteFolder(destinationDir);
+ destinationDir.mkdir();
+
+ // Create folder/file structure
+ File tasklist = new File(mylynFolder, "tasks.xml.zip");
+ if (!tasklist.exists()) {
+ assertTrue(tasklist.createNewFile());
+ }
+ File hidden = new File(mylynFolder, ".hidden");
+ if (!hidden.exists()) {
+ assertTrue(hidden.createNewFile());
+ }
+ File tasksandstuff = new File(mylynFolder, "tasksandstuff");
+ if (!tasksandstuff.exists()) {
+ assertTrue(tasksandstuff.mkdir());
+ }
+ File backup = new File(mylynFolder, "backup");
+ if (!backup.exists()) {
+ assertTrue(backup.mkdir());
+ }
+ File tasksFile = new File(tasksandstuff, "file1.xml.zip");
+ if (!tasksFile.exists()) {
+ assertTrue(tasksFile.createNewFile());
+ }
+
+ File tasksSubDir = new File(tasksandstuff, "sub");
+ if (!tasksSubDir.exists()) {
+ assertTrue(tasksSubDir.mkdir());
+ }
+
+ File tasksSubDirFile = new File(tasksSubDir, "file2.xml.zip");
+ if (!tasksSubDirFile.exists()) {
+ assertTrue(tasksSubDirFile.createNewFile());
+ }
+
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ wizard.dispose();
+ wizardPage.dispose();
+ CommonsTestUtil.deleteFolder(destinationDir);
+ // Create folder/file structure
+ File tasklist = new File(mylynFolder, "tasks.xml.zip");
+ tasklist.delete();
+ File hidden = new File(mylynFolder, ".hidden");
+ hidden.delete();
+ File tasks = new File(mylynFolder, "tasksandstuff");
+ File tasksSubDir = new File(tasks, "sub");
+ File backup = new File(mylynFolder, "backup");
+ CommonsTestUtil.deleteFolder(backup);
+ CommonsTestUtil.deleteFolder(tasksSubDir);
+ CommonsTestUtil.deleteFolder(tasks);
+ super.tearDown();
+ }
+
+ /**
+ * Tests the wizard when it has been asked to export all task data to a zip file.
+ */
+ public void testExportAllToZip() throws Exception {
+ // set parameters in the wizard to simulate a user setting them and clicking "Finish"
+ wizardPage.setDestinationDirectory(destinationDir.getPath());
+ wizard.performFinish();
+
+ // check that the task list file was exported
+ File[] files = destinationDir.listFiles();
+ assertEquals(1, files.length);
+ ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(files[0]));
+ try {
+ ArrayList<String> entries = new ArrayList<String>();
+ ZipEntry entry = zipInputStream.getNextEntry();
+ while (entry != null) {
+ entries.add(entry.getName());
+ entry = zipInputStream.getNextEntry();
+ }
+ assertFalse(entries.contains(".hidden"));
+ assertTrue(entries.contains("tasks.xml.zip"));
+ assertTrue(entries.contains("tasksandstuff/file1.xml.zip"));
+ assertTrue(entries.contains("tasksandstuff/sub/file2.xml.zip"));
+ assertFalse(entries.contains("backup"));
+ } finally {
+ zipInputStream.close();
+ }
+ }
+
+ public void testSnapshotWithoutContext() throws Exception {
+ final TaskDataExportOperation backupJob = new TaskDataSnapshotOperation(destinationDir.getPath(),
+ "testBackup.zip");
+ File activityFile = new File(mylynFolder, "contexts/activity.xml.zip");
+ if (activityFile.exists()) {
+ assertTrue(activityFile.delete());
+ }
+ backupJob.run(new NullProgressMonitor());
+ // check that the task list file was exported
+ File[] files = destinationDir.listFiles();
+ assertEquals(1, files.length);
+ ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(files[0]));
+ try {
+ ArrayList<String> entries = new ArrayList<String>();
+ ZipEntry entry = zipInputStream.getNextEntry();
+ while (entry != null) {
+ entries.add(entry.getName());
+ entry = zipInputStream.getNextEntry();
+ }
+ assertFalse(entries.contains(".hidden"));
+ assertTrue(entries.contains("tasks.xml.zip"));
+ assertTrue(entries.contains("repositories.xml.zip"));
+ assertFalse(entries.contains("contexts/activity.xml.zip"));
+ assertFalse(entries.contains("tasks"));
+ assertEquals(2, entries.size());
+ } finally {
+ zipInputStream.close();
+ }
+ }
+
+ public void testSnapshotWithContext() throws Exception {
+ final TaskDataExportOperation backupJob = new TaskDataSnapshotOperation(destinationDir.getPath(),
+ "testBackup.zip");
+ File activityFile = new File(mylynFolder, "contexts/activity.xml.zip");
+ if (!activityFile.exists()) {
+ assertTrue(activityFile.createNewFile());
+ }
+ backupJob.run(new NullProgressMonitor());
+ // check that the task list file was exported
+ File[] files = destinationDir.listFiles();
+ assertEquals(1, files.length);
+ ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(files[0]));
+ try {
+ ArrayList<String> entries = new ArrayList<String>();
+ ZipEntry entry = zipInputStream.getNextEntry();
+ while (entry != null) {
+ entries.add(entry.getName());
+ entry = zipInputStream.getNextEntry();
+ }
+ assertFalse(entries.contains(".hidden"));
+ assertTrue(entries.contains("tasks.xml.zip"));
+ assertTrue(entries.contains("repositories.xml.zip"));
+ assertTrue(entries.contains("contexts/activity.xml.zip"));
+ assertFalse(entries.contains("tasks"));
+ assertEquals(3, entries.size());
+ } finally {
+ zipInputStream.close();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataImportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataImportTest.java
new file mode 100644
index 0000000..90ed04c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataImportTest.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.util.Collection;
+
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Test case for the Task Import Wizard
+ *
+ * @author Rob Elves
+ */
+public class TaskDataImportTest extends AbstractContextTest {
+
+ private TaskDataImportWizard wizard = null;
+
+ private TaskDataImportWizardPage wizardPage = null;
+
+ private final String sourceZipPath = "testdata/taskdataimporttest/mylardata-2007-01-19.zip";
+
+ private File sourceZipFile = null;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ // Create the import wizard
+ wizard = new TaskDataImportWizard();
+ wizard.addPages();
+ wizard.createPageControls(new Shell());
+ wizardPage = (TaskDataImportWizardPage) wizard.getPage("org.eclipse.mylyn.tasklist.importPage");
+ assertNotNull(wizardPage);
+
+ TaskTestUtil.resetTaskListAndRepositories();
+
+ sourceZipFile = TaskTestUtil.getLocalFile(sourceZipPath);
+ assertTrue(sourceZipFile.exists());
+
+ ContextCorePlugin.getContextManager().getActivityMetaContext().reset();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ wizard.dispose();
+ wizardPage.dispose();
+ ContextCorePlugin.getContextManager().resetActivityMetaContext();
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TaskTestUtil.resetTaskList();
+ super.tearDown();
+ }
+
+ /**
+ * Tests the wizard when it has been asked to import all task data from a zip file
+ */
+ public void testImportRepositoriesZip() {
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ InteractionContext historyContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ assertNotNull(taskList);
+ assertNotNull(historyContext);
+ assertTrue(taskList.getAllTasks().size() == 0);
+ assertTrue(historyContext.getInteractionHistory().size() == 0);
+
+ wizardPage.setSource(true, sourceZipFile.getPath());
+ wizard.performFinish();
+
+ Collection<AbstractTask> tasks = taskList.getAllTasks();
+ assertEquals(2, tasks.size());
+ for (AbstractTask task : tasks) {
+ assertTrue(ContextCorePlugin.getContextManager().hasContext(task.getHandleIdentifier()));
+ }
+ historyContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ assertNotNull(historyContext);
+ assertTrue(historyContext.getInteractionHistory().size() > 0);
+ assertTrue(TasksUiPlugin.getRepositoryManager().getAllRepositories().size() > 2);
+ }
+
+ public void testImportOverwritesAllTasks() {
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ InteractionContext historyContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ assertNotNull(taskList);
+ assertNotNull(historyContext);
+ assertTrue(taskList.getAllTasks().size() == 0);
+ assertTrue(historyContext.getInteractionHistory().size() == 0);
+
+ AbstractTask task1 = new LocalTask("999", "label");
+ taskList.addTask(task1);
+ Collection<AbstractTask> tasks = taskList.getAllTasks();
+ assertEquals(1, tasks.size());
+
+ wizardPage.setSource(true, sourceZipFile.getPath());
+ wizard.performFinish();
+
+ tasks = taskList.getAllTasks();
+ assertEquals(2, tasks.size());
+ assertTrue(!taskList.getAllTasks().contains(task1));
+ for (AbstractTask task : tasks) {
+ assertTrue(ContextCorePlugin.getContextManager().hasContext(task.getHandleIdentifier()));
+ }
+ historyContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ assertNotNull(historyContext);
+ assertTrue(historyContext.getInteractionHistory().size() > 0);
+ assertTrue(TasksUiPlugin.getRepositoryManager().getAllRepositories().size() > 2);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataManagerTest.java
new file mode 100644
index 0000000..8eda908
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataManagerTest.java
@@ -0,0 +1,293 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskDataManagerTest extends TestCase {
+
+ private TaskDataManager taskDataManger;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskDataManger = TasksUiPlugin.getTaskDataManager();
+ }
+
+ public void testPutUpdatedTaskData() throws Exception {
+ TaskRepository taskRepository = TaskTestUtil.createMockRepository();
+ TaskTask task = TaskTestUtil.createMockTask("1");
+ task.setSynchronizationState(SynchronizationState.SYNCHRONIZED);
+ TaskData taskData = TaskTestUtil.createTaskData(taskRepository, "1");
+ taskDataManger.putUpdatedTaskData(task, taskData, true, null);
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ }
+
+// public void testHasIncomingDateComparison() {
+// final Stack<Date> dates = new Stack<Date>();
+// MockTask task = new MockTask(MOCCK_ID);
+// RepositoryTaskData taskData = new RepositoryTaskData(new MockAttributeFactory() {
+// private static final long serialVersionUID = 1L;
+//
+// @Override
+// public Date getDateForAttributeType(String attributeKey, String dateString) {
+// return dates.pop();
+// }
+// }, connector.getConnectorKind(), MockRepositoryConnector.REPOSITORY_URL, MOCCK_ID);
+// task.setLastReadTimeStamp("never");
+//
+// assertTrue(TasksUiPlugin.getTaskDataManager().checkHasIncoming(task, taskData));
+//
+// // strings and dates mismatch
+// dates.push(new Date(1));
+// dates.push(new Date(2));
+// taskData.setAttributeValue(RepositoryTaskAttribute.DATE_MODIFIED, "2006-06-21 15:29:39");
+// assertTrue(TasksUiPlugin.getTaskDataManager().checkHasIncoming(task, taskData));
+//
+// dates.push(null);
+// dates.push(new Date(2));
+// assertTrue(TasksUiPlugin.getTaskDataManager().checkHasIncoming(task, taskData));
+//
+// dates.push(new Date());
+// dates.push(null);
+// assertTrue(TasksUiPlugin.getTaskDataManager().checkHasIncoming(task, taskData));
+//
+// // strings mismatch but dates match
+// dates.push(new Date(1));
+// dates.push(new Date(1));
+// assertFalse(TasksUiPlugin.getTaskDataManager().checkHasIncoming(task, taskData));
+//
+// // strings match, dates should not be checked
+// task.setLastReadTimeStamp("2006-06-21 15:29:39");
+// assertFalse(TasksUiPlugin.getTaskDataManager().checkHasIncoming(task, taskData));
+// }
+
+// public void testIncomingToIncoming() {
+ /*
+ * - Synchronize task with incoming changes - Make another change using
+ * browser - Open report in tasklist (editor opens with old 'new' data
+ * and background sync occurs) - Incoming status set again on task due
+ * to 2nd occurrence of new incoming data
+ */
+
+// // Test unforced
+// AbstractTask task = primeTaskAndRepository(SynchronizationState.INCOMING, SynchronizationState.INCOMING);
+// RepositoryTaskData taskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(task.getRepositoryUrl(),
+// task.getTaskId());
+// assertEquals(DATE_STAMP_1, task.getLastReadTimeStamp());
+// assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+// assertEquals(DATE_STAMP_2, newData.getLastModified());
+// TasksUiPlugin.getTaskDataManager().saveIncoming(task, newData, false);
+// assertEquals(DATE_STAMP_1, task.getLastReadTimeStamp());
+// assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+// // TasksUiPlugin.getSynchronizationManager().setTaskRead(task, true);
+// // assertEquals(DATE_STAMP_2, task.getLastSyncDateStamp());
+// // and again...
+//
+// RepositoryTaskData taskData3 = new RepositoryTaskData(new MockAttributeFactory(), connector.getConnectorKind(),
+// MockRepositoryConnector.REPOSITORY_URL, "1");
+// taskData3.setAttributeValue(RepositoryTaskAttribute.DATE_MODIFIED, DATE_STAMP_3);
+// TasksUiPlugin.getTaskDataManager().saveIncoming(task, taskData3, false);
+// // last modified stamp not updated until user synchronizes (newdata ==
+// // olddata)
+// assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+// assertEquals(DATE_STAMP_1, task.getLastReadTimeStamp());
+// taskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(task.getRepositoryUrl(), task.getTaskId());
+// assertEquals(DATE_STAMP_3, taskData.getLastModified());
+//
+// // Should keep INCOMING state state since new data has same date samp
+// // and sych is not forced.
+// TasksUiPlugin.getTaskDataManager().saveIncoming(task, taskData3, false);
+// assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+// assertEquals(DATE_STAMP_1, task.getLastReadTimeStamp());
+// taskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(task.getRepositoryUrl(), task.getTaskId());
+// assertEquals(DATE_STAMP_3, taskData.getLastModified());
+// }
+ // public void testIncomingToSynchronizedWithVoidSyncTime() {
+ // // IF the last sync time (modified timestamp on task) is null, this can
+ // result
+ // // in the editor refresh/repoen going into an infinite loops since the
+ // task never
+ // // gets to a synchronized state if the last mod time isn't set. It is now
+ // being set
+ // // if found to be null.
+ // AbstractTask task =
+ // primeTaskAndRepository(SynchronizationState.INCOMING,
+ // SynchronizationState.SYNCHRONIZED);
+ // assertEquals(DATE_STAMP_1, task.getLastSyncDateStamp());
+ // task.setLastSyncDateStamp(null);
+ // TasksUiPlugin.getSynchronizationManager().updateOfflineState(task,
+ // newData, false);
+ // assertEquals(SynchronizationState.INCOMING, task.getSyncState());
+ // assertEquals(DATE_STAMP_1, task.getLastSyncDateStamp());
+ //
+ // TasksUiPlugin.getSynchronizationManager().updateOfflineState(task,
+ // newData, false);
+ // assertEquals(SynchronizationState.SYNCHRONIZED, task.getSyncState());
+ // assertEquals(DATE_STAMP_1, task.getLastSyncDateStamp());
+ // }
+// public void testMarkRead() {
+// AbstractTask task = primeTaskAndRepository(SynchronizationState.INCOMING, SynchronizationState.SYNCHRONIZED);
+// task.setLastReadTimeStamp(null);
+// assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+// TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+// assertEquals(DATE_STAMP_1, task.getLastReadTimeStamp());
+// assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+// }
+//
+// public void testMarkUnread() {
+// AbstractTask task = primeTaskAndRepository(SynchronizationState.SYNCHRONIZED, SynchronizationState.SYNCHRONIZED);
+// task.setLastReadTimeStamp(null);
+// assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+// TasksUiPlugin.getTaskDataManager().setTaskRead(task, false);
+// assertEquals(SynchronizationState.INCOMING, task.getSynchronizationState());
+// }
+// public void testClearOutgoing() {
+// AbstractTask task = primeTaskAndRepository(SynchronizationState.SYNCHRONIZED, SynchronizationState.SYNCHRONIZED);
+// RepositoryTaskData taskData1 = new RepositoryTaskData(new MockAttributeFactory(),
+// MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL, "1");
+// TasksUiPlugin.getTaskDataStorageManager().setNewTaskData(taskData1);
+// taskData1 = TasksUiPlugin.getTaskDataStorageManager()
+// .getEditableCopy(task.getRepositoryUrl(), task.getTaskId());
+//
+// taskData1.setNewComment("Testing");
+// Set<RepositoryTaskAttribute> edits = new HashSet<RepositoryTaskAttribute>();
+// edits.add(taskData1.getAttribute(RepositoryTaskAttribute.COMMENT_NEW));
+// TasksUiPlugin.getTaskDataStorageManager().saveEdits(task.getRepositoryUrl(), task.getTaskId(), edits);
+//
+// RepositoryTaskData editedData = TasksUiPlugin.getTaskDataStorageManager().getEditableCopy(
+// task.getRepositoryUrl(), task.getTaskId());
+// assertEquals("Testing", editedData.getNewComment());
+//
+// TasksUiPlugin.getTaskDataManager().discardOutgoing(task);
+//
+// assertTrue(task.getSynchronizationState().equals(SynchronizationState.SYNCHRONIZED));
+// RepositoryTaskData taskData = TasksUiPlugin.getTaskDataStorageManager().getEditableCopy(
+// task.getRepositoryUrl(), task.getTaskId());
+// assertEquals("", taskData.getNewComment());
+//
+// }
+//
+// public void testMarkTaskRead() {
+// // TODO reimplement
+// String repositoryUrl = "http://mylyn.eclipse.org/bugs222";
+// MockTask task1 = new MockTask(repositoryUrl, "1");
+// MockTask task2 = new MockTask(repositoryUrl, "2");
+// task1.setSynchronizationState(SynchronizationState.INCOMING);
+// task2.setSynchronizationState(SynchronizationState.INCOMING);
+// List<ITaskElement> elements = new ArrayList<ITaskElement>();
+// elements.add(task1);
+// elements.add(task2);
+// MarkTaskReadAction readAction = new MarkTaskReadAction(elements);
+// readAction.run();
+// assertEquals(SynchronizationState.SYNCHRONIZED, task1.getSynchronizationState());
+// assertEquals(SynchronizationState.SYNCHRONIZED, task2.getSynchronizationState());
+//
+// taskList.reset();
+// MockTask hit1 = new MockTask("1");
+// MockTask hit2 = new MockTask("2");
+// MockRepositoryQuery query = new MockRepositoryQuery("summary");
+// taskList.addQuery(query);
+// taskList.addTask(hit1, query);
+// taskList.addTask(hit2, query);
+//
+// elements.clear();
+// elements.add(query);
+// readAction = new MarkTaskReadAction(elements);
+// readAction.run();
+// assertEquals(2, query.getChildren().size());
+// for (ITaskElement element : query.getChildren()) {
+// if (element instanceof MockTask) {
+// MockTask mockTask = (MockTask) element;
+// assertEquals(SynchronizationState.SYNCHRONIZED, mockTask.getSynchronizationState());
+// }
+// }
+// }
+// public void testMarkUnRead() {
+ // TODO reimplement
+// String repositoryUrl = "http://mylyn.eclipse.org/bugs222";
+// MockTask task1 = new MockTask(repositoryUrl, "1");
+// MockTask task2 = new MockTask(repositoryUrl, "2");
+// assertEquals(SynchronizationState.SYNCHRONIZED, task1.getSynchronizationState());
+// assertEquals(SynchronizationState.SYNCHRONIZED, task2.getSynchronizationState());
+// List<ITaskElement> elements = new ArrayList<ITaskElement>();
+// elements.add(task1);
+// elements.add(task2);
+// MarkTaskUnreadAction unreadAction = new MarkTaskUnreadAction(elements);
+// unreadAction.run();
+// assertEquals(SynchronizationState.INCOMING, task1.getSynchronizationState());
+// assertEquals(SynchronizationState.INCOMING, task2.getSynchronizationState());
+//
+// taskList.reset();
+// MockTask hit1 = new MockTask("1");
+// MockTask hit2 = new MockTask("2");
+// MockRepositoryQuery query = new MockRepositoryQuery("summary");
+// taskList.addQuery(query);
+// taskList.addTask(hit1, query);
+// taskList.addTask(hit2, query);
+//
+// elements.clear();
+// elements.add(query);
+// MarkTaskReadAction readAction = new MarkTaskReadAction(elements);
+// readAction.run();
+// assertEquals(2, query.getChildren().size());
+// for (ITaskElement element : query.getChildren()) {
+// if (element instanceof MockTask) {
+// MockTask mockTask = (MockTask) element;
+// assertEquals(SynchronizationState.SYNCHRONIZED, mockTask.getSynchronizationState());
+// } else {
+// fail();
+// }
+// }
+//
+// unreadAction = new MarkTaskUnreadAction(elements);
+// unreadAction.run();
+// assertEquals(2, query.getChildren().size());
+// for (ITaskElement element : query.getChildren()) {
+// if (element instanceof MockTask) {
+// MockTask mockTask = (MockTask) element;
+// assertEquals(SynchronizationState.INCOMING, mockTask.getSynchronizationState());
+// } else {
+// fail();
+// }
+// }
+// }
+// public void testQueryHitsNotDropped() {
+// MockTask task1 = new MockTask("1");
+// MockTask task2 = new MockTask("2");
+// task1.setLastReadTimeStamp("today");
+// task2.setLastReadTimeStamp("today");
+// MockRepositoryQuery query = new MockRepositoryQuery("summary");
+// taskList.addQuery(query);
+// taskList.addTask(task1, query);
+// taskList.addTask(task2, query);
+// //assertEquals(0, taskList.getArchiveContainer().getChildren().size());
+// assertEquals(2, query.getChildren().size());
+// TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
+// MockRepositoryConnector.REPOSITORY_URL);
+// Set<RepositoryQuery> queries = new HashSet<RepositoryQuery>();
+// queries.add(query);
+// TasksUiInternal.synchronizeQueries(new MockRepositoryConnector(), repository, queries, null, true);
+// //assertEquals(2, taskList.getArchiveContainer().getChildren().size());
+// assertEquals(0, query.getChildren().size());
+// }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataStoreTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataStoreTest.java
new file mode 100644
index 0000000..3e41040
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDataStoreTest.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataState;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataStore;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskOperation;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+
+/**
+ * @author Robert Elves
+ * @author Steffen Pingel
+ */
+public class TaskDataStoreTest extends TestCase {
+
+ private static final String MOCK_ID = "1";
+
+ private TaskDataStore storage;
+
+ private TaskRepository taskRepository;
+
+ private File file;
+
+ private TaskData data;
+
+ private TaskDataState state;
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskRepositoryManager taskRepositoryManager = new TaskRepositoryManager();
+ storage = new TaskDataStore(taskRepositoryManager);
+ taskRepository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ file = File.createTempFile("mylyn", null);
+ file.deleteOnExit();
+
+ taskRepositoryManager.addRepositoryConnector(new MockRepositoryConnector());
+ taskRepositoryManager.addRepository(taskRepository);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ file.delete();
+ }
+
+ public void testPutAndGet() throws Exception {
+ TaskDataState state = new TaskDataState(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL, MOCK_ID);
+
+ TaskData data = new TaskData(new TaskAttributeMapper(taskRepository), MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL, MOCK_ID);
+ TaskMapper mapper = new TaskMapper(data, true);
+ mapper.getTaskData().getRoot().createAttribute("attributeKey1").setValue("attValue!");
+ mapper.setDescription("description");
+ mapper.setSummary("summary");
+ mapper.setTaskKind("task kind");
+
+ TaskData oldData = new TaskData(new TaskAttributeMapper(taskRepository),
+ MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL, MOCK_ID);
+
+ state.setRepositoryData(data);
+ state.setLastReadData(oldData);
+ state.setEditsData(null);
+
+ storage.putTaskData(file, state);
+
+ TaskDataState retrieved = storage.getTaskDataState(file);
+ assertNotNull(retrieved);
+ TaskData newTaskData = retrieved.getRepositoryData();
+ assertNotNull(newTaskData);
+ assertEquals(MockRepositoryConnector.REPOSITORY_KIND, newTaskData.getConnectorKind());
+ mapper = new TaskMapper(newTaskData);
+ assertEquals("description", mapper.getDescription());
+ assertEquals("summary", mapper.getSummary());
+ assertEquals("task kind", mapper.getTaskKind());
+ }
+
+ public void testDelete() throws Exception {
+ TaskData data = new TaskData(new TaskAttributeMapper(taskRepository), MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL, MOCK_ID);
+ TaskDataState state = new TaskDataState(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL, MOCK_ID);
+ state.setRepositoryData(data);
+ storage.putTaskData(file, state);
+ storage.deleteTaskData(file);
+ assertFalse(file.exists());
+ assertNull(storage.getTaskDataState(file));
+ }
+
+ private void setupData() {
+ data = new TaskData(new TaskAttributeMapper(taskRepository), MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL, MOCK_ID);
+ state = new TaskDataState(MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL,
+ MOCK_ID);
+ state.setRepositoryData(data);
+ }
+
+ public void testAttributes() throws Exception {
+ setupData();
+
+ TaskAttribute attribute = data.getRoot().createAttribute("testId");
+ attribute.getMetaData().setLabel("testName").setReadOnly(true);
+ attribute.putOption("Option Name 1", "Option Value 1");
+ attribute.putOption("Option Name 2", "Option Value 2");
+ attribute.addValue("Value 1");
+ attribute.addValue("Value 2");
+ attribute.addValue("Value 3");
+ attribute.getMetaData().putValue("MetaKey1", "MetaValue1");
+ attribute.getMetaData().putValue("MetaKey2", "MetaValue2");
+ attribute.getMetaData().putValue("MetaKey3", "MetaValue3");
+ attribute.getMetaData().putValue("MetaKey4", "MetaValue4");
+
+ assertData(1);
+ }
+
+ private void assertData(int attributeCount) throws CoreException {
+ storage.putTaskData(file, state);
+ state = storage.getTaskDataState(file);
+
+ assertNotNull(state);
+ assertNotNull(state.getRepositoryData());
+ assertEquals(data.getRoot().toString(), state.getRepositoryData().getRoot().toString());
+ assertEquals(attributeCount, state.getRepositoryData().getRoot().getAttributes().size());
+ }
+
+ public void testOperations() throws Exception {
+ setupData();
+
+ TaskOperation.applyTo(data.getRoot().createAttribute("op1"), "op1 id", "op1 label");
+ TaskOperation.applyTo(data.getRoot().createAttribute("op2"), "op2 id", "op2 label");
+
+ assertData(2);
+ }
+
+ public void testComments() throws Exception {
+ setupData();
+
+ TaskCommentMapper comment1 = new TaskCommentMapper();
+ comment1.setCommentId("attachmentId1");
+ TaskAttribute attr = data.getRoot().createAttribute("1");
+ comment1.applyTo(attr);
+ attr.createAttribute("attr1").setValue("attr1Name");
+
+ TaskCommentMapper comment2 = new TaskCommentMapper();
+ comment2.setCommentId("attachmentId2");
+ comment2.setCreationDate(new Date());
+ comment2.setNumber(100);
+ comment2.applyTo(data.getRoot().createAttribute("2"));
+
+ assertData(2);
+ }
+
+ public void testAttachments() throws Exception {
+ setupData();
+
+ TaskAttachmentMapper attachment1 = new TaskAttachmentMapper();
+ attachment1.setAuthor(taskRepository.createPerson("thecreator"));
+ attachment1.setDeprecated(false);
+ attachment1.setPatch(true);
+ TaskAttribute attr = data.getRoot().createAttribute("1");
+ attachment1.applyTo(attr);
+ attr.createAttribute("attr1").setValue("attr1Name");
+ attr.createAttribute("attr2").setValue("attr1Name");
+
+ TaskAttachmentMapper attachment2 = new TaskAttachmentMapper();
+ attachment2.setAuthor(taskRepository.createPerson("thecreator2"));
+ attachment2.setDeprecated(true);
+ attachment2.setPatch(false);
+ attachment2.applyTo(data.getRoot().createAttribute("2"));
+
+ assertData(2);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java
new file mode 100644
index 0000000..9d8fdf3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskDiffUtilTest.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDiffUtil;
+
+/**
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ */
+public class TaskDiffUtilTest extends TestCase {
+
+ public void testFoldSpaces() {
+ assertEquals("a b", TaskDiffUtil.foldSpaces("a b"));
+ assertEquals("", TaskDiffUtil.foldSpaces(" "));
+ assertEquals("a b c d", TaskDiffUtil.cleanCommentText("a b c d"));
+ assertEquals("b", TaskDiffUtil.cleanCommentText(" b "));
+ assertEquals("b", TaskDiffUtil.cleanCommentText(" b"));
+ }
+
+ public void testCleanComment() {
+ assertEquals("attachment: some attachment. attachment description",
+ TaskDiffUtil.cleanCommentText(("Created an attachment (id=111)\n" //
+ + "some attachment\n" //
+ + "\n" //
+ + "attachment description")));
+ assertEquals("attachment: some attachment", TaskDiffUtil.cleanCommentText(("Created an attachment (id=111)\n" //
+ + "some attachment\n" //
+ + "\n")));
+ assertEquals("some comment", TaskDiffUtil.cleanCommentText(("(In reply to comment #11)\n" //
+ + "some comment\n")));
+ assertEquals("some comment. other comment", TaskDiffUtil.cleanCommentText((" (In reply to comment #11)\n" //
+ + "some comment\n" //
+ + "\n" //
+ + " (In reply to comment #12)\n" //
+ + "other comment\n")));
+ assertEquals("some comment. other comment", TaskDiffUtil.cleanCommentText((" (In reply to comment #11)\n" //
+ + "some comment. \n" //
+ + "\n" //
+ + " (In reply to comment #12)\n" //
+ + "> loren ipsum\n" + "> loren ipsum\n" + "other comment\n")));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskExportImportTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskExportImportTest.java
new file mode 100644
index 0000000..25d2f92
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskExportImportTest.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Jevgeni Holodkov - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import org.eclipse.mylyn.context.tests.AbstractContextTest;
+
+/**
+ *
+ * @author Jevgeni Holodkov
+ */
+//FIXME fix test
+public class TaskExportImportTest extends AbstractContextTest {
+
+ public void testRewriteTestCases() {
+ }
+
+// private File destinationDir;
+//
+// @Override
+// protected void setUp() throws Exception {
+// TasksUi.getTaskActivityManager().deactivateActiveTask();
+// super.setUp();
+//
+// // Create test export destination directory
+// destinationDir = new File(TasksUiPlugin.getDefault().getDataDirectory(), "TestDir");
+// CommonsTestUtil.deleteFolder(destinationDir);
+// destinationDir.mkdir();
+// assertTrue(destinationDir.exists());
+// }
+//
+// @Override
+// protected void tearDown() throws Exception {
+// CommonsTestUtil.deleteFolder(destinationDir);
+// super.tearDown();
+// }
+//
+// public void testTaskContextExport() throws Exception {
+//
+// LocalTask task = TasksUiInternal.createNewLocalTask("Test local task");
+// TaskList taskList = TasksUiPlugin.getTaskList();
+// taskList.addTask(task, taskList.getDefaultCategory());
+// assertTrue(taskList.getAllTasks().size() > 0);
+//
+// InteractionContext mockContext = (InteractionContext) ContextCorePlugin.getContextStore().loadContext(
+// task.getHandleIdentifier());
+//
+// ContextCorePlugin.getContextManager().internalActivateContext(mockContext);
+// InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.EDIT, "structureKind", "handle", "originId");
+// mockContext.parseEvent(event);
+// ContextCore.getContextManager().deactivateContext(mockContext.getHandleIdentifier());
+//
+// assertTrue(ContextCorePlugin.getContextStore().getContextDirectory().exists());
+// ContextCorePlugin.getContextStore().saveContext(mockContext);
+// assertTrue(ContextCore.getContextManager().hasContext(task.getHandleIdentifier()));
+//
+// File outFile = new File(destinationDir + File.separator + "local-task.xml.zip");
+// TasksUiPlugin.getTaskListWriter().writeTask(task, outFile);
+// assertTrue(outFile.exists());
+//
+// // check the content of the archive
+// List<String> files = new ArrayList<String>();
+// ZipInputStream inputStream = new ZipInputStream(new FileInputStream(outFile));
+// ZipEntry entry = null;
+// while ((entry = inputStream.getNextEntry()) != null) {
+// files.add(entry.getName());
+// }
+// inputStream.close();
+//
+// assertTrue("exported file contains a file with queries", files.contains(ITasksCoreConstants.OLD_TASK_LIST_FILE));
+//
+// String handleIdentifier = mockContext.getHandleIdentifier();
+// String encoded = URLEncoder.encode(handleIdentifier, InteractionContextManager.CONTEXT_FILENAME_ENCODING);
+// String contextName = encoded + InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD;
+// assertTrue("exported file contains a file with context", files.contains(contextName));
+//
+// // reset all data
+// TaskTestUtil.resetTaskList();
+// assertTrue(taskList.getAllTasks().size() == 0);
+//
+// ContextCore.getContextManager().deleteContext(handleIdentifier);
+// assertFalse(ContextCore.getContextManager().hasContext(task.getHandleIdentifier()));
+//
+// // load data back
+// List<AbstractTask> tasks = TasksUiPlugin.getTaskListWriter().readTasks(outFile);
+// IInteractionContext loadedContext = ContextCore.getContextStore().importContext(task.getHandleIdentifier(),
+// outFile);
+//
+// // check with original one
+// assertEquals("There is 1 task loaded", 1, tasks.size());
+// assertEquals("Loaded task is correct", task, tasks.get(0));
+// assertEquals("Loaded context is correct", mockContext, loadedContext);
+//
+// // import data
+// for (AbstractTask loadedTask : tasks) {
+// taskList.addTask(loadedTask);
+// }
+// ContextCore.getContextStore().importContext(task.getHandleIdentifier(), outFile);
+//// ContextCorePlugin.getContextStore().importContext(loadedContext);
+//
+// // check that context was imported and is the same as original one
+// IInteractionContext savedContext = ContextCorePlugin.getContextStore().loadContext(task.getHandleIdentifier());
+// assertEquals("Saved context is the same as original one", mockContext, savedContext);
+// assertEquals("Saved task is the same as original one", task, taskList.getTask(task.getHandleIdentifier()));
+//
+// ContextCorePlugin.getContextManager().deactivateAllContexts();
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskKeyComparatorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskKeyComparatorTest.java
new file mode 100644
index 0000000..1e087c3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskKeyComparatorTest.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eugene Kulehsov - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskKeyComparator;
+
+/**
+ * @author Eugene Kuleshov - bug 129511
+ * @author Mik Kersten
+ */
+public class TaskKeyComparatorTest extends TestCase {
+
+ public void testPatterns() {
+ comparisonCheck("", new String[] { null, null, "" });
+ comparisonCheck(" ", new String[] { null, null, " " });
+ comparisonCheck("aa", new String[] { null, null, "aa" });
+ comparisonCheck("11", new String[] { "", "11", "" });
+ comparisonCheck("11 aa", new String[] { "", "11", " aa" });
+ comparisonCheck(" 11 aa", new String[] { null, null, " 11 aa" });
+ comparisonCheck("aa11 bb", new String[] { "aa", "11", " bb" });
+ comparisonCheck("aa-11 bb", new String[] { "aa-", "11", " bb" });
+ comparisonCheck("aa 11 bb", new String[] { null, null, "aa 11 bb" });
+ comparisonCheck("aa bb 11 cc", new String[] { null, null, "aa bb 11 cc" });
+
+ comparisonCheck("aa", "aa", 0);
+ comparisonCheck("aa", "bb", -1);
+ comparisonCheck("bb", "aa", 1);
+
+ comparisonCheck("aa11", "aa11", 0);
+ comparisonCheck("aa11", "aa12", -1);
+ comparisonCheck("aa12", "aa11", 1);
+
+ comparisonCheck("aa1", "aa11", -1);
+ comparisonCheck("aa1", "aa2", -1);
+ comparisonCheck("aa1", "aa21", -1);
+
+ comparisonCheck("aa1 aaa", "aa1 aaa", 0);
+ comparisonCheck("aa1 aaa", "aa1 bbb", -1);
+ comparisonCheck("aa1 bbb", "aa11 aaa", -1);
+ }
+
+ private void comparisonCheck(String s, String[] exptecation) {
+ String[] res = new TaskKeyComparator().split(s);
+ assertTrue("Invalid " + Arrays.asList(res) + " " + Arrays.asList(exptecation), Arrays.equals(res, exptecation));
+ }
+
+ private static final TaskKeyComparator tkc = new TaskKeyComparator();
+
+ public void comparisonCheck(String s1, String s2, int n) {
+ final String[] c1 = new String[] { null, null, s1 };
+ final String[] c2 = new String[] { null, null, s2 };
+ assertEquals(n, tkc.compare(c1, c2));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListBackupManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListBackupManagerTest.java
new file mode 100644
index 0000000..6cb74b8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListBackupManagerTest.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.commons.tests.support.CommonsTestUtil;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListBackupManagerTest extends TestCase {
+
+ private AbstractTask task1;
+
+ private TaskListBackupManager backupManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ backupManager = TasksUiPlugin.getBackupManager();
+ CommonsTestUtil.deleteFolder(new File(TasksUiPlugin.getDefault().getBackupFolderPath()));
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testAutoBackupDisabled() throws Exception {
+ backupManager.start(5);
+ Thread.sleep(1000);
+ assertEquals(0, backupManager.getBackupFiles().size());
+
+ task1 = new LocalTask("handle", "label");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ backupManager.stop();
+ backupManager.start(5);
+ Thread.sleep(1000);
+ assertEquals(1, backupManager.getBackupFiles().size());
+ }
+
+ public void testAutoBackupEnabled() throws Exception {
+ task1 = new LocalTask("handle", "label");
+ TasksUiPlugin.getTaskList().addTask(task1);
+ backupManager.backupNow(true, null);
+ assertEquals(1, backupManager.getBackupFiles().size());
+
+ // make sure a new date stamp is generated
+ Thread.sleep(1000);
+ backupManager.backupNow(true, null);
+ assertEquals(2, backupManager.getBackupFiles().size());
+
+ // test removal of old backups
+ TasksUiPlugin.getBackupManager().removeOldBackups();
+ assertEquals(1, backupManager.getBackupFiles().size());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListContentProviderTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListContentProviderTest.java
new file mode 100644
index 0000000..9dc62c7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListContentProviderTest.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Felix Schwartz - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * @author Felix Schwarz
+ */
+public class TaskListContentProviderTest extends TestCase {
+
+ private TaskListContentProvider provider;
+
+ private TaskListView view;
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TasksUiUtil.openTasksViewInActivePerspective();
+ view = TaskListView.getFromActivePerspective();
+ provider = (TaskListContentProvider) view.getViewer().getContentProvider();
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.GROUP_SUBTASKS, true);
+ view.clearFilters();
+ view.addFilter(view.getCompleteFilter());
+ taskList = TasksUiPlugin.getTaskList();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ view.clearFilters();
+ super.tearDown();
+ }
+
+ public void testHasChildren() {
+
+ AbstractTask parent = new LocalTask("parent", "parent label");
+ AbstractTask completedChild = new LocalTask("completed child", "completed child label");
+ completedChild.setCompletionDate(new Date());
+ taskList.addTask(parent);
+ taskList.addTask(completedChild, parent);
+ assertFalse(provider.hasChildren(parent));
+
+ AbstractTask incompleteChild = new LocalTask("incomplete child", "incomplete child label");
+ incompleteChild.setCompletionDate(null);
+ taskList.addTask(incompleteChild, parent);
+ assertTrue(provider.hasChildren(parent));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListDropAdapterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListDropAdapterTest.java
new file mode 100644
index 0000000..7072f40
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListDropAdapterTest.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListDropAdapter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class TaskListDropAdapterTest extends TestCase {
+
+ private TaskListDropAdapter dropAdapter;
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+
+ TreeViewer viewer = TaskListView.getFromActivePerspective().getViewer();
+ assertNotNull(viewer);
+ dropAdapter = new TaskListDropAdapter(viewer);
+ taskList = TasksUiPlugin.getTaskList();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testUrlDrop() {
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ String url = "http://eclipse.org/mylyn";
+ String title = "Mylyn Project";
+ String urlData = url + "\n" + title;
+
+ dropAdapter.performDrop(urlData);
+ Collection<ITask> tasks = taskList.getDefaultCategory().getChildren();
+ assertNotNull(tasks);
+ assertEquals(1, tasks.size());
+ assertEquals(url, tasks.iterator().next().getUrl());
+
+ // TODO: Failing due to asynchronous retrieval of title from url
+ // assertEquals(title, tasks.get(0).getDescription(false));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListExternalizationTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListExternalizationTest.java
new file mode 100644
index 0000000..0df25e2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListExternalizationTest.java
@@ -0,0 +1,384 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+
+/**
+ * @author Robert Elves
+ * @author Steffen Pingel
+ */
+public class TaskListExternalizationTest extends TestCase {
+
+ private TaskList taskList;
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, false);
+
+ TaskTestUtil.resetTaskListAndRepositories();
+
+ repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+
+ taskList = TasksUiPlugin.getTaskList();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testTaskAttributes() throws Exception {
+ AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
+ task1.setAttribute("key", "value");
+ assertEquals(1, task1.getAttributes().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ task1 = taskList.getTask(task1.getHandleIdentifier());
+ assertNotNull(task1);
+ assertEquals(1, task1.getAttributes().size());
+ assertEquals("value", task1.getAttribute("key"));
+ }
+
+ public void testTaskAttributeDelete() throws Exception {
+ AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
+ task1.setAttribute("key", "value");
+ task1.setAttribute("key", null);
+ assertEquals(0, task1.getAttributes().size());
+ assertEquals(null, task1.getAttribute("key"));
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ task1 = taskList.getTask(task1.getHandleIdentifier());
+ assertNotNull(task1);
+ assertEquals(0, task1.getAttributes().size());
+ assertEquals(null, task1.getAttribute("key"));
+ }
+
+ public void testUncategorizedTasksNotLost() throws Exception {
+ RepositoryQuery query = TaskTestUtil.createMockQuery("1");
+ taskList.addQuery(query);
+ TaskTask task = TaskTestUtil.createMockTask("1");
+ taskList.addTask(task, query);
+ taskList.addTask(task, taskList.getDefaultCategory());
+ assertTrue(query.contains(task.getHandleIdentifier()));
+ assertTrue(taskList.getDefaultCategory().contains(task.getHandleIdentifier()));
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ assertTrue(taskList.getDefaultCategory().contains(task.getHandleIdentifier()));
+ }
+
+ public void testUniqueTaskId() throws Exception {
+ LocalTask task1 = TasksUiInternal.createNewLocalTask("label");
+ taskList.addTask(task1);
+ LocalTask task2 = TasksUiInternal.createNewLocalTask("label");
+ taskList.addTask(task2);
+ assertEquals(2, taskList.getLastLocalTaskId());
+ taskList.deleteTask(task2);
+ LocalTask task3 = TasksUiInternal.createNewLocalTask("label");
+ taskList.addTask(task3);
+ assertTrue(task3.getHandleIdentifier() + " should end with 3", task3.getHandleIdentifier().endsWith("3"));
+ assertEquals(3, taskList.getLastLocalTaskId());
+ assertEquals(2, taskList.getAllTasks().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(2, taskList.getAllTasks().size());
+ assertEquals(3, taskList.getLastLocalTaskId());
+ ITask task4 = TasksUiInternal.createNewLocalTask("label");
+ assertTrue(task4.getHandleIdentifier() + " should end with 4", task4.getHandleIdentifier().endsWith("4"));
+ }
+
+ public void testSingleTaskDeletion() throws Exception {
+ TaskTask task = TaskTestUtil.createMockTask("1");
+ taskList.addTask(task, taskList.getUnmatchedContainer(LocalRepositoryConnector.REPOSITORY_URL));
+ assertEquals(1, taskList.getAllTasks().size());
+ taskList.deleteTask(task);
+ assertEquals(0, taskList.getAllTasks().size());
+ taskList.addTask(task, taskList.getUnmatchedContainer(LocalRepositoryConnector.REPOSITORY_URL));
+ assertEquals(1, taskList.getAllTasks().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, taskList.getAllTasks().size());
+
+ taskList.deleteTask(task);
+ assertEquals(0, taskList.getAllTasks().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(0, taskList.getAllTasks().size());
+ }
+
+ public void testCategoryPersistance() throws Exception {
+ TaskTask task = TaskTestUtil.createMockTask("1");
+ TaskCategory category = new TaskCategory("cat");
+ taskList.addCategory(category);
+ taskList.addTask(task, category);
+ assertNotNull(taskList);
+ assertEquals(2, taskList.getCategories().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals("" + taskList.getCategories(), 2, taskList.getCategories().size());
+ assertEquals(1, taskList.getAllTasks().size());
+ }
+
+ public void testCreate() throws Exception {
+ TaskTask repositoryTask = TaskTestUtil.createMockTask("1");
+ taskList.addTask(repositoryTask, taskList.getDefaultCategory());
+ assertEquals(1, taskList.getDefaultCategory().getChildren().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, taskList.getAllTasks().size());
+ }
+
+ public void testCreateAndMove() throws Exception {
+ TaskTask repositoryTask = TaskTestUtil.createMockTask("1");
+ taskList.addTask(repositoryTask);
+ assertEquals(1, taskList.getAllTasks().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, taskList.getAllTasks().size());
+ assertEquals(1, taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).getChildren().size());
+ }
+
+ public void testArchiveRepositoryTaskExternalization() throws Exception {
+ TaskTask repositoryTask = TaskTestUtil.createMockTask("1");
+ taskList.addTask(repositoryTask);
+ assertEquals(1, taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).getChildren().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL).getChildren().size());
+ }
+
+ public void testRepositoryTasksAndCategoriesMultiRead() throws Exception {
+ TaskCategory cat1 = new TaskCategory("Category 1");
+ taskList.addCategory(cat1);
+
+ TaskTask reportInCat1 = TaskTestUtil.createMockTask("123");
+ taskList.addTask(reportInCat1, cat1);
+ assertEquals(cat1, TaskCategory.getParentTaskCategory(reportInCat1));
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ // read once
+ Set<AbstractTaskCategory> readCats = taskList.getTaskCategories();
+ assertTrue(taskList.getCategories().contains(cat1));
+ Iterator<AbstractTaskCategory> iterator = readCats.iterator();
+
+ boolean found = false;
+ while (iterator.hasNext()) {
+ ITaskContainer readCat1 = iterator.next();
+ if (cat1.equals(readCat1)) {
+ found = true;
+ assertEquals(1, readCat1.getChildren().size());
+ }
+ }
+ if (!found) {
+ fail(" Category not found afer tasklist read");
+ }
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ // read again
+ readCats = taskList.getTaskCategories();
+ assertTrue(taskList.getCategories().contains(cat1));
+
+ iterator = readCats.iterator();
+ found = false;
+ while (iterator.hasNext()) {
+ ITaskContainer readCat1 = iterator.next();
+ if (cat1.equals(readCat1)) {
+ found = true;
+ assertEquals(1, readCat1.getChildren().size());
+ }
+ }
+ if (!found) {
+ fail(" Category not found afer tasklist read");
+ }
+ }
+
+ public void testSubTaskExternalization() throws Exception {
+ Set<AbstractTask> rootTasks = new HashSet<AbstractTask>();
+ AbstractTask task1 = new LocalTask("1", "task1");
+ taskList.addTask(task1);
+ rootTasks.add(task1);
+
+ AbstractTask sub2 = new LocalTask("2", "sub 2");
+ taskList.addTask(sub2, task1);
+ assertEquals(1, task1.getChildren().size());
+ assertTrue(rootTasks.containsAll(taskList.getDefaultCategory().getChildren()));
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ // XXX: This should pass once sub tasks are handled properly
+// assertTrue(rootTasks.containsAll(taskList.getOrphanContainer(
+// LocalRepositoryConnector.REPOSITORY_URL).getChildren()));
+
+ Collection<ITask> readList = taskList.getDefaultCategory().getChildren();
+ for (ITask task : readList) {
+ if (task.equals(task1)) {
+ assertEquals(task1.getSummary(), task.getSummary());
+ assertEquals(1, ((ITaskContainer) task).getChildren().size());
+ }
+ }
+ }
+
+ public void testCreationAndExternalization() throws Exception {
+ Set<AbstractTask> rootTasks = new HashSet<AbstractTask>();
+ AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
+ rootTasks.add(task1);
+ assertEquals(1, taskList.getAllTasks().size());
+
+ AbstractTask sub1 = TasksUiInternal.createNewLocalTask("sub 1");
+ taskList.addTask(sub1, task1);
+ // default category, mock orphans, mock unsubmitted
+ int baseRootElementsCount = 3;
+ assertEquals(baseRootElementsCount, taskList.getRootElements().size());
+
+ //taskList.moveToContainer(sub1, taskList.getArchiveContainer());
+
+ AbstractTask task2 = TasksUiInternal.createNewLocalTask("task 2");
+ rootTasks.add(task2);
+ assertEquals(3, taskList.getAllTasks().size());
+
+ Set<TaskCategory> categories = new HashSet<TaskCategory>();
+ Set<AbstractTask> cat1Contents = new HashSet<AbstractTask>();
+ TaskCategory cat1 = new TaskCategory("Category 1");
+ taskList.addCategory(cat1);
+ categories.add(cat1);
+ assertEquals(baseRootElementsCount + 1, taskList.getRootElements().size());
+
+ AbstractTask task3 = TasksUiInternal.createNewLocalTask("task 3");
+ taskList.addTask(task3, cat1);
+ cat1Contents.add(task3);
+ assertEquals(4, taskList.getAllTasks().size());
+ assertEquals(cat1, TaskCategory.getParentTaskCategory(task3));
+ AbstractTask sub2 = TasksUiInternal.createNewLocalTask("sub 2");
+ assertEquals(5, taskList.getAllTasks().size());
+ taskList.addTask(sub2, task3);
+ //taskList.moveToContainer(sub2, taskList.getArchiveContainer());
+
+ AbstractTask task4 = TasksUiInternal.createNewLocalTask("task 4");
+ taskList.addTask(task4, cat1);
+ cat1Contents.add(task4);
+ assertEquals(6, taskList.getAllTasks().size());
+
+ TaskTask reportInCat1 = TaskTestUtil.createMockTask("123");
+ taskList.addTask(reportInCat1, cat1);
+ assertEquals(cat1, TaskCategory.getParentTaskCategory(reportInCat1));
+ cat1Contents.add(reportInCat1);
+ assertEquals(7, taskList.getAllTasks().size());
+
+ assertEquals(baseRootElementsCount + 1, taskList.getRootElements().size());
+
+ TaskTestUtil.saveAndReadTasklist();
+
+ Collection<ITask> readList = taskList.getDefaultCategory().getChildren();
+ for (ITask task : readList) {
+ if (task.equals(task1)) {
+ assertEquals(task1.getSummary(), task.getSummary());
+ assertEquals(1, ((AbstractTaskContainer) task).getChildren().size());
+ }
+ }
+
+ Set<AbstractTaskCategory> readCats = taskList.getTaskCategories();
+ assertTrue(taskList.getCategories().contains(cat1));
+ Iterator<AbstractTaskCategory> iterator = readCats.iterator();
+ boolean found = false;
+ while (iterator.hasNext()) {
+ ITaskContainer readCat1 = iterator.next();
+ if (cat1.equals(readCat1)) {
+ found = true;
+ for (ITask task : readCat1.getChildren()) {
+ assertTrue(cat1Contents.contains(task));
+ }
+ }
+ }
+ if (!found) {
+ fail(" Category not found afer tasklist read");
+ }
+ }
+
+ public void testExternalizationOfHandlesWithDash() throws Exception {
+ AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
+ taskList.addTask(task1, taskList.getDefaultCategory());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertTrue(taskList.getDefaultCategory().getChildren().contains(task1));
+ }
+
+ /**
+ * If a task exists in a category and is a query hit it should not be removed from the category
+ *
+ * @throws Exception
+ */
+ public void testQueryRemovedTaskInCategory() throws Exception {
+ TaskTask mockTask = TaskTestUtil.createMockTask("1");
+ RepositoryQuery mockQuery = TaskTestUtil.createMockQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+ assertTrue(taskList.getDefaultCategory().isEmpty());
+ taskList.addTask(mockTask, taskList.getDefaultCategory());
+ assertEquals(1, taskList.getCategories().size());
+ assertFalse(taskList.getDefaultCategory().isEmpty());
+
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, taskList.getCategories().size());
+ assertEquals(1, taskList.getQueries().size());
+ assertFalse(taskList.getDefaultCategory().isEmpty());
+
+ taskList.deleteQuery(mockQuery);
+ TaskTestUtil.saveAndReadTasklist();
+ assertEquals(1, taskList.getCategories().size());
+ assertEquals(0, taskList.getQueries().size());
+ assertFalse(taskList.getDefaultCategory().isEmpty());
+ }
+
+ /**
+ * New local tasks should automatically be created in the Local orphaned folder.
+ */
+ public void testAddLocalTask() {
+ Set<ITask> tasks = taskList.getTasks(LocalRepositoryConnector.REPOSITORY_URL);
+ assertTrue(tasks.isEmpty());
+ ITask localTask = TasksUiInternal.createNewLocalTask("Task 1");
+ assertNotNull(localTask);
+ assertEquals(1, ((AbstractTask) localTask).getParentContainers().size());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListPresentationTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListPresentationTest.java
new file mode 100644
index 0000000..d3034d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListPresentationTest.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListPresentationTest extends TestCase {
+
+ public void testDefaultPresentations() {
+
+ List<AbstractTaskListPresentation> presentations = TaskListView.getPresentations();
+ // depends on whether Sandbox is running
+ assertTrue(presentations.size() == 2 || presentations.size() == 7);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListSaveManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListSaveManagerTest.java
new file mode 100644
index 0000000..bfded4a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListSaveManagerTest.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListSaveManagerTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testRemovalOfSnapshots() throws IOException {
+ String backupPath = TasksUiPlugin.getDefault().getBackupFolderPath();
+ File backupFolder = new File(backupPath);
+ if (!backupFolder.exists()) {
+ backupFolder.mkdir();
+ }
+
+ Calendar time = TaskActivityUtil.getCalendar();
+
+ File thisHour = createFile(backupFolder, time);
+ time.add(Calendar.MILLISECOND, -1000);
+ File thisHourEarlier = createFile(backupFolder, time);
+
+ TaskActivityUtil.snapStartOfHour(time);
+ time.add(Calendar.HOUR_OF_DAY, -1);
+ time.add(Calendar.MILLISECOND, -3000);
+ File previousHour = createFile(backupFolder, time);
+
+ time.add(Calendar.MILLISECOND, -3000);
+ File previousHour2 = createFile(backupFolder, time);
+
+ time.add(Calendar.DAY_OF_YEAR, -1);
+ File previousDay = createFile(backupFolder, time);
+
+ time.add(Calendar.HOUR_OF_DAY, -1);
+ File previousDay2 = createFile(backupFolder, time);
+
+ time.add(Calendar.DAY_OF_YEAR, -3);
+ File previousDay3 = createFile(backupFolder, time);
+
+ time.add(Calendar.HOUR_OF_DAY, -1);
+ File previousDay4 = createFile(backupFolder, time);
+
+ time.add(Calendar.MILLISECOND, -4000);
+ File previousDay5 = createFile(backupFolder, time);
+
+ TasksUiPlugin.getBackupManager().removeOldBackups();
+ assertTrue(thisHour.exists());
+ assertFalse(thisHourEarlier.exists());
+ assertTrue(previousHour.exists());
+ assertFalse(previousHour2.exists());
+ assertTrue(previousDay.exists());
+ assertFalse(previousDay2.exists());
+ assertTrue(previousDay3.exists());
+ assertFalse(previousDay4.exists());
+ assertFalse(previousDay5.exists());
+ }
+
+ public void testAddTaskDuringSave() {
+ // add task
+ // save
+ // try to add task during save
+ }
+
+ // test cancellation
+
+ private File createFile(File backupFolder, Calendar time) {
+ SimpleDateFormat format = new SimpleDateFormat(ITasksCoreConstants.FILENAME_TIMESTAMP_FORMAT, Locale.ENGLISH);
+ File newFile = new File(backupFolder, ITasksCoreConstants.OLD_PREFIX_TASKLIST + "-"
+ + format.format(time.getTime()) + ITasksCoreConstants.FILE_EXTENSION);
+ try {
+ newFile.createNewFile();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return newFile;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListSorterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListSorterTest.java
new file mode 100644
index 0000000..7312539
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListSorterTest.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * George Lindholm - improvements
+ * Frank Becker - improvements for bug 212967
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListInterestSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.XMLMemento;
+
+/**
+ * @author Mik Kersten
+ * @author George Lindholm
+ * @author Frank Becker
+ */
+public class TaskListSorterTest extends TestCase {
+
+ private static final String MEMENTO_KEY_SORT_DIRECTION = "sortDirection"; //$NON-NLS-1$
+
+ private static final String MEMENTO_KEY_SORT_INDEX = "sortIndex"; //$NON-NLS-1$
+
+ private static final String MEMENTO_KEY_SORTER = "sorter"; //$NON-NLS-1$
+
+ private static final String MEMENTO_KEY_SORTER2 = "sorter2"; //$NON-NLS-1$
+
+ public void testPreferenceMigration() throws Exception {
+ final TaskListSorter sorter = new TaskListSorter();
+ TaskListView view = new TaskListView();
+ XMLMemento memento = XMLMemento.createWriteRoot(MEMENTO_KEY_SORT_INDEX);
+ IMemento child = memento.createChild(MEMENTO_KEY_SORTER);
+ child.putInteger(MEMENTO_KEY_SORT_INDEX, 0);
+ child.putInteger(MEMENTO_KEY_SORT_DIRECTION, 1);
+ child = memento.createChild(MEMENTO_KEY_SORTER2);
+ child.putInteger(MEMENTO_KEY_SORT_INDEX, 1);
+ child.putInteger(MEMENTO_KEY_SORT_DIRECTION, -1);
+ view.migrateSorterState(sorter, memento);
+ assertEquals(SortCriterion.SortKey.PRIORITY, sorter.getComparator().getSortCriterion(0).getKey());
+ assertEquals(1, sorter.getComparator().getSortCriterion(0).getDirection());
+ assertEquals(SortCriterion.SortKey.SUMMARY, sorter.getComparator().getSortCriterion(1).getKey());
+ assertEquals(-1, sorter.getComparator().getSortCriterion(1).getDirection());
+
+ memento = XMLMemento.createWriteRoot(MEMENTO_KEY_SORT_INDEX);
+ child = memento.createChild(MEMENTO_KEY_SORTER);
+ child.putInteger(MEMENTO_KEY_SORT_INDEX, 3);
+ child.putInteger(MEMENTO_KEY_SORT_DIRECTION, -1);
+ child = memento.createChild(MEMENTO_KEY_SORTER2);
+ child.putInteger(MEMENTO_KEY_SORT_INDEX, 2);
+ child.putInteger(MEMENTO_KEY_SORT_DIRECTION, -1);
+ view.migrateSorterState(sorter, memento);
+ assertEquals(SortCriterion.SortKey.TASK_ID, sorter.getComparator().getSortCriterion(0).getKey());
+ assertEquals(-1, sorter.getComparator().getSortCriterion(0).getDirection());
+ assertEquals(SortCriterion.SortKey.DATE_CREATED, sorter.getComparator().getSortCriterion(1).getKey());
+ assertEquals(-1, sorter.getComparator().getSortCriterion(1).getDirection());
+ }
+
+ public void testSortWithError() {
+ final TaskListSorter sorter = new TaskListSorter();
+ ITask task1 = new LocalTask("1", null);
+ ITask task2 = new MockTask("local", "", "1");
+ Object[] tasks = { task1, task2 };
+ Date start = new Date();
+ task2.setCreationDate(start);
+ task1.setCreationDate(new Date(start.getTime() - 1));
+ task1.setPriority("P5");
+ task2.setPriority("P1");
+
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.TASK_ID);
+ sorter.sort(new EmptyViewer(), tasks);
+ assertEquals(task1, tasks[1]);
+ assertEquals(task2, tasks[0]);
+
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.DATE_CREATED);
+ sorter.sort(new EmptyViewer(), tasks);
+ assertEquals(task1, tasks[0]);
+ assertEquals(task2, tasks[1]);
+
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.PRIORITY);
+ sorter.sort(new EmptyViewer(), tasks);
+ assertEquals(task1, tasks[1]);
+ assertEquals(task2, tasks[0]);
+
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.SUMMARY);
+ sorter.getComparator().getSortCriterion(0).setDirection((-1));
+ sorter.sort(new EmptyViewer(), tasks);
+ assertEquals(task1, tasks[0]);
+ assertEquals(task2, tasks[1]);
+
+ }
+
+ public void testRootTaskSorting() {
+ TaskListSorter sorter = new TaskListSorter();
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.SUMMARY);
+
+ AbstractTask task = new LocalTask("1", "");
+ UncategorizedTaskContainer uncategorizedTaskContainer = new UncategorizedTaskContainer();
+ UnsubmittedTaskContainer unsubmittedTaskContainer = new UnsubmittedTaskContainer("connectorKind",
+ "repositoryUrl");
+ TaskCategory category = new TaskCategory("cat");
+ RepositoryQuery repositoryQuery = new RepositoryQuery("connectorKind", "queryName");
+ TaskGroup taskGroup = new TaskGroup("parentHandle", "summary", "groupBy");
+ UnmatchedTaskContainer unmatchedTaskContainer = new UnmatchedTaskContainer("connectorKind", "repositoryUrl");
+
+ checkToRootElements(sorter, uncategorizedTaskContainer, unsubmittedTaskContainer);
+ checkToRootElements(sorter, uncategorizedTaskContainer, category);
+ checkToRootElements(sorter, uncategorizedTaskContainer, repositoryQuery);
+ checkToRootElements(sorter, uncategorizedTaskContainer, taskGroup);
+ checkToRootElements(sorter, uncategorizedTaskContainer, unmatchedTaskContainer);
+
+ checkToRootElements(sorter, unsubmittedTaskContainer, category);
+ checkToRootElements(sorter, unsubmittedTaskContainer, repositoryQuery);
+ checkToRootElements(sorter, unsubmittedTaskContainer, taskGroup);
+ checkToRootElements(sorter, unsubmittedTaskContainer, unmatchedTaskContainer);
+
+ checkToRootElements(sorter, category, repositoryQuery);
+ checkToRootElements(sorter, category, taskGroup);
+ checkToRootElements(sorter, category, unmatchedTaskContainer);
+
+ checkToRootElements(sorter, repositoryQuery, taskGroup);
+ checkToRootElements(sorter, repositoryQuery, unmatchedTaskContainer);
+
+ checkToRootElements(sorter, taskGroup, unmatchedTaskContainer);
+
+ checkToRootElements(sorter, task, uncategorizedTaskContainer);
+ checkToRootElements(sorter, task, unsubmittedTaskContainer);
+ checkToRootElements(sorter, task, category);
+ checkToRootElements(sorter, task, repositoryQuery);
+ checkToRootElements(sorter, task, taskGroup);
+ checkToRootElements(sorter, task, unmatchedTaskContainer);
+ }
+
+ private void checkToRootElements(TaskListSorter sorter, AbstractTaskContainer e1, AbstractTaskContainer e2) {
+ assertEquals(-1, sorter.compare(null, e1, e2));
+ assertEquals(1, sorter.compare(null, e2, e1));
+ }
+
+ public class EmptyViewer extends Viewer {
+ public EmptyViewer() {
+ }
+
+ @Override
+ public Control getControl() {
+ return null;
+ }
+
+ @Override
+ public Object getInput() {
+ return null;
+ }
+
+ @Override
+ public ISelection getSelection() {
+ return null;
+ }
+
+ @Override
+ public void refresh() {
+ }
+
+ @Override
+ public void setInput(Object input) {
+ }
+
+ @Override
+ public void setSelection(ISelection selection, boolean reveal) {
+ }
+ }
+
+ public void testScheduledTaskSorting() {
+ final TaskListInterestSorter sorter = new TaskListInterestSorter();
+ MockTask task1 = new MockTask("local", "MYLN:1", "1");
+ MockTask task2 = new MockTask("local", "MYLN:2", "2");
+
+ Calendar start1 = TaskActivityUtil.getCalendar();
+ start1.add(Calendar.WEEK_OF_YEAR, -1);
+ TaskActivityUtil.snapStartOfWorkWeek(start1);
+ Calendar end1 = TaskActivityUtil.getCalendar();
+ end1.setTimeInMillis(start1.getTimeInMillis());
+ TaskActivityUtil.snapEndOfWeek(end1);
+ WeekDateRange range1 = new WeekDateRange(start1, end1);
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(task1, range1);
+
+ Calendar start2 = TaskActivityUtil.getCalendar();
+ start2.add(Calendar.HOUR_OF_DAY, -1);
+ Calendar end2 = TaskActivityUtil.getCalendar();
+ DateRange range2 = new DateRange(start2, end2);
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(task2, range2);
+
+ assertTrue(sorter.compare(new EmptyViewer(), task1, task2) < 0);
+ }
+
+ public void testSummaryOrderSorting() {
+ MockTask[] tasks = new MockTask[6];
+ tasks[0] = new MockTask("local", "4", "c");
+ tasks[1] = new MockTask("local", "1", "b");
+ tasks[2] = new MockTask("local", "11", "a");
+ tasks[3] = new MockTask("local", "11", "d");
+ tasks[4] = new MockTask("local", "3", "c");
+ tasks[5] = new MockTask("local", "5", "a");
+ Date start = new Date();
+ tasks[5].setCreationDate(start);
+ tasks[4].setCreationDate(new Date(start.getTime() - 1));
+ tasks[3].setCreationDate(new Date(start.getTime() - 2));
+ tasks[2].setCreationDate(new Date(start.getTime() - 3));
+ tasks[1].setCreationDate(new Date(start.getTime() - 4));
+ tasks[0].setCreationDate(new Date(start.getTime() - 5));
+
+ TaskListSorter sorter = new TaskListSorter();
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.SUMMARY);
+ sorter.getComparator().getSortCriterion(1).setKey(SortCriterion.SortKey.DATE_CREATED);
+ sorter.sort(new EmptyViewer(), tasks);
+
+ assertEquals("11", tasks[0].getTaskKey());
+ assertEquals("a", tasks[0].getSummary());
+ assertEquals("5", tasks[1].getTaskKey());
+ assertEquals("1", tasks[2].getTaskKey());
+ assertEquals("4", tasks[3].getTaskKey());
+ assertEquals("3", tasks[4].getTaskKey());
+ assertEquals("11", tasks[5].getTaskKey());
+ assertEquals("d", tasks[5].getSummary());
+ }
+
+ public void testModuleSummaryOrderSorting() {
+ MockTask[] tasks = new MockTask[5];
+ tasks[0] = new MockTask("local", "MYLN:4", "c");
+ tasks[1] = new MockTask("local", "MYLN:1", "b");
+ tasks[2] = new MockTask("local", "MYLN:11", "a");
+ tasks[3] = new MockTask("local", "MYLN:11", "b");
+ tasks[4] = new MockTask("local", "MYLN:5", "a");
+ Date start = new Date();
+ tasks[4].setCreationDate(start);
+ tasks[3].setCreationDate(new Date(start.getTime() - 1));
+ tasks[2].setCreationDate(new Date(start.getTime() - 2));
+ tasks[1].setCreationDate(new Date(start.getTime() - 3));
+ tasks[0].setCreationDate(new Date(start.getTime() - 4));
+
+ TaskListSorter sorter = new TaskListSorter();
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.SUMMARY);
+ sorter.getComparator().getSortCriterion(1).setKey(SortCriterion.SortKey.DATE_CREATED);
+ sorter.sort(new EmptyViewer(), tasks);
+
+ assertEquals("MYLN:11", tasks[0].getTaskKey());
+ assertEquals("a", tasks[0].getSummary());
+ assertEquals("MYLN:5", tasks[1].getTaskKey());
+ assertEquals("MYLN:1", tasks[2].getTaskKey());
+ assertEquals("MYLN:11", tasks[3].getTaskKey());
+ assertEquals("b", tasks[3].getSummary());
+ assertEquals("MYLN:4", tasks[4].getTaskKey());
+ }
+
+ public void testLocalTaskSort() {
+ final TaskListSorter sorter = new TaskListSorter();
+ ITask task1 = new LocalTask("1", "task1");
+ ITask task2 = new LocalTask("2", "task2");
+ ITask task3 = new LocalTask("3", "task3");
+ ITask[] tasks = { task1, task2, task3 };
+ Date start = new Date();
+ task1.setCreationDate(start);
+ task2.setCreationDate(new Date(start.getTime() - 1));
+ task3.setCreationDate(new Date(start.getTime() - 2));
+ sorter.getComparator().getSortCriterion(0).setKey(SortCriterion.SortKey.DATE_CREATED);
+ sorter.sort(new EmptyViewer(), tasks);
+ sorter.getComparator().getSortCriterion(0).setDirection((-1));
+ sorter.sort(new EmptyViewer(), tasks);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListTest.java
new file mode 100644
index 0000000..fedeb6c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListTest.java
@@ -0,0 +1,555 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Shawn Minto
+ */
+public class TaskListTest extends TestCase {
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskList = new TaskList();
+ }
+
+ public void testGetCategories() {
+ taskList.addCategory(new TaskCategory("a"));
+ assertEquals(2, taskList.getCategories().size());
+ }
+
+ public void testLocalSubTaskAdd() {
+ LocalTask task = new LocalTask("1", "summary");
+ LocalTask subTask = new LocalTask("2", "subTask");
+
+ taskList.addTask(task);
+ taskList.addTask(subTask, task);
+
+ assertEquals(1, task.getChildren().size());
+ assertEquals(subTask, task.getChildren().iterator().next());
+ }
+
+ public void testLocalTaskAddToSelf() {
+ LocalTask task = new LocalTask("1", "summary");
+
+ taskList.addTask(task);
+ assertFalse(taskList.addTask(task, task));
+ assertEquals(0, task.getChildren().size());
+ assertEquals(1, task.getParentContainers().size());
+ }
+
+ public void testLocalSubTaskAddCycle() {
+ LocalTask task = new LocalTask("1", "summary");
+ LocalTask subTask = new LocalTask("2", "subTask");
+
+ taskList.addTask(task);
+ taskList.addTask(subTask, task);
+ taskList.addTask(task, subTask);
+
+ assertEquals(2, taskList.getAllTasks().size());
+ assertEquals(1, taskList.getCategories().size());
+ assertEquals(1, taskList.getCategories().iterator().next().getChildren().size());
+ assertEquals(1, task.getChildren().size());
+ assertEquals(0, subTask.getChildren().size());
+ assertEquals(subTask, task.getChildren().iterator().next());
+ }
+
+ public void testLocalSubTaskAddDeepCycle() {
+ LocalTask task = new LocalTask("1", "summary");
+ LocalTask subTask1 = new LocalTask("2", "subTask");
+ LocalTask subTask2 = new LocalTask("3", "subTask");
+ LocalTask subTask3 = new LocalTask("4", "subTask");
+ LocalTask subTask4 = new LocalTask("5", "subTask");
+ LocalTask subTask5 = new LocalTask("6", "subTask");
+ LocalTask subTask6 = new LocalTask("7", "subTask");
+ LocalTask subTask7 = new LocalTask("8", "subTask");
+ LocalTask subTask8 = new LocalTask("9", "subTask");
+ LocalTask subTask9 = new LocalTask("10", "subTask");
+ LocalTask subTask10 = new LocalTask("11", "subTask");
+
+ taskList.addTask(task);
+ taskList.addTask(subTask1, task);
+ taskList.addTask(subTask2, subTask1);
+ taskList.addTask(subTask3, subTask2);
+ taskList.addTask(subTask4, subTask3);
+ taskList.addTask(subTask5, subTask4);
+ taskList.addTask(subTask6, subTask5);
+ taskList.addTask(subTask7, subTask6);
+ taskList.addTask(subTask8, subTask7);
+ taskList.addTask(subTask9, subTask8);
+ taskList.addTask(subTask10, subTask9);
+
+ taskList.addTask(task, subTask10);
+
+ assertEquals(11, taskList.getAllTasks().size());
+ assertEquals(1, taskList.getCategories().size());
+ assertEquals(1, taskList.getCategories().iterator().next().getChildren().size());
+ assertEquals(1, task.getChildren().size());
+ assertEquals(subTask1, task.getChildren().iterator().next());
+
+ assertEquals(1, subTask1.getChildren().size());
+ assertEquals(subTask2, subTask1.getChildren().iterator().next());
+
+ assertEquals(1, subTask2.getChildren().size());
+ assertEquals(subTask3, subTask2.getChildren().iterator().next());
+
+ assertEquals(1, subTask3.getChildren().size());
+ assertEquals(subTask4, subTask3.getChildren().iterator().next());
+
+ assertEquals(1, subTask4.getChildren().size());
+ assertEquals(subTask5, subTask4.getChildren().iterator().next());
+
+ assertEquals(1, subTask5.getChildren().size());
+ assertEquals(subTask6, subTask5.getChildren().iterator().next());
+
+ assertEquals(1, subTask6.getChildren().size());
+ assertEquals(subTask7, subTask6.getChildren().iterator().next());
+
+ assertEquals(1, subTask7.getChildren().size());
+ assertEquals(subTask8, subTask7.getChildren().iterator().next());
+
+ assertEquals(1, subTask8.getChildren().size());
+ assertEquals(subTask9, subTask8.getChildren().iterator().next());
+
+ assertEquals(1, subTask9.getChildren().size());
+ assertEquals(subTask10, subTask9.getChildren().iterator().next());
+
+ assertEquals(0, subTask10.getChildren().size());
+ }
+
+ public void testLocalSubTaskAddMaxSubTaskDepthDeepCycle() {
+ LocalTask task = new LocalTask("1", "summary");
+ LocalTask subTask1 = new LocalTask("2", "subTask");
+ LocalTask subTask2 = new LocalTask("3", "subTask");
+ LocalTask subTask3 = new LocalTask("4", "subTask");
+ LocalTask subTask4 = new LocalTask("5", "subTask");
+ LocalTask subTask5 = new LocalTask("6", "subTask");
+ LocalTask subTask6 = new LocalTask("7", "subTask");
+ LocalTask subTask7 = new LocalTask("8", "subTask");
+ LocalTask subTask8 = new LocalTask("9", "subTask");
+ LocalTask subTask9 = new LocalTask("10", "subTask");
+ LocalTask subTask10 = new LocalTask("11", "subTask");
+ LocalTask subTask11 = new LocalTask("12", "subTask");
+
+ taskList.addTask(task);
+ taskList.addTask(subTask1, task);
+ taskList.addTask(subTask2, subTask1);
+ taskList.addTask(subTask3, subTask2);
+ taskList.addTask(subTask4, subTask3);
+ taskList.addTask(subTask5, subTask4);
+ taskList.addTask(subTask6, subTask5);
+ taskList.addTask(subTask7, subTask6);
+ taskList.addTask(subTask8, subTask7);
+ taskList.addTask(subTask9, subTask8);
+ taskList.addTask(subTask10, subTask9);
+ taskList.addTask(subTask11, subTask10);
+
+ taskList.addTask(task, subTask11);
+
+ assertEquals(12, taskList.getAllTasks().size());
+ assertEquals(1, taskList.getCategories().size());
+ assertEquals(1, taskList.getCategories().iterator().next().getChildren().size());
+ assertEquals(1, task.getChildren().size());
+ assertEquals(subTask1, task.getChildren().iterator().next());
+
+ assertEquals(1, subTask1.getChildren().size());
+ assertEquals(subTask2, subTask1.getChildren().iterator().next());
+
+ assertEquals(1, subTask2.getChildren().size());
+ assertEquals(subTask3, subTask2.getChildren().iterator().next());
+
+ assertEquals(1, subTask3.getChildren().size());
+ assertEquals(subTask4, subTask3.getChildren().iterator().next());
+
+ assertEquals(1, subTask4.getChildren().size());
+ assertEquals(subTask5, subTask4.getChildren().iterator().next());
+
+ assertEquals(1, subTask5.getChildren().size());
+ assertEquals(subTask6, subTask5.getChildren().iterator().next());
+
+ assertEquals(1, subTask6.getChildren().size());
+ assertEquals(subTask7, subTask6.getChildren().iterator().next());
+
+ assertEquals(1, subTask7.getChildren().size());
+ assertEquals(subTask8, subTask7.getChildren().iterator().next());
+
+ assertEquals(1, subTask8.getChildren().size());
+ assertEquals(subTask9, subTask8.getChildren().iterator().next());
+
+ assertEquals(1, subTask9.getChildren().size());
+ assertEquals(subTask10, subTask9.getChildren().iterator().next());
+
+ assertEquals(1, subTask10.getChildren().size());
+ assertEquals(subTask11, subTask10.getChildren().iterator().next());
+
+ assertEquals(0, subTask11.getChildren().size());
+ }
+
+ public void testLocalSubTaskAddReallyDeepCycle() {
+ LocalTask task = new LocalTask("1", "summary");
+ LocalTask subTask1 = new LocalTask("2", "subTask");
+ LocalTask subTask2 = new LocalTask("3", "subTask");
+ LocalTask subTask3 = new LocalTask("4", "subTask");
+ LocalTask subTask4 = new LocalTask("5", "subTask");
+ LocalTask subTask5 = new LocalTask("6", "subTask");
+ LocalTask subTask6 = new LocalTask("7", "subTask");
+ LocalTask subTask7 = new LocalTask("8", "subTask");
+ LocalTask subTask8 = new LocalTask("9", "subTask");
+ LocalTask subTask9 = new LocalTask("10", "subTask");
+ LocalTask subTask10 = new LocalTask("11", "subTask");
+ LocalTask subTask11 = new LocalTask("12", "subTask");
+ LocalTask subTask12 = new LocalTask("13", "subTask");
+ LocalTask subTask13 = new LocalTask("14", "subTask");
+ LocalTask subTask14 = new LocalTask("15", "subTask");
+ LocalTask subTask15 = new LocalTask("16", "subTask");
+ LocalTask subTask16 = new LocalTask("17", "subTask");
+ LocalTask subTask17 = new LocalTask("18", "subTask");
+ LocalTask subTask18 = new LocalTask("19", "subTask");
+
+ taskList.addTask(task);
+ taskList.addTask(subTask1, task);
+ taskList.addTask(subTask2, subTask1);
+ taskList.addTask(subTask3, subTask2);
+ taskList.addTask(subTask4, subTask3);
+ taskList.addTask(subTask5, subTask4);
+ taskList.addTask(subTask6, subTask5);
+ taskList.addTask(subTask7, subTask6);
+ taskList.addTask(subTask8, subTask7);
+ taskList.addTask(subTask9, subTask8);
+ taskList.addTask(subTask10, subTask9);
+ taskList.addTask(subTask11, subTask10);
+ taskList.addTask(subTask12, subTask11);
+ taskList.addTask(subTask13, subTask12);
+ taskList.addTask(subTask14, subTask13);
+ taskList.addTask(subTask15, subTask14);
+ taskList.addTask(subTask16, subTask15);
+ taskList.addTask(subTask17, subTask16);
+ taskList.addTask(subTask18, subTask17);
+
+ taskList.addTask(task, subTask18);
+
+ assertEquals(19, taskList.getAllTasks().size());
+ assertEquals(1, taskList.getCategories().size());
+ assertEquals(1, taskList.getCategories().iterator().next().getChildren().size());
+ assertEquals(1, task.getChildren().size());
+ assertEquals(subTask1, task.getChildren().iterator().next());
+
+ assertEquals(1, subTask1.getChildren().size());
+ assertEquals(subTask2, subTask1.getChildren().iterator().next());
+
+ assertEquals(1, subTask2.getChildren().size());
+ assertEquals(subTask3, subTask2.getChildren().iterator().next());
+
+ assertEquals(1, subTask3.getChildren().size());
+ assertEquals(subTask4, subTask3.getChildren().iterator().next());
+
+ assertEquals(1, subTask4.getChildren().size());
+ assertEquals(subTask5, subTask4.getChildren().iterator().next());
+
+ assertEquals(1, subTask5.getChildren().size());
+ assertEquals(subTask6, subTask5.getChildren().iterator().next());
+
+ assertEquals(1, subTask6.getChildren().size());
+ assertEquals(subTask7, subTask6.getChildren().iterator().next());
+
+ assertEquals(1, subTask7.getChildren().size());
+ assertEquals(subTask8, subTask7.getChildren().iterator().next());
+
+ assertEquals(1, subTask8.getChildren().size());
+ assertEquals(subTask9, subTask8.getChildren().iterator().next());
+
+ assertEquals(1, subTask9.getChildren().size());
+ assertEquals(subTask10, subTask9.getChildren().iterator().next());
+
+ assertEquals(1, subTask10.getChildren().size());
+ assertEquals(subTask11, subTask10.getChildren().iterator().next());
+
+ assertEquals(1, subTask11.getChildren().size());
+ assertEquals(subTask12, subTask11.getChildren().iterator().next());
+
+ assertEquals(1, subTask11.getChildren().size());
+ assertEquals(subTask12, subTask11.getChildren().iterator().next());
+
+ assertEquals(1, subTask12.getChildren().size());
+ assertEquals(subTask13, subTask12.getChildren().iterator().next());
+
+ assertEquals(1, subTask13.getChildren().size());
+ assertEquals(subTask14, subTask13.getChildren().iterator().next());
+
+ assertEquals(1, subTask14.getChildren().size());
+ assertEquals(subTask15, subTask14.getChildren().iterator().next());
+
+ assertEquals(1, subTask15.getChildren().size());
+ assertEquals(subTask16, subTask15.getChildren().iterator().next());
+
+ assertEquals(1, subTask16.getChildren().size());
+ assertEquals(subTask17, subTask16.getChildren().iterator().next());
+
+ assertEquals(1, subTask17.getChildren().size());
+ assertEquals(subTask18, subTask17.getChildren().iterator().next());
+
+ assertEquals(0, subTask18.getChildren().size());
+ }
+
+ public void testQueryAndCategoryNameClash() {
+ TaskCategory category = new TaskCategory("TestClash");
+ taskList.addCategory(category);
+ assertTrue(taskList.getCategories().contains(category));
+ assertEquals(2, taskList.getCategories().size());
+
+ MockRepositoryQuery query = new MockRepositoryQuery("TestClash");
+ taskList.addQuery(query);
+ assertTrue(taskList.getCategories().contains(category));
+ assertEquals(2, taskList.getCategories().size());
+ }
+
+ public void testMoveToRoot() {
+ AbstractTask task1 = new LocalTask("t1", "t1");
+ taskList.addTask(task1, taskList.getUnmatchedContainer(LocalRepositoryConnector.REPOSITORY_URL));
+ assertEquals(1, taskList.getDefaultCategory().getChildren().size());
+ assertEquals(taskList.getDefaultCategory(), TaskCategory.getParentTaskCategory(task1));
+
+ TaskCategory cat1 = new TaskCategory("c1");
+ taskList.addCategory(cat1);
+
+ taskList.addTask(task1, cat1);
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ assertEquals(cat1, TaskCategory.getParentTaskCategory(task1));
+
+ taskList.addTask(task1, taskList.getUnmatchedContainer(LocalRepositoryConnector.REPOSITORY_URL));
+ assertEquals(1, taskList.getDefaultCategory().getChildren().size());
+ assertEquals(0, cat1.getChildren().size());
+ assertEquals(taskList.getDefaultCategory(), TaskCategory.getParentTaskCategory(task1));
+ }
+
+ public void testDeleteCategory() {
+ assertEquals(1, taskList.getCategories().size());
+ TaskCategory category = new TaskCategory("cat");
+ taskList.addCategory(category);
+ assertEquals(2, taskList.getCategories().size());
+ taskList.deleteCategory(category);
+ assertEquals(1, taskList.getCategories().size());
+ }
+
+ public void testDeleteCategoryMovesTasksToRoot() {
+ AbstractTask task = new MockTask("delete");
+ TaskCategory category = new TaskCategory("cat");
+ taskList.addCategory(category);
+ taskList.addTask(task, category);
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ taskList.deleteCategory(category);
+ taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testRenameCategory() {
+ TaskCategory category = new TaskCategory("handle", "cat");
+ taskList.addCategory(category);
+ assertEquals(2, taskList.getCategories().size());
+ taskList.renameContainer(category, "newDescription");
+ AbstractTaskCategory container = taskList.getContainerForHandle("handle");
+ assertNotNull(container);
+ assertEquals("newDescription", container.getSummary());
+ taskList.deleteCategory(container);
+ assertEquals(1, taskList.getCategories().size());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testDeleteCategoryAfterRename() {
+ String newDesc = "newDescription";
+ assertNotNull(taskList);
+ assertEquals(1, taskList.getCategories().size());
+ TaskCategory category = new TaskCategory("cat");
+ taskList.addCategory(category);
+ assertEquals(2, taskList.getCategories().size());
+ taskList.renameContainer(category, newDesc);
+ taskList.deleteCategory(category);
+ assertEquals(1, taskList.getCategories().size());
+ }
+
+ public void testCreateSameCategoryName() {
+ assertEquals(1, taskList.getCategories().size());
+ TaskCategory category = new TaskCategory("cat");
+ taskList.addCategory(category);
+ assertEquals(2, taskList.getCategories().size());
+ TaskCategory category2 = new TaskCategory("cat");
+ try {
+ taskList.addCategory(category2);
+ fail("expected IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ }
+ assertEquals(2, taskList.getCategories().size());
+ ITaskContainer container = taskList.getContainerForHandle("cat");
+ assertEquals(container, category);
+ }
+
+ public void testDeleteRootTask() {
+ AbstractTask task = new LocalTask("1", "label");
+ taskList.addTask(task);
+ taskList.deleteTask(task);
+ assertEquals(0, taskList.getAllTasks().size());
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ }
+
+ public void testDeleteFromCategory() {
+ assertEquals(0, taskList.getAllTasks().size());
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ //assertEquals(0, taskList.getArchiveContainer().getChildren().size());
+ assertEquals(1, taskList.getCategories().size());
+
+ AbstractTask task = new LocalTask("1", "label");
+ TaskCategory category = new TaskCategory("handleAndDescription");
+ taskList.addTask(task);
+ assertEquals(1, taskList.getDefaultCategory().getChildren().size());
+
+ taskList.addCategory(category);
+ taskList.addTask(task, category);
+ assertEquals(2, taskList.getCategories().size());
+ assertEquals(1, category.getChildren().size());
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ assertEquals(1, taskList.getAllTasks().size());
+
+ taskList.deleteTask(task);
+ assertEquals(0, taskList.getAllTasks().size());
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ assertEquals(0, category.getChildren().size());
+ }
+
+ public void testDeleteRepositoryTask() {
+ String repositoryUrl = "http://somewhere.com";
+ MockTask task = new MockTask(repositoryUrl, "1");
+ taskList.addTask(task, taskList.getDefaultCategory());
+ MockRepositoryQuery query = new MockRepositoryQuery("query");
+ taskList.addQuery(query);
+ taskList.addTask(task, query);
+ assertEquals(1, taskList.getAllTasks().size());
+ assertEquals(1, taskList.getDefaultCategory().getChildren().size());
+ taskList.deleteTask(task);
+ assertEquals(0, taskList.getAllTasks().size());
+ assertEquals(0, taskList.getDefaultCategory().getChildren().size());
+ }
+
+ public void testgetQueriesAndHitsForHandle() {
+ MockTask hit1 = new MockTask("1");
+ MockTask hit2 = new MockTask("2");
+ MockTask hit3 = new MockTask("3");
+
+ MockTask hit1twin = new MockTask("1");
+ MockTask hit2twin = new MockTask("2");
+ MockTask hit3twin = new MockTask("3");
+
+ MockRepositoryQuery query1 = new MockRepositoryQuery("query1");
+ MockRepositoryQuery query2 = new MockRepositoryQuery("query2");
+
+ taskList.addQuery(query1);
+ taskList.addQuery(query2);
+ taskList.addTask(hit1, query1);
+ taskList.addTask(hit2, query1);
+ taskList.addTask(hit3, query1);
+
+ assertEquals(3, query1.getChildren().size());
+
+ taskList.addTask(hit1twin, query2);
+ taskList.addTask(hit2twin, query2);
+ taskList.addTask(hit3twin, query2);
+
+ assertEquals(3, query2.getChildren().size());
+
+ Set<AbstractTaskContainer> queriesReturned = hit1.getParentContainers();
+ assertNotNull(queriesReturned);
+ assertEquals(2, queriesReturned.size());
+ assertTrue(queriesReturned.contains(query1));
+ assertTrue(queriesReturned.contains(query2));
+ }
+
+ public void testUpdateQueryHits() {
+ MockTask hit1 = new MockTask("1");
+ MockTask hit2 = new MockTask("2");
+ MockTask hit3 = new MockTask("3");
+
+ MockTask hit1twin = new MockTask("1");
+ MockTask hit2twin = new MockTask("2");
+ MockTask hit3twin = new MockTask("3");
+
+ MockRepositoryQuery query1 = new MockRepositoryQuery("query1");
+ taskList.addQuery(query1);
+
+ taskList.addTask(hit1, query1);
+ taskList.addTask(hit2, query1);
+ taskList.addTask(hit3, query1);
+
+ taskList.addTask(hit1twin, query1);
+ taskList.addTask(hit2twin, query1);
+ taskList.addTask(hit3twin, query1);
+
+ assertEquals(3, query1.getChildren().size());
+ for (ITask child : query1.getChildren()) {
+ taskList.removeFromContainer(query1, child);
+ }
+ assertEquals(0, query1.getChildren().size());
+ taskList.addTask(hit1, query1);
+ taskList.addTask(hit2, query1);
+ assertEquals(2, query1.getChildren().size());
+ hit1.setNotified(true);
+
+ taskList.addTask(hit1twin, query1);
+ taskList.addTask(hit2twin, query1);
+ taskList.addTask(hit3twin, query1);
+ assertEquals(3, query1.getChildren().size());
+ assertTrue(query1.getChildren().contains(hit1twin));
+ assertTrue(query1.getChildren().contains(hit2twin));
+ assertTrue(query1.getChildren().contains(hit3twin));
+ for (ITask hit : query1.getChildren()) {
+ if (hit.equals(hit1twin)) {
+ assertTrue(((AbstractTask) hit).isNotified());
+ } else {
+ assertFalse(((AbstractTask) hit).isNotified());
+ }
+ }
+ }
+
+ public void testGetRepositoryTasks() {
+ String repositoryUrl = "https://bugs.eclipse.org/bugs";
+ String bugNumber = "106939";
+ MockTask task1 = new MockTask(repositoryUrl, bugNumber);
+ taskList.addTask(task1);
+ MockTask task2 = new MockTask("https://unresolved", bugNumber);
+ taskList.addTask(task2);
+
+ assertEquals(2, taskList.getAllTasks().size());
+ Set<ITask> tasksReturned = taskList.getTasks(repositoryUrl);
+ assertNotNull(tasksReturned);
+ assertEquals(1, tasksReturned.size());
+ assertTrue(tasksReturned.contains(task1));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListUiTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListUiTest.java
new file mode 100644
index 0000000..183efe6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskListUiTest.java
@@ -0,0 +1,361 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Ken Sueda 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:
+ * Ken Sueda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Vector;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.MoveToCategoryMenuContributor;
+import org.eclipse.mylyn.internal.tasks.ui.TaskPriorityFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewCategoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * Tests TaskListView's filtering mechanism.
+ *
+ * @author Ken Sueda
+ * @author Steffen Pingel
+ */
+public class TaskListUiTest extends TestCase {
+
+ private TaskCategory cat1 = null;
+
+ private AbstractTask cat1task1 = null;
+
+ private AbstractTask cat1task2 = null;
+
+ private AbstractTask cat1task3 = null;
+
+ private AbstractTask cat1task4 = null;
+
+ private AbstractTask cat1task5 = null;
+
+ private AbstractTask cat1task1sub1 = null;
+
+ private TaskCategory cat2 = null;
+
+ private AbstractTask cat2task1 = null;
+
+ private AbstractTask cat2task2 = null;
+
+ private AbstractTask cat2task3 = null;
+
+ private AbstractTask cat2task4 = null;
+
+ private AbstractTask cat2task5 = null;
+
+ private AbstractTask cat2task1sub1 = null;
+
+ private TaskList taskList;
+
+ private final static int CHECK_COMPLETE_FILTER = 1;
+
+ private final static int CHECK_INCOMPLETE_FILTER = 2;
+
+ private final static int CHECK_PRIORITY_FILTER = 3;
+
+ @Override
+ public void setUp() throws Exception {
+ taskList = TasksUiPlugin.getTaskList();
+
+ // make sure no unmatched folders exist
+ TaskTestUtil.resetTaskListAndRepositories();
+ TasksUiPlugin.getDefault().getLocalTaskRepository();
+ TasksUiUtil.openTasksViewInActivePerspective();
+
+ cat1 = new TaskCategory("First Category");
+ taskList.addCategory(cat1);
+
+ cat1task1 = TasksUiInternal.createNewLocalTask("task 1");
+ cat1task1.setPriority(PriorityLevel.P1.toString());
+ cat1task1.setCompletionDate(new Date());
+ taskList.addTask(cat1task1, cat1);
+
+ cat1task1sub1 = TasksUiInternal.createNewLocalTask("sub task 1");
+ cat1task1sub1.setPriority(PriorityLevel.P1.toString());
+ cat1task1sub1.setCompletionDate(new Date());
+ taskList.addTask(cat1task1sub1, cat1task1);
+
+ cat1task2 = TasksUiInternal.createNewLocalTask("task 2");
+ cat1task2.setPriority(PriorityLevel.P2.toString());
+ taskList.addTask(cat1task2, cat1);
+
+ cat1task3 = TasksUiInternal.createNewLocalTask("task 3");
+ cat1task3.setPriority(PriorityLevel.P3.toString());
+ cat1task3.setCompletionDate(new Date());
+ taskList.addTask(cat1task3, cat1);
+
+ cat1task4 = TasksUiInternal.createNewLocalTask("task 4");
+ cat1task4.setPriority(PriorityLevel.P4.toString());
+ taskList.addTask(cat1task4, cat1);
+
+ cat1task5 = TasksUiInternal.createNewLocalTask("task 5");
+ cat1task5.setPriority(PriorityLevel.P5.toString());
+ cat1task5.setCompletionDate(new Date());
+ taskList.addTask(cat1task5, cat1);
+
+ assertEquals(cat1.getChildren().size(), 5);
+
+ cat2 = new TaskCategory("Second Category");
+ taskList.addCategory(cat2);
+
+ cat2task1 = TasksUiInternal.createNewLocalTask("task 1");
+ cat2task1.setPriority(PriorityLevel.P1.toString());
+ taskList.addTask(cat2task1, cat2);
+
+ cat2task1sub1 = TasksUiInternal.createNewLocalTask("sub task 1");
+ cat2task1sub1.setPriority(PriorityLevel.P1.toString());
+ taskList.addTask(cat2task1sub1, cat2task1);
+
+ cat2task2 = TasksUiInternal.createNewLocalTask("task 2");
+ cat2task2.setPriority(PriorityLevel.P2.toString());
+ cat2task2.setCompletionDate(new Date());
+ taskList.addTask(cat2task2, cat2);
+
+ cat2task3 = TasksUiInternal.createNewLocalTask("task 3");
+ cat2task3.setPriority(PriorityLevel.P3.toString());
+ taskList.addTask(cat2task3, cat2);
+
+ cat2task4 = TasksUiInternal.createNewLocalTask("task 4");
+ cat2task4.setPriority(PriorityLevel.P4.toString());
+ cat2task4.setCompletionDate(new Date());
+ taskList.addTask(cat2task4, cat2);
+
+ cat2task5 = TasksUiInternal.createNewLocalTask("task 5");
+ cat2task5.setPriority(PriorityLevel.P5.toString());
+ taskList.addTask(cat2task5, cat2);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ // clear everything
+ }
+
+ public void testUiFilter() {
+ assertNotNull(TaskListView.getFromActivePerspective());
+ TreeViewer viewer = TaskListView.getFromActivePerspective().getViewer();
+ TaskListView.getFromActivePerspective().addFilter(TaskListView.getFromActivePerspective().getCompleteFilter());
+ viewer.refresh();
+ viewer.expandAll();
+ TreeItem[] items = viewer.getTree().getItems();
+ assertTrue(checkFilter(CHECK_COMPLETE_FILTER, items));
+ TaskListView.getFromActivePerspective().removeFilter(
+ TaskListView.getFromActivePerspective().getCompleteFilter());
+
+ TaskPriorityFilter filter = TaskListView.getFromActivePerspective().getPriorityFilter();
+ filter.displayPrioritiesAbove("P2");
+ TaskListView.getFromActivePerspective().addFilter(filter);
+ viewer.refresh();
+ viewer.expandAll();
+ items = viewer.getTree().getItems();
+
+ // check priority tasks
+ assertTrue(checkFilter(CHECK_PRIORITY_FILTER, items));
+ }
+
+ /**
+ * Tests that TaskEditors remove all listeners when closed
+ */
+ // FIXME re-enable test
+ // public void testListenersRemoved() {
+// int numListenersBefore = 0;
+// int numListenersDuring = 0;
+// int numListenersAfter = 0;
+//
+// IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+// assertTrue(activePage.closeAllEditors(false));
+//
+// Set<ITaskListChangeListener> listeners = taskList.getChangeListeners();
+// numListenersBefore = listeners.size();
+//
+// TasksUiUtil.openTask(cat1task1);
+// TasksUiUtil.openTask(cat1task2);
+//
+// listeners = taskList.getChangeListeners();
+// numListenersDuring = listeners.size();
+//
+// // each editor adds a listener for the editor and planning part
+// assertEquals(numListenersDuring, numListenersBefore + 4);
+//
+// assertTrue(activePage.closeAllEditors(false));
+//
+// listeners = taskList.getChangeListeners();
+// numListenersAfter = listeners.size();
+// assertEquals(numListenersBefore, numListenersAfter);
+// }
+
+ /**
+ * Tests whether an additional NewCategory action is added to the category
+ */
+ public void testGetSubMenuManagerContainsAllCategoriesPlusNewCategory() {
+ // setup
+ MoveToCategoryMenuContributor moveToMenuContrib = new MoveToCategoryMenuContributor();
+ List<IRepositoryElement> selectedElements = new Vector<IRepositoryElement>();
+ selectedElements.add(cat1task1);
+ int numCategories = taskList.getCategories().size();
+ int numSeparators = 1;
+ // adding a separator and the New Category... action
+ int expectedNrOfSubMenuEntries = numCategories + numSeparators + 1;
+ NewCategoryAction newCatActon = new NewCategoryAction();
+
+ // execute sytem under test
+ MenuManager menuManager = moveToMenuContrib.getSubMenuManager(selectedElements);
+ IContributionItem[] items = menuManager.getItems();
+ IContributionItem item = items[menuManager.getItems().length - 1];
+
+ // +1 for separator
+ assertEquals(expectedNrOfSubMenuEntries, menuManager.getItems().length);
+
+ if (item instanceof NewCategoryAction) {
+ NewCategoryAction action = (NewCategoryAction) item;
+ assertEquals(newCatActon.getText(), action.getText());
+ }
+
+ // teardown
+ }
+
+ /**
+ * Tests visibility of SubMenuManager
+ */
+ public void testVisibilityOfSubMenuManager() {
+ //setup
+ MoveToCategoryMenuContributor moveToMenuContrib = new MoveToCategoryMenuContributor();
+ MenuManager menuManager = null;
+ List<IRepositoryElement> selectedElements = new Vector<IRepositoryElement>();
+ selectedElements.add(cat1task1);
+
+ List<IRepositoryElement> emptySelection = new Vector<IRepositoryElement>();
+
+ List<IRepositoryElement> categorySelection = new Vector<IRepositoryElement>();
+ categorySelection.add(cat1);
+
+ List<IRepositoryElement> querySelection = new Vector<IRepositoryElement>();
+ querySelection.add(new MockRepositoryQuery("query", null));
+
+ //execute system under test & assert
+ menuManager = moveToMenuContrib.getSubMenuManager(selectedElements);
+ assertTrue(menuManager.isVisible());
+
+ menuManager = null;
+ menuManager = moveToMenuContrib.getSubMenuManager(emptySelection);
+ assertFalse(menuManager.isVisible());
+
+ menuManager = null;
+ menuManager = moveToMenuContrib.getSubMenuManager(categorySelection);
+ assertFalse(menuManager.isVisible());
+
+ menuManager = null;
+ menuManager = moveToMenuContrib.getSubMenuManager(querySelection);
+ assertFalse(menuManager.isVisible());
+
+ //teardown
+ }
+
+ /**
+ * Tests that the category name is shown in the Move To Category submenu, even when they have an @ in their name
+ */
+ public void testCategoryNameIsShownInMoveToCategoryAction() {
+ String catNameWithAtBefore = "@CatName";
+ String catNameWithAtExpected = "@CatName@";
+ String catNameWithAtActual = "";
+
+ String catNameNoAtBefore = "CatName";
+ String catNameNoAtExpected = "CatName";
+ String catNameNoAtActual = "";
+
+ MoveToCategoryMenuContributor menuContrib = new MoveToCategoryMenuContributor();
+
+ catNameWithAtActual = menuContrib.handleAcceleratorKeys(catNameWithAtBefore);
+ catNameNoAtActual = menuContrib.handleAcceleratorKeys(catNameNoAtBefore);
+
+ assertEquals(catNameWithAtExpected, catNameWithAtActual);
+ assertEquals(catNameNoAtExpected, catNameNoAtActual);
+ }
+
+ public boolean checkFilter(int type, TreeItem[] items) {
+ switch (type) {
+ case CHECK_COMPLETE_FILTER:
+ return checkCompleteIncompleteFilter(items, false);
+ case CHECK_INCOMPLETE_FILTER:
+ return checkCompleteIncompleteFilter(items, true);
+ case CHECK_PRIORITY_FILTER:
+ return checkPriorityFilter(items);
+ default:
+ return false;
+ }
+ }
+
+ public boolean checkCompleteIncompleteFilter(TreeItem[] items, boolean checkComplete) {
+ assertEquals(3, items.length);
+ int count = 0;
+ for (TreeItem item : items) {
+ if (item.getData() instanceof TaskCategory) {
+ TreeItem[] sub = item.getItems();
+ for (TreeItem element : sub) {
+ assertTrue(element.getData() instanceof ITask);
+ ITask task = (ITask) element.getData();
+ if (checkComplete) {
+ assertTrue(task.isCompleted());
+ } else {
+ assertFalse(task.isCompleted());
+ }
+ count++;
+ }
+ }
+ }
+ assertTrue(count == 5);
+ return true;
+ }
+
+ public boolean checkPriorityFilter(TreeItem[] items) {
+ assertTrue(items.length == 3);
+ int p2Count = 0;
+ int p1Count = 0;
+ for (TreeItem item : items) {
+ if (item.getData() instanceof TaskCategory) {
+ TreeItem[] sub = item.getItems();
+ for (TreeItem element : sub) {
+ assertTrue(element.getData() instanceof ITask);
+ ITask task = (ITask) element.getData();
+ assertTrue(task.getPriority().equals("P2") || task.getPriority().equals("P1"));
+ if (task.getPriority().equals("P2")) {
+ p2Count++;
+ } else {
+ p1Count++;
+ }
+ }
+ }
+ }
+ assertEquals(2, p1Count);
+ assertEquals(2, p2Count);
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskMapperTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskMapperTest.java
new file mode 100644
index 0000000..1a3b501
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskMapperTest.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskMapperTest extends TestCase {
+
+ private StubTaskAttributeMapper mapper;
+
+ private TaskMapper source;
+
+ private TaskMapper target;
+
+ private TaskRepository taskRepository;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskRepository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ mapper = new StubTaskAttributeMapper(taskRepository);
+ source = new TaskMapper(new TaskData(mapper, "kind", "http://url", "1"), true);
+ target = new TaskMapper(new TaskData(mapper, "kind", "http://url", "2"), true);
+ }
+
+ public void testCloneTaskCloneCommonAttributes() {
+ source.setDescription("sourceDescription");
+ target.setDescription("");
+ // TODO 3.3 remove (bug 247595)
+ target.getTaskData().getRoot().getAttribute(TaskAttribute.DESCRIPTION).getMetaData().setReadOnly(false);
+ target.merge(source);
+ assertEquals("sourceDescription", target.getDescription());
+ assertEquals(null, target.getSummary());
+
+ source.setSummary("sourceSummary");
+ target.setSummary("");
+ // TODO 3.3 remove (bug 247595)
+ target.getTaskData().getRoot().getAttribute(TaskAttribute.SUMMARY).getMetaData().setReadOnly(false);
+ target.merge(source);
+ assertEquals("sourceSummary", target.getSummary());
+ }
+
+ public void testCloneTaskDataAttributeWithValues() {
+ source.getTaskData().getRoot().createAttribute("key1").addValue("value1");
+ target.merge(source);
+ assertEquals(null, target.getTaskData().getRoot().getAttribute("key1"));
+
+ target.getTaskData().getRoot().createAttribute("key1").addValue("value2");
+ target.merge(source);
+ assertEquals("value1", target.getTaskData().getRoot().getAttribute("key1").getValue());
+
+ TaskAttribute attribute = source.getTaskData().getRoot().createAttribute("multi");
+ attribute.addValue("v1");
+ attribute.addValue("v2");
+ target.getTaskData().getRoot().createAttribute("multi");
+ target.merge(source);
+ assertEquals("value1", target.getTaskData().getRoot().getAttribute("key1").getValue());
+ List<String> values = target.getTaskData().getRoot().getAttribute("multi").getValues();
+ assertEquals(2, values.size());
+ assertEquals("v1", values.get(0));
+ assertEquals("v2", values.get(1));
+ }
+
+ public void testCloneTaskDataAttributeWithOptions() {
+ TaskAttribute sourceAttribute = source.getTaskData().getRoot().createAttribute("key");
+ sourceAttribute.setValue("o2");
+ sourceAttribute.putOption("o1", "");
+ sourceAttribute.putOption("o2", "");
+ target.getTaskData().getRoot().createAttribute("key");
+ target.merge(source);
+ assertEquals("o2", target.getTaskData().getRoot().getAttribute("key").getValue());
+
+ // test target with options that don't contain value
+ TaskAttribute targetAttribute = target.getTaskData().getRoot().getAttribute("key");
+ targetAttribute.putOption("o3", "");
+ target.merge(source);
+ assertEquals("", target.getTaskData().getRoot().getAttribute("key").getValue());
+
+ // test target with options that contain value
+ targetAttribute.putOption("o2", "");
+ target.merge(source);
+ assertEquals("o2", target.getTaskData().getRoot().getAttribute("key").getValue());
+
+ // test multiple values
+ sourceAttribute.addValue("o3");
+ target.merge(source);
+ List<String> values = targetAttribute.getValues();
+ assertEquals(2, values.size());
+ assertEquals("o2", values.get(0));
+ assertEquals("o3", values.get(1));
+ }
+
+ public void testCloneTaskDifferentRepositoryTypesCloneCommonAttributes() {
+ target = new TaskMapper(new TaskData(mapper, "otherkind", "http://url", "2"), true);
+
+ source.setDescription("sourceDescription");
+ target.setDescription("");
+ // TODO 3.3 remove (bug 247595)
+ target.getTaskData().getRoot().getAttribute(TaskAttribute.DESCRIPTION).getMetaData().setReadOnly(false);
+ target.merge(source);
+ assertEquals("sourceDescription", target.getDescription());
+ assertEquals(null, target.getSummary());
+
+ source.setSummary("sourceSummary");
+ target.merge(source);
+ assertEquals("sourceSummary", target.getSummary());
+ }
+
+ public void testCloneTaskDifferentRepositoryTypesCloneMappedAttribues() {
+ StubTaskAttributeMapper targetMapper = new StubTaskAttributeMapper(taskRepository);
+ target = new TaskMapper(new TaskData(targetMapper, "otherkind", "http://url", "2"), true);
+
+ // key is not part of common schema
+ source.getTaskData().getRoot().createAttribute("key").setValue("source");
+ target.getTaskData().getRoot().createAttribute("key").setValue("target");
+ target.merge(source);
+ assertEquals("target", target.getTaskData().getRoot().getAttribute("key").getValue());
+
+ // map key in source factory only
+ mapper.attributeMap.put(TaskAttribute.COMPONENT, "key");
+ target.merge(source);
+ assertEquals("target", target.getTaskData().getRoot().getAttribute("key").getValue());
+
+ // map key in target factory to different key
+ targetMapper.attributeMap.put(TaskAttribute.PRODUCT, "key");
+ target.merge(source);
+ assertEquals("target", target.getTaskData().getRoot().getAttribute("key").getValue());
+
+ // map key in both factories
+ targetMapper.attributeMap.put(TaskAttribute.COMPONENT, "key");
+ target.merge(source);
+ assertEquals("source", target.getTaskData().getRoot().getAttribute("key").getValue());
+ }
+
+ public void testNoCreationOfAttributes() {
+ target = new TaskMapper(new TaskData(mapper, "otherkind", "http://url", "2"));
+ target.setDescription("abc");
+ assertNull(target.getTaskData().getRoot().getAttribute(TaskAttribute.DESCRIPTION));
+ assertEquals(0, target.getTaskData().getRoot().getAttributes().size());
+
+ target = new TaskMapper(new TaskData(mapper, "otherkind", "http://url", "2"), false);
+ target.setDescription("abc");
+ assertNull(target.getTaskData().getRoot().getAttribute(TaskAttribute.DESCRIPTION));
+ assertEquals(0, target.getTaskData().getRoot().getAttributes().size());
+ }
+
+ private class StubTaskAttributeMapper extends TaskAttributeMapper {
+
+ public StubTaskAttributeMapper(TaskRepository taskRepository) {
+ super(taskRepository);
+ }
+
+ private final Map<String, String> attributeMap = new HashMap<String, String>();
+
+ @Override
+ public String mapToRepositoryKey(TaskAttribute parent, String key) {
+ String mappedKey = attributeMap.get(key);
+ return (mappedKey != null) ? mappedKey : key;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskPlanningEditorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskPlanningEditorTest.java
new file mode 100644
index 0000000..d4e9815
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskPlanningEditorTest.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ */
+// FIXME re-enable tests
+public class TaskPlanningEditorTest extends TestCase {
+
+// private static final String MOCK_LABEL = "label";
+//
+// private static final String DESCRIPTION = "summary";
+//
+// private static final String NEW_DESCRIPTION = "new summary";
+
+ @Override
+ protected void setUp() throws Exception {
+ TasksUiPlugin.getDefault().getLocalTaskRepository();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false);
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TaskTestUtil.resetTaskList();
+ }
+
+// public void testDirtyOnEdit() {
+// LocalTask task = new LocalTask("1", MOCK_LABEL);
+// task.setSummary(DESCRIPTION);
+// TasksUiPlugin.getTaskList().addTask(task);
+// TasksUiUtil.openTask(task);
+// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+// assertNotNull(page);
+// assertEquals(TaskEditor.class, page.getActiveEditor().getClass());
+// TaskEditor taskEditor = (TaskEditor) page.getActiveEditor();
+// assertEquals(TaskPlanningEditor.class, taskEditor.getActivePageInstance().getClass());
+// TaskPlanningEditor editor = (TaskPlanningEditor) taskEditor.getActivePageInstance();
+// assertFalse(editor.isDirty());
+// editor.setNotes("notes");
+// assertTrue(editor.isDirty());
+// editor.doSave(new NullProgressMonitor());
+// assertFalse(editor.isDirty());
+// editor.setDescription(NEW_DESCRIPTION);
+// assertTrue(editor.isDirty());
+// editor.doSave(new NullProgressMonitor());
+// assertEquals(NEW_DESCRIPTION, task.getSummary());
+// assertFalse(editor.isDirty());
+// }
+//
+// public void testNotDirtyOnRename() {
+// LocalTask task = new LocalTask("1", MOCK_LABEL);
+// task.setSummary(DESCRIPTION);
+// TasksUiPlugin.getTaskList().addTask(task);
+// TasksUiUtil.openTask(task);
+// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+// assertNotNull(page);
+// assertEquals(TaskEditor.class, page.getActiveEditor().getClass());
+// TaskEditor taskEditor = (TaskEditor) page.getActiveEditor();
+// assertEquals(TaskPlanningEditor.class, taskEditor.getActivePageInstance().getClass());
+// TaskPlanningEditor editor = (TaskPlanningEditor) taskEditor.getActivePageInstance();
+// assertFalse(editor.isDirty());
+// assertEquals(DESCRIPTION, editor.getDescription());
+// task.setSummary(NEW_DESCRIPTION);
+// editor.updateTaskData(task);
+// //assertEquals(NEW_DESCRIPTION, editor.getFormTitle());
+// assertEquals(NEW_DESCRIPTION, editor.getDescription());
+// assertFalse(editor.isDirty());
+// }
+//
+// /**
+// * Test that if editor is dirty and external rename happens editor remains dirty
+// */
+// public void testRenameInDirtyState() {
+// LocalTask task = new LocalTask("1", MOCK_LABEL);
+// task.setSummary(DESCRIPTION);
+// TasksUiPlugin.getTaskList().addTask(task);
+// TasksUiUtil.openTask(task);
+// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+// assertNotNull(page);
+// assertEquals(TaskEditor.class, page.getActiveEditor().getClass());
+// TaskEditor taskEditor = (TaskEditor) page.getActiveEditor();
+// assertEquals(TaskPlanningEditor.class, taskEditor.getActivePageInstance().getClass());
+// TaskPlanningEditor editor = (TaskPlanningEditor) taskEditor.getActivePageInstance();
+// assertFalse(editor.isDirty());
+// editor.setDescription(NEW_DESCRIPTION);
+// assertTrue(editor.isDirty());
+//
+// task.setSummary(NEW_DESCRIPTION + "2");
+// editor.updateTaskData(task);
+// assertEquals(NEW_DESCRIPTION, editor.getDescription());
+// assertTrue(editor.isDirty());
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoriesExternalizerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoriesExternalizerTest.java
new file mode 100644
index 0000000..bc906a9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoriesExternalizerTest.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Erik Ramfelt - bug 168782
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoriesExternalizer;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskRepositoriesExternalizerTest extends TestCase {
+
+ private Set<TaskRepository> taskRepositories = new HashSet<TaskRepository>();
+
+ private static final String REP_TYPE = "bugzilla";
+
+ private static final String REPURL1 = "http://somewhere1";
+
+ private static final String REPURL2 = "http://somewhere2";
+
+ private static final String TIMEZONE = "test time zone";
+
+ private static final String VERSION = "test version";
+
+ private static final String ENCODING = "test encoding";
+
+ private static final String TIMESTAMP = "test time stamp";
+
+ private static final String SUFFIX = "2";
+
+ private TaskRepository repository1;
+
+ private TaskRepository repository2;
+
+ @Override
+ protected void setUp() throws Exception {
+ repository1 = new TaskRepository(REP_TYPE, REPURL1);
+ repository2 = new TaskRepository("bugzilla", REPURL2);
+
+ repository1.setTimeZoneId(TIMEZONE);
+ repository1.setVersion(VERSION);
+ repository1.setCharacterEncoding(ENCODING);
+ repository1.setSynchronizationTimeStamp(TIMESTAMP);
+ taskRepositories.add(repository1);
+
+ repository2.setTimeZoneId(TIMEZONE + SUFFIX);
+ repository2.setVersion(VERSION + SUFFIX);
+ repository2.setCharacterEncoding(ENCODING + SUFFIX);
+ repository2.setSynchronizationTimeStamp(TIMESTAMP + SUFFIX);
+ taskRepositories.add(repository2);
+ }
+
+ public void testExternalization() {
+ TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer();
+ String path = "repositories.xml";
+ File file = new File(path);
+ file.deleteOnExit();
+ externalizer.writeRepositoriesToXML(taskRepositories, file);
+ taskRepositories.clear();
+ assertEquals(0, taskRepositories.size());
+ taskRepositories = externalizer.readRepositoriesFromXML(file);
+ assertEquals(2, taskRepositories.size());
+ taskRepositories.contains(repository1);
+ taskRepositories.contains(repository2);
+ for (TaskRepository repository : taskRepositories) {
+ if (repository.getRepositoryUrl().equals(REPURL1)) {
+ assertEquals(TIMEZONE, repository.getTimeZoneId());
+ assertEquals(VERSION, repository.getVersion());
+ assertEquals(ENCODING, repository.getCharacterEncoding());
+ assertEquals(TIMESTAMP, repository.getSynchronizationTimeStamp());
+ } else if (repository.getRepositoryUrl().equals(REPURL2)) {
+ assertEquals(TIMEZONE + SUFFIX, repository.getTimeZoneId());
+ assertEquals(VERSION + SUFFIX, repository.getVersion());
+ assertEquals(ENCODING + SUFFIX, repository.getCharacterEncoding());
+ assertEquals(TIMESTAMP + SUFFIX, repository.getSynchronizationTimeStamp());
+ }
+ }
+
+ }
+
+ public void testExternalizationEmptyRepository() {
+ TaskRepositoriesExternalizer externalizer = new TaskRepositoriesExternalizer();
+ String path = "repositories.xml";
+ File file = new File(path);
+ file.deleteOnExit();
+ externalizer.writeRepositoriesToXML(taskRepositories, file);
+ taskRepositories = externalizer.readRepositoriesFromXML(file);
+ assertEquals(2, taskRepositories.size());
+ taskRepositories.clear();
+ externalizer.writeRepositoriesToXML(taskRepositories, file);
+ taskRepositories = externalizer.readRepositoriesFromXML(file);
+ assertEquals(0, taskRepositories.size());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryFilterTests.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryFilterTests.java
new file mode 100644
index 0000000..0101065
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryFilterTests.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+
+/**
+ * @author Shawn Minto
+ */
+public class TaskRepositoryFilterTests extends TestCase {
+
+ public void testCanCreateTaskFilter() {
+ ITaskRepositoryFilter canCreateTaskFilter = ITaskRepositoryFilter.CAN_CREATE_NEW_TASK;
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ MockRepositoryConnector connector = (MockRepositoryConnector) TasksUiPlugin.getConnector(MockRepositoryConnector.REPOSITORY_KIND);
+ assertFalse(canCreateTaskFilter.accept(repository, connector));
+
+ connector.setCanCreateNewTask(true);
+ assertTrue(canCreateTaskFilter.accept(repository, connector));
+
+ repository.setOffline(true);
+ assertFalse(canCreateTaskFilter.accept(repository, connector));
+
+ connector.resetDefaults();
+ }
+
+ public void testCanQueryTaskFilter() {
+ ITaskRepositoryFilter canQueryFilter = ITaskRepositoryFilter.CAN_QUERY;
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ MockRepositoryConnector connector = (MockRepositoryConnector) TasksUiPlugin.getConnector(MockRepositoryConnector.REPOSITORY_KIND);
+ assertFalse(canQueryFilter.accept(repository, connector));
+
+ repository = new TaskRepository(LocalRepositoryConnector.CONNECTOR_KIND,
+ LocalRepositoryConnector.REPOSITORY_URL);
+ AbstractRepositoryConnector localConnector = TasksUiPlugin.getConnector(LocalRepositoryConnector.CONNECTOR_KIND);
+ assertFalse(canQueryFilter.accept(repository, localConnector));
+
+ // need a second mock repo
+ connector.setCanQuery(true);
+ assertTrue(canQueryFilter.accept(repository, connector));
+
+ repository.setOffline(true);
+ assertFalse(canQueryFilter.accept(repository, connector));
+
+ connector.resetDefaults();
+ }
+
+ public void testCanCreateTaskFromKeyTaskFilter() {
+ ITaskRepositoryFilter canCreateTaskFromKeyFilter = ITaskRepositoryFilter.CAN_CREATE_TASK_FROM_KEY;
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ MockRepositoryConnector connector = (MockRepositoryConnector) TasksUiPlugin.getConnector(MockRepositoryConnector.REPOSITORY_KIND);
+ assertFalse(canCreateTaskFromKeyFilter.accept(repository, connector));
+
+ // need a second mock repo
+ connector.setCanCreateTaskFromKey(true);
+ assertTrue(canCreateTaskFromKeyFilter.accept(repository, connector));
+
+ repository.setOffline(true);
+ assertFalse(canCreateTaskFromKeyFilter.accept(repository, connector));
+ connector.resetDefaults();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java
new file mode 100644
index 0000000..47a5cfc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryManagerTest.java
@@ -0,0 +1,329 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskRepositoryManagerTest extends TestCase {
+
+ private static final String DEFAULT_KIND = MockRepositoryConnector.REPOSITORY_KIND;
+
+ private static final String DEFAULT_URL = "http://eclipse.org";
+
+ private static final String ANOTHER_URL = "http://codehaus.org";
+
+// private final String USERNAME = ".username"; //$NON-NLS-1$
+//
+// private final String PASSWORD = ".password"; //$NON-NLS-1$
+//
+// private final String AUTH_REPOSITORY = "org.eclipse.mylyn.tasklist.repositories"; //$NON-NLS-1$
+//
+// private final String AUTH_PASSWORD = AUTH_REPOSITORY + PASSWORD;
+//
+// private final String AUTH_USERNAME = AUTH_REPOSITORY + USERNAME;
+//
+// private final String AUTH_HTTP = "org.eclipse.mylyn.tasklist.repositories.httpauth"; //$NON-NLS-1$
+//
+// private final String AUTH_HTTP_PASSWORD = AUTH_HTTP + PASSWORD;
+//
+// private final String AUTH_HTTP_USERNAME = AUTH_HTTP + USERNAME;
+//
+// private final String AUTH_SCHEME = "Basic"; //$NON-NLS-1$
+//
+// private final String AUTH_REALM = ""; //$NON-NLS-1$
+
+ private TaskRepositoryManager manager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ manager = TasksUiPlugin.getRepositoryManager();
+ assertNotNull(manager);
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ if (manager != null) {
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+ }
+
+ // TODO e3.4 re-enable keystore tests
+// @SuppressWarnings("deprecation")
+// public void testsUseSecureStorage() throws Exception {
+// TaskRepository repository = new TaskRepository("bugzilla", "http://repository2/");
+// repository.setProperty(ITasksCoreConstants.PROPERTY_USE_SECURE_STORAGE, "true");
+// repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("testUserName",
+// "testPassword"), true);
+//
+// ISecurePreferences securePreferences = SecurePreferencesFactory.getDefault()
+// .node(ITasksCoreConstants.ID_PLUGIN);
+// securePreferences = securePreferences.node(EncodingUtils.encodeSlashes(repository.getUrl()));
+// assertEquals("testPassword", securePreferences.get(AUTH_PASSWORD, null));
+// assertEquals("testUserName", repository.getProperty(AUTH_USERNAME));
+// assertEquals("shouldbenull", securePreferences.get(AUTH_USERNAME, "shouldbenull"));
+// assertNull(Platform.getAuthorizationInfo(new URL(repository.getUrl()), AUTH_REALM, AUTH_SCHEME));
+// }
+//
+// @SuppressWarnings("deprecation")
+// public void testsUseKeyring() throws Exception {
+// TaskRepository repository = new TaskRepository("bugzilla", "http://repository3/");
+// repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("testUserName",
+// "testPassword"), true);
+//
+// repository.setCredentials(AuthenticationType.HTTP,
+// new AuthenticationCredentials("httpUserName", "httpPassword"), true);
+//
+// ISecurePreferences securePreferences = SecurePreferencesFactory.getDefault()
+// .node(ITasksCoreConstants.ID_PLUGIN);
+// securePreferences = securePreferences.node(EncodingUtils.encodeSlashes(repository.getUrl()));
+// assertNull(securePreferences.get(AUTH_PASSWORD, null));
+// assertNull("testUserName", repository.getProperty(AUTH_USERNAME));
+// Map map = Platform.getAuthorizationInfo(new URL(repository.getUrl()), AUTH_REALM, AUTH_SCHEME);
+// assertEquals("testUserName", map.get(AUTH_USERNAME));
+// assertEquals("testPassword", map.get(AUTH_PASSWORD));
+// assertEquals("httpUserName", map.get(AUTH_HTTP_USERNAME));
+// assertEquals("httpPassword", map.get(AUTH_HTTP_PASSWORD));
+// }
+
+// public void testMigrationToSecureStorage() throws Exception {
+// TaskRepository repository1 = new TaskRepository("bugzilla", "http://repository1/");
+//
+// Map<String, String> map = new HashMap<String, String>();
+// map.put(AUTH_USERNAME, "testuser");
+// map.put(AUTH_PASSWORD, "testpassword");
+// map.put(AUTH_HTTP_USERNAME, "testhttpuser");
+// map.put(AUTH_HTTP_PASSWORD, "testhttppassword");
+//
+// Platform.addAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME, map);
+//
+// map = Platform.getAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME);
+//
+// assertEquals("testuser", map.get(AUTH_USERNAME));
+// assertEquals("testpassword", map.get(AUTH_PASSWORD));
+// assertEquals("testhttpuser", map.get(AUTH_HTTP_USERNAME));
+// assertEquals("testhttppassword", map.get(AUTH_HTTP_PASSWORD));
+//
+// assertTrue(TasksUiPlugin.getRepositoryManager().migrateToSecureStorage(repository1));
+//
+// assertNull(Platform.getAuthorizationInfo(new URL(repository1.getUrl()), AUTH_REALM, AUTH_SCHEME));
+//
+// ISecurePreferences securePreferences = SecurePreferencesFactory.getDefault()
+// .node(ITasksCoreConstants.ID_PLUGIN);
+// securePreferences = securePreferences.node(EncodingUtils.encodeSlashes(repository1.getUrl()));
+// assertEquals("testuser", securePreferences.get(AUTH_USERNAME, null));
+// assertEquals("testpassword", securePreferences.get(AUTH_PASSWORD, null));
+// assertEquals("testhttpuser", securePreferences.get(AUTH_HTTP_USERNAME, null));
+// assertEquals("testhttppassword", securePreferences.get(AUTH_HTTP_PASSWORD, null));
+//
+// }
+
+ public void testRepositoryWithSlash() throws MalformedURLException {
+
+ TaskRepository repository1 = new TaskRepository("bugzilla", "http://repository1/");
+ manager.addRepository(repository1);
+ assertNotNull(manager.getRepository("http://repository1"));
+ assertNotNull(manager.getRepository("http://repository1/"));
+
+ assertNotNull(manager.getRepository("bugzilla", "http://repository1"));
+ assertNotNull(manager.getRepository("bugzilla", "http://repository1/"));
+
+ }
+
+ public void testQueryDeletion() {
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+
+ MockTask task = new MockTask("1");
+ MockRepositoryQuery query = new MockRepositoryQuery("Test");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ TasksUiPlugin.getTaskList().addTask(task, query);
+
+ assertNotNull(TasksUiPlugin.getTaskList().getTask(task.getHandleIdentifier()));
+ TasksUiPlugin.getTaskList().deleteQuery(query);
+ ITask task2 = TasksUiPlugin.getTaskList().getTask(task.getHandleIdentifier());
+ assertNotNull(task2);
+ assertEquals(1, ((AbstractTask) task2).getParentContainers().size());
+
+ }
+
+ public void testHandles() {
+ String url = "http://foo.bar";
+ String id = "123";
+ String handle = RepositoryTaskHandleUtil.getHandle(url, id);
+ assertEquals(url, RepositoryTaskHandleUtil.getRepositoryUrl(handle));
+ assertEquals(id, RepositoryTaskHandleUtil.getTaskId(handle));
+// assertEquals(123, AbstractTask.getTaskIdAsInt(handle));
+ }
+
+ public void testMultipleNotAdded() throws MalformedURLException {
+ TaskRepository repository = new TaskRepository(DEFAULT_KIND, DEFAULT_URL);
+ manager.addRepository(repository);
+ TaskRepository repository2 = new TaskRepository(DEFAULT_KIND, DEFAULT_URL);
+ manager.addRepository(repository2);
+ assertEquals(1, manager.getAllRepositories().size());
+ }
+
+ public void testGet() throws MalformedURLException {
+ assertEquals("", TasksUiPlugin.getDefault().getPreferenceStore().getString(
+ TaskRepositoryManager.PREF_REPOSITORIES));
+
+ TaskRepository repository = new TaskRepository(DEFAULT_KIND, DEFAULT_URL);
+ manager.addRepository(repository);
+ assertEquals(repository, manager.getRepository(DEFAULT_KIND, DEFAULT_URL));
+ assertNull(manager.getRepository(DEFAULT_KIND, "foo"));
+ assertNull(manager.getRepository("foo", DEFAULT_URL));
+ }
+
+ public void testConnectorAddition() {
+ AbstractRepositoryConnector connector = new MockRepositoryConnector();
+ manager.addRepositoryConnector(connector);
+ assertNotNull(manager.getRepositoryConnector(connector.getConnectorKind()));
+ }
+
+ public void testRepositoryPersistance() throws MalformedURLException {
+ TaskRepository repository1 = new TaskRepository("bugzilla", "http://bugzilla");
+ TaskRepository repository2 = new TaskRepository("jira", "http://jira");
+ TaskRepository repository3 = new TaskRepository("local", "http://local");
+ manager.addRepository(repository3);
+ manager.addRepository(repository1);
+ manager.addRepository(repository2);
+ TasksUiPlugin.getDefault();
+ TasksUiPlugin.getExternalizationManager().load();
+ //manager.readRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+
+ if (manager.getRepositoryConnector("bugzilla") != null) {
+ assertTrue(manager.getAllRepositories().contains(repository2));
+ }
+ if (manager.getRepositoryConnector("jira") != null) {
+ assertTrue(manager.getAllRepositories().contains(repository2));
+ }
+ assertTrue(manager.getAllRepositories().contains(repository3));
+ }
+
+ public void testRepositoryAttributePersistance() throws MalformedURLException {
+ assertEquals("", TasksUiPlugin.getDefault().getPreferenceStore().getString(
+ TaskRepositoryManager.PREF_REPOSITORIES));
+
+ String version = "123";
+ String encoding = "UTF-16";
+ String fakeTimeZone = "nowhere";
+ Date now = new Date();
+ String dateString = now.toString();
+
+ TaskRepository repository1 = new TaskRepository("local", "http://bugzilla");
+ repository1.setVersion(version);
+ repository1.setCharacterEncoding(encoding);
+ repository1.setTimeZoneId(fakeTimeZone);
+ repository1.setSynchronizationTimeStamp(dateString);
+ manager.addRepository(repository1);
+ TasksUiPlugin.getDefault();
+ TasksUiPlugin.getExternalizationManager().load();
+ //manager.readRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TaskRepository temp = manager.getRepository(repository1.getConnectorKind(), repository1.getRepositoryUrl());
+ assertNotNull(temp);
+ assertEquals(version, temp.getVersion());
+ assertEquals(encoding, temp.getCharacterEncoding());
+ assertEquals(fakeTimeZone, temp.getTimeZoneId());
+ assertEquals(dateString, temp.getSynchronizationTimeStamp());
+
+ }
+
+ public void testRepositoryPersistanceAfterDelete() throws MalformedURLException {
+
+ TaskRepository repository = new TaskRepository(DEFAULT_KIND, DEFAULT_URL);
+ manager.addRepository(repository);
+ assertNotNull(manager.getRepository(repository.getConnectorKind(), repository.getRepositoryUrl()));
+
+ TaskRepository repository2 = new TaskRepository(DEFAULT_KIND, ANOTHER_URL);
+ manager.addRepository(repository2);
+ assertNotNull(manager.getRepository(repository2.getConnectorKind(), repository2.getRepositoryUrl()));
+
+ manager.removeRepository(repository2, TasksUiPlugin.getDefault().getRepositoriesFilePath());
+
+ assertNull(manager.getRepository(repository2.getConnectorKind(), repository2.getRepositoryUrl()));
+ }
+
+ public void testRepositoryWithUnknownUrlHandler() {
+ TaskRepository repository = new TaskRepository("eclipse.technology.mylar",
+ "abc://news.eclipse.org/eclipse.technology.mylar");
+
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("testUser",
+ "testPassword"), true);
+
+ AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ assertNotNull(credentials);
+ assertEquals("testUser", credentials.getUserName());
+ assertEquals("testPassword", credentials.getPassword());
+ }
+
+ public void testRepositoryWithCustomAttributes() throws Exception {
+ // Note: if a connector doesn't exist the associated repositories are not loaded (orphaned)
+ // causing this test to fail.
+ AbstractRepositoryConnector connector = new MockRepositoryConnector();
+ manager.addRepositoryConnector(connector);
+
+ TaskRepository repository = new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND,
+ "http://mylyn.eclipse.org/");
+ repository.setProperty("owner", "euxx");
+ manager.addRepository(repository);
+ TasksUiPlugin.getDefault();
+ TasksUiPlugin.getExternalizationManager().load();
+ //manager.readRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+
+ TaskRepository temp = manager.getRepository(repository.getConnectorKind(), repository.getRepositoryUrl());
+ assertNotNull(temp);
+ assertEquals("euxx", temp.getProperty("owner"));
+ }
+
+ public void testRepositoryPersistanceSameUrl() throws MalformedURLException {
+ TaskRepository repository1 = new TaskRepository("local", "http://repository");
+ TaskRepository repository2 = new TaskRepository("web", "http://repository");
+ manager.addRepository(repository1);
+ manager.addRepository(repository2);
+ assertEquals(2, manager.getAllRepositories().size());
+
+ List<TaskRepository> repositoryList = new ArrayList<TaskRepository>();
+ repositoryList.add(repository2);
+ repositoryList.add(repository1);
+ //manager.readRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TasksUiPlugin.getDefault();
+ TasksUiPlugin.getExternalizationManager().load();
+ assertEquals("got: " + manager.getAllRepositories(), 2, manager.getAllRepositories().size());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositorySorterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositorySorterTest.java
new file mode 100644
index 0000000..12d6835
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositorySorterTest.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositorySorterTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testCategorySorting() {
+ TaskRepositoriesSorter sorter = new TaskRepositoriesSorter();
+ TaskRepository t1 = new TaskRepository("t1", "http://a");
+ TaskRepository t2 = new TaskRepository("t2", "http://a");
+ TaskRepository t3 = new TaskRepository("t3", "http://a");
+ assertTrue(sorter.compare(null, t1, t2) < 0);
+ assertTrue(sorter.compare(null, t3, t1) > 0);
+ }
+
+ public void testUrlSorting() {
+ TaskRepositoriesSorter sorter = new TaskRepositoriesSorter();
+ TaskRepository t1 = new TaskRepository("t", "http://a");
+ TaskRepository t2 = new TaskRepository("t", "http://b");
+ TaskRepository t3 = new TaskRepository("t", "http://c");
+ assertTrue(sorter.compare(null, t1, t2) < 0);
+ assertTrue(sorter.compare(null, t3, t1) > 0);
+ }
+
+ public void testLabelSorting() {
+ TaskRepositoriesSorter sorter = new TaskRepositoriesSorter();
+ TaskRepository t1 = new TaskRepository("kind", "http://a");
+ t1.setProperty(IRepositoryConstants.PROPERTY_LABEL, "a");
+ TaskRepository t2 = new TaskRepository("kind", "http://a");
+ t2.setProperty(IRepositoryConstants.PROPERTY_LABEL, "b");
+ TaskRepository t3 = new TaskRepository("kind", "http://a");
+ t3.setProperty(IRepositoryConstants.PROPERTY_LABEL, "c");
+
+ assertTrue(sorter.compare(null, t1, t2) < 0);
+ assertTrue(sorter.compare(null, t3, t1) > 0);
+ }
+
+ public void testLabelVsNoLabel() {
+ TaskRepositoriesSorter sorter = new TaskRepositoriesSorter();
+ TaskRepository t1 = new TaskRepository("kind", "http://a");
+ t1.setProperty(IRepositoryConstants.PROPERTY_LABEL, "a");
+ TaskRepository t2 = new TaskRepository("kind", "http://a");
+
+ assertTrue(sorter.compare(null, t1, t2) < 0);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryTest.java
new file mode 100644
index 0000000..586ff51
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskRepositoryTest.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoryTest extends TestCase {
+
+ @SuppressWarnings("deprecation")
+ public void testPlatformAuthHandlerAvailable() throws Exception {
+ URL url = new URL("http://mylyn");
+ Platform.addAuthorizationInfo(url, "", "", Collections.EMPTY_MAP);
+ assertNotNull("Tests require org.eclipse.core.runtime.compatibility.auth", Platform.getAuthorizationInfo(url,
+ "", ""));
+ }
+
+ public void testLabel() {
+ TaskRepository repository = new TaskRepository("kind", "http://foo.bar");
+ assertTrue(repository.getRepositoryLabel().equals(repository.getRepositoryUrl()));
+
+ repository.setProperty(IRepositoryConstants.PROPERTY_LABEL, "label");
+ assertTrue(repository.getRepositoryLabel().equals("label"));
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testPassword() throws Exception {
+ password(AuthenticationType.REPOSITORY);
+
+ // test old API
+ TaskRepository taskRepository = new TaskRepository("kind", "url");
+ taskRepository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("user", "pwd"), true);
+ assertEquals("user", taskRepository.getUserName());
+ assertEquals("pwd", taskRepository.getPassword());
+
+ assertEquals(null, taskRepository.getHttpUser());
+ assertEquals(null, taskRepository.getHttpPassword());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testHttpPassword() throws Exception {
+ password(AuthenticationType.HTTP);
+
+ TaskRepository taskRepository = new TaskRepository("kind", "url");
+ taskRepository.setCredentials(AuthenticationType.HTTP, new AuthenticationCredentials("user", "pwd"), true);
+ assertEquals("user", taskRepository.getHttpUser());
+ assertEquals("pwd", taskRepository.getHttpPassword());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testProxyPassword() throws Exception {
+ password(AuthenticationType.PROXY);
+
+ TaskRepository taskRepository = new TaskRepository("kind", "url");
+ taskRepository.setCredentials(AuthenticationType.PROXY, new AuthenticationCredentials("user", "pwd"), false);
+ assertEquals("user", taskRepository.getProxyUsername());
+ assertEquals("pwd", taskRepository.getProxyPassword());
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testFlushCredentials() throws Exception {
+ TaskRepository taskRepository = new TaskRepository("kind", "url");
+ taskRepository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("user", "pwd"),
+ false);
+ taskRepository.setCredentials(AuthenticationType.HTTP, new AuthenticationCredentials("user", "pwd"), true);
+ taskRepository.flushAuthenticationCredentials();
+ assertEquals(null, taskRepository.getUserName());
+ assertEquals(null, taskRepository.getPassword());
+ assertEquals(null, taskRepository.getHttpUser());
+ assertEquals(null, taskRepository.getHttpPassword());
+ assertNull(taskRepository.getCredentials(AuthenticationType.REPOSITORY));
+ assertNull(taskRepository.getCredentials(AuthenticationType.HTTP));
+ assertNull(taskRepository.getCredentials(AuthenticationType.PROXY));
+ }
+
+ public void testPlatformIsRunning() {
+ assertTrue(Platform.isRunning());
+ }
+
+ // TODO e3.4 move to new api
+ @SuppressWarnings("deprecation")
+ public void password(AuthenticationType authType) throws Exception {
+ URL url = new URL("http://url");
+ TaskRepository taskRepository = new TaskRepository("kind", url.toString());
+ try {
+ taskRepository.flushAuthenticationCredentials();
+
+ assertNull(taskRepository.getCredentials(authType));
+ assertTrue(taskRepository.getSavePassword(authType));
+
+ taskRepository.setCredentials(authType, new AuthenticationCredentials("user", "pwd"), true);
+ AuthenticationCredentials credentials = taskRepository.getCredentials(authType);
+ assertNotNull(credentials);
+ assertEquals("user", credentials.getUserName());
+ assertEquals("pwd", credentials.getPassword());
+
+ Map<?, ?> map = Platform.getAuthorizationInfo(url, "", "Basic");
+ assertNotNull(map);
+ assertTrue(map.containsValue("user"));
+ assertTrue(map.containsValue("pwd"));
+
+ // test not saving password
+ taskRepository.setCredentials(authType, new AuthenticationCredentials("user1", "pwd1"), false);
+ assertFalse(taskRepository.getSavePassword(authType));
+ credentials = taskRepository.getCredentials(authType);
+ assertNotNull(credentials);
+ assertEquals("user1", credentials.getUserName());
+ assertEquals("pwd1", credentials.getPassword());
+
+ // make sure old passwords are not in the key ring
+ map = Platform.getAuthorizationInfo(url, "", "Basic");
+ assertNotNull(map);
+ assertTrue(map.containsValue("user1"));
+ assertFalse(map.containsValue("pwd1"));
+ assertFalse(map.containsValue("user"));
+ assertFalse(map.containsValue("pwd"));
+
+ taskRepository.setCredentials(authType, new AuthenticationCredentials("user2", "pwd2"), true);
+ assertTrue(taskRepository.getSavePassword(authType));
+ credentials = taskRepository.getCredentials(authType);
+ assertNotNull(credentials);
+ assertEquals("user2", credentials.getUserName());
+ assertEquals("pwd2", credentials.getPassword());
+ } finally {
+ taskRepository.flushAuthenticationCredentials();
+ }
+ }
+
+ public void testConfigUpdateStoring() throws Exception {
+ URL url = new URL("http://url");
+ TaskRepository taskRepository = new TaskRepository("kind", url.toString());
+ Date stamp = taskRepository.getConfigurationDate();
+ assertNull("unset configuration date returns null", stamp);
+ stamp = new Date();
+ stamp.setTime(stamp.getTime() - 35000L);
+
+ taskRepository.setConfigurationDate(stamp);
+ assertEquals("Time stamp set", stamp.getTime(), taskRepository.getConfigurationDate().getTime());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskTest.java
new file mode 100644
index 0000000..f893ae4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskTest.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class TaskTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testUrl() {
+ AbstractTask task = new LocalTask("handle", "label");
+ task.setUrl("http://eclipse.org/mylyn/doc");
+ assertTrue(TasksUiInternal.isValidUrl(task.getUrl()));
+
+ task.setUrl("http://");
+ assertFalse(TasksUiInternal.isValidUrl(task.getUrl()));
+
+ task.setUrl("https://");
+ assertFalse(TasksUiInternal.isValidUrl(task.getUrl()));
+
+ task.setUrl("");
+ assertFalse(TasksUiInternal.isValidUrl(task.getUrl()));
+
+ task.setUrl(null);
+ assertFalse(TasksUiInternal.isValidUrl(task.getUrl()));
+ }
+
+ public void testPriorityNeverNull() {
+ ITask task = new LocalTask("handle", "label");
+ assertNotNull(task.getPriority());
+
+ PriorityLevel def = PriorityLevel.getDefault();
+ assertNotNull(def);
+ assertEquals(def, PriorityLevel.fromDescription("garbage"));
+ assertEquals(def, PriorityLevel.fromString("garbage"));
+ }
+
+ public void testPriorityLevelFromLevel() {
+ assertEquals(PriorityLevel.P1, PriorityLevel.fromLevel(Integer.MIN_VALUE));
+ assertEquals(PriorityLevel.P1, PriorityLevel.fromLevel(-1));
+ assertEquals(PriorityLevel.P1, PriorityLevel.fromLevel(0));
+ assertEquals(PriorityLevel.P1, PriorityLevel.fromLevel(1));
+ assertEquals(PriorityLevel.P2, PriorityLevel.fromLevel(2));
+ assertEquals(PriorityLevel.P3, PriorityLevel.fromLevel(3));
+ assertEquals(PriorityLevel.P4, PriorityLevel.fromLevel(4));
+ assertEquals(PriorityLevel.P5, PriorityLevel.fromLevel(5));
+ assertEquals(PriorityLevel.P5, PriorityLevel.fromLevel(6));
+ assertEquals(PriorityLevel.P5, PriorityLevel.fromLevel(Integer.MAX_VALUE));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskTestUtil.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskTestUtil.java
new file mode 100644
index 0000000..9d59d49
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskTestUtil.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import junit.framework.Assert;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.ViewIntroAdapterPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskTestUtil {
+
+ public static File getLocalFile(String path) {
+ try {
+ URL installURL = TasksTestsPlugin.getDefault().getBundle().getEntry(path);
+ URL localURL = FileLocator.toFileURL(installURL);
+ return new File(localURL.getFile());
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ public static File getFile(String path) throws IOException {
+ if (TasksTestsPlugin.getDefault() != null) {
+ URL installURL = TasksTestsPlugin.getDefault().getBundle().getEntry(path);
+ URL localURL = FileLocator.toFileURL(installURL);
+ return new File(localURL.getFile());
+ } else {
+ URL localURL = TaskTestUtil.class.getResource("");
+ return new File(localURL.getFile() + "../../../../../../" + path);
+ }
+ }
+
+ /**
+ * Clears tasks and repositories. When this method returns only the local task repository will exist and the task
+ * list will only have default categories but no tasks.
+ */
+ public static void resetTaskListAndRepositories() throws Exception {
+ TasksUiPlugin.getRepositoryManager().clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ TasksUiPlugin.getDefault().getLocalTaskRepository();
+ resetTaskList();
+ }
+
+ /**
+ * Clears all tasks.
+ */
+ public static void resetTaskList() throws Exception {
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ TasksUiPlugin.getTaskListExternalizationParticipant().resetTaskList();
+ TaskListView view = TaskListView.getFromActivePerspective();
+ if (view != null) {
+ view.refresh();
+ }
+ }
+
+ /**
+ * @see #resetTaskList()
+ */
+ public static void saveAndReadTasklist() throws Exception {
+ TasksUiPlugin.getTaskList().notifyElementsChanged(null);
+ saveTaskList();
+ TaskTestUtil.resetTaskList();
+ TasksUiPlugin.getDefault().initializeDataSources();
+ }
+
+ public static void saveTaskList() {
+ TasksUiPlugin.getExternalizationManager().requestSave();
+ }
+
+ public static TaskRepository createMockRepository() {
+ return new TaskRepository(MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL);
+ }
+
+ public static TaskTask createMockTask(String taskId) {
+ return new TaskTask(MockRepositoryConnector.REPOSITORY_KIND, MockRepositoryConnector.REPOSITORY_URL, taskId);
+ }
+
+ public static RepositoryQuery createMockQuery(String queryId) {
+ return new RepositoryQuery(MockRepositoryConnector.REPOSITORY_KIND, queryId);
+ }
+
+ public static TaskListView openTasksViewInActivePerspective() throws Exception {
+ IWorkbenchPart activePart = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart();
+ if (activePart instanceof ViewIntroAdapterPart) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().hideView((IViewPart) activePart);
+ }
+ TaskListView taskListView = (TaskListView) PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .showView(ITasksUiConstants.ID_VIEW_TASKS);
+ Assert.assertSame("Failed to make task list view active", PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart(), taskListView);
+ return taskListView;
+ }
+
+ public static void addAndSelectTask(ITask task) throws Exception {
+ TasksUiPlugin.getTaskList().addTask(task);
+ TaskListView taskListView = TaskTestUtil.openTasksViewInActivePerspective();
+ taskListView.refresh();
+ taskListView.getViewer().expandAll();
+ taskListView.getViewer().setSelection(new StructuredSelection(task), true);
+ Assert.assertSame("Failed to select task", task, taskListView.getSelectedTask());
+ }
+
+ public static TaskData createTaskData(TaskRepository taskRepository, String taskId) {
+ return new TaskData(new TaskAttributeMapper(taskRepository), taskRepository.getConnectorKind(),
+ taskRepository.getRepositoryUrl(), taskId);
+ }
+
+ public static TaskData createMockTaskData(String taskId) {
+ return createTaskData(createMockRepository(), taskId);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskWorkingSetTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskWorkingSetTest.java
new file mode 100644
index 0000000..176a5a0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TaskWorkingSetTest.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.internal.resources.ProjectDescription;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.resources.tests.ResourceTestUtil;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.internal.Workbench;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskWorkingSetTest extends TestCase {
+
+ private IProject project;
+
+ private IWorkspaceRoot root;
+
+ private IWorkingSet workingSet;
+
+ private IWorkingSetManager workingSetManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ workingSetManager = Workbench.getInstance().getWorkingSetManager();
+ root = ResourcesPlugin.getWorkspace().getRoot();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (workingSet != null) {
+ workingSetManager.removeWorkingSet(workingSet);
+ }
+
+ if (project != null) {
+ ResourceTestUtil.deleteProject(project);
+ }
+ }
+
+ public void testDeleteQuery() {
+ MockRepositoryQuery query = new MockRepositoryQuery("description");
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ taskList.addQuery(query);
+ workingSet = createWorkingSet(query);
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(query));
+ TasksUiPlugin.getTaskList().deleteQuery(query);
+ assertFalse(Arrays.asList(workingSet.getElements()).contains(query));
+ }
+
+ public void testRenameQuery() {
+ MockRepositoryQuery query = new MockRepositoryQuery("description");
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ taskList.addQuery(query);
+ workingSet = createWorkingSet(query);
+ assertTrue(workingSet.getElements().length == 1);
+ IAdaptable[] elements = workingSet.getElements();
+ assertTrue(elements.length == 1);
+ assertTrue(elements[0] instanceof MockRepositoryQuery);
+ assertTrue(((MockRepositoryQuery) elements[0]).getHandleIdentifier().equals("description"));
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(query));
+
+ query.setHandleIdentifier("Test");
+ assertTrue(workingSet.getElements().length == 1);
+ elements = workingSet.getElements();
+ assertTrue(elements.length == 1);
+ assertTrue(elements[0] instanceof MockRepositoryQuery);
+ assertTrue(((MockRepositoryQuery) elements[0]).getHandleIdentifier().equals("Test"));
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(query));
+ }
+
+ // XXX see bug 212962
+// public void testRenameQuery() {
+// MockRepositoryQuery query = new MockRepositoryQuery("description");
+// TaskList taskList = TasksUiPlugin.getTaskList();
+// taskList.addQuery(query);
+// workingSet = createWorkingSet(query);
+//
+// TasksUiPlugin.getTaskList().deleteQuery(query);
+// query = new MockRepositoryQuery("newDescription");
+// TasksUiPlugin.getTaskList().addQuery(query);
+// assertTrue(Arrays.asList(workingSet.getElements()).contains(query));
+// }
+//
+// public void testEditQuery() {
+// MockRepositoryQuery query = new MockRepositoryQuery("description");
+// TaskList taskList = TasksUiPlugin.getTaskList();
+// taskList.addQuery(query);
+// workingSet = createWorkingSet(query);
+//
+// TasksUiPlugin.getTaskList().deleteQuery(query);
+// TasksUiPlugin.getTaskList().addQuery(query);
+// assertTrue(Arrays.asList(workingSet.getElements()).contains(query));
+// }
+
+ public void testRenameProject() throws Exception {
+ createProject("Test Rename");
+ workingSet = createWorkingSet(project);
+
+ WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+ @Override
+ protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException,
+ InterruptedException {
+ IProjectDescription description = new ProjectDescription();
+ description.setName("New Name");
+ project.move(description, true, new NullProgressMonitor());
+ }
+ };
+ op.run(new NullProgressMonitor());
+
+ IProject oldProject = root.getProject("Test Rename");
+ IProject newProject = root.getProject("New Name");
+ assertFalse(Arrays.asList(workingSet.getElements()).contains(oldProject));
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(newProject));
+ }
+
+ private void createProject(String name) throws CoreException {
+ project = root.getProject(name);
+ project.create(null);
+ project.open(null);
+ }
+
+ private IWorkingSet createWorkingSet(IAdaptable element) {
+ IWorkingSet workingSet = workingSetManager.createWorkingSet("Task Working Set", new IAdaptable[] { element });
+ workingSet.setId(TaskWorkingSetUpdater.ID_TASK_WORKING_SET);
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(element));
+ workingSetManager.addWorkingSet(workingSet);
+ return workingSet;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksTestsPlugin.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksTestsPlugin.java
new file mode 100644
index 0000000..da070ed
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksTestsPlugin.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ */
+public class TasksTestsPlugin extends Plugin {
+
+ private static TasksTestsPlugin plugin;
+
+ public TasksTestsPlugin() {
+ super();
+ plugin = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static TasksTestsPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksUiUtilTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksUiUtilTest.java
new file mode 100644
index 0000000..6092625
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksUiUtilTest.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.lang.reflect.Field;
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.browser.WebBrowserEditor;
+import org.eclipse.ui.internal.browser.WebBrowserEditorInput;
+
+/**
+ * @author Shawn Minto
+ */
+public class TasksUiUtilTest extends TestCase {
+
+ private TaskCategory cat1;
+
+ private AbstractTask cat1task1;
+
+ private AbstractTask cat1task2;
+
+ private IWorkbenchPage activePage;
+
+ private TaskList taskList;
+
+ @Override
+ public void setUp() throws Exception {
+ taskList = TasksUiPlugin.getTaskList();
+
+ TaskTestUtil.resetTaskListAndRepositories();
+ TasksUiPlugin.getDefault().getLocalTaskRepository();
+
+ cat1 = new TaskCategory("First Category");
+ taskList.addCategory(cat1);
+
+ cat1task1 = TasksUiInternal.createNewLocalTask("task 1");
+ cat1task1.setPriority(PriorityLevel.P1.toString());
+ cat1task1.setCompletionDate(new Date());
+ taskList.addTask(cat1task1, cat1);
+
+ cat1task2 = TasksUiInternal.createNewLocalTask("task 2");
+ cat1task2.setPriority(PriorityLevel.P2.toString());
+ taskList.addTask(cat1task2, cat1);
+
+ assertEquals(cat1.getChildren().size(), 2);
+
+ activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ assertTrue(activePage.closeAllEditors(false));
+ assertEquals(0, activePage.getEditorReferences().length);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+ activePage.closeAllEditors(false);
+ }
+
+ // FIXME re-enable test
+// public void testOpenTaskFromTask() {
+// TasksUiUtil.openTask(cat1task1);
+// assertEquals(1, activePage.getEditorReferences().length);
+// IEditorPart editor = activePage.getEditorReferences()[0].getEditor(true);
+// assertNotNull(editor);
+// assertEquals(TaskEditor.class, editor.getClass());
+//
+// TasksUiUtil.openTask(cat1task2);
+// assertEquals(2, activePage.getEditorReferences().length);
+// editor = activePage.getEditorReferences()[1].getEditor(true);
+// assertNotNull(editor);
+// assertEquals(TaskEditor.class, editor.getClass());
+// }
+
+ public void testOpenTaskFromString() {
+ TasksUiUtil.openTask((String) null);
+ assertEquals(1, activePage.getEditorReferences().length);
+ IEditorPart editor = activePage.getEditorReferences()[0].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor.getClass());
+ }
+
+ public void testOpenUrl() {
+ TasksUiUtil.openUrl(null);
+ assertEquals(1, activePage.getEditorReferences().length);
+ IEditorPart editor = activePage.getEditorReferences()[0].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor.getEditorInput().getClass());
+ assertEquals(null, ((WebBrowserEditorInput) editor.getEditorInput()).getURL());
+
+ TasksUiUtil.openUrl("http://eclipse.org/mylyn");
+ assertEquals(2, activePage.getEditorReferences().length);
+ editor = activePage.getEditorReferences()[0].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor.getEditorInput().getClass());
+ assertEquals(null, ((WebBrowserEditorInput) editor.getEditorInput()).getURL());
+
+ IEditorPart editor2 = activePage.getEditorReferences()[1].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor2.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor2.getEditorInput().getClass());
+ assertNotNull(((WebBrowserEditorInput) editor2.getEditorInput()).getURL());
+ assertEquals("http://eclipse.org/mylyn", ((WebBrowserEditorInput) editor2.getEditorInput()).getURL().toString());
+ }
+
+ public void testFlagNoRichEditor() throws SecurityException, NoSuchFieldException, IllegalArgumentException,
+ IllegalAccessException {
+ TasksUiUtil.openUrl(null);
+ assertEquals(1, activePage.getEditorReferences().length);
+ IEditorPart editor = activePage.getEditorReferences()[0].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor.getEditorInput().getClass());
+ assertEquals(null, ((WebBrowserEditorInput) editor.getEditorInput()).getURL());
+ WebBrowserEditorInput input = ((WebBrowserEditorInput) editor.getEditorInput());
+ Field f = input.getClass().getDeclaredField("style");
+ f.setAccessible(true);
+ int style = (Integer) f.get(input);
+ assertFalse((style & TasksUiUtil.FLAG_NO_RICH_EDITOR) == 0);
+
+ TasksUiUtil.openUrl("http://eclipse.org/mylyn");
+ assertEquals(2, activePage.getEditorReferences().length);
+ editor = activePage.getEditorReferences()[0].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor.getEditorInput().getClass());
+ assertEquals(null, ((WebBrowserEditorInput) editor.getEditorInput()).getURL());
+ input = ((WebBrowserEditorInput) editor.getEditorInput());
+ f = input.getClass().getDeclaredField("style");
+ f.setAccessible(true);
+ style = (Integer) f.get(input);
+ assertFalse((style & TasksUiUtil.FLAG_NO_RICH_EDITOR) == 0);
+
+ IEditorPart editor2 = activePage.getEditorReferences()[1].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor2.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor2.getEditorInput().getClass());
+ assertNotNull(((WebBrowserEditorInput) editor2.getEditorInput()).getURL());
+ assertEquals("http://eclipse.org/mylyn", ((WebBrowserEditorInput) editor2.getEditorInput()).getURL().toString());
+ input = ((WebBrowserEditorInput) editor.getEditorInput());
+ f = input.getClass().getDeclaredField("style");
+ f.setAccessible(true);
+ style = (Integer) f.get(input);
+ assertFalse((style & TasksUiUtil.FLAG_NO_RICH_EDITOR) == 0);
+
+ // open task should not set FLAG_NO_RICH_EDITOR
+ TasksUiUtil.openTask("http://eclipse.org/mylyn/test");
+ assertEquals(3, activePage.getEditorReferences().length);
+ editor = activePage.getEditorReferences()[2].getEditor(true);
+ assertEquals(WebBrowserEditor.class, editor.getClass());
+ assertEquals(WebBrowserEditorInput.class, editor.getEditorInput().getClass());
+ assertEquals("http://eclipse.org/mylyn/test", ((WebBrowserEditorInput) editor.getEditorInput()).getURL()
+ .toString());
+ input = ((WebBrowserEditorInput) editor.getEditorInput());
+ f = input.getClass().getDeclaredField("style");
+ f.setAccessible(true);
+ style = (Integer) f.get(input);
+ assertTrue((style & TasksUiUtil.FLAG_NO_RICH_EDITOR) == 0);
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksUtilTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksUtilTest.java
new file mode 100644
index 0000000..e7528f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/TasksUtilTest.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.provisional.tasks.core.TasksUtil;
+
+public class TasksUtilTest extends TestCase {
+
+ public void testDecode() {
+ assertEquals("abc", TasksUtil.encode("abc"));
+ assertEquals("%2D_", TasksUtil.encode("-"));
+ assertEquals("abc%2D_123", TasksUtil.encode("abc-123"));
+ assertEquals("", TasksUtil.encode(""));
+ }
+
+ public void testDecodeInvalid() {
+ try {
+ String s = TasksUtil.decode("abc-123");
+ fail("Expected IllegalArgumentException, got '" + s + "'");
+ } catch (IllegalArgumentException e) {
+ }
+ try {
+ String s = TasksUtil.decode("%Z_");
+ fail("Expected IllegalArgumentException, got '" + s + "'");
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
+ public void testEncode() {
+ assertEquals("abc", TasksUtil.decode("abc"));
+ assertEquals("-", TasksUtil.decode("%2D_"));
+ assertEquals("abc-123", TasksUtil.decode("abc%2D_123"));
+ assertEquals("abc-123", TasksUtil.decode(TasksUtil.decode(TasksUtil.encode(TasksUtil.encode("abc-123")))));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockAttachmentHandler.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockAttachmentHandler.java
new file mode 100644
index 0000000..ec2fe63
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockAttachmentHandler.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.connector;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ */
+public class MockAttachmentHandler extends AbstractTaskAttachmentHandler {
+
+ private byte[] data;
+
+ public void setAttachmentData(byte[] data) {
+ this.data = data;
+ }
+
+ @Override
+ public boolean canGetContent(TaskRepository repository, ITask task) {
+ return true;
+ }
+
+ @Override
+ public boolean canPostContent(TaskRepository repository, ITask task) {
+ return true;
+ }
+
+ @Override
+ public InputStream getContent(TaskRepository repository, ITask task, TaskAttribute attachmentAttribute,
+ IProgressMonitor monitor) throws CoreException {
+ return new ByteArrayInputStream(data);
+ }
+
+ @Override
+ public void postContent(TaskRepository repository, ITask task, AbstractTaskAttachmentSource source, String comment,
+ TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws CoreException {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java
new file mode 100644
index 0000000..ad16b0d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnector.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.connector;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+public class MockRepositoryConnector extends AbstractRepositoryConnector {
+
+ // TODO 3.3 rename to CONNECTOR_KIND
+ public static final String REPOSITORY_KIND = "mock";
+
+ public static final String REPOSITORY_URL = "http://mockrepository.test";
+
+ public static MockRepositoryConnector getDefault() {
+ return (MockRepositoryConnector) TasksUi.getRepositoryConnector(REPOSITORY_KIND);
+ }
+
+ private AbstractTaskAttachmentHandler attachmentHandler;
+
+ private boolean canQuery;
+
+ private boolean canCreateNewTask;
+
+ private boolean canCreateTaskFromKey;
+
+ private boolean hasLocalCompletionState;
+
+ public MockRepositoryConnector() {
+ resetDefaults();
+ }
+
+ public void resetDefaults() {
+ canQuery = false;
+ canCreateNewTask = false;
+ canCreateTaskFromKey = false;
+ hasLocalCompletionState = false;
+ }
+
+ public void setCanCreateNewTask(boolean canCreateNewTask) {
+ this.canCreateNewTask = canCreateNewTask;
+ }
+
+ public void setCanCreateTaskFromKey(boolean canCreateTaskFromKey) {
+ this.canCreateTaskFromKey = canCreateTaskFromKey;
+ }
+
+ public void setCanQuery(boolean canQuery) {
+ this.canQuery = canQuery;
+ }
+
+ public void setHasLocalCompletionState(boolean hasLocalCompletionState) {
+ this.hasLocalCompletionState = hasLocalCompletionState;
+ }
+
+ @Override
+ public boolean canQuery(TaskRepository repository) {
+ return canQuery;
+ }
+
+ @Override
+ public boolean canCreateNewTask(TaskRepository repository) {
+ return canCreateNewTask;
+ }
+
+ @Override
+ public boolean canCreateTaskFromKey(TaskRepository repository) {
+ return canCreateTaskFromKey;
+ }
+
+ @Override
+ public String getLabel() {
+ return "Mock Repository (for unit tests)";
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return REPOSITORY_KIND;
+ }
+
+ @Override
+ public String getRepositoryUrlFromTaskUrl(String url) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public String getTaskIdFromTaskUrl(String url) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public String getTaskUrl(String repositoryUrl, String taskId) {
+ return null;
+ }
+
+ @Override
+ public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
+ // ignore
+ }
+
+ @Override
+ public IStatus performQuery(TaskRepository repository, IRepositoryQuery query, TaskDataCollector resultCollector,
+ ISynchronizationSession event, IProgressMonitor monitor) {
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public AbstractTaskAttachmentHandler getTaskAttachmentHandler() {
+ return attachmentHandler;
+ }
+
+ public void setTaskAttachmentHandler(MockAttachmentHandler attachmentHandler) {
+ this.attachmentHandler = attachmentHandler;
+ }
+
+ @Override
+ public TaskData getTaskData(TaskRepository taskRepository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+ return null;
+ }
+
+ @Override
+ public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ return false;
+ }
+
+ @Override
+ public boolean hasLocalCompletionState(TaskRepository taskRepository, ITask task) {
+ return hasLocalCompletionState;
+ }
+
+ @Override
+ public void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ }
+
+// @Override
+// public Set<RepositoryTemplate> getTemplates() {
+// Set<RepositoryTemplate> templates = new HashSet<RepositoryTemplate>();
+// RepositoryTemplate template = new RepositoryTemplate("Mock Template", REPOSITORY_URL, "utf-8", "1", "new",
+// "prefix", "query", "newAccountUrl", false, true);
+// templates.add(template);
+// return templates;
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java
new file mode 100644
index 0000000..221d201
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryConnectorUi.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.connector;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class MockRepositoryConnectorUi extends AbstractRepositoryConnectorUi {
+
+ private static Pattern HYPERLINK_PATTERN = Pattern.compile("(\\d+)");
+
+ @Override
+ public String getConnectorKind() {
+ return "mock";
+ }
+
+ @Override
+ public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public boolean hasSearchPage() {
+ return false;
+ }
+
+ @Override
+ public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery query) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public IWizard getNewTaskWizard(TaskRepository taskRepository, ITaskMapping selection) {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
+ List<IHyperlink> links = new ArrayList<IHyperlink>();
+ Matcher m = HYPERLINK_PATTERN.matcher(text);
+ while (m.find()) {
+ links.add(new TaskHyperlink(new Region(textOffset + m.start(), m.end() - m.start()), repository, m.group()));
+ }
+ return links.toArray(new IHyperlink[0]);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryQuery.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryQuery.java
new file mode 100644
index 0000000..d23cf0e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockRepositoryQuery.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.connector;
+
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+
+/**
+ * @author Mik Kersten
+ */
+public class MockRepositoryQuery extends RepositoryQuery {
+
+ public String MOCK_QUERY_URL = MockRepositoryConnector.REPOSITORY_URL + ".query";
+
+ public MockRepositoryQuery(String description) {
+ super(MockRepositoryConnector.REPOSITORY_KIND, description);
+ super.setUrl(MOCK_QUERY_URL);
+ super.setRepositoryUrl(MockRepositoryConnector.REPOSITORY_URL);
+ }
+
+ public MockRepositoryQuery(String description, String url) {
+ super(MockRepositoryConnector.REPOSITORY_KIND, description);
+ super.setUrl(url);
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return "mock";
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockTask.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockTask.java
new file mode 100644
index 0000000..5a7ad3b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/connector/MockTask.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.connector;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+
+/**
+ * @author Mik Kersten
+ */
+public class MockTask extends AbstractTask {
+
+ private String ownerId;
+
+ public MockTask(String taskId) {
+ super(MockRepositoryConnector.REPOSITORY_URL, taskId, taskId);
+ }
+
+ public MockTask(String repositoryUrl, String taskId) {
+ super(repositoryUrl, taskId, taskId);
+ }
+
+ public MockTask(String repositoryUrl, String taskId, String summary) {
+ super(repositoryUrl, taskId, summary);
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return "mock";
+ }
+
+ @Override
+ public void setOwner(String ownerId) {
+ this.ownerId = ownerId;
+ }
+
+ @Override
+ public String getOwner() {
+ if (ownerId == null) {
+ return super.getOwner();
+ } else {
+ return ownerId;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "Mock Task: " + super.getHandleIdentifier();
+ }
+
+ @Override
+ public boolean isLocal() {
+ // ignore
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/FileTaskAttachmentSourceTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/FileTaskAttachmentSourceTest.java
new file mode 100644
index 0000000..0a4136e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/FileTaskAttachmentSourceTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests.core;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+
+/**
+ * @author David Green
+ */
+public class FileTaskAttachmentSourceTest extends TestCase {
+
+ public void testGetContentTypeFromFilename() {
+ assertEquals("text/plain", FileTaskAttachmentSource.getContentTypeFromFilename("a.txt"));
+ assertEquals("text/plain", FileTaskAttachmentSource.getContentTypeFromFilename("foo.mylyn-test-text"));
+ assertEquals("application/xml", FileTaskAttachmentSource.getContentTypeFromFilename("a.xml"));
+ assertEquals("application/xml", FileTaskAttachmentSource.getContentTypeFromFilename("foo.mylyn-test-xml"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/ITasksCoreConstantsTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/ITasksCoreConstantsTest.java
new file mode 100644
index 0000000..7eb5137
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/ITasksCoreConstantsTest.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.MutexSchedulingRule;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants.ObjectSchedulingRule;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ITasksCoreConstantsTest extends TestCase {
+
+ public void testRootRuleConflicts() {
+ assertTrue(ITasksCoreConstants.ROOT_SCHEDULING_RULE.isConflicting(ITasksCoreConstants.ROOT_SCHEDULING_RULE));
+ assertTrue(ITasksCoreConstants.ROOT_SCHEDULING_RULE.isConflicting(ITasksCoreConstants.TASKLIST_SCHEDULING_RULE));
+ assertTrue(ITasksCoreConstants.ROOT_SCHEDULING_RULE.isConflicting(new MutexSchedulingRule()));
+ assertTrue(ITasksCoreConstants.ROOT_SCHEDULING_RULE.isConflicting(new ObjectSchedulingRule(this)));
+ assertTrue(ITasksCoreConstants.TASKLIST_SCHEDULING_RULE.isConflicting(ITasksCoreConstants.ROOT_SCHEDULING_RULE));
+ assertTrue(new MutexSchedulingRule().isConflicting(ITasksCoreConstants.ROOT_SCHEDULING_RULE));
+ assertTrue(new ObjectSchedulingRule(this).isConflicting(ITasksCoreConstants.ROOT_SCHEDULING_RULE));
+ }
+
+ public void testObjectSchdedulingRuleConflicts() {
+ assertTrue(new ObjectSchedulingRule(this).isConflicting(new ObjectSchedulingRule(this)));
+ assertFalse(new ObjectSchedulingRule(new Object()).isConflicting(new ObjectSchedulingRule(this)));
+ ObjectSchedulingRule rule = new ObjectSchedulingRule(this);
+ assertTrue(rule.isConflicting(rule));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/TaskListUnmatchedContainerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/TaskListUnmatchedContainerTest.java
new file mode 100644
index 0000000..3ecc288
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/TaskListUnmatchedContainerTest.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryQuery;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskListUnmatchedContainerTest extends TestCase {
+
+ private TaskList taskList;
+
+ private UnmatchedTaskContainer unmatchedContainer;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskList = new TaskList();
+ unmatchedContainer = new UnmatchedTaskContainer(MockRepositoryConnector.REPOSITORY_KIND,
+ MockRepositoryConnector.REPOSITORY_URL);
+ taskList.addUnmatchedContainer(unmatchedContainer);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ }
+
+ /**
+ * When a local tasks is removed from a category it should be placed in the Uncategorized folder.
+ */
+ public void testRemoveLocalTask() {
+ TaskCategory category = new TaskCategory("taskCategoryHandle");
+ taskList.addCategory(category);
+ LocalTask newTask = new LocalTask("" + taskList.getNextLocalTaskId(), "new local task");
+ taskList.addTask(newTask, category);
+ //assertEquals(1, taskList.getOrphanContainers().size());
+ assertEquals(2, taskList.getCategories().size());
+ taskList.removeFromContainer(category, newTask);
+ //assertEquals(taskList.getOrphanContainers().size(), 1);
+ assertFalse(category.contains(newTask.getHandleIdentifier()));
+ assertTrue(taskList.getDefaultCategory().contains(newTask.getHandleIdentifier()));
+ assertEquals(1, newTask.getParentContainers().size());
+ assertEquals(taskList.getDefaultCategory(), TaskCategory.getParentTaskCategory(newTask));
+ }
+
+ /**
+ * Local tasks in a removed category should be orphaned.
+ */
+ public void testLocalTaskOrphanedInDeletedTaskCategory() {
+ assertTrue(taskList.getDefaultCategory().isEmpty());
+ TaskCategory category = new TaskCategory("taskCategoryHandle");
+ taskList.addCategory(category);
+ LocalTask newTask = new LocalTask("" + taskList.getNextLocalTaskId(), "new local task");
+ taskList.addTask(newTask, category);
+ assertTrue(taskList.getDefaultCategory().isEmpty());
+ taskList.deleteCategory(category);
+ assertTrue(taskList.getDefaultCategory().contains(newTask.getHandleIdentifier()));
+
+ }
+
+ /**
+ * Query removed with task in category, just query removed task remains.
+ */
+ public void testTaskRemovedFromQuery() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+
+ taskList.removeFromContainer(mockQuery, mockTask);
+
+ assertFalse(mockQuery.contains(mockTask.getHandleIdentifier()));
+ assertTrue(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ }
+
+ /**
+ * Query removed with task in category, just query removed task remains.
+ */
+ public void testTaskRemovedFromQueryButInCategory() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+
+ TaskCategory category = new TaskCategory("taskCategoryHandle");
+ taskList.addCategory(category);
+ taskList.addTask(mockTask, category);
+ assertTrue(category.contains(mockTask.getHandleIdentifier()));
+ taskList.removeFromContainer(mockQuery, mockTask);
+
+ assertFalse(mockQuery.contains(mockTask.getHandleIdentifier()));
+ assertEquals(2, taskList.getCategories().size());
+ assertTrue(category.contains(mockTask.getHandleIdentifier()));
+
+ //* Repository tasks within a removed category that are not in a query should be orphaned.
+
+ taskList.removeFromContainer(category, mockTask);
+ assertTrue(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ }
+
+ /**
+ * Repository tasks that exists in a query are not orphaned.
+ */
+ public void testRepositoryTaskInDeletedCategory() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+ assertEquals(1, taskList.getCategories().size());
+ TaskCategory category = new TaskCategory("taskCategoryHandle");
+ taskList.addCategory(category);
+ taskList.addTask(mockTask, category);
+ assertEquals(2, taskList.getCategories().size());
+ assertTrue(taskList.getDefaultCategory().isEmpty());
+ taskList.deleteCategory(category);
+ assertTrue(unmatchedContainer.isEmpty());
+ assertEquals(1, taskList.getCategories().size());
+ }
+
+ /**
+ * Repository tasks in deleted queries are orphaned.
+ */
+ public void testRepositoryTaskInDeletedQuery() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ assertTrue(taskList.getQueries().size() > 0);
+ taskList.addTask(mockTask, mockQuery);
+ assertTrue(mockQuery.contains(mockTask.getHandleIdentifier()));
+ assertTrue(unmatchedContainer.isEmpty());
+ taskList.deleteQuery(mockQuery);
+ assertTrue(taskList.getQueries().size() == 0);
+ assertFalse(unmatchedContainer.isEmpty());
+ }
+
+ /**
+ * Repository tasks that exist in another query are not orphaned
+ */
+ public void testRemovalOfTaskInTwoQueries() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query 1");
+ MockRepositoryQuery mockQuery2 = new MockRepositoryQuery("mock query 2");
+ taskList.addQuery(mockQuery);
+ taskList.addQuery(mockQuery2);
+ taskList.addTask(mockTask, mockQuery);
+ taskList.addTask(mockTask, mockQuery2);
+
+ taskList.removeFromContainer(mockQuery2, mockTask);
+ assertTrue(mockQuery2.isEmpty());
+ assertFalse(mockQuery.isEmpty());
+ assertTrue(unmatchedContainer.isEmpty());
+ }
+
+ /**
+ * Moving an orphan to a Category should result in the task only being present in the target Category
+ */
+ public void testMoveLocalTask() {
+ TaskCategory category = new TaskCategory("taskCategoryHandle");
+ taskList.addCategory(category);
+ LocalTask newTask = new LocalTask("" + taskList.getNextLocalTaskId(), "new local task");
+ taskList.addTask(newTask, null);
+ assertTrue(taskList.getDefaultCategory().contains(newTask.getHandleIdentifier()));
+ taskList.addTask(newTask, category);
+ assertFalse(taskList.getDefaultCategory().contains(newTask.getHandleIdentifier()));
+ }
+
+ public void testAddRepositoryTask() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+ Set<ITask> tasks = taskList.getTasks(MockRepositoryConnector.REPOSITORY_URL);
+ assertFalse(tasks.isEmpty());
+
+ RepositoryQuery query = (RepositoryQuery) mockTask.getParentContainers().iterator().next();
+ assertEquals(mockQuery, query);
+ assertFalse(query.isEmpty());
+ assertTrue(unmatchedContainer.isEmpty());
+ }
+
+ public void testMoveRepositoryTask() {
+ TaskList tasklist = taskList;
+ assertTrue(tasklist.getAllTasks().isEmpty());
+
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+
+ TaskCategory category = new TaskCategory("taskCategoryHandle");
+ taskList.addCategory(category);
+
+ taskList.addTask(mockTask, category);
+ assertTrue(taskList.getDefaultCategory().isEmpty());
+ assertTrue(category.contains(mockTask.getHandleIdentifier()));
+ assertTrue(mockQuery.contains(mockTask.getHandleIdentifier()));
+
+ }
+
+ public void testRefactorOrphanedHandle() {
+ MockTask mockTask = new MockTask("1");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+
+ taskList.removeFromContainer(mockQuery, mockTask);
+
+ assertFalse(mockQuery.contains(mockTask.getHandleIdentifier()));
+ assertTrue(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+
+ taskList.refactorRepositoryUrl(MockRepositoryConnector.REPOSITORY_URL, MockRepositoryConnector.REPOSITORY_URL
+ + "new");
+ assertTrue(taskList.getUnmatchedContainer(MockRepositoryConnector.REPOSITORY_URL + "new").contains(
+ mockTask.getHandleIdentifier()));
+ }
+
+ public void testOrphanedSubtasks() {
+ MockTask mockTask = new MockTask("1");
+ MockTask mockTask2 = new MockTask("2");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+ taskList.addTask(mockTask2, mockTask);
+
+ assertFalse(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ assertFalse(unmatchedContainer.contains(mockTask2.getHandleIdentifier()));
+
+ assertNotNull(taskList.getTask(mockTask.getHandleIdentifier()));
+ assertNotNull(taskList.getTask(mockTask2.getHandleIdentifier()));
+ assertNotNull(unmatchedContainer);
+ taskList.removeFromContainer(mockQuery, mockTask);
+ assertTrue(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ assertTrue(mockTask.contains(mockTask2.getHandleIdentifier()));
+ taskList.deleteTask(mockTask);
+ assertFalse(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ // mockTask2 should be orphaned when the parent task is deleted
+ assertTrue(unmatchedContainer.contains(mockTask2.getHandleIdentifier()));
+ }
+
+ /**
+ * If a task with subtasks falls out of a query, if its subtasks are subtasks of another task that is still around,
+ * they shouldn't be in the archive.
+ */
+ public void testOrphanedSubtaskWithOtherParent() {
+ MockTask mockTask = new MockTask("1");
+ MockTask mockTask2 = new MockTask("2");
+ MockTask mockTask3 = new MockTask("3");
+ MockRepositoryQuery mockQuery = new MockRepositoryQuery("mock query");
+ taskList.addQuery(mockQuery);
+ taskList.addTask(mockTask, mockQuery);
+ taskList.addTask(mockTask2, mockTask);
+ taskList.addTask(mockTask3, mockQuery);
+ taskList.addTask(mockTask2, mockTask3);
+ assertFalse(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ assertFalse(unmatchedContainer.contains(mockTask2.getHandleIdentifier()));
+ assertFalse(unmatchedContainer.contains(mockTask3.getHandleIdentifier()));
+
+ taskList.removeFromContainer(mockQuery, mockTask);
+ assertTrue(unmatchedContainer.contains(mockTask.getHandleIdentifier()));
+ assertTrue(mockTask.contains(mockTask2.getHandleIdentifier()));
+
+ // True since mockTask is contained and has mockTask2 as a subtask
+// assertFalse(unmatchedContainer.contains(
+// mockTask2.getHandleIdentifier()));
+
+ taskList.removeFromContainer(mockQuery, mockTask3);
+ assertTrue(unmatchedContainer.contains(mockTask3.getHandleIdentifier()));
+ assertTrue(mockTask3.contains(mockTask2.getHandleIdentifier()));
+ // True since mockTask is contained and has mockTask2 as a subtask
+// assertFalse(unmatchedContainer.contains(
+// mockTask2.getHandleIdentifier()));
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/TaskRepositoryLocationTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/TaskRepositoryLocationTest.java
new file mode 100644
index 0000000..018e977
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/core/TaskRepositoryLocationTest.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.core;
+
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.UnsupportedRequestException;
+import org.eclipse.mylyn.internal.commons.net.AuthenticatedProxy;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryLocation;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryLocationTest extends TestCase {
+
+ public void testGetCredentials() {
+ TaskRepository taskRepository = new TaskRepository("kind", "http://url");
+ taskRepository.flushAuthenticationCredentials();
+ TaskRepositoryLocation location = new TaskRepositoryLocation(taskRepository);
+ assertNull(location.getCredentials(AuthenticationType.HTTP));
+
+ taskRepository.setCredentials(AuthenticationType.HTTP, new AuthenticationCredentials("user", "pwd"), true);
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.HTTP);
+ assertNotNull(credentials);
+ assertEquals("user", credentials.getUserName());
+ assertEquals("pwd", credentials.getPassword());
+
+ assertNull(location.getCredentials(AuthenticationType.PROXY));
+
+ taskRepository.setCredentials(AuthenticationType.PROXY, new AuthenticationCredentials("user2", "pwd2"), true);
+ credentials = location.getCredentials(AuthenticationType.PROXY);
+ assertNotNull(credentials);
+ assertEquals("user2", credentials.getUserName());
+ assertEquals("pwd2", credentials.getPassword());
+ }
+
+ public void testGetProxyForHost() {
+ TaskRepository taskRepository = new TaskRepository("kind", "http://url");
+ TaskRepositoryLocation location = new TaskRepositoryLocation(taskRepository);
+
+ assertTrue(taskRepository.isDefaultProxyEnabled());
+ assertEquals(null, location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE));
+
+ taskRepository.setProperty(TaskRepository.PROXY_USEDEFAULT, "false");
+ assertFalse(taskRepository.isDefaultProxyEnabled());
+ assertEquals(null, location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE));
+
+ taskRepository.setProperty(TaskRepository.PROXY_HOSTNAME, "host");
+ taskRepository.setProperty(TaskRepository.PROXY_PORT, "1234");
+ Proxy proxy = location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE);
+ assertNotNull(proxy);
+ assertEquals(new InetSocketAddress("host", 1234), proxy.address());
+
+ taskRepository.setCredentials(AuthenticationType.PROXY, new AuthenticationCredentials("user", "pwd"), false);
+ proxy = location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE);
+ assertNotNull(proxy);
+ assertEquals(new InetSocketAddress("host", 1234), proxy.address());
+
+ assertTrue(proxy instanceof AuthenticatedProxy);
+ assertEquals("user", ((AuthenticatedProxy) proxy).getUserName());
+ assertEquals("pwd", ((AuthenticatedProxy) proxy).getPassword());
+ }
+
+ public void testGetProxyForHostEmptyProxy() {
+ TaskRepository taskRepository = new TaskRepository("kind", "http://url");
+ TaskRepositoryLocation location = new TaskRepositoryLocation(taskRepository);
+
+ taskRepository.setDefaultProxyEnabled(false);
+ assertEquals(null, location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE));
+
+ taskRepository.setProperty(TaskRepository.PROXY_HOSTNAME, "");
+ taskRepository.setProperty(TaskRepository.PROXY_PORT, "");
+ assertEquals(null, location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE));
+
+ taskRepository.setProperty(TaskRepository.PROXY_HOSTNAME, "");
+ taskRepository.setProperty(TaskRepository.PROXY_PORT, "abc");
+ assertEquals(null, location.getProxyForHost("localhost", IProxyData.HTTP_PROXY_TYPE));
+ }
+
+ public void testRequestCredentials() {
+ TaskRepository taskRepository = new TaskRepository("kind", "http://url");
+ TaskRepositoryLocation location = new TaskRepositoryLocation(taskRepository);
+ try {
+ location.requestCredentials(AuthenticationType.REPOSITORY, null, null);
+ fail("Expected UnsupportedRequestException");
+ } catch (UnsupportedRequestException expected) {
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/data/TaskDataExternalizerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/data/TaskDataExternalizerTest.java
new file mode 100644
index 0000000..3ebf0a5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/data/TaskDataExternalizerTest.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.data;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.data.ITaskDataConstants;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataExternalizer;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataState;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataExternalizerTest extends TestCase {
+
+ private class SimpleCharacterReader extends DefaultHandler {
+
+ private char ch;
+
+ public SimpleCharacterReader() {
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ Assert.assertEquals(1, length);
+ this.ch = ch[start];
+ }
+
+ public char getCharacter() {
+ return ch;
+ }
+
+ }
+
+ private final class SimpleCharacterWriter {
+ private final TransformerHandler handler;
+
+ public SimpleCharacterWriter(TransformerHandler handler) {
+ this.handler = handler;
+ }
+
+ public void write(char character) throws SAXException {
+ handler.startDocument();
+ AttributesImpl atts = new AttributesImpl();
+ handler.startElement("", "", ITaskDataConstants.ELEMENT_VALUE, atts); //$NON-NLS-1$ //$NON-NLS-2$
+ ///handler.startCDATA();
+ handler.characters(new char[] { character }, 0, 1);
+ //handler.endCDATA();
+ handler.endElement("", "", ITaskDataConstants.ELEMENT_VALUE);
+ handler.endDocument();
+ }
+ }
+
+ TaskDataExternalizer externalizer;
+
+ @Override
+ protected void setUp() throws Exception {
+ externalizer = new TaskDataExternalizer(null);
+ }
+
+ public void testMapFromLegacy() throws Exception {
+ File file = TaskTestUtil.getFile("testdata/taskdata-1.0-bug-219897.zip");
+ ZipInputStream in = new ZipInputStream(new FileInputStream(file));
+ ITaskDataWorkingCopy state;
+ try {
+ in.getNextEntry();
+ state = externalizer.readState(in);
+ } finally {
+ in.close();
+ }
+
+ TaskData taskData = state.getRepositoryData();
+ @SuppressWarnings("unused")
+ TaskMapper taskScheme = new TaskMapper(taskData);
+
+ fail("fixme");
+// RepositoryTaskData legacyData = TaskDataUtil.toLegacyData(taskData, IdentityAttributeFactory.getInstance());
+// assertEquals(taskData.getConnectorKind(), legacyData.getConnectorKind());
+// assertEquals(taskData.getRepositoryUrl(), legacyData.getRepositoryUrl());
+// assertEquals(taskData.getTaskId(), legacyData.getTaskId());
+// assertEquals(taskScheme.getTaskKind(), legacyData.getTaskKind());
+// assertEquals(taskScheme.getComments().length, legacyData.getComments().size());
+// assertEquals(taskScheme.getAttachments().length, legacyData.getAttachments().size());
+//
+// TaskData taskData2 = TaskDataUtil.toTaskData(legacyData, IdentityAttributeMapper.getInstance());
+// assertEquals(taskData.getConnectorKind(), taskData2.getConnectorKind());
+// assertEquals(taskData.getRepositoryUrl(), taskData2.getRepositoryUrl());
+// assertEquals(taskData.getTaskId(), taskData2.getTaskId());
+//
+// assertEquals(taskData.getRoot().toString(), taskData2.getRoot().toString());
+ }
+
+ public void testRead() throws Exception {
+ File file = TaskTestUtil.getFile("testdata/taskdata-1.0-bug-219897.zip");
+ ZipInputStream in = new ZipInputStream(new FileInputStream(file));
+ try {
+ in.getNextEntry();
+ @SuppressWarnings("unused")
+ ITaskDataWorkingCopy state = externalizer.readState(in);
+ } finally {
+ in.close();
+ }
+ }
+
+ public void testReadWrite() throws Exception {
+ File file = TaskTestUtil.getFile("testdata/taskdata-1.0-bug-219897.zip");
+ ZipInputStream in = new ZipInputStream(new FileInputStream(file));
+ ITaskDataWorkingCopy state;
+ try {
+ in.getNextEntry();
+ state = externalizer.readState(in);
+ } finally {
+ in.close();
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ externalizer.writeState(out, state);
+ TaskDataState state2 = externalizer.readState(new ByteArrayInputStream(out.toByteArray()));
+ assertEquals(state.getConnectorKind(), state2.getConnectorKind());
+ assertEquals(state.getRepositoryUrl(), state2.getRepositoryUrl());
+ assertEquals(state.getTaskId(), state2.getTaskId());
+
+ assertEquals(state.getRepositoryData().getRoot().toString(), state2.getRepositoryData().getRoot().toString());
+
+ }
+
+ public void testWriteandReadBadCharacter() throws Exception {
+ for (int i = 0; i < 0xFFFF; i++) {
+ char badChar = (char) i;
+
+ StringWriter stringWriter = new StringWriter();
+ SAXTransformerFactory transformerFactory = (SAXTransformerFactory) TransformerFactory.newInstance();
+ TransformerHandler handler = transformerFactory.newTransformerHandler();
+ Transformer serializer = handler.getTransformer();
+ serializer.setOutputProperty(OutputKeys.VERSION, "1.0");
+ serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
+ serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+ handler.setResult(new StreamResult(stringWriter));
+ SimpleCharacterWriter writer = new SimpleCharacterWriter(handler);
+ writer.write(badChar);
+
+ XMLReader parser = XMLReaderFactory.createXMLReader();
+ SimpleCharacterReader readHandler = new SimpleCharacterReader();
+ parser.setEntityResolver(new EntityResolver() {
+ public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+ System.out.println(publicId);
+ System.out.println(systemId);
+ return null;
+ }
+ });
+ parser.setContentHandler(readHandler);
+ parser.parse(new InputSource(new StringReader(stringWriter.getBuffer().toString())));
+ char character = readHandler.getCharacter();
+ assertEquals(badChar, character);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/performance/TaskContainerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/performance/TaskContainerTest.java
new file mode 100644
index 0000000..9f98261
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/performance/TaskContainerTest.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.performance;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.test.performance.PerformanceTestCase;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskContainerTest extends PerformanceTestCase {
+
+ int counter;
+
+ private void addChildren(AbstractTask parent, int[] childCount, int depth) {
+ for (int i = 0; i < childCount[depth]; i++) {
+ MockTask task = new MockTask("task", ++counter + "");
+ parent.internalAddChild(task);
+ if (depth < childCount.length - 1) {
+ addChildren(task, childCount, depth + 1);
+ }
+ }
+ }
+
+ public void testContains() {
+ MockTask task = new MockTask(++counter + "");
+ addChildren(task, new int[] { 1000, 10, 2 }, 0);
+
+ for (int i = 0; i < 10; i++) {
+ startMeasuring();
+ task.contains("handle");
+ stopMeasuring();
+ }
+
+ commitMeasurements();
+ assertPerformance();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/performance/TaskListPerformanceTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/performance/TaskListPerformanceTest.java
new file mode 100644
index 0000000..dfef9ec
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/performance/TaskListPerformanceTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.performance;
+
+import java.io.File;
+
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TransferList;
+import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.test.performance.PerformanceTestCase;
+
+public class TaskListPerformanceTest extends PerformanceTestCase {
+
+ private static final String TASK_LIST_4000 = "testdata/performance/tasklist-4000.xml.zip";
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ taskList = TasksUiPlugin.getTaskList();
+ taskList.reset();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ taskList.reset();
+ }
+
+ public void testReadTasksWith4000Tasks() throws Exception {
+ final File file = TaskTestUtil.getLocalFile(TASK_LIST_4000);
+ final TaskListExternalizer taskListWriter = TasksUiPlugin.getDefault().createTaskListExternalizer();
+
+ for (int i = 0; i < 10; i++) {
+ startMeasuring();
+ taskListWriter.readTaskList(new TransferList(), file);
+ stopMeasuring();
+ taskList.reset();
+ }
+
+ commitMeasurements();
+ assertPerformance();
+ }
+
+ public void testReadTaskListWith4000Tasks() throws Exception {
+ final File file = TaskTestUtil.getLocalFile(TASK_LIST_4000);
+ final TaskListExternalizer taskListWriter = TasksUiPlugin.getDefault().createTaskListExternalizer();
+
+ for (int i = 0; i < 10; i++) {
+ startMeasuring();
+ taskListWriter.readTaskList(new TransferList(), file);
+ stopMeasuring();
+ taskList.reset();
+ }
+
+ commitMeasurements();
+ assertPerformance();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/ContextPerspectiveManagerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/ContextPerspectiveManagerTest.java
new file mode 100644
index 0000000..73a8e4a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/ContextPerspectiveManagerTest.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
+import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ContextPerspectiveManagerTest extends TestCase {
+
+ private static final String ID_RESOURCE_PERSPECTIVE = "org.eclipse.ui.resourcePerspective";
+
+ private static final String ID_PLANNING_PERSPECTIVE = "org.eclipse.mylyn.tasks.ui.perspectives.planning";
+
+ private boolean previousSetting;
+
+ @Override
+ protected void setUp() throws Exception {
+ TestUtil.triggerContextUiLazyStart();
+
+ TaskTestUtil.resetTaskListAndRepositories();
+ previousSetting = ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES);
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(
+ IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES, true);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ ContextUiPlugin.getDefault().getPreferenceStore().setValue(
+ IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES, previousSetting);
+ TaskTestUtil.resetTaskListAndRepositories();
+ }
+
+ public void testRestorePerspective() throws Exception {
+ PlatformUI.getWorkbench().showPerspective(ID_RESOURCE_PERSPECTIVE, MonitorUi.getLaunchingWorkbenchWindow());
+ assertEquals(ID_RESOURCE_PERSPECTIVE, getActivePerspective());
+ TaskTask task = TaskTestUtil.createMockTask("1");
+
+ // check that perspective is not switched for new task
+ TasksUi.getTaskActivityManager().activateTask(task);
+ assertEquals(ID_RESOURCE_PERSPECTIVE, getActivePerspective());
+
+ // check if previous perspective is restored on deactivation
+ PlatformUI.getWorkbench().showPerspective(ID_PLANNING_PERSPECTIVE, MonitorUi.getLaunchingWorkbenchWindow());
+ assertEquals(ID_PLANNING_PERSPECTIVE, getActivePerspective());
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ assertEquals(ID_RESOURCE_PERSPECTIVE, getActivePerspective());
+
+ // check if perspective is restored on activation
+ TasksUi.getTaskActivityManager().activateTask(task);
+ assertEquals(ID_PLANNING_PERSPECTIVE, getActivePerspective());
+ }
+
+ // FIXME 3.3 re-enable test
+// public void testRecreateTask() throws Exception {
+// PlatformUI.getWorkbench().showPerspective(ID_RESOURCE_PERSPECTIVE, MonitorUi.getLaunchingWorkbenchWindow());
+// TaskTask task = TaskTestUtil.createMockTask("1");
+//
+// // check that deleting task switches back to original perspective
+// TasksUi.getTaskActivityManager().activateTask(task);
+// PlatformUI.getWorkbench().showPerspective(ID_PLANNING_PERSPECTIVE, MonitorUi.getLaunchingWorkbenchWindow());
+// TasksUiPlugin.getTaskActivityManager().deactivateActiveTask();
+// TasksUiPlugin.getTaskList().deleteTask(task);
+// assertEquals(ID_RESOURCE_PERSPECTIVE, getActivePerspective());
+//
+// task = TaskTestUtil.createMockTask("1");
+//
+// // check that activating new task with the same id does not switch the perspective
+// TasksUi.getTaskActivityManager().activateTask(task);
+// assertEquals(ID_RESOURCE_PERSPECTIVE, getActivePerspective());
+// }
+
+ private String getActivePerspective() {
+ return MonitorUi.getLaunchingWorkbenchWindow().getActivePage().getPerspective().getId();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/MarkTaskHandlerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/MarkTaskHandlerTest.java
new file mode 100644
index 0000000..4bc7125
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/MarkTaskHandlerTest.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import java.util.HashSet;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.commands.NotEnabledException;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler.MarkTaskCompleteHandler;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Steffen Pingel
+ */
+public class MarkTaskHandlerTest extends TestCase {
+
+ private IHandlerService handlerService;
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+
+ handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+
+ TaskRepository repository = TaskTestUtil.createMockRepository();
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+
+ // TODO figure out which test leaves a filter enabled
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(new HashSet<IWorkingSet>(0));
+ TaskTestUtil.openTasksViewInActivePerspective().clearFilters();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+ }
+
+ public void testMarkTaskCompleted() throws Exception {
+ MockRepositoryConnector.getDefault().setHasLocalCompletionState(true);
+ TaskTask task = TaskTestUtil.createMockTask("1");
+ TaskTestUtil.addAndSelectTask(task);
+ assertFalse(task.isCompleted());
+
+ handlerService.executeCommand(MarkTaskCompleteHandler.ID_COMMAND, null);
+ assertTrue(task.isCompleted());
+
+ try {
+ handlerService.executeCommand(MarkTaskCompleteHandler.ID_COMMAND, null);
+ fail("Expected NotEnabledException");
+ } catch (NotEnabledException e) {
+ // expected
+ }
+ }
+
+ public void testMarkLocalTaskCompleted() throws Exception {
+ LocalTask localTask = new LocalTask("1", "");
+ TaskTestUtil.addAndSelectTask(localTask);
+ assertFalse(localTask.isCompleted());
+
+ handlerService.executeCommand(MarkTaskCompleteHandler.ID_COMMAND, null);
+ assertTrue(localTask.isCompleted());
+
+ try {
+ handlerService.executeCommand(MarkTaskCompleteHandler.ID_COMMAND, null);
+ fail("Expected NotEnabledException");
+ } catch (NotEnabledException e) {
+ // expected
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/RetrieveTitleFromUrlTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/RetrieveTitleFromUrlTest.java
new file mode 100644
index 0000000..438e9f5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/RetrieveTitleFromUrlTest.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 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.ui;
+
+import java.lang.reflect.InvocationTargetException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.ui.util.AbstractRetrieveTitleFromUrlJob;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class RetrieveTitleFromUrlTest extends TestCase {
+
+ private String retrievedTitle;
+
+ public void testRetrieve() throws InterruptedException, InvocationTargetException {
+ final String url = "http://eclipse.org/mylyn";
+ final String knownTitle = "Eclipse Mylyn Open Source Project";
+ AbstractRetrieveTitleFromUrlJob job = new AbstractRetrieveTitleFromUrlJob(url) {
+ @Override
+ public void titleRetrieved(String title) {
+ retrievedTitle = title;
+ }
+ };
+ job.schedule();
+ job.join();
+ assertEquals(knownTitle, job.getPageTitle());
+ // process pending events
+ while (PlatformUI.getWorkbench().getDisplay().readAndDispatch()) {
+ }
+ assertEquals(knownTitle, retrievedTitle);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskAttachmentPropertyTesterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskAttachmentPropertyTesterTest.java
new file mode 100644
index 0000000..66b8d6c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskAttachmentPropertyTesterTest.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.TaskAttachment;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskAttachmentPropertyTester;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentPropertyTesterTest extends TestCase {
+
+ public void testHasUrl() {
+ TaskAttachment attachment = new StubAttachment();
+ TaskAttachmentPropertyTester tester = new TaskAttachmentPropertyTester();
+ attachment.setUrl("url");
+ assertTrue(tester.test(attachment, "hasUrl", null, Boolean.TRUE));
+ attachment.setUrl("");
+ assertTrue(tester.test(attachment, "hasUrl", null, Boolean.FALSE));
+ attachment.setUrl(null);
+ assertFalse(tester.test(attachment, "hasUrl", null, Boolean.TRUE));
+ assertFalse(tester.test(new Object(), "hasUrl", null, Boolean.TRUE));
+ }
+
+ private class StubAttachment extends TaskAttachment {
+
+ public StubAttachment() {
+ super(TaskTestUtil.createMockRepository(), TaskTestUtil.createMockTask("1"),
+ TaskTestUtil.createMockTaskData("1").getRoot());
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java
new file mode 100644
index 0000000..0666da5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskHyperlinkDetectorTest.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskHyperlinkDetectorTest extends TestCase {
+
+ protected MockRepositoryConnectorUi connectorUi;
+
+ protected TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ repository = TaskTestUtil.createMockRepository();
+ connectorUi = new MockRepositoryConnectorUi();
+ }
+
+ protected IHyperlink[] detect(final String text, int start, int length) {
+ AbstractTaskHyperlinkDetector detector = createHyperlinkDetector();
+ return detector.detectHyperlinks(new TextViewer() {
+ @Override
+ public IDocument getDocument() {
+ return new Document(text);
+ }
+ }, new Region(start, length), true);
+ }
+
+ protected AbstractTaskHyperlinkDetector createHyperlinkDetector() {
+ TaskHyperlinkDetector detector = new TaskHyperlinkDetector() {
+ @Override
+ protected TaskRepository getTaskRepository(ITextViewer textViewer) {
+ return repository;
+ }
+
+ @Override
+ protected AbstractRepositoryConnectorUi getConnectorUi(TaskRepository repository) {
+ return connectorUi;
+ }
+ };
+ return detector;
+ }
+
+ public void testMultiple() {
+ IHyperlink[] links = detect("123 456 789", 4, 5);
+ assertNotNull(links);
+ assertEquals(2, links.length);
+ assertEquals(new Region(4, 3), links[0].getHyperlinkRegion());
+ assertEquals(new Region(8, 1), links[1].getHyperlinkRegion());
+ }
+
+ public void testMultipleFullRegion() {
+ IHyperlink[] links = detect("123 456 789", 0, 11);
+ assertEquals(3, links.length);
+ assertEquals(new Region(0, 3), links[0].getHyperlinkRegion());
+ assertEquals(new Region(4, 3), links[1].getHyperlinkRegion());
+ assertEquals(new Region(8, 3), links[2].getHyperlinkRegion());
+ }
+
+ public void testSingleZeroLenghtRegion() {
+ IHyperlink[] links = detect("123 456 789", 5, 0);
+ assertEquals(1, links.length);
+ }
+
+ public void testSpaceZeroLengthRegion() {
+ IHyperlink[] links = detect("1234 789", 5, 0);
+ assertNull(links);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskListFilterTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskListFilterTest.java
new file mode 100644
index 0000000..efd3a48
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskListFilterTest.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.context.tests.UiTestUtil;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TaskWorkingSetFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListInterestFilter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.internal.Workbench;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListFilterTest extends TestCase {
+
+ private TaskListView view;
+
+ private Set<AbstractTaskListFilter> previousFilters;
+
+ private AbstractTask taskCompleted;
+
+ private AbstractTask taskIncomplete;
+
+ private AbstractTask taskOverdue;
+
+ private AbstractTask taskDueToday;
+
+ private AbstractTask taskCompletedToday;
+
+ private AbstractTask taskScheduledLastWeek;
+
+ private AbstractTask taskCompleteAndOverdue;
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskTestUtil.resetTaskListAndRepositories();
+
+ view = (TaskListView) TasksUiUtil.openTasksViewInActivePerspective();
+ assertNotNull(view);
+ previousFilters = view.getFilters();
+ view.clearFilters();
+
+ taskList = TasksUiPlugin.getTaskList();
+
+ taskCompleted = new LocalTask("1", "completed");
+ taskCompleted.setCompletionDate(TaskActivityUtil.snapForwardNumDays(Calendar.getInstance(), -1).getTime());
+ taskList.addTask(taskCompleted);
+
+ taskIncomplete = new LocalTask("2", "t-incomplete");
+ taskList.addTask(taskIncomplete);
+
+ taskOverdue = new LocalTask("3", "t-overdue");
+ taskOverdue.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday().previous());
+ taskList.addTask(taskOverdue);
+
+ taskDueToday = new LocalTask("4", "t-today");
+ taskDueToday.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday());
+ taskList.addTask(taskDueToday);
+
+ taskCompletedToday = new LocalTask("5", "t-donetoday");
+ taskCompletedToday.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday());
+ taskCompletedToday.setCompletionDate(new Date());
+ taskList.addTask(taskCompletedToday);
+
+ taskScheduledLastWeek = new LocalTask("6", "t-scheduledLastWeek");
+ taskList.addTask(taskScheduledLastWeek);
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(taskScheduledLastWeek,
+ TaskActivityUtil.getCurrentWeek().previous());
+
+ taskCompleteAndOverdue = new LocalTask("7", "t-completeandoverdue");
+ taskList.addTask(taskCompleteAndOverdue);
+ Calendar cal = TaskActivityUtil.getCalendar();
+ cal.add(Calendar.DAY_OF_MONTH, -1);
+ TasksUiPlugin.getTaskActivityManager().setDueDate(taskCompleteAndOverdue, cal.getTime());
+ taskCompleteAndOverdue.setCompletionDate(cal.getTime());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(new HashSet<IWorkingSet>(0));
+ view.clearFilters();
+ for (AbstractTaskListFilter filter : previousFilters) {
+ view.addFilter(filter);
+ }
+ }
+
+ public void testSearchScheduledWorkingSet() throws InterruptedException {
+ TaskCategory category = new TaskCategory("category");
+ taskList.addCategory(category);
+ taskList.addTask(taskOverdue, category);
+ taskList.addTask(taskIncomplete, category);
+ view.getViewer().refresh();
+ view.getViewer().expandAll();
+ List<Object> items = UiTestUtil.getAllData(view.getViewer().getTree());
+ assertTrue(items.contains(taskCompleted));
+ assertTrue(items.contains(taskOverdue));
+ IWorkingSetManager workingSetManager = Workbench.getInstance().getWorkingSetManager();
+ IWorkingSet workingSet = workingSetManager.createWorkingSet("Task Working Set", new IAdaptable[] { category });
+ workingSet.setId(TaskWorkingSetUpdater.ID_TASK_WORKING_SET);
+ assertTrue(Arrays.asList(workingSet.getElements()).contains(category));
+ workingSetManager.addWorkingSet(workingSet);
+
+ TaskWorkingSetFilter workingSetFilter = new TaskWorkingSetFilter();
+ view.addFilter(workingSetFilter);
+ HashSet<IWorkingSet> workingSets = new HashSet<IWorkingSet>(1);
+ workingSets.add(workingSet);
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(workingSets);
+ view.getFilteredTree().setFilterText("over");
+ view.getFilteredTree().getRefreshPolicy().internalForceRefresh();
+
+ items = UiTestUtil.getAllData(view.getViewer().getTree());
+ assertFalse(items.contains(taskCompleted));
+ assertTrue(items.contains(taskOverdue));
+ workingSets = new HashSet<IWorkingSet>(0);
+ view.removeFilter(workingSetFilter);
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(workingSets);
+ taskList.removeFromContainer(category, taskOverdue);
+ taskList.removeFromContainer(category, taskIncomplete);
+ view.getFilteredTree().setFilterText("");
+ view.getFilteredTree().getRefreshPolicy().internalForceRefresh();
+ }
+
+ public void testInterestFilter() {
+ TaskListInterestFilter interestFilter = new TaskListInterestFilter();
+ view.addFilter(interestFilter);
+ view.getViewer().refresh();
+ view.getViewer().expandAll();
+ List<Object> items = UiTestUtil.getAllData(view.getViewer().getTree());
+ assertFalse(items.contains(taskCompleted));
+ assertFalse(items.contains(taskIncomplete));
+ assertTrue(items.contains(taskOverdue));
+ assertTrue(items.contains(taskDueToday));
+ assertTrue(items.contains(taskCompletedToday));
+ assertTrue(items.contains(taskScheduledLastWeek));
+ assertFalse(items.contains(taskCompleteAndOverdue));
+ view.removeFilter(interestFilter);
+ }
+
+ public void testNoFilters() {
+ assertEquals("should have working set filter and orphan/archive filter: " + view.getFilters(), 2,
+ view.getFilters().size());
+ view.getViewer().refresh();
+
+ assertEquals("should only have Uncategorized folder present in stock task list: "
+ + view.getViewer().getTree().getItems(), 1, view.getViewer().getTree().getItemCount());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java
new file mode 100644
index 0000000..fb18b63
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/TaskRelationHyperlinkDetectorTest.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskRelationHyperlinkDetectorTest extends TaskHyperlinkDetectorTest {
+
+ @Override
+ protected AbstractTaskHyperlinkDetector createHyperlinkDetector() {
+ TaskRelationHyperlinkDetector detector = new TaskRelationHyperlinkDetector() {
+ @Override
+ protected TaskRepository getTaskRepository(ITextViewer textViewer) {
+ return repository;
+ }
+ };
+ return detector;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/EditorUtilTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/EditorUtilTest.java
new file mode 100644
index 0000000..7201fb4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/EditorUtilTest.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editor;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Steffen Pingel
+ */
+public class EditorUtilTest extends TestCase {
+
+ public void testSetEnabledState() {
+ Shell shell = new Shell();
+ Composite composite = new Composite(shell, SWT.NONE);
+ Label label = new Label(composite, SWT.NONE);
+
+ CommonUiUtil.setEnabled(composite, false);
+ assertFalse(composite.getEnabled());
+ assertFalse(label.getEnabled());
+
+ CommonUiUtil.setEnabled(composite, true);
+ assertTrue(composite.getEnabled());
+ assertTrue(label.getEnabled());
+
+ CommonUiUtil.setEnabled(composite, true);
+ assertTrue(composite.getEnabled());
+ assertTrue(label.getEnabled());
+ }
+
+ public void testSetEnabledStateDisabledChild() {
+ Shell shell = new Shell();
+ Composite composite = new Composite(shell, SWT.NONE);
+ Label label = new Label(composite, SWT.NONE);
+ label.setEnabled(false);
+
+ CommonUiUtil.setEnabled(composite, false);
+ assertFalse(composite.getEnabled());
+ assertFalse(label.getEnabled());
+
+ CommonUiUtil.setEnabled(composite, true);
+ assertTrue(composite.getEnabled());
+ assertFalse(label.getEnabled());
+ }
+
+ public void testSetEnabledStateDisabledParent() {
+ Shell shell = new Shell();
+ Composite composite = new Composite(shell, SWT.NONE);
+ composite.setEnabled(false);
+ Label label = new Label(composite, SWT.NONE);
+
+ CommonUiUtil.setEnabled(composite, false);
+ assertFalse(composite.getEnabled());
+ assertFalse(label.getEnabled());
+
+ CommonUiUtil.setEnabled(composite, true);
+ assertFalse(composite.getEnabled());
+ assertTrue(label.getEnabled());
+ }
+
+ public void testSetEnabledStateDisabledChildAndComposite() {
+ Shell shell = new Shell();
+ Composite composite = new Composite(shell, SWT.NONE);
+ composite.setEnabled(false);
+ Label label = new Label(composite, SWT.NONE);
+ label.setEnabled(false);
+
+ CommonUiUtil.setEnabled(composite, false);
+ assertFalse(composite.getEnabled());
+ assertFalse(label.getEnabled());
+
+ CommonUiUtil.setEnabled(composite, true);
+ assertFalse(composite.getEnabled());
+ assertFalse(label.getEnabled());
+ }
+
+ public void testSetEnabledStateDisableStateRemoved() {
+ Shell shell = new Shell();
+ Composite composite = new Composite(shell, SWT.NONE);
+ Label label = new Label(composite, SWT.NONE);
+ label.setEnabled(false);
+
+ CommonUiUtil.setEnabled(composite, false);
+ CommonUiUtil.setEnabled(composite, true);
+ // the second call should have not changed anything
+ CommonUiUtil.setEnabled(composite, true);
+ assertTrue(composite.getEnabled());
+ assertFalse(label.getEnabled());
+ }
+
+ public void testSetEnabledWithoutDisabling() {
+ Shell shell = new Shell();
+ Composite composite = new Composite(shell, SWT.NONE);
+ composite.setEnabled(false);
+
+ CommonUiUtil.setEnabled(composite, true);
+ assertFalse(composite.getEnabled());
+ CommonUiUtil.setEnabled(composite, true);
+ assertFalse(composite.getEnabled());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskEditorPartDescriptorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskEditorPartDescriptorTest.java
new file mode 100644
index 0000000..958fbcb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskEditorPartDescriptorTest.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editor;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorPartDescriptor;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorPartDescriptorTest extends TestCase {
+
+ private TaskEditorPartDescriptor descriptor1;
+
+ private TaskEditorPartDescriptor descriptor2;
+
+ @Override
+ protected void setUp() throws Exception {
+ descriptor1 = new TaskEditorPartDescriptor("id") {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return null;
+ }
+ };
+ descriptor2 = new TaskEditorPartDescriptor("id") {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ // ignore
+ return null;
+ }
+ }.setPath(AbstractTaskEditorPage.PATH_ACTIONS);
+ }
+
+ public void testEquals() {
+ assertEquals(descriptor1, descriptor2);
+ assertEquals(descriptor1.hashCode(), descriptor2.hashCode());
+ }
+
+ public void testInsertIntoSet() {
+ Set<TaskEditorPartDescriptor> set = new LinkedHashSet<TaskEditorPartDescriptor>();
+ set.add(descriptor1);
+ set.add(descriptor2);
+ assertEquals(1, set.size());
+ assertSame(descriptor1, set.iterator().next());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskUrlHyperlinkDetectorTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskUrlHyperlinkDetectorTest.java
new file mode 100644
index 0000000..2bcdb36
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/editor/TaskUrlHyperlinkDetectorTest.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * David Green - fix for bug 266693
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.tests.ui.editor;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlinkDetector;
+
+/**
+ * @author Steffen Pingel
+ * @author David Green
+ */
+public class TaskUrlHyperlinkDetectorTest extends TestCase {
+
+ protected IHyperlink[] detect(final String text, int start, int length) {
+ AbstractHyperlinkDetector detector = new TaskUrlHyperlinkDetector();
+ return detector.detectHyperlinks(new TextViewer() {
+ @Override
+ public IDocument getDocument() {
+ return new Document(text);
+ }
+ }, new Region(start, length), true);
+ }
+
+ public void testUrl() {
+ IHyperlink[] links = detect("http://foo", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://foo", ((TaskUrlHyperlink) links[0]).getURLString());
+ }
+
+ public void testInvalidUrl() {
+ IHyperlink[] links = detect("abc", 0, 0);
+ assertNull(links);
+
+ links = detect("", 0, 0);
+ assertNull(links);
+
+ links = detect(").", 0, 0);
+ assertNull(links);
+ }
+
+ public void testParenthesis() {
+ IHyperlink[] links = detect("(http://foo)", 2, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://foo", ((TaskUrlHyperlink) links[0]).getURLString());
+
+ links = detect("( http://foo)", 2, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://foo", ((TaskUrlHyperlink) links[0]).getURLString());
+
+ links = detect("( http://foo).", 2, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://foo", ((TaskUrlHyperlink) links[0]).getURLString());
+ }
+
+ public void testDetectionUsingExtent() {
+ IHyperlink[] hyperlinks = detect("aa http://www.eclipse.org test", 0, 30);
+ assertNotNull(hyperlinks);
+ assertEquals(1, hyperlinks.length);
+ }
+
+ public void testDetectionMultipleLinks() {
+ String text = "aa http://www.eclipse.org test http://www.foo.bar/baz?one=two&three=four+five#six";
+ IHyperlink[] hyperlinks = detect(text, 0, text.length());
+ assertNotNull(hyperlinks);
+ assertEquals(2, hyperlinks.length);
+ assertEquals(new Region(3, 22), hyperlinks[0].getHyperlinkRegion());
+ assertEquals(new Region(31, 50), hyperlinks[1].getHyperlinkRegion());
+ }
+
+ public void testDetectionNegativeMatchOnTrailingPunctuation() {
+ String text = "aa http://www.eclipse.org) http://www.eclipse.org. http://www.eclipse.org,";
+ IHyperlink[] hyperlinks = detect(text, 0, text.length());
+ assertNotNull(hyperlinks);
+ assertEquals(3, hyperlinks.length);
+ assertEquals(new Region(3, 22), hyperlinks[0].getHyperlinkRegion());
+ assertEquals(new Region(27, 22), hyperlinks[1].getHyperlinkRegion());
+ assertEquals(new Region(51, 22), hyperlinks[2].getHyperlinkRegion());
+ }
+
+ public void testDetection() {
+ IHyperlink[] hyperlinks = detect("aa http://www.eclipse.org test", 20, 0);
+ assertNotNull(hyperlinks);
+ assertEquals(1, hyperlinks.length);
+ }
+
+ public void testDetection2() {
+ String text = "http://www.eclipse.org";
+ IHyperlink[] hyperlinks = detect(text, 0, text.length());
+ assertNotNull(hyperlinks);
+ assertEquals(1, hyperlinks.length);
+ assertEquals(new Region(0, 22), hyperlinks[0].getHyperlinkRegion());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/util/TestTaskDataCollector.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/util/TestTaskDataCollector.java
new file mode 100644
index 0000000..91d9383
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/util/TestTaskDataCollector.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TestTaskDataCollector extends TaskDataCollector {
+
+ public List<TaskData> results = new ArrayList<TaskData>();
+
+ @Override
+ public void accept(TaskData taskData) {
+ results.add(taskData);
+ }
+
+ public Set<ITask> getTasks(AbstractRepositoryConnector connector, TaskRepository repository) {
+ Set<ITask> tasks = new LinkedHashSet<ITask>(results.size());
+ for (TaskData taskData : results) {
+ ITask task = TasksUi.getRepositoryModel().getTask(repository, taskData.getTaskId());
+ if (task == null) {
+ task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
+ if (connector != null) {
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ }
+ }
+ tasks.add(task);
+ }
+ return tasks;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/activityTests/.activity.xml.zip b/org.eclipse.mylyn.tasks.tests/testdata/activityTests/.activity.xml.zip
new file mode 100644
index 0000000..676a3e6
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/activityTests/.activity.xml.zip differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/activityTests/activity.xml.zip b/org.eclipse.mylyn.tasks.tests/testdata/activityTests/activity.xml.zip
new file mode 100644
index 0000000..fd825ed
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/activityTests/activity.xml.zip differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/legacy/tasklist_0_4_8.xml b/org.eclipse.mylyn.tasks.tests/testdata/legacy/tasklist_0_4_8.xml
new file mode 100644
index 0000000..ca6d3bb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/legacy/tasklist_0_4_8.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><TaskList Version="1.0.1"><BugzillaTaskRegistryCategory><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-18 15:05:08.174 PST" Dirty="false" Elapsed="710333" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121313" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121313" Kind="" Label="121313: PDE outline broken in 3.2 M4" LastDate="1134948318985" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-02 10:04:24.144 PST" Dirty="false" Elapsed="635683" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116503" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116503" Kind="" Label="116503: url format in bugzilla preference page is not clear" LastDate="1133571800075" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-16 12:43:14.101 PST" Dirty="false" Elapsed="10248681" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121280" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121280" Kind="" Label="121280: create tips/tricks/quickref document" LastDate="1138147878358" Notes="" Priority="P2" Reminded="true" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-28 18:34:39.585 PST" Dirty="false" Elapsed="137758" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117799" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117799" Kind="" Label="117799: UI hangs after ResourceException" LastDate="1133232080872" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="9496954" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103418" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103418" Kind="" Label="103418: improve active search UI" LastDate="1121707407100" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-22 13:55:18.46 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117587" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117587" Kind="normal" Label="117587: clean up 3.1 build process" LastDate="1139867273370" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-03 16:28:12.745 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114949" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114949" Kind="" Label="114949: When Task List is Fast View, tasks disappear" LastDate="1131081597575" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-29 15:52:29.524 PDT" Dirty="false" Elapsed="67208963" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104253" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104253" Kind="" Label="104253: make mylar bridges extension points" LastDate="1125453336058" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-07 19:34:14.962 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112016" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112016" Kind="normal" Label="112016: text selections in xml files will get recorded twice" LastDate="1139867260542" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-08 10:51:47.725 PST" Dirty="false" Elapsed="5281739" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114262" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114262" Kind="" Label="114262: Ensure reporting collectors see interaction events in ascending order" LastDate="1132011200505" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 19:21:19.225 PDT" Dirty="false" Elapsed="22906549" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111023" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111023" Kind="" Label="111023: create one-to-one association tasks hyperlinks" LastDate="1138053045868" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-20 09:58:43.217 PDT" Dirty="false" Elapsed="2427962" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110061" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110061" Kind="" Label="110061: previous task history should be persistent" LastDate="1138053061851" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="8669328" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103589" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103589" Kind="" Label="103589: task list and active search contribution items fail to show on startup" LastDate="1134708976687" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107082" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107082" Kind="normal" Label="107082: npe in IconAndMessageDialog.getSWTImage(..)" LastDate="1140115559340" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107146" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107146" Kind="" Label="107146: text selections cause too much refreshing ManifestEditor" LastDate="1124771063890" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 14:50:04.130 PDT" Dirty="false" Elapsed="2231576" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106933" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106933" Kind="" Label="106933: ensure empty root nodes not shown when Package Explorer in Working Sets mode" LastDate="1132619727013" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-14 15:30:11.390 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112718" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112718" Kind="" Label="112718: mailing list statistics should specify list" LastDate="1130341917652" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102676" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102676" Kind="" Label="102676: add support for moving from study phase1 to phase2" LastDate="1121707455991" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:01:49.698 PST" Dirty="false" Elapsed="3853192" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119372" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119372" Kind="" Label="119372: workspace move breaks mylar paths" LastDate="1134101714271" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-20 11:10:22.478 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123980" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123980" Kind="minor" Label="123980: Deleting an active task should just deactivate it." LastDate="1139969412802" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-30 11:46:34.801 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118692" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118692" Kind="" Label="118692: support low-priority test launching" LastDate="1133576860231" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-13 19:17:45.440 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109457" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109457" Kind="" Label="109457: new visualization request: timeline view" LastDate="1134154661758" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-21 12:06:28.9 PDT" Dirty="false" Elapsed="2551808" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113397" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113397" Kind="" Label="113397: race condition in tests causing failure on slow machine" LastDate="1134688304924" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-16 13:18:10.736 PST" Dirty="false" Elapsed="452841" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119368" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119368" Kind="" Label="119368: http auth dialog freezes eclipse" LastDate="1134780694517" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-14 14:36:25.782 PDT" Dirty="false" Elapsed="27005677" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112712" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112712" Kind="" Label="112712: make monitor reports HTML based" LastDate="1129688072602" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="14401" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104247" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104247" Kind="enhancement" Label="104247: support decorators in task list" LastDate="1139867211481" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-16 10:10:49.283 PDT" Dirty="false" Elapsed="581446" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109770" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109770" Kind="" Label="109770: create future plan elements in summary" LastDate="1133323627373" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-14 10:16:05.145 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111258" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111258" Kind="normal" Label="111258: verify interaction of Java active search with JSP resources" LastDate="1140232916095" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="1653362" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103585" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103585" Kind="" Label="103585: package explorer refreshes too much" LastDate="1121707389826" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-31 12:08:11.699 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114408" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114408" Kind="" Label="114408: make bug report titles consistent" LastDate="1131421227649" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 11:55:27.299 PDT" Dirty="false" Elapsed="128314" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106931" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106931" Kind="" Label="106931: Improve icons for bugzilla tasks" LastDate="1126551639568" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-19 11:29:52.14 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121381" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121381" Kind="" Label="121381: Can't open mylar task view - NoClassDefFoundError" LastDate="1136427246438" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-28 08:45:02.117 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114124" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114124" Kind="normal" Label="114124: set up monitor scripts on eclipse.org" LastDate="1140232916145" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 20:01:29.411 PDT" Dirty="false" Elapsed="0" EndDate="2005-11-07 18:08:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111025" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111025" Kind="normal" Label="111025: [Viewers] setting background color on trees with columns" LastDate="1140115552520" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-13 09:29:27.644 PST" Dirty="false" Elapsed="56431126" EndDate="" Estimated="3" Handle="https://bugs.eclipse.org/bugs-120248" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120248" Kind="" Label="120248: Context externalization optimization" LastDate="1134686229440" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="8573843" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104259" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104259" Kind="" Label="104259: mylar open type dialog integration" LastDate="1127876303230" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-09 18:03:51.700 PST" Dirty="false" Elapsed="12574542" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123173" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123173" Kind="" Label="123173: make task editor update title on description change" LastDate="1137178946080" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-11 16:22:04.322 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123527" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123527" Kind="enhancement" Label="123527: support mutliple status values" LastDate="1139867232862" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-17 15:11:31.898 PDT" Dirty="false" Elapsed="15983568" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112716" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112716" Kind="" Label="112716: Create extension points to generalize monitor" LastDate="1130018750533" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-19 13:15:48.48 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109928" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109928" Kind="normal" Label="109928: make documentation available online" LastDate="1139867253992" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-09 14:54:33.313 PST" Dirty="false" Elapsed="541729" EndDate="" Estimated="2" Handle="https://bugs.eclipse.org/bugs-117275" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117275" Kind="" Label="117275: Gradient problem" LastDate="1138061378299" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-22 11:33:38.387 PDT" Dirty="false" Elapsed="10494" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113457" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113457" Kind="" Label="113457: improve formatting of task dates" LastDate="1138053050845" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-12 07:42:37.955 PST" Dirty="false" Elapsed="11093787" EndDate="" Estimated="1" Handle="https://bugs.eclipse.org/bugs-120374" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120374" Kind="" Label="120374: task activity time reportes is too high" LastDate="1138042966244" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-05 19:42:03.528 PST" Dirty="false" Elapsed="665237" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122845" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122845" Kind="" Label="122845: "Could not save task list" NPE" LastDate="1137193138698" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.408 PST" Dirty="false" Elapsed="651" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104341" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104341" Kind="enhancement" Label="104341: add interest scaling factor control" LastDate="1139867214005" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-16 16:37:10.20 PDT" Dirty="false" Elapsed="4649526" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109693" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109693" Kind="" Label="109693: Tasklist's filter-completed doesn't work" LastDate="1128463755466" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-04 12:28:19.465 PST" Dirty="false" Elapsed="135959" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107261" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107261" Kind="" Label="107261: make task list tooltips more consistent with other Eclipse views" LastDate="1138053088269" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-24 16:50:02.624 PDT" Dirty="false" Elapsed="20330323" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107384" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107384" Kind="" Label="107384: active hierarchy can contain duplicate elements" LastDate="1126925295927" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-19 11:29:39.205 PST" Dirty="false" Elapsed="513334635" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120952" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120952" Kind="normal" Label="120952: [discussion] provide task/issue repository view and extension points" LastDate="1140030392296" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103516" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103516" Kind="enhancement" Label="103516: Should be able to map highlighters to priority" LastDate="1139867210750" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 10:47:20.132 PDT" Dirty="false" Elapsed="2366794" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107645" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107645" Kind="" Label="107645: content assist not available on initial startup" LastDate="1134773588208" Notes="" Priority="P4" Reminded="true" ReminderDate="2005-09-20 09:37:25.988 PDT" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 15:18:33.51 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124956" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124956" Kind="" Label="124956: reduce amount of refresh needed for views that are not visible" LastDate="1138146805055" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 10:06:44.227 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108011" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108011" Kind="" Label="108011: prevent automatic package explorer collapse" LastDate="1128742683567" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-14 11:27:35.636 PST" Dirty="false" Elapsed="39427" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120469" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120469" Kind="enhancement" Label="120469: Decouple bugzilla task reading" LastDate="1139867229678" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-14 18:25:27.241 PDT" Dirty="false" Elapsed="736022" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109551" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109551" Kind="" Label="109551: Provide keybinding for toggling folding" LastDate="1130545048548" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-23 09:21:27.499 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104373" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104373" Kind="normal" Label="104373: [projection] Entered text gets automatically folded away" LastDate="1140115547292" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-28 14:00:19.178 PDT" Dirty="false" Elapsed="401338" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108305" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108305" Kind="" Label="108305: Commenting from Mylar's Bugzilla UI doesn't update CC" LastDate="1138053059047" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-13 09:35:35.806 PST" Dirty="false" Elapsed="232316" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123167" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123167" Kind="" Label="123167: invalid thread access on change set management" LastDate="1137203858182" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-24 09:12:06.967 PST" Dirty="false" Elapsed="5686681" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117926" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117926" Kind="" Label="117926: clean up Mylar usage reporting" LastDate="1132892503341" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-09 18:57:36.359 PDT" Dirty="false" Elapsed="15209775" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109232" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109232" Kind="" Label="109232: package explorer refreshes too much on marker change" LastDate="1126845173531" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 12:11:16.703 PDT" Dirty="false" Elapsed="324177" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110236" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110236" Kind="" Label="110236: guard against concurrent modification of context" LastDate="1128137904850" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-07 08:41:25.237 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110472" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110472" Kind="" Label="110472: Text CVS label decorator interferes with landmark bolding" LastDate="1129311856571" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107169" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107169" Kind="normal" Label="107169: consider making ITaskListElement(s) adapt to tasks" LastDate="1139867240143" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-15 14:14:11.417 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116518" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116518" Kind="" Label="116518: Submission to Bugzilla works but displays erroneous error" LastDate="1132105376411" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104084" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104084" Kind="" Label="104084: active search jobs should be terminated before shutdown" LastDate="1129564349999" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-24 19:39:43.598 PST" Dirty="false" Elapsed="123873" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117352" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117352" Kind="" Label="117352: resources changes as part of applying patch should become interesting" LastDate="1134709524825" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106927" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106927" Kind="" Label="106927: automatic refresh of bugzilla reports fails" LastDate="1125005506463" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-18 15:25:36.657 PST" Dirty="false" Elapsed="2049534" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123882" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123882" Kind="" Label="123882: Allow to remove taks from the task activity list on task planner" LastDate="1137629533058" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 13:43:01.440 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114841" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114841" Kind="" Label="114841: live stats problem when date is set to "Last 30 days"" LastDate="1131063927948" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-05 19:02:21.62 PST" Dirty="false" Elapsed="17728913" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117035" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117035" Kind="major" Label="117035: Bugzilla plugin ignores encoding" LastDate="1139969412792" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 08:47:50.688 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114786" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114786" Kind="" Label="114786: sideitems get pushed past page border on MSIE" LastDate="1131063818310" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-03 10:51:24.240 PST" Dirty="false" Elapsed="1009231" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114966" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114966" Kind="normal" Label="114966: fix web docs support" LastDate="1139867264458" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 16:57:30.167 PDT" Dirty="false" Elapsed="1535040" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110993" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110993" Kind="" Label="110993: Super-flashy folding in Java editor" LastDate="1128377896888" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-20 11:09:06.28 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124572" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124572" Kind="" Label="124572: Task Repository View not deleting properly" LastDate="1138146801700" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-26 08:23:29.339 PDT" Dirty="false" Elapsed="8435725" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107304" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107304" Kind="" Label="107304: Make key project resources always visible" LastDate="1125085600846" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104052" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104052" Kind="enhancement" Label="104052: active search of local context" LastDate="1140232915965" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="250920" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104063" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104063" Kind="" Label="104063: toggling related element providers fails to remove the search hits" LastDate="1125010426838" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-28 18:46:06.172 PST" Dirty="false" Elapsed="3067570" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115903" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115903" Kind="" Label="115903: newly created resources should become interesting" LastDate="1133323080327" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 10:17:42.896 PST" Dirty="false" Elapsed="2435811" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115307" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115307" Kind="" Label="115307: Mylar tasks view should be in favorites" LastDate="1132004701209" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-06 16:28:29.972 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111861" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111861" Kind="normal" Label="111861: open type history might be missing some interesting types" LastDate="1140232905850" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-21 11:27:31.739 PDT" Dirty="false" Elapsed="0" EndDate="2005-11-07 13:08:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113392" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113392" Kind="normal" Label="113392: [rulers]promote annotations for folded regions" LastDate="1140115552991" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-26 11:26:23.409 PDT" Dirty="false" Elapsed="3042124" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107165" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107165" Kind="" Label="107165: disjoint/multiple selections and actions on the task list" LastDate="1134694378187" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-05 16:38:46.605 PDT" Dirty="false" Elapsed="8925291" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111708" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111708" Kind="" Label="111708: improve UI for opening tasks and contexts" LastDate="1130466659852" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 09:50:51.49 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109312" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109312" Kind="" Label="109312: improve performance and execution of task activation/deactivation" LastDate="1128647223245" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-02 16:06:08.160 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118942" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118942" Kind="" Label="118942: Send statistics feedback now dialog problems" LastDate="1134789044123" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107062" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107062" Kind="" Label="107062: support custom queries" LastDate="1124992090362" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-24 18:30:01.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117979" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117979" Kind="normal" Label="117979: new selection should always make parent interest positive" LastDate="1140232916165" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 10:17:10.990 PST" Dirty="false" Elapsed="1608401" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115156" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115156" Kind="" Label="115156: unclear UI for turning off folding" LastDate="1133573889820" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-23 18:37:40.763 PST" Dirty="false" Elapsed="778116" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117596" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117596" Kind="" Label="117596: ConcurrentModificationException at Eclipse exit" LastDate="1132802005817" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-13 15:15:51.815 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123846" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123846" Kind="" Label="123846: improve icons and labels of task repository view and wizards" LastDate="1138146785157" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 11:58:59.361 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109905" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109905" Kind="enhancement" Label="109905: [discussion] plan JIRA support" LastDate="1139867215297" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-02 16:06:12.336 PST" Dirty="false" Elapsed="406965" EndDate="" Estimated="1" Handle="https://bugs.eclipse.org/bugs-118238" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118238" Kind="" Label="118238: Bugzilla rare bug" LastDate="1133570823251" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-20 15:08:09.148 PDT" Dirty="false" Elapsed="7526294" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110111" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110111" Kind="" Label="110111: create context activity context" LastDate="1127263189654" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 10:40:00.230 PST" Dirty="false" Elapsed="1246770" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114172" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114172" Kind="" Label="114172: Switch task data directory option on the task list" LastDate="1138053080297" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 12:08:59.752 PDT" Dirty="false" Elapsed="342853" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110234" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110234" Kind="" Label="110234: guard against failure of elements to open" LastDate="1127432024980" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 14:50:44.591 PDT" Dirty="false" Elapsed="12682517" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109810" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109810" Kind="" Label="109810: Active Search / Hierarchy should display class names for methods" LastDate="1128367754203" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-27 15:36:34.237 PDT" Dirty="false" Elapsed="810483" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113877" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113877" Kind="" Label="113877: filter browser url tracking" LastDate="1138052473615" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-13 11:51:37.223 PST" Dirty="false" Elapsed="9992579" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115705" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115705" Kind="" Label="115705: dynamic change set in a sync view is not refreshed on task change" LastDate="1131998615368" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-14 10:52:24.332 PDT" Dirty="false" Elapsed="24537944" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111945" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111945" Kind="" Label="111945: Read-only activations of tasks" LastDate="1130342214489" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-20 15:17:29.33 PDT" Dirty="false" Elapsed="3107833" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110113" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110113" Kind="" Label="110113: restructure documentation" LastDate="1127273230502" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-15 21:48:54.426 PST" Dirty="false" Elapsed="58995" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-128126" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128126" Kind="normal" Label="128126: New repository validate button should validate credentials" LastDate="1140232404199" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="982424" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103729" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103729" Kind="" Label="103729: add support for disjoint selections in Mylar views" LastDate="1124994915133" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-24 20:35:54.265 PST" Dirty="false" Elapsed="1334009" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117517" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117517" Kind="normal" Label="117517: add support for commit comment templates" LastDate="1139867272459" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 11:45:45.633 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114419" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114419" Kind="" Label="114419: create flash videos for 0.4" LastDate="1131672539748" Notes="working with tasks and bug reports - navigating to reports other - junit tests of active context - commit resources in context active search - qualify member names - drag-and-drop activation" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-13 19:32:43.91 PDT" Dirty="false" Elapsed="2565729" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109459" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109459" Kind="" Label="109459: during bugzilla refresh focus is repeatedly lost.." LastDate="1138049392194" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-20 11:56:42.374 PDT" Dirty="false" Elapsed="1823323" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113270" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113270" Kind="" Label="113270: support URL monitoring for internal browser" LastDate="1129838098983" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 12:41:09.10 PDT" Dirty="false" Elapsed="15494252" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110132" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110132" Kind="" Label="110132: ClassCircularityError on startup" LastDate="1127487637375" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-17 11:40:55.180 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119554" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119554" Kind="enhancement" Label="119554: Generalize monitor uploading" LastDate="1139867121722" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 12:15:49.870 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108294" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108294" Kind="" Label="108294: improve active search laziness" LastDate="1126846166238" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-22 13:28:46.255 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110374" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110374" Kind="" Label="110374: recursive bug editor activation attempt" LastDate="1138046667917" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-28 18:30:44.98 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114281" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114281" Kind="" Label="114281: improve task list context menu action enablement" LastDate="1131417951909" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="3611363" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106929" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106929" Kind="" Label="106929: Add tooltip for description column in the tasklist" LastDate="1124994944826" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102678" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102678" Kind="enhancement" Label="102678: improve distinguishing between editor selections and edits" LastDate="1139867208777" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-20 17:01:02.813 PST" Dirty="false" Elapsed="204114" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104637" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104637" Kind="" Label="104637: Enhancment in folding" LastDate="1138046537209" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-12 19:39:18.379 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123710" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123710" Kind="" Label="123710: repository failure is silent" LastDate="1137209889077" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-17 18:41:15.820 PST" Dirty="false" Elapsed="816574" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124222" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124222" Kind="" Label="124222: BugzillaTaskExternalizer creates elements for non-bugzilla queries" LastDate="1137552846979" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104888" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104888" Kind="" Label="104888: revise docs for 0.3.2" LastDate="1122298984543" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-24 15:53:33.407 PST" Dirty="false" Elapsed="19233196" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-125095" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125095" Kind="" Label="125095: make task/report editor extensible" LastDate="1138146819756" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-29 19:31:09.56 PDT" Dirty="false" Elapsed="1164165" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108295" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108295" Kind="" Label="108295: Intrusive suggestions in Java code completion" LastDate="1125370205400" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103414" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103414" Kind="" Label="103414: create task list documentation" LastDate="1124994926570" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-24 16:50:40.949 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107949" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107949" Kind="normal" Label="107949: active hierarchy should update based on model changes" LastDate="1139867240183" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-21 18:46:37.510 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115128" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115128" Kind="" Label="115128: Toggling Mylar in outline causes the editor to change to another file" LastDate="1132633898621" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 18:02:01.596 PST" Dirty="false" Elapsed="958759" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115709" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115709" Kind="" Label="115709: Allow to specify custom template for commit comments" LastDate="1132020936187" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102090" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102090" Kind="" Label="102090: package explorer synchronization with interest filtering off" LastDate="1121707393401" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 18:10:15.606 PDT" Dirty="false" Elapsed="4066079" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110506" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110506" Kind="" Label="110506: provide context for previous/next task actions" LastDate="1138053064544" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="1162" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103107" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103107" Kind="" Label="103107: bugzilla fails to load corrupted offline reports" LastDate="1124994942363" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="110170378" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102674" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102674" Kind="" Label="102674: reduce size of taskscapes" LastDate="1128647206732" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-24 12:37:32.2 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124732" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124732" Kind="" Label="124732: Move method to open URL in internal browser" LastDate="1138151676159" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-25 13:08:38.55 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115707" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115707" Kind="" Label="115707: support multiple active change sets" LastDate="1133415963978" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-19 11:29:52.14 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121315" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121315" Kind="normal" Label="121315: Preferences: Highlighter with label "orange gradient" is rendered Brown" LastDate="1139969416758" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-02 14:27:06.22 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114849" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114849" Kind="" Label="114849: flatten interaction event summary table" LastDate="1132699262262" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103742" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103742" Kind="" Label="103742: Packages do not reappear in Java Browsing Packages view when no task activated" LastDate="1124994931247" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-22 14:42:14.656 PST" Dirty="false" Elapsed="203632" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117599" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117599" Kind="" Label="117599: improve web site and phoneix use" LastDate="1133565678262" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-23 10:00:21.311 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113476" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113476" Kind="" Label="113476: improve gradient highlighters" LastDate="1131487916357" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="2748584" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104607" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104607" Kind="" Label="104607: create FAQ document" LastDate="1127749128849" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="1150297" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103726" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103726" Kind="" Label="103726: reopened bug reports are filtered as completed" LastDate="1134688329920" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-23 14:52:26.938 PDT" Dirty="false" Elapsed="4412659" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109803" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109803" Kind="" Label="109803: tooltips on task list cause loss of focus on GTK" LastDate="1131160761127" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-25 10:45:19.516 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108021" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108021" Kind="normal" Label="108021: make monitor listen to all preference changes" LastDate="1139867241575" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-07 17:44:21.951 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-93820" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=93820" Kind="" Label="93820: [Forms] Manifest editor not sending correct selection events" LastDate="1138052566979" Notes="" Priority="P3" Reminded="true" ReminderDate="2005-11-05 10:44:12.883 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103733" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103733" Kind="" Label="103733: support gamma settings" LastDate="1124995054894" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-05 12:26:19.242 PST" Dirty="false" Elapsed="31794163" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119300" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119300" Kind="" Label="119300: fix setting of elapsed time to 0" LastDate="1134101994815" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="2869036" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104263" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104263" Kind="" Label="104263: support reminders in task list" LastDate="1124995026524" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="6676150" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106800" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106800" Kind="" Label="106800: Add an option to deactivate task without closing opened editors" LastDate="1123883880986" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-09 10:54:37.242 PST" Dirty="false" Elapsed="1123295" EndDate="" Estimated="3" Handle="https://bugs.eclipse.org/bugs-118582" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118582" Kind="minor" Label="118582: improve bugzilla client support for http auth" LastDate="1139969412792" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.408 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106899" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106899" Kind="" Label="106899: suppress filtering of active tasks" LastDate="1124994872602" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-16 20:09:10.912 PST" Dirty="false" Elapsed="45156728" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123884" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123884" Kind="" Label="123884: Collapse and sash controls in form editors" LastDate="1137808207006" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="105011" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103236" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103236" Kind="" Label="103236: make sure active reports can't disappear" LastDate="1124994893452" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 17:08:32.241 PST" Dirty="false" Elapsed="2689280" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124910" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124910" Kind="" Label="124910: improve task planner UI" LastDate="1138147875064" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103092" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103092" Kind="" Label="103092: improve category filtering and sorting" LastDate="1124994954340" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="121836" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103940" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103940" Kind="" Label="103940: update documentation for 0.3.2" LastDate="1124994912950" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-19 13:09:32.991 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124545" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124545" Kind="normal" Label="124545: [Viewers] FilteredTree refresh when filter is on" LastDate="1140115558108" Notes="" Priority="P3" Reminded="false" ReminderDate="2006-02-27 13:17:00.0 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-04 18:30:16.573 PST" Dirty="false" Elapsed="3644520" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122144" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122144" Kind="" Label="122144: eclipse deadlocked while starting up" LastDate="1136522697176" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-17 16:58:06.383 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114810" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114810" Kind="" Label="114810: Hardware and OS attributes not auto determined in New Bug Report wizard" LastDate="1133460517749" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-23 18:17:51.25 PST" Dirty="false" Elapsed="862411" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118151" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118151" Kind="" Label="118151: Auto-Opening with external editors" LastDate="1138071494864" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-13 09:09:45.834 PDT" Dirty="false" Elapsed="12909242" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108309" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108309" Kind="" Label="108309: Improve usability of "make less interesting" action" LastDate="1132531380038" Notes="" Priority="P1" Reminded="true" ReminderDate="2005-09-20 09:37:30.935 PDT" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-21 09:22:23.843 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110202" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110202" Kind="" Label="110202: bug links should be clickable in bug editor" LastDate="1138061373522" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-26 11:32:01.114 PDT" Dirty="false" Elapsed="703962" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107549" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107549" Kind="" Label="107549: Accessibility of Mylar glasses in all view..." LastDate="1125081666308" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 09:56:18.287 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108006" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108006" Kind="" Label="108006: add UI for restoring the tasklist from the backup copy" LastDate="1125448315248" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 12:35:28.227 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110701" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110701" Kind="" Label="110701: explore drag and drop integration with browser" LastDate="1132092580337" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-19 16:23:01.984 PST" Dirty="false" Elapsed="486388" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124424" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124424" Kind="" Label="124424: Write test cases for TaskReportGenerator" LastDate="1137716637594" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-30 14:23:36.844 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111266" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111266" Kind="normal" Label="111266: make Active Search work for Ant references" LastDate="1139867260522" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 07:24:24.372 PDT" Dirty="false" Elapsed="1513406" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-82752" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82752" Kind="" Label="82752: ProgramElement.getSourceSignature returns "public" for "private" members" LastDate="1124981375284" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-02 13:31:27.342 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114837" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114837" Kind="" Label="114837: stack overflow in layout" LastDate="1134154665473" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-06 19:57:17.426 PDT" Dirty="false" Elapsed="13559770" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111870" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111870" Kind="" Label="111870: hour estimates are wrong" LastDate="1138053072876" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-24 12:20:39.352 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113583" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113583" Kind="enhancement" Label="113583: improve UI for activating multiple contexts" LastDate="1139867121722" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-16 19:56:09.969 PDT" Dirty="false" Elapsed="4564380" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109815" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109815" Kind="" Label="109815: add phase 2 upgarde popup" LastDate="1127154172716" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-13 10:33:10.141 PST" Dirty="false" Elapsed="3065" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122849" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122849" Kind="normal" Label="122849: [Model Sync] Support for change sets" LastDate="1140115553091" Notes="" Priority="P3" Reminded="false" ReminderDate="2006-02-26 10:33:26.434 PST" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107754" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107754" Kind="" Label="107754: entire tasklist can be lost if mylar is closed before load completes" LastDate="1124992095549" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 08:51:07.762 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114789" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114789" Kind="" Label="114789: red background of top tables is an eyesore when page is loading" LastDate="1131063923611" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-15 10:59:41.939 PDT" Dirty="false" Elapsed="1712705" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109642" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109642" Kind="" Label="109642: mylar can block workspace on startup" LastDate="1126897611293" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-11 13:19:02.666 PDT" Dirty="false" Elapsed="11145163" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108742" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108742" Kind="" Label="108742: Eclipse's Problems filters interact badly with Mylar" LastDate="1126481794835" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-03 11:15:46.675 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111362" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111362" Kind="enhancement" Label="111362: manage resource history" LastDate="1139867215307" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-16 16:33:44.596 PST" Dirty="false" Elapsed="401446" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106990" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106990" Kind="major" Label="106990: Add support for Bugzilla integrated into Collabnet" LastDate="1139867234725" Notes="" Priority="P4" Reminded="true" ReminderDate="2006-02-13 17:00:42.132 PST" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-18 18:15:54.157 PST" Dirty="false" Elapsed="1676540" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124225" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124225" Kind="" Label="124225: generalize tasklist actions to be object contributions" LastDate="1138046528736" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-06 19:23:54.846 PDT" Dirty="false" Elapsed="1510302" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111869" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111869" Kind="" Label="111869: changing highlightre fails to refresh views" LastDate="1128724678166" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-31 11:25:14.127 PST" Dirty="false" Elapsed="187877" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114399" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114399" Kind="" Label="114399: make Get Description in New Task dialog use progress" LastDate="1138053083101" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:01:53.364 PST" Dirty="false" Elapsed="23191140" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119380" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119380" Kind="" Label="119380: MyLar Seems to Block and make Eclipse unusable when running external build" LastDate="1134160685272" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 09:13:14.543 PDT" Dirty="false" Elapsed="5852370" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110200" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110200" Kind="" Label="110200: clean up task list extension points and create JIRA plug-in" LastDate="1127502875246" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-14 18:33:41.591 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121000" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121000" Kind="normal" Label="121000: make monitor interaction event externalization consistent with core" LastDate="1139867277076" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-11 13:24:32.871 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109259" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109259" Kind="normal" Label="109259: working set filter interacts badly with mylar filter" LastDate="1139867246852" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-12 14:45:38.411 PDT" Dirty="false" Elapsed="0" EndDate="2005-10-31 17:15:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112406" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112406" Kind="minor" Label="112406: misleading exception when web browser is not available" LastDate="1140115547292" Notes="" Priority="P3" Reminded="true" ReminderDate="2005-11-08 10:48:17.818 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-14 10:29:23.176 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112669" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112669" Kind="enhancement" Label="112669: add optional categories for completed today, completed this week" LastDate="1139867219242" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 13:34:49.768 PDT" Dirty="false" Elapsed="1442227" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110248" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110248" Kind="" Label="110248: notes field needs scroll bar and word wrap" LastDate="1130161170532" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-26 09:20:12.930 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113848" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113848" Kind="enhancement" Label="113848: support attaching context to bug report" LastDate="1139867219883" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 10:03:33.505 PDT" Dirty="false" Elapsed="1250510" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109313" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109313" Kind="" Label="109313: outline view refreshes too often" LastDate="1126897669327" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-29 08:47:21.422 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118443" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118443" Kind="" Label="118443: improve task list startup performance" LastDate="1134760891962" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-15 19:37:41.591 PST" Dirty="false" Elapsed="10358805" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116493" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116493" Kind="" Label="116493: mylar reopen closed editors on task acticvation" LastDate="1132591133670" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104782" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104782" Kind="normal" Label="104782: ensure that mylar viewer management removes facilities on view close" LastDate="1139867238841" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="8805730" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102870" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102870" Kind="" Label="102870: provide documentation of known limitations" LastDate="1124994957354" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 09:05:31.714 PDT" Dirty="false" Elapsed="1395166" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110464" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110464" Kind="" Label="110464: make active search check box selections disjoint" LastDate="1127520726870" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 19:01:41.61 PST" Dirty="false" Elapsed="9627252" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119557" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119557" Kind="" Label="119557: Tasklist data doesn't change when changing workspace" LastDate="1134154737126" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-21 08:18:35.468 PDT" Dirty="false" Elapsed="589688" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110133" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110133" Kind="" Label="110133: Unhandled event loop exception" LastDate="1127316728097" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-13 19:36:49.956 PDT" Dirty="false" Elapsed="385995" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109460" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109460" Kind="normal" Label="109460: wrong incoming status on submitted reports/comments" LastDate="1139969412682" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-04 13:19:30.271 PST" Dirty="false" Elapsed="814328" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114162" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114162" Kind="" Label="114162: Export to zip files" LastDate="1138053067749" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 11:12:33.675 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-125276" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125276" Kind="normal" Label="125276: common navigation items are overly restritive and cumbersome to navigate" LastDate="1139518294878" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-16 13:18:16.334 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120502" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120502" Kind="normal" Label="120502: [performance] pauses during casual editor navigation" LastDate="1140232919580" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-01 09:48:38.114 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118884" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118884" Kind="normal" Label="118884: problems with PDE Outline update" LastDate="1140232912700" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-21 11:36:57.207 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110225" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110225" Kind="" Label="110225: plan merge with Jeff Pound's for of the Platform Team's Bugs plug-in" LastDate="1132619761563" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-29 19:33:01.991 PDT" Dirty="false" Elapsed="934144" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111167" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111167" Kind="" Label="111167: [Discussion] Re-activate last task when Eclipse starts" LastDate="1128377904669" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103234" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103234" Kind="" Label="103234: monitor seems to be storing too much for preferences" LastDate="1124994959878" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-04 17:45:27.647 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114283" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114283" Kind="" Label="114283: NPE setting colour of highlighter" LastDate="1131155763901" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 10:17:32.821 PST" Dirty="false" Elapsed="1311474" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115183" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115183" Kind="" Label="115183: "make less interesting" shortcut only decrements single element" LastDate="1132626798902" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-16 13:25:09.596 PST" Dirty="false" Elapsed="2719320" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124038" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124038" Kind="" Label="124038: new report creation wizard should require fewer clicks" LastDate="1137729238603" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-14 18:41:26.901 PDT" Dirty="false" Elapsed="550261" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110127" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110127" Kind="" Label="110127: Improvements for Alt-Click in all views with active Mylar filter" LastDate="1134752754989" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-27 20:05:17.75 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110892" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110892" Kind="normal" Label="110892: repeated searches should not induce landmark interest" LastDate="1139867260512" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103570" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103570" Kind="" Label="103570: ensure that task list writes versions" LastDate="1124994895776" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="11425145" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102663" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102663" Kind="enhancement" Label="102663: support multiple workbench windows" LastDate="1140232912760" Notes="" Priority="P3" Reminded="true" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-07 17:41:17.827 PDT" Dirty="false" Elapsed="283767" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112009" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112009" Kind="" Label="112009: editing build.properties does not induce interest properly" LastDate="1132026760442" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-26 11:40:39.530 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108163" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108163" Kind="" Label="108163: active tasks disappear" LastDate="1125085546998" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-16 14:48:14.894 PST" Dirty="false" Elapsed="2819995" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124044" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124044" Kind="" Label="124044: Task Repositories -> Properties: IndexOutOfBounds on Mac OS X" LastDate="1137454257740" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-14 09:59:40.621 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120917" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120917" Kind="normal" Label="120917: clean up collection of Mylar usage stats" LastDate="1140232919610" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="657505" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103373" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103373" Kind="" Label="103373: on task activation expand all intersting in managed views" LastDate="1121707409614" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-13 18:17:26.932 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-127609" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127609" Kind="normal" Label="127609: parametrize task completion status" LastDate="1140232905850" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-10 17:19:35.857 PST" Dirty="false" Elapsed="84689" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114435" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114435" Kind="" Label="114435: calendar month off-by-one" LastDate="1138053077814" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-30 06:47:43.416 PST" Dirty="false" Elapsed="9118991" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121976" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121976" Kind="" Label="121976: Delete Icon should be red" LastDate="1135963705640" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="4769748" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104489" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104489" Kind="" Label="104489: clean up composite context API" LastDate="1121873724873" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 11:40:59.551 PST" Dirty="false" Elapsed="1319053" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106939" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106939" Kind="normal" Label="106939: Bugzilla query refresh in a task list should use scheduler" LastDate="1139969416537" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="1151886" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104091" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104091" Kind="" Label="104091: predicted interest items are never removed from the contest" LastDate="1121711114722" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-30 11:44:13.397 PDT" Dirty="false" Elapsed="5939" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108409" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108409" Kind="" Label="108409: make usage summary limit results to accepted users" LastDate="1138049389470" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-15 14:00:12.30 PST" Dirty="false" Elapsed="2117796" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116514" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116514" Kind="normal" Label="116514: support building against IBM JDK" LastDate="1139867271688" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-19 11:29:37.362 PST" Dirty="false" Elapsed="1582" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118542" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118542" Kind="normal" Label="118542: Open/close Java files leave interest on packages" LastDate="1140232909165" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104070" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104070" Kind="" Label="104070: put back drill-down adapter on task list" LastDate="1121707402243" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-15 21:40:25.105 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121171" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121171" Kind="" Label="121171: improve task list filtering and decoration" LastDate="1136518714497" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="6520355" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104644" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104644" Kind="" Label="104644: monitor task activation" LastDate="1122298988699" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 18:46:41.538 PDT" Dirty="false" Elapsed="1062989" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111020" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111020" Kind="" Label="111020: Freeze editing Java file with outline view up" LastDate="1127960674847" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="2264" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106926" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106926" Kind="" Label="106926: too many "download failed" messages in log" LastDate="1124771110778" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-05 14:50:16.627 PST" Dirty="false" Elapsed="3883583" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119254" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119254" Kind="" Label="119254: New bug id error with Bugzilla 2.20 (parsing)" LastDate="1134162719217" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-12 10:53:40.649 PDT" Dirty="false" Elapsed="19238155" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106678" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106678" Kind="normal" Label="106678: hierarchical layout in package explorer shows uninteresting elements" LastDate="1140232909145" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-05 18:24:44.377 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107675" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107675" Kind="" Label="107675: newly created resources should become interesting" LastDate="1129564555254" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-15 14:47:31.64 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103276" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103276" Kind="" Label="103276: Temporarily disable server property page test" LastDate="1134686879024" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-20 11:08:03.919 PST" Dirty="false" Elapsed="4460377" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124676" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124676" Kind="" Label="124676: Edit on F2 in Task view truncate task description" LastDate="1137795243286" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-27 17:58:51.92 PDT" Dirty="false" Elapsed="516784" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114047" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114047" Kind="enhancement" Label="114047: allow junit test suite of current context to run with low process priority" LastDate="1139867226363" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 11:39:07.430 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124919" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124919" Kind="normal" Label="124919: planner should only report time Elapsed during plan period" LastDate="1139969417058" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 16:04:15.442 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108068" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108068" Kind="" Label="108068: update active search based on resource changes" LastDate="1125370199281" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-19 15:42:40.551 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117024" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117024" Kind="" Label="117024: Content assist doesn't show static members (eg enum instances)" LastDate="1132630525591" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106428" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106428" Kind="normal" Label="106428: Need support for deploying features depending on other features" LastDate="1140115552510" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="215661" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-105094" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105094" Kind="" Label="105094: invalidate search results" LastDate="1124994996120" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-12 07:21:41.57 PST" Dirty="false" Elapsed="6798932" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120185" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120185" Kind="" Label="120185: make task planner run with progress" LastDate="1134419352177" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="2784" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104037" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104037" Kind="" Label="104037: ensure that monitor can progress through phases" LastDate="1121707461108" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103289" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103289" Kind="" Label="103289: preserve downloaded labels during refresh" LastDate="1124994905640" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-06 09:41:07.674 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-100635" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=100635" Kind="" Label="100635: Provide live, always up to date, combined online help at eclipse.org" LastDate="1128616867704" Notes="" Priority="P3" Reminded="true" ReminderDate="2005-10-13 11:02:31.211 PDT" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-10 10:11:16.684 PST" Dirty="false" Elapsed="475364" EndDate="2006-02-15 20:13:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-126866" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126866" Kind="normal" Label="126866: NPE in new bugzilla report wizard" LastDate="1140052509929" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-10 12:34:09.281 PST" Dirty="false" Elapsed="79043613" EndDate="2006-02-14 21:18:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-125438" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125438" Kind="normal" Label="125438: make tasklist icons overlay-based" LastDate="1139970010061" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-10 16:00:00.546 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-25 15:01:28.826 PDT" Dirty="false" Elapsed="672957" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108063" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108063" Kind="normal" Label="108063: create policy for re-running active searches" LastDate="1139867242766" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-21 12:17:58.101 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113399" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113399" Kind="enhancement" Label="113399: add recommended preference changes" LastDate="1140232909115" Notes="" Priority="P2" Reminded="true" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-13 09:40:42.957 PST" Dirty="false" Elapsed="83721" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-224577" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=224577" Kind="" Label="224577: Bugzilla could use a web services interface" LastDate="1139867282053" Notes="" Priority="P4" Reminded="true" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-20 08:35:03.28 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110042" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110042" Kind="normal" Label="110042: consider limiting size of active search matches" LastDate="1139867257968" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-05 14:50:12.310 PST" Dirty="false" Elapsed="566453" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119180" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119180" Kind="" Label="119180: Cleanup of tasklist provider schema" LastDate="1133994245259" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-29 15:00:52.18 PDT" Dirty="false" Elapsed="0" EndDate="2005-09-30 09:43:00.0 PDT" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111155" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111155" Kind="normal" Label="111155: [Contributions] wrong toolbar height if first button has a pull-down menu" LastDate="1140115552540" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-04 10:48:02.103 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115117" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115117" Kind="" Label="115117: contexts junit tests failing to launch on 3.2M3" LastDate="1131938430713" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-27 18:00:09.345 PDT" Dirty="false" Elapsed="2359533" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113585" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113585" Kind="" Label="113585: Automatically fetch task title" LastDate="1138053053168" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103364" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103364" Kind="" Label="103364: add timestamp to user sign-up" LastDate="1124994983251" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-03 20:16:46.734 PST" Dirty="false" Elapsed="8880173" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115017" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115017" Kind="" Label="115017: bugzilla 2.20 hits only result in one match" LastDate="1131155473714" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-04 18:31:45.701 PST" Dirty="false" Elapsed="110174858" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121041" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121041" Kind="" Label="121041: Support more than one Bugzilla account per Workspace" LastDate="1137172947572" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-27 13:20:50.857 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113564" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113564" Kind="" Label="113564: Bugzilla provider does not work from behind firewall" LastDate="1132028533361" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="1692734" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107152" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107152" Kind="" Label="107152: make "unsure" the default for questionnaire responses" LastDate="1124771103588" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-25 07:30:34.984 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107991" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107991" Kind="normal" Label="107991: make one level of subtypes show in Active Hierarchy" LastDate="1139867240904" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-06 17:58:45.319 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111865" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111865" Kind="enhancement" Label="111865: create welcome page" LastDate="1139867219162" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-18 15:41:03.794 PST" Dirty="false" Elapsed="1301522" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121326" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121326" Kind="" Label="121326: MylarUiPlugin fails to activate if no mylar views visible" LastDate="1134950896191" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-16 13:41:20.408 PST" Dirty="false" Elapsed="1373624" EndDate="2006-02-16 16:41:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-128256" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128256" Kind="critical" Label="128256: Task list disappeared on restart" LastDate="1140126239417" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-17 19:21:28.956 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-128500" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128500" Kind="normal" Label="128500: hits should show resolved status" LastDate="1140232940390" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.408 PST" Dirty="false" Elapsed="831420" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103283" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103283" Kind="normal" Label="103283: make predicted interest errors work for plugin.xml and other resources" LastDate="1139867236367" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 10:28:56.685 PDT" Dirty="false" Elapsed="1451607" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109315" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109315" Kind="" Label="109315: package explorer fails to unlink with editor when Mylar is enabled" LastDate="1126557631304" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-04 13:23:55.739 PDT" Dirty="false" Elapsed="7464071" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111022" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111022" Kind="" Label="111022: Edit .properties file should make it be important" LastDate="1128738563993" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-09 10:54:48.599 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119553" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119553" Kind="" Label="119553: Refactor error reporting and logging support" LastDate="1134154533774" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-23 20:00:12.121 PDT" Dirty="false" Elapsed="118550" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107812" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107812" Kind="" Label="107812: add prompt to view tutorial video on phase1 start" LastDate="1126485645903" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-07 13:35:35.792 PST" Dirty="false" Elapsed="17232461" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115394" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115394" Kind="" Label="115394: improve the Task Planner reporting on activity" LastDate="1138053055822" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-13 18:15:58.940 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109454" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109454" Kind="normal" Label="109454: make online access mode to report trigger offline mode" LastDate="1139867250257" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-08 20:00:17.293 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109114" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109114" Kind="" Label="109114: command failures on startup" LastDate="1126897374142" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-11 16:44:39.983 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109262" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109262" Kind="" Label="109262: problems list filter does not retain state on startup" LastDate="1126537281236" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-19 11:29:35.700 PST" Dirty="false" Elapsed="1662" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116652" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116652" Kind="" Label="116652: Activated indicator column does not resize correctly" LastDate="1136596782292" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107081" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107081" Kind="" Label="107081: completed bugs don't filter from root" LastDate="1124771068697" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-26 15:52:27.854 PDT" Dirty="false" Elapsed="885419" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113916" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113916" Kind="" Label="113916: fix exceptions reported in logs" LastDate="1130536677341" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-19 17:30:11.868 PST" Dirty="false" Elapsed="1108444" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117100" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117100" Kind="" Label="117100: tasks view should not change its title when paused" LastDate="1132510052722" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="9465866" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102679" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102679" Kind="" Label="102679: add show filtered action to navigator" LastDate="1122066516762" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-31 08:28:22.165 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108475" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108475" Kind="" Label="108475: if active task is only under archive reports it still needs to show up" LastDate="1126200114284" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-18 10:48:12.635 PST" Dirty="false" Elapsed="1040414" EndDate="2006-02-07 03:54:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119603" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119603" Kind="normal" Label="119603: [api][content assist] allow contributions to filter and sort proposals" LastDate="1139510945170" Notes="" Priority="P3" Reminded="true" ReminderDate="2006-01-20 11:14:38.265 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 13:07:22.471 PDT" Dirty="false" Elapsed="234350" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103419" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103419" Kind="" Label="103419: improve active search infrastructure" LastDate="1125010575602" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="8776295" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104287" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104287" Kind="enhancement" Label="104287: Alt+Click does not work in the Java Browsing Perspective" LastDate="1139867211521" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 11:51:18.388 PST" Dirty="false" Elapsed="3273570" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-126842" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126842" Kind="enhancement" Label="126842: prototype JIRA support" LastDate="1140232905850" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 12:19:44.848 PDT" Dirty="false" Elapsed="15581" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109536" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109536" Kind="" Label="109536: add keybindings for common actions" LastDate="1130988941373" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 10:17:38.59 PST" Dirty="false" Elapsed="2416917" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115201" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115201" Kind="" Label="115201: Del action deletes task only on second call" LastDate="1132622491809" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 14:13:12.40 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-126237" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126237" Kind="normal" Label="126237: copying and pasting task contexts" LastDate="1140232912750" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-20 12:58:36.666 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113275" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113275" Kind="enhancement" Label="113275: improve PDE search and include manifest files" LastDate="1140232905850" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-01 08:42:22.359 PST" Dirty="false" Elapsed="803727" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114561" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114561" Kind="normal" Label="114561: restructure and fix up documentation" LastDate="1139867264137" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-22 14:11:29.324 PDT" Dirty="false" Elapsed="28067911" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113461" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113461" Kind="" Label="113461: allow mylar monitor to be disabled" LastDate="1130113992716" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 19:36:02.153 PST" Dirty="false" Elapsed="1854941" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112722" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112722" Kind="" Label="112722: adding task when drilled into a category should add it to that category" LastDate="1131036515614" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 15:05:10.808 PST" Dirty="false" Elapsed="4063139" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114853" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114853" Kind="" Label="114853: group Add actions into a submenu on the popup menu" LastDate="1130989290425" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-28 16:47:47.186 PDT" Dirty="false" Elapsed="269227" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113277" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113277" Kind="" Label="113277: Error while stopping "org.eclipse.mylyn.java_0.3.12.e31"." LastDate="1130543614295" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-09 14:53:51.633 PST" Dirty="false" Elapsed="4175748" EndDate="" Estimated="2" Handle="https://bugs.eclipse.org/bugs-119137" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119137" Kind="enhancement" Label="119137: Task does not remember perspective" LastDate="1140232915965" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-13 11:59:22.583 PST" Dirty="false" Elapsed="5766922" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123817" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123817" Kind="" Label="123817: make add of existing report use repository" LastDate="1137809376949" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 08:11:58.706 PDT" Dirty="false" Elapsed="90" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107582" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107582" Kind="" Label="107582: Implement F3 "open declaration" action for pointcuts" LastDate="1125420269367" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-13 18:48:32.309 PDT" Dirty="false" Elapsed="35045443" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109456" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109456" Kind="" Label="109456: problems list blinks in save in filtered mode" LastDate="1126893230364" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-14 10:52:31.482 PDT" Dirty="false" Elapsed="4970260" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112572" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112572" Kind="" Label="112572: allow a stats generating action to specify stats collectors" LastDate="1129326360528" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-20 10:04:13.856 PST" Dirty="false" Elapsed="8203474" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117217" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117217" Kind="" Label="117217: create action for navigating from change set to bug report" LastDate="1132531444892" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-16 11:02:39.585 PDT" Dirty="false" Elapsed="439031" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106797" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106797" Kind="" Label="106797: label decorator makes Package Explorer view flicker on marker change" LastDate="1132092845268" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 12:00:44.382 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-125959" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125959" Kind="normal" Label="125959: [OLE] in-place editor for PDFs" LastDate="1140115558959" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-13 11:10:16.216 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123813" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123813" Kind="" Label="123813: bugzilla version should be associated with repository" LastDate="1138046466267" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 12:59:36.219 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110490" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110490" Kind="" Label="110490: make the data elements of the Active Hiearchy view be java elements" LastDate="1128562010809" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103365" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103365" Kind="normal" Label="103365: monitor scrolling activity" LastDate="1139867236627" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-23 12:12:49.24 PST" Dirty="false" Elapsed="1922885" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117775" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117775" Kind="" Label="117775: navigating back can fail if element in nested class is selected" LastDate="1133576107329" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-19 17:47:54.926 PST" Dirty="false" Elapsed="14416227" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116449" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116449" Kind="" Label="116449: package explorer scrolling on activation" LastDate="1132611848731" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102680" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102680" Kind="" Label="102680: all views should de-register taskscape listeners when deactivated" LastDate="1125370254210" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-22 13:30:45.296 PDT" Dirty="false" Elapsed="1487540" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110375" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110375" Kind="" Label="110375: concurrent modification exception during Java search" LastDate="1135954299415" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-10 11:36:58.478 PST" Dirty="false" Elapsed="34706105" EndDate="2006-02-16 10:53:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-127123" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127123" Kind="normal" Label="127123: Mylar does not remember Bugzilla Repository Settings" LastDate="1140105314338" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-08 14:01:47.552 PST" Dirty="false" Elapsed="2986639" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115496" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115496" Kind="" Label="115496: ApplyMylarToPackageExplorerAction may not be fully initialized" LastDate="1133323740055" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-08 10:22:13.211 PDT" Dirty="false" Elapsed="2249987" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109016" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109016" Kind="" Label="109016: NullPointerException when building configuration" LastDate="1127403592919" Notes="" Priority="P2" Reminded="true" ReminderDate="2005-09-22 18:00:45.996 PDT" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-16 17:22:59.807 PDT" Dirty="false" Elapsed="93845" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112751" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112751" Kind="" Label="112751: temporary zip files don't get deleted" LastDate="1129564611014" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="1750957" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106930" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106930" Kind="" Label="106930: Task list is loosing its content after each restart" LastDate="1124994973027" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-20 16:10:56.490 PST" Dirty="false" Elapsed="974120" EndDate="2006-02-14 21:20:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122884" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122884" Kind="normal" Label="122884: Mylar should provide a Milestone field in the Bug entering dialog box." LastDate="1139970596464" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-13 09:34:46.4 PST" Dirty="false" Elapsed="7028571" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107487" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107487" Kind="" Label="107487: add "validate password" to bugzilla prefs page" LastDate="1137188249087" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-21 19:35:28.154 PST" Dirty="false" Elapsed="91242" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116869" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116869" Kind="" Label="116869: Mylar classpath broken when using alt install locations in e3.1.1" LastDate="1134613130129" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-14 18:01:40.986 PST" Dirty="false" Elapsed="175461" EndDate="2006-02-14 21:07:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-125982" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125982" Kind="major" Label="125982: [linux] Tooltips don't disappear" LastDate="1139969384952" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 14:46:23.443 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110731" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110731" Kind="" Label="110731: bugzilla task in category fails to activate on startup" LastDate="1128046911717" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-19 16:41:22.15 PST" Dirty="false" Elapsed="1245737" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115159" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115159" Kind="" Label="115159: could not connect to Bugzilla, could not troubleshoot" LastDate="1132630522997" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104555" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104555" Kind="" Label="104555: add mechanism for analyzing statistics per-user" LastDate="1122298957294" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-18 16:36:05.847 PDT" Dirty="false" Elapsed="8128573" EndDate="" Estimated="3" Handle="https://bugs.eclipse.org/bugs-107457" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107457" Kind="" Label="107457: Make tasklist saves more eager" LastDate="1133567856655" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 14:53:48.585 PDT" Dirty="false" Elapsed="2931195" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107810" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107810" Kind="" Label="107810: toggle of folding can cause file modification when using VSSPlugin" LastDate="1127521801865" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 18:52:38.401 PST" Dirty="false" Elapsed="2477210" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119785" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119785" Kind="" Label="119785: Endless flicker loop after CVS exception" LastDate="1134075577625" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104340" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104340" Kind="normal" Label="104340: multiple tasks active not working correctly" LastDate="1139867237619" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 10:32:58.843 PDT" Dirty="false" Elapsed="6981265" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109317" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109317" Kind="" Label="109317: inconsistent coloring in when Mylar filter is off" LastDate="1129169570136" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="799029" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103915" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103915" Kind="" Label="103915: Parameters are missing from the context assist" LastDate="1121707397366" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-08 14:24:05.886 PST" Dirty="false" Elapsed="818480" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115199" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115199" Kind="" Label="115199: Pause/Resume Capturing Context action should be on the toolbar" LastDate="1131500615341" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-27 18:42:12.994 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114050" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114050" Kind="normal" Label="114050: support plans in task list" LastDate="1139867264137" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 12:30:10.968 PDT" Dirty="false" Elapsed="2777286" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109538" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109538" Kind="" Label="109538: make active search disable when view is not active" LastDate="1126738790857" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-03 15:09:03.983 PDT" Dirty="false" Elapsed="10351623" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111390" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111390" Kind="" Label="111390: improve outline refresh lainess and ensure that outline does not set selections when link mode is off" LastDate="1128648740968" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-21 18:53:20.151 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110281" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110281" Kind="normal" Label="110281: move commons dependancies to be on SDK" LastDate="1139867260432" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104057" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104057" Kind="" Label="104057: on startup active task's context is inactive" LastDate="1121707426028" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-13 12:36:09.662 PST" Dirty="false" Elapsed="107332" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-74795" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=74795" Kind="enhancement" Label="74795: [Viewers] Generic quick filter for large tree-based views" LastDate="1139867290525" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104062" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104062" Kind="enhancement" Label="104062: in "new bug report", put the previously-submitted to components on top" LastDate="1139867210760" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 15:13:06.832 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124955" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124955" Kind="" Label="124955: modifying a task should refresh the containing query category" LastDate="1138061383156" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-08 11:52:57.262 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115535" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115535" Kind="" Label="115535: renamed perspective usage logged incorrectly" LastDate="1138052463590" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-21 11:41:31.6 PDT" Dirty="false" Elapsed="1539003" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113394" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113394" Kind="" Label="113394: refactor common per-user analysis code" LastDate="1129925458584" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-28 10:43:29.416 PDT" Dirty="false" Elapsed="4510333" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114156" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114156" Kind="" Label="114156: create new icons" LastDate="1130534618450" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-13 09:34:57.391 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123681" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123681" Kind="" Label="123681: query categories don't refresh after modification" LastDate="1137188934002" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="74535177" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103736" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103736" Kind="enhancement" Label="103736: add interest sorter to problems list" LastDate="1139867210750" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-09 14:22:59.134 PST" Dirty="false" Elapsed="0" EndDate="2006-02-16 00:43:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-127182" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127182" Kind="normal" Label="127182: bugzilla outline missing in generic task editor" LastDate="1139867126599" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 10:20:13.129 PST" Dirty="false" Elapsed="2753429" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119692" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119692" Kind="" Label="119692: tooltip showing current task summary on mylar task view icon" LastDate="1133982239215" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-02 11:45:41.677 PST" Dirty="false" Elapsed="740249" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114318" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114318" Kind="" Label="114318: Task in task list disappearing" LastDate="1131081231048" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-21 13:12:54.942 PDT" Dirty="false" Elapsed="724944" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113292" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113292" Kind="" Label="113292: Task summary editor tab for issue report web page" LastDate="1138053048471" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="2090707" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106690" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106690" Kind="" Label="106690: add "edit highlighters" button to "choose highlighter" menu" LastDate="1126663733675" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-13 15:11:00.797 PST" Dirty="false" Elapsed="5109170" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123845" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123845" Kind="" Label="123845: provide query page extensibility" LastDate="1138138923398" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-15 19:37:33.720 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116450" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116450" Kind="" Label="116450: making a resource less interesting fails to remove it from the commit set" LastDate="1132277808372" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-25 13:00:36.218 PDT" Dirty="false" Elapsed="928275" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113696" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113696" Kind="" Label="113696: make usage upload wizard aware of monitor extensions" LastDate="1130271605560" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-09 11:24:33.346 PST" Dirty="false" Elapsed="2272012" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115514" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115514" Kind="" Label="115514: Editors closed on task deactivation should be opened on reactivation" LastDate="1131584611098" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 09:14:04.591 PDT" Dirty="false" Elapsed="2832617" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110630" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110630" Kind="" Label="110630: java.lang.VerifyError with Mylar 0.3.9 on Eclipse 3.2M2" LastDate="1127760088249" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-13 10:43:34.153 PST" Dirty="false" Elapsed="175612" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123806" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123806" Kind="" Label="123806: create default perspective and shortcut locations" LastDate="1137192636346" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-26 10:54:54.462 PDT" Dirty="false" Elapsed="922376" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108158" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108158" Kind="" Label="108158: make folding state toggle with task activation" LastDate="1137785678732" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-06 08:18:19.991 PST" Dirty="false" Elapsed="1509289" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122700" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122700" Kind="" Label="122700: expose all task state editable via the form editor and improve form formatting" LastDate="1137105361317" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103422" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103422" Kind="" Label="103422: labels showing HTML characters wrong" LastDate="1124995019193" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-16 10:54:56.550 PST" Dirty="false" Elapsed="274706" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124006" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124006" Kind="" Label="124006: support sorting tasklist items as both ascending and descending" LastDate="1138147907200" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-08 08:04:38.712 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115498" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115498" Kind="normal" Label="115498: [discussion] rewind and replay of context capture" LastDate="1139867267322" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="17612758" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104110" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104110" Kind="" Label="104110: add support for resetting edges" LastDate="1125010277934" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-05 09:17:23.708 PDT" Dirty="false" Elapsed="28296573" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111603" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111603" Kind="" Label="111603: Allow unit tests in Mylar context to be run as a group" LastDate="1129201561141" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-24 16:45:30.483 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107948" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107948" Kind="" Label="107948: propagated interest sticks for error packages" LastDate="1133288110121" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-14 10:51:11.778 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109523" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109523" Kind="" Label="109523: move flash demos to downloads area" LastDate="1137104545113" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 10:16:56.770 PST" Dirty="false" Elapsed="374549" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114808" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114808" Kind="" Label="114808: Query form is hard to use under linux" LastDate="1137798886354" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-24 08:54:25.942 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113554" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113554" Kind="" Label="113554: support ajsym file generation for command line builds" LastDate="1131418209029" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-13 20:43:30.27 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109462" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109462" Kind="" Label="109462: can't change category name" LastDate="1138049395739" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="1122765" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106566" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106566" Kind="" Label="106566: make the sign-up form HTML" LastDate="1124151496496" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-18 19:49:00.645 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113031" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113031" Kind="" Label="113031: launching spring viewer causes workbench exit" LastDate="1130957199063" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 10:48:03.197 PDT" Dirty="false" Elapsed="16845435" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109521" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109521" Kind="" Label="109521: create eclipse.org update site" LastDate="1130444453371" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-30 11:19:46.799 PST" Dirty="false" Elapsed="17679767" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118461" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118461" Kind="" Label="118461: code assist for static methods/fields not working" LastDate="1134491716179" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-03 15:18:28.384 PDT" Dirty="false" Elapsed="4325210" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110747" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110747" Kind="" Label="110747: automatically open the task list when Mylar first runs" LastDate="1128393385327" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-20 15:15:18.345 PDT" Dirty="false" Elapsed="777217" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110112" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110112" Kind="" Label="110112: tasks fail to get removed from root" LastDate="1127273883301" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-27 10:58:59.749 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114009" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114009" Kind="" Label="114009: make bugzilla depdency optional" LastDate="1130466703225" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="11665515" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103748" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103748" Kind="" Label="103748: make highlighters work with de-coupled task list" LastDate="1121707417445" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-19 09:39:58.137 PDT" Dirty="false" Elapsed="6575324" EndDate="2006-02-15 20:20:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109902" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109902" Kind="normal" Label="109902: integrate reminders into the task list" LastDate="1140053722062" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 10:56:34.710 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124908" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124908" Kind="" Label="124908: improve bugzilla notification of incoming information" LastDate="1138061370538" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-30 09:26:01.8 PDT" Dirty="false" Elapsed="3165743" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111226" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111226" Kind="" Label="111226: suppress active search running if view is not active" LastDate="1128113086843" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-13 18:09:45.772 PDT" Dirty="false" Elapsed="2015840" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112019" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112019" Kind="" Label="112019: CVS text decorator applied twice on Active Search view" LastDate="1129258727032" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103440" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103440" Kind="" Label="103440: support bugzilla refresh on a standard category" LastDate="1124995016870" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102673" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102673" Kind="" Label="102673: task editor dirty state" LastDate="1124994883859" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-14 18:46:27.756 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109559" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109559" Kind="enhancement" Label="109559: add "dependant project" degree of separation" LastDate="1139867215107" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="11050791" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107463" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107463" Kind="" Label="107463: "unfiltered" view selections are reported incorrectly" LastDate="1124828168368" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-17 15:20:24.441 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116948" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116948" Kind="" Label="116948: Alt-Click in views not working under Linux" LastDate="1134773358999" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.408 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102047" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102047" Kind="" Label="102047: Drag and Drop overwrites task description" LastDate="1125370217748" Notes="" Priority="P5" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-13 13:29:05.600 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112550" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112550" Kind="" Label="112550: contentProviderClass extension point should be of kind "class"" LastDate="1130444336903" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102916" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102916" Kind="" Label="102916: split bugzilla into core and ui plugins" LastDate="1121299174811" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-24 11:09:38.698 PDT" Dirty="false" Elapsed="10291666" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107542" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107542" Kind="" Label="107542: Build errors should increase interest level for java files" LastDate="1124927231658" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-08 08:09:15.527 PDT" Dirty="false" Elapsed="1366330" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108811" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108811" Kind="" Label="108811: Installer screen freezes" LastDate="1130521761453" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="3591754" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102800" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102800" Kind="" Label="102800: selections in package explorer jump to previous location" LastDate="1123883273792" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-18 15:30:40.458 PST" Dirty="false" Elapsed="532009" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121318" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121318" Kind="" Label="121318: NumberFormatException on Preferences->Mylar->Bugzilla on Mac OS X" LastDate="1137444019938" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-23 15:31:36.796 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115885" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115885" Kind="" Label="115885: add a background questionnaire wizard page" LastDate="1138052460886" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104889" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104889" Kind="" Label="104889: differentiate between element selections of normal, decayed, interesting" LastDate="1124770953782" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-07 11:27:16.421 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-63692" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=63692" Kind="minor" Label="63692: [projection] Annotations in folded region are not rendered in overview ruler" LastDate="1140115547292" Notes="" Priority="P3" Reminded="false" ReminderDate="2006-02-21 15:02:00.0 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103588" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103588" Kind="" Label="103588: use extension points in place of ITaskListActionContributor" LastDate="1124994888375" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-11 17:45:35.99 PDT" Dirty="false" Elapsed="530042" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109147" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109147" Kind="" Label="109147: "link with editor" doesn't work" LastDate="1126486674692" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 14:13:29.665 PDT" Dirty="false" Elapsed="1570628" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110724" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110724" Kind="" Label="110724: background coloring of task list elements is wrong on 3.2" LastDate="1131418223970" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-05 12:30:52.22 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122804" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122804" Kind="" Label="122804: make bugzilla options refresh when repository is added" LastDate="1138146782242" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103728" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103728" Kind="enhancement" Label="103728: consider changing active search quick view to JavaOutlineInformationControl subclass" LastDate="1139867277356" Notes="" Priority="P5" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-17 16:45:44.521 PST" Dirty="false" Elapsed="548099" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-126271" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126271" Kind="normal" Label="126271: support import of task list and contexts" LastDate="1140230324749" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 14:52:18.756 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109804" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109804" Kind="" Label="109804: Differentiating task categories is difficult with Mylar as similar to default background on Linux-GTK" LastDate="1127519342849" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-04 18:32:26.891 PDT" Dirty="false" Elapsed="50851677" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-56779" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=56779" Kind="" Label="56779: [ajdoc] add ajdoc support for inter-type declarations and other declare forms" LastDate="1128529129351" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-04 15:08:57.194 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115179" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115179" Kind="" Label="115179: new bug creation fails on with bugzilla 2.20" LastDate="1131152072894" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-23 20:01:06.40 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117631" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117631" Kind="" Label="117631: NPE in JavaProblemListener" LastDate="1132805609229" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-03 12:37:33.521 PDT" Dirty="false" Elapsed="6079411" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111375" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111375" Kind="" Label="111375: improve laziness of managed viewer refresh" LastDate="1128377422455" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104799" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104799" Kind="normal" Label="104799: show filtered fails to clear root nodes in navigator view" LastDate="1139867239371" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-25 13:59:25.633 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113711" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113711" Kind="" Label="113711: set up automated build process" LastDate="1130453566835" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-23 14:53:37.579 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107865" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107865" Kind="" Label="107865: decrement interest fails to refresh label when not in filtered mode" LastDate="1129564567932" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-13 19:26:51.627 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112586" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112586" Kind="" Label="112586: [api] add support for toggling folding for IJavaElement's" LastDate="1129312022509" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-26 10:18:49.359 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108154" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108154" Kind="" Label="108154: navigating to previous task doesn't work if only one task has been activated then deactivated" LastDate="1125080961665" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-23 18:35:24.476 PDT" Dirty="false" Elapsed="4753561" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107809" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107809" Kind="" Label="107809: make error logging more verbose" LastDate="1124906803747" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-09 19:29:04.44 PDT" Dirty="false" Elapsed="12477313" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109235" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109235" Kind="" Label="109235: interest should be maintained across a refactoring" LastDate="1129338671240" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-24 13:51:10.473 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117374" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117374" Kind="" Label="117374: adding resources to mylar commit set should add them into task context" LastDate="1132889558336" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-04 18:40:27.441 PST" Dirty="false" Elapsed="1621530" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122706" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122706" Kind="" Label="122706: create developer FAQ" LastDate="1138146810783" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-19 20:49:41.925 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113185" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113185" Kind="" Label="113185: editor jumps to previous wrong selection when navigating" LastDate="1133546448664" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-19 10:33:55.983 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-36961" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=36961" Kind="" Label="36961: [Navigator][Plan Item] Provide a general purpose navigator" LastDate="1138052555783" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-23 11:40:59.551 PST" Dirty="false" Elapsed="305077" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123801" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123801" Kind="" Label="123801: Reminder date popup is duplicated when the combo button is pressed twice" LastDate="1138156635831" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-03 12:21:57.955 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114988" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114988" Kind="" Label="114988: a selected type can fail to show up in the open type list" LastDate="1131418052924" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-16 12:39:51.407 PST" Dirty="false" Elapsed="104549" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123883" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123883" Kind="" Label="123883: In task planner d-n-d does not work for multiple tasks" LastDate="1137444028391" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-19 15:51:42.872 PST" Dirty="false" Elapsed="749178" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116751" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116751" Kind="" Label="116751: Mylar Tests Fail Under Linux" LastDate="1137715732522" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103734" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103734" Kind="" Label="103734: add statistics generation check for phase switch" LastDate="1124995045211" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="2056367" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104873" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104873" Kind="" Label="104873: suppress active search results showing up in package explorer" LastDate="1125005457583" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 11:55:48.265 PDT" Dirty="false" Elapsed="3753301" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110688" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110688" Kind="" Label="110688: active search causes workbench freeze" LastDate="1128113033246" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-11 08:33:02.521 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109251" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109251" Kind="" Label="109251: context is not saved on shutdown or task deactivation" LastDate="1126480322578" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="true" Bugzilla="true" Complete="false" CreationDate="2006-02-16 18:40:51.820 PST" Dirty="false" Elapsed="21373066" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-126775" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126775" Kind="" Label="126775: >fix task archive and category duplication" LastDate="1140232905850" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-06 18:08:45.92 PDT" Dirty="false" Elapsed="2181507" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111866" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111866" Kind="" Label="111866: when a report is submitted, only refresh that report" LastDate="1132624870008" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-20 11:10:47.214 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120499" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120499" Kind="normal" Label="120499: Mylar should make explicitly created resources interesting, and ignore others" LastDate="1140232912730" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-20 15:58:12.906 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117233" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117233" Kind="normal" Label="117233: xml and bugzilla bridges should implement retrieving children" LastDate="1139867271718" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-14 10:17:07.275 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115041" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115041" Kind="normal" Label="115041: Task highlighters look ugly on gtk" LastDate="1139969416537" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-10 11:50:26.670 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-125936" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=125936" Kind="normal" Label="125936: add option to activate tasks on open" LastDate="1139867277116" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-31 10:23:35.516 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108487" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108487" Kind="" Label="108487: add object contributions to active views" LastDate="1128046776713" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-25 11:44:09.400 PST" Dirty="false" Elapsed="1253762" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117370" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117370" Kind="" Label="117370: commit set text is not updated when task title is changed" LastDate="1133557772856" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:01:56.989 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119646" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119646" Kind="" Label="119646: Mylar deadlocked eclipse while deleting a file" LastDate="1134060189346" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 11:49:29.898 PDT" Dirty="false" Elapsed="1387152" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109530" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109530" Kind="" Label="109530: all hits opened via Task List could become reports" LastDate="1138169636475" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-21 11:02:05.725 PDT" Dirty="false" Elapsed="46267188" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113386" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113386" Kind="" Label="113386: support viewing of web docs in context" LastDate="1130202930219" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-23 15:15:39.41 PST" Dirty="false" Elapsed="2766841" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124768" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124768" Kind="" Label="124768: Back button broken in the add repository query wizard" LastDate="1138060040245" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-05 12:37:06.72 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119307" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119307" Kind="normal" Label="119307: resources and other moved elements should maintain interest" LastDate="1139867274171" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-16 20:04:56.997 PDT" Dirty="false" Elapsed="3571925" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109816" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109816" Kind="" Label="109816: active search labels blink on every selection" LastDate="1127450562857" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-18 08:34:03.769 PST" Dirty="false" Elapsed="491120" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124321" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124321" Kind="normal" Label="124321: explore making local tasks be a repository" LastDate="1139969416998" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-06 11:06:13.796 PDT" Dirty="false" Elapsed="2254386" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111813" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111813" Kind="" Label="111813: make error interest a preference" LastDate="1129258604866" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-05 12:29:44.777 PST" Dirty="false" Elapsed="17486191" EndDate="" Estimated="1" Handle="https://bugs.eclipse.org/bugs-119301" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119301" Kind="" Label="119301: improve task planner activity period and UI" LastDate="1134690087197" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="951" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104089" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104089" Kind="" Label="104089: on bug change refresh" LastDate="1124994985755" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-12 18:48:16.777 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112424" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112424" Kind="minor" Label="112424: test for failure of non-filtered mode refresh" LastDate="1139867236367" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-08 13:12:31.127 PST" Dirty="false" Elapsed="379412" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119835" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119835" Kind="" Label="119835: Compile eror on latest integration builds" LastDate="1134076568861" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-12 10:18:13.460 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109314" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109314" Kind="normal" Label="109314: auto folding hides annotation matches" LastDate="1139867249686" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-09 10:54:19.457 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118581" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118581" Kind="" Label="118581: All tests failing on shared task folder test" LastDate="1134154633467" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-18 16:10:00.648 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124420" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124420" Kind="" Label="124420: allow task times to be refreshed in editors" LastDate="1138061385589" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-05 20:01:22.484 PDT" Dirty="false" Elapsed="14135329" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111722" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111722" Kind="" Label="111722: reactivating multiple context results in no editors opened" LastDate="1132022966266" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-09 10:55:10.911 PST" Dirty="false" Elapsed="4221393" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119672" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119672" Kind="" Label="119672: No Status set on new bugs created through new Bugtask Wizard" LastDate="1134165750085" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-02 12:05:20.848 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122469" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122469" Kind="enhancement" Label="122469: [performance] create structure bridge cache" LastDate="1139867229678" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-23 10:26:17.146 PST" Dirty="false" Elapsed="1769823" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124224" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124224" Kind="" Label="124224: Allow to edit priorities in the task planner" LastDate="1138061380642" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-23 07:43:46.565 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113471" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113471" Kind="" Label="113471: remove log file functionality" LastDate="1130114103626" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106924" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106924" Kind="" Label="106924: npe when no products are available" LastDate="1124771124678" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-19 21:17:11.226 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113187" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113187" Kind="normal" Label="113187: make content type an extension, not API" LastDate="1139867264077" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-02 10:04:19.808 PST" Dirty="false" Elapsed="1071491" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116488" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116488" Kind="" Label="116488: Priority dropdown in Tasks View behaves incorrectly" LastDate="1134772361485" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-09 15:19:01.310 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109214" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109214" Kind="normal" Label="109214: create active serach UI test harness" LastDate="1139867244118" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-29 12:50:24.605 PST" Dirty="false" Elapsed="229059" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118513" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118513" Kind="" Label="118513: navigator should automatically expand on context activation" LastDate="1136230714959" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-20 14:07:23.534 PDT" Dirty="false" Elapsed="1723173" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113111" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113111" Kind="" Label="113111: JDT failing on open type (ctrl+shit+T)" LastDate="1130537425697" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-04 15:57:43.268 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111540" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111540" Kind="enhancement" Label="111540: add overlay to indicate task completion" LastDate="1139867217160" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 18:27:37.855 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115931" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115931" Kind="" Label="115931: allow customized monitor plugins to specify a version number" LastDate="1138052466054" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102946" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102946" Kind="" Label="102946: provide unified utility for InteractionEvent externalization" LastDate="1124994924116" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="1285688" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107055" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107055" Kind="" Label="107055: Task List Filter" LastDate="1124232070888" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-19 17:51:47.41 PDT" Dirty="false" Elapsed="50173973" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106257" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106257" Kind="" Label="106257: Proposed enhancement: Decouple UBC study" LastDate="1127493660385" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-21 13:04:20.412 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113408" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113408" Kind="" Label="113408: refactor coupling between tasklist, ui, and bugzilla" LastDate="1138041607861" Notes="" Priority="P5" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-06 17:33:53.494 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111864" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111864" Kind="enhancement" Label="111864: make open type history sorting be based on interest" LastDate="1139867218882" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-04 18:30:12.47 PST" Dirty="false" Elapsed="778837" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121448" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121448" Kind="" Label="121448: ConcurrentModificationException when "Updating Change Sets for CVS Workspace"" LastDate="1136592991580" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 18:16:58.654 PDT" Dirty="false" Elapsed="351746" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110991" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110991" Kind="" Label="110991: Shouldn't have to activate a task before choosing a highlighter" LastDate="1127957287806" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-25 13:08:33.679 PST" Dirty="false" Elapsed="7194593" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112593" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112593" Kind="" Label="112593: Problems found by FindBugs" LastDate="1132965949120" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-20 11:31:05.686 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124702" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124702" Kind="normal" Label="124702: [projection] redraw problem with JavaEditor.resetProject()" LastDate="1140115558879" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 08:38:12.177 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119305" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119305" Kind="" Label="119305: cannot find eithics/consent form (.html file)" LastDate="1138052468417" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-07 18:46:08.121 PDT" Dirty="false" Elapsed="10291154" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111388" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111388" Kind="" Label="111388: Add "Link With Editor" button to Active Search view" LastDate="1134761960409" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 08:37:19.580 PDT" Dirty="false" Elapsed="8243956" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110508" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110508" Kind="" Label="110508: Allow drag-n-drop to Active Search to create landmark" LastDate="1127763670149" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-12 12:46:58.553 PDT" Dirty="false" Elapsed="844674" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112374" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112374" Kind="" Label="112374: Mylar fails ungracefully when mozilla is not found" LastDate="1129201817399" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103537" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103537" Kind="" Label="103537: password shows up in query string when internal browser used" LastDate="1124994881665" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 11:12:05.324 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-127135" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127135" Kind="normal" Label="127135: improve bug search integration" LastDate="1139515114565" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-16 12:29:06.883 PST" Dirty="false" Elapsed="3138419" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121221" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121221" Kind="" Label="121221: Stack traces in Eclipse log" LastDate="1135020566487" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-27 15:58:24.60 PDT" Dirty="false" Elapsed="12167364" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114040" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114040" Kind="enhancement" Label="114040: imporove web docs integration" LastDate="1139867225471" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-14 20:59:58.959 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116369" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116369" Kind="" Label="116369: times are wrong in comments" LastDate="1132105119201" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-16 11:07:08.462 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124011" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124011" Kind="" Label="124011: add support for exporting planner data" LastDate="1138147871879" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-06 19:19:16.210 PST" Dirty="false" Elapsed="10065326" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-119556" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119556" Kind="" Label="119556: fix task list drag and drop" LastDate="1133931011564" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-11 08:36:15.319 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109252" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109252" Kind="" Label="109252: active task not consistently highlighted" LastDate="1126482418232" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="649273" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104783" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104783" Kind="enhancement" Label="104783: landmarks blink on save" LastDate="1139867215107" Notes="" Priority="P4" Reminded="true" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.408 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103235" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103235" Kind="" Label="103235: support monitoring multiple workbench windows" LastDate="1124994874946" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-23 07:24:48.77 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113470" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113470" Kind="enhancement" Label="113470: apply mylar to task list" LastDate="1139867219303" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102668" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102668" Kind="" Label="102668: Provide mailing list statistics in the Committer tools" LastDate="1129688008560" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-27 19:28:58.498 PDT" Dirty="false" Elapsed="1836552" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-113985" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=113985" Kind="" Label="113985: Too much expansion in Package Explorer" LastDate="1130468431219" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.408 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104553" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104553" Kind="" Label="104553: after new report is created via task list, open it" LastDate="1121906604536" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:02:00.694 PST" Dirty="false" Elapsed="5410856" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118584" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118584" Kind="" Label="118584: Mylar task context and change set disagree" LastDate="1134014468601" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-17 08:49:53.754 PDT" Dirty="false" Elapsed="382590" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112812" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112812" Kind="" Label="112812: deactivation doesn't add task to history" LastDate="1138053075470" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-13 18:56:54.580 PST" Dirty="false" Elapsed="4342784" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-120790" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=120790" Kind="" Label="120790: recursive editor activation attempt with MyEclipse" LastDate="1134533853759" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 12:06:55.802 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109534" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109534" Kind="" Label="109534: add "remove from this category" action" LastDate="1126846132910" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-24 17:00:28.224 PDT" Dirty="false" Elapsed="5441527" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107459" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107459" Kind="" Label="107459: Deactivate mylar filter in all views on task deactivation" LastDate="1124993586984" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-20 08:23:50.271 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110037" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110037" Kind="normal" Label="110037: find referencing contexts" LastDate="1139867256136" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-30 20:06:13.461 PDT" Dirty="false" Elapsed="135417" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108441" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108441" Kind="normal" Label="108441: make relation providers extension point based" LastDate="1139867244108" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-29 15:23:50.539 PDT" Dirty="false" Elapsed="6230" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-107348" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=107348" Kind="major" Label="107348: Mylar should not increase interest when scrolling trough search results" LastDate="1139867234725" Notes="" Priority="P4" Reminded="true" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-04 17:11:32.481 PDT" Dirty="false" Elapsed="3807715" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110511" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110511" Kind="" Label="110511: Dragging from Active search does not work" LastDate="1128474571283" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-28 13:59:07.895 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114254" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114254" Kind="enhancement" Label="114254: create new landmark manipulation icons and fix names" LastDate="1139867279519" Notes="" Priority="P5" Reminded="true" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-30 09:50:19.721 PDT" Dirty="false" Elapsed="233265" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108398" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108398" Kind="" Label="108398: on reactivation of context state appears to be lost" LastDate="1128654257120" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-19 11:29:52.14 PST" Dirty="false" Elapsed="4736409" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121208" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121208" Kind="" Label="121208: Option to open bugzilla task automatically in external browser" LastDate="1136509161747" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-30 10:57:21.474 PDT" Dirty="false" Elapsed="6176261" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108408" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108408" Kind="" Label="108408: don't allow non-existing elements to be landmarks" LastDate="1126839784231" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-05 13:47:31.366 PST" Dirty="false" Elapsed="9910820" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-122795" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=122795" Kind="" Label="122795: Unable to remove tasks from root category" LastDate="1136514758269" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-03 15:11:50.175 PST" Dirty="false" Elapsed="1575775" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114930" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114930" Kind="" Label="114930: support Eclipse 3.2M3" LastDate="1131064042392" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-09 09:50:39.374 PST" Dirty="false" Elapsed="5017180" EndDate="" Estimated="2" Handle="https://bugs.eclipse.org/bugs-119614" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=119614" Kind="" Label="119614: support Eclipse 3.2M4" LastDate="1134686110769" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104074" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104074" Kind="" Label="104074: make all Java active search categories one and add drop-downs" LastDate="1121745262596" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="33181410" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106762" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106762" Kind="" Label="106762: add within user analysis of edit ratio" LastDate="1124852156624" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-29 20:03:31.733 PST" Dirty="false" Elapsed="5654594" EndDate="" Estimated="1" Handle="https://bugs.eclipse.org/bugs-118541" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118541" Kind="" Label="118541: mylar is tracking context with no active task" LastDate="1133568236852" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-19 11:29:52.14 PST" Dirty="false" Elapsed="44885" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121329" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121329" Kind="normal" Label="121329: ensure that there are no leaks of Color and Image" LastDate="1140232912740" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-19 11:29:52.14 PST" Dirty="false" Elapsed="81568" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121442" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121442" Kind="normal" Label="121442: Active Search hogs the CPU" LastDate="1140232919800" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106925" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106925" Kind="" Label="106925: error stopping bugzilla plug-in" LastDate="1124771118279" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="2182809" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103288" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103288" Kind="" Label="103288: "close all editors" not closing all" LastDate="1121884443786" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-27 18:04:28.948 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114048" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114048" Kind="" Label="114048: new bug wizard blank when no bugzilla credentials set" LastDate="1138049265211" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-16 11:18:16.242 PDT" Dirty="false" Elapsed="2968359" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109783" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109783" Kind="" Label="109783: provide indication of whether task has context" LastDate="1138053070533" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-19 16:49:46.631 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124567" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124567" Kind="" Label="124567: task description get truncated on save" LastDate="1137784331875" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-11-20 12:54:53.400 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-117225" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=117225" Kind="" Label="117225: periodic "SWTError: No more handles" error" LastDate="1133546533326" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 19:17:03.408 PDT" Dirty="false" Elapsed="621484" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-111021" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=111021" Kind="" Label="111021: NPE in TaskSummaryEditor.addLinkToTable" LastDate="1129564720922" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-26 12:53:38.685 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110711" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110711" Kind="" Label="110711: add support for eclipse 3.2 problem filters" LastDate="1132014458600" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-29 16:50:57.786 PDT" Dirty="false" Elapsed="31866" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123" Kind="" Label="123: Synchronize View: files nodes in tree should provide replace with action (1GEPBKL)" LastDate="1128037857786" Notes="" Priority="P5" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.438 PST" Dirty="false" Elapsed="2332915" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102662" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102662" Kind="" Label="102662: create summary statistics for perspective usage" LastDate="1138052471041" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-10 13:49:06.255 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123330" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123330" Kind="normal" Label="123330: temporarily unfiltered nodes stick if not selected" LastDate="1140232919800" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-01-09 08:50:33.774 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-123120" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=123120" Kind="enhancement" Label="123120: create full-screen screenshots of Mylar usage" LastDate="1139867232552" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-28 17:14:50.263 PDT" Dirty="false" Elapsed="7785777" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-110957" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=110957" Kind="" Label="110957: Crashes, slowness in XML outline" LastDate="1128137750017" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.418 PST" Dirty="false" Elapsed="1022350" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104526" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104526" Kind="" Label="104526: make highlighters and clear context action use task list extension points" LastDate="1121906627809" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-14 11:50:29.244 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106862" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106862" Kind="" Label="106862: use task description as comments in CVS commit" LastDate="1131570377036" Notes="" Priority="P2" Reminded="true" ReminderDate="2005-09-20 09:37:29.433 PDT" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-15 11:11:42.135 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109643" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109643" Kind="normal" Label="109643: improve active search invalidation for calls" LastDate="1139867253141" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-16 19:08:54.375 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121309" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121309" Kind="normal" Label="121309: improve monitor upload facility" LastDate="1140232919620" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 11:20:18.877 PDT" Dirty="false" Elapsed="700272" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106938" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106938" Kind="" Label="106938: Implement "new" marker for Bugzilla query" LastDate="1126551484625" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 09:47:52.392 PDT" Dirty="false" Elapsed="74286824" EndDate="" Estimated="4" Handle="https://bugs.eclipse.org/bugs-109311" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109311" Kind="" Label="109311: migrate folding to 3.2M3 APIs" LastDate="1137725796794" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-09-15 14:23:01.261 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109678" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109678" Kind="normal" Label="109678: create mylar perspectives" LastDate="1139867253231" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-12 19:08:21.53 PDT" Dirty="false" Elapsed="3731636" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109348" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109348" Kind="" Label="109348: streamline date chooser" LastDate="1126581986571" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-21 18:39:40.130 PST" Dirty="false" Elapsed="2049888" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-116535" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116535" Kind="" Label="116535: Bugzilla Editor shows incorrect time for comments" LastDate="1132630244116" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-13 17:32:30.795 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115795" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115795" Kind="" Label="115795: Predicted interest of errors not showing errors" LastDate="1132619758398" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-03 20:21:05.356 PST" Dirty="false" Elapsed="498822" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-115018" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=115018" Kind="" Label="115018: integrate web browser for Bugzilla reports" LastDate="1131079718403" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-19 11:29:52.14 PST" Dirty="false" Elapsed="222633" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121333" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121333" Kind="" Label="121333: Highlighter colour selection dialog doesn't use current value" LastDate="1136564220957" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-05 14:50:07.43 PST" Dirty="false" Elapsed="1514363" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118885" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118885" Kind="" Label="118885: Decouple task list and context reading from Eclipse" LastDate="1134068245580" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-102689" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=102689" Kind="" Label="102689: control enablement of Mylar actions" LastDate="1124995008858" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-12 16:28:59.788 PDT" Dirty="false" Elapsed="58190273" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112233" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112233" Kind="normal" Label="112233: [improve interaction for filtered element navigation" LastDate="1140232909145" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-01 08:43:24.188 PST" Dirty="false" Elapsed="5742920" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114562" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114562" Kind="" Label="114562: add basic support for Bugzilla 2.20" LastDate="1131078198688" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-13 14:47:38.282 PDT" Dirty="false" Elapsed="38612266" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112563" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112563" Kind="" Label="112563: create html structure bridge to track URL navigation" LastDate="1129833854989" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-09-11 16:15:06.783 PDT" Dirty="false" Elapsed="373657" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-109261" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=109261" Kind="" Label="109261: offline reports pops up repeatedly" LastDate="1126485997969" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="0" EndDate="2005-08-22 18:29:00.0 PDT" Estimated="0" Handle="https://bugs.eclipse.org/bugs-79112" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=79112" Kind="normal" Label="79112: [1.5] [model] accessing annotation on Java elements" LastDate="1140115547292" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-08-25 15:57:14.377 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-108067" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=108067" Kind="normal" Label="108067: when activating a new report automatically populate context with stack" LastDate="1139867243367" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-31 11:28:45.241 PST" Dirty="false" Elapsed="30527875" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114401" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114401" Kind="" Label="114401: support creating new web linked tasks via drag-and-drop" LastDate="1137632099839" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-13 12:00:52.496 PDT" Dirty="false" Elapsed="8720224" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-106935" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=106935" Kind="enhancement" Label="106935: [discussion] add provider for Visualizer" LastDate="1139867121732" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-10-31 10:32:52.101 PST" Dirty="false" Elapsed="2157889" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-114388" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=114388" Kind="" Label="114388: create phoenix based web site" LastDate="1130961223680" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="11007777" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-105516" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105516" Kind="" Label="105516: package explorer shows nothing upon eclipse startup unless mylar task list is active" LastDate="1134708966282" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-16 09:12:23.347 PST" Dirty="false" Elapsed="4080771" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-121238" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=121238" Kind="" Label="121238: fix overdue filtering and and enable dismissing tasks" LastDate="1134764209963" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-08-25 07:13:33.826 PDT" Dirty="false" Elapsed="7100" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-82730" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=82730" Kind="" Label="82730: investigate incomplete class index when using 1.5" LastDate="1124979213826" Notes="" Priority="P2" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-103237" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=103237" Kind="" Label="103237: provide mechanism to back up all task scapes, tasklist etc." LastDate="1124995043027" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-16 11:20:59.780 PST" Dirty="false" Elapsed="6014026" EndDate="2006-02-16 19:14:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-128259" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128259" Kind="enhancement" Label="128259: Mylar Task List should expand tree to show tasks with active contexts" LastDate="1140117766213" Notes="" Priority="P3" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-14 18:07:09.442 PDT" Dirty="false" Elapsed="6755653" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-112721" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=112721" Kind="normal" Label="112721: handle interest level for type refactorings and element deletion" LastDate="1139867262204" Notes="" Priority="P4" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="179808" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-105097" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=105097" Kind="" Label="105097: add back/forward buttons to task list" LastDate="1124995040554" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-12-02 10:04:59.635 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118007" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118007" Kind="enhancement" Label="118007: Ability to selectively add resources (files/folders) to context" LastDate="1140232909135" Notes="" Priority="P2" Reminded="true" ReminderDate="" offlineSyncState="INCOMING"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-11-30 11:19:55.331 PST" Dirty="false" Elapsed="1716919" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-118478" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118478" Kind="" Label="118478: editor reopened on "clear task context action"" LastDate="1133556006206" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2005-10-06 10:04:07.728 PDT" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-88293" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=88293" Kind="enhancement" Label="88293: [misc] Extension-Point for HyperlinkDetectors" LastDate="1140115547282" Notes="" Priority="P3" Reminded="false" ReminderDate="2006-02-21 06:00:00.0 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-01-18 10:57:26.241 PST" Dirty="false" Elapsed="9959567" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-124349" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124349" Kind="" Label="124349: package proposals should not be on top of type list" LastDate="1137781958643" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2005-12-07 14:30:27.428 PST" Dirty="false" Elapsed="3736022" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-104691" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=104691" Kind="" Label="104691: make collectors support csv export and user id mapping" LastDate="1121970079747" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/></BugzillaTaskRegistryCategory><JiraTaskRegistryCategory/><TaskCategory Name="Active"><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-12 07:39:24.172 PDT" Elapsed="2487076" EndDate="2005-09-12 08:21:19.529 PDT" Estimated="0" Handle="task-103783" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-21 19:28:38.76 PDT" Elapsed="1471157" EndDate="2005-09-26 13:16:31.189 PDT" Estimated="0" Handle="task-103793" IssueURL="" Kind="" Label="ensure active search re-runs after activation" Notes="" Priority="P2" Reminded="true" ReminderDate="2005-09-27 08:36:01.568 PDT"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-06 16:20:23.964 PDT" Elapsed="172759" EndDate="2005-10-06 17:50:04.861 PDT" Estimated="0" Handle="task-103827" IssueURL="" Kind="" Label="SET REDRAW on active views" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-06 16:38:56.944 PDT" Elapsed="122486" EndDate="2005-10-06 19:54:50.905 PDT" Estimated="0" Handle="task-103828" IssueURL="" Kind="" Label="RAISE children fails to lower" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-06 18:55:44.35 PDT" Elapsed="6105697" EndDate="2005-10-07 17:19:34.503 PDT" Estimated="0" Handle="task-103829" IssueURL="" Kind="" Label="suppress docs from active search" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-07 08:46:33.70 PDT" Elapsed="910131" EndDate="2005-10-07 15:41:38.3 PDT" Estimated="0" Handle="task-103831" IssueURL="" Kind="" Label="long: active search refresh" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-07 09:09:44.174 PDT" Elapsed="0" EndDate="2005-10-07 15:41:36.30 PDT" Estimated="0" Handle="task-103832" IssueURL="" Kind="" Label="problems list refresh fails" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-07 18:04:21.636 PDT" Elapsed="233817" EndDate="2005-10-07 19:41:26.793 PDT" Estimated="0" Handle="task-103834" IssueURL="" Kind="" Label="can't increment landmark interest with keys" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-07 20:36:55.319 PDT" Elapsed="0" EndDate="2005-10-13 04:05:24.368 PDT" Estimated="0" Handle="task-103836" IssueURL="" Kind="" Label="make active search linking stick" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-10-07 16:57:21.956 PDT" Elapsed="0" EndDate="" Estimated="0" Handle="task-103833" IssueURL="" Kind="" Label="content type for Ant nodes is blank" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-02-19 15:06:11.64 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-07 21:32:47.785 PDT" Elapsed="346981" EndDate="2005-10-11 12:56:33.499 PDT" Estimated="0" Handle="task-103837" IssueURL="" Kind="" Label="active search refresh only after click" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-19 06:01:24.114 PDT" Elapsed="0" EndDate="2005-10-20 13:00:24.992 PDT" Estimated="0" Handle="task-103853" IssueURL="" Kind="" Label="refresh whole explorer on task deactivation" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-18 16:50:23.150 PDT" Elapsed="0" EndDate="2005-10-20 12:59:59.185 PDT" Estimated="0" Handle="task-103852" IssueURL="" Kind="" Label="ensure that Ian is on contributors list" Notes="" Priority="P1" Reminded="true" ReminderDate="2005-10-20 16:50:19.595 PDT"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-19 08:36:29.97 PDT" Elapsed="600624" EndDate="2005-12-02 13:30:13.700 PST" Estimated="0" Handle="task-103855" IssueURL="" Kind="" Label="update presentations" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-21 06:02:47.306 PDT" Elapsed="911" EndDate="2005-10-27 17:58:59.995 PDT" Estimated="0" Handle="task-103858" IssueURL="" Kind="" Label="fix refactoring test" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-26 08:42:59.949 PDT" Elapsed="0" EndDate="2005-10-27 17:59:13.444 PDT" Estimated="0" Handle="task-103861" IssueURL="http://" Kind="" Label="fix error interest test" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-26 11:07:46.899 PDT" Elapsed="282566" EndDate="2005-10-26 11:15:36.845 PDT" Estimated="0" Handle="task-103862" IssueURL="http://" Kind="" Label="remove blank elements from active search views" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-25 16:43:17.340 PDT" Elapsed="7155866" EndDate="2005-10-27 19:22:12.224 PDT" Estimated="0" Handle="task-103860" IssueURL="http://" Kind="" Label="fix up planning game wizard" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-26 14:10:42.552 PDT" Elapsed="179598" EndDate="2005-10-27 15:52:13.157 PDT" Estimated="0" Handle="task-103863" IssueURL="http://" Kind="" Label="don't show monitor warning if there isn't an extension" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-28 18:22:46.321 PDT" Elapsed="517857" EndDate="2005-10-31 10:31:06.645 PST" Estimated="0" Handle="task-103864" IssueURL="http://" Kind="" Label="fix minor nits" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-14 19:20:07.734 PST" Elapsed="412679" EndDate="2005-11-14 19:49:57.728 PST" Estimated="0" Handle="task-103882" IssueURL="http://" Kind="" Label="3.1 migration" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-14 21:55:04.502 PST" Elapsed="0" EndDate="2005-11-15 10:09:41.723 PST" Estimated="0" Handle="task-103883" IssueURL="http://" Kind="" Label="update flash videos in docs" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-15 12:49:32.344 PST" Elapsed="0" EndDate="2005-11-15 19:37:17.377 PST" Estimated="0" Handle="task-103884" IssueURL="" Kind="" Label="add FAQ entry about Java 5 failure" Notes="java.lang.NoSuchMethodError: org.eclipse.ui.internal.dialogs.FilteredTree.getFilterControl()Lorg/eclipse/swt/widgets/Text; at org.eclipse.mylyn.tasklist.ui.views.TaskListContentProvider.applyFilter(TaskListContentProvider.java:90)" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-15 14:42:47.886 PST" Elapsed="0" EndDate="2005-11-15 18:44:06.969 PST" Estimated="0" Handle="task-103886" IssueURL="http://" Kind="" Label="ping Make about status" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-15 17:33:00.634 PST" Elapsed="750615" EndDate="2005-11-15 19:37:10.16 PST" Estimated="0" Handle="task-103889" IssueURL="http://" Kind="" Label="add faq entry on bad eclipse version" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-16 19:33:05.434 PST" Elapsed="364774" EndDate="2005-11-20 17:06:55.303 PST" Estimated="0" Handle="task-103891" IssueURL="http://" Kind="" Label="multiple of same change set can appear" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-21 19:37:14.307 PST" Elapsed="12037" EndDate="2005-11-21 20:20:43.869 PST" Estimated="0" Handle="task-103895" IssueURL="http://" Kind="" Label="add preference for number of editors to open" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-25 13:34:26.502 PST" Elapsed="0" EndDate="2005-12-02 11:52:21.218 PST" Estimated="0" Handle="task-103905" IssueURL="http://" Kind="" Label="check on quality of hashcode method on InteractionEvent" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-29 13:18:58.489 PST" Elapsed="0" EndDate="2005-11-29 13:24:12.561 PST" Estimated="0" Handle="task-103906" IssueURL="http://" Kind="" Label="abstract tests should not be part of suite" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-30 13:08:46.963 PST" Elapsed="0" EndDate="2005-12-01 17:59:13.932 PST" Estimated="0" Handle="task-103909" IssueURL="http://" Kind="" Label="fix planner UI" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-01 18:35:25.275 PST" Elapsed="0" EndDate="2005-12-02 11:52:59.403 PST" Estimated="0" Handle="task-103913" IssueURL="http://eclipse.org/mylar/" Kind="" Label="if change set is blank, change goes outside" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-02 13:56:37.558 PST" Elapsed="0" EndDate="2005-12-02 16:38:11.716 PST" Estimated="0" Handle="task-103914" IssueURL="http://" Kind="" Label="after all resources committed failure changes to change set" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-05 17:18:17.847 PST" Elapsed="4115719" EndDate="2005-12-06 19:20:14.253 PST" Estimated="0" Handle="task-103917" IssueURL="http://" Kind="" Label="re-dragging a task to a category should not re-add it" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-08 11:34:55.85 PST" Elapsed="2323815" EndDate="2005-12-08 12:08:41.362 PST" Estimated="0" Handle="task-103923" IssueURL="http://" Kind="" Label="make bugzilla bridge open local report" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-09 14:54:01.417 PST" Elapsed="0" EndDate="2005-12-12 17:20:37.520 PST" Estimated="0" Handle="task-103925" IssueURL="http://eclipse.org/mylar/doc/faq.html#install-failure" Kind="" Label="create docs section on site" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-09 18:31:55.517 PST" Elapsed="4878811" EndDate="2005-12-09 19:43:45.374 PST" Estimated="0" Handle="task-103926" IssueURL="http://" Kind="" Label="fix schitzophrenia between task context paths and contexts" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-14 15:29:05.912 PST" Elapsed="611011" EndDate="2005-12-16 12:09:52.92 PST" Estimated="0" Handle="task-103930" IssueURL="http://" Kind="" Label="active task fails to go bold on startup" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-15 18:27:22.88 PST" Elapsed="7417485" EndDate="2006-01-23 15:04:49.117 PST" Estimated="3" Handle="task-103932" IssueURL="http://" Kind="" Label="long: task list modularity" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-16 10:00:42.536 PST" Elapsed="335243" EndDate="2005-12-16 12:28:41.86 PST" Estimated="0" Handle="task-103934" IssueURL="http://" Kind="" Label="cell editor on planner sets values to -1 when not edited" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-16 19:24:27.697 PST" Elapsed="0" EndDate="2006-02-08 21:30:40.536 PST" Estimated="0" Handle="task-103936" IssueURL="http://" Kind="" Label="fix FAQ rendering in MSIE" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-01-25 15:05:17.648 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-21 17:18:42.705 PST" Elapsed="250309" EndDate="2005-12-26 11:15:03.345 PST" Estimated="0" Handle="task-103940" IssueURL="http://" Kind="" Label="make package go red when overdue task is in it" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-12-26 11:15:56.201 PST" Elapsed="142393111" EndDate="" Estimated="0" Handle="task-103941" IssueURL="" Kind="" Label="long: rcp app packaging" Notes="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/winxpicons.asp" Priority="P5" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-27 11:59:23.585 PST" Elapsed="0" EndDate="2006-02-08 21:30:44.61 PST" Estimated="0" Handle="task-103943" IssueURL="http://" Kind="" Label="adopt new mailing list doc convention" Notes=" This message is to inform all committers of upcoming changes to the newsgroup and mailing list pages on the eclipse.org website. With the move to the new design these pages will become more data driven which will result in a new option for you all. At this time the descriptions of the various newsgroups and mailing lists are statically set and you must send in a request to us for it to be changed. The update will allow each individual project to change it's description paragraph at will. What will you need to do in order to use this feature? That's easy, in the new 'project-info' directory that you have created in the top level of your web sites just insert two plain text files named 'newsgroup' and 'maillist'. The format of these files is the same and follows the following format: ::name::description ::name::description So and example of a newsgroup entry for say the BPEL newsgroup would be: ::eclipse.technology.bpel-designer::The <a href="http://www.eclipse.org/bpel">BPEL Designer Editor project</a> will add comprehensive support to Eclipse for the definition, editing, deploying, testing, and debugging of WS-BPEL processes (Business Process Execution Language for Web Services) in vendor neutral environments. The implementation will be extensible to third-party vendors so that runtime implementations could integrate seamlessly to the design/build/deploy/test cycle and integrate specific domain WS-BPEL constructs and extension. You can add as many newsgroups or mailing lists as you like, as long as each entry has the same format. Each time the newsgroup or mailing list pages are requested the software checks to see if these files exist, and if they do then the contents are loaded into the page. If the files cannot be found then the newsgroups and mailing lists for that project will not be included on the respective web pages. These changes will go into effect for the news pages on the 30th of December If you have any questions about these changes contact contact me. " Priority="P5" Reminded="true" ReminderDate="2006-01-26 11:59:14.643 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-28 08:07:25.289 PST" Elapsed="1172217" EndDate="2005-12-28 08:37:21.272 PST" Estimated="0" Handle="task-103944" IssueURL="" Kind="" Label="minor tasklit refactoring" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-30 07:55:04.376 PST" Elapsed="745851" EndDate="2006-01-04 18:29:16.497 PST" Estimated="0" Handle="task-103945" IssueURL="" Kind="" Label="does "mark incomplete" fail to color?" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-31 06:55:16.161 PST" Elapsed="790263" EndDate="2005-12-31 07:51:51.604 PST" Estimated="0" Handle="task-103946" IssueURL="http://" Kind="" Label="update j2se-1.5 compliance settings" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-03 13:08:31.670 PST" Elapsed="0" EndDate="" Estimated="0" Handle="task-103947" IssueURL="http://" Kind="" Label="add automatic option configuration for browser mod..." Notes="- turn on automatic workspace refresh - perspective bar to top right - new (not traditional) tabs - " Priority="P5" Reminded="true" ReminderDate="2006-02-19 15:40:23.992 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-05 15:54:23.21 PST" Elapsed="0" EndDate="" Estimated="0" Handle="task-103948" IssueURL="http://" Kind="" Label="interest filter fails on extensions page" Notes="java.lang.RuntimeException: null bridge for object: class org.eclipse.pde.internal.ui.editor.plugin.ExtensionsPage 	at org.eclipse.mylyn.core.MylarPlugin$1.getHandleIdentifier(ContextCorePlugin.java:83) 	at org.eclipse.mylyn.ui.InterestFilter.select(InterestFilter.java:62) 	at org.eclipse.jface.viewers.ViewerFilter.filter(ViewerFilter.java:51) 	at org.eclipse.jface.viewers.StructuredViewer.getFilteredChildren(StructuredViewer.java:794) 	at org.eclipse.jface.viewers.StructuredViewer.getSortedChildren(StructuredViewer.java:905) 	at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:1720) 	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1274) 	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1251) 	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1207) 	at org.eclipse.jface.viewers.StructuredViewer$8.run(StructuredViewer.java:1291) 	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1201) 	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1289) 	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1246) 	at org.eclipse.mylyn.ui.MylarViewerManager.internalRefresh(MylarViewerManager.java:150) 	at org.eclipse.mylyn.ui.MylarViewerManager.access$0(MylarViewerManager.java:138" Priority="P5" Reminded="true" ReminderDate="2006-02-11 19:03:57.612 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-05 18:34:13.786 PST" Elapsed="827119" EndDate="" Estimated="0" Handle="task-103949" IssueURL="http://" Kind="" Label="suggest Eclipse API changes" Notes="To do - Package Explorer collapse suppression - content assist selection listener - PDE viewer accessibility - type history extensibility - decorator job priority: problem is that if a decorator makes elements in explorer bold, and markers change, there is a 1-2 second blink Done - expose resolveMember on MemberProposalInfo - strikethru for SWT widgets - filtered tree should refresh when filtered - folding updater " Priority="P5" Reminded="true" ReminderDate="2006-01-15 18:34:10.642 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-06 14:47:38.551 PST" Elapsed="1282688" EndDate="2006-01-06 14:51:45.626 PST" Estimated="0" Handle="task-103951" IssueURL="http://" Kind="" Label="mark complete fails to filter" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-11 07:53:38.612 PST" Elapsed="278089" EndDate="2006-01-23 12:10:27.854 PST" Estimated="0" Handle="task-103955" IssueURL="http://" Kind="" Label="add rename action to list?" Notes="" Priority="P3" Reminded="true" ReminderDate="2006-01-22 09:33:08.744 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-12 21:29:41.33 PST" Elapsed="0" EndDate="2006-01-13 09:33:00.863 PST" Estimated="0" Handle="task-103957" IssueURL="http://" Kind="" Label="fix bug hit handles" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-13 10:12:13.431 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103958" IssueURL="http://" Kind="" Label="wizard dialogs should have titles" Notes="" Priority="P5" Reminded="false" ReminderDate="2006-02-20 11:00:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-13 11:16:45.146 PST" Elapsed="299502" EndDate="2006-01-13 11:30:48.398 PST" Estimated="0" Handle="local-103959" IssueURL="http://" Kind="" Label="streamline migration" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-13 13:55:16.62 PST" Elapsed="1829370" EndDate="2006-01-13 15:27:32.973 PST" Estimated="0" Handle="local-103961" IssueURL="http://" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-13 14:27:25.406 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103962" IssueURL="http://" Kind="" Label="re-eanble BugzillaSearchPluginTest" Notes="" Priority="P5" Reminded="false" ReminderDate="2006-02-26 14:27:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-13 16:26:41.95 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103963" IssueURL="" Kind="" Label="report won't open if another with same id is open" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-02-19 16:26:38.371 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-13 16:46:44.736 PST" Elapsed="27718" EndDate="2006-01-13 17:41:05.565 PST" Estimated="0" Handle="local-103964" IssueURL="http://" Kind="" Label="active context not cleared on deactivation" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-16 08:06:29.655 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103965" IssueURL="http://eclipse-plugins.2y.net/eclipse/plugin_details.jsp?id=1225" Kind="" Label="check on Eclipse plug-ins listing of Mylar" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-02-27 14:00:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-16 16:50:55.378 PST" Elapsed="17986" EndDate="2006-01-18 17:44:25.36 PST" Estimated="0" Handle="local-103967" IssueURL="http://" Kind="" Label="fix links in release docs" Notes="" Priority="P2" Reminded="true" ReminderDate="2006-01-16 16:50:53.225 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-16 16:57:17.568 PST" Elapsed="14520" EndDate="2006-01-18 17:14:05.837 PST" Estimated="0" Handle="local-103968" IssueURL="http://" Kind="" Label="check in project formatting settings, and format all files" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-17 14:42:34.27 PST" Elapsed="155114" EndDate="2006-01-17 15:13:08.264 PST" Estimated="0" Handle="local-103970" IssueURL="http://" Kind="" Label="ensure that category is not colored red if overdue tasks are completed" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-19 16:15:57.513 PST" Elapsed="1568787" EndDate="2006-01-24 18:07:28.962 PST" Estimated="0" Handle="local-103971" IssueURL="http://" Kind="" Label="update copyrights to 2006" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-01-20 11:00:59.717 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-19 19:02:57.371 PST" Elapsed="967502" EndDate="2006-01-20 11:56:41.584 PST" Estimated="0" Handle="local-103972" IssueURL="http://" Kind="" Label="fix TaskDataExport test" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-20 11:54:27.441 PST" Elapsed="839233" EndDate="2006-01-23 09:21:41.860 PST" Estimated="0" Handle="local-103973" IssueURL="http://" Kind="" Label="review auto content assist activation problem" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-01-22 21:15:54.573 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-23 12:19:29.553 PST" Elapsed="254286" EndDate="2006-01-23 12:24:55.592 PST" Estimated="0" Handle="local-103974" IssueURL="http://" Kind="" Label="support multiple removals" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-22 15:33:56.647 PST" Elapsed="0" EndDate="2006-01-23 14:53:03.342 PST" Estimated="0" Handle="task-103897" IssueURL="http://dev.eclipse.org/mhonarc/lists/platform-ui-dev/msg02693.html" Kind="" Label="long: consider working set overlap" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-26 14:49:21.158 PDT" Elapsed="65054" EndDate="" Estimated="0" Handle="task-103805" IssueURL="" Kind="" Label="long: docs" Notes="" Priority="P5" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-11-09 08:31:36.558 PST" Elapsed="0" EndDate="" Estimated="0" Handle="task-103881" IssueURL="http://blog.enargi.com/programming/eclipse/eclipse-tips-external-plugin-directory/" Kind="" Label="long: eclipse configuration" Notes="extension directory setup: 	http://blog.enargi.com/programming/eclipse/eclipse-tips-external-plugin-directory/ " Priority="P5" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-27 10:19:07.947 PDT" Elapsed="616527" EndDate="" Estimated="0" Handle="task-103806" IssueURL="" Kind="" Label="long: improve conent assist" Notes="" Priority="P5" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-11-23 20:03:18.841 PST" Elapsed="33790" EndDate="" Estimated="0" Handle="task-103903" IssueURL="http://" Kind="" Label="long: release messages" Notes="0.5.0 - Tom Eicher and Daniel Megert for extensibility improvements in editor folding support 0.4.8 - Brock for improving multi-repository wizards - Brock and Eugene's ideas on task list architecture - Eugene's idea for completion bar on categories 0.4.7 - upgrade - after starting, open repositories view, add repository if not there, ensure correct - restart Eclipse, query categories should show up and contexts have been migrated - restart again to see tasks in query matches. - Eugene had a good idea for avoiding inducing interest on newly checked out projects - David Bari and Tomasz Smietanka: set up test bugzilla server for encodings - Brock: elegant solution to fix lazy loading of image registry, 3.2M4 detective work and fixes, highlighter fix - Rob: drag-and-drop tasks, external browser 0.4.6 - Brock's XML SAX externalization contribution - performance of content assist - Alexander Staubo provided useful video 0.4.5 - back up your task lists (support revamped, now more extensible, etc) - restore default directory before upgrading, then can copy back - Felix Knecht helped proided instructions for how to patch a bugzilla bug issue - Leah & Suzanne's monitor stuff? - issue tracker discussion - brock for patch of tasklist schema and integration build fix 0.4.4: - Igor Fedorenko provide a patch for an NPE in the Java Problem Listener - Vote for Mylar talk - Ian's bugzilla patch - watch for resources added to context in Error Log? - Wes added support for in-progress tasks on the planner, hard work on task list backup and improving timing." Priority="P5" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-23 14:23:14.908 PDT" Elapsed="3722185" EndDate="" Estimated="0" Handle="task-103798" IssueURL="" Kind="" Label="long: ui issues" Notes="" Priority="P5" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-15 15:04:04.653 PDT" Elapsed="16549725" EndDate="2005-09-19 16:28:29.52 PDT" Estimated="0" Handle="task-103788" IssueURL="" Kind="" Label="long: usage analysis" Notes="Kevin suggests running both a t-test and a wilcoxon because the wilcoxon makes less assumptions. The T-test should have normal data fed into it. He suggests just eyeballing it and doing the log trick as reasonable ways to meet that criteria. Problem: people leaving Mylar active and not using it To do by next meet: - JUST JAVA - CONSIDER JUST HOURS - shared vs. unique task content coverage - average number of selections before edit, do runs of selections get shorter? average length of a run, baseline vs. active tasks in mylar [do it based on view, not editor selections] Misc: - number of unique elements in each context - three kinds of baseline stats? - not doing: number of tasks,time mylar active (not determinable, since they could be doing something else, base on selections) - filters used in navigator/explorer - figure out how many landmarks they have - correlate additional information for accepted users (questionnaires, etc, tasks peformed) - could discard first n events of usage - buckets for individual users" Priority="P5" Reminded="true" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-11-08 13:03:53.156 PST" Elapsed="505994160" EndDate="2006-01-16 11:26:34.181 PST" Estimated="0" Handle="task-103879" IssueURL="http://" Kind="" Label="long: web site update" Notes=" download - General Eclipse.org newsgroup information: http://www.eclipse.org/newsgroups/index.php about: - Mylar: A Task Focused UI for Eclipse. - mention Eclipse's openness and extensibility? Using Mylar simply requires the user to identify the task-at-hand, Mylar then forms a context for that task by monitoring the user's activity. dev - add note to dev page on connecting to eclispe.org ... from Gail: i.e., the current focus is on determing which existing features are working well and adding new innovative features ... Just to give the sense that you aren't interested in support 1.4, etc." Priority="P5" Reminded="true" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-12 12:27:21.441 PDT" Elapsed="0" EndDate="" Estimated="0" Handle="task-103784" IssueURL="" Kind="" Label="re-enable ResultUpdaterTest" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-02-12 17:59:16.827 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-16 19:47:54.406 PDT" Elapsed="188381" EndDate="" Estimated="0" Handle="task-103792" IssueURL="" Kind="" Label="re-enable test in BugzillaStackTraceTest" Notes="" Priority="P5" Reminded="false" ReminderDate="2006-02-26 08:36:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2005-09-28 18:27:30.673 PDT" Elapsed="0" EndDate="" Estimated="0" Handle="task-103811" IssueURL="" Kind="" Label="submit bug: generating getters/setters can fail to..." Notes="" Priority="P5" Reminded="false" ReminderDate="2006-02-21 08:36:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-12 19:27:55.902 PST" Elapsed="1751918" EndDate="2006-02-08 21:32:32.848 PST" Estimated="1" Handle="task-103929" IssueURL="http://www.eclipse.org/projects/dev_process/project-status-infrastructure.php" Kind="" Label="update to new project web site format" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-01-25 14:00:49.425 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-23 17:27:07.574 PST" Elapsed="0" EndDate="2006-01-24 17:58:34.683 PST" Estimated="0" Handle="local-103975" IssueURL="http://" Kind="" Label="migrate test naming convention" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-24 11:21:34.338 PST" Elapsed="1300643" EndDate="2006-01-24 17:58:41.73 PST" Estimated="0" Handle="local-103976" IssueURL="http://" Kind="" Label="refactor packages to internal naming convention" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-24 16:00:54.852 PST" Elapsed="247977" EndDate="2006-01-24 16:07:57.630 PST" Estimated="0" Handle="local-103979" IssueURL="http://" Kind="" Label="make folding toggle enable folding" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-01-24 17:58:59.780 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103980" IssueURL="http://" Kind="" Label="fix BugzillaCustomQueryCategory wierdness" Notes="" Priority="P5" Reminded="true" ReminderDate="2006-02-12 21:37:05.189 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-25 10:42:28.455 PST" Elapsed="0" EndDate="2006-02-15 11:03:07.431 PST" Estimated="0" Handle="local-103983" IssueURL="http://" Kind="" Label="make bug reports open with progress" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-09 19:00:33.879 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-02-08 21:19:58.232 PST" Elapsed="2037357" EndDate="2006-02-09 14:38:49.841 PST" Estimated="0" Handle="local-103984" IssueURL="http://" Kind="" Label="fix failing externalization test" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><BugzillaReport Active="false" Bugzilla="true" Complete="true" CreationDate="2006-02-09 14:22:59.134 PST" Dirty="false" Elapsed="1669493" EndDate="2006-02-16 00:43:00.0 PST" Estimated="0" Handle="https://bugs.eclipse.org/bugs-127182" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127182" Kind="normal" Label="127182: bugzilla outline missing in generic task editor" LastDate="1140068712307" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-10 18:01:36.692 PST" offlineSyncState="SYNCHRONIZED"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-09 11:51:18.388 PST" Dirty="false" Elapsed="18514721" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-126842" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=126842" Kind="enhancement" Label="126842: prototype JIRA support" LastDate="1139604349347" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-16 11:00:00.0 PST" offlineSyncState="SYNCHRONIZED"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-02-10 10:09:14.869 PST" Elapsed="424024" EndDate="2006-02-10 13:55:37.400 PST" Estimated="0" Handle="local-103987" IssueURL="http://" Kind="" Label="fix task list refresh" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-13 10:59:33.277 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103991" IssueURL="http://" Kind="" Label="hits need completion state or filter needs fix" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-14 10:22:19.798 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103994" IssueURL="http://" Kind="" Label="investigate M5 migration" Notes=" I am getting tons of NPE's: java.lang.NullPointerException at org.eclipse.mylyn.internal.tasks.ui.MylarTaskListPlugin.access$1(MylarTask ListPlugin.java:433) at org.eclipse.mylyn.internal.tasks.ui.MylarTaskListPlugin$2.shellActivated(M ylarTaskListPlugin.java:190) at or this: java.lang.NullPointerException at org.eclipse.mylyn.internal.monitor.monitors.SelectionMonitor.selectionChan ged(SelectionMonitor.java:147) at org.eclipse.ui.internal.AbstractSelectionService.firePostSelection(Abstrac tSelectionService.java:179) at " Priority="P2" Reminded="true" ReminderDate="2006-02-16 10:22:00.0 PST"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-13 18:17:26.932 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-127609" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=127609" Kind="normal" Label="127609: parametrize task completion status" LastDate="1139883471597" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="INCOMING"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-14 18:40:09.375 PST" Elapsed="6930" EndDate="" Estimated="0" Handle="local-103996" IssueURL="" Kind="" Label="make validate bugzilla server check login " Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-14 18:37:50.816 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 08:05:47.699 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103997" IssueURL="https://bugs.eclipse.org/bugs" Kind="" Label="move new bug actoin and fix icon" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 19:07:51.499 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-104000" IssueURL="http://" Kind="" Label="content assist not ranking locals" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-17 12:00:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-02-17 15:22:01.268 PST" Elapsed="246046" EndDate="2006-02-17 19:10:11.903 PST" Estimated="0" Handle="local-104001" IssueURL="http://" Kind="" Label="startup bug" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-17 18:28:44.376 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-104002" IssueURL="http://" Kind="" Label="task list label length" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-17 18:50:46.216 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-104003" IssueURL="http://" Kind="" Label="bugzilla icon not showing up" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-17 19:42:19.324 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-104004" IssueURL="http://" Kind="" Label="append Mylar version to tasklist.xml" Notes="" Priority="P2" Reminded="false" ReminderDate="2006-02-20 11:00:10.802 PST"/><BugzillaReport Active="false" Bugzilla="true" Complete="false" CreationDate="2006-02-17 19:21:28.956 PST" Dirty="false" Elapsed="0" EndDate="" Estimated="0" Handle="https://bugs.eclipse.org/bugs-128500" IssueURL="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128500" Kind="normal" Label="128500: hits should show resolved status" LastDate="1140232940390" Notes="" Priority="P1" Reminded="false" ReminderDate="" offlineSyncState="SYNCHRONIZED"/></TaskCategory><TaskCategory Name="Archive"><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-9" IssueURL="" Kind="" Label="improve task context paths" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="2005-08-12 17:28:43.833 PDT" Estimated="0" Handle="task-103759" IssueURL="" Kind="" Label="rename mylar.bugzilla plug-in" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-68" IssueURL="" Kind="" Label="task context fails to clear" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-30 10:55:09.879 PDT" Elapsed="0" EndDate="2005-09-30 11:08:30.290 PDT" Estimated="0" Handle="task-103820" IssueURL="" Kind="" Label="OPEN LISTENER FAILS IN ACTIVE SEARCH" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-30 10:58:29.76 PDT" Elapsed="963226" EndDate="2005-10-03 14:12:47.608 PDT" Estimated="0" Handle="task-103821" IssueURL="" Kind="" Label="PACKAGE EXPLORER REFRESHES ON EVERY KEYSTROKE" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-14 15:42:25.54 PDT" Elapsed="2100704" EndDate="2005-09-14 16:29:39.49 PDT" Estimated="0" Handle="task-103786" IssueURL="" Kind="" Label="active search blinks on every selection" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-08-29 16:39:41.306 PDT" Elapsed="5612400" EndDate="2005-09-09 15:16:07.680 PDT" Estimated="0" Handle="task-103776" IssueURL="" Kind="" Label="active search view fails to refresh" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-11 14:59:25.754 PDT" Elapsed="585672" EndDate="2005-09-11 16:57:45.322 PDT" Estimated="0" Handle="task-103781" IssueURL="" Kind="" Label="auto folding fails" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-30 07:51:18.677 PDT" Elapsed="32958" EndDate="2005-09-30 13:44:04.32 PDT" Estimated="0" Handle="task-103819" IssueURL="" Kind="" Label="check scopes for XML" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-19 11:23:22.780 PDT" Elapsed="0" EndDate="2005-11-08 13:41:35.809 PST" Estimated="0" Handle="task-103856" IssueURL="" Kind="" Label="consulting: incremental Ant build and view" Notes="Ron: I think the most valuable first thing to do is to create ant support that can provide basic incremental compilation and then visualization inside of alien IDE's like Eclipse 2.1, IDEA 5.0, or RAD. At this stage, I think core incremental ant support is the right foundation rather than, say, Eclipse 3.1+ builders. What do you think?" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-28 18:14:33.716 PDT" Elapsed="0" EndDate="2005-09-29 18:15:05.186 PDT" Estimated="0" Handle="task-103810" IssueURL="" Kind="" Label="create new history icons" Notes="" Priority="P1" Reminded="true" ReminderDate="2005-09-29 18:14:29.770 PDT"/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-26 14:48:24.306 PDT" Elapsed="0" EndDate="2005-09-28 09:06:22.963 PDT" Estimated="0" Handle="task-103804" IssueURL="" Kind="" Label="decorators can fail to indicate landmarks" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-12 13:06:34.591 PST" Elapsed="977453" EndDate="2005-12-12 13:39:01.581 PST" Estimated="0" Handle="task-103928" IssueURL="http://" Kind="" Label="fix failing test" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-08-26 13:24:44.19 PDT" Elapsed="838867" EndDate="2005-08-26 13:35:37.869 PDT" Estimated="0" Handle="task-103774" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-22 16:32:15.431 PDT" Elapsed="9821793" EndDate="2005-09-22 19:41:18.877 PDT" Estimated="0" Handle="task-103795" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-23 12:39:39.388 PDT" Elapsed="1957736" EndDate="2005-09-23 13:12:32.25 PDT" Estimated="0" Handle="task-103797" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-29 16:02:07.303 PDT" Elapsed="9733791" EndDate="2005-09-30 13:32:27.861 PDT" Estimated="0" Handle="task-103818" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-20 10:41:44.571 PDT" Elapsed="4570528" EndDate="2005-10-20 11:57:59.965 PDT" Estimated="0" Handle="task-103857" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-02 14:42:30.292 PST" Elapsed="1527290" EndDate="2005-11-02 15:52:24.512 PST" Estimated="0" Handle="task-103866" IssueURL="http://" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-03 16:33:07.218 PST" Elapsed="1032444" EndDate="2005-11-03 17:17:13.934 PST" Estimated="0" Handle="task-103875" IssueURL="" Kind="" Label="fix failing tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-29 10:59:59.666 PDT" Elapsed="0" EndDate="2005-09-30 11:11:41.966 PDT" Estimated="0" Handle="task-103816" IssueURL="" Kind="" Label="fix link to Ed's blog" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-10-21 06:13:35.107 PDT" Elapsed="753925" EndDate="2005-10-21 13:51:34.417 PDT" Estimated="0" Handle="task-103859" IssueURL="" Kind="" Label="fix tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-14 13:31:40.33 PDT" Elapsed="1186862" EndDate="2005-09-14 18:33:54.693 PDT" Estimated="0" Handle="task-103785" IssueURL="" Kind="" Label="give search providers proper labels" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-08-31 09:10:44.201 PDT" Elapsed="5991798" EndDate="2005-09-09 16:48:51.240 PDT" Estimated="0" Handle="task-103779" IssueURL="" Kind="" Label="make failing tests pass" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-11 16:54:38.924 PDT" Elapsed="2144934" EndDate="2005-09-11 17:37:30.271 PDT" Estimated="0" Handle="task-103782" IssueURL="" Kind="" Label="phase 1 message fails to show" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-08-26 13:35:49.776 PDT" Elapsed="4163179" EndDate="2005-08-30 21:46:15.381 PDT" Estimated="0" Handle="task-103775" IssueURL="" Kind="" Label="re-enable interest filter test" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-23 19:10:40.88 PDT" Elapsed="0" EndDate="2005-09-26 08:35:21.631 PDT" Estimated="0" Handle="task-103800" IssueURL="" Kind="" Label="remove usage view" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-08-26 08:22:04.937 PDT" Elapsed="1903977" EndDate="2005-09-14 19:11:04.880 PDT" Estimated="0" Handle="task-103772" IssueURL="" Kind="" Label="set active search defaults" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-01-06 14:27:46.517 PST" Elapsed="460580" EndDate="2006-01-06 14:40:33.440 PST" Estimated="0" Handle="task-103950" IssueURL="http://" Kind="" Label="set license settings per-project" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-14 16:27:02.624 PDT" Elapsed="4697" EndDate="2005-09-19 13:40:36.549 PDT" Estimated="0" Handle="task-103787" IssueURL="" Kind="" Label="task context activation hang?" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-08-26 08:12:45.833 PDT" Elapsed="509252" EndDate="2005-08-26 12:54:07.608 PDT" Estimated="0" Handle="task-103770" IssueURL="" Kind="" Label="verify problems list behavior" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-30 20:28:04.708 PDT" Elapsed="576459" EndDate="2005-10-03 15:09:58.621 PDT" Estimated="0" Handle="task-103823" IssueURL="" Kind="" Label="verify setting of structured selections of ant outline" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-28 09:27:38.407 PDT" Elapsed="0" EndDate="2005-10-03 15:12:11.963 PDT" Estimated="0" Handle="task-103809" IssueURL="" Kind="" Label="xml edges not reset when dos moved to 0" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-26" IssueURL="" Kind="" Label="SHAWN: fix active search" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-30" IssueURL="" Kind="" Label="add "suppress filter" button to views" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="10175" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-55" IssueURL="" Kind="" Label="ensure only single click is required to add selected elements to views" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="5189271" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-81" IssueURL="" Kind="" Label="error interest nodes fail to disappear" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-44" IssueURL="" Kind="" Label="fix "show filtered" failure to select on first element" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="3947585" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-79" IssueURL="" Kind="" Label="fix alt-click UI" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-21" IssueURL="" Kind="" Label="fix delay in decoration when interest is manipulated" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-66" IssueURL="" Kind="" Label="fix hiding of elements when pkg explorer is unfiltered, due to interest fitler checking globall" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-69" IssueURL="" Kind="" Label="fix package explorer selection and filtering" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-80" IssueURL="" Kind="" Label="fix selection cascade after each save" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-46" IssueURL="" Kind="" Label="hook up folding button" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="179077" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-87" IssueURL="" Kind="" Label="improve preference pages" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-27" IssueURL="" Kind="" Label="make highlighters work" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-25" IssueURL="" Kind="" Label="make sure elements exist if trying to open" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="6086813" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-83" IssueURL="" Kind="" Label="outline view failing" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="2046273" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-84" IssueURL="" Kind="" Label="selection cascade triggered by outline" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-60" IssueURL="" Kind="" Label="verify interest filter is not reinstalled too often" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-3" IssueURL="" Kind="" Label="LONG: monitoring" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-103753" IssueURL="" Kind="" Label="change all project settings to show PDE errors" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-103756" IssueURL="" Kind="" Label="ensure Java project can't be landmark" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-2" IssueURL="" Kind="" Label="ensure that when element is selected parent interest becomes positive" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="4453564" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-103751" IssueURL="" Kind="" Label="figure out listener API" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="14091988" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-103754" IssueURL="" Kind="" Label="fix error interest bug" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="6421495" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-103760" IssueURL="" Kind="" Label="fix failing unit tests" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-6" IssueURL="" Kind="" Label="fix problem with random relationships being added on re-parsing" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="1740733" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-86" IssueURL="" Kind="" Label="improve error logging" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="1226623" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-82" IssueURL="" Kind="" Label="landmark update failing" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-4" IssueURL="" Kind="" Label="make error interest work for non-Java" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="Bugzilla-102249" IssueURL="" Kind="" Label="102249: on shell de-activation Mylar causes noticeable slowdown" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="1493" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="Bugzilla-102675" IssueURL="" Kind="" Label="102675: prune dangling predicted interest nodes" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-8" IssueURL="" Kind="" Label="avoid calling refresh all on package explorer when errors change" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-22" IssueURL="" Kind="" Label="fix editor flicker on taskscape activation" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-35" IssueURL="" Kind="" Label="folding compute additions problem" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-38" IssueURL="" Kind="" Label="folding toggle is broken and requires reset" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-61" IssueURL="" Kind="" Label="hook up new folding toggle button" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-65" IssueURL="" Kind="" Label="improve wizards and popup menus" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-1" IssueURL="" Kind="" Label="make folding trigger when switching modes" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-15" IssueURL="" Kind="" Label="package explorer selections fail" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-53" IssueURL="" Kind="" Label="restore selections of package declarations" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-12" IssueURL="" Kind="" Label="selections not being updated in package explorer" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-12-07 14:30:27.448 PST" Elapsed="0" EndDate="1969-12-31 16:00:00.0 PST" Estimated="0" Handle="task-32" IssueURL="" Kind="" Label="suppress repretition of items in content assist" Notes="" Priority="P1" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-09-27 19:04:23.612 PDT" Elapsed="2014211" EndDate="2006-01-23 14:59:07.325 PST" Estimated="0" Handle="task-103808" IssueURL="" Kind="" Label="long: view refresh" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2005-11-08 09:01:17.569 PST" Elapsed="0" EndDate="2006-01-23 14:59:35.376 PST" Estimated="0" Handle="task-103878" IssueURL="http://appft1.uspto.gov/netahtml/PTO/search-bool.html" Kind="" Label="long: patent and prior art search" Notes="" Priority="P3" Reminded="false" ReminderDate=""/></TaskCategory><TaskCategory Name="Business"><Task Active="false" Bugzilla="false" Complete="true" CreationDate="2006-02-09 11:06:16.603 PST" Elapsed="0" EndDate="2006-02-16 11:12:01.586 PST" Estimated="0" Handle="local-103985" IssueURL="http://" Kind="" Label="update EclipseCon/AOSD bio and picture (due Feb 17)" Notes="" Priority="P3" Reminded="true" ReminderDate="2006-02-12 11:06:11.526 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-09 12:14:45.11 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103986" IssueURL="http://" Kind="" Label="restore ThinkPad from drive failure" Notes="Lenovo: 800-565-3344, 4 New case: 3780198, hard drive dispatch: 3780478, recovery CDs: 3780482, newest: 3782684 Business partner: DTM, 2323 Boundary Road Nexinnovations 985 virtual, vancouver, canada, 604-216-2400, 8:30am-5pm. Drive Fitness test: Failure code: 0x20 - Device not found (TRC: 2000B51C) ERROR 0200: Failure Fixed Disk 0 drive setup: http://www.hitachigst.com/hdd/support/download.htm http://www-3.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-4PEN8X ------------- DATA RECOVERY http://www.acsdata.com/hitachi-data-recovery.htm Clean room: $1400-$1500 Non clean-room: $600 Sean recommends: http://support.wdc.com/partners/recovery.asp" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-13 10:24:15.792 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103990" IssueURL="http://www.eclipse.org/projects/dev_process/project-log.php " Kind="" Label="create Mylar IP Log" Notes="" Priority="P2" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-13 12:32:53.720 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103992" IssueURL="http://www.phpeclipse.de/tiki-view_forum_thread.php?forumId=5&comments_parentId=2593" Kind="" Label="review PHPEclipse integration discussion" Notes="" Priority="P3" Reminded="true" ReminderDate="2006-02-21 12:32:00.0 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-13 12:34:05.513 PST" Elapsed="437204" EndDate="" Estimated="0" Handle="local-103993" IssueURL="" Kind="" Label="draft EclipseCon slides (due Feb 17)" Notes="" Priority="P1" Reminded="true" ReminderDate="2006-02-14 08:00:52.114 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-14 10:25:12.826 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103995" IssueURL="http://" Kind="" Label="write Jolt Award summaries (due March 3)" Notes="" Priority="P5" Reminded="false" ReminderDate="2006-02-26 10:24:57.144 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 10:08:57.595 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103998" IssueURL="http://" Kind="" Label="write introductory email to Atlassian" Notes="That looks really good. The only contact I have there is Jonathan Nolen mailto:jonathan at atlassian.com (their developer relations guy), but i do not konw him personally. Perhaps you should just send the email to both of them. It can't really hurt. cheers, Brock Quoting Mik Kersten <beatmik at acm.org>: > Brock, here's a draft, what do you think? Do you have a contact there > that you want to use? If not I have a pretty senior contact there, > but don't know him. > > ------------ > > The Mylar eclipse.org project is growing, and there has been > increasing demand for providing issue tracker integration for JIRA. > One of the key components of Mylar is a standalone task management UI. > The Mylar Bugzilla Client extends that and provides tight integration > for working with Bugzilla issues within Eclipse. To see it in action > see the 2nd flash video > at: > http://eclipse.org/mylar/doc.php > > As Eclipse itself has demonstrated with it's CVS client, the quality > and integration of the client UI can be more important to developer > productivity than the quality of the underlying repository. Brock > Janiczak has made significant progress with his JIRA Dashboard > plug-in, and we have generic task/query management support in Mylar's > Task List component. To meet our community's needs we would like to > take the next step, and build the same level of Eclipse integration > with JIRA that we currently have for Bugzilla. > > > I can dedicate some of my Mylar development time to make this happen > in order to help make Mylar the standard mechanism for task management > in Eclipse. Brock Janiczak is also volunteering some time to help > build the community that uses the JIRA Dashboard plug-in. But we > would benefit from your support in this effort. Please let us know if > this is something that you are interested in helping with. > > Best regards, > > Mik Kersten and Brock Janiczak" Priority="P3" Reminded="false" ReminderDate="2006-02-21 10:08:50.665 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 10:29:36.507 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103999" IssueURL="http://www.eclipse.org/eclipse/development/eclipse_project_plan_3_2.html" Kind="" Label="read update 3.2 dev plan" Notes="" Priority="P3" Reminded="false" ReminderDate="2006-02-21 10:29:31.349 PST"/></TaskCategory><TaskCategory Name="Personal"><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-13 09:54:07.51 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103988" IssueURL="http://www.fido.ca/portal/home/homepage.jsp?lang=en " Kind="" Label="Pay Fido bill" Notes="" Priority="P3" Reminded="false" ReminderDate="2006-02-20 09:53:46.161 PST"/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-13 10:19:17.413 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-103989" IssueURL="" Kind="" Label="music to get" Notes="Global Underground - Electric Calm v.3 Choice: A Collection of Classics" by Danny Howells Defected in the house miami" Priority="P4" Reminded="false" ReminderDate="2006-02-21 10:19:00.0 PST"/></TaskCategory><BugzillaQuery MaxHits="-1" Name="Current" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&product=Mylar&long_desc_type=allwordssubstr&long_desc=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&priority=P1&priority=P2&priority=P3&emailassigned_to1=1&emailtype1=substring&email1=beatmik&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126842" Name="126842: prototype JIRA support" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-128468" Name="128468: >make priority column and combo editor be icon based" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126775" Name="126775: >fix task archive and category duplication" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111861" Name="111861: open type history might be missing some interesting types" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125555" Name="125555: >interest filter fails on PDE extensions and other pages" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-127609" Name="127609: parametrize task completion status" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113275" Name="113275: improve PDE search and include manifest files" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113399" Name="113399: add recommended preference changes" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-118007" Name="118007: Ability to selectively add resources (files/folders) to context" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-127293" Name="127293: >bugzilla.core should not depend on mylar" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106678" Name="106678: hierarchical layout in package explorer shows uninteresting elements" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112233" Name="112233: [improve interaction for filtered element navigation" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-118542" Name="118542: Open/close Java files leave interest on packages" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-118884" Name="118884: problems with PDE Outline update" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120499" Name="120499: Mylar should make explicitly created resources interesting, and ignore others" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121329" Name="121329: ensure that there are no leaks of Color and Image" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-123649" Name="123649: >new bug wizard doesn't automatically update options" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124259" Name="124259: >Can't cacel a temporarily unfilter a node" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125591" Name="125591: >number of editors bloats due to auto-close suppression" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126237" Name="126237: copying and pasting task contexts" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126257" Name="126257: >package explorer and other views fail to refresh on persp..." Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126882" Name="126882: >Not all file types preserved in Mylar filtered Package Ex..." Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117518" Name="117518: >Show dialog when interest set by user with no active context" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102663" Name="102663: support multiple workbench windows" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104052" Name="104052: active search of local context" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111107" Name="111107: >improve usability and scope of dynamic working set for se..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-119137" Name="119137: Task does not remember perspective" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124082" Name="124082: >Add progress bar to the category" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125987" Name="125987: >Add a possibility to set more than one &quot;interest filter&quot;" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126863" Name="126863: >Update docs by 0.50 release" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112020" Name="112020: >limit number of visible items in active search view" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121759" Name="121759: >active search tree is automatically expanded on double-click" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125173" Name="125173: >[v0.4.7] Partial functionality failures for Bugzilla 2.21" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117761" Name="117761: >Task context commit not allowed for bug under a query cat..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111258" Name="111258: verify interaction of Java active search with JSP resources" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111290" Name="111290: >Explore option to show in-editor occurences on active search" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114124" Name="114124: set up monitor scripts on eclipse.org" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114684" Name="114684: >active search matches should navigate to referring locati..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117979" Name="117979: new selection should always make parent interest positive" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120502" Name="120502: [performance] pauses during casual editor navigation" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120917" Name="120917: clean up collection of Mylar usage stats" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121309" Name="121309: improve monitor upload facility" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121316" Name="121316: >Preferences: Button for colorpicker rendered half and wit..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121317" Name="121317: >Can't drag tasks into folder in Mylar Tasks view on Mac OS X" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121442" Name="121442: Active Search hogs the CPU" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121923" Name="121923: >Mylar Java Editor doesn't trigger action through shortcut" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122931" Name="122931: >Mylar Tasks view: Dropdown starts with selected priority ..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-123330" Name="123330: temporarily unfiltered nodes stick if not selected" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124047" Name="124047: >&quot;Synchronize Reports&quot; doesn't update editor" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124887" Name="124887: >browser tab not loading web page for Bugzilla tasks" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125422" Name="125422: >Option to blacklist some file types" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125733" Name="125733: >minimization problem with task list" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125883" Name="125883: >Moving a new class doesn't update the filtered package view" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126263" Name="126263: >junit launch configurations broken in M5" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126862" Name="126862: >failure to bring compare editor into focus" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126865" Name="126865: >When deleting multiple selected tasks confirmation dialog..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-128500" Name="128500: hits should show resolved status" Priority="P1"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="Products - AspectJ" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&product=AJDT&product=AspectJ&long_desc_type=allwordssubstr&long_desc=&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=exact&email1=beatmik%40acm.org&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109759" Name="109759: >create pointcut matcher tool" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-42070" Name="42070: >Applying a perthis modifier to an aspect cause the aspect..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-50928" Name="50928: >Provide UI for advice execution ordering at join points" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-50929" Name="50929: >Provide UI for showing call graph affected by flow advice" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-50931" Name="50931: >Augment views that expose inheritance with aspect-declare..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-58688" Name="58688: >ajbrowser filter associations button doesn't work" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-63116" Name="63116: >Aspect oriented pointcuts for debugging" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-75233" Name="75233: >Pointcut &amp; advice definition wizards" Priority="P4"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="People - Wesley" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&long_desc_type=allwordssubstr&long_desc=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=wes.coelho%40gmail.com&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-119554" Name="119554: Generalize monitor uploading" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106935" Name="106935: [discussion] add provider for Visualizer" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113583" Name="113583: improve UI for activating multiple contexts" Priority="P4"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="People - Gail" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&product=Mylar&long_desc_type=allwordssubstr&long_desc=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&emailassigned_to1=1&emailtype1=substring&email1=murphy&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117827" Name="117827: >Allow collectors to output results in a tabular format" Priority="P3"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="People - Rob" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&product=Mylar&long_desc_type=allwordssubstr&long_desc=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&priority=P1&priority=P2&emailassigned_to1=1&emailtype1=substring&email1=relves&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109460" Name="109460: wrong incoming status on submitted reports/comments" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125263" Name="125263: >task list view should refresh query hits when a task changes" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126271" Name="126271: support import of task list and contexts" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126866" Name="126866: NPE in new bugzilla report wizard" Priority="P1"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117035" Name="117035: Bugzilla plugin ignores encoding" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-118582" Name="118582: improve bugzilla client support for http auth" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-123980" Name="123980: Deleting an active task should just deactivate it." Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106939" Name="106939: Bugzilla query refresh in a task list should use scheduler" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115041" Name="115041: Task highlighters look ugly on gtk" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121315" Name="121315: Preferences: Highlighter with label "orange gradient" is rendered Brown" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124321" Name="124321: explore making local tasks be a repository" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124919" Name="124919: planner should only report time Elapsed during plan period" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126444" Name="126444: >doSave(..) called too many times on MylarTaskEditor" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126618" Name="126618: >install buggzilla repositories on virtual server and setu..." Priority="P2"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="Products - Mozilla" QueryString="https://bugzilla.mozilla.org/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=mik.kersten%40eclipse.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&long_desc_type=allwordssubstr&long_desc=&emailcc1=1&emaillongdesc1=1&emailtype1=substring&email1=mik.kersten&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-224577" Name="224577: Bugzilla could use a web services interface" Priority="P4"/></BugzillaQuery><BugzillaQuery MaxHits="100" Name="Products - Eclipse" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&product=JDT&product=Platform&long_desc_type=allwordssubstr&long_desc=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=RESOLVED&emailreporter1=1&emailcc1=1&emaillongdesc1=1&emailtype1=substring&email1=beatmik&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110147" Name="110147: >[preferences][content assist] preference page issues" Priority="P2"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-9355" Name="9355: >Collapse function for block of code and comments hiding" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-37974" Name="37974: >[Tasks] Issues with task/problem view split - go back to ..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-52685" Name="52685: >[Plan Item] Evolve the Eclipse user experience *CONTINUED*" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-71901" Name="71901: >Underline and Strikethrough Font styles" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-79056" Name="79056: >[api][navigation]Providing an extension point to enable o..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-84988" Name="84988: >Resource exclusion filters" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-88293" Name="88293: [misc] Extension-Point for HyperlinkDetectors" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-90210" Name="90210: >[misc] Java editor should support guarded regions in source" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-100095" Name="100095: >Consider making URLTransfer public" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106000" Name="106000: >[plan] Need API to allow code assist/completion from outs..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113272" Name="113272: >[Browser] allow url tracking listeners to be added to the..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122611" Name="122611: >Provide a facility to save and load exclusion filters fro..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126748" Name="126748: >[search] Provide integration with the new TextSearch UI" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126085" Name="126085: >welcome screen broken with MSIE 7 beta 2" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-63692" Name="63692: [projection] Annotations in folded region are not rendered in overview ruler" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112406" Name="112406: misleading exception when web browser is not available" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-116334" Name="116334: >org.eclipse.ui.views.showView bindings don't show up in menu" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-69315" Name="69315: >Deprecated code warnings" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-79112" Name="79112: [1.5] [model] accessing annotation on Java elements" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-84431" Name="84431: >Accessibility issue with new icon for Annotations" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-89843" Name="89843: >[Commands] parameters: Keybinding for a View displayed bu..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-95634" Name="95634: >[Tree] TreeColumn does not show &quot;...&quot; on cut-off Text and..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-99984" Name="99984: >Sync view toolbar buttons are bigger with SWT manifest" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-101205" Name="101205: >[Browser] Keybindings and menus for Copy, Paste, etc. don..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104373" Name="104373: [projection] Entered text gets automatically folded away" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106428" Name="106428: Need support for deploying features depending on other features" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107280" Name="107280: >[Workbench] ShellListener.shellClosed is not called on co..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110913" Name="110913: >[api][content assist] java content assist context" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111025" Name="111025: [Viewers] setting background color on trees with columns" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111155" Name="111155: [Contributions] wrong toolbar height if first button has a pull-down menu" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113392" Name="113392: [rulers]promote annotations for folded regions" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-116084" Name="116084: >Make ChangeSetProvider and friends API" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117223" Name="117223: >trees with columns don't show tooltips" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117319" Name="117319: >&quot;Search for updates..&quot; should allow update sites to be sp..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125372" Name="125372: >make Package Explorer collapse policy optional" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121441" Name="121441: >[LinkedResources] Slow, flashy, then out of memory when c..." Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122849" Name="122849: [Model Sync] Support for change sets" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124545" Name="124545: [Viewers] FilteredTree refresh when filter is on" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124551" Name="124551: >support for strikethrough fonts" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-124702" Name="124702: [projection] redraw problem with JavaEditor.resetProject()" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125959" Name="125959: [OLE] in-place editor for PDFs" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-126767" Name="126767: >problem starting plugins with I20060207-0930" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-128233" Name="128233: >need to investigate scalability of FilteredTree" Priority="P3"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-19945" Name="19945: >DCR: date/time widget would be useful" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-37997" Name="37997: >[Plan Item] Evolve the Eclipse user experience" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115152" Name="115152: >[package explorer] Improved for compressed folders in the..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107082" Name="107082: npe in IconAndMessageDialog.getSWTImage(..)" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-37154" Name="37154: >[Team] Support for subversion" Priority="P5"/></BugzillaQuery><BugzillaQuery MaxHits="500" Name="Low Priority" QueryString="https://bugs.eclipse.org/bugs/buglist.cgi?GoAheadAndLogIn=1&Bugzilla_login=beatmik%40acm.org&Bugzilla_password=1umberto&short_desc_type=allwordssubstr&short_desc=&product=Mylar&long_desc_type=allwordssubstr&long_desc=&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&priority=P4&priority=P5&emailassigned_to1=1&emailtype1=substring&email1=beatmik%40acm.org&order=Importance" RepositoryUrl="https://bugs.eclipse.org/bugs"><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-58646" Name="58646: >[Coop] pluggable hyperlink policy support" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102678" Name="102678: improve distinguishing between editor selections and edits" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102851" Name="102851: >support adding attachments to reports" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102854" Name="102854: >add bug editor support for voting" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103093" Name="103093: >spell checking of bugzilla comments" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103516" Name="103516: Should be able to map highlighters to priority" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103736" Name="103736: add interest sorter to problems list" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103932" Name="103932: >drag-and-drop patching" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104062" Name="104062: in "new bug report", put the previously-submitted to components on top" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104247" Name="104247: support decorators in task list" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104287" Name="104287: Alt+Click does not work in the Java Browsing Perspective" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104341" Name="104341: add interest scaling factor control" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104485" Name="104485: >broaden composite contexts" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104497" Name="104497: >[discussion] automatic task activation" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104601" Name="104601: >support mylar running on JDK 1.4" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104783" Name="104783: landmarks blink on save" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106976" Name="106976: >[discussion] property-based interest filtering" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107259" Name="107259: >[discussion] provide preview of task context" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107264" Name="107264: >make active hierarchy update lazily" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107596" Name="107596: >[discussion] XP / Agile support features" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109552" Name="109552: >add workflow to task completion" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109559" Name="109559: add "dependant project" degree of separation" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109905" Name="109905: [discussion] plan JIRA support" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110547" Name="110547: >Active Search view could show additional relevant info" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111218" Name="111218: >[discussion] sharing and awareness of task context" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111362" Name="111362: manage resource history" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111540" Name="111540: add overlay to indicate task completion" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111698" Name="111698: >provide spring framework specific active search features" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111700" Name="111700: >provide wtp xml editor integration" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111713" Name="111713: >add mylar filter to debug view" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111864" Name="111864: make open type history sorting be based on interest" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111865" Name="111865: create welcome page" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112235" Name="112235: >[discussion] expose interest threshold filter" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112669" Name="112669: add optional categories for completed today, completed this week" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113470" Name="113470: apply mylar to task list" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113848" Name="113848: support attaching context to bug report" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114040" Name="114040: imporove web docs integration" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114047" Name="114047: allow junit test suite of current context to run with low process priority" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115200" Name="115200: >Drag-n-drop of java file nodes to active search view" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115941" Name="115941: >provide web forum based issue provider" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120469" Name="120469: Decouple bugzilla task reading" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120504" Name="120504: >Read task contexts independently of the workspace" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122469" Name="122469: [performance] create structure bridge cache" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-123120" Name="123120: create full-screen screenshots of Mylar usage" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-123527" Name="123527: support mutliple status values" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-123699" Name="123699: >Breakpoints retined by task context" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106990" Name="106990: Add support for Bugzilla integrated into Collabnet" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107348" Name="107348: Mylar should not increase interest when scrolling trough search results" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112424" Name="112424: test for failure of non-filtered mode refresh" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113024" Name="113024: >Reminder date chooser forces date selection" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120189" Name="120189: >add version field to InteractionEvent" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-101724" Name="101724: >differentiating between xml edits and selections" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-102853" Name="102853: >bug search dialog is clunky" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103283" Name="103283: make predicted interest errors work for plugin.xml and other resources" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103365" Name="103365: monitor scrolling activity" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103566" Name="103566: >create UI for removing all offline reports" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104340" Name="104340: multiple tasks active not working correctly" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104362" Name="104362: >doc comments of fields are not folded" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104782" Name="104782: ensure that mylar viewer management removes facilities on view close" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-104799" Name="104799: show filtered fails to clear root nodes in navigator view" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106921" Name="106921: >allow columns to be configured in task list" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106922" Name="106922: >Submitting Data from bug report is blocking UI" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106940" Name="106940: >[discussion] support for QA tools" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-106943" Name="106943: >Add dropdown for filters previously used on the tasklist" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107091" Name="107091: >Add preview of the task context highlighters to the prefs..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107169" Name="107169: consider making ITaskListElement(s) adapt to tasks" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107174" Name="107174: >localize messages to a single class and bundle" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107491" Name="107491: >add disabled icons" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107949" Name="107949: active hierarchy should update based on model changes" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-107991" Name="107991: make one level of subtypes show in Active Hierarchy" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-108021" Name="108021: make monitor listen to all preference changes" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-108063" Name="108063: create policy for re-running active searches" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-108067" Name="108067: when activating a new report automatically populate context with stack" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-108441" Name="108441: make relation providers extension point based" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109214" Name="109214: create active serach UI test harness" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109259" Name="109259: working set filter interacts badly with mylar filter" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109314" Name="109314: auto folding hides annotation matches" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109454" Name="109454: make online access mode to report trigger offline mode" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109643" Name="109643: improve active search invalidation for calls" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109678" Name="109678: create mylar perspectives" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-109928" Name="109928: make documentation available online" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110037" Name="110037: find referencing contexts" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110042" Name="110042: consider limiting size of active search matches" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110281" Name="110281: move commons dependancies to be on SDK" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110471" Name="110471: >propagate highlighting to files when declarations filtere..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-110892" Name="110892: repeated searches should not induce landmark interest" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111165" Name="111165: >[discussion] can files be landmarks?" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111266" Name="111266: make Active Search work for Ant references" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-111716" Name="111716: >[discussion] explore exposing context model scaling factors" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112016" Name="112016: text selections in xml files will get recorded twice" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-112721" Name="112721: handle interest level for type refactorings and element deletion" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-113187" Name="113187: make content type an extension, not API" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114050" Name="114050: support plans in task list" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114561" Name="114561: restructure and fix up documentation" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114832" Name="114832: >[discussion] figure out overlap between Mylar Tasks and B..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114966" Name="114966: fix web docs support" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-115498" Name="115498: [discussion] rewind and replay of context capture" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-116487" Name="116487: >add performance tests" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-116514" Name="116514: support building against IBM JDK" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117233" Name="117233: xml and bugzilla bridges should implement retrieving children" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117517" Name="117517: add support for commit comment templates" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-117587" Name="117587: clean up 3.1 build process" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-119307" Name="119307: resources and other moved elements should maintain interest" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-120952" Name="120952: [discussion] provide task/issue repository view and extension points" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-121000" Name="121000: make monitor interaction event externalization consistent with core" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122927" Name="122927: >[mac] Mylar Editor: missing rectangle around Documentatio..." Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-122928" Name="122928: >[mac] task editor triangle looks ugly when it has focus" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-125936" Name="125936: add option to activate tasks on open" Priority="P4"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-103728" Name="103728: consider changing active search quick view to JavaOutlineInformationControl subclass" Priority="P5"/><BugzillaQueryHit Handle="https://bugs.eclipse.org/bugs-114254" Name="114254: create new landmark manipulation icons and fix names" Priority="P5"/></BugzillaQuery></TaskList>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/performance/tasklist-4000.xml.zip b/org.eclipse.mylyn.tasks.tests/testdata/performance/tasklist-4000.xml.zip
new file mode 100644
index 0000000..eb1a6e4
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/performance/tasklist-4000.xml.zip differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdata-1.0-bug-219897.zip b/org.eclipse.mylyn.tasks.tests/testdata/taskdata-1.0-bug-219897.zip
new file mode 100644
index 0000000..8242f58
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/taskdata-1.0-bug-219897.zip differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/context-history.xml b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/context-history.xml
new file mode 100644
index 0000000..dd16c26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/context-history.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><InteractionHistory Id="context-history" Version="1"><InteractionEvent Delta="deactivated" EndDate="2006-02-16 16:49:47.477 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:49:47.477 PST" StructureHandle="attention" StructureKind="context"/><InteractionEvent Delta="activated" EndDate="2006-02-16 16:49:52.917 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:49:52.917 PST" StructureHandle="attention" StructureKind="context"/><InteractionEvent Delta="activated" EndDate="2006-02-16 16:50:13.483 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:50:13.483 PST" StructureHandle="local-69" StructureKind="context"/><InteractionEvent Delta="deactivated" EndDate="2006-02-16 16:51:07.858 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:51:07.858 PST" StructureHandle="local-69" StructureKind="context"/><InteractionEvent Delta="activated" EndDate="2006-02-16 16:51:11.575 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:51:11.575 PST" StructureHandle="local-69" StructureKind="context"/><InteractionEvent Delta="deactivated" EndDate="2006-02-16 16:51:17.455 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:51:17.455 PST" StructureHandle="local-69" StructureKind="context"/><InteractionEvent Delta="deactivated" EndDate="2006-02-16 16:53:18.688 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:53:18.688 PST" StructureHandle="attention" StructureKind="context"/><InteractionEvent Delta="activated" EndDate="2006-02-16 16:55:28.476 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:55:28.476 PST" StructureHandle="local-70" StructureKind="context"/><InteractionEvent Delta="deactivated" EndDate="2006-02-16 16:55:31.451 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 16:55:31.451 PST" StructureHandle="local-70" StructureKind="context"/><InteractionEvent Delta="activated" EndDate="2006-02-16 17:02:58.887 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 17:02:58.887 PST" StructureHandle="local-70" StructureKind="context"/><InteractionEvent Delta="deactivated" EndDate="2006-02-16 17:03:28.429 PST" Interest="1.0" Kind="command" Navigation="" OriginId="org.eclipse.mylyn.core" StartDate="2006-02-16 17:03:28.429 PST" StructureHandle="local-70" StructureKind="context"/></InteractionHistory>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-69.xml b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-69.xml
new file mode 100644
index 0000000..eb65a14
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-69.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><InteractionHistory Id="local-69" Version="1"><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.136" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.34000003" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="19.294" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 16:50:16.718 PST" StructureHandle="=TestProject/&lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.136" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.34000003" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="19.294" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 16:50:16.718 PST" StructureHandle="=TestProject" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.136" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.22100002" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:50:29.701 PST" Interest="1.0" Kind="selection" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 16:50:29.701 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:50:37.435 PST" Interest="2.0" Kind="edit" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 16:50:31.184 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="7.3639994" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 16:50:40.260 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.102000006" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.34000003" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="19.294" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 16:50:16.718 PST" StructureHandle="=TestProject/" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.102000006" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.323" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:00.525 PST" Interest="5.0" Kind="selection" Navigation="null" OriginId="org.eclipse.jdt.ui.PackageExplorer" StartDate="2006-02-16 16:50:23.49 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="9.73" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 16:50:29.701 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.08500001" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&lt;{TestClass1.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.34000003" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&lt;{TestClass1.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:04.1 PST" Interest="4.0" Kind="selection" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 16:50:16.718 PST" StructureHandle="=TestProject/&lt;{TestClass1.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:50:27.457 PST" Interest="1.0" Kind="edit" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 16:50:27.457 PST" StructureHandle="=TestProject/&lt;{TestClass1.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.08500001" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.34000003" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="19.294" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 16:50:16.718 PST" StructureHandle="" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:17.4 PST" Interest="-0.051000003" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:17.4 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2~sayHello" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:07.437 PST" Interest="-0.17000002" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 16:51:07.437 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2~sayHello" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:51:13.658 PST" Interest="4.0" Kind="selection" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 16:50:40.260 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2~sayHello" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 16:50:58.452 PST" Interest="5.0" Kind="edit" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 16:50:41.271 PST" StructureHandle="=TestProject/&lt;{TestClass2.java[TestClass2~sayHello" StructureKind="java"/></InteractionHistory>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-70.xml b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-70.xml
new file mode 100644
index 0000000..00be694
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/local-70.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><InteractionHistory Id="local-70" Version="1"><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:27.538 PST" Interest="-0.068" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:23.491 PST" Interest="4.649" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 17:03:04.507 PST" StructureHandle="=TestProject" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:27.538 PST" Interest="-0.068" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/&lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:23.481 PST" Interest="4.6489997" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 17:03:04.497 PST" StructureHandle="=TestProject/&lt;" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:27.538 PST" Interest="-0.068" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:23.491 PST" Interest="4.649" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 17:03:04.497 PST" StructureHandle="=TestProject/" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:27.538 PST" Interest="-0.068" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:21.898 PST" Interest="2.0" Kind="selection" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 17:03:04.497 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:15.807 PST" Interest="1.0" Kind="edit" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 17:03:15.807 PST" StructureHandle="=TestProject/&lt;{TestClass2.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:27.538 PST" Interest="-0.068" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:23.491 PST" Interest="4.649" Kind="propagation" Navigation="org.eclipse.mylyn.core.model.edges.containment" OriginId="org.eclipse.mylyn.core.model.interest.propagation" StartDate="2006-02-16 17:03:04.507 PST" StructureHandle="" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:27.538 PST" Interest="-0.034" Kind="manipulation" Navigation="null" OriginId="org.eclipse.mylyn.core.model.interest.decay" StartDate="2006-02-16 17:03:27.538 PST" StructureHandle="=TestProject/&lt;{TestClass1.java" StructureKind="java"/><InteractionEvent Delta="null" EndDate="2006-02-16 17:03:23.481 PST" Interest="2.0" Kind="selection" Navigation="null" OriginId="org.eclipse.jdt.ui.CompilationUnitEditor" StartDate="2006-02-16 17:03:20.696 PST" StructureHandle="=TestProject/&lt;{TestClass1.java" StructureKind="java"/></InteractionHistory>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2006-02-16.zip b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2006-02-16.zip
new file mode 100644
index 0000000..3266749
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2006-02-16.zip differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2007-01-19.zip b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2007-01-19.zip
new file mode 100644
index 0000000..83a6ff7
Binary files /dev/null and b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/mylardata-2007-01-19.zip differ
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/repositories.xml b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/repositories.xml
new file mode 100644
index 0000000..bb00677
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/repositories.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TaskRepositories OutputVersion="1">
+<TaskRepository encoding="UTF-8" kind="bugzilla" timezone="Canada/Pacific" url="https://bugzilla.mozilla.org/" lastsynctimestamp="2006-06-26 01:14:10 PDT" version="2.22"/>
+<TaskRepository encoding="UTF-8" kind="bugzilla" timezone="Canada/Eastern" url="https://bugs.eclipse.org/bugs" lastsynctimestamp="2006-06-26 13:30:14" version="2.20" /></TaskRepositories>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/tasklist.xml b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/tasklist.xml
new file mode 100644
index 0000000..c5848ef
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.tests/testdata/taskdataimporttest/tasklist.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><TaskList Version="1.0.1"><BugzillaTaskRegistryCategory/><TaskCategory Name="Catagory 1"><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 16:49:20.249 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-73" IssueURL="http://" Kind="" Label="Category 1 - Task 1" Notes="" Priority="P3" Reminded="false" ReminderDate=""/></TaskCategory><TaskCategory Name="Category 2"><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 16:49:09.540 PST" Elapsed="0" EndDate="" Estimated="0" Handle="local-72" IssueURL="http://" Kind="" Label="Category 2 - Task 1" Notes="" Priority="P3" Reminded="false" ReminderDate=""/></TaskCategory><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 16:48:09.355 PST" Elapsed="55777" EndDate="" Estimated="0" Handle="local-69" IssueURL="http://" Kind="" Label="Root Task 1" Notes="" Priority="P3" Reminded="false" ReminderDate=""/><Task Active="false" Bugzilla="false" Complete="false" CreationDate="2006-02-16 16:48:22.478 PST" Elapsed="31626" EndDate="" Estimated="0" Handle="local-70" IssueURL="http://" Kind="" Label="Root Task 2" Notes="" Priority="P3" Reminded="false" ReminderDate=""/></TaskList>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.tests/testdata/tasklistdatamigrationtest/empty.txt b/org.eclipse.mylyn.tasks.tests/testdata/tasklistdatamigrationtest/empty.txt
new file mode 100644
index 0000000..e69de29
diff --git a/org.eclipse.mylyn.tasks.ui/.classpath b/org.eclipse.mylyn.tasks.ui/.classpath
new file mode 100644
index 0000000..59d3d34
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.classpath
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/internal/provisional/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/search/internal/ui/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/search/internal/*"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.tasks.ui/.cvsignore b/org.eclipse.mylyn.tasks.ui/.cvsignore
new file mode 100644
index 0000000..4a98758
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.fbwarnings
diff --git a/org.eclipse.mylyn.tasks.ui/.options b/org.eclipse.mylyn.tasks.ui/.options
new file mode 100644
index 0000000..54de56b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.options
@@ -0,0 +1 @@
+org.eclipse.mylyn.tasks.ui/debug/httpclient=true
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.project b/org.eclipse.mylyn.tasks.ui/.project
new file mode 100644
index 0000000..4e9857c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.tasks.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/39/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/39/refactorings.history
new file mode 100644
index 0000000..5051fd4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/39/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 2 elements(s) to 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui.wizard' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui.wizard' - Original elements: org.eclipse.mylar.internal.tasks.ui.wizards.NewWebTaskPage.java org.eclipse.mylar.internal.tasks.ui.wizards.NewWebTaskWizard.java" description="Copy compilation units" destination="/src<org.eclipse.mylar.internal.trac.ui.wizard" element1="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewWebTaskPage.java" element2="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewWebTaskWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewWebTaskPage.java	true	false /src<org.eclipse.mylar.internal.tasks.ui.wizards{NewWebTaskWizard.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1159711445081" units="2" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.NewBugEditor' to 'AbstractNewRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.NewBugEditor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskEditor' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'NewBugEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{NewBugEditor.java[NewBugEditor" matchStrategy="1" name="AbstractNewRepositoryTaskEditor" qualified="false" references="true" similarDeclarations="false" stamp="1159727634024" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/39/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/39/refactorings.index
new file mode 100644
index 0000000..b34075d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/39/refactorings.index
@@ -0,0 +1,2 @@
+1159711445081 Copy compilation units
+1159727634024 Rename type 'NewBugEditor'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/41/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/41/refactorings.history
new file mode 100644
index 0000000..d716c3a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/41/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void moveToContainer(final List<ITaskListElement> selectedElements)' from 'org.eclipse.mylar.internal.tasks.ui.MoveToCategoryMenuContributor.getSubMenuManager().new NewCategoryAction() {...}.run()' to 'org.eclipse.mylar.internal.tasks.ui.MoveToCategoryMenuContributor' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'moveToContainer' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.MoveToCategoryMenuContributor' - Declared visibility: 'private' - Generate method comment" comments="true" description="Extract method 'moveToContainer'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui{MoveToCategoryMenuContributor.java" name="moveToContainer" replace="false" selection="3129 470" stamp="1160488561511" version="1.0" visibility="2"/>
+<refactoring comment="Change method 'private void org.eclipse.mylar.internal.tasks.ui.MoveToCategoryMenuContributor.moveToContainer(List<ITaskListElement> selectedElements)' to 'private void moveToContainer(List<ITaskListElement> selectedElements, AbstractTaskContainer container)' - Original project: 'org.eclipse.mylar.tasks.ui' - Added parameters: AbstractTaskContainer container" default2="null" delegate="false" deprecate="true" description="Change method 'moveToContainer'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui{MoveToCategoryMenuContributor.java[MoveToCategoryMenuContributor~moveToContainer~QList\<QITaskListElement;>;" name="moveToContainer" parameter1="List<ITaskListElement> selectedElements 0 List<ITaskListElement> selectedElements false" parameter2="Object newParam -1 AbstractTaskContainer container false" stamp="1160488660965" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.MoveToNewCategoryAction.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{MoveToNewCategoryAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1160488772344" subPackages="false" version="1.0"/>
+<refactoring comment="Change method 'private void org.eclipse.mylar.internal.tasks.ui.MoveToCategoryMenuContributor.moveToContainer(List<ITaskListElement> selectedElements, AbstractTaskContainer category)' to 'private void moveToCategory(List<ITaskListElement> selectedElements, AbstractTaskContainer category)' - Original project: 'org.eclipse.mylar.tasks.ui' - New name: 'moveToCategory' - Changed parameters: AbstractTaskContainer container" delegate="false" deprecate="true" description="Change method 'moveToContainer'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui{MoveToCategoryMenuContributor.java[MoveToCategoryMenuContributor~moveToContainer~QList\<QITaskListElement;>;~QAbstractTaskContainer;" name="moveToCategory" parameter1="List<ITaskListElement> selectedElements 0 List<ITaskListElement> selectedElements false" parameter2="AbstractTaskContainer container 1 AbstractTaskContainer category false" stamp="1160489156969" version="1.0"/>
+<refactoring comment="Change method 'private void org.eclipse.mylar.internal.tasks.ui.MoveToCategoryMenuContributor.moveToCategory(List<ITaskListElement> selectedElements, AbstractTaskContainer category)' to 'public void moveToCategory(List<ITaskListElement> selectedElements, AbstractTaskContainer category)' - Original project: 'org.eclipse.mylar.tasks.ui' - New visibility: 'public'" delegate="false" deprecate="true" description="Change method 'moveToCategory'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui{MoveToCategoryMenuContributor.java[MoveToCategoryMenuContributor~moveToCategory~QList\<QITaskListElement;>;~QAbstractTaskContainer;" name="moveToCategory" parameter1="List<ITaskListElement> selectedElements 0 List<ITaskListElement> selectedElements false" parameter2="AbstractTaskContainer category 1 AbstractTaskContainer category false" stamp="1160568202667" version="1.0" visibility="1"/>
+<refactoring comment="Copy 1 elements(s) to 'temp/src' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'temp/src' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.TaskSelectionDialog.java'" description="Copy compilation unit" destination="/src" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{TaskSelectionDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{TaskSelectionDialog.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1160667061627" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/41/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/41/refactorings.index
new file mode 100644
index 0000000..4cee9a5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/41/refactorings.index
@@ -0,0 +1,6 @@
+1160488561511 Extract method 'moveToContainer'
+1160488660965 Change method 'moveToContainer'
+1160488772344 Delete element
+1160489156969 Change method 'moveToContainer'
+1160568202667 Change method 'moveToCategory'
+1160667061627 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..07301ba
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.EXPANDED_STATE_ATTRIBUTES' from expression 'false' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'EXPANDED_STATE_ATTRIBUTES' - Constant expression: 'false' - Declared visibility: 'private'" description="Extract constant 'EXPANDED_STATE_ATTRIBUTES'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="EXPANDED_STATE_ATTRIBUTES" qualify="false" replace="false" selection="21288 5" stamp="1161018493875" version="1.0" visibility="2"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/schema/providers.exsd' to 'actions.exsd' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'providers.exsd'" description="Rename resource 'providers.exsd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="schema/providers.exsd" name="actions.exsd" stamp="1161047353875" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.getDynamicMenuContributers()' to 'getDynamicMenuMap' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.getDynamicMenuContributers()' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.getDynamicMenuMap()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDynamicMenuContributers'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getDynamicMenuContributers" name="getDynamicMenuMap" references="true" stamp="1161048546421" version="1.0"/>
+<refactoring comment="Extract method 'private void updateTaskProgressBar(DateRangeContainer week)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListFilteredTree.createProgressComposite().new ITaskActivityListener() {...}.activityChanged()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListFilteredTree.createProgressComposite().new ITaskActivityListener() {...}' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'updateTaskProgressBar' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListFilteredTree.createProgressComposite().new ITaskActivityListener() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'updateTaskProgressBar'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListFilteredTree.java" name="updateTaskProgressBar" replace="false" selection="2192 587" stamp="1161060459671" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'SEPARATOR_REPORTS' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'SEPARATOR_REPOSITORY' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.SEPARATOR_REPORTS' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.SEPARATOR_REPOSITORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SEPARATOR_REPORTS'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^SEPARATOR_REPORTS" name="SEPARATOR_REPOSITORY" references="true" setter="false" stamp="1161144544859" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'SEPARATOR_LOCAL' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'ID_SEPARATOR_LOCAL' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.SEPARATOR_LOCAL' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.ID_SEPARATOR_LOCAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SEPARATOR_LOCAL'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^SEPARATOR_LOCAL" name="ID_SEPARATOR_LOCAL" references="true" setter="false" stamp="1161144567296" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'SEPARATOR_CONTEXT' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'ID_SEPARATOR_CONTEXT' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.SEPARATOR_CONTEXT' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.ID_SEPARATOR_CONTEXT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SEPARATOR_CONTEXT'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^SEPARATOR_CONTEXT" name="ID_SEPARATOR_CONTEXT" references="true" setter="false" stamp="1161144584843" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'SEPARATOR_REPOSITORY' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'ID_SEPARATOR_REPOSITORY' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.SEPARATOR_REPOSITORY' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.ID_SEPARATOR_REPOSITORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SEPARATOR_REPOSITORY'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^SEPARATOR_REPOSITORY" name="ID_SEPARATOR_REPOSITORY" references="true" setter="false" stamp="1161144610437" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'SEPARATOR_FILTERS' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'ID_SEPARATOR_FILTERS' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.SEPARATOR_FILTERS' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.ID_SEPARATOR_FILTERS' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SEPARATOR_FILTERS'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^SEPARATOR_FILTERS" name="ID_SEPARATOR_FILTERS" references="true" setter="false" stamp="1161144622468" textual="true" version="1.0"/>
+<refactoring comment="Extract method 'private void init(ITask task)' from 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorInput.TaskEditorInput()' to 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorInput' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'init' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorInput' - Declared visibility: 'private'" comments="false" description="Extract method 'init'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskEditorInput.java" name="init" replace="false" selection="2234 123" stamp="1161277420203" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'fOKColor' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar' to 'completedColor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.fOKColor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.completedColor' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'fOKColor'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskProgressBar.java[TaskProgressBar^fOKColor" name="completedColor" references="true" setter="false" stamp="1161296083875" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'fColorBarWidth' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar' to 'colorBarWidth' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.fColorBarWidth' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.colorBarWidth' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'fColorBarWidth'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskProgressBar.java[TaskProgressBar^fColorBarWidth" name="colorBarWidth" references="true" setter="false" stamp="1161296097812" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'fCurrentTickCount' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar' to 'currentTickCount' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.fCurrentTickCount' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.currentTickCount' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'fCurrentTickCount'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskProgressBar.java[TaskProgressBar^fCurrentTickCount" name="currentTickCount" references="true" setter="false" stamp="1161296156593" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'fMaxTickCount' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar' to 'maxTickCount' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.fMaxTickCount' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar.maxTickCount' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'fMaxTickCount'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskProgressBar.java[TaskProgressBar^fMaxTickCount" name="maxTickCount" references="true" setter="false" stamp="1161296161625" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.ActivateTaskAction' to 'ActivateTaskDialogAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.ActivateTaskAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.ActivateTaskDialogAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.plugin.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ActivateTaskAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{ActivateTaskAction.java[ActivateTaskAction" matchStrategy="1" name="ActivateTaskDialogAction" patterns="*.mf, *.plugin.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161298661375" textual="true" version="1.0"/>
+<refactoring comment="Extract method 'private void initActivityHistory()' from 'org.eclipse.mylar.tasks.ui.TaskListManager.readExistingOrCreateNewList()' to 'org.eclipse.mylar.tasks.ui.TaskListManager' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'initActivityHistory' - Destination type: 'org.eclipse.mylar.tasks.ui.TaskListManager' - Declared visibility: 'private'" comments="false" description="Extract method 'initActivityHistory'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java" name="initActivityHistory" replace="false" selection="20271 89" stamp="1161361025796" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'taskActivationHistory' in 'org.eclipse.mylar.tasks.ui.TaskListManager' to 'taskActivityHistory' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.taskActivationHistory' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.taskActivityHistory' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'taskActivationHistory'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager^taskActivationHistory" name="taskActivityHistory" references="true" setter="false" stamp="1161361159125" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.setReminder(...)' to 'setScheduledFor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.setReminder(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.setScheduledFor(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setReminder'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~setReminder~QITask;~QDate;" name="setScheduledFor" references="true" stamp="1161381231156" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderToday(...)' to 'isScheduledForToday' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderToday(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isScheduledForToday(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isReminderToday'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~isReminderToday~QITask;" name="isScheduledForToday" references="true" stamp="1161381246468" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderThisWeek(...)' to 'isScheduledForThisWeek' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderThisWeek(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isScheduledForThisWeek(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isReminderThisWeek'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~isReminderThisWeek~QITask;" name="isScheduledForThisWeek" references="true" stamp="1161381269593" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderLater(...)' to 'isScheduledForLater' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderLater(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isScheduledForLater(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isReminderLater'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~isReminderLater~QITask;" name="isScheduledForLater" references="true" stamp="1161381281250" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderAfterThisWeek(...)' to 'isScheduledAfterThisWeek' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isReminderAfterThisWeek(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isScheduledAfterThisWeek(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isReminderAfterThisWeek'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~isReminderAfterThisWeek~QITask;" name="isScheduledAfterThisWeek" references="true" stamp="1161381292546" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..d729098
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1,23 @@
+1161018493875 Extract constant 'EXPANDED_STATE_ATTRIBUTES'
+1161047353875 Rename resource 'providers.exsd'
+1161048546421 Rename method 'getDynamicMenuContributers'
+1161052465486 Rename type 'OpenBugzillaReportJob'
+1161060459671 Extract method 'updateTaskProgressBar'
+1161144544859 Rename field 'SEPARATOR_REPORTS'
+1161144567296 Rename field 'SEPARATOR_LOCAL'
+1161144584843 Rename field 'SEPARATOR_CONTEXT'
+1161144610437 Rename field 'SEPARATOR_REPOSITORY'
+1161144622468 Rename field 'SEPARATOR_FILTERS'
+1161277420203 Extract method 'init'
+1161296083875 Rename field 'fOKColor'
+1161296097812 Rename field 'fColorBarWidth'
+1161296156593 Rename field 'fCurrentTickCount'
+1161296161625 Rename field 'fMaxTickCount'
+1161298661375 Rename type 'ActivateTaskAction'
+1161361025796 Extract method 'initActivityHistory'
+1161361159125 Rename field 'taskActivationHistory'
+1161381231156 Rename method 'setReminder'
+1161381246468 Rename method 'isReminderToday'
+1161381269593 Rename method 'isReminderThisWeek'
+1161381281250 Rename method 'isReminderLater'
+1161381292546 Rename method 'isReminderAfterThisWeek'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/43/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/43/refactorings.history
new file mode 100644
index 0000000..d9136ca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/43/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler.SEPARATOR' from expression '"\n---------------\n"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'SEPARATOR' - Constant expression: '"\n---------------\n"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'SEPARATOR'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListToolTipHandler.java" name="SEPARATOR" qualify="false" replace="true" selection="4672 21" stamp="1161642634265" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void updateContainerProgressBar(TaskProgressBar taskProgressBar)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler.createTipShell()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'updateContainerProgressBar' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler' - Declared visibility: 'private'" comments="false" description="Extract method 'updateContainerProgressBar'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListToolTipHandler.java" name="updateContainerProgressBar" replace="false" selection="3999 29" stamp="1161653754000" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'AbstractRepositoryTaskFormPage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskFormPage' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor" matchStrategy="1" name="AbstractRepositoryTaskFormPage" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161667170218" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskEditor' to 'AbstractNewRepositoryTaskFormPage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskEditor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskFormPage' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractNewRepositoryTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java[AbstractNewRepositoryTaskEditor" matchStrategy="1" name="AbstractNewRepositoryTaskFormPage" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161667300125" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskFormPage' to 'AbstractRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskFormPage' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryTaskFormPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskFormPage.java[AbstractRepositoryTaskFormPage" matchStrategy="1" name="AbstractRepositoryTaskEditor" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161670058812" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskFormPage' to 'AbstractNewRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskFormPage' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskEditor' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractNewRepositoryTaskFormPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractNewRepositoryTaskFormPage.java[AbstractNewRepositoryTaskFormPage" matchStrategy="1" name="AbstractNewRepositoryTaskEditor" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161670085906" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.TaskReminderMenuContributor' to 'ScheduleTaskMenuContributor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskReminderMenuContributor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.ScheduleTaskMenuContributor' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskReminderMenuContributor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskReminderMenuContributor.java[TaskReminderMenuContributor" matchStrategy="1" name="ScheduleTaskMenuContributor" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161723440421" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private ITask getTaskForElement(ITaskListElement element)' from 'org.eclipse.mylar.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager().new Action() {...}.run()' to 'org.eclipse.mylar.internal.tasks.ui.ScheduleTaskMenuContributor' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'getTaskForElement' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ScheduleTaskMenuContributor' - Declared visibility: 'private'" comments="false" description="Extract method 'getTaskForElement'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui{ScheduleTaskMenuContributor.java" name="getTaskForElement" replace="false" selection="8825 222" stamp="1161725265656" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/43/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/43/refactorings.index
new file mode 100644
index 0000000..3d94e37
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/43/refactorings.index
@@ -0,0 +1,8 @@
+1161642634265 Extract constant 'SEPARATOR'
+1161653754000 Extract method 'updateContainerProgressBar'
+1161667170218 Rename type 'AbstractRepositoryTaskEditor'
+1161667300125 Rename type 'AbstractNewRepositoryTaskEditor'
+1161670058812 Rename type 'AbstractRepositoryTaskFormPage'
+1161670085906 Rename type 'AbstractNewRepositoryTaskFormPage'
+1161723440421 Rename type 'TaskReminderMenuContributor'
+1161725265656 Extract method 'getTaskForElement'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/44/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/44/refactorings.history
new file mode 100644
index 0000000..cce8d36
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/44/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private Object getAdapterHelper(Class adapter)' from 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.getAdapter()' to 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'getAdapterHelper' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' - Declared visibility: 'private'" comments="false" description="Extract method 'getAdapterHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.search{RepositorySearchResultView.java" name="getAdapterHelper" replace="false" selection="8771 99" stamp="1162334528203" version="1.0" visibility="2"/>
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original elements: org.eclipse.mylar.internal.tasks.ui.actions.OpenWithBrowserAction.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenWithBrowserAction.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1162336660421" version="1.0"/>
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original elements: org.eclipse.mylar.internal.tasks.ui.views.TaskKeyComparator.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskKeyComparator.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1162337211515" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/44/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/44/refactorings.index
new file mode 100644
index 0000000..adf6965
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/10/44/refactorings.index
@@ -0,0 +1,3 @@
+1162334528203 Extract method 'getAdapterHelper'
+1162336660421 Infer generic type arguments
+1162337211515 Infer generic type arguments
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..0e58bd5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'bugSortByPriorityAction' in 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' to 'sortByPriorityAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.bugSortByPriorityAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.sortByPriorityAction' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'bugSortByPriorityAction'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.search{RepositorySearchResultView.java[RepositorySearchResultView^bugSortByPriorityAction" name="sortByPriorityAction" references="true" setter="false" stamp="1162425824156" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'bugSortByDescriptionAction' in 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' to 'sortByDescriptionAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.bugSortByDescriptionAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.sortByDescriptionAction' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'bugSortByDescriptionAction'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.search{RepositorySearchResultView.java[RepositorySearchResultView^bugSortByDescriptionAction" name="sortByDescriptionAction" references="true" setter="false" stamp="1162425836093" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'bugCurrentSortOrder' in 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' to 'currentSortOrder' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.bugCurrentSortOrder' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.currentSortOrder' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'bugCurrentSortOrder'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.search{RepositorySearchResultView.java[RepositorySearchResultView^bugCurrentSortOrder" name="currentSortOrder" references="true" setter="false" stamp="1162425840828" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'bugContentProvider' in 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' to 'taskContentProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.bugContentProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView.taskContentProvider' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'bugContentProvider'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.search{RepositorySearchResultView.java[RepositorySearchResultView^bugContentProvider" name="taskContentProvider" references="true" setter="false" stamp="1162425848734" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.tests/src/org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.tests/src/org.eclipse.mylar.tasks.tests' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListTest.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.tests" element1="/src<org.eclipse.mylar.tasks.ui{TaskListTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1162605843921" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..53543b9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1,5 @@
+1162425824156 Rename field 'bugSortByPriorityAction'
+1162425836093 Rename field 'bugSortByDescriptionAction'
+1162425840828 Rename field 'bugCurrentSortOrder'
+1162425848734 Rename field 'bugContentProvider'
+1162605843921 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/45/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/45/refactorings.history
new file mode 100644
index 0000000..2dcec63
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/45/refactorings.history
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.team/src/org.eclipse.mylar.internal.team.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.team/src/org.eclipse.mylar.internal.team.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.ApplyPatchAction.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.team.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{ApplyPatchAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1162929151046" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.CopyDetailsAction' to 'CopyTaskDetailsAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.CopyDetailsAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.CopyTaskDetailsAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'CopyDetailsAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{CopyDetailsAction.java[CopyDetailsAction" matchStrategy="1" name="CopyTaskDetailsAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1162950135000" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.submitBug()' to 'submitToRepository' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.submitBug()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.submitToRepository()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'submitBug'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~submitBug" name="submitToRepository" references="true" stamp="1162973562937" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.updateBug()' to 'updateTask' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.updateBug()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.updateTask()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateBug'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~updateBug" name="updateTask" references="true" stamp="1162973598671" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.ExistingBugEditorInput' to 'RepositoryTaskEditorInput' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.ExistingBugEditorInput' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.RepositoryTaskEditorInput' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ExistingBugEditorInput'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{ExistingBugEditorInput.java[ExistingBugEditorInput" matchStrategy="1" name="RepositoryTaskEditorInput" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1162974336687" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractBugEditorInput' to 'AbstractTaskEditorInput' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractBugEditorInput' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractTaskEditorInput' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractBugEditorInput'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractBugEditorInput.java[AbstractBugEditorInput" matchStrategy="1" name="AbstractTaskEditorInput" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1162974371218" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.NewBugEditorInput' to 'NewTaskEditorInput' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.NewBugEditorInput' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.NewTaskEditorInput' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'NewBugEditorInput'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{NewBugEditorInput.java[NewBugEditorInput" matchStrategy="1" name="NewTaskEditorInput" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1163110516421" textual="false" version="1.0"/>
+
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.util' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.util' - Original element: 'org.eclipse.mylar.internal.tasks.ui.HTML2TextReader.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.util" element1="/src<org.eclipse.mylar.internal.tasks.ui{HTML2TextReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1163207409453" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/45/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/45/refactorings.index
new file mode 100644
index 0000000..3e5c8e4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/45/refactorings.index
@@ -0,0 +1,8 @@
+1162929151046 Move compilation unit
+1162950135000 Rename type 'CopyDetailsAction'
+1162973562937 Rename method 'submitBug'
+1162973598671 Rename method 'updateBug'
+1162974336687 Rename type 'ExistingBugEditorInput'
+1162974371218 Rename type 'AbstractBugEditorInput'
+1163110516421 Rename type 'NewBugEditorInput'
+1163207409453 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..d875b0f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/ovr16/failed_ovr.gif' to 'failed-ovr.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'failed_ovr.gif'" description="Rename resource 'failed_ovr.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/ovr16/failed_ovr.gif" name="failed-ovr.gif" stamp="1163553161140" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/ovr16/failed-ovr.gif' to 'overlay-failed.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'failed-ovr.gif'" description="Rename resource 'failed-ovr.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/ovr16/failed-ovr.gif" name="overlay-failed.gif" stamp="1163553254296" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/ovr16/synch-warning.gif' to 'overlay-warning.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'synch-warning.gif'" description="Rename resource 'synch-warning.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/ovr16/synch-warning.gif" name="overlay-warning.gif" stamp="1163554049734" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'overlay-failed.gif'" description="Delete element" element1="icons/ovr16/overlay-failed.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1163554450500" subPackages="false" version="1.0"/>
+<refactoring comment="Rename field 'OVERLAY_ERROR' in 'org.eclipse.mylar.internal.tasks.ui.TaskListImages' to 'OVERLAY_WARNING' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages.OVERLAY_ERROR' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages.OVERLAY_WARNING' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'OVERLAY_ERROR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListImages.java[TaskListImages^OVERLAY_ERROR" name="OVERLAY_WARNING" references="true" setter="false" stamp="1163554477984" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.ScheduledTaskListSynchJob.UPDATE_ATTRIBUTES_FREQUENCY' from expression '3' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'UPDATE_ATTRIBUTES_FREQUENCY' - Constant expression: '3' - Declared visibility: 'private'" description="Extract constant 'UPDATE_ATTRIBUTES_FREQUENCY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui{ScheduledTaskListSynchJob.java" name="UPDATE_ATTRIBUTES_FREQUENCY" qualify="false" replace="false" selection="3353 1" stamp="1163631817244" version="1.0" visibility="2"/>
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.tasks.ui.search.SearchHitCollector.SearchHitCollector(TaskList tasklist, TaskRepository repository, AbstractRepositoryQuery repositoryQuery, Proxy proxySettings)' to 'public SearchHitCollector(TaskList tasklist, TaskRepository repository, AbstractRepositoryQuery repositoryQuery)' - Original project: 'org.eclipse.mylar.tasks.ui' - Removed parameters: Proxy proxySettings" delegate="false" deprecate="true" description="Change method 'SearchHitCollector'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui.search{SearchHitCollector.java[SearchHitCollector~SearchHitCollector~QTaskList;~QTaskRepository;~QAbstractRepositoryQuery;~QProxy;" name="SearchHitCollector" parameter1="TaskList tasklist 0 TaskList tasklist false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="AbstractRepositoryQuery repositoryQuery 2 AbstractRepositoryQuery repositoryQuery false" parameter4="Proxy proxySettings 3 Proxy proxySettings true" stamp="1163810683203" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..1fce745
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1,7 @@
+1163553161140 Rename resource 'failed_ovr.gif'
+1163553254296 Rename resource 'failed-ovr.gif'
+1163554049734 Rename resource 'synch-warning.gif'
+1163554450500 Delete element
+1163554477984 Rename field 'OVERLAY_ERROR'
+1163631817244 Extract constant 'UPDATE_ATTRIBUTES_FREQUENCY'
+1163810683203 Change method 'SearchHitCollector'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..8f42801
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'composite' from expression 'super.createDialogArea(parent)' - Variable name: 'composite' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'super.createDialogArea(parent)' - Replace occurrences of expression with variable" description="Extract local variable 'composite'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="composite" replace="true" selection="977 30" stamp="1163898710062" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().layout' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().layout'" description="Inline local variable 'layout'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" selection="1449 0" stamp="1163898978531" version="1.0"/>
+<refactoring comment="Rename local variable 'container' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(...)' to 'keyComposite' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).container' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).keyComposite' - Update references to refactored element" description="Rename local variable 'container'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="keyComposite" references="true" selection="1329 9" stamp="1163899497765" version="1.0"/>
+<refactoring comment="Rename local variable 'label' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(...)' to 'keyLabel' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).label' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).keyLabel' - Update references to refactored element" description="Rename local variable 'label'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="keyLabel" references="true" selection="1437 5" stamp="1163899505640" version="1.0"/>
+<refactoring comment="Rename local variable 'keyLabel' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(...)' to 'idLabel' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).keyLabel' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).idLabel' - Update references to refactored element" description="Rename local variable 'keyLabel'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="idLabel" references="true" selection="1463 8" stamp="1163899534046" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().gd' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().gd'" description="Inline local variable 'gd'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" selection="1668 0" stamp="1163899557796" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().layout' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().layout'" description="Inline local variable 'layout'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" selection="2199 0" stamp="1163900063000" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().gridData' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().gridData'" description="Inline local variable 'gridData'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" selection="2373 0" stamp="1163900073468" version="1.0"/>
+<refactoring comment="Rename local variable 'button' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(...)' to 'addRepositoryButton' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).button' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea(Composite).addRepositoryButton' - Update references to refactored element" description="Rename local variable 'button'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="addRepositoryButton" references="true" selection="2422 6" stamp="1163900100843" version="1.0"/>
+<refactoring comment="Extract local variable 'idLayout' from expression 'new GridLayout(2,false)' - Variable name: 'idLayout' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'new GridLayout(2,false)' - Replace occurrences of expression with variable" description="Extract local variable 'idLayout'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="idLayout" replace="true" selection="3736 24" stamp="1163902088187" version="1.0"/>
+<refactoring comment="Extract local variable 'repositoriesLayout' from expression 'new GridLayout()' - Variable name: 'repositoriesLayout' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'new GridLayout()' - Replace occurrences of expression with variable" description="Extract local variable 'repositoriesLayout'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="repositoriesLayout" replace="true" selection="4265 16" stamp="1163902131203" version="1.0"/>
+<refactoring comment="Extract local variable 'layout' from expression 'new GridLayout(2,false)' - Variable name: 'layout' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'new GridLayout(2,false)' - Replace occurrences of expression with variable" description="Extract local variable 'layout'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="layout" replace="true" selection="5492 24" stamp="1163902504156" version="1.0"/>
+<refactoring comment="Rename field 'viewer' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog' to 'repoViewer' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.viewer' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.repoViewer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'viewer'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java[RemoteTaskSelectionDialog^viewer" name="repoViewer" references="true" setter="false" stamp="1163902567671" textual="false" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().layout' in 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea().layout'" description="Inline local variable 'layout'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" selection="5958 0" stamp="1163908462625" version="1.0"/>
+<refactoring comment="Extract local variable 'categories' from expression 'TasksUiPlugin.getTaskListManager().getTaskList().getUserCategories()' - Variable name: 'categories' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'TasksUiPlugin.getTaskListManager().getTaskList().getUserCategories()' - Replace occurrences of expression with variable" description="Extract local variable 'categories'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="categories" replace="true" selection="6201 68" stamp="1163908713406" version="1.0"/>
+<refactoring comment="Extract local variable 'taskList' from expression 'TasksUiPlugin.getTaskListManager().getTaskList()' - Variable name: 'taskList' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'TasksUiPlugin.getTaskListManager().getTaskList()' - Replace occurrences of expression with variable" description="Extract local variable 'taskList'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" name="taskList" replace="true" selection="6392 48" stamp="1163908873359" version="1.0"/>
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.tasks.ui.wizards.CommonAddExistingTaskWizard.AddExistingTaskJob.AddExistingTaskJob(TaskRepository repository, String taskId)' to 'public AddExistingTaskJob(TaskRepository repository, String taskId)'" delegate="false" deprecate="true" description="Change method 'AddExistingTaskJob'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{CommonAddExistingTaskWizard.java[CommonAddExistingTaskWizard[AddExistingTaskJob~AddExistingTaskJob~QString;~QTaskRepository;" name="AddExistingTaskJob" parameter1="TaskRepository repository 1 TaskRepository repository false" parameter2="String taskId 0 String taskId false" stamp="1163910505687" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylar.internal.tasks.ui.wizards.CommonAddExistingTaskWizard.AddExistingTaskJob' in 'org.eclipse.mylar.internal.tasks.ui.wizards.CommonAddExistingTaskWizard' to top level type - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.CommonAddExistingTaskWizard.AddExistingTaskJob' - Field name: 'wizard' - Declare field 'final'" description="Convert member type 'AddExistingTaskJob' to top level" field="false" fieldName="wizard" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{CommonAddExistingTaskWizard.java[CommonAddExistingTaskWizard[AddExistingTaskJob" mandatory="false" possible="false" stamp="1163910564718" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.getNextLocalTaskId()' to 'getNewRepositoryTaskId' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.getNextLocalTaskId()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.getNewRepositoryTaskId()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getNextLocalTaskId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskDataManager.java[TaskDataManager~getNextLocalTaskId" name="getNewRepositoryTaskId" references="true" stamp="1164388757703" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.setNextTaskNumber(...)' to 'setLastNewTaskId' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.setNextTaskNumber(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.setLastNewTaskId(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setNextTaskNumber'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{OfflineDataStore.java[OfflineDataStore~setNextTaskNumber~I" name="setLastNewTaskId" references="true" stamp="1164388986312" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.getNextTaskNumber()' to 'getNextTaskId' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.getNextTaskNumber()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.getNextTaskId()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getNextTaskNumber'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{OfflineDataStore.java[OfflineDataStore~getNextTaskNumber" name="getNextTaskId" references="true" stamp="1164389043484" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.reloadFromFile()' to 'readOfflineData' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.reloadFromFile()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.readOfflineData()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'reloadFromFile'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskDataManager.java[TaskDataManager~reloadFromFile" name="readOfflineData" references="true" stamp="1164389784187" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.hasAtributeChanges()' to 'hasAttributeChanges' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.hasAtributeChanges()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.hasAttributeChanges()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'hasAtributeChanges'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~hasAtributeChanges" name="hasAttributeChanges" references="true" stamp="1164416887937" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..55f5a8b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1,23 @@
+1163898710062 Extract local variable 'composite'
+1163898978531 Inline local variable 'layout'
+1163899497765 Rename local variable 'container'
+1163899505640 Rename local variable 'label'
+1163899534046 Rename local variable 'keyLabel'
+1163899557796 Inline local variable 'gd'
+1163900063000 Inline local variable 'layout'
+1163900073468 Inline local variable 'gridData'
+1163900100843 Rename local variable 'button'
+1163902088187 Extract local variable 'idLayout'
+1163902131203 Extract local variable 'repositoriesLayout'
+1163902504156 Extract local variable 'layout'
+1163902567671 Rename field 'viewer'
+1163908462625 Inline local variable 'layout'
+1163908713406 Extract local variable 'categories'
+1163908873359 Extract local variable 'taskList'
+1163910505687 Change method 'AddExistingTaskJob'
+1163910564718 Convert member type 'AddExistingTaskJob' to top level
+1164388757703 Rename method 'getNextLocalTaskId'
+1164388986312 Rename method 'setNextTaskNumber'
+1164389043484 Rename method 'getNextTaskNumber'
+1164389784187 Rename method 'reloadFromFile'
+1164416887937 Rename method 'hasAtributeChanges'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/48/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/48/refactorings.history
new file mode 100644
index 0000000..426a4b9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/48/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.tasks.ui.commands' to 'org.eclipse.mylar.internal.tasks.ui.commands' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.commands' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.commands' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylar.tasks.ui.commands'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.tasks.ui.commands" name="org.eclipse.mylar.internal.tasks.ui.commands" qualified="false" references="true" stamp="1164067203546" textual="false" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.commands' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.commands' - Original elements: org.eclipse.mylar.internal.tasks.ui.actions.OpenRemoteTaskHandler.java org.eclipse.mylar.internal.tasks.ui.actions.RemoteTaskSelectionDialog.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.tasks.ui.commands" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenRemoteTaskHandler.java" element2="/src<org.eclipse.mylar.internal.tasks.ui.actions{RemoteTaskSelectionDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1164070332281" units="2" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().gd' in 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea()' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().gd'" description="Inline local variable 'gd'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{RemoteTaskSelectionDialog.java" selection="6844 0" stamp="1164243262640" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().control' in 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea()' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().control'" description="Inline local variable 'control'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{RemoteTaskSelectionDialog.java" selection="4957 0" stamp="1164243663859" version="1.0"/>
+<refactoring comment="Extract local variable 'element' from expression '((StructuredSelection)selectorViewer.getSelection()).getFirstElement()' - Original project: 'org.eclipse.mylar.tasks.ui' - Variable name: 'element' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.computeResult()' - Variable expression: '((StructuredSelection)selectorViewer.getSelection()).getFirstElement()' - Replace occurrences of expression with variable" description="Extract local variable 'element'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{RemoteTaskSelectionDialog.java" name="element" replace="true" selection="14963 71" stamp="1164248172734" version="1.0"/>
+<refactoring comment="Extract method 'private void openRemoteTask(RemoteTaskSelectionDialog dlg)' from 'org.eclipse.mylar.internal.tasks.ui.commands.OpenRemoteTaskHandler.execute()' to 'org.eclipse.mylar.internal.tasks.ui.commands.OpenRemoteTaskHandler' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'openRemoteTask' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.commands.OpenRemoteTaskHandler' - Declared visibility: 'private' - Generate method comment" comments="true" description="Extract method 'openRemoteTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{OpenRemoteTaskHandler.java" name="openRemoteTask" replace="false" selection="1530 702" stamp="1164249186250" version="1.0" visibility="2"/>
+<refactoring comment="Extract local variable 'task' from expression '(AbstractRepositoryTask)element' - Original project: 'org.eclipse.mylar.tasks.ui' - Variable name: 'task' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().new ViewerFilter() {...}.select()' - Variable expression: '(AbstractRepositoryTask)element' - Replace occurrences of expression with variable" description="Extract local variable 'task'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{RemoteTaskSelectionDialog.java" name="task" replace="true" selection="5842 32" stamp="1164335170312" version="1.0"/>
+<refactoring comment="Extract local variable 'currentRepository' from expression 'getSelectedRepository()' - Original project: 'org.eclipse.mylar.tasks.ui' - Variable name: 'currentRepository' - Destination method: 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea()' - Variable expression: 'getSelectedRepository()' - Replace occurrences of expression with variable" description="Extract local variable 'currentRepository'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{RemoteTaskSelectionDialog.java" name="currentRepository" replace="true" selection="7358 23" stamp="1164335242906" version="1.0"/>
+<refactoring comment="Convert local variable 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().repositoriesViewer' in 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea()' to field - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.commands.RemoteTaskSelectionDialog.createDialogArea().repositoriesViewer' - Field name: 'repositoriesViewer' - Initialize field in method - Declared visibility: 'private'" description="Convert local variable 'repositoriesViewer' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylar.internal.tasks.ui.commands{RemoteTaskSelectionDialog.java" name="repositoriesViewer" selection="7071 0" stamp="1164335848796" static="false" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.handleErrorStatus(...)' to 'handleSubmitError' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.handleErrorStatus(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.handleSubmitError(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'handleErrorStatus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~handleErrorStatus~QIJobChangeEvent;" name="handleSubmitError" references="true" stamp="1164568200625" version="1.0"/>
+<refactoring comment="Change method 'protected ITask org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.handleNewBugPost(String postResult) throws CoreException' to 'protected AbstractRepositoryTask handleNewBugPost(String postResult) throws CoreException' - Original project: 'org.eclipse.mylar.tasks.ui' - New return type: 'AbstractRepositoryTask'" delegate="false" deprecate="false" description="Change method 'handleNewBugPost'" element1="/C:\/apps\/eclipse-3.3M3\/plugins\/org.eclipse.equinox.common_3.3.0.v20061023.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~handleNewBugPost~QString;" kind1="0" name="handleNewBugPost" parameter1="String postResult 0 String postResult false" return="AbstractRepositoryTask" stamp="1164576651140" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/48/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/48/refactorings.index
new file mode 100644
index 0000000..3a23413
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/11/48/refactorings.index
@@ -0,0 +1,11 @@
+1164067203546 Rename package 'org.eclipse.mylar.tasks.ui.commands'
+1164070332281 Move compilation units
+1164243262640 Inline local variable 'gd'
+1164243663859 Inline local variable 'control'
+1164248172734 Extract local variable 'element'
+1164249186250 Extract method 'openRemoteTask'
+1164335170312 Extract local variable 'task'
+1164335242906 Extract local variable 'currentRepository'
+1164335848796 Convert local variable 'repositoriesViewer' to field
+1164568200625 Rename method 'handleErrorStatus'
+1164576651140 Change method 'handleNewBugPost'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/48/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/48/refactorings.history
new file mode 100644
index 0000000..a12401e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/48/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob.NUM_HITS_TO_PRIME' from expression '19' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'NUM_HITS_TO_PRIME' - Constant expression: '19' - Declared visibility: 'private'" description="Extract constant 'NUM_HITS_TO_PRIME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.ui{SynchronizeQueryJob.java" name="NUM_HITS_TO_PRIME" qualify="false" replace="false" selection="3911 2" stamp="1164934604468" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.saveBug()' to 'saveTaskOffline' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.saveBug()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.saveTaskOffline()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveBug'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~saveBug" name="saveTaskOffline" references="true" stamp="1165020165828" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.saveTaskOffline()' to 'public void saveTaskOffline(IProgressMonitor progressMonitor)' - Original project: 'org.eclipse.mylar.tasks.ui' - Added parameters: IProgressMonitor progressMonitor" default1="null" delegate="false" deprecate="false" description="Change method 'saveTaskOffline'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~saveTaskOffline" name="saveTaskOffline" parameter1="Object newParam -1 IProgressMonitor progressMonitor false" stamp="1165020272890" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/48/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/48/refactorings.index
new file mode 100644
index 0000000..4562dc8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/48/refactorings.index
@@ -0,0 +1,3 @@
+1164934604468 Extract constant 'NUM_HITS_TO_PRIME'
+1165020165828 Rename method 'saveBug'
+1165020272890 Change method 'saveTaskOffline'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..f0ab79b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'TasksUiPlugin.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/tasks/ui/TasksUiPlugin.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1165290835062" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableSorter.getSummary(...)' to 'getSortableSummaryFromElement' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableSorter.getSummary(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableSorter.getSortableSummaryFromElement(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSummary'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableSorter.java[TaskListTableSorter~getSummary~QITaskListElement;" name="getSortableSummaryFromElement" references="true" stamp="1165353554484" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.wizards' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.wizards' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractEditQueryWizard.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.wizards" element1="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractEditQueryWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165455673062" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.search' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.AbstractRepositoryQueryPage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.tasks.ui.search{AbstractRepositoryQueryPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165455776921" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.wizards' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.wizards' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.wizards" element1="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractRepositorySettingsPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165455839843" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165455885843" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractTaskEditorInput.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf, *.properties' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf, *.properties" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165455979312" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.wizards' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.wizards' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.NewWebTaskWizard.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.wizards" element1="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewWebTaskWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456041171" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.DatePicker.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf, *.properties' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{DatePicker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf, *.properties" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456118062" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.RepositoryTaskEditorInput.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{RepositoryTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456153234" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.ITaskEditorFactory.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui{ITaskEditorFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456267546" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.RepositoryTaskOutlineNode.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{RepositoryTaskOutlineNode.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456293765" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.MylarTaskEditor' to 'TaskEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.MylarTaskEditor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditor' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{MylarTaskEditor.java[MylarTaskEditor" matchStrategy="1" name="TaskEditor" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165456333937" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditor.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456367781" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorInput.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456381171" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskFormPage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskFormPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165456479187" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskDataManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.internal.tasks.ui{TaskDataManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165457120328" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.ui.OfflineDataStore.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.internal.tasks.ui{OfflineDataStore.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165457146343" units="1" version="1.0"/>
+
+
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.core' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.HTML2TextReader.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.jira.core" element1="/src<org.eclipse.mylar.internal.tasks.ui.util{HTML2TextReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165460725000" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core.html' - Original elements: org.eclipse.mylar.internal.tasks.ui.util.SingleCharReader.java org.eclipse.mylar.internal.tasks.ui.util.SubstitutionTextReader.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.tasks.core.html" element1="/src<org.eclipse.mylar.internal.tasks.ui.util{SingleCharReader.java" element2="/src<org.eclipse.mylar.internal.tasks.ui.util{SubstitutionTextReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165461066875" units="2" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractNewRepositoryTaskEditor.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461290312" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.NewTaskEditorInput.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{NewTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461553359" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.search' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchHitCollector.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.tasks.ui.search{SearchHitCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461592578" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiUtil.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui{TasksUiUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461624125" units="1" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.tasks.ui.views.TaskRepositoriesView.NAME' to 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskRepositoriesView.NAME' - Destination type: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin'" delegate="false" deprecate="true" description="Move member 'NAME'" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskRepositoriesView.java[TaskRepositoriesView^NAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" stamp="1165462663531" version="1.0"/>
+<refactoring comment="Rename field 'NAME' in 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' to 'LABEL_VIEW_REPOSITORIES' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.NAME' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.LABEL_VIEW_REPOSITORIES' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'NAME'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^NAME" name="LABEL_VIEW_REPOSITORIES" references="true" setter="false" stamp="1165462705671" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.OpenRepositoryTaskJob.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui{OpenRepositoryTaskJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462767078" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.RepositoryTextViewer.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{RepositoryTextViewer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462806546" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.search' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.search' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResult.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.search" element1="/src<org.eclipse.mylar.internal.tasks.ui.search{RepositorySearchResult.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462858703" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.RepositoryTaskSelection.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{RepositoryTaskSelection.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165462929968" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.getNewRepositoryTaskId()' to 'getNextNewRepositoryTaskId' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.getNewRepositoryTaskId()' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.getNextNewRepositoryTaskId()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNewRepositoryTaskId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getNewRepositoryTaskId" name="getNextNewRepositoryTaskId" references="true" stamp="1165463652859" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.ITaskListConstants' to 'ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.ITaskListConstants' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskListConstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{ITaskListConstants.java[ITaskListConstants" matchStrategy="1" name="ITasksUiConstants" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165463876953" textual="true" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.TITLE_DIALOG' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.TITLE_DIALOG' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'TITLE_DIALOG'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^TITLE_DIALOG" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463923812" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.MESSAGE_RESTORE' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.MESSAGE_RESTORE' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'MESSAGE_RESTORE'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^MESSAGE_RESTORE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463935796" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.URL_HOMEPAGE' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.URL_HOMEPAGE' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'URL_HOMEPAGE'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^URL_HOMEPAGE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463945843" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.FILE_EXTENSION' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.FILE_EXTENSION' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'FILE_EXTENSION'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^FILE_EXTENSION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463952625" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.OLD_TASK_LIST_FILE' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.OLD_TASK_LIST_FILE' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'OLD_TASK_LIST_FILE'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^OLD_TASK_LIST_FILE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463960812" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.DEFAULT_BACKUP_FOLDER_NAME' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.DEFAULT_BACKUP_FOLDER_NAME' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'DEFAULT_BACKUP_FOLDER_NAME'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^DEFAULT_BACKUP_FOLDER_NAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463968968" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.DEFAULT_TASK_LIST_FILE' to 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.DEFAULT_TASK_LIST_FILE' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'DEFAULT_TASK_LIST_FILE'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^DEFAULT_TASK_LIST_FILE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1165463983140" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..514c113
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,39 @@
+1165290835062 Delete element
+1165353554484 Rename method 'getSummary'
+1165455673062 Move compilation unit
+1165455776921 Move compilation unit
+1165455839843 Move compilation unit
+1165455885843 Move compilation unit
+1165455979312 Move compilation unit
+1165456041171 Move compilation unit
+1165456118062 Move compilation unit
+1165456153234 Move compilation unit
+1165456267546 Move compilation unit
+1165456293765 Move compilation unit
+1165456333937 Rename type 'MylarTaskEditor'
+1165456367781 Move compilation unit
+1165456381171 Move compilation unit
+1165456479187 Move compilation unit
+1165457120328 Move compilation unit
+1165457146343 Move compilation unit
+1165460725000 Move compilation unit
+1165461066875 Move compilation units
+1165461290312 Move compilation unit
+1165461553359 Move compilation unit
+1165461592578 Move compilation unit
+1165461624125 Move compilation unit
+1165462663531 Move member 'NAME'
+1165462705671 Rename field 'NAME'
+1165462767078 Move compilation unit
+1165462806546 Move compilation unit
+1165462858703 Move compilation unit
+1165462929968 Move compilation unit
+1165463652859 Rename method 'getNewRepositoryTaskId'
+1165463876953 Rename type 'ITaskListConstants'
+1165463923812 Move member 'TITLE_DIALOG'
+1165463935796 Move member 'MESSAGE_RESTORE'
+1165463945843 Move member 'URL_HOMEPAGE'
+1165463952625 Move member 'FILE_EXTENSION'
+1165463960812 Move member 'OLD_TASK_LIST_FILE'
+1165463968968 Move member 'DEFAULT_BACKUP_FOLDER_NAME'
+1165463983140 Move member 'DEFAULT_TASK_LIST_FILE'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/50/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/50/refactorings.history
new file mode 100644
index 0000000..9e4d5c9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.views.TaskElementLabelProvider.NO_SUMMARY_AVAILABLE' from expression '": <no summary available>"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'NO_SUMMARY_AVAILABLE' - Constant expression: '": <no summary available>"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'NO_SUMMARY_AVAILABLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskElementLabelProvider.java" name="NO_SUMMARY_AVAILABLE" qualify="false" replace="true" selection="4787 26" stamp="1165970831750" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/50/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/50/refactorings.index
new file mode 100644
index 0000000..4dd824c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/12/50/refactorings.index
@@ -0,0 +1 @@
+1165970831750 Extract constant 'NO_SUMMARY_AVAILABLE'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/6/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/6/refactorings.history
new file mode 100644
index 0000000..e7ffa12
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/6/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.WEB_OVERLAY' to 'OVERLAY_WEB'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^WEB_OVERLAY" name="OVERLAY_WEB" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139542220210" textual="false"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist/icons/etool16/category-query.gif' to 'query.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist/icons/etool16/category-query.gif" name="query.gif" project="org.eclipse.mylar.tasklist" stamp="1139543561709"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist/icons/etool16/category-query-new.gif' to 'query-new.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist/icons/etool16/category-query-new.gif" name="query-new.gif" project="org.eclipse.mylar.tasklist" stamp="1139543624990"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.IQueryHit' to 'AbstractQueryHit'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{IQueryHit.java[IQueryHit" matchStrategy="1" name="AbstractQueryHit" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139605751864" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.ACTIVITY_LISTENER' to 'TASK_REFERESH_LISTENER'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java[TaskListView^ACTIVITY_LISTENER" name="TASK_REFERESH_LISTENER" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139607759391" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TasklistLabelProvider' to 'TaskListLabelProvider'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TasklistLabelProvider.java[TasklistLabelProvider" matchStrategy="1" name="TaskListLabelProvider" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139614510218" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin.setPriorityLevel(...)' to 'setCurrentPriorityLevel'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin~setPriorityLevel~QTask.PriorityLevel;" name="setCurrentPriorityLevel" project="org.eclipse.mylar.tasklist" references="true" stamp="1139618365652"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin.getPriorityLevel()' to 'getCurrentPriorityLevel'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin~getPriorityLevel" name="getCurrentPriorityLevel" project="org.eclipse.mylar.tasklist" references="true" stamp="1139618381715"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider.getAssociatedTask(...)' to 'getTask'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider~getAssociatedTask~QITaskListElement;" name="getTask" project="org.eclipse.mylar.tasklist" references="true" stamp="1139624049425"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider.getTask(...)' to 'getCorrespondingTask'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider~getTask~QITaskListElement;" name="getCorrespondingTask" project="org.eclipse.mylar.tasklist" references="true" stamp="1139624062874"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/6/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/6/refactorings.index
new file mode 100644
index 0000000..51f4e6f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/6/refactorings.index
@@ -0,0 +1,10 @@
+1139542220210 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.WEB_OVERLAY' to 'OVERLAY_WEB'
+1139543561709 Rename resource '/org.eclipse.mylar.tasklist/icons/etool16/category-query.gif' to 'query.gif'
+1139543624990 Rename resource '/org.eclipse.mylar.tasklist/icons/etool16/category-query-new.gif' to 'query-new.gif'
+1139605751864 Rename type 'org.eclipse.mylar.internal.tasklist.IQueryHit' to 'AbstractQueryHit'
+1139607759391 Rename field 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.ACTIVITY_LISTENER' to 'TASK_REFERESH_LISTENER'
+1139614510218 Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TasklistLabelProvider' to 'TaskListLabelProvider'
+1139618365652 Rename method 'org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin.setPriorityLevel(...)' to 'setCurrentPriorityLevel'
+1139618381715 Rename method 'org.eclipse.mylar.internal.tasklist.MylarTaskListPlugin.getPriorityLevel()' to 'getCurrentPriorityLevel'
+1139624049425 Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider.getAssociatedTask(...)' to 'getTask'
+1139624062874 Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskElementLabelProvider.getTask(...)' to 'getCorrespondingTask'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/7/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/7/refactorings.history
new file mode 100644
index 0000000..6739051
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/7/refactorings.history
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ITaskCategory' to 'ITaskContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{ITaskCategory.java[ITaskCategory" matchStrategy="1" name="ITaskContainer" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139867548576" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryQuery.getHits()' to 'getChildren'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryQuery.java[AbstractRepositoryQuery~getHits" name="getChildren" project="org.eclipse.mylar.tasklist" references="true" stamp="1139867657142"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryQuery.getChildren()' to 'getHits'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryQuery.java[AbstractRepositoryQuery~getChildren" name="getHits" project="org.eclipse.mylar.tasklist" references="true" stamp="1139867856759"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TasklistContentProvider' to 'TaskListContentProvider'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TasklistContentProvider.java[TasklistContentProvider" matchStrategy="1" name="TaskListContentProvider" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139868867963" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListToolTipHandler.getTask(...)' to 'getTaskListElement'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListToolTipHandler.java[TaskListToolTipHandler~getTask~QObject;" name="getTaskListElement" project="org.eclipse.mylar.tasklist" references="true" stamp="1139870808263"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.type' to 'kind'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask^type" name="kind" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139881717034" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.getType()' to 'getKind'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~getType" name="getKind" project="org.eclipse.mylar.tasklist" references="true" stamp="1139881741509"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.setType(...)' to 'setKind'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~setType~QString;" name="setKind" project="org.eclipse.mylar.tasklist" references="true" stamp="1139881753537"/>
+<refactoring abstract="0" comment="" delete="2" description="Pull up members from 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask' to 'org.eclipse.mylar.internal.tasklist.Task'" element1="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask" element2="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask^kind" element3="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~getKind" element4="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~setKind~QString;" element5="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~getKind" element6="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~setKind~QString;" flags="65542" id="org.eclipse.jdt.ui.pull.up" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{Task.java[Task" project="org.eclipse.mylar.tasklist" pull="3" stamp="1139882212767" stubs="true"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_QUERY' to 'KEY_QUERY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^TAG_QUERY" name="KEY_QUERY" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882305490" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_QUERY_HIT' to 'KEY_QUERY_HIT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^TAG_QUERY_HIT" name="KEY_QUERY_HIT" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882382321" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.MAX_HITS' to 'KEY_QUERY_MAX_HITS'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^MAX_HITS" name="KEY_QUERY_MAX_HITS" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882391694" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.QUERY_STRING' to 'KEY_QUERY_STRING'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^QUERY_STRING" name="KEY_QUERY_STRING" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882400287" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.LABEL' to 'KEY_LABEL'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^LABEL" name="KEY_LABEL" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882409260" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.HANDLE' to 'KEY_HANDLE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^HANDLE" name="KEY_HANDLE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882446663" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.REPOSITORY_URL' to 'KEY_REPOSITORY_URL'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^REPOSITORY_URL" name="KEY_REPOSITORY_URL" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882455806" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_CATEGORY' to 'KEY_CATEGORY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^TAG_CATEGORY" name="KEY_CATEGORY" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882464779" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_TASK' to 'KEY_TASK'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^TAG_TASK" name="KEY_TASK" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882479791" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_TASK_CATEGORY' to 'KEY_TASK_CATEGORY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^TAG_TASK_CATEGORY" name="KEY_TASK_CATEGORY" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882487622" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.LINK' to 'KEY_LINK'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^LINK" name="KEY_LINK" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882494512" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.PLAN' to 'KEY_PLAN'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^PLAN" name="KEY_PLAN" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882501192" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ESTIMATED' to 'KEY_ESTIMATED'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^ESTIMATED" name="KEY_ESTIMATED" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882507010" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ELAPSED' to 'KEY_ELAPSED'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^ELAPSED" name="KEY_ELAPSED" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882513119" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ISSUEURL' to 'KEY_ISSUEURL'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^ISSUEURL" name="KEY_ISSUEURL" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882523043" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.NOTES' to 'KEY_NOTES'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^NOTES" name="KEY_NOTES" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882528862" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.BUGZILLA' to 'KEY_BUGZILLA'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^BUGZILLA" name="KEY_BUGZILLA" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882534780" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ACTIVE' to 'KEY_ACTIVE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^ACTIVE" name="KEY_ACTIVE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882541360" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.COMPLETE' to 'KEY_COMPLETE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^COMPLETE" name="KEY_COMPLETE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882555480" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.PRIORITY' to 'KEYPRIORITY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^PRIORITY" name="KEYPRIORITY" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882570712" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.KEYPRIORITY' to 'KEY_PRIORITY'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEYPRIORITY" name="KEY_PRIORITY" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882580316" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.PATH' to 'KEY_PATH'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^PATH" name="KEY_PATH" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882589058" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.FALSE' to 'VAL_FALSE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^FALSE" name="VAL_FALSE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882596759" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TRUE' to 'VAL_TRUE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^TRUE" name="VAL_TRUE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882605091" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.NAME' to 'KEY_NAME'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^NAME" name="KEY_NAME" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882613463" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.KEY_ESTIMATED' to 'KEY_TIME_ESTIMATED'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_ESTIMATED" name="KEY_TIME_ESTIMATED" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882621104" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.KEY_ELAPSED' to 'KEY_TIME_ELAPSED'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_ELAPSED" name="KEY_TIME_ELAPSED" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882628365" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.END_DATE' to 'KEY_DATE_END'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^END_DATE" name="KEY_DATE_END" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882635755" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.CREATION_DATE' to 'KEY_DATE_CREATION'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^CREATION_DATE" name="KEY_DATE_CREATION" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882643757" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.REMINDER_DATE' to 'KEY_DATE_REMINDER'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^REMINDER_DATE" name="KEY_DATE_REMINDER" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882650577" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.REMINDED' to 'KEY_REMINDED'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^REMINDED" name="KEY_REMINDED" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1139882659499" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.JiraTaskDecorator' to 'TaskDecorator'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{JiraTaskDecorator.java[JiraTaskDecorator" matchStrategy="1" name="TaskDecorator" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139889160577" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListLabelProvider' to 'TaskListTableLabelProvider'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListLabelProvider.java[TaskListLabelProvider" matchStrategy="1" name="TaskListTableLabelProvider" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139946911710" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.MylarTasklistOverlayDescriptor' to 'MylarTaskListOverlayDescriptor'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages[MylarTasklistOverlayDescriptor" matchStrategy="1" name="MylarTaskListOverlayDescriptor" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139948807155" textual="false"/>
+<refactoring comment="" description="Move type 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.MylarTaskListOverlayDescriptor' in 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages' to new file" field="false" fieldName="images" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages[MylarTaskListOverlayDescriptor" mandatory="false" possible="false" project="org.eclipse.mylar.tasklist" stamp="1139948849175"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.MylarTaskListOverlayDescriptor' to 'TaskListOverlayDescriptor'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{MylarTaskListOverlayDescriptor.java[MylarTaskListOverlayDescriptor" matchStrategy="1" name="TaskListOverlayDescriptor" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139948894721" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskDecorator' to 'RepositoryTaskDecorator'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskDecorator.java[TaskDecorator" matchStrategy="1" name="RepositoryTaskDecorator" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1139949013221" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.isPersistant()' to 'isPersistentInWorkspace'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~isPersistant" name="isPersistentInWorkspace" project="org.eclipse.mylar.tasklist" references="true" stamp="1139966718958"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.setSelectedTask(...)' to 'selectedAndFocusTask'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java[TaskListView~setSelectedTask~QITask;" name="selectedAndFocusTask" project="org.eclipse.mylar.tasklist" references="true" stamp="1140133616975"/>
+<refactoring comment="" comments="false" description="Extract method 'private void createTaskElement(Document doc,Element root,ITask task)' from 'org.eclipse.mylar.internal.tasklist.util.TaskListWriter.writeTaskList()' to 'org.eclipse.mylar.internal.tasklist.util.TaskListWriter'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.util{TaskListWriter.java" name="createTaskElement" project="org.eclipse.mylar.tasklist" replace="false" selection="4939 465" stamp="1140146368711" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.TaskList.LABEL_ARCHIVE' from expression '"Archive (automatic)"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskList.java" name="LABEL_ARCHIVE" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="1107 21" stamp="1140147414916" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/7/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/7/refactorings.index
new file mode 100644
index 0000000..5485298
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/7/refactorings.index
@@ -0,0 +1,50 @@
+1139867548576 Rename type 'org.eclipse.mylar.internal.tasklist.ITaskCategory' to 'ITaskContainer'
+1139867657142 Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryQuery.getHits()' to 'getChildren'
+1139867856759 Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryQuery.getChildren()' to 'getHits'
+1139868867963 Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TasklistContentProvider' to 'TaskListContentProvider'
+1139870808263 Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListToolTipHandler.getTask(...)' to 'getTaskListElement'
+1139881717034 Rename field 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.type' to 'kind'
+1139881741509 Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.getType()' to 'getKind'
+1139881753537 Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.setType(...)' to 'setKind'
+1139882212767 Pull up members from 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask' to 'org.eclipse.mylar.internal.tasklist.Task'
+1139882305490 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_QUERY' to 'KEY_QUERY'
+1139882382321 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_QUERY_HIT' to 'KEY_QUERY_HIT'
+1139882391694 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.MAX_HITS' to 'KEY_QUERY_MAX_HITS'
+1139882400287 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.QUERY_STRING' to 'KEY_QUERY_STRING'
+1139882409260 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.LABEL' to 'KEY_LABEL'
+1139882446663 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.HANDLE' to 'KEY_HANDLE'
+1139882455806 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.REPOSITORY_URL' to 'KEY_REPOSITORY_URL'
+1139882464779 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_CATEGORY' to 'KEY_CATEGORY'
+1139882479791 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_TASK' to 'KEY_TASK'
+1139882487622 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TAG_TASK_CATEGORY' to 'KEY_TASK_CATEGORY'
+1139882494512 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.LINK' to 'KEY_LINK'
+1139882501192 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.PLAN' to 'KEY_PLAN'
+1139882507010 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ESTIMATED' to 'KEY_ESTIMATED'
+1139882513119 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ELAPSED' to 'KEY_ELAPSED'
+1139882523043 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ISSUEURL' to 'KEY_ISSUEURL'
+1139882528862 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.NOTES' to 'KEY_NOTES'
+1139882534780 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.BUGZILLA' to 'KEY_BUGZILLA'
+1139882541360 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.ACTIVE' to 'KEY_ACTIVE'
+1139882555480 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.COMPLETE' to 'KEY_COMPLETE'
+1139882570712 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.PRIORITY' to 'KEYPRIORITY'
+1139882580316 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.KEYPRIORITY' to 'KEY_PRIORITY'
+1139882589058 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.PATH' to 'KEY_PATH'
+1139882596759 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.FALSE' to 'VAL_FALSE'
+1139882605091 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.TRUE' to 'VAL_TRUE'
+1139882613463 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.NAME' to 'KEY_NAME'
+1139882621104 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.KEY_ESTIMATED' to 'KEY_TIME_ESTIMATED'
+1139882628365 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.KEY_ELAPSED' to 'KEY_TIME_ELAPSED'
+1139882635755 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.END_DATE' to 'KEY_DATE_END'
+1139882643757 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.CREATION_DATE' to 'KEY_DATE_CREATION'
+1139882650577 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.REMINDER_DATE' to 'KEY_DATE_REMINDER'
+1139882659499 Rename field 'org.eclipse.mylar.internal.tasklist.DelegatingTaskExternalizer.REMINDED' to 'KEY_REMINDED'
+1139889160577 Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.JiraTaskDecorator' to 'TaskDecorator'
+1139946911710 Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListLabelProvider' to 'TaskListTableLabelProvider'
+1139948807155 Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.MylarTasklistOverlayDescriptor' to 'MylarTaskListOverlayDescriptor'
+1139948849175 Move type 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.MylarTaskListOverlayDescriptor' in 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages' to new file
+1139948894721 Rename type 'org.eclipse.mylar.internal.tasklist.ui.MylarTaskListOverlayDescriptor' to 'TaskListOverlayDescriptor'
+1139949013221 Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskDecorator' to 'RepositoryTaskDecorator'
+1139966718958 Rename method 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTask.isPersistant()' to 'isPersistentInWorkspace'
+1140133616975 Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.setSelectedTask(...)' to 'selectedAndFocusTask'
+1140146368711 Extract method 'private void createTaskElement(Document doc,Element root,ITask task)' from 'org.eclipse.mylar.internal.tasklist.util.TaskListWriter.writeTaskList()' to 'org.eclipse.mylar.internal.tasklist.util.TaskListWriter'
+1140147414916 Extract constant 'org.eclipse.mylar.internal.tasklist.TaskList.LABEL_ARCHIVE' from expression '"Archive (automatic)"'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/8/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/8/refactorings.history
new file mode 100644
index 0000000..a3ebaa5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/8/refactorings.history
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.TaskList.getRoots()' to 'getRootElements'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskList.java[TaskList~getRoots" name="getRootElements" project="org.eclipse.mylar.tasklist" references="true" stamp="1140396160927"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move 4 members to {1}" element1="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~getHandle~QString;~QString;" element2="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~getTaskIdAsInt~QString;" element3="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~getTaskId~QString;" element4="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryUrl~QString;" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask" project="org.eclipse.mylar.tasklist" stamp="1140451330452"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.tasklist.TaskRepositoryManager.HANDLE_DELIM to {1}" element1="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^HANDLE_DELIM" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask" project="org.eclipse.mylar.tasklist" stamp="1140451348408"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.TaskList.CATEGORY_ROOT' to 'LABEl_ROOT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskList.java[TaskList^CATEGORY_ROOT" name="LABEl_ROOT" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1140459475796" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.TaskList.LABEl_ROOT' to 'LABEL_ROOT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskList.java[TaskList^LABEl_ROOT" name="LABEL_ROOT" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1140459481555" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree.LABEL_SIZE' from expression '120'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListFilteredTree.java" name="LABEL_SIZE" project="org.eclipse.mylar.tasklist" qualify="false" replace="false" selection="2853 3" stamp="1140491752913" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.util.TaskListExtensionReader.ELMNT_REPOSITORY_CLIENT' to 'ELMNT_REPOSITORY_TYPE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.util{TaskListExtensionReader.java[TaskListExtensionReader^ELMNT_REPOSITORY_CLIENT" name="ELMNT_REPOSITORY_TYPE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1140555138637" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.CreateNewBugzillaTaskAction' to 'CreateNewRepositoryTaskAction'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.wizards{CreateNewBugzillaTaskAction.java[CreateNewBugzillaTaskAction" matchStrategy="1" name="CreateNewRepositoryTaskAction" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1140587274898" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.CreateNewRepositoryTaskAction' to 'NewRepositoryTaskAction'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.wizards{CreateNewRepositoryTaskAction.java[CreateNewRepositoryTaskAction" matchStrategy="1" name="NewRepositoryTaskAction" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1140587494744" textual="false"/>
+<refactoring comment="" description="Convert anonymous class 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.run().new SelectRepositoryPage() {...}' in 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.run()' to nested class" final="true" flags="2" id="org.eclipse.jdt.ui.convert.anonymous" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{NewRepositoryTaskAction.java" name="NewRepositoryTaskWizard" project="org.eclipse.mylar.tasklist" selection="2859 0" stamp="1140587583702" static="false" visibility="2"/>
+<refactoring comment="" description="Move type 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.NewRepositoryTaskWizard' in 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction' to new file" field="false" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{NewRepositoryTaskAction.java[NewRepositoryTaskAction[NewRepositoryTaskWizard" mandatory="false" possible="true" project="org.eclipse.mylar.tasklist" stamp="1140587701652"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient' to 'AbstractRepositoryConnector'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryClient.java[AbstractRepositoryClient" matchStrategy="1" name="AbstractRepositoryConnector" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1140587891374" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getKind()' to 'getRepositoryType'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getKind" name="getRepositoryType" project="org.eclipse.mylar.tasklist" references="true" stamp="1140626076799"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewRepositoryTaskWizard' to 'NewRepositoryTaskPage'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.wizards{NewRepositoryTaskWizard.java[NewRepositoryTaskWizard" matchStrategy="1" name="NewRepositoryTaskPage" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1140628207683" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_WIDTH' from expression '"width"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java" name="MEMENTO_KEY_WIDTH" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="22896 7" stamp="1140710152902" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_SORT_INDEX' from expression '"sortIndex"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java" name="MEMENTO_KEY_SORT_INDEX" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="23126 11" stamp="1140710169926" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_SORTER' from expression '"sorter"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java" name="MEMENTO_KEY_SORTER" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="23169 8" stamp="1140710181663" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_SORT_DIRECTION' from expression '"sortDirection"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java" name="MEMENTO_KEY_SORT_DIRECTION" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="23321 15" stamp="1140710194141" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/8/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/8/refactorings.index
new file mode 100644
index 0000000..262254f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/2/8/refactorings.index
@@ -0,0 +1,18 @@
+1140396160927 Rename method 'org.eclipse.mylar.internal.tasklist.TaskList.getRoots()' to 'getRootElements'
+1140451330452 Move 4 members to {1}
+1140451348408 Move org.eclipse.mylar.internal.tasklist.TaskRepositoryManager.HANDLE_DELIM to {1}
+1140459475796 Rename field 'org.eclipse.mylar.internal.tasklist.TaskList.CATEGORY_ROOT' to 'LABEl_ROOT'
+1140459481555 Rename field 'org.eclipse.mylar.internal.tasklist.TaskList.LABEl_ROOT' to 'LABEL_ROOT'
+1140491752913 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree.LABEL_SIZE' from expression '120'
+1140555138637 Rename field 'org.eclipse.mylar.internal.tasklist.util.TaskListExtensionReader.ELMNT_REPOSITORY_CLIENT' to 'ELMNT_REPOSITORY_TYPE'
+1140587274898 Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.CreateNewBugzillaTaskAction' to 'CreateNewRepositoryTaskAction'
+1140587494744 Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.CreateNewRepositoryTaskAction' to 'NewRepositoryTaskAction'
+1140587583702 Convert anonymous class 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.run().new SelectRepositoryPage() {...}' in 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.run()' to nested class
+1140587701652 Move type 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.NewRepositoryTaskWizard' in 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction' to new file
+1140587891374 Rename type 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryClient' to 'AbstractRepositoryConnector'
+1140626076799 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getKind()' to 'getRepositoryType'
+1140628207683 Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewRepositoryTaskWizard' to 'NewRepositoryTaskPage'
+1140710152902 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_WIDTH' from expression '"width"'
+1140710169926 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_SORT_INDEX' from expression '"sortIndex"'
+1140710181663 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_SORTER' from expression '"sorter"'
+1140710194141 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.MEMENTO_KEY_SORT_DIRECTION' from expression '"sortDirection"'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/10/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/10/refactorings.history
new file mode 100644
index 0000000..7aa32d0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/10/refactorings.history
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.Task.PriorityLevel.toDescription()' to 'getDescription'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{Task.java[Task[PriorityLevel~toDescription" name="getDescription" project="org.eclipse.mylar.tasklist" references="true" stamp="1141680296081"/>
+
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskActivityListener' to 'ITaskChangeListener'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{ITaskActivityListener.java[ITaskActivityListener" matchStrategy="1" name="ITaskChangeListener" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141686155041" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskActivityManagerListener' to 'ITaskActivityListener'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{ITaskActivityManagerListener.java[ITaskActivityManagerListener" matchStrategy="1" name="ITaskActivityListener" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141686226404" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.TaskListManager.listeners' to 'changeListeners'" flags="65538" getter="true" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager^listeners" name="changeListeners" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141686338615" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.addListener(...)' to 'addChangeListener'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~addListener~QITaskChangeListener;" name="addChangeListener" project="org.eclipse.mylar.tasklist" references="true" stamp="1141686613691"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.removeListener(...)' to 'removeChangeListener'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~removeListener~QITaskChangeListener;" name="removeChangeListener" project="org.eclipse.mylar.tasklist" references="true" stamp="1141686624466"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskContainer' to 'DateRangeContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{DateRangeTaskContainer.java[DateRangeTaskContainer" matchStrategy="1" name="DateRangeContainer" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141687499785" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.parseInteractionHistory()' to 'parseTaskActivityInteractionHistory'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~parseInteractionHistory" name="parseTaskActivityInteractionHistory" project="org.eclipse.mylar.tasklist" references="true" stamp="1141687991321"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskWrapper' to 'TaskActivityDuration'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{DateRangeTaskWrapper.java[DateRangeTaskWrapper" matchStrategy="1" name="TaskActivityDuration" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141690298389" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.TaskActivityDuration' to 'TaskActivityDurationDelegate'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskActivityDuration.java[TaskActivityDuration" matchStrategy="1" name="TaskActivityDurationDelegate" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1141690768174" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.TaskActivityDurationDelegate' to 'DateRangeActivityDelegate'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskActivityDurationDelegate.java[TaskActivityDurationDelegate" matchStrategy="1" name="DateRangeActivityDelegate" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1141692330351" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate.getTask()' to 'getCorrespondingTask'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{DateRangeActivityDelegate.java[DateRangeActivityDelegate~getTask" name="getCorrespondingTask" project="org.eclipse.mylar.tasklist" references="true" stamp="1141692659384"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.THEME_COLOR_ID_TASKLIST_CATEGORY' from expression '"org.eclipse.mylar.tasklist.ui.colors.background.category"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java" name="THEME_COLOR_ID_TASKLIST_CATEGORY" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="26695 58" stamp="1141745732610" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.THEME_COLOR_ID_TASKLIST_CATEGORY to {1}" element1="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java[TaskListView^THEME_COLOR_ID_TASKLIST_CATEGORY" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts" project="org.eclipse.mylar.tasklist" stamp="1141745757195"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableLabelProvider.parentBackgroundColor' to 'categoryBackgroundColor'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListTableLabelProvider.java[TaskListTableLabelProvider^parentBackgroundColor" name="categoryBackgroundColor" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141745881094" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableLabelProvider.setParentBackgroundColor(...)' to 'setCategoryBackgroundColor'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListTableLabelProvider.java[TaskListTableLabelProvider~setParentBackgroundColor~QColor;" name="setCategoryBackgroundColor" project="org.eclipse.mylar.tasklist" references="true" stamp="1141745891839"/>
+<refactoring comment="" comments="false" description="Extract method 'private void refresh()' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityView.new ITaskChangeListener() {...}.localInfoChanged()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityView.new ITaskChangeListener() {...}'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskActivityView.java" name="refresh" project="org.eclipse.mylar.tasklist" replace="true" selection="4340 47" stamp="1141779992471" visibility="2"/>
+<refactoring comment="" comments="false" description="Extract method 'private int compareElements(ITaskListElement element1,ITaskListElement element2)' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter.compare()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListTableSorter.java" name="compareElements" project="org.eclipse.mylar.tasklist" replace="false" selection="2533 486" stamp="1141842928492" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.FilterCompletedTasksAction.FILTER_ARCHIVE' from expression '"Filter Completed Tasks"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{FilterCompletedTasksAction.java" name="FILTER_ARCHIVE" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="1194 24" stamp="1142041194769" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.FilterArchiveCategoryAction.LABEL' from expression '"Filter Completed Tasks"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{FilterArchiveCategoryAction.java" name="LABEL" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="1195 24" stamp="1142041259772" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getPrefs()' to 'getPreferenceStore'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin~getPrefs" name="getPreferenceStore" project="org.eclipse.mylar.tasklist" references="true" stamp="1142041359325"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getPreferenceStore()' to 'getPrefs'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin~getPreferenceStore" name="getPrefs" project="org.eclipse.mylar.tasklist" references="true" stamp="1142041404360"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskCompleteFilter' to 'TaskCompletionFilter'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskCompleteFilter.java[TaskCompleteFilter" matchStrategy="1" name="TaskCompletionFilter" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1142045402619" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/10/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/10/refactorings.index
new file mode 100644
index 0000000..21ea4e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/10/refactorings.index
@@ -0,0 +1,23 @@
+1141680296081 Rename method 'org.eclipse.mylar.provisional.tasklist.Task.PriorityLevel.toDescription()' to 'getDescription'
+1141686155041 Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskActivityListener' to 'ITaskChangeListener'
+1141686226404 Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskActivityManagerListener' to 'ITaskActivityListener'
+1141686338615 Rename field 'org.eclipse.mylar.provisional.tasklist.TaskListManager.listeners' to 'changeListeners'
+1141686613691 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.addListener(...)' to 'addChangeListener'
+1141686624466 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.removeListener(...)' to 'removeChangeListener'
+1141687499785 Rename type 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskContainer' to 'DateRangeContainer'
+1141687991321 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.parseInteractionHistory()' to 'parseTaskActivityInteractionHistory'
+1141690298389 Rename type 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskWrapper' to 'TaskActivityDuration'
+1141690768174 Rename type 'org.eclipse.mylar.provisional.tasklist.TaskActivityDuration' to 'TaskActivityDurationDelegate'
+1141692330351 Rename type 'org.eclipse.mylar.provisional.tasklist.TaskActivityDurationDelegate' to 'DateRangeActivityDelegate'
+1141692659384 Rename method 'org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate.getTask()' to 'getCorrespondingTask'
+1141745732610 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.THEME_COLOR_ID_TASKLIST_CATEGORY' from expression '"org.eclipse.mylar.tasklist.ui.colors.background.category"'
+1141745757195 Move org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.THEME_COLOR_ID_TASKLIST_CATEGORY to {1}
+1141745881094 Rename field 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableLabelProvider.parentBackgroundColor' to 'categoryBackgroundColor'
+1141745891839 Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableLabelProvider.setParentBackgroundColor(...)' to 'setCategoryBackgroundColor'
+1141779992471 Extract method 'private void refresh()' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityView.new ITaskChangeListener() {...}.localInfoChanged()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityView.new ITaskChangeListener() {...}'
+1141842928492 Extract method 'private int compareElements(ITaskListElement element1,ITaskListElement element2)' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter.compare()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter'
+1142041194769 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.FilterCompletedTasksAction.FILTER_ARCHIVE' from expression '"Filter Completed Tasks"'
+1142041259772 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.FilterArchiveCategoryAction.LABEL' from expression '"Filter Completed Tasks"'
+1142041359325 Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getPrefs()' to 'getPreferenceStore'
+1142041404360 Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getPreferenceStore()' to 'getPrefs'
+1142045402619 Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskCompleteFilter' to 'TaskCompletionFilter'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/11/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/11/refactorings.history
new file mode 100644
index 0000000..9ef5ff7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/11/refactorings.history
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskChangeListener' to 'ITaskListChangeListener'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{ITaskChangeListener.java[ITaskChangeListener" matchStrategy="1" name="ITaskListChangeListener" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1142200908865" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.createNewTaskList()' to 'resetTaskList'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~createNewTaskList" name="resetTaskList" project="org.eclipse.mylar.tasklist" references="true" stamp="1142205433613"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.TaskListManager.nextTaskId' to 'nextLocalTaskId'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager^nextTaskId" name="nextLocalTaskId" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1142209032578" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.TaskList.archiveCategory' to 'archiveContainer'" flags="65538" getter="true" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskList.java[TaskList^archiveCategory" name="archiveContainer" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1142211095745" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskContainer' to 'AbstractTaskContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{ITaskContainer.java[ITaskContainer" matchStrategy="1" name="AbstractTaskContainer" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1142211740422" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.getTaskFromArchive(...)' to 'getTask'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskList.java[TaskList~getTaskFromArchive~QString;" name="getTask" project="org.eclipse.mylar.tasklist" references="true" stamp="1142214175563"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer.addTask(...)' to 'add'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractTaskContainer.java[AbstractTaskContainer~addTask~QITask;" name="add" project="org.eclipse.mylar.tasklist" references="true" stamp="1142225362919"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer.removeTask(...)' to 'remove'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractTaskContainer.java[AbstractTaskContainer~removeTask~QITask;" name="remove" project="org.eclipse.mylar.tasklist" references="true" stamp="1142225381756"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.ITask.setCategory(...)' to 'setContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{ITask.java[ITask~setCategory~QAbstractTaskContainer;" name="setContainer" project="org.eclipse.mylar.tasklist" references="true" stamp="1142229662581"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.moveToCategory(...)' to 'moveToContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskList.java[TaskList~moveToCategory~QAbstractTaskContainer;~QITask;" name="moveToContainer" project="org.eclipse.mylar.tasklist" references="true" stamp="1142230022419"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.getCategoryForHandle(...)' to 'getContainerForHandle'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskList.java[TaskList~getCategoryForHandle~QString;" name="getContainerForHandle" project="org.eclipse.mylar.tasklist" references="true" stamp="1142264203377"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.getTaskCategories()' to 'getTaskContainers'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskList.java[TaskList~getTaskCategories" name="getTaskContainers" project="org.eclipse.mylar.tasklist" references="true" stamp="1142264229785"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate.getContainer()' to 'getDateRangeContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{DateRangeActivityDelegate.java[DateRangeActivityDelegate~getContainer" name="getDateRangeContainer" project="org.eclipse.mylar.tasklist" references="true" stamp="1142265755940"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.ITask.getCategory()' to 'getContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{ITask.java[ITask~getCategory" name="getContainer" project="org.eclipse.mylar.tasklist" references="true" stamp="1142265772754"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.clear()' to 'reset'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskList.java[TaskList~clear" name="reset" project="org.eclipse.mylar.tasklist" references="true" stamp="1142269736073"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.actions.FilterArchiveCategoryAction' to 'FilterArchiveContainerAction'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{FilterArchiveCategoryAction.java[FilterArchiveCategoryAction" matchStrategy="1" name="FilterArchiveContainerAction" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1142275668079" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListContentProvider.selectCategory(...)' to 'selectContainer'" flags="65538" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListContentProvider.java[TaskListContentProvider~selectCategory~QAbstractTaskContainer;" name="selectContainer" project="org.eclipse.mylar.tasklist" references="true" stamp="1142276315881"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getPrefs()' to 'getMylarPrefs'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin~getPrefs" name="getMylarPrefs" project="org.eclipse.mylar.tasklist" references="true" stamp="1142280922565"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getMylarPrefs()' to 'getMylarCorePrefs'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin~getMylarPrefs" name="getMylarCorePrefs" project="org.eclipse.mylar.tasklist" references="true" stamp="1142284662593"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizardPage.DESCRIPTION' from expression '"Warning: importing overwrites current task list, use with caution."'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.wizards{TaskDataImportWizardPage.java" name="DESCRIPTION" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="3863 68" stamp="1142300726249" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery.isCurrentlySynchronizing()' to 'isSynchronizing'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryQuery.java[AbstractRepositoryQuery~isCurrentlySynchronizing" name="isSynchronizing" project="org.eclipse.mylar.tasklist" references="true" stamp="1142306713859"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.isCurrentlySynchronizing()' to 'isSynchronizing'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~isCurrentlySynchronizing" name="isSynchronizing" project="org.eclipse.mylar.tasklist" references="true" stamp="1142306743952"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist/icons/eview16/overlay-waiting.gif' to 'overlay-synchronizing.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist/icons/eview16/overlay-waiting.gif" name="overlay-synchronizing.gif" project="org.eclipse.mylar.tasklist" stamp="1142307102297"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.GoIntoAction.LABEL' from expression '"Go Into Category"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{GoIntoAction.java" name="LABEL" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="1291 18" stamp="1142360895778" visibility="2"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListPerspectiveFactory' to 'PlanningPerspectiveFactory'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListPerspectiveFactory.java[TaskListPerspectiveFactory" matchStrategy="1" name="PlanningPerspectiveFactory" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1142388832048" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.BACKGROUND_WHITE' to 'BACKGROUND'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^BACKGROUND_WHITE" name="BACKGROUND" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1142441608428" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.TITLE_SHELL' from expression '"New Repostiory Task"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{NewRepositoryTaskAction.java" name="TITLE_SHELL" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="2807 21" stamp="1142473184377" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.AddRepositoryAction.TITLE' from expression '"Add Task Repository"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{AddRepositoryAction.java" name="TITLE" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="1896 21" stamp="1142529850783" visibility="2"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin' to 'MylarTaskListPluginnn'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin" matchStrategy="1" name="MylarTaskListPluginnn" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1142566480226" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/11/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/11/refactorings.index
new file mode 100644
index 0000000..58a02f0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/11/refactorings.index
@@ -0,0 +1,29 @@
+1142200908865 Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskChangeListener' to 'ITaskListChangeListener'
+1142205433613 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.createNewTaskList()' to 'resetTaskList'
+1142209032578 Rename field 'org.eclipse.mylar.provisional.tasklist.TaskListManager.nextTaskId' to 'nextLocalTaskId'
+1142211095745 Rename field 'org.eclipse.mylar.provisional.tasklist.TaskList.archiveCategory' to 'archiveContainer'
+1142211740422 Rename type 'org.eclipse.mylar.provisional.tasklist.ITaskContainer' to 'AbstractTaskContainer'
+1142214175563 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.getTaskFromArchive(...)' to 'getTask'
+1142225362919 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer.addTask(...)' to 'add'
+1142225381756 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractTaskContainer.removeTask(...)' to 'remove'
+1142229662581 Rename method 'org.eclipse.mylar.provisional.tasklist.ITask.setCategory(...)' to 'setContainer'
+1142230022419 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.moveToCategory(...)' to 'moveToContainer'
+1142264203377 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.getCategoryForHandle(...)' to 'getContainerForHandle'
+1142264229785 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.getTaskCategories()' to 'getTaskContainers'
+1142265755940 Rename method 'org.eclipse.mylar.provisional.tasklist.DateRangeActivityDelegate.getContainer()' to 'getDateRangeContainer'
+1142265772754 Rename method 'org.eclipse.mylar.provisional.tasklist.ITask.getCategory()' to 'getContainer'
+1142269736073 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskList.clear()' to 'reset'
+1142275668079 Rename type 'org.eclipse.mylar.internal.tasklist.ui.actions.FilterArchiveCategoryAction' to 'FilterArchiveContainerAction'
+1142276315881 Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListContentProvider.selectCategory(...)' to 'selectContainer'
+1142280922565 Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getPrefs()' to 'getMylarPrefs'
+1142284662593 Rename method 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.getMylarPrefs()' to 'getMylarCorePrefs'
+1142300726249 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizardPage.DESCRIPTION' from expression '"Warning: importing overwrites current task list, use with caution."'
+1142306713859 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery.isCurrentlySynchronizing()' to 'isSynchronizing'
+1142306743952 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.isCurrentlySynchronizing()' to 'isSynchronizing'
+1142307102297 Rename resource '/org.eclipse.mylar.tasklist/icons/eview16/overlay-waiting.gif' to 'overlay-synchronizing.gif'
+1142360895778 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.GoIntoAction.LABEL' from expression '"Go Into Category"'
+1142388832048 Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListPerspectiveFactory' to 'PlanningPerspectiveFactory'
+1142441608428 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.BACKGROUND_WHITE' to 'BACKGROUND'
+1142473184377 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.NewRepositoryTaskAction.TITLE_SHELL' from expression '"New Repostiory Task"'
+1142529850783 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.AddRepositoryAction.TITLE' from expression '"Add Task Repository"'
+1142566480226 Rename type 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin' to 'MylarTaskListPluginnn'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/13/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/13/refactorings.history
new file mode 100644
index 0000000..f0461a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/13/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.AbstractTaskFilter' to 'AbstractTaskListFilter'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{AbstractTaskFilter.java[AbstractTaskFilter" matchStrategy="1" name="AbstractTaskListFilter" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="true" stamp="1143516342515" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.SET_REMINDER' to 'LABEL_REMINDER'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskReminderMenuContributor.java[TaskReminderMenuContributor^SET_REMINDER" name="LABEL_REMINDER" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1143571073753" textual="false"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/13/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/13/refactorings.index
new file mode 100644
index 0000000..84c025f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/13/refactorings.index
@@ -0,0 +1,2 @@
+1143516342515 Rename type 'org.eclipse.mylar.internal.tasklist.ui.AbstractTaskFilter' to 'AbstractTaskListFilter'
+1143571073753 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.SET_REMINDER' to 'LABEL_REMINDER'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/9/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/9/refactorings.history
new file mode 100644
index 0000000..b0f9d2d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/9/refactorings.history
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Move type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.TaskListTableSorter' in 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView' to new file" field="true" fieldName="view" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java[TaskListView[TaskListTableSorter" mandatory="true" parameterName="view" possible="true" project="org.eclipse.mylar.tasklist" stamp="1141184226296"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter.SmartComparator' to 'TaskKeyComparator'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListTableSorter.java[TaskListTableSorter[SmartComparator" matchStrategy="1" name="TaskKeyComparator" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141184579915" textual="false"/>
+<refactoring comment="" description="Move type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter.TaskKeyComparator' in 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter' to new file" field="false" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListTableSorter.java[TaskListTableSorter[TaskKeyComparator" mandatory="false" possible="true" project="org.eclipse.mylar.tasklist" stamp="1141184827451"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_NOTED' from expression '"Documentation"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskInfoEditor.java" name="LABEL_NOTED" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="15141 15" stamp="1141230525109" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.NOTIFICATION_DELAY' from expression '5000'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java" name="NOTIFICATION_DELAY" project="org.eclipse.mylar.tasklist" qualify="false" replace="false" selection="10142 4" stamp="1141238637374" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.repositoryClients' to 'repositoryConnectors'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^repositoryClients" name="repositoryConnectors" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141265793591" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.getRepositoryClients()' to 'getRepositoryConnectors'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryClients" name="getRepositoryConnectors" project="org.eclipse.mylar.tasklist" references="true" stamp="1141265812368"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.getRepositoryClient(...)' to 'getRepositoryConnector'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryClient~QString;" name="getRepositoryConnector" project="org.eclipse.mylar.tasklist" references="true" stamp="1141265821872"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.addRepositoryClient(...)' to 'addRepositoryConnector'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~addRepositoryClient~QAbstractRepositoryConnector;" name="addRepositoryConnector" project="org.eclipse.mylar.tasklist" references="true" stamp="1141265837505"/>
+<refactoring comment="" description="Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.addRepositoryConnector(...)' to 'repositoryConnector'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="repositoryConnector" project="org.eclipse.mylar.tasklist" references="true" selection="2521 16" stamp="1141265848340"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.removeRepositoryClient(...)' to 'removeRepositoryConnector'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager~removeRepositoryClient~QAbstractRepositoryConnector;" name="removeRepositoryConnector" project="org.eclipse.mylar.tasklist" references="true" stamp="1141265856702"/>
+<refactoring comment="" description="Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.removeRepositoryConnector(...)' to 'repositoryConnector'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="repositoryConnector" project="org.eclipse.mylar.tasklist" references="true" selection="2786 16" stamp="1141265865655"/>
+<refactoring comment="" description="Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.getAllRepositories()' to 'repositoryConnector'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="repositoryConnector" project="org.eclipse.mylar.tasklist" references="true" selection="4374 16" stamp="1141265874898"/>
+<refactoring comment="" description="Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.readRepositories()' to 'repositoryConnector'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="repositoryConnector" project="org.eclipse.mylar.tasklist" references="true" selection="5911 16" stamp="1141265884122"/>
+<refactoring comment="" description="Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.saveRepositories()' to 'repositoryConnector'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="repositoryConnector" project="org.eclipse.mylar.tasklist" references="true" selection="7079 16" stamp="1141265890291"/>
+<refactoring comment="" description="Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.clearRepositories()' to 'repositoryConnector'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="repositoryConnector" project="org.eclipse.mylar.tasklist" references="true" selection="8039 16" stamp="1141265897341"/>
+<refactoring comment="" comments="false" description="Extract method 'private void updateOfflineState()' from 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SynchronizeTaskJob.run()' to 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector'" destination="1" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java" name="updateOfflineState" project="org.eclipse.mylar.tasklist" replace="false" selection="3432 202" stamp="1141266789634" visibility="2"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.isCurrentlyDownloading()' to 'isCurrentlySynchronizing'" flags="65542" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~isCurrentlyDownloading" name="isCurrentlySynchronizing" project="org.eclipse.mylar.tasklist" references="true" stamp="1141334218303"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.currentlyDownloading' to 'currentlySynchronizing'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask^currentlyDownloading" name="currentlySynchronizing" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141334228397" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.LABEL_SYNCHRONIZE_JOB' to 'LABEL_SYNCHRONIZE_QUERY'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector^LABEL_SYNCHRONIZE_JOB" name="LABEL_SYNCHRONIZE_QUERY" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141334655601" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SYNCHRONIZING_TASK_LABEL' to 'LABEL_SYNCHRONIZE_TASK'" flags="65538" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector^SYNCHRONIZING_TASK_LABEL" name="LABEL_SYNCHRONIZE_TASK" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141334663303" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_PLANNING' from expression '"Planning"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskInfoEditor.java" name="LABEL_PLANNING" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="16226 10" stamp="1141344213655" visibility="2"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskHistoryView' to 'TaskActivityView'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.history.ui{TaskHistoryView.java[TaskHistoryView" matchStrategy="1" name="TaskActivityView" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141347125122" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskHistoryContentProvider' to 'TaskActivityContentProvider'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.history.ui{TaskHistoryContentProvider.java[TaskHistoryContentProvider" matchStrategy="1" name="TaskActivityContentProvider" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141347506470" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskHistoryLabelProvider' to 'TaskActivityLabelProvider'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.history.ui{TaskHistoryLabelProvider.java[TaskHistoryLabelProvider" matchStrategy="1" name="TaskActivityLabelProvider" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141347529774" textual="false"/>
+<refactoring comment="" description="Move type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskActivityContentProvider.DateRangeTaskCategory' in 'org.eclipse.mylar.internal.tasklist.history.ui.TaskActivityContentProvider' to new file" field="false" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.history.ui{TaskActivityContentProvider.java[TaskActivityContentProvider[DateRangeTaskCategory" mandatory="false" possible="true" project="org.eclipse.mylar.tasklist" stamp="1141347546117"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskCategory' to 'DateRangeTaskContainer'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{DateRangeTaskCategory.java[DateRangeTaskCategory" matchStrategy="1" name="DateRangeTaskContainer" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141347911713" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityContentProvider.pastWeeks' to 'dateRangeContainers'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskActivityContentProvider.java[TaskActivityContentProvider^pastWeeks" name="dateRangeContainers" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141348507189" textual="false"/>
+<refactoring comment="" description="Rename local variable 'cat' in 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskContainer.addTask(...)' to 'taskContainer'" id="org.eclipse.jdt.ui.rename.local.variable" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{DateRangeTaskContainer.java" name="taskContainer" project="org.eclipse.mylar.tasklist" references="true" selection="2131 3" stamp="1141348854498"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskActivityLabelProvider' to 'TaskPlannerLabelProvider'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.planner.ui{TaskActivityLabelProvider.java[TaskActivityLabelProvider" matchStrategy="1" name="TaskPlannerLabelProvider" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141349429455" textual="false"/>
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar.tasklist/icons/eview16/calendar.gif' to 'task-activity.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar.tasklist/icons/eview16/calendar.gif" name="task-activity.gif" project="org.eclipse.mylar.tasklist" stamp="1141410972858"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.SIZE_BIG' to 'SIZE_WIDE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^SIZE_BIG" name="SIZE_WIDE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141417202075" textual="false"/>
+<refactoring comment="" description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListOverlayDescriptor' to 'TaskListImageDescriptor'" flags="65542" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListOverlayDescriptor.java[TaskListOverlayDescriptor" matchStrategy="1" name="TaskListImageDescriptor" project="org.eclipse.mylar.tasklist" qualified="false" references="true" similarDeclarations="false" stamp="1141418760536" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.SIZE_WIDE' to 'SIZE'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^SIZE_WIDE" name="SIZE" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141422746858" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.GRAY_LIGHT' to 'COLOR_GRAY_LIGHT'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^GRAY_LIGHT" name="COLOR_GRAY_LIGHT" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141434328973" textual="false"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Move 9 members to {1}" element1="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^COLOR_TASK_OVERDUE" element2="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^COLOR_TASK_COMPLETED" element3="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^ITALIC" element4="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^BOLD" element5="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^BACKGROUND_WHITE" element6="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^COLOR_TASK_ACTIVE" element7="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^COLOR_GRAY_LIGHT" element8="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages^BACKGROUND_ARCHIVE" element9="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListImages.java[TaskListImages~dispose" flags="65542" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts" project="org.eclipse.mylar.tasklist" stamp="1141434395859"/>
+<refactoring comment="" delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.HYPERLINK' to 'COLOR_HYPERLINK'" flags="65542" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^HYPERLINK" name="COLOR_HYPERLINK" project="org.eclipse.mylar.tasklist" references="true" setter="false" stamp="1141434552784" textual="false"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_COMPLETE' from expression '"Completed"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskInfoEditor.java" name="LABEL_COMPLETE" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="14605 11" stamp="1141439626129" visibility="2"/>
+<refactoring comment="" description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_INCOMPLETE' from expression '"Incomplete"'" id="org.eclipse.jdt.ui.extract.constant" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskInfoEditor.java" name="LABEL_INCOMPLETE" project="org.eclipse.mylar.tasklist" qualify="false" replace="true" selection="14703 12" stamp="1141439637255" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/9/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/9/refactorings.index
new file mode 100644
index 0000000..a5bd30e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/3/9/refactorings.index
@@ -0,0 +1,39 @@
+1141184226296 Move type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.TaskListTableSorter' in 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView' to new file
+1141184579915 Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter.SmartComparator' to 'TaskKeyComparator'
+1141184827451 Move type 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter.TaskKeyComparator' in 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableSorter' to new file
+1141230525109 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_NOTED' from expression '"Documentation"'
+1141238637374 Extract constant 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.NOTIFICATION_DELAY' from expression '5000'
+1141265793591 Rename field 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.repositoryClients' to 'repositoryConnectors'
+1141265812368 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.getRepositoryClients()' to 'getRepositoryConnectors'
+1141265821872 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.getRepositoryClient(...)' to 'getRepositoryConnector'
+1141265837505 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.addRepositoryClient(...)' to 'addRepositoryConnector'
+1141265848340 Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.addRepositoryConnector(...)' to 'repositoryConnector'
+1141265856702 Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.removeRepositoryClient(...)' to 'removeRepositoryConnector'
+1141265865655 Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.removeRepositoryConnector(...)' to 'repositoryConnector'
+1141265874898 Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.getAllRepositories()' to 'repositoryConnector'
+1141265884122 Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.readRepositories()' to 'repositoryConnector'
+1141265890291 Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.saveRepositories()' to 'repositoryConnector'
+1141265897341 Rename local variable 'repositoryClient' in 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.clearRepositories()' to 'repositoryConnector'
+1141266789634 Extract method 'private void updateOfflineState()' from 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SynchronizeTaskJob.run()' to 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector'
+1141334218303 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.isCurrentlyDownloading()' to 'isCurrentlySynchronizing'
+1141334228397 Rename field 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.currentlyDownloading' to 'currentlySynchronizing'
+1141334655601 Rename field 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.LABEL_SYNCHRONIZE_JOB' to 'LABEL_SYNCHRONIZE_QUERY'
+1141334663303 Rename field 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SYNCHRONIZING_TASK_LABEL' to 'LABEL_SYNCHRONIZE_TASK'
+1141344213655 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_PLANNING' from expression '"Planning"'
+1141347125122 Rename type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskHistoryView' to 'TaskActivityView'
+1141347506470 Rename type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskHistoryContentProvider' to 'TaskActivityContentProvider'
+1141347529774 Rename type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskHistoryLabelProvider' to 'TaskActivityLabelProvider'
+1141347546117 Move type 'org.eclipse.mylar.internal.tasklist.history.ui.TaskActivityContentProvider.DateRangeTaskCategory' in 'org.eclipse.mylar.internal.tasklist.history.ui.TaskActivityContentProvider' to new file
+1141347911713 Rename type 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskCategory' to 'DateRangeTaskContainer'
+1141348507189 Rename field 'org.eclipse.mylar.internal.tasklist.ui.views.TaskActivityContentProvider.pastWeeks' to 'dateRangeContainers'
+1141348854498 Rename local variable 'cat' in 'org.eclipse.mylar.provisional.tasklist.DateRangeTaskContainer.addTask(...)' to 'taskContainer'
+1141349429455 Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskActivityLabelProvider' to 'TaskPlannerLabelProvider'
+1141410972858 Rename resource '/org.eclipse.mylar.tasklist/icons/eview16/calendar.gif' to 'task-activity.gif'
+1141417202075 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.SIZE_BIG' to 'SIZE_WIDE'
+1141418760536 Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListOverlayDescriptor' to 'TaskListImageDescriptor'
+1141422746858 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.SIZE_WIDE' to 'SIZE'
+1141434328973 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListImages.GRAY_LIGHT' to 'COLOR_GRAY_LIGHT'
+1141434395859 Move 9 members to {1}
+1141434552784 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.HYPERLINK' to 'COLOR_HYPERLINK'
+1141439626129 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_COMPLETE' from expression '"Completed"'
+1141439637255 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor.LABEL_INCOMPLETE' from expression '"Incomplete"'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/13/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/13/refactorings.history
new file mode 100644
index 0000000..459a5ee
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/13/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comments="false" description="Extract method 'private void openTaskListElement(Object element)' from 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction.run()' to 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/internal/tasklist/ui/actions/OpenTaskListElementAction.java" name="openTaskListElement" replace="false" selection="2958 2000" stamp="1143853139154" version="1.0" visibility="2"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction.openTaskListElement(...)' to 'refreshAndOpenTaskListElement'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{OpenTaskListElementAction.java[OpenTaskListElementAction~openTaskListElement~QITaskListElement;" name="refreshAndOpenTaskListElement" references="true" stamp="1143853298343" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getRepositoryUrlFromCommitComment(...)' to 'getRepositoryUrlFromTaskUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getRepositoryUrlFromCommitComment~QString;" name="getRepositoryUrlFromTaskUrl" references="true" stamp="1143854926785" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil' to 'TaskUiUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui{TaskListUiUtil.java[TaskListUiUtil" matchStrategy="1" name="TaskUiUtil" qualified="false" references="true" similarDeclarations="true" stamp="1143857545801" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/13/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/13/refactorings.index
new file mode 100644
index 0000000..61ba3a6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/13/refactorings.index
@@ -0,0 +1,4 @@
+1143853139154 Extract method 'private void openTaskListElement(Object element)' from 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction.run()' to 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction'
+1143857545801 Rename type 'org.eclipse.mylar.internal.tasklist.ui.TaskListUiUtil' to 'TaskUiUtil'
+1143854926785 Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getRepositoryUrlFromCommitComment(...)' to 'getRepositoryUrlFromTaskUrl'
+1143853298343 Rename method 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskListElementAction.openTaskListElement(...)' to 'refreshAndOpenTaskListElement'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/14/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/14/refactorings.history
new file mode 100644
index 0000000..0ddc53b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/14/refactorings.history
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.actions.NewLocalTaskAction.NEW_TASK_DESCRIPTION' to 'DESCRIPTION_DEFAULT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.actions{NewLocalTaskAction.java[NewLocalTaskAction^NEW_TASK_DESCRIPTION" name="DESCRIPTION_DEFAULT" references="true" setter="false" stamp="1144087092664" textual="false" version="1.0"/>
+
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.PATH_SEPARATOR' to 'DEFAULT_PATH_SEPARATOR'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin^PATH_SEPARATOR" name="DEFAULT_PATH_SEPARATOR" references="true" setter="false" stamp="1144111775102" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.BACKUP_FOLDER' to 'DEFAULT_BACKUP_FOLDER_NAME'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin^BACKUP_FOLDER" name="DEFAULT_BACKUP_FOLDER_NAME" references="true" setter="false" stamp="1144111787961" textual="false" version="1.0"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage.LABEL_ACTIVITY_HISTORY' from expression '"Task Activity History"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java" name="LABEL_ACTIVITY_HISTORY" qualify="false" replace="true" selection="4184 23" stamp="1144112012193" version="1.0" visibility="2"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage.LABEL_TASK_CONTEXTS' from expression '"Task Contexts"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java" name="LABEL_TASK_CONTEXTS" qualify="false" replace="true" selection="4339 15" stamp="1144112042547" version="1.0" visibility="2"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage.LABEL_TASK_LIST' from expression '"Task List"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/tasklist/ui/wizards/TaskDataExportWizardPage.java" name="LABEL_TASK_LIST" qualify="false" replace="true" selection="4266 11" stamp="1144112053853" version="1.0" visibility="2"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.planner.TaskReportGenerator.LABEL_JOB' from expression '"Mylar Task Planner"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/tasklist/planner/TaskReportGenerator.java" name="LABEL_JOB" qualify="false" replace="true" selection="3322 20" stamp="1144338377927" version="1.0" visibility="2"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorInput.TASK_ACTIVITY_REPORT' from expression '"Mylar Task Planner"'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/internal/tasklist/planner/ui/TaskPlannerEditorInput.java" name="TASK_ACTIVITY_REPORT" qualify="false" replace="true" selection="3216 20" stamp="1144338406188" version="1.0" visibility="2"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerWizardPage' to 'TaskActicityWizardPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.planner.ui{TaskPlannerWizardPage.java[TaskPlannerWizardPage" matchStrategy="1" name="TaskActicityWizardPage" qualified="false" references="true" similarDeclarations="true" stamp="1144338488196" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerWizard' to 'TaskActivityWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.planner.ui{TaskPlannerWizard.java[TaskPlannerWizard" matchStrategy="1" name="TaskActivityWizard" qualified="false" references="true" similarDeclarations="true" stamp="1144338502977" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorInput' to 'TaskActivityEditorInput'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.planner.ui{TaskPlannerEditorInput.java[TaskPlannerEditorInput" matchStrategy="1" name="TaskActivityEditorInput" qualified="false" references="true" similarDeclarations="true" stamp="1144338521995" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorPart' to 'TaskActivityEditorPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.planner.ui{TaskPlannerEditorPart.java[TaskPlannerEditorPart" matchStrategy="1" name="TaskActivityEditorPart" qualified="false" references="true" similarDeclarations="true" stamp="1144338571926" textual="false" version="1.0"/>
+<refactoring description="Move type 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SynchronizeTaskJob' in 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' to new file" field="true" fieldName="connector" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector[SynchronizeTaskJob" mandatory="true" parameterName="connector" possible="true" stamp="1144356422991" version="1.0"/>
+<refactoring description="Move type 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SynchronizeQueryJob' in 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' to new file" field="true" fieldName="connector" final="true" flags="6" id="org.eclipse.jdt.ui.move.inner" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector[SynchronizeQueryJob" mandatory="true" parameterName="connector" possible="true" stamp="1144356441828" version="1.0"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.DELAY_QUERY_REFRESH_ON_STARTUP' from expression '10000'" id="org.eclipse.jdt.ui.extract.constant" input="unit://src/org/eclipse/mylar/provisional/tasklist/MylarTaskListPlugin.java" name="DELAY_QUERY_REFRESH_ON_STARTUP" qualify="false" replace="false" selection="11661 5" stamp="1144357677665" version="1.0" visibility="2"/>
+<refactoring comments="false" description="Extract method 'private void synchronizeQueries()' from 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.earlyStartup().new Runnable() {...}.run()' to 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.earlyStartup().new Runnable() {...}'" destination="0" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/provisional/tasklist/MylarTaskListPlugin.java" name="synchronizeQueries" replace="false" selection="11520 265" stamp="1144361212989" version="1.0" visibility="2"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.refreshScheduleTime' to 'synchScheduleTime'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.preferences{MylarRepositoriesPreferencePage.java[MylarRepositoriesPreferencePage^refreshScheduleTime" name="synchScheduleTime" references="true" setter="false" stamp="1144362391053" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.refreshQueries' to 'synchQueries'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.preferences{MylarRepositoriesPreferencePage.java[MylarRepositoriesPreferencePage^refreshQueries" name="synchQueries" references="true" setter="false" stamp="1144362399445" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.enableBackgroundRefresh' to 'enableBackgroundSynch'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist.ui.preferences{MylarRepositoriesPreferencePage.java[MylarRepositoriesPreferencePage^enableBackgroundRefresh" name="enableBackgroundSynch" references="true" setter="false" stamp="1144362417511" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.ScheduledTaskListRefreshJob' to 'ScheduledTaskListSynchJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{ScheduledTaskListRefreshJob.java[ScheduledTaskListRefreshJob" matchStrategy="1" name="ScheduledTaskListSynchJob" qualified="false" references="true" similarDeclarations="true" stamp="1144362714157" textual="false" version="1.0"/>
+<refactoring description="Rename type 'org.eclipse.mylar.internal.tasklist.TaskListRefreshManager' to 'TaskListSynchronizationManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskListRefreshManager.java[TaskListRefreshManager" matchStrategy="1" name="TaskListSynchronizationManager" qualified="false" references="true" similarDeclarations="true" stamp="1144362735077" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename method 'org.eclipse.mylar.internal.tasklist.TaskListSynchronizationManager.startRefreshJob()' to 'startSynchJob'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="=org.eclipse.mylar.tasklist/src<org.eclipse.mylar.internal.tasklist{TaskListSynchronizationManager.java[TaskListSynchronizationManager~startRefreshJob" name="startSynchJob" references="true" stamp="1144362757630" version="1.0"/>
+<refactoring comments="false" description="Extract method 'private void readTaskList()' from 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizard.FileCopyJob.run()' to 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizard'" destination="1" exceptions="false" flags="2" id="org.eclipse.jdt.ui.extract.method" input="unit://src/org/eclipse/mylar/internal/tasklist/ui/wizards/TaskDataImportWizard.java" name="readTaskList" replace="false" selection="10779 191" stamp="1144460363536" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/14/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/14/refactorings.index
new file mode 100644
index 0000000..f91a451
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/14/refactorings.index
@@ -0,0 +1,23 @@
+1144087092664 Rename field 'org.eclipse.mylar.internal.tasklist.ui.actions.NewLocalTaskAction.NEW_TASK_DESCRIPTION' to 'DESCRIPTION_DEFAULT'
+1144460363536 Extract method 'private void readTaskList()' from 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizard.FileCopyJob.run()' to 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataImportWizard'
+1144362757630 Rename method 'org.eclipse.mylar.internal.tasklist.TaskListSynchronizationManager.startRefreshJob()' to 'startSynchJob'
+1144362735077 Rename type 'org.eclipse.mylar.internal.tasklist.TaskListRefreshManager' to 'TaskListSynchronizationManager'
+1144362714157 Rename type 'org.eclipse.mylar.internal.tasklist.ScheduledTaskListRefreshJob' to 'ScheduledTaskListSynchJob'
+1144362417511 Rename field 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.enableBackgroundRefresh' to 'enableBackgroundSynch'
+1144362399445 Rename field 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.refreshQueries' to 'synchQueries'
+1144362391053 Rename field 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.refreshScheduleTime' to 'synchScheduleTime'
+1144361212989 Extract method 'private void synchronizeQueries()' from 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.earlyStartup().new Runnable() {...}.run()' to 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.earlyStartup().new Runnable() {...}'
+1144357677665 Extract constant 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.DELAY_QUERY_REFRESH_ON_STARTUP' from expression '10000'
+1144356441828 Move type 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SynchronizeQueryJob' in 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' to new file
+1144356422991 Move type 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.SynchronizeTaskJob' in 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector' to new file
+1144338571926 Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorPart' to 'TaskActivityEditorPart'
+1144338521995 Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorInput' to 'TaskActivityEditorInput'
+1144338502977 Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerWizard' to 'TaskActivityWizard'
+1144338488196 Rename type 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerWizardPage' to 'TaskActicityWizardPage'
+1144338406188 Extract constant 'org.eclipse.mylar.internal.tasklist.planner.ui.TaskPlannerEditorInput.TASK_ACTIVITY_REPORT' from expression '"Mylar Task Planner"'
+1144338377927 Extract constant 'org.eclipse.mylar.internal.tasklist.planner.TaskReportGenerator.LABEL_JOB' from expression '"Mylar Task Planner"'
+1144112053853 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage.LABEL_TASK_LIST' from expression '"Task List"'
+1144112042547 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage.LABEL_TASK_CONTEXTS' from expression '"Task Contexts"'
+1144112012193 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.TaskDataExportWizardPage.LABEL_ACTIVITY_HISTORY' from expression '"Task Activity History"'
+1144111787961 Rename field 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.BACKUP_FOLDER' to 'DEFAULT_BACKUP_FOLDER_NAME'
+1144111775102 Rename field 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.PATH_SEPARATOR' to 'DEFAULT_PATH_SEPARATOR'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/16/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/16/refactorings.history
new file mode 100644
index 0000000..fa3c0b0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/16/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer.KEY_QUERY_LAST_REFRESH' to 'KEY_LAST_REFRESH'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.provisional.tasklist{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^KEY_QUERY_LAST_REFRESH" name="KEY_LAST_REFRESH" references="true" setter="false" stamp="1145577553230" textual="false" version="1.0"/>
+<refactoring delegate="false" deprecate="true" description="Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.THEME_COLOR_ID_TASK_DUE_TODAY' to 'THEME_COLOR_ID_TASK_TODAY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^THEME_COLOR_ID_TASK_DUE_TODAY" name="THEME_COLOR_ID_TASK_TODAY" references="true" setter="false" stamp="1145590187252" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/16/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/16/refactorings.index
new file mode 100644
index 0000000..d9a2617
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1145577553230 Rename field 'org.eclipse.mylar.provisional.tasklist.DelegatingTaskExternalizer.KEY_QUERY_LAST_REFRESH' to 'KEY_LAST_REFRESH'
+1145590187252 Rename field 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.THEME_COLOR_ID_TASK_DUE_TODAY' to 'THEME_COLOR_ID_TASK_TODAY'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/17/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/17/refactorings.history
new file mode 100644
index 0000000..91dcbe1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/17/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDescriptionAction.LABEL' from expression '"Copy Description"'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{CopyDescriptionAction.java" name="LABEL" qualify="false" replace="true" selection="1493 18" stamp="1146016573963" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskInExternalBrowserAction' to 'OpenInExternalBrowserAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenTaskInExternalBrowserAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenInExternalBrowserAction' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'OpenTaskInExternalBrowserAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{OpenTaskInExternalBrowserAction.java[OpenTaskInExternalBrowserAction" matchStrategy="1" name="OpenInExternalBrowserAction" qualified="false" references="true" similarDeclarations="true" stamp="1146017097227" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor' to 'TaskPlanningEditor' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskInfoEditor' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskPlanningEditor' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'TaskInfoEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskInfoEditor.java[TaskInfoEditor" matchStrategy="1" name="TaskPlanningEditor" qualified="false" references="true" similarDeclarations="true" stamp="1146082056264" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskPlanningEditor.createDocumentationSection(...)' to 'createNotesSection' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskPlanningEditor.createDocumentationSection(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskPlanningEditor.createNotesSection(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createDocumentationSection'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskPlanningEditor.java[TaskPlanningEditor~createDocumentationSection~QComposite;~QFormToolkit;" name="createNotesSection" references="true" stamp="1146082078355" version="1.0"/>
+<refactoring description="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.ContextRetrieveWizard.TITLE' from expression '"Retrieve Context"'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{ContextRetrieveWizard.java" name="TITLE" qualify="false" replace="true" selection="1724 18" stamp="1146106982879" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.isActiveToday(...)' to 'isReminderToday' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.isActiveToday(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.isReminderToday(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'isActiveToday'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~isActiveToday~QITask;" name="isReminderToday" references="true" stamp="1146254914992" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.ITask.getKind()' to 'getTaskType' - Original element: 'org.eclipse.mylar.provisional.tasklist.ITask.getKind()' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.ITask.getTaskType()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getKind'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{ITask.java[ITask~getKind" name="getTaskType" references="true" stamp="1146259650882" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/17/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/17/refactorings.index
new file mode 100644
index 0000000..ea3ad88
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/4/17/refactorings.index
@@ -0,0 +1,7 @@
+1146016573963 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDescriptionAction.LABEL' from expression '"Copy Description"'
+1146259650882 Rename method 'getKind'
+1146254914992 Rename method 'isActiveToday'
+1146106982879 Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.ContextRetrieveWizard.TITLE' from expression '"Retrieve Context"'
+1146082078355 Rename method 'createDocumentationSection'
+1146082056264 Rename type 'TaskInfoEditor'
+1146017097227 Rename type 'OpenTaskInExternalBrowserAction'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/18/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/18/refactorings.history
new file mode 100644
index 0000000..0104f15
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/18/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskInputDialog.getDefaultIssueURL()' to 'getDefaultIssueUrl' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskInputDialog.getDefaultIssueURL()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskInputDialog.getDefaultIssueUrl()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getDefaultIssueURL'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskInputDialog.java[TaskInputDialog~getDefaultIssueURL" name="getDefaultIssueUrl" references="true" stamp="1146678411662" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskPlanningEditor.DESCRIPTION_ESTIMATED' from expression '"Time that the task has been actively worked on.\n Inactivity timeout is " + MylarPlugin.getContextManager().getInactivityTimeout() + " seconds."' - Constant name: 'DESCRIPTION_ESTIMATED' - Constant expression: '"Time that the task has been actively worked on.\n Inactivity timeout is " + MylarPlugin.getContextManager().getInactivityTimeout() + " seconds."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DESCRIPTION_ESTIMATED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskPlanningEditor.java" name="DESCRIPTION_ESTIMATED" qualify="false" replace="true" selection="25491 145" stamp="1146757641251" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/18/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/18/refactorings.index
new file mode 100644
index 0000000..780e051
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/18/refactorings.index
@@ -0,0 +1,2 @@
+1146678411662 Rename method 'getDefaultIssueURL'
+1146757641251 Extract constant 'DESCRIPTION_ESTIMATED'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/19/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/19/refactorings.history
new file mode 100644
index 0000000..758b3b2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/19/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.EditRepositoryWizard.TITLE' from expression '"Task Repository Settings"' - Constant name: 'TITLE' - Constant expression: '"Task Repository Settings"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'TITLE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{EditRepositoryWizard.java" name="TITLE" qualify="false" replace="true" selection="1920 26" stamp="1147375241467" version="1.0" visibility="2"/>
+
+<refactoring comment="Rename field 'LABEL_IN_HOUR' in 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor' to 'LABEL_TODAY' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.LABEL_IN_HOUR' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.LABEL_TODAY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'LABEL_IN_HOUR'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskReminderMenuContributor.java[TaskReminderMenuContributor^LABEL_IN_HOUR" name="LABEL_TODAY" references="true" setter="false" stamp="1147456823385" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setInHour(...)' to 'setToday' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setInHour(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setToday(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setInHour'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~setInHour~QCalendar;" name="setToday" references="true" stamp="1147456884042" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskPlanningEditor.LABEL_SCHEDULE' from expression '"Reminder:"' - Constant name: 'LABEL_SCHEDULE' - Constant expression: '"Reminder:"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_SCHEDULE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskPlanningEditor.java" name="LABEL_SCHEDULE" qualify="false" replace="true" selection="21599 11" stamp="1147459810120" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/19/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/19/refactorings.index
new file mode 100644
index 0000000..6501638
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/19/refactorings.index
@@ -0,0 +1,4 @@
+1147375241467 Extract constant 'TITLE'
+1147459810120 Extract constant 'LABEL_SCHEDULE'
+1147456884042 Rename method 'setInHour'
+1147456823385 Rename field 'LABEL_IN_HOUR'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/20/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/20/refactorings.history
new file mode 100644
index 0000000..dfdd16f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/20/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private boolean canSchedule()' from 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.getSubMenuManager()' to 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor' - Method name: 'canSchedule' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor' - Declared visibility: 'private'" comments="false" description="Extract method 'canSchedule'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskReminderMenuContributor.java" name="canSchedule" replace="false" selection="3487 35" stamp="1147746038307" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void getDayLabel(int i,Action action)' from 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.getSubMenuManager()' to 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor' - Method name: 'getDayLabel' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor' - Declared visibility: 'private'" comments="false" description="Extract method 'getDayLabel'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskReminderMenuContributor.java" name="getDayLabel" replace="false" selection="3371 563" stamp="1147746206489" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setDueIn(...)' to 'setSecheduledIn' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setDueIn(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setSecheduledIn(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setDueIn'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~setDueIn~QCalendar;~I" name="setSecheduledIn" references="true" stamp="1147798458750" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setToday(...)' to 'setScheduledToday' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setToday(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.setScheduledToday(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setToday'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~setToday~QCalendar;" name="setScheduledToday" references="true" stamp="1147798472249" version="1.0"/>
+<refactoring comment="Rename field 'THEME_COLOR_ID_TASK_OVERDUE' in 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts' to 'THEME_COLOR_TASK_OVERDUE' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.THEME_COLOR_ID_TASK_OVERDUE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_OVERDUE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'THEME_COLOR_ID_TASK_OVERDUE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^THEME_COLOR_ID_TASK_OVERDUE" name="THEME_COLOR_TASK_OVERDUE" references="true" setter="false" stamp="1147804646107" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'THEME_COLOR_ID_TASKLIST_CATEGORY' in 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts' to 'THEME_COLOR_TASKLIST_CATEGORY' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.THEME_COLOR_ID_TASKLIST_CATEGORY' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts.THEME_COLOR_TASKLIST_CATEGORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'THEME_COLOR_ID_TASKLIST_CATEGORY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^THEME_COLOR_ID_TASKLIST_CATEGORY" name="THEME_COLOR_TASKLIST_CATEGORY" references="true" setter="false" stamp="1147804654910" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private boolean shouldAlwaysShow(ITask task)' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListContentProvider.shouldAlwaysShow()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListContentProvider' - Method name: 'shouldAlwaysShow' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListContentProvider' - Declared visibility: 'private' - Replace occurrences of statements with method" comments="false" description="Extract method 'shouldAlwaysShow'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListContentProvider.java" name="shouldAlwaysShow" replace="true" selection="5327 40" stamp="1147896643060" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListDragSourceListener.ID_DATA_TASK_DRAG' from expression '"task-drag"' - Constant name: 'ID_DATA_TASK_DRAG' - Constant expression: '"task-drag"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ID_DATA_TASK_DRAG'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListDragSourceListener.java" name="ID_DATA_TASK_DRAG" qualify="false" replace="true" selection="1312 11" stamp="1147989068482" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.createTaskFromExistingId(...)' to 'createTaskFromExistingKey' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.createTaskFromExistingId(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.createTaskFromExistingKey(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createTaskFromExistingId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~createTaskFromExistingId~QTaskRepository;~QString;" name="createTaskFromExistingKey" references="true" stamp="1148063890077" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.canCreateTaskFromId()' to 'canCreateTaskFromKey' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.canCreateTaskFromId()' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.canCreateTaskFromKey()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'canCreateTaskFromId'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~canCreateTaskFromId" name="canCreateTaskFromKey" references="true" stamp="1148063921793" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/20/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/20/refactorings.index
new file mode 100644
index 0000000..cd1b2d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/20/refactorings.index
@@ -0,0 +1,10 @@
+1147746038307 Extract method 'canSchedule'
+1148063921793 Rename method 'canCreateTaskFromId'
+1148063890077 Rename method 'createTaskFromExistingId'
+1147989068482 Extract constant 'ID_DATA_TASK_DRAG'
+1147896643060 Extract method 'shouldAlwaysShow'
+1147804654910 Rename field 'THEME_COLOR_ID_TASKLIST_CATEGORY'
+1147804646107 Rename field 'THEME_COLOR_ID_TASK_OVERDUE'
+1147798472249 Rename method 'setToday'
+1147798458750 Rename method 'setDueIn'
+1147746206489 Extract method 'getDayLabel'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/21/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/21/refactorings.history
new file mode 100644
index 0000000..e1ce999
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/21/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.internal.tasklist.ui.views.AdaptiveRefreshFilteredTree' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree' - Sub types: org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree - Extracted class: 'org.eclipse.mylar.internal.tasklist.ui.views.AdaptiveRefreshFilteredTree' - Extracted members: - Use super type where possible" delete="0" description="Extract superclass 'AdaptiveRefreshFilteredTree'" element1="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListFilteredTree.java[TaskListFilteredTree" extract="0" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListFilteredTree.java[TaskListFilteredTree" instanceof="false" name="AdaptiveRefreshFilteredTree" replace="true" stamp="1148345876632" stubs="true" types="1" version="1.0"/>
+<refactoring comment="Extract method 'private void createStatusComposite(Composite container)' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree.createFilterControls()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree' - Method name: 'createStatusComposite' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListFilteredTree' - Declared visibility: 'private'" comments="false" description="Extract method 'createStatusComposite'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListFilteredTree.java" name="createStatusComposite" replace="false" selection="1587 1040" stamp="1148346810155" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.AdaptiveRefreshFilteredTree' to 'AbstractMylarFilteredTree' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.AdaptiveRefreshFilteredTree' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.AbstractMylarFilteredTree' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AdaptiveRefreshFilteredTree'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{AdaptiveRefreshFilteredTree.java[AdaptiveRefreshFilteredTree" matchStrategy="1" name="AbstractMylarFilteredTree" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1148347131447" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenInExternalBrowserAction' to 'OpenWithBrowserAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenInExternalBrowserAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'OpenInExternalBrowserAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{OpenInExternalBrowserAction.java[OpenInExternalBrowserAction" matchStrategy="1" name="OpenWithBrowserAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1148595218542" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.getDefault()' to 'getFromActivePerspective' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.getDefault()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.getFromActivePerspective()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getDefault'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java[TaskListView~getDefault" name="getFromActivePerspective" references="true" stamp="1148602298202" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/21/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/21/refactorings.index
new file mode 100644
index 0000000..6a81acf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/21/refactorings.index
@@ -0,0 +1,5 @@
+1148345876632 Extract superclass 'AdaptiveRefreshFilteredTree'
+1148602298202 Rename method 'getDefault'
+1148595218542 Rename type 'OpenInExternalBrowserAction'
+1148347131447 Rename type 'AdaptiveRefreshFilteredTree'
+1148346810155 Extract method 'createStatusComposite'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/22/refactorings.history
new file mode 100644
index 0000000..54f6f98
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDescriptionAction' to 'CopyDetailsAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDescriptionAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDetailsAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'CopyDescriptionAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{CopyDescriptionAction.java[CopyDescriptionAction" matchStrategy="1" name="CopyDetailsAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1148950295063" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.setSelection(...)' to 'selectAndReveal' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.setSelection(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.selectAndReveal(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setSelection'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java[TaskListView~setSelection~QITaskListElement;" name="selectAndReveal" references="true" stamp="1148952282001" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/22/refactorings.index
new file mode 100644
index 0000000..a3fe70c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/5/22/refactorings.index
@@ -0,0 +1,2 @@
+1148950295063 Rename type 'CopyDescriptionAction'
+1148952282001 Rename method 'setSelection'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/22/refactorings.history
new file mode 100644
index 0000000..6c4827d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/22/refactorings.history
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'tasksCheduledOn' from expression 'task.getReminderDate().getDay()' - Variable name: 'tasksCheduledOn' - Destination method: 'org.eclipse.mylar.internal.tasklist.ui.TaskReminderMenuContributor.getSubMenuManager()' - Variable expression: 'task.getReminderDate().getDay()' - Replace occurrences of expression with variable" description="Extract local variable 'tasksCheduledOn'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskReminderMenuContributor.java" name="tasksCheduledOn" replace="true" selection="3610 31" stamp="1149199688400" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeReportsAction' to 'SynchronizeSelectedAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeReportsAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeSelectedAction' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'SynchronizeReportsAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui{SynchronizeReportsAction.java[SynchronizeReportsAction" matchStrategy="1" name="SynchronizeSelectedAction" patterns="*.xml, *.mf" qualified="false" references="true" similarDeclarations="true" stamp="1149202702214" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeSelectedAction' to 'SynchronizeRepositoryAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeSelectedAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeRepositoryAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'SynchronizeSelectedAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui{SynchronizeSelectedAction.java[SynchronizeSelectedAction" matchStrategy="1" name="SynchronizeRepositoryAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149203007753" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeRepositoryAction' to 'SynchronizeSelectedAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeRepositoryAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.SynchronizeSelectedAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'SynchronizeRepositoryAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui{SynchronizeRepositoryAction.java[SynchronizeRepositoryAction" matchStrategy="1" name="SynchronizeSelectedAction" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149203346450" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ScheduledTaskListSynchJob.LABEL_TASK' from expression '"Repository Synchronization"' - Constant name: 'LABEL_TASK' - Constant expression: '"Repository Synchronization"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_TASK'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist{ScheduledTaskListSynchJob.java" name="LABEL_TASK" qualify="false" replace="true" selection="2503 28" stamp="1149203456629" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'taskListSynchronizationManager' in 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin' to 'synchronizationManager' - Original element: 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.taskListSynchronizationManager' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin.synchronizationManager' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'taskListSynchronizationManager'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin^taskListSynchronizationManager" name="synchronizationManager" references="true" setter="false" stamp="1149203748969" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.AbstractAttributeFactory' to 'AbstractTaskAttributeFactory' - Original element: 'org.eclipse.mylar.internal.tasklist.AbstractAttributeFactory' - Renamed element: 'org.eclipse.mylar.internal.tasklist.AbstractTaskAttributeFactory' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractAttributeFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{AbstractAttributeFactory.java[AbstractAttributeFactory" matchStrategy="1" name="AbstractTaskAttributeFactory" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149284845656" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryReportAttribute' to 'AbstractRepositoryTaskAttribute' - Original element: 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryReportAttribute' - Renamed element: 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTaskAttribute' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryReportAttribute'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryReportAttribute.java[AbstractRepositoryReportAttribute" matchStrategy="1" name="AbstractRepositoryTaskAttribute" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149284873737" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.OfflineReportsFile' to 'OfflineTaskManager' - Original element: 'org.eclipse.mylar.internal.tasklist.OfflineReportsFile' - Renamed element: 'org.eclipse.mylar.internal.tasklist.OfflineTaskManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'OfflineReportsFile'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{OfflineReportsFile.java[OfflineReportsFile" matchStrategy="1" name="OfflineTaskManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149285023843" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.OfflineTaskManager' to 'OfflineTaskCacheManager' - Original element: 'org.eclipse.mylar.internal.tasklist.OfflineTaskManager' - Renamed element: 'org.eclipse.mylar.internal.tasklist.OfflineTaskCacheManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'OfflineTaskManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{OfflineTaskManager.java[OfflineTaskManager" matchStrategy="1" name="OfflineTaskCacheManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149285040406" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.BugzillaReportAttribute' to 'RepositoryTaskAttribute' - Original element: 'org.eclipse.mylar.internal.tasklist.BugzillaReportAttribute' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaReportAttribute'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{BugzillaReportAttribute.java[BugzillaReportAttribute" matchStrategy="1" name="RepositoryTaskAttribute" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149285094074" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.OfflineTaskCacheManager' to 'OfflineTaskManager' - Original element: 'org.eclipse.mylar.internal.tasklist.OfflineTaskCacheManager' - Renamed element: 'org.eclipse.mylar.internal.tasklist.OfflineTaskManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'OfflineTaskCacheManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{OfflineTaskCacheManager.java[OfflineTaskCacheManager" matchStrategy="1" name="OfflineTaskManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149285241135" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.RepositoryReport' to 'RepositoryTaskData' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryReport' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryReport'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryReport.java[RepositoryReport" matchStrategy="1" name="RepositoryTaskData" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149288671488" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.AbstractTaskAttributeFactory' to 'RepositoryTaskAttributeFactory' - Original element: 'org.eclipse.mylar.internal.tasklist.AbstractTaskAttributeFactory' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttributeFactory' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskAttributeFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{AbstractTaskAttributeFactory.java[AbstractTaskAttributeFactory" matchStrategy="1" name="RepositoryTaskAttributeFactory" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149289184776" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ReportAttachment' to 'TaskAttachment' - Original element: 'org.eclipse.mylar.internal.tasklist.ReportAttachment' - Renamed element: 'org.eclipse.mylar.internal.tasklist.TaskAttachment' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'ReportAttachment'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{ReportAttachment.java[ReportAttachment" matchStrategy="1" name="TaskAttachment" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149289259303" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.TaskAttachment' to 'RepositoryAttachment' - Original element: 'org.eclipse.mylar.internal.tasklist.TaskAttachment' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryAttachment' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TaskAttachment'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{TaskAttachment.java[TaskAttachment" matchStrategy="1" name="RepositoryAttachment" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149289294914" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.Operation' to 'RepositoryOperation' - Original element: 'org.eclipse.mylar.internal.tasklist.Operation' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryOperation' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'Operation'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{Operation.java[Operation" matchStrategy="1" name="RepositoryOperation" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149289316605" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData' to 'BugzillaTaskData' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData' - Renamed element: 'org.eclipse.mylar.internal.tasklist.BugzillaTaskData' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskData.java[RepositoryTaskData" matchStrategy="1" name="BugzillaTaskData" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149289726004" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryReport' to 'AbstractRepositoryTaskData' - Original element: 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryReport' - Renamed element: 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTaskData' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryReport'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryReport.java[AbstractRepositoryReport" matchStrategy="1" name="AbstractRepositoryTaskData" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149289744280" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'BUG_WHEN' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_BUG_WHEN' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.BUG_WHEN' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_BUG_WHEN' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'BUG_WHEN'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^BUG_WHEN" name="KEY_BUG_WHEN" references="true" setter="false" stamp="1149293153953" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'WHO' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_WHO' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.WHO' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_WHO' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'WHO'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^WHO" name="KEY_WHO" references="true" setter="false" stamp="1149293160833" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'THETEXT' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_THETEXT' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.THETEXT' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_THETEXT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'THETEXT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^THETEXT" name="KEY_THETEXT" references="true" setter="false" stamp="1149293167272" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'DATE' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_DATE' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.DATE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_DATE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'DATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^DATE" name="KEY_DATE" references="true" setter="false" stamp="1149293173531" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'DESC' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_DESC' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.DESC' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_DESC' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'DESC'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^DESC" name="KEY_DESC" references="true" setter="false" stamp="1149293180321" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ATTACHID' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_ATTACHID' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.ATTACHID' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_ATTACHID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTACHID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^ATTACHID" name="KEY_ATTACHID" references="true" setter="false" stamp="1149293185969" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'TYPE' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_TYPE' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.TYPE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_TYPE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'TYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^TYPE" name="KEY_TYPE" references="true" setter="false" stamp="1149293191948" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'CTYPE' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'KEY_CTYPE' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.CTYPE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_CTYPE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'CTYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^CTYPE" name="KEY_CTYPE" references="true" setter="false" stamp="1149293196124" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTaskData' to 'RepositoryTaskData' - Original element: 'org.eclipse.mylar.internal.tasklist.AbstractRepositoryTaskData' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{AbstractRepositoryTaskData.java[AbstractRepositoryTaskData" matchStrategy="1" name="RepositoryTaskData" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149298809485" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.tasklist.RepositoryTaskData.RepositoryTaskData(String repositoryURL, int id)' to 'public RepositoryTaskData(String repositoryURL, int id)'" delegate="false" deprecate="true" description="Change method 'RepositoryTaskData'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskData.java[RepositoryTaskData~RepositoryTaskData~I~QString;" name="RepositoryTaskData" parameter1="String repositoryURL 1 String repositoryURL false" parameter2="int id 0 int id false" stamp="1149299039536" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttributeFactory' to 'AbstractAttributeFactory' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttributeFactory' - Renamed element: 'org.eclipse.mylar.internal.tasklist.AbstractAttributeFactory' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryTaskAttributeFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttributeFactory.java[RepositoryTaskAttributeFactory" matchStrategy="1" name="AbstractAttributeFactory" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149300324143" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_BUG_WHEN' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'COMMENT_DATE' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_BUG_WHEN' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.COMMENT_DATE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_BUG_WHEN'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_BUG_WHEN" name="COMMENT_DATE" references="true" setter="false" stamp="1149301281660" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_WHO' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'USER_OWNER' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_WHO' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.USER_OWNER' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_WHO'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_WHO" name="USER_OWNER" references="true" setter="false" stamp="1149301291735" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_CC' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'USER_CC' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_CC' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.USER_CC' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_CC'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_CC" name="USER_CC" references="true" setter="false" stamp="1149301300627" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_THETEXT' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'COMMENT_TEXT' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_THETEXT' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.COMMENT_TEXT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_THETEXT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_THETEXT" name="COMMENT_TEXT" references="true" setter="false" stamp="1149301307027" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_DESC' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'DESCRIPTION' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_DESC' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.DESCRIPTION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_DESC'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_DESC" name="DESCRIPTION" references="true" setter="false" stamp="1149301316370" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_ATTACHID' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'ATTACHMENT_ID' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_ATTACHID' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.ATTACHMENT_ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_ATTACHID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_ATTACHID" name="ATTACHMENT_ID" references="true" setter="false" stamp="1149301325864" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_TYPE' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'ATTACHMENT_TYPE' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_TYPE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.ATTACHMENT_TYPE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_TYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_TYPE" name="ATTACHMENT_TYPE" references="true" setter="false" stamp="1149301336469" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_CTYPE' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'ATTACHMENT_CTYPE' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_CTYPE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.ATTACHMENT_CTYPE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_CTYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_CTYPE" name="ATTACHMENT_CTYPE" references="true" setter="false" stamp="1149301348737" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ASSIGNED_TO' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'USER_ASSIGNED' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.ASSIGNED_TO' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.USER_ASSIGNED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ASSIGNED_TO'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^ASSIGNED_TO" name="USER_ASSIGNED" references="true" setter="false" stamp="1149301381434" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_RESOLUTION' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'RESOLUTION' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_RESOLUTION' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.RESOLUTION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_RESOLUTION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_RESOLUTION" name="RESOLUTION" references="true" setter="false" stamp="1149301392389" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'KEY_STATUS' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'STATUS' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.KEY_STATUS' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.STATUS' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'KEY_STATUS'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^KEY_STATUS" name="STATUS" references="true" setter="false" stamp="1149301402724" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'DELTA_TS' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'DATE_MODIFIED' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.DELTA_TS' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.DATE_MODIFIED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'DELTA_TS'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^DELTA_TS" name="DATE_MODIFIED" references="true" setter="false" stamp="1149301409814" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPORTER' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'USER_REPORTER' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.REPORTER' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.USER_REPORTER' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'REPORTER'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^REPORTER" name="USER_REPORTER" references="true" setter="false" stamp="1149301420139" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'SHORT_DESC' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'SUMMARY' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.SHORT_DESC' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.SUMMARY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'SHORT_DESC'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^SHORT_DESC" name="SUMMARY" references="true" setter="false" stamp="1149301431566" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'CREATION_TS' in 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute' to 'DATE_CREATION' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.CREATION_TS' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskAttribute.DATE_CREATION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'CREATION_TS'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskAttribute.java[RepositoryTaskAttribute^CREATION_TS" name="DATE_CREATION" references="true" setter="false" stamp="1149301447649" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/22/refactorings.index
new file mode 100644
index 0000000..f04741a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/22/refactorings.index
@@ -0,0 +1,45 @@
+1149199688400 Extract local variable 'tasksCheduledOn'
+1149301447649 Rename field 'CREATION_TS'
+1149301431566 Rename field 'SHORT_DESC'
+1149301420139 Rename field 'REPORTER'
+1149301409814 Rename field 'DELTA_TS'
+1149301402724 Rename field 'KEY_STATUS'
+1149301392389 Rename field 'KEY_RESOLUTION'
+1149301381434 Rename field 'ASSIGNED_TO'
+1149301348737 Rename field 'KEY_CTYPE'
+1149301336469 Rename field 'KEY_TYPE'
+1149301325864 Rename field 'KEY_ATTACHID'
+1149301316370 Rename field 'KEY_DESC'
+1149301307027 Rename field 'KEY_THETEXT'
+1149301300627 Rename field 'KEY_CC'
+1149301291735 Rename field 'KEY_WHO'
+1149301281660 Rename field 'KEY_BUG_WHEN'
+1149300324143 Rename type 'RepositoryTaskAttributeFactory'
+1149299039536 Change method 'RepositoryTaskData'
+1149298809485 Rename type 'AbstractRepositoryTaskData'
+1149293196124 Rename field 'CTYPE'
+1149293191948 Rename field 'TYPE'
+1149293185969 Rename field 'ATTACHID'
+1149293180321 Rename field 'DESC'
+1149293173531 Rename field 'DATE'
+1149293167272 Rename field 'THETEXT'
+1149293160833 Rename field 'WHO'
+1149293153953 Rename field 'BUG_WHEN'
+1149289744280 Rename type 'AbstractRepositoryReport'
+1149289726004 Rename type 'RepositoryTaskData'
+1149289316605 Rename type 'Operation'
+1149289294914 Rename type 'TaskAttachment'
+1149289259303 Rename type 'ReportAttachment'
+1149289184776 Rename type 'AbstractTaskAttributeFactory'
+1149288671488 Rename type 'RepositoryReport'
+1149285241135 Rename type 'OfflineTaskCacheManager'
+1149285094074 Rename type 'BugzillaReportAttribute'
+1149285040406 Rename type 'OfflineTaskManager'
+1149285023843 Rename type 'OfflineReportsFile'
+1149284873737 Rename type 'AbstractRepositoryReportAttribute'
+1149284845656 Rename type 'AbstractAttributeFactory'
+1149203748969 Rename field 'taskListSynchronizationManager'
+1149203456629 Extract constant 'LABEL_TASK'
+1149203346450 Rename type 'SynchronizeRepositoryAction'
+1149203007753 Rename type 'SynchronizeSelectedAction'
+1149202702214 Rename type 'SynchronizeReportsAction'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/23/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/23/refactorings.history
new file mode 100644
index 0000000..1fcbe13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/23/refactorings.history
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.AttributeContainer.ERROR_NO_ATTRIBUTE_FACTORY' from expression '"Attribute factory not available."' - Constant name: 'ERROR_NO_ATTRIBUTE_FACTORY' - Constant expression: '"Attribute factory not available."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ERROR_NO_ATTRIBUTE_FACTORY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist{AttributeContainer.java" name="ERROR_NO_ATTRIBUTE_FACTORY" qualify="false" replace="true" selection="4426 34" stamp="1149533940784" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.BugzillaRemoteContextDelegate' to 'RemoteContextDelegate' - Original element: 'org.eclipse.mylar.internal.tasklist.BugzillaRemoteContextDelegate' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RemoteContextDelegate' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'BugzillaRemoteContextDelegate'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist{BugzillaRemoteContextDelegate.java[BugzillaRemoteContextDelegate" matchStrategy="1" name="RemoteContextDelegate" qualified="false" references="true" similarDeclarations="false" stamp="1149560377378" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.removeReport(...)' to 'removeOffflineTaskData' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.removeReport(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.removeOffflineTaskData(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'removeReport'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~removeReport~QRepositoryTaskData;" name="removeOffflineTaskData" references="true" stamp="1149560496690" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.removeOffflineTaskData(...)' to 'removeOfflineTaskData' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.removeOffflineTaskData(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.removeOfflineTaskData(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'removeOffflineTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~removeOffflineTaskData~QRepositoryTaskData;" name="removeOfflineTaskData" references="true" stamp="1149560508206" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getAvailableContexts(...)' to 'getContextAttachments' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getAvailableContexts(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getContextAttachments(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getAvailableContexts'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getAvailableContexts~QTaskRepository;~QAbstractRepositoryTask;" name="getContextAttachments" references="true" stamp="1149614304343" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.views.DatePickerPanel.createMonthCombo(...)' to 'createMonthList' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.DatePickerPanel.createMonthCombo(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.DatePickerPanel.createMonthList(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createMonthCombo'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{DatePickerPanel.java[DatePickerPanel~createMonthCombo~QComposite;" name="createMonthList" references="true" stamp="1149627639937" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.migrateTaskHandles(...)' to 'migrateRepositoryUrl' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.migrateTaskHandles(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.migrateRepositoryUrl(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'migrateTaskHandles'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~migrateTaskHandles~QObject;~QString;" name="migrateRepositoryUrl" references="true" stamp="1149732104943" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskListManager.migrateRepositoryUrl(...)' to 'refactorRepositoryUrl' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.migrateRepositoryUrl(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskListManager.refactorRepositoryUrl(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'migrateRepositoryUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskListManager.java[TaskListManager~migrateRepositoryUrl~QObject;~QString;" name="refactorRepositoryUrl" references="true" stamp="1149732360190" version="1.0"/>
+<refactoring comment="Rename field 'bugzillaOutlineModel' in 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor' to 'taskOutlineModel' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.bugzillaOutlineModel' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.taskOutlineModel' - Update references to refactored element - Update textual occurrences in comments and strings - Rename getter method for field - Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'bugzillaOutlineModel'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^bugzillaOutlineModel" name="taskOutlineModel" references="true" setter="true" stamp="1149741370456" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.createBugzillaReportOption(...)' to 'createOpenWith' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.createBugzillaReportOption(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.preferences.MylarRepositoriesPreferencePage.createOpenWith(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createBugzillaReportOption'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.preferences{MylarRepositoriesPreferencePage.java[MylarRepositoriesPreferencePage~createBugzillaReportOption~QComposite;" name="createOpenWith" references="true" stamp="1149741647524" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.ITaskActivityListener.tasklistRead()' to 'taskListRead' - Original element: 'org.eclipse.mylar.provisional.tasklist.ITaskActivityListener.tasklistRead()' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.ITaskActivityListener.taskListRead()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'tasklistRead'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{ITaskActivityListener.java[ITaskActivityListener~tasklistRead" name="taskListRead" references="true" stamp="1149742647652" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.tasklist.planner.ui.ReminderCellEditor.REMINDER_DIALOG_TITLE' to 'org.eclipse.mylar.internal.tasklist.ui.views.DatePicker' - Original element: 'org.eclipse.mylar.internal.tasklist.planner.ui.ReminderCellEditor.REMINDER_DIALOG_TITLE' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.views.DatePicker'" delegate="false" deprecate="true" description="Move member 'REMINDER_DIALOG_TITLE'" element1="/src<org.eclipse.mylar.internal.tasklist.planner.ui{ReminderCellEditor.java[ReminderCellEditor^REMINDER_DIALOG_TITLE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{DatePicker.java[DatePicker" stamp="1149824494921" version="1.0"/>
+<refactoring comment="Rename field 'REMINDER_DIALOG_TITLE' in 'org.eclipse.mylar.internal.tasklist.ui.views.DatePicker' to 'TITLE_DIALOG' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.DatePicker.REMINDER_DIALOG_TITLE' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.DatePicker.TITLE_DIALOG' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'REMINDER_DIALOG_TITLE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{DatePicker.java[DatePicker^REMINDER_DIALOG_TITLE" name="TITLE_DIALOG" references="true" setter="false" stamp="1149824526106" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.views.FilteredTreeListener' to 'IFilteredTreeListener' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.views.FilteredTreeListener' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.views.IFilteredTreeListener' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'FilteredTreeListener'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{FilteredTreeListener.java[FilteredTreeListener" matchStrategy="1" name="IFilteredTreeListener" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149868377997" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.MESSAGE_ATTACHMENTS_NOT_SUPPORTED' from expression '"Attachments not supported by connector: "' - Constant name: 'MESSAGE_ATTACHMENTS_NOT_SUPPORTED' - Constant expression: '"Attachments not supported by connector: "' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MESSAGE_ATTACHMENTS_NOT_SUPPORTED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java" name="MESSAGE_ATTACHMENTS_NOT_SUPPORTED" qualify="false" replace="true" selection="7480 42" stamp="1149896906164" version="1.0" visibility="2"/>
+<refactoring comment="Change method 'public void org.eclipse.mylar.provisional.tasklist.IAttachmentHandler.uploadAttachment(TaskRepository repository, AbstractRepositoryTask task, String comment, String description, File file, String contentType, boolean isPatch) throws CoreException' to 'public void uploadAttachment(TaskRepository repository, AbstractRepositoryTask task, String comment, String description, File file, String contentType, boolean isPatch, Proxy proxySettings) throws CoreException' - Added parameters: Proxy proxySettings" default8="null" delegate="false" deprecate="true" description="Change method 'uploadAttachment'" element1="/C:\/Apps\/eclipse-3.2\/plugins\/org.eclipse.equinox.common_3.2.0.v20060601a.jar<org.eclipse.core.runtime(CoreException.class[CoreException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.provisional.tasklist{IAttachmentHandler.java[IAttachmentHandler~uploadAttachment~QTaskRepository;~QAbstractRepositoryTask;~QString;~QString;~QFile;~QString;~Z" kind1="0" name="uploadAttachment" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="AbstractRepositoryTask task 1 AbstractRepositoryTask task false" parameter3="String comment 2 String comment false" parameter4="String description 3 String description false" parameter5="File file 4 File file false" parameter6="String contentType 5 String contentType false" parameter7="boolean isPatch 6 boolean isPatch false" parameter8="Object newParam -1 Proxy proxySettings false" stamp="1149899703346" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.updateTaskDetails(...)' to 'updateTaskState' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.updateTaskDetails(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.updateTaskState(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'updateTaskDetails'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~updateTaskDetails~QAbstractRepositoryTask;" name="updateTaskState" references="true" stamp="1149904195936" version="1.0"/>
+<refactoring comment="Extract method 'private TaskRepository createTaskRepository()' from 'org.eclipse.mylar.internal.tasklist.ui.wizards.AddRepositoryWizard.performFinish()' to 'org.eclipse.mylar.internal.tasklist.ui.wizards.AddRepositoryWizard' - Method name: 'createTaskRepository' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.wizards.AddRepositoryWizard' - Declared visibility: 'private'" comments="false" description="Extract method 'createTaskRepository'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{AddRepositoryWizard.java" name="createTaskRepository" replace="false" selection="1145 449" stamp="1149983848698" version="1.0" visibility="2"/>
+<refactoring comment="Move method 'org.eclipse.mylar.internal.tasklist.ui.wizards.AddRepositoryWizard.createTaskRepository()' to 'org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositoryClientWizard.abstractRepositorySettingsPage' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.AddRepositoryWizard.createTaskRepository()' - Moved method: N/A - Target element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractRepositoryClientWizard.abstractRepositorySettingsPage' - Method name: 'createTaskRepository' - Parameter name: 'wizard'" deprecate="true" description="Move method 'createTaskRepository'" flags="786438" getter="true" id="org.eclipse.jdt.ui.move.method" inline="true" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{AddRepositoryWizard.java[AddRepositoryWizard~createTaskRepository" name="createTaskRepository" remove="true" setter="true" stamp="1149983900763" targetIndex="1" targetName="wizard" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/23/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/23/refactorings.index
new file mode 100644
index 0000000..d032584
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/23/refactorings.index
@@ -0,0 +1,19 @@
+1149533940784 Extract constant 'ERROR_NO_ATTRIBUTE_FACTORY'
+1149983900763 Move method 'createTaskRepository'
+1149983848698 Extract method 'createTaskRepository'
+1149904195936 Rename method 'updateTaskDetails'
+1149899703346 Change method 'uploadAttachment'
+1149896906164 Extract constant 'MESSAGE_ATTACHMENTS_NOT_SUPPORTED'
+1149868377997 Rename type 'FilteredTreeListener'
+1149824526106 Rename field 'REMINDER_DIALOG_TITLE'
+1149824494921 Move member 'REMINDER_DIALOG_TITLE'
+1149742647652 Rename method 'tasklistRead'
+1149741647524 Rename method 'createBugzillaReportOption'
+1149741370456 Rename field 'bugzillaOutlineModel'
+1149732360190 Rename method 'migrateRepositoryUrl'
+1149732104943 Rename method 'migrateTaskHandles'
+1149627639937 Rename method 'createMonthCombo'
+1149614304343 Rename method 'getAvailableContexts'
+1149560508206 Rename method 'removeOffflineTaskData'
+1149560496690 Rename method 'removeReport'
+1149560377378 Rename type 'BugzillaRemoteContextDelegate'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..5dc1879
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getAbsolutePath()' to 'getAbsoluteAttachmentPath' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getAbsolutePath()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getAbsoluteAttachmentPath()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getAbsolutePath'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage~getAbsolutePath" name="getAbsoluteAttachmentPath" references="true" stamp="1150410816814" version="1.0"/>
+<refactoring comment="Rename local variable 'patchFile' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements()' to 'attachmentFile' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements().patchFile' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements().attachmentFile' - Update references to refactored element" description="Rename local variable 'patchFile'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java" name="attachmentFile" references="true" selection="12857 9" stamp="1150409798986" version="1.0"/>
+<refactoring comment="Rename local variable 'haveAttachment' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements()' to 'attachmentFound' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements().haveAttachment' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements().attachmentFound' - Update references to refactored element" description="Rename local variable 'haveAttachment'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java" name="attachmentFound" references="true" selection="11536 14" stamp="1150409295463" version="1.0"/>
+<refactoring comment="Rename local variable 'gotPatch' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements()' to 'haveAttachment' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements().gotPatch' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.updateWidgetEnablements().haveAttachment' - Update references to refactored element" description="Rename local variable 'gotPatch'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java" name="haveAttachment" references="true" selection="11536 8" stamp="1150392885810" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.setEnableWorkspacePatch(...)' to 'setEnableWorkspaceAttachment' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.setEnableWorkspacePatch(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.setEnableWorkspaceAttachment(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setEnableWorkspacePatch'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage~setEnableWorkspacePatch~Z" name="setEnableWorkspaceAttachment" references="true" stamp="1150392802710" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.setEnablePatchFile(...)' to 'setEnableAttachmentFile' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.setEnablePatchFile(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.setEnableAttachmentFile(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setEnablePatchFile'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage~setEnablePatchFile~Z" name="setEnableAttachmentFile" references="true" stamp="1150392767806" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.buildPatchFileGroup(...)' to 'buildAttachmentFileGroup' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.buildPatchFileGroup(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.buildAttachmentFileGroup(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'buildPatchFileGroup'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage~buildPatchFileGroup~QComposite;" name="buildAttachmentFileGroup" references="true" stamp="1150392752636" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getPatchFilePath()' to 'getAttachmentFilePath' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getPatchFilePath()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getAttachmentFilePath()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getPatchFilePath'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage~getPatchFilePath" name="getAttachmentFilePath" references="true" stamp="1150392729605" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getPatchName()' to 'getAttachmentName' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getPatchName()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.getAttachmentName()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getPatchName'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage~getPatchName" name="getAttachmentName" references="true" stamp="1150392702217" version="1.0"/>
+<refactoring comment="Rename field 'usePatchFileButton' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'useFileButton' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.usePatchFileButton' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.useFileButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'usePatchFileButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^usePatchFileButton" name="useFileButton" references="true" setter="false" stamp="1150392630692" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'patchFileBrowseButton' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'fileBrowseButton' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.patchFileBrowseButton' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fileBrowseButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'patchFileBrowseButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^patchFileBrowseButton" name="fileBrowseButton" references="true" setter="false" stamp="1150392612448" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'patchFileNameField' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'fileNameField' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.patchFileNameField' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fileNameField' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'patchFileNameField'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^patchFileNameField" name="fileNameField" references="true" setter="false" stamp="1150392602777" textual="false" version="1.0"/>
+<refactoring comment="Inline constant 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.INPUTATTACHMENTPAGE_NAME' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.INPUTATTACHMENTPAGE_NAME' - Remove constant declaration - Replace all references to constant with expression" description="Inline constant 'INPUTATTACHMENTPAGE_NAME'" flags="786438" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java" remove="true" replace="true" selection="3281 24" stamp="1150392579916" version="1.0"/>
+<refactoring comment="Rename field 'INPUTPATCHPAGE_NAME' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'INPUTATTACHMENTPAGE_NAME' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.INPUTPATCHPAGE_NAME' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.INPUTATTACHMENTPAGE_NAME' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'INPUTPATCHPAGE_NAME'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^INPUTPATCHPAGE_NAME" name="INPUTATTACHMENTPAGE_NAME" references="true" setter="false" stamp="1150392568507" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fTreeViewer' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'treeViewer' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fTreeViewer' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.treeViewer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fTreeViewer'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fTreeViewer" name="treeViewer" references="true" setter="false" stamp="1150328064397" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fWorkspaceSelectLabel' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'workspaceSelectLabel' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fWorkspaceSelectLabel' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.workspaceSelectLabel' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fWorkspaceSelectLabel'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fWorkspaceSelectLabel" name="workspaceSelectLabel" references="true" setter="false" stamp="1150328058625" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fUseWorkspaceButton' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'useWorkspaceButton' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fUseWorkspaceButton' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.useWorkspaceButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fUseWorkspaceButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fUseWorkspaceButton" name="useWorkspaceButton" references="true" setter="false" stamp="1150328052554" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fUsePatchFileButton' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'usePatchFileButton' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fUsePatchFileButton' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.usePatchFileButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fUsePatchFileButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fUsePatchFileButton" name="usePatchFileButton" references="true" setter="false" stamp="1150328046295" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fPatchFileNameField' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'patchFileNameField' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fPatchFileNameField' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.patchFileNameField' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fPatchFileNameField'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fPatchFileNameField" name="patchFileNameField" references="true" setter="false" stamp="1150328022845" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fPatchFileBrowseButton' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'patchFileBrowseButton' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fPatchFileBrowseButton' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.patchFileBrowseButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fPatchFileBrowseButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fPatchFileBrowseButton" name="patchFileBrowseButton" references="true" setter="false" stamp="1150328014470" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fUseClipboardButton' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'useClipboardButton' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fUseClipboardButton' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.useClipboardButton' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fUseClipboardButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fUseClipboardButton" name="useClipboardButton" references="true" setter="false" stamp="1150328000236" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fActivationListener' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'activationListener' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fActivationListener' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.activationListener' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fActivationListener'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fActivationListener" name="activationListener" references="true" setter="false" stamp="1150327992361" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fShowError' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'showError' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fShowError' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.showError' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fShowError'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fShowError" name="showError" references="true" setter="false" stamp="1150327977356" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.UNSUBMITTED_ATTACHMENT_LABEL' from expression '"<Not submitted>"' - Constant name: 'UNSUBMITTED_ATTACHMENT_LABEL' - Constant expression: '"<Not submitted>"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'UNSUBMITTED_ATTACHMENT_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="UNSUBMITTED_ATTACHMENT_LABEL" qualify="false" replace="true" selection="31111 17" stamp="1150319577734" version="1.0" visibility="2"/>
+<refactoring comment="Rename local variable 'addAttachmentInfo' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentPage.createControl(...)' to 'composite' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentPage.createControl(Composite).addAttachmentInfo' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentPage.createControl(Composite).composite' - Update references to refactored element" description="Rename local variable 'addAttachmentInfo'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{NewAttachmentPage.java" name="composite" references="true" selection="3419 17" stamp="1150316639217" version="1.0"/>
+<refactoring comment="Rename field 'fPatchWizard' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage' to 'wizard' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.fPatchWizard' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.InputAttachmentSourcePage.wizard' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fPatchWizard'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{InputAttachmentSourcePage.java[InputAttachmentSourcePage^fPatchWizard" name="wizard" references="true" setter="false" stamp="1150173955739" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'parent' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentPage.createControl(...)' to 'composite' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentPage.createControl(Composite).parent' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentPage.createControl(Composite).composite' - Update references to refactored element" description="Rename local variable 'parent'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{NewAttachmentPage.java" name="composite" references="true" selection="2869 6" stamp="1150147991402" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..fcbc5c5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1,27 @@
+1150410816814 Rename method 'getAbsolutePath'
+1150409798986 Rename local variable 'patchFile'
+1150409295463 Rename local variable 'haveAttachment'
+1150392885810 Rename local variable 'gotPatch'
+1150392802710 Rename method 'setEnableWorkspacePatch'
+1150392767806 Rename method 'setEnablePatchFile'
+1150392752636 Rename method 'buildPatchFileGroup'
+1150392729605 Rename method 'getPatchFilePath'
+1150392702217 Rename method 'getPatchName'
+1150392630692 Rename field 'usePatchFileButton'
+1150392612448 Rename field 'patchFileBrowseButton'
+1150392602777 Rename field 'patchFileNameField'
+1150392579916 Inline constant 'INPUTATTACHMENTPAGE_NAME'
+1150392568507 Rename field 'INPUTPATCHPAGE_NAME'
+1150328064397 Rename field 'fTreeViewer'
+1150328058625 Rename field 'fWorkspaceSelectLabel'
+1150328052554 Rename field 'fUseWorkspaceButton'
+1150328046295 Rename field 'fUsePatchFileButton'
+1150328022845 Rename field 'fPatchFileNameField'
+1150328014470 Rename field 'fPatchFileBrowseButton'
+1150328000236 Rename field 'fUseClipboardButton'
+1150327992361 Rename field 'fActivationListener'
+1150327977356 Rename field 'fShowError'
+1150319577734 Extract constant 'UNSUBMITTED_ATTACHMENT_LABEL'
+1150316639217 Rename local variable 'addAttachmentInfo'
+1150173955739 Rename field 'fPatchWizard'
+1150147991402 Rename local variable 'parent'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..992ee66
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.TaskRepository.setSyncTime(...)' to 'setSyncTimeStamp' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepository.setSyncTime(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TaskRepository.setSyncTimeStamp(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setSyncTime'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{TaskRepository.java[TaskRepository~setSyncTime~QString;" name="setSyncTimeStamp" references="true" stamp="1150741936718" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.preferences.PlanningPreferencePage.GROUP_WORK_WEEK_LABEL' from expression '"Work Week"' - Constant name: 'GROUP_WORK_WEEK_LABEL' - Constant expression: '"Work Week"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'GROUP_WORK_WEEK_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.preferences{PlanningPreferencePage.java" name="GROUP_WORK_WEEK_LABEL" qualify="false" replace="true" selection="3401 11" stamp="1150846120093" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.preferences.PlanningPreferencePage.START_DAY_LABEL' from expression '"Start day: "' - Constant name: 'START_DAY_LABEL' - Constant expression: '"Start day: "' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'START_DAY_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.preferences{PlanningPreferencePage.java" name="START_DAY_LABEL" qualify="false" replace="true" selection="3692 13" stamp="1150846138015" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.preferences.PlanningPreferencePage.START_HOUR_LABEL' from expression '"Work day start (24hr): "' - Constant name: 'START_HOUR_LABEL' - Constant expression: '"Work day start (24hr): "' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'START_HOUR_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.preferences{PlanningPreferencePage.java" name="START_HOUR_LABEL" qualify="false" replace="true" selection="4276 25" stamp="1150846166046" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.preferences.PlanningPreferencePage.END_HOUR_LABEL' from expression '"Work day end (24hr): "' - Constant name: 'END_HOUR_LABEL' - Constant expression: '"Work day end (24hr): "' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'END_HOUR_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.preferences{PlanningPreferencePage.java" name="END_HOUR_LABEL" qualify="false" replace="true" selection="4740 23" stamp="1150846179640" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.util.MylarContextExternalizer' to 'TaskRepositoryExternalizer' - Original element: 'org.eclipse.mylar.internal.tasklist.util.MylarContextExternalizer' - Renamed element: 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoryExternalizer' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'MylarContextExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.util{MylarContextExternalizer.java[MylarContextExternalizer" matchStrategy="1" name="TaskRepositoryExternalizer" patterns="*.xml" qualified="false" references="true" similarDeclarations="false" stamp="1151001247732" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.util.SaxContextContentHandler' to 'SaxRepositoriesContentHandler' - Original element: 'org.eclipse.mylar.internal.tasklist.util.SaxContextContentHandler' - Renamed element: 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesContentHandler' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'SaxContextContentHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxContextContentHandler.java[SaxContextContentHandler" matchStrategy="1" name="SaxRepositoriesContentHandler" patterns="*.xml" qualified="false" references="true" similarDeclarations="false" stamp="1151002084701" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.util.SaxContextWriter' to 'SaxRepositoriesWriter' - Original element: 'org.eclipse.mylar.internal.tasklist.util.SaxContextWriter' - Renamed element: 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesWriter' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'SaxContextWriter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxContextWriter.java[SaxContextWriter" matchStrategy="1" name="SaxRepositoriesWriter" patterns="*.xml" qualified="false" references="true" similarDeclarations="false" stamp="1151004662842" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesWriter.RepositoriesWriter.ATTR_VERSION' from expression '"version"' - Constant name: 'ATTR_VERSION' - Constant expression: '"version"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTR_VERSION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxRepositoriesWriter.java" name="ATTR_VERSION" qualify="false" replace="true" selection="4591 9" stamp="1151006208873" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesWriter.RepositoriesWriter.ELEMENT_TASK_REPOSITORY' from expression '"TaskRepository"' - Constant name: 'ELEMENT_TASK_REPOSITORY' - Constant expression: '"TaskRepository"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ELEMENT_TASK_REPOSITORY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxRepositoriesWriter.java" name="ELEMENT_TASK_REPOSITORY" qualify="false" replace="true" selection="6769 16" stamp="1151006621014" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesWriter.RepositoriesWriter.ELEMENT_TASK_REPOSITORIES' from expression '"TaskRepositories"' - Constant name: 'ELEMENT_TASK_REPOSITORIES' - Constant expression: '"TaskRepositories"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ELEMENT_TASK_REPOSITORIES'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxRepositoriesWriter.java" name="ELEMENT_TASK_REPOSITORIES" qualify="false" replace="true" selection="7030 18" stamp="1151006665607" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.provisional.tasklist.TaskRepository.DEFAULT_TIMESTAMP' from expression '"never"' - Constant name: 'DEFAULT_TIMESTAMP' - Constant expression: '"never"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'DEFAULT_TIMESTAMP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.provisional.tasklist{TaskRepository.java" name="DEFAULT_TIMESTAMP" qualify="false" replace="true" selection="6897 7" stamp="1151008132717" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesWriter.RepositoriesWriter.ATTRIBUTE_KIND' from expression '"Kind"' - Constant name: 'ATTRIBUTE_KIND' - Constant expression: '"Kind"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTRIBUTE_KIND'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxRepositoriesWriter.java" name="ATTRIBUTE_KIND" qualify="false" replace="true" selection="5138 6" stamp="1151008850732" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.util.SaxRepositoriesWriter.RepositoriesWriter.ATTRIBUTE_URL' from expression '"Url"' - Constant name: 'ATTRIBUTE_URL' - Constant expression: '"Url"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTRIBUTE_URL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.util{SaxRepositoriesWriter.java" name="ATTRIBUTE_URL" qualify="false" replace="true" selection="5337 5" stamp="1151008862482" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'ATTR_VERSION' in 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoryExternalizer' to 'ATTRIBUTE_VERSION' - Original element: 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoryExternalizer.ATTR_VERSION' - Renamed element: 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoryExternalizer.ATTRIBUTE_VERSION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ATTR_VERSION'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.util{TaskRepositoryExternalizer.java[TaskRepositoryExternalizer^ATTR_VERSION" name="ATTRIBUTE_VERSION" references="true" setter="false" stamp="1151009133654" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoryExternalizer' to 'TaskRepositoriesExternalizer' - Original element: 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoryExternalizer' - Renamed element: 'org.eclipse.mylar.internal.tasklist.util.TaskRepositoriesExternalizer' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TaskRepositoryExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.util{TaskRepositoryExternalizer.java[TaskRepositoryExternalizer" matchStrategy="1" name="TaskRepositoriesExternalizer" patterns="*.xml" qualified="false" references="true" similarDeclarations="false" stamp="1151013178373" textual="true" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.REPOSITORIES_FILENAME' from expression '"repositories"' - Constant name: 'REPOSITORIES_FILENAME' - Constant expression: '"repositories"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'REPOSITORIES_FILENAME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="REPOSITORIES_FILENAME" qualify="false" replace="true" selection="12507 14" stamp="1151021816982" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.REPOSITORIES_EXTENSION' from expression '".xml"' - Constant name: 'REPOSITORIES_EXTENSION' - Constant expression: '".xml"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'REPOSITORIES_EXTENSION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java" name="REPOSITORIES_EXTENSION" qualify="false" replace="true" selection="12610 6" stamp="1151021835186" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData.setHasChanged(...)' to 'setHasLocalChanges' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData.setHasChanged(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData.setHasLocalChanges(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setHasChanged'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskData.java[RepositoryTaskData~setHasChanged~Z" name="setHasLocalChanges" references="true" stamp="1151095326201" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData.hasChanges()' to 'hasLocalChanges' - Original element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData.hasChanges()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.RepositoryTaskData.hasLocalChanges()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'hasChanges'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist{RepositoryTaskData.java[RepositoryTaskData~hasChanges" name="hasLocalChanges" references="true" stamp="1151095352342" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..08a611e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,20 @@
+1150741936718 Rename method 'setSyncTime'
+1151095352342 Rename method 'hasChanges'
+1151095326201 Rename method 'setHasChanged'
+1151021835186 Extract constant 'REPOSITORIES_EXTENSION'
+1151021816982 Extract constant 'REPOSITORIES_FILENAME'
+1151013178373 Rename type 'TaskRepositoryExternalizer'
+1151009133654 Rename field 'ATTR_VERSION'
+1151008862482 Extract constant 'ATTRIBUTE_URL'
+1151008850732 Extract constant 'ATTRIBUTE_KIND'
+1151008132717 Extract constant 'DEFAULT_TIMESTAMP'
+1151006665607 Extract constant 'ELEMENT_TASK_REPOSITORIES'
+1151006621014 Extract constant 'ELEMENT_TASK_REPOSITORY'
+1151006208873 Extract constant 'ATTR_VERSION'
+1151004662842 Rename type 'SaxContextWriter'
+1151002084701 Rename type 'SaxContextContentHandler'
+1151001247732 Rename type 'MylarContextExternalizer'
+1150846179640 Extract constant 'END_HOUR_LABEL'
+1150846166046 Extract constant 'START_HOUR_LABEL'
+1150846138015 Extract constant 'START_DAY_LABEL'
+1150846120093 Extract constant 'GROUP_WORK_WEEK_LABEL'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/26/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/26/refactorings.history
new file mode 100644
index 0000000..2627710
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/26/refactorings.history
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.actions.SaveRepositoryAttachmentAction' to 'SaveRemoteFileAction' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.actions.SaveRepositoryAttachmentAction' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.actions.SaveRemoteFileAction' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'SaveRepositoryAttachmentAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{SaveRepositoryAttachmentAction.java[SaveRepositoryAttachmentAction" matchStrategy="1" name="SaveRemoteFileAction" qualified="false" references="true" similarDeclarations="false" stamp="1151266649774" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.getAttachmentContents(...)' to 'getAttachmentInputStream' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.getAttachmentContents(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.getAttachmentInputStream(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getAttachmentContents'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~getAttachmentContents~QString;" name="getAttachmentInputStream" references="true" stamp="1151252466943" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.ATTACHMENT_URL_SUFFIX' from expression '"/attachment.cgi?id="' - Constant name: 'ATTACHMENT_URL_SUFFIX' - Constant expression: '"/attachment.cgi?id="' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTACHMENT_URL_SUFFIX'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="ATTACHMENT_URL_SUFFIX" qualify="false" replace="true" selection="30337 21" stamp="1151252376195" version="1.0" visibility="2"/>
+<refactoring comment="Rename local variable 'c' in 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyToClipboardAction.run()' to 'control' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyToClipboardAction.run().c' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyToClipboardAction.run().control' - Update references to refactored element" description="Rename local variable 'c'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{CopyToClipboardAction.java" name="control" references="true" selection="916 1" stamp="1151197662345" version="1.0"/>
+<refactoring comment="Extract method 'public void openUrl(String urlString)' from 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction.run()' to 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction' - Method name: 'openUrl' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction' - Declared visibility: 'public'" comments="false" description="Extract method 'openUrl'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{OpenWithBrowserAction.java" name="openUrl" replace="false" selection="2193 30" stamp="1151196568462" version="1.0" visibility="1"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.util.TaskListSaveManager.saveTaskListAndContexts()' to 'saveTaskList' - Original element: 'org.eclipse.mylar.internal.tasklist.util.TaskListSaveManager.saveTaskListAndContexts()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.util.TaskListSaveManager.saveTaskList()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'saveTaskListAndContexts'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.util{TaskListSaveManager.java[TaskListSaveManager~saveTaskListAndContexts" name="saveTaskList" references="true" stamp="1151302583546" version="1.0"/>
+<refactoring comment="Rename field 'PATCH_WIZARD_SETTINGS_SECTION' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizard.AttachmentWizardDialog' to 'ATTACHMENT_WIZARD_SETTINGS_SECTION' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizard.AttachmentWizardDialog.PATCH_WIZARD_SETTINGS_SECTION' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizard.AttachmentWizardDialog.ATTACHMENT_WIZARD_SETTINGS_SECTION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'PATCH_WIZARD_SETTINGS_SECTION'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{NewAttachmentWizard.java[NewAttachmentWizard[AttachmentWizardDialog^PATCH_WIZARD_SETTINGS_SECTION" name="ATTACHMENT_WIZARD_SETTINGS_SECTION" references="true" setter="false" stamp="1151349338500" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fHasNewDialogSettings' in 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizard' to 'hasNewDialogSettings' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizard.fHasNewDialogSettings' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizard.hasNewDialogSettings' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'fHasNewDialogSettings'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{NewAttachmentWizard.java[NewAttachmentWizard^fHasNewDialogSettings" name="hasNewDialogSettings" references="true" setter="false" stamp="1151350192015" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.AttachmentWizardDialog' to 'NewAttachmentWizardDialog' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.AttachmentWizardDialog' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.NewAttachmentWizardDialog' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'AttachmentWizardDialog'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{AttachmentWizardDialog.java[AttachmentWizardDialog" matchStrategy="1" name="NewAttachmentWizardDialog" qualified="false" references="true" similarDeclarations="false" stamp="1151351708476" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void makeActions()' from 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.AbstractRepositoryTaskEditor()' to 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor' - Method name: 'makeActions' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'makeActions'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="makeActions" replace="false" selection="12531 1945" stamp="1151434943640" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.makeActions()' to 'makeContextMenuActions' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.makeActions()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.makeContextMenuActions()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'makeActions'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~makeActions" name="makeContextMenuActions" references="true" stamp="1151434962000" version="1.0"/>
+<refactoring comment="Extract method 'public void createContextMenu(IMenuManager manager,ITaskListElement element,List<ITaskListElement> selectedElements)' from 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView.fillContextMenu()' to 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView' - Method name: 'createContextMenu' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.views.TaskListView' - Declared visibility: 'public'" comments="false" description="Extract method 'createContextMenu'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListView.java" name="createContextMenu" replace="false" selection="37500 2119" stamp="1151436839125" version="1.0" visibility="1"/>
+<refactoring comment="Extract method 'private void runWithSelection(Object selectedObject)' from 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction.run()' to 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction' - Method name: 'runWithSelection' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction' - Declared visibility: 'private'" comments="false" description="Extract method 'runWithSelection'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{OpenWithBrowserAction.java" name="runWithSelection" replace="false" selection="1812 643" stamp="1151438016000" version="1.0" visibility="2"/>
+<refactoring comment="Change method 'public MenuManager org.eclipse.mylar.internal.tasklist.ui.IDynamicSubMenuContributor.getSubMenuManager(TaskListView view, List<ITaskListElement> selectedElements)' to 'public MenuManager getSubMenuManager(List<ITaskListElement> selectedElements)' - Removed parameters: TaskListView view" delegate="false" deprecate="true" description="Change method 'getSubMenuManager'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasklist.ui{IDynamicSubMenuContributor.java[IDynamicSubMenuContributor~getSubMenuManager~QTaskListView;~QList\<QITaskListElement;>;" name="getSubMenuManager" parameter1="TaskListView view 0 TaskListView view true" parameter2="List<ITaskListElement> selectedElements 1 List<ITaskListElement> selectedElements false" stamp="1151440576296" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.actions.OpenWithBrowserAction.LABEL' from expression '"Open with Browser"' - Constant name: 'LABEL' - Constant expression: '"Open with Browser"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{OpenWithBrowserAction.java" name="LABEL" qualify="false" replace="true" selection="1387 19" stamp="1151441170375" version="1.0" visibility="2"/>
+
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.LABEL_OPEN_IN_BROWSER' from expression '"Open in Browser"' - Constant name: 'LABEL_OPEN_IN_BROWSER' - Constant expression: '"Open in Browser"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_OPEN_IN_BROWSER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="LABEL_OPEN_IN_BROWSER" qualify="false" replace="true" selection="28956 17" stamp="1151446344296" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.CTYPE_HTML' from expression '"html"' - Constant name: 'CTYPE_HTML' - Constant expression: '"html"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CTYPE_HTML'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="CTYPE_HTML" qualify="false" replace="true" selection="29895 6" stamp="1151446361062" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.ATTR_FILENAME' from expression '"filename"' - Constant name: 'ATTR_FILENAME' - Constant expression: '"filename"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTR_FILENAME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="ATTR_FILENAME" qualify="false" replace="true" selection="29796 10" stamp="1151446378312" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.CTYPE_TEXT' from expression '"text"' - Constant name: 'CTYPE_TEXT' - Constant expression: '"text"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CTYPE_TEXT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="CTYPE_TEXT" qualify="false" replace="true" selection="30101 6" stamp="1151446407609" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.CTYPE_OCTET_STREAM' from expression '"octet-stream"' - Constant name: 'CTYPE_OCTET_STREAM' - Constant expression: '"octet-stream"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CTYPE_OCTET_STREAM'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="CTYPE_OCTET_STREAM" qualify="false" replace="true" selection="30236 14" stamp="1151446421562" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.CTYPE_ZIP' from expression '"zip"' - Constant name: 'CTYPE_ZIP' - Constant expression: '"zip"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CTYPE_ZIP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="CTYPE_ZIP" qualify="false" replace="true" selection="30391 5" stamp="1151446432750" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.ATTACHMENT_DEFAULT_NAME' from expression '"attachment"' - Constant name: 'ATTACHMENT_DEFAULT_NAME' - Constant expression: '"attachment"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ATTACHMENT_DEFAULT_NAME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java" name="ATTACHMENT_DEFAULT_NAME" qualify="false" replace="true" selection="30215 12" stamp="1151446492718" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery.addAll(...)' to 'updateHits' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery.addAll(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryQuery.updateHits(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'addAll'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryQuery.java[AbstractRepositoryQuery~addAll~QList\<QAbstractQueryHit;>;" name="updateHits" references="true" stamp="1151525213203" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.ui.preferences.TaskListPreferencePage.createPlanningGroup(...)' to 'createSchedulingGroup' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.preferences.TaskListPreferencePage.createPlanningGroup(...)' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.preferences.TaskListPreferencePage.createSchedulingGroup(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createPlanningGroup'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.preferences{TaskListPreferencePage.java[TaskListPreferencePage~createPlanningGroup~QComposite;" name="createSchedulingGroup" references="true" stamp="1151543215609" version="1.0"/>
+<refactoring comment="Rename field 'REPOSITORY_TEXT_ID' in 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor' to 'TASK_EDITOR_FONT' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.REPOSITORY_TEXT_ID' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.TASK_EDITOR_FONT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'REPOSITORY_TEXT_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^REPOSITORY_TEXT_ID" name="TASK_EDITOR_FONT" references="true" setter="false" stamp="1151557539244" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.TASK_EDITOR_FONT' to 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.AbstractRepositoryTaskEditor.TASK_EDITOR_FONT' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.TaskListColorsAndFonts'" delegate="false" deprecate="true" description="Move member 'TASK_EDITOR_FONT'" element1="/src<org.eclipse.mylar.internal.tasklist.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^TASK_EDITOR_FONT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.tasklist.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts" stamp="1151557573080" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.RepositoryTaskOutlineNode.LABEL_NEW_COMMENT' from expression '"New Comment"' - Constant name: 'LABEL_NEW_COMMENT' - Constant expression: '"New Comment"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_NEW_COMMENT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{RepositoryTaskOutlineNode.java" name="LABEL_NEW_COMMENT" qualify="false" replace="true" selection="8713 13" stamp="1151603689312" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.RepositoryTaskOutlineNode.LABEL_COMMENTS' from expression '"Comments"' - Constant name: 'LABEL_COMMENTS' - Constant expression: '"Comments"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_COMMENTS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{RepositoryTaskOutlineNode.java" name="LABEL_COMMENTS" qualify="false" replace="true" selection="8386 10" stamp="1151603705234" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasklist.ui.editors.RepositoryTaskOutlineNode.LABEL_DESCRIPTION' from expression '"Description"' - Constant name: 'LABEL_DESCRIPTION' - Constant expression: '"Description"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_DESCRIPTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{RepositoryTaskOutlineNode.java" name="LABEL_DESCRIPTION" qualify="false" replace="true" selection="6990 13" stamp="1151604250140" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/26/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/26/refactorings.index
new file mode 100644
index 0000000..e496443
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/6/26/refactorings.index
@@ -0,0 +1,29 @@
+1151266649774 Rename type 'SaveRepositoryAttachmentAction'
+1151604250140 Extract constant 'LABEL_DESCRIPTION'
+1151603705234 Extract constant 'LABEL_COMMENTS'
+1151603689312 Extract constant 'LABEL_NEW_COMMENT'
+1151557573080 Move member 'TASK_EDITOR_FONT'
+1151557539244 Rename field 'REPOSITORY_TEXT_ID'
+1151543215609 Rename method 'createPlanningGroup'
+1151525213203 Rename method 'addAll'
+1151446492718 Extract constant 'ATTACHMENT_DEFAULT_NAME'
+1151446432750 Extract constant 'CTYPE_ZIP'
+1151446421562 Extract constant 'CTYPE_OCTET_STREAM'
+1151446407609 Extract constant 'CTYPE_TEXT'
+1151446378312 Extract constant 'ATTR_FILENAME'
+1151446361062 Extract constant 'CTYPE_HTML'
+1151446344296 Extract constant 'LABEL_OPEN_IN_BROWSER'
+1151441170375 Extract constant 'LABEL'
+1151440576296 Change method 'getSubMenuManager'
+1151438016000 Extract method 'runWithSelection'
+1151436839125 Extract method 'createContextMenu'
+1151434962000 Rename method 'makeActions'
+1151434943640 Extract method 'makeActions'
+1151351708476 Rename type 'AttachmentWizardDialog'
+1151350192015 Rename field 'fHasNewDialogSettings'
+1151349338500 Rename field 'PATCH_WIZARD_SETTINGS_SECTION'
+1151302583546 Rename method 'saveTaskListAndContexts'
+1151252466943 Rename method 'getAttachmentContents'
+1151252376195 Extract constant 'ATTACHMENT_URL_SUFFIX'
+1151197662345 Rename local variable 'c'
+1151196568462 Extract method 'openUrl'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..070caf9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskEditorURLHyperlinkDetector' to 'TaskEditorUrlHyperlinkDetector' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskEditorURLHyperlinkDetector' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.TaskEditorUrlHyperlinkDetector' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'TaskEditorURLHyperlinkDetector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{TaskEditorURLHyperlinkDetector.java[TaskEditorURLHyperlinkDetector" matchStrategy="1" name="TaskEditorUrlHyperlinkDetector" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1152054444921" textual="true" version="1.0"/>
+
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.editors.OutlineTools' to 'ContentOutlineTools' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.editors.OutlineTools' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.editors.ContentOutlineTools' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'OutlineTools'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.editors{OutlineTools.java[OutlineTools" matchStrategy="1" name="ContentOutlineTools" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152139156828" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public IWizard org.eclipse.mylar.provisional.tasklist.AbstractRepositoryConnector.getAddExistingTaskWizard(TaskRepository repository)' to 'public Wizard getAddExistingTaskWizard(TaskRepository repository)' - New return type: 'Wizard'" delegate="false" deprecate="true" description="Change method 'getAddExistingTaskWizard'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getAddExistingTaskWizard~QTaskRepository;" name="getAddExistingTaskWizard" parameter1="TaskRepository repository 0 TaskRepository repository false" return="Wizard" stamp="1152156529390" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard' to 'CommonAddExistingTaskWizard' - Original element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard' - Renamed element: 'org.eclipse.mylar.internal.tasklist.ui.wizards.CommonAddExistingTaskWizard' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AbstractAddExistingTaskWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{AbstractAddExistingTaskWizard.java[AbstractAddExistingTaskWizard" matchStrategy="1" name="CommonAddExistingTaskWizard" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152217803968" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.tasklist.ui.views.TaskListTableLabelProvider.TaskListTableLabelProvider(ILabelProvider provider, ILabelDecorator decorator, Color parentBacground, TaskListView view)' to 'public TaskListTableLabelProvider(ILabelProvider provider, ILabelDecorator decorator, Color parentBacground, TaskListView view)'" delegate="false" deprecate="true" description="Change method 'TaskListTableLabelProvider'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasklist.ui.views{TaskListTableLabelProvider.java[TaskListTableLabelProvider~TaskListTableLabelProvider~QTaskListView;~QILabelProvider;~QILabelDecorator;~QColor;" name="TaskListTableLabelProvider" parameter1="ILabelProvider provider 1 ILabelProvider provider false" parameter2="ILabelDecorator decorator 2 ILabelDecorator decorator false" parameter3="Color parentBacground 3 Color parentBacground false" parameter4="TaskListView view 0 TaskListView view false" stamp="1152227130218" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasklist.TaskListSynchronizationManager.scheduleRegularBackupJob()' to 'scheduleRegularSynchronizationJob' - Original element: 'org.eclipse.mylar.internal.tasklist.TaskListSynchronizationManager.scheduleRegularBackupJob()' - Renamed element: 'org.eclipse.mylar.internal.tasklist.TaskListSynchronizationManager.scheduleRegularSynchronizationJob()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'scheduleRegularBackupJob'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasklist{TaskListSynchronizationManager.java[TaskListSynchronizationManager~scheduleRegularBackupJob" name="scheduleRegularSynchronizationJob" references="true" stamp="1152292717483" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..f33c74c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1,6 @@
+1152054444921 Rename type 'TaskEditorURLHyperlinkDetector'
+1152292717483 Rename method 'scheduleRegularBackupJob'
+1152227130218 Change method 'TaskListTableLabelProvider'
+1152217803968 Rename type 'AbstractAddExistingTaskWizard'
+1152156529390 Change method 'getAddExistingTaskWizard'
+1152139156828 Rename type 'OutlineTools'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..35e428e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.util.TaskListExtensionReader' to 'TasksUitExtensionReader' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TaskListExtensionReader' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TaskListExtensionReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TaskListExtensionReader.java[TaskListExtensionReader" matchStrategy="1" name="TasksUitExtensionReader" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152925202785" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.wizards.AddRepositoryWizard' to 'NewRepositoryWizard' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AddRepositoryWizard' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.NewRepositoryWizard' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AddRepositoryWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AddRepositoryWizard.java[AddRepositoryWizard" matchStrategy="1" name="NewRepositoryWizard" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152923862400" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.wizards' to 'org.eclipse.mylar.internal.tasks.ui.wizards' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.ui.wizards' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.wizards' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.wizards'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.tasks.ui.ui.wizards" name="org.eclipse.mylar.internal.tasks.ui.wizards" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152890867968" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.views' to 'org.eclipse.mylar.internal.tasks.ui.views' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.ui.views' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.views'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.tasks.ui.ui.views" name="org.eclipse.mylar.internal.tasks.ui.views" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152890836171" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.preferences' to 'org.eclipse.mylar.internal.tasks.ui.preferences' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.ui.preferences' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.preferences' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.preferences'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.tasks.ui.ui.preferences" name="org.eclipse.mylar.internal.tasks.ui.preferences" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152890810437" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.editors' to 'org.eclipse.mylar.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.ui.editors' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.editors' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.editors'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.tasks.ui.ui.editors" name="org.eclipse.mylar.internal.tasks.ui.editors" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152890785765" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.actions' to 'org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.ui.actions' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.actions'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.tasks.ui.ui.actions" name="org.eclipse.mylar.internal.tasks.ui.actions" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152890703250" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.tasklist' to 'org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasklist' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.tasklist'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.tasklist" name="org.eclipse.mylar.internal.tasks.ui" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152842764750" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.provisional.tasklist' to 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.provisional.tasklist' - Renamed element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Update references to refactored element - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.provisional.tasklist'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.provisional.tasklist" name="org.eclipse.mylar.tasks.ui" patterns="*.xml, *.mf" qualified="true" references="true" stamp="1152842711328" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin' to 'TasksUiPlugin' - Original element: 'org.eclipse.mylar.provisional.tasklist.MylarTaskListPlugin' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.TasksUiPlugin' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarTaskListPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.provisional.tasklist{MylarTaskListPlugin.java[MylarTaskListPlugin" matchStrategy="1" name="TasksUiPlugin" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1152842629875" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_MIGRATION060' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_MIGRATION060' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_MIGRATION060'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_MIGRATION060" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737889312" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_DELIM' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_DELIM' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_DELIM'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_DELIM" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737883812" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_LABEL' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_LABEL' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_LABEL'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_LABEL" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737877968" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_URL' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_URL' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_URL'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_URL" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737871921" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_KIND' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_KIND' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_KIND'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737865734" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_VERSION' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_VERSION' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_VERSION'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_VERSION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737860500" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_ENCODING' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_ENCODING' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_ENCODING'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_ENCODING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737855234" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_TIMEZONE' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_TIMEZONE' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_TIMEZONE'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_TIMEZONE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737849703" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_SYNCTIMESTAMP' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.PROPERTY_SYNCTIMESTAMP' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'PROPERTY_SYNCTIMESTAMP'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^PROPERTY_SYNCTIMESTAMP" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737843812" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.OLD_PROPERTY_SYNCTIME' to 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants' - Original element: 'org.eclipse.mylar.provisional.tasklist.TaskRepositoryManager.OLD_PROPERTY_SYNCTIME' - Destination type: 'org.eclipse.mylar.provisional.tasklist.IRepositoryConstants'" delegate="false" deprecate="true" description="Move member 'OLD_PROPERTY_SYNCTIME'" element1="/src<org.eclipse.mylar.provisional.tasklist{TaskRepositoryManager.java[TaskRepositoryManager^OLD_PROPERTY_SYNCTIME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.provisional.tasklist{IRepositoryConstants.java[IRepositoryConstants" stamp="1152737836156" version="1.0"/>
+<refactoring comment="Extract method 'private String getTextForTask(Object object)' from 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDetailsAction.run()' to 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDetailsAction' - Method name: 'getTextForTask' - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.actions.CopyDetailsAction' - Declared visibility: 'private'" comments="false" description="Extract method 'getTextForTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasklist.ui.actions{CopyDetailsAction.java" name="getTextForTask" replace="false" selection="1881 864" stamp="1152655848562" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.setCurrentlyDownloading(...)' to 'setCurrentlySynchronizing' - Original element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.setCurrentlyDownloading(...)' - Renamed element: 'org.eclipse.mylar.provisional.tasklist.AbstractRepositoryTask.setCurrentlySynchronizing(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setCurrentlyDownloading'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.provisional.tasklist{AbstractRepositoryTask.java[AbstractRepositoryTask~setCurrentlyDownloading~Z" name="setCurrentlySynchronizing" references="true" stamp="1152586779499" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..6fa31e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1,23 @@
+1152925202785 Rename type 'TaskListExtensionReader'
+1152923862400 Rename type 'AddRepositoryWizard'
+1152890867968 Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.wizards'
+1152890836171 Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.views'
+1152890810437 Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.preferences'
+1152890785765 Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.editors'
+1152890703250 Rename package 'org.eclipse.mylar.internal.tasks.ui.ui.actions'
+1152842764750 Rename package 'org.eclipse.mylar.internal.tasklist'
+1152842711328 Rename package 'org.eclipse.mylar.provisional.tasklist'
+1152842629875 Rename type 'MylarTaskListPlugin'
+1152737889312 Move member 'PROPERTY_MIGRATION060'
+1152737883812 Move member 'PROPERTY_DELIM'
+1152737877968 Move member 'PROPERTY_LABEL'
+1152737871921 Move member 'PROPERTY_URL'
+1152737865734 Move member 'PROPERTY_KIND'
+1152737860500 Move member 'PROPERTY_VERSION'
+1152737855234 Move member 'PROPERTY_ENCODING'
+1152737849703 Move member 'PROPERTY_TIMEZONE'
+1152737843812 Move member 'PROPERTY_SYNCTIMESTAMP'
+1152737836156 Move member 'OLD_PROPERTY_SYNCTIME'
+1152655848562 Extract method 'getTextForTask'
+1152640834757 Rename method 'setCommentText'
+1152542212351 Convert anonymous class to nested
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/29/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/29/refactorings.history
new file mode 100644
index 0000000..a5b1258
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/29/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.preferences.TaskListPreferencePage' to 'TasksPreferencePage' - Original element: 'org.eclipse.mylar.internal.tasks.ui.preferences.TaskListPreferencePage' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TaskListPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.preferences{TaskListPreferencePage.java[TaskListPreferencePage" matchStrategy="1" name="TasksPreferencePage" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153144519218" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.RepositoryAwareStatusNotifier' to 'RepositoryAwareStatusHandler' - Original element: 'org.eclipse.mylar.internal.tasks.ui.RepositoryAwareStatusNotifier' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.RepositoryAwareStatusHandler' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryAwareStatusNotifier'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{RepositoryAwareStatusNotifier.java[RepositoryAwareStatusNotifier" matchStrategy="1" name="RepositoryAwareStatusHandler" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153121623921" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ELMNT_TMPL_TASKURLPREFIX' in 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader' to 'ELMNT_TMPL_TASKPREFIXURL' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader.ELMNT_TMPL_TASKURLPREFIX' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader.ELMNT_TMPL_TASKPREFIXURL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ELMNT_TMPL_TASKURLPREFIX'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUitExtensionReader.java[TasksUitExtensionReader^ELMNT_TMPL_TASKURLPREFIX" name="ELMNT_TMPL_TASKPREFIXURL" references="true" setter="false" stamp="1153249484093" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'ELMNT_TMPL_SERVERURL' in 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader' to 'ELMNT_TMPL_REPOSITORYURL' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader.ELMNT_TMPL_SERVERURL' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader.ELMNT_TMPL_REPOSITORYURL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ELMNT_TMPL_SERVERURL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUitExtensionReader.java[TasksUitExtensionReader^ELMNT_TMPL_SERVERURL" name="ELMNT_TMPL_REPOSITORYURL" references="true" setter="false" stamp="1153249815125" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader' to 'TasksUiExtensionReader' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUitExtensionReader' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'TasksUitExtensionReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUitExtensionReader.java[TasksUitExtensionReader" matchStrategy="1" name="TasksUiExtensionReader" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1153253684609" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.addCustomProperties(...)' to 'updateProperties' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.addCustomProperties(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.updateProperties(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'addCustomProperties'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage~addCustomProperties~QTaskRepository;" name="updateProperties" references="true" stamp="1153330764104" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.wizards.TaskDataImportWizardPage.createFileSelectionControl(...)' to 'createContentSelectionControl' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.TaskDataImportWizardPage.createFileSelectionControl(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.TaskDataImportWizardPage.createContentSelectionControl(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'createFileSelectionControl'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{TaskDataImportWizardPage.java[TaskDataImportWizardPage~createFileSelectionControl~QComposite;" name="createContentSelectionControl" references="true" stamp="1153343986885" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.wizards.TaskDataImportWizardPage.LABEL_IMPORT_BACKUP' from expression '"Import from auto backup"' - Constant name: 'LABEL_IMPORT_BACKUP' - Constant expression: '"Import from auto backup"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_IMPORT_BACKUP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{TaskDataImportWizardPage.java" name="LABEL_IMPORT_BACKUP" qualify="false" replace="true" selection="9788 25" stamp="1153519609515" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.wizards.TaskDataImportWizardPage.LABEL_IMPORT_ZIP' from expression '"Import from zip file"' - Constant name: 'LABEL_IMPORT_ZIP' - Constant expression: '"Import from zip file"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_IMPORT_ZIP'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{TaskDataImportWizardPage.java" name="LABEL_IMPORT_ZIP" qualify="false" replace="true" selection="8370 22" stamp="1153519633906" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.wizards.TaskDataImportWizardPage.LABEL_IMPORT_FOLDER' from expression '"Import from folder"' - Constant name: 'LABEL_IMPORT_FOLDER' - Constant expression: '"Import from folder"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_IMPORT_FOLDER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{TaskDataImportWizardPage.java" name="LABEL_IMPORT_FOLDER" qualify="false" replace="true" selection="6983 20" stamp="1153519651875" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/29/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/29/refactorings.index
new file mode 100644
index 0000000..accb7e6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/29/refactorings.index
@@ -0,0 +1,10 @@
+1153144519218 Rename type 'TaskListPreferencePage'
+1153519651875 Extract constant 'LABEL_IMPORT_FOLDER'
+1153519633906 Extract constant 'LABEL_IMPORT_ZIP'
+1153519609515 Extract constant 'LABEL_IMPORT_BACKUP'
+1153343986885 Rename method 'createFileSelectionControl'
+1153330764104 Rename method 'addCustomProperties'
+1153253684609 Rename type 'TasksUitExtensionReader'
+1153249815125 Rename field 'ELMNT_TMPL_SERVERURL'
+1153249484093 Rename field 'ELMNT_TMPL_TASKURLPREFIX'
+1153121623921 Rename type 'RepositoryAwareStatusNotifier'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..b7416e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'public void textChangeRefreshPolicy()' from 'org.eclipse.mylar.internal.tasks.ui.views.AbstractMylarFilteredTree.textChanged()' to 'org.eclipse.mylar.internal.tasks.ui.views.AbstractMylarFilteredTree' - Method name: 'textChangeRefreshPolicy' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.AbstractMylarFilteredTree' - Declared visibility: 'public'" comments="false" description="Extract method 'textChangeRefreshPolicy'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{AbstractMylarFilteredTree.java" name="textChangeRefreshPolicy" replace="false" selection="4251 337" stamp="1153635844639" version="1.0" visibility="1"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveFilterTreeRefresh' to 'AdaptiveRefreshPolicy' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveFilterTreeRefresh' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'AdaptiveFilterTreeRefresh'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{AdaptiveFilterTreeRefresh.java[AdaptiveFilterTreeRefresh" matchStrategy="1" name="AdaptiveRefreshPolicy" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1153636771952" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'filterTreeRefresh' in 'org.eclipse.mylar.internal.tasks.ui.views.AbstractMylarFilteredTree' to 'refreshPolicy' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.AbstractMylarFilteredTree.filterTreeRefresh' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.AbstractMylarFilteredTree.refreshPolicy' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'filterTreeRefresh'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{AbstractMylarFilteredTree.java[AbstractMylarFilteredTree^filterTreeRefresh" name="refreshPolicy" references="true" setter="false" stamp="1153636787671" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.FileBasedContextStore' to 'WorkspaceAwareContextStore' - Original element: 'org.eclipse.mylar.internal.tasks.ui.FileBasedContextStore' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.WorkspaceAwareContextStore' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'FileBasedContextStore'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{FileBasedContextStore.java[FileBasedContextStore" matchStrategy="1" name="WorkspaceAwareContextStore" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154035602390" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.editors.TaskFormEditor' to 'TaskFormPage' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskFormEditor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskFormPage' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'TaskFormEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskFormEditor.java[TaskFormEditor" matchStrategy="1" name="TaskFormPage" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1154046118421" textual="true" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector.canCreateTaskFromKey()' to 'public boolean canCreateTaskFromKey(TaskRepository repository)' - Added parameters: TaskRepository repository" default1="null" delegate="false" deprecate="true" description="Change method 'canCreateTaskFromKey'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnector.java[AbstractRepositoryConnector~canCreateTaskFromKey" name="canCreateTaskFromKey" parameter1="Object newParam -1 TaskRepository repository false" stamp="1154283487052" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector.canCreateNewTask()' to 'public boolean canCreateNewTask(TaskRepository repository)' - Added parameters: TaskRepository repository" default1="null" delegate="false" deprecate="true" description="Change method 'canCreateNewTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnector.java[AbstractRepositoryConnector~canCreateNewTask" name="canCreateNewTask" parameter1="Object newParam -1 TaskRepository repository false" stamp="1154283549288" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..341c757
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1,7 @@
+1153635844639 Extract method 'textChangeRefreshPolicy'
+1154283549288 Change method 'canCreateNewTask'
+1154283487052 Change method 'canCreateTaskFromKey'
+1154046118421 Rename type 'TaskFormEditor'
+1154035602390 Rename type 'FileBasedContextStore'
+1153636787671 Rename field 'filterTreeRefresh'
+1153636771952 Rename type 'AdaptiveFilterTreeRefresh'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/31/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/31/refactorings.history
new file mode 100644
index 0000000..c4bf94c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/31/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'text' in 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createImagePreview(...)' to 'label' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createImagePreview(Composite, LocalAttachment).text' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createImagePreview(Composite, LocalAttachment).label' - Update references to refactored element" description="Rename local variable 'text'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{PreviewAttachmentPage.java" name="label" references="true" selection="3732 4" stamp="1154368651452" version="1.0"/>
+<refactoring comment="Rename local variable 'text' in 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createGenericPreview(...)' to 'label' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createGenericPreview(Composite, LocalAttachment).text' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createGenericPreview(Composite, LocalAttachment).label' - Update references to refactored element" description="Rename local variable 'text'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{PreviewAttachmentPage.java" name="label" references="true" selection="4041 4" stamp="1154368654799" version="1.0"/>
+<refactoring comment="Rename local variable 'text' in 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createErrorPreview(...)' to 'label' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createErrorPreview(Composite, String).text' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.PreviewAttachmentPage.createErrorPreview(Composite, String).label' - Update references to refactored element" description="Rename local variable 'text'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{PreviewAttachmentPage.java" name="label" references="true" selection="4379 4" stamp="1154368659139" version="1.0"/>
+<refactoring comment="Rename local variable 'foo' in 'org.eclipse.mylar.internal.tasks.ui.wizards.InputAttachmentSourcePage.getAbsoluteAttachmentPath()' to 'resources' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.InputAttachmentSourcePage.getAbsoluteAttachmentPath().foo' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.InputAttachmentSourcePage.getAbsoluteAttachmentPath().resources' - Update references to refactored element" description="Rename local variable 'foo'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{InputAttachmentSourcePage.java" name="resources" references="true" selection="15693 3" stamp="1154369821843" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/31/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/31/refactorings.index
new file mode 100644
index 0000000..0cdc11d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/7/31/refactorings.index
@@ -0,0 +1,4 @@
+1154368651452 Rename local variable 'text'
+1154369821843 Rename local variable 'foo'
+1154368659139 Rename local variable 'text'
+1154368654799 Rename local variable 'text'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/31/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/31/refactorings.history
new file mode 100644
index 0000000..fdc0411
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/31/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'public void updateTaskData(final ITask updateTask)' from 'org.eclipse.mylar.internal.tasks.ui.editors.TaskPlanningEditor.new ITaskListChangeListener() {...}.localInfoChanged().new Runnable() {...}.run()' to 'org.eclipse.mylar.internal.tasks.ui.editors.TaskPlanningEditor.new ITaskListChangeListener() {...}.localInfoChanged().new Runnable() {...}' - Method name: 'updateTaskData' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskPlanningEditor.new ITaskListChangeListener() {...}.localInfoChanged().new Runnable() {...}' - Declared visibility: 'public'" comments="false" description="Extract method 'updateTaskData'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskPlanningEditor.java" name="updateTaskData" replace="false" selection="4942 1543" stamp="1154458231390" version="1.0" visibility="1"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.ATTR_FILENAME' to 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.ATTR_FILENAME' - Destination type: 'org.eclipse.mylar.tasks.core.RepositoryTaskAttribute'" delegate="false" deprecate="true" description="Move member 'ATTR_FILENAME'" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^ATTR_FILENAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.tasks.core{RepositoryTaskAttribute.java[RepositoryTaskAttribute" stamp="1154544048658" version="1.0"/>
+
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/31/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/31/refactorings.index
new file mode 100644
index 0000000..e6775f1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/31/refactorings.index
@@ -0,0 +1,2 @@
+1154458231390 Extract method 'updateTaskData'
+1154544048658 Move member 'ATTR_FILENAME'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/32/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/32/refactorings.history
new file mode 100644
index 0000000..ee82a70
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/32/refactorings.history
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.AbstractBugzillaQueryPage' to 'AbstractRepositoryQueryPage' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractBugzillaQueryPage' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryQueryPage' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'AbstractBugzillaQueryPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{AbstractBugzillaQueryPage.java[AbstractBugzillaQueryPage" matchStrategy="1" name="AbstractRepositoryQueryPage" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155249534193" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector.getQueryPage(...)' to 'getSearchPage' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector.getQueryPage(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector.getSearchPage(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getQueryPage'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnector.java[AbstractRepositoryConnector~getQueryPage~QTaskRepository;~QIStructuredSelection;" name="getSearchPage" references="true" stamp="1155253773740" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.search" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1155326696000" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui.search' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui.search' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchQuery.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.ui.search" element1="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSearchQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSearchQuery.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1155337942671" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchQuery' to 'AbstractRepositorySearchQuery' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchQuery' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.AbstractRepositorySearchQuery' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaSearchQuery'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSearchQuery.java[BugzillaSearchQuery" matchStrategy="1" name="AbstractRepositorySearchQuery" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155338046718" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchResult' to 'RepositorySearchResult' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchResult' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResult' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaSearchResult'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSearchResult.java[BugzillaSearchResult" matchStrategy="1" name="RepositorySearchResult" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155338497265" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaContentProvider' to 'SearchResultsContentProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaContentProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultsContentProvider' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaContentProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaContentProvider.java[BugzillaContentProvider" matchStrategy="1" name="SearchResultsContentProvider" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155338995937" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaTableContentProvider' to 'SearchResultsTableContentProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaTableContentProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultsTableContentProvider' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaTableContentProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaTableContentProvider.java[BugzillaTableContentProvider" matchStrategy="1" name="SearchResultsTableContentProvider" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339027484" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui.search' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.bugzilla.ui/src/org.eclipse.mylar.internal.bugzilla.ui.search' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.IBugzillaSearchOperation.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.bugzilla.ui.search" element1="/src<org.eclipse.mylar.internal.tasks.ui.search{IBugzillaSearchOperation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1155339115625" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaDescriptionSearchSorter' to 'DescriptionSearchSorter' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaDescriptionSearchSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.DescriptionSearchSorter' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaDescriptionSearchSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaDescriptionSearchSorter.java[BugzillaDescriptionSearchSorter" matchStrategy="1" name="DescriptionSearchSorter" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339299968" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaIdSearchSorter' to 'SearchResultIdSorter' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaIdSearchSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultIdSorter' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaIdSearchSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaIdSearchSorter.java[BugzillaIdSearchSorter" matchStrategy="1" name="SearchResultIdSorter" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339371140" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.DescriptionSearchSorter' to 'SearchResultDescriptionSorter' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.DescriptionSearchSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultDescriptionSorter' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'DescriptionSearchSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{DescriptionSearchSorter.java[DescriptionSearchSorter" matchStrategy="1" name="SearchResultDescriptionSorter" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339389687" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSortAction' to 'SearchResultSortAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSortAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultSortAction' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaSortAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSortAction.java[BugzillaSortAction" matchStrategy="1" name="SearchResultSortAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339440781" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaPrioritySearchSorter' to 'SearchResultSorterPriority' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaPrioritySearchSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultSorterPriority' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaPrioritySearchSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaPrioritySearchSorter.java[BugzillaPrioritySearchSorter" matchStrategy="1" name="SearchResultSorterPriority" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339534140" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultIdSorter' to 'SearchResultSorterId' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultIdSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultSorterId' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'SearchResultIdSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{SearchResultIdSorter.java[SearchResultIdSorter" matchStrategy="1" name="SearchResultSorterId" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339562718" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultDescriptionSorter' to 'SearchResultSorterDescription' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultDescriptionSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultSorterDescription' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'SearchResultDescriptionSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{SearchResultDescriptionSorter.java[SearchResultDescriptionSorter" matchStrategy="1" name="SearchResultSorterDescription" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339583484" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultsContentProvider' to 'SearchResultContentProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultsContentProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultContentProvider' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'SearchResultsContentProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{SearchResultsContentProvider.java[SearchResultsContentProvider" matchStrategy="1" name="SearchResultContentProvider" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339639531" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultsTableContentProvider' to 'SearchResultTableContentProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultsTableContentProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchResultTableContentProvider' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'SearchResultsTableContentProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{SearchResultsTableContentProvider.java[SearchResultsTableContentProvider" matchStrategy="1" name="SearchResultTableContentProvider" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339659140" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchResultView' to 'RepositorySearchResultView' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchResultView' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.RepositorySearchResultView' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaSearchResultView'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSearchResultView.java[BugzillaSearchResultView" matchStrategy="1" name="RepositorySearchResultView" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155339791875" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.OpenBugsAction' to 'OpenSearchResultAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.OpenBugsAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.OpenSearchResultAction' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'OpenBugsAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{OpenBugsAction.java[OpenBugsAction" matchStrategy="1" name="OpenSearchResultAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1155341176437" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.search' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryQueryPage.java' - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.search" element1="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryQueryPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1155343579578" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/32/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/32/refactorings.index
new file mode 100644
index 0000000..7b5cbcd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/32/refactorings.index
@@ -0,0 +1,21 @@
+1155249534193 Rename type 'AbstractBugzillaQueryPage'
+1155253773740 Rename method 'getQueryPage'
+1155326696000 Delete element
+1155337942671 Copy compilation unit
+1155338046718 Rename type 'BugzillaSearchQuery'
+1155338497265 Rename type 'BugzillaSearchResult'
+1155338995937 Rename type 'BugzillaContentProvider'
+1155339027484 Rename type 'BugzillaTableContentProvider'
+1155339115625 Move compilation unit
+1155339299968 Rename type 'BugzillaDescriptionSearchSorter'
+1155339371140 Rename type 'BugzillaIdSearchSorter'
+1155339389687 Rename type 'DescriptionSearchSorter'
+1155339440781 Rename type 'BugzillaSortAction'
+1155339534140 Rename type 'BugzillaPrioritySearchSorter'
+1155339562718 Rename type 'SearchResultIdSorter'
+1155339583484 Rename type 'SearchResultDescriptionSorter'
+1155339639531 Rename type 'SearchResultsContentProvider'
+1155339659140 Rename type 'SearchResultsTableContentProvider'
+1155339791875 Rename type 'BugzillaSearchResultView'
+1155341176437 Rename type 'OpenBugsAction'
+1155343579578 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/33/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/33/refactorings.history
new file mode 100644
index 0000000..ac4b23b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/33/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void addTaskToSync(AbstractRepositoryConnector client,AbstractRepositoryTask repositoryTask)' from 'org.eclipse.mylar.internal.tasks.ui.actions.SynchronizeSelectedAction.run()' to 'org.eclipse.mylar.internal.tasks.ui.actions.SynchronizeSelectedAction' - Method name: 'addTaskToSync' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.actions.SynchronizeSelectedAction' - Declared visibility: 'private'" comments="false" description="Extract method 'addTaskToSync'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{SynchronizeSelectedAction.java" name="addTaskToSync" replace="false" selection="4797 302" stamp="1155771748899" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private Section createSection(Composite composite)' from 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.createDescriptionLayout()' to 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Method name: 'createSection' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'createSection'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="createSection" replace="false" selection="41666 522" stamp="1155990352379" version="1.0" visibility="2"/>
+
+
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/33/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/33/refactorings.index
new file mode 100644
index 0000000..1a5b038
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/33/refactorings.index
@@ -0,0 +1,2 @@
+1155771748899 Extract method 'addTaskToSync'
+1155990352379 Extract method 'createSection'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..6de4897
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'newDescriptionTextViewer' in 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'descriptionTextViewer' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.newDescriptionTextViewer' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.descriptionTextViewer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'newDescriptionTextViewer'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^newDescriptionTextViewer" name="descriptionTextViewer" references="true" setter="false" stamp="1156187652531" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.selectNewDescription()' to 'selectDescription' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.selectNewDescription()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.selectDescription()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'selectNewDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~selectNewDescription" name="selectDescription" references="true" stamp="1156187749375" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'tasklist.xml'" description="Delete element" element1="tasklist.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1156459222515" subPackages="false" version="1.0"/>
+
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1156480209234" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.TaskSynchronizationManager' to 'RepositorySynchronizationManager' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskSynchronizationManager' - Renamed element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskSynchronizationManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{TaskSynchronizationManager.java[TaskSynchronizationManager" matchStrategy="1" name="RepositorySynchronizationManager" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156481530031" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.TaskListSynchronizationManager' to 'TaskListSynchronizationScheduler' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListSynchronizationManager' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskListSynchronizationScheduler' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListSynchronizationManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListSynchronizationManager.java[TaskListSynchronizationManager" matchStrategy="1" name="TaskListSynchronizationScheduler" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156483094062" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'synchronizationManager' in 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' to 'synchronizationScheduler' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.synchronizationManager' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.synchronizationScheduler' - Update references to refactored element - Update textual occurrences in comments and strings - Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'synchronizationManager'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^synchronizationManager" name="synchronizationScheduler" references="true" setter="false" stamp="1156483117296" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.AbstractRepositoryUi' to 'AbstractRepositoryConnectorUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryUi' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryUi.java[AbstractRepositoryUi" matchStrategy="1" name="AbstractRepositoryConnectorUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156483646437" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.setRepositoryClient(...)' to 'setRepositoryConnector' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.setRepositoryClient(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.setRepositoryConnector(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setRepositoryClient'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractRepositoryClientWizard.java[AbstractRepositoryClientWizard~setRepositoryClient~QAbstractRepositoryConnector;" name="setRepositoryConnector" references="true" stamp="1156489305750" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.getRepositoryClient()' to 'getRepositoryConnector' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.getRepositoryClient()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.getRepositoryConnector()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getRepositoryClient'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractRepositoryClientWizard.java[AbstractRepositoryClientWizard~getRepositoryClient" name="getRepositoryConnector" references="true" stamp="1156489735109" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi' to 'AbstractConnectorUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractConnectorUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi" matchStrategy="1" name="AbstractConnectorUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156490136078" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryClient(...)' to 'readRepositoryConnector' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryClient(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnector(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'readRepositoryClient'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUiExtensionReader.java[TasksUiExtensionReader~readRepositoryClient~QIConfigurationElement;" name="readRepositoryConnector" references="true" stamp="1156490388640" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.AbstractConnectorUi' to 'AbstractRepositoryUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractConnectorUi' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{AbstractConnectorUi.java[AbstractConnectorUi" matchStrategy="1" name="AbstractRepositoryUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156520024874" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'ELMNT_REPOSITORY_TYPE' in 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader' to 'ELMNT_REPOSITORY_CONNECTOR' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.ELMNT_REPOSITORY_TYPE' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.ELMNT_REPOSITORY_CONNECTOR' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ELMNT_REPOSITORY_TYPE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUiExtensionReader.java[TasksUiExtensionReader^ELMNT_REPOSITORY_TYPE" name="ELMNT_REPOSITORY_CONNECTOR" references="true" setter="false" stamp="1156520866484" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.addRepositoryConnectorUi(...)' to 'addRepositoryUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.addRepositoryConnectorUi(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.addRepositoryUi(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'addRepositoryConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java[TaskRepositoryManager~addRepositoryConnectorUi~QAbstractRepositoryUi;" name="addRepositoryUi" references="true" stamp="1156521411281" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryConnectorUi(...)' to 'getRepositoryUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryConnectorUi(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryUi(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getRepositoryConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryConnectorUi~QString;" name="getRepositoryUi" references="true" stamp="1156521421109" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryConnectorsUis()' to 'getRepositoryUis' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryConnectorsUis()' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryUis()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getRepositoryConnectorsUis'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryConnectorsUis" name="getRepositoryUis" references="true" stamp="1156521430781" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.AbstractRepositoryUi' to 'AbstractRepositoryConnectorUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryUi' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryUi.java[AbstractRepositoryUi" matchStrategy="1" name="AbstractRepositoryConnectorUi" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156521838796" textual="true" version="1.0"/>
+
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.addRepositoryUi(...)' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" element1="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java[TaskRepositoryManager~addRepositoryUi~QAbstractRepositoryConnectorUi;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156522176359" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryUi(...)' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" element1="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryUi~QString;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156522182671" version="1.0"/>
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.getRepositoryUis()' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" element1="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java[TaskRepositoryManager~getRepositoryUis" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156522190874" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.addRepositoryUi(...)' to 'addRepositoryConnectorUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.addRepositoryUi(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.addRepositoryConnectorUi(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'addRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~addRepositoryUi~QAbstractRepositoryConnectorUi;" name="addRepositoryConnectorUi" references="true" stamp="1156522228734" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.ui.TaskRepositoryManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.tasks.ui{TaskRepositoryManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1156522592749" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnector(...)' to 'readRepositoryConnectorCore' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnector(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorCore(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'readRepositoryConnector'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUiExtensionReader.java[TasksUiExtensionReader~readRepositoryConnector~QIConfigurationElement;" name="readRepositoryConnectorCore" references="true" stamp="1156523848140" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryUi(...)' to 'readRepositoryConnectorUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryUi(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorUi(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'readRepositoryUi'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUiExtensionReader.java[TasksUiExtensionReader~readRepositoryUi~QIConfigurationElement;" name="readRepositoryConnectorUi" references="true" stamp="1156523855812" version="1.0"/>
+<refactoring comment="Rename local variable 'repository' in 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorUi(...)' to 'connectorUi' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorUi(IConfigurationElement).repository' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorUi(IConfigurationElement).connectorUi' - Update references to refactored element" description="Rename local variable 'repository'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUiExtensionReader.java" name="connectorUi" references="true" selection="8567 10" stamp="1156523870390" version="1.0"/>
+<refactoring comment="Rename local variable 'repository' in 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorCore(...)' to 'connectorCore' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorCore(IConfigurationElement).repository' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.util.TasksUiExtensionReader.readRepositoryConnectorCore(IConfigurationElement).connectorCore' - Update references to refactored element" description="Rename local variable 'repository'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TasksUiExtensionReader.java" name="connectorCore" references="true" selection="7947 10" stamp="1156523875859" version="1.0"/>
+<refactoring comment="Rename field 'LABEL_LABEL' in 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage' to 'LABEL_TEMPLATE' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.LABEL_LABEL' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.LABEL_TEMPLATE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'LABEL_LABEL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage^LABEL_LABEL" name="LABEL_TEMPLATE" references="true" setter="false" stamp="1156541610453" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.RepositorySearchPage' to 'TaskSearchPage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.RepositorySearchPage' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskSearchPage' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'RepositorySearchPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{RepositorySearchPage.java[RepositorySearchPage" matchStrategy="1" name="TaskSearchPage" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1156544366281" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..c6b6518
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1,30 @@
+1156187652531 Rename field 'newDescriptionTextViewer'
+1156450989574 Convert member type 'RepositoryViewerConfig' to top level
+1156187749375 Rename method 'selectNewDescription'
+1156459222515 Delete element
+1156480209234 Move compilation unit
+1156481530031 Rename type 'TaskSynchronizationManager'
+1156483094062 Rename type 'TaskListSynchronizationManager'
+1156483117296 Rename field 'synchronizationManager'
+1156483646437 Rename type 'AbstractRepositoryUi'
+1156489305750 Rename method 'setRepositoryClient'
+1156489735109 Rename method 'getRepositoryClient'
+1156490136078 Rename type 'AbstractRepositoryConnectorUi'
+1156490388640 Rename method 'readRepositoryClient'
+1156520024874 Rename type 'AbstractConnectorUi'
+1156520866484 Rename field 'ELMNT_REPOSITORY_TYPE'
+1156521411281 Rename method 'addRepositoryConnectorUi'
+1156521421109 Rename method 'getRepositoryConnectorUi'
+1156521430781 Rename method 'getRepositoryConnectorsUis'
+1156521838796 Rename type 'AbstractRepositoryUi'
+1156522176359 Move method
+1156522182671 Move method
+1156522190874 Move method
+1156522228734 Rename method 'addRepositoryUi'
+1156522592749 Move compilation unit
+1156523848140 Rename method 'readRepositoryConnector'
+1156523855812 Rename method 'readRepositoryUi'
+1156523870390 Rename local variable 'repository'
+1156523875859 Rename local variable 'repository'
+1156541610453 Rename field 'LABEL_LABEL'
+1156544366281 Rename type 'RepositorySearchPage'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/35/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/35/refactorings.history
new file mode 100644
index 0000000..54814ed
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/35/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void reloadFromNewFolder(String taskListFilePath)' from 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.new IPropertyChangeListener() {...}.propertyChange()' to 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.new IPropertyChangeListener() {...}' - Method name: 'reloadFromNewFolder' - Destination type: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.new IPropertyChangeListener() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'reloadFromNewFolder'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java" name="reloadFromNewFolder" replace="false" selection="11812 281" stamp="1156805753984" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.wizards' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.wizards' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.NewLocalTaskWizard.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.wizards" element1="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewLocalTaskWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewLocalTaskWizard.java	true	true	NewLocalCategoryWizard.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1156825352468" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/35/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/35/refactorings.index
new file mode 100644
index 0000000..52019f2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/8/35/refactorings.index
@@ -0,0 +1,2 @@
+1156805753984 Extract method 'reloadFromNewFolder'
+1156825352468 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/36/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/36/refactorings.history
new file mode 100644
index 0000000..d0cb92b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/36/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.editors.AbstractRepositoryTaskEditor.HEADER_DATE_FORMAT' from expression '"EEE d MMM yyyy HH:mm:ss"' - Constant name: 'HEADER_DATE_FORMAT' - Constant expression: '"EEE d MMM yyyy HH:mm:ss"' - Declared visibility: 'protected' - Replace occurrences of expression with constant" description="Extract constant 'HEADER_DATE_FORMAT'" flags="786434" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="HEADER_DATE_FORMAT" qualify="false" replace="true" selection="19681 25" stamp="1157490645234" version="1.0" visibility="4"/>
+<refactoring comment="Extract method 'private void checkForExistingTasklist(String dir)' from 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage.createTaskDataControl().new SelectionAdapter() {...}.widgetSelected()' to 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage.createTaskDataControl().new SelectionAdapter() {...}' - Method name: 'checkForExistingTasklist' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage.createTaskDataControl().new SelectionAdapter() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'checkForExistingTasklist'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.preferences{TasksPreferencePage.java" name="checkForExistingTasklist" replace="false" selection="15693 643" stamp="1157497106703" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'LABEL_TEMPLATE' in 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage' to 'LABEL_REPOSITORY_LABEL' - Original element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.LABEL_TEMPLATE' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.wizards.AbstractRepositorySettingsPage.LABEL_REPOSITORY_LABEL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'LABEL_TEMPLATE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage^LABEL_TEMPLATE" name="LABEL_REPOSITORY_LABEL" references="true" setter="false" stamp="1157581957062" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.views" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java	true	true	TaskRepositoriesTableLabelProvider.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1157746263078" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/36/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/36/refactorings.index
new file mode 100644
index 0000000..d31d3a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/36/refactorings.index
@@ -0,0 +1,4 @@
+1157490645234 Extract constant 'HEADER_DATE_FORMAT'
+1157497106703 Extract method 'checkForExistingTasklist'
+1157581957062 Rename field 'LABEL_TEMPLATE'
+1157746263078 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/37/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/37/refactorings.history
new file mode 100644
index 0000000..ecda780
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/37/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchResultCollector' to 'SearchHitCollector' - Original element: 'org.eclipse.mylar.internal.tasks.ui.search.BugzillaSearchResultCollector' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.search.SearchHitCollector' - Update references to refactored element - Update fully qualified names in *.xml files - Update textual occurrences in comments and strings" description="Rename type 'BugzillaSearchResultCollector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.search{BugzillaSearchResultCollector.java[BugzillaSearchResultCollector" matchStrategy="1" name="SearchHitCollector" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1157927066046" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.Foo.java'" description="Delete element" element1="/src<org.eclipse.mylar{Foo.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1158249619410" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.IAction.java'" description="Delete element" element1="/src<org.eclipse.mylar{IAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1158249669352" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.Foo.java'" description="Delete element" element1="/src<org.eclipse.mylar{Foo.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1158249728427" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/37/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/37/refactorings.index
new file mode 100644
index 0000000..3dbe2cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/37/refactorings.index
@@ -0,0 +1,4 @@
+1157927066046 Rename type 'BugzillaSearchResultCollector'
+1158249619410 Delete element
+1158249669352 Delete element
+1158249728427 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/38/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/38/refactorings.history
new file mode 100644
index 0000000..339f8c1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/38/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.actions.MarkTaskUnreadAction.ACTION_NAME' from expression '"Mark Unread"' - Constant name: 'ACTION_NAME' - Constant expression: '"Mark Unread"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ACTION_NAME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{MarkTaskUnreadAction.java" name="ACTION_NAME" qualify="false" replace="true" selection="1378 13" stamp="1158615549437" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.actions.MarkTaskReadAction.ACTION_NAME' from expression '"Mark Read"' - Constant name: 'ACTION_NAME' - Constant expression: '"Mark Read"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'ACTION_NAME'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{MarkTaskReadAction.java" name="ACTION_NAME" qualify="false" replace="true" selection="1370 11" stamp="1158615579656" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'public void scheduleNewTask(Task newTask)' from 'org.eclipse.mylar.internal.tasks.ui.actions.NewLocalTaskAction.run()' to 'org.eclipse.mylar.internal.tasks.ui.actions.NewLocalTaskAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'scheduleNewTask' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.actions.NewLocalTaskAction' - Declared visibility: 'public'" comments="false" description="Extract method 'scheduleNewTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{NewLocalTaskAction.java" name="scheduleNewTask" replace="false" selection="2036 223" stamp="1158707674212" version="1.0" visibility="1"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.TaskListNotificationPopup.NOTIFICATIONS_HIDDEN' from expression '" changes hidden..."' - Constant name: 'NOTIFICATIONS_HIDDEN' - Constant expression: '" changes hidden..."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'NOTIFICATIONS_HIDDEN'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListNotificationPopup.java" name="NOTIFICATIONS_HIDDEN" qualify="false" replace="true" selection="4694 20" stamp="1158716100390" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getEditQueryWizard(...)' to 'getQueryWizard' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getEditQueryWizard(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getQueryWizard(...)' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getEditQueryWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getEditQueryWizard~QTaskRepository;~QAbstractRepositoryQuery;" name="getQueryWizard" references="true" stamp="1158944328071" version="1.0"/>
+<refactoring comment="Rename local variable 'query' in 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getQueryWizard(...)' to 'queryToEdit' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getQueryWizard(TaskRepository, AbstractRepositoryQuery).query' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getQueryWizard(TaskRepository, AbstractRepositoryQuery).queryToEdit' - Update references to refactored element" description="Rename local variable 'query'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java" name="queryToEdit" references="true" selection="1750 5" stamp="1158944344144" version="1.0"/>
+<refactoring comment="Change method 'public IWizard org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getNewQueryWizard(TaskRepository repository, IStructuredSelection selection)' to 'public IWizard getNewQueryWizard(TaskRepository repository)' - Original project: 'org.eclipse.mylar.tasks.ui' - Removed parameters: IStructuredSelection selection" delegate="false" deprecate="true" description="Change method 'getNewQueryWizard'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getNewQueryWizard~QTaskRepository;~QIStructuredSelection;" name="getNewQueryWizard" parameter1="TaskRepository repository 0 TaskRepository repository false" parameter2="IStructuredSelection selection 1 IStructuredSelection selection true" stamp="1158944448794" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/38/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/38/refactorings.index
new file mode 100644
index 0000000..544c35c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/38/refactorings.index
@@ -0,0 +1,9 @@
+1158615549437 Extract constant 'ACTION_NAME'
+1158615579656 Extract constant 'ACTION_NAME'
+1158707674212 Extract method 'scheduleNewTask'
+1158710806343 Infer generic type arguments
+1158712349859 Extract constant 'NUM_NOTIFICATIONS_TO_DISPLAY'
+1158716100390 Extract constant 'NOTIFICATIONS_HIDDEN'
+1158944328071 Rename method 'getEditQueryWizard'
+1158944344144 Rename local variable 'query'
+1158944448794 Change method 'getNewQueryWizard'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/39/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/39/refactorings.history
new file mode 100644
index 0000000..0260a02
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/39/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.properties'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.properties" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1159219709281" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.OpenTaskListElementAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenTaskListElementAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenTaskListElementAction.java	true	true	TaskListElementPropertiesAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1159461212321" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.TaskReminderMenuContributor' to 'ScheduleMenuContributor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskReminderMenuContributor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.ScheduleMenuContributor' - Update references to refactored element - Update fully qualified names in '*.mf, *.plugin.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskReminderMenuContributor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskReminderMenuContributor.java[TaskReminderMenuContributor" matchStrategy="1" name="ScheduleMenuContributor" patterns="*.mf, *.plugin.xml" qualified="true" references="true" similarDeclarations="false" stamp="1159463444440" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.ScheduleMenuContributor' to 'TaskReminderMenuContributor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.ScheduleMenuContributor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskReminderMenuContributor' - Update references to refactored element - Update fully qualified names in '*.mf, *.plugin.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ScheduleMenuContributor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{ScheduleMenuContributor.java[ScheduleMenuContributor" matchStrategy="1" name="TaskReminderMenuContributor" patterns="*.mf, *.plugin.xml" qualified="true" references="true" similarDeclarations="false" stamp="1159471487260" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/39/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/39/refactorings.index
new file mode 100644
index 0000000..691a453
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2006/9/39/refactorings.index
@@ -0,0 +1,4 @@
+1159219709281 Delete element
+1159461212321 Copy compilation unit
+1159463444440 Rename type 'TaskReminderMenuContributor'
+1159471487260 Rename type 'ScheduleMenuContributor'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/1/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/1/refactorings.history
new file mode 100644
index 0000000..f41bb6d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/1/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.AddAttachmentAction' to 'AttachFileAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.AddAttachmentAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.AttachFileAction' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AddAttachmentAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{AddAttachmentAction.java[AddAttachmentAction" matchStrategy="1" name="AttachFileAction" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1168024139900" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/1/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/1/refactorings.index
new file mode 100644
index 0000000..4fea5ca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/1/refactorings.index
@@ -0,0 +1 @@
+1168024139900 Rename type 'AddAttachmentAction'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/2/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/2/refactorings.history
new file mode 100644
index 0000000..29560d3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/2/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void enableButtons()' from 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.handleSubmitError().new Runnable() {...}.run()' to 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'enableButtons' - Destination type: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'enableButtons'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="enableButtons" replace="false" selection="93927 117" stamp="1168569589578" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.DEFAULT_FIELD_WIDTH' from expression '150' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'DEFAULT_FIELD_WIDTH' - Constant expression: '150' - Declared visibility: 'private'" description="Extract constant 'DEFAULT_FIELD_WIDTH'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java" name="DEFAULT_FIELD_WIDTH" qualify="false" replace="false" selection="15719 3" stamp="1168629170750" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiUtil.displayDialog(...)' to 'displayStatus' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.displayDialog(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.displayStatus(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'displayDialog'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java[TasksUiUtil~displayDialog~QString;~QIStatus;~QShell;" name="displayStatus" references="true" stamp="1168648513750" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/2/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/2/refactorings.index
new file mode 100644
index 0000000..c75d64c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/2/refactorings.index
@@ -0,0 +1,3 @@
+1168569589578 Extract method 'enableButtons'
+1168629170750 Extract constant 'DEFAULT_FIELD_WIDTH'
+1168648513750 Rename method 'displayDialog'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..c2bca26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskRepositoriesViewSorter' to 'TaskRepositoriesSorter' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskRepositoriesViewSorter' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskRepositoriesSorter' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskRepositoriesViewSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskRepositoriesViewSorter.java[TaskRepositoriesViewSorter" matchStrategy="1" name="TaskRepositoriesSorter" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1169061774450" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'src-old' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListDataMigration.java'" description="Copy compilation unit" destination="developer/src-old" element1="/src<org.eclipse.mylar.tasks.ui{TaskListDataMigration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/tasks/ui/TaskListDataMigration.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1169229438461" units="1" version="1.0"/>
+
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListDataMigration.java'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.ui{TaskListDataMigration.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1169229673549" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..0592fa8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1,3 @@
+1169061774450 Rename type 'TaskRepositoriesViewSorter'
+1169229438461 Copy compilation unit
+1169229673549 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/4/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/4/refactorings.history
new file mode 100644
index 0000000..9a3eda6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/4/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'color_backgroundIncoming' in 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'backgroundIncoming' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.color_backgroundIncoming' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.backgroundIncoming' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'color_backgroundIncoming'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^color_backgroundIncoming" name="backgroundIncoming" references="true" setter="false" stamp="1169426561696" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'datePicker' in 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor' to 'scheduledForDate' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.datePicker' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.scheduledForDate' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'datePicker'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java[AbstractNewRepositoryTaskEditor^datePicker" name="scheduledForDate" references="true" setter="false" stamp="1169435657559" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'searchDuplicatesButton' in 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor' to 'searchForDuplicates' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.searchDuplicatesButton' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.searchForDuplicates' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'searchDuplicatesButton'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java[AbstractNewRepositoryTaskEditor^searchDuplicatesButton" name="searchForDuplicates" references="true" setter="false" stamp="1169435667210" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'estimated' in 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor' to 'estimatedTime' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.estimated' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.estimatedTime' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'estimated'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java[AbstractNewRepositoryTaskEditor^estimated" name="estimatedTime" references="true" setter="false" stamp="1169435684381" textual="true" version="1.0"/>
+<refactoring comment="Rename field 'categoryCombo' in 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor' to 'categoryChooser' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.categoryCombo' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractNewRepositoryTaskEditor.categoryChooser' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'categoryCombo'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java[AbstractNewRepositoryTaskEditor^categoryCombo" name="categoryChooser" references="true" setter="false" stamp="1169435779019" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl(...)' to 'openWithBrowser' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openWithBrowser(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java[TasksUiUtil~openUrl~QString;" name="openWithBrowser" references="true" stamp="1169590777544" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openWithBrowser(...)' to 'openUrl' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openWithBrowser(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openWithBrowser'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java[TasksUiUtil~openWithBrowser~QString;" name="openUrl" references="true" stamp="1169590812537" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl(...)' to 'openBrowser' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openBrowser(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java[TasksUiUtil~openUrl~QString;" name="openBrowser" references="true" stamp="1169590899684" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.addReplyHyperlink(...)' to 'createReplyHyperlink' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.addReplyHyperlink(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createReplyHyperlink(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addReplyHyperlink'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~addReplyHyperlink~I~QExpandableComposite;" name="createReplyHyperlink" references="true" stamp="1169653031000" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.openRemoteTask(...)' to 'openRepositoryTask' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.openRemoteTask(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.openRepositoryTask(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openRemoteTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~openRemoteTask~QString;~QString;" name="openRepositoryTask" references="true" stamp="1169745300063" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/4/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/4/refactorings.index
new file mode 100644
index 0000000..0e883fc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/4/refactorings.index
@@ -0,0 +1,10 @@
+1169426561696 Rename field 'color_backgroundIncoming'
+1169435657559 Rename field 'datePicker'
+1169435667210 Rename field 'searchDuplicatesButton'
+1169435684381 Rename field 'estimated'
+1169435779019 Rename field 'categoryCombo'
+1169590777544 Rename method 'openUrl'
+1169590812537 Rename method 'openWithBrowser'
+1169590899684 Rename method 'openUrl'
+1169653031000 Rename method 'addReplyHyperlink'
+1169745300063 Rename method 'openRemoteTask'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/5/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/5/refactorings.history
new file mode 100644
index 0000000..12558ce
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/5/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.refresh()' to 'updateEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.refresh()' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.updateEditor()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'refresh'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~refresh" name="updateEditor" references="true" stamp="1169942724937" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.MarkTaskIncompleteAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{MarkTaskIncompleteAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{MarkTaskIncompleteAction.java	true	true	ClearOutgoingAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1170104075984" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.updateOfflineState(...)' to 'saveIncomingChanges' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.updateOfflineState(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveIncomingChanges(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateOfflineState'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{RepositorySynchronizationManager.java[RepositorySynchronizationManager~updateOfflineState~QAbstractRepositoryTask;~QRepositoryTaskData;~Z" name="saveIncomingChanges" references="true" stamp="1170115371828" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.ClearOutgoingAction' to 'DiscardOutgoingAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.ClearOutgoingAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.DiscardOutgoingAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ClearOutgoingAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{ClearOutgoingAction.java[ClearOutgoingAction" matchStrategy="1" name="DiscardOutgoingAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1170176277250" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/5/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/5/refactorings.index
new file mode 100644
index 0000000..bb2b551
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/1/5/refactorings.index
@@ -0,0 +1,4 @@
+1169942724937 Rename method 'refresh'
+1170104075984 Copy compilation unit
+1170115371828 Rename method 'updateOfflineState'
+1170176277250 Rename type 'ClearOutgoingAction'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/40/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/40/refactorings.history
new file mode 100644
index 0000000..65b6734
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/40/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTipHandler' to 'TaskListToolTip' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTipHandler' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TaskListToolTipHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTipHandler.java[TaskListToolTipHandler" matchStrategy="1" name="TaskListToolTip" qualified="false" references="true" similarDeclarations="false" stamp="1191794862410" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/40/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/40/refactorings.index
new file mode 100644
index 0000000..11986f8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/40/refactorings.index
@@ -0,0 +1 @@
+1191794862410 Rename type 'TaskListToolTipHandler'
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/41/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/41/refactorings.history
new file mode 100644
index 0000000..b68680d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/41/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction.LABEL' from expression '"Add Attachment..."'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL'
- Constant expression: '"Add Attachment..."'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java" name="LABEL" qualify="false" replace="true" selection="1220 19" stamp="1191884039650" version="1.0" visibility="2"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenShotAttachmentPage' to 'ScreenshotAttachmentPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenShotAttachmentPage'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenshotAttachmentPage'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ScreenShotAttachmentPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ScreenShotAttachmentPage.java[ScreenShotAttachmentPage" matchStrategy="1" name="ScreenshotAttachmentPage" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1191884099671" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'addAttachmentButton' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(...)' to 'attachFileButton'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(Composite).addAttachmentButton'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(Composite).attachFileButton'
- Update references to refactored element" description="Rename local variable 'addAttachmentButton'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createAttachmentLayout~QComposite;@addAttachmentButton!56002!56114!56009!56027!QButton;" name="attachFileButton" references="true" stamp="1191884976394" version="1.0"/>
<refactoring comment="Rename local variable 'attachFileButton' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(...)' to 'attachScreenshot'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(Composite).attachFileButton'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(Composite).attachScreenshot'
- Update references to refactored element" description="Rename local variable 'attachFileButton'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createAttachmentLayout~QComposite;@attachFileButton!56116!56225!56123!56138!QButton;" name="attachScreenshot" references="true" stamp="1191884988331" version="1.0"/>
<refactoring comment="Rename local variable 'attachScreenshot' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(...)' to 'attachScreenshotButton'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(Composite).attachScreenshot'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(Composite).attachScreenshotButton'
- Update references to refactored element" description="Rename local variable 'attachScreenshot'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createAttachmentLayout~QComposite;@attachScreenshot!56116!56225!56123!56138!QButton;" name="attachScreenshotButton" references="true" stamp="1191885037280" version="1.0"/>
<refactoring comment="Extract method 'private boolean canAttach(AbstractTask task)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout().new SelectionListener() {...}.widgetSelected()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout().new SelectionListener() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'canAttach'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout().new SelectionListener() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'canAttach'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="canAttach" replace="false" selection="56815 123" stamp="1191885178512" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.LABEL_EDITOR' from expression '"Task Editor"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_EDITOR'
- Constant expression: '"Task Editor"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_EDITOR'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="LABEL_EDITOR" qualify="false" replace="true" selection="56911 13" stamp="1191885237743" version="1.0" visibility="2"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1191885332991" units="1" version="1.0"/>
<refactoring comment="Rename local variable 'attachFileAction' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(...).new SelectionListener() {...}.widgetSelected(...)' to 'attachScreenshotAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(...).new SelectionListener() {...}.widgetSelected(SelectionEvent).attachFileAction'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout(...).new SelectionListener() {...}.widgetSelected(SelectionEvent).attachScreenshotAction'
- Update references to refactored element" description="Rename local variable 'attachFileAction'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createAttachmentLayout~QComposite;[!10~widgetSelected~QSelectionEvent;@attachFileAction!57714!57784!57737!57752!QAttachScreenshotAction;" name="attachScreenshotAction" references="true" stamp="1191885497488" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenshotAttachmentPage.storeScreenshotContent()' to 'captureScreenshotContent'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenshotAttachmentPage.storeScreenshotContent()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenshotAttachmentPage.captureScreenshotContent()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'storeScreenshotContent'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ScreenshotAttachmentPage.java[ScreenshotAttachmentPage~storeScreenshotContent" name="captureScreenshotContent" references="true" stamp="1191892686553" version="1.0"/>
<refactoring comment="Extract method 'private boolean isContext(RepositoryAttachment attachment)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider.getColumnImage()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'isContext'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider'
- Declared visibility: 'private'" comments="false" description="Extract method 'isContext'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentTableLabelProvider.java" name="isContext" replace="false" selection="2209 191" stamp="1191894533830" version="1.0" visibility="2"/>
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskEditorAction' from 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction'
- Sub types:
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction
- Extracted class: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskEditorAction'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction.run()
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction.setEditor(...)
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction.taskDirty(...)
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction.openInformationDialog(...)
- Use super type where possible" delete="4" description="Extract superclass 'AbstractTaskEditorAction'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~run" element2="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~setEditor~QTaskEditor;" element3="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~taskDirty~QAbstractTask;" element4="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~openInformationDialog~QString;~QString;" element5="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~runnInformationDialog~QString;~QString;" element6="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~run" element7="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~taskDirty~QAbstractTas" element8="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction~taskDirty~QAbstractTask;" element9="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction" extract="4" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction" instanceof="false" name="AbstractTaskEditorAction" replace="true" stamp="1191959325515" stubs="true" types="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'views'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'views'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTipHandler.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTipHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1191960544875" target="/org.eclipse.mylyn/developer/src-old/views" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTipHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTipHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1191960560953" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'TITLE_DIALOG_EDITOR' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiMessages' to 'DIALOG_EDITOR'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiMessages.TITLE_DIALOG_EDITOR'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiMessages.DIALOG_EDITOR'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TITLE_DIALOG_EDITOR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiMessages.java[TasksUiMessages^TITLE_DIALOG_EDITOR" name="DIALOG_EDITOR" references="true" setter="false" stamp="1192144919243" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/41/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/41/refactorings.index
new file mode 100644
index 0000000..9a974b4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/41/refactorings.index
@@ -0,0 +1,15 @@
+1191884039650 Extract constant 'LABEL'
+1191884099671 Rename type 'ScreenShotAttachmentPage'
+1191884976394 Rename local variable 'addAttachmentButton'
+1191884988331 Rename local variable 'attachFileButton'
+1191885037280 Rename local variable 'attachScreenshot'
+1191885178512 Extract method 'canAttach'
+1191885237743 Extract constant 'LABEL_EDITOR'
+1191885332991 Copy compilation unit
+1191885497488 Rename local variable 'attachFileAction'
+1191892686553 Rename method 'storeScreenshotContent'
+1191894533830 Extract method 'isContext'
+1191959325515 Extract superclass 'AbstractTaskEditorAction'
+1191960544875 Copy compilation unit
+1191960560953 Delete element
+1192144919243 Rename field 'TITLE_DIALOG_EDITOR'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/43/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/43/refactorings.history
new file mode 100644
index 0000000..a2b45d7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/43/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.getHyperlinkPresenter().new DefaultHyperlinkPresenter() {...}' in 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.getHyperlinkPresenter()' to nested class
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.getHyperlinkPresenter().new DefaultHyperlinkPresenter() {...}'
- Class name: 'TaskTextViewerHyperlinkPresenter'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java" name="TaskTextViewerHyperlinkPresenter" selection="4293 0" stamp="1193174682888" static="false" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.ID_CONTEXT_TEXT_EDITOR' from expression '"org.eclipse.ui.DefaultTextEditor"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ID_CONTEXT_TEXT_EDITOR'
- Constant expression: '"org.eclipse.ui.DefaultTextEditor"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ID_CONTEXT_TEXT_EDITOR'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java" name="ID_CONTEXT_TEXT_EDITOR" qualify="false" replace="true" selection="3680 34" stamp="1193174853749" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.ID_CONTEXT_TASK_EDITOR' from expression '"org.eclipse.mylyn.tasks.ui.TaskEditor"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ID_CONTEXT_TASK_EDITOR'
- Constant expression: '"org.eclipse.mylyn.tasks.ui.TaskEditor"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ID_CONTEXT_TASK_EDITOR'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java" name="ID_CONTEXT_TASK_EDITOR" qualify="false" replace="true" selection="3822 39" stamp="1193174879973" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'ID_CONTEXT_TEXT_EDITOR' in 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration' to 'ID_CONTEXT_EDITOR_TEXT'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.ID_CONTEXT_TEXT_EDITOR'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.ID_CONTEXT_EDITOR_TEXT'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_CONTEXT_TEXT_EDITOR'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java[TaskTextViewerConfiguration^ID_CONTEXT_TEXT_EDITOR" name="ID_CONTEXT_EDITOR_TEXT" references="true" setter="true" stamp="1193174898497" textual="false" version="1.0"/>
<refactoring comment="Rename field 'ID_CONTEXT_TASK_EDITOR' in 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration' to 'ID_CONTEXT_EDITOR_TASK'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.ID_CONTEXT_TASK_EDITOR'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.ID_CONTEXT_EDITOR_TASK'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_CONTEXT_TASK_EDITOR'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java[TaskTextViewerConfiguration^ID_CONTEXT_TASK_EDITOR" name="ID_CONTEXT_EDITOR_TASK" references="true" setter="true" stamp="1193174960220" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction' to 'AttachAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachFileAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AttachAction'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'AttachFileAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachFileAction.java[AttachFileAction" matchStrategy="1" name="AttachAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1193369111526" textual="false" version="1.0"/>
<refactoring comment="Rename field 'attachFileAction' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor' to 'attachAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.attachFileAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.attachAction'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'attachFileAction'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor^attachFileAction" name="attachAction" references="true" setter="true" stamp="1193369435928" textual="false" version="1.0"/>
<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createRefreshJob().new WorkbenchJob() {...}' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createRefreshJob()' to nested class
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createRefreshJob().new WorkbenchJob() {...}'
- Class name: 'TaskListRefreshJob'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" name="TaskListRefreshJob" selection="23094 0" stamp="1193425378449" static="false" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/43/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/43/refactorings.index
new file mode 100644
index 0000000..17bea16
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/43/refactorings.index
@@ -0,0 +1,9 @@
+1193174682888 Convert anonymous class to nested
+1193174853749 Extract constant 'ID_CONTEXT_TEXT_EDITOR'
+1193174879973 Extract constant 'ID_CONTEXT_TASK_EDITOR'
+1193174898497 Rename field 'ID_CONTEXT_TEXT_EDITOR'
+1193174960220 Rename field 'ID_CONTEXT_TASK_EDITOR'
+1193369111526 Rename type 'AttachFileAction'
+1193369435928 Rename field 'attachFileAction'
+1193425378449 Convert anonymous class to nested
+1193519565670 Extract method 'getSelectedTaskContainers'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/44/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/44/refactorings.history
new file mode 100644
index 0000000..e54a01f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/44/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.views'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.views'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.views" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1193614165616" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'com.tasktop.client/src/com.tasktop.client.ui.actions'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'com.tasktop.client/src/com.tasktop.client.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivityReportAction.java'" description="Copy compilation unit" destination="=com.tasktop.client/src<com.tasktop.client.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActivityReportAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1193747794373" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'com.tasktop.doc.ui.TasktopFeatureOverviewEditor.java'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'com.tasktop.doc.ui.TasktopFeatureOverviewEditor.java'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivityReportAction.java'" description="Copy compilation unit" destination="=com.tasktop.doc.ui/src<com.tasktop.doc.ui{TasktopFeatureOverviewEditor.java" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActivityReportAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1193747814839" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiInitializationJob.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiInitializationJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1193872294727" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/44/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/44/refactorings.index
new file mode 100644
index 0000000..2f10926
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/10/44/refactorings.index
@@ -0,0 +1,4 @@
+1193614165616 Copy compilation unit
+1193747794373 Copy compilation unit
+1193747814839 Copy compilation unit
+1193872294727 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/44/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/44/refactorings.history
new file mode 100644
index 0000000..8c9256c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'etool16'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'etool16'
- Original element: 'capture-screen.png'" description="Copy file" element1="icons/etool16/capture-screen.png" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1193941514577" target="/org.eclipse.mylyn.tasks.ui/icons/etool16" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/44/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/44/refactorings.index
new file mode 100644
index 0000000..b10cb55
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/44/refactorings.index
@@ -0,0 +1 @@
+1193941514577 Copy file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/45/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/45/refactorings.history
new file mode 100644
index 0000000..1dcb034
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/45/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'parent' from expression 'new Shell(PlatformUI.getWorkbench().getDisplay())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'parent'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationManager.new Job() {...}.run().new Runnable() {...}.run()'
- Variable expression: 'new Shell(PlatformUI.getWorkbench().getDisplay())'
- Replace occurrences of expression with variable" description="Extract local variable 'parent'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationManager.java" name="parent" replace="true" selection="2586 63" stamp="1194335778941" version="1.0"/>
<refactoring comment="Extract method 'private Composite createContentComposite(Composite parent)' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip.createToolTipContentArea()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createContentComposite'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip'
- Declared visibility: 'private'" comments="false" description="Extract method 'createContentComposite'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTip.java" name="createContentComposite" replace="false" selection="12640 319" stamp="1194389549836" version="1.0" visibility="2"/>
<refactoring comment="Rename local variable 'sleep' in 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.fade(...)' to 'speed'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.fade(Shell, boolean, int, int).sleep'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.fade(Shell, boolean, int, int).speed'
- Update references to refactored element" description="Rename local variable 'sleep'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui{SwtUtil.java[SwtUtil~fade~QShell;~Z~I~I at sleep!1227!1235!1231!1235!I" name="speed" references="true" stamp="1194470337871" version="1.0"/>
<refactoring comment="Rename local variable 'in' in 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.fade(...)' to 'fadeIn'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.fade(Shell, boolean, int, int).in'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.fade(Shell, boolean, int, int).fadeIn'
- Update references to refactored element" description="Rename local variable 'in'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui{SwtUtil.java[SwtUtil~fade~QShell;~Z~I~I at in!1193!1202!1201!1202!Z" name="fadeIn" references="true" stamp="1194470914156" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'icons'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'icons'
- Original element: 'repositories.gif'" description="Move file" element1="icons/eview16/repositories.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1194563390286" target="/org.eclipse.mylyn.sandbox.dev/icons" units="0" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.DelayedRefreshJob' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.DelayedRefreshJob'
- Field name: 'taskListView'
- Parameter name: 'taskListView'
- Declare field 'final'" description="Convert member type 'DelayedRefreshJob' to top level" field="true" fieldName="taskListView" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView[DelayedRefreshJob" mandatory="true" parameterName="taskListView" possible="true" stamp="1194662256080" version="1.0"/>
<refactoring comment="Extract method 'private void updateExpansionSTate(Object item)' from 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob.runInUIThread()' to 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'updateExpansionSTate'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateExpansionSTate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{DelayedRefreshJob.java" name="updateExpansionSTate" replace="false" selection="2635 109" stamp="1194662313755" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob.updateExpansionSTate(...)' to 'updateExpansionState'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob.updateExpansionSTate(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob.updateExpansionState(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateExpansionSTate'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{DelayedRefreshJob.java[DelayedRefreshJob~updateExpansionSTate~QObject;" name="updateExpansionState" references="true" stamp="1194662318459" version="1.0"/>
<refactoring comment="Extract method 'private void refresh(final Object[] items)' from 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob.runInUIThread()' to 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'refresh'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.DelayedRefreshJob'
- Declared visibility: 'private'" comments="false" description="Extract method 'refresh'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{DelayedRefreshJob.java" name="refresh" replace="false" selection="2285 471" stamp="1194662748537" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/45/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/45/refactorings.index
new file mode 100644
index 0000000..6c722a5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/45/refactorings.index
@@ -0,0 +1,9 @@
+1194335778941 Extract local variable 'parent'
+1194389549836 Extract method 'createContentComposite'
+1194470337871 Rename local variable 'sleep'
+1194470914156 Rename local variable 'in'
+1194563390286 Move file
+1194662256080 Convert member type 'DelayedRefreshJob' to top level
+1194662313755 Extract method 'updateExpansionSTate'
+1194662318459 Rename method 'updateExpansionSTate'
+1194662748537 Extract method 'refresh'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/46/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/46/refactorings.history
new file mode 100644
index 0000000..535a8c2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/46/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'etool16'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'etool16'
- Original element: 'task-new.gif'" description="Copy file" element1="icons/etool16/task-new.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1195110956176" target="/org.eclipse.mylyn.java.ui/icons/etool16" units="0" version="1.0"/>
<refactoring comment="Extract method 'private void updateToolTip()' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl().new ISelectionChangedListener() {...}.selectionChanged()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'updateToolTip'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateToolTip'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" name="updateToolTip" replace="false" selection="31498 277" stamp="1195271219294" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/46/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/46/refactorings.index
new file mode 100644
index 0000000..0b23996
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/46/refactorings.index
@@ -0,0 +1,2 @@
+1195110956176 Copy file
+1195271219294 Extract method 'updateToolTip'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/47/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/47/refactorings.history
new file mode 100644
index 0000000..93c78ca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/47/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'taskProvider' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AggregateLabelProvider' to 'taskLabelProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AggregateLabelProvider.taskProvider'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AggregateLabelProvider.taskLabelProvider'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'taskProvider'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[AggregateLabelProvider^taskProvider" name="taskLabelProvider" references="true" setter="true" stamp="1195522286587" textual="false" version="1.0"/>
<refactoring comment="Rename field 'workbenchProvider' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AggregateLabelProvider' to 'workbenchLabelProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AggregateLabelProvider.workbenchProvider'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AggregateLabelProvider.workbenchLabelProvider'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'workbenchProvider'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[AggregateLabelProvider^workbenchProvider" name="workbenchLabelProvider" references="true" setter="true" stamp="1195522291246" textual="false" version="1.0"/>
<refactoring comment="Rename local variable 'taskContainers' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.createControl(...).new ITreeContentProvider() {...}.getChildren(...)' to 'taskRepositories'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.createControl(...).new ITreeContentProvider() {...}.getChildren(Object).taskContainers'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.createControl(...).new ITreeContentProvider() {...}.getChildren(Object).taskRepositories'
- Update references to refactored element" description="Rename local variable 'taskContainers'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage~createControl~QComposite;[!2~getChildren~QObject;@taskContainers!9287!9348!9304!9317!QList" name="taskRepositories" references="true" stamp="1195522367495" version="1.0"/>
<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.createControl().new ITreeContentProvider() {...}' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.createControl()' to nested class
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.createControl().new ITreeContentProvider() {...}'
- Class name: 'WorkingSetPageContentProvider'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java" name="WorkingSetPageContentProvider" selection="9290 0" stamp="1195523613048" static="false" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'treeContentProvider' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage' to 'workingSetPageContentProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.treeContentProvider'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.workingSetPageContentProvider'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'treeContentProvider'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage^treeContentProvider" name="workingSetPageContentProvider" references="true" setter="true" stamp="1195523638087" textual="false" version="1.0"/>
<refactoring comment="Rename field 'tree' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage' to 'treeViewer'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.tree'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.treeViewer'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'tree'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage^tree" name="treeViewer" references="true" setter="true" stamp="1195523899165" textual="false" version="1.0"/>
<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1195524272928" version="1.0"/>
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.TaskRepositoryProjectMapping.taskRepository' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.TaskRepositoryProjectMapping'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.TaskRepositoryProjectMapping.taskRepository'
- Getter method name: 'getTaskRepository'
- Setter method name: 'setTaskRepository'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'taskRepository'" flags="589830" getter="getTaskRepository" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[TaskRepositoryProjectMapping^taskRepository" insertion="-1" setter="setTaskRepository" stamp="1195526956334" version="1.0" visibility="1"/>
<refactoring comment="Rename local variable 'taskContainers' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.getChildren(...)' to 'taskRepositoriesContainers'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.getChildren(Object).taskContainers'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.getChildren(Object).taskRepositoriesContainers'
- Update references to refactored element" description="Rename local variable 'taskContainers'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[WorkingSetPageContentProvider~getChildren~QObject;@taskContainers!4137!4198!4154!4167!QList" name="taskRepositoriesContainers" references="true" stamp="1195526985001" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromCommentAction' to 'NewTaskFromSelectionAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromCommentAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'NewTaskFromCommentAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewTaskFromCommentAction.java[NewTaskFromCommentAction" matchStrategy="1" name="NewTaskFromSelectionAction" qualified="false" references="true" similarDeclarations="false" stamp="1195669911172" textual="false" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.ORG_ECLIPSE_MYLYN_TASKS_UI_MENU_NEW' from expression '"org.eclipse.mylyn.tasks.ui.menu.new"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ORG_ECLIPSE_MYLYN_TASKS_UI_MENU_NEW'
- Constant expression: '"org.eclipse.mylyn.tasks.ui.menu.new"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ORG_ECLIPSE_MYLYN_TASKS_UI_MENU_NEW'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" name="ORG_ECLIPSE_MYLYN_TASKS_UI_MENU_NEW" qualify="false" replace="true" selection="39687 37" stamp="1195679367513" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.LINK_PROVIDER_TIMEOUT' from expression '5'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LINK_PROVIDER_TIMEOUT'
- Constant expression: '5'
- Declared visibility: 'private'" description="Extract constant 'LINK_PROVIDER_TIMEOUT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java" name="LINK_PROVIDER_TIMEOUT" qualify="false" replace="false" selection="35023 1" stamp="1195690416890" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'LINK_PROVIDER_TIMEOUT' in 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin' to 'LINK_PROVIDER_TIMEOUT_SECONDS'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.LINK_PROVIDER_TIMEOUT'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.LINK_PROVIDER_TIMEOUT_SECONDS'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'LINK_PROVIDER_TIMEOUT'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^LINK_PROVIDER_TIMEOUT" name="LINK_PROVIDER_TIMEOUT_SECONDS" references="true" setter="true" stamp="1195690426717" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.refreshAndFocus()' to 'refresh'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.refreshAndFocus()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.refresh()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'refreshAndFocus'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView~refreshAndFocus" name="refresh" references="true" stamp="1195693776294" version="1.0"/>
<refactoring comment="Rename field 'bugPage' in 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTableContentProvider' to 'searchResultsPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTableContentProvider.bugPage'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTableContentProvider.searchResultsPage'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'bugPage'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{SearchResultTableContentProvider.java[SearchResultTableContentProvider^bugPage" name="searchResultsPage" references="true" setter="true" stamp="1195855999769" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTableContentProvider' to 'SearchResultTreeContentProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTableContentProvider'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTreeContentProvider'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'SearchResultTableContentProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{SearchResultTableContentProvider.java[SearchResultTableContentProvider" matchStrategy="1" name="SearchResultTreeContentProvider" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1195856661425" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/47/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/47/refactorings.index
new file mode 100644
index 0000000..c717c81
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/47/refactorings.index
@@ -0,0 +1,16 @@
+1195522286587 Rename field 'taskProvider'
+1195522291246 Rename field 'workbenchProvider'
+1195522367495 Rename local variable 'taskContainers'
+1195523613048 Convert anonymous class to nested
+1195523638087 Rename field 'treeContentProvider'
+1195523899165 Rename field 'tree'
+1195524272928 Infer generic type arguments
+1195526956334 Encapsulate field 'taskRepository'
+1195526985001 Rename local variable 'taskContainers'
+1195669911172 Rename type 'NewTaskFromCommentAction'
+1195679367513 Extract constant 'ORG_ECLIPSE_MYLYN_TASKS_UI_MENU_NEW'
+1195690416890 Extract constant 'LINK_PROVIDER_TIMEOUT'
+1195690426717 Rename field 'LINK_PROVIDER_TIMEOUT'
+1195693776294 Rename method 'refreshAndFocus'
+1195855999769 Rename field 'bugPage'
+1195856661425 Rename type 'SearchResultTableContentProvider'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/48/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/48/refactorings.history
new file mode 100644
index 0000000..daead75
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/48/refactorings.history
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'activeTask2' from expression 'TasksUiPlugin.getTaskListManager().getTaskList().getActiveTask()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activeTask2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskTrimWidget.createStatusComposite().new MouseAdapter() {...}.mouseDown()'
- Variable expression: 'TasksUiPlugin.getTaskListManager().getTaskList().getActiveTask()'
- Replace occurrences of expression with variable" description="Extract local variable 'activeTask2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskTrimWidget.java" name="activeTask2" replace="true" selection="7622 71" stamp="1196284515789" version="1.0"/>
+<refactoring comment="Extract local variable 'fromActivePerspective' from expression 'TaskListView.getFromActivePerspective()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'fromActivePerspective'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskTrimWidget.createStatusComposite().new MouseAdapter() {...}.mouseDown()'
- Variable expression: 'TaskListView.getFromActivePerspective()'
- Replace occurrences of expression with variable" description="Extract local variable 'fromActivePerspective'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskTrimWidget.java" name="fromActivePerspective" replace="true" selection="7288 39" stamp="1196284610386" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tests/src/org.eclipse.mylyn.tests.manual'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tests/src/org.eclipse.mylyn.tests.manual'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.Main.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.tests/src<org.eclipse.mylyn.tests.manual" element1="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{Main.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196305999858" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tests/src/org.eclipse.mylyn.tests.manual'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tests/src/org.eclipse.mylyn.tests.manual'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.CustomNotificationPopup.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.tests/src<org.eclipse.mylyn.tests.manual" element1="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{CustomNotificationPopup.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196306085849" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationPopup.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196306193949" units="1" version="1.0"/>
+<refactoring comment="Rename field 'fShell' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'shell'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.fShell'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.shell'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fShell'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^fShell" name="shell" references="true" setter="true" stamp="1196306247106" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fDisplay' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'display'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.fDisplay'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.display'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fDisplay'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^fDisplay" name="display" references="true" setter="true" stamp="1196306262803" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fNotifierColors' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'notifierColors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.fNotifierColors'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.notifierColors'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fNotifierColors'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^fNotifierColors" name="notifierColors" references="true" setter="true" stamp="1196306267012" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fResources' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'resources'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.fResources'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.resources'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fResources'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^fResources" name="resources" references="true" setter="true" stamp="1196306279458" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fLastUsedRegion' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'lastUsedRegion'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.fLastUsedRegion'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.lastUsedRegion'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fLastUsedRegion'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^fLastUsedRegion" name="lastUsedRegion" references="true" setter="true" stamp="1196306362694" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationPopup.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskListNotificationPopup.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1196306398773" units="1" version="1.0"/>
+<refactoring comment="Extract method 'private void showPopup()' from 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationManager.new Job() {...}.run().new Runnable() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationManager.new Job() {...}.run().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'showPopup'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationManager.new Job() {...}.run().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'showPopup'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationManager.java" name="showPopup" replace="false" selection="2633 679" stamp="1196344236157" version="1.0" visibility="2"/>
+<refactoring comment="Rename local variable 'titleCircleLabel' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createTitleArea(...)' to 'titleTextLabel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createTitleArea(Composite).titleCircleLabel'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createTitleArea(Composite).titleTextLabel'
- Update references to refactored element" description="Rename local variable 'titleCircleLabel'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup~createTitleArea~QComposite;@titleCircleLabel!7526!7578!7532!7547!QLabel;" name="titleTextLabel" references="true" stamp="1196345950633" version="1.0"/>
+<refactoring comment="Rename local variable 'imageLabel' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createTitleArea(...)' to 'titleImageLabel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createTitleArea(Composite).imageLabel'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createTitleArea(Composite).titleImageLabel'
- Update references to refactored element" description="Rename local variable 'imageLabel'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup~createTitleArea~QComposite;@imageLabel!7303!7349!7309!7318!QLabel;" name="titleImageLabel" references="true" stamp="1196345958419" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotifierColors' to 'NotificationPopupColors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotifierColors'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'NotifierColors'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotifierColors.java[NotifierColors" matchStrategy="1" name="NotificationPopupColors" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1196346049096" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fDisplay' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors' to 'display'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.fDisplay'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.display'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fDisplay'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotificationPopupColors.java[NotificationPopupColors^fDisplay" name="display" references="true" setter="true" stamp="1196346082736" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fGradientBegin' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors' to 'gradientBegin'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.fGradientBegin'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.gradientBegin'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fGradientBegin'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotificationPopupColors.java[NotificationPopupColors^fGradientBegin" name="gradientBegin" references="true" setter="true" stamp="1196346086878" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fGradientEnd' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors' to 'gradientEnd'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.fGradientEnd'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.gradientEnd'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fGradientEnd'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotificationPopupColors.java[NotificationPopupColors^fGradientEnd" name="gradientEnd" references="true" setter="true" stamp="1196346092882" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fBorder' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors' to 'border'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.fBorder'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.border'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fBorder'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotificationPopupColors.java[NotificationPopupColors^fBorder" name="border" references="true" setter="true" stamp="1196346097100" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'fResources' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors' to 'resourceManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.fResources'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.resourceManager'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'fResources'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotificationPopupColors.java[NotificationPopupColors^fResources" name="resourceManager" references="true" setter="true" stamp="1196346103315" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'notifierColors' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'color'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.notifierColors'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.color'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'notifierColors'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^notifierColors" name="color" references="true" setter="true" stamp="1196346186827" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITaskListNotification.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITaskListNotification.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196347074956" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.notifications.ITaskListNotification' to 'AbstractNotification'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.ITaskListNotification'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ITaskListNotification'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{ITaskListNotification.java[ITaskListNotification" matchStrategy="1" name="AbstractNotification" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1196347093537" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.openTask()' to 'open'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.openTask()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.open()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotification.java[AbstractNotification~openTask" name="open" references="true" stamp="1196347244380" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/48/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/48/refactorings.index
new file mode 100644
index 0000000..d15943b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/11/48/refactorings.index
@@ -0,0 +1,24 @@
+1196284515789 Extract local variable 'activeTask2'
+1196284610386 Extract local variable 'fromActivePerspective'
+1196305999858 Move compilation unit
+1196306085849 Move compilation unit
+1196306193949 Move compilation unit
+1196306247106 Rename field 'fShell'
+1196306262803 Rename field 'fDisplay'
+1196306267012 Rename field 'fNotifierColors'
+1196306279458 Rename field 'fResources'
+1196306362694 Rename field 'fLastUsedRegion'
+1196306398773 Copy compilation unit
+1196344236157 Extract method 'showPopup'
+1196345950633 Rename local variable 'titleCircleLabel'
+1196345958419 Rename local variable 'imageLabel'
+1196346049096 Rename type 'NotifierColors'
+1196346082736 Rename field 'fDisplay'
+1196346086878 Rename field 'fGradientBegin'
+1196346092882 Rename field 'fGradientEnd'
+1196346097100 Rename field 'fBorder'
+1196346103315 Rename field 'fResources'
+1196346186827 Rename field 'notifierColors'
+1196347074956 Move compilation unit
+1196347093537 Rename type 'ITaskListNotification'
+1196347244380 Rename method 'openTask'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/48/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/48/refactorings.history
new file mode 100644
index 0000000..6a73bbc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/48/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private Object markReadGotoUnread()' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewCommands.activateHandlers().new AbstractHandler() {...}.execute()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewCommands'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'markReadGotoUnread'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewCommands'
- Declared visibility: 'private'" comments="false" description="Extract method 'markReadGotoUnread'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListViewCommands.java" name="markReadGotoUnread" replace="false" selection="4542 329" stamp="1196500063976" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/48/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/48/refactorings.index
new file mode 100644
index 0000000..552f14e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/48/refactorings.index
@@ -0,0 +1 @@
+1196500063976 Extract method 'markReadGotoUnread'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/49/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/49/refactorings.history
new file mode 100644
index 0000000..ce012ba
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/49/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationIncoming.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationIncoming.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196719925297" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationQueryIncoming.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationQueryIncoming.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196719974038" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationReminder.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationReminder.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1196719991079" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationIncoming' to 'TaskListNotification'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationIncoming'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotification'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskListNotificationIncoming'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskListNotificationIncoming.java[TaskListNotificationIncoming" matchStrategy="1" name="TaskListNotification" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1196720088257" textual="false" version="1.0"/>
<refactoring comment="Rename field 'hit' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationQueryIncoming' to 'task'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationQueryIncoming.hit'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationQueryIncoming.task'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'hit'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskListNotificationQueryIncoming.java[TaskListNotificationQueryIncoming^hit" name="task" references="true" setter="true" stamp="1196720267345" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.getOverlayIcon()' to 'getNotificationKindImage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.getOverlayIcon()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.getNotificationKindImage()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getOverlayIcon'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotification.java[AbstractNotification~getOverlayIcon" name="getNotificationKindImage" references="true" stamp="1196721778757" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.getNotificationIcon()' to 'getNotificationImage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.getNotificationIcon()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.getNotificationImage()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getNotificationIcon'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotification.java[AbstractNotification~getNotificationIcon" name="getNotificationImage" references="true" stamp="1196721789738" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'com.tasktop.client/src/com.tasktop.client.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'com.tasktop.client/src/com.tasktop.client.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityContentProvider.java'" description="Copy compilation unit" destination="=com.tasktop.client/src<com.tasktop.client.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1196743685269" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'com.tasktop.client/src/com.tasktop.client.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'com.tasktop.client/src/com.tasktop.client.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.PlannedTasksContentProvider.java'" description="Copy compilation unit" destination="=com.tasktop.client/src<com.tasktop.client.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.planner{PlannedTasksContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1196744161900" units="1" version="1.0"/>
<refactoring comment="Rename local variable 'link' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationPopup.createContentArea(...)' to 'itemLink'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationPopup.createContentArea(Composite).link'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationPopup.createContentArea(Composite).itemLink'
- Update references to refactored element" description="Rename local variable 'link'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskListNotificationPopup.java[TaskListNotificationPopup~createContentArea~QComposite;@link!2444!2539!2465!2468!QImageHyperlink;" name="itemLink" references="true" stamp="1196902495851" version="1.0"/>
<refactoring comment="Rename field 'CLOSE_POPUP_DELAY' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'DELAY_CLOSE'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.CLOSE_POPUP_DELAY'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.DELAY_CLOSE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'CLOSE_POPUP_DELAY'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^CLOSE_POPUP_DELAY" name="DELAY_CLOSE" references="true" setter="true" stamp="1196903531653" textual="false" version="1.0"/>


<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink.TaskListHyperlink().new MouseTrackListener() {...}' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink.TaskListHyperlink()' to nested class
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink.TaskListHyperlink().new MouseTrackListener() {...}'
- Class name: 'MOUSE_TRACK_LISTENER'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListHyperlink.java" name="MOUSE_TRACK_LISTENER" selection="1277 0" stamp="1196904553966" static="false" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'PADDING_EDGE' from expression '10'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'PADDING_EDGE'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.initializeBounds()'
- Variable expression: '10'
- Replace occurrences of expression with variable" description="Extract local variable 'PADDING_EDGE'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java" name="PADDING_EDGE" replace="true" selection="11668 2" stamp="1196905018641" version="1.0"/>
<refactoring comment="Rename field 'DELAY_CLOSE' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'DEFAULT_DELAY_CLOSE'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.DELAY_CLOSE'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.DEFAULT_DELAY_CLOSE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'DELAY_CLOSE'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^DELAY_CLOSE" name="DEFAULT_DELAY_CLOSE" references="true" setter="true" stamp="1196905626083" textual="false" version="1.0"/>
<refactoring comment="Rename field 'newBGImage' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createContents(...).new ControlAdapter() {...}' to 'latestBgImage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createContents(...).new ControlAdapter() {...}.newBGImage'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.createContents(...).new ControlAdapter() {...}.latestBgImage'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'newBGImage'" flags="851970" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup~createContents~QComposite;[^newBGImage" name="latestBgImage" references="true" setter="true" stamp="1196970360776" textual="false" version="1.0"/>
<refactoring comment="Rename field 'latestBgImage' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup' to 'lastUsedBgImage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.latestBgImage'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.lastUsedBgImage'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'latestBgImage'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java[AbstractNotificationPopup^latestBgImage" name="lastUsedBgImage" references="true" setter="true" stamp="1196970426397" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/49/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/49/refactorings.index
new file mode 100644
index 0000000..3d95ddc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/49/refactorings.index
@@ -0,0 +1,16 @@
+1196719925297 Move compilation unit
+1196719974038 Move compilation unit
+1196719991079 Move compilation unit
+1196720088257 Rename type 'TaskListNotificationIncoming'
+1196720267345 Rename field 'hit'
+1196721778757 Rename method 'getOverlayIcon'
+1196721789738 Rename method 'getNotificationIcon'
+1196743685269 Copy compilation unit
+1196744161900 Copy compilation unit
+1196902495851 Rename local variable 'link'
+1196903531653 Rename field 'CLOSE_POPUP_DELAY'
+1196904553966 Convert anonymous class to nested
+1196905018641 Extract local variable 'PADDING_EDGE'
+1196905626083 Rename field 'DELAY_CLOSE'
+1196970360776 Rename field 'newBGImage'
+1196970426397 Rename field 'latestBgImage'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/50/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/50/refactorings.history
new file mode 100644
index 0000000..1de7335
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private boolean extracted(Shell shell)' from 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.new Job() {...}.run().new Runnable() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.new Job() {...}.run().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'extracted'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.new Job() {...}.run().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'extracted'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java" name="extracted" replace="false" selection="3020 55" stamp="1197581366830" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/50/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/50/refactorings.index
new file mode 100644
index 0000000..f88fdb8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/50/refactorings.index
@@ -0,0 +1 @@
+1197581366830 Extract method 'extracted'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..da9ab81
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.EditorInteractionMonitor' to 'TaskEditorCloseManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.EditorInteractionMonitor'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskEditorCloseManager'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'EditorInteractionMonitor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{EditorInteractionMonitor.java[EditorInteractionMonitor" matchStrategy="1" name="TaskEditorCloseManager" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1198021700449" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TaskEditorCloseManager' to 'TaskEditorBloatMonitor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskEditorCloseManager'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskEditorBloatMonitor'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskEditorCloseManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskEditorCloseManager.java[TaskEditorCloseManager" matchStrategy="1" name="TaskEditorBloatMonitor" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1198021829142" textual="false" version="1.0"/>
<refactoring comment="Rename field 'taskEditorCloseManager' in 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin' to 'taskEditorBloatManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.taskEditorCloseManager'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.taskEditorBloatManager'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'taskEditorCloseManager'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^taskEditorCloseManager" name="taskEditorBloatManager" references="true" setter="true" stamp="1198022044554" textual="false" version="1.0"/>
<refactoring comment="Rename field 'CATEGORY_ARCHIVE' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'QUERY_UNMATCHED'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.CATEGORY_ARCHIVE'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.QUERY_UNMATCHED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'CATEGORY_ARCHIVE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^CATEGORY_ARCHIVE!2" name="QUERY_UNMATCHED" references="true" setter="true" stamp="1198118279832" textual="false" version="1.0"/>
<refactoring comment="Extract method 'private void activate(final RepositoryTextViewer commentViewer,final IHandlerService handlerService)' from 'org.eclipse.mylyn.tasks.ui.editors.TaskFormPage.addTextEditor().new FocusListener() {...}.focusGained()' to 'org.eclipse.mylyn.tasks.ui.editors.TaskFormPage.addTextEditor().new FocusListener() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'activate'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.TaskFormPage.addTextEditor().new FocusListener() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'activate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskFormPage.java" name="activate" replace="false" selection="13088 275" stamp="1198123664184" version="1.0" visibility="2"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.ui/icons/etool16/task-query-unmatched.gif' to 'query-unmatched.gif'" description="Rename resource 'task-query-unmatched.gif'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="icons/etool16/task-query-unmatched.gif" name="query-unmatched.gif" stamp="1198126009220" updateReferences="true"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..4698de3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1,6 @@
+1198021700449 Rename type 'EditorInteractionMonitor'
+1198021829142 Rename type 'TaskEditorCloseManager'
+1198022044554 Rename field 'taskEditorCloseManager'
+1198118279832 Rename field 'CATEGORY_ARCHIVE'
+1198123664184 Extract method 'activate'
+1198126009220 Rename resource 'task-query-unmatched.gif'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/5/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/5/refactorings.history
new file mode 100644
index 0000000..1b47f79
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/5/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar' to 'WorkweekProgressBar' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskProgressBar' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.WorkweekProgressBar' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskProgressBar'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskProgressBar.java[TaskProgressBar" matchStrategy="1" name="WorkweekProgressBar" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170450276319" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'TaskListFilteredTree.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/tasks/ui/views/TaskListFilteredTree.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1170543795812" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.IRepositoryTaskSelection.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{IRepositoryTaskSelection.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170544615078" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttributeLayout(...)' to 'createAttributeSection' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttributeLayout(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttributeSection(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createAttributeLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createAttributeLayout~QComposite;" name="createAttributeSection" references="true" stamp="1170546421031" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/5/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/5/refactorings.index
new file mode 100644
index 0000000..6e98fab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/5/refactorings.index
@@ -0,0 +1,4 @@
+1170450276319 Rename type 'TaskProgressBar'
+1170543795812 Delete element
+1170544615078 Delete element
+1170546421031 Rename method 'createAttributeLayout'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..b1cc7f5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'newTaskData' in 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput' to 'editableTaskData' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.newTaskData' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.editableTaskData' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'newTaskData'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractTaskEditorInput.java[AbstractTaskEditorInput^newTaskData" name="editableTaskData" references="true" setter="false" stamp="1170609845218" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.setNewTaskData(...)' to 'setEditableTaskData' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.setNewTaskData(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.setEditableTaskData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setNewTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractTaskEditorInput.java[AbstractTaskEditorInput~setNewTaskData~QRepositoryTaskData;" name="setEditableTaskData" references="true" stamp="1170609928171" version="1.0"/>
+<refactoring comment="Rename local variable 'newTaskData' in 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.setEditableTaskData(...)' to 'editableTaskData' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.setEditableTaskData(RepositoryTaskData).newTaskData' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractTaskEditorInput.setEditableTaskData(RepositoryTaskData).editableTaskData' - Update references to refactored element" description="Rename local variable 'newTaskData'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractTaskEditorInput.java" name="editableTaskData" references="true" selection="2572 11" stamp="1170609939093" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveIncomingChanges(...)' to 'saveIncoming' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveIncomingChanges(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveIncoming(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveIncomingChanges'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{RepositorySynchronizationManager.java[RepositorySynchronizationManager~saveIncomingChanges~QAbstractRepositoryTask;~QRepositoryTaskData;~Z" name="saveIncoming" references="true" stamp="1170708664140" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveOutgoingChanges(...)' to 'saveOutgoing' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveOutgoingChanges(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.saveOutgoing(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'saveOutgoingChanges'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{RepositorySynchronizationManager.java[RepositorySynchronizationManager~saveOutgoingChanges~QAbstractRepositoryTask;~QSet\<QRepositoryTaskAttribute;>;" name="saveOutgoing" references="true" stamp="1170708685078" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.LABEL_NAME' to 'SECTION_NAME' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.LABEL_NAME' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.SECTION_NAME' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'LABEL_NAME'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor[LABEL_NAME" matchStrategy="1" name="SECTION_NAME" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1170963035515" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.getLabel(...)' to 'getSectionLabel' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.getLabel(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.getSectionLabel(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLabel'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~getLabel~QSECTION_NAME;" name="getSectionLabel" references="true" stamp="1170963257265" version="1.0"/>
+<refactoring comment="Rename field 'labelMap' in 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'alternateSectionLabels' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.labelMap' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.alternateSectionLabels' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'labelMap'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^labelMap" name="alternateSectionLabels" references="true" setter="false" stamp="1170966175890" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..421fc9e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,8 @@
+1170609845218 Rename field 'newTaskData'
+1170609928171 Rename method 'setNewTaskData'
+1170609939093 Rename local variable 'newTaskData'
+1170708664140 Rename method 'saveIncomingChanges'
+1170708685078 Rename method 'saveOutgoingChanges'
+1170963035515 Rename type 'LABEL_NAME'
+1170963257265 Rename method 'getLabel'
+1170966175890 Rename field 'labelMap'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..9121447
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private static ITask getTask(String fullUrl,ITask task)' from 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openRepositoryTask()' to 'org.eclipse.mylar.tasks.ui.TasksUiUtil' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'getTask' - Destination type: 'org.eclipse.mylar.tasks.ui.TasksUiUtil' - Declared visibility: 'private'" comments="false" description="Extract method 'getTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java" name="getTask" replace="false" selection="5702 353" stamp="1171570223155" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.LABEL_TASK_DEFAULT' from expression '"Task"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'LABEL_TASK_DEFAULT' - Constant expression: '"Task"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_TASK_DEFAULT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java" name="LABEL_TASK_DEFAULT" qualify="false" replace="true" selection="2218 6" stamp="1171661106343" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..4c0906e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1,2 @@
+1171570223155 Extract method 'getTask'
+1171661106343 Extract constant 'LABEL_TASK_DEFAULT'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..fb3ff9e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.LABEL_REPLY' from expression '"reply"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'LABEL_REPLY' - Constant expression: '"reply"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_REPLY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="LABEL_REPLY" qualify="false" replace="true" selection="66071 7" stamp="1172081063140" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.editors.TaskPlanningEditor.LABEL_DUE' from expression '"Due:"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'LABEL_DUE' - Constant expression: '"Due:"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_DUE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskPlanningEditor.java" name="LABEL_DUE" qualify="false" replace="true" selection="15237 6" stamp="1172090425843" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.LABEL_HISTORY' from expression '"History"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'LABEL_HISTORY' - Constant expression: '"History"' - Declared visibility: 'private'" description="Extract constant 'LABEL_HISTORY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="LABEL_HISTORY" qualify="false" replace="false" selection="29080 9" stamp="1172174946312" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'TASK_REPOSITORY_HISOTRY' in 'org.eclipse.mylar.internal.tasks.ui.TaskListImages' to 'TASK_REPOSITORY_HISTORY' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages.TASK_REPOSITORY_HISOTRY' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages.TASK_REPOSITORY_HISTORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TASK_REPOSITORY_HISOTRY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListImages.java[TaskListImages^TASK_REPOSITORY_HISOTRY" name="TASK_REPOSITORY_HISTORY" references="true" setter="false" stamp="1172175260640" textual="true" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.isOverdue(...)' to 'isDue' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isOverdue(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isDue(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isOverdue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~isOverdue~QITask;" name="isDue" references="true" stamp="1172188979359" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..9e6a88d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,5 @@
+1172081063140 Extract constant 'LABEL_REPLY'
+1172090425843 Extract constant 'LABEL_DUE'
+1172174946312 Extract constant 'LABEL_HISTORY'
+1172175260640 Rename field 'TASK_REPOSITORY_HISOTRY'
+1172188979359 Rename method 'isOverdue'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/9/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/9/refactorings.history
new file mode 100644
index 0000000..5eb5ecd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/9/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.editors.TaskPlanningEditor.CLEAR' from expression '"clear"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'CLEAR' - Constant expression: '"clear"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'CLEAR'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskPlanningEditor.java" name="CLEAR" qualify="false" replace="true" selection="20642 7" stamp="1172534014687" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.PreviousTaskDropDownAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{PreviousTaskDropDownAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{PreviousTaskDropDownAction.java	true	true	ModelSelectAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1172621224656" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.ModelSelectionAction' to 'ModelDropDownSelectionAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.ModelSelectionAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.ModelDropDownSelectionAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ModelSelectionAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{ModelSelectionAction.java[ModelSelectionAction" matchStrategy="1" name="ModelDropDownSelectionAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1172621592796" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskActivityContentProvider.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.views" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityContentProvider.java	true	true	CopyOfTaskActivityContentProvider.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1172705177515" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/9/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/9/refactorings.index
new file mode 100644
index 0000000..526fd1d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/2/9/refactorings.index
@@ -0,0 +1,4 @@
+1172534014687 Extract constant 'CLEAR'
+1172621224656 Copy compilation unit
+1172621592796 Rename type 'ModelSelectionAction'
+1172705177515 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/10/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/10/refactorings.history
new file mode 100644
index 0000000..6b0424f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/10/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.BugzillaTaskHyperlinkDetector' to 'TaskHyperlinkDetector' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.BugzillaTaskHyperlinkDetector' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskHyperlinkDetector' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'BugzillaTaskHyperlinkDetector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{BugzillaTaskHyperlinkDetector.java[BugzillaTaskHyperlinkDetector" matchStrategy="1" name="TaskHyperlinkDetector" qualified="false" references="true" similarDeclarations="true" stamp="1173413463734" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui.editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.AbstractTaskHyperlinkDetector.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.ui.editors" element1="/src<org.eclipse.mylar.internal.tasks.ui{AbstractTaskHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1173417314406" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/10/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/10/refactorings.index
new file mode 100644
index 0000000..41c5f8f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/10/refactorings.index
@@ -0,0 +1,2 @@
+1173413463734 Rename type 'BugzillaTaskHyperlinkDetector'
+1173417314406 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/11/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/11/refactorings.history
new file mode 100644
index 0000000..387515d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/11/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename local variable 'parentBacground' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.TaskListTableLabelProvider(...)' to 'parentBackground' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.TaskListTableLabelProvider(ILabelProvider, ILabelDecorator, Color, TaskListView).parentBacground' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.TaskListTableLabelProvider(ILabelProvider, ILabelDecorator, Color, TaskListView).parentBackground' - Update references to refactored element" description="Rename local variable 'parentBacground'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java" name="parentBackground" references="true" selection="2428 15" stamp="1173849957815" version="1.0"/>
+<refactoring comment="Rename field 'PREFS_PAGE_ID_NET' in 'org.eclipse.mylar.tasks.ui.TasksUiUtil' to 'PREFS_PAGE_ID_NET_PROXY' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.PREFS_PAGE_ID_NET' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.PREFS_PAGE_ID_NET_PROXY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PREFS_PAGE_ID_NET'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java[TasksUiUtil^PREFS_PAGE_ID_NET" name="PREFS_PAGE_ID_NET_PROXY" references="true" setter="false" stamp="1173902293355" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'adjust' in 'org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage.addProxySection()' to 'changeProxySettings' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage.addProxySection().adjust' - Renamed element: 'org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage.addProxySection().changeProxySettings' - Update references to refactored element" description="Rename local variable 'adjust'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasks.ui.wizards{AbstractRepositorySettingsPage.java" name="changeProxySettings" references="true" selection="18165 6" stamp="1173902467830" version="1.0"/>
+<refactoring comment="Rename local variable 'changeProxySettings' in 'org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage.addProxySection()' to 'changeProxySettingsLink' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage.addProxySection().changeProxySettings' - Renamed element: 'org.eclipse.mylar.tasks.ui.wizards.AbstractRepositorySettingsPage.addProxySection().changeProxySettingsLink' - Update references to refactored element" description="Rename local variable 'changeProxySettings'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylar.tasks.ui.wizards{AbstractRepositorySettingsPage.java" name="changeProxySettingsLink" references="true" selection="18165 19" stamp="1173902475514" version="1.0"/>
+<refactoring comment="Rename field 'CATEGORY_GRADIENT_END' in 'org.eclipse.mylar.internal.tasks.ui.TaskListColorsAndFonts' to 'COLOR_CATEGORY_GRADIENT_END' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListColorsAndFonts.CATEGORY_GRADIENT_END' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskListColorsAndFonts.COLOR_CATEGORY_GRADIENT_END' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'CATEGORY_GRADIENT_END'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^CATEGORY_GRADIENT_END" name="COLOR_CATEGORY_GRADIENT_END" references="true" setter="false" stamp="1174068724452" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'CATEGORY_GRADIENT_BG' in 'org.eclipse.mylar.internal.tasks.ui.TaskListColorsAndFonts' to 'COLOR_CATEGORY_GRADIENT_BG' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListColorsAndFonts.CATEGORY_GRADIENT_BG' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskListColorsAndFonts.COLOR_CATEGORY_GRADIENT_BG' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'CATEGORY_GRADIENT_BG'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^CATEGORY_GRADIENT_BG" name="COLOR_CATEGORY_GRADIENT_BG" references="true" setter="false" stamp="1174068730472" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/11/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/11/refactorings.index
new file mode 100644
index 0000000..a874a93
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/11/refactorings.index
@@ -0,0 +1,6 @@
+1173849957815 Rename local variable 'parentBacground'
+1173902293355 Rename field 'PREFS_PAGE_ID_NET'
+1173902467830 Rename local variable 'adjust'
+1173902475514 Rename local variable 'changeProxySettings'
+1174068724452 Rename field 'CATEGORY_GRADIENT_END'
+1174068730472 Rename field 'CATEGORY_GRADIENT_BG'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..1201db2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylar.internal.tasks.ui.views.ITaskListPresentation' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation' - Extracted interface: 'org.eclipse.mylar.internal.tasks.ui.views.ITaskListPresentation' - Extracted members: org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getLabelProvider(...) org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getCellModifier() org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getCellEditors(...) org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getContentProvider() org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getColumnNames() org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getColumnWidths() org.eclipse.mylar.internal.tasks.ui.views.TaskListView.TaskListPresentation.getPresentationName() - Use super type where possible" comments="true" description="Extract interface 'ITaskListPresentation'" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getLabelProvider~QILabelProvider;~QILabelDecorator;~QColor;~QTaskListView;" element2="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getCellModifier" element3="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getCellEditors~QTreeViewer;" element4="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getContentProvider" element5="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getColumnNames" element6="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getPresentation" element7="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation~getPresentationName" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[TaskListPresentation" instanceof="false" name="ITaskListPresentation" public="true" replace="true" stamp="1174338528484" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.ModelDropDownSelectionAction' to 'PresentationDropDownSelectionAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.ModelDropDownSelectionAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.PresentationDropDownSelectionAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'ModelDropDownSelectionAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{ModelDropDownSelectionAction.java[ModelDropDownSelectionAction" matchStrategy="1" name="PresentationDropDownSelectionAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1174340240500" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskActivityLabelProvider.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.views" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityLabelProvider.java	true	true	TaskActivityViewLabelProvider.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1174350167171" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskActivityViewLabelProvider.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityViewLabelProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1174406167140" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.PresentationDropDownSelectionAction.ModelSelectionAction' to 'PresentationSelectionAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.PresentationDropDownSelectionAction.ModelSelectionAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.PresentationDropDownSelectionAction.PresentationSelectionAction' - Update references to refactored element - Rename similarly named elements - Update textual occurrences in comments and strings" description="Rename type 'ModelSelectionAction'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{PresentationDropDownSelectionAction.java[PresentationDropDownSelectionAction[ModelSelectionAction" matchStrategy="1" name="PresentationSelectionAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1174406187437" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskActivityContentProvider' to 'TaskScheduleContentProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskActivityContentProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskScheduleContentProvider' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'TaskActivityContentProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityContentProvider.java[TaskActivityContentProvider" matchStrategy="1" name="TaskScheduleContentProvider" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1174407911781" textual="true" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.sandbox/src/org.eclipse.mylar.internal.sandbox.views' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.sandbox/src/org.eclipse.mylar.internal.sandbox.views' - Original elements: org.eclipse.mylar.internal.tasks.ui.views.TaskActivityView.java org.eclipse.mylar.internal.tasks.ui.views.TaskActivityViewSorter.java org.eclipse.mylar.internal.tasks.ui.views.TaskActivityViewContentProvider.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.sandbox.views" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityView.java" element2="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityViewSorter.java" element3="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityViewContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1174419634171" units="3" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'eview16' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'eview16' - Original element: 'task-activity.gif'" description="Copy file" element1="icons/eview16/task-activity.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/eview16/task-activity.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1174419979203" target="/org.eclipse.mylar.sandbox/icons/eview16" units="0" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.setScheduledToday(...)' to 'setScheduledEndOfDay' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.setScheduledToday(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.setScheduledEndOfDay(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setScheduledToday'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~setScheduledToday~QCalendar;" name="setScheduledEndOfDay" references="true" stamp="1174421208453" version="1.0"/>
+<refactoring comment="Extract method 'private void addCategoryGradientDrawing(Color gradientStart,Color gradientEnd)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'addCategoryGradientDrawing' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' - Declared visibility: 'private'" comments="false" description="Extract method 'addCategoryGradientDrawing'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java" name="addCategoryGradientDrawing" replace="false" selection="30992 1084" stamp="1174521644578" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'gradientStart' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'categoryGradientStart' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.gradientStart' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.categoryGradientStart' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'gradientStart'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^gradientStart" name="categoryGradientStart" references="true" setter="false" stamp="1174521799888" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'gradientEnd' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'categoryGradientEnd' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.gradientEnd' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.categoryGradientEnd' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'gradientEnd'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^gradientEnd" name="categoryGradientEnd" references="true" setter="false" stamp="1174521809722" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'thememanager' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'themeManager' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.thememanager' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.themeManager' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'thememanager'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^thememanager" name="themeManager" references="true" setter="false" stamp="1174521885309" textual="false" version="1.0"/>
+<refactoring comment="Convert anonymous class 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.addCategoryGradientDrawing().new Listener() {...}' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.addCategoryGradientDrawing()' to nested class - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.addCategoryGradientDrawing().new Listener() {...}' - Class name: 'CATEGORY_GRADIENT_DRAWER' - Declared visibility: 'private' - Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java" name="CATEGORY_GRADIENT_DRAWER" selection="31611 0" stamp="1174522850508" static="false" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.OpenTaskRepositoriesViewAction' to 'ShowTaskRepositoriesViewAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.OpenTaskRepositoriesViewAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.ShowTaskRepositoriesViewAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'OpenTaskRepositoriesViewAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenTaskRepositoriesViewAction.java[OpenTaskRepositoriesViewAction" matchStrategy="1" name="ShowTaskRepositoriesViewAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1174607409568" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'BANNER_EXPORT' in 'org.eclipse.mylar.internal.tasks.ui.TaskListImages' to 'BANNER_IMPORT' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages.BANNER_EXPORT' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages.BANNER_IMPORT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'BANNER_EXPORT'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListImages.java[TaskListImages^BANNER_EXPORT" name="BANNER_IMPORT" references="true" setter="false" stamp="1174608124284" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.tasks.ui.search.SearchHitCollector.MAX_HITS_REACHED' from expression '"Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope."' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'MAX_HITS_REACHED' - Constant expression: '"Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope."' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'MAX_HITS_REACHED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.tasks.ui.search{SearchHitCollector.java" name="MAX_HITS_REACHED" qualify="false" replace="true" selection="3127 106" stamp="1174681263625" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.search.SearchHitCollector.MAX_HITS_REACHED' to 'org.eclipse.mylar.tasks.ui.TasksUiPlugin' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.search.SearchHitCollector.MAX_HITS_REACHED' - Destination type: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin'" delegate="false" deprecate="false" description="Move member 'MAX_HITS_REACHED'" element1="/src<org.eclipse.mylar.tasks.ui.search{SearchHitCollector.java[SearchHitCollector^MAX_HITS_REACHED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin" stamp="1174681283828" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.MAX_HITS' to 'org.eclipse.mylar.tasks.core.QueryHitCollector' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiPlugin.MAX_HITS' - Destination type: 'org.eclipse.mylar.tasks.core.QueryHitCollector'" delegate="false" deprecate="false" description="Move member 'MAX_HITS'" element1="/src<org.eclipse.mylar.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^MAX_HITS" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.tasks.core{QueryHitCollector.java[QueryHitCollector" stamp="1174700588078" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.OpenWithBrowserAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenWithBrowserAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{OpenWithBrowserAction.java	true	true	RefreshEditorAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1174718747046" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RefreshEditorAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{RefreshEditorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{RefreshEditorAction.java	true	true	SubmitChangesAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1174724207578" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.SubmitChangesAction.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{SubmitChangesAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1174724377859" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.TaskEditor.refresh()' to 'refreshEditorContents' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.TaskEditor.refresh()' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.TaskEditor.refreshEditorContents()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'refresh'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{TaskEditor.java[TaskEditor~refresh" name="refreshEditorContents" references="true" stamp="1174761678781" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.updateEditor()' to 'refreshEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.updateEditor()' - Renamed element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.refreshEditor()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~updateEditor" name="refreshEditor" references="true" stamp="1174761857921" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..83598e7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1,24 @@
+1174338528484 Extract interface 'ITaskListPresentation'
+1174340240500 Rename type 'ModelDropDownSelectionAction'
+1174350167171 Copy compilation unit
+1174406167140 Delete element
+1174406187437 Rename type 'ModelSelectionAction'
+1174407911781 Rename type 'TaskActivityContentProvider'
+1174419634171 Move compilation units
+1174419979203 Copy file
+1174421208453 Rename method 'setScheduledToday'
+1174521644578 Extract method 'addCategoryGradientDrawing'
+1174521799888 Rename field 'gradientStart'
+1174521809722 Rename field 'gradientEnd'
+1174521885309 Rename field 'thememanager'
+1174522850508 Convert anonymous class to nested
+1174607409568 Rename type 'OpenTaskRepositoriesViewAction'
+1174608124284 Rename field 'BANNER_EXPORT'
+1174681263625 Extract constant 'MAX_HITS_REACHED'
+1174681283828 Move member 'MAX_HITS_REACHED'
+1174700588078 Move member 'MAX_HITS'
+1174718747046 Copy compilation unit
+1174724207578 Copy compilation unit
+1174724377859 Delete element
+1174761678781 Rename method 'refresh'
+1174761857921 Rename method 'updateEditor'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..79a914f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.RefreshEditorAction' to 'SynchronizeEditorAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.RefreshEditorAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.SynchronizeEditorAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'RefreshEditorAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{RefreshEditorAction.java[RefreshEditorAction" matchStrategy="1" name="SynchronizeEditorAction" patterns="*.xml" qualified="true" references="true" similarDeclarations="true" stamp="1174949902500" textual="true" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylar.internal.tasks.ui.AbstractTaskListFilter.select(Object element)' to 'public boolean select(Object parent, Object element)' - Original project: 'org.eclipse.mylar.tasks.ui' - Added parameters: Object parent" default1="null" delegate="false" deprecate="true" description="Change method 'select'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui{AbstractTaskListFilter.java[AbstractTaskListFilter~select~QObject;" name="select" parameter1=" -1 Object parent false" parameter2="Object element 0 Object element false" stamp="1175031802969" version="1.0"/>
+<refactoring comment="Convert anonymous class 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout().new IStructuredContentProvider() {...}' in 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout()' to nested class - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createAttachmentLayout().new IStructuredContentProvider() {...}' - Class name: 'AttachmentsTableContentProvider' - Declared visibility: 'private' - Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="AttachmentsTableContentProvider" selection="42358 0" stamp="1175128576427" static="false" version="1.0" visibility="2"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AttachmentsTableContentProvider.java'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.ui.editors{AttachmentsTableContentProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1175128823416" subPackages="false" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.AttachmentTableLabelProvider' in 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' to top level type - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.AttachmentTableLabelProvider' - Field name: 'abstractRepositoryTaskEditor' - Parameter name: 'abstractRepositoryTaskEditor' - Declare field 'final'" description="Convert member type 'AttachmentTableLabelProvider' to top level" field="true" fieldName="abstractRepositoryTaskEditor" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor[AttachmentTableLabelProvider" mandatory="true" parameterName="abstractRepositoryTaskEditor" possible="true" stamp="1175130506522" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/etool16/apply-patch.gif' to 'attachment-patch' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'apply-patch.gif'" description="Rename resource 'apply-patch.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/apply-patch.gif" name="attachment-patch" stamp="1175185987058" version="1.0"/>
+<refactoring comment="Extract method 'private void retrieveContext()' from 'org.eclipse.mylar.internal.tasks.ui.wizards.ContextRetrieveWizard.performFinish()' to 'org.eclipse.mylar.internal.tasks.ui.wizards.ContextRetrieveWizard' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'retrieveContext' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.wizards.ContextRetrieveWizard' - Declared visibility: 'private'" comments="false" description="Extract method 'retrieveContext'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{ContextRetrieveWizard.java" name="retrieveContext" replace="false" selection="2252 1155" stamp="1175186528017" version="1.0" visibility="2"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/etool16/attachment-patch' to 'attachment-patch.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'attachment-patch'" description="Rename resource 'attachment-patch'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/attachment-patch" name="attachment-patch.gif" stamp="1175187859108" version="1.0"/>
+<refactoring comment="Extract method 'private void setFormHeaderLabel()' from 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.createFormContent()' to 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'setFormHeaderLabel' - Destination type: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'setFormHeaderLabel'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="setFormHeaderLabel" replace="false" selection="22224 370" stamp="1175203640312" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.TaskListImages' to 'TasksUiImages' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImages' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListImages'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskListImages.java[TaskListImages" matchStrategy="1" name="TasksUiImages" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1175262589620" textual="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/editor16/browser-medium.gif' to 'browser-small.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'browser-medium.gif'" description="Rename resource 'browser-medium.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/editor16/browser-medium.gif" name="browser-small.gif" stamp="1175306619001" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/editor16/planning-medium.gif' to 'planning-small.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'planning-medium.gif'" description="Rename resource 'planning-medium.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/editor16/planning-medium.gif" name="planning-small.gif" stamp="1175306626644" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'obj16' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'obj16' - Original elements: browser-small.gif planning-small.gif" description="Move files" element1="icons/editor16/browser-small.gif" element2="icons/editor16/planning-small.gif" files="2" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1175306631007" target="/org.eclipse.mylar.tasks.ui/icons/obj16" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'editor16'" description="Delete element" element1="icons/editor16" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1175306634674" subPackages="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/obj16/planning-small.gif' to 'calendar-small.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'planning-small.gif'" description="Rename resource 'planning-small.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/obj16/planning-small.gif" name="calendar-small.gif" stamp="1175307053988" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..f0a2132
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1,15 @@
+1174949902500 Rename type 'RefreshEditorAction'
+1175031802969 Change method 'select'
+1175128576427 Convert anonymous class to nested
+1175128823416 Delete element
+1175130506522 Convert member type 'AttachmentTableLabelProvider' to top level
+1175185987058 Rename resource 'apply-patch.gif'
+1175186528017 Extract method 'retrieveContext'
+1175187859108 Rename resource 'attachment-patch'
+1175203640312 Extract method 'setFormHeaderLabel'
+1175262589620 Rename type 'TaskListImages'
+1175306619001 Rename resource 'browser-medium.gif'
+1175306626644 Rename resource 'planning-medium.gif'
+1175306631007 Move files
+1175306634674 Delete element
+1175307053988 Rename resource 'planning-small.gif'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/9/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/9/refactorings.history
new file mode 100644
index 0000000..c55dcb8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/9/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListContentProvider.getDescription()' to 'getLabel' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListContentProvider.getDescription()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListContentProvider.getLabel()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListContentProvider.java[TaskListContentProvider~getDescription" name="getLabel" references="true" stamp="1172786255053" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.views.TaskActivityContentProvider.LABEL_ACTIVITY' from expression '"Activity"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'LABEL_ACTIVITY' - Constant expression: '"Activity"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_ACTIVITY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskActivityContentProvider.java" name="LABEL_ACTIVITY" qualify="false" replace="true" selection="2192 10" stamp="1172786336787" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TaskListManager.isDue(...)' to 'isOverdue' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isDue(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TaskListManager.isOverdue(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isDue'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java[TaskListManager~isDue~QITask;" name="isOverdue" references="true" stamp="1172859106208" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/9/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/9/refactorings.index
new file mode 100644
index 0000000..b950460
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/3/9/refactorings.index
@@ -0,0 +1,3 @@
+1172786255053 Rename method 'getDescription'
+1172786336787 Extract constant 'LABEL_ACTIVITY'
+1172859106208 Rename method 'isDue'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/15/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/15/refactorings.history
new file mode 100644
index 0000000..d7b324c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/15/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Convert anonymous class 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.registerDropListener().new DropTargetListener() {...}' in 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.registerDropListener()' to nested class - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.registerDropListener().new DropTargetListener() {...}' - Class name: 'RepositoryTaskEditorDropListener' - Declared visibility: 'private' - Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="RepositoryTaskEditorDropListener" selection="50806 0" stamp="1176142482687" static="false" version="1.0" visibility="2"/>
+<refactoring comment="Convert member type 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.RepositoryTaskEditorDropListener' in 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor' to top level type - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.editors.AbstractRepositoryTaskEditor.RepositoryTaskEditorDropListener' - Field name: 'abstractRepositoryTaskEditor' - Parameter name: 'abstractRepositoryTaskEditor' - Declare field 'final'" description="Convert member type 'RepositoryTaskEditorDropListener' to top level" field="true" fieldName="abstractRepositoryTaskEditor" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor[RepositoryTaskEditorDropListener" mandatory="true" parameterName="abstractRepositoryTaskEditor" possible="true" stamp="1176142559157" version="1.0"/>
+<refactoring comment="Extract method 'private void isOwnedByUser(ITask task)' from 'org.eclipse.mylar.tasks.ui.TaskListManager.isCompletedToday()' to 'org.eclipse.mylar.tasks.ui.TaskListManager' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'isOwnedByUser' - Destination type: 'org.eclipse.mylar.tasks.ui.TaskListManager' - Declared visibility: 'private'" comments="false" description="Extract method 'isOwnedByUser'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui{TaskListManager.java" name="isOwnedByUser" replace="false" selection="29539 486" stamp="1176257671985" version="1.0" visibility="2"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'comment_delete.png'" description="Delete element" element1="icons/elcl16/comment_delete.png" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1176510675750" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/15/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/15/refactorings.index
new file mode 100644
index 0000000..ce361a3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/15/refactorings.index
@@ -0,0 +1,4 @@
+1176142482687 Convert anonymous class to nested
+1176142559157 Convert member type 'RepositoryTaskEditorDropListener' to top level
+1176257671985 Extract method 'isOwnedByUser'
+1176510675750 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/16/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/16/refactorings.history
new file mode 100644
index 0000000..a757ac4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/16/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'AbstractRepositoryConnectorUi.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/tasks/ui/AbstractRepositoryConnectorUi.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1176846664171" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler.formatScheduledFor(...)' to 'formatActivityInformation' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler.formatScheduledFor(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListToolTipHandler.formatActivityInformation(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'formatScheduledFor'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListToolTipHandler.java[TaskListToolTipHandler~formatScheduledFor~QITaskListElement;" name="formatActivityInformation" references="true" stamp="1177079247648" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/16/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/16/refactorings.index
new file mode 100644
index 0000000..8df4192
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1176846664171 Delete element
+1177079247648 Rename method 'formatScheduledFor'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/17/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/17/refactorings.history
new file mode 100644
index 0000000..3a04291
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/17/refactorings.history
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/src/org/eclipse/mylar/internal/tasks/ui/views/text.txt' to 'test.txt' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'text.txt'" description="Rename resource 'text.txt'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="src/org/eclipse/mylar/internal/tasks/ui/views/text.txt" name="test.txt" stamp="1177438212700" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.SyncrhonizeAutomaticallyAction' to 'SynchronizeAutomaticallyAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.SyncrhonizeAutomaticallyAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.SynchronizeAutomaticallyAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'SyncrhonizeAutomaticallyAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{SyncrhonizeAutomaticallyAction.java[SyncrhonizeAutomaticallyAction" matchStrategy="1" name="SynchronizeAutomaticallyAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1177456662623" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.SynchronizeAutomaticallyAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{SynchronizeAutomaticallyAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{SynchronizeAutomaticallyAction.java	true	true	OpenTasksUiPreferencesAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1177457141447" units="1" version="1.0"/>
+<refactoring comment="Rename field 'ID_PAGE' in 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage' to 'ID' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage.ID_PAGE' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.preferences.TasksPreferencePage.ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ID_PAGE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.preferences{TasksPreferencePage.java[TasksPreferencePage^ID_PAGE" name="ID" references="true" setter="false" stamp="1177457359764" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'wizban' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'wizban' - Original element: 'banner-repository.gif'" description="Copy file" element1="icons/wizban/banner-repository.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/wizban/banner-repository.gif	true	true	banner-repository-settings.gif" policy="org.eclipse.jdt.ui.copyResources" stamp="1177491579694" target="/org.eclipse.mylar.tasks.ui/icons/wizban" units="0" version="1.0"/>
+<refactoring comment="Extract method 'private Image geContextActivationImage(Object element)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.getColumnImage()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'geContextActivationImage' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider' - Declared visibility: 'private'" comments="false" description="Extract method 'geContextActivationImage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java" name="geContextActivationImage" replace="false" selection="3423 576" stamp="1177514486865" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void getSynchronizationStateImage(Object element)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.getColumnImage()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'getSynchronizationStateImage' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider' - Declared visibility: 'private'" comments="false" description="Extract method 'getSynchronizationStateImage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java" name="getSynchronizationStateImage" replace="false" selection="3951 1719" stamp="1177514538560" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.geContextActivationImage(...)' to 'getContextActivationImage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.geContextActivationImage(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.getContextActivationImage(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'geContextActivationImage'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java[TaskListTableLabelProvider~geContextActivationImage~QObject;" name="getContextActivationImage" references="true" stamp="1177549647164" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'editors' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'editors' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorUrlHyperlinkDetector.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskEditorUrlHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/tasks/ui/editors/TaskEditorUrlHyperlinkDetector.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1177610697968" target="/org.eclipse.mylar/developer/src-old/editors" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.editors.TaskEditorUrlHyperlinkDetector.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.editors{TaskEditorUrlHyperlinkDetector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1177610718703" subPackages="false" version="1.0"/>
+<refactoring comment="Extract method 'private void postAttachnemts(final IAttachmentHandler attachmentHandler,final boolean attachContext,AbstractRepositoryConnector connector) throws CoreException ' from 'org.eclipse.mylar.internal.tasks.ui.wizards.NewAttachmentWizard.performFinish().new Job() {...}.run()' to 'org.eclipse.mylar.internal.tasks.ui.wizards.NewAttachmentWizard.performFinish().new Job() {...}' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'postAttachnemts' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.wizards.NewAttachmentWizard.performFinish().new Job() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'postAttachnemts'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.wizards{NewAttachmentWizard.java" name="postAttachnemts" replace="false" selection="5763 773" stamp="1177632527640" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskListImageDescriptor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui{TaskListImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui{TaskListImageDescriptor.java	true	true	TaskContextImageDescriptor.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1177727459524" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/17/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/17/refactorings.index
new file mode 100644
index 0000000..f36f9c2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/17/refactorings.index
@@ -0,0 +1,12 @@
+1177438212700 Rename resource 'text.txt'
+1177456662623 Rename type 'SyncrhonizeAutomaticallyAction'
+1177457141447 Copy compilation unit
+1177457359764 Rename field 'ID_PAGE'
+1177491579694 Copy file
+1177514486865 Extract method 'geContextActivationImage'
+1177514538560 Extract method 'getSynchronizationStateImage'
+1177549647164 Rename method 'geContextActivationImage'
+1177610697968 Copy compilation unit
+1177610718703 Delete element
+1177632527640 Extract method 'postAttachnemts'
+1177727459524 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/18/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/18/refactorings.history
new file mode 100644
index 0000000..da1a34b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/18/refactorings.history
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getCompoundImage(...)' to 'getCompositeImage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getCompoundImage(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getCompositeImage(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCompoundImage'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{TasksUiImages.java[TasksUiImages~getCompoundImage~QImageDescriptor;~QImageDescriptor;~QImageDescriptor;" name="getCompositeImage" references="true" stamp="1177880223654" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.TaskContextImageDescriptor' to 'CompositeTaskListImageDescriptor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskContextImageDescriptor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskListImageDescriptor' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskContextImageDescriptor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskContextImageDescriptor.java[TaskContextImageDescriptor" matchStrategy="1" name="CompositeTaskListImageDescriptor" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1177880423571" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.getSynchronizationStateImage(...)' to 'getSynchronizationImageDescriptor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.getSynchronizationStateImage(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider.getSynchronizationImageDescriptor(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSynchronizationStateImage'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java[TaskListTableLabelProvider~getSynchronizationStateImage~QObject;" name="getSynchronizationImageDescriptor" references="true" stamp="1177883407389" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskListImageDescriptor' to 'CompositeTaskImageDescriptor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskListImageDescriptor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskImageDescriptor' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'CompositeTaskListImageDescriptor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskListImageDescriptor.java[CompositeTaskListImageDescriptor" matchStrategy="1" name="CompositeTaskImageDescriptor" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1177887334276" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskImageDescriptor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskImageDescriptor.java	true	true	CompositeTaskContainerImageDescriptor.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1177887351889" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getCompositeImage(...)' to 'getCompositeTaskImage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getCompositeImage(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getCompositeTaskImage(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getCompositeImage'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{TasksUiImages.java[TasksUiImages~getCompositeImage~QImageDescriptor;~QImageDescriptor;~QImageDescriptor;~QImageDescriptor;" name="getCompositeTaskImage" references="true" stamp="1177887562087" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskContainerImageDescriptor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskContainerImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskContainerImageDescriptor.java	true	true	CompositeSynchronizationImageDescriptor.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1177887583366" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/18/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/18/refactorings.index
new file mode 100644
index 0000000..03a2123
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/4/18/refactorings.index
@@ -0,0 +1,7 @@
+1177880223654 Rename method 'getCompoundImage'
+1177880423571 Rename type 'TaskContextImageDescriptor'
+1177883407389 Rename method 'getSynchronizationStateImage'
+1177887334276 Rename type 'CompositeTaskListImageDescriptor'
+1177887351889 Copy compilation unit
+1177887562087 Rename method 'getCompositeImage'
+1177887583366 Copy compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/18/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/18/refactorings.history
new file mode 100644
index 0000000..008d15b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/18/refactorings.history
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void toggleActiveTask(final ITaskListElement taskListElement,ITask task)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListCellModifier.modify()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListCellModifier' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'toggleActiveTask' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListCellModifier' - Declared visibility: 'private'" comments="false" description="Extract method 'toggleActiveTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListCellModifier.java" name="toggleActiveTask" replace="false" selection="3453 498" stamp="1177984290991" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListCellModifier.toggleActiveTask(...)' to 'toggleTaskActivation' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListCellModifier.toggleActiveTask(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListCellModifier.toggleTaskActivation(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'toggleActiveTask'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListCellModifier.java[TaskListCellModifier~toggleActiveTask~QITaskListElement;~QITask;" name="toggleTaskActivation" references="true" stamp="1177984304932" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.RepositoryTaskDecorator' to 'TaskDecorator' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.RepositoryTaskDecorator' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskDecorator' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryTaskDecorator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{RepositoryTaskDecorator.java[RepositoryTaskDecorator" matchStrategy="1" name="TaskDecorator" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178061192364" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.TaskDecorator' to 'TaskLabelDecorator' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskDecorator' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskLabelDecorator' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskDecorator'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskDecorator.java[TaskDecorator" matchStrategy="1" name="TaskLabelDecorator" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178061270564" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.util.TaskListWriter.XML_VERSION' from expression '"1.1"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'XML_VERSION' - Constant expression: '"1.1"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'XML_VERSION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TaskListWriter.java" name="XML_VERSION" qualify="false" replace="true" selection="7999 5" stamp="1178069095703" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.util.TaskListWriter.TRANSFORM_PROPERTY_VERSION' from expression '"version"' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'TRANSFORM_PROPERTY_VERSION' - Constant expression: '"version"' - Declared visibility: 'private'" description="Extract constant 'TRANSFORM_PROPERTY_VERSION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.util{TaskListWriter.java" name="TRANSFORM_PROPERTY_VERSION" qualify="false" replace="false" selection="8041 9" stamp="1178069145437" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openBrowser(...)' to 'openUrl' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openBrowser(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openBrowser'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java[TasksUiUtil~openBrowser~QString;" name="openUrl" references="true" stamp="1178153056321" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.updateGradientColors()' to 'configureGradientColors' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.updateGradientColors()' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.configureGradientColors()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'updateGradientColors'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView~updateGradientColors" name="configureGradientColors" references="true" stamp="1178226219862" version="1.0"/>
+<refactoring comment="Extract method 'private void drawImage(final int activationImageOffset,Event event,Image image)' from 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}.handleEvent()' to 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'drawImage' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'drawImage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java" name="drawImage" replace="false" selection="29030 183" stamp="1178230717270" version="1.0" visibility="2"/>
+<refactoring comment="Convert anonymous class 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl()' to nested class - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}' - Class name: 'CONTEXT_ACTIVATION_DRAWER' - Declared visibility: 'private' - Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java" name="CONTEXT_ACTIVATION_DRAWER" selection="27555 0" stamp="1178230767456" static="false" version="1.0" visibility="2"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/etool16/bug.gif' to 'bug-report' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'bug.gif'" description="Rename resource 'bug.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/bug.gif" name="bug-report" stamp="1178232701019" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.tasks.ui/icons/etool16/bug-report' to 'bug-report.gif' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'bug-report'" description="Rename resource 'bug-report'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/bug-report" name="bug-report.gif" stamp="1178232707691" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.views' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.PriorityDropDownAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.views" element1="/src<org.eclipse.mylar.internal.tasks.ui.views{PriorityDropDownAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.views{PriorityDropDownAction.java	true	true	FilterDropDownAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1178245680304" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.FilterDropDownAction' to 'SortyByDropDownAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.FilterDropDownAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.SortyByDropDownAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'FilterDropDownAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{FilterDropDownAction.java[FilterDropDownAction" matchStrategy="1" name="SortyByDropDownAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178245843616" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'filterOnPriority' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'filterOnPriorityAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.filterOnPriority' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.filterOnPriorityAction' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'filterOnPriority'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^filterOnPriority" name="filterOnPriorityAction" references="true" setter="false" stamp="1178245884173" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.CompositeSynchronizationImageDescriptor.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui{CompositeSynchronizationImageDescriptor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1178249986053" subPackages="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.GRADIENT' from expression '1.13' - Original project: 'org.eclipse.mylar.tasks.ui' - Constant name: 'GRADIENT' - Constant expression: '1.13' - Declared visibility: 'private'" description="Extract constant 'GRADIENT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java" name="GRADIENT" qualify="false" replace="false" selection="22002 4" stamp="1178327684267" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/18/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/18/refactorings.index
new file mode 100644
index 0000000..d493f8b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/18/refactorings.index
@@ -0,0 +1,17 @@
+1177984290991 Extract method 'toggleActiveTask'
+1177984304932 Rename method 'toggleActiveTask'
+1178061192364 Rename type 'RepositoryTaskDecorator'
+1178061270564 Rename type 'TaskDecorator'
+1178069095703 Extract constant 'XML_VERSION'
+1178069145437 Extract constant 'TRANSFORM_PROPERTY_VERSION'
+1178153056321 Rename method 'openBrowser'
+1178226219862 Rename method 'updateGradientColors'
+1178230717270 Extract method 'drawImage'
+1178230767456 Convert anonymous class to nested
+1178232701019 Rename resource 'bug.gif'
+1178232707691 Rename resource 'bug-report'
+1178245680304 Copy compilation unit
+1178245843616 Rename type 'FilterDropDownAction'
+1178245884173 Rename field 'filterOnPriority'
+1178249986053 Delete element
+1178327684267 Extract constant 'GRADIENT'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..c1e3d01
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.internal.tasks.ui.TaskStatusMenuContributor.java' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.internal.tasks.ui.TaskStatusMenuContributor.java' - Original element: 'Snippet15.java'" description="Move file" destination="/src<org.eclipse.mylar.internal.tasks.ui{TaskStatusMenuContributor.java" element1="Snippet15.java" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1178658075296" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'icons' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'icons' - Original element: 'category.gif'" description="Copy file" element1="icons/etool16/category.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/category.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1178659130640" target="/TreeLayoutSnippet/icons" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.FilterCompletedTasksAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui.actions" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{FilterCompletedTasksAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui.actions{FilterCompletedTasksAction.java	true	true	ShowSubTasksAction.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1178666338578" units="1" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylar.internal.tasks.ui.AbstractTaskListFilter.shouldAlwaysShow(Object parent, ITask task)' to 'public boolean shouldAlwaysShow(Object parent, ITask task, boolean checkSubTasks)' - Original project: 'org.eclipse.mylar.tasks.ui' - Added parameters: boolean checkSubTasks" default3="null" delegate="false" deprecate="false" description="Change method 'shouldAlwaysShow'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.ui{AbstractTaskListFilter.java[AbstractTaskListFilter~shouldAlwaysShow~QObject;~QITask;" name="shouldAlwaysShow" parameter1="Object parent 0 Object parent false" parameter2="ITask task 1 ITask task false" parameter3=" -1 boolean checkSubTasks false" stamp="1178670321890" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.actions.DiscardOutgoingAction' to 'ClearOutgoingAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.DiscardOutgoingAction' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.actions.ClearOutgoingAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'DiscardOutgoingAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.actions{DiscardOutgoingAction.java[DiscardOutgoingAction" matchStrategy="1" name="ClearOutgoingAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178737320718" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private static void openUrl(String url) throws PartInitException, MalformedURLException ' from 'org.eclipse.mylar.tasks.ui.TasksUiUtil.openUrl()' to 'org.eclipse.mylar.tasks.ui.TasksUiUtil' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'openUrl' - Destination type: 'org.eclipse.mylar.tasks.ui.TasksUiUtil' - Declared visibility: 'private'" comments="false" description="Extract method 'openUrl'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui{TasksUiUtil.java" name="openUrl" replace="false" selection="4249 1099" stamp="1178827792342" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CONTEXT_ACTIVATION_DRAWER.drawImage(...)' to 'drawActivationImage' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CONTEXT_ACTIVATION_DRAWER.drawImage(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CONTEXT_ACTIVATION_DRAWER.drawActivationImage(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'drawImage'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[CONTEXT_ACTIVATION_DRAWER~drawImage~I~QEvent;~QImage;" name="drawActivationImage" references="true" stamp="1178841570062" version="1.0"/>
+<refactoring comment="Extract method 'private ImageDescriptor getPriorityImageDescriptor(Object element,ImageDescriptor priorityOverlay)' from 'org.eclipse.mylar.internal.tasks.ui.TaskLabelDecorator.decorate()' to 'org.eclipse.mylar.internal.tasks.ui.TaskLabelDecorator' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'getPriorityImageDescriptor' - Destination type: 'org.eclipse.mylar.internal.tasks.ui.TaskLabelDecorator' - Declared visibility: 'private'" comments="false" description="Extract method 'getPriorityImageDescriptor'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskLabelDecorator.java" name="getPriorityImageDescriptor" replace="false" selection="1799 900" stamp="1178841854164" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CONTEXT_ACTIVATION_DRAWER' to 'CUSTOM_IMAGE_DRAWER' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CONTEXT_ACTIVATION_DRAWER' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CUSTOM_IMAGE_DRAWER' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'CONTEXT_ACTIVATION_DRAWER'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[CONTEXT_ACTIVATION_DRAWER" matchStrategy="1" name="CUSTOM_IMAGE_DRAWER" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178844197817" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CUSTOM_IMAGE_DRAWER' to 'CUSTOM_DECORATION_DRAWER' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CUSTOM_IMAGE_DRAWER' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CUSTOM_DECORATION_DRAWER' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'CUSTOM_IMAGE_DRAWER'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[CUSTOM_IMAGE_DRAWER" matchStrategy="1" name="CUSTOM_DECORATION_DRAWER" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178844207873" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskImageDescriptor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskImageDescriptor.java	true	true	CompositeSynchImageDescriptor.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1178849147386" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskContainerImageDescriptor' to 'CompositeContainerImageDescriptor' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.CompositeTaskContainerImageDescriptor' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.CompositeContainerImageDescriptor' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'CompositeTaskContainerImageDescriptor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui{CompositeTaskContainerImageDescriptor.java[CompositeTaskContainerImageDescriptor" matchStrategy="1" name="CompositeContainerImageDescriptor" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178853855148" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'overlaySynchronization' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'synchronizationOverlaid' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.overlaySynchronization' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.synchronizationOverlaid' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'overlaySynchronization'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^overlaySynchronization" name="synchronizationOverlaid" references="true" setter="false" stamp="1178855052216" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CUSTOM_DECORATION_DRAWER' to 'CustomTaskListDecorationDrawer' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CUSTOM_DECORATION_DRAWER' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CustomTaskListDecorationDrawer' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'CUSTOM_DECORATION_DRAWER'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[CUSTOM_DECORATION_DRAWER" matchStrategy="1" name="CustomTaskListDecorationDrawer" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178855093962" textual="false" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CustomTaskListDecorationDrawer' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to top level type - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.CustomTaskListDecorationDrawer' - Field name: 'taskListView' - Parameter name: 'taskListView' - Declare field 'final'" description="Convert member type 'CustomTaskListDecorationDrawer' to top level" field="true" fieldName="taskListView" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView[CustomTaskListDecorationDrawer" mandatory="true" parameterName="taskListView" possible="true" stamp="1178855186705" version="1.0"/>
+<refactoring comment="Rename field 'repositoryTask' in 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider' to 'currentTask' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider.repositoryTask' - Renamed element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider.currentTask' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repositoryTask'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui{EmailContentProposalProvider.java[EmailContentProposalProvider^repositoryTask" name="currentTask" references="true" setter="false" stamp="1178907292421" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'taskData' in 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider' to 'currentTaskData' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider.taskData' - Renamed element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider.currentTaskData' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'taskData'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.tasks.ui{EmailContentProposalProvider.java[EmailContentProposalProvider^taskData" name="currentTaskData" references="true" setter="false" stamp="1178907311046" textual="false" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider.EmailProposal' in 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider' to top level type - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider.EmailProposal'" description="Convert member type 'EmailProposal' to top level" field="false" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylar.tasks.ui{EmailContentProposalProvider.java[EmailContentProposalProvider[EmailProposal" mandatory="false" possible="true" stamp="1178909509546" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.EmailProposal' to 'EmailContentProposal' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailProposal' - Renamed element: 'org.eclipse.mylar.tasks.ui.EmailContentProposal' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'EmailProposal'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{EmailProposal.java[EmailProposal" matchStrategy="1" name="EmailContentProposal" qualified="false" references="true" similarDeclarations="false" stamp="1178909520437" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.EmailProposalLabelProvider' to 'EmailContentProposalLabelProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailProposalLabelProvider' - Renamed element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalLabelProvider' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'EmailProposalLabelProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{EmailProposalLabelProvider.java[EmailProposalLabelProvider" matchStrategy="1" name="EmailContentProposalLabelProvider" qualified="false" references="true" similarDeclarations="false" stamp="1178909565468" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.EmailContentProposal' to 'PersonContentProposal' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailContentProposal' - Renamed element: 'org.eclipse.mylar.tasks.ui.PersonContentProposal' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'EmailContentProposal'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{EmailContentProposal.java[EmailContentProposal" matchStrategy="1" name="PersonContentProposal" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178915262286" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider' to 'PersonProposalProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalProvider' - Renamed element: 'org.eclipse.mylar.tasks.ui.PersonProposalProvider' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'EmailContentProposalProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{EmailContentProposalProvider.java[EmailContentProposalProvider" matchStrategy="1" name="PersonProposalProvider" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178915290424" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tasks.ui.EmailContentProposalLabelProvider' to 'PersonProposalLabelProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.EmailContentProposalLabelProvider' - Renamed element: 'org.eclipse.mylar.tasks.ui.PersonProposalLabelProvider' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'EmailContentProposalLabelProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tasks.ui{EmailContentProposalLabelProvider.java[EmailContentProposalLabelProvider" matchStrategy="1" name="PersonProposalLabelProvider" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1178915306323" textual="false" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.internal.tasks.ui' - Original elements: org.eclipse.mylar.tasks.ui.PersonProposalProvider.java org.eclipse.mylar.tasks.ui.PersonContentProposal.java org.eclipse.mylar.tasks.ui.PersonProposalLabelProvider.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.tasks.ui" element1="/src<org.eclipse.mylar.tasks.ui{PersonProposalProvider.java" element2="/src<org.eclipse.mylar.tasks.ui{PersonContentProposal.java" element3="/src<org.eclipse.mylar.tasks.ui{PersonProposalLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1178915357616" units="3" version="1.0"/>
+<refactoring comment="Change method 'public Set<ITaskListElement> org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()' to 'public List<ITaskListElement> getLegendItems()' - Original project: 'org.eclipse.mylar.tasks.ui' - New return type: 'List<ITaskListElement>'" delegate="false" deprecate="true" description="Change method 'getLegendItems'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getLegendItems" name="getLegendItems" return="List<ITaskListElement>" stamp="1178929043728" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..5c6fc83
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1,25 @@
+1178658075296 Move file
+1178659130640 Copy file
+1178666338578 Copy compilation unit
+1178670321890 Change method 'shouldAlwaysShow'
+1178737320718 Rename type 'DiscardOutgoingAction'
+1178827792342 Extract method 'openUrl'
+1178841570062 Rename method 'drawImage'
+1178841854164 Extract method 'getPriorityImageDescriptor'
+1178844197817 Rename type 'CONTEXT_ACTIVATION_DRAWER'
+1178844207873 Rename type 'CUSTOM_IMAGE_DRAWER'
+1178849147386 Copy compilation unit
+1178853855148 Rename type 'CompositeTaskContainerImageDescriptor'
+1178855052216 Rename field 'overlaySynchronization'
+1178855093962 Rename type 'CUSTOM_DECORATION_DRAWER'
+1178855186705 Convert member type 'CustomTaskListDecorationDrawer' to top level
+1178907292421 Rename field 'repositoryTask'
+1178907311046 Rename field 'taskData'
+1178909509546 Convert member type 'EmailProposal' to top level
+1178909520437 Rename type 'EmailProposal'
+1178909565468 Rename type 'EmailProposalLabelProvider'
+1178915262286 Rename type 'EmailContentProposal'
+1178915290424 Rename type 'EmailContentProposalProvider'
+1178915306323 Rename type 'EmailContentProposalLabelProvider'
+1178915357616 Move compilation units
+1178929043728 Change method 'getLegendItems'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/20/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/20/refactorings.history
new file mode 100644
index 0000000..eda48f4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/20/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'squish' in 'org.eclipse.mylar.internal.tasks.ui.views.CustomTaskListDecorationDrawer' to 'platformSpecificSquish' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.CustomTaskListDecorationDrawer.squish' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.CustomTaskListDecorationDrawer.platformSpecificSquish' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'squish'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{CustomTaskListDecorationDrawer.java[CustomTaskListDecorationDrawer^squish" name="platformSpecificSquish" references="true" setter="false" stamp="1179186081000" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'sortIndex' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'sortByIndex' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.sortIndex' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.sortByIndex' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'sortIndex'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^sortIndex" name="sortByIndex" references="true" setter="false" stamp="1179415255710" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/20/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/20/refactorings.index
new file mode 100644
index 0000000..414f885
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/20/refactorings.index
@@ -0,0 +1,2 @@
+1179186081000 Rename field 'squish'
+1179415255710 Rename field 'sortIndex'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/21/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/21/refactorings.history
new file mode 100644
index 0000000..0174cc6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/21/refactorings.history
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'DELAY_REFRESH' in 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy' to 'refreshDelay' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy.DELAY_REFRESH' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy.refreshDelay' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'DELAY_REFRESH'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{AdaptiveRefreshPolicy.java[AdaptiveRefreshPolicy^DELAY_REFRESH" name="refreshDelay" references="true" setter="false" stamp="1179777278867" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'refreshDelay' in 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy' to 'refreshThreshold' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy.refreshDelay' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.AdaptiveRefreshPolicy.refreshThreshold' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'refreshDelay'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{AdaptiveRefreshPolicy.java[AdaptiveRefreshPolicy^refreshDelay" name="refreshThreshold" references="true" setter="false" stamp="1179777303961" textual="false" version="1.0"/>
+<<<<<<< refactorings.history
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'duplicateDetectors.exsd'" description="Delete element" element1="schema/duplicateDetectors.exsd" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1179853414515" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.IMylarDuplicateDetector.java'" description="Delete element" element1="/src<org.eclipse.mylar.tasks.ui{IMylarDuplicateDetector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180119748828" subPackages="false" version="1.0"/>
+=======
+<refactoring comment="Move 1 elements(s) to 'ovr16' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'ovr16' - Original element: 'overlay-warning.gif'" description="Move file" element1="icons/eview16/overlay-warning.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1179936680240" target="/org.eclipse.mylar.tasks.ui/icons/ovr16" units="0" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider' to 'TaskTableLabelProvider' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListTableLabelProvider' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskTableLabelProvider' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListTableLabelProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListTableLabelProvider.java[TaskListTableLabelProvider" matchStrategy="1" name="TaskTableLabelProvider" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1179936811208" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob.setSynchTasks(...)' to 'setSynchChangedTasks' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob.setSynchTasks(...)' - Renamed element: 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob.setSynchChangedTasks(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setSynchTasks'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.tasks.ui{SynchronizeQueryJob.java[SynchronizeQueryJob~setSynchTasks~Z" name="setSynchChangedTasks" references="true" stamp="1180029019703" version="1.0"/>
+<refactoring comment="Extract method 'private void addHitsToPrime(TaskRepository repository,List<AbstractQueryHit> hits)' from 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob.run()' to 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob' - Original project: 'org.eclipse.mylar.tasks.ui' - Method name: 'addHitsToPrime' - Destination type: 'org.eclipse.mylar.tasks.ui.SynchronizeQueryJob' - Declared visibility: 'private'" comments="false" description="Extract method 'addHitsToPrime'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.tasks.ui{SynchronizeQueryJob.java" name="addHitsToPrime" replace="false" selection="4879 607" stamp="1180029977125" version="1.0" visibility="2"/>
+>>>>>>> 1.3
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/21/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/21/refactorings.index
new file mode 100644
index 0000000..5adaff1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/21/refactorings.index
@@ -0,0 +1,11 @@
+1179777278867 Rename field 'DELAY_REFRESH'
+1179777303961 Rename field 'refreshDelay'
+<<<<<<< refactorings.index
+1179853414515 Delete element
+1180119748828 Delete element
+=======
+1179936680240 Move file
+1179936811208 Rename type 'TaskListTableLabelProvider'
+1180029019703 Rename method 'setSynchTasks'
+1180029977125 Extract method 'addHitsToPrime'
+>>>>>>> 1.3
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..8d88ff5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Change method 'public String org.eclipse.mylar.tasks.ui.AbstractRepositoryConnectorUi.getNewAccountCreationUrl()' to 'public String getAccountCreationUrl(TaskRepository taskRepository)' - Original project: 'org.eclipse.mylar.tasks.ui' - New name: 'getAccountCreationUrl' - Added parameters: TaskRepository taskRepository" default1="null" delegate="false" deprecate="true" description="Change method 'getNewAccountCreationUrl'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getNewAccountCreationUrl" name="getAccountCreationUrl" parameter1=" -1 TaskRepository taskRepository false" stamp="1180249380875" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.ui.RepositorySynchronizationManager.java' - Update references to refactored element - Update fully qualified names in '*.xml' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.tasks.ui{RepositorySynchronizationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1180636700843" units="1" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylar.tasks.ui.ITaskFactory' from 'org.eclipse.mylar.tasks.ui.TaskFactory' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.tasks.ui.TaskFactory' - Extracted interface: 'org.eclipse.mylar.tasks.ui.ITaskFactory' - Extracted members: org.eclipse.mylar.tasks.ui.TaskFactory.createTask(...) - Use super type where possible" comments="true" description="Extract interface 'ITaskFactory'" element1="/src<org.eclipse.mylar.tasks.ui{TaskFactory.java[TaskFactory~createTask~QTaskList;~QTaskRepository;~QRepositoryTaskData;~Z~Z" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylar.tasks.ui{TaskFactory.java[TaskFactory" instanceof="false" name="ITaskFactory" public="true" replace="true" stamp="1180641786812" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.tasks.ui' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.tasks.ui.ITaskFactory.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.tasks.ui{ITaskFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1180641836671" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..62632c2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,4 @@
+1180249380875 Change method 'getNewAccountCreationUrl'
+1180636700843 Move compilation unit
+1180641786812 Extract interface 'ITaskFactory'
+1180641836671 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/22/refactorings.history
new file mode 100644
index 0000000..f3bc06d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'dropDown' in 'org.eclipse.mylar.internal.tasks.ui.TaskTrimWidget' to 'navigateAction' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TaskTrimWidget.dropDown' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TaskTrimWidget.navigateAction' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'dropDown'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui{TaskTrimWidget.java[TaskTrimWidget^dropDown" name="navigateAction" references="true" setter="false" stamp="1180821018521" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/22/refactorings.index
new file mode 100644
index 0000000..d3ecbd8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/22/refactorings.index
@@ -0,0 +1 @@
+1180821018521 Rename field 'dropDown'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..85c6d3d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.actions.CopyToClipboardAction'" description="Delete element" element1="/src<org.eclipse.mylar.internal.tasks.ui.actions{CopyToClipboardAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180911195448" subPackages="false" version="1.0"/>
+<refactoring comment="Rename field 'ID' in 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView' to 'ID_VIEW' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.ID' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.views.TaskListView.ID_VIEW' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.tasks.ui.views{TaskListView.java[TaskListView^ID" name="ID_VIEW" references="true" setter="false" stamp="1181005349910" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.createWithOverlay(...)' to 'getImageWithOverlay' - Original project: 'org.eclipse.mylar.tasks.ui' - Original element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.createWithOverlay(...)' - Renamed element: 'org.eclipse.mylar.internal.tasks.ui.TasksUiImages.getImageWithOverlay(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createWithOverlay'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.internal.tasks.ui{TasksUiImages.java[TasksUiImages~createWithOverlay~QImageDescriptor;~QImageDescriptor;~Z~Z" name="getImageWithOverlay" references="true" stamp="1181180189606" version="1.0"/>
+<refactoring comment="Rename field 'SELECTED_PRIORITY' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants' to 'FILTER_PRIORITY' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.SELECTED_PRIORITY' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.FILTER_PRIORITY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SELECTED_PRIORITY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListPreferenceConstants.java[TaskListPreferenceConstants^SELECTED_PRIORITY" name="FILTER_PRIORITY" references="true" setter="false" stamp="1181265254819" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'PLANNER_EDITOR_ID' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants' to 'ID_EDITOR_PLANNING' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.PLANNER_EDITOR_ID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.ID_EDITOR_PLANNING' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PLANNER_EDITOR_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListPreferenceConstants.java[TaskListPreferenceConstants^PLANNER_EDITOR_ID" name="ID_EDITOR_PLANNING" references="true" setter="false" stamp="1181265419972" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'TASK_EDITOR_ID' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants' to 'ID_EDITOR_TASK' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.TASK_EDITOR_ID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.ID_EDITOR_TASK' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TASK_EDITOR_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListPreferenceConstants.java[TaskListPreferenceConstants^TASK_EDITOR_ID" name="ID_EDITOR_TASK" references="true" setter="false" stamp="1181265532372" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'CATEGORY_EDITOR_ID' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants' to 'ID_EDITOR_CATEGORY' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.CATEGORY_EDITOR_ID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants.ID_EDITOR_CATEGORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'CATEGORY_EDITOR_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListPreferenceConstants.java[TaskListPreferenceConstants^CATEGORY_EDITOR_ID" name="ID_EDITOR_CATEGORY" references="true" setter="false" stamp="1181265541506" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants' to 'TasksUiPreferenceConstants' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListPreferenceConstants' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListPreferenceConstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListPreferenceConstants.java[TaskListPreferenceConstants" matchStrategy="1" name="TasksUiPreferenceConstants" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181265572247" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ID_EDITOR_CATEGORY' to 'org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ID_EDITOR_CATEGORY' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor'" delegate="false" deprecate="true" description="Move member 'ID_EDITOR_CATEGORY'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^ID_EDITOR_CATEGORY" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{CategoryEditor.java[CategoryEditor" stamp="1181265679056" version="1.0"/>
+<refactoring comment="Rename field 'ID_EDITOR_CATEGORY' in 'org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor' to 'ID_EDITOR' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor.ID_EDITOR_CATEGORY' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor.ID_EDITOR' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ID_EDITOR_CATEGORY'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{CategoryEditor.java[CategoryEditor^ID_EDITOR_CATEGORY" name="ID_EDITOR" references="true" setter="false" stamp="1181265711013" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ID_EDITOR_PLANNING' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ID_EDITOR_PLANNING' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor'" delegate="false" deprecate="true" description="Move member 'ID_EDITOR_PLANNING'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^ID_EDITOR_PLANNING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskPlanningEditor.java[TaskPlanningEditor" stamp="1181265738162" version="1.0"/>
+<refactoring comment="Rename field 'PLANNING_EDITOR_ID' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor' to 'ID_EDITOR' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor.PLANNING_EDITOR_ID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor.ID_EDITOR' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PLANNING_EDITOR_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskPlanningEditor.java[TaskPlanningEditor^PLANNING_EDITOR_ID" name="ID_EDITOR" references="true" setter="false" stamp="1181265766649" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ID_EDITOR_TASK' to 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ID_EDITOR_TASK' - Destination type: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor'" delegate="false" deprecate="true" description="Move member 'ID_EDITOR_TASK'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^ID_EDITOR_TASK" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditor.java[TaskEditor" stamp="1181265788270" version="1.0"/>
+<refactoring comment="Rename field 'ID_EDITOR_TASK' in 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor' to 'ID_EDITOR' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor.ID_EDITOR_TASK' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor.ID_EDITOR' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ID_EDITOR_TASK'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditor.java[TaskEditor^ID_EDITOR_TASK" name="ID_EDITOR" references="true" setter="false" stamp="1181265807198" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPORT_DISABLE_INTERNAL' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'REPORTING_DISABLE_INTERNAL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORT_DISABLE_INTERNAL' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORTING_DISABLE_INTERNAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPORT_DISABLE_INTERNAL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^REPORT_DISABLE_INTERNAL" name="REPORTING_DISABLE_INTERNAL" references="true" setter="false" stamp="1181268006833" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'MULTIPLE_ACTIVE_TASKS' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'ACTIVATE_MULTIPLE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.MULTIPLE_ACTIVE_TASKS' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ACTIVATE_MULTIPLE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MULTIPLE_ACTIVE_TASKS'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^MULTIPLE_ACTIVE_TASKS" name="ACTIVATE_MULTIPLE" references="true" setter="false" stamp="1181268025995" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'INCOMING_OVERLAID' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'OVERLAYS_INCOMING_TIGHT' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.INCOMING_OVERLAID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'INCOMING_OVERLAID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^INCOMING_OVERLAID" name="OVERLAYS_INCOMING_TIGHT" references="true" setter="false" stamp="1181268057885" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPORT_OPEN_EDITOR' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'REPORTING_OPEN_EDITOR' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORT_OPEN_EDITOR' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORTING_OPEN_EDITOR' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPORT_OPEN_EDITOR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^REPORT_OPEN_EDITOR" name="REPORTING_OPEN_EDITOR" references="true" setter="false" stamp="1181268083903" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPORT_OPEN_EXTERNAL' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'REPORTING_OPEN_EXTERNAL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORT_OPEN_EXTERNAL' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORTING_OPEN_EXTERNAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPORT_OPEN_EXTERNAL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^REPORT_OPEN_EXTERNAL" name="REPORTING_OPEN_EXTERNAL" references="true" setter="false" stamp="1181268091868" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'REPORT_OPEN_INTERNAL' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'REPORTING_OPEN_INTERNAL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORT_OPEN_INTERNAL' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORTING_OPEN_INTERNAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPORT_OPEN_INTERNAL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^REPORT_OPEN_INTERNAL" name="REPORTING_OPEN_INTERNAL" references="true" setter="false" stamp="1181268098239" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.preferences.MylarPreferencePage' to 'TaskFocusedUiPreferencePage' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.MylarPreferencePage' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TaskFocusedUiPreferencePage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{MylarPreferencePage.java[MylarPreferencePage" matchStrategy="1" name="TaskFocusedUiPreferencePage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268752446" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksPreferencePage' to 'TasksUiPreferencePage' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksPreferencePage' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TasksPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksPreferencePage.java[TasksPreferencePage" matchStrategy="1" name="TasksUiPreferencePage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181268762422" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.MylarUrlHyperlink' to 'TasksUrlHyperlink' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.MylarUrlHyperlink' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TasksUrlHyperlink' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarUrlHyperlink'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui.editors{MylarUrlHyperlink.java[MylarUrlHyperlink" matchStrategy="1" name="TasksUrlHyperlink" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269075941" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.TasksUrlHyperlink' to 'TaskUrlHyperlink' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TasksUrlHyperlink' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TaskUrlHyperlink' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TasksUrlHyperlink'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui.editors{TasksUrlHyperlink.java[TasksUrlHyperlink" matchStrategy="1" name="TaskUrlHyperlink" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269217237" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.MylarUrlHyperlinkDetector' to 'TaskUrlHyperlinkDetector' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.MylarUrlHyperlinkDetector' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TaskUrlHyperlinkDetector' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarUrlHyperlinkDetector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui.editors{MylarUrlHyperlinkDetector.java[MylarUrlHyperlinkDetector" matchStrategy="1" name="TaskUrlHyperlinkDetector" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269228450" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..49b2191
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,25 @@
+1180911195448 Delete element
+1181005349910 Rename field 'ID'
+1181180189606 Rename method 'createWithOverlay'
+1181265254819 Rename field 'SELECTED_PRIORITY'
+1181265419972 Rename field 'PLANNER_EDITOR_ID'
+1181265532372 Rename field 'TASK_EDITOR_ID'
+1181265541506 Rename field 'CATEGORY_EDITOR_ID'
+1181265572247 Rename type 'TaskListPreferenceConstants'
+1181265679056 Move member 'ID_EDITOR_CATEGORY'
+1181265711013 Rename field 'ID_EDITOR_CATEGORY'
+1181265738162 Move member 'ID_EDITOR_PLANNING'
+1181265766649 Rename field 'PLANNING_EDITOR_ID'
+1181265788270 Move member 'ID_EDITOR_TASK'
+1181265807198 Rename field 'ID_EDITOR_TASK'
+1181268006833 Rename field 'REPORT_DISABLE_INTERNAL'
+1181268025995 Rename field 'MULTIPLE_ACTIVE_TASKS'
+1181268057885 Rename field 'INCOMING_OVERLAID'
+1181268083903 Rename field 'REPORT_OPEN_EDITOR'
+1181268091868 Rename field 'REPORT_OPEN_EXTERNAL'
+1181268098239 Rename field 'REPORT_OPEN_INTERNAL'
+1181268752446 Rename type 'MylarPreferencePage'
+1181268762422 Rename type 'TasksPreferencePage'
+1181269075941 Rename type 'MylarUrlHyperlink'
+1181269217237 Rename type 'TasksUrlHyperlink'
+1181269228450 Rename type 'MylarUrlHyperlinkDetector'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..ea0574d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)' to 'createSummaryLLayout' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createStatusLayout(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createStatusLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createStatusLayout~QComposite;" name="createSummaryLLayout" references="true" stamp="1181583329656" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' to 'createSummaryLayout' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLLayout(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createSummaryLayout(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSummaryLLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createSummaryLLayout~QComposite;" name="createSummaryLayout" references="true" stamp="1181583348343" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.setAttachContext(...)' to 'setAttachContextEnabled' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.setAttachContext(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.setAttachContextEnabled(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setAttachContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~setAttachContext~Z" name="setAttachContextEnabled" references="true" stamp="1181585630281" version="1.0"/>
+<refactoring comment="Rename field 'backgroundIncoming' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'colorIncoming' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.backgroundIncoming' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.colorIncoming' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'backgroundIncoming'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^backgroundIncoming" name="colorIncoming" references="true" setter="false" stamp="1181589504718" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.TaskCommandIds' to 'ITaskCommandIds' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.TaskCommandIds' - Renamed element: 'org.eclipse.mylyn.tasks.ui.ITaskCommandIds' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskCommandIds'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui{TaskCommandIds.java[TaskCommandIds" matchStrategy="1" name="ITaskCommandIds" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181661435261" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'OPEN_REMOTE_TASK' in 'org.eclipse.mylyn.tasks.ui.ITaskCommandIds' to 'OPEN_TASK_REMOTE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.ITaskCommandIds.OPEN_REMOTE_TASK' - Renamed element: 'org.eclipse.mylyn.tasks.ui.ITaskCommandIds.OPEN_TASK_REMOTE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'OPEN_REMOTE_TASK'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{ITaskCommandIds.java[ITaskCommandIds^OPEN_REMOTE_TASK" name="OPEN_TASK_REMOTE" references="true" setter="false" stamp="1181661455011" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'contextToggle' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.getCompositeTaskImage(...)' to 'overlayCustom' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.getCompositeTaskImage(ImageDescriptor, ImageDescriptor, ImageDescriptor).contextToggle' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.getCompositeTaskImage(ImageDescriptor, ImageDescriptor, ImageDescriptor).overlayCustom' - Update references to refactored element" description="Rename local variable 'contextToggle'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java" name="overlayCustom" references="true" selection="11744 13" stamp="1181678224420" version="1.0"/>
+<refactoring comment="Rename field 'compositeImages' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider' to 'overlaySynchImages' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.compositeImages' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.overlaySynchImages' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'compositeImages'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider^compositeImages" name="overlaySynchImages" references="true" setter="false" stamp="1181678335997" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public LocalTask org.eclipse.mylyn.tasks.ui.TaskListManager.createNewLocalTask(String summary)' to 'public LocalTask createNewLocalTask(String summary, boolean scheduleToday)' - Original project: 'org.eclipse.mylyn.tasks.ui' - Added parameters: boolean scheduleToday" default2="true" delegate="false" deprecate="false" description="Change method 'createNewLocalTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.ui{TaskListManager.java[TaskListManager~createNewLocalTask~QString;" name="createNewLocalTask" parameter1="String summary 0 String summary false" parameter2=" -1 boolean scheduleToday false" stamp="1181690774000" version="1.0"/>
+<refactoring comment="Change method 'public LocalTask org.eclipse.mylyn.tasks.ui.TaskListManager.createNewLocalTask(String summary, boolean scheduleToday)' to 'public LocalTask createNewLocalTask(String summary)' - Original project: 'org.eclipse.mylyn.tasks.ui' - Removed parameters: boolean scheduleToday" delegate="false" deprecate="false" description="Change method 'createNewLocalTask'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.ui{TaskListManager.java[TaskListManager~createNewLocalTask~QString;~Z" name="createNewLocalTask" parameter1="String summary 0 String summary false" parameter2="boolean scheduleToday 1 boolean scheduleToday true" stamp="1181691040187" version="1.0"/>
+<refactoring comment="Extract method 'private void loadTemplateRepositories()' from 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.start()' to 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'loadTemplateRepositories' - Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin' - Declared visibility: 'private'" comments="false" description="Extract method 'loadTemplateRepositories'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java" name="loadTemplateRepositories" replace="false" selection="14305 1375" stamp="1181695424578" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'src-old' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewLocalTaskAction.java'" description="Copy compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewLocalTaskAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylyn/internal/tasks/ui/actions/NewLocalTaskAction.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181697900578" target="/org.eclipse.mylyn/developer/src-old" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewLocalTaskAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewLocalTaskAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181697911062" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskWizard' to 'NewTaskWizard' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskWizard' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskWizard' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'NewRepositoryTaskWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewRepositoryTaskWizard.java[NewRepositoryTaskWizard" matchStrategy="1" name="NewTaskWizard" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1181698289515" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.NewRepositoryTaskAction' to 'NewTaskAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewRepositoryTaskAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'NewRepositoryTaskAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewRepositoryTaskAction.java[NewRepositoryTaskAction" matchStrategy="1" name="NewTaskAction" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1181698329015" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage' to 'NewTaskPage' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryTaskPage' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskPage' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'NewRepositoryTaskPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewRepositoryTaskPage.java[NewRepositoryTaskPage" matchStrategy="1" name="NewTaskPage" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1181707563828" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction' to 'AbstractTaskAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTasksAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTasksAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AbstractTasksAction.java[AbstractTasksAction" matchStrategy="1" name="AbstractTaskAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181717209407" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()' to 'getSelectedContainers' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedFilters()' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.getSelectedContainers()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSelectedFilters'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityWizardPage.java[TaskActivityWizardPage~getSelectedFilters" name="getSelectedContainers" references="true" stamp="1181756785343" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.SynchronizeChangedTasksJob' in 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager' to top level type - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.SynchronizeChangedTasksJob' - Field name: 'repositorySynchronizationManager' - Declare field 'final'" description="Convert member type 'SynchronizeChangedTasksJob' to top level" field="false" fieldName="repositorySynchronizationManager" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.tasks.ui{RepositorySynchronizationManager.java[RepositorySynchronizationManager[SynchronizeChangedTasksJob" mandatory="false" possible="false" stamp="1181789707690" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.SynchronizeTaskJob.syncTask(...)' to 'synchronizeTask' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.SynchronizeTaskJob.syncTask(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.SynchronizeTaskJob.synchronizeTask(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'syncTask'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{SynchronizeTaskJob.java[SynchronizeTaskJob~syncTask~QIProgressMonitor;~QAbstractTask;" name="synchronizeTask" references="true" stamp="1181857604289" version="1.0"/>
+<refactoring comment="Rename local variable 'task' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.TASKLIST_CHANGE_LISTENER.new ITaskListChangeListener() {...}.containersChanged(...)' to 'taskToRefresh' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.TASKLIST_CHANGE_LISTENER.new ITaskListChangeListener() {...}.containersChanged(Set<TaskContainerDelta>).task' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.TASKLIST_CHANGE_LISTENER.new ITaskListChangeListener() {...}.containersChanged(Set<TaskContainerDelta>).taskToRefresh' - Update references to refactored element" description="Rename local variable 'task'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="taskToRefresh" references="true" selection="11770 4" stamp="1181857790078" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.createNotificationsGroup(...)' to 'createLayoutGroup' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.createNotificationsGroup(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.createLayoutGroup(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createNotificationsGroup'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java[TasksUiPreferencePage~createNotificationsGroup~QComposite;" name="createLayoutGroup" references="true" stamp="1181924386058" version="1.0"/>
+
+<refactoring comment="Rename field 'REPORTING_OPEN_EDITOR' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'EDITOR_TASKS_RICH' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.REPORTING_OPEN_EDITOR' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.EDITOR_TASKS_RICH' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REPORTING_OPEN_EDITOR'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^REPORTING_OPEN_EDITOR" name="EDITOR_TASKS_RICH" references="true" setter="false" stamp="1181955193038" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'reportEditor' in 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage' to 'useRichEditor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.reportEditor' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.useRichEditor' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'reportEditor'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java[TasksUiPreferencePage^reportEditor" name="useRichEditor" references="true" setter="false" stamp="1181955265681" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.getActivityUrl()' to 'getHistoryUrl' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.getActivityUrl()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.getHistoryUrl()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getActivityUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~getActivityUrl" name="getHistoryUrl" references="true" stamp="1181955534960" version="1.0"/>
+<refactoring comment="Rename field 'reportInternal' in 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage' to 'useWebBrowser' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.reportInternal' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage.useWebBrowser' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'reportInternal'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java[TasksUiPreferencePage^reportInternal" name="useWebBrowser" references="true" setter="false" stamp="1181955810470" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'submitAction' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'activateAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.submitAction' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.activateAction' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'submitAction'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^submitAction" name="activateAction" references="true" setter="false" stamp="1181958289482" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractMylarFilteredTree' to 'AbstractFilteredTree' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractMylarFilteredTree' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractMylarFilteredTree'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{AbstractMylarFilteredTree.java[AbstractMylarFilteredTree" matchStrategy="1" name="AbstractFilteredTree" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181958759264" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'activeTaskLabel' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'activeTaskLink' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.activeTaskLabel' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.activeTaskLink' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'activeTaskLabel'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^activeTaskLabel" name="activeTaskLink" references="true" setter="false" stamp="1182014176830" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'activeSetLabel' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'workingSetLink' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.activeSetLabel' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.workingSetLink' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'activeSetLabel'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^activeSetLabel" name="workingSetLink" references="true" setter="false" stamp="1182014192249" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'LABEL_NO_SETS' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'LABEL_SETS_NONE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_NO_SETS' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_SETS_NONE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'LABEL_NO_SETS'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^LABEL_NO_SETS" name="LABEL_SETS_NONE" references="true" setter="false" stamp="1182015069653" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'LABEL_NO_ACTIVE' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'LABEL_ACTIVE_NONE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_NO_ACTIVE' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_ACTIVE_NONE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'LABEL_NO_ACTIVE'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^LABEL_NO_ACTIVE" name="LABEL_ACTIVE_NONE" references="true" setter="false" stamp="1182015078391" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'LABEL_MULTIPLE_SETS' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'LABEL_SETS_MULTIPLE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_MULTIPLE_SETS' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_SETS_MULTIPLE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'LABEL_MULTIPLE_SETS'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^LABEL_MULTIPLE_SETS" name="LABEL_SETS_MULTIPLE" references="true" setter="false" stamp="1182015088908" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.PreviousTaskDropDownAction' to 'ActiveTaskSwitcherDropDownAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.PreviousTaskDropDownAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActiveTaskSwitcherDropDownAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'PreviousTaskDropDownAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{PreviousTaskDropDownAction.java[PreviousTaskDropDownAction" matchStrategy="1" name="ActiveTaskSwitcherDropDownAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182018772424" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.ActiveTaskSwitcherDropDownAction' to 'ActiveTaskHistoryDropDownAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActiveTaskSwitcherDropDownAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActiveTaskHistoryDropDownAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ActiveTaskSwitcherDropDownAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActiveTaskSwitcherDropDownAction.java[ActiveTaskSwitcherDropDownAction" matchStrategy="1" name="ActiveTaskHistoryDropDownAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182018780875" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.getActiveTaskWorkingSets()' to 'getActiveWorkingSets' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.getActiveTaskWorkingSets()' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.getActiveWorkingSets()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getActiveTaskWorkingSets'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView~getActiveTaskWorkingSets" name="getActiveWorkingSets" references="true" stamp="1182020642152" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.actions' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.actions' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.MoveToCategoryMenuContributor.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui{MoveToCategoryMenuContributor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182033507849" units="1" version="1.0"/>
+<refactoring comment="Extract method 'private void updateQueryStatus(final CoreException e)' from 'org.eclipse.mylyn.tasks.ui.SynchronizeQueryJob.run()' to 'org.eclipse.mylyn.tasks.ui.SynchronizeQueryJob' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'updateQueryStatus' - Destination type: 'org.eclipse.mylyn.tasks.ui.SynchronizeQueryJob' - Declared visibility: 'private'" comments="false" description="Extract method 'updateQueryStatus'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{SynchronizeQueryJob.java" name="updateQueryStatus" replace="false" selection="3951 437" stamp="1182098868033" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..070b344
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,38 @@
+1181583329656 Rename method 'createStatusLayout'
+1181583348343 Rename method 'createSummaryLLayout'
+1181585630281 Rename method 'setAttachContext'
+1181589504718 Rename field 'backgroundIncoming'
+1181661435261 Rename type 'TaskCommandIds'
+1181661455011 Rename field 'OPEN_REMOTE_TASK'
+1181678224420 Rename local variable 'contextToggle'
+1181678335997 Rename field 'compositeImages'
+1181690774000 Change method 'createNewLocalTask'
+1181691040187 Change method 'createNewLocalTask'
+1181695424578 Extract method 'loadTemplateRepositories'
+1181697900578 Copy compilation unit
+1181697911062 Delete element
+1181698289515 Rename type 'NewRepositoryTaskWizard'
+1181698329015 Rename type 'NewRepositoryTaskAction'
+1181707563828 Rename type 'NewRepositoryTaskPage'
+1181717209407 Rename type 'AbstractTasksAction'
+1181756785343 Rename method 'getSelectedFilters'
+1181789707690 Convert member type 'SynchronizeChangedTasksJob' to top level
+1181857604289 Rename method 'syncTask'
+1181857790078 Rename local variable 'task'
+1181924386058 Rename method 'createNotificationsGroup'
+1181955193038 Rename field 'REPORTING_OPEN_EDITOR'
+1181955265681 Rename field 'reportEditor'
+1181955534960 Rename method 'getActivityUrl'
+1181955810470 Rename field 'reportInternal'
+1181958289482 Rename field 'submitAction'
+1181958759264 Rename type 'AbstractMylarFilteredTree'
+1182014176830 Rename field 'activeTaskLabel'
+1182014192249 Rename field 'activeSetLabel'
+1182015069653 Rename field 'LABEL_NO_SETS'
+1182015078391 Rename field 'LABEL_NO_ACTIVE'
+1182015088908 Rename field 'LABEL_MULTIPLE_SETS'
+1182018772424 Rename type 'PreviousTaskDropDownAction'
+1182018780875 Rename type 'ActiveTaskSwitcherDropDownAction'
+1182020642152 Rename method 'getActiveTaskWorkingSets'
+1182033507849 Move compilation unit
+1182098868033 Extract method 'updateQueryStatus'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..e83ad4c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'toolbar-arrow-right.jpg'" description="Delete element" element1="icons/etool16/toolbar-arrow-right.jpg" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182040582858" subPackages="false" version="1.0"/>
+<refactoring comment="Rename local variable 'theSet' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.indicateActiveTaskWorkingSet()' to 'workingSet' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.indicateActiveTaskWorkingSet().theSet' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.indicateActiveTaskWorkingSet().workingSet' - Update references to refactored element" description="Rename local variable 'theSet'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java" name="workingSet" references="true" selection="10870 6" stamp="1182042930934" version="1.0"/>
+<refactoring comment="Rename local variable 'ws' in 'org.eclipse.mylyn.internal.tasks.ui.workingset.TaskWorkingSetElementAdapter.adaptElements(...)' to 'workingSet' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingset.TaskWorkingSetElementAdapter.adaptElements(IWorkingSet, IAdaptable[]).ws' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingset.TaskWorkingSetElementAdapter.adaptElements(IWorkingSet, IAdaptable[]).workingSet' - Update references to refactored element" description="Rename local variable 'ws'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingset{TaskWorkingSetElementAdapter.java" name="workingSet" references="true" selection="976 2" stamp="1182048450657" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.internal.tasks.ui.workingset' to 'org.eclipse.mylyn.internal.tasks.ui.workingsets' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.workingset' - Renamed element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.workingsets' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.tasks.ui.workingset'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingset" name="org.eclipse.mylyn.internal.tasks.ui.workingsets" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1182049269621" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'HANDLE_ID' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskElementFactory' to 'ID_HANDLE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskElementFactory.HANDLE_ID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskElementFactory.ID_HANDLE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'HANDLE_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskElementFactory.java[TaskElementFactory^HANDLE_ID" name="ID_HANDLE" references="true" setter="false" stamp="1182049466322" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.Category' to 'AdapterCategory' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.Category' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AdapterCategory' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Category'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[Category" matchStrategy="1" name="AdapterCategory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182112281339" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AdapterCategory' to 'ElementCategory' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.AdapterCategory' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.ElementCategory' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'AdapterCategory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[AdapterCategory" matchStrategy="1" name="ElementCategory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182112289583" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.LABEL_TASKS' from expression '"Tasks"' - Original project: 'org.eclipse.mylyn.tasks.ui' - Constant name: 'LABEL_TASKS' - Constant expression: '"Tasks"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL_TASKS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java" name="LABEL_TASKS" qualify="false" replace="true" selection="8788 7" stamp="1182114606819" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.createStatusComposite(...)' to 'createActiveTaskComposite' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.createStatusComposite(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.createActiveTaskComposite(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createStatusComposite'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{AbstractFilteredTree.java[AbstractFilteredTree~createStatusComposite~QComposite;" name="createActiveTaskComposite" references="true" stamp="1182132223386" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.createWorkingSetComposite(...)' to 'createActiveWorkingSetComposite' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.createWorkingSetComposite(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.createActiveWorkingSetComposite(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createWorkingSetComposite'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{AbstractFilteredTree.java[AbstractFilteredTree~createWorkingSetComposite~QComposite;" name="createActiveWorkingSetComposite" references="true" stamp="1182132232570" version="1.0"/>
+<refactoring comment="Rename field 'menuManager' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'activeTaskMenuManager' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.menuManager' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.activeTaskMenuManager' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'menuManager'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^menuManager" name="activeTaskMenuManager" references="true" setter="false" stamp="1182132287368" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'menu' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree' to 'activeTaskMenu' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.menu' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.activeTaskMenu' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'menu'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java[TaskListFilteredTree^menu" name="activeTaskMenu" references="true" setter="false" stamp="1182132294992" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.ActiveTaskHistoryDropDownAction' to 'ActivateTaskHistoryDropDownAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActiveTaskHistoryDropDownAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ActiveTaskHistoryDropDownAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActiveTaskHistoryDropDownAction.java[ActiveTaskHistoryDropDownAction" matchStrategy="1" name="ActivateTaskHistoryDropDownAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182139878945" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'defaultTooltip' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction' to 'LABEL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction.defaultTooltip' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction.LABEL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'defaultTooltip'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActivateTaskHistoryDropDownAction.java[ActivateTaskHistoryDropDownAction^defaultTooltip" name="LABEL" references="true" setter="false" stamp="1182140096649" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskAdapterFactory' to 'TaskWorkingSetAdapterFactory' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskAdapterFactory' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetAdapterFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskAdapterFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskAdapterFactory.java[TaskAdapterFactory" matchStrategy="1" name="TaskWorkingSetAdapterFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182177664685" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskElementFactory' to 'TaskWorkingSetElementFactory' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskElementFactory' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetElementFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskElementFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskElementFactory.java[TaskElementFactory" matchStrategy="1" name="TaskWorkingSetElementFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182180874650" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'compositeImages' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.TaskElementLabelProvider(...)' to 'wideImages' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.TaskElementLabelProvider(boolean).compositeImages' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.TaskElementLabelProvider(boolean).wideImages' - Update references to refactored element" description="Rename local variable 'compositeImages'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java" name="wideImages" references="true" selection="2577 15" stamp="1182181923190" version="1.0"/>
+<refactoring comment="Rename field 'compositeImages' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider' to 'wideImages' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.compositeImages' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.wideImages' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'compositeImages'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider^compositeImages" name="wideImages" references="true" setter="false" stamp="1182181928542" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.SynchronizeTasksJob' to 'SynchronizeTaskJob' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.SynchronizeTasksJob' - Renamed element: 'org.eclipse.mylyn.tasks.ui.SynchronizeTaskJob' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'SynchronizeTasksJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui{SynchronizeTasksJob.java[SynchronizeTasksJob" matchStrategy="1" name="SynchronizeTaskJob" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1182183465937" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.ITaskEditorFactory' to 'AbstractTaskEditorFactory' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.ITaskEditorFactory' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ITaskEditorFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui.editors{ITaskEditorFactory.java[ITaskEditorFactory" matchStrategy="1" name="AbstractTaskEditorFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182221929842" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private boolean acceptContainer(TaskContainerDelta taskContainerDelta)' from 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater.containersChanged()' to 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'acceptContainer' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater' - Declared visibility: 'private' - Replace occurrences of statements with method" comments="false" description="Extract method 'acceptContainer'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetUpdater.java" name="acceptContainer" replace="true" selection="3384 138" stamp="1182236932324" version="1.0" visibility="2"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.ui/icons/etool16/open-browse4r.gif' to 'open-browser.gif' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'open-browse4r.gif'" description="Rename resource 'open-browse4r.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/open-browse4r.gif" name="open-browser.gif" stamp="1182239178513" version="1.0"/>
+<refactoring comment="Extract local variable 'queryTagNames' from expression 'externalizer.getQueryTagNames()' - Original project: 'org.eclipse.mylyn.tasks.ui' - Variable name: 'queryTagNames' - Destination method: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter.readTaskList()' - Variable expression: 'externalizer.getQueryTagNames()' - Replace occurrences of expression with variable" description="Extract local variable 'queryTagNames'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListWriter.java" name="queryTagNames" replace="true" selection="11447 31" stamp="1182303456864" version="1.0"/>
+
+<refactoring comment="Rename field 'elementFactories' in 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer' to 'factories' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.elementFactories' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.factories' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'elementFactories'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer^elementFactories" name="factories" references="true" setter="false" stamp="1182409951594" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.setDelegateExternalizers(...)' to 'setFactories' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.setDelegateExternalizers(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.setFactories(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setDelegateExternalizers'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer~setDelegateExternalizers~QList\<QAbstractTaskListFactory;>;" name="setFactories" references="true" stamp="1182409970980" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original elements: org.eclipse.mylyn.tasks.ui.TaskListImageHyperlink.java org.eclipse.mylyn.tasks.ui.TaskListHyperlink.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{TaskListImageHyperlink.java" element2="/src<org.eclipse.mylyn.tasks.ui{TaskListHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182450424375" units="2" version="1.0"/>
+<refactoring comment="Extract method 'private boolean hideDecorationOnContainer(AbstractTaskContainer element)' from 'org.eclipse.mylyn.internal.tasks.ui.views.CustomTaskListDecorationDrawer.drawSyncronizationImage()' to 'org.eclipse.mylyn.internal.tasks.ui.views.CustomTaskListDecorationDrawer' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'hideDecorationOnContainer' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.CustomTaskListDecorationDrawer' - Declared visibility: 'private'" comments="false" description="Extract method 'hideDecorationOnContainer'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{CustomTaskListDecorationDrawer.java" name="hideDecorationOnContainer" replace="false" selection="4012 85" stamp="1182539458947" version="1.0" visibility="2"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.tasks.ui.properties' to 'org.eclipse.mylyn.internal.tasks.ui.properties' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.properties' - Renamed element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.properties' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.tasks.ui.properties'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.tasks.ui.properties" name="org.eclipse.mylyn.internal.tasks.ui.properties" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1182561336739" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()' to 'getUiLegendItems' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getUiLegendItems()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLegendItems'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getLegendItems" name="getUiLegendItems" references="true" stamp="1182561639975" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getUiLegendItems()' to 'getLegendItems' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getUiLegendItems()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getUiLegendItems'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getUiLegendItems" name="getLegendItems" references="true" stamp="1182561644645" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryUi' to 'LocalTaskConnectorUi' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryUi' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.LocalTaskConnectorUi' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'LocalRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{LocalRepositoryUi.java[LocalRepositoryUi" matchStrategy="1" name="LocalTaskConnectorUi" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182561740234" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getRepositoryType()' to 'getRepositoryKind' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getRepositoryType()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getRepositoryKind()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryType'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getRepositoryType" name="getRepositoryKind" references="true" stamp="1182562002924" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getRepositoryKind()' to 'getConnectorKind' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getRepositoryKind()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getConnectorKind()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryKind'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getRepositoryKind" name="getConnectorKind" references="true" stamp="1182562045278" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.handlesDueDates(...)' to 'supportsDueDates' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.handlesDueDates(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.supportsDueDates(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handlesDueDates'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~handlesDueDates~QAbstractTask;" name="supportsDueDates" references="true" stamp="1182562064571" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.hasCustomNotificationHandling()' to 'supportsCustomNotificationHandling' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.hasCustomNotificationHandling()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.supportsCustomNotificationHandling()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasCustomNotificationHandling'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~hasCustomNotificationHandling" name="supportsCustomNotificationHandling" references="true" stamp="1182562075170" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.supportsCustomNotificationHandling()' to 'isCustomNotificationHandling' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.supportsCustomNotificationHandling()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.isCustomNotificationHandling()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'supportsCustomNotificationHandling'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~supportsCustomNotificationHandling" name="isCustomNotificationHandling" references="true" stamp="1182562102790" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.AbstractTaskDecorator.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.ui{AbstractTaskDecorator.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1182562260338" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.ContextUiUtil.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{ContextUiUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562400254" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.ITaskCommandIds.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{ITaskCommandIds.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562441907" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.OpenRepositoryTaskJob.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{OpenRepositoryTaskJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562537094" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.ProjectPreferencesLinkProvider' to 'ProjectPropertiesLinkProvider' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.ProjectPreferencesLinkProvider' - Renamed element: 'org.eclipse.mylyn.tasks.ui.ProjectPropertiesLinkProvider' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'ProjectPreferencesLinkProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui{ProjectPreferencesLinkProvider.java[ProjectPreferencesLinkProvider" matchStrategy="1" name="ProjectPropertiesLinkProvider" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182562581708" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.properties' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.properties' - Original element: 'org.eclipse.mylyn.tasks.ui.ProjectPropertiesLinkProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.properties" element1="/src<org.eclipse.mylyn.tasks.ui{ProjectPropertiesLinkProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562590314" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.RepositorySynchronizationManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{RepositorySynchronizationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562608354" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.SynchronizeQueryJob.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{SynchronizeQueryJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562636049" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.SynchronizeTaskJob.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{SynchronizeTaskJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182562663902" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.TaskTransfer.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{TaskTransfer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182563201416" units="1" version="1.0"/>
+<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin' to 'ID_PLUGIN' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.PLUGIN_ID' - Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.ID_PLUGIN' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="false" stamp="1182563345171" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'repositoryConnectorUis' in 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin' to 'repositoryConnectorUiMap' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.repositoryConnectorUis' - Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.repositoryConnectorUiMap' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'repositoryConnectorUis'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^repositoryConnectorUis" name="repositoryConnectorUiMap" references="true" setter="false" stamp="1182563461623" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getRepositoryUi(...)' to 'getConnectorUi' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getRepositoryUi(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getConnectorUi(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getRepositoryUi~QString;" name="getConnectorUi" references="true" stamp="1182563488776" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.handleNewBugPost(...)' to 'handleNewTaskSubmission' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.handleNewBugPost(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.handleNewTaskSubmission(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleNewBugPost'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~handleNewBugPost~QString;~QIProgressMonitor;" name="handleNewTaskSubmission" references="true" stamp="1182564121601" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.handleNewTaskSubmission(...)' to 'submitNewTask' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.handleNewTaskSubmission(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.submitNewTask(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'handleNewTaskSubmission'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~handleNewTaskSubmission~QString;~QIProgressMonitor;" name="submitNewTask" references="true" stamp="1182564133704" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.submitNewTask(...)' to 'updateSubmittedTask' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.submitNewTask(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.updateSubmittedTask(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'submitNewTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~submitNewTask~QString;~QIProgressMonitor;" name="updateSubmittedTask" references="true" stamp="1182564169445" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory.getPriority()' to 'getTabOrderPriority' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory.getPriority()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory.getTabOrderPriority()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getPriority'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorFactory.java[AbstractTaskEditorFactory~getPriority" name="getTabOrderPriority" references="true" stamp="1182564282359" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AttachmentsTableContentProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AttachmentsTableContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564299541" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AttachmentTableLabelProvider.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AttachmentTableLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564328425" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original elements: org.eclipse.mylyn.internal.tasks.ui.AttachmentTableLabelProvider.java org.eclipse.mylyn.internal.tasks.ui.AttachmentsTableContentProvider.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui{AttachmentTableLabelProvider.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui{AttachmentsTableContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564364868" units="2" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.EditorBusyIndicator.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{EditorBusyIndicator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564407635" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.IBusyEditor.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{IBusyEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564434010" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.RepositoryTaskEditorDropListener.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{RepositoryTaskEditorDropListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564515666" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskEditorDropListener.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskEditorDropListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564574297" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.RepositoryTaskOutlineNode.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{RepositoryTaskOutlineNode.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564655645" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.RepositoryTaskSelection.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{RepositoryTaskSelection.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182564999483" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.RepositoryTextViewer.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{RepositoryTextViewer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182565037076" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskFormPage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskFormPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182565111695" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskHyperlinkDetector.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182565197281" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskUrlHyperlink.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskUrlHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182565214472" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskUrlHyperlinkDetector.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskUrlHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182565232106" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.search.AbstractRepositoryQueryPage.saveWidgetValues()' to 'saveState' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.search.AbstractRepositoryQueryPage.saveWidgetValues()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.search.AbstractRepositoryQueryPage.saveState()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'saveWidgetValues'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.search{AbstractRepositoryQueryPage.java[AbstractRepositoryQueryPage~saveWidgetValues" name="saveState" references="true" stamp="1182565301146" version="1.0"/>
+<refactoring comment="Rename field 'MAX_HITS_REACHED' in 'org.eclipse.mylyn.tasks.ui.search.SearchHitCollector' to 'LABEL_MAX_HITS_REACHED' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.search.SearchHitCollector.MAX_HITS_REACHED' - Renamed element: 'org.eclipse.mylyn.tasks.ui.search.SearchHitCollector.LABEL_MAX_HITS_REACHED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MAX_HITS_REACHED'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.search{SearchHitCollector.java[SearchHitCollector^MAX_HITS_REACHED" name="LABEL_MAX_HITS_REACHED" references="true" setter="false" stamp="1182565478291" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.search' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.search' - Original element: 'org.eclipse.mylyn.tasks.ui.search.SearchScoreComputerAdapterFactory.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.search" element1="/src<org.eclipse.mylyn.tasks.ui.search{SearchScoreComputerAdapterFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182565521434" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage.getProxyUsername()' to 'getProxyUserName' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage.getProxyUsername()' - Renamed element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage.getProxyUserName()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'getProxyUsername'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage~getProxyUsername" name="getProxyUserName" references="true" stamp="1182565671606" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskFactory.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182571992496" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.RepositorySynchronizationManager.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{RepositorySynchronizationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182572128568" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.SynchronizeTaskJob.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{SynchronizeTaskJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182572153042" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.SynchronizeQueryJob.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{SynchronizeQueryJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182572175645" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskFormPage.canDoAction(...)' to 'canPerformAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskFormPage.canDoAction(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskFormPage.canPerformAction(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'canDoAction'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskFormPage.java[TaskFormPage~canDoAction~QString;" name="canPerformAction" references="true" stamp="1182572241849" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.editors' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.editors' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskFormPage.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskFormPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1182572360875" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..4302c6a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,77 @@
+1182040582858 Delete element
+1182042930934 Rename local variable 'theSet'
+1182048450657 Rename local variable 'ws'
+1182049269621 Rename package 'org.eclipse.mylyn.internal.tasks.ui.workingset'
+1182049466322 Rename field 'HANDLE_ID'
+1182112281339 Rename type 'Category'
+1182112289583 Rename type 'AdapterCategory'
+1182114606819 Extract constant 'LABEL_TASKS'
+1182132223386 Rename method 'createStatusComposite'
+1182132232570 Rename method 'createWorkingSetComposite'
+1182132287368 Rename field 'menuManager'
+1182132294992 Rename field 'menu'
+1182139878945 Rename type 'ActiveTaskHistoryDropDownAction'
+1182140096649 Rename field 'defaultTooltip'
+1182177664685 Rename type 'TaskAdapterFactory'
+1182180874650 Rename type 'TaskElementFactory'
+1182181923190 Rename local variable 'compositeImages'
+1182181928542 Rename field 'compositeImages'
+1182183465937 Rename type 'SynchronizeTasksJob'
+1182221929842 Rename type 'ITaskEditorFactory'
+1182236932324 Extract method 'acceptContainer'
+1182239178513 Rename resource 'open-browse4r.gif'
+1182303456864 Extract local variable 'queryTagNames'
+1182409951594 Rename field 'elementFactories'
+1182409970980 Rename method 'setDelegateExternalizers'
+1182450424375 Move compilation units
+1182539458947 Extract method 'hideDecorationOnContainer'
+1182561336739 Rename package 'org.eclipse.mylyn.tasks.ui.properties'
+1182561639975 Rename method 'getLegendItems'
+1182561644645 Rename method 'getUiLegendItems'
+1182561740234 Rename type 'LocalRepositoryUi'
+1182562002924 Rename method 'getRepositoryType'
+1182562045278 Rename method 'getRepositoryKind'
+1182562064571 Rename method 'handlesDueDates'
+1182562075170 Rename method 'hasCustomNotificationHandling'
+1182562102790 Rename method 'supportsCustomNotificationHandling'
+1182562260338 Delete element
+1182562400254 Move compilation unit
+1182562441907 Move compilation unit
+1182562537094 Move compilation unit
+1182562581708 Rename type 'ProjectPreferencesLinkProvider'
+1182562590314 Move compilation unit
+1182562608354 Move compilation unit
+1182562636049 Move compilation unit
+1182562663902 Move compilation unit
+1182563201416 Move compilation unit
+1182563345171 Rename field 'PLUGIN_ID'
+1182563461623 Rename field 'repositoryConnectorUis'
+1182563488776 Rename method 'getRepositoryUi'
+1182564121601 Rename method 'handleNewBugPost'
+1182564133704 Rename method 'handleNewTaskSubmission'
+1182564169445 Rename method 'submitNewTask'
+1182564282359 Rename method 'getPriority'
+1182564299541 Move compilation unit
+1182564328425 Move compilation unit
+1182564364868 Move compilation units
+1182564407635 Move compilation unit
+1182564434010 Move compilation unit
+1182564515666 Move compilation unit
+1182564574297 Move compilation unit
+1182564655645 Move compilation unit
+1182564999483 Move compilation unit
+1182565037076 Move compilation unit
+1182565111695 Move compilation unit
+1182565197281 Move compilation unit
+1182565214472 Move compilation unit
+1182565232106 Move compilation unit
+1182565301146 Rename method 'saveWidgetValues'
+1182565478291 Rename field 'MAX_HITS_REACHED'
+1182565521434 Move compilation unit
+1182565671606 Rename method 'getProxyUsername'
+1182571992496 Move compilation unit
+1182572128568 Move compilation unit
+1182572153042 Move compilation unit
+1182572175645 Move compilation unit
+1182572241849 Rename method 'canDoAction'
+1182572360875 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..9026235
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private String generateMessage(List<AbstractTask> toComplete)' from 'org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskCompleteAction.run()' to 'org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskCompleteAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'generateMessage' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskCompleteAction' - Declared visibility: 'private'" comments="false" description="Extract method 'generateMessage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{MarkTaskCompleteAction.java" name="generateMessage" replace="false" selection="2202 279" stamp="1182719031069" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'DESCRIPTION_RETRIEVE' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'TASK_RETRIEVE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.DESCRIPTION_RETRIEVE' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.TASK_RETRIEVE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'DESCRIPTION_RETRIEVE'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^DESCRIPTION_RETRIEVE" name="TASK_RETRIEVE" references="true" setter="false" stamp="1182725613443" textual="false" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.ui/icons/etool16/retrieve-description.gif' to 'task-retrieve.gif' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'retrieve-description.gif'" description="Rename resource 'retrieve-description.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/etool16/retrieve-description.gif" name="task-retrieve.gif" stamp="1182725626402" version="1.0"/>
+<refactoring comment="Rename local variable 'svc' in 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.moveToCategory(...)' to 'progressService' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.moveToCategory(AbstractTaskCategory).svc' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.moveToCategory(AbstractTaskCategory).progressService' - Update references to refactored element" description="Rename local variable 'svc'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{RepositorySearchResultView.java" name="progressService" references="true" selection="9924 3" stamp="1182738452417" version="1.0"/>
+<refactoring comment="Rename local variable 'sortMenu' in 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.fillContextMenu(...)' to 'sortMenuManager' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.fillContextMenu(IMenuManager).sortMenu' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.fillContextMenu(IMenuManager).sortMenuManager' - Update references to refactored element" description="Rename local variable 'sortMenu'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{RepositorySearchResultView.java" name="sortMenuManager" references="true" selection="8431 8" stamp="1182738527329" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.search.AddTaskListAction' to 'CreateQueryFromSearchAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.AddTaskListAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.CreateQueryFromSearchAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'AddTaskListAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{AddTaskListAction.java[AddTaskListAction" matchStrategy="1" name="CreateQueryFromSearchAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182740170273" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'foo.txt'" description="Delete element" element1="foo.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1182810347999" subPackages="false" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.ToggleAllWorkingSetsAction' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction' to top level type - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.ToggleAllWorkingSetsAction' - Field name: 'taskWorkingSetAction' - Parameter name: 'taskWorkingSetAction' - Declare field 'final'" description="Convert member type 'ToggleAllWorkingSetsAction' to top level" field="true" fieldName="taskWorkingSetAction" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskWorkingSetAction.java[TaskWorkingSetAction[ToggleAllWorkingSetsAction" mandatory="true" parameterName="taskWorkingSetAction" possible="true" stamp="1182830063384" version="1.0"/>
+<refactoring comment="Rename local variable 'allWorkingSetContainers' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater.taskActivated(...)' to 'allActiveWorkingSetContainers' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater.taskActivated(AbstractTask).allWorkingSetContainers' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater.taskActivated(AbstractTask).allActiveWorkingSetContainers' - Update references to refactored element" description="Rename local variable 'allWorkingSetContainers'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetUpdater.java" name="allActiveWorkingSetContainers" references="true" selection="5071 23" stamp="1182833556910" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.ToggleWorkingSetAction' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction' to top level type - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.ToggleWorkingSetAction' - Field name: 'taskWorkingSetAction' - Parameter name: 'taskWorkingSetAction' - Declare field 'final'" description="Convert member type 'ToggleWorkingSetAction' to top level" field="true" fieldName="taskWorkingSetAction" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskWorkingSetAction.java[TaskWorkingSetAction[ToggleWorkingSetAction" mandatory="true" parameterName="taskWorkingSetAction" possible="true" stamp="1182834017177" version="1.0"/>
+<refactoring comment="Rename field 'set' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleWorkingSetAction' to 'workingSet' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleWorkingSetAction.set' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleWorkingSetAction.workingSet' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'set'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ToggleWorkingSetAction.java[ToggleWorkingSetAction^set" name="workingSet" references="true" setter="false" stamp="1182834210135" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'etool16' - Original element: 'navigate-previous.gif'" description="Copy file" element1="icons/etool16/navigate-previous.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/navigate-previous.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1182865130291" target="/org.eclipse.mylyn.sandbox.ui/icons/etool16" units="0" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.ui/icons/eview16/focus-tasklist.gif' to 'focus-view.gif' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'focus-tasklist.gif'" description="Rename resource 'focus-tasklist.gif'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="icons/eview16/focus-tasklist.gif" name="focus-view.gif" stamp="1182927549822" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..cdaa080
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1,13 @@
+1182719031069 Extract method 'generateMessage'
+1182725613443 Rename field 'DESCRIPTION_RETRIEVE'
+1182725626402 Rename resource 'retrieve-description.gif'
+1182738452417 Rename local variable 'svc'
+1182738527329 Rename local variable 'sortMenu'
+1182740170273 Rename type 'AddTaskListAction'
+1182810347999 Delete element
+1182830063384 Convert member type 'ToggleAllWorkingSetsAction' to top level
+1182833556910 Rename local variable 'allWorkingSetContainers'
+1182834017177 Convert member type 'ToggleWorkingSetAction' to top level
+1182834210135 Rename field 'set'
+1182865130291 Copy file
+1182927549822 Rename resource 'focus-tasklist.gif'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/27/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/27/refactorings.history
new file mode 100644
index 0000000..0d5f209
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/27/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'tool16' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'tool16' - Original element: 'import.gif'" description="Copy file" element1="icons/etool16/import.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/import.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1183672744430" target="/com.tasktop.doc.ui/icons/tool16" units="0" version="1.0"/>
+<refactoring comment="Rename field 'ID_EDITOR_PLANNING' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor' to 'ID' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor.ID_EDITOR_PLANNING' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor.ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ID_EDITOR_PLANNING'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskPlanningEditor.java[TaskPlanningEditor^ID_EDITOR_PLANNING" name="ID" references="true" setter="false" stamp="1183754989292" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/27/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/27/refactorings.index
new file mode 100644
index 0000000..d5933b3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/27/refactorings.index
@@ -0,0 +1,2 @@
+1183672744430 Copy file
+1183754989292 Rename field 'ID_EDITOR_PLANNING'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..c185286
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename field 'MYLAR_NOTIFICATION_LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup' to 'MYLYN_NOTIFICATION_LABEL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup.MYLAR_NOTIFICATION_LABEL' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup.MYLYN_NOTIFICATION_LABEL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MYLAR_NOTIFICATION_LABEL'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationPopup.java[TaskListNotificationPopup^MYLAR_NOTIFICATION_LABEL" name="MYLYN_NOTIFICATION_LABEL" references="true" setter="false" stamp="1184025572553" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'MYLYN_NOTIFICATION_LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup' to 'LABEL_NOTIFICATION' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup.MYLYN_NOTIFICATION_LABEL' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationPopup.LABEL_NOTIFICATION' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MYLYN_NOTIFICATION_LABEL'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationPopup.java[TaskListNotificationPopup^MYLYN_NOTIFICATION_LABEL" name="LABEL_NOTIFICATION" references="true" setter="false" stamp="1184025582688" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void performUpdate(final TaskRepository repository,final AbstractRepositoryConnector connector,IProgressMonitor monitor)' from 'org.eclipse.mylyn.internal.tasks.ui.views.ResetRepositoryConfigurationAction.run().new Job() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.views.ResetRepositoryConfigurationAction.run().new Job() {...}' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'performUpdate' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.ResetRepositoryConfigurationAction.run().new Job() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'performUpdate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{ResetRepositoryConfigurationAction.java" name="performUpdate" replace="false" selection="2373 199" stamp="1184287748203" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..eabd125
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1,3 @@
+1184025572553 Rename field 'MYLAR_NOTIFICATION_LABEL'
+1184025582688 Rename field 'MYLYN_NOTIFICATION_LABEL'
+1184287748203 Extract method 'performUpdate'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/29/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/29/refactorings.history
new file mode 100644
index 0000000..7fd03df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/29/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private boolean acceptContainer(TreeItem item)' from 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.run()' to 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'acceptContainer' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction' - Declared visibility: 'private'" comments="false" description="Extract method 'acceptContainer'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RemoveFromCategoryAction.java" name="acceptContainer" replace="false" selection="2316 86" stamp="1184804294062" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.REMOVE_FROM_CATEGORY' from expression '"Remove From Category"' - Original project: 'org.eclipse.mylyn.tasks.ui' - Constant name: 'REMOVE_FROM_CATEGORY' - Constant expression: '"Remove From Category"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'REMOVE_FROM_CATEGORY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RemoveFromCategoryAction.java" name="REMOVE_FROM_CATEGORY" qualify="false" replace="true" selection="1566 22" stamp="1184805265539" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'REMOVE_FROM_CATEGORY' in 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction' to 'LABEL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.REMOVE_FROM_CATEGORY' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.LABEL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'REMOVE_FROM_CATEGORY'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RemoveFromCategoryAction.java[RemoveFromCategoryAction^REMOVE_FROM_CATEGORY" name="LABEL" references="true" setter="false" stamp="1184805283291" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.LABEL' from expression '"Remove From Category"' - Original project: 'org.eclipse.mylyn.tasks.ui' - Constant name: 'LABEL' - Constant expression: '"Remove From Category"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RemoveFromCategoryAction.java" name="LABEL" qualify="false" replace="true" selection="1635 22" stamp="1184806316148" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/29/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/29/refactorings.index
new file mode 100644
index 0000000..2627edd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/7/29/refactorings.index
@@ -0,0 +1,4 @@
+1184804294062 Extract method 'acceptContainer'
+1184805265539 Extract constant 'REMOVE_FROM_CATEGORY'
+1184805283291 Rename field 'REMOVE_FROM_CATEGORY'
+1184806316148 Extract constant 'LABEL'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/33/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/33/refactorings.history
new file mode 100644
index 0000000..b1b054b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/33/refactorings.history
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'newSummaryTextViewer' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor' to 'summaryTextViewer' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.newSummaryTextViewer' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.summaryTextViewer' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'newSummaryTextViewer'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor^newSummaryTextViewer" name="summaryTextViewer" references="true" setter="false" stamp="1187107669125" textual="true" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'etool16' - Original element: 'category.gif'" description="Copy file" element1="icons/etool16/category.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/etool16/category.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1187127039593" target="/org.eclipse.mylyn.sandbox.ui/icons/etool16" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.TaskPlanLabelProvider.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskPlanLabelProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1187134531953" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.planner.ActivityReportSorter.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.planner{ActivityReportSorter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1187136609796" subPackages="false" version="1.0"/>
+<refactoring comment="Extract method 'private void addActivityEvent(InteractionEvent event,AbstractTask activatedTask)' from 'org.eclipse.mylyn.tasks.ui.TaskListManager.parseInteractionEvent()' to 'org.eclipse.mylyn.tasks.ui.TaskListManager' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'addActivityEvent' - Destination type: 'org.eclipse.mylyn.tasks.ui.TaskListManager' - Declared visibility: 'private'" comments="false" description="Extract method 'addActivityEvent'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{TaskListManager.java" name="addActivityEvent" replace="false" selection="12649 921" stamp="1187203991687" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TaskListManager.addActivityEvent(...)' to 'addElapsedTimeForEvent' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.TaskListManager.addActivityEvent(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.TaskListManager.addElapsedTimeForEvent(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addActivityEvent'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TaskListManager.java[TaskListManager~addActivityEvent~QInteractionEvent;~QAbstractTask;" name="addElapsedTimeForEvent" references="true" stamp="1187206348437" version="1.0"/>
+<refactoring comment="Change method 'void org.eclipse.mylyn.tasks.ui.TaskListManager.addElapsedTimeForEvent(AbstractTask activatedTask, InteractionEvent event)' to 'void addElapsedTimeForEvent(AbstractTask activatedTask, InteractionEvent event)' - Original project: 'org.eclipse.mylyn.tasks.ui'" delegate="false" deprecate="false" description="Change method 'addElapsedTimeForEvent'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.ui{TaskListManager.java[TaskListManager~addElapsedTimeForEvent~QInteractionEvent;~QAbstractTask;" name="addElapsedTimeForEvent" parameter1="AbstractTask activatedTask 1 AbstractTask activatedTask false" parameter2="InteractionEvent event 0 InteractionEvent event false" stamp="1187206364000" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.ui.LegacyTaskActivity.LEGACY_HANDLE_ATTENTION' from expression '"attention"' - Original project: 'org.eclipse.mylyn.tasks.ui' - Constant name: 'LEGACY_HANDLE_ATTENTION' - Constant expression: '"attention"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LEGACY_HANDLE_ATTENTION'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui{LegacyTaskActivity.java" name="LEGACY_HANDLE_ATTENTION" qualify="false" replace="true" selection="2914 11" stamp="1187206671281" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.LegacyTaskActivity' to 'LegacyActivityParser' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.LegacyTaskActivity' - Renamed element: 'org.eclipse.mylyn.tasks.ui.LegacyActivityParser' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'LegacyTaskActivity'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui{LegacyTaskActivity.java[LegacyTaskActivity" matchStrategy="1" name="LegacyActivityParser" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1187207367218" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.LegacyActivityParser' to 'LegacyActivityAdaptor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.LegacyActivityParser' - Renamed element: 'org.eclipse.mylyn.tasks.ui.LegacyActivityAdaptor' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'LegacyActivityParser'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui{LegacyActivityParser.java[LegacyActivityParser" matchStrategy="1" name="LegacyActivityAdaptor" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1187208682640" textual="true" version="1.0"/>
+
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core' - Original element: 'org.eclipse.mylyn.tasks.ui.LegacyActivityAdaptor.java'" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.tasks.ui{LegacyActivityAdaptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1187210813203" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.LegacyActivityAdaptor.java'" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.internal.tasks.ui{LegacyActivityAdaptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1187211130031" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/33/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/33/refactorings.index
new file mode 100644
index 0000000..58007e5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/33/refactorings.index
@@ -0,0 +1,12 @@
+1187107669125 Rename field 'newSummaryTextViewer'
+1187127039593 Copy file
+1187134531953 Delete element
+1187136609796 Delete element
+1187203991687 Extract method 'addActivityEvent'
+1187206348437 Rename method 'addActivityEvent'
+1187206364000 Change method 'addElapsedTimeForEvent'
+1187206671281 Extract constant 'LEGACY_HANDLE_ATTENTION'
+1187207367218 Rename type 'LegacyTaskActivity'
+1187208682640 Rename type 'LegacyActivityParser'
+1187210813203 Move compilation unit
+1187211130031 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/34/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/34/refactorings.history
new file mode 100644
index 0000000..5d0efb3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/34/refactorings.history
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'etool16' - Original element: 'category.gif'" description="Copy file" element1="icons/etool16/category.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1187715037550" target="/org.eclipse.mylyn.sandbox.ui/icons/etool16" units="0" version="1.0"/>
+<refactoring comment="Extract method 'private void createToolbar(ControlContribution repositoryLabelControl)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.addHeaderControls()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'createToolbar' - Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'createToolbar'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="createToolbar" replace="false" selection="22732 2340" stamp="1187736115157" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createToolbar(...)' to 'fillToolbar' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.createToolbar(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.fillToolbar(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createToolbar'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~createToolbar~QControlContribution;" name="fillToolbar" references="true" stamp="1187736165513" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.fillToolbar(...)' to 'fillToolBar' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.fillToolbar(...)' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.fillToolBar(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'fillToolbar'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~fillToolbar~QIToolBarManager;" name="fillToolBar" references="true" stamp="1187737946171" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.hasActiveChild(...)' to 'showHasActiveChild' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.hasActiveChild(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showHasActiveChild(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasActiveChild'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider~hasActiveChild~QAbstractTaskContainer;" name="showHasActiveChild" references="true" stamp="1187815137538" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.areChildrenPastDue(...)' to 'showChildrenPastDue' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.areChildrenPastDue(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showChildrenPastDue(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'areChildrenPastDue'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider~areChildrenPastDue~QAbstractTaskContainer;" name="showChildrenPastDue" references="true" stamp="1187815146901" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showChildrenPastDue(...)' to 'showHasChildrenPastDue' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showChildrenPastDue(...)' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showHasChildrenPastDue(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'showChildrenPastDue'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider~showChildrenPastDue~QAbstractTaskContainer;" name="showHasChildrenPastDue" references="true" stamp="1187815155603" version="1.0"/>
+<refactoring comment="Rename field 'showSubTasksAction' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to 'filterSubTasksAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.showSubTasksAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.filterSubTasksAction' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'showSubTasksAction'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^showSubTasksAction" name="filterSubTasksAction" references="true" setter="false" stamp="1187815189367" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'subtasksEnabled' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider' to 'subTasksVisible' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.subtasksEnabled' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.subTasksVisible' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'subtasksEnabled'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java[TaskElementLabelProvider^subtasksEnabled" name="subTasksVisible" references="true" setter="false" stamp="1187815201421" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.RepositoryOfflineAction' to 'DisconnectRepositoryAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.RepositoryOfflineAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.DisconnectRepositoryAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryOfflineAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{RepositoryOfflineAction.java[RepositoryOfflineAction" matchStrategy="1" name="DisconnectRepositoryAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1187816797971" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.views.DisconnectRepositoryAction.LABEL' from expression '"Disconnect"' - Original project: 'org.eclipse.mylyn.tasks.ui' - Constant name: 'LABEL' - Constant expression: '"Disconnect"' - Declared visibility: 'private' - Replace occurrences of expression with constant" description="Extract constant 'LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{DisconnectRepositoryAction.java" name="LABEL" qualify="false" replace="true" selection="1321 12" stamp="1187816886903" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfig' to 'TaskTextViewerConfiguration' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfig' - Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in '*.xml, *.xsd' files - Update textual occurrences in comments and strings" description="Rename type 'TaskTextViewerConfig'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfig.java[TaskTextViewerConfig" matchStrategy="1" name="TaskTextViewerConfiguration" patterns="*.xml, *.xsd" qualified="true" references="true" similarDeclarations="true" stamp="1187823370734" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/34/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/34/refactorings.index
new file mode 100644
index 0000000..25d1e76
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/34/refactorings.index
@@ -0,0 +1,12 @@
+1187715037550 Copy file
+1187736115157 Extract method 'createToolbar'
+1187736165513 Rename method 'createToolbar'
+1187737946171 Rename method 'fillToolbar'
+1187815137538 Rename method 'hasActiveChild'
+1187815146901 Rename method 'areChildrenPastDue'
+1187815155603 Rename method 'showChildrenPastDue'
+1187815189367 Rename field 'showSubTasksAction'
+1187815201421 Rename field 'subtasksEnabled'
+1187816797971 Rename type 'RepositoryOfflineAction'
+1187816886903 Extract constant 'LABEL'
+1187823370734 Rename type 'TaskTextViewerConfig'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/35/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/35/refactorings.history
new file mode 100644
index 0000000..1647f28
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/35/refactorings.history
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl()' to nested class - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl().new Listener() {...}' - Class name: 'CustomFilteredTreeDrawer' - Declared visibility: 'private' - Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" name="CustomFilteredTreeDrawer" selection="27629 0" stamp="1188201186048" static="false" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void updatePageEnablement()' from 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.createRepositoryGroup().new KeyListener() {...}.keyReleased()' to 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.createRepositoryGroup().new KeyListener() {...}' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'updatePageEnablement' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.createRepositoryGroup().new KeyListener() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'updatePageEnablement'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="updatePageEnablement" replace="false" selection="5739 219" stamp="1188245003700" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTask.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{OpenRepositoryTask.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1188248030518" units="1" version="1.0"/>
+<refactoring comment="Extract method 'private void setDefaultValuesAndFocus()' from 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setVisible()' to 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'setDefaultValuesAndFocus' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage' - Declared visibility: 'private'" comments="false" description="Extract method 'setDefaultValuesAndFocus'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="setDefaultValuesAndFocus" replace="false" selection="12398 915" stamp="1188249849743" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private boolean isTaskKeyCandidate(String contents,boolean looksLikeKey)' from 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setDefaultValuesAndFocus()' to 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'isTaskKeyCandidate' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage' - Declared visibility: 'private'" comments="false" description="Extract method 'isTaskKeyCandidate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="isTaskKeyCandidate" replace="false" selection="14027 299" stamp="1188250983748" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'MAX_SELECTION_HISTORY_SIZE' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to 'SIZE_MAX_SELECTION_HISTORY' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.MAX_SELECTION_HISTORY_SIZE' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.SIZE_MAX_SELECTION_HISTORY' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MAX_SELECTION_HISTORY_SIZE'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^MAX_SELECTION_HISTORY_SIZE" name="SIZE_MAX_SELECTION_HISTORY" references="true" setter="false" stamp="1188262089459" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'tableSortIdentifier' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to 'MEMENTO_KEY_SORT_INDEX_QUAL' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.tableSortIdentifier' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.MEMENTO_KEY_SORT_INDEX_QUAL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'tableSortIdentifier'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^tableSortIdentifier" name="MEMENTO_KEY_SORT_INDEX_QUAL" references="true" setter="false" stamp="1188262235843" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'MEMENTO_KEY_SORT_INDEX_QUAL' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to 'MEMENTO_SORT_INDEX' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.MEMENTO_KEY_SORT_INDEX_QUAL' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.MEMENTO_SORT_INDEX' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'MEMENTO_KEY_SORT_INDEX_QUAL'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^MEMENTO_KEY_SORT_INDEX_QUAL" name="MEMENTO_SORT_INDEX" references="true" setter="false" stamp="1188262278120" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.ITaskListPresentation'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{ITaskListPresentation.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1188264195337" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListPresentation' to 'AbstractTaskListPresentation' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListPresentation' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TaskListPresentation'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListPresentation.java[TaskListPresentation" matchStrategy="1" name="AbstractTaskListPresentation" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1188264428062" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public AbstractTaskListContentProvider org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation.createContentProvider()' to 'public AbstractTaskListContentProvider createContentProvider(TaskListView view)' - Original project: 'org.eclipse.mylyn.tasks.ui' - Added parameters: TaskListView view" default1="null" delegate="false" deprecate="true" description="Change method 'createContentProvider'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{AbstractTaskListPresentation.java[AbstractTaskListPresentation~createContentProvider" name="createContentProvider" parameter1="{added} {added} -1 TaskListView view false" stamp="1188265924763" version="1.0"/>
+<refactoring comment="Rename field 'view' in 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider' to 'taskListView' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider.view' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider.taskListView' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'view'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{AbstractTaskListContentProvider.java[AbstractTaskListContentProvider^view" name="taskListView" references="true" setter="false" stamp="1188266549665" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'iconDescriptor' in 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader.readPresentation(...)' to 'imageDescriptor' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader.readPresentation(IConfigurationElement).iconDescriptor' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader.readPresentation(IConfigurationElement).imageDescriptor' - Update references to refactored element" description="Rename local variable 'iconDescriptor'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiExtensionReader.java[TasksUiExtensionReader~readPresentation~QIConfigurationElement;@iconDescriptor!10261!10393!10277!10290!QImageDescriptor;" name="imageDescriptor" references="true" stamp="1188266893289" version="1.0"/>
+<refactoring comment="Rename field 'PRESENTATION_SCHEDULED_ID' in 'org.eclipse.mylyn.internal.tasks.ui.views.ScheduledPresentation' to 'ID' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.ScheduledPresentation.PRESENTATION_SCHEDULED_ID' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.ScheduledPresentation.ID' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PRESENTATION_SCHEDULED_ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{ScheduledPresentation.java[ScheduledPresentation^PRESENTATION_SCHEDULED_ID" name="ID" references="true" setter="false" stamp="1188266978156" textual="false" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui' - Original elements: org.eclipse.mylyn.internal.tasks.ui.views.ScheduledPresentation.java org.eclipse.mylyn.internal.tasks.ui.views.CategorizedPresentation.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{ScheduledPresentation.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.views{CategorizedPresentation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1188267740789" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 3 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original elements: etool16 scr-capture.gif scr-fit.gif" description="Delete elements" element1="icons/etool16" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1188275797424" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'TaskListDropAdapter.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1188418717312" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/35/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/35/refactorings.index
new file mode 100644
index 0000000..0d7c64a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/8/35/refactorings.index
@@ -0,0 +1,17 @@
+1188201186048 Convert anonymous class to nested
+1188245003700 Extract method 'updatePageEnablement'
+1188248030518 Copy compilation unit
+1188249849743 Extract method 'setDefaultValuesAndFocus'
+1188250983748 Extract method 'isTaskKeyCandidate'
+1188262089459 Rename field 'MAX_SELECTION_HISTORY_SIZE'
+1188262235843 Rename field 'tableSortIdentifier'
+1188262278120 Rename field 'MEMENTO_KEY_SORT_INDEX_QUAL'
+1188264195337 Delete element
+1188264428062 Rename type 'TaskListPresentation'
+1188265924763 Change method 'createContentProvider'
+1188266549665 Rename field 'view'
+1188266893289 Rename local variable 'iconDescriptor'
+1188266978156 Rename field 'PRESENTATION_SCHEDULED_ID'
+1188267740789 Move compilation units
+1188275797424 Delete elements
+1188418717312 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/36/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/36/refactorings.history
new file mode 100644
index 0000000..190fb4e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/36/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'LABEL_CLEAR' in 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor' to 'LABEL_NOT_SCHEDULED' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.LABEL_CLEAR' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.LABEL_NOT_SCHEDULED' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'LABEL_CLEAR'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java[ScheduleTaskMenuContributor^LABEL_CLEAR" name="LABEL_NOT_SCHEDULED" references="true" setter="false" stamp="1189217170484" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/36/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/36/refactorings.index
new file mode 100644
index 0000000..21b5dca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/36/refactorings.index
@@ -0,0 +1 @@
+1189217170484 Rename field 'LABEL_CLEAR'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/37/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/37/refactorings.history
new file mode 100644
index 0000000..73a1709
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/37/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider.getLogicalRootChildren(...)' to 'getFilteredRootChildren'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider.getLogicalRootChildren(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider.getFilteredRootChildren(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLogicalRootChildren'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListContentProvider.java[TaskListContentProvider~getLogicalRootChildren~QAbstractTaskContainer;" name="getFilteredRootChildren" references="true" stamp="1189454748218" version="1.0"/>
<refactoring comment="Rename field 'FILTER_SUBTASKS' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'GROUP_SUBTASKS'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.FILTER_SUBTASKS'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.GROUP_SUBTASKS'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'FILTER_SUBTASKS'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^FILTER_SUBTASKS" name="GROUP_SUBTASKS" references="true" setter="false" stamp="1189568761783" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterSubTasksAction' to 'GroupSubTasksAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterSubTasksAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.GroupSubTasksAction'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'FilterSubTasksAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{FilterSubTasksAction.java[FilterSubTasksAction" matchStrategy="1" name="GroupSubTasksAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1189569007997" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/37/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/37/refactorings.index
new file mode 100644
index 0000000..b00a620
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/37/refactorings.index
@@ -0,0 +1,3 @@
+1189454748218 Rename method 'getLogicalRootChildren'
+1189568761783 Rename field 'FILTER_SUBTASKS'
+1189569007997 Rename type 'FilterSubTasksAction'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/38/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/38/refactorings.history
new file mode 100644
index 0000000..75ce0e7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/38/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneThisBugAction' to 'CloneThisTaskAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneThisBugAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneThisTaskAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'CloneThisBugAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{CloneThisBugAction.java[CloneThisBugAction" matchStrategy="1" name="CloneThisTaskAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190247056134" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneThisTaskAction' to 'CloneTaskAction' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneThisTaskAction' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneTaskAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'CloneThisTaskAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{CloneThisTaskAction.java[CloneThisTaskAction" matchStrategy="1" name="CloneTaskAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1190247463367" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'PAGE_DESCRIPTION' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage' to 'TITLE' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage.PAGE_DESCRIPTION' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage.TITLE' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'PAGE_DESCRIPTION'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{PreviewAttachmentPage.java[PreviewAttachmentPage^PAGE_DESCRIPTION" name="TITLE" references="true" setter="false" stamp="1190260835246" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void refreshTask(TaskContainerDelta taskContainerDelta)' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.new ITaskListChangeListener() {...}.containersChanged().new Runnable() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' - Original project: 'org.eclipse.mylyn.tasks.ui' - Method name: 'refreshTask' - Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' - Declared visibility: 'private'" comments="false" description="Extract method 'refreshTask'" destination="2" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" name="refreshTask" replace="false" selection="16809 1043" stamp="1190313359281" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.dialogs.AbstractWorkingSetDialog' to 'AbstractWorkingSetDialogCOPY' - Original project: 'org.eclipse.mylyn.tasks.ui' - Original element: 'org.eclipse.mylyn.internal.tasks.ui.dialogs.AbstractWorkingSetDialog' - Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.dialogs.AbstractWorkingSetDialogCOPY' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'AbstractWorkingSetDialog'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.dialogs{AbstractWorkingSetDialog.java[AbstractWorkingSetDialog" matchStrategy="1" name="AbstractWorkingSetDialogCOPY" qualified="false" references="true" similarDeclarations="false" stamp="1190399016711" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/38/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/38/refactorings.index
new file mode 100644
index 0000000..3bd197e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/38/refactorings.index
@@ -0,0 +1,5 @@
+1190247056134 Rename type 'CloneThisBugAction'
+1190247463367 Rename type 'CloneThisTaskAction'
+1190260835246 Rename field 'PAGE_DESCRIPTION'
+1190313359281 Extract method 'refreshTask'
+1190399016711 Rename type 'AbstractWorkingSetDialog'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/39/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/39/refactorings.history
new file mode 100644
index 0000000..0ef43eb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private boolean showHasActiveChildHelper(AbstractTaskContainer container)' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showHasActiveChild()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'showHasActiveChildHelper'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider'
- Declared visibility: 'private'" comments="false" description="Extract method 'showHasActiveChildHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java" name="showHasActiveChildHelper" replace="false" selection="13402 262" stamp="1190672695364" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private boolean showHasChildrenPastDue(AbstractTaskContainer container)' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.showHasChildrenPastDue()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'showHasChildrenPastDue'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider'
- Declared visibility: 'private'" comments="false" description="Extract method 'showHasChildrenPastDue'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java" name="showHasChildrenPastDue" replace="false" selection="14102 319" stamp="1190672784418" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private boolean hasIncomingHelper(AbstractTaskContainer container)' from 'org.eclipse.mylyn.internal.tasks.ui.views.CustomTaskListDecorationDrawer.hasIncoming()' to 'org.eclipse.mylyn.internal.tasks.ui.views.CustomTaskListDecorationDrawer'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'hasIncomingHelper'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.CustomTaskListDecorationDrawer'
- Declared visibility: 'private'" comments="false" description="Extract method 'hasIncomingHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{CustomTaskListDecorationDrawer.java" name="hasIncomingHelper" replace="false" selection="5697 398" stamp="1190673582945" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private boolean hasChildrenHelper(Object parent)' from 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider.hasChildren()' to 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'hasChildrenHelper'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider'
- Declared visibility: 'private'" comments="false" description="Extract method 'hasChildrenHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListContentProvider.java" name="hasChildrenHelper" replace="false" selection="3105 446" stamp="1190678789520" version="1.0" visibility="2"/>
<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl().new IPageListener() {...}' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl()' to nested class
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.createPartControl().new IPageListener() {...}'
- Class name: 'PAGE_LISTENER'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" name="PAGE_LISTENER" selection="32220 0" stamp="1190763130020" static="false" version="1.0" visibility="2"/>
<refactoring comment="Rename local variable 'containers' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER.new ITaskListChangeListener() {...}.containersChanged(...)' to 'delta'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER.new ITaskListChangeListener() {...}.containersChanged(Set<TaskContainerDelta>).containers'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER.new ITaskListChangeListener() {...}.containersChanged(Set<TaskContainerDelta>).delta'
- Update references to refactored element" description="Rename local variable 'containers'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^TASK_REFERESH_LISTENER[~containersChanged~QSet\<QTaskContainerDelta;>;@containers!16759!16798!16789!16798!QSet" name="delta" references="true" stamp="1190819972466" version="1.0"/>
<refactoring comment="Rename local variable 'delta' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER.new ITaskListChangeListener() {...}.containersChanged(...)' to 'deltas'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER.new ITaskListChangeListener() {...}.containersChanged(Set<TaskContainerDelta>).delta'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER.new ITaskListChangeListener() {...}.containersChanged(Set<TaskContainerDelta>).deltas'
- Update references to refactored element" description="Rename local variable 'delta'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^TASK_REFERESH_LISTENER[~containersChanged~QSet\<QTaskContainerDelta;>;@delta!16759!16793!16789!16793!QSet" name="deltas" references="true" stamp="1190819979353" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ContextMenuContributor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ContextMenuContributor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1190825875140" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'OVERLAY_LOCAL' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'OVERLAY_LOCAL_TASK'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVERLAY_LOCAL'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVERLAY_LOCAL_TASK'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'OVERLAY_LOCAL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^OVERLAY_LOCAL" name="OVERLAY_LOCAL_TASK" references="true" setter="false" stamp="1190853104872" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'etool16'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'etool16'
- Original element: 'presentation.gif'" description="Copy file" element1="icons/etool16/presentation.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1190857471577" target="/org.eclipse.mylyn.java.ui/icons/etool16" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/39/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/39/refactorings.index
new file mode 100644
index 0000000..27baaae
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2007/9/39/refactorings.index
@@ -0,0 +1,10 @@
+1190672695364 Extract method 'showHasActiveChildHelper'
+1190672784418 Extract method 'showHasChildrenPastDue'
+1190673582945 Extract method 'hasIncomingHelper'
+1190678789520 Extract method 'hasChildrenHelper'
+1190763130020 Convert anonymous class to nested
+1190819972466 Rename local variable 'containers'
+1190819979353 Rename local variable 'delta'
+1190825875140 Delete element
+1190853104872 Rename field 'OVERLAY_LOCAL'
+1190857471577 Copy file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/1/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/1/refactorings.history
new file mode 100644
index 0000000..d59a24e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/1/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'query-unmatched.gif'" description="Delete element" element1="icons/etool16/query-unmatched.gif" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1199431646421" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/1/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/1/refactorings.index
new file mode 100644
index 0000000..61c2881
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/1/refactorings.index
@@ -0,0 +1 @@
+1199431646421 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/2/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/2/refactorings.history
new file mode 100644
index 0000000..746b5bc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/2/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListImageHyperlink'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListImageHyperlink.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1199904661806" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'strikethrough' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink' to 'strikeThrough'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink.strikethrough'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink.strikeThrough'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'strikethrough'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListHyperlink.java[TaskListHyperlink^strikethrough" name="strikeThrough" references="true" setter="true" stamp="1199906043421" textual="false" version="1.0"/>
<refactoring comment="Rename field 'rowHint' in 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint' to 'rowSpan'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.rowHint'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.rowSpan'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'rowHint'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint^rowHint" name="rowSpan" references="true" setter="false" stamp="1200206132097" textual="false" version="1.0"/>
<refactoring comment="Rename field 'columnHint' in 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint' to 'columnSpan'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.columnHint'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.columnSpan'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'columnHint'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint^columnHint" name="columnSpan" references="true" setter="false" stamp="1200206141911" textual="false" version="1.0"/>
<refactoring comment="Rename enum constant 'MULTI' of 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Column' to 'MULTIPLE'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Column.MULTI'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Column.MULTIPLE'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'MULTI'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint[Column^MULTI" name="MULTIPLE" references="true" setter="false" stamp="1200206184245" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Column' to 'Span'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Column'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Span'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'Column'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint[Column" matchStrategy="1" name="Span" qualified="false" references="true" similarDeclarations="false" stamp="1200206197043" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Row' to 'RowSpan'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Row'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.RowSpan'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'Row'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint[Row" matchStrategy="1" name="RowSpan" qualified="false" references="true" similarDeclarations="false" stamp="1200206223401" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Span' to 'ColumnSpan'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.Span'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.ColumnSpan'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'Span'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint[Span" matchStrategy="1" name="ColumnSpan" qualified="false" references="true" similarDeclarations="false" stamp="1200206235139" textual="false" version="1.0"/>
<refactoring comment="Rename enum constant 'MULTI' of 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.RowSpan' to 'MULTIPLE'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.RowSpan.MULTI'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.LayoutHint.RowSpan.MULTIPLE'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename enum constant 'MULTI'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.enum.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{LayoutHint.java[LayoutHint[RowSpan^MULTI" name="MULTIPLE" references="true" setter="false" stamp="1200206495211" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorFormPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorFormPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1200213159415" subPackages="false" version="1.0"/>
<refactoring comment="Extract method 'private void createAttachmentTable(FormToolkit toolkit,final Composite attachmentsComposite)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart.createControl()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createAttachmentTable'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart'
- Declared visibility: 'private'" comments="false" description="Extract method 'createAttachmentTable'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentPart.java" name="createAttachmentTable" replace="false" selection="3714 2637" stamp="1200213676448" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void createAttachmentTableMenu()' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart.createControl()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createAttachmentTableMenu'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart'
- Declared visibility: 'private'" comments="false" description="Extract method 'createAttachmentTableMenu'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentPart.java" name="createAttachmentTableMenu" replace="false" selection="3774 5884" stamp="1200213775478" version="1.0" visibility="2"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1200215659134" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart' to 'TaskEditorAttachmentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentPart'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AttachmentPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentPart.java[AttachmentPart" matchStrategy="1" name="TaskEditorAttachmentPart" qualified="false" references="true" similarDeclarations="false" stamp="1200216526028" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createCommentLayout(...)' to 'createCommentSection'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createCommentLayout(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createCommentSection(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createCommentLayout'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage~createCommentLayout~QComposite;" name="createCommentSection" references="true" stamp="1200217086809" version="1.0"/>
<refactoring comment="Rename field 'refreshEnabled' in 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage' to 'reflowEnabled'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.refreshEnabled'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.reflowEnabled'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'refreshEnabled'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage^refreshEnabled" name="reflowEnabled" references="true" setter="true" stamp="1200217176703" textual="false" version="1.0"/>
<refactoring comment="Rename field 'reflowEnabled' in 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage' to 'reflow'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.reflowEnabled'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.reflow'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'reflowEnabled'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage^reflowEnabled" name="reflow" references="true" setter="true" stamp="1200217803024" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorHeaderPart' to 'TaskEditorSummaryPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorHeaderPart'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskEditorHeaderPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorHeaderPart.java[TaskEditorHeaderPart" matchStrategy="1" name="TaskEditorSummaryPart" qualified="false" references="true" similarDeclarations="false" stamp="1200221906635" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOperationsPart' to 'TaskEditorActionPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOperationsPart'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskEditorOperationsPart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorOperationsPart.java[TaskEditorOperationsPart" matchStrategy="1" name="TaskEditorActionPart" qualified="false" references="true" similarDeclarations="false" stamp="1200255342486" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionSection' to 'TaskEditorDescriptionPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionSection'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskEditorDescriptionSection'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorDescriptionSection.java[TaskEditorDescriptionSection" matchStrategy="1" name="TaskEditorDescriptionPart" qualified="false" references="true" similarDeclarations="false" stamp="1200255915988" textual="false" version="1.0"/>
<refactoring comment="Copy 1 element(s) to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorNewCommentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorNewCommentPart'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.createPreviewButton(...)'" description="Copy method" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorNewCommentPart.java[TaskEditorNewCommentPart" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorDescriptionPart.java[TaskEditorDescriptionPart~createPreviewButton~QComposite;~QTextViewer;~QComposite;~QStackLayout;~QFormToolkit;" flags="589830" id="org.eclipse.jdt.ui.copy" members="1" policy="org.eclipse.jdt.ui.copyMembers" stamp="1200257471287" version="1.0"/>
<refactoring comment="Copy 2 element(s) to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorNewCommentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorNewCommentPart'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.addBrowser(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.previewWiki(...)" description="Copy methods" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorNewCommentPart.java[TaskEditorNewCommentPart" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorDescriptionPart.java[TaskEditorDescriptionPart~addBrowser~QComposite;~I" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorDescriptionPart.java[TaskEditorDescriptionPart~previewWiki~QBrowser;~QString;" flags="589830" id="org.eclipse.jdt.ui.copy" members="2" policy="org.eclipse.jdt.ui.copyMembers" stamp="1200257501288" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createDescriptionLayout(...)' to 'createDescriptionSection'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createDescriptionLayout(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createDescriptionSection(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createDescriptionLayout'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage~createDescriptionLayout~QComposite;" name="createDescriptionSection" references="true" stamp="1200259346387" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/2/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/2/refactorings.index
new file mode 100644
index 0000000..8265019
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/2/refactorings.index
@@ -0,0 +1,23 @@
+1199904661806 Delete element
+1199906043421 Rename field 'strikethrough'
+1200206132097 Rename field 'rowHint'
+1200206141911 Rename field 'columnHint'
+1200206184245 Rename enum constant 'MULTI'
+1200206197043 Rename type 'Column'
+1200206223401 Rename type 'Row'
+1200206235139 Rename type 'Span'
+1200206495211 Rename enum constant 'MULTI'
+1200213159415 Delete element
+1200213676448 Extract method 'createAttachmentTable'
+1200213775478 Extract method 'createAttachmentTableMenu'
+1200215659134 Copy compilation unit
+1200216526028 Rename type 'AttachmentPart'
+1200217086809 Rename method 'createCommentLayout'
+1200217176703 Rename field 'refreshEnabled'
+1200217803024 Rename field 'reflowEnabled'
+1200221906635 Rename type 'TaskEditorHeaderPart'
+1200255342486 Rename type 'TaskEditorOperationsPart'
+1200255915988 Rename type 'TaskEditorDescriptionSection'
+1200257471287 Copy method
+1200257501288 Copy methods
+1200259346387 Rename method 'createDescriptionLayout'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/3/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/3/refactorings.history
new file mode 100644
index 0000000..830c44d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/3/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private ResetRepositoryConfigurationAction fillToolBar()' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttributePart.createControl()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttributePart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'fillToolBar'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttributePart'
- Declared visibility: 'private'" comments="false" description="Extract method 'fillToolBar'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorAttributePart.java" name="fillToolBar" replace="false" selection="2399 1573" stamp="1200277297341" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void createPart(TaskEditorAttributePart attributePart)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.createAttributeSection()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createPart'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'createPart'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java" name="createPart" replace="false" selection="16795 748" stamp="1200278285008" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'attachContextEnabled' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart' to 'needsAttachContext'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart.attachContextEnabled'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart.needsAttachContext'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'attachContextEnabled'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionPart.java[TaskEditorActionPart^attachContextEnabled" name="needsAttachContext" references="true" setter="true" stamp="1200389115699" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart.isNeedsAttachContext()' to 'needsAttachContext'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart.isNeedsAttachContext()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart.needsAttachContext()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'isNeedsAttachContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionPart.java[TaskEditorActionPart~isNeedsAttachContext" name="needsAttachContext" references="true" stamp="1200389127083" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultsContentProvider.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.search{SearchResultsContentProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1200456885243" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'taskContentProvider' in 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView' to 'searchResultProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.taskContentProvider'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.searchResultProvider'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'taskContentProvider'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{RepositorySearchResultView.java[RepositorySearchResultView^taskContentProvider" name="searchResultProvider" references="true" setter="true" stamp="1200457562917" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_OVERDUE' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts' to 'THEME_COLOR_TASK_OVER_SCHEDULED'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_OVERDUE'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_OVER_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_OVERDUE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^THEME_COLOR_TASK_OVERDUE" name="THEME_COLOR_TASK_OVER_SCHEDULED" references="true" setter="true" stamp="1200622237167" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_OVER_SCHEDULED' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts' to 'THEME_COLOR_TASK_PAST_SCHEDULED'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_OVER_SCHEDULED'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_PAST_SCHEDULED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_OVER_SCHEDULED'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^THEME_COLOR_TASK_OVER_SCHEDULED" name="THEME_COLOR_TASK_PAST_SCHEDULED" references="true" setter="true" stamp="1200624039454" textual="false" version="1.0"/>
<refactoring comment="Rename field 'THEME_COLOR_TASK_OVER_DUE' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts' to 'THEME_COLOR_TASK_PAST_DUE'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_OVER_DUE'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.THEME_COLOR_TASK_PAST_DUE'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'THEME_COLOR_TASK_OVER_DUE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListColorsAndFonts.java[TaskListColorsAndFonts^THEME_COLOR_TASK_OVER_DUE" name="THEME_COLOR_TASK_PAST_DUE" references="true" setter="true" stamp="1200624054604" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/3/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/3/refactorings.index
new file mode 100644
index 0000000..0e96020
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/3/refactorings.index
@@ -0,0 +1,9 @@
+1200277297341 Extract method 'fillToolBar'
+1200278285008 Extract method 'createPart'
+1200389115699 Rename field 'attachContextEnabled'
+1200389127083 Rename method 'isNeedsAttachContext'
+1200456885243 Delete element
+1200457562917 Rename field 'taskContentProvider'
+1200622237167 Rename field 'THEME_COLOR_TASK_OVERDUE'
+1200624039454 Rename field 'THEME_COLOR_TASK_OVER_SCHEDULED'
+1200624054604 Rename field 'THEME_COLOR_TASK_OVER_DUE'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/4/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/4/refactorings.history
new file mode 100644
index 0000000..b21888b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/4/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TaskStatusMenuContributor' to 'MarkTaskMenuContributor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskStatusMenuContributor'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.MarkTaskMenuContributor'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskStatusMenuContributor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskStatusMenuContributor.java[TaskStatusMenuContributor" matchStrategy="1" name="MarkTaskMenuContributor" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1201218531558" textual="false" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.LABEL_THIS_WEEK' from expression '"This week"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_THIS_WEEK'
- Constant expression: '"This week"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_THIS_WEEK'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java" name="LABEL_THIS_WEEK" qualify="false" replace="true" selection="6184 11" stamp="1201223961195" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/4/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/4/refactorings.index
new file mode 100644
index 0000000..ee51af5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/4/refactorings.index
@@ -0,0 +1,2 @@
+1201218531558 Rename type 'TaskStatusMenuContributor'
+1201223961195 Extract constant 'LABEL_THIS_WEEK'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/5/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/5/refactorings.history
new file mode 100644
index 0000000..2b04b85
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/5/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.PREF_SORT_ORDER_PREFIX' from expression '"org.eclipse.mylyn.editor.comments.sortDirectionDown."'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'PREF_SORT_ORDER_PREFIX'
- Constant expression: '"org.eclipse.mylyn.editor.comments.sortDirectionDown."'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'PREF_SORT_ORDER_PREFIX'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" name="PREF_SORT_ORDER_PREFIX" qualify="false" replace="true" selection="20568 54" stamp="1201401016187" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'AbstractRepositoryTaskEditor.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/tasks/ui/editors/AbstractRepositoryTaskEditor.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1201544238903" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.DatePicker.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{DatePicker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1201571319901" units="1" version="1.0"/>
<refactoring comment="Extract method 'private void setScheduledDate(AbstractTask task,Calendar scheduledDate)' from 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager().new Action() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager().new Action() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'setScheduledDate'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager().new Action() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'setScheduledDate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java" name="setScheduledDate" replace="false" selection="7651 87" stamp="1201573586889" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.ScheduleDatePicker.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{ScheduleDatePicker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1201585469309" units="1" version="1.0"/>
<refactoring comment="Extract method 'private Date getScheduledForDate(final AbstractTask singleTaskSelection)' from 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager()' to 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getScheduledForDate'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'getScheduledForDate'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java" name="getScheduledForDate" replace="true" selection="4700 41" stamp="1201628656386" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/5/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/5/refactorings.index
new file mode 100644
index 0000000..c2dfdaf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/1/5/refactorings.index
@@ -0,0 +1,6 @@
+1201401016187 Extract constant 'PREF_SORT_ORDER_PREFIX'
+1201544238903 Delete element
+1201571319901 Copy compilation unit
+1201573586889 Extract method 'setScheduledDate'
+1201585469309 Move compilation unit
+1201628656386 Extract method 'getScheduledForDate'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..efcef3c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'region' from expression 'new Region(contentOffset + m.start(),m.end() - m.start())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'region'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector.detectHyperlinks()'
- Variable expression: 'new Region(contentOffset + m.start(),m.end() - m.start())'
- Replace occurrences of expression with variable" description="Extract local variable 'region'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskRelationHyperlinkDetector.java" name="region" replace="true" selection="2559 58" stamp="1222829814229" version="1.0"/>

<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.setManualFiltersEnabled()' to 'updateFilterEnablement'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.setManualFiltersEnabled()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.updateFilterEnablement()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setManualFiltersEnabled'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView~setManualFiltersEnabled" name="updateFilterEnablement" references="true" stamp="1222846950167" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.updateFilterEnablement().text' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.updateFilterEnablement()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.updateFilterEnablement().text'" description="Inline local variable 'text'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java" selection="59761 28" stamp="1222847079631" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.deprecated.CopyAttachmentToClipboardJob.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{CopyAttachmentToClipboardJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915044634" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.deprecated.DownloadAttachmentJob.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{DownloadAttachmentJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915052278" subPackages="false" version="1.0"/>
<refactoring comment="Move 9 elements(s) to 'editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'editors'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditorInput.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractNewRepositoryTaskEditor.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryQueryWizard.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.TaskFormPage.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractTaskEditorFactory.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.TaskFactory.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.NewTaskEditorInput.java
 org.eclipse.mylyn.internal.tasks.ui.deprecated.RepositoryTaskEditorInput.java" description="Move compilation units" element1="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{AbstractRepositoryTaskEditorInput.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{AbstractNewRepositoryTaskEditor.java" element3="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{AbstractRepositoryQueryWizard.java" element4="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{AbstractRepositoryTaskEditor.java" element5="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{TaskFormPage.java" element6="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{TaskFactory.javaorFactory.java" element7="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{TaskFactory.java" element8="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{RepositoryTaskEditorInp" element9="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated{RepositoryTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1222915091594" target="/org.eclipse.mylyn/developer/src-old/editors" units="9" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentTableLabelProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915622584" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewAttachmentWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915650624" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.InputAttachmentSourcePage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{InputAttachmentSourcePage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915659233" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewAttachmentPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915666642" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{PreviewAttachmentPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915672384" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenshotAttachmentPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ScreenshotAttachmentPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915710426" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentsTableContentProvider.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentsTableContentProvider.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915802551" subPackages="false" version="1.0"/>
<refactoring comment="Move 4 elements(s) to 'editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'editors'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineComparer.java
 org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode.java
 org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlinePage.java
 org.eclipse.mylyn.internal.tasks.ui.editors.ContentOutlineTools.java" description="Move compilation units" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskOutlineComparer.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskOutlineNode.java" element3="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskOutlinePage.java" element4="/src<org.eclipse.mylyn.internal.tasks.ui.editors{ContentOutlineTools.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1222915855176" target="/org.eclipse.mylyn/developer/src-old/editors" units="4" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.ControlSelectionService.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{ControlSelectionService.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915871176" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.IRepositoryTaskAttributeListener.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{IRepositoryTaskAttributeListener.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915878322" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.IRepositoryTaskSelection.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{IRepositoryTaskSelection.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915884827" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryAttachmentEditorInput.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryAttachmentEditorInput.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915890642" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskEditorDropListener.java'
- Update references to refactored element" description="Move compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskEditorDropListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222915954223" target="/org.eclipse.mylyn/developer/src-old/editors" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskSpellingReconcileStrategy.java'
- Update references to refactored element" description="Move compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskSpellingReconcileStrategy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222915968428" target="/org.eclipse.mylyn/developer/src-old/editors" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizardDialog.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewAttachmentWizardDialog.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915975994" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.LegacyChangeManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{LegacyChangeManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915984210" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.OfflineCachingStorage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{OfflineCachingStorage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222915989742" subPackages="false" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'tasks'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'tasks'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.OfflineCachingStorage.java
 org.eclipse.mylyn.internal.tasks.ui.OfflineFileStorage.java
- Update references to refactored element" description="Move compilation units" element1="/src<org.eclipse.mylyn.internal.tasks.ui{OfflineCachingStorage.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui{OfflineFileStorage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222916062112" target="/org.eclipse.mylyn/developer/src-old/tasks" units="2" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'src-old'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'src-old'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.RepositoryAwareStatusHandler.java'
- Update references to refactored element" description="Move compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.ui{RepositoryAwareStatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222916075859" target="/org.eclipse.mylyn/developer/src-old" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskSelection.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222917012507" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachAction.java
 org.eclipse.mylyn.internal.tasks.ui.actions.AttachScreenshotAction.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachScreenshotAction.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AttachAction.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222917388255" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ImageAttachment.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ImageAttachment.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222928202786" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'taskSelection' in 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction' to 'taskMapping'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction.taskSelection'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction.taskMapping'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'taskSelection'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewTaskFromSelectionAction.java[NewTaskFromSelectionAction^taskSelection" name="taskMapping" references="true" setter="false" stamp="1222928375943" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryTaskAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AddRepositoryTaskAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222931910295" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterArchiveContainerAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{FilterArchiveContainerAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222931956601" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.CommonAddExistingTaskWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{CommonAddExistingTaskWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222932118781" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.AddExistingTaskWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{AddExistingTaskWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222932152744" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.SpellingDialog.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{SpellingDialog.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1222932823300" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..395293e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1,34 @@
+1222829814229 Extract local variable 'region'
+1222846950167 Rename method 'setManualFiltersEnabled'
+1222847079631 Inline local variable 'text'
+1222915044634 Delete element
+1222915052278 Delete element
+1222915091594 Move compilation units
+1222915622584 Delete element
+1222915650624 Delete element
+1222915659233 Delete element
+1222915666642 Delete element
+1222915672384 Delete element
+1222915710426 Delete element
+1222915802551 Delete element
+1222915855176 Move compilation units
+1222915871176 Delete element
+1222915878322 Delete element
+1222915884827 Delete element
+1222915890642 Delete element
+1222915954223 Move compilation unit
+1222915968428 Move compilation unit
+1222915975994 Delete element
+1222915984210 Delete element
+1222915989742 Delete element
+1222916062112 Move compilation units
+1222916075859 Move compilation unit
+1222917012507 Delete element
+1222917388255 Delete elements
+1222928202786 Delete element
+1222928375943 Rename field 'taskSelection'
+1222931910295 Delete element
+1222931956601 Delete element
+1222932118781 Delete element
+1222932152744 Delete element
+1222932823300 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/41/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/41/refactorings.history
new file mode 100644
index 0000000..21cab87
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/41/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'creationDate' from expression 'task.getCreationDate()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'creationDate'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor.createSummarySection()'
- Variable expression: 'task.getCreationDate()'
- Replace occurrences of expression with variable" description="Extract local variable 'creationDate'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskPlanningEditor.java" name="creationDate" replace="true" selection="17143 22" stamp="1223349309545" version="1.0"/>
<refactoring comment="Extract local variable 'creationDate' from expression 't1.getCreationDate()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'creationDate'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter.sortByDate()'
- Variable expression: 't1.getCreationDate()'
- Replace occurrences of expression with variable" description="Extract local variable 'creationDate'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListTableSorter.java" name="creationDate" replace="true" selection="7447 20" stamp="1223349625902" version="1.0"/>
<refactoring comment="Inline method 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager.getTaskListWriter()' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager.getTaskListWriter()'
- Remove method declaration
- Replace all references to method with statements" delete="true" description="Inline method 'getTaskListWriter'" flags="786438" id="org.eclipse.jdt.ui.inline.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java" mode="1" selection="1131 0" stamp="1223356018401" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1223448958499" units="1" version="1.0"/>
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager'
- Sub types:
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager
- Extracted class: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.REGION_COMPARATOR
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.viewer
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.textPresentationListener
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.hyperlinkDetector
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.getHyperlinkDetector()
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.setHyperlinkDetector(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.install(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.uninstall()
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.computeStyleRanges(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.addRange(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkTextPresentationManager.RegionComparator" delete="6" description="Extract superclass 'AbstractHyperlinkTextPresentationManager'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager^REGION_COMPARATOR" element10="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~addRange~QList\<QStyleRange;>;~I~I" element11="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager[RegionComparator" element12="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~addRange~QList\<QStyleRange;>;~I~I" element13="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~getHyperlinkDetectorIRegion;" element14="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~getHyperlinkDetector" element15="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~setHyperlinkDetector~QI" element16="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~setHyperlinkDetector~QIHyperlinkDetector;" element17="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~uninstall" element18="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager^textPr" element3="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager^textPresentationListener" element4="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~getHyperlinkDetec" element5="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~getHyperlinkDetector" element6="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~install~QISourceViewer;HyperlinkDetector;" element7="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~install~QISourceViewer;" element8="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~computeSt" element9="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager~computeStyleRanges~QIRegion;" extract="11" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkTextPresentationManager.java[TaskHyperlinkTextPresentationManager" instanceof="false" name="AbstractHyperlinkTextPresentationManager" replace="false" stamp="1223590794763" stubs="true" types="1" version="1.0"/>
<refactoring comment="Extract method 'private List<IRegion> getRegions(IRegion extent)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager.computeStyleRanges()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getRegions'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager'
- Declared visibility: 'private'" comments="false" description="Extract method 'getRegions'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractHyperlinkTextPresentationManager.java" name="getRegions" replace="false" selection="3545 429" stamp="1223591328013" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void decorateText(StyleRange styleRange)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager.addRange()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'decorateText'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractHyperlinkTextPresentationManager'
- Declared visibility: 'private'" comments="false" description="Extract method 'decorateText'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractHyperlinkTextPresentationManager.java" name="decorateText" replace="false" selection="5234 28" stamp="1223591400793" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private IAdaptable getDefaultHyperlinkTarget()' from 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.getHyperlinkDetectorTargets()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getDefaultHyperlinkTarget'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration'
- Declared visibility: 'private'" comments="false" description="Extract method 'getDefaultHyperlinkTarget'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewerConfiguration.java" name="getDefaultHyperlinkTarget" replace="false" selection="5595 193" stamp="1223593256344" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private RepositoryTextViewerConfiguration configure()' from 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.createControl()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'configure'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor'
- Declared visibility: 'private'" comments="false" description="Extract method 'configure'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RichTextAttributeEditor.java" name="configure" replace="false" selection="5172 204" stamp="1223594300796" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1223606594250" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/41/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/41/refactorings.index
new file mode 100644
index 0000000..a880bf1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/41/refactorings.index
@@ -0,0 +1,10 @@
+1223349309545 Extract local variable 'creationDate'
+1223349625902 Extract local variable 'creationDate'
+1223356018401 Inline method 'getTaskListWriter'
+1223448958499 Copy compilation unit
+1223590794763 Extract superclass 'AbstractHyperlinkTextPresentationManager'
+1223591328013 Extract method 'getRegions'
+1223591400793 Extract method 'decorateText'
+1223593256344 Extract method 'getDefaultHyperlinkTarget'
+1223594300796 Extract method 'configure'
+1223606594250 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/42/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/42/refactorings.history
new file mode 100644
index 0000000..a0b3c32
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/42/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'MESSAGE_ADDED_TO_UNCATEGORIZED' from expression '"The new task has been added to the root of the list, since tasks can not be added to a query."'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'MESSAGE_ADDED_TO_UNCATEGORIZED'
- Constant expression: '"The new task has been added to the root of the list, since tasks can not be added to a query."'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'MESSAGE_ADDED_TO_UNCATEGORIZED'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java" name="MESSAGE_ADDED_TO_UNCATEGORIZED" qualify="false" replace="true" selection="19685 95" stamp="1224001802457" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'LABEL_CREATE_TASK' from expression '"Create Task"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_CREATE_TASK'
- Constant expression: '"Create Task"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_CREATE_TASK'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java" name="LABEL_CREATE_TASK" qualify="false" replace="true" selection="19823 13" stamp="1224001879859" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.hasPreview()' to 'hasPreviewViewer'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.hasPreview()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.hasPreviewViewer()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasPreview'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RichTextAttributeEditor.java[RichTextAttributeEditor~hasPreview" name="hasPreviewViewer" references="true" stamp="1224219079967" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.hasPreviewViewer()' to 'hasPreview'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.hasPreviewViewer()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.hasPreview()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasPreviewViewer'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RichTextAttributeEditor.java[RichTextAttributeEditor~hasPreviewViewer" name="hasPreview" references="true" stamp="1224219158981" version="1.0"/>
<refactoring comment="Extract local variable 'browserViewer2' from expression 'getBrowserViewer()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'browserViewer2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.showBrowser()'
- Variable expression: 'getBrowserViewer()'
- Replace occurrences of expression with variable" description="Extract local variable 'browserViewer2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RichTextAttributeEditor.java" name="browserViewer2" replace="true" selection="15639 18" stamp="1224219346195" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.PreviewAttributeEditor' to 'BrowserPreviewViewer'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.PreviewAttributeEditor'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.BrowserPreviewViewer'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'PreviewAttributeEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{PreviewAttributeEditor.java[PreviewAttributeEditor" matchStrategy="1" name="BrowserPreviewViewer" qualified="false" references="true" similarDeclarations="true" stamp="1224220595894" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/42/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/42/refactorings.index
new file mode 100644
index 0000000..9796111
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/42/refactorings.index
@@ -0,0 +1,6 @@
+1224001802457 Extract constant 'MESSAGE_ADDED_TO_UNCATEGORIZED'
+1224001879859 Extract constant 'LABEL_CREATE_TASK'
+1224219079967 Rename method 'hasPreview'
+1224219158981 Rename method 'hasPreviewViewer'
+1224219346195 Extract local variable 'browserViewer2'
+1224220595894 Rename type 'PreviewAttributeEditor'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/43/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/43/refactorings.history
new file mode 100644
index 0000000..238633a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/43/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.search{AbstractRepositorySearchQuery.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1224453298513" subPackages="false" version="1.0"/>
<refactoring comment="Extract local variable 'repositoryPerson' from expression 'getAttributeMapper().getRepositoryPerson(getTaskAttribute())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'repositoryPerson'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.PersonAttributeEditor.getValue()'
- Variable expression: 'getAttributeMapper().getRepositoryPerson(getTaskAttribute())'
- Replace occurrences of expression with variable" description="Extract local variable 'repositoryPerson'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{PersonAttributeEditor.java" name="repositoryPerson" replace="true" selection="987 60" stamp="1224737272005" version="1.0"/>
<refactoring comment="Extract local variable 'taskKindLabel2' from expression 'connectorUi.getTaskKindLabel(task)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskKindLabel2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip.getDetailsText()'
- Variable expression: 'connectorUi.getTaskKindLabel(task)'
- Replace occurrences of expression with variable" description="Extract local variable 'taskKindLabel2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTip.java" name="taskKindLabel2" replace="true" selection="7365 34" stamp="1224895812722" version="1.0"/>
<refactoring comment="Extract local variable 'taskKind' from expression 'task.getTaskKind()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskKind'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip.getDetailsText()'
- Variable expression: 'task.getTaskKind()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskKind'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTip.java" name="taskKind" replace="true" selection="7588 18" stamp="1224895850167" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/43/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/43/refactorings.index
new file mode 100644
index 0000000..783bcfa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/43/refactorings.index
@@ -0,0 +1,4 @@
+1224453298513 Delete element
+1224737272005 Extract local variable 'repositoryPerson'
+1224895812722 Extract local variable 'taskKindLabel2'
+1224895850167 Extract local variable 'taskKind'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/44/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/44/refactorings.history
new file mode 100644
index 0000000..880ce99
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/44/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant '_12' from expression '12'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: '_12'
- Constant expression: '12'
- Declared visibility: 'private'" description="Extract constant '_12'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{CommentGroupStrategy.java" name="_12" qualify="false" replace="false" selection="2237 2" stamp="1225159228461" version="1.0" visibility="2"/>

<refactoring comment="Extract local variable 'commentGroup' from expression 'commentGroups.get(commentGroups.size() - 1)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'commentGroup'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.expandSection()'
- Variable expression: 'commentGroups.get(commentGroups.size() - 1)'
- Replace occurrences of expression with variable" description="Extract local variable 'commentGroup'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="commentGroup" replace="true" selection="6441 43" stamp="1225160826794" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/44/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/44/refactorings.index
new file mode 100644
index 0000000..9e11372
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/10/44/refactorings.index
@@ -0,0 +1,2 @@
+1225159228461 Extract constant '_12'
+1225160826794 Extract local variable 'commentGroup'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/45/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/45/refactorings.history
new file mode 100644
index 0000000..0f6165c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/45/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.RepositoryTextViewerHyperlinkPresenter' in 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.RepositoryTextViewerHyperlinkPresenter'
- Field name: 'repositoryTextViewerConfiguration'
- Declare field 'final'" description="Convert member type 'RepositoryTextViewerHyperlinkPresenter' to top level" field="false" fieldName="repositoryTextViewerConfiguration" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewerConfiguration.java[RepositoryTextViewerConfiguration[RepositoryTextViewerHyperlinkPresenter" mandatory="false" possible="false" stamp="1226129912928" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerHyperlinkPresenter' to 'TaskHyperlinkPresenter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerHyperlinkPresenter'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkPresenter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'RepositoryTextViewerHyperlinkPresenter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewerHyperlinkPresenter.java[RepositoryTextViewerHyperlinkPresenter" matchStrategy="1" name="TaskHyperlinkPresenter" qualified="false" references="true" similarDeclarations="false" stamp="1226129939483" textual="false" version="1.0"/>
<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkPresenter.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkPresenter.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1226130769532" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkPresenter.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkPresenter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1226132595018" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/45/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/45/refactorings.index
new file mode 100644
index 0000000..57649c4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/45/refactorings.index
@@ -0,0 +1,4 @@
+1226129912928 Convert member type 'RepositoryTextViewerHyperlinkPresenter' to top level
+1226129939483 Rename type 'RepositoryTextViewerHyperlinkPresenter'
+1226130769532 Infer generic type arguments
+1226132595018 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/48/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/48/refactorings.history
new file mode 100644
index 0000000..2d21597
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/48/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.jira.ui/src/org.eclipse.mylyn.internal.jira.ui.editor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.jira.ui/src/org.eclipse.mylyn.internal.jira.ui.editor'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.jira.ui/src<org.eclipse.mylyn.internal.jira.ui.editor" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorAttachmentPart.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1227728187205" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentsTableContentProvider2.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentsTableContentProvider2.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1227742555509" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider2' to 'AttachmentTableLabelProvider'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider2'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'AttachmentTableLabelProvider2'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentTableLabelProvider2.java[AttachmentTableLabelProvider2" matchStrategy="1" name="AttachmentTableLabelProvider" qualified="false" references="true" similarDeclarations="true" stamp="1227742577845" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/48/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/48/refactorings.index
new file mode 100644
index 0000000..b0b2757
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/11/48/refactorings.index
@@ -0,0 +1,3 @@
+1227728187205 Copy compilation unit
+1227742555509 Delete element
+1227742577845 Rename type 'AttachmentTableLabelProvider2'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/12/50/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/12/50/refactorings.history
new file mode 100644
index 0000000..5433ff0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/12/50/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction' to 'AddTaskRepositoryAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AddTaskRepositoryAction'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'AddRepositoryAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AddRepositoryAction.java[AddRepositoryAction" matchStrategy="1" name="AddTaskRepositoryAction" qualified="false" references="true" similarDeclarations="true" stamp="1228615811940" textual="false" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.AddTaskRepositoryAction.TITLE' in 'org.eclipse.mylyn.internal.tasks.ui.actions.AddTaskRepositoryAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.AddTaskRepositoryAction.TITLE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'TITLE'" flags="786438" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{AddTaskRepositoryAction.java" remove="true" replace="true" selection="1871 0" stamp="1228615855028" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction.ACTION_NAME' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction.ACTION_NAME'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'ACTION_NAME'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ClearOutgoingAction.java" remove="true" replace="true" selection="1458 0" stamp="1228616191787" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneTaskAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneTaskAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CloneTaskAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{CloneTaskAction.java" remove="true" replace="true" selection="1830 0" stamp="1228616207047" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.CollapseAllAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.CollapseAllAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CollapseAllAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{CollapseAllAction.java" remove="true" replace="true" selection="891 0" stamp="1228616215440" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{CopyTaskDetailsAction.java" remove="true" replace="true" selection="1503 0" stamp="1228616281155" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.ExpandAllAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ExpandAllAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ExpandAllAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ExpandAllAction.java" remove="true" replace="true" selection="890 0" stamp="1228616598521" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction.LABEL'
- Remove constant declaration" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{FilterCompletedTasksAction.java" remove="true" replace="false" selection="1348 0" stamp="1228616820281" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{FilterCompletedTasksAction.java" remove="true" replace="true" selection="1133 0" stamp="1228616823940" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.GoIntoAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.GoIntoAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.GoIntoAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{GoIntoAction.java" remove="true" replace="true" selection="1082 0" stamp="1228616840442" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.GroupSubTasksAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.GroupSubTasksAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.GroupSubTasksAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{GroupSubTasksAction.java" remove="true" replace="true" selection="1076 0" stamp="1228616863389" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.MoveTaskToRootAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{MoveTaskToRootAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1228617049475" subPackages="false" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction.TOOLTIP' in 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction.TOOLTIP'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'TOOLTIP'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewSubTaskAction.java" remove="true" replace="true" selection="2517 0" stamp="1228617075245" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewSubTaskAction.java" remove="true" replace="true" selection="2515 0" stamp="1228617078368" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskFromSelectionAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewTaskFromSelectionAction.java" remove="true" replace="true" selection="1371 0" stamp="1228617115043" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTask' to 'OpenRepositoryTaskAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTask'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTaskAction'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'OpenRepositoryTask'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{OpenRepositoryTask.java[OpenRepositoryTask" matchStrategy="1" name="OpenRepositoryTaskAction" qualified="false" references="true" similarDeclarations="true" stamp="1228617168947" textual="false" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenTasksUiPreferencesAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenTasksUiPreferencesAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenTasksUiPreferencesAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{OpenTasksUiPreferencesAction.java" remove="true" replace="true" selection="1085 0" stamp="1228617200992" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{OpenWithBrowserAction.java" remove="true" replace="true" selection="1120 0" stamp="1228617217975" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction.LABEL_NAME' in 'org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction.LABEL_NAME'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_NAME'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{PresentationDropDownSelectionAction.java" remove="true" replace="true" selection="1257 0" stamp="1228617228767" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RemoveFromCategoryAction.java" remove="true" replace="true" selection="1343 0" stamp="1228617448264" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.RenameAction.LABEL_NAME' in 'org.eclipse.mylyn.internal.tasks.ui.actions.RenameAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.RenameAction.LABEL_NAME'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_NAME'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RenameAction.java" remove="true" replace="true" selection="1176 0" stamp="1228617457573" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeAutomaticallyAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeAutomaticallyAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeAutomaticallyAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{SynchronizeAutomaticallyAction.java" remove="true" replace="true" selection="1009 0" stamp="1228617473707" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction.LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction.LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{SynchronizeEditorAction.java" remove="true" replace="true" selection="1314 0" stamp="1228617484560" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction.TOOLTIP' in 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction.TOOLTIP'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'TOOLTIP'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{SynchronizeEditorAction.java" remove="true" replace="true" selection="1317 0" stamp="1228617487760" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.LABEL_SETS_NONE' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.LABEL_SETS_NONE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_SETS_NONE'" flags="786438" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskWorkingSetAction.java" remove="true" replace="true" selection="2521 0" stamp="1228617572666" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.TASK_WORKING_SET_TEXT_LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction.TASK_WORKING_SET_TEXT_LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'TASK_WORKING_SET_TEXT_LABEL'" flags="786438" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskWorkingSetAction.java" remove="true" replace="true" selection="2522 0" stamp="1228617590421" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction.LABEL_ACTIVATE' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction.LABEL_ACTIVATE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_ACTIVATE'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ToggleTaskActivationAction.java" remove="true" replace="true" selection="1150 0" stamp="1228617611732" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction.LABEL_DEACTIVATE' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction.LABEL_DEACTIVATE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_DEACTIVATE'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ToggleTaskActivationAction.java" remove="true" replace="true" selection="1152 0" stamp="1228617615115" version="1.0"/>

<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.views.PriorityDropDownAction.FILTER_PRIORITY_LABEL' in 'org.eclipse.mylyn.internal.tasks.ui.views.PriorityDropDownAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.PriorityDropDownAction.FILTER_PRIORITY_LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'FILTER_PRIORITY_LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{PriorityDropDownAction.java" remove="true" replace="true" selection="1277 0" stamp="1228617866300" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog.LABEL_SHELL' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog.LABEL_SHELL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_SHELL'" flags="786438" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskInputDialog.java" remove="true" replace="true" selection="2090 0" stamp="1228617890741" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog.LABEL_DESCRIPTION' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog.LABEL_DESCRIPTION'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_DESCRIPTION'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskInputDialog.java" remove="true" replace="true" selection="2092 0" stamp="1228617893461" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_ACTIVE_NONE' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_ACTIVE_NONE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_ACTIVE_NONE'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java" remove="true" replace="true" selection="3715 0" stamp="1228617975094" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_SETS_EDIT' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_SETS_EDIT'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_SETS_EDIT'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java" remove="true" replace="true" selection="3718 0" stamp="1228617977802" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_SETS_MULTIPLE' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree.LABEL_SETS_MULTIPLE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'LABEL_SETS_MULTIPLE'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListFilteredTree.java" remove="true" replace="true" selection="3718 0" stamp="1228617981180" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.wizards.AttachmentPreviewPage.DESCRIPTION' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.AttachmentPreviewPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.AttachmentPreviewPage.DESCRIPTION'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'DESCRIPTION'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{AttachmentPreviewPage.java" remove="true" replace="true" selection="2552 0" stamp="1228780658985" version="1.0"/>
<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.tasks.ui.wizards.AttachmentPreviewPage.TITLE' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.AttachmentPreviewPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.AttachmentPreviewPage.TITLE'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'TITLE'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{AttachmentPreviewPage.java" remove="true" replace="true" selection="2679 0" stamp="1228780662154" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/12/50/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/12/50/refactorings.index
new file mode 100644
index 0000000..eefb395
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/12/50/refactorings.index
@@ -0,0 +1,36 @@
+1228615811940 Rename type 'AddRepositoryAction'
+1228615855028 Inline constant 'TITLE'
+1228616191787 Inline constant 'ACTION_NAME'
+1228616207047 Inline constant 'LABEL'
+1228616215440 Inline constant 'LABEL'
+1228616281155 Inline constant 'LABEL'
+1228616598521 Inline constant 'LABEL'
+1228616820281 Inline constant 'LABEL'
+1228616823940 Inline constant 'LABEL'
+1228616840442 Inline constant 'LABEL'
+1228616863389 Inline constant 'LABEL'
+1228617049475 Delete element
+1228617075245 Inline constant 'TOOLTIP'
+1228617078368 Inline constant 'LABEL'
+1228617115043 Inline constant 'LABEL'
+1228617168947 Rename type 'OpenRepositoryTask'
+1228617200992 Inline constant 'LABEL'
+1228617217975 Inline constant 'LABEL'
+1228617228767 Inline constant 'LABEL_NAME'
+1228617448264 Inline constant 'LABEL'
+1228617457573 Inline constant 'LABEL_NAME'
+1228617473707 Inline constant 'LABEL'
+1228617484560 Inline constant 'LABEL'
+1228617487760 Inline constant 'TOOLTIP'
+1228617572666 Inline constant 'LABEL_SETS_NONE'
+1228617590421 Inline constant 'TASK_WORKING_SET_TEXT_LABEL'
+1228617611732 Inline constant 'LABEL_ACTIVATE'
+1228617615115 Inline constant 'LABEL_DEACTIVATE'
+1228617866300 Inline constant 'FILTER_PRIORITY_LABEL'
+1228617890741 Inline constant 'LABEL_SHELL'
+1228617893461 Inline constant 'LABEL_DESCRIPTION'
+1228617975094 Inline constant 'LABEL_ACTIVE_NONE'
+1228617977802 Inline constant 'LABEL_SETS_EDIT'
+1228617981180 Inline constant 'LABEL_SETS_MULTIPLE'
+1228780658985 Inline constant 'DESCRIPTION'
+1228780662154 Inline constant 'TITLE'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/5/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/5/refactorings.history
new file mode 100644
index 0000000..dc922e5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'open' from expression 'dialog.open()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'open'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryLocationUi.PasswordRunner.run()'
- Variable expression: 'dialog.open()'
- Replace occurrences of expression with variable" description="Extract local variable 'open'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskRepositoryLocationUi.java" name="open" replace="true" selection="3010 13" stamp="1201892336770" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/5/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/5/refactorings.index
new file mode 100644
index 0000000..c4ca72e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/5/refactorings.index
@@ -0,0 +1 @@
+1201892336770 Extract local variable 'open'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/6/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/6/refactorings.history
new file mode 100644
index 0000000..e44a480
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/6/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'product' from expression 'Platform.getProduct()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'product'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.getPopupShellTitle()'
- Variable expression: 'Platform.getProduct()'
- Replace occurrences of expression with variable" description="Extract local variable 'product'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java" name="product" replace="true" selection="4286 21" stamp="1202150863246" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.dialogs.EditCredentialsDialog' to 'TaskRepositoryCredentialsDialog'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.dialogs.EditCredentialsDialog'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.dialogs.TaskRepositoryCredentialsDialog'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'EditCredentialsDialog'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.dialogs{EditCredentialsDialog.java[EditCredentialsDialog" matchStrategy="1" name="TaskRepositoryCredentialsDialog" qualified="false" references="true" similarDeclarations="false" stamp="1202332247851" textual="false" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.dialogs.TaskRepositoryCredentialsDialog.ENTER_CREDENTIALS' from expression '"Enter Credentials"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ENTER_CREDENTIALS'
- Constant expression: '"Enter Credentials"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ENTER_CREDENTIALS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.dialogs{TaskRepositoryCredentialsDialog.java" name="ENTER_CREDENTIALS" qualify="false" replace="true" selection="6547 19" stamp="1202332363083" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/6/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/6/refactorings.index
new file mode 100644
index 0000000..3d3ef75
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/6/refactorings.index
@@ -0,0 +1,3 @@
+1202150863246 Extract local variable 'product'
+1202332247851 Rename type 'EditCredentialsDialog'
+1202332363083 Extract constant 'ENTER_CREDENTIALS'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/7/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/7/refactorings.history
new file mode 100644
index 0000000..f3c8346
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/7/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.addHeaderControls()' to 'updateHeaderControls'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.addHeaderControls()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.updateHeaderControls()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addHeaderControls'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java[AbstractRepositoryTaskEditor~addHeaderControls" name="updateHeaderControls" references="true" stamp="1202860462629" version="1.0"/>
<refactoring comment="Extract method 'private boolean hasOutgoingChanges(AbstractTask task)' from 'org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction.ClearOutgoingAction()' to 'org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'hasOutgoingChanges'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction'
- Declared visibility: 'private'" comments="false" description="Extract method 'hasOutgoingChanges'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ClearOutgoingAction.java" name="hasOutgoingChanges" replace="false" selection="1766 146" stamp="1203016101971" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/7/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/7/refactorings.index
new file mode 100644
index 0000000..6314f68
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/7/refactorings.index
@@ -0,0 +1,2 @@
+1202860462629 Rename method 'addHeaderControls'
+1203016101971 Extract method 'hasOutgoingChanges'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/8/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/8/refactorings.history
new file mode 100644
index 0000000..e18d500
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/8/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'connectorUi' from expression 'TasksUiPlugin.getConnectorUi(task.getConnectorKind())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'connectorUi'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip.getDetailsText()'
- Variable expression: 'TasksUiPlugin.getConnectorUi(task.getConnectorKind())'
- Replace occurrences of expression with variable" description="Extract local variable 'connectorUi'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTip.java" name="connectorUi" replace="true" selection="6551 53" stamp="1203474528717" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ACTIVITY_TIMEOUT' to 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ACTIVITY_TIMEOUT'
- Destination type: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_TIMEOUT'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^ACTIVITY_TIMEOUT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.monitor.ui/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin" stamp="1203556956446" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ACTIVITY_TIMEOUT_ENABLED' to 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants.ACTIVITY_TIMEOUT_ENABLED'
- Destination type: 'org.eclipse.mylyn.monitor.ui.MonitorUiPlugin'" delegate="false" deprecate="true" description="Move member 'ACTIVITY_TIMEOUT_ENABLED'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants^ACTIVITY_TIMEOUT_ENABLED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.monitor.ui/src<org.eclipse.mylyn.monitor.ui{MonitorUiPlugin.java[MonitorUiPlugin" stamp="1203556965961" version="1.0"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.ui/icons/etool16/editing_16.gif' to 'edit.gif'" description="Rename resource 'editing_16.gif'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="icons/etool16/editing_16.gif" name="edit.gif" stamp="1203574492720" updateReferences="true"/>
<refactoring comment="Rename resource '/org.eclipse.mylyn.tasks.ui/icons/etool16/cut_edit.gif' to 'cut.gif'" description="Rename resource 'cut_edit.gif'" flags="7" id="org.eclipse.ltk.core.refactoring.rename.resource" input="icons/etool16/cut_edit.gif" name="cut.gif" stamp="1203575257817" updateReferences="true"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/8/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/8/refactorings.index
new file mode 100644
index 0000000..52bb6be
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/2/8/refactorings.index
@@ -0,0 +1,5 @@
+1203474528717 Extract local variable 'connectorUi'
+1203556956446 Move member 'ACTIVITY_TIMEOUT'
+1203556965961 Move member 'ACTIVITY_TIMEOUT_ENABLED'
+1203574492720 Rename resource 'editing_16.gif'
+1203575257817 Rename resource 'cut_edit.gif'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/10/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/10/refactorings.history
new file mode 100644
index 0000000..c42429b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/10/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'repositoryTasks' from expression 'TasksUiPlugin.getTaskListManager().getTaskList().getRepositoryTasks(taskRepository.getUrl())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'repositoryTasks'
- Destination method: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.TaskCompletionProcessor.computeCompletionProposals()'
- Variable expression: 'TasksUiPlugin.getTaskListManager().getTaskList().getRepositoryTasks(taskRepository.getUrl())'
- Replace occurrences of expression with variable" description="Extract local variable 'repositoryTasks'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java" name="repositoryTasks" replace="true" selection="10923 92" stamp="1204787005554" version="1.0"/>
<refactoring comment="Extract method 'private String extracted()' from 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.TaskCompletionProcessor.addTasks()' to 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.TaskCompletionProcessor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'extracted'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.TaskCompletionProcessor'
- Declared visibility: 'private'" comments="false" description="Extract method 'extracted'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java" name="extracted" replace="false" selection="11646 27" stamp="1204787893240" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskTextViewerConfiguration.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskTextViewerConfiguration.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1204789664274" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskTextViewerConfiguration' to 'RepositoryTextViewerConfiguration'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskTextViewerConfiguration'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'TaskTextViewerConfiguration'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskTextViewerConfiguration.java[TaskTextViewerConfiguration" matchStrategy="1" name="RepositoryTextViewerConfiguration" qualified="false" references="true" similarDeclarations="true" stamp="1204789708756" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.TaskCompletionProcessor' to 'RepositoryCompletionProcessor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.TaskCompletionProcessor'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.RepositoryCompletionProcessor'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'TaskCompletionProcessor'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewerConfiguration.java[RepositoryTextViewerConfiguration[TaskCompletionProcessor" matchStrategy="1" name="RepositoryCompletionProcessor" qualified="false" references="true" similarDeclarations="true" stamp="1204789729216" textual="false" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.RepositoryCompletionProcessor' in 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.RepositoryCompletionProcessor'
- Field name: 'repositoryTextViewerConfiguration'
- Declare field 'final'" description="Convert member type 'RepositoryCompletionProcessor' to top level" field="false" fieldName="repositoryTextViewerConfiguration" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewerConfiguration.java[RepositoryTextViewerConfiguration[RepositoryCompletionProcessor" mandatory="false" possible="false" stamp="1204790368318" version="1.0"/>
<refactoring comment="Extract local variable 'taskList' from expression 'TasksUiPlugin.getTaskListManager().getTaskList()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskList'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor.computeCompletionProposals()'
- Variable expression: 'TasksUiPlugin.getTaskListManager().getTaskList()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskList'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryCompletionProcessor.java" name="taskList" replace="true" selection="2901 53" stamp="1204792493542" version="1.0"/>
<refactoring comment="Extract local variable 'processor' from expression 'new RepositoryCompletionProcessor(taskRepository)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'processor'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.getContentAssistant()'
- Variable expression: 'new RepositoryCompletionProcessor(taskRepository)'
- Replace occurrences of expression with variable" description="Extract local variable 'processor'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewerConfiguration.java" name="processor" replace="true" selection="9252 49" stamp="1204792616968" version="1.0"/>
<refactoring comment="Extract method 'private void filterTasks(List<AbstractTask> tasks)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor.computeCompletionProposals()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'filterTasks'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor'
- Declared visibility: 'private'" comments="false" description="Extract method 'filterTasks'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryCompletionProcessor.java" name="filterTasks" replace="false" selection="2506 206" stamp="1204793191266" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'next' from expression 'it.next()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'next'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor.filterTasks()'
- Variable expression: 'it.next()'
- Replace occurrences of expression with variable" description="Extract local variable 'next'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryCompletionProcessor.java" name="next" replace="true" selection="3377 9" stamp="1204793224488" version="1.0"/>
<refactoring comment="Extract local variable 'task' from expression 'input.getTask()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'task'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor.computeCompletionProposals()'
- Variable expression: 'input.getTask()'
- Replace occurrences of expression with variable" description="Extract local variable 'task'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryCompletionProcessor.java" name="task" replace="true" selection="7723 15" stamp="1205034135191" version="1.0"/>
<refactoring comment="Extract local variable 'abstractTask' from expression 'tasks.get(i)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'abstractTask'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor.computeCompletionProposals()'
- Variable expression: 'tasks.get(i)'
- Replace occurrences of expression with variable" description="Extract local variable 'abstractTask'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryCompletionProcessor.java" name="abstractTask" replace="true" selection="8346 12" stamp="1205034578079" version="1.0"/>
<refactoring comment="Extract local variable 'editor2' from expression '(AbstractTaskEditorPageFactory)editor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'editor2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader.readTaskEditorPageFactory()'
- Variable expression: '(AbstractTaskEditorPageFactory)editor'
- Replace occurrences of expression with variable" description="Extract local variable 'editor2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiExtensionReader.java" name="editor2" replace="true" selection="14619 38" stamp="1205044298492" version="1.0"/>
<refactoring comment="Extract method 'private void updateTitleImage()' from 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor.addPages()' to 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'updateTitleImage'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateTitleImage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditor.java" name="updateTitleImage" replace="false" selection="10453 652" stamp="1205044596587" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory.getPageTitle()' to 'getPageText'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory.getPageTitle()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory.getPageText()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getPageTitle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPageFactory.java[AbstractTaskEditorPageFactory~getPageTitle" name="getPageText" references="true" stamp="1205047090460" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/10/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/10/refactorings.index
new file mode 100644
index 0000000..7696140
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/10/refactorings.index
@@ -0,0 +1,15 @@
+1204787005554 Extract local variable 'repositoryTasks'
+1204787893240 Extract method 'extracted'
+1204789664274 Move compilation unit
+1204789708756 Rename type 'TaskTextViewerConfiguration'
+1204789729216 Rename type 'TaskCompletionProcessor'
+1204790368318 Convert member type 'RepositoryCompletionProcessor' to top level
+1204792493542 Extract local variable 'taskList'
+1204792616968 Extract local variable 'processor'
+1204793191266 Extract method 'filterTasks'
+1204793224488 Extract local variable 'next'
+1205034135191 Extract local variable 'task'
+1205034578079 Extract local variable 'abstractTask'
+1205044298492 Extract local variable 'editor2'
+1205044596587 Extract method 'updateTitleImage'
+1205047090460 Rename method 'getPageTitle'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/11/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/11/refactorings.history
new file mode 100644
index 0000000..7e2d65f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/11/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'toolTipText' from expression 'getToolTipText()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'toolTipText'
- Destination method: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput.getLabel()'
- Variable expression: 'getToolTipText()'
- Replace occurrences of expression with variable" description="Extract local variable 'toolTipText'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditorInput.java" name="toolTipText" replace="true" selection="3470 16" stamp="1205217566530" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/11/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/11/refactorings.index
new file mode 100644
index 0000000..3fcb4f2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/11/refactorings.index
@@ -0,0 +1 @@
+1205217566530 Extract local variable 'toolTipText'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/13/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/13/refactorings.history
new file mode 100644
index 0000000..098a4f8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/13/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'editorInput' from expression 'getEditorInput()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'editorInput'
- Destination method: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor.addPage()'
- Variable expression: 'getEditorInput()'
- Replace occurrences of expression with variable" description="Extract local variable 'editorInput'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditor.java" name="editorInput" replace="true" selection="9695 16" stamp="1206770669192" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ContextCapturePauseHandler.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui.commands" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ContextCapturePauseHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1206824655585" units="1" version="1.0"/>
<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.wizards'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.wizards'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.wizards.ContextRetrieveWizardPage.java
 org.eclipse.mylyn.internal.tasks.ui.wizards.ContextAttachWizard.java
 org.eclipse.mylyn.internal.tasks.ui.wizards.ContextRetrieveWizard.java
 org.eclipse.mylyn.internal.tasks.ui.wizards.ContextAttachWizardPage.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui.wizards" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ContextRetrieveWizardPage.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ContextAttachWizard.java" element3="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ContextRetrieveWizard.java" element4="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ContextAttachWizardPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui	=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui.wizards" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1206834936167" units="4" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ContextUiUtil.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ContextUiUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1206835137001" units="1" version="1.0"/>
<refactoring comment="Extract method 'private static boolean openTasksWithBrowser()' from 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openEditorAndRefreshTask()' to 'org.eclipse.mylyn.tasks.ui.TasksUiUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'openTasksWithBrowser'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'openTasksWithBrowser'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java" name="openTasksWithBrowser" replace="true" selection="13044 109" stamp="1206848053808" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'openEditor' from expression 'openEditor(editorInput,getTaskEditorId(task),page)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'openEditor'
- Destination method: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openEditor()'
- Variable expression: 'openEditor(editorInput,getTaskEditorId(task),page)'
- Replace occurrences of expression with variable" description="Extract local variable 'openEditor'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java" name="openEditor" replace="true" selection="12908 52" stamp="1206848527385" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openRepositoryTask(...)' to 'openTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openRepositoryTask(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTask(...)'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'openRepositoryTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openRepositoryTask~QString;~QString;~QString;" name="openTask" references="true" stamp="1206848945182" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openRepositoryTask(...)' to 'openTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openRepositoryTask(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTask(...)'
- Update references to refactored element
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename method 'openRepositoryTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openRepositoryTask~QTaskRepository;~QString;" name="openTask" references="true" stamp="1206848959408" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink.open().url' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink.open()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink.open().url'" description="Inline local variable 'url'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskUrlHyperlink.java" selection="888 20" stamp="1206853310784" version="1.0"/>
<refactoring comment="Extract method 'private void getLocalTaskRepository()' from 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.loadTemplateRepositories()' to 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getLocalTaskRepository'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin'
- Declared visibility: 'private'" comments="false" description="Extract method 'getLocalTaskRepository'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java" name="getLocalTaskRepository" replace="false" selection="18630 562" stamp="1206855672857" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'repository' from expression 'taskRepositoryManager.getRepository(LocalRepositoryConnector.REPOSITORY_URL)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'repository'
- Destination method: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getLocalTaskRepository()'
- Variable expression: 'taskRepositoryManager.getRepository(LocalRepositoryConnector.REPOSITORY_URL)'
- Replace occurrences of expression with variable" description="Extract local variable 'repository'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java" name="repository" replace="true" selection="19956 76" stamp="1206855701642" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/13/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/13/refactorings.index
new file mode 100644
index 0000000..d941dbd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/3/13/refactorings.index
@@ -0,0 +1,13 @@
+1206770669192 Extract local variable 'editorInput'
+1206824655585 Move compilation unit
+1206834936167 Move compilation units
+1206835137001 Move compilation unit
+1206841022614 Extract method 'initializeTaskActivityManager'
+1206841558079 Rename method 'dispose'
+1206848053808 Extract method 'openTasksWithBrowser'
+1206848527385 Extract local variable 'openEditor'
+1206848945182 Rename method 'openRepositoryTask'
+1206848959408 Rename method 'openRepositoryTask'
+1206853310784 Inline local variable 'url'
+1206855672857 Extract method 'getLocalTaskRepository'
+1206855701642 Extract local variable 'repository'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..c9bbc30
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getInstance()' to 'getTaskActivityManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getInstance()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getTaskActivityManager()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getInstance'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getInstance" name="getTaskActivityManager" references="true" stamp="1207015063475" version="1.0"/>
<refactoring comment="Extract local variable 'int1' from expression 'getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'int1'
- Destination method: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.updateTaskActivityManager()'
- Variable expression: 'getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR)'
- Replace occurrences of expression with variable" description="Extract local variable 'int1'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java" name="int1" replace="true" selection="18755 72" stamp="1207015591673" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.TIMESTAMP_FORMAT' from expression '"yyMMddHHmmssS"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'TIMESTAMP_FORMAT'
- Constant expression: '"yyMMddHHmmssS"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'TIMESTAMP_FORMAT'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListBackupManager.java" name="TIMESTAMP_FORMAT" qualify="false" replace="true" selection="5454 15" stamp="1207326833851" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..5efc41c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1,10 @@
+1207015063475 Rename method 'getInstance'
+1207015591673 Extract local variable 'int1'
+1207431252385 Copy compilation unit
+1207433320640 Copy compilation unit
+1207447591744 Copy compilation unit
+1207449375734 Move members
+1207449450510 Move members
+1207450089696 Delete elements
+1207450094853 Delete element
+1207326833851 Extract constant 'TIMESTAMP_FORMAT'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/15/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/15/refactorings.history
new file mode 100644
index 0000000..662a6aa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'taskDataManager' from expression 'connector.getTaskDataManager()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskDataManager'
- Destination method: 'org.eclipse.mylyn.tasks.ui.TaskFactory.createTaskFromTaskData()'
- Variable expression: 'connector.getTaskDataManager()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskDataManager'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui{TaskFactory.java" name="taskDataManager" replace="true" selection="4439 30" stamp="1207609441705" version="1.0"/>
<refactoring comment="Rename local variable 'elem' in 'org.eclipse.mylyn.internal.tasks.ui.MoveToCategoryMenuContributor.getSubMenuManager(...)' to 'elemement'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.MoveToCategoryMenuContributor.getSubMenuManager(List<AbstractTaskContainer>).elem'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.MoveToCategoryMenuContributor.getSubMenuManager(List<AbstractTaskContainer>).elemement'
- Update references to refactored element" description="Rename local variable 'elem'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui{MoveToCategoryMenuContributor.java[MoveToCategoryMenuContributor~getSubMenuManager~QList\<QAbstractTaskContainer;>;@elem!1840!1865!1862!1865!QAbstractTaskContainer;" name="elemement" references="true" stamp="1207667353297" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.NewSubTaskHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{NewSubTaskHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1207696852824" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewSubTaskHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207696866880" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.commands'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.NewSubTaskHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.commands" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{NewSubTaskHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1207696875297" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.RetrieveTitleFromUrlJob.setTitle(...)' to 'titleRetrieved'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.RetrieveTitleFromUrlJob.setTitle(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.RetrieveTitleFromUrlJob.titleRetrieved(...)'
- Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'setTitle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{RetrieveTitleFromUrlJob.java[RetrieveTitleFromUrlJob~setTitle~QString;" name="titleRetrieved" references="true" stamp="1207774872164" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.ui.ITaskJobFactory' from 'org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.ui.ITaskJobFactory'
- Use super type where possible" comments="true" description="Extract interface 'ITaskJobFactory'" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskJobFactory.java[TaskJobFactory" instanceof="false" name="ITaskJobFactory" public="true" replace="true" stamp="1207780037869" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITaskJobFactory.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITaskJobFactory.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207780088273" subPackages="false" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.ui.ITasksJobFactory' from 'org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.ui.ITasksJobFactory'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory.createSynchronizeTasksJob(...)
 org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory.createSynchronizeTasksJob(...)
- Use super type where possible" comments="true" description="Extract interface 'ITasksJobFactory'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskJobFactory.java[TaskJobFactory~createSynchronizeTasksJob~QAbstractRepositoryConnector;~QSet\<QAbstractTask;>;" element2="/src<org.eclipse.mylyn.internal.tasks.ui{TaskJobFactory.java[TaskJobFactory~createSynchronizeTasksJob~QAbstractRepositoryConnector;~QTaskRepository;~QSet\<QAbstractTask;>;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskJobFactory.java[TaskJobFactory" instanceof="false" name="ITasksJobFactory" public="true" replace="true" stamp="1207781021061" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory' to 'TasksJobFactory'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksJobFactory'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskJobFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskJobFactory.java[TaskJobFactory" matchStrategy="1" name="TasksJobFactory" qualified="false" references="true" similarDeclarations="false" stamp="1207781026921" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksJobFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksJobFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207781335010" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduledTaskListSynchJob.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduledTaskListSynchJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207787727200" subPackages="false" version="1.0"/>
<refactoring comment="Change method 'public static Job org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(AbstractRepositoryConnector connector, TaskRepository repository, Set<AbstractRepositoryQuery> queries, IJobChangeListener listener, int priority, long delay, boolean userForcedSync)' to 'public static Job synchronize(AbstractRepositoryConnector connector, TaskRepository repository, Set<AbstractRepositoryQuery> queries, IJobChangeListener listener, boolean userForcedSync)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)'
- Removed parameters:
 int priority
 long delay" delegate="false" deprecate="true" description="Change method 'synchronize'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~synchronize~QAbstractRepositoryConnector;~QTaskRepository;~QSet\<QAbstractRepositoryQuery;>;~QIJobChangeListener;~I~J~Z" name="synchronize" parameter1="AbstractRepositoryConnector connector 0 AbstractRepositoryConnector connector false" parameter2="TaskRepository repository 1 TaskRepository repository false" parameter3="Set<AbstractRepositoryQuery> queries 2 Set<AbstractRepositoryQuery> queries false" parameter4="IJobChangeListener listener 3 IJobChangeListener listener false" parameter5="int priority 4 {deleted} {deleted} true" parameter6="long delay 5 {deleted} {deleted} true" parameter7="boolean userForcedSync 6 boolean userForcedSync false" stamp="1207788547519" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)' to 'synchronizeQuery'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronizeQuery(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'synchronize'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~synchronize~QAbstractRepositoryConnector;~QAbstractRepositoryQuery;~QIJobChangeListener;~Z" name="synchronizeQuery" references="true" stamp="1207789612814" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)' to 'synchronizeQueries'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronizeQueries(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'synchronize'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~synchronize~QAbstractRepositoryConnector;~QTaskRepository;~QSet\<QAbstractRepositoryQuery;>;~QIJobChangeListener;~Z" name="synchronizeQueries" references="true" stamp="1207789621966" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)' to 'synchronizeTasks'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronizeTasks(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'synchronize'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~synchronize~QAbstractRepositoryConnector;~QSet\<QAbstractTask;>;~Z~QIJobChangeListener;" name="synchronizeTasks" references="true" stamp="1207789632532" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)' to 'synchronizeTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronize(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronizeTask(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'synchronize'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~synchronize~QAbstractRepositoryConnector;~QAbstractTask;~Z~QIJobChangeListener;" name="synchronizeTask" references="true" stamp="1207789675139" version="1.0"/>
<refactoring comment="Extract method 'private static void joinIfInTestMode(SynchronizeJob job)' from 'org.eclipse.mylyn.tasks.ui.TasksUi.synchronizeQueries()' to 'org.eclipse.mylyn.tasks.ui.TasksUi'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'joinIfInTestMode'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUi'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'joinIfInTestMode'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java" name="joinIfInTestMode" replace="true" selection="3639 179" stamp="1207789833098" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.TaskListSynchronizationScheduler.synchNow(...)' to 'synchronize'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListSynchronizationScheduler.synchNow(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListSynchronizationScheduler.synchronize(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'synchNow'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListSynchronizationScheduler.java[TaskListSynchronizationScheduler~synchNow~J~QList\<QTaskRepository;>;~Z" name="synchronize" references="true" stamp="1207792663917" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduledTaskListSynchJob'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduledTaskListSynchJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207792876368" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiPlugin.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207883632221" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TaskListManager.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.tasks.ui{TaskListManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1207883839362" units="1" version="1.0"/>
<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.ui.ITaskListManager' from 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.ui.ITaskListManager'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.ui.TaskListManager.getTaskList()
 org.eclipse.mylyn.internal.tasks.ui.TaskListManager.activateTask(...)
 org.eclipse.mylyn.internal.tasks.ui.TaskListManager.deactivateAllTasks()
 org.eclipse.mylyn.internal.tasks.ui.TaskListManager.deactivateTask(...)
- Use super type where possible
- Use super type in 'instanceof' expressions" comments="true" description="Extract interface 'ITaskListManager'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager~getTaskList" element2="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager~activateTask~QAbstractTask;" element3="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager~deactivateAllTasks" element4="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager~deactivateTask~QAbstractTask;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager" instanceof="true" name="ITaskListManager" public="true" replace="true" stamp="1207884029496" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTaskListManager()' to 'org.eclipse.mylyn.tasks.ui.TasksUi'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTaskListManager()'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUi'" delegate="false" deprecate="true" description="Move member 'getTaskListManager'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getTaskListManager" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi" stamp="1207884408542" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITaskListManager.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITaskListManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1207884879533" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskNavigateDropDownAction'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskNavigateDropDownAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207948194979" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActivateTaskHistoryDropDownAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207948198924" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskNavigateDropDownAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskNavigateDropDownAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207952004606" subPackages="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getRepositoryManager()' to 'org.eclipse.mylyn.tasks.ui.TasksUi'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getRepositoryManager()'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUi'" delegate="false" deprecate="true" description="Move member 'getRepositoryManager'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getRepositoryManager" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi" stamp="1207974862097" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiProxyChangeListener.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiProxyChangeListener.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207978393388" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'canCreateTask' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialog' to 'needsCreateTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialog.canCreateTask'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialog.needsCreateTask'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'canCreateTask'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskSelectionDialog.java[TaskSelectionDialog^canCreateTask" name="needsCreateTask" references="true" setter="true" stamp="1208055764922" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'InputAttachmentSourcePage.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/tasks/ui/wizards/InputAttachmentSourcePage.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208061394007" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/15/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/15/refactorings.index
new file mode 100644
index 0000000..859139d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/15/refactorings.index
@@ -0,0 +1,32 @@
+1207609441705 Extract local variable 'taskDataManager'
+1207667353297 Rename local variable 'elem'
+1207696852824 Copy compilation unit
+1207696866880 Delete element
+1207696875297 Copy compilation unit
+1207774872164 Rename method 'setTitle'
+1207780037869 Extract interface 'ITaskJobFactory'
+1207780088273 Delete element
+1207781021061 Extract interface 'ITasksJobFactory'
+1207781026921 Rename type 'TaskJobFactory'
+1207781335010 Move compilation unit
+1207787727200 Delete element
+1207788547519 Change method 'synchronize'
+1207789612814 Rename method 'synchronize'
+1207789621966 Rename method 'synchronize'
+1207789632532 Rename method 'synchronize'
+1207789675139 Rename method 'synchronize'
+1207789833098 Extract method 'joinIfInTestMode'
+1207792663917 Rename method 'synchNow'
+1207792876368 Delete element
+1207883632221 Move compilation unit
+1207883839362 Move compilation unit
+1207884029496 Extract interface 'ITaskListManager'
+1207884408542 Move member 'getTaskListManager'
+1207884879533 Move compilation unit
+1207948194979 Delete element
+1207948198924 Delete element
+1207952004606 Delete element
+1207974862097 Move member 'getRepositoryManager'
+1207978393388 Delete element
+1208055764922 Rename field 'canCreateTask'
+1208061394007 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..a57b2c0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.createNestedHandleElement(...)' to 'createNestedTaskReference'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.createNestedHandleElement(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.createNestedTaskReference(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createNestedHandleElement'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer~createNestedHandleElement~QString;~QAbstractTask;~QDocument;~QElement;" name="createNestedTaskReference" references="true" stamp="1208206619583" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.readSubTasks(...)' to 'readNestTaskReferences'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.readSubTasks(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.readNestTaskReferences(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readSubTasks'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer~readSubTasks~QAbstractTask;~QNodeList;~QTaskList;" name="readNestTaskReferences" references="true" stamp="1208206856145" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.readNestTaskReferences(...)' to 'readTaskReferences'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.readNestTaskReferences(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.readTaskReferences(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'readNestTaskReferences'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer~readNestTaskReferences~QAbstractTaskContainer;~QNodeList;~QTaskList;" name="readTaskReferences" references="true" stamp="1208219547566" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.createNestedTaskReference(...)' to 'createTaskReference'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.createNestedTaskReference(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.createTaskReference(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createNestedTaskReference'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java[DelegatingTaskExternalizer~createNestedTaskReference~QString;~QAbstractTask;~QDocument;~QElement;" name="createTaskReference" references="true" stamp="1208219756878" version="1.0"/>
<refactoring comment="Extract local variable 'parentTaskCategory' from expression 'TaskCategory.getParentTaskCategory(task)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'parentTaskCategory'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.actions.RemoveFromCategoryAction.run()'
- Variable expression: 'TaskCategory.getParentTaskCategory(task)'
- Replace occurrences of expression with variable" description="Extract local variable 'parentTaskCategory'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{RemoveFromCategoryAction.java" name="parentTaskCategory" replace="true" selection="1726 40" stamp="1208234585672" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.tasks.ui.ITaskListManager.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.tasks.ui{ITaskListManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208236935390" units="1" version="1.0"/>
<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskPlanningEditor.RESET' from expression '"Reset"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'RESET'
- Constant expression: '"Reset"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'RESET'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskPlanningEditor.java" name="RESET" qualify="false" replace="true" selection="29482 7" stamp="1208468842252" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITaskActivationListener.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITaskActivationListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208637398150" units="1" version="1.0"/>
<refactoring comment="Rename field 'TASK_REFERESH_LISTENER' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to 'TASKLIST_CHANGE_LISTENER'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_REFERESH_LISTENER'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASKLIST_CHANGE_LISTENER'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TASK_REFERESH_LISTENER'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^TASK_REFERESH_LISTENER" name="TASKLIST_CHANGE_LISTENER" references="true" setter="false" stamp="1208639025541" textual="false" version="1.0"/>

<refactoring comment="Extract local variable 'metaData' from expression 'legacyAttribute.getMetaData()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'metaData'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataUtil.addAttribute()'
- Variable expression: 'legacyAttribute.getMetaData()'
- Replace occurrences of expression with variable" description="Extract local variable 'metaData'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataUtil.java" name="metaData" replace="true" selection="2088 29" stamp="1208652654619" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataUtil.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208653631841" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentsTableContentProvider.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentsTableContentProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208674627503" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractReplyToCommenAction' to 'AbstractReplyToCommentAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractReplyToCommenAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractReplyToCommentAction'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbstractReplyToCommenAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractReplyToCommenAction.java[AbstractReplyToCommenAction" matchStrategy="1" name="AbstractReplyToCommentAction" qualified="false" references="true" similarDeclarations="false" stamp="1208684821235" textual="false" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core.data'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.AttributeManager.java
 org.eclipse.mylyn.internal.tasks.ui.editors.IAttributeManagerListener.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttributeManager.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{IAttributeManagerListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1208684937857" units="2" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..40815bc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,14 @@
+1208206619583 Rename method 'createNestedHandleElement'
+1208206856145 Rename method 'readSubTasks'
+1208219547566 Rename method 'readNestTaskReferences'
+1208219756878 Rename method 'createNestedTaskReference'
+1208234585672 Extract local variable 'parentTaskCategory'
+1208236935390 Move compilation unit
+1208468842252 Extract constant 'RESET'
+1208637398150 Move compilation unit
+1208639025541 Rename field 'TASK_REFERESH_LISTENER'
+1208652654619 Extract local variable 'metaData'
+1208653631841 Move compilation unit
+1208674627503 Copy compilation unit
+1208684821235 Rename type 'AbstractReplyToCommenAction'
+1208684937857 Move compilation units
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/17/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/17/refactorings.history
new file mode 100644
index 0000000..d0ec5f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/17/refactorings.history
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.ResetRepositoryConfigurationAction' to 'RefreshRepositoryConfigurationAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.ResetRepositoryConfigurationAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.RefreshRepositoryConfigurationAction'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ResetRepositoryConfigurationAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{ResetRepositoryConfigurationAction.java[ResetRepositoryConfigurationAction" matchStrategy="1" name="RefreshRepositoryConfigurationAction" qualified="false" references="true" similarDeclarations="false" stamp="1208751210799" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.RefreshRepositoryConfigurationAction' to 'UpdateRepositoryConfigurationAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.RefreshRepositoryConfigurationAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'RefreshRepositoryConfigurationAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{RefreshRepositoryConfigurationAction.java[RefreshRepositoryConfigurationAction" matchStrategy="1" name="UpdateRepositoryConfigurationAction" qualified="false" references="true" similarDeclarations="false" stamp="1208751224911" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.AbstractTaskEditorPart(AbstractTaskEditorPage taskEditorPage)' to 'public AbstractTaskEditorPart()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.AbstractTaskEditorPart(...)'
- Removed parameters:
 AbstractTaskEditorPage taskEditorPage" delegate="false" deprecate="true" description="Change method 'AbstractTaskEditorPart'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPart.java[AbstractTaskEditorPart~AbstractTaskEditorPart~QAbstractTaskEditorPage;" name="AbstractTaskEditorPart" parameter1="AbstractTaskEditorPage taskEditorPage 0 {deleted} {deleted} true" stamp="1208759242282" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.setInput(...)' to 'initialize'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.setInput(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.initialize(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'setInput'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPart.java[AbstractTaskEditorPart~setInput~QAttributeManager;" name="initialize" references="true" stamp="1208759295126" version="1.0"/>
+<refactoring comment="Extract method 'private ImageHyperlink createTitleHyperLink(final FormToolkit toolkit,final Composite toolbarComp,final TaskComment taskComment)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.createControl()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createTitleHyperLink'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart'
- Declared visibility: 'private'" comments="false" description="Extract method 'createTitleHyperLink'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="createTitleHyperLink" replace="false" selection="4528 1255" stamp="1208861366936" version="1.0" visibility="2"/>
+<refactoring comment="Extract local variable 'author' from expression 'taskComment.getAuthor()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'author'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.createTitleHyperLink()'
- Variable expression: 'taskComment.getAuthor()'
- Replace occurrences of expression with variable" description="Extract local variable 'author'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="author" replace="true" selection="9069 23" stamp="1208861500492" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider.java'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider.java'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentTableLabelProvider.java" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttachmentTableLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208862191463" units="1" version="1.0"/>
+<refactoring comment="Extract method 'private void activateHandler()' from '{...}' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AttributeEditorToolkit.StyledTextFocusListener'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'activateHandler'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AttributeEditorToolkit.StyledTextFocusListener'
- Declared visibility: 'private'" comments="false" description="Extract method 'activateHandler'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AttributeEditorToolkit.java" name="activateHandler" replace="false" selection="2857 218" stamp="1208913595956" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.refreshEditor()' to 'refreshFormContent'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.refreshEditor()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.refreshFormContent()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'refreshEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage~refreshEditor" name="refreshFormContent" references="true" stamp="1208918699996" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.ExpansionListener.VIEWER' from expression '"viewer"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'VIEWER'
- Constant expression: '"viewer"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'VIEWER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="VIEWER" qualify="false" replace="true" selection="3128 8" stamp="1208921751388" version="1.0" visibility="2"/>
+<refactoring comment="Extract local variable 'assoctiatedAttribute' from expression 'getTaskData().getAttributeMapper().getAssoctiatedAttribute(attribute)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'assoctiatedAttribute'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.ExpansionListener.expansionStateChanged()'
- Variable expression: 'getTaskData().getAttributeMapper().getAssoctiatedAttribute(attribute)'
- Replace occurrences of expression with variable" description="Extract local variable 'assoctiatedAttribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="assoctiatedAttribute" replace="true" selection="3025 76" stamp="1208924810845" version="1.0"/>
+<refactoring comment="Extract local variable 'layout' from expression 'new GridLayout()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'layout'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart.createControl()'
- Variable expression: 'new GridLayout()'" description="Extract local variable 'layout'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorSummaryPart.java" name="layout" replace="false" selection="3153 16" stamp="1208929288177" version="1.0"/>
+<refactoring comment="Extract method 'private void addDateContainerSelection(final MenuManager subMenuManager,AbstractTaskContainer singleSelection,final ScheduledTaskContainer dateContainer)' from 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager()' to 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'addDateContainerSelection'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Declared visibility: 'private'" comments="false" description="Extract method 'addDateContainerSelection'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java" name="addDateContainerSelection" replace="false" selection="6438 711" stamp="1208999193770" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.addDateContainerSelection(...)' to 'createDateSelectionAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.addDateContainerSelection(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.createDateSelectionAction(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addDateContainerSelection'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java[ScheduleTaskMenuContributor~addDateContainerSelection~QMenuManager;~QScheduledTaskContainer;" name="createDateSelectionAction" references="true" stamp="1209000911854" version="1.0"/>
+<refactoring comment="Change method 'private boolean org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.canSchedule(AbstractTaskContainer singleSelection, List<AbstractTaskContainer> elements)' to 'private boolean canSchedule(List<AbstractTaskContainer> elements)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.canSchedule(...)'
- Removed parameters:
 AbstractTaskContainer singleSelection" delegate="false" deprecate="true" description="Change method 'canSchedule'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java[ScheduleTaskMenuContributor~canSchedule~QAbstractTaskContainer;~QList\<QAbstractTaskContainer;>;" name="canSchedule" parameter1="AbstractTaskContainer singleSelection 0 {deleted} {deleted} true" parameter2="List<AbstractTaskContainer> elements 1 List<AbstractTaskContainer> elements false" stamp="1209002205486" version="1.0"/>
+<refactoring comment="Change method 'private boolean org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.canSchedule(List<AbstractTaskContainer> taskListElementsToSchedule)' to 'private boolean canSchedule()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.canSchedule(...)'
- Removed parameters:
 List<AbstractTaskContainer> taskListElementsToSchedule" delegate="false" deprecate="true" description="Change method 'canSchedule'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java[ScheduleTaskMenuContributor~canSchedule~QList\<QAbstractTaskContainer;>;" name="canSchedule" parameter1="List<AbstractTaskContainer> taskListElementsToSchedule 0 {deleted} {deleted} true" stamp="1209002248211" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.core.TaskListModifyJob.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.core{TaskListModifyJob.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209054392601" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TaskListModifyOperation.runOperation(...)' to 'operations'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TaskListModifyOperation.runOperation(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TaskListModifyOperation.operations(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'runOperation'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TaskListModifyOperation.java[TaskListModifyOperation~runOperation~QIProgressMonitor;" name="operations" references="true" stamp="1209057708723" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListWriter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209085142509" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core.externalization" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209085284922" units="1" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.OLD_TASK_LIST_FILE' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.OLD_TASK_LIST_FILE'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'OLD_TASK_LIST_FILE'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^OLD_TASK_LIST_FILE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209086684375" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.DEFAULT_TASK_LIST_FILE' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.DEFAULT_TASK_LIST_FILE'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'DEFAULT_TASK_LIST_FILE'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^DEFAULT_TASK_LIST_FILE" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209159484741" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.FILENAME_ENCODING' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.FILENAME_ENCODING'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'FILENAME_ENCODING'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^FILENAME_ENCODING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209159547196" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.PREFIX_TASKLIST' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.PREFIX_TASKLIST'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'PREFIX_TASKLIST'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^PREFIX_TASKLIST" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209159554065" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.DEFAULT_BACKUP_FOLDER_NAME' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.DEFAULT_BACKUP_FOLDER_NAME'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'DEFAULT_BACKUP_FOLDER_NAME'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^DEFAULT_BACKUP_FOLDER_NAME" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209159559811" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.FILE_EXTENSION' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.FILE_EXTENSION'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'FILE_EXTENSION'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^FILE_EXTENSION" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209159565627" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/17/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/17/refactorings.index
new file mode 100644
index 0000000..9585dd5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/17/refactorings.index
@@ -0,0 +1,26 @@
+1208751210799 Rename type 'ResetRepositoryConfigurationAction'
+1208751224911 Rename type 'RefreshRepositoryConfigurationAction'
+1208759242282 Change method 'AbstractTaskEditorPart'
+1208759295126 Rename method 'setInput'
+1208861366936 Extract method 'createTitleHyperLink'
+1208861500492 Extract local variable 'author'
+1208862191463 Copy compilation unit
+1208913595956 Extract method 'activateHandler'
+1208918699996 Rename method 'refreshEditor'
+1208921751388 Extract constant 'VIEWER'
+1208924810845 Extract local variable 'assoctiatedAttribute'
+1208929288177 Extract local variable 'layout'
+1208999193770 Extract method 'addDateContainerSelection'
+1209000911854 Rename method 'addDateContainerSelection'
+1209002205486 Change method 'canSchedule'
+1209002248211 Change method 'canSchedule'
+1209054392601 Delete element
+1209057708723 Rename method 'runOperation'
+1209085142509 Copy compilation unit
+1209085284922 Copy compilation unit
+1209086684375 Move member 'OLD_TASK_LIST_FILE'
+1209159484741 Move member 'DEFAULT_TASK_LIST_FILE'
+1209159547196 Move member 'FILENAME_ENCODING'
+1209159554065 Move member 'PREFIX_TASKLIST'
+1209159559811 Move member 'DEFAULT_BACKUP_FOLDER_NAME'
+1209159565627 Move member 'FILE_EXTENSION'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/18/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/18/refactorings.history
new file mode 100644
index 0000000..e1e683f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/18/refactorings.history
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void expandComment(ExpansionEvent event)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.ExpansionListener.expansionStateChanged()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.ExpansionListener'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'expandComment'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.ExpansionListener'
- Declared visibility: 'private'" comments="false" description="Extract method 'expandComment'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="expandComment" replace="false" selection="2848 1027" stamp="1209341843429" version="1.0" visibility="2"/>
+<refactoring comment="Extract local variable 'hasIncomingChanges' from expression 'getAttributeManager().hasIncomingChanges(commentAttribute)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'hasIncomingChanges'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart.createControl()'
- Variable expression: 'getAttributeManager().hasIncomingChanges(commentAttribute)'
- Replace occurrences of expression with variable" description="Extract local variable 'hasIncomingChanges'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorCommentPart.java" name="hasIncomingChanges" replace="true" selection="8164 58" stamp="1209342145123" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.SimpleDateAttributeEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{SimpleDateAttributeEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209344082620" subPackages="false" version="1.0"/>
+<refactoring comment="Change method 'public org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute, int style)' to 'public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute, int style)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.RichTextAttributeEditor(...)'" delegate="false" deprecate="true" description="Change method 'RichTextAttributeEditor'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RichTextAttributeEditor.java[RichTextAttributeEditor~RichTextAttributeEditor~QTaskDataModel;~QTaskAttribute;~QTaskRepository;~I" name="RichTextAttributeEditor" parameter1="TaskDataModel manager 0 TaskDataModel manager false" parameter2="TaskRepository taskRepository 2 TaskRepository taskRepository false" parameter3="TaskAttribute taskAttribute 1 TaskAttribute taskAttribute false" parameter4="int style 3 int style false" stamp="1209344256729" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractAttributeEditor.getAttributeEditorManager()' to 'getModel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractAttributeEditor.getAttributeEditorManager()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractAttributeEditor.getModel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getAttributeEditorManager'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractAttributeEditor.java[AbstractAttributeEditor~getAttributeEditorManager" name="getModel" references="true" stamp="1209347137119" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.getAttributeManager()' to 'getModel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.getAttributeManager()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPart.getModel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getAttributeManager'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPart.java[AbstractTaskEditorPart~getAttributeManager" name="getModel" references="true" stamp="1209354444897" version="1.0"/>
+<refactoring comment="Extract method 'private void setSelectedRadionButton()' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart.FocusListener.focusGained()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'setSelectedRadionButton'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart'
- Declared visibility: 'private'" comments="false" description="Extract method 'setSelectedRadionButton'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionPart.java" name="setSelectedRadionButton" replace="false" selection="2534 156" stamp="1209354844246" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.submitToRepository()' to 'doSubmit'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.submitToRepository()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.doSubmit()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'submitToRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage~submitToRepository" name="doSubmit" references="true" stamp="1209364219305" version="1.0"/>
+<refactoring comment="Extract local variable 'activePage' from expression 'window.getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskInBackground()'
- Variable expression: 'window.getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java" name="activePage" replace="true" selection="18966 22" stamp="1209364800894" version="1.0"/>
+<refactoring comment="Extract method 'private void openNewTask(final SubmitJob job)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'openNewTask'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'openNewTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{AbstractTaskEditorPage.java" name="openNewTask" replace="false" selection="5310 289" stamp="1209367227152" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{SynchronizeEditorAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209371594330" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeTaskAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{SynchronizeTaskAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209371675860" subPackages="false" version="1.0"/>
+<refactoring comment="Extract local variable 'searchResultTreeContentProvider' from expression '((SearchResultTreeContentProvider)getViewer().getContentProvider())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'searchResultTreeContentProvider'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.RepositorySearchResultView().new Action() {...}.run()'
- Variable expression: '((SearchResultTreeContentProvider)getViewer().getContentProvider())'
- Replace occurrences of expression with variable" description="Extract local variable 'searchResultTreeContentProvider'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{RepositorySearchResultView.java" name="searchResultTreeContentProvider" replace="true" selection="4555 68" stamp="1209417184284" version="1.0"/>
+<refactoring comment="Extract local variable 'searchResultTreeContentProvider2' from expression '((SearchResultTreeContentProvider)getViewer().getContentProvider())'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'searchResultTreeContentProvider2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView.RepositorySearchResultView().new Action() {...}.run()'
- Variable expression: '((SearchResultTreeContentProvider)getViewer().getContentProvider())'
- Replace occurrences of expression with variable" description="Extract local variable 'searchResultTreeContentProvider2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{RepositorySearchResultView.java" name="searchResultTreeContentProvider2" replace="true" selection="5197 68" stamp="1209417203663" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.search'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.search'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.CreateQueryFromSearchAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.search" element1="/src<org.eclipse.mylyn.internal.tasks.ui.search{CreateQueryFromSearchAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209418053061" units="1" version="1.0"/>
+<refactoring comment="Extract local variable 'activeWorkbenchWindow' from expression 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activeWorkbenchWindow'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.search.RefineSearchAction.run()'
- Variable expression: 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Replace occurrences of expression with variable" description="Extract local variable 'activeWorkbenchWindow'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{RefineSearchAction.java" name="activeWorkbenchWindow" replace="true" selection="2338 52" stamp="1209418229627" version="1.0"/>
+<refactoring comment="Extract local variable 'activeWorkbenchWindow' from expression 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activeWorkbenchWindow'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setDefaultValuesAndFocus()'
- Variable expression: 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Replace occurrences of expression with variable" description="Extract local variable 'activeWorkbenchWindow'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="activeWorkbenchWindow" replace="true" selection="14251 52" stamp="1209418407789" version="1.0"/>
+<refactoring comment="Extract local variable 'activePage' from expression 'window.getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setDefaultValuesAndFocus()'
- Variable expression: 'window.getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="activePage" replace="true" selection="14437 22" stamp="1209418488925" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.RefineSearchAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.search{RefineSearchAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209419605489" subPackages="false" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.internal.tasks.ui.util.ITaskListWriter' from 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter'
- Extracted interface: 'org.eclipse.mylyn.internal.tasks.ui.util.ITaskListWriter'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter.setDelegateExternalizers(...)
- Use super type where possible" comments="true" description="Extract interface 'ITaskListWriter'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListWriter.java[TaskListWriter~setDelegateExternalizers~QList\<QAbstractTaskListFactory;>;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListWriter.java[TaskListWriter" instanceof="false" name="ITaskListWriter" public="true" replace="true" stamp="1209431437856" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.externalization'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.ITaskListWriter.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core.externalization" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{ITaskListWriter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209431495154" units="1" version="1.0"/>
+<refactoring comment="Change method 'public TaskListWriter org.eclipse.mylyn.internal.tasks.ui.TaskListManager.getTaskListWriter()' to 'public TaskListWriter2 getTaskListWriter()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager.getTaskListWriter()'
- New return type: 'TaskListWriter2'" delegate="false" deprecate="true" description="Change method 'getTaskListWriter'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager~getTaskListWriter" name="getTaskListWriter" return="TaskListWriter2" stamp="1209432450066" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter' to 'TaskListElementImporter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListWriter'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListElementImporter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskListWriter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListWriter.java[TaskListWriter" matchStrategy="1" name="TaskListElementImporter" qualified="false" references="true" similarDeclarations="false" stamp="1209433053341" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209441156685" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportJob' to 'TaskDataExportOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportJob'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskDataExportJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportJob.java[TaskDataExportJob" matchStrategy="1" name="TaskDataExportOperation" qualified="false" references="true" similarDeclarations="false" stamp="1209447830807" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'SNAPSHOT_REGEXP' in 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager' to 'MYLYN_BACKUP_REGEXP'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.SNAPSHOT_REGEXP'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.MYLYN_BACKUP_REGEXP'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SNAPSHOT_REGEXP'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListBackupManager.java[TaskListBackupManager^SNAPSHOT_REGEXP" name="MYLYN_BACKUP_REGEXP" references="true" setter="false" stamp="1209448189472" textual="false" version="1.0"/>
+<refactoring comment="Extract constant 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.BACKUP_FILE_PREFIX' from expression '"mylyndata-"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'BACKUP_FILE_PREFIX'
- Constant expression: '"mylyndata-"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'BACKUP_FILE_PREFIX'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListBackupManager.java" name="BACKUP_FILE_PREFIX" qualify="false" replace="true" selection="6366 12" stamp="1209449142259" version="1.0" visibility="2"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage.createImportBackupControl(...)' to 'createImportFromBackupControl'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage.createImportBackupControl(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage.createImportFromBackupControl(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createImportBackupControl'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskDataImportWizardPage.java[TaskDataImportWizardPage~createImportBackupControl~QComposite;" name="createImportFromBackupControl" references="true" stamp="1209450414986" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.removeOldBackups(File folder, Pattern pattern)' to 'public void removeOldBackups()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.removeOldBackups(...)'
- Removed parameters:
 File folder
 Pattern pattern" delegate="false" deprecate="true" description="Change method 'removeOldBackups'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListBackupManager.java[TaskListBackupManager~removeOldBackups~QFile;~QPattern;" name="removeOldBackups" parameter1="File folder 0 {deleted} {deleted} true" parameter2="Pattern pattern 1 {deleted} {deleted} true" stamp="1209452980658" version="1.0"/>
+<refactoring comment="Move 19 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.planner'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.planner'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.planner.CompletedTaskCollector.java
 org.eclipse.mylyn.internal.tasks.ui.planner.InProgressTaskCollector.java
 org.eclipse.mylyn.internal.tasks.ui.planner.ReminderCellEditor.java
 org.eclipse.mylyn.internal.tasks.ui.planner.ITaskPlannerContentProvider.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskPlanSorter.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivitySorter.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizard.java
 org.eclipse.mylyn.internal.tasks.ui.planner.DateSelectionDialog.java
 org.eclipse.mylyn.internal.tasks.ui.planner.ITaskCollector.java
 org.eclipse.mylyn.internal.tasks.ui.planner.OpenTaskEditorAction.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityEditorPart.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskReportGenerator.java
 org.eclipse.mylyn.internal.tasks.ui.planner.PlannedTasksContentProvider.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityWizardPage.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityContentProvider.java
 org.eclipse.mylyn.internal.tasks.ui.planner.RemoveTaskAction.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskActivityEditorInput.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskPlanContentProvider.java
 org.eclipse.mylyn.internal.tasks.ui.planner.TaskPlannerLabelProvider.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.planner" element1="/src<org.eclipse.mylyn.internal.tasks.ui.planner{CompletedTaskCollector.java" element10="/src<org.eclipse.mylyn.internal.tasks.ui.planner{OpenTaskEditorAction.java" element11="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityEditorPart.java" element12="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskReportGenerator.java" element13="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityWizardPage.java.java" element14="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivityWizardPage.java" element15="/src<org.eclipse.mylyn.internal.tasks.ui.planner{RemoveTaskAction.javaovider.java" element16="/src<org.eclipse.mylyn.internal.tasks.ui.planner{RemoveTaskAction.java" element17="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskPlanContentProvider.java" element18="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskPlanContentProvider.java" element19="/src<org.eclipse.mylyn.internal.tasks.ui.planner{InProgressTaskCollector.javaa" element2="/src<org.eclipse.mylyn.internal.tasks.ui.planner{InProgressTaskCollector.java" element3="/src<org.eclipse.mylyn.internal.tasks.ui.planner{ITaskPlannerContentProv" element4="/src<org.eclipse.mylyn.internal.tasks.ui.planner{ITaskPlannerContentProvider.java" element5="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivitySorter." element6="/src<org.eclipse.mylyn.internal.tasks.ui.planner{TaskActivitySorter.java" element7="/src<org.eclipse.mylyn.internal.tasks.ui.planner{DateSelectionDialog.jav" element8="/src<org.eclipse.mylyn.internal.tasks.ui.planner{DateSelectionDialog.java" element9="/src<org.eclipse.mylyn.internal.tasks.ui.planner{ITaskCollector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209461261027" units="19" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.planner'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.internal.sandbox.ui.planner'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivityReportAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.internal.sandbox.ui.planner" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActivityReportAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209467264060" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.workbench'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench'
- Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.workbench" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209473259781" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.workbench'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench'
- Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.workbench" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209473266833" units="0" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.planner'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.planner" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209473492639" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.OldTaskListNotificationPopup.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{OldTaskListNotificationPopup.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209473510347" subPackages="false" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui.notifications'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotificationPopup.java
 org.eclipse.mylyn.internal.tasks.ui.notifications.NotificationPopupColors.java
 org.eclipse.mylyn.internal.tasks.ui.notifications.AbstractNotification.java
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotificationPopup.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{NotificationPopupColors.java" element3="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{AbstractNotification.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209473734926" units="3" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.SwtUtil.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{SwtUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209473929043" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListColorsAndFonts.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListColorsAndFonts.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209474343338" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1209474737577" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.CompositeContainerImageDescriptor.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{CompositeContainerImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209475226833" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.CompositeTaskImageDescriptor.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{CompositeTaskImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209475268828" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.CompositeSynchImageDescriptor.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{CompositeSynchImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209475298837" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListImageDescriptor.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListImageDescriptor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209475336578" units="1" version="1.0"/>
+<refactoring comment="Move 1 resources to 'archive'" description="Move 1 resources to 'archive'" flags="7" id="org.eclipse.ltk.core.refactoring.move.resources" stamp="1209476020400"/>
+<refactoring comment="Move 1 resources to 'archive'" description="Move 1 resources to 'archive'" flags="7" id="org.eclipse.ltk.core.refactoring.move.resources" stamp="1209476072536"/>
+<refactoring comment="Move 1 resources to 'archive'" description="Move 1 resources to 'archive'" flags="7" id="org.eclipse.ltk.core.refactoring.move.resources" stamp="1209476196945"/>
+<refactoring comment="Move 1 resources to 'archive'" description="Move 1 resources to 'archive'" flags="7" id="org.eclipse.ltk.core.refactoring.move.resources" stamp="1209476688368"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages2' to 'TasksUiImages'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages2'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TasksUiImages2'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages2.java[TasksUiImages2" matchStrategy="1" name="TasksUiImages" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1209477754349" textual="false" version="1.0"/>
+<refactoring comment="Move 'overlay-repository.gif' to 'archive'" description="Move 'overlay-repository.gif' to 'archive'" flags="7" id="org.eclipse.ltk.core.refactoring.move.resources" stamp="1209479547705"/>
+<refactoring comment="Rename field 'OVERLAY_LOCAL_TASK' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'OVERLAY_TASK_LOCAL'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVERLAY_LOCAL_TASK'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVERLAY_TASK_LOCAL'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'OVERLAY_LOCAL_TASK'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^OVERLAY_LOCAL_TASK" name="OVERLAY_TASK_LOCAL" references="true" setter="true" stamp="1209479927114" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'OVERLAY_WEB' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'OVERLAY_TASK_WEB'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVERLAY_WEB'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVERLAY_TASK_WEB'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'OVERLAY_WEB'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^OVERLAY_WEB" name="OVERLAY_TASK_WEB" references="true" setter="true" stamp="1209479937471" textual="false" version="1.0"/>
+<refactoring comment="Move 1 resources to 'archive'" description="Move 1 resources to 'archive'" flags="7" id="org.eclipse.ltk.core.refactoring.move.resources" stamp="1209480008379"/>
+<refactoring comment="Move 1 elements(s) to 'archive'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'archive'
- Original element: 'find.gif'" description="Move file" element1="icons/find.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209480493933" target="icons/archive" units="0" version="1.0"/>
+<refactoring comment="Move 6 elements(s) to 'icons'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'icons'
- Original elements:
 elcl16
 eview16
 obj16
 etool16
 wizban
 ovr16" description="Move folders" element1="icons/elcl16" element2="icons/eview16" element3="icons/obj16" element4="icons/etool16" element5="icons/wizban" element6="icons/ovr16" files="0" flags="589830" folders="6" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209480754758" target="/org.eclipse.mylyn.workbench.ui/icons" units="0" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_1' to 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_1'
- Destination type: 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'" delegate="false" deprecate="true" description="Move member 'PRIORITY_1'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^PRIORITY_1" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui{MylynImages.java[MylynImages" stamp="1209480790575" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_2' to 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_2'
- Destination type: 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'" delegate="false" deprecate="true" description="Move member 'PRIORITY_2'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^PRIORITY_2" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui{MylynImages.java[MylynImages" stamp="1209480806573" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_3' to 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_3'
- Destination type: 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'" delegate="false" deprecate="true" description="Move member 'PRIORITY_3'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^PRIORITY_3" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui{MylynImages.java[MylynImages" stamp="1209480816574" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_4' to 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_4'
- Destination type: 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'" delegate="false" deprecate="true" description="Move member 'PRIORITY_4'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^PRIORITY_4" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui{MylynImages.java[MylynImages" stamp="1209480825946" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_5' to 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.PRIORITY_5'
- Destination type: 'org.eclipse.mylyn.internal.workbench.ui.MylynImages'" delegate="false" deprecate="true" description="Move member 'PRIORITY_5'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^PRIORITY_5" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui{MylynImages.java[MylynImages" stamp="1209480834930" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ScreenshotAttachmentPage.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ScreenshotAttachmentPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209483707250" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.IImageCreator.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{IImageCreator.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209483805003" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ColorSelectionWindow.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ColorSelectionWindow.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209483862291" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.ColorCanvas.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{ColorCanvas.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209483913570" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.AbstractFilteredTree.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{AbstractFilteredTree.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209485103522" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.AdaptiveRefreshPolicy.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{AdaptiveRefreshPolicy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209485141793" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.IFilteredTreeListener.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{IFilteredTreeListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209485170531" units="1" version="1.0"/>
+<refactoring comment="Rename field 'T_EVIEW' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'VIEW'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.T_EVIEW'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.VIEW'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'T_EVIEW'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^T_EVIEW" name="VIEW" references="true" setter="true" stamp="1209486202786" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'T_TOOL' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'TOOL'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.T_TOOL'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.TOOL'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'T_TOOL'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^T_TOOL" name="TOOL" references="true" setter="true" stamp="1209486208557" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'T_OBJ' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'OBJ'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.T_OBJ'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OBJ'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'T_OBJ'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^T_OBJ" name="OBJ" references="true" setter="true" stamp="1209486217869" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'T_OVR' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages' to 'OVR'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.T_OVR'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.OVR'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'T_OVR'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java[TasksUiImages^T_OVR" name="OVR" references="true" setter="true" stamp="1209486229199" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.DatePicker.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.tasks.ui{DatePicker.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209486474730" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.WebHyperlink.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.tasks.ui{WebHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209486601098" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.internal.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.DateSelectionDialog.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.internal.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{DateSelectionDialog.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209486873722" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.workbench.ui/src/org.eclipse.mylyn.provisional.workbench.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.DatePickerPanel.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.workbench.ui/src<org.eclipse.mylyn.provisional.workbench.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{DatePickerPanel.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209504692290" units="1" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.reloadDataDirectory(boolean withProgress)' to 'public void reloadDataDirectory()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.reloadDataDirectory(...)'
- Removed parameters:
 boolean withProgress" delegate="false" deprecate="true" description="Change method 'reloadDataDirectory'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~reloadDataDirectory~Z" name="reloadDataDirectory" parameter1="boolean withProgress 0 {deleted} {deleted} true" stamp="1209519954858" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.TIMESTAMP_FORMAT' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager.TIMESTAMP_FORMAT'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'TIMESTAMP_FORMAT'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListBackupManager.java[TaskListBackupManager^TIMESTAMP_FORMAT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1209574711765" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'src-old'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'src-old'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListSaveManager.java'" description="Move compilation unit" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListSaveManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="false" stamp="1209584859010" target="/org.eclipse.mylyn/developer/src-old" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/18/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/18/refactorings.index
new file mode 100644
index 0000000..5f01126
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/4/18/refactorings.index
@@ -0,0 +1,77 @@
+1209341843429 Extract method 'expandComment'
+1209342145123 Extract local variable 'hasIncomingChanges'
+1209344082620 Delete element
+1209344256729 Change method 'RichTextAttributeEditor'
+1209347137119 Rename method 'getAttributeEditorManager'
+1209354444897 Rename method 'getAttributeManager'
+1209354844246 Extract method 'setSelectedRadionButton'
+1209364219305 Rename method 'submitToRepository'
+1209364800894 Extract local variable 'activePage'
+1209367227152 Extract method 'openNewTask'
+1209371594330 Copy compilation unit
+1209371675860 Delete element
+1209417184284 Extract local variable 'searchResultTreeContentProvider'
+1209417203663 Extract local variable 'searchResultTreeContentProvider2'
+1209418053061 Copy compilation unit
+1209418229627 Extract local variable 'activeWorkbenchWindow'
+1209418407789 Extract local variable 'activeWorkbenchWindow'
+1209418488925 Extract local variable 'activePage'
+1209419605489 Delete element
+1209431437856 Extract interface 'ITaskListWriter'
+1209431495154 Move compilation unit
+1209432450066 Change method 'getTaskListWriter'
+1209433053341 Rename type 'TaskListWriter'
+1209441156685 Delete element
+1209447830807 Rename type 'TaskDataExportJob'
+1209448189472 Rename field 'SNAPSHOT_REGEXP'
+1209449142259 Extract constant 'BACKUP_FILE_PREFIX'
+1209450414986 Rename method 'createImportBackupControl'
+1209452980658 Change method 'removeOldBackups'
+1209461261027 Move compilation units
+1209467264060 Move compilation unit
+1209473259781 Copy folder
+1209473266833 Copy file
+1209473492639 Delete element
+1209473510347 Delete element
+1209473734926 Move compilation units
+1209473929043 Move compilation unit
+1209474343338 Move compilation unit
+1209474737577 Move compilation unit
+1209475226833 Move compilation unit
+1209475268828 Move compilation unit
+1209475298837 Move compilation unit
+1209475336578 Move compilation unit
+1209476020400 Move 1 resources to 'archive'
+1209476072536 Move 1 resources to 'archive'
+1209476196945 Move 1 resources to 'archive'
+1209476688368 Move 1 resources to 'archive'
+1209477754349 Rename type 'TasksUiImages2'
+1209479547705 Move 'overlay-repository.gif' to 'archive'
+1209479927114 Rename field 'OVERLAY_LOCAL_TASK'
+1209479937471 Rename field 'OVERLAY_WEB'
+1209480008379 Move 1 resources to 'archive'
+1209480493933 Move file
+1209480754758 Move folders
+1209480790575 Move member 'PRIORITY_1'
+1209480806573 Move member 'PRIORITY_2'
+1209480816574 Move member 'PRIORITY_3'
+1209480825946 Move member 'PRIORITY_4'
+1209480834930 Move member 'PRIORITY_5'
+1209483707250 Move compilation unit
+1209483805003 Move compilation unit
+1209483862291 Move compilation unit
+1209483913570 Move compilation unit
+1209485103522 Move compilation unit
+1209485141793 Move compilation unit
+1209485170531 Move compilation unit
+1209486202786 Rename field 'T_EVIEW'
+1209486208557 Rename field 'T_TOOL'
+1209486217869 Rename field 'T_OBJ'
+1209486229199 Rename field 'T_OVR'
+1209486474730 Move compilation unit
+1209486601098 Move compilation unit
+1209486873722 Move compilation unit
+1209504692290 Move compilation unit
+1209519954858 Change method 'reloadDataDirectory'
+1209574711765 Move member 'TIMESTAMP_FORMAT'
+1209584859010 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/18/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/18/refactorings.history
new file mode 100644
index 0000000..16551b6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.commands.OpenTaskAttachmentInBrowserHandler.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{OpenTaskAttachmentInBrowserHandler.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1209610674849" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.wizards'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.wizards'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.wizards" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{PreviewAttachmentPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209619040227" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.wizards'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.wizards'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentPage.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.wizards" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209619450304" units="1" version="1.0"/>
<refactoring comment="Extract local variable 'page' from expression 'new PreviewAttachmentPage()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'page'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.addPages()'
- Variable expression: 'new PreviewAttachmentPage()'
- Replace occurrences of expression with variable" description="Extract local variable 'page'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java" name="page" replace="true" selection="7325 27" stamp="1209619543492" version="1.0"/>
<refactoring comment="Extract local variable 'attachmentPage' from expression 'connectorUi.getAttachmentPage(taskAttachment)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'attachmentPage'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.addPages()'
- Variable expression: 'connectorUi.getAttachmentPage(taskAttachment)'" description="Extract local variable 'attachmentPage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java" name="attachmentPage" replace="false" selection="7312 45" stamp="1209619689345" version="1.0"/>
<refactoring comment="Convert local variable 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.addPages().editPage' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.addPages()' to field
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.addPages().editPage'
- Field name: 'editPage'
- Initialize field in method
- Declared visibility: 'private'" description="Convert local variable 'editPage' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java" name="editPage" selection="7316 56" stamp="1209619696977" static="false" version="1.0" visibility="2"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.TaskAttachmentModel' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.TaskAttachmentModel'
- Field name: 'taskAttachmentWizard'
- Declare field 'final'" description="Convert member type 'TaskAttachmentModel' to top level" field="false" fieldName="taskAttachmentWizard" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java[TaskAttachmentWizard[TaskAttachmentModel" mandatory="false" possible="false" stamp="1209620150477" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.internal.tasks.core.data'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentModel.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core.data" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentModel.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209620200390" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizard.java'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizard.java'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.InputAttachmentSourcePage.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewAttachmentWizard.java" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{InputAttachmentSourcePage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1209620414216" units="1" version="1.0"/>
<refactoring comment="Extract method 'private void getContent(final Composite composite)' from 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage2.createControl()' to 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage2'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getContent'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.wizards.PreviewAttachmentPage2'
- Declared visibility: 'private'" comments="false" description="Extract method 'getContent'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{PreviewAttachmentPage2.java" name="getContent" replace="false" selection="3421 1677" stamp="1209622258077" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'stream' from expression 'new FileOutputStream(file)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'stream'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.ImageSource.createInputStream()'
- Variable expression: 'new FileOutputStream(file)'
- Replace occurrences of expression with variable" description="Extract local variable 'stream'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java" name="stream" replace="true" selection="4671 26" stamp="1209622908410" version="1.0"/>
<refactoring comment="Extract local variable 'attachmentPage' from expression 'connectorUi.getAttachmentPage(model)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'attachmentPage'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.addPages()'
- Variable expression: 'connectorUi.getAttachmentPage(model)'" description="Extract local variable 'attachmentPage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java" name="attachmentPage" replace="false" selection="6725 36" stamp="1209623464975" version="1.0"/>
<refactoring comment="Extract method 'private void openNewAttachmentWizard()' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart.createButtons().new SelectionAdapter() {...}.widgetSelected()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'openNewAttachmentWizard'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart'
- Declared visibility: 'private'" comments="false" description="Extract method 'openNewAttachmentWizard'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorAttachmentPart.java" name="openNewAttachmentWizard" replace="false" selection="13803 182" stamp="1209623566377" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'previewAttachmentPage2' from expression 'new PreviewAttachmentPage2(model)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'previewAttachmentPage2'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.getNextPage()'
- Variable expression: 'new PreviewAttachmentPage2(model)'" description="Extract local variable 'previewAttachmentPage2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskAttachmentWizard.java" name="previewAttachmentPage2" replace="false" selection="7102 33" stamp="1209624100462" version="1.0"/>
<refactoring comment="Extract local variable 'taskList' from expression 'TasksUiPlugin.getTaskListManager().getTaskList()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskList'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.TaskActivityMonitor.parseInteractionEvent()'
- Variable expression: 'TasksUiPlugin.getTaskListManager().getTaskList()'" description="Extract local variable 'taskList'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskActivityMonitor.java" name="taskList" replace="false" selection="3690 48" stamp="1209677157547" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager.createNewLocalTask(...)' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListManager.createNewLocalTask(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'createNewLocalTask'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListManager.java[TaskListManager~createNewLocalTask~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1209769963673" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlJob' to 'RefactorRepositoryUrlOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlJob'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlOperation'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'RefactorRepositoryUrlJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{RefactorRepositoryUrlJob.java[RefactorRepositoryUrlJob" matchStrategy="1" name="RefactorRepositoryUrlOperation" qualified="false" references="true" similarDeclarations="false" stamp="1209776583042" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListSnapshotManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListSnapshotManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1209778147098" subPackages="false" version="1.0"/>
<refactoring comment="Extract local variable 'taskAttribute' from expression 'attachment.getTaskAttribute()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskAttribute'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentEditorInput.getStorage()'
- Variable expression: 'attachment.getTaskAttribute()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskAttribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskAttachmentEditorInput.java" name="taskAttribute" replace="true" selection="3145 29" stamp="1209853870065" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditorInput.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.internal.tasks.ui	/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871532128" units="1" version="1.0"/>
<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original elements:
 org.eclipse.mylyn.tasks.ui.editors.AbstractRepositoryTaskEditor.java
 org.eclipse.mylyn.tasks.ui.editors.AbstractNewRepositoryTaskEditor.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractRepositoryTaskEditor.java" element2="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractNewRepositoryTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209871596421" units="2" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.ui.TaskFactory.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui{TaskFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209872258734" units="1" version="1.0"/>

<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original elements:
 org.eclipse.mylyn.tasks.ui.editors.NewTaskEditorInput.java
 org.eclipse.mylyn.tasks.ui.editors.RepositoryTaskEditorInput.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui.editors{NewTaskEditorInput.java" element2="/src<org.eclipse.mylyn.tasks.ui.editors{RepositoryTaskEditorInput.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209873879398" units="2" version="1.0"/>
<refactoring comment="Extract local variable 'person' from expression '((Person)element)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'person'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskElementLabelProvider.getImageDescriptor()'
- Variable expression: '((Person)element)'
- Replace occurrences of expression with variable" description="Extract local variable 'person'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskElementLabelProvider.java" name="person" replace="true" selection="5705 18" stamp="1209877577809" version="1.0"/>
<refactoring comment="Extract local variable 'repositoryUrl' from expression '((AbstractTask)element).getRepositoryUrl()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'repositoryUrl'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskDetailLabelProvider.getText()'
- Variable expression: '((AbstractTask)element).getRepositoryUrl()'
- Replace occurrences of expression with variable" description="Extract local variable 'repositoryUrl'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskDetailLabelProvider.java" name="repositoryUrl" replace="true" selection="2095 43" stamp="1209877759626" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/18/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/18/refactorings.index
new file mode 100644
index 0000000..8a13dfe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/18/refactorings.index
@@ -0,0 +1,42 @@
+1209610674849 Infer generic type arguments
+1209619040227 Copy compilation unit
+1209619450304 Copy compilation unit
+1209619543492 Extract local variable 'page'
+1209619689345 Extract local variable 'attachmentPage'
+1209619696977 Convert local variable 'editPage' to field
+1209620150477 Convert member type 'TaskAttachmentModel' to top level
+1209620200390 Move compilation unit
+1209620414216 Copy compilation unit
+1209622258077 Extract method 'getContent'
+1209622908410 Extract local variable 'stream'
+1209623464975 Extract local variable 'attachmentPage'
+1209623566377 Extract method 'openNewAttachmentWizard'
+1209624100462 Extract local variable 'previewAttachmentPage2'
+1209697182702 Move compilation unit
+1209697654248 Extract local variable 'model2'
+1209697951043 Extract local variable 'model2'
+1209698250822 Extract method 'runInWizard'
+1209700246168 Convert member type 'FileSource' to top level
+1209700266510 Move compilation unit
+1209700369913 Rename type 'FileSource'
+1209700403023 Move compilation unit
+1209702312838 Extract method 'runInBackground'
+1209702879618 Copy compilation unit
+1209703863564 Extract method 'getName'
+1209704271150 Copy compilation unit
+1209706505069 Rename type 'ClipboardSource'
+1209706532555 Convert member type 'TextTaskAttachmentSource' to top level
+1209706550215 Move compilation unit
+1209708995600 Move compilation unit
+1209709007206 Rename type 'TaskAttachmentPage2'
+1209709088062 Rename field 'supportsDescription'
+1209709464354 Delete element
+1209776583042 Rename type 'RefactorRepositoryUrlJob'
+1209778147098 Delete element
+1209853870065 Extract local variable 'taskAttribute'
+1209871532128 Move compilation unit
+1209871596421 Move compilation units
+1209872258734 Move compilation unit
+1209873879398 Move compilation units
+1209877577809 Extract local variable 'person'
+1209877759626 Extract local variable 'repositoryUrl'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/19/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/19/refactorings.history
new file mode 100644
index 0000000..284894e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/19/refactorings.history
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'public MenuManager org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor.getSubMenuManager(List<ITaskElement> selectedElements)' to 'public MenuManager getSubMenuManager(List<ITaskElement> selectedElements)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor.getSubMenuManager(...)'
- Changed parameters:
 List<ITask> selectedElements" delegate="false" deprecate="true" description="Change method 'getSubMenuManager'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{IDynamicSubMenuContributor.java[IDynamicSubMenuContributor~getSubMenuManager~QList\<QITask;>;" name="getSubMenuManager" parameter1="List<ITask> selectedElements 0 List<ITaskElement> selectedElements false" stamp="1209970082393" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.ActivityContextExternalizationParticipant' to 'ActivityExternalizationParticipant'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ActivityContextExternalizationParticipant'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.ActivityExternalizationParticipant'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'ActivityContextExternalizationParticipant'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{ActivityContextExternalizationParticipant.java[ActivityContextExternalizationParticipant" matchStrategy="1" name="ActivityExternalizationParticipant" qualified="false" references="true" similarDeclarations="false" stamp="1210027341683" textual="false" version="1.0"/>
+<refactoring comment="Change method 'public boolean org.eclipse.mylyn.internal.tasks.ui.TaskActivityMonitor.parseInteractionEvent(InteractionEvent event)' to 'public boolean parseInteractionEvent(InteractionEvent event, boolean isReloading)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskActivityMonitor.parseInteractionEvent(...)'
- Added parameters:
 boolean isReloading" default2="false" delegate="false" deprecate="true" description="Change method 'parseInteractionEvent'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskActivityMonitor.java[TaskActivityMonitor~parseInteractionEvent~QInteractionEvent;" name="parseInteractionEvent" parameter1="InteractionEvent event 0 InteractionEvent event false" parameter2="{added} {added} -1 boolean isReloading false" stamp="1210027646921" version="1.0"/>
+<refactoring comment="Extract method 'private ITaskSearchPage getSearchPage(AbstractRepositoryConnectorUi connectorUi)' from 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.displayQueryPage()' to 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getSearchPage'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'getSearchPage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="getSearchPage" replace="false" selection="10854 79" stamp="1210053500921" version="1.0" visibility="2"/>
+<refactoring comment="Encapsulate field 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage.repository' in 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage.repository'
- Getter method name: 'getTaskRepository'
- Setter method name: 'setRepository'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'repository'" flags="589830" getter="getTaskRepository" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositoryQueryPage.java[AbstractRepositoryQueryPage^repository" insertion="14" setter="setRepository" stamp="1210054321462" version="1.0" visibility="1"/>
+<refactoring comment="Extract local variable 'text' from expression 'titleText.getText()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'text'
- Destination method: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage.isPageComplete()'
- Variable expression: 'titleText.getText()'
- Replace occurrences of expression with variable" description="Extract local variable 'text'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositoryQueryPage.java" name="text" replace="true" selection="2837 19" stamp="1210054896693" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage.performAction()' to 'performSearch'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage.performAction()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage.performSearch()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'performAction'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.wizards{ITaskSearchPage.java[ITaskSearchPage~performAction" name="performSearch" references="true" stamp="1210056470986" version="1.0"/>
+<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.ui.TaskActivityMonitor.reloadActivityTime(Date date)' to 'public void reloadActivityTime()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskActivityMonitor.reloadActivityTime(...)'
- Removed parameters:
 Date date" delegate="false" deprecate="true" description="Change method 'reloadActivityTime'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskActivityMonitor.java[TaskActivityMonitor~reloadActivityTime~QDate;" name="reloadActivityTime" parameter1="Date date 0 {deleted} {deleted} true" stamp="1210140949303" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.sandbox.ui.activity'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.sandbox.ui/src/org.eclipse.mylyn.sandbox.ui.activity'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskActivityLabelProvider.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.sandbox.ui.activity" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskActivityLabelProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="=org.eclipse.mylyn.sandbox.ui/src	=org.eclipse.mylyn.sandbox.ui/src<org.eclipse.mylyn.sandbox.ui.activity" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210183550520" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'TaskListView.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1210192869966" subPackages="false" version="1.0"/>
+<refactoring comment="Rename compilation unit 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.java' to 'OldDelegatingTaskExternalizer.java'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.java'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.OldDelegatingTaskExternalizer.java'" description="Rename compilation unit 'DelegatingTaskExternalizer.java'" flags="2" id="org.eclipse.jdt.ui.rename.compilationunit" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java" name="OldDelegatingTaskExternalizer.java" references="false" stamp="1210210517638" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.DelegatingTaskExternalizer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{DelegatingTaskExternalizer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210228762999" subPackages="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUi.getTaskList()' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getTaskList()'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'getTaskList'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~getTaskList" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1210232611995" version="1.0"/>
+<refactoring comment="Encapsulate field 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard.repository' in 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard.repository'
- Getter method name: 'getTaskRepository'
- Setter method name: 'setRepository'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'repository'" flags="589830" getter="getTaskRepository" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositoryQueryWizard.java[AbstractRepositoryQueryWizard^repository" insertion="2" setter="setRepository" stamp="1210233398474" version="1.0" visibility="1"/>
+<refactoring comment="Encapsulate field 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard.query' in 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard.query'
- Getter method name: 'getQuery'
- Setter method name: 'setQuery'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'query'" flags="589830" getter="getQuery" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositoryQueryWizard.java[AbstractRepositoryQueryWizard^query" insertion="3" setter="setQuery" stamp="1210233406886" version="1.0" visibility="1"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.IRepositoryQueryPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tasks.ui.wizards{IRepositoryQueryPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210234445084" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard' to 'RepositoryQueryWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.wizards.RepositoryQueryWizard'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'AbstractRepositoryQueryWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositoryQueryWizard.java[AbstractRepositoryQueryWizard" matchStrategy="1" name="RepositoryQueryWizard" qualified="false" references="true" similarDeclarations="false" stamp="1210234544300" textual="false" version="1.0"/>
+<refactoring abstract="true" comment="Extract interface 'org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage' from 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage'
- Extracted interface: 'org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage'
- Extracted members:
 org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage.createTaskRepository()
 org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage.applyTo(...)" comments="true" description="Extract interface 'ITaskRepositoryPage'" element1="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage~createTaskRepository" element2="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage~applyTo~QTaskRepository;" flags="589830" id="org.eclipse.jdt.ui.extract.interface" input="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositorySettingsPage.java[AbstractRepositorySettingsPage" instanceof="true" name="ITaskRepositoryPage" public="true" replace="false" stamp="1210271073613" version="1.0"/>
+<refactoring comment="Change method 'public AbstractRepositorySettingsPage org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getSettingsPage()' to 'public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getSettingsPage()'
- New return type: 'ITaskRepositoryPage'
- Added parameters:
 TaskRepository taskRepository" default1="null" delegate="false" deprecate="true" description="Change method 'getSettingsPage'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getSettingsPage" name="getSettingsPage" parameter1="{added} {added} -1 TaskRepository taskRepository false" return="ITaskRepositoryPage" stamp="1210271271441" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.SelectRepositoryClientPage' to 'SelectRepositoryConnectorPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.SelectRepositoryClientPage'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.SelectRepositoryConnectorPage'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'SelectRepositoryClientPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{SelectRepositoryClientPage.java[SelectRepositoryClientPage" matchStrategy="1" name="SelectRepositoryConnectorPage" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1210285405149" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void updateSettingsPage()' from 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard.addPages()' to 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'updateSettingsPage'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard'
- Declared visibility: 'private'" comments="false" description="Extract method 'updateSettingsPage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewRepositoryWizard.java" name="updateSettingsPage" replace="false" selection="3209 193" stamp="1210285572377" version="1.0" visibility="2"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.AbstractRepositoryClientWizard.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{AbstractRepositoryClientWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210285827961" subPackages="false" version="1.0"/>
+<refactoring comment="Rename field 'repository' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard' to 'taskRepository'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard.repository'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard.taskRepository'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'repository'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewRepositoryWizard.java[NewRepositoryWizard^repository" name="taskRepository" references="true" setter="false" stamp="1210286251169" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage.getServerUrl()' to 'getRepositoryUrl'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage.getServerUrl()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage.getRepositoryUrl()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getServerUrl'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.wizards{ITaskRepositoryPage.java[ITaskRepositoryPage~getServerUrl" name="getRepositoryUrl" references="true" stamp="1210286307162" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryWizard.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui.wizards{AbstractRepositoryQueryWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210288370665" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/19/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/19/refactorings.index
new file mode 100644
index 0000000..5bbc2d1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/19/refactorings.index
@@ -0,0 +1,25 @@
+1209970082393 Change method 'getSubMenuManager'
+1210027341683 Rename type 'ActivityContextExternalizationParticipant'
+1210027646921 Change method 'parseInteractionEvent'
+1210053500921 Extract method 'getSearchPage'
+1210054321462 Encapsulate field 'repository'
+1210054896693 Extract local variable 'text'
+1210056470986 Rename method 'performAction'
+1210140949303 Change method 'reloadActivityTime'
+1210183550520 Move compilation unit
+1210192869966 Delete element
+1210210517638 Rename compilation unit 'DelegatingTaskExternalizer.java'
+1210228762999 Delete element
+1210232611995 Move member 'getTaskList'
+1210233398474 Encapsulate field 'repository'
+1210233406886 Encapsulate field 'query'
+1210234445084 Delete element
+1210234544300 Rename type 'AbstractRepositoryQueryWizard'
+1210271073613 Extract interface 'ITaskRepositoryPage'
+1210271271441 Change method 'getSettingsPage'
+1210285405149 Rename type 'SelectRepositoryClientPage'
+1210285572377 Extract method 'updateSettingsPage'
+1210285827961 Delete element
+1210286251169 Rename field 'repository'
+1210286307162 Rename method 'getServerUrl'
+1210288370665 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/20/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/20/refactorings.history
new file mode 100644
index 0000000..8e6a481
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/20/refactorings.history
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'attachmentHandler' from expression '((AbstractLegacyRepositoryConnector)connector).getAttachmentHandler()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'attachmentHandler'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.canUploadAttachment()'
- Variable expression: '((AbstractLegacyRepositoryConnector)connector).getAttachmentHandler()'
- Replace occurrences of expression with variable" description="Extract local variable 'attachmentHandler'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{AttachmentUtil.java" name="attachmentHandler" replace="true" selection="9032 70" stamp="1210623975742" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.commands'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskListViewHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.commands" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{AbstractTaskListViewHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210626132073" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskReadHandler.java'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskReadHandler.java'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskReadHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.commands{MarkTaskReadHandler.java" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{MarkTaskReadHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210627787010" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.commands'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.GoToUnreadTaskAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.commands" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{GoToUnreadTaskAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210633953559" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskUnreadHandler.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{MarkTaskUnreadHandler.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210634731743" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewCommands.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListViewCommands.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210635367567" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ShowTooltipAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ShowTooltipAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210635385522" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.GoToUnreadTaskAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{GoToUnreadTaskAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210636611970" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.MarkTaskMenuContributor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{MarkTaskMenuContributor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210636770675" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.commands.TaskListTooltipHandler' to 'TaskListToolTipHandler'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.TaskListTooltipHandler'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.commands.TaskListToolTipHandler'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskListTooltipHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.commands{TaskListTooltipHandler.java[TaskListTooltipHandler" matchStrategy="1" name="TaskListToolTipHandler" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1210636918241" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskReadAction.java
 org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskUnreadAction.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{MarkTaskUnreadAction.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.actions{MarkTaskReadAction.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1210636969000" subPackages="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.isAnimationsEnabled()' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.isAnimationsEnabled()'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'isAnimationsEnabled'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~isAnimationsEnabled" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1210708990405" version="1.0"/>
+<refactoring comment="Move 8 members to 'org.eclipse.mylyn.internal.tasks.ui.LegacyChangeManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.Change
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.ignoreAttribute(...)
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.cleanValue(...)
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.cleanValues(...)
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getDiff(...)
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getIncommingNotification(...)
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getChangedAttributes(...)
 org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getChangedDescription(...)
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.LegacyChangeManager'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin[Change" element2="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~ignoreAttribute~QRepositoryTaskData;~QRepositoryTaskAttribute;" element3="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~cleanValue~QString;" element4="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~cleanValues~QList\<QString;>;" element5="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getDiff~QRepositoryTaskData;~QRepositoryTaskAttribute;~QList\<QString;>;~QList\<QString;>;" element6="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getChangedAttributes~QRepositoryTaskData;~QRepositoryTaskData;" element7="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getChangedAttributes~QRepositoryTaskData;~QRepositoryTaskData;" element8="/src<org.eclipse.mylyn.internal.tasks.ui{LegacyChangeManager.java[LegacyChangeManagerescription~QRepositoryTaskData;~QRepositoryTaskData;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui{LegacyChangeManager.java[LegacyChangeManager" stamp="1210709233505" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.MAX_CHANGED_ATTRIBUTES' to 'org.eclipse.mylyn.internal.tasks.ui.LegacyChangeManager'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.MAX_CHANGED_ATTRIBUTES'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.LegacyChangeManager'" delegate="false" deprecate="true" description="Move member 'MAX_CHANGED_ATTRIBUTES'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^MAX_CHANGED_ATTRIBUTES" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui{LegacyChangeManager.java[LegacyChangeManager" stamp="1210709830724" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.context.ui/src/org.eclipse.mylyn.internal.context.ui.commands'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.context.ui/src<org.eclipse.mylyn.internal.context.ui.commands" element1="/src<org.eclipse.mylyn.internal.tasks.ui.commands{AbstractTaskHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210720746035" units="1" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.getContextAttachments(...)' to 'getLegacyContextAttachments'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.getContextAttachments(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.getLegacyContextAttachments(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getContextAttachments'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{AttachmentUtil.java[AttachmentUtil~getContextAttachments~QTaskRepository;~QITask;" name="getLegacyContextAttachments" references="true" stamp="1210723634823" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryAdapterFactory.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskRepositoryAdapterFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210726182673" units="1" version="1.0"/>
+<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.getDuplicateSearchCollector().allDetectors' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.getDuplicateSearchCollector()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.getDuplicateSearchCollector().allDetectors'" description="Inline local variable 'allDetectors'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorDescriptionPart.java" selection="5549 49" stamp="1210736916118" version="1.0"/>
+<refactoring comment="Extract method 'private boolean isValidDuplicateDetector(AbstractDuplicateDetector detector)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart.getDuplicateSearchCollectorsList()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'isValidDuplicateDetector'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart'
- Declared visibility: 'private'" comments="false" description="Extract method 'isValidDuplicateDetector'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorDescriptionPart.java" name="isValidDuplicateDetector" replace="false" selection="6256 186" stamp="1210736968822" version="1.0" visibility="2"/>
+<refactoring comment="Rename field 'ID_PERSPECTIVE' in 'org.eclipse.mylyn.tasks.ui.TasksUi' to 'ID_PERSPECTIVE_PLANNING'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PERSPECTIVE'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PERSPECTIVE_PLANNING'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_PERSPECTIVE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi^ID_PERSPECTIVE" name="ID_PERSPECTIVE_PLANNING" references="true" setter="true" stamp="1210822991267" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ID_PLANNING_PAGE' in 'org.eclipse.mylyn.tasks.ui.TasksUi' to 'ID_EDITOR_PAGE_PLANNING'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PLANNING_PAGE'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_EDITOR_PAGE_PLANNING'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_PLANNING_PAGE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi^ID_PLANNING_PAGE" name="ID_EDITOR_PAGE_PLANNING" references="true" setter="true" stamp="1210823011510" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'ID_EDITOR_PAGE_PLANNING' in 'org.eclipse.mylyn.tasks.ui.TasksUi' to 'ID_PAGE_PLANNING'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_EDITOR_PAGE_PLANNING'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PAGE_PLANNING'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_EDITOR_PAGE_PLANNING'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi^ID_EDITOR_PAGE_PLANNING" name="ID_PAGE_PLANNING" references="true" setter="true" stamp="1210823023252" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ITasksUiConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210823283871" units="1" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PAGE_PLANNING' to 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PAGE_PLANNING'
- Destination type: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'ID_PAGE_PLANNING'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi^ID_PAGE_PLANNING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1210823357954" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PERSPECTIVE_PLANNING' to 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.ID_PERSPECTIVE_PLANNING'
- Destination type: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'" delegate="false" deprecate="true" description="Move member 'ID_PERSPECTIVE_PLANNING'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi^ID_PERSPECTIVE_PLANNING" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1210823367764" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiImages.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.tasks.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiImages.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1210823812430" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants' to 'ITasksUiPreferenceConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPreferenceConstants'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TasksUiPreferenceConstants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPreferenceConstants.java[TasksUiPreferenceConstants" matchStrategy="1" name="ITasksUiPreferenceConstants" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1210832800773" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTask(...)' to 'openTaskAndRefresh'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTask(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskAndRefresh(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openTask~QITask;" name="openTaskAndRefresh" references="true" stamp="1210881029836" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskAndRefresh(...)' to 'openTaskAndSynchronize'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskAndRefresh(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskAndSynchronize(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openTaskAndRefresh'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openTaskAndRefresh~QITask;" name="openTaskAndSynchronize" references="true" stamp="1210881043760" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskAndSynchronize(...)' to 'openTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskAndSynchronize(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTask(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openTaskAndSynchronize'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openTaskAndSynchronize~QITask;" name="openTask" references="true" stamp="1210881826042" version="1.0"/>
+<refactoring comment="Rename field 'summary' in 'org.eclipse.mylyn.tasks.ui.LegendItem' to 'label'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.LegendItem.summary'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.LegendItem.label'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field" delegate="false" deprecate="true" description="Rename field 'summary'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{LegendItem.java[LegendItem^summary" name="label" references="true" setter="false" stamp="1210888152415" textual="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()' to 'getLegacyLegendItems'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegacyLegendItems()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLegendItems'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getLegendItems" name="getLegacyLegendItems" references="true" stamp="1210888239249" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()' to 'getLegendElements'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendElements()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLegendItems'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getLegendItems" name="getLegendElements" references="true" stamp="1210888894741" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegacyLegendItems()' to 'getLegendItems'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegacyLegendItems()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getLegendItems()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getLegacyLegendItems'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getLegacyLegendItems" name="getLegendItems" references="true" stamp="1210888903678" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.tasks.ui.LegendItem' to 'LegendElement'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.LegendItem'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.LegendElement'
- Update references to refactored element
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'LegendItem'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tasks.ui{LegendItem.java[LegendItem" matchStrategy="1" name="LegendElement" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="false" stamp="1210888926533" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void loadDataSources()' from 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataDirectory().new IRunnableWithProgress() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'loadDataSources'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin'
- Declared visibility: 'private'" comments="false" description="Extract method 'loadDataSources'" destination="1" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java" name="loadDataSources" replace="false" selection="30477 351" stamp="1210954811990" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/20/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/20/refactorings.index
new file mode 100644
index 0000000..67b59e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/20/refactorings.index
@@ -0,0 +1,36 @@
+1210623975742 Extract local variable 'attachmentHandler'
+1210626132073 Copy compilation unit
+1210627787010 Copy compilation unit
+1210633953559 Copy compilation unit
+1210634731743 Delete element
+1210635367567 Delete element
+1210635385522 Delete element
+1210636611970 Delete element
+1210636770675 Delete element
+1210636918241 Rename type 'TaskListTooltipHandler'
+1210636969000 Delete elements
+1210708990405 Move member 'isAnimationsEnabled'
+1210709233505 Move members
+1210709830724 Move member 'MAX_CHANGED_ATTRIBUTES'
+1210720746035 Copy compilation unit
+1210723634823 Rename method 'getContextAttachments'
+1210726182673 Copy compilation unit
+1210736916118 Inline local variable 'allDetectors'
+1210736968822 Extract method 'isValidDuplicateDetector'
+1210822991267 Rename field 'ID_PERSPECTIVE'
+1210823011510 Rename field 'ID_PLANNING_PAGE'
+1210823023252 Rename field 'ID_EDITOR_PAGE_PLANNING'
+1210823283871 Move compilation unit
+1210823357954 Move member 'ID_PAGE_PLANNING'
+1210823367764 Move member 'ID_PERSPECTIVE_PLANNING'
+1210823812430 Move compilation unit
+1210832800773 Rename type 'TasksUiPreferenceConstants'
+1210881029836 Rename method 'openTask'
+1210881043760 Rename method 'openTaskAndRefresh'
+1210881826042 Rename method 'openTaskAndSynchronize'
+1210888152415 Rename field 'summary'
+1210888239249 Rename method 'getLegendItems'
+1210888894741 Rename method 'getLegendItems'
+1210888903678 Rename method 'getLegacyLegendItems'
+1210888926533 Rename type 'LegendItem'
+1210954811990 Extract method 'loadDataSources'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..ae426fd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 6 members to 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.canDoGlobalAction(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.KEY_TEXT_VIEWER
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.doAction(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.canPerformDirectly(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.getTextViewer(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.canPerformAction(...)
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor~canDoGlobalAction~QString;~QTextViewer;" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor^KEY_TEXT_VIEWER" element3="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor~doAction~QString;~QControl;" element4="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor~canPerformDirectly~QString;~QControl;" element5="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor~getTextViewer~QControl;" element6="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtilr.java[TaskEditorActionContributor~canPerformAction~QString;~QControl;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil" stamp="1211239140347" version="1.0"/>
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor.doGlobalAction(...)'
- Textual move only" description="Move method" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorActionContributor.java[TaskEditorActionContributor~doGlobalAction~QString;~QTextViewer;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1211239189084" version="1.0"/>
<refactoring comment="Extract method 'private void initialize()' from 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor.addPages()' to 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'initialize'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditor'
- Declared visibility: 'private'" comments="false" description="Extract method 'initialize'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditor.java" name="initialize" replace="false" selection="6219 662" stamp="1211251211193" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'selectionListener' in 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit' to 'selectionChangedListener'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit.selectionListener'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit.selectionChangedListener'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'selectionListener'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{AttributeEditorToolkit.java[AttributeEditorToolkit^selectionListener" name="selectionChangedListener" references="true" setter="true" stamp="1211252420472" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.createSections()' to 'createFormContentInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.createSections()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.createFormContentInternal()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createSections'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage~createSections" name="createFormContentInternal" references="true" stamp="1211252930587" version="1.0"/>
<refactoring comment="Extract method 'private void createSections()' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.createFormContentInternal()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createSections'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'createSections'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="createSections" replace="false" selection="16507 717" stamp="1211252939476" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskFormPage.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskFormPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211268660860" units="1" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.RetrieveTitleFromUrlJob' to 'AbstractRetrieveTitleFromUrlJob'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.RetrieveTitleFromUrlJob'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.AbstractRetrieveTitleFromUrlJob'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'RetrieveTitleFromUrlJob'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{RetrieveTitleFromUrlJob.java[RetrieveTitleFromUrlJob" matchStrategy="1" name="AbstractRetrieveTitleFromUrlJob" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1211306183035" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.commons.core/src/org.eclipse.mylyn.internal.commons.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.AbstractRetrieveTitleFromUrlJob.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.core/src<org.eclipse.mylyn.internal.commons.core" element1="/src<org.eclipse.mylyn.internal.tasks.ui{AbstractRetrieveTitleFromUrlJob.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211306237569" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.openInActivePerspective()' to 'org.eclipse.mylyn.tasks.ui.TasksUi'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.openInActivePerspective()'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUi'" delegate="false" deprecate="true" description="Move member 'openInActivePerspective'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView~openInActivePerspective" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi" stamp="1211329794551" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUi.openInActivePerspective()' to 'org.eclipse.mylyn.tasks.ui.TasksUiUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.openInActivePerspective()'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil'" delegate="false" deprecate="true" description="Move member 'openInActivePerspective'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~openInActivePerspective" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil" stamp="1211329823051" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openInActivePerspective()' to 'openTasksViewInActivePerspective'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openInActivePerspective()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTasksViewInActivePerspective()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openInActivePerspective'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openInActivePerspective" name="openTasksViewInActivePerspective" references="true" stamp="1211329994107" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart.createEditor(...)' to 'createAttributeEditor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart.createEditor(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart.createAttributeEditor(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'createEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPart.java[AbstractTaskEditorPart~createEditor~QTaskAttribute;" name="createAttributeEditor" references="true" stamp="1211349239318" version="1.0"/>
<refactoring comment="Extract constant 'HEADER' from expression '"header"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'HEADER'
- Constant expression: '"header"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'HEADER'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="HEADER" qualify="false" replace="true" selection="19633 8" stamp="1211352339287" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'ATTRIBUTES' from expression '"attributes"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ATTRIBUTES'
- Constant expression: '"attributes"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ATTRIBUTES'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="ATTRIBUTES" qualify="false" replace="true" selection="19851 12" stamp="1211352356751" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'ATTACHMENTS' from expression '"attachments"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ATTACHMENTS'
- Constant expression: '"attachments"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ATTACHMENTS'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="ATTACHMENTS" qualify="false" replace="true" selection="20082 13" stamp="1211352386189" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditorNewCommentPart.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditorNewCommentPart.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1211353493798" units="1" version="1.0"/>
<refactoring comment="Extract method 'private void setSubmitEnabled()' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.refreshFormContent()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'setSubmitEnabled'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'setSubmitEnabled'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="setSubmitEnabled" replace="false" selection="29427 198" stamp="1211355130980" version="1.0" visibility="2"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.WorkspaceAwareContextStore' to 'LocalContextStore'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.WorkspaceAwareContextStore'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'WorkspaceAwareContextStore'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{WorkspaceAwareContextStore.java[WorkspaceAwareContextStore" matchStrategy="1" name="LocalContextStore" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1211398358604" textual="false" version="1.0"/>
<refactoring comment="Extract method 'private boolean addToCache(IInteractionContext context)' from 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore.saveContext()' to 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'addToCache'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Declared visibility: 'private'" comments="false" description="Extract method 'addToCache'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{LocalContextStore.java" name="addToCache" replace="false" selection="4510 66" stamp="1211405819268" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private boolean removeFromCache(IInteractionContext context)' from 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore.saveContext()' to 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'removeFromCache'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Declared visibility: 'private'" comments="false" description="Extract method 'removeFromCache'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{LocalContextStore.java" name="removeFromCache" replace="false" selection="4421 69" stamp="1211405832354" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void initCache()' from 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore.addToCache()' to 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'initCache'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore'
- Declared visibility: 'private'" comments="false" description="Extract method 'initCache'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{LocalContextStore.java" name="initCache" replace="false" selection="4813 267" stamp="1211406193006" version="1.0" visibility="2"/>

<refactoring comment="Extract method 'private File getContextStoreDir()' from 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataSources()' to 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getContextStoreDir'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin'
- Declared visibility: 'private'" comments="false" description="Extract method 'getContextStoreDir'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java" name="getContextStoreDir" replace="false" selection="30879 145" stamp="1211414334586" version="1.0" visibility="2"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.context.core/src/org.eclipse.mylyn.internal.context.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.LocalContextStore.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.context.core/src<org.eclipse.mylyn.internal.context.core" element1="/src<org.eclipse.mylyn.internal.tasks.ui{LocalContextStore.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1211414680422" units="1" version="1.0"/>
<refactoring comment="Rename local variable 'importedTasks' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.importTasks(...)' to 'tasks'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.importTasks(Collection<AbstractTask>, Set<TaskRepository>, File, Shell).importedTasks'
- Renamed element: 'importedTasks'
- Update references to refactored element" description="Rename local variable 'importedTasks'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskImportAction.java[TaskImportAction~importTasks~QCollection\<QAbstractTask;>;~QSet\<QTaskRepository;>;~QFile;~QShell;@importedTasks!3059!3096!3084!3096!QCollection" name="tasks" references="true" stamp="1211420013880" version="1.0"/>
<refactoring comment="Rename local variable 'file' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.importTasks(...)' to 'zipFile'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.importTasks(Collection<AbstractTask>, Set<TaskRepository>, File, Shell).file'
- Renamed element: 'file'
- Update references to refactored element" description="Rename local variable 'file'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskImportAction.java[TaskImportAction~importTasks~QCollection\<QAbstractTask;>;~QSet\<QTaskRepository;>;~QFile;~QShell;@file!3125!3133!3130!3133!QFile;" name="zipFile" references="true" stamp="1211420018733" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.importTasks(...)' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.importTasks(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'importTasks'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskImportAction.java[TaskImportAction~importTasks~QCollection\<QAbstractTask;>;~QSet\<QTaskRepository;>;~QFile;~QShell;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1211420030741" version="1.0"/>
<refactoring comment="Extract method 'private static void synchronizeTask(ITask task)' from 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTask()' to 'org.eclipse.mylyn.tasks.ui.TasksUiUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'synchronizeTask'
- Destination type: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'synchronizeTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java" name="synchronizeTask" replace="true" selection="16099 204" stamp="1211579055879" version="1.0" visibility="2"/>
<refactoring comment="Copy 2 elements(s) to 'etool16'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'etool16'
- Original elements:
 task-incomplete.gif
 task-complete.gif" description="Copy files" element1="icons/etool16/task-incomplete.gif" element2="icons/etool16/task-complete.gif" files="2" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1211697772256" target="/org.eclipse.mylyn.web.tasks/icons/etool16" units="0" version="1.0"/>
<refactoring comment="Extract local variable 'activeWorkbenchWindow' from expression 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activeWorkbenchWindow'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater.getEnabledSets()'
- Variable expression: 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Replace occurrences of expression with variable" description="Extract local variable 'activeWorkbenchWindow'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetUpdater.java" name="activeWorkbenchWindow" replace="true" selection="7277 52" stamp="1211700673074" version="1.0"/>
<refactoring comment="Extract local variable 'activePage' from expression 'window.getActivePage()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activePage'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater.getEnabledSets()'
- Variable expression: 'window.getActivePage()'
- Replace occurrences of expression with variable" description="Extract local variable 'activePage'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetUpdater.java" name="activePage" replace="true" selection="7431 22" stamp="1211700687134" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..e4f28d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1,31 @@
+1211239140347 Move members
+1211239189084 Move method
+1211251211193 Extract method 'initialize'
+1211252420472 Rename field 'selectionListener'
+1211252930587 Rename method 'createSections'
+1211252939476 Extract method 'createSections'
+1211268660860 Move compilation unit
+1211306183035 Rename type 'RetrieveTitleFromUrlJob'
+1211306237569 Move compilation unit
+1211329794551 Move member 'openInActivePerspective'
+1211329823051 Move member 'openInActivePerspective'
+1211329994107 Rename method 'openInActivePerspective'
+1211349239318 Rename method 'createEditor'
+1211352339287 Extract constant 'HEADER'
+1211352356751 Extract constant 'ATTRIBUTES'
+1211352386189 Extract constant 'ATTACHMENTS'
+1211353493798 Move compilation unit
+1211355130980 Extract method 'setSubmitEnabled'
+1211398358604 Rename type 'WorkspaceAwareContextStore'
+1211405819268 Extract method 'addToCache'
+1211405832354 Extract method 'removeFromCache'
+1211406193006 Extract method 'initCache'
+1211414334586 Extract method 'getContextStoreDir'
+1211414680422 Move compilation unit
+1211420013880 Rename local variable 'importedTasks'
+1211420018733 Rename local variable 'file'
+1211420030741 Move member 'importTasks'
+1211579055879 Extract method 'synchronizeTask'
+1211697772256 Copy files
+1211700673074 Extract local variable 'activeWorkbenchWindow'
+1211700687134 Extract local variable 'activePage'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..cfc26ca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'CONTEXT_TASK_ACTIVITY_LISTENER' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin' to 'CONTEXT_TASK_ACTIVATION_LISTENER'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.CONTEXT_TASK_ACTIVITY_LISTENER'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.CONTEXT_TASK_ACTIVATION_LISTENER'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'CONTEXT_TASK_ACTIVITY_LISTENER'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^CONTEXT_TASK_ACTIVITY_LISTENER" name="CONTEXT_TASK_ACTIVATION_LISTENER" references="true" setter="false" stamp="1211831259518" textual="false" version="1.0"/>
<refactoring comment="Rename field 'TASK_ACTIVITY_LISTENER' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView' to 'TASK_ACTIVATION_LISTENER'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_ACTIVITY_LISTENER'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.TASK_ACTIVATION_LISTENER'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'TASK_ACTIVITY_LISTENER'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^TASK_ACTIVITY_LISTENER" name="TASK_ACTIVATION_LISTENER" references="true" setter="false" stamp="1211831308059" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.LocalTaskConnectorUi' to 'LocalRepositoryConnectorUi'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.LocalTaskConnectorUi'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryConnectorUi'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'LocalTaskConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{LocalTaskConnectorUi.java[LocalTaskConnectorUi" matchStrategy="1" name="LocalRepositoryConnectorUi" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1211834218239" textual="false" version="1.0"/>
<refactoring comment="Extract method 'private boolean extracted(ITask task,AbstractRepositoryConnector connector)' from 'org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester.test()' to 'org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'extracted'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester'
- Declared visibility: 'private'" comments="false" description="Extract method 'extracted'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskPropertyTester.java" name="extracted" replace="false" selection="3280 124" stamp="1211837758853" version="1.0" visibility="2"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester.hasCapability(...)' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester.hasCapability(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'hasCapability'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskPropertyTester.java[TaskPropertyTester~hasCapability~QITask;~QCapability;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1211838578214" version="1.0"/>
<refactoring comment="Extract method 'private void decorateIncoming(Color color)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.decorate()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'decorateIncoming'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor'
- Declared visibility: 'private'" comments="false" description="Extract method 'decorateIncoming'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractAttributeEditor.java" name="decorateIncoming" replace="false" selection="3474 34" stamp="1211840027016" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void decorateOutgoing()' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.decorate()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'decorateOutgoing'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor'
- Declared visibility: 'private'" comments="false" description="Extract method 'decorateOutgoing'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractAttributeEditor.java" name="decorateOutgoing" replace="false" selection="3565 90" stamp="1211840036810" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void createLegacyTask(AbstractRepositoryConnector connector)' from 'org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard.performFinish()' to 'org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'createLegacyTask'
- Destination type: 'org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard'
- Declared visibility: 'private'" comments="false" description="Extract method 'createLegacyTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.wizards{NewTaskWizard.java" name="createLegacyTask" replace="false" selection="3198 2408" stamp="1211860500720" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.openNewTask(...)' to 'createAndOpenNewTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.openNewTask(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.createAndOpenNewTask(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openNewTask'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal~openNewTask~QTaskData;" name="createAndOpenNewTask" references="true" stamp="1211861188999" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.downloadContext(...)' to 'downloadLegacyContext'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.downloadContext(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.AttachmentUtil.downloadLegacyContext(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'downloadContext'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{AttachmentUtil.java[AttachmentUtil~downloadContext~QITask;~QRepositoryAttachment;~QIRunnableContext;" name="downloadLegacyContext" references="true" stamp="1212010694503" version="1.0"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListCellModifier.modify().taskListElement' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListCellModifier.modify()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListCellModifier.modify().taskListElement'" description="Inline local variable 'taskListElement'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListCellModifier.java" selection="2880 63" stamp="1212101933791" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.getTasksModel()' to 'getRepositoryModel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getTasksModel()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getRepositoryModel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTasksModel'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~getTasksModel" name="getRepositoryModel" references="true" stamp="1212103511071" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTasksModel()' to 'getRepositoryModel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTasksModel()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getRepositoryModel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTasksModel'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~getTasksModel" name="getRepositoryModel" references="true" stamp="1212103616706" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.core/src/org.eclipse.mylyn.tasks.core'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.IRepositoryModelListener.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.tasks.core" element1="/src<org.eclipse.mylyn.internal.tasks.ui{IRepositoryModelListener.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212104326346" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.hasCustomNotificationHandling()' to 'hasCustomNotifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.hasCustomNotificationHandling()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.hasCustomNotifications()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'hasCustomNotificationHandling'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~hasCustomNotificationHandling" name="hasCustomNotifications" references="true" stamp="1212110199402" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.forceSubtaskHierarchy()' to 'hasStrictSubtaskHierarchy'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.forceSubtaskHierarchy()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.hasStrictSubtaskHierarchy()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'forceSubtaskHierarchy'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~forceSubtaskHierarchy" name="hasStrictSubtaskHierarchy" references="true" stamp="1212110309130" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getReply(...)' to 'getReplyText'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getReply(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getReplyText(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getReply'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getReply~QTaskRepository;~QITask;~QITaskComment;~Z" name="getReplyText" references="true" stamp="1212110612862" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.openRepositoryTask(...)' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.openRepositoryTask(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'openRepositoryTask'" element1="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~openRepositoryTask~QString;~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1212110914288" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getTaskListElementIcon(...)' to 'getImageDescriptor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getTaskListElementIcon(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi.getImageDescriptor(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskListElementIcon'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{AbstractRepositoryConnectorUi.java[AbstractRepositoryConnectorUi~getTaskListElementIcon~QIRepositoryElement;" name="getImageDescriptor" references="true" stamp="1212111319754" version="1.0"/>
<refactoring comment="Rename field 'CATEGORY_ARCHIVE' in 'org.eclipse.mylyn.tasks.ui.TasksUiImages' to 'CATEGORY_UNCATEGORIZED'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiImages.CATEGORY_ARCHIVE'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiImages.CATEGORY_UNCATEGORIZED'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'CATEGORY_ARCHIVE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiImages.java[TasksUiImages^CATEGORY_ARCHIVE" name="CATEGORY_UNCATEGORIZED" references="true" setter="true" stamp="1212111766198" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskInBackground(...)' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openTaskInBackground(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'openTaskInBackground'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openTaskInBackground~QITask;~Z" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1212113023529" version="1.0"/>
<refactoring comment="Move 1 element(s) to 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.PREFS_PAGE_ID_COLORS_AND_FONTS'
- Textual move only" description="Move field" destination="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil^PREFS_PAGE_ID_COLORS_AND_FONTS" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1212113048697" version="1.0"/>
<refactoring comment="Rename field 'PREFS_PAGE_ID_COLORS_AND_FONTS' in 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants' to 'ID_PREFERENCES_COLORS_AND_FONTS'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.PREFS_PAGE_ID_COLORS_AND_FONTS'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_PREFERENCES_COLORS_AND_FONTS'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PREFS_PAGE_ID_COLORS_AND_FONTS'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^PREFS_PAGE_ID_COLORS_AND_FONTS" name="ID_PREFERENCES_COLORS_AND_FONTS" references="true" setter="true" stamp="1212113155732" textual="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.ui/src/org.eclipse.mylyn.internal.trac.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.trac.ui/src/org.eclipse.mylyn.internal.trac.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.WebHyperlink.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.trac.ui/src<org.eclipse.mylyn.internal.trac.ui" element1="/src<org.eclipse.mylyn.tasks.ui{WebHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212113454128" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.deprecated'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorFactory.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.deprecated" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorFactory.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1212113552868" units="1" version="1.0"/>

<refactoring comment="Extract local variable 'data' from expression '((TreeItem)element).getData()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'data'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListCellModifier.modify()'
- Variable expression: '((TreeItem)element).getData()'
- Replace occurrences of expression with variable" description="Extract local variable 'data'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListCellModifier.java" name="data" replace="true" selection="2626 30" stamp="1212123469861" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.CapabilityContext.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{CapabilityContext.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212129148470" subPackages="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.getConnector(...)' to 'getRepositoryConnector'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getConnector(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getRepositoryConnector(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getConnector'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~getConnector~QString;" name="getRepositoryConnector" references="true" stamp="1212177962142" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUi.getConnectorUi(...)' to 'getRepositoryConnectorUi'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getConnectorUi(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUi.getRepositoryConnectorUi(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getConnectorUi'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUi.java[TasksUi~getConnectorUi~QString;" name="getRepositoryConnectorUi" references="true" stamp="1212177969336" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..cf1d8f2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,29 @@
+1211831259518 Rename field 'CONTEXT_TASK_ACTIVITY_LISTENER'
+1211831308059 Rename field 'TASK_ACTIVITY_LISTENER'
+1211834218239 Rename type 'LocalTaskConnectorUi'
+1211837758853 Extract method 'extracted'
+1211838578214 Move member 'hasCapability'
+1211840027016 Extract method 'decorateIncoming'
+1211840036810 Extract method 'decorateOutgoing'
+1211860500720 Extract method 'createLegacyTask'
+1211861188999 Rename method 'openNewTask'
+1212010694503 Rename method 'downloadContext'
+1212101933791 Inline local variable 'taskListElement'
+1212103511071 Rename method 'getTasksModel'
+1212103616706 Rename method 'getTasksModel'
+1212104326346 Move compilation unit
+1212110199402 Rename method 'hasCustomNotificationHandling'
+1212110309130 Rename method 'forceSubtaskHierarchy'
+1212110612862 Rename method 'getReply'
+1212110914288 Move member 'openRepositoryTask'
+1212111319754 Rename method 'getTaskListElementIcon'
+1212111766198 Rename field 'CATEGORY_ARCHIVE'
+1212113023529 Move member 'openTaskInBackground'
+1212113048697 Move field
+1212113155732 Rename field 'PREFS_PAGE_ID_COLORS_AND_FONTS'
+1212113454128 Move compilation unit
+1212113552868 Move compilation unit
+1212123469861 Extract local variable 'data'
+1212129148470 Delete element
+1212177962142 Rename method 'getConnector'
+1212177969336 Rename method 'getConnectorUi'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/22/refactorings.history
new file mode 100644
index 0000000..9cbeede
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'text' from expression 'viewer.getTextWidget().getText()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'text'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor.createControl().new ITextListener() {...}.textChanged()'
- Variable expression: 'viewer.getTextWidget().getText()'
- Replace occurrences of expression with variable" description="Extract local variable 'text'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RichTextAttributeEditor.java" name="text" replace="true" selection="6038 32" stamp="1212290183817" version="1.0"/>
<refactoring comment="Extract local variable 'hasSpellChecking' from expression 'getTaskEditorPage().getAttributeEditorToolkit().hasSpellChecking(attribute)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'hasSpellChecking'
- Destination method: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart.createAttributeEditor()'
- Variable expression: 'getTaskEditorPage().getAttributeEditorToolkit().hasSpellChecking(attribute)'
- Replace occurrences of expression with variable" description="Extract local variable 'hasSpellChecking'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPart.java" name="hasSpellChecking" replace="true" selection="2449 82" stamp="1212290977872" version="1.0"/>
<refactoring comment="Extract local variable 'type' from expression 'taskAttribute.getMetaData().getType()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'type'
- Destination method: 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit.hasContentAssist()'
- Variable expression: 'taskAttribute.getMetaData().getType()'
- Replace occurrences of expression with variable" description="Extract local variable 'type'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui.editors{AttributeEditorToolkit.java" name="type" replace="true" selection="10320 37" stamp="1212292542398" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlinePage.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskOutlinePage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212294155376" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212294162826" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlinePage.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskOutlinePage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212294172021" units="1" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTaskOutlineNode.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212294213926" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode.getKey()' to 'getLabel'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode.getKey()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode.getLabel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getKey'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorOutlineNode.java[TaskEditorOutlineNode~getKey" name="getLabel" references="true" stamp="1212294500889" version="1.0"/>
<refactoring comment="Extract local variable 'author' from expression 'taskComment.getAuthor()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'author'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode.createNode()'
- Variable expression: 'taskComment.getAuthor()'
- Replace occurrences of expression with variable" description="Extract local variable 'author'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorOutlineNode.java" name="author" replace="true" selection="4864 23" stamp="1212295549005" version="1.0"/>
<refactoring comment="Extract constant 'YYYY_MM_DD' from expression '"yyyy-MM-dd"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'YYYY_MM_DD'
- Constant expression: '"yyyy-MM-dd"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'YYYY_MM_DD'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{DateAttributeEditor.java" name="YYYY_MM_DD" qualify="false" replace="true" selection="2646 12" stamp="1212296342033" version="1.0" visibility="2"/>

<refactoring comment="Rename field 'comment' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode' to 'taskComment'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode.comment'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode.taskComment'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'comment'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorOutlineNode.java[TaskEditorOutlineNode^comment" name="taskComment" references="true" setter="true" stamp="1212297258908" textual="true" version="1.0"/>
<refactoring comment="Extract local variable 'author' from expression 'node.getTaskComment().getAuthor()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'author'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlinePage.createControl().new LabelProvider() {...}.getImage()'
- Variable expression: 'node.getTaskComment().getAuthor()'
- Replace occurrences of expression with variable" description="Extract local variable 'author'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorOutlinePage.java" name="author" replace="true" selection="2699 33" stamp="1212297307673" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskSpellingReconcileStrategy.java'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskSpellingReconcileStrategy.java'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlinkDetector.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskSpellingReconcileStrategy.java" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskUrlHyperlinkDetector.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212310147884" units="1" version="1.0"/>
<refactoring comment="Extract method 'private void detectHyperlinks(IRegion region,IRegion lineInfo,String line,List<TaskRepository> repositories,List<IHyperlink> hyperlinks)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector.detectHyperlinks()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'detectHyperlinks'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector'
- Declared visibility: 'private'" comments="false" description="Extract method 'detectHyperlinks'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkDetector.java" name="detectHyperlinks" replace="false" selection="2496 444" stamp="1212310251937" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector.getRepository(...)' to 'getTaskRepository'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector.getRepository(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector.getTaskRepository(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkDetector.java[TaskHyperlinkDetector~getRepository~QITextViewer;" name="getTaskRepository" references="true" stamp="1212311867688" version="1.0"/>
<refactoring comment="Extract method 'private boolean isSeparatorChar(char ch)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector.extractPrefix()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'isSeparatorChar'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector'
- Declared visibility: 'private'" comments="false" description="Extract method 'isSeparatorChar'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskRelationHyperlinkDetector.java" name="isSeparatorChar" replace="false" selection="2231 26" stamp="1212312178057" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'length' from expression 'document.getLength()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'length'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskRelationHyperlinkDetector.extractPostfix()'
- Variable expression: 'document.getLength()'
- Replace occurrences of expression with variable" description="Extract local variable 'length'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskRelationHyperlinkDetector.java" name="length" replace="true" selection="2423 20" stamp="1212313321159" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskDependendyAttributeEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskDependendyAttributeEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212314209707" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/22/refactorings.index
new file mode 100644
index 0000000..920b40a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/22/refactorings.index
@@ -0,0 +1,18 @@
+1212290183817 Extract local variable 'text'
+1212290977872 Extract local variable 'hasSpellChecking'
+1212292542398 Extract local variable 'type'
+1212294155376 Copy compilation unit
+1212294162826 Delete element
+1212294172021 Copy compilation unit
+1212294213926 Copy compilation unit
+1212294500889 Rename method 'getKey'
+1212295549005 Extract local variable 'author'
+1212296342033 Extract constant 'YYYY_MM_DD'
+1212297258908 Rename field 'comment'
+1212297307673 Extract local variable 'author'
+1212310147884 Copy compilation unit
+1212310251937 Extract method 'detectHyperlinks'
+1212311867688 Rename method 'getRepository'
+1212312178057 Extract method 'isSeparatorChar'
+1212313321159 Extract local variable 'length'
+1212314209707 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..6a606e2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.notifications'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.LegacyChangeManager.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.notifications" element1="/src<org.eclipse.mylyn.internal.tasks.ui{LegacyChangeManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212381060856" units="1" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDataDiff.TaskAttributeDiff' in 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDataDiff' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDataDiff.TaskAttributeDiff'
- Field name: 'taskDataDiff'
- Declare field 'final'" description="Convert member type 'TaskAttributeDiff' to top level" field="false" fieldName="taskDataDiff" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskDataDiff.java[TaskDataDiff[TaskAttributeDiff" mandatory="false" possible="false" stamp="1212381972354" version="1.0"/>
+<refactoring comment="Extract local variable 'size' from expression 'newComments.size()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'size'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDataDiff.toString()'
- Variable expression: 'newComments.size()'
- Replace occurrences of expression with variable" description="Extract local variable 'size'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskDataDiff.java" name="size" replace="true" selection="4350 18" stamp="1212387128201" version="1.0"/>
+<refactoring comment="Extract local variable 'label' from expression 'attributeDiff.getLabel()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'label'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDataDiff.toString()'
- Variable expression: 'attributeDiff.getLabel()'
- Replace occurrences of expression with variable" description="Extract local variable 'label'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskDataDiff.java" name="label" replace="true" selection="4466 24" stamp="1212388250355" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.util" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskPropertyTester.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212471274458" units="1" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentEditorInput.TaskAttachmentStorage' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentEditorInput' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentEditorInput.TaskAttachmentStorage'
- Field name: 'taskAttachmentEditorInput'
- Declare field 'final'" description="Convert member type 'TaskAttachmentStorage' to top level" field="false" fieldName="taskAttachmentEditorInput" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskAttachmentEditorInput.java[TaskAttachmentEditorInput[TaskAttachmentStorage" mandatory="false" possible="false" stamp="1212472132488" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.DataFolderBackup' to 'CopyFolderOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.DataFolderBackup'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.CopyFolderOperation'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'DataFolderBackup'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{DataFolderBackup.java[DataFolderBackup" matchStrategy="1" name="CopyFolderOperation" qualified="false" references="true" similarDeclarations="false" stamp="1212540180670" textual="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.BackgroundSaveTimer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{BackgroundSaveTimer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212542122503" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.BackgroundSaveTimer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{BackgroundSaveTimer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212608773575" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.DialogReporter' to 'DialogErrorReporter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.DialogReporter'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.DialogErrorReporter'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'DialogReporter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{DialogReporter.java[DialogReporter" matchStrategy="1" name="DialogErrorReporter" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1212630963031" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void handleCheckStateChangeHelper(final CheckStateChangedEvent event,IAdaptable element)' from 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.handleCheckStateChange().new Runnable() {...}.run()' to 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.handleCheckStateChange().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'handleCheckStateChangeHelper'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.handleCheckStateChange().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'handleCheckStateChangeHelper'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java" name="handleCheckStateChangeHelper" replace="false" selection="18608 576" stamp="1212702423475" version="1.0" visibility="2"/>
+<refactoring comment="Extract constant 'APPLICATION_OCTET_STREAM' from expression '"application/octet-stream"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'APPLICATION_OCTET_STREAM'
- Constant expression: '"application/octet-stream"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'APPLICATION_OCTET_STREAM'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.tasks.ui.wizards{TaskAttachmentPage.java" name="APPLICATION_OCTET_STREAM" qualify="false" replace="true" selection="2145 26" stamp="1212708027889" version="1.0" visibility="2"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.MAXIMUM_WIDTH' to 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.MAXIMUM_WIDTH'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'" delegate="false" deprecate="true" description="Move member 'MAXIMUM_WIDTH'" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractAttributeEditor.java[AbstractAttributeEditor^MAXIMUM_WIDTH" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil" stamp="1212710754558" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.MAXIMUM_HEIGHT' to 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.MAXIMUM_HEIGHT'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'" delegate="false" deprecate="true" description="Move member 'MAXIMUM_HEIGHT'" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractAttributeEditor.java[AbstractAttributeEditor^MAXIMUM_HEIGHT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil" stamp="1212710764060" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.TEXT_FONT' to 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor.TEXT_FONT'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil'" delegate="false" deprecate="true" description="Move member 'TEXT_FONT'" element1="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractAttributeEditor.java[AbstractAttributeEditor^TEXT_FONT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil" stamp="1212710792280" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND' to 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal'" delegate="false" deprecate="true" description="Move member 'ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil^ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal" stamp="1212809868182" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil^ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1212809893730" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND' to 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND'
- Destination type: 'org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants'" delegate="false" deprecate="true" description="Move member 'ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal^ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.tasks.core/src<org.eclipse.mylyn.internal.tasks.core{ITasksCoreConstants.java[ITasksCoreConstants" stamp="1212809905316" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..46c2562
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,18 @@
+1212381060856 Copy compilation unit
+1212381972354 Convert member type 'TaskAttributeDiff' to top level
+1212387128201 Extract local variable 'size'
+1212388250355 Extract local variable 'label'
+1212471274458 Copy compilation unit
+1212472132488 Convert member type 'TaskAttachmentStorage' to top level
+1212540180670 Rename type 'DataFolderBackup'
+1212542122503 Delete element
+1212608773575 Delete element
+1212630963031 Rename type 'DialogReporter'
+1212702423475 Extract method 'handleCheckStateChangeHelper'
+1212708027889 Extract constant 'APPLICATION_OCTET_STREAM'
+1212710754558 Move member 'MAXIMUM_WIDTH'
+1212710764060 Move member 'MAXIMUM_HEIGHT'
+1212710792280 Move member 'TEXT_FONT'
+1212809868182 Move member 'ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND'
+1212809893730 Move member 'ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL'
+1212809905316 Move member 'ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..543bd83
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'priority' from expression 'mapping.getPriority()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'priority'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart.createHeaderLayout()'
- Variable expression: 'mapping.getPriority()'
- Replace occurrences of expression with variable" description="Extract local variable 'priority'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorSummaryPart.java" name="priority" replace="true" selection="4203 21" stamp="1213069082794" version="1.0"/>
<refactoring comment="Extract local variable 'resolution' from expression 'mapping.getResolution()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'resolution'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart.createHeaderLayout()'
- Variable expression: 'mapping.getResolution()'
- Replace occurrences of expression with variable" description="Extract local variable 'resolution'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskEditorSummaryPart.java" name="resolution" replace="true" selection="4274 23" stamp="1213069906470" version="1.0"/>
<refactoring comment="Rename field 'DESCRIPTION' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage' to 'MESSAGE_WARNING'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage.DESCRIPTION'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizardPage.MESSAGE_WARNING'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'DESCRIPTION'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskDataImportWizardPage.java[TaskDataImportWizardPage^DESCRIPTION" name="MESSAGE_WARNING" references="true" setter="true" stamp="1213199983077" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink' to 'TaskHyperlink'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskListHyperlink'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskListHyperlink'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListHyperlink.java[TaskListHyperlink" matchStrategy="1" name="TaskHyperlink" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1213201590042" textual="false" version="1.0"/>
<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylyn.internal.tasks.ui.ScalingHyperlink' from 'org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink'
- Sub types:
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink
- Extracted class: 'org.eclipse.mylyn.internal.tasks.ui.ScalingHyperlink'
- Extracted members:
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.strikeThrough
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.MOUSE_TRACK_LISTENER
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.dispose()
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.isStrikeThrough()
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.paintText(...)
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.setStrikeThrough(...)
 org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink.shortenText(...)
- Use super type where possible
- Use super type in 'instanceof' expressions" delete="5" description="Extract superclass 'ScalingHyperlink'" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink^strikeThrough" element10="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~paintText~QGC;~QRectangle;" element11="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~setStrikeThrough~Z" element12="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~shortenText~QGC;~QString;~I" element13="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink" element2="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink^MOUSE_TRACK_LISTENER" element3="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~isStrik" element4="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~isStrikeThrough" element5="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~setStrikeThrough~Zctangle;" element6="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~setStrikeThrough~Z" element7="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~disposeText~QGC;~QString;~I" element8="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~dispose" element9="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink~isStrikeThrough" extract="7" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskHyperlink.java[TaskHyperlink" instanceof="true" name="ScalingHyperlink" replace="true" stamp="1213201699417" stubs="true" types="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScalingHyperlink.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui{ScalingHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1213201895713" units="1" version="1.0"/>
<refactoring comment="Change method 'public FormPage org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory.createPage(TaskEditor parentEditor)' to 'public IFormPage createPage(TaskEditor parentEditor)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory.createPage(...)'
- New return type: 'IFormPage'" delegate="false" deprecate="true" description="Change method 'createPage'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPageFactory.java[AbstractTaskEditorPageFactory~createPage~QTaskEditor;" name="createPage" parameter1="TaskEditor parentEditor 0 TaskEditor parentEditor false" return="IFormPage" stamp="1213220621176" version="1.0"/>
<refactoring comment="Extract method 'private ImageDescriptor getPriorityImage(Object element)' from 'org.eclipse.mylyn.internal.tasks.ui.TaskLabelDecorator.getPriorityImageDescriptor()' to 'org.eclipse.mylyn.internal.tasks.ui.TaskLabelDecorator'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getPriorityImage'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.TaskLabelDecorator'
- Declared visibility: 'private'" comments="false" description="Extract method 'getPriorityImage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskLabelDecorator.java" name="getPriorityImage" replace="false" selection="3864 219" stamp="1213222760431" version="1.0" visibility="2"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.preferences.TaskFocusedUiPreferencePage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TaskFocusedUiPreferencePage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213224501261" subPackages="false" version="1.0"/>
<refactoring comment="Extract constant 'LABEL_RESOURCES' from expression '"Resources"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_RESOURCES'
- Constant expression: '"Resources"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_RESOURCES'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java" name="LABEL_RESOURCES" qualify="false" replace="true" selection="5467 11" stamp="1213239593449" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'tasksCategory' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider' to 'tasksContainer'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.tasksCategory'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.tasksContainer'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'tasksCategory'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[WorkingSetPageContentProvider^tasksCategory" name="tasksContainer" references="true" setter="true" stamp="1213240835314" textual="false" version="1.0"/>
<refactoring comment="Rename field 'resourcesCategory' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider' to 'resourcesContainer'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.resourcesCategory'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.resourcesContainer'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'resourcesCategory'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[WorkingSetPageContentProvider^resourcesCategory" name="resourcesContainer" references="true" setter="true" stamp="1213241600882" textual="false" version="1.0"/>
<refactoring comment="Rename field 'repositoryMap' in 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider' to 'queryMap'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.repositoryMap'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.queryMap'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'repositoryMap'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage[WorkingSetPageContentProvider^repositoryMap" name="queryMap" references="true" setter="true" stamp="1213241701045" textual="false" version="1.0"/>
<refactoring comment="Extract local variable 'projectMapping' from expression 'new TaskRepositoryProjectMapping((TaskRepository)container,mappedProjects)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'projectMapping'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.WorkingSetPageContentProvider.getChildren()'
- Variable expression: 'new TaskRepositoryProjectMapping((TaskRepository)container,mappedProjects)'
- Replace occurrences of expression with variable" description="Extract local variable 'projectMapping'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java" name="projectMapping" replace="true" selection="5669 87" stamp="1213242540994" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.select(Object parent, Object element)' to 'public boolean select(Object parent, Object element, String filterText)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.select(...)'
- Added parameters:
 String filterText" default3="null" delegate="false" deprecate="true" description="Change method 'select'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{AbstractTaskListFilter.java[AbstractTaskListFilter~select~QObject;~QObject;" name="select" parameter1="Object parent 0 Object parent false" parameter2="Object element 1 Object element false" parameter3="{added} {added} -1 String filterText false" stamp="1213303049145" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.select(Object parent, Object element, String filterText)' to 'public boolean select(Object parent, Object element)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.select(...)'
- Removed parameters:
 String filterText" delegate="false" deprecate="true" description="Change method 'select'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui{AbstractTaskListFilter.java[AbstractTaskListFilter~select~QObject;~QObject;~QString;" name="select" parameter1="Object parent 0 Object parent false" parameter2="Object element 1 Object element false" parameter3="String filterText 2 {deleted} {deleted} true" stamp="1213303235332" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.ignoreFilterText()' to 'applyToFilteredText'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.ignoreFilterText()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter.applyToFilteredText()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'ignoreFilterText'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{AbstractTaskListFilter.java[AbstractTaskListFilter~ignoreFilterText" name="applyToFilteredText" references="true" stamp="1213303467367" version="1.0"/>
<refactoring comment="Convert local variable 'org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider.TaskScheduleContentProvider().cal' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider.TaskScheduleContentProvider()' to field
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider.TaskScheduleContentProvider().cal'
- Field name: 'cal'
- Initialize field in method
- Declared visibility: 'private'" description="Convert local variable 'cal' to field" final="false" flags="2" id="org.eclipse.jdt.ui.promote.temp" initialize="1" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskScheduleContentProvider.java" name="cal" selection="1926 36" stamp="1213334363718" static="false" version="1.0" visibility="2"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.ShowMylynLegendAction' to 'ShowTasksUiLegendAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ShowMylynLegendAction'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ShowMylynLegendAction'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ShowMylynLegendAction.java[ShowMylynLegendAction" matchStrategy="1" name="ShowTasksUiLegendAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1213380679386" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.addUnmatchedCategories(...)' to 'addSpecialContainers'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.addUnmatchedCategories(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage.addSpecialContainers(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addUnmatchedCategories'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.workingsets{TaskWorkingSetPage.java[TaskWorkingSetPage~addUnmatchedCategories~QSet\<QIAdaptable;>;" name="addSpecialContainers" references="true" stamp="1213403946005" version="1.0"/>
<refactoring comment="Extract method 'private void extracted(TaskEditorInput taskEditorInput)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.init()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'extracted'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'extracted'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="extracted" replace="false" selection="34405 272" stamp="1213434920538" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..9dcd9dc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,21 @@
+1213069082794 Extract local variable 'priority'
+1213069906470 Extract local variable 'resolution'
+1213199983077 Rename field 'DESCRIPTION'
+1213201590042 Rename type 'TaskListHyperlink'
+1213201699417 Extract superclass 'ScalingHyperlink'
+1213201895713 Move compilation unit
+1213220621176 Change method 'createPage'
+1213222760431 Extract method 'getPriorityImage'
+1213224501261 Delete element
+1213239593449 Extract constant 'LABEL_RESOURCES'
+1213240835314 Rename field 'tasksCategory'
+1213241600882 Rename field 'resourcesCategory'
+1213241701045 Rename field 'repositoryMap'
+1213242540994 Extract local variable 'projectMapping'
+1213303049145 Change method 'select'
+1213303235332 Change method 'select'
+1213303467367 Rename method 'ignoreFilterText'
+1213334363718 Convert local variable 'cal' to field
+1213380679386 Rename type 'ShowMylynLegendAction'
+1213403946005 Rename method 'addUnmatchedCategories'
+1213434920538 Extract method 'extracted'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/27/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/27/refactorings.history
new file mode 100644
index 0000000..521a2ce
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/27/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationManager.java
- Assume clone() returns an instance of the receiver type
- Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskListNotificationManager.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1215137210093" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/27/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/27/refactorings.index
new file mode 100644
index 0000000..8eb6898
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/27/refactorings.index
@@ -0,0 +1 @@
+1215137210093 Infer generic type arguments
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/28/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/28/refactorings.history
new file mode 100644
index 0000000..72a0177
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/28/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void apply()' from 'org.eclipse.mylyn.tasks.ui.wizards.TaskAttachmentPage.getNextPage()' to 'org.eclipse.mylyn.tasks.ui.wizards.TaskAttachmentPage'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'apply'
- Destination type: 'org.eclipse.mylyn.tasks.ui.wizards.TaskAttachmentPage'
- Declared visibility: 'private'" comments="false" description="Extract method 'apply'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.wizards{TaskAttachmentPage.java" name="apply" replace="false" selection="7475 210" stamp="1215302480757" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void execute(ExecutionEvent event,Object item) throws ExecutionException ' from 'org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler.execute()' to 'org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'execute'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.commands.AbstractTaskHandler'
- Declared visibility: 'private'" comments="false" description="Extract method 'execute'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.commands{AbstractTaskHandler.java" name="execute" replace="false" selection="1345 178" stamp="1215312591556" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/28/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/28/refactorings.index
new file mode 100644
index 0000000..ade7e66
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/28/refactorings.index
@@ -0,0 +1,2 @@
+1215302480757 Extract method 'apply'
+1215312591556 Extract method 'execute'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/29/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/29/refactorings.history
new file mode 100644
index 0000000..4e7e7ac
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/29/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'activeWorkbenchWindow' from expression 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'activeWorkbenchWindow'
- Destination method: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openEditor()'
- Variable expression: 'PlatformUI.getWorkbench().getActiveWorkbenchWindow()'
- Replace occurrences of expression with variable" description="Extract local variable 'activeWorkbenchWindow'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java" name="activeWorkbenchWindow" replace="true" selection="7025 52" stamp="1216175156738" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/29/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/29/refactorings.index
new file mode 100644
index 0000000..cf1eb38
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/7/29/refactorings.index
@@ -0,0 +1 @@
+1216175156738 Extract local variable 'activeWorkbenchWindow'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/32/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/32/refactorings.history
new file mode 100644
index 0000000..0719b55
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/32/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private void installMenu(final SourceViewer viewer)' from 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit.adapt()' to 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'installMenu'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit'
- Declared visibility: 'private'" comments="false" description="Extract method 'installMenu'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AttributeEditorToolkit.java" name="installMenu" replace="false" selection="6791 67" stamp="1217731560895" version="1.0" visibility="2"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskEditorActino' to 'DeleteTaskEditorAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskEditorActino'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskEditorAction'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'DeleteTaskEditorActino'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{DeleteTaskEditorActino.java[DeleteTaskEditorActino" matchStrategy="1" name="DeleteTaskEditorAction" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1218132685637" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/32/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/32/refactorings.index
new file mode 100644
index 0000000..ecc802d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/32/refactorings.index
@@ -0,0 +1,2 @@
+1217731560895 Extract method 'installMenu'
+1218132685637 Rename type 'DeleteTaskEditorActino'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/33/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/33/refactorings.history
new file mode 100644
index 0000000..4b10e6c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/33/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Convert anonymous class 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setVisible().new Comparator() {...}' in 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setVisible()' to nested class
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage.setVisible().new Comparator() {...}'
- Class name: 'TaskRepositoryComparator'
- Declared visibility: 'private'
- Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylyn.internal.tasks.ui{TaskSearchPage.java" name="TaskRepositoryComparator" selection="13619 0" stamp="1218559445852" static="false" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/33/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/33/refactorings.index
new file mode 100644
index 0000000..a557d56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/8/33/refactorings.index
@@ -0,0 +1 @@
+1218559445852 Convert anonymous class to nested
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/36/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/36/refactorings.history
new file mode 100644
index 0000000..562bfa1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/36/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'LABEL_TUESDAY' from expression '"Tuesday"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_TUESDAY'
- Constant expression: '"Tuesday"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_TUESDAY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java" name="LABEL_TUESDAY" qualify="false" replace="true" selection="20817 9" stamp="1220460534146" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'LABEL_WEDNESDAY' from expression '"Wednesday"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_WEDNESDAY'
- Constant expression: '"Wednesday"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_WEDNESDAY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java" name="LABEL_WEDNESDAY" qualify="false" replace="true" selection="20914 11" stamp="1220460545191" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'LABEL_THURSDAY' from expression '"Thursday"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_THURSDAY'
- Constant expression: '"Thursday"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_THURSDAY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java" name="LABEL_THURSDAY" qualify="false" replace="true" selection="21017 10" stamp="1220460555211" version="1.0" visibility="2"/>
<refactoring comment="Extract constant 'LABEL_FRIDAY' from expression '"Friday"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_FRIDAY'
- Constant expression: '"Friday"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_FRIDAY'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.preferences{TasksUiPreferencePage.java" name="LABEL_FRIDAY" qualify="false" replace="true" selection="21117 8" stamp="1220460568203" version="1.0" visibility="2"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.MigrateNewTaskActivityHandles' to 'ChangeActivityHandleOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.MigrateNewTaskActivityHandles'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.ChangeActivityHandleOperation'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'MigrateNewTaskActivityHandles'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui{MigrateNewTaskActivityHandles.java[MigrateNewTaskActivityHandles" matchStrategy="1" name="ChangeActivityHandleOperation" qualified="false" references="true" similarDeclarations="false" stamp="1220464970755" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/36/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/36/refactorings.index
new file mode 100644
index 0000000..4c4538e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/36/refactorings.index
@@ -0,0 +1,5 @@
+1220460534146 Extract constant 'LABEL_TUESDAY'
+1220460545191 Extract constant 'LABEL_WEDNESDAY'
+1220460555211 Extract constant 'LABEL_THURSDAY'
+1220460568203 Extract constant 'LABEL_FRIDAY'
+1220464970755 Rename type 'MigrateNewTaskActivityHandles'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..880421e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.RepositoryReport.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{RepositoryReport.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221060870912" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ManageEditorsAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ManageEditorsAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221061364777" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: '.#DeleteAction.java.1.31'" description="Delete element" element1="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#DeleteAction.java.1.31" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1221062375423" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.CopyOfTaskListView.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{CopyOfTaskListView.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221168119253" subPackages="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175650859" target="/org.eclipse.mylyn/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175658272" target="/org.eclipse.mylyn-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175662654" target="/org.eclipse.mylyn-site/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175666136" target="/org.eclipse.mylyn-site/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175672495" target="/org.eclipse.mylyn.aspectj/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175678078" target="/org.eclipse.mylyn.bugzilla-feature/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175685141" target="/org.eclipse.mylyn.bugzilla.core/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175692852" target="/org.eclipse.mylyn.bugzilla.ide/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175699451" target="/org.eclipse.mylyn.bugzilla.tests/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175703350" target="/org.eclipse.mylyn.bugzilla.ui/.settings" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: '.settings'
- Original element: 'org.eclipse.jdt.ui.prefs'" description="Copy file" element1=".settings/org.eclipse.jdt.ui.prefs" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1221175708732" target="/org.eclipse.mylyn.commons.core/.settings" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..64614c9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1,15 @@
+1221060870912 Delete element
+1221061364777 Delete element
+1221062375423 Delete element
+1221168119253 Delete element
+1221175650859 Copy file
+1221175658272 Copy file
+1221175662654 Copy file
+1221175666136 Copy file
+1221175672495 Copy file
+1221175678078 Copy file
+1221175685141 Copy file
+1221175692852 Copy file
+1221175699451 Copy file
+1221175703350 Copy file
+1221175708732 Copy file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/39/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/39/refactorings.history
new file mode 100644
index 0000000..0ea0aad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/39/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskCompleteAction.java
 org.eclipse.mylyn.internal.tasks.ui.actions.MarkTaskIncompleteAction.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{MarkTaskCompleteAction.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.actions{MarkTaskIncompleteAction.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221969921403" subPackages="false" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.clearFilters(boolean preserveArchiveFilter)' to 'public void clearFilters()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.clearFilters(...)'
- Removed parameters:
 boolean preserveArchiveFilter" delegate="false" deprecate="true" description="Change method 'clearFilters'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView~clearFilters~Z" name="clearFilters" parameter1="boolean preserveArchiveFilter 0 {deleted} {deleted} true" stamp="1221976805070" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/39/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/39/refactorings.index
new file mode 100644
index 0000000..60dc719
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/39/refactorings.index
@@ -0,0 +1,2 @@
+1221969921403 Delete elements
+1221976805070 Change method 'clearFilters'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/40/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/40/refactorings.history
new file mode 100644
index 0000000..28808e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/40/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'protected AbstractRepositoryConnectorUi getConnectorUi(TaskRepository repository)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector.detectHyperlinks()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'getConnectorUi'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector'
- Declared visibility: 'protected'" comments="false" description="Extract method 'getConnectorUi'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskHyperlinkDetector.java" name="getConnectorUi" replace="false" selection="4033 59" stamp="1222733771383" version="1.0" visibility="4"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/40/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/40/refactorings.index
new file mode 100644
index 0000000..fb3da03
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2008/9/40/refactorings.index
@@ -0,0 +1 @@
+1222733771383 Extract method 'getConnectorUi'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/1/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/1/refactorings.history
new file mode 100644
index 0000000..b98abbd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/1/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataSources().storeFile' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataSources()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataSources().storeFile'" description="Inline local variable 'storeFile'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java" selection="31654 32" stamp="1230936119176" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/1/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/1/refactorings.index
new file mode 100644
index 0000000..8c85356
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/1/refactorings.index
@@ -0,0 +1 @@
+1230936119176 Inline local variable 'storeFile'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/2/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/2/refactorings.history
new file mode 100644
index 0000000..01680db
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/2/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataSources()' to 'initializeDataSources'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.loadDataSources()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.initializeDataSources()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'loadDataSources'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin~loadDataSources" name="initializeDataSources" references="true" stamp="1231085473263" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/2/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/2/refactorings.index
new file mode 100644
index 0000000..a6b2733
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/2/refactorings.index
@@ -0,0 +1 @@
+1231085473263 Rename method 'loadDataSources'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/4/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/4/refactorings.history
new file mode 100644
index 0000000..232f3dc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/4/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.SortyByDropDownAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{SortyByDropDownAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1232267642768" subPackages="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter.getTaskComparator()' to 'getComparator'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter.getTaskComparator()'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter.getComparator()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskComparator'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListTableSorter.java[TaskListTableSorter~getTaskComparator" name="getComparator" references="true" stamp="1232267754013" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter.getSortableFromElement(...)' to 'org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter.getSortableFromElement(...)'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator'" delegate="false" deprecate="true" description="Move member 'getSortableFromElement'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListTableSorter.java[TaskListTableSorter~getSortableFromElement~QIRepositoryElement;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskComparator.java[TaskComparator" stamp="1232268042715" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter' to 'TaskListViewerSorter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListTableSorter'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewerSorter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskListTableSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListTableSorter.java[TaskListTableSorter" matchStrategy="1" name="TaskListViewerSorter" qualified="false" references="true" similarDeclarations="false" stamp="1232268203893" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewerSorter' to 'TaskListSorter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListViewerSorter'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListSorter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskListViewerSorter'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListViewerSorter.java[TaskListViewerSorter" matchStrategy="1" name="TaskListSorter" qualified="false" references="true" similarDeclarations="false" stamp="1232268326733" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorterDescription' to 'SearchResultSorter'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorterDescription'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorter'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'SearchResultSorterDescription'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.search{SearchResultSorterDescription.java[SearchResultSorterDescription" matchStrategy="1" name="SearchResultSorter" qualified="false" references="true" similarDeclarations="false" stamp="1232268732300" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/4/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/4/refactorings.index
new file mode 100644
index 0000000..c31b9d7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/4/refactorings.index
@@ -0,0 +1,6 @@
+1232267642768 Delete element
+1232267754013 Rename method 'getTaskComparator'
+1232268042715 Move member 'getSortableFromElement'
+1232268203893 Rename type 'TaskListTableSorter'
+1232268326733 Rename type 'TaskListViewerSorter'
+1232268732300 Rename type 'SearchResultSorterDescription'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/5/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/5/refactorings.history
new file mode 100644
index 0000000..55237df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/5/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TaskTransfer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TaskTransfer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233206491298" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.QueryExportAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{QueryExportAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233210889491" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskImportAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskImportAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233210899590" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskExportAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskExportAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233210913620" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.QueryImportAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{QueryImportAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233210970772" subPackages="false" version="1.0"/>

<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskListElementImporter.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskListElementImporter.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233213919708" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation' to 'TaskDataSnapshotOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataSnapshotOperation'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TaskDataExportOperation'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportOperation.java[TaskDataExportOperation" matchStrategy="1" name="TaskDataSnapshotOperation" qualified="false" references="true" similarDeclarations="false" stamp="1233271233628" textual="false" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.util'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataSnapshotOperation.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.util" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataSnapshotOperation.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1233271281116" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataSnapshotOperation.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataSnapshotOperation.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1233271369065" subPackages="false" version="1.0"/>
<refactoring comment="Extract method 'private void exportChosen(IProgressMonitor monitor)' from 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.run()' to 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'exportChosen'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Declared visibility: 'private'" comments="false" description="Extract method 'exportChosen'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportOperation.java" name="exportChosen" replace="false" selection="4119 4737" stamp="1233271755850" version="1.0" visibility="2"/>
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.totalWork' in 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.totalWork'
- Getter method name: 'getTotalWork'
- Setter method name: 'setTotalWork'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'totalWork'" flags="589830" getter="getTotalWork" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportOperation.java[TaskDataExportOperation^totalWork" insertion="5" setter="setTotalWork" stamp="1233292540383" version="1.0" visibility="1"/>
<refactoring comment="Extract constant 'EXPORT_JOB_LABEL' from expression '"Task Data Export"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'EXPORT_JOB_LABEL'
- Constant expression: '"Task Data Export"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'EXPORT_JOB_LABEL'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportOperation.java" name="EXPORT_JOB_LABEL" qualify="false" replace="true" selection="4221 18" stamp="1233292644568" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/5/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/5/refactorings.index
new file mode 100644
index 0000000..0060ae0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/1/5/refactorings.index
@@ -0,0 +1,12 @@
+1233206491298 Delete element
+1233210889491 Delete element
+1233210899590 Delete element
+1233210913620 Delete element
+1233210970772 Delete element
+1233213919708 Delete element
+1233271233628 Rename type 'TaskDataExportOperation'
+1233271281116 Copy compilation unit
+1233271369065 Delete element
+1233271755850 Extract method 'exportChosen'
+1233292540383 Encapsulate field 'totalWork'
+1233292644568 Extract constant 'EXPORT_JOB_LABEL'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/6/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/6/refactorings.history
new file mode 100644
index 0000000..5312da3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/6/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.exportTaskContexts' in 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.exportTaskContexts'
- Getter method name: 'adsf'
- Setter method name: 'setExportTaskContexts'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'exportTaskContexts'" flags="589830" getter="adsf" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportOperation.java[TaskDataExportOperation^exportTaskContexts" insertion="2" setter="setExportTaskContexts" stamp="1234029685227" version="1.0" visibility="1"/>
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.isSnapshot' in 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation.isSnapshot'
- Getter method name: 'isSnapshot'
- Setter method name: 'setSnapshot'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'isSnapshot'" flags="589830" getter="isSnapshot" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskDataExportOperation.java[TaskDataExportOperation^isSnapshot" insertion="4" setter="setSnapshot" stamp="1234030502128" version="1.0" visibility="1"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/6/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/6/refactorings.index
new file mode 100644
index 0000000..b7fe8f7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/6/refactorings.index
@@ -0,0 +1,2 @@
+1234029685227 Encapsulate field 'exportTaskContexts'
+1234030502128 Encapsulate field 'isSnapshot'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/7/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/7/refactorings.history
new file mode 100644
index 0000000..fe05ef0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/7/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant 'ORG_ECLIPSE_MYLYN_TASKLIST_EXPORT_PAGE' from expression '"org.eclipse.mylyn.tasklist.exportPage"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'ORG_ECLIPSE_MYLYN_TASKLIST_EXPORT_PAGE'
- Constant expression: '"org.eclipse.mylyn.tasklist.exportPage"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'ORG_ECLIPSE_MYLYN_TASKLIST_EXPORT_PAGE'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{TaskDataExportWizardPage.java" name="ORG_ECLIPSE_MYLYN_TASKLIST_EXPORT_PAGE" qualify="false" replace="true" selection="1978 39" stamp="1234213826354" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'autoExpandTaskList' in 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin' to 'autoExpandTaskListMode'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.autoExpandTaskList'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.autoExpandTaskListMode'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'autoExpandTaskList'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiPlugin.java[TasksUiPlugin^autoExpandTaskList" name="autoExpandTaskListMode" references="true" setter="true" stamp="1234572178384" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/7/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/7/refactorings.index
new file mode 100644
index 0000000..b0e1d85
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/7/refactorings.index
@@ -0,0 +1,2 @@
+1234213826354 Extract constant 'ORG_ECLIPSE_MYLYN_TASKLIST_EXPORT_PAGE'
+1234572178384 Rename field 'autoExpandTaskList'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/8/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/8/refactorings.history
new file mode 100644
index 0000000..81f4f4c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/8/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction.addRepositoryToMenu(...)' to 'addRepositoryAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction.addRepositoryToMenu(...)'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction.addRepositoryAction(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'addRepositoryToMenu'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewTaskAction.java[NewTaskAction~addRepositoryToMenu~QTaskRepository;" name="addRepositoryAction" references="true" stamp="1234836376917" version="1.0"/>
<refactoring comment="Extract constant 'LABEL_NEW_TASK' from expression '"New Task"'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Constant name: 'LABEL_NEW_TASK'
- Constant expression: '"New Task"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant 'LABEL_NEW_TASK'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewTaskAction.java" name="LABEL_NEW_TASK" qualify="false" replace="true" selection="2210 10" stamp="1234844595768" version="1.0" visibility="2"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openNewTaskEditor(...)' to 'openNewTaskEditorWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openNewTaskEditor(...)'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openNewTaskEditorWizard(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'openNewTaskEditor'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openNewTaskEditor~QShell;~QIWizard;~QITaskMapping;" name="openNewTaskEditorWizard" references="true" stamp="1234846034866" version="1.0"/>
<refactoring comment="Extract method 'private void constructNewTaskData(final TaskData[] taskData,final ITaskMapping initializationData,final ITaskMapping selectionData)' from 'org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard.performFinish()' to 'org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'constructNewTaskData'
- Destination type: 'org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard'
- Declared visibility: 'private'" comments="false" description="Extract method 'constructNewTaskData'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.wizards{NewTaskWizard.java" name="constructNewTaskData" replace="false" selection="2916 993" stamp="1234846256298" version="1.0" visibility="2"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewQueryAction.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewQueryAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1235167186260" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewQueryMenuAction.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewQueryMenuAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1235168390092" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/8/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/8/refactorings.index
new file mode 100644
index 0000000..409b476
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/8/refactorings.index
@@ -0,0 +1,6 @@
+1234836376917 Rename method 'addRepositoryToMenu'
+1234844595768 Extract constant 'LABEL_NEW_TASK'
+1234846034866 Rename method 'openNewTaskEditor'
+1234846256298 Extract method 'constructNewTaskData'
+1235167186260 Copy compilation unit
+1235168390092 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/9/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/9/refactorings.history
new file mode 100644
index 0000000..45baf73
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/9/refactorings.history
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'gridLayout' from expression 'new GridLayout(2,false)'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'gridLayout'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationPopup.createContentArea()'
- Variable expression: 'new GridLayout(2,false)'
- Replace occurrences of expression with variable" description="Extract local variable 'gridLayout'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskListNotificationPopup.java" name="gridLayout" replace="true" selection="2585 24" stamp="1235681795379" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.internal.tasks.ui.actions'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.TaskEditorScheduleAction.java'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.ui.actions" element1="/src<org.eclipse.mylyn.tasks.ui.editors{TaskEditorScheduleAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1235687507250" units="1" version="1.0"/>

</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/9/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/9/refactorings.index
new file mode 100644
index 0000000..bb3d1c5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/2/9/refactorings.index
@@ -0,0 +1,2 @@
+1235681795379 Extract local variable 'gridLayout'
+1235687507250 Move compilation unit
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/10/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/10/refactorings.history
new file mode 100644
index 0000000..d733c78
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/10/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract local variable 'taskKey' from expression 'element1.getTaskKey()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskKey'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator.sortByID()'
- Variable expression: 'element1.getTaskKey()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskKey'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskComparator.java" name="taskKey" replace="true" selection="5407 21" stamp="1236029871204" version="1.0"/>
<refactoring comment="Extract local variable 'taskKey' from expression 'element2.getTaskKey()'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Variable name: 'taskKey'
- Destination method: 'org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator.sortByID()'
- Variable expression: 'element2.getTaskKey()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskKey'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{TaskComparator.java" name="taskKey" replace="true" selection="5452 21" stamp="1236029880618" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/10/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/10/refactorings.index
new file mode 100644
index 0000000..24b7bd5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/10/refactorings.index
@@ -0,0 +1,2 @@
+1236029871204 Extract local variable 'taskKey'
+1236029880618 Extract local variable 'taskKey'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/11/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/11/refactorings.history
new file mode 100644
index 0000000..3496ac2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/11/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void markForInclusion(Set<TaskRepository> includedRepositories,TaskRepository repository)' from 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction.addActionsToMenu()' to 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'markForInclusion'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'markForInclusion'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{NewTaskAction.java" name="markForInclusion" replace="true" selection="5919 402" stamp="1236709225850" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/11/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/11/refactorings.index
new file mode 100644
index 0000000..a02de77
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/11/refactorings.index
@@ -0,0 +1 @@
+1236709225850 Extract method 'markForInclusion'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/13/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/13/refactorings.history
new file mode 100644
index 0000000..128ceeb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorterId.java
 org.eclipse.mylyn.internal.tasks.ui.search.SearchResultSorterPriority.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.tasks.ui.search{SearchResultSorterId.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.search{SearchResultSorterPriority.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1238277505401" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/13/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/13/refactorings.index
new file mode 100644
index 0000000..a065924
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/3/13/refactorings.index
@@ -0,0 +1 @@
+1238277505401 Delete elements
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/16/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/16/refactorings.history
new file mode 100644
index 0000000..38eb47b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewer.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{RepositoryTextViewer.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1239671517304" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.PreviewAttributeEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{PreviewAttributeEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1239671577116" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/16/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/16/refactorings.index
new file mode 100644
index 0000000..ac0b64b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1239671517304 Delete element
+1239671577116 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/17/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/17/refactorings.history
new file mode 100644
index 0000000..81f6b06
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/17/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 2 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui.editor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui.editor'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.EditorBusyIndicator.java
 org.eclipse.mylyn.internal.tasks.ui.editors.IBusyEditor.java" description="Copy compilation units" destination="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui.editor" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorBusyIndicator.java" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{IBusyEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1240381185291" units="2" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Destination element: 'org.eclipse.mylyn.commons.ui/src/org.eclipse.mylyn.internal.provisional.commons.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.util.SelectionProviderAdapter.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{SelectionProviderAdapter.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1240383961521" units="1" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.ID' to 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListView.ID'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'" delegate="true" deprecate="true" description="Move member 'ID'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListView.java[TaskListView^ID" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1240384258614" version="1.0"/>
<refactoring comment="Rename field 'ID' in 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants' to 'ID_VIEW_TASK_LIST'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_VIEW_TASK_LIST'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Keep original element as deprecated delegate to refactored element" delegate="true" deprecate="true" description="Rename field 'ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^ID" name="ID_VIEW_TASK_LIST" references="true" setter="false" stamp="1240384377817" textual="false" version="1.0"/>

<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView.ID' to 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView.ID'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants'" delegate="true" deprecate="true" description="Move member 'ID'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskRepositoriesView.java[TaskRepositoriesView^ID" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants" stamp="1240384798264" version="1.0"/>
<refactoring comment="Rename field 'ID' in 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants' to 'ID_VIEW_TASK_REPOSITORIES'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_VIEW_TASK_REPOSITORIES'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'ID'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^ID" name="ID_VIEW_TASK_REPOSITORIES" references="true" setter="false" stamp="1240384824998" textual="false" version="1.0"/>
<refactoring comment="Move 3 members to 'org.eclipse.mylyn.internal.commons.ui.WorkbenchUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.getModalShellExcluding(...)
 org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.getNonModalShell()
 org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.getShell()
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.internal.commons.ui.WorkbenchUtil'" delegate="true" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal~getModalShellExcluding~QShell;" element2="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal~getNonModalShell" element3="/src<org.eclipse.mylyn.internal.tasks.ui.util{TasksUiInternal.java[TasksUiInternal~getShell" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.commons.ui{WorkbenchUtil.java[WorkbenchUtil" stamp="1240386257271" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/17/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/17/refactorings.index
new file mode 100644
index 0000000..5472e45
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/17/refactorings.index
@@ -0,0 +1,7 @@
+1240381185291 Copy compilation units
+1240383961521 Move compilation unit
+1240384258614 Move member 'ID'
+1240384377817 Rename field 'ID'
+1240384798264 Move member 'ID'
+1240384824998 Rename field 'ID'
+1240386257271 Move members
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/18/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/18/refactorings.history
new file mode 100644
index 0000000..ed91839
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.disableScrollingOnFocus(...)' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.disableScrollingOnFocus(...)'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil'" delegate="true" deprecate="true" description="Move member 'disableScrollingOnFocus'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~disableScrollingOnFocus~QScrolledForm;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFormUtil.java[CommonFormUtil" stamp="1241063496307" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.setMenu(...)' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.setMenu(...)'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil'" delegate="true" deprecate="true" description="Move member 'setMenu'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~setMenu~QComposite;~QMenu;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonUiUtil.java[CommonUiUtil" stamp="1241063541344" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.ensureVisible(...)' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.ensureVisible(...)'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil'" delegate="true" deprecate="true" description="Move member 'ensureVisible'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~ensureVisible~QControl;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFormUtil.java[CommonFormUtil" stamp="1241063563829" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.toggleExpandableComposite(...)' to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.toggleExpandableComposite(...)'
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil'" delegate="true" deprecate="true" description="Move member 'toggleExpandableComposite'" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~toggleExpandableComposite~Z~QExpandableComposite;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonFormUtil.java[CommonFormUtil" stamp="1241063595196" version="1.0"/>
<refactoring comment="Move 4 members to 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.setEnabledState(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.disable(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.enable(...)
 org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil.KEY_DISABLED
- Keep original element as deprecated delegate to refactored element
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil'" delegate="true" deprecate="true" description="Move members" element1="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~setEnabledState~QComposite;~Z" element2="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~disable~QComposite;" element3="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil~enable~QComposite;" element4="/src<org.eclipse.mylyn.internal.tasks.ui.editors{EditorUtil.java[EditorUtil^KEY_DISABLED" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui{CommonUiUtil.java[CommonUiUtil" stamp="1241063846379" version="1.0"/>
<refactoring comment="Extract method 'private void copyProperties(ITask newTask, ITask oldTask)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}.openNewTask()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'copyProperties'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'copyProperties'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="copyProperties" replace="false" selection="9590 1325" stamp="1241064884682" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void addTask(ITask newTask)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}.openNewTask()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'addTask'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'addTask'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="addTask" replace="false" selection="9259 298" stamp="1241064981180" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void closeAndOpen(ITask newTask, ITask oldTask)' from 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}.openNewTask()' to 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'closeAndOpen'
- Destination type: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.SubmitTaskJobListener.done().new Runnable() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'closeAndOpen'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java" name="closeAndOpen" replace="false" selection="9355 1158" stamp="1241065047340" version="1.0" visibility="2"/>
<refactoring comment="Extract method 'private void delete(ITask oldTask)' from 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator.closeAndOpen()' to 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'delete'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator'
- Declared visibility: 'private'" comments="false" description="Extract method 'delete'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskMigrator.java" name="delete" replace="false" selection="2955 425" stamp="1241065619318" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'deleteOldTask' in 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator' to 'delete'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator.deleteOldTask'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator.delete'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'deleteOldTask'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.editors{TaskMigrator.java[TaskMigrator^deleteOldTask" name="delete" references="true" setter="true" stamp="1241065809782" textual="false" version="1.0"/>
<refactoring comment="Rename field 'ID_VIEW_TASK_LIST' in 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants' to 'ID_VIEW_TASKS'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_VIEW_TASK_LIST'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_VIEW_TASKS'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_VIEW_TASK_LIST'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^ID_VIEW_TASK_LIST" name="ID_VIEW_TASKS" references="true" setter="true" stamp="1241113707747" textual="false" version="1.0"/>
<refactoring comment="Rename field 'ID_VIEW_TASK_REPOSITORIES' in 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants' to 'ID_VIEW_REPOSITORIES'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_VIEW_TASK_REPOSITORIES'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.ITasksUiConstants.ID_VIEW_REPOSITORIES'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'ID_VIEW_TASK_REPOSITORIES'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui{ITasksUiConstants.java[ITasksUiConstants^ID_VIEW_TASK_REPOSITORIES" name="ID_VIEW_REPOSITORIES" references="true" setter="true" stamp="1241113855486" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/18/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/18/refactorings.index
new file mode 100644
index 0000000..69ab0f8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/4/18/refactorings.index
@@ -0,0 +1,12 @@
+1241063496307 Move member 'disableScrollingOnFocus'
+1241063541344 Move member 'setMenu'
+1241063563829 Move member 'ensureVisible'
+1241063595196 Move member 'toggleExpandableComposite'
+1241063846379 Move members
+1241064884682 Extract method 'copyProperties'
+1241064981180 Extract method 'addTask'
+1241065047340 Extract method 'closeAndOpen'
+1241065619318 Extract method 'delete'
+1241065809782 Rename field 'deleteOldTask'
+1241113707747 Rename field 'ID_VIEW_TASK_LIST'
+1241113855486 Rename field 'ID_VIEW_TASK_REPOSITORIES'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/20/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/20/refactorings.history
new file mode 100644
index 0000000..9b847bb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/20/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskWizard' to 'NewTaskWizardInternal'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskWizard'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskWizardInternal'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'NewTaskWizard'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{NewTaskWizard.java[NewTaskWizard" matchStrategy="1" name="NewTaskWizardInternal" qualified="false" references="true" similarDeclarations="true" stamp="1242066811536" textual="false" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openUrl(...)' to 'org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.TasksUiUtil.openUrl(...)'
- Destination type: 'org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil'" delegate="false" deprecate="true" description="Move member 'openUrl'" element1="/src<org.eclipse.mylyn.tasks.ui{TasksUiUtil.java[TasksUiUtil~openUrl~QString;~I" flags="589830" id="org.eclipse.jdt.ui.move.static" input="=org.eclipse.mylyn.commons.ui/src<org.eclipse.mylyn.internal.provisional.commons.ui{WorkbenchUtil.java[WorkbenchUtil" stamp="1242255175735" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.TasksUiMessages.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui{TasksUiMessages.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1242255393332" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'SelectRepositoryConnectorPage_downloadLink' in 'org.eclipse.mylyn.internal.tasks.ui.wizards.Messages' to 'SelectRepositoryConnectorPage_activateDiscovery'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.Messages.SelectRepositoryConnectorPage_downloadLink'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.wizards.Messages.SelectRepositoryConnectorPage_activateDiscovery'
- Update references to refactored element
- Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'SelectRepositoryConnectorPage_downloadLink'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.wizards{Messages.java[Messages^SelectRepositoryConnectorPage_downloadLink" name="SelectRepositoryConnectorPage_activateDiscovery" references="true" setter="false" stamp="1242272905900" textual="true" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/20/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/20/refactorings.index
new file mode 100644
index 0000000..73499cf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/20/refactorings.index
@@ -0,0 +1,4 @@
+1242066811536 Rename type 'NewTaskWizard'
+1242255175735 Move member 'openUrl'
+1242255393332 Delete element
+1242272905900 Rename field 'SelectRepositoryConnectorPage_downloadLink'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/21/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/21/refactorings.history
new file mode 100644
index 0000000..426e6c4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationQueryIncoming.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.tasks.ui.notifications{TaskListNotificationQueryIncoming.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1243100594137" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/21/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/21/refactorings.index
new file mode 100644
index 0000000..4a8e09d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/21/refactorings.index
@@ -0,0 +1 @@
+1243100594137 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/22/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/22/refactorings.history
new file mode 100644
index 0000000..89513f4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/22/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void addLowEnergyTasks(List<ITask> potentialTasks)' from 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandomOption.createAdditionalButtons().new SelectionListener() {...}.widgetSelected()' to 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandomOption.createAdditionalButtons().new SelectionListener() {...}'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'addLowEnergyTasks'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandomOption.createAdditionalButtons().new SelectionListener() {...}'
- Declared visibility: 'private'" comments="false" description="Extract method 'addLowEnergyTasks'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskSelectionDialogWithRandomOption.java" name="addLowEnergyTasks" replace="false" selection="2556 390" stamp="1243451881926" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandomOption' to 'TaskSelectionDialogWithRandom'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandomOption'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'TaskSelectionDialogWithRandomOption'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskSelectionDialogWithRandomOption.java[TaskSelectionDialogWithRandomOption" matchStrategy="1" name="TaskSelectionDialogWithRandom" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1243452411083" textual="false" version="1.0"/>
+<refactoring comment="Rename field 'allTasks' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom.createAdditionalButtons(...).new SelectionListener() {...}' to 'selectedTasks'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom.createAdditionalButtons(...).new SelectionListener() {...}.allTasks'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom.createAdditionalButtons(...).new SelectionListener() {...}.selectedTasks'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'allTasks'" flags="851970" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskSelectionDialogWithRandom.java[TaskSelectionDialogWithRandom~createAdditionalButtons~QComposite;[^allTasks" name="selectedTasks" references="true" setter="true" stamp="1243452649153" textual="false" version="1.0"/>
+<refactoring comment="Rename local variable 'dlg' in 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction.run(...)' to 'dialog'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction.run(IAction).dlg'
- Renamed element: 'dlg'
- Update references to refactored element" description="Rename local variable 'dlg'" id="org.eclipse.jdt.ui.rename.local.variable" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{ActivateTaskDialogAction.java[ActivateTaskDialogAction~run~QIAction;@dlg!1427!1515!1457!1459!QTaskSelectionDialogWithRandom;" name="dialog" references="true" stamp="1243453876095" version="1.0"/>
+<refactoring comment="Rename field 'activate' in 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom' to 'activateTask'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom.activate'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.actions.TaskSelectionDialogWithRandom.activateTask'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'activate'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{TaskSelectionDialogWithRandom.java[TaskSelectionDialogWithRandom^activate" name="activateTask" references="true" setter="true" stamp="1243453894188" textual="false" version="1.0"/>
+<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction.PresentationSelectionAction' in 'org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction' to top level type
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction.PresentationSelectionAction'
- Field name: 'presentationDropDownSelectionAction'
- Parameter name: 'presentationDropDownSelectionAction'
- Declare field 'final'" description="Convert member type 'PresentationSelectionAction' to top level" field="true" fieldName="presentationDropDownSelectionAction" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.tasks.ui.actions{PresentationDropDownSelectionAction.java[PresentationDropDownSelectionAction[PresentationSelectionAction" mandatory="true" parameterName="presentationDropDownSelectionAction" possible="true" stamp="1243570737652" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/22/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/22/refactorings.index
new file mode 100644
index 0000000..5ed097f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/5/22/refactorings.index
@@ -0,0 +1,6 @@
+1243451881926 Extract method 'addLowEnergyTasks'
+1243452411083 Rename type 'TaskSelectionDialogWithRandomOption'
+1243452649153 Rename field 'allTasks'
+1243453876095 Rename local variable 'dlg'
+1243453894188 Rename field 'activate'
+1243570737652 Convert member type 'PresentationSelectionAction' to top level
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/23/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/23/refactorings.history
new file mode 100644
index 0000000..0636e64
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract method 'private static boolean extracted()' from 'org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil.getTreeItemSquish()' to 'org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'extracted'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil'
- Declared visibility: 'private'" comments="false" description="Extract method 'extracted'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui.util{PlatformUtil.java" name="extracted" replace="false" selection="3188 71" stamp="1243905877601" version="1.0" visibility="2"/>
<refactoring comment="Rename field 'needsSubmitButton' in 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage' to 'needsSubmit'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.needsSubmitButton'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.needsSubmit'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename setter method for field" delegate="false" deprecate="true" description="Rename field 'needsSubmitButton'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage^needsSubmitButton" name="needsSubmit" references="true" setter="true" stamp="1243912040755" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.needsSubmitButton()' to 'needsSubmit'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.needsSubmitButton()'
- Renamed element: 'org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage.needsSubmit()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'needsSubmitButton'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.tasks.ui.editors{AbstractTaskEditorPage.java[AbstractTaskEditorPage~needsSubmitButton" name="needsSubmit" references="true" stamp="1243912060494" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/23/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/23/refactorings.index
new file mode 100644
index 0000000..ecbb4f3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/23/refactorings.index
@@ -0,0 +1,3 @@
+1243905877601 Extract method 'extracted'
+1243912040755 Rename field 'needsSubmitButton'
+1243912060494 Rename method 'needsSubmitButton'
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/24/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/24/refactorings.history
new file mode 100644
index 0000000..a361285
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'TaskAttachmentPage.java.rej'" description="Delete element" element1="src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1244863294157" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/24/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/24/refactorings.index
new file mode 100644
index 0000000..f70fe9d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/24/refactorings.index
@@ -0,0 +1 @@
+1244863294157 Delete element
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/25/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/25/refactorings.history
new file mode 100644
index 0000000..48e584f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/25/refactorings.history
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'titleText' in 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip' to 'titleColor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip.titleText'
- Renamed element: 'org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip.titleColor'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'titleText'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.tasks.ui.views{TaskListToolTip.java[TaskListToolTip^titleText" name="titleColor" references="true" setter="true" stamp="1245173686687" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 47 element(s) from project 'org.eclipse.mylyn.tasks.ui'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original elements:
 .#AbstractTaskRepositoryAction.java.1.5
 .#ActivateTaskHistoryDropDownAction.java.1.6
 .#AddRepositoryTaskAction.java.1.10
 .#AttachAction.java.1.2
 .#ClearOutgoingAction.java.1.10
 .#CloneTaskAction.java.1.8
 .#CollapseAllAction.java.1.5
 .#CompareAttachmentsAction.java.1.1
 .#CopyAttachmentToClipboardJob.java.1.11
 .#CopyTaskDetailsAction.java.1.24
 .#DeleteAction.java.1.19
 .#EditRepositoryPropertiesAction.java.1.13
 .#ExpandAllAction.java.1.5
 .#FilterArchiveContainerAction.java.1.9
 .#GroupSubTasksAction.java.1.2
 .#LinkWithEditorAction.java.1.3
 .#MarkTaskCompleteAction.java.1.17
 .#MarkTaskIncompleteAction.java.1.17
 .#MarkTaskReadAction.java.1.13
 .#MarkTaskUnreadAction.java.1.15
 .#NewCategoryAction.java.1.10
 .#NewQueryAction.java.1.11
 .#NewSubTaskAction.java.1.4
 .#NewTaskAction.java.1.19
 .#NewTaskFromSelectionAction.java.1.3
 .#OpenTaskListElementAction.java.1.11
 .#OpenWithBrowserAction.java.1.18
 .#PresentationDropDownSelectionAction.java.1.11
 .#QueryCloneAction.java.1.2
 .#QueryExportAction.java.1.2
 .#QueryImportAction.java.1.3
 .#RemoveFromCategoryAction.java.1.21
 .#RenameAction.java.1.9
 .#RestoreTaskListAction.java.1.9
 .#SearchForRepositoryTask.java.1.1
 .#ShowTooltipAction.java.1.2
 .#SynchronizeEditorAction.java.1.12
 .#SynchronizeSelectedAction.java.1.22
 .#TaskDeactivateAction.java.1.14
 .#TaskExportAction.java.1.3
 .#TaskImportAction.java.1.2
 .#TaskNavigateDropDownAction.java.1.21
 .#TaskSelectionDialog.java.1.27
 .#TaskWorkingSetAction.java.1.15
 .#ToggleAllWorkingSetsAction.java.1.3
 .#ToggleTaskActivationAction.java.1.1
 .#ToggleWorkingSetAction.java.1.3" description="Delete elements" element1="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#FilterArchiveContainerAction.java.1.9" element10="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#CloneTaskAction.java.1.8" element11="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ToggleTaskActivationAction.java.1.1" element12="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#NewQueryAction.java.1.11" element13="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#TaskSelectionDialog.java.1.27" element14="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ClearOutgoingAction.java.1.10" element15="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#TaskWorkingSetAction.java.1.15" element16="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#TaskDeactivateAction.java.1.14" element17="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#TaskExportAction.java.1.3" element18="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ExpandAllAction.java.1.5" element19="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#CompareAttachmentsAction.java.1.1" element2="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#NewSubTaskAction.java.1.4" element20="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#RemoveFromCategoryAction.java.1.21" element21="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#SynchronizeEditorAction.java.1.12" element22="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#NewTaskFromSelectionAction.java.1.3" element23="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#RenameAction.java.1.9" element24="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#AbstractTaskRepositoryAction.java.1.5" element25="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#MarkTaskReadAction.java.1.13" element26="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ActivateTaskHistoryDropDownAction.java.1.6" element27="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#MarkTaskUnreadAction.java.1.15" element28="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#MarkTaskCompleteAction.java.1.17" element29="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#QueryExportAction.java.1.2" element3="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#NewCategoryAction.java.1.10" element30="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#QueryImportAction.java.1.3" element31="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#EditRepositoryPropertiesAction.java.1.13" element32="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ToggleWorkingSetAction.java.1.3" element33="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#LinkWithEditorAction.java.1.3" element34="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#SynchronizeSelectedAction.java.1.22" element35="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#RestoreTaskListAction.java.1.9" element36="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#AttachAction.java.1.2" element37="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#MarkTaskIncompleteAction.java.1.17" element38="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#PresentationDropDownSelectionAction.java.1.11" element39="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#AddRepositoryTaskAction.java.1.10" element4="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#TaskNavigateDropDownAction.java.1.21" element40="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#OpenWithBrowserAction.java.1.18" element41="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#TaskImportAction.java.1.2" element42="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#CopyTaskDetailsAction.java.1.24" element43="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#OpenTaskListElementAction.java.1.11" element44="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#SearchForRepositoryTask.java.1.1" element45="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#DeleteAction.java.1.19" element46="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#NewTaskAction.java.1.19" element47="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#QueryCloneAction.java.1.2" element5="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ToggleAllWorkingSetsAction.java.1.3" element6="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#CollapseAllAction.java.1.5" element7="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#ShowTooltipAction.java.1.2" element8="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#GroupSubTasksAction.java.1.2" element9="src/org/eclipse/mylyn/internal/tasks/ui/actions/.#CopyAttachmentToClipboardJob.java.1.11" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="47" stamp="1245192072300" subPackages="false" version="1.0"/>

</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/25/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/25/refactorings.index
new file mode 100644
index 0000000..645f0b9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1245173686687 Rename field 'titleText'
+1245192072300 Delete elements
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/7/30/refactorings.history b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/7/30/refactorings.history
new file mode 100644
index 0000000..88b6d46
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/7/30/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Encapsulate field 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.scheduleAction' in 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Original element: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.scheduleAction'
- Getter method name: 'getScheduleAction'
- Setter method name: 'setScheduleAction'
- Field visibility: 'public'
- Use getter and setter methods in declaring type" comments="false" declaring="true" description="Encapsulate field 'scheduleAction'" flags="589830" getter="getScheduleAction" id="org.eclipse.jdt.ui.self.encapsulate" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java[ScheduleTaskMenuContributor^scheduleAction" insertion="6" setter="setScheduleAction" stamp="1248386298056" version="1.0" visibility="1"/>

<refactoring comment="Extract method 'private boolean isThisWeek(WeekDateRange week)' from 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor.getSubMenuManager()' to 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Original project: 'org.eclipse.mylyn.tasks.ui'
- Method name: 'isThisWeek'
- Destination type: 'org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor'
- Declared visibility: 'private'" comments="false" description="Extract method 'isThisWeek'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.tasks.ui{ScheduleTaskMenuContributor.java" name="isThisWeek" replace="false" selection="4428 220" stamp="1248387321659" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/.refactorings/2009/7/30/refactorings.index b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/7/30/refactorings.index
new file mode 100644
index 0000000..e0549ad
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.refactorings/2009/7/30/refactorings.index
@@ -0,0 +1,2 @@
+1248386298056 Encapsulate field 'scheduleAction'
+1248387321659 Extract method 'isThisWeek'
diff --git a/org.eclipse.mylyn.tasks.ui/.settings/.api_filters b/org.eclipse.mylyn.tasks.ui/.settings/.api_filters
new file mode 100644
index 0000000..c9239bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/.api_filters
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.mylyn.tasks.ui" version="2">
+ <resource path="src/org/eclipse/mylyn/internal/tasks/ui/TaskJobFactory.java" type="org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory">
+ <filter id="571519004">
+ <message_arguments>
+ <message_argument value="org.eclipse.mylyn.internal.tasks.ui.TaskJobFactory.createUpdateRepositoryConfigurationJob(AbstractRepositoryConnector, TaskRepository)"/>
+ <message_argument value="TaskJob"/>
+ </message_arguments>
+ </filter>
+ </resource>
+ <resource path="src/org/eclipse/mylyn/internal/tasks/ui/dialogs/AbstractWorkingSetDialogCOPY.java" type="org.eclipse.mylyn.internal.tasks.ui.dialogs.AbstractWorkingSetDialogCOPY">
+ <filter id="574619656">
+ <message_arguments>
+ <message_argument value="IWorkingSetSelectionDialog"/>
+ <message_argument value="AbstractWorkingSetDialogCOPY"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..88ef1a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Sat Jun 27 14:22:12 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..6721cae
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,50 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.tasks.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.compare,
+ org.eclipse.core.runtime,
+ org.eclipse.core.expressions,
+ org.eclipse.core.net,
+ org.eclipse.core.resources,
+ org.eclipse.jface.text,
+ org.eclipse.search,
+ org.eclipse.ui.browser,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.forms,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.views,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
+ org.apache.commons.logging;bundle-version="1.0.4"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: %Bundle-Vendor
+Export-Package: org.eclipse.mylyn.internal.provisional.tasks.ui.wizards;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.actions;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.commands;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.dialogs;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.editors;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.notifications;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.preferences;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.properties;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.search;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.util;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.views;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.wizards;x-internal:=true,
+ org.eclipse.mylyn.internal.tasks.ui.workingsets;x-internal:=true,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.tasks.ui.editors,
+ org.eclipse.mylyn.tasks.ui.wizards
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
+Import-Package: com.ibm.icu.text
diff --git a/org.eclipse.mylyn.tasks.ui/about.html b/org.eclipse.mylyn.tasks.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/build.properties b/org.eclipse.mylyn.tasks.ui/build.properties
new file mode 100644
index 0000000..fe213a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = about.html,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ doc/,\
+ META-INF/,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
+jre.compilation.profile = J2SE-1.5
+source.. = src/
diff --git a/org.eclipse.mylyn.tasks.ui/doc/book.css b/org.eclipse.mylyn.tasks.ui/doc/book.css
new file mode 100644
index 0000000..faa4199
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/doc/book.css
@@ -0,0 +1 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.tasks.ui/doc/bugzilla.html b/org.eclipse.mylyn.tasks.ui/doc/bugzilla.html
new file mode 100644
index 0000000..a4b06dd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/doc/bugzilla.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+ <link rel="stylesheet" href="book.css" charset="ISO-8859-1" type="text/css">
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <meta http-equiv="Content-Style-Type" content="text/css">
+ <title>
+ Preparing Eclipse
+ </title>
+ </head>
+ <body>
+ <h2>
+ Bugzilla Client Integration</h2>
+ Bug reports can be opened with either the Bug Editor or the Internal
+ Web Browser. This can be set as a Task List preferences.
+ When the Bug Editor is open you can click the hyperlink to show the
+ report in the browser (e.g. to use a feature not yet available in
+ the editor, such as voting). <p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/bugzilla-internal-browser.gif" width="344" height="157"></p>All bug reports are archived
+ in a special category that is invisible by default. But if a
+ you do a search, and the matches don't show in another category
+ (e.g. because no query matches that report), the archive category,
+ highlighted in blue below, gives access to that report.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasks-archive.gif" width="331" height="187"><p>If a bug report has information on it that has not been viewed, such
+ as new comments, the blue "incoming" overlay is displayed. If
+ a bug has changes on it that have been saved but have not been
+ committed to Bugzilla, the gray "outgoing" overlay is displayed.
+ A red overlay appears if there is a conflict.</p>
+ <p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/bugzilla-synch.gif" width="323" height="186"></p>To create a custom Bugzilla query paste the query URL into the New
+ Bugzilla Query dialog. This enables support of queries that can not
+ be configured via the dialog, and as such some query hits may not
+ open or format properly.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/bugzilla-query-custom.gif" width="483" height="106"></p>
+
+ You can explicitly state
+ whether you want to work with cached copies of Bugzilla reports and
+ avoid refresh with the server. In offline mode the cached bug
+ copy is always used. In online mode the Bugzilla server is
+ always checked for the latest report.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasks-offline.gif" width="326" height="207">
+
+ </body>
+</html>
+
diff --git a/org.eclipse.mylyn.tasks.ui/doc/images/tasklist-overview.gif b/org.eclipse.mylyn.tasks.ui/doc/images/tasklist-overview.gif
new file mode 100644
index 0000000..6cd4960
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/doc/images/tasklist-overview.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/doc/planning.html b/org.eclipse.mylyn.tasks.ui/doc/planning.html
new file mode 100644
index 0000000..134f9ec
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/doc/planning.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+ <link rel="stylesheet" href="book.css" charset="ISO-8859-1" type="text/css">
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <meta http-equiv="Content-Style-Type" content="text/css">
+ <title>
+ Preparing Eclipse
+ </title>
+ </head>
+ <body>
+ <h2>
+ Task Planning</h2>Set a reminder for a task when creating it, or by selecting the
+ "Summary" tab of the Task Editor. When you start using Eclipse
+ on the given day the reminders will come up.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasks-reminders.gif" width="452" height="154">
+
+ </body>
+</html>
+
diff --git a/org.eclipse.mylyn.tasks.ui/doc/tasklist.html b/org.eclipse.mylyn.tasks.ui/doc/tasklist.html
new file mode 100644
index 0000000..97eabee
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/doc/tasklist.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
+ <link rel="stylesheet" href="book.css" charset="ISO-8859-1" type="text/css">
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+ <meta http-equiv="Content-Style-Type" content="text/css">
+ <title>
+ Preparing Eclipse
+ </title>
+ </head>
+ <body>
+ <h1>
+ Mylar Task List</h1>
+ <br>
+ <table border="0" cellpadding="0" style="border-collapse: collapse"id="table1">
+ <tr>
+ <td valign="top">
+ The Mylar Task List provides methods for creating and maintaining tasks
+ and bug reports. In the order that they appear on the toolbar, the
+ Task List provides the following features work managing task and bug
+ reports:<ul>
+ <li>Create task - add new task to Task List</li>
+ <li>Create category - organize tasks and bug reports into groups</li>
+ <li>Add or create new bugzilla report - add a bug report into Task List</li>
+ <li>Add bugzilla query - creates a category that contains all bugzilla
+ <br>
+ reports that match the query</li>
+ <li>Refresh - refresh all bug reports and bugzilla queries</li>
+ <li>Filter tasks - set filters for Task List</li>
+ </ul>
+ <p> </td>
+ <td valign="top">
+ <img border="0" src="images/tasklist-overview.gif" width="378" height="287"></td>
+ </tr>
+ </table>
+ <h3>Tasks</h3>
+ <p>A task can be created with a description and a priority level. The
+ priority level can be varied from P1 through P5 which is used for sorting
+ and filtering the Task List. A task can be set to complete by right clicking
+ and selecting "Mark Complete". The completed tasks appear in the
+ Task List
+ with light gray font to distinguish it from incomplete tasks. More detailed
+ information such as notes and related links can be added to the task by
+ double clicking on the task, which will open an editor. A task can be
+ activated by selecting the glasses icon in the first column, which will
+ initiate the monitoring feature of mylar to store the task context. The
+ active task and its category will appear in bold on the task list. The
+ context stored for each task can be cleared by right clicking the task and
+ selecting "Clear Task Context".</p>
+ <h3>Categories</h3>
+ <p>A category can be created to organize the Task List. If a category is
+ selected during task creation, the task will be added to that category. The
+ drag and drop feature of the Task List allows tasks and bug reports to be
+ moved from one category to another.</p>
+ <h3>Bugzilla Reports</h3>
+ <p>Bugzilla reports can be added to the Task List via two methods. An
+ existing bug report can be downloaded from a bugzilla server or a new bug
+ report can be created on a bugzilla server. The Task List shows the same
+ details for the bug report as it does with tasks, but the icons are
+ different. When the bug report is double clicked, the bug report will be
+ opened by a bugzilla editor or an internal browser, which can be toggled in
+ the preferences. A bugzilla report can be activated in the same manner as
+ tasks.</p>
+ <h3>Bugzilla Query</h3>
+ <p>A bugzilla query is a category that is made up of all bug reports that
+ match a specified query. When it is created, the user is presented with a
+ dialog that presents query options similar to the search page on the
+ bugzilla server. All hits form the query are added to the query and can be
+ used like standard bug reports.</p>
+ <h3>Filters</h3>
+ <p>Filters are available to manage the Task List. There are two filters, one
+ for filtering completed tasks, and one for filtering based on priorities.</p>
+
+<table cellpadding="10" cellspacing="0" width="600" id="table3">
+ <tr>
+ <td width="30%" valign="top" align="left">
+ <p align="right"><b>Focus on a single task category</b></p>
+ </td>
+ <td width="70%" valign="top">
+ <span style="background-color: #FFFFFF">To see only the tasks for a single category
+ select the "Go Into Category" action from the context menu. To
+ go back to viewing all tasks and categories under the root use the
+ "Go Up To Root" action in the Task List's toolbar pull down menu
+ (visible above).</span><p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasks-go-navigation.gif" width="284" height="74"></p>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" width="600" id="table5">
+ <tr>
+ <td>
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" width="600" id="table4">
+ <tr>
+ <td width="30%" valign="top" align="left">
+ <p align="right"><b>Task history navigation</b></p>
+ </td>
+ <td width="70%" valign="top">
+ Navigate between previously
+ activate tasks using the Task List view's pull down menu (upper
+ right-hand corner of the toolbar).<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasks-history.gif"></p>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+<table cellpadding="10" cellspacing="0" width="600" id="table6">
+ <tr>
+ <td width="30%" valign="top" align="left">
+ <p align="right"><b>Quick filter</b></p>
+ </td>
+ <td width="70%" valign="top">
+ To filter task by name or
+ regexp type the filter text into the field and all matched tasks
+ will display. Note that this will temporarily suppress all
+ other filters. To clear the query press the "x" button to the
+ right of the text field.<p>
+ <img border="0" src="../../org.eclipse.mylar.doc/doc/images/0.3/tasks-quick-filter.gif" width="315" height="173"></p>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr>
+ </td>
+ </tr>
+</table>
+
+ </body>
+</html>
+
diff --git a/org.eclipse.mylyn.tasks.ui/doc/toc.xml b/org.eclipse.mylyn.tasks.ui/doc/toc.xml
new file mode 100644
index 0000000..6e92f0f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/doc/toc.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS TYPE="org.eclipse.help.toc"?>
+
+<toc link_to="../org.eclipse.mylyn.doc/doc/toc.xml#tasklist" label="Task List">
+ <topic label="Task List" href="doc/tasklist.html">
+ <!--
+ <topic label="Task Planning" href="doc/planning.html"/>
+ <topic label="Bugzilla Integration" href="doc/bugzilla.html"/>
+ -->
+ </topic>
+</toc>
+
+
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/bug-search.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/bug-search.gif
new file mode 100644
index 0000000..b706063
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/bug-search.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/filter-archive.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/filter-archive.gif
new file mode 100644
index 0000000..8a1fd47
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/filter-archive.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/find.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/find.gif
new file mode 100644
index 0000000..2b645a8
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/find.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-due.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-due.gif
new file mode 100644
index 0000000..8ec39c9
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-due.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-offline.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-offline.gif
new file mode 100644
index 0000000..8770690
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-offline.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-repository-context.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-repository-context.gif
new file mode 100644
index 0000000..9e878c2
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-repository-context.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-repository.gif
new file mode 100644
index 0000000..1db6015
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-repository.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-web.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-web.gif
new file mode 100644
index 0000000..b168c1c
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/overlay-web.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/task-activity.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/task-activity.gif
new file mode 100644
index 0000000..44ed28d
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/task-activity.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/task-bug.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/task-bug.gif
new file mode 100644
index 0000000..99e9e98
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/task-bug.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/task-items.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/task-items.gif
new file mode 100644
index 0000000..946c6e6
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/task-items.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/task-repository-completed.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/task-repository-completed.gif
new file mode 100644
index 0000000..c67f347
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/task-repository-completed.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/task-repository-notes.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/task-repository-notes.gif
new file mode 100644
index 0000000..77b1121
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/task-repository-notes.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/archive/task-server.gif b/org.eclipse.mylyn.tasks.ui/icons/archive/task-server.gif
new file mode 100644
index 0000000..71b1bab
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/archive/task-server.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/elcl16/bug-search.gif b/org.eclipse.mylyn.tasks.ui/icons/elcl16/bug-search.gif
new file mode 100644
index 0000000..b706063
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/elcl16/bug-search.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool12/reply.gif b/org.eclipse.mylyn.tasks.ui/icons/etool12/reply.gif
new file mode 100644
index 0000000..4f8d77d
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool12/reply.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool12/repository-synchronize-small.png b/org.eclipse.mylyn.tasks.ui/icons/etool12/repository-synchronize-small.png
new file mode 100644
index 0000000..358a472
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool12/repository-synchronize-small.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool12/task-narrow.gif b/org.eclipse.mylyn.tasks.ui/icons/etool12/task-narrow.gif
new file mode 100644
index 0000000..03b9e28
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool12/task-narrow.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/bug-report.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/bug-report.gif
new file mode 100644
index 0000000..54525a7
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/bug-report.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/calendar.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/calendar.gif
new file mode 100644
index 0000000..4126b3c
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/calendar.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/capture-pause.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/capture-pause.gif
new file mode 100644
index 0000000..98e7743
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/capture-pause.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/category-archive.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/category-archive.gif
new file mode 100644
index 0000000..36c1f65
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/category-archive.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/category-new.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/category-new.gif
new file mode 100644
index 0000000..d3f43d9
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/category-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/category.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/category.gif
new file mode 100644
index 0000000..7efb86e
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/category.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/comment.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/comment.gif
new file mode 100644
index 0000000..fc30ce1
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/comment.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/compare.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/compare.png
new file mode 100644
index 0000000..0cc6d5f
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/compare.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/context-add.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-add.gif
new file mode 100644
index 0000000..030eade
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-add.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/context-attach.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-attach.gif
new file mode 100644
index 0000000..bee8fc5
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-attach.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/context-clear.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-clear.gif
new file mode 100644
index 0000000..cbb71be
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-clear.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/context-retrieve.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-retrieve.gif
new file mode 100644
index 0000000..02a46c8
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-retrieve.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/context-transfer.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-transfer.gif
new file mode 100644
index 0000000..0a97a2d
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/context-transfer.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/export.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/export.gif
new file mode 100644
index 0000000..b229231
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/export.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/icons-legend.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/icons-legend.gif
new file mode 100644
index 0000000..f40ce6b
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/icons-legend.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/import.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/import.gif
new file mode 100644
index 0000000..652ca6e
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/import.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-next.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-next.gif
new file mode 100644
index 0000000..8933a21
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-next.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous-active.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous-active.gif
new file mode 100644
index 0000000..21f4ef5
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous-active.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous-pause.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous-pause.gif
new file mode 100644
index 0000000..a8259c4
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous-pause.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous.gif
new file mode 100644
index 0000000..cf81b05
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/navigate-previous.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/open-repository-task.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/open-repository-task.gif
new file mode 100644
index 0000000..79b22b7
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/open-repository-task.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/open-task.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/open-task.gif
new file mode 100644
index 0000000..29d4888
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/open-task.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/person.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/person.gif
new file mode 100644
index 0000000..dc5a1af
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/person.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/presentation-categorized.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/presentation-categorized.png
new file mode 100644
index 0000000..41fc67e
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/presentation-categorized.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/presentation-scheduled.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/presentation-scheduled.png
new file mode 100644
index 0000000..a7a2f86
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/presentation-scheduled.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/query-new.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/query-new.gif
new file mode 100644
index 0000000..09fcaca
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/query-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/query-unmatched.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/query-unmatched.png
new file mode 100644
index 0000000..941bd3f
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/query-unmatched.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/query.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/query.gif
new file mode 100644
index 0000000..94e7d5d
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/query.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/reply.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/reply.gif
new file mode 100644
index 0000000..4d1ec94
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/reply.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-new.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-new.gif
new file mode 100644
index 0000000..b4832fc
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-submit.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-submit.gif
new file mode 100644
index 0000000..3c33c5f
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-submit.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize-attributes.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize-attributes.png
new file mode 100644
index 0000000..195659f
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize-attributes.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize.gif
new file mode 100644
index 0000000..bb8538b
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/repository-synchronize.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/sub-task-new.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/sub-task-new.gif
new file mode 100644
index 0000000..ec27050
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/sub-task-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-active-centered.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-active-centered.gif
new file mode 100644
index 0000000..eb74b26
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-active-centered.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-active.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-active.gif
new file mode 100644
index 0000000..ca4bf9d
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-active.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-complete.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-complete.gif
new file mode 100644
index 0000000..9cacb96
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-complete.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-completed.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-completed.gif
new file mode 100644
index 0000000..ec07a10
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-completed.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-context.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-context.gif
new file mode 100644
index 0000000..407dc54
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-context.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-inactive-centered.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-inactive-centered.gif
new file mode 100644
index 0000000..979ec18
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-inactive-centered.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-inactive.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-inactive.gif
new file mode 100644
index 0000000..b55c1f5
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-inactive.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-incomplete.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-incomplete.gif
new file mode 100644
index 0000000..f6b9f8a
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-incomplete.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-new.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-new.gif
new file mode 100644
index 0000000..e2cde50
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif
new file mode 100644
index 0000000..fd01f49
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-notes.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-remote.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-remote.gif
new file mode 100644
index 0000000..b06d686
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-remote.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-history.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-history.gif
new file mode 100644
index 0000000..829d079
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-history.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-new.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-new.gif
new file mode 100644
index 0000000..5f33961
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository-new.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository.gif
new file mode 100644
index 0000000..1dcbaaf
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-repository.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task-retrieve.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-retrieve.gif
new file mode 100644
index 0000000..ddfa476
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task-retrieve.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/task.gif b/org.eclipse.mylyn.tasks.ui/icons/etool16/task.gif
new file mode 100644
index 0000000..a36803a
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/task.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/tasklist-export.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/tasklist-export.png
new file mode 100644
index 0000000..21094d9
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/tasklist-export.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/etool16/tasklist-import.png b/org.eclipse.mylyn.tasks.ui/icons/etool16/tasklist-import.png
new file mode 100644
index 0000000..3a7ad36
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/etool16/tasklist-import.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/focus.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/focus.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/focus.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-due.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-due.gif
new file mode 100644
index 0000000..8ec39c9
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/overlay-due.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/perspective-planning.png b/org.eclipse.mylyn.tasks.ui/icons/eview16/perspective-planning.png
new file mode 100644
index 0000000..e868d6a
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/perspective-planning.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories-blue.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories-blue.gif
new file mode 100644
index 0000000..4ecfd38
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories-blue.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories.gif
new file mode 100644
index 0000000..a076324
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/repositories.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/repository-middle.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/repository-middle.gif
new file mode 100644
index 0000000..ae98299
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/repository-middle.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/repository.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/repository.gif
new file mode 100644
index 0000000..81a3e03
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/repository.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/task-list.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-list.gif
new file mode 100644
index 0000000..6ab2668
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-list.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/eview16/task-search.gif b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-search.gif
new file mode 100644
index 0000000..caa4b85
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/eview16/task-search.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/obj16/attachment-patch.gif b/org.eclipse.mylyn.tasks.ui/icons/obj16/attachment-patch.gif
new file mode 100644
index 0000000..c0e069d
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/obj16/attachment-patch.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/obj16/repository-small-top.gif b/org.eclipse.mylyn.tasks.ui/icons/obj16/repository-small-top.gif
new file mode 100644
index 0000000..43cb48f
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/obj16/repository-small-top.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/obj16/repository-small.gif b/org.eclipse.mylyn.tasks.ui/icons/obj16/repository-small.gif
new file mode 100644
index 0000000..ceb1f98
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/obj16/repository-small.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/obj16/resource_obj.gif b/org.eclipse.mylyn.tasks.ui/icons/obj16/resource_obj.gif
new file mode 100644
index 0000000..442d6d1
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/obj16/resource_obj.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/obj16/workingSet.gif b/org.eclipse.mylyn.tasks.ui/icons/obj16/workingSet.gif
new file mode 100644
index 0000000..19f0486
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/obj16/workingSet.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/ovr16/overlay-local.gif b/org.eclipse.mylyn.tasks.ui/icons/ovr16/overlay-local.gif
new file mode 100644
index 0000000..5494ff7
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/ovr16/overlay-local.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository-context.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository-context.gif
new file mode 100644
index 0000000..f916a95
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository-context.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository-settings.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository-settings.gif
new file mode 100644
index 0000000..5b43097
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository-settings.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif
new file mode 100644
index 0000000..08e472a
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/wizban/banner-repository.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/bug-wizard.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/bug-wizard.gif
new file mode 100644
index 0000000..ec6d66c
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/wizban/bug-wizard.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/secur_role_wiz.gif b/org.eclipse.mylyn.tasks.ui/icons/wizban/secur_role_wiz.gif
new file mode 100644
index 0000000..e05db64
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/wizban/secur_role_wiz.gif differ
diff --git a/org.eclipse.mylyn.tasks.ui/icons/wizban/workset_wiz.png b/org.eclipse.mylyn.tasks.ui/icons/wizban/workset_wiz.png
new file mode 100644
index 0000000..b720214
Binary files /dev/null and b/org.eclipse.mylyn.tasks.ui/icons/wizban/workset_wiz.png differ
diff --git a/org.eclipse.mylyn.tasks.ui/plugin.properties b/org.eclipse.mylyn.tasks.ui/plugin.properties
new file mode 100644
index 0000000..81f0acc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/plugin.properties
@@ -0,0 +1,194 @@
+#Properties file for org.eclipse.mylyn.tasks.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Tasks UI
+
+duplicateDetectors.name = Stack Trace
+repositorySearchPage.name = Task Search Page
+ProjectPropertiesLinkProvider.name = Default Repository Link
+
+local.repository.name = Local Task Repository
+LocalRepositoryConnector.name = Local Repository Connector
+LocalRepositoryConnectorUi.name = Local Repository UI
+
+CategorizedPresentation.name = Categorized
+ScheduledPresentation.name = Scheduled
+
+views.category.name = Tasks
+TaskListView.name = Task List
+TaskRepositoriesView.name = Task Repositories
+
+newWizards.category.name = Tasks
+NewLocalCategoryWizard.name = Category
+NewTaskWizard.name = Task
+NewQueryWizard.name = Query
+
+import.category.name = Tasks
+TaskDataImportWizard.name = Task List and Contexts
+TaskDataImportWizard.description = Import Task List data, useful for migrating workspaces.
+
+export.category.name = Tasks
+TaskDataExportWizard.name = Task List and Contexts
+TaskDataExportWizard.description = Export all Task List data, useful for migrating workspaces.
+
+TaskLabelDecorator.label = Task Decorator
+TaskLabelDecorator.description = Overlays information such as due date notifications
+
+TaskEditor.name = Task Editor
+CategoryEditor.name = Category Editor
+
+SynchronizeAllAction.label = Synchronize Changed
+SynchronizeAllAction.tooltip = Synchronize Changed
+RestoreTaskListAction.label = Restore Tasks from History...
+ShowTaskRepositoriesViewAction.label = Show Task Repositories View
+ShowTaskRepositoriesViewAction.tooltip = Show Task Repositories View
+OpenTaskSearchAction.label = Search Repository...
+NewTaskAction.label = New Task
+NewTaskAction.tooltip = New Task
+ShowTasksUiLegendAction.label = Show UI Legend
+ShowTasksUiLegendAction.tooltip = Show Tasks UI Legend
+SynchronizeSelectedAction.label = Synchronize
+SynchronizeSelectedAction.tooltip = Synchronize with Repository
+QueryCloneAction.label = Clone Query...
+QueryCloneAction.tooltip = Clone Repository Query
+CloneTaskAction.label = Clone Task...
+CloneTaskAction.tooltip = Clone Task
+RestoreTaskListAction.label = Restore Tasks from History...
+ExportAction.label = Export...
+ExportAction.tooltip = Export Tasks and Queries
+ImportAction.label = Import...
+ImportAction.tooltip = Import Tasks and Queries
+NewTaskAction.local.label = Local Task
+NewTaskAction.local.tooltip = New Task
+NewTaskAction.label = Task...
+NewTaskAction.tooltip = New Task
+NewQueryAction.label = Query...
+NewQueryAction.tooltip = New Query
+NewSubTaskAction.label = Subtask
+NewSubTaskAction.tooltip = New Subtask
+
+menu.new.label = New
+menu.operations.label = Import and Export
+
+NewCategoryAction.label = Category
+NewCategoryAction.tooltip = New Category
+RefreshRepositoryTasksAction.label = Synchronize All Tasks
+RefreshRepositoryTasksAction.tooltip = Synchronize All Tasks
+OpenRepositoryTask.label = Open &Repository Task...
+OpenRepositoryTask.tooltip = Open Repository Task
+NewQueryAction.skipFirstPage.label = New Query...
+NewQueryAction.skipFirstPage.tooltip = New Query
+NewTaskAction.skipFirstPage.label = New Task...
+NewTaskAction.skipFirstPage.tooltip = New Task
+CompareAttachmentsAction.label = Compare
+CompareAttachmentsAction.tooltip = Compare attachments
+
+keywords.label = mylyn tasks
+preferencePages.name = Tasks
+themeElementCategory.label = Tasks
+
+colors.foreground.today.scheduled.label = Tasks - Scheduled for Today
+colors.foreground.today.scheduled.description = Text color for tasks scheduled for today.
+colors.foreground.past.scheduled.label = Tasks - Past Scheduled Date
+colors.foreground.past.scheduled.description = Text color for tasks past their scheduled date.
+colors.foreground.past.due.label = Tasks - Past Due Date
+colors.foreground.past.due.description = Text color tasks past their due date.
+colors.foreground.thisweek.scheduled.label = Tasks - Scheduled for This Week
+colors.foreground.thisweek.scheduled.description = Text color for tasks scheduled for this week
+colors.foreground.today.completed.label = Tasks - Completed Today
+colors.foreground.today.completed.description = Text color for tasks completed today.
+colors.foreground.completed.label = Tasks - Completed
+colors.foreground.completed.description = Text color for completed tasks.
+colors.incoming.background.label = Task Editor - Incoming Changes
+colors.incoming.background.description = Background color of attributes with incoming changes.
+colors.category.gradient.start.label = Task List - Category Gradient Top
+colors.category.gradient.start.description = Background start color for Task List category gradients.
+colors.category.gradient.end.label = Task List - Category Gradient Bottom
+colors.category.gradient.end.description = Background end color for Task List category gradients.
+
+fonts.task.editor.comment.label = Task Editor - Notes and Comments
+fonts.task.editor.comment.description = Text font used for task editor text areas.
+
+PlanningPerspectiveFactory.name = Planning
+actionSet.navigation.label = Task Navigation
+
+DeactivateAllTasksAction.label = &Deactivate Task
+ActivateTaskDialogAction.label = &Activate Task...
+OpenTaskAction.label = Open Tas&k...
+OpenTaskAction.tooltip = Open Task
+SearchForRepositoryTask.label = Search for Repository Task...
+SearchForRepositoryTask.tooltip = Search for Repository Task
+command.previousTask.name = Previous Task Command
+
+actionSet.navigation.additions.label = Task Navigation Extras
+ActivateTaskHistoryDropDownAction.label = Activate Previous Task
+ActivateTaskHistoryDropDownAction.tooltip = Activate Previous Task
+OpenRepositoryTask.label = Open &Repository Task...
+OpenRepositoryTask.tooltip = Open Repository Task
+
+ommand.openTask.name = Open Task
+command.searchForTask.name = Search Repository for Task
+command.openRemoteTask.name = Open Remote Task
+command.activateTask.name = Activate Task
+command.deactivateAllTasks.name = Deactivate Task
+
+TaskSearchPage.label = Task Search
+ProjectTaskRepositoryPage.name = Task Repository
+
+commands.category.repositories.name = Task Repositories
+command.addTaskRepository.name = Add Task Repository...
+command.addTaskRepository.commandParameter.name = Repository Type
+
+TaskHyperlinkDetector.name = Tasks
+TaskUrlHyperlinkDetector.name = Task URLs
+TaskUrlHyperlinkDetector.description = Task URL hyperlink detector
+
+TaskWorkingSetElementAdapter.name = Tasks and Resources
+
+hyperlinkDetectorTargets.name = Task Editor
+
+command.goToPreviousUnread.name = Go To Previous Unread Task
+command.goToNextUnread.name = Go To Next Unread Task
+command.showToolTip.name = Show Tooltip Description
+command.markTaskRead.name = Mark Task Read
+command.markTaskUnread.name = Mark Task Unread
+command.markTaskReadGoToNextUnread.name = Mark Task Read and Go To Next Unread Task
+command.markTaskReadGoToPreviousUnread.name = Mark Task Read and Go To Previous Unread Task
+command.markTaskComplete.name = Mark Task Complete
+command.markTaskIncomplete.name = Mark Task Incomplete
+command.task.clearOutgoing.name = Clear Outgoing Changes
+command.new.subtask.name = New Subtask
+command.new.local.task.name = New Local Task
+
+commands.category.name = Task
+command.openSelectedTask.name = Open Selected Task
+command.attachment.openInBrowser.name = Open Attachment in Browser
+
+commands.category.editor.name = Task Editor
+command.attachment.openInDefaultEditor.name = Open Attachment in Default Editor
+command.submitTask.name = Submit Task
+command.submitTask.description = Submits the currently open task
+
+context.views.tasks.name = In Tasks View
+filters.tasks.name = Task List Elements (Recommended)
+filters.tasks.description = Hides Task List Elements from Common Navigators
+
+command.attachment.openInBrowser.label = Open With Browser
+command.attachment.openInDefaultEditor.menu.label = Open With
+command.attachment.openInDefaultEditor.label = Default Editor
+
+menu.task.mark.label = &Mark as
+command.markTaskRead.label = Read
+command.markTaskUnread.label = Unread
+command.task.clearOutgoing.label = Clear Outgoing
+command.markTaskComplete.label = Complete
+command.markTaskIncomplete.label = Incomplete
+command.goToPreviousUnread.label = Previous Unread Task
+command.goToNextUnread.label = Next Unread Task
+
+tasks.bugs.errorReporter.label = Report Error as Bug
+
+command.maximizePart.name = Maximize Part
+command.maximizePart.description = Maximize Part
+commands.ViewSourceHandler.name = View Unformatted Text
+
+context.editors.task.name = In Tasks Editor
diff --git a/org.eclipse.mylyn.tasks.ui/plugin.xml b/org.eclipse.mylyn.tasks.ui/plugin.xml
new file mode 100644
index 0000000..58c2d5f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/plugin.xml
@@ -0,0 +1,1932 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="actions" name="Tasklist Actions" schema="schema/actions.exsd"/>
+ <extension-point id="repositories" name="Task Repositories" schema="schema/repositories.exsd"/>
+ <extension-point id="editors" name="Task Editors" schema="schema/editors.exsd"/>
+ <extension-point id="projectLinkProviders" name="Linking Provider from Project to the Task Repository" schema="schema/projectLinkProviders.exsd"/>
+ <extension-point id="duplicateDetectors" name="duplicateDetectors" schema="schema/duplicateDetectors.exsd"/>
+ <extension-point id="presentations" name="presentations" schema="schema/presentations.exsd"/>
+ <extension-point id="taskEditorExtensions" name="Task Editor Extension" schema="schema/taskEditorExtensions.exsd"/>
+ <extension-point id="taskRepositoryPageContribution" name="Task Repository Page Contribution" schema="schema/taskRepositoryPageContribution.exsd"/>
+ <extension-point id="taskEditorPageContribution" name="Task Editor Page Contribution" schema="schema/taskEditorPageContribution.exsd"/>
+
+ <extension
+ point="org.eclipse.mylyn.context.core.bridges">
+ <!--
+ <contextStore
+ class="org.eclipse.mylyn.internal.tasks.ui.LocalContextStore">
+ </contextStore>
+ -->
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.duplicateDetectors">
+ <detector
+ class="org.eclipse.mylyn.internal.tasks.ui.search.StackTraceDuplicateDetector"
+ name="%duplicateDetectors.name">
+ </detector>
+ </extension>
+
+ <extension point="org.eclipse.ui.views">
+ <category name="%views.category.name" id="org.eclipse.mylyn.ui"/>
+ <view
+ allowMultiple="true"
+ category="org.eclipse.mylyn.ui"
+ class="org.eclipse.mylyn.internal.tasks.ui.views.TaskListView"
+ icon="icons/eview16/task-list.gif"
+ id="org.eclipse.mylyn.tasks.ui.views.tasks"
+ name="%TaskListView.name"/>
+ <view
+ id="org.eclipse.mylyn.tasks.ui.views.repositories"
+ allowMultiple="false"
+ category="org.eclipse.mylyn.ui"
+ class="org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView"
+ icon="icons/eview16/repositories.gif"
+ name="%TaskRepositoriesView.name">
+ </view>
+ </extension>
+
+ <extension point="org.eclipse.ui.newWizards">
+ <category name="%newWizards.category.name" id="org.eclipse.mylyn.ui.wizards.new"/>
+ </extension>
+
+ <extension
+ name="Task List Startup (required)"
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin$TasksUiStartup">
+ </startup>
+ </extension>
+
+ <!--
+ <extension
+ id="org.eclipse.mylyn.helpDocs"
+ name="Mylyn Help"
+ point="org.eclipse.help.toc">
+ <toc
+ file="doc/toc.xml"
+ primary="false">
+ </toc>
+ </extension>
+ -->
+ <extension
+ point="org.eclipse.ui.elementFactories">
+ <factory
+ class="org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorInputFactory"
+ id="org.eclipse.mylyn.tasks.ui.elementFactories.task.editor">
+ </factory>
+ </extension>
+ <extension point="org.eclipse.ui.newWizards">
+ <!--<wizard
+ canFinishEarly="true"
+ category="org.eclipse.mylyn.wizards"
+ class="org.eclipse.mylyn.internal.tasks.ui.wizards.NewLocalTaskWizard"
+ hasPages="false"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.task"
+ name="Task"/> -->
+ <wizard
+ canFinishEarly="true"
+ category="org.eclipse.mylyn.ui.wizards.new"
+ class="org.eclipse.mylyn.internal.tasks.ui.wizards.NewLocalCategoryWizard"
+ hasPages="false"
+ icon="icons/etool16/category-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.category"
+ name="%NewLocalCategoryWizard.name">
+ </wizard>
+ <wizard
+ category="org.eclipse.mylyn.ui.wizards.new"
+ class="org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskWizardInternal"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.repository.task"
+ name="%NewTaskWizard.name"/>
+ <wizard
+ category="org.eclipse.mylyn.ui.wizards.new"
+ class="org.eclipse.mylyn.internal.tasks.ui.wizards.NewQueryWizard"
+ icon="icons/etool16/query-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.query"
+ name="%NewQueryWizard.name"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.importWizards">
+ <wizard
+ category="org.eclipse.mylyn.tasks.ui.wizards.import.category"
+ class="org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizard"
+ icon="icons/etool16/tasklist-import.png"
+ id="org.eclipse.mylyn.tasks.ui.wizards.import"
+ name="%TaskDataImportWizard.name">
+ <description>
+ %TaskDataImportWizard.description
+ </description>
+ </wizard>
+ <category
+ id="org.eclipse.mylyn.tasks.ui.wizards.import.category"
+ name="%import.category.name"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.exportWizards">
+ <wizard
+ category="org.eclipse.mylyn.tasks.ui.wizards.export.category"
+ class="org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataExportWizard"
+ icon="icons/etool16/tasklist-export.png"
+ id="org.eclipse.mylyn.tasks.ui.wizards.export"
+ name="%TaskDataExportWizard.name">
+ <description>
+ %TaskDataExportWizard.description
+ </description>
+ </wizard>
+ <category
+ id="org.eclipse.mylyn.tasks.ui.wizards.export.category"
+ name="%export.category.name"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.decorators">
+ <decorator
+ class="org.eclipse.mylyn.internal.tasks.ui.TaskLabelDecorator"
+ id="org.eclipse.mylyn.tasks.ui.decorators.task"
+ label="%TaskLabelDecorator.label"
+ lightweight="true"
+ state="true">
+ <description>
+ %TaskLabelDecorator.description
+ </description>
+ <enablement>
+ <or>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.mylyn.tasks.core.TaskRepository">
+ </objectClass>
+ </or>
+ </enablement>
+ </decorator>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.editors">
+ <editor
+ class="org.eclipse.mylyn.tasks.ui.editors.TaskEditor"
+ contributorClass="org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor"
+ icon="icons/etool16/task.gif"
+ id="org.eclipse.mylyn.tasks.ui.editors.task"
+ name="%TaskEditor.name"/>
+ <editor
+ icon="icons/etool16/task.gif"
+ class="org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor"
+ name="%CategoryEditor.name"
+ id="org.eclipse.mylyn.tasks.ui.editors.category"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.perspectiveExtensions">
+ <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
+ <viewShortcut id="org.eclipse.mylyn.tasks.ui.views.tasks"/>
+ <view
+ closeable="true"
+ id="org.eclipse.mylyn.tasks.ui.views.tasks"
+ minimized="false"
+ moveable="true"
+ ratio="0.5"
+ relationship="top"
+ relative="org.eclipse.ui.views.ContentOutline"
+ visible="true"/>
+ <newWizardShortcut
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.repository.task">
+ </newWizardShortcut>
+ </perspectiveExtension>
+ <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaBrowsingPerspective">
+ <viewShortcut id="org.eclipse.mylyn.tasks.ui.views.tasks"/>
+ </perspectiveExtension>
+ <perspectiveExtension
+ targetID="org.eclipse.ui.resourcePerspective">
+ <viewShortcut id="org.eclipse.mylyn.tasks.ui.views.tasks"/>
+ <view
+ closeable="true"
+ id="org.eclipse.mylyn.tasks.ui.views.tasks"
+ minimized="false"
+ relationship="stack"
+ relative="org.eclipse.ui.views.ContentOutline">
+ </view>
+ <newWizardShortcut
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.repository.task">
+ </newWizardShortcut>
+ </perspectiveExtension>
+ <perspectiveExtension
+ targetID="org.eclipse.mylyn.tasks.ui.perspectives.planning">
+ <newWizardShortcut
+ id="org.eclipse.mylyn.tasks.ui.wizards.new.repository.task">
+ </newWizardShortcut>
+ <viewShortcut
+ id="org.eclipse.mylyn.tasks.ui.views.repositories">
+ </viewShortcut>
+ </perspectiveExtension>
+
+ <perspectiveExtension targetID="org.eclipse.team.cvs.ui.cvsPerspective">
+ <view
+ id="org.eclipse.mylyn.tasks.ui.views.repositories"
+ minimized="false"
+ ratio="0.7"
+ relationship="bottom"
+ relative="org.eclipse.team.ccvs.ui.RepositoriesView"
+ visible="true"/>
+ <viewShortcut id="org.eclipse.mylyn.tasks.ui.views.repositories"/>
+ </perspectiveExtension>
+
+ <perspectiveExtension targetID="org.eclipse.team.ui.TeamSynchronizingPerspective">
+ <view
+ id="org.eclipse.mylyn.tasks.ui.views.repositories"
+ minimized="false"
+ ratio="0.7"
+ relationship="bottom"
+ relative="org.eclipse.team.sync.views.SynchronizeView"
+ visible="true"/>
+ <viewShortcut id="org.eclipse.mylyn.tasks.ui.views.repositories"/>
+ </perspectiveExtension>
+ </extension>
+
+ <extension point="org.eclipse.ui.viewActions">
+ <viewContribution
+ id="org.eclipse.mylyn.tasks.ui.actions.view"
+ targetID="org.eclipse.mylyn.tasks.ui.views.tasks">
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeAllAction"
+ enablesFor="*"
+ icon="icons/etool16/repository-synchronize.gif"
+ id="org.eclipse.mylyn.tasks.ui.synchronize.changed"
+ label="%SynchronizeAllAction.label"
+ menubarPath="tasks"
+ toolbarPath="new"
+ tooltip="%SynchronizeAllAction.tooltip">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.RestoreTaskListAction"
+ icon="icons/etool16/import.gif"
+ id="org.eclipse.mylyn.tasks.ui.tasks.restore"
+ label="%RestoreTaskListAction.label"
+ menubarPath="tasks"
+ style="push">
+ </action>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.ShowTaskRepositoriesViewAction"
+ enablesFor="*"
+ icon="icons/eview16/repositories.gif"
+ id="org.eclipse.mylyn.tasks.ui.open.repositories.view"
+ label="%ShowTaskRepositoriesViewAction.label"
+ menubarPath="tasks"
+ tooltip="%ShowTaskRepositoriesViewAction.tooltip">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskSearchAction"
+ icon="icons/eview16/task-search.gif"
+ id="org.eclipse.mylyn.tasks.ui.search.open"
+ label="%OpenTaskSearchAction.label"
+ menubarPath="tasks">
+ </action>
+
+ <!-- <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction"
+ enablesFor="*"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.new.repository.task"
+ label="%NewTaskAction.label"
+ style="push"
+ toolbarPath="new"
+ tooltip="%NewTaskAction.tooltip">
+ </action>-->
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction"
+ icon="icons/etool16/icons-legend.gif"
+ id="org.eclipse.mylyn.doc.legend.show.action"
+ label="%ShowTasksUiLegendAction.label"
+ menubarPath="additions"
+ style="push"
+ tooltip="%ShowTasksUiLegendAction.tooltip">
+ </action>
+ <!--<action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewLocalTaskAction"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.new.task"
+ label="Task"
+ style="push"
+ toolbarPath="new"
+ tooltip="New Task">
+ </action> -->
+ <!--
+ <action
+ class="org.eclipse.mylyn.internal.tasklist.ui.actions.CopyDetailsAction"
+ id="org.eclipse.mylyn.tasklist.copy.details"
+ label="Copy Details"
+ style="push"/>
+ -->
+ </viewContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.popupMenus">
+
+ <viewerContribution
+ id="org.eclipse.mylyn.tasklist.ui.viewerContribution"
+ targetID="org.eclipse.mylyn.tasks.ui.views.tasks">
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeSelectedAction"
+ definitionId="org.eclipse.ui.file.refresh"
+ enablesFor="*"
+ icon="icons/etool16/repository-synchronize.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.synchronize.selected"
+ label="%SynchronizeSelectedAction.label"
+ menubarPath="repository"
+ tooltip="%SynchronizeSelectedAction.tooltip">
+ <enablement>
+ <and>
+ <not>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.LocalTask">
+ </objectClass>
+ </not>
+ <or>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.RepositoryQuery">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.AbstractTask">
+ </objectClass>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer">
+ </objectClass>
+ </or>
+ </and>
+ </enablement>
+ </action>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.QueryCloneAction"
+ enablesFor="org.eclipse.mylyn.internal.tasks.core.RepositoryQuery"
+ icon="icons/etool16/query-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.clone.query"
+ label="%QueryCloneAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/clone"
+ tooltip="%QueryCloneAction.tooltip">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.CloneTaskAction"
+ enablesFor="1"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.task.query"
+ label="%CloneTaskAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/clone"
+ tooltip="%CloneTaskAction.tooltip">
+ <enablement>
+<!-- <and> -->
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.AbstractTask">
+ </objectClass>
+<!--
+ <not>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.LocalTask">
+ </objectClass>
+ </not>
+ </and>
+-->
+ </enablement>
+ </action>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.RestoreTaskListAction"
+ icon="icons/etool16/import.gif"
+ id="org.eclipse.mylyn.tasks.ui.tasks.restore"
+ label="%RestoreTaskListAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.operations/restore"
+ style="push">
+ </action>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.ExportAction"
+ enablesFor="+"
+ icon="icons/etool16/export.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.export"
+ label="%ExportAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.operations/importexport"
+ tooltip="%ExportAction.tooltip">
+ </action>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.ImportAction"
+ enablesFor="*"
+ icon="icons/etool16/import.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.import"
+ label="%ImportAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.operations/importexport"
+ tooltip="%ImportAction.tooltip">
+ </action>
+
+
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction:local"
+ enablesFor="*"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.new.local.task"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.new.local.task"
+ label="%NewTaskAction.local.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/local"
+ tooltip="%NewTaskAction.local.tooltip"/>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction"
+ enablesFor="*"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.new.repository.task"
+ label="%NewTaskAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/repository"
+ tooltip="%NewTaskAction.tooltip"/>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewQueryAction"
+ enablesFor="*"
+ icon="icons/etool16/query-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.new.query"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/repository"
+ label="%NewQueryAction.label"
+ style="push"
+ tooltip="%NewQueryAction.tooltip">
+ </action>
+
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.new.subtask"
+ enablesFor="1"
+ icon="icons/etool16/sub-task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.new.subtask"
+ label="%NewSubTaskAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/afterRepository"
+ tooltip="%NewSubTaskAction.tooltip">
+ <enablement>
+ <objectClass
+ name="org.eclipse.mylyn.internal.tasks.core.AbstractTask">
+ </objectClass>
+ </enablement>
+ </action>
+
+ <menu
+ id="org.eclipse.mylyn.tasks.ui.menu.new"
+ label="%menu.new.label"
+ path="new">
+ <separator
+ name="repository">
+ </separator>
+ <groupMarker
+ name="afterRepository">
+ </groupMarker>
+ <separator
+ name="clone">
+ </separator>
+ <separator
+ name="local">
+ </separator>
+
+ </menu>
+
+ <menu
+ id="org.eclipse.mylyn.tasks.ui.menu.operations"
+ label="%menu.operations.label"
+ path="operations">
+ <separator
+ name="clone">
+ </separator>
+ <separator
+ name="import">
+ </separator>
+ <separator
+ name="export">
+ </separator>
+ </menu>
+
+
+ <!--<action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewLocalTaskAction"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.new.task"
+ label="Task"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/local"
+ style="push"
+ tooltip="New Task">
+ </action>-->
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewCategoryAction"
+ icon="icons/etool16/category-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.actions.new.category"
+ label="%NewCategoryAction.label"
+ menubarPath="org.eclipse.mylyn.tasks.ui.menu.new/local"
+ tooltip="%NewCategoryAction.tooltip">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ id="org.eclipse.mylyn.tasks.ui.viewerContribution"
+ targetID="org.eclipse.mylyn.tasks.ui.views.repositories">
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.RefreshRepositoryTasksAction"
+ icon="icons/etool16/repository-synchronize.gif"
+ id="org.eclipse.mylyn.tasks.ui.open.task.remote"
+ label="%RefreshRepositoryTasksAction.label"
+ menubarPath="repository"
+ style="push"
+ tooltip="%RefreshRepositoryTasksAction.tooltip">
+ <enablement>
+ <and>
+ <objectState name="offline" value="false"/>
+ <objectState name="hasRepository" value="true"/>
+ </and>
+ </enablement>
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTaskAction"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.openRemoteTask"
+ icon="icons/etool16/open-repository-task.gif"
+ id="org.eclipse.mylyn.tasks.ui.open.task.remote"
+ label="%OpenRepositoryTask.label"
+ menubarPath="repository"
+ style="push"
+ tooltip="%OpenRepositoryTask.tooltip">
+ <enablement>
+ <and>
+ <objectState name="offline" value="false"/>
+ <objectState name="hasRepository" value="true"/>
+ </and>
+ </enablement>
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewQueryAction:skipFirstPage"
+ enablesFor="*"
+ icon="icons/etool16/query-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.new.query"
+ label="%NewQueryAction.skipFirstPage.label"
+ menubarPath="repository"
+ style="push"
+ tooltip="%NewQueryAction.skipFirstPage.tooltip">
+ <enablement>
+ <and>
+ <objectState name="offline" value="false"/>
+ <objectState name="supportQuery" value="true"/>
+ </and>
+ </enablement>
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction:skipFirstPage"
+ enablesFor="*"
+ icon="icons/etool16/task-new.gif"
+ id="org.eclipse.mylyn.tasks.ui.new.repository.task"
+ label="%NewTaskAction.skipFirstPage.label"
+ menubarPath="repository"
+ tooltip="%NewTaskAction.skipFirstPage.tooltip">
+ <enablement>
+ <and>
+ <objectState name="offline" value="false"/>
+ <objectState name="supportNewTask" value="true"/>
+ </and>
+ </enablement>
+ </action>
+ </viewerContribution>
+
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.tasks.ui.contribution.attachment.compare"
+ objectClass="org.eclipse.mylyn.tasks.core.ITaskAttachment">
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.CompareAttachmentsAction"
+ enablesFor="2"
+ icon="icons/etool16/compare.png"
+ id="org.eclipse.mylyn.tasks.ui.action.attachment.compare"
+ label="%CompareAttachmentsAction.label"
+ menubarPath="actions"
+ tooltip="%CompareAttachmentsAction.tooltip"/>
+ </objectContribution>
+
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.keywords">
+ <keyword
+ label="%keywords.label"
+ id="org.eclipse.mylyn.tasks.ui.keywords"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ name="%preferencePages.name"
+ class="org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage"
+ id="org.eclipse.mylyn.tasks.ui.preferences">
+ <keywordReference
+ id="org.eclipse.mylyn.tasks.ui.keywords"/>
+ </page>
+ </extension>
+
+ <extension point="org.eclipse.ui.bindings">
+ <key
+ sequence="M2+M3+Q K"
+ commandId="org.eclipse.ui.views.showView"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+ <parameter
+ id="org.eclipse.ui.views.showView.viewId"
+ value="org.eclipse.mylyn.tasks.ui.views.tasks"/>
+ </key>
+ <key
+ platform="carbon"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+Q K">
+ </key>
+ <key
+ commandId="org.eclipse.ui.views.showView"
+ platform="carbon"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="COMMAND+ALT+Q K">
+ <parameter
+ id="org.eclipse.ui.views.showView.viewId"
+ value="org.eclipse.mylyn.tasks.ui.views.tasks">
+ </parameter>
+ </key>
+ <key
+ platform="cocoa"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+Q K">
+ </key>
+ <key
+ commandId="org.eclipse.ui.views.showView"
+ platform="cocoa"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="COMMAND+ALT+Q K">
+ <parameter
+ id="org.eclipse.ui.views.showView.viewId"
+ value="org.eclipse.mylyn.tasks.ui.views.tasks">
+ </parameter>
+ </key>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.themes">
+ <themeElementCategory
+ id="org.eclipse.mylyn.tasks.ui.presentation"
+ label="%themeElementCategory.label"/>
+
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.foreground.today.scheduled"
+ isEditable="true"
+ label="%colors.foreground.today.scheduled.label"
+ value="32,21,223">
+ <description>
+ %colors.foreground.today.scheduled.description
+ </description>
+ </colorDefinition>
+
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.foreground.past.scheduled"
+ isEditable="true"
+ label="%colors.foreground.past.scheduled.label"
+ value="32,21,223">
+ <description>
+ %colors.foreground.past.scheduled.description
+ </description>
+ </colorDefinition>
+
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.foreground.past.due"
+ isEditable="true"
+ label="%colors.foreground.past.due.label"
+ value="198,4,38">
+ <description>
+ %colors.foreground.past.due.description
+ </description>
+ </colorDefinition>
+
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.foreground.thisweek.scheduled"
+ isEditable="true"
+ label="%colors.foreground.thisweek.scheduled.label"
+ value="0,0,0">
+ <description>
+ %colors.foreground.thisweek.scheduled.description
+ </description>
+ </colorDefinition>
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.foreground.today.completed"
+ isEditable="true"
+ label="%colors.foreground.today.completed.label"
+ value="107,169,128">
+ <description>
+ %colors.foreground.today.completed.description
+ </description>
+ </colorDefinition>
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.foreground.completed"
+ isEditable="true"
+ label="%colors.foreground.completed.label"
+ value="128,128,128">
+ <description>
+ %colors.foreground.completed.description
+ </description>
+ </colorDefinition>
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.incoming.background"
+ isEditable="true"
+ label="%colors.incoming.background.label"
+ value="225,236,255">
+ <description>
+ %colors.incoming.background.description
+ </description>
+ </colorDefinition>
+
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.category.gradient.start"
+ isEditable="true"
+ label="%colors.category.gradient.start.label"
+ value="240,240,240">
+ <description>
+ %colors.category.gradient.start.description
+ </description>
+ </colorDefinition>
+
+ <colorDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.colors.category.gradient.end"
+ isEditable="true"
+ label="%colors.category.gradient.end.label"
+ value="220,220,220"> <!-- was all 220, 234,233,237 -->
+ <description>
+ %colors.category.gradient.end.description
+ </description>
+ </colorDefinition>
+
+ <fontDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.tasks.ui.fonts.task.editor.comment"
+ isEditable="true"
+ label="%fonts.task.editor.comment.label"
+ value="org.eclipse.jface.dialogfont">
+ <fontValue
+ ws="win32"
+ value="Tahoma-regular-10">
+ </fontValue>
+ <description>
+ %fonts.task.editor.comment.description
+ </description>
+ </fontDefinition>
+ </extension>
+ <!-- defaultsTo="org.eclipse.jface.dialogfont"-->
+
+ <extension
+ point="org.eclipse.ui.perspectives">
+ <perspective
+ class="org.eclipse.mylyn.internal.tasks.ui.PlanningPerspectiveFactory"
+ fixed="false"
+ icon="icons/eview16/perspective-planning.png"
+ id="org.eclipse.mylyn.tasks.ui.perspectives.planning"
+ name="%PlanningPerspectiveFactory.name"/>
+ </extension>
+
+
+ <extension point="org.eclipse.mylyn.tasks.ui.actions">
+ <dynamicPopupMenu
+ class="org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor"
+ menuPath="new"/>
+ <dynamicPopupMenu
+ class="org.eclipse.mylyn.internal.tasks.ui.MoveToCategoryMenuContributor"
+ menuPath="tasks"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.editors">
+ <pageFactory
+ class="org.eclipse.mylyn.internal.tasks.ui.editors.PlanningPageFactory"
+ id="org.eclipse.mylyn.tasks.ui.pageFactory.Planning">
+ </pageFactory>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.actionSets">
+ <actionSet
+ id="org.eclipse.mylyn.tasks.ui.navigation"
+ label="%actionSet.navigation.label"
+ visible="true">
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.DeactivateAllTasksAction"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.deactivateAllTasks"
+ icon="icons/etool16/task-inactive-centered.gif"
+ id="org.eclipse.mylyn.tasks.ui.deactivateAllTasks"
+ label="%DeactivateAllTasksAction.label"
+ menubarPath="navigate/open.ext3"
+ style="push"/>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.activateTask"
+ icon="icons/etool16/task-active-centered.gif"
+ id="org.eclipse.mylyn.tasks.ui.switchTask"
+ label="%ActivateTaskDialogAction.label"
+ menubarPath="navigate/open.ext3"
+ style="push"/>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskAction"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.openTask"
+ icon="icons/etool16/open-task.gif"
+ id="org.eclipse.mylyn.tasks.ui.openTask"
+ label="%OpenTaskAction.label"
+ menubarPath="navigate/open.ext3"
+ style="push"
+ toolbarPath="org.eclipse.search.searchActionSet/Search"
+ tooltip="%OpenTaskAction.tooltip"/>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.SearchForRepositoryTask"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.searchForTask"
+ icon="icons/etool16/open-repository-task.gif"
+ id="org.eclipse.mylyn.tasks.ui.open.task.remote"
+ label="%SearchForRepositoryTask.label"
+ style="push"
+ tooltip="%SearchForRepositoryTask.tooltip"/>
+ </actionSet>
+ </extension>
+
+ <extension point="org.eclipse.ui.commands">
+ <command id="org.eclipse.mylyn.tasks.ui.command.previousTask"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.TaskHistoryHandler"
+ name="%command.previousTask.name"/>
+ </extension>
+
+ <!-- command-based implementation of the previousTask/history dropdown,
+ the problem is that it doesn't work well with the actionSet
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="menu:org.eclipse.mylyn.tasks.ui.previous.task">
+ <dynamic
+ class="org.eclipse.mylyn.internal.tasks.ui.TaskHistoryDropDown"
+ id="org.eclipse.mylyn.tasks.ui.previous.task.dropdown"/>
+ </menuContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="toolbar:org.eclipse.ui.workbench.navigate">
+ <command id="org.eclipse.mylyn.tasks.ui.previous.task"
+ commandId="org.eclipse.mylyn.tasks.ui.command.previousTask"
+ icon="icons/etool16/navigate-previous.gif"
+ label="Activate Previous Task"
+ tooltip="Activate Previous Task"
+ style="pulldown">
+ <visibleWhen>
+ <with variable="activeContexts">
+ <iterate operator="or">
+ <equals value="org.eclipse.mylyn.tasks.ui.navigation.additions"/>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ -->
+
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ id="org.eclipse.mylyn.tasks.ui.navigation.additions"
+ label="%actionSet.navigation.additions.label"
+ visible="false">
+ <action
+ allowLabelUpdate="true"
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskHistoryDropDownAction"
+ icon="icons/etool16/navigate-previous.gif"
+ id="org.eclipse.mylyn.tasks.ui.navigate.task.history"
+ label="%ActivateTaskHistoryDropDownAction.label"
+ style="pulldown"
+ toolbarPath="org.eclipse.ui.workbench.navigate/Tasks"
+ tooltip="%ActivateTaskHistoryDropDownAction.tooltip">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTaskAction"
+ definitionId="org.eclipse.mylyn.tasks.ui.command.openRemoteTask"
+ icon="icons/etool16/open-repository-task.gif"
+ id="org.eclipse.mylyn.tasks.ui.open.task.remote"
+ label="%OpenRepositoryTask.label"
+ menubarPath="navigate/open.ext3"
+ style="push"
+ tooltip="%OpenRepositoryTask.tooltip"/>
+ </actionSet>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ id="org.eclipse.mylyn.tasks.ui.command.openTask"
+ name="%ommand.openTask.name"/>
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ id="org.eclipse.mylyn.tasks.ui.command.searchForTask"
+ name="%command.searchForTask.name"/>
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.OpenRepositoryTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.openRemoteTask"
+ name="%command.openRemoteTask.name"/>
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ id="org.eclipse.mylyn.tasks.ui.command.activateTask"
+ name="%command.activateTask.name"/>
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ id="org.eclipse.mylyn.tasks.ui.command.deactivateAllTasks"
+ name="%command.deactivateAllTasks.name"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.bindings">
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.openTask"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+F12"/>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.openTask"
+ platform="carbon"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+M3+F12">
+ </key>
+ <key
+ platform="carbon"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+F12">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.openTask"
+ platform="cocoa"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+M3+F12">
+ </key>
+ <key
+ platform="cocoa"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+F12">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.searchForTask"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+M2+F12"/>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.openRemoteTask"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+M2+M3+F12"/>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.activateTask"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+F9"/>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.deactivateAllTasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+M2+F9"/>
+ </extension>
+
+ <extension
+ id="org.eclipse.mylyn.tasks.ui.search.results"
+ point="org.eclipse.search.searchResultViewPages">
+ <viewPage
+ class="org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView"
+ searchResultClass="org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResult"
+ id="org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResultView"/>
+<!-- id="org.eclipse.mylyn.bugzilla.BugzillaSearchResultPage"/>-->
+ </extension>
+ <extension
+ id="org.eclipse.mylyn.tasks.ui.repositorySearchPage"
+ name="%repositorySearchPage.name"
+ point="org.eclipse.search.searchPages">
+ <page
+ class="org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage"
+ enabled="true"
+ icon="icons/eview16/task-search.gif"
+ id="org.eclipse.mylyn.tasks.ui.search.page"
+ label="%TaskSearchPage.label"
+ tabPosition="999"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ class="org.eclipse.mylyn.internal.tasks.ui.properties.ProjectTaskRepositoryPage"
+ id="org.eclipse.mylyn.tasks.ui.properties.pages.project.repository"
+ name="%ProjectTaskRepositoryPage.name">
+ <enabledWhen>
+ <adapt
+ type="org.eclipse.core.resources.IProject">
+ </adapt>
+ </enabledWhen>
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <category
+ id="org.eclipse.mylyn.tasks.ui.commands"
+ name="%commands.category.repositories.name">
+ </category>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.AddTaskRepositoryHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.addTaskRepository"
+ name="%command.addTaskRepository.name">
+ <commandParameter
+ id="connectorKind"
+ name="%command.addTaskRepository.commandParameter.name"
+ optional="true"
+ values="org.eclipse.mylyn.internal.tasks.ui.commands.TaskRepositoryParameterValues">
+ </commandParameter>
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.projectLinkProviders">
+ <linkProvider
+ class="org.eclipse.mylyn.internal.tasks.ui.properties.ProjectPropertiesLinkProvider"
+ name="%ProjectPropertiesLinkProvider.name"
+ order="1000"
+ id="org.eclipse.mylyn.tasks.ui.defaultRepositoryLinkProvider">
+ </linkProvider>
+ </extension>
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer"
+ class="org.eclipse.mylyn.internal.tasks.ui.search.SearchScoreComputerAdapterFactory">
+ <adapter
+ type="org.eclipse.search.ui.ISearchPageScoreComputer">
+ </adapter>
+ </factory>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+ <hyperlinkDetector
+ class="org.eclipse.mylyn.internal.tasks.ui.editors.TaskHyperlinkDetector"
+ id="org.eclipse.mylyn.tasks.ui.hyperlinks.detectors.task"
+ name="%TaskHyperlinkDetector.name"
+ targetId="org.eclipse.ui.DefaultTextEditor">
+ </hyperlinkDetector>
+ <hyperlinkDetector
+ class="org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlinkDetector"
+ description="%TaskUrlHyperlinkDetector.description"
+ id="org.eclipse.mylyn.tasks.ui.hyperlinks.detectors.url"
+ name="%TaskUrlHyperlinkDetector.name"
+ targetId="org.eclipse.ui.DefaultTextEditor">
+ </hyperlinkDetector>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.workingSets">
+ <workingSet
+ elementAdapterClass="org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetElementAdapter"
+ icon="icons/obj16/workingSet.gif"
+ id="org.eclipse.mylyn.tasks.ui.workingSet"
+ name="%TaskWorkingSetElementAdapter.name"
+ pageClass="org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetPage"
+ updaterClass="org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater"/>
+ </extension>
+
+ <extension point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer"
+ class="org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetAdapterFactory">
+ <adapter type="org.eclipse.ui.IPersistableElement"/>
+ </factory>
+ <factory
+ adaptableType="org.eclipse.mylyn.tasks.core.TaskRepository"
+ class="org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryAdapterFactory">
+ <adapter type="org.eclipse.ui.IActionFilter"/>
+ </factory>
+ <factory
+ adaptableType="org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput"
+ class="org.eclipse.mylyn.internal.tasks.ui.TasksAdapterFactory">
+ <adapter
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapter>
+ <adapter
+ type="org.eclipse.mylyn.tasks.core.TaskRepository">
+ </adapter>
+ </factory>
+ <factory
+ adaptableType="org.eclipse.mylyn.tasks.core.ITaskAttachment"
+ class="org.eclipse.mylyn.internal.tasks.ui.TasksAdapterFactory">
+ <adapter
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapter>
+ <adapter
+ type="org.eclipse.mylyn.tasks.core.TaskRepository">
+ </adapter>
+ </factory>
+ <factory
+ adaptableType="org.eclipse.mylyn.tasks.core.ITaskComment"
+ class="org.eclipse.mylyn.internal.tasks.ui.TasksAdapterFactory">
+ <adapter
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapter>
+ <adapter
+ type="org.eclipse.mylyn.tasks.core.TaskRepository">
+ </adapter>
+ </factory>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.elementFactories">
+ <factory
+ class="org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetElementFactory"
+ id="org.eclipse.mylyn.tasks.ui.workingSets.elementFactory">
+ </factory>
+</extension>
+ <extension
+ id="org.eclipse.mylyn.tasks.local.repository"
+ name="%local.repository.name"
+ point="org.eclipse.mylyn.tasks.ui.repositories">
+ <connectorCore
+ class="org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector"
+ id="org.eclipse.mylyn.tasks.connector.local"
+ name="%LocalRepositoryConnector.name"/>
+ <connectorUi
+ brandingIcon="icons/etool16/person.gif"
+ class="org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryConnectorUi"
+ name="%LocalRepositoryConnectorUi.name"
+ overlayIcon="icons/ovr16/overlay-local.gif"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
+ <target id="org.eclipse.mylyn.tasks.ui.TaskEditor" name="%hyperlinkDetectorTargets.name"/>
+ </extension>
+
+ <extension point="org.eclipse.mylyn.tasks.ui.presentations">
+ <presentation
+ class="org.eclipse.mylyn.internal.tasks.ui.CategorizedPresentation"
+ icon="icons/etool16/presentation-categorized.png"
+ id="org.eclipse.mylyn.tasks.ui.categorized"
+ name="%CategorizedPresentation.name"
+ primary="true"/>
+ <presentation
+ class="org.eclipse.mylyn.internal.tasks.ui.ScheduledPresentation"
+ icon="icons/etool16/presentation-scheduled.png"
+ id="org.eclipse.mylyn.tasks.ui.scheduled"
+ name="%ScheduledPresentation.name"
+ primary="true"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.GoToUnreadTaskHandler$GoToPreviousUnreadTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.goToPreviousUnread"
+ name="%command.goToPreviousUnread.name">
+ </command>
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.GoToUnreadTaskHandler$GoToNextUnreadTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.goToNextUnread"
+ name="%command.goToNextUnread.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.TaskListToolTipHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.showToolTip"
+ name="%command.showToolTip.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$MarkTaskReadHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.markTaskRead"
+ name="%command.markTaskRead.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$MarkTaskUnreadHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.markTaskUnread"
+ name="%command.markTaskUnread.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$MarkTaskReadGoToNextUnreadTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.markTaskReadGoToNextUnread"
+ name="%command.markTaskReadGoToNextUnread.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$MarkTaskReadGoToPreviousUnreadTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.markTaskReadGoToPreviousUnread"
+ name="%command.markTaskReadGoToPreviousUnread.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ id="org.eclipse.mylyn.tasks.ui.command.markTaskComplete"
+ name="%command.markTaskComplete.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ id="org.eclipse.mylyn.tasks.ui.command.markTaskIncomplete"
+ name="%command.markTaskIncomplete.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ id="org.eclipse.mylyn.tasks.ui.command.task.clearOutgoing"
+ name="%command.task.clearOutgoing.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.NewSubTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.new.subtask"
+ name="%command.new.subtask.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.NewLocalTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.new.local.task"
+ name="%command.new.local.task.name">
+ </command>
+
+ <category
+ id="org.eclipse.mylyn.tasks.ui.commands"
+ name="%commands.category.name">
+ </category>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.OpenSelectedTaskHandler"
+ id="org.eclipse.mylyn.tasks.ui.command.openSelectedTask"
+ name="%command.openSelectedTask.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.category.editor"
+ id="org.eclipse.mylyn.tasks.ui.command.attachment.openInBrowser"
+ name="%command.attachment.openInBrowser.name">
+ </command>
+ <category
+ id="org.eclipse.mylyn.tasks.ui.category.editor"
+ name="%commands.category.editor.name">
+ </category>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.category.editor"
+ id="org.eclipse.mylyn.tasks.ui.command.attachment.openInDefaultEditor"
+ name="%command.attachment.openInDefaultEditor.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.category.editor"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.SubmitTaskHandler"
+ description="%command.submitTask.description"
+ id="org.eclipse.mylyn.tasks.ui.command.submitTask"
+ name="%command.submitTask.name">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.bindings">
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.goToPreviousUnread"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M3+ARROW_UP">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.goToNextUnread"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M3+ARROW_DOWN">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.showToolTip"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="F4">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskRead"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+R">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskRead"
+ contextId="org.eclipse.mylyn.tasks.ui.editors.task"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+R">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskUnread"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+U">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskUnread"
+ contextId="org.eclipse.mylyn.tasks.ui.editors.task"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+U">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskReadGoToNextUnread"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+ARROW_DOWN">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskReadGoToPreviousUnread"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+ARROW_UP">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.new.subtask"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+INSERT">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.new.local.task"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="INSERT">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.openSelectedTask"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+ENTER">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskComplete"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+C">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskComplete"
+ contextId="org.eclipse.mylyn.tasks.ui.editors.task"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+C">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskIncomplete"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+I">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskIncomplete"
+ contextId="org.eclipse.mylyn.tasks.ui.editors.task"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+I">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.submitTask"
+ contextId="org.eclipse.mylyn.tasks.ui.editors.task"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+S">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.new.subtask"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ platform="carbon"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+N">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.new.local.task"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ platform="carbon"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M3+N">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.new.subtask"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ platform="cocoa"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M2+M3+N">
+ </key>
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.new.local.task"
+ contextId="org.eclipse.mylyn.tasks.ui.views.tasks"
+ platform="cocoa"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M3+N">
+ </key>
+ </extension>
+ <extension
+ point="org.eclipse.ui.contexts">
+ <context
+ id="org.eclipse.mylyn.tasks.ui.views.tasks"
+ name="%context.views.tasks.name"
+ parentId="org.eclipse.ui.contexts.window">
+ </context>
+ </extension>
+
+
+ <extension point="org.eclipse.ui.navigator.navigatorContent">
+ <commonFilter
+ id="org.eclipse.mylyn.tasks.ui.navigator.filters.tasks"
+ name="%filters.tasks.name"
+ description="%filters.tasks.description"
+ activeByDefault="true">
+ <filterExpression>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer" />
+ </filterExpression>
+ </commonFilter>
+ </extension>
+ <extension point="org.eclipse.ui.navigator.viewer">
+ <viewerContentBinding
+ viewerId="org.eclipse.ui.navigator.ProjectExplorer">
+ <includes>
+ <contentExtension
+ pattern="org.eclipse.mylyn.tasks.ui.navigator.filters.tasks" />
+ </includes>
+ </viewerContentBinding>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.OpenTaskListElementPropertiesHandler"
+ commandId="org.eclipse.ui.file.properties">
+ <activeWhen>
+ <with variable="activePartId">
+ <equals value="org.eclipse.mylyn.tasks.ui.views.tasks"/>
+ </with>
+ </activeWhen>
+ <enabledWhen>
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate>
+ <or>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.RepositoryQuery">
+ </instanceof>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.TaskCategory">
+ </instanceof>
+ </or>
+ </iterate>
+ </and>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.OpenTaskRepositoryPropertiesHandler"
+ commandId="org.eclipse.ui.file.properties">
+ <activeWhen>
+ <with variable="activePartId">
+ <equals value="org.eclipse.mylyn.tasks.ui.views.repositories"/>
+ </with>
+ </activeWhen>
+ <enabledWhen>
+ <and>
+ <count
+ value="1">
+ </count>
+ <iterate>
+ <and>
+ <instanceof
+ value="org.eclipse.mylyn.tasks.core.TaskRepository">
+ </instanceof>
+ <or>
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.mylyn.taskRepository.userManaged"
+ value="true">
+ </test>
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.mylyn.taskRepository.connectorKind"
+ value="local">
+ </test>
+ </or>
+ </and>
+ </iterate>
+ </and>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.OpenTaskAttachmentInBrowserHandler"
+ commandId="org.eclipse.mylyn.tasks.ui.command.attachment.openInBrowser">
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.OpenTaskAttachmentInDefaultEditorHandler"
+ commandId="org.eclipse.mylyn.tasks.ui.command.attachment.openInDefaultEditor">
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$MarkTaskCompleteHandler"
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskComplete">
+ <enabledWhen>
+ <iterate
+ operator="or">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.isCompleted"
+ value="false">
+ </test>
+ <test
+ property="org.eclipse.mylyn.task.hasLocalCompletionState"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$MarkTaskIncompleteHandler"
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskIncomplete">
+ <enabledWhen>
+ <iterate
+ operator="or">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.isCompleted"
+ value="true">
+ </test>
+ <test
+ property="org.eclipse.mylyn.task.hasLocalCompletionState"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+ <handler
+ class="org.eclipse.mylyn.internal.tasks.ui.commands.MarkTaskHandler$ClearOutgoingHandler"
+ commandId="org.eclipse.mylyn.tasks.ui.command.task.clearOutgoing">
+ <enabledWhen>
+ <iterate
+ operator="or">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.hasEdits"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </enabledWhen>
+ </handler>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.mylyn.tasks.ui.editors.task?after=additions">
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.viewSource.command"
+ id="org.eclipse.mylyn.sandbox.ui.viewSource"
+ label="View Unformatted Text"
+ style="toggle">
+ <visibleWhen
+ checkEnabled="true">
+ </visibleWhen>
+ </command>
+ </menuContribution>
+
+ <menuContribution
+ locationURI="popup:org.eclipse.mylyn.tasks.ui.views.tasks?after=properties">
+ <command
+ commandId="org.eclipse.ui.file.properties"
+ style="push">
+ <visibleWhen
+ checkEnabled="true">
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.mylyn.tasks.ui.views.repositories?after=properties">
+ <command
+ commandId="org.eclipse.ui.file.properties"
+ style="push">
+ <visibleWhen
+ checkEnabled="true">
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.mylyn.tasks.ui.editor.menu.attachments?after=group.open">
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.attachment.openInBrowser"
+ label="%command.attachment.openInBrowser.label"
+ mnemonic="O"
+ style="push">
+ </command>
+ <menu
+ label="%command.attachment.openInDefaultEditor.menu.label"
+ mnemonic="H">
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.attachment.openInDefaultEditor"
+ label="%command.attachment.openInDefaultEditor.label"
+ mnemonic="D"
+ style="push">
+ </command>
+ </menu>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.popup.any?after=navigate">
+ <menu
+ id="org.eclipse.mylyn.tasks.ui.menu.task.mark"
+ label="%menu.task.mark.label">
+ <visibleWhen
+ checkEnabled="false">
+ <or>
+ <with
+ variable="activeMenuSelection">
+ <iterate
+ ifEmpty="false">
+ <or>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapt>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer">
+ </instanceof>
+ </or>
+ </iterate>
+ </with>
+ <iterate
+ ifEmpty="false">
+ <or>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </adapt>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer">
+ </instanceof>
+ </or>
+ </iterate>
+ </or>
+ </visibleWhen>
+ <separator
+ name="group.taskStatus"
+ visible="true">
+ </separator>
+ <separator
+ name="group.synchronizationStatus"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskRead"
+ label="%command.markTaskRead.label"
+ mnemonic="R"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <reference
+ definitionId="org.eclipse.mylyn.tasks.ui.expressions.repositoryElements">
+ </reference>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskUnread"
+ label="%command.markTaskUnread.label"
+ mnemonic="U"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <reference
+ definitionId="org.eclipse.mylyn.tasks.ui.expressions.repositoryElements">
+ </reference>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.task.clearOutgoing"
+ label="%command.task.clearOutgoing.label"
+ mnemonic="C"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <iterate>
+ <not>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.LocalTask">
+ </instanceof>
+ </adapt>
+ </not>
+ </iterate>
+ </visibleWhen>
+ </command>
+ <separator
+ name="additions">
+ </separator>
+ </menu>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.mylyn.tasks.ui.menu.task.mark?after=group.taskStatus">
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskComplete"
+ icon="icons/etool16/task-complete.gif"
+ label="%command.markTaskComplete.label"
+ mnemonic="C"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <iterate
+ operator="or">
+ <and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <test
+ property="org.eclipse.mylyn.task.hasLocalCompletionState"
+ value="true">
+ </test>
+ </adapt>
+ </and>
+ </iterate>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.markTaskIncomplete"
+ icon="icons/etool16/task-incomplete.gif"
+ label="%command.markTaskIncomplete.label"
+ mnemonic="I"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <iterate
+ operator="or">
+ <and>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.AbstractTask">
+ </instanceof>
+ <test
+ property="org.eclipse.mylyn.task.hasLocalCompletionState"
+ value="true">
+ </test>
+ </and>
+ </iterate>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="menu:goTo">
+ <separator
+ name="group.taskList"
+ visible="true">
+ </separator>
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.goToPreviousUnread"
+ label="%command.goToPreviousUnread.label"
+ mnemonic="P"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="activeContexts">
+ <iterate
+ operator="or">
+ <equals
+ value="org.eclipse.mylyn.tasks.ui.views.tasks">
+ </equals>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.mylyn.tasks.ui.command.goToNextUnread"
+ label="%command.goToNextUnread.label"
+ mnemonic="N"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="activeContexts">
+ <iterate
+ operator="or">
+ <equals
+ value="org.eclipse.mylyn.tasks.ui.views.tasks">
+ </equals>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.core.expressions.propertyTesters">
+ <propertyTester
+ class="org.eclipse.mylyn.internal.tasks.ui.util.TaskPropertyTester"
+ id="org.eclipse.mylyn.tasks.ui.propertyTester.task"
+ namespace="org.eclipse.mylyn.task"
+ properties="canGetAttachment,canPostAttachment,connectorKind,hasEdits,hasLocalContext,hasLocalCompletionState,hasRepositoryContext,isCompleted,isLocal,"
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ </propertyTester>
+ <propertyTester
+ class="org.eclipse.mylyn.internal.tasks.ui.util.TaskAttachmentPropertyTester"
+ id="org.eclipse.mylyn.tasks.ui.propertyTester.task.attachment"
+ namespace="org.eclipse.mylyn.task.attachment"
+ properties="isContext,hasUrl"
+ type="org.eclipse.mylyn.tasks.core.ITaskAttachment">
+ </propertyTester>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.commons.core.errorReporters">
+ <errorReporter
+ class="org.eclipse.mylyn.internal.tasks.ui.DialogErrorReporter"
+ id="org.eclipse.mylyn.tasks.bugs.errorReporter"
+ label="%tasks.bugs.errorReporter.label">
+ </errorReporter>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.category.editor"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.MaximizePartHandler"
+ description="%command.maximizePart.description"
+ id="org.eclipse.mylyn.tasks.ui.command.maximizePart"
+ name="%command.maximizePart.name">
+ </command>
+ <command
+ categoryId="org.eclipse.mylyn.tasks.ui.commands"
+ defaultHandler="org.eclipse.mylyn.internal.tasks.ui.commands.ViewSourceHandler"
+ id="org.eclipse.mylyn.tasks.ui.viewSource.command"
+ name="%commands.ViewSourceHandler.name">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.bindings">
+ <key
+ commandId="org.eclipse.mylyn.tasks.ui.command.maximizePart"
+ contextId="org.eclipse.mylyn.tasks.ui.editors.task"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+ sequence="M1+M2+M">
+ </key>
+ </extension>
+ <extension
+ point="org.eclipse.ui.contexts">
+ <context
+ id="org.eclipse.mylyn.tasks.ui.editors.task"
+ name="%context.editors.task.name"
+ parentId="org.eclipse.ui.textEditorScope">
+ </context>
+ </extension>
+ <extension
+ point="org.eclipse.core.expressions.propertyTesters">
+ <propertyTester
+ class="org.eclipse.mylyn.internal.tasks.ui.util.TaskRepositoryPropertyTester"
+ id="org.eclipse.mylyn.tasks.ui.propertyTester.taskRepository"
+ namespace="org.eclipse.mylyn.taskRepository"
+ properties="connectorKind,userManaged"
+ type="org.eclipse.mylyn.tasks.core.TaskRepository">
+ </propertyTester>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskRepositoryPageContribution">
+ <taskRepositoryPageContribution
+ id="org.eclipse.mylyn.tasks.ui.taskEditorExtensionSettings"
+ class="org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensionSettingsContribution">
+ </taskRepositoryPageContribution>
+ </extension>
+ <extension
+ point="org.eclipse.core.expressions.definitions">
+ <definition
+ id="org.eclipse.mylyn.tasks.ui.expressions.repositoryElements">
+ <or>
+ <with variable="activeMenuSelection">
+ <reference
+ definitionId="org.eclipse.mylyn.tasks.ui.expressions.repositoryElementsIterator">
+ </reference>
+ </with>
+ <reference
+ definitionId="org.eclipse.mylyn.tasks.ui.expressions.repositoryElementsIterator">
+ </reference>
+ </or>
+ </definition>
+ <definition
+ id="org.eclipse.mylyn.tasks.ui.expressions.repositoryElementsIterator">
+ <iterate>
+ <or>
+ <and>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer">
+ </instanceof>
+ <not>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.LocalTask">
+ </instanceof>
+ </not>
+ </and>
+ <adapt
+ type="org.eclipse.mylyn.tasks.core.ITask">
+ <not>
+ <instanceof
+ value="org.eclipse.mylyn.internal.tasks.core.LocalTask">
+ </instanceof>
+ </not>
+ </adapt>
+ </or>
+ </iterate>
+ </definition>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/actions.exsd b/org.eclipse.mylyn.tasks.ui/schema/actions.exsd
new file mode 100644
index 0000000..78891c7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/actions.exsd
@@ -0,0 +1,94 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="providers" name="Task UI Providers"/>
+ </appInfo>
+ <documentation>
+ Currently only a work-around for creating a dynamic popupo menu.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="dynamicPopupMenu" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="dynamicPopupMenu">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="menuPath" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+
+
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/duplicateDetectors.exsd b/org.eclipse.mylyn.tasks.ui/schema/duplicateDetectors.exsd
new file mode 100644
index 0000000..61acc18
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/duplicateDetectors.exsd
@@ -0,0 +1,119 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="duplicateDetectors" name="duplicateDetectors"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="detector"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="detector">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.AbstractDuplicateDetector:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="kind" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/editors.exsd b/org.eclipse.mylyn.tasks.ui/schema/editors.exsd
new file mode 100644
index 0000000..2a5d9a4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/editors.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="editors" name="Task Editors"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="pageFactory" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="pageFactory">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/presentations.exsd b/org.eclipse.mylyn.tasks.ui/schema/presentations.exsd
new file mode 100644
index 0000000..931c7da
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/presentations.exsd
@@ -0,0 +1,133 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="presentations" name="presentations"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="1" maxOccurs="unbounded">
+ <element ref="presentation"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="presentation">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="icon" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="primary" type="boolean">
+ <annotation>
+ <documentation>
+ True for presentations that are intended to be primary and required for typical usage, false for additional presentations that are secondary. Reflected in the UI, e.g. by ordering secondary presentations below primary ones.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/projectLinkProviders.exsd b/org.eclipse.mylyn.tasks.ui/schema/projectLinkProviders.exsd
new file mode 100644
index 0000000..1b5f7a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/projectLinkProviders.exsd
@@ -0,0 +1,126 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="projectLinkProviders" name="Task Repository Link Provider"/>
+ </appInfo>
+ <documentation>
+ Providers responsible for linking Workspace resources/projects to the Task Repositories.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="linkProvider"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="linkProvider">
+ <complexType>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="order" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ See org.eclipse.mylyn.tasks.ui.TasksUiPlugin.getRepositoryForResource(IResource resource, boolean silent)
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/repositories.exsd b/org.eclipse.mylyn.tasks.ui/schema/repositories.exsd
new file mode 100644
index 0000000..8eb680d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/repositories.exsd
@@ -0,0 +1,203 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="repositories" name="Repositories"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ <documentation>
+ (no description available)
+ </documentation>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="connectorCore"/>
+ <element ref="connectorUi" minOccurs="0" maxOccurs="1"/>
+ <element ref="taskListMigrator" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="taskListMigrator">
+ <annotation>
+ <appInfo>
+ <meta.element labelAttribute="name"/>
+ </appInfo>
+ <documentation>
+ (no description available)
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectorCore">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="connectorUi">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="brandingIcon" type="string">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="overlayIcon" type="string">
+ <annotation>
+ <documentation>
+ (no description available)
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/taskEditorExtensions.exsd b/org.eclipse.mylyn.tasks.ui/schema/taskEditorExtensions.exsd
new file mode 100644
index 0000000..19f9993
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/taskEditorExtensions.exsd
@@ -0,0 +1,173 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="taskEditorExtensions" name="Task Editor Extensions"/>
+ </appInfo>
+ <documentation>
+ An extension to the Mylyn task editor that can provide viewing and editing controls that are markup-aware.
+This extension provides a means to register such extensions, and to associate those extensions with a specific connector kind.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="taskEditorExtension" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="repositoryAssociation" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="taskEditorExtension">
+ <annotation>
+ <documentation>
+ Declare an extension to the Mylyn task editor. Extensions are typically capable of providing improved editing capabilities, such as markup-aware.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ the fully qualified class name of the class that extends org.eclipse.mylyn.internal.sandbox.ui.editors.AbstractTaskEditorExtension
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.internal.sandbox.ui.editors.AbstractTaskEditorExtension:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ a unique identifier identifying the extension
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ A human-readable name for the extension that is presented to the Eclipse user in the UI. Should be translated. Used in the UI to identify the type of extension, so the name should indicate what the extension is for, and it should be short so that it can be displayed on one line (for example as an option in a combo box.) Example: "TracWiki", or "Textile".
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="repositoryAssociation">
+ <annotation>
+ <documentation>
+ Associate the task editor extension with a kind of repository. Making such an association causes the taskEditorExtension to become the default or preferred setting for a kind of repository.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="connectorKind" type="string" use="required">
+ <annotation>
+ <documentation>
+ the kind of connector for that this task editor extension should be associated with.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="taskEditorExtension" type="string" use="required">
+ <annotation>
+ <documentation>
+ the id of the taskEditorExtension to associate
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 3.1
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ To register a task editor extension:
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <taskEditorExtension
+ class="org.eclipse.mylyn.internal.wikitext.textile.ui.editors.TextileTaskEditorExtension"
+ id="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtension"
+ name="%taskEditorExtension.name.0">
+ </taskEditorExtension>
+ </extension>
+
+To make a task editor extension the default for a specific connector kind:
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <repositoryAssociation
+ connectorKind="local"
+ taskEditorExtension="org.eclipse.mylyn.wikitext.textile.core.ui.taskEditorExtension">
+ </repositoryAssociation>
+ </extension>
+
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/taskEditorPageContribution.exsd b/org.eclipse.mylyn.tasks.ui/schema/taskEditorPageContribution.exsd
new file mode 100644
index 0000000..b8d01b5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/taskEditorPageContribution.exsd
@@ -0,0 +1,107 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="taskEditorPageContribution" name="Task Editor Page Contribution"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element internal="true" />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element ref="repositoryPart" minOccurs="0" maxOccurs="1"/>
+ <element ref="localPart" minOccurs="0" maxOccurs="1"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="repositoryPart">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="path" type="string" use="default" value="additions">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="localPart">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.internal.tasks.ui.editors.AbstractLocalEditorPart:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+
+
+
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/schema/taskRepositoryPageContribution.exsd b/org.eclipse.mylyn.tasks.ui/schema/taskRepositoryPageContribution.exsd
new file mode 100644
index 0000000..dc1e424
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/schema/taskRepositoryPageContribution.exsd
@@ -0,0 +1,119 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.tasks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.tasks.ui" id="taskRepositoryPageContribution" name="Task Repository Page Contribution"/>
+ </appInfo>
+ <documentation>
+ This extension point enables plug-ins to contribute user interface to the task repository settings dialog.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="taskRepositoryPageContribution" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="taskRepositoryPageContribution">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.tasks.ui.wizards.AbstractTaskRepositoryPageContribution:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="connectorKind" type="string">
+ <annotation>
+ <documentation>
+ the kind of repository connector for which this contributor should be used, or "" (the empty string) if it applies to all connectors
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ a unique identifier that identifies the contribution
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 3.1
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskRepositoryPageContribution">
+ <taskRepositoryPageContribution class="org.eclipse.mylyn.internal.tasks.ui.wizards.TaskEditorExtensionSettingsContribution"/>
+ </extension>
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractRepositoryQueryPage2.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractRepositoryQueryPage2.java
new file mode 100644
index 0000000..8cbcc4f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/AbstractRepositoryQueryPage2.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+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.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.1
+ */
+public abstract class AbstractRepositoryQueryPage2 extends AbstractRepositoryQueryPage {
+
+ private Text titleText;
+
+ private Button updateButton;
+
+ private boolean firstTime = true;
+
+ private final AbstractRepositoryConnector connector;
+
+ private boolean needsRepositoryConfiguration = true;
+
+ public AbstractRepositoryQueryPage2(String pageName, TaskRepository repository, IRepositoryQuery query) {
+ super(pageName, repository, query);
+ this.connector = TasksUi.getRepositoryConnector(getTaskRepository().getConnectorKind());
+ setTitle(Messages.AbstractRepositoryQueryPage2_Enter_query_parameters);
+ setDescription(Messages.AbstractRepositoryQueryPage2_If_attributes_are_blank_or_stale_press_the_Update_button);
+ }
+
+ public void setNeedsRepositoryConfiguration(boolean needsRepositoryConfiguration) {
+ this.needsRepositoryConfiguration = needsRepositoryConfiguration;
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(composite);
+ GridLayout layout = new GridLayout(2, false);
+ if (inSearchContainer()) {
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ }
+ composite.setLayout(layout);
+
+ createTitleGroup(composite);
+
+ Composite innerComposite = new Composite(composite, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).span(2, 1).applyTo(innerComposite);
+ innerComposite.setLayout(new FillLayout());
+ createPageContent(innerComposite);
+
+ if (needsRepositoryConfiguration) {
+ createUpdateButton(composite);
+ }
+
+ if (getQuery() != null) {
+ titleText.setText(getQuery().getSummary());
+ restoreState(getQuery());
+ }
+
+ Dialog.applyDialogFont(composite);
+ setControl(composite);
+ }
+
+ protected abstract void createPageContent(Composite parent);
+
+ private void createTitleGroup(Composite control) {
+ if (inSearchContainer()) {
+ return;
+ }
+
+ Label titleLabel = new Label(control, SWT.NONE);
+ titleLabel.setText(Messages.AbstractRepositoryQueryPage2__Title_);
+
+ titleText = new Text(control, SWT.BORDER);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(titleText);
+ titleText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ // ignore
+ }
+
+ public void keyReleased(KeyEvent e) {
+ getContainer().updateButtons();
+ }
+ });
+ }
+
+ private Control createUpdateButton(final Composite control) {
+ Composite composite = new Composite(control, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ composite.setLayout(layout);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).span(2, 1).applyTo(composite);
+
+ updateButton = new Button(composite, SWT.PUSH);
+ updateButton.setText(Messages.AbstractRepositoryQueryPage2__Refresh_From_Repository);
+ updateButton.setLayoutData(new GridData());
+ updateButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (getTaskRepository() != null) {
+ updateAttributesFromRepository(true);
+ } else {
+ MessageDialog.openInformation(
+ Display.getCurrent().getActiveShell(),
+ Messages.AbstractRepositoryQueryPage2_Update_Attributes_Failed,
+ Messages.AbstractRepositoryQueryPage2_No_repository_available_please_add_one_using_the_Task_Repositories_view);
+ }
+ }
+ });
+
+ return composite;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+
+ if (getSearchContainer() != null) {
+ getSearchContainer().setPerformActionEnabled(true);
+ }
+
+ if (visible && firstTime) {
+ firstTime = false;
+ if (!hasRepositoryConfiguration() && needsRepositoryConfiguration) {
+ // delay the execution so the dialog's progress bar is visible
+ // when the attributes are updated
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (getControl() != null && !getControl().isDisposed()) {
+ initializePage();
+ }
+ }
+
+ });
+ } else {
+ // no remote connection is needed to get attributes therefore do
+ // not use delayed execution to avoid flickering
+ initializePage();
+ }
+ }
+ }
+
+ private void initializePage() {
+ if (needsRepositoryConfiguration) {
+ updateAttributesFromRepository(false);
+ }
+ boolean restored = (getQuery() != null);
+ if (inSearchContainer()) {
+ restored |= restoreState(null);
+ }
+ if (!restored) {
+ // initialize with default values
+ }
+ }
+
+ protected abstract boolean hasRepositoryConfiguration();
+
+ protected AbstractRepositoryConnector getConnector() {
+ return connector;
+ }
+
+ private void updateAttributesFromRepository(final boolean force) {
+ if (!hasRepositoryConfiguration() || force) {
+ setErrorMessage(null);
+ try {
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ connector.updateRepositoryConfiguration(getTaskRepository(), monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ }
+ }
+ };
+
+ if (getContainer() != null) {
+ getContainer().run(true, true, runnable);
+ } else if (getSearchContainer() != null) {
+ getSearchContainer().getRunnableContext().run(true, true, runnable);
+ } else {
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.busyCursorWhile(runnable);
+ }
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ setErrorMessage(((CoreException) e.getCause()).getStatus().getMessage());
+ } else {
+ setErrorMessage(e.getCause().getMessage());
+ }
+ return;
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+
+ doRefresh();
+ }
+
+ protected abstract void doRefresh();
+
+ @Override
+ public boolean isPageComplete() {
+ if (titleText != null && titleText.getText().length() > 0) {
+ return true;
+ }
+ setMessage(Messages.AbstractRepositoryQueryPage2_Enter_a_title);
+ return false;
+ }
+
+ @Override
+ public boolean performSearch() {
+ if (inSearchContainer()) {
+ saveState();
+ }
+ return super.performSearch();
+ }
+
+ protected abstract boolean restoreState(IRepositoryQuery query);
+
+ @Override
+ public String getQueryTitle() {
+ return (titleText != null) ? titleText.getText() : null;
+ }
+
+ public void setQueryTitle(String text) {
+ if (titleText != null) {
+ titleText.setText(text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/Messages.java
new file mode 100644
index 0000000..daba1fe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/Messages.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.provisional.tasks.ui.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.provisional.tasks.ui.wizards.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AbstractRepositoryQueryPage2__Refresh_From_Repository;
+
+ public static String AbstractRepositoryQueryPage2__Title_;
+
+ public static String AbstractRepositoryQueryPage2_Enter_a_title;
+
+ public static String AbstractRepositoryQueryPage2_Enter_query_parameters;
+
+ public static String AbstractRepositoryQueryPage2_If_attributes_are_blank_or_stale_press_the_Update_button;
+
+ public static String AbstractRepositoryQueryPage2_No_repository_available_please_add_one_using_the_Task_Repositories_view;
+
+ public static String AbstractRepositoryQueryPage2_Update_Attributes_Failed;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/messages.properties
new file mode 100644
index 0000000..b896314
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/provisional/tasks/ui/wizards/messages.properties
@@ -0,0 +1,7 @@
+AbstractRepositoryQueryPage2__Refresh_From_Repository=&Refresh From Repository
+AbstractRepositoryQueryPage2__Title_=&Title:
+AbstractRepositoryQueryPage2_Enter_a_title=Enter a title
+AbstractRepositoryQueryPage2_Enter_query_parameters=Enter query parameters
+AbstractRepositoryQueryPage2_If_attributes_are_blank_or_stale_press_the_Update_button=If attributes are blank or stale press the Update button.
+AbstractRepositoryQueryPage2_No_repository_available_please_add_one_using_the_Task_Repositories_view=No repository available, please add one using the Task Repositories view.
+AbstractRepositoryQueryPage2_Update_Attributes_Failed=Update Attributes Failed
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/AbstractTaskListFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/AbstractTaskListFilter.java
new file mode 100644
index 0000000..d84c532
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/AbstractTaskListFilter.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * Custom filters are used so that the "Find:" filter can 'see through' any filters that may have been applied.
+ *
+ * @author Mik Kersten
+ */
+// XXX duplicate implementation in hasDescendantIncoming/hasIncompleteDescendant: consider replacing this by a visitor
+public abstract class AbstractTaskListFilter {
+
+ public abstract boolean select(Object parent, Object element);
+
+ /**
+ * @return true if this filter should be applied even with filter text is present
+ */
+ public boolean applyToFilteredText() {
+ return false;
+ }
+
+ /**
+ * NOTE: performance implication of looking down children
+ *
+ * TODO: Move to an internal utility class
+ */
+ public static boolean hasDescendantIncoming(ITaskContainer container) {
+ return hasDescendantIncoming(container, ITasksCoreConstants.MAX_SUBTASK_DEPTH);
+ }
+
+ public static boolean hasIncompleteDescendant(ITaskContainer container) {
+ return hasIncompleteDescendant(container, ITasksCoreConstants.MAX_SUBTASK_DEPTH);
+ }
+
+ private static boolean hasDescendantIncoming(ITaskContainer container, int depth) {
+ Collection<ITask> children = container.getChildren();
+ if (children == null || depth <= 0) {
+ return false;
+ }
+
+ for (ITask task : children) {
+ if (task != null) {
+ ITask containedRepositoryTask = task;
+ if (containedRepositoryTask.getSynchronizationState().isIncoming()) {
+ return true;
+ } else if (TasksUiPlugin.getDefault().groupSubtasks(container) && task instanceof ITaskContainer
+ && hasDescendantIncoming((ITaskContainer) task, depth - 1)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private static boolean hasIncompleteDescendant(ITaskContainer container, int depth) {
+ Collection<ITask> children = container.getChildren();
+ if (children == null || depth <= 0) {
+ return false;
+ }
+
+ for (ITask task : children) {
+ if (task != null) {
+ ITask containedRepositoryTask = task;
+ if (!containedRepositoryTask.isCompleted()) {
+ return true;
+ } else if (task instanceof ITaskContainer && hasIncompleteDescendant((ITaskContainer) task, depth - 1)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java
new file mode 100644
index 0000000..f424ca7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ActivityExternalizationParticipant.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant;
+import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager;
+import org.eclipse.mylyn.internal.tasks.core.externalization.IExternalizationContext;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+
+/**
+ * @author Rob Elves
+ */
+ at SuppressWarnings("restriction")
+public class ActivityExternalizationParticipant extends AbstractExternalizationParticipant implements
+ ITaskActivityListener {
+
+ private boolean isDirty = false;
+
+ private final ExternalizationManager manager;
+
+ private long lastUpdate;
+
+ public ActivityExternalizationParticipant(ExternalizationManager manager) {
+ this.manager = manager;
+ }
+
+ @Override
+ public void execute(IExternalizationContext context, IProgressMonitor monitor) throws CoreException {
+ Assert.isNotNull(context);
+ switch (context.getKind()) {
+ case SAVE:
+ if (ContextCorePlugin.getDefault() != null && ContextCorePlugin.getContextManager() != null) {
+ setDirty(false);
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ }
+ break;
+ case LOAD:
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+ break;
+ case SNAPSHOT:
+ break;
+ }
+ }
+
+ @Override
+ public String getDescription() {
+ return Messages.ActivityExternalizationParticipant_Activity_Context;
+ }
+
+ @Override
+ public ISchedulingRule getSchedulingRule() {
+ return ITasksCoreConstants.ACTIVITY_SCHEDULING_RULE;
+ }
+
+ @Override
+ public boolean isDirty() {
+ synchronized (this) {
+ return isDirty;
+ }
+ }
+
+ public void setDirty(boolean dirty) {
+ synchronized (this) {
+ isDirty = dirty;
+ }
+ }
+
+ @Override
+ public String getFileName() {
+ // ignore
+ return null;
+ }
+
+ @Override
+ public void load(File sourceFile, IProgressMonitor monitor) throws CoreException {
+ // ignore see execute method
+ }
+
+ @Override
+ public void save(File targetFile, IProgressMonitor monitor) throws CoreException {
+ // ignore see execute method
+ }
+
+ public void activityReset() {
+ // ignore see execute method
+ }
+
+ public void elapsedTimeUpdated(ITask task, long newElapsedTime) {
+ if (System.currentTimeMillis() - lastUpdate > 1000 * 60) {
+ setDirty(true);
+ manager.requestSave();
+ lastUpdate = System.currentTimeMillis();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/AddExistingTaskJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/AddExistingTaskJob.java
new file mode 100644
index 0000000..1a79add
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/AddExistingTaskJob.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.text.MessageFormat;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Retrieves an existing repository task and adds it to the tasklist
+ *
+ * @author Willian Mitsuda
+ */
+// TODO merge with OpenRepositoryTaskJob
+public class AddExistingTaskJob extends Job {
+
+ /**
+ * Task repository whose task will be added
+ */
+ private final TaskRepository repository;
+
+ /**
+ * Identifies a existing task on the repository
+ */
+ private final String taskId;
+
+ /**
+ * Optional; informs the task container the task initialy belongs to; if null, it will be added to the current
+ * selected task's category in task list
+ */
+ private final AbstractTaskCategory taskContainer;
+
+ public AddExistingTaskJob(TaskRepository repository, String taskId) {
+ this(repository, taskId, null);
+ }
+
+ public AddExistingTaskJob(TaskRepository repository, String taskId, AbstractTaskCategory taskContainer) {
+ super(MessageFormat.format(Messages.AddExistingTaskJob_Adding_task_X_, taskId));
+ this.repository = repository;
+ this.taskId = taskId;
+ this.taskContainer = taskContainer;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ OpenRepositoryTaskJob job = new OpenRepositoryTaskJob(repository.getConnectorKind(),
+ repository.getRepositoryUrl(), taskId, null, null);
+ IStatus result = job.run(monitor);
+ final ITask newTask = job.getTask();
+ if (newTask != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ AbstractTaskCategory category = taskContainer;
+ TaskListView taskListView = TaskListView.getFromActivePerspective();
+ if (category == null) {
+ Object selectedObject = ((IStructuredSelection) taskListView.getViewer().getSelection()).getFirstElement();
+ if (selectedObject instanceof TaskCategory) {
+ category = (TaskCategory) selectedObject;
+ }
+ }
+ TasksUiInternal.getTaskList().addTask(newTask, category);
+ taskListView.getViewer().setSelection(new StructuredSelection(newTask));
+ }
+ });
+ }
+ return result;
+// try {
+// TasksUiUtil.openTask(repository, taskId);
+// final AbstractTask newTask = (AbstractTask) TasksUiInternal.createTask(repository, taskId, monitor);
+// if (newTask != null) {
+// TasksUiPlugin.getTaskActivityManager().setScheduledFor(newTask, TaskActivityUtil.getCurrentWeek());
+//
+// TasksUiInternal.refreshAndOpenTaskListElement(newTask);
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+//
+// public void run() {
+// AbstractTaskCategory category = taskContainer;
+// TaskListView taskListView = TaskListView.getFromActivePerspective();
+// if (category == null) {
+// Object selectedObject = ((IStructuredSelection) taskListView.getViewer().getSelection()).getFirstElement();
+// if (selectedObject instanceof TaskCategory) {
+// category = (TaskCategory) selectedObject;
+// }
+// }
+// TasksUiInternal.getTaskList().addTask(newTask, category);
+// taskListView.getViewer().setSelection(new StructuredSelection(newTask));
+// }
+// });
+// } else {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+// if (window != null) {
+// MessageDialog.openWarning(window.getShell(), "Add Existing Task Failed",
+// MessageFormat.format("Unable to retrieve task \"{0}\" from repository.", taskId));
+// }
+// }
+// });
+// }
+// } catch (final CoreException e) {
+// TasksUiInternal.asyncDisplayStatus("Unable to open task", e.getStatus());
+// } finally {
+// monitor.done();
+// }
+// return Status.OK_STATUS;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/CategorizedPresentation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/CategorizedPresentation.java
new file mode 100644
index 0000000..78e153b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/CategorizedPresentation.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider;
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class CategorizedPresentation extends AbstractTaskListPresentation {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.categorized"; //$NON-NLS-1$
+
+ public CategorizedPresentation() {
+ super(ID);
+ }
+
+ @Override
+ protected AbstractTaskListContentProvider createContentProvider(TaskListView taskListView) {
+ return new TaskListContentProvider(taskListView);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ChangeActivityHandleOperation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ChangeActivityHandleOperation.java
new file mode 100644
index 0000000..35a8785
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ChangeActivityHandleOperation.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+
+/**
+ * Changes handle from oldHandle to newHandle in Activity Meta Context
+ *
+ * @author Rob Elves
+ */
+public class ChangeActivityHandleOperation extends TaskListModifyOperation {
+
+ private final String oldHandle;
+
+ private final String newHandle;
+
+ public ChangeActivityHandleOperation(String oldHandle, String newHandle) {
+ this.oldHandle = oldHandle;
+ this.newHandle = newHandle;
+ }
+
+ @Override
+ protected void operations(IProgressMonitor monitor) throws CoreException, InvocationTargetException,
+ InterruptedException {
+ if (oldHandle == null || newHandle == null || oldHandle.equals(newHandle)) {
+ return;
+ }
+ try {
+ monitor.beginTask(Messages.ChangeActivityHandleOperation_Activity_migration, IProgressMonitor.UNKNOWN);
+ refactorMetaContextHandles(oldHandle, newHandle);
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @SuppressWarnings("restriction")
+ private void refactorMetaContextHandles(String oldHandle, String newHandle) {
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ ContextCorePlugin.getContextManager().resetActivityMetaContext();
+ InteractionContext newMetaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ for (InteractionEvent event : metaContext.getInteractionHistory()) {
+ if (event.getStructureHandle() != null) {
+ if (event.getStructureHandle().equals(oldHandle)) {
+ event = new InteractionEvent(event.getKind(), event.getStructureKind(), newHandle,
+ event.getOriginId(), event.getNavigation(), event.getDelta(),
+ event.getInterestContribution(), event.getDate(), event.getEndDate());
+ }
+ }
+ newMetaContext.parseEvent(event);
+ }
+ ContextCorePlugin.getContextManager().saveActivityMetaContext();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ComboSelectionDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ComboSelectionDialog.java
new file mode 100644
index 0000000..39075b2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ComboSelectionDialog.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * General purpose dialog for selecting an item from a combo box.
+ *
+ * @author This was (essentially) copied from Eclipse's internal implementation by Wesley Coelho
+ */
+public class ComboSelectionDialog extends Dialog {
+
+ private String fSelection = null;
+
+ private final String fShellTitle;
+
+ private final String fLabelText;
+
+ private final String[] fAllowedStrings;
+
+ private final int fInitialSelectionIndex;
+
+ private int fSelectedIndex = -1;
+
+ public ComboSelectionDialog(Shell parentShell, String shellTitle, String labelText, String[] comboStrings,
+ int initialSelectionIndex) {
+ super(parentShell);
+ fShellTitle = shellTitle;
+ fLabelText = labelText;
+ fAllowedStrings = comboStrings;
+ fInitialSelectionIndex = initialSelectionIndex;
+ }
+
+ public String getSelectedString() {
+ return fSelection;
+ }
+
+ /*
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ getShell().setText(fShellTitle);
+
+ Composite composite = (Composite) super.createDialogArea(parent);
+ Composite innerComposite = new Composite(composite, SWT.NONE);
+ innerComposite.setLayoutData(new GridData());
+ GridLayout gl = new GridLayout();
+ gl.numColumns = 2;
+ innerComposite.setLayout(gl);
+
+ Label label = new Label(innerComposite, SWT.NONE);
+ label.setText(fLabelText);
+ label.setLayoutData(new GridData());
+
+ final Combo combo = new Combo(innerComposite, SWT.READ_ONLY);
+ for (String allowedString : fAllowedStrings) {
+ combo.add(allowedString);
+ }
+ combo.select(fInitialSelectionIndex);
+ fSelection = combo.getItem(combo.getSelectionIndex());
+ GridData gd = new GridData();
+ gd.widthHint = convertWidthInCharsToPixels(getMaxStringLength());
+ combo.setLayoutData(gd);
+ combo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ fSelection = combo.getItem(combo.getSelectionIndex());
+ fSelectedIndex = combo.getSelectionIndex();
+ }
+ });
+ applyDialogFont(composite);
+ return composite;
+ }
+
+ /**
+ * Returns the array index of the selected string or -1 if no string was selected.
+ */
+ public int getSelectedIndex() {
+ return fSelectedIndex;
+ }
+
+ private int getMaxStringLength() {
+ int max = 0;
+ for (String allowedString : fAllowedStrings) {
+ max = Math.max(max, allowedString.length());
+ }
+ return max;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/DialogErrorReporter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/DialogErrorReporter.java
new file mode 100644
index 0000000..5678368
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/DialogErrorReporter.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.mylyn.commons.core.AbstractErrorReporter;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class DialogErrorReporter extends AbstractErrorReporter {
+
+ private boolean errorDialogOpen;
+
+ @Override
+ public int getPriority(IStatus status) {
+ return AbstractErrorReporter.PRIORITY_LOW;
+ }
+
+ @Override
+ public void handle(final IStatus status) {
+ if (Platform.isRunning()) {
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null) {
+ Display display = workbench.getDisplay();
+ if (display != null && !display.isDisposed()) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ try {
+ if (!errorDialogOpen) {
+ errorDialogOpen = true;
+ Shell shell = Display.getDefault().getActiveShell();
+ ErrorDialog.openError(shell, Messages.DialogErrorReporter_Mylyn_Error, Messages.DialogErrorReporter_Please_report_the_following_error_at, status);
+ }
+ } finally {
+ errorDialogOpen = false;
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/IDynamicSubMenuContributor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/IDynamicSubMenuContributor.java
new file mode 100644
index 0000000..530495e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/IDynamicSubMenuContributor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.List;
+
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+
+/**
+ * @author Mik Kersten
+ */
+// TODO 4.0 replace by platform contribution mechanism
+public interface IDynamicSubMenuContributor {
+
+ public abstract MenuManager getSubMenuManager(List<IRepositoryElement> selectedElements);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskCommandIds.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskCommandIds.java
new file mode 100644
index 0000000..9f525f6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskCommandIds.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+/**
+ * @author Willian Mitsuda
+ * @author Mik Kersten
+ */
+public interface ITaskCommandIds {
+
+ public static final String OPEN_TASK = "org.eclipse.mylyn.tasks.ui.command.openTask"; //$NON-NLS-1$
+
+ public static final String OPEN_TASK_REMOTE = "org.eclipse.mylyn.tasks.ui.command.openRemoteTask"; //$NON-NLS-1$
+
+ public static final String ACTIVATE_TASK = "org.eclipse.mylyn.tasks.ui.command.activateTask"; //$NON-NLS-1$
+
+ public static final String DEACTIVATE_TASK = "org.eclipse.mylyn.tasks.ui.command.deactivateAllTasks"; //$NON-NLS-1$
+
+ public static final String ADD_TASK_REPOSITORY = "org.eclipse.mylyn.tasks.ui.command.addTaskRepository"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskHighlighter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskHighlighter.java
new file mode 100644
index 0000000..a0c72da
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskHighlighter.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.graphics.Color;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITaskHighlighter {
+
+ public Color getHighlightColor(ITask task);
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskListNotificationProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskListNotificationProvider.java
new file mode 100644
index 0000000..78e7b42
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITaskListNotificationProvider.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+
+/**
+ * @author Rob Elves
+ */
+public interface ITaskListNotificationProvider {
+
+ public Set<AbstractNotification> getNotifications();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java
new file mode 100644
index 0000000..554271d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ITasksUiPreferenceConstants.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Mik Kersten
+ */
+public interface ITasksUiPreferenceConstants {
+
+ public static final String ACTIVATE_MULTIPLE = "org.eclipse.mylyn.tasks.ui.activation.multipe"; //$NON-NLS-1$
+
+ public static final String ACTIVATE_WHEN_OPENED = "org.eclipse.mylyn.tasks.ui.activate.when.opened"; //$NON-NLS-1$
+
+ public static final String SHOW_TRIM = "org.eclipse.mylyn.tasks.ui.show.trim"; //$NON-NLS-1$
+
+ /**
+ * @deprecated not used anymore, see {@link TaskListBackupManager}
+ */
+ @Deprecated
+ public static final String BACKUP_LAST = "org.eclipse.mylyn.tasks.ui.backup.last"; //$NON-NLS-1$
+
+ /**
+ * @deprecated not used anymore, see {@link TaskListBackupManager}
+ */
+ @Deprecated
+ public static final String BACKUP_MAXFILES = "org.eclipse.mylyn.tasks.ui.backup.maxfiles"; //$NON-NLS-1$
+
+ /**
+ * @deprecated not used anymore, see {@link TaskListBackupManager}
+ */
+ @Deprecated
+ public static final String BACKUP_SCHEDULE = "org.eclipse.mylyn.tasks.ui.backup.schedule"; //$NON-NLS-1$
+
+ public static final String FILTER_ARCHIVE_MODE = "org.eclipse.mylyn.tasks.ui.filters.archive"; //$NON-NLS-1$
+
+ public static final String FILTER_COMPLETE_MODE = "org.eclipse.mylyn.tasks.ui.filters.complete"; //$NON-NLS-1$
+
+ public static final String FILTER_PRIORITY = "org.eclipse.mylyn.tasks.ui.filters.priority"; //$NON-NLS-1$
+
+ public static final String GROUP_SUBTASKS = "org.eclipse.mylyn.tasks.ui.group.subtasks"; //$NON-NLS-1$
+
+ public static final String OVERLAYS_INCOMING_TIGHT = "org.eclipse.mylyn.tasks.ui.overlays.incoming.tight"; //$NON-NLS-1$
+
+ public static final String NOTIFICATIONS_ENABLED = "org.eclipse.mylyn.tasks.ui.notifications.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$
+
+ public static final String EDITOR_TASKS_RICH = "org.eclipse.mylyn.tasks.ui.reporting.open.editor"; //$NON-NLS-1$
+
+ public static final String USE_STRIKETHROUGH_FOR_COMPLETED = "org.eclipse.mylyn.tasks.ui.strikethrough.for.completed"; //$NON-NLS-1$
+
+ public static final String REPOSITORY_SYNCH_SCHEDULE_ENABLED = "org.eclipse.mylyn.tasks.ui.repositories.synch.schedule"; //$NON-NLS-1$
+
+ public static final String REPOSITORY_SYNCH_SCHEDULE_MILISECONDS = "org.eclipse.mylyn.tasks.ui.repositories.synch.schedule.miliseconds"; //$NON-NLS-1$
+
+ public static final String TEMPLATES_DELETED = "org.eclipse.mylyn.tasks.ui.templates.deleted"; //$NON-NLS-1$
+
+ public static final String TEMPLATES_DELETED_DELIM = "|"; //$NON-NLS-1$
+
+ public static final String AUTO_EXPAND_TASK_LIST = "org.eclipse.mylyn.tasks.ui.auto.expand"; //$NON-NLS-1$
+
+ /**
+ * Local subtasks are now enabled by default.
+ *
+ * @deprecated not used anymore
+ */
+ // TODO 4.0 remove
+ @Deprecated
+ public static final String LOCAL_SUB_TASKS_ENABLED = "org.eclipse.mylyn.tasks.ui.subtasks.local"; //$NON-NLS-1$
+
+ // NOTE: legacy name, do not change
+ 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$
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryConnectorUi.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryConnectorUi.java
new file mode 100644
index 0000000..126a58d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/LocalRepositoryConnectorUi.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.LocalRepositorySettingsPage;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewLocalTaskWizard;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class LocalRepositoryConnectorUi extends AbstractRepositoryConnectorUi {
+
+ @Override
+ public ImageDescriptor getTaskKindOverlay(ITask task) {
+ return super.getTaskKindOverlay(task);
+ }
+
+ @Override
+ public IWizard getNewTaskWizard(TaskRepository taskRepository, ITaskMapping selection) {
+ return new NewLocalTaskWizard(selection);
+ }
+
+ @Override
+ public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery queryToEdit) {
+ return null;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return LocalRepositoryConnector.CONNECTOR_KIND;
+ }
+
+ @Override
+ public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) {
+ return new LocalRepositorySettingsPage(taskRepository);
+ }
+
+ @Override
+ public boolean hasSearchPage() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java
new file mode 100644
index 0000000..b53269f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/Messages.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ActivityExternalizationParticipant_Activity_Context;
+
+ public static String AddExistingTaskJob_Adding_task_X_;
+
+ public static String ChangeActivityHandleOperation_Activity_migration;
+
+ public static String DialogErrorReporter_Mylyn_Error;
+
+ public static String DialogErrorReporter_Please_report_the_following_error_at;
+
+ public static String MoveToCategoryMenuContributor_Move_to;
+
+ public static String OpenRepositoryTaskJob_Could_not_find_repository_configuration_for_X;
+
+ public static String OpenRepositoryTaskJob_Opening_Remote_Task;
+
+ public static String OpenRepositoryTaskJob_Opening_repository_task_X;
+
+ public static String OpenRepositoryTaskJob_Please_set_up_repository_via_X;
+
+ public static String OpenRepositoryTaskJob_Repository_Not_Found;
+
+ public static String OpenRepositoryTaskJob_Unable_to_open_task;
+
+ public static String RefactorRepositoryUrlOperation_Repository_URL_update;
+
+ public static String ScheduleTaskMenuContributor_Cannot_schedule_completed_tasks;
+
+ public static String ScheduleTaskMenuContributor_Choose_Date_;
+
+ public static String ScheduleTaskMenuContributor_Future;
+
+ public static String ScheduleTaskMenuContributor_Not_Scheduled;
+
+ public static String ScheduleTaskMenuContributor_Schedule_for;
+
+ public static String TaskHistoryDropDown_Activate_Task_;
+
+ public static String TaskHistoryDropDown_Deactivate_Task;
+
+ public static String TaskJobFactory_Receiving_configuration;
+
+ public static String TaskJobFactory_Refreshing_repository_configuration;
+
+ public static String TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup;
+
+ public static String TaskListBackupManager_Scheduled_task_data_backup;
+
+ public static String TaskListNotificationManager_Open_Notification_Job;
+
+ public static String TaskRepositoryLocationUi_Enter_HTTP_password;
+
+ public static String TaskRepositoryLocationUi_Enter_proxy_password;
+
+ public static String TaskRepositoryLocationUi_Enter_repository_password;
+
+ public static String TaskSearchPage_ERROR_Unable_to_present_query_page;
+
+ public static String TaskSearchPage_No_task_found_matching_key_;
+
+ public static String TaskSearchPage_Repository_Search;
+
+ public static String TaskSearchPage_Select_Repository_;
+
+ public static String TaskSearchPage_Task_Key_ID;
+
+ public static String TaskSearchPage_Task_Search;
+
+ public static String TasksReminderDialog_Description;
+
+ public static String TasksReminderDialog_Dismiss_All;
+
+ public static String TasksReminderDialog_Dismiss_Selected;
+
+ public static String TasksReminderDialog_Priority;
+
+ public static String TasksReminderDialog_Remind_tommorrow;
+
+ public static String TasksReminderDialog_Reminder_Day;
+
+ public static String TasksReminderDialog_Reminders;
+
+ public static String TasksUiPlugin_Initializing_Task_List;
+
+ public static String TasksUiPlugin_Task_Repositories;
+
+ public static String TasksUiPlugin_Load_Data_Directory;
+
+ public static String TaskTrimWidget__no_active_task_;
+
+ public static String TaskTrimWidget__no_task_active_;
+
+ public static String AbstractRepositoryConnectorUi_Task;
+
+ public static String TaskElementLabelProvider__no_summary_available_;
+
+ public static String TaskHyperlink_Could_not_determine_repository_for_report;
+
+ public static String TaskHyperlink_Open_Task_X_in_X;
+
+ public static String AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL;
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/MoveToCategoryMenuContributor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/MoveToCategoryMenuContributor.java
new file mode 100644
index 0000000..5c33956
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/MoveToCategoryMenuContributor.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Raphael Ackermann - bug 160315
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewCategoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskContainerComparator;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class MoveToCategoryMenuContributor implements IDynamicSubMenuContributor {
+
+ public MenuManager getSubMenuManager(final List<IRepositoryElement> selectedElements) {
+ final MenuManager subMenuManager = new MenuManager(Messages.MoveToCategoryMenuContributor_Move_to);
+
+ // Compute selected tasks
+ List<AbstractTask> selectedTasks = new ArrayList<AbstractTask>(selectedElements.size());
+ for (IRepositoryElement element : selectedElements) {
+ if (element instanceof ITask) {
+ selectedTasks.add((AbstractTask) element);
+ }
+ }
+ subMenuManager.setVisible(!selectedTasks.isEmpty());
+
+ List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(TasksUiInternal.getTaskList()
+ .getCategories());
+ Collections.sort(categories, new TaskContainerComparator());
+ for (final AbstractTaskCategory category : categories) {
+ if (!(category instanceof UnmatchedTaskContainer)) {
+ String text = handleAcceleratorKeys(category.getSummary());
+ Action action = new Action(text, IAction.AS_RADIO_BUTTON) {
+ @Override
+ public void run() {
+ moveToCategory(selectedElements, category);
+ }
+ };
+ action.setImageDescriptor(TasksUiImages.CATEGORY);
+ if (selectedTasks.size() == 1) {
+ if (category.contains(selectedTasks.get(0).getHandleIdentifier())) {
+ action.setChecked(true);
+ }
+ }
+ subMenuManager.add(action);
+ }
+ }
+ // add New Category action at the end of the Move to Category Submenu
+ // and move selected actions to this newly created category
+ Action action = new NewCategoryAction() {
+ @Override
+ public void run() {
+ TaskCategory category = createCategory();
+ if (category != null) {
+ moveToCategory(selectedElements, category);
+ }
+ }
+ };
+ subMenuManager.add(new Separator());
+ subMenuManager.add(action);
+ return subMenuManager;
+ }
+
+ /**
+ * public for testing
+ *
+ * Deals with text where user has entered a '@' or tab character but which are not meant to be accelerators. from:
+ * Action#setText: Note that if you want to insert a '@' character into the text (but no accelerator, you can simply
+ * insert a '@' or a tab at the end of the text. see Action#setText
+ */
+ public String handleAcceleratorKeys(String text) {
+ if (text == null) {
+ return null;
+ }
+
+ int index = text.lastIndexOf('\t');
+ if (index == -1) {
+ index = text.lastIndexOf('@');
+ }
+ if (index >= 0) {
+ return text.concat("@"); //$NON-NLS-1$
+ }
+ return text;
+ }
+
+ /**
+ * @param selectedElements
+ * @param category
+ */
+ private void moveToCategory(final List<IRepositoryElement> selectedElements, AbstractTaskCategory category) {
+ for (IRepositoryElement element : selectedElements) {
+ if (element instanceof ITask) {
+ TasksUiInternal.getTaskList().addTask((AbstractTask) element, category);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/OpenRepositoryTaskJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/OpenRepositoryTaskJob.java
new file mode 100644
index 0000000..76265b2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/OpenRepositoryTaskJob.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.text.MessageFormat;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class OpenRepositoryTaskJob extends Job {
+
+ private final String repositoryUrl;
+
+ private final String repositoryKind;
+
+ private final String taskId;
+
+ private final String taskUrl;
+
+ private ITask task;
+
+ public OpenRepositoryTaskJob(String repositoryKind, String repositoryUrl, String taskId, String taskUrl,
+ IWorkbenchPage page) {
+ super(MessageFormat.format(Messages.OpenRepositoryTaskJob_Opening_repository_task_X, taskId));
+
+ this.repositoryKind = repositoryKind;
+ this.taskId = taskId;
+ this.repositoryUrl = repositoryUrl;
+ this.taskUrl = taskUrl;
+ }
+
+ /**
+ * Returns the task if it was created when openeing
+ *
+ * @return
+ */
+ public ITask getTask() {
+ return task;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ monitor.beginTask(Messages.OpenRepositoryTaskJob_Opening_Remote_Task, 10);
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(repositoryKind, repositoryUrl);
+ if (repository == null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, Messages.OpenRepositoryTaskJob_Repository_Not_Found,
+ MessageFormat.format(
+ Messages.OpenRepositoryTaskJob_Could_not_find_repository_configuration_for_X,
+ repositoryUrl)
+ + "\n" + //$NON-NLS-1$
+ MessageFormat.format(Messages.OpenRepositoryTaskJob_Please_set_up_repository_via_X,
+ Messages.TasksUiPlugin_Task_Repositories));
+ TasksUiUtil.openUrl(taskUrl);
+ }
+
+ });
+ return Status.OK_STATUS;
+ }
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(repositoryKind);
+ try {
+ TaskData taskData = connector.getTaskData(repository, taskId, monitor);
+ if (taskData != null) {
+ task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
+ TasksUiPlugin.getTaskDataManager().putUpdatedTaskData(task, taskData, true);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(task);
+ }
+ });
+ } else {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openUrl(taskUrl);
+ }
+ });
+ }
+ } catch (final CoreException e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.displayStatus(Messages.OpenRepositoryTaskJob_Unable_to_open_task, e.getStatus());
+ }
+ });
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonContentProposal.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonContentProposal.java
new file mode 100644
index 0000000..d8fc305
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonContentProposal.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class PersonContentProposal implements IContentProposal, Comparable<PersonContentProposal> {
+
+ private final String address;
+
+ private final boolean isCurrentUser;
+
+ private final String replacementText;
+
+ private final int cursorPosition;
+
+ public PersonContentProposal(String address, boolean isCurrentUser, String replacementText, int cursorPosition) {
+ Assert.isNotNull(address);
+ Assert.isNotNull(replacementText);
+ this.address = address;
+ this.isCurrentUser = isCurrentUser;
+ this.replacementText = replacementText;
+ this.cursorPosition = cursorPosition;
+ }
+
+ public PersonContentProposal(String address, boolean isCurrentUser) {
+ this(address, isCurrentUser, address, address.length());
+ }
+
+ public String getLabel() {
+ return address;
+ }
+
+ public String getDescription() {
+ return null;
+ }
+
+ public int getCursorPosition() {
+ return cursorPosition;
+ }
+
+ public String getContent() {
+ return replacementText;
+ }
+
+ public Image getImage() {
+ if (isCurrentUser) {
+ return CommonImages.getImage(CommonImages.PERSON_ME);
+ } else {
+ return CommonImages.getImage(CommonImages.PERSON);
+ }
+ }
+
+ public int compareTo(PersonContentProposal otherContentProposal) {
+ if (isCurrentUser) {
+ return -1;
+ } else if (otherContentProposal.isCurrentUser) {
+ return 1;
+ }
+ return address.compareToIgnoreCase(otherContentProposal.address);
+ }
+
+ public boolean isCurrentUser() {
+ return isCurrentUser;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonProposalLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonProposalLabelProvider.java
new file mode 100644
index 0000000..16bcdca
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonProposalLabelProvider.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Shawn Minto
+ */
+public class PersonProposalLabelProvider extends LabelProvider {
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof PersonContentProposal) {
+ return ((PersonContentProposal) element).getImage();
+ }
+ return null;
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof PersonContentProposal) {
+ return ((PersonContentProposal) element).getLabel();
+ }
+ return super.getText(element);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonProposalProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonProposalProvider.java
new file mode 100644
index 0000000..4df515f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PersonProposalProvider.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Shawn Minto
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ */
+public class PersonProposalProvider implements IContentProposalProvider {
+
+ private final AbstractTask currentTask;
+
+ private String currentUser;
+
+ private SortedSet<String> addressSet = null;
+
+ private String repositoryUrl;
+
+ private String connectorKind;
+
+ private TaskData currentTaskData;
+
+ public PersonProposalProvider(AbstractTask task, TaskData taskData) {
+ this.currentTask = task;
+ this.currentTaskData = taskData;
+ if (task != null) {
+ repositoryUrl = task.getRepositoryUrl();
+ connectorKind = task.getConnectorKind();
+ } else if (taskData != null) {
+ repositoryUrl = taskData.getRepositoryUrl();
+ connectorKind = taskData.getConnectorKind();
+ }
+ }
+
+ public PersonProposalProvider(String repositoryUrl, String repositoryKind) {
+ this.currentTask = null;
+ this.repositoryUrl = repositoryUrl;
+ this.connectorKind = repositoryKind;
+ }
+
+ public IContentProposal[] getProposals(String contents, int position) {
+ if (contents == null) {
+ throw new IllegalArgumentException();
+ }
+
+ int leftSeparator = getIndexOfLeftSeparator(contents, position);
+ int rightSeparator = getIndexOfRightSeparator(contents, position);
+
+ assert leftSeparator <= position;
+ assert position <= rightSeparator;
+
+ String searchText = contents.substring(leftSeparator + 1, position);
+ String resultPrefix = contents.substring(0, leftSeparator + 1);
+ String resultPostfix = contents.substring(rightSeparator);
+
+ // retrieve subset of the tree set using key range
+ SortedSet<String> addressSet = getAddressSet();
+ if (!searchText.equals("")) { //$NON-NLS-1$
+ searchText = searchText.toLowerCase();
+ char[] nextWord = searchText.toCharArray();
+ nextWord[searchText.length() - 1]++;
+ addressSet = addressSet.subSet(searchText, new String(nextWord));
+ }
+
+ IContentProposal[] result = new IContentProposal[addressSet.size()];
+ int i = 0;
+ for (final String address : addressSet) {
+ result[i++] = new PersonContentProposal(address, address.equalsIgnoreCase(currentUser), resultPrefix
+ + address + resultPostfix, resultPrefix.length() + address.length());
+ }
+ Arrays.sort(result);
+ return result;
+ }
+
+ private int getIndexOfLeftSeparator(String contents, int position) {
+ int i = contents.lastIndexOf(' ', position - 1);
+ i = Math.max(contents.lastIndexOf(',', position - 1), i);
+ return i;
+ }
+
+ private int getIndexOfRightSeparator(String contents, int position) {
+ int index = contents.length();
+ int i = contents.indexOf(' ', position);
+ if (i != -1) {
+ index = Math.min(i, index);
+ }
+ i = contents.indexOf(',', position);
+ if (i != -1) {
+ index = Math.min(i, index);
+ }
+ return index;
+ }
+
+ private SortedSet<String> getAddressSet() {
+ if (addressSet != null) {
+ return addressSet;
+ }
+
+ addressSet = new TreeSet<String>(new Comparator<String>() {
+ public int compare(String s1, String s2) {
+ return s1.compareToIgnoreCase(s2);
+ }
+ });
+
+ if (currentTask != null) {
+ addAddress(currentTask.getOwner(), addressSet);
+ }
+
+ if (currentTaskData != null) {
+ addAddresses(currentTaskData, addressSet);
+ }
+
+ if (repositoryUrl != null && connectorKind != null) {
+ Set<AbstractTask> tasks = new HashSet<AbstractTask>();
+ if (currentTask != null) {
+ tasks.add(currentTask);
+ }
+
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(connectorKind, repositoryUrl);
+
+ if (repository != null) {
+ AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ if (credentials != null && credentials.getUserName().length() > 0) {
+ currentUser = credentials.getUserName();
+ addressSet.add(currentUser);
+ }
+ }
+
+ Collection<AbstractTask> allTasks = TasksUiPlugin.getTaskList().getAllTasks();
+ for (AbstractTask task : allTasks) {
+ if (repositoryUrl.equals(task.getRepositoryUrl())) {
+ tasks.add(task);
+ }
+ }
+
+ for (ITask task : tasks) {
+ addAddresses(task, addressSet);
+ }
+ }
+
+ return addressSet;
+ }
+
+ private void addAddresses(ITask task, Set<String> addressSet) {
+ // TODO: Creator, and CC should be stored on AbstractTask
+
+ addAddress(task.getOwner(), addressSet);
+ }
+
+ // TODO 3.3 re-implement
+ private void addAddresses(TaskData data, Set<String> addressSet) {
+ // addressSet.add(data.getAssignedTo()); // owner
+ // addAddress(data.getReporter(), addressSet); // ??
+// for (String address : data.getCc()) {
+// addAddress(address, addressSet);
+// }
+// for (TaskComment comment : currentTaskData.getComments()) {
+// addAddress(comment.getAuthor(), addressSet);
+// }
+// for (RepositoryAttachment attachment : currentTaskData.getAttachments()) {
+// addAddress(attachment.getCreator(), addressSet);
+// }
+ }
+
+ private void addAddress(String address, Set<String> addressSet) {
+ if (address != null && address.trim().length() > 0) {
+ addressSet.add(address.trim());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PlanningPerspectiveFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PlanningPerspectiveFactory.java
new file mode 100644
index 0000000..71ec8e7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/PlanningPerspectiveFactory.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.internal.PageLayout;
+
+/**
+ * @author Mik Kersten
+ */
+public class PlanningPerspectiveFactory implements IPerspectiveFactory {
+
+ public void createInitialLayout(IPageLayout layout) {
+ defineActions(layout);
+ defineLayout(layout);
+ }
+
+ public void defineActions(IPageLayout layout) {
+ layout.addShowViewShortcut(IPageLayout.ID_RES_NAV);
+ layout.addShowViewShortcut(IPageLayout.ID_PROP_SHEET);
+ layout.addShowViewShortcut(ITasksUiConstants.ID_VIEW_TASKS);
+ // layout.addShowViewShortcut(TaskActivityView.ID);
+
+ layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
+ removeUninterestingActionSets(layout);
+ }
+
+ public void defineLayout(IPageLayout layout) {
+ String editorArea = layout.getEditorArea();
+
+ IFolderLayout topRight = layout.createFolder("topRight", IPageLayout.RIGHT, (float) 0.6, editorArea);//$NON-NLS-1$
+ topRight.addView(ITasksUiConstants.ID_VIEW_TASKS);
+
+ // IFolderLayout bottomLeft = layout.createFolder(
+ // "bottomLeft", IPageLayout.BOTTOM, (float) 0.50,//$NON-NLS-1$
+ // "topLeft");//$NON-NLS-1$
+ // bottomLeft.addView(TaskActivityView.ID);
+ topRight.addPlaceholder(IPageLayout.ID_RES_NAV);
+
+ // IFolderLayout bottomRight = layout.createFolder(
+ // "bottomRight", IPageLayout.BOTTOM, (float) 0.66,//$NON-NLS-1$
+ // editorArea);
+ //
+ // bottomRight.addView(IPageLayout.ID_TASK_LIST);
+
+ }
+
+ @SuppressWarnings("unchecked")
+ public static void removeUninterestingActionSets(IPageLayout layout) {
+ ArrayList actionSets = ((PageLayout) layout).getActionSets();
+ actionSets.remove("org.eclipse.ui.edit.text.actionSet.annotationNavigation"); //$NON-NLS-1$
+ actionSets.remove("org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo"); //$NON-NLS-1$
+ actionSets.remove("org.eclipse.ui.externaltools.ExternalToolsSet"); //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java
new file mode 100644
index 0000000..58b1a29
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/RefactorRepositoryUrlOperation.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URLDecoder;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.context.core.InteractionContext;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Rob Elves
+ */
+public class RefactorRepositoryUrlOperation extends TaskListModifyOperation {
+
+ private final String oldUrl;
+
+ private final String newUrl;
+
+ public RefactorRepositoryUrlOperation(String oldUrl, String newUrl) {
+ super(ITasksCoreConstants.ROOT_SCHEDULING_RULE);
+ Assert.isNotNull(oldUrl);
+ Assert.isNotNull(newUrl);
+ Assert.isTrue(!oldUrl.equals(newUrl));
+ this.oldUrl = oldUrl;
+ this.newUrl = newUrl;
+ }
+
+ @Override
+ protected void operations(IProgressMonitor monitor) throws CoreException, InvocationTargetException,
+ InterruptedException {
+ try {
+ //TasksUiPlugin.getTaskListManager().deactivateAllTasks();
+ monitor.beginTask(Messages.RefactorRepositoryUrlOperation_Repository_URL_update, IProgressMonitor.UNKNOWN);
+ refactorOfflineHandles(oldUrl, newUrl);
+ getTaskList().refactorRepositoryUrl(oldUrl, newUrl);
+ refactorMetaContextHandles(oldUrl, newUrl);
+ refactorContextFileNames();
+ TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @SuppressWarnings("restriction")
+ public void refactorContextFileNames() {
+
+ File dataDir = new File(TasksUiPlugin.getDefault().getDataDirectory(), ITasksCoreConstants.CONTEXTS_DIRECTORY);
+ if (dataDir.exists() && dataDir.isDirectory()) {
+ File[] files = dataDir.listFiles();
+ if (files != null) {
+ for (File file : dataDir.listFiles()) {
+ int dotIndex = file.getName().lastIndexOf(".xml"); //$NON-NLS-1$
+ if (dotIndex != -1) {
+ String storedHandle;
+ try {
+ storedHandle = URLDecoder.decode(file.getName().substring(0, dotIndex),
+ InteractionContextManager.CONTEXT_FILENAME_ENCODING);
+ int delimIndex = storedHandle.lastIndexOf(RepositoryTaskHandleUtil.HANDLE_DELIM);
+ if (delimIndex != -1) {
+ String storedUrl = storedHandle.substring(0, delimIndex);
+ if (oldUrl.equals(storedUrl)) {
+ String id = RepositoryTaskHandleUtil.getTaskId(storedHandle);
+ String newHandle = RepositoryTaskHandleUtil.getHandle(newUrl, id);
+ File newFile = ContextCorePlugin.getContextStore().getFileForContext(newHandle);
+ file.renameTo(newFile);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not move context file: " + file.getName(), e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void refactorOfflineHandles(String oldRepositoryUrl, String newRepositoryUrl) throws CoreException {
+ TaskDataManager taskDataManager = TasksUiPlugin.getTaskDataManager();
+ for (ITask task : getTaskList().getAllTasks()) {
+ if (oldRepositoryUrl.equals(task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL))) {
+ taskDataManager.refactorRepositoryUrl(task, task.getRepositoryUrl(), newRepositoryUrl);
+ }
+ if (task.getRepositoryUrl().equals(oldRepositoryUrl)) {
+ taskDataManager.refactorRepositoryUrl(task, newRepositoryUrl, newRepositoryUrl);
+// RepositoryTaskData newTaskData = taskDataManager.getNewTaskData(repositoryTask.getRepositoryUrl(),
+// repositoryTask.getTaskId());
+// RepositoryTaskData oldTaskData = taskDataManager.getOldTaskData(repositoryTask.getRepositoryUrl(),
+// repositoryTask.getTaskId());
+// Set<RepositoryTaskAttribute> edits = taskDataManager.getEdits(repositoryTask.getRepositoryUrl(),
+// repositoryTask.getTaskId());
+// taskDataManager.remove(repositoryTask.getRepositoryUrl(), repositoryTask.getTaskId());
+//
+// if (newTaskData != null) {
+// newTaskData.setRepositoryURL(newRepositoryUrl);
+// taskDataManager.setNewTaskData(newTaskData);
+// }
+// if (oldTaskData != null) {
+// oldTaskData.setRepositoryURL(newRepositoryUrl);
+// taskDataManager.setOldTaskData(oldTaskData);
+// }
+// if (!edits.isEmpty()) {
+// taskDataManager.saveEdits(newRepositoryUrl, repositoryTask.getTaskId(), edits);
+// }
+ }
+ }
+// TasksUiPlugin.getTaskDataStorageManager().saveNow();
+ }
+
+ @SuppressWarnings("restriction")
+ private void refactorMetaContextHandles(String oldRepositoryUrl, String newRepositoryUrl) {
+ InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ ContextCorePlugin.getContextManager().resetActivityMetaContext();
+ InteractionContext newMetaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
+ for (InteractionEvent event : metaContext.getInteractionHistory()) {
+ if (event.getStructureHandle() != null) {
+ String storedUrl = RepositoryTaskHandleUtil.getRepositoryUrl(event.getStructureHandle());
+ if (storedUrl != null) {
+ if (oldRepositoryUrl.equals(storedUrl)) {
+ String taskId = RepositoryTaskHandleUtil.getTaskId(event.getStructureHandle());
+ if (taskId != null) {
+ String newHandle = RepositoryTaskHandleUtil.getHandle(newRepositoryUrl, taskId);
+ event = new InteractionEvent(event.getKind(), event.getStructureKind(), newHandle,
+ event.getOriginId(), event.getNavigation(), event.getDelta(),
+ event.getInterestContribution(), event.getDate(), event.getEndDate());
+ }
+ }
+ }
+ }
+ newMetaContext.parseEvent(event);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java
new file mode 100644
index 0000000..adb0d13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleDatePicker.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import com.ibm.icu.text.DateFormat;
+import com.ibm.icu.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Rob Elves
+ */
+public class ScheduleDatePicker extends Composite {
+
+ private Text scheduledDateText = null;
+
+ private Button pickButton = null;
+
+ private final List<SelectionListener> pickerListeners = new LinkedList<SelectionListener>();
+
+ private final SimpleDateFormat simpleDateFormat = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.MEDIUM);
+
+ private final String initialText = DatePicker.LABEL_CHOOSE;
+
+ private final List<IRepositoryElement> tasks;
+
+ private final ScheduleTaskMenuContributor contributor;
+
+ private DateRange scheduledDate;
+
+ private final boolean isFloating = false;
+
+ public ScheduleDatePicker(Composite parent, AbstractTask task, int style) {
+ super(parent, style);
+ if (task != null) {
+ if (task.getScheduledForDate() != null) {
+ this.scheduledDate = task.getScheduledForDate();
+ }
+ }
+
+ initialize((style & SWT.FLAT) > 0 ? SWT.FLAT : 0);
+ contributor = new ScheduleTaskMenuContributor() {
+
+ @Override
+ protected DateRange getScheduledForDate(AbstractTask singleTaskSelection) {
+ return ScheduleDatePicker.this.scheduledDate;
+ }
+
+ @Override
+ protected void setScheduledDate(DateRange dateRange) {
+ if (dateRange != null) {
+ scheduledDate = dateRange;
+ } else {
+ scheduledDate = null;
+ }
+ updateDateText();
+ notifyPickerListeners();
+ }
+ };
+ tasks = new ArrayList<IRepositoryElement>();
+ tasks.add(task);
+ }
+
+ public void setDatePattern(String pattern) {
+ simpleDateFormat.applyPattern(pattern);
+ }
+
+ private void initialize(int style) {
+
+ GridLayout gridLayout = new GridLayout(2, false);
+ gridLayout.horizontalSpacing = 0;
+ gridLayout.verticalSpacing = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ this.setLayout(gridLayout);
+
+ scheduledDateText = new Text(this, style);
+ scheduledDateText.setEditable(false);
+ GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false);
+ dateTextGridData.grabExcessHorizontalSpace = true;
+ dateTextGridData.widthHint = SWT.FILL;
+ dateTextGridData.verticalIndent = 0;
+
+ scheduledDateText.setLayoutData(dateTextGridData);
+ scheduledDateText.setText(initialText);
+
+ pickButton = new Button(this, style | SWT.ARROW | SWT.DOWN);
+ GridData pickButtonGridData = new GridData(SWT.RIGHT, SWT.FILL, false, true);
+ pickButtonGridData.verticalIndent = 0;
+ pickButton.setLayoutData(pickButtonGridData);
+ pickButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent arg0) {
+
+ MenuManager menuManager = contributor.getSubMenuManager(tasks);
+ Menu menu = menuManager.createContextMenu(pickButton);
+ pickButton.setMenu(menu);
+ menu.setVisible(true);
+ }
+ });
+
+ updateDateText();
+ pack();
+ }
+
+ public void addPickerSelectionListener(SelectionListener listener) {
+ pickerListeners.add(listener);
+ }
+
+ @Override
+ public void setForeground(Color color) {
+ pickButton.setForeground(color);
+ scheduledDateText.setForeground(color);
+ super.setForeground(color);
+ }
+
+ @Override
+ public void setBackground(Color backgroundColor) {
+ pickButton.setBackground(backgroundColor);
+ scheduledDateText.setBackground(backgroundColor);
+ super.setBackground(backgroundColor);
+ }
+
+ private void notifyPickerListeners() {
+ for (SelectionListener listener : pickerListeners) {
+ listener.widgetSelected(null);
+ }
+ }
+
+ private void updateDateText() {
+ if (scheduledDate != null) {
+ scheduledDateText.setText(scheduledDate.toString());
+ } else {
+ scheduledDateText.setEnabled(false);
+ scheduledDateText.setText(DatePicker.LABEL_CHOOSE);
+ scheduledDateText.setEnabled(true);
+ }
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ scheduledDateText.setEnabled(enabled);
+ pickButton.setEnabled(enabled);
+ super.setEnabled(enabled);
+ }
+
+ public DateRange getScheduledDate() {
+ return scheduledDate;
+ }
+
+ public void setScheduledDate(DateRange date) {
+ scheduledDate = date;
+ updateDateText();
+ }
+
+ public boolean isFloatingDate() {
+ return isFloating;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleTaskMenuContributor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleTaskMenuContributor.java
new file mode 100644
index 0000000..1533ed2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduleTaskMenuContributor.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DateSelectionDialog;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class ScheduleTaskMenuContributor implements IDynamicSubMenuContributor {
+
+ private AbstractTask singleTaskSelection;
+
+ private final List<IRepositoryElement> taskListElementsToSchedule = new ArrayList<IRepositoryElement>();
+
+ public MenuManager getSubMenuManager(final List<IRepositoryElement> selectedElements) {
+ singleTaskSelection = null;
+ taskListElementsToSchedule.clear();
+
+ final MenuManager subMenuManager = new MenuManager(Messages.ScheduleTaskMenuContributor_Schedule_for);
+
+ if (selectedElements.size() == 1) {
+ IRepositoryElement selectedElement = selectedElements.get(0);
+ if (selectedElement instanceof ITask) {
+ singleTaskSelection = (AbstractTask) selectedElement;
+ }
+ }
+
+ for (IRepositoryElement selectedElement : selectedElements) {
+ if (selectedElement instanceof ITask) {
+ taskListElementsToSchedule.add(selectedElement);
+ }
+ }
+
+ if (selectionIncludesCompletedTasks()) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ // ignore
+ }
+ };
+ action.setText(Messages.ScheduleTaskMenuContributor_Cannot_schedule_completed_tasks);
+ action.setEnabled(false);
+ subMenuManager.add(action);
+ return subMenuManager;
+ }
+
+ WeekDateRange week = TaskActivityUtil.getCurrentWeek();
+ int days = 0;
+ for (DateRange day : week.getDaysOfWeek()) {
+ if (day.includes(TaskActivityUtil.getCalendar())) {
+ days++;
+ // Today
+ Action action = createDateSelectionAction(day, CommonImages.SCHEDULE_DAY);
+ subMenuManager.add(action);
+ // Special case: Over scheduled tasks always 'scheduled' for today
+ if (singleTaskSelection != null && isPastReminder(singleTaskSelection)) {
+ action.setChecked(true);
+ }
+ } else if (day.after(TaskActivityUtil.getCalendar())) {
+ days++;
+ // Week Days
+ Action action = createDateSelectionAction(day, null);
+ subMenuManager.add(action);
+ }
+ }
+
+ // Next week days
+ int toAdd = 7 - days;
+ WeekDateRange nextWeek = TaskActivityUtil.getNextWeek();
+ for (int x = 0; x < toAdd; x++) {
+ int next = TasksUiPlugin.getTaskActivityManager().getWeekStartDay() + x;
+ if (next > Calendar.SATURDAY) {
+ next = x;
+ }
+ DateRange day = nextWeek.getDayOfWeek(next);
+ Action action = createDateSelectionAction(day, null);
+ subMenuManager.add(action);
+ }
+
+ subMenuManager.add(new Separator());
+
+ // This Week
+ Action action = createDateSelectionAction(week, CommonImages.SCHEDULE_WEEK);
+ subMenuManager.add(action);
+ // Special case: This Week holds previous weeks' scheduled tasks
+ if (singleTaskSelection != null && singleTaskSelection.getScheduledForDate() != null
+ && singleTaskSelection.getScheduledForDate() instanceof WeekDateRange
+ && singleTaskSelection.getScheduledForDate().isBefore(week)) {
+ // Tasks scheduled for 'someday' float into this week
+ action.setChecked(true);
+ }
+
+ // Next Week
+ action = createDateSelectionAction(week.next(), null);
+ subMenuManager.add(action);
+
+ // Two Weeks
+ action = createDateSelectionAction(week.next().next(), null);
+ subMenuManager.add(action);
+
+ if (singleTaskSelection != null && getScheduledForDate(singleTaskSelection) != null) {
+ // Update Two Weeks
+ DateRange range = getScheduledForDate(singleTaskSelection);
+ if (range.equals(TaskActivityUtil.getNextWeek().next())
+ || TaskActivityUtil.getNextWeek().next().includes(range)) {
+ action.setChecked(true);
+ }
+
+ // Future
+ if (getScheduledForDate(singleTaskSelection).after(week.next().next().getEndDate())
+ && !(getScheduledForDate(singleTaskSelection) instanceof WeekDateRange)) {
+ action = new Action() {
+ @Override
+ public void run() {
+ // ignore
+ }
+ };
+ action.setChecked(true);
+ action.setText(Messages.ScheduleTaskMenuContributor_Future);
+ subMenuManager.add(action);
+ }
+ }
+
+ subMenuManager.add(new Separator());
+
+ // Date Selection Dialog
+ action = new Action() {
+ @Override
+ public void run() {
+ Calendar theCalendar = TaskActivityUtil.getCalendar();
+ if (getScheduledForDate(singleTaskSelection) != null) {
+ theCalendar.setTime(getScheduledForDate(singleTaskSelection).getStartDate().getTime());
+ }
+ DateSelectionDialog reminderDialog = new DateSelectionDialog(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), theCalendar, DatePicker.TITLE_DIALOG, false, TasksUiPlugin.getDefault()
+ .getPreferenceStore()
+ .getInt(ITasksUiPreferenceConstants.PLANNING_ENDHOUR));
+ int result = reminderDialog.open();
+ if (result == Window.OK) {
+ DateRange range = null;
+ if (reminderDialog.getDate() != null) {
+ range = TaskActivityUtil.getDayOf(reminderDialog.getDate());
+ }
+
+ setScheduledDate(range);
+ }
+ }
+ };
+ action.setText(Messages.ScheduleTaskMenuContributor_Choose_Date_);
+ action.setEnabled(canSchedule());
+ subMenuManager.add(action);
+
+ action = new Action() {
+ @Override
+ public void run() {
+ setScheduledDate(null);
+ }
+ };
+ action.setText(Messages.ScheduleTaskMenuContributor_Not_Scheduled);
+ action.setChecked(false);
+ if (singleTaskSelection != null) {
+ if (getScheduledForDate(singleTaskSelection) == null) {
+ action.setChecked(true);
+ }
+ }
+ subMenuManager.add(action);
+ return subMenuManager;
+ }
+
+ private boolean selectionIncludesCompletedTasks() {
+ if (singleTaskSelection instanceof AbstractTask) {
+ if ((singleTaskSelection).isCompleted()) {
+ return true;
+ }
+ }
+
+ if (taskListElementsToSchedule.size() > 0) {
+ for (IRepositoryElement task : taskListElementsToSchedule) {
+ if (task instanceof AbstractTask) {
+ if (((AbstractTask) task).isCompleted()) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private Action createDateSelectionAction(final DateRange dateContainer, ImageDescriptor imageDescriptor) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ setScheduledDate(dateContainer);
+ }
+ };
+ action.setText(dateContainer.toString());
+ action.setImageDescriptor(imageDescriptor);
+ action.setEnabled(canSchedule());
+
+ DateRange scheduledDate = getScheduledForDate(singleTaskSelection);
+ if (scheduledDate != null) {
+ action.setChecked(dateContainer.equals(scheduledDate));
+ }
+ return action;
+ }
+
+ private boolean canSchedule() {
+ if (taskListElementsToSchedule.size() == 0) {
+ return true;
+ } else if (singleTaskSelection instanceof ITask) {
+ return ((!(singleTaskSelection).isCompleted()) || taskListElementsToSchedule.size() > 0);
+ } else {
+ return taskListElementsToSchedule.size() > 0;
+ }
+ }
+
+ protected void setScheduledDate(DateRange dateContainer) {
+ for (IRepositoryElement element : taskListElementsToSchedule) {
+ if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+ if (dateContainer != null) {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(task, dateContainer);
+ } else {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(task, null);
+ }
+ }
+ }
+ }
+
+ protected DateRange getScheduledForDate(final AbstractTask selectedTask) {
+ if (selectedTask != null) {
+ return selectedTask.getScheduledForDate();
+ }
+ return null;
+ }
+
+ private boolean isPastReminder(AbstractTask task) {
+ return TasksUiPlugin.getTaskActivityManager().isPastReminder(task);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledPresentation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledPresentation.java
new file mode 100644
index 0000000..fafdfaf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/ScheduledPresentation.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider;
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider;
+
+/**
+ * @author Mik Kersten
+ */
+public class ScheduledPresentation extends AbstractTaskListPresentation {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.scheduled"; //$NON-NLS-1$
+
+ public ScheduledPresentation() {
+ super(ID);
+ }
+
+ @Override
+ public AbstractTaskListContentProvider createContentProvider(TaskListView taskListView) {
+ return new TaskScheduleContentProvider(taskListView);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskActivityMonitor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskActivityMonitor.java
new file mode 100644
index 0000000..dc85e2f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskActivityMonitor.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Monitors task activity and maintains task activation history
+ *
+ * @author Robert Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+ at SuppressWarnings("restriction")
+public class TaskActivityMonitor {
+
+ private final InteractionContextManager contextManager;
+
+ private final TaskActivityManager taskActivityManager;
+
+ private final TaskList taskList;
+
+ private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case INTEREST_CHANGED:
+ List<InteractionEvent> events = contextManager.getActivityMetaContext().getInteractionHistory();
+ if (events.size() > 0) {
+ InteractionEvent interactionEvent = events.get(events.size() - 1);
+ parseInteractionEvent(interactionEvent, false);
+ }
+ break;
+ }
+ }
+ };
+
+ private ActivityExternalizationParticipant externalizationParticipant;
+
+ public TaskActivityMonitor(TaskActivityManager taskActivityManager, InteractionContextManager contextManager) {
+ this.taskActivityManager = taskActivityManager;
+ this.contextManager = contextManager;
+ this.taskList = TasksUiPlugin.getTaskList();
+ }
+
+ public void start() {
+ contextManager.addActivityMetaContextListener(CONTEXT_LISTENER);
+ }
+
+ /** public for testing */
+ public boolean parseInteractionEvent(InteractionEvent event, boolean isReloading) {
+ try {
+ if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
+ if ((event.getDelta().equals(InteractionContextManager.ACTIVITY_DELTA_ACTIVATED))) {
+ AbstractTask activatedTask = taskList.getTask(event.getStructureHandle());
+ if (activatedTask != null) {
+ taskActivityManager.getTaskActivationHistory().addTask(activatedTask);
+ return true;
+ }
+ }
+ } else if (event.getKind().equals(InteractionEvent.Kind.ATTENTION)) {
+ if ((event.getDelta().equals("added") || event.getDelta().equals("add"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ if (event.getDate().getTime() > 0 && event.getEndDate().getTime() > 0) {
+ if (event.getStructureKind()
+ .equals(InteractionContextManager.ACTIVITY_STRUCTUREKIND_WORKINGSET)) {
+ taskActivityManager.addWorkingSetElapsedTime(event.getStructureHandle(), event.getDate(),
+ event.getEndDate());
+ if (!isReloading) {
+ externalizationParticipant.setDirty(true);
+ // save not requested for working set time updates so...
+ externalizationParticipant.elapsedTimeUpdated(null, 0);
+ }
+ } else {
+ AbstractTask activatedTask = taskList.getTask(event.getStructureHandle());
+ if (activatedTask != null) {
+ taskActivityManager.addElapsedTime(activatedTask, event.getDate(), event.getEndDate());
+ }
+ }
+ }
+ } else if (event.getDelta().equals("removed")) { //$NON-NLS-1$
+ ITask task = taskList.getTask(event.getStructureHandle());
+ if (task != null) {
+ taskActivityManager.removeElapsedTime(task, event.getDate(), event.getEndDate());
+ }
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Error parsing interaction event", t)); //$NON-NLS-1$
+ }
+ return false;
+ }
+
+ public void stop() {
+ contextManager.removeActivityMetaContextListener(CONTEXT_LISTENER);
+ }
+
+ public void reloadActivityTime() {
+ taskActivityManager.clearActivity();
+ List<InteractionEvent> events = contextManager.getActivityMetaContext().getInteractionHistory();
+ for (InteractionEvent event : events) {
+ parseInteractionEvent(event, true);
+ }
+ }
+
+ /**
+ * Returns the task corresponding to the interaction event history item at the specified position
+ */
+ protected ITask getHistoryTaskAt(int pos) {
+ InteractionEvent event = contextManager.getActivityMetaContext().getInteractionHistory().get(pos);
+ if (event.getDelta().equals(InteractionContextManager.ACTIVITY_DELTA_ACTIVATED)) {
+ return TasksUiPlugin.getTaskList().getTask(event.getStructureHandle());
+ } else {
+ return null;
+ }
+ }
+
+ public void setExternalizationParticipant(ActivityExternalizationParticipant participant) {
+ this.externalizationParticipant = participant;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskArchiveFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskArchiveFilter.java
new file mode 100644
index 0000000..7660c84
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskArchiveFilter.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskArchiveFilter extends AbstractTaskListFilter {
+
+ @Override
+ public boolean select(Object parent, Object element) {
+
+ if (element instanceof UnmatchedTaskContainer) {
+ if (((UnmatchedTaskContainer) element).isEmpty()) {
+ return false;
+ }
+ }
+ if (element instanceof UnsubmittedTaskContainer) {
+ if (((UnsubmittedTaskContainer) element).isEmpty()) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskCompletionFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskCompletionFilter.java
new file mode 100644
index 0000000..7a1a91d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskCompletionFilter.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collection;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class TaskCompletionFilter extends AbstractTaskListFilter {
+
+ @Override
+ public boolean select(Object parent, Object element) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ boolean isComplete = task.isCompleted();
+ if (!isComplete) {
+ return true;
+ } else if (element instanceof AbstractTask) {
+ AbstractTask abstractTask = (AbstractTask) element;
+ Collection<ITask> children = abstractTask.getChildren();
+ for (ITask child : children) {
+ if (select(abstractTask, child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskEditorBloatMonitor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskEditorBloatMonitor.java
new file mode 100644
index 0000000..a94e963
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskEditorBloatMonitor.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.monitor.ui.AbstractEditorTracker;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskEditorBloatMonitor extends AbstractEditorTracker {
+
+ private final int MAX_EDITORS = 12;
+
+ @Override
+ protected void editorBroughtToTop(IEditorPart part) {
+ // ignore
+ }
+
+ @Override
+ public void editorOpened(IEditorPart editorPartOpened) {
+ IWorkbenchPage page = editorPartOpened.getSite().getPage();
+ List<IEditorReference> toClose = new ArrayList<IEditorReference>();
+ int totalTaskEditors = 0;
+ for (IEditorReference editorReference : page.getEditorReferences()) {
+ try {
+ if (editorReference.getEditorInput() instanceof TaskEditorInput) {
+ totalTaskEditors++;
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+
+ if (totalTaskEditors > MAX_EDITORS) {
+ for (IEditorReference editorReference : page.getEditorReferences()) {
+ try {
+ if (editorReference.getEditorInput() instanceof TaskEditorInput) {
+ TaskEditorInput taskEditorInput = (TaskEditorInput) editorReference.getEditorInput();
+ TaskEditor taskEditor = (TaskEditor) editorReference.getEditor(false);
+ if (taskEditor == null) {
+ toClose.add(editorReference);
+ } else if (!taskEditor.equals(editorPartOpened) && !taskEditor.isDirty()
+ && taskEditorInput.getTask() != null
+ && taskEditorInput.getTask().getSynchronizationState().isSynchronized()) {
+ toClose.add(editorReference);
+ }
+ }
+ if ((totalTaskEditors - toClose.size()) < MAX_EDITORS) {
+ break;
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ }
+
+ if (toClose.size() > 0) {
+ page.closeEditors(toClose.toArray(new IEditorReference[toClose.size()]), true);
+ }
+ }
+
+ @Override
+ public void editorClosed(IEditorPart editorPart) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHistoryDropDown.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHistoryDropDown.java
new file mode 100644
index 0000000..b07c24e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHistoryDropDown.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.CompoundContributionItem;
+
+/**
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ * @author Steffen Pingel
+ */
+public class TaskHistoryDropDown extends CompoundContributionItem {
+
+ private final static int MAX_ITEMS_TO_DISPLAY = 16;
+
+ private class ActivateDialogAction extends Action {
+
+ private final ActivateTaskDialogAction dialogAction;
+
+ public ActivateDialogAction(ActivateTaskDialogAction action) {
+ dialogAction = action;
+ dialogAction.init(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
+
+ setText(Messages.TaskHistoryDropDown_Activate_Task_);
+ setToolTipText(Messages.TaskHistoryDropDown_Activate_Task_);
+ setEnabled(true);
+ setChecked(false);
+ setImageDescriptor(null);
+ //TasksUiImages.TASK_ACTIVE);
+ }
+
+ @Override
+ public void run() {
+ dialogAction.run(null);
+ }
+ }
+
+ private class DeactivateTaskAction extends Action {
+
+ public DeactivateTaskAction() {
+ setText(Messages.TaskHistoryDropDown_Deactivate_Task);
+ setToolTipText(Messages.TaskHistoryDropDown_Deactivate_Task);
+ setEnabled(true);
+ setChecked(false);
+ setImageDescriptor(null);
+ //TasksUiImages.TASK_INACTIVE);
+ }
+
+ @Override
+ public void run() {
+ ITask active = TasksUi.getTaskActivityManager().getActiveTask();
+ if (active != null) {
+ TasksUi.getTaskActivityManager().deactivateTask(active);
+ }
+ }
+
+ }
+
+ /**
+ * Action for navigating to a specified task. This class should be protected but has been made public for testing
+ * only
+ */
+ private class ActivateTaskAction extends Action {
+
+ private static final int MAX_LABEL_LENGTH = 40;
+
+ private final AbstractTask targetTask;
+
+ public ActivateTaskAction(AbstractTask task) {
+ targetTask = task;
+ String taskDescription = task.getSummary();
+ if (taskDescription.length() > MAX_LABEL_LENGTH) {
+ taskDescription = taskDescription.subSequence(0, MAX_LABEL_LENGTH - 3) + "..."; //$NON-NLS-1$
+ }
+ setText(taskDescription);
+ setEnabled(true);
+ setToolTipText(task.getSummary());
+ Image image = labelProvider.getImage(task);
+ setImageDescriptor(ImageDescriptor.createFromImage(image));
+ }
+
+ @Override
+ public void run() {
+ if (targetTask.isActive()) {
+ return;
+ }
+ TasksUi.getTaskActivityManager().activateTask(targetTask);
+ }
+ }
+
+ private final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(false);
+
+ private boolean scopedToWorkingSet;
+
+ private final TaskActivationHistory taskHistory;
+
+ public TaskHistoryDropDown() {
+ this(null);
+ }
+
+ public TaskHistoryDropDown(String id) {
+ this(id, TasksUiPlugin.getTaskActivityManager().getTaskActivationHistory());
+ }
+
+ public TaskHistoryDropDown(String id, TaskActivationHistory taskHistory) {
+ super(id);
+ this.taskHistory = taskHistory;
+ }
+
+ @Override
+ protected IContributionItem[] getContributionItems() {
+ List<AbstractTask> tasks = new ArrayList<AbstractTask>(taskHistory.getPreviousTasks());
+ Set<IWorkingSet> sets = TaskWorkingSetUpdater.getActiveWorkingSets(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow());
+ if (scopedToWorkingSet && !sets.isEmpty()) {
+ Set<ITask> allWorkingSetTasks = new HashSet<ITask>();
+ for (IWorkingSet workingSet : sets) {
+ IAdaptable[] elements = workingSet.getElements();
+ for (IAdaptable adaptable : elements) {
+ if (adaptable instanceof ITaskContainer) {
+ allWorkingSetTasks.addAll(((ITaskContainer) adaptable).getChildren());
+ }
+ }
+ }
+ List<AbstractTask> allScopedTasks = new ArrayList<AbstractTask>(tasks);
+ for (ITask task : tasks) {
+ if (!allWorkingSetTasks.contains(task)) {
+ allScopedTasks.remove(task);
+ }
+ }
+ tasks = allScopedTasks;
+ }
+
+ if (tasks.size() > MAX_ITEMS_TO_DISPLAY) {
+ tasks = tasks.subList(tasks.size() - MAX_ITEMS_TO_DISPLAY, tasks.size());
+ }
+
+ List<IContributionItem> items = new ArrayList<IContributionItem>();
+ for (int i = tasks.size() - 1; i >= 0; i--) {
+ AbstractTask currTask = tasks.get(i);
+ Action taskNavAction = new ActivateTaskAction(currTask);
+ ActionContributionItem item = new ActionContributionItem(taskNavAction);
+ if (currTask.isActive()) {
+ taskNavAction.setChecked(true);
+ }
+ items.add(item);
+ }
+
+ Separator separator = new Separator();
+ items.add(separator);
+
+ ITask active = TasksUi.getTaskActivityManager().getActiveTask();
+ if (active != null) {
+ Action deactivateAction = new DeactivateTaskAction();
+ ActionContributionItem item = new ActionContributionItem(deactivateAction);
+ items.add(item);
+ } else {
+ Action activateDialogAction = new ActivateDialogAction(new ActivateTaskDialogAction());
+ ActionContributionItem item = new ActionContributionItem(activateDialogAction);
+ items.add(item);
+ }
+
+ return items.toArray(new IContributionItem[items.size()]);
+ }
+
+ public boolean isScopedToWorkingSet() {
+ return scopedToWorkingSet;
+ }
+
+ /**
+ * If <code>scopedToWorkingSet</code> is set to true only tasks from the current working set are contributed.
+ */
+ public void setScopedToWorkingSet(boolean scopedToWorkingSet) {
+ this.scopedToWorkingSet = scopedToWorkingSet;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHistoryHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHistoryHandler.java
new file mode 100644
index 0000000..9372e70
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHistoryHandler.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ */
+public class TaskHistoryHandler extends AbstractHandler implements IElementUpdater {
+
+ public Object execute(final ExecutionEvent event) throws ExecutionException {
+ if (TasksUi.getTaskActivityManager().getActiveTask() != null) {
+ if (ContextCore.getContextManager().isContextCapturePaused()) {
+ IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
+ if (window != null) {
+ ICommandService commandService = (ICommandService) window.getService(ICommandService.class);
+ if (commandService != null) {
+ final Command command = commandService.getCommand("org.eclipse.mylyn.ui.context.capture.pause.command"); //$NON-NLS-1$
+ if (command != null) {
+ SafeRunner.run(new SafeRunnable() {
+ public void run() throws Exception {
+ command.executeWithChecks(event);
+ }
+ });
+ }
+ }
+ }
+ } else {
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ }
+ } else {
+ TaskActivationHistory taskHistory = TasksUiPlugin.getTaskActivityManager().getTaskActivationHistory();
+ if (taskHistory.hasPrevious()) {
+ AbstractTask previousTask = taskHistory.getPreviousTask();
+ if (previousTask != null && !previousTask.isActive()) {
+ TasksUi.getTaskActivityManager().activateTask(previousTask);
+ }
+ } else {
+ IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
+ if (window != null) {
+ ActivateTaskDialogAction action = new ActivateTaskDialogAction();
+ action.init(window);
+ action.run(null);
+ }
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void updateElement(UIElement element, Map parameters) {
+ if (TasksUi.getTaskActivityManager().getActiveTask() == null) {
+ element.setIcon(TasksUiImages.CONTEXT_HISTORY_PREVIOUS);
+ } else {
+ if (ContextCore.getContextManager().isContextCapturePaused()) {
+ element.setIcon(TasksUiImages.CONTEXT_HISTORY_PREVIOUS_PAUSE);
+ } else {
+ element.setIcon(TasksUiImages.CONTEXT_HISTORY_PREVIOUS_ACTIVE);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHyperlink.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHyperlink.java
new file mode 100644
index 0000000..67dba63
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskHyperlink.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ScalingHyperlink;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @author Frank Becker
+ */
+public class TaskHyperlink extends ScalingHyperlink {
+
+ private ITask task;
+
+ public TaskHyperlink(Composite parent, int style) {
+ super(parent, style);
+ setForeground(CommonColors.HYPERLINK_WIDGET);
+ addMouseTrackListener(MOUSE_TRACK_LISTENER);
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public void setTask(ITask task) {
+ this.task = task;
+ if (task != null) {
+ if ((getStyle() & SWT.SHORT) != 0) {
+ setText(task.getTaskKey());
+ setToolTipText(task.getTaskKey() + ": " + task.getSummary()); //$NON-NLS-1$
+ setStrikeThrough(task.isCompleted());
+ } else {
+ setText(task.getSummary());
+ setToolTipText(""); //$NON-NLS-1$
+ setStrikeThrough(false);
+ }
+ } else {
+ setText(""); //$NON-NLS-1$
+ setToolTipText(""); //$NON-NLS-1$
+ setStrikeThrough(false);
+ }
+ setUnderlined(false);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskJobFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskJobFactory.java
new file mode 100644
index 0000000..771c37b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskJobFactory.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+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.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskAttachmentJob;
+import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskJob;
+import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeQueriesJob;
+import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeRepositoriesJob;
+import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizeTasksJob;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryModel;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+import org.eclipse.mylyn.tasks.core.sync.TaskJob;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.progress.IProgressConstants;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskJobFactory implements ITaskJobFactory {
+
+ private final TaskList taskList;
+
+ private final TaskDataManager taskDataManager;
+
+ private final IRepositoryManager repositoryManager;
+
+ private final IRepositoryModel tasksModel;
+
+ public TaskJobFactory(TaskList taskList, TaskDataManager taskDataManager, IRepositoryManager repositoryManager,
+ IRepositoryModel tasksModel) {
+ this.taskList = taskList;
+ this.taskDataManager = taskDataManager;
+ this.repositoryManager = repositoryManager;
+ this.tasksModel = tasksModel;
+ }
+
+ public SynchronizationJob createSynchronizeTasksJob(AbstractRepositoryConnector connector, Set<ITask> tasks) {
+ SynchronizeTasksJob job = new SynchronizeTasksJob(taskList, taskDataManager, tasksModel, connector,
+ repositoryManager, tasks);
+ job.setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
+ job.setPriority(Job.LONG);
+ return job;
+ }
+
+ public SynchronizationJob createSynchronizeTasksJob(AbstractRepositoryConnector connector,
+ TaskRepository taskRepository, Set<ITask> tasks) {
+ SynchronizeTasksJob job = new SynchronizeTasksJob(taskList, taskDataManager, tasksModel, connector,
+ taskRepository, tasks);
+ job.setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
+ job.setPriority(Job.LONG);
+ return job;
+ }
+
+ public SynchronizationJob createSynchronizeQueriesJob(AbstractRepositoryConnector connector,
+ TaskRepository repository, Set<RepositoryQuery> queries) {
+ SynchronizationJob job = new SynchronizeQueriesJob(taskList, taskDataManager, tasksModel, connector,
+ repository, queries);
+ job.setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
+ job.setPriority(Job.DECORATE);
+ return job;
+ }
+
+ public SynchronizationJob createSynchronizeRepositoriesJob(Set<TaskRepository> repositories) {
+ SynchronizeRepositoriesJob job = new SynchronizeRepositoriesJob(taskList, taskDataManager, tasksModel,
+ repositoryManager);
+ job.setRepositories(repositories);
+ job.setProperty(IProgressConstants.ICON_PROPERTY, TasksUiImages.REPOSITORY_SYNCHRONIZE);
+ job.setPriority(Job.DECORATE);
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ // XXX: since the Task List does not properly refresh parent
+ // containers, force the refresh of it's root
+ taskList.notifyElementsChanged(null);
+ }
+ });
+ return job;
+ }
+
+ public SubmitJob createSubmitTaskJob(AbstractRepositoryConnector connector, TaskRepository taskRepository,
+ final ITask task, TaskData taskData, Set<TaskAttribute> oldAttributes) {
+ SubmitJob job = new SubmitTaskJob(taskDataManager, connector, taskRepository, task, taskData, oldAttributes);
+ job.setPriority(Job.INTERACTIVE);
+ try {
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ ((AbstractTask) task).setSynchronizing(true);
+ }
+ });
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unexpected error", e)); //$NON-NLS-1$
+ }
+ taskList.notifySynchronizationStateChanged(task);
+ return job;
+ }
+
+ public TaskJob createUpdateRepositoryConfigurationJob(final AbstractRepositoryConnector connector,
+ final TaskRepository taskRepository) {
+ TaskJob updateJob = new TaskJob(Messages.TaskJobFactory_Refreshing_repository_configuration) {
+ private IStatus error;
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ monitor.beginTask(Messages.TaskJobFactory_Receiving_configuration, IProgressMonitor.UNKNOWN);
+ try {
+ try {
+ connector.updateRepositoryConfiguration(taskRepository, monitor);
+ } catch (CoreException e) {
+ error = e.getStatus();
+ }
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ @Override
+ public boolean belongsTo(Object family) {
+ return family == taskRepository;
+ }
+
+ @Override
+ public IStatus getStatus() {
+ return error;
+ }
+ };
+ updateJob.setPriority(Job.INTERACTIVE);
+ return updateJob;
+ }
+
+ public SubmitJob createSubmitTaskAttachmentJob(AbstractRepositoryConnector connector,
+ TaskRepository taskRepository, final ITask task, AbstractTaskAttachmentSource source, String comment,
+ TaskAttribute attachmentAttribute) {
+ SubmitJob job = new SubmitTaskAttachmentJob(taskDataManager, connector, taskRepository, task, source, comment,
+ attachmentAttribute);
+ job.setPriority(Job.INTERACTIVE);
+ try {
+ taskList.run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ ((AbstractTask) task).setSynchronizing(true);
+ }
+ });
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unexpected error", e)); //$NON-NLS-1$
+ }
+ taskList.notifySynchronizationStateChanged(task);
+ job.setUser(true);
+ return job;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskLabelDecorator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskLabelDecorator.java
new file mode 100644
index 0000000..ea858c7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskLabelDecorator.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryElement;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskLabelDecorator implements ILightweightLabelDecorator {
+
+ public void decorate(Object element, IDecoration decoration) {
+
+ ImageDescriptor priorityOverlay = getPriorityImageDescriptor(element);
+ if (priorityOverlay != null) {
+ decoration.addOverlay(priorityOverlay, IDecoration.BOTTOM_LEFT);
+ }
+
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (!task.isCompleted()
+ && (TasksUiPlugin.getTaskActivityManager().isDueToday(task) || TasksUiPlugin.getTaskActivityManager()
+ .isOverdue(task))) {
+ decoration.addOverlay(CommonImages.OVERLAY_DATE_OVERDUE, IDecoration.TOP_RIGHT);
+ } else if (!task.isCompleted() && task.getDueDate() != null) {
+ decoration.addOverlay(CommonImages.OVERLAY_DATE_DUE, IDecoration.TOP_RIGHT);
+ }
+ } else if (element instanceof ITaskRepositoryElement) {
+ ITaskRepositoryElement repositoryElement = (ITaskRepositoryElement) element;
+ String repositoryUrl = repositoryElement.getRepositoryUrl();
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(
+ repositoryElement.getConnectorKind(), repositoryUrl);
+ if (taskRepository != null) {
+ decoration.addSuffix(" [" + taskRepository.getRepositoryLabel() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else if (element instanceof TaskRepository) {
+ ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(
+ ((TaskRepository) element).getConnectorKind());
+ if (overlay != null) {
+ decoration.addOverlay(overlay, IDecoration.BOTTOM_RIGHT);
+ }
+ }
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ // ignore
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // ignore
+ }
+
+ private ImageDescriptor getPriorityImageDescriptor(Object element) {
+ AbstractRepositoryConnectorUi connectorUi;
+ if (element instanceof ITask) {
+ ITask repositoryTask = (ITask) element;
+ connectorUi = TasksUiPlugin.getConnectorUi(((ITask) element).getConnectorKind());
+ if (connectorUi != null) {
+ return connectorUi.getTaskPriorityOverlay(repositoryTask);
+ }
+ }
+ if (element instanceof ITask) {
+ return TasksUiInternal.getPriorityImage((ITask) element);
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListBackupManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListBackupManager.java
new file mode 100644
index 0000000..5e3d07f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListBackupManager.java
@@ -0,0 +1,278 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.text.ParseException;
+import com.ibm.icu.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDataSnapshotOperation;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListBackupManager implements IPropertyChangeListener {
+
+ private static final String OLD_MYLYN_2_BACKUP_FILE_PREFIX = "mylyndata-"; //$NON-NLS-1$
+
+ // Mylyn 3.0 Backup file name
+ private static final String BACKUP_FILE_PREFIX = "mylyn-v3-data-"; //$NON-NLS-1$
+
+ private static final Pattern MYLYN_BACKUP_REGEXP = Pattern.compile("^(" + BACKUP_FILE_PREFIX + ")?(" //$NON-NLS-1$ //$NON-NLS-2$
+ + OLD_MYLYN_2_BACKUP_FILE_PREFIX + ")?"); //$NON-NLS-1$
+
+ private static final Pattern DATE_FORMAT_OLD = Pattern.compile("\\d{4}-\\d{2}-\\d{2}"); //$NON-NLS-1$
+
+ private static final Pattern DATE_FORMAT = Pattern.compile("\\d{4}-\\d{2}-\\d{2}-\\d{6}"); //$NON-NLS-1$
+
+ private static final long SECOND = 1000;
+
+ private static final long MINUTE = 60 * SECOND;
+
+ private static final long STANDARD_DELAY = 30 * MINUTE;
+
+ private String backupFolderPath;
+
+ private Job runBackup;
+
+ private static boolean errorDisplayed = false;
+
+ public TaskListBackupManager(String backupFolderPath) {
+ this.backupFolderPath = backupFolderPath;
+ start(STANDARD_DELAY);
+ }
+
+ public void start(long delay) {
+
+ if (runBackup != null) {
+ stop();
+ }
+
+ runBackup = new Job("Task Data Snapshot") { //$NON-NLS-1$
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ if (TasksUiPlugin.getTaskList().getAllTasks().size() > 0) {
+ backupNow(false, monitor);
+ }
+ return Status.OK_STATUS;
+ } finally {
+ schedule(STANDARD_DELAY);
+ }
+ }
+ };
+ runBackup.setPriority(Job.BUILD);
+ runBackup.setSystem(true);
+ runBackup.schedule(delay);
+ }
+
+ public void stop() {
+ if (runBackup != null) {
+ if (!runBackup.cancel()) {
+ try {
+ runBackup.join();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+ runBackup = null;
+ }
+ }
+
+ public static String getBackupFileName() {
+ SimpleDateFormat format = new SimpleDateFormat(ITasksCoreConstants.FILENAME_TIMESTAMP_FORMAT, Locale.ENGLISH);
+ String date = format.format(new Date());
+ String backupFileName = BACKUP_FILE_PREFIX + date + ".zip"; //$NON-NLS-1$
+ return backupFileName;
+ }
+
+ public void backupNow(boolean synchronous) {
+ backupNow(synchronous, null);
+ }
+
+ public synchronized void backupNow(boolean synchronous, IProgressMonitor monitor) {
+
+ monitor = Policy.monitorFor(monitor);
+
+ File backupFolder = new File(backupFolderPath);
+ if (!backupFolder.exists()) {
+ backupFolder.mkdir();
+ }
+
+ final TaskDataExportOperation backupJob = new TaskDataSnapshotOperation(backupFolderPath, getBackupFileName());
+ try {
+ if (!synchronous) {
+ backupJob.run(monitor);
+ removeOldBackups();
+ } else {
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.run(false, true, backupJob);
+ }
+ } catch (InvocationTargetException e) {
+ if (!errorDisplayed) {
+ final Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup, e);
+ errorDisplayed = true;
+ if (Display.getCurrent() != null) {
+ TasksUiInternal.logAndDisplayStatus(Messages.TaskListBackupManager_Scheduled_task_data_backup,
+ status);
+ } else {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.logAndDisplayStatus(
+ Messages.TaskListBackupManager_Scheduled_task_data_backup, status);
+
+ }
+ });
+ }
+ }
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+
+ public SortedMap<Long, File> getBackupFiles() {
+
+ SortedMap<Long, File> filesMap = new TreeMap<Long, File>();
+ String destination = backupFolderPath;
+
+ File backupFolder = new File(destination);
+ if (!backupFolder.exists()) {
+ return filesMap;
+ }
+
+ File[] files = backupFolder.listFiles();
+ if (files == null) {
+ return filesMap;
+ }
+
+ for (File file : files) {
+ Matcher matcher = MYLYN_BACKUP_REGEXP.matcher(file.getName());
+ if (matcher.find()) {
+ Date date = null;
+ try {
+ SimpleDateFormat format = null;
+ String dateText = null;
+ Matcher dateFormatMatcher = DATE_FORMAT.matcher(file.getName());
+ if (dateFormatMatcher.find()) {
+ format = new SimpleDateFormat(ITasksCoreConstants.FILENAME_TIMESTAMP_FORMAT, Locale.ENGLISH);
+ dateText = dateFormatMatcher.group();
+ } else {
+ dateFormatMatcher = DATE_FORMAT_OLD.matcher(file.getName());
+ if (dateFormatMatcher.find()) {
+ format = new SimpleDateFormat(ITasksCoreConstants.OLD_FILENAME_TIMESTAMP_FORMAT,
+ Locale.ENGLISH);
+ dateText = dateFormatMatcher.group();
+ }
+ }
+ if (format != null && dateText != null && dateText.length() > 0) {
+ date = format.parse(dateText);
+ } else {
+ continue;
+ }
+ } catch (IndexOutOfBoundsException e) {
+ continue;
+ } catch (ParseException e) {
+ continue;
+ }
+ if (date != null && date.getTime() > 0) {
+ filesMap.put(new Long(date.getTime()), file);
+ }
+ }
+ }
+
+ return filesMap;
+ }
+
+ /** public for testing purposes */
+ public synchronized void removeOldBackups() {
+
+ SortedMap<Long, File> filesMap = getBackupFiles();
+
+ if (filesMap.size() > 0) {
+
+ Calendar rangeStart = TaskActivityUtil.getCalendar();
+ rangeStart.setTimeInMillis(filesMap.lastKey());
+ TaskActivityUtil.snapStartOfHour(rangeStart);
+ int startHour = rangeStart.get(Calendar.HOUR_OF_DAY);
+ Calendar rangeEnd = TaskActivityUtil.getCalendar();
+ rangeEnd.setTimeInMillis(rangeStart.getTimeInMillis());
+ rangeEnd.add(Calendar.HOUR_OF_DAY, 1);
+ // Keep one backup for last 8 hours of today
+ for (int x = 0; x <= startHour && x < 9; x++) {
+ SortedMap<Long, File> subMap = filesMap.subMap(rangeStart.getTimeInMillis(), rangeEnd.getTimeInMillis());
+ if (subMap.size() > 1) {
+ while (subMap.size() > 1) {
+ File toDelete = subMap.remove(subMap.firstKey());
+ toDelete.delete();
+ }
+ }
+ rangeStart.add(Calendar.HOUR_OF_DAY, -1);
+ rangeEnd.add(Calendar.HOUR_OF_DAY, -1);
+ }
+
+ // Keep one backup a day for the past 12 days
+ TaskActivityUtil.snapStartOfDay(rangeEnd);
+ rangeStart.add(Calendar.DAY_OF_YEAR, -1);
+ for (int x = 1; x <= 12; x++) {
+ SortedMap<Long, File> subMap = filesMap.subMap(rangeStart.getTimeInMillis(), rangeEnd.getTimeInMillis());
+ if (subMap.size() > 1) {
+ while (subMap.size() > 1) {
+ File toDelete = subMap.remove(subMap.firstKey());
+ toDelete.delete();
+ }
+ }
+ rangeStart.add(Calendar.DAY_OF_YEAR, -1);
+ rangeEnd.add(Calendar.DAY_OF_YEAR, -1);
+ }
+
+ // Remove all older backups
+ SortedMap<Long, File> subMap = filesMap.subMap(0l, rangeStart.getTimeInMillis());
+ if (subMap.size() > 0) {
+ while (subMap.size() > 0) {
+ File toDelete = subMap.remove(subMap.firstKey());
+ toDelete.delete();
+ }
+ }
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(ITasksUiPreferenceConstants.PREF_DATA_DIR)) {
+ backupFolderPath = TasksUiPlugin.getDefault().getBackupFolderPath();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListModifyOperation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListModifyOperation.java
new file mode 100644
index 0000000..95359f0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListModifyOperation.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+
+/**
+ * Use to perform atomic operations on the task list i.e. open/restore
+ *
+ * @author Rob Elves
+ * @since 3.0
+ */
+public abstract class TaskListModifyOperation implements IRunnableWithProgress {
+
+ ISchedulingRule rule;
+
+ public TaskListModifyOperation() {
+ this(null);
+ }
+
+ public TaskListModifyOperation(ISchedulingRule rule) {
+ this.rule = rule;
+ }
+
+ protected abstract void operations(IProgressMonitor monitor) throws CoreException, InvocationTargetException,
+ InterruptedException;
+
+ final public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ final InvocationTargetException[] ite = new InvocationTargetException[1];
+ try {
+ ITaskListRunnable runnable = new ITaskListRunnable() {
+
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ try {
+ Job.getJobManager().beginRule(rule, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ operations(monitor);
+ } catch (InvocationTargetException e) {
+ ite[0] = e;
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException(e.getMessage());
+ } finally {
+ Job.getJobManager().endRule(rule);
+ }
+ }
+ };
+ getTaskList().run(runnable, monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ }
+
+ if (ite[0] != null) {
+ throw ite[0];
+ }
+ }
+
+ protected TaskList getTaskList() {
+ return TasksUiPlugin.getTaskList();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListNotificationManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListNotificationManager.java
new file mode 100644
index 0000000..7a5440b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListNotificationManager.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationPopup;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListNotificationManager implements IPropertyChangeListener {
+
+ private static final long DELAY_OPEN = 5 * 1000;
+
+ private static final boolean runSystem = true;
+
+ private TaskListNotificationPopup popup;
+
+ private final Set<AbstractNotification> notifications = new HashSet<AbstractNotification>();
+
+ private final Set<AbstractNotification> currentlyNotifying = Collections.synchronizedSet(notifications);
+
+ private final List<ITaskListNotificationProvider> notificationProviders = new ArrayList<ITaskListNotificationProvider>();
+
+ private final WeakHashMap<Object, Object> cancelledTokens = new WeakHashMap<Object, Object>();
+
+ private final Job openJob = new Job(Messages.TaskListNotificationManager_Open_Notification_Job) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+
+ if (Platform.isRunning() && PlatformUI.getWorkbench() != null
+ && PlatformUI.getWorkbench().getDisplay() != null
+ && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ collectNotifications();
+
+ if (popup != null && popup.getReturnCode() == Window.CANCEL) {
+ List<AbstractNotification> notifications = popup.getNotifications();
+ for (AbstractNotification notification : notifications) {
+ if (notification.getToken() != null) {
+ cancelledTokens.put(notification.getToken(), null);
+ }
+ }
+ }
+
+ for (Iterator<AbstractNotification> it = currentlyNotifying.iterator(); it.hasNext();) {
+ AbstractNotification notification = it.next();
+ if (notification.getToken() != null
+ && cancelledTokens.containsKey(notification.getToken())) {
+ it.remove();
+ }
+ }
+
+ synchronized (TaskListNotificationManager.class) {
+ if (currentlyNotifying.size() > 0) {
+// popup.close();
+ showPopup();
+ }
+ }
+ }
+ });
+ }
+ } finally {
+ if (popup != null) {
+ schedule(popup.getDelayClose() / 2);
+ } else {
+ schedule(DELAY_OPEN);
+ }
+ }
+
+ if (monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ return Status.OK_STATUS;
+ }
+
+ };
+
+ public TaskListNotificationManager() {
+ }
+
+ public void showPopup() {
+ if (popup != null) {
+ popup.close();
+ }
+
+ Shell shell = new Shell(PlatformUI.getWorkbench().getDisplay());
+ popup = new TaskListNotificationPopup(shell);
+ popup.setFadingEnabled(TasksUiInternal.isAnimationsEnabled());
+ List<AbstractNotification> toDisplay = new ArrayList<AbstractNotification>(currentlyNotifying);
+ Collections.sort(toDisplay);
+ popup.setContents(toDisplay);
+ cleanNotified();
+ popup.setBlockOnOpen(false);
+ popup.open();
+ }
+
+ private void cleanNotified() {
+ currentlyNotifying.clear();
+ }
+
+ /** public for testing */
+ public void collectNotifications() {
+ for (ITaskListNotificationProvider provider : notificationProviders) {
+ currentlyNotifying.addAll(provider.getNotifications());
+ }
+ }
+
+ public void startNotification(long initialStartupTime) {
+ if (TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED)) {
+ if (!openJob.cancel()) {
+ try {
+ openJob.join();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+ openJob.setSystem(runSystem);
+ openJob.schedule(initialStartupTime);
+ }
+ }
+
+ public void stopNotification() {
+ openJob.cancel();
+// closeJob.cancel();
+// if (popup != null) {
+// popup.close();
+// }
+ }
+
+ public void addNotificationProvider(ITaskListNotificationProvider notification_provider) {
+ notificationProviders.add(notification_provider);
+ }
+
+ public void removeNotificationProvider(ITaskListNotificationProvider notification_provider) {
+ notificationProviders.remove(notification_provider);
+ }
+
+ /**
+ * public for testing purposes
+ */
+ public Set<AbstractNotification> getNotifications() {
+ synchronized (TaskListNotificationManager.class) {
+ return currentlyNotifying;
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED)) {
+ Object newValue = event.getNewValue();
+ if (!(newValue instanceof Boolean)) {
+ // default if no preference value
+ startNotification(0);
+ } else if ((Boolean) newValue == true) {
+ startNotification(0);
+ } else {
+ stopNotification();
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListSynchronizationScheduler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListSynchronizationScheduler.java
new file mode 100644
index 0000000..bb94bb3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskListSynchronizationScheduler.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Collections;
+
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskListSynchronizationScheduler {
+
+ private long interval;
+
+ private final ITaskJobFactory jobFactory;
+
+ private SynchronizationJob refreshJob;
+
+ public TaskListSynchronizationScheduler(ITaskJobFactory jobFactory) {
+ this.jobFactory = jobFactory;
+ }
+
+ private SynchronizationJob createRefreshJob() {
+ SynchronizationJob job = jobFactory.createSynchronizeRepositoriesJob(null);
+ // do not show in progress view by default
+ job.setSystem(true);
+ job.setUser(false);
+ job.setFullSynchronization(true);
+ return job;
+ }
+
+ public synchronized SynchronizationJob getRefreshJob() {
+ return refreshJob;
+ }
+
+ private synchronized void reschedule() {
+ if (this.interval != 0) {
+ refreshJob.schedule(interval);
+ }
+ }
+
+ public synchronized void setInterval(long interval) {
+ setInterval(interval, interval);
+ }
+
+ public synchronized void setInterval(long delay, long interval) {
+ if (this.interval != interval) {
+ this.interval = interval;
+ if (refreshJob != null) {
+ refreshJob.cancel();
+ refreshJob = null;
+ }
+
+ if (interval > 0) {
+ refreshJob = createRefreshJob();
+ refreshJob.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ reschedule();
+ }
+
+ });
+ refreshJob.schedule(delay);
+ }
+ }
+ }
+
+ public SynchronizationJob synchronize(TaskRepository repository) {
+ // TODO check if a synchronization for repository is already running
+ SynchronizationJob job = jobFactory.createSynchronizeRepositoriesJob(Collections.singleton(repository));
+ // do not show in progress view by default
+ job.setSystem(true);
+ job.setUser(false);
+ job.setFullSynchronization(false);
+ job.schedule();
+ return job;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskPriorityFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskPriorityFilter.java
new file mode 100644
index 0000000..a9ecca2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskPriorityFilter.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ */
+public class TaskPriorityFilter extends AbstractTaskListFilter {
+
+ private static final String PRIORITY_PREFIX = "P"; //$NON-NLS-1$
+
+ private String priorityLevel = PriorityLevel.P5.toString();
+
+ public TaskPriorityFilter() {
+ displayPrioritiesAbove(TaskListView.getCurrentPriorityLevel());
+ }
+
+ public void displayPrioritiesAbove(String level) {
+ priorityLevel = level;
+ }
+
+ @Override
+ public boolean select(Object parent, Object element) {
+ if (element instanceof IRepositoryElement) {
+ String priority = ((AbstractTaskContainer) element).getPriority();
+ if (priority == null || !(priority.startsWith(PRIORITY_PREFIX))) {
+ return true;
+ }
+ if (priorityLevel.compareTo(((AbstractTaskContainer) element).getPriority()) >= 0) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryAdapterFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryAdapterFactory.java
new file mode 100644
index 0000000..c68014f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryAdapterFactory.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IActionFilter;
+
+/**
+ * Adapter factory for adapting TaskRepository to org.eclipse.ui.IActionFilter
+ *
+ * @author Eugene Kuleshov
+ */
+public class TaskRepositoryAdapterFactory implements IAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ private static final Class[] ADAPTER_TYPES = new Class[] { IActionFilter.class };
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return ADAPTER_TYPES;
+ }
+
+ public Object getAdapter(final Object adaptable, @SuppressWarnings("unchecked") Class adapterType) {
+ if (adaptable instanceof TaskRepository) {
+ return new IActionFilter() {
+ public boolean testAttribute(Object target, String name, String value) {
+ TaskRepository repository = (TaskRepository) target;
+ if ("offline".equals(name)) { //$NON-NLS-1$
+ return Boolean.valueOf(value).booleanValue() == repository.isOffline();
+ } else if ("supportQuery".equals(name)) { //$NON-NLS-1$
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager()
+ .getRepositoryConnector(repository.getConnectorKind());
+ return null != connectorUi.getQueryWizard(repository, null) && connector.canQuery(repository);
+ } else if ("supportNewTask".equals(name)) { //$NON-NLS-1$
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ return connector.canCreateNewTask(repository);
+ } else if ("hasRepository".equals(name)) { //$NON-NLS-1$
+ return !repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND);
+ }
+ return false;
+ }
+ };
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryComparator.java
new file mode 100644
index 0000000..9e7b04b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryComparator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Comparator;
+
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoryComparator implements Comparator<TaskRepository> {
+ public int compare(TaskRepository t1, TaskRepository t2) {
+ if (t1.getRepositoryLabel() != null && t2.getRepositoryLabel() != null) {
+ return t1.getRepositoryLabel().compareTo(t2.getRepositoryLabel());
+ } else if (t1.getRepositoryLabel() == null && t2.getRepositoryLabel() == null) {
+ return t1.getRepositoryUrl().compareTo(t2.getRepositoryUrl());
+ } else if (t1.getRepositoryLabel() == null) {
+ return -1;
+ } else if (t2.getRepositoryLabel() == null) {
+ return 1;
+ }
+ return 1;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryLocationUi.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryLocationUi.java
new file mode 100644
index 0000000..b1cef8f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryLocationUi.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.commons.net.UnsupportedRequestException;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryLocation;
+import org.eclipse.mylyn.internal.tasks.ui.dialogs.TaskRepositoryCredentialsDialog;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryLocationUi extends TaskRepositoryLocation {
+
+ private static Object lock = new Object();
+
+ public TaskRepositoryLocationUi(TaskRepository taskRepository) {
+ super(taskRepository);
+ }
+
+ @Override
+ public void requestCredentials(AuthenticationType authType, String message, IProgressMonitor monitor)
+ throws UnsupportedRequestException {
+ if (CoreUtil.TEST_MODE) {
+ throw new UnsupportedRequestException();
+ }
+
+ AuthenticationCredentials oldCredentials = taskRepository.getCredentials(authType);
+ // synchronize on a static lock to ensure that only one password dialog is displayed at a time
+ synchronized (lock) {
+ // check if the credentials changed while the thread was waiting for the lock
+ if (!areEqual(oldCredentials, taskRepository.getCredentials(authType))) {
+ return;
+ }
+
+ if (Policy.isBackgroundMonitor(monitor)) {
+ throw new UnsupportedRequestException();
+ }
+
+ PasswordRunner runner = new PasswordRunner(authType, message);
+ if (!PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(runner);
+ if (runner.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ if (!runner.isChanged()) {
+ throw new UnsupportedRequestException();
+ }
+ } else {
+ throw new UnsupportedRequestException();
+ }
+ }
+ }
+
+ private boolean areEqual(AuthenticationCredentials oldCredentials, AuthenticationCredentials credentials) {
+ if (oldCredentials == null) {
+ return (credentials == null);
+ } else {
+ return oldCredentials.equals(credentials);
+ }
+ }
+
+ private class PasswordRunner implements Runnable {
+
+ private final AuthenticationType authType;
+
+ private boolean changed;
+
+ private final String message;
+
+ private boolean canceled;
+
+ public PasswordRunner(AuthenticationType credentialType, String message) {
+ this.authType = credentialType;
+ this.message = message;
+ }
+
+ public boolean isChanged() {
+ return changed;
+ }
+
+ public boolean isCanceled() {
+ return canceled;
+ }
+
+ public void run() {
+ //Shell shell = Display.getCurrent().getActiveShell();
+ Shell shell = WorkbenchUtil.getShell();
+ if (shell != null && !shell.isDisposed()) {
+ TaskRepositoryCredentialsDialog dialog = TaskRepositoryCredentialsDialog.createDialog(shell);
+ initializeDialog(dialog);
+ int resultCode = dialog.open();
+ if (resultCode == Window.OK) {
+ apply(dialog);
+ changed = true;
+ } else if (resultCode == TaskRepositoryCredentialsDialog.TASK_REPOSITORY_CHANGED) {
+ changed = true;
+ } else {
+ canceled = true;
+ }
+ }
+ }
+
+ private void initializeDialog(TaskRepositoryCredentialsDialog dialog) {
+ dialog.setTaskRepository(taskRepository);
+
+ AuthenticationCredentials credentials = taskRepository.getCredentials(authType);
+ if (credentials != null) {
+ dialog.setUsername(credentials.getUserName());
+ dialog.setPassword(credentials.getPassword());
+ }
+
+ // caller provided message takes precedence
+ if (message != null) {
+ dialog.setMessage(message);
+ } else {
+ dialog.setMessage(getDefaultMessage());
+ }
+ }
+
+ private String getDefaultMessage() {
+ if (AuthenticationType.REPOSITORY.equals(authType)) {
+ return Messages.TaskRepositoryLocationUi_Enter_repository_password;
+ } else if (AuthenticationType.HTTP.equals(authType)) {
+ return Messages.TaskRepositoryLocationUi_Enter_HTTP_password;
+ } else if (AuthenticationType.PROXY.equals(authType)) {
+ return Messages.TaskRepositoryLocationUi_Enter_proxy_password;
+ }
+ return null;
+ }
+
+ private void apply(TaskRepositoryCredentialsDialog dialog) {
+ AuthenticationCredentials credentials = new AuthenticationCredentials(dialog.getUserName(),
+ dialog.getPassword());
+ taskRepository.setCredentials(authType, credentials, dialog.getSavePassword());
+ TasksUiPlugin.getRepositoryManager().notifyRepositorySettingsChanged(taskRepository);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryUtil.java
new file mode 100644
index 0000000..37fe795
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskRepositoryUtil.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskRepositoryUtil {
+
+ /**
+ * Is auto add of template repository disabled for repositoryUrl
+ *
+ * @since 2.1
+ */
+ public static boolean isAddAutomaticallyDisabled(String repositoryUrl) {
+ String deletedTemplates = TasksUiPlugin.getDefault().getPreferenceStore().getString(
+ ITasksUiPreferenceConstants.TEMPLATES_DELETED);
+ String[] templateUrls = deletedTemplates.split("\\" + ITasksUiPreferenceConstants.TEMPLATES_DELETED_DELIM); //$NON-NLS-1$
+ for (String deletedUrl : templateUrls) {
+ if (deletedUrl.equalsIgnoreCase(repositoryUrl)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Disable template repository from being automatically added
+ *
+ * @since 2.1
+ */
+ public static void disableAddAutomatically(String repositoryUrl) {
+ if (!isAddAutomaticallyDisabled(repositoryUrl) && isAddAutomatically(repositoryUrl)) {
+ String deletedTemplates = TasksUiPlugin.getDefault().getPreferenceStore().getString(
+ ITasksUiPreferenceConstants.TEMPLATES_DELETED);
+ deletedTemplates += ITasksUiPreferenceConstants.TEMPLATES_DELETED_DELIM + repositoryUrl;
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.TEMPLATES_DELETED,
+ deletedTemplates);
+ TasksUiPlugin.getDefault().savePluginPreferences();
+ }
+ }
+
+ /**
+ * Template exists and is auto add enabled
+ */
+ private static boolean isAddAutomatically(String repositoryUrl) {
+ for (AbstractRepositoryConnector connector : TasksUi.getRepositoryManager().getRepositoryConnectors()) {
+ for (RepositoryTemplate template : TasksUiPlugin.getRepositoryTemplateManager().getTemplates(
+ connector.getConnectorKind())) {
+ if (template.repositoryUrl != null && template.repositoryUrl.equalsIgnoreCase(repositoryUrl)
+ && template.addAutomatically) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java
new file mode 100644
index 0000000..25fba6f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskSearchPage.java
@@ -0,0 +1,624 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPageContainer;
+import org.eclipse.search.internal.ui.SearchPlugin;
+import org.eclipse.search.ui.ISearchPage;
+import org.eclipse.search.ui.ISearchPageContainer;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResultViewPart;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+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.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class TaskSearchPage extends DialogPage implements ISearchPage {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.search.page"; //$NON-NLS-1$
+
+ private static final String PAGE_KEY = "page"; //$NON-NLS-1$
+
+ private static final String PAGE_NAME = "TaskSearchPage"; //$NON-NLS-1$
+
+ private static final String STORE_REPO_ID = PAGE_NAME + ".REPO"; //$NON-NLS-1$
+
+ private Combo repositoryCombo;
+
+ private Text keyText;
+
+ private TaskRepository repository;
+
+ private Composite fParentComposite;
+
+ private IDialogSettings fDialogSettings;
+
+ private int currentPageIndex = -1;
+
+ private boolean firstView = true;
+
+ private Control[] queryPages;
+
+ private ISearchPageContainer pageContainer;
+
+ private ITaskSearchPageContainer taskSearchPageContainer;
+
+ public boolean performAction() {
+ saveDialogSettings();
+ String key = keyText.getText();
+ if (key != null && key.trim().length() > 0) {
+ key = key.trim();
+ boolean openSuccessful = TasksUiUtil.openTask(repository, key);
+ if (!openSuccessful) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.TaskSearchPage_Task_Search, Messages.TaskSearchPage_No_task_found_matching_key_ + key);
+ }
+ return openSuccessful;
+ } else {
+ ITaskSearchPage page = (ITaskSearchPage) queryPages[currentPageIndex].getData(PAGE_KEY);
+ return page.performSearch();
+ }
+ }
+
+ public void setContainer(ISearchPageContainer container) {
+ this.pageContainer = container;
+ this.taskSearchPageContainer = new ITaskSearchPageContainer() {
+ public IRunnableContext getRunnableContext() {
+ return pageContainer.getRunnableContext();
+ }
+
+ public void setPerformActionEnabled(boolean enabled) {
+ pageContainer.setPerformActionEnabled(enabled);
+ }
+ };
+ }
+
+ public void createControl(Composite parent) {
+ fParentComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ // layout.marginHeight = 0;
+ // layout.marginWidth = 0;
+ fParentComposite.setLayout(layout);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ fParentComposite.setLayoutData(gd);
+
+ createRepositoryGroup(fParentComposite);
+ createSeparator(fParentComposite);
+ this.setControl(fParentComposite);
+
+ Dialog.applyDialogFont(fParentComposite);
+ }
+
+ private void createSeparator(Composite parent) {
+ Label separator = new Label(parent, SWT.NONE);
+ separator.setVisible(false);
+ GridData data = new GridData(GridData.FILL, GridData.FILL, false, false, 2, 1);
+ data.heightHint = convertHeightInCharsToPixels(1) / 3;
+ separator.setLayoutData(data);
+ }
+
+ private void createRepositoryGroup(Composite control) {
+ Composite group = new Composite(control, SWT.NONE);
+ GridLayout layout = new GridLayout(6, false);
+ group.setLayout(layout);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ group.setLayoutData(gd);
+
+ Label label = new Label(group, SWT.NONE);
+ label.setText(Messages.TaskSearchPage_Select_Repository_);
+
+ repositoryCombo = new Combo(group, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
+ repositoryCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ displayQueryPage(repositoryCombo.getSelectionIndex());
+ }
+ });
+ label = new Label(group, SWT.NONE);
+ label.setText(" "); //$NON-NLS-1$
+
+ Label labelKey = new Label(group, SWT.NONE);
+ labelKey.setText(Messages.TaskSearchPage_Task_Key_ID);
+ keyText = new Text(group, SWT.BORDER);
+ keyText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+
+ String findText = null;
+ TaskListView taskListView = TaskListView.getFromActivePerspective();
+ if (taskListView != null) {
+ findText = taskListView.getFilteredTree().getFilterControl().getText();
+ if (findText != null && findText.trim().length() > 0 && isTaskKeyCandidate(findText.trim())) {
+ pageContainer.setPerformActionEnabled(true);
+ keyText.setText(findText.trim());
+ keyText.setFocus();
+ }
+ }
+
+ keyText.addKeyListener(new KeyListener() {
+
+ public void keyPressed(KeyEvent e) {
+ // ignore
+ }
+
+ public void keyReleased(KeyEvent e) {
+ updatePageEnablement();
+ }
+ });
+
+ ImageHyperlink clearKey = new ImageHyperlink(group, SWT.NONE);
+ clearKey.setImage(CommonImages.getImage(CommonImages.REMOVE));
+ clearKey.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ keyText.setText(""); //$NON-NLS-1$
+ updatePageEnablement();
+ }
+ });
+ }
+
+ private void updatePageEnablement() {
+ if (keyText.getText() != null && keyText.getText().trim().length() > 0) {
+ //setControlsEnabled(queryPages[currentPageIndex], false);
+ if (queryPages != null && queryPages[currentPageIndex] != null
+ && queryPages[currentPageIndex].getData(PAGE_KEY) instanceof AbstractRepositoryQueryPage) {
+ ((AbstractRepositoryQueryPage) queryPages[currentPageIndex].getData(PAGE_KEY)).setControlsEnabled(false);
+ }
+ if (repositoryCombo.getSelectionIndex() > -1) {
+ pageContainer.setPerformActionEnabled(true);
+ }
+ } else {
+ //setControlsEnabled(queryPages[currentPageIndex], true);
+ if (queryPages != null && queryPages[currentPageIndex] != null
+ && queryPages[currentPageIndex].getData(PAGE_KEY) instanceof AbstractRepositoryQueryPage) {
+ ((AbstractRepositoryQueryPage) queryPages[currentPageIndex].getData(PAGE_KEY)).setControlsEnabled(true);
+ }
+ //setControlsEnabled(queryPages[currentPageIndex], true);
+ //pageContainer.setPerformActionEnabled(false);
+ }
+ }
+
+ private Control createPage(TaskRepository repository, ITaskSearchPage searchPage) {
+ // Page wrapper
+ final Composite pageWrapper = new Composite(fParentComposite, SWT.NONE);
+ pageWrapper.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ pageWrapper.setLayout(layout);
+
+ searchPage.setContainer(taskSearchPageContainer);
+ try {
+ searchPage.createControl(pageWrapper);
+ } catch (Exception e) {
+ pageWrapper.dispose();
+ searchPage.dispose();
+
+ searchPage = new DeadSearchPage(repository);
+ searchPage.setContainer(taskSearchPageContainer);
+ searchPage.createControl(fParentComposite);
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Error occurred while constructing search page for " + repository.getRepositoryUrl() + " [" //$NON-NLS-1$ //$NON-NLS-2$
+ + repository.getConnectorKind() + "]", e)); //$NON-NLS-1$
+ searchPage.getControl().setData(PAGE_KEY, searchPage);
+ return searchPage.getControl();
+ }
+
+ // XXX: work around for initial search page size issue bug#198493
+ IDialogSettings searchDialogSettings = SearchPlugin.getDefault().getDialogSettingsSection(
+ "DialogBounds_SearchDialog"); //$NON-NLS-1$
+ if (searchDialogSettings.get("DIALOG_WIDTH") == null) { //$NON-NLS-1$
+ fParentComposite.getParent().getShell().pack();
+ }
+ pageWrapper.setData(PAGE_KEY, searchPage);
+ return pageWrapper;
+ }
+
+ private void displayQueryPage(int pageIndex) {
+ if (currentPageIndex == pageIndex || pageIndex < 0) {
+ return;
+ }
+
+ // TODO: if repository == null display invalid page?
+ if (currentPageIndex != -1 && queryPages[currentPageIndex] != null) {
+ queryPages[currentPageIndex].setVisible(false);
+ ITaskSearchPage page = (ITaskSearchPage) queryPages[currentPageIndex].getData(PAGE_KEY);
+ page.setVisible(false);
+ GridData data = (GridData) queryPages[currentPageIndex].getLayoutData();
+ data.exclude = true;
+ queryPages[currentPageIndex].setLayoutData(data);
+ }
+
+ String repositoryLabel = repositoryCombo.getItem(pageIndex);
+ repository = (TaskRepository) repositoryCombo.getData(repositoryLabel);
+
+ if (queryPages[pageIndex] == null) {
+ if (repository != null) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ if (connectorUi != null) {
+ ITaskSearchPage searchPage = getSearchPage(connectorUi);
+ if (searchPage != null) {
+ queryPages[pageIndex] = createPage(repository, searchPage);
+ } else {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ if (connector.canCreateTaskFromKey(repository)) {
+ queryPages[pageIndex] = createPage(repository, new NoSearchPage(repository));
+ }
+ }
+ }
+
+ }
+ }
+
+ // update enablement of the task id field
+ if (repository != null) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ if (connector.canCreateTaskFromKey(repository)) {
+ keyText.setEnabled(true);
+ } else {
+ keyText.setEnabled(false);
+ }
+ }
+
+ if (queryPages[pageIndex] != null) {
+ GridData data = (GridData) queryPages[pageIndex].getLayoutData();
+ if (data == null) {
+ data = new GridData();
+ }
+ data.exclude = false;
+ queryPages[pageIndex].setLayoutData(data);
+ queryPages[pageIndex].setVisible(true);
+ ITaskSearchPage page = (ITaskSearchPage) queryPages[pageIndex].getData(PAGE_KEY);
+ page.setVisible(true);
+ }
+
+ currentPageIndex = pageIndex;
+ fParentComposite.getParent().layout(true, true);
+ updatePageEnablement();
+
+ }
+
+ private ITaskSearchPage getSearchPage(AbstractRepositoryConnectorUi connectorUi) {
+ if (connectorUi.hasSearchPage()) {
+ return connectorUi.getSearchPage(repository, null);
+ }
+ return null;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ if (firstView) {
+ firstView = false;
+ getControl().setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
+
+ List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
+ List<TaskRepository> searchableRepositories = new ArrayList<TaskRepository>();
+ for (TaskRepository repository : repositories) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ if ((connectorUi != null && connectorUi.hasSearchPage() && !repository.isOffline())
+ || connector.canCreateTaskFromKey(repository)) {
+ searchableRepositories.add(repository);
+ }
+ }
+
+ Collections.sort(searchableRepositories, new TaskRepositoryComparator());
+
+ String[] repositoryUrls = new String[searchableRepositories.size()];
+ int i = 0;
+ int indexToSelect = 0;
+ for (TaskRepository currRepsitory : searchableRepositories) {
+ if (repository != null && repository.equals(currRepsitory)) {
+ indexToSelect = i;
+ }
+ repositoryUrls[i] = currRepsitory.getRepositoryUrl();
+ i++;
+ }
+
+ IDialogSettings settings = getDialogSettings();
+ if (repositoryCombo != null) {
+ for (int x = 0; x < searchableRepositories.size(); x++) {
+ repositoryCombo.add(searchableRepositories.get(x).getRepositoryLabel());
+ repositoryCombo.setData(searchableRepositories.get(x).getRepositoryLabel(),
+ searchableRepositories.get(x));
+ }
+ if (repositoryUrls.length == 0) {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
+ Messages.TaskSearchPage_Repository_Search, TaskRepositoryManager.MESSAGE_NO_REPOSITORY);
+ } else {
+ String selectRepo = settings.get(STORE_REPO_ID);
+ if (selectRepo != null && repositoryCombo.indexOf(selectRepo) > -1) {
+ repositoryCombo.select(repositoryCombo.indexOf(selectRepo));
+ repository = (TaskRepository) repositoryCombo.getData(selectRepo);
+ if (repository == null) {
+ // TODO: Display no repository error
+ }
+ } else {
+ repositoryCombo.select(indexToSelect);
+ }
+
+ // TODO: Create one page per connector and repopulate based on repository
+ queryPages = new Control[repositoryUrls.length];
+ displayQueryPage(repositoryCombo.getSelectionIndex());
+ // updateAttributesFromRepository(repositoryCombo.getText(),
+ // null, false);
+ }
+ }
+ }
+
+ if (queryPages == null) {
+ pageContainer.setPerformActionEnabled(false);
+ }
+
+ super.setVisible(visible);
+
+ setDefaultValuesAndFocus();
+ }
+
+ private void setDefaultValuesAndFocus() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ if (page != null) {
+ String repositoryUrl = null;
+ IWorkbenchPart part = page.getActivePart();
+ if (part instanceof ISearchResultViewPart) {
+ ISearchQuery[] queries = NewSearchUI.getQueries();
+ if (queries.length > 0) {
+ if (queries[0] instanceof SearchHitCollector) {
+ repositoryUrl = ((SearchHitCollector) queries[0]).getRepositoryQuery().getRepositoryUrl();
+ }
+ }
+ }
+// if (repositoryUrl == null) {
+// IEditorPart editor = page.getActiveEditor();
+// if (editor instanceof TaskEditor) {
+// repositoryUrl = ((TaskEditor) editor).getTaskEditorInput().getTask().getRepositoryUrl();
+// }
+// }
+// if (repositoryUrl == null) {
+// TaskListView taskListView = TaskListView.getFromActivePerspective();
+// if (taskListView != null) {
+// AbstractTask selectedTask = taskListView.getSelectedTask();
+// if (selectedTask != null) {
+// repositoryUrl = selectedTask.getRepositoryUrl();
+// }
+// }
+// }
+ if (repositoryUrl != null) {
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(repositoryUrl);
+ if (repository != null) {
+ int index = 0;
+ for (String repositoryLabel : repositoryCombo.getItems()) {
+ if (repositoryLabel.equals(repository.getRepositoryLabel())) {
+ repositoryCombo.select(index);
+ }
+ index++;
+ }
+ displayQueryPage(repositoryCombo.getSelectionIndex());
+ }
+ }
+ }
+ }
+
+ if (keyText.getText() != null && keyText.getText().trim().length() > 0) {
+ keyText.setFocus();
+ keyText.setSelection(0, keyText.getText().length());
+ } else {
+ Clipboard clipboard = new Clipboard(Display.getDefault());
+ TextTransfer transfer = TextTransfer.getInstance();
+ String contents = (String) clipboard.getContents(transfer);
+ if (contents != null) {
+ if (isTaskKeyCandidate(contents.trim())) {
+ keyText.setText(contents.trim());
+ keyText.setFocus();
+ keyText.setSelection(0, keyText.getText().length());
+ }
+ }
+ }
+ updatePageEnablement();
+ }
+
+ private boolean isTaskKeyCandidate(String contents) {
+ boolean looksLikeKey = false;
+ try {
+ Integer.parseInt(contents);
+ looksLikeKey = true;
+ } catch (NumberFormatException nfe) {
+ }
+ if (!looksLikeKey) {
+ try {
+ Integer.parseInt(contents.substring(contents.lastIndexOf('-')));
+ looksLikeKey = true;
+ } catch (Exception e) {
+ }
+ }
+ return looksLikeKey;
+ }
+
+ public IDialogSettings getDialogSettings() {
+ IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
+ fDialogSettings = settings.getSection(PAGE_NAME);
+ if (fDialogSettings == null) {
+ fDialogSettings = settings.addNewSection(PAGE_NAME);
+ }
+ return fDialogSettings;
+ }
+
+ private void saveDialogSettings() {
+ IDialogSettings settings = getDialogSettings();
+ settings.put(STORE_REPO_ID, repositoryCombo.getText());
+ }
+
+ @Override
+ public void dispose() {
+ if (queryPages != null) {
+ for (Control control : queryPages) {
+ if (control != null) {
+ ITaskSearchPage page = (ITaskSearchPage) control.getData(PAGE_KEY);
+ page.dispose();
+ }
+ }
+ }
+ super.dispose();
+ }
+
+ private class DeadSearchPage extends AbstractRepositoryQueryPage {
+
+ public DeadSearchPage(TaskRepository rep) {
+ super("Search page error", rep); //$NON-NLS-1$
+ }
+
+ public void createControl(Composite parent) {
+ Hyperlink hyperlink = new Hyperlink(parent, SWT.NONE);
+ hyperlink.setText(Messages.TaskSearchPage_ERROR_Unable_to_present_query_page);
+ hyperlink.setUnderlined(true);
+ hyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TaskSearchPage.this.getControl().getShell().close();
+ TasksUiUtil.openEditRepositoryWizard(getTaskRepository());
+ // TODO: Re-construct this page with new
+ // repository data
+ }
+
+ });
+
+ GridDataFactory.fillDefaults().applyTo(hyperlink);
+ setControl(hyperlink);
+ }
+
+ @Override
+ public IRepositoryQuery getQuery() {
+ return null;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return false;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ getSearchContainer().setPerformActionEnabled(false);
+ }
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return null;
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ // ignore
+ }
+
+ }
+
+ private class NoSearchPage extends AbstractRepositoryQueryPage {
+
+ public NoSearchPage(TaskRepository rep) {
+ super("No search page", rep); //$NON-NLS-1$
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ Dialog.applyDialogFont(composite);
+ setControl(composite);
+ }
+
+ @Override
+ public IRepositoryQuery getQuery() {
+ return null;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return false;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible) {
+ getSearchContainer().setPerformActionEnabled(false);
+ }
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return null;
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ // ignore
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskTrimWidget.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskTrimWidget.java
new file mode 100644
index 0000000..b6c2383
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskTrimWidget.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.tasks.ui.actions.RepositoryElementActionGroup;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+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.Menu;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.internal.ObjectActionContributorManager;
+import org.eclipse.ui.internal.WorkbenchWindow;
+import org.eclipse.ui.internal.layout.IWindowTrim;
+import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
+
+/**
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ */
+public class TaskTrimWidget extends WorkbenchWindowControlContribution {
+
+ public static String ID_CONTAINER = "org.eclipse.mylyn.tasks.ui.trim.container"; //$NON-NLS-1$
+
+ public static String ID_CONTROL = "org.eclipse.mylyn.tasks.ui.trim.control"; //$NON-NLS-1$
+
+ private Composite composite;
+
+ private ITask activeTask;
+
+ private MenuManager menuManager;
+
+ private Menu menu;
+
+ private TaskHyperlink activeTaskLabel;
+
+ private Point p;
+
+ private final ITaskActivationListener TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
+
+ @Override
+ public void taskActivated(ITask task) {
+ activeTask = task;
+ indicateActiveTask();
+ }
+
+ @Override
+ public void taskDeactivated(ITask task) {
+ activeTask = null;
+ indicateNoActiveTask();
+ }
+
+ };
+
+ private final IPropertyChangeListener SHOW_TRIM_LISTENER = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getProperty();
+ if (property.equals(ITasksUiPreferenceConstants.SHOW_TRIM)) {
+ setTrimVisible((Boolean) event.getNewValue());
+ }
+ }
+ };
+
+ private SelectionProviderAdapter activeTaskSelectionProvider;
+
+ public TaskTrimWidget() {
+ TasksUi.getTaskActivityManager().addActivationListener(TASK_ACTIVATION_LISTENER);
+ TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(SHOW_TRIM_LISTENER);
+ hookContextMenu();
+ }
+
+ private void setTrimVisible(boolean visible) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window instanceof WorkbenchWindow) {
+ IWindowTrim trim = ((WorkbenchWindow) window).getTrimManager().getTrim(ID_CONTAINER);
+ if (trim != null) {
+ ((WorkbenchWindow) window).getTrimManager().setTrimVisible(trim, visible);
+ ((WorkbenchWindow) window).getTrimManager().forceLayout();
+ }
+ }
+ }
+
+ @Override
+ public void dispose() {
+ if (composite != null && !composite.isDisposed()) {
+ composite.dispose();
+ }
+ composite = null;
+
+ if (menuManager != null) {
+ menuManager.removeAll();
+ menuManager.dispose();
+ }
+ menuManager = null;
+
+ if (menu != null && !menu.isDisposed()) {
+ menu.dispose();
+ }
+ menu = null;
+
+ TasksUi.getTaskActivityManager().removeActivationListener(TASK_ACTIVATION_LISTENER);
+ TasksUiPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(SHOW_TRIM_LISTENER);
+ }
+
+ @Override
+ protected Control createControl(Composite parent) {
+ composite = new Composite(parent, SWT.NONE);
+
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.horizontalSpacing = 0;
+ layout.marginHeight = 0;
+ layout.marginLeft = 0;
+ layout.marginRight = 0;
+ composite.setLayout(layout);
+
+ composite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, true));
+
+ createStatusComposite(composite);
+
+ parent.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IPreferenceStore uiPreferenceStore = TasksUiPlugin.getDefault().getPreferenceStore();
+ setTrimVisible(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.SHOW_TRIM));
+ }
+ });
+
+ return composite;
+ }
+
+ private Composite createStatusComposite(final Composite container) {
+ GC gc = new GC(container);
+ p = gc.textExtent("WWWWWWWWWWWWWWW"); //$NON-NLS-1$
+ gc.dispose();
+
+ activeTaskLabel = new TaskHyperlink(container, SWT.RIGHT);
+ // activeTaskLabel.setLayoutData(new GridData(p.x, SWT.DEFAULT));
+ GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, false, true);
+ gridData.widthHint = p.x;
+ gridData.minimumWidth = p.x;
+ gridData.horizontalIndent = 0;
+ activeTaskLabel.setLayoutData(gridData);
+ activeTaskLabel.setText(Messages.TaskTrimWidget__no_task_active_);
+
+ activeTask = TasksUi.getTaskActivityManager().getActiveTask();
+ if (activeTask != null) {
+ indicateActiveTask();
+ }
+
+ activeTaskLabel.addMenuDetectListener(new MenuDetectListener() {
+ public void menuDetected(MenuDetectEvent e) {
+ if (menu != null) {
+ menu.dispose();
+ }
+ menu = menuManager.createContextMenu(container);
+ menu.setVisible(true);
+ }
+ });
+
+ activeTaskLabel.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TaskListView taskListView = TaskListView.getFromActivePerspective();
+ if (taskListView != null && taskListView.getDrilledIntoCategory() != null) {
+ taskListView.goUpToRoot();
+ }
+ TasksUiInternal.refreshAndOpenTaskListElement((TasksUi.getTaskActivityManager().getActiveTask()));
+ }
+ });
+
+ activeTaskLabel.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseDown(MouseEvent e) {
+ // only handle left clicks, context menu is handled by platform
+ if (e.button == 1) {
+ if (activeTask == null) {
+ return;
+ }
+
+ TaskListView taskListView = TaskListView.getFromActivePerspective();
+ if (taskListView != null && taskListView.getDrilledIntoCategory() != null) {
+ taskListView.goUpToRoot();
+ }
+
+ TasksUiInternal.refreshAndOpenTaskListElement(activeTask);
+ }
+ }
+ });
+
+ return activeTaskLabel;
+ }
+
+ private void hookContextMenu() {
+ activeTaskSelectionProvider = new SelectionProviderAdapter();
+
+ final RepositoryElementActionGroup actionGroup = new RepositoryElementActionGroup();
+ actionGroup.setSelectionProvider(activeTaskSelectionProvider);
+
+ menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ actionGroup.fillContextMenu(manager);
+ // trims do not have a workbench part so there is no simple way of registering the
+ // context menu
+ ObjectActionContributorManager.getManager().contributeObjectActions(null, manager,
+ activeTaskSelectionProvider);
+ }
+ });
+ }
+
+ public void indicateActiveTask() {
+ if (activeTaskLabel != null && activeTaskLabel.isDisposed()) {
+ return;
+ }
+
+ //activeTaskLabel.setText(shortenText(activeTask.getSummary()));
+ activeTaskLabel.setText(activeTask.getSummary());
+ activeTaskLabel.setUnderlined(true);
+ activeTaskLabel.setToolTipText(activeTask.getSummary());
+ activeTaskSelectionProvider.setSelection(new StructuredSelection(activeTask));
+ }
+
+ public void indicateNoActiveTask() {
+ if (activeTaskLabel != null && activeTaskLabel.isDisposed()) {
+ return;
+ }
+
+ activeTaskLabel.setText(Messages.TaskTrimWidget__no_active_task_);
+ activeTaskLabel.setUnderlined(false);
+ activeTaskLabel.setToolTipText(""); //$NON-NLS-1$
+ activeTaskSelectionProvider.setSelection(StructuredSelection.EMPTY);
+ }
+
+// // From PerspectiveBarContributionItem
+// private String shortenText(String taskLabel) {
+// if (taskLabel == null || composite == null || composite.isDisposed()) {
+// return null;
+// }
+//
+// String returnText = taskLabel;
+// GC gc = new GC(composite);
+// int maxWidth = p.x;
+//
+// if (gc.textExtent(taskLabel).x > maxWidth) {
+// for (int i = taskLabel.length(); i > 0; i--) {
+// String test = taskLabel.substring(0, i);
+// test = test + "...";
+// if (gc.textExtent(test).x < maxWidth) {
+// returnText = test;
+// break;
+// }
+// }
+// }
+//
+// gc.dispose();
+// return returnText;
+// }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java
new file mode 100644
index 0000000..eb1aa08
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TaskWorkingSetFilter.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.ui.IWorkingSet;
+
+/**
+ * AbstractTaskListFilter for task working sets
+ *
+ * @author Eugene Kuleshov
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskWorkingSetFilter extends AbstractTaskListFilter {
+
+ private IAdaptable[] elements;
+
+ @Override
+ public boolean select(Object parent, Object element) {
+ if (parent instanceof ITask) {
+ return true;
+ }
+
+ if (parent == null && element instanceof ScheduledTaskContainer) {
+ return true;
+ }
+
+ if (parent == null && element instanceof IRepositoryElement) {
+ return isContainedInWorkingSet((IRepositoryElement) element);
+ }
+ if (parent instanceof ITaskContainer && !(parent instanceof ScheduledTaskContainer)) {
+ return isContainedInWorkingSet((IRepositoryElement) parent);
+ }
+ if (element instanceof LocalTask) {
+ for (IRepositoryElement container : ((LocalTask) element).getParentContainers()) {
+ return isContainedInWorkingSet(container);
+ }
+ }
+ if (parent instanceof ScheduledTaskContainer && element instanceof ITask) {
+ for (IRepositoryElement query : ((AbstractTask) element).getParentContainers()) {
+ if (isContainedInWorkingSet(query)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ return true;
+ }
+
+ public boolean select(ITask task) {
+ for (IRepositoryElement query : ((AbstractTask) task).getParentContainers()) {
+ if (isContainedInWorkingSet(query)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean applyToFilteredText() {
+ return true;
+ }
+
+ private boolean isContainedInWorkingSet(IRepositoryElement element) {
+ return isContainedInWorkingSet(element, new HashSet<IRepositoryElement>());
+ }
+
+ private boolean isContainedInWorkingSet(IRepositoryElement container, Set<IRepositoryElement> visited) {
+ if (elements == null) {
+ return true;
+ }
+
+ if (visited.contains(container)) {
+ return false;
+ }
+
+ visited.add(container);
+
+ boolean seenTaskWorkingSets = false;
+ String handleIdentifier = container.getHandleIdentifier();
+ for (IAdaptable adaptable : elements) {
+ if (adaptable instanceof IRepositoryElement) {
+ seenTaskWorkingSets = true;
+ if (handleIdentifier.equals(((IRepositoryElement) adaptable).getHandleIdentifier())) {
+ return true;
+ }
+
+ // handle case of sub tasks (not directly under a category/query)
+ if (container instanceof AbstractTask) {
+ for (AbstractTaskContainer parent : ((AbstractTask) container).getParentContainers()) {
+ if (visited.contains(parent)) {
+ continue;
+ }
+ if (isContainedInWorkingSet(parent, visited)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return !seenTaskWorkingSets;
+ }
+
+ public boolean updateWorkingSet(IWorkingSet currentWorkingSet) {
+ IAdaptable[] newElements = currentWorkingSet.getElements();
+ if (!Arrays.equals(this.elements, newElements)) {
+ this.elements = newElements;
+ return true;
+ }
+ return false;
+ }
+
+ public IAdaptable[] getElements() {
+ return elements;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksAdapterFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksAdapterFactory.java
new file mode 100644
index 0000000..8ada916
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksAdapterFactory.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+
+/**
+ * Factory for adapting objects to task elements.
+ *
+ * @author Steffen Pingel
+ */
+public class TasksAdapterFactory implements IAdapterFactory {
+
+ private static final Class<?>[] ADAPTER_LIST = new Class[] { ITask.class, TaskRepository.class };
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return ADAPTER_LIST;
+ }
+
+ public Object getAdapter(final Object adaptable, @SuppressWarnings("unchecked") Class adapterType) {
+ if (adapterType == ITask.class) {
+ if (adaptable instanceof TaskEditorInput) {
+ return ((TaskEditorInput) adaptable).getTask();
+ } else if (adaptable instanceof ITaskAttachment) {
+ return ((ITaskAttachment) adaptable).getTask();
+ } else if (adaptable instanceof ITaskComment) {
+ return ((ITaskComment) adaptable).getTask();
+ }
+ }
+ if (adapterType == TaskRepository.class) {
+ if (adaptable instanceof TaskEditorInput) {
+ return ((TaskEditorInput) adaptable).getTaskRepository();
+ } else if (adaptable instanceof ITaskAttachment) {
+ return ((ITaskAttachment) adaptable).getTaskRepository();
+ } else if (adaptable instanceof ITaskComment) {
+ return ((ITaskComment) adaptable).getTask();
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksReminderDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksReminderDialog.java
new file mode 100644
index 0000000..e71d429
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksReminderDialog.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Ken Sueda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import com.ibm.icu.text.DateFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+/**
+ * @author Ken Sueda
+ */
+public class TasksReminderDialog extends Dialog {
+ private List<AbstractTask> tasks = null;
+
+ private Table table = null;
+
+ private TableViewer tableViewer = null;
+
+ private final String[] columnNames = new String[] { Messages.TasksReminderDialog_Description, Messages.TasksReminderDialog_Priority, Messages.TasksReminderDialog_Reminder_Day };
+
+ private static final int DISMISS_ALL_ID = 200;
+
+ private static final int DISMISS_ID = 201;
+
+ private static final int SNOOZE_ID = 202;
+
+ private static long DAY = 24 * 3600 * 1000;
+
+ public TasksReminderDialog(Shell parentShell, List<AbstractTask> remTasks) {
+ super(parentShell);
+ tasks = remTasks;
+ setShellStyle(SWT.CLOSE | SWT.MIN | SWT.MODELESS | SWT.BORDER | SWT.TITLE);
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(Messages.TasksReminderDialog_Reminders);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ setBlockOnOpen(false);
+ GridLayout gl = new GridLayout(1, false);
+ composite.setLayout(gl);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ composite.setLayoutData(data);
+
+ Composite container = new Composite(composite, SWT.NONE);
+ gl = new GridLayout(1, false);
+ container.setLayout(gl);
+ createTable(container);
+ createTableViewer();
+
+ return composite;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, DISMISS_ALL_ID, Messages.TasksReminderDialog_Dismiss_All, false);
+ createButton(parent, DISMISS_ID, Messages.TasksReminderDialog_Dismiss_Selected, false);
+ createButton(parent, SNOOZE_ID, Messages.TasksReminderDialog_Remind_tommorrow, true);
+ }
+
+ private void createTable(Composite parent) {
+ int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
+ table = new Table(parent, style);
+ GridLayout tlayout = new GridLayout();
+ table.setLayout(tlayout);
+ GridData wd = new GridData(GridData.FILL_BOTH);
+ wd.heightHint = 300;
+ table.setLayoutData(wd);
+
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ TableColumn column = new TableColumn(table, SWT.LEFT, 0);
+ column.setText(columnNames[0]);
+ column.setWidth(180);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new ReminderTaskSorter(ReminderTaskSorter.DESCRIPTION));
+
+ }
+ });
+
+ column = new TableColumn(table, SWT.LEFT, 1);
+ column.setText(columnNames[1]);
+ column.setWidth(50);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new ReminderTaskSorter(ReminderTaskSorter.PRIORITY));
+ }
+ });
+
+ column = new TableColumn(table, SWT.LEFT, 2);
+ column.setText(columnNames[2]);
+ column.setWidth(100);
+ column.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ tableViewer.setSorter(new ReminderTaskSorter(ReminderTaskSorter.DATE));
+ }
+ });
+ }
+
+ private void createTableViewer() {
+ tableViewer = new TableViewer(table);
+ tableViewer.setUseHashlookup(true);
+ tableViewer.setContentProvider(new ReminderTasksContentProvider());
+ tableViewer.setLabelProvider(new ReminderTasksLabelProvider());
+ tableViewer.setInput(tasks);
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == DISMISS_ALL_ID) {
+ for (ITask t : tasks) {
+ ((AbstractTask) t).setReminded(true);
+ }
+ okPressed();
+ } else if (buttonId == DISMISS_ID) {
+ Object sel = ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
+ if (sel != null && sel instanceof ITask) {
+ ITask t = (ITask) sel;
+ ((AbstractTask) t).setReminded(true);
+ tasks.remove(t);
+ if (tasks.isEmpty()) {
+ okPressed();
+ } else {
+ tableViewer.refresh();
+ }
+ }
+ } else if (buttonId == SNOOZE_ID) {
+ Object sel = ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
+ if (sel != null && sel instanceof ITask) {
+ ITask t = (ITask) sel;
+ ((AbstractTask) t).setReminded(false);
+ ((AbstractTask) t).setScheduledForDate(TaskActivityUtil.getDayOf(new Date(new Date().getTime() + DAY)));
+ tasks.remove(t);
+ if (tasks.isEmpty()) {
+ okPressed();
+ } else {
+ tableViewer.refresh();
+ }
+ }
+ }
+ super.buttonPressed(buttonId);
+ }
+
+ private class ReminderTasksContentProvider implements IStructuredContentProvider {
+
+ public Object[] getElements(Object inputElement) {
+ return tasks.toArray();
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ private static class ReminderTasksLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof ITask) {
+ AbstractTask task = (AbstractTask) element;
+ switch (columnIndex) {
+ case 0:
+ return task.getSummary();
+ case 1:
+ return task.getPriority();
+ case 2:
+ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getScheduledForDate());
+ }
+ }
+ return null;
+ }
+
+ }
+
+ private static class ReminderTaskSorter extends ViewerSorter {
+
+ public final static int DESCRIPTION = 1;
+
+ public final static int PRIORITY = 2;
+
+ public final static int DATE = 3;
+
+ private final int criteria;
+
+ public ReminderTaskSorter(int criteria) {
+ super();
+ this.criteria = criteria;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object obj1, Object obj2) {
+ ITask t1 = (ITask) obj1;
+ ITask t2 = (ITask) obj2;
+
+ switch (criteria) {
+ case DESCRIPTION:
+ return compareDescription(t1, t2);
+ case PRIORITY:
+ return comparePriority(t1, t2);
+ case DATE:
+ return compareDate((AbstractTask) t1, (AbstractTask) t2);
+ default:
+ return 0;
+ }
+ }
+
+ private int compareDescription(ITask task1, ITask task2) {
+ return task1.getSummary().compareToIgnoreCase(task2.getSummary());
+ }
+
+ private int comparePriority(ITask task1, ITask task2) {
+ return task1.getPriority().compareTo(task2.getPriority());
+ }
+
+ private int compareDate(AbstractTask task1, AbstractTask task2) {
+ return task2.getScheduledForDate().compareTo(task1.getScheduledForDate());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiFactory.java
new file mode 100644
index 0000000..aaaf5f6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiFactory.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * David Green - fix for bug 263418
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryCompletionProcessor;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.ITasksUiFactory;
+
+/**
+ * @author Steffen Pingel
+ * @author David Green
+ */
+public class TasksUiFactory implements ITasksUiFactory {
+
+ public IContentProposalProvider createPersonContentProposalProvider(TaskRepository repository) {
+ return new PersonProposalProvider(repository.getRepositoryUrl(), repository.getConnectorKind());
+ }
+
+ public ILabelProvider createPersonContentProposalLabelProvider(TaskRepository repository) {
+ return new PersonProposalLabelProvider();
+ }
+
+ public IContentAssistProcessor createTaskContentAssistProcessor(TaskRepository repository) {
+ return new RepositoryCompletionProcessor(repository);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java
new file mode 100644
index 0000000..5078fc2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/TasksUiPlugin.java
@@ -0,0 +1,1254 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.eclipse.core.net.proxy.IProxyChangeEvent;
+import org.eclipse.core.net.proxy.IProxyChangeListener;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ISaveContext;
+import org.eclipse.core.resources.ISaveParticipant;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryModelListener;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryExternalizationParticipant;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTemplateManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataStore;
+import org.eclipse.mylyn.internal.tasks.core.externalization.ExternalizationManager;
+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.ui.notifications.TaskListNotificationReminder;
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiExtensionReader;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView;
+import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.progress.IProgressService;
+import org.eclipse.ui.progress.UIJob;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Main entry point for the Tasks UI.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class TasksUiPlugin extends AbstractUIPlugin {
+
+ private static final int DELAY_QUERY_REFRESH_ON_STARTUP = 20 * 1000;
+
+ private static final int DEFAULT_LINK_PROVIDER_TIMEOUT = 5 * 1000;
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.tasks.ui"; //$NON-NLS-1$
+
+ private static final String DIRECTORY_METADATA = ".metadata"; //$NON-NLS-1$
+
+ private static final String NAME_DATA_DIR = ".mylyn"; //$NON-NLS-1$
+
+ private static final char DEFAULT_PATH_SEPARATOR = '/';
+
+ private static final int NOTIFICATION_DELAY = 5000;
+
+ private static TasksUiPlugin INSTANCE;
+
+ private static ExternalizationManager externalizationManager;
+
+ private static TaskActivityManager taskActivityManager;
+
+ private static TaskRepositoryManager repositoryManager;
+
+ private static TaskListSynchronizationScheduler synchronizationScheduler;
+
+ private static TaskDataManager taskDataManager;
+
+ private static Map<String, AbstractRepositoryConnectorUi> repositoryConnectorUiMap = new HashMap<String, AbstractRepositoryConnectorUi>();
+
+ private TaskListNotificationManager taskListNotificationManager;
+
+ private TaskListBackupManager taskListBackupManager;
+
+ private RepositoryTemplateManager repositoryTemplateManager;
+
+ private final Set<AbstractTaskEditorPageFactory> taskEditorPageFactories = new HashSet<AbstractTaskEditorPageFactory>();
+
+ private final TreeSet<AbstractTaskRepositoryLinkProvider> repositoryLinkProviders = new TreeSet<AbstractTaskRepositoryLinkProvider>(
+ new OrderComparator());
+
+ private TaskListExternalizer taskListExternalizer;
+
+ private ITaskHighlighter highlighter;
+
+ private final Map<String, Image> brandingIcons = new HashMap<String, Image>();
+
+ private final Map<String, ImageDescriptor> overlayIcons = new HashMap<String, ImageDescriptor>();
+
+ private final Set<AbstractDuplicateDetector> duplicateDetectors = new HashSet<AbstractDuplicateDetector>();
+
+ private ISaveParticipant saveParticipant;
+
+ private TaskEditorBloatMonitor taskEditorBloatManager;
+
+ private TaskJobFactory taskJobFactory;
+
+ // shared colors for all forms
+ private FormColors formColors;
+
+ private final List<AbstractSearchHandler> searchHandlers = new ArrayList<AbstractSearchHandler>();
+
+ private static final boolean DEBUG_HTTPCLIENT = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.mylyn.tasks.ui/debug/httpclient")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // XXX reconsider if this is necessary
+ public static class TasksUiStartup implements IStartup {
+
+ public void earlyStartup() {
+ // ignore
+ }
+ }
+
+ private static final class OrderComparator implements Comparator<AbstractTaskRepositoryLinkProvider> {
+ public int compare(AbstractTaskRepositoryLinkProvider p1, AbstractTaskRepositoryLinkProvider p2) {
+ return p1.getOrder() - p2.getOrder();
+ }
+ }
+
+ public enum TaskListSaveMode {
+ ONE_HOUR, THREE_HOURS, DAY;
+ @Override
+ public String toString() {
+ switch (this) {
+ case ONE_HOUR:
+ return "1 hour"; //$NON-NLS-1$
+ case THREE_HOURS:
+ return "3 hours"; //$NON-NLS-1$
+ case DAY:
+ return "1 day"; //$NON-NLS-1$
+ default:
+ return "3 hours"; //$NON-NLS-1$
+ }
+ }
+
+ public static TaskListSaveMode fromString(String string) {
+ if (string == null) {
+ return null;
+ }
+ if (string.equals("1 hour")) { //$NON-NLS-1$
+ return ONE_HOUR;
+ }
+ if (string.equals("3 hours")) { //$NON-NLS-1$
+ return THREE_HOURS;
+ }
+ if (string.equals("1 day")) { //$NON-NLS-1$
+ return DAY;
+ }
+ return null;
+ }
+
+ public static long fromStringToLong(String string) {
+ long hour = 3600 * 1000;
+ switch (fromString(string)) {
+ case ONE_HOUR:
+ return hour;
+ case THREE_HOURS:
+ return hour * 3;
+ case DAY:
+ return hour * 24;
+ default:
+ return hour * 3;
+ }
+ }
+ }
+
+ public enum ReportOpenMode {
+ EDITOR, INTERNAL_BROWSER, EXTERNAL_BROWSER;
+ }
+
+ private static ITaskActivationListener CONTEXT_TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
+
+ @Override
+ public void taskActivated(final ITask task) {
+ ContextCore.getContextManager().activateContext(task.getHandleIdentifier());
+ }
+
+ @Override
+ public void taskDeactivated(final ITask task) {
+ ContextCore.getContextManager().deactivateContext(task.getHandleIdentifier());
+ }
+
+ };
+
+ private static ITaskListNotificationProvider REMINDER_NOTIFICATION_PROVIDER = new ITaskListNotificationProvider() {
+
+ public Set<AbstractNotification> getNotifications() {
+ Collection<AbstractTask> allTasks = TasksUiPlugin.getTaskList().getAllTasks();
+ Set<AbstractNotification> reminders = new HashSet<AbstractNotification>();
+ for (AbstractTask task : allTasks) {
+ if (TasksUiPlugin.getTaskActivityManager().isPastReminder(task) && !task.isReminded()) {
+ reminders.add(new TaskListNotificationReminder(task));
+ task.setReminded(true);
+ }
+ }
+ return reminders;
+ }
+ };
+
+// private static ITaskListNotificationProvider INCOMING_NOTIFICATION_PROVIDER = new ITaskListNotificationProvider() {
+//
+// @SuppressWarnings( { "deprecation", "restriction" })
+// public Set<AbstractNotification> getNotifications() {
+// Set<AbstractNotification> notifications = new HashSet<AbstractNotification>();
+// // Incoming Changes
+// for (TaskRepository repository : getRepositoryManager().getAllRepositories()) {
+// AbstractRepositoryConnector connector = getRepositoryManager().getRepositoryConnector(
+// repository.getConnectorKind());
+// if (connector instanceof AbstractLegacyRepositoryConnector) {
+// AbstractRepositoryConnectorUi connectorUi = getConnectorUi(repository.getConnectorKind());
+// if (connectorUi != null && !connectorUi.hasCustomNotifications()) {
+// for (ITask itask : TasksUiPlugin.getTaskList().getTasks(repository.getRepositoryUrl())) {
+// if (itask instanceof AbstractTask) {
+// AbstractTask task = (AbstractTask) itask;
+// if ((task.getLastReadTimeStamp() == null || task.getSynchronizationState() == SynchronizationState.INCOMING)
+// && task.isNotified() == false) {
+// TaskListNotification notification = LegacyChangeManager.getIncommingNotification(
+// connector, task);
+// notifications.add(notification);
+// task.setNotified(true);
+// }
+// }
+// }
+// }
+// }
+// }
+// // New query hits
+// for (RepositoryQuery query : TasksUiPlugin.getTaskList().getQueries()) {
+// TaskRepository repository = getRepositoryManager().getRepository(query.getRepositoryUrl());
+// if (repository != null) {
+// AbstractRepositoryConnector connector = getRepositoryManager().getRepositoryConnector(
+// repository.getConnectorKind());
+// if (connector instanceof AbstractLegacyRepositoryConnector) {
+// AbstractRepositoryConnectorUi connectorUi = getConnectorUi(repository.getConnectorKind());
+// if (!connectorUi.hasCustomNotifications()) {
+// for (ITask hit : query.getChildren()) {
+// if (((AbstractTask) hit).isNotified() == false) {
+// notifications.add(new TaskListNotificationQueryIncoming(hit));
+// ((AbstractTask) hit).setNotified(true);
+// }
+// }
+// }
+// }
+// }
+// }
+// return notifications;
+// }
+// };
+
+// private final IPropertyChangeListener PREFERENCE_LISTENER = new IPropertyChangeListener() {
+//
+// public void propertyChange(PropertyChangeEvent event) {
+// // TODO: do we ever get here?
+//// if (event.getProperty().equals(ContextPreferenceContstants.PREF_DATA_DIR)) {
+//// if (event.getOldValue() instanceof String) {
+//// reloadDataDirectory();
+//// }
+//// }
+// }
+// };
+
+ private final org.eclipse.jface.util.IPropertyChangeListener PROPERTY_LISTENER = new org.eclipse.jface.util.IPropertyChangeListener() {
+
+ public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
+ if (event.getProperty().equals(ITasksUiPreferenceConstants.PLANNING_ENDHOUR)
+ || event.getProperty().equals(ITasksUiPreferenceConstants.WEEK_START_DAY)) {
+ updateTaskActivityManager();
+ }
+
+ if (event.getProperty().equals(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED)
+ || event.getProperty().equals(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS)) {
+ updateSynchronizationScheduler(false);
+ }
+ }
+ };
+
+ private TaskActivityMonitor taskActivityMonitor;
+
+ private ServiceReference proxyServiceReference;
+
+ private IProxyChangeListener proxyChangeListener;
+
+ private static TaskListExternalizationParticipant taskListExternalizationParticipant;
+
+ private final Set<IRepositoryModelListener> listeners = new HashSet<IRepositoryModelListener>();
+
+ private static TaskList taskList;
+
+ private static RepositoryModel repositoryModel;
+
+ private static TasksUiFactory uiFactory;
+
+ @Deprecated
+ public static String LABEL_VIEW_REPOSITORIES = Messages.TasksUiPlugin_Task_Repositories;
+
+ private class TasksUiInitializationJob extends UIJob {
+
+ public TasksUiInitializationJob() {
+ super(Messages.TasksUiPlugin_Initializing_Task_List);
+ setSystem(true);
+ }
+
+ @SuppressWarnings("restriction")
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ // NOTE: failure in one part of the initialization should
+ // not prevent others
+ monitor.beginTask("Initializing Task List", 5); //$NON-NLS-1$
+ try {
+ // Needs to run after workbench is loaded because it
+ // relies on images.
+ TasksUiExtensionReader.initWorkbenchUiExtensions();
+
+ if (externalizationManager.getLoadStatus() != null) {
+ // XXX: recovery from task list load failure (Rendered in task list)
+ }
+
+ List<String> commandLineArgs = Arrays.asList(Platform.getCommandLineArgs());
+ boolean activateTask = !commandLineArgs.contains(ITasksCoreConstants.COMMAND_LINE_NO_ACTIVATE_TASK);
+ if (activateTask) {
+ try {
+ Field field = org.eclipse.core.internal.resources.Workspace.class.getDeclaredField("crashed"); //$NON-NLS-1$
+ field.setAccessible(true);
+ Object value = field.get(ResourcesPlugin.getWorkspace());
+ if (value instanceof Boolean) {
+ activateTask = !(Boolean) value;
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ // ignore
+ }
+ }
+ // Needs to happen asynchronously to avoid bug 159706
+ for (AbstractTask task : taskList.getAllTasks()) {
+ if (task.isActive()) {
+ // the externalizer might set multiple tasks active
+ task.setActive(false);
+ if (activateTask) {
+ // make sure only one task is activated
+ taskActivityManager.activateTask(task);
+ activateTask = false;
+ }
+ }
+ }
+ //taskActivityMonitor.reloadActivityTime();
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not initialize task activity", t)); //$NON-NLS-1$
+ }
+ monitor.worked(1);
+
+ try {
+ taskListNotificationManager.addNotificationProvider(REMINDER_NOTIFICATION_PROVIDER);
+// taskListNotificationManager.addNotificationProvider(INCOMING_NOTIFICATION_PROVIDER);
+ taskListNotificationManager.addNotificationProvider(new TaskListNotifier(getRepositoryModel(),
+ getTaskDataManager()));
+ taskListNotificationManager.startNotification(NOTIFICATION_DELAY);
+ getPreferenceStore().addPropertyChangeListener(taskListNotificationManager);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not initialize notifications", t)); //$NON-NLS-1$
+ }
+ monitor.worked(1);
+
+ try {
+ taskListBackupManager = new TaskListBackupManager(getBackupFolderPath());
+ getPreferenceStore().addPropertyChangeListener(taskListBackupManager);
+
+ synchronizationScheduler = new TaskListSynchronizationScheduler(taskJobFactory);
+ updateSynchronizationScheduler(true);
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not initialize task list backup and synchronization", t)); //$NON-NLS-1$
+ }
+ monitor.worked(1);
+
+ try {
+
+ getPreferenceStore().addPropertyChangeListener(PROPERTY_LISTENER);
+
+ // TODO: get rid of this, hack to make decorators show
+ // up on startup
+ TaskRepositoriesView repositoriesView = TaskRepositoriesView.getFromActivePerspective();
+ if (repositoriesView != null) {
+ repositoriesView.getViewer().refresh();
+ }
+
+ taskEditorBloatManager = new TaskEditorBloatMonitor();
+ taskEditorBloatManager.install(PlatformUI.getWorkbench());
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not finish Tasks UI initialization", t)); //$NON-NLS-1$
+ } finally {
+ monitor.done();
+ }
+ return new Status(IStatus.OK, TasksUiPlugin.ID_PLUGIN, IStatus.OK, "", null); //$NON-NLS-1$
+ }
+ }
+
+ public TasksUiPlugin() {
+ super();
+ INSTANCE = this;
+ }
+
+ private void updateSynchronizationScheduler(boolean initial) {
+ boolean enabled = TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED);
+ if (enabled) {
+ long interval = TasksUiPlugin.getDefault().getPreferenceStore().getLong(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS);
+ if (initial) {
+ synchronizationScheduler.setInterval(DELAY_QUERY_REFRESH_ON_STARTUP, interval);
+ } else {
+ synchronizationScheduler.setInterval(interval);
+ }
+ } else {
+ synchronizationScheduler.setInterval(0);
+ }
+ }
+
+ @SuppressWarnings( { "restriction" })
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ // NOTE: startup order is very sensitive
+ try {
+ // initialize framework and settings
+ if (DEBUG_HTTPCLIENT) {
+ // do this before anything else, once commons logging is initialized and an instance
+ // of Log has been created it's too late
+ initHttpLogging();
+ }
+ WebUtil.init();
+ initializePreferences(getPreferenceStore());
+
+ // initialize CommonFonts from UI thread: bug 240076
+ if (CommonFonts.BOLD == null) {
+ // ignore
+ }
+
+ File dataDir = new File(getDataDirectory());
+ dataDir.mkdirs();
+
+ // create data model
+ externalizationManager = new ExternalizationManager(getDataDirectory());
+
+ repositoryManager = new TaskRepositoryManager();
+ IExternalizationParticipant repositoryParticipant = new RepositoryExternalizationParticipant(
+ externalizationManager, repositoryManager);
+ externalizationManager.addParticipant(repositoryParticipant);
+
+ taskList = new TaskList();
+ repositoryModel = new RepositoryModel(taskList, repositoryManager);
+ taskListExternalizer = new TaskListExternalizer(repositoryModel, repositoryManager);
+
+ taskListExternalizationParticipant = new TaskListExternalizationParticipant(repositoryModel, taskList,
+ taskListExternalizer, externalizationManager, repositoryManager);
+ //externalizationManager.load(taskListSaveParticipant);
+ externalizationManager.addParticipant(taskListExternalizationParticipant);
+ taskList.addChangeListener(taskListExternalizationParticipant);
+
+ taskActivityManager = new TaskActivityManager(repositoryManager, taskList);
+ taskActivityManager.addActivationListener(taskListExternalizationParticipant);
+
+ // initialize
+ updateTaskActivityManager();
+
+ proxyServiceReference = context.getServiceReference(IProxyService.class.getName());
+ if (proxyServiceReference != null) {
+ IProxyService proxyService = (IProxyService) context.getService(proxyServiceReference);
+ if (proxyService != null) {
+ proxyChangeListener = new IProxyChangeListener() {
+ public void proxyInfoChanged(IProxyChangeEvent event) {
+ List<TaskRepository> repos = repositoryManager.getAllRepositories();
+ for (TaskRepository repo : repos) {
+ if (repo.isDefaultProxyEnabled()) {
+ repositoryManager.notifyRepositorySettingsChanged(repo);
+ }
+ }
+ }
+ };
+ proxyService.addProxyChangeListener(proxyChangeListener);
+ }
+ }
+
+ repositoryTemplateManager = new RepositoryTemplateManager();
+
+ // NOTE: initializing extensions in start(..) has caused race
+ // conditions previously
+ TasksUiExtensionReader.initStartupExtensions(taskListExternalizer);
+
+ // instantiate taskDataManager
+ TaskDataStore taskDataStore = new TaskDataStore(repositoryManager);
+ taskDataManager = new TaskDataManager(taskDataStore, repositoryManager, taskList, taskActivityManager);
+
+ taskJobFactory = new TaskJobFactory(taskList, taskDataManager, repositoryManager, repositoryModel);
+
+ taskActivityManager.addActivationListener(CONTEXT_TASK_ACTIVATION_LISTENER);
+
+ taskActivityMonitor = new TaskActivityMonitor(taskActivityManager, ContextCorePlugin.getContextManager());
+ taskActivityMonitor.start();
+
+ saveParticipant = new ISaveParticipant() {
+
+ public void doneSaving(ISaveContext context) {
+ }
+
+ public void prepareToSave(ISaveContext context) throws CoreException {
+ }
+
+ public void rollback(ISaveContext context) {
+ }
+
+ public void saving(ISaveContext context) throws CoreException {
+ if (context.getKind() == ISaveContext.FULL_SAVE) {
+ externalizationManager.stop();
+ }
+ }
+ };
+ ResourcesPlugin.getWorkspace().addSaveParticipant(this, saveParticipant);
+
+ ActivityExternalizationParticipant ACTIVITY_EXTERNALIZTAION_PARTICIPANT = new ActivityExternalizationParticipant(
+ externalizationManager);
+ externalizationManager.addParticipant(ACTIVITY_EXTERNALIZTAION_PARTICIPANT);
+ taskActivityManager.addActivityListener(ACTIVITY_EXTERNALIZTAION_PARTICIPANT);
+ taskActivityMonitor.setExternalizationParticipant(ACTIVITY_EXTERNALIZTAION_PARTICIPANT);
+
+ // initialize managers
+ initializeDataSources();
+
+ // make this available early for clients that are not initialized through tasks ui but need access
+ taskListNotificationManager = new TaskListNotificationManager();
+
+ // trigger lazy initialization
+ new TasksUiInitializationJob().schedule();
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Task list initialization failed", e)); //$NON-NLS-1$
+ }
+ }
+
+ private void initHttpLogging() {
+ System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); //$NON-NLS-1$ //$NON-NLS-2$
+ System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+ System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug"); //$NON-NLS-1$ //$NON-NLS-2$
+ System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire.header", "debug"); //$NON-NLS-1$ //$NON-NLS-2$
+ System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "debug"); //$NON-NLS-1$ //$NON-NLS-2$
+ System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient.HttpConnection", //$NON-NLS-1$
+ "trace"); //$NON-NLS-1$
+ System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.axis.message", "debug"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void updateTaskActivityManager() {
+ int endHour = getPreferenceStore().getInt(ITasksUiPreferenceConstants.PLANNING_ENDHOUR);
+// if (taskActivityManager.getEndHour() != endHour) {
+// taskActivityManager.setEndHour(endHour);
+ TaskActivityUtil.setEndHour(endHour);
+// }
+
+ int newWeekStartDay = getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY);
+ int oldWeekStartDay = taskActivityManager.getWeekStartDay();
+ if (oldWeekStartDay != newWeekStartDay) {
+ taskActivityManager.setWeekStartDay(newWeekStartDay);
+// taskActivityManager.setStartTime(new Date());
+ }
+
+ // event.getProperty().equals(TaskListPreferenceConstants.PLANNING_STARTDAY)
+ // scheduledStartHour =
+ // TasksUiPlugin.getDefault().getPreferenceStore().getInt(
+ // TaskListPreferenceConstants.PLANNING_STARTHOUR);
+ }
+
+ private void loadTemplateRepositories() {
+ // Add standard local task repository
+ getLocalTaskRepository();
+
+ // Add the automatically created templates
+ for (AbstractRepositoryConnector connector : repositoryManager.getRepositoryConnectors()) {
+ for (RepositoryTemplate template : repositoryTemplateManager.getTemplates(connector.getConnectorKind())) {
+ if (template.addAutomatically && !TaskRepositoryUtil.isAddAutomaticallyDisabled(template.repositoryUrl)) {
+ try {
+ String repositoryUrl = TaskRepositoryManager.stripSlashes(template.repositoryUrl);
+ TaskRepository taskRepository = repositoryManager.getRepository(connector.getConnectorKind(),
+ repositoryUrl);
+ if (taskRepository == null) {
+ taskRepository = new TaskRepository(connector.getConnectorKind(), repositoryUrl);
+ taskRepository.setVersion(template.version);
+ taskRepository.setRepositoryLabel(template.label);
+ taskRepository.setCharacterEncoding(template.characterEncoding);
+ if (template.anonymous) {
+ taskRepository.setCredentials(AuthenticationType.REPOSITORY, null, true);
+ }
+ repositoryManager.addRepository(taskRepository);
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load repository template", t)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the local task repository. If the repository does not exist it is created and added to the task
+ * repository manager.
+ *
+ * @return the local task repository; never <code>null</code>
+ * @since 3.0
+ */
+ public TaskRepository getLocalTaskRepository() {
+ TaskRepository localRepository = repositoryManager.getRepository(LocalRepositoryConnector.CONNECTOR_KIND,
+ LocalRepositoryConnector.REPOSITORY_URL);
+ if (localRepository == null) {
+ localRepository = new TaskRepository(LocalRepositoryConnector.CONNECTOR_KIND,
+ LocalRepositoryConnector.REPOSITORY_URL);
+ localRepository.setVersion(LocalRepositoryConnector.REPOSITORY_VERSION);
+ localRepository.setRepositoryLabel(LocalRepositoryConnector.REPOSITORY_LABEL);
+ repositoryManager.addRepository(localRepository);
+ }
+ return localRepository;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ try {
+ if (formColors != null) {
+ formColors.dispose();
+ formColors = null;
+ }
+ if (taskActivityMonitor != null) {
+ taskActivityMonitor.stop();
+ }
+
+ if (ResourcesPlugin.getWorkspace() != null) {
+ ResourcesPlugin.getWorkspace().removeSaveParticipant(this);
+ }
+
+ if (proxyServiceReference != null) {
+ IProxyService proxyService = (IProxyService) context.getService(proxyServiceReference);
+ if (proxyService != null) {
+ proxyService.removeProxyChangeListener(proxyChangeListener);
+ }
+ context.ungetService(proxyServiceReference);
+ }
+
+ if (PlatformUI.isWorkbenchRunning()) {
+ getPreferenceStore().removePropertyChangeListener(taskListNotificationManager);
+ getPreferenceStore().removePropertyChangeListener(taskListBackupManager);
+ getPreferenceStore().removePropertyChangeListener(PROPERTY_LISTENER);
+ //taskListManager.getTaskList().removeChangeListener(taskListSaveManager);
+ CommonColors.dispose();
+// if (ContextCorePlugin.getDefault() != null) {
+// ContextCorePlugin.getDefault().getPluginPreferences().removePropertyChangeListener(
+// PREFERENCE_LISTENER);
+// }
+ taskEditorBloatManager.dispose(PlatformUI.getWorkbench());
+ INSTANCE = null;
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Task list stop terminated abnormally", e)); //$NON-NLS-1$
+ } finally {
+ super.stop(context);
+ }
+ }
+
+ public String getDefaultDataDirectory() {
+ return ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + '/' + DIRECTORY_METADATA + '/'
+ + NAME_DATA_DIR;
+ }
+
+ public String getDataDirectory() {
+ return getPreferenceStore().getString(ITasksUiPreferenceConstants.PREF_DATA_DIR);
+ }
+
+ /**
+ * Persist <code>path</code> as data directory and loads data from <code>path</code>. This method may block if other
+ * jobs are running that modify tasks data. This method will only execute after all conflicting jobs have been
+ * completed.
+ *
+ * @throws CoreException
+ * in case setting of the data directory did not complete normally
+ * @throws OperationCanceledException
+ * if the operation is cancelled by the user
+ */
+ public void setDataDirectory(final String path) throws CoreException {
+ Assert.isNotNull(path);
+ IRunnableWithProgress runner = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ monitor.beginTask(Messages.TasksUiPlugin_Load_Data_Directory, IProgressMonitor.UNKNOWN);
+ if (monitor.isCanceled()) {
+ throw new InterruptedException();
+ }
+
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+
+ // set new preference in case of a change
+ if (!path.equals(getDataDirectory())) {
+ getPreferenceStore().setValue(ITasksUiPreferenceConstants.PREF_DATA_DIR, path);
+ }
+
+ // reload data from new directory
+ initializeDataSources();
+ } finally {
+ // FIXME roll back preferences change in case of an error?
+ monitor.done();
+ }
+ }
+ };
+
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ try {
+ service.runInUI(service, runner, ITasksCoreConstants.ROOT_SCHEDULING_RULE);
+ } catch (InvocationTargetException e) {
+ throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to set data directory", //$NON-NLS-1$
+ e.getCause()));
+ } catch (InterruptedException e) {
+ throw new OperationCanceledException();
+ }
+ }
+
+ public void reloadDataDirectory() throws CoreException {
+ // no save just load what is there
+ setDataDirectory(getDataDirectory());
+ }
+
+ /**
+ * Invoked on startup and when data is loaded from disk or when the data directory changes.
+ *
+ * <p>
+ * Public for testing.
+ */
+ @SuppressWarnings("restriction")
+ public void initializeDataSources() {
+ taskDataManager.setDataPath(getDataDirectory());
+ externalizationManager.setRootFolderPath(getDataDirectory());
+ ContextCorePlugin.getContextStore().setContextDirectory(getContextStoreDir());
+
+ externalizationManager.load();
+ // TODO: Move management of template repositories to TaskRepositoryManager
+ loadTemplateRepositories();
+
+ taskActivityManager.clear();
+ ContextCorePlugin.getContextManager().loadActivityMetaContext();
+ taskActivityMonitor.reloadActivityTime();
+ taskActivityManager.reloadPlanningData();
+
+ // inform listeners that initialization is complete
+ for (final IRepositoryModelListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, "Listener failed: " //$NON-NLS-1$
+ + listener.getClass(), exception));
+ }
+
+ public void run() throws Exception {
+ listener.loaded();
+ }
+ });
+ }
+ }
+
+ private File getContextStoreDir() {
+ File storeFile = new File(getDataDirectory(), ITasksCoreConstants.CONTEXTS_DIRECTORY);
+ if (!storeFile.exists()) {
+ storeFile.mkdirs();
+ }
+ return storeFile;
+ }
+
+ @SuppressWarnings("deprecation")
+ private void initializePreferences(IPreferenceStore store) {
+ store.setDefault(ITasksUiPreferenceConstants.PREF_DATA_DIR, getDefaultDataDirectory());
+ store.setDefault(ITasksUiPreferenceConstants.GROUP_SUBTASKS, true);
+ store.setDefault(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED, true);
+ store.setDefault(ITasksUiPreferenceConstants.FILTER_PRIORITY, PriorityLevel.P5.toString());
+ store.setDefault(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH, true);
+ store.setDefault(ITasksUiPreferenceConstants.ACTIVATE_WHEN_OPENED, false);
+ store.setDefault(ITasksUiPreferenceConstants.SHOW_TRIM, false);
+ // remove preference
+ store.setToDefault(ITasksUiPreferenceConstants.LOCAL_SUB_TASKS_ENABLED);
+ store.setDefault(ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED, true);
+
+ store.setDefault(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, true);
+ store.setDefault(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS, "" + (20 * 60 * 1000)); //$NON-NLS-1$
+
+ //store.setDefault(TasksUiPreferenceConstants.BACKUP_SCHEDULE, 1);
+ store.setDefault(ITasksUiPreferenceConstants.BACKUP_MAXFILES, 20);
+ store.setDefault(ITasksUiPreferenceConstants.BACKUP_LAST, 0f);
+
+ store.setDefault(ITasksUiPreferenceConstants.FILTER_ARCHIVE_MODE, true);
+ store.setDefault(ITasksUiPreferenceConstants.ACTIVATE_MULTIPLE, false);
+ store.setValue(ITasksUiPreferenceConstants.ACTIVATE_MULTIPLE, false);
+
+ store.setDefault(ITasksUiPreferenceConstants.WEEK_START_DAY, Calendar.getInstance().getFirstDayOfWeek());
+ //store.setDefault(TasksUiPreferenceConstants.PLANNING_STARTHOUR, 9);
+ store.setDefault(ITasksUiPreferenceConstants.PLANNING_ENDHOUR, 18);
+
+ store.setDefault(ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST, true);
+ }
+
+ public static TaskActivityManager getTaskActivityManager() {
+ return taskActivityManager;
+ }
+
+ public static TaskListNotificationManager getTaskListNotificationManager() {
+ return INSTANCE.taskListNotificationManager;
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static TasksUiPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ public boolean groupSubtasks(ITaskContainer element) {
+ boolean groupSubtasks = TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.GROUP_SUBTASKS);
+
+ if (element instanceof ITask) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(((ITask) element).getConnectorKind());
+ if (connectorUi != null) {
+ if (connectorUi.hasStrictSubtaskHierarchy()) {
+ groupSubtasks = true;
+ }
+ }
+ }
+
+ if (element instanceof IRepositoryQuery) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(((IRepositoryQuery) element).getConnectorKind());
+ if (connectorUi != null) {
+ if (connectorUi.hasStrictSubtaskHierarchy()) {
+ groupSubtasks = true;
+ }
+ }
+ }
+
+ return groupSubtasks;
+ }
+
+ private final Map<String, List<IDynamicSubMenuContributor>> menuContributors = new HashMap<String, List<IDynamicSubMenuContributor>>();
+
+ public Map<String, List<IDynamicSubMenuContributor>> getDynamicMenuMap() {
+ return menuContributors;
+ }
+
+ public void addDynamicPopupContributor(String menuPath, IDynamicSubMenuContributor contributor) {
+ List<IDynamicSubMenuContributor> contributors = menuContributors.get(menuPath);
+ if (contributors == null) {
+ contributors = new ArrayList<IDynamicSubMenuContributor>();
+ menuContributors.put(menuPath, contributors);
+ }
+ contributors.add(contributor);
+ }
+
+ public String[] getSaveOptions() {
+ String[] options = { TaskListSaveMode.ONE_HOUR.toString(), TaskListSaveMode.THREE_HOURS.toString(),
+ TaskListSaveMode.DAY.toString() };
+ return options;
+ }
+
+ public String getBackupFolderPath() {
+ return getDataDirectory() + DEFAULT_PATH_SEPARATOR + ITasksCoreConstants.DEFAULT_BACKUP_FOLDER_NAME;
+ }
+
+ public ITaskHighlighter getHighlighter() {
+ return highlighter;
+ }
+
+ public void setHighlighter(ITaskHighlighter highlighter) {
+ this.highlighter = highlighter;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public AbstractTaskEditorPageFactory[] getTaskEditorPageFactories() {
+ return taskEditorPageFactories.toArray(new AbstractTaskEditorPageFactory[0]);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void addTaskEditorPageFactory(AbstractTaskEditorPageFactory factory) {
+ Assert.isNotNull(factory);
+ taskEditorPageFactories.add(factory);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void removeTaskEditorPageFactory(AbstractTaskEditorPageFactory factory) {
+ Assert.isNotNull(factory);
+ taskEditorPageFactories.remove(factory);
+ }
+
+ public static TaskRepositoryManager getRepositoryManager() {
+ return repositoryManager;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static RepositoryTemplateManager getRepositoryTemplateManager() {
+ return INSTANCE.repositoryTemplateManager;
+ }
+
+ public void addBrandingIcon(String repositoryType, Image icon) {
+ brandingIcons.put(repositoryType, icon);
+ }
+
+ public Image getBrandingIcon(String repositoryType) {
+ return brandingIcons.get(repositoryType);
+ }
+
+ public void addOverlayIcon(String repositoryType, ImageDescriptor icon) {
+ overlayIcons.put(repositoryType, icon);
+ }
+
+ public ImageDescriptor getOverlayIcon(String repositoryType) {
+ return overlayIcons.get(repositoryType);
+ }
+
+ public void addRepositoryLinkProvider(AbstractTaskRepositoryLinkProvider repositoryLinkProvider) {
+ if (repositoryLinkProvider != null) {
+ this.repositoryLinkProviders.add(repositoryLinkProvider);
+ }
+ }
+
+ public static TaskListBackupManager getBackupManager() {
+ return INSTANCE.taskListBackupManager;
+ }
+
+ public void addRepositoryConnectorUi(AbstractRepositoryConnectorUi repositoryConnectorUi) {
+ if (!repositoryConnectorUiMap.values().contains(repositoryConnectorUi)) {
+ repositoryConnectorUiMap.put(repositoryConnectorUi.getConnectorKind(), repositoryConnectorUi);
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static AbstractRepositoryConnector getConnector(String kind) {
+ return getRepositoryManager().getRepositoryConnector(kind);
+ }
+
+ public static AbstractRepositoryConnectorUi getConnectorUi(String kind) {
+ return repositoryConnectorUiMap.get(kind);
+ }
+
+ public static TaskListSynchronizationScheduler getSynchronizationScheduler() {
+ return synchronizationScheduler;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static TaskDataManager getTaskDataManager() {
+ return taskDataManager;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static TaskJobFactory getTaskJobFactory() {
+ return INSTANCE.taskJobFactory;
+ }
+
+ public void addDuplicateDetector(AbstractDuplicateDetector duplicateDetector) {
+ Assert.isNotNull(duplicateDetector);
+ duplicateDetectors.add(duplicateDetector);
+ }
+
+ public Set<AbstractDuplicateDetector> getDuplicateSearchCollectorsList() {
+ return duplicateDetectors;
+ }
+
+ public String getRepositoriesFilePath() {
+ return getDataDirectory() + File.separator + TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE;
+ }
+
+ public void addModelListener(IRepositoryModelListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeModelListener(IRepositoryModelListener listener) {
+ listeners.remove(listener);
+ }
+
+ public boolean canSetRepositoryForResource(final IResource resource) {
+ if (resource == null) {
+ return false;
+ }
+
+ // if a repository has already been linked only that provider should be queried to ensure that it is the same
+ // provider that is used by getRepositoryForResource()
+ final boolean result[] = new boolean[1];
+ final boolean found[] = new boolean[1];
+ for (final AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Task repository link provider failed: \"" + linkProvider.getId() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ if (linkProvider.getTaskRepository(resource, getRepositoryManager()) != null) {
+ found[0] = true;
+ result[0] = linkProvider.canSetTaskRepository(resource);
+ }
+ }
+ });
+ if (found[0]) {
+ return result[0];
+ }
+ }
+
+ // find a provider that can set new repository
+ for (final AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Task repository link provider failed: \"" + linkProvider.getId() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ if (linkProvider.canSetTaskRepository(resource)) {
+ result[0] = true;
+ }
+ }
+ });
+ if (result[0]) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Associate a Task Repository with a workbench project
+ *
+ * @param resource
+ * project or resource belonging to a project
+ * @param repository
+ * task repository to associate with given project
+ * @throws CoreException
+ */
+ public void setRepositoryForResource(final IResource resource, final TaskRepository repository) {
+ Assert.isNotNull(resource);
+ for (final AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Task repository link provider failed: \"" + linkProvider.getId() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ boolean canSetRepository = linkProvider.canSetTaskRepository(resource);
+ if (canSetRepository) {
+ linkProvider.setTaskRepository(resource, repository);
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * Retrieve the task repository that has been associated with the given project (or resource belonging to a project)
+ *
+ * NOTE: if call does not return in LINK_PROVIDER_TIMEOUT_SECONDS, the provide will be disabled until the next time
+ * that the Workbench starts.
+ */
+ public TaskRepository getRepositoryForResource(final IResource resource) {
+ Assert.isNotNull(resource);
+ long timeout;
+ try {
+ timeout = Long.parseLong(System.getProperty(ITasksCoreConstants.PROPERTY_LINK_PROVIDER_TIMEOUT,
+ DEFAULT_LINK_PROVIDER_TIMEOUT + "")); //$NON-NLS-1$
+ } catch (NumberFormatException e) {
+ timeout = DEFAULT_LINK_PROVIDER_TIMEOUT;
+ }
+ Set<AbstractTaskRepositoryLinkProvider> defectiveLinkProviders = new HashSet<AbstractTaskRepositoryLinkProvider>();
+ for (final AbstractTaskRepositoryLinkProvider linkProvider : repositoryLinkProviders) {
+ long startTime = System.currentTimeMillis();
+ final TaskRepository[] repository = new TaskRepository[1];
+ SafeRunnable.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ID_PLUGIN, "Task repository link provider failed: \"" //$NON-NLS-1$
+ + linkProvider.getId() + "\"", e)); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ repository[0] = linkProvider.getTaskRepository(resource, getRepositoryManager());
+ }
+ });
+ long elapsed = System.currentTimeMillis() - startTime;
+ if (timeout >= 0 && elapsed > timeout) {
+ defectiveLinkProviders.add(linkProvider);
+ }
+ if (repository[0] != null) {
+ return repository[0];
+ }
+ }
+ if (!defectiveLinkProviders.isEmpty()) {
+ repositoryLinkProviders.removeAll(defectiveLinkProviders);
+ StatusHandler.log(new Status(IStatus.WARNING, ID_PLUGIN, "Repository link provider took over " + timeout //$NON-NLS-1$
+ + " ms to execute and was timed out: \"" + defectiveLinkProviders + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return null;
+ }
+
+ public static ExternalizationManager getExternalizationManager() {
+ return externalizationManager;
+ }
+
+ public static TaskActivityMonitor getTaskActivityMonitor() {
+ return INSTANCE.taskActivityMonitor;
+ }
+
+ public static TaskList getTaskList() {
+ return taskList;
+ }
+
+ public static RepositoryModel getRepositoryModel() {
+ return repositoryModel;
+ }
+
+ /**
+ * Note: This is provisional API that is used by connectors.
+ * <p>
+ * DO NOT CHANGE.
+ */
+ public void addSearchHandler(AbstractSearchHandler searchHandler) {
+ searchHandlers.add(searchHandler);
+ }
+
+ /**
+ * Note: This is provisional API that is used by connectors.
+ * <p>
+ * DO NOT CHANGE.
+ */
+ public void removeSearchHandler(AbstractSearchHandler searchHandler) {
+ searchHandlers.remove(searchHandler);
+ }
+
+ public AbstractSearchHandler getSearchHandler(String connectorKind) {
+ Assert.isNotNull(connectorKind);
+ for (AbstractSearchHandler searchHandler : searchHandlers) {
+ if (searchHandler.getConnectorKind().equals(connectorKind)) {
+ return searchHandler;
+ }
+ }
+ return null;
+ }
+
+ public FormColors getFormColors(Display display) {
+ if (formColors == null) {
+ formColors = new FormColors(display);
+ formColors.markShared();
+ }
+ return formColors;
+ }
+
+ public void removeRepositoryLinkProvider(AbstractTaskRepositoryLinkProvider provider) {
+ repositoryLinkProviders.remove(provider);
+ }
+
+ public TaskListExternalizer createTaskListExternalizer() {
+ return new TaskListExternalizer(repositoryModel, repositoryManager);
+ }
+
+ public static TaskListExternalizationParticipant getTaskListExternalizationParticipant() {
+ return taskListExternalizationParticipant;
+ }
+
+ public static TasksUiFactory getUiFactory() {
+ if (uiFactory == null) {
+ uiFactory = new TasksUiFactory();
+ }
+ return uiFactory;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractChangeCompletionAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractChangeCompletionAction.java
new file mode 100644
index 0000000..a0e6c93
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractChangeCompletionAction.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Mik Kersten
+ */
+public class AbstractChangeCompletionAction extends Action {
+
+ protected boolean shouldEnable(List<IRepositoryElement> selectedElements) {
+ boolean allLocalTasks = true;
+ for (IRepositoryElement abstractTaskContainer : selectedElements) {
+ if (!(abstractTaskContainer instanceof ITask)) {
+ allLocalTasks = false;
+ break;
+ } else if (!((AbstractTask) abstractTaskContainer).isLocal()) {
+ allLocalTasks = false;
+ break;
+ }
+ }
+ return allLocalTasks;
+ }
+
+ protected String generateMessage(List<AbstractTask> toComplete, String status) {
+ String message = MessageFormat.format(Messages.AbstractChangeCompletionAction_Mark_selected_local_tasks_X, status)
+ + "\n\n"; //$NON-NLS-1$
+ int i = 0;
+ for (ITask task : toComplete) {
+ i++;
+ if (i < 20) {
+ message += " "; //$NON-NLS-1$
+ if (task.getTaskKey() != null) {
+ message += task.getTaskKey() + ": "; //$NON-NLS-1$
+ }
+ message += task.getSummary() + "\n"; //$NON-NLS-1$
+ } else {
+ message += "..."; //$NON-NLS-1$
+ break;
+ }
+ }
+ return message;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskAction.java
new file mode 100644
index 0000000..d8a6c4a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * @author Rob Elves
+ */
+public abstract class AbstractTaskAction extends Action {
+
+ protected List<IRepositoryElement> selectedElements;
+
+ @Override
+ public void run() {
+ for (IRepositoryElement element : selectedElements) {
+ if (element instanceof ITask) {
+ AbstractTask repositoryTask = (AbstractTask) element;
+ performActionOnTask(repositoryTask);
+ } else if (element instanceof IRepositoryQuery) {
+ RepositoryQuery repositoryQuery = (RepositoryQuery) element;
+ for (ITask queryHit : repositoryQuery.getChildren()) {
+ performActionOnTask(queryHit);
+ }
+ } else if (element instanceof ITaskContainer) {
+ ITaskContainer container = (ITaskContainer) element;
+ for (ITask task : container.getChildren()) {
+ if (task != null) {
+ ITask repositoryTask = task;
+ performActionOnTask(repositoryTask);
+ }
+ }
+ }
+ }
+ }
+
+ protected abstract void performActionOnTask(ITask repositoryTask);
+
+ protected boolean containsArchiveContainer(List<AbstractTaskContainer> selectedElements) {
+ return false;//selectedElements.contains(TasksUiPlugin.getTaskList().getArchiveContainer());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskEditorAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskEditorAction.java
new file mode 100644
index 0000000..2c1e115
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskEditorAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Rob Elves
+ */
+public abstract class AbstractTaskEditorAction extends BaseSelectionListenerAction {
+
+ protected TaskEditor editor;
+
+ public AbstractTaskEditorAction(String text) {
+ super(text);
+ }
+
+ public void setEditor(TaskEditor taskEditor) {
+ this.editor = taskEditor;
+ }
+
+ protected boolean taskDirty(ITask task) {
+ return (((editor != null && editor.isDirty())
+ || task.getSynchronizationState().equals(SynchronizationState.OUTGOING) || task.getSynchronizationState()
+ .equals(SynchronizationState.CONFLICT)));
+
+ }
+
+ protected void openInformationDialog(String label, String text) {
+
+ Shell shell = null;
+ if (editor != null) {
+ shell = editor.getSite().getShell();
+ }
+ MessageDialog.openInformation(shell, label, text);
+ if (editor != null) {
+ editor.showBusy(false);
+ }
+ return;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskRepositoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskRepositoryAction.java
new file mode 100644
index 0000000..438618d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AbstractTaskRepositoryAction.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTaskRepositoryAction extends BaseSelectionListenerAction {
+
+ private boolean singleSelect;
+
+ public AbstractTaskRepositoryAction(String text) {
+ super(text);
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ if (selection != null && !selection.isEmpty()) {
+ if (singleSelect) {
+ Object[] array = selection.toArray();
+ if (array.length != 1) {
+ return false;
+ }
+ }
+ return getTaskRepository(selection.getFirstElement()) != null;
+ }
+ return false;
+ }
+
+ protected TaskRepository getTaskRepository(IStructuredSelection selection) {
+ if (selection != null && !selection.isEmpty()) {
+ return getTaskRepository(selection.getFirstElement());
+ }
+ return null;
+ }
+
+ protected TaskRepository getTaskRepository(Object selectedObject) {
+ TaskRepository taskRepository = null;
+ if (selectedObject instanceof TaskRepository) {
+ taskRepository = (TaskRepository) selectedObject;
+ } else if (selectedObject instanceof IRepositoryQuery) {
+ IRepositoryQuery query = (IRepositoryQuery) selectedObject;
+ taskRepository = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(),
+ query.getRepositoryUrl());
+ }
+
+ if (taskRepository != null && isUserManaged(taskRepository)) {
+ return taskRepository;
+ }
+ return null;
+ }
+
+ protected boolean isUserManaged(TaskRepository taskRepository) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ return connector != null && connector.isUserManaged();
+ }
+
+ protected boolean isSingleSelect() {
+ return singleSelect;
+ }
+
+ protected void setSingleSelect(boolean singleSelect) {
+ this.singleSelect = singleSelect;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskDialogAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskDialogAction.java
new file mode 100644
index 0000000..026f710
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskDialogAction.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.actions.ActionDelegate;
+
+/**
+ * @author Willian Mitsuda
+ * @author Mik Kersten
+ */
+public class ActivateTaskDialogAction extends ActionDelegate implements IWorkbenchWindowActionDelegate {
+
+ private IWorkbenchWindow window;
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ @Override
+ public void run(IAction action) {
+ TaskSelectionDialogWithRandom dialog = new TaskSelectionDialogWithRandom(window.getShell());
+ dialog.setActivateTask(true);
+ dialog.setTitle(Messages.ActivateTaskDialogAction_Activate_Task);
+ dialog.setMessage(Messages.ActivateTaskDialogAction_Select_a_task_to_activate__);
+
+ if (dialog.open() != Window.OK) {
+ return;
+ }
+
+ Object result = dialog.getFirstResult();
+ if (result instanceof ITask) {
+ AbstractTask task = (AbstractTask) result;
+ TasksUi.getTaskActivityManager().activateTask(task);
+ }
+ if (TaskListView.getFromActivePerspective() != null) {
+ TaskListView.getFromActivePerspective().refresh();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskHistoryDropDownAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskHistoryDropDownAction.java
new file mode 100644
index 0000000..95afd16
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ActivateTaskHistoryDropDownAction.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.ui.TaskHistoryDropDown;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
+
+/**
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ * @author Steffen Pingel
+ */
+public class ActivateTaskHistoryDropDownAction extends Action implements IWorkbenchWindowPulldownDelegate, IMenuCreator {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.navigate.previous"; //$NON-NLS-1$
+
+ private Menu dropDownMenu;
+
+ private final TaskActivationHistory taskHistory;
+
+ private final TaskHistoryDropDown taskHistoryDropDown;
+
+ public ActivateTaskHistoryDropDownAction() {
+ this.taskHistory = TasksUiPlugin.getTaskActivityManager().getTaskActivationHistory();
+ this.taskHistoryDropDown = new TaskHistoryDropDown(null, taskHistory);
+ setText(Messages.ActivateTaskHistoryDropDownAction_Activate_Previous_Task);
+ setToolTipText(Messages.ActivateTaskHistoryDropDownAction_Activate_Previous_Task);
+ setId(ID);
+ setEnabled(true);
+ setImageDescriptor(TasksUiImages.CONTEXT_HISTORY_PREVIOUS);
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public Menu getMenu(Control parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ taskHistoryDropDown.fill(dropDownMenu, -1);
+ return dropDownMenu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ taskHistoryDropDown.fill(dropDownMenu, -1);
+ return dropDownMenu;
+ }
+
+ public void init(IWorkbenchWindow window) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ if (taskHistory.hasPrevious()) {
+ AbstractTask previousTask = taskHistory.getPreviousTask();
+ if (previousTask != null && !previousTask.isActive()) {
+ TasksUiPlugin.getTaskActivityManager().activateTask(previousTask);
+ if (TaskListView.getFromActivePerspective() != null) {
+ TaskListView.getFromActivePerspective().refresh();
+ }
+ }
+ setEnabled(taskHistory.getPreviousTasks() != null && taskHistory.getPreviousTasks().size() > 0);
+ }
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java
new file mode 100644
index 0000000..77e6f99
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AddRepositoryAction.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * Balazs Brinkus - bug 174473
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.ITaskCommandIds;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @author David Green
+ */
+public class AddRepositoryAction extends Action {
+
+ private static final String PREF_ADD_QUERY = "org.eclipse.mylyn.internal.tasks.add.query"; //$NON-NLS-1$
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.add"; //$NON-NLS-1$
+
+ public static final String TITLE = Messages.AddRepositoryAction_Add_Task_Repository;
+
+ private boolean promptToAddQuery = true;
+
+ public AddRepositoryAction() {
+ setImageDescriptor(TasksUiImages.REPOSITORY_NEW);
+ setText(TITLE);
+ setId(ID);
+ boolean enabled = TasksUiPlugin.getRepositoryManager().hasUserManagedRepositoryConnectors();
+ if (!enabled) {
+ // bug 279054 enable the action if connector discovery is present/enabled
+ Command command = TasksUiInternal.getConfiguredDiscoveryWizardCommand();
+ enabled = command != null && command.isEnabled();
+ }
+ setEnabled(enabled);
+ }
+
+ public boolean getPromptToAddQuery() {
+ return promptToAddQuery;
+ }
+
+ public void setPromptToAddQuery(boolean promptToAddQuery) {
+ this.promptToAddQuery = promptToAddQuery;
+ }
+
+ @Override
+ public void run() {
+ showWizard();
+ }
+
+ public TaskRepository showWizard() {
+ IHandlerService handlerSvc = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+ try {
+ Object result = handlerSvc.executeCommand(ITaskCommandIds.ADD_TASK_REPOSITORY, null);
+ if (result instanceof TaskRepository) {
+ if (getPromptToAddQuery()) {
+ TaskRepository repository = (TaskRepository) result;
+ AbstractRepositoryConnector connector = TasksUiPlugin.getConnector(repository.getConnectorKind());
+ if (connector != null && connector.canQuery(repository)) {
+ promptToAddQuery(repository);
+ }
+ }
+ return (TaskRepository) result;
+ }
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ return null;
+ }
+
+ public void promptToAddQuery(TaskRepository taskRepository) {
+ IPreferenceStore preferenceStore = TasksUiPlugin.getDefault().getPreferenceStore();
+ if (!preferenceStore.getBoolean(PREF_ADD_QUERY)) {
+ Shell shell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ MessageDialogWithToggle messageDialog = MessageDialogWithToggle.openYesNoQuestion(shell,
+ Messages.AddRepositoryAction_Add_new_query,
+ Messages.AddRepositoryAction_Add_a_query_to_the_Task_List,
+ Messages.AddRepositoryAction_Do_not_show_again, false, preferenceStore, PREF_ADD_QUERY);
+ preferenceStore.setValue(PREF_ADD_QUERY, messageDialog.getToggleState());
+ if (messageDialog.getReturnCode() == IDialogConstants.YES_ID) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ IWizard queryWizard = connectorUi.getQueryWizard(taskRepository, null);
+ ((Wizard) queryWizard).setForcePreviousAndNextButtons(true);
+
+ WizardDialog queryDialog = new WizardDialog(shell, queryWizard);
+ queryDialog.create();
+ queryDialog.setBlockOnOpen(true);
+ queryDialog.open();
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AutoUpdateQueryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AutoUpdateQueryAction.java
new file mode 100644
index 0000000..4e798ab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/AutoUpdateQueryAction.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Collections;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AutoUpdateQueryAction extends BaseSelectionListenerAction {
+
+ public AutoUpdateQueryAction() {
+ super(Messages.AutoUpdateQueryAction_Synchronize_Automatically_Label);
+ setChecked(false);
+ setEnabled(false);
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ if (selection.size() == 1) {
+ Object element = selection.getFirstElement();
+ if (element instanceof RepositoryQuery) {
+ setChecked(Boolean.valueOf(((RepositoryQuery) element).getAutoUpdate()));
+ return true;
+ }
+ }
+ setChecked(false);
+ return false;
+ }
+
+ @Override
+ public void run() {
+ final Object element = getStructuredSelection().getFirstElement();
+ if (element instanceof RepositoryQuery) {
+ try {
+ final RepositoryQuery query = ((RepositoryQuery) element);
+ TasksUiPlugin.getTaskList().run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ query.setAutoUpdate(isChecked());
+ }
+ });
+ TasksUiPlugin.getTaskList().notifyElementsChanged(Collections.singleton(query));
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to set offline status for query", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ClearOutgoingAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ClearOutgoingAction.java
new file mode 100644
index 0000000..e43a916
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ClearOutgoingAction.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+
+/**
+ * Discard outgoing changes on selected task TODO: Enable multi task discard?
+ *
+ * @author Rob Elves
+ */
+public class ClearOutgoingAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.mark.discard"; //$NON-NLS-1$
+
+ private final List<IRepositoryElement> selectedElements;
+
+ private AbstractTaskEditorPage taskEditorPage;
+
+ public ClearOutgoingAction(List<IRepositoryElement> selectedElements) {
+ this.selectedElements = selectedElements;
+ setText(Messages.ClearOutgoingAction_Clear_outgoing);
+ setToolTipText(Messages.ClearOutgoingAction_Clear_outgoing);
+ setImageDescriptor(CommonImages.CLEAR);
+ setId(ID);
+ if (selectedElements.size() == 1 && (selectedElements.get(0) instanceof ITask)) {
+ ITask task = (ITask) selectedElements.get(0);
+ setEnabled(hasOutgoingChanges(task));
+ } else {
+ setEnabled(false);
+ }
+ }
+
+ public AbstractTaskEditorPage getTaskEditorPage() {
+ return taskEditorPage;
+ }
+
+ public void setTaskEditorPage(AbstractTaskEditorPage taskEditorPage) {
+ this.taskEditorPage = taskEditorPage;
+ }
+
+ public static boolean hasOutgoingChanges(ITask task) {
+ return task.getSynchronizationState().equals(SynchronizationState.OUTGOING)
+ || task.getSynchronizationState().equals(SynchronizationState.CONFLICT);
+ }
+
+ @Override
+ public void run() {
+ ArrayList<AbstractTask> toClear = new ArrayList<AbstractTask>();
+ for (Object selectedObject : selectedElements) {
+ if (selectedObject instanceof ITask && hasOutgoingChanges((ITask) selectedObject)) {
+ toClear.add(((AbstractTask) selectedObject));
+ }
+ }
+ if (toClear.size() > 0) {
+ AbstractTask task = toClear.get(0);
+ boolean confirm = MessageDialog.openConfirm(
+ null,
+ Messages.ClearOutgoingAction_Confirm_discard, Messages.ClearOutgoingAction_Discard_all_outgoing_changes_ + "\n\n" //$NON-NLS-1$
+ + task.getSummary());
+ if (confirm) {
+ if (taskEditorPage != null) {
+ taskEditorPage.doSave(null);
+ }
+ try {
+ TasksUi.getTaskDataManager().discardEdits(task);
+ } catch (CoreException e) {
+ TasksUiInternal.displayStatus(
+ Messages.ClearOutgoingAction_Clear_outgoing_failed, e.getStatus());
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CloneTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CloneTaskAction.java
new file mode 100644
index 0000000..8eb6f11
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CloneTaskAction.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Maarten Meijer 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:
+ * Maarten Meijer - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DefaultTaskMapping;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Maarten Meijer
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class CloneTaskAction extends BaseSelectionListenerAction implements IViewActionDelegate {
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.actions.clone"; //$NON-NLS-1$
+
+ protected ISelection selection;
+
+ public CloneTaskAction() {
+ super(Messages.CloneTaskAction_Clone_This_Task);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.TASK_NEW);
+ setAccelerator(SWT.MOD1 + 'd');
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ super.selectionChanged((IStructuredSelection) selection);
+ }
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ @Override
+ public void run() {
+ for (Object selectedObject : getStructuredSelection().toList()) {
+ if (selectedObject instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) selectedObject;
+
+ String description = Messages.CloneTaskAction_Cloned_from_ + CopyTaskDetailsAction.getTextForTask(task);
+ if (task instanceof LocalTask) {
+ String notes = task.getNotes();
+ if (!"".equals(notes)) { //$NON-NLS-1$
+ description += "\n\n" + notes; //$NON-NLS-1$
+ }
+ }
+
+ ITaskMapping taskSelection = new DefaultTaskMapping();
+ ((DefaultTaskMapping) taskSelection).setDescription(description);
+
+ TaskData taskData;
+ try {
+ taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ } catch (CoreException e) {
+ TasksUiInternal.displayStatus(Messages.CloneTaskAction_Clone_Task_Failed, e.getStatus());
+ continue;
+ }
+
+ if (taskData != null) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskData.getConnectorKind());
+ ITaskMapping mapping = connector.getTaskMapping(taskData);
+ if (mapping.getDescription() != null) {
+ ((DefaultTaskMapping) taskSelection).setDescription(description + "\n\n" //$NON-NLS-1$
+ + mapping.getDescription());
+ }
+ mapping.merge(taskSelection);
+ taskSelection = mapping;
+ }
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (!TasksUiUtil.openNewTaskEditor(shell, taskSelection, null)) {
+ // do not process other tasks if canceled
+ return;
+ }
+ }
+ }
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CollapseAllAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CollapseAllAction.java
new file mode 100644
index 0000000..7da5d31
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CollapseAllAction.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class CollapseAllAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.collapse.all"; //$NON-NLS-1$
+
+ private final TaskListView taskListView;
+
+ public CollapseAllAction(TaskListView taskListView) {
+ super(Messages.CollapseAllAction_Collapse_All);
+ this.taskListView = taskListView;
+ setId(ID);
+ setText(Messages.CollapseAllAction_Collapse_All);
+ setToolTipText(Messages.CollapseAllAction_Collapse_All);
+ setImageDescriptor(CommonImages.COLLAPSE_ALL);
+ }
+
+ @Override
+ public void run() {
+ if (taskListView.getViewer() != null) {
+ taskListView.getViewer().collapseAll();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CommentActionGroup.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CommentActionGroup.java
new file mode 100644
index 0000000..5d20247
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CommentActionGroup.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.actions.ActionContext;
+import org.eclipse.ui.actions.ActionGroup;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CommentActionGroup extends ActionGroup {
+
+ private CopyCommentDetailsAction copyDetailsAction;
+
+ private boolean initialized;
+
+ private void initialize() {
+ if (initialized) {
+ return;
+ }
+ initialized = true;
+ copyDetailsAction = new CopyCommentDetailsAction();
+ }
+
+ @Override
+ public void fillContextMenu(IMenuManager manager) {
+ updateActions();
+ manager.add(copyDetailsAction);
+ }
+
+ private void updateActions() {
+ initialize();
+ IStructuredSelection selection = getStructuredSelection();
+ copyDetailsAction.selectionChanged(selection);
+ }
+
+ public IStructuredSelection getStructuredSelection() {
+ ActionContext context = getContext();
+ if (context != null) {
+ ISelection selection = context.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ return (IStructuredSelection) selection;
+ }
+ }
+ return StructuredSelection.EMPTY;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CompareAttachmentsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CompareAttachmentsAction.java
new file mode 100644
index 0000000..fa60a27
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CompareAttachmentsAction.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.CompareEditorInput;
+import org.eclipse.compare.CompareUI;
+import org.eclipse.compare.IStreamContentAccessor;
+import org.eclipse.compare.ITypedElement;
+import org.eclipse.compare.structuremergeviewer.DiffNode;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.internal.WorkbenchImages;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class CompareAttachmentsAction extends BaseSelectionListenerAction implements IViewActionDelegate {
+
+ private ISelection currentSelection;
+
+ public CompareAttachmentsAction() {
+ super(Messages.CompareAttachmentsAction_Compare_Attachments);
+ }
+
+ protected CompareAttachmentsAction(String text) {
+ super(text);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ if (currentSelection instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) currentSelection;
+ Object[] elements = selection.toArray();
+ if (elements.length >= 2) {
+ final ITaskAttachment attachment1 = (ITaskAttachment) elements[0];
+ final ITaskAttachment attachment2 = (ITaskAttachment) elements[1];
+
+ CompareConfiguration cc = new CompareConfiguration();
+
+ cc.setLeftEditable(false);
+ cc.setLeftLabel(attachment1.getFileName());
+ cc.setLeftImage(getImage(attachment1));
+
+ cc.setRightEditable(false);
+ cc.setRightLabel(attachment2.getFileName());
+ cc.setRightImage(getImage(attachment2));
+
+ CompareEditorInput editorInput = new CompareEditorInput(cc) {
+
+ @Override
+ public String getTitle() {
+ return Messages.CompareAttachmentsAction_Compare__ + attachment1.getFileName() + " - " + attachment2.getFileName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {
+ CompareItem left = new CompareItem(attachment1);
+ CompareItem right = new CompareItem(attachment2);
+ return new DiffNode(left, right);
+ }
+
+ };
+
+ CompareUI.openCompareEditor(editorInput);
+ }
+ }
+ }
+
+ private static final String[] IMAGE_EXTENSIONS = { ".jpg", ".gif", ".png", ".tiff", ".tif", ".bmp" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+
+ private Image getImage(ITaskAttachment attachment) {
+ if (AttachmentUtil.isContext(attachment)) {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_TRANSFER);
+ } else if (attachment.isPatch()) {
+ return CommonImages.getImage(TasksUiImages.TASK_ATTACHMENT_PATCH);
+ } else {
+ String filename = attachment.getFileName();
+ if (filename != null) {
+ filename = filename.toLowerCase();
+ for (String extension : IMAGE_EXTENSIONS) {
+ if (filename.endsWith(extension)) {
+ return CommonImages.getImage(CommonImages.IMAGE_FILE);
+ }
+ }
+ }
+ return WorkbenchImages.getImage(ISharedImages.IMG_OBJ_FILE);
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.currentSelection = selection;
+ }
+
+ private class CompareItem implements IStreamContentAccessor, ITypedElement {
+
+ private final ITaskAttachment attachment;
+
+ public CompareItem(ITaskAttachment attachment) {
+ this.attachment = attachment;
+ }
+
+ public InputStream getContents() throws CoreException {
+ TaskAttribute attachmentAttribute = attachment.getTaskAttribute();
+ if (attachmentAttribute == null) {
+ throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.CompareAttachmentsAction_Failed_to_find_attachment + attachment.getUrl()));
+ }
+ TaskRepository taskRepository = attachment.getTaskRepository();
+ ITask task = attachment.getTask();
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ AbstractTaskAttachmentHandler handler = connector.getTaskAttachmentHandler();
+ return handler.getContent(taskRepository, task, attachmentAttribute, new NullProgressMonitor());
+ }
+
+ public Image getImage() {
+ return null;
+ }
+
+ public String getName() {
+ return attachment.getFileName();
+ }
+
+ public String getType() {
+ // ImageMergeViewerCreator - gif,jpg,jpeg,png,bmp,ico,tif,tiff
+ // BinaryCompareViewerCreator - class,exe,dll,binary,zip,jar
+ // TextMergeViewerCreator - txt
+ // PropertiesFileMergeViewerCreator - properties,properties2
+ // JavaContentViewerCreator - java,java2"
+ // RefactoringDescriptorCompareViewerCreator - refactoring_descriptor
+ //
+ String filename = attachment.getFileName();
+ int n = filename.lastIndexOf('.');
+ if (n > -1) {
+ return filename.substring(n + 1);
+ }
+ return ITypedElement.TEXT_TYPE;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CopyCommentDetailsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CopyCommentDetailsAction.java
new file mode 100644
index 0000000..3db2a21
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CopyCommentDetailsAction.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.util.ClipboardCopier;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CopyCommentDetailsAction extends BaseSelectionListenerAction {
+
+ public CopyCommentDetailsAction() {
+ super(Messages.CopyCommentDetailsAction_Copy_User_ID);
+ setToolTipText(Messages.CopyCommentDetailsAction_Copy_User_ID_Tooltip);
+ setImageDescriptor(CommonImages.COPY);
+ }
+
+ @Override
+ public void run() {
+ ClipboardCopier.getDefault().copy(getStructuredSelection(), new ClipboardCopier.TextProvider() {
+ public String getTextForElement(Object element) {
+ if (element instanceof ITaskComment) {
+ ITaskComment comment = (ITaskComment) element;
+ IRepositoryPerson author = comment.getAuthor();
+ if (author != null) {
+ return author.getPersonId();
+ }
+ }
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CopyTaskDetailsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CopyTaskDetailsAction.java
new file mode 100644
index 0000000..c34ece0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/CopyTaskDetailsAction.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.util.ClipboardCopier;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class CopyTaskDetailsAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.copy"; //$NON-NLS-1$
+
+ public enum Mode {
+ KEY, URL, SUMMARY_URL
+ }
+
+ private Mode mode;
+
+ public CopyTaskDetailsAction(Mode mode) {
+ super(""); //$NON-NLS-1$
+ setMode(mode);
+ }
+
+ public Mode getMode() {
+ return mode;
+ }
+
+ public void setMode(Mode mode) {
+ Assert.isNotNull(mode);
+ this.mode = mode;
+ switch (mode) {
+ case KEY:
+ setText(Messages.CopyTaskDetailsAction_ID_Menu_Label);
+ break;
+ case URL:
+ setText(Messages.CopyTaskDetailsAction_Url_Menu_Label);
+ break;
+ case SUMMARY_URL:
+ setText(Messages.CopyTaskDetailsAction_Summary_and_Url_Menu_Label);
+ break;
+ }
+ }
+
+ @Override
+ public void run() {
+ ClipboardCopier.getDefault().copy(getStructuredSelection(), new ClipboardCopier.TextProvider() {
+ public String getTextForElement(Object element) {
+ return getTextForTask(element, getMode());
+ }
+ });
+ }
+
+ public static String getTextForTask(Object object) {
+ return getTextForTask(object, Mode.SUMMARY_URL);
+ }
+
+ // TODO move to TasksUiUtil / into core
+ public static String getTextForTask(Object object, Mode mode) {
+ StringBuffer sb = new StringBuffer();
+ switch (mode) {
+ case KEY:
+ if (object instanceof ITask) {
+ ITask task = (ITask) object;
+ if (task.getTaskKey() != null) {
+ sb.append(task.getTaskKey());
+ }
+ }
+ break;
+ case URL:
+ if (object instanceof IRepositoryElement) {
+ IRepositoryElement element = (IRepositoryElement) object;
+ if (element.getUrl() != null) {
+ sb.append(element.getUrl());
+ }
+ }
+ break;
+ case SUMMARY_URL:
+ if (object instanceof ITask) {
+ ITask task = (ITask) object;
+ if (task.getTaskKey() != null) {
+ sb.append(task.getTaskKey());
+ sb.append(": "); //$NON-NLS-1$
+ }
+
+ sb.append(task.getSummary());
+ if (TasksUiInternal.isValidUrl(task.getUrl())) {
+ sb.append(ClipboardCopier.LINE_SEPARATOR);
+ sb.append(task.getUrl());
+ }
+ } else if (object instanceof IRepositoryQuery) {
+ RepositoryQuery query = (RepositoryQuery) object;
+ sb.append(query.getSummary());
+ if (TasksUiInternal.isValidUrl(query.getUrl())) {
+ sb.append(ClipboardCopier.LINE_SEPARATOR);
+ sb.append(query.getUrl());
+ }
+ } else if (object instanceof IRepositoryElement) {
+ IRepositoryElement element = (IRepositoryElement) object;
+ sb.append(element.getSummary());
+ }
+ break;
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeactivateAllTasksAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeactivateAllTasksAction.java
new file mode 100644
index 0000000..548403c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeactivateAllTasksAction.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.actions.ActionDelegate;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class DeactivateAllTasksAction extends ActionDelegate implements IWorkbenchWindowActionDelegate {
+
+ public void init(IWorkbenchWindow window) {
+ // ignore
+ }
+
+ @Override
+ public void run(IAction action) {
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteAction.java
new file mode 100644
index 0000000..3901d6f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteAction.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AutomaticRepositoryTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+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.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
+
+/**
+ * @author Mik Kersten
+ */
+public class DeleteAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.delete"; //$NON-NLS-1$
+
+ public DeleteAction() {
+ super(Messages.DeleteAction_Delete);
+ setId(ID);
+ setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
+ setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
+ }
+
+ @Override
+ public void run() {
+ doDelete(getStructuredSelection().toList());
+ }
+
+ protected void doDelete(final List<?> toDelete) {
+ String elements = ""; //$NON-NLS-1$
+ int i = 0;
+ for (Object object : toDelete) {
+ if (object instanceof UnmatchedTaskContainer) {
+ continue;
+ }
+
+ i++;
+ if (i < 20) {
+ // TODO this action should be based on the action enablement and check if the container is user managed or not
+ if (object instanceof IRepositoryElement) {
+ elements += " " + ((IRepositoryElement) object).getSummary() + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else {
+ elements += "..."; //$NON-NLS-1$
+ break;
+ }
+ }
+
+ String message;
+
+ if (toDelete.size() == 1) {
+ Object object = toDelete.get(0);
+ if (object instanceof ITask) {
+ if (((AbstractTask) object).isLocal()) {
+ message = Messages.DeleteAction_Permanently_delete_the_task_listed_below;
+ } else {
+ message = Messages.DeleteAction_Delete_the_planning_information_and_context_for_the_repository_task;
+ }
+ } else if (object instanceof TaskCategory) {
+ message = Messages.DeleteAction_Permanently_delete_the_category;
+ } else if (object instanceof IRepositoryQuery) {
+ message = Messages.DeleteAction_Permanently_delete_the_query;
+ } else if (object instanceof UnmatchedTaskContainer) {
+ message = Messages.DeleteAction_Delete_the_planning_information_and_context_of_all_unmatched_tasks;
+ } else if (object instanceof UnsubmittedTaskContainer) {
+ message = Messages.DeleteAction_Delete_all_of_the_unsubmitted_tasks;
+ } else {
+ message = Messages.DeleteAction_Permanently_delete_the_element_listed_below;
+ }
+ } else {
+ message = Messages.DeleteAction_Delete_the_elements_listed_below;
+ }
+
+ message += "\n\n" + elements; //$NON-NLS-1$
+
+ if (toDelete.isEmpty()) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.DeleteAction_Delete_failed, Messages.DeleteAction_Nothing_selected);
+ } else {
+ boolean deleteConfirmed = MessageDialog.openQuestion(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), Messages.DeleteAction_Confirm_Delete, message);
+ if (deleteConfirmed) {
+ ICoreRunnable op = new ICoreRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask(Messages.DeleteAction_Delete_in_progress, IProgressMonitor.UNKNOWN);
+ prepareDeletion(toDelete);
+ TasksUiPlugin.getTaskList().run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ performDeletion(toDelete);
+ }
+ }, monitor);
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ try {
+ CommonUiUtil.runInUi(op, null);
+ } catch (CoreException e) {
+ Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Problems encountered deleting task list elements: {0}", e.getMessage()), e); //$NON-NLS-1$
+ TasksUiInternal.logAndDisplayStatus(
+ Messages.DeleteTaskRepositoryAction_Delete_Task_Repository_Failed, status);
+ } catch (OperationCanceledException e) {
+ // canceled
+ }
+ }
+ }
+ }
+
+ public static void prepareDeletion(Collection<?> toDelete) {
+ for (Object selectedObject : toDelete) {
+ if (selectedObject instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) selectedObject;
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ TasksUiInternal.closeTaskEditorInAllPages(task, false);
+ } else if (selectedObject instanceof AutomaticRepositoryTaskContainer) {
+ // support both the unmatched and the unsubmitted
+ if (toDelete.size() == 1) {
+ prepareDeletion(((AutomaticRepositoryTaskContainer) selectedObject).getChildren());
+ }
+ }
+ }
+ }
+
+ public static void performDeletion(Collection<?> toDelete) {
+ for (Object selectedObject : toDelete) {
+ if (selectedObject instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) selectedObject;
+ TasksUiInternal.getTaskList().deleteTask(task);
+ try {
+ TasksUiPlugin.getTaskDataManager().deleteTaskData(task);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to delete task data", //$NON-NLS-1$
+ e));
+ }
+ ContextCore.getContextManager().deleteContext(task.getHandleIdentifier());
+ } else if (selectedObject instanceof IRepositoryQuery) {
+ TasksUiInternal.getTaskList().deleteQuery((RepositoryQuery) selectedObject);
+ } else if (selectedObject instanceof TaskCategory) {
+ TasksUiInternal.getTaskList().deleteCategory((TaskCategory) selectedObject);
+ } else if (selectedObject instanceof AutomaticRepositoryTaskContainer) {
+ // support both the unmatched and the unsubmitted
+ if (toDelete.size() == 1) {
+ // loop to ensure that all subtasks are deleted as well
+ performDeletion(((AutomaticRepositoryTaskContainer) selectedObject).getChildren());
+ }
+ }
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ List<?> elements = (selection).toList();
+ for (Object object : elements) {
+ if (object instanceof UncategorizedTaskContainer) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteTaskEditorAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteTaskEditorAction.java
new file mode 100644
index 0000000..01277ff
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteTaskEditorAction.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Collections;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Mik Kersten
+ */
+public class DeleteTaskEditorAction extends DeleteAction {
+
+ private final ITask task;
+
+ public DeleteTaskEditorAction(ITask task) {
+ this.task = task;
+ //setHoverImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
+ setImageDescriptor(CommonImages.REMOVE);
+ }
+
+ @Override
+ public void run() {
+ doDelete(Collections.singletonList(task));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteTaskRepositoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteTaskRepositoryAction.java
new file mode 100644
index 0000000..b31a90a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DeleteTaskRepositoryAction.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryUtil;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
+
+/**
+ * @author Mik Kersten
+ * @author David Shepherd
+ * @author Steffen Pingel
+ */
+public class DeleteTaskRepositoryAction extends AbstractTaskRepositoryAction {
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.delete"; //$NON-NLS-1$
+
+ public DeleteTaskRepositoryAction() {
+ super(Messages.DeleteTaskRepositoryAction_Delete_Repository);
+ setImageDescriptor(WorkbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
+ setId(ID);
+ setEnabled(false);
+ setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
+ setSingleSelect(true);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ final TaskRepository repositoryToDelete = getTaskRepository(getStructuredSelection());
+ if (repositoryToDelete == null) {
+ return;
+ }
+ final List<IRepositoryQuery> queriesToDelete = new ArrayList<IRepositoryQuery>();
+ final List<AbstractTask> tasksToDelete = new ArrayList<AbstractTask>();
+
+ // check for queries over this repository
+ Set<RepositoryQuery> queries = TasksUiInternal.getTaskList().getQueries();
+ for (IRepositoryQuery query : queries) {
+ if (repositoryToDelete.getRepositoryUrl().equals(query.getRepositoryUrl())
+ && repositoryToDelete.getConnectorKind().equals(query.getConnectorKind())) {
+ queriesToDelete.add(query);
+ }
+ }
+
+ // check for tasks from this repository
+ final Set<ITask> tasks = TasksUiPlugin.getTaskList().getTasks(repositoryToDelete.getRepositoryUrl());
+ for (ITask task : tasks) {
+ if (repositoryToDelete.getRepositoryUrl().equals(task.getRepositoryUrl())
+ && repositoryToDelete.getConnectorKind().equals(task.getConnectorKind())) {
+ tasksToDelete.add((AbstractTask) task);
+ }
+ }
+
+ // add unsubmitted tasks
+ UnsubmittedTaskContainer unsubmitted = TasksUiPlugin.getTaskList().getUnsubmittedContainer(
+ repositoryToDelete.getRepositoryUrl());
+ if (unsubmitted != null) {
+ Collection<ITask> children = unsubmitted.getChildren();
+ if (children != null) {
+ for (ITask task : children) {
+ tasksToDelete.add((AbstractTask) task);
+ }
+ }
+ }
+
+ // confirm that the user wants to delete all tasks and queries that are associated
+ boolean deleteConfirmed;
+ if (queriesToDelete.size() > 0 || tasksToDelete.size() > 0) {
+ deleteConfirmed = MessageDialog.openQuestion(WorkbenchUtil.getShell(),
+ Messages.DeleteTaskRepositoryAction_Confirm_Delete, NLS.bind(
+ Messages.DeleteTaskRepositoryAction_Delete_the_selected_task_repositories, new Integer[] {
+ tasksToDelete.size(), queriesToDelete.size() }));
+ } else {
+ deleteConfirmed = MessageDialog.openQuestion(WorkbenchUtil.getShell(),
+ Messages.DeleteTaskRepositoryAction_Confirm_Delete, NLS.bind(
+ Messages.DeleteTaskRepositoryAction_Delete_Specific_Task_Repository,
+ new String[] { repositoryToDelete.getRepositoryLabel() }));
+
+ }
+ if (deleteConfirmed) {
+ ICoreRunnable op = new ICoreRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask(Messages.DeleteTaskRepositoryAction_Delete_Repository_In_Progress,
+ IProgressMonitor.UNKNOWN);
+ DeleteAction.prepareDeletion(tasksToDelete);
+ DeleteAction.prepareDeletion(queriesToDelete);
+ TasksUiPlugin.getTaskList().run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ // delete tasks
+ DeleteAction.performDeletion(tasksToDelete);
+ // delete queries
+ DeleteAction.performDeletion(queriesToDelete);
+ // delete repository
+ TasksUiPlugin.getRepositoryManager().removeRepository(repositoryToDelete,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ // if repository is contributed via template, ensure it isn't added again
+ TaskRepositoryUtil.disableAddAutomatically(repositoryToDelete.getRepositoryUrl());
+ }
+ }, monitor);
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ try {
+ CommonUiUtil.runInUi(op, null);
+ } catch (CoreException e) {
+ Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Problems encountered deleting task repository: {0}", e.getMessage()), e); //$NON-NLS-1$
+ TasksUiInternal.logAndDisplayStatus(Messages.DeleteTaskRepositoryAction_Delete_Task_Repository_Failed,
+ status);
+ } catch (OperationCanceledException e) {
+ // canceled
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DisconnectRepositoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DisconnectRepositoryAction.java
new file mode 100644
index 0000000..642d6ac
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/DisconnectRepositoryAction.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.Messages;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Steffen Pingel
+ */
+public class DisconnectRepositoryAction extends Action implements ISelectionChangedListener {
+
+ public static final String LABEL = Messages.DisconnectRepositoryAction_Disconnected;
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.offline"; //$NON-NLS-1$
+
+ private TaskRepository repository;
+
+ public DisconnectRepositoryAction() {
+ super(LABEL, IAction.AS_CHECK_BOX);
+ setId(ID);
+ setEnabled(false);
+ }
+
+ @Override
+ public void run() {
+ repository.setOffline(isChecked());
+ TasksUiPlugin.getRepositoryManager().notifyRepositorySettingsChanged(repository);
+ }
+
+ @Deprecated
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1) {
+ Object selectedObject = ((IStructuredSelection) selection).getFirstElement();
+ if (selectedObject instanceof TaskRepository) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ ((TaskRepository) selectedObject).getConnectorKind());
+ if (connector.isUserManaged()) {
+ this.repository = (TaskRepository) selectedObject;
+ setChecked(this.repository.isOffline());
+ setEnabled(true);
+ return;
+ }
+ }
+ }
+ this.repository = null;
+ setChecked(false);
+ setEnabled(false);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/EditRepositoryPropertiesAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/EditRepositoryPropertiesAction.java
new file mode 100644
index 0000000..4d0e63c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/EditRepositoryPropertiesAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class EditRepositoryPropertiesAction extends AbstractTaskRepositoryAction implements IViewActionDelegate {
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.properties"; //$NON-NLS-1$
+
+ public EditRepositoryPropertiesAction() {
+ super(Messages.EditRepositoryPropertiesAction_Properties);
+ setId(ID);
+ setEnabled(false);
+ }
+
+ @Override
+ public void run() {
+ TaskRepository taskRepository = getTaskRepository(getStructuredSelection());
+ if (taskRepository != null) {
+ TasksUiUtil.openEditRepositoryWizard(taskRepository);
+ }
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ selectionChanged((IStructuredSelection) selection);
+ action.setEnabled(this.isEnabled());
+ } else {
+ clearCache();
+ action.setEnabled(false);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ExpandAllAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ExpandAllAction.java
new file mode 100644
index 0000000..6018722
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ExpandAllAction.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class ExpandAllAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.expand.all"; //$NON-NLS-1$
+
+ private final TaskListView taskListView;
+
+ public ExpandAllAction(TaskListView taskListView) {
+ this.taskListView = taskListView;
+ setId(ID);
+ setText(Messages.ExpandAllAction_Expand_All);
+ setToolTipText(Messages.ExpandAllAction_Expand_All);
+ setImageDescriptor(CommonImages.EXPAND_ALL);
+ }
+
+ @Override
+ public void run() {
+ if (taskListView.getViewer() != null) {
+ taskListView.getViewer().expandAll();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ExportAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ExportAction.java
new file mode 100644
index 0000000..927ab5f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ExportAction.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.ImportExportUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ExportAction implements IViewActionDelegate {
+
+ private ISelection selection;
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ if (selection.isEmpty() || !(selection instanceof StructuredSelection)) {
+ MessageDialog.openError(WorkbenchUtil.getShell(), Messages.ExportAction_Dialog_Title, Messages.ExportAction_Nothing_selected);
+ return;
+ }
+
+ FileDialog dialog = new FileDialog(WorkbenchUtil.getShell(), SWT.PRIMARY_MODAL | SWT.SAVE);
+ dialog.setText(Messages.ExportAction_Dialog_Title);
+ ImportExportUtil.configureFilter(dialog);
+ dialog.setFileName(ITasksCoreConstants.EXPORT_FILE_NAME + ITasksCoreConstants.FILE_EXTENSION);
+ String path = dialog.open();
+ if (path != null) {
+ File file = new File(path);
+ // Prompt the user to confirm if save operation will cause an overwrite
+ if (file.exists()) {
+ if (!MessageDialog.openConfirm(WorkbenchUtil.getShell(), Messages.ExportAction_Dialog_Title, NLS.bind(
+ Messages.ExportAction_X_exists_Do_you_wish_to_overwrite, file.getPath()))) {
+ return;
+ }
+ }
+ try {
+ ImportExportUtil.export(file, (IStructuredSelection) selection);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Problems encountered during export", e)); //$NON-NLS-1$
+ TasksUiInternal.displayStatus(Messages.ExportAction_Dialog_Title, new MultiStatus(ITasksCoreConstants.ID_PLUGIN, 0,
+ new IStatus[] { e.getStatus() },
+ Messages.ExportAction_Problems_encountered, e));
+ }
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selection = selection;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/FilterCompletedTasksAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/FilterCompletedTasksAction.java
new file mode 100644
index 0000000..4824f09
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/FilterCompletedTasksAction.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Mik Kersten
+ */
+public class FilterCompletedTasksAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.filter.completed"; //$NON-NLS-1$
+
+ private final TaskListView view;
+
+ public FilterCompletedTasksAction(TaskListView view) {
+ this.view = view;
+ setText(Messages.FilterCompletedTasksAction_Filter_Completed_Tasks);
+ setToolTipText(Messages.FilterCompletedTasksAction_Filter_Completed_Tasks);
+ setId(ID);
+ setImageDescriptor(CommonImages.FILTER_COMPLETE);
+ setChecked(TasksUiPlugin.getDefault().getPreferenceStore().contains(
+ ITasksUiPreferenceConstants.FILTER_COMPLETE_MODE));
+ }
+
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.FILTER_COMPLETE_MODE,
+ isChecked());
+ if (isChecked()) {
+ view.addFilter(view.getCompleteFilter());
+ } else {
+ view.removeFilter(view.getCompleteFilter());
+ }
+ this.view.refresh();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GoIntoAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GoIntoAction.java
new file mode 100644
index 0000000..4ae2e11
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GoIntoAction.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class GoIntoAction extends Action implements IViewActionDelegate {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.view.go.into"; //$NON-NLS-1$
+
+ public GoIntoAction() {
+ setId(ID);
+ setText(Messages.GoIntoAction_Go_Into);
+ setToolTipText(Messages.GoIntoAction_Go_Into);
+ setImageDescriptor(CommonImages.GO_INTO);
+ }
+
+ public void init(IViewPart view) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void run() {
+ if (TaskListView.getFromActivePerspective() != null) {
+ TaskListView.getFromActivePerspective().getFilteredTree().setFilterText(""); //$NON-NLS-1$
+ TaskListView.getFromActivePerspective().goIntoCategory();
+ }
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // TODO Auto-generated method stub
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GoUpAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GoUpAction.java
new file mode 100644
index 0000000..122c44f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GoUpAction.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.ui.part.DrillDownAdapter;
+
+/**
+ * @author Mik Kersten
+ */
+public class GoUpAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.view.go.up"; //$NON-NLS-1$
+
+ public GoUpAction(DrillDownAdapter drillDownAdapter) {
+ setText(Messages.GoUpAction_Go_Up_To_Root);
+ setToolTipText(Messages.GoUpAction_Go_Up_To_Root);
+ setId(ID);
+ setImageDescriptor(CommonImages.GO_UP);
+ }
+
+ @Override
+ public void run() {
+ if (TaskListView.getFromActivePerspective() != null) {
+ TaskListView.getFromActivePerspective().goUpToRoot();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GroupSubTasksAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GroupSubTasksAction.java
new file mode 100644
index 0000000..6086dc9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/GroupSubTasksAction.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class GroupSubTasksAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.filter.subtasks"; //$NON-NLS-1$
+
+ private final TaskListView view;
+
+ public GroupSubTasksAction(TaskListView view) {
+ this.view = view;
+ setText(Messages.GroupSubTasksAction_Group_Subtasks);
+ setToolTipText(Messages.GroupSubTasksAction_Group_Subtasks);
+ setId(ID);
+ // setImageDescriptor(TasksUiImages.FILTER_COMPLETE);
+ setChecked(TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.GROUP_SUBTASKS));
+ }
+
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.GROUP_SUBTASKS,
+ isChecked());
+ // TODO: refresh not getting rid of subtasks
+
+ view.refresh(true);
+// try {
+// view.getViewer().getControl().setRedraw(false);
+// view.getViewer().collapseAll();
+// if (view.isFocusedMode()) {
+// view.getViewer().expandAll();
+// }
+// view.getViewer().refresh();
+// } finally {
+// view.getViewer().getControl().setRedraw(true);
+// }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ImportAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ImportAction.java
new file mode 100644
index 0000000..70b9dd2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ImportAction.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TransferList;
+import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.ImportExportUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ImportAction implements IViewActionDelegate {
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ FileDialog dialog = new FileDialog(WorkbenchUtil.getShell());
+ dialog.setText(Messages.ImportAction_Dialog_Title);
+ ImportExportUtil.configureFilter(dialog);
+ String path = dialog.open();
+ if (path != null) {
+ File file = new File(path);
+ if (file.isFile()) {
+ IStatus result = importElements(file);
+ if (!result.isOK()) {
+ StatusHandler.log(result);
+ TasksUiInternal.displayStatus(Messages.ImportAction_Dialog_Title, new MultiStatus(ITasksCoreConstants.ID_PLUGIN, 0,
+ new IStatus[] { result },
+ Messages.ImportAction_Problems_encountered, null));
+ }
+ }
+ }
+ }
+
+ private IStatus importElements(File file) {
+ MultiStatus result = new MultiStatus(ITasksCoreConstants.ID_PLUGIN, 0,
+ "Problems encounted during importing", null); //$NON-NLS-1$
+
+ TransferList list = new TransferList();
+ TaskListExternalizer externalizer = TasksUiPlugin.getDefault().createTaskListExternalizer();
+ try {
+ externalizer.readTaskList(list, file);
+ } catch (CoreException e) {
+ result.add(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Problems encountered reading import file", e)); //$NON-NLS-1$
+ }
+
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ for (AbstractTask task : list.getAllTasks()) {
+ if (!validateRepository(task.getConnectorKind(), task.getRepositoryUrl())) {
+ result.add(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Task {0} ignored, unknown connector", task.getSummary()))); //$NON-NLS-1$
+ continue;
+ }
+
+ if (taskList.getTask(task.getHandleIdentifier()) != null) {
+ result.add(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Task {0} ignored, already exists in Task List", task.getSummary()))); //$NON-NLS-1$
+ } else {
+ // need to deactivate since activation is managed centrally
+ task.setActive(false);
+ taskList.addTask(task);
+ // TODO support importing of contexts
+ //ContextCore.getContextStore().importContext(task.getHandleIdentifier(), zipFile);
+ }
+ }
+
+ for (RepositoryQuery query : list.getQueries()) {
+ if (!validateRepository(query.getConnectorKind(), query.getRepositoryUrl())) {
+ result.add(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Query {0} ignored, unknown connector", query.getSummary()))); //$NON-NLS-1$
+ continue;
+ }
+
+ if (taskList.getQueries().contains(query)) {
+ query.setHandleIdentifier(taskList.getUniqueHandleIdentifier());
+ }
+ taskList.addQuery(query);
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ query.getConnectorKind());
+ if (connector != null) {
+ TasksUiInternal.synchronizeQuery(connector, query, null, true);
+ }
+ }
+
+ return result;
+ }
+
+ private boolean validateRepository(String connectorKind, String repositoryUrl) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(connectorKind, repositoryUrl);
+ if (repository == null) {
+ if (TasksUi.getRepositoryConnector(connectorKind) == null) {
+ return false;
+ }
+ repository = new TaskRepository(connectorKind, repositoryUrl);
+ TasksUi.getRepositoryManager().addRepository(repository);
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/LinkWithEditorAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/LinkWithEditorAction.java
new file mode 100644
index 0000000..b3fa99c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/LinkWithEditorAction.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class LinkWithEditorAction extends Action {
+
+ private final TaskListView taskListView;
+
+ public LinkWithEditorAction(TaskListView taskListView) {
+ super(Messages.LinkWithEditorAction_Link_with_Editor, IAction.AS_CHECK_BOX);
+ this.taskListView = taskListView;
+ setImageDescriptor(CommonImages.LINK_EDITOR);
+ }
+
+ @Override
+ public void run() {
+ taskListView.setLinkWithEditor(isChecked());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java
new file mode 100644
index 0000000..effcdf5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/Messages.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.actions.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AbstractChangeCompletionAction_Mark_selected_local_tasks_X;
+
+ public static String ActivateTaskDialogAction_Activate_Task;
+
+ public static String ActivateTaskDialogAction_Select_a_task_to_activate__;
+
+ public static String ActivateTaskHistoryDropDownAction_Activate_Previous_Task;
+
+ public static String AddRepositoryAction_Add_new_query;
+
+ public static String AddRepositoryAction_Add_a_query_to_the_Task_List;
+
+ public static String AddRepositoryAction_Add_Task_Repository;
+
+ public static String AddRepositoryAction_Do_not_show_again;
+
+ public static String AutoUpdateQueryAction_Synchronize_Automatically_Label;
+
+ public static String ClearOutgoingAction_Clear_outgoing;
+
+ public static String ClearOutgoingAction_Clear_outgoing_failed;
+
+ public static String ClearOutgoingAction_Confirm_discard;
+
+ public static String ClearOutgoingAction_Discard_all_outgoing_changes_;
+
+ public static String CloneTaskAction_Clone_Task_Failed;
+
+ public static String CloneTaskAction_Clone_This_Task;
+
+ public static String CloneTaskAction_Cloned_from_;
+
+ public static String CollapseAllAction_Collapse_All;
+
+ public static String CompareAttachmentsAction_Compare__;
+
+ public static String CompareAttachmentsAction_Compare_Attachments;
+
+ public static String CompareAttachmentsAction_Failed_to_find_attachment;
+
+ public static String CopyCommentDetailsAction_Copy_User_ID;
+
+ public static String CopyCommentDetailsAction_Copy_User_ID_Tooltip;
+
+ public static String CopyTaskDetailsAction_ID_Menu_Label;
+
+ public static String CopyTaskDetailsAction_Summary_and_Url_Menu_Label;
+
+ public static String CopyTaskDetailsAction_Url_Menu_Label;
+
+ public static String DeleteAction_Confirm_Delete;
+
+ public static String DeleteAction_Delete;
+
+ public static String DeleteAction_Delete_all_of_the_unsubmitted_tasks;
+
+ public static String DeleteAction_Delete_the_elements_listed_below;
+
+ public static String DeleteAction_Delete_failed;
+
+ public static String DeleteAction_Delete_in_progress;
+
+ public static String DeleteAction_Delete_the_planning_information_and_context_for_the_repository_task;
+
+ public static String DeleteAction_Delete_the_planning_information_and_context_of_all_unmatched_tasks;
+
+ public static String DeleteAction_Nothing_selected;
+
+ public static String DeleteAction_Permanently_delete_the_category;
+
+ public static String DeleteAction_Permanently_delete_the_element_listed_below;
+
+ public static String DeleteAction_Permanently_delete_the_query;
+
+ public static String DeleteAction_Permanently_delete_the_task_listed_below;
+
+ public static String DeleteTaskRepositoryAction_Confirm_Delete;
+
+ public static String DeleteTaskRepositoryAction_Delete_Specific_Task_Repository;
+
+ public static String DeleteTaskRepositoryAction_Delete_Repository;
+
+ public static String DeleteTaskRepositoryAction_Delete_the_selected_task_repositories;
+
+ public static String DeleteTaskRepositoryAction_Delete_Repository_In_Progress;
+
+ public static String DeleteTaskRepositoryAction_Delete_Task_Repository_Failed;
+
+ public static String EditRepositoryPropertiesAction_Properties;
+
+ public static String ExpandAllAction_Expand_All;
+
+ public static String ExportAction_Dialog_Title;
+
+ public static String ExportAction_Nothing_selected;
+
+ public static String ExportAction_Problems_encountered;
+
+ public static String ExportAction_X_exists_Do_you_wish_to_overwrite;
+
+ public static String FilterCompletedTasksAction_Filter_Completed_Tasks;
+
+ public static String GoIntoAction_Go_Into;
+
+ public static String GoUpAction_Go_Up_To_Root;
+
+ public static String GroupSubTasksAction_Group_Subtasks;
+
+ public static String ImportAction_Dialog_Title;
+
+ public static String ImportAction_Problems_encountered;
+
+ public static String LinkWithEditorAction_Link_with_Editor;
+
+ public static String NewCategoryAction_A_category_with_this_name_already_exists;
+
+ public static String NewCategoryAction_Enter_name;
+
+ public static String NewCategoryAction_Enter_a_name_for_the_Category;
+
+ public static String NewCategoryAction_New_Category;
+
+ public static String NewCategoryAction_New_Category_;
+
+ public static String NewCategoryAction_A_query_with_this_name_already_exists;
+
+ public static String NewQueryAction_new_query_;
+
+ public static String NewSubTaskAction_The_connector_does_not_support_creating_subtasks_for_this_task;
+
+ public static String NewSubTaskAction_Could_not_initialize_sub_task_data_for_task_;
+
+ public static String NewSubTaskAction_Could_not_retrieve_task_data_for_task_;
+
+ public static String NewSubTaskAction_Create_a_new_subtask;
+
+ public static String NewSubTaskAction_Failed_to_create_new_sub_task_;
+
+ public static String NewSubTaskAction_Subtask;
+
+ public static String NewSubTaskAction_Unable_to_create_subtask;
+
+ public static String NewTaskAction_new_task;
+
+ public static String NewTaskFromSelectionAction_Comment_;
+
+ public static String NewTaskFromSelectionAction____Created_from_Comment___;
+
+ public static String NewTaskFromSelectionAction_New_Task_from_Selection;
+
+ public static String NewTaskFromSelectionAction_Nothing_selected_to_create_task_from;
+
+ public static String NewTaskFromSelectionAction_URL_;
+
+ public static String OpenRepositoryTask_Could_not_find_matching_repository_task;
+
+ public static String OpenRepositoryTask_Open_Repository_Task;
+
+ public static String OpenRepositoryTask_Open_Task;
+
+ public static String OpenTaskAction_Open_Task;
+
+ public static String OpenTaskAction_Select_a_task_to_open__;
+
+ public static String OpenTaskListElementAction_Open;
+
+ public static String OpenTaskListElementAction_Open_Task_List_Element;
+
+ public static String OpenTasksUiPreferencesAction_Preferences_;
+
+ public static String OpenWithBrowserAction_Open_with_Browser;
+
+ public static String PresentationDropDownSelectionAction_Task_Presentation;
+
+ public static String QueryCloneAction_Clone_Query;
+
+ public static String QueryCloneAction_Copy_of_X;
+
+ public static String QueryCloneAction_No_query_selected;
+
+ public static String RefreshRepositoryTasksAction_Refresh_All_Tasks;
+
+ public static String RemoveFromCategoryAction_Remove_From_Category;
+
+ public static String RenameAction_Rename;
+
+ public static String ShowInSearchViewAction_Open_in_Search_Label;
+
+ public static String ShowInTaskListAction_Show_In_Task_List;
+
+ public static String SynchronizeAutomaticallyAction_Synchronize_Automatically;
+
+ public static String SynchronizeEditorAction_Synchronize;
+
+ public static String SynchronizeEditorAction_Synchronize_Incoming_Changes;
+
+ public static String TaskActivateAction_Activate;
+
+ public static String TaskDeactivateAction_Deactivate;
+
+ public static String TaskEditorScheduleAction_Private_Scheduling;
+
+ public static String TaskListSortAction_Sort_;
+
+ public static String TaskSelectionDialog__matches;
+
+ public static String TaskSelectionDialog_Deselect_Working_Set;
+
+ public static String TaskSelectionDialog_Edit_Active_Working_Set_;
+
+ public static String TaskSelectionDialog_New_Task_;
+
+ public static String TaskSelectionDialog_Open_with_Browser;
+
+ public static String TaskSelectionDialog_Random_Task;
+
+ public static String TaskSelectionDialog_Scanning_tasks;
+
+ public static String TaskSelectionDialog_Search_for_tasks;
+
+ public static String TaskSelectionDialog_Select_Working_Set_;
+
+ public static String TaskSelectionDialog_Selected_item_is_not_a_task;
+
+ public static String TaskSelectionDialog_Show_Completed_Tasks;
+
+ public static String TaskSelectionDialogWithRandom_Feeling_Lazy_Error;
+
+ public static String TaskSelectionDialogWithRandom_Feeling_Lazy_Error_Title;
+
+ public static String TaskSelectionDialogWithRandom_Feeling_Lazy_Tooltip;
+
+ public static String TaskWorkingSetAction_All;
+
+ public static String TaskWorkingSetAction_Deselect_All;
+
+ public static String TaskWorkingSetAction_Edit_Label;
+
+ public static String TaskWorkingSetAction_Select_and_Edit_Working_Sets;
+
+ public static String TaskWorkingSetAction_Sets;
+
+ public static String ToggleAllWorkingSetsAction_Show_All;
+
+ public static String ToggleTaskActivationAction_Activate_Task;
+
+ public static String ToggleTaskActivationAction_Deactivate_Task;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewCategoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewCategoryAction.java
new file mode 100644
index 0000000..3242693
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewCategoryAction.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class NewCategoryAction extends Action implements IViewActionDelegate {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.actions.create.category"; //$NON-NLS-1$
+
+ public NewCategoryAction() {
+ setText(Messages.NewCategoryAction_New_Category_);
+ setToolTipText(Messages.NewCategoryAction_New_Category_);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.CATEGORY_NEW);
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ @Override
+ public void run() {
+ createCategory();
+ }
+
+ public TaskCategory createCategory() {
+ InputDialog dialog = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.NewCategoryAction_Enter_name, Messages.NewCategoryAction_Enter_a_name_for_the_Category, "", null); //$NON-NLS-1$
+ int dialogResult = dialog.open();
+ if (dialogResult == Window.OK) {
+ String name = dialog.getValue();
+ Set<RepositoryQuery> queries = TasksUiInternal.getTaskList().getQueries();
+ Set<AbstractTaskCategory> categories = TasksUiInternal.getTaskList().getCategories();
+
+ for (AbstractTaskCategory category : categories) {
+ if (name != null && name.equals(category.getSummary())) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.NewCategoryAction_New_Category,
+ Messages.NewCategoryAction_A_category_with_this_name_already_exists);
+ return null;
+ }
+ }
+ for (RepositoryQuery query : queries) {
+ if (name != null && name.equals(query.getSummary())) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.NewCategoryAction_New_Category,
+ Messages.NewCategoryAction_A_query_with_this_name_already_exists);
+ return null;
+ }
+ }
+
+ TaskCategory category = new TaskCategory(TasksUiPlugin.getTaskList().getUniqueHandleIdentifier(), name);
+ TasksUiPlugin.getTaskList().addCategory(category);
+ return category;
+ }
+ return null;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewQueryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewQueryAction.java
new file mode 100644
index 0000000..fd61176
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewQueryAction.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.LocalRepositoryConnectorUi;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewQueryWizard;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ */
+public class NewQueryAction extends Action implements IViewActionDelegate, IExecutableExtension {
+
+ private final String ID = "org.eclipse.mylyn.tasks.ui.new.query"; //$NON-NLS-1$
+
+ private final String LABEL_NEW_QUERY = Messages.NewQueryAction_new_query_;
+
+ private boolean skipRepositoryPage;
+
+ public NewQueryAction() {
+ setText(LABEL_NEW_QUERY);
+ setToolTipText(LABEL_NEW_QUERY);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.QUERY_NEW);
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ @Override
+ public void run() {
+ IWizard wizard = null;
+ /* Disabled for bug 275204 to make it more simple to discover ui for installing additional connectors
+ List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
+ if (repositories.size() == 2) {
+ // NOTE: this click-saving should be generalized
+ for (TaskRepository taskRepository : repositories) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ if (!(connectorUi instanceof LocalRepositoryConnectorUi)) {
+ wizard = connectorUi.getQueryWizard(taskRepository, null);
+ if (wizard == null) {
+ continue;
+ }
+ ((Wizard) wizard).setForcePreviousAndNextButtons(true);
+ }
+ }
+ } else */
+ if (skipRepositoryPage) {
+ TaskRepository taskRepository = TasksUiUtil.getSelectedRepository();
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ wizard = connectorUi.getQueryWizard(taskRepository, null);
+ ((Wizard) wizard).setForcePreviousAndNextButtons(true);
+ if (connectorUi instanceof LocalRepositoryConnectorUi) {
+ wizard.performFinish();
+ return;
+ }
+ } else {
+ wizard = new NewQueryWizard();
+ }
+
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ }
+
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+ throws CoreException {
+ if ("skipFirstPage".equals(data)) { //$NON-NLS-1$
+ this.skipRepositoryPage = true;
+ }
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java
new file mode 100644
index 0000000..d69878c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewSubTaskAction.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Steffen Pingel
+ */
+public class NewSubTaskAction extends BaseSelectionListenerAction implements IViewActionDelegate, IExecutableExtension {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.new.subtask"; //$NON-NLS-1$
+
+ private AbstractTask selectedTask;
+
+ public NewSubTaskAction() {
+ super(Messages.NewSubTaskAction_Subtask);
+ setToolTipText(Messages.NewSubTaskAction_Create_a_new_subtask);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.TASK_NEW_SUB);
+ }
+
+ @Override
+ public void run() {
+ if (selectedTask == null) {
+ return;
+ }
+
+ if (selectedTask instanceof LocalTask) {
+ // XXX code copied from NewLocalTaskWizard.performFinish() and TaskListManager.createNewLocalTask()
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ LocalTask newTask = new LocalTask("" + taskList.getNextLocalTaskId(), //$NON-NLS-1$
+ LocalRepositoryConnector.DEFAULT_SUMMARY);
+ newTask.setPriority(PriorityLevel.P3.toString());
+ TasksUiPlugin.getTaskActivityManager().scheduleNewTask(newTask);
+ taskList.addTask(newTask, selectedTask);
+ TasksUiUtil.openTask(newTask);
+ return;
+ }
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ selectedTask.getConnectorKind());
+ TaskData taskData = createTaskData(connector);
+ if (taskData != null) {
+ try {
+ TasksUiInternal.createAndOpenNewTask(taskData);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to open new sub task", e)); //$NON-NLS-1$
+ TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask, new Status(
+ IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.NewSubTaskAction_Failed_to_create_new_sub_task_ + e.getMessage()));
+ }
+ }
+ }
+
+ private TaskData createTaskData(AbstractRepositoryConnector connector) {
+ final AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ if (taskDataHandler == null) {
+ return null;
+ }
+
+ String repositoryUrl = selectedTask.getRepositoryUrl();
+ TaskData parentTaskData = null;
+ try {
+ parentTaskData = TasksUi.getTaskDataManager().getTaskData(selectedTask);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not retrieve task data for task:" + selectedTask.getUrl(), e)); //$NON-NLS-1$
+ }
+ if (parentTaskData == null) {
+ TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask, new Status(
+ IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ Messages.NewSubTaskAction_Could_not_retrieve_task_data_for_task_ + selectedTask.getUrl()));
+ return null;
+ }
+
+ final TaskRepository taskRepository = TasksUiPlugin.getRepositoryManager().getRepository(repositoryUrl);
+ if (!taskDataHandler.canInitializeSubTaskData(taskRepository, selectedTask)) {
+ return null;
+ }
+
+ final TaskData selectedTaskData = parentTaskData;
+ final TaskAttributeMapper attributeMapper = taskDataHandler.getAttributeMapper(taskRepository);
+ final TaskData taskData = new TaskData(attributeMapper, taskRepository.getConnectorKind(),
+ taskRepository.getRepositoryUrl(), ""); //$NON-NLS-1$
+ final boolean[] result = new boolean[1];
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ try {
+ CommonUiUtil.run(service, new ICoreRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ result[0] = taskDataHandler.initializeSubTaskData(taskRepository, taskData, selectedTaskData,
+ monitor);
+ }
+ });
+ } catch (CoreException e) {
+ TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask, e.getStatus());
+ return null;
+ } catch (OperationCanceledException e) {
+ // canceled
+ return null;
+ }
+
+ if (result[0]) {
+ // open editor
+ return taskData;
+ } else {
+ TasksUiInternal.displayStatus(Messages.NewSubTaskAction_Unable_to_create_subtask, new Status(IStatus.INFO,
+ TasksUiPlugin.ID_PLUGIN,
+ Messages.NewSubTaskAction_The_connector_does_not_support_creating_subtasks_for_this_task));
+ }
+ return null;
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ selectedTask = null;
+ if (selection.size() == 1) {
+ Object selectedObject = selection.getFirstElement();
+ if (selectedObject instanceof LocalTask) {
+ selectedTask = (AbstractTask) selectedObject;
+ } else if (selectedObject instanceof ITask) {
+ selectedTask = (AbstractTask) selectedObject;
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ selectedTask.getConnectorKind());
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ if (taskDataHandler == null || !taskDataHandler.canInitializeSubTaskData(null, selectedTask)) {
+ selectedTask = null;
+ }
+ }
+ }
+ return selectedTask != null;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof StructuredSelection) {
+ selectionChanged((IStructuredSelection) selection);
+ } else {
+ setEnabled(false);
+ }
+ action.setEnabled(isEnabled());
+ }
+
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+ throws CoreException {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewTaskAction.java
new file mode 100644
index 0000000..663f967
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewTaskAction.java
@@ -0,0 +1,239 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.commons.ui.TaskListImageDescriptor;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ * @author Rob Elves
+ */
+ at SuppressWarnings("restriction")
+public class NewTaskAction extends BaseSelectionListenerAction implements IMenuCreator, IViewActionDelegate,
+ IExecutableExtension {
+
+ private static final String LABEL_NEW_TASK = Messages.NewTaskAction_new_task;
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.ui.repositories.actions.create"; //$NON-NLS-1$
+
+ private boolean skipRepositoryPage = false;
+
+ private boolean localTask = false;
+
+ private Menu dropDownMenu;
+
+ public NewTaskAction() {
+ super(LABEL_NEW_TASK);
+ setMenuCreator(this);
+ setText(LABEL_NEW_TASK);
+ setToolTipText(LABEL_NEW_TASK);
+ setId(ID);
+ setEnabled(true);
+ setImageDescriptor(TasksUiImages.TASK_NEW);
+ }
+
+ @Override
+ public void run() {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed()) {
+ if (localTask) {
+ TasksUiUtil.openNewLocalTaskEditor(shell, null);
+ } else {
+ if (skipRepositoryPage) {
+ TasksUiUtil.openNewTaskEditor(shell, null, TasksUiUtil.getSelectedRepository());
+ } else {
+ TasksUiUtil.openNewTaskEditor(shell, null, null);
+ }
+ }
+ }
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+ throws CoreException {
+ if ("skipFirstPage".equals(data)) { //$NON-NLS-1$
+ this.skipRepositoryPage = true;
+ }
+ if ("local".equals(data)) { //$NON-NLS-1$
+ this.localTask = true;
+ }
+ }
+
+ public void dispose() {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ dropDownMenu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ private void addActionsToMenu() {
+ Set<TaskRepository> includedRepositories = new HashSet<TaskRepository>();
+ TaskRepository localRepository = TasksUi.getRepositoryManager().getRepository(
+ LocalRepositoryConnector.CONNECTOR_KIND, LocalRepositoryConnector.REPOSITORY_URL);
+
+ addRepositoryAction(localRepository);
+
+ IWorkingSet workingSet = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getAggregateWorkingSet();
+ if (workingSet != null && !workingSet.isEmpty()) {
+ // only add repositories in working set
+ for (IAdaptable iterable_element : workingSet.getElements()) {
+ if (iterable_element instanceof RepositoryQuery) {
+ String repositoryUrl = ((RepositoryQuery) iterable_element).getRepositoryUrl();
+ String connectorKind = ((RepositoryQuery) iterable_element).getConnectorKind();
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(connectorKind,
+ repositoryUrl);
+ markForInclusion(includedRepositories, repository);
+
+ }
+ }
+ }
+
+ if (includedRepositories.isEmpty()) {
+ // No repositories were added from working sets so show all
+ for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) {
+ markForInclusion(includedRepositories, repository);
+ }
+ }
+
+ if (!includedRepositories.isEmpty()) {
+ new Separator().fill(dropDownMenu, -1);
+ ArrayList<TaskRepository> listOfRepositories = new ArrayList<TaskRepository>(includedRepositories);
+ final TaskRepositoriesSorter comparator = new TaskRepositoriesSorter();
+ Collections.sort(listOfRepositories, new Comparator<TaskRepository>() {
+
+ public int compare(TaskRepository arg0, TaskRepository arg1) {
+ return comparator.compare(null, arg0, arg1);
+ }
+ });
+ for (TaskRepository taskRepository : listOfRepositories) {
+ addRepositoryAction(taskRepository);
+ }
+ }
+ new Separator().fill(dropDownMenu, -1);
+ new ActionContributionItem(new NewQueryAction()).fill(dropDownMenu, -1);
+ new ActionContributionItem(new NewCategoryAction()).fill(dropDownMenu, -1);
+ new Separator().fill(dropDownMenu, -1);
+ new ActionContributionItem(new AddRepositoryAction()).fill(dropDownMenu, -1);
+ new Separator(IWorkbenchActionConstants.MB_ADDITIONS);
+ }
+
+ private void markForInclusion(Set<TaskRepository> includedRepositories, TaskRepository repository) {
+ if (repository != null && !repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(repository.getConnectorKind());
+ if (connector != null) {
+ if (ITaskRepositoryFilter.CAN_CREATE_NEW_TASK.accept(repository, connector)) {
+ includedRepositories.add(repository);
+ }
+ }
+ }
+ }
+
+ private RepositorySelectionAction addRepositoryAction(TaskRepository repository) {
+ if (repository == null) {
+ return null;
+ }
+ RepositorySelectionAction action = new RepositorySelectionAction(repository);
+ ActionContributionItem item = new ActionContributionItem(action);
+ action.setText(repository.getRepositoryLabel());
+ ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(repository.getConnectorKind());
+ ImageDescriptor compositeDescriptor = new TaskListImageDescriptor(TasksUiImages.TASK_NEW, overlay, false, false);
+ action.setImageDescriptor(compositeDescriptor);
+ item.fill(dropDownMenu, -1);
+ return action;
+ }
+
+ private class RepositorySelectionAction extends Action {
+
+ private final TaskRepository repository;
+
+ public RepositorySelectionAction(TaskRepository repository) {
+ this.repository = repository;
+ setText(repository.getRepositoryLabel());
+ }
+
+ @Override
+ public void run() {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (repository.getConnectorKind().equalsIgnoreCase(LocalRepositoryConnector.CONNECTOR_KIND)) {
+ TasksUiUtil.openNewLocalTaskEditor(shell, null);
+ } else {
+ TasksUiUtil.openNewTaskEditor(shell, null, repository);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewTaskFromSelectionAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewTaskFromSelectionAction.java
new file mode 100644
index 0000000..0d8aaab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/NewTaskFromSelectionAction.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class NewTaskFromSelectionAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.actions.newTaskFromSelection"; //$NON-NLS-1$
+
+ private ITaskMapping taskMapping;
+
+ public NewTaskFromSelectionAction() {
+ super(Messages.NewTaskFromSelectionAction_New_Task_from_Selection);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.TASK_NEW);
+ }
+
+ public ITaskMapping getTaskMapping() {
+ return taskMapping;
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ @Override
+ public void run() {
+ if (taskMapping == null) {
+ MessageDialog.openError(null, Messages.NewTaskFromSelectionAction_New_Task_from_Selection, Messages.NewTaskFromSelectionAction_Nothing_selected_to_create_task_from);
+ return;
+ }
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ TasksUiUtil.openNewTaskEditor(shell, taskMapping, null);
+ }
+
+ public void selectionChanged(ISelection selection) {
+ if (selection instanceof TextSelection) {
+ TextSelection textSelection = (TextSelection) selection;
+ final String text = textSelection.getText();
+ if (text != null && text.length() > 0) {
+ taskMapping = new TaskMapping() {
+ @Override
+ public String getDescription() {
+ return text;
+ }
+ };
+ } else {
+ taskMapping = null;
+ }
+// } else if (selection instanceof RepositoryTaskSelection) {
+// RepositoryTaskSelection repositoryTaskSelection = (RepositoryTaskSelection) selection;
+// IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
+// AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(repositoryTaskSelection.getRepositoryKind());
+//
+// TaskComment comment = repositoryTaskSelection.getComment();
+// if (comment != null) {
+// StringBuilder sb = new StringBuilder();
+// sb.append("\n-- Created from Comment --");
+// if (connector != null) {
+// sb.append("\nURL: ");
+// sb.append(connector.getTaskUrl(repositoryTaskSelection.getRepositoryUrl(),
+// repositoryTaskSelection.getId()));
+// }
+// sb.append("\nComment: ");
+// sb.append(comment.getNumber());
+//
+// sb.append("\n\n");
+// if (taskSelection != null) {
+// // if text was selected, prefer that
+// sb.append(taskSelection.getLegacyTaskData().getDescription());
+// } else {
+// sb.append(comment.getText());
+// }
+//
+// taskSelection = new TaskSelection("", sb.toString());
+// } else if (taskSelection != null) {
+// StringBuilder sb = new StringBuilder();
+// if (connector != null) {
+// sb.append("\n-- Created from Task --");
+// sb.append("\nURL: ");
+// sb.append(connector.getTaskUrl(repositoryTaskSelection.getRepositoryUrl(),
+// repositoryTaskSelection.getId()));
+// }
+//
+// sb.append("\n\n");
+// sb.append(taskSelection.getLegacyTaskData().getDescription());
+//
+// taskSelection = new TaskSelection("", sb.toString());
+// }
+ } else if (selection instanceof StructuredSelection) {
+ Object element = ((StructuredSelection) selection).getFirstElement();
+ if (element instanceof ITaskComment) {
+ ITaskComment comment = (ITaskComment) element;
+ final StringBuilder sb = new StringBuilder();
+ sb.append("\n" + Messages.NewTaskFromSelectionAction____Created_from_Comment___); //$NON-NLS-1$
+ if (comment.getUrl() == null) {
+ sb.append("\n" + Messages.NewTaskFromSelectionAction_URL_); //$NON-NLS-1$
+ sb.append(comment.getTask().getUrl());
+ sb.append("\n" + Messages.NewTaskFromSelectionAction_Comment_); //$NON-NLS-1$
+ sb.append(comment.getNumber());
+ } else {
+ sb.append("\n" + Messages.NewTaskFromSelectionAction_URL_); //$NON-NLS-1$
+ sb.append(comment.getUrl());
+ }
+
+ sb.append("\n\n"); //$NON-NLS-1$
+ sb.append(comment.getText());
+ taskMapping = new TaskMapping() {
+ @Override
+ public String getDescription() {
+ return sb.toString();
+ }
+ };
+ }
+ }
+ setEnabled(taskMapping != null);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenRepositoryTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenRepositoryTaskAction.java
new file mode 100644
index 0000000..070db87
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenRepositoryTaskAction.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.ui.AddExistingTaskJob;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.commands.RemoteTaskSelectionDialog;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenRepositoryTaskAction extends Action implements IWorkbenchWindowActionDelegate, IViewActionDelegate {
+
+ private static final String OPEN_REMOTE_TASK_DIALOG_DIALOG_SETTINGS = "org.eclipse.mylyn.tasks.ui.open.remote"; //$NON-NLS-1$
+
+ public void run(IAction action) {
+ RemoteTaskSelectionDialog dlg = new RemoteTaskSelectionDialog(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell());
+ dlg.setTitle(Messages.OpenRepositoryTask_Open_Repository_Task);
+
+ IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings dlgSettings = settings.getSection(OPEN_REMOTE_TASK_DIALOG_DIALOG_SETTINGS);
+ if (dlgSettings == null) {
+ dlgSettings = settings.addNewSection(OPEN_REMOTE_TASK_DIALOG_DIALOG_SETTINGS);
+ }
+ dlg.setDialogBoundsSettings(dlgSettings, Dialog.DIALOG_PERSISTLOCATION | Dialog.DIALOG_PERSISTSIZE);
+
+ if (dlg.open() == Window.OK) {
+ if (dlg.getSelectedTask() != null) {
+ openExistingTask(dlg);
+ } else {
+ openRemoteTask(dlg);
+ }
+ }
+ }
+
+ /**
+ * Selected a existing task; handle category move, if needed
+ */
+ private void openExistingTask(RemoteTaskSelectionDialog dlg) {
+ if (dlg.shouldAddToTaskList()) {
+ TasksUiInternal.getTaskList().addTask(dlg.getSelectedTask(), dlg.getSelectedCategory());
+ }
+ TasksUiInternal.refreshAndOpenTaskListElement(dlg.getSelectedTask());
+ }
+
+ /**
+ * Selected a repository, so try to obtain the task using taskId
+ */
+ private void openRemoteTask(RemoteTaskSelectionDialog dlg) {
+ String[] selectedIds = dlg.getSelectedIds();
+ if (dlg.shouldAddToTaskList()) {
+ for (String id : selectedIds) {
+ final IProgressService svc = PlatformUI.getWorkbench().getProgressService();
+ final AddExistingTaskJob job = new AddExistingTaskJob(dlg.getSelectedTaskRepository(), id,
+ dlg.getSelectedCategory());
+ job.schedule();
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ svc.showInDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), job);
+ }
+
+ });
+ }
+ } else {
+ boolean openSuccessful = false;
+ for (String id : selectedIds) {
+ boolean opened = TasksUiUtil.openTask(dlg.getSelectedTaskRepository(), id);
+ if (opened) {
+ openSuccessful = true;
+ }
+ }
+ if (!openSuccessful) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.OpenRepositoryTask_Open_Task,
+ Messages.OpenRepositoryTask_Could_not_find_matching_repository_task);
+ }
+ }
+ }
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public void init(IViewPart view) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskAction.java
new file mode 100644
index 0000000..8b89753
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskAction.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.actions.ActionDelegate;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class OpenTaskAction extends ActionDelegate implements IWorkbenchWindowActionDelegate {
+
+ private IWorkbenchWindow window;
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ @Override
+ public void run(IAction action) {
+ TaskSelectionDialog dlg = new TaskSelectionDialog(window.getShell());
+ dlg.setTitle(Messages.OpenTaskAction_Open_Task);
+ dlg.setMessage(Messages.OpenTaskAction_Select_a_task_to_open__);
+ dlg.setShowExtendedOpeningOptions(true);
+
+ if (dlg.open() != Window.OK) {
+ return;
+ }
+
+ Object result = dlg.getFirstResult();
+ if (result instanceof ITask) {
+ AbstractTask task = (AbstractTask) result;
+ if (dlg.getOpenInBrowser()) {
+ if (TasksUiInternal.isValidUrl(task.getUrl())) {
+ TasksUiUtil.openUrl(task.getUrl());
+ }
+ } else {
+ TasksUiInternal.refreshAndOpenTaskListElement(task);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskListElementAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskListElementAction.java
new file mode 100644
index 0000000..cd34793
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskListElementAction.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenTaskListElementAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.open"; //$NON-NLS-1$
+
+ private AbstractTreeViewer viewer;
+
+ public OpenTaskListElementAction() {
+ super(Messages.OpenTaskListElementAction_Open);
+ setToolTipText(Messages.OpenTaskListElementAction_Open_Task_List_Element);
+ setId(ID);
+ }
+
+ public AbstractTreeViewer getViewer() {
+ return viewer;
+ }
+
+ public void setViewer(AbstractTreeViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ @Override
+ public void run() {
+ runWithEvent(null);
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ for (Object element : getStructuredSelection().toList()) {
+ if (element instanceof ITask && event != null && (event.keyCode & SWT.MOD1) != 0) {
+ TasksUiInternal.openTaskInBackground((AbstractTask) element, true);
+ } else if (element instanceof ITask) {
+ TasksUiInternal.refreshAndOpenTaskListElement((ITask) element);
+ } else if (viewer != null) {
+ if (viewer.getExpandedState(element)) {
+ viewer.collapseToLevel(element, 1);
+ } else {
+ viewer.expandToLevel(element, 1);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskSearchAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskSearchAction.java
new file mode 100644
index 0000000..0c6f858
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTaskSearchAction.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class OpenTaskSearchAction extends Action implements IViewActionDelegate {
+
+ public OpenTaskSearchAction() {
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ NewSearchUI.openSearchDialog(window, TaskSearchPage.ID);
+ }
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTasksUiPreferencesAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTasksUiPreferencesAction.java
new file mode 100644
index 0000000..013f3b4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenTasksUiPreferencesAction.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.mylyn.internal.tasks.ui.preferences.TasksUiPreferencePage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenTasksUiPreferencesAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.actions.preferences.open"; //$NON-NLS-1$
+
+ public OpenTasksUiPreferencesAction() {
+ setText(Messages.OpenTasksUiPreferencesAction_Preferences_);
+ setToolTipText(Messages.OpenTasksUiPreferencesAction_Preferences_);
+ setId(ID);
+ }
+
+ @Override
+ public void run() {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), TasksUiPreferencePage.ID, new String[] { TasksUiPreferencePage.ID }, null);
+ dlg.open();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenWithBrowserAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenWithBrowserAction.java
new file mode 100644
index 0000000..734fa07
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/OpenWithBrowserAction.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class OpenWithBrowserAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.open.browser"; //$NON-NLS-1$
+
+ public OpenWithBrowserAction() {
+ super(Messages.OpenWithBrowserAction_Open_with_Browser);
+ setToolTipText(Messages.OpenWithBrowserAction_Open_with_Browser);
+ setId(ID);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void run() {
+ if (super.getStructuredSelection() != null) {
+ for (Iterator iter = super.getStructuredSelection().iterator(); iter.hasNext();) {
+ runWithSelection(iter.next());
+ }
+ }
+ }
+
+ private void runWithSelection(Object selectedObject) {
+ String urlString = null;
+ if (selectedObject instanceof ITask) {
+ AbstractTask task = (AbstractTask) selectedObject;
+ if (TasksUiInternal.isValidUrl(task.getUrl())) {
+ urlString = task.getUrl();
+ }
+ } else if (selectedObject instanceof IRepositoryElement) {
+ IRepositoryElement query = (IRepositoryElement) selectedObject;
+ urlString = query.getUrl();
+ }
+
+ if (urlString != null) {
+ TasksUiUtil.openUrl(urlString);
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ if (!selection.isEmpty()) {
+ for (Object element : selection.toList()) {
+ if (element instanceof ITask) {
+ if (TasksUiInternal.isValidUrl(((ITask) element).getUrl())) {
+ return true;
+ }
+ }
+ if (element instanceof IRepositoryElement) {
+ if (((IRepositoryElement) element).getUrl() != null) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/PresentationDropDownSelectionAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/PresentationDropDownSelectionAction.java
new file mode 100644
index 0000000..628c383
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/PresentationDropDownSelectionAction.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class PresentationDropDownSelectionAction extends Action implements IMenuCreator {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.presentationselection"; //$NON-NLS-1$
+
+ private final TaskListView view;
+
+ private Menu dropDownMenu;
+
+ public PresentationDropDownSelectionAction(TaskListView view) {
+ this.view = view;
+ setMenuCreator(this);
+ setText(Messages.PresentationDropDownSelectionAction_Task_Presentation);
+ setToolTipText(Messages.PresentationDropDownSelectionAction_Task_Presentation);
+ setId(ID);
+ setEnabled(true);
+ setImageDescriptor(CommonImages.PRESENTATION);
+ }
+
+ private void addActionsToMenu() {
+ for (AbstractTaskListPresentation presentation : TaskListView.getPresentations()) {
+ if (presentation.isPrimary()) {
+ PresentationSelectionAction action = new PresentationSelectionAction(presentation);
+ ActionContributionItem item = new ActionContributionItem(action);
+ action.setText(presentation.getName());
+ action.setImageDescriptor(presentation.getImageDescriptor());
+ action.setChecked(view.getCurrentPresentation().getId().equals(presentation.getId()));
+ item.fill(dropDownMenu, -1);
+ }
+ }
+
+ boolean separatorAdded = false;
+
+ for (AbstractTaskListPresentation presentation : TaskListView.getPresentations()) {
+ if (WorkbenchUtil.allowUseOf(presentation)) {
+ if (!presentation.isPrimary()) {
+ if (!separatorAdded) {
+ new Separator().fill(dropDownMenu, -1);
+ separatorAdded = true;
+ }
+
+ PresentationSelectionAction action = new PresentationSelectionAction(presentation);
+ ActionContributionItem item = new ActionContributionItem(action);
+ action.setText(presentation.getName());
+ action.setImageDescriptor(presentation.getImageDescriptor());
+ action.setChecked(view.getCurrentPresentation().getId().equals(presentation.getId()));
+ item.fill(dropDownMenu, -1);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void run() {
+ AbstractTaskListPresentation current = view.getCurrentPresentation();
+ List<AbstractTaskListPresentation> all = TaskListView.getPresentations();
+ int size = all.size();
+ if (size == 0) {
+ return;
+ }
+
+ // cycle between primary presentations
+ int index = all.indexOf(current) + 1;
+ for (int i = 0; i < size; i++) {
+ AbstractTaskListPresentation presentation = all.get(index % size);
+ if (presentation.isPrimary()) {
+ view.applyPresentation(presentation);
+ return;
+ }
+ index++;
+ }
+
+ // fall back to next presentation in list
+ index = all.indexOf(current) + 1;
+ if (index < size) {
+ view.applyPresentation(all.get(index));
+ } else {
+ view.applyPresentation(all.get(0));
+ }
+ }
+
+ public void dispose() {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ dropDownMenu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ private class PresentationSelectionAction extends Action {
+
+ private final AbstractTaskListPresentation presentation;
+
+ public PresentationSelectionAction(AbstractTaskListPresentation presentation) {
+ this.presentation = presentation;
+ setText(presentation.getName());
+ }
+
+ @Override
+ public void run() {
+ view.applyPresentation(presentation);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java
new file mode 100644
index 0000000..770ac92
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/QueryCloneAction.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jevgeni Holodkov 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:
+ * Jevgeni Holodkov - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Allow to clone a selected query.
+ *
+ * @author Jevgeni Holodkov
+ */
+public class QueryCloneAction extends Action implements IViewActionDelegate {
+
+ protected ISelection selection;
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ run(getSelectedQuery(selection));
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selection = selection;
+ IRepositoryQuery selectedQuery = getSelectedQuery(selection);
+ action.setEnabled(true);
+ if (selectedQuery != null) {
+ action.setEnabled(true);
+ } else {
+ action.setEnabled(false);
+ }
+ }
+
+ protected RepositoryQuery getSelectedQuery(ISelection newSelection) {
+ if (selection instanceof StructuredSelection) {
+ // allow to select only one element
+ if (((StructuredSelection) selection).size() == 1) {
+ Object selectedObject = ((StructuredSelection) selection).getFirstElement();
+ if (selectedObject instanceof IRepositoryQuery) {
+ return (RepositoryQuery) selectedObject;
+ }
+ }
+ }
+ return null;
+ }
+
+ public void run(RepositoryQuery selectedQuery) {
+ if (selectedQuery == null) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.QueryCloneAction_Clone_Query, Messages.QueryCloneAction_No_query_selected);
+ return;
+ }
+
+ List<RepositoryQuery> queries = new ArrayList<RepositoryQuery>();
+ queries.add(selectedQuery);
+
+ List<RepositoryQuery> clonedQueries = new ArrayList<RepositoryQuery>(queries.size());
+ for (RepositoryQuery query : queries) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(),
+ query.getRepositoryUrl());
+ RepositoryQuery clonedQuery = (RepositoryQuery) TasksUi.getRepositoryModel().createRepositoryQuery(
+ repository);
+ clonedQuery.setSummary(NLS.bind(Messages.QueryCloneAction_Copy_of_X, query.getSummary()));
+ clonedQuery.setUrl(query.getUrl());
+ Map<String, String> attributes = query.getAttributes();
+ for (Map.Entry<String, String> entry : attributes.entrySet()) {
+ clonedQuery.setAttribute(entry.getKey(), entry.getValue());
+ }
+ clonedQueries.add(clonedQuery);
+ }
+ for (RepositoryQuery query : clonedQueries) {
+ TasksUiPlugin.getTaskList().addQuery(query);
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(query.getConnectorKind());
+ TasksUiInternal.openEditQueryDialog(connectorUi, query);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RefreshRepositoryTasksAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RefreshRepositoryTasksAction.java
new file mode 100644
index 0000000..7d76065
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RefreshRepositoryTasksAction.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RefreshRepositoryTasksAction extends AbstractTaskRepositoryAction implements IViewActionDelegate {
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.refreshAllTasks"; //$NON-NLS-1$
+
+ public RefreshRepositoryTasksAction() {
+ super(Messages.RefreshRepositoryTasksAction_Refresh_All_Tasks);
+ setId(ID);
+ setEnabled(false);
+ }
+
+ @Override
+ public void run() {
+ IStructuredSelection selection = getStructuredSelection();
+ for (Iterator<?> iter = selection.iterator(); iter.hasNext();) {
+ Object selectedObject = iter.next();
+ if (selectedObject instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) selectedObject;
+ synchronizeAllTasks(repository);
+ }
+ }
+ }
+
+ private void synchronizeAllTasks(TaskRepository repository) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ if (connector != null) {
+ Set<ITask> repositoryTasks = TasksUiPlugin.getTaskList().getTasks(repository.getRepositoryUrl());
+ TasksUiInternal.synchronizeTasks(connector, repositoryTasks, true, null);
+ }
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ selectionChanged((IStructuredSelection) selection);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java
new file mode 100644
index 0000000..b73540f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RemoveFromCategoryAction.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Ken Sueda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ */
+public class RemoveFromCategoryAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.remove"; //$NON-NLS-1$
+
+ public RemoveFromCategoryAction() {
+ super(Messages.RemoveFromCategoryAction_Remove_From_Category);
+ setId(ID);
+ setImageDescriptor(CommonImages.REMOVE);
+ }
+
+ @Override
+ public void run() {
+ IStructuredSelection selection = getStructuredSelection();
+ for (Object selectedObject : selection.toList()) {
+ if (selectedObject instanceof ITask) {
+ AbstractTask task = (AbstractTask) selectedObject;
+ AbstractTaskCategory category = TaskCategory.getParentTaskCategory(task);
+ if (category != null) {
+ TasksUiInternal.getTaskList().removeFromContainer(category, task);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java
new file mode 100644
index 0000000..e7629d0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RenameAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class RenameAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.rename"; //$NON-NLS-1$
+
+ private final TaskListView view;
+
+ public RenameAction(TaskListView view) {
+ super(Messages.RenameAction_Rename);
+ this.view = view;
+ setId(ID);
+ setAccelerator(SWT.F2);
+ }
+
+ @Override
+ public void run() {
+ Object selectedObject = ((IStructuredSelection) this.view.getViewer().getSelection()).getFirstElement();
+ if (selectedObject instanceof IRepositoryElement) {
+ IRepositoryElement element = (IRepositoryElement) selectedObject;
+ view.setInRenameAction(true);
+ view.getViewer().editElement(element, 0);
+ view.setInRenameAction(false);
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ Object selectedObject = selection.getFirstElement();
+ if (selectedObject instanceof AbstractTaskCategory) {
+ AbstractTaskCategory container = (AbstractTaskCategory) selectedObject;
+ return container.isUserManaged();
+ } else if (selectedObject instanceof IRepositoryQuery) {
+ return true;
+ }
+ return (selectedObject instanceof LocalTask);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RepositoryElementActionGroup.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RepositoryElementActionGroup.java
new file mode 100644
index 0000000..903a000
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RepositoryElementActionGroup.java
@@ -0,0 +1,373 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction.Mode;
+import org.eclipse.mylyn.internal.tasks.ui.views.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositoryElementActionGroup {
+
+ protected static final String ID_SEPARATOR_NEW = "new"; //$NON-NLS-1$
+
+ private static final String ID_SEPARATOR_OPERATIONS = "operations"; //$NON-NLS-1$
+
+ private static final String ID_SEPARATOR_TASKS = "tasks"; //$NON-NLS-1$
+
+ protected static final String ID_SEPARATOR_REPOSITORY = "repository"; //$NON-NLS-1$
+
+ private static final String ID_SEPARATOR_PROPERTIES = "properties"; //$NON-NLS-1$
+
+ protected static final String ID_SEPARATOR_NAVIGATE = "navigate"; //$NON-NLS-1$
+
+ private static final String ID_SEPARATOR_OPEN = "open"; //$NON-NLS-1$
+
+ protected static final String ID_SEPARATOR_EDIT = "edit"; //$NON-NLS-1$
+
+ private final CopyTaskDetailsAction copyUrlAction;
+
+ private final CopyTaskDetailsAction copyKeyAction;
+
+ private final CopyTaskDetailsAction copyDetailsAction;
+
+ private final OpenTaskListElementAction openAction;
+
+ private final OpenWithBrowserAction openWithBrowserAction;
+
+ private final DeleteAction deleteAction;
+
+ private final RemoveFromCategoryAction removeFromCategoryAction;
+
+ private final ShowInSearchViewAction showInSearchViewAction;
+
+ private final ShowInTaskListAction showInTaskListAction;
+
+ private final TaskActivateAction activateAction;
+
+ private final TaskDeactivateAction deactivateAction;
+
+ private ISelectionProvider selectionProvider;
+
+ private final List<ISelectionChangedListener> actions;
+
+ private final AutoUpdateQueryAction autoUpdateAction;
+
+ private final NewSubTaskAction newSubTaskAction;
+
+ public RepositoryElementActionGroup() {
+ actions = new ArrayList<ISelectionChangedListener>();
+
+ newSubTaskAction = add(new NewSubTaskAction());
+
+ activateAction = add(new TaskActivateAction());
+ deactivateAction = new TaskDeactivateAction();
+
+ copyKeyAction = add(new CopyTaskDetailsAction(Mode.KEY));
+ copyUrlAction = add(new CopyTaskDetailsAction(Mode.URL));
+ copyDetailsAction = add(new CopyTaskDetailsAction(Mode.SUMMARY_URL));
+ if (!isInEditor()) {
+ copyDetailsAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
+ }
+
+ removeFromCategoryAction = add(new RemoveFromCategoryAction());
+
+ deleteAction = add(new DeleteAction());
+ openAction = add(new OpenTaskListElementAction());
+ openWithBrowserAction = add(new OpenWithBrowserAction());
+ showInSearchViewAction = add(new ShowInSearchViewAction());
+ showInTaskListAction = add(new ShowInTaskListAction());
+
+ autoUpdateAction = add(new AutoUpdateQueryAction());
+ }
+
+ private <T extends ISelectionChangedListener> T add(T action) {
+ actions.add(action);
+ return action;
+ }
+
+ public void setSelectionProvider(ISelectionProvider selectionProvider) {
+ if (this.selectionProvider != null) {
+ for (ISelectionChangedListener action : actions) {
+ this.selectionProvider.removeSelectionChangedListener(action);
+ }
+ }
+ this.selectionProvider = selectionProvider;
+ if (selectionProvider != null) {
+ for (ISelectionChangedListener action : actions) {
+ this.selectionProvider.addSelectionChangedListener(action);
+ ISelection selection = selectionProvider.getSelection();
+ if (selection == null) {
+ selection = StructuredSelection.EMPTY;
+ }
+ action.selectionChanged(new SelectionChangedEvent(selectionProvider, selection));
+ }
+ }
+ }
+
+ public void fillContextMenu(final IMenuManager manager) {
+ manager.add(new Separator(ID_SEPARATOR_NEW)); // new, schedule
+ manager.add(new GroupMarker(ID_SEPARATOR_NAVIGATE)); // mark, go into, go up
+ manager.add(new Separator(ID_SEPARATOR_OPEN)); // open, activate
+ manager.add(new Separator(ID_SEPARATOR_EDIT)); // cut, copy paste, delete, rename
+ manager.add(new Separator(ID_SEPARATOR_TASKS)); // move to
+ manager.add(new GroupMarker(ID_SEPARATOR_OPERATIONS)); // repository properties, import/export, context
+ manager.add(new Separator(ID_SEPARATOR_REPOSITORY)); // synchronize
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ manager.add(new Separator(ID_SEPARATOR_PROPERTIES)); // properties
+
+ final ITaskContainer element;
+ IStructuredSelection selection = getSelection();
+ final Object firstSelectedObject = selection.getFirstElement();
+ if (firstSelectedObject instanceof ITaskContainer) {
+ element = (ITaskContainer) firstSelectedObject;
+ } else {
+ element = null;
+ }
+ final List<IRepositoryElement> selectedElements = getSelectedTaskContainers(selection);
+ AbstractTask task = null;
+ if (element instanceof ITask) {
+ task = (AbstractTask) element;
+ }
+
+ if (!isInTaskList() && newSubTaskAction.isEnabled()) {
+ MenuManager newSubMenu = new MenuManager(Messages.RepositoryElementActionGroup_New);
+ newSubMenu.add(newSubTaskAction);
+ manager.appendToGroup(ID_SEPARATOR_NEW, newSubMenu);
+ }
+
+ if (element instanceof ITask && !isInEditor()) {
+ addAction(ID_SEPARATOR_OPEN, openAction, manager, element);
+ }
+ if (openWithBrowserAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_OPEN, openWithBrowserAction);
+ }
+ showInSearchViewAction.selectionChanged(selection);
+ if (showInSearchViewAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_OPEN, showInSearchViewAction);
+ }
+ showInTaskListAction.selectionChanged(selection);
+ if (showInTaskListAction.isEnabled() && !isInTaskList()) {
+ manager.appendToGroup(ID_SEPARATOR_OPEN, showInTaskListAction);
+ }
+ if (task != null) {
+ if (task.isActive()) {
+ manager.appendToGroup(ID_SEPARATOR_OPEN, deactivateAction);
+ } else {
+ manager.appendToGroup(ID_SEPARATOR_OPEN, activateAction);
+ }
+ }
+
+ if (!selection.isEmpty()) {
+ MenuManager copyDetailsSubMenu = new MenuManager(
+ Messages.RepositoryElementActionGroup_Copy_Detail_Menu_Label, CopyTaskDetailsAction.ID);
+ copyDetailsSubMenu.add(copyKeyAction);
+ copyDetailsSubMenu.add(copyUrlAction);
+ copyDetailsSubMenu.add(copyDetailsAction);
+ manager.appendToGroup(ID_SEPARATOR_EDIT, copyDetailsSubMenu);
+ }
+ if (isInTaskList()) {
+ manager.appendToGroup(ID_SEPARATOR_EDIT, deleteAction);
+ }
+ removeFromCategoryAction.selectionChanged(selection);
+ removeFromCategoryAction.setEnabled(isRemoveFromCategoryEnabled(selectedElements));
+ if (removeFromCategoryAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_EDIT, removeFromCategoryAction);
+ }
+
+ if (autoUpdateAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_REPOSITORY, autoUpdateAction);
+ }
+
+ if (element instanceof IRepositoryQuery) {
+ EditRepositoryPropertiesAction repositoryPropertiesAction = new EditRepositoryPropertiesAction();
+ repositoryPropertiesAction.selectionChanged(new StructuredSelection(element));
+ if (repositoryPropertiesAction.isEnabled()) {
+ MenuManager subMenu = new MenuManager(Messages.TaskListView_Repository);
+ manager.appendToGroup(ID_SEPARATOR_OPERATIONS, subMenu);
+
+ UpdateRepositoryConfigurationAction resetRepositoryConfigurationAction = new UpdateRepositoryConfigurationAction();
+ resetRepositoryConfigurationAction.selectionChanged(new StructuredSelection(element));
+ subMenu.add(resetRepositoryConfigurationAction);
+ subMenu.add(new Separator());
+ subMenu.add(repositoryPropertiesAction);
+ }
+ }
+
+ Map<String, List<IDynamicSubMenuContributor>> dynamicMenuMap = TasksUiPlugin.getDefault().getDynamicMenuMap();
+ for (final String menuPath : dynamicMenuMap.keySet()) {
+ for (final IDynamicSubMenuContributor contributor : dynamicMenuMap.get(menuPath)) {
+ SafeRunnable.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Menu contributor failed")); //$NON-NLS-1$
+ }
+
+ public void run() throws Exception {
+ MenuManager subMenuManager = contributor.getSubMenuManager(selectedElements);
+ if (subMenuManager != null) {
+ addMenuManager(menuPath, subMenuManager, manager, element);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ private boolean isInTaskList() {
+ return (this instanceof TaskListViewActionGroup);
+ }
+
+ private IStructuredSelection getSelection() {
+ ISelection selection = (selectionProvider != null) ? selectionProvider.getSelection() : null;
+ if (selection instanceof IStructuredSelection) {
+ return (IStructuredSelection) selection;
+ }
+ return StructuredSelection.EMPTY;
+ }
+
+ private boolean isInEditor() {
+ return (this instanceof TaskEditorActionGroup);
+ }
+
+ private boolean isRemoveFromCategoryEnabled(final List<IRepositoryElement> selectedElements) {
+ if (selectedElements.isEmpty()) {
+ return false;
+ }
+ for (IRepositoryElement element : selectedElements) {
+ if (element instanceof AbstractTask) {
+ boolean hasCategory = false;
+ for (ITaskContainer container : ((AbstractTask) element).getParentContainers()) {
+ if (container instanceof TaskCategory) {
+ hasCategory = true;
+ }
+ }
+ if (!hasCategory) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void addMenuManager(String path, IMenuManager menuToAdd, IMenuManager manager, ITaskContainer element) {
+ if (element instanceof ITask || element instanceof IRepositoryQuery) {
+ manager.appendToGroup(path, menuToAdd);
+ }
+ }
+
+ private void addAction(String path, Action action, IMenuManager manager, ITaskContainer element) {
+ action.setEnabled(false);
+ if (element != null) {
+ updateActionEnablement(action, element);
+ }
+ manager.appendToGroup(path, action);
+ }
+
+ // TODO move the enablement to the action classes
+ private void updateActionEnablement(Action action, ITaskContainer element) {
+ if (element instanceof ITask) {
+ if (action instanceof OpenTaskListElementAction) {
+ action.setEnabled(true);
+ } else if (action instanceof CopyTaskDetailsAction) {
+ action.setEnabled(true);
+ } else if (action instanceof RenameAction) {
+ action.setEnabled(true);
+ }
+ } else if (element != null) {
+ if (action instanceof GoIntoAction) {
+ TaskCategory cat = (TaskCategory) element;
+ if (cat.getChildren().size() > 0) {
+ action.setEnabled(true);
+ } else {
+ action.setEnabled(false);
+ }
+ } else if (action instanceof OpenTaskListElementAction) {
+ action.setEnabled(true);
+ } else if (action instanceof CopyTaskDetailsAction) {
+ action.setEnabled(true);
+ } else if (action instanceof RenameAction) {
+ if (element instanceof AbstractTaskCategory) {
+ AbstractTaskCategory container = (AbstractTaskCategory) element;
+ action.setEnabled(container.isUserManaged());
+ } else if (element instanceof IRepositoryQuery) {
+ action.setEnabled(true);
+ }
+ }
+ } else {
+ action.setEnabled(true);
+ }
+ }
+
+ public List<IRepositoryElement> getSelectedTaskContainers(IStructuredSelection selection) {
+ List<IRepositoryElement> selectedElements = new ArrayList<IRepositoryElement>();
+ for (Iterator<?> i = selection.iterator(); i.hasNext();) {
+ Object object = i.next();
+ if (object instanceof ITaskContainer) {
+ selectedElements.add((IRepositoryElement) object);
+ }
+ }
+ return selectedElements;
+ }
+
+ public OpenTaskListElementAction getOpenAction() {
+ return openAction;
+ }
+
+ public TaskActivateAction getActivateAction() {
+ return activateAction;
+ }
+
+ public DeleteAction getDeleteAction() {
+ return deleteAction;
+ }
+
+ public CopyTaskDetailsAction getCopyDetailsAction() {
+ return copyDetailsAction;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RestoreTaskListAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RestoreTaskListAction.java
new file mode 100644
index 0000000..544209f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/RestoreTaskListAction.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataImportWizard;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class RestoreTaskListAction extends Action implements IViewActionDelegate, IWorkbenchWindowActionDelegate {
+
+ public void init(IViewPart view) {
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ @Override
+ public void run() {
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed()) {
+ IWizard wizard = new TaskDataImportWizard();
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public void dispose() {
+ // ignore
+
+ }
+
+ public void init(IWorkbenchWindow window) {
+ // ignore
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SaveAttachmentsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SaveAttachmentsAction.java
new file mode 100644
index 0000000..bd379ea
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SaveAttachmentsAction.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * Peter Stibrany - improvements for bug 271197
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.DownloadAttachmentJob;
+import org.eclipse.mylyn.internal.tasks.ui.util.Messages;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Peter Stibrany
+ */
+public class SaveAttachmentsAction extends Action {
+
+ private static final String ATTACHMENT_DEFAULT_NAME = "attachment"; //$NON-NLS-1$
+
+ private static final String CTYPE_ZIP = "zip"; //$NON-NLS-1$
+
+ private static final String CTYPE_OCTET_STREAM = "octet-stream"; //$NON-NLS-1$
+
+ private static final String CTYPE_TEXT = "text"; //$NON-NLS-1$
+
+ private static final String CTYPE_HTML = "html"; //$NON-NLS-1$
+
+ public SaveAttachmentsAction(String text) {
+ super(text);
+ }
+
+ @Override
+ public void run() {
+ List<ITaskAttachment> attachments = AttachmentUtil.getSelectedAttachments();
+ if (attachments.isEmpty()) {
+ return;
+ } else if (attachments.size() == 1) {
+ saveSingleAttachment(attachments.get(0));
+ } else {
+ saveAllAttachments(attachments);
+ }
+ }
+
+ /**
+ * Displays Save File dialog, then downloads and saves single attachment.
+ */
+ private void saveSingleAttachment(ITaskAttachment attachment) {
+ FileDialog fileChooser = new FileDialog(WorkbenchUtil.getShell(), SWT.SAVE);
+ fileChooser.setFileName(getAttachmentFilename(attachment));
+
+ File initDirectory = getInitialDirectory();
+ if (initDirectory != null) {
+ fileChooser.setFilterPath(initDirectory.getAbsolutePath());
+ }
+
+ String filePath = fileChooser.open();
+
+ // check if the dialog was canceled or an error occurred
+ if (filePath == null) {
+ return;
+ }
+
+ File file = new File(filePath);
+ if (file.exists()) {
+ if (!MessageDialog.openConfirm(WorkbenchUtil.getShell(), Messages.TasksUiMenus_File_exists_,
+ Messages.TasksUiMenus_Overwrite_existing_file_ + file.getName())) {
+ return;
+ }
+ }
+
+ initDirectory = file.getParentFile();
+ if (initDirectory != null) {
+ saveInitialDirectory(initDirectory.getAbsolutePath());
+ }
+
+ DownloadAttachmentJob job = new DownloadAttachmentJob(attachment, file);
+ job.setUser(true);
+ job.schedule();
+ }
+
+ private void saveAllAttachments(List<ITaskAttachment> attachments) {
+ DirectoryDialog dialog = new DirectoryDialog(WorkbenchUtil.getShell());
+ dialog.setText(Messages.SaveAttachmentsAction_selectDirectory);
+ dialog.setMessage(Messages.SaveAttachmentsAction_selectDirectoryHint);
+
+ File initDirectory = getInitialDirectory();
+ if (initDirectory != null) {
+ dialog.setFilterPath(initDirectory.getAbsolutePath());
+ }
+
+ String directoryPath = dialog.open();
+ if (directoryPath == null) {
+ return;
+ }
+
+ saveInitialDirectory(directoryPath);
+
+ final File directory = new File(directoryPath);
+ if (!directory.exists()) {
+ MessageDialog.openError(WorkbenchUtil.getShell(), Messages.SaveAttachmentsAction_directoryDoesntExist,
+ NLS.bind(Messages.SaveAttachmentsAction_directoryDoesntExist0, directoryPath));
+ return;
+ }
+
+ for (ITaskAttachment attachment : attachments) {
+ String filename = getAttachmentFilename(attachment);
+ File file = getTargetFile(WorkbenchUtil.getShell(), directory, filename);
+ if (file != null) {
+ DownloadAttachmentJob job = new DownloadAttachmentJob(attachment, file);
+ job.setUser(true);
+ job.schedule();
+ }
+ }
+ }
+
+ private File getTargetFile(Shell shell, File directory, String filename) {
+ File attachFile = new File(directory, filename);
+ while (true) {
+ if (!attachFile.exists()) {
+ return attachFile;
+ }
+
+ boolean overwrite = MessageDialog.openQuestion(shell, NLS.bind(
+ Messages.SaveAttachmentsAction_overwriteFile0, attachFile.getName()), NLS.bind(
+ Messages.SaveAttachmentsAction_fileExists_doYouWantToOverwrite0, attachFile.getAbsolutePath()));
+ if (overwrite) {
+ return attachFile;
+ }
+
+ FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
+ fileDialog.setFilterPath(directory.getAbsolutePath());
+ fileDialog.setFileName(attachFile.getName());
+
+ filename = fileDialog.open();
+ if (filename == null) {
+ return null;
+ }
+
+ attachFile = new File(filename);
+ }
+ }
+
+ private String getAttachmentFilename(ITaskAttachment attachment) {
+ String fname = attachment.getFileName();
+ // default name if none is found
+ if (fname.equals("")) { //$NON-NLS-1$
+ String ctype = attachment.getContentType();
+ if (ctype.endsWith(CTYPE_HTML)) {
+ fname = ATTACHMENT_DEFAULT_NAME + ".html"; //$NON-NLS-1$
+ } else if (ctype.startsWith(CTYPE_TEXT)) {
+ fname = ATTACHMENT_DEFAULT_NAME + ".txt"; //$NON-NLS-1$
+ } else if (ctype.endsWith(CTYPE_OCTET_STREAM)) {
+ fname = ATTACHMENT_DEFAULT_NAME;
+ } else if (ctype.endsWith(CTYPE_ZIP)) {
+ fname = ATTACHMENT_DEFAULT_NAME + "." + CTYPE_ZIP; //$NON-NLS-1$
+ } else {
+ fname = ATTACHMENT_DEFAULT_NAME + "." + ctype.substring(ctype.indexOf("/") + 1); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ return fname;
+ }
+
+ private File getInitialDirectory() {
+ String dirName = TasksUiPlugin.getDefault().getPreferenceStore().getString(
+ ITasksUiPreferenceConstants.DEFAULT_ATTACHMENTS_DIRECTORY);
+
+ if (dirName == null || dirName.trim().length() == 0) {
+ return null;
+ }
+
+ File dirFile = new File(dirName).getAbsoluteFile();
+
+ // if file
+ while (dirFile != null && !dirFile.exists()) {
+ dirFile = dirFile.getParentFile();
+ }
+
+ return dirFile;
+ }
+
+ private void saveInitialDirectory(String directory) {
+ TasksUiPlugin.getDefault().getPreferenceStore().putValue(
+ ITasksUiPreferenceConstants.DEFAULT_ATTACHMENTS_DIRECTORY, directory);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java
new file mode 100644
index 0000000..24fbc9c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SearchForRepositoryTask.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
+import org.eclipse.search.internal.ui.SearchDialog;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class SearchForRepositoryTask extends Action implements IWorkbenchWindowActionDelegate, IViewActionDelegate {
+
+ public void run(IAction action) {
+ new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open();
+ }
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public void init(IViewPart view) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowInSearchViewAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowInSearchViewAction.java
new file mode 100644
index 0000000..dd2c148
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowInSearchViewAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ShowInSearchViewAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.open.browser"; //$NON-NLS-1$
+
+ public ShowInSearchViewAction() {
+ super(Messages.ShowInSearchViewAction_Open_in_Search_Label);
+ setId(ID);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void run() {
+ if (super.getStructuredSelection() != null) {
+ for (Iterator iter = super.getStructuredSelection().iterator(); iter.hasNext();) {
+ runWithSelection(iter.next());
+ }
+ }
+ }
+
+ private void runWithSelection(Object selectedObject) {
+ if (selectedObject instanceof IRepositoryQuery) {
+ IRepositoryQuery query = (IRepositoryQuery) selectedObject;
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ query.getConnectorKind());
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(),
+ query.getRepositoryUrl());
+ if (connector != null) {
+ SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(), taskRepository,
+ query);
+ NewSearchUI.runQueryInBackground(collector);
+ }
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ return selection.size() == 1 && selection.getFirstElement() instanceof IRepositoryQuery;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowInTaskListAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowInTaskListAction.java
new file mode 100644
index 0000000..ea90e0e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowInTaskListAction.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class ShowInTaskListAction extends BaseSelectionListenerAction {
+
+ public ShowInTaskListAction() {
+ super(Messages.ShowInTaskListAction_Show_In_Task_List);
+ }
+
+ @Override
+ public void run() {
+ IStructuredSelection selection = getStructuredSelection();
+ if (!selection.isEmpty()) {
+ Object element = selection.getFirstElement();
+ if (element instanceof ITask) {
+ TasksUiUtil.openTasksViewInActivePerspective();
+ TaskListView.getFromActivePerspective().selectedAndFocusTask((ITask) element);
+ }
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ return selection.size() == 1 && selection.getFirstElement() instanceof ITask;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowTaskRepositoriesViewAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowTaskRepositoriesViewAction.java
new file mode 100644
index 0000000..dde0dc1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowTaskRepositoriesViewAction.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class ShowTaskRepositoriesViewAction implements IViewActionDelegate {
+
+ public void init(IViewPart view) {
+ }
+
+ public void run(IAction action) {
+ TaskRepositoriesView.openInActivePerspective();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowTasksUiLegendAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowTasksUiLegendAction.java
new file mode 100644
index 0000000..26890c3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ShowTasksUiLegendAction.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.ui.dialogs.UiLegendDialog;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.intro.IIntroManager;
+import org.eclipse.ui.intro.IIntroPart;
+
+/**
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ */
+public class ShowTasksUiLegendAction implements IWorkbenchWindowActionDelegate, IViewActionDelegate {
+
+ private IWorkbenchWindow wbWindow;
+
+ public void dispose() {
+ // ignore
+ }
+
+ public void init(IWorkbenchWindow window) {
+ wbWindow = window;
+ }
+
+ public void run(IAction action) {
+ IIntroManager introMgr = wbWindow.getWorkbench().getIntroManager();
+ IIntroPart intro = introMgr.getIntro();
+ if (intro != null) {
+ try {
+ introMgr.setIntroStandby(intro, true);
+ } catch (NullPointerException e) {
+ // bug 270351: ignore exception
+ }
+ }
+
+ TasksUiUtil.openTasksViewInActivePerspective();
+ UiLegendDialog uiLegendDialog = new UiLegendDialog(WorkbenchUtil.getShell());
+ uiLegendDialog.open();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+ public void init(IViewPart view) {
+ wbWindow = view.getViewSite().getWorkbenchWindow();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeAllAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeAllAction.java
new file mode 100644
index 0000000..0dc2f47
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeAllAction.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class SynchronizeAllAction implements IViewActionDelegate {
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ TasksUiInternal.synchronizeAllRepositories(true);
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeAutomaticallyAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeAutomaticallyAction.java
new file mode 100644
index 0000000..a849497
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeAutomaticallyAction.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class SynchronizeAutomaticallyAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.actions.synchronize.background"; //$NON-NLS-1$
+
+ public SynchronizeAutomaticallyAction() {
+ setText(Messages.SynchronizeAutomaticallyAction_Synchronize_Automatically);
+ setToolTipText(Messages.SynchronizeAutomaticallyAction_Synchronize_Automatically);
+ setId(ID);
+ setChecked(TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ }
+
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, isChecked());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeEditorAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeEditorAction.java
new file mode 100644
index 0000000..4e245a2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeEditorAction.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class SynchronizeEditorAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.synchronize.editor"; //$NON-NLS-1$
+
+ public SynchronizeEditorAction() {
+ super(Messages.SynchronizeEditorAction_Synchronize);
+ setToolTipText(Messages.SynchronizeEditorAction_Synchronize_Incoming_Changes);
+ setId(ID);
+ setImageDescriptor(CommonImages.REFRESH_SMALL);
+ // setAccelerator(SWT.MOD1 + 'r');
+ }
+
+ @Override
+ public void run() {
+ IStructuredSelection selection = getStructuredSelection();
+ if (selection == null) {
+ return;
+ }
+ Object selectedObject = selection.getFirstElement();
+ if (!(selectedObject instanceof TaskEditor)) {
+ return;
+ }
+
+ final TaskEditor editor = (TaskEditor) selectedObject;
+ final ITask task = editor.getTaskEditorInput().getTask();
+ if (task == null) {
+ return;
+ }
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ if (connector == null) {
+ return;
+ }
+
+ TasksUiInternal.synchronizeTask(connector, task, true, new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ editor.refreshPages();
+ } finally {
+ if (editor != null) {
+ editor.showBusy(false);
+ }
+ }
+ }
+ });
+ }
+ });
+ if (editor != null) {
+ editor.showBusy(true);
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ Object selectedObject = selection.getFirstElement();
+ if (selectedObject instanceof TaskEditor) {
+ TaskEditor editor = (TaskEditor) selectedObject;
+ ITask task = editor.getTaskEditorInput().getTask();
+ return !(task instanceof LocalTask);
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java
new file mode 100644
index 0000000..7e35e84
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/SynchronizeSelectedAction.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.actions.ActionDelegate;
+import org.eclipse.ui.actions.ActionFactory;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class SynchronizeSelectedAction extends ActionDelegate implements IViewActionDelegate {
+
+ private final Map<AbstractRepositoryConnector, List<RepositoryQuery>> queriesToSyncMap = new LinkedHashMap<AbstractRepositoryConnector, List<RepositoryQuery>>();
+
+ private final Map<AbstractRepositoryConnector, List<ITask>> tasksToSyncMap = new LinkedHashMap<AbstractRepositoryConnector, List<ITask>>();
+
+ @Override
+ public void run(IAction action) {
+
+ if (TaskListView.getFromActivePerspective() != null) {
+
+ ISelection selection = TaskListView.getFromActivePerspective().getViewer().getSelection();
+ for (Object obj : ((IStructuredSelection) selection).toList()) {
+ if (obj instanceof IRepositoryQuery) {
+ final RepositoryQuery repositoryQuery = (RepositoryQuery) obj;
+ AbstractRepositoryConnector client = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repositoryQuery.getConnectorKind());
+ if (client != null) {
+ List<RepositoryQuery> queriesToSync = queriesToSyncMap.get(client);
+ if (queriesToSync == null) {
+ queriesToSync = new ArrayList<RepositoryQuery>();
+ queriesToSyncMap.put(client, queriesToSync);
+ }
+ queriesToSync.add(repositoryQuery);
+ }
+ } else if (obj instanceof TaskCategory) {
+ TaskCategory cat = (TaskCategory) obj;
+ for (ITask task : cat.getChildren()) {
+ AbstractRepositoryConnector client = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ addTaskToSync(client, task);
+ }
+ } else if (obj instanceof ITask) {
+ AbstractTask repositoryTask = (AbstractTask) obj;
+ AbstractRepositoryConnector client = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repositoryTask.getConnectorKind());
+ addTaskToSync(client, repositoryTask);
+ }
+ }
+
+ if (!queriesToSyncMap.isEmpty()) {
+ // determine which repositories to synch changed tasks for
+ HashMap<TaskRepository, Set<RepositoryQuery>> repositoriesToSync = new HashMap<TaskRepository, Set<RepositoryQuery>>();
+ for (AbstractRepositoryConnector connector : queriesToSyncMap.keySet()) {
+ List<RepositoryQuery> queriesToSync = queriesToSyncMap.get(connector);
+ if (queriesToSync == null || queriesToSync.isEmpty()) {
+ continue;
+ }
+
+ for (RepositoryQuery query : queriesToSync) {
+ TaskRepository repos = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(),
+ query.getRepositoryUrl());
+ Set<RepositoryQuery> queries = repositoriesToSync.get(repos);
+ if (queries == null) {
+ queries = new HashSet<RepositoryQuery>();
+ repositoriesToSync.put(repos, queries);
+ }
+ queries.add(query);
+ }
+ }
+
+ for (Map.Entry<TaskRepository, Set<RepositoryQuery>> entry : repositoriesToSync.entrySet()) {
+ TaskRepository repository = entry.getKey();
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ Set<RepositoryQuery> queries = entry.getValue();
+ TasksUiInternal.synchronizeQueries(connector, repository, queries, null, true);
+ }
+ }
+ if (!tasksToSyncMap.isEmpty()) {
+ for (AbstractRepositoryConnector connector : tasksToSyncMap.keySet()) {
+ List<ITask> tasksToSync = tasksToSyncMap.get(connector);
+ if (tasksToSync != null && tasksToSync.size() > 0) {
+ TasksUiInternal.synchronizeTasks(connector, new HashSet<ITask>(tasksToSync), true, null);
+ }
+ }
+ }
+
+ }
+
+ queriesToSyncMap.clear();
+ tasksToSyncMap.clear();
+ }
+
+ private void addTaskToSync(AbstractRepositoryConnector connector, ITask task) {
+ if (connector == null //
+ || task instanceof LocalTask //
+ || task.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) {
+ return;
+ }
+
+ List<ITask> tasksToSync = tasksToSyncMap.get(connector);
+ if (tasksToSync == null) {
+ tasksToSync = new ArrayList<ITask>();
+ tasksToSyncMap.put(connector, tasksToSync);
+ }
+ tasksToSync.add(task);
+ }
+
+ private IAction action;
+
+ @Override
+ public void init(IAction action) {
+ this.action = action;
+ }
+
+ public void init(IViewPart view) {
+ IActionBars actionBars = view.getViewSite().getActionBars();
+ actionBars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), action);
+ actionBars.updateActionBars();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskActivateAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskActivateAction.java
new file mode 100644
index 0000000..737ca27
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskActivateAction.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskActivateAction extends BaseSelectionListenerAction implements IViewActionDelegate {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.context.activate"; //$NON-NLS-1$
+
+ public TaskActivateAction() {
+ super(Messages.TaskActivateAction_Activate);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.CONTEXT_ACTIVE_CENTERED);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ run(TaskListView.getFromActivePerspective().getSelectedTask());
+ }
+
+ @Deprecated
+ public void run(ITask task) {
+ if (task != null && !task.isActive()) {
+ TasksUi.getTaskActivityManager().activateTask(task);
+ }
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ selectionChanged((IStructuredSelection) selection);
+ } else {
+ selectionChanged(StructuredSelection.EMPTY);
+ }
+ action.setEnabled(isEnabled());
+ }
+
+ @Override
+ protected boolean updateSelection(IStructuredSelection selection) {
+ return selection != null && selection.size() == 1 && selection.getFirstElement() instanceof ITask;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskDeactivateAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskDeactivateAction.java
new file mode 100644
index 0000000..e931d7e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskDeactivateAction.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskDeactivateAction extends Action {
+
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.context.deactivate"; //$NON-NLS-1$
+
+ public TaskDeactivateAction() {
+ setId(ID);
+ setText(Messages.TaskDeactivateAction_Deactivate);
+ setImageDescriptor(TasksUiImages.CONTEXT_INACTIVE_EMPTY);
+ }
+
+ @Deprecated
+ public void run(ITask task) {
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ }
+
+ @Override
+ public void run() {
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorActionGroup.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorActionGroup.java
new file mode 100644
index 0000000..e337553
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorActionGroup.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.actions;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchActionSupport;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorActionGroup extends RepositoryElementActionGroup {
+
+ private final WorkbenchActionSupport actionSupport;
+
+ private final SynchronizeEditorAction synchronizeEditorAction = new SynchronizeEditorAction();
+
+ private final NewTaskFromSelectionAction newTaskFromSelectionAction = new NewTaskFromSelectionAction();
+
+ public TaskEditorActionGroup(WorkbenchActionSupport actionSupport) {
+ this.actionSupport = actionSupport;
+ synchronizeEditorAction.setActionDefinitionId("org.eclipse.ui.file.refresh"); //$NON-NLS-1$
+ synchronizeEditorAction.setEnabled(false);
+ }
+
+ public void fillContextMenu(IMenuManager manager, TaskEditor editor, boolean addClipboard) {
+ ITask task = editor.getTaskEditorInput().getTask();
+ SelectionProviderAdapter selectionProvider = new SelectionProviderAdapter();
+ setSelectionProvider(selectionProvider);
+ selectionProvider.setSelection(new StructuredSelection(task));
+
+ super.fillContextMenu(manager);
+
+ if (addClipboard) {
+ addClipboardActions(manager);
+ }
+ synchronizeEditorAction.selectionChanged(new StructuredSelection(editor));
+
+ IStructuredSelection selection = new StructuredSelection(task);
+ actionSupport.updateActions(selection);
+ newTaskFromSelectionAction.selectionChanged(selection);
+
+ manager.add(new Separator());
+ if (synchronizeEditorAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_REPOSITORY, synchronizeEditorAction);
+ }
+ }
+
+ public void addClipboardActions(IMenuManager manager) {
+ //manager.add(actionSupport.getUndoAction());
+ //manager.add(actionSupport.getRedoAction());
+ //manager.add(new Separator());
+ manager.prependToGroup(ID_SEPARATOR_EDIT, actionSupport.getCopyAction());
+ manager.prependToGroup(ID_SEPARATOR_EDIT, actionSupport.getCutAction());
+ manager.appendToGroup(ID_SEPARATOR_EDIT, actionSupport.getPasteAction());
+ manager.appendToGroup(ID_SEPARATOR_EDIT, actionSupport.getSelectAllAction());
+ manager.appendToGroup(ID_SEPARATOR_EDIT, newTaskFromSelectionAction);
+ }
+
+ public SynchronizeEditorAction getSynchronizeEditorAction() {
+ return synchronizeEditorAction;
+ }
+
+ public NewTaskFromSelectionAction getNewTaskFromSelectionAction() {
+ return newTaskFromSelectionAction;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorCopyAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorCopyAction.java
new file mode 100644
index 0000000..afdfbfe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorCopyAction.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+
+/**
+ * TODO: delete?
+ *
+ * @author Mik Kersten
+ */
+public class TaskEditorCopyAction extends Action {
+
+ public TaskEditorCopyAction() {
+ setText("TaskInfoEditor.copy.text"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void run() {
+ // if (editorPart instanceof TaskInfoEditor)
+ // ((TaskInfoEditor)editorPart).getCurrentText().copy();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorScheduleAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorScheduleAction.java
new file mode 100644
index 0000000..159b7fd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskEditorScheduleAction.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Collections;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.ScheduleTaskMenuContributor;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskEditorScheduleAction extends Action implements IMenuCreator {
+
+ private final ITask task;
+
+ private MenuManager menuManager;
+
+ private final ScheduleTaskMenuContributor scheduleMenuContributor = new ScheduleTaskMenuContributor();
+
+ public TaskEditorScheduleAction(ITask task) {
+ this.task = task;
+ this.setImageDescriptor(CommonImages.SCHEDULE_DAY);
+ setMenuCreator(this);
+ setToolTipText(Messages.TaskEditorScheduleAction_Private_Scheduling);
+ }
+
+ @Override
+ public void run() {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor((AbstractTask) task,
+ TaskActivityUtil.getCurrentWeek().getToday());
+ }
+
+ public Menu getMenu(Control parent) {
+ if (menuManager != null) {
+ menuManager.dispose();
+ }
+ menuManager = scheduleMenuContributor.getSubMenuManager(Collections.singletonList((IRepositoryElement) task));
+ menuManager.createContextMenu(parent);
+ return menuManager.getMenu();
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (menuManager != null) {
+ return menuManager.getMenu();
+ }
+ return null;
+ }
+
+ public void dispose() {
+ if (menuManager != null) {
+ menuManager.dispose();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskListSortAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskListSortAction.java
new file mode 100644
index 0000000..0d6ee8f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskListSortAction.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.ui.dialogs.TaskListSortDialog;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.ui.IWorkbenchPartSite;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListSortAction extends Action {
+
+ private final TaskListSortDialog dialog;
+
+ private final TaskListView taskListView;
+
+ public TaskListSortAction(IWorkbenchPartSite site, TaskListView taskListView) {
+ super(Messages.TaskListSortAction_Sort_);
+ this.taskListView = taskListView;
+ setEnabled(true);
+ dialog = new TaskListSortDialog(site, taskListView);
+ }
+
+ @Override
+ public void run() {
+ if (dialog.open() == Window.OK) {
+ taskListView.getViewer().refresh();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskListViewActionGroup.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskListViewActionGroup.java
new file mode 100644
index 0000000..d86b433
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskListViewActionGroup.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.actions;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.ui.part.DrillDownAdapter;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskListViewActionGroup extends RepositoryElementActionGroup {
+
+ private final RenameAction renameAction;
+
+ private final TaskListView view;
+
+ private final GoIntoAction goIntoAction;
+
+ private final GoUpAction goUpAction;
+
+ private final DrillDownAdapter drillDownAdapter;
+
+ public TaskListViewActionGroup(TaskListView view, DrillDownAdapter drillDownAdapter) {
+ this.view = view;
+ this.drillDownAdapter = drillDownAdapter;
+
+ goIntoAction = new GoIntoAction();
+ goUpAction = new GoUpAction(drillDownAdapter);
+ renameAction = new RenameAction(view);
+ view.getViewer().addSelectionChangedListener(renameAction);
+
+ setSelectionProvider(view.getViewer());
+ }
+
+ public void updateDrillDownActions() {
+ if (drillDownAdapter.canGoBack()) {
+ goUpAction.setEnabled(true);
+ } else {
+ goUpAction.setEnabled(false);
+ }
+ }
+
+ @Override
+ public void fillContextMenu(final IMenuManager manager) {
+ super.fillContextMenu(manager);
+
+ updateDrillDownActions();
+
+ Object element = ((IStructuredSelection) view.getViewer().getSelection()).getFirstElement();
+ if (element instanceof ITaskContainer && !(element instanceof ITask)) {
+ ITaskContainer cat = (ITaskContainer) element;
+ if (cat.getChildren().size() > 0) {
+ goIntoAction.setEnabled(true);
+ } else {
+ goIntoAction.setEnabled(false);
+ }
+ } else {
+ goIntoAction.setEnabled(false);
+ }
+ if (goIntoAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_NAVIGATE, goIntoAction);
+ }
+ if (goUpAction.isEnabled()) {
+ manager.appendToGroup(ID_SEPARATOR_NAVIGATE, goUpAction);
+ }
+ if (!(element instanceof ITask) && renameAction.isEnabled() && element != null) {
+ manager.appendToGroup(ID_SEPARATOR_EDIT, renameAction);
+ }
+ }
+
+ public GoUpAction getGoUpAction() {
+ return goUpAction;
+ }
+
+ public GoIntoAction getGoIntoAction() {
+ return goIntoAction;
+ }
+
+ public RenameAction getRenameAction() {
+ return renameAction;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java
new file mode 100644
index 0000000..153c3f3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialog.java
@@ -0,0 +1,741 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+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.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskDetailLabelProvider;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListFilteredTree;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.WorkingSetLabelComparator;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.search.internal.ui.SearchDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
+import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
+import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
+import org.eclipse.ui.dialogs.SearchPattern;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * @author Willian Mitsuda
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ * @author Shawn Minto
+ */
+public class TaskSelectionDialog extends FilteredItemsSelectionDialog {
+
+ private class DeselectWorkingSetAction extends Action {
+
+ public DeselectWorkingSetAction() {
+ super(Messages.TaskSelectionDialog_Deselect_Working_Set, IAction.AS_PUSH_BUTTON);
+ }
+
+ @Override
+ public void run() {
+ setSelectedWorkingSet(null);
+ }
+ }
+
+ private class EditWorkingSetAction extends Action {
+
+ public EditWorkingSetAction() {
+ super(Messages.TaskSelectionDialog_Edit_Active_Working_Set_, IAction.AS_PUSH_BUTTON);
+ }
+
+ @Override
+ public void run() {
+ IWorkingSetEditWizard wizard = PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetEditWizard(
+ selectedWorkingSet);
+ if (wizard != null) {
+ WizardDialog dlg = new WizardDialog(getShell(), wizard);
+ dlg.open();
+ }
+ }
+ }
+
+ private class FilterWorkingSetAction extends Action {
+
+ private final IWorkingSet workingSet;
+
+ public FilterWorkingSetAction(IWorkingSet workingSet, int shortcutKeyNumber) {
+ super("", IAction.AS_RADIO_BUTTON); //$NON-NLS-1$
+ this.workingSet = workingSet;
+ if (shortcutKeyNumber >= 1 && shortcutKeyNumber <= 9) {
+ setText("&" + String.valueOf(shortcutKeyNumber) + " " + workingSet.getLabel()); //$NON-NLS-1$ //$NON-NLS-2$
+ } else {
+ setText(workingSet.getLabel());
+ }
+ setImageDescriptor(workingSet.getImageDescriptor());
+ }
+
+ @Override
+ public void run() {
+ setSelectedWorkingSet(workingSet);
+ }
+ }
+
+ private class SelectWorkingSetAction extends Action {
+
+ public SelectWorkingSetAction() {
+ super(Messages.TaskSelectionDialog_Select_Working_Set_, IAction.AS_PUSH_BUTTON);
+ }
+
+ @Override
+ public void run() {
+ IWorkingSetSelectionDialog dlg = PlatformUI.getWorkbench()
+ .getWorkingSetManager()
+ .createWorkingSetSelectionDialog(getShell(), false,
+ new String[] { TaskWorkingSetUpdater.ID_TASK_WORKING_SET });
+ if (selectedWorkingSet != null) {
+ dlg.setSelection(new IWorkingSet[] { selectedWorkingSet });
+ }
+ if (dlg.open() == Window.OK) {
+ IWorkingSet[] selection = dlg.getSelection();
+ if (selection.length == 0) {
+ setSelectedWorkingSet(null);
+ } else {
+ setSelectedWorkingSet(selection[0]);
+ }
+ }
+ }
+ }
+
+ private class ShowCompletedTasksAction extends Action {
+
+ public ShowCompletedTasksAction() {
+ super(Messages.TaskSelectionDialog_Show_Completed_Tasks, IAction.AS_CHECK_BOX);
+ }
+
+ @Override
+ public void run() {
+ showCompletedTasks = isChecked();
+ applyFilter();
+ }
+
+ }
+
+ private class TaskHistoryItemsComparator implements Comparator<Object> {
+
+ Map<AbstractTask, Integer> positionByTask = new HashMap<AbstractTask, Integer>();
+
+ public TaskHistoryItemsComparator(List<AbstractTask> history) {
+ for (int i = 0; i < history.size(); i++) {
+ positionByTask.put(history.get(i), i);
+ }
+ }
+
+ public int compare(Object o1, Object o2) {
+ Integer p1 = positionByTask.get(o1);
+ Integer p2 = positionByTask.get(o2);
+ if (p1 != null && p2 != null) {
+ return p2.compareTo(p1);
+ }
+ return labelProvider.getText(o1).compareTo(labelProvider.getText(o2));
+ }
+
+ }
+
+ /**
+ * Integrates {@link FilteredItemsSelectionDialog} history management with Mylyn's task list activation history
+ * <p>
+ * Due to {@link SelectionHistory} use of memento-based history storage, many methods are overridden
+ */
+ private class TaskSelectionHistory extends SelectionHistory {
+
+ @Override
+ public synchronized void accessed(Object object) {
+ // ignore, handled by TaskActivationHistory
+ }
+
+ @Override
+ public synchronized boolean contains(Object object) {
+ return history.contains(object);
+ }
+
+ @Override
+ public synchronized Object[] getHistoryItems() {
+ return history.toArray();
+ }
+
+ @Override
+ public synchronized boolean isEmpty() {
+ return history.isEmpty();
+ }
+
+ @Override
+ public void load(IMemento memento) {
+ // do nothing because tasklist history handles this
+ }
+
+ @Override
+ public synchronized boolean remove(Object object) {
+ taskActivationHistory.removeTask((ITask) object);
+ return history.remove(object);
+ }
+
+ @Override
+ protected Object restoreItemFromMemento(IMemento memento) {
+ // do nothing because tasklist history handles this
+ return null;
+ }
+
+ @Override
+ public void save(IMemento memento) {
+ // do nothing because tasklist history handles this
+ }
+
+ @Override
+ protected void storeItemToMemento(Object item, IMemento memento) {
+ // do nothing because tasklist history handles this
+ }
+ }
+
+ /**
+ * Supports filtering of completed tasks.
+ */
+ private class TasksFilter extends ItemsFilter {
+
+ private Set<ITask> allTasksFromWorkingSets;
+
+ /**
+ * Stores the task containers from selected working set; empty, which can come from no working set selection or
+ * working set with no task containers selected, means no filtering
+ */
+ private final Set<AbstractTaskContainer> elements;
+
+ private final boolean showCompletedTasks;
+
+ public TasksFilter(boolean showCompletedTasks, IWorkingSet selectedWorkingSet) {
+ super(new SearchPattern());
+ // Little hack to force always a match inside any part of task text
+ patternMatcher.setPattern("*" + patternMatcher.getPattern()); //$NON-NLS-1$
+ this.showCompletedTasks = showCompletedTasks;
+
+ elements = new HashSet<AbstractTaskContainer>();
+ if (selectedWorkingSet != null) {
+ for (IAdaptable adaptable : selectedWorkingSet.getElements()) {
+ AbstractTaskContainer container = (AbstractTaskContainer) adaptable.getAdapter(AbstractTaskContainer.class);
+ if (container != null) {
+ elements.add(container);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean equalsFilter(ItemsFilter filter) {
+ if (!super.equalsFilter(filter)) {
+ return false;
+ }
+ if (filter instanceof TasksFilter) {
+ TasksFilter tasksFilter = (TasksFilter) filter;
+ if (showCompletedTasks != tasksFilter.showCompletedTasks) {
+ return false;
+ }
+ return elements.equals(tasksFilter.elements);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isConsistentItem(Object item) {
+ return item instanceof ITask;
+ }
+
+ @Override
+ public boolean isSubFilter(ItemsFilter filter) {
+ if (!super.isSubFilter(filter)) {
+ return false;
+ }
+ if (filter instanceof TasksFilter) {
+ TasksFilter tasksFilter = (TasksFilter) filter;
+ if (!showCompletedTasks && tasksFilter.showCompletedTasks) {
+ return false;
+ }
+ if (elements.isEmpty()) {
+ return true;
+ }
+ if (tasksFilter.elements.isEmpty()) {
+ return false;
+ }
+ return elements.containsAll(tasksFilter.elements);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean matchItem(Object item) {
+ if (!(item instanceof ITask)) {
+ return false;
+ }
+ if (!showCompletedTasks && ((ITask) item).isCompleted()) {
+ return false;
+ }
+ if (!elements.isEmpty()) {
+ if (allTasksFromWorkingSets == null) {
+ populateTasksFromWorkingSets();
+ }
+ if (!allTasksFromWorkingSets.contains(item)) {
+ return false;
+ }
+ }
+ return matches(labelProvider.getText(item));
+ }
+
+ private void populateTasksFromWorkingSets() {
+ allTasksFromWorkingSets = new HashSet<ITask>(1000);
+ for (ITaskContainer container : elements) {
+ allTasksFromWorkingSets.addAll(container.getChildren());
+ }
+ }
+ }
+
+ private static final int SEARCH_ID = IDialogConstants.CLIENT_ID + 1;
+
+ private static final int CREATE_ID = SEARCH_ID + 1;
+
+ private static final String IS_USING_WINDOW_WORKING_SET_SETTING = "IsUsingWindowWorkingSet"; //$NON-NLS-1$
+
+ private static final String OPEN_IN_BROWSER_SETTING = "OpenInBrowser"; //$NON-NLS-1$
+
+ private static final String SHOW_COMPLETED_TASKS_SETTING = "ShowCompletedTasks"; //$NON-NLS-1$
+
+ private static final String TASK_SELECTION_DIALOG_SECTION = "TaskSelectionDialogSection"; //$NON-NLS-1$
+
+ private static final String WORKING_SET_NAME_SETTING = "WorkingSetName"; //$NON-NLS-1$
+
+ /**
+ * Caches all tasks; populated at first access
+ */
+ private Set<AbstractTask> allTasks;
+
+ private Button createTaskButton;
+
+ /**
+ * Mylyn's task activation history
+ */
+ private final LinkedHashSet<AbstractTask> history;
+
+ private final TaskHistoryItemsComparator itemsComparator;
+
+ private final TaskElementLabelProvider labelProvider;
+
+ private boolean needsCreateTask;
+
+ private boolean openInBrowser;
+
+ private Button openInBrowserCheck;
+
+ /**
+ * Set of filtered working sets
+ */
+ private IWorkingSet selectedWorkingSet;
+
+ private boolean showCompletedTasks;
+
+ private final ShowCompletedTasksAction showCompletedTasksAction;
+
+ private boolean showExtendedOpeningOptions;
+
+ /**
+ * Caches the window working set
+ */
+ private final IWorkingSet windowWorkingSet;
+
+ /**
+ * Refilters if the current working set content has changed
+ */
+ private final IPropertyChangeListener workingSetListener = new IPropertyChangeListener() {
+
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE)) {
+ if (event.getNewValue().equals(selectedWorkingSet)) {
+ applyFilter();
+ }
+ }
+ }
+
+ };
+
+ private final TaskActivationHistory taskActivationHistory;
+
+ public TaskSelectionDialog(Shell parent) {
+ super(parent);
+ this.taskActivationHistory = TasksUiPlugin.getTaskActivityManager().getTaskActivationHistory();
+ this.history = new LinkedHashSet<AbstractTask>(taskActivationHistory.getPreviousTasks());
+ this.itemsComparator = new TaskHistoryItemsComparator(new ArrayList<AbstractTask>(history));
+ this.needsCreateTask = true;
+ this.labelProvider = new TaskElementLabelProvider(false);
+ this.showCompletedTasksAction = new ShowCompletedTasksAction();
+
+ setSelectionHistory(new TaskSelectionHistory());
+ setListLabelProvider(labelProvider);
+
+// setListLabelProvider(new DecoratingLabelProvider(labelProvider, PlatformUI.getWorkbench()
+// .getDecoratorManager()
+// .getLabelDecorator()));
+ setDetailsLabelProvider(new TaskDetailLabelProvider());
+ setSeparatorLabel(TaskListView.LABEL_VIEW + Messages.TaskSelectionDialog__matches);
+
+ // If there is a text selection, use it as the initial filter
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ ISelection selection = window.getSelectionService().getSelection();
+ if (selection instanceof ITextSelection) {
+ // Get only get first line
+ String text = ((ITextSelection) selection).getText();
+ int n = text.indexOf('\n');
+ if (n > -1) {
+ text.substring(0, n);
+ }
+ setInitialPattern(text);
+ }
+
+ windowWorkingSet = window.getActivePage().getAggregateWorkingSet();
+ selectedWorkingSet = windowWorkingSet;
+
+ PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(workingSetListener);
+ }
+
+ @Override
+ public boolean close() {
+ PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(workingSetListener);
+ if (openInBrowserCheck != null) {
+ openInBrowser = openInBrowserCheck.getSelection();
+ }
+ return super.close();
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 0; // create
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // create help control if needed
+ if (isHelpAvailable()) {
+ createHelpControl(composite);
+ }
+ if (needsCreateTask) {
+ createTaskButton = createButton(composite, CREATE_ID, Messages.TaskSelectionDialog_New_Task_, true);
+ createTaskButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ close();
+ new NewTaskAction().run();
+ }
+ });
+ }
+
+ createAdditionalButtons(composite);
+
+ Label filler = new Label(composite, SWT.NONE);
+ filler.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+ layout.numColumns++;
+ super.createButtonsForButtonBar(composite); // cancel button
+
+ return composite;
+ }
+
+ /**
+ * Allows to add new buttons at the bottom of this dialog next to New Task button
+ *
+ * @param parent
+ * the parent composite to contain the button bar
+ */
+ protected void createAdditionalButtons(Composite parent) {
+ // we don't want to add any new button
+ }
+
+ @Override
+ protected Control createExtendedContentArea(Composite parent) {
+ if (!showExtendedOpeningOptions) {
+ return null;
+ }
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(GridLayoutFactory.swtDefaults().margins(0, 5).create());
+ composite.setLayoutData(GridDataFactory.fillDefaults().create());
+
+ openInBrowserCheck = new Button(composite, SWT.CHECK);
+ openInBrowserCheck.setText(Messages.TaskSelectionDialog_Open_with_Browser);
+ openInBrowserCheck.setSelection(openInBrowser);
+
+ ImageHyperlink openHyperlink = new ImageHyperlink(composite, SWT.NONE);
+ openHyperlink.setText(TaskListFilteredTree.LABEL_SEARCH);
+ openHyperlink.setForeground(CommonColors.HYPERLINK_WIDGET);
+ openHyperlink.setUnderlined(true);
+ openHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ getShell().close();
+ new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open();
+ }
+
+ });
+
+ return composite;
+ }
+
+ @Override
+ protected ItemsFilter createFilter() {
+ return new TasksFilter(showCompletedTasks, selectedWorkingSet);
+ }
+
+ @Override
+ protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter,
+ IProgressMonitor progressMonitor) throws CoreException {
+ progressMonitor.beginTask(Messages.TaskSelectionDialog_Search_for_tasks, 100);
+
+ if (allTasks == null) {
+ allTasks = new HashSet<AbstractTask>();
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ allTasks.addAll(taskList.getAllTasks());
+ }
+ progressMonitor.worked(10);
+
+ SubProgressMonitor subMonitor = new SubProgressMonitor(progressMonitor, 90);
+ subMonitor.beginTask(Messages.TaskSelectionDialog_Scanning_tasks, allTasks.size());
+ for (ITask task : allTasks) {
+ contentProvider.add(task, itemsFilter);
+ subMonitor.worked(1);
+ }
+ subMonitor.done();
+
+ progressMonitor.done();
+ }
+
+ @Override
+ protected void fillViewMenu(IMenuManager menuManager) {
+ super.fillViewMenu(menuManager);
+ menuManager.add(showCompletedTasksAction);
+ menuManager.add(new Separator());
+
+ // Fill existing tasks working sets
+ menuManager.add(new SelectWorkingSetAction());
+ final DeselectWorkingSetAction deselectAction = new DeselectWorkingSetAction();
+ menuManager.add(deselectAction);
+ final EditWorkingSetAction editAction = new EditWorkingSetAction();
+ menuManager.add(editAction);
+ menuManager.add(new Separator("lruActions")); //$NON-NLS-1$
+ final FilterWorkingSetAction windowWorkingSetAction = new FilterWorkingSetAction(windowWorkingSet, 1);
+ menuManager.add(windowWorkingSetAction);
+
+ menuManager.addMenuListener(new IMenuListener() {
+
+ private final List<ActionContributionItem> lruActions = new ArrayList<ActionContributionItem>();
+
+ public void menuAboutToShow(IMenuManager manager) {
+ deselectAction.setEnabled(selectedWorkingSet != null);
+ editAction.setEnabled(selectedWorkingSet != null && selectedWorkingSet.isEditable());
+
+ // Remove previous LRU actions
+ for (ActionContributionItem action : lruActions) {
+ manager.remove(action);
+ }
+ lruActions.clear();
+
+ // Adds actual LRU actions
+ IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getRecentWorkingSets();
+ Arrays.sort(workingSets, new WorkingSetLabelComparator());
+ int count = 2;
+ for (IWorkingSet workingSet : workingSets) {
+ if (workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ IAction action = new FilterWorkingSetAction(workingSet, count++);
+ if (workingSet.equals(selectedWorkingSet)) {
+ action.setChecked(true);
+ }
+ ActionContributionItem ci = new ActionContributionItem(action);
+ lruActions.add(ci);
+ manager.appendToGroup("lruActions", ci); //$NON-NLS-1$
+ }
+ }
+ windowWorkingSetAction.setChecked(windowWorkingSet.equals(selectedWorkingSet));
+ }
+
+ });
+ }
+
+ @Override
+ protected IDialogSettings getDialogSettings() {
+ IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings section = settings.getSection(TASK_SELECTION_DIALOG_SECTION);
+ if (section == null) {
+ section = settings.addNewSection(TASK_SELECTION_DIALOG_SECTION);
+ section.put(OPEN_IN_BROWSER_SETTING, false);
+ section.put(SHOW_COMPLETED_TASKS_SETTING, true);
+ section.put(IS_USING_WINDOW_WORKING_SET_SETTING, true);
+ section.put(WORKING_SET_NAME_SETTING, ""); //$NON-NLS-1$
+ }
+ return section;
+ }
+
+ @Override
+ public String getElementName(Object item) {
+ return labelProvider.getText(item);
+ }
+
+ /**
+ * Sort tasks by summary
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ protected Comparator getItemsComparator() {
+ return itemsComparator;
+ }
+
+ public boolean getOpenInBrowser() {
+ return openInBrowser;
+ }
+
+ public boolean getShowExtendedOpeningOptions() {
+ return showExtendedOpeningOptions;
+ }
+
+ public boolean needsCreateTask() {
+ return needsCreateTask;
+ }
+
+ @Override
+ protected void restoreDialog(IDialogSettings settings) {
+ openInBrowser = settings.getBoolean(OPEN_IN_BROWSER_SETTING);
+ showCompletedTasks = settings.getBoolean(SHOW_COMPLETED_TASKS_SETTING);
+ showCompletedTasksAction.setChecked(showCompletedTasks);
+ boolean isUsingWindowWorkingSet = settings.getBoolean(IS_USING_WINDOW_WORKING_SET_SETTING);
+ if (isUsingWindowWorkingSet) {
+ selectedWorkingSet = windowWorkingSet;
+ } else {
+ String workingSetName = settings.get(WORKING_SET_NAME_SETTING);
+ if (workingSetName != null) {
+ selectedWorkingSet = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(workingSetName);
+ }
+ }
+ super.restoreDialog(settings);
+ }
+
+ public void setNeedsCreateTask(boolean value) {
+ needsCreateTask = value;
+ }
+
+ public void setOpenInBrowser(boolean openInBrowser) {
+ this.openInBrowser = openInBrowser;
+ }
+
+ /**
+ * All working set filter changes should be made through this method; ensures proper history handling and triggers
+ * refiltering
+ */
+ private void setSelectedWorkingSet(IWorkingSet workingSet) {
+ selectedWorkingSet = workingSet;
+ if (workingSet != null) {
+ PlatformUI.getWorkbench().getWorkingSetManager().addRecentWorkingSet(workingSet);
+ }
+ applyFilter();
+ }
+
+ public void setShowExtendedOpeningOptions(boolean showExtendedOpeningOptions) {
+ this.showExtendedOpeningOptions = showExtendedOpeningOptions;
+ }
+
+ @Override
+ protected void storeDialog(IDialogSettings settings) {
+ settings.put(OPEN_IN_BROWSER_SETTING, openInBrowser);
+ settings.put(SHOW_COMPLETED_TASKS_SETTING, showCompletedTasks);
+ settings.put(IS_USING_WINDOW_WORKING_SET_SETTING, selectedWorkingSet == windowWorkingSet);
+ if (selectedWorkingSet == null) {
+ settings.put(WORKING_SET_NAME_SETTING, ""); //$NON-NLS-1$
+ } else {
+ settings.put(WORKING_SET_NAME_SETTING, selectedWorkingSet.getName());
+ }
+ super.storeDialog(settings);
+ }
+
+ @Override
+ protected IStatus validateItem(Object item) {
+ if (item instanceof ITask) {
+ return Status.OK_STATUS;
+ }
+ return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.TaskSelectionDialog_Selected_item_is_not_a_task);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialogWithRandom.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialogWithRandom.java
new file mode 100644
index 0000000..e33857b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskSelectionDialogWithRandom.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Jakub Jurkiewicz
+ * @author Mik Kersten
+ */
+public class TaskSelectionDialogWithRandom extends TaskSelectionDialog {
+
+ private static final int RANDOM_ID = IDialogConstants.CLIENT_ID + 1;
+
+ private Button randomTaskButton;
+
+ private boolean activateTask = false;
+
+ public TaskSelectionDialogWithRandom(Shell parent) {
+ super(parent);
+ }
+
+ @Override
+ protected void createAdditionalButtons(Composite parent) {
+
+ randomTaskButton = createButton(parent, RANDOM_ID, Messages.TaskSelectionDialog_Random_Task, false);
+ randomTaskButton.setToolTipText(Messages.TaskSelectionDialogWithRandom_Feeling_Lazy_Tooltip);
+ randomTaskButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent se) {
+
+ try {
+ Set<ITask> selectedTasks = new HashSet<ITask>();
+ Set<ITask> allScheduled = ((TaskActivityManager) TasksUi.getTaskActivityManager()).getAllScheduledTasks();
+ if (!allScheduled.isEmpty()) {
+ selectedTasks.addAll(allScheduled);
+ } else {
+ selectedTasks.addAll(TasksUiPlugin.getTaskList().getAllTasks());
+ }
+
+ Set<ITask> potentialTasks = new HashSet<ITask>();
+ addLowEnergyTasks(selectedTasks, potentialTasks, PriorityLevel.P5);
+ addLowEnergyTasks(selectedTasks, potentialTasks, PriorityLevel.P4);
+
+ if (potentialTasks.isEmpty()) {
+ addLowEnergyTasks(selectedTasks, potentialTasks, PriorityLevel.P3);
+ }
+ if (potentialTasks.isEmpty()) {
+ addLowEnergyTasks(selectedTasks, potentialTasks, PriorityLevel.P2);
+ }
+
+ int randomTaskIndex = new Random().nextInt(potentialTasks.size());
+ ITask randomTask = potentialTasks.toArray(new ITask[potentialTasks.size()])[randomTaskIndex];
+
+ if (activateTask) {
+ TasksUi.getTaskActivityManager().activateTask(randomTask);
+ }
+ TasksUiInternal.refreshAndOpenTaskListElement(randomTask);
+ close();
+ } catch (Exception e) {
+ MessageDialog.openInformation(Display.getDefault().getActiveShell(),
+ Messages.TaskSelectionDialogWithRandom_Feeling_Lazy_Error_Title,
+ Messages.TaskSelectionDialogWithRandom_Feeling_Lazy_Error);
+ }
+ }
+
+ private void addLowEnergyTasks(Set<ITask> selectedTasks, Set<ITask> potentialTasks,
+ PriorityLevel priorityLevel) {
+ for (ITask task : selectedTasks) {
+ if (task.getSynchronizationState().isSynchronized() && !task.isCompleted()) {
+ if (priorityLevel.toString().equals(task.getPriority())) {
+ potentialTasks.add(task);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ public boolean isActivateTask() {
+ return activateTask;
+ }
+
+ public void setActivateTask(boolean activateTask) {
+ this.activateTask = activateTask;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskWorkingSetAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskWorkingSetAction.java
new file mode 100644
index 0000000..59b9ab8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/TaskWorkingSetAction.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.tasks.ui.dialogs.AbstractWorkingSetDialogCOPY;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
+import org.eclipse.ui.internal.WorkbenchPlugin;
+import org.eclipse.ui.internal.WorkingSetComparator;
+import org.eclipse.ui.internal.dialogs.WorkingSetFilter;
+import org.eclipse.ui.internal.dialogs.WorkingSetLabelProvider;
+
+/**
+ * Derived from SelectWorkingSetsAction
+ *
+ * @author Leo Dos Santos
+ * @author Mik Kersten
+ */
+public class TaskWorkingSetAction extends Action implements IMenuCreator {
+
+ public static final String LABEL_SETS_NONE = Messages.TaskWorkingSetAction_All;
+
+ private Menu dropDownMenu;
+
+ public TaskWorkingSetAction() {
+ setText(Messages.TaskWorkingSetAction_Sets);
+ setToolTipText(Messages.TaskWorkingSetAction_Select_and_Edit_Working_Sets);
+ setImageDescriptor(TasksUiImages.TASK_WORKING_SET);
+ setEnabled(true);
+ setMenuCreator(this);
+ }
+
+ public void dispose() {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ dropDownMenu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void addActionsToMenu() {
+ IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
+
+ if (doTaskWorkingSetsExist()) {
+ ActionContributionItem itemAll = new ActionContributionItem(new ToggleAllWorkingSetsAction());
+// ActionContributionItem itemNone = new ActionContributionItem(new ToggleNoWorkingSetsAction());
+
+ List<IWorkingSet> sortedWorkingSets = Arrays.asList(workingSets);
+ Collections.sort(sortedWorkingSets, new WorkingSetComparator());
+
+ Iterator<IWorkingSet> iter = sortedWorkingSets.iterator();
+ while (iter.hasNext()) {
+ IWorkingSet workingSet = iter.next();
+ if (workingSet != null
+ && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ ActionContributionItem itemSet = new ActionContributionItem(new ToggleWorkingSetAction(workingSet));
+ itemSet.fill(dropDownMenu, -1);
+ }
+ }
+
+ Separator separator = new Separator();
+ separator.fill(dropDownMenu, -1);
+ itemAll.fill(dropDownMenu, -1);
+ }
+
+ ActionContributionItem editItem = new ActionContributionItem(new ManageWorkingSetsAction());
+ editItem.fill(dropDownMenu, -1);
+ }
+
+ private boolean doTaskWorkingSetsExist() {
+ IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
+ for (IWorkingSet workingSet : workingSets) {
+ if (workingSet != null && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void run() {
+ String[] ids = new String[1];
+ ids[0] = TaskWorkingSetUpdater.ID_TASK_WORKING_SET;
+ ConfigureWindowWorkingSetsDialog dialog = new ConfigureWindowWorkingSetsDialog(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow(), ids);
+ dialog.open();
+ }
+
+ public void run(IAction action) {
+ this.run();
+ }
+
+ public void run(IWorkingSet editWorkingSet) {
+ IWorkingSetManager manager = WorkbenchPlugin.getDefault().getWorkingSetManager();
+ IWorkingSetEditWizard wizard = manager.createWorkingSetEditWizard(editWorkingSet);
+ WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard);
+
+// dialog.create();
+ dialog.open();
+// PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
+// IWorkbenchHelpContextIds.WORKING_SET_EDIT_WIZARD);
+// if (dialog.open() == Window.OK) {
+// editWorkingSet = wizard.getSelection();
+// availableWorkingSetsChanged();
+// // make sure ok button is enabled when the selected working set
+// // is edited. Fixes bug 33386.
+// updateButtonAvailability();
+// }
+// editedWorkingSets.put(editWorkingSet, originalWorkingSet);
+ }
+
+ private class ManageWorkingSetsAction extends Action {
+ ManageWorkingSetsAction() {
+ super(Messages.TaskWorkingSetAction_Edit_Label);
+ }
+
+ @Override
+ public void run() {
+ TaskWorkingSetAction.this.run(this);
+ }
+ }
+
+ // TODO: remove?
+ protected class ToggleEnableAllSetsAction extends Action {
+
+ ToggleEnableAllSetsAction() {
+ super(Messages.TaskWorkingSetAction_Deselect_All, IAction.AS_CHECK_BOX);
+// setImageDescriptor(TasksUiImages.TASK_WORKING_SET);
+// setChecked(!areAllTaskWorkingSetsEnabled());
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(TaskWorkingSetUpdater.getEnabledSets()));
+
+ Set<IWorkingSet> tempList = new HashSet<IWorkingSet>();
+ Iterator<IWorkingSet> iter = newList.iterator();
+ while (iter.hasNext()) {
+ IWorkingSet workingSet = iter.next();
+ if (workingSet != null
+ && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ tempList.add(workingSet);
+ }
+ }
+ newList.removeAll(tempList);
+
+ if (isChecked()) {
+ IWorkingSet[] allWorkingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
+ for (IWorkingSet workingSet : allWorkingSets) {
+ if (workingSet != null
+ && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ newList.add(workingSet);
+ }
+ }
+ }
+
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(newList);
+ }
+
+ }
+
+ class ConfigureWindowWorkingSetsDialog extends AbstractWorkingSetDialogCOPY {
+
+ private final static int SIZING_SELECTION_WIDGET_HEIGHT = 200;
+
+ private final static int SIZING_SELECTION_WIDGET_WIDTH = 50;
+
+ private final IWorkbenchWindow window;
+
+ private CheckboxTableViewer viewer;
+
+ private Set<String> taskWorkingSetIds;
+
+ protected ConfigureWindowWorkingSetsDialog(IWorkbenchWindow window, String[] workingSetIds) {
+ super(window.getShell(), workingSetIds, true);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ this.window = window;
+ //setTitle(WorkbenchMessages.WorkingSetSelectionDialog_title_multiSelect);
+ setTitle(Messages.TaskWorkingSetAction_Select_and_Edit_Working_Sets);
+ setMessage(""); //$NON-NLS-1$
+
+ if (workingSetIds == null || workingSetIds.length == 0) {
+ taskWorkingSetIds = null;
+ } else {
+ taskWorkingSetIds = new HashSet<String>();
+ for (String id : workingSetIds) {
+ taskWorkingSetIds.add(id);
+ }
+ }
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = (Composite) super.createDialogArea(parent);
+
+ Composite viewerComposite = new Composite(composite, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = layout.marginWidth = 0;
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ viewerComposite.setLayout(layout);
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
+ data.widthHint = SIZING_SELECTION_WIDGET_WIDTH + 300; // fudge? I like fudge.
+ viewerComposite.setLayoutData(data);
+
+ viewer = CheckboxTableViewer.newCheckList(viewerComposite, SWT.BORDER);
+ viewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
+ viewer.setLabelProvider(new WorkingSetLabelProvider());
+ viewer.setContentProvider(new ArrayContentProvider());
+ viewer.addFilter(new WorkingSetFilter(taskWorkingSetIds));
+ viewer.setInput(window.getWorkbench().getWorkingSetManager().getWorkingSets());
+
+ viewer.setCheckedElements(TaskWorkingSetUpdater.getActiveWorkingSets(window).toArray());
+
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ handleSelectionChanged();
+ }
+ });
+
+ data = new GridData(GridData.FILL_BOTH);
+ data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
+ data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
+
+ viewer.getControl().setLayoutData(data);
+ addModifyButtons(viewerComposite);
+
+ addSelectionButtons(composite);
+
+ availableWorkingSetsChanged();
+
+ Dialog.applyDialogFont(composite);
+
+ return composite;
+ }
+
+ @Override
+ protected void okPressed() {
+ Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(TaskWorkingSetUpdater.getEnabledSets()));
+ Set<IWorkingSet> tempList = new HashSet<IWorkingSet>();
+ for (IWorkingSet workingSet : newList) {
+ for (String id : taskWorkingSetIds) {
+ if (workingSet.getId().equalsIgnoreCase(id)) {
+ tempList.add(workingSet);
+ }
+ }
+ }
+ newList.removeAll(tempList);
+
+ Object[] selection = viewer.getCheckedElements();
+ IWorkingSet[] setsToEnable = new IWorkingSet[selection.length];
+ System.arraycopy(selection, 0, setsToEnable, 0, selection.length);
+ newList.addAll(new HashSet<IWorkingSet>(Arrays.asList(setsToEnable)));
+
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(newList);
+ super.okPressed();
+ }
+
+ @Override
+ protected List<?> getSelectedWorkingSets() {
+ ISelection selection = viewer.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ return ((IStructuredSelection) selection).toList();
+ }
+ return null;
+ }
+
+ @Override
+ protected void availableWorkingSetsChanged() {
+ viewer.setInput(window.getWorkbench().getWorkingSetManager().getWorkingSets());
+ super.availableWorkingSetsChanged();
+ }
+
+ /**
+ * Called when the selection has changed.
+ */
+ void handleSelectionChanged() {
+ updateButtonAvailability();
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ }
+
+ @Override
+ protected void selectAllSets() {
+ viewer.setCheckedElements(window.getWorkbench().getWorkingSetManager().getWorkingSets());
+ updateButtonAvailability();
+ }
+
+ @Override
+ protected void deselectAllSets() {
+ viewer.setCheckedElements(new Object[0]);
+ updateButtonAvailability();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleAllWorkingSetsAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleAllWorkingSetsAction.java
new file mode 100644
index 0000000..2f8f69d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleAllWorkingSetsAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IWorkingSet;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleAllWorkingSetsAction extends Action {
+
+ public ToggleAllWorkingSetsAction() {
+ super(Messages.ToggleAllWorkingSetsAction_Show_All, IAction.AS_CHECK_BOX);
+ super.setChecked(TaskWorkingSetUpdater.areNoTaskWorkingSetsEnabled());
+ }
+
+ @Override
+ public void run() {
+ Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(TaskWorkingSetUpdater.getEnabledSets()));
+
+ Set<IWorkingSet> tempList = new HashSet<IWorkingSet>();
+ Iterator<IWorkingSet> iter = newList.iterator();
+ while (iter.hasNext()) {
+ IWorkingSet workingSet = iter.next();
+ if (workingSet != null && workingSet.getId() != null
+ && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ tempList.add(workingSet);
+ }
+ }
+ newList.removeAll(tempList);
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(newList);
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ run();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleTaskActivationAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleTaskActivationAction.java
new file mode 100644
index 0000000..f049297
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleTaskActivationAction.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleTaskActivationAction extends Action implements ITaskActivationListener {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.actions.task.activation.toggle"; //$NON-NLS-1$
+
+ private final ITask task;
+
+ /**
+ * @param task
+ * cannot be null
+ * @param toolBarManager
+ * cannot be null
+ */
+ public ToggleTaskActivationAction(ITask task) {
+ Assert.isNotNull(task);
+ this.task = task;
+ setId(ID);
+ setImageDescriptor(TasksUiImages.CONTEXT_ACTIVE_CENTERED);
+ update();
+ TasksUi.getTaskActivityManager().addActivationListener(this);
+ }
+
+ public void dispose() {
+ TasksUi.getTaskActivityManager().removeActivationListener(this);
+ }
+
+ private void update() {
+ setChecked(task.isActive());
+ if (task.isActive()) {
+ setText(Messages.ToggleTaskActivationAction_Deactivate_Task);
+ setToolTipText(Messages.ToggleTaskActivationAction_Deactivate_Task);
+ } else {
+ setText(Messages.ToggleTaskActivationAction_Activate_Task);
+ setToolTipText(Messages.ToggleTaskActivationAction_Activate_Task);
+ }
+ }
+
+ @Override
+ public void run() {
+ if (!task.isActive()) {
+ TasksUi.getTaskActivityManager().activateTask(task);
+ } else {
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ }
+ update();
+ }
+
+ public void taskActivated(ITask task) {
+ update();
+ }
+
+ public void taskDeactivated(ITask task) {
+ update();
+ }
+
+ public void preTaskActivated(ITask task) {
+ // ignore
+ }
+
+ public void preTaskDeactivated(ITask task) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleWorkingSetAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleWorkingSetAction.java
new file mode 100644
index 0000000..04970e1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/ToggleWorkingSetAction.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.actions;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.bindings.keys.IKeyLookup;
+import org.eclipse.jface.bindings.keys.KeyLookupFactory;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IWorkingSet;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleWorkingSetAction extends Action {
+
+ private final IWorkingSet workingSet;
+
+ public ToggleWorkingSetAction(IWorkingSet set) {
+ super(set.getLabel(), IAction.AS_CHECK_BOX);
+ setImageDescriptor(set.getImageDescriptor());
+ this.workingSet = set;
+ setChecked(TaskWorkingSetUpdater.isWorkingSetEnabled(set));
+ }
+
+ @Override
+ public void run() {
+ runWithEvent(null);
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ Set<IWorkingSet> newList = new HashSet<IWorkingSet>(Arrays.asList(TaskWorkingSetUpdater.getEnabledSets()));
+
+ boolean modified = false;
+ if (event != null) {
+ modified = (event.stateMask & KeyLookupFactory.getDefault().formalModifierLookup(IKeyLookup.M1_NAME)) != 0;
+ }
+
+ if (!modified) {
+ // Default behavior is to act as a radio button.
+ Set<IWorkingSet> tempList = new HashSet<IWorkingSet>();
+ Iterator<IWorkingSet> iter = newList.iterator();
+ while (iter.hasNext()) {
+ IWorkingSet workingSet = iter.next();
+ if (workingSet != null && workingSet.getId() != null
+ && workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ tempList.add(workingSet);
+ }
+ }
+ newList.removeAll(tempList);
+
+ if (isChecked()) {
+ newList.add(workingSet);
+ } else {
+ // If multiples were previously selected, make this action active
+ if (!TaskWorkingSetUpdater.isOnlyTaskWorkingSetEnabled(workingSet)) {
+ newList.add(workingSet);
+ }
+ }
+ } else {
+ // If modifier key is pressed, de/selections are additive.
+ if (isChecked()) {
+ newList.add(workingSet);
+ } else {
+ newList.remove(workingSet);
+ }
+ }
+
+ TaskWorkingSetUpdater.applyWorkingSetsToAllWindows(newList);
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties
new file mode 100644
index 0000000..46f80dc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/actions/messages.properties
@@ -0,0 +1,165 @@
+AbstractChangeCompletionAction_Mark_selected_local_tasks_X=Mark selected local tasks {0}?
+ActivateTaskDialogAction_Activate_Task=Activate Task
+ActivateTaskDialogAction_Select_a_task_to_activate__=&Select a task to activate (? = any character, * = any String):
+
+ActivateTaskHistoryDropDownAction_Activate_Previous_Task=Activate Previous Task
+
+AddRepositoryAction_Add_new_query=Add new query
+
+AddRepositoryAction_Add_a_query_to_the_Task_List=Would you like to add a query to the Task List for this repository?
+AddRepositoryAction_Add_Task_Repository=Add Task Repository...
+AddRepositoryAction_Do_not_show_again=Do not show again
+AutoUpdateQueryAction_Synchronize_Automatically_Label=Synchronize Automatically
+
+ClearOutgoingAction_Clear_outgoing=Clear outgoing
+ClearOutgoingAction_Clear_outgoing_failed=Clear outgoing failed
+ClearOutgoingAction_Confirm_discard=Confirm discard
+ClearOutgoingAction_Discard_all_outgoing_changes_=Discard all outgoing changes?
+
+CloneTaskAction_Clone_Task_Failed=Clone Task Failed
+CloneTaskAction_Clone_This_Task=Clone This Task
+CloneTaskAction_Cloned_from_=Cloned from\:\
+
+CollapseAllAction_Collapse_All=Collapse All
+
+CompareAttachmentsAction_Compare__=Compare (
+CompareAttachmentsAction_Compare_Attachments=Compare Attachments
+CompareAttachmentsAction_Failed_to_find_attachment=Failed to find attachment\:\
+
+CopyCommentDetailsAction_Copy_User_ID=Copy User ID
+CopyCommentDetailsAction_Copy_User_ID_Tooltip=Copy User ID of Comment Author to Clipboard
+CopyTaskDetailsAction_ID_Menu_Label=ID
+CopyTaskDetailsAction_Summary_and_Url_Menu_Label=Summary and URL
+CopyTaskDetailsAction_Url_Menu_Label=URL
+
+DeleteAction_Confirm_Delete=Confirm Delete
+DeleteAction_Delete=Delete
+DeleteAction_Delete_all_of_the_unsubmitted_tasks=Delete all of the unsubmitted tasks?
+DeleteAction_Delete_the_elements_listed_below=Delete the elements listed below? If categories or queries are selected contained tasks will not be deleted. Contexts will be deleted for selected tasks.
+DeleteAction_Delete_failed=Delete failed
+DeleteAction_Delete_in_progress=Deleting task list elements
+DeleteAction_Delete_the_planning_information_and_context_for_the_repository_task=Delete the planning information and context for the repository task? The server copy will not be deleted and the task will remain in queries that match it.
+DeleteAction_Delete_the_planning_information_and_context_of_all_unmatched_tasks=Delete the planning information and context of all unmatched tasks? The server copy of these tasks will not be deleted and the task will remain in queries that match it.
+DeleteAction_Nothing_selected=Nothing selected.
+DeleteAction_Permanently_delete_the_category=Permanently delete the category? Local tasks will be moved to the Uncategorized folder. Repository tasks will be moved to the Unmatched folder.
+DeleteAction_Permanently_delete_the_element_listed_below=Permanently delete the element listed below?
+DeleteAction_Permanently_delete_the_query=Permanently delete the query? Contained tasks will be moved to the Unmatched folder.
+DeleteAction_Permanently_delete_the_task_listed_below=Permanently delete the task listed below?
+
+
+DeleteTaskRepositoryAction_Confirm_Delete=Confirm Delete
+DeleteTaskRepositoryAction_Delete_Specific_Task_Repository=Are you sure you want to delete task repository "{0}"?
+DeleteTaskRepositoryAction_Delete_Repository=Delete Repository
+DeleteTaskRepositoryAction_Delete_Repository_In_Progress=Deleting repository and related artifacts
+DeleteTaskRepositoryAction_Delete_the_selected_task_repositories=This repository is being used by {0} tasks and {1} queries. Do you wish to delete the repository, tasks, and queries?
+DeleteTaskRepositoryAction_Delete_Task_Repository_Failed=Delete Task Repository Failed
+
+EditRepositoryPropertiesAction_Properties=Properties
+
+ExpandAllAction_Expand_All=Expand All
+ExportAction_Dialog_Title=Task List Export
+ExportAction_Nothing_selected=Nothing selected.
+ExportAction_Problems_encountered=Problems encountered during export. See error log for details.
+ExportAction_X_exists_Do_you_wish_to_overwrite={0} exists. Do you wish to overwrite?
+
+FilterCompletedTasksAction_Filter_Completed_Tasks=Hide Completed Tasks
+
+GoIntoAction_Go_Into=Go Into
+
+GoUpAction_Go_Up_To_Root=Go Up To Root
+
+GroupSubTasksAction_Group_Subtasks=Group Subtasks
+ImportAction_Dialog_Title=Task List Import
+ImportAction_Problems_encountered=Problems encountered during importing. See error log for details
+
+LinkWithEditorAction_Link_with_Editor=&Link with Editor
+
+NewCategoryAction_A_category_with_this_name_already_exists=A category with this name already exists, please choose another name.
+NewCategoryAction_Enter_name=Enter name
+NewCategoryAction_Enter_a_name_for_the_Category=Enter a name for the Category\:\
+NewCategoryAction_New_Category=New Category
+NewCategoryAction_New_Category_=New Category...
+NewCategoryAction_A_query_with_this_name_already_exists=A query with this name already exists, please choose another name.
+NewQueryAction_new_query_=New Query...
+
+NewSubTaskAction_The_connector_does_not_support_creating_subtasks_for_this_task=The connector does not support creating subtasks for this task
+NewSubTaskAction_Could_not_initialize_sub_task_data_for_task_=Could not initialize sub task data for task\:\
+NewSubTaskAction_Could_not_retrieve_task_data_for_task_=Could not retrieve task data for task:
+NewSubTaskAction_Create_a_new_subtask=Create a new subtask
+NewSubTaskAction_Failed_to_create_new_sub_task_=Failed to create new sub task:
+NewSubTaskAction_Subtask=Subtask
+NewSubTaskAction_Unable_to_create_subtask=Unable to create subtask
+
+NewTaskAction_new_task=New Task
+NewTaskFromSelectionAction_Comment_=Comment\:\
+NewTaskFromSelectionAction____Created_from_Comment___=-- Created from Comment --
+NewTaskFromSelectionAction_New_Task_from_Selection=New Task from Selection
+NewTaskFromSelectionAction_Nothing_selected_to_create_task_from=Nothing selected to create task from.
+NewTaskFromSelectionAction_URL_=URL\:\
+
+OpenRepositoryTask_Could_not_find_matching_repository_task=Could not find matching repository task.
+OpenRepositoryTask_Open_Repository_Task=Open Repository Task
+OpenRepositoryTask_Open_Task=Open Task
+
+OpenTaskAction_Open_Task=Open Task
+OpenTaskAction_Select_a_task_to_open__=&Select a task to open (? = any character, * = any String)\:
+
+OpenTaskListElementAction_Open=Open
+OpenTaskListElementAction_Open_Task_List_Element=Open Task List Element
+
+OpenTasksUiPreferencesAction_Preferences_=Preferences...
+
+OpenWithBrowserAction_Open_with_Browser=Open with Browser
+
+PresentationDropDownSelectionAction_Task_Presentation=Task Presentation
+
+QueryCloneAction_Clone_Query=Clone Query
+QueryCloneAction_Copy_of_X=Copy of {0}
+QueryCloneAction_No_query_selected=No query selected.
+
+RefreshRepositoryTasksAction_Refresh_All_Tasks=Refresh All Tasks
+
+RemoveFromCategoryAction_Remove_From_Category=Remove From Category
+
+RenameAction_Rename=Rename
+
+ShowInSearchViewAction_Open_in_Search_Label=Open in Search
+ShowInTaskListAction_Show_In_Task_List=&Show In Task List
+
+SynchronizeAutomaticallyAction_Synchronize_Automatically=Synchronize Automatically
+
+SynchronizeEditorAction_Synchronize=Synchronize
+SynchronizeEditorAction_Synchronize_Incoming_Changes=Synchronize Incoming Changes
+
+TaskActivateAction_Activate=Activate
+
+TaskDeactivateAction_Deactivate=Deactivate
+TaskEditorScheduleAction_Private_Scheduling=Toggle Private Scheduling
+
+TaskListSortAction_Sort_=Sort...
+
+TaskSelectionDialog__matches=\ matches
+TaskSelectionDialog_Deselect_Working_Set=&Deselect Working Set
+TaskSelectionDialog_Edit_Active_Working_Set_=&Edit Active Working Set...
+TaskSelectionDialog_New_Task_=&New Task...
+TaskSelectionDialog_Open_with_Browser=Open with &Browser
+TaskSelectionDialog_Random_Task=I'm Feeling &Lazy
+TaskSelectionDialog_Scanning_tasks=Scanning tasks
+TaskSelectionDialog_Search_for_tasks=Search for tasks
+TaskSelectionDialog_Select_Working_Set_=Select &Working Set...
+TaskSelectionDialog_Selected_item_is_not_a_task=Selected item is not a task
+TaskSelectionDialog_Show_Completed_Tasks=Show &Completed Tasks
+TaskSelectionDialogWithRandom_Feeling_Lazy_Error=Could not find a suitable low energy task.
+TaskSelectionDialogWithRandom_Feeling_Lazy_Error_Title=I'm Feeling Lazy
+TaskSelectionDialogWithRandom_Feeling_Lazy_Tooltip=Select a low energy task based on priority and scheduling information
+
+TaskWorkingSetAction_All=All
+TaskWorkingSetAction_Deselect_All=Deselect All
+TaskWorkingSetAction_Edit_Label=&Edit...
+TaskWorkingSetAction_Select_and_Edit_Working_Sets=Select and Edit Working Sets
+TaskWorkingSetAction_Sets=Sets
+
+ToggleAllWorkingSetsAction_Show_All=Show All
+
+ToggleTaskActivationAction_Activate_Task=Activate Task
+ToggleTaskActivationAction_Deactivate_Task=Deactivate Task
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AbstractTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AbstractTaskHandler.java
new file mode 100644
index 0000000..575b156
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AbstractTaskHandler.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTaskHandler extends AbstractHandler {
+
+ protected boolean recurse;
+
+ public AbstractTaskHandler() {
+ }
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getActiveMenuSelection(event);
+ if (selection == null || selection.isEmpty()) {
+ selection = HandlerUtil.getCurrentSelection(event);
+ }
+ if (selection instanceof IStructuredSelection) {
+ Object[] items = ((IStructuredSelection) selection).toArray();
+ for (Object item : items) {
+ process(event, item, recurse);
+ }
+ }
+ return null;
+ }
+
+ private void process(ExecutionEvent event, Object item, boolean recurse) throws ExecutionException {
+ if (!(item instanceof IRepositoryElement)) {
+ item = Platform.getAdapterManager().getAdapter(item, ITask.class);
+ }
+ if (item instanceof ITask) {
+ execute(event, (ITask) item);
+ }
+ if (item instanceof ITaskContainer && (recurse || !(item instanceof AbstractTask))) {
+ execute(event, (ITaskContainer) item);
+ }
+ }
+
+ protected void execute(ExecutionEvent event, ITaskContainer item) throws ExecutionException {
+ for (ITask task : item.getChildren()) {
+ process(event, task, true);
+ }
+ }
+
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AbstractTaskListViewHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AbstractTaskListViewHandler.java
new file mode 100644
index 0000000..7f833b3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AbstractTaskListViewHandler.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ITreeSelection;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTaskListViewHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchSite site = HandlerUtil.getActiveSite(event);
+ if (site instanceof IViewSite) {
+ IViewSite viewSite = (IViewSite) site;
+ IWorkbenchPart part = viewSite.getPart();
+ if (part instanceof TaskListView) {
+ TaskListView taskListView = (TaskListView) part;
+ execute(event, taskListView);
+ }
+ }
+ return null;
+ }
+
+ protected void execute(ExecutionEvent event, TaskListView taskListView) throws ExecutionException {
+ ITreeSelection selection = (ITreeSelection) taskListView.getViewer().getSelection();
+ for (Iterator<?> it = selection.iterator(); it.hasNext();) {
+ Object item = it.next();
+ if (item instanceof IRepositoryElement) {
+ execute(event, taskListView, (IRepositoryElement) item);
+ }
+ }
+ }
+
+ protected void execute(ExecutionEvent event, TaskListView taskListView, IRepositoryElement item)
+ throws ExecutionException {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AddTaskRepositoryHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AddTaskRepositoryHandler.java
new file mode 100644
index 0000000..4217f81
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/AddTaskRepositoryHandler.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ * Peter Stibrany - fix for parameter name (bug 247077)
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewRepositoryWizard;
+import org.eclipse.mylyn.tasks.ui.wizards.TaskRepositoryWizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Displays a wizard dialog for adding a new task repository.
+ *
+ * @author Willian Mitsuda
+ * @author Steffen Pingel
+ */
+public class AddTaskRepositoryHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ Shell shell = HandlerUtil.getActiveShell(event);
+ if (shell != null && !shell.isDisposed()) {
+ String connectorKind = event.getParameter("connectorKind"); //$NON-NLS-1$
+ NewRepositoryWizard repositoryWizard = new NewRepositoryWizard(connectorKind);
+
+ WizardDialog repositoryDialog = new TaskRepositoryWizardDialog(shell, repositoryWizard);
+ repositoryDialog.create();
+ repositoryDialog.getShell().setText(Messages.AddTaskRepositoryHandler_Add_Task_Repository);
+ repositoryDialog.setBlockOnOpen(true);
+ repositoryDialog.open();
+ if (repositoryDialog.getReturnCode() == Window.OK) {
+ return repositoryWizard.getTaskRepository();
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/CollapseAllHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/CollapseAllHandler.java
new file mode 100644
index 0000000..0aed922
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/CollapseAllHandler.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+
+/**
+ * @author Steffen Pingel
+ */
+// TODO e3.4 replace with org.eclipse.ui.handlers.CollapseAllHandler
+public class CollapseAllHandler extends AbstractHandler {
+
+ public static final String ID_COMMAND = "org.eclipse.ui.navigate.collapseAll"; //$NON-NLS-1$
+
+ private final AbstractTreeViewer treeViewer;
+
+ public CollapseAllHandler(AbstractTreeViewer treeViewer) {
+ Assert.isNotNull(treeViewer);
+ this.treeViewer = treeViewer;
+ }
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ treeViewer.collapseAll();
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/GoToUnreadTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/GoToUnreadTaskHandler.java
new file mode 100644
index 0000000..1723ac9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/GoToUnreadTaskHandler.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker;
+import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker.Direction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker.TreeVisitor;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class GoToUnreadTaskHandler extends AbstractTaskListViewHandler {
+
+ public static final String ID_NEXT = "org.eclipse.mylyn.tasklist.actions.goToNextUnread"; //$NON-NLS-1$
+
+ public static final String ID_PREVIOUS = "org.eclipse.mylyn.tasklist.actions.goToPreviousUnread"; //$NON-NLS-1$
+
+ private Direction direction = Direction.DOWN;
+
+ public Direction getDirection() {
+ return direction;
+ }
+
+ private TreePath getUnreadItem(TreeViewer treeViewer, Tree tree) {
+ TreeItem[] selection = tree.getSelection();
+ TreeItem selectedItem = (selection.length > 0) ? selection[0] : null;
+
+ TreeVisitor visitor = new TreeVisitor() {
+ @Override
+ public boolean visit(Object object) {
+ if (object instanceof ITask) {
+ ITask task = (ITask) object;
+ if (task.getSynchronizationState().isIncoming()) {
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+
+ TreeWalker treeWalker = new TreeWalker(treeViewer);
+ treeWalker.setDirection(direction);
+ treeWalker.setExpandNodes(true);
+ return treeWalker.walk(visitor, selectedItem);
+ }
+
+ @Override
+ protected void execute(ExecutionEvent event, TaskListView taskListView, IRepositoryElement item) {
+ TreeViewer treeViewer = taskListView.getViewer();
+ Tree tree = treeViewer.getTree();
+
+ // need to expand nodes to traverse the tree, disable redraw to avoid flickering
+ TreePath treePath = null;
+ try {
+ tree.setRedraw(false);
+ treePath = getUnreadItem(treeViewer, tree);
+ } finally {
+ tree.setRedraw(true);
+ }
+
+ if (treePath != null) {
+ treeViewer.expandToLevel(treePath, 0);
+ treeViewer.setSelection(new TreeSelection(treePath), true);
+ }
+ }
+
+ public void setDirection(Direction direction) {
+ this.direction = direction;
+ }
+
+ public static void execute(ExecutionEvent event, Direction direction) throws ExecutionException {
+ GoToUnreadTaskHandler handler = new GoToUnreadTaskHandler() {
+ };
+ handler.setDirection(direction);
+ handler.execute(event);
+ }
+
+ public static class GoToNextUnreadTaskHandler extends GoToUnreadTaskHandler {
+
+ public GoToNextUnreadTaskHandler() {
+ setDirection(Direction.DOWN);
+ }
+
+ }
+
+ public static class GoToPreviousUnreadTaskHandler extends GoToUnreadTaskHandler {
+
+ public GoToPreviousUnreadTaskHandler() {
+ setDirection(Direction.UP);
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/MarkTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/MarkTaskHandler.java
new file mode 100644
index 0000000..57e024d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/MarkTaskHandler.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import java.util.Collections;
+import java.util.Date;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class MarkTaskHandler extends AbstractTaskHandler {
+
+ public static class ClearOutgoingHandler extends AbstractTaskHandler {
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ ClearOutgoingAction action = new ClearOutgoingAction(Collections.singletonList((IRepositoryElement) task));
+ if (action.isEnabled()) {
+ action.run();
+ }
+ }
+ }
+
+ public static class MarkTaskCompleteHandler extends AbstractTaskHandler {
+
+ public static final String ID_COMMAND = "org.eclipse.mylyn.tasks.ui.command.markTaskComplete"; //$NON-NLS-1$
+
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ if (TasksUiInternal.hasLocalCompletionState(task)) {
+ task.setCompletionDate(new Date());
+ TasksUiPlugin.getTaskList().notifyElementChanged(task);
+ }
+ }
+ }
+
+ public static class MarkTaskIncompleteHandler extends AbstractTaskHandler {
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ if (TasksUiInternal.hasLocalCompletionState(task)) {
+ task.setCompletionDate(null);
+ TasksUiPlugin.getTaskList().notifyElementChanged(task);
+ }
+ }
+ }
+
+ public static class MarkTaskReadHandler extends AbstractTaskHandler {
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ }
+ }
+
+ public static class MarkTaskUnreadHandler extends AbstractTaskHandler {
+ @Override
+ protected void execute(ExecutionEvent event, ITask task) throws ExecutionException {
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, false);
+ }
+ }
+
+ public static class MarkTaskReadGoToNextUnreadTaskHandler extends AbstractTaskListViewHandler {
+ @Override
+ protected void execute(ExecutionEvent event, TaskListView taskListView, IRepositoryElement item)
+ throws ExecutionException {
+ if (item instanceof ITask) {
+ ITask task = (ITask) item;
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ GoToUnreadTaskHandler.execute(event, org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker.Direction.DOWN);
+ }
+ }
+ }
+
+ public static class MarkTaskReadGoToPreviousUnreadTaskHandler extends AbstractTaskListViewHandler {
+ @Override
+ protected void execute(ExecutionEvent event, TaskListView taskListView, IRepositoryElement item)
+ throws ExecutionException {
+ if (item instanceof ITask) {
+ ITask task = (ITask) item;
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ GoToUnreadTaskHandler.execute(event, org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker.Direction.UP);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/MaximizePartHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/MaximizePartHandler.java
new file mode 100644
index 0000000..f1ad517
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/MaximizePartHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jingwen Ou 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:
+ * Jingwen Ou - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author
+ */
+public class MaximizePartHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchSite site = HandlerUtil.getActiveSite(event);
+ if (site instanceof IEditorSite) {
+ IWorkbenchPart part = ((IEditorSite) site).getPart();
+ if (part instanceof FormEditor) {
+ IFormPage page = ((FormEditor) part).getActivePageInstance();
+ Control focusedControl = EditorUtil.getFocusControl(page);
+ if (focusedControl != null) {
+ Object data = focusedControl.getData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION);
+ if (data instanceof IAction) {
+ IAction action = (IAction) data;
+ action.setChecked(!action.isChecked());
+ action.run();
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/Messages.java
new file mode 100644
index 0000000..f00f90f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/Messages.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.commands.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AddTaskRepositoryHandler_Add_Task_Repository;
+
+ public static String NewLocalTaskHandler_Could_not_create_local_task;
+
+ public static String OpenTaskAttachmentInDefaultEditorHandler_Failed_to_open_editor;
+
+ public static String OpenTaskAttachmentInDefaultEditorHandler_No_default_editor_for_X_found;
+
+ public static String OpenTaskAttachmentInDefaultEditorHandler_Open_Attachment_Failed;
+
+ public static String RemoteTaskSelectionDialog_Add_;
+
+ public static String RemoteTaskSelectionDialog_Add_to_Task_List_category;
+
+ public static String RemoteTaskSelectionDialog_Enter_Key_ID__use_comma_for_multiple_;
+
+ public static String RemoteTaskSelectionDialog_Enter_a_valid_task_ID;
+
+ public static String RemoteTaskSelectionDialog_Matching_tasks;
+
+ public static String RemoteTaskSelectionDialog_Select_a_task_or_repository;
+
+ public static String RemoteTaskSelectionDialog_Select_a_task_repository;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/NewLocalTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/NewLocalTaskHandler.java
new file mode 100644
index 0000000..524bf33
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/NewLocalTaskHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class NewLocalTaskHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchSite site = HandlerUtil.getActiveSite(event);
+ if (site instanceof IViewSite) {
+ IViewSite viewSite = (IViewSite) site;
+ IWorkbenchPart part = viewSite.getPart();
+ if (part instanceof TaskListView) {
+ TaskListView taskListView = (TaskListView) part;
+ NewTaskAction action = new NewTaskAction();
+ try {
+ action.setInitializationData(null, null, "local"); //$NON-NLS-1$
+ } catch (CoreException e) {
+ throw new ExecutionException(Messages.NewLocalTaskHandler_Could_not_create_local_task, e);
+ }
+ action.selectionChanged(action, taskListView.getViewer().getSelection());
+ if (action.isEnabled()) {
+ action.run();
+ }
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/NewSubTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/NewSubTaskHandler.java
new file mode 100644
index 0000000..90ca647
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/NewSubTaskHandler.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Shawn Minto
+ */
+public class NewSubTaskHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchSite site = HandlerUtil.getActiveSite(event);
+ if (site instanceof IViewSite) {
+ IViewSite viewSite = (IViewSite) site;
+ IWorkbenchPart part = viewSite.getPart();
+ if (part instanceof TaskListView) {
+ TaskListView taskListView = (TaskListView) part;
+ NewSubTaskAction action = new NewSubTaskAction();
+ action.selectionChanged(action, taskListView.getViewer().getSelection());
+ if (action.isEnabled()) {
+ action.run();
+ }
+ return null;
+ }
+ }
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenRepositoryTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenRepositoryTaskHandler.java
new file mode 100644
index 0000000..24b119e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenRepositoryTaskHandler.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTaskAction;
+
+/**
+ * @author Steffen Pingel
+ */
+public class OpenRepositoryTaskHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ new OpenRepositoryTaskAction().run(null);
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenSelectedTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenSelectedTaskHandler.java
new file mode 100644
index 0000000..7cf87c3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenSelectedTaskHandler.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Steffen Pingel
+ */
+public class OpenSelectedTaskHandler extends AbstractTaskListViewHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, TaskListView taskListView, IRepositoryElement item) {
+ if (item instanceof ITask) {
+ TasksUiInternal.openTaskInBackground((AbstractTask) item, true);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskAttachmentInBrowserHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskAttachmentInBrowserHandler.java
new file mode 100644
index 0000000..5922bfa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskAttachmentInBrowserHandler.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class OpenTaskAttachmentInBrowserHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof IStructuredSelection) {
+ List<?> items = ((IStructuredSelection) selection).toList();
+ for (Object item : items) {
+ if (item instanceof ITaskAttachment) {
+ TasksUiUtil.openUrl(((ITaskAttachment) item).getUrl());
+ }
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskAttachmentInDefaultEditorHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskAttachmentInDefaultEditorHandler.java
new file mode 100644
index 0000000..2d8969a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskAttachmentInDefaultEditorHandler.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentEditorInput;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class OpenTaskAttachmentInDefaultEditorHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchPage page = null;
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof IStructuredSelection) {
+ List<?> items = ((IStructuredSelection) selection).toList();
+ for (Object item : items) {
+ if (item instanceof ITaskAttachment) {
+ if (page == null) {
+ IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
+ page = window.getActivePage();
+ if (page == null) {
+ throw new ExecutionException("No active workbench page"); //$NON-NLS-1$
+ }
+ }
+ openAttachment(page, (ITaskAttachment) item);
+ }
+ }
+ }
+ return null;
+ }
+
+ private void openAttachment(IWorkbenchPage page, ITaskAttachment attachment) throws ExecutionException {
+ TaskAttachmentEditorInput input = new TaskAttachmentEditorInput(attachment);
+ IEditorDescriptor description = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(input.getName());
+ if (description == null) {
+ TasksUiInternal.displayStatus(Messages.OpenTaskAttachmentInDefaultEditorHandler_Open_Attachment_Failed,
+ new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, MessageFormat.format(
+ Messages.OpenTaskAttachmentInDefaultEditorHandler_No_default_editor_for_X_found,
+ input.getName())));
+ } else {
+ try {
+ page.openEditor(input, description.getId());
+ } catch (PartInitException e) {
+ throw new ExecutionException(Messages.OpenTaskAttachmentInDefaultEditorHandler_Failed_to_open_editor, e);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskListElementPropertiesHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskListElementPropertiesHandler.java
new file mode 100644
index 0000000..2a5fc49
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskListElementPropertiesHandler.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+
+/**
+ * @author Steffen Pingel
+ */
+public class OpenTaskListElementPropertiesHandler extends AbstractTaskListViewHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, TaskListView taskListView, IRepositoryElement item) {
+ if (item instanceof TaskCategory || item instanceof IRepositoryQuery) {
+ TasksUiInternal.refreshAndOpenTaskListElement(item);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskRepositoryPropertiesHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskRepositoryPropertiesHandler.java
new file mode 100644
index 0000000..957cba0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/OpenTaskRepositoryPropertiesHandler.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class OpenTaskRepositoryPropertiesHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof IStructuredSelection) {
+ Object item = ((IStructuredSelection) selection).getFirstElement();
+ if (item instanceof TaskRepository) {
+ TasksUiUtil.openEditRepositoryWizard((TaskRepository) item);
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java
new file mode 100644
index 0000000..e0a6dab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/RemoteTaskSelectionDialog.java
@@ -0,0 +1,340 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ * Tomasz Zarna, IBM Corporation - improvements for bug 261648
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.commands;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.commands.common.CommandException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.ITaskCommandIds;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionStatusDialog;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class RemoteTaskSelectionDialog extends SelectionStatusDialog {
+
+ public RemoteTaskSelectionDialog(Shell parent) {
+ super(parent);
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ setStatusLineAboveButtons(true);
+ }
+
+ private Text idText;
+
+ private TableViewer tasksViewer;
+
+ private ComboViewer repositoriesViewer;
+
+ private Button addToTaskListCheck;
+
+ private ComboViewer categoryViewer;
+
+ // TODO: copy'n pasted code; make API?
+ private List<TaskRepository> getTaskRepositories() {
+ List<TaskRepository> repositories = new ArrayList<TaskRepository>();
+ TaskRepositoryManager repositoryManager = TasksUiPlugin.getRepositoryManager();
+ for (AbstractRepositoryConnector connector : repositoryManager.getRepositoryConnectors()) {
+ Set<TaskRepository> connectorRepositories = repositoryManager.getRepositories(connector.getConnectorKind());
+ for (TaskRepository repository : connectorRepositories) {
+ if (ITaskRepositoryFilter.CAN_CREATE_TASK_FROM_KEY.accept(repository, connector)) {
+ repositories.add(repository);
+ }
+ }
+ }
+ return repositories;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite area = (Composite) super.createDialogArea(parent);
+
+ Label idLabel = new Label(area, SWT.NULL);
+ idLabel.setText(Messages.RemoteTaskSelectionDialog_Enter_Key_ID__use_comma_for_multiple_);
+ idText = new Text(area, SWT.BORDER);
+ idText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Label matchingTasksLabel = new Label(area, SWT.NONE);
+ matchingTasksLabel.setText(Messages.RemoteTaskSelectionDialog_Matching_tasks);
+ tasksViewer = new TableViewer(area, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ tasksViewer.getControl().setLayoutData(GridDataFactory.fillDefaults().grab(true, true).hint(400, 200).create());
+ tasksViewer.setLabelProvider(new DecoratingLabelProvider(new TaskElementLabelProvider(true),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
+ tasksViewer.setContentProvider(new ArrayContentProvider());
+ tasksViewer.addFilter(new ViewerFilter() {
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (selectedIds == null) {
+ return false;
+ }
+
+ // Only shows exact task matches
+ if (!(element instanceof ITask)) {
+ return false;
+ }
+ ITask task = (ITask) element;
+ String taskId = task.getTaskKey();
+ for (String id : selectedIds) {
+ if (id.equals(taskId)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ });
+ tasksViewer.setInput(TasksUiPlugin.getTaskList().getAllTasks());
+ idText.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ computeIds();
+ validate();
+ tasksViewer.refresh(false);
+ }
+
+ });
+ tasksViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ validate();
+ }
+
+ });
+ tasksViewer.addOpenListener(new IOpenListener() {
+
+ public void open(OpenEvent event) {
+ if (getOkButton().getEnabled()) {
+ okPressed();
+ }
+ }
+
+ });
+ Table table = tasksViewer.getTable();
+ table.showSelection();
+
+ Composite repositoriesComposite = new Composite(area, SWT.NONE);
+ repositoriesComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+ repositoriesComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).create());
+
+ Label repositoriesLabel = new Label(repositoriesComposite, SWT.NONE);
+ repositoriesLabel.setText(Messages.RemoteTaskSelectionDialog_Select_a_task_repository);
+
+ repositoriesViewer = new ComboViewer(repositoriesComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
+ repositoriesViewer.setLabelProvider(new TaskRepositoryLabelProvider());
+ repositoriesViewer.setContentProvider(new ArrayContentProvider());
+ List<TaskRepository> taskRepositories = getTaskRepositories();
+ repositoriesViewer.setInput(taskRepositories);
+ if (taskRepositories.size() == 1) {
+ repositoriesViewer.setSelection(new StructuredSelection(taskRepositories.get(0)));
+ }
+ TaskRepository currentRepository = TasksUiUtil.getSelectedRepository(null);
+ if (currentRepository != null) {
+ repositoriesViewer.setSelection(new StructuredSelection(currentRepository), true);
+ }
+ repositoriesViewer.getControl().setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
+ repositoriesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ tasksViewer.setSelection(StructuredSelection.EMPTY);
+ validate();
+ }
+
+ });
+
+ Button addRepositoryButton = new Button(repositoriesComposite, SWT.NONE);
+ addRepositoryButton.setText(Messages.RemoteTaskSelectionDialog_Add_);
+ addRepositoryButton.setEnabled(TasksUiPlugin.getRepositoryManager().hasUserManagedRepositoryConnectors());
+ addRepositoryButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ IHandlerService hndSvc = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+ try {
+ hndSvc.executeCommand(ITaskCommandIds.ADD_TASK_REPOSITORY, null);
+ repositoriesViewer.setInput(getTaskRepositories());
+ } catch (CommandException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ }
+ });
+
+ Composite addToTaskListComposite = new Composite(area, SWT.NONE);
+ addToTaskListComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
+
+ addToTaskListCheck = new Button(addToTaskListComposite, SWT.CHECK);
+ addToTaskListCheck.setText(Messages.RemoteTaskSelectionDialog_Add_to_Task_List_category);
+
+ categoryViewer = new ComboViewer(addToTaskListComposite, SWT.DROP_DOWN | SWT.READ_ONLY);
+ categoryViewer.setContentProvider(new ArrayContentProvider());
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ LinkedList<AbstractTaskContainer> categories = new LinkedList<AbstractTaskContainer>(taskList.getCategories());
+ categories.addFirst(taskList.getDefaultCategory());
+ categoryViewer.setInput(categories);
+ categoryViewer.setLabelProvider(new LabelProvider() {
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof IRepositoryElement) {
+ return ((IRepositoryElement) element).getSummary();
+ }
+ return super.getText(element);
+ }
+
+ });
+ categoryViewer.setSelection(new StructuredSelection(taskList.getDefaultCategory()));
+
+ categoryViewer.getControl().setEnabled(addToTaskListCheck.getSelection());
+ addToTaskListCheck.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ categoryViewer.getControl().setEnabled(addToTaskListCheck.getSelection());
+ }
+
+ });
+
+ idText.addKeyListener(new KeyAdapter() {
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == SWT.ARROW_DOWN) {
+ tasksViewer.getControl().setFocus();
+ }
+ }
+
+ });
+
+ return area;
+ }
+
+ private void validate() {
+ if (idText.getText().trim().equals("")) { //$NON-NLS-1$
+ updateStatus(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, 0,
+ Messages.RemoteTaskSelectionDialog_Enter_a_valid_task_ID, null));
+ return;
+ }
+ if (tasksViewer.getSelection().isEmpty() && repositoriesViewer.getSelection().isEmpty()) {
+ updateStatus(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, 0,
+ Messages.RemoteTaskSelectionDialog_Select_a_task_or_repository, null));
+ return;
+ }
+ updateStatus(new Status(IStatus.OK, TasksUiPlugin.ID_PLUGIN, 0, "", null)); //$NON-NLS-1$
+ }
+
+ private String[] selectedIds;
+
+ private TaskRepository selectedRepository;
+
+ private AbstractTask selectedTask;
+
+ private boolean shouldAddToTaskList;
+
+ private AbstractTaskCategory selectedCategory;
+
+ public String[] getSelectedIds() {
+ return selectedIds;
+ }
+
+ public TaskRepository getSelectedTaskRepository() {
+ return selectedRepository;
+ }
+
+ public AbstractTask getSelectedTask() {
+ return selectedTask;
+ }
+
+ public boolean shouldAddToTaskList() {
+ return shouldAddToTaskList;
+ }
+
+ public AbstractTaskCategory getSelectedCategory() {
+ return selectedCategory;
+ }
+
+ @Override
+ protected void computeResult() {
+ computeIds();
+
+ ISelection taskSelection = tasksViewer.getSelection();
+ if (!taskSelection.isEmpty()) {
+ selectedTask = (AbstractTask) ((IStructuredSelection) taskSelection).getFirstElement();
+ } else {
+ selectedRepository = (TaskRepository) ((IStructuredSelection) repositoriesViewer.getSelection()).getFirstElement();
+ }
+ shouldAddToTaskList = addToTaskListCheck.getSelection();
+ if (shouldAddToTaskList) {
+ selectedCategory = (AbstractTaskCategory) ((IStructuredSelection) categoryViewer.getSelection()).getFirstElement();
+ }
+ }
+
+ private void computeIds() {
+ selectedIds = idText.getText().split(","); //$NON-NLS-1$
+ for (String id : selectedIds) {
+ id = id.trim();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/SubmitTaskHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/SubmitTaskHandler.java
new file mode 100644
index 0000000..9e6460d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/SubmitTaskHandler.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SubmitTaskHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchSite site = HandlerUtil.getActiveSite(event);
+ if (site instanceof IEditorSite) {
+ IWorkbenchPart part = ((IEditorSite) site).getPart();
+ if (part instanceof FormEditor) {
+ IFormPage page = ((FormEditor) part).getActivePageInstance();
+ if (page instanceof AbstractTaskEditorPage) {
+ ((AbstractTaskEditorPage) page).doSubmit();
+ }
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/TaskListToolTipHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/TaskListToolTipHandler.java
new file mode 100644
index 0000000..21f59f0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/TaskListToolTipHandler.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.commands;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskListToolTipHandler extends AbstractTaskListViewHandler {
+
+ @Override
+ protected void execute(ExecutionEvent event, TaskListView taskListView) throws ExecutionException {
+ TaskListToolTip toolTip = taskListView.getToolTip();
+ if (toolTip.isVisible()) {
+ toolTip.hide();
+ } else {
+ taskListView.getViewer().getControl().getBounds();
+ Tree tree = taskListView.getViewer().getTree();
+ TreeItem[] selection = tree.getSelection();
+ if (selection.length > 0) {
+ toolTip.show(new Point(selection[0].getBounds().x + 1, selection[0].getBounds().y + 1));
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/TaskRepositoryParameterValues.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/TaskRepositoryParameterValues.java
new file mode 100644
index 0000000..78509b4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/TaskRepositoryParameterValues.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.commands;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.commands.IParameterValues;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * Compute repository connectors type/label map
+ *
+ * @author Willian Mitsuda
+ */
+public class TaskRepositoryParameterValues implements IParameterValues {
+
+ public Map<String, String> getParameterValues() {
+ Collection<AbstractRepositoryConnector> connectors = TasksUi.getRepositoryManager().getRepositoryConnectors();
+ Map<String, String> values = new HashMap<String, String>();
+ for (AbstractRepositoryConnector connector : connectors) {
+ values.put(connector.getConnectorKind(), connector.getLabel());
+ }
+ return values;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/ViewSourceHandler.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/ViewSourceHandler.java
new file mode 100644
index 0000000..be06428
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/ViewSourceHandler.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jingwen Ou 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:
+ * Jingwen Ou - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.commands;
+
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.HandlerEvent;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.IElementUpdater;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.menus.UIElement;
+
+/**
+ * @author Jingwen Ou
+ * @author Steffen Pingel
+ */
+public class ViewSourceHandler extends AbstractHandler implements IElementUpdater {
+
+ private static boolean checked;
+
+ private static ViewSourceHandler instance;
+
+ public ViewSourceHandler() {
+ instance = this;
+ }
+
+ public boolean isChecked() {
+ return checked;
+ }
+
+ public static void setChecked(boolean checked) {
+ ViewSourceHandler.checked = checked;
+ if (instance != null) {
+ instance.fireHandlerChanged(new HandlerEvent(instance, true, false));
+ }
+ }
+
+ private Control getFocusControl() {
+ return PlatformUI.getWorkbench().getDisplay().getFocusControl();
+ }
+
+ @Override
+ public boolean isEnabled() {
+ Control focusControl = getFocusControl();
+ if (focusControl instanceof StyledText && focusControl.getData(VIEW_SOURCE_ACTION) instanceof IAction) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public static final String VIEW_SOURCE_ACTION = "viewSourceAction"; //$NON-NLS-1$
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchSite site = HandlerUtil.getActiveSite(event);
+ if (site instanceof IEditorSite) {
+ IWorkbenchPart part = ((IEditorSite) site).getPart();
+ if (part instanceof FormEditor) {
+ IFormPage page = ((FormEditor) part).getActivePageInstance();
+ Control focusedControl = EditorUtil.getFocusControl(page);
+ if (focusedControl != null) {
+ Object data = focusedControl.getData(VIEW_SOURCE_ACTION);
+ if (data instanceof IAction) {
+ IAction action = (IAction) data;
+ action.setChecked(!action.isChecked());
+ action.run();
+ setChecked(action.isChecked());
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void updateElement(UIElement element, Map parameters) {
+ element.setChecked(checked);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/messages.properties
new file mode 100644
index 0000000..36acfab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/commands/messages.properties
@@ -0,0 +1,15 @@
+AddTaskRepositoryHandler_Add_Task_Repository=Add Task Repository
+
+NewLocalTaskHandler_Could_not_create_local_task=Could not create local task
+
+OpenTaskAttachmentInDefaultEditorHandler_Failed_to_open_editor=Failed to open editor
+OpenTaskAttachmentInDefaultEditorHandler_No_default_editor_for_X_found=No default editor for "{0}" found
+OpenTaskAttachmentInDefaultEditorHandler_Open_Attachment_Failed=Open Attachment Failed
+
+RemoteTaskSelectionDialog_Add_=&Add...
+RemoteTaskSelectionDialog_Add_to_Task_List_category=Add to Task &List category\:
+RemoteTaskSelectionDialog_Enter_Key_ID__use_comma_for_multiple_=Enter Key/&ID (use comma for multiple)\:\
+RemoteTaskSelectionDialog_Enter_a_valid_task_ID=Enter a valid task ID
+RemoteTaskSelectionDialog_Matching_tasks=&Matching tasks:
+RemoteTaskSelectionDialog_Select_a_task_or_repository=Select a task or repository
+RemoteTaskSelectionDialog_Select_a_task_repository=&Select a task repository\:
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/AbstractWorkingSetDialogCOPY.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/AbstractWorkingSetDialogCOPY.java
new file mode 100644
index 0000000..aa1dbdc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/AbstractWorkingSetDialogCOPY.java
@@ -0,0 +1,410 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ * IBM Corporation - initial API and implementation
+ * Sebastian Davids <sdavids at gmx.de> - Fix for bug 19346 - Dialog font
+ * should be activated and used by other components.
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.tasks.ui.dialogs;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
+import org.eclipse.ui.dialogs.IWorkingSetNewWizard;
+import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
+import org.eclipse.ui.internal.WorkbenchMessages;
+import org.eclipse.ui.internal.WorkbenchPlugin;
+import org.eclipse.ui.internal.WorkingSet;
+import org.eclipse.ui.internal.registry.WorkingSetRegistry;
+
+/**
+ * Abstract baseclass for various working set dialogs.
+ *
+ * COPIED FROM: AbstractWorkingSetDialog
+ */
+ at SuppressWarnings( { "unchecked", "null" })
+public abstract class AbstractWorkingSetDialogCOPY extends SelectionDialog implements IWorkingSetSelectionDialog {
+
+ private static final int ID_NEW = IDialogConstants.CLIENT_ID + 1;
+
+ private static final int ID_DETAILS = ID_NEW + 1;
+
+ private static final int ID_REMOVE = ID_DETAILS + 1;
+
+ private static final int ID_SELECTALL = ID_REMOVE + 1;
+
+ private static final int ID_DESELECTALL = ID_SELECTALL + 1;
+
+ private Button newButton;
+
+ private Button detailsButton;
+
+ private Button removeButton;
+
+ private Button selectAllButton;
+
+ private Button deselectAllButton;
+
+ private IWorkingSet[] result;
+
+ private List addedWorkingSets;
+
+ private List removedWorkingSets;
+
+ private Map editedWorkingSets;
+
+ private List removedMRUWorkingSets;
+
+ private Set workingSetIds;
+
+ private final boolean canEdit;
+
+ protected AbstractWorkingSetDialogCOPY(Shell parentShell, String[] workingSetIds, boolean canEdit) {
+ super(parentShell);
+ if (workingSetIds != null) {
+ this.workingSetIds = new HashSet();
+ for (String workingSetId : workingSetIds) {
+ this.workingSetIds.add(workingSetId);
+ }
+ }
+ this.canEdit = canEdit;
+ }
+
+ /**
+ * Return the set of supported working set types.
+ *
+ * @return the supported working set types
+ */
+ protected Set getSupportedWorkingSetIds() {
+ return workingSetIds;
+ }
+
+ /**
+ * Adds the modify buttons to the dialog.
+ *
+ * @param composite
+ * Composite to add the buttons to
+ */
+ protected void addModifyButtons(Composite composite) {
+ Composite buttonComposite = new Composite(composite, SWT.RIGHT);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = layout.marginWidth = 0;
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ buttonComposite.setLayout(layout);
+ GridData data = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.GRAB_VERTICAL);
+ buttonComposite.setLayoutData(data);
+
+ newButton = createButton(buttonComposite, ID_NEW, WorkbenchMessages.WorkingSetSelectionDialog_newButton_label,
+ false);
+ newButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ createWorkingSet();
+ }
+ });
+
+ if (canEdit) {
+ detailsButton = createButton(buttonComposite, ID_DETAILS,
+ WorkbenchMessages.WorkingSetSelectionDialog_detailsButton_label, false);
+ detailsButton.setEnabled(false);
+ detailsButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ editSelectedWorkingSet();
+ }
+ });
+
+ removeButton = createButton(buttonComposite, ID_REMOVE,
+ WorkbenchMessages.WorkingSetSelectionDialog_removeButton_label, false);
+ removeButton.setEnabled(false);
+ removeButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ removeSelectedWorkingSets();
+ }
+ });
+ }
+
+ layout.numColumns = 1; // must manually reset the number of columns because createButton increments it - we want these buttons to be laid out vertically.
+ }
+
+ /**
+ * Add the select/deselect buttons.
+ *
+ * @param composite
+ * Composite to add the buttons to
+ */
+ protected void addSelectionButtons(Composite composite) {
+ Composite buttonComposite = new Composite(composite, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = layout.marginWidth = 0;
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ buttonComposite.setLayout(layout);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ buttonComposite.setLayoutData(data);
+
+ selectAllButton = createButton(buttonComposite, ID_SELECTALL, WorkbenchMessages.SelectionDialog_selectLabel,
+ false);
+ selectAllButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectAllSets();
+ }
+ });
+
+ deselectAllButton = createButton(buttonComposite, ID_DESELECTALL,
+ WorkbenchMessages.SelectionDialog_deselectLabel, false);
+ deselectAllButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ deselectAllSets();
+ }
+ });
+ }
+
+ /**
+ * Select all working sets.
+ */
+ protected abstract void selectAllSets();
+
+ /**
+ * Deselect all working sets.
+ */
+ protected abstract void deselectAllSets();
+
+ /**
+ * Opens a working set wizard for editing the currently selected working set.
+ *
+ * @see org.eclipse.ui.dialogs.IWorkingSetPage
+ */
+ void editSelectedWorkingSet() {
+ IWorkingSetManager manager = WorkbenchPlugin.getDefault().getWorkingSetManager();
+ IWorkingSet editWorkingSet = (IWorkingSet) getSelectedWorkingSets().get(0);
+ IWorkingSetEditWizard wizard = manager.createWorkingSetEditWizard(editWorkingSet);
+ WizardDialog dialog = new WizardDialog(getShell(), wizard);
+ IWorkingSet originalWorkingSet = (IWorkingSet) editedWorkingSets.get(editWorkingSet);
+ boolean firstEdit = originalWorkingSet == null;
+
+ // save the original working set values for restoration when selection
+ // dialog is cancelled.
+ if (firstEdit) {
+ originalWorkingSet = new WorkingSet(editWorkingSet.getName(), editWorkingSet.getLabel(),
+ editWorkingSet.getElements());
+ } else {
+ editedWorkingSets.remove(editWorkingSet);
+ }
+ dialog.create();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
+ IWorkbenchHelpContextIds.WORKING_SET_EDIT_WIZARD);
+ if (dialog.open() == Window.OK) {
+ editWorkingSet = wizard.getSelection();
+ availableWorkingSetsChanged();
+ // make sure ok button is enabled when the selected working set
+ // is edited. Fixes bug 33386.
+ updateButtonAvailability();
+ }
+ editedWorkingSets.put(editWorkingSet, originalWorkingSet);
+ }
+
+ /**
+ * Opens a working set wizard for creating a new working set.
+ */
+ void createWorkingSet() {
+ IWorkingSetManager manager = WorkbenchPlugin.getDefault().getWorkingSetManager();
+ String ids[] = null;
+ if (workingSetIds != null) {
+ ids = (String[]) workingSetIds.toArray(new String[workingSetIds.size()]);
+ }
+ IWorkingSetNewWizard wizard = manager.createWorkingSetNewWizard(ids);
+ // the wizard can never be null since we have at least a resource
+ // working set
+ // creation page
+ WizardDialog dialog = new WizardDialog(getShell(), wizard);
+
+ dialog.create();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
+ IWorkbenchHelpContextIds.WORKING_SET_NEW_WIZARD);
+ if (dialog.open() == Window.OK) {
+ IWorkingSet workingSet = wizard.getSelection();
+ manager.addWorkingSet(workingSet);
+ addedWorkingSets.add(workingSet);
+ availableWorkingSetsChanged();
+ }
+ }
+
+ protected abstract List getSelectedWorkingSets();
+
+ /**
+ * Notifies the dialog that there has been a change to the sets available for use. In other words, the user has
+ * either added, deleted or renamed a set.
+ * <p>
+ * Subclasses should override, but should call <code>super.availableWorkingSetsChanged</code> to update the
+ * selection button enablements.
+ * </p>
+ */
+ protected void availableWorkingSetsChanged() {
+ boolean enable = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets().length > 0;
+ if (!(selectAllButton == null || selectAllButton.isDisposed())) {
+ selectAllButton.setEnabled(enable);
+ }
+ if (!(deselectAllButton == null || deselectAllButton.isDisposed())) {
+ deselectAllButton.setEnabled(enable);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.IWorkingSetSelectionDialog#getSelection()
+ */
+ public IWorkingSet[] getSelection() {
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.dialogs.IWorkingSetSelectionDialog#setSelection(org.eclipse.ui.IWorkingSet[])
+ */
+ public void setSelection(IWorkingSet[] selection) {
+ result = selection;
+ }
+
+ /**
+ * Overrides method in Dialog
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#open()
+ */
+ @Override
+ public int open() {
+ addedWorkingSets = new ArrayList();
+ removedWorkingSets = new ArrayList();
+ editedWorkingSets = new HashMap();
+ removedMRUWorkingSets = new ArrayList();
+ return super.open();
+ }
+
+ /**
+ * Return the list of working sets that were added during the life of this dialog.
+ *
+ * @return the working sets
+ */
+ protected final List getAddedWorkingSets() {
+ return addedWorkingSets;
+ }
+
+ /**
+ * Return the map of working sets that were edited during the life of this dialog.
+ *
+ * @return the working sets
+ */
+ protected final Map getEditedWorkingSets() {
+ return editedWorkingSets;
+ }
+
+ /**
+ * Return the list of working sets that were removed from the MRU list during the life of this dialog.
+ *
+ * @return the working sets
+ */
+ protected final List getRemovedMRUWorkingSets() {
+ return removedMRUWorkingSets;
+ }
+
+ /**
+ * Return the list of working sets that were removed during the life of this dialog.
+ *
+ * @return the working sets
+ */
+ protected final List getRemovedWorkingSets() {
+ return removedWorkingSets;
+ }
+
+ /**
+ * Updates the modify buttons' enabled state based on the current seleciton.
+ */
+ protected void updateButtonAvailability() {
+ List selection = getSelectedWorkingSets();
+ boolean hasSelection = selection != null && !selection.isEmpty();
+ boolean hasSingleSelection = hasSelection;
+ WorkingSetRegistry registry = WorkbenchPlugin.getDefault().getWorkingSetRegistry();
+
+ newButton.setEnabled(registry.hasNewPageWorkingSetDescriptor());
+
+ if (canEdit) {
+ removeButton.setEnabled(hasSelection);
+ }
+
+ IWorkingSet selectedWorkingSet = null;
+ if (hasSelection) {
+ hasSingleSelection = selection.size() == 1;
+ if (hasSingleSelection) {
+ selectedWorkingSet = (IWorkingSet) selection.get(0);
+ }
+ }
+ if (canEdit) {
+ detailsButton.setEnabled(hasSingleSelection && selectedWorkingSet.isEditable());
+ }
+
+ getOkButton().setEnabled(true);
+ }
+
+ /**
+ * Removes the selected working sets from the workbench.
+ */
+ protected void removeSelectedWorkingSets() {
+ List selection = getSelectedWorkingSets();
+ removeSelectedWorkingSets(selection);
+ }
+
+ /**
+ * Remove the working sets contained in the provided selection from the working set manager.
+ *
+ * @param selection
+ * the sets
+ */
+ protected void removeSelectedWorkingSets(List selection) {
+ IWorkingSetManager manager = WorkbenchPlugin.getDefault().getWorkingSetManager();
+ Iterator iter = selection.iterator();
+ while (iter.hasNext()) {
+ IWorkingSet workingSet = (IWorkingSet) iter.next();
+ if (getAddedWorkingSets().contains(workingSet)) {
+ getAddedWorkingSets().remove(workingSet);
+ } else {
+ IWorkingSet[] recentWorkingSets = manager.getRecentWorkingSets();
+ for (IWorkingSet recentWorkingSet : recentWorkingSets) {
+ if (workingSet.equals(recentWorkingSet)) {
+ getRemovedMRUWorkingSets().add(workingSet);
+ break;
+ }
+ }
+ getRemovedWorkingSets().add(workingSet);
+ }
+ manager.removeWorkingSet(workingSet);
+ }
+ availableWorkingSetsChanged();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/Messages.java
new file mode 100644
index 0000000..384f9d6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/Messages.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.dialogs;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.dialogs.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TaskCompareDialog_Ascending;
+
+ public static String TaskCompareDialog_Descending;
+
+ public static String TaskCompareDialog_Sort_by;
+
+ public static String TaskCompareDialog_Sorting;
+
+ public static String TaskCompareDialog_Tasks;
+
+ public static String TaskCompareDialog_Then_by;
+
+ public static String TaskListSortDialog_Queries_and_Categories;
+
+ public static String TaskListSortDialog_Grouped_by;
+
+ public static String TaskListSortDialog_Title;
+
+ public static String TaskRepositoryCredentialsDialog_Enter_Credentials;
+
+ public static String TaskRepositoryCredentialsDialog_Enter_repository_credentials;
+
+ public static String TaskRepositoryCredentialsDialog_HTML_Open_Repository_Properties;
+
+ public static String TaskRepositoryCredentialsDialog_Password;
+
+ public static String TaskRepositoryCredentialsDialog_Repository_Authentication;
+
+ public static String TaskRepositoryCredentialsDialog_Save_Password;
+
+ public static String TaskRepositoryCredentialsDialog_Saved_passwords_are_stored_that_is_difficult;
+
+ public static String TaskRepositoryCredentialsDialog_Task_Repository;
+
+ public static String TaskRepositoryCredentialsDialog_User_ID;
+
+ public static String UiLegendControl_Active_task;
+
+ public static String UiLegendControl_Adjust_Colors_and_Fonts_;
+
+ public static String UiLegendControl_Also_see_the_Getting_Started_documentation_online;
+
+ public static String UiLegendControl_Category;
+
+ public static String UiLegendControl_Completed;
+
+ public static String UiLegendControl_Completed_today;
+
+ public static String UiLegendControl_Conflicting_changes;
+
+ public static String UiLegendControl_Date_range;
+
+ public static String UiLegendControl__default_;
+
+ public static String UiLegendControl_Focus_view_on_active_task;
+
+ public static String UiLegendControl_Has_due_date;
+
+ public static String UiLegendControl_http_www_eclipse_org_mylyn_start;
+
+ public static String UiLegendControl_Inactive_task_with_context;
+
+ public static String UiLegendControl_Inactive_task_with_no_context;
+
+ public static String UiLegendControl_Incoming_changes;
+
+ public static String UiLegendControl_New_task;
+
+ public static String UiLegendControl_Open_Task_List_;
+
+ public static String UiLegendControl_Outgoing_changes;
+
+ public static String UiLegendControl_Past_Due_date;
+
+ public static String UiLegendControl_Past_scheduled_date;
+
+ public static String UiLegendControl_Priorities;
+
+ public static String UiLegendControl_Query;
+
+ public static String UiLegendControl_Scheduled_for_today;
+
+ public static String UiLegendControl_Synchronization;
+
+ public static String UiLegendControl_Synchronization_failed;
+
+ public static String UiLegendControl_Task;
+
+ public static String UiLegendControl_Task_Activity;
+
+ public static String UiLegendControl_Task_Context;
+
+ public static String UiLegendControl_Tasks;
+
+ public static String UiLegendControl_Tasks_UI_Legend;
+
+ public static String UiLegendControl_Unsubmitted_outgoing_changes;
+
+ public static String UiLegendDialog_Close_Dialog;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskCompareDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskCompareDialog.java
new file mode 100644
index 0000000..4b85516
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskCompareDialog.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.dialogs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator;
+import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion.SortKey;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * @author FrankBecker
+ */
+public class TaskCompareDialog extends SelectionDialog {
+
+ private Combo[] priorityCombos;
+
+ private Button[] ascendingButtons;
+
+ private Button[] descendingButtons;
+
+ private final String[] propertyText;
+
+ private boolean dirty = false;
+
+ private final TaskComparator taskComparator;
+
+ private String selectedValueLastCombo;
+
+ public TaskCompareDialog(IShellProvider parentShell, TaskComparator taskComparator) {
+ super(parentShell.getShell());
+ SortCriterion.SortKey[] values = SortCriterion.SortKey.values();
+ propertyText = new String[values.length];
+ for (int i = 0; i < values.length; i++) {
+ propertyText[i] = values[i].getLabel();
+ }
+ this.taskComparator = taskComparator;
+ setTitle(Messages.TaskCompareDialog_Sorting);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ initializeDialogUnits(composite);
+ Control control = createContentArea(composite);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(control);
+ Dialog.applyDialogFont(parent);
+ return composite;
+ }
+
+ protected Control createContentArea(Composite parent) {
+ Group prioritiesArea = new Group(parent, SWT.NONE);
+ prioritiesArea.setLayout(new GridLayout(3, false));
+ prioritiesArea.setText(Messages.TaskCompareDialog_Tasks);
+
+ ascendingButtons = new Button[SortCriterion.kindCount];
+ descendingButtons = new Button[SortCriterion.kindCount];
+ priorityCombos = new Combo[SortCriterion.kindCount];
+
+ for (int i = 0; i < SortCriterion.kindCount; i++) {
+ final int index = i;
+ Label numberLabel = new Label(prioritiesArea, SWT.NONE);
+ if (i == 0) {
+ numberLabel.setText(Messages.TaskCompareDialog_Sort_by);
+ } else {
+ numberLabel.setText(Messages.TaskCompareDialog_Then_by);
+ }
+// numberLabel.setText("" + (i + 1) + "."); //$NON-NLS-1$ //$NON-NLS-2$
+ priorityCombos[i] = new Combo(prioritiesArea, SWT.READ_ONLY);
+ priorityCombos[i].setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite directionGroup = new Composite(prioritiesArea, SWT.NONE);
+ directionGroup.setLayout(new GridLayout(2, false));
+ ascendingButtons[i] = new Button(directionGroup, SWT.RADIO);
+ ascendingButtons[i].setText(Messages.TaskCompareDialog_Ascending);
+ ascendingButtons[i].addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ markDirty();
+ }
+ });
+ descendingButtons[i] = new Button(directionGroup, SWT.RADIO);
+ descendingButtons[i].setText(Messages.TaskCompareDialog_Descending);
+ descendingButtons[i].addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ markDirty();
+ }
+ });
+ if (i < priorityCombos.length) {
+ priorityCombos[i].addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+// int oldSelectionDirection = 1;
+// if (descendingButtons[index].getSelection()) {
+// oldSelectionDirection = -1;
+// }
+ ArrayList<String> oldSelectionList = new ArrayList<String>(
+ Arrays.asList(priorityCombos[index].getItems()));
+ String oldSelection;
+ if (index + 1 == SortCriterion.kindCount) {
+ oldSelection = selectedValueLastCombo;
+ } else {
+ oldSelectionList.removeAll(Arrays.asList(priorityCombos[index + 1].getItems()));
+ oldSelection = propertyText[SortKey.NONE.ordinal()];
+ if (oldSelectionList.size() == 1) {
+ oldSelection = oldSelectionList.get(0);
+ }
+ }
+ String newSelection = priorityCombos[index].getItem(priorityCombos[index].getSelectionIndex());
+ if (oldSelection.equals(newSelection)) {
+ return;
+ }
+ if (index + 1 == SortCriterion.kindCount) {
+ selectedValueLastCombo = newSelection;
+ }
+ if (oldSelection.equals(propertyText[SortKey.NONE.ordinal()])) {
+ ascendingButtons[index].setEnabled(true);
+ descendingButtons[index].setEnabled(true);
+ if (index + 1 < SortCriterion.kindCount) {
+ priorityCombos[index + 1].setEnabled(true);
+ ArrayList<String> availablePriorities = new ArrayList<String>(
+ Arrays.asList(priorityCombos[index].getItems()));
+ availablePriorities.remove(newSelection);
+ for (int k = index + 1; k < SortCriterion.kindCount; k++) {
+ priorityCombos[k].removeAll();
+ for (int j = 0; j < availablePriorities.size(); j++) {
+ priorityCombos[k].add(availablePriorities.get(j));
+ }
+ priorityCombos[k].select(priorityCombos[k].indexOf(propertyText[SortKey.NONE.ordinal()]));
+ }
+ }
+ } else if (newSelection.equals(propertyText[SortKey.NONE.ordinal()])) {
+ ascendingButtons[index].setEnabled(false);
+ descendingButtons[index].setEnabled(false);
+ if (index + 1 < SortCriterion.kindCount) {
+ ArrayList<String> availablePriorities = new ArrayList<String>(
+ Arrays.asList(priorityCombos[index].getItems()));
+ for (int k = index + 1; k < SortCriterion.kindCount; k++) {
+ priorityCombos[k].setEnabled(true);
+ priorityCombos[k].removeAll();
+ for (int j = 0; j < availablePriorities.size(); j++) {
+ priorityCombos[k].add(availablePriorities.get(j));
+ }
+ priorityCombos[k].select(priorityCombos[k].indexOf(propertyText[SortKey.NONE.ordinal()]));
+ priorityCombos[k].setEnabled(false);
+ ascendingButtons[k].setEnabled(false);
+ descendingButtons[k].setEnabled(false);
+ }
+ }
+ } else {
+ for (int j = index + 1; j < priorityCombos.length; j++) {
+ int newSelectionIndex = priorityCombos[j].indexOf(newSelection);
+ //this combo's current selection is equal to newSelection
+ if (priorityCombos[j].getSelectionIndex() == newSelectionIndex) {
+ priorityCombos[j].remove(newSelection);
+ int insertionPoint = -1
+ - Arrays.binarySearch(priorityCombos[j].getItems(), oldSelection,
+ columnComparator);
+ if (insertionPoint >= 0 && insertionPoint <= priorityCombos[j].getItemCount()) {
+ priorityCombos[j].add(oldSelection, insertionPoint);
+ } else {
+ priorityCombos[j].add(oldSelection);
+ }
+ priorityCombos[j].select(priorityCombos[j].indexOf(oldSelection));
+// remove the comment if you want to move the current ascending/descending
+// ascendingButtons[index].setSelection(ascendingButtons[j].getSelection());
+// descendingButtons[index].setSelection(descendingButtons[j].getSelection());
+// ascendingButtons[j].setSelection(oldSelectionDirection == 1);
+// descendingButtons[j].setSelection(oldSelectionDirection == -1);
+ }
+ //this combo contains newSelection
+ else if (newSelectionIndex >= 0) {
+ String currentText = priorityCombos[j].getText();
+ priorityCombos[j].remove(newSelection);
+ int insertionPoint = -1
+ - Arrays.binarySearch(priorityCombos[j].getItems(), oldSelection,
+ columnComparator);
+ if (insertionPoint >= 0 && insertionPoint <= priorityCombos[j].getItemCount()) {
+ priorityCombos[j].add(oldSelection, insertionPoint);
+ priorityCombos[j].select(priorityCombos[j].indexOf(currentText));
+ } else {
+ priorityCombos[j].add(oldSelection);
+ }
+ }
+ }
+ }
+ markDirty();
+ }
+ });
+ } else {
+ priorityCombos[i].addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ markDirty();
+ }
+ });
+ }
+
+ }
+ updateUI();
+ return prioritiesArea;
+ }
+
+ @Override
+ protected void okPressed() {
+ if (isDirty()) {
+ for (int i = 0; i < SortCriterion.kindCount; i++) {
+ SortCriterion keyEntries = taskComparator.getSortCriterion(i);
+ keyEntries.setKey(SortKey.valueOfLabel(priorityCombos[i].getText()));
+ if (descendingButtons[i].getSelection()) {
+ keyEntries.setDirection(-1);
+ } else {
+ keyEntries.setDirection(1);
+ }
+ }
+ }
+ super.okPressed();
+ }
+
+ protected boolean isDirty() {
+ return dirty;
+ }
+
+ /**
+ * Sets the dirty flag to true.
+ */
+ protected void markDirty() {
+ dirty = true;
+ }
+
+ private final Comparator<String> columnComparator = new Comparator<String>() {
+ public int compare(String arg0, String arg1) {
+ int index0 = -1;
+ int index1 = -1;
+ for (int i = 0; i < propertyText.length; i++) {
+ if (propertyText[i].equals(arg0)) {
+ index0 = i;
+ }
+ if (propertyText[i].equals(arg1)) {
+ index1 = i;
+ }
+ }
+ return index0 - index1;
+ }
+ };
+
+ protected void updateUI() {
+ ArrayList<String> availablePriorities = new ArrayList<String>(Arrays.asList(propertyText));
+ for (int i = 0; i < TaskComparator.CRITERIA_COUNT; i++) {
+ SortCriterion criterion = taskComparator.getSortCriterion(i);
+ priorityCombos[i].removeAll();
+ for (int j = 0; j < availablePriorities.size(); j++) {
+ priorityCombos[i].add(availablePriorities.get(j));
+ }
+ priorityCombos[i].select(priorityCombos[i].indexOf(propertyText[criterion.getKey().ordinal()]));
+ ascendingButtons[i].setSelection(criterion.getDirection() == 1);
+ descendingButtons[i].setSelection(criterion.getDirection() == -1);
+ if (i == TaskComparator.CRITERIA_COUNT - 1) {
+ selectedValueLastCombo = propertyText[criterion.getKey().ordinal()];
+ }
+ if (criterion.getKey() != SortKey.NONE) {
+ availablePriorities.remove(propertyText[criterion.getKey().ordinal()]);
+ } else {
+ ascendingButtons[i].setEnabled(false);
+ descendingButtons[i].setEnabled(false);
+ for (int k = i + 1; k < TaskComparator.CRITERIA_COUNT; k++) {
+ for (int j = 0; j < availablePriorities.size(); j++) {
+ priorityCombos[k].add(availablePriorities.get(j));
+ }
+ priorityCombos[k].select(priorityCombos[k].indexOf(propertyText[SortKey.NONE.ordinal()]));
+ if (k == TaskComparator.CRITERIA_COUNT - 1) {
+ selectedValueLastCombo = propertyText[SortKey.NONE.ordinal()];
+ }
+ ascendingButtons[k].setSelection(taskComparator.getSortCriterion(k).getDirection() == 1);
+ descendingButtons[k].setSelection(taskComparator.getSortCriterion(k).getDirection() == -1);
+ priorityCombos[k].setEnabled(false);
+ ascendingButtons[k].setEnabled(false);
+ descendingButtons[k].setEnabled(false);
+ }
+ break;
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskListSortDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskListSortDialog.java
new file mode 100644
index 0000000..5950670
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskListSortDialog.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.dialogs;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListSorter.GroupBy;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class TaskListSortDialog extends TaskCompareDialog {
+
+ private Combo modeCombo;
+
+ private final TaskListView taskListView;
+
+ public TaskListSortDialog(IShellProvider parentShell, TaskListView taskListView) {
+ super(parentShell, taskListView.getSorter().getComparator());
+ this.taskListView = taskListView;
+ setTitle(Messages.TaskListSortDialog_Title);
+ }
+
+ @Override
+ protected Control createContentArea(Composite parent) {
+ Composite container = new Composite(parent, SWT.NONE);
+ container.setLayout(GridLayoutFactory.fillDefaults().create());
+
+ Group groupByComposite = new Group(container, SWT.NONE);
+ groupByComposite.setLayout(new GridLayout(2, false));
+ groupByComposite.setText(Messages.TaskListSortDialog_Queries_and_Categories);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(groupByComposite);
+
+ Label numberLabel = new Label(groupByComposite, SWT.NULL);
+ numberLabel.setText(Messages.TaskListSortDialog_Grouped_by);
+ modeCombo = new Combo(groupByComposite, SWT.READ_ONLY);
+ modeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ GroupBy[] values = TaskListSorter.GroupBy.values();
+ for (GroupBy groupBy : values) {
+ modeCombo.add(groupBy.getLabel());
+ }
+ modeCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ markDirty();
+ }
+ });
+ modeCombo.select(taskListView.getSorter().getGroupBy().ordinal());
+
+ Control child = super.createContentArea(container);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(child);
+
+ return container;
+ }
+
+ @Override
+ protected void okPressed() {
+ if (isDirty()) {
+ int selectionIndex = modeCombo.getSelectionIndex();
+ if (selectionIndex != -1) {
+ taskListView.getSorter().setGroupBy(TaskListSorter.GroupBy.values()[selectionIndex]);
+ }
+ }
+ super.okPressed();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskRepositoryCredentialsDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskRepositoryCredentialsDialog.java
new file mode 100644
index 0000000..13a6b71
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/TaskRepositoryCredentialsDialog.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryCredentialsDialog extends TitleAreaDialog {
+
+ private static final String DIALOG_TITLE = Messages.TaskRepositoryCredentialsDialog_Enter_Credentials;
+
+ private static final String IMAGE_FILE_KEYLOCK = "icons/wizban/secur_role_wiz.gif"; //$NON-NLS-1$
+
+ public static final int TASK_REPOSITORY_CHANGED = 1000;
+
+ private static final String MESSAGE = Messages.TaskRepositoryCredentialsDialog_Enter_repository_credentials;
+
+ private static final String TITLE = Messages.TaskRepositoryCredentialsDialog_Repository_Authentication;
+
+ public static TaskRepositoryCredentialsDialog createDialog(Shell shell) {
+ return new TaskRepositoryCredentialsDialog(shell);
+ }
+
+ private Image keyLockImage;
+
+ private String message;
+
+ private String password = ""; //$NON-NLS-1$
+
+ private boolean savePassword;
+
+ private TaskRepository taskRepository;
+
+ private String username = ""; //$NON-NLS-1$
+
+ private TaskRepositoryCredentialsDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ @Override
+ public boolean close() {
+ if (keyLockImage != null) {
+ keyLockImage.dispose();
+ }
+ return super.close();
+ }
+
+ private void createLinkArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(1, false));
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Link link = new Link(composite, SWT.WRAP);
+ link.setText(Messages.TaskRepositoryCredentialsDialog_HTML_Open_Repository_Properties);
+ link.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ close();
+ int returnCode = TasksUiUtil.openEditRepositoryWizard(taskRepository);
+ if (returnCode == Window.OK) {
+ setReturnCode(TASK_REPOSITORY_CHANGED);
+ } else {
+ setReturnCode(returnCode);
+ }
+ }
+ });
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(
+ convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH), SWT.DEFAULT).grab(true,
+ false).applyTo(link);
+ }
+
+ private void createCenterArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout(2, false));
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ if (taskRepository != null) {
+ Composite labelComposite = new Composite(composite, SWT.NONE);
+ GridLayout layout = new GridLayout(3, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ labelComposite.setLayout(layout);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).span(2, 1).applyTo(
+ labelComposite);
+
+ Label label = new Label(labelComposite, SWT.NONE);
+ label.setImage(TasksUiPlugin.getDefault().getBrandingIcon(taskRepository.getConnectorKind()));
+
+ label = new Label(labelComposite, SWT.NONE);
+ label.setText(Messages.TaskRepositoryCredentialsDialog_Task_Repository);
+
+ label = new Label(labelComposite, SWT.NONE);
+ label.setText(taskRepository.getRepositoryLabel());
+ }
+
+ new Label(composite, SWT.NONE).setText(Messages.TaskRepositoryCredentialsDialog_User_ID);
+
+ final Text usernameField = new Text(composite, SWT.BORDER);
+ usernameField.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ username = usernameField.getText();
+ }
+ });
+ usernameField.setText(username);
+ if (username.length() == 0) {
+ usernameField.setFocus();
+ }
+ GridDataFactory.fillDefaults()
+ .align(SWT.FILL, SWT.CENTER)
+ .hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
+ .grab(true, false)
+ .applyTo(usernameField);
+
+ new Label(composite, SWT.NONE).setText(Messages.TaskRepositoryCredentialsDialog_Password);
+
+ final Text passwordField = new Text(composite, SWT.BORDER | SWT.PASSWORD);
+ passwordField.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ password = passwordField.getText();
+ }
+ });
+ passwordField.setText(password);
+ if (username.length() > 0) {
+ passwordField.setFocus();
+ }
+ GridDataFactory.fillDefaults()
+ .align(SWT.FILL, SWT.CENTER)
+ .hint(convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH), SWT.DEFAULT)
+ .grab(true, false)
+ .applyTo(passwordField);
+
+ final Button savePasswordButton = new Button(composite, SWT.CHECK);
+ savePasswordButton.setText(Messages.TaskRepositoryCredentialsDialog_Save_Password);
+ savePasswordButton.setSelection(savePassword);
+ savePasswordButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ savePassword = savePasswordButton.getSelection();
+ }
+ });
+ GridDataFactory.fillDefaults().span(2, 1).applyTo(savePasswordButton);
+
+ createWarningMessage(composite);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ getShell().setText(DIALOG_TITLE);
+
+ setTitle(TITLE);
+ Control control = super.createContents(parent);
+ if (taskRepository != null) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ if (connector != null) {
+ setTitle(connector.getShortLabel() + " " + TITLE); //$NON-NLS-1$
+ }
+ }
+
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(TasksUiPlugin.ID_PLUGIN,
+ IMAGE_FILE_KEYLOCK);
+ if (descriptor != null) {
+ keyLockImage = descriptor.createImage();
+ setTitleImage(keyLockImage);
+ }
+ if (message != null) {
+ super.setMessage(message);
+ } else {
+ super.setMessage(MESSAGE);
+ }
+ applyDialogFont(control);
+ return control;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite parent2 = (Composite) super.createDialogArea(parent);
+
+ Composite composite = new Composite(parent2, SWT.NONE);
+ composite.setLayout(new GridLayout(1, false));
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo(composite);
+
+ createCenterArea(composite);
+ if (taskRepository != null) {
+ createLinkArea(composite);
+ }
+
+ composite.pack();
+ return parent;
+ }
+
+ private void createWarningMessage(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ composite.setLayout(layout);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).span(2, 1).applyTo(composite);
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setImage(Dialog.getImage(DLG_IMG_MESSAGE_WARNING));
+ label.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ label = new Label(composite, SWT.WRAP);
+ label.setText(Messages.TaskRepositoryCredentialsDialog_Saved_passwords_are_stored_that_is_difficult);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(
+ convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH), SWT.DEFAULT).grab(true,
+ false).applyTo(label);
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public boolean getSavePassword() {
+ return savePassword;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ public String getUserName() {
+ return username;
+ }
+
+ @Override
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public void setPassword(String password) {
+ if (password == null) {
+ throw new IllegalArgumentException();
+ }
+ this.password = password;
+ }
+
+ public void setSavePassword(boolean savePassword) {
+ this.savePassword = savePassword;
+ }
+
+ public void setTaskRepository(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ public void setUsername(String username) {
+ if (username == null) {
+ throw new IllegalArgumentException();
+ }
+ this.username = username;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/UiLegendControl.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/UiLegendControl.java
new file mode 100644
index 0000000..eba1c9e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/UiLegendControl.java
@@ -0,0 +1,573 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.dialogs;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.LegendElement;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+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.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ */
+public class UiLegendControl extends Composite {
+
+ private final FormToolkit toolkit;
+
+ private Window window = null;
+
+ private final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(false);
+
+ private final IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+
+ private final ArrayList<LegendElement> legendElements = new ArrayList<LegendElement>();
+
+ public UiLegendControl(Composite parent, FormToolkit toolkit) {
+ this(parent, toolkit, true, SWT.VERTICAL);
+ }
+
+ public UiLegendControl(Composite parent, FormToolkit toolkit, boolean showConnectors, int style) {
+ super(parent, SWT.NONE);
+ this.toolkit = toolkit;
+ toolkit.adapt(this);
+
+ addListeners();
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.leftMargin = 0;
+ layout.rightMargin = 0;
+ layout.topMargin = 0;
+ layout.bottomMargin = 0;
+
+ if (style == SWT.DEFAULT) {
+ createContentsVertical(layout, showConnectors);
+ } else if ((style & SWT.HORIZONTAL) != 0) {
+ createContentsHorizontal(layout, showConnectors);
+ } else {
+ createContentsVertical(layout, showConnectors);
+ }
+
+ setLayout(layout);
+ setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.FILL_GRAB));
+ }
+
+ private void addListeners() {
+ addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ doDispose();
+ }
+ });
+ }
+
+ private void doDispose() {
+ for (LegendElement element : legendElements) {
+ element.dispose();
+ }
+ if (labelProvider != null) {
+ labelProvider.dispose();
+ }
+ dispose();
+ }
+
+ public void setWindow(Window window) {
+ this.window = window;
+ }
+
+ public boolean close() {
+ if (window != null) {
+ return window.close();
+ } else {
+ return false;
+ }
+ }
+
+ private void createContentsHorizontal(TableWrapLayout layout, boolean showConnectors) {
+ layout.numColumns = 2;
+ createTasksPrioritiesSection(this);
+ createContextSection(this);
+ createActivitySection(this);
+ createSynchronizationSection(this);
+
+ Composite subComp = toolkit.createComposite(this);
+ TableWrapLayout subLayout = new TableWrapLayout();
+ subLayout.topMargin = 0;
+ subLayout.bottomMargin = 0;
+ subLayout.leftMargin = 0;
+ subLayout.rightMargin = 0;
+ subComp.setLayout(subLayout);
+ subComp.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.FILL_GRAB, 1, 2));
+
+ if (showConnectors) {
+ createConnectorsSection(subComp);
+ }
+ createGettingStartedSection(subComp);
+ }
+
+ private void createContentsVertical(TableWrapLayout layout, boolean showConnectors) {
+ layout.numColumns = 1;
+ createTasksPrioritiesSection(this);
+ createActivitySection(this);
+ createContextSection(this);
+ createSynchronizationSection(this);
+ if (showConnectors) {
+ createConnectorsSection(this);
+ }
+ createGettingStartedSection(this);
+ }
+
+ private void createTasksPrioritiesSection(Composite parent) {
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ layout.makeColumnsEqualWidth = true;
+ layout.leftMargin = 0;
+ layout.rightMargin = 0;
+ layout.topMargin = 0;
+ layout.bottomMargin = 0;
+
+ Composite composite = toolkit.createComposite(parent);
+ composite.setLayout(layout);
+ composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ createTasksSection(composite);
+ createPrioritiesSection(composite);
+ }
+
+ private void createTasksSection(Composite parent) {
+ Section tasksSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ tasksSection.setText(Messages.UiLegendControl_Tasks);
+ tasksSection.setLayout(new TableWrapLayout());
+ tasksSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ layout.makeColumnsEqualWidth = false;
+ layout.verticalSpacing = 1;
+ layout.topMargin = 1;
+ layout.bottomMargin = 1;
+
+ Composite tasksClient = toolkit.createComposite(tasksSection);
+ tasksClient.setLayout(layout);
+ tasksClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ tasksSection.setClient(tasksClient);
+
+ Label imageLabel;
+ imageLabel = toolkit.createLabel(tasksClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.TASK));
+ toolkit.createLabel(tasksClient, Messages.UiLegendControl_Task);
+
+ imageLabel = toolkit.createLabel(tasksClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.CATEGORY));
+ toolkit.createLabel(tasksClient, Messages.UiLegendControl_Category);
+
+ imageLabel = toolkit.createLabel(tasksClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.QUERY));
+ toolkit.createLabel(tasksClient, Messages.UiLegendControl_Query);
+
+ imageLabel = toolkit.createLabel(tasksClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.CALENDAR));
+ toolkit.createLabel(tasksClient, Messages.UiLegendControl_Date_range);
+
+ imageLabel = toolkit.createLabel(tasksClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.BLANK));
+
+ Hyperlink openView = toolkit.createHyperlink(tasksClient, Messages.UiLegendControl_Open_Task_List_, SWT.WRAP);
+ openView.addHyperlinkListener(new IHyperlinkListener() {
+ public void linkActivated(HyperlinkEvent e) {
+ close();
+ TasksUiUtil.openTasksViewInActivePerspective();
+ }
+
+ public void linkEntered(HyperlinkEvent e) {
+ // ignore
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ // ignore
+ }
+ });
+ }
+
+ private void createPrioritiesSection(Composite parent) {
+ Section prioritiesSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ prioritiesSection.setText(Messages.UiLegendControl_Priorities);
+ prioritiesSection.setLayout(new TableWrapLayout());
+ prioritiesSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ layout.makeColumnsEqualWidth = false;
+ layout.verticalSpacing = 1;
+ layout.topMargin = 1;
+ layout.bottomMargin = 1;
+
+ Composite prioritiesClient = toolkit.createComposite(prioritiesSection);
+ prioritiesClient.setLayout(layout);
+ prioritiesClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ prioritiesSection.setClient(prioritiesClient);
+
+ Label imageLabel;
+ imageLabel = toolkit.createLabel(prioritiesClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.PRIORITY_1));
+ toolkit.createLabel(prioritiesClient, PriorityLevel.P1.getDescription());
+
+ imageLabel = toolkit.createLabel(prioritiesClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.PRIORITY_2));
+ toolkit.createLabel(prioritiesClient, PriorityLevel.P2.getDescription());
+
+ imageLabel = toolkit.createLabel(prioritiesClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.PRIORITY_3));
+ toolkit.createLabel(prioritiesClient, PriorityLevel.P3.getDescription() + Messages.UiLegendControl__default_);
+
+ imageLabel = toolkit.createLabel(prioritiesClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.PRIORITY_4));
+ toolkit.createLabel(prioritiesClient, PriorityLevel.P4.getDescription());
+
+ imageLabel = toolkit.createLabel(prioritiesClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.PRIORITY_5));
+ toolkit.createLabel(prioritiesClient, PriorityLevel.P5.getDescription());
+ }
+
+ private void createActivitySection(Composite parent) {
+ Section activitySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ activitySection.setText(Messages.UiLegendControl_Task_Activity);
+ activitySection.setLayout(new TableWrapLayout());
+ activitySection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ layout.makeColumnsEqualWidth = false;
+ layout.verticalSpacing = 1;
+ layout.topMargin = 1;
+ layout.bottomMargin = 1;
+
+ Composite activityClient = toolkit.createComposite(activitySection);
+ activityClient.setLayout(layout);
+ activityClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ activitySection.setClient(activityClient);
+
+ Label imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.TASK));
+ Label labelToday = toolkit.createLabel(activityClient, Messages.UiLegendControl_Scheduled_for_today);
+ labelToday.setForeground(themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_SCHEDULED_TODAY));
+
+ imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.TASK));
+ Label labelOverdue = toolkit.createLabel(activityClient, Messages.UiLegendControl_Past_scheduled_date);
+ labelOverdue.setForeground(themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_SCHEDULED_PAST));
+
+// imageLabel = toolkit.createLabel(activityClient, "");
+// imageLabel.setImage(TasksUiImages.getImage(TasksUiImages.TASK));
+// Label labelThisWeek = toolkit.createLabel(activityClient, "Scheduled for this
+// week");
+// labelThisWeek.setForeground(themeManager.getCurrentTheme().getColorRegistry().get(
+// TaskListColorsAndFonts.THEME_COLOR_TASK_THISWEEK_SCHEDULED));
+
+ imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.TASK));
+ Label labelCompleted = toolkit.createLabel(activityClient, Messages.UiLegendControl_Completed);
+ labelCompleted.setFont(CommonFonts.STRIKETHROUGH);
+// labelCompleted.setForeground(TaskListColorsAndFonts.COLOR_TASK_COMPLETED);
+ labelCompleted.setForeground(themeManager.getCurrentTheme()
+ .getColorRegistry()
+ .get(CommonThemes.COLOR_COMPLETED));
+
+ imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.TASK));
+ Label labelCompletedToday = toolkit.createLabel(activityClient, Messages.UiLegendControl_Completed_today);
+ labelCompletedToday.setFont(CommonFonts.STRIKETHROUGH);
+ labelCompletedToday.setForeground(themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_COMPLETED_TODAY));
+
+ imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_DATE_DUE));
+ toolkit.createLabel(activityClient, Messages.UiLegendControl_Has_due_date);
+
+ imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_DATE_OVERDUE));
+ Label textLabel = toolkit.createLabel(activityClient, Messages.UiLegendControl_Past_Due_date);
+ textLabel.setForeground(themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_OVERDUE));
+
+ imageLabel = toolkit.createLabel(activityClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.BLANK));
+ Hyperlink adjust = toolkit.createHyperlink(activityClient, Messages.UiLegendControl_Adjust_Colors_and_Fonts_, SWT.WRAP);
+ adjust.addHyperlinkListener(new IHyperlinkListener() {
+ public void linkActivated(HyperlinkEvent e) {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), ITasksUiConstants.ID_PREFERENCES_COLORS_AND_FONTS,
+ new String[] { ITasksUiConstants.ID_PREFERENCES_COLORS_AND_FONTS }, null);
+ dlg.open();
+ }
+
+ public void linkEntered(HyperlinkEvent e) {
+ // ignore
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ // ignore
+ }
+ });
+ }
+
+ private void createContextSection(Composite parent) {
+ Section contextSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ contextSection.setText(Messages.UiLegendControl_Task_Context);
+ contextSection.setLayout(new TableWrapLayout());
+ contextSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ layout.makeColumnsEqualWidth = false;
+ layout.verticalSpacing = 1;
+ layout.topMargin = 1;
+ layout.bottomMargin = 1;
+
+ Composite contextClient = toolkit.createComposite(contextSection);
+ contextClient.setLayout(layout);
+ contextClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ contextSection.setClient(contextClient);
+
+ Label imageLabel;
+ imageLabel = toolkit.createLabel(contextClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_FOCUS));
+ toolkit.createLabel(contextClient, Messages.UiLegendControl_Focus_view_on_active_task);
+
+ imageLabel = toolkit.createLabel(contextClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE_EMPTY));
+ toolkit.createLabel(contextClient, Messages.UiLegendControl_Inactive_task_with_no_context);
+
+ imageLabel = toolkit.createLabel(contextClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE));
+ toolkit.createLabel(contextClient, Messages.UiLegendControl_Inactive_task_with_context);
+
+ imageLabel = toolkit.createLabel(contextClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_ACTIVE));
+ toolkit.createLabel(contextClient, Messages.UiLegendControl_Active_task);
+ }
+
+ private void createSynchronizationSection(Composite parent) {
+ Section synchroSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ synchroSection.setText(Messages.UiLegendControl_Synchronization);
+ synchroSection.setLayout(new TableWrapLayout());
+ synchroSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ layout.makeColumnsEqualWidth = false;
+ layout.verticalSpacing = 3;
+ layout.topMargin = 1;
+ layout.bottomMargin = 1;
+
+ Composite synchroClient = toolkit.createComposite(synchroSection);
+ synchroClient.setLayout(layout);
+ synchroClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ synchroSection.setClient(synchroClient);
+
+ Label imageLabel;
+ imageLabel = toolkit.createLabel(synchroClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING_NEW));
+ toolkit.createLabel(synchroClient, Messages.UiLegendControl_New_task);
+
+ imageLabel = toolkit.createLabel(synchroClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING));
+ toolkit.createLabel(synchroClient, Messages.UiLegendControl_Incoming_changes);
+
+ imageLabel = toolkit.createLabel(synchroClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_SYNC_OUTGOING));
+ toolkit.createLabel(synchroClient, Messages.UiLegendControl_Outgoing_changes);
+
+ imageLabel = toolkit.createLabel(synchroClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_SYNC_OUTGOING_NEW));
+ toolkit.createLabel(synchroClient, Messages.UiLegendControl_Unsubmitted_outgoing_changes);
+
+ imageLabel = toolkit.createLabel(synchroClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_SYNC_WARNING));
+ toolkit.createLabel(synchroClient, Messages.UiLegendControl_Synchronization_failed);
+
+ imageLabel = toolkit.createLabel(synchroClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(CommonImages.getImage(CommonImages.OVERLAY_SYNC_CONFLICT));
+ toolkit.createLabel(synchroClient, Messages.UiLegendControl_Conflicting_changes);
+ }
+
+ @SuppressWarnings("deprecation")
+ private void createConnectorsSection(Composite parent) {
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 3;
+ layout.makeColumnsEqualWidth = true;
+ layout.leftMargin = 0;
+ layout.rightMargin = 0;
+ layout.topMargin = 0;
+ layout.bottomMargin = 0;
+
+ Composite composite = toolkit.createComposite(parent);
+ composite.setLayout(layout);
+ composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ Collection<AbstractRepositoryConnector> connectors = TasksUi.getRepositoryManager().getRepositoryConnectors();
+ for (AbstractRepositoryConnector connector : connectors) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUi.getRepositoryConnectorUi(connector.getConnectorKind());
+ if (connectorUi != null) {
+ List<LegendElement> elements = connectorUi.getLegendElements();
+ if (elements != null && elements.size() > 0) {
+ legendElements.addAll(elements);
+ addLegendElements(composite, connector, elements);
+ } else {
+ List<ITask> items = connectorUi.getLegendItems();
+ if (items != null && !items.isEmpty()) {
+ addLegacyLegendItems(composite, connector, items);
+ }
+ }
+ }
+ }
+ }
+
+ private void addLegendElements(Composite composite, AbstractRepositoryConnector connector,
+ List<LegendElement> elements) {
+ Section connectorSection = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR);
+ connectorSection.setLayout(new TableWrapLayout());
+ connectorSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ String label = connector.getLabel();
+ int parenIndex = label.indexOf('(');
+ if (parenIndex != -1) {
+ label = label.substring(0, parenIndex);
+ }
+ connectorSection.setText(label);
+
+ TableWrapLayout clientLayout = new TableWrapLayout();
+ clientLayout.numColumns = 2;
+ clientLayout.makeColumnsEqualWidth = false;
+ clientLayout.verticalSpacing = 1;
+ clientLayout.topMargin = 1;
+ clientLayout.bottomMargin = 1;
+
+ Composite connectorClient = toolkit.createComposite(connectorSection);
+ connectorClient.setLayout(clientLayout);
+ connectorClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ connectorSection.setClient(connectorClient);
+
+ Label imageLabel;
+ for (LegendElement element : elements) {
+ imageLabel = toolkit.createLabel(connectorClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(element.getImage());
+ toolkit.createLabel(connectorClient, element.getLabel());
+ }
+
+ if (elements.size() < 4) {
+ imageLabel = toolkit.createLabel(connectorClient, ""); //$NON-NLS-1$
+ toolkit.createLabel(connectorClient, ""); //$NON-NLS-1$
+ }
+ }
+
+ private void addLegacyLegendItems(Composite composite, AbstractRepositoryConnector connector, List<ITask> elements) {
+ Section connectorSection = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR);
+ connectorSection.setLayout(new TableWrapLayout());
+ connectorSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ String label = connector.getLabel();
+ int parenIndex = label.indexOf('(');
+ if (parenIndex != -1) {
+ label = label.substring(0, parenIndex);
+ }
+ connectorSection.setText(label);
+
+ TableWrapLayout clientLayout = new TableWrapLayout();
+ clientLayout.numColumns = 2;
+ clientLayout.makeColumnsEqualWidth = false;
+ clientLayout.verticalSpacing = 1;
+ clientLayout.topMargin = 1;
+ clientLayout.bottomMargin = 1;
+
+ Composite connectorClient = toolkit.createComposite(connectorSection);
+ connectorClient.setLayout(clientLayout);
+ connectorClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ connectorSection.setClient(connectorClient);
+
+ Label imageLabel;
+ for (IRepositoryElement taskListElement : elements) {
+ imageLabel = toolkit.createLabel(connectorClient, ""); //$NON-NLS-1$
+ imageLabel.setImage(labelProvider.getImage(taskListElement));
+ toolkit.createLabel(connectorClient, taskListElement.getSummary());
+ }
+
+ if (elements.size() < 4) {
+ imageLabel = toolkit.createLabel(connectorClient, ""); //$NON-NLS-1$
+ toolkit.createLabel(connectorClient, ""); //$NON-NLS-1$
+ }
+ }
+
+ private void createGettingStartedSection(Composite parent) {
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.verticalSpacing = 0;
+ layout.leftMargin = 0;
+ layout.rightMargin = 0;
+ layout.topMargin = 0;
+ layout.bottomMargin = 0;
+
+ Composite hyperlinkClient = toolkit.createComposite(parent);
+ hyperlinkClient.setLayout(layout);
+ hyperlinkClient.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ Hyperlink gettingStartedLink = toolkit.createHyperlink(hyperlinkClient,
+ Messages.UiLegendControl_Also_see_the_Getting_Started_documentation_online, SWT.WRAP);
+ gettingStartedLink.addHyperlinkListener(new IHyperlinkListener() {
+ public void linkActivated(HyperlinkEvent e) {
+ close();
+ TasksUiUtil.openUrl(Messages.UiLegendControl_http_www_eclipse_org_mylyn_start);
+ }
+
+ public void linkEntered(HyperlinkEvent e) {
+ // ignore
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ // ignore
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/UiLegendDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/UiLegendDialog.java
new file mode 100644
index 0000000..cb488d2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/UiLegendDialog.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.dialogs;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.PopupDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+/**
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ */
+public class UiLegendDialog extends PopupDialog {
+
+ private FormToolkit toolkit;
+
+ private ScrolledForm form;
+
+ private UiLegendControl content;
+
+ // TODO e3.4 move to new api
+ @SuppressWarnings("deprecation")
+ public UiLegendDialog(Shell parent) {
+ super(parent, PopupDialog.INFOPOPUP_SHELLSTYLE | SWT.ON_TOP, false, false, false, false, null, null);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ getShell().setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY));
+ return createDialogArea(parent);
+ }
+
+ @Override
+ public int open() {
+ int open = super.open();
+// getShell().setLocation(getShell().getLocation().x, getShell().getLocation().y+20);
+ getShell().setFocus();
+ return open;
+ }
+
+ @Override
+ public boolean close() {
+ if (form != null && !form.isDisposed()) {
+ form.dispose();
+ }
+
+ if (toolkit != null) {
+ if (toolkit.getColors() != null) {
+ toolkit.dispose();
+ }
+ }
+
+ if (content != null && !content.isDisposed()) {
+ content.dispose();
+ }
+
+ return super.close();
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ toolkit = new FormToolkit(parent.getDisplay());
+ form = toolkit.createScrolledForm(parent);
+ form.setText(Messages.UiLegendControl_Tasks_UI_Legend);
+ form.getToolBarManager().add(new CloseDialogAction());
+ form.getToolBarManager().update(true);
+ form.getBody().setLayout(new TableWrapLayout());
+ toolkit.decorateFormHeading(form.getForm());
+
+ content = new UiLegendControl(form.getBody(), toolkit);
+ content.setWindow(this);
+
+ return parent;
+ }
+
+ private class CloseDialogAction extends Action {
+
+ private CloseDialogAction() {
+ setImageDescriptor(CommonImages.NOTIFICATION_CLOSE);
+ setText(Messages.UiLegendDialog_Close_Dialog);
+ }
+
+ @Override
+ public void run() {
+ close();
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/messages.properties
new file mode 100644
index 0000000..8f559f8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/dialogs/messages.properties
@@ -0,0 +1,53 @@
+TaskCompareDialog_Ascending=Ascending
+TaskCompareDialog_Descending=Descending
+TaskCompareDialog_Sort_by=Sort by:
+TaskCompareDialog_Sorting=Sorting
+TaskCompareDialog_Tasks=Tasks
+TaskCompareDialog_Then_by=Then by:
+TaskListSortDialog_Queries_and_Categories=Queries and Categories
+TaskListSortDialog_Grouped_by=Group by:
+TaskListSortDialog_Title=Task List Sorting
+
+TaskRepositoryCredentialsDialog_Enter_Credentials=Enter Credentials
+TaskRepositoryCredentialsDialog_Enter_repository_credentials=Enter repository credentials
+TaskRepositoryCredentialsDialog_HTML_Open_Repository_Properties=<a href="properties">Open Repository Properties</a> to disable background synchronization by disconnecting the repository.
+TaskRepositoryCredentialsDialog_Password=&Password:
+TaskRepositoryCredentialsDialog_Repository_Authentication=Repository Authentication
+TaskRepositoryCredentialsDialog_Save_Password=&Save Password
+TaskRepositoryCredentialsDialog_Saved_passwords_are_stored_that_is_difficult=Saved passwords are stored on your computer in a file that is difficult, but not impossible, for an intruder to read.
+TaskRepositoryCredentialsDialog_Task_Repository=Task Repository\:
+TaskRepositoryCredentialsDialog_User_ID=&User ID:
+
+UiLegendControl_Active_task=Active task
+UiLegendControl_Adjust_Colors_and_Fonts_=Adjust Colors and Fonts...
+UiLegendControl_Also_see_the_Getting_Started_documentation_online=Also see the Getting Started documentation online
+UiLegendControl_Category=Category
+UiLegendControl_Completed=Completed
+UiLegendControl_Completed_today=Completed today
+UiLegendControl_Conflicting_changes=Conflicting changes, need to synchronize
+UiLegendControl_Date_range=Date range
+UiLegendControl__default_=\ (default)
+UiLegendControl_Focus_view_on_active_task=Focus view on active task
+UiLegendControl_Has_due_date=Has due date
+UiLegendControl_http_www_eclipse_org_mylyn_start=http://www.eclipse.org/mylyn/start/
+UiLegendControl_Inactive_task_with_context=Inactive task with context
+UiLegendControl_Inactive_task_with_no_context=Inactive task with no context
+UiLegendControl_Incoming_changes=Incoming changes, open to view
+UiLegendControl_New_task=New task, open to view
+UiLegendControl_Open_Task_List_=Open Task List...
+UiLegendControl_Outgoing_changes=Outgoing changes
+UiLegendControl_Past_Due_date=Past Due date
+UiLegendControl_Past_scheduled_date=Past scheduled date
+UiLegendControl_Priorities=Priorities
+UiLegendControl_Query=Query
+UiLegendControl_Scheduled_for_today=Scheduled for today
+UiLegendControl_Synchronization=Synchronization
+UiLegendControl_Synchronization_failed=Synchronization failed, mouse over for details
+UiLegendControl_Task=Task
+UiLegendControl_Task_Activity=Task Activity
+UiLegendControl_Task_Context=Task Context
+UiLegendControl_Tasks=Tasks
+UiLegendControl_Tasks_UI_Legend=Tasks UI Legend
+UiLegendControl_Unsubmitted_outgoing_changes=Unsubmitted outgoing changes
+
+UiLegendDialog_Close_Dialog=Close Dialog
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractHyperlinkTextPresentationManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractHyperlinkTextPresentationManager.java
new file mode 100644
index 0000000..f5a0732
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractHyperlinkTextPresentationManager.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextPresentationListener;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.ITextViewerExtension4;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.mylyn.tasks.ui.IHighlightingHyperlink;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.swt.custom.StyleRange;
+
+/**
+ * A manager that ensures that all task hyperlinks have the appropriate text presentation. Subclasses may specify logic
+ * for filtering detected hyperlinks and text decoration.
+ *
+ * @author David Green
+ */
+public abstract class AbstractHyperlinkTextPresentationManager {
+
+ private static class RegionComparator implements Comparator<IRegion> {
+
+ public int compare(IRegion o1, IRegion o2) {
+ if (o1 == o2) {
+ return 0;
+ }
+ if (o1.getOffset() < o2.getOffset()) {
+ return -1;
+ } else if (o1.getOffset() > o2.getOffset()) {
+ return 1;
+ } else if (o1.getLength() < o2.getLength()) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+
+ }
+
+ private class Support implements ITextPresentationListener {
+ public void applyTextPresentation(TextPresentation textPresentation) {
+ StyleRange[] styleRanges = computeStyleRanges(textPresentation.getCoverage());
+ if (styleRanges != null && styleRanges.length > 0) {
+ textPresentation.mergeStyleRanges(styleRanges);
+ }
+ }
+ }
+
+ private static final RegionComparator REGION_COMPARATOR = new RegionComparator();
+
+ private IHyperlinkDetector[] hyperlinkDetectors;
+
+ private final ITextPresentationListener textPresentationListener = new Support();
+
+ private ITextViewer viewer;
+
+ public AbstractHyperlinkTextPresentationManager() {
+ }
+
+ private void addRange(List<StyleRange> ranges, int start, int end) {
+ // the style range is to be merged with other styles, so only set the bits that are needed
+ StyleRange styleRange = new StyleRange(start, end - start, null, null);
+ decorate(styleRange);
+ ranges.add(styleRange);
+ }
+
+ protected StyleRange[] computeStyleRanges(IRegion extent) {
+ if (viewer == null || hyperlinkDetectors == null || viewer.getDocument() == null || extent == null) {
+ return null;
+ }
+ List<IRegion> regions = getRegions(extent);
+ if (regions != null) {
+ // style ranges may be adjacent but must not overlap, and they must be in order
+ // of increasing offset.
+ List<StyleRange> ranges = new ArrayList<StyleRange>(regions.size());
+ // sort them first to ensure increasing offset
+ Collections.sort(regions, REGION_COMPARATOR);
+ // now merge overlapping (and adjacent) ranges
+ int start = -1;
+ int end = -1;
+ for (int x = 0; x < regions.size(); ++x) {
+ IRegion region = regions.get(x);
+ if (start == -1) {
+ start = region.getOffset();
+ end = region.getOffset() + region.getLength();
+ } else {
+ if (region.getOffset() >= end) {
+ addRange(ranges, start, end);
+ start = region.getOffset();
+ end = region.getOffset() + region.getLength();
+ } else {
+ end = region.getOffset() + region.getLength();
+ }
+ }
+ }
+ if (start != -1) {
+ addRange(ranges, start, end);
+ }
+ return ranges.toArray(new StyleRange[ranges.size()]);
+ }
+ return null;
+ }
+
+ protected abstract void decorate(StyleRange styleRange);
+
+ /**
+ * The hyperlink detectors that are used to detect {@link TaskHyperlink task hyperlinks}
+ */
+ public IHyperlinkDetector[] getHyperlinkDetector() {
+ return hyperlinkDetectors;
+ }
+
+ protected List<IRegion> getRegions(IRegion extent) {
+ List<IRegion> regions = null;
+ for (IHyperlinkDetector hyperlinkDetector : hyperlinkDetectors) {
+ IHyperlink[] hyperlinks = hyperlinkDetector.detectHyperlinks(viewer, extent, true);
+ if (hyperlinks != null && hyperlinks.length > 0) {
+ for (IHyperlink hyperlink : hyperlinks) {
+ if (select(hyperlink)) {
+ if (regions == null) {
+ regions = new ArrayList<IRegion>();
+ }
+ regions.add(hyperlink instanceof IHighlightingHyperlink ? ((IHighlightingHyperlink) hyperlink).getHighlightingRegion()
+ : hyperlink.getHyperlinkRegion());
+ }
+ }
+ }
+ }
+ return regions;
+ }
+
+ public void install(ITextViewer viewer) {
+ this.viewer = viewer;
+ if (viewer instanceof ITextViewerExtension4) {
+ ((ITextViewerExtension4) viewer).addTextPresentationListener(textPresentationListener);
+ }
+ }
+
+ public boolean select(IHyperlink hyperlink) {
+ return true;
+ }
+
+ /**
+ * The hyperlink detector that are used to detect {@link TaskHyperlink task hyperlinks}
+ */
+ public void setHyperlinkDetectors(IHyperlinkDetector[] hyperlinkDetectors) {
+ this.hyperlinkDetectors = hyperlinkDetectors;
+ }
+
+ public void uninstall() {
+ ((ITextViewerExtension4) viewer).removeTextPresentationListener(textPresentationListener);
+ this.viewer = null;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractLocalEditorPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractLocalEditorPart.java
new file mode 100644
index 0000000..d9306a2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractLocalEditorPart.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.AbstractFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * Abstract part that can be used on the local task editor
+ *
+ * @author Shawn Minto
+ */
+public abstract class AbstractLocalEditorPart extends AbstractFormPart {
+
+ private Control control;
+
+ private TaskRepository repository;
+
+ private Section section;
+
+ private final String sectionName;
+
+ private final int sectionStyle;
+
+ private AbstractTask task;
+
+ public AbstractLocalEditorPart(int sectionStyle, String sectionName) {
+ this.sectionStyle = sectionStyle;
+ this.sectionName = sectionName;
+ }
+
+ public AbstractLocalEditorPart(String sectionName) {
+ this.sectionStyle = ExpandableComposite.TWISTIE;
+ this.sectionName = sectionName;
+ }
+
+ public abstract Control createControl(Composite parent, FormToolkit toolkit);
+
+ protected Section createSection(Composite parent, FormToolkit toolkit, boolean expandedState) {
+ int style = ExpandableComposite.TITLE_BAR | getSectionStyle();
+ if (expandedState && isTwistie(style)) {
+ style |= ExpandableComposite.EXPANDED;
+ }
+ return createSection(parent, toolkit, style);
+ }
+
+ protected Section createSection(Composite parent, FormToolkit toolkit, int style) {
+ Section section = toolkit.createSection(parent, style);
+ section.setText(getSectionName());
+ section.clientVerticalSpacing = 0;
+ section.descriptionVerticalSpacing = 0;
+ section.marginHeight = 0;
+ return section;
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+
+ public Section getSection() {
+ return section;
+ }
+
+ public String getSectionName() {
+ return sectionName;
+ }
+
+ private int getSectionStyle() {
+ return sectionStyle;
+ }
+
+ public AbstractTask getTask() {
+ return task;
+ }
+
+ public void initialize(IManagedForm managedForm, TaskRepository repository, AbstractTask task) {
+ super.initialize(managedForm);
+ this.task = task;
+ this.repository = repository;
+ }
+
+ private boolean isTwistie(int style) {
+ return (style & ExpandableComposite.TWISTIE) != 0;
+ }
+
+ public void setControl(Control control) {
+ this.control = control;
+ }
+
+ protected void setSection(FormToolkit toolkit, Section section) {
+ this.section = section;
+ setControl(section);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractReplyToCommentAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractReplyToCommentAction.java
new file mode 100644
index 0000000..f04fe1a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AbstractReplyToCommentAction.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.tasks.core.CommentQuoter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class AbstractReplyToCommentAction extends Action {
+
+ private final AbstractTaskEditorPage editor;
+
+ private final ITaskComment taskComment;
+
+ public AbstractReplyToCommentAction(AbstractTaskEditorPage editor, ITaskComment taskComment) {
+ this.editor = editor;
+ this.taskComment = taskComment;
+ setImageDescriptor(TasksUiImages.COMMENT_REPLY);
+ setText(Messages.AbstractReplyToCommentAction_Reply);
+ setToolTipText(Messages.AbstractReplyToCommentAction_Reply);
+ }
+
+ protected abstract String getReplyText();
+
+ @Override
+ public void run() {
+ reply(editor, taskComment, getReplyText());
+ }
+
+ public static void reply(AbstractTaskEditorPage editor, ITaskComment taskComment, String text) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(editor.getConnectorKind());
+ String reference = connectorUi.getReplyText(editor.getTaskRepository(), editor.getTask(), taskComment, false);
+ StringBuilder sb = new StringBuilder();
+ sb.append(reference);
+ sb.append("\n"); //$NON-NLS-1$
+ if (text != null) {
+ CommentQuoter quoter = new CommentQuoter();
+ sb.append(quoter.quote(text));
+ }
+ editor.appendTextToNewComment(sb.toString());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttachmentSizeFormatter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttachmentSizeFormatter.java
new file mode 100644
index 0000000..674142c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttachmentSizeFormatter.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import com.ibm.icu.text.DecimalFormat;
+import com.ibm.icu.text.NumberFormat;
+import java.util.Locale;
+
+/**
+ * Format attachment size values originally in bytes to nice messages.
+ * <p>
+ * This formatter tries to use the most applicable measure unit based on size magnitude, i.e.:
+ * <p>
+ * <ul>
+ * <li>< 1 KB - byte based: 1 byte, 100 bytes, etc. <li>>= 1 KB and < 1 MB - KB based: 2.00 KB, 100.76 KB <li>>= 1 MB
+ * and < 1 GB - MB based: 1.00 MB, 33.33 MB <li>>= 1 GB - GB based: 2.00 GB
+ * </ul>
+ * <p>
+ * This formatter assumes 1 KB == 1024 bytes, <strong>NOT</strong> 1000 bytes.
+ * <p>
+ * This formatter always uses 2 decimal places.
+ * <p>
+ * The size is provided as a String, because it will probably come from a attachment attribute. If the value cannot be
+ * decoded, for any reason, it returns {@link #UNKNOWN_SIZE}
+ *
+ * @author Willian Mitsuda
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class AttachmentSizeFormatter {
+
+ /**
+ * Default value returned by this formatter when the size is unparseable, contain errors, etc.
+ */
+ public static final String UNKNOWN_SIZE = "-"; //$NON-NLS-1$
+
+ public final static AttachmentSizeFormatter getInstance() {
+ return new AttachmentSizeFormatter();
+ }
+
+ private final DecimalFormat decimalFormat;
+
+ public AttachmentSizeFormatter() {
+ this(Locale.getDefault());
+ }
+
+ public AttachmentSizeFormatter(Locale locale) {
+ this.decimalFormat = (DecimalFormat) NumberFormat.getInstance(locale);
+ }
+
+ public String format(String sizeInBytes) {
+ if (sizeInBytes == null) {
+ return UNKNOWN_SIZE;
+ }
+ try {
+ return format(Long.parseLong(sizeInBytes));
+ } catch (NumberFormatException e) {
+ return UNKNOWN_SIZE;
+ }
+ }
+
+ public String format(long size) {
+ if (size < 0) {
+ return UNKNOWN_SIZE;
+ }
+ if (size < 1024) {
+ // format as byte
+ if (size == 1) {
+ return Messages.AttachmentSizeFormatter_1_byte;
+ }
+ DecimalFormat fmt = new DecimalFormat(Messages.AttachmentSizeFormatter_0_bytes);
+ return fmt.format(size);
+ } else if (size >= 1024 && size <= 1048575) {
+ // format as KB
+ double formattedValue = size / 1024.0;
+ decimalFormat.applyPattern(Messages.AttachmentSizeFormatter_0_KB);
+ return decimalFormat.format(formattedValue);
+ } else if (size >= 1048576 && size <= 1073741823) {
+ // format as MB
+ double formattedValue = size / 1048576.0;
+ decimalFormat.applyPattern(Messages.AttachmentSizeFormatter_0_MB);
+ return decimalFormat.format(formattedValue);
+ }
+
+ // format as GB
+ double formattedValue = size / 1073741824.0;
+ decimalFormat.applyPattern(Messages.AttachmentSizeFormatter_0_GB);
+ return decimalFormat.format(formattedValue);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttachmentTableLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttachmentTableLabelProvider.java
new file mode 100644
index 0000000..141996e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttachmentTableLabelProvider.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - indicate deprecated attachments, bug 215549
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorToolkit;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class AttachmentTableLabelProvider extends ColumnLabelProvider {
+
+ private final AttachmentSizeFormatter sizeFormatter = AttachmentSizeFormatter.getInstance();
+
+ private final IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+
+ private static final String[] IMAGE_EXTENSIONS = { "jpg", "gif", "png", "tiff", "tif", "bmp" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+
+ private final TaskDataModel model;
+
+ private final AttributeEditorToolkit attributeEditorToolkit;
+
+ public AttachmentTableLabelProvider(TaskDataModel model, AttributeEditorToolkit attributeEditorToolkit) {
+ this.model = model;
+ this.attributeEditorToolkit = attributeEditorToolkit;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ ITaskAttachment attachment = (ITaskAttachment) element;
+ if (columnIndex == 0) {
+ if (AttachmentUtil.isContext(attachment)) {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_TRANSFER);
+ } else if (attachment.isPatch()) {
+ return CommonImages.getImage(TasksUiImages.TASK_ATTACHMENT_PATCH);
+ } else {
+ String filename = attachment.getFileName();
+ if (filename != null) {
+ int dotIndex = filename.lastIndexOf('.');
+ if (dotIndex != -1) {
+ String fileType = filename.substring(dotIndex + 1);
+ for (String element2 : IMAGE_EXTENSIONS) {
+ if (element2.equalsIgnoreCase(fileType)) {
+ return CommonImages.getImage(CommonImages.IMAGE_FILE);
+ }
+ }
+ }
+ }
+ return WorkbenchImages.getImage(ISharedImages.IMG_OBJ_FILE);
+ }
+ } else {
+ }
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ ITaskAttachment attachment = (ITaskAttachment) element;
+ switch (columnIndex) {
+ case 0:
+ if (AttachmentUtil.isContext(attachment)) {
+ return Messages.AttachmentTableLabelProvider_Task_Context;
+ } else if (attachment.isPatch()) {
+ return Messages.AttachmentTableLabelProvider_Patch;
+ } else {
+ return " " + attachment.getFileName(); //$NON-NLS-1$
+ }
+ case 1:
+ return attachment.getDescription();
+ case 2:
+ Long length = attachment.getLength();
+ if (length < 0) {
+ return "-"; //$NON-NLS-1$
+ }
+ return sizeFormatter.format(length);
+ case 3:
+ return (attachment.getAuthor() != null) ? attachment.getAuthor().toString() : ""; //$NON-NLS-1$
+ case 4:
+ return (attachment.getCreationDate() != null) ? EditorUtil.formatDateTime(attachment.getCreationDate())
+ : ""; //$NON-NLS-1$
+ }
+ return "unrecognized column"; //$NON-NLS-1$
+ }
+
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ // ignore
+ }
+
+ @Override
+ public void dispose() {
+ // ignore
+ }
+
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ // ignore
+ return false;
+ }
+
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ // ignore
+ }
+
+ @Override
+ public Color getForeground(Object element) {
+ ITaskAttachment att = (ITaskAttachment) element;
+ if (att.isDeprecated()) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_COMPLETED);
+ }
+ return super.getForeground(element);
+ }
+
+ @Override
+ public String getToolTipText(Object element) {
+ ITaskAttachment attachment = (ITaskAttachment) element;
+ StringBuilder sb = new StringBuilder();
+ sb.append(Messages.AttachmentTableLabelProvider_File_);
+ sb.append(attachment.getFileName());
+ if (attachment.getContentType() != null) {
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(Messages.AttachmentTableLabelProvider_Type_);
+ sb.append(attachment.getContentType());
+ }
+ return sb.toString();
+ /*"\nFilename\t\t" + attachment.getAttributeValue("filename")
+ +"ID\t\t\t" + attachment.getAttributeValue("attachid")
+ + "\nDate\t\t\t" + attachment.getAttributeValue("date")
+ + "\nDescription\t" + attachment.getAttributeValue("desc")
+ + "\nCreator\t\t" + attachment.getCreator()
+ + "\nType\t\t\t" + attachment.getAttributeValue("type")
+ + "\nURL\t\t\t" + attachment.getAttributeValue("task.common.attachment.url");*/
+ }
+
+ @Override
+ public Point getToolTipShift(Object object) {
+ return new Point(5, 5);
+ }
+
+ @Override
+ public int getToolTipDisplayDelayTime(Object object) {
+ return 200;
+ }
+
+ @Override
+ public int getToolTipTimeDisplayed(Object object) {
+ return 5000;
+ }
+
+ @Override
+ public void update(ViewerCell cell) {
+ Object element = cell.getElement();
+ cell.setText(getColumnText(element, cell.getColumnIndex()));
+ Image image = getColumnImage(element, cell.getColumnIndex());
+ cell.setImage(image);
+ cell.setBackground(getBackground(element));
+ cell.setForeground(getForeground(element));
+ cell.setFont(getFont(element));
+ }
+
+ @Override
+ public Color getBackground(Object element) {
+ ITaskAttachment attachment = (ITaskAttachment) element;
+ if (model.hasIncomingChanges(attachment.getTaskAttribute())) {
+ return attributeEditorToolkit.getColorIncoming();
+ } else {
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java
new file mode 100644
index 0000000..9fc7d99
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/AttributePart.java
@@ -0,0 +1,258 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
+import org.eclipse.mylyn.internal.tasks.ui.util.AbstractRetrieveTitleFromUrlJob;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskContainerComparator;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IFormPart;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AttributePart extends AbstractLocalEditorPart {
+
+ private ImageHyperlink fetchUrlLink;
+
+ private RichTextEditor urlEditor;
+
+ private CCombo categoryChooser;
+
+ protected AbstractTaskCategory category;
+
+ private Label categoryLabel;
+
+ private List<AbstractTaskCategory> categories;
+
+ public AttributePart() {
+ super(Messages.TaskPlanningEditor_Attributes);
+ }
+
+ @Override
+ public void commit(boolean onSave) {
+ if (category != null) {
+ TasksUiPlugin.getTaskList().addTask(getTask(), category);
+ category = null;
+ }
+ getTask().setUrl(urlEditor.getText());
+ super.commit(onSave);
+ }
+
+ @Override
+ public Control createControl(Composite parent, FormToolkit toolkit) {
+ int style = ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE;
+// | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT;
+ if (getTask().getUrl() != null && getTask().getUrl().length() > 0) {
+ style |= ExpandableComposite.EXPANDED;
+ }
+
+ Section section = createSection(parent, toolkit, style);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
+ section.setText(Messages.TaskPlanningEditor_Attributes);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
+ createSectionClient(section, toolkit);
+ setSection(toolkit, section);
+
+ Composite composite = toolkit.createComposite(section);
+ GridLayout layout = EditorUtil.createSectionClientLayout();
+ layout.numColumns = 4;
+ composite.setLayout(layout);
+
+ Label label = toolkit.createLabel(composite, Messages.AttributePart_Category_);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+
+ createCategoryChooser(composite, toolkit);
+
+ // url
+ label = toolkit.createLabel(composite, Messages.TaskPlanningEditor_URL);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ GridDataFactory.defaultsFor(label).indent(20, 0).applyTo(label);
+
+ Composite urlComposite = toolkit.createComposite(composite);
+ GridLayout urlLayout = new GridLayout(2, false);
+ urlLayout.verticalSpacing = 0;
+ urlLayout.marginWidth = 1;
+ urlComposite.setLayout(urlLayout);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(urlComposite);
+
+ urlEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.SINGLE) {
+ @Override
+ protected void valueChanged(String value) {
+ updateButtons();
+ markDirty();
+ }
+ };
+ urlEditor.setMode(Mode.URL);
+ urlEditor.createControl(urlComposite, toolkit);
+ urlEditor.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ urlEditor.getViewer().getControl().setMenu(parent.getMenu());
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(urlEditor.getControl());
+
+ fetchUrlLink = toolkit.createImageHyperlink(urlComposite, SWT.NONE);
+ fetchUrlLink.setImage(CommonImages.getImage(TasksUiImages.TASK_RETRIEVE));
+ fetchUrlLink.setToolTipText(Messages.TaskPlanningEditor_Retrieve_task_description_from_URL);
+ fetchUrlLink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ featchUrl(urlEditor.getText());
+ }
+ });
+ toolkit.paintBordersFor(urlComposite);
+
+ toolkit.paintBordersFor(composite);
+ section.setClient(composite);
+ return section;
+ }
+
+ private void createSectionClient(final Section section, FormToolkit toolkit) {
+ if (section.getTextClient() == null) {
+ final Composite textClient = toolkit.createComposite(section);
+ textClient.setBackground(null);
+ RowLayout rowLayout = new RowLayout();
+ EditorUtil.center(rowLayout);
+ rowLayout.marginLeft = 20;
+ rowLayout.marginTop = 1;
+ rowLayout.marginBottom = 1;
+ textClient.setLayout(rowLayout);
+
+ Label label = toolkit.createLabel(textClient, Messages.AttributePart_Category_);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ label.setBackground(null);
+
+ categoryLabel = toolkit.createLabel(textClient, ""); //$NON-NLS-1$
+ categoryLabel.setBackground(null);
+
+ toolkit.paintBordersFor(textClient);
+
+ section.setTextClient(textClient);
+ section.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanging(ExpansionEvent e) {
+ textClient.setVisible(!e.getState());
+ }
+ });
+ textClient.setVisible(!section.isExpanded());
+ }
+ }
+
+ /**
+ * Set the task summary to the page title from the specified url.
+ */
+ private void featchUrl(final String url) {
+ AbstractRetrieveTitleFromUrlJob job = new AbstractRetrieveTitleFromUrlJob(urlEditor.getText()) {
+ @Override
+ protected void titleRetrieved(String pageTitle) {
+ IFormPart[] parts = getManagedForm().getParts();
+ for (IFormPart part : parts) {
+ if (part instanceof SummaryPart) {
+ ((SummaryPart) part).setSummary(pageTitle);
+ }
+ }
+ }
+ };
+ job.schedule();
+ }
+
+ private void updateButtons() {
+ String value = urlEditor.getText();
+ fetchUrlLink.setEnabled(value.startsWith("http://") || value.startsWith("https://")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public void refresh() {
+ ITaskList taskList = TasksUiInternal.getTaskList();
+ categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories());
+ Collections.sort(categories, new TaskContainerComparator());
+
+ AbstractTaskCategory selectedCategory = category;
+ if (selectedCategory == null) {
+ selectedCategory = TaskCategory.getParentTaskCategory(getTask());
+ }
+ categoryChooser.removeAll();
+ int selectedIndex = 0;
+ for (int i = 0; i < categories.size(); i++) {
+ AbstractTaskCategory category = categories.get(i);
+ categoryChooser.add(category.getSummary());
+ if (category.equals(selectedCategory)) {
+ selectedIndex = i;
+ }
+ }
+ categoryChooser.select(selectedIndex);
+ updateCategoryLabel();
+
+ String url = getTask().getUrl();
+ urlEditor.setText(url != null ? url : ""); //$NON-NLS-1$
+
+ updateButtons();
+ super.refresh();
+ }
+
+ private void updateCategoryLabel() {
+ if (category == null) {
+ AbstractTaskCategory parentTaskCategory = TaskCategory.getParentTaskCategory(getTask());
+ categoryLabel.setText((parentTaskCategory != null) ? parentTaskCategory.getSummary() : ""); //$NON-NLS-1$
+ } else {
+ categoryLabel.setText(category.getSummary());
+ }
+ if (!getSection().isExpanded()) {
+ getSection().layout(true, true);
+ }
+ }
+
+ private void createCategoryChooser(Composite buttonComposite, FormToolkit toolkit) {
+ categoryChooser = new CCombo(buttonComposite, SWT.FLAT | SWT.READ_ONLY);
+ categoryChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ toolkit.adapt(categoryChooser, false, false);
+ categoryChooser.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (categoryChooser.getSelectionIndex() != -1) {
+ category = categories.get(categoryChooser.getSelectionIndex());
+ updateCategoryLabel();
+ markDirty();
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/BooleanAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/BooleanAttributeEditor.java
new file mode 100644
index 0000000..f8fce15
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/BooleanAttributeEditor.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class BooleanAttributeEditor extends AbstractAttributeEditor {
+
+ private Button button;
+
+ private boolean ignoreNotification;
+
+ public BooleanAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ button = toolkit.createButton(parent, super.getLabel(), SWT.CHECK);
+ button.setEnabled(!isReadOnly());
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!ignoreNotification) {
+ setValue(button.getSelection());
+ }
+ }
+ });
+ refresh();
+ setControl(button);
+ }
+
+ @Override
+ public String getLabel() {
+ return ""; //$NON-NLS-1$
+ }
+
+ public boolean getValue() {
+ return getAttributeMapper().getBooleanValue(getTaskAttribute());
+ }
+
+ public void setValue(boolean value) {
+ getAttributeMapper().setBooleanValue(getTaskAttribute(), value);
+ attributeChanged();
+ }
+
+ @Override
+ public void refresh() {
+ if (button == null) {
+ return;
+ }
+
+ try {
+ ignoreNotification = true;
+ button.setSelection(getValue());
+ } finally {
+ ignoreNotification = false;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/BrowserPreviewViewer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/BrowserPreviewViewer.java
new file mode 100644
index 0000000..221045f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/BrowserPreviewViewer.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Xiaoyang Guan - browser preview
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationAdapter;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ * @author Xiaoyang Guan
+ */
+public class BrowserPreviewViewer {
+
+ private Browser browser;
+
+ private boolean ignoreLocationEvents;
+
+ private final AbstractRenderingEngine renderingEngine;
+
+ private final TaskRepository taskRepository;
+
+ public BrowserPreviewViewer(TaskRepository taskRepository, AbstractRenderingEngine renderingEngine) {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(renderingEngine);
+ this.taskRepository = taskRepository;
+ this.renderingEngine = renderingEngine;
+ }
+
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ browser = new Browser(parent, SWT.NONE);
+ // intercept links to open tasks in rich editor and urls in separate browser
+ browser.addLocationListener(new LocationAdapter() {
+ @Override
+ public void changing(LocationEvent event) {
+ // ignore events that are caused by manually setting the contents of the browser
+ if (ignoreLocationEvents) {
+ return;
+ }
+
+ if (event.location != null && !event.location.startsWith("about")) { //$NON-NLS-1$
+ event.doit = false;
+ IHyperlink link = new TaskUrlHyperlink(
+ new Region(0, 0)/* a fake region just to make constructor happy */, event.location);
+ link.open();
+ }
+ }
+
+ });
+ }
+
+ public Browser getControl() {
+ return browser;
+ }
+
+ private void previewWiki(final Browser browser, String sourceText) {
+ final class PreviewWikiJob extends Job {
+ private String htmlText;
+
+ private IStatus jobStatus;
+
+ private final String sourceText;
+
+ public PreviewWikiJob(String sourceText) {
+ super(Messages.BrowserPreviewViewer_Formatting_Wiki_Text);
+
+ if (sourceText == null) {
+ throw new IllegalArgumentException("source text must not be null"); //$NON-NLS-1$
+ }
+
+ this.sourceText = sourceText;
+ }
+
+ public String getHtmlText() {
+ return htmlText;
+ }
+
+ public IStatus getStatus() {
+ return jobStatus;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ if (renderingEngine == null) {
+ jobStatus = new RepositoryStatus(taskRepository, IStatus.INFO, TasksUiPlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL,
+ Messages.BrowserPreviewViewer_The_repository_does_not_support_HTML_preview);
+ return Status.OK_STATUS;
+ }
+
+ jobStatus = Status.OK_STATUS;
+ try {
+ htmlText = renderingEngine.renderAsHtml(taskRepository, sourceText, monitor);
+ } catch (CoreException e) {
+ jobStatus = e.getStatus();
+ }
+ return Status.OK_STATUS;
+ }
+
+ }
+
+ final PreviewWikiJob job = new PreviewWikiJob(sourceText);
+
+ job.addJobChangeListener(new JobChangeAdapter() {
+
+ @Override
+ public void done(final IJobChangeEvent event) {
+ if (!browser.isDisposed()) {
+ if (job.getStatus().isOK()) {
+ browser.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ setText(browser, job.getHtmlText());
+ // TODO 3.3 error handling
+ //getAttributeEditorManager().setMessage(null, IMessageProvider.NONE);
+ }
+ });
+ } else {
+ browser.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.displayStatus(Messages.BrowserPreviewViewer_Error, job.getStatus());
+ // TODO 3.3 error handling
+ //getAttributeEditorManager().setMessage(job.getStatus().getMessage(), IMessageProvider.ERROR);
+ }
+ });
+ }
+ }
+ super.done(event);
+ }
+ });
+
+ job.setUser(true);
+ job.schedule();
+ }
+
+ private void setText(Browser browser, String html) {
+ try {
+ ignoreLocationEvents = true;
+ browser.setText((html != null) ? html : ""); //$NON-NLS-1$
+ } finally {
+ ignoreLocationEvents = false;
+ }
+
+ }
+
+ public void update(String value) {
+ setText(browser, Messages.BrowserPreviewViewer_Loading_preview_);
+ previewWiki(browser, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CategoryEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CategoryEditor.java
new file mode 100644
index 0000000..65ce065
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CategoryEditor.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Ken Sueda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten
+ */
+public class CategoryEditor extends EditorPart {
+
+ public static final String ID_EDITOR = "org.eclipse.mylyn.tasks.ui.editors.category"; //$NON-NLS-1$
+
+ private Text url;
+
+ private CategoryEditorInput input = null;
+
+ private boolean isDirty = false;
+
+ private Text description = null;
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ input.setCategoryName(description.getText());
+ input.setUrl(url.getText());
+ isDirty = false;
+ firePropertyChange(PROP_DIRTY);
+ }
+
+ @Override
+ public void doSaveAs() {
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ setSite(site);
+ setInput(input);
+ this.input = (CategoryEditorInput) input;
+ setPartName(input.getName());
+ setTitleToolTip(input.getToolTipText());
+ }
+
+ @Override
+ public boolean isDirty() {
+ return isDirty;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ FormToolkit toolkit = new FormToolkit(parent.getDisplay());
+ ScrolledForm sform = toolkit.createScrolledForm(parent);
+ sform.getBody().setLayout(new TableWrapLayout());
+ Composite editorComposite = sform.getBody();
+
+ createSummarySection(editorComposite, toolkit);
+ }
+
+ @Override
+ public void setFocus() {
+ }
+
+ private void createSummarySection(Composite parent, FormToolkit toolkit) {
+ Section summarySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ summarySection.setText(Messages.CategoryEditor_Category_Summary);
+ summarySection.setLayout(new TableWrapLayout());
+ summarySection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ Composite summaryContainer = toolkit.createComposite(summarySection);
+ summarySection.setClient(summaryContainer);
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 2;
+ summaryContainer.setLayout(layout);
+
+ ModifyListener modifyListener = new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ markDirty();
+ }
+ };
+
+ toolkit.createLabel(summaryContainer, Messages.CategoryEditor_Description_, SWT.NULL);
+// lblDescription.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ description = toolkit.createText(summaryContainer, input.getCategoryName(), SWT.FLAT);
+ description.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ description.setData(FormToolkit.KEY_DRAW_BORDER);
+ description.addModifyListener(modifyListener);
+
+ toolkit.createLabel(summaryContainer, Messages.CategoryEditor_URL_, SWT.NONE);
+// lblUrl.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ url = toolkit.createText(summaryContainer, input.getUrl(), SWT.FLAT);
+ url.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP));
+ url.addModifyListener(modifyListener);
+
+ toolkit.paintBordersFor(summaryContainer);
+ }
+
+ private void markDirty() {
+ isDirty = true;
+ firePropertyChange(PROP_DIRTY);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CategoryEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CategoryEditorInput.java
new file mode 100644
index 0000000..e0bff2a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CategoryEditorInput.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Ken Sueda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Ken Sueda
+ */
+public class CategoryEditorInput implements IEditorInput {
+
+ private final TaskCategory category;
+
+ public CategoryEditorInput(TaskCategory cat) {
+ this.category = cat;
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return Messages.CategoryEditorInput_Category_Editor;
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return Messages.CategoryEditorInput_Category_Editor;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public String getCategoryName() {
+ return category.getSummary();
+ }
+
+ public String getUrl() {
+ return category.getUrl();
+ }
+
+ public void setCategoryName(String description) {
+ TasksUiPlugin.getTaskList().renameContainer(category, description);
+// category.setDescription(summary);
+ }
+
+ public void setUrl(String url) {
+ category.setUrl(url);
+ TasksUiPlugin.getTaskList().notifyElementChanged(category);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CommentGroupStrategy.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CommentGroupStrategy.java
new file mode 100644
index 0000000..cc57421
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/CommentGroupStrategy.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jingwen Ou 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:
+ * Jingwen Ou - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Jingwen Ou
+ * @author Steffen Pingel
+ */
+public class CommentGroupStrategy {
+
+ public static class CommentGroup {
+
+ public static final String CURRENT = Messages.CommentGroupStrategy_Current;
+
+ public static final String OLDER = Messages.CommentGroupStrategy_Older;
+
+ public static final String RECENT = Messages.CommentGroupStrategy_Recent;
+
+ private final List<ITaskComment> comments;
+
+ private final String groupName;
+
+ private final boolean incoming;
+
+ public CommentGroup(String groupName, List<ITaskComment> comments, boolean incoming) {
+ this.groupName = groupName;
+ this.comments = comments;
+ this.incoming = incoming;
+ }
+
+ public List<TaskAttribute> getCommentAttributes() {
+ List<TaskAttribute> commentAttributes = new ArrayList<TaskAttribute>(comments.size());
+ for (ITaskComment comment : comments) {
+ commentAttributes.add(comment.getTaskAttribute());
+ }
+ return Collections.unmodifiableList(commentAttributes);
+ }
+
+ public List<ITaskComment> getComments() {
+ return Collections.unmodifiableList(comments);
+ }
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+ public boolean hasIncoming() {
+ return incoming;
+ }
+ }
+
+ // public for testing
+ public static final int MAX_CURRENT = 12;
+
+ // public for testing
+ public static final int MAX_RECENT = 20;
+
+ /**
+ * Groups comments according to "Older", "Recent" and "Current".
+ *
+ * @param comments
+ * a list of comments to be grouped
+ * @param currentPersonId
+ * current login user id
+ * @return a list of groups
+ */
+ public List<CommentGroup> groupComments(List<ITaskComment> comments, String currentPersonId) {
+ if (comments.size() == 0) {
+ return Collections.emptyList();
+ }
+
+ List<CommentGroup> commentGroups = new ArrayList<CommentGroup>(3);
+
+ // current
+ List<ITaskComment> current = new ArrayList<ITaskComment>(MAX_CURRENT);
+ if (comments.size() > MAX_CURRENT) {
+ for (int i = comments.size() - 1; i >= 0; i--) {
+ ITaskComment comment = comments.get(i);
+ if (isCurrent(current, comment, currentPersonId)) {
+ current.add(comment);
+ }
+ }
+ Collections.reverse(current);
+ } else {
+ current = comments;
+ }
+ commentGroups.add(new CommentGroup(CommentGroup.CURRENT, current, hasIncomingChanges(current)));
+
+ // recent
+ if (comments.size() > current.size()) {
+ int recentToIndex = comments.size() - current.size();
+ int recentFromIndex = Math.max(recentToIndex - MAX_RECENT, 0);
+ List<ITaskComment> recent = new ArrayList<ITaskComment>(comments.subList(recentFromIndex, recentToIndex));
+ if (recent.size() > 0) {
+ commentGroups.add(new CommentGroup(CommentGroup.RECENT, recent, hasIncomingChanges(recent)));
+
+ // the rest goes to older
+ if (comments.size() > current.size() + recent.size()) {
+ int olderToIndex = comments.size() - current.size() - recent.size();
+ List<ITaskComment> older = new ArrayList<ITaskComment>(comments.subList(0, olderToIndex));
+ commentGroups.add(new CommentGroup(CommentGroup.OLDER, older, hasIncomingChanges(older)));
+ }
+ }
+ }
+
+ Collections.reverse(commentGroups);
+ return commentGroups;
+ }
+
+ protected boolean hasIncomingChanges(ITaskComment taskComment) {
+ return false;
+ }
+
+ private boolean hasIncomingChanges(List<ITaskComment> comments) {
+ for (ITaskComment comment : comments) {
+ if (hasIncomingChanges(comment)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // public for testing
+ public boolean isCurrent(List<ITaskComment> current, ITaskComment comment, String currentPersonId) {
+ if (current.size() >= MAX_CURRENT) {
+ return false;
+ }
+
+ // add all incoming changes
+ if (hasIncomingChanges(comment)) {
+ return true;
+ }
+
+ if (!current.isEmpty()) {
+ // check if last comment was by current user
+ ITaskComment lastComment = current.get(current.size() - 1);
+ IRepositoryPerson lastPerson = lastComment.getAuthor();
+ if (lastPerson != null && lastPerson.getPersonId().equals(currentPersonId)) {
+ // bug 238038 comment #58, if the latest comment is generated automatically, look back one comment
+ IRepositoryPerson person = comment.getAuthor();
+ if (person != null && person.getPersonId().equals(currentPersonId) && lastComment.getText() != null
+ && lastComment.getText().contains(AttachmentUtil.CONTEXT_DESCRIPTION)) {
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/DateAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/DateAttributeEditor.java
new file mode 100644
index 0000000..bb8efe9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/DateAttributeEditor.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * @author Steffen Pingel
+ * @author Robert Elves
+ */
+public class DateAttributeEditor extends AbstractAttributeEditor {
+
+ private DatePicker datePicker;
+
+ private boolean showTime;
+
+ public DateAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE));
+ }
+
+ @Override
+ public void createControl(Composite composite, FormToolkit toolkit) {
+ if (isReadOnly()) {
+ Text text = new Text(composite, SWT.FLAT | SWT.READ_ONLY);
+ text.setFont(EditorUtil.TEXT_FONT);
+ toolkit.adapt(text, false, false);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ text.setText(getTextValue());
+ setControl(text);
+ } else {
+ Composite dateWithClearComposite = toolkit.createComposite(composite);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = 2;
+ layout.marginWidth = 1;
+ layout.verticalSpacing = 2;
+ layout.horizontalSpacing = 2;
+ dateWithClearComposite.setLayout(layout);
+ datePicker = new DatePicker(dateWithClearComposite, SWT.FLAT, getTextValue(), showTime, 0);
+ datePicker.setFont(EditorUtil.TEXT_FONT);
+ if (!showTime) {
+ datePicker.setDateFormat(EditorUtil.getDateFormat());
+ } else {
+ datePicker.setDateFormat(EditorUtil.getDateTimeFormat());
+ }
+ if (getValue() != null) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(getValue());
+ datePicker.setDate(cal);
+ }
+ datePicker.addPickerSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Calendar cal = datePicker.getDate();
+ if (cal != null) {
+ if (!showTime) {
+ TaskActivityUtil.snapStartOfDay(cal);
+ }
+ Date value = cal.getTime();
+ if (!value.equals(getValue())) {
+ setValue(value);
+ }
+ } else {
+ if (getValue() != null) {
+ setValue(null);
+ }
+ datePicker.setDate(null);
+ }
+ }
+ });
+
+ GridDataFactory.fillDefaults().hint(120, SWT.DEFAULT).grab(true, false).applyTo(datePicker);
+ datePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ toolkit.adapt(datePicker, false, false);
+
+ ImageHyperlink clearDeadlineDate = toolkit.createImageHyperlink(dateWithClearComposite, SWT.NONE);
+ clearDeadlineDate.setImage(CommonImages.getImage(CommonImages.CLEAR));
+ clearDeadlineDate.setToolTipText(Messages.DateAttributeEditor_Clear);
+ clearDeadlineDate.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (getValue() != null) {
+ setValue(null);
+ }
+ datePicker.setDate(null);
+ }
+
+ });
+
+ toolkit.paintBordersFor(dateWithClearComposite);
+ setControl(dateWithClearComposite);
+ }
+ }
+
+ @Override
+ protected void decorateIncoming(Color color) {
+ if (datePicker != null) {
+ datePicker.setBackground(color);
+ }
+ }
+
+ public boolean getShowTime() {
+ return showTime;
+ }
+
+ private String getTextValue() {
+ Date date = getValue();
+ if (date != null) {
+ if (getShowTime()) {
+ return EditorUtil.formatDateTime(date);
+ } else {
+ return EditorUtil.formatDate(date);
+ }
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public Date getValue() {
+ return getAttributeMapper().getDateValue(getTaskAttribute());
+ }
+
+ public void setShowTime(boolean showTime) {
+ this.showTime = showTime;
+ }
+
+ public void setValue(Date date) {
+ getAttributeMapper().setDateValue(getTaskAttribute(), date);
+ attributeChanged();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/EditorBusyIndicator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/EditorBusyIndicator.java
new file mode 100644
index 0000000..bbd323b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/EditorBusyIndicator.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchPlugin;
+
+/**
+ * Provides a spinner animation for the tab title of an editor.
+ *
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ * @deprecated use {@link org.eclipse.mylyn.internal.provisional.commons.ui.editor.EditorBusyIndicator} instead
+ */
+ at Deprecated
+public class EditorBusyIndicator {
+
+ private class Animator implements Runnable {
+
+ int imageDataIndex = 0;
+
+ private final Image[] images;
+
+ private boolean stopped;
+
+ public Animator(Image[] images) {
+ this.images = images;
+ }
+
+ public void run() {
+ if (stopped) {
+ return;
+ }
+
+ try {
+ Image image = images[imageDataIndex];
+ imageDataIndex = (imageDataIndex + 1) % images.length;
+
+ if (updateTitleImage(image)) {
+ PlatformUI.getWorkbench().getDisplay().timerExec(DELAY, this);
+ }
+ } catch (Exception e) {
+ WorkbenchPlugin.log(e);
+ }
+ }
+
+ public void stop() {
+ stopped = true;
+ }
+ }
+
+ public static final int DELAY = 90;
+
+ private Animator animator;
+
+ private final IBusyEditor editor;
+
+ private Image[] images;
+
+ private Image oldImage;
+
+ public EditorBusyIndicator(IBusyEditor editor) {
+ this.editor = editor;
+ }
+
+ /**
+ * Starts the busy indication.
+ *
+ * @see #stop()
+ */
+ public void start() {
+ if (animator != null) {
+ stop();
+ }
+
+ try {
+ if (images == null) {
+ images = CommonImages.getProgressImages();
+ // if image fails to load do not continue
+ if (images == null) {
+ return;
+ }
+ }
+
+ oldImage = editor.getTitleImage();
+
+ if (images.length > 1) {
+ animator = new Animator(images);
+ animator.run();
+ }
+ } catch (SWTException e) {
+ WorkbenchPlugin.log(e);
+ }
+ }
+
+ /**
+ * Stops the animation.
+ *
+ * @see #start()
+ */
+ public void stop() {
+ if (animator != null) {
+ animator.stop();
+ animator = null;
+
+ updateTitleImage(oldImage);
+ oldImage = null;
+ }
+ }
+
+ private boolean updateTitleImage(final Image image) {
+ if (!PlatformUI.getWorkbench().isClosing()) {
+ if (image != null && !image.isDisposed()) {
+ editor.setTitleImage(image);
+ return true;
+ } else {
+ if (oldImage != null && !oldImage.isDisposed()) {
+ editor.setTitleImage(oldImage);
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/EditorUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/EditorUtil.java
new file mode 100644
index 0000000..a268742
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/EditorUtil.java
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.util.Date;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizardDialog;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.Mode;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.TaskFormPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
+import org.eclipse.ui.internal.EditorAreaHelper;
+import org.eclipse.ui.internal.WorkbenchPage;
+
+public class EditorUtil {
+
+ private static final int PAGE_H_SCROLL_INCREMENT = 64;
+
+ public static final int HEADER_COLUMN_MARGIN = 6;
+
+// public static final String DATE_FORMAT = "yyyy-MM-dd";
+//
+// public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
+
+ static final String KEY_MARKER = "marker"; //$NON-NLS-1$
+
+ static final String KEY_TEXT_VIEWER = "textViewer"; //$NON-NLS-1$
+
+ public static final int MAXIMUM_HEIGHT = 140;
+
+ public static final int MAXIMUM_WIDTH = 300;
+
+ // XXX why is this required?
+ public static final Font TEXT_FONT = JFaceResources.getDefaultFont();
+
+ public static final String KEY_TOGGLE_TO_MAXIMIZE_ACTION = "maximizeAction"; //$NON-NLS-1$
+
+ static boolean canDoGlobalAction(String actionId, TextViewer textViewer) {
+ if (actionId.equals(ActionFactory.CUT.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.CUT);
+ } else if (actionId.equals(ActionFactory.COPY.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.COPY);
+ } else if (actionId.equals(ActionFactory.PASTE.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.PASTE);
+ } else if (actionId.equals(ActionFactory.DELETE.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.DELETE);
+ } else if (actionId.equals(ActionFactory.UNDO.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.UNDO);
+ } else if (actionId.equals(ActionFactory.REDO.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.REDO);
+ } else if (actionId.equals(ActionFactory.SELECT_ALL.getId())) {
+ return textViewer.canDoOperation(ITextOperationTarget.SELECT_ALL);
+ }
+ return false;
+ }
+
+ /**
+ * @deprecated use {@link CommonTextSupport#canPerformAction(String, Control)} instead
+ */
+ @Deprecated
+ public static boolean canPerformAction(String actionId, Control focusControl) {
+ return CommonTextSupport.canPerformAction(actionId, focusControl);
+ }
+
+ /**
+ * @deprecated use {@link CommonTextSupport#doAction(String, Control)} instead
+ */
+ @Deprecated
+ public static void doAction(String actionId, Control focusControl) {
+ CommonTextSupport.doAction(actionId, focusControl);
+ }
+
+ private static Control findControl(Composite composite, String key) {
+ if (!composite.isDisposed()) {
+ for (Control child : composite.getChildren()) {
+ if (key.equals(getMarker(child))) {
+ return child;
+ }
+ if (child instanceof Composite) {
+ Control found = findControl((Composite) child, key);
+ if (found != null) {
+ return found;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Scroll to a specified piece of text
+ *
+ * @param control
+ * The StyledText to scroll to
+ */
+ private static void focusOn(ScrolledForm form, Control control) {
+ int pos = 0;
+ control.setEnabled(true);
+ control.setFocus();
+ control.forceFocus();
+ while (control != null && control != form.getBody()) {
+ pos += control.getLocation().y;
+ control = control.getParent();
+ }
+
+ pos = pos - 60; // form.getOrigin().y;
+ if (!form.getBody().isDisposed()) {
+ form.setOrigin(0, pos);
+ }
+ }
+
+ static DateFormat getDateFormat() {
+ return DateFormat.getDateInstance(DateFormat.MEDIUM);
+ }
+
+ static String formatDate(Date date) {
+ return getDateFormat().format(date);
+ }
+
+ static String formatDateTime(Date date) {
+ return getDateTimeFormat().format(date);
+ }
+
+ static DateFormat getDateTimeFormat() {
+ return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
+ }
+
+ public static Control getFocusControl(IFormPage page) {
+ if (page == null) {
+ return null;
+ }
+ IManagedForm form = page.getManagedForm();
+ if (form == null) {
+ return null;
+ }
+ Control control = form.getForm();
+ if (control == null || control.isDisposed()) {
+ return null;
+ }
+ Display display = control.getDisplay();
+ Control focusControl = display.getFocusControl();
+ if (focusControl == null || focusControl.isDisposed()) {
+ return null;
+ }
+ return focusControl;
+ }
+
+ public static String getMarker(Widget widget) {
+ return (String) widget.getData(KEY_MARKER);
+ }
+
+ /**
+ * @deprecated use {@link CommonTextSupport#getTextViewer(Widget)} instead
+ */
+ @Deprecated
+ public static TextViewer getTextViewer(Widget widget) {
+ return CommonTextSupport.getTextViewer(widget);
+ }
+
+ public static NewAttachmentWizardDialog openNewAttachmentWizard(final AbstractTaskEditorPage page, Mode mode,
+ AbstractTaskAttachmentSource source) {
+ TaskAttributeMapper mapper = page.getModel().getTaskData().getAttributeMapper();
+ TaskAttribute attribute = mapper.createTaskAttachment(page.getModel().getTaskData());
+ final NewAttachmentWizardDialog dialog = TasksUiInternal.openNewAttachmentWizard(page.getSite().getShell(),
+ page.getTaskRepository(), page.getTask(), attribute, mode, source);
+ dialog.getShell().addDisposeListener(new DisposeListener() {
+
+ public void widgetDisposed(DisposeEvent e) {
+ if (dialog.getReturnCode() == Window.OK) {
+ page.getTaskEditor().refreshPages();
+ }
+ }
+
+ });
+ return dialog;
+ }
+
+ /**
+ * Selects the given object in the editor.
+ *
+ * @param o
+ * The object to be selected.
+ * @param highlight
+ * Whether or not the object should be highlighted.
+ */
+ public static boolean reveal(ScrolledForm form, String key) {
+ Control control = findControl(form.getBody(), key);
+ if (control != null) {
+ // expand all children
+ if (control instanceof ExpandableComposite) {
+ ExpandableComposite ex = (ExpandableComposite) control;
+ if (!ex.isExpanded()) {
+ CommonFormUtil.setExpanded(ex, true);
+ }
+ }
+
+ // expand all parents of control
+ Composite comp = control.getParent();
+ while (comp != null) {
+ if (comp instanceof Section) {
+ if (!((Section) comp).isExpanded()) {
+ ((Section) comp).setExpanded(true);
+ }
+ } else if (comp instanceof ExpandableComposite) {
+ ExpandableComposite ex = (ExpandableComposite) comp;
+ if (!ex.isExpanded()) {
+ CommonFormUtil.setExpanded(ex, true);
+ }
+
+ // HACK: This is necessary
+ // due to a bug in SWT's ExpandableComposite.
+ // 165803: Expandable bars should expand when clicking anywhere
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=165803
+ if (ex.getData() != null && ex.getData() instanceof Composite) {
+ ((Composite) ex.getData()).setVisible(true);
+ }
+ }
+ comp = comp.getParent();
+ }
+ focusOn(form, control);
+ }
+ return true;
+ }
+
+ /**
+ * @deprecated Use {@link CommonUiUtil#setEnabled(Composite,boolean)} instead
+ */
+ @Deprecated
+ public static void setEnabledState(Composite composite, boolean enabled) {
+ CommonUiUtil.setEnabled(composite, enabled);
+ }
+
+ public static void setMarker(Widget widget, String text) {
+ widget.setData(KEY_MARKER, text);
+ }
+
+ /**
+ * @deprecated use {@link CommonTextSupport#setTextViewer(Widget, TextViewer)} instead
+ */
+ @Deprecated
+ public static void setTextViewer(Widget widget, TextViewer textViewer) {
+ CommonTextSupport.setTextViewer(widget, textViewer);
+ }
+
+ /**
+ * Programmatically expand the provided ExpandableComposite, using reflection to fire the expansion listeners (see
+ * bug#70358)
+ *
+ * @param comp
+ * @deprecated Use {@link CommonFormUtil#setExpanded(ExpandableComposite,boolean)} instead
+ */
+ @Deprecated
+ public static void toggleExpandableComposite(boolean expanded, ExpandableComposite comp) {
+ CommonFormUtil.setExpanded(comp, expanded);
+ }
+
+ /**
+ * @deprecated Use {@link CommonFormUtil#disableScrollingOnFocus(ScrolledForm)} instead
+ */
+ @Deprecated
+ public static void disableScrollingOnFocus(ScrolledForm form) {
+ CommonFormUtil.disableScrollingOnFocus(form);
+ }
+
+ /**
+ * @deprecated Use {@link CommonFormUtil#ensureVisible(Control)} instead
+ */
+ @Deprecated
+ public static void ensureVisible(Control control) {
+ CommonFormUtil.ensureVisible(control);
+ }
+
+ // copied from Section.reflow()
+ public static void reflow(Control control) {
+ Composite c = control.getParent();
+ while (c != null) {
+ c.setRedraw(false);
+ c = c.getParent();
+ if (c instanceof SharedScrolledComposite) {
+ break;
+ }
+ }
+ c = control.getParent();
+ while (c != null) {
+ c.layout(true);
+ c = c.getParent();
+ if (c instanceof SharedScrolledComposite) {
+ ((SharedScrolledComposite) c).reflow(true);
+ break;
+ }
+ }
+ c = control.getParent();
+ while (c != null) {
+ c.setRedraw(true);
+ c = c.getParent();
+ if (c instanceof SharedScrolledComposite) {
+ break;
+ }
+ }
+ }
+
+ public static Composite getLayoutAdvisor(AbstractTaskEditorPage page) {
+ Composite layoutAdvisor = page.getEditorComposite();
+ do {
+ layoutAdvisor = layoutAdvisor.getParent();
+ } while (!(layoutAdvisor instanceof CTabFolder));
+ return layoutAdvisor.getParent();
+ }
+
+ /**
+ * Recursively sets the menu of all children of <code>composite</code>.
+ *
+ * @deprecated Use {@link CommonUiUtil#setMenu(Composite,Menu)} instead
+ */
+ @Deprecated
+ public static void setMenu(Composite composite, Menu menu) {
+ CommonUiUtil.setMenu(composite, menu);
+ }
+
+ // TODO e3.4 replace reflection by assignment to RowLayout.center
+ public static void center(RowLayout rowLayout) {
+ try {
+ Field field = RowLayout.class.getDeclaredField("center"); //$NON-NLS-1$
+ field.set(rowLayout, Boolean.TRUE);
+ } catch (Throwable e) {
+ // ignore
+ }
+ }
+
+ public static Composite createBorder(Composite composite, final FormToolkit toolkit) {
+ // create composite to hold rounded border
+ final Composite roundedBorder = toolkit.createComposite(composite);
+ roundedBorder.addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent e) {
+ e.gc.setForeground(toolkit.getColors().getBorderColor());
+ Point size = roundedBorder.getSize();
+ e.gc.drawRoundRectangle(0, 2, size.x - 1, size.y - 5, 5, 5);
+ }
+ });
+ roundedBorder.setLayout(GridLayoutFactory.fillDefaults().margins(4, 6).create());
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT).grab(
+ true, false).applyTo(roundedBorder);
+ return roundedBorder;
+ }
+
+ public static Font setHeaderFontSizeAndStyle(Control text) {
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(text);
+ // .hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT)
+
+ float sizeFactor = 1.1f;
+ 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 static GridData getTextControlLayoutData(TaskFormPage page, Control control, boolean expandVertically) {
+ final GridData gd = new GridData();
+ // wrap text at this margin, see comment below
+ int width = getEditorWidth(page);
+ // the goal is to make the text viewer as big as the text so it does not require scrolling when first drawn
+ // on screen
+ Point size = control.computeSize(width, SWT.DEFAULT, true);
+ gd.widthHint = EditorUtil.MAXIMUM_WIDTH;
+ gd.minimumWidth = EditorUtil.MAXIMUM_WIDTH;
+ gd.horizontalAlignment = SWT.FILL;
+ gd.grabExcessHorizontalSpace = true;
+ // limit height to be avoid dynamic resizing of the text widget:
+ // MAXIMUM_HEIGHT < height < MAXIMUM_HEIGHT * 3
+ //gd.minimumHeight = AbstractAttributeEditor.MAXIMUM_HEIGHT;
+ gd.heightHint = Math.min(Math.max(EditorUtil.MAXIMUM_HEIGHT, size.y), EditorUtil.MAXIMUM_HEIGHT * 3);
+ if (expandVertically) {
+ gd.verticalAlignment = SWT.FILL;
+ gd.grabExcessVerticalSpace = true;
+ }
+ return gd;
+ // shrink the text control if the editor width is reduced, otherwise the text field will always keep it's original
+ // width and will cause the editor to have a horizonal scroll bar
+// composite.addControlListener(new ControlAdapter() {
+// @Override
+// public void controlResized(ControlEvent e) {
+// int width = sectionComposite.getSize().x;
+// Point size = descriptionTextViewer.getTextWidget().computeSize(width, SWT.DEFAULT, true);
+// // limit width to parent widget
+// gd.widthHint = width;
+// // limit height to avoid dynamic resizing of the text widget
+// gd.heightHint = Math.min(Math.max(DESCRIPTION_HEIGHT, size.y), DESCRIPTION_HEIGHT * 4);
+// sectionComposite.layout();
+// }
+// });
+
+ }
+
+ private static int getEditorWidth(TaskFormPage page) {
+ int widthHint = 0;
+ if (page.getManagedForm() != null && page.getManagedForm().getForm() != null) {
+ widthHint = page.getManagedForm().getForm().getClientArea().width - 90;
+ }
+ if (widthHint <= 0 && page.getEditor().getEditorSite() != null
+ && page.getEditor().getEditorSite().getPage() != null) {
+ EditorAreaHelper editorManager = ((WorkbenchPage) page.getEditor().getEditorSite().getPage()).getEditorPresentation();
+ if (editorManager != null && editorManager.getLayoutPart() != null) {
+ widthHint = editorManager.getLayoutPart().getControl().getBounds().width - 90;
+ }
+ }
+ if (widthHint <= 0) {
+ widthHint = EditorUtil.MAXIMUM_WIDTH;
+ }
+ return widthHint;
+ }
+
+ public static GridLayout createSectionClientLayout() {
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ // leave 1px for borders
+ layout.marginTop = 2;
+ // spacing if a section is expanded
+ layout.marginBottom = 8;
+ return layout;
+ }
+
+ public static void initializeScrollbars(ScrolledForm form) {
+ // initialize scroll bars
+ ScrollBar hbar = form.getHorizontalBar();
+ if (hbar != null) {
+ hbar.setIncrement(PAGE_H_SCROLL_INCREMENT);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/FillWidthLayout.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/FillWidthLayout.java
new file mode 100644
index 0000000..352728c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/FillWidthLayout.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.ui.forms.widgets.ILayoutExtension;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * A layout that uses the width hint or client area of a composite to recommend the width of its children, allowing
+ * children to fill the width and specify their preferred height for a given width.
+ *
+ * Intended for use with a composite that contains a single child that should fill available horizontal space.
+ *
+ * @author David Green
+ */
+class FillWidthLayout extends Layout implements ILayoutExtension {
+
+ private final int marginLeft;
+
+ private final int marginRight;
+
+ private final int marginTop;
+
+ private final int marginBottom;
+
+ private final int widthHintMargin;
+
+ private Composite layoutAdvisor;
+
+ private int lastWidthHint;
+
+ private Point lastComputedSize;
+
+ /**
+ * create with 0 margins
+ *
+ */
+ public FillWidthLayout() {
+ this(0, 0, 0, 0);
+ }
+
+ /**
+ * create while specifying margins
+ *
+ * @param marginLeft
+ * the left margin in pixels, or 0 if there should be none
+ * @param marginRight
+ * the right margin in pixels, or 0 if there should be none
+ * @param marginTop
+ * the top margin in pixels, or 0 if there should be none
+ * @param marginBottom
+ * the bottom margin in pixels, or 0 if there should be none
+ */
+ public FillWidthLayout(int marginLeft, int marginRight, int marginTop, int marginBottom) {
+ this(null, marginLeft, marginRight, marginTop, marginBottom);
+ }
+
+ /**
+ * create specifying margins and a {@link #getLayoutAdvisor() layout advisor}.
+ *
+ * @param layoutAdvisor
+ * the composite that is used to advise on layout based on its {@link Composite#getClientArea() client
+ * area}.
+ * @param marginLeft
+ * the left margin in pixels, or 0 if there should be none
+ * @param marginRight
+ * the right margin in pixels, or 0 if there should be none
+ * @param marginTop
+ * the top margin in pixels, or 0 if there should be none
+ * @param marginBottom
+ * the bottom margin in pixels, or 0 if there should be none
+ */
+ public FillWidthLayout(Composite layoutAdvisor, int marginLeft, int marginRight, int marginTop, int marginBottom) {
+ this.layoutAdvisor = layoutAdvisor;
+ this.marginLeft = marginLeft;
+ this.marginRight = marginRight;
+ this.marginTop = marginTop;
+ this.marginBottom = marginBottom;
+ if (Platform.OS_MACOSX.equals(Platform.getOS())) {
+ this.widthHintMargin = 15;
+ } else {
+ this.widthHintMargin = 18;
+ }
+ }
+
+ /**
+ * calculate the client area of the given container, accomodating for insets and margins.
+ */
+ private int calculateWidthHint(Composite container) {
+ return calculateWidthHint(container, layoutAdvisor == null);
+ }
+
+ /**
+ * calculate the client area of the given container, accomodating for insets and margins.
+ */
+ private int calculateWidthHint(Composite container, boolean layoutAdvisorHit) {
+ if (container == layoutAdvisor) {
+ layoutAdvisorHit = true;
+ }
+ Rectangle clientArea = container.getClientArea();
+ int horizontalMargin = 0;
+ if (clientArea.width <= 1 || !layoutAdvisorHit) { // sometimes client area is incorrectly reported as 1
+ clientArea.width = calculateWidthHint(container.getParent(), layoutAdvisorHit);
+ }
+ Layout bodyLayout = container.getLayout();
+ if (bodyLayout instanceof GridLayout) {
+ GridLayout gridLayout = (GridLayout) bodyLayout;
+ horizontalMargin = (gridLayout.marginWidth * 2) + gridLayout.marginLeft + gridLayout.marginRight;
+ } else if (bodyLayout instanceof FillLayout) {
+ FillLayout fillLayout = (FillLayout) bodyLayout;
+ horizontalMargin = fillLayout.marginWidth * 2;
+ } else if (container instanceof Section) {
+ horizontalMargin = ((Section) container).marginWidth * 2;
+ } else if (container instanceof CTabFolder) {
+ CTabFolder folder = (CTabFolder) container;
+ horizontalMargin = folder.marginWidth * 2;
+ }
+ if (container instanceof ScrolledComposite) {
+ ScrolledComposite composite = (ScrolledComposite) container;
+ ScrollBar verticalBar = composite.getVerticalBar();
+ if (verticalBar != null) {
+ int verticalBarWidth = verticalBar.getSize().x;
+ horizontalMargin += Math.max(15, verticalBarWidth);
+ }
+ }
+ return clientArea.width - horizontalMargin;
+ }
+
+ @Override
+ protected Point computeSize(Composite composite, int widthHint, int heightHint, boolean flushCache) {
+ Control[] children = composite.getChildren();
+ if (children.length == 0) {
+ return new Point(0, 0);
+ }
+ if (widthHint <= 0) {
+ widthHint = calculateWidthHint(composite);
+ widthHint -= widthHintMargin;
+ }
+
+ int horizontalMargin = marginLeft + marginRight;
+ if (widthHint < horizontalMargin) {
+ widthHint = horizontalMargin;
+ }
+
+ if (lastComputedSize == null || widthHint != lastWidthHint) {
+ int resultX = 1;
+ int resultY = 1;
+ for (Control control : children) {
+ Point sz = control.computeSize(widthHint - horizontalMargin, -1, flushCache);
+ resultX = Math.max(resultX, sz.x);
+ resultY = Math.max(resultY, sz.y);
+ }
+
+ lastWidthHint = widthHint;
+ lastComputedSize = new Point(resultX + horizontalMargin, resultY + marginTop + marginBottom);
+ }
+ return new Point(lastComputedSize.x, lastComputedSize.y + 1);
+ }
+
+ @Override
+ protected void layout(Composite composite, boolean flushCache) {
+ Rectangle area = composite.getClientArea();
+ if (area.width == 0) {
+ area.width = calculateWidthHint(composite);
+ }
+
+ // account for margins
+ area.x += marginLeft;
+ area.y += marginTop;
+ area.width -= (marginRight + marginLeft);
+ area.height -= (marginBottom + marginTop);
+
+ Control[] children = composite.getChildren();
+ for (Control control : children) {
+ control.setBounds(area);
+ }
+ }
+
+ /**
+ * the composite that is used to advise on layout based on its {@link Composite#getClientArea() client area}.
+ *
+ * @return the layout advisor, or null if there is none
+ */
+ public Composite getLayoutAdvisor() {
+ return layoutAdvisor;
+ }
+
+ /**
+ * the composite that is used to advise on layout based on its {@link Composite#getClientArea() client area}.
+ *
+ * @param layoutAdvisor
+ * the layout advisor, or null if there is none
+ */
+ public void setLayoutAdvisor(Composite layoutAdvisor) {
+ this.layoutAdvisor = layoutAdvisor;
+ }
+
+ /**
+ * Flushes all cached information about control sizes.
+ */
+ public void flush() {
+ lastComputedSize = null;
+ }
+
+ public int computeMaximumWidth(Composite parent, boolean changed) {
+ int width = marginLeft + marginRight;
+ Control[] children = parent.getChildren();
+ for (Control control : children) {
+ width = Math.max(control.computeSize(SWT.DEFAULT, 0, changed).x + marginLeft + marginRight, width);
+ }
+ return width;
+ }
+
+ public int computeMinimumWidth(Composite parent, boolean changed) {
+ int width = marginLeft + marginRight;
+// Control[] children = parent.getChildren();
+// for (Control control : children) {
+// width = Math.max(control.computeSize(0, SWT.DEFAULT, changed).x + marginLeft + marginRight, width);
+// }
+ return width;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/FocusTracker.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/FocusTracker.java
new file mode 100644
index 0000000..eb2d3d2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/FocusTracker.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.editors;
+
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * Tracks which control had last focus for all registered controls.
+ *
+ * @author Steffen Pingel
+ */
+public class FocusTracker {
+
+ private Control lastFocusControl;
+
+ private final FocusListener listener = new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ lastFocusControl = (Control) e.widget;
+ }
+ };
+
+ public void track(Composite composite) {
+ Control[] children = composite.getChildren();
+ for (Control control : children) {
+ if ((control instanceof Text) || (control instanceof Button) || (control instanceof Combo)
+ || (control instanceof CCombo) || (control instanceof Tree) || (control instanceof Table)
+ || (control instanceof Spinner) || (control instanceof Link)
+ || (control instanceof org.eclipse.swt.widgets.List) || (control instanceof TabFolder)
+ || (control instanceof CTabFolder) || (control instanceof Hyperlink)
+ || (control instanceof FilteredTree) || (control instanceof StyledText)) {
+ control.addFocusListener(listener);
+ }
+ if (control instanceof Composite) {
+ track((Composite) control);
+ }
+ }
+ }
+
+ public void reset() {
+ lastFocusControl = null;
+ }
+
+ public boolean setFocus() {
+ if (lastFocusControl != null && !lastFocusControl.isDisposed()) {
+ return lastFocusControl.setFocus();
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/HighlightingHyperlinkTextPresentationManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/HighlightingHyperlinkTextPresentationManager.java
new file mode 100644
index 0000000..5defed7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/HighlightingHyperlinkTextPresentationManager.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 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.editors;
+
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.custom.StyleRange;
+
+/**
+ * A manager that decorates hyperlinks with the hyperlink color.
+ *
+ * @author Steffen Pingel
+ */
+public class HighlightingHyperlinkTextPresentationManager extends AbstractHyperlinkTextPresentationManager {
+
+ @Override
+ protected void decorate(StyleRange styleRange) {
+ styleRange.foreground = JFaceResources.getColorRegistry().get(JFacePreferences.ACTIVE_HYPERLINK_COLOR);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/IBusyEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/IBusyEditor.java
new file mode 100644
index 0000000..c062107
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/IBusyEditor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Shawn Minto
+ * @deprecated use {@link org.eclipse.mylyn.internal.provisional.commons.ui.editor.IBusyEditor} instead
+ */
+ at Deprecated
+public interface IBusyEditor {
+
+ public void setTitleImage(Image image);
+
+ public Image getTitleImage();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LocalTaskEditorContributionDescriptor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LocalTaskEditorContributionDescriptor.java
new file mode 100644
index 0000000..4c3bc0f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LocalTaskEditorContributionDescriptor.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+
+/**
+ * @author Shawn Minto
+ */
+public class LocalTaskEditorContributionDescriptor {
+
+ private final IConfigurationElement element;
+
+ private final String id;
+
+ public LocalTaskEditorContributionDescriptor(IConfigurationElement element) {
+ this.element = element;
+ this.id = element.getAttribute("id"); //$NON-NLS-1$
+ }
+
+ public AbstractLocalEditorPart createPart() {
+ try {
+ return (AbstractLocalEditorPart) element.createExecutableExtension("class"); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public String getId() {
+ return id;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java
new file mode 100644
index 0000000..43ba284
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/LongTextAttributeEditor.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class LongTextAttributeEditor extends AbstractAttributeEditor {
+
+ public LongTextAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.MULTIPLE));
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ int style = SWT.FLAT | SWT.MULTI | SWT.WRAP;
+ if (!isReadOnly()) {
+ style |= SWT.V_SCROLL;
+ }
+ SourceViewer viewer = new SourceViewer(parent, null, style);
+ RepositoryTextViewerConfiguration configuration = RichTextEditor.installHyperlinkPresenter(viewer,
+ getModel().getTaskRepository(), Mode.DEFAULT);
+ viewer.configure(configuration);
+ viewer.setDocument(new Document(getValue()));
+ final StyledText text = viewer.getTextWidget();
+ toolkit.adapt(text, false, false);
+
+ // enable cut/copy/paste
+ CommonTextSupport.setTextViewer(text, viewer);
+
+ if (isReadOnly()) {
+ viewer.setEditable(false);
+ } else {
+ viewer.setEditable(true);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ setValue(text.getText());
+ CommonFormUtil.ensureVisible(text);
+ }
+ });
+ }
+
+ setControl(text);
+ }
+
+ public String getValue() {
+ return getAttributeMapper().getValue(getTaskAttribute());
+ }
+
+ public void setValue(String text) {
+ getAttributeMapper().setValue(getTaskAttribute(), text);
+ attributeChanged();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/Messages.java
new file mode 100644
index 0000000..017cce0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/Messages.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.editors.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AbstractReplyToCommentAction_Reply;
+
+ public static String AttachmentSizeFormatter_0_bytes;
+
+ public static String AttachmentSizeFormatter_0_GB;
+
+ public static String AttachmentSizeFormatter_0_KB;
+
+ public static String AttachmentSizeFormatter_0_MB;
+
+ public static String AttachmentSizeFormatter_1_byte;
+
+ public static String AttachmentTableLabelProvider_File_;
+
+ public static String AttachmentTableLabelProvider_Patch;
+
+ public static String AttachmentTableLabelProvider_Task_Context;
+
+ public static String AttachmentTableLabelProvider_Type_;
+
+ public static String BrowserPreviewViewer_Error;
+
+ public static String BrowserPreviewViewer_Formatting_Wiki_Text;
+
+ public static String BrowserPreviewViewer_Loading_preview_;
+
+ public static String BrowserPreviewViewer_The_repository_does_not_support_HTML_preview;
+
+ public static String CategoryEditor_Category_Summary;
+
+ public static String CategoryEditor_Description_;
+
+ public static String CategoryEditor_URL_;
+
+ public static String CategoryEditorInput_Category_Editor;
+
+ public static String CommentGroupStrategy_Current;
+
+ public static String CommentGroupStrategy_Older;
+
+ public static String CommentGroupStrategy_Recent;
+
+ public static String DateAttributeEditor_Clear;
+
+ public static String PersonalPart_Personal_Planning;
+
+ public static String PlanningPageFactory_Private;
+
+ public static String PlanningPart_Personal_Notes;
+
+ public static String RichTextAttributeEditor_Viewer_Source;
+
+ public static String TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached;
+
+ public static String TaskEditorActionPart_Actions;
+
+ public static String TaskEditorActionPart_Add_to_Category;
+
+ public static String TaskEditorActionPart_Attach_Context;
+
+ public static String TaskEditorActionPart_Submit;
+
+ public static String TaskEditorActionPart_Submit_to_X;
+
+ public static String TaskEditorAttachmentPart_Attach_;
+
+ public static String TaskEditorAttachmentPart_Attach__Screenshot;
+
+ public static String TaskEditorAttachmentPart_Attachments;
+
+ public static String TaskEditorAttachmentPart_Created;
+
+ public static String TaskEditorAttachmentPart_Creator;
+
+ public static String TaskEditorAttachmentPart_Description;
+
+ public static String TaskEditorAttachmentPart_Name;
+
+ public static String TaskEditorAttachmentPart_No_attachments;
+
+ public static String TaskEditorAttachmentPart_Size;
+
+ public static String TaskEditorAttributePart_Attributes;
+
+ public static String TaskEditorAttributePart_Refresh_Attributes;
+
+ public static String TaskEditorAttributePart_Update_Failed;
+
+ public static String TaskEditorAttributePart_Updating_of_repository_configuration_failed;
+
+ public static String TaskEditorCommentPart_0;
+
+ public static String TaskEditorCommentPart_1;
+
+ public static String TaskEditorCommentPart_Collapse_Comments;
+
+ public static String TaskEditorCommentPart_Comments;
+
+ public static String TaskEditorCommentPart_Expand_Comments;
+
+ public static String TaskEditorDescriptionPart_Description;
+
+ public static String TaskEditorDescriptionPart_Detector;
+
+ public static String TaskEditorDescriptionPart_Duplicate_Detection_Failed;
+
+ public static String TaskEditorDescriptionPart_Duplicate_Detection;
+
+ public static String TaskEditorDescriptionPart_The_duplicate_detector_did_not_return_a_valid_query;
+
+ public static String TaskEditorDescriptionPart_Search;
+
+ public static String TaskEditorNewCommentPart_New_Comment;
+
+ public static String TaskEditorOutlineNode_Comments;
+
+ public static String TaskEditorOutlineNode_Description;
+
+ public static String TaskEditorOutlineNode_New_Comment;
+
+ public static String TaskEditorOutlineNode_Task_;
+
+ public static String TaskEditorPeoplePart_People;
+
+ public static String TaskEditorPlanningPart_0_SECOUNDS;
+
+ public static String TaskEditorPlanningPart_Active;
+
+ public static String TaskEditorPlanningPart_Clear;
+
+ public static String TaskEditorPlanningPart_Confirm_Activity_Time_Deletion;
+
+ public static String TaskEditorPlanningPart_Do_you_wish_to_reset_your_activity_time_on_this_task_;
+
+ public static String TaskEditorPlanningPart_Due;
+
+ public static String TaskEditorPlanningPart_Estimated;
+
+ public static String TaskEditorPlanningPart_Reset;
+
+ public static String TaskEditorPlanningPart_Scheduled;
+
+ public static String TaskEditorPlanningPart_TaskEditorPlanningPart_tooltip;
+
+ public static String TaskEditorPlanningPart_Time_working_on_this_task;
+
+ public static String TaskEditorRichTextPart_Browser_Preview;
+
+ public static String TaskEditorRichTextPart_Maximize;
+
+ public static String TaskEditorRichTextPart_Preview;
+
+ public static String TaskEditorSummaryPart_Summary;
+
+ public static String TaskPlanningEditor_Attributes;
+
+ public static String TaskPlanningEditor_Complete;
+
+ public static String TaskPlanningEditor_Completed;
+
+ public static String TaskPlanningEditor_Created;
+
+ public static String TaskPlanningEditor_Incomplete;
+
+ public static String TaskPlanningEditor_Notes;
+
+ public static String TaskPlanningEditor_Planning;
+
+ public static String TaskPlanningEditor_Retrieve_task_description_from_URL;
+
+ public static String TaskPlanningEditor_Save;
+
+ public static String TaskPlanningEditor_Status;
+
+ public static String TaskPlanningEditor_URL;
+
+ public static String AbstractTaskEditorPage_Comment_required;
+
+ public static String AbstractTaskEditorPage_Could_not_save_task;
+
+ public static String AbstractTaskEditorPage_Error_opening_task;
+
+ public static String AbstractTaskEditorPage_Failed_to_read_task_data_;
+
+ public static String AbstractTaskEditorPage_History;
+
+ public static String AbstractTaskEditorPage_Open_failed;
+
+ public static String AbstractTaskEditorPage_Open_with_Web_Browser;
+
+ public static String AbstractTaskEditorPage_Save_failed;
+
+ public static String AbstractTaskEditorPage_Submit_failed;
+
+ public static String AbstractTaskEditorPage_Submit_failed_;
+
+ public static String AbstractTaskEditorPage_Synchronize_to_retrieve_task_data;
+
+ public static String AbstractTaskEditorPage_Synchronize_to_update_editor_contents;
+
+ public static String AbstractTaskEditorPage_Add_task_to_tasklist;
+
+ public static String AbstractTaskEditorPage_Task_has_incoming_changes;
+
+ public static String AbstractTaskEditorPage_Title;
+
+ public static String AbstractTaskEditorPage_Unable_to_submit_at_this_time;
+
+ public static String AttributeEditorToolkit_Content_Assist_Available__X_;
+
+ public static String AttributePart_Category_;
+
+ public static String SummaryPart_Section_Title;
+
+ public static String TaskEditor_Task;
+
+ public static String TaskEditor_Task_added_to_the_Uncategorized_container;
+
+ public static String TaskEditorExtensionSettingsContribution__default_;
+
+ public static String TaskEditorExtensionSettingsContribution_Editor;
+
+ public static String TaskEditorExtensionSettingsContribution_Plain_Text;
+
+ public static String TaskEditorExtensionSettingsContribution_Select_the_capabilities_of_the_task_editor;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/MultiSelectionAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/MultiSelectionAttributeEditor.java
new file mode 100644
index 0000000..08b3c06
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/MultiSelectionAttributeEditor.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class MultiSelectionAttributeEditor extends AbstractAttributeEditor {
+
+ private String[] allValues;
+
+ private List list;
+
+ public MultiSelectionAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.SINGLE));
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ list = new List(parent, SWT.FLAT | SWT.MULTI | SWT.V_SCROLL);
+ toolkit.adapt(list, false, false);
+ list.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ list.setFont(EditorUtil.TEXT_FONT);
+
+ Map<String, String> labelByValue = getAttributeMapper().getOptions(getTaskAttribute());
+ if (labelByValue != null) {
+ allValues = labelByValue.keySet().toArray(new String[0]);
+ for (String value : allValues) {
+ list.add(labelByValue.get(value));
+ }
+ }
+
+ select(getValues(), getValuesLabels());
+
+ if (allValues != null) {
+ list.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Assert.isNotNull(allValues);
+ int[] indices = list.getSelectionIndices();
+ String[] selectedValues = new String[indices.length];
+ for (int i = 0; i < indices.length; i++) {
+ int index = indices[i];
+ Assert.isLegal(index >= 0 && index <= allValues.length - 1);
+ selectedValues[i] = allValues[index];
+ }
+ setValues(selectedValues);
+ }
+ });
+ list.showSelection();
+ }
+
+ setControl(list);
+ }
+
+ public String[] getValues() {
+ return getAttributeMapper().getValues(getTaskAttribute()).toArray(new String[0]);
+ }
+
+ public String[] getValuesLabels() {
+ return getAttributeMapper().getValueLabels(getTaskAttribute()).toArray(new String[0]);
+ }
+
+ private void select(String[] values, String[] labels) {
+ if (values != null) {
+ list.deselectAll();
+ Set<String> selectedValues = new HashSet<String>(Arrays.asList(values));
+ for (int i = 0; i < allValues.length; i++) {
+ if (selectedValues.contains(allValues[i])) {
+ list.select(i);
+ }
+ }
+ } else {
+ list.setItems(labels);
+ list.setSelection(labels);
+ }
+ }
+
+ public void setValues(String[] values) {
+ getAttributeMapper().setValues(getTaskAttribute(), Arrays.asList(values));
+ attributeChanged();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PersonAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PersonAttributeEditor.java
new file mode 100644
index 0000000..17b86e4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PersonAttributeEditor.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+
+/**
+ * @author Steffen Pingel
+ */
+public class PersonAttributeEditor extends TextAttributeEditor {
+
+ public PersonAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ }
+
+ @Override
+ public String getValue() {
+ IRepositoryPerson repositoryPerson = getAttributeMapper().getRepositoryPerson(getTaskAttribute());
+ if (repositoryPerson != null) {
+ return (isReadOnly()) ? repositoryPerson.toString() : repositoryPerson.getPersonId();
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public void setValue(String text) {
+ IRepositoryPerson person = getAttributeMapper().getTaskRepository().createPerson(text);
+ getAttributeMapper().setRepositoryPerson(getTaskAttribute(), person);
+ attributeChanged();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPageFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPageFactory.java
new file mode 100644
index 0000000..1aff7a1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPageFactory.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.forms.editor.IFormPage;
+
+public class PlanningPageFactory extends AbstractTaskEditorPageFactory {
+
+ @Override
+ public boolean canCreatePageFor(TaskEditorInput input) {
+ return true;
+ }
+
+ @Override
+ public IFormPage createPage(TaskEditor parentEditor) {
+ return new TaskPlanningEditor(parentEditor);
+ }
+
+ @Override
+ public Image getPageImage() {
+ return CommonImages.getImage(CommonImages.CALENDAR_SMALL);
+ }
+
+ @Override
+ public String getPageText() {
+ return Messages.PlanningPageFactory_Private;
+ }
+
+ @Override
+ public int getPriority() {
+ return PRIORITY_PLANNING;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java
new file mode 100644
index 0000000..cb6c485
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PlanningPart.java
@@ -0,0 +1,576 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.Calendar;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.mylyn.commons.core.DateUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DayDateRange;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.ui.ScheduleDatePicker;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+import org.eclipse.mylyn.tasks.core.TaskActivityAdapter;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+import org.eclipse.mylyn.tasks.ui.editors.TaskFormPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+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.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Shawn Minto
+ */
+public class PlanningPart extends AbstractLocalEditorPart {
+
+ private boolean needsDueDate;
+
+ private String notesString;
+
+ private RichTextEditor noteEditor;
+
+ private static final int CONTROL_WIDTH = 120;
+
+ private DatePicker dueDatePicker;
+
+ private Text elapsedTimeText;
+
+ private Spinner estimatedTime;
+
+ private ScheduleDatePicker scheduleDatePicker;
+
+ private static final String PERSONAL_NOTES = Messages.PlanningPart_Personal_Notes;
+
+ private final ITaskListChangeListener TASK_LIST_LISTENER = new TaskListChangeAdapter() {
+
+ @Override
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (taskContainerDelta.getElement() instanceof ITask) {
+ final AbstractTask updateTask = (AbstractTask) taskContainerDelta.getElement();
+ if (updateTask != null && getTask() != null
+ && updateTask.getHandleIdentifier().equals(getTask().getHandleIdentifier())) {
+ if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().isClosing()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ updateFromTask(updateTask);
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+
+ };
+
+ private final ITaskActivityListener timingListener = new TaskActivityAdapter() {
+
+ @Override
+ public void elapsedTimeUpdated(ITask task, long newElapsedTime) {
+ if (task.equals(PlanningPart.this.getTask())) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (elapsedTimeText != null && !elapsedTimeText.isDisposed()) {
+ updateElapsedTime();
+ }
+ }
+ });
+
+ }
+ }
+ };
+
+ private CommonTextSupport textSupport;
+
+ private TaskFormPage page;
+
+ private Composite actualTimeComposite;
+
+ private ToolBarManager toolBarManager;
+
+ private boolean needsNotes;
+
+ private boolean alwaysExpand;
+
+ public PlanningPart(int sectionStyle) {
+ super(sectionStyle, Messages.PersonalPart_Personal_Planning);
+ this.needsNotes = true;
+ }
+
+ public void initialize(IManagedForm managedForm, TaskRepository taskRepository, AbstractTask task,
+ boolean needsDueDate, TaskFormPage page, CommonTextSupport textSupport) {
+ super.initialize(managedForm, taskRepository, task);
+ this.needsDueDate = needsDueDate;
+ this.page = page;
+ this.textSupport = textSupport;
+ }
+
+ private boolean notesEqual() {
+ if (getTask().getNotes() == null && notesString == null) {
+ return true;
+ }
+
+ if (getTask().getNotes() != null && notesString != null) {
+ return getTask().getNotes().equals(notesString) || notesString.equals(PERSONAL_NOTES);
+ }
+ return false;
+ }
+
+ @Override
+ public void commit(boolean onSave) {
+ Assert.isNotNull(getTask());
+
+ if (!notesEqual()) {
+ getTask().setNotes(notesString);
+ // XXX REFRESH THE TASLKIST
+ }
+
+ if (scheduleDatePicker != null && scheduleDatePicker.getScheduledDate() != null) {
+ if (getTask().getScheduledForDate() == null
+ || (getTask().getScheduledForDate() != null && !scheduleDatePicker.getScheduledDate().equals(
+ getTask().getScheduledForDate()))
+ || getTask().getScheduledForDate() instanceof DayDateRange) {
+ TasksUiPlugin.getTaskActivityManager()
+ .setScheduledFor(getTask(), scheduleDatePicker.getScheduledDate());
+ getTask().setReminded(false);
+ }
+ } else {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(getTask(), null);
+ getTask().setReminded(false);
+ }
+
+ if (estimatedTime != null) {
+ getTask().setEstimatedTimeHours(estimatedTime.getSelection());
+ }
+
+ if (dueDatePicker != null && dueDatePicker.getDate() != null) {
+ TasksUiPlugin.getTaskActivityManager().setDueDate(getTask(), dueDatePicker.getDate().getTime());
+ } else {
+ TasksUiPlugin.getTaskActivityManager().setDueDate(getTask(), null);
+ }
+
+ super.commit(onSave);
+ }
+
+ @Override
+ public Control createControl(Composite parent, FormToolkit toolkit) {
+ this.notesString = getTask().getNotes();
+ if (this.notesString == null) {
+ this.notesString = ""; //$NON-NLS-1$
+ }
+ Section section = createSection(parent, toolkit, isAlwaysExpand() || notesString.length() > 0);
+ Composite composite = toolkit.createComposite(section);
+ GridLayout layout = EditorUtil.createSectionClientLayout();
+ layout.numColumns = (needsDueDate) ? 6 : 4;
+ composite.setLayout(layout);
+
+ createScheduledDatePicker(toolkit, composite);
+
+ // disable due date picker if it's a repository due date
+ if (needsDueDate) {
+ createDueDatePicker(toolkit, composite);
+ }
+
+ createEstimatedTime(toolkit, composite);
+
+// createActualTime(toolkit, composite);
+
+ TasksUiInternal.getTaskList().addChangeListener(TASK_LIST_LISTENER);
+ TasksUiPlugin.getTaskActivityManager().addActivityListener(timingListener);
+
+ if (needsNotes()) {
+ createNotesArea(toolkit, composite, layout.numColumns);
+ }
+
+ toolkit.paintBordersFor(composite);
+ section.setClient(composite);
+ setSection(toolkit, section);
+ CommonUiUtil.setMenu(composite, parent.getMenu());
+ return section;
+ }
+
+ private void createNotesArea(final FormToolkit toolkit, Composite parent, int numColumns) {
+ Composite composite = toolkit.createComposite(parent);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.marginWidth = 1;
+ composite.setLayout(layout);
+ GridDataFactory.fillDefaults().span(numColumns, SWT.DEFAULT).grab(true, true).applyTo(composite);
+
+ if (page != null) {
+ IContextService contextService = (IContextService) page.getEditorSite().getService(IContextService.class);
+ if (contextService != null) {
+ AbstractTaskEditorExtension extension = TaskEditorExtensions.getTaskEditorExtension(getRepository());
+ if (extension != null) {
+ noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL,
+ contextService, extension);
+ }
+ }
+ }
+ if (noteEditor == null) {
+ noteEditor = new RichTextEditor(getRepository(), SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ }
+ noteEditor.setSpellCheckingEnabled(true);
+ noteEditor.createControl(composite, toolkit);
+
+ noteEditor.setText(notesString);
+
+ noteEditor.getControl().setLayoutData(
+ EditorUtil.getTextControlLayoutData(page, noteEditor.getViewer().getControl(), true));
+ noteEditor.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ noteEditor.setReadOnly(false);
+ if (textSupport != null) {
+ textSupport.install(noteEditor.getViewer(), true);
+ }
+ noteEditor.getViewer().addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ notesString = noteEditor.getText();
+ if (!notesEqual()) {
+ markDirty();
+ }
+ }
+ });
+ addNotesLabelText(toolkit, composite);
+ toolkit.paintBordersFor(composite);
+ }
+
+ private void addNotesLabelText(final FormToolkit toolkit, Composite composite) {
+
+ if (notesString.length() == 0) {
+ notesString = PERSONAL_NOTES;
+ noteEditor.setText(notesString);
+ }
+
+ FocusListener removePersonalNotesFocusListener = new FocusListener() {
+
+ public void focusGained(FocusEvent e) {
+ if (noteEditor.getText().equals(PERSONAL_NOTES)) {
+ noteEditor.setText(""); //$NON-NLS-1$
+
+ if (noteEditor.getViewer() != null) {
+ noteEditor.getViewer().getTextWidget().setForeground(toolkit.getColors().getForeground());
+ }
+ }
+ }
+
+ public void focusLost(FocusEvent e) {
+ }
+ };
+ boolean changeColor = false;
+ if (noteEditor.getText().equals(PERSONAL_NOTES)) {
+ changeColor = true;
+ }
+
+ if (noteEditor.getViewer() != null) {
+ noteEditor.getViewer().getTextWidget().addFocusListener(removePersonalNotesFocusListener);
+ if (changeColor) {
+ noteEditor.getViewer().getTextWidget().setForeground(
+ composite.getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY));
+ }
+ }
+
+ }
+
+ private void createActualTime(FormToolkit toolkit, Composite toolbarComposite) {
+
+ actualTimeComposite = toolkit.createComposite(toolbarComposite);
+ actualTimeComposite.setBackground(null);
+ actualTimeComposite.setBackgroundMode(SWT.INHERIT_FORCE);
+ RowLayout rowLayout = new RowLayout();
+ EditorUtil.center(rowLayout);
+ rowLayout.marginTop = 0;
+ rowLayout.marginBottom = 0;
+ actualTimeComposite.setLayout(rowLayout);
+
+ Label label = toolkit.createLabel(actualTimeComposite, Messages.TaskEditorPlanningPart_Active);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ label.setToolTipText(Messages.TaskEditorPlanningPart_Time_working_on_this_task);
+ label.setBackground(null);
+
+ Composite nameValueComp = createComposite(actualTimeComposite, 2, toolkit);
+ nameValueComp.setBackground(null);
+
+ elapsedTimeText = new Text(nameValueComp, SWT.FLAT | SWT.READ_ONLY);
+ elapsedTimeText.setFont(EditorUtil.TEXT_FONT);
+ elapsedTimeText.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ toolkit.adapt(elapsedTimeText, true, false);
+ elapsedTimeText.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ elapsedTimeText.setBackground(null);
+ updateElapsedTime();
+ elapsedTimeText.setEditable(false);
+
+ ImageHyperlink resetActivityTimeButton = toolkit.createImageHyperlink(nameValueComp, SWT.NONE);
+ resetActivityTimeButton.setBackground(null);
+ resetActivityTimeButton.setImage(CommonImages.getImage(CommonImages.FIND_CLEAR));
+ resetActivityTimeButton.setToolTipText(Messages.TaskEditorPlanningPart_Reset);
+ resetActivityTimeButton.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (MessageDialog.openConfirm(getControl().getShell(),
+ Messages.TaskEditorPlanningPart_Confirm_Activity_Time_Deletion,
+ Messages.TaskEditorPlanningPart_Do_you_wish_to_reset_your_activity_time_on_this_task_)) {
+ MonitorUi.getActivityContextManager().removeActivityTime(getTask().getHandleIdentifier(), 0l,
+ System.currentTimeMillis());
+ }
+ }
+ });
+ }
+
+ private void updateElapsedTime() {
+ long elapsedTime = TasksUiPlugin.getTaskActivityManager().getElapsedTime(getTask());
+ if (elapsedTime > 0) {
+ if (actualTimeComposite != null && !actualTimeComposite.isVisible()) {
+ actualTimeComposite.setVisible(true);
+ }
+ } else {
+ if (actualTimeComposite != null) {
+ actualTimeComposite.setVisible(false);
+ }
+ }
+ String elapsedTimeString = DateUtil.getFormattedDurationShort(elapsedTime);
+ if (elapsedTimeString.equals("")) { //$NON-NLS-1$
+ elapsedTimeString = Messages.TaskEditorPlanningPart_0_SECOUNDS;
+ }
+ elapsedTimeText.setText(elapsedTimeString);
+
+ }
+
+ private Composite createComposite(Composite parent, int col, FormToolkit toolkit) {
+ Composite nameValueComp = toolkit.createComposite(parent);
+ GridLayout layout = new GridLayout(3, false);
+ layout.marginHeight = 3;
+ nameValueComp.setLayout(layout);
+ return nameValueComp;
+ }
+
+ private void createDueDatePicker(FormToolkit toolkit, Composite parent) {
+ Label label = toolkit.createLabel(parent, Messages.TaskEditorPlanningPart_Due);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+
+ Composite composite = createComposite(parent, 2, toolkit);
+
+ dueDatePicker = new DatePicker(composite, SWT.FLAT, DatePicker.LABEL_CHOOSE, true, 0);
+ GridDataFactory.fillDefaults().hint(CONTROL_WIDTH, SWT.DEFAULT).applyTo(dueDatePicker);
+ dueDatePicker.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ dueDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ if (getTask().getDueDate() != null) {
+ Calendar calendar = TaskActivityUtil.getCalendar();
+ calendar.setTime(getTask().getDueDate());
+ dueDatePicker.setDate(calendar);
+ }
+ dueDatePicker.addPickerSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent arg0) {
+ markDirty();
+ }
+ });
+ toolkit.adapt(dueDatePicker, false, false);
+ toolkit.paintBordersFor(composite);
+
+ ImageHyperlink clearDueDate = toolkit.createImageHyperlink(composite, SWT.NONE);
+ clearDueDate.setImage(CommonImages.getImage(CommonImages.FIND_CLEAR));
+ clearDueDate.setToolTipText(Messages.TaskEditorPlanningPart_Clear);
+ clearDueDate.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ dueDatePicker.setDate(null);
+ markDirty();
+ }
+ });
+ }
+
+ private void createEstimatedTime(FormToolkit toolkit, Composite parent) {
+ Label label = toolkit.createLabel(parent, Messages.TaskEditorPlanningPart_Estimated);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+
+ Composite composite = createComposite(parent, 2, toolkit);
+
+ // Estimated time
+ estimatedTime = new Spinner(composite, SWT.FLAT);
+ estimatedTime.setDigits(0);
+ estimatedTime.setMaximum(100);
+ estimatedTime.setMinimum(0);
+ estimatedTime.setIncrement(1);
+ estimatedTime.setSelection(getTask().getEstimatedTimeHours());
+ if (!PlatformUtil.spinnerHasNativeBorder()) {
+ estimatedTime.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ }
+ estimatedTime.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ if (getTask().getEstimatedTimeHours() != estimatedTime.getSelection()) {
+ markDirty();
+ }
+ }
+ });
+
+ ImageHyperlink clearEstimated = toolkit.createImageHyperlink(composite, SWT.NONE);
+ clearEstimated.setImage(CommonImages.getImage(CommonImages.FIND_CLEAR));
+ clearEstimated.setToolTipText(Messages.TaskEditorPlanningPart_Clear);
+ clearEstimated.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ estimatedTime.setSelection(0);
+ markDirty();
+ }
+ });
+ toolkit.paintBordersFor(composite);
+ }
+
+ private void createScheduledDatePicker(FormToolkit toolkit, Composite parent) {
+ Label label = toolkit.createLabel(parent, Messages.TaskEditorPlanningPart_Scheduled);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+
+ Composite composite = createComposite(parent, 2, toolkit);
+
+ scheduleDatePicker = new ScheduleDatePicker(composite, getTask(), SWT.FLAT);
+ GridDataFactory.fillDefaults().hint(CONTROL_WIDTH, SWT.DEFAULT).applyTo(scheduleDatePicker);
+ scheduleDatePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ toolkit.adapt(scheduleDatePicker, false, false);
+ toolkit.paintBordersFor(composite);
+
+ scheduleDatePicker.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ scheduleDatePicker.addPickerSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent arg0) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent arg0) {
+ markDirty();
+ }
+ });
+
+ ImageHyperlink clearScheduledDate = toolkit.createImageHyperlink(composite, SWT.NONE);
+ clearScheduledDate.setImage(CommonImages.getImage(CommonImages.FIND_CLEAR));
+ clearScheduledDate.setToolTipText(Messages.TaskEditorPlanningPart_Clear);
+ clearScheduledDate.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ scheduleDatePicker.setScheduledDate(null);
+ // XXX why is this set here?
+ getTask().setReminded(false);
+ markDirty();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ TasksUiPlugin.getTaskActivityManager().removeActivityListener(timingListener);
+ TasksUiInternal.getTaskList().removeChangeListener(TASK_LIST_LISTENER);
+
+ if (toolBarManager != null) {
+ toolBarManager.dispose();
+ }
+ }
+
+ private void updateFromTask(AbstractTask updateTask) {
+ if (scheduleDatePicker != null && !scheduleDatePicker.isDisposed()) {
+ if (updateTask.getScheduledForDate() != null) {
+ scheduleDatePicker.setScheduledDate(updateTask.getScheduledForDate());
+ } else {
+ scheduleDatePicker.setScheduledDate(null);
+ }
+ }
+
+ if (estimatedTime != null && !estimatedTime.isDisposed()) {
+ estimatedTime.setSelection(updateTask.getEstimatedTimeHours());
+ }
+ }
+
+ @Override
+ protected void setSection(FormToolkit toolkit, Section section) {
+ if (section.getTextClient() == null) {
+ Composite toolbarComposite = toolkit.createComposite(section);
+ toolbarComposite.setBackground(null);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.marginTop = 0;
+ rowLayout.marginBottom = 0;
+ EditorUtil.center(rowLayout);
+ toolbarComposite.setLayout(rowLayout);
+
+ createActualTime(toolkit, toolbarComposite);
+
+ fillToolbar(toolbarComposite);
+ section.setTextClient(toolbarComposite);
+
+ }
+
+ super.setSection(toolkit, section);
+ }
+
+ private void fillToolbar(Composite parent) {
+// if (toolBarManager == null) {
+// toolBarManager = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
+// toolBarManager.add(new TaskEditorScheduleAction(getTask()));
+// toolBarManager.createControl(parent);
+// }
+ }
+
+ public boolean needsNotes() {
+ return needsNotes;
+ }
+
+ public void setNeedsNotes(boolean needsNotes) {
+ this.needsNotes = needsNotes;
+ }
+
+ public boolean isAlwaysExpand() {
+ return alwaysExpand;
+ }
+
+ public void setAlwaysExpand(boolean alwaysExpand) {
+ this.alwaysExpand = alwaysExpand;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PriorityAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PriorityAttributeEditor.java
new file mode 100644
index 0000000..98fa005
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PriorityAttributeEditor.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.editors;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelEvent;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelListener;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class PriorityAttributeEditor extends AbstractAttributeEditor {
+
+ private PriorityEditor editor;
+
+ private ITaskMapping mapping;
+
+ private final TaskDataModelListener modelListener = new TaskDataModelListener() {
+ @Override
+ public void attributeChanged(TaskDataModelEvent event) {
+ if (getTaskAttribute().equals(event.getTaskAttribute())) {
+ refresh();
+ }
+ }
+ };
+
+ public PriorityAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ boolean noOptions = getAttributeMapper().getOptions(getTaskAttribute()).size() == 0;
+ setReadOnly(isReadOnly() || noOptions);
+ }
+
+ @Override
+ public void createControl(final Composite parent, FormToolkit toolkit) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(getModel().getTaskRepository()
+ .getConnectorKind());
+ mapping = connector.getTaskMapping(getModel().getTaskData());
+ editor = new PriorityEditor() {
+ @Override
+ protected void valueChanged(String value) {
+ setValue(value);
+ };
+ };
+ editor.setReadOnly(isReadOnly());
+ editor.createControl(parent, toolkit);
+ setControl(editor.getControl());
+ getControl().addDisposeListener(new DisposeListener() {
+
+ public void widgetDisposed(DisposeEvent e) {
+ getModel().removeModelListener(modelListener);
+ }
+
+ });
+ getModel().addModelListener(modelListener);
+ refresh();
+ }
+
+ public String getValue() {
+ return getAttributeMapper().getValue(getTaskAttribute());
+ }
+
+ public String getValueLabel() {
+ return getAttributeMapper().getValueLabel(getTaskAttribute());
+ }
+
+ @Override
+ public void refresh() {
+ editor.setLabelByValue(getAttributeMapper().getOptions(getTaskAttribute()));
+ updateEditor();
+ }
+
+ public void setValue(String value) {
+ String oldValue = getAttributeMapper().getValue(getTaskAttribute());
+ if (!oldValue.equals(value)) {
+ getAttributeMapper().setValue(getTaskAttribute(), value);
+ attributeChanged();
+ updateEditor();
+ }
+ }
+
+ private void updateEditor() {
+ editor.select(getValue(), mapping.getPriorityLevel());
+ editor.setToolTipText(getValueLabel());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PriorityEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PriorityEditor.java
new file mode 100644
index 0000000..0911c07
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/PriorityEditor.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.editors;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author David Shepherd
+ * @author Steffen Pingel
+ */
+public class PriorityEditor {
+
+ private Control control;
+
+ private boolean ignoreNotification;
+
+ private Label label;
+
+ private Map<String, String> labelByValue;
+
+ private Menu menu;
+
+ private boolean readOnly;
+
+ private ToolItem selectionButton;
+
+ private ToolBar toolBar;
+
+ private String value;
+
+ public PriorityEditor() {
+ }
+
+ public void createControl(final Composite parent, FormToolkit toolkit) {
+ if (isReadOnly()) {
+ label = toolkit.createLabel(parent, ""); //$NON-NLS-1$
+ setControl(label);
+ } else {
+ toolBar = new ToolBar(parent, SWT.FLAT);
+ selectionButton = new ToolItem(toolBar, SWT.DROP_DOWN);
+ selectionButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (menu == null) {
+ createMenu(toolBar);
+ }
+ Point location = parent.toDisplay(toolBar.getLocation());
+ location.y = location.y + selectionButton.getBounds().height;
+ if (value != null) {
+ MenuItem[] items = menu.getItems();
+ for (MenuItem item : items) {
+ item.setSelection(value.equals(item.getData()));
+ }
+ }
+ menu.setLocation(location);
+ menu.setVisible(true);
+ }
+ });
+ selectionButton.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (menu != null) {
+ menu.dispose();
+ }
+ }
+ });
+ toolkit.adapt(toolBar);
+ setControl(toolBar);
+ }
+ }
+
+ private void createMenu(final ToolBar bar) {
+ menu = new Menu(bar);
+ for (String key : labelByValue.keySet()) {
+ final MenuItem item = new MenuItem(menu, SWT.CHECK);
+ item.setText(labelByValue.get(key));
+ item.setData(key);
+ item.setImage(getSmallImage(key));
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!ignoreNotification) {
+ value = (String) item.getData();
+ valueChanged(value);
+ }
+ }
+ });
+ }
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ public Map<String, String> getLabelByValue() {
+ return Collections.unmodifiableMap(labelByValue);
+ }
+
+ private ImageDescriptor getLargeImageDescriptor(PriorityLevel priorityLevel) {
+ switch (priorityLevel) {
+ case P1:
+ return CommonImages.PRIORITY_1_LARGE;
+ case P2:
+ return CommonImages.PRIORITY_2_LARGE;
+ case P3:
+ return CommonImages.PRIORITY_3_LARGE;
+ case P4:
+ return CommonImages.PRIORITY_4_LARGE;
+ case P5:
+ return CommonImages.PRIORITY_5_LARGE;
+ default:
+ return CommonImages.PRIORITY_3_LARGE;
+ }
+ }
+
+ private Image getSmallImage(String value) {
+ ImageDescriptor descriptor = getSmallImageDescriptor(value);
+ if (descriptor != null) {
+ return CommonImages.getImage(descriptor);
+ }
+ return null;
+ }
+
+ private ImageDescriptor getSmallImageDescriptor(String value) {
+ PriorityLevel priorityLevel = PriorityLevel.fromString(value);
+ if (priorityLevel != null) {
+ return TasksUiImages.getImageDescriptorForPriority(priorityLevel);
+ }
+ return null;
+ }
+
+ public String getToolTipText() {
+ if (label != null) {
+ return label.getToolTipText();
+ }
+ if (selectionButton != null) {
+ return selectionButton.getToolTipText();
+ }
+ return null;
+ }
+
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
+ public void select(String value, PriorityLevel level) {
+ try {
+ ignoreNotification = true;
+ this.value = value;
+ if (label != null) {
+ label.setImage(CommonImages.getImage(getLargeImageDescriptor(level)));
+ }
+ if (selectionButton != null && toolBar != null) {
+ selectionButton.setImage(CommonImages.getImage(getLargeImageDescriptor(level)));
+ }
+ } finally {
+ ignoreNotification = false;
+ }
+ }
+
+ private void setControl(Control control) {
+ this.control = control;
+ }
+
+ public void setLabelByValue(Map<String, String> labelByValue) {
+ this.labelByValue = new LinkedHashMap<String, String>(labelByValue);
+ // the menu will be re-created with updated options when it is requested again
+ if (menu != null) {
+ menu.dispose();
+ }
+ menu = null;
+ }
+
+ public void setReadOnly(boolean readOnly) {
+ this.readOnly = readOnly;
+ }
+
+ public void setToolTipText(String text) {
+ if (label != null) {
+ label.setToolTipText(text);
+ }
+ if (selectionButton != null) {
+ selectionButton.setToolTipText(text);
+ }
+ }
+
+ protected void valueChanged(String key) {
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryCompletionProcessor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryCompletionProcessor.java
new file mode 100644
index 0000000..1219f72
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryCompletionProcessor.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class RepositoryCompletionProcessor implements IContentAssistProcessor {
+
+ private class ProposalComputer {
+
+ public static final String LABEL_SEPARATOR = " -------------------------------------------- "; //$NON-NLS-1$
+
+ private final Set<ITask> addedTasks = new HashSet<ITask>();
+
+ private boolean addSeparator;
+
+ private final int offset;
+
+ private final String prefix;
+
+ private final List<CompletionProposal> resultList = new ArrayList<CompletionProposal>();
+
+ public ProposalComputer(ITextViewer viewer, int offset) {
+ this.offset = offset;
+ this.prefix = extractPrefix(viewer, offset).toLowerCase();
+ }
+
+ private void addProposal(ITask task, String replacement, boolean includeTaskPrefix) {
+ if (addSeparator) {
+ if (!addedTasks.isEmpty()) {
+ resultList.add(createSeparator());
+ }
+ addSeparator = false;
+ }
+
+ replacement = getReplacement(task, replacement, includeTaskPrefix);
+ String displayString = labelProvider.getText(task);
+ resultList.add(new CompletionProposal(replacement, offset - prefix.length(), prefix.length(),
+ replacement.length(), labelProvider.getImage(task), displayString, null, null));
+
+ addedTasks.add(task);
+ }
+
+ public void addSeparator() {
+ addSeparator = true;
+ }
+
+ public void addTasks(List<AbstractTask> tasks) {
+ for (AbstractTask task : tasks) {
+ addTask(task);
+ }
+ }
+
+ public void addTask(ITask task) {
+ if (addedTasks.contains(task)) {
+ return;
+ }
+
+ if (getNeverIncludePrefix() && !task.getRepositoryUrl().equals(taskRepository.getRepositoryUrl())) {
+ return;
+ }
+
+ String taskKey = task.getTaskKey();
+ if (prefix.length() == 0) {
+ addProposal(task, taskKey, !getNeverIncludePrefix());
+ } else if (taskKey != null && taskKey.startsWith(prefix)) {
+ addProposal(task, taskKey, false);
+ } else if (containsPrefix(task)) {
+ addProposal(task, taskKey, !getNeverIncludePrefix());
+ }
+ }
+
+ private String getReplacement(ITask task, String text, boolean includeTaskPrefix) {
+ // add an absolute reference to the task if the viewer does not have a repository
+ if (taskRepository == null || text == null
+ || !taskRepository.getRepositoryUrl().equals(task.getRepositoryUrl())) {
+ return CopyTaskDetailsAction.getTextForTask(task);
+ }
+
+ if (includeTaskPrefix) {
+ return getTaskPrefix(task) + text;
+ } else {
+ return text;
+ }
+ }
+
+ private boolean containsPrefix(ITask task) {
+ String searchTest = getTaskPrefix(task) + " " + labelProvider.getText(task); //$NON-NLS-1$
+ String[] tokens = searchTest.split("\\s"); //$NON-NLS-1$
+ for (String token : tokens) {
+ if (token.toLowerCase().startsWith(prefix)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private CompletionProposal createSeparator() {
+ return new CompletionProposal("", offset, 0, 0, CommonImages.getImage(CommonImages.SEPARATOR_LIST), //$NON-NLS-1$
+ LABEL_SEPARATOR, null, null);
+ }
+
+ /**
+ * Returns the prefix of the currently completed text. Assumes that any character that is not a line break or
+ * white space can be part of a task id.
+ */
+ private String extractPrefix(ITextViewer viewer, int offset) {
+ int i = offset;
+ IDocument document = viewer.getDocument();
+ if (i > document.getLength()) {
+ return ""; //$NON-NLS-1$
+ }
+
+ try {
+ while (i > 0) {
+ char ch = document.getChar(i - 1);
+ if (Character.isWhitespace(ch)) {
+ break;
+ }
+ i--;
+ }
+
+ return document.get(i, offset - i);
+ } catch (BadLocationException e) {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public void filterTasks(List<AbstractTask> tasks) {
+ for (Iterator<AbstractTask> it = tasks.iterator(); it.hasNext();) {
+ ITask task = it.next();
+ if (!select(task)) {
+ it.remove();
+ }
+ }
+ }
+
+ private boolean select(ITask task) {
+ return !(task instanceof LocalTask) //
+ && (taskRepository == null || task.getRepositoryUrl().equals(taskRepository.getRepositoryUrl()));
+ }
+
+ public ICompletionProposal[] getResult() {
+ return resultList.toArray(new ICompletionProposal[resultList.size()]);
+ }
+
+ }
+
+ private static final int MAX_OPEN_EDITORS = 10;
+
+ private static final int MAX_ACTIVATED_TASKS = 10;
+
+ private final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(false);
+
+ private final TaskRepository taskRepository;
+
+ private boolean neverIncludePrefix;
+
+ public RepositoryCompletionProcessor(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ this.neverIncludePrefix = false;
+ }
+
+ public boolean getNeverIncludePrefix() {
+ return neverIncludePrefix;
+ }
+
+ public void setNeverIncludePrefix(boolean includePrefix) {
+ this.neverIncludePrefix = includePrefix;
+ }
+
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+ ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+ // adjust offset to end of normalized selection
+ if (selection.getOffset() == offset) {
+ offset = selection.getOffset() + selection.getLength();
+ }
+
+ ProposalComputer proposalComputer = new ProposalComputer(viewer, offset);
+
+ // add tasks from navigation history
+// IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+// if (window != null) {
+// IWorkbenchPage page = window.getActivePage();
+// if (page != null) {
+// INavigationHistory history = page.getNavigationHistory();
+// INavigationLocation[] locations = history.getLocations();
+// if (locations != null) {
+// for (INavigationLocation location : locations) {
+// // location is always null
+// }
+// }
+// }
+// }
+
+ // add open editor
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ if (page != null) {
+ IEditorReference[] editorReferences = page.getEditorReferences();
+ int count = 0;
+ for (int i = editorReferences.length - 1; i >= 0 && count < MAX_OPEN_EDITORS; i--) {
+ try {
+ if (editorReferences[i].getEditorInput() instanceof TaskEditorInput) {
+ TaskEditorInput input = (TaskEditorInput) editorReferences[i].getEditorInput();
+ ITask task = input.getTask();
+ if (task != null && !(task instanceof LocalTask)) {
+ proposalComputer.addTask(task);
+ count++;
+ }
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ // add tasks from activation history
+ TaskActivationHistory taskHistory = TasksUiPlugin.getTaskActivityManager().getTaskActivationHistory();
+ List<AbstractTask> tasks = taskHistory.getPreviousTasks(TasksUiInternal.getContainersFromWorkingSet(TaskWorkingSetUpdater.getActiveWorkingSets(window)));
+ int count = 0;
+ for (int i = tasks.size() - 1; i >= 0 && count < MAX_ACTIVATED_TASKS; i--) {
+ AbstractTask task = tasks.get(i);
+ if (!(task instanceof LocalTask)) {
+ proposalComputer.addTask(task);
+ }
+ }
+
+ // add all remaining tasks for repository
+ if (taskRepository != null) {
+ proposalComputer.addSeparator();
+
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ tasks = new ArrayList<AbstractTask>(taskList.getAllTasks());
+ proposalComputer.filterTasks(tasks);
+ Collections.sort(tasks, new Comparator<AbstractTask>() {
+ public int compare(AbstractTask o1, AbstractTask o2) {
+ return labelProvider.getText(o1).compareTo(labelProvider.getText(o2));
+ }
+ });
+ proposalComputer.addTasks(tasks);
+ }
+
+ return proposalComputer.getResult();
+ }
+
+ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+ return null;
+ }
+
+ public char[] getCompletionProposalAutoActivationCharacters() {
+ return null;
+ }
+
+ public char[] getContextInformationAutoActivationCharacters() {
+ return null;
+ }
+
+ public IContextInformationValidator getContextInformationValidator() {
+ return null;
+ }
+
+ public String getErrorMessage() {
+ return null;
+ }
+
+ private String getTaskPrefix(ITask task) {
+ AbstractRepositoryConnector connector = TasksUiPlugin.getConnector(task.getConnectorKind());
+ String prefix = connector.getTaskIdPrefix();
+ // FIXME work around for Trac "#" prefix
+ return (prefix.length() > 1) ? prefix + " " : prefix; //$NON-NLS-1$
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java
new file mode 100644
index 0000000..5043ce2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RepositoryTextViewerConfiguration.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.MultiLineRule;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.SingleLineRule;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class RepositoryTextViewerConfiguration extends TextSourceViewerConfiguration {
+
+ public enum Mode {
+ URL, TASK, TASK_RELATION, DEFAULT
+ }
+
+ private static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$
+
+ private static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
+
+ private RepositoryTextScanner scanner;
+
+ private final boolean spellCheck;
+
+ private final TaskRepository taskRepository;
+
+ private Mode mode;
+
+ public RepositoryTextViewerConfiguration(TaskRepository taskRepository, boolean spellCheck) {
+ super(EditorsUI.getPreferenceStore());
+ this.taskRepository = taskRepository;
+ this.spellCheck = spellCheck;
+ this.mode = Mode.DEFAULT;
+ }
+
+ public Mode getMode() {
+ return mode;
+ }
+
+ public void setMode(Mode mode) {
+ Assert.isNotNull(mode);
+ this.mode = mode;
+ }
+
+ @Override
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+ if (getMode() == Mode.DEFAULT) {
+ PresentationReconciler reconciler = new PresentationReconciler();
+ reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getDefaultScanner());
+ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ return reconciler;
+ }
+ return super.getPresentationReconciler(sourceViewer);
+ }
+
+ private RepositoryTextScanner getDefaultScanner() {
+ if (scanner == null) {
+ scanner = new RepositoryTextScanner(getMode());
+ }
+ return scanner;
+ }
+
+ @Override
+ public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
+ if (mode == Mode.URL || mode == Mode.TASK_RELATION) {
+ return getDefaultHyperlinkDetectors(sourceViewer, mode);
+ }
+ return super.getHyperlinkDetectors(sourceViewer);
+ }
+
+ public IHyperlinkDetector[] getDefaultHyperlinkDetectors(ISourceViewer sourceViewer, Mode mode) {
+ IHyperlinkDetector[] detectors;
+ if (mode == Mode.URL) {
+ detectors = new IHyperlinkDetector[] { new TaskUrlHyperlinkDetector() };
+ } else if (mode == Mode.TASK) {
+ detectors = new IHyperlinkDetector[] { new TaskHyperlinkDetector() };
+ } else if (mode == Mode.TASK_RELATION) {
+ detectors = new IHyperlinkDetector[] { new TaskRelationHyperlinkDetector() };
+ } else {
+ detectors = super.getHyperlinkDetectors(sourceViewer);
+ }
+ if (detectors != null) {
+ IAdaptable target = getDefaultHyperlinkTarget();
+ for (IHyperlinkDetector hyperlinkDetector : detectors) {
+ if (hyperlinkDetector instanceof AbstractHyperlinkDetector) {
+ ((AbstractHyperlinkDetector) hyperlinkDetector).setContext(target);
+ }
+ }
+ }
+ return detectors;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ protected Map getHyperlinkDetectorTargets(final ISourceViewer sourceViewer) {
+ IAdaptable context = getDefaultHyperlinkTarget();
+
+ Map targets = new HashMap();
+ targets.put(ID_CONTEXT_EDITOR_TEXT, context);
+ targets.put(ID_CONTEXT_EDITOR_TASK, context);
+ return targets;
+ }
+
+ @SuppressWarnings("unchecked")
+ private IAdaptable getDefaultHyperlinkTarget() {
+ IAdaptable context = new IAdaptable() {
+ public Object getAdapter(Class adapter) {
+ if (adapter == TaskRepository.class) {
+ return getTaskRepository();
+ }
+ return null;
+ }
+ };
+ return context;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ @Override
+ public IHyperlinkPresenter getHyperlinkPresenter(final ISourceViewer sourceViewer) {
+ if (fPreferenceStore == null) {
+ return new TaskHyperlinkPresenter(new RGB(0, 0, 255));
+ }
+ return new TaskHyperlinkPresenter(fPreferenceStore);
+ }
+
+ @Override
+ public int getHyperlinkStateMask(ISourceViewer sourceViewer) {
+ return SWT.NONE;
+ }
+
+ @Override
+ public IReconciler getReconciler(ISourceViewer sourceViewer) {
+ if (spellCheck) {
+ return super.getReconciler(sourceViewer);
+ } else {
+ return null;
+ }
+ }
+
+ private static class RepositoryTextScanner extends RuleBasedScanner {
+
+ public RepositoryTextScanner(Mode mode) {
+ IToken bugToken = new Token(new TextAttribute(JFaceResources.getColorRegistry().get(
+ JFacePreferences.ACTIVE_HYPERLINK_COLOR)));
+ IToken quoteToken = new Token(new TextAttribute(CommonColors.TEXT_QUOTED));
+ IRule[] rules = new IRule[16];
+ rules[0] = (new SingleLineRule("http://", " ", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[1] = (new SingleLineRule("https://", " ", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[2] = (new SingleLineRule("bug#", " ", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[3] = (new SingleLineRule("bug#", "", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[4] = (new SingleLineRule("bug #", "", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[5] = (new SingleLineRule("http://", "\n", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[6] = (new SingleLineRule("https://", "\n", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[7] = (new SingleLineRule("task#", " ", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[8] = (new MultiLineRule("task#", "\n", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[9] = (new MultiLineRule("task# ", " ", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[10] = (new SingleLineRule("task #", "\n", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[11] = (new SingleLineRule("*** This bug has been ", "***", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[12] = (new SingleLineRule("http://", "", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[13] = (new SingleLineRule("https://", "", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ rules[14] = (new MultiLineRule("task #", " ", bugToken)); //$NON-NLS-1$ //$NON-NLS-2$
+ SingleLineRule quoteRule = new SingleLineRule(">", null, quoteToken, (char) 0, true); //$NON-NLS-1$
+ quoteRule.setColumnConstraint(0);
+ rules[15] = quoteRule;
+ setRules(rules);
+ }
+
+ }
+
+ @Override
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+ if (mode == Mode.URL) {
+ return null;
+ }
+ ContentAssistant assistant = new ContentAssistant();
+ RepositoryCompletionProcessor processor = new RepositoryCompletionProcessor(taskRepository);
+ if (mode == Mode.TASK_RELATION) {
+ processor.setNeverIncludePrefix(true);
+ }
+ assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE);
+ return assistant;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java
new file mode 100644
index 0000000..8f2c42a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextAttributeEditor.java
@@ -0,0 +1,175 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * A text attribute editor that can switch between a editor, preview and source view.
+ *
+ * @author Steffen Pingel
+ * @see RichTextEditor
+ */
+public class RichTextAttributeEditor extends AbstractAttributeEditor {
+
+ private final RichTextEditor editor;
+
+ protected boolean ignoreNotification;
+
+ public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute) {
+ this(manager, taskRepository, taskAttribute, SWT.MULTI);
+ }
+
+ public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute,
+ int style) {
+ this(manager, taskRepository, taskAttribute, style, null, null);
+ }
+
+ public RichTextAttributeEditor(TaskDataModel manager, TaskRepository taskRepository, TaskAttribute taskAttribute,
+ int style, IContextService contextService, AbstractTaskEditorExtension extension) {
+ super(manager, taskAttribute);
+ this.editor = new RichTextEditor(taskRepository, style, contextService, extension) {
+ @Override
+ public void valueChanged(String value) {
+ if (!ignoreNotification) {
+ RichTextAttributeEditor.this.setValue(value);
+ }
+ };
+ };
+ this.editor.setReadOnly(isReadOnly());
+ if ((style & SWT.MULTI) != 0) {
+ setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.MULTIPLE));
+ } else {
+ setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.MULTIPLE));
+ }
+ setMode(Mode.DEFAULT);
+ refresh();
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ editor.createControl(parent, toolkit);
+ setControl(editor.getControl());
+ }
+
+ public SourceViewer getEditorViewer() {
+ return editor.getEditorViewer();
+ }
+
+ public Mode getMode() {
+ return editor.getMode();
+ }
+
+ public AbstractRenderingEngine getRenderingEngine() {
+ return editor.getRenderingEngine();
+ }
+
+ public String getValue() {
+ return getAttributeMapper().getValue(getTaskAttribute());
+ }
+
+ public SourceViewer getViewer() {
+ return editor.getViewer();
+ }
+
+ public IAction getViewSourceAction() {
+ return editor.getViewSourceAction();
+ }
+
+ public boolean hasBrowser() {
+ return editor.hasBrowser();
+ }
+
+ public boolean hasPreview() {
+ return editor.hasPreview();
+ }
+
+ public boolean isSpellCheckingEnabled() {
+ return editor.isSpellCheckingEnabled();
+ }
+
+ public void setMode(Mode mode) {
+ editor.setMode(mode);
+ }
+
+ public void setRenderingEngine(AbstractRenderingEngine renderingEngine) {
+ editor.setRenderingEngine(renderingEngine);
+ }
+
+ public void setSpellCheckingEnabled(boolean spellCheckingEnabled) {
+ editor.setSpellCheckingEnabled(spellCheckingEnabled);
+ }
+
+ public void setValue(String value) {
+ getAttributeMapper().setValue(getTaskAttribute(), value);
+ attributeChanged();
+ }
+
+ public void showBrowser() {
+ editor.showBrowser();
+ }
+
+ public void showDefault() {
+ editor.showDefault();
+ }
+
+ public void showEditor() {
+ editor.showEditor();
+ }
+
+ public void showPreview() {
+ editor.showPreview();
+ }
+
+ @Override
+ public void setReadOnly(boolean readOnly) {
+ super.setReadOnly(readOnly);
+ if (editor != null) {
+ editor.setReadOnly(readOnly);
+ }
+ }
+
+ @Override
+ public void refresh() {
+ try {
+ ignoreNotification = true;
+ editor.setText(getValue());
+ } finally {
+ ignoreNotification = false;
+ }
+ }
+
+ @Override
+ protected void decorateIncoming(Color color) {
+ super.decorateIncoming(color);
+ if (getEditorViewer() != null && getEditorViewer().getTextWidget() != null) {
+ getEditorViewer().getTextWidget().setBackground(color);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java
new file mode 100644
index 0000000..f7b0aab
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/RichTextEditor.java
@@ -0,0 +1,557 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Raphael Ackermann - spell checking support on bug 195514
+ * Jingwen Ou - extensibility improvements
+ * David Green - fix for bug 256702
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationAccess;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.tasks.ui.commands.ViewSourceHandler;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextActivation;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
+import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * A text attribute editor that can switch between a editor, preview and source view.
+ *
+ * @author Raphael Ackermann
+ * @author Steffen Pingel
+ * @author Jingwen Ou
+ */
+public class RichTextEditor {
+
+ public class ViewSourceAction extends Action {
+
+ public ViewSourceAction() {
+ super(Messages.RichTextAttributeEditor_Viewer_Source, SWT.TOGGLE);
+ setChecked(false);
+ setEnabled(false);
+ }
+
+ @Override
+ public void run() {
+ if (isChecked()) {
+ showDefault();
+ } else {
+ showEditor();
+ }
+ if (editorLayout != null) {
+ EditorUtil.reflow(editorLayout.topControl);
+ }
+ ViewSourceHandler.setChecked(isChecked());
+ }
+
+ }
+
+ private BrowserPreviewViewer browserViewer;
+
+ private IContextActivation contextActivation;
+
+ private final IContextService contextService;
+
+ private Control control;
+
+ private SourceViewer defaultViewer;
+
+ private Composite editorComposite;
+
+ private StackLayout editorLayout;
+
+ private SourceViewer editorViewer;
+
+ private final AbstractTaskEditorExtension extension;
+
+ private Mode mode;
+
+ private SourceViewer previewViewer;
+
+ boolean readOnly;
+
+ private AbstractRenderingEngine renderingEngine;
+
+ private final TaskRepository repository;
+
+ private boolean spellCheckingEnabled;
+
+ private final int style;
+
+ private FormToolkit toolkit;
+
+ private final IAction viewSourceAction;
+
+ private String text;
+
+ public RichTextEditor(TaskRepository repository, int style) {
+ this(repository, style, null, null);
+ }
+
+ public RichTextEditor(TaskRepository repository, int style, IContextService contextService,
+ AbstractTaskEditorExtension extension) {
+ this.repository = repository;
+ this.style = style;
+ this.contextService = contextService;
+ this.extension = extension;
+ this.text = ""; //$NON-NLS-1$
+ this.viewSourceAction = new ViewSourceAction();
+ setMode(Mode.DEFAULT);
+ }
+
+ private SourceViewer configure(final SourceViewer viewer, Document document, boolean readOnly) {
+ // do this before setting the document to not require invalidating the presentation
+ installHyperlinkPresenter(viewer, repository, getMode());
+
+ if (readOnly) {
+ viewer.setDocument(document);
+ if (extension != null) {
+ // setting view source action
+ viewer.getControl().setData(ViewSourceHandler.VIEW_SOURCE_ACTION, viewSourceAction);
+ viewer.getControl().addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ ViewSourceHandler.setChecked(getViewer() == defaultViewer);
+ }
+ });
+ }
+ } else {
+ configureAsEditor(viewer, document);
+ installListeners(viewer);
+ viewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ }
+
+ // enable cut/copy/paste
+ CommonTextSupport.setTextViewer(viewer.getTextWidget(), viewer);
+ viewer.setEditable(!readOnly);
+ viewer.getTextWidget().setFont(getFont());
+ if (toolkit != null) {
+ toolkit.adapt(viewer.getControl(), false, false);
+ }
+
+ return viewer;
+ }
+
+ /** Configures annotation model for spell checking. */
+ private void configureAsEditor(SourceViewer viewer, Document document) {
+ AnnotationModel annotationModel = new AnnotationModel();
+ viewer.showAnnotations(false);
+ viewer.showAnnotationsOverview(false);
+ IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
+ final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null, annotationAccess,
+ EditorsUI.getSharedTextColors());
+ Iterator<?> e = new MarkerAnnotationPreferences().getAnnotationPreferences().iterator();
+ while (e.hasNext()) {
+ support.setAnnotationPreference((AnnotationPreference) e.next());
+ }
+ support.install(EditorsUI.getPreferenceStore());
+ viewer.getTextWidget().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ support.uninstall();
+ }
+ });
+ //viewer.getTextWidget().setIndent(2);
+ viewer.setDocument(document, annotationModel);
+ }
+
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ this.toolkit = toolkit;
+
+ int style = this.style;
+ if (!isReadOnly() && (style & TasksUiInternal.SWT_NO_SCROLL) == 0) {
+ style |= SWT.V_SCROLL;
+ }
+
+ if (extension != null || renderingEngine != null) {
+ editorComposite = new Composite(parent, SWT.NULL);
+ editorLayout = new StackLayout() {
+ @Override
+ protected Point computeSize(Composite composite, int hint, int hint2, boolean flushCache) {
+ return topControl.computeSize(hint, hint2, flushCache);
+ }
+ };
+ editorComposite.setLayout(editorLayout);
+ setControl(editorComposite);
+
+ if (extension != null) {
+ if (isReadOnly()) {
+ editorViewer = extension.createViewer(repository, editorComposite, style);
+ } else {
+ editorViewer = extension.createEditor(repository, editorComposite, style);
+ editorViewer.getTextWidget().addFocusListener(new FocusListener() {
+ public void focusGained(FocusEvent e) {
+ setContext();
+ }
+
+ public void focusLost(FocusEvent e) {
+ unsetContext();
+ }
+ });
+ editorViewer.getTextWidget().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ unsetContext();
+ }
+ });
+ }
+ configure(editorViewer, new Document(getText()), isReadOnly());
+ show(editorViewer);
+ } else {
+ defaultViewer = createDefaultEditor(editorComposite, style);
+ configure(defaultViewer, new Document(getText()), isReadOnly());
+ show(defaultViewer);
+ }
+
+ if (!isReadOnly() && (style & TasksUiInternal.SWT_NO_SCROLL) == 0) {
+ editorComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ }
+
+ viewSourceAction.setEnabled(true);
+ } else {
+ defaultViewer = createDefaultEditor(parent, style);
+ configure(defaultViewer, new Document(getText()), isReadOnly());
+ setControl(defaultViewer.getControl());
+
+ viewSourceAction.setEnabled(false);
+ }
+ }
+
+ private SourceViewer createDefaultEditor(Composite parent, int styles) {
+ SourceViewer defaultEditor = new SourceViewer(parent, null, styles | SWT.WRAP);
+
+ RepositoryTextViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository,
+ isSpellCheckingEnabled() && !isReadOnly());
+ viewerConfig.setMode(getMode());
+ defaultEditor.configure(viewerConfig);
+
+ return defaultEditor;
+ }
+
+ private BrowserPreviewViewer getBrowserViewer() {
+ if (editorComposite == null || renderingEngine == null) {
+ return null;
+ }
+
+ if (browserViewer == null) {
+ browserViewer = new BrowserPreviewViewer(getRepository(), renderingEngine);
+ browserViewer.createControl(editorComposite, toolkit);
+ }
+ return browserViewer;
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ public SourceViewer getDefaultViewer() {
+ if (defaultViewer == null) {
+ defaultViewer = createDefaultEditor(editorComposite, style);
+ configure(defaultViewer, new Document(getText()), isReadOnly());
+
+ // fixed font size
+ defaultViewer.getTextWidget().setFont(JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT));
+ // adapt maximize action
+ defaultViewer.getControl().setData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION,
+ editorViewer.getControl().getData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION));
+ // adapt menu to the new viewer
+ installMenu(defaultViewer.getControl(), editorViewer.getControl().getMenu());
+ }
+ return defaultViewer;
+ }
+
+ public SourceViewer getEditorViewer() {
+ return editorViewer;
+ }
+
+ private Font getFont() {
+ IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+ Font font = themeManager.getCurrentTheme().getFontRegistry().get(CommonThemes.FONT_EDITOR_COMMENT);
+ return font;
+ }
+
+ public Mode getMode() {
+ return mode;
+ }
+
+ private SourceViewer getPreviewViewer() {
+ if (extension == null) {
+ return null;
+ }
+
+ // construct as needed
+ if (previewViewer == null) {
+ // previewer should always have a vertical scroll bar if it's editable
+ int previewViewerStyle = style;
+ if (getEditorViewer() != null) {
+ previewViewerStyle |= SWT.V_SCROLL;
+ }
+ previewViewer = extension.createViewer(repository, editorComposite, previewViewerStyle);
+ configure(previewViewer, new Document(getText()), true);
+ // adapt maximize action
+ previewViewer.getControl().setData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION,
+ editorViewer.getControl().getData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION));
+ }
+ return previewViewer;
+ }
+
+ public AbstractRenderingEngine getRenderingEngine() {
+ return renderingEngine;
+ }
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+
+ public String getText() {
+ return this.text;
+ }
+
+ public SourceViewer getViewer() {
+ if (editorLayout == null) {
+ return defaultViewer;
+ }
+ if (defaultViewer != null && editorLayout.topControl == defaultViewer.getControl()) {
+ return defaultViewer;
+ } else if (previewViewer != null && editorLayout.topControl == previewViewer.getControl()) {
+ return previewViewer;
+ } else {
+ return editorViewer;
+ }
+ }
+
+ public IAction getViewSourceAction() {
+ return viewSourceAction;
+ }
+
+ public boolean hasBrowser() {
+ return renderingEngine != null;
+ }
+
+ public boolean hasPreview() {
+ return extension != null && !isReadOnly();
+ }
+
+ public static RepositoryTextViewerConfiguration installHyperlinkPresenter(ISourceViewer viewer,
+ TaskRepository repository, Mode mode) {
+ RepositoryTextViewerConfiguration configuration = new RepositoryTextViewerConfiguration(repository, false);
+ configuration.setMode(mode);
+
+ // do not configure viewer, this has already been done in extension
+
+ AbstractHyperlinkTextPresentationManager manager;
+ if (mode == Mode.DEFAULT) {
+ manager = new HighlightingHyperlinkTextPresentationManager();
+ manager.setHyperlinkDetectors(configuration.getDefaultHyperlinkDetectors(viewer, null));
+ manager.install(viewer);
+
+ manager = new TaskHyperlinkTextPresentationManager();
+ manager.setHyperlinkDetectors(configuration.getDefaultHyperlinkDetectors(viewer, Mode.TASK));
+ manager.install(viewer);
+ } else if (mode == Mode.TASK_RELATION) {
+ manager = new TaskHyperlinkTextPresentationManager();
+ manager.setHyperlinkDetectors(configuration.getDefaultHyperlinkDetectors(viewer, Mode.TASK_RELATION));
+ manager.install(viewer);
+ }
+
+ return configuration;
+ }
+
+ private void installListeners(final SourceViewer viewer) {
+ viewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ // filter out events caused by text presentation changes, e.g. annotation drawing
+ String value = viewer.getTextWidget().getText();
+ if (!RichTextEditor.this.text.equals(value)) {
+ RichTextEditor.this.text = value;
+ valueChanged(value);
+ CommonFormUtil.ensureVisible(viewer.getTextWidget());
+ }
+ }
+ });
+ // ensure that tab traverses to next control instead of inserting a tab character unless editing multi-line text
+ if ((style & SWT.MULTI) != 0 && mode != Mode.DEFAULT) {
+ viewer.getTextWidget().addListener(SWT.Traverse, new Listener() {
+ public void handleEvent(Event event) {
+ switch (event.detail) {
+ case SWT.TRAVERSE_TAB_NEXT:
+ case SWT.TRAVERSE_TAB_PREVIOUS:
+ event.doit = true;
+ break;
+ }
+ }
+ });
+ }
+ }
+
+ private void installMenu(final Control control, Menu menu) {
+ if (menu != null) {
+ control.setMenu(menu);
+ control.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ control.setMenu(null);
+ }
+ });
+ }
+ }
+
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
+ public boolean isSpellCheckingEnabled() {
+ return spellCheckingEnabled;
+ }
+
+ private void setContext() {
+ if (contextService == null) {
+ return;
+ }
+ if (contextActivation != null) {
+ contextService.deactivateContext(contextActivation);
+ contextActivation = null;
+ }
+ if (contextService != null && extension.getEditorContextId() != null) {
+ contextActivation = contextService.activateContext(extension.getEditorContextId());
+ }
+ }
+
+ private void setControl(Control control) {
+ this.control = control;
+ }
+
+ public void setMode(Mode mode) {
+ Assert.isNotNull(mode);
+ this.mode = mode;
+ }
+
+ public void setReadOnly(boolean readOnly) {
+ this.readOnly = readOnly;
+ }
+
+ public void setRenderingEngine(AbstractRenderingEngine renderingEngine) {
+ this.renderingEngine = renderingEngine;
+ }
+
+ public void setSpellCheckingEnabled(boolean spellCheckingEnabled) {
+ this.spellCheckingEnabled = spellCheckingEnabled;
+ }
+
+ public void setText(String value) {
+ this.text = value;
+ SourceViewer viewer = getViewer();
+ if (viewer != null) {
+ viewer.getDocument().set(value);
+ }
+ }
+
+ /**
+ * Brings <code>control</code> to top.
+ */
+ private void show(Control control) {
+ // no extension is available
+ if (editorComposite == null) {
+ return;
+ }
+ editorLayout.topControl = control;
+ if (editorComposite.getParent().getLayout() instanceof FillWidthLayout) {
+ ((FillWidthLayout) editorComposite.getParent().getLayout()).flush();
+ }
+ editorComposite.layout();
+ control.setFocus();
+ }
+
+ /**
+ * Brings <code>viewer</code> to top.
+ */
+ private void show(SourceViewer viewer) {
+ // WikiText modifies the document therefore, set a new document every time a viewer is changed to synchronize content between viewers
+ viewer.setDocument(new Document(getText()));
+ show(viewer.getControl());
+ }
+
+ public void showBrowser() {
+ BrowserPreviewViewer viewer = getBrowserViewer();
+ viewer.update(getText());
+ if (viewer != null) {
+ show(viewer.getControl());
+ }
+ }
+
+ public void showDefault() {
+ show(getDefaultViewer());
+ }
+
+ public void showEditor() {
+ if (getEditorViewer() != null) {
+ show(getEditorViewer());
+ } else {
+ show(getDefaultViewer());
+ }
+ }
+
+ public void showPreview() {
+ if (!isReadOnly()) {
+ show(getPreviewViewer());
+ }
+ }
+
+ private void unsetContext() {
+ if (contextService == null) {
+ return;
+ }
+ if (contextActivation != null) {
+ contextService.deactivateContext(contextActivation);
+ contextActivation = null;
+ }
+ }
+
+ protected void valueChanged(String value) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SingleSelectionAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SingleSelectionAttributeEditor.java
new file mode 100644
index 0000000..f49f2cf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SingleSelectionAttributeEditor.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelEvent;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelListener;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SingleSelectionAttributeEditor extends AbstractAttributeEditor {
+
+ private CCombo combo;
+
+ private boolean ignoreNotification;
+
+ private Text text;
+
+ private String[] values;
+
+ private final TaskDataModelListener modelListener = new TaskDataModelListener() {
+ @Override
+ public void attributeChanged(TaskDataModelEvent event) {
+ if (getTaskAttribute().equals(event.getTaskAttribute())) {
+ refresh();
+ }
+ }
+ };
+
+ public SingleSelectionAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ if (isReadOnly()) {
+ text = new Text(parent, SWT.FLAT | SWT.READ_ONLY);
+ text.setFont(EditorUtil.TEXT_FONT);
+ toolkit.adapt(text, false, false);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ setControl(text);
+ } else {
+ combo = new CCombo(parent, SWT.FLAT | SWT.READ_ONLY);
+ combo.setVisibleItemCount(10);
+ toolkit.adapt(combo, false, false);
+ combo.setFont(EditorUtil.TEXT_FONT);
+ combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ combo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (!ignoreNotification) {
+ int index = combo.getSelectionIndex();
+ if (index > -1) {
+ Assert.isNotNull(values);
+ Assert.isLegal(index >= 0 && index <= values.length - 1);
+ setValue(values[index]);
+ }
+ }
+ }
+ });
+ setControl(combo);
+ }
+ refresh();
+
+ getControl().addDisposeListener(new DisposeListener() {
+
+ public void widgetDisposed(DisposeEvent e) {
+ getModel().removeModelListener(modelListener);
+ }
+
+ });
+ getModel().addModelListener(modelListener);
+ }
+
+ public String getValue() {
+ return getAttributeMapper().getValue(getTaskAttribute());
+ }
+
+ public String getValueLabel() {
+ return getAttributeMapper().getValueLabel(getTaskAttribute());
+ }
+
+ @Override
+ public void refresh() {
+ try {
+ ignoreNotification = true;
+ if (text != null) {
+ String label = getValueLabel();
+ if ("".equals(label)) { //$NON-NLS-1$
+ // if set to the empty string the label will use 64px on GTK
+ text.setText(" "); //$NON-NLS-1$
+ } else {
+ text.setText(label);
+ }
+ } else if (combo != null) {
+ combo.removeAll();
+ Map<String, String> labelByValue = getAttributeMapper().getOptions(getTaskAttribute());
+ if (labelByValue != null) {
+ values = labelByValue.keySet().toArray(new String[0]);
+ for (String value : values) {
+ combo.add(labelByValue.get(value));
+ }
+ }
+ select(getValue(), getValueLabel());
+ combo.redraw();
+ }
+ } finally {
+ ignoreNotification = false;
+ }
+ }
+
+ private void select(String value, String label) {
+ if (values != null) {
+ for (int i = 0; i < values.length; i++) {
+ if (values[i].equals(value)) {
+ combo.select(i);
+ break;
+ }
+ }
+ } else {
+ combo.setText(label);
+ }
+ }
+
+ void selectDefaultValue() {
+ if (combo.getSelectionIndex() == -1 && values.length > 0) {
+ combo.select(0);
+ setValue(values[0]);
+ }
+ }
+
+ public void setValue(String value) {
+ String oldValue = getAttributeMapper().getValue(getTaskAttribute());
+ if (!oldValue.equals(value)) {
+ getAttributeMapper().setValue(getTaskAttribute(), value);
+ attributeChanged();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java
new file mode 100644
index 0000000..8336bff
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/SummaryPart.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SummaryPart extends AbstractLocalEditorPart {
+
+ private Composite headerComposite;
+
+ private CommonTextSupport textSupport;
+
+ private RichTextEditor summaryEditor;
+
+ protected boolean summaryChanged;
+
+ //private CCombo statusCombo;
+
+ private Button statusCompleteButton;
+
+ private Button statusIncompleteButton;
+
+ private Text creationDateText;
+
+ private Text completionDateText;
+
+ private PriorityEditor priorityEditor;
+
+ private boolean initialized;
+
+ public SummaryPart() {
+ super(Messages.SummaryPart_Section_Title);
+ }
+
+ private Label createLabel(Composite composite, FormToolkit toolkit, String label, int indent) {
+ Label labelControl = toolkit.createLabel(composite, label);
+ labelControl.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ GridDataFactory.defaultsFor(labelControl).indent(indent, 0).applyTo(labelControl);
+ return labelControl;
+ }
+
+ private void createSummaryControl(Composite composite, final FormToolkit toolkit) {
+ Composite borderComposite = EditorUtil.createBorder(composite, toolkit);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).hint(EditorUtil.MAXIMUM_WIDTH, SWT.DEFAULT).grab(
+ true, false).applyTo(borderComposite);
+
+ summaryEditor = new RichTextEditor(getRepository(), SWT.SINGLE);
+ summaryEditor.setSpellCheckingEnabled(true);
+ summaryEditor.setReadOnly(!isSummaryEditable());
+ summaryEditor.createControl(borderComposite, toolkit);
+ if (textSupport != null) {
+ textSupport.install(summaryEditor.getViewer(), true);
+ }
+ summaryEditor.getViewer().addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ if (!getTask().getSummary().equals(summaryEditor.getText())) {
+ summaryChanged = true;
+ markDirty();
+ }
+ }
+ });
+ summaryEditor.getViewer().getControl().setMenu(composite.getMenu());
+ EditorUtil.setHeaderFontSizeAndStyle(summaryEditor.getControl());
+ }
+
+ @Override
+ public Control createControl(Composite parent, FormToolkit toolkit) {
+ Composite composite = toolkit.createComposite(parent);
+ GridLayout layout = EditorUtil.createSectionClientLayout();
+ layout.numColumns = 2;
+ layout.marginTop = 0;
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = 3;
+ composite.setLayout(layout);
+
+ priorityEditor = new PriorityEditor() {
+ @Override
+ protected void valueChanged(String value) {
+ markDirty();
+ priorityEditor.select(value, PriorityLevel.fromString(value));
+ priorityEditor.setToolTipText(value);
+ };
+ };
+ Map<String, String> labelByValue = new LinkedHashMap<String, String>();
+ for (PriorityLevel level : PriorityLevel.values()) {
+ labelByValue.put(level.toString(), level.getDescription());
+ }
+ priorityEditor.setLabelByValue(labelByValue);
+ priorityEditor.createControl(composite, toolkit);
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).span(1, 2).applyTo(priorityEditor.getControl());
+
+ createSummaryControl(composite, toolkit);
+
+ createHeaderControls(composite, toolkit);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(headerComposite);
+
+ toolkit.paintBordersFor(composite);
+ return composite;
+ }
+
+ protected Composite createHeaderControls(Composite composite, FormToolkit toolkit) {
+ headerComposite = toolkit.createComposite(composite);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ headerComposite.setLayout(layout);
+
+ createLabel(headerComposite, toolkit, Messages.TaskPlanningEditor_Status, 0);
+ statusIncompleteButton = toolkit.createButton(headerComposite, Messages.TaskPlanningEditor_Incomplete,
+ SWT.RADIO);
+ statusIncompleteButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (statusIncompleteButton.getSelection()) {
+ statusCompleteButton.setSelection(false);
+ markDirty();
+ }
+ }
+ });
+ statusCompleteButton = toolkit.createButton(headerComposite, Messages.TaskPlanningEditor_Complete, SWT.RADIO);
+ statusCompleteButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (statusCompleteButton.getSelection()) {
+ statusIncompleteButton.setSelection(false);
+ markDirty();
+ }
+ }
+ });
+
+// statusCombo = new CCombo(headerComposite, SWT.FLAT | SWT.READ_ONLY);
+// toolkit.adapt(statusCombo, true, true);
+// statusCombo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+// statusCombo.add(Messages.TaskPlanningEditor_Complete);
+// statusCombo.add(Messages.TaskPlanningEditor_Incomplete);
+// if (getTask().isCompleted()) {
+// statusCombo.select(0);
+// } else {
+// statusCombo.select(1);
+// }
+// statusCombo.setEnabled(getTask() instanceof LocalTask);
+// statusCombo.addSelectionListener(new SelectionAdapter() {
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// markDirty();
+// }
+// });
+
+ // right align controls
+// Composite spacer = toolkit.createComposite(headerComposite, SWT.NONE);
+// GridDataFactory.fillDefaults().hint(0, 10).grab(true, false).applyTo(spacer);
+
+ createLabel(headerComposite, toolkit, getCreatedDateLabel(), EditorUtil.HEADER_COLUMN_MARGIN);
+ // do not use toolkit.createText() to avoid border on Windows
+ creationDateText = new Text(headerComposite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(creationDateText, false, false);
+ creationDateText.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+
+ createLabel(headerComposite, toolkit, Messages.TaskPlanningEditor_Completed, EditorUtil.HEADER_COLUMN_MARGIN);
+ // do not use toolkit.createText() to avoid border on Windows
+ completionDateText = new Text(headerComposite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(completionDateText, false, false);
+ completionDateText.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+
+ // ensure layout does not wrap
+ layout.numColumns = headerComposite.getChildren().length;
+ toolkit.paintBordersFor(headerComposite);
+ return headerComposite;
+ }
+
+ @Override
+ public void setFocus() {
+ if (summaryEditor != null) {
+ summaryEditor.getControl().setFocus();
+ }
+ }
+
+ private String getDateString(Date date) {
+ if (date == null) {
+ return "-"; //$NON-NLS-1$
+ }
+ return EditorUtil.getDateFormat().format(date);
+ }
+
+ private String getDateTimeString(Date date) {
+ if (date == null) {
+ return "-"; //$NON-NLS-1$
+ }
+ return EditorUtil.getDateTimeFormat().format(date);
+ }
+
+ @Override
+ public void refresh() {
+ PriorityLevel level = PriorityLevel.fromString(getTask().getPriority());
+ priorityEditor.select(level.toString(), level);
+ statusIncompleteButton.setSelection(!getTask().isCompleted());
+ statusCompleteButton.setSelection(getTask().isCompleted());
+// if (getTask().isCompleted()) {
+// statusCombo.select(0);
+// } else {
+// statusCombo.select(1);
+// }
+ if (!summaryChanged) {
+ summaryEditor.setText(getTask().getSummary());
+ if (!initialized) {
+ initialized = true;
+ if (LocalRepositoryConnector.DEFAULT_SUMMARY.equals(getTask().getSummary())) {
+ summaryEditor.getViewer().setSelectedRange(0, summaryEditor.getText().length());
+ }
+ }
+ }
+ creationDateText.setText(getDateString(getTask().getCreationDate()));
+ updateToolTip(creationDateText, getTask().getCreationDate());
+ completionDateText.setText(getDateString(getTask().getCompletionDate()));
+ updateToolTip(completionDateText, getTask().getCompletionDate());
+ super.refresh();
+ if (summaryChanged) {
+ markDirty();
+ }
+ // re-layout date fields
+ headerComposite.layout(true);
+ }
+
+ private void updateToolTip(Text text, Date date) {
+ if (date != null) {
+ text.setToolTipText(getDateTimeString(date));
+ } else {
+ text.setToolTipText(null);
+ }
+ }
+
+ @Override
+ public void commit(boolean onSave) {
+ PriorityLevel level = PriorityLevel.fromString(priorityEditor.getValue());
+ if (level != null) {
+ getTask().setPriority(level.toString());
+ }
+ getTask().setSummary(summaryEditor.getText());
+ if (statusCompleteButton.getSelection()) {
+ if (!getTask().isCompleted()) {
+ getTask().setCompletionDate(new Date());
+ }
+ } else {
+ if (getTask().isCompleted()) {
+ getTask().setCompletionDate(null);
+ }
+ }
+// if (!getTask().isCompleted() && statusCombo.getSelectionIndex() == 0) {
+// getTask().setCompletionDate(new Date());
+// } else {
+// getTask().setCompletionDate(null);
+// }
+ summaryChanged = false;
+ super.commit(onSave);
+ }
+
+ public void setTextSupport(CommonTextSupport textSupport) {
+ this.textSupport = textSupport;
+ }
+
+ public CommonTextSupport getTextSupport() {
+ return textSupport;
+ }
+
+ public void setSummary(String value) {
+ if (!summaryEditor.getControl().isDisposed()) {
+ summaryEditor.setText(value);
+ }
+ }
+
+ protected String getCreatedDateLabel() {
+ return Messages.TaskPlanningEditor_Created;
+ }
+
+ protected boolean isSummaryEditable() {
+ return getTask() instanceof LocalTask;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentDropListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentDropListener.java
new file mode 100644
index 0000000..58e3b05
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentDropListener.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Maarten Meijer - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.io.File;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.core.data.TextTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizardDialog;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.TransferData;
+
+/**
+ * @author Mik Kersten
+ * @author Maarten Meijer
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentDropListener implements DropTargetListener {
+
+ private final AbstractTaskEditorPage page;
+
+ public TaskAttachmentDropListener(AbstractTaskEditorPage page) {
+ this.page = page;
+ }
+
+ public void dragEnter(DropTargetEvent event) {
+ if (event.detail == DND.DROP_DEFAULT) {
+ if ((event.operations & DND.DROP_COPY) != 0) {
+ event.detail = DND.DROP_COPY;
+ } else {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+ // will accept text but prefer to have files dropped
+ for (TransferData dataType : event.dataTypes) {
+ if (FileTransfer.getInstance().isSupportedType(dataType)) {
+ event.currentDataType = dataType;
+ // files should only be copied
+ if (event.detail != DND.DROP_COPY) {
+ event.detail = DND.DROP_NONE;
+ }
+ break;
+ }
+ }
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
+ }
+
+ public void dragOperationChanged(DropTargetEvent event) {
+ if ((event.detail == DND.DROP_DEFAULT) || (event.operations & DND.DROP_COPY) != 0) {
+ event.detail = DND.DROP_COPY;
+ } else {
+ event.detail = DND.DROP_NONE;
+ }
+ // allow text to be moved but files should only be copied
+ if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ if (event.detail != DND.DROP_COPY) {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+ }
+
+ public void dragLeave(DropTargetEvent event) {
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ }
+
+ public void drop(DropTargetEvent event) {
+ if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ String text = (String) event.data;
+ EditorUtil.openNewAttachmentWizard(page, null, new TextTaskAttachmentSource(text));
+ }
+ if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) {
+ String[] files = (String[]) event.data;
+ if (files.length > 0) {
+ File file = new File(files[0]);
+ NewAttachmentWizardDialog dialog = EditorUtil.openNewAttachmentWizard(page, null,
+ new FileTaskAttachmentSource(file));
+ if (files.length > 1) {
+ dialog.setMessage(Messages.TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached,
+ IMessageProvider.WARNING);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentEditorInput.java
new file mode 100644
index 0000000..006b85e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentEditorInput.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.IStorageEditorInput;
+
+/**
+ * @author Jeff Pound
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentEditorInput extends PlatformObject implements IStorageEditorInput {
+
+ private final ITaskAttachment attachment;
+
+ public TaskAttachmentEditorInput(ITaskAttachment attachment) {
+ this.attachment = attachment;
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ // ignore
+ return null;
+ }
+
+ public String getName() {
+ return attachment.getFileName();
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return attachment.getUrl();
+ }
+
+ public IStorage getStorage() throws CoreException {
+ return TaskAttachmentStorage.create(attachment);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentStorage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentStorage.java
new file mode 100644
index 0000000..ced37c7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskAttachmentStorage.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.io.InputStream;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Jeff Pound
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentStorage extends PlatformObject implements IStorage {
+
+ private static final String ATTACHMENT_DEFAULT_NAME = "attachment"; //$NON-NLS-1$
+
+ private static final String CTYPE_ZIP = "zip"; //$NON-NLS-1$
+
+ private static final String CTYPE_OCTET_STREAM = "octet-stream"; //$NON-NLS-1$
+
+ private static final String CTYPE_TEXT = "text"; //$NON-NLS-1$
+
+ private static final String CTYPE_HTML = "html"; //$NON-NLS-1$
+
+ private final TaskRepository taskRepository;
+
+ private final ITask task;
+
+ private final TaskAttribute attachmentAttribute;
+
+ private final String name;
+
+ public TaskAttachmentStorage(TaskRepository taskRepository, ITask task, TaskAttribute attachmentAttribute,
+ String name) {
+ this.taskRepository = taskRepository;
+ this.task = task;
+ this.attachmentAttribute = attachmentAttribute;
+ this.name = name;
+ }
+
+ public static IStorage create(ITaskAttachment attachment) throws CoreException {
+ Assert.isNotNull(attachment);
+ TaskAttribute taskAttribute = attachment.getTaskAttribute();
+ if (taskAttribute == null) {
+ throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to find attachment: " //$NON-NLS-1$
+ + attachment.getUrl()));
+ }
+ return new TaskAttachmentStorage(attachment.getTaskRepository(), attachment.getTask(), taskAttribute,
+ getName(attachment));
+ }
+
+ private static String getName(ITaskAttachment attachment) {
+ String name = attachment.getFileName();
+ // if no filename is set, make one up with the proper extension so
+ // we can support opening in that filetype's default editor
+ if (name == null || "".equals(name)) { //$NON-NLS-1$
+ String ctype = attachment.getContentType();
+ if (ctype.endsWith(CTYPE_HTML)) {
+ name = ATTACHMENT_DEFAULT_NAME + ".html"; //$NON-NLS-1$
+ } else if (ctype.startsWith(CTYPE_TEXT)) {
+ name = ATTACHMENT_DEFAULT_NAME + ".txt"; //$NON-NLS-1$
+ } else if (ctype.endsWith(CTYPE_OCTET_STREAM)) {
+ name = ATTACHMENT_DEFAULT_NAME;
+ } else if (ctype.endsWith(CTYPE_ZIP)) {
+ name = ATTACHMENT_DEFAULT_NAME + "." + CTYPE_ZIP; //$NON-NLS-1$
+ } else {
+ name = ATTACHMENT_DEFAULT_NAME + "." + ctype.substring(ctype.indexOf("/") + 1); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ // treat .patch files as text files
+ if (name.endsWith(".patch")) { //$NON-NLS-1$
+ name += ".txt"; //$NON-NLS-1$
+ }
+ return name;
+ }
+
+ public InputStream getContents() throws CoreException {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ AbstractTaskAttachmentHandler handler = connector.getTaskAttachmentHandler();
+ return handler.getContent(taskRepository, task, attachmentAttribute, new NullProgressMonitor());
+ }
+
+ public IPath getFullPath() {
+ // ignore
+ return null;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean isReadOnly() {
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionContributor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionContributor.java
new file mode 100644
index 0000000..eae0050
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionContributor.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.action.ICoolBarManager;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchActionSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchActionSupport.WorkbenchActionCallback;
+import org.eclipse.mylyn.internal.tasks.ui.actions.TaskEditorActionGroup;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskEditorActionContributor extends MultiPageEditorActionBarContributor implements
+ ISelectionChangedListener {
+
+ private final class SelectionProviderAdapterExtension extends SelectionProviderAdapter implements
+ ISelectionChangedListener {
+ @Override
+ public ISelection getSelection() {
+ if (editor != null && editor.getSite().getSelectionProvider() != null) {
+ return editor.getSite().getSelectionProvider().getSelection();
+ } else {
+ return StructuredSelection.EMPTY;
+ }
+ }
+
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ super.selectionChanged(event);
+ }
+
+ }
+
+ private class EditorPageCallback extends WorkbenchActionCallback {
+
+ @Override
+ public boolean canPerformAction(String actionId, Control control) {
+ IFormPage activePage = getActivePage();
+ if (activePage instanceof AbstractTaskEditorPage) {
+ AbstractTaskEditorPage page = (AbstractTaskEditorPage) activePage;
+ return page.canPerformAction(actionId);
+ } else if (activePage != null) {
+ WorkbenchActionCallback textSupport = (WorkbenchActionCallback) activePage.getAdapter(WorkbenchActionCallback.class);
+ if (textSupport != null) {
+ return textSupport.canPerformAction(actionId, control);
+ }
+ }
+ return super.canPerformAction(actionId, control);
+ }
+
+ @Override
+ public void doAction(String actionId, Control control) {
+ IFormPage activePage = getActivePage();
+ if (activePage instanceof AbstractTaskEditorPage) {
+ AbstractTaskEditorPage page = (AbstractTaskEditorPage) activePage;
+ page.doAction(actionId);
+ return;
+ } else if (activePage != null) {
+ WorkbenchActionCallback textSupport = (WorkbenchActionCallback) activePage.getAdapter(WorkbenchActionCallback.class);
+ if (textSupport != null) {
+ textSupport.doAction(actionId, control);
+ return;
+ }
+ }
+ super.doAction(actionId, control);
+ }
+
+ @Override
+ public Control getFocusControl() {
+ IFormPage page = getActivePage();
+ return (page != null) ? EditorUtil.getFocusControl(page) : null;
+ }
+
+ @Override
+ public ISelection getSelection() {
+ return selectionProvider.getSelection();
+ }
+
+ }
+
+ private TaskEditor editor;
+
+ private final WorkbenchActionSupport actionSupport;
+
+ private final SelectionProviderAdapterExtension selectionProvider;
+
+ private final TaskEditorActionGroup actionGroup;
+
+ public TaskEditorActionContributor() {
+ this.actionSupport = new WorkbenchActionSupport();
+ this.actionSupport.setCallback(new EditorPageCallback());
+ this.selectionProvider = new SelectionProviderAdapterExtension();
+ this.actionGroup = new TaskEditorActionGroup(actionSupport);
+ }
+
+ public void contextMenuAboutToShow(IMenuManager mng) {
+ IFormPage page = getActivePage();
+ boolean addClipboard = (page instanceof TaskPlanningEditor || page instanceof AbstractTaskEditorPage);
+ contextMenuAboutToShow(mng, addClipboard);
+ }
+
+ public void contextMenuAboutToShow(IMenuManager manager, boolean addClipboard) {
+ actionGroup.fillContextMenu(manager, editor, addClipboard);
+ }
+
+ @Override
+ public void contributeToCoolBar(ICoolBarManager cbm) {
+ }
+
+ @Override
+ public void contributeToMenu(IMenuManager mm) {
+ }
+
+ @Override
+ public void contributeToStatusLine(IStatusLineManager slm) {
+ }
+
+ @Override
+ public void contributeToToolBar(IToolBarManager tbm) {
+ }
+
+ public void forceActionsEnabled() {
+ actionSupport.forceEditActionsEnabled();
+ }
+
+ private IFormPage getActivePage() {
+ return (editor != null) ? editor.getActivePageInstance() : null;
+ }
+
+ public TaskEditor getEditor() {
+ return editor;
+ }
+
+ @Override
+ public void init(IActionBars bars, IWorkbenchPage page) {
+ super.init(bars, page);
+ actionSupport.install(bars);
+ bars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), actionGroup.getSynchronizeEditorAction());
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ actionSupport.selectionChanged(event);
+ actionGroup.getNewTaskFromSelectionAction().selectionChanged(event.getSelection());
+ }
+
+ @Override
+ public void setActiveEditor(IEditorPart activeEditor) {
+ if (this.editor != null) {
+ this.editor.getSite().getSelectionProvider().removeSelectionChangedListener(selectionProvider);
+ }
+
+ if (activeEditor instanceof TaskEditor) {
+ this.editor = (TaskEditor) activeEditor;
+ this.editor.getSite().getSelectionProvider().addSelectionChangedListener(selectionProvider);
+ actionGroup.getSynchronizeEditorAction().selectionChanged(new StructuredSelection(this.editor));
+ updateSelectableActions(selectionProvider.getSelection());
+ } else {
+ actionGroup.getSynchronizeEditorAction().selectionChanged(StructuredSelection.EMPTY);
+ this.editor = null;
+ }
+ }
+
+ @Override
+ public void setActivePage(IEditorPart activePage) {
+ updateSelectableActions(selectionProvider.getSelection());
+ }
+
+ public void updateSelectableActions(ISelection selection) {
+ if (editor != null) {
+ actionSupport.updateActions(selection);
+ actionGroup.getNewTaskFromSelectionAction().selectionChanged(selection);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java
new file mode 100644
index 0000000..c19dce9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorActionPart.java
@@ -0,0 +1,433 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * David Green - fix for bug 254806, bug 267135
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskContainerComparator;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskOperation;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.TextChangeListener;
+import org.eclipse.swt.custom.TextChangedEvent;
+import org.eclipse.swt.custom.TextChangingEvent;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorActionPart extends AbstractTaskEditorPart {
+
+ private static final String KEY_OPERATION = "operation"; //$NON-NLS-1$
+
+ public class SelectButtonListener implements ModifyListener, VerifyListener, SelectionListener, FocusListener,
+ TextChangeListener {
+
+ private final Button button;
+
+ public SelectButtonListener(Button button) {
+ this.button = button;
+ }
+
+ public void modifyText(ModifyEvent e) {
+ selected();
+ }
+
+ public void verifyText(VerifyEvent e) {
+ selected();
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ selected();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ selected();
+ }
+
+ public void focusGained(FocusEvent event) {
+ selected();
+ }
+
+ public void focusLost(FocusEvent e) {
+ }
+
+ public void textChanged(TextChangedEvent event) {
+ selected();
+ }
+
+ public void textSet(TextChangedEvent event) {
+ selected();
+ }
+
+ public void textChanging(TextChangingEvent event) {
+ }
+
+ private void selected() {
+ setSelectedRadionButton(button, true);
+ }
+
+ }
+
+ private static final int DEFAULT_FIELD_WIDTH = 150;
+
+ private static final int RADIO_OPTION_WIDTH = 120;
+
+ private static final String KEY_ASSOCIATED_EDITOR = "associatedEditor"; //$NON-NLS-1$
+
+ private List<Button> operationButtons;
+
+ private Button submitButton;
+
+ private Button attachContextButton;
+
+ private Button addToCategory;
+
+ private CCombo categoryChooser;
+
+ private AbstractTaskCategory category;
+
+ private TaskAttribute selectedOperationAttribute;
+
+ public TaskEditorActionPart() {
+ setPartName(Messages.TaskEditorActionPart_Actions);
+ }
+
+ protected void addAttachContextButton(Composite buttonComposite, FormToolkit toolkit) {
+ attachContextButton = toolkit.createButton(buttonComposite, Messages.TaskEditorActionPart_Attach_Context,
+ SWT.CHECK);
+ attachContextButton.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_ATTACH));
+ }
+
+ /**
+ * Adds buttons to this composite. Subclasses can override this method to provide different/additional buttons.
+ *
+ * @param buttonComposite
+ * Composite to add the buttons to.
+ * @param toolkit
+ */
+ private void createActionButtons(Composite buttonComposite, FormToolkit toolkit) {
+ //if (!getTaskEditorPage().needsSubmitButton()) {
+ submitButton = toolkit.createButton(buttonComposite, Messages.TaskEditorActionPart_Submit, SWT.NONE);
+ submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
+ submitButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ getTaskEditorPage().doSubmit();
+ }
+ });
+ Point minSize = submitButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ GridData submitButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ submitButtonData.widthHint = Math.max(100, minSize.x);
+ submitButton.setLayoutData(submitButtonData);
+
+ setSubmitEnabled(true);
+
+ toolkit.createLabel(buttonComposite, " "); //$NON-NLS-1$
+ //}
+
+ if (!getTaskData().isNew()) {
+ addAttachContextButton(buttonComposite, toolkit);
+ }
+ }
+
+ /**
+ * Creates the button layout. This displays options and buttons at the bottom of the editor to allow actions to be
+ * performed on the bug.
+ *
+ * @param toolkit
+ */
+ private void createCategoryChooser(Composite buttonComposite, FormToolkit toolkit) {
+ addToCategory = getManagedForm().getToolkit().createButton(buttonComposite,
+ Messages.TaskEditorActionPart_Add_to_Category, SWT.CHECK);
+ categoryChooser = new CCombo(buttonComposite, SWT.FLAT | SWT.READ_ONLY);
+ categoryChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ categoryChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create());
+ toolkit.adapt(categoryChooser, false, false);
+ categoryChooser.setFont(TEXT_FONT);
+ ITaskList taskList = TasksUiInternal.getTaskList();
+ final List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories());
+ Collections.sort(categories, new TaskContainerComparator());
+ AbstractTaskCategory selectedCategory = TasksUiInternal.getSelectedCategory(TaskListView.getFromActivePerspective());
+ int i = 0;
+ int selectedIndex = 0;
+ for (IRepositoryElement category : categories) {
+ categoryChooser.add(category.getSummary());
+ if (category.equals(selectedCategory)) {
+ selectedIndex = i;
+ }
+ i++;
+ }
+ categoryChooser.select(selectedIndex);
+ categoryChooser.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (categoryChooser.getSelectionIndex() != -1) {
+ category = categories.get(categoryChooser.getSelectionIndex());
+ }
+ }
+ });
+ categoryChooser.setEnabled(false);
+
+ addToCategory.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ markDirty();
+ if (!addToCategory.getSelection()) {
+ category = null;
+ } else if (categoryChooser.getSelectionIndex() != -1) {
+ category = categories.get(categoryChooser.getSelectionIndex());
+ }
+ categoryChooser.setEnabled(addToCategory.getSelection());
+ }
+ });
+
+ GridDataFactory.fillDefaults().hint(DEFAULT_FIELD_WIDTH, SWT.DEFAULT).span(3, SWT.DEFAULT).applyTo(
+ categoryChooser);
+ }
+
+ public AbstractTaskCategory getCategory() {
+ return category;
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Section section = createSection(parent, toolkit, true);
+
+ Composite buttonComposite = toolkit.createComposite(section);
+ GridLayout buttonLayout = EditorUtil.createSectionClientLayout();
+ buttonLayout.numColumns = 4;
+ buttonComposite.setLayout(buttonLayout);
+
+ if (getTaskEditorPage().needsAddToCategory()) {
+ createCategoryChooser(buttonComposite, toolkit);
+ }
+
+ selectedOperationAttribute = getTaskData().getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ if (selectedOperationAttribute != null
+ && TaskAttribute.TYPE_OPERATION.equals(selectedOperationAttribute.getMetaData().getType())) {
+ TaskOperation selectedOperation = getTaskData().getAttributeMapper().getTaskOperation(
+ selectedOperationAttribute);
+ createRadioButtons(buttonComposite, toolkit, selectedOperation);
+ }
+
+ createOperationAttributes(buttonComposite, toolkit);
+
+ createActionButtons(buttonComposite, toolkit);
+
+ toolkit.paintBordersFor(buttonComposite);
+ section.setClient(buttonComposite);
+ setSection(toolkit, section);
+ }
+
+ private void createOperationAttributes(Composite buttonComposite, FormToolkit toolkit) {
+ Composite parent = null;
+ for (TaskAttribute taskAttribute : getTaskData().getRoot().getAttributes().values()) {
+ if (TaskAttribute.KIND_OPERATION.equals(taskAttribute.getMetaData().getKind())) {
+ if (parent == null) {
+ parent = toolkit.createComposite(buttonComposite);
+ parent.setLayout(new GridLayout(2, false));
+ GridDataFactory.fillDefaults().span(4, 1).grab(true, false).applyTo(parent);
+ toolkit.paintBordersFor(parent);
+ }
+
+ addAttribute(parent, toolkit, taskAttribute);
+ }
+ }
+ }
+
+ private void addAttribute(Composite attributesComposite, FormToolkit toolkit, TaskAttribute taskAttribute) {
+ AbstractAttributeEditor attributeEditor = createAttributeEditor(taskAttribute);
+ if (attributeEditor.hasLabel() && attributeEditor.getLabel().length() != 0) {
+ attributeEditor.createLabelControl(attributesComposite, toolkit);
+ Label label = attributeEditor.getLabelControl();
+ String text = label.getText();
+ label.setText(text);
+ GridData gd = GridDataFactory.fillDefaults()
+ .align(SWT.LEFT, SWT.CENTER)
+ .hint(SWT.DEFAULT, SWT.DEFAULT)
+ .create();
+ label.setLayoutData(gd);
+ }
+
+ attributeEditor.createControl(attributesComposite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+ GridData gd = new GridData(GridData.FILL, GridData.CENTER, true, false);
+ gd.minimumWidth = DEFAULT_FIELD_WIDTH;
+ if (attributeEditor.getLabelControl() == null) {
+ gd.horizontalSpan = 2;
+ }
+ attributeEditor.getControl().setLayoutData(gd);
+
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute, Button button) {
+ AbstractAttributeEditor editor = createAttributeEditor(attribute);
+ if (editor != null) {
+ editor.createControl(composite, toolkit);
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.horizontalSpan = 3;
+ Control editorControl = editor.getControl();
+ if (editorControl instanceof CCombo) {
+ if (!Platform.OS_MACOSX.equals(Platform.getOS())) {
+ // XXX on some platforms combo boxes are too tall by default and wider than other controls
+ // bug 267135 only do this for non-mac platforms, since the default CCombo height on Carbon and Cocoa is perfect
+ gd.heightHint = 20;
+ }
+ gd.widthHint = RADIO_OPTION_WIDTH;
+ } else {
+ gd.widthHint = RADIO_OPTION_WIDTH - 5;
+ }
+ editorControl.setLayoutData(gd);
+
+ // the following listeners are hooked up so that changes to something in the actions area
+ // will cause the corresponding radio button to become selected. Note that we can't just use
+ // a focus listener due to bug 254806
+ if (editorControl instanceof CCombo) {
+ ((CCombo) editorControl).addSelectionListener(new SelectButtonListener(button));
+ } else if (editorControl instanceof Text) {
+ ((Text) editorControl).addModifyListener(new SelectButtonListener(button));
+ ((Text) editorControl).addVerifyListener(new SelectButtonListener(button));
+ } else if (editorControl instanceof StyledText) {
+ ((StyledText) editorControl).getContent().addTextChangeListener(new SelectButtonListener(button));
+ } else {
+ // last resort
+ editorControl.addFocusListener(new SelectButtonListener(button));
+ }
+
+ button.setData(KEY_ASSOCIATED_EDITOR, editor);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ }
+ }
+
+ private void createRadioButtons(Composite buttonComposite, FormToolkit toolkit, TaskOperation selectedOperation) {
+ List<TaskOperation> operations = getTaskData().getAttributeMapper().getTaskOperations(
+ selectedOperationAttribute);
+ if (operations.size() > 0) {
+ operationButtons = new ArrayList<Button>();
+ Button selectedButton = null;
+ for (TaskOperation operation : operations) {
+ Button button = toolkit.createButton(buttonComposite, operation.getLabel(), SWT.RADIO);
+ button.setFont(TEXT_FONT);
+ button.setData(KEY_OPERATION, operation);
+ GridData radioData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ TaskAttribute associatedAttribute = getTaskData().getAttributeMapper().getAssoctiatedAttribute(
+ operation);
+ if (associatedAttribute != null) {
+ radioData.horizontalSpan = 1;
+ addAttribute(buttonComposite, toolkit, associatedAttribute, button);
+ } else {
+ radioData.horizontalSpan = 4;
+ }
+ button.setLayoutData(radioData);
+ button.addSelectionListener(new SelectButtonListener(button));
+ operationButtons.add(button);
+ if (operation.equals(selectedOperation)) {
+ selectedButton = button;
+ }
+ }
+ // do this last to ensure only a single button is selected
+ if (selectedButton == null && !operationButtons.isEmpty()) {
+ selectedButton = operationButtons.get(0);
+ }
+ setSelectedRadionButton(selectedButton, false);
+ }
+ }
+
+ public boolean getAttachContext() {
+ if (attachContextButton == null || attachContextButton.isDisposed()) {
+ return false;
+ } else {
+ return attachContextButton.getSelection();
+ }
+ }
+
+// boolean needsAttachContext() {
+// return needsAttachContext;
+// }
+//
+// void setNeedsAttachContext(boolean attachContextEnabled) {
+// this.needsAttachContext = attachContextEnabled;
+// }
+
+ public void setSubmitEnabled(boolean enabled) {
+ if (submitButton != null && !submitButton.isDisposed()) {
+ submitButton.setEnabled(enabled);
+ if (enabled) {
+ submitButton.setToolTipText(MessageFormat.format(Messages.TaskEditorActionPart_Submit_to_X,
+ getTaskEditorPage().getTaskRepository().getRepositoryUrl()));
+ }
+ }
+ }
+
+ private void setSelectedRadionButton(Button selectedButton, boolean updateModel) {
+ // avoid changes to the model if the button is already selected
+ if (selectedButton.getSelection()) {
+ return;
+ }
+
+ selectedButton.setSelection(true);
+ for (Button button : operationButtons) {
+ if (button != selectedButton) {
+ button.setSelection(false);
+ }
+ }
+
+ if (updateModel) {
+ TaskOperation taskOperation = (TaskOperation) selectedButton.getData(KEY_OPERATION);
+ getTaskData().getAttributeMapper().setTaskOperation(selectedOperationAttribute, taskOperation);
+ getModel().attributeChanged(selectedOperationAttribute);
+
+ AbstractAttributeEditor editor = (AbstractAttributeEditor) selectedButton.getData(KEY_ASSOCIATED_EDITOR);
+ if (editor instanceof SingleSelectionAttributeEditor) {
+ ((SingleSelectionAttributeEditor) editor).selectDefaultValue();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorAttachmentPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorAttachmentPart.java
new file mode 100644
index 0000000..049fdfd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorAttachmentPart.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jeff Pound - attachment support
+ * Frank Becker - improvements for bug 204051
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.TaskAttachment;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiMenus;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.Mode;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class TaskEditorAttachmentPart extends AbstractTaskEditorPart {
+
+ private static final String ID_POPUP_MENU = "org.eclipse.mylyn.tasks.ui.editor.menu.attachments"; //$NON-NLS-1$
+
+ private final String[] attachmentsColumns = { Messages.TaskEditorAttachmentPart_Name,
+ Messages.TaskEditorAttachmentPart_Description, /*"Type", */Messages.TaskEditorAttachmentPart_Size,
+ Messages.TaskEditorAttachmentPart_Creator, Messages.TaskEditorAttachmentPart_Created };
+
+ private final int[] attachmentsColumnWidths = { 130, 150, /*100,*/70, 100, 100 };
+
+ private List<TaskAttribute> attachments;
+
+ private boolean hasIncoming;
+
+ private MenuManager menuManager;
+
+ private Composite attachmentsComposite;
+
+ public TaskEditorAttachmentPart() {
+ setPartName(Messages.TaskEditorAttachmentPart_Attachments);
+ }
+
+ private void createAttachmentTable(FormToolkit toolkit, final Composite attachmentsComposite) {
+ Table attachmentsTable = toolkit.createTable(attachmentsComposite, SWT.MULTI | SWT.FULL_SELECTION);
+ attachmentsTable.setLinesVisible(true);
+ attachmentsTable.setHeaderVisible(true);
+ attachmentsTable.setLayout(new GridLayout());
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).hint(500, SWT.DEFAULT).applyTo(
+ attachmentsTable);
+ attachmentsTable.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+
+ for (int i = 0; i < attachmentsColumns.length; i++) {
+ TableColumn column = new TableColumn(attachmentsTable, SWT.LEFT, i);
+ column.setText(attachmentsColumns[i]);
+ column.setWidth(attachmentsColumnWidths[i]);
+ }
+ // size column
+ attachmentsTable.getColumn(2).setAlignment(SWT.RIGHT);
+
+ TableViewer attachmentsViewer = new TableViewer(attachmentsTable);
+ attachmentsViewer.setUseHashlookup(true);
+ attachmentsViewer.setColumnProperties(attachmentsColumns);
+ ColumnViewerToolTipSupport.enableFor(attachmentsViewer, ToolTip.NO_RECREATE);
+
+ attachmentsViewer.setSorter(new ViewerSorter() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ ITaskAttachment attachment1 = (ITaskAttachment) e1;
+ ITaskAttachment attachment2 = (ITaskAttachment) e2;
+ Date created1 = attachment1.getCreationDate();
+ Date created2 = attachment2.getCreationDate();
+ if (created1 != null && created2 != null) {
+ return created1.compareTo(created2);
+ } else if (created1 == null && created2 != null) {
+ return -1;
+ } else if (created1 != null && created2 == null) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ });
+
+ List<ITaskAttachment> attachmentList = new ArrayList<ITaskAttachment>(attachments.size());
+ for (TaskAttribute attribute : attachments) {
+ TaskAttachment taskAttachment = new TaskAttachment(getModel().getTaskRepository(), getModel().getTask(),
+ attribute);
+ getTaskData().getAttributeMapper().updateTaskAttachment(taskAttachment, attribute);
+ attachmentList.add(taskAttachment);
+ }
+ attachmentsViewer.setContentProvider(new ArrayContentProvider());
+ attachmentsViewer.setLabelProvider(new AttachmentTableLabelProvider(getModel(),
+ getTaskEditorPage().getAttributeEditorToolkit()));
+ attachmentsViewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ if (!event.getSelection().isEmpty()) {
+ StructuredSelection selection = (StructuredSelection) event.getSelection();
+ ITaskAttachment attachment = (ITaskAttachment) selection.getFirstElement();
+ TasksUiUtil.openUrl(attachment.getUrl());
+ }
+ }
+ });
+ attachmentsViewer.addSelectionChangedListener(getTaskEditorPage());
+ attachmentsViewer.setInput(attachmentList.toArray());
+
+ menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ TasksUiMenus.fillTaskAttachmentMenu(manager);
+ }
+ });
+ getTaskEditorPage().getEditorSite().registerContextMenu(ID_POPUP_MENU, menuManager, attachmentsViewer, true);
+ Menu menu = menuManager.createContextMenu(attachmentsTable);
+ attachmentsTable.setMenu(menu);
+ }
+
+ private void createButtons(Composite attachmentsComposite, FormToolkit toolkit) {
+ final Composite attachmentControlsComposite = toolkit.createComposite(attachmentsComposite);
+ attachmentControlsComposite.setLayout(new GridLayout(2, false));
+ attachmentControlsComposite.setLayoutData(new GridData(GridData.BEGINNING));
+
+ Button attachFileButton = toolkit.createButton(attachmentControlsComposite,
+ Messages.TaskEditorAttachmentPart_Attach_, SWT.PUSH);
+ attachFileButton.setImage(CommonImages.getImage(CommonImages.FILE_PLAIN));
+ attachFileButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ EditorUtil.openNewAttachmentWizard(getTaskEditorPage(), Mode.DEFAULT, null);
+ }
+ });
+ getTaskEditorPage().registerDefaultDropListener(attachFileButton);
+
+ Button attachScreenshotButton = toolkit.createButton(attachmentControlsComposite,
+ Messages.TaskEditorAttachmentPart_Attach__Screenshot, SWT.PUSH);
+ attachScreenshotButton.setImage(CommonImages.getImage(CommonImages.IMAGE_CAPTURE));
+ attachScreenshotButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ EditorUtil.openNewAttachmentWizard(getTaskEditorPage(), Mode.SCREENSHOT, null);
+ }
+ });
+ getTaskEditorPage().registerDefaultDropListener(attachScreenshotButton);
+ }
+
+ @Override
+ public void createControl(Composite parent, final FormToolkit toolkit) {
+ initialize();
+
+ final Section section = createSection(parent, toolkit, hasIncoming);
+ section.setText(getPartName() + " (" + attachments.size() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (hasIncoming) {
+ expandSection(toolkit, section);
+ } else {
+ section.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent event) {
+ if (attachmentsComposite == null) {
+ expandSection(toolkit, section);
+ getTaskEditorPage().reflow();
+ }
+ }
+ });
+ }
+ setSection(toolkit, section);
+ }
+
+ private void expandSection(FormToolkit toolkit, Section section) {
+ attachmentsComposite = toolkit.createComposite(section);
+ attachmentsComposite.setLayout(EditorUtil.createSectionClientLayout());
+ attachmentsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ getTaskEditorPage().registerDefaultDropListener(section);
+
+ if (attachments.size() > 0) {
+ createAttachmentTable(toolkit, attachmentsComposite);
+ } else {
+ Label label = toolkit.createLabel(attachmentsComposite, Messages.TaskEditorAttachmentPart_No_attachments);
+ getTaskEditorPage().registerDefaultDropListener(label);
+ }
+
+ createButtons(attachmentsComposite, toolkit);
+
+ toolkit.paintBordersFor(attachmentsComposite);
+ section.setClient(attachmentsComposite);
+ }
+
+ @Override
+ public void dispose() {
+ if (menuManager != null) {
+ menuManager.dispose();
+ }
+ super.dispose();
+ }
+
+ private void initialize() {
+ attachments = getTaskData().getAttributeMapper().getAttributesByType(getTaskData(),
+ TaskAttribute.TYPE_ATTACHMENT);
+ for (TaskAttribute attachmentAttribute : attachments) {
+ if (getModel().hasIncomingChanges(attachmentAttribute)) {
+ hasIncoming = true;
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected void fillToolBar(ToolBarManager toolBarManager) {
+ Action attachFileAction = new Action() {
+ @Override
+ public void run() {
+ EditorUtil.openNewAttachmentWizard(getTaskEditorPage(), Mode.DEFAULT, null);
+ }
+ };
+ attachFileAction.setToolTipText(Messages.TaskEditorAttachmentPart_Attach_);
+ attachFileAction.setImageDescriptor(CommonImages.FILE_PLAIN);
+ toolBarManager.add(attachFileAction);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorAttributePart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorAttributePart.java
new file mode 100644
index 0000000..5188c7b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorAttributePart.java
@@ -0,0 +1,291 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDiffUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
+import org.eclipse.mylyn.tasks.core.sync.TaskJob;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorAttributePart extends AbstractTaskEditorPart {
+
+ private static final int LABEL_WIDTH = 110;
+
+ private static final int COLUMN_WIDTH = 140;
+
+ private static final int COLUMN_GAP = 20;
+
+ private static final int MULTI_COLUMN_WIDTH = COLUMN_WIDTH + 5 + COLUMN_GAP + LABEL_WIDTH + 5 + COLUMN_WIDTH;
+
+ private static final int MULTI_ROW_HEIGHT = 55;
+
+ private List<AbstractAttributeEditor> attributeEditors;
+
+ private boolean hasIncoming;
+
+ private Composite attributesComposite;
+
+ public TaskEditorAttributePart() {
+ setPartName(Messages.TaskEditorAttributePart_Attributes);
+ }
+
+ private void createAttributeControls(Composite attributesComposite, FormToolkit toolkit, int columnCount) {
+ int currentColumn = 1;
+ int currentPriority = 0;
+ for (AbstractAttributeEditor attributeEditor : attributeEditors) {
+ int priority = (attributeEditor.getLayoutHint() != null) ? attributeEditor.getLayoutHint().getPriority()
+ : LayoutHint.DEFAULT_PRIORITY;
+ if (priority != currentPriority) {
+ currentPriority = priority;
+ if (currentColumn > 1) {
+ while (currentColumn <= columnCount) {
+ getManagedForm().getToolkit().createLabel(attributesComposite, ""); //$NON-NLS-1$
+ currentColumn++;
+ }
+ currentColumn = 1;
+ }
+ }
+
+ if (attributeEditor.hasLabel()) {
+ attributeEditor.createLabelControl(attributesComposite, toolkit);
+ Label label = attributeEditor.getLabelControl();
+ String text = label.getText();
+ String shortenText = TaskDiffUtil.shortenText(label, text, LABEL_WIDTH);
+ label.setText(shortenText);
+ if (!text.equals(shortenText)) {
+ label.setToolTipText(text);
+ }
+ GridData gd = GridDataFactory.fillDefaults()
+ .align(SWT.RIGHT, SWT.CENTER)
+ .hint(LABEL_WIDTH, SWT.DEFAULT)
+ .create();
+ if (currentColumn > 1) {
+ gd.horizontalIndent = COLUMN_GAP;
+ gd.widthHint = LABEL_WIDTH + COLUMN_GAP;
+ }
+ label.setLayoutData(gd);
+ currentColumn++;
+ }
+
+ attributeEditor.createControl(attributesComposite, toolkit);
+ LayoutHint layoutHint = attributeEditor.getLayoutHint();
+ GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false);
+ if (layoutHint != null
+ && !(layoutHint.rowSpan == RowSpan.SINGLE && layoutHint.columnSpan == ColumnSpan.SINGLE)) {
+ if (layoutHint.rowSpan == RowSpan.MULTIPLE) {
+ gd.heightHint = MULTI_ROW_HEIGHT;
+ }
+ if (layoutHint.columnSpan == ColumnSpan.SINGLE) {
+ gd.widthHint = COLUMN_WIDTH;
+ gd.horizontalSpan = 1;
+ } else {
+ gd.widthHint = MULTI_COLUMN_WIDTH;
+ gd.horizontalSpan = columnCount - currentColumn + 1;
+ }
+ } else {
+ gd.widthHint = COLUMN_WIDTH;
+ gd.horizontalSpan = 1;
+ }
+ attributeEditor.getControl().setLayoutData(gd);
+
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(attributeEditor);
+
+ currentColumn += gd.horizontalSpan;
+ currentColumn %= columnCount;
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, final FormToolkit toolkit) {
+ initialize();
+
+ boolean expand = shouldExpandOnCreate();
+ final Section section = createSection(parent, toolkit, expand);
+ if (expand) {
+ expandSection(toolkit, section);
+ } else {
+ section.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent event) {
+ if (attributesComposite == null) {
+ expandSection(toolkit, section);
+ getTaskEditorPage().reflow();
+ }
+ }
+ });
+ }
+ setSection(toolkit, section);
+ }
+
+ /**
+ * Integrator requested the ability to control whether the attributes section is expanded on creation.
+ */
+ protected boolean shouldExpandOnCreate() {
+ return getTaskData().isNew() || hasIncoming;
+ }
+
+ private void expandSection(FormToolkit toolkit, Section section) {
+ attributesComposite = toolkit.createComposite(section);
+ attributesComposite.addListener(SWT.MouseDown, new Listener() {
+ public void handleEvent(Event event) {
+ Control focus = event.display.getFocusControl();
+ if (focus instanceof Text && ((Text) focus).getEditable() == false) {
+ getManagedForm().getForm().setFocus();
+ }
+ }
+ });
+
+ GridLayout attributesLayout = EditorUtil.createSectionClientLayout();
+ attributesLayout.numColumns = 4;
+ attributesLayout.horizontalSpacing = 5;
+ attributesLayout.verticalSpacing = 6;
+ attributesComposite.setLayout(attributesLayout);
+
+ GridData attributesData = new GridData(GridData.FILL_BOTH);
+ attributesData.horizontalSpan = 1;
+ attributesData.grabExcessVerticalSpace = false;
+ attributesComposite.setLayoutData(attributesData);
+
+ createAttributeControls(attributesComposite, toolkit, attributesLayout.numColumns);
+ toolkit.paintBordersFor(attributesComposite);
+
+ section.setClient(attributesComposite);
+ }
+
+ @Override
+ protected void fillToolBar(ToolBarManager toolBar) {
+ UpdateRepositoryConfigurationAction repositoryConfigRefresh = new UpdateRepositoryConfigurationAction() {
+ @Override
+ public void run() {
+ getTaskEditorPage().showEditorBusy(true);
+ final TaskJob job = TasksUiInternal.getJobFactory().createUpdateRepositoryConfigurationJob(
+ getTaskEditorPage().getConnector(), getTaskEditorPage().getTaskRepository());
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getTaskEditorPage().showEditorBusy(false);
+ if (job.getStatus() != null) {
+ getTaskEditorPage().getTaskEditor()
+ .setStatus(
+ Messages.TaskEditorAttributePart_Updating_of_repository_configuration_failed,
+ Messages.TaskEditorAttributePart_Update_Failed, job.getStatus());
+ } else {
+ getTaskEditorPage().refreshFormContent();
+ }
+ }
+ });
+ }
+ });
+ job.setUser(true);
+ job.setPriority(Job.INTERACTIVE);
+ job.schedule();
+ };
+
+// @Override
+// public void performUpdate(TaskRepository repository, AbstractRepositoryConnector connector,
+// IProgressMonitor monitor) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// getTaskEditorPage().showEditorBusy(true);
+// }
+// });
+// try {
+// super.performUpdate(repository, connector, monitor);
+// AbstractTask task = getTaskEditorPage().getTask();
+// Job job = TasksUi.synchronizeTask(connector, task, true, null);
+// job.join();
+// } catch (InterruptedException e) {
+// // ignore
+// } finally {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// getTaskEditorPage().refreshFormContent();
+// }
+// });
+// }
+// }
+ };
+ repositoryConfigRefresh.setImageDescriptor(TasksUiImages.REPOSITORY_UPDATE_CONFIGURATION);
+ repositoryConfigRefresh.selectionChanged(new StructuredSelection(getTaskEditorPage().getTaskRepository()));
+ repositoryConfigRefresh.setToolTipText(Messages.TaskEditorAttributePart_Refresh_Attributes);
+ toolBar.add(repositoryConfigRefresh);
+ }
+
+ private void initialize() {
+ attributeEditors = new ArrayList<AbstractAttributeEditor>();
+ hasIncoming = false;
+
+ Map<String, TaskAttribute> attributes = getTaskData().getRoot().getAttributes();
+ for (TaskAttribute attribute : attributes.values()) {
+ TaskAttributeMetaData properties = attribute.getMetaData();
+ if (!TaskAttribute.KIND_DEFAULT.equals(properties.getKind())) {
+ continue;
+ }
+
+ AbstractAttributeEditor attributeEditor = createAttributeEditor(attribute);
+ if (attributeEditor != null) {
+ attributeEditors.add(attributeEditor);
+ if (getModel().hasIncomingChanges(attribute)) {
+ hasIncoming = true;
+ }
+ }
+ }
+
+ Collections.sort(attributeEditors, new Comparator<AbstractAttributeEditor>() {
+ public int compare(AbstractAttributeEditor o1, AbstractAttributeEditor o2) {
+ int p1 = (o1.getLayoutHint() != null) ? o1.getLayoutHint().getPriority() : LayoutHint.DEFAULT_PRIORITY;
+ int p2 = (o2.getLayoutHint() != null) ? o2.getLayoutHint().getPriority() : LayoutHint.DEFAULT_PRIORITY;
+ return p1 - p2;
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java
new file mode 100644
index 0000000..23edd35
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorCommentPart.java
@@ -0,0 +1,748 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jingwen Ou - comment grouping
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.tasks.core.TaskComment;
+import org.eclipse.mylyn.internal.tasks.ui.actions.CommentActionGroup;
+import org.eclipse.mylyn.internal.tasks.ui.editors.CommentGroupStrategy.CommentGroup;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.actions.ActionContext;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Robert Elves
+ * @author Steffen Pingel
+ * @author Jingwen Ou
+ */
+public class TaskEditorCommentPart extends AbstractTaskEditorPart {
+
+ private static final String ID_POPUP_MENU = "org.eclipse.mylyn.tasks.ui.editor.menu.comments"; //$NON-NLS-1$
+
+ private class CommentGroupViewer {
+
+ private final CommentGroup commentGroup;
+
+ private ArrayList<CommentViewer> commentViewers;
+
+ private Section groupSection;
+
+ private boolean renderedInSubSection;
+
+ public CommentGroupViewer(CommentGroup commentGroup) {
+ this.commentGroup = commentGroup;
+ }
+
+ private Composite createCommentViewers(Composite parent, FormToolkit toolkit) {
+ Composite composite = toolkit.createComposite(parent);
+ GridLayout contentLayout = new GridLayout();
+ contentLayout.marginHeight = 0;
+ contentLayout.marginWidth = 0;
+ composite.setLayout(contentLayout);
+
+ List<CommentViewer> viewers = getCommentViewers();
+ for (CommentViewer commentViewer : viewers) {
+ Control control = commentViewer.createControl(composite, toolkit);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(control);
+ }
+ return composite;
+ }
+
+ private Control createControl(final Composite parent, final FormToolkit toolkit) {
+ if (renderedInSubSection) {
+ return createSection(parent, toolkit);
+ } else {
+ return createCommentViewers(parent, toolkit);
+ }
+ }
+
+ private Section createSection(final Composite parent, final FormToolkit toolkit) {
+ int style = ExpandableComposite.TWISTIE | ExpandableComposite.SHORT_TITLE_BAR;
+// if (/*commentGroup.hasIncoming() || */expandAllInProgress) {
+// style |= ExpandableComposite.EXPANDED;
+// }
+
+ groupSection = toolkit.createSection(parent, style);
+ groupSection.clientVerticalSpacing = 0;
+ if (commentGroup.hasIncoming()) {
+ groupSection.setBackground(getTaskEditorPage().getAttributeEditorToolkit().getColorIncoming());
+ }
+ groupSection.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ groupSection.setText(commentGroup.getGroupName() + Messages.TaskEditorCommentPart_0
+ + commentGroup.getCommentAttributes().size() + Messages.TaskEditorCommentPart_1);
+
+ if (groupSection.isExpanded()) {
+ Composite composite = createCommentViewers(groupSection, toolkit);
+ groupSection.setClient(composite);
+ } else {
+ groupSection.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ if (commentGroup.hasIncoming()) {
+ if (e.getState()) {
+ groupSection.setBackground(null);
+ } else {
+ // only decorate background with incoming color when collapsed, otherwise
+ // there is too much decoration in the editor
+ groupSection.setBackground(getTaskEditorPage().getAttributeEditorToolkit()
+ .getColorIncoming());
+ }
+ }
+ if (groupSection.getClient() == null) {
+ try {
+ getTaskEditorPage().setReflow(false);
+ Composite composite = createCommentViewers(groupSection, toolkit);
+ groupSection.setClient(composite);
+ } finally {
+ getTaskEditorPage().setReflow(true);
+ }
+ getTaskEditorPage().reflow();
+ }
+ }
+ });
+ }
+
+ return groupSection;
+ }
+
+ public List<CommentViewer> getCommentViewers() {
+ if (commentViewers != null) {
+ return commentViewers;
+ }
+
+ commentViewers = new ArrayList<CommentViewer>(commentGroup.getCommentAttributes().size());
+ for (final TaskAttribute commentAttribute : commentGroup.getCommentAttributes()) {
+ CommentViewer commentViewer = new CommentViewer(commentAttribute);
+ commentViewers.add(commentViewer);
+ }
+ return commentViewers;
+ }
+
+ public boolean isExpanded() {
+ if (groupSection != null) {
+ return groupSection.isExpanded();
+ }
+
+ if (commentViewers != null) {
+ for (CommentViewer commentViewer : commentViewers) {
+ if (commentViewer.isExpanded()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this group and all comments in it are expanded.
+ */
+ public boolean isFullyExpanded() {
+ if (groupSection != null && !groupSection.isExpanded()) {
+ return false;
+ }
+ if (commentViewers != null) {
+ for (CommentViewer commentViewer : commentViewers) {
+ if (!commentViewer.isExpanded()) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public boolean isRenderedInSubSection() {
+ return renderedInSubSection;
+ }
+
+ /**
+ * Expands this group and all comments in it.
+ */
+ public void setExpanded(boolean expanded) {
+ if (groupSection != null && groupSection.isExpanded() != expanded) {
+ CommonFormUtil.setExpanded(groupSection, expanded);
+ }
+
+ if (commentViewers != null) {
+ for (CommentViewer commentViewer : commentViewers) {
+ commentViewer.setExpanded(expanded);
+ }
+ }
+ }
+
+ public void setRenderedInSubSection(boolean renderedInSubSection) {
+ this.renderedInSubSection = renderedInSubSection;
+ }
+
+ // private void createToolBar(final FormToolkit toolkit) {
+// if (section == null) {
+// return;
+// }
+//
+// ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+//
+// Action collapseAllAction = new Action("") {
+// @Override
+// public void run() {
+// toggleSection(section, false);
+// }
+// };
+// collapseAllAction.setImageDescriptor(CommonImages.COLLAPSE_ALL_SMALL);
+// collapseAllAction.setToolTipText("Collapse All Current Comments");
+// toolBarManager.add(collapseAllAction);
+//
+// Action expandAllAction = new Action("") {
+// @Override
+// public void run() {
+// toggleSection(section, true);
+// }
+// };
+// expandAllAction.setImageDescriptor(CommonImages.EXPAND_ALL_SMALL);
+// expandAllAction.setToolTipText("Expand All Current Comments");
+// toolBarManager.add(expandAllAction);
+//
+// Composite toolbarComposite = toolkit.createComposite(section);
+// toolbarComposite.setBackground(null);
+// RowLayout rowLayout = new RowLayout();
+// rowLayout.marginTop = 0;
+// rowLayout.marginBottom = 0;
+// rowLayout.marginLeft = 0;
+// rowLayout.marginRight = 0;
+// toolbarComposite.setLayout(rowLayout);
+//
+// toolBarManager.createControl(toolbarComposite);
+// section.setTextClient(toolbarComposite);
+// }
+
+ }
+
+ private class CommentViewer {
+
+ private Composite buttonComposite;
+
+ private final TaskAttribute commentAttribute;
+
+ private ExpandableComposite commentComposite;
+
+ private final TaskComment taskComment;
+
+ private AbstractAttributeEditor editor;
+
+ public CommentViewer(TaskAttribute commentAttribute) {
+ this.commentAttribute = commentAttribute;
+ this.taskComment = new TaskComment(getModel().getTaskRepository(), getModel().getTask(), commentAttribute);
+ }
+
+ public Control createControl(Composite composite, final FormToolkit toolkit) {
+ boolean hasIncomingChanges = getModel().hasIncomingChanges(commentAttribute);
+ getTaskData().getAttributeMapper().updateTaskComment(taskComment, commentAttribute);
+ int style = ExpandableComposite.TREE_NODE | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT
+ | ExpandableComposite.COMPACT;
+ if (hasIncomingChanges || expandAllInProgress) {
+ style |= ExpandableComposite.EXPANDED;
+ }
+ commentComposite = toolkit.createExpandableComposite(composite, style);
+ commentComposite.clientVerticalSpacing = 0;
+ commentComposite.setLayout(new GridLayout());
+ commentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ commentComposite.setTitleBarForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+
+ buttonComposite = createTitle(commentComposite, toolkit);
+
+ final Composite commentTextComposite = toolkit.createComposite(commentComposite);
+ commentComposite.setClient(commentTextComposite);
+ commentTextComposite.setLayout(new FillWidthLayout(EditorUtil.getLayoutAdvisor(getTaskEditorPage()), 15, 0,
+ 0, 3));
+ commentComposite.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent event) {
+ expandComment(toolkit, commentTextComposite, event.getState());
+ }
+ });
+ if (hasIncomingChanges) {
+ commentComposite.setBackground(getTaskEditorPage().getAttributeEditorToolkit().getColorIncoming());
+ }
+ if (commentComposite.isExpanded()) {
+ expandComment(toolkit, commentTextComposite, true);
+ }
+
+ // for outline
+ EditorUtil.setMarker(commentComposite, commentAttribute.getId());
+ return commentComposite;
+ }
+
+ private Composite createTitle(final ExpandableComposite commentComposite, final FormToolkit toolkit) {
+ // always visible
+ Composite titleComposite = toolkit.createComposite(commentComposite);
+ commentComposite.setTextClient(titleComposite);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.pack = true;
+ rowLayout.marginLeft = 0;
+ rowLayout.marginBottom = 0;
+ rowLayout.marginTop = 0;
+ EditorUtil.center(rowLayout);
+ titleComposite.setLayout(rowLayout);
+ titleComposite.setBackground(null);
+
+ ImageHyperlink expandCommentHyperlink = createTitleHyperLink(toolkit, titleComposite, taskComment);
+ expandCommentHyperlink.setFont(commentComposite.getFont());
+ expandCommentHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ CommonFormUtil.setExpanded(commentComposite, !commentComposite.isExpanded());
+ }
+ });
+
+ // only visible when section is expanded
+ final Composite buttonComposite = toolkit.createComposite(titleComposite);
+ RowLayout buttonCompLayout = new RowLayout();
+ buttonCompLayout.marginBottom = 0;
+ buttonCompLayout.marginTop = 0;
+ buttonComposite.setLayout(buttonCompLayout);
+ buttonComposite.setBackground(null);
+ buttonComposite.setVisible(commentComposite.isExpanded());
+
+ ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+ ReplyToCommentAction replyAction = new ReplyToCommentAction(this, taskComment);
+ replyAction.setImageDescriptor(TasksUiImages.COMMENT_REPLY_SMALL);
+ toolBarManager.add(replyAction);
+ toolBarManager.createControl(buttonComposite);
+
+ return buttonComposite;
+ }
+
+ private ImageHyperlink createTitleHyperLink(final FormToolkit toolkit, final Composite toolbarComp,
+ final ITaskComment taskComment) {
+ ImageHyperlink formHyperlink = toolkit.createImageHyperlink(toolbarComp, SWT.NONE);
+ formHyperlink.setBackground(null);
+ formHyperlink.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ IRepositoryPerson author = taskComment.getAuthor();
+ if (author != null
+ && author.getPersonId().equalsIgnoreCase(getTaskEditorPage().getTaskRepository().getUserName())) {
+ formHyperlink.setImage(CommonImages.getImage(CommonImages.PERSON_ME_NARROW));
+ } else {
+ formHyperlink.setImage(CommonImages.getImage(CommonImages.PERSON_NARROW));
+ }
+ StringBuilder sb = new StringBuilder();
+ if (taskComment.getNumber() >= 0) {
+ sb.append(taskComment.getNumber());
+ sb.append(": "); //$NON-NLS-1$
+ }
+ if (author != null) {
+ if (author.getName() != null) {
+ sb.append(author.getName());
+ formHyperlink.setToolTipText(author.getPersonId());
+ } else {
+ sb.append(author.getPersonId());
+ }
+ }
+ if (taskComment.getCreationDate() != null) {
+ sb.append(", "); //$NON-NLS-1$
+ sb.append(EditorUtil.formatDateTime(taskComment.getCreationDate()));
+ }
+ formHyperlink.setText(sb.toString());
+ formHyperlink.setEnabled(true);
+ formHyperlink.setUnderlined(false);
+ return formHyperlink;
+ }
+
+ private void expandComment(FormToolkit toolkit, Composite composite, boolean expanded) {
+ buttonComposite.setVisible(expanded);
+ if (expanded && composite.getData(KEY_EDITOR) == null) {
+ // create viewer
+ TaskAttribute textAttribute = getTaskData().getAttributeMapper().getAssoctiatedAttribute(
+ taskComment.getTaskAttribute());
+ editor = createAttributeEditor(textAttribute);
+ if (editor != null) {
+ editor.setDecorationEnabled(false);
+ editor.createControl(composite, toolkit);
+ editor.getControl().addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseDown(MouseEvent e) {
+ getTaskEditorPage().selectionChanged(taskComment);
+ }
+ });
+ composite.setData(KEY_EDITOR, editor);
+
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ getTaskEditorPage().reflow();
+ }
+ } else if (!expanded && composite.getData(KEY_EDITOR) != null) {
+ // dispose viewer
+ AbstractAttributeEditor editor = (AbstractAttributeEditor) composite.getData(KEY_EDITOR);
+ editor.getControl().setMenu(null);
+ editor.getControl().dispose();
+ composite.setData(KEY_EDITOR, null);
+ getTaskEditorPage().reflow();
+ }
+ getTaskEditorPage().selectionChanged(taskComment);
+ }
+
+ public boolean isExpanded() {
+ return commentComposite != null && commentComposite.isExpanded();
+ }
+
+ public void setExpanded(boolean expanded) {
+ if (commentComposite != null && commentComposite.isExpanded() != expanded) {
+ CommonFormUtil.setExpanded(commentComposite, expanded);
+ }
+ }
+
+ /**
+ * Returns the comment viewer.
+ *
+ * @return null, if the viewer has not been constructed
+ */
+ public AbstractAttributeEditor getEditor() {
+ return editor;
+ }
+
+ }
+
+ private class ReplyToCommentAction extends AbstractReplyToCommentAction implements IMenuCreator {
+
+ private final ITaskComment taskComment;
+
+ private final CommentViewer commentViewer;
+
+ public ReplyToCommentAction(CommentViewer commentViewer, ITaskComment taskComment) {
+ super(TaskEditorCommentPart.this.getTaskEditorPage(), taskComment);
+ this.commentViewer = commentViewer;
+ this.taskComment = taskComment;
+ setMenuCreator(this);
+ }
+
+ @Override
+ protected String getReplyText() {
+ return taskComment.getText();
+ }
+
+ public Menu getMenu(Control parent) {
+ currentViewer = commentViewer;
+ selectionProvider.setSelection(new StructuredSelection(taskComment));
+ return commentMenu;
+ }
+
+ public void dispose() {
+ }
+
+ public Menu getMenu(Menu parent) {
+ selectionProvider.setSelection(new StructuredSelection(taskComment));
+ return commentMenu;
+ }
+
+ }
+
+ /** Expandable composites are indented by 6 pixels by default. */
+ private static final int INDENT = -6;
+
+ private static final String KEY_EDITOR = "viewer"; //$NON-NLS-1$
+
+ private List<TaskAttribute> commentAttributes;
+
+ private CommentGroupStrategy commentGroupStrategy;
+
+ private List<CommentGroupViewer> commentGroupViewers;
+
+ private boolean expandAllInProgress;
+
+ private boolean hasIncoming;
+
+ protected Section section;
+
+ private SelectionProviderAdapter selectionProvider;
+
+ // XXX: stores a reference to the viewer for which the commentMenu was displayed last
+ private CommentViewer currentViewer;
+
+ private Menu commentMenu;
+
+ private CommentActionGroup actionGroup;
+
+ public TaskEditorCommentPart() {
+ this.commentGroupStrategy = new CommentGroupStrategy() {
+ @Override
+ protected boolean hasIncomingChanges(ITaskComment taskComment) {
+ return getModel().hasIncomingChanges(taskComment.getTaskAttribute());
+ }
+ };
+ setPartName(Messages.TaskEditorCommentPart_Comments);
+ }
+
+ private void collapseAllComments() {
+ try {
+ getTaskEditorPage().setReflow(false);
+
+ boolean collapsed = false;
+ List<CommentGroupViewer> viewers = getCommentGroupViewers();
+ for (int i = 0; i < viewers.size(); i++) {
+ if (viewers.get(i).isExpanded()) {
+ viewers.get(i).setExpanded(false);
+ collapsed = viewers.get(i).isRenderedInSubSection();
+ break;
+ }
+ }
+
+ if (!collapsed && section != null) {
+ CommonFormUtil.setExpanded(section, false);
+ }
+ } finally {
+ getTaskEditorPage().setReflow(true);
+ }
+ getTaskEditorPage().reflow();
+ }
+
+ private TaskComment convertToTaskComment(TaskDataModel taskDataModel, TaskAttribute commentAttribute) {
+ TaskComment taskComment = new TaskComment(taskDataModel.getTaskRepository(), taskDataModel.getTask(),
+ commentAttribute);
+ taskDataModel.getTaskData().getAttributeMapper().updateTaskComment(taskComment, commentAttribute);
+ return taskComment;
+ }
+
+ @Override
+ public void createControl(Composite parent, final FormToolkit toolkit) {
+ initialize();
+
+ selectionProvider = new SelectionProviderAdapter();
+ actionGroup = new CommentActionGroup();
+
+ MenuManager menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ // get comment and add reply action as first item in the menu
+ ISelection selection = selectionProvider.getSelection();
+ if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+ Object element = ((IStructuredSelection) selection).getFirstElement();
+ if (element instanceof ITaskComment) {
+ final ITaskComment comment = (ITaskComment) element;
+ AbstractReplyToCommentAction replyAction = new AbstractReplyToCommentAction(
+ getTaskEditorPage(), comment) {
+ @Override
+ protected String getReplyText() {
+ return comment.getText();
+ }
+ };
+ manager.add(replyAction);
+ }
+ }
+ actionGroup.fillContextMenu(manager);
+ actionGroup.setContext(new ActionContext(selectionProvider.getSelection()));
+
+ if (currentViewer != null && currentViewer.getEditor() instanceof RichTextAttributeEditor) {
+ RichTextAttributeEditor editor = (RichTextAttributeEditor) currentViewer.getEditor();
+ if (editor.getViewSourceAction().isEnabled()) {
+ manager.add(new Separator("planning")); //$NON-NLS-1$
+ manager.add(editor.getViewSourceAction());
+ }
+ }
+ }
+ });
+ getTaskEditorPage().getEditorSite().registerContextMenu(ID_POPUP_MENU, menuManager, selectionProvider, false);
+ commentMenu = menuManager.createContextMenu(parent);
+
+ section = createSection(parent, toolkit, hasIncoming);
+ section.setText(section.getText() + " (" + commentAttributes.size() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if (commentAttributes.isEmpty()) {
+ section.setEnabled(false);
+ } else {
+ if (hasIncoming) {
+ expandSection(toolkit, section);
+ } else {
+ section.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent event) {
+ if (section.getClient() == null) {
+ try {
+ getTaskEditorPage().setReflow(false);
+ expandSection(toolkit, section);
+ } finally {
+ getTaskEditorPage().setReflow(true);
+ }
+ getTaskEditorPage().reflow();
+ }
+ }
+ });
+ }
+ }
+ setSection(toolkit, section);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (actionGroup != null) {
+ actionGroup.dispose();
+ }
+ }
+
+ private void expandAllComments() {
+ try {
+ expandAllInProgress = true;
+ getTaskEditorPage().setReflow(false);
+
+ if (section != null) {
+ // the expandAllInProgress flag will ensure that comments in top-level groups have been
+ // expanded, no need to expand groups explicitly
+ boolean expandGroups = section.getClient() != null;
+
+ CommonFormUtil.setExpanded(section, true);
+
+ if (expandGroups) {
+ List<CommentGroupViewer> viewers = getCommentGroupViewers();
+ for (int i = viewers.size() - 1; i >= 0; i--) {
+ if (!viewers.get(i).isFullyExpanded()) {
+ viewers.get(i).setExpanded(true);
+ break;
+ }
+ }
+ }
+ }
+ } finally {
+ expandAllInProgress = false;
+ getTaskEditorPage().setReflow(true);
+ }
+ getTaskEditorPage().reflow();
+ }
+
+ private void expandSection(final FormToolkit toolkit, final Section section) {
+ Composite composite = toolkit.createComposite(section);
+ section.setClient(composite);
+ composite.setLayout(EditorUtil.createSectionClientLayout());
+
+ List<CommentGroupViewer> viewers = getCommentGroupViewers();
+ for (CommentGroupViewer viewer : viewers) {
+ Control control = viewer.createControl(composite, toolkit);
+ if (viewer.isRenderedInSubSection()) {
+ // align twistie of sub-section with section
+ GridDataFactory.fillDefaults().grab(true, false).indent(2 * INDENT, 0).applyTo(control);
+ } else {
+ GridDataFactory.fillDefaults().grab(true, false).indent(INDENT, 0).applyTo(control);
+ }
+ }
+ }
+
+ @Override
+ protected void fillToolBar(ToolBarManager barManager) {
+ if (commentAttributes.isEmpty()) {
+ return;
+ }
+
+ Action collapseAllAction = new Action("") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ collapseAllComments();
+ }
+ };
+ collapseAllAction.setImageDescriptor(CommonImages.COLLAPSE_ALL_SMALL);
+ collapseAllAction.setToolTipText(Messages.TaskEditorCommentPart_Collapse_Comments);
+ barManager.add(collapseAllAction);
+
+ Action expandAllAction = new Action("") { //$NON-NLS-1$
+ @Override
+ public void run() {
+ expandAllComments();
+ }
+ };
+ expandAllAction.setImageDescriptor(CommonImages.EXPAND_ALL_SMALL);
+ expandAllAction.setToolTipText(Messages.TaskEditorCommentPart_Expand_Comments);
+ barManager.add(expandAllAction);
+ }
+
+ public CommentGroupStrategy getCommentGroupStrategy() {
+ return commentGroupStrategy;
+ }
+
+ public void setCommentGroupStrategy(CommentGroupStrategy commentGroupStrategy) {
+ this.commentGroupStrategy = commentGroupStrategy;
+ }
+
+ private List<CommentGroupViewer> getCommentGroupViewers() {
+ if (commentGroupViewers != null) {
+ return commentGroupViewers;
+ }
+
+ // group comments
+ List<ITaskComment> comments = new ArrayList<ITaskComment>();
+ for (TaskAttribute commentAttribute : this.commentAttributes) {
+ comments.add(convertToTaskComment(getModel(), commentAttribute));
+ }
+ String currentPersonId = getModel().getTaskRepository().getUserName();
+ List<CommentGroup> commentGroups = getCommentGroupStrategy().groupComments(comments, currentPersonId);
+
+ commentGroupViewers = new ArrayList<CommentGroupViewer>(commentGroups.size());
+ if (commentGroups.size() > 0) {
+ for (int i = 0; i < commentGroups.size(); i++) {
+ CommentGroupViewer viewer = new CommentGroupViewer(commentGroups.get(i));
+ boolean isLastGroup = i == commentGroups.size() - 1;
+ viewer.setRenderedInSubSection(!isLastGroup);
+ commentGroupViewers.add(viewer);
+ }
+ }
+ return commentGroupViewers;
+ }
+
+ private void initialize() {
+ commentAttributes = getTaskData().getAttributeMapper().getAttributesByType(getTaskData(),
+ TaskAttribute.TYPE_COMMENT);
+ if (commentAttributes.size() > 0) {
+ for (TaskAttribute commentAttribute : commentAttributes) {
+ if (getModel().hasIncomingChanges(commentAttribute)) {
+ hasIncoming = true;
+ break;
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorContributionExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorContributionExtensionReader.java
new file mode 100644
index 0000000..3b8fb20
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorContributionExtensionReader.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorPartDescriptor;
+
+/**
+ * @author Shawn Minto
+ */
+public class TaskEditorContributionExtensionReader {
+
+ private static final String ATTR_ID = "id"; //$NON-NLS-1$
+
+ public static final String EXTENSION_TASK_EDITOR_PAGE_CONTRIBUTION = "org.eclipse.mylyn.tasks.ui.taskEditorPageContribution"; //$NON-NLS-1$
+
+ private static final String REPOSITORY_TASK_EDITOR_CONTRIBUTION = "repositoryPart"; //$NON-NLS-1$
+
+ private static final String LOCAL_TASK_EDITOR_CONTRIBUTION = "localPart"; //$NON-NLS-1$
+
+ private static Collection<TaskEditorPartDescriptor> repositoryEditorContributions;
+
+ private static Collection<LocalTaskEditorContributionDescriptor> localEditorContributions;
+
+ public static Collection<LocalTaskEditorContributionDescriptor> getLocalEditorContributions() {
+ if (localEditorContributions == null) {
+ initExtensions();
+ }
+ return Collections.unmodifiableCollection(localEditorContributions);
+ }
+
+ public static Collection<TaskEditorPartDescriptor> getRepositoryEditorContributions() {
+ if (repositoryEditorContributions == null) {
+ initExtensions();
+ }
+ return Collections.unmodifiableCollection(repositoryEditorContributions);
+ }
+
+ private static void initExtensions() {
+ Collection<TaskEditorPartDescriptor> repositoryContributions = new ArrayList<TaskEditorPartDescriptor>();
+ Collection<LocalTaskEditorContributionDescriptor> localContributions = new ArrayList<LocalTaskEditorContributionDescriptor>();
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ IExtensionPoint editorExtensionPoint = registry.getExtensionPoint(EXTENSION_TASK_EDITOR_PAGE_CONTRIBUTION);
+ IExtension[] editorExtensions = editorExtensionPoint.getExtensions();
+ for (IExtension extension : editorExtensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(REPOSITORY_TASK_EDITOR_CONTRIBUTION)) {
+ readRepositoryEditorContributionExtension(element, repositoryContributions);
+ } else if (element.getName().equals(LOCAL_TASK_EDITOR_CONTRIBUTION)) {
+ readLocalEditorContributionExtension(element, localContributions);
+ }
+ }
+ }
+ repositoryEditorContributions = repositoryContributions;
+ localEditorContributions = localContributions;
+ }
+
+ private static void readRepositoryEditorContributionExtension(IConfigurationElement element,
+ Collection<TaskEditorPartDescriptor> contributions) {
+
+ try {
+ String id = element.getAttribute(ATTR_ID);
+ TaskEditorExtensionPartDescriptor descriptor = new TaskEditorExtensionPartDescriptor(id, element);
+ contributions.add(descriptor);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Unable to read repository editor contribution", e)); //$NON-NLS-1$
+ }
+
+ }
+
+ private static void readLocalEditorContributionExtension(IConfigurationElement element,
+ Collection<LocalTaskEditorContributionDescriptor> localContributions) {
+
+ try {
+ localContributions.add(new LocalTaskEditorContributionDescriptor(element));
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Unable to read local editor contribution", e)); //$NON-NLS-1$
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java
new file mode 100644
index 0000000..e7cd85c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorDescriptionPart.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorDescriptionPart extends TaskEditorRichTextPart {
+
+ public TaskEditorDescriptionPart() {
+ setPartName(Messages.TaskEditorDescriptionPart_Description);
+ }
+
+ private void addDuplicateDetection(Composite composite, FormToolkit toolkit) {
+ List<AbstractDuplicateDetector> allCollectors = new ArrayList<AbstractDuplicateDetector>();
+ if (getDuplicateSearchCollectorsList() != null) {
+ allCollectors.addAll(getDuplicateSearchCollectorsList());
+ }
+ if (!allCollectors.isEmpty()) {
+ int style = ExpandableComposite.TWISTIE | ExpandableComposite.SHORT_TITLE_BAR;
+ if (getTaskData().isNew()) {
+ style |= ExpandableComposite.EXPANDED;
+ }
+ Section duplicatesSection = toolkit.createSection(composite, style);
+ duplicatesSection.setText(Messages.TaskEditorDescriptionPart_Duplicate_Detection);
+ duplicatesSection.setLayout(new GridLayout());
+ GridDataFactory.fillDefaults().indent(SWT.DEFAULT, 15).applyTo(duplicatesSection);
+ Composite relatedBugsComposite = toolkit.createComposite(duplicatesSection);
+ relatedBugsComposite.setLayout(new GridLayout(4, false));
+ relatedBugsComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ duplicatesSection.setClient(relatedBugsComposite);
+ Label duplicateDetectorLabel = new Label(relatedBugsComposite, SWT.LEFT);
+ duplicateDetectorLabel.setText(Messages.TaskEditorDescriptionPart_Detector);
+
+ final CCombo duplicateDetectorChooser = new CCombo(relatedBugsComposite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(duplicateDetectorChooser, false, false);
+ duplicateDetectorChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ duplicateDetectorChooser.setFont(TEXT_FONT);
+ duplicateDetectorChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create());
+
+ Collections.sort(allCollectors, new Comparator<AbstractDuplicateDetector>() {
+
+ public int compare(AbstractDuplicateDetector c1, AbstractDuplicateDetector c2) {
+ return c1.getName().compareToIgnoreCase(c2.getName());
+ }
+
+ });
+
+ for (AbstractDuplicateDetector detector : allCollectors) {
+ duplicateDetectorChooser.add(detector.getName());
+ }
+
+ duplicateDetectorChooser.select(0);
+ duplicateDetectorChooser.setEnabled(true);
+ duplicateDetectorChooser.setData(allCollectors);
+
+ if (allCollectors.size() > 0) {
+ Button searchForDuplicates = toolkit.createButton(relatedBugsComposite,
+ Messages.TaskEditorDescriptionPart_Search, SWT.NONE);
+ GridData searchDuplicatesButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ searchForDuplicates.setLayoutData(searchDuplicatesButtonData);
+ searchForDuplicates.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ String selectedDetector = duplicateDetectorChooser.getItem(duplicateDetectorChooser.getSelectionIndex());
+ searchForDuplicates(selectedDetector);
+ }
+ });
+ }
+
+ toolkit.paintBordersFor(relatedBugsComposite);
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ if (getAttribute() == null) {
+ return;
+ }
+
+ super.createControl(parent, toolkit);
+ addDuplicateDetection(getComposite(), toolkit);
+ }
+
+ @Override
+ protected void fillToolBar(ToolBarManager toolBar) {
+ if (!getTaskData().isNew()) {
+ AbstractReplyToCommentAction replyAction = new AbstractReplyToCommentAction(getTaskEditorPage(), null) {
+ @Override
+ protected String getReplyText() {
+ return getEditor().getValue();
+ }
+ };
+ replyAction.setImageDescriptor(TasksUiImages.COMMENT_REPLY_SMALL);
+ toolBar.add(replyAction);
+ }
+ super.fillToolBar(toolBar);
+ }
+
+ protected IRepositoryQuery getDuplicateQuery(String name) throws CoreException {
+ String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name; //$NON-NLS-1$ //$NON-NLS-2$
+ for (AbstractDuplicateDetector detector : getDuplicateSearchCollectorsList()) {
+ if (detector.getName().equals(duplicateDetectorName)) {
+ return detector.getDuplicatesQuery(getTaskEditorPage().getTaskRepository(), getTaskData());
+ }
+ }
+ return null;
+ }
+
+ protected Set<AbstractDuplicateDetector> getDuplicateSearchCollectorsList() {
+ Set<AbstractDuplicateDetector> duplicateDetectors = new HashSet<AbstractDuplicateDetector>();
+ for (AbstractDuplicateDetector detector : TasksUiPlugin.getDefault().getDuplicateSearchCollectorsList()) {
+ if (isValidDuplicateDetector(detector)) {
+ duplicateDetectors.add(detector);
+ }
+ }
+ return duplicateDetectors;
+ }
+
+ @Override
+ public void initialize(AbstractTaskEditorPage taskEditorPage) {
+ super.initialize(taskEditorPage);
+ setAttribute(getModel().getTaskData().getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION));
+ }
+
+ private boolean isValidDuplicateDetector(AbstractDuplicateDetector detector) {
+ return (detector.getConnectorKind() == null || detector.getConnectorKind().equals(
+ getTaskEditorPage().getConnectorKind())) //
+ && detector.canQuery(getTaskData());
+ }
+
+ public void searchForDuplicates(String duplicateDetectorName) {
+ try {
+ IRepositoryQuery duplicatesQuery = getDuplicateQuery(duplicateDetectorName);
+ if (duplicatesQuery != null) {
+ SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(),
+ getTaskEditorPage().getTaskRepository(), duplicatesQuery);
+ NewSearchUI.runQueryInBackground(collector);
+ } else {
+ TasksUiInternal.displayStatus(Messages.TaskEditorDescriptionPart_Duplicate_Detection_Failed,
+ new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.TaskEditorDescriptionPart_The_duplicate_detector_did_not_return_a_valid_query));
+ }
+ } catch (CoreException e) {
+ TasksUiInternal.displayStatus(Messages.TaskEditorDescriptionPart_Duplicate_Detection_Failed, e.getStatus());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionPartDescriptor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionPartDescriptor.java
new file mode 100644
index 0000000..97be3cf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionPartDescriptor.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorPartDescriptor;
+
+/**
+ * Create a part descriptor from an extension point
+ *
+ * @author Shawn Minto
+ */
+public class TaskEditorExtensionPartDescriptor extends TaskEditorPartDescriptor {
+
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ATTR_PATH = "path"; //$NON-NLS-1$
+
+ private final IConfigurationElement element;
+
+ public TaskEditorExtensionPartDescriptor(String id, IConfigurationElement element) {
+ super(id);
+ this.element = element;
+ setPath(element.getAttribute(ATTR_PATH));
+
+ }
+
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ try {
+ return (AbstractTaskEditorPart) element.createExecutableExtension(ATTR_CLASS);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionReader.java
new file mode 100644
index 0000000..5ad55a7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionReader.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+
+/**
+ * @author David Green
+ */
+public class TaskEditorExtensionReader {
+
+ private static final String CONNECTOR_KIND = "connectorKind"; //$NON-NLS-1$
+
+ public static final String ATTR_ID = "id"; //$NON-NLS-1$
+
+ public static final String ATTR_NAME = "name"; //$NON-NLS-1$
+
+ public static final String EXTENSION_TASK_EDITOR_EXTENSIONS = "org.eclipse.mylyn.tasks.ui.taskEditorExtensions"; //$NON-NLS-1$
+
+ private static final String REPOSITORY_ASSOCIATION = "repositoryAssociation"; //$NON-NLS-1$
+
+ private static final String TASK_EDITOR_EXTENSION = "taskEditorExtension"; //$NON-NLS-1$
+
+ public static void initExtensions() {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ IExtensionPoint editorExtensionPoint = registry.getExtensionPoint(EXTENSION_TASK_EDITOR_EXTENSIONS);
+ IExtension[] editorExtensions = editorExtensionPoint.getExtensions();
+ for (IExtension extension : editorExtensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(TASK_EDITOR_EXTENSION)) {
+ readEditorExtension(element);
+ } else if (element.getName().equals(REPOSITORY_ASSOCIATION)) {
+ readEditorExtensionAssociation(element);
+ }
+ }
+ }
+ }
+
+ private static void readEditorExtension(IConfigurationElement element) {
+ try {
+ String id = element.getAttribute(ATTR_ID);
+ String name = element.getAttribute(ATTR_NAME);
+ AbstractTaskEditorExtension extension = (AbstractTaskEditorExtension) element.createExecutableExtension("class"); //$NON-NLS-1$
+ TaskEditorExtensions.addTaskEditorExtension(element.getNamespaceIdentifier(), id, name, extension);
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load taskEditorExtension", //$NON-NLS-1$
+ e));
+ }
+ }
+
+ private static void readEditorExtensionAssociation(IConfigurationElement element) {
+ try {
+ String repository = element.getAttribute(CONNECTOR_KIND);
+ String taskEditorExtension = element.getAttribute(TASK_EDITOR_EXTENSION);
+ TaskEditorExtensions.addRepositoryAssociation(repository, taskEditorExtension);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load repositoryAssociation", e)); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionSettingsContribution.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionSettingsContribution.java
new file mode 100644
index 0000000..3bbe284
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensionSettingsContribution.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.SortedSet;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions.RegisteredTaskEditorExtension;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractTaskRepositoryPageContribution;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * A contribution that adds a section for 'Editor' on the task repository settings page.
+ *
+ * @author David Green
+ */
+public class TaskEditorExtensionSettingsContribution extends AbstractTaskRepositoryPageContribution {
+
+ private static final String LABEL_NONE = Messages.TaskEditorExtensionSettingsContribution_Plain_Text;
+
+ private static final String LABEL_DEFAULT_SUFFIX = Messages.TaskEditorExtensionSettingsContribution__default_;
+
+ private static final String DATA_EDITOR_EXTENSION = "editorExtension"; //$NON-NLS-1$
+
+ private final SelectionListener listener = new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectedExtensionId = (String) ((Widget) e.getSource()).getData(DATA_EDITOR_EXTENSION);
+ fireValidationRequired();
+ }
+ };
+
+ private String selectedExtensionId;
+
+ public TaskEditorExtensionSettingsContribution() {
+ super(Messages.TaskEditorExtensionSettingsContribution_Editor,
+ Messages.TaskEditorExtensionSettingsContribution_Select_the_capabilities_of_the_task_editor);
+ }
+
+ @Override
+ public void applyTo(TaskRepository repository) {
+ TaskEditorExtensions.setTaskEditorExtensionId(repository, selectedExtensionId == null ? "none" //$NON-NLS-1$
+ : selectedExtensionId);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return true;
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return true;
+ }
+
+ @Override
+ public Control createControl(Composite parentControl) {
+ Composite parent = new Composite(parentControl, SWT.NONE);
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginWidth = 0;
+ parent.setLayout(layout);
+
+ String defaultExtensionId = TaskEditorExtensions.getDefaultTaskEditorExtensionId(getConnectorKind());
+ selectedExtensionId = getRepository() == null ? defaultExtensionId
+ : TaskEditorExtensions.getTaskEditorExtensionId(getRepository());
+
+ // configure a 'Plain Text' (none) button
+ Button noneButton = new Button(parent, SWT.RADIO);
+ String noneTitle = LABEL_NONE;
+ boolean isDefault = defaultExtensionId == null || defaultExtensionId.length() == 0;
+ if (isDefault) {
+ noneTitle += LABEL_DEFAULT_SUFFIX;
+ }
+ noneButton.setText(noneTitle);
+ noneButton.addSelectionListener(listener);
+
+ boolean foundSelection = false;
+
+ // now add selection buttons for all registered extensions
+ SortedSet<RegisteredTaskEditorExtension> allEditorExtensions = TaskEditorExtensions.getTaskEditorExtensions();
+ for (RegisteredTaskEditorExtension editorExtension : allEditorExtensions) {
+ if (WorkbenchUtil.allowUseOf(editorExtension)) {
+ String name = editorExtension.getName();
+ isDefault = editorExtension.getId().equals(defaultExtensionId);
+ if (isDefault) {
+ name += LABEL_DEFAULT_SUFFIX;
+ }
+ Button button = new Button(parent, SWT.RADIO);
+ button.setText(name);
+
+ if (editorExtension.getId().equals(selectedExtensionId)) {
+ foundSelection = true;
+ button.setSelection(true);
+ }
+ button.setText(name);
+ button.setData(DATA_EDITOR_EXTENSION, editorExtension.getId());
+ button.addSelectionListener(listener);
+ }
+ }
+ if (!foundSelection) {
+ noneButton.setSelection(true);
+ }
+ return parent;
+ }
+
+ @Override
+ public IStatus validate() {
+ // nothing to validate
+ return null;
+ }
+
+ /**
+ * only enabled when there are installed/registered task editor extensions.
+ */
+ @Override
+ public boolean isEnabled() {
+ return !TaskEditorExtensions.getTaskEditorExtensions().isEmpty();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensions.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensions.java
new file mode 100644
index 0000000..4656de0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorExtensions.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IPluginContribution;
+
+/**
+ * @author David Green
+ */
+public class TaskEditorExtensions {
+
+ public static final String REPOSITORY_PROPERTY_EDITOR_EXTENSION = "editorExtension"; //$NON-NLS-1$
+
+ private static Map<String, RegisteredTaskEditorExtension> extensionsById = new HashMap<String, RegisteredTaskEditorExtension>();
+
+ private static Map<String, String> associationByConnectorKind = new HashMap<String, String>();
+
+ private static boolean initialized;
+
+ public static SortedSet<RegisteredTaskEditorExtension> getTaskEditorExtensions() {
+ init();
+ return new TreeSet<RegisteredTaskEditorExtension>(extensionsById.values());
+ }
+
+ /**
+ * Contributes an extension to the {@link TaskEditor}.
+ *
+ * @param pluginId
+ * the id of the contributing plug-in, may be <code>null</code>
+ * @param id
+ * the id of the extension, may not be <code>null</code>
+ * @param name
+ * the name of the extension that is displayed in the settings page
+ * @param extension
+ * the extension implementation
+ */
+ public static void addTaskEditorExtension(String pluginId, String id, String name,
+ AbstractTaskEditorExtension extension) {
+ Assert.isNotNull(id);
+ RegisteredTaskEditorExtension descriptor = new RegisteredTaskEditorExtension(extension, id, name);
+ descriptor.setPluginId(pluginId);
+ RegisteredTaskEditorExtension previous = extensionsById.put(id, descriptor);
+ if (previous != null) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Duplicate taskEditorExtension id=" //$NON-NLS-1$
+ + id, null));
+ }
+ }
+
+ public static void addRepositoryAssociation(String connectorKind, String extensionId) {
+ if (connectorKind == null || extensionId == null) {
+ throw new IllegalArgumentException();
+ }
+ String previous = associationByConnectorKind.put(connectorKind, extensionId);
+ if (previous != null) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, String.format(
+ "Duplicate association for repository %s: %s replaces %s", connectorKind, extensionId, previous), //$NON-NLS-1$
+ null));
+ }
+ }
+
+ /**
+ * get a task editor extension for a specific repository
+ *
+ * @param taskRepository
+ * @return the extension, or null if there is none
+ *
+ * @see #getDefaultTaskEditorExtension(TaskRepository)
+ */
+ public static AbstractTaskEditorExtension getTaskEditorExtension(TaskRepository taskRepository) {
+ init();
+ String extensionId = getTaskEditorExtensionId(taskRepository);
+ if (extensionId != null) {
+ RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
+ return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
+ }
+ return null;
+ }
+
+ public static String getTaskEditorExtensionId(TaskRepository taskRepository) {
+ init();
+ String id = taskRepository.getProperty(REPOSITORY_PROPERTY_EDITOR_EXTENSION);
+ if (id == null) {
+ id = getDefaultTaskEditorExtensionId(taskRepository);
+ }
+ return id;
+ }
+
+ public static void setTaskEditorExtensionId(TaskRepository repository, String editorExtensionId) {
+ repository.setProperty(REPOSITORY_PROPERTY_EDITOR_EXTENSION, editorExtensionId);
+ }
+
+ /**
+ * Get the default task editor extension id for the given task repository
+ *
+ * @param taskRepository
+ * @return the default task editor extension id or null if there is no default
+ */
+ public static String getDefaultTaskEditorExtensionId(TaskRepository taskRepository) {
+ return getDefaultTaskEditorExtensionId(taskRepository.getConnectorKind());
+ }
+
+ /**
+ * Get the default task editor extension id for the given kind of connector
+ *
+ * @param connectorKind
+ * the kind of connector
+ *
+ * @return the default task editor extension id or null if there is no default
+ */
+ public static String getDefaultTaskEditorExtensionId(String connectorKind) {
+ init();
+ return associationByConnectorKind.get(connectorKind);
+ }
+
+ /**
+ * get a default task editor extension for a specific repository
+ *
+ * @param taskRepository
+ * @return the extension, or null if there is none
+ *
+ * @see #getTaskEditorExtension(TaskRepository)
+ */
+ public static AbstractTaskEditorExtension getDefaultTaskEditorExtension(TaskRepository taskRepository) {
+ init();
+ String extensionId = getDefaultTaskEditorExtensionId(taskRepository);
+ if (extensionId != null) {
+ RegisteredTaskEditorExtension taskEditorExtension = extensionsById.get(extensionId);
+ return taskEditorExtension == null ? null : taskEditorExtension.getExtension();
+ }
+ return null;
+ }
+
+ private static void init() {
+ if (!initialized) {
+ initialized = true;
+ TaskEditorExtensionReader.initExtensions();
+ }
+ }
+
+ public static class RegisteredTaskEditorExtension implements Comparable<RegisteredTaskEditorExtension>,
+ IPluginContribution {
+
+ private final String id;
+
+ private final String name;
+
+ private final AbstractTaskEditorExtension extension;
+
+ private String pluginId;
+
+ private RegisteredTaskEditorExtension(AbstractTaskEditorExtension extension, String id, String name) {
+ this.extension = extension;
+ this.id = id;
+ this.name = name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public AbstractTaskEditorExtension getExtension() {
+ return extension;
+ }
+
+ public int compareTo(RegisteredTaskEditorExtension o) {
+ if (o == this) {
+ return 0;
+ }
+ int i = name.compareTo(o.name);
+ if (i == 0) {
+ i = id.compareTo(o.id);
+ }
+ return i;
+ }
+
+ public String getLocalId() {
+ return id;
+ }
+
+ public String getPluginId() {
+ return pluginId;
+ }
+
+ public void setPluginId(String pluginId) {
+ this.pluginId = pluginId;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorInputFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorInputFactory.java
new file mode 100644
index 0000000..4d44e4b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorInputFactory.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskEditorInputFactory implements IElementFactory {
+
+ public static final String TAG_TASK_HANDLE = "taskHandle"; //$NON-NLS-1$
+
+ public static final String ID_FACTORY = "org.eclipse.mylyn.tasks.ui.elementFactories.task.editor"; //$NON-NLS-1$
+
+ public IAdaptable createElement(IMemento memento) {
+ String handle = memento.getString(TAG_TASK_HANDLE);
+ AbstractTask task = TasksUiPlugin.getTaskList().getTask(handle);
+ if (task != null) {
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ if (taskRepository != null) {
+ return new TaskEditorInput(taskRepository, task);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN, "Repository for connector kind " //$NON-NLS-1$
+ + task.getConnectorKind() + " with url " + task.getRepositoryUrl() + " cannont be found.")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Failed to restore task editor: Task with handle \"" + handle //$NON-NLS-1$
+ + "\" could not be found in task list.")); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ public static void saveState(IMemento memento, TaskEditorInput input) {
+ if (input.getTask() != null) {
+ memento.putString(TAG_TASK_HANDLE, input.getTask().getHandleIdentifier());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNewCommentPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNewCommentPart.java
new file mode 100644
index 0000000..0def5c5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNewCommentPart.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorNewCommentPart extends TaskEditorRichTextPart {
+
+ public TaskEditorNewCommentPart() {
+ setPartName(Messages.TaskEditorNewCommentPart_New_Comment);
+ setSectionStyle(ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
+ setExpandVertically(true);
+ }
+
+ @Override
+ public void initialize(AbstractTaskEditorPage taskEditorPage) {
+ super.initialize(taskEditorPage);
+ setAttribute(getModel().getTaskData().getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java
new file mode 100644
index 0000000..b36c573
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorNotesPart.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.internal.EditorAreaHelper;
+import org.eclipse.ui.internal.WorkbenchPage;
+
+/**
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+ at Deprecated
+public class TaskEditorNotesPart extends AbstractTaskEditorPart {
+
+ private String value;
+
+ private AbstractTask task;
+
+ private SourceViewer noteEditor;
+
+ public TaskEditorNotesPart() {
+ setPartName(Messages.TaskPlanningEditor_Notes);
+ }
+
+ @Override
+ public void initialize(AbstractTaskEditorPage taskEditorPage) {
+ super.initialize(taskEditorPage);
+ task = (AbstractTask) taskEditorPage.getTask();
+ }
+
+ private boolean notesEqual() {
+ if (task.getNotes() == null && value == null) {
+ return true;
+ }
+
+ if (task.getNotes() != null && value != null) {
+ return task.getNotes().equals(value);
+ }
+ return false;
+ }
+
+ @Override
+ public void commit(boolean onSave) {
+ Assert.isNotNull(task);
+
+ if (!notesEqual()) {
+ task.setNotes(value);
+ // XXX REFRESH THE TASLKIST
+ }
+
+ super.commit(onSave);
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ this.value = task.getNotes();
+ if (this.value == null) {
+ this.value = ""; //$NON-NLS-1$
+ }
+
+ Section section = createSection(parent, toolkit, this.value != null && this.value.length() > 0);
+
+ Composite composite = toolkit.createComposite(section);
+ composite.setLayout(EditorUtil.createSectionClientLayout());
+
+ noteEditor = new SourceViewer(composite, null, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ noteEditor.configure(new RepositoryTextViewerConfiguration(getModel().getTaskRepository(), true));
+ CommonTextSupport textSupport = (CommonTextSupport) getTaskEditorPage().getAdapter(CommonTextSupport.class);
+ if (textSupport != null) {
+ textSupport.configure(noteEditor, new Document(this.value), true);
+ }
+ noteEditor.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ TaskEditorNotesPart.this.value = noteEditor.getTextWidget().getText();
+ markDirty();
+ }
+ });
+
+ final GridData gd = new GridData(GridData.FILL_BOTH);
+ int widthHint = 0;
+
+ if (getManagedForm() != null && getManagedForm().getForm() != null) {
+ widthHint = getManagedForm().getForm().getClientArea().width - 90;
+ }
+ if (widthHint <= 0 && getTaskEditorPage().getEditor().getEditorSite() != null
+ && getTaskEditorPage().getEditor().getEditorSite().getPage() != null) {
+ EditorAreaHelper editorManager = ((WorkbenchPage) getTaskEditorPage().getEditor().getEditorSite().getPage()).getEditorPresentation();
+ if (editorManager != null && editorManager.getLayoutPart() != null) {
+ widthHint = editorManager.getLayoutPart().getControl().getBounds().width - 90;
+ }
+ }
+
+ if (widthHint <= 0) {
+ widthHint = 100;
+ }
+
+ gd.widthHint = widthHint;
+ gd.minimumHeight = 100;
+ gd.grabExcessHorizontalSpace = true;
+
+ noteEditor.getControl().setLayoutData(gd);
+ noteEditor.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ noteEditor.setEditable(true);
+
+ toolkit.paintBordersFor(composite);
+ section.setClient(composite);
+ setSection(toolkit, section);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorOutlineNode.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorOutlineNode.java
new file mode 100644
index 0000000..a3ada95
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorOutlineNode.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * A node for the tree in {@link TaskEditorOutlinePage}.
+ *
+ * @author Steffen Pingel
+ */
+public class TaskEditorOutlineNode {
+
+ public static final String LABEL_COMMENTS = Messages.TaskEditorOutlineNode_Comments;
+
+ public static final String LABEL_DESCRIPTION = Messages.TaskEditorOutlineNode_Description;
+
+ public static final String LABEL_NEW_COMMENT = Messages.TaskEditorOutlineNode_New_Comment;
+
+ private static TaskEditorOutlineNode createNode(TaskData taskData, String attributeId, String label) {
+ TaskAttribute taskAttribute = taskData.getRoot().getMappedAttribute(attributeId);
+ if (taskAttribute != null) {
+ if (label == null) {
+ label = taskAttribute.getValue();
+ }
+ return new TaskEditorOutlineNode(label, taskAttribute);
+ }
+ return null;
+ }
+
+ private static TaskEditorOutlineNode createNode(TaskAttribute taskAttribute) {
+ String type = taskAttribute.getMetaData().getType();
+ if (TaskAttribute.TYPE_COMMENT.equals(type)) {
+ ITaskComment taskComment = TasksUiPlugin.getRepositoryModel().createTaskComment(taskAttribute);
+ if (taskComment != null) {
+ taskAttribute.getTaskData().getAttributeMapper().updateTaskComment(taskComment, taskAttribute);
+ StringBuilder sb = new StringBuilder();
+ sb.append(taskComment.getNumber());
+ sb.append(": "); //$NON-NLS-1$
+ IRepositoryPerson author = taskComment.getAuthor();
+ if (author != null) {
+ sb.append(author.toString());
+ }
+ Date creationDate = taskComment.getCreationDate();
+ if (creationDate != null) {
+ sb.append(" ("); //$NON-NLS-1$
+ sb.append(EditorUtil.formatDateTime(creationDate));
+ sb.append(")"); //$NON-NLS-1$
+ }
+ TaskEditorOutlineNode node = new TaskEditorOutlineNode(sb.toString(), taskAttribute);
+ node.setTaskComment(taskComment);
+ return node;
+ }
+ } else {
+ String label = taskAttribute.getTaskData().getAttributeMapper().getValueLabel(taskAttribute);
+ return new TaskEditorOutlineNode(label, taskAttribute);
+ }
+ return null;
+ }
+
+ public static TaskEditorOutlineNode parse(TaskData taskData) {
+ TaskEditorOutlineNode rootNode = createNode(taskData, TaskAttribute.SUMMARY, null);
+ if (rootNode == null) {
+ rootNode = new TaskEditorOutlineNode(Messages.TaskEditorOutlineNode_Task_ + taskData.getTaskId());
+ }
+ addNode(rootNode, taskData, TaskAttribute.DESCRIPTION, LABEL_DESCRIPTION);
+ List<TaskAttribute> comments = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_COMMENT);
+ if (comments.size() > 0) {
+ TaskEditorOutlineNode commentsNode = new TaskEditorOutlineNode(LABEL_COMMENTS);
+ rootNode.addChild(commentsNode);
+ for (TaskAttribute commentAttribute : comments) {
+ TaskEditorOutlineNode node = createNode(commentAttribute);
+ if (node != null) {
+ commentsNode.addChild(node);
+ }
+ }
+ }
+ addNode(rootNode, taskData, TaskAttribute.COMMENT_NEW, LABEL_NEW_COMMENT);
+ return rootNode;
+ }
+
+ private static TaskEditorOutlineNode addNode(TaskEditorOutlineNode parentNode, TaskData taskData,
+ String attributeId, String label) {
+ TaskEditorOutlineNode node = createNode(taskData, attributeId, label);
+ if (node != null) {
+ parentNode.addChild(node);
+ }
+ return node;
+ }
+
+ private List<TaskEditorOutlineNode> children;
+
+ private final String label;
+
+ /** The parent of this node or null if it is the bug report */
+ private TaskEditorOutlineNode parent;
+
+ private final TaskAttribute taskAttribute;
+
+ private ITaskComment taskComment;
+
+ public TaskEditorOutlineNode(String label) {
+ this(label, null);
+ }
+
+ public TaskEditorOutlineNode(String label, TaskAttribute taskAttribute) {
+ this.label = label;
+ this.taskAttribute = taskAttribute;
+ }
+
+ public void addChild(TaskEditorOutlineNode node) {
+ Assert.isNotNull(node);
+ if (children == null) {
+ children = new ArrayList<TaskEditorOutlineNode>();
+ }
+ node.parent = this;
+ children.add(node);
+ }
+
+ /**
+ * @return <code>true</code> if the given object is another node representing the same piece of data in the editor.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof TaskEditorOutlineNode) {
+ TaskEditorOutlineNode node = (TaskEditorOutlineNode) o;
+ return getLabel().equals(node.getLabel());
+ }
+ return false;
+ }
+
+ public TaskEditorOutlineNode[] getChildren() {
+ return (children == null) ? new TaskEditorOutlineNode[0]
+ : children.toArray(new TaskEditorOutlineNode[children.size()]);
+ }
+
+ public ITaskComment getTaskComment() {
+ return taskComment;
+ }
+
+ public void setTaskComment(ITaskComment taskComment) {
+ this.taskComment = taskComment;
+ }
+
+ public TaskAttribute getData() {
+ return taskAttribute;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public TaskEditorOutlineNode getParent() {
+ return parent;
+ }
+
+ @Override
+ public int hashCode() {
+ return getLabel().hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return getLabel();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorOutlinePage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorOutlinePage.java
new file mode 100644
index 0000000..52a3046
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorOutlinePage.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+/**
+ * An outline page for a {@link TaskEditor}.
+ *
+ * @author Steffen Pingel
+ */
+public class TaskEditorOutlinePage extends ContentOutlinePage {
+
+ private static class TaskEditorOutlineContentProvider implements ITreeContentProvider {
+
+ public void dispose() {
+ // ignore
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof TaskEditorOutlineNode) {
+ Object[] children = ((TaskEditorOutlineNode) parentElement).getChildren();
+ return children;
+ }
+ return new Object[0];
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof TaskEditorOutlineModel) {
+ return new Object[] { ((TaskEditorOutlineModel) inputElement).getRoot() };
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ if (element instanceof TaskEditorOutlineNode) {
+ return ((TaskEditorOutlineNode) element).getParent();
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof TaskEditorOutlineNode) {
+ return ((TaskEditorOutlineNode) element).getChildren().length > 0;
+ }
+ return false;
+ }
+
+ public void inputChanged(Viewer viewerChanged, Object oldInput, Object newInput) {
+ // ignore
+ }
+
+ }
+
+ private static class TaskEditorOutlineModel {
+
+ private final TaskEditorOutlineNode root;
+
+ public TaskEditorOutlineModel(TaskEditorOutlineNode root) {
+ this.root = root;
+ }
+
+ public TaskEditorOutlineNode getRoot() {
+ return root;
+ }
+
+ }
+
+ private TaskEditorOutlineModel model;
+
+ private TaskRepository taskRepository;
+
+ private TreeViewer viewer;
+
+ public TaskEditorOutlinePage() {
+ }
+
+ public void setInput(TaskRepository taskRepository, TaskEditorOutlineNode rootNode) {
+ this.taskRepository = taskRepository;
+ if (rootNode != null) {
+ this.model = new TaskEditorOutlineModel(rootNode);
+ } else {
+ this.model = null;
+ }
+ if (viewer != null) {
+ viewer.setInput(this.model);
+ viewer.refresh(true);
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ viewer = getTreeViewer();
+ viewer.setContentProvider(new TaskEditorOutlineContentProvider());
+ viewer.setLabelProvider(new LabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof TaskEditorOutlineNode) {
+ TaskEditorOutlineNode node = (TaskEditorOutlineNode) element;
+ if (TaskEditorOutlineNode.LABEL_COMMENTS.equals(node.getLabel())
+ || TaskEditorOutlineNode.LABEL_NEW_COMMENT.equals(node.getLabel())) {
+ return CommonImages.getImage(TasksUiImages.COMMENT);
+ }
+ if (TaskEditorOutlineNode.LABEL_DESCRIPTION.equals(node.getLabel())) {
+ return CommonImages.getImage(TasksUiImages.TASK_NOTES);
+ } else if (node.getTaskComment() != null) {
+ IRepositoryPerson author = node.getTaskComment().getAuthor();
+ if (taskRepository != null && author != null
+ && author.getPersonId().equals(taskRepository.getUserName())) {
+ return CommonImages.getImage(CommonImages.PERSON_ME);
+ } else {
+ return CommonImages.getImage(CommonImages.PERSON);
+ }
+ } else {
+ return CommonImages.getImage(TasksUiImages.TASK);
+ }
+ } else {
+ return super.getImage(element);
+ }
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof TaskEditorOutlineNode) {
+ TaskEditorOutlineNode node = (TaskEditorOutlineNode) element;
+ return node.getLabel();
+ }
+ return super.getText(element);
+ }
+ });
+ viewer.setInput(model);
+ viewer.expandAll();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPeoplePart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPeoplePart.java
new file mode 100644
index 0000000..6fa4fbf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPeoplePart.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorPeoplePart extends AbstractTaskEditorPart {
+
+ private static final int COLUMN_MARGIN = 5;
+
+ public TaskEditorPeoplePart() {
+ setPartName(Messages.TaskEditorPeoplePart_People);
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute) {
+ AbstractAttributeEditor editor = createAttributeEditor(attribute);
+ if (editor != null) {
+ editor.createLabelControl(composite, toolkit);
+ GridDataFactory.defaultsFor(editor.getLabelControl()).indent(COLUMN_MARGIN, 0).applyTo(
+ editor.getLabelControl());
+ editor.createControl(composite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(editor.getControl());
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Section section = createSection(parent, toolkit, true);
+
+ Composite peopleComposite = toolkit.createComposite(section);
+ GridLayout layout = EditorUtil.createSectionClientLayout();
+ layout.numColumns = 2;
+ peopleComposite.setLayout(layout);
+
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_REPORTER));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.ADD_SELF_CC));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_CC));
+
+ toolkit.paintBordersFor(peopleComposite);
+ section.setClient(peopleComposite);
+ setSection(toolkit, section);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java
new file mode 100644
index 0000000..a45dbe0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorPlanningPart.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Shawn Minto
+ */
+public class TaskEditorPlanningPart extends AbstractTaskEditorPart {
+
+ private final PlanningPart part;
+
+ public TaskEditorPlanningPart() {
+ part = new PlanningPart(ExpandableComposite.TWISTIE);
+ }
+
+ @Override
+ public void initialize(AbstractTaskEditorPage taskEditorPage) {
+ super.initialize(taskEditorPage);
+ boolean needsDueDate = !taskEditorPage.getConnector().hasRepositoryDueDate(taskEditorPage.getTaskRepository(),
+ taskEditorPage.getTask(), getTaskData());
+ CommonTextSupport textSupport = (CommonTextSupport) getTaskEditorPage().getAdapter(CommonTextSupport.class);
+ // disable notes for new tasks to avoid confusion due to showing multiple input fields
+ part.initialize(taskEditorPage.getManagedForm(), taskEditorPage.getTaskRepository(),
+ (AbstractTask) taskEditorPage.getTask(), needsDueDate, taskEditorPage, textSupport);
+ part.setNeedsNotes(!getModel().getTaskData().isNew());
+ part.setAlwaysExpand(getModel().getTaskData().isNew());
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ part.createControl(parent, toolkit);
+ part.getSection().setToolTipText(Messages.TaskEditorPlanningPart_TaskEditorPlanningPart_tooltip);
+ setSection(toolkit, part.getSection());
+ }
+
+ @Override
+ public void commit(boolean onSave) {
+ super.commit(onSave);
+ part.commit(onSave);
+ }
+
+ @Override
+ public boolean isDirty() {
+ return super.isDirty() || part.isDirty();
+ }
+
+ @Override
+ public void dispose() {
+ part.dispose();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java
new file mode 100644
index 0000000..7d4f785
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorRichTextPart.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskEditorRichTextPart extends AbstractTaskEditorPart {
+
+ private RichTextAttributeEditor editor;
+
+ private TaskAttribute attribute;
+
+ private Composite composite;
+
+ private int sectionStyle;
+
+ private ToggleToMaximizePartAction toggleToMaximizePartAction;
+
+ private Action togglePreviewAction;
+
+ private Action toggleBrowserAction;
+
+ public TaskEditorRichTextPart() {
+ setSectionStyle(ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
+ }
+
+ public void appendText(String text) {
+ if (editor == null) {
+ return;
+ }
+
+ editor.showEditor();
+ if (togglePreviewAction != null) {
+ togglePreviewAction.setChecked(false);
+ }
+
+ StringBuilder strBuilder = new StringBuilder();
+ String oldText = editor.getViewer().getDocument().get();
+ if (strBuilder.length() != 0) {
+ strBuilder.append("\n"); //$NON-NLS-1$
+ }
+ strBuilder.append(oldText);
+ strBuilder.append(text);
+ editor.getViewer().getDocument().set(strBuilder.toString());
+ TaskAttribute attribute = getTaskData().getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ if (attribute != null) {
+ attribute.setValue(strBuilder.toString());
+ getTaskEditorPage().getModel().attributeChanged(attribute);
+ }
+ editor.getViewer().getTextWidget().setCaretOffset(strBuilder.length());
+ editor.getViewer().getTextWidget().showSelection();
+ }
+
+ public int getSectionStyle() {
+ return sectionStyle;
+ }
+
+ public void setSectionStyle(int sectionStyle) {
+ this.sectionStyle = sectionStyle;
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ if (attribute == null) {
+ return;
+ }
+ AbstractAttributeEditor attributEditor = createAttributeEditor(attribute);
+ if (!(attributEditor instanceof RichTextAttributeEditor)) {
+ String clazz;
+ if (attributEditor != null) {
+ clazz = attributEditor.getClass().getName();
+ } else {
+ clazz = "<null>"; //$NON-NLS-1$
+ }
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Expected an instance of RichTextAttributeEditor, got \"" + clazz + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
+ return;
+ }
+
+ Section section = createSection(parent, toolkit, sectionStyle);
+
+ composite = toolkit.createComposite(section);
+ composite.setLayout(EditorUtil.createSectionClientLayout());
+
+ editor = (RichTextAttributeEditor) attributEditor;
+
+ editor.createControl(composite, toolkit);
+ if (editor.isReadOnly()) {
+ composite.setLayout(new FillWidthLayout(EditorUtil.getLayoutAdvisor(getTaskEditorPage()), 0, 0, 0, 3));
+ } else {
+ StyledText textWidget = editor.getViewer().getTextWidget();
+ editor.getControl().setLayoutData(
+ EditorUtil.getTextControlLayoutData(getTaskEditorPage(), textWidget, getExpandVertically()));
+ editor.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ }
+
+ getEditor().getControl().setData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION, getMaximizePartAction());
+ if (getEditor().getControl() instanceof Composite) {
+ for (Control control : ((Composite) getEditor().getControl()).getChildren()) {
+ control.setData(EditorUtil.KEY_TOGGLE_TO_MAXIMIZE_ACTION, getMaximizePartAction());
+ }
+ }
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+
+ toolkit.paintBordersFor(composite);
+ section.setClient(composite);
+ setSection(toolkit, section);
+ }
+
+ public TaskAttribute getAttribute() {
+ return attribute;
+ }
+
+ protected Composite getComposite() {
+ return composite;
+ }
+
+ protected RichTextAttributeEditor getEditor() {
+ return editor;
+ }
+
+ public void setAttribute(TaskAttribute attribute) {
+ this.attribute = attribute;
+ }
+
+ @Override
+ public void setFocus() {
+ if (editor != null) {
+ editor.getControl().setFocus();
+ }
+ }
+
+ protected Action getMaximizePartAction() {
+ if (toggleToMaximizePartAction == null) {
+ toggleToMaximizePartAction = new ToggleToMaximizePartAction();
+ }
+ return toggleToMaximizePartAction;
+ }
+
+ private class ToggleToMaximizePartAction extends Action {
+
+ private static final String COMMAND_ID = "org.eclipse.mylyn.tasks.ui.command.maximizePart"; //$NON-NLS-1$
+
+ private/*static*/final String MAXIMIZE = Messages.TaskEditorRichTextPart_Maximize;
+
+ private static final int SECTION_HEADER_HEIGHT = 50;
+
+ private int originalHeight = -1;
+
+ public ToggleToMaximizePartAction() {
+ super("", SWT.TOGGLE); //$NON-NLS-1$
+ setImageDescriptor(CommonImages.PART_MAXIMIZE);
+ setToolTipText(MAXIMIZE);
+ setActionDefinitionId(COMMAND_ID);
+ setChecked(false);
+ }
+
+ @Override
+ public void run() {
+ if (!(getEditor().getControl().getLayoutData() instanceof GridData)) {
+ return;
+ }
+
+ GridData gd = (GridData) getEditor().getControl().getLayoutData();
+
+ if (originalHeight == -1) {
+ originalHeight = gd.heightHint;
+ }
+
+ try {
+ getTaskEditorPage().setReflow(false);
+
+ int heightHint;
+ if (isChecked()) {
+ heightHint = getManagedForm().getForm().getClientArea().height - SECTION_HEADER_HEIGHT;
+ } else {
+ heightHint = originalHeight;
+ }
+
+ // ignore when not necessary
+ if (gd.heightHint == heightHint) {
+ return;
+ }
+ gd.heightHint = heightHint;
+ gd.minimumHeight = heightHint;
+ } finally {
+ getTaskEditorPage().setReflow(true);
+ }
+
+ getTaskEditorPage().reflow();
+ CommonFormUtil.ensureVisible(getEditor().getControl());
+ }
+ }
+
+ @Override
+ protected void fillToolBar(ToolBarManager manager) {
+ if (getEditor().hasPreview()) {
+ togglePreviewAction = new Action("", SWT.TOGGLE) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ if (isChecked()) {
+ editor.showPreview();
+ } else {
+ editor.showEditor();
+ }
+
+ if (toggleBrowserAction != null) {
+ toggleBrowserAction.setChecked(false);
+ }
+ }
+ };
+ togglePreviewAction.setImageDescriptor(CommonImages.PREVIEW_WEB);
+ togglePreviewAction.setToolTipText(Messages.TaskEditorRichTextPart_Preview);
+ togglePreviewAction.setChecked(false);
+ manager.add(togglePreviewAction);
+ }
+ if (togglePreviewAction == null && getEditor().hasBrowser()) {
+ toggleBrowserAction = new Action("", SWT.TOGGLE) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ if (isChecked()) {
+ editor.showBrowser();
+ } else {
+ editor.showEditor();
+ }
+
+ if (togglePreviewAction != null) {
+ togglePreviewAction.setChecked(false);
+ }
+ }
+ };
+ toggleBrowserAction.setImageDescriptor(CommonImages.PREVIEW_WEB);
+ toggleBrowserAction.setToolTipText(Messages.TaskEditorRichTextPart_Browser_Preview);
+ toggleBrowserAction.setChecked(false);
+ manager.add(toggleBrowserAction);
+ }
+ if (!getEditor().isReadOnly()) {
+ manager.add(getMaximizePartAction());
+ }
+ super.fillToolBar(manager);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorSummaryPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorSummaryPart.java
new file mode 100644
index 0000000..d862b9e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskEditorSummaryPart.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Raphael Ackermann - initial API and implementation, bug 195514
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Raphael Ackermann
+ * @author Steffen Pingel
+ */
+public class TaskEditorSummaryPart extends AbstractTaskEditorPart {
+
+ private AbstractAttributeEditor summaryEditor;
+
+ public TaskEditorSummaryPart() {
+ setPartName(Messages.TaskEditorSummaryPart_Summary);
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute) {
+ addAttribute(composite, toolkit, attribute, EditorUtil.HEADER_COLUMN_MARGIN);
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute, int indent) {
+ addAttribute(composite, toolkit, attribute, indent, true);
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute, int indent,
+ boolean showLabel) {
+ AbstractAttributeEditor editor = createAttributeEditor(attribute);
+ if (editor != null) {
+ // having editable controls in the header looks odd
+ editor.setReadOnly(true);
+ editor.setDecorationEnabled(false);
+
+ boolean isPriority = isAttribute(attribute, TaskAttribute.PRIORITY);
+
+ if (showLabel && !isPriority) {
+ editor.createLabelControl(composite, toolkit);
+ GridDataFactory.defaultsFor(editor.getLabelControl()).indent(indent, 0).applyTo(
+ editor.getLabelControl());
+ }
+
+ if (isPriority) {
+ ITaskMapping mapping = getTaskEditorPage().getConnector().getTaskMapping(getTaskData());
+ if (mapping != null) {
+ PriorityLevel priorityLevel = mapping.getPriorityLevel();
+ if (priorityLevel != null) {
+ Image image = CommonImages.getImage(TasksUiInternal.getPriorityImage(getTaskEditorPage().getTask()));
+ if (image != null) {
+ Label label = toolkit.createLabel(composite, null);
+ label.setImage(image);
+ GridDataFactory.defaultsFor(label).indent(5, -3).applyTo(label);
+ }
+ }
+ }
+ }
+
+ if (isAttribute(attribute, TaskAttribute.DATE_MODIFICATION) && editor instanceof DateAttributeEditor) {
+ ((DateAttributeEditor) editor).setShowTime(true);
+ }
+
+ editor.createControl(composite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ }
+ }
+
+ protected Control addAttributeWithIcon(Composite composite, FormToolkit toolkit, TaskAttribute attribute,
+ boolean forceReadOnly) {
+ if (attribute != null) {
+ //can't be added via a factory because these attributes already have a default editor?
+ AbstractAttributeEditor editor = new PriorityAttributeEditor(getModel(), attribute);
+ if (editor != null) {
+ editor.setDecorationEnabled(false);
+ if (forceReadOnly) {
+ editor.setReadOnly(true);
+ }
+ editor.createControl(composite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ }
+ return editor.getControl();
+ } else {
+ //some connectors don't have priorities. in this case we just show the defalut icon.
+ //this can't be handled within the attribute editor, as it asserts that the attribute cannot be null
+ Label imageOnly = toolkit.createLabel(composite, ""); //$NON-NLS-1$
+ imageOnly.setImage(CommonImages.getImage(CommonImages.PRIORITY_3_LARGE));
+ return imageOnly;
+ }
+ }
+
+ private boolean isAttribute(TaskAttribute attribute, String id) {
+ return attribute.getId().equals(
+ attribute.getTaskData().getAttributeMapper().mapToRepositoryKey(attribute.getParentAttribute(), id));
+ }
+
+ private void addSummaryText(Composite composite, final FormToolkit toolkit) {
+ summaryEditor = createAttributeEditor(getTaskData().getRoot().getMappedAttribute(TaskAttribute.SUMMARY));
+ if (summaryEditor != null) {
+ // create composite to hold rounded border
+ if (summaryEditor instanceof RichTextAttributeEditor) {
+ Composite roundedBorder = EditorUtil.createBorder(composite, toolkit);
+ summaryEditor.createControl(roundedBorder, toolkit);
+ EditorUtil.setHeaderFontSizeAndStyle(summaryEditor.getControl());
+ } else {
+ summaryEditor.createControl(composite, toolkit);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(EditorUtil.MAXIMUM_WIDTH,
+ SWT.DEFAULT).grab(true, false).applyTo(summaryEditor.getControl());
+ }
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(summaryEditor);
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Composite composite = toolkit.createComposite(parent);
+ GridLayout layout = EditorUtil.createSectionClientLayout();
+ layout.numColumns = 2;
+ layout.marginHeight = 0;
+ layout.marginTop = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = 3;
+ composite.setLayout(layout);
+
+ // add priority as an icon
+ TaskAttribute priorityAttribute = getTaskData().getRoot().getMappedAttribute(TaskAttribute.PRIORITY);
+ final Control priorityEditor = addAttributeWithIcon(composite, toolkit, priorityAttribute, false);
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).span(1, 2).applyTo(priorityEditor);
+ // forward focus to the summary editor
+ priorityEditor.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ if (summaryEditor != null && summaryEditor.getControl() != null) {
+ summaryEditor.getControl().setFocus();
+ //only forward it on first view
+ priorityEditor.removeFocusListener(this);
+ }
+ }
+ });
+
+ addSummaryText(composite, toolkit);
+
+ if (needsHeader()) {
+ createHeaderLayout(composite, toolkit);
+ }
+
+ toolkit.paintBordersFor(composite);
+
+ setControl(composite);
+ }
+
+ protected Composite createHeaderLayout(Composite composite, FormToolkit toolkit) {
+ Composite headerComposite = toolkit.createComposite(composite);
+ GridLayout layout = new GridLayout(1, false);
+ layout.verticalSpacing = 1;
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ headerComposite.setLayout(layout);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(headerComposite);
+
+// ITaskMapping mapping = getTaskEditorPage().getConnector().getTaskMapping(getTaskData());
+// if (mapping != null) {
+// toolkit.createLabel(headerComposite, mapping.getStatus());
+// String resolution = mapping.getResolution();
+// if (resolution != null && resolution.length() > 0) {
+// toolkit.createLabel(headerComposite, "(" + resolution + ")");
+// }
+// String priority = mapping.getPriority();
+// if (priority != null) {
+// Label label = toolkit.createLabel(headerComposite, "Priority:");
+// label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+// PriorityLevel priorityLevel = mapping.getPriorityLevel();
+// if (priorityLevel != null) {
+// Image image = TasksUiImages.getImageForPriority(priorityLevel);
+// if (image != null) {
+// label = toolkit.createLabel(headerComposite, null);
+// label.setImage(image);
+// }
+// }
+// toolkit.createLabel(headerComposite, priority);
+// }
+// }
+ TaskAttribute statusAtribute = getTaskData().getRoot().getMappedAttribute(TaskAttribute.STATUS);
+ addAttribute(headerComposite, toolkit, statusAtribute, 0);
+
+ ITaskMapping mapping = getTaskEditorPage().getConnector().getTaskMapping(getTaskData());
+ if (mapping != null && mapping.getResolution() != null && mapping.getResolution().length() > 0) {
+ TaskAttribute resolutionAtribute = getTaskData().getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ addAttribute(headerComposite, toolkit, resolutionAtribute, 0, false);
+ }
+
+// TaskAttribute keyAttribute = getTaskData().getRoot().getMappedAttribute(TaskAttribute.TASK_KEY);
+// addAttribute(headerComposite, toolkit, keyAttribute);
+
+ // right align controls
+// Composite spacer = toolkit.createComposite(headerComposite, SWT.NONE);
+// GridDataFactory.fillDefaults().hint(0, 10).grab(true, false).applyTo(spacer);
+
+ TaskAttribute dateCreation = getTaskData().getRoot().getMappedAttribute(TaskAttribute.DATE_CREATION);
+ addAttribute(headerComposite, toolkit, dateCreation);
+
+ TaskAttribute dateModified = getTaskData().getRoot().getMappedAttribute(TaskAttribute.DATE_MODIFICATION);
+ addAttribute(headerComposite, toolkit, dateModified);
+
+ // ensure layout does not wrap
+ layout.numColumns = headerComposite.getChildren().length;
+
+ // ensure that the composite does not show a bunch of blank space
+ if (layout.numColumns == 0) {
+ layout.numColumns = 1;
+ toolkit.createLabel(headerComposite, " "); //$NON-NLS-1$
+ }
+ return headerComposite;
+ }
+
+ public boolean needsHeader() {
+ return !getTaskData().isNew();
+ }
+
+ @Override
+ public void setFocus() {
+ if (summaryEditor != null) {
+ summaryEditor.getControl().setFocus();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java
new file mode 100644
index 0000000..d3d7cfd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkDetector.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+
+/**
+ * Delegates to {@link AbstractRepositoryConnectorUi} for detecting hyperlinks.
+ *
+ * @author Steffen Pingel
+ */
+public class TaskHyperlinkDetector extends AbstractTaskHyperlinkDetector {
+
+ @Override
+ protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, final String content, final int index,
+ final int contentOffset) {
+ List<IHyperlink> result = null;
+ for (final TaskRepository repository : getTaskRepositories(textViewer)) {
+ final AbstractRepositoryConnectorUi connectorUi = getConnectorUi(repository);
+ if (connectorUi == null) {
+ continue;
+ }
+ final IHyperlink[][] links = new IHyperlink[1][];
+ SafeRunnable.run(new ISafeRunnable() {
+
+ public void handleException(Throwable exception) {
+ }
+
+ public void run() throws Exception {
+ links[0] = connectorUi.findHyperlinks(repository, content, index, contentOffset);
+ }
+
+ });
+ if (links[0] != null && links[0].length > 0) {
+ if (result == null) {
+ result = new ArrayList<IHyperlink>();
+ }
+ result.addAll(Arrays.asList(links[0]));
+ }
+ }
+ return result;
+ }
+
+ protected AbstractRepositoryConnectorUi getConnectorUi(TaskRepository repository) {
+ return TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkTextPresentationManager.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkTextPresentationManager.java
new file mode 100644
index 0000000..55d7562
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskHyperlinkTextPresentationManager.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.swt.custom.StyleRange;
+
+/**
+ * A manager that decorates task hyperlinks with strike-through when the task is completed.
+ *
+ * @author David Green
+ */
+public class TaskHyperlinkTextPresentationManager extends AbstractHyperlinkTextPresentationManager {
+
+ private final TaskList taskList = TasksUiPlugin.getTaskList();
+
+ @Override
+ public boolean select(IHyperlink hyperlink) {
+ if (hyperlink instanceof TaskHyperlink) {
+ TaskHyperlink taskHyperlink = (TaskHyperlink) hyperlink;
+ String taskId = taskHyperlink.getTaskId();
+ String repositoryUrl = taskHyperlink.getRepository().getRepositoryUrl();
+
+ ITask task = taskList.getTask(repositoryUrl, taskId);
+ if (task == null) {
+ task = taskList.getTaskByKey(repositoryUrl, taskId);
+ }
+ return task != null && task.isCompleted();
+ }
+ return false;
+ }
+
+ @Override
+ protected void decorate(StyleRange styleRange) {
+ // currently only strike-through is used to indicate completed tasks
+ styleRange.strikeout = true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskListChangeAdapter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskListChangeAdapter.java
new file mode 100644
index 0000000..0cb4e91
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskListChangeAdapter.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+
+public class TaskListChangeAdapter implements ITaskListChangeListener {
+
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskMigrator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskMigrator.java
new file mode 100644
index 0000000..6cb9c9b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskMigrator.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Date;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.ui.ChangeActivityHandleOperation;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskMigrator {
+
+ private static boolean active;
+
+ private final ITask oldTask;
+
+ private boolean delete;
+
+ private boolean openEditors;
+
+ private TaskEditor editor;
+
+ public TaskMigrator(ITask oldTask) {
+ this.oldTask = oldTask;
+ this.openEditors = true;
+ }
+
+ public boolean openEditors() {
+ return openEditors;
+ }
+
+ public void setOpenEditors(boolean openEditors) {
+ this.openEditors = openEditors;
+ }
+
+ public boolean delete() {
+ return delete;
+ }
+
+ public void setDelete(boolean delete) {
+ this.delete = delete;
+ }
+
+ /**
+ * Migrates local properties of <code>oldTask</code> to <code>newTask</code>:
+ * <ul>
+ * <li>Copy properties
+ * <li>Delete old task
+ * <li>Reactivate new task
+ * <li>Open new task
+ * </ul>
+ *
+ * @param newTask
+ * the task to migrate properties to
+ */
+ public void execute(ITask newTask) {
+ copyProperties(newTask);
+
+ try {
+ // temporarily disable auto editor management
+ active = true;
+
+ boolean reactivate = oldTask.isActive();
+ if (reactivate) {
+ TasksUi.getTaskActivityManager().deactivateTask(oldTask);
+ }
+
+ boolean editorIsActive = closeEditor();
+
+ deleteOldTask();
+
+ if (reactivate) {
+ TasksUi.getTaskActivityManager().activateTask(newTask);
+ }
+
+ if (openEditors()) {
+ if (editorIsActive) {
+ TasksUiUtil.openTask(newTask);
+ } else {
+ TasksUiInternal.openTaskInBackground(newTask, false);
+ }
+ }
+ } finally {
+ active = false;
+ }
+ }
+
+ public void setEditor(TaskEditor editor) {
+ this.editor = editor;
+ }
+
+ public TaskEditor getEditor() {
+ return editor;
+ }
+
+ private boolean closeEditor() {
+ boolean editorIsActive = false;
+ if (editor != null) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage activePage = window.getActivePage();
+ if (activePage != null) {
+ if (activePage.getActiveEditor() == editor) {
+ editorIsActive = true;
+ }
+ }
+ }
+ editor.close(false);
+ }
+ return editorIsActive;
+ }
+
+ private void deleteOldTask() {
+ // delete old task details
+ if (delete()) {
+ TasksUiInternal.getTaskList().deleteTask(oldTask);
+ ContextCore.getContextManager().deleteContext(oldTask.getHandleIdentifier());
+ try {
+ TasksUiPlugin.getTaskDataManager().deleteTaskData(oldTask);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to delete task data", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void copyProperties(ITask newTask) {
+ // migrate task details
+ if (oldTask instanceof AbstractTask && newTask instanceof AbstractTask) {
+ ((AbstractTask) newTask).setNotes(((AbstractTask) oldTask).getNotes());
+ DateRange scheduledDate = ((AbstractTask) oldTask).getScheduledForDate();
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor((AbstractTask) newTask, scheduledDate);
+ Date dueDate = ((AbstractTask) oldTask).getDueDate();
+ TasksUiPlugin.getTaskActivityManager().setDueDate(newTask, dueDate);
+ ((AbstractTask) newTask).setEstimatedTimeHours(((AbstractTask) oldTask).getEstimatedTimeHours());
+ }
+
+ // migrate context
+ ContextCorePlugin.getContextStore().saveActiveContext();
+ ContextCore.getContextStore().cloneContext(oldTask.getHandleIdentifier(), newTask.getHandleIdentifier());
+
+ // migrate task activity
+ ChangeActivityHandleOperation operation = new ChangeActivityHandleOperation(oldTask.getHandleIdentifier(),
+ newTask.getHandleIdentifier());
+ try {
+ operation.run(new NullProgressMonitor());
+ } catch (InvocationTargetException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Failed to migrate activity to new task", e.getCause())); //$NON-NLS-1$
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+
+ public static boolean isActive() {
+ return active;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java
new file mode 100644
index 0000000..7ab7d4b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskPlanningEditor.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - initial prototype
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.ControlContribution;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskEditorAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.mylyn.tasks.ui.editors.TaskFormPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IWorkbenchPartConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Shawn Minto
+ * @author Steffen Pingel
+ */
+public class TaskPlanningEditor extends TaskFormPage {
+
+ private Composite editorComposite;
+
+ private TaskRepository repository;
+
+ private AbstractTask task;
+
+ private Button saveButton;
+
+ private final IPropertyListener dirtyStateListener = new IPropertyListener() {
+
+ public void propertyChanged(Object source, int propId) {
+ if (propId == IWorkbenchPartConstants.PROP_DIRTY && saveButton != null) {
+ saveButton.setEnabled(getEditor().isDirty());
+ }
+ }
+ };
+
+ private final ITaskListChangeListener taskListChangeListener = new TaskListChangeAdapter() {
+ @Override
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (taskContainerDelta.getElement() instanceof ITask) {
+ final AbstractTask updateTask = (AbstractTask) taskContainerDelta.getElement();
+ if (updateTask != null && task != null
+ && updateTask.getHandleIdentifier().equals(task.getHandleIdentifier())) {
+ if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().isClosing()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ };
+
+ private CommonTextSupport textSupport;
+
+ private ITaskActivityListener timingListener;
+
+ private FormToolkit toolkit;
+
+ private FocusTracker focusTracker;
+
+ public TaskPlanningEditor(TaskEditor editor) {
+ super(editor, ITasksUiConstants.ID_PAGE_PLANNING, Messages.TaskPlanningEditor_Planning);
+ TasksUiInternal.getTaskList().addChangeListener(taskListChangeListener);
+ }
+
+ private void createContributions(final Composite editorComposite) {
+ Collection<LocalTaskEditorContributionDescriptor> localEditorContributions = TaskEditorContributionExtensionReader.getLocalEditorContributions();
+ for (final LocalTaskEditorContributionDescriptor descriptor : localEditorContributions) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Error creating task editor contribution: \"" + descriptor.getId() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ AbstractLocalEditorPart part = descriptor.createPart();
+ initializePart(editorComposite, part);
+ }
+
+ });
+ }
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+
+ TaskEditorInput taskEditorInput = (TaskEditorInput) getEditorInput();
+ task = (AbstractTask) taskEditorInput.getTask();
+ repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(), task.getRepositoryUrl());
+
+ toolkit = managedForm.getToolkit();
+
+ editorComposite = managedForm.getForm().getBody();
+ GridLayout layout = new GridLayout();
+ layout.verticalSpacing = 0;
+ editorComposite.setLayout(layout);
+
+ if (task instanceof LocalTask) {
+ SummaryPart part = new SummaryPart();
+ part.setTextSupport(textSupport);
+ initializePart(editorComposite, part);
+ initializePart(editorComposite, new AttributePart());
+ // currently there is only one location for extensions
+ createContributions(editorComposite);
+ }
+
+ PlanningPart planningPart = new PlanningPart(SWT.NONE);
+ // disable due date picker if it's a repository due date
+ boolean needsDueDate = true;
+ if (task != null) {
+ try {
+ TaskData taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ if (taskData != null) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(taskData.getConnectorKind());
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(
+ taskData.getConnectorKind(), taskData.getRepositoryUrl());
+ if (connector != null && taskRepository != null
+ && connector.hasRepositoryDueDate(taskRepository, task, taskData)) {
+ needsDueDate = false;
+ }
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+ }
+ planningPart.initialize(getManagedForm(), repository, task, needsDueDate, this, textSupport);
+ planningPart.createControl(editorComposite, toolkit);
+ planningPart.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
+ getManagedForm().addPart(planningPart);
+
+ focusTracker = new FocusTracker();
+ focusTracker.track(editorComposite);
+ }
+
+ @Override
+ public void dispose() {
+ getEditor().removePropertyListener(dirtyStateListener);
+ if (timingListener != null) {
+ TasksUiPlugin.getTaskActivityManager().removeActivityListener(timingListener);
+ }
+ TasksUiInternal.getTaskList().removeChangeListener(taskListChangeListener);
+ super.dispose();
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ super.doSave(monitor);
+ // update task title
+ TasksUiInternal.getTaskList().notifyElementChanged(task);
+ }
+
+ @Override
+ public void doSaveAs() {
+ // don't support saving as
+ }
+
+ /**
+ * Override for customizing the tool bar.
+ */
+ @Override
+ public void fillToolBar(IToolBarManager toolBarManager) {
+ TaskEditorInput taskEditorInput = (TaskEditorInput) getEditorInput();
+ if (taskEditorInput.getTask() instanceof LocalTask) {
+ DeleteTaskEditorAction deleteAction = new DeleteTaskEditorAction(taskEditorInput.getTask());
+ toolBarManager.add(deleteAction);
+
+ NewSubTaskAction newSubTaskAction = new NewSubTaskAction();
+ newSubTaskAction.selectionChanged(newSubTaskAction, new StructuredSelection(taskEditorInput.getTask()));
+ if (newSubTaskAction.isEnabled()) {
+ toolBarManager.add(newSubTaskAction);
+ }
+ }
+ }
+
+ @Override
+ public TaskEditor getEditor() {
+ return (TaskEditor) super.getEditor();
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) {
+ super.init(site, input);
+ this.textSupport = new CommonTextSupport((IHandlerService) getSite().getService(IHandlerService.class));
+ this.textSupport.setSelectionChangedListener((TaskEditorActionContributor) getEditorSite().getActionBarContributor());
+
+ site.setSelectionProvider(new SelectionProviderAdapter(new StructuredSelection(
+ ((TaskEditorInput) input).getTask())));
+ }
+
+ private void initializePart(final Composite editorComposite, final AbstractLocalEditorPart part) {
+ part.initialize(getManagedForm(), repository, task);
+ Control control = part.createControl(editorComposite, toolkit);
+ part.setControl(control);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(control);
+ getManagedForm().addPart(part);
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ public void refresh() {
+ if (getManagedForm().getForm().isDisposed()) {
+ // editor possibly closed as part of submit
+ return;
+ }
+
+ getEditor().updateHeaderToolBar();
+ IFormPart[] parts = getManagedForm().getParts();
+ // refresh will not be invoked unless parts are stale
+ for (IFormPart part : parts) {
+ if (part instanceof AbstractLocalEditorPart) {
+ ((AbstractLocalEditorPart) part).markStale();
+ }
+ }
+ getManagedForm().refresh();
+ }
+
+ public void fillLeftHeaderToolBar(IToolBarManager toolBarManager) {
+ if (getEditorInput() instanceof TaskEditorInput
+ && ((TaskEditorInput) getEditorInput()).getTask() instanceof LocalTask) {
+ ControlContribution submitButtonContribution = new ControlContribution(
+ "org.eclipse.mylyn.tasks.toolbars.save") { //$NON-NLS-1$
+
+ @Override
+ protected Control createControl(Composite parent) {
+ saveButton = new Button(parent, SWT.FLAT);
+ saveButton.setText(Messages.TaskPlanningEditor_Save);
+ saveButton.setImage(CommonImages.getImage(CommonImages.SAVE));
+ saveButton.setBackground(null);
+ saveButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ doSave(new NullProgressMonitor());
+ }
+ });
+ saveButton.setEnabled(getEditor().isDirty());
+
+ return saveButton;
+ }
+ };
+ getEditor().addPropertyListener(dirtyStateListener);
+ toolBarManager.add(submitButtonContribution);
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ if (focusTracker.setFocus()) {
+ return;
+ } else {
+ IFormPart[] parts = getManagedForm().getParts();
+ if (parts.length > 0) {
+ parts[0].setFocus();
+ return;
+ }
+ }
+ super.setFocus();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java
new file mode 100644
index 0000000..ee5ca57
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskRelationHyperlinkDetector.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskRelationHyperlinkDetector extends AbstractTaskHyperlinkDetector {
+
+ private static Pattern HYPERLINK_PATTERN = Pattern.compile("([^\\s,]+)"); //$NON-NLS-1$
+
+ @Override
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+ if (region.getLength() > 0) {
+ return super.detectHyperlinks(textViewer, region, canShowMultipleHyperlinks);
+ } else {
+ if (textViewer.getDocument() == null) {
+ return null;
+ }
+
+ TaskRepository taskRepository = getTaskRepository(textViewer);
+ if (taskRepository != null) {
+ String prefix = extractPrefix(textViewer, region.getOffset());
+ String postfix = extractPostfix(textViewer, region.getOffset());
+ String taskKey = prefix + postfix;
+ if (taskKey.length() > 0) {
+ Region hyperlinkRegion = new Region(region.getOffset() - prefix.length(), taskKey.length());
+ return new IHyperlink[] { new TaskHyperlink(hyperlinkRegion, taskRepository, taskKey) };
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int index, int contentOffset) {
+ List<IHyperlink> links = null;
+ for (TaskRepository repository : getTaskRepositories(textViewer)) {
+ Matcher m = HYPERLINK_PATTERN.matcher(content);
+ while (m.find()) {
+ if (links == null) {
+ links = new ArrayList<IHyperlink>();
+ }
+ Region region = new Region(contentOffset + m.start(), m.end() - m.start());
+ links.add(new TaskHyperlink(region, repository, m.group()));
+ }
+ }
+ return links;
+ }
+
+ private String extractPrefix(ITextViewer viewer, int offset) {
+ int i = offset;
+ IDocument document = viewer.getDocument();
+ if (i > document.getLength()) {
+ return ""; //$NON-NLS-1$
+ }
+
+ try {
+ if (isSeparator(document.getChar(i))) {
+ return ""; //$NON-NLS-1$
+ }
+ while (i > 0) {
+ char ch = document.getChar(i - 1);
+ if (isSeparator(ch)) {
+ break;
+ }
+ i--;
+ }
+ return document.get(i, offset - i);
+ } catch (BadLocationException e) {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ private String extractPostfix(ITextViewer viewer, int offset) {
+ int i = offset;
+ IDocument document = viewer.getDocument();
+ int length = document.getLength();
+ if (i > length) {
+ return ""; //$NON-NLS-1$
+ }
+
+ try {
+ if (isSeparator(document.getChar(i))) {
+ return ""; //$NON-NLS-1$
+ }
+ while (i < length - 1) {
+ char ch = document.getChar(i + 1);
+ if (isSeparator(ch)) {
+ break;
+ }
+ i++;
+ }
+ return document.get(offset, i - offset + 1);
+ } catch (BadLocationException e) {
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ private boolean isSeparator(char ch) {
+ return Character.isWhitespace(ch) || ch == ',';
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlink.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlink.java
new file mode 100644
index 0000000..8ba190b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlink.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.URLHyperlink;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskUrlHyperlink extends URLHyperlink {
+
+ public TaskUrlHyperlink(IRegion region, String urlString) {
+ super(region, urlString);
+ }
+
+ @Override
+ public void open() {
+ TasksUiUtil.openTask(getURLString());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java
new file mode 100644
index 0000000..32f0a54
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TaskUrlHyperlinkDetector.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * David Green - fix for bug 266693
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+
+/**
+ * Detects URLs based on a regular expression.
+ *
+ * @author David Green
+ */
+public class TaskUrlHyperlinkDetector extends AbstractHyperlinkDetector {
+
+ // based on RFC 3986
+ // even though it's valid, the platform hyperlink detector doesn't detect hyperlinks that end with '.', ',' or ')'
+ // so we do the same here
+ private static final Pattern URL_PATTERN = Pattern.compile("([a-zA-Z][a-zA-Z+.-]{0,10}://[a-zA-Z0-9%._~!$&?#'()*+,;:@/=-]*[a-zA-Z0-9%_~!$&?#'(*+;:@/=-])"); //$NON-NLS-1$
+
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+ if (region == null || textViewer == null) {
+ return null;
+ }
+
+ IDocument document = textViewer.getDocument();
+
+ int offset = region.getOffset();
+ if (document == null) {
+ return null;
+ }
+
+ IRegion lineInfo;
+ String line;
+ try {
+ lineInfo = document.getLineInformationOfOffset(offset);
+ line = document.get(lineInfo.getOffset(), lineInfo.getLength());
+ } catch (BadLocationException ex) {
+ return null;
+ }
+
+ // offset of the region in the line
+ final int offsetInLine = offset - lineInfo.getOffset();
+ final int regionLength = region.getLength();
+
+ List<IHyperlink> hyperlinks = null;
+ Matcher matcher = URL_PATTERN.matcher(line);
+ while (matcher.find()) {
+ int urlOffsetInLine = matcher.start(1);
+ int endUrlOffsetInLine = matcher.end(1);
+ if ((regionLength == 0 && offsetInLine >= urlOffsetInLine && offsetInLine <= endUrlOffsetInLine)
+ || ((regionLength > 0 && offsetInLine <= urlOffsetInLine && (offsetInLine + regionLength) > urlOffsetInLine))) {
+ // region length of 0 and offset hits within the hyperlink url
+ // OR
+ // region spans the start of the hyperlink url.
+
+ // verify that the URL is valid
+ try {
+ String urlString = matcher.group(1);
+ new URL(urlString);
+
+ // URL looks okay, so add a hyperlink
+ if (hyperlinks == null) {
+ hyperlinks = new ArrayList<IHyperlink>(5);
+ }
+ IRegion urlRegion = new Region(lineInfo.getOffset() + urlOffsetInLine, endUrlOffsetInLine
+ - urlOffsetInLine);
+ hyperlinks.add(new TaskUrlHyperlink(urlRegion, urlString));
+ } catch (MalformedURLException e) {
+ // ignore
+ }
+ }
+ }
+ return hyperlinks == null ? null : hyperlinks.toArray(new IHyperlink[hyperlinks.size()]);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TextAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TextAttributeEditor.java
new file mode 100644
index 0000000..e6a2459
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TextAttributeEditor.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TextAttributeEditor extends AbstractAttributeEditor {
+
+ private Text text;
+
+ public TextAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE));
+ }
+
+ protected Text getText() {
+ return text;
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ if (isReadOnly()) {
+ text = new Text(parent, SWT.FLAT | SWT.READ_ONLY);
+ text.setFont(EditorUtil.TEXT_FONT);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ text.setText(getValue());
+ } else {
+ text = toolkit.createText(parent, getValue(), SWT.FLAT);
+ text.setFont(EditorUtil.TEXT_FONT);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.TRUE);
+ text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ setValue(text.getText());
+ CommonFormUtil.ensureVisible(text);
+ }
+ });
+ }
+ toolkit.adapt(text, false, false);
+ setControl(text);
+ }
+
+ public String getValue() {
+ return getAttributeMapper().getValue(getTaskAttribute());
+ }
+
+ public void setValue(String text) {
+ getAttributeMapper().setValue(getTaskAttribute(), text);
+ attributeChanged();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/ToolBarButtonContribution.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/ToolBarButtonContribution.java
new file mode 100644
index 0000000..5232aa1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/ToolBarButtonContribution.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.ControlContribution;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class ToolBarButtonContribution extends ControlContribution {
+
+ public int marginLeft = 0;
+
+ public int marginRight = 0;
+
+ protected ToolBarButtonContribution(String id) {
+ super(id);
+ }
+
+ protected abstract Control createButton(Composite parent);
+
+ @Override
+ protected Control createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setBackground(null);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ if (Platform.WS_CARBON.equals(SWT.getPlatform())) {
+ layout.marginTop = -3;
+ }
+ layout.marginLeft = this.marginLeft;
+ layout.marginRight = this.marginRight;
+ composite.setLayout(layout);
+
+ Control button = createButton(composite);
+ int heigtHint = SWT.DEFAULT;
+ if (Platform.WS_WIN32.equals(SWT.getPlatform())) {
+ heigtHint = 22;
+ } else if (Platform.WS_CARBON.equals(SWT.getPlatform())) {
+ heigtHint = 32;
+ }
+ GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.CENTER).hint(SWT.DEFAULT, heigtHint).applyTo(button);
+ return composite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TraverseOnTabKeyListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TraverseOnTabKeyListener.java
new file mode 100644
index 0000000..3d21fd1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/TraverseOnTabKeyListener.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.VerifyKeyListener;
+import org.eclipse.swt.events.VerifyEvent;
+
+class TraverseOnTabKeyListener implements VerifyKeyListener {
+
+ public void verifyKey(VerifyEvent event) {
+ // if there is a tab key, do not "execute" it and instead traverse to the next control
+ if (event.keyCode == SWT.TAB) {
+ event.doit = false;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/messages.properties
new file mode 100644
index 0000000..2b6fc77
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/editors/messages.properties
@@ -0,0 +1,135 @@
+AbstractReplyToCommentAction_Reply=Reply
+
+AttachmentSizeFormatter_0_bytes=0 bytes
+AttachmentSizeFormatter_0_GB=0.00 GB
+AttachmentSizeFormatter_0_KB=0.00 KB
+AttachmentSizeFormatter_0_MB=0.00 MB
+AttachmentSizeFormatter_1_byte=1 byte
+
+AttachmentTableLabelProvider_File_=File:
+AttachmentTableLabelProvider_Patch=\ Patch
+AttachmentTableLabelProvider_Task_Context=\ Task Context
+AttachmentTableLabelProvider_Type_=Type:
+BrowserPreviewViewer_Error=Error
+BrowserPreviewViewer_Formatting_Wiki_Text=Formatting Wiki Text
+BrowserPreviewViewer_Loading_preview_=Loading preview...
+BrowserPreviewViewer_The_repository_does_not_support_HTML_preview=The repository does not support HTML preview.
+
+CategoryEditor_Category_Summary=Category Summary
+CategoryEditor_Description_=Description:
+CategoryEditor_URL_=URL:
+
+CategoryEditorInput_Category_Editor=Category Editor
+
+CommentGroupStrategy_Current=Current
+CommentGroupStrategy_Older=Older
+CommentGroupStrategy_Recent=Recent
+
+DateAttributeEditor_Clear=Clear
+
+PersonalPart_Personal_Planning=Private
+PlanningPageFactory_Private=Private
+PlanningPart_Personal_Notes=Notes
+
+RichTextAttributeEditor_Viewer_Source=View Unformatted Text
+
+TaskAttachmentDropListener_Note_that_only_the_first_file_dragged_will_be_attached=Note that only the first file dragged will be attached.
+
+TaskEditorActionPart_Actions=Actions
+TaskEditorActionPart_Add_to_Category=Add to Category
+TaskEditorActionPart_Attach_Context=Attach Context
+TaskEditorActionPart_Submit=&Submit
+TaskEditorActionPart_Submit_to_X=Submit to {0}
+TaskEditorAttachmentPart_Attach_=Attach...
+TaskEditorAttachmentPart_Attach__Screenshot=Attach Screenshot...
+TaskEditorAttachmentPart_Attachments=Attachments
+TaskEditorAttachmentPart_Created=Created
+TaskEditorAttachmentPart_Creator=Creator
+TaskEditorAttachmentPart_Description=Description
+TaskEditorAttachmentPart_Name=Name
+TaskEditorAttachmentPart_No_attachments=No attachments
+TaskEditorAttachmentPart_Size=Size
+
+TaskEditorAttributePart_Attributes=Attributes
+TaskEditorAttributePart_Refresh_Attributes=Refresh Attributes
+TaskEditorAttributePart_Update_Failed=Update Failed
+TaskEditorAttributePart_Updating_of_repository_configuration_failed=Updating of repository configuration failed
+
+TaskEditorCommentPart_0=\ (
+TaskEditorCommentPart_1=)
+TaskEditorCommentPart_Collapse_Comments=Collapse Comments
+TaskEditorCommentPart_Comments=Comments
+TaskEditorCommentPart_Expand_Comments=Expand Comments
+
+TaskEditorDescriptionPart_Description=Description
+TaskEditorDescriptionPart_Detector=Detector:
+TaskEditorDescriptionPart_Duplicate_Detection_Failed=Duplicate Detection Failed
+TaskEditorDescriptionPart_Duplicate_Detection=Duplicate Detection
+TaskEditorDescriptionPart_The_duplicate_detector_did_not_return_a_valid_query=The duplicate detector did not return a valid query.
+TaskEditorDescriptionPart_Search=Search
+
+TaskEditorNewCommentPart_New_Comment=New Comment
+TaskEditorOutlineNode_Comments=Comments
+TaskEditorOutlineNode_Description=Description
+TaskEditorOutlineNode_New_Comment=New Comment
+TaskEditorOutlineNode_Task_=Task
+
+TaskEditorPeoplePart_People=People
+
+TaskEditorPlanningPart_0_SECOUNDS=0 seconds
+TaskEditorPlanningPart_Active=Active:
+TaskEditorPlanningPart_Clear=Clear
+TaskEditorPlanningPart_Confirm_Activity_Time_Deletion=Confirm Activity Time Deletion
+TaskEditorPlanningPart_Do_you_wish_to_reset_your_activity_time_on_this_task_=Do you wish to reset your activity time on this task?\n\nThis will take immediate affect and can not be undone.
+TaskEditorPlanningPart_Due=Due:
+TaskEditorPlanningPart_Estimated=Estimated:
+TaskEditorPlanningPart_Reset=Reset
+TaskEditorPlanningPart_Scheduled=Scheduled:
+TaskEditorPlanningPart_TaskEditorPlanningPart_tooltip=Contents are stored locally, not\n submitted to the repository.
+TaskEditorPlanningPart_Time_working_on_this_task=Time working on this task
+
+TaskEditorRichTextPart_Browser_Preview=Browser Preview
+TaskEditorRichTextPart_Maximize=Maximize
+TaskEditorRichTextPart_Preview=Preview
+
+TaskEditorSummaryPart_Summary=Summary
+
+TaskPlanningEditor_Attributes=Attributes
+TaskPlanningEditor_Complete=Complete
+TaskPlanningEditor_Completed=Completed:
+TaskPlanningEditor_Created=Created:
+TaskPlanningEditor_Incomplete=Incomplete
+TaskPlanningEditor_Notes=Notes
+TaskPlanningEditor_Planning=Planning
+TaskPlanningEditor_Retrieve_task_description_from_URL=Retrieve task description from URL
+TaskPlanningEditor_Save=Save
+TaskPlanningEditor_Status=Status:
+TaskPlanningEditor_URL=URL:
+
+AbstractTaskEditorPage_Comment_required=Comment required
+AbstractTaskEditorPage_Could_not_save_task=Could not save task
+AbstractTaskEditorPage_Error_opening_task=Error opening task
+AbstractTaskEditorPage_Failed_to_read_task_data_=Failed to read task data:
+AbstractTaskEditorPage_History=History
+AbstractTaskEditorPage_Open_failed=Open failed
+AbstractTaskEditorPage_Open_with_Web_Browser=Open with Web Browser
+AbstractTaskEditorPage_Save_failed=Save failed
+AbstractTaskEditorPage_Submit_failed=Submit failed
+AbstractTaskEditorPage_Submit_failed_=Submit failed:
+AbstractTaskEditorPage_Synchronize_to_retrieve_task_data=Synchronize to retrieve task data
+AbstractTaskEditorPage_Synchronize_to_update_editor_contents=Synchronize to update editor contents
+AbstractTaskEditorPage_Add_task_to_tasklist=Not in Task List. Click to add.
+AbstractTaskEditorPage_Task_has_incoming_changes=Task has incoming changes
+AbstractTaskEditorPage_Title=Title
+AbstractTaskEditorPage_Unable_to_submit_at_this_time=Unable to submit at this time. Check connectivity and retry.
+
+AttributeEditorToolkit_Content_Assist_Available__X_=Content Assist Available ({0})
+AttributePart_Category_=Category:
+SummaryPart_Section_Title=Summary
+TaskEditor_Task=Task
+TaskEditor_Task_added_to_the_Uncategorized_container=Task added to the Uncategorized container
+
+TaskEditorExtensionSettingsContribution__default_=\ (default)
+TaskEditorExtensionSettingsContribution_Editor=Task Editor Settings
+TaskEditorExtensionSettingsContribution_Plain_Text=Plain Text
+TaskEditorExtensionSettingsContribution_Select_the_capabilities_of_the_task_editor=Select the capabilities of the task editor
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties
new file mode 100644
index 0000000..35113df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/messages.properties
@@ -0,0 +1,74 @@
+ActivityExternalizationParticipant_Activity_Context=Activity Context
+
+AddExistingTaskJob_Adding_task_X_=Adding task: "{0}"...
+ChangeActivityHandleOperation_Activity_migration=Activity migration
+
+DialogErrorReporter_Mylyn_Error=Mylyn Error
+DialogErrorReporter_Please_report_the_following_error_at=Please report the following error at:\n\
+\n\
+http://bugs.eclipse.org/bugs/enter_bug.cgi?product=Mylyn\n\
+\n\
+Or via the popup menu in the Error Log view (see Window -> Show View)
+
+MoveToCategoryMenuContributor_Move_to=Move to
+
+OpenRepositoryTaskJob_Could_not_find_repository_configuration_for_X=Could not find repository configuration for {0}.
+OpenRepositoryTaskJob_Opening_Remote_Task=Opening Remote Task
+OpenRepositoryTaskJob_Opening_repository_task_X=Opening repository task {0}
+OpenRepositoryTaskJob_Please_set_up_repository_via_X=Please set up repository via {0}.
+OpenRepositoryTaskJob_Repository_Not_Found=Repository Not Found
+OpenRepositoryTaskJob_Unable_to_open_task=Unable to open task
+
+RefactorRepositoryUrlOperation_Repository_URL_update=Repository URL update
+
+ScheduleTaskMenuContributor_Cannot_schedule_completed_tasks=Cannot schedule completed tasks
+ScheduleTaskMenuContributor_Choose_Date_=Choose Date...
+ScheduleTaskMenuContributor_Future=Future
+ScheduleTaskMenuContributor_Not_Scheduled=Not Scheduled
+ScheduleTaskMenuContributor_Schedule_for=Schedule for
+
+TaskHistoryDropDown_Activate_Task_=Activate Task...
+TaskHistoryDropDown_Deactivate_Task=Deactivate Task
+
+TaskJobFactory_Receiving_configuration=Receiving configuration
+TaskJobFactory_Refreshing_repository_configuration=Refreshing repository configuration
+
+TaskListBackupManager_Error_occured_during_scheduled_tasklist_backup=Error occured during scheduled tasklist backup.\nCheck settings on Tasklist preferences page.
+TaskListBackupManager_Scheduled_task_data_backup=Scheduled task data backup
+
+TaskListNotificationManager_Open_Notification_Job=Open Notification Job
+
+TaskRepositoryLocationUi_Enter_HTTP_password=Enter HTTP password
+TaskRepositoryLocationUi_Enter_proxy_password=Enter proxy password
+TaskRepositoryLocationUi_Enter_repository_password=Enter repository password
+
+TaskSearchPage_ERROR_Unable_to_present_query_page=ERROR: Unable to present query page, ensure repository configuration is valid and retry
+
+TaskSearchPage_No_task_found_matching_key_=No task found matching key:
+TaskSearchPage_Repository_Search=Repository Search
+TaskSearchPage_Select_Repository_=Se&lect Repository:
+TaskSearchPage_Task_Key_ID=Task Key/ID:
+TaskSearchPage_Task_Search=Task Search
+
+TasksReminderDialog_Description=Description
+TasksReminderDialog_Dismiss_All=Dismiss All
+TasksReminderDialog_Dismiss_Selected=Dismiss Selected
+TasksReminderDialog_Priority=Priority
+TasksReminderDialog_Remind_tommorrow=Remind tomorrow
+TasksReminderDialog_Reminder_Day=Reminder Day
+TasksReminderDialog_Reminders=Reminders
+
+TasksUiPlugin_Initializing_Task_List=Initializing Task List
+TasksUiPlugin_Task_Repositories=Task Repositories
+TasksUiPlugin_Load_Data_Directory=Load Data Directory
+
+TaskTrimWidget__no_active_task_=<no active task>
+TaskTrimWidget__no_task_active_=<no task active>
+
+AbstractRepositoryConnectorUi_Task=Task
+
+TaskElementLabelProvider__no_summary_available_=: <no summary available>
+TaskHyperlink_Could_not_determine_repository_for_report=Could not determine repository for report
+TaskHyperlink_Open_Task_X_in_X=Open Task {0} in {1}
+
+AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL=Retrieving summary from URL
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/Messages.java
new file mode 100644
index 0000000..8b9d50d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/Messages.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.notifications.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TaskDataDiff_more_;
+
+ public static String TaskDiffUtil_attachment;
+
+ public static String TaskDiffUtil_Comment_by_X;
+
+ public static String TaskDiffUtil_Unknown;
+
+ public static String TaskListNotificationPopup_Mark_Task_Read;
+
+ public static String TaskListNotificationPopup_more;
+
+ public static String TaskListNotifier_New_unread_task;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskAttributeDiff.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskAttributeDiff.java
new file mode 100644
index 0000000..f7c0def
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskAttributeDiff.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskAttributeDiff {
+
+ private String attributeId;
+
+ private final TaskAttribute newAttribute;
+
+ private final List<String> newValues;
+
+ private final TaskAttribute oldAttribute;
+
+ private final List<String> oldValues;
+
+ public TaskAttributeDiff(TaskAttribute oldAttribute, TaskAttribute newAttribute) {
+ Assert.isTrue(oldAttribute != null || newAttribute != null);
+ this.oldAttribute = oldAttribute;
+ this.newAttribute = newAttribute;
+ if (oldAttribute != null) {
+ this.oldValues = oldAttribute.getTaskData().getAttributeMapper().getValueLabels(oldAttribute);
+ this.attributeId = oldAttribute.getId();
+ } else {
+ this.oldValues = Collections.emptyList();
+ }
+ if (newAttribute != null) {
+ this.newValues = newAttribute.getTaskData().getAttributeMapper().getValueLabels(newAttribute);
+ this.attributeId = newAttribute.getId();
+ } else {
+ this.newValues = Collections.emptyList();
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TaskAttributeDiff other = (TaskAttributeDiff) obj;
+ if (attributeId == null) {
+ if (other.attributeId != null) {
+ return false;
+ }
+ } else if (!attributeId.equals(other.attributeId)) {
+ return false;
+ }
+ return true;
+ }
+
+ public List<String> getAddedValues() {
+ List<String> result = new ArrayList<String>(getNewValues());
+ if (getOldValues() != null) {
+ result.removeAll(getOldValues());
+ }
+ return result;
+ }
+
+ public TaskAttribute getNewAttribute() {
+ return newAttribute;
+ }
+
+ public List<String> getNewValues() {
+ return newValues;
+ }
+
+ public TaskAttribute getOldAttribute() {
+ return oldAttribute;
+ }
+
+ public List<String> getOldValues() {
+ return oldValues;
+ }
+
+ public List<String> getRemovedValues() {
+ List<String> result = new ArrayList<String>(getOldValues());
+ if (getNewValues() != null) {
+ result.removeAll(getNewValues());
+ }
+ return result;
+ }
+
+ public boolean hasChanges() {
+ return !oldValues.equals(newValues);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((attributeId == null) ? 0 : attributeId.hashCode());
+ return result;
+ }
+
+ public String getLabel() {
+ if (newAttribute != null) {
+ return newAttribute.getTaskData().getAttributeMapper().getLabel(newAttribute);
+ } else {
+ return oldAttribute.getTaskData().getAttributeMapper().getLabel(oldAttribute);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDataDiff.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDataDiff.java
new file mode 100644
index 0000000..519538c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDataDiff.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDataDiff {
+
+ private static final int MAX_CHANGED_ATTRIBUTES = 2;
+
+ private final String[] ATTRIBUTES_IDS = new String[] { TaskAttribute.SUMMARY, TaskAttribute.DESCRIPTION,
+ TaskAttribute.PRODUCT, TaskAttribute.PRIORITY, TaskAttribute.USER_ASSIGNED, TaskAttribute.STATUS, };
+
+ private final TaskData newTaskData;
+
+ private final TaskData oldTaskData;
+
+ private final Set<ITaskComment> newComments = new LinkedHashSet<ITaskComment>();
+
+ private final Set<TaskAttributeDiff> changedAttributes = new LinkedHashSet<TaskAttributeDiff>();
+
+ private final RepositoryModel repositoryModel;
+
+ public TaskDataDiff(RepositoryModel repositoryModel, TaskData newTaskData, TaskData oldTaskData) {
+ Assert.isNotNull(repositoryModel);
+ Assert.isNotNull(newTaskData);
+ this.repositoryModel = repositoryModel;
+ this.newTaskData = newTaskData;
+ this.oldTaskData = oldTaskData;
+ parse();
+ }
+
+ public Collection<ITaskComment> getNewComments() {
+ return newComments;
+ }
+
+ public Collection<TaskAttributeDiff> getChangedAttributes() {
+ return changedAttributes;
+ }
+
+ private void parse() {
+ for (String attributeId : ATTRIBUTES_IDS) {
+ TaskAttribute newAttribute = newTaskData.getRoot().getMappedAttribute(attributeId);
+ TaskAttribute oldAttribute = null;
+ if (oldTaskData != null) {
+ oldAttribute = oldTaskData.getRoot().getMappedAttribute(attributeId);
+ }
+ if (oldAttribute == null && newAttribute == null) {
+ continue;
+ }
+ addChangedAttribute(oldAttribute, newAttribute, true);
+ }
+
+ // other attributes that have changed on newTaskData
+ for (TaskAttribute newAttribute : newTaskData.getRoot().getAttributes().values()) {
+ TaskAttribute oldAttribute = null;
+ if (oldTaskData != null) {
+ oldAttribute = oldTaskData.getRoot().getMappedAttribute(newAttribute.getPath());
+ }
+ addChangedAttribute(oldAttribute, newAttribute, false);
+ }
+ // other attributes that have been removed from newTaskData
+ if (oldTaskData != null) {
+ for (TaskAttribute oldAttribute : oldTaskData.getRoot().getAttributes().values()) {
+ TaskAttribute newAttribute = newTaskData.getRoot().getMappedAttribute(oldAttribute.getPath());
+ if (newAttribute == null) {
+ addChangedAttribute(oldAttribute, newAttribute, false);
+ }
+ }
+ }
+ }
+
+ private void addChangedAttribute(TaskAttribute oldAttribute, TaskAttribute newAttribute, boolean ignoreKind) {
+ TaskAttribute attribute;
+ if (newAttribute != null) {
+ attribute = newAttribute;
+ } else {
+ attribute = oldAttribute;
+ }
+ String type = attribute.getMetaData().getType();
+ if (TaskAttribute.TYPE_COMMENT.equals(type)) {
+ addChangedComment(oldAttribute, newAttribute);
+ } else if (TaskAttribute.TYPE_OPERATION.equals(type)) {
+ // ignore
+ } else if (ignoreKind || attribute.getMetaData().getKind() != null) {
+ TaskAttributeDiff diff = new TaskAttributeDiff(oldAttribute, newAttribute);
+ if (diff.hasChanges()) {
+ changedAttributes.add(diff);
+ }
+ }
+ }
+
+ private void addChangedComment(TaskAttribute oldAttribute, TaskAttribute newAttribute) {
+ if (oldAttribute == null) {
+ ITaskComment comment = repositoryModel.createTaskComment(newAttribute);
+ if (comment != null) {
+ newComments.add(comment);
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return toString(60, true);
+ }
+
+ // TODO implement trim based on text width
+ public String toString(int maxWidth, boolean includeNewest) {
+ StringBuilder sb = new StringBuilder();
+ String sep = ""; //$NON-NLS-1$
+ // append first comment
+ int newCommentCount = newComments.size();
+ if (newCommentCount > 0) {
+ Iterator<ITaskComment> iter = newComments.iterator();
+ ITaskComment comment = iter.next();
+ if (includeNewest) {
+ while (iter.hasNext()) {
+ comment = iter.next();
+ }
+ }
+
+ sb.append(TaskDiffUtil.trim(TaskDiffUtil.commentToString(comment), 60));
+ if (newCommentCount > 1) {
+ sb.append(" (" + (newCommentCount - 1) + Messages.TaskDataDiff_more_); //$NON-NLS-1$
+ }
+ sep = "\n"; //$NON-NLS-1$
+ }
+ // append changed attributes
+ int n = 0;
+ for (TaskAttributeDiff attributeDiff : changedAttributes) {
+ String label = attributeDiff.getLabel();
+ if (label != null) {
+ sb.append(sep);
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(label);
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(TaskDiffUtil.trim(TaskDiffUtil.listToString(attributeDiff.getRemovedValues()), 28));
+ sb.append(" -> "); //$NON-NLS-1$
+ sb.append(TaskDiffUtil.trim(TaskDiffUtil.listToString(attributeDiff.getAddedValues()), 28));
+ if (++n == MAX_CHANGED_ATTRIBUTES) {
+ break;
+ }
+ sep = "\n"; //$NON-NLS-1$
+ }
+ }
+ return sb.toString();
+ }
+}
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
new file mode 100644
index 0000000..7d8158d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskDiffUtil.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Drawable;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskDiffUtil {
+
+ // could use the ellipsis glyph on some platforms "\u2026"
+ 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 commentToString(ITaskComment comment) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(MessageFormat.format(Messages.TaskDiffUtil_Comment_by_X, personToString(comment.getAuthor())));
+ sb.append(": "); //$NON-NLS-1$
+ sb.append(cleanCommentText(comment.getText()));
+ return sb.toString();
+ }
+
+ private static String personToString(IRepositoryPerson author) {
+ if (author == null) {
+ return Messages.TaskDiffUtil_Unknown;
+ } else if (author.getName() != null) {
+ return author.getName();
+ }
+ return author.getPersonId();
+ }
+
+ public static String cleanCommentText(String value) {
+ String text = ""; //$NON-NLS-1$
+ String[] lines = value.split("\n"); //$NON-NLS-1$
+ boolean attachment = false;
+ boolean needSeparator = false;
+ for (String line : lines) {
+ // skip comments and info lines
+ if (attachment) {
+ text += Messages.TaskDiffUtil_attachment + line;
+ needSeparator = true;
+ attachment = false;
+ } else if (line.startsWith(">") // //$NON-NLS-1$
+ || line.matches("^\\s*\\(In reply to comment.*")) { //$NON-NLS-1$
+ needSeparator = true;
+ continue;
+ } else if (line.startsWith("Created an attachment (id=")) { //$NON-NLS-1$
+ attachment = true;
+ } else {
+ if (needSeparator) {
+ if (!text.matches(".*\\p{Punct}\\s*")) { //$NON-NLS-1$
+ text = text.trim();
+ if (text.length() > 0) {
+ text += "."; //$NON-NLS-1$
+ }
+ }
+ }
+ text += " " + line; //$NON-NLS-1$
+ attachment = false;
+ needSeparator = false;
+ }
+ }
+ return foldSpaces(text);
+ }
+
+ public static String listToString(List<String> values) {
+ if (values == null) {
+ return ""; //$NON-NLS-1$
+ }
+
+ StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (String value : values) {
+ if (!first) {
+ sb.append(", "); //$NON-NLS-1$
+ } else {
+ first = false;
+ }
+ sb.append(foldSpaces(value));
+ }
+ return sb.toString();
+ }
+
+ public static String foldSpaces(String value) {
+ return value.replaceAll("\\s+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static String trim(String value, int length) {
+ if (value.length() > length) {
+ value = value.substring(0, length - 3) + "..."; //$NON-NLS-1$
+ }
+ return value;
+ }
+
+ /**
+ * 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
+ * the text to shorten
+ * @param width
+ * the width to shorten the text to, in pixels
+ * @return the shortened text
+ */
+ public static final String shortenText2(Composite composite, String t, int width) {
+ GC gc = new GC(composite);
+
+ if (t == null) {
+ return null;
+ }
+ int w = gc.textExtent(ELLIPSIS, DRAW_FLAGS).x;
+ if (width <= w) {
+ return t;
+ }
+ int l = t.length();
+ int max = l / 2;
+ int min = 0;
+ int mid = (max + min) / 2 - 1;
+ if (mid <= 0) {
+ return t;
+ }
+ while (min < mid && mid < max) {
+ String s1 = t.substring(0, mid);
+ String s2 = t.substring(l - mid, l);
+ int l1 = gc.textExtent(s1, DRAW_FLAGS).x;
+ int l2 = gc.textExtent(s2, DRAW_FLAGS).x;
+ if (l1 + w + l2 > width) {
+ max = mid;
+ mid = (max + min) / 2;
+ } else if (l1 + w + l2 < width) {
+ min = mid;
+ mid = (max + min) / 2;
+ } else {
+ min = max;
+ }
+ }
+
+ gc.dispose();
+
+ if (mid == 0) {
+ return t;
+ }
+ return t.substring(0, mid) + ELLIPSIS + t.substring(l - mid, l);
+ }
+
+ // From PerspectiveBarContributionItem
+ public static String shortenText(Drawable composite, String text, int maxWidth) {
+ String returnText = text;
+ GC gc = new GC(composite);
+ if (gc.textExtent(text).x > maxWidth) {
+ for (int i = text.length(); i > 0; i--) {
+ String subString = text.substring(0, i);
+ subString = subString + "..."; //$NON-NLS-1$
+ if (gc.textExtent(subString).x < maxWidth) {
+ returnText = subString;
+ break;
+ }
+ }
+ }
+ gc.dispose();
+ return returnText;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotification.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotification.java
new file mode 100644
index 0000000..b9ca5fa
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotification.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 java.util.Date;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class TaskListNotification extends AbstractNotification {
+
+ protected final ITask task;
+
+ protected Date date;
+
+ private String description;
+
+ private final DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(
+ new TaskElementLabelProvider(true), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
+
+ private final Object token;
+
+ public TaskListNotification(ITask task) {
+ this(task, null);
+ }
+
+ public TaskListNotification(ITask task, Object token) {
+ Assert.isNotNull(task);
+ this.task = task;
+ this.token = token;
+ }
+
+ @Override
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public String getLabel() {
+ return labelProvider.getText(task);
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public void open() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.refreshAndOpenTaskListElement(task);
+ }
+ });
+ }
+
+ @Override
+ public Image getNotificationImage() {
+ return labelProvider.getImage(task);
+ }
+
+ protected ITask getTask() {
+ return task;
+ }
+
+ @Override
+ public Image getNotificationKindImage() {
+ if (task.getSynchronizationState() == SynchronizationState.INCOMING_NEW) {
+ return CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING_NEW);
+ } else if (task.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) {
+ return CommonImages.getImage(CommonImages.OVERLAY_SYNC_OUTGOING_NEW);
+ } else {
+ return CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING);
+ }
+ }
+
+ @Override
+ public Date getDate() {
+ return date;
+ }
+
+ @Override
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public int compareTo(AbstractNotification anotherNotification) throws ClassCastException {
+ Date anotherDate = anotherNotification.getDate();
+ if (date != null && anotherDate != null) {
+ return date.compareTo(anotherDate) * -1;
+ } else if (date == null) {
+ return 1;
+ } else {
+ return -1;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((date == null) ? 0 : date.hashCode());
+ result = prime * result + ((description == null) ? 0 : description.hashCode());
+ result = prime * result + ((task == null) ? 0 : task.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TaskListNotification other = (TaskListNotification) obj;
+ if (date == null) {
+ if (other.date != null) {
+ return false;
+ }
+ } else if (!date.equals(other.date)) {
+ return false;
+ }
+ if (description == null) {
+ if (other.description != null) {
+ return false;
+ }
+ } else if (!description.equals(other.description)) {
+ return false;
+ }
+ if (task == null) {
+ if (other.task != null) {
+ return false;
+ }
+ } else if (!task.equals(other.task)) {
+ return false;
+ }
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == AbstractTask.class) {
+ return task;
+ }
+ return null;
+ }
+
+ @Override
+ public Object getToken() {
+ return token;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotificationPopup.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotificationPopup.java
new file mode 100644
index 0000000..c41ff05
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotificationPopup.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotificationPopup;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink;
+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.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class TaskListNotificationPopup extends AbstractNotificationPopup {
+
+ private static final String NOTIFICATIONS_HIDDEN = Messages.TaskListNotificationPopup_more;
+
+ private static final int NUM_NOTIFICATIONS_TO_DISPLAY = 4;
+
+ private List<AbstractNotification> notifications;
+
+ public TaskListNotificationPopup(Shell parent) {
+ super(parent.getDisplay());
+ }
+
+ public void setContents(List<AbstractNotification> notifications) {
+ this.notifications = notifications;
+ }
+
+ public List<AbstractNotification> getNotifications() {
+ return new ArrayList<AbstractNotification>(notifications);
+ }
+
+ @Override
+ protected void createTitleArea(Composite parent) {
+ super.createTitleArea(parent);
+ }
+
+ @Override
+ protected Color getTitleForeground() {
+ return TasksUiPlugin.getDefault().getFormColors(Display.getDefault()).getColor(IFormColors.TITLE);
+
+ }
+
+ @Override
+ protected void createContentArea(Composite parent) {
+ int count = 0;
+ for (final AbstractNotification notification : notifications) {
+ Composite notificationComposite = new Composite(parent, SWT.NO_FOCUS);
+ GridLayout gridLayout = new GridLayout(2, false);
+ GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(notificationComposite);
+ notificationComposite.setLayout(gridLayout);
+ notificationComposite.setBackground(parent.getBackground());
+
+ if (count < NUM_NOTIFICATIONS_TO_DISPLAY) {
+ final Label notificationLabelIcon = new Label(notificationComposite, SWT.NO_FOCUS);
+ notificationLabelIcon.setBackground(parent.getBackground());
+ notificationLabelIcon.setImage(notification.getNotificationKindImage());
+ if (!(notification instanceof TaskListNotificationReminder)) {
+ final AbstractTask task = (AbstractTask) notification.getAdapter(AbstractTask.class);
+ if (task != null) {
+ notificationLabelIcon.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
+ notificationLabelIcon.setImage(null);
+ notificationLabelIcon.setToolTipText(null);
+ }
+ });
+ notificationLabelIcon.setToolTipText(Messages.TaskListNotificationPopup_Mark_Task_Read);
+ }
+ }
+
+ final TaskHyperlink itemLink = new TaskHyperlink(notificationComposite, SWT.BEGINNING | SWT.NO_FOCUS);
+ GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(itemLink);
+
+ itemLink.setText(notification.getLabel());
+ itemLink.setImage(notification.getNotificationImage());
+ itemLink.setBackground(parent.getBackground());
+ itemLink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ notification.open();
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ Shell windowShell = window.getShell();
+ if (windowShell != null) {
+ if (windowShell.getMinimized()) {
+ windowShell.setMinimized(false);
+ }
+
+ windowShell.open();
+ windowShell.forceActive();
+ }
+ }
+ }
+ });
+
+ String descriptionText = null;
+ if (notification.getDescription() != null) {
+ descriptionText = notification.getDescription();
+ }
+ if (descriptionText != null && !descriptionText.trim().equals("")) { //$NON-NLS-1$
+ Label descriptionLabel = new Label(notificationComposite, SWT.NO_FOCUS);
+ descriptionLabel.setText(descriptionText);
+ descriptionLabel.setBackground(parent.getBackground());
+ GridDataFactory.fillDefaults()
+ .span(2, SWT.DEFAULT)
+ .grab(true, false)
+ .align(SWT.FILL, SWT.TOP)
+ .applyTo(descriptionLabel);
+ }
+ } else {
+ int numNotificationsRemain = notifications.size() - count;
+ TaskHyperlink remainingHyperlink = new TaskHyperlink(notificationComposite, SWT.NO_FOCUS);
+ remainingHyperlink.setBackground(parent.getBackground());
+
+ remainingHyperlink.setText(numNotificationsRemain + " " + NOTIFICATIONS_HIDDEN); //$NON-NLS-1$
+ GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).applyTo(remainingHyperlink);
+ remainingHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TasksUiUtil.openTasksViewInActivePerspective().setFocus();
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ Shell windowShell = window.getShell();
+ if (windowShell != null) {
+ windowShell.setMaximized(true);
+ windowShell.open();
+ }
+ }
+ }
+ });
+ break;
+ }
+ count++;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotificationReminder.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotificationReminder.java
new file mode 100644
index 0000000..4f039f2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotificationReminder.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class TaskListNotificationReminder extends TaskListNotification {
+
+ public TaskListNotificationReminder(AbstractTask task) {
+ super(task);
+ }
+
+ @Override
+ public Image getNotificationKindImage() {
+ return CommonImages.getImage(CommonImages.OVERLAY_DATE_DUE);
+ }
+}
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
new file mode 100644
index 0000000..253792c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/TaskListNotifier.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
+import org.eclipse.mylyn.internal.tasks.core.data.ITaskDataManagerListener;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManagerEvent;
+import org.eclipse.mylyn.internal.tasks.ui.ITaskListNotificationProvider;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskListNotifier implements ITaskDataManagerListener, ITaskListNotificationProvider {
+
+ private final TaskDataManager taskDataManager;
+
+ private final List<TaskListNotification> notificationQueue = new ArrayList<TaskListNotification>();
+
+ private final RepositoryModel repositoryModel;
+
+ public TaskListNotifier(RepositoryModel repositoryModel, TaskDataManager taskDataManager) {
+ this.repositoryModel = repositoryModel;
+ this.taskDataManager = taskDataManager;
+ this.taskDataManager.addListener(this);
+ }
+
+ public TaskListNotification getNotification(ITask task, Object token) {
+ if (task.getSynchronizationState() == SynchronizationState.INCOMING_NEW) {
+ 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) {
+ TaskListNotification notification = new TaskListNotification(task, token);
+ notification.setDescription(diff.toString(60, true));
+ return notification;
+ }
+ }
+ return null;
+ }
+
+ public TaskDataDiff getDiff(ITask task) {
+ ITaskDataWorkingCopy workingCopy;
+ try {
+ workingCopy = taskDataManager.getTaskDataState(task);
+ if (workingCopy != null) {
+ TaskDataDiff diff = new TaskDataDiff(repositoryModel, workingCopy.getRepositoryData(),
+ workingCopy.getLastReadData());
+ return diff;
+ }
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to get task data for task: \"" //$NON-NLS-1$
+ + task + "\"", e)); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ public void taskDataUpdated(TaskDataManagerEvent event) {
+ if (event.getToken() != null && event.getTaskDataChanged()) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUi.getRepositoryConnectorUi(event.getTaskData()
+ .getConnectorKind());
+ if (!connectorUi.hasCustomNotifications()) {
+ TaskListNotification notification = getNotification(event.getTask(), event.getToken());
+ if (notification != null) {
+ synchronized (notificationQueue) {
+ notificationQueue.add(notification);
+ }
+ }
+ }
+ }
+ }
+
+ public Set<AbstractNotification> getNotifications() {
+ synchronized (notificationQueue) {
+ if (notificationQueue.isEmpty()) {
+ return Collections.emptySet();
+ }
+ HashSet<AbstractNotification> result = new HashSet<AbstractNotification>(notificationQueue);
+ notificationQueue.clear();
+ return result;
+ }
+ }
+
+ public void editsDiscarded(TaskDataManagerEvent event) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/messages.properties
new file mode 100644
index 0000000..7940764
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/notifications/messages.properties
@@ -0,0 +1,10 @@
+TaskDataDiff_more_=\ more)
+
+TaskDiffUtil_attachment=\ attachment:
+TaskDiffUtil_Comment_by_X=Comment by {0}
+TaskDiffUtil_Unknown=Unknown
+
+TaskListNotificationPopup_Mark_Task_Read=Mark Task Read
+TaskListNotificationPopup_more=more, Open Task List to view
+
+TaskListNotifier_New_unread_task=New unread task
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java
new file mode 100644
index 0000000..aa5c472
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/Messages.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.preferences.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TasksUiPreferencePage_Advanced;
+
+ public static String TasksUiPreferencePage_Browse_;
+
+ public static String TasksUiPreferencePage_Change_data_directory;
+
+ public static String TasksUiPreferencePage_Confirm_Task_List_data_directory_change;
+
+ public static String TasksUiPreferencePage_Data_directory_;
+
+ public static String TasksUiPreferencePage_Destination_folder_does_not_exist;
+
+ public static String TasksUiPreferencePage_Display_notifications_for_overdue_tasks_and_incoming_changes;
+
+ public static String TasksUiPreferencePage_Enable_inactivity_timeouts;
+
+ public static String TasksUiPreferencePage_Error_applying_Task_List_data_directory_changes;
+
+ public static String TasksUiPreferencePage_Folder_Selection;
+
+ public static String TasksUiPreferencePage_If_disabled;
+
+ public static String TasksUiPreferencePage_minutes;
+
+ public static String TasksUiPreferencePage_minutes_of_inactivity;
+
+ public static String TasksUiPreferencePage_A_new_empty_Task_List_will_be_created_in_the_chosen_directory_if_one_does_not_already_exists;
+
+ public static String TasksUiPreferencePage_Rich_Editor__Recommended_;
+
+ public static String TasksUiPreferencePage_Scheduling;
+
+ public static String TasksUiPreferencePage_See_X_for_configuring_Task_List_colors;
+
+ public static String TasksUiPreferencePage_Specify_the_folder_for_tasks;
+
+ public static String TasksUiPreferencePage_Stop_time_accumulation_after;
+
+ public static String TasksUiPreferencePage_Synchronize_schedule_time_must_be_GT_0;
+
+ public static String TasksUiPreferencePage_Synchronize_schedule_time_must_be_valid_integer;
+
+ public static String TasksUiPreferencePage_Synchronize_with_repositories_every;
+
+ public static String TasksUiPreferencePage_Synchronization;
+
+ public static String TasksUiPreferencePage_Task_Data;
+
+ public static String TasksUiPreferencePage_Task_Data_Directory_Error;
+
+ public static String TasksUiPreferencePage_Task_Editing;
+
+ public static String TasksUiPreferencePage_Task_Timing;
+
+ public static String TasksUiPreferencePage_Use_the_Restore_dialog_to_recover_missing_tasks;
+
+ public static String TasksUiPreferencePage_Web_Browser;
+
+ public static String TasksUiPreferencePage_Week_Start;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java
new file mode 100644
index 0000000..ea58e51
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/TasksUiPreferencePage.java
@@ -0,0 +1,772 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.preferences;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.preference.PreferencePage;
+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;
+import org.eclipse.mylyn.internal.tasks.ui.actions.RestoreTaskListAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.dialogs.PreferenceLinkArea;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TasksUiPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.preferences"; //$NON-NLS-1$
+
+ private static final String FORWARDSLASH = "/"; //$NON-NLS-1$
+
+ private static final String BACKSLASH_MULTI = "\\\\"; //$NON-NLS-1$
+
+ private static final int MS_MINUTES = 60 * 1000;
+
+ private Button useRichEditor;
+
+ private Button useWebBrowser;
+
+ private Text synchScheduleTime = null;
+
+ private Button enableBackgroundSynch;
+
+ private Text taskDirectoryText = null;
+
+ private Button browse = null;
+
+ private Button notificationEnabledButton = null;
+
+ private int taskDataDirectoryAction = -1;
+
+ private final FormToolkit toolkit;
+
+ private Spinner timeoutMinutes;
+
+ private Button timeoutEnabledButton;
+
+ private ExpandableComposite advancedComposite;
+
+ private Combo weekStartCombo;
+
+ public TasksUiPreferencePage() {
+ super();
+ setPreferenceStore(TasksUiPlugin.getDefault().getPreferenceStore());
+ toolkit = new FormToolkit(Display.getCurrent());
+
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+
+ if (getContainer() instanceof IWorkbenchPreferenceContainer) {
+ String message = Messages.TasksUiPreferencePage_See_X_for_configuring_Task_List_colors;
+ new PreferenceLinkArea(container, SWT.NONE, "org.eclipse.ui.preferencePages.ColorsAndFonts", message, //$NON-NLS-1$
+ (IWorkbenchPreferenceContainer) getContainer(), null);
+ }
+
+ createTaskRefreshScheduleGroup(container);
+ createSchedulingGroup(container);
+ createOpenWith(container);
+ Composite advanced = createAdvancedSection(container);
+ createTaskActivityGroup(advanced);
+ createTaskDataControl(advanced);
+ createLinks(container);
+
+ updateRefreshGroupEnablements();
+ applyDialogFont(container);
+ return container;
+ }
+
+ private void createLinks(Composite container) {
+ Hyperlink link = new Hyperlink(container, SWT.NULL);
+ link.setForeground(CommonColors.HYPERLINK_WIDGET);
+ link.setUnderlined(true);
+ link.setText(Messages.TasksUiPreferencePage_Use_the_Restore_dialog_to_recover_missing_tasks);
+ link.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkActivated(HyperlinkEvent e) {
+ getShell().close();
+ new RestoreTaskListAction().run();
+ }
+
+ public void linkEntered(HyperlinkEvent e) {
+ // ignore
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ // ignore
+ }
+
+ });
+ }
+
+ private Composite createAdvancedSection(Composite container) {
+ advancedComposite = toolkit.createExpandableComposite(container, ExpandableComposite.COMPACT
+ | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR);
+ advancedComposite.setFont(container.getFont());
+ advancedComposite.setBackground(container.getBackground());
+ advancedComposite.setText(Messages.TasksUiPreferencePage_Advanced);
+ advancedComposite.setLayout(new GridLayout(1, false));
+ advancedComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ advancedComposite.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ getControl().getShell().pack();
+ }
+ });
+
+ Composite advanced = new Composite(advancedComposite, SWT.NONE);
+ advanced.setLayout(new GridLayout(1, false));
+ advancedComposite.setClient(advanced);
+ return advanced;
+ }
+
+ public void init(IWorkbench workbench) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public boolean performOk() {
+ getPreferenceStore().setValue(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED,
+ notificationEnabledButton.getSelection());
+ //getPreferenceStore().setValue(TasksUiPreferenceConstants.BACKUP_SCHEDULE, backupScheduleTimeText.getText());
+
+ getPreferenceStore().setValue(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH, useRichEditor.getSelection());
+ getPreferenceStore().setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED,
+ enableBackgroundSynch.getSelection());
+ long miliseconds = 60000 * Long.parseLong(synchScheduleTime.getText());
+ getPreferenceStore().setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS,
+ "" + miliseconds); //$NON-NLS-1$
+
+ getPreferenceStore().setValue(ITasksUiPreferenceConstants.WEEK_START_DAY, getWeekStartValue());
+ //getPreferenceStore().setValue(TasksUiPreferenceConstants.PLANNING_STARTHOUR, hourDayStart.getSelection());
+// getPreferenceStore().setValue(TasksUiPreferenceConstants.PLANNING_ENDHOUR, hourDayEnd.getSelection());
+ MonitorUiPlugin.getDefault().getPreferenceStore().setValue(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED,
+ timeoutEnabledButton.getSelection());
+ MonitorUiPlugin.getDefault().getPreferenceStore().setValue(ActivityContextManager.ACTIVITY_TIMEOUT,
+ timeoutMinutes.getSelection() * (60 * 1000));
+ //backupNow.setEnabled(true);
+
+ String taskDirectory = taskDirectoryText.getText();
+ taskDirectory = taskDirectory.replaceAll(BACKSLASH_MULTI, FORWARDSLASH);
+
+ if (!taskDirectory.equals(TasksUiPlugin.getDefault().getDataDirectory())) {
+ if (taskDataDirectoryAction == IDialogConstants.OK_ID) {
+ Exception exception = null;
+ try {
+ TasksUiPlugin.getDefault().setDataDirectory(taskDirectory);
+ } catch (CoreException e) {
+ exception = e;
+ StatusHandler.log(e.getStatus());
+ MessageDialog.openError(getShell(), Messages.TasksUiPreferencePage_Task_Data_Directory_Error,
+ Messages.TasksUiPreferencePage_Error_applying_Task_List_data_directory_changes);
+
+ } catch (OperationCanceledException ce) {
+ exception = ce;
+ }
+ if (exception != null && !taskDirectoryText.isDisposed()) {
+ String originalDirectory = TasksUiPlugin.getDefault().getDefaultDataDirectory();
+ if (!taskDirectory.equals(originalDirectory)) {
+ taskDirectoryText.setText(originalDirectory);
+ }
+ }
+
+ } else if (taskDataDirectoryAction == IDialogConstants.CANCEL_ID) {
+ // shouldn't get here
+ }
+ }
+
+ return true;
+ }
+
+ private int getWeekStartValue() {
+ return weekStartCombo.getSelectionIndex() + 1;
+ }
+
+ @Override
+ public boolean performCancel() {
+ taskDirectoryText.setText(TasksUiPlugin.getDefault().getDefaultDataDirectory());
+ notificationEnabledButton.setSelection(getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED));
+ //backupScheduleTimeText.setText(getPreferenceStore().getString(TasksUiPreferenceConstants.BACKUP_SCHEDULE));
+ //backupFolderText.setText(TasksUiPlugin.getDefault().getBackupFolderPath());
+
+ useRichEditor.setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH));
+
+ // synchQueries.setSelection(getPreferenceStore().getBoolean(
+ // TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP));
+ enableBackgroundSynch.setSelection(getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ synchScheduleTime.setText(getMinutesString());
+
+ weekStartCombo.select(getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1);
+ //hourDayStart.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_STARTHOUR));
+// hourDayEnd.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR));
+ //backupNow.setEnabled(true);
+ int minutes = MonitorUiPlugin.getDefault().getPreferenceStore().getInt(ActivityContextManager.ACTIVITY_TIMEOUT)
+ / MS_MINUTES;
+ timeoutMinutes.setSelection(minutes);
+ timeoutEnabledButton.setSelection(MonitorUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED));
+ return true;
+ }
+
+ @Override
+ public void performDefaults() {
+ super.performDefaults();
+ String taskDirectory = TasksUiPlugin.getDefault().getDefaultDataDirectory();
+ if (!taskDirectory.equals(TasksUiPlugin.getDefault().getDataDirectory())) {
+ checkForExistingTasklist(taskDirectory);
+ if (taskDataDirectoryAction != IDialogConstants.CANCEL_ID) {
+ taskDirectoryText.setText(taskDirectory);
+// backupFolderText.setText(taskDirectory + FORWARDSLASH + ITasksCoreConstants.DEFAULT_BACKUP_FOLDER_NAME);
+// backupNow.setEnabled(false);
+ }
+ } else {
+ taskDirectoryText.setText(taskDirectory);
+// backupFolderText.setText(taskDirectory + FORWARDSLASH + ITasksCoreConstants.DEFAULT_BACKUP_FOLDER_NAME);
+// backupNow.setEnabled(true);
+ }
+
+ notificationEnabledButton.setSelection(getPreferenceStore().getDefaultBoolean(
+ ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED));
+ //backupScheduleTimeText.setText(getPreferenceStore().getDefaultString(TasksUiPreferenceConstants.BACKUP_SCHEDULE));
+
+ useRichEditor.setSelection(getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH));
+
+ // synchQueries.setSelection(getPreferenceStore().getDefaultBoolean(
+ // TaskListPreferenceConstants.REPOSITORY_SYNCH_ON_STARTUP));
+ enableBackgroundSynch.setSelection(getPreferenceStore().getDefaultBoolean(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ // userRefreshOnly.setSelection(!enableBackgroundSynch.getSelection());
+ long miliseconds = getPreferenceStore().getDefaultLong(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS);
+ long minutes = miliseconds / 60000;
+ synchScheduleTime.setText("" + minutes); //$NON-NLS-1$
+ weekStartCombo.select(getPreferenceStore().getDefaultInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1);
+ // hourDayStart.setSelection(getPreferenceStore().getDefaultInt(TasksUiPreferenceConstants.PLANNING_STARTHOUR));
+// hourDayEnd.setSelection(getPreferenceStore().getDefaultInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR));
+ int activityTimeoutMinutes = MonitorUiPlugin.getDefault().getPreferenceStore().getDefaultInt(
+ ActivityContextManager.ACTIVITY_TIMEOUT)
+ / MS_MINUTES;
+ timeoutMinutes.setSelection(activityTimeoutMinutes);
+ timeoutEnabledButton.setSelection(MonitorUiPlugin.getDefault().getPreferenceStore().getDefaultBoolean(
+ ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED));
+ updateRefreshGroupEnablements();
+ }
+
+ private void createTaskRefreshScheduleGroup(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText(Messages.TasksUiPreferencePage_Synchronization);
+ GridLayout gridLayout = new GridLayout(1, false);
+ group.setLayout(gridLayout);
+
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite enableSynch = new Composite(group, SWT.NULL);
+ gridLayout = new GridLayout(4, false);
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ enableSynch.setLayout(gridLayout);
+ enableBackgroundSynch = new Button(enableSynch, SWT.CHECK);
+ enableBackgroundSynch.setText(Messages.TasksUiPreferencePage_Synchronize_with_repositories_every);
+ enableBackgroundSynch.setSelection(getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED));
+ enableBackgroundSynch.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ updateRefreshGroupEnablements();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+ synchScheduleTime = new Text(enableSynch, SWT.BORDER | SWT.RIGHT);
+ GridData gridData = new GridData();
+ gridData.widthHint = 25;
+ synchScheduleTime.setLayoutData(gridData);
+ synchScheduleTime.setText(getMinutesString());
+ synchScheduleTime.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateRefreshGroupEnablements();
+ }
+ });
+ Label label = new Label(enableSynch, SWT.NONE);
+ label.setText(Messages.TasksUiPreferencePage_minutes);
+
+ notificationEnabledButton = new Button(group, SWT.CHECK);
+ notificationEnabledButton.setText(Messages.TasksUiPreferencePage_Display_notifications_for_overdue_tasks_and_incoming_changes);
+ notificationEnabledButton.setSelection(getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED));
+
+ }
+
+ private void createOpenWith(Composite parent) {
+ Group container = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ container.setLayout(new GridLayout(3, false));
+ container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ container.setText(Messages.TasksUiPreferencePage_Task_Editing);
+ useRichEditor = new Button(container, SWT.RADIO);
+ useRichEditor.setText(Messages.TasksUiPreferencePage_Rich_Editor__Recommended_);
+ useRichEditor.setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH));
+ useWebBrowser = new Button(container, SWT.RADIO);
+ useWebBrowser.setText(Messages.TasksUiPreferencePage_Web_Browser);
+ useWebBrowser.setSelection(!getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH));
+ }
+
+ private void createTaskDataControl(Composite parent) {
+
+ Group taskDataGroup = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ taskDataGroup.setText(Messages.TasksUiPreferencePage_Task_Data);
+ taskDataGroup.setLayout(new GridLayout(1, false));
+ taskDataGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite dataDirComposite = new Composite(taskDataGroup, SWT.NULL);
+ GridLayout gridLayout = new GridLayout(3, false);
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ dataDirComposite.setLayout(gridLayout);
+ dataDirComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label label = new Label(dataDirComposite, SWT.NULL);
+ label.setText(Messages.TasksUiPreferencePage_Data_directory_);
+
+ String taskDirectory = TasksUiPlugin.getDefault().getDataDirectory();
+ taskDirectory = taskDirectory.replaceAll(BACKSLASH_MULTI, FORWARDSLASH);
+ taskDirectoryText = new Text(dataDirComposite, SWT.BORDER);
+ taskDirectoryText.setText(taskDirectory);
+ taskDirectoryText.setEditable(false);
+ taskDirectoryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ browse = new Button(dataDirComposite, SWT.TRAIL);
+ browse.setText(Messages.TasksUiPreferencePage_Browse_);
+ browse.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dialog = new DirectoryDialog(getShell());
+ dialog.setText(Messages.TasksUiPreferencePage_Folder_Selection);
+ dialog.setMessage(Messages.TasksUiPreferencePage_Specify_the_folder_for_tasks);
+ String dir = taskDirectoryText.getText();
+ dir = dir.replaceAll(BACKSLASH_MULTI, FORWARDSLASH);
+ dialog.setFilterPath(dir);
+
+ dir = dialog.open();
+ if (dir == null || dir.equals("")) { //$NON-NLS-1$
+ return;
+ }
+ dir = dir.replaceAll(BACKSLASH_MULTI, FORWARDSLASH);
+ checkForExistingTasklist(dir);
+
+ if (taskDataDirectoryAction != IDialogConstants.CANCEL_ID) {
+ taskDirectoryText.setText(dir);
+// backupFolderText.setText(dir + FORWARDSLASH + ITasksCoreConstants.DEFAULT_BACKUP_FOLDER_NAME);
+// backupNow.setEnabled(false);
+ }
+ }
+
+ });
+
+// Composite backupComposite = new Composite(taskDataGroup, SWT.NULL);
+// gridLayout = new GridLayout(5, false);
+// gridLayout.marginWidth = 0;
+// gridLayout.marginHeight = 0;
+// backupComposite.setLayout(gridLayout);
+// backupComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+// label = new Label(backupComposite, SWT.NULL);
+// label.setText("Backup every");
+// backupScheduleTimeText = new Text(backupComposite, SWT.BORDER | SWT.RIGHT);
+// final GridData gridData_1 = new GridData();
+// gridData_1.widthHint = 13;
+// backupScheduleTimeText.setLayoutData(gridData_1);
+//
+// backupScheduleTimeText.setText("" + getPreferenceStore().getInt(TasksUiPreferenceConstants.BACKUP_SCHEDULE));
+// backupScheduleTimeText.addModifyListener(new ModifyListener() {
+// public void modifyText(ModifyEvent e) {
+// updateRefreshGroupEnablements();
+// }
+// });
+//
+// label = new Label(backupComposite, SWT.NONE);
+// label.setText("days to");
+
+// String backupDirectory = TasksUiPlugin.getDefault().getBackupFolderPath();// getPreferenceStore().getString(TaskListPreferenceConstants.BACKUP_FOLDER);
+// backupDirectory = backupDirectory.replaceAll(BACKSLASH_MULTI, FORWARDSLASH);
+// backupFolderText = new Text(backupComposite, SWT.BORDER);
+// backupFolderText.setText(backupDirectory);
+// backupFolderText.setEditable(false);
+// backupFolderText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+//
+// backupNow = new Button(backupComposite, SWT.NONE);
+// backupNow.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+// backupNow.setText("Backup Now");
+// backupNow.addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// TasksUiPlugin.getBackupManager().backupNow(true);
+// }
+// });
+ }
+
+ private void createSchedulingGroup(Composite container) {
+ Group group = new Group(container, SWT.SHADOW_ETCHED_IN);
+ group.setText(Messages.TasksUiPreferencePage_Scheduling);
+ group.setLayout(new GridLayout(5, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label weekStartLabel = new Label(group, SWT.NONE);
+ weekStartLabel.setText(Messages.TasksUiPreferencePage_Week_Start);
+ weekStartCombo = new Combo(group, SWT.READ_ONLY);
+ // Note: Calendar.SUNDAY = 1
+// 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.select(getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1);
+
+// Label workWeekBeginLabel = new Label(group, SWT.NONE);
+// workWeekBeginLabel.setText(START_DAY_LABEL);
+// workWeekBegin = new Combo(group, SWT.READ_ONLY);
+// // Calendar.SUNDAY = 1
+// workWeekBegin.add("SUNDAY");
+// workWeekBegin.add("MONDAY");
+// workWeekBegin.add("TUESDAY");
+// workWeekBegin.add("WEDNESDAY");
+// workWeekBegin.add("THURSDAY");
+// workWeekBegin.add("FRIDAY");
+// workWeekBegin.add("SATURDAY");
+// workWeekBegin.select(getPreferenceStore().getInt(TaskListPreferenceConstants.PLANNING_STARTDAY)
+// - 1);
+
+// Label workWeekEndLabel = new Label(group, SWT.NONE);
+// workWeekEndLabel.setText(END_DAY_LABEL);
+// workWeekEnd = new Combo(group, SWT.READ_ONLY);
+// workWeekEnd.add("SUNDAY");
+// workWeekEnd.add("MONDAY");
+// workWeekEnd.add("TUESDAY");
+// workWeekEnd.add("WEDNESDAY");
+// workWeekEnd.add("THURSDAY");
+// workWeekEnd.add("FRIDAY");
+// workWeekEnd.add("SATURDAY");
+// workWeekEnd.select(getPreferenceStore().getInt(TaskListPreferenceConstants.PLANNING_ENDDAY)
+// - 1);
+
+// Label hourDayStartLabel = new Label(group, SWT.NONE);
+// hourDayStartLabel.setText(START_HOUR_LABEL);
+// hourDayStart = new Spinner(group, SWT.BORDER);
+// hourDayStart.setDigits(0);
+// hourDayStart.setIncrement(1);
+// hourDayStart.setMaximum(23);
+// hourDayStart.setMinimum(0);
+// hourDayStart.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_STARTHOUR));
+// hourDayStart.addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// updateRefreshGroupEnablements();
+// }
+//
+// });
+//
+// Label spacer = new Label(group, SWT.NONE);
+// GridDataFactory.fillDefaults().hint(40, SWT.DEFAULT).applyTo(spacer);
+//
+// Label hourDayEndLabel = new Label(group, SWT.NONE);
+// hourDayEndLabel.setText(END_HOUR_LABEL);
+//
+// hourDayEnd = new Spinner(group, SWT.BORDER);
+// hourDayEnd.setDigits(0);
+// hourDayEnd.setIncrement(1);
+// hourDayEnd.setMaximum(23);
+// hourDayEnd.setMinimum(0);
+// hourDayEnd.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR));
+// hourDayEnd.addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// updateRefreshGroupEnablements();
+// }
+//
+// });
+
+ }
+
+ private void createTaskActivityGroup(Composite container) {
+ Group group = new Group(container, SWT.SHADOW_ETCHED_IN);
+ group.setText(Messages.TasksUiPreferencePage_Task_Timing);
+ group.setLayout(new GridLayout(3, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ boolean timeoutEnabled = MonitorUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED);
+
+ timeoutEnabledButton = new Button(group, SWT.CHECK);
+ timeoutEnabledButton.setText(Messages.TasksUiPreferencePage_Enable_inactivity_timeouts);
+ timeoutEnabledButton.setSelection(timeoutEnabled);
+ timeoutEnabledButton.setToolTipText(Messages.TasksUiPreferencePage_If_disabled);
+ timeoutEnabledButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateRefreshGroupEnablements();
+ }
+ });
+ GridDataFactory.swtDefaults().span(3, 1).applyTo(timeoutEnabledButton);
+
+ Label timeoutLabel = new Label(group, SWT.NONE);
+ timeoutLabel.setText(Messages.TasksUiPreferencePage_Stop_time_accumulation_after);
+ timeoutMinutes = new Spinner(group, SWT.BORDER);
+ timeoutMinutes.setDigits(0);
+ timeoutMinutes.setIncrement(5);
+ timeoutMinutes.setMaximum(60);
+ timeoutMinutes.setMinimum(1);
+ long minutes = MonitorUiPlugin.getDefault().getPreferenceStore().getLong(
+ ActivityContextManager.ACTIVITY_TIMEOUT)
+ / MS_MINUTES;
+ timeoutMinutes.setSelection((int) minutes);
+ timeoutMinutes.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateRefreshGroupEnablements();
+ }
+
+ });
+
+ timeoutLabel = new Label(group, SWT.NONE);
+ timeoutLabel.setText(Messages.TasksUiPreferencePage_minutes_of_inactivity);
+
+// Label spacer = new Label(group, SWT.NONE);
+// GridDataFactory.fillDefaults().hint(40, SWT.DEFAULT).applyTo(spacer);
+//
+// Label hourDayEndLabel = new Label(group, SWT.NONE);
+// hourDayEndLabel.setText(END_HOUR_LABEL);
+//
+// hourDayEnd = new Spinner(group, SWT.BORDER);
+// hourDayEnd.setDigits(0);
+// hourDayEnd.setIncrement(1);
+// hourDayEnd.setMaximum(23);
+// hourDayEnd.setMinimum(0);
+// hourDayEnd.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR));
+// hourDayEnd.addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// updateRefreshGroupEnablements();
+// }
+//
+// });
+
+ }
+
+// private void createSchedulingGroup(Composite container) {
+// Group group = new Group(container, SWT.SHADOW_ETCHED_IN);
+// group.setText(GROUP_WORK_WEEK_LABEL);
+// group.setLayout(new GridLayout(5, false));
+// group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+//
+// // Label workWeekBeginLabel = new Label(group, SWT.NONE);
+// // workWeekBeginLabel.setText(START_DAY_LABEL);
+// // workWeekBegin = new Combo(group, SWT.READ_ONLY);
+// // // Calendar.SUNDAY = 1
+// // workWeekBegin.add("SUNDAY");
+// // workWeekBegin.add("MONDAY");
+// // workWeekBegin.add("TUESDAY");
+// // workWeekBegin.add("WEDNESDAY");
+// // workWeekBegin.add("THURSDAY");
+// // workWeekBegin.add("FRIDAY");
+// // workWeekBegin.add("SATURDAY");
+// // workWeekBegin.select(getPreferenceStore().getInt(TaskListPreferenceConstants.PLANNING_STARTDAY)
+// // - 1);
+// //
+// // Label workWeekEndLabel = new Label(group, SWT.NONE);
+// // workWeekEndLabel.setText(END_DAY_LABEL);
+// // workWeekEnd = new Combo(group, SWT.READ_ONLY);
+// // workWeekEnd.add("SUNDAY");
+// // workWeekEnd.add("MONDAY");
+// // workWeekEnd.add("TUESDAY");
+// // workWeekEnd.add("WEDNESDAY");
+// // workWeekEnd.add("THURSDAY");
+// // workWeekEnd.add("FRIDAY");
+// // workWeekEnd.add("SATURDAY");
+// // workWeekEnd.select(getPreferenceStore().getInt(TaskListPreferenceConstants.PLANNING_ENDDAY)
+// // - 1);
+//
+// Label hourDayStartLabel = new Label(group, SWT.NONE);
+// hourDayStartLabel.setText(START_HOUR_LABEL);
+// hourDayStart = new Spinner(group, SWT.BORDER);
+// hourDayStart.setDigits(0);
+// hourDayStart.setIncrement(1);
+// hourDayStart.setMaximum(23);
+// hourDayStart.setMinimum(0);
+// hourDayStart.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_STARTHOUR));
+// hourDayStart.addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// updateRefreshGroupEnablements();
+// }
+//
+// });
+//
+// Label spacer = new Label(group, SWT.NONE);
+// GridDataFactory.fillDefaults().hint(40, SWT.DEFAULT).applyTo(spacer);
+//
+// Label hourDayEndLabel = new Label(group, SWT.NONE);
+// hourDayEndLabel.setText(END_HOUR_LABEL);
+//
+// hourDayEnd = new Spinner(group, SWT.BORDER);
+// hourDayEnd.setDigits(0);
+// hourDayEnd.setIncrement(1);
+// hourDayEnd.setMaximum(23);
+// hourDayEnd.setMinimum(0);
+// hourDayEnd.setSelection(getPreferenceStore().getInt(TasksUiPreferenceConstants.PLANNING_ENDHOUR));
+// hourDayEnd.addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// updateRefreshGroupEnablements();
+// }
+//
+// });
+//
+// }
+
+ public void updateRefreshGroupEnablements() {
+ String errorMessage = null;
+
+// try {
+// long number = Integer.parseInt(backupScheduleTimeText.getText());
+// if (number <= 0) {
+// errorMessage = "Backup schedule time must be > 0";
+// } else if (backupFolderText.getText() == "") {
+// errorMessage = "Backup destination folder must be specified";
+// }
+// } catch (NumberFormatException e) {
+// errorMessage = "Backup schedule time must be valid integer";
+// }
+
+ if (enableBackgroundSynch.getSelection()) {
+ try {
+ long number = Long.parseLong(synchScheduleTime.getText());
+ if (number <= 0) {
+ errorMessage = Messages.TasksUiPreferencePage_Synchronize_schedule_time_must_be_GT_0;
+ }
+ } catch (NumberFormatException e) {
+ errorMessage = Messages.TasksUiPreferencePage_Synchronize_schedule_time_must_be_valid_integer;
+ }
+ }
+
+// if (hourDayEnd.getSelection() <= hourDayStart.getSelection()) {
+// errorMessage = "Planning: Work day start must be before end.";
+// }
+
+ setErrorMessage(errorMessage);
+ setValid(errorMessage == null);
+
+ synchScheduleTime.setEnabled(enableBackgroundSynch.getSelection());
+
+ timeoutMinutes.setEnabled(timeoutEnabledButton.getSelection());
+
+ }
+
+ private String getMinutesString() {
+ long miliseconds = getPreferenceStore().getLong(
+ ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS);
+ long minutes = miliseconds / 60000;
+ return "" + minutes; //$NON-NLS-1$
+ }
+
+ private void checkForExistingTasklist(String dir) {
+ File newDataFolder = new File(dir);
+ if (newDataFolder.exists()) {
+
+ MessageDialog dialogConfirm = new MessageDialog(
+ null,
+ Messages.TasksUiPreferencePage_Confirm_Task_List_data_directory_change,
+ null,
+ Messages.TasksUiPreferencePage_A_new_empty_Task_List_will_be_created_in_the_chosen_directory_if_one_does_not_already_exists,
+ MessageDialog.WARNING, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL },
+ IDialogConstants.CANCEL_ID);
+ taskDataDirectoryAction = dialogConfirm.open();
+
+ for (TaskEditor taskEditor : TasksUiInternal.getActiveRepositoryTaskEditors()) {
+ TasksUiInternal.closeTaskEditorInAllPages(taskEditor.getTaskEditorInput().getTask(), true);
+ }
+
+ } else {
+ MessageDialog.openWarning(getControl().getShell(), Messages.TasksUiPreferencePage_Change_data_directory,
+ Messages.TasksUiPreferencePage_Destination_folder_does_not_exist);
+ }
+ }
+
+ @Override
+ public void dispose() {
+ if (toolkit != null) {
+ if (toolkit.getColors() != null) {
+ toolkit.dispose();
+ }
+ }
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties
new file mode 100644
index 0000000..407438f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/preferences/messages.properties
@@ -0,0 +1,30 @@
+TasksUiPreferencePage_Advanced=Advanced
+TasksUiPreferencePage_Browse_=Browse...
+TasksUiPreferencePage_Change_data_directory=Change data directory
+TasksUiPreferencePage_Confirm_Task_List_data_directory_change=Confirm Task List data directory change
+TasksUiPreferencePage_Data_directory_=Data directory:
+TasksUiPreferencePage_Destination_folder_does_not_exist=Destination folder does not exist.
+TasksUiPreferencePage_Display_notifications_for_overdue_tasks_and_incoming_changes=Display notifications for overdue tasks and incoming changes
+TasksUiPreferencePage_Enable_inactivity_timeouts=Enable inactivity timeouts
+TasksUiPreferencePage_Error_applying_Task_List_data_directory_changes=Error applying Task List data directory changes. The previous setting will be restored.
+TasksUiPreferencePage_Folder_Selection=Folder Selection
+TasksUiPreferencePage_If_disabled=If disabled, time accumulates while a task is active with no timeout due to inactivity.
+TasksUiPreferencePage_minutes=minutes
+TasksUiPreferencePage_minutes_of_inactivity=minutes of inactivity.
+TasksUiPreferencePage_A_new_empty_Task_List_will_be_created_in_the_chosen_directory_if_one_does_not_already_exists=A new empty Task List will be created in the chosen directory if one does not already exists. Your previous directory and its contents will not be deleted.\n\nProceed?
+TasksUiPreferencePage_Rich_Editor__Recommended_=Rich Editor (Recommended)
+TasksUiPreferencePage_Scheduling=Scheduling
+TasksUiPreferencePage_See_X_for_configuring_Task_List_colors=See <a>''{0}''</a> for configuring Task List colors.
+TasksUiPreferencePage_Specify_the_folder_for_tasks=Specify the folder for tasks
+TasksUiPreferencePage_Stop_time_accumulation_after=Stop time accumulation after
+TasksUiPreferencePage_Synchronize_schedule_time_must_be_GT_0=Synchronize schedule time must be > 0
+TasksUiPreferencePage_Synchronize_schedule_time_must_be_valid_integer=Synchronize schedule time must be valid integer
+TasksUiPreferencePage_Synchronize_with_repositories_every=Synchronize with repositories every
+TasksUiPreferencePage_Synchronization=Synchronization
+TasksUiPreferencePage_Task_Data=Task Data
+TasksUiPreferencePage_Task_Data_Directory_Error=Task Data Directory Error
+TasksUiPreferencePage_Task_Editing=Task Editing
+TasksUiPreferencePage_Task_Timing=Task Timing
+TasksUiPreferencePage_Use_the_Restore_dialog_to_recover_missing_tasks=Use the Restore dialog to recover missing tasks
+TasksUiPreferencePage_Web_Browser=Web Browser
+TasksUiPreferencePage_Week_Start=Week Start:
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/Messages.java
new file mode 100644
index 0000000..3a40d71
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.properties;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.properties.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ProjectTaskRepositoryPage_Select_a_task_repository_to_associate_with_this_project_below;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/ProjectPropertiesLinkProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/ProjectPropertiesLinkProvider.java
new file mode 100644
index 0000000..79f5886
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/ProjectPropertiesLinkProvider.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider;
+import org.osgi.service.prefs.BackingStoreException;
+
+/**
+ * Default Task Repository link provider
+ *
+ * @author Eugene Kuleshov
+ */
+public class ProjectPropertiesLinkProvider extends AbstractTaskRepositoryLinkProvider {
+
+ private static final String PROPERTY_PREFIX = "project.repository"; //$NON-NLS-1$
+
+ private static final String PROJECT_REPOSITORY_KIND = PROPERTY_PREFIX + ".kind"; //$NON-NLS-1$
+
+ private static final String PROJECT_REPOSITORY_URL = PROPERTY_PREFIX + ".url"; //$NON-NLS-1$
+
+ @Override
+ public TaskRepository getTaskRepository(IResource resource, IRepositoryManager repositoryManager) {
+ IProject project = resource.getProject();
+ if (project == null || !project.isAccessible()) {
+ return null;
+ }
+
+ IScopeContext projectScope = new ProjectScope(project);
+ IEclipsePreferences projectNode = projectScope.getNode(TasksUiPlugin.ID_PLUGIN);
+ if (projectNode != null) {
+ String kind = projectNode.get(PROJECT_REPOSITORY_KIND, ""); //$NON-NLS-1$
+ String urlString = projectNode.get(PROJECT_REPOSITORY_URL, ""); //$NON-NLS-1$
+ return repositoryManager.getRepository(kind, urlString);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean canSetTaskRepository(IResource resource) {
+ IProject project = resource.getProject();
+ return project != null && project.isAccessible();
+ }
+
+ @Override
+ public boolean setTaskRepository(IResource resource, TaskRepository repository) {
+ IProject project = resource.getProject();
+ if (project == null || !project.isAccessible()) {
+ return false;
+ }
+
+ IScopeContext projectScope = new ProjectScope(project);
+ IEclipsePreferences projectNode = projectScope.getNode(TasksUiPlugin.ID_PLUGIN);
+ if (projectNode != null) {
+ if (repository != null) {
+ projectNode.put(PROJECT_REPOSITORY_KIND, repository.getConnectorKind());
+ projectNode.put(PROJECT_REPOSITORY_URL, repository.getRepositoryUrl());
+ } else {
+ projectNode.remove(PROJECT_REPOSITORY_KIND);
+ projectNode.remove(PROJECT_REPOSITORY_URL);
+ }
+ try {
+ projectNode.flush();
+ return true;
+ } catch (BackingStoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to save task repository to project association preference", e)); //$NON-NLS-1$
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/ProjectTaskRepositoryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/ProjectTaskRepositoryPage.java
new file mode 100644
index 0000000..8ef28d2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/ProjectTaskRepositoryPage.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.internal.dialogs.DialogUtil;
+
+/**
+ * A property page that support per project configuration of an associated task repository.
+ *
+ * @author Rob Elves
+ * @see Adapted from org.eclipse.ui.internal.ide.dialogs.ProjectReferencePage
+ */
+public class ProjectTaskRepositoryPage extends PropertyPage {
+
+ private static final int REPOSITORY_LIST_MULTIPLIER = 30;
+
+ private IProject project;
+
+ private boolean modified = false;
+
+ private CheckboxTableViewer listViewer;
+
+ public ProjectTaskRepositoryPage() {
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+
+ Font font = parent.getFont();
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ composite.setFont(font);
+
+ initialize();
+
+ Label description = createDescriptionLabel(composite);
+ description.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ listViewer = CheckboxTableViewer.newCheckList(composite, SWT.TOP | SWT.BORDER);
+ listViewer.getTable().setFont(font);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.grabExcessHorizontalSpace = true;
+
+ // Only set a height hint if it will not result in a cut off dialog
+ if (DialogUtil.inRegularFontMode(parent)) {
+ data.heightHint = getDefaultFontHeight(listViewer.getTable(), REPOSITORY_LIST_MULTIPLIER);
+ }
+ listViewer.getTable().setLayoutData(data);
+ listViewer.getTable().setFont(font);
+
+ listViewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
+ listViewer.setContentProvider(new IStructuredContentProvider() {
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ return TasksUi.getRepositoryManager().getAllRepositories().toArray();
+ }
+
+ });
+
+ listViewer.setSorter(new TaskRepositoriesSorter());
+ listViewer.setInput(project.getWorkspace());
+
+ listViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ if (event.getChecked()) {
+ // only allow single selection
+ listViewer.setAllChecked(false);
+ listViewer.setChecked(event.getElement(), event.getChecked());
+ }
+ modified = true;
+ }
+ });
+ updateLinkedRepository();
+
+ // TODO this code was copied from SelectRepositoryPage
+ final AddRepositoryAction action = new AddRepositoryAction();
+ action.setPromptToAddQuery(false);
+
+ Button button = new Button(composite, SWT.NONE);
+ button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+ button.setText(AddRepositoryAction.TITLE);
+ button.setEnabled(action.isEnabled());
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ TaskRepository taskRepository = action.showWizard();
+ if (taskRepository != null) {
+ listViewer.setInput(project.getWorkspace());
+ listViewer.setSelection(new StructuredSelection(taskRepository));
+ updateLinkedRepository();
+ }
+ }
+ });
+
+ return composite;
+ }
+
+ void updateLinkedRepository() {
+ TaskRepository repository = TasksUiPlugin.getDefault().getRepositoryForResource(project);
+ if (repository != null) {
+ listViewer.setCheckedElements(new Object[] { repository });
+ }
+ listViewer.getControl().setEnabled(TasksUiPlugin.getDefault().canSetRepositoryForResource(project));
+ }
+
+ private static int getDefaultFontHeight(Control control, int lines) {
+ FontData[] viewerFontData = control.getFont().getFontData();
+ int fontHeight = 10;
+
+ // If we have no font data use our guess
+ if (viewerFontData.length > 0) {
+ fontHeight = viewerFontData[0].getHeight();
+ }
+ return lines * fontHeight;
+
+ }
+
+ private void initialize() {
+ project = (IProject) getElement().getAdapter(IResource.class);
+ noDefaultAndApplyButton();
+ setDescription(Messages.ProjectTaskRepositoryPage_Select_a_task_repository_to_associate_with_this_project_below);
+ }
+
+ @Override
+ public boolean performOk() {
+ if (!modified) {
+ return true;
+ }
+ if (listViewer.getCheckedElements().length > 0) {
+ TaskRepository selectedRepository = (TaskRepository) listViewer.getCheckedElements()[0];
+ TasksUiPlugin.getDefault().setRepositoryForResource(project, selectedRepository);
+ } else {
+ TasksUiPlugin.getDefault().setRepositoryForResource(project, null);
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/messages.properties
new file mode 100644
index 0000000..f3b4724
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/properties/messages.properties
@@ -0,0 +1 @@
+ProjectTaskRepositoryPage_Select_a_task_repository_to_associate_with_this_project_below=Select a task repository to associate with this project below:
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/CreateQueryFromSearchAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/CreateQueryFromSearchAction.java
new file mode 100644
index 0000000..cd9dcbb
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/CreateQueryFromSearchAction.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Balazs Brinkus - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.search;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Used for add the last search result to the Task List.
+ *
+ * @author Balazs Brinkus (bug 172699)
+ * @author Mik Kersten
+ */
+public class CreateQueryFromSearchAction extends Action {
+
+ /** The view this action works on */
+ private final RepositorySearchResultView resultView;
+
+ /**
+ * Constructor
+ *
+ * @param text
+ * The text for this action
+ * @param resultView
+ * The <code>RepositorySearchResultView</code> this action works on
+ */
+ public CreateQueryFromSearchAction(String text, RepositorySearchResultView resultView) {
+ setText(text);
+ setImageDescriptor(TasksUiImages.QUERY_NEW);
+ this.resultView = resultView;
+ }
+
+ /**
+ * Add the search result to the Task List.
+ */
+ @Override
+ public void run() {
+ ISelection selection = resultView.getViewer().getSelection();
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ if (structuredSelection.getFirstElement() instanceof ITask) {
+ ISearchQuery[] queries = NewSearchUI.getQueries();
+ ITask task = (ITask) structuredSelection.getFirstElement();
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ if (queries.length != 0 && connector != null) {
+ SearchHitCollector searchHitCollector = (SearchHitCollector) queries[0];
+ IRepositoryQuery query = searchHitCollector.getRepositoryQuery();
+ InputDialog dialog = new InputDialog(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getShell(), Messages.CreateQueryFromSearchAction_CLEAR_QUERY, MessageFormat.format(
+ Messages.CreateQueryFromSearchAction_Name_of_query_to_be_added_to_the_X, TaskListView.LABEL_VIEW)
+ + ": ", "", null); //$NON-NLS-1$ //$NON-NLS-2$
+ int dialogResult = dialog.open();
+ if (dialogResult == Window.OK) {
+ query.setSummary(dialog.getValue());
+ TasksUiInternal.getTaskList().addQuery((RepositoryQuery) query);
+ TasksUiInternal.synchronizeQuery(connector, (RepositoryQuery) query, null, true);
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/Messages.java
new file mode 100644
index 0000000..ac80ae0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/Messages.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.search.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String CreateQueryFromSearchAction_CLEAR_QUERY;
+
+ public static String CreateQueryFromSearchAction_Name_of_query_to_be_added_to_the_X;
+
+ public static String RepositorySearchResult_Task_search_X_matches;
+
+ public static String RepositorySearchResult_Task_search_1_match;
+
+ public static String RepositorySearchResultView_Add_to_X_Category;
+
+ public static String RepositorySearchResultView_Create_Query_from_Search_;
+
+ public static String RepositorySearchResultView_Filter_Completed_Tasks;
+
+ public static String RepositorySearchResultView_Group_By_Owner;
+
+ public static String RepositorySearchResultView_Open_in_Editor;
+
+ public static String RepositorySearchResultView_Open_Search_with_Browser_Label;
+
+ public static String RepositorySearchResultView_Refine_Search_;
+
+ public static String SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded;
+
+ public static String SearchHitCollector_Querying_Repository_;
+
+ public static String SearchHitCollector_Repository_connector_could_not_be_found;
+
+ public static String SearchHitCollector_Search_failed;
+
+ public static String SearchHitCollector_Search_cancelled;
+
+ public static String SearchHitCollector_Search_returned_maximum_number_of_hits;
+
+ public static String SearchResultsLabelProvider_OF;
+
+ public static String SearchResultTreeContentProvider_Complete;
+
+ public static String SearchResultTreeContentProvider_Incomplete;
+
+ public static String SearchResultTreeContentProvider__unknown_;
+
+ public static String SearchResultSortAction_Sort_Label;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/OpenSearchResultAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/OpenSearchResultAction.java
new file mode 100644
index 0000000..605389d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/OpenSearchResultAction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * This class is used to open a bug report in an editor.
+ */
+public class OpenSearchResultAction extends Action {
+
+ /** The view this action works on */
+ private final RepositorySearchResultView resultView;
+
+ /**
+ * Constructor
+ *
+ * @param text
+ * The text for this action
+ * @param resultView
+ * The <code>RepositorySearchResultView</code> this action works on
+ */
+ public OpenSearchResultAction(String text, RepositorySearchResultView resultView) {
+ setText(text);
+ this.resultView = resultView;
+ }
+
+ /**
+ * Open the selected bug reports in their own editors.
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void run() {
+ // Get the selected items
+ ISelection s = resultView.getViewer().getSelection();
+ if (s instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) s;
+
+ // go through each of the selected items and show it in an editor
+ for (Iterator<AbstractTask> it = selection.iterator(); it.hasNext();) {
+ AbstractTask repositoryHit = it.next();
+ TasksUiUtil.openTask(repositoryHit.getRepositoryUrl(), repositoryHit.getTaskId(),
+ repositoryHit.getUrl());
+ }
+
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResult.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResult.java
new file mode 100644
index 0000000..4de34d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResult.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.search.internal.ui.SearchPluginImages;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.IEditorMatchAdapter;
+import org.eclipse.search.ui.text.IFileMatchAdapter;
+
+/**
+ * Captures the results of a task repository search.
+ *
+ * @author Rob Elves
+ * @see org.eclipse.search.ui.text.AbstractTextSearchResult
+ * @since 2.0
+ */
+public class RepositorySearchResult extends AbstractTextSearchResult {
+
+ /**
+ * The query producing this result.
+ */
+ private final ISearchQuery repositoryQuery;
+
+ /**
+ * Constructor for <code>RepositorySearchResult</code> class.
+ *
+ * @param query
+ * <code>AbstractRepositorySearchQuery</code> that is producing this result.
+ */
+ public RepositorySearchResult(ISearchQuery query) {
+ repositoryQuery = query;
+ }
+
+ @Override
+ public IEditorMatchAdapter getEditorMatchAdapter() {
+ return null;
+ }
+
+ /**
+ * This function always returns <code>null</code>, as the matches for this implementation of
+ * <code>AbstractTextSearchResult</code> never contain files.
+ *
+ * @see org.eclipse.search.ui.text.AbstractTextSearchResult#getFileMatchAdapter()
+ */
+ @Override
+ public IFileMatchAdapter getFileMatchAdapter() {
+ return null;
+ }
+
+ public String getLabel() {
+ return getMatchCount() == 1 ? getSingularLabel() : getPluralLabel();
+ }
+
+ /**
+ * Get the singular label for the number of results
+ *
+ * @return The singular label
+ */
+ protected String getSingularLabel() {
+ return Messages.RepositorySearchResult_Task_search_1_match;
+ }
+
+ /**
+ * Get the plural label for the number of results
+ *
+ * @return The plural label
+ */
+ protected String getPluralLabel() {
+ return MessageFormat.format(Messages.RepositorySearchResult_Task_search_X_matches, getMatchCount());
+ }
+
+ public String getTooltip() {
+ return getLabel();
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return SearchPluginImages.DESC_OBJ_TSEARCH_DPDN;
+ }
+
+ public ISearchQuery getQuery() {
+ return repositoryQuery;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java
new file mode 100644
index 0000000..5936434
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/RepositorySearchResultView.java
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.search;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.internal.provisional.commons.ui.EnhancedFilteredTree;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SubstringPatternFilter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.AddExistingTaskJob;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskSearchAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenWithBrowserAction;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchResultTreeContentProvider.GroupBy;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListToolTip;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.search.ui.IContextMenuConstants;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * Displays the results of a Repository search.
+ *
+ * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class RepositorySearchResultView extends AbstractTextSearchViewPage implements IAdaptable {
+
+ private class GroupingAction extends Action {
+
+ private final GroupBy groupBy;
+
+ public GroupingAction(String text, GroupBy groupBy) {
+ super(text, IAction.AS_CHECK_BOX);
+ this.groupBy = groupBy;
+ groupingActions.add(this);
+ }
+
+ @Override
+ public void run() {
+ for (GroupingAction action : groupingActions) {
+ action.setChecked(false);
+ }
+
+ SearchResultTreeContentProvider contentProvider = (SearchResultTreeContentProvider) getViewer().getContentProvider();
+ if (contentProvider.getSelectedGroup() == groupBy) {
+ contentProvider.setSelectedGroup(GroupBy.NONE);
+ } else {
+ contentProvider.setSelectedGroup(groupBy);
+ setChecked(true);
+ }
+ getViewer().refresh();
+ }
+ }
+
+ private class FilteringAction extends Action {
+
+ private final ViewerFilter filter;
+
+ public FilteringAction(String text, ViewerFilter filter) {
+ super(text, IAction.AS_CHECK_BOX);
+ this.filter = filter;
+ filterActions.add(this);
+ }
+
+ @Override
+ public void runWithEvent(Event event) {
+ if (isChecked()) {
+ getViewer().addFilter(filter);
+ } else {
+ getViewer().removeFilter(filter);
+ }
+ }
+ }
+
+ private static final String MEMENTO_KEY_SORT = "sort"; //$NON-NLS-1$
+
+ private SearchResultContentProvider searchResultProvider;
+
+ private final OpenSearchResultAction openInEditorAction;
+
+ private final CreateQueryFromSearchAction createQueryAction;
+
+ private final Action refineSearchAction;
+
+ private static final String[] SHOW_IN_TARGETS = new String[] { ITasksUiConstants.ID_VIEW_TASKS };
+
+ private TaskListToolTip toolTip;
+
+ private final List<GroupingAction> groupingActions;
+
+ private final List<FilteringAction> filterActions;
+
+ private final OpenWithBrowserAction openSearchWithBrowserAction;
+
+ private final SearchResultSorter searchResultSorter;
+
+ private SearchResultSortAction sortByDialogAction;
+
+ private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
+ public String[] getShowInTargetIds() {
+ return SHOW_IN_TARGETS;
+ }
+ };
+
+ public RepositorySearchResultView() {
+ // Only use the table layout.
+ super(FLAG_LAYOUT_TREE);
+
+ openInEditorAction = new OpenSearchResultAction(Messages.RepositorySearchResultView_Open_in_Editor, this);
+ createQueryAction = new CreateQueryFromSearchAction(
+ Messages.RepositorySearchResultView_Create_Query_from_Search_, this);
+ refineSearchAction = new OpenTaskSearchAction();
+ refineSearchAction.setText(Messages.RepositorySearchResultView_Refine_Search_);
+ openSearchWithBrowserAction = new OpenWithBrowserAction();
+ openSearchWithBrowserAction.setText(Messages.RepositorySearchResultView_Open_Search_with_Browser_Label);
+
+ groupingActions = new ArrayList<GroupingAction>();
+ new GroupingAction(Messages.RepositorySearchResultView_Group_By_Owner, GroupBy.OWNER);
+// new GroupingAction(Messages.RepositorySearchResultView_Group_By_Complete, GroupBy.COMPLETION);
+
+ filterActions = new ArrayList<FilteringAction>();
+ new FilteringAction(Messages.RepositorySearchResultView_Filter_Completed_Tasks, new ViewerFilter() {
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (element instanceof ITask) {
+ return !((ITask) element).isCompleted();
+ } else if (element instanceof TaskGroup) {
+ TaskGroup taskGroup = (TaskGroup) element;
+ return taskGroup.getHandleIdentifier().equals("group-incompleteIncomplete"); //$NON-NLS-1$
+ }
+ return true;
+ }
+ });
+
+ // construct early since to be ready when restoreState() is invoked
+ searchResultSorter = new SearchResultSorter();
+ }
+
+ @Override
+ protected void elementsChanged(Object[] objects) {
+ if (searchResultProvider != null) {
+ searchResultProvider.elementsChanged(objects);
+ getViewer().refresh();
+ }
+ }
+
+ @Override
+ protected void clear() {
+ if (searchResultProvider != null) {
+ searchResultProvider.clear();
+ getViewer().refresh();
+ }
+ }
+
+ // Allows the inherited method "getViewer" to be accessed publicly.
+ @Override
+ public StructuredViewer getViewer() {
+ return super.getViewer();
+ }
+
+ @Override
+ protected void configureTreeViewer(TreeViewer viewer) {
+ viewer.setUseHashlookup(true);
+ searchResultProvider = new SearchResultTreeContentProvider();
+ viewer.setContentProvider(searchResultProvider);
+
+ DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(new SearchResultsLabelProvider(
+ searchResultProvider, viewer), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
+ viewer.setLabelProvider(labelProvider);
+ viewer.setSorter(searchResultSorter);
+ sortByDialogAction = new SearchResultSortAction(this);
+
+ toolTip = new TaskListToolTip(viewer.getControl());
+ }
+
+ @Override
+ protected TreeViewer createTreeViewer(Composite parent) {
+ // create a filtered tree
+ Composite treeComposite = parent;
+ Layout parentLayout = parent.getLayout();
+ if (!(parentLayout instanceof GridLayout)) {
+ treeComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ treeComposite.setLayout(layout);
+ }
+
+ // TODO e3.5 use new FilteredTree API
+ FilteredTree searchTree = new EnhancedFilteredTree(treeComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL,
+ new SubstringPatternFilter());
+ return searchTree.getViewer();
+ }
+
+ @Override
+ protected void configureTableViewer(TableViewer viewer) {
+// viewer.setUseHashlookup(true);
+// String[] columnNames = new String[] { "Summary" };
+// TableColumn[] columns = new TableColumn[columnNames.length];
+// int[] columnWidths = new int[] { 500 };
+// viewer.setColumnProperties(columnNames);
+//
+// viewer.getTable().setHeaderVisible(false);
+// for (int i = 0; i < columnNames.length; i++) {
+// columns[i] = new TableColumn(viewer.getTable(), 0, i); // SWT.LEFT
+// columns[i].setText(columnNames[i]);
+// columns[i].setWidth(columnWidths[i]);
+// columns[i].setData(new Integer(i));
+// columns[i].addSelectionListener(new SelectionAdapter() {
+//
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// TableColumn col = (TableColumn) e.getSource();
+// Integer integer = (Integer) col.getData();
+// setSortOrder(integer.intValue());
+// }
+// });
+// }
+//
+// IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+// Color categoryBackground = themeManager.getCurrentTheme().getColorRegistry().get(
+// TaskListColorsAndFonts.THEME_COLOR_TASKLIST_CATEGORY);
+//
+// SearchViewTableLabelProvider taskListTableLabelProvider = new SearchViewTableLabelProvider(
+// new TaskElementLabelProvider(true),
+// PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), categoryBackground);
+//
+// viewer.setLabelProvider(taskListTableLabelProvider);
+// viewer.setContentProvider(new SearchResultTableContentProvider(this));
+//
+// // Set the order when the search view is loading so that the items are
+// // sorted right away
+// setSortOrder(currentSortOrder);
+//
+// taskContentProvider = (SearchResultContentProvider) viewer.getContentProvider();
+ }
+
+ @Override
+ public void dispose() {
+ toolTip.dispose();
+ super.dispose();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return getAdapterDelegate(adapter);
+ }
+
+ private Object getAdapterDelegate(Class<?> adapter) {
+ if (IShowInTargetList.class.equals(adapter)) {
+ return SHOW_IN_TARGET_LIST;
+ }
+ return null;
+ }
+
+ @Override
+ protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate)
+ throws PartInitException {
+ AbstractTask repositoryHit = (AbstractTask) match.getElement();
+ TasksUiInternal.refreshAndOpenTaskListElement(repositoryHit);
+ }
+
+ @Override
+ protected void fillContextMenu(IMenuManager menuManager) {
+ super.fillContextMenu(menuManager);
+
+ // open actions
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, openInEditorAction);
+
+ // Add to Task List menu
+ // HACK: this should be a contribution
+ final MenuManager subMenuManager = new MenuManager(MessageFormat.format(
+ Messages.RepositorySearchResultView_Add_to_X_Category, TaskListView.LABEL_VIEW));
+ List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(TasksUiInternal.getTaskList()
+ .getCategories());
+ Collections.sort(categories);
+ for (final AbstractTaskCategory category : categories) {
+ if (!(category instanceof UnmatchedTaskContainer)) {//.equals(TasksUiPlugin.getTaskList().getArchiveContainer())) {
+ Action action = new Action() {
+ @Override
+ public void run() {
+ moveToCategory(category);
+ }
+ };
+ String text = category.getSummary();
+ action.setText(text);
+ action.setImageDescriptor(TasksUiImages.CATEGORY);
+ subMenuManager.add(action);
+ }
+ }
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_OPEN, subMenuManager);
+
+ // search actions
+
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, createQueryAction);
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, refineSearchAction);
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_SEARCH, openSearchWithBrowserAction);
+
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortByDialogAction);
+ for (Action action : groupingActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+ for (Action action : filterActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+
+ }
+
+ private void moveToCategory(AbstractTaskCategory category) {
+ final IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
+ StructuredSelection selection = (StructuredSelection) this.getViewer().getSelection();
+ for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
+ Object selectedObject = iterator.next();
+ if (selectedObject instanceof ITask) {
+ ITask task = (ITask) selectedObject;
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ final AddExistingTaskJob job = new AddExistingTaskJob(repository, task.getTaskId(), category);
+ job.schedule();
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ progressService.showInDialog(RepositorySearchResultView.this.getSite().getShell(), job);
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ IMenuManager menuManager = getSite().getActionBars().getMenuManager();
+ for (Action action : groupingActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, new Separator());
+ for (Action action : filterActions) {
+ menuManager.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, action);
+ }
+ }
+
+ @Override
+ public void setInput(ISearchResult newSearch, Object viewState) {
+ super.setInput(newSearch, viewState);
+ if (newSearch != null) {
+ ISearchQuery query = ((RepositorySearchResult) newSearch).getQuery();
+ IRepositoryQuery repositoryQuery = ((SearchHitCollector) query).getRepositoryQuery();
+ openSearchWithBrowserAction.selectionChanged(new StructuredSelection(repositoryQuery));
+ } else {
+ openSearchWithBrowserAction.selectionChanged(StructuredSelection.EMPTY);
+ }
+ }
+
+ public SearchResultSorter getSorter() {
+ return searchResultSorter;
+ }
+
+ @Override
+ public void restoreState(IMemento memento) {
+ super.restoreState(memento);
+ if (memento != null) {
+ IMemento child = memento.getChild(MEMENTO_KEY_SORT);
+ if (child != null && searchResultSorter != null) {
+ searchResultSorter.getTaskComparator().restoreState(child);
+ }
+ }
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ super.saveState(memento);
+ if (memento != null) {
+ IMemento child = memento.createChild(MEMENTO_KEY_SORT);
+ if (searchResultSorter != null) {
+ searchResultSorter.getTaskComparator().saveState(child);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchHitCollector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchHitCollector.java
new file mode 100644
index 0000000..0da8723
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchHitCollector.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.search.ui.ISearchQuery;
+import org.eclipse.search.ui.ISearchResult;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Used for returning results from Eclipse Search view. Collects results of a repository search.
+ *
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class SearchHitCollector extends TaskDataCollector implements ISearchQuery {
+
+ private final ITaskList taskList;
+
+ private final TaskRepository repository;
+
+ private final IRepositoryQuery repositoryQuery;
+
+ private final RepositorySearchResult searchResult;
+
+ private AbstractRepositoryConnector connector;
+
+ public SearchHitCollector(ITaskList tasklist, TaskRepository repository, IRepositoryQuery repositoryQuery) {
+ this.taskList = tasklist;
+ this.repository = repository;
+ this.repositoryQuery = repositoryQuery;
+ this.searchResult = new RepositorySearchResult(this);
+ }
+
+ public void aboutToStart() {
+ searchResult.removeAll();
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ NewSearchUI.activateSearchResultView();
+ }
+ });
+ }
+
+ @Override
+ public void accept(TaskData taskData) {
+ ITask task = taskList.getTask(repository.getRepositoryUrl(), taskData.getTaskId());
+ if (task == null) {
+ task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
+ if (connector != null) {
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ }
+ }
+ searchResult.addMatch(new Match(task, 0, 0));
+ }
+
+ public String getLabel() {
+ return Messages.SearchHitCollector_Querying_Repository_;
+ }
+
+ public boolean canRerun() {
+ return true;
+ }
+
+ public boolean canRunInBackground() {
+ return true;
+ }
+
+ public ISearchResult getSearchResult() {
+ return searchResult;
+ }
+
+ public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ monitor = Policy.monitorFor(monitor);
+
+ aboutToStart();
+
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException(Messages.SearchHitCollector_Search_cancelled);
+ }
+ connector = TasksUi.getRepositoryManager().getRepositoryConnector(repositoryQuery.getConnectorKind());
+ if (connector != null) {
+ final IStatus status = connector.performQuery(repository, repositoryQuery, this, null, monitor);
+ if (!status.isOK()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.displayStatus(Messages.SearchHitCollector_Search_failed, status);
+ }
+ });
+ } else {
+ if (searchResult.getMatchCount() >= TaskDataCollector.MAX_HITS) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.displayStatus(Messages.SearchHitCollector_Search_returned_maximum_number_of_hits,
+ RepositoryStatus.createStatus(repository.getRepositoryUrl(), IStatus.WARNING,
+ TasksUiPlugin.ID_PLUGIN, Messages.SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded));
+ }
+ });
+ }
+ }
+ } else {
+ return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.OK,
+ Messages.SearchHitCollector_Repository_connector_could_not_be_found, null);
+ }
+
+ return Status.OK_STATUS;
+ }
+
+ public IRepositoryQuery getRepositoryQuery() {
+ return repositoryQuery;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultContentProvider.java
new file mode 100644
index 0000000..98cb034
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultContentProvider.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * @author Rob Elves (moved into task.ui)
+ * @see org.eclipse.jface.viewers.IContentProvider
+ */
+public abstract class SearchResultContentProvider implements ITreeContentProvider {
+
+ /** An empty array of objects */
+ protected final Object[] EMPTY_ARR = new Object[0];
+
+ /** The search result for this content provider */
+ protected RepositorySearchResult searchResult;
+
+ public void dispose() {
+ // nothing to do
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (newInput instanceof RepositorySearchResult) {
+ initialize((RepositorySearchResult) newInput);
+ }
+ }
+
+ /**
+ * Initializes the content provider with the given search result.
+ *
+ * @param result
+ * The search result to use with this content provider
+ */
+ protected void initialize(RepositorySearchResult result) {
+ searchResult = result;
+ }
+
+ /**
+ * This method is called whenever the set of matches for the given elements changes.
+ *
+ * @param updatedElements
+ * The array of objects that has to be refreshed
+ * @see
+ * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[])
+ */
+ public abstract void elementsChanged(Object[] updatedElements);
+
+ /**
+ * Clears the viewer.
+ */
+ public abstract void clear();
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSortAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSortAction.java
new file mode 100644
index 0000000..9c76493
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSortAction.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.ui.dialogs.TaskCompareDialog;
+
+/**
+ * @author Steffen Pingel
+ */
+public class SearchResultSortAction extends Action {
+
+ private final RepositorySearchResultView view;
+
+ public SearchResultSortAction(RepositorySearchResultView view) {
+ super(Messages.SearchResultSortAction_Sort_Label);
+ this.view = view;
+ setEnabled(true);
+ }
+
+ @Override
+ public void run() {
+ TaskCompareDialog dialog = new TaskCompareDialog(view.getSite(), view.getSorter().getTaskComparator());
+ if (dialog.open() == Window.OK) {
+ view.getViewer().refresh();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSorter.java
new file mode 100644
index 0000000..3e03da4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultSorter.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - fix for bug 216150
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.search;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Sorts search results.
+ *
+ * @see TaskComparator
+ * @author Rob Elves
+ * @author Frank Becker
+ */
+public class SearchResultSorter extends ViewerSorter {
+
+ private final TaskComparator taskComparator;
+
+ public SearchResultSorter() {
+ taskComparator = new TaskComparator();
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof ITask && e2 instanceof ITask) {
+ ITask entry1 = (ITask) e1;
+ ITask entry2 = (ITask) e2;
+ return taskComparator.compare(entry1, entry2);
+ } else {
+ return super.compare(viewer, e1, e2);
+ }
+ }
+
+ public TaskComparator getTaskComparator() {
+ return taskComparator;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultTreeContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultTreeContentProvider.java
new file mode 100644
index 0000000..0afc59d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultTreeContentProvider.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.search;
+
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.Person;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * This implementation of <code>SearchResultContentProvider</code> is used for the table view of a Bugzilla search
+ * result.
+ *
+ * @author Rob Elves (moved into task.ui)
+ * @author Mik Kersten
+ */
+public class SearchResultTreeContentProvider extends SearchResultContentProvider {
+
+ private final Set<Object> elements = new LinkedHashSet<Object>();
+
+ private final Map<String, Person> owners = new HashMap<String, Person>();
+
+ private final Map<String, TaskGroup> completeState = new HashMap<String, TaskGroup>();
+
+ public enum GroupBy {
+ NONE, OWNER, COMPLETION;
+ }
+
+ private GroupBy selectedGroup;
+
+ public SearchResultTreeContentProvider() {
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ if (newInput instanceof RepositorySearchResult) {
+ searchResult = (RepositorySearchResult) newInput;
+ clear();
+ elementsChanged(searchResult.getElements());
+ }
+ }
+
+ /**
+ * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ if (inputElement == searchResult) {
+ if (selectedGroup == GroupBy.OWNER) {
+ return owners.values().toArray();
+ } else if (selectedGroup == GroupBy.COMPLETION) {
+ return completeState.values().toArray();
+ } else {
+ return elements.toArray();
+ }
+ } else {
+ return EMPTY_ARR;
+ }
+ }
+
+ public Object[] getChildren(Object parent) {
+ if (parent instanceof TaskGroup || parent instanceof Person) {
+ return ((ITaskContainer) parent).getChildren().toArray();
+ } else {
+ return EMPTY_ARR;
+ }
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ @Override
+ public void elementsChanged(Object[] updatedElements) {
+ for (Object object : updatedElements) {
+ boolean added = elements.add(object);
+ if (added && object instanceof ITask) {
+ AbstractTask task = ((AbstractTask) object);
+ String owner = task.getOwner();
+ if (owner == null) {
+ owner = Messages.SearchResultTreeContentProvider__unknown_;
+ }
+ Person person = owners.get(owner);
+ if (person == null) {
+ person = new Person(owner, task.getConnectorKind(), task.getRepositoryUrl());
+ owners.put(owner, person);
+ }
+ person.internalAddChild(task);
+
+ TaskGroup completeIncomplete = null;
+ if (task.isCompleted()) {
+ completeIncomplete = completeState.get(Messages.SearchResultTreeContentProvider_Complete);
+ if (completeIncomplete == null) {
+ completeIncomplete = new TaskGroup("group-complete", Messages.SearchResultTreeContentProvider_Complete, GroupBy.COMPLETION.name()); //$NON-NLS-1$
+ completeState.put(Messages.SearchResultTreeContentProvider_Complete, completeIncomplete);
+ }
+ } else {
+ completeIncomplete = completeState.get(Messages.SearchResultTreeContentProvider_Incomplete);
+ if (completeIncomplete == null) {
+ completeIncomplete = new TaskGroup("group-incomplete", Messages.SearchResultTreeContentProvider_Incomplete, GroupBy.COMPLETION.name()); //$NON-NLS-1$
+ completeState.put(Messages.SearchResultTreeContentProvider_Incomplete, completeIncomplete);
+ }
+ }
+ completeIncomplete.internalAddChild(task);
+ }
+ }
+ }
+
+ @Override
+ public void clear() {
+ elements.clear();
+ owners.clear();
+ completeState.clear();
+ }
+
+ public GroupBy getSelectedGroup() {
+ return selectedGroup;
+ }
+
+ public void setSelectedGroup(GroupBy selectedGroup) {
+ this.selectedGroup = selectedGroup;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultsLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultsLabelProvider.java
new file mode 100644
index 0000000..d4bf438
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchResultsLabelProvider.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.internal.tasks.core.Person;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class SearchResultsLabelProvider extends TaskElementLabelProvider {
+
+ private final SearchResultContentProvider contentProvider;
+
+ private final TreeViewer viewer;
+
+ public SearchResultsLabelProvider(SearchResultContentProvider contentProvider, TreeViewer viewer) {
+ super(true);
+ this.contentProvider = contentProvider;
+ this.viewer = viewer;
+ }
+
+ @Override
+ public String getText(Object object) {
+ if (object instanceof TaskGroup || object instanceof Person) {
+ Object[] children = contentProvider.getChildren(object);
+ ViewerFilter[] filters = viewer.getFilters();
+ int filtered = 0;
+ if (filters.length > 0) {
+ for (Object child : children) {
+ for (ViewerFilter filter : filters) {
+ if (!filter.select(viewer, object, child)) {
+ filtered++;
+ break; //don't count a child more the once
+ }
+ }
+ }
+ }
+ if (filtered > 0) {
+ return super.getText(object)
+ + " (" //$NON-NLS-1$
+ + MessageFormat.format(Messages.SearchResultsLabelProvider_OF, (children.length - filtered),
+ children.length) + ")"; //$NON-NLS-1$
+ } else {
+ return super.getText(object) + " (" + children.length + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else {
+ return super.getText(object);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchScoreComputerAdapterFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchScoreComputerAdapterFactory.java
new file mode 100644
index 0000000..35b1b13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/SearchScoreComputerAdapterFactory.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.search;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.search.ui.ISearchPageScoreComputer;
+
+/**
+ * Implements a {@link IAdapterFactory} for {@link ISearchPageScoreComputer}s which ranks {@link AbstractTaskContainer}s
+ * high for the task search page
+ *
+ * @author Willian Mitsuda
+ */
+public class SearchScoreComputerAdapterFactory implements IAdapterFactory {
+
+ private final ISearchPageScoreComputer computer = new ISearchPageScoreComputer() {
+
+ public int computeScore(String pageId, Object input) {
+ if (!TaskSearchPage.ID.equals(pageId)) {
+ return ISearchPageScoreComputer.UNKNOWN;
+ }
+ if (input instanceof IRepositoryElement) {
+ return 100;
+ }
+ return ISearchPageScoreComputer.LOWEST;
+ }
+
+ };
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (ISearchPageScoreComputer.class.equals(adapterType)) {
+ return computer;
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return new Class[] { ISearchPageScoreComputer.class };
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/StackTraceDuplicateDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/StackTraceDuplicateDetector.java
new file mode 100644
index 0000000..12af409
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/StackTraceDuplicateDetector.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.search;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Gail Murphy
+ * @author Steffen Pingel
+ */
+public class StackTraceDuplicateDetector extends AbstractDuplicateDetector {
+
+ @Override
+ public boolean canQuery(TaskData taskData) {
+ return TasksUiPlugin.getDefault().getSearchHandler(taskData.getConnectorKind()) != null;
+ }
+
+ private String getDescription(TaskData taskData) {
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.DESCRIPTION);
+ if (attribute == null) {
+ attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ }
+ return (attribute != null) ? attribute.getTaskData().getAttributeMapper().getValueLabel(attribute) : ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public IRepositoryQuery getDuplicatesQuery(TaskRepository taskRepository, TaskData taskData) throws CoreException {
+ String description = getDescription(taskData);
+ String searchString = getStackTraceFromDescription(description);
+ if (searchString == null) {
+ throw new CoreException(new Status(IStatus.INFO, TasksUiPlugin.ID_PLUGIN,
+ "Unable to locate a stack trace in the description text.")); //$NON-NLS-1$
+ }
+
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(taskRepository);
+ AbstractSearchHandler searchHandler = TasksUiPlugin.getDefault().getSearchHandler(
+ taskRepository.getConnectorKind());
+ if (searchHandler.queryForText(taskRepository, query, taskData, searchString)) {
+ return query;
+ }
+ return null;
+ }
+
+ public static String getStackTraceFromDescription(String description) {
+ String stackTrace = null;
+
+ if (description == null) {
+ return null;
+ }
+
+ String punct = "!\"#$%&'\\(\\)*+,-./:;\\<=\\>?@\\[\\]^_`\\{|\\}~\n"; //$NON-NLS-1$
+ String lineRegex = " *at\\s+[\\w" + punct + "]+ ?\\(.*\\) *\n?"; //$NON-NLS-1$ //$NON-NLS-2$
+ Pattern tracePattern = Pattern.compile(lineRegex);
+ Matcher match = tracePattern.matcher(description);
+
+ if (match.find()) {
+ // record the index of the first stack trace line
+ int start = match.start();
+ int lastEnd = match.end();
+
+ // find the last stack trace line
+ while (match.find()) {
+ lastEnd = match.end();
+ }
+
+ // make sure there's still room to find the exception
+ if (start <= 0) {
+ return null;
+ }
+
+ // count back to the line before the stack trace to find the
+ // exception
+ int stackStart = 0;
+ int index = start - 1;
+ while (index > 1 && description.charAt(index) == ' ') {
+ index--;
+ }
+
+ // locate the exception line index
+ stackStart = description.substring(0, index - 1).lastIndexOf("\n"); //$NON-NLS-1$
+ stackStart = (stackStart == -1) ? 0 : stackStart + 1;
+
+ stackTrace = description.substring(stackStart, lastEnd);
+ }
+
+ return stackTrace;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/messages.properties
new file mode 100644
index 0000000..66a7b78
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/search/messages.properties
@@ -0,0 +1,26 @@
+CreateQueryFromSearchAction_CLEAR_QUERY=Create Query
+CreateQueryFromSearchAction_Name_of_query_to_be_added_to_the_X=Name of query to be added to the {0}
+RepositorySearchResult_Task_search_X_matches=Task search - {0} matches
+RepositorySearchResult_Task_search_1_match=Task search - 1 match
+RepositorySearchResultView_Add_to_X_Category=Add to {0} Category
+RepositorySearchResultView_Create_Query_from_Search_=Create Query from Search...
+RepositorySearchResultView_Filter_Completed_Tasks=Filter Completed Tasks
+RepositorySearchResultView_Group_By_Owner=Group By Owner
+RepositorySearchResultView_Open_in_Editor=Open in Editor
+RepositorySearchResultView_Open_Search_with_Browser_Label=Open Search with Browser
+RepositorySearchResultView_Refine_Search_=Refine Search...
+
+SearchHitCollector_Max_allowed_number_of_hits_returned_exceeded=Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.
+SearchHitCollector_Querying_Repository_=Querying Repository...
+SearchHitCollector_Repository_connector_could_not_be_found=Repository connector could not be found
+SearchHitCollector_Search_failed=Search failed
+SearchHitCollector_Search_cancelled=Search cancelled
+SearchHitCollector_Search_returned_maximum_number_of_hits=Search returned maximum number of hits
+
+SearchResultsLabelProvider_OF={0} of {1}
+
+SearchResultTreeContentProvider_Complete=Complete
+SearchResultTreeContentProvider_Incomplete=Incomplete
+SearchResultTreeContentProvider__unknown_=<unknown>
+
+SearchResultSortAction_Sort_Label=Sort...
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/AbstractRetrieveTitleFromUrlJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/AbstractRetrieveTitleFromUrlJob.java
new file mode 100644
index 0000000..47503e5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/AbstractRetrieveTitleFromUrlJob.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.internal.tasks.ui.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Retrieves a title for a web page.
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public abstract class AbstractRetrieveTitleFromUrlJob extends Job {
+
+ private volatile String pageTitle;
+
+ private final String url;
+
+ public AbstractRetrieveTitleFromUrlJob(String url) {
+ super(Messages.AbstractRetrieveTitleFromUrlJob_Retrieving_summary_from_URL);
+ this.url = url;
+ }
+
+ public String getPageTitle() {
+ return pageTitle;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ pageTitle = WebUtil.getTitleFromUrl(new WebLocation(getUrl()), monitor);
+ if (pageTitle != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ titleRetrieved(pageTitle);
+ }
+ });
+ }
+ } catch (IOException e) {
+ return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Retrieving summary from URL failed", e); //$NON-NLS-1$
+ }
+ return Status.OK_STATUS;
+ }
+
+ protected void titleRetrieved(String pageTitle) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/AttachmentUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/AttachmentUtil.java
new file mode 100644
index 0000000..77f5a13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/AttachmentUtil.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Peter Stibrany - improvements for bug 271197
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableContext;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskAttachment;
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskAttachmentJob;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AttachmentUtil {
+
+ protected static final int BUFFER_SIZE = 1024;
+
+ public static final String CONTEXT_DESCRIPTION = "mylyn/context/zip"; //$NON-NLS-1$
+
+ private static final String CONTEXT_DESCRIPTION_LEGACY = "mylar/context/zip"; //$NON-NLS-1$
+
+ private static final String CONTEXT_FILENAME = "mylyn-context.zip"; //$NON-NLS-1$
+
+ private static final String CONTEXT_CONTENT_TYPE = "application/octet-stream"; //$NON-NLS-1$
+
+ public static boolean postContext(AbstractRepositoryConnector connector, TaskRepository repository, ITask task,
+ String comment, TaskAttribute attribute, IProgressMonitor monitor) throws CoreException {
+ AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
+ ContextCorePlugin.getContextStore().saveActiveContext();
+
+ File file = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ if (attachmentHandler != null && file != null && file.exists()) {
+ FileTaskAttachmentSource attachment = new FileTaskAttachmentSource(file);
+ attachment.setDescription(CONTEXT_DESCRIPTION);
+ attachment.setName(CONTEXT_FILENAME);
+ attachmentHandler.postContent(repository, task, attachment, comment, attribute, monitor);
+ return true;
+ }
+ return false;
+ }
+
+ public static List<ITaskAttachment> getContextAttachments(TaskRepository repository, ITask task) {
+ List<ITaskAttachment> contextAttachments = new ArrayList<ITaskAttachment>();
+ TaskData taskData;
+ try {
+ taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ } catch (CoreException e) {
+ // ignore
+ return contextAttachments;
+ }
+ if (taskData != null) {
+ List<TaskAttribute> taskAttachments = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT);
+ for (TaskAttribute attribute : taskAttachments) {
+ TaskAttachment taskAttachment = new TaskAttachment(repository, task, attribute);
+ taskData.getAttributeMapper().updateTaskAttachment(taskAttachment, attribute);
+ if (isContext(taskAttachment)) {
+ contextAttachments.add(taskAttachment);
+ }
+ }
+ }
+ return contextAttachments;
+ }
+
+ public static boolean hasContextAttachment(ITask task) {
+ Assert.isNotNull(task);
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ List<ITaskAttachment> contextAttachments = getContextAttachments(repository, task);
+ return contextAttachments.size() > 0;
+ }
+
+ public static boolean downloadContext(final ITask task, final ITaskAttachment attachment,
+ final IRunnableContext context) {
+ if (task.isActive()) {
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ }
+ try {
+ context.run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ File targetFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ try {
+ OutputStream out = new BufferedOutputStream(new FileOutputStream(targetFile));
+ try {
+ AttachmentUtil.downloadAttachment(attachment, out, monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ out.close();
+ }
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } catch (IOException e) {
+ throw new InvocationTargetException(
+ new CoreException(new RepositoryStatus(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, "Error writing to context file", e))); //$NON-NLS-1$
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ TasksUiInternal.displayStatus(Messages.AttachmentUtil_Mylyn_Information,
+ ((CoreException) e.getCause()).getStatus());
+ } else {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Unexpected error while retrieving context", e)); //$NON-NLS-1$
+ }
+ return false;
+ } catch (InterruptedException ignored) {
+ // canceled
+ return false;
+ }
+ TasksUiInternal.getTaskList().notifyElementChanged(task);
+ TasksUi.getTaskActivityManager().activateTask(task);
+ return true;
+ }
+
+ public static boolean uploadContext(final TaskRepository repository, final ITask task, final String comment,
+ final IRunnableContext context) {
+ ContextCorePlugin.getContextStore().saveActiveContext();
+ File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ if (!sourceContextFile.exists()) {
+ TasksUiInternal.displayStatus(Messages.AttachmentUtil_Mylyn_Information, new Status(IStatus.WARNING,
+ TasksUiPlugin.ID_PLUGIN, Messages.AttachmentUtil_The_context_is_empty));
+ return false;
+ }
+
+ FileTaskAttachmentSource source = new FileTaskAttachmentSource(sourceContextFile);
+ source.setName(CONTEXT_FILENAME);
+ source.setDescription(CONTEXT_DESCRIPTION);
+ source.setContentType(CONTEXT_CONTENT_TYPE);
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ final SubmitJob submitJob = TasksUiInternal.getJobFactory().createSubmitTaskAttachmentJob(connector,
+ repository, task, source, comment, null);
+ try {
+ context.run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ if (((SubmitTaskAttachmentJob) submitJob).run(monitor) == Status.CANCEL_STATUS) {
+ throw new InterruptedException();
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Unexpected error while attaching context", e)); //$NON-NLS-1$
+ return false;
+ } catch (InterruptedException ignored) {
+ // canceled
+ return false;
+ }
+ IStatus status = submitJob.getStatus();
+ if (status != null && status.getSeverity() != IStatus.CANCEL) {
+ TasksUiInternal.displayStatus(Messages.AttachmentUtil_Mylyn_Information, submitJob.getStatus());
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean hasLocalContext(ITask task) {
+ Assert.isNotNull(task);
+ return ContextCore.getContextManager().hasContext(task.getHandleIdentifier());
+ }
+
+ public static boolean isContext(ITaskAttachment attachment) {
+ return CONTEXT_DESCRIPTION.equals(attachment.getDescription())
+ || CONTEXT_DESCRIPTION_LEGACY.equals(attachment.getDescription());
+ }
+
+ public static boolean canUploadAttachment(ITask task) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
+ if (attachmentHandler != null) {
+ return attachmentHandler.canPostContent(repository, task);
+ }
+ return false;
+ }
+
+ public static boolean canDownloadAttachment(ITask task) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
+ if (attachmentHandler != null) {
+ return attachmentHandler.canGetContent(repository, task);
+ }
+ return false;
+ }
+
+ public static void downloadAttachment(ITaskAttachment attachment, OutputStream out, IProgressMonitor monitor)
+ throws CoreException {
+ try {
+ monitor.beginTask(Messages.AttachmentUtil_Downloading_attachment, IProgressMonitor.UNKNOWN);
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ attachment.getConnectorKind());
+ AbstractTaskAttachmentHandler handler = connector.getTaskAttachmentHandler();
+ if (handler == null) {
+ throw new CoreException(new RepositoryStatus(IStatus.INFO, TasksUiPlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "The repository does not support attachments.")); //$NON-NLS-1$
+ }
+
+ InputStream in = handler.getContent(attachment.getTaskRepository(), attachment.getTask(),
+ attachment.getTaskAttribute(), monitor);
+ try {
+ byte[] buffer = new byte[BUFFER_SIZE];
+ while (true) {
+ Policy.checkCanceled(monitor);
+ int count = in.read(buffer);
+ if (count == -1) {
+ return;
+ }
+ out.write(buffer, 0, count);
+ }
+ } catch (IOException e) {
+ throw new CoreException(new RepositoryStatus(attachment.getTaskRepository(), IStatus.ERROR,
+ TasksUiPlugin.ID_PLUGIN, RepositoryStatus.ERROR_IO, "IO error reading attachment: " //$NON-NLS-1$
+ + e.getMessage(), e));
+ } finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Error closing attachment stream", e)); //$NON-NLS-1$
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public static ITaskAttachment getSelectedAttachment() {
+ List<ITaskAttachment> attachments = getSelectedAttachments();
+ if (attachments.isEmpty()) {
+ return null;
+ }
+ return attachments.get(0);
+ }
+
+ public static List<ITaskAttachment> getSelectedAttachments() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ ISelection windowSelection = window.getSelectionService().getSelection();
+ if (windowSelection instanceof IStructuredSelection && !windowSelection.isEmpty()) {
+ IStructuredSelection selection = (IStructuredSelection) windowSelection;
+ List<?> items = selection.toList();
+
+ List<ITaskAttachment> attachments = new ArrayList<ITaskAttachment>();
+ for (Object item : items) {
+ if (item instanceof ITaskAttachment) {
+ attachments.add((ITaskAttachment) item);
+ }
+ }
+ return attachments;
+ }
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/ClipboardCopier.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/ClipboardCopier.java
new file mode 100644
index 0000000..6a02260
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/ClipboardCopier.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ClipboardCopier {
+
+ public interface TextProvider {
+
+ public abstract String getTextForElement(Object element);
+
+ }
+
+ private static ClipboardCopier instance = new ClipboardCopier();
+
+ public static ClipboardCopier getDefault() {
+ return instance;
+ }
+
+ private Clipboard clipboard;
+
+ public static String LINE_SEPARATOR = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public ClipboardCopier() {
+ }
+
+ public void copy(IStructuredSelection selection, TextProvider provider) {
+ if (!selection.isEmpty()) {
+ StringBuilder sb = new StringBuilder();
+ for (Iterator<?> it = selection.iterator(); it.hasNext();) {
+ Object item = it.next();
+ String textForElement = provider.getTextForElement(item);
+ if (textForElement != null) {
+ if (sb.length() > 0) {
+ sb.append(LINE_SEPARATOR);
+ sb.append(LINE_SEPARATOR);
+ }
+ sb.append(textForElement);
+ }
+ }
+ copy(sb.toString());
+ }
+ }
+
+ public void copy(String text) {
+ if (clipboard == null) {
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ clipboard = new Clipboard(display);
+ }
+
+ TextTransfer textTransfer = TextTransfer.getInstance();
+ clipboard.setContents(new Object[] { text }, new Transfer[] { textTransfer });
+ }
+
+ public void dispose() {
+ if (clipboard != null) {
+ clipboard.dispose();
+ clipboard = null;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/CopyAttachmentToClipboardJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/CopyAttachmentToClipboardJob.java
new file mode 100644
index 0000000..8a47ef1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/CopyAttachmentToClipboardJob.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.io.ByteArrayOutputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class CopyAttachmentToClipboardJob extends Job {
+
+ private final ITaskAttachment attachment;
+
+ public CopyAttachmentToClipboardJob(ITaskAttachment attachment) {
+ super(Messages.CopyAttachmentToClipboardJob_Copying_Attachment_to_Clipboard);
+ this.attachment = attachment;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ AttachmentUtil.downloadAttachment(attachment, out, monitor);
+ } catch (final CoreException e) {
+ TasksUiInternal.asyncDisplayStatus(Messages.CopyAttachmentToClipboardJob_Copy_Attachment_to_Clipboard,
+ e.getStatus());
+ return Status.OK_STATUS;
+ }
+
+ String contents = new String(out.toByteArray());
+ contents = contents.replaceAll("\r\n|\n", System.getProperty("line.separator")); //$NON-NLS-1$ //$NON-NLS-2$
+ copyToClipboard(contents);
+
+ return Status.OK_STATUS;
+ }
+
+ private void copyToClipboard(final String contents) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ Clipboard clipboard = new Clipboard(PlatformUI.getWorkbench().getDisplay());
+ clipboard.setContents(new Object[] { contents }, new Transfer[] { TextTransfer.getInstance() });
+ clipboard.dispose();
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/DownloadAttachmentJob.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/DownloadAttachmentJob.java
new file mode 100644
index 0000000..a1347c4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/DownloadAttachmentJob.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+
+/**
+ * @author Steffen Pingel
+ */
+public class DownloadAttachmentJob extends Job {
+
+ private final ITaskAttachment attachment;
+
+ private final File targetFile;
+
+ public DownloadAttachmentJob(ITaskAttachment attachment, File targetFile) {
+ super(Messages.DownloadAttachmentJob_Downloading_Attachment);
+ this.attachment = attachment;
+ this.targetFile = targetFile;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ try {
+ OutputStream out = new BufferedOutputStream(new FileOutputStream(targetFile));
+ try {
+ AttachmentUtil.downloadAttachment(attachment, out, monitor);
+ } finally {
+ out.close();
+ }
+ } catch (IOException e) {
+ throw new CoreException(new RepositoryStatus(attachment.getTaskRepository(), IStatus.ERROR,
+ TasksUiPlugin.ID_PLUGIN, RepositoryStatus.ERROR_IO, "IO error writing attachment: " //$NON-NLS-1$
+ + e.getMessage(), e));
+ }
+ } catch (final CoreException e) {
+ TasksUiInternal.asyncDisplayStatus(Messages.DownloadAttachmentJob_Copy_Attachment_to_Clipboard,
+ e.getStatus());
+ return Status.OK_STATUS;
+ }
+
+ return Status.OK_STATUS;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/ImportExportUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/ImportExportUtil.java
new file mode 100644
index 0000000..135ac75
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/ImportExportUtil.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.io.File;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TransferList;
+import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.FileDialog;
+
+/**
+ * @author Steffen Pingel
+ */
+public class ImportExportUtil {
+
+ public static void configureFilter(FileDialog dialog) {
+ dialog.setFilterExtensions(PlatformUtil.getFilterExtensions(new String[] { "*" + ITasksCoreConstants.FILE_EXTENSION })); //$NON-NLS-1$
+ dialog.setFilterNames(new String[] { NLS.bind(Messages.ImportExportUtil_Tasks_and_queries_Filter0,
+ ITasksCoreConstants.FILE_EXTENSION) });
+ }
+
+ public static void export(File file, IStructuredSelection selection) throws CoreException {
+ // extract queries and tasks from selection
+ TransferList list = new TransferList();
+ for (Iterator<?> it = selection.iterator(); it.hasNext();) {
+ Object element = it.next();
+ if (element instanceof AbstractTaskCategory) {
+ list.addCategory((TaskCategory) element);
+ } else if (element instanceof RepositoryQuery) {
+ list.addQuery((RepositoryQuery) element);
+ } else if (element instanceof ITask) {
+ list.addTask((AbstractTask) element);
+ }
+ }
+
+ TaskListExternalizer externalizer = TasksUiPlugin.getDefault().createTaskListExternalizer();
+ externalizer.writeTaskList(list, file);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/Messages.java
new file mode 100644
index 0000000..982429d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/Messages.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.util.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AttachmentUtil_The_context_is_empty;
+
+ public static String AttachmentUtil_Downloading_attachment;
+
+ public static String AttachmentUtil_Mylyn_Information;
+
+ public static String CopyAttachmentToClipboardJob_Copy_Attachment_to_Clipboard;
+
+ public static String CopyAttachmentToClipboardJob_Copying_Attachment_to_Clipboard;
+
+ public static String DownloadAttachmentJob_Copy_Attachment_to_Clipboard;
+
+ public static String DownloadAttachmentJob_Downloading_Attachment;
+
+ public static String ImportExportUtil_Tasks_and_queries_Filter0;
+
+ public static String SortKindEntry_Date_Created;
+
+ public static String SortKindEntry_None;
+
+ public static String SortKindEntry_Priority;
+
+ public static String SortKindEntry_Summary;
+
+ public static String SortKindEntry_Task_ID;
+
+ public static String SaveAttachmentsAction_directoryDoesntExist;
+
+ public static String SaveAttachmentsAction_directoryDoesntExist0;
+
+ public static String SaveAttachmentsAction_fileExists_doYouWantToOverwrite0;
+
+ public static String SaveAttachmentsAction_overwriteFile0;
+
+ public static String SaveAttachmentsAction_selectDirectory;
+
+ public static String SaveAttachmentsAction_selectDirectoryHint;
+
+ public static String TaskDataExportOperation_exporting_task_data;
+
+ public static String TasksUiInternal_Configuration_Refresh_Failed;
+
+ public static String TasksUiInternal_Create_Task;
+
+ public static String TasksUiInternal_The_new_task_will_be_added_to_the_X_container;
+
+ public static String TasksUiInternal_Query_Synchronization_Failed;
+
+ public static String TasksUiInternal_Task_Synchronization_Failed;
+
+ public static String TasksUiInternal__hour_;
+
+ public static String TasksUiInternal__hours_;
+
+ public static String TasksUiInternal__minute_;
+
+ public static String TasksUiInternal__minutes_;
+
+ public static String TasksUiInternal__second;
+
+ public static String TasksUiInternal__seconds;
+
+ public static String TasksUiInternal_Failed_to_open_task;
+
+ public static String TasksUiInternal_No_repository_found;
+
+ public static String TasksUiInternal_See_error_log_for_details;
+
+ public static String TasksUiMenus_Copy_Contents;
+
+ public static String TasksUiMenus_Copy_URL;
+
+ public static String TasksUiMenus_File_exists_;
+
+ public static String TasksUiMenus_Overwrite_existing_file_;
+
+ public static String TasksUiMenus_Save_;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/PlatformUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/PlatformUtil.java
new file mode 100644
index 0000000..db14107
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/PlatformUtil.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * David Green - fix for bug 247182
+ * Frank Becker - fixes for bug 259877
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.lang.reflect.Method;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.ByteArrayTransfer;
+import org.eclipse.swt.widgets.ToolBar;
+
+/**
+ * @author Steffen Pingel
+ */
+public class PlatformUtil {
+
+ private static ByteArrayTransfer urlTransfer;
+ static {
+ // TODO e3.4 use URLTransfer directly and not through reflection
+ // URLTransfer is package protected in Eclipse 3.3 (bug 100095)
+ // use reflection to access instance for now
+ try {
+ Class<?> clazz = Class.forName("org.eclipse.swt.dnd.URLTransfer"); //$NON-NLS-1$
+ Method method = clazz.getMethod("getInstance"); //$NON-NLS-1$
+ if (method != null) {
+ urlTransfer = (ByteArrayTransfer) method.invoke(null);
+ }
+ } catch (Throwable e) {
+ // ignore
+ }
+ if (urlTransfer == null) {
+ urlTransfer = new ByteArrayTransfer() {
+
+ private static final String TYPE = "dummy"; //$NON-NLS-1$
+
+ private final int TYPE_ID = registerType(TYPE);
+
+ @Override
+ protected int[] getTypeIds() {
+ return new int[] { TYPE_ID };
+ }
+
+ @Override
+ protected String[] getTypeNames() {
+ return new String[] { TYPE };
+ }
+
+ };
+ }
+ }
+
+ /**
+ * bug 247182: file import dialog doesn't work on Mac OS X if the file extension has more than one dot.
+ */
+ public static String[] getFilterExtensions(String... extensions) {
+ for (int i = 0; i < extensions.length; i++) {
+ String extension = extensions[i];
+ if (Platform.OS_MACOSX.equals(Platform.getOS())) {
+ int j = extension.lastIndexOf('.');
+ if (j != -1) {
+ extension = extension.substring(j);
+ }
+ }
+ extensions[i] = "*" + extension; //$NON-NLS-1$
+ }
+ return extensions;
+ }
+
+ public static int getToolTipXShift() {
+ if ("gtk".equals(SWT.getPlatform()) || "carbon".equals(SWT.getPlatform()) || "cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ return -26;
+ } else {
+ return -23;
+ }
+ }
+
+ public static int getTreeImageOffset() {
+ if ("carbon".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ return 16;
+ } else if ("cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ return 13;
+ } else {
+ return 20;
+ }
+ }
+
+ public static int getIncomingImageOffset() {
+ if ("carbon".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ return 5;
+ } else if ("cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ return 2;
+ } else {
+ return 6;
+ }
+ }
+
+ public static int getTreeItemSquish() {
+ if ("gtk".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ return 8;
+ } else if (isMac()) {
+ return 3;
+ } else {
+ return 0;
+ }
+ }
+
+ private static boolean isMac() {
+ return "carbon".equals(SWT.getPlatform()) || "cocoa".equals(SWT.getPlatform()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ // TODO e3.5: remove, platform has been fixed, see bug 272046
+ public static boolean isPaintItemClippingRequired() {
+ return "gtk".equals(SWT.getPlatform()); //$NON-NLS-1$
+ }
+
+ public static ByteArrayTransfer getUrlTransfer() {
+ return urlTransfer;
+ }
+
+ /**
+ * If a Gtk toolbar does not have a standard ToolItem but use only ControlContributions a dummy ToolItem needs to be
+ * added to force the height of the tool bar to be > 0 pixels.
+ */
+ // TODO e3.4: remove, platform has been fixed
+ public static boolean isToolBarHeightBroken(ToolBar toolBar) {
+ return Platform.WS_GTK.equals(SWT.getPlatform()) && toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT, false).y == 0;
+ }
+
+ public static boolean spinnerHasNativeBorder() {
+ return isMac();
+ }
+
+ public static boolean hasNarrowToolBar() {
+ return Platform.WS_WIN32.equals(SWT.getPlatform());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/SelectionProviderAdapter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/SelectionProviderAdapter.java
new file mode 100644
index 0000000..555263e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/SelectionProviderAdapter.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import org.eclipse.core.commands.common.EventManager;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * @author Steffen Pingel
+ * @deprecated use {@link org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter} instead
+ */
+ at Deprecated
+public class SelectionProviderAdapter extends EventManager implements ISelectionProvider {
+
+ private ISelection selection;
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ addListenerObject(listener);
+ }
+
+ public ISelection getSelection() {
+ return selection;
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ removeListenerObject(listener);
+ }
+
+ protected void selectionChanged(final SelectionChangedEvent event) {
+ Object[] listeners = getListeners();
+ for (int i = 0; i < listeners.length; ++i) {
+ final ISelectionChangedListener listener = (ISelectionChangedListener) listeners[i];
+ SafeRunner.run(new SafeRunnable() {
+ public void run() {
+ listener.selectionChanged(event);
+ }
+ });
+ }
+ }
+
+ public void setSelection(ISelection selection) {
+ this.selection = selection;
+ selectionChanged(new SelectionChangedEvent(this, selection));
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/SortCriterion.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/SortCriterion.java
new file mode 100644
index 0000000..66ac9b6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/SortCriterion.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Frank Becker and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Frank Becker - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.ui.IMemento;
+
+/**
+ * @author Frank Becker
+ * @author Steffen Pingel
+ */
+public class SortCriterion {
+
+ public enum SortKey {
+ NONE, DATE_CREATED, PRIORITY, SUMMARY, TASK_ID;
+
+ public static SortKey valueOfLabel(String label) {
+ for (SortKey value : values()) {
+ if (value.getLabel().equals(label)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ public String getLabel() {
+ switch (this) {
+ case NONE:
+ return Messages.SortKindEntry_None;
+ case PRIORITY:
+ return Messages.SortKindEntry_Priority;
+ case SUMMARY:
+ return Messages.SortKindEntry_Summary;
+ case DATE_CREATED:
+ return Messages.SortKindEntry_Date_Created;
+ case TASK_ID:
+ return Messages.SortKindEntry_Task_ID;
+ default:
+ return null;
+ }
+ }
+
+ }
+
+ private SortKey key;
+
+ private int direction;
+
+ private static final String MEMENTO_KEY_SORT_KEY = "sortKey"; //$NON-NLS-1$
+
+ private static final String MEMENTO_KEY_SORT_DIRECTION = "sortDirection"; //$NON-NLS-1$
+
+ private static final SortKey DEFAULT_SORT_KIND = SortKey.NONE;
+
+ private static final int DEFAULT_SORT_DIRECTION = 1;
+
+ public static final int kindCount = SortKey.values().length - 1;
+
+ public SortCriterion() {
+ key = DEFAULT_SORT_KIND;
+ direction = DEFAULT_SORT_DIRECTION;
+ }
+
+ public SortCriterion(SortKey kind, int sortDirection) {
+ this.key = kind;
+ this.direction = sortDirection;
+ }
+
+ public SortKey getKey() {
+ return key;
+ }
+
+ public void setKey(SortKey kind) {
+ Assert.isNotNull(kind);
+ this.key = kind;
+ }
+
+ public int getDirection() {
+ return direction;
+ }
+
+ public void setDirection(int sortDirection) {
+ Assert.isTrue(sortDirection == -1 || sortDirection == 1);
+ this.direction = sortDirection;
+ }
+
+ private SortKey getSortKey(IMemento memento, String key, SortKey defaultValue) {
+ String value = memento.getString(key);
+ if (value != null) {
+ try {
+ return SortKey.valueOf(value);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ }
+ return defaultValue;
+ }
+
+ private int getSortDirection(IMemento memento, String key, int defaultValue) {
+ Integer value = memento.getInteger(key);
+ if (value != null) {
+ return value >= 0 ? 1 : -1;
+ }
+ return defaultValue;
+ }
+
+ public void restoreState(IMemento memento) {
+ setKey(getSortKey(memento, MEMENTO_KEY_SORT_KEY, DEFAULT_SORT_KIND));
+ setDirection(getSortDirection(memento, MEMENTO_KEY_SORT_DIRECTION, DEFAULT_SORT_DIRECTION));
+ }
+
+ public void saveState(IMemento memento) {
+ memento.putString(MEMENTO_KEY_SORT_KEY, getKey().name());
+ memento.putInteger(MEMENTO_KEY_SORT_DIRECTION, getDirection());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskAttachmentPropertyTester.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskAttachmentPropertyTester.java
new file mode 100644
index 0000000..73722c3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskAttachmentPropertyTester.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Maarten Meijer - improvements for bug 252699
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentPropertyTester extends PropertyTester {
+
+ private static final String PROPERTY_IS_CONTEXT = "isContext"; //$NON-NLS-1$
+
+ private static final String PROPERTY_HAS_URL = "hasUrl"; //$NON-NLS-1$
+
+ private boolean equals(boolean value, Object expectedValue) {
+ return new Boolean(value).equals(expectedValue);
+ }
+
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof ITaskAttachment) {
+ ITaskAttachment taskAttachment = (ITaskAttachment) receiver;
+ if (PROPERTY_IS_CONTEXT.equals(property)) {
+ return equals(AttachmentUtil.isContext(taskAttachment), expectedValue);
+ }
+ if (PROPERTY_HAS_URL.equals(property)) {
+ return equals(taskAttachment.getUrl() != null && taskAttachment.getUrl().length() > 0, expectedValue);
+ }
+
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskComparator.java
new file mode 100644
index 0000000..f96ed08
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskComparator.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements for bug 231336
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.util.Comparator;
+import java.util.Date;
+
+import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion.SortKey;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskKeyComparator;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.IMemento;
+
+/**
+ * @author Mik Kersten
+ * @author Frank Becker
+ */
+public class TaskComparator implements Comparator<ITask> {
+
+ private final SortCriterion[] sortCriteria;
+
+ public static final int DEFAULT_SORT_DIRECTION = 1;
+
+ private static final SortKey DEFAULT_SORT_INDEX = SortKey.PRIORITY;
+
+ private static final SortKey DEFAULT_SORT_INDEX2 = SortKey.DATE_CREATED;
+
+ private static final String MEMENTO_KEY_SORT = "sort"; //$NON-NLS-1$
+
+ /**
+ * Return a array of values to pass to taskKeyComparator.compare() for sorting
+ *
+ * @param element
+ * the element to sort
+ * @return String array[component, taskId, summary]
+ */
+ public static String[] getSortableFromElement(IRepositoryElement element) {
+ final String a[] = new String[] { "", null, element.getSummary() }; //$NON-NLS-1$
+ if (element instanceof ITask) {
+ ITask task1 = (ITask) element;
+ if (task1.getTaskKey() != null) {
+ a[1] = task1.getTaskKey();
+ }
+ }
+ return a;
+ }
+
+ private final TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
+
+ public static final int CRITERIA_COUNT = SortKey.values().length - 1;
+
+ public TaskComparator() {
+ sortCriteria = new SortCriterion[CRITERIA_COUNT];
+ for (int index = 0; index < CRITERIA_COUNT; index++) {
+ sortCriteria[index] = new SortCriterion();
+ }
+ sortCriteria[0].setKey(DEFAULT_SORT_INDEX);
+ sortCriteria[1].setKey(DEFAULT_SORT_INDEX2);
+ }
+
+ public int compare(ITask element1, ITask element2) {
+ for (SortCriterion key : sortCriteria) {
+ int result;
+ switch (key.getKey()) {
+ case DATE_CREATED:
+ result = sortByDate(element1, element2, key.getDirection());
+ break;
+ case PRIORITY:
+ result = sortByPriority(element1, element2, key.getDirection());
+ break;
+ case SUMMARY:
+ result = sortBySummary(element1, element2, key.getDirection());
+ break;
+ case TASK_ID:
+ result = sortByID(element1, element2, key.getDirection());
+ break;
+ default: // NONE
+ return 0;
+ }
+
+ if (result != 0) {
+ return result;
+ }
+ }
+ return 0;
+ }
+
+ public SortCriterion getSortCriterion(int index) {
+ return sortCriteria[index];
+ }
+
+ public void restoreState(IMemento memento) {
+ if (memento != null) {
+ for (int index = 0; index < CRITERIA_COUNT; index++) {
+ IMemento child = memento.getChild(MEMENTO_KEY_SORT + index);
+ if (child != null && sortCriteria[index] != null) {
+ sortCriteria[index].restoreState(child);
+ }
+ }
+ }
+ }
+
+ public void saveState(IMemento memento) {
+ if (memento != null) {
+ for (int index = 0; index < CRITERIA_COUNT; index++) {
+ IMemento child = memento.createChild(MEMENTO_KEY_SORT + index);
+ if (child != null && sortCriteria[index] != null) {
+ sortCriteria[index].saveState(child);
+ }
+ }
+ }
+ }
+
+ private int sortByDate(ITask element1, ITask element2, int sortDirection) {
+ Date date1 = element1.getCreationDate();
+ Date date2 = element2.getCreationDate();
+ if (date1 == null) {
+ return (date2 != null) ? sortDirection : 0;
+ } else if (date2 == null) {
+ return -sortDirection;
+ }
+ return sortDirection * date1.compareTo(date2);
+ }
+
+ private int sortByID(ITask element1, ITask element2, int sortDirection) {
+ String key1 = element1.getTaskKey();
+ String key2 = element2.getTaskKey();
+ if (key1 == null) {
+ return (key2 != null) ? sortDirection : 0;
+ } else if (key2 == null) {
+ return -sortDirection;
+ }
+ return sortDirection * taskKeyComparator.compare2(key1, key2);
+ }
+
+ private int sortByPriority(ITask element1, ITask element2, int sortDirection) {
+ return sortDirection * element1.getPriority().compareToIgnoreCase(element2.getPriority());
+ }
+
+ private int sortBySummary(ITask element1, ITask element2, int sortDirection) {
+ String key1 = element1.getSummary();
+ String key2 = element2.getSummary();
+ if (key1 == null) {
+ return (key2 != null) ? sortDirection : 0;
+ } else if (key2 == null) {
+ return -sortDirection;
+ }
+ return sortDirection * key1.compareToIgnoreCase(key2);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskContainerComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskContainerComparator.java
new file mode 100644
index 0000000..0a1d866
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskContainerComparator.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.util.Comparator;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskContainerComparator implements Comparator<AbstractTaskContainer> {
+
+ public int compare(AbstractTaskContainer c1, AbstractTaskContainer c2) {
+ if (c1.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) {
+ return -1;
+ } else if (c2.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) {
+ return 1;
+ } else {
+ return c1.getSummary().compareToIgnoreCase(c2.getSummary());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDataExportOperation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDataExportOperation.java
new file mode 100644
index 0000000..fa3b49f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDataExportOperation.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.commons.core.ZipFileUtil;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+
+/**
+ * Zips task data up to specified directly and filename.
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ * @author Rob Elves
+ *
+ * TODO: Move into internal.tasks.core
+ */
+ at SuppressWarnings("restriction")
+public class TaskDataExportOperation implements IRunnableWithProgress {
+
+ private static final String EXPORT_JOB_LABEL = Messages.TaskDataExportOperation_exporting_task_data;
+
+ private static final Pattern excludeHidden = Pattern.compile("^\\."); //$NON-NLS-1$
+
+ private static final Pattern excludeBackup = Pattern.compile("backup\\z"); //$NON-NLS-1$
+
+ private final String destinationDirectory;
+
+ private final String destinationFilename;
+
+ public TaskDataExportOperation(String destinationDirectory, String destinationFilename) {
+ this.destinationFilename = destinationFilename;
+ this.destinationDirectory = destinationDirectory;
+ }
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+
+ monitor = Policy.monitorFor(monitor);
+ Set<File> filesToExport = new HashSet<File>();
+
+ selectFiles(filesToExport);
+
+ if (filesToExport.size() > 0 && Platform.isRunning()) {
+ try {
+ monitor.beginTask(EXPORT_JOB_LABEL, filesToExport.size() + 1);
+
+ Job.getJobManager().beginRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE,
+ new SubProgressMonitor(monitor, 1));
+ File destZipFile = new File(destinationDirectory + File.separator + destinationFilename);
+
+ //TODO: append a (2) to the file?
+ if (destZipFile.exists()) {
+ destZipFile.delete();
+ }
+
+ ZipFileUtil.createZipFile(destZipFile, new ArrayList<File>(filesToExport), TasksUiPlugin.getDefault()
+ .getDataDirectory(), monitor);
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not perform export", //$NON-NLS-1$
+ e));
+ } finally {
+
+ Job.getJobManager().endRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE);
+ monitor.done();
+ }
+ }
+ }
+
+ protected void selectFiles(Set<File> filesToExport) {
+ Set<Pattern> exclusionPatterns = new HashSet<Pattern>();
+ exclusionPatterns.add(excludeHidden);
+ exclusionPatterns.add(excludeBackup);
+ String dataRoot = TasksUiPlugin.getDefault().getDataDirectory();
+ File dataFolder = new File(dataRoot);
+ for (File file : dataFolder.listFiles()) {
+ boolean exclude = false;
+ for (Pattern pattern : exclusionPatterns) {
+ if (pattern.matcher(file.getName()).find()) {
+ exclude = true;
+ break;
+ }
+ }
+ if (!exclude) {
+ filesToExport.add(file);
+ }
+ }
+
+ }
+
+ protected File getSourceFolder() {
+ return new File(TasksUiPlugin.getDefault().getDataDirectory());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDataSnapshotOperation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDataSnapshotOperation.java
new file mode 100644
index 0000000..227fc60
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDataSnapshotOperation.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.io.File;
+import java.util.Set;
+
+/**
+ * @author Robert Elves
+ */
+public class TaskDataSnapshotOperation extends TaskDataExportOperation {
+
+ public TaskDataSnapshotOperation(String destinationDirectory, String destinationFilename) {
+ super(destinationDirectory, destinationFilename);
+ }
+
+ @Override
+ protected void selectFiles(Set<File> filesToExport) {
+
+ filesToExport.add(new File(getSourceFolder(), "tasks.xml.zip")); //$NON-NLS-1$
+ filesToExport.add(new File(getSourceFolder(), "repositories.xml.zip")); //$NON-NLS-1$
+ filesToExport.add(new File(getSourceFolder(), "contexts/activity.xml.zip")); //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDragSourceListener.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDragSourceListener.java
new file mode 100644
index 0000000..abf02f0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskDragSourceListener.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jevgeni Holodkov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.CopyTaskDetailsAction;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+
+/**
+ * @author Mik Kersten
+ * @author Leo Dos Santos
+ * @author Steffen Pingel
+ */
+public class TaskDragSourceListener extends DragSourceAdapter {
+
+ private IStructuredSelection currentSelection;
+
+ private final ISelectionProvider selectionProvider;
+
+ public TaskDragSourceListener(ISelectionProvider selectionProvider) {
+ this.selectionProvider = selectionProvider;
+ }
+
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ ISelection selection = selectionProvider.getSelection();
+ if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+ this.currentSelection = (IStructuredSelection) selection;
+ Iterator<?> it = currentSelection.iterator();
+ while (it.hasNext()) {
+ Object item = it.next();
+ if (item instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) item;
+ for (AbstractTaskContainer container : task.getParentContainers()) {
+ if (container instanceof UnsubmittedTaskContainer) {
+ event.doit = false;
+ return;
+ }
+ }
+ }
+ }
+ } else {
+ this.currentSelection = null;
+ event.doit = false;
+ }
+ }
+
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ if (currentSelection == null || currentSelection.isEmpty()) {
+ return;
+ }
+
+ if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
+ LocalSelectionTransfer.getTransfer().setSelection(currentSelection);
+ } else if (FileTransfer.getInstance().isSupportedType(event.dataType)) {
+ try {
+ File file = File.createTempFile(ITasksCoreConstants.EXPORT_FILE_NAME,
+ ITasksCoreConstants.FILE_EXTENSION);
+ file.deleteOnExit();
+ ImportExportUtil.export(file, currentSelection);
+
+ String[] paths = new String[1];
+ paths[0] = file.getAbsolutePath();
+ event.data = paths;
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Problems encountered dragging task", //$NON-NLS-1$
+ e));
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Problems encountered dragging task", //$NON-NLS-1$
+ e));
+ }
+ } else if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ event.data = CopyTaskDetailsAction.getTextForTask(currentSelection.getFirstElement());
+ }
+ }
+
+ @Override
+ public void dragFinished(DragSourceEvent event) {
+ if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskPropertyTester.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskPropertyTester.java
new file mode 100644
index 0000000..4828c26
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskPropertyTester.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TaskPropertyTester extends PropertyTester {
+
+ private static final String PROPERTY_CAN_GET_ATTACHEMNT = "canGetAttachment"; //$NON-NLS-1$
+
+ private static final String PROPERTY_CAN_POST_ATTACHMENT = "canPostAttachment"; //$NON-NLS-1$
+
+ private static final String PROPERTY_CONNECTOR_KIND = "connectorKind"; //$NON-NLS-1$
+
+ private static final String PROPERTY_HAS_EDITS = "hasEdits"; //$NON-NLS-1$
+
+ private static final String PROPERTY_HAS_LOCAL_CONTEXT = "hasLocalContext"; //$NON-NLS-1$
+
+ private static final String PROPERTY_HAS_REPOSITORY_CONTEXT = "hasRepositoryContext"; //$NON-NLS-1$
+
+ private static final String PROPERTY_IS_COMPLETED = "isCompleted"; //$NON-NLS-1$
+
+ private static final String PROPERTY_IS_LOCAL = "isLocal"; //$NON-NLS-1$
+
+ private static final String PROPERTY_LOCAL_COMPLETION_STATE = "hasLocalCompletionState"; //$NON-NLS-1$
+
+ private boolean equals(boolean value, Object expectedValue) {
+ return new Boolean(value).equals(expectedValue);
+ }
+
+ @SuppressWarnings("deprecation")
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof ITask) {
+ ITask task = (ITask) receiver;
+ if (PROPERTY_CONNECTOR_KIND.equals(property)) {
+ return task.getConnectorKind().equals(expectedValue);
+ } else if (PROPERTY_CAN_POST_ATTACHMENT.equals(property)) {
+ return equals(AttachmentUtil.canDownloadAttachment(task), expectedValue);
+ } else if (PROPERTY_CAN_GET_ATTACHEMNT.equals(property)) {
+ return equals(AttachmentUtil.canUploadAttachment(task), expectedValue);
+ } else if (PROPERTY_HAS_EDITS.equals(property)) {
+ return equals(ClearOutgoingAction.hasOutgoingChanges(task), expectedValue);
+ } else if (PROPERTY_HAS_LOCAL_CONTEXT.equals(property)) {
+ return equals(AttachmentUtil.hasLocalContext(task), expectedValue);
+ } else if (PROPERTY_HAS_REPOSITORY_CONTEXT.equals(property)) {
+ return equals(AttachmentUtil.hasContextAttachment(task), expectedValue);
+ } else if (PROPERTY_IS_COMPLETED.equals(property)) {
+ return equals(task.isCompleted(), expectedValue);
+ } else if (PROPERTY_IS_LOCAL.equals(property)) {
+ return (task instanceof AbstractTask) && equals(((AbstractTask) task).isLocal(), expectedValue);
+ } else if (PROPERTY_LOCAL_COMPLETION_STATE.equals(property)) {
+ return equals(TasksUiInternal.hasLocalCompletionState(task), expectedValue);
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskRepositoryPropertyTester.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskRepositoryPropertyTester.java
new file mode 100644
index 0000000..0a7027b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TaskRepositoryPropertyTester.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jingwen Ou 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:
+ * Jingwen Ou - initial API and implementation
+ * Tasktop Technologies - enhancements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Jingwen Ou
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryPropertyTester extends PropertyTester {
+
+ private static final String PROPERTY_CONNECTOR_KIND = "connectorKind"; //$NON-NLS-1$
+
+ private static final String PROPERTY_USER_MANAGED = "userManaged"; //$NON-NLS-1$
+
+ private boolean equals(boolean value, Object expectedValue) {
+ return new Boolean(value).equals(expectedValue);
+ }
+
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) receiver;
+ if (PROPERTY_CONNECTOR_KIND.equals(property)) {
+ return repository.getConnectorKind().equals(expectedValue);
+ } else if (PROPERTY_USER_MANAGED.equals(property)) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ return equals(connector != null && connector.isUserManaged(), expectedValue);
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java
new file mode 100644
index 0000000..8a5bada
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiExtensionReader.java
@@ -0,0 +1,437 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.externalization.TaskListExternalizer;
+import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskRepositoryLinkProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ * @author Rob Elves
+ */
+public class TasksUiExtensionReader {
+
+ public static final String EXTENSION_REPOSITORIES = "org.eclipse.mylyn.tasks.ui.repositories"; //$NON-NLS-1$
+
+ public static final String EXTENSION_REPOSITORY_LINKS_PROVIDERS = "org.eclipse.mylyn.tasks.ui.projectLinkProviders"; //$NON-NLS-1$
+
+ public static final String EXTENSION_TEMPLATES = "org.eclipse.mylyn.tasks.core.templates"; //$NON-NLS-1$
+
+ public static final String EXTENSION_TMPL_REPOSITORY = "repository"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_LABEL = "label"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_URLREPOSITORY = "urlRepository"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_REPOSITORYKIND = "repositoryKind"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_CHARACTERENCODING = "characterEncoding"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_ANONYMOUS = "anonymous"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_VERSION = "version"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_URLNEWTASK = "urlNewTask"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_URLTASK = "urlTask"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_URLTASKQUERY = "urlTaskQuery"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_NEWACCOUNTURL = "urlNewAccount"; //$NON-NLS-1$
+
+ public static final String ELMNT_TMPL_ADDAUTO = "addAutomatically"; //$NON-NLS-1$
+
+ public static final String ELMNT_REPOSITORY_CONNECTOR = "connectorCore"; //$NON-NLS-1$
+
+ public static final String ELMNT_REPOSITORY_LINK_PROVIDER = "linkProvider"; //$NON-NLS-1$
+
+ public static final String ELMNT_REPOSITORY_UI = "connectorUi"; //$NON-NLS-1$
+
+ public static final String ELMNT_MIGRATOR = "taskListMigrator"; //$NON-NLS-1$
+
+ public static final String ATTR_BRANDING_ICON = "brandingIcon"; //$NON-NLS-1$
+
+ public static final String ATTR_OVERLAY_ICON = "overlayIcon"; //$NON-NLS-1$
+
+ public static final String ELMNT_TYPE = "type"; //$NON-NLS-1$
+
+ public static final String ELMNT_QUERY_PAGE = "queryPage"; //$NON-NLS-1$
+
+ public static final String ELMNT_SETTINGS_PAGE = "settingsPage"; //$NON-NLS-1$
+
+ public static final String EXTENSION_TASK_CONTRIBUTOR = "org.eclipse.mylyn.tasks.ui.actions"; //$NON-NLS-1$
+
+ public static final String ATTR_ACTION_CONTRIBUTOR_CLASS = "taskHandlerClass"; //$NON-NLS-1$
+
+ public static final String DYNAMIC_POPUP_ELEMENT = "dynamicPopupMenu"; //$NON-NLS-1$
+
+ public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ public static final String ATTR_MENU_PATH = "menuPath"; //$NON-NLS-1$
+
+ public static final String EXTENSION_EDITORS = "org.eclipse.mylyn.tasks.ui.editors"; //$NON-NLS-1$
+
+ public static final String ELMNT_TASK_EDITOR_PAGE_FACTORY = "pageFactory"; //$NON-NLS-1$
+
+ public static final String EXTENSION_DUPLICATE_DETECTORS = "org.eclipse.mylyn.tasks.ui.duplicateDetectors"; //$NON-NLS-1$
+
+ public static final String ELMNT_DUPLICATE_DETECTOR = "detector"; //$NON-NLS-1$
+
+ public static final String ATTR_NAME = "name"; //$NON-NLS-1$
+
+ public static final String ATTR_KIND = "kind"; //$NON-NLS-1$
+
+ private static final String EXTENSION_PRESENTATIONS = "org.eclipse.mylyn.tasks.ui.presentations"; //$NON-NLS-1$
+
+ public static final String ELMNT_PRESENTATION = "presentation"; //$NON-NLS-1$
+
+ public static final String ATTR_ICON = "icon"; //$NON-NLS-1$
+
+ public static final String ATTR_PRIMARY = "primary"; //$NON-NLS-1$
+
+ public static final String ATTR_ID = "id"; //$NON-NLS-1$
+
+ private static boolean coreExtensionsRead = false;
+
+ public static void initStartupExtensions(TaskListExternalizer taskListExternalizer) {
+ if (!coreExtensionsRead) {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ // NOTE: has to be read first, consider improving
+ List<AbstractTaskListMigrator> migrators = new ArrayList<AbstractTaskListMigrator>();
+ IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORIES);
+ IExtension[] repositoryExtensions = repositoriesExtensionPoint.getExtensions();
+ for (IExtension repositoryExtension : repositoryExtensions) {
+ IConfigurationElement[] elements = repositoryExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELMNT_REPOSITORY_CONNECTOR)) {
+ readRepositoryConnectorCore(element);
+ } else if (element.getName().equals(ELMNT_MIGRATOR)) {
+ readMigrator(element, migrators);
+ }
+ }
+ }
+ taskListExternalizer.initialize(migrators);
+
+ IExtensionPoint templatesExtensionPoint = registry.getExtensionPoint(EXTENSION_TEMPLATES);
+ IExtension[] templateExtensions = templatesExtensionPoint.getExtensions();
+ for (IExtension templateExtension : templateExtensions) {
+ IConfigurationElement[] elements = templateExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(EXTENSION_TMPL_REPOSITORY)) {
+ readRepositoryTemplate(element);
+ }
+ }
+ }
+
+ IExtensionPoint presentationsExtensionPoint = registry.getExtensionPoint(EXTENSION_PRESENTATIONS);
+ IExtension[] presentations = presentationsExtensionPoint.getExtensions();
+ for (IExtension presentation : presentations) {
+ IConfigurationElement[] elements = presentation.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ readPresentation(element);
+ }
+ }
+
+ // NOTE: causes ..mylyn.context.ui to load
+ IExtensionPoint editorsExtensionPoint = registry.getExtensionPoint(EXTENSION_EDITORS);
+ IExtension[] editors = editorsExtensionPoint.getExtensions();
+ for (IExtension editor : editors) {
+ IConfigurationElement[] elements = editor.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELMNT_TASK_EDITOR_PAGE_FACTORY)) {
+ readTaskEditorPageFactory(element);
+ }
+ }
+ }
+
+ coreExtensionsRead = true;
+ }
+ }
+
+ public static void initWorkbenchUiExtensions() {
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ IExtensionPoint repositoriesExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORIES);
+ IExtension[] repositoryExtensions = repositoriesExtensionPoint.getExtensions();
+ for (IExtension repositoryExtension : repositoryExtensions) {
+ IConfigurationElement[] elements = repositoryExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELMNT_REPOSITORY_UI)) {
+ readRepositoryConnectorUi(element);
+ }
+ }
+ }
+
+ IExtensionPoint linkProvidersExtensionPoint = registry.getExtensionPoint(EXTENSION_REPOSITORY_LINKS_PROVIDERS);
+ IExtension[] linkProvidersExtensions = linkProvidersExtensionPoint.getExtensions();
+ for (IExtension linkProvidersExtension : linkProvidersExtensions) {
+ IConfigurationElement[] elements = linkProvidersExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELMNT_REPOSITORY_LINK_PROVIDER)) {
+ readLinkProvider(element);
+ }
+ }
+ }
+
+ IExtensionPoint duplicateDetectorsExtensionPoint = registry.getExtensionPoint(EXTENSION_DUPLICATE_DETECTORS);
+ IExtension[] dulicateDetectorsExtensions = duplicateDetectorsExtensionPoint.getExtensions();
+ for (IExtension dulicateDetectorsExtension : dulicateDetectorsExtensions) {
+ IConfigurationElement[] elements = dulicateDetectorsExtension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(ELMNT_DUPLICATE_DETECTOR)) {
+ readDuplicateDetector(element);
+ }
+ }
+ }
+
+ IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_TASK_CONTRIBUTOR);
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(DYNAMIC_POPUP_ELEMENT)) {
+ readDynamicPopupContributor(element);
+ }
+ }
+ }
+ }
+
+ private static void readPresentation(IConfigurationElement element) {
+ try {
+ String name = element.getAttribute(ATTR_NAME);
+
+ String iconPath = element.getAttribute(ATTR_ICON);
+ ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin( //
+ element.getContributor().getName(), iconPath);
+ AbstractTaskListPresentation presentation = (AbstractTaskListPresentation) element.createExecutableExtension(ATTR_CLASS);
+ presentation.setPluginId(element.getNamespaceIdentifier());
+ presentation.setImageDescriptor(imageDescriptor);
+ presentation.setName(name);
+
+ String primary = element.getAttribute(ATTR_PRIMARY);
+ if (primary != null && primary.equals("true")) { //$NON-NLS-1$
+ presentation.setPrimary(true);
+ }
+
+ TaskListView.addPresentation(presentation);
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load presentation extension", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readDuplicateDetector(IConfigurationElement element) {
+ try {
+ Object obj = element.createExecutableExtension(ATTR_CLASS);
+ if (obj instanceof AbstractDuplicateDetector) {
+ AbstractDuplicateDetector duplicateDetector = (AbstractDuplicateDetector) obj;
+ duplicateDetector.setName(element.getAttribute(ATTR_NAME));
+ duplicateDetector.setConnectorKind(element.getAttribute(ATTR_KIND));
+ TasksUiPlugin.getDefault().addDuplicateDetector(duplicateDetector);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load duplicate detector " + obj.getClass().getCanonicalName())); //$NON-NLS-1$
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load duplicate detector", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readLinkProvider(IConfigurationElement element) {
+ try {
+ Object repositoryLinkProvider = element.createExecutableExtension(ATTR_CLASS);
+ if (repositoryLinkProvider instanceof AbstractTaskRepositoryLinkProvider) {
+ TasksUiPlugin.getDefault().addRepositoryLinkProvider(
+ (AbstractTaskRepositoryLinkProvider) repositoryLinkProvider);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load repository link provider " //$NON-NLS-1$
+ + repositoryLinkProvider.getClass().getCanonicalName()));
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load repository link provider", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readTaskEditorPageFactory(IConfigurationElement element) {
+ String id = element.getAttribute(ATTR_ID);
+ if (id == null) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Editor page factory must specify id")); //$NON-NLS-1$
+ return;
+ }
+
+ try {
+ Object item = element.createExecutableExtension(ATTR_CLASS);
+ if (item instanceof AbstractTaskEditorPageFactory) {
+ AbstractTaskEditorPageFactory editorPageFactory = (AbstractTaskEditorPageFactory) item;
+ editorPageFactory.setId(id);
+ editorPageFactory.setPluginId(element.getNamespaceIdentifier());
+ TasksUiPlugin.getDefault().addTaskEditorPageFactory(editorPageFactory);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load editor page factory " + item.getClass().getCanonicalName() + " must implement " //$NON-NLS-1$ //$NON-NLS-2$
+ + AbstractTaskEditorPageFactory.class.getCanonicalName()));
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load page editor factory", //$NON-NLS-1$
+ e));
+ }
+ }
+
+ private static void readRepositoryConnectorCore(IConfigurationElement element) {
+ try {
+ Object connectorCore = element.createExecutableExtension(ATTR_CLASS);
+ if (connectorCore instanceof AbstractRepositoryConnector) {
+ AbstractRepositoryConnector repositoryConnector = (AbstractRepositoryConnector) connectorCore;
+ TasksUiPlugin.getRepositoryManager().addRepositoryConnector(repositoryConnector);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector core " //$NON-NLS-1$
+ + connectorCore.getClass().getCanonicalName()));
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector core", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readRepositoryConnectorUi(IConfigurationElement element) {
+ try {
+ Object connectorUiObject = element.createExecutableExtension(ATTR_CLASS);
+ if (connectorUiObject instanceof AbstractRepositoryConnectorUi) {
+ AbstractRepositoryConnectorUi connectorUi = (AbstractRepositoryConnectorUi) connectorUiObject;
+ TasksUiPlugin.getDefault().addRepositoryConnectorUi(connectorUi);
+
+ String iconPath = element.getAttribute(ATTR_BRANDING_ICON);
+ if (iconPath != null) {
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(element.getContributor()
+ .getName(), iconPath);
+ if (descriptor != null) {
+ TasksUiPlugin.getDefault().addBrandingIcon(connectorUi.getConnectorKind(),
+ CommonImages.getImage(descriptor));
+ }
+ }
+ String overlayIconPath = element.getAttribute(ATTR_OVERLAY_ICON);
+ if (overlayIconPath != null) {
+ ImageDescriptor descriptor = AbstractUIPlugin.imageDescriptorFromPlugin(element.getContributor()
+ .getName(), overlayIconPath);
+ if (descriptor != null) {
+ TasksUiPlugin.getDefault().addOverlayIcon(connectorUi.getConnectorKind(), descriptor);
+ }
+ }
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector ui " //$NON-NLS-1$
+ + connectorUiObject.getClass().getCanonicalName()));
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load connector ui", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readRepositoryTemplate(IConfigurationElement element) {
+ boolean anonymous = false;
+ boolean addAuto = false;
+
+ String label = element.getAttribute(ELMNT_TMPL_LABEL);
+ String serverUrl = element.getAttribute(ELMNT_TMPL_URLREPOSITORY);
+ String repKind = element.getAttribute(ELMNT_TMPL_REPOSITORYKIND);
+ String version = element.getAttribute(ELMNT_TMPL_VERSION);
+ String newTaskUrl = element.getAttribute(ELMNT_TMPL_URLNEWTASK);
+ String taskPrefix = element.getAttribute(ELMNT_TMPL_URLTASK);
+ String taskQueryUrl = element.getAttribute(ELMNT_TMPL_URLTASKQUERY);
+ String newAccountUrl = element.getAttribute(ELMNT_TMPL_NEWACCOUNTURL);
+ String encoding = element.getAttribute(ELMNT_TMPL_CHARACTERENCODING);
+ addAuto = Boolean.parseBoolean(element.getAttribute(ELMNT_TMPL_ADDAUTO));
+ anonymous = Boolean.parseBoolean(element.getAttribute(ELMNT_TMPL_ANONYMOUS));
+
+ if (serverUrl != null && label != null && repKind != null
+ && TasksUi.getRepositoryManager().getRepositoryConnector(repKind) != null) {
+ RepositoryTemplate template = new RepositoryTemplate(label, serverUrl, encoding, version, newTaskUrl,
+ taskPrefix, taskQueryUrl, newAccountUrl, anonymous, addAuto);
+ TasksUiPlugin.getRepositoryTemplateManager().addTemplate(repKind, template);
+
+ for (IConfigurationElement configElement : element.getChildren()) {
+ String name = configElement.getAttribute("name"); //$NON-NLS-1$
+ String value = configElement.getAttribute("value"); //$NON-NLS-1$
+ if (name != null && !name.equals("") && value != null) { //$NON-NLS-1$
+ template.addAttribute(name, value);
+ }
+ }
+ } else {
+ // TODO change error message to include hints about the cause of the error
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load repository template extension " + element.getName())); //$NON-NLS-1$
+ }
+ }
+
+ private static void readDynamicPopupContributor(IConfigurationElement element) {
+ try {
+ Object dynamicPopupContributor = element.createExecutableExtension(ATTR_CLASS);
+ String menuPath = element.getAttribute(ATTR_MENU_PATH);
+ if (dynamicPopupContributor instanceof IDynamicSubMenuContributor) {
+ TasksUiPlugin.getDefault().addDynamicPopupContributor(menuPath,
+ (IDynamicSubMenuContributor) dynamicPopupContributor);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load dynamic popup menu: " + dynamicPopupContributor.getClass().getCanonicalName() //$NON-NLS-1$
+ + " must implement " + IDynamicSubMenuContributor.class.getCanonicalName())); //$NON-NLS-1$
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load dynamic popup menu extension", e)); //$NON-NLS-1$
+ }
+ }
+
+ private static void readMigrator(IConfigurationElement element, List<AbstractTaskListMigrator> migrators) {
+ try {
+ Object migratorObject = element.createExecutableExtension(ATTR_CLASS);
+ if (migratorObject instanceof AbstractTaskListMigrator) {
+ AbstractTaskListMigrator migrator = (AbstractTaskListMigrator) migratorObject;
+ migrators.add(migrator);
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load task list migrator migrator: " + migratorObject.getClass().getCanonicalName() //$NON-NLS-1$
+ + " must implement " + AbstractTaskListMigrator.class.getCanonicalName())); //$NON-NLS-1$
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not load task list migrator extension", e)); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java
new file mode 100644
index 0000000..f0d32dc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiInternal.java
@@ -0,0 +1,933 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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.util;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.expressions.EvaluationContext;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.ProgressMonitorWrapper;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskJobFactory;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.OpenRepositoryTaskJob;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.CategoryEditorInput;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.MultiRepositoryAwareWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizardDialog;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewTaskWizardInternal;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.sync.SynchronizationJob;
+import org.eclipse.mylyn.tasks.core.sync.TaskJob;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TasksUiInternal {
+
+ // TODO e3.4 replace with SWT.NO_SCROLL constant
+ public static final int SWT_NO_SCROLL = 1 << 4;
+
+ public static final String ID_MENU_ACTIVE_TASK = "org.eclipse.mylyn.tasks.ui.menus.activeTask"; //$NON-NLS-1$
+
+ public static MultiRepositoryAwareWizard createNewTaskWizard(ITaskMapping taskSelection) {
+ return new NewTaskWizardInternal(taskSelection);
+ }
+
+ /**
+ * get the connector discovery wizard command. Calling code should check {@link Command#isEnabled()} on return.
+ *
+ * @return the command, or null if it is not available.
+ */
+ public static Command getConfiguredDiscoveryWizardCommand() {
+ ICommandService service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
+ final Command discoveryWizardCommand = service.getCommand("org.eclipse.mylyn.discovery.ui.discoveryWizardCommand"); //$NON-NLS-1$
+ if (discoveryWizardCommand != null) {
+ IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(
+ IHandlerService.class);
+
+ // update enabled state in case something has changed (ProxyHandler caches state)
+ // TODO e3.3 remove reflection
+ try {
+ EvaluationContext evaluationContext = createDiscoveryWizardEvaluationContext(handlerService);
+ Command.class.getDeclaredMethod("setEnabled", Object.class).invoke(discoveryWizardCommand, evaluationContext); //$NON-NLS-1$
+ } catch (InvocationTargetException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to enable discovery command", e)); //$NON-NLS-1$
+ } catch (Exception e) {
+ // expected on Eclipse 3.3
+ }
+ }
+ return discoveryWizardCommand;
+ }
+
+ public static EvaluationContext createDiscoveryWizardEvaluationContext(IHandlerService handlerService) {
+ EvaluationContext evaluationContext = new EvaluationContext(handlerService.getCurrentState(), Platform.class);
+ // must specify this variable otherwise the PlatformPropertyTester won't work
+ evaluationContext.addVariable("platform", Platform.class); //$NON-NLS-1$
+ return evaluationContext;
+ }
+
+ public static ImageDescriptor getPriorityImage(ITask task) {
+ if (task.isCompleted()) {
+ return CommonImages.COMPLETE;
+ } else {
+ return TasksUiImages.getImageDescriptorForPriority(PriorityLevel.fromString(task.getPriority()));
+ }
+ }
+
+ public static List<TaskEditor> getActiveRepositoryTaskEditors() {
+ List<TaskEditor> repositoryTaskEditors = new ArrayList<TaskEditor>();
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ for (IWorkbenchWindow window : windows) {
+ IEditorReference[] editorReferences = window.getActivePage().getEditorReferences();
+ for (IEditorReference editorReference : editorReferences) {
+ try {
+ if (editorReference.getEditorInput() instanceof TaskEditorInput) {
+ TaskEditorInput input = (TaskEditorInput) editorReference.getEditorInput();
+ if (input.getTask() != null) {
+ IEditorPart editorPart = editorReference.getEditor(false);
+ if (editorPart instanceof TaskEditor) {
+ repositoryTaskEditors.add((TaskEditor) editorPart);
+ }
+ }
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ }
+ return repositoryTaskEditors;
+ }
+
+ public static IProgressMonitor getUiMonitor(IProgressMonitor monitor) {
+ return new ProgressMonitorWrapper(monitor) {
+ @Override
+ public void beginTask(final String name, final int totalWork) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getWrappedProgressMonitor().beginTask(name, totalWork);
+ }
+ });
+ }
+
+ @Override
+ public void done() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getWrappedProgressMonitor().done();
+ }
+ });
+ }
+
+ @Override
+ public void subTask(final String name) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getWrappedProgressMonitor().subTask(name);
+ }
+ });
+ }
+
+ @Override
+ public void worked(final int work) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getWrappedProgressMonitor().worked(work);
+ }
+ });
+ }
+ };
+ }
+
+ public static void openEditor(TaskCategory category) {
+ final IEditorInput input = new CategoryEditorInput(category);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ TasksUiUtil.openEditor(input, CategoryEditor.ID_EDITOR, page);
+ }
+ }
+ });
+ }
+
+ public static void refreshAndOpenTaskListElement(IRepositoryElement element) {
+ if (element instanceof ITask) {
+ final AbstractTask task = (AbstractTask) element;
+
+ if (task instanceof LocalTask) {
+ TasksUiUtil.openTask(task);
+ } else {
+ String repositoryKind = task.getConnectorKind();
+ final AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repositoryKind);
+
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(repositoryKind,
+ task.getRepositoryUrl());
+ if (repository == null) {
+ displayStatus(Messages.TasksUiInternal_Failed_to_open_task, new Status(IStatus.ERROR,
+ TasksUiPlugin.ID_PLUGIN, Messages.TasksUiInternal_No_repository_found));
+ return;
+ }
+
+ if (connector != null) {
+ boolean opened = false;
+ if (TasksUiPlugin.getTaskDataManager().hasTaskData(task)) {
+ opened = TasksUiUtil.openTask(task);
+ }
+
+ if (!opened) {
+ if (connector.canSynchronizeTask(repository, task)) {
+ // TODO consider moving this into the editor, i.e. have the editor refresh the task if task data is missing
+ TasksUiInternal.synchronizeTask(connector, task, true, new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(task);
+ }
+ });
+ }
+ });
+ } else {
+ TasksUiUtil.openTask(task);
+ }
+ }
+ }
+ }
+ } else if (element instanceof TaskCategory) {
+ TasksUiInternal.openEditor((TaskCategory) element);
+ } else if (element instanceof IRepositoryQuery) {
+ RepositoryQuery query = (RepositoryQuery) element;
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(query.getConnectorKind());
+ TasksUiInternal.openEditQueryDialog(connectorUi, query);
+ }
+ }
+
+ public static TaskJob updateRepositoryConfiguration(final TaskRepository taskRepository) {
+ synchronized (taskRepository) {
+ taskRepository.setUpdating(true);
+ }
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ final TaskJob job = TasksUiInternal.getJobFactory().createUpdateRepositoryConfigurationJob(connector,
+ taskRepository);
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ synchronized (taskRepository) {
+ taskRepository.setUpdating(false);
+ }
+ if (job.getStatus() != null) {
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ if (!display.isDisposed()) {
+ TasksUiInternal.displayStatus(Messages.TasksUiInternal_Configuration_Refresh_Failed,
+ job.getStatus());
+ }
+ }
+ }
+ });
+ job.schedule();
+ return job;
+ }
+
+ private static void joinIfInTestMode(SynchronizationJob job) {
+ // FIXME the client code should join the job
+ if (CoreUtil.TEST_MODE) {
+ try {
+ job.join();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public static final Job synchronizeQueries(AbstractRepositoryConnector connector, TaskRepository repository,
+ Set<RepositoryQuery> queries, IJobChangeListener listener, boolean force) {
+ Assert.isTrue(queries.size() > 0);
+
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ for (RepositoryQuery query : queries) {
+ query.setSynchronizing(true);
+ }
+ taskList.notifySynchronizationStateChanged(queries);
+
+ SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeQueriesJob(connector, repository,
+ queries);
+ job.setUser(force);
+ if (listener != null) {
+ job.addJobChangeListener(listener);
+ }
+ if (force) {
+ final RepositoryQuery query = queries.iterator().next();
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (query.getStatus() != null) {
+ TasksUiInternal.asyncDisplayStatus(Messages.TasksUiInternal_Query_Synchronization_Failed,
+ query.getStatus());
+ }
+ }
+ });
+ }
+ job.schedule();
+ joinIfInTestMode(job);
+ return job;
+ }
+
+ /**
+ * For synchronizing a single query. Use synchronize(Set, IJobChangeListener) if synchronizing multiple queries at a
+ * time.
+ */
+ public static final Job synchronizeQuery(AbstractRepositoryConnector connector, RepositoryQuery repositoryQuery,
+ IJobChangeListener listener, boolean force) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(repositoryQuery.getConnectorKind(),
+ repositoryQuery.getRepositoryUrl());
+ return synchronizeQueries(connector, repository, Collections.singleton(repositoryQuery), listener, force);
+ }
+
+ public static SynchronizationJob synchronizeAllRepositories(boolean force) {
+ SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeRepositoriesJob(null);
+ job.setUser(force);
+ job.schedule();
+ joinIfInTestMode(job);
+ return job;
+ }
+
+ public static SynchronizationJob synchronizeRepository(TaskRepository repository, boolean force) {
+ return TasksUiPlugin.getSynchronizationScheduler().synchronize(repository);
+ }
+
+ /**
+ * Synchronize a single task. Note that if you have a collection of tasks to synchronize with this connector then
+ * you should call synchronize(Set<Set<AbstractTask> repositoryTasks, ...)
+ *
+ * @param listener
+ * can be null
+ */
+ public static Job synchronizeTask(AbstractRepositoryConnector connector, ITask task, boolean force,
+ IJobChangeListener listener) {
+ return synchronizeTasks(connector, Collections.singleton(task), force, listener);
+ }
+
+ /**
+ * @param listener
+ * can be null
+ */
+ public static Job synchronizeTasks(AbstractRepositoryConnector connector, Set<ITask> tasks, boolean force,
+ IJobChangeListener listener) {
+ ITaskList taskList = TasksUiInternal.getTaskList();
+ for (ITask task : tasks) {
+ ((AbstractTask) task).setSynchronizing(true);
+ }
+ ((TaskList) taskList).notifySynchronizationStateChanged(tasks);
+ // TODO notify task list?
+
+ SynchronizationJob job = TasksUiPlugin.getTaskJobFactory().createSynchronizeTasksJob(connector, tasks);
+ job.setUser(force);
+ job.setPriority(Job.DECORATE);
+ if (listener != null) {
+ job.addJobChangeListener(listener);
+ }
+ if (force && tasks.size() == 1) {
+ final ITask task = tasks.iterator().next();
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ if (task instanceof AbstractTask && ((AbstractTask) task).getStatus() != null) {
+ TasksUiInternal.asyncDisplayStatus(Messages.TasksUiInternal_Task_Synchronization_Failed,
+ ((AbstractTask) task).getStatus());
+ }
+ }
+ });
+ }
+ job.schedule();
+ joinIfInTestMode(job);
+ return job;
+ }
+
+ public static ITaskJobFactory getJobFactory() {
+ return TasksUiPlugin.getTaskJobFactory();
+ }
+
+ public static NewAttachmentWizardDialog openNewAttachmentWizard(Shell shell, TaskRepository taskRepository,
+ ITask task, TaskAttribute taskAttribute, TaskAttachmentWizard.Mode mode, AbstractTaskAttachmentSource source) {
+ TaskAttachmentWizard attachmentWizard = new TaskAttachmentWizard(taskRepository, task, taskAttribute);
+ attachmentWizard.setSource(source);
+ attachmentWizard.setMode(mode);
+ NewAttachmentWizardDialog dialog = new NewAttachmentWizardDialog(shell, attachmentWizard, false);
+ dialog.setBlockOnOpen(false);
+ dialog.create();
+ dialog.open();
+ return dialog;
+ }
+
+ private static MessageDialog createDialog(Shell shell, String title, String message, int type) {
+ return new MessageDialog(shell, title, null, message, type, new String[] { IDialogConstants.OK_LABEL }, 0);
+ }
+
+ private static void displayStatus(Shell shell, final String title, final IStatus status, boolean showLinkToErrorLog) {
+ // avoid blocking ui when in test mode
+ if (CoreUtil.TEST_MODE) {
+ StatusHandler.log(status);
+ return;
+ }
+
+ if (status.getCode() == RepositoryStatus.ERROR_INTERNAL) {
+ StatusHandler.fail(status);
+ } else {
+ if (status instanceof RepositoryStatus && ((RepositoryStatus) status).isHtmlMessage()) {
+ WebBrowserDialog.openAcceptAgreement(shell, title, status.getMessage(),
+ ((RepositoryStatus) status).getHtmlMessage());
+ } else {
+ String message = status.getMessage();
+ if (showLinkToErrorLog) {
+ message += "\n\n" + Messages.TasksUiInternal_See_error_log_for_details; //$NON-NLS-1$
+ }
+ switch (status.getSeverity()) {
+ case IStatus.CANCEL:
+ case IStatus.INFO:
+ createDialog(shell, title, message, MessageDialog.INFORMATION).open();
+ break;
+ case IStatus.WARNING:
+ createDialog(shell, title, message, MessageDialog.WARNING).open();
+ break;
+ case IStatus.ERROR:
+ default:
+ createDialog(shell, title, message, MessageDialog.ERROR).open();
+ break;
+ }
+ }
+ }
+ }
+
+ public static void asyncDisplayStatus(final String title, final IStatus status) {
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ if (!display.isDisposed()) {
+ display.asyncExec(new Runnable() {
+ public void run() {
+ displayStatus(title, status);
+ }
+ });
+ } else {
+ StatusHandler.log(status);
+ }
+ }
+
+ public static void logAndDisplayStatus(final String title, final IStatus status) {
+ StatusHandler.log(status);
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null && !workbench.getDisplay().isDisposed()) {
+ displayStatus(WorkbenchUtil.getShell(), title, status, true);
+ }
+ }
+
+ public static void displayStatus(final String title, final IStatus status) {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null && !workbench.getDisplay().isDisposed()) {
+ displayStatus(WorkbenchUtil.getShell(), title, status, false);
+ } else {
+ StatusHandler.log(status);
+ }
+ }
+
+ /**
+ * Creates a new local task and schedules for today
+ *
+ * @param summary
+ * if null DEFAULT_SUMMARY (New Task) used.
+ */
+ public static LocalTask createNewLocalTask(String summary) {
+ if (summary == null) {
+ summary = LocalRepositoryConnector.DEFAULT_SUMMARY;
+ }
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ LocalTask newTask = new LocalTask("" + taskList.getNextLocalTaskId(), summary); //$NON-NLS-1$
+ newTask.setPriority(PriorityLevel.P3.toString());
+ TasksUiInternal.getTaskList().addTask(newTask);
+ TasksUiPlugin.getTaskActivityManager().scheduleNewTask(newTask);
+
+ TaskListView view = TaskListView.getFromActivePerspective();
+ AbstractTaskCategory category = getSelectedCategory(view);
+ if (view != null && view.getDrilledIntoCategory() != null && view.getDrilledIntoCategory() != category) {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(), Messages.TasksUiInternal_Create_Task,
+ MessageFormat.format(Messages.TasksUiInternal_The_new_task_will_be_added_to_the_X_container,
+ UncategorizedTaskContainer.LABEL));
+ }
+ taskList.addTask(newTask, category);
+ return newTask;
+ }
+
+ public static AbstractTaskCategory getSelectedCategory(TaskListView view) {
+ Object selectedObject = null;
+ if (view != null) {
+ selectedObject = ((IStructuredSelection) view.getViewer().getSelection()).getFirstElement();
+ }
+ if (selectedObject instanceof TaskCategory) {
+ return (TaskCategory) selectedObject;
+ } else if (selectedObject instanceof ITask) {
+ ITask task = (ITask) selectedObject;
+ AbstractTaskContainer container = TaskCategory.getParentTaskCategory(task);
+ if (container instanceof TaskCategory) {
+ return (TaskCategory) container;
+ } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) {
+ return (TaskCategory) view.getDrilledIntoCategory();
+ }
+ } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) {
+ return (TaskCategory) view.getDrilledIntoCategory();
+ }
+ return TasksUiPlugin.getTaskList().getDefaultCategory();
+ }
+
+ public static Set<AbstractTaskContainer> getContainersFromWorkingSet(Set<IWorkingSet> containers) {
+
+ Set<AbstractTaskContainer> allTaskContainersInWorkingSets = new HashSet<AbstractTaskContainer>();
+ for (IWorkingSet workingSet : containers) {
+ IAdaptable[] elements = workingSet.getElements();
+ for (IAdaptable adaptable : elements) {
+ if (adaptable instanceof AbstractTaskContainer) {
+ allTaskContainersInWorkingSets.add(((AbstractTaskContainer) adaptable));
+ }
+ }
+ }
+ return allTaskContainersInWorkingSets;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static void openEditQueryDialog(AbstractRepositoryConnectorUi connectorUi, IRepositoryQuery query) {
+ try {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(),
+ query.getRepositoryUrl());
+ if (repository == null) {
+ return;
+ }
+
+ IWizard wizard = connectorUi.getQueryWizard(repository, query);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (wizard != null && shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return;
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to open query dialog", e)); //$NON-NLS-1$
+ }
+ }
+
+ public static ITaskList getTaskList() {
+ return TasksUiPlugin.getTaskList();
+ }
+
+ public static boolean isAnimationsEnabled() {
+ IPreferenceStore store = PlatformUI.getPreferenceStore();
+ return store.getBoolean(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS);
+ }
+
+ public static boolean hasValidUrl(ITask task) {
+ return isValidUrl(task.getUrl());
+ }
+
+ public static boolean isValidUrl(String url) {
+ if (url != null && !url.equals("") && !url.equals("http://") && !url.equals("https://")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ try {
+ new URL(url);
+ return true;
+ } catch (MalformedURLException e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @deprecated use {@link #closeTaskEditorInAllPages(ITask, boolean)}
+ */
+ @Deprecated
+ public static void closeEditorInActivePage(ITask task, boolean save) {
+ Assert.isNotNull(task);
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return;
+ }
+ IWorkbenchPage page = window.getActivePage();
+ if (page == null) {
+ return;
+ }
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ IEditorInput input = new TaskEditorInput(taskRepository, task);
+ IEditorPart editor = page.findEditor(input);
+ if (editor != null) {
+ page.closeEditor(editor, save);
+ }
+ }
+
+ public static void closeTaskEditorInAllPages(ITask task, boolean save) {
+ Assert.isNotNull(task);
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ IEditorInput input = new TaskEditorInput(taskRepository, task);
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ for (IWorkbenchWindow window : windows) {
+ IWorkbenchPage[] pages = window.getPages();
+ for (IWorkbenchPage page : pages) {
+ IEditorPart editor = page.findEditor(input);
+ if (editor != null) {
+ page.closeEditor(editor, save);
+ }
+ }
+ }
+ }
+
+ public static boolean hasLocalCompletionState(ITask task) {
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ return connector.hasLocalCompletionState(taskRepository, task);
+ }
+
+ /**
+ * Utility method to get the best parenting possible for a dialog. If there is a modal shell create it so as to
+ * avoid two modal dialogs. If not then return the shell of the active workbench window. If neither can be found
+ * return null.
+ * <p>
+ * <b>Note: Applied from patch on bug 99472.</b>
+ *
+ * @return Shell or <code>null</code>
+ * @deprecated Use {@link WorkbenchUtil#getShell()} instead
+ */
+ @Deprecated
+ public static Shell getShell() {
+ return WorkbenchUtil.getShell();
+ }
+
+ public static TaskData createTaskData(TaskRepository taskRepository, ITaskMapping initializationData,
+ ITaskMapping selectionData, IProgressMonitor monitor) throws CoreException {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ TaskAttributeMapper mapper = taskDataHandler.getAttributeMapper(taskRepository);
+ TaskData taskData = new TaskData(mapper, taskRepository.getConnectorKind(), taskRepository.getRepositoryUrl(),
+ ""); //$NON-NLS-1$
+ taskDataHandler.initializeTaskData(taskRepository, taskData, initializationData, monitor);
+ if (selectionData != null) {
+ connector.getTaskMapping(taskData).merge(selectionData);
+ }
+ return taskData;
+ }
+
+ public static void createAndOpenNewTask(TaskData taskData) throws CoreException {
+ ITask task = TasksUiUtil.createOutgoingNewTask(taskData.getConnectorKind(), taskData.getRepositoryUrl());
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskData.getConnectorKind());
+ ITaskMapping mapping = connector.getTaskMapping(taskData);
+ String summary = mapping.getSummary();
+ if (summary != null && summary.length() > 0) {
+ task.setSummary(summary);
+ }
+ String taskKind = mapping.getTaskKind();
+ if (taskKind != null && taskKind.length() > 0) {
+ task.setTaskKind(taskKind);
+ }
+ UnsubmittedTaskContainer unsubmitted = TasksUiPlugin.getTaskList().getUnsubmittedContainer(
+ taskData.getRepositoryUrl());
+ if (unsubmitted != null) {
+ TasksUiPlugin.getTaskList().addTask(task, unsubmitted);
+ }
+ ITaskDataWorkingCopy workingCopy = TasksUi.getTaskDataManager().createWorkingCopy(task, taskData);
+ workingCopy.save(null, null);
+ TaskRepository localTaskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ TaskEditorInput editorInput = new TaskEditorInput(localTaskRepository, task);
+ TasksUiUtil.openEditor(editorInput, TaskEditor.ID_EDITOR, null);
+ }
+
+ /**
+ * Only override if task should be opened by a custom editor, default behavior is to open with a rich editor,
+ * falling back to the web browser if not available.
+ *
+ * @return true if the task was successfully opened
+ */
+ public static boolean openRepositoryTask(String connectorKind, String repositoryUrl, String id) {
+ IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
+ AbstractRepositoryConnector connector = repositoryManager.getRepositoryConnector(connectorKind);
+ String taskUrl = connector.getTaskUrl(repositoryUrl, id);
+ if (taskUrl == null) {
+ return false;
+ }
+
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ if (windows != null && windows.length > 0) {
+ window = windows[0];
+ }
+ }
+ if (window == null) {
+ return false;
+ }
+ IWorkbenchPage page = window.getActivePage();
+
+ OpenRepositoryTaskJob job = new OpenRepositoryTaskJob(connectorKind, repositoryUrl, id, taskUrl, page);
+ job.schedule();
+
+ return true;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean openTaskInBackground(ITask task, boolean bringToTop) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IEditorPart activeEditor = null;
+ IWorkbenchPart activePart = null;
+ IWorkbenchPage activePage = window.getActivePage();
+ if (activePage != null) {
+ activeEditor = activePage.getActiveEditor();
+ activePart = activePage.getActivePart();
+ }
+ boolean opened = TasksUiUtil.openTask(task);
+ if (opened && activePage != null) {
+ if (!bringToTop && activeEditor != null) {
+ activePage.bringToTop(activeEditor);
+ }
+ if (activePart != null) {
+ activePage.activate(activePart);
+ }
+ }
+ return opened;
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unable to open editor for \"" //$NON-NLS-1$
+ + task.getSummary() + "\": no active workbench window")); //$NON-NLS-1$
+ }
+ return false;
+ }
+
+ /**
+ * Returns text masking the &-character from decoration as an accelerator in SWT labels.
+ */
+ public static String escapeLabelText(String text) {
+ return (text != null) ? text.replace("&", "&&") : null; // mask & from SWT //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static void preservingSelection(final TreeViewer viewer, Runnable runnable) {
+ final ISelection selection = viewer.getSelection();
+
+ runnable.run();
+
+ if (selection != null) {
+ ISelection newSelection = viewer.getSelection();
+ if ((newSelection == null || newSelection.isEmpty()) && !(selection == null || selection.isEmpty())) {
+ // delay execution to ensure that any delayed tree updates such as expand all have been processed and the selection is revealed properly
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ viewer.setSelection(selection, true);
+ }
+ });
+ } else if (newSelection instanceof ITreeSelection && !newSelection.isEmpty()) {
+ viewer.reveal(((ITreeSelection) newSelection).getFirstElement());
+ }
+ }
+ }
+
+ public static String getFormattedDuration(long duration, boolean includeSeconds) {
+ long seconds = duration / 1000;
+ long minutes = 0;
+ long hours = 0;
+ // final long SECOND = 1000;
+ final long MIN = 60;
+ final long HOUR = MIN * 60;
+ String formatted = ""; //$NON-NLS-1$
+
+ String hour = ""; //$NON-NLS-1$
+ String min = ""; //$NON-NLS-1$
+ String sec = ""; //$NON-NLS-1$
+ if (seconds >= HOUR) {
+ hours = seconds / HOUR;
+ if (hours == 1) {
+ hour = hours + Messages.TasksUiInternal__hour_;
+ } else if (hours > 1) {
+ hour = hours + Messages.TasksUiInternal__hours_;
+ }
+ seconds -= hours * HOUR;
+
+ minutes = seconds / MIN;
+ if (minutes == 1) {
+ min = minutes + Messages.TasksUiInternal__minute_;
+ } else if (minutes != 1) {
+ min = minutes + Messages.TasksUiInternal__minutes_;
+ }
+ seconds -= minutes * MIN;
+ if (seconds == 1) {
+ sec = seconds + Messages.TasksUiInternal__second;
+ } else if (seconds > 1) {
+ sec = seconds + Messages.TasksUiInternal__seconds;
+ }
+ formatted += hour + min;
+ if (includeSeconds) {
+ formatted += sec;
+ }
+ } else if (seconds >= MIN) {
+ minutes = seconds / MIN;
+ if (minutes == 1) {
+ min = minutes + Messages.TasksUiInternal__minute_;
+ } else if (minutes != 1) {
+ min = minutes + Messages.TasksUiInternal__minutes_;
+ }
+ seconds -= minutes * MIN;
+ if (seconds == 1) {
+ sec = seconds + Messages.TasksUiInternal__second;
+ } else if (seconds > 1) {
+ sec = seconds + Messages.TasksUiInternal__seconds;
+ }
+ formatted += min;
+ if (includeSeconds) {
+ formatted += sec;
+ }
+ } else {
+ if (seconds == 1) {
+ sec = seconds + Messages.TasksUiInternal__second;
+ } else if (seconds > 1) {
+ sec = seconds + Messages.TasksUiInternal__seconds;
+ }
+ if (includeSeconds) {
+ formatted += sec;
+ }
+ }
+ return formatted;
+ }
+
+ public static AbstractTask getTask(String repositoryUrl, String taskId, String fullUrl) {
+ AbstractTask task = null;
+ if (repositoryUrl != null && taskId != null) {
+ task = (AbstractTask) TasksUiInternal.getTaskList().getTask(repositoryUrl, taskId);
+ }
+ if (task == null && fullUrl != null) {
+ task = TasksUiInternal.getTaskByUrl(fullUrl);
+ }
+ if (task == null && repositoryUrl != null && taskId != null) {
+ task = TasksUiPlugin.getTaskList().getTaskByKey(repositoryUrl, taskId);
+ }
+ return task;
+ }
+
+ /**
+ * Searches for a task whose URL matches
+ *
+ * @return first task with a matching URL.
+ */
+ public static AbstractTask getTaskByUrl(String taskUrl) {
+ Collection<AbstractTask> tasks = TasksUiPlugin.getTaskList().getAllTasks();
+ for (AbstractTask task : tasks) {
+ String currUrl = task.getUrl();
+ if (currUrl != null && !currUrl.equals("") && currUrl.equals(taskUrl)) { //$NON-NLS-1$
+ return task;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiMenus.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiMenus.java
new file mode 100644
index 0000000..a7cf48e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TasksUiMenus.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.mylyn.internal.tasks.ui.actions.SaveAttachmentsAction;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TasksUiMenus {
+
+ public static void fillTaskAttachmentMenu(IMenuManager manager) {
+ final Action saveAction = new SaveAttachmentsAction(Messages.TasksUiMenus_Save_);
+
+ final Action copyURLToClipAction = new Action(Messages.TasksUiMenus_Copy_URL) {
+ @Override
+ public void run() {
+ ITaskAttachment attachment = AttachmentUtil.getSelectedAttachment();
+ if (attachment != null) {
+ Clipboard clip = new Clipboard(PlatformUI.getWorkbench().getDisplay());
+ clip.setContents(new Object[] { attachment.getUrl() },
+ new Transfer[] { TextTransfer.getInstance() });
+ clip.dispose();
+ }
+ }
+ };
+
+ final Action copyToClipAction = new Action(Messages.TasksUiMenus_Copy_Contents) {
+ @Override
+ public void run() {
+ ITaskAttachment attachment = AttachmentUtil.getSelectedAttachment();
+ if (attachment != null) {
+ CopyAttachmentToClipboardJob job = new CopyAttachmentToClipboardJob(attachment);
+ job.setUser(true);
+ job.schedule();
+ }
+ }
+ };
+
+ manager.add(new Separator("group.open")); //$NON-NLS-1$
+ manager.add(new Separator("group.save")); //$NON-NLS-1$
+ manager.add(saveAction);
+ manager.add(copyURLToClipAction);
+ manager.add(copyToClipAction);
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java
new file mode 100644
index 0000000..cb27391
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/TreeWalker.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TreeWalker {
+
+ public enum Direction {
+ UP, DOWN
+ };
+
+ public static abstract class TreeVisitor {
+
+ public abstract boolean visit(Object object);
+
+ }
+
+ private Direction direction = Direction.DOWN;
+
+ private final TreeViewer treeViewer;
+
+ private final Tree tree;
+
+ private boolean expandNodes;
+
+ public TreeWalker(TreeViewer treeViewer) {
+ this.treeViewer = treeViewer;
+ this.tree = treeViewer.getTree();
+ }
+
+ public Direction getDirection() {
+ return direction;
+ }
+
+ public boolean getExpandNodes() {
+ return expandNodes;
+ }
+
+ private TreePath getTreePath(TreeItem item) {
+ List<Object> path = new ArrayList<Object>();
+ do {
+ // the tree is probably not fully refreshed at this point
+ if (item.getData() == null) {
+ return null;
+ }
+ path.add(0, item.getData());
+ item = item.getParentItem();
+ } while (item != null);
+ return new TreePath(path.toArray());
+ }
+
+ public void setDirection(Direction direction) {
+ this.direction = direction;
+ }
+
+ public void setExpandNodes(boolean expandNodes) {
+ this.expandNodes = expandNodes;
+ }
+
+ private TreePath visitChildren(TreeViewer viewer, TreePath itemPath, TreeItem item, TreeVisitor visitor) {
+ boolean restoreCollapsedState = false;
+ // expand item
+ try {
+ if (getExpandNodes()) {
+ boolean expandedState = item.getExpanded();
+ if (!expandedState) {
+ restoreCollapsedState = true;
+ viewer.setExpandedState(itemPath, true);
+ }
+ }
+
+ TreeItem[] children = item.getItems();
+ if (children.length > 0 && children[0].getData() != null) {
+ TreePath childPath = visitItems(viewer, itemPath, children, null, visitor);
+ if (childPath != null) {
+ return childPath;
+ }
+ }
+
+ } finally {
+ if (restoreCollapsedState) {
+ // restore item state
+ viewer.setExpandedState(itemPath, false);
+ }
+ }
+
+ return null;
+ }
+
+ private TreePath visitItems(TreeViewer viewer, TreePath parentPath, TreeItem[] items, TreeItem visitedItem,
+ TreeVisitor visitor) {
+ if (direction == Direction.UP) {
+ Collections.reverse(Arrays.asList(items));
+ }
+
+ boolean found = (visitedItem == null);
+ for (TreeItem item : items) {
+ if (!found) {
+ if (item == visitedItem) {
+ found = true;
+ }
+ } else {
+ TreePath itemPath = parentPath.createChildPath(item.getData());
+
+ if (direction == Direction.DOWN) {
+ if (visitor.visit(item.getData())) {
+ return itemPath;
+ }
+ }
+
+ TreePath childPath = visitChildren(viewer, itemPath, item, visitor);
+ if (childPath != null) {
+ return childPath;
+ }
+
+ if (direction == Direction.UP) {
+ if (visitor.visit(item.getData())) {
+ return itemPath;
+ }
+ }
+ }
+ }
+
+ // visit parent siblings
+ if (visitedItem != null) {
+ TreeItem parent = visitedItem.getParentItem();
+ if (parent != null) {
+ if (direction == Direction.UP) {
+ if (visitor.visit(parent.getData())) {
+ return parentPath;
+ }
+ }
+
+ return visitSiblings(viewer, parent, visitor);
+ }
+ }
+
+ return null;
+ }
+
+ private TreePath visitSiblings(TreeViewer viewer, TreeItem item, TreeVisitor visitor) {
+ TreeItem[] siblings;
+ TreePath path;
+ TreeItem parent = item.getParentItem();
+ if (parent != null) {
+ path = getTreePath(parent);
+ if (path == null) {
+ return null;
+ }
+ siblings = parent.getItems();
+ } else {
+ path = TreePath.EMPTY;
+ siblings = viewer.getTree().getItems();
+ }
+ return visitItems(viewer, path, siblings, item, visitor);
+ }
+
+ public TreePath walk(TreeVisitor visitor, TreeItem startItem) {
+ TreePath path = null;
+ if (startItem != null) {
+ if (direction == Direction.DOWN) {
+ path = getTreePath(startItem);
+ if (path != null) {
+ path = visitChildren(treeViewer, path, startItem, visitor);
+ }
+ }
+ if (path == null) {
+ path = visitSiblings(treeViewer, startItem, visitor);
+ }
+ } else {
+ path = visitItems(treeViewer, TreePath.EMPTY, tree.getItems(), null, visitor);
+ }
+
+ return path;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/WebBrowserDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/WebBrowserDialog.java
new file mode 100644
index 0000000..5e4c53d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/WebBrowserDialog.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.util;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+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.Shell;
+
+/**
+ * Dialog to show the contents of an html page to the user
+ *
+ * @author Shawn Minto
+ */
+public class WebBrowserDialog extends MessageDialog {
+
+ private String data = null;
+
+ public WebBrowserDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage,
+ int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String data) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
+ this.data = data;
+ this.setShellStyle(SWT.SHELL_TRIM | SWT.RESIZE);
+ }
+
+ public static int openAcceptAgreement(Shell parent, String title, String message, String data) {
+ WebBrowserDialog dialog = new WebBrowserDialog(parent, title, null, // accept
+ message, NONE, new String[] { IDialogConstants.OK_LABEL }, 0, data);
+ // ok is the default
+ return dialog.open();
+ }
+
+ @Override
+ public Control createCustomArea(Composite parent) {
+ GridLayout layout = new GridLayout();
+ parent.setLayout(layout);
+ layout.numColumns = 1;
+
+ Browser b = new Browser(parent, SWT.NONE);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.horizontalSpan = 1;
+ gd.verticalSpan = 50;
+ b.setLayoutData(gd);
+ b.setText(data);
+
+ return parent;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/messages.properties
new file mode 100644
index 0000000..ab79587
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/util/messages.properties
@@ -0,0 +1,45 @@
+AttachmentUtil_The_context_is_empty=The context is empty.
+AttachmentUtil_Downloading_attachment=Downloading attachment
+AttachmentUtil_Mylyn_Information=Mylyn Information
+
+CopyAttachmentToClipboardJob_Copy_Attachment_to_Clipboard=Copy Attachment to Clipboard
+CopyAttachmentToClipboardJob_Copying_Attachment_to_Clipboard=Copying Attachment to Clipboard
+
+DownloadAttachmentJob_Copy_Attachment_to_Clipboard=Copy Attachment to Clipboard
+DownloadAttachmentJob_Downloading_Attachment=Downloading Attachment
+ImportExportUtil_Tasks_and_queries_Filter0=Mylyn Tasks and Queries (*{0})
+SortKindEntry_Date_Created=Date Created
+SortKindEntry_None=None
+SortKindEntry_Priority=Priority
+SortKindEntry_Summary=Summary
+SortKindEntry_Task_ID=Task ID
+
+SaveAttachmentsAction_directoryDoesntExist=Directory doesn't exist
+SaveAttachmentsAction_directoryDoesntExist0=Directory {0} doesn't exist.
+SaveAttachmentsAction_fileExists_doYouWantToOverwrite0=File {0} already exists. Do you want to overwrite it?
+SaveAttachmentsAction_overwriteFile0=Overwrite file {0}
+SaveAttachmentsAction_selectDirectory=Select directory
+SaveAttachmentsAction_selectDirectoryHint=Attachments will be saved to selected directory
+
+TaskDataExportOperation_exporting_task_data=Exporting Task Data
+
+TasksUiInternal_Configuration_Refresh_Failed=Configuration Refresh Failed
+TasksUiInternal_Create_Task=Create Task
+TasksUiInternal_The_new_task_will_be_added_to_the_X_container=The new task will be added to the {0} container, since tasks can not be added to a query.
+TasksUiInternal_Query_Synchronization_Failed=Query Synchronization Failed
+TasksUiInternal_Task_Synchronization_Failed=Task Synchronization Failed
+TasksUiInternal__hour_=\ hour
+TasksUiInternal__hours_=\ hours
+TasksUiInternal__minute_=\ minute
+TasksUiInternal__minutes_=\ minutes
+TasksUiInternal__second=\ second
+TasksUiInternal__seconds=\ seconds
+TasksUiInternal_Failed_to_open_task=Failed to Open Task
+TasksUiInternal_No_repository_found=No repository found for task. Please create repository in Task Repositories view.
+TasksUiInternal_See_error_log_for_details=See error log for details.
+
+TasksUiMenus_Copy_Contents=Copy Contents
+TasksUiMenus_Copy_URL=Copy &URL
+TasksUiMenus_File_exists_=File exists\!
+TasksUiMenus_Overwrite_existing_file_=Overwrite existing file?\n
+TasksUiMenus_Save_=Save...
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java
new file mode 100644
index 0000000..39c7bb3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListContentProvider.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+
+/**
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ */
+public abstract class AbstractTaskListContentProvider implements ITreeContentProvider {
+
+ protected TaskListView taskListView;
+
+ public AbstractTaskListContentProvider(TaskListView view) {
+ this.taskListView = view;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListPresentation.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListPresentation.java
new file mode 100644
index 0000000..70becff
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/AbstractTaskListPresentation.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IPluginContribution;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public abstract class AbstractTaskListPresentation implements IPluginContribution {
+
+ private String pluginId;
+
+ private final String id;
+
+ private String name;
+
+ private ImageDescriptor imageDescriptor;
+
+ private boolean primary = false;
+
+ private final Map<TaskListView, AbstractTaskListContentProvider> contentProviders = new HashMap<TaskListView, AbstractTaskListContentProvider>();
+
+ public AbstractTaskListPresentation(String id) {
+ this.id = id;
+ }
+
+ public AbstractTaskListContentProvider getContentProvider(TaskListView taskListView) {
+ AbstractTaskListContentProvider contentProvider = contentProviders.get(taskListView);
+ if (contentProvider == null) {
+ contentProvider = createContentProvider(taskListView);
+ contentProviders.put(taskListView, contentProvider);
+ }
+ return contentProvider;
+ }
+
+ /**
+ * Creates a new instance of a content provider for a particular instance of the Task List
+ *
+ * TODO: change view parameter to be the viewer
+ */
+ protected abstract AbstractTaskListContentProvider createContentProvider(TaskListView taskListView);
+
+ public ImageDescriptor getImageDescriptor() {
+ return imageDescriptor;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setImageDescriptor(ImageDescriptor imageDescriptor) {
+ this.imageDescriptor = imageDescriptor;
+ }
+
+ public boolean isPrimary() {
+ return primary;
+ }
+
+ public void setPrimary(boolean primary) {
+ this.primary = primary;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public final String getLocalId() {
+ return getId();
+ }
+
+ public final String getPluginId() {
+ return pluginId;
+ }
+
+ public final void setPluginId(String pluginId) {
+ this.pluginId = pluginId;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java
new file mode 100644
index 0000000..574531c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/CustomTaskListDecorationDrawer.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - fixes for bug 169916
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Mik Kersten
+ */
+class CustomTaskListDecorationDrawer implements Listener {
+
+ private final TaskListView taskListView;
+
+ private final int activationImageOffset;
+
+ private final Image taskActive = CommonImages.getImage(TasksUiImages.CONTEXT_ACTIVE);
+
+ private final Image taskInactive = CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE_EMPTY);
+
+ private final Image taskInactiveContext = CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE);
+
+ // see bug 185004
+ private final int platformSpecificSquish;
+
+ private final Rectangle lastClippingArea;
+
+ private final boolean tweakClipping;
+
+ private boolean useStrikethroughForCompleted;
+
+ private final org.eclipse.jface.util.IPropertyChangeListener PROPERTY_LISTENER = new org.eclipse.jface.util.IPropertyChangeListener() {
+
+ public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
+ if (event.getProperty().equals(ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED)) {
+ if (event.getNewValue() instanceof Boolean) {
+ useStrikethroughForCompleted = (Boolean) event.getNewValue();
+ taskListView.refresh();
+ }
+ }
+ }
+ };
+
+ CustomTaskListDecorationDrawer(TaskListView taskListView, int activationImageOffset) {
+ this.taskListView = taskListView;
+ this.activationImageOffset = activationImageOffset;
+ this.lastClippingArea = new Rectangle(0, 0, 0, 0);
+ this.tweakClipping = PlatformUtil.isPaintItemClippingRequired();
+ this.platformSpecificSquish = PlatformUtil.getTreeItemSquish();
+ this.taskListView.synchronizationOverlaid = TasksUiPlugin.getDefault().getPluginPreferences().getBoolean(
+ ITasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT);
+ this.useStrikethroughForCompleted = TasksUiPlugin.getDefault().getPluginPreferences().getBoolean(
+ ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED);
+ TasksUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(PROPERTY_LISTENER);
+ }
+
+ /*
+ * NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
+ * Therefore, it is critical for performance that these methods be as
+ * efficient as possible.
+ */
+ public void handleEvent(Event event) {
+ Object data = event.item.getData();
+ Image activationImage = null;
+ if (data instanceof ITask) {
+ AbstractTask task = (AbstractTask) data;
+ if (task.isActive()) {
+ activationImage = taskActive;
+ } else if (ContextCore.getContextManager().hasContext(task.getHandleIdentifier())) {
+ activationImage = taskInactiveContext;
+ } else {
+ activationImage = taskInactive;
+ }
+ }
+ if (!CommonFonts.HAS_STRIKETHROUGH) {
+ if (data instanceof AbstractTask & useStrikethroughForCompleted) {
+ AbstractTask task = (AbstractTask) data;
+ if (task.isCompleted()) {
+ Rectangle bounds;
+ //if (isCOCOA) {
+ bounds = ((TreeItem) event.item).getTextBounds(0);
+// } else {
+// bounds = ((TreeItem) event.item).getBounds();
+// }
+ int lineY = bounds.y + (bounds.height / 2);
+ String itemText = ((TreeItem) event.item).getText();
+ Point extent = event.gc.textExtent(itemText);
+ event.gc.drawLine(bounds.x, lineY, bounds.x + extent.x, lineY);
+ }
+ }
+ }
+ if (data instanceof ITaskContainer) {
+ switch (event.type) {
+ case SWT.EraseItem: {
+// if ("gtk".equals(SWT.getPlatform())) { //$NON-NLS-1$
+// // GTK requires drawing on erase event so that images don't disappear when selected.
+// if (activationImage != null) {
+// drawActivationImage(activationImageOffset, event, activationImage);
+// }
+// if (!this.taskListView.synchronizationOverlaid) {
+// if (data instanceof ITaskContainer) {
+// drawSyncronizationImage((ITaskContainer) data, event);
+// }
+// }
+// }
+
+ // TODO: would be nice not to do this on each item's painting
+// String text = tree.getFilterControl().getText();
+// if (text != null && !text.equals("") && tree.getViewer().getExpandedElements().length <= 12) {
+// int offsetY = tree.getViewer().getExpandedElements().length * tree.getViewer().getTree().getItemHeight();
+// event.gc.drawText("Open search dialog...", 20, offsetY - 10);
+// }
+ if (tweakClipping) {
+ lastClippingArea.x = event.x;
+ lastClippingArea.y = event.y;
+ lastClippingArea.width = event.width;
+ lastClippingArea.height = event.height;
+ }
+ break;
+ }
+ case SWT.PaintItem: {
+ Rectangle clipping = null;
+ if (tweakClipping) {
+ // GTK requires setting the clipping from the erase event so that images can be drawn to the left of the content area
+ clipping = event.gc.getClipping();
+ event.gc.setClipping(lastClippingArea);
+ }
+ if (activationImage != null) {
+ drawActivationImage(activationImageOffset, event, activationImage);
+ }
+ if (data instanceof ITaskContainer) {
+ drawSyncronizationImage((ITaskContainer) data, event);
+ }
+ if (tweakClipping) {
+ event.gc.setClipping(clipping);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ private void drawSyncronizationImage(ITaskContainer element, Event event) {
+ Image image = null;
+ int offsetX = PlatformUtil.getIncomingImageOffset();
+ int offsetY = (event.height / 2) - 5;
+ if (taskListView.synchronizationOverlaid) {
+ offsetX = event.x + 18 - platformSpecificSquish;
+ offsetY += 2;
+ }
+ if (element != null) {
+ if (element instanceof ITask) {
+ image = CommonImages.getImage(getSynchronizationImageDescriptor(element,
+ taskListView.synchronizationOverlaid));
+ } else {
+ int imageOffset = 0;
+ if (!hideDecorationOnContainer(element, (TreeItem) event.item)
+ && AbstractTaskListFilter.hasDescendantIncoming(element)) {
+ if (taskListView.synchronizationOverlaid) {
+ image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_OLD_INCOMMING);
+ } else {
+ image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_INCOMMING);
+ }
+ } else if (element instanceof IRepositoryQuery) {
+ RepositoryQuery query = (RepositoryQuery) element;
+ if (query.getStatus() != null) {
+ image = CommonImages.getImage(CommonImages.OVERLAY_SYNC_WARNING);
+ if (taskListView.synchronizationOverlaid) {
+ imageOffset = 11;
+ } else {
+ imageOffset = 3;
+ }
+ }
+ }
+
+ int additionalSquish = 0;
+ if (platformSpecificSquish > 0 && taskListView.synchronizationOverlaid) {
+ additionalSquish = platformSpecificSquish + 3;
+ } else if (platformSpecificSquish > 0) {
+ additionalSquish = platformSpecificSquish / 2;
+ }
+ if (taskListView.synchronizationOverlaid) {
+ offsetX = 42 - imageOffset - additionalSquish;
+ } else {
+ offsetX = 24 - imageOffset - additionalSquish;
+ }
+ }
+ }
+
+ if (image != null) {
+ event.gc.drawImage(image, offsetX, event.y + offsetY);
+ }
+ }
+
+ private boolean hideDecorationOnContainer(ITaskContainer element, TreeItem treeItem) {
+ if (element instanceof UnmatchedTaskContainer) {
+ if (!taskListView.isFocusedMode()) {
+ return false;
+ } else if (AbstractTaskListFilter.hasDescendantIncoming(element)) {
+ return true;
+ }
+ } else if (element instanceof IRepositoryQuery) {
+ RepositoryQuery query = (RepositoryQuery) element;
+ if (query.getStatus() != null) {
+ return true;
+ }
+ }
+
+ if (!taskListView.isFocusedMode()) {
+ return false;
+ } else if (element instanceof IRepositoryQuery || element instanceof TaskCategory) {
+ return treeItem.getExpanded();
+ } else {
+ return false;
+ }
+ }
+
+ private void drawActivationImage(final int activationImageOffset, Event event, Image image) {
+ Rectangle rect = image.getBounds();
+ int offset = Math.max(0, (event.height - rect.height) / 2);
+ event.gc.drawImage(image, activationImageOffset, event.y + offset);
+ }
+
+ private ImageDescriptor getSynchronizationImageDescriptor(Object element, boolean synchViewStyle) {
+ if (element instanceof ITask) {
+ ITask repositoryTask = (ITask) element;
+ if (repositoryTask.getSynchronizationState() == SynchronizationState.INCOMING_NEW) {
+ if (synchViewStyle) {
+ return CommonImages.OVERLAY_SYNC_OLD_INCOMMING_NEW;
+ } else {
+ return CommonImages.OVERLAY_SYNC_INCOMMING_NEW;
+ }
+ } else if (repositoryTask.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) {
+ if (synchViewStyle) {
+ return CommonImages.OVERLAY_SYNC_OLD_OUTGOING;
+ } else {
+ return CommonImages.OVERLAY_SYNC_OUTGOING_NEW;
+ }
+ }
+ ImageDescriptor imageDescriptor = null;
+ if (repositoryTask.getSynchronizationState() == SynchronizationState.OUTGOING
+ || repositoryTask.getSynchronizationState() == SynchronizationState.OUTGOING_NEW) {
+ if (synchViewStyle) {
+ imageDescriptor = CommonImages.OVERLAY_SYNC_OLD_OUTGOING;
+ } else {
+ imageDescriptor = CommonImages.OVERLAY_SYNC_OUTGOING;
+ }
+ } else if (repositoryTask.getSynchronizationState() == SynchronizationState.INCOMING) {
+ if (synchViewStyle) {
+ imageDescriptor = CommonImages.OVERLAY_SYNC_OLD_INCOMMING;
+ } else {
+ imageDescriptor = CommonImages.OVERLAY_SYNC_INCOMMING;
+ }
+ } else if (repositoryTask.getSynchronizationState() == SynchronizationState.CONFLICT) {
+ imageDescriptor = CommonImages.OVERLAY_SYNC_CONFLICT;
+ }
+ if (imageDescriptor == null && repositoryTask instanceof AbstractTask
+ && ((AbstractTask) repositoryTask).getStatus() != null) {
+ return CommonImages.OVERLAY_SYNC_WARNING;
+ } else if (imageDescriptor != null) {
+ return imageDescriptor;
+ }
+ } else if (element instanceof IRepositoryQuery) {
+ RepositoryQuery query = (RepositoryQuery) element;
+ if (query.getStatus() != null) {
+ return CommonImages.OVERLAY_SYNC_WARNING;
+ }
+ }
+ // HACK: need a proper blank image
+ return CommonImages.OVERLAY_CLEAR;
+ }
+
+ public void dispose() {
+ TasksUiPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(PROPERTY_LISTENER);
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/Messages.java
new file mode 100644
index 0000000..1129541
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/Messages.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.views.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String DisconnectRepositoryAction_Disconnected;
+
+ public static String PriorityDropDownAction_Filter_Priority_Lower_Than;
+
+ public static String RepositoryElementActionGroup_Copy_Detail_Menu_Label;
+
+ public static String RepositoryElementActionGroup_New;
+
+ public static String TaskInputDialog_Clear;
+
+ public static String TaskInputDialog_Description;
+
+ public static String TaskInputDialog_Get_Description;
+
+ public static String TaskInputDialog_New_Task;
+
+ public static String TaskInputDialog_Web_Link;
+
+ public static String TaskListDropAdapter__retrieving_from_URL_;
+
+ public static String TaskListFilteredTree_Activate;
+
+ public static String TaskListFilteredTree_Edit_Task_Working_Sets_;
+
+ public static String TaskListFilteredTree_Estimated_hours;
+
+ public static String TaskListFilteredTree__multiple_;
+
+ public static String TaskListFilteredTree_Scheduled_tasks;
+
+ public static String TaskListFilteredTree_Search_repository_for_key_or_summary_;
+
+ public static String TaskListFilteredTree_Select_Active_Task;
+
+ public static String TaskListFilteredTree_Select_Working_Set;
+
+ public static String TaskListFilteredTree_Workweek_Progress;
+
+ public static String TaskListSorter_Catagory_and_Query;
+
+ public static String TaskListSorter_Catagory_and_Repository;
+
+ public static String TaskListSorter_No_Grouping;
+
+ public static String TaskListToolTip_Automatic_container_for_all_local_tasks;
+
+ public static String TaskListToolTip_Automatic_container_for_repository_tasks;
+
+ public static String TaskListToolTip_Due;
+
+ public static String TaskListToolTip_Elapsed;
+
+ public static String TaskListToolTip_Estimate;
+
+ public static String TaskListToolTip_Please_synchronize_manually_for_full_error_message;
+
+ public static String TaskListToolTip_Scheduled;
+
+ public static String TaskListToolTip_Some_incoming_elements_may_be_filtered;
+
+ public static String TaskListToolTip_Synchronized;
+
+ public static String TaskListToolTip_Total_Complete_Incomplete;
+
+ public static String TaskListView_Mylyn_context_capture_paused;
+
+ public static String TaskListView__paused_;
+
+ public static String TaskListView_Repository;
+
+ public static String TaskListView_Summary;
+
+ public static String TaskListView_Task_List;
+
+ public static String TaskScheduleContentProvider_Future;
+
+ public static String TaskScheduleContentProvider_Two_Weeks;
+
+ public static String TaskScheduleContentProvider_Unscheduled;
+
+ public static String UpdateRepositoryConfigurationAction_Error_updating_repository_configuration;
+
+ public static String UpdateRepositoryConfigurationAction_Update_Repository_Configuration;
+
+ public static String UpdateRepositoryConfigurationAction_Updating_repository_configuration_for_X;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PriorityDropDownAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PriorityDropDownAction.java
new file mode 100644
index 0000000..3e42603
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/PriorityDropDownAction.java
@@ -0,0 +1,194 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+
+/**
+ * @author Mik Kersten
+ */
+class PriorityDropDownAction extends Action implements IMenuCreator {
+
+ /**
+ *
+ */
+ private final TaskListView taskListView;
+
+ private Action priority1;
+
+ private Action priority2;
+
+ private Action priority3;
+
+ private Action priority4;
+
+ private Action priority5;
+
+ private Menu dropDownMenu = null;
+
+ public PriorityDropDownAction(TaskListView taskListView) {
+ super();
+ this.taskListView = taskListView;
+ setText(Messages.PriorityDropDownAction_Filter_Priority_Lower_Than);
+ setToolTipText(Messages.PriorityDropDownAction_Filter_Priority_Lower_Than);
+ setImageDescriptor(CommonImages.FILTER_PRIORITY);
+ setMenuCreator(this);
+ }
+
+ public void dispose() {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ dropDownMenu = null;
+ }
+ }
+
+ public Menu getMenu(Control parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ public Menu getMenu(Menu parent) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ dropDownMenu = new Menu(parent);
+ addActionsToMenu();
+ return dropDownMenu;
+ }
+
+ public void addActionsToMenu() {
+ priority1 = new Action("", AS_CHECK_BOX) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.FILTER_PRIORITY,
+ PriorityLevel.P1.toString());
+ PriorityDropDownAction.this.taskListView.displayPrioritiesAbove(TaskListView.PRIORITY_LEVELS[0]);
+ }
+ };
+ priority1.setEnabled(true);
+ priority1.setText(PriorityLevel.P1.getDescription());
+ priority1.setImageDescriptor(CommonImages.PRIORITY_1);
+ ActionContributionItem item = new ActionContributionItem(priority1);
+ item.fill(dropDownMenu, -1);
+
+ priority2 = new Action("", AS_CHECK_BOX) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.FILTER_PRIORITY,
+ PriorityLevel.P2.toString());
+ PriorityDropDownAction.this.taskListView.displayPrioritiesAbove(TaskListView.PRIORITY_LEVELS[1]);
+ }
+ };
+ priority2.setEnabled(true);
+ priority2.setText(PriorityLevel.P2.getDescription());
+ priority2.setImageDescriptor(CommonImages.PRIORITY_2);
+ item = new ActionContributionItem(priority2);
+ item.fill(dropDownMenu, -1);
+
+ priority3 = new Action("", AS_CHECK_BOX) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.FILTER_PRIORITY,
+ PriorityLevel.P3.toString());
+ PriorityDropDownAction.this.taskListView.displayPrioritiesAbove(TaskListView.PRIORITY_LEVELS[2]);
+ }
+ };
+ priority3.setEnabled(true);
+ priority3.setText(PriorityLevel.P3.getDescription());
+ priority3.setImageDescriptor(CommonImages.PRIORITY_3);
+ item = new ActionContributionItem(priority3);
+ item.fill(dropDownMenu, -1);
+
+ priority4 = new Action("", AS_CHECK_BOX) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.FILTER_PRIORITY,
+ PriorityLevel.P4.toString());
+ PriorityDropDownAction.this.taskListView.displayPrioritiesAbove(TaskListView.PRIORITY_LEVELS[3]);
+ }
+ };
+ priority4.setEnabled(true);
+ priority4.setText(PriorityLevel.P4.getDescription());
+ priority4.setImageDescriptor(CommonImages.PRIORITY_4);
+ item = new ActionContributionItem(priority4);
+ item.fill(dropDownMenu, -1);
+
+ priority5 = new Action("", AS_CHECK_BOX) { //$NON-NLS-1$
+ @Override
+ public void run() {
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(ITasksUiPreferenceConstants.FILTER_PRIORITY,
+ PriorityLevel.P5.toString());
+ PriorityDropDownAction.this.taskListView.displayPrioritiesAbove(TaskListView.PRIORITY_LEVELS[4]);
+ }
+ };
+ priority5.setEnabled(true);
+ priority5.setImageDescriptor(CommonImages.PRIORITY_5);
+ priority5.setText(PriorityLevel.P5.getDescription());
+ item = new ActionContributionItem(priority5);
+ item.fill(dropDownMenu, -1);
+
+ updateCheckedState();
+// updateCheckedState(priority1, priority2, priority3, priority4, priority5);
+ }
+
+ void updateCheckedState() {
+ if (priority1 == null) {
+ return;
+ }
+ String priority = TaskListView.getCurrentPriorityLevel();
+
+ priority1.setChecked(false);
+ priority2.setChecked(false);
+ priority3.setChecked(false);
+ priority4.setChecked(false);
+ priority5.setChecked(false);
+
+ if (priority.equals(TaskListView.PRIORITY_LEVELS[0])) {
+ priority1.setChecked(true);
+ } else if (priority.equals(TaskListView.PRIORITY_LEVELS[1])) {
+ priority1.setChecked(true);
+ priority2.setChecked(true);
+ } else if (priority.equals(TaskListView.PRIORITY_LEVELS[2])) {
+ priority1.setChecked(true);
+ priority2.setChecked(true);
+ priority3.setChecked(true);
+ } else if (priority.equals(TaskListView.PRIORITY_LEVELS[3])) {
+ priority1.setChecked(true);
+ priority2.setChecked(true);
+ priority3.setChecked(true);
+ priority4.setChecked(true);
+ } else if (priority.equals(TaskListView.PRIORITY_LEVELS[4])) {
+ priority1.setChecked(true);
+ priority2.setChecked(true);
+ priority3.setChecked(true);
+ priority4.setChecked(true);
+ priority5.setChecked(true);
+ }
+ }
+
+ @Override
+ public void run() {
+ this.setChecked(isChecked());
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TableDecoratingLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TableDecoratingLabelProvider.java
new file mode 100644
index 0000000..9b621a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TableDecoratingLabelProvider.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ILabelDecorator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TableDecoratingLabelProvider extends DecoratingLabelProvider implements ITableLabelProvider {
+
+ public TableDecoratingLabelProvider(ILabelProvider provider, ILabelDecorator decorator) {
+ super(provider, decorator);
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (!(element instanceof ITaskContainer)) {
+ return null;
+ }
+ if (columnIndex == 0) {
+ if (element instanceof ITaskContainer && !(element instanceof ITask)) {
+ return super.getImage(element);
+ } else {
+ if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+ if (task.isActive()) {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_ACTIVE);
+ } else {
+ if (ContextCore.getContextManager().hasContext(task.getHandleIdentifier())) {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE);
+ } else {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE_EMPTY);
+ }
+ }
+ } else {
+ return CommonImages.getImage(TasksUiImages.CONTEXT_INACTIVE_EMPTY);
+ }
+ }
+ } else if (columnIndex == 1) {
+ if (element instanceof ITaskContainer || element instanceof IRepositoryQuery) {
+ return null;
+ }
+ return super.getImage(element);
+ }
+ return null;
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskDetailLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskDetailLabelProvider.java
new file mode 100644
index 0000000..54673df
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskDetailLabelProvider.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Displays task repository info from a {@link AbstractTask}
+ *
+ * @author Willian Mitsuda
+ */
+public class TaskDetailLabelProvider extends LabelProvider implements ILabelProvider {
+
+ @Override
+ public Image getImage(Object element) {
+ if (!(element instanceof ITask)) {
+ return super.getImage(element);
+ }
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ ((ITask) element).getConnectorKind());
+ ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(connector.getConnectorKind());
+ if (overlay != null) {
+ return CommonImages.getImageWithOverlay(TasksUiImages.REPOSITORY, overlay, false, false);
+ } else {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY);
+ }
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (!(element instanceof ITask)) {
+ return super.getText(element);
+ }
+
+ ITask task = (ITask) element;
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ return repository.getRepositoryLabel();
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskInputDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskInputDialog.java
new file mode 100644
index 0000000..2f1d17d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskInputDialog.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Ken Sueda 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:
+ * Ken Sueda - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.util.Date;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.AbstractRetrieveTitleFromUrlJob;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+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.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Ken Sueda
+ * @author Wesley Coelho (Extended to allow URL input)
+ * @author Mik Kersten
+ */
+public class TaskInputDialog extends Dialog {
+
+ private String taskName = ""; //$NON-NLS-1$
+
+ private String priority = "P3"; //$NON-NLS-1$
+
+ private String taskURL = "http://"; //$NON-NLS-1$
+
+ private Date reminderDate;
+
+ private Text taskNameTextWidget;
+
+ private Text issueURLTextWidget;
+
+ private Button getDescButton;
+
+ public TaskInputDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ GridLayout gl = new GridLayout(5, false);
+ composite.setLayout(gl);
+ GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL
+ | GridData.VERTICAL_ALIGN_CENTER);
+ data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH + 180);
+ composite.setLayoutData(data);
+
+ Label taskNameLabel = new Label(composite, SWT.WRAP);
+ taskNameLabel.setText(Messages.TaskInputDialog_Description);
+ taskNameLabel.setFont(parent.getFont());
+
+ taskNameTextWidget = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ GridData taskNameGD = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
+ taskNameGD.widthHint = 200;
+ taskNameGD.horizontalSpan = 1;
+ taskNameTextWidget.setLayoutData(taskNameGD);
+
+ final Combo c = new Combo(composite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL | SWT.READ_ONLY
+ | SWT.DROP_DOWN);
+ c.setItems(TaskListView.PRIORITY_LEVELS);
+ c.setText(priority);
+ c.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ priority = c.getText();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+
+// Label spacer = new Label(composite, SWT.NONE);
+// GridData spacerGD = new GridData();
+// spacerGD.horizontalSpan = 1;
+//// spacerGD.widthHint = 5;
+// spacer.setLayoutData(spacerGD);
+//
+// Composite reminderComp = new Composite(composite, SWT.NONE);
+// GridLayout reminderCompGL = new GridLayout(3, false);
+// reminderCompGL.marginHeight = 0;
+// reminderCompGL.marginWidth = 0;
+// reminderComp.setLayout(reminderCompGL);
+// GridData reminderCompGD = new GridData();
+// reminderCompGD.horizontalSpan = 1;
+// reminderCompGD.horizontalAlignment = SWT.RIGHT;
+// reminderComp.setLayoutData(reminderCompGD);
+// Label reminderLabel = new Label(reminderComp, SWT.NONE);
+ final DatePicker datePicker = new DatePicker(composite, SWT.BORDER, DatePicker.LABEL_CHOOSE, true,
+ TasksUiPlugin.getDefault().getPreferenceStore().getInt(ITasksUiPreferenceConstants.PLANNING_ENDHOUR));
+ datePicker.addPickerSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent arg0) {
+ if (datePicker.getDate() != null) {
+ reminderDate = datePicker.getDate().getTime();
+ }
+ }
+
+ public void widgetDefaultSelected(SelectionEvent arg0) {
+ // ignore
+ }
+ });
+
+ Button removeReminder = new Button(composite, SWT.PUSH | SWT.CENTER);
+ removeReminder.setText(Messages.TaskInputDialog_Clear);
+ removeReminder.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ datePicker.setDate(null);
+ reminderDate = null;
+ }
+ });
+
+//
+// scheduledForDate.setLayout(new GridLayout());
+// GridData datePickerGD = new GridData();
+// datePickerGD.widthHint = 300;
+// scheduledForDate.setLayoutData(datePickerGD);
+
+ Label urlLabel = new Label(composite, SWT.WRAP);
+ urlLabel.setText(Messages.TaskInputDialog_Web_Link);
+ urlLabel.setFont(parent.getFont());
+
+ issueURLTextWidget = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ issueURLTextWidget.setText(getDefaultIssueUrl());
+ GridData urlData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
+ urlData.horizontalSpan = 3;
+ urlData.grabExcessHorizontalSpace = true;
+ issueURLTextWidget.setLayoutData(urlData);
+
+ getDescButton = new Button(composite, SWT.PUSH);
+ getDescButton.setText(Messages.TaskInputDialog_Get_Description);
+ getDescButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+ setButtonStatus();
+
+ issueURLTextWidget.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ setButtonStatus();
+ }
+
+ public void keyReleased(KeyEvent e) {
+ setButtonStatus();
+ }
+ });
+
+ getDescButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ retrieveTaskDescription(issueURLTextWidget.getText());
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+
+ return composite;
+ }
+
+ /**
+ * Sets the Get Description button enabled or not depending on whether there is a URL specified
+ */
+ protected void setButtonStatus() {
+ String url = issueURLTextWidget.getText();
+
+ if (url.length() > 10 && (url.startsWith("http://") || url.startsWith("https://"))) { //$NON-NLS-1$ //$NON-NLS-2$
+// String defaultPrefix = ContextCore.getPreferenceStore().getString(
+// TaskListPreferenceConstants.DEFAULT_URL_PREFIX);
+// if (url.equals(defaultPrefix)) {
+// getDescButton.setEnabled(false);
+// } else {
+ getDescButton.setEnabled(true);
+// }
+ } else {
+ getDescButton.setEnabled(false);
+ }
+ }
+
+ /**
+ * Returns the default URL text for the task by first checking the contents of the clipboard and then using the
+ * default prefix preference if that fails
+ */
+ protected String getDefaultIssueUrl() {
+
+ String clipboardText = getClipboardText();
+ if ((clipboardText.startsWith("http://") || clipboardText.startsWith("https://") && clipboardText.length() > 10)) { //$NON-NLS-1$ //$NON-NLS-2$
+ return clipboardText;
+ } else {
+ return taskURL;
+ }
+// String defaultPrefix = ContextCore.getPreferenceStore().getString(
+// TaskListPreferenceConstants.DEFAULT_URL_PREFIX);
+// if (!defaultPrefix.equals("")) {
+// return defaultPrefix;
+// }
+ }
+
+ /**
+ * Attempts to set the task pageTitle to the title from the specified url
+ */
+ protected void retrieveTaskDescription(final String url) {
+ try {
+ AbstractRetrieveTitleFromUrlJob job = new AbstractRetrieveTitleFromUrlJob(issueURLTextWidget.getText()) {
+ @Override
+ protected void titleRetrieved(final String pageTitle) {
+ taskNameTextWidget.setText(pageTitle);
+ }
+ };
+ job.schedule();
+ } catch (RuntimeException e) {
+ // FIXME which exception is caught here?
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not open task web page", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Returns the contents of the clipboard or "" if no text content was available
+ */
+ protected String getClipboardText() {
+ Clipboard clipboard = new Clipboard(Display.getDefault());
+ TextTransfer transfer = TextTransfer.getInstance();
+ String contents = (String) clipboard.getContents(transfer);
+ if (contents != null) {
+ return contents;
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public String getSelectedPriority() {
+ return priority;
+ }
+
+ public String getTaskname() {
+ return taskName;
+ }
+
+ public Date getReminderDate() {
+ return reminderDate;
+ }
+
+ public String getIssueURL() {
+ return taskURL;
+ }
+
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == IDialogConstants.OK_ID) {
+ taskName = taskNameTextWidget.getText();
+ taskURL = issueURLTextWidget.getText();
+ } else {
+ taskName = null;
+ }
+ super.buttonPressed(buttonId);
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(Messages.TaskInputDialog_New_Task);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskKeyComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskKeyComparator.java
new file mode 100644
index 0000000..1700abd
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskKeyComparator.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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 for bug 129511
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.util.Comparator;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class TaskKeyComparator implements Comparator<String[]> {
+
+ private static final String MODULE_TASK_PATTERN = "(?:([A-Za-z]*[:_\\-]?)(\\d+))?"; //$NON-NLS-1$
+
+ private static final Pattern ID_PATTERN = Pattern.compile(MODULE_TASK_PATTERN);
+
+ public static final Pattern PATTERN = Pattern.compile(MODULE_TASK_PATTERN + "(.*)"); //$NON-NLS-1$
+
+ public int compare2(String o1, String o2) {
+ String[] a1 = split(o1);
+ String[] a2 = split(o2);
+ return compare(a1, a2);
+ }
+
+ public int compare(String a1[], String a2[]) {
+ if (a1[0] == null && a1[1] == null) {
+ a1 = split(a1[2]);
+ } else if ((a1[0] == null || a1[0].length() == 0) && a1[1] != null && a1[1].length() > 0) {
+ String b1[] = splitTask(a1[1]);
+ a1[0] = b1[0];
+ a1[1] = b1[1];
+ }
+
+ if (a2[0] == null && a2[1] == null) {
+ a2 = split(a2[2]);
+ } else if ((a2[0] == null || a2[0].length() == 0) && a2[1] != null && a2[1].length() > 0) {
+ String b2[] = splitTask(a2[1]);
+ a2[0] = b2[0];
+ a2[1] = b2[1];
+
+ }
+ return compare(a1[0], a1[1], a1[2], a2[0], a2[1], a2[2]);
+ }
+
+ private static int compare(final String component1, final String key1, final String value1,
+ final String component2, final String key2, final String value2) {
+ if (component1 == null && component2 != null) {
+ return -1;
+ }
+ if (component1 != null && component2 == null) {
+ return 1;
+ }
+
+ if (component1 != null && component2 != null) {
+ int n = component1.compareToIgnoreCase(component2);
+ if (n != 0) {
+ return n;
+ }
+
+ if (key1 == null && key2 != null) {
+ return -1;
+ }
+ if (key1 != null && key2 == null) {
+ return 1;
+ }
+
+ if (key1 != null && key2 != null) {
+ if (key1.length() == key2.length() || key1.length() == 0 || key2.length() == 0) {
+ n = key1.compareTo(key2);
+ } else {
+ try {
+ n = Long.valueOf(key1).compareTo(Long.valueOf(key2));
+ } catch (NumberFormatException e) {
+ // The number was probably longer than an Long, so just compare them as text
+ n = key1.compareTo(key2);
+ }
+ }
+ if (n != 0) {
+ return n;
+ }
+ }
+ }
+
+ return value1.compareToIgnoreCase(value2);
+ }
+
+ public String[] split(String s) {
+ Matcher matcher = PATTERN.matcher(s);
+
+ if (!matcher.find()) {
+ return new String[] { null, null, s };
+ }
+
+ int n = matcher.groupCount();
+ String[] res = new String[n];
+ for (int i = 1; i < n + 1; i++) {
+ res[i - 1] = matcher.group(i);
+ }
+ return res;
+ }
+
+ private static String[] splitTask(final String s) {
+ Matcher matcher = ID_PATTERN.matcher(s);
+
+ if (!matcher.find()) {
+ return new String[] { null, s };
+ }
+
+ int n = matcher.groupCount();
+ String[] res = new String[n];
+ for (int i = 1; i < n + 1; i++) {
+ res[i - 1] = matcher.group(i);
+ }
+ return res;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListCellModifier.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListCellModifier.java
new file mode 100644
index 0000000..d98f7d7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListCellModifier.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Mik Kersten
+ */
+class TaskListCellModifier implements ICellModifier {
+
+ private final TaskListView taskListView;
+
+ private boolean disableActivateForParentTasks = false;
+
+ TaskListCellModifier(TaskListView taskListView) {
+ this.taskListView = taskListView;
+
+ if (SWT.getPlatform().equals("gtk")) { //$NON-NLS-1$
+ disableActivateForParentTasks = true;
+ }
+ }
+
+ public boolean canModify(Object element, String property) {
+ return taskListView.isInRenameAction;
+ }
+
+ public Object getValue(Object element, String property) {
+ try {
+ int columnIndex = Arrays.asList(this.taskListView.columnNames).indexOf(property);
+ if (element instanceof IRepositoryElement) {
+ final IRepositoryElement taskListElement = (IRepositoryElement) element;
+ switch (columnIndex) {
+ case 0:
+ return taskListElement.getSummary();
+ case 1:
+ return ""; //$NON-NLS-1$
+ case 2:
+ return ""; //$NON-NLS-1$
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ public void modify(Object element, String property, Object value) {
+ int columnIndex = -1;
+ try {
+ if (element instanceof TreeItem && ((TreeItem) element).isDisposed()) {
+ return;
+ }
+ columnIndex = Arrays.asList(this.taskListView.columnNames).indexOf(property);
+ Object data = ((TreeItem) element).getData();
+ if (data instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) data;
+ switch (columnIndex) {
+ case 0:
+ if (task != null) {
+ task.setSummary(((String) value).trim());
+ TasksUiPlugin.getTaskList().notifyElementChanged(task);
+ }
+ break;
+ case 1:
+ break;
+ case 2:
+ toggleTaskActivation((TreeItem) element);
+ break;
+ }
+ } else if (data instanceof AbstractTaskCategory || data instanceof IRepositoryQuery) {
+ AbstractTaskContainer container = (AbstractTaskContainer) data;
+ switch (columnIndex) {
+ case 0:
+ TasksUiPlugin.getTaskList().renameContainer(container, ((String) value).trim());
+ case 1:
+ break;
+ case 2:
+ break;
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ this.taskListView.refresh();//.getViewer().refresh();
+ }
+
+ public void toggleTaskActivation(TreeItem element) {
+ AbstractTask task = null;
+ if (element.getData() instanceof AbstractTask) {
+ task = (AbstractTask) element.getData();
+
+ if (disableActivateForParentTasks) {
+ // check if activation column overlaps with tree expander control: element is on second hierarchy level and has children
+ TreeItem parent = element.getParentItem();
+ if (parent != null
+ && (parent.getData() instanceof IRepositoryQuery || parent.getData() instanceof AbstractTaskCategory)
+ && element.getItemCount() > 0) {
+ return;
+ }
+ }
+
+ if (task.isActive()) {
+ TasksUi.getTaskActivityManager().deactivateTask(task);
+ } else {
+ TasksUi.getTaskActivityManager().activateTask(task);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java
new file mode 100644
index 0000000..d382d39
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListContentProvider.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * Provides custom content for the task list, e.g. guaranteed visibility of some elements, ability to suppress
+ * containers showing if nothing should show under them. TODO: move to viewer filter architecture?
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskListContentProvider extends AbstractTaskListContentProvider {
+
+ public TaskListContentProvider(TaskListView taskListView) {
+ super(taskListView);
+ }
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ this.taskListView.expandToActiveTasks();
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ if (parent.equals(this.taskListView.getViewSite())) {
+ return applyFilter(TasksUiPlugin.getTaskList().getRootElements()).toArray();
+ }
+ return getChildren(parent);
+ }
+
+ /**
+ * @return first parent found
+ */
+ public Object getParent(Object child) {
+ // return first parent found, first search within categories then queries
+ if (child instanceof ITask) {
+ ITask task = (ITask) child;
+ AbstractTaskCategory parent = TaskCategory.getParentTaskCategory(task);
+ if (parent != null) {
+ return parent;
+ }
+
+ Set<AbstractTaskContainer> parents = ((AbstractTask) task).getParentContainers();
+ Iterator<AbstractTaskContainer> it = parents.iterator();
+ if (it.hasNext()) {
+ return parents.iterator().next();
+ }
+ }
+ // no parent found
+ return null;
+ }
+
+ public Object[] getChildren(Object parent) {
+ return getFilteredChildrenFor(parent).toArray();
+ }
+
+ /**
+ * NOTE: If parent is an ITask, this method checks if parent has unfiltered children (see bug 145194).
+ */
+ public boolean hasChildren(Object parent) {
+ Object[] children = getChildren(parent);
+ return children != null && children.length > 0;
+
+// if (parent instanceof AbstractRepositoryQuery) {
+// AbstractRepositoryQuery query = (AbstractRepositoryQuery) parent;
+// return !getFilteredChildrenFor(query).isEmpty();
+// //return !query.isEmpty();
+// } else if (parent instanceof AbstractTask) {
+// return taskHasUnfilteredChildren((AbstractTask) parent);
+// } else if (parent instanceof AbstractTaskContainer) {
+// AbstractTaskContainer container = (AbstractTaskContainer) parent;
+// return !getFilteredChildrenFor(container).isEmpty();
+// //return !container.getChildren().isEmpty();
+// }
+// return false;
+ }
+
+ protected List<AbstractTaskContainer> applyFilter(Set<AbstractTaskContainer> roots) {
+ List<AbstractTaskContainer> filteredRoots = new ArrayList<AbstractTaskContainer>();
+ for (AbstractTaskContainer element : roots) {
+ // NOTE: tasks can no longer appear as root elements
+ if (selectContainer(element)) {
+ filteredRoots.add(element);
+ }
+ }
+ return filteredRoots;
+ }
+
+ /**
+ * See bug 109693
+ */
+ private boolean containsNoFilterText(String filterText) {
+ return filterText == null || filterText.trim().length() == 0;
+ }
+
+ private boolean selectContainer(ITaskContainer container) {
+ if (filter(null, container)) {
+ return false;
+ }
+ return true;
+ }
+
+ private List<IRepositoryElement> getFilteredChildrenFor(Object parent) {
+ if (containsNoFilterText(this.taskListView.getFilteredTree().getFilterString())) {
+ List<IRepositoryElement> children = new ArrayList<IRepositoryElement>();
+ if (parent instanceof ITask) {
+ Collection<ITask> subTasks = ((AbstractTask) parent).getChildren();
+ for (ITask task : subTasks) {
+ if (!filter(parent, task)) {
+ children.add(task);
+ }
+ }
+ return children;
+ } else if (parent instanceof ITaskContainer) {
+ return getFilteredRootChildren((ITaskContainer) parent);
+ }
+ } else {
+ List<IRepositoryElement> children = new ArrayList<IRepositoryElement>();
+ if (parent instanceof ITaskContainer) {
+ children.addAll(((ITaskContainer) parent).getChildren());
+ return children;
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ /**
+ * @return all children who aren't already revealed as a sub task
+ */
+ private List<IRepositoryElement> getFilteredRootChildren(ITaskContainer parent) {
+ List<IRepositoryElement> result = new ArrayList<IRepositoryElement>();
+ if (TasksUiPlugin.getDefault().groupSubtasks(parent)) {
+ Collection<ITask> parentTasks = parent.getChildren();
+ Set<IRepositoryElement> parents = new HashSet<IRepositoryElement>();
+ Set<ITask> children = new HashSet<ITask>();
+ // get all children
+ for (ITask element : parentTasks) {
+ if (element instanceof ITaskContainer) {
+ for (ITask abstractTask : ((ITaskContainer) element).getChildren()) {
+ children.add(abstractTask);
+ }
+ }
+ }
+ for (ITask task : parentTasks) {
+ if (!filter(parent, task) && !children.contains(task)) {
+ parents.add(task);
+ }
+ }
+ result.addAll(parents);
+ } else {
+ for (IRepositoryElement element : parent.getChildren()) {
+ if (!filter(parent, element)) {
+ result.add(element);
+ }
+ }
+ }
+ return result;
+ }
+
+ protected boolean filter(Object parent, Object object) {
+ boolean emptyFilterText = containsNoFilterText(this.taskListView.getFilteredTree().getFilterString());
+ for (AbstractTaskListFilter filter : this.taskListView.getFilters()) {
+ if (emptyFilterText) {
+ if (!filter.select(parent, object)) {
+ return true;
+ }
+ } else {
+ if (filter.applyToFilteredText()) {
+ if (!filter.select(parent, object)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java
new file mode 100644
index 0000000..a37e7e0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListDropAdapter.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jevgeni Holodkov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+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.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.AbstractRetrieveTitleFromUrlJob;
+import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider.Unscheduled;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves (added URL based task creation support)
+ * @author Jevgeni Holodkov
+ */
+public class TaskListDropAdapter extends ViewerDropAdapter {
+
+ private boolean fileTransfer;
+
+ private boolean localTransfer;
+
+ public TaskListDropAdapter(Viewer viewer) {
+ super(viewer);
+ setFeedbackEnabled(true);
+ }
+
+ @Override
+ public void dragOver(DropTargetEvent event) {
+ // support dragging from sources only supporting DROP_LINK
+ if (event.detail == DND.DROP_NONE && (event.operations & DND.DROP_LINK) == DND.DROP_LINK) {
+ event.detail = DND.DROP_LINK;
+ }
+ super.dragOver(event);
+ }
+
+ @Override
+ public boolean performDrop(final Object data) {
+ List<ITask> tasksToMove = new ArrayList<ITask>();
+
+ if (localTransfer) {
+ ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
+ if (selection instanceof IStructuredSelection) {
+ for (Iterator<?> it = ((IStructuredSelection) selection).iterator(); it.hasNext();) {
+ Object item = it.next();
+ if (item instanceof ITask) {
+ tasksToMove.add((ITask) item);
+ }
+ }
+ }
+ } else if (fileTransfer) {
+ // TODO implement dropping of files
+ } else if (data instanceof String) {
+ String text = (String) data;
+ AbstractTask task = createTaskFromUrl(text);
+ if (task == null) {
+ task = TasksUiInternal.createNewLocalTask(text);
+ }
+ if (task != null) {
+ tasksToMove.add(task);
+ final ITask newTask = task;
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(newTask);
+ }
+ });
+ }
+ }
+
+ Object currentTarget = getCurrentTarget();
+ if (currentTarget instanceof LocalTask && areAllLocalTasks(tasksToMove) && getCurrentLocation() == LOCATION_ON) {
+ for (ITask task : tasksToMove) {
+ if (!((AbstractTask) task).contains(((LocalTask) currentTarget).getHandleIdentifier())) {
+ TasksUiInternal.getTaskList().addTask(task, (LocalTask) currentTarget);
+ }
+ }
+ } else {
+ for (ITask task : tasksToMove) {
+ if (currentTarget instanceof UncategorizedTaskContainer) {
+ TasksUiInternal.getTaskList().addTask(task, (UncategorizedTaskContainer) currentTarget);
+ } else if (currentTarget instanceof TaskCategory) {
+ TasksUiInternal.getTaskList().addTask(task, (TaskCategory) currentTarget);
+ } else if (currentTarget instanceof UnmatchedTaskContainer) {
+ if (((UnmatchedTaskContainer) currentTarget).getRepositoryUrl().equals(task.getRepositoryUrl())) {
+ TasksUiInternal.getTaskList().addTask(task, (AbstractTaskCategory) currentTarget);
+ }
+ } else if (currentTarget instanceof ITask) {
+ ITask targetTask = (ITask) currentTarget;
+ AbstractTaskCategory targetCategory = null;
+ // TODO: TaskCategory only used what about AbstractTaskCategory descendants?
+ ITaskContainer container = TaskCategory.getParentTaskCategory(targetTask);
+ if (container instanceof TaskCategory || container instanceof UncategorizedTaskContainer) {
+ targetCategory = (AbstractTaskCategory) container;
+ } else if (container instanceof UnmatchedTaskContainer) {
+ if (((UnmatchedTaskContainer) container).getRepositoryUrl().equals(task.getRepositoryUrl())) {
+ targetCategory = (AbstractTaskCategory) container;
+ }
+ }
+ if (targetCategory != null) {
+ TasksUiInternal.getTaskList().addTask(task, targetCategory);
+ }
+ } else if (currentTarget instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer container = (ScheduledTaskContainer) currentTarget;
+ if (container instanceof Unscheduled) {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor((AbstractTask) task, null);
+ } else {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor((AbstractTask) task,
+ container.getDateRange());
+ }
+ } else if (currentTarget == null) {
+ TasksUiInternal.getTaskList().addTask(task, TasksUiPlugin.getTaskList().getDefaultCategory());
+ }
+ }
+ }
+
+ if (tasksToMove.size() == 1) {
+ getViewer().setSelection(new StructuredSelection(tasksToMove.get(0)));
+ }
+ return true;
+ }
+
+ private boolean areAllLocalTasks(List<ITask> tasksToMove) {
+ for (ITask task : tasksToMove) {
+ if (!(task instanceof LocalTask)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @param data
+ * string containing url and title separated by <quote>\n</quote>
+ */
+ private AbstractTask createTaskFromUrl(String data) {
+ if (!data.startsWith("http://") && !data.startsWith("https://")) { //$NON-NLS-1$ //$NON-NLS-2$
+ return null;
+ }
+
+ String[] urlTransfer = data.split("\n"); //$NON-NLS-1$
+ if (urlTransfer.length > 0) {
+ String url = urlTransfer[0];
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager()
+ .getConnectorForRepositoryTaskUrl(url);
+ if (connector != null) {
+ // attempt to find task in task list
+ String repositoryUrl = connector.getRepositoryUrlFromTaskUrl(url);
+ String taskId = connector.getTaskIdFromTaskUrl(url);
+ AbstractTask task = TasksUiInternal.getTask(repositoryUrl, taskId, url);
+ if (task != null) {
+ return task;
+ }
+ if (repositoryUrl != null && taskId != null) {
+ // attempt to open task in background
+ // TODO: consider attaching a listener to OpenRepsitoryTaskJob to move task to drop target
+ TasksUiInternal.openRepositoryTask(connector.getConnectorKind(), repositoryUrl, taskId);
+ }
+ } else {
+ // create local task, using title of web page as a summary
+ final String summary = Messages.TaskListDropAdapter__retrieving_from_URL_;
+ final LocalTask newTask = TasksUiInternal.createNewLocalTask(summary);
+ newTask.setUrl(url);
+ AbstractRetrieveTitleFromUrlJob job = new AbstractRetrieveTitleFromUrlJob(url) {
+ @Override
+ protected void titleRetrieved(final String pageTitle) {
+ // make sure summary was not changed in the mean time
+ if (newTask.getSummary().equals(summary)) {
+ newTask.setSummary(pageTitle);
+ TasksUiInternal.getTaskList().notifyElementChanged(newTask);
+ }
+ }
+ };
+ job.schedule();
+ return newTask;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
+ fileTransfer = false;
+ localTransfer = false;
+ if (FileTransfer.getInstance().isSupportedType(transferType)) {
+ fileTransfer = true;
+ // TODO handle all files
+ return false;
+ } else if (LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) {
+ localTransfer = true;
+ if (getCurrentTarget() instanceof UncategorizedTaskContainer || getCurrentTarget() instanceof TaskCategory
+ || getCurrentTarget() instanceof UnmatchedTaskContainer
+ || getCurrentTarget() instanceof ScheduledTaskContainer) {
+ return true;
+ } else if (getCurrentTarget() instanceof ITaskContainer
+ && (getCurrentLocation() == ViewerDropAdapter.LOCATION_AFTER || getCurrentLocation() == ViewerDropAdapter.LOCATION_BEFORE)) {
+ return true;
+ } else if (getCurrentTarget() instanceof LocalTask && getCurrentLocation() == ViewerDropAdapter.LOCATION_ON) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if (PlatformUtil.getUrlTransfer().isSupportedType(transferType)) {
+ return true;
+ }
+
+ return TextTransfer.getInstance().isSupportedType(transferType);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java
new file mode 100644
index 0000000..101cc58
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListFilteredTree.java
@@ -0,0 +1,572 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - fix for bug 280172
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.text.MessageFormat;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.layout.TreeColumnLayout;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractFilteredTree;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.ui.TaskHistoryDropDown;
+import org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.TaskSearchPage;
+import org.eclipse.mylyn.internal.tasks.ui.TaskWorkingSetFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ActivateTaskDialogAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.RepositoryElementActionGroup;
+import org.eclipse.mylyn.internal.tasks.ui.actions.TaskWorkingSetAction;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.workingsets.TaskWorkingSetUpdater;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskActivityAdapter;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.search.internal.ui.SearchDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+
+/**
+ * @author Mik Kersten
+ * @author Leo Dos Santos - Task Working Set UI
+ */
+public class TaskListFilteredTree extends AbstractFilteredTree {
+
+ public static final String LABEL_SEARCH = Messages.TaskListFilteredTree_Search_repository_for_key_or_summary_;
+
+ private TaskHyperlink workingSetLink;
+
+ private TaskHyperlink activeTaskLink;
+
+ private WorkweekProgressBar taskProgressBar;
+
+ private int totalTasks;
+
+ private int completeTime;
+
+ private int completeTasks;
+
+ private int incompleteTime;
+
+ private IWorkingSet currentWorkingSet;
+
+ private MenuManager activeTaskMenuManager;
+
+ private Menu activeTaskMenu;
+
+ private TaskListToolTip taskListToolTip;
+
+ private ITaskListChangeListener changeListener;
+
+ private TaskListChangeAdapter taskProgressBarChangeListener;
+
+ private TaskActivityAdapter taskProgressBarActivityListener;
+
+ private IPropertyChangeListener taskProgressBarWorkingSetListener;
+
+ private TaskWorkingSetFilter workingSetFilter;
+
+ private final IWorkbenchWindow window;
+
+ private SelectionProviderAdapter activeTaskSelectionProvider;
+
+ /**
+ * @param window
+ * can be null. Needed for the working sets to be displayed properly
+ */
+ public TaskListFilteredTree(Composite parent, int treeStyle, PatternFilter filter, IWorkbenchWindow window) {
+ super(parent, treeStyle, filter);
+ hookContextMenu();
+ this.window = window;
+ indicateActiveTaskWorkingSet();
+ }
+
+ @Override
+ public void dispose() {
+ if (changeListener != null) {
+ TasksUiInternal.getTaskList().removeChangeListener(changeListener);
+ }
+ if (taskProgressBarChangeListener != null) {
+ TasksUiInternal.getTaskList().removeChangeListener(taskProgressBarChangeListener);
+ }
+ if (taskProgressBarActivityListener != null) {
+ TasksUi.getTaskActivityManager().removeActivityListener(taskProgressBarActivityListener);
+ }
+ if (taskProgressBarWorkingSetListener != null) {
+ PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(
+ taskProgressBarWorkingSetListener);
+ }
+
+ super.dispose();
+ taskListToolTip.dispose();
+ }
+
+ private void hookContextMenu() {
+ final RepositoryElementActionGroup actionGroup = new RepositoryElementActionGroup();
+ actionGroup.setSelectionProvider(getActiveTaskSelectionProvider());
+
+ activeTaskMenuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ activeTaskMenuManager.setRemoveAllWhenShown(true);
+ activeTaskMenuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ actionGroup.fillContextMenu(manager);
+ }
+ });
+ }
+
+ @Override
+ protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
+ // Use a single Composite for the Tree to being able to use the
+ // TreeColumnLayout. See Bug 177891 for more details.
+ Composite container = new Composite(parent, SWT.None);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.verticalIndent = 0;
+ gridData.horizontalIndent = 0;
+ container.setLayoutData(gridData);
+ container.setLayout(new TreeColumnLayout());
+ return super.doCreateTreeViewer(container, style);
+ }
+
+ @Override
+ protected Composite createProgressComposite(Composite container) {
+ Composite progressComposite = new Composite(container, SWT.NONE);
+ GridLayout progressLayout = new GridLayout(1, false);
+ progressLayout.marginWidth = 4;
+ progressLayout.marginHeight = 0;
+ progressLayout.marginBottom = 0;
+ progressLayout.horizontalSpacing = 0;
+ progressLayout.verticalSpacing = 0;
+ progressComposite.setLayout(progressLayout);
+ progressComposite.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false, 4, 1));
+
+ taskProgressBar = new WorkweekProgressBar(progressComposite);
+ taskProgressBar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ updateTaskProgressBar();
+
+ taskProgressBarChangeListener = new TaskListChangeAdapter() {
+
+ @Override
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (taskContainerDelta.getElement() instanceof ITask) {
+ updateTaskProgressBar();
+ break;
+ }
+ }
+ }
+ };
+ TasksUiInternal.getTaskList().addChangeListener(taskProgressBarChangeListener);
+
+ taskProgressBarActivityListener = new TaskActivityAdapter() {
+
+ @Override
+ public void activityReset() {
+ updateTaskProgressBar();
+ }
+
+ };
+ TasksUiPlugin.getTaskActivityManager().addActivityListener(taskProgressBarActivityListener);
+
+ taskProgressBarWorkingSetListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getProperty();
+ if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property)
+ || IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property)) {
+ updateTaskProgressBar();
+ }
+ }
+ };
+ PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(taskProgressBarWorkingSetListener);
+
+ return progressComposite;
+ }
+
+ @Override
+ protected Composite createSearchComposite(Composite container) {
+ Composite searchComposite = new Composite(container, SWT.NONE);
+ GridLayout searchLayout = new GridLayout(1, false);
+ searchLayout.marginWidth = 8;
+ searchLayout.marginHeight = 0;
+ searchLayout.marginBottom = 0;
+ searchLayout.horizontalSpacing = 0;
+ searchLayout.verticalSpacing = 0;
+ searchComposite.setLayout(searchLayout);
+ searchComposite.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false, 4, 1));
+
+ final TaskHyperlink searchLink = new TaskHyperlink(searchComposite, SWT.LEFT);
+ searchLink.setText(LABEL_SEARCH);
+
+ searchLink.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ new SearchDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow(), TaskSearchPage.ID).open();
+ }
+
+ public void linkEntered(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ searchLink.setUnderlined(true);
+ }
+
+ public void linkExited(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ searchLink.setUnderlined(false);
+ }
+ });
+
+ return searchComposite;
+ }
+
+ private void updateTaskProgressBar() {
+ if (taskProgressBar.isDisposed()) {
+ return;
+ }
+
+ Set<ITask> tasksThisWeek = TasksUiPlugin.getTaskActivityManager().getScheduledForADayThisWeek();
+ if (workingSetFilter != null) {
+ for (Iterator<ITask> it = tasksThisWeek.iterator(); it.hasNext();) {
+ ITask task = it.next();
+ if (!workingSetFilter.select(task)) {
+ it.remove();
+ }
+ }
+ }
+
+ totalTasks = tasksThisWeek.size();
+ completeTime = 0;
+ completeTasks = 0;
+ incompleteTime = 0;
+ for (ITask task : tasksThisWeek) {
+ if (task instanceof AbstractTask) {
+ AbstractTask abstractTask = (AbstractTask) task;
+ if (task.isCompleted()) {
+ completeTasks++;
+ if (abstractTask.getEstimatedTimeHours() > 0) {
+ completeTime += abstractTask.getEstimatedTimeHours();
+ } else {
+ completeTime++;
+ }
+ } else {
+ if (abstractTask.getEstimatedTimeHours() > 0) {
+ incompleteTime += abstractTask.getEstimatedTimeHours();
+ } else {
+ incompleteTime++;
+ }
+ }
+ }
+ }
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (PlatformUI.isWorkbenchRunning() && !taskProgressBar.isDisposed()) {
+ taskProgressBar.reset(completeTime, (completeTime + incompleteTime));
+
+ taskProgressBar.setToolTipText(Messages.TaskListFilteredTree_Workweek_Progress
+ + "\n" //$NON-NLS-1$
+ + MessageFormat.format(Messages.TaskListFilteredTree_Estimated_hours, completeTime,
+ completeTime + incompleteTime)
+ + "\n" //$NON-NLS-1$
+ + MessageFormat.format(Messages.TaskListFilteredTree_Scheduled_tasks, completeTasks,
+ totalTasks));
+ }
+ }
+ });
+ }
+
+ @Override
+ protected Composite createActiveWorkingSetComposite(Composite container) {
+ final ImageHyperlink workingSetButton = new ImageHyperlink(container, SWT.FLAT);
+ workingSetButton.setImage(CommonImages.getImage(CommonImages.TOOLBAR_ARROW_RIGHT));
+ workingSetButton.setToolTipText(Messages.TaskListFilteredTree_Select_Working_Set);
+
+ workingSetLink = new TaskHyperlink(container, SWT.LEFT);
+ workingSetLink.setText(TaskWorkingSetAction.LABEL_SETS_NONE);
+ workingSetLink.setUnderlined(false);
+
+ final TaskWorkingSetAction workingSetAction = new TaskWorkingSetAction();
+ workingSetButton.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ workingSetAction.getMenu(workingSetButton).setVisible(true);
+ }
+
+ public void linkEntered(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ workingSetButton.setImage(CommonImages.getImage(CommonImages.TOOLBAR_ARROW_DOWN));
+ }
+
+ public void linkExited(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ workingSetButton.setImage(CommonImages.getImage(CommonImages.TOOLBAR_ARROW_RIGHT));
+ }
+ });
+
+ workingSetLink.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseDown(MouseEvent e) {
+ if (currentWorkingSet != null) {
+ workingSetAction.run(currentWorkingSet);
+ } else {
+ workingSetAction.run();
+ }
+ }
+ });
+
+ return workingSetLink;
+ }
+
+ @Override
+ protected Composite createActiveTaskComposite(final Composite container) {
+ final ImageHyperlink activeTaskButton = new ImageHyperlink(container, SWT.LEFT);// SWT.ARROW | SWT.RIGHT);
+ activeTaskButton.setImage(CommonImages.getImage(CommonImages.TOOLBAR_ARROW_RIGHT));
+ activeTaskButton.setToolTipText(Messages.TaskListFilteredTree_Select_Active_Task);
+
+ activeTaskLink = new TaskHyperlink(container, SWT.LEFT);
+
+ changeListener = new TaskListChangeAdapter() {
+ @Override
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (taskContainerDelta.getElement() instanceof ITask) {
+ final AbstractTask changedTask = (AbstractTask) (taskContainerDelta.getElement());
+ if (changedTask.isActive()) {
+ if (Platform.isRunning() && PlatformUI.getWorkbench() != null) {
+ if (Display.getCurrent() == null) {
+ if (PlatformUI.getWorkbench().getDisplay() != null
+ && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ indicateActiveTask(changedTask);
+ }
+ });
+ }
+ } else {
+ indicateActiveTask(changedTask);
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+ TasksUiInternal.getTaskList().addChangeListener(changeListener);
+
+ activeTaskLink.setText(Messages.TaskListFilteredTree_Activate);
+ // avoid having the Hyperlink class show a native tooltip when it shortens the text which would overlap with the task list tooltip
+ activeTaskLink.setToolTipText(""); //$NON-NLS-1$
+
+ taskListToolTip = new TaskListToolTip(activeTaskLink);
+
+ ITask activeTask = TasksUi.getTaskActivityManager().getActiveTask();
+ if (activeTask != null) {
+ indicateActiveTask(activeTask);
+ }
+
+ activeTaskButton.addHyperlinkListener(new IHyperlinkListener() {
+
+ private Menu dropDownMenu;
+
+ public void linkActivated(HyperlinkEvent event) {
+ if (dropDownMenu != null) {
+ dropDownMenu.dispose();
+ }
+ TaskHistoryDropDown taskHistory = new TaskHistoryDropDown();
+ taskHistory.setScopedToWorkingSet(true);
+ dropDownMenu = new Menu(activeTaskButton);
+ taskHistory.fill(dropDownMenu, 0);
+ dropDownMenu.setVisible(true);
+ }
+
+ public void linkEntered(HyperlinkEvent event) {
+ activeTaskButton.setImage(CommonImages.getImage(CommonImages.TOOLBAR_ARROW_DOWN));
+ }
+
+ public void linkExited(HyperlinkEvent event) {
+ activeTaskButton.setImage(CommonImages.getImage(CommonImages.TOOLBAR_ARROW_RIGHT));
+ }
+ });
+
+ activeTaskLink.addMenuDetectListener(new MenuDetectListener() {
+ public void menuDetected(MenuDetectEvent e) {
+ if (activeTaskMenu != null) {
+ activeTaskMenu.dispose();
+ }
+ // do not show menu for
+ ISelection selection = getActiveTaskSelectionProvider().getSelection();
+ if (selection != null && !selection.isEmpty()) {
+ activeTaskMenu = activeTaskMenuManager.createContextMenu(container);
+ activeTaskMenu.setVisible(true);
+ }
+ }
+ });
+
+ activeTaskLink.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ // only handle left clicks, context menu is handled by platform
+ if (e.button == 1) {
+ ITask activeTask = (TasksUi.getTaskActivityManager().getActiveTask());
+ if (activeTask == null) {
+ ActivateTaskDialogAction activateAction = new ActivateTaskDialogAction();
+ activateAction.init(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
+ activateAction.run(null);
+ } else {
+// if (TaskListFilteredTree.super.filterText.getText().length() > 0) {
+// TaskListFilteredTree.super.filterText.setText("");
+// TaskListFilteredTree.this.textChanged();
+// }
+// if (TaskListView.getFromActivePerspective().getDrilledIntoCategory() != null) {
+// TaskListView.getFromActivePerspective().goUpToRoot();
+// }
+ TasksUiInternal.refreshAndOpenTaskListElement(activeTask);
+ }
+ }
+ }
+ });
+
+ return activeTaskLink;
+ }
+
+ @Override
+ protected void textChanged() {
+ super.textChanged();
+ if (getFilterString() != null && !getFilterString().trim().equals("")) { //$NON-NLS-1$
+ setShowSearch(true);
+ } else {
+ setShowSearch(false);
+ }
+ }
+
+ public void indicateActiveTaskWorkingSet() {
+ if (window == null || workingSetLink == null || filterComposite == null || filterComposite.isDisposed()) {
+ return;
+ }
+
+ Set<IWorkingSet> activeSets = TaskWorkingSetUpdater.getActiveWorkingSets(window);
+ if (activeSets == null) {
+ return;
+ }
+
+ if (activeSets.size() == 0) {
+ workingSetLink.setText(TaskWorkingSetAction.LABEL_SETS_NONE);
+ workingSetLink.setToolTipText(Messages.TaskListFilteredTree_Edit_Task_Working_Sets_);
+ currentWorkingSet = null;
+ } else if (activeSets.size() > 1) {
+ workingSetLink.setText(Messages.TaskListFilteredTree__multiple_);
+ workingSetLink.setToolTipText(Messages.TaskListFilteredTree_Edit_Task_Working_Sets_);
+ currentWorkingSet = null;
+ } else {
+ Object[] array = activeSets.toArray();
+ IWorkingSet workingSet = (IWorkingSet) array[0];
+ workingSetLink.setText(workingSet.getLabel());
+ workingSetLink.setToolTipText(Messages.TaskListFilteredTree_Edit_Task_Working_Sets_);
+ currentWorkingSet = workingSet;
+ }
+ relayoutFilterControls();
+ }
+
+ public void indicateActiveTask(ITask task) {
+ if (Display.getCurrent() != null) {
+
+ if (filterComposite.isDisposed()) {
+ return;
+ }
+
+ activeTaskLink.setTask(task);
+ getActiveTaskSelectionProvider().setSelection(new StructuredSelection(task));
+
+ relayoutFilterControls();
+ }
+ }
+
+ private void relayoutFilterControls() {
+ filterComposite.layout();
+ }
+
+ public String getActiveTaskLabelText() {
+ return activeTaskLink.getText();
+ }
+
+ public void indicateNoActiveTask() {
+ if (filterComposite.isDisposed()) {
+ return;
+ }
+
+ activeTaskLink.setTask(null);
+ activeTaskLink.setText(Messages.TaskListFilteredTree_Activate);
+ activeTaskLink.setToolTipText(""); //$NON-NLS-1$
+ getActiveTaskSelectionProvider().setSelection(StructuredSelection.EMPTY);
+
+ relayoutFilterControls();
+ }
+
+ @Override
+ public void setFilterText(String string) {
+ if (filterText != null) {
+ filterText.setText(string);
+ selectAll();
+ }
+ }
+
+ @Override
+ protected String getFilterString() {
+ String text = super.getFilterString();
+ return (text != null) ? text.trim() : null;
+ }
+
+ public TaskWorkingSetFilter getWorkingSetFilter() {
+ return workingSetFilter;
+ }
+
+ public void setWorkingSetFilter(TaskWorkingSetFilter workingSetFilter) {
+ this.workingSetFilter = workingSetFilter;
+ }
+
+ public MenuManager getActiveTaskMenuManager() {
+ return activeTaskMenuManager;
+ }
+
+ public SelectionProviderAdapter getActiveTaskSelectionProvider() {
+ if (activeTaskSelectionProvider == null) {
+ activeTaskSelectionProvider = new SelectionProviderAdapter();
+ }
+ return activeTaskSelectionProvider;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java
new file mode 100644
index 0000000..be3dbc5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestFilter.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.util.Collection;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskScheduleContentProvider.Unscheduled;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * Goal is to have this reuse as much of the super as possible.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskListInterestFilter extends AbstractTaskListFilter {
+
+ @Override
+ public boolean select(Object parent, Object child) {
+ try {
+ if (child instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer dateRangeTaskContainer = (ScheduledTaskContainer) child;
+ return isDateRangeInteresting(dateRangeTaskContainer);
+ }
+ if (child instanceof ITask) {
+ AbstractTask task = null;
+ if (child instanceof ITask) {
+ task = (AbstractTask) child;
+ }
+ if (task != null) {
+ if (isInteresting(parent, task)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else if (child instanceof ITaskContainer) {
+ Collection<ITask> children = ((ITaskContainer) child).getChildren();
+ // Always display empty containers
+ if (children.size() == 0) {
+ return false;
+ }
+
+ for (ITask task : children) {
+ if (shouldAlwaysShow(child, (AbstractTask) task, ITasksCoreConstants.MAX_SUBTASK_DEPTH)) {
+ return true;
+ }
+ }
+
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Interest filter failed", t)); //$NON-NLS-1$
+ }
+ return false;
+ }
+
+ private boolean isDateRangeInteresting(ScheduledTaskContainer scheduleContainer) {
+ if (scheduleContainer instanceof TaskScheduleContentProvider.Unscheduled) {
+ return true;
+ }
+ if (TaskActivityUtil.getCurrentWeek().isCurrentWeekDay(scheduleContainer.getDateRange())) {
+ if (scheduleContainer.isPresent() || scheduleContainer.isFuture()) {
+ return true;
+ }
+ } else if (scheduleContainer.isPresent() /*&& scheduleContainer.isCaptureFloating()*/) {
+ return true;
+ }
+ return false;
+ }
+
+ // TODO: make meta-context more explicit
+ protected boolean isInteresting(Object parent, AbstractTask task) {
+ return shouldAlwaysShow(parent, task, ITasksCoreConstants.MAX_SUBTASK_DEPTH);
+ }
+
+ public boolean shouldAlwaysShow(Object parent, AbstractTask task, int depth) {
+
+ return task.isActive() || TasksUiPlugin.getTaskActivityManager().isCompletedToday(task)
+ || hasChanges(parent, task)
+ || hasInterestingSubTasks(parent, task, depth)
+ // note that following condition is wrapped in ()!
+ || (!task.isCompleted() && (LocalRepositoryConnector.DEFAULT_SUMMARY.equals(task.getSummary())
+ || shouldShowInFocusedWorkweekDateContainer(parent, task)
+ || TasksUiPlugin.getTaskActivityManager().isOverdue(task) || isInterestingForThisWeek(parent,
+ task)));
+ }
+
+ private boolean hasInterestingSubTasks(Object parent, AbstractTask task, int depth) {
+ if (depth > 0) {
+ if (!TasksUiPlugin.getDefault().groupSubtasks(task)) {
+ return false;
+ }
+ if (task.getChildren() != null && task.getChildren().size() > 0) {
+ for (ITask subTask : task.getChildren()) {
+ if (shouldAlwaysShow(parent, (AbstractTask) subTask, depth - 1)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean shouldShowInFocusedWorkweekDateContainer(Object parent, ITask task) {
+ if (parent instanceof ScheduledTaskContainer) {
+
+ ScheduledTaskContainer container = (ScheduledTaskContainer) parent;
+
+ if (container instanceof Unscheduled) {
+ return false;
+ }
+
+ if (isDateRangeInteresting(container)) {
+ return true;
+ }
+
+// if (container.isWeekDay() || container.isPresent()) {
+// return true;
+// }
+//
+//// if (!TasksUiPlugin.getTaskActivityManager().isWeekDay((ScheduledTaskContainer) parent)) {
+//// return false;
+//// }
+// if (TasksUiPlugin.getTaskActivityManager().isOverdue(task)
+// || TasksUiPlugin.getTaskActivityManager().isPastReminder((AbstractTask) task)) {
+// return true;
+// }
+
+ }
+
+ return false;
+ }
+
+ public boolean isInterestingForThisWeek(Object parent, AbstractTask task) {
+ if (parent instanceof ScheduledTaskContainer) {
+ return shouldShowInFocusedWorkweekDateContainer(parent, task);
+ } else {
+ return TasksUiPlugin.getTaskActivityManager().isPastReminder(task)
+ || TasksUiPlugin.getTaskActivityManager().isSheduledForPastWeek(task)
+ || TasksUiPlugin.getTaskActivityManager().isScheduledForThisWeek(task)
+ || TasksUiPlugin.getTaskActivityManager().isDueThisWeek(task)
+ || TasksUiPlugin.getTaskActivityManager().isScheduledForToday(task);
+ }
+ }
+
+ public boolean hasChanges(Object parent, ITask task) {
+ if (parent instanceof ScheduledTaskContainer && !(parent instanceof TaskScheduleContentProvider.Unscheduled)) {
+ if (!shouldShowInFocusedWorkweekDateContainer(parent, task)) {
+ return false;
+ }
+ }
+ return hasChangesHelper(parent, task);
+ }
+
+ private boolean hasChangesHelper(Object parent, ITask task) {
+ if (task.getSynchronizationState().isOutgoing()) {
+ return true;
+ } else if (task.getSynchronizationState().isIncoming()) {
+ return true;
+ }
+ if (task instanceof ITaskContainer) {
+ for (ITask child : ((ITaskContainer) task).getChildren()) {
+ if (hasChangesHelper(parent, child)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestSorter.java
new file mode 100644
index 0000000..99295bc
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListInterestSorter.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListInterestSorter extends ViewerSorter {
+
+ private final TaskKeyComparator taskKeyComparator = new TaskKeyComparator();
+
+ @Override
+ public int compare(Viewer compareViewer, Object o1, Object o2) {
+
+ if (o1 instanceof ITaskContainer && o2 instanceof UnmatchedTaskContainer) {
+ return -1;
+ } else if (o2 instanceof ITaskContainer && o1 instanceof UnmatchedTaskContainer) {
+ return 1;
+ }
+ if (o1 instanceof ScheduledTaskContainer && o2 instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer dateRangeTaskContainer1 = (ScheduledTaskContainer) o1;
+ ScheduledTaskContainer dateRangeTaskContainer2 = (ScheduledTaskContainer) o2;
+ return dateRangeTaskContainer1.getDateRange().compareTo(dateRangeTaskContainer2.getDateRange());
+ } else if (o1 instanceof ITaskContainer && o2 instanceof ScheduledTaskContainer) {
+ return -1;
+ } else if (o1 instanceof ScheduledTaskContainer && o2 instanceof ITaskContainer) {
+ return 1;
+ }
+
+ if (o1 instanceof UncategorizedTaskContainer && o2 instanceof ITaskContainer) {
+ return -1;
+ } else if (o1 instanceof ITaskContainer && o2 instanceof UncategorizedTaskContainer) {
+ return 1;
+ }
+
+ if (!(o1 instanceof ITask) && o2 instanceof ITask) {
+ return 1;
+ }
+
+ if (!(o1 instanceof ITask)) {//o1 instanceof AbstractTaskContainer || o1 instanceof AbstractRepositoryQuery) {
+ if (!(o2 instanceof ITask)) {//o2 instanceof AbstractTaskContainer || o2 instanceof AbstractRepositoryQuery) {
+ return ((IRepositoryElement) o1).getSummary().compareToIgnoreCase(
+ ((IRepositoryElement) o2).getSummary());
+ } else {
+ return -1;
+ }
+ } else if (o1 instanceof ITaskContainer) {
+ if (!(o2 instanceof ITask)) {//o2 instanceof AbstractTaskContainer || o2 instanceof AbstractRepositoryQuery) {
+ return -1;
+ } else if (o2 instanceof ITaskContainer) {
+ IRepositoryElement element1 = (IRepositoryElement) o1;
+ IRepositoryElement element2 = (IRepositoryElement) o2;
+
+ AbstractTask task1 = null;
+ AbstractTask task2 = null;
+ if (element1 instanceof ITask) {
+ task1 = (AbstractTask) element1;
+ }
+ if (element2 instanceof ITask) {
+ task2 = (AbstractTask) element2;
+ }
+
+ if (task1 == null && task2 == null) {
+ return comparePrioritiesAndKeys(element1, element2);
+ } else if (task1 == null) {
+ return 1;
+ } else if (task2 == null) {
+ return -1;
+ }
+
+ int complete = compareCompleted(task1, task2);
+ if (complete != 0) {
+ return complete;
+ } else {
+ int due = compareDueDates(task1, task2);
+ if (due != 0) {
+ return due;
+ } else {
+ int today = compareScheduledDate(task1, task2);
+ if (today == 0) {
+ return comparePrioritiesAndKeys(element1, element2);
+ } else {
+ return today;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+ }
+
+ private int compareDueDates(ITask task1, ITask task2) {
+ if (TasksUiPlugin.getTaskActivityManager().isOverdue(task1)
+ && !TasksUiPlugin.getTaskActivityManager().isOverdue(task2)) {
+ return -1;
+ } else if (!TasksUiPlugin.getTaskActivityManager().isOverdue(task1)
+ && TasksUiPlugin.getTaskActivityManager().isOverdue(task2)) {
+ return 1;
+ }
+ return 0;
+ }
+
+ private int compareScheduledDate(AbstractTask task1, AbstractTask task2) {
+ if (isToday(task1) && !isToday(task2)) {
+ return -1;
+ } else if (!isToday(task1) && isToday(task2)) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ private boolean isToday(AbstractTask task) {
+ return TasksUiPlugin.getTaskActivityManager().isPastReminder(task)
+ || TasksUiPlugin.getTaskActivityManager().isScheduledForToday(task);
+ }
+
+ private int compareCompleted(ITask task1, ITask task2) {
+ if (task1.isCompleted() && !task2.isCompleted()) {
+ return 1;
+ } else if (!task1.isCompleted() && task2.isCompleted()) {
+ return -1;
+ } else {
+ return 0;
+ }
+ }
+
+ private int comparePrioritiesAndKeys(IRepositoryElement element1, IRepositoryElement element2) {
+ int priority = comparePriorities(element1, element2);
+ if (priority != 0) {
+ return priority;
+ }
+
+ int description = compareKeys(element1, element2);
+ if (description != 0) {
+ return description;
+ }
+ return 0;
+ }
+
+ private int compareKeys(IRepositoryElement element1, IRepositoryElement element2) {
+ return taskKeyComparator.compare(TaskComparator.getSortableFromElement(element1),
+ TaskComparator.getSortableFromElement(element2));
+ }
+
+ private int comparePriorities(IRepositoryElement element1, IRepositoryElement element2) {
+ if (element1 instanceof AbstractTaskContainer && element2 instanceof AbstractTaskContainer) {
+ return ((AbstractTaskContainer) element1).getPriority().compareTo(
+ ((AbstractTaskContainer) element2).getPriority());
+ } else {
+ // TODO: consider implementing
+ return -1;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListSorter.java
new file mode 100644
index 0000000..a926c10
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListSorter.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.text.Collator;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryElement;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskComparator;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IMemento;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskListSorter extends ViewerSorter {
+
+ private static final String MEMENTO_KEY_SORTER = "sorter"; //$NON-NLS-1$
+
+ private static final String MEMENTO_KEY_GROUP_BY = "groupBy"; //$NON-NLS-1$
+
+ private static final TaskListSorter.GroupBy DEFAULT_GROUP_BY = TaskListSorter.GroupBy.NONE;
+
+ public enum GroupBy {
+ NONE, CATEGORY_QUERY, CATEGORY_REPOSITORY;
+
+ public String getLabel() {
+ switch (this) {
+ case NONE:
+ return Messages.TaskListSorter_No_Grouping;
+ case CATEGORY_QUERY:
+ return Messages.TaskListSorter_Catagory_and_Query;
+ case CATEGORY_REPOSITORY:
+ return Messages.TaskListSorter_Catagory_and_Repository;
+ default:
+ return null;
+ }
+ }
+
+ public static GroupBy valueOfLabel(String label) {
+ for (GroupBy value : values()) {
+ if (value.getLabel().equals(label)) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ }
+
+ private class SortElement {
+
+ private int weight;
+
+ private final String[] values = new String[3];
+
+ }
+
+ private final TaskComparator taskComparator;
+
+ private GroupBy groupBy;
+
+ private final SortElement key1;
+
+ private final SortElement key2;
+
+ public TaskListSorter() {
+ this.taskComparator = new TaskComparator();
+ this.groupBy = GroupBy.CATEGORY_QUERY;
+ this.key1 = new SortElement();
+ this.key2 = new SortElement();
+ }
+
+ /**
+ * compare - invoked when column is selected calls the actual comparison method for particular criteria
+ */
+ @Override
+ public int compare(Viewer compareViewer, Object o1, Object o2) {
+ if (o1 instanceof AbstractTask && o2 instanceof AbstractTask) {
+ // sort of the tasks within the container using the setting from the Sortdialog
+ ITask element1 = (ITask) o1;
+ ITask element2 = (ITask) o2;
+ return compareElements(element1, element2);
+ } else if (o1 instanceof ScheduledTaskContainer && o2 instanceof ScheduledTaskContainer) {
+ // scheduled Mode compare
+ ScheduledTaskContainer dateRangeTaskContainer1 = (ScheduledTaskContainer) o1;
+ ScheduledTaskContainer dateRangeTaskContainer2 = (ScheduledTaskContainer) o2;
+ return dateRangeTaskContainer1.getDateRange().compareTo(dateRangeTaskContainer2.getDateRange());
+ } else {
+ updateKey(key1, o1);
+ updateKey(key2, o2);
+
+ if (key1.weight != key2.weight) {
+ return key1.weight - key2.weight < 0 ? -1 : 1;
+ }
+ int result = compare(key1.values[0], key2.values[0]);
+ if (result != 0) {
+ return result;
+ }
+ result = compare(key1.values[1], key2.values[1]);
+ return (result != 0) ? result : compare(key1.values[2], key2.values[2]);
+ }
+ }
+
+ private int compare(String key1, String key2) {
+ if (key1 == null) {
+ return (key2 != null) ? 1 : 0;
+ } else if (key2 == null) {
+ return -1;
+ }
+ return Collator.getInstance().compare(key1, key2);
+ }
+
+ private void updateKey(SortElement key, Object object) {
+ int weight;
+ if (object instanceof AbstractTask) {
+ weight = 0;
+ } else if (object instanceof UncategorizedTaskContainer) {
+ weight = 1;
+ } else if (object instanceof UnsubmittedTaskContainer) {
+ weight = 2;
+ } else if (object instanceof TaskCategory) {
+ weight = 3;
+ } else if (object instanceof RepositoryQuery) {
+ weight = 4;
+ } else if (object instanceof TaskGroup) { // support for the experimental grouping of tasks
+ weight = 5;
+ } else if (object instanceof UnmatchedTaskContainer) {
+ weight = 6;
+ } else {
+ weight = 99;
+ }
+
+ key.values[0] = ((AbstractTaskContainer) object).getSummary();
+ key.values[1] = null;
+ key.values[2] = null;
+
+ switch (groupBy) {
+ case NONE:
+ weight = 1;
+ break;
+ case CATEGORY_QUERY:
+ break;
+ case CATEGORY_REPOSITORY:
+ if (weight == 1) {
+ // keep
+ } else if (weight == 3) {
+ weight = 2;
+ } else {
+ key.values[0] = getRepositoryUrl(object);
+ key.values[1] = weight + ""; //$NON-NLS-1$
+ key.values[2] = ((AbstractTaskContainer) object).getSummary();
+ weight = 3;
+ }
+ break;
+ }
+
+ key.weight = weight;
+ }
+
+ private String getRepositoryUrl(Object object) {
+ if (object instanceof ITaskRepositoryElement) {
+ ITaskRepositoryElement repositoryElement = (ITaskRepositoryElement) object;
+ String repositoryUrl = repositoryElement.getRepositoryUrl();
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(
+ repositoryElement.getConnectorKind(), repositoryUrl);
+ return taskRepository != null ? taskRepository.getRepositoryLabel() : null;
+ }
+// if (object instanceof UnsubmittedTaskContainer) {
+// return ((UnsubmittedTaskContainer) object).getRepositoryUrl();
+// } else if (object instanceof RepositoryQuery) {
+// return ((RepositoryQuery) object).getRepositoryUrl();
+// } else if (object instanceof UnmatchedTaskContainer) {
+// return ((UnmatchedTaskContainer) object).getRepositoryUrl();
+// }
+ return null;
+ }
+
+ private int compareElements(ITask element1, ITask element2) {
+ return taskComparator.compare(element1, element2);
+ }
+
+ @Override
+ public TaskComparator getComparator() {
+ return taskComparator;
+ }
+
+ public GroupBy getGroupBy() {
+ return groupBy;
+ }
+
+ public void setGroupBy(GroupBy sortByIndex) {
+ Assert.isNotNull(sortByIndex);
+ this.groupBy = sortByIndex;
+ }
+
+ public void restoreState(IMemento memento) {
+ IMemento child = memento.getChild(MEMENTO_KEY_SORTER);
+ if (child != null) {
+ getComparator().restoreState(child);
+ }
+ setGroupBy(getGroupBy(memento, MEMENTO_KEY_GROUP_BY, DEFAULT_GROUP_BY));
+ }
+
+ public void saveState(IMemento memento) {
+ IMemento child = memento.createChild(MEMENTO_KEY_SORTER);
+ if (child != null) {
+ getComparator().saveState(child);
+ }
+ memento.putString(MEMENTO_KEY_GROUP_BY, getGroupBy().name());
+ }
+
+ private TaskListSorter.GroupBy getGroupBy(IMemento memento, String key, TaskListSorter.GroupBy defaultValue) {
+ String value = memento.getString(key);
+ if (value != null) {
+ try {
+ return TaskListSorter.GroupBy.valueOf(value);
+ } catch (IllegalArgumentException e) {
+ // ignore
+ }
+ }
+ return defaultValue;
+ }
+}
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
new file mode 100644
index 0000000..23679b8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListToolTip.java
@@ -0,0 +1,663 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 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
+ * Kevin Barnes, IBM Corporation - fix for bug 277974
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.commons.core.DateUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.GradientToolTip;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ScalingHyperlink;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+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.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskDataDiff;
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotifier;
+import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Scrollable;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.forms.IFormColors;
+
+import com.ibm.icu.text.DateFormat;
+import com.ibm.icu.text.SimpleDateFormat;
+
+/**
+ * @author Mik Kersten
+ * @author Eric Booth
+ * @author Leo Dos Santos
+ * @author Steffen Pingel
+ */
+public class TaskListToolTip extends GradientToolTip {
+
+ private final static int MAX_TEXT_WIDTH = 300;
+
+ private final static int MAX_WIDTH = 600;
+
+ private final static int X_SHIFT = PlatformUtil.getToolTipXShift();
+
+ private final static int Y_SHIFT = 1;
+
+ private IRepositoryElement currentTipElement;
+
+ private final List<TaskListToolTipListener> listeners = new ArrayList<TaskListToolTipListener>();
+
+ private boolean visible;
+
+ private boolean triggeredByMouse;
+
+ private final Control control;
+
+ private final Color titleColor;
+
+ public TaskListToolTip(Control control) {
+ super(control);
+ this.control = control;
+ setShift(new Point(1, 1));
+ titleColor = TasksUiPlugin.getDefault().getFormColors(control.getDisplay()).getColor(IFormColors.TITLE);
+ }
+
+ public void dispose() {
+ hide();
+ }
+
+ @Override
+ protected void afterHideToolTip(Event event) {
+ triggeredByMouse = true;
+ visible = false;
+ for (TaskListToolTipListener listener : listeners.toArray(new TaskListToolTipListener[0])) {
+ listener.toolTipHidden(event);
+ }
+ }
+
+ public void addTaskListToolTipListener(TaskListToolTipListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeTaskListToolTipListener(TaskListToolTipListener listener) {
+ listeners.remove(listener);
+ }
+
+ private IRepositoryElement getTaskListElement(Object hoverObject) {
+ if (hoverObject instanceof ScalingHyperlink) {
+ TaskHyperlink hyperlink = (TaskHyperlink) hoverObject;
+ return hyperlink.getTask();
+ } else if (hoverObject instanceof Widget) {
+ Object data = ((Widget) hoverObject).getData();
+ if (data != null) {
+ if (data instanceof ITaskContainer) {
+ return (IRepositoryElement) data;
+ } else if (data instanceof IAdaptable) {
+ return (IRepositoryElement) ((IAdaptable) data).getAdapter(AbstractTaskContainer.class);
+ }
+ }
+ }
+ return null;
+ }
+
+ private String getTitleText(IRepositoryElement element) {
+ if (element instanceof ScheduledTaskContainer) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(element.getSummary());
+ Calendar start = ((ScheduledTaskContainer) element).getDateRange().getStartDate();
+ sb.append(" ["); //$NON-NLS-1$
+ sb.append(DateFormat.getDateInstance(DateFormat.LONG).format(start.getTime()));
+ sb.append("]"); //$NON-NLS-1$
+ return sb.toString();
+ } else if (element instanceof IRepositoryQuery) {
+ IRepositoryQuery query = (IRepositoryQuery) element;
+ StringBuilder sb = new StringBuilder();
+ sb.append(element.getSummary());
+ sb.append(" ["); //$NON-NLS-1$
+ sb.append(getRepositoryLabel(query.getConnectorKind(), query.getRepositoryUrl()));
+ sb.append("]"); //$NON-NLS-1$
+ return sb.toString();
+ } else if (element instanceof ITask) {
+ return ((ITask) element).getSummary();
+ } else {
+ return new TaskElementLabelProvider(false).getText(element);
+ }
+ }
+
+ private String getDetailsText(IRepositoryElement element) {
+ if (element instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer container = (ScheduledTaskContainer) element;
+ int estimateTotal = 0;
+ long elapsedTotal = 0;
+ for (ITask child : container.getChildren()) {
+ if (child instanceof AbstractTask) {
+ estimateTotal += ((AbstractTask) child).getEstimatedTimeHours();
+ elapsedTotal += TasksUiPlugin.getTaskActivityManager().getElapsedTime(child,
+ container.getDateRange());
+ }
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append(NLS.bind(Messages.TaskListToolTip_Estimate, estimateTotal));
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(NLS.bind(Messages.TaskListToolTip_Elapsed, DateUtil.getFormattedDurationShort(elapsedTotal)));
+ sb.append("\n"); //$NON-NLS-1$
+ return sb.toString();
+ } else if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ StringBuilder sb = new StringBuilder();
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(task.getConnectorKind());
+ String kindLabel = null;
+ if (connectorUi != null) {
+ kindLabel = connectorUi.getTaskKindLabel(task);
+ sb.append(kindLabel);
+ }
+ String key = task.getTaskKey();
+ if (key != null) {
+ sb.append(" "); //$NON-NLS-1$
+ sb.append(key);
+ }
+ String taskKind = task.getTaskKind();
+ if (taskKind != null && taskKind.length() > 0 && !taskKind.equals(kindLabel)) {
+ sb.append(" ("); //$NON-NLS-1$
+ sb.append(taskKind);
+ sb.append(") "); //$NON-NLS-1$
+ }
+ sb.append(", "); //$NON-NLS-1$
+ sb.append(task.getPriority());
+ sb.append(" ["); //$NON-NLS-1$
+ sb.append(getRepositoryLabel(task.getConnectorKind(), task.getRepositoryUrl()));
+ sb.append("]"); //$NON-NLS-1$
+ sb.append("\n"); //$NON-NLS-1$
+ return sb.toString();
+ } else {
+ return null;
+ }
+ }
+
+ private String getRepositoryLabel(String repositoryKind, String repositoryUrl) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(repositoryKind, repositoryUrl);
+ if (repository != null) {
+ String label = repository.getRepositoryLabel();
+ if (label.indexOf("//") != -1) { //$NON-NLS-1$
+ return label.substring((repository.getRepositoryUrl().indexOf("//") + 2)); //$NON-NLS-1$
+ }
+ return label;
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ private String getActivityText(IRepositoryElement element) {
+// if (element instanceof ScheduledTaskDelegate) {
+// ScheduledTaskDelegate task = (ScheduledTaskDelegate) element;
+//
+// StringBuilder sb = new StringBuilder();
+// Date date = task.getScheduledForDate();
+// if (date != null) {
+// sb.append("Scheduled for: ");
+// sb.append(new SimpleDateFormat("E").format(date)).append(", ");
+// sb.append(DateFormat.getDateInstance(DateFormat.LONG).format(date));
+// sb.append(" (").append(DateFormat.getTimeInstance(DateFormat.SHORT).format(date)).append(")\n");
+// }
+//
+// long elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task.getCorrespondingTask(),
+// task.getDateRangeContainer().getStart(), task.getDateRangeContainer().getEnd());
+// String elapsedTimeString = DateUtil.getFormattedDurationShort(elapsed);
+// sb.append("Elapsed: ");
+// sb.append(elapsedTimeString);
+// sb.append("\n");
+//
+// return sb.toString();
+// } else
+//
+ if (element instanceof ITask) {
+ AbstractTask task = (AbstractTask) element;
+
+ StringBuilder sb = new StringBuilder();
+
+ Date dueDate = task.getDueDate();
+ if (dueDate != null) {
+ sb.append(NLS.bind(Messages.TaskListToolTip_Due, 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$
+ }
+
+ DateRange scheduledDate = task.getScheduledForDate();
+ if (scheduledDate != null) {
+ sb.append(NLS.bind(Messages.TaskListToolTip_Scheduled, scheduledDate.toString()));
+ sb.append("\n"); //$NON-NLS-1$
+ }
+
+ long elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task);
+ sb.append(NLS.bind(Messages.TaskListToolTip_Elapsed, DateUtil.getFormattedDurationShort(elapsed)));
+ sb.append("\n"); //$NON-NLS-1$
+
+ return sb.toString();
+ }
+ return null;
+ }
+
+ private String getIncommingText(IRepositoryElement element) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ if (task.getSynchronizationState().isIncoming()) {
+ String text = null;
+ TaskListNotifier notifier = new TaskListNotifier(TasksUiPlugin.getRepositoryModel(),
+ TasksUiPlugin.getTaskDataManager());
+ TaskDataDiff diff = notifier.getDiff(task);
+ if (diff != null) {
+ text = diff.toString(MAX_TEXT_WIDTH, false);
+ }
+ if (text != null && text.length() > 0) {
+ return text;
+ }
+ }
+ }
+ return null;
+ }
+
+ private String getStatusText(IRepositoryElement element) {
+ IStatus status = null;
+ if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+ status = task.getStatus();
+ } else if (element instanceof IRepositoryQuery) {
+ RepositoryQuery query = (RepositoryQuery) element;
+ status = query.getStatus();
+ }
+
+ if (status != null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(status.getMessage());
+ if (status instanceof RepositoryStatus && ((RepositoryStatus) status).isHtmlMessage()) {
+ sb.append(Messages.TaskListToolTip_Please_synchronize_manually_for_full_error_message);
+ }
+ return sb.toString();
+ }
+
+ return null;
+ }
+
+ @Override
+ public Point getLocation(Point tipSize, Event event) {
+ Widget widget = getTipWidget(event);
+ if (widget != null) {
+ Rectangle bounds = getBounds(widget);
+ if (bounds != null) {
+ 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);
+ }
+
+ private ProgressData getProgressData(IRepositoryElement element) {
+ if (element instanceof ITaskContainer) {
+ Object[] children = new Object[0];
+
+ children = ((ITaskContainer) element).getChildren().toArray();
+
+ int total = children.length;
+ if (total > 0) {
+ int completed = 0;
+ for (ITask task : ((ITaskContainer) element).getChildren()) {
+ if (task.isCompleted()) {
+ completed++;
+ }
+ }
+ String text = NLS.bind(Messages.TaskListToolTip_Total_Complete_Incomplete, new Object[] { //
+ total, completed, (total - completed) });
+ return new ProgressData(completed, total, text);
+ }
+ }
+ return null;
+ }
+
+ private Image getImage(IRepositoryElement element) {
+ if (element instanceof IRepositoryQuery) {
+ IRepositoryQuery query = (IRepositoryQuery) element;
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ query.getConnectorKind());
+ if (connector != null) {
+ return TasksUiPlugin.getDefault().getBrandingIcon(connector.getConnectorKind());
+ }
+ } else if (element instanceof ITask) {
+ ITask repositoryTask = (ITask) element;
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repositoryTask.getConnectorKind());
+ if (connector != null) {
+ return TasksUiPlugin.getDefault().getBrandingIcon(connector.getConnectorKind());
+ }
+ } else if (element instanceof ScheduledTaskContainer) {
+ return CommonImages.getImage(CommonImages.CALENDAR);
+ }
+ return null;
+ }
+
+ protected Widget getTipWidget(Event event) {
+ Point widgetPosition = new Point(event.x, event.y);
+ Widget widget = event.widget;
+ if (widget instanceof ToolBar) {
+ ToolBar w = (ToolBar) widget;
+ return w.getItem(widgetPosition);
+ }
+ if (widget instanceof Table) {
+ Table w = (Table) widget;
+ return w.getItem(widgetPosition);
+ }
+ if (widget instanceof Tree) {
+ Tree w = (Tree) widget;
+ return w.getItem(widgetPosition);
+ }
+
+ return widget;
+ }
+
+ private Rectangle getBounds(Widget widget) {
+ if (widget instanceof ToolItem) {
+ ToolItem w = (ToolItem) widget;
+ return w.getBounds();
+ }
+ if (widget instanceof TableItem) {
+ TableItem w = (TableItem) widget;
+ return w.getBounds();
+ }
+ if (widget instanceof TreeItem) {
+ TreeItem w = (TreeItem) widget;
+ return w.getBounds();
+ }
+ return null;
+ }
+
+ @Override
+ protected boolean shouldCreateToolTip(Event event) {
+ currentTipElement = null;
+
+ if (super.shouldCreateToolTip(event)) {
+ Widget tipWidget = getTipWidget(event);
+ if (tipWidget != null) {
+ Rectangle bounds = getBounds(tipWidget);
+ if (tipWidget instanceof ScalingHyperlink) {
+ currentTipElement = getTaskListElement(tipWidget);
+ } else if (bounds != null && contains(bounds.x, bounds.y)) {
+ currentTipElement = getTaskListElement(tipWidget);
+ }
+ }
+ }
+
+ if (currentTipElement == null) {
+ hide();
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ private boolean contains(int x, int y) {
+ if (control instanceof Scrollable) {
+ return ((Scrollable) control).getClientArea().contains(x, y);
+ } else {
+ return control.getBounds().contains(x, y);
+ }
+ }
+
+ @Override
+ protected Composite createToolTipArea(Event event, Composite parent) {
+ assert currentTipElement != null;
+
+ Composite composite = createToolTipContentAreaComposite(parent);
+
+ addIconAndLabel(composite, getImage(currentTipElement), getTitleText(currentTipElement), true);
+
+ String detailsText = getDetailsText(currentTipElement);
+ if (detailsText != null) {
+ addIconAndLabel(composite, null, detailsText);
+ }
+
+ String synchText = getSynchText(currentTipElement);
+ if (synchText != null) {
+ addIconAndLabel(composite, CommonImages.getImage(TasksUiImages.REPOSITORY_SYNCHRONIZE), synchText);
+ }
+
+ String activityText = getActivityText(currentTipElement);
+ if (activityText != null) {
+ 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);
+ }
+
+ ProgressData progress = getProgressData(currentTipElement);
+ if (progress != null) {
+ addIconAndLabel(composite, null, progress.text);
+
+ // 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;
+ label.setLayoutData(labelGridData);
+
+ Composite progressComposite = new Composite(composite, SWT.NONE);
+ GridLayout progressLayout = new GridLayout(1, false);
+ progressLayout.marginWidth = 0;
+ progressLayout.marginHeight = 0;
+ progressComposite.setLayout(progressLayout);
+ progressComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ WorkweekProgressBar taskProgressBar = new WorkweekProgressBar(progressComposite);
+ taskProgressBar.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ taskProgressBar.reset(progress.completed, progress.total);
+
+ // do we really need custom canvas? code below renders the same
+// IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+// Color color = themeManager.getCurrentTheme().getColorRegistry().get(
+// TaskListColorsAndFonts.THEME_COLOR_TASK_TODAY_COMPLETED);
+// ProgressBar bar = new ProgressBar(tipShell, SWT.SMOOTH);
+// bar.setForeground(color);
+// bar.setSelection((int) (100d * progress.completed / progress.total));
+// GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
+// gridData.heightHint = 5;
+// bar.setLayoutData(gridData);
+ }
+
+ String statusText = getStatusText(currentTipElement);
+ if (statusText != null) {
+ addIconAndLabel(composite, CommonImages.getImage(CommonImages.WARNING), statusText);
+ }
+
+ String helpText = getHelpText(currentTipElement);
+ if (helpText != null) {
+ addIconAndLabel(composite, CommonImages.getImage(CommonImages.QUESTION), helpText);
+ }
+
+ visible = true;
+
+ return composite;
+ }
+
+ private String getHelpText(IRepositoryElement element) {
+ if (element instanceof TaskCategory || element instanceof IRepositoryQuery) {
+ if (AbstractTaskListFilter.hasDescendantIncoming((ITaskContainer) element)) {
+ 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);
+ boolean hasIncoming = false;
+ for (Object child : children) {
+ if (child instanceof ITask) {
+ if (((ITask) child).getSynchronizationState().isIncoming()) {
+ hasIncoming = true;
+ break;
+ }
+ }
+ }
+ if (!hasIncoming) {
+ return Messages.TaskListToolTip_Some_incoming_elements_may_be_filtered;
+ }
+ }
+ }
+ }
+ // if has incoming but no top level children have incoming, suggest incoming tasks may be filtered
+ }
+ if (element instanceof UncategorizedTaskContainer) {
+ return Messages.TaskListToolTip_Automatic_container_for_all_local_tasks;
+ } else if (element instanceof UnmatchedTaskContainer) {
+ return Messages.TaskListToolTip_Automatic_container_for_repository_tasks;
+ }
+ return null;
+ }
+
+ protected Composite createToolTipContentAreaComposite(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ gridLayout.marginWidth = 5;
+ gridLayout.marginHeight = 2;
+ composite.setLayout(gridLayout);
+ composite.setBackground(composite.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ return composite;
+ }
+
+ private String getSynchText(IRepositoryElement element) {
+ if (element instanceof IRepositoryQuery) {
+ String syncStamp = ((RepositoryQuery) element).getLastSynchronizedTimeStamp();
+ if (syncStamp != null) {
+ return NLS.bind(Messages.TaskListToolTip_Synchronized, syncStamp);
+ }
+ }
+ return null;
+ }
+
+ private String removeTrailingNewline(String text) {
+ if (text.endsWith("\n")) { //$NON-NLS-1$
+ return text.substring(0, text.length() - 1);
+ }
+ return text;
+ }
+
+ protected void addIconAndLabel(Composite parent, Image image, String text) {
+ addIconAndLabel(parent, image, text, false);
+ }
+
+ protected void addIconAndLabel(Composite parent, Image image, String text, boolean title) {
+ Label imageLabel = new Label(parent, SWT.NONE);
+ imageLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ imageLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ imageLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+ imageLabel.setImage(image);
+
+ Label textLabel = new Label(parent, SWT.WRAP);
+ if (title) {
+ textLabel.setFont(CommonFonts.BOLD);
+ }
+ textLabel.setForeground(titleColor);
+ textLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ textLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
+ text = removeTrailingNewline(text);
+ textLabel.setText(TasksUiInternal.escapeLabelText(text));
+ int width = Math.min(textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, MAX_WIDTH);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(width, SWT.DEFAULT).applyTo(textLabel);
+ }
+
+ private static class ProgressData {
+
+ int completed;
+
+ int total;
+
+ String text;
+
+ public ProgressData(int completed, int total, String text) {
+ this.completed = completed;
+ this.total = total;
+ this.text = text;
+ }
+
+ }
+
+ public static interface TaskListToolTipListener {
+
+ void toolTipHidden(Event event);
+
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public boolean isTriggeredByMouse() {
+ return triggeredByMouse;
+ }
+
+ @Override
+ public void show(Point location) {
+ super.show(location);
+ triggeredByMouse = false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java
new file mode 100644
index 0000000..4fc0108
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskListView.java
@@ -0,0 +1,1661 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ken Sueda - improvements
+ * Eugene Kuleshov - improvements
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.layout.TreeColumnLayout;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnPixelData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+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.DelayedRefreshJob;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SubstringPatternFilter;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.ui.AbstractTaskListFilter;
+import org.eclipse.mylyn.internal.tasks.ui.CategorizedPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.ScheduledPresentation;
+import org.eclipse.mylyn.internal.tasks.ui.TaskArchiveFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TaskCompletionFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TaskPriorityFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TaskWorkingSetFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.CollapseAllAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ExpandAllAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.FilterCompletedTasksAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.GoUpAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.GroupSubTasksAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.LinkWithEditorAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTasksUiPreferencesAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.PresentationDropDownSelectionAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeAutomaticallyAction;
+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.commands.CollapseAllHandler;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter;
+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;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker;
+import org.eclipse.mylyn.internal.tasks.ui.util.SortCriterion.SortKey;
+import org.eclipse.mylyn.internal.tasks.ui.util.TreeWalker.TreeVisitor;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
+import org.eclipse.mylyn.tasks.core.TaskActivityAdapter;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.RTFTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Region;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Scrollable;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPageListener;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.part.DrillDownAdapter;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.ShowInContext;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Mik Kersten
+ * @author Ken Sueda
+ * @author Eugene Kuleshov
+ */
+public class TaskListView extends ViewPart implements IPropertyChangeListener, IShowInTarget {
+
+ private final class TaskListRefreshJob extends DelayedRefreshJob {
+
+ private TaskListRefreshJob(TreeViewer treeViewer, String name) {
+ super(treeViewer, name);
+ }
+
+ @Override
+ protected void doRefresh(Object[] items) {
+ TreePath selection = preserveSelection();
+
+ if (items == null) {
+ viewer.refresh(true);
+ } else if (items.length > 0) {
+ try {
+ if (TaskListView.this.isFocusedMode()) {
+ Set<Object> children = new HashSet<Object>(Arrays.asList(items));
+ Set<AbstractTaskContainer> parents = new HashSet<AbstractTaskContainer>();
+ for (Object item : items) {
+ if (item instanceof AbstractTask) {
+ parents.addAll(((AbstractTask) item).getParentContainers());
+ }
+ }
+ // 1. refresh parents
+ children.removeAll(parents);
+ for (AbstractTaskContainer parent : parents) {
+ viewer.refresh(parent, false);
+ // only refresh label of parent
+ viewer.update(parent, null);
+ }
+ // 2. refresh children
+ for (Object item : children) {
+ viewer.refresh(item, true);
+ }
+ // 3. update states of all changed items
+ for (Object item : items) {
+ updateExpansionState(item);
+ }
+ } else {
+ Set<AbstractTaskContainer> parents = new HashSet<AbstractTaskContainer>();
+ for (Object item : items) {
+ if (item instanceof AbstractTask) {
+ parents.addAll(((AbstractTask) item).getParentContainers());
+ }
+ viewer.refresh(item, true);
+ updateExpansionState(item);
+ }
+ // refresh labels of parents for task activation or incoming indicators
+ for (AbstractTaskContainer parent : parents) {
+ // only refresh label
+ viewer.update(parent, null);
+ }
+ }
+ } catch (SWTException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to refresh viewer: " //$NON-NLS-1$
+ + viewer, e));
+ }
+ }
+
+ updateToolTip(false);
+ restoreSelection(selection);
+ }
+
+ private TreePath preserveSelection() {
+ if (viewer instanceof TreeViewer) {
+ TreeViewer treeViewer = (TreeViewer) viewer;
+ // in case the refresh removes the currently selected item,
+ // remember the next item in the tree to restore the selection
+ // TODO: consider making this optional
+ TreeItem[] selection = treeViewer.getTree().getSelection();
+ if (selection.length > 0) {
+ TreeWalker treeWalker = new TreeWalker(treeViewer);
+ return treeWalker.walk(new TreeVisitor() {
+ @Override
+ public boolean visit(Object object) {
+ return true;
+ }
+ }, selection[selection.length - 1]);
+ }
+ }
+ return null;
+ }
+
+ private void restoreSelection(TreePath treePath) {
+ if (treePath != null) {
+ ISelection newSelection = viewer.getSelection();
+ if (newSelection == null || newSelection.isEmpty()) {
+ viewer.setSelection(new TreeSelection(treePath), true);
+ }
+ }
+ }
+
+ protected void updateExpansionState(Object item) {
+ if (TaskListView.this.isFocusedMode() && isAutoExpandMode()) {
+ TaskListView.this.getViewer().expandToLevel(item, 3);
+ }
+ }
+ }
+
+ // TODO e3.4 replace with SWT.NO_SCROLL constant
+ public static final int SWT_NO_SCROLL = 1 << 4;
+
+ private static final String ID_SEPARATOR_FILTERS = "filters"; //$NON-NLS-1$
+
+ private static final String ID_SEPARATOR_TASKS = "tasks"; //$NON-NLS-1$
+
+ private static final String ID_SEPARATOR_CONTEXT = "context"; //$NON-NLS-1$
+
+ /**
+ * @deprecated Use {@link ITasksUiConstants#ID_VIEW_TASKS} instead
+ */
+ @Deprecated
+ public static final String ID = ITasksUiConstants.ID_VIEW_TASKS;
+
+ public static final String LABEL_VIEW = Messages.TaskListView_Task_List;
+
+ @Deprecated
+ private static final String MEMENTO_KEY_SORT_DIRECTION = "sortDirection"; //$NON-NLS-1$
+
+ @Deprecated
+ private static final String MEMENTO_KEY_SORTER = "sorter"; //$NON-NLS-1$
+
+ @Deprecated
+ private static final String MEMENTO_KEY_SORTER2 = "sorter2"; //$NON-NLS-1$
+
+ @Deprecated
+ private static final String MEMENTO_KEY_SORT_INDEX = "sortIndex"; //$NON-NLS-1$
+
+ @Deprecated
+ private static final String MEMENTO_SORT_INDEX = "org.eclipse.mylyn.tasklist.ui.views.tasklist.sortIndex"; //$NON-NLS-1$
+
+ private static final String MEMENTO_SORTER = "sorter"; //$NON-NLS-1$
+
+ private static final String MEMENTO_LINK_WITH_EDITOR = "linkWithEditor"; //$NON-NLS-1$
+
+ private static final String MEMENTO_PRESENTATION = "presentation"; //$NON-NLS-1$
+
+ private static final String LABEL_NO_TASKS = "no task active"; //$NON-NLS-1$
+
+ private final static int SIZE_MAX_SELECTION_HISTORY = 10;
+
+ static final String[] PRIORITY_LEVELS = { PriorityLevel.P1.toString(), PriorityLevel.P2.toString(),
+ PriorityLevel.P3.toString(), PriorityLevel.P4.toString(), PriorityLevel.P5.toString() };
+
+ public static final String[] PRIORITY_LEVEL_DESCRIPTIONS = { PriorityLevel.P1.getDescription(),
+ PriorityLevel.P2.getDescription(), PriorityLevel.P3.getDescription(), PriorityLevel.P4.getDescription(),
+ PriorityLevel.P5.getDescription() };
+
+ private static List<AbstractTaskListPresentation> presentationsPrimary = new ArrayList<AbstractTaskListPresentation>();
+
+ private static List<AbstractTaskListPresentation> presentationsSecondary = new ArrayList<AbstractTaskListPresentation>();
+
+ private boolean focusedMode;
+
+ private boolean linkWithEditor;
+
+ private final TaskListCellModifier taskListCellModifier = new TaskListCellModifier(this);
+
+ private IThemeManager themeManager;
+
+ private TaskListFilteredTree filteredTree;
+
+ private DrillDownAdapter drillDownAdapter;
+
+ private AbstractTaskContainer drilledIntoCategory;
+
+ private CollapseAllAction collapseAll;
+
+ private ExpandAllAction expandAll;
+
+ private FilterCompletedTasksAction filterCompleteTask;
+
+ private GroupSubTasksAction filterSubTasksAction;
+
+ private SynchronizeAutomaticallyAction synchronizeAutomatically;
+
+ private OpenTasksUiPreferencesAction openPreferencesAction;
+
+ private PriorityDropDownAction filterOnPriorityAction;
+
+ private TaskListSortAction sortDialogAction;
+
+ private NewTaskAction newTaskAction;
+
+ private LinkWithEditorAction linkWithEditorAction;
+
+ private final PresentationDropDownSelectionAction presentationDropDownSelectionAction = new PresentationDropDownSelectionAction(
+ this);
+
+ private final TaskPriorityFilter filterPriority = new TaskPriorityFilter();
+
+ private final TaskCompletionFilter filterComplete = new TaskCompletionFilter();
+
+ private final TaskArchiveFilter filterArchive = new TaskArchiveFilter();
+
+ private TaskWorkingSetFilter filterWorkingSet;
+
+ private final Set<AbstractTaskListFilter> filters = new HashSet<AbstractTaskListFilter>();
+
+ protected String[] columnNames = new String[] { Messages.TaskListView_Summary };
+
+ protected int[] columnWidths = new int[] { 200 };
+
+ private TreeColumn[] columns;
+
+ private IMemento taskListMemento;
+
+ private AbstractTaskListPresentation currentPresentation;
+
+ private TaskTableLabelProvider taskListTableLabelProvider;
+
+ private TaskListSorter tableSorter;
+
+ private Color categoryGradientStart;
+
+ private Color categoryGradientEnd;
+
+ private CustomTaskListDecorationDrawer customDrawer;
+
+ private TaskListViewActionGroup actionGroup;
+
+ private final IPageListener PAGE_LISTENER = new IPageListener() {
+ public void pageActivated(IWorkbenchPage page) {
+ filteredTree.indicateActiveTaskWorkingSet();
+ }
+
+ public void pageClosed(IWorkbenchPage page) {
+ // ignore
+
+ }
+
+ public void pageOpened(IWorkbenchPage page) {
+ // ignore
+ }
+ };
+
+ private final LinkedHashMap<String, IStructuredSelection> lastSelectionByTaskHandle = new LinkedHashMap<String, IStructuredSelection>(
+ SIZE_MAX_SELECTION_HISTORY);
+
+ /**
+ * True if the view should indicate that interaction monitoring is paused
+ */
+ protected boolean isPaused = false;
+
+ boolean synchronizationOverlaid = false;
+
+ private final Listener CATEGORY_GRADIENT_DRAWER = new Listener() {
+ public void handleEvent(Event event) {
+ if (event.item.getData() instanceof ITaskContainer && !(event.item.getData() instanceof ITask)) {
+ Scrollable scrollable = (Scrollable) event.widget;
+ GC gc = event.gc;
+
+ Rectangle area = scrollable.getClientArea();
+ Rectangle rect = event.getBounds();
+
+ /* Paint the selection beyond the end of last column */
+ expandRegion(event, scrollable, gc, area);
+
+ /* Draw Gradient Rectangle */
+ Color oldForeground = gc.getForeground();
+ Color oldBackground = gc.getBackground();
+
+ gc.setForeground(categoryGradientEnd);
+ gc.drawLine(0, rect.y, area.width, rect.y);
+
+ gc.setForeground(categoryGradientStart);
+ gc.setBackground(categoryGradientEnd);
+
+ // gc.setForeground(categoryGradientStart);
+ // gc.setBackground(categoryGradientEnd);
+ // gc.setForeground(new Clr(Display.getCurrent(), 255, 0, 0));
+
+ gc.fillGradientRectangle(0, rect.y + 1, area.width, rect.height, true);
+
+ /* Bottom Line */
+ // gc.setForeground();
+ gc.setForeground(categoryGradientEnd);
+ gc.drawLine(0, rect.y + rect.height - 1, area.width, rect.y + rect.height - 1);
+
+ gc.setForeground(oldForeground);
+ gc.setBackground(oldBackground);
+ /* Mark as Background being handled */
+ event.detail &= ~SWT.BACKGROUND;
+ }
+ }
+
+ private void expandRegion(Event event, Scrollable scrollable, GC gc, Rectangle area) {
+ int columnCount;
+ if (scrollable instanceof Table) {
+ columnCount = ((Table) scrollable).getColumnCount();
+ } else {
+ columnCount = ((Tree) scrollable).getColumnCount();
+ }
+
+ if (event.index == columnCount - 1 || columnCount == 0) {
+ int width = area.x + area.width - event.x;
+ if (width > 0) {
+ Region region = new Region();
+ gc.getClipping(region);
+ region.add(event.x, event.y, width, event.height);
+ gc.setClipping(region);
+ region.dispose();
+ }
+ }
+ }
+ };
+
+ private boolean gradientListenerAdded = false;
+
+ private final ITaskActivityListener TASK_ACTIVITY_LISTENER = new TaskActivityAdapter() {
+ @Override
+ public void activityReset() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ refreshJob.refresh();
+ }
+ });
+ }
+ };
+
+ private final ITaskActivationListener TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
+
+ @Override
+ public void taskActivated(final ITask task) {
+ if (task != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ updateDescription();
+ refresh(task);
+ selectedAndFocusTask(task);
+ filteredTree.indicateActiveTask(task);
+ }
+ });
+ }
+ }
+
+ @Override
+ public void taskDeactivated(final ITask task) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ refresh(task);
+ updateDescription();
+ filteredTree.indicateNoActiveTask();
+ }
+ });
+ }
+
+ private void refresh(final ITask task) {
+ if (TaskListView.this.isScheduledPresentation()) {
+ refreshJob.refresh();
+ } else {
+ refreshJob.refreshElement(task);
+ }
+ }
+
+ };
+
+ private final ITaskListChangeListener TASKLIST_CHANGE_LISTENER = new TaskListChangeAdapter() {
+
+ @Override
+ public void containersChanged(final Set<TaskContainerDelta> deltas) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ for (TaskContainerDelta taskContainerDelta : deltas) {
+ if (isScheduledPresentation()) {
+ // TODO: implement refresh policy for scheduled presentation
+ refreshJob.refresh();
+ } else {
+ switch (taskContainerDelta.getKind()) {
+ case ROOT:
+ refreshJob.refresh();
+ break;
+ case ADDED:
+ case REMOVED:
+ if (taskContainerDelta.getElement() != null) {
+ refreshJob.refreshElement(taskContainerDelta.getElement());
+ }
+ if (taskContainerDelta.getParent() != null) {
+ refreshJob.refreshElement(taskContainerDelta.getParent());
+ } else {
+ // element was added/removed from the root
+ refreshJob.refresh();
+ }
+ break;
+ case CONTENT:
+ refreshJob.refreshElement(taskContainerDelta.getElement());
+ }
+
+ }
+ }
+ }
+ });
+ }
+ };
+
+ private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)
+ || CommonThemes.isCommonTheme(event.getProperty())) {
+ configureGradientColors();
+ taskListTableLabelProvider.setCategoryBackgroundColor(themeManager.getCurrentTheme()
+ .getColorRegistry()
+ .get(CommonThemes.COLOR_CATEGORY));
+ getViewer().refresh();
+ }
+ }
+ };
+
+ private TaskListToolTip taskListToolTip;
+
+ private void configureGradientColors() {
+ categoryGradientStart = themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_CATEGORY_GRADIENT_START);
+ categoryGradientEnd = themeManager.getCurrentTheme().getColorRegistry().get(
+ CommonThemes.COLOR_CATEGORY_GRADIENT_END);
+
+ boolean customized = true;
+ if (categoryGradientStart != null && categoryGradientStart.getRed() == 240
+ && categoryGradientStart.getGreen() == 240 && categoryGradientStart.getBlue() == 240
+ && categoryGradientEnd != null && categoryGradientEnd.getRed() == 220
+ && categoryGradientEnd.getGreen() == 220 && categoryGradientEnd.getBlue() == 220) {
+ customized = false;
+ }
+
+ if (gradientListenerAdded == false && categoryGradientStart != null
+ && !categoryGradientStart.equals(categoryGradientEnd)) {
+ getViewer().getTree().addListener(SWT.EraseItem, CATEGORY_GRADIENT_DRAWER);
+ gradientListenerAdded = true;
+ if (!customized) {
+ // Set parent-based colors
+ Color parentBackground = getViewer().getTree().getParent().getBackground();
+ double GRADIENT_TOP = 1.05;// 1.02;
+ double GRADIENT_BOTTOM = .995;// 1.035;
+
+ int red = Math.min(255, (int) (parentBackground.getRed() * GRADIENT_TOP));
+ int green = Math.min(255, (int) (parentBackground.getGreen() * GRADIENT_TOP));
+ int blue = Math.min(255, (int) (parentBackground.getBlue() * GRADIENT_TOP));
+
+ try {
+ categoryGradientStart = new Color(Display.getDefault(), red, green, blue);
+ } catch (Exception e) {
+ categoryGradientStart = getViewer().getTree().getParent().getBackground();
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set color: " + red //$NON-NLS-1$
+ + ", " + green + ", " + blue, e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ red = Math.max(0, (int) (parentBackground.getRed() / GRADIENT_BOTTOM));
+ green = Math.max(0, (int) (parentBackground.getGreen() / GRADIENT_BOTTOM));
+ blue = Math.max(0, (int) (parentBackground.getBlue() / GRADIENT_BOTTOM));
+ if (red > 255) {
+ red = 255;
+ }
+ try {
+ categoryGradientEnd = new Color(Display.getDefault(), red, green, blue);
+ } catch (Exception e) {
+ categoryGradientStart = getViewer().getTree().getParent().getBackground();
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set color: " + red //$NON-NLS-1$
+ + ", " + green + ", " + blue, e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ } else if (categoryGradientStart != null && categoryGradientStart.equals(categoryGradientEnd)) {
+ getViewer().getTree().removeListener(SWT.EraseItem, CATEGORY_GRADIENT_DRAWER);
+ gradientListenerAdded = false;
+ }
+ }
+
+ public static TaskListView getFromActivePerspective() {
+ if (PlatformUI.isWorkbenchRunning()) {
+ IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (activeWorkbenchWindow != null) {
+ IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+ if (activePage != null) {
+ IViewPart view = activePage.findView(ITasksUiConstants.ID_VIEW_TASKS);
+ if (view instanceof TaskListView) {
+ return (TaskListView) view;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public TaskListView() {
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ TasksUiInternal.getTaskList().removeChangeListener(TASKLIST_CHANGE_LISTENER);
+ TasksUiPlugin.getTaskActivityManager().removeActivityListener(TASK_ACTIVITY_LISTENER);
+ TasksUiPlugin.getTaskActivityManager().removeActivationListener(TASK_ACTIVATION_LISTENER);
+
+ PlatformUI.getWorkbench().getWorkingSetManager().removePropertyChangeListener(this);
+ if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().removePageListener(PAGE_LISTENER);
+ }
+
+ final IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ if (themeManager != null) {
+ themeManager.removePropertyChangeListener(THEME_CHANGE_LISTENER);
+ }
+
+ if (editorListener != null) {
+ getSite().getPage().removePartListener(editorListener);
+ }
+
+ customDrawer.dispose();
+ categoryGradientStart.dispose();
+ categoryGradientEnd.dispose();
+ }
+
+ private void updateDescription() {
+ ITask task = TasksUi.getTaskActivityManager().getActiveTask();
+ if (getSite() == null || getSite().getPage() == null) {
+ return;
+ }
+
+ IViewReference reference = getSite().getPage().findViewReference(ITasksUiConstants.ID_VIEW_TASKS);
+ boolean shouldSetDescription = false;
+ if (reference != null && reference.isFastView() && !getSite().getPage().isPartVisible(this)) {
+ shouldSetDescription = true;
+ }
+
+ if (task != null) {
+ setTitleToolTip(LABEL_VIEW + " (" + task.getSummary() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (shouldSetDescription) {
+ setContentDescription(task.getSummary());
+ } else {
+ setContentDescription(""); //$NON-NLS-1$
+ }
+ } else {
+ setTitleToolTip(LABEL_VIEW);
+ if (shouldSetDescription) {
+ setContentDescription(LABEL_NO_TASKS);
+ } else {
+ setContentDescription(""); //$NON-NLS-1$
+ }
+ }
+ }
+
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ init(site);
+ this.taskListMemento = memento;
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ if (tableSorter != null) {
+ IMemento child = memento.createChild(MEMENTO_SORTER);
+ tableSorter.saveState(child);
+ }
+
+ memento.putString(MEMENTO_LINK_WITH_EDITOR, Boolean.toString(linkWithEditor));
+ memento.putString(MEMENTO_PRESENTATION, currentPresentation.getId());
+ }
+
+ private void restoreState() {
+ if (taskListMemento != null) {
+ if (tableSorter != null) {
+ IMemento sorterMemento = taskListMemento.getChild(MEMENTO_SORTER);
+ if (sorterMemento != null) {
+ tableSorter.restoreState(sorterMemento);
+ } else {
+ sorterMemento = taskListMemento.getChild(MEMENTO_SORT_INDEX);
+ if (sorterMemento != null) {
+ migrateSorterState(tableSorter, sorterMemento);
+ }
+ }
+ }
+ applyPresentation(taskListMemento.getString(MEMENTO_PRESENTATION));
+ }
+
+ filterWorkingSet = new TaskWorkingSetFilter();
+ filterWorkingSet.updateWorkingSet(getSite().getPage().getAggregateWorkingSet());
+ filteredTree.setWorkingSetFilter(filterWorkingSet);
+ addFilter(filterWorkingSet);
+ addFilter(filterPriority);
+ if (TasksUiPlugin.getDefault().getPreferenceStore().contains(ITasksUiPreferenceConstants.FILTER_COMPLETE_MODE)) {
+ addFilter(filterComplete);
+ }
+
+ //if (TasksUiPlugin.getDefault().getPreferenceStore().contains(TasksUiPreferenceConstants.FILTER_ARCHIVE_MODE)) {
+ addFilter(filterArchive);
+ //}
+
+ // Restore "link with editor" value; by default true
+ boolean linkValue = true;
+ if (taskListMemento != null && taskListMemento.getString(MEMENTO_LINK_WITH_EDITOR) != null) {
+ linkValue = Boolean.parseBoolean(taskListMemento.getString(MEMENTO_LINK_WITH_EDITOR));
+ }
+ setLinkWithEditor(linkValue);
+
+ getViewer().refresh();
+ }
+
+ /**
+ * Public for testing only.
+ */
+ public void migrateSorterState(TaskListSorter tableSorter, IMemento sorterMemento) {
+ int restoredSortIndex = 0;
+ if (sorterMemento != null) {
+ int sortDirection = -1;
+ IMemento m = sorterMemento.getChild(MEMENTO_KEY_SORTER);
+ if (m != null) {
+ Integer sortIndexInt = m.getInteger(MEMENTO_KEY_SORT_INDEX);
+ if (sortIndexInt != null) {
+ restoredSortIndex = sortIndexInt.intValue();
+ }
+ Integer sortDirInt = m.getInteger(MEMENTO_KEY_SORT_DIRECTION);
+ if (sortDirInt != null) {
+ sortDirection = sortDirInt.intValue();
+ tableSorter.getComparator().getSortCriterion(0).setDirection(sortDirection);
+ switch (restoredSortIndex) {
+ case 1:
+ tableSorter.getComparator().getSortCriterion(0).setKey(SortKey.SUMMARY);
+ break;
+ case 2:
+ tableSorter.getComparator().getSortCriterion(0).setKey(SortKey.DATE_CREATED);
+ break;
+ case 3:
+ tableSorter.getComparator().getSortCriterion(0).setKey(SortKey.TASK_ID);
+ break;
+ default:
+ tableSorter.getComparator().getSortCriterion(0).setKey(SortKey.PRIORITY);
+ }
+ }
+ }
+
+ IMemento m2 = sorterMemento.getChild(MEMENTO_KEY_SORTER2);
+ if (m2 != null) {
+ Integer sortIndexInt = m2.getInteger(MEMENTO_KEY_SORT_INDEX);
+ if (sortIndexInt != null) {
+ restoredSortIndex = sortIndexInt.intValue();
+ }
+ Integer sortDirInt = m2.getInteger(MEMENTO_KEY_SORT_DIRECTION);
+ if (sortDirInt != null) {
+ sortDirection = sortDirInt.intValue();
+ tableSorter.getComparator().getSortCriterion(1).setDirection(sortDirection);
+ switch (restoredSortIndex) {
+ case 1:
+ tableSorter.getComparator().getSortCriterion(1).setKey(SortKey.SUMMARY);
+ break;
+ case 2:
+ tableSorter.getComparator().getSortCriterion(1).setKey(SortKey.DATE_CREATED);
+ break;
+ case 3:
+ tableSorter.getComparator().getSortCriterion(1).setKey(SortKey.TASK_ID);
+ break;
+ default:
+ tableSorter.getComparator().getSortCriterion(1).setKey(SortKey.PRIORITY);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ IWorkbenchSiteProgressService progress = (IWorkbenchSiteProgressService) getSite().getAdapter(
+ IWorkbenchSiteProgressService.class);
+ if (progress != null) {
+ // show indicator for all running query synchronizations
+ progress.showBusyForFamily(ITasksCoreConstants.JOB_FAMILY_SYNCHRONIZATION);
+ }
+
+ themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER);
+
+ filteredTree = new TaskListFilteredTree(parent, SWT.MULTI | SWT.VERTICAL | /* SWT.H_SCROLL | */SWT.V_SCROLL
+ | SWT_NO_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION, new SubstringPatternFilter(),
+ getViewSite().getWorkbenchWindow());
+ // Set to empty string to disable native tooltips (windows only?)
+ // bug#160897
+ // http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg29614.html
+ getViewer().getTree().setToolTipText(""); //$NON-NLS-1$
+ getSite().registerContextMenu(TasksUiInternal.ID_MENU_ACTIVE_TASK, filteredTree.getActiveTaskMenuManager(),
+ filteredTree.getActiveTaskSelectionProvider());
+
+ filteredTree.getFilterControl().addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateFilterEnablement();
+ }
+ });
+
+ getViewer().getTree().setHeaderVisible(false);
+ getViewer().setUseHashlookup(true);
+ refreshJob = new TaskListRefreshJob(getViewer(), "Task List Refresh"); //$NON-NLS-1$
+
+ configureColumns(columnNames, columnWidths);
+
+ final IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ Color categoryBackground = themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_CATEGORY);
+ taskListTableLabelProvider = new TaskTableLabelProvider(new TaskElementLabelProvider(true),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), categoryBackground);
+ getViewer().setLabelProvider(taskListTableLabelProvider);
+
+ CellEditor[] editors = new CellEditor[columnNames.length];
+ TextCellEditor textEditor = new TextCellEditor(getViewer().getTree());
+ ((Text) textEditor.getControl()).setOrientation(SWT.LEFT_TO_RIGHT);
+ editors[0] = textEditor;
+ // editors[1] = new ComboBoxCellEditor(getViewer().getTree(),
+ // editors[2] = new CheckboxCellEditor();
+
+ getViewer().setCellEditors(editors);
+ getViewer().setCellModifier(taskListCellModifier);
+
+ tableSorter = new TaskListSorter();
+ getViewer().setSorter(tableSorter);
+
+ applyPresentation(CategorizedPresentation.ID);
+
+ drillDownAdapter = new DrillDownAdapter(getViewer());
+ getViewer().setInput(getViewSite());
+
+ final int activationImageOffset = PlatformUtil.getTreeImageOffset();
+ customDrawer = new CustomTaskListDecorationDrawer(this, activationImageOffset);
+ getViewer().getTree().addListener(SWT.EraseItem, customDrawer);
+ getViewer().getTree().addListener(SWT.PaintItem, customDrawer);
+
+ getViewer().getTree().addMouseListener(new MouseListener() {
+
+ public void mouseDown(MouseEvent e) {
+ // NOTE: need e.x offset for Linux/GTK, which does not see
+ // left-aligned items in tree
+ Object selectedNode = ((Tree) e.widget).getItem(new Point(e.x + 70, e.y));
+ if (selectedNode instanceof TreeItem) {
+ Object selectedObject = ((TreeItem) selectedNode).getData();
+ if (selectedObject instanceof ITask) {
+ if (e.x > activationImageOffset && e.x < activationImageOffset + 13) {
+ taskListCellModifier.toggleTaskActivation((TreeItem) selectedNode);
+ }
+ }
+ }
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseUp(MouseEvent e) {
+ // ignore
+ }
+
+ });
+
+ // TODO make these proper commands and move code into TaskListViewCommands
+ getViewer().getTree().addKeyListener(new KeyListener() {
+
+ public void keyPressed(KeyEvent e) {
+ if (e.keyCode == SWT.F2 && e.stateMask == 0) {
+ if (actionGroup.getRenameAction().isEnabled()) {
+ actionGroup.getRenameAction().run();
+ }
+ } else if ((e.keyCode & SWT.KEYCODE_BIT) != 0) {
+ // Do nothing here since it is key code
+ } else if (e.keyCode == SWT.ESC) {
+ taskListToolTip.hide();
+ } else if (e.keyCode == 'f' && e.stateMask == SWT.MOD1) {
+ filteredTree.getFilterControl().setFocus();
+ } else if (e.stateMask == 0) {
+ if (Character.isLetter((char) e.keyCode) || Character.isDigit((char) e.keyCode)) {
+ String string = new Character((char) e.keyCode).toString();
+ filteredTree.getFilterControl().setText(string);
+ filteredTree.getFilterControl().setSelection(1, 1);
+ filteredTree.getFilterControl().setFocus();
+ }
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+
+ });
+
+ getViewer().addTreeListener(new ITreeViewerListener() {
+
+ public void treeCollapsed(final TreeExpansionEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getViewer().refresh(event.getElement());
+ }
+ });
+ }
+
+ public void treeExpanded(final TreeExpansionEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ getViewer().refresh(event.getElement());
+ }
+ });
+ }
+ });
+
+ taskListToolTip = new TaskListToolTip(getViewer().getControl());
+
+ // update tooltip contents
+ getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ updateToolTip(true);
+ }
+ });
+
+ getViewer().getTree().addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ taskListToolTip.hide();
+ }
+ });
+
+ makeActions();
+ hookGlobalActions();
+ hookContextMenu();
+ hookOpenAction();
+ contributeToActionBars();
+ initHandlers();
+
+ configureGradientColors();
+
+ initDragAndDrop(parent);
+ expandToActiveTasks();
+ restoreState();
+
+ updateDescription();
+
+ IContextService contextSupport = (IContextService) getSite().getService(IContextService.class);
+ if (contextSupport != null) {
+ contextSupport.activateContext(ITasksUiConstants.ID_VIEW_TASKS);
+ }
+
+ getSite().setSelectionProvider(getViewer());
+ getSite().getPage().addPartListener(editorListener);
+
+ // we need to update the icon here as the action was not created when the presentation was applied
+ updatePresentationSelectorImage();
+
+ PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(this);
+ TasksUiPlugin.getTaskActivityManager().addActivityListener(TASK_ACTIVITY_LISTENER);
+ TasksUiPlugin.getTaskActivityManager().addActivationListener(TASK_ACTIVATION_LISTENER);
+ TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER);
+
+ // 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);
+ }
+
+ private void initHandlers() {
+ IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+ handlerService.activateHandler(CollapseAllHandler.ID_COMMAND, new CollapseAllHandler(getViewer()));
+ }
+
+ private void hookGlobalActions() {
+ IActionBars bars = getViewSite().getActionBars();
+ bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), actionGroup.getDeleteAction());
+ bars.setGlobalActionHandler(ActionFactory.COPY.getId(), actionGroup.getCopyDetailsAction());
+ }
+
+ private void applyPresentation(String id) {
+ if (id != null) {
+ for (AbstractTaskListPresentation presentation : presentationsPrimary) {
+ if (id.equals(presentation.getId())) {
+ applyPresentation(presentation);
+ return;
+ }
+ }
+ for (AbstractTaskListPresentation presentation : presentationsSecondary) {
+ if (id.equals(presentation.getId())) {
+ applyPresentation(presentation);
+ return;
+ }
+ }
+ }
+ }
+
+ public void applyPresentation(AbstractTaskListPresentation presentation) {
+ try {
+ getViewer().getControl().setRedraw(false);
+ if (!filteredTree.getFilterString().equals("")) { //$NON-NLS-1$
+ filteredTree.getFilterControl().setText(""); //$NON-NLS-1$
+ }
+ AbstractTaskListContentProvider contentProvider = presentation.getContentProvider(this);
+ getViewer().setContentProvider(contentProvider);
+ refresh(true);
+
+ currentPresentation = presentation;
+ updatePresentationSelectorImage();
+ } finally {
+ getViewer().getControl().setRedraw(true);
+ }
+ }
+
+ private void updatePresentationSelectorImage() {
+ if (presentationDropDownSelectionAction != null && currentPresentation != null) {
+ presentationDropDownSelectionAction.setImageDescriptor(currentPresentation.getImageDescriptor());
+ }
+ }
+
+ public AbstractTaskListPresentation getCurrentPresentation() {
+ return currentPresentation;
+ }
+
+ private void configureColumns(final String[] columnNames, final int[] columnWidths) {
+ TreeColumnLayout layout = (TreeColumnLayout) getViewer().getTree().getParent().getLayout();
+ getViewer().setColumnProperties(columnNames);
+ columns = new TreeColumn[columnNames.length];
+ for (int i = 0; i < columnNames.length; i++) {
+ columns[i] = new TreeColumn(getViewer().getTree(), 0);
+ columns[i].setText(columnNames[i]);
+
+ if (i == 0) {
+ layout.setColumnData(columns[i], new ColumnWeightData(100));
+ } else {
+ layout.setColumnData(columns[i], new ColumnPixelData(columnWidths[i]));
+ }
+
+ columns[i].addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ SortCriterion criterion = tableSorter.getComparator().getSortCriterion(0);
+ criterion.setDirection(criterion.getDirection() * -1);
+ getViewer().refresh(false);
+ }
+ });
+ columns[i].addControlListener(new ControlListener() {
+ public void controlResized(ControlEvent e) {
+ for (int j = 0; j < columnWidths.length; j++) {
+ if (columns[j].equals(e.getSource())) {
+ columnWidths[j] = columns[j].getWidth();
+ }
+ }
+ }
+
+ public void controlMoved(ControlEvent e) {
+ // don't care if the control is moved
+ }
+ });
+ }
+ }
+
+ /**
+ * Tracks editor activation and jump to corresponding task, if applicable
+ */
+ private final IPartListener editorListener = new IPartListener() {
+
+ private void jumpToEditor(IWorkbenchPart part) {
+ if (!linkWithEditor || !(part instanceof IEditorPart)) {
+ return;
+ }
+ jumpToEditorTask((IEditorPart) part);
+ }
+
+ public void partActivated(IWorkbenchPart part) {
+ if (part == TaskListView.this) {
+ updateDescription();
+ } else {
+ jumpToEditor(part);
+ }
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part) {
+ }
+
+ public void partClosed(IWorkbenchPart part) {
+ }
+
+ public void partDeactivated(IWorkbenchPart part) {
+ if (part == TaskListView.this) {
+ IViewReference reference = getSite().getPage().findViewReference(ITasksUiConstants.ID_VIEW_TASKS);
+ if (reference != null && reference.isFastView()) {
+ updateDescription();
+ }
+ taskListToolTip.hide();
+ }
+ }
+
+ public void partOpened(IWorkbenchPart part) {
+ }
+ };
+
+ private void initDragAndDrop(Composite parent) {
+ Transfer[] dragTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() };
+ Transfer[] dropTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance(),
+ TextTransfer.getInstance(), RTFTransfer.getInstance(), PlatformUtil.getUrlTransfer() };
+
+ getViewer().addDragSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK, dragTypes,
+ new TaskDragSourceListener(getViewer()));
+ getViewer().addDropSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK | DND.DROP_DEFAULT, dropTypes,
+ new TaskListDropAdapter(getViewer()));
+ }
+
+ void expandToActiveTasks() {
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ITask task = TasksUi.getTaskActivityManager().getActiveTask();
+ if (task != null) {
+ getViewer().expandToLevel(task, 0);
+ }
+ }
+ });
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ actionGroup.fillContextMenu(manager);
+ }
+ });
+ Menu menu = menuManager.createContextMenu(getViewer().getControl());
+ getViewer().getControl().setMenu(menu);
+ getSite().registerContextMenu(menuManager, getViewer());
+ }
+
+ private void contributeToActionBars() {
+ IActionBars bars = getViewSite().getActionBars();
+ fillLocalPullDown(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillLocalPullDown(IMenuManager manager) {
+ updateDrillDownActions();
+ manager.add(actionGroup.getGoUpAction());
+ manager.add(collapseAll);
+ manager.add(expandAll);
+ manager.add(new Separator(ID_SEPARATOR_FILTERS));
+ manager.add(sortDialogAction);
+ manager.add(filterOnPriorityAction);
+ manager.add(filterCompleteTask);
+ manager.add(filterSubTasksAction);
+
+ manager.add(new Separator(ID_SEPARATOR_TASKS));
+ manager.add(synchronizeAutomatically);
+
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+
+ manager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ filterOnPriorityAction.updateCheckedState();
+ }
+ });
+
+ manager.add(linkWithEditorAction);
+ manager.add(new Separator());
+ manager.add(openPreferencesAction);
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ manager.add(newTaskAction);
+ manager.add(presentationDropDownSelectionAction);
+ manager.add(new Separator());
+ manager.add(filterCompleteTask);
+ manager.add(collapseAll);
+ manager.add(new GroupMarker(ID_SEPARATOR_CONTEXT));
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ public List<IRepositoryElement> getSelectedTaskContainers() {
+ List<IRepositoryElement> selectedElements = new ArrayList<IRepositoryElement>();
+ for (Iterator<?> i = ((IStructuredSelection) getViewer().getSelection()).iterator(); i.hasNext();) {
+ Object object = i.next();
+ if (object instanceof ITaskContainer) {
+ selectedElements.add((IRepositoryElement) object);
+ }
+ }
+ return selectedElements;
+ }
+
+ private void makeActions() {
+ actionGroup = new TaskListViewActionGroup(this, drillDownAdapter);
+ actionGroup.getOpenAction().setViewer(getViewer());
+
+ collapseAll = new CollapseAllAction(this);
+ expandAll = new ExpandAllAction(this);
+ filterCompleteTask = new FilterCompletedTasksAction(this);
+ filterSubTasksAction = new GroupSubTasksAction(this);
+ synchronizeAutomatically = new SynchronizeAutomaticallyAction();
+ openPreferencesAction = new OpenTasksUiPreferencesAction();
+ //filterArchiveCategory = new FilterArchiveContainerAction(this);
+ sortDialogAction = new TaskListSortAction(getSite(), this);
+ filterOnPriorityAction = new PriorityDropDownAction(this);
+ linkWithEditorAction = new LinkWithEditorAction(this);
+ newTaskAction = new NewTaskAction();
+ filteredTree.getViewer().addSelectionChangedListener(newTaskAction);
+ }
+
+ private void hookOpenAction() {
+ getViewer().addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ actionGroup.getOpenAction().run();
+ }
+ });
+
+ getViewer().addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ if (TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.ACTIVATE_WHEN_OPENED)) {
+ AbstractTask selectedTask = TaskListView.getFromActivePerspective().getSelectedTask();
+ if (selectedTask != null) {
+ actionGroup.getActivateAction().run(selectedTask);
+ }
+ }
+ }
+ });
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ @Override
+ public void setFocus() {
+ filteredTree.getViewer().getControl().setFocus();
+ }
+
+ public void refresh(boolean expandIfFocused) {
+ if (expandIfFocused && isFocusedMode() && isAutoExpandMode()) {
+ try {
+ getViewer().getControl().setRedraw(false);
+ refreshJob.refreshNow();
+ getViewer().expandAll();
+ } finally {
+ getViewer().getControl().setRedraw(true);
+ }
+ } else {
+ refreshJob.refreshNow();
+ }
+ }
+
+ public void refresh() {
+ refreshJob.refreshNow();
+ }
+
+ public TaskListToolTip getToolTip() {
+ return taskListToolTip;
+ }
+
+ public TreeViewer getViewer() {
+ return filteredTree.getViewer();
+ }
+
+ public TaskCompletionFilter getCompleteFilter() {
+ return filterComplete;
+ }
+
+ public TaskPriorityFilter getPriorityFilter() {
+ return filterPriority;
+ }
+
+ public void addFilter(AbstractTaskListFilter filter) {
+ if (!filters.contains(filter)) {
+ filters.add(filter);
+ }
+ }
+
+ public void clearFilters() {
+ filters.clear();
+ filters.add(filterArchive);
+ filters.add(filterWorkingSet);
+ }
+
+ public void removeFilter(AbstractTaskListFilter filter) {
+ filters.remove(filter);
+ }
+
+ public void updateDrillDownActions() {
+ actionGroup.updateDrillDownActions();
+ }
+
+ boolean isInRenameAction = false;
+
+ private DelayedRefreshJob refreshJob;
+
+ private boolean itemNotFoundExceptionLogged;
+
+ public void setInRenameAction(boolean b) {
+ isInRenameAction = b;
+ }
+
+ public void goIntoCategory() {
+ ISelection selection = getViewer().getSelection();
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof ITaskContainer) {
+ drilledIntoCategory = (AbstractTaskContainer) element;
+ drillDownAdapter.goInto();
+ IActionBars bars = getViewSite().getActionBars();
+ bars.getToolBarManager().remove(actionGroup.getGoUpAction().getId());
+ bars.getToolBarManager().add(actionGroup.getGoUpAction());
+ bars.updateActionBars();
+ updateDrillDownActions();
+ }
+ }
+ }
+
+ public void goUpToRoot() {
+ drilledIntoCategory = null;
+ drillDownAdapter.goBack();
+ IActionBars bars = getViewSite().getActionBars();
+ bars.getToolBarManager().remove(GoUpAction.ID);
+ bars.updateActionBars();
+ updateDrillDownActions();
+ }
+
+ public AbstractTask getSelectedTask() {
+ ISelection selection = getViewer().getSelection();
+ if (selection.isEmpty()) {
+ return null;
+ }
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof ITask) {
+ return (AbstractTask) structuredSelection.getFirstElement();
+ }
+ }
+ return null;
+ }
+
+ public static AbstractTask getSelectedTask(ISelection selection) {
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ if (structuredSelection.size() != 1) {
+ return null;
+ }
+ Object element = structuredSelection.getFirstElement();
+ if (element instanceof ITask) {
+ return (AbstractTask) structuredSelection.getFirstElement();
+ }
+ }
+ return null;
+ }
+
+ public void indicatePaused(boolean paused) {
+ isPaused = paused;
+ IStatusLineManager statusLineManager = getViewSite().getActionBars().getStatusLineManager();
+ if (isPaused) {
+ statusLineManager.setMessage(CommonImages.getImage(TasksUiImages.TASKS_VIEW),
+ Messages.TaskListView_Mylyn_context_capture_paused);
+ setPartName(Messages.TaskListView__paused_ + LABEL_VIEW);
+ } else {
+ statusLineManager.setMessage(""); //$NON-NLS-1$
+ setPartName(LABEL_VIEW);
+ }
+ }
+
+ public AbstractTaskContainer getDrilledIntoCategory() {
+ return drilledIntoCategory;
+ }
+
+ public TaskListFilteredTree getFilteredTree() {
+ return filteredTree;
+ }
+
+ public void selectedAndFocusTask(ITask task) {
+ if (task == null || getViewer().getControl().isDisposed()) {
+ return;
+ }
+ saveSelection();
+
+ IStructuredSelection selection = restoreSelection(task);
+ try {
+ getViewer().setSelection(selection, true);
+ } catch (SWTError e) {
+ if (!itemNotFoundExceptionLogged) {
+ itemNotFoundExceptionLogged = true;
+ // It's probably not worth displaying this to the user since the item
+ // is not there in this case, so consider removing.
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Could not link Task List with editor", //$NON-NLS-1$
+ e));
+ }
+ }
+ }
+
+ private void saveSelection() {
+ IStructuredSelection selection = (IStructuredSelection) getViewer().getSelection();
+ if (!selection.isEmpty()) {
+ if (selection.getFirstElement() instanceof ITaskContainer) {
+ // make sure the new selection is inserted at the end of the
+ // list
+ String handle = ((IRepositoryElement) selection.getFirstElement()).getHandleIdentifier();
+ lastSelectionByTaskHandle.remove(handle);
+ lastSelectionByTaskHandle.put(handle, selection);
+
+ if (lastSelectionByTaskHandle.size() > SIZE_MAX_SELECTION_HISTORY) {
+ Iterator<String> it = lastSelectionByTaskHandle.keySet().iterator();
+ it.next();
+ it.remove();
+ }
+ }
+ }
+ }
+
+ private IStructuredSelection restoreSelection(IRepositoryElement task) {
+ IStructuredSelection selection = lastSelectionByTaskHandle.get(task.getHandleIdentifier());
+ if (selection != null) {
+ return selection;
+ } else {
+ return new StructuredSelection(task);
+ }
+ }
+
+ public Image[] getPirorityImages() {
+ Image[] images = new Image[PriorityLevel.values().length];
+ for (int i = 0; i < PriorityLevel.values().length; i++) {
+ images[i] = TasksUiImages.getImageForPriority(PriorityLevel.values()[i]);
+ }
+ return images;
+ }
+
+ public Set<AbstractTaskListFilter> getFilters() {
+ return filters;
+ }
+
+ public static String getCurrentPriorityLevel() {
+ if (TasksUiPlugin.getDefault().getPreferenceStore().contains(ITasksUiPreferenceConstants.FILTER_PRIORITY)) {
+ return TasksUiPlugin.getDefault().getPreferenceStore().getString(
+ ITasksUiPreferenceConstants.FILTER_PRIORITY);
+ } else {
+ return PriorityLevel.P5.toString();
+ }
+ }
+
+ public TaskArchiveFilter getArchiveFilter() {
+ return filterArchive;
+ }
+
+ private void updateFilterEnablement() {
+ boolean enabled = !isFocusedMode();
+ if (enabled) {
+ String filterText = filteredTree.getFilterString();
+ if (filterText != null && filterText.length() > 0) {
+ enabled = false;
+ }
+ }
+ sortDialogAction.setEnabled(enabled);
+ filterOnPriorityAction.setEnabled(enabled);
+ filterCompleteTask.setEnabled(enabled);
+ //filterArchiveCategory.setEnabled(enabled);
+ }
+
+ public boolean isScheduledPresentation() {
+ return currentPresentation != null && ScheduledPresentation.ID.equals(currentPresentation.getId());
+ }
+
+ public boolean isFocusedMode() {
+ return focusedMode;
+ }
+
+ private boolean isAutoExpandMode() {
+ return TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.AUTO_EXPAND_TASK_LIST);
+ }
+
+ public void setFocusedMode(boolean focusedMode) {
+ if (this.focusedMode == focusedMode) {
+ return;
+ }
+ this.focusedMode = focusedMode;
+ IToolBarManager manager = getViewSite().getActionBars().getToolBarManager();
+
+ if (focusedMode && isAutoExpandMode()) {
+ manager.remove(FilterCompletedTasksAction.ID);
+ manager.remove(CollapseAllAction.ID);
+ } else if (manager.find(CollapseAllAction.ID) == null) {
+ manager.prependToGroup(ID_SEPARATOR_CONTEXT, collapseAll);
+ manager.prependToGroup(ID_SEPARATOR_CONTEXT, filterCompleteTask);
+ }
+ manager.update(false);
+ updateFilterEnablement();
+ }
+
+ public void setSynchronizationOverlaid(boolean synchronizationOverlaid) {
+ this.synchronizationOverlaid = synchronizationOverlaid;
+ getViewer().refresh();
+ }
+
+ public void displayPrioritiesAbove(String priority) {
+ filterPriority.displayPrioritiesAbove(priority);
+ getViewer().refresh();
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getProperty();
+ if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE.equals(property)
+ || IWorkingSetManager.CHANGE_WORKING_SET_REMOVE.equals(property)) {
+ if (getSite() != null && getSite().getPage() != null) {
+ if (filterWorkingSet.updateWorkingSet(getSite().getPage().getAggregateWorkingSet())) {
+ try {
+ getViewer().getControl().setRedraw(false);
+
+ if (drilledIntoCategory != null) {
+ goUpToRoot();
+ }
+
+ getViewer().refresh();
+ if (isFocusedMode() && isAutoExpandMode()) {
+ getViewer().expandAll();
+ }
+ } finally {
+ getViewer().getControl().setRedraw(true);
+ }
+ }
+ }
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ filteredTree.indicateActiveTaskWorkingSet();
+ }
+ });
+ }
+ }
+
+ public void setLinkWithEditor(boolean linkWithEditor) {
+ this.linkWithEditor = linkWithEditor;
+ linkWithEditorAction.setChecked(linkWithEditor);
+ if (linkWithEditor) {
+ IEditorPart activeEditor = getSite().getPage().getActiveEditor();
+ if (activeEditor != null) {
+ jumpToEditorTask(activeEditor);
+ }
+ }
+ }
+
+ private void jumpToEditorTask(IEditorPart editor) {
+ IEditorInput input = editor.getEditorInput();
+ if (input instanceof TaskEditorInput) {
+ ITask task = ((TaskEditorInput) input).getTask();
+ ITask selected = getSelectedTask();
+ if (selected == null || !selected.equals(task)) {
+ selectedAndFocusTask(task);
+ }
+ }
+ }
+
+ private void updateToolTip(boolean force) {
+ if (taskListToolTip != null && taskListToolTip.isVisible()) {
+ if (!force && taskListToolTip.isTriggeredByMouse()) {
+ return;
+ }
+
+ TreeItem[] selection = getViewer().getTree().getSelection();
+ if (selection != null && selection.length > 0) {
+ Rectangle bounds = selection[0].getBounds();
+ taskListToolTip.show(new Point(bounds.x + 1, bounds.y + 1));
+ }
+ }
+ }
+
+ /**
+ * This can be used for experimentally adding additional presentations, but note that this convention is extremely
+ * likely to change in the Mylyn 3.0 cycle.
+ */
+ public static List<AbstractTaskListPresentation> getPresentations() {
+ List<AbstractTaskListPresentation> presentations = new ArrayList<AbstractTaskListPresentation>();
+ presentations.addAll(presentationsPrimary);
+ presentations.addAll(presentationsSecondary);
+ return presentations;
+ }
+
+ public static void addPresentation(AbstractTaskListPresentation presentation) {
+ if (presentation.isPrimary()) {
+ presentationsPrimary.add(presentation);
+ } else {
+ presentationsSecondary.add(presentation);
+ }
+ }
+
+ public TaskListSorter getSorter() {
+ return tableSorter;
+ }
+
+ public boolean show(ShowInContext context) {
+ ISelection selection = context.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ getViewer().setSelection(selection, true);
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesSorter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesSorter.java
new file mode 100644
index 0000000..1c2482a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesSorter.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoriesSorter extends ViewerSorter {
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof TaskRepository && e2 instanceof TaskRepository) {
+ TaskRepository t1 = (TaskRepository) e1;
+ TaskRepository t2 = (TaskRepository) e2;
+
+ String label1 = t1.getProperty(IRepositoryConstants.PROPERTY_LABEL);
+ String label2 = t2.getProperty(IRepositoryConstants.PROPERTY_LABEL);
+
+ if (LocalRepositoryConnector.REPOSITORY_LABEL.equals(label1)) {
+ return -1;
+ } else if (LocalRepositoryConnector.REPOSITORY_LABEL.equals(label2)) {
+ return 1;
+ }
+
+ if (!t1.getConnectorKind().equals(t2.getConnectorKind())) {
+ return (t1.getConnectorKind()).compareTo(t2.getConnectorKind());
+ } else {
+ if ((label1 == null || label1.equals("")) && label2 != null) { //$NON-NLS-1$
+ return 1;
+ } else if (label1 != null && (label2 == null || label2.equals(""))) { //$NON-NLS-1$
+ return -1;
+ } else if (label1 != null && label2 != null) {
+ return label1.compareTo(label2);
+ } else {
+ return (t1.getRepositoryUrl()).compareTo(t2.getRepositoryUrl());
+ }
+ }
+ } else {
+ return super.compare(viewer, e1, e2);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java
new file mode 100644
index 0000000..a74cf4a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoriesView.java
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryModelListener;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryAdapter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskRepositoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.DisconnectRepositoryAction;
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoriesView extends ViewPart {
+
+ /**
+ * @deprecated Use {@link ITasksUiConstants#ID_VIEW_REPOSITORIES} instead
+ */
+ @Deprecated
+ public static final String ID = ITasksUiConstants.ID_VIEW_REPOSITORIES;
+
+ private TableViewer viewer;
+
+ private final Action addRepositoryAction = new AddRepositoryAction();
+
+ private BaseSelectionListenerAction deleteRepositoryAction;
+
+ private BaseSelectionListenerAction resetConfigurationAction;
+
+ private DisconnectRepositoryAction offlineAction;
+
+ private void asyncExec(Runnable runnable) {
+ if (Display.getCurrent() != null) {
+ runnable.run();
+ } else {
+ Display.getDefault().asyncExec(runnable);
+ }
+ }
+
+ private final IRepositoryModelListener MODEL_LISTENER = new IRepositoryModelListener() {
+
+ public void loaded() {
+ asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+ };
+
+ private final IRepositoryListener REPOSITORY_LISTENER = new TaskRepositoryAdapter() {
+
+ @Override
+ public void repositoryAdded(TaskRepository repository) {
+ asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+
+ @Override
+ public void repositoryRemoved(TaskRepository repository) {
+ asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+
+ @Override
+ public void repositorySettingsChanged(TaskRepository repository) {
+ asyncExec(new Runnable() {
+ public void run() {
+ refresh();
+ }
+ });
+ }
+ };
+
+ static class ViewContentProvider implements IStructuredContentProvider {
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ return TasksUi.getRepositoryManager().getAllRepositories().toArray();
+ }
+ }
+
+ public TaskRepositoriesView() {
+ TasksUi.getRepositoryManager().addListener(REPOSITORY_LISTENER);
+ TasksUiPlugin.getDefault().addModelListener(MODEL_LISTENER);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ TasksUiPlugin.getRepositoryManager().removeListener(REPOSITORY_LISTENER);
+ TasksUiPlugin.getDefault().removeModelListener(MODEL_LISTENER);
+ }
+
+ public static TaskRepositoriesView getFromActivePerspective() {
+ if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (activePage == null) {
+ return null;
+ }
+ IViewPart view = activePage.findView(ITasksUiConstants.ID_VIEW_REPOSITORIES);
+ if (view instanceof TaskRepositoriesView) {
+ return (TaskRepositoriesView) view;
+ }
+ }
+ return null;
+ }
+
+ public static TaskRepositoriesView openInActivePerspective() {
+ try {
+ return (TaskRepositoriesView) PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .showView(ITasksUiConstants.ID_VIEW_REPOSITORIES);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
+ viewer.setContentProvider(new ViewContentProvider());
+ viewer.setUseHashlookup(true);
+ viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
+
+ viewer.setSorter(new TaskRepositoriesSorter());
+
+// new ViewerSorter() {
+//
+// @Override
+// public int compare(Viewer viewer, Object e1, Object e2) {
+// if (e1 instanceof TaskRepository && e2 instanceof TaskRepository) {
+// TaskRepository t1 = (TaskRepository) e1;
+// TaskRepository t2 = (TaskRepository) e2;
+// return (t1.getKind() + t1.getUrl()).compareTo(t2.getKind() + t2.getUrl());
+// } else {
+// return super.compare(viewer, e1, e2);
+// }
+// }
+// });
+ viewer.setInput(getViewSite());
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ IHandlerService service = (IHandlerService) getSite().getService(IHandlerService.class);
+ if (service != null) {
+ try {
+ service.executeCommand(IWorkbenchActionDefinitionIds.PROPERTIES, null);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Opening repository properties failed", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ });
+
+ // FIXME remove listener when view is disposed
+ TasksUi.getRepositoryManager().addListener(new TaskRepositoryListener());
+
+ makeActions();
+ hookContextMenu();
+ hookGlobalActions();
+ contributeToActionBars();
+ getSite().setSelectionProvider(getViewer());
+ }
+
+ private void hookGlobalActions() {
+ IActionBars bars = getViewSite().getActionBars();
+ bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteRepositoryAction);
+ bars.setGlobalActionHandler(ActionFactory.REFRESH.getId(), resetConfigurationAction);
+ }
+
+ private void makeActions() {
+ deleteRepositoryAction = new DeleteTaskRepositoryAction();
+ viewer.addSelectionChangedListener(deleteRepositoryAction);
+
+ resetConfigurationAction = new UpdateRepositoryConfigurationAction();
+ resetConfigurationAction.setActionDefinitionId("org.eclipse.ui.file.refresh"); //$NON-NLS-1$
+ viewer.addSelectionChangedListener(resetConfigurationAction);
+
+ offlineAction = new DisconnectRepositoryAction();
+ viewer.addSelectionChangedListener(offlineAction);
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ TaskRepositoriesView.this.fillContextMenu(manager);
+ }
+ });
+ Menu menu = menuMgr.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(menuMgr, viewer);
+ }
+
+ private void contributeToActionBars() {
+ IActionBars bars = getViewSite().getActionBars();
+ fillLocalPullDown(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillLocalPullDown(IMenuManager manager) {
+ manager.add(addRepositoryAction);
+ }
+
+ private void fillContextMenu(IMenuManager manager) {
+ manager.add(new Separator("new")); //$NON-NLS-1$
+ manager.add(addRepositoryAction);
+ manager.add(new Separator("edit")); //$NON-NLS-1$
+ manager.add(deleteRepositoryAction);
+ manager.add(resetConfigurationAction);
+ manager.add(new Separator("operations")); //$NON-NLS-1$
+ manager.add(offlineAction);
+ manager.add(new Separator("repository")); //$NON-NLS-1$
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ manager.add(new Separator());
+ manager.add(new Separator("properties")); //$NON-NLS-1$
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ manager.add(addRepositoryAction);
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ @Override
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ public void refresh() {
+ if (viewer != null && !viewer.getControl().isDisposed()) {
+ viewer.refresh();
+ }
+ }
+
+ public TableViewer getViewer() {
+ return viewer;
+ }
+
+ public class TaskRepositoryListener extends TaskRepositoryAdapter {
+
+ @Override
+ public void repositorySettingsChanged(TaskRepository repository) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (!getViewer().getControl().isDisposed()) {
+ getViewer().refresh(true);
+ }
+ }
+ });
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java
new file mode 100644
index 0000000..916a5c4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskRepositoryLabelProvider.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.DisconnectRepositoryAction;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoryLabelProvider implements ILabelProvider {
+
+//extends LabelProvider implements ITableLabelProvider {
+
+ public Image getColumnImage(Object obj, int index) {
+ if (index == 0) {
+ return getImage(obj);
+ } else {
+ return null;
+ }
+ }
+
+ public Image getImage(Object object) {
+ if (object instanceof AbstractRepositoryConnector) {
+ AbstractRepositoryConnector repositoryConnector = (AbstractRepositoryConnector) object;
+ Image image = TasksUiPlugin.getDefault().getBrandingIcon(repositoryConnector.getConnectorKind());
+ if (image != null) {
+ return image;
+ } else {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY);
+ }
+ } else if (object instanceof TaskRepository) {
+ if (((TaskRepository) object).isOffline()) {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY_OFFLINE);
+ } else {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY);
+ }
+ }
+ return null;
+ }
+
+ public String getText(Object object) {
+
+ if (object instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) object;
+ StringBuilder label = new StringBuilder();
+ label.append(repository.getRepositoryLabel());
+ if (repository.isOffline()) {
+ label.append(" [" + DisconnectRepositoryAction.LABEL + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return label.toString();
+ } else if (object instanceof AbstractRepositoryConnector) {
+ return ((AbstractRepositoryConnector) object).getLabel();
+ } else {
+ return null;
+ }
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ // ignore
+
+ }
+
+ public void dispose() {
+ // ignore
+
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ // ignore
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // ignore
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskScheduleContentProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskScheduleContentProvider.java
new file mode 100644
index 0000000..e0cfdc2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskScheduleContentProvider.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskActivityListener;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Used by Scheduled task list presentation
+ *
+ * @author Rob Elves
+ */
+public class TaskScheduleContentProvider extends TaskListContentProvider implements ITaskActivityListener {
+
+ private final TaskActivityManager taskActivityManager;
+
+ private final Unscheduled unscheduled;
+
+ private final Calendar END_OF_TIME;
+
+ private Job rolloverJob;
+
+ public TaskScheduleContentProvider(TaskListView taskListView) {
+ super(taskListView);
+ this.taskActivityManager = TasksUiPlugin.getTaskActivityManager();
+ taskActivityManager.addActivityListener(this);
+ END_OF_TIME = TaskActivityUtil.getCalendar();
+ END_OF_TIME.add(Calendar.YEAR, 5000);
+ END_OF_TIME.getTime();
+ unscheduled = new Unscheduled(taskActivityManager, new DateRange(END_OF_TIME));
+ }
+
+ @Override
+ public Object[] getElements(Object parent) {
+
+ if (parent != null && parent.equals(this.taskListView.getViewSite())) {
+
+ Set<AbstractTaskContainer> containers = new HashSet<AbstractTaskContainer>();
+
+ WeekDateRange week = TaskActivityUtil.getCurrentWeek();
+ WeekDateRange nextWeek = TaskActivityUtil.getNextWeek();
+
+ synchronized (this) {
+ if (rolloverJob != null) {
+ rolloverJob.cancel();
+ rolloverJob = null;
+ }
+
+ long delay = week.getToday().getEndDate().getTime().getTime() - new Date().getTime();
+ rolloverJob = new RolloverCheck();
+ rolloverJob.setSystem(true);
+ rolloverJob.setPriority(Job.SHORT);
+ rolloverJob.schedule(delay);
+ }
+
+ for (DateRange day : week.getRemainingDays()) {
+ containers.add(new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(), day));
+ }
+ containers.add(new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(), week));
+
+ for (DateRange day : nextWeek.getDaysOfWeek()) {
+ containers.add(new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(), day));
+ }
+
+ ScheduledTaskContainer nextWeekContainer = new ScheduledTaskContainer(taskActivityManager, nextWeek);
+ containers.add(nextWeekContainer);
+
+ ScheduledTaskContainer twoWeeksContainer = new ScheduledTaskContainer(taskActivityManager, week.next()
+ .next(), Messages.TaskScheduleContentProvider_Two_Weeks);
+ containers.add(twoWeeksContainer);
+
+ containers.add(unscheduled);
+ Calendar startDate = TaskActivityUtil.getCalendar();
+ startDate.setTimeInMillis(twoWeeksContainer.getEnd().getTimeInMillis());
+ TaskActivityUtil.snapNextDay(startDate);
+ Calendar endDate = TaskActivityUtil.getCalendar();
+ endDate.add(Calendar.YEAR, 4999);
+ DateRange future = new DateRange(startDate, endDate);
+
+ ScheduledTaskContainer futureContainer = new ScheduledTaskContainer(taskActivityManager, future,
+ Messages.TaskScheduleContentProvider_Future);
+ containers.add(futureContainer);
+
+ return applyFilter(containers).toArray();
+
+ } else {
+ return getChildren(parent);
+ }
+ }
+
+ @Override
+ public Object getParent(Object child) {
+// for (Object o : getElements(null)) {
+// ScheduledTaskContainer container = ((ScheduledTaskContainer) o);
+// if (container.getChildren().contains(((ITask) child).getHandleIdentifier())) {
+// return container;
+// }
+// }
+ return null;
+ }
+
+ @Override
+ public boolean hasChildren(Object parent) {
+ return getChildren(parent).length > 0;
+ }
+
+ @Override
+ public Object[] getChildren(Object parent) {
+ Set<ITask> result = new HashSet<ITask>();
+ if (parent instanceof ITask) {
+ // flat presentation (no subtasks revealed in Scheduled mode)
+ } else if (parent instanceof ScheduledTaskContainer) {
+ for (ITask child : ((ScheduledTaskContainer) parent).getChildren()) {
+ if (!filter(parent, child)) {
+ result.add(child);
+ }
+ }
+
+ } else if (parent instanceof ITaskContainer) {
+ for (ITask child : ((ITaskContainer) parent).getChildren()) {
+ result.add(child);
+ }
+ }
+ return result.toArray();
+ }
+
+ private void refresh() {
+ if (Platform.isRunning() && PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().isClosing()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ taskListView.refresh();
+ }
+ });
+ }
+ }
+
+ @Override
+ public void dispose() {
+ synchronized (this) {
+ if (rolloverJob != null) {
+ rolloverJob.cancel();
+ }
+ }
+ taskActivityManager.removeActivityListener(this);
+ super.dispose();
+ }
+
+ public void activityReset() {
+ refresh();
+ }
+
+ public void elapsedTimeUpdated(ITask task, long newElapsedTime) {
+ // ignore
+ }
+
+ public class Unscheduled extends ScheduledTaskContainer {
+
+ private final TaskActivityManager activityManager;
+
+ public Unscheduled(TaskActivityManager activityManager, DateRange range) {
+ super(activityManager, range, Messages.TaskScheduleContentProvider_Unscheduled);
+ this.activityManager = activityManager;
+ }
+
+ @Override
+ public Collection<ITask> getChildren() {
+ Set<ITask> all = new HashSet<ITask>();
+ for (ITask task : activityManager.getUnscheduled()) {
+ if (!task.isCompleted() || (task.isCompleted() && !task.getSynchronizationState().isSynchronized())) {
+ all.add(task);
+ }
+ }
+ return all;
+ }
+ }
+
+ private class RolloverCheck extends Job {
+
+ public RolloverCheck() {
+ super("Calendar Rollover Job"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ refresh();
+ return Status.OK_STATUS;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskTableLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskTableLabelProvider.java
new file mode 100644
index 0000000..0b9629a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/TaskTableLabelProvider.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ILabelDecorator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITableColorProvider;
+import org.eclipse.jface.viewers.ITableFontProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskTableLabelProvider extends DecoratingLabelProvider implements ITableLabelProvider,
+ ITableColorProvider, ITableFontProvider {
+
+ private Color categoryBackgroundColor;
+
+ /**
+ * @param view
+ * can be null
+ */
+ public TaskTableLabelProvider(ILabelProvider provider, ILabelDecorator decorator, Color parentBackground) {
+ super(provider, decorator);
+ this.categoryBackgroundColor = parentBackground;
+ }
+
+ public String getColumnText(Object obj, int columnIndex) {
+ if (obj instanceof ITaskContainer) {
+ switch (columnIndex) {
+ case 0:
+// if (obj instanceof ScheduledTaskContainer) {
+// if (((ScheduledTaskContainer) obj).isToday()) {
+// return super.getText(obj) + " - Today";
+// }
+// }
+ return super.getText(obj);
+ case 1:
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (!(element instanceof ITaskContainer)) {
+ return null;
+ }
+ if (columnIndex == 0) {
+ return super.getImage(element);
+ }
+ return null;
+ }
+
+ public Font getFont(Object element, int columnIndex) {
+ return super.getFont(element);
+ }
+
+ public Color getForeground(Object element, int columnIndex) {
+ return super.getForeground(element);
+ }
+
+ public Color getBackground(Object element, int columnIndex) {
+ if (element instanceof ITaskContainer && !(element instanceof ITask)) {
+ return categoryBackgroundColor;
+ } else if (element instanceof IRepositoryQuery) {
+ return categoryBackgroundColor;
+ }
+
+ return super.getBackground(element);
+ }
+
+ public void setCategoryBackgroundColor(Color parentBackgroundColor) {
+ this.categoryBackgroundColor = parentBackgroundColor;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/UpdateRepositoryConfigurationAction.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/UpdateRepositoryConfigurationAction.java
new file mode 100644
index 0000000..dde26d8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/UpdateRepositoryConfigurationAction.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import java.text.MessageFormat;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskRepositoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class UpdateRepositoryConfigurationAction extends AbstractTaskRepositoryAction {
+
+ private static final String ID = "org.eclipse.mylyn.tasklist.repositories.reset"; //$NON-NLS-1$
+
+ public UpdateRepositoryConfigurationAction() {
+ super(Messages.UpdateRepositoryConfigurationAction_Update_Repository_Configuration);
+ setId(ID);
+ setEnabled(false);
+ }
+
+ @Override
+ public void run() {
+ try {
+ IStructuredSelection selection = getStructuredSelection();
+ for (Iterator<?> iter = selection.iterator(); iter.hasNext();) {
+ final TaskRepository repository = getTaskRepository(iter.next());
+ if (repository != null) {
+ final AbstractRepositoryConnector connector = TasksUi.getRepositoryManager()
+ .getRepositoryConnector(repository.getConnectorKind());
+ if (connector != null) {
+ final String jobName = MessageFormat.format(
+ Messages.UpdateRepositoryConfigurationAction_Updating_repository_configuration_for_X,
+ repository.getRepositoryUrl());
+ Job updateJob = new Job(jobName) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ monitor.beginTask(jobName, IProgressMonitor.UNKNOWN);
+ try {
+ performUpdate(repository, connector, monitor);
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ updateJob.schedule();
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ }
+
+ public void performUpdate(final TaskRepository repository, final AbstractRepositoryConnector connector,
+ IProgressMonitor monitor) {
+ try {
+ connector.updateRepositoryConfiguration(repository, monitor);
+ } catch (final CoreException e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiInternal.displayStatus(
+ Messages.UpdateRepositoryConfigurationAction_Error_updating_repository_configuration,
+ e.getStatus());
+ }
+ });
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/WorkweekProgressBar.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/WorkweekProgressBar.java
new file mode 100644
index 0000000..25db767
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/WorkweekProgressBar.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.views;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * Derived from JUnitProgressBar.
+ *
+ * @author Mik Kersten
+ */
+public class WorkweekProgressBar extends Canvas {
+
+ private static final int DEFAULT_HEIGHT = 5;
+
+ private int currentTickCount = 0;
+
+ private int maxTickCount = 0;
+
+ private int colorBarWidth = 0;
+
+ private final Color completedColor;
+
+ private final Composite parent;
+
+ public WorkweekProgressBar(Composite parent) {
+ super(parent, SWT.NONE);
+ this.parent = parent;
+
+ parent.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ colorBarWidth = scale(currentTickCount);
+ redraw();
+ }
+ });
+ addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent e) {
+ paint(e);
+ }
+ });
+ IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+ completedColor = themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_COMPLETED_TODAY);
+ }
+
+ public void setMaximum(int max) {
+ maxTickCount = max;
+ }
+
+ public void reset() {
+ currentTickCount = 0;
+ maxTickCount = 0;
+ colorBarWidth = 0;
+ redraw();
+ }
+
+ public void reset(int ticksDone, int maximum) {
+ currentTickCount = ticksDone;
+ maxTickCount = maximum;
+ colorBarWidth = scale(ticksDone);
+ computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ redraw();
+ }
+
+ private void paintStep(int startX, int endX) {
+ GC gc = new GC(this);
+ setStatusColor(gc);
+ Rectangle rect = getClientArea();
+ startX = Math.max(1, startX);
+ gc.fillRectangle(startX, 1, endX - startX, rect.height - 2);
+ gc.dispose();
+ }
+
+ private void setStatusColor(GC gc) {
+ gc.setBackground(completedColor);
+ }
+
+ private int scale(int value) {
+ if (maxTickCount > 0) {
+ // TODO: should probably get own client area, not parent's
+ Rectangle r = parent.getClientArea();
+ if (r.width != 0) {
+ return Math.max(0, value * (r.width - 2) / maxTickCount);
+ }
+ }
+ return value;
+ }
+
+ private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) {
+ gc.setForeground(topleft);
+ gc.drawLine(x, y, x + w - 1, y);
+ gc.drawLine(x, y, x, y + h - 1);
+
+ gc.setForeground(bottomright);
+ gc.drawLine(x + w, y, x + w, y + h);
+ gc.drawLine(x, y + h, x + w, y + h);
+ }
+
+ private void paint(PaintEvent event) {
+ GC gc = event.gc;
+ Display disp = getDisplay();
+
+ Rectangle rect = getClientArea();
+ gc.fillRectangle(rect);
+ drawBevelRect(gc, rect.x, rect.y, rect.width - 1, rect.height - 1,
+ disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW),
+ disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
+
+ setStatusColor(gc);
+ colorBarWidth = Math.min(rect.width - 2, colorBarWidth);
+ gc.fillRectangle(1, 1, colorBarWidth, rect.height - 2);
+ }
+
+ @Override
+ public Point computeSize(int wHint, int hHint, boolean changed) {
+ checkWidget();
+ Point size = new Point(parent.getSize().x, DEFAULT_HEIGHT);//parent.getSize().y);
+ if (wHint != SWT.DEFAULT) {
+ size.x = wHint;
+ }
+ if (hHint != SWT.DEFAULT) {
+ size.y = hHint;
+ }
+ return size;
+ }
+
+ public void setCount(int count) {
+ currentTickCount++;
+ int x = colorBarWidth;
+
+ colorBarWidth = scale(currentTickCount);
+
+ if (currentTickCount == maxTickCount) {
+ colorBarWidth = getClientArea().width - 1;
+ }
+ paintStep(x, colorBarWidth);
+ }
+
+ public void step(int failures) {
+ currentTickCount++;
+ int x = colorBarWidth;
+
+ colorBarWidth = scale(currentTickCount);
+ if (currentTickCount == maxTickCount) {
+ colorBarWidth = getClientArea().width - 1;
+ }
+ paintStep(x, colorBarWidth);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/messages.properties
new file mode 100644
index 0000000..11d3b09
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/views/messages.properties
@@ -0,0 +1,51 @@
+DisconnectRepositoryAction_Disconnected=Disconnected
+
+PriorityDropDownAction_Filter_Priority_Lower_Than=Hide Priority Lower Than
+RepositoryElementActionGroup_Copy_Detail_Menu_Label=Copy Details
+RepositoryElementActionGroup_New=New
+
+TaskInputDialog_Clear=Clear
+TaskInputDialog_Description=Description:
+TaskInputDialog_Get_Description=Get Description
+TaskInputDialog_New_Task=New Task
+TaskInputDialog_Web_Link=Web Link:
+
+TaskListDropAdapter__retrieving_from_URL_=<retrieving from URL>
+
+TaskListFilteredTree_Activate=Activate...
+TaskListFilteredTree_Edit_Task_Working_Sets_=Edit Task Working Sets...
+TaskListFilteredTree_Estimated_hours=\ Estimated hours: {0} of {1} estimated
+TaskListFilteredTree__multiple_=<multiple>
+TaskListFilteredTree_Scheduled_tasks=\ Scheduled tasks: {0} of {1} scheduled
+TaskListFilteredTree_Search_repository_for_key_or_summary_=Search repository for key or summary...
+TaskListFilteredTree_Select_Active_Task=Select Active Task
+TaskListFilteredTree_Select_Working_Set=Select Working Set
+TaskListFilteredTree_Workweek_Progress=Workweek Progress
+TaskListSorter_Catagory_and_Query=Category and Query
+TaskListSorter_Catagory_and_Repository=Category and Repository
+TaskListSorter_No_Grouping=None
+
+TaskListToolTip_Automatic_container_for_all_local_tasks=Automatic container for all local tasks\nwith no category set
+TaskListToolTip_Automatic_container_for_repository_tasks=Automatic container for repository tasks\nnot matched by any query
+TaskListToolTip_Due=Due: {0}, {1} ({2})
+TaskListToolTip_Elapsed=Elapsed: {0}
+TaskListToolTip_Estimate=Estimate: {0} hours
+TaskListToolTip_Please_synchronize_manually_for_full_error_message=\ Please synchronize manually for full error message.
+TaskListToolTip_Scheduled=Scheduled: {0}
+TaskListToolTip_Some_incoming_elements_may_be_filtered=Some incoming elements may be filtered,\nfocus the view to see all incomings
+TaskListToolTip_Synchronized=Synchronized: {0}
+TaskListToolTip_Total_Complete_Incomplete=Total: {0} (Complete: {1}, Incomplete: {2})
+
+TaskListView_Mylyn_context_capture_paused=Mylyn context capture paused
+TaskListView__paused_=(paused)
+TaskListView_Repository=Repository
+TaskListView_Summary=Summary
+TaskListView_Task_List=Task List
+
+TaskScheduleContentProvider_Future=Future
+TaskScheduleContentProvider_Two_Weeks=Two Weeks
+TaskScheduleContentProvider_Unscheduled=Unscheduled
+
+UpdateRepositoryConfigurationAction_Error_updating_repository_configuration=Error updating repository configuration
+UpdateRepositoryConfigurationAction_Update_Repository_Configuration=Update Repository Configuration
+UpdateRepositoryConfigurationAction_Updating_repository_configuration_for_X=Updating repository configuration for {0}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/AttachmentPreviewPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/AttachmentPreviewPage.java
new file mode 100644
index 0000000..164a856
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/AttachmentPreviewPage.java
@@ -0,0 +1,317 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ * Tasktop Technologies - improvement
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Canvas;
+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.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Shows a preview of an attachment.
+ *
+ * @author Jeff Pound
+ * @author Steffen Pingel
+ */
+public class AttachmentPreviewPage extends WizardPage {
+
+ private static final String DIALOG_SETTING_RUN_IN_BACKGROUND = "run-in-background"; //$NON-NLS-1$
+
+ private static final String DIALOG_SETTINGS_SECTION_ATTACHMENTS_WIZARD = "attachments-wizard"; //$NON-NLS-1$
+
+ protected static final int MAX_TEXT_SIZE = 50000;
+
+ private static final String PAGE_NAME = "PreviewAttachmentPage"; //$NON-NLS-1$
+
+ private final Set<String> imageTypes;
+
+ private final TaskAttachmentModel model;
+
+ private Button runInBackgroundButton;
+
+ private ScrolledComposite scrolledComposite;
+
+ private final Set<String> textTypes;
+
+ private Composite contentComposite;
+
+ public AttachmentPreviewPage(TaskAttachmentModel model) {
+ super(PAGE_NAME);
+ this.model = model;
+ setTitle(Messages.AttachmentPreviewPage_Attachment_Preview);
+ setDescription(Messages.AttachmentPreviewPage_Review_the_attachment_before_submitting);
+
+ textTypes = new HashSet<String>();
+ textTypes.add("text/plain"); //$NON-NLS-1$
+ textTypes.add("text/html"); //$NON-NLS-1$
+ textTypes.add("text/html"); //$NON-NLS-1$
+ textTypes.add("application/xml"); //$NON-NLS-1$
+
+ imageTypes = new HashSet<String>();
+ imageTypes.add("image/jpeg"); //$NON-NLS-1$
+ imageTypes.add("image/gif"); //$NON-NLS-1$
+ imageTypes.add("image/png"); //$NON-NLS-1$
+ }
+
+ private void adjustScrollbars(Rectangle imgSize) {
+ Rectangle clientArea = scrolledComposite.getClientArea();
+
+ ScrollBar hBar = scrolledComposite.getHorizontalBar();
+ hBar.setMinimum(0);
+ hBar.setMaximum(imgSize.width - 1);
+ hBar.setPageIncrement(clientArea.width);
+ hBar.setIncrement(10);
+
+ ScrollBar vBar = scrolledComposite.getVerticalBar();
+ vBar.setMinimum(0);
+ vBar.setMaximum(imgSize.height - 1);
+ vBar.setPageIncrement(clientArea.height);
+ vBar.setIncrement(10);
+ }
+
+ public void createControl(Composite parent) {
+ final Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ setControl(composite);
+
+ contentComposite = new Composite(composite, SWT.NONE);
+ contentComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ contentComposite.setLayout(new GridLayout());
+
+ runInBackgroundButton = new Button(composite, SWT.CHECK);
+ runInBackgroundButton.setText(Messages.AttachmentPreviewPage_Run_in_background);
+
+ IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings attachmentsSettings = settings.getSection(DIALOG_SETTINGS_SECTION_ATTACHMENTS_WIZARD);
+ if (attachmentsSettings != null) {
+ runInBackgroundButton.setSelection(attachmentsSettings.getBoolean(DIALOG_SETTING_RUN_IN_BACKGROUND));
+ }
+
+ Dialog.applyDialogFont(composite);
+ }
+
+ @Override
+ public void dispose() {
+ IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings attachmentsSettings = settings.getSection(DIALOG_SETTINGS_SECTION_ATTACHMENTS_WIZARD);
+ if (attachmentsSettings == null) {
+ attachmentsSettings = settings.addNewSection(DIALOG_SETTINGS_SECTION_ATTACHMENTS_WIZARD);
+ }
+ attachmentsSettings.put(DIALOG_SETTING_RUN_IN_BACKGROUND, runInBackgroundButton.getSelection());
+ super.dispose();
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ if (visible) {
+ Control[] children = contentComposite.getChildren();
+ for (Control control : children) {
+ control.dispose();
+ }
+ if (isTextAttachment() || isImageAttachment()) {
+ Object content = getContent(contentComposite);
+ if (content instanceof String) {
+ createTextPreview(contentComposite, (String) content);
+ } else if (content instanceof Image) {
+ createImagePreview(contentComposite, (Image) content);
+ }
+ } else {
+ createGenericPreview(contentComposite);
+ }
+ contentComposite.layout(true, true);
+ }
+ Dialog.applyDialogFont(contentComposite);
+ super.setVisible(visible);
+ }
+
+ private void createErrorPreview(Composite composite, String message) {
+ Label label = new Label(composite, SWT.NONE);
+ label.setLayoutData(new GridData(GridData.FILL_BOTH));
+ label.setText(message);
+ }
+
+ private void createGenericPreview(Composite composite) {
+ Label label = new Label(composite, SWT.NONE);
+ label.setLayoutData(new GridData(GridData.FILL_BOTH));
+ // TODO 3.3 put filename on model
+ String name = model.getSource().getName();
+ TaskAttachmentMapper taskAttachment = TaskAttachmentMapper.createFrom(model.getAttribute());
+ if (taskAttachment.getFileName() != null) {
+ name = taskAttachment.getFileName();
+ }
+ label.setText(MessageFormat.format(
+ Messages.AttachmentPreviewPage_A_preview_the_type_X_is_currently_not_available, name,
+ model.getContentType()));
+ }
+
+ private void createImagePreview(Composite composite, final Image bufferedImage) {
+ scrolledComposite = new ScrolledComposite(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ scrolledComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+ scrolledComposite.setExpandHorizontal(true);
+ scrolledComposite.setExpandVertical(true);
+
+ Composite canvasComposite = new Composite(scrolledComposite, SWT.NONE);
+ canvasComposite.setLayout(GridLayoutFactory.fillDefaults().create());
+ Canvas canvas = new Canvas(canvasComposite, SWT.NO_BACKGROUND);
+ final Rectangle imgSize = bufferedImage.getBounds();
+ canvas.setLayoutData(GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).grab(true, true).hint(
+ imgSize.width, imgSize.height).create());
+ canvas.addPaintListener(new PaintListener() {
+ public void paintControl(PaintEvent event) {
+ event.gc.drawImage(bufferedImage, 0, 0);
+ }
+ });
+ canvas.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent event) {
+ bufferedImage.dispose();
+ }
+ });
+ canvas.setSize(imgSize.width, imgSize.height);
+ scrolledComposite.setMinSize(imgSize.width, imgSize.height);
+ scrolledComposite.setContent(canvasComposite);
+ scrolledComposite.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent event) {
+ adjustScrollbars(imgSize);
+ }
+
+ });
+ adjustScrollbars(imgSize);
+ }
+
+ private void createTextPreview(Composite composite, String contents) {
+ Text text = new Text(composite, SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.heightHint = composite.getBounds().y;
+ gd.widthHint = composite.getBounds().x;
+ text.setLayoutData(gd);
+ text.setText(contents);
+ }
+
+ private Object getContent(final Composite composite) {
+ final Object result[] = new Object[1];
+ try {
+ getContainer().run(true, false, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ monitor.beginTask(Messages.AttachmentPreviewPage_Preparing_preview, IProgressMonitor.UNKNOWN);
+ final InputStream in = model.getSource().createInputStream(monitor);
+ try {
+ if (isTextAttachment()) {
+ StringBuilder content = new StringBuilder();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+ String line;
+ while ((line = reader.readLine()) != null && content.length() < MAX_TEXT_SIZE
+ && !monitor.isCanceled()) {
+ content.append(line);
+ content.append("\n"); //$NON-NLS-1$
+ }
+ result[0] = content.toString();
+ } else if (isImageAttachment()) {
+ Display.getDefault().syncExec(new Runnable() {
+ public void run() {
+ // Uses double buffering to paint the image; there was a weird behavior
+ // with transparent images and flicker with large images
+ Image originalImage = new Image(getShell().getDisplay(), in);
+ final Image bufferedImage = new Image(getShell().getDisplay(),
+ originalImage.getBounds());
+ GC gc = new GC(bufferedImage);
+ gc.setBackground(composite.getBackground());
+ gc.fillRectangle(originalImage.getBounds());
+ gc.drawImage(originalImage, 0, 0);
+ gc.dispose();
+ originalImage.dispose();
+ result[0] = bufferedImage;
+ }
+ });
+ }
+ } catch (IOException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to close file", e)); //$NON-NLS-1$
+ }
+ }
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error generating preview", e)); //$NON-NLS-1$
+ createErrorPreview(composite, Messages.AttachmentPreviewPage_Could_not_create_preview);
+ return null;
+ } catch (InterruptedException e) {
+ return null;
+ }
+ return result[0];
+ }
+
+ private boolean isImageAttachment() {
+ return imageTypes.contains(model.getContentType());
+ }
+
+ private boolean isTextAttachment() {
+ return textTypes.contains(model.getContentType());
+ }
+
+ public boolean runInBackground() {
+ return runInBackgroundButton.getSelection();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/AttachmentSourcePage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/AttachmentSourcePage.java
new file mode 100644
index 0000000..a831656
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/AttachmentSourcePage.java
@@ -0,0 +1,644 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * IBM Corporation - initial API and implementation
+ * Sebastian Davids <sdavids at gmx.de> - layout tweaks
+ * Jeff Pound - modified for attachment input
+ * Chris Aniszczyk <caniszczyk at gmail.com> - bug 20957
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.resources.mapping.ResourceMapping;
+import org.eclipse.core.resources.mapping.ResourceMappingContext;
+import org.eclipse.core.resources.mapping.ResourceTraversal;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskAttachmentWizard.ClipboardTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.views.navigator.ResourceComparator;
+
+/**
+ * A wizard to input the source of the attachment.
+ * <p>
+ * Based on org.eclipse.compare.internal.InputPatchPage.
+ */
+public class AttachmentSourcePage extends WizardPage {
+
+ // constants
+ protected static final int SIZING_TEXT_FIELD_WIDTH = 250;
+
+ protected static final int COMBO_HISTORY_LENGTH = 5;
+
+ // input constants
+ protected final static int CLIPBOARD = 1;
+
+ protected final static int FILE = 2;
+
+ protected final static int WORKSPACE = 3;
+
+ protected final static int SCREENSHOT = 4;
+
+ static final char SEPARATOR = System.getProperty("file.separator").charAt(0); //$NON-NLS-1$
+
+ private boolean showError = false;
+
+ // SWT widgets
+ private Button useClipboardButton;
+
+// private Button useScreenshotButton;
+
+ private Combo fileNameField;
+
+ private Button fileBrowseButton;
+
+ private Button useFileButton;
+
+ private Button useWorkspaceButton;
+
+ private Label workspaceSelectLabel;
+
+ private TreeViewer treeViewer;
+
+ private String clipboardContents;
+
+ private boolean initUseClipboard = false;
+
+ private final String DIALOG_SETTINGS = "InputAttachmentSourcePage"; //$NON-NLS-1$
+
+ private final String S_LAST_SELECTION = "lastSelection"; //$NON-NLS-1$
+
+ private final TaskAttachmentModel model;
+
+ public AttachmentSourcePage(TaskAttachmentModel model) {
+ super("InputAttachmentPage"); //$NON-NLS-1$
+ this.model = model;
+ setTitle(Messages.AttachmentSourcePage_Select_attachment_source);
+ setDescription(Messages.AttachmentSourcePage_Clipboard_supports_text_and_image_attachments_only);
+ // setMessage("Please select the source for the attachment");
+ }
+
+ private void initialize(IDialogSettings settings) {
+ String selection = settings.get(S_LAST_SELECTION);
+ if (selection != null) {
+ setInputMethod(Integer.valueOf(selection).intValue());
+ } else {
+ updateWidgetEnablements();
+ }
+ }
+
+ /*
+ * Get a path from the supplied text widget. @return
+ * org.eclipse.core.runtime.IPath
+ */
+ protected IPath getPathFromText(Text textField) {
+ return (new Path(textField.getText())).makeAbsolute();
+ }
+
+ public String getAttachmentName() {
+ if (getInputMethod() == CLIPBOARD) {
+ return Messages.AttachmentSourcePage__Clipboard_;
+ } else if (getInputMethod() == WORKSPACE) {
+ return getResources(treeViewer.getSelection())[0].getFullPath().toOSString();
+ }
+ return getAttachmentFilePath();
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ GridData gd = new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL);
+ gd.heightHint = 800;
+ composite.setLayoutData(gd);
+ setControl(composite);
+
+ initializeDialogUnits(parent);
+
+ createAttachmentFileGroup(composite);
+
+ // No error for dialog opening
+ showError = false;
+ clearErrorMessage();
+ initialize(getDialogSettings());
+
+ Dialog.applyDialogFont(composite);
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ AbstractTaskAttachmentSource source = getSource();
+ model.setSource(source);
+ if (source != null) {
+ model.setContentType(source.getContentType());
+ }
+ saveDialogSettings();
+ return super.getNextPage();
+ }
+
+ private void saveDialogSettings() {
+ IDialogSettings settings = getDialogSettings();
+ settings.put(S_LAST_SELECTION, getInputMethod());
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return isPageComplete();
+ }
+
+ private void setEnableAttachmentFile(boolean enable) {
+ fileNameField.setEnabled(enable);
+ fileBrowseButton.setEnabled(enable);
+ }
+
+ private void setEnableWorkspaceAttachment(boolean enable) {
+ workspaceSelectLabel.setEnabled(enable);
+ treeViewer.getTree().setEnabled(enable);
+ }
+
+ /*
+ * Create the group for selecting the attachment file
+ */
+ private void createAttachmentFileGroup(Composite parent) {
+ final Composite composite = new Composite(parent, SWT.NULL);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 3;
+ composite.setLayout(gridLayout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // new row
+ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ useFileButton = new Button(composite, SWT.RADIO);
+ useFileButton.setText(Messages.AttachmentSourcePage_File);
+
+ fileNameField = new Combo(composite, SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.widthHint = SIZING_TEXT_FIELD_WIDTH;
+ fileNameField.setLayoutData(gd);
+ fileNameField.setText(""); //$NON-NLS-1$
+
+ fileBrowseButton = new Button(composite, SWT.PUSH);
+ fileBrowseButton.setText(Messages.AttachmentSourcePage_Browse_);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
+ Point minSize = fileBrowseButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ data.widthHint = Math.max(widthHint, minSize.x);
+ fileBrowseButton.setLayoutData(data);
+
+ // new row
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ gd.horizontalSpan = 3;
+ useClipboardButton = new Button(composite, SWT.RADIO);
+ useClipboardButton.setText(Messages.AttachmentSourcePage_Clipboard);
+ useClipboardButton.setLayoutData(gd);
+ useClipboardButton.setSelection(initUseClipboard);
+
+ // new row
+ useWorkspaceButton = new Button(composite, SWT.RADIO);
+ useWorkspaceButton.setText(Messages.AttachmentSourcePage_Workspace);
+ gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ useWorkspaceButton.setLayoutData(gd);
+
+ addWorkspaceControls(parent);
+
+ // Add listeners
+ useClipboardButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!useClipboardButton.getSelection()) {
+ return;
+ }
+
+ clearErrorMessage();
+ showError = true;
+ storeClipboardContents();
+ updateWidgetEnablements();
+ }
+ });
+
+ useFileButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!useFileButton.getSelection()) {
+ return;
+ }
+ // If there is anything typed in at all
+ clearErrorMessage();
+ showError = (fileNameField.getText() != ""); //$NON-NLS-1$
+ updateWidgetEnablements();
+ }
+ });
+ fileNameField.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ setSourceName(fileNameField.getText());
+ updateWidgetEnablements();
+ }
+ });
+ fileNameField.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ clearErrorMessage();
+ showError = true;
+ updateWidgetEnablements();
+ }
+ });
+ fileBrowseButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ clearErrorMessage();
+ showError = true;
+ /* Launch Browser */
+ FileDialog fileChooser = new FileDialog(composite.getShell(), SWT.OPEN);
+ String file = fileChooser.open();
+
+ // Check if the dialog was canceled or an error occured
+ if (file == null) {
+ return;
+ }
+ // update UI
+ fileNameField.setText(file);
+ updateWidgetEnablements();
+ }
+ });
+ useWorkspaceButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!useWorkspaceButton.getSelection()) {
+ return;
+ }
+ clearErrorMessage();
+ // If there is anything typed in at all
+ showError = (!treeViewer.getSelection().isEmpty());
+ updateWidgetEnablements();
+ }
+ });
+
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ clearErrorMessage();
+ updateWidgetEnablements();
+ }
+ });
+
+ treeViewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof TreeSelection) {
+ TreeSelection treeSel = (TreeSelection) selection;
+ Object res = treeSel.getFirstElement();
+ if (res != null) {
+ if (res instanceof IProject || res instanceof IFolder) {
+ if (treeViewer.getExpandedState(res)) {
+ treeViewer.collapseToLevel(res, 1);
+ } else {
+ treeViewer.expandToLevel(res, 1);
+ }
+ } else if (res instanceof IFile) {
+ getContainer().showPage(getNextPage());
+ }
+ }
+ }
+ }
+ });
+
+ useFileButton.setSelection(!initUseClipboard);
+ setEnableWorkspaceAttachment(false);
+ }
+
+ private void addWorkspaceControls(Composite composite) {
+
+ Composite newComp = new Composite(composite, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ layout.marginLeft = 16; // align w/ lable of check button
+ newComp.setLayout(layout);
+ newComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ workspaceSelectLabel = new Label(newComp, SWT.LEFT);
+ workspaceSelectLabel.setText(Messages.AttachmentSourcePage_Select_the_location_of_the_attachment);
+
+ treeViewer = new TreeViewer(newComp, SWT.BORDER);
+ treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ treeViewer.setLabelProvider(new WorkbenchLabelProvider());
+ treeViewer.setContentProvider(new WorkbenchContentProvider());
+ treeViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
+ treeViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
+ }
+
+ /**
+ * Updates the enable state of this page's controls.
+ */
+ private void updateWidgetEnablements() {
+
+ String error = null;
+
+ boolean attachmentFound = false;
+ int inputMethod = getInputMethod();
+ if (inputMethod == CLIPBOARD) {
+ if (ClipboardTaskAttachmentSource.isSupportedType(getControl().getDisplay())) {
+ attachmentFound = true;
+ } else {
+ error = Messages.AttachmentSourcePage_Clipboard_contains_an_unsupported_data;
+ }
+ } else if (inputMethod == SCREENSHOT) {
+ attachmentFound = true;
+ } else if (inputMethod == FILE) {
+ String path = fileNameField.getText();
+ if (path != null && path.length() > 0) {
+ File file = new File(path);
+ attachmentFound = file.exists() && file.isFile() && file.length() > 0;
+ if (!attachmentFound) {
+ error = Messages.AttachmentSourcePage_Cannot_locate_attachment_file;
+ }
+ } else {
+ error = Messages.AttachmentSourcePage_No_file_name;
+ }
+ } else if (inputMethod == WORKSPACE) {
+ // Get the selected attachment file (tree will only allow for one
+ // selection)
+ IResource[] resources = getResources(treeViewer.getSelection());
+ if (resources == null || resources.length <= 0) {
+ error = Messages.AttachmentSourcePage_No_file_name;
+ } else {
+ IResource attachmentFile = resources[0];
+ if (attachmentFile != null && attachmentFile.getType() == IResource.FILE) {
+ File actualFile = attachmentFile.getRawLocation().toFile();
+ attachmentFound = actualFile.exists() && actualFile.isFile() && actualFile.length() > 0;
+ if (!attachmentFound) {
+ error = Messages.AttachmentSourcePage_Cannot_locate_attachment_file;
+ }
+ }
+ }
+ }
+
+ setPageComplete(attachmentFound);
+
+ if (showError) {
+ setErrorMessage(error);
+ }
+
+ setEnableAttachmentFile(inputMethod == FILE);
+ setEnableWorkspaceAttachment(inputMethod == WORKSPACE);
+ }
+
+ /**
+ * Sets the source name of the import to be the supplied path. Adds the name of the path to the list of items in the
+ * source combo and selects it.
+ *
+ * @param path
+ * the path to be added
+ */
+ protected void setSourceName(String path) {
+
+ if (path.length() > 0) {
+
+ String[] currentItems = fileNameField.getItems();
+ int selectionIndex = -1;
+ for (int i = 0; i < currentItems.length; i++) {
+ if (currentItems[i].equals(path)) {
+ selectionIndex = i;
+ }
+ }
+
+ if (selectionIndex < 0) { // not found in history
+ int oldLength = currentItems.length;
+ String[] newItems = new String[oldLength + 1];
+ System.arraycopy(currentItems, 0, newItems, 0, oldLength);
+ newItems[oldLength] = path;
+ fileNameField.setItems(newItems);
+ selectionIndex = oldLength;
+ }
+ fileNameField.select(selectionIndex);
+
+ // resetSelection();
+ }
+ }
+
+ /*
+ * Clears the dialog message box
+ */
+ private void clearErrorMessage() {
+ setErrorMessage(null);
+ }
+
+ protected int getInputMethod() {
+ if (useClipboardButton == null) {
+ if (initUseClipboard) {
+ return CLIPBOARD;
+ }
+ return FILE;
+ }
+ if (useClipboardButton.getSelection()) {
+ return CLIPBOARD;
+ }
+ if (useFileButton.getSelection()) {
+ return FILE;
+ }
+ return WORKSPACE;
+ }
+
+ protected void setInputMethod(int input) {
+ switch (input) {
+ case WORKSPACE:
+ useWorkspaceButton.setSelection(true);
+ useClipboardButton.setSelection(false);
+ useFileButton.setSelection(false);
+ break;
+ case CLIPBOARD:
+ storeClipboardContents();
+
+ useClipboardButton.setSelection(true);
+ useFileButton.setSelection(false);
+ useWorkspaceButton.setSelection(false);
+ break;
+ default:
+ useFileButton.setSelection(true);
+ useWorkspaceButton.setSelection(false);
+ useClipboardButton.setSelection(false);
+ break;
+ }
+ updateWidgetEnablements();
+ }
+
+ private String getAttachmentFilePath() {
+ if (fileNameField != null) {
+ return fileNameField.getText();
+ }
+ return null;
+ }
+
+ public String getAbsoluteAttachmentPath() {
+ switch (getInputMethod()) {
+ case CLIPBOARD:
+ return Messages.AttachmentSourcePage__Clipboard_;
+ case SCREENSHOT:
+ return Messages.AttachmentSourcePage__Screenshot_;
+ case WORKSPACE:
+ IResource[] resources = getResources(treeViewer.getSelection());
+ if (resources.length > 0 && resources[0].getRawLocation() != null) {
+ return resources[0].getRawLocation().toOSString();
+ } else {
+ return null;
+ }
+ case FILE:
+ default:
+ return getAttachmentFilePath();
+ }
+ }
+
+ /*
+ * Based on .eclipse.compare.internal.Utilities
+ *
+ * Convenience method: extract all accessible <code>IResources</code> from
+ * given selection. Never returns null.
+ */
+ public static IResource[] getResources(ISelection selection) {
+ ArrayList<IResource> tmp = new ArrayList<IResource>();
+ Class<?> type = IResource.class;
+ if (selection instanceof IStructuredSelection) {
+ Object[] s = ((IStructuredSelection) selection).toArray();
+
+ for (Object o : s) {
+ IResource resource = null;
+ if (type.isInstance(o)) {
+ resource = (IResource) o;
+
+ } else if (o instanceof ResourceMapping) {
+ try {
+ ResourceTraversal[] travs = ((ResourceMapping) o).getTraversals(
+ ResourceMappingContext.LOCAL_CONTEXT, null);
+ if (travs != null) {
+ for (ResourceTraversal trav : travs) {
+ IResource[] resources = trav.getResources();
+ for (IResource resource2 : resources) {
+ if (type.isInstance(resource2) && resource2.isAccessible()) {
+ tmp.add(resource2);
+ }
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ // TODO handle error
+ }
+ } else if (o instanceof IAdaptable) {
+ IAdaptable a = (IAdaptable) o;
+ Object adapter = a.getAdapter(IResource.class);
+ if (type.isInstance(adapter)) {
+ resource = (IResource) adapter;
+ }
+ }
+
+ if (resource != null && resource.isAccessible()) {
+ tmp.add(resource);
+ }
+ }
+ }
+
+ return tmp.toArray(new IResource[tmp.size()]);
+ }
+
+ private void storeClipboardContents() {
+ Control c = getControl();
+ if (c != null) {
+ Clipboard clipboard = new Clipboard(c.getDisplay());
+ Object o = clipboard.getContents(TextTransfer.getInstance());
+ clipboard.dispose();
+ if (o instanceof String) {
+ clipboardContents = ((String) o).trim();
+ }
+ }
+ }
+
+ public String getClipboardContents() {
+ return clipboardContents;
+ }
+
+ public void setClipboardContents(String attachContents) {
+ clipboardContents = attachContents;
+ }
+
+ public void setUseClipboard(boolean b) {
+ if (useClipboardButton != null) {
+ useClipboardButton.setSelection(b);
+ }
+ initUseClipboard = b;
+ }
+
+ @Override
+ protected IDialogSettings getDialogSettings() {
+ TasksUiPlugin plugin = TasksUiPlugin.getDefault();
+ IDialogSettings settings = plugin.getDialogSettings();
+ IDialogSettings section = settings.getSection(DIALOG_SETTINGS);
+ if (section == null) {
+ section = settings.addNewSection(DIALOG_SETTINGS);
+ }
+ return section;
+ }
+
+ public AbstractTaskAttachmentSource getSource() {
+ switch (getInputMethod()) {
+ case CLIPBOARD:
+ return new TaskAttachmentWizard.ClipboardTaskAttachmentSource();
+ case WORKSPACE:
+ IResource[] resources = getResources(treeViewer.getSelection());
+ if (resources.length > 0) {
+ return new FileTaskAttachmentSource(resources[0].getLocation().toFile());
+ } else {
+ return null;
+ }
+ default: // FILE
+ return new FileTaskAttachmentSource(new File(getAttachmentFilePath()));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/EditRepositoryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/EditRepositoryWizard.java
new file mode 100644
index 0000000..04c17a2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/EditRepositoryWizard.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlOperation;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ */
+public class EditRepositoryWizard extends Wizard implements INewWizard {
+
+ private ITaskRepositoryPage settingsPage;
+
+ private final TaskRepository repository;
+
+ public EditRepositoryWizard(TaskRepository repository) {
+ this.repository = repository;
+ setNeedsProgressMonitor(true);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY_SETTINGS);
+ setWindowTitle(Messages.EditRepositoryWizard_Properties_for_Task_Repository);
+ }
+
+ /**
+ * Custom properties should be set on the repository object to ensure they are saved.
+ */
+ @Override
+ public boolean performFinish() {
+ if (canFinish()) {
+ String oldUrl = repository.getRepositoryUrl();
+ String newUrl = settingsPage.getRepositoryUrl();
+ if (oldUrl != null && newUrl != null && !oldUrl.equals(newUrl)) {
+ TasksUi.getTaskActivityManager().deactivateActiveTask();
+
+ RefactorRepositoryUrlOperation operation = new RefactorRepositoryUrlOperation(oldUrl, newUrl);
+ try {
+ getContainer().run(true, false, operation);
+ } catch (InvocationTargetException e) {
+ StatusHandler.fail(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ Messages.EditRepositoryWizard_Failed_to_refactor_repository_urls));
+ return false;
+ } catch (InterruptedException e) {
+ // should not get here
+ }
+ }
+
+ repository.flushAuthenticationCredentials();
+
+ if (!repository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) {
+ repository.setRepositoryUrl(newUrl);
+ }
+ settingsPage.applyTo(repository);
+ if (oldUrl != null && newUrl != null && !oldUrl.equals(newUrl)) {
+ TasksUiPlugin.getRepositoryManager().notifyRepositoryUrlChanged(repository, oldUrl);
+ }
+ TasksUiPlugin.getRepositoryManager().notifyRepositorySettingsChanged(repository);
+ TasksUiPlugin.getExternalizationManager().requestSave();
+ return true;
+ }
+ return false;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ @Override
+ public void addPages() {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ settingsPage = connectorUi.getSettingsPage(repository);
+ if (settingsPage instanceof AbstractRepositorySettingsPage) {
+ ((AbstractRepositorySettingsPage) settingsPage).setRepository(repository);
+ ((AbstractRepositorySettingsPage) settingsPage).setVersion(repository.getVersion());
+ }
+ settingsPage.setWizard(this);
+ addPage(settingsPage);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return settingsPage.isPageComplete();
+ }
+
+ /** public for testing */
+ public ITaskRepositoryPage getSettingsPage() {
+ return settingsPage;
+ }
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/LocalRepositorySettingsPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/LocalRepositorySettingsPage.java
new file mode 100644
index 0000000..d498d75
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/LocalRepositorySettingsPage.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractTaskRepositoryPage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+
+/**
+ * A settings page for the local repository properties dialog. Local repositories have no settings, however they may
+ * have settings contributed via the taskRepositoryPageContribution.
+ *
+ * @author David Green
+ */
+public class LocalRepositorySettingsPage extends AbstractTaskRepositoryPage {
+
+ public LocalRepositorySettingsPage(TaskRepository taskRepository) {
+ super(Messages.LocalRepositorySettingsPage_Local_Repository_Settings, Messages.LocalRepositorySettingsPage_Configure_the_local_repository, taskRepository);
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return LocalRepositoryConnector.CONNECTOR_KIND;
+ }
+
+ public String getRepositoryUrl() {
+ return LocalRepositoryConnector.REPOSITORY_URL;
+ }
+
+ @Override
+ protected void createSettingControls(Composite parent) {
+ // nothing to do, since the local repository has no settings
+ }
+
+ @Override
+ protected IStatus validate() {
+ // nothing to do
+ return null;
+ }
+
+ @Override
+ protected void createContributionControls(Composite parentControl) {
+ super.createContributionControls(parentControl);
+ // expand the first contribution since we have no other settings
+ Control[] children = parentControl.getChildren();
+ if (children.length > 0) {
+ if (children[0] instanceof ExpandableComposite) {
+ ((ExpandableComposite) children[0]).setExpanded(true);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/Messages.java
new file mode 100644
index 0000000..baf4bc9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/Messages.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.wizards.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String EditRepositoryWizard_Failed_to_refactor_repository_urls;
+
+ public static String EditRepositoryWizard_Properties_for_Task_Repository;
+
+ public static String AttachmentSourcePage__Clipboard_;
+
+ public static String AttachmentSourcePage__Screenshot_;
+
+ public static String AttachmentSourcePage_Browse_;
+
+ public static String AttachmentSourcePage_Cannot_locate_attachment_file;
+
+ public static String AttachmentSourcePage_Clipboard;
+
+ public static String AttachmentSourcePage_Clipboard_contains_an_unsupported_data;
+
+ public static String AttachmentSourcePage_Clipboard_supports_text_and_image_attachments_only;
+
+ public static String AttachmentSourcePage_File;
+
+ public static String AttachmentSourcePage_No_file_name;
+
+ public static String AttachmentSourcePage_Select_attachment_source;
+
+ public static String AttachmentSourcePage_Select_the_location_of_the_attachment;
+
+ public static String AttachmentSourcePage_Workspace;
+
+ public static String NewQueryWizard_New_Repository_Query;
+
+ public static String NewTaskWizard_New_Task;
+
+ public static String NewWebTaskPage_Create_via_Web_Browser;
+
+ public static String NewWebTaskPage_New_Task;
+
+ public static String NewWebTaskPage_Once_submitted_synchronize_queries_or_add_the_task_to_a_category;
+
+ public static String NewWebTaskPage_This_will_open_a_web_browser_that_can_be_used_to_create_a_new_task;
+
+ public static String AttachmentPreviewPage_A_preview_the_type_X_is_currently_not_available;
+
+ public static String AttachmentPreviewPage_Attachment_Preview;
+
+ public static String AttachmentPreviewPage_Could_not_create_preview;
+
+ public static String AttachmentPreviewPage_Preparing_preview;
+
+ public static String AttachmentPreviewPage_Review_the_attachment_before_submitting;
+
+ public static String AttachmentPreviewPage_Run_in_background;
+
+ public static String SelectRepositoryConnectorPage_discoveryProblemMessage;
+
+ public static String SelectRepositoryConnectorPage_discoveryProblemTitle;
+
+ public static String SelectRepositoryConnectorPage_activateDiscovery;
+
+ public static String SelectRepositoryConnectorPage_Select_a_task_repository_type;
+
+ public static String SelectRepositoryConnectorPage_You_can_connect_to_an_existing_account_using_one_of_the_installed_connectors;
+
+ public static String SelectRepositoryPage_Add_new_repositories_using_the_X_view;
+
+ public static String SelectRepositoryPage_Select_a_repository;
+
+ public static String TaskAttachmentWizard_Add_Attachment;
+
+ public static String TaskAttachmentWizard_Attach_Screenshot;
+
+ public static String TaskAttachmentWizard_Attaching_context;
+
+ public static String TaskAttachmentWizard_Attachment_Failed;
+
+ public static String TaskAttachmentWizard_Screenshot;
+
+ public static String TaskDataExportWizard_Export;
+
+ public static String TaskDataExportWizard_export_failed;
+
+ public static String TaskDataExportWizardPage_Browse_;
+
+ public static String TaskDataExportWizardPage_Export_Mylyn_Task_Data;
+
+ public static String TaskDataExportWizardPage_File;
+
+ public static String TaskDataExportWizardPage_Folder;
+
+ public static String TaskDataExportWizardPage_Folder_Selection;
+
+ public static String TaskDataExportWizardPage_Please_choose_an_export_destination;
+
+ public static String TaskDataExportWizardPage_Specify_the_destination_folder_for_task_data;
+
+ public static String TaskDataImportWizard_confirm_overwrite;
+
+ public static String TaskDataImportWizard_could_not_be_found;
+
+ public static String TaskDataImportWizard_existing_task_data_about_to_be_erased_proceed;
+
+ public static String TaskDataImportWizard_File_not_found;
+
+ public static String TaskDataImportWizard_Import;
+
+ public static String TaskDataImportWizard_Import_Error;
+
+ public static String TaskDataImportWizard_Importing_Data;
+
+ public static String TaskDataImportWizard_task_data_import_failed;
+
+ public static String TaskDataImportWizardPage_Restore_tasks_from_history;
+
+ public static String TaskDataImportWizardPage_Browse_;
+
+ public static String TaskDataImportWizardPage_From_snapshot;
+
+ public static String TaskDataImportWizardPage_From_zip_file;
+
+ public static String TaskDataImportWizardPage_Import_method_backup;
+
+ public static String TaskDataImportWizardPage_Import_method_zip;
+
+ public static String TaskDataImportWizardPage_Import_Settings_saved;
+
+ public static String TaskDataImportWizardPage_Import_Source_zip_file_setting;
+
+ public static String TaskDataImportWizardPage_Importing_overwrites_current_tasks_and_repositories;
+
+ public static String TaskDataImportWizardPage__unspecified_;
+
+ public static String TaskDataImportWizardPage_Zip_File_Selection;
+
+ public static String AbstractRepositoryQueryPage_A_category_with_this_name_already_exists;
+
+ public static String AbstractRepositoryQueryPage_Enter_query_parameters;
+
+ public static String AbstractRepositoryQueryPage_If_attributes_are_blank_or_stale_press_the_Update_button;
+
+ public static String AbstractRepositoryQueryPage_Please_specify_a_title_for_the_query;
+
+ public static String AbstractRepositoryQueryPage_A_query_with_this_name_already_exists;
+
+ public static String AbstractRepositorySettingsPage_Additional_Settings;
+
+ public static String AbstractRepositorySettingsPage_Anonymous_Access;
+
+ public static String AbstractRepositorySettingsPage_Authentication_credentials_are_valid;
+
+ public static String AbstractRepositorySettingsPage_Change_account_settings;
+
+ public static String AbstractRepositorySettingsPage_Change_Settings;
+
+ public static String AbstractRepositorySettingsPage_Character_encoding;
+
+ public static String AbstractRepositorySettingsPage_Create_new_account;
+
+ public static String AbstractRepositorySettingsPage_Default__;
+
+ public static String AbstractRepositorySettingsPage_Disconnected;
+
+ public static String AbstractRepositorySettingsPage_Enable_http_authentication;
+
+ public static String AbstractRepositorySettingsPage_Enable_proxy_authentication;
+
+ public static String AbstractRepositorySettingsPage_Enter_a_valid_server_url;
+
+ public static String AbstractRepositorySettingsPage_Http_Authentication;
+
+ public static String AbstractRepositorySettingsPage_Internal_error_validating_repository;
+
+ public static String AbstractRepositorySettingsPage_Label_;
+
+ public static String AbstractRepositorySettingsPage_Other;
+
+ public static String AbstractRepositorySettingsPage_Password_;
+
+ public static String AbstractRepositorySettingsPage_Problems_encountered_determining_available_charsets;
+
+ public static String AbstractRepositorySettingsPage_Proxy_host_address_;
+
+ public static String AbstractRepositorySettingsPage_Proxy_host_port_;
+
+ public static String AbstractRepositorySettingsPage_Proxy_Server_Configuration;
+
+ public static String AbstractRepositorySettingsPage_Repository_already_exists;
+
+ public static String AbstractRepositorySettingsPage_Repository_is_valid;
+
+ public static String AbstractRepositorySettingsPage_Repository_url_is_invalid;
+
+ public static String AbstractRepositorySettingsPage_Repository_user_name_and_password_must_not_be_blank;
+
+ public static String AbstractRepositorySettingsPage_Save_Password;
+
+ public static String AbstractRepositorySettingsPage_Server_;
+
+ public static String AbstractRepositorySettingsPage_Unable_to_authenticate_with_repository;
+
+ public static String AbstractRepositorySettingsPage_Use_global_Network_Connections_preferences;
+
+ public static String AbstractRepositorySettingsPage_User_ID_;
+
+ public static String AbstractRepositorySettingsPage_Validate_Settings;
+
+ public static String AbstractRepositorySettingsPage_Validating_server_settings;
+
+ public static String NewTaskWizard_Create_Task;
+
+ public static String NewTaskWizard_Error_creating_new_task;
+
+ public static String NewTaskWizard_Failed_to_create_new_task_;
+
+ public static String NewWebTaskWizard_New_Task;
+
+ public static String NewWebTaskWizard_This_connector_does_not_provide_a_rich_task_editor_for_creating_tasks;
+
+ public static String RepositoryQueryWizard_Edit_Repository_Query;
+
+ public static String TaskAttachmentPage_ATTACHE_CONTEXT;
+
+ public static String TaskAttachmentPage_Attachment_Details;
+
+ public static String TaskAttachmentPage_Comment;
+
+ public static String TaskAttachmentPage_Content_Type;
+
+ public static String TaskAttachmentPage_Description;
+
+ public static String TaskAttachmentPage_Enter_a_description;
+
+ public static String TaskAttachmentPage_Enter_a_file_name;
+
+ public static String TaskAttachmentPage_File;
+
+ public static String TaskAttachmentPage_Patch;
+
+ public static String TaskAttachmentPage_Verify_the_content_type_of_the_attachment;
+
+ public static String AbstractTaskRepositoryPage_Validation_failed;
+
+ public static String LocalRepositorySettingsPage_Configure_the_local_repository;
+
+ public static String LocalRepositorySettingsPage_Local_Repository_Settings;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/MultiRepositoryAwareWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/MultiRepositoryAwareWizard.java
new file mode 100644
index 0000000..5b04dd8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/MultiRepositoryAwareWizard.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Brock Janiczak - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ * @author Brock Janiczak
+ */
+public class MultiRepositoryAwareWizard extends Wizard implements INewWizard {
+
+ private final SelectRepositoryPage selectRepositoryPage;
+
+ public MultiRepositoryAwareWizard(SelectRepositoryPage page, String title) {
+ selectRepositoryPage = page;
+ setForcePreviousAndNextButtons(true);
+ setNeedsProgressMonitor(true);
+ setWindowTitle(title);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // ignore
+ }
+
+ @Override
+ public void addPages() {
+ addPage(selectRepositoryPage);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return selectRepositoryPage.canFinish();
+ }
+
+ @Override
+ public boolean performFinish() {
+ return selectRepositoryPage.performFinish();
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewAttachmentWizardDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewAttachmentWizardDialog.java
new file mode 100644
index 0000000..a6ddbbf
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewAttachmentWizardDialog.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Jeff Pound
+ */
+public class NewAttachmentWizardDialog extends WizardDialog {
+
+ private static final String ATTACHMENT_WIZARD_SETTINGS_SECTION = "PatchWizard"; //$NON-NLS-1$
+
+ public NewAttachmentWizardDialog(Shell parent, IWizard wizard, boolean modal) {
+ super(parent, wizard);
+
+ if (modal) {
+ setShellStyle(getShellStyle() | SWT.RESIZE);
+ } else {
+ setShellStyle(SWT.MODELESS | SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.RESIZE);
+ }
+ setMinimumPageSize(600, 300);
+ setPageSize(600, 300);
+ setBlockOnOpen(modal);
+ }
+
+ @Override
+ protected IDialogSettings getDialogBoundsSettings() {
+ IDialogSettings settings = TasksUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings section = settings.getSection(ATTACHMENT_WIZARD_SETTINGS_SECTION);
+ if (section == null) {
+ section = settings.addNewSection(ATTACHMENT_WIZARD_SETTINGS_SECTION);
+ }
+ return section;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewLocalCategoryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewLocalCategoryWizard.java
new file mode 100644
index 0000000..2e0289b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewLocalCategoryWizard.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewCategoryAction;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ */
+public class NewLocalCategoryWizard extends Wizard implements INewWizard {
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ setForcePreviousAndNextButtons(false);
+ }
+
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ @Override
+ public boolean performFinish() {
+ new NewCategoryAction().run();
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewLocalTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewLocalTaskWizard.java
new file mode 100644
index 0000000..39e5418
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewLocalTaskWizard.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Rob Elves
+ * @author Steffen Pingel
+ */
+public class NewLocalTaskWizard extends Wizard implements INewWizard {
+
+ private final ITaskMapping taskSelection;
+
+ public NewLocalTaskWizard(ITaskMapping taskSelection) {
+ this.taskSelection = taskSelection;
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ setNeedsProgressMonitor(true);
+ }
+
+ public NewLocalTaskWizard() {
+ this(null);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ setForcePreviousAndNextButtons(false);
+ }
+
+ @Override
+ public void addPages() {
+ // ignore
+ }
+
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ @Override
+ public boolean performFinish() {
+ LocalTask task = TasksUiInternal.createNewLocalTask(null);
+ if (taskSelection != null) {
+ if (taskSelection.getSummary() != null) {
+ task.setSummary(taskSelection.getSummary());
+ }
+ if (taskSelection.getDescription() != null) {
+ task.setNotes(taskSelection.getDescription());
+ }
+ }
+ TasksUiUtil.openTask(task);
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewQueryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewQueryWizard.java
new file mode 100644
index 0000000..866abe6
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewQueryWizard.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ */
+public class NewQueryWizard extends MultiRepositoryAwareWizard {
+
+ public NewQueryWizard() {
+ super(new SelectRepositoryPageForNewQuery(), Messages.NewQueryWizard_New_Repository_Query);
+ }
+
+ private static final class SelectRepositoryPageForNewQuery extends SelectRepositoryPage {
+ public SelectRepositoryPageForNewQuery() {
+ super(ITaskRepositoryFilter.CAN_QUERY);
+ }
+
+ @Override
+ protected IWizard createWizard(TaskRepository taskRepository) {
+ AbstractRepositoryConnectorUi repositoryUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ return repositoryUi.getQueryWizard(taskRepository, null);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewRepositoryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewRepositoryWizard.java
new file mode 100644
index 0000000..e9ee9ea
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewRepositoryWizard.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Peter Stibrany - fix for bug 247077
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class NewRepositoryWizard extends Wizard implements INewWizard {
+
+ private AbstractRepositoryConnector connector;
+
+ /**
+ * If not null, indicates that the wizard will initially jump to a specific connector page
+ */
+ private final String connectorKind;
+
+ private TaskRepository taskRepository;
+
+ private SelectRepositoryConnectorPage selectConnectorPage;
+
+ private ITaskRepositoryPage settingsPage;
+
+ private String lastConnectorKind;
+
+ public NewRepositoryWizard() {
+ this(null);
+ }
+
+ public NewRepositoryWizard(String connectorKind) {
+ this.connectorKind = connectorKind;
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ setForcePreviousAndNextButtons(connectorKind == null);
+ setNeedsProgressMonitor(true);
+ setWindowTitle(AddRepositoryAction.TITLE);
+ }
+
+ @Override
+ public void addPages() {
+ if (connectorKind != null) {
+ connector = TasksUi.getRepositoryManager().getRepositoryConnector(connectorKind);
+ updateSettingsPage();
+ addPage(settingsPage);
+ } else {
+ selectConnectorPage = new SelectRepositoryConnectorPage();
+ addPage(selectConnectorPage);
+ }
+ }
+
+ @Override
+ public boolean canFinish() {
+ return (selectConnectorPage == null || selectConnectorPage.isPageComplete())
+ && !(getContainer().getCurrentPage() == selectConnectorPage) && settingsPage != null
+ && settingsPage.isPageComplete();
+ }
+
+ @Override
+ public IWizardPage getNextPage(IWizardPage page) {
+ if (page == selectConnectorPage) {
+ connector = selectConnectorPage.getConnector();
+ updateSettingsPage();
+ return settingsPage;
+ }
+ return super.getNextPage(page);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (canFinish()) {
+ taskRepository = new TaskRepository(connector.getConnectorKind(), settingsPage.getRepositoryUrl());
+ settingsPage.applyTo(taskRepository);
+ TasksUi.getRepositoryManager().addRepository(taskRepository);
+ return true;
+ }
+ return false;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ private void updateSettingsPage() {
+ assert connector != null;
+ if (!connector.getConnectorKind().equals(lastConnectorKind)) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(connector.getConnectorKind());
+ settingsPage = connectorUi.getSettingsPage(null);
+ settingsPage.setWizard(this);
+ lastConnectorKind = connector.getConnectorKind();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewTaskPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewTaskPage.java
new file mode 100644
index 0000000..4e56a55
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewTaskPage.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ */
+public class NewTaskPage extends SelectRepositoryPage {
+
+ private final ITaskMapping taskSelection;
+
+ public NewTaskPage(ITaskRepositoryFilter taskRepositoryFilter, ITaskMapping taskSelection) {
+ super(taskRepositoryFilter);
+ this.taskSelection = taskSelection;
+ }
+
+ @Override
+ protected IWizard createWizard(TaskRepository taskRepository) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ return connectorUi.getNewTaskWizard(taskRepository, taskSelection);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewTaskWizardInternal.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewTaskWizardInternal.java
new file mode 100644
index 0000000..c3f46c1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewTaskWizardInternal.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.ui.INewWizard;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ */
+public class NewTaskWizardInternal extends MultiRepositoryAwareWizard implements INewWizard {
+
+ public NewTaskWizardInternal(ITaskMapping taskSelection) {
+ super(new NewTaskPage(ITaskRepositoryFilter.CAN_CREATE_NEW_TASK, taskSelection),
+ Messages.NewTaskWizard_New_Task);
+ setNeedsProgressMonitor(true);
+ }
+
+ /**
+ * Constructs a new task wizard with an empty selection. This constructor is used by the
+ * <code>org.eclipse.ui.newWizards</code> extension.
+ */
+ public NewTaskWizardInternal() {
+ this(null);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewWebTaskPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewWebTaskPage.java
new file mode 100644
index 0000000..def044a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/NewWebTaskPage.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Wizard page for creating new tickets through a web browser.
+ *
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class NewWebTaskPage extends WizardPage {
+
+ public NewWebTaskPage(ITaskMapping taskSelection) {
+ super(Messages.NewWebTaskPage_New_Task);
+
+ setTitle(Messages.NewWebTaskPage_Create_via_Web_Browser);
+ setDescription(Messages.NewWebTaskPage_This_will_open_a_web_browser_that_can_be_used_to_create_a_new_task);
+
+ // TODO display selection
+ }
+
+ public void createControl(Composite parent) {
+ Text text = new Text(parent, SWT.WRAP);
+ text.setEditable(false);
+ text.setText(Messages.NewWebTaskPage_Once_submitted_synchronize_queries_or_add_the_task_to_a_category);
+ setControl(text);
+ Dialog.applyDialogFont(text);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryConnectorPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryConnectorPage.java
new file mode 100644
index 0000000..cf8ccfe
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryConnectorPage.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Mik Kersten
+ * @author David Green
+ */
+public class SelectRepositoryConnectorPage extends WizardPage {
+
+ private TableViewer viewer;
+
+ private AbstractRepositoryConnector connector;
+
+ static class RepositoryContentProvider implements IStructuredContentProvider {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ List<AbstractRepositoryConnector> userManagedRepositories = new ArrayList<AbstractRepositoryConnector>();
+ for (AbstractRepositoryConnector connector : TasksUi.getRepositoryManager().getRepositoryConnectors()) {
+ if (connector.isUserManaged()) {
+ userManagedRepositories.add(connector);
+ }
+ }
+
+ return userManagedRepositories.toArray();
+ }
+ }
+
+ public SelectRepositoryConnectorPage() {
+ super(Messages.SelectRepositoryConnectorPage_Select_a_task_repository_type);
+ setTitle(Messages.SelectRepositoryConnectorPage_Select_a_task_repository_type);
+ setDescription(Messages.SelectRepositoryConnectorPage_You_can_connect_to_an_existing_account_using_one_of_the_installed_connectors);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return connector != null;
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayoutFactory.fillDefaults().numColumns(1).spacing(0, 3).applyTo(container);
+
+ viewer = new TableViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new RepositoryContentProvider());
+ viewer.setSorter(new TaskRepositoriesSorter());
+ viewer.setLabelProvider(new TaskRepositoryLabelProvider());
+ viewer.setInput(TasksUi.getRepositoryManager().getRepositoryConnectors());
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ if (selection.getFirstElement() instanceof AbstractRepositoryConnector) {
+ connector = (AbstractRepositoryConnector) selection.getFirstElement();
+ setPageComplete(true);
+ }
+ }
+
+ });
+
+ viewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ getContainer().showPage(getNextPage());
+ }
+ });
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getControl());
+
+ // add a hyperlink for connector discovery if it's available and enabled.
+
+ // we integrate with discovery via a well-known command, which when invoked launches the discovery wizard
+ final Command discoveryWizardCommand = TasksUiInternal.getConfiguredDiscoveryWizardCommand();
+ if (discoveryWizardCommand != null && discoveryWizardCommand.isEnabled()) {
+ Button discoveryButton = new Button(container, SWT.PUSH);
+ GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.CENTER).applyTo(discoveryButton);
+ discoveryButton.setText(Messages.SelectRepositoryConnectorPage_activateDiscovery);
+ discoveryButton.setImage(CommonImages.getImage(CommonImages.DISCOVERY));
+ discoveryButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(
+ IHandlerService.class);
+ try {
+ discoveryWizardCommand.executeWithChecks(createExecutionEvent(discoveryWizardCommand,
+ handlerService));
+ } catch (Exception e) {
+ IStatus status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ Messages.SelectRepositoryConnectorPage_discoveryProblemMessage,
+ new Object[] { e.getMessage() }), e);
+ TasksUiInternal.logAndDisplayStatus(
+ Messages.SelectRepositoryConnectorPage_discoveryProblemTitle, status);
+ }
+ }
+ });
+ }
+
+ Dialog.applyDialogFont(container);
+ setControl(container);
+ }
+
+ static ExecutionEvent createExecutionEvent(Command command, IHandlerService handlerService) {
+ return new ExecutionEvent(command, Collections.emptyMap(), null,
+ TasksUiInternal.createDiscoveryWizardEvaluationContext(handlerService));
+ }
+
+ public AbstractRepositoryConnector getConnector() {
+ return connector;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java
new file mode 100644
index 0000000..050df7c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/SelectRepositoryPage.java
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Brock Janiczak - improvements
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.wizards;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardNode;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardSelectionPage;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.ITaskRepositoryFilter;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AddRepositoryAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesSorter;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * @author Mik Kersten
+ * @author Brock Janiczak
+ * @author Steffen Pingel
+ * @author Eugene Kuleshov
+ */
+public abstract class SelectRepositoryPage extends WizardSelectionPage {
+
+ private TableViewer viewer;
+
+ protected MultiRepositoryAwareWizard wizard;
+
+ private List<TaskRepository> repositories = new ArrayList<TaskRepository>();
+
+ private final ITaskRepositoryFilter taskRepositoryFilter;
+
+ class RepositoryContentProvider implements IStructuredContentProvider {
+
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object parent) {
+ return repositories.toArray();
+ }
+ }
+
+ public SelectRepositoryPage(ITaskRepositoryFilter taskRepositoryFilter) {
+ super(Messages.SelectRepositoryPage_Select_a_repository);
+
+ setTitle(Messages.SelectRepositoryPage_Select_a_repository);
+ setDescription(MessageFormat.format(Messages.SelectRepositoryPage_Add_new_repositories_using_the_X_view,
+ org.eclipse.mylyn.internal.tasks.ui.Messages.TasksUiPlugin_Task_Repositories));
+
+ this.taskRepositoryFilter = taskRepositoryFilter;
+ this.repositories = getTaskRepositories();
+ }
+
+ public List<TaskRepository> getTaskRepositories() {
+ List<TaskRepository> repositories = new ArrayList<TaskRepository>();
+ TaskRepositoryManager repositoryManager = TasksUiPlugin.getRepositoryManager();
+ for (AbstractRepositoryConnector connector : repositoryManager.getRepositoryConnectors()) {
+ Set<TaskRepository> connectorRepositories = repositoryManager.getRepositories(connector.getConnectorKind());
+ for (TaskRepository repository : connectorRepositories) {
+ if (taskRepositoryFilter.accept(repository, connector)) {
+ repositories.add(repository);
+ }
+ }
+ }
+ return repositories;
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, true);
+ container.setLayout(layout);
+
+ Table table = createTableViewer(container);
+ viewer.setSorter(new TaskRepositoriesSorter());
+
+ GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
+ table.setLayoutData(gridData);
+
+ Composite buttonContainer = new Composite(container, SWT.NULL);
+ GridLayout buttonLayout = new GridLayout(2, false);
+ buttonContainer.setLayout(buttonLayout);
+
+ final AddRepositoryAction action = new AddRepositoryAction();
+ action.setPromptToAddQuery(false);
+
+ Button button = new Button(buttonContainer, SWT.NONE);
+ button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+ button.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_NEW));
+ button.setText(AddRepositoryAction.TITLE);
+ button.setEnabled(action.isEnabled());
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ TaskRepository taskRepository = action.showWizard();
+ if (taskRepository != null) {
+ SelectRepositoryPage.this.repositories = getTaskRepositories();
+ viewer.setInput(TasksUi.getRepositoryManager().getRepositoryConnectors());
+ viewer.setSelection(new StructuredSelection(taskRepository));
+ }
+ }
+ });
+
+ final Command discoveryWizardCommand = TasksUiInternal.getConfiguredDiscoveryWizardCommand();
+ if (discoveryWizardCommand != null && discoveryWizardCommand.isEnabled()) {
+ Button discoveryButton = new Button(buttonContainer, SWT.PUSH);
+ GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.CENTER).applyTo(discoveryButton);
+ discoveryButton.setText(Messages.SelectRepositoryConnectorPage_activateDiscovery);
+ discoveryButton.setImage(CommonImages.getImage(CommonImages.DISCOVERY));
+ discoveryButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(
+ IHandlerService.class);
+ try {
+ discoveryWizardCommand.executeWithChecks(SelectRepositoryConnectorPage.createExecutionEvent(
+ discoveryWizardCommand, handlerService));
+ } catch (Exception e) {
+ IStatus status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ Messages.SelectRepositoryConnectorPage_discoveryProblemMessage,
+ new Object[] { e.getMessage() }), e);
+ TasksUiInternal.logAndDisplayStatus(
+ Messages.SelectRepositoryConnectorPage_discoveryProblemTitle, status);
+ }
+ }
+ });
+ }
+
+ Dialog.applyDialogFont(container);
+ setControl(container);
+ }
+
+ protected Table createTableViewer(Composite container) {
+ viewer = new TableViewer(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new RepositoryContentProvider());
+ // viewer.setLabelProvider(new TaskRepositoryLabelProvider());
+ viewer.setLabelProvider(new DecoratingLabelProvider(new TaskRepositoryLabelProvider(),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
+ viewer.setInput(TasksUi.getRepositoryManager().getRepositoryConnectors());
+
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ if (selection.getFirstElement() instanceof TaskRepository) {
+ setSelectedNode(new CustomWizardNode((TaskRepository) selection.getFirstElement()));
+ setPageComplete(true);
+ } else {
+ setPageComplete(false);
+ }
+ }
+ });
+
+ TaskRepository selectedRepository = TasksUiUtil.getSelectedRepository(null);
+ if (selectedRepository != null) {
+ viewer.setSelection(new StructuredSelection(selectedRepository));
+ } else {
+ TaskRepository localRepository = TasksUi.getRepositoryManager().getRepository(
+ LocalRepositoryConnector.CONNECTOR_KIND, LocalRepositoryConnector.REPOSITORY_URL);
+ viewer.setSelection(new StructuredSelection(localRepository));
+ }
+
+ viewer.addOpenListener(new IOpenListener() {
+
+ public void open(OpenEvent event) {
+ if (canFlipToNextPage()) {
+ getContainer().showPage(getNextPage());
+ } else if (canFinish()) {
+ if (getWizard().performFinish()) {
+ ((WizardDialog) getContainer()).close();
+ }
+ }
+ }
+ });
+
+ viewer.getTable().showSelection();
+ viewer.getTable().setFocus();
+ return viewer.getTable();
+ }
+
+ protected abstract IWizard createWizard(TaskRepository taskRepository);
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return getSelectedNode() != null && getNextPage() != null;
+ }
+
+ public boolean canFinish() {
+ return getSelectedNode() != null && getNextPage() == null;
+ }
+
+ public boolean performFinish() {
+ if (getSelectedNode() == null || getNextPage() != null) {
+ // finish event will get forwarded to nested wizard
+ // by container
+ return false;
+ }
+
+ return getSelectedNode().getWizard().performFinish();
+ }
+
+ private class CustomWizardNode implements IWizardNode {
+
+ private final TaskRepository repository;
+
+ private IWizard wizard;
+
+ public CustomWizardNode(TaskRepository repository) {
+ this.repository = repository;
+ }
+
+ public void dispose() {
+ if (wizard != null) {
+ wizard.dispose();
+ }
+ }
+
+ public Point getExtent() {
+ return new Point(-1, -1);
+ }
+
+ public IWizard getWizard() {
+ if (wizard == null) {
+ wizard = SelectRepositoryPage.this.createWizard(repository);
+ if (wizard != null) {
+ wizard.setContainer(getContainer());
+ }
+ }
+ return wizard;
+ }
+
+ public boolean isContentCreated() {
+ return wizard != null;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof CustomWizardNode)) {
+ return false;
+ }
+ CustomWizardNode that = (CustomWizardNode) obj;
+ if (this == that) {
+ return true;
+ }
+
+ return this.repository.getConnectorKind().equals(that.repository.getConnectorKind())
+ && this.repository.getRepositoryUrl().equals(that.repository.getRepositoryUrl());
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * this.repository.getRepositoryUrl().hashCode() + this.repository.getConnectorKind().hashCode();
+ }
+
+ }
+
+ /**
+ * Public for testing.
+ */
+ public TableViewer getViewer() {
+ return viewer;
+ }
+
+ /**
+ * Public for testing.
+ */
+ public List<TaskRepository> getRepositories() {
+ return repositories;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskAttachmentWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskAttachmentWizard.java
new file mode 100644
index 0000000..11eac90
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskAttachmentWizard.java
@@ -0,0 +1,428 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ScreenshotCreationPage;
+import org.eclipse.mylyn.internal.tasks.core.sync.SubmitTaskAttachmentJob;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJobEvent;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJobListener;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.ImageLoader;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A wizard to add a new attachment to a task report.
+ *
+ * @since 3.0
+ * @author Steffen Pingel
+ */
+public class TaskAttachmentWizard extends Wizard {
+
+ static class ClipboardTaskAttachmentSource extends AbstractTaskAttachmentSource {
+
+ private byte[] data;
+
+ public static boolean isSupportedType(Display display) {
+ Clipboard clipboard = new Clipboard(display);
+ TransferData[] types = clipboard.getAvailableTypes();
+ for (TransferData transferData : types) {
+ List<Transfer> transfers = getTransfers();
+ for (Transfer transfer : transfers) {
+ if (transfer.isSupportedType(transferData)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private static List<Transfer> transfers;
+
+ private static List<Transfer> getTransfers() {
+ if (transfers != null) {
+ return transfers;
+ }
+
+ transfers = new ArrayList<Transfer>();
+ try {
+ Class<?> clazz = Class.forName("org.eclipse.swt.dnd.ImageTransfer"); //$NON-NLS-1$
+ Method method = clazz.getMethod("getInstance"); //$NON-NLS-1$
+ if (method != null) {
+ transfers.add((Transfer) method.invoke(null));
+ }
+ } catch (Exception e) {
+ // ignore
+ } catch (LinkageError e) {
+ // ignore
+ }
+ transfers.add(TextTransfer.getInstance());
+ return transfers;
+ }
+
+ private Object contents;
+
+ public ClipboardTaskAttachmentSource() {
+ BusyIndicator.showWhile(PlatformUI.getWorkbench().getDisplay(), new Runnable() {
+ public void run() {
+ Clipboard clipboard = new Clipboard(PlatformUI.getWorkbench().getDisplay());
+ List<Transfer> transfers = getTransfers();
+ for (Transfer transfer : transfers) {
+ contents = clipboard.getContents(transfer);
+ if (contents != null) {
+ break;
+ }
+ }
+ clipboard.dispose();
+ }
+ });
+ }
+
+ @Override
+ public InputStream createInputStream(IProgressMonitor monitor) throws CoreException {
+ byte[] bytes = getData();
+ if (bytes != null) {
+ return new ByteArrayInputStream(data);
+ }
+ throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Invalid content type.")); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getContentType() {
+ if (contents instanceof String) {
+ return "text/plain"; //$NON-NLS-1$
+ } else if (contents instanceof ImageData) {
+ return "image/png"; //$NON-NLS-1$
+ }
+ return "application/octet-stream"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getDescription() {
+ return null;
+ }
+
+ @Override
+ public long getLength() {
+ byte[] bytes = getData();
+ return (bytes != null) ? bytes.length : -1;
+ }
+
+ private byte[] getData() {
+ if (data == null) {
+ if (contents instanceof String) {
+ data = ((String) contents).getBytes();
+ } else if (contents instanceof ImageData) {
+ ImageLoader loader = new ImageLoader();
+ loader.data = new ImageData[] { (ImageData) contents };
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ loader.save(out, SWT.IMAGE_PNG);
+ data = out.toByteArray();
+ }
+ }
+ return data;
+ }
+
+ @Override
+ public String getName() {
+ if (contents instanceof String) {
+ return "clipboard.txt"; //$NON-NLS-1$
+ } else if (contents instanceof ImageData) {
+ return "clipboard.png"; //$NON-NLS-1$
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+
+ };
+
+ static class ImageSource extends AbstractTaskAttachmentSource {
+
+ private File file;
+
+ private final ScreenshotCreationPage page;
+
+ public ImageSource(ScreenshotCreationPage page) {
+ this.page = page;
+ }
+
+ @Override
+ public InputStream createInputStream(IProgressMonitor monitor) throws CoreException {
+ try {
+ if (file == null || page.isImageDirty()) {
+ Image image = page.createImage();
+ page.setImageDirty(false);
+ try {
+ file = File.createTempFile("screenshot", ".png"); //$NON-NLS-1$ //$NON-NLS-2$
+ file.deleteOnExit();
+ ImageLoader loader = new ImageLoader();
+ loader.data = new ImageData[] { image.getImageData() };
+ // TODO create image in memory?
+ FileOutputStream out = new FileOutputStream(file);
+ try {
+ loader.save(out, SWT.IMAGE_PNG);
+ } finally {
+ out.close();
+ }
+ } finally {
+ image.dispose();
+ }
+ }
+ return new FileInputStream(file);
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ }
+
+ @Override
+ public String getContentType() {
+ return "image/png"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getDescription() {
+ return Messages.TaskAttachmentWizard_Screenshot;
+ }
+
+ @Override
+ public long getLength() {
+ return (file != null) ? file.length() : -1;
+ }
+
+ @Override
+ public String getName() {
+ return "screenshot.png"; //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean isLocal() {
+ return true;
+ }
+
+ }
+
+ public enum Mode {
+ DEFAULT, SCREENSHOT
+ }
+
+ private static final String DIALOG_SETTINGS_KEY = "AttachmentWizard"; //$NON-NLS-1$
+
+ private final AbstractRepositoryConnector connector;
+
+ private IWizardPage editPage;
+
+ private Mode mode = Mode.DEFAULT;
+
+ private final TaskAttachmentModel model;
+
+ private AttachmentPreviewPage previewPage;
+
+ public TaskAttachmentWizard(TaskRepository taskRepository, ITask task, TaskAttribute taskAttachment) {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(taskAttachment);
+ this.model = new TaskAttachmentModel(taskRepository, task, taskAttachment);
+ this.connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(taskRepository.getConnectorKind());
+ setMode(Mode.DEFAULT);
+ setNeedsProgressMonitor(true);
+ setDialogSettings(TasksUiPlugin.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS_KEY));
+ }
+
+ @Override
+ public void addPages() {
+ if (model.getSource() == null) {
+ if (mode == Mode.SCREENSHOT) {
+ ScreenshotCreationPage page = new ScreenshotCreationPage();
+ ImageSource source = new ImageSource(page);
+ model.setSource(source);
+ model.setContentType(source.getContentType());
+ addPage(page);
+ } else {
+ addPage(new AttachmentSourcePage(model));
+ }
+ }
+
+ previewPage = new AttachmentPreviewPage(model);
+ addPage(previewPage);
+
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(model.getTaskRepository()
+ .getConnectorKind());
+ editPage = connectorUi.getTaskAttachmentPage(model);
+ addPage(editPage);
+
+ }
+
+ public Mode getMode() {
+ return mode;
+ }
+
+ public TaskAttachmentModel getModel() {
+ return model;
+ }
+
+ public AbstractTaskAttachmentSource getSource() {
+ return model.getSource();
+ }
+
+ private void handleDone(SubmitJob job) {
+ IStatus status = job.getStatus();
+ if (status != null && status.getSeverity() != IStatus.CANCEL) {
+ TasksUiInternal.displayStatus(Messages.TaskAttachmentWizard_Attachment_Failed, job.getStatus());
+ }
+ }
+
+ @Override
+ public boolean canFinish() {
+ // InputAttachmentSourcePage relies on getNextPage() being called, do not allow wizard to finish on first page
+ if (getContainer() != null && getContainer().getCurrentPage() instanceof AttachmentSourcePage) {
+ return false;
+ }
+ return super.canFinish();
+ }
+
+ @Override
+ public boolean performFinish() {
+ SubmitJob job = TasksUiInternal.getJobFactory()
+ .createSubmitTaskAttachmentJob(connector, model.getTaskRepository(), model.getTask(),
+ model.getSource(), model.getComment(), model.getAttribute());
+ final boolean attachContext = model.getAttachContext();
+ job.addSubmitJobListener(new SubmitJobListener() {
+ @Override
+ public void done(SubmitJobEvent event) {
+ // ignore
+ }
+
+ @Override
+ public void taskSubmitted(SubmitJobEvent event, IProgressMonitor monitor) throws CoreException {
+ if (attachContext) {
+ monitor.subTask(Messages.TaskAttachmentWizard_Attaching_context);
+ AttachmentUtil.postContext(connector, model.getTaskRepository(), model.getTask(), null, null,
+ monitor);
+ }
+ }
+
+ @Override
+ public void taskSynchronized(SubmitJobEvent event, IProgressMonitor monitor) throws CoreException {
+ // ignore
+ }
+ });
+ if (previewPage.runInBackground()) {
+ runInBackground(job);
+ return false;
+ } else {
+ return runInWizard(job);
+ }
+ }
+
+ private void runInBackground(final SubmitJob job) {
+ getContainer().getShell().setVisible(false);
+ job.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void done(IJobChangeEvent event) {
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (job.getStatus() != null) {
+ getContainer().getShell().setVisible(true);
+ }
+ handleDone(job);
+ if (job.getStatus() == null) {
+ getContainer().getShell().close();
+ }
+ }
+ });
+ }
+ });
+ job.schedule();
+ }
+
+ private boolean runInWizard(final SubmitJob job) {
+ try {
+ getContainer().run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ if (((SubmitTaskAttachmentJob) job).run(monitor) == Status.CANCEL_STATUS) {
+ throw new InterruptedException();
+ }
+ }
+ });
+ handleDone(job);
+ return job.getStatus() == null;
+ } catch (InvocationTargetException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unexpected error", e)); //$NON-NLS-1$
+ return false;
+ } catch (InterruptedException e) {
+ // canceled
+ return false;
+ }
+ }
+
+ public void setMode(Mode mode) {
+ this.mode = mode;
+ if (mode == Mode.SCREENSHOT) {
+ setWindowTitle(Messages.TaskAttachmentWizard_Attach_Screenshot);
+ setDefaultPageImageDescriptor(CommonImages.BANNER_SCREENSHOT);
+ } else {
+ setWindowTitle(Messages.TaskAttachmentWizard_Add_Attachment);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ }
+ }
+
+ public void setSource(AbstractTaskAttachmentSource source) {
+ this.model.setSource(source);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataExportWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataExportWizard.java
new file mode 100644
index 0000000..a0284d1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataExportWizard.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportOperation;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.ui.IExportWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * Wizard for exporting tasklist data files to the file system. This wizard uses a single page: TaskDataExportWizardPage
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ */
+public class TaskDataExportWizard extends Wizard implements IExportWizard {
+
+ /**
+ * The name of the dialog store's section associated with the task data export wizard
+ */
+ private final static String SETTINGS_SECTION = "org.eclipse.mylyn.tasklist.ui.exportWizard"; //$NON-NLS-1$
+
+ private TaskDataExportWizardPage exportPage = null;
+
+ public TaskDataExportWizard() {
+ IDialogSettings masterSettings = TasksUiPlugin.getDefault().getDialogSettings();
+ setDialogSettings(getSettingsSection(masterSettings));
+ setNeedsProgressMonitor(true);
+ setWindowTitle(Messages.TaskDataExportWizard_Export);
+ }
+
+ /**
+ * Finds or creates a dialog settings section that is used to make the dialog control settings persistent
+ */
+ private IDialogSettings getSettingsSection(IDialogSettings master) {
+ IDialogSettings settings = master.getSection(SETTINGS_SECTION);
+ if (settings == null) {
+ settings = master.addNewSection(SETTINGS_SECTION);
+ }
+ return settings;
+ }
+
+ @Override
+ public void addPages() {
+ exportPage = new TaskDataExportWizardPage();
+ addPage(exportPage);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // no initialization needed
+ }
+
+ /**
+ * Called when the user clicks finish. Saves the task data. Waits until all overwrite decisions have been made
+ * before starting to save files. If any overwrite is canceled, no files are saved and the user must adjust the
+ * dialog.
+ */
+ @Override
+ public boolean performFinish() {
+ String destDir = exportPage.getDestinationDirectory();
+
+ final File destZipFile = new File(destDir + File.separator + TaskListBackupManager.getBackupFileName());
+
+ TaskDataExportOperation job = new TaskDataExportOperation(exportPage.getDestinationDirectory(),
+ destZipFile.getName());
+
+ try {
+ if (getContainer() != null) {
+ getContainer().run(true, true, job);
+ } else {
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ service.run(true, true, job);
+ }
+ } catch (InvocationTargetException e) {
+ Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e);
+ TasksUiInternal.logAndDisplayStatus(Messages.TaskDataExportWizard_export_failed, status);
+ } catch (InterruptedException e) {
+ // user canceled
+ }
+
+ exportPage.saveSettings();
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataExportWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataExportWizardPage.java
new file mode 100644
index 0000000..04cf7e4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataExportWizardPage.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListBackupManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * Wizard Page for the Task Data Export Wizard
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class TaskDataExportWizardPage extends WizardPage {
+
+ private static final String PAGE_ID = "org.eclipse.mylyn.tasklist.exportPage"; //$NON-NLS-1$
+
+ private Button browseButton = null;
+
+ private Text destDirText = null;
+
+ // Key values for the dialog settings object
+ private final static String SETTINGS_SAVED = "Settings saved"; //$NON-NLS-1$
+
+ private final static String DEST_DIR_SETTING = "Destination directory setting"; //$NON-NLS-1$
+
+ public TaskDataExportWizardPage() {
+ super(PAGE_ID);
+ setPageComplete(false);
+ setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(TasksUiPlugin.ID_PLUGIN,
+ "icons/wizban/banner-export.gif")); //$NON-NLS-1$
+ setTitle(Messages.TaskDataExportWizardPage_Export_Mylyn_Task_Data);
+ }
+
+ /**
+ * Create the widgets on the page
+ */
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+ createExportDirectoryControl(container);
+
+ initSettings();
+
+ Dialog.applyDialogFont(container);
+ setControl(container);
+ setPageComplete(validate());
+ }
+
+ /**
+ * Create widgets for specifying the destination directory
+ */
+ private void createExportDirectoryControl(Composite parent) {
+ parent.setLayout(new GridLayout(3, false));
+ parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ new Label(parent, SWT.NONE).setText(Messages.TaskDataExportWizardPage_File);
+ Label l = new Label(parent, SWT.NONE);
+ l.setText(TaskListBackupManager.getBackupFileName());
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 2;
+ l.setLayoutData(gd);
+ new Label(parent, SWT.NONE).setText(Messages.TaskDataExportWizardPage_Folder);
+
+ destDirText = new Text(parent, SWT.BORDER);
+ destDirText.setEditable(false);
+ destDirText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ destDirText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ controlChanged();
+ }
+ });
+
+ browseButton = new Button(parent, SWT.PUSH);
+ browseButton.setText(Messages.TaskDataExportWizardPage_Browse_);
+ browseButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ DirectoryDialog dialog = new DirectoryDialog(getShell());
+ dialog.setText(Messages.TaskDataExportWizardPage_Folder_Selection);
+ dialog.setMessage(Messages.TaskDataExportWizardPage_Specify_the_destination_folder_for_task_data);
+ String dir = destDirText.getText();
+ dialog.setFilterPath(dir);
+ dir = dialog.open();
+ if (dir == null || dir.equals("")) { //$NON-NLS-1$
+ return;
+ }
+ destDirText.setText(dir);
+ controlChanged();
+ }
+ });
+ }
+
+ /**
+ * Initializes controls with values from the Dialog Settings object
+ */
+ protected void initSettings() {
+ IDialogSettings settings = getDialogSettings();
+
+ if (settings.get(SETTINGS_SAVED) == null) {
+ destDirText.setText(""); //$NON-NLS-1$
+ } else {
+ String directory = settings.get(DEST_DIR_SETTING);
+ if (directory != null) {
+ destDirText.setText(settings.get(DEST_DIR_SETTING));
+ }
+ }
+ }
+
+ /**
+ * Saves the control values in the dialog settings to be used as defaults the next time the page is opened
+ */
+ public void saveSettings() {
+ IDialogSettings settings = getDialogSettings();
+ settings.put(DEST_DIR_SETTING, destDirText.getText());
+ settings.put(SETTINGS_SAVED, SETTINGS_SAVED);
+ }
+
+ /** Called to indicate that a control's value has changed */
+ public void controlChanged() {
+ setPageComplete(validate());
+ }
+
+ /** Returns true if the information entered by the user is valid */
+ protected boolean validate() {
+ setMessage(null);
+
+ // Check that a destination dir has been specified
+ if (destDirText.getText().equals("")) { //$NON-NLS-1$
+ setMessage(Messages.TaskDataExportWizardPage_Please_choose_an_export_destination, IStatus.WARNING);
+ return false;
+ }
+
+ return true;
+ }
+
+ /** Returns the directory where data files are to be saved */
+ public String getDestinationDirectory() {
+ return destDirText.getText();
+ }
+
+ /** For testing only. Sets controls to the specified values */
+ public void setDestinationDirectory(String destinationDir) {
+ destDirText.setText(destinationDir);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataImportWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataImportWizard.java
new file mode 100644
index 0000000..1809e58
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataImportWizard.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import java.io.File;
+import java.io.IOException;
+import com.ibm.icu.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.commons.core.CoreUtil;
+import org.eclipse.mylyn.internal.commons.core.ZipFileUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.externalization.AbstractExternalizationParticipant;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Rob Elves
+ */
+ at SuppressWarnings("restriction")
+public class TaskDataImportWizard extends Wizard implements IImportWizard {
+
+ private TaskDataImportWizardPage importPage = null;
+
+ public TaskDataImportWizard() {
+ IDialogSettings masterSettings = TasksUiPlugin.getDefault().getDialogSettings();
+ setDialogSettings(getSettingsSection(masterSettings));
+ setNeedsProgressMonitor(true);
+ setWindowTitle(Messages.TaskDataImportWizard_Import);
+ }
+
+ /**
+ * Finds or creates a dialog settings section that is used to make the dialog control settings persistent
+ */
+ private IDialogSettings getSettingsSection(IDialogSettings master) {
+ IDialogSettings settings = master.getSection("org.eclipse.mylyn.tasklist.ui.importWizard"); //$NON-NLS-1$
+ if (settings == null) {
+ settings = master.addNewSection("org.eclipse.mylyn.tasklist.ui.importWizard"); //$NON-NLS-1$
+ }
+ return settings;
+ }
+
+ @Override
+ public void addPages() {
+ importPage = new TaskDataImportWizardPage();
+ importPage.setWizard(this);
+ addPage(importPage);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // no initialization needed
+ }
+
+ @Override
+ public boolean canFinish() {
+ return importPage.isPageComplete();
+ }
+
+ @Override
+ public boolean performFinish() {
+
+ TasksUi.getTaskActivityManager().deactivateTask(TasksUi.getTaskActivityManager().getActiveTask());
+
+ String sourceZip = importPage.getSourceZipFile();
+ final File sourceZipFile = new File(sourceZip);
+
+ if (!sourceZipFile.exists()) {
+ MessageDialog.openError(getShell(), Messages.TaskDataImportWizard_File_not_found, sourceZipFile.toString()
+ + Messages.TaskDataImportWizard_could_not_be_found);
+ return false;
+ } else if (!CoreUtil.TEST_MODE
+ && !MessageDialog.openConfirm(getShell(), Messages.TaskDataImportWizard_confirm_overwrite,
+ Messages.TaskDataImportWizard_existing_task_data_about_to_be_erased_proceed)) {
+ return false;
+ }
+
+ try {
+ if (getContainer() != null) {
+ CommonUiUtil.run(getContainer(), new FileCopyJob(sourceZipFile));
+ } else {
+ CommonUiUtil.busyCursorWhile(new FileCopyJob(sourceZipFile));
+ }
+
+ importPage.saveSettings();
+ } catch (CoreException e) {
+ Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Problems encountered importing task data: {0}", e.getMessage()), e); //$NON-NLS-1$
+ TasksUiInternal.logAndDisplayStatus(Messages.TaskDataImportWizard_task_data_import_failed, status);
+ } catch (OperationCanceledException e) {
+ // canceled
+ }
+
+ return true;
+ }
+
+ /** Job that performs the file copying and zipping */
+ class FileCopyJob implements ICoreRunnable {
+
+ private static final String PREFIX_BACKUP = ".backup-"; //$NON-NLS-1$
+
+ private final String JOB_LABEL = Messages.TaskDataImportWizard_Importing_Data;
+
+ private File sourceZipFile = null;
+
+ private int numEntries = 0;
+
+ private boolean restoreM2Tasklist = false;
+
+ public FileCopyJob(File sourceZipFile) {
+ this.sourceZipFile = sourceZipFile;
+ }
+
+ public void run(final IProgressMonitor monitor) throws CoreException {
+
+ try {
+
+ checkZipFile();
+
+ if (numEntries > 0) {
+
+ monitor.beginTask(JOB_LABEL, numEntries);
+ Job.getJobManager().beginRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE, monitor);
+
+ if (monitor.isCanceled()) {
+ return;
+ }
+
+ ZipFileUtil.unzipFiles(sourceZipFile, TasksUiPlugin.getDefault().getDataDirectory(), monitor);
+
+ if (restoreM2Tasklist) {
+
+ SimpleDateFormat format = new SimpleDateFormat(ITasksCoreConstants.FILENAME_TIMESTAMP_FORMAT,
+ Locale.ENGLISH);
+ String date = format.format(new Date());
+
+ File taskListFile = new File(TasksUiPlugin.getDefault().getDataDirectory(),
+ ITasksCoreConstants.DEFAULT_TASK_LIST_FILE);
+ if (taskListFile.exists()) {
+ taskListFile.renameTo(new File(taskListFile.getParentFile(), taskListFile.getName()
+ + PREFIX_BACKUP + date));
+ }
+
+ File taskListFileSnapshot = new File(TasksUiPlugin.getDefault().getDataDirectory(),
+ AbstractExternalizationParticipant.SNAPSHOT_PREFIX
+ + ITasksCoreConstants.DEFAULT_TASK_LIST_FILE);
+ if (taskListFileSnapshot.exists()) {
+ taskListFileSnapshot.renameTo(new File(taskListFile.getParentFile(),
+ taskListFileSnapshot.getName() + PREFIX_BACKUP + date));
+ }
+
+ }
+ readTaskListData();
+ }
+ } catch (IOException e) {
+ Status status = new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e);
+ throw new CoreException(status);
+ } finally {
+ Job.getJobManager().endRule(ITasksCoreConstants.ROOT_SCHEDULING_RULE);
+ monitor.done();
+ }
+ }
+
+ private void checkZipFile() throws IOException {
+ Enumeration<? extends ZipEntry> entries;
+ ZipFile zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ);
+ try {
+ entries = zipFile.entries();
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = entries.nextElement();
+ if (entry.getName().startsWith(ITasksCoreConstants.OLD_TASK_LIST_FILE)) {
+ restoreM2Tasklist = true;
+ }
+ numEntries++;
+ }
+ } finally {
+ zipFile.close();
+ }
+ }
+
+ }
+
+ private void readTaskListData() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ try {
+ TasksUiPlugin.getDefault().reloadDataDirectory();
+ } catch (CoreException e) {
+ TasksUiInternal.displayStatus(Messages.TaskDataImportWizard_Import_Error, e.getStatus());
+ }
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataImportWizardPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataImportWizardPage.java
new file mode 100644
index 0000000..02fe51e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/TaskDataImportWizardPage.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.wizards;
+
+import java.io.File;
+import com.ibm.icu.text.DateFormat;
+import java.util.SortedMap;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Wizard Page for the Task Data Import Wizard
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten
+ * @author Rob Elves (Adaption to Import wizard)
+ */
+public class TaskDataImportWizardPage extends WizardPage {
+
+ private Button browseButtonZip = null;
+
+ private Text sourceZipText = null;
+
+ private Button importViaBackupButton;
+
+ private Button importViaZipButton;
+
+ private Table backupFilesTable;
+
+ // Key values for the dialog settings object
+ private final static String SETTINGS_SAVED = Messages.TaskDataImportWizardPage_Import_Settings_saved;
+
+ private final static String SOURCE_ZIP_SETTING = Messages.TaskDataImportWizardPage_Import_Source_zip_file_setting;
+
+ private final static String IMPORT_ZIPMETHOD_SETTING = Messages.TaskDataImportWizardPage_Import_method_zip;
+
+ private final static String IMPORT_BACKUPMETHOD_SETTING = Messages.TaskDataImportWizardPage_Import_method_backup;
+
+ public TaskDataImportWizardPage() {
+ super("org.eclipse.mylyn.tasklist.importPage"); //$NON-NLS-1$
+ setPageComplete(false);
+ setMessage(Messages.TaskDataImportWizardPage_Importing_overwrites_current_tasks_and_repositories,
+ IMessageProvider.WARNING);
+ setImageDescriptor(CommonImages.BANNER_IMPORT);
+ setTitle(Messages.TaskDataImportWizardPage_Restore_tasks_from_history);
+ }
+
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(3, false);
+ layout.verticalSpacing = 15;
+ container.setLayout(layout);
+ createImportFromZipControl(container);
+ createImportFromBackupControl(container);
+ addRadioListeners();
+ initSettings();
+ Dialog.applyDialogFont(container);
+ setControl(container);
+ setPageComplete(validate());
+ }
+
+ private void addRadioListeners() {
+ SelectionListener radioListener = new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ browseButtonZip.setEnabled(importViaZipButton.getSelection());
+ backupFilesTable.setEnabled(importViaBackupButton.getSelection());
+ sourceZipText.setEnabled(importViaZipButton.getSelection());
+ controlChanged();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+
+ }
+ };
+
+ importViaZipButton.addSelectionListener(radioListener);
+ importViaBackupButton.addSelectionListener(radioListener);
+ }
+
+ /**
+ * Create widgets for specifying the source zip
+ */
+ private void createImportFromZipControl(Composite parent) {
+
+ importViaZipButton = new Button(parent, SWT.RADIO);
+ importViaZipButton.setText(Messages.TaskDataImportWizardPage_From_zip_file);
+
+ sourceZipText = new Text(parent, SWT.BORDER);
+ sourceZipText.setEditable(true);
+ GridDataFactory.fillDefaults().grab(true, false).hint(250, SWT.DEFAULT).applyTo(sourceZipText);
+ sourceZipText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ controlChanged();
+ }
+ });
+
+ browseButtonZip = new Button(parent, SWT.PUSH);
+ browseButtonZip.setText(Messages.TaskDataImportWizardPage_Browse_);
+ browseButtonZip.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog dialog = new FileDialog(getShell());
+ dialog.setText(Messages.TaskDataImportWizardPage_Zip_File_Selection);
+ String dir = sourceZipText.getText();
+ dialog.setFilterPath(dir);
+ dir = dialog.open();
+ if (dir == null || dir.equals("")) { //$NON-NLS-1$
+ return;
+ }
+ sourceZipText.setText(dir);
+ }
+ });
+
+ }
+
+ private void createImportFromBackupControl(Composite container) {
+
+ importViaBackupButton = new Button(container, SWT.RADIO);
+ importViaBackupButton.setText(Messages.TaskDataImportWizardPage_From_snapshot);
+ addBackupFileView(container);
+ }
+
+ private void addBackupFileView(Composite composite) {
+ backupFilesTable = new Table(composite, SWT.BORDER);
+ GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).grab(true, true).applyTo(backupFilesTable);
+
+ TableColumn filenameColumn = new TableColumn(backupFilesTable, SWT.LEFT);
+ filenameColumn.setWidth(200);
+
+ SortedMap<Long, File> backupFilesMap = TasksUiPlugin.getBackupManager().getBackupFiles();
+
+ for (Long time : backupFilesMap.keySet()) {
+ File file = backupFilesMap.get(time);
+ TableItem item = new TableItem(backupFilesTable, SWT.NONE);
+ item.setData(file.getAbsolutePath());
+ item.setText(DateFormat.getDateTimeInstance().format(time));
+ }
+
+ backupFilesTable.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ controlChanged();
+ }
+ });
+ }
+
+ /**
+ * Initializes controls with values from the Dialog Settings object
+ */
+ protected void initSettings() {
+ IDialogSettings settings = getDialogSettings();
+
+ if (settings.get(SETTINGS_SAVED) == null) {
+ importViaZipButton.setSelection(true);
+ sourceZipText.setEnabled(true);
+ backupFilesTable.setEnabled(false);
+
+ } else {
+ // Retrieve previous values from the dialog settings
+ importViaZipButton.setSelection(settings.getBoolean(IMPORT_ZIPMETHOD_SETTING));
+ importViaBackupButton.setSelection(settings.getBoolean(IMPORT_BACKUPMETHOD_SETTING));
+ browseButtonZip.setEnabled(importViaZipButton.getSelection());
+ sourceZipText.setEnabled(importViaZipButton.getSelection());
+
+ backupFilesTable.setEnabled(importViaBackupButton.getSelection());
+ String zipFile = settings.get(SOURCE_ZIP_SETTING);
+ if (zipFile != null) {
+ sourceZipText.setText(settings.get(SOURCE_ZIP_SETTING));
+ }
+ }
+ }
+
+ /**
+ * Saves the control values in the dialog settings to be used as defaults the next time the page is opened
+ */
+ public void saveSettings() {
+ IDialogSettings settings = getDialogSettings();
+
+ settings.put(IMPORT_ZIPMETHOD_SETTING, importViaZipButton.getSelection());
+ settings.put(IMPORT_BACKUPMETHOD_SETTING, importViaBackupButton.getSelection());
+ settings.put(SETTINGS_SAVED, SETTINGS_SAVED);
+ }
+
+ /** Called to indicate that a control's value has changed */
+ public void controlChanged() {
+ setPageComplete(validate());
+ }
+
+ /** Returns true if the information entered by the user is valid */
+ protected boolean validate() {
+ if (importViaZipButton.getSelection() && sourceZipText.getText().equals("")) { //$NON-NLS-1$
+ return false;
+ }
+ if (importViaBackupButton.getSelection() && backupFilesTable.getSelection().length == 0) {
+ return false;
+ }
+ return true;
+ }
+
+ public String getSourceZipFile() {
+ if (importViaZipButton.getSelection()) {
+ return sourceZipText.getText();
+ } else {
+ if (backupFilesTable.getSelectionIndex() != -1) {
+ return (String) (backupFilesTable.getSelection()[0].getData());
+ }
+ }
+ return Messages.TaskDataImportWizardPage__unspecified_;
+ }
+
+ /** For testing only. Sets controls to the specified values */
+ public void setSource(boolean zip, String sourceZip) {
+ sourceZipText.setText(sourceZip);
+ importViaZipButton.setSelection(zip);
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/messages.properties
new file mode 100644
index 0000000..d6c0494
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/wizards/messages.properties
@@ -0,0 +1,141 @@
+EditRepositoryWizard_Failed_to_refactor_repository_urls=Failed to refactor repository urls
+EditRepositoryWizard_Properties_for_Task_Repository=Properties for Task Repository
+
+AttachmentSourcePage__Clipboard_=<Clipboard>
+AttachmentSourcePage__Screenshot_=<Screenshot>
+AttachmentSourcePage_Browse_=Browse...
+AttachmentSourcePage_Cannot_locate_attachment_file=Cannot locate attachment file
+AttachmentSourcePage_Clipboard=Clipboard
+AttachmentSourcePage_Clipboard_contains_an_unsupported_data=Clipboard contains an unsupported data
+AttachmentSourcePage_Clipboard_supports_text_and_image_attachments_only=Clipboard supports text and image attachments only.
+AttachmentSourcePage_File=File
+AttachmentSourcePage_No_file_name=No file name
+AttachmentSourcePage_Select_attachment_source=Select attachment source
+AttachmentSourcePage_Select_the_location_of_the_attachment=Select the location of the attachment
+AttachmentSourcePage_Workspace=Workspace
+
+NewQueryWizard_New_Repository_Query=New Repository Query
+
+NewTaskWizard_New_Task=New Task
+
+NewWebTaskPage_Create_via_Web_Browser=Create via Web Browser
+NewWebTaskPage_New_Task=New Task
+NewWebTaskPage_Once_submitted_synchronize_queries_or_add_the_task_to_a_category=Once submitted synchronize queries or add the task to a category.\n
+NewWebTaskPage_This_will_open_a_web_browser_that_can_be_used_to_create_a_new_task=This will open a web browser that can be used to create a new task.\n\
+NOTE: you may need to log in via the web UI.
+
+AttachmentPreviewPage_A_preview_the_type_X_is_currently_not_available=Attaching File {0}\n\
+A preview the type {1} is currently not available
+AttachmentPreviewPage_Attachment_Preview=Attachment Preview
+AttachmentPreviewPage_Could_not_create_preview=Could not create preview
+AttachmentPreviewPage_Preparing_preview=Preparing preview
+AttachmentPreviewPage_Review_the_attachment_before_submitting=Review the attachment before submitting
+AttachmentPreviewPage_Run_in_background=Run in background
+
+SelectRepositoryConnectorPage_discoveryProblemMessage=Problems occurred while launching connector discovery: {0}\nPlease see the error log for detials.
+SelectRepositoryConnectorPage_discoveryProblemTitle=An error occurred
+SelectRepositoryConnectorPage_activateDiscovery=Install More Connectors...
+SelectRepositoryConnectorPage_Select_a_task_repository_type=Select a task repository type
+SelectRepositoryConnectorPage_You_can_connect_to_an_existing_account_using_one_of_the_installed_connectors=You can connect to an existing account using one of the installed connectors.
+
+SelectRepositoryPage_Add_new_repositories_using_the_X_view=Add new repositories using the {0} view.\n\
+If a repository is missing it does not support the requested operation.
+SelectRepositoryPage_Select_a_repository=Select a repository
+
+TaskAttachmentWizard_Add_Attachment=Add Attachment
+TaskAttachmentWizard_Attach_Screenshot=Attach Screenshot
+TaskAttachmentWizard_Attaching_context=Attaching context
+TaskAttachmentWizard_Attachment_Failed=Attachment Failed
+TaskAttachmentWizard_Screenshot=Screenshot
+
+TaskDataExportWizard_Export=Export
+TaskDataExportWizard_export_failed=Export Failed
+TaskDataExportWizardPage_Browse_=Browse...
+TaskDataExportWizardPage_Export_Mylyn_Task_Data=Export Mylyn Task Data
+TaskDataExportWizardPage_File=File:
+TaskDataExportWizardPage_Folder=Folder:
+TaskDataExportWizardPage_Folder_Selection=Folder Selection
+TaskDataExportWizardPage_Please_choose_an_export_destination=Please choose an export destination
+TaskDataExportWizardPage_Specify_the_destination_folder_for_task_data=Specify the destination folder for task data
+
+TaskDataImportWizard_confirm_overwrite=Confirm Overwrite
+TaskDataImportWizard_could_not_be_found=\ could not be found.
+TaskDataImportWizard_existing_task_data_about_to_be_erased_proceed=Existing Task Data is about to be overwritten with data from selected source.\n\nProceed?
+TaskDataImportWizard_File_not_found=File not found
+TaskDataImportWizard_Import=Import
+TaskDataImportWizard_Import_Error=Import Error: Please retry importing or use alternate source
+TaskDataImportWizard_Importing_Data=Importing Data
+TaskDataImportWizard_task_data_import_failed=Task Data import failed
+
+TaskDataImportWizardPage_Browse_=Browse...
+TaskDataImportWizardPage_From_snapshot=From snapshot
+TaskDataImportWizardPage_From_zip_file=From zip file
+TaskDataImportWizardPage_Import_method_backup=Import method backup
+TaskDataImportWizardPage_Import_method_zip=Import method zip
+TaskDataImportWizardPage_Import_Settings_saved=Import Settings saved
+TaskDataImportWizardPage_Import_Source_zip_file_setting=Import Source zip file setting
+TaskDataImportWizardPage_Importing_overwrites_current_tasks_and_repositories=Importing overwrites current tasks and repositories. Consider exporting first.
+TaskDataImportWizardPage_Restore_tasks_from_history=Restore tasks from history
+TaskDataImportWizardPage__unspecified_=<unspecified>
+TaskDataImportWizardPage_Zip_File_Selection=Zip File Selection
+
+AbstractRepositoryQueryPage_A_category_with_this_name_already_exists=A category with this name already exists, please choose another name.
+AbstractRepositoryQueryPage_Enter_query_parameters=Enter query parameters
+AbstractRepositoryQueryPage_If_attributes_are_blank_or_stale_press_the_Update_button=If attributes are blank or stale press the Update button.
+AbstractRepositoryQueryPage_Please_specify_a_title_for_the_query=Please specify a title for the query.
+AbstractRepositoryQueryPage_A_query_with_this_name_already_exists=A query with this name already exists, please choose another name.
+AbstractRepositorySettingsPage_Additional_Settings=Additional Settings
+AbstractRepositorySettingsPage_Anonymous_Access=Anonymous
+AbstractRepositorySettingsPage_Authentication_credentials_are_valid=Authentication credentials are valid.
+AbstractRepositorySettingsPage_Change_account_settings=Change account settings
+AbstractRepositorySettingsPage_Change_Settings=Change Settings
+AbstractRepositorySettingsPage_Character_encoding=Character encoding\:
+AbstractRepositorySettingsPage_Create_new_account=Create new account
+AbstractRepositorySettingsPage_Default__=Default (
+AbstractRepositorySettingsPage_Disconnected=Disconnected
+AbstractRepositorySettingsPage_Enable_http_authentication=Enable Http Authentication
+AbstractRepositorySettingsPage_Enable_proxy_authentication=Enable Proxy Authentication
+AbstractRepositorySettingsPage_Enter_a_valid_server_url=Enter a valid server url
+AbstractRepositorySettingsPage_Http_Authentication=Http Authentication
+AbstractRepositorySettingsPage_Internal_error_validating_repository=Internal error validating repository
+AbstractRepositorySettingsPage_Label_=Label\:\
+AbstractRepositorySettingsPage_Other=Other\:
+AbstractRepositorySettingsPage_Password_=Password\:\
+AbstractRepositorySettingsPage_Problems_encountered_determining_available_charsets=Problems encountered determining available charsets
+AbstractRepositorySettingsPage_Proxy_host_address_=Proxy host address\:\
+AbstractRepositorySettingsPage_Proxy_host_port_=Proxy host port\:\
+AbstractRepositorySettingsPage_Proxy_Server_Configuration=Proxy Server Configuration
+AbstractRepositorySettingsPage_Repository_already_exists=Repository already exists.
+AbstractRepositorySettingsPage_Repository_is_valid=Repository is valid.
+AbstractRepositorySettingsPage_Repository_url_is_invalid=Repository url is invalid.
+AbstractRepositorySettingsPage_Repository_user_name_and_password_must_not_be_blank=Repository user name and password must not be blank
+AbstractRepositorySettingsPage_Save_Password=Save Password
+AbstractRepositorySettingsPage_Server_=Server\:\
+AbstractRepositorySettingsPage_Unable_to_authenticate_with_repository=Unable to authenticate with repository. Login credentials invalid.
+AbstractRepositorySettingsPage_Use_global_Network_Connections_preferences=Use global Network Connections preferences
+AbstractRepositorySettingsPage_User_ID_=User ID\:\
+AbstractRepositorySettingsPage_Validate_Settings=Validate Settings
+AbstractRepositorySettingsPage_Validating_server_settings=Validating server settings
+
+NewTaskWizard_Create_Task=Create Task
+NewTaskWizard_Error_creating_new_task=Error creating new task
+NewTaskWizard_Failed_to_create_new_task_=Failed to create new task:
+NewWebTaskWizard_New_Task=New Task
+NewWebTaskWizard_This_connector_does_not_provide_a_rich_task_editor_for_creating_tasks=This connector does not provide a rich task editor for creating tasks.\n\nThe error contents have been placed in the clipboard so that you can paste them into the entry form.
+RepositoryQueryWizard_Edit_Repository_Query=Edit Repository Query
+
+TaskAttachmentPage_ATTACHE_CONTEXT=Attach Context
+TaskAttachmentPage_Attachment_Details=Attachment Details
+TaskAttachmentPage_Comment=Comment
+TaskAttachmentPage_Content_Type=Content Type
+TaskAttachmentPage_Description=Description
+TaskAttachmentPage_Enter_a_description=Enter a description
+TaskAttachmentPage_Enter_a_file_name=Enter a file name
+TaskAttachmentPage_File=File
+TaskAttachmentPage_Patch=Patch
+TaskAttachmentPage_Verify_the_content_type_of_the_attachment=Verify the content type of the attachment
+
+AbstractTaskRepositoryPage_Validation_failed=Validation failed
+
+LocalRepositorySettingsPage_Configure_the_local_repository=Configure the local repository
+LocalRepositorySettingsPage_Local_Repository_Settings=Local Repository Settings
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/Messages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/Messages.java
new file mode 100644
index 0000000..02b1ae0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/Messages.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.workingsets;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.tasks.ui.workingsets.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TaskWorkingSetPage_The_name_must_not_be_empty;
+
+ public static String TaskWorkingSetPage_The_name_must_not_have_a_leading_or_trailing_whitespace;
+
+ public static String TaskWorkingSetPage_No_categories_queries_selected;
+
+ public static String TaskWorkingSetPage_Resources;
+
+ public static String TaskWorkingSetPage_Select_Working_Set_Elements;
+
+ public static String TaskWorkingSetPage_Tasks;
+
+ public static String TaskWorkingSetPage_Page_Description;
+
+ public static String TaskWorkingSetPage_A_working_set_with_the_same_name_already_exists;
+
+ public static String TaskWorkingSetPage_Select_All;
+
+ public static String TaskWorkingSetPage_Deselect_All;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetAdapterFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetAdapterFactory.java
new file mode 100644
index 0000000..322add9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetAdapterFactory.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.workingsets;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * Adapter factory used to adapt AbstractTaskContainer to IPersistableElement
+ *
+ * @author Eugene Kuleshov
+ */
+public class TaskWorkingSetAdapterFactory implements IAdapterFactory {
+
+ private static final String TASK_ELEMENT_FACTORY_ID = "org.eclipse.mylyn.tasks.ui.workingSets.elementFactory"; //$NON-NLS-1$
+
+ @SuppressWarnings("unchecked")
+ private static final Class[] ADAPTER_TYPES = new Class[] { IPersistableElement.class };
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return ADAPTER_TYPES;
+ }
+
+ public Object getAdapter(final Object adaptableObject, @SuppressWarnings("unchecked") Class adapterType) {
+ if (adapterType == IPersistableElement.class && adaptableObject instanceof AbstractTaskContainer) {
+ return new IPersistableElement() {
+ public void saveState(IMemento memento) {
+ IRepositoryElement container = (IRepositoryElement) adaptableObject;
+ memento.putString(TaskWorkingSetElementFactory.HANDLE_TASK, container.getHandleIdentifier());
+ }
+
+ public String getFactoryId() {
+ return TASK_ELEMENT_FACTORY_ID;
+ }
+ };
+ } else if (adapterType == IPersistableElement.class && adaptableObject instanceof IProject) {
+ return new IPersistableElement() {
+ public void saveState(IMemento memento) {
+ IProject project = (IProject) adaptableObject;
+ memento.putString(TaskWorkingSetElementFactory.HANDLE_PROJECT, project.getName());
+ }
+
+ public String getFactoryId() {
+ return TASK_ELEMENT_FACTORY_ID;
+ }
+ };
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetElementAdapter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetElementAdapter.java
new file mode 100644
index 0000000..ea0f3d3
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetElementAdapter.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.workingsets;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetElementAdapter;
+
+/**
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ */
+public class TaskWorkingSetElementAdapter implements IWorkingSetElementAdapter {
+
+ public IAdaptable[] adaptElements(IWorkingSet workingSet, IAdaptable[] elements) {
+ for (IAdaptable adaptable : elements) {
+ if (!(adaptable instanceof AbstractTaskContainer)) {
+ return selectContainers(elements);
+ }
+ }
+ return elements;
+ }
+
+ private IAdaptable[] selectContainers(IAdaptable[] elements) {
+ List<IAdaptable> containers = new ArrayList<IAdaptable>(elements.length);
+ for (IAdaptable adaptable : elements) {
+ if (adaptable instanceof AbstractTaskContainer) {
+ containers.add(adaptable);
+ } else if (adaptable instanceof IProject) {
+ containers.add(adaptable);
+ }
+ }
+ return containers.toArray(new IAdaptable[containers.size()]);
+ }
+
+ public void dispose() {
+ // ignore
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetElementFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetElementFactory.java
new file mode 100644
index 0000000..49e664f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetElementFactory.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.workingsets;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+
+/**
+ * Element factory used to restore task containers and projects for Task+Resource working sets.
+ *
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ */
+public class TaskWorkingSetElementFactory implements IElementFactory {
+
+ static final String HANDLE_TASK = "handle.task"; //$NON-NLS-1$
+
+ static final String HANDLE_PROJECT = "handle.project"; //$NON-NLS-1$
+
+ public IAdaptable createElement(IMemento memento) {
+ String taskHandle = memento.getString(HANDLE_TASK);
+ if (taskHandle != null) {
+ // TOOD: this does not support projects and categories/queries have the same name
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ for (AbstractTaskContainer element : taskList.getRootElements()) {
+ if (element.getHandleIdentifier().equals(taskHandle)) {
+ return element;
+ }
+ }
+ }
+ String projectHandle = memento.getString(HANDLE_PROJECT);
+ if (projectHandle != null) {
+ try {
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectHandle);
+ if (project != null) {
+ return project;
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not not determine project for handle: " + projectHandle, t)); //$NON-NLS-1$
+ }
+ }
+ // prior to mylyn 3.0.2 task handles and project handles were identical
+ if (taskHandle != null) {
+ try {
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(taskHandle);
+ if (project != null) {
+ return project;
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not not determine project for handle: " + taskHandle, t)); //$NON-NLS-1$
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetPage.java
new file mode 100644
index 0000000..2123cc5
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetPage.java
@@ -0,0 +1,582 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.workingsets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoryLabelProvider;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.IWorkingSetPage;
+import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * Adapted from org.eclipse.ui.internal.ide.dialogs.ResourceWorkingSetPage
+ *
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ * @author David Green fix for bug 274390
+ */
+public class TaskWorkingSetPage extends WizardPage implements IWorkingSetPage {
+
+ private final static int SIZING_SELECTION_WIDGET_WIDTH = 50;
+
+ private final static int SIZING_SELECTION_WIDGET_HEIGHT = 200;
+
+ private Text text;
+
+ private CheckboxTreeViewer treeViewer;
+
+ private IWorkingSet workingSet;
+
+ private final WorkingSetPageContentProvider workingSetPageContentProvider = new WorkingSetPageContentProvider();
+
+ private boolean firstCheck = false;
+
+ private final class WorkingSetPageContentProvider implements ITreeContentProvider {
+
+ private ElementCategory tasksContainer;
+
+ private ElementCategory resourcesContainer;
+
+ private final Map<IRepositoryQuery, TaskRepository> queryMap = new HashMap<IRepositoryQuery, TaskRepository>();
+
+ private final Map<IProject, TaskRepositoryProjectMapping> projectMap = new HashMap<IProject, TaskRepositoryProjectMapping>();
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof List<?>) {
+ List<IAdaptable> taskRepositoriesContainers = new ArrayList<IAdaptable>();
+ List<IAdaptable> resourcesRepositoriesContainers = new ArrayList<IAdaptable>();
+
+ for (AbstractTaskContainer category : TasksUiInternal.getTaskList().getCategories()) {
+ taskRepositoriesContainers.add(category);
+ }
+
+ IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+ Set<IProject> unmappedProjects = new HashSet<IProject>();
+ for (Object container : (List<?>) parentElement) {
+ if (container instanceof TaskRepository) {
+ // NOTE: looking down, high complexity
+ if (hasChildren(container)) {
+ taskRepositoriesContainers.add((TaskRepository) container);
+ }
+
+ // NOTE: O(n^2) complexity, could fix
+ Set<IProject> mappedProjects = new HashSet<IProject>();
+
+ for (IProject project : projects) {
+ TaskRepository taskRepository = TasksUiPlugin.getDefault()
+ .getRepositoryForResource(project);
+ if (container.equals(taskRepository)) {
+ mappedProjects.add(project);
+ } else if (taskRepository == null) {
+ unmappedProjects.add(project);
+ }
+ }
+ if (!mappedProjects.isEmpty()) {
+ TaskRepositoryProjectMapping projectMapping = new TaskRepositoryProjectMapping(
+ (TaskRepository) container, mappedProjects);
+ resourcesRepositoriesContainers.add(projectMapping);
+ for (IProject mappedProject : mappedProjects) {
+ projectMap.put(mappedProject, projectMapping);
+ }
+ }
+ }
+ }
+ resourcesRepositoriesContainers.addAll(unmappedProjects);
+ tasksContainer = new ElementCategory(Messages.TaskWorkingSetPage_Tasks, taskRepositoriesContainers);
+ resourcesContainer = new ElementCategory(Messages.TaskWorkingSetPage_Resources,
+ resourcesRepositoriesContainers);
+ return new Object[] { tasksContainer, resourcesContainer };
+ } else if (parentElement instanceof TaskRepository) {
+ List<IAdaptable> taskContainers = new ArrayList<IAdaptable>();
+ for (AbstractTaskContainer element : TasksUiPlugin.getTaskList().getRepositoryQueries(
+ ((TaskRepository) parentElement).getRepositoryUrl())) {
+ if (element instanceof IRepositoryQuery) {
+ taskContainers.add(element);
+ queryMap.put((IRepositoryQuery) element, (TaskRepository) parentElement);
+ }
+ }
+
+ return taskContainers.toArray();
+ } else if (parentElement instanceof TaskRepositoryProjectMapping) {
+ return ((TaskRepositoryProjectMapping) parentElement).getProjects().toArray();
+ } else if (parentElement instanceof ElementCategory) {
+ return ((ElementCategory) parentElement).getChildren(parentElement);
+ } else {
+ return new Object[0];
+ }
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public Object[] getElements(Object element) {
+ return getChildren(element);
+ }
+
+ public Object getParent(Object element) {
+ if (element instanceof AbstractTaskCategory || element instanceof TaskRepository) {
+ return tasksContainer;
+ } else if (element instanceof IRepositoryQuery) {
+ return queryMap.get(element);
+ } else if (element instanceof TaskRepositoryProjectMapping) {
+ return resourcesContainer;
+ } else if (element instanceof IProject) {
+ Object repository = projectMap.get(element);
+ if (repository != null) {
+ return repository;
+ } else {
+ return resourcesContainer;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ private class TaskRepositoryProjectMapping extends PlatformObject {
+
+ private final TaskRepository taskRepository;
+
+ private final Set<IProject> projects;
+
+ public TaskRepositoryProjectMapping(TaskRepository taskRepository, Set<IProject> mappedProjects) {
+ this.taskRepository = taskRepository;
+ this.projects = mappedProjects;
+ }
+
+ public Set<IProject> getProjects() {
+ return projects;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+ }
+
+ class ElementCategory extends PlatformObject implements IWorkbenchAdapter {
+
+ private final String label;
+
+ private final List<IAdaptable> children;
+
+ public ElementCategory(String label, List<IAdaptable> children) {
+ this.label = label;
+ this.children = children;
+ }
+
+ public Object[] getChildren(Object o) {
+ return children.toArray();
+ }
+
+ public ImageDescriptor getImageDescriptor(Object object) {
+ return WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_OBJ_WORKING_SETS);
+ }
+
+ public String getLabel(Object o) {
+ return label;
+ }
+
+ public Object getParent(Object o) {
+ return null;
+ }
+
+ }
+
+ class AggregateLabelProvider implements ILabelProvider {
+
+ private final TaskElementLabelProvider taskLabelProvider = new TaskElementLabelProvider(false);
+
+ private final TaskRepositoryLabelProvider taskRepositoryLabelProvider = new TaskRepositoryLabelProvider();
+
+ private final WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider();
+
+ public Image getImage(Object element) {
+ if (element instanceof AbstractTaskContainer) {
+ return taskLabelProvider.getImage(element);
+ } else if (element instanceof TaskRepository) {
+ return taskRepositoryLabelProvider.getImage(element);
+ } else if (element instanceof TaskRepositoryProjectMapping) {
+ return getImage(((TaskRepositoryProjectMapping) element).getTaskRepository());
+ } else {
+ return workbenchLabelProvider.getImage(element);
+ }
+ }
+
+ public String getText(Object element) {
+ if (element instanceof AbstractTaskContainer) {
+ return taskLabelProvider.getText(element);
+ } else if (element instanceof TaskRepository) {
+ return taskRepositoryLabelProvider.getText(element);
+ } else if (element instanceof TaskRepositoryProjectMapping) {
+ return getText(((TaskRepositoryProjectMapping) element).getTaskRepository());
+ } else {
+ return workbenchLabelProvider.getText(element);
+ }
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+ }
+
+ class CustomSorter extends ViewerSorter {
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof TaskRepository || e1 instanceof TaskRepositoryProjectMapping) {
+ return -1;
+ } else if (e2 instanceof TaskRepository || e2 instanceof TaskRepositoryProjectMapping) {
+ return 1;
+ } else if (e1 instanceof ElementCategory
+ && ((ElementCategory) e1).getLabel(e1).equals(Messages.TaskWorkingSetPage_Tasks)) {
+ return -1;
+ } else if (e2 instanceof ElementCategory
+ && ((ElementCategory) e1).getLabel(e1).equals(Messages.TaskWorkingSetPage_Tasks)) {
+ return 1;
+ } else {
+ return super.compare(viewer, e1, e2);
+ }
+ }
+ }
+
+ public TaskWorkingSetPage() {
+ super("taskWorkingSetPage", Messages.TaskWorkingSetPage_Select_Working_Set_Elements, null); //$NON-NLS-1$
+ setDescription(Messages.TaskWorkingSetPage_Page_Description);
+ setImageDescriptor(TasksUiImages.BANNER_WORKING_SET);
+ }
+
+ public void finish() {
+ Object[] elements = treeViewer.getCheckedElements();
+ Set<IAdaptable> validElements = new HashSet<IAdaptable>();
+ for (Object element : elements) {
+ if (element instanceof AbstractTaskContainer || element instanceof IProject) {
+ validElements.add((IAdaptable) element);
+ }
+ }
+
+ addSpecialContainers(validElements);
+
+ if (workingSet == null) {
+ IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
+ workingSet = workingSetManager.createWorkingSet(getWorkingSetName(),
+ validElements.toArray(new IAdaptable[validElements.size()]));
+ } else {
+ if (!getWorkingSetName().equals(workingSet.getName())) {
+ workingSet.setName(getWorkingSetName());
+ }
+ workingSet.setElements(validElements.toArray(new IAdaptable[validElements.size()]));
+ }
+ }
+
+ private void addSpecialContainers(Set<IAdaptable> validElements) {
+ HashSet<AbstractTaskContainer> specialContainers = new HashSet<AbstractTaskContainer>();
+ for (IAdaptable element : validElements) {
+ if (element instanceof IRepositoryQuery) {
+ IRepositoryQuery query = (IRepositoryQuery) element;
+ if (query.getRepositoryUrl() != null) {
+ // Add Unmatched
+ AbstractTaskContainer orphansContainer = TasksUiPlugin.getTaskList().getUnmatchedContainer(
+ query.getRepositoryUrl());
+ if (orphansContainer != null) {
+ specialContainers.add(orphansContainer);
+ }
+
+ // Add Unsubmitted
+ AbstractTaskContainer unsubmittedContainer = TasksUiPlugin.getTaskList().getUnsubmittedContainer(
+ query.getRepositoryUrl());
+ if (unsubmittedContainer != null) {
+ specialContainers.add(unsubmittedContainer);
+ }
+ }
+ }
+ }
+ validElements.addAll(specialContainers);
+ }
+
+ public IWorkingSet getSelection() {
+ return workingSet;
+ }
+
+ public void setSelection(IWorkingSet workingSet) {
+ this.workingSet = workingSet;
+ if (getShell() != null && text != null) {
+ firstCheck = true;
+ initializeCheckedState();
+ text.setText(workingSet.getName());
+ }
+ }
+
+ private String getWorkingSetName() {
+ return text.getText();
+ }
+
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NULL);
+
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ setControl(composite);
+
+ // PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IIDEHelpContextIds.WORKING_SET_RESOURCE_PAGE);
+ Label label = new Label(composite, SWT.WRAP);
+ label.setText(""); //$NON-NLS-1$
+ label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL
+ | GridData.VERTICAL_ALIGN_CENTER));
+
+ text = new Text(composite, SWT.SINGLE | SWT.BORDER);
+ text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+ text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ validateInput();
+ }
+ });
+ text.setFocus();
+ // text.setBackground(FieldAssistColors.getRequiredFieldBackgroundColor(text));
+
+ label = new Label(composite, SWT.WRAP);
+ label.setText(""); //$NON-NLS-1$
+ label.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL
+ | GridData.VERTICAL_ALIGN_CENTER));
+
+ treeViewer = new CheckboxTreeViewer(composite);
+ treeViewer.setUseHashlookup(true);
+ treeViewer.setContentProvider(workingSetPageContentProvider);
+
+ treeViewer.setLabelProvider(new DecoratingLabelProvider(new AggregateLabelProvider(), PlatformUI.getWorkbench()
+ .getDecoratorManager()
+ .getLabelDecorator()));
+ treeViewer.setSorter(new CustomSorter());
+
+ ArrayList<Object> containers = new ArrayList<Object>();
+ for (TaskRepository repository : TasksUi.getRepositoryManager().getAllRepositories()) {
+ containers.add(repository);
+ }
+
+ containers.addAll(Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects()));
+
+ treeViewer.setInput(containers);
+
+ // tree.setComparator(new ResourceComparator(ResourceComparator.NAME));
+
+ GridData data = new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL);
+ data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
+ data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
+ treeViewer.getControl().setLayoutData(data);
+
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ handleCheckStateChange(event);
+ }
+ });
+
+ // Add select / deselect all buttons for bug 46669
+ Composite buttonComposite = new Composite(composite, SWT.NONE);
+ layout = new GridLayout(2, false);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ buttonComposite.setLayout(layout);
+ buttonComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+
+ Button selectAllButton = new Button(buttonComposite, SWT.PUSH);
+ selectAllButton.setText(Messages.TaskWorkingSetPage_Select_All);
+ selectAllButton.setToolTipText(""); //$NON-NLS-1$
+ selectAllButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent selectionEvent) {
+ treeViewer.setCheckedElements(workingSetPageContentProvider.getElements(treeViewer.getInput()));
+ validateInput();
+ }
+ });
+ setButtonLayoutData(selectAllButton);
+
+ Button deselectAllButton = new Button(buttonComposite, SWT.PUSH);
+ deselectAllButton.setText(Messages.TaskWorkingSetPage_Deselect_All);
+ deselectAllButton.setToolTipText(""); //$NON-NLS-1$
+ deselectAllButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent selectionEvent) {
+ treeViewer.setCheckedElements(new Object[0]);
+ validateInput();
+ }
+ });
+ setButtonLayoutData(deselectAllButton);
+
+ if (workingSet != null) {
+ for (Object object : workingSet.getElements()) {
+ treeViewer.expandToLevel(object, 1);
+ }
+ } else {
+ treeViewer.expandToLevel(2);
+ }
+ initializeCheckedState();
+
+ if (workingSet != null) {
+ text.setText(workingSet.getName());
+ }
+
+ setPageComplete(false);
+ Dialog.applyDialogFont(composite);
+ }
+
+ private void initializeCheckedState() {
+ BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
+ public void run() {
+ Object[] items = null;
+ if (workingSet != null) {
+ items = workingSet.getElements();
+ if (items != null) {
+ // see bug 191342
+ treeViewer.setCheckedElements(new Object[] {});
+ for (Object item : items) {
+ if (item != null) {
+ treeViewer.setChecked(item, true);
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+
+ protected void handleCheckStateChange(final CheckStateChangedEvent event) {
+ BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
+ public void run() {
+ IAdaptable element = (IAdaptable) event.getElement();
+ handleCheckStateChangeHelper(event, element);
+ validateInput();
+ }
+
+ private void handleCheckStateChangeHelper(final CheckStateChangedEvent event, IAdaptable element) {
+ if (element instanceof AbstractTaskContainer || element instanceof IProject) {
+ treeViewer.setGrayed(element, false);
+ } else if (element instanceof ElementCategory) {
+ for (Object child : ((ElementCategory) element).getChildren(null)) {
+ treeViewer.setChecked(child, event.getChecked());
+ if (child instanceof IAdaptable) {
+ handleCheckStateChangeHelper(event, (IAdaptable) child);
+ }
+ }
+ } else if (element instanceof TaskRepository || element instanceof TaskRepositoryProjectMapping) {
+ for (Object child : workingSetPageContentProvider.getChildren(element)) {
+ treeViewer.setChecked(child, event.getChecked());
+ }
+ }
+ }
+ });
+ }
+
+ protected void validateInput() {
+ String errorMessage = null;
+ String infoMessage = null;
+ String newText = text.getText();
+
+ if (!newText.equals(newText.trim())) {
+ errorMessage = Messages.TaskWorkingSetPage_The_name_must_not_have_a_leading_or_trailing_whitespace;
+ } else if (firstCheck) {
+ firstCheck = false;
+ return;
+ }
+ if ("".equals(newText)) { //$NON-NLS-1$
+ errorMessage = Messages.TaskWorkingSetPage_The_name_must_not_be_empty;
+ }
+ if (errorMessage == null && (workingSet == null || !newText.equals(workingSet.getName()))) {
+ IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
+ for (IWorkingSet workingSet2 : workingSets) {
+ if (newText.equals(workingSet2.getName())) {
+ errorMessage = Messages.TaskWorkingSetPage_A_working_set_with_the_same_name_already_exists;
+ }
+ }
+ }
+ if (treeViewer.getCheckedElements().length == 0) {
+ infoMessage = Messages.TaskWorkingSetPage_No_categories_queries_selected;
+ }
+ setMessage(infoMessage, INFORMATION);
+ setErrorMessage(errorMessage);
+ setPageComplete(errorMessage == null);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetUpdater.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetUpdater.java
new file mode 100644
index 0000000..0eef170
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/TaskWorkingSetUpdater.java
@@ -0,0 +1,344 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eugene Kuleshov - initial API and implementation
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.workingsets;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetUpdater;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class TaskWorkingSetUpdater implements IWorkingSetUpdater, ITaskListChangeListener, IResourceChangeListener {
+
+ public static String ID_TASK_WORKING_SET = "org.eclipse.mylyn.tasks.ui.workingSet"; //$NON-NLS-1$
+
+ private final List<IWorkingSet> workingSets = new CopyOnWriteArrayList<IWorkingSet>();
+
+ private static class TaskWorkingSetDelta {
+
+ private final IWorkingSet workingSet;
+
+ private final List<Object> elements;
+
+ private boolean changed;
+
+ public TaskWorkingSetDelta(IWorkingSet workingSet) {
+ this.workingSet = workingSet;
+ this.elements = new ArrayList<Object>(Arrays.asList(workingSet.getElements()));
+ }
+
+ public int indexOf(Object element) {
+ return elements.indexOf(element);
+ }
+
+ public void set(int index, Object element) {
+ elements.set(index, element);
+ changed = true;
+ }
+
+ public void remove(int index) {
+ if (elements.remove(index) != null) {
+ changed = true;
+ }
+ }
+
+ public void process() {
+ if (changed) {
+ workingSet.setElements(elements.toArray(new IAdaptable[elements.size()]));
+ }
+ }
+ }
+
+ public TaskWorkingSetUpdater() {
+ TasksUiInternal.getTaskList().addChangeListener(this);
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+ }
+
+ public void dispose() {
+ TasksUiInternal.getTaskList().removeChangeListener(this);
+ }
+
+ public void add(IWorkingSet workingSet) {
+ checkElementExistence(workingSet);
+ synchronized (workingSets) {
+ workingSets.add(workingSet);
+ }
+ }
+
+ private void checkElementExistence(IWorkingSet workingSet) {
+ ArrayList<IAdaptable> list = new ArrayList<IAdaptable>();
+ for (IAdaptable adaptable : workingSet.getElements()) {
+ if (adaptable instanceof AbstractTaskContainer) {
+ String handle = ((AbstractTaskContainer) adaptable).getHandleIdentifier();
+ for (IRepositoryElement element : TasksUiPlugin.getTaskList().getRootElements()) {
+ if (element != null && element.getHandleIdentifier().equals(handle)) {
+ list.add(adaptable);
+ }
+ }
+ } else if (adaptable instanceof IProject) {
+ IProject project = ResourcesPlugin.getWorkspace()
+ .getRoot()
+ .getProject(((IProject) adaptable).getName());
+ if (project != null && project.exists()) {
+ list.add(project);
+ }
+ }
+ }
+ workingSet.setElements(list.toArray(new IAdaptable[list.size()]));
+ }
+
+ public boolean contains(IWorkingSet workingSet) {
+ synchronized (workingSets) {
+ return workingSets.contains(workingSet);
+ }
+ }
+
+ public boolean remove(IWorkingSet workingSet) {
+ synchronized (workingSets) {
+ return workingSets.remove(workingSet);
+ }
+ }
+
+ public void containersChanged(Set<TaskContainerDelta> delta) {
+ for (TaskContainerDelta taskContainerDelta : delta) {
+ if (taskContainerDelta.getElement() instanceof TaskCategory
+ || taskContainerDelta.getElement() instanceof IRepositoryQuery) {
+ synchronized (workingSets) {
+ switch (taskContainerDelta.getKind()) {
+ case REMOVED:
+ // Remove from all
+ for (IWorkingSet workingSet : workingSets) {
+ ArrayList<IAdaptable> elements = new ArrayList<IAdaptable>(
+ Arrays.asList(workingSet.getElements()));
+ elements.remove(taskContainerDelta.getElement());
+ workingSet.setElements(elements.toArray(new IAdaptable[elements.size()]));
+ }
+ break;
+ case ADDED:
+ // Add to the active working set
+ for (IWorkingSet workingSet : TaskWorkingSetUpdater.getEnabledSets()) {
+ ArrayList<IAdaptable> elements = new ArrayList<IAdaptable>(
+ Arrays.asList(workingSet.getElements()));
+ elements.add(taskContainerDelta.getElement());
+ workingSet.setElements(elements.toArray(new IAdaptable[elements.size()]));
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // TODO: consider putting back, but evaluate policy and note bug 197257
+// public void taskActivated(AbstractTask task) {
+// Set<AbstractTaskContainer> taskContainers = new HashSet<AbstractTaskContainer>(
+// TasksUiPlugin.getTaskList().getQueriesForHandle(task.getHandleIdentifier()));
+// taskContainers.addAll(task.getParentContainers());
+//
+// Set<AbstractTaskContainer> allActiveWorkingSetContainers = new HashSet<AbstractTaskContainer>();
+// for (IWorkingSet workingSet : PlatformUI.getWorkbench()
+// .getActiveWorkbenchWindow()
+// .getActivePage()
+// .getWorkingSets()) {
+// ArrayList<IAdaptable> elements = new ArrayList<IAdaptable>(Arrays.asList(workingSet.getElements()));
+// for (IAdaptable adaptable : elements) {
+// if (adaptable instanceof AbstractTaskContainer) {
+// allActiveWorkingSetContainers.add((AbstractTaskContainer) adaptable);
+// }
+// }
+// }
+// boolean isContained = false;
+// for (AbstractTaskContainer taskContainer : allActiveWorkingSetContainers) {
+// if (taskContainers.contains(taskContainer)) {
+// isContained = true;
+// break;
+// }
+// }
+//
+// ;
+// if (!isContained) {
+// IWorkingSet matchingWorkingSet = null;
+// for (IWorkingSet workingSet : PlatformUI.getWorkbench().getWorkingSetManager().getAllWorkingSets()) {
+// ArrayList<IAdaptable> elements = new ArrayList<IAdaptable>(Arrays.asList(workingSet.getElements()));
+// for (IAdaptable adaptable : elements) {
+// if (adaptable instanceof AbstractTaskContainer) {
+// if (((AbstractTaskContainer)adaptable).contains(task.getHandleIdentifier())) {
+// matchingWorkingSet = workingSet;
+// }
+// }
+// }
+// }
+//
+// if (matchingWorkingSet != null) {
+// new ToggleWorkingSetAction(matchingWorkingSet).run();
+// } else {
+// new ToggleAllWorkingSetsAction(PlatformUI.getWorkbench().getActiveWorkbenchWindow()).run();
+// }
+// }
+// }
+
+ public static IWorkingSet[] getEnabledSets() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ if (page != null) {
+ return page.getWorkingSets();
+ }
+ }
+ return new IWorkingSet[0];
+ }
+
+ /**
+ * TODO: move
+ */
+ public static boolean areNoTaskWorkingSetsEnabled() {
+ IWorkingSet[] workingSets = PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets();
+ for (IWorkingSet workingSet : workingSets) {
+ if (workingSet != null && workingSet.getId().equalsIgnoreCase(ID_TASK_WORKING_SET)) {
+ if (isWorkingSetEnabled(workingSet)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public static boolean isWorkingSetEnabled(IWorkingSet set) {
+ IWorkingSet[] enabledSets = TaskWorkingSetUpdater.getEnabledSets();
+ for (IWorkingSet enabledSet : enabledSets) {
+ if (enabledSet.equals(set)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static boolean isOnlyTaskWorkingSetEnabled(IWorkingSet set) {
+ if (!TaskWorkingSetUpdater.isWorkingSetEnabled(set)) {
+ return false;
+ }
+
+ IWorkingSet[] enabledSets = TaskWorkingSetUpdater.getEnabledSets();
+ for (int i = 0; i < enabledSets.length; i++) {
+ if (!enabledSets[i].equals(set)
+ && enabledSets[i].getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void processResourceDelta(TaskWorkingSetDelta result, IResourceDelta delta) {
+ IResource resource = delta.getResource();
+ int type = resource.getType();
+ int index = result.indexOf(resource);
+ int kind = delta.getKind();
+ int flags = delta.getFlags();
+ if (kind == IResourceDelta.CHANGED && type == IResource.PROJECT && index != -1) {
+ if ((flags & IResourceDelta.OPEN) != 0) {
+ result.set(index, resource);
+ }
+ }
+ if (index != -1 && kind == IResourceDelta.REMOVED) {
+ if ((flags & IResourceDelta.MOVED_TO) != 0) {
+ result.set(index, ResourcesPlugin.getWorkspace().getRoot().findMember(delta.getMovedToPath()));
+ } else {
+ result.remove(index);
+ }
+ }
+
+ // Don't dive into closed or opened projects
+ if (projectGotClosedOrOpened(resource, kind, flags)) {
+ return;
+ }
+
+ IResourceDelta[] children = delta.getAffectedChildren();
+ for (IResourceDelta element : children) {
+ processResourceDelta(result, element);
+ }
+ }
+
+ private boolean projectGotClosedOrOpened(IResource resource, int kind, int flags) {
+ return resource.getType() == IResource.PROJECT && kind == IResourceDelta.CHANGED
+ && (flags & IResourceDelta.OPEN) != 0;
+ }
+
+ public void resourceChanged(IResourceChangeEvent event) {
+ for (IWorkingSet workingSet : workingSets) {
+ TaskWorkingSetDelta workingSetDelta = new TaskWorkingSetDelta(workingSet);
+ if (event.getDelta() != null) {
+ processResourceDelta(workingSetDelta, event.getDelta());
+ }
+ workingSetDelta.process();
+ }
+ }
+
+ /**
+ * Must be called from the UI thread
+ */
+ public static void applyWorkingSetsToAllWindows(Collection<IWorkingSet> workingSets) {
+ IWorkingSet[] workingSetArray = workingSets.toArray(new IWorkingSet[workingSets.size()]);
+ for (IWorkbenchWindow window : MonitorUi.getMonitoredWindows()) {
+ for (IWorkbenchPage page : window.getPages()) {
+ page.setWorkingSets(workingSetArray);
+ }
+ }
+ }
+
+ public static Set<IWorkingSet> getActiveWorkingSets(IWorkbenchWindow window) {
+ if (window != null && window.getActivePage() != null) {
+ Set<IWorkingSet> allSets = new HashSet<IWorkingSet>(Arrays.asList(window.getActivePage().getWorkingSets()));
+ Set<IWorkingSet> tasksSets = new HashSet<IWorkingSet>(allSets);
+ for (IWorkingSet workingSet : allSets) {
+ if (workingSet.getId() == null
+ || !workingSet.getId().equalsIgnoreCase(TaskWorkingSetUpdater.ID_TASK_WORKING_SET)) {
+ tasksSets.remove(workingSet);
+ }
+ }
+ return tasksSets;
+ } else {
+ return Collections.emptySet();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java
new file mode 100644
index 0000000..8fa17ae
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/WorkingSetLabelComparator.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Willian Mitsuda 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:
+ * Willian Mitsuda - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.workingsets;
+
+import java.util.Comparator;
+
+import org.eclipse.ui.IWorkingSet;
+
+import com.ibm.icu.text.Collator;
+
+/**
+ * @author Willian Mitsuda
+ */
+public class WorkingSetLabelComparator implements Comparator<IWorkingSet> {
+
+ public int compare(IWorkingSet ws1, IWorkingSet ws2) {
+ return Collator.getInstance().compare(ws1.getLabel(), ws2.getLabel());
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/messages.properties b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/messages.properties
new file mode 100644
index 0000000..3f82c77
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/internal/tasks/ui/workingsets/messages.properties
@@ -0,0 +1,10 @@
+TaskWorkingSetPage_The_name_must_not_be_empty=The name must not be empty.
+TaskWorkingSetPage_The_name_must_not_have_a_leading_or_trailing_whitespace=The name must not have a leading or trailing whitespace.
+TaskWorkingSetPage_No_categories_queries_selected=No categories/queries selected.
+TaskWorkingSetPage_Resources=Resources
+TaskWorkingSetPage_Select_Working_Set_Elements=Select Working Set Elements
+TaskWorkingSetPage_Tasks=Tasks
+TaskWorkingSetPage_Page_Description=When this Working Set is selected views will be filtered just to show only these elements if the Window Working Set is enabled in the view.
+TaskWorkingSetPage_A_working_set_with_the_same_name_already_exists=A working set with the same name already exists.
+TaskWorkingSetPage_Select_All=Select All
+TaskWorkingSetPage_Deselect_All=Deselect All
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java
new file mode 100644
index 0000000..d858f02
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractRepositoryConnectorUi.java
@@ -0,0 +1,251 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ * David Green - fix for bug 244442
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage;
+import org.eclipse.mylyn.tasks.ui.wizards.TaskAttachmentPage;
+
+/**
+ * Extend to provide connector-specific UI extensions. TODO: consider refactoring into extension points
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractRepositoryConnectorUi {
+
+ private static final String LABEL_TASK_DEFAULT = Messages.AbstractRepositoryConnectorUi_Task;
+
+ private final boolean customNotificationHandling = false;
+
+ /**
+ * @return the unique type of the repository, e.g. "bugzilla"
+ */
+ public abstract String getConnectorKind();
+
+ /**
+ * @since 3.0
+ */
+ public abstract ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository);
+
+ /**
+ * @param repository
+ * @param queryToEdit
+ * can be null
+ * @since 3.0
+ */
+ public abstract IWizard getQueryWizard(TaskRepository taskRepository, IRepositoryQuery queryToEdit);
+
+ /**
+ * @since 3.0
+ */
+ public abstract IWizard getNewTaskWizard(TaskRepository taskRepository, ITaskMapping selection);
+
+ /**
+ * Override to return a custom task editor ID. If overriding this method the connector becomes responsible for
+ * showing the additional pages handled by the default task editor. As of Mylyn 2.0M2 these are the Planning and
+ * Context pages.
+ *
+ * @since 3.0
+ */
+ public String getTaskEditorId(ITask repositoryTask) {
+ return TaskEditor.ID_EDITOR;
+ }
+
+ public abstract boolean hasSearchPage();
+
+ /**
+ * Contributions to the UI legend.
+ *
+ * @deprecated use {@link #getLegendElements()} instead
+ */
+ @Deprecated
+ public List<ITask> getLegendItems() {
+ return Collections.emptyList();
+ }
+
+ /**
+ * Contributions to the UI legend.
+ *
+ * @since 3.0
+ */
+ public List<LegendElement> getLegendElements() {
+ return Collections.emptyList();
+ }
+
+ /**
+ * @param repositoryTask
+ * can be null
+ * @since 3.0
+ */
+ public String getTaskKindLabel(ITask task) {
+ return LABEL_TASK_DEFAULT;
+ }
+
+ /**
+ * Connector-specific task icons. Not recommended to override unless providing custom icons and kind overlays. For
+ * connectors that have a decorator that they want to reuse, the connector can maintain a reference to the label
+ * provider and get the descriptor from the images it returns.
+ *
+ * @since 3.0
+ */
+ public ImageDescriptor getImageDescriptor(IRepositoryElement element) {
+ if (element instanceof RepositoryQuery) {
+ return ((RepositoryQuery) element).getAutoUpdate() ? TasksUiImages.QUERY : TasksUiImages.QUERY_OFFLINE;
+ } else if (element instanceof ITask) {
+ return TasksUiImages.TASK;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Task kind overlay, recommended to override with connector-specific overlay.
+ *
+ * @since 3.0
+ */
+ public ImageDescriptor getTaskKindOverlay(ITask task) {
+ return null;
+ }
+
+ /**
+ * Connector-specific priority icons. Not recommended to override since priority icons are used elsewhere in the
+ * Task List UI (e.g. filter selection in view menu).
+ *
+ * @since 3.0
+ */
+ public ImageDescriptor getTaskPriorityOverlay(ITask task) {
+ return TasksUiInternal.getPriorityImage(task);
+ }
+
+ /**
+ * This method is not used anymore.
+ *
+ * @return returns null
+ */
+ @Deprecated
+ public IWizard getAddExistingTaskWizard(TaskRepository repository) {
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public ITaskSearchPage getSearchPage(TaskRepository repository, IStructuredSelection selection) {
+ return null;
+ }
+
+ /**
+ * Override to return a URL that provides the user with an account creation page for the repository
+ *
+ * @param taskRepository
+ * TODO
+ */
+ public String getAccountCreationUrl(TaskRepository taskRepository) {
+ return null;
+ }
+
+ /**
+ * Override to return a URL that provides the user with an account management page for the repository
+ *
+ * @param taskRepository
+ * TODO
+ */
+ public String getAccountManagementUrl(TaskRepository taskRepository) {
+ return null;
+ }
+
+ /**
+ * Override to return a URL that provides the user with a history page for the task.
+ *
+ * @return a url of a page for the history of the task; null, if no history url is available
+ * @since 3.0
+ */
+ public String getTaskHistoryUrl(TaskRepository taskRepository, ITask task) {
+ return null;
+ }
+
+ /**
+ * Override to return a textual reference to a comment, e.g. for Bugzilla this method returns <code>#12</code> for
+ * comment 12. This reference is used when generating replies to comments
+ *
+ * @return a reference to <code>comment</code>; null, if no reference is available
+ * @since 3.0
+ */
+ public String getReplyText(TaskRepository taskRepository, ITask task, ITaskComment taskComment, boolean includeTask) {
+ return null;
+ }
+
+ /**
+ * Returns an array of hyperlinks that link to tasks within <code>text</code>. If <code>index</code> is != -1
+ * clients may limit the results to hyperlinks found at <code>index</code>. It is legal for clients to always return
+ * all results.
+ *
+ * @param repository
+ * the task repository, never <code>null</code>
+ * @param text
+ * the line of text
+ * @param index
+ * the index within <code>text</code>, if -1 return all hyperlinks found in text
+ * @param textOffset
+ * the offset of <code>text</code>
+ * @return an array of hyperlinks, or null if no hyperlinks were found
+ * @since 2.0
+ */
+ public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int index, int textOffset) {
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean hasCustomNotifications() {
+ return customNotificationHandling;
+ }
+
+ /**
+ * @since 3.0
+ * @return true if connector doesn't support non-grouping (flattening) of subtasks
+ */
+ public boolean hasStrictSubtaskHierarchy() {
+ return false;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public IWizardPage getTaskAttachmentPage(TaskAttachmentModel model) {
+ return new TaskAttachmentPage(model);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskHyperlinkDetector.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskHyperlinkDetector.java
new file mode 100644
index 0000000..3a2f3e2
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskHyperlinkDetector.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Base class for hyperlink detectors that provides methods for extracting text from an {@link ITextViewer}.
+ *
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @author Eugene Kuleshov
+ * @author Terry Hon
+ * @since 3.1
+ */
+public abstract class AbstractTaskHyperlinkDetector extends AbstractHyperlinkDetector {
+
+ /**
+ * @since 3.1
+ */
+ public AbstractTaskHyperlinkDetector() {
+ }
+
+ /**
+ * @since 3.1
+ */
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, final IRegion region, boolean canShowMultipleHyperlinks) {
+ IDocument document = textViewer.getDocument();
+ if (document == null || document.getLength() == 0) {
+ return null;
+ }
+
+ String content;
+ int contentOffset;
+ int index;
+ try {
+ if (region.getLength() == 0) {
+ // expand the region to include the whole line
+ IRegion lineInfo = document.getLineInformationOfOffset(region.getOffset());
+ int lineLength = lineInfo.getLength();
+ int lineOffset = lineInfo.getOffset();
+ int lineEnd = lineOffset + lineLength;
+ int regionEnd = region.getOffset() + region.getLength();
+ if (lineOffset < region.getOffset()) {
+ int regionLength = Math.max(regionEnd, lineEnd) - lineOffset;
+ contentOffset = lineOffset;
+ content = document.get(lineOffset, regionLength);
+ index = region.getOffset() - lineOffset;
+ } else {
+ // the line starts after region, may never happen
+ int regionLength = Math.max(regionEnd, lineEnd) - region.getOffset();
+ contentOffset = region.getOffset();
+ content = document.get(contentOffset, regionLength);
+ index = 0;
+ }
+ } else {
+ content = document.get(region.getOffset(), region.getLength());
+ contentOffset = region.getOffset();
+ index = -1;
+ }
+ } catch (BadLocationException ex) {
+ return null;
+ }
+
+ List<IHyperlink> hyperlinks = detectHyperlinks(textViewer, content, index, contentOffset);
+ if (hyperlinks == null) {
+ return null;
+ }
+
+ // filter hyperlinks that do not match original region
+ if (region.getLength() == 0) {
+ for (Iterator<IHyperlink> it = hyperlinks.iterator(); it.hasNext();) {
+ IHyperlink hyperlink = it.next();
+ IRegion hyperlinkRegion = hyperlink.getHyperlinkRegion();
+ if (!isInRegion(region, hyperlinkRegion)) {
+ it.remove();
+ }
+ }
+ }
+ if (hyperlinks.isEmpty()) {
+ return null;
+ }
+ return hyperlinks.toArray(new IHyperlink[hyperlinks.size()]);
+ }
+
+ /**
+ * @since 3.1
+ */
+ protected abstract List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int index,
+ int contentOffset);
+
+ private boolean isInRegion(IRegion detectInRegion, IRegion hyperlinkRegion) {
+ return detectInRegion.getOffset() >= hyperlinkRegion.getOffset()
+ && detectInRegion.getOffset() <= hyperlinkRegion.getOffset() + hyperlinkRegion.getLength();
+ }
+
+ /**
+ * @since 3.1
+ */
+ protected List<TaskRepository> getTaskRepositories(ITextViewer textViewer) {
+ List<TaskRepository> repositories = new ArrayList<TaskRepository>();
+ TaskRepository selectedRepository = getTaskRepository(textViewer);
+ if (selectedRepository != null) {
+ repositories.add(selectedRepository);
+ } else {
+ repositories.addAll(TasksUi.getRepositoryManager().getAllRepositories());
+ }
+ return repositories;
+ }
+
+ /**
+ * @since 3.1
+ */
+ protected TaskRepository getTaskRepository(ITextViewer textViewer) {
+ TaskRepository repository = (TaskRepository) getAdapter(TaskRepository.class);
+ if (repository != null) {
+ return repository;
+ }
+
+ IResource resource = (IResource) getAdapter(IResource.class);
+ if (resource == null) {
+ // use currently active editor (if any)
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage activePage = window.getActivePage();
+ if (activePage != null) {
+ IWorkbenchPart part = activePage.getActivePart();
+ if (part instanceof IEditorPart) {
+ IEditorInput input = ((IEditorPart) part).getEditorInput();
+ if (input != null) {
+ resource = (IResource) input.getAdapter(IResource.class);
+ }
+ }
+ }
+ }
+ }
+ if (resource != null) {
+ return TasksUiPlugin.getDefault().getRepositoryForResource(resource);
+ }
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskRepositoryLinkProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskRepositoryLinkProvider.java
new file mode 100644
index 0000000..3f77380
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/AbstractTaskRepositoryLinkProvider.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tasks.ui;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Extend to provide linking between repositories and tasks.
+ *
+ * @author Eugene Kuleshov
+ * @since 2.0
+ */
+public abstract class AbstractTaskRepositoryLinkProvider implements IExecutableExtension {
+
+ private static final int DEFAULT_ORDER = 1000;
+
+ private String id;
+
+ private String name;
+
+ private int order;
+
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data) {
+ id = config.getAttribute("id"); //$NON-NLS-1$
+ name = config.getAttribute("name"); //$NON-NLS-1$
+ try {
+ order = Integer.parseInt(config.getAttribute("order")); //$NON-NLS-1$
+ } catch (NumberFormatException ex) {
+ order = DEFAULT_ORDER;
+ }
+ }
+
+ /**
+ * This operation is invoked frequently by hyperlink detectors and needs to be fast (i.e. cannot do network access
+ * or invoke long-running refreshes). Return null if the repository cannot be resolved without excessive file
+ * I/O. at since 3.0
+ *
+ * @since 3.0
+ */
+ public abstract TaskRepository getTaskRepository(IResource resource, IRepositoryManager repositoryManager);
+
+ public boolean canSetTaskRepository(IResource resource) {
+ return false;
+ }
+
+ public boolean setTaskRepository(IResource resource, TaskRepository repository) {
+ return false;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getOrder() {
+ return order;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/IHighlightingHyperlink.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/IHighlightingHyperlink.java
new file mode 100644
index 0000000..cd5cd34
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/IHighlightingHyperlink.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import org.eclipse.jface.text.IRegion;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.1
+ */
+public interface IHighlightingHyperlink {
+
+ public IRegion getHighlightingRegion();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/ITasksUiConstants.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/ITasksUiConstants.java
new file mode 100644
index 0000000..720d195
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/ITasksUiConstants.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ */
+public interface ITasksUiConstants {
+
+ /**
+ * @since 3.0
+ */
+ public static final String ID_COMMAND_MARK_TASK_UNREAD = "org.eclipse.mylyn.tasks.ui.command.markTaskUnread"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String ID_COMMAND_MARK_TASK_READ = "org.eclipse.mylyn.tasks.ui.command.markTaskRead"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String ID_PAGE_PLANNING = "org.eclipse.mylyn.tasks.ui.pageFactory.Planning"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String ID_PERSPECTIVE_PLANNING = "org.eclipse.mylyn.tasks.ui.perspectives.planning"; //$NON-NLS-1$
+
+ /**
+ * @since 3.0
+ */
+ public static final String ID_PREFERENCES_COLORS_AND_FONTS = "org.eclipse.ui.preferencePages.ColorsAndFonts"; //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final String ID_VIEW_TASKS = "org.eclipse.mylyn.tasks.ui.views.tasks"; //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final String ID_VIEW_REPOSITORIES = "org.eclipse.mylyn.tasks.ui.views.repositories"; //$NON-NLS-1$
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/ITasksUiFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/ITasksUiFactory.java
new file mode 100644
index 0000000..113b613
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/ITasksUiFactory.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * A factory for creating instances of reusable UI components.
+ *
+ * @author Steffen Pingel
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ * @since 3.1
+ */
+public interface ITasksUiFactory {
+
+ /**
+ * Returns a content assist processor for references to tasks.
+ *
+ * @since 3.1
+ */
+ public abstract IContentAssistProcessor createTaskContentAssistProcessor(TaskRepository repository);
+
+ /**
+ * Returns a content proposal provider for repository users.
+ *
+ * @since 3.1
+ * @see #createPersonContentProposalLabelProvider(TaskRepository)
+ */
+ public abstract IContentProposalProvider createPersonContentProposalProvider(TaskRepository repository);
+
+ /**
+ * Returns a label provider for repository users content proposals.
+ *
+ * @since 3.1
+ * @see #createPersonContentProposalProvider(TaskRepository)
+ */
+ public abstract ILabelProvider createPersonContentProposalLabelProvider(TaskRepository repository);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/LegendElement.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/LegendElement.java
new file mode 100644
index 0000000..2b0d02d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/LegendElement.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public class LegendElement {
+
+ /**
+ * @since 3.0
+ */
+ public static LegendElement createTask(String label, ImageDescriptor overlay) {
+ return new LegendElement(label, CommonImages.getCompositeTaskImage(TasksUiImages.TASK, overlay, false));
+ }
+
+ private final Image image;
+
+ private final String label;
+
+ private LegendElement(String label, Image image) {
+ this.label = label;
+ this.image = image;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void dispose() {
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Image getImage() {
+ return image;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getLabel() {
+ return label;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskElementLabelProvider.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskElementLabelProvider.java
new file mode 100644
index 0000000..d0b3e8d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskElementLabelProvider.java
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonColors;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.DayDateRange;
+import org.eclipse.mylyn.internal.tasks.core.Person;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
+import org.eclipse.mylyn.internal.tasks.core.UncategorizedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnmatchedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.UnsubmittedTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
+import org.eclipse.mylyn.internal.tasks.ui.ITaskHighlighter;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskContainer;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class TaskElementLabelProvider extends LabelProvider implements IColorProvider, IFontProvider {
+
+ private final IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+
+ private boolean wideImages = false;
+
+ private class CompositeImageDescriptor {
+
+ ImageDescriptor icon;
+
+ ImageDescriptor overlayKind;
+
+ };
+
+ public TaskElementLabelProvider() {
+ this(false);
+ }
+
+ public TaskElementLabelProvider(boolean wideImages) {
+ super();
+ this.wideImages = wideImages;
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ CompositeImageDescriptor compositeDescriptor = getImageDescriptor(element);
+ if (element instanceof ITask) {
+ if (compositeDescriptor.overlayKind == null) {
+ compositeDescriptor.overlayKind = CommonImages.OVERLAY_CLEAR;
+ }
+ return CommonImages.getCompositeTaskImage(compositeDescriptor.icon, compositeDescriptor.overlayKind,
+ wideImages);
+ } else if (element instanceof ITaskContainer) {
+ return CommonImages.getCompositeTaskImage(compositeDescriptor.icon, CommonImages.OVERLAY_CLEAR, wideImages);
+ } else {
+ return CommonImages.getCompositeTaskImage(compositeDescriptor.icon, null, wideImages);
+ }
+ }
+
+ private CompositeImageDescriptor getImageDescriptor(Object object) {
+ CompositeImageDescriptor compositeDescriptor = new CompositeImageDescriptor();
+ if (object instanceof UncategorizedTaskContainer) {
+ compositeDescriptor.icon = TasksUiImages.CATEGORY_UNCATEGORIZED;
+ return compositeDescriptor;
+ } else if (object instanceof UnsubmittedTaskContainer) {
+ compositeDescriptor.icon = TasksUiImages.CATEGORY_UNCATEGORIZED;
+ return compositeDescriptor;
+ } else if (object instanceof TaskCategory) {
+ compositeDescriptor.icon = TasksUiImages.CATEGORY;
+ } else if (object instanceof TaskGroup) {
+ compositeDescriptor.icon = CommonImages.GROUPING;
+ }
+
+ if (object instanceof ITaskContainer) {
+ IRepositoryElement element = (IRepositoryElement) object;
+
+ AbstractRepositoryConnectorUi connectorUi = null;
+ if (element instanceof ITask) {
+ ITask repositoryTask = (ITask) element;
+ connectorUi = TasksUiPlugin.getConnectorUi(((ITask) element).getConnectorKind());
+ if (connectorUi != null) {
+ compositeDescriptor.overlayKind = connectorUi.getTaskKindOverlay(repositoryTask);
+ }
+ } else if (element instanceof IRepositoryQuery) {
+ connectorUi = TasksUiPlugin.getConnectorUi(((IRepositoryQuery) element).getConnectorKind());
+ }
+
+ if (connectorUi != null) {
+ compositeDescriptor.icon = connectorUi.getImageDescriptor(element);
+ return compositeDescriptor;
+ } else {
+ if (element instanceof UnmatchedTaskContainer) {
+ compositeDescriptor.icon = TasksUiImages.QUERY_UNMATCHED;
+ } else if (element instanceof RepositoryQuery) {
+ compositeDescriptor.icon = ((RepositoryQuery) element).getAutoUpdate() ? TasksUiImages.QUERY
+ : TasksUiImages.QUERY_OFFLINE;
+ } else if (element instanceof ITask) {
+ compositeDescriptor.icon = TasksUiImages.TASK;
+ } else if (element instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer scheduledTaskContainer = (ScheduledTaskContainer) element;
+ if (scheduledTaskContainer.getDateRange() instanceof DayDateRange) {
+ compositeDescriptor.icon = CommonImages.SCHEDULE_DAY;
+ } else if (scheduledTaskContainer.getDateRange() instanceof WeekDateRange) {
+ compositeDescriptor.icon = CommonImages.SCHEDULE_WEEK;
+ } else {
+ compositeDescriptor.icon = TasksUiImages.QUERY_UNMATCHED;
+ }
+ } else if (element instanceof Person) {
+ compositeDescriptor.icon = CommonImages.PERSON;
+ Person person = (Person) element;
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(person.getConnectorKind(),
+ person.getRepositoryUrl());
+
+ if (repository != null
+ && !repository.isAnonymous()
+ && (repository.getUserName() != null && repository.getUserName().equalsIgnoreCase(
+ element.getHandleIdentifier()))) {
+ compositeDescriptor.icon = CommonImages.PERSON_ME;
+ }
+ }
+ return compositeDescriptor;
+ }
+ }
+ return compositeDescriptor;
+ }
+
+ @Override
+ public String getText(Object object) {
+ if (object instanceof ITask) {
+ ITask task = (ITask) object;
+ String summary = task.getSummary();
+ if (summary == null) {
+ summary = Messages.TaskElementLabelProvider__no_summary_available_;
+ }
+ String taskKey = task.getTaskKey();
+ if (taskKey != null) {
+ return taskKey + ": " + summary; //$NON-NLS-1$
+ } else {
+ return summary;
+ }
+ } else if (object instanceof IRepositoryElement) {
+ IRepositoryElement element = (IRepositoryElement) object;
+ return element.getSummary();
+ } else {
+ return super.getText(object);
+ }
+ }
+
+ public Color getForeground(Object object) {
+ if (object instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) object;
+ if (task != null) {
+ if (TasksUiPlugin.getTaskActivityManager().isCompletedToday(task)) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_COMPLETED_TODAY);
+ } else if (task.isCompleted()) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_COMPLETED);
+ } else if (TasksUi.getTaskActivityManager().isActive(task)) {
+ return CommonColors.CONTEXT_ACTIVE;
+ } else if (TasksUiPlugin.getTaskActivityManager().isOverdue(task)) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_OVERDUE);
+ } else if (TasksUiPlugin.getTaskActivityManager().isDueToday(task)) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_SCHEDULED_TODAY);
+ } else if (task.getScheduledForDate() != null
+ && TasksUiPlugin.getTaskActivityManager().isPastReminder(task)) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_SCHEDULED_PAST);
+ } else if (TasksUiPlugin.getTaskActivityManager().isScheduledForToday(task)) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_SCHEDULED_TODAY);
+ } else if (TasksUiPlugin.getTaskActivityManager().isScheduledForThisWeek(task)) {
+ return themeManager.getCurrentTheme()
+ .getColorRegistry()
+ .get(CommonThemes.COLOR_SCHEDULED_THIS_WEEK);
+ }
+ }
+ } else if (object instanceof ITaskContainer) {
+ for (ITask child : ((ITaskContainer) object).getChildren()) {
+ if (child.isActive() || (child instanceof ITaskContainer && showHasActiveChild((ITaskContainer) child))) {
+ return CommonColors.CONTEXT_ACTIVE;
+ } else if (TasksUiPlugin.getTaskActivityManager().isOverdue(child)) {
+// } else if ((child.isPastReminder() && !child.isCompleted()) || showHasChildrenPastDue(child)) {
+ return themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_OVERDUE);
+ }
+ }
+ }
+ return null;
+ }
+
+ public Color getBackground(Object element) {
+ if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ ITaskHighlighter highlighter = TasksUiPlugin.getDefault().getHighlighter();
+ if (highlighter != null) {
+ return highlighter.getHighlightColor(task);
+ }
+ }
+ return null;
+ }
+
+ public Font getFont(Object element) {
+ if (element instanceof AbstractTask) {
+ if (((AbstractTask) element).isSynchronizing()) {
+ if (((AbstractTask) element).isActive()) {
+ return CommonFonts.BOLD_ITALIC;
+ } else {
+ return CommonFonts.ITALIC;
+ }
+ }
+ }
+
+ if (element instanceof IRepositoryQuery) {
+ if (((RepositoryQuery) element).isSynchronizing()) {
+ return CommonFonts.ITALIC;
+ }
+ }
+
+ if (element instanceof ITaskContainer) {
+ for (ITask child : ((ITaskContainer) element).getChildren()) {
+ if (child.isActive() || (child instanceof ITaskContainer && showHasActiveChild((ITaskContainer) child))) {
+ return CommonFonts.BOLD;
+ }
+ }
+ }
+
+ if (element instanceof AbstractTask) {
+ if (((AbstractTask) element).isActive()) {
+ return CommonFonts.BOLD;
+ } else if (((AbstractTask) element).isCompleted()) {
+ if (CommonFonts.HAS_STRIKETHROUGH
+ && TasksUiPlugin.getDefault().getPluginPreferences().getBoolean(
+ ITasksUiPreferenceConstants.USE_STRIKETHROUGH_FOR_COMPLETED)) {
+ return CommonFonts.STRIKETHROUGH;
+ } else {
+ return null;
+ }
+ }
+ for (ITask child : ((ITaskContainer) element).getChildren()) {
+ if (child.isActive() || (child instanceof ITaskContainer && showHasActiveChild((ITaskContainer) child))) {
+ return CommonFonts.BOLD;
+ }
+ }
+ }
+ return null;
+ }
+
+ private boolean showHasActiveChild(ITaskContainer container) {
+ if (!TasksUiPlugin.getDefault().groupSubtasks(container)) {
+ return false;
+ }
+
+ return showHasActiveChildHelper(container, new HashSet<IRepositoryElement>());
+ }
+
+ private boolean showHasActiveChildHelper(ITaskContainer container, Set<IRepositoryElement> visitedContainers) {
+ for (IRepositoryElement child : container.getChildren()) {
+ if (visitedContainers.contains(child)) {
+ continue;
+ }
+ visitedContainers.add(child);
+ if (child instanceof ITask && ((AbstractTask) child).isActive()) {
+ return true;
+ } else if (child instanceof ITaskContainer) {
+ if (showHasActiveChildHelper((ITaskContainer) child, visitedContainers)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskHyperlink.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskHyperlink.java
new file mode 100644
index 0000000..d029488
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskHyperlink.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.Messages;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Immutable. Encapsulates information for linking to tasks from text.
+ *
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ * @noextend This class is not intended to be subclassed by clients.
+ */
+public final class TaskHyperlink implements IHyperlink {
+
+ private final IRegion region;
+
+ private final TaskRepository repository;
+
+ private final String taskId;
+
+ public TaskHyperlink(IRegion region, TaskRepository repository, String taskId) {
+ this.region = region;
+ this.repository = repository;
+ this.taskId = taskId;
+ }
+
+ public IRegion getHyperlinkRegion() {
+ return region;
+ }
+
+ public String getTaskId() {
+ return taskId;
+ }
+
+ public String getTypeLabel() {
+ return null;
+ }
+
+ /**
+ * @Since 2.1
+ * @return
+ */
+ public TaskRepository getRepository() {
+ return repository;
+ }
+
+ public String getHyperlinkText() {
+ return MessageFormat.format(Messages.TaskHyperlink_Open_Task_X_in_X, taskId, repository.getRepositoryLabel());
+ }
+
+ public void open() {
+ if (repository != null) {
+ TasksUiUtil.openTask(repository, taskId);
+ } else {
+ MessageDialog.openError(null, "Mylyn", Messages.TaskHyperlink_Could_not_determine_repository_for_report); //$NON-NLS-1$
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskHyperlinkPresenter.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskHyperlinkPresenter.java
new file mode 100644
index 0000000..6e0745f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskHyperlinkPresenter.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui;
+
+import java.lang.reflect.Constructor;
+import java.util.Iterator;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.hyperlink.DefaultHyperlinkPresenter;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ * A hyperlink presenter that displays a tooltip when hovering over a {@link TaskHyperlink}.
+ *
+ * @author Steffen Pingel
+ * @author Frank Becker
+ * @since 3.1
+ */
+public final class TaskHyperlinkPresenter extends DefaultHyperlinkPresenter {
+
+ private IRegion activeRegion;
+
+ /**
+ * Stores which task a tooltip is being displayed for. It is used to avoid having the same tooltip being set
+ * multiple times while you move the mouse over a task hyperlink (bug#209409)
+ */
+ private ITask currentTaskHyperlink;
+
+ private ITextViewer textViewer;
+
+ private IHyperlinkPresenter multiplePresenter;
+
+ /**
+ * @see DefaultHyperlinkPresenter#DefaultHyperlinkPresenter(IPreferenceStore)
+ */
+ public TaskHyperlinkPresenter(IPreferenceStore store) {
+ super(store);
+ initMultipleHyperlinkSupport(IPreferenceStore.class, store);
+ }
+
+ /**
+ * @see DefaultHyperlinkPresenter#DefaultHyperlinkPresenter(RGB)
+ */
+ public TaskHyperlinkPresenter(RGB color) {
+ super(color);
+ initMultipleHyperlinkSupport(RGB.class, color);
+ }
+
+ @Override
+ public boolean canShowMultipleHyperlinks() {
+ return multiplePresenter != null;
+ }
+
+ // TODO e3.4 remove reflection
+ @SuppressWarnings("unchecked")
+ private <T> void initMultipleHyperlinkSupport(Class<T> argClass, T arg) {
+ try {
+ Class<IHyperlinkPresenter> clazz = (Class<IHyperlinkPresenter>) Class.forName("org.eclipse.jface.text.hyperlink.MultipleHyperlinkPresenter"); //$NON-NLS-1$
+ Constructor<IHyperlinkPresenter> constructor = clazz.getDeclaredConstructor(argClass);
+ multiplePresenter = constructor.newInstance(arg);
+ } catch (Throwable t) {
+ // ignore
+ }
+ }
+
+ @Override
+ public void install(ITextViewer textViewer) {
+ this.textViewer = textViewer;
+ super.install(textViewer);
+ if (multiplePresenter != null) {
+ multiplePresenter.install(textViewer);
+ }
+ }
+
+ @Override
+ public void uninstall() {
+ hideHyperlinks();
+ this.textViewer = null;
+ super.uninstall();
+ if (multiplePresenter != null) {
+ multiplePresenter.uninstall();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void applyTextPresentation(TextPresentation textPresentation) {
+ super.applyTextPresentation(textPresentation);
+ // decorate hyperlink as strike-through if task is completed, this is now also handled by TaskHyperlinkTextPresentationManager
+ if (activeRegion != null && currentTaskHyperlink != null && currentTaskHyperlink.isCompleted()) {
+ Iterator<StyleRange> styleRangeIterator = textPresentation.getAllStyleRangeIterator();
+ while (styleRangeIterator.hasNext()) {
+ StyleRange styleRange = styleRangeIterator.next();
+ if (activeRegion.getOffset() == styleRange.start && activeRegion.getLength() == styleRange.length) {
+ styleRange.strikeout = true;
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void showHyperlinks(IHyperlink[] hyperlinks) {
+ if (hyperlinks.length > 1 && multiplePresenter != null) {
+ multiplePresenter.showHyperlinks(hyperlinks);
+ } else {
+ activeRegion = null;
+ if (hyperlinks.length > 0 && hyperlinks[0] instanceof TaskHyperlink) {
+ TaskHyperlink hyperlink = (TaskHyperlink) hyperlinks[0];
+
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ String repositoryUrl = hyperlink.getRepository().getRepositoryUrl();
+
+ ITask task = taskList.getTask(repositoryUrl, hyperlink.getTaskId());
+ if (task == null) {
+ task = taskList.getTaskByKey(repositoryUrl, hyperlink.getTaskId());
+ }
+
+ if (task != null && task != currentTaskHyperlink) {
+ currentTaskHyperlink = task;
+ activeRegion = hyperlink.getHyperlinkRegion();
+ if (textViewer != null && textViewer.getTextWidget() != null
+ && !textViewer.getTextWidget().isDisposed()) {
+ if (task.getTaskKey() == null) {
+ textViewer.getTextWidget().setToolTipText(task.getSummary());
+ } else {
+ textViewer.getTextWidget().setToolTipText(task.getTaskKey() + ": " + task.getSummary()); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ super.showHyperlinks(hyperlinks);
+ }
+ }
+
+ @Override
+ public void hideHyperlinks() {
+ if (currentTaskHyperlink != null) {
+ if (textViewer != null && textViewer.getTextWidget() != null && !textViewer.getTextWidget().isDisposed()) {
+ textViewer.getTextWidget().setToolTipText(null);
+ }
+ currentTaskHyperlink = null;
+ }
+ if (multiplePresenter != null) {
+ multiplePresenter.hideHyperlinks();
+ }
+ super.hideHyperlinks();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskRepositoryLocationUiFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskRepositoryLocationUiFactory.java
new file mode 100644
index 0000000..e9ad530
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TaskRepositoryLocationUiFactory.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.internal.tasks.ui.TaskRepositoryLocationUi;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+
+/**
+ * @since 2.2
+ * @author Steffen Pingel
+ */
+public class TaskRepositoryLocationUiFactory extends TaskRepositoryLocationFactory {
+
+ /**
+ * @since 3.0
+ */
+ @Override
+ public AbstractWebLocation createWebLocation(TaskRepository taskRepository) {
+ return new TaskRepositoryLocationUi(taskRepository);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUi.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUi.java
new file mode 100644
index 0000000..ec4bcb4
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUi.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryModel;
+import org.eclipse.mylyn.tasks.core.ITaskActivityManager;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataManager;
+
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @author Steffen Pingel
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class TasksUi {
+
+ /**
+ * @since 3.0
+ */
+ public static AbstractRepositoryConnector getRepositoryConnector(String kind) {
+ return getRepositoryManager().getRepositoryConnector(kind);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static AbstractRepositoryConnectorUi getRepositoryConnectorUi(String kind) {
+ return TasksUiPlugin.getConnectorUi(kind);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static IRepositoryManager getRepositoryManager() {
+ return TasksUiPlugin.getRepositoryManager();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static ITaskActivityManager getTaskActivityManager() {
+ return TasksUiPlugin.getTaskActivityManager();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static ITaskDataManager getTaskDataManager() {
+ return TasksUiPlugin.getTaskDataManager();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static IRepositoryModel getRepositoryModel() {
+ return TasksUiPlugin.getRepositoryModel();
+ }
+
+ /**
+ * @since 3.1
+ */
+ public static ITasksUiFactory getUiFactory() {
+ return TasksUiPlugin.getUiFactory();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUiImages.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUiImages.java
new file mode 100644
index 0000000..0574d13
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUiImages.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public class TasksUiImages {
+
+ private static final URL baseURL = TasksUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$
+
+ private static final String VIEW = "eview16"; //$NON-NLS-1$
+
+ private static final String TOOL = "etool16"; //$NON-NLS-1$
+
+ private static final String TOOL_SMALL = "etool12"; //$NON-NLS-1$
+
+ private static final String OBJ = "obj16"; //$NON-NLS-1$
+
+ private static final String WIZBAN = "wizban"; //$NON-NLS-1$
+
+ // Tasks and Task List elements
+
+ public static final ImageDescriptor TASK = create(TOOL, "task.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_COMPLETE = create(TOOL, "task-complete.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_INCOMPLETE = create(TOOL, "task-incomplete.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_COMPLETED = create(TOOL, "task-completed.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_NOTES = create(TOOL, "task-notes.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_NEW = create(TOOL, "task-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_NEW_SUB = create(TOOL, "sub-task-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_REPOSITORY_HISTORY = create(TOOL, "task-repository-history.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_REMOTE = create(TOOL, "task-remote.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_WORKING_SET = create(TOOL, "open-task.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASKS_VIEW = create("eview16", "task-list.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor TASK_ATTACHMENT_PATCH = create(OBJ, "attachment-patch.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_RETRIEVE = create(TOOL, "task-retrieve.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_REPOSITORY = create(TOOL, "task-repository.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor TASK_REPOSITORY_NEW = create(TOOL, "task-repository-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CATEGORY = create(TOOL, "category.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CATEGORY_NEW = create(TOOL, "category-new.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CATEGORY_UNCATEGORIZED = create(TOOL, "category-archive.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor QUERY = create(TOOL, "query.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor QUERY_NEW = create(TOOL, "query-new.gif"); //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final ImageDescriptor QUERY_OFFLINE = ImageDescriptor.createWithFlags(TasksUiImages.QUERY,
+ SWT.IMAGE_GRAY);
+
+ public static final ImageDescriptor QUERY_UNMATCHED = create(TOOL, "query-unmatched.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REPOSITORY = create("eview16", "repository.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor REPOSITORY_OFFLINE = ImageDescriptor.createWithFlags(TasksUiImages.REPOSITORY,
+ SWT.IMAGE_GRAY);
+
+ public static final ImageDescriptor REPOSITORY_SYNCHRONIZE_SMALL = create(TOOL_SMALL,
+ "repository-synchronize-small.png"); //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final ImageDescriptor REPOSITORY_UPDATE_CONFIGURATION = create(TOOL,
+ "repository-synchronize-attributes.png"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REPOSITORY_SYNCHRONIZE = create(TOOL, "repository-synchronize.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REPOSITORY_SUBMIT = create(TOOL, "repository-submit.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REPOSITORY_SMALL = create(OBJ, "repository-small.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor REPOSITORY_NEW = create("etool16", "repository-new.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ /**
+ * @since 3.1
+ */
+ public static final ImageDescriptor REPOSITORY_VALIDATE = create("obj16", "resource_obj.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static final ImageDescriptor REPOSITORIES_VIEW = create("eview16", "repositories.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ // Context and activation
+
+ public static final ImageDescriptor CONTEXT_ACTIVE = create(TOOL, "task-active.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_ACTIVE_CENTERED = create(TOOL, "task-active-centered.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_INACTIVE_EMPTY = create(TOOL, "task-inactive.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_INACTIVE = create(TOOL, "task-context.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_FOCUS = create(VIEW, "focus.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_ATTACH = create(TOOL, "context-attach.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_RETRIEVE = create(TOOL, "context-retrieve.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_TRANSFER = create(TOOL, "context-transfer.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_CLEAR = create(TOOL, "context-clear.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_HISTORY_PREVIOUS = create(TOOL, "navigate-previous.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_HISTORY_PREVIOUS_PAUSE = create(TOOL, "navigate-previous-pause.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_HISTORY_PREVIOUS_ACTIVE = create(TOOL, "navigate-previous-active.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_HISTORY_NEXT = create(TOOL, "navigate-next.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_CAPTURE_PAUSE = create(TOOL, "capture-pause.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_ADD = create(TOOL, "context-add.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor CONTEXT_COPY = create(TOOL, "context-transfer.gif"); //$NON-NLS-1$
+
+ // Comments and collaboration
+
+ public static final ImageDescriptor COMMENT = create(TOOL, "comment.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COMMENT_SORT_DOWN = create(TOOL, "sort-down.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COMMENT_SORT_UP = create(TOOL, "sort-up.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COMMENT_SORT_DOWN_GRAY = create(TOOL, "sort-down-gray.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COMMENT_SORT_UP_GRAY = create(TOOL, "sort-up-gray.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor COMMENT_REPLY = create(TOOL, "reply.gif"); //$NON-NLS-1$
+
+ /**
+ * @since 3.1
+ */
+ public static final ImageDescriptor COMMENT_REPLY_SMALL = create(TOOL_SMALL, "reply.gif"); //$NON-NLS-1$
+
+ // Wizard banners
+
+ public static final ImageDescriptor BANNER_REPOSITORY = create(WIZBAN, "banner-repository.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BANNER_REPOSITORY_SETTINGS = create(WIZBAN, "banner-repository-settings.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BANNER_REPOSITORY_CONTEXT = create(WIZBAN, "banner-repository-context.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor BANNER_WORKING_SET = create(WIZBAN, "workset_wiz.png"); //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final ImageDescriptor PRESENTATION_CATEGORIZED = create(TOOL, "presentation-categorized.png"); //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final ImageDescriptor PRESENTATION_SCHEDULED = create(TOOL, "presentation-scheduled.png"); //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final ImageDescriptor BANNER_REPORT_BUG = create(WIZBAN, "bug-wizard.gif"); //$NON-NLS-1$
+
+ public static Image getImageForPriority(PriorityLevel priorityLevel) {
+ if (priorityLevel == null) {
+ return null;
+ } else {
+ ImageDescriptor imageDescriptor = getImageDescriptorForPriority(priorityLevel);
+ if (imageDescriptor != null) {
+ return CommonImages.getImage(imageDescriptor);
+ }
+ }
+ return null;
+ }
+
+ public static ImageDescriptor getImageDescriptorForPriority(PriorityLevel priorityLevel) {
+ if (priorityLevel == null) {
+ return null;
+ }
+ switch (priorityLevel) {
+ case P1:
+ return CommonImages.PRIORITY_1;
+ case P2:
+ return CommonImages.PRIORITY_2;
+ case P3:
+ return CommonImages.PRIORITY_3;
+ case P4:
+ return CommonImages.PRIORITY_4;
+ case P5:
+ return CommonImages.PRIORITY_5;
+ default:
+ return null;
+ }
+ }
+
+ public static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuffer buffer = new StringBuffer(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUiUtil.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUiUtil.java
new file mode 100644
index 0000000..6e7b924
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/TasksUiUtil.java
@@ -0,0 +1,475 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.EditRepositoryWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.MultiRepositoryAwareWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewLocalTaskWizard;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.mylyn.tasks.ui.wizards.TaskRepositoryWizardDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @since 2.0
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @author Shawn Minto
+ */
+public class TasksUiUtil {
+
+ /**
+ * Flag that is passed along to the workbench browser support when a task is opened in a browser because no rich
+ * editor was available.
+ *
+ * @see #openTask(String)
+ */
+ public static final int FLAG_NO_RICH_EDITOR = 1 << 17;
+
+ /**
+ * @since 3.0
+ */
+ public static ITask createOutgoingNewTask(String connectorKind, String repositoryUrl) {
+ Assert.isNotNull(connectorKind);
+ LocalTask task = TasksUiInternal.createNewLocalTask(null);
+ task.setAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND, connectorKind);
+ task.setAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL, repositoryUrl);
+ task.setSynchronizationState(SynchronizationState.OUTGOING_NEW);
+ return task;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean isOutgoingNewTask(ITask task, String connectorKind) {
+ Assert.isNotNull(task);
+ Assert.isNotNull(connectorKind);
+ return connectorKind.equals(task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND));
+ }
+
+ /**
+ * @since 3.1
+ */
+ public static TaskRepository getOutgoingNewTaskRepository(ITask task) {
+ Assert.isNotNull(task);
+ String connectorKind = task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_CONNECTOR_KIND);
+ String repositoryUrl = task.getAttribute(ITasksCoreConstants.ATTRIBUTE_OUTGOING_NEW_REPOSITORY_URL);
+ if (connectorKind != null && repositoryUrl != null) {
+ return TasksUi.getRepositoryManager().getRepository(connectorKind, repositoryUrl);
+ }
+ return null;
+ }
+
+ public static TaskRepository getSelectedRepository() {
+ return getSelectedRepository(null);
+ }
+
+ /**
+ * Will use the workbench window's selection if viewer's selection is null
+ */
+ public static TaskRepository getSelectedRepository(StructuredViewer viewer) {
+ IStructuredSelection selection = null;
+ if (viewer != null) {
+ selection = (IStructuredSelection) viewer.getSelection();
+ }
+ if (selection == null || selection.isEmpty()) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ ISelection windowSelection = window.getSelectionService().getSelection();
+ if (windowSelection instanceof IStructuredSelection) {
+ selection = (IStructuredSelection) windowSelection;
+ }
+ }
+
+ if (selection == null) {
+ return null;
+ }
+
+ Object element = selection.getFirstElement();
+ if (element instanceof TaskRepository) {
+ return (TaskRepository) selection.getFirstElement();
+ } else if (element instanceof IRepositoryQuery) {
+ IRepositoryQuery query = (IRepositoryQuery) element;
+ return TasksUi.getRepositoryManager().getRepository(query.getConnectorKind(), query.getRepositoryUrl());
+ } else if (element instanceof ITask) {
+ ITask task = (ITask) element;
+ return TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(), task.getRepositoryUrl());
+ } else if (element instanceof IResource) {
+ IResource resource = (IResource) element;
+ return TasksUiPlugin.getDefault().getRepositoryForResource(resource);
+ } else if (element instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) element;
+ IResource resource = (IResource) adaptable.getAdapter(IResource.class);
+ if (resource != null) {
+ return TasksUiPlugin.getDefault().getRepositoryForResource(resource);
+ } else {
+ ITask task = (ITask) adaptable.getAdapter(AbstractTask.class);
+ if (task != null) {
+ ITask rtask = task;
+ return TasksUi.getRepositoryManager().getRepository(rtask.getConnectorKind(),
+ rtask.getRepositoryUrl());
+ }
+ }
+ }
+
+ // TODO mapping between LogEntry.pliginId and repositories
+ // TODO handle other selection types
+ return null;
+ }
+
+ private static String getTaskEditorId(final ITask task) {
+ String taskEditorId = TaskEditor.ID_EDITOR;
+ if (task != null) {
+ ITask repositoryTask = task;
+ AbstractRepositoryConnectorUi repositoryUi = TasksUiPlugin.getConnectorUi(repositoryTask.getConnectorKind());
+ String customTaskEditorId = repositoryUi.getTaskEditorId(repositoryTask);
+ if (customTaskEditorId != null) {
+ taskEditorId = customTaskEditorId;
+ }
+ }
+ return taskEditorId;
+ }
+
+ public static IEditorPart openEditor(IEditorInput input, String editorId, IWorkbenchPage page) {
+ if (page == null) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ page = window.getActivePage();
+ }
+ }
+ if (page == null) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unable to open editor for \"" + input //$NON-NLS-1$
+ + "\": no active workbench window")); //$NON-NLS-1$
+ return null;
+ }
+ try {
+ return page.openEditor(input, editorId);
+ } catch (PartInitException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Open for editor failed: " + input //$NON-NLS-1$
+ + ", taskId: " + editorId, e)); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ public static int openEditRepositoryWizard(TaskRepository repository) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ if (connector == null
+ || (!connector.isUserManaged() && !connector.getConnectorKind().equals(
+ LocalRepositoryConnector.CONNECTOR_KIND))) {
+ return Window.CANCEL;
+ }
+
+ try {
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed()) {
+ WizardDialog dialog = new TaskRepositoryWizardDialog(shell, wizard);
+ dialog.create();
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ return Window.CANCEL;
+ }
+ }
+
+ if (TaskRepositoriesView.getFromActivePerspective() != null) {
+ TaskRepositoriesView.getFromActivePerspective().getViewer().refresh();
+ }
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ }
+ return Window.OK;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean openNewLocalTaskEditor(Shell shell, ITaskMapping taskSelection) {
+ return openNewTaskEditor(shell, new NewLocalTaskWizard(taskSelection), taskSelection);
+ }
+
+ private static boolean openNewTaskEditor(Shell shell, IWizard wizard, ITaskMapping taskSelection) {
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.setBlockOnOpen(true);
+
+ // make sure the wizard has created its pages
+ dialog.create();
+ if (!(wizard instanceof MultiRepositoryAwareWizard) && wizard.canFinish()) {
+ wizard.performFinish();
+ return true;
+ }
+
+ int result = dialog.open();
+ return result == Window.OK;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean openNewTaskEditor(Shell shell, ITaskMapping taskSelection, TaskRepository taskRepository) {
+ final IWizard wizard;
+ List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
+ if (taskRepository == null && repositories.size() == 1) {
+ // only the Local repository connector is available
+ taskRepository = repositories.get(0);
+ }
+
+ if (taskRepository != null) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ wizard = connectorUi.getNewTaskWizard(taskRepository, taskSelection);
+ } else {
+ wizard = TasksUiInternal.createNewTaskWizard(taskSelection);
+ }
+
+ return openNewTaskEditor(shell, wizard, taskSelection);
+ }
+
+ /**
+ * Either pass in a repository and taskId, or fullUrl, or all of them
+ *
+ * @deprecated Use {@link #openTask(String,String,String)} instead
+ */
+ @Deprecated
+ public static boolean openRepositoryTask(String repositoryUrl, String taskId, String fullUrl) {
+ return openTask(repositoryUrl, taskId, fullUrl);
+ }
+
+ /**
+ * @deprecated Use {@link #openTask(TaskRepository,String)} instead
+ */
+ @Deprecated
+ public static boolean openRepositoryTask(TaskRepository repository, String taskId) {
+ return openTask(repository, taskId);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean openTask(ITask task) {
+ Assert.isNotNull(task);
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ boolean openWithBrowser = !TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ ITasksUiPreferenceConstants.EDITOR_TASKS_RICH);
+ if (openWithBrowser) {
+ openUrl(task.getUrl());
+ return true;
+ } else {
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ IEditorInput editorInput = new TaskEditorInput(taskRepository, task);
+ boolean wasOpen = refreshEditorContentsIfOpen(task, editorInput);
+ if (wasOpen) {
+ synchronizeTask(taskRepository, task);
+ return true;
+ } else {
+ IWorkbenchPage page = window.getActivePage();
+ IEditorPart editor = openEditor(editorInput, getTaskEditorId(task), page);
+ if (editor != null) {
+ synchronizeTask(taskRepository, task);
+ return true;
+ }
+ }
+ }
+ } else {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Unable to open editor for \"" //$NON-NLS-1$
+ + task.getSummary() + "\": no active workbench window")); //$NON-NLS-1$
+ }
+ return false;
+ }
+
+ private static void synchronizeTask(TaskRepository taskRepository, ITask task) {
+ if (task instanceof LocalTask) {
+ return;
+ }
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ if (connector.canSynchronizeTask(taskRepository, task)) {
+ TasksUiInternal.synchronizeTask(connector, task, false, null);
+ }
+ }
+
+ /**
+ * Resolves a rich editor for the task if available.
+ *
+ * @since 3.0
+ */
+ public static void openTask(String url) {
+ AbstractTask task = TasksUiInternal.getTaskByUrl(url);
+ if (task != null && !(task instanceof LocalTask)) {
+ openTask(task);
+ } else {
+ boolean opened = false;
+ if (url != null) {
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager()
+ .getConnectorForRepositoryTaskUrl(url);
+ if (connector != null) {
+ String repositoryUrl = connector.getRepositoryUrlFromTaskUrl(url);
+ if (repositoryUrl != null) {
+ String id = connector.getTaskIdFromTaskUrl(url);
+ if (id != null) {
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(
+ connector.getConnectorKind(), repositoryUrl);
+ if (repository != null) {
+ opened = openTask(repository, id);
+ }
+ }
+ }
+ }
+ }
+ if (!opened) {
+ WorkbenchUtil.openUrl(url, 0);
+ }
+ }
+ }
+
+ /**
+ * Either pass in a repository and taskId, or fullUrl, or all of them
+ *
+ * @since 3.0
+ */
+ public static boolean openTask(String repositoryUrl, String taskId, String fullUrl) {
+ AbstractTask task = TasksUiInternal.getTask(repositoryUrl, taskId, fullUrl);
+
+ if (task != null) {
+ return TasksUiUtil.openTask(task);
+ }
+
+ boolean opened = false;
+
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getConnectorForRepositoryTaskUrl(
+ fullUrl);
+ if (connector != null) {
+ if (repositoryUrl != null && taskId != null) {
+ opened = TasksUiInternal.openRepositoryTask(connector.getConnectorKind(), repositoryUrl, taskId);
+ } else {
+ repositoryUrl = connector.getRepositoryUrlFromTaskUrl(fullUrl);
+ taskId = connector.getTaskIdFromTaskUrl(fullUrl);
+ if (repositoryUrl != null && taskId != null) {
+ opened = TasksUiInternal.openRepositoryTask(connector.getConnectorKind(), repositoryUrl, taskId);
+ }
+ }
+ }
+
+ if (!opened) {
+ TasksUiUtil.openUrl(fullUrl);
+ }
+
+ return true;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static boolean openTask(TaskRepository repository, String taskId) {
+ Assert.isNotNull(repository);
+ Assert.isNotNull(taskId);
+
+ AbstractTask task = (AbstractTask) TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(), taskId);
+ if (task == null) {
+ task = TasksUiPlugin.getTaskList().getTaskByKey(repository.getRepositoryUrl(), taskId);
+ }
+ if (task != null) {
+ return TasksUiUtil.openTask(task);
+ } else {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ if (connectorUi != null) {
+ try {
+ return TasksUiInternal.openRepositoryTask(connectorUi.getConnectorKind(),
+ repository.getRepositoryUrl(), taskId);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Internal error while opening repository task", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static void openUrl(String location) {
+ WorkbenchUtil.openUrl(location, FLAG_NO_RICH_EDITOR);
+ }
+
+ /**
+ * If task is already open and has incoming, must force refresh in place
+ */
+ private static boolean refreshEditorContentsIfOpen(ITask task, IEditorInput editorInput) {
+ if (task != null) {
+ if (task.getSynchronizationState() == SynchronizationState.INCOMING
+ || task.getSynchronizationState() == SynchronizationState.CONFLICT) {
+ for (TaskEditor editor : TasksUiInternal.getActiveRepositoryTaskEditors()) {
+ if (editor.getEditorInput().equals(editorInput)) {
+ editor.refreshPages();
+ editor.getEditorSite().getPage().activate(editor);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static IViewPart openTasksViewInActivePerspective() {
+ try {
+ return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(
+ ITasksUiConstants.ID_VIEW_TASKS);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not show Task List view", e)); //$NON-NLS-1$
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractAttributeEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractAttributeEditor.java
new file mode 100644
index 0000000..b2b369c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractAttributeEditor.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractAttributeEditor {
+
+ private Control control;
+
+ private boolean decorationEnabled;
+
+ private Label labelControl;
+
+ private LayoutHint layoutHint;
+
+ private final TaskDataModel manager;
+
+ private final TaskAttribute taskAttribute;
+
+ private boolean readOnly;
+
+ /**
+ * @since 3.0
+ */
+ public AbstractAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ Assert.isNotNull(manager);
+ Assert.isNotNull(taskAttribute);
+ this.manager = manager;
+ this.taskAttribute = taskAttribute;
+ setDecorationEnabled(true);
+ setReadOnly(taskAttribute.getMetaData().isReadOnly());
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void attributeChanged() {
+ getModel().attributeChanged(getTaskAttribute());
+ }
+
+ /**
+ * @since 3.0
+ */
+ public abstract void createControl(Composite parent, FormToolkit toolkit);
+
+ /**
+ * @since 3.0
+ */
+ public void createLabelControl(Composite composite, FormToolkit toolkit) {
+ labelControl = toolkit.createLabel(composite, getLabel());
+ labelControl.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void dispose() {
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskDataModel getModel() {
+ return manager;
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected TaskAttributeMapper getAttributeMapper() {
+ return getModel().getTaskData().getAttributeMapper();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Control getControl() {
+ return control;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getLabel() {
+ String label = getAttributeMapper().getLabel(getTaskAttribute());
+ return TasksUiInternal.escapeLabelText(label);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Label getLabelControl() {
+ return labelControl;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public LayoutHint getLayoutHint() {
+ return layoutHint;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskAttribute getTaskAttribute() {
+ return taskAttribute;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean hasLabel() {
+ // TODO EDITOR
+ return true;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isDecorationEnabled() {
+ return decorationEnabled;
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void setControl(Control control) {
+ this.control = control;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setDecorationEnabled(boolean decorationEnabled) {
+ this.decorationEnabled = decorationEnabled;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public void setLayoutHint(LayoutHint layoutHint) {
+ this.layoutHint = layoutHint;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void decorate(Color color) {
+ if (isDecorationEnabled()) {
+ if (manager.hasBeenRead() && manager.hasIncomingChanges(getTaskAttribute())) {
+ decorateIncoming(color);
+ }
+ if (manager.hasOutgoingChanges(getTaskAttribute())) {
+ decorateOutgoing(color);
+ }
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void decorateOutgoing(Color color) {
+ if (labelControl != null) {
+ labelControl.setText("*" + labelControl.getText()); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void decorateIncoming(Color color) {
+ if (getControl() != null) {
+ getControl().setBackground(color);
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setReadOnly(boolean readOnly) {
+ this.readOnly = readOnly;
+ }
+
+ /**
+ * Refreshes the state of the widget from the data model. The default implementation throws
+ * <code>UnsupportedOperationException</code>.
+ *
+ * <p>
+ * Subclasses should overwrite this method.
+ *
+ * @since 3.1
+ * @throws UnsupportedOperationException
+ * if this method is not supported by the editor
+ */
+ public void refresh() {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRenderingEngine.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRenderingEngine.java
new file mode 100644
index 0000000..ba5e299
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractRenderingEngine.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.editors;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Extend to provide HTML preview for ticket description and comments
+ *
+ * @author Xiaoyang Guan
+ * @since 2.1
+ */
+// TODO 4.0 move to core?
+public abstract class AbstractRenderingEngine {
+
+ /**
+ * generate HTML preview page for <code>text</code>
+ */
+ public abstract String renderAsHtml(TaskRepository repository, String text, IProgressMonitor monitor)
+ throws CoreException;
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorExtension.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorExtension.java
new file mode 100644
index 0000000..3858f8c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorExtension.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.editors;
+
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.contexts.IContextService;
+
+/**
+ * An extension that provides task editor capabilities beyond the default, oriented towards providing markup-aware
+ * editing and viewing
+ *
+ * @author David Green
+ * @since 3.1
+ */
+public abstract class AbstractTaskEditorExtension {
+
+ /**
+ * The key to access the {@link TaskRepository} property that stores the URL of an associated wiki.
+ */
+ public static final String INTERNAL_WIKI_LINK_PATTERN = "wikiLinkPattern"; //$NON-NLS-1$
+
+ /**
+ * Creates a source viewer that can be used to view content in the task editor. The source viewer should be
+ * configured with a source viewer configuration prior to returning.
+ *
+ * @param taskRepository
+ * the task repository for which the viewer is created
+ * @param parent
+ * the control parent of the source viewer
+ * @param style
+ * the styles to use
+ */
+ public abstract SourceViewer createViewer(TaskRepository taskRepository, Composite parent, int style);
+
+ /**
+ * Creates a source viewer that can be used to edit content in the task editor. The source viewer should be
+ * configured with a source viewer configuration prior to returning.
+ *
+ * @param taskRepository
+ * the task repository for which the viewer is created
+ * @param parent
+ * the control parent of the source viewer
+ * @param style
+ * the styles to use
+ */
+ public abstract SourceViewer createEditor(TaskRepository taskRepository, Composite parent, int style);
+
+ /**
+ * Returns the editor context id, to be passed to the {@link IContextService} when the editor is in focus.
+ */
+ public abstract String getEditorContextId();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java
new file mode 100644
index 0000000..76d57a8
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPage.java
@@ -0,0 +1,1586 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * David Green - fixes for bug 237503
+ * Frank Becker - fixes for bug 252300
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.editors;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFormUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.GradientCanvas;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListRunnable;
+import org.eclipse.mylyn.internal.tasks.core.data.ITaskDataManagerListener;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManagerEvent;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.DeleteTaskEditorAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction;
+import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
+import org.eclipse.mylyn.internal.tasks.ui.editors.FocusTracker;
+import org.eclipse.mylyn.internal.tasks.ui.editors.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentDropListener;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttachmentPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorAttributePart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorCommentPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorContributionExtensionReader;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorDescriptionPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorNewCommentPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlineNode;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorOutlinePage;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPeoplePart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorPlanningPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorRichTextPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorSummaryPart;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskMigrator;
+import org.eclipse.mylyn.internal.tasks.ui.editors.ToolBarButtonContribution;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.core.data.ITaskDataWorkingCopy;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelEvent;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModelListener;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJob;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJobEvent;
+import org.eclipse.mylyn.tasks.core.sync.SubmitJobListener;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * Extend to provide a task editor page.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractTaskEditorPage extends TaskFormPage implements ISelectionProvider,
+ ISelectionChangedListener {
+
+ /**
+ * Causes the form page to reflow on resize.
+ */
+ private final class ParentResizeHandler implements Listener {
+ private int generation;
+
+ public void handleEvent(Event event) {
+ ++generation;
+
+ Display.getCurrent().timerExec(300, new Runnable() {
+ int scheduledGeneration = generation;
+
+ public void run() {
+ if (getManagedForm().getForm().isDisposed()) {
+ return;
+ }
+
+ // only reflow if this is the latest generation to prevent
+ // unnecessary reflows while the form is being resized
+ if (scheduledGeneration == generation) {
+ getManagedForm().reflow(true);
+ }
+ }
+ });
+ }
+ }
+
+ private class SubmitTaskJobListener extends SubmitJobListener {
+
+ private final boolean attachContext;
+
+ public SubmitTaskJobListener(boolean attachContext) {
+ this.attachContext = attachContext;
+ }
+
+ @Override
+ public void done(SubmitJobEvent event) {
+ final SubmitJob job = event.getJob();
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ private void addTask(ITask newTask) {
+ AbstractTaskContainer parent = null;
+ AbstractTaskEditorPart actionPart = getPart(ID_PART_ACTIONS);
+ if (actionPart instanceof TaskEditorActionPart) {
+ parent = ((TaskEditorActionPart) actionPart).getCategory();
+ }
+ TasksUiInternal.getTaskList().addTask(newTask, parent);
+ }
+
+ public void run() {
+ try {
+ if (job.getStatus() == null) {
+ TasksUiInternal.synchronizeRepository(getTaskRepository(), false);
+ if (job.getTask().equals(getTask())) {
+ refreshFormContent();
+ } else {
+ ITask oldTask = getTask();
+ ITask newTask = job.getTask();
+ addTask(newTask);
+
+ TaskMigrator migrator = new TaskMigrator(oldTask);
+ migrator.setDelete(true);
+ migrator.setEditor(getTaskEditor());
+ migrator.execute(newTask);
+ }
+ }
+ handleTaskSubmitted(new SubmitJobEvent(job));
+ } finally {
+ showEditorBusy(false);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void taskSubmitted(SubmitJobEvent event, IProgressMonitor monitor) throws CoreException {
+ if (!getModel().getTaskData().isNew() && attachContext) {
+ AttachmentUtil.postContext(connector, getModel().getTaskRepository(), task, "", null, monitor); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void taskSynchronized(SubmitJobEvent event, IProgressMonitor monitor) {
+ }
+
+ }
+
+// private class TaskListChangeListener extends TaskListChangeAdapter {
+// @Override
+// public void containersChanged(Set<TaskContainerDelta> containers) {
+// if (refreshDisabled) {
+// return;
+// }
+// ITask taskToRefresh = null;
+// for (TaskContainerDelta taskContainerDelta : containers) {
+// if (task.equals(taskContainerDelta.getElement())) {
+// if (taskContainerDelta.getKind().equals(TaskContainerDelta.Kind.CONTENT)
+// && !taskContainerDelta.isTransient()) {
+// taskToRefresh = (ITask) taskContainerDelta.getElement();
+// break;
+// }
+// }
+// }
+// if (taskToRefresh != null) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// if (!isDirty() && task.getSynchronizationState() == SynchronizationState.SYNCHRONIZED) {
+// // automatically refresh if the user has not made any changes and there is no chance of missing incomings
+// refreshFormContent();
+// } else {
+// getTaskEditor().setMessage("Task has incoming changes", IMessageProvider.WARNING,
+// new HyperlinkAdapter() {
+// @Override
+// public void linkActivated(HyperlinkEvent e) {
+// refreshFormContent();
+// }
+// });
+// setSubmitEnabled(false);
+// }
+// }
+// });
+// }
+// }
+// }
+
+ private final ITaskDataManagerListener TASK_DATA_LISTENER = new ITaskDataManagerListener() {
+
+ public void taskDataUpdated(final TaskDataManagerEvent event) {
+ ITask task = event.getTask();
+ if (task.equals(AbstractTaskEditorPage.this.getTask()) && event.getTaskDataUpdated()) {
+ refresh(task);
+ }
+ }
+
+ private void refresh(final ITask task) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (refreshDisabled) {
+ return;
+ }
+
+ if (!isDirty() && task.getSynchronizationState() == SynchronizationState.SYNCHRONIZED) {
+ // automatically refresh if the user has not made any changes and there is no chance of missing incomings
+ refreshFormContent();
+ } else {
+ getTaskEditor().setMessage(Messages.AbstractTaskEditorPage_Task_has_incoming_changes,
+ IMessageProvider.WARNING, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ refreshFormContent();
+ }
+ });
+ setSubmitEnabled(false);
+ }
+ }
+ });
+ }
+
+ public void editsDiscarded(TaskDataManagerEvent event) {
+ if (event.getTask().equals(AbstractTaskEditorPage.this.getTask())) {
+ refresh(event.getTask());
+ }
+ }
+ };
+
+ private static final String ERROR_NOCONNECTIVITY = Messages.AbstractTaskEditorPage_Unable_to_submit_at_this_time;
+
+ public static final String ID_PART_ACTIONS = "org.eclipse.mylyn.tasks.ui.editors.parts.actions"; //$NON-NLS-1$
+
+ public static final String ID_PART_ATTACHMENTS = "org.eclipse.mylyn.tasks.ui.editors.parts.attachments"; //$NON-NLS-1$
+
+ public static final String ID_PART_ATTRIBUTES = "org.eclipse.mylyn.tasks.ui.editors.parts.attributes"; //$NON-NLS-1$
+
+ public static final String ID_PART_COMMENTS = "org.eclipse.mylyn.tasks.ui.editors.parts.comments"; //$NON-NLS-1$
+
+ public static final String ID_PART_DESCRIPTION = "org.eclipse.mylyn.tasks.ui.editors.parts.descriptions"; //$NON-NLS-1$
+
+ public static final String ID_PART_NEW_COMMENT = "org.eclipse.mylyn.tasks.ui.editors.parts.newComment"; //$NON-NLS-1$
+
+ public static final String ID_PART_PEOPLE = "org.eclipse.mylyn.tasks.ui.editors.parts.people"; //$NON-NLS-1$
+
+ public static final String ID_PART_PLANNING = "org.eclipse.mylyn.tasks.ui.editors.parts.planning"; //$NON-NLS-1$
+
+ public static final String ID_PART_SUMMARY = "org.eclipse.mylyn.tasks.ui.editors.parts.summary"; //$NON-NLS-1$
+
+ public static final String PATH_ACTIONS = "actions"; //$NON-NLS-1$
+
+ public static final String PATH_ATTACHMENTS = "attachments"; //$NON-NLS-1$
+
+ public static final String PATH_ATTRIBUTES = "attributes"; //$NON-NLS-1$
+
+ public static final String PATH_COMMENTS = "comments"; //$NON-NLS-1$
+
+ public static final String PATH_HEADER = "header"; //$NON-NLS-1$
+
+ public static final String PATH_PEOPLE = "people"; //$NON-NLS-1$
+
+ public static final String PATH_PLANNING = "planning"; //$NON-NLS-1$
+
+// private static final String ID_POPUP_MENU = "org.eclipse.mylyn.tasks.ui.editor.menu.page";
+
+ private AttributeEditorFactory attributeEditorFactory;
+
+ private AttributeEditorToolkit attributeEditorToolkit;
+
+ private AbstractRepositoryConnector connector;
+
+ private final String connectorKind;
+
+ private StructuredSelection defaultSelection;
+
+ private Composite editorComposite;
+
+ private ScrolledForm form;
+
+ private boolean busy;
+
+ private ISelection lastSelection;
+
+ private TaskDataModel model;
+
+ private boolean needsAddToCategory;
+
+ private boolean reflow;
+
+ private volatile boolean refreshDisabled;
+
+ private final ListenerList selectionChangedListeners;
+
+ private SynchronizeEditorAction synchronizeEditorAction;
+
+ private ITask task;
+
+ private TaskData taskData;
+
+// private ITaskListChangeListener taskListChangeListener;
+
+ private FormToolkit toolkit;
+
+ private TaskEditorOutlinePage outlinePage;
+
+ private TaskAttachmentDropListener defaultDropListener;
+
+ private CommonTextSupport textSupport;
+
+ private Composite partControl;
+
+ private GradientCanvas footerComposite;
+
+ private boolean needsFooter;
+
+ private Button submitButton;
+
+ private boolean submitEnabled;
+
+ private boolean needsSubmit;
+
+ private boolean needsSubmitButton;
+
+ private boolean needsPrivateSection;
+
+ private FocusTracker focusTracker;
+
+ /**
+ * @since 3.1
+ */
+ public AbstractTaskEditorPage(TaskEditor editor, String id, String label, String connectorKind) {
+ super(editor, id, label);
+ Assert.isNotNull(connectorKind);
+ this.connectorKind = connectorKind;
+ this.reflow = true;
+ this.selectionChangedListeners = new ListenerList();
+ this.submitEnabled = true;
+ this.needsSubmit = true;
+ }
+
+ public AbstractTaskEditorPage(TaskEditor editor, String connectorKind) {
+ this(editor, "id", "label", connectorKind); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * @since 3.1
+ * @see FormPage#getEditor()
+ */
+ @Override
+ public TaskEditor getEditor() {
+ return (TaskEditor) super.getEditor();
+ }
+
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListeners.add(listener);
+ }
+
+ public void appendTextToNewComment(String text) {
+ AbstractTaskEditorPart newCommentPart = getPart(ID_PART_NEW_COMMENT);
+ if (newCommentPart instanceof TaskEditorRichTextPart) {
+ ((TaskEditorRichTextPart) newCommentPart).appendText(text);
+ newCommentPart.setFocus();
+ }
+ }
+
+ public boolean canPerformAction(String actionId) {
+ return CommonTextSupport.canPerformAction(actionId, EditorUtil.getFocusControl(this));
+ }
+
+ public void close() {
+ if (Display.getCurrent() != null) {
+ getSite().getPage().closeEditor(getTaskEditor(), false);
+ } else {
+ // TODO consider removing asyncExec()
+ Display activeDisplay = getSite().getShell().getDisplay();
+ activeDisplay.asyncExec(new Runnable() {
+ public void run() {
+ if (getSite() != null && getSite().getPage() != null && !getManagedForm().getForm().isDisposed()) {
+ if (getTaskEditor() != null) {
+ getSite().getPage().closeEditor(getTaskEditor(), false);
+ } else {
+ getSite().getPage().closeEditor(AbstractTaskEditorPage.this, false);
+ }
+ }
+ }
+ });
+ }
+ }
+
+ protected AttributeEditorFactory createAttributeEditorFactory() {
+ return new AttributeEditorFactory(getModel(), getTaskRepository(), getEditorSite());
+ }
+
+ AttributeEditorToolkit createAttributeEditorToolkit() {
+ return new AttributeEditorToolkit(textSupport);
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ parent.addListener(SWT.Resize, new ParentResizeHandler());
+
+ if (needsFooter()) {
+ partControl = getEditor().getToolkit().createComposite(parent);
+ GridLayout partControlLayout = new GridLayout(1, false);
+ partControlLayout.marginWidth = 0;
+ partControlLayout.marginHeight = 0;
+ partControlLayout.verticalSpacing = 0;
+ partControl.setLayout(partControlLayout);
+
+ super.createPartControl(partControl);
+ getManagedForm().getForm().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ footerComposite = new GradientCanvas(partControl, SWT.NONE);
+ footerComposite.setSeparatorVisible(true);
+ footerComposite.setSeparatorAlignment(SWT.TOP);
+ GridLayout headLayout = new GridLayout();
+ headLayout.marginHeight = 0;
+ headLayout.marginWidth = 0;
+ headLayout.horizontalSpacing = 0;
+ headLayout.verticalSpacing = 0;
+ headLayout.numColumns = 1;
+ footerComposite.setLayout(headLayout);
+ footerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ FormColors colors = getEditor().getToolkit().getColors();
+ Color top = colors.getColor(IFormColors.H_GRADIENT_END);
+ Color bottom = colors.getColor(IFormColors.H_GRADIENT_START);
+ footerComposite.setBackgroundGradient(new Color[] { bottom, top }, new int[] { 100 }, true);
+
+ footerComposite.putColor(IFormColors.H_BOTTOM_KEYLINE1, colors.getColor(IFormColors.H_BOTTOM_KEYLINE1));
+ footerComposite.putColor(IFormColors.H_BOTTOM_KEYLINE2, colors.getColor(IFormColors.H_BOTTOM_KEYLINE2));
+ footerComposite.putColor(IFormColors.H_HOVER_LIGHT, colors.getColor(IFormColors.H_HOVER_LIGHT));
+ footerComposite.putColor(IFormColors.H_HOVER_FULL, colors.getColor(IFormColors.H_HOVER_FULL));
+ footerComposite.putColor(IFormColors.TB_TOGGLE, colors.getColor(IFormColors.TB_TOGGLE));
+ footerComposite.putColor(IFormColors.TB_TOGGLE_HOVER, colors.getColor(IFormColors.TB_TOGGLE_HOVER));
+ footerComposite.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false));
+
+ createFooterContent(footerComposite);
+ } else {
+ super.createPartControl(parent);
+ }
+ }
+
+ @Override
+ protected void createFormContent(final IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+ form = managedForm.getForm();
+
+ toolkit = managedForm.getToolkit();
+ registerDefaultDropListener(form);
+ CommonFormUtil.disableScrollingOnFocus(form);
+
+ try {
+ setReflow(false);
+
+ editorComposite = form.getBody();
+ // TODO consider using TableWrapLayout, it makes resizing much faster
+ GridLayout editorLayout = new GridLayout();
+ editorLayout.verticalSpacing = 0;
+ editorComposite.setLayout(editorLayout);
+
+ //form.setData("focusScrolling", Boolean.FALSE);
+
+// menuManager = new MenuManager();
+// menuManager.setRemoveAllWhenShown(true);
+// getEditorSite().registerContextMenu(ID_POPUP_MENU, menuManager, this, true);
+// editorComposite.setMenu(menuManager.createContextMenu(editorComposite));
+ editorComposite.setMenu(getTaskEditor().getMenu());
+
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(getConnectorKind());
+ if (connectorUi == null) {
+ getTaskEditor().setMessage(Messages.AbstractTaskEditorPage_Synchronize_to_update_editor_contents,
+ IMessageProvider.INFORMATION, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ refreshFormContent();
+ }
+ });
+ }
+
+ if (taskData != null) {
+ createFormContentInternal();
+ }
+
+ updateHeaderMessage();
+ } finally {
+ setReflow(true);
+
+ // if the editor is restored as part of workbench startup then we must reflow() asynchronously
+ // otherwise the editor layout is incorrect
+ boolean reflowRequired = calculateReflowRequired(form);
+
+ if (reflowRequired) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ // this fixes a problem with layout that occurs when an editor
+ // is restored before the workbench is fully initialized
+ reflow();
+ }
+ });
+ }
+ }
+ }
+
+ private boolean calculateReflowRequired(ScrolledForm form) {
+ Composite stopComposite = getEditor().getEditorParent().getParent().getParent();
+ Composite composite = form.getParent();
+ while (composite != null) {
+ Rectangle clientArea = composite.getClientArea();
+ if (clientArea.width > 1) {
+ return false;
+ }
+ if (composite == stopComposite) {
+ return true;
+ }
+ composite = composite.getParent();
+ }
+ return true;
+ }
+
+ private void createFormContentInternal() {
+ // end life-cycle of previous editor controls
+ if (attributeEditorToolkit != null) {
+ attributeEditorToolkit.dispose();
+ }
+
+ // start life-cycle of previous editor controls
+ if (attributeEditorFactory == null) {
+ attributeEditorFactory = createAttributeEditorFactory();
+ Assert.isNotNull(attributeEditorFactory);
+ }
+ attributeEditorToolkit = createAttributeEditorToolkit();
+ Assert.isNotNull(attributeEditorToolkit);
+ attributeEditorToolkit.setMenu(editorComposite.getMenu());
+ attributeEditorFactory.setEditorToolkit(attributeEditorToolkit);
+
+ createParts();
+
+ focusTracker = new FocusTracker();
+ focusTracker.track(editorComposite);
+// AbstractTaskEditorPart summaryPart = getPart(ID_PART_SUMMARY);
+// if (summaryPart != null) {
+// lastFocusControl = summaryPart.getControl();
+// }
+ }
+
+ protected TaskDataModel createModel(TaskEditorInput input) throws CoreException {
+ ITaskDataWorkingCopy taskDataState;
+ try {
+ taskDataState = TasksUi.getTaskDataManager().getWorkingCopy(task);
+ } catch (OperationCanceledException e) {
+ // XXX retry once to work around bug 235479
+ taskDataState = TasksUi.getTaskDataManager().getWorkingCopy(task);
+ }
+ TaskRepository taskRepository = TasksUi.getRepositoryManager().getRepository(taskDataState.getConnectorKind(),
+ taskDataState.getRepositoryUrl());
+ return new TaskDataModel(taskRepository, input.getTask(), taskDataState);
+ }
+
+ /**
+ * To suppress a section, just remove its descriptor from the list. To add your own section in a specific order on
+ * the page, use the path value for where you want it to appear (your descriptor will appear after previously added
+ * descriptors with the same path), and add it to the descriptors list in your override of this method.
+ */
+ protected Set<TaskEditorPartDescriptor> createPartDescriptors() {
+ Set<TaskEditorPartDescriptor> descriptors = new LinkedHashSet<TaskEditorPartDescriptor>();
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_SUMMARY) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorSummaryPart();
+ }
+ }.setPath(PATH_HEADER));
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_ATTRIBUTES) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorAttributePart();
+ }
+ }.setPath(PATH_ATTRIBUTES));
+ if (!taskData.isNew() && connector.getTaskAttachmentHandler() != null) {
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_ATTACHMENTS) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorAttachmentPart();
+ }
+ }.setPath(PATH_ATTACHMENTS));
+ }
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_DESCRIPTION) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ TaskEditorDescriptionPart part = new TaskEditorDescriptionPart();
+ if (getModel().getTaskData().isNew()) {
+ part.setExpandVertically(true);
+ part.setSectionStyle(ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
+ }
+ return part;
+ }
+ }.setPath(PATH_COMMENTS));
+ if (!taskData.isNew()) {
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_COMMENTS) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorCommentPart();
+ }
+ }.setPath(PATH_COMMENTS));
+ }
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_NEW_COMMENT) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorNewCommentPart();
+ }
+ }.setPath(PATH_COMMENTS));
+
+ if (needsPrivateSection() || taskData.isNew()) {
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_PLANNING) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorPlanningPart();
+ }
+ }.setPath(PATH_PLANNING));
+ }
+
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_ACTIONS) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorActionPart();
+ }
+ }.setPath(PATH_ACTIONS));
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_PEOPLE) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TaskEditorPeoplePart();
+ }
+ }.setPath(PATH_PEOPLE));
+
+ descriptors.addAll(getContributionPartDescriptors());
+ return descriptors;
+ }
+
+ private Collection<TaskEditorPartDescriptor> getContributionPartDescriptors() {
+ return TaskEditorContributionExtensionReader.getRepositoryEditorContributions();
+ }
+
+ protected void createParts() {
+ List<TaskEditorPartDescriptor> descriptors = new LinkedList<TaskEditorPartDescriptor>(createPartDescriptors());
+ // single column
+ createParts(PATH_HEADER, editorComposite, descriptors);
+ createParts(PATH_ATTRIBUTES, editorComposite, descriptors);
+ createParts(PATH_PLANNING, editorComposite, descriptors);
+ createParts(PATH_ATTACHMENTS, editorComposite, descriptors);
+ createParts(PATH_COMMENTS, editorComposite, descriptors);
+ // two column
+ Composite bottomComposite = toolkit.createComposite(editorComposite);
+ bottomComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(bottomComposite);
+ createParts(PATH_ACTIONS, bottomComposite, descriptors);
+ createParts(PATH_PEOPLE, bottomComposite, descriptors);
+ bottomComposite.pack(true);
+ }
+
+ private void createParts(String path, final Composite parent, Collection<TaskEditorPartDescriptor> descriptors) {
+ for (Iterator<TaskEditorPartDescriptor> it = descriptors.iterator(); it.hasNext();) {
+ final TaskEditorPartDescriptor descriptor = it.next();
+ if (path == null || path.equals(descriptor.getPath())) {
+ SafeRunner.run(new ISafeRunnable() {
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Error creating task editor part: \"" + descriptor.getId() + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void run() throws Exception {
+ AbstractTaskEditorPart part = descriptor.createPart();
+ part.setPartId(descriptor.getId());
+ initializePart(parent, part);
+ }
+ });
+ it.remove();
+ }
+ }
+ }
+
+ @Override
+ public void dispose() {
+ if (textSupport != null) {
+ textSupport.dispose();
+ }
+ if (attributeEditorToolkit != null) {
+ attributeEditorToolkit.dispose();
+ }
+ TasksUiPlugin.getTaskDataManager().removeListener(TASK_DATA_LISTENER);
+ super.dispose();
+ }
+
+ public void doAction(String actionId) {
+ CommonTextSupport.doAction(actionId, EditorUtil.getFocusControl(this));
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ if (!isDirty()) {
+ return;
+ }
+
+ getManagedForm().commit(true);
+
+ if (model.isDirty()) {
+ try {
+ model.save(monitor);
+ } catch (final CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error saving task", e)); //$NON-NLS-1$
+ getTaskEditor().setMessage(Messages.AbstractTaskEditorPage_Could_not_save_task, IMessageProvider.ERROR,
+ new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent event) {
+ TasksUiInternal.displayStatus(Messages.AbstractTaskEditorPage_Save_failed,
+ e.getStatus());
+ }
+ });
+ }
+ }
+ // update the summary of unsubmitted repository tasks
+ if (getTask().getSynchronizationState() == SynchronizationState.OUTGOING_NEW) {
+ final String summary = connector.getTaskMapping(model.getTaskData()).getSummary();
+ try {
+ TasksUiPlugin.getTaskList().run(new ITaskListRunnable() {
+ public void execute(IProgressMonitor monitor) throws CoreException {
+ task.setSummary(summary);
+ }
+ });
+ TasksUiPlugin.getTaskList().notifyElementChanged(task);
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to set summary for task \"" + task + "\"", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ updateHeaderMessage();
+ getManagedForm().dirtyStateChanged();
+ getTaskEditor().updateHeaderToolBar();
+ }
+
+ @Override
+ public void doSaveAs() {
+ throw new UnsupportedOperationException();
+ }
+
+ public void doSubmit() {
+ if (!submitEnabled || !needsSubmit()) {
+ return;
+ }
+
+ try {
+ showEditorBusy(true);
+
+ doSave(new NullProgressMonitor());
+
+ SubmitJob submitJob = TasksUiInternal.getJobFactory().createSubmitTaskJob(connector,
+ getModel().getTaskRepository(), task, getModel().getTaskData(),
+ getModel().getChangedOldAttributes());
+ submitJob.addSubmitJobListener(new SubmitTaskJobListener(getAttachContext()));
+ submitJob.schedule();
+ } catch (RuntimeException e) {
+ showEditorBusy(false);
+ throw e;
+ }
+ }
+
+ /**
+ * Override for customizing the tool bar.
+ */
+ @Override
+ public void fillToolBar(IToolBarManager toolBarManager) {
+ final TaskRepository taskRepository = (model != null) ? getModel().getTaskRepository() : null;
+
+ if (taskData == null) {
+ synchronizeEditorAction = new SynchronizeEditorAction();
+ synchronizeEditorAction.selectionChanged(new StructuredSelection(getTaskEditor()));
+ toolBarManager.appendToGroup("repository", synchronizeEditorAction); //$NON-NLS-1$
+ } else {
+ if (taskData.isNew()) {
+ DeleteTaskEditorAction deleteAction = new DeleteTaskEditorAction(getTask());
+ toolBarManager.appendToGroup("new", deleteAction); //$NON-NLS-1$
+ } else if (taskRepository != null) {
+ ClearOutgoingAction clearOutgoingAction = new ClearOutgoingAction(
+ Collections.singletonList((IRepositoryElement) task));
+ (clearOutgoingAction).setTaskEditorPage(this);
+ if (clearOutgoingAction.isEnabled()) {
+ toolBarManager.appendToGroup("new", clearOutgoingAction); //$NON-NLS-1$
+ }
+
+ if (task.getSynchronizationState() != SynchronizationState.OUTGOING_NEW) {
+ synchronizeEditorAction = new SynchronizeEditorAction();
+ synchronizeEditorAction.selectionChanged(new StructuredSelection(getTaskEditor()));
+ toolBarManager.appendToGroup("repository", synchronizeEditorAction); //$NON-NLS-1$
+ }
+
+ NewSubTaskAction newSubTaskAction = new NewSubTaskAction();
+ newSubTaskAction.selectionChanged(newSubTaskAction, new StructuredSelection(task));
+ if (newSubTaskAction.isEnabled()) {
+ toolBarManager.appendToGroup("new", newSubTaskAction); //$NON-NLS-1$
+ }
+
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskData.getConnectorKind());
+ if (connectorUi != null) {
+ final String historyUrl = connectorUi.getTaskHistoryUrl(taskRepository, task);
+ if (historyUrl != null) {
+ Action historyAction = new Action() {
+ @Override
+ public void run() {
+ TasksUiUtil.openUrl(historyUrl);
+ }
+ };
+
+ historyAction.setImageDescriptor(TasksUiImages.TASK_REPOSITORY_HISTORY);
+ historyAction.setToolTipText(Messages.AbstractTaskEditorPage_History);
+ toolBarManager.prependToGroup("open", historyAction); //$NON-NLS-1$
+ }
+ }
+ }
+ if (needsSubmitButton()) {
+ ToolBarButtonContribution submitButtonContribution = new ToolBarButtonContribution(
+ "org.eclipse.mylyn.tasks.toolbars.submit") { //$NON-NLS-1$
+ @Override
+ protected Control createButton(Composite composite) {
+ submitButton = toolkit.createButton(composite,
+ Messages.TaskEditorActionPart_Submit + " ", SWT.NONE); //$NON-NLS-1$
+ submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
+ submitButton.setBackground(null);
+ submitButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ doSubmit();
+ }
+ });
+ return submitButton;
+ }
+ };
+ submitButtonContribution.marginLeft = 10;
+ toolBarManager.add(submitButtonContribution);
+ }
+ }
+ }
+
+ protected void fireSelectionChanged(ISelection selection) {
+ // create an event
+ final SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
+
+ // fire the event
+ Object[] listeners = selectionChangedListeners.getListeners();
+ for (int i = 0; i < listeners.length; ++i) {
+ final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
+ SafeRunner.run(new SafeRunnable() {
+ public void run() {
+ l.selectionChanged(event);
+ }
+ });
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (adapter == IContentOutlinePage.class) {
+ updateOutlinePage();
+ return outlinePage;
+ }
+ // TODO 3.3 replace by getTextSupport() method
+ if (adapter == CommonTextSupport.class) {
+ return textSupport;
+ }
+ return super.getAdapter(adapter);
+ }
+
+ private void updateOutlinePage() {
+ if (outlinePage == null) {
+ outlinePage = new TaskEditorOutlinePage();
+ outlinePage.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof StructuredSelection) {
+ Object select = ((StructuredSelection) selection).getFirstElement();
+ if (select instanceof TaskEditorOutlineNode) {
+ TaskEditorOutlineNode node = (TaskEditorOutlineNode) select;
+ TaskAttribute attribute = node.getData();
+ if (attribute != null) {
+ if (TaskAttribute.TYPE_COMMENT.equals(attribute.getMetaData().getType())) {
+ AbstractTaskEditorPart actionPart = getPart(ID_PART_COMMENTS);
+ if (actionPart != null && actionPart.getControl() instanceof ExpandableComposite) {
+ CommonFormUtil.setExpanded((ExpandableComposite) actionPart.getControl(), true);
+ if (actionPart.getControl() instanceof Section) {
+ Control client = ((Section) actionPart.getControl()).getClient();
+ if (client instanceof Composite) {
+ for (Control control : ((Composite) client).getChildren()) {
+ // toggle subsections
+ if (control instanceof Section) {
+ CommonFormUtil.setExpanded((Section) control, true);
+ }
+ }
+ }
+ }
+ }
+ }
+ EditorUtil.reveal(form, attribute.getId());
+ } else {
+ EditorUtil.reveal(form, node.getLabel());
+ }
+ getEditor().setActivePage(getId());
+ }
+ }
+ }
+ });
+ }
+ if (getModel() != null) {
+ TaskEditorOutlineNode node = TaskEditorOutlineNode.parse(getModel().getTaskData());
+ outlinePage.setInput(getTaskRepository(), node);
+ } else {
+ outlinePage.setInput(null, null);
+ }
+ }
+
+ private boolean getAttachContext() {
+ AbstractTaskEditorPart actionPart = getPart(ID_PART_ACTIONS);
+ if (actionPart instanceof TaskEditorActionPart) {
+ return ((TaskEditorActionPart) actionPart).getAttachContext();
+ }
+ return false;
+ }
+
+ public AttributeEditorFactory getAttributeEditorFactory() {
+ return attributeEditorFactory;
+ }
+
+ public AttributeEditorToolkit getAttributeEditorToolkit() {
+ return attributeEditorToolkit;
+ }
+
+ public AbstractRepositoryConnector getConnector() {
+ return connector;
+ }
+
+ public String getConnectorKind() {
+ return connectorKind;
+ }
+
+ /**
+ * @return The composite for the whole editor.
+ */
+ public Composite getEditorComposite() {
+ return editorComposite;
+ }
+
+ public TaskDataModel getModel() {
+ return model;
+ }
+
+ public AbstractTaskEditorPart getPart(String partId) {
+ Assert.isNotNull(partId);
+ for (IFormPart part : getManagedForm().getParts()) {
+ if (part instanceof AbstractTaskEditorPart) {
+ AbstractTaskEditorPart taskEditorPart = (AbstractTaskEditorPart) part;
+ if (partId.equals(taskEditorPart.getPartId())) {
+ return taskEditorPart;
+ }
+ }
+ }
+ return null;
+ }
+
+ public ISelection getSelection() {
+ return lastSelection;
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ public TaskEditor getTaskEditor() {
+ return getEditor();
+ }
+
+ public TaskRepository getTaskRepository() {
+ // FIXME model can be null
+ return getModel().getTaskRepository();
+ }
+
+ /**
+ * Invoked after task submission has completed. This method is invoked on the UI thread in all cases whether
+ * submission was successful, canceled or failed. The value returned by <code>event.getJob().getStatus()</code>
+ * indicates the result of the submit job. Sub-classes may override but are encouraged to invoke the super method.
+ *
+ * @since 3.2
+ * @see SubmitJob
+ */
+ protected void handleTaskSubmitted(SubmitJobEvent event) {
+ IStatus status = event.getJob().getStatus();
+ if (status != null && status.getSeverity() != IStatus.CANCEL) {
+ handleSubmitError(event.getJob());
+ }
+ }
+
+ private void handleSubmitError(SubmitJob job) {
+ if (form != null && !form.isDisposed()) {
+ final IStatus status = job.getStatus();
+ if (status.getCode() == RepositoryStatus.REPOSITORY_COMMENT_REQUIRED) {
+ TasksUiInternal.displayStatus(Messages.AbstractTaskEditorPage_Comment_required, status);
+ AbstractTaskEditorPart newCommentPart = getPart(ID_PART_NEW_COMMENT);
+ if (newCommentPart != null) {
+ newCommentPart.setFocus();
+ }
+ } else if (status.getCode() == RepositoryStatus.ERROR_REPOSITORY_LOGIN) {
+ if (TasksUiUtil.openEditRepositoryWizard(getTaskRepository()) == Window.OK) {
+ doSubmit();
+ }
+ } else {
+ String message;
+ if (status.getCode() == RepositoryStatus.ERROR_IO) {
+ message = ERROR_NOCONNECTIVITY;
+ } else if (status.getMessage().length() > 0) {
+ message = Messages.AbstractTaskEditorPage_Submit_failed_ + status.getMessage();
+ } else {
+ message = Messages.AbstractTaskEditorPage_Submit_failed;
+ }
+ getTaskEditor().setMessage(message, IMessageProvider.ERROR, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TasksUiInternal.displayStatus(Messages.AbstractTaskEditorPage_Submit_failed, status);
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) {
+ super.init(site, input);
+
+ // XXX consider propagating selection events to site selection provider instead to avoid conflicts with other pages
+ site.setSelectionProvider(this);
+
+ TaskEditorInput taskEditorInput = (TaskEditorInput) input;
+ this.task = taskEditorInput.getTask();
+ this.defaultSelection = new StructuredSelection(task);
+ this.lastSelection = defaultSelection;
+ IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+ this.textSupport = new CommonTextSupport(handlerService);
+ this.textSupport.setSelectionChangedListener(this);
+
+ initModel(taskEditorInput);
+
+ TasksUiPlugin.getTaskDataManager().addListener(TASK_DATA_LISTENER);
+ }
+
+ private void initModel(TaskEditorInput input) {
+ Assert.isTrue(model == null);
+ try {
+ this.model = createModel(input);
+ this.connector = TasksUi.getRepositoryManager().getRepositoryConnector(getConnectorKind());
+ setTaskData(model.getTaskData());
+ model.addModelListener(new TaskDataModelListener() {
+ @Override
+ public void attributeChanged(TaskDataModelEvent event) {
+ getManagedForm().dirtyStateChanged();
+ }
+ });
+ setNeedsAddToCategory(model.getTaskData().isNew());
+ } catch (final CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error opening task", e)); //$NON-NLS-1$
+ getTaskEditor().setStatus(Messages.AbstractTaskEditorPage_Error_opening_task,
+ Messages.AbstractTaskEditorPage_Open_failed, e.getStatus());
+ }
+ }
+
+ private void initializePart(Composite parent, AbstractTaskEditorPart part) {
+ getManagedForm().addPart(part);
+ part.initialize(this);
+ part.createControl(parent, toolkit);
+ if (part.getControl() != null) {
+ if (ID_PART_ACTIONS.equals(part.getPartId())) {
+ // do not expand horizontally
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(false, false).applyTo(part.getControl());
+ } else {
+ if (part.getExpandVertically()) {
+ GridDataFactory.fillDefaults()
+ .align(SWT.FILL, SWT.FILL)
+ .grab(true, true)
+ .applyTo(part.getControl());
+ } else {
+ GridDataFactory.fillDefaults()
+ .align(SWT.FILL, SWT.TOP)
+ .grab(true, false)
+ .applyTo(part.getControl());
+ }
+ }
+ // for outline
+ if (ID_PART_COMMENTS.equals(part.getPartId())) {
+ EditorUtil.setMarker(part.getControl(), TaskEditorOutlineNode.LABEL_COMMENTS);
+ }
+ }
+ }
+
+ @Override
+ public boolean isDirty() {
+ return (getModel() != null && getModel().isDirty()) || (getManagedForm() != null && getManagedForm().isDirty());
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ public boolean needsAddToCategory() {
+ return needsAddToCategory;
+ }
+
+ /**
+ * Force a re-layout of entire form.
+ */
+ public void reflow() {
+ if (reflow) {
+ try {
+ form.setRedraw(false);
+ // help the layout managers: ensure that the form width always matches
+ // the parent client area width.
+ Rectangle parentClientArea = form.getParent().getClientArea();
+ Point formSize = form.getSize();
+ if (formSize.x != parentClientArea.width) {
+ ScrollBar verticalBar = form.getVerticalBar();
+ int verticalBarWidth = verticalBar != null ? verticalBar.getSize().x : 15;
+ form.setSize(parentClientArea.width - verticalBarWidth, formSize.y);
+ }
+
+ form.layout(true, false);
+ form.reflow(true);
+ } finally {
+ form.setRedraw(true);
+ }
+ }
+ }
+
+ /**
+ * Updates the editor contents in place.
+ */
+ public void refreshFormContent() {
+ if (getManagedForm().getForm().isDisposed()) {
+ // editor possibly closed as part of submit
+ return;
+ }
+
+ try {
+ showEditorBusy(true);
+
+ if (model != null) {
+ doSave(new NullProgressMonitor());
+ refreshInput();
+ } else {
+ initModel(getTaskEditor().getTaskEditorInput());
+ }
+
+ if (taskData != null) {
+ try {
+ setReflow(false);
+ // prevent menu from being disposed when disposing control on the form during refresh
+ Menu menu = editorComposite.getMenu();
+ CommonUiUtil.setMenu(editorComposite, null);
+
+ // clear old controls and parts
+ for (Control control : editorComposite.getChildren()) {
+ control.dispose();
+ }
+ if (focusTracker != null) {
+ focusTracker.reset();
+ }
+ lastSelection = null;
+ for (IFormPart part : getManagedForm().getParts()) {
+ part.dispose();
+ getManagedForm().removePart(part);
+ }
+
+ // restore menu
+ editorComposite.setMenu(menu);
+
+ createFormContentInternal();
+
+ getTaskEditor().setMessage(null, 0);
+ getTaskEditor().setActivePage(getId());
+
+ setSubmitEnabled(true);
+ } finally {
+ setReflow(true);
+ }
+ }
+
+ updateOutlinePage();
+ updateHeaderMessage();
+ getManagedForm().dirtyStateChanged();
+ getTaskEditor().updateHeaderToolBar();
+ } finally {
+ showEditorBusy(false);
+ }
+ reflow();
+ }
+
+ private void refreshInput() {
+ try {
+ refreshDisabled = true;
+ model.refresh(null);
+ } catch (CoreException e) {
+ getTaskEditor().setMessage(Messages.AbstractTaskEditorPage_Failed_to_read_task_data_ + e.getMessage(),
+ IMessageProvider.ERROR);
+ taskData = null;
+ return;
+ } finally {
+ refreshDisabled = false;
+ }
+
+ setTaskData(model.getTaskData());
+ }
+
+ /**
+ * Registers a drop listener for <code>control</code>. The default implementation registers a listener for attaching
+ * files. Does nothing if the editor is showing a new task.
+ * <p>
+ * Clients may override.
+ * </p>
+ *
+ * @param control
+ * the control to register the listener for
+ */
+ public void registerDefaultDropListener(final Control control) {
+ if (getModel() == null || getModel().getTaskData().isNew()) {
+ return;
+ }
+
+ DropTarget target = new DropTarget(control, DND.DROP_COPY | DND.DROP_DEFAULT);
+ final TextTransfer textTransfer = TextTransfer.getInstance();
+ final FileTransfer fileTransfer = FileTransfer.getInstance();
+ Transfer[] types = new Transfer[] { textTransfer, fileTransfer };
+ target.setTransfer(types);
+ if (defaultDropListener == null) {
+ defaultDropListener = new TaskAttachmentDropListener(this);
+ }
+ target.addDropListener(defaultDropListener);
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListeners.remove(listener);
+ }
+
+ public void selectionChanged(Object element) {
+ selectionChanged(new SelectionChangedEvent(this, new StructuredSelection(element)));
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (selection instanceof TextSelection) {
+ // only update global actions
+ ((TaskEditorActionContributor) getEditorSite().getActionBarContributor()).updateSelectableActions(event.getSelection());
+ return;
+ }
+ if (selection.isEmpty()) {
+ // something was unselected, reset to default selection
+ selection = defaultSelection;
+ // XXX a styled text widget has lost focus, re-enable all edit actions
+ ((TaskEditorActionContributor) getEditorSite().getActionBarContributor()).forceActionsEnabled();
+ }
+ if (!selection.equals(lastSelection)) {
+ this.lastSelection = selection;
+ fireSelectionChanged(lastSelection);
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ if (focusTracker != null && focusTracker.setFocus()) {
+ return;
+ } else {
+ IFormPart[] parts = getManagedForm().getParts();
+ if (parts.length > 0) {
+ parts[0].setFocus();
+ return;
+ }
+ }
+ super.setFocus();
+ }
+
+ public void setNeedsAddToCategory(boolean needsAddToCategory) {
+ this.needsAddToCategory = needsAddToCategory;
+ }
+
+ public void setReflow(boolean reflow) {
+ this.reflow = reflow;
+ form.setRedraw(reflow);
+ }
+
+ public void setSelection(ISelection selection) {
+ IFormPart[] parts = getManagedForm().getParts();
+ for (IFormPart formPart : parts) {
+ if (formPart instanceof AbstractTaskEditorPart) {
+ if (((AbstractTaskEditorPart) formPart).setSelection(selection)) {
+ lastSelection = selection;
+ return;
+ }
+ }
+ }
+ }
+
+ // TODO EDITOR this needs to be tracked somewhere else
+ private void setSubmitEnabled(boolean enabled) {
+ AbstractTaskEditorPart actionPart = getPart(ID_PART_ACTIONS);
+ if (actionPart instanceof TaskEditorActionPart) {
+ ((TaskEditorActionPart) actionPart).setSubmitEnabled(enabled);
+ }
+ if (submitButton != null) {
+ submitButton.setEnabled(enabled);
+ }
+ submitEnabled = enabled;
+ }
+
+ private void setTaskData(TaskData taskData) {
+ this.taskData = taskData;
+ }
+
+ @Override
+ public void showBusy(boolean busy) {
+ if (!getManagedForm().getForm().isDisposed() && this.busy != busy) {
+ setSubmitEnabled(!busy);
+ CommonUiUtil.setEnabled(editorComposite, !busy);
+ this.busy = busy;
+ }
+ }
+
+ public void showEditorBusy(boolean busy) {
+ getTaskEditor().showBusy(busy);
+ refreshDisabled = busy;
+ }
+
+ private void updateHeaderMessage() {
+ if (taskData == null) {
+ getTaskEditor().setMessage(Messages.AbstractTaskEditorPage_Synchronize_to_retrieve_task_data,
+ IMessageProvider.WARNING, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (synchronizeEditorAction != null) {
+ synchronizeEditorAction.run();
+ }
+ }
+ });
+ }
+ if (getTaskEditor().getMessage() == null
+ && TasksUiPlugin.getTaskList().getTask(task.getRepositoryUrl(), task.getTaskId()) == null) {
+ getTaskEditor().setMessage(Messages.AbstractTaskEditorPage_Add_task_to_tasklist,
+ IMessageProvider.INFORMATION, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (TasksUiPlugin.getTaskList().getTask(task.getRepositoryUrl(), task.getTaskId()) == null) {
+ TasksUiPlugin.getTaskList().addTask(task,
+ TasksUiPlugin.getTaskList().getDefaultCategory());
+ getTaskEditor().setMessage(null, IMessageProvider.NONE, null);
+// updateHeaderMessage();
+ }
+ }
+ });
+ }
+ }
+
+ @Override
+ public Control getPartControl() {
+ return partControl != null ? partControl : super.getPartControl();
+ }
+
+ /**
+ * Returns true, if the page has an always visible footer.
+ *
+ * @see #setNeedsFooter(boolean)
+ */
+ private boolean needsFooter() {
+ return needsFooter;
+ }
+
+ /**
+ * Specifies that the page should provide an always visible footer. This flag is not set by default.
+ *
+ * @see #createFooterContent(Composite)
+ * @see #needsFooter()
+ */
+ @SuppressWarnings("unused")
+ private void setNeedsFooter(boolean needsFooter) {
+ this.needsFooter = needsFooter;
+ }
+
+ private void createFooterContent(Composite parent) {
+ parent.setLayout(new GridLayout());
+
+// submitButton = toolkit.createButton(parent, Messages.TaskEditorActionPart_Submit, SWT.NONE);
+// GridData submitButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+// submitButtonData.widthHint = 100;
+// submitButton.setBackground(null);
+// submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
+// submitButton.setLayoutData(submitButtonData);
+// submitButton.addListener(SWT.Selection, new Listener() {
+// public void handleEvent(Event e) {
+// doSubmit();
+// }
+// });
+ }
+
+ /**
+ * Returns true, if the page supports a submit operation.
+ *
+ * @since 3.2
+ * @see #setNeedsSubmit(boolean)
+ */
+ public boolean needsSubmit() {
+ return needsSubmit;
+ }
+
+ /**
+ * Specifies that the page supports the submit operation. This flag is set to true by default.
+ *
+ * @since 3.2
+ * @see #needsSubmit()
+ * @see #doSubmit()
+ */
+ public void setNeedsSubmit(boolean needsSubmit) {
+ this.needsSubmit = needsSubmit;
+ }
+
+ /**
+ * Returns true, if the page provides a submit button.
+ *
+ * @since 3.2
+ * @see #setNeedsSubmitButton(boolean)
+ */
+ public boolean needsSubmitButton() {
+ return needsSubmitButton;
+ }
+
+ /**
+ * Specifies that the page supports submitting. This flag is set to false by default.
+ *
+ * @since 3.2
+ * @see #needsSubmitButton()
+ */
+ public void setNeedsSubmitButton(boolean needsSubmitButton) {
+ this.needsSubmitButton = needsSubmitButton;
+ }
+
+ /**
+ * Returns true, if the page provides a submit button.
+ *
+ * @since 3.2
+ * @see #setNeedsPrivateSection(boolean)
+ */
+ public boolean needsPrivateSection() {
+ return needsPrivateSection;
+ }
+
+ /**
+ * Specifies that the page should provide the private section. This flag is not set by default.
+ *
+ * @since 3.2
+ * @see #needsPrivateSection()
+ */
+ public void setNeedsPrivateSection(boolean needsPrivateSection) {
+ this.needsPrivateSection = needsPrivateSection;
+ }
+
+// private void fillLeftHeaderToolBar(IToolBarManager toolBarManager) {
+// if (needsSubmit()) {
+// ControlContribution submitButtonContribution = new ControlContribution(
+// "org.eclipse.mylyn.tasks.toolbars.submit") { //$NON-NLS-1$
+// @Override
+// protected int computeWidth(Control control) {
+// return super.computeWidth(control) + 5;
+// }
+//
+// @Override
+// protected Control createControl(Composite parent) {
+// Composite composite = new Composite(parent, SWT.NONE);
+// composite.setBackground(null);
+// GridLayout layout = new GridLayout();
+// layout.marginWidth = 0;
+// layout.marginHeight = 0;
+// layout.marginLeft = 10;
+// composite.setLayout(layout);
+//
+// submitButton = toolkit.createButton(composite, Messages.TaskEditorActionPart_Submit + " ", SWT.NONE); //$NON-NLS-1$
+// submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
+// submitButton.setBackground(null);
+// submitButton.addListener(SWT.Selection, new Listener() {
+// public void handleEvent(Event e) {
+// doSubmit();
+// }
+// });
+// GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BOTTOM).applyTo(submitButton);
+// return composite;
+// }
+// };
+// toolBarManager.add(submitButtonContribution);
+// }
+// }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPageFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPageFactory.java
new file mode 100644
index 0000000..abf6226
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPageFactory.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IPluginContribution;
+import org.eclipse.ui.forms.editor.IFormPage;
+
+/**
+ * @since 3.0
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTaskEditorPageFactory implements IPluginContribution {
+
+ public static final int PRIORITY_ADDITIONS = 100;
+
+ public static final int PRIORITY_CONTEXT = 20;
+
+ public static final int PRIORITY_PLANNING = 10;
+
+ public static final int PRIORITY_TASK = 30;
+
+ private String id;
+
+ private String pluginId;
+
+ public abstract boolean canCreatePageFor(TaskEditorInput input);
+
+ public abstract IFormPage createPage(TaskEditor parentEditor);
+
+ public String[] getConflictingIds(TaskEditorInput input) {
+ return null;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ // TODO EDITOR life cycle of image?
+ public abstract Image getPageImage();
+
+ public abstract String getPageText();
+
+ public int getPriority() {
+ return PRIORITY_ADDITIONS;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @since 3.2
+ */
+ public final String getLocalId() {
+ return getId();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @since 3.2
+ * @see #setPluginId(String)
+ */
+ public final String getPluginId() {
+ return pluginId;
+ }
+
+ /**
+ * @since 3.2
+ * @see #getPluginId()
+ */
+ public final void setPluginId(String pluginId) {
+ this.pluginId = pluginId;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPart.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPart.java
new file mode 100644
index 0000000..eedb78d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AbstractTaskEditorPart.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.AbstractFormPart;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractTaskEditorPart extends AbstractFormPart {
+
+ // the default font of some controls, e.g. radio buttons, is too big; set this font explicitly on the control
+ protected static final Font TEXT_FONT = JFaceResources.getDefaultFont();
+
+ private Control control;
+
+ private String partName;
+
+ private String partId;
+
+ private AbstractTaskEditorPage taskEditorPage;
+
+ private boolean expandVertically;
+
+ public AbstractTaskEditorPart() {
+ }
+
+ protected AbstractAttributeEditor createAttributeEditor(TaskAttribute attribute) {
+ if (attribute == null) {
+ return null;
+ }
+
+ String type = attribute.getMetaData().getType();
+ if (type != null) {
+ AttributeEditorFactory attributeEditorFactory = getTaskEditorPage().getAttributeEditorFactory();
+ AbstractAttributeEditor editor = attributeEditorFactory.createEditor(type, attribute);
+ if (editor instanceof RichTextAttributeEditor) {
+ boolean spellChecking = getTaskEditorPage().getAttributeEditorToolkit().hasSpellChecking(attribute);
+ ((RichTextAttributeEditor) editor).setSpellCheckingEnabled(spellChecking);
+ }
+ return editor;
+ }
+ return null;
+ }
+
+ public abstract void createControl(Composite parent, FormToolkit toolkit);
+
+ protected Section createSection(Composite parent, FormToolkit toolkit, int style) {
+ Section section = toolkit.createSection(parent, style);
+ section.setText(getPartName());
+ return section;
+ }
+
+ protected Section createSection(Composite parent, FormToolkit toolkit, boolean expandedState) {
+ int style = ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE;
+ if (expandedState) {
+ style |= ExpandableComposite.EXPANDED;
+ }
+ return createSection(parent, toolkit, style);
+ }
+
+ protected void fillToolBar(ToolBarManager toolBarManager) {
+ }
+
+ public Control getControl() {
+ return control;
+ }
+
+ public TaskDataModel getModel() {
+ return getTaskEditorPage().getModel();
+ }
+
+ public String getPartId() {
+ return partId;
+ }
+
+ public String getPartName() {
+ return partName;
+ }
+
+ public TaskData getTaskData() {
+ return getTaskEditorPage().getModel().getTaskData();
+ }
+
+ public AbstractTaskEditorPage getTaskEditorPage() {
+ return taskEditorPage;
+ }
+
+ public void initialize(AbstractTaskEditorPage taskEditorPage) {
+ this.taskEditorPage = taskEditorPage;
+ }
+
+ public void setControl(Control control) {
+ this.control = control;
+ }
+
+ void setPartId(String partId) {
+ this.partId = partId;
+ }
+
+ protected void setPartName(String partName) {
+ this.partName = partName;
+ }
+
+ protected void setSection(FormToolkit toolkit, Section section) {
+ if (section.getTextClient() == null) {
+ ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+ fillToolBar(toolBarManager);
+
+ // TODO toolBarManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+
+ if (toolBarManager.getSize() > 0) {
+ Composite toolbarComposite = toolkit.createComposite(section);
+ toolbarComposite.setBackground(null);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.marginTop = 0;
+ rowLayout.marginBottom = 0;
+ toolbarComposite.setLayout(rowLayout);
+
+ toolBarManager.createControl(toolbarComposite);
+ section.clientVerticalSpacing = 0;
+ section.descriptionVerticalSpacing = 0;
+ section.setTextClient(toolbarComposite);
+ }
+ }
+ setControl(section);
+ }
+
+ protected boolean setSelection(ISelection selection) {
+ return false;
+ }
+
+ public boolean getExpandVertically() {
+ return expandVertically;
+ }
+
+ public void setExpandVertically(boolean expandVertically) {
+ this.expandVertically = expandVertically;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AttributeEditorFactory.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AttributeEditorFactory.java
new file mode 100644
index 0000000..13b5487
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AttributeEditorFactory.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.tasks.ui.editors.BooleanAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.DateAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.LongTextAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.MultiSelectionAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.PersonAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.SingleSelectionAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TextAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.services.IServiceLocator;
+
+/**
+ * @since 3.0
+ * @author Steffen Pingel
+ */
+public class AttributeEditorFactory {
+
+ private final TaskDataModel model;
+
+ private final TaskRepository taskRepository;
+
+ private final IServiceLocator serviceLocator;
+
+ private AttributeEditorToolkit editorToolkit;
+
+ public AttributeEditorFactory(TaskDataModel model, TaskRepository taskRepository) {
+ this(model, taskRepository, null);
+ }
+
+ /**
+ * @since 3.1
+ */
+ public AttributeEditorFactory(TaskDataModel model, TaskRepository taskRepository, IServiceLocator serviceLocator) {
+ Assert.isNotNull(model);
+ Assert.isNotNull(taskRepository);
+ this.model = model;
+ this.taskRepository = taskRepository;
+ this.serviceLocator = serviceLocator;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public AttributeEditorToolkit getEditorToolkit() {
+ return editorToolkit;
+ }
+
+ /**
+ * @since 3.1
+ */
+ public void setEditorToolkit(AttributeEditorToolkit editorToolkit) {
+ this.editorToolkit = editorToolkit;
+ }
+
+ public AbstractAttributeEditor createEditor(String type, TaskAttribute taskAttribute) {
+ Assert.isNotNull(type);
+
+ if (TaskAttribute.TYPE_BOOLEAN.equals(type)) {
+ return new BooleanAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_DATE.equals(type)) {
+ return new DateAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_DATETIME.equals(type)) {
+ DateAttributeEditor editor = new DateAttributeEditor(model, taskAttribute);
+ editor.setShowTime(true);
+ return editor;
+ } else if (TaskAttribute.TYPE_PERSON.equals(type)) {
+ return new PersonAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_LONG_RICH_TEXT.equals(type)) {
+ RichTextAttributeEditor editor = null;
+ if (serviceLocator != null) {
+ IContextService contextService = (IContextService) serviceLocator.getService(IContextService.class);
+ if (contextService != null) {
+ AbstractTaskEditorExtension extension = TaskEditorExtensions.getTaskEditorExtension(model.getTaskRepository());
+ if (extension != null) {
+ editor = new RichTextAttributeEditor(model, taskRepository, taskAttribute, SWT.MULTI,
+ contextService, extension);
+ }
+ }
+ }
+ if (editor == null) {
+ editor = new RichTextAttributeEditor(model, taskRepository, taskAttribute);
+ }
+ if (editorToolkit != null) {
+ editor.setRenderingEngine(editorToolkit.getRenderingEngine(taskAttribute));
+ }
+ return editor;
+ } else if (TaskAttribute.TYPE_LONG_TEXT.equals(type)) {
+ return new LongTextAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_MULTI_SELECT.equals(type)) {
+ return new MultiSelectionAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_SHORT_RICH_TEXT.equals(type)) {
+ return new RichTextAttributeEditor(model, taskRepository, taskAttribute, SWT.SINGLE);
+ } else if (TaskAttribute.TYPE_SHORT_TEXT.equals(type)) {
+ return new TextAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_SINGLE_SELECT.equals(type)) {
+ return new SingleSelectionAttributeEditor(model, taskAttribute);
+ } else if (TaskAttribute.TYPE_TASK_DEPENDENCY.equals(type)) {
+ RichTextAttributeEditor editor = new RichTextAttributeEditor(model, taskRepository, taskAttribute,
+ SWT.MULTI | TasksUiInternal.SWT_NO_SCROLL) {
+ @Override
+ public String getValue() {
+ return getAttributeMapper().getValueLabel(getTaskAttribute());
+ }
+ };
+ editor.setMode(Mode.TASK_RELATION);
+ editor.setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE) {
+ @Override
+ public int getPriority() {
+ return DEFAULT_PRIORITY + 1;
+ }
+ });
+ return editor;
+ } else if (TaskAttribute.TYPE_URL.equals(type)) {
+ RichTextAttributeEditor editor = new RichTextAttributeEditor(model, taskRepository, taskAttribute,
+ SWT.SINGLE);
+ editor.setMode(Mode.URL);
+ return editor;
+ }
+
+ throw new IllegalArgumentException("Unsupported editor type: \"" + type + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AttributeEditorToolkit.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AttributeEditorToolkit.java
new file mode 100644
index 0000000..ec80c8c
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/AttributeEditorToolkit.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.jface.fieldassist.ComboContentAdapter;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.jface.fieldassist.FieldDecoration;
+import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.IControlContentAdapter;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.tasks.ui.PersonProposalLabelProvider;
+import org.eclipse.mylyn.internal.tasks.ui.PersonProposalProvider;
+import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
+import org.eclipse.mylyn.internal.tasks.ui.editors.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextAttributeEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration.Mode;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.handlers.IHandlerActivation;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+// TODO EDITOR rename to AttributeUiToolkit?
+public class AttributeEditorToolkit {
+
+ private final Color colorIncoming;
+
+ private Menu menu;
+
+ private AbstractRenderingEngine renderingEngine;
+
+ private final CommonTextSupport textSupport;
+
+ @Deprecated
+ public IHandlerActivation contentAssistHandlerActivation;
+
+ AttributeEditorToolkit(CommonTextSupport textSupport) {
+ this.textSupport = textSupport;
+ IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+ colorIncoming = themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_INCOMING_BACKGROUND);
+ }
+
+ public void adapt(AbstractAttributeEditor editor) {
+ if (editor.getControl() instanceof Text || editor.getControl() instanceof CCombo) {
+ Control control = editor.getControl();
+ if (!editor.isReadOnly() && hasContentAssist(editor.getTaskAttribute())) {
+ IContentProposalProvider contentProposalProvider = createContentProposalProvider(editor.getTaskAttribute());
+ ILabelProvider labelPropsalProvider = createLabelProposalProvider(editor.getTaskAttribute());
+ if (contentProposalProvider != null && labelPropsalProvider != null) {
+ ContentAssistCommandAdapter adapter = new ContentAssistCommandAdapter(control,
+ getContentAdapter(control), contentProposalProvider,
+ ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, new char[0], true);
+ adapter.setLabelProvider(labelPropsalProvider);
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ }
+ }
+ } else if (editor instanceof RichTextAttributeEditor) {
+ RichTextAttributeEditor richTextEditor = (RichTextAttributeEditor) editor;
+ boolean spellCheck = hasSpellChecking(editor.getTaskAttribute());
+ final SourceViewer viewer = richTextEditor.getViewer();
+ textSupport.install(viewer, spellCheck);
+ if (!editor.isReadOnly() && richTextEditor.getMode() == Mode.TASK_RELATION) {
+ installContentAssistControlDecoration(viewer.getControl());
+ }
+ installMenu(viewer.getControl());
+ } else {
+ final TextViewer viewer = CommonTextSupport.getTextViewer(editor.getControl());
+ if (viewer != null) {
+ textSupport.install(viewer, false);
+ installMenu(viewer.getControl());
+ }
+ }
+
+ // for outline
+ EditorUtil.setMarker(editor.getControl(), editor.getTaskAttribute().getId());
+
+ editor.decorate(getColorIncoming());
+ }
+
+ private IControlContentAdapter getContentAdapter(Control control) {
+ if (control instanceof Combo) {
+ return new ComboContentAdapter();
+ } else if (control instanceof Text) {
+ return new TextContentAdapter();
+ }
+ return null;
+ }
+
+ private void installMenu(final Control control) {
+ if (menu != null) {
+ control.setMenu(menu);
+ control.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ control.setMenu(null);
+ }
+ });
+ }
+ }
+
+ /**
+ * Adds content assist to the given text field.
+ *
+ * @param text
+ * text field to decorate.
+ * @param proposalProvider
+ * instance providing content proposals
+ * @return the ContentAssistCommandAdapter for the field.
+ */
+ private ControlDecoration installContentAssistControlDecoration(Control control) {
+ ControlDecoration controlDecoration = new ControlDecoration(control, (SWT.TOP | SWT.LEFT));
+ controlDecoration.setShowOnlyOnFocus(true);
+ FieldDecoration contentProposalImage = FieldDecorationRegistry.getDefault().getFieldDecoration(
+ FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
+ controlDecoration.setImage(contentProposalImage.getImage());
+ IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench().getService(IBindingService.class);
+ controlDecoration.setDescriptionText(NLS.bind(Messages.AttributeEditorToolkit_Content_Assist_Available__X_,
+ bindingService.getBestActiveBindingFormattedFor(ContentAssistCommandAdapter.CONTENT_PROPOSAL_COMMAND)));
+ return controlDecoration;
+ }
+
+ /**
+ * Creates an IContentProposalProvider to provide content assist proposals for the given attribute.
+ *
+ * @param attribute
+ * attribute for which to provide content assist.
+ * @return the IContentProposalProvider.
+ */
+ private IContentProposalProvider createContentProposalProvider(TaskAttribute attribute) {
+ return new PersonProposalProvider(null, attribute.getTaskData());
+ }
+
+ private ILabelProvider createLabelProposalProvider(TaskAttribute attribute) {
+ return new PersonProposalLabelProvider();
+ }
+
+ void dispose() {
+ // FIXME textSupport.deactivateHandlers();
+ }
+
+ public Color getColorIncoming() {
+ return colorIncoming;
+ }
+
+ Menu getMenu() {
+ return menu;
+ }
+
+ /**
+ * Subclasses that support HTML preview of ticket description and comments override this method to return an
+ * instance of AbstractRenderingEngine
+ *
+ * @return <code>null</code> if HTML preview is not supported for the repository (default)
+ * @since 2.1
+ */
+ public AbstractRenderingEngine getRenderingEngine(TaskAttribute attribute) {
+ return renderingEngine;
+ }
+
+ /**
+ * Called to check if there's content assist available for the given attribute.
+ *
+ * @param attribute
+ * the attribute
+ * @return true if content assist is available for the specified attribute.
+ */
+ private boolean hasContentAssist(TaskAttribute taskAttribute) {
+ String type = taskAttribute.getMetaData().getType();
+ if (TaskAttribute.TYPE_PERSON.equals(type)) {
+ return true;
+ } else if (TaskAttribute.TYPE_TASK_DEPENDENCY.equals(type)) {
+ return true;
+ }
+ return false;
+ }
+
+ boolean hasSpellChecking(TaskAttribute taskAttribute) {
+ String type = taskAttribute.getMetaData().getType();
+ if (TaskAttribute.TYPE_LONG_RICH_TEXT.equals(type) || TaskAttribute.TYPE_SHORT_RICH_TEXT.equals(type)) {
+ return true;
+ }
+ return false;
+ }
+
+ void setMenu(Menu menu) {
+ this.menu = menu;
+ }
+
+ public void setRenderingEngine(AbstractRenderingEngine renderingEngine) {
+ this.renderingEngine = renderingEngine;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/BrowserFormPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/BrowserFormPage.java
new file mode 100644
index 0000000..d4e6861
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/BrowserFormPage.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.internal.browser.BrowserViewer;
+import org.eclipse.ui.internal.browser.IBrowserViewerContainer;
+
+/**
+ * A form page that contains a browser control.
+ *
+ * @since 3.0
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class BrowserFormPage extends FormPage {
+
+ public static final String ID_EDITOR = "org.eclipse.mylyn.tasks.ui.editor.browser"; //$NON-NLS-1$
+
+ private BrowserViewer browserViewer;
+
+ public BrowserFormPage(FormEditor editor, String title) {
+ super(editor, ID_EDITOR, title);
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+ try {
+ ScrolledForm form = managedForm.getForm();
+ form.getBody().setLayout(new FillLayout());
+ browserViewer = new BrowserViewer(form.getBody(), SWT.NONE);
+ browserViewer.setLayoutData(null);
+ browserViewer.setContainer(new IBrowserViewerContainer() {
+
+ public boolean close() {
+ return false;
+ }
+
+ public IActionBars getActionBars() {
+ return BrowserFormPage.this.getEditorSite().getActionBars();
+ }
+
+ public void openInExternalBrowser(String url) {
+ // ignore
+ }
+
+ });
+ managedForm.getForm().setContent(browserViewer);
+ String url = getUrl();
+ if (url != null) {
+ browserViewer.setURL(url);
+ }
+ } catch (SWTError e) {
+ // TODO review error handling
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not create browser page: " //$NON-NLS-1$
+ + e.getMessage(), e));
+ } catch (RuntimeException e) {
+ // TODO review error handling
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not create browser page", e)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Returns a reference to the browser control.
+ */
+ public Browser getBrowser() {
+ return browserViewer.getBrowser();
+ }
+
+ /**
+ * Returns the initial URL that is displayed in the browser control. The default implementation tries to determine
+ * the URL from the editor input.
+ * <p>
+ * Subclasses should override this method to display a specific URL.
+ *
+ * @return the URL to load when the page is created; null, if no URL should be loaded
+ */
+ protected String getUrl() {
+ IEditorInput input = getEditorInput();
+ if (input instanceof TaskEditorInput) {
+ return ((TaskEditorInput) input).getTask().getUrl();
+ }
+ return null;
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) {
+ super.init(site, input);
+ if (input instanceof TaskEditorInput) {
+ TasksUiPlugin.getTaskDataManager().setTaskRead(((TaskEditorInput) input).getTask(), true);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/LayoutHint.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/LayoutHint.java
new file mode 100644
index 0000000..3a61e1f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/LayoutHint.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+/**
+ * A layout hint for attribute editors.
+ *
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class LayoutHint {
+
+ /**
+ * @since 3.0
+ */
+ public final static int DEFAULT_PRIORITY = 10;
+
+ /**
+ * @since 3.0
+ */
+ public enum ColumnSpan {
+ MULTIPLE, SINGLE
+ };
+
+ /**
+ * @since 3.0
+ */
+ public enum RowSpan {
+ MULTIPLE, SINGLE
+ };
+
+ /**
+ * @since 3.0
+ */
+ public RowSpan rowSpan;
+
+ /**
+ * @since 3.0
+ */
+ public ColumnSpan columnSpan;
+
+ /**
+ * @since 3.0
+ */
+ public LayoutHint(RowSpan rowHint, ColumnSpan columnHint) {
+ this.rowSpan = rowHint;
+ this.columnSpan = columnHint;
+ }
+
+ /**
+ * Clones <code>source</code>. Constructs a layout hint with a priority of {@link #DEFAULT_PRIORITY}, if
+ * <code>source</code> is null.
+ *
+ * @param source
+ * the layout hint to clone or <code>null</code>
+ * @since 3.1
+ */
+ public LayoutHint(LayoutHint source) {
+ if (source != null) {
+ this.rowSpan = source.rowSpan;
+ this.columnSpan = source.columnSpan;
+ }
+ }
+
+ /**
+ * Constructs a layout hint with a priority of {@link #DEFAULT_PRIORITY}.
+ *
+ * @since 3.1
+ */
+ public LayoutHint() {
+ }
+
+ /**
+ * Returns a priority based on the size of the layout hint. The bigger the size the bigger the returned priority.
+ * <p>
+ * The priority is used to layout attribute editors.
+ *
+ * @since 3.0
+ */
+ public int getPriority() {
+ if (columnSpan == null || columnSpan == ColumnSpan.SINGLE) {
+ if (rowSpan == null || rowSpan == RowSpan.SINGLE) {
+ return DEFAULT_PRIORITY;
+ } else {
+ return DEFAULT_PRIORITY * 2;
+ }
+ } else {
+ if (rowSpan == null || rowSpan == RowSpan.SINGLE) {
+ return DEFAULT_PRIORITY * 3;
+ } else {
+ return DEFAULT_PRIORITY * 4;
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java
new file mode 100644
index 0000000..e7f21d9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditor.java
@@ -0,0 +1,1175 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eric Booth - initial prototype
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.editors;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ContributionManager;
+import org.eclipse.jface.action.ControlContribution;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.SelectionProviderAdapter;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.editor.EditorBusyIndicator;
+import org.eclipse.mylyn.internal.provisional.commons.ui.editor.IBusyEditor;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.TaskEditorScheduleAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction;
+import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
+import org.eclipse.mylyn.internal.tasks.ui.editors.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor;
+import org.eclipse.mylyn.internal.tasks.ui.util.PlatformUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDragSourceListener;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.IFormPage;
+import org.eclipse.ui.forms.editor.SharedHeaderFormEditor;
+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.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.internal.forms.widgets.BusyIndicator;
+import org.eclipse.ui.internal.forms.widgets.FormHeading;
+import org.eclipse.ui.internal.forms.widgets.TitleRegion;
+import org.eclipse.ui.menus.IMenuService;
+import org.eclipse.ui.part.WorkbenchPart;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @author Thomas Ehrnhoefer
+ * @since 2.0
+ */
+public class TaskEditor extends SharedHeaderFormEditor {
+
+ /**
+ * @since 2.0
+ */
+ public static final String ID_EDITOR = "org.eclipse.mylyn.tasks.ui.editors.task"; //$NON-NLS-1$
+
+ /**
+ * @since 3.2
+ */
+ public static final String ID_TOOLBAR_HEADER = "org.eclipse.mylyn.tasks.ui.editors.task.toolbar.header"; //$NON-NLS-1$
+
+ private static final String ID_LEFT_TOOLBAR_HEADER = "org.eclipse.mylyn.tasks.ui.editors.task.toolbar.header.left"; //$NON-NLS-1$
+
+ private static final int LEFT_TOOLBAR_HEADER_TOOLBAR_PADDING = 3;
+
+ private ToggleTaskActivationAction activateAction;
+
+ @Deprecated
+ private final IEditorPart contentOutlineProvider = null;
+
+ private EditorBusyIndicator editorBusyIndicator;
+
+ private MenuManager menuManager;
+
+ private IHyperlinkListener messageHyperLinkListener;
+
+ private ITask task;
+
+ private TaskEditorInput taskEditorInput;
+
+ private TaskDragSourceListener titleDragSourceListener;
+
+ private Composite editorParent;
+
+ private IMenuService menuService;
+
+ private IToolBarManager toolBarManager;
+
+ private ToolBarManager leftToolBarManager;
+
+ private ToolBar leftToolBar;
+
+ private Image headerImage;
+
+// private int initialLeftToolbarSize;
+
+ private boolean noExtraPadding;
+
+// private boolean headerLabelInitialized;
+
+ private BusyIndicator busyLabel;
+
+ private StyledText titleLabel;
+
+ private CommonTextSupport textSupport;
+
+ private static boolean toolBarFailureLogged;
+
+ public TaskEditor() {
+ }
+
+ @Override
+ protected Composite createPageContainer(Composite parent) {
+ this.editorParent = parent;
+ Composite composite = super.createPageContainer(parent);
+
+ EditorUtil.initializeScrollbars(getHeaderForm().getForm());
+
+ // create left tool bar that replaces form heading label
+ try {
+ FormHeading heading = (FormHeading) getHeaderForm().getForm().getForm().getHead();
+
+ Field field = FormHeading.class.getDeclaredField("titleRegion"); //$NON-NLS-1$
+ field.setAccessible(true);
+
+ TitleRegion titleRegion = (TitleRegion) field.get(heading);
+
+ leftToolBarManager = new ToolBarManager(SWT.FLAT);
+ leftToolBar = leftToolBarManager.createControl(titleRegion);
+ leftToolBar.addControlListener(new ControlAdapter() {
+ private boolean ignoreResizeEvents;
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ if (ignoreResizeEvents) {
+ return;
+ }
+ ignoreResizeEvents = true;
+ try {
+ // the tool bar contents has changed, update state
+ updateHeaderImage();
+ updateHeaderLabel();
+ } finally {
+ ignoreResizeEvents = false;
+ }
+ }
+ });
+
+ //titleLabel = new Label(titleRegion, SWT.NONE);
+ // need a viewer for copy support
+ TextViewer titleViewer = new TextViewer(titleRegion, SWT.READ_ONLY);
+ // Eclipse 3.3 needs a document, otherwise an NPE is thrown
+ titleViewer.setDocument(new Document());
+
+ titleLabel = titleViewer.getTextWidget();
+ titleLabel.setForeground(heading.getForeground());
+ titleLabel.setFont(heading.getFont());
+ // XXX work-around problem that causes field to maintain selection when unfocused
+ titleLabel.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusLost(FocusEvent e) {
+ titleLabel.setSelection(0);
+ }
+ });
+
+ titleRegion.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlResized(ControlEvent e) {
+ // do not create busyLabel to avoid recurssion
+ updateSizeAndLocations();
+ }
+ });
+
+ IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+ if (handlerService != null) {
+ textSupport = new CommonTextSupport(handlerService);
+ textSupport.install(titleViewer, false);
+ }
+ } catch (Exception e) {
+ if (!toolBarFailureLogged) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to obtain busy label toolbar", e)); //$NON-NLS-1$
+ }
+ if (titleLabel != null) {
+ titleLabel.dispose();
+ titleLabel = null;
+ }
+ if (leftToolBar != null) {
+ leftToolBar.dispose();
+ leftToolBar = null;
+ }
+ if (leftToolBarManager != null) {
+ leftToolBarManager.dispose();
+ leftToolBarManager = null;
+ }
+ }
+
+ updateHeader();
+
+ return composite;
+ }
+
+ private BusyIndicator getBusyLabel() {
+ if (busyLabel != null) {
+ return busyLabel;
+ }
+ try {
+ FormHeading heading = (FormHeading) getHeaderForm().getForm().getForm().getHead();
+ // ensure that busy label exists
+ heading.setBusy(true);
+ heading.setBusy(false);
+
+ Field field = FormHeading.class.getDeclaredField("titleRegion"); //$NON-NLS-1$
+ field.setAccessible(true);
+
+ TitleRegion titleRegion = (TitleRegion) field.get(heading);
+
+ for (Control child : titleRegion.getChildren()) {
+ if (child instanceof BusyIndicator) {
+ busyLabel = (BusyIndicator) child;
+ }
+ }
+ if (busyLabel == null) {
+ return null;
+ }
+ busyLabel.addControlListener(new ControlAdapter() {
+ @Override
+ public void controlMoved(ControlEvent e) {
+ updateSizeAndLocations();
+ }
+ });
+ // the busy label may get disposed if it has no image
+ busyLabel.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ busyLabel.setMenu(null);
+ busyLabel = null;
+ }
+ });
+
+ if (leftToolBar != null) {
+ leftToolBar.moveAbove(busyLabel);
+ }
+ if (titleLabel != null) {
+ titleLabel.moveAbove(busyLabel);
+ }
+
+ updateSizeAndLocations();
+
+ return busyLabel;
+ } catch (Exception e) {
+ if (!toolBarFailureLogged) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Failed to obtain busy label toolbar", e)); //$NON-NLS-1$
+ }
+ busyLabel = null;
+ }
+ return busyLabel;
+ }
+
+ private void updateSizeAndLocations() {
+ if (busyLabel == null || busyLabel.isDisposed()) {
+ return;
+ }
+
+ Point leftToolBarSize = new Point(0, 0);
+ if (leftToolBar != null && !leftToolBar.isDisposed()) {
+ // bottom align tool bar in title region
+ leftToolBarSize = leftToolBar.getSize();
+ int y = leftToolBar.getParent().getSize().y - leftToolBarSize.y - 2;
+ if (!hasLeftToolBar()) {
+ // hide tool bar to avoid overlaying busyLabel on windows
+ leftToolBarSize.x = 0;
+ }
+ leftToolBar.setBounds(busyLabel.getLocation().x, y, leftToolBarSize.x, leftToolBarSize.y);
+ }
+ if (titleLabel != null && !titleLabel.isDisposed()) {
+ // center align title text in title region
+ Point size = titleLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ int y = (titleLabel.getParent().getSize().y - size.y) / 2;
+ titleLabel.setBounds(busyLabel.getLocation().x + LEFT_TOOLBAR_HEADER_TOOLBAR_PADDING + leftToolBarSize.x,
+ y, size.x, size.y);
+ }
+ }
+
+ Composite getEditorParent() {
+ return editorParent;
+ }
+
+ @Override
+ protected void addPages() {
+ initialize();
+
+ // determine factories
+ Set<String> conflictingIds = new HashSet<String>();
+ ArrayList<AbstractTaskEditorPageFactory> pageFactories = new ArrayList<AbstractTaskEditorPageFactory>();
+ for (AbstractTaskEditorPageFactory pageFactory : TasksUiPlugin.getDefault().getTaskEditorPageFactories()) {
+ if (pageFactory.canCreatePageFor(getTaskEditorInput()) && WorkbenchUtil.allowUseOf(pageFactory)) {
+ pageFactories.add(pageFactory);
+ String[] ids = pageFactory.getConflictingIds(getTaskEditorInput());
+ if (ids != null) {
+ conflictingIds.addAll(Arrays.asList(ids));
+ }
+ }
+ }
+ for (Iterator<AbstractTaskEditorPageFactory> it = pageFactories.iterator(); it.hasNext();) {
+ if (conflictingIds.contains(it.next().getId())) {
+ it.remove();
+ }
+ }
+
+ // sort by priority
+ Collections.sort(pageFactories, new Comparator<AbstractTaskEditorPageFactory>() {
+ public int compare(AbstractTaskEditorPageFactory o1, AbstractTaskEditorPageFactory o2) {
+ return o1.getPriority() - o2.getPriority();
+ }
+ });
+
+ // create pages
+ for (AbstractTaskEditorPageFactory factory : pageFactories) {
+ try {
+ IFormPage page = factory.createPage(this);
+ int index = addPage(page);
+ setPageImage(index, factory.getPageImage());
+ setPageText(index, factory.getPageText());
+ if (factory.getPriority() == AbstractTaskEditorPageFactory.PRIORITY_TASK) {
+ setActivePage(index);
+ }
+ if (page instanceof ISelectionProvider) {
+ ((ISelectionProvider) page).addSelectionChangedListener(getActionBarContributor());
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Could not create editor via factory: " + factory, e)); //$NON-NLS-1$
+ }
+ }
+
+ updateTitleImage();
+ updateHeaderToolBar();
+ installTitleDrag(getHeaderForm().getForm().getForm());
+
+ // do this late to allow pages to replace the selection provider
+ getEditorSite().registerContextMenu(menuManager, getEditorSite().getSelectionProvider(), true);
+ }
+
+ private void initialize() {
+ editorBusyIndicator = new EditorBusyIndicator(new IBusyEditor() {
+ public Image getTitleImage() {
+ return TaskEditor.this.getTitleImage();
+ }
+
+ public void setTitleImage(Image image) {
+ TaskEditor.this.setTitleImage(image);
+ }
+ });
+
+ menuManager = new MenuManager();
+ configureContextMenuManager(menuManager);
+ Menu menu = menuManager.createContextMenu(getContainer());
+ getContainer().setMenu(menu);
+
+ // install context menu on form heading and title
+ getHeaderForm().getForm().setMenu(menu);
+ Composite head = getHeaderForm().getForm().getForm().getHead();
+ if (head != null) {
+ CommonUiUtil.setMenu(head, menu);
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ @Deprecated
+ public void configureContextMenuManager(MenuManager manager) {
+ if (manager == null) {
+ return;
+ }
+ IMenuListener listener = new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ contextMenuAboutToShow(manager);
+ }
+ };
+ manager.setRemoveAllWhenShown(true);
+ manager.addMenuListener(listener);
+ }
+
+ @Deprecated
+ protected void contextMenuAboutToShow(IMenuManager manager) {
+ TaskEditorActionContributor contributor = getActionBarContributor();
+ if (contributor != null) {
+ contributor.contextMenuAboutToShow(manager);
+ }
+ }
+
+ @Override
+ protected FormToolkit createToolkit(Display display) {
+ // create a toolkit that shares colors between editors.
+ return new FormToolkit(TasksUiPlugin.getDefault().getFormColors(display));
+ }
+
+ @Override
+ protected void createHeaderContents(IManagedForm headerForm) {
+ getToolkit().decorateFormHeading(headerForm.getForm().getForm());
+ }
+
+ @Override
+ public void dispose() {
+ if (headerImage != null) {
+ headerImage.dispose();
+ }
+ if (editorBusyIndicator != null) {
+ editorBusyIndicator.stop();
+ }
+ if (activateAction != null) {
+ activateAction.dispose();
+ }
+ if (menuService != null && toolBarManager instanceof ContributionManager) {
+ menuService.releaseContributions((ContributionManager) toolBarManager);
+ }
+ if (textSupport != null) {
+ textSupport.dispose();
+ }
+ super.dispose();
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ for (IFormPage page : getPages()) {
+ if (page.isDirty()) {
+ page.doSave(monitor);
+ }
+ }
+
+ editorDirtyStateChanged();
+ }
+
+ @Override
+ public void doSaveAs() {
+ throw new UnsupportedOperationException();
+ }
+
+ private TaskEditorActionContributor getActionBarContributor() {
+ return (TaskEditorActionContributor) getEditorSite().getActionBarContributor();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (contentOutlineProvider != null) {
+ return contentOutlineProvider.getAdapter(adapter);
+ } else if (IContentOutlinePage.class.equals(adapter)) {
+ IFormPage[] pages = getPages();
+ for (IFormPage page : pages) {
+ Object outlinePage = page.getAdapter(adapter);
+ if (outlinePage != null) {
+ return outlinePage;
+ }
+ }
+ }
+ return super.getAdapter(adapter);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Menu getMenu() {
+ return getContainer().getMenu();
+ }
+
+ @SuppressWarnings("unchecked")
+ IFormPage[] getPages() {
+ ArrayList formPages = new ArrayList();
+ if (pages != null) {
+ for (int i = 0; i < pages.size(); i++) {
+ Object page = pages.get(i);
+ if (page instanceof IFormPage) {
+ formPages.add(page);
+ }
+ }
+ }
+ return (IFormPage[]) formPages.toArray(new IFormPage[formPages.size()]);
+ }
+
+ @Deprecated
+ protected IWorkbenchSiteProgressService getProgressService() {
+ Object siteService = getEditorSite().getAdapter(IWorkbenchSiteProgressService.class);
+ if (siteService != null) {
+ return (IWorkbenchSiteProgressService) siteService;
+ }
+ return null;
+ }
+
+ @Deprecated
+ public ISelection getSelection() {
+ if (getSite() != null && getSite().getSelectionProvider() != null) {
+ return getSite().getSelectionProvider().getSelection();
+ } else {
+ return StructuredSelection.EMPTY;
+ }
+ }
+
+ public TaskEditorInput getTaskEditorInput() {
+ return taskEditorInput;
+ }
+
+ @Deprecated
+ public Form getTopForm() {
+ return this.getHeaderForm().getForm().getForm();
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ if (!(input instanceof TaskEditorInput)) {
+ throw new PartInitException("Invalid editor input \"" + input.getClass() + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ super.init(site, input);
+
+ this.taskEditorInput = (TaskEditorInput) input;
+ this.task = taskEditorInput.getTask();
+
+ // initialize selection
+ site.getSelectionProvider().setSelection(new StructuredSelection(task));
+
+ setPartName(input.getName());
+
+ // activate context
+ IContextService contextSupport = (IContextService) site.getService(IContextService.class);
+ if (contextSupport != null) {
+ contextSupport.activateContext(ID_EDITOR);
+ }
+ }
+
+ private void installTitleDrag(Form form) {
+ if (titleDragSourceListener == null /*&& !hasLeftToolBar()*/) {
+ Transfer[] transferTypes;
+ if (null == task) {
+ transferTypes = new Transfer[] { TextTransfer.getInstance() };
+ } else {
+ transferTypes = new Transfer[] { LocalSelectionTransfer.getTransfer(), TextTransfer.getInstance(),
+ FileTransfer.getInstance() };
+ }
+ titleDragSourceListener = new TaskDragSourceListener(new SelectionProviderAdapter() {
+ @Override
+ public ISelection getSelection() {
+ return new StructuredSelection(task);
+ }
+ });
+
+ if (titleLabel != null) {
+ DragSource source = new DragSource(titleLabel, DND.DROP_MOVE | DND.DROP_LINK);
+ source.setTransfer(transferTypes);
+ source.addDragListener(titleDragSourceListener);
+ } else {
+ form.addTitleDragSupport(DND.DROP_MOVE | DND.DROP_LINK, transferTypes, titleDragSourceListener);
+ }
+ }
+ }
+
+ @Override
+ public boolean isDirty() {
+ for (IFormPage page : getPages()) {
+ if (page.isDirty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Deprecated
+ public void markDirty() {
+ firePropertyChange(PROP_DIRTY);
+ }
+
+ /**
+ * Refresh editor with new contents (if any)
+ *
+ * @since 3.0
+ */
+ public void refreshPages() {
+ for (IFormPage page : getPages()) {
+ if (page instanceof AbstractTaskEditorPage) {
+ ((AbstractTaskEditorPage) page).refreshFormContent();
+ } else if (page instanceof BrowserFormPage) {
+ // XXX 3.3 replace by invocation of refreshFromContent();
+ ((BrowserFormPage) page).init(getEditorSite(), getEditorInput());
+ }
+ }
+ }
+
+ @Override
+ public void setFocus() {
+ IFormPage page = getActivePageInstance();
+ if (page != null) {
+ page.setFocus();
+ } else {
+ super.setFocus();
+ }
+ }
+
+ @Deprecated
+ public void setFocusOfActivePage() {
+ if (this.getActivePage() > -1) {
+ IFormPage page = this.getPages()[this.getActivePage()];
+ if (page != null) {
+ page.setFocus();
+ }
+ }
+ }
+
+ public void setMessage(String message, int type) {
+ setMessage(message, type, null);
+ }
+
+ private boolean isHeaderFormDisposed() {
+ return getHeaderForm() == null || getHeaderForm().getForm() == null || getHeaderForm().getForm().isDisposed();
+ }
+
+ /**
+ * @since 2.3
+ */
+ public void setMessage(String message, int type, IHyperlinkListener listener) {
+ if (isHeaderFormDisposed()) {
+ return;
+ }
+
+ try {
+ // avoid flicker of the left header toolbar
+ getHeaderForm().getForm().setRedraw(false);
+
+ Form form = getHeaderForm().getForm().getForm();
+ form.setMessage(message, type);
+ if (messageHyperLinkListener != null) {
+ form.removeMessageHyperlinkListener(messageHyperLinkListener);
+ }
+ if (listener != null) {
+ form.addMessageHyperlinkListener(listener);
+ }
+ messageHyperLinkListener = listener;
+
+ // make sure the busyLabel image is large enough to accommodate the tool bar
+ if (hasLeftToolBar()) {
+ BusyIndicator busyLabel = getBusyLabel();
+ if (message != null && busyLabel != null) {
+ setHeaderImage(busyLabel.getImage());
+ } else {
+ setHeaderImage(null);
+ }
+ }
+ } finally {
+ getHeaderForm().getForm().setRedraw(true);
+ }
+ }
+
+ private void setHeaderImage(final Image image) {
+ BusyIndicator busyLabel = getBusyLabel();
+ if (busyLabel == null) {
+ return;
+ }
+
+ final Point size = leftToolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ Point titleSize = titleLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ size.x += titleSize.x + LEFT_TOOLBAR_HEADER_TOOLBAR_PADDING;
+ size.y = Math.max(titleSize.y, size.y);
+
+ // padding between toolbar and image, ensure image is at least one pixel wide to avoid SWT error
+ final int padding = (size.x > 0 && !noExtraPadding) ? 10 : 1;
+ final Rectangle imageBounds = (image != null) ? image.getBounds() : new Rectangle(0, 0, 0, 0);
+ int tempHeight = (image != null) ? Math.max(size.y + 1, imageBounds.height) : size.y + 1;
+ // avoid extra padding due to margin added by TitleRegion.VMARGIN
+ final int height = (tempHeight > imageBounds.height + 5) ? tempHeight - 5 : tempHeight;
+
+ CompositeImageDescriptor descriptor = new CompositeImageDescriptor() {
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ if (image != null) {
+ drawImage(image.getImageData(), size.x + padding, (height - image.getBounds().height) / 2);
+ }
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(size.x + padding + imageBounds.width, height);
+ }
+
+ };
+ Image newHeaderImage = descriptor.createImage();
+
+ // directly set on busyLabel since getHeaderForm().getForm().setImage() does not update
+ // the image if a message is currently displayed
+ busyLabel.setImage(newHeaderImage);
+
+ if (headerImage != null) {
+ headerImage.dispose();
+ }
+ headerImage = newHeaderImage;
+
+ // avoid extra padding due to large title font
+ // TODO reset font in case tool bar is empty
+ //leftToolBar.getParent().setFont(JFaceResources.getDefaultFont());
+ getHeaderForm().getForm().reflow(true);
+ }
+
+ /**
+ * @since 3.1
+ */
+ public String getMessage() {
+ if (getHeaderForm() != null && getHeaderForm().getForm() != null) {
+ if (!getHeaderForm().getForm().isDisposed()) {
+ Form form = getHeaderForm().getForm().getForm();
+ return form.getMessage();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setStatus(String message, final String title, final IStatus status) {
+ setMessage(message, IMessageProvider.ERROR, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent event) {
+ TasksUiInternal.displayStatus(title, status);
+ }
+ });
+ }
+
+ @Override
+ public void showBusy(boolean busy) {
+ if (editorBusyIndicator != null) {
+ if (busy) {
+ if (TasksUiInternal.isAnimationsEnabled()) {
+ editorBusyIndicator.start();
+ }
+ } else {
+ editorBusyIndicator.stop();
+ }
+ }
+
+ if (!isHeaderFormDisposed()) {
+ Form form = getHeaderForm().getForm().getForm();
+ if (form != null && !form.isDisposed()) {
+ // TODO consider only disabling certain actions
+ IToolBarManager toolBarManager = form.getToolBarManager();
+ if (toolBarManager instanceof ToolBarManager) {
+ ToolBar control = ((ToolBarManager) toolBarManager).getControl();
+ if (control != null) {
+ control.setEnabled(!busy);
+ }
+ }
+
+ if (leftToolBar != null) {
+ leftToolBar.setEnabled(!busy);
+ }
+ if (titleLabel != null) {
+ titleLabel.setEnabled(!busy);
+ }
+
+ CommonUiUtil.setEnabled(form.getBody(), !busy);
+ for (IFormPage page : getPages()) {
+ if (page instanceof WorkbenchPart) {
+ WorkbenchPart part = (WorkbenchPart) page;
+ part.showBusy(busy);
+ }
+ }
+ }
+ }
+ }
+
+ private void updateHeader() {
+ IEditorInput input = getEditorInput();
+ updateHeaderImage();
+ updateHeaderLabel();
+ setTitleToolTip(input.getToolTipText());
+ setPartName(input.getName());
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void updateHeaderToolBar() {
+ if (isHeaderFormDisposed()) {
+ return;
+ }
+
+ final Form form = getHeaderForm().getForm().getForm();
+ toolBarManager = form.getToolBarManager();
+
+ toolBarManager.removeAll();
+// toolBarManager.update(true);
+
+ TaskRepository outgoingNewRepository = TasksUiUtil.getOutgoingNewTaskRepository(task);
+ final TaskRepository taskRepository = (outgoingNewRepository != null) ? outgoingNewRepository
+ : taskEditorInput.getTaskRepository();
+ ControlContribution repositoryLabelControl = new ControlContribution(Messages.AbstractTaskEditorPage_Title) {
+ @Override
+ protected Control createControl(Composite parent) {
+ FormToolkit toolkit = getHeaderForm().getToolkit();
+ Composite composite = toolkit.createComposite(parent);
+ RowLayout layout = new RowLayout();
+ if (PlatformUtil.hasNarrowToolBar()) {
+ layout.marginTop = 0;
+ layout.marginBottom = 0;
+ EditorUtil.center(layout);
+ }
+ composite.setLayout(layout);
+ composite.setBackground(null);
+ String label = taskRepository.getRepositoryLabel();
+ if (label.indexOf("//") != -1) { //$NON-NLS-1$
+ label = label.substring((taskRepository.getRepositoryUrl().indexOf("//") + 2)); //$NON-NLS-1$
+ }
+
+ ImageHyperlink link = new ImageHyperlink(composite, SWT.NONE);
+ link.setText(label);
+ link.setFont(JFaceResources.getBannerFont());
+ link.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ link.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TasksUiUtil.openEditRepositoryWizard(taskRepository);
+ }
+ });
+
+ return composite;
+ }
+ };
+ toolBarManager.add(repositoryLabelControl);
+
+ toolBarManager.add(new GroupMarker("repository")); //$NON-NLS-1$
+ toolBarManager.add(new GroupMarker("new")); //$NON-NLS-1$
+ toolBarManager.add(new GroupMarker("open")); //$NON-NLS-1$
+ toolBarManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+
+ final String taskUrl = task.getUrl();
+ if (taskUrl != null && taskUrl.length() > 0) {
+ Action openWithBrowserAction = new Action() {
+ @Override
+ public void run() {
+ TasksUiUtil.openUrl(taskUrl);
+ }
+ };
+// ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(taskRepository.getConnectorKind());
+// ImageDescriptor compositeDescriptor = new TaskListImageDescriptor(TasksUiImages.REPOSITORY_SMALL_TOP,
+// overlay, false, true);
+ openWithBrowserAction.setImageDescriptor(CommonImages.WEB);
+ //openWithBrowserAction.setImageDescriptor(CommonImages.BROWSER_OPEN_TASK);
+ openWithBrowserAction.setToolTipText(Messages.AbstractTaskEditorPage_Open_with_Web_Browser);
+ toolBarManager.appendToGroup("open", openWithBrowserAction); //$NON-NLS-1$
+ }
+
+ if (activateAction == null) {
+ activateAction = new ToggleTaskActivationAction(task) {
+ @Override
+ public void run() {
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ if (taskList.getTask(task.getRepositoryUrl(), task.getTaskId()) == null) {
+ setMessage(Messages.TaskEditor_Task_added_to_the_Uncategorized_container,
+ IMessageProvider.INFORMATION);
+ }
+ super.run();
+ }
+ };
+ }
+
+ toolBarManager.add(new Separator("planning")); //$NON-NLS-1$
+ toolBarManager.add(new TaskEditorScheduleAction(task));
+
+ toolBarManager.add(new GroupMarker("page")); //$NON-NLS-1$
+ for (IFormPage page : getPages()) {
+ if (page instanceof TaskFormPage) {
+ TaskFormPage taskEditorPage = (TaskFormPage) page;
+ taskEditorPage.fillToolBar(toolBarManager);
+ }
+ }
+
+ toolBarManager.add(new Separator("activation")); //$NON-NLS-1$
+
+// ContributionItem spacer = new ContributionItem() {
+// @Override
+// public void fill(ToolBar toolbar, int index) {
+// ToolItem item = new ToolItem(toolbar, SWT.NONE);
+// int scaleHeight = 42;
+// if (PlatformUtil.needsCarbonToolBarFix()) {
+// scaleHeight = 32;
+// }
+// final Image image = new Image(toolbar.getDisplay(), CommonImages.getImage(CommonImages.BLANK)
+// .getImageData()
+// .scaledTo(1, scaleHeight));
+// item.setImage(image);
+// item.addDisposeListener(new DisposeListener() {
+// public void widgetDisposed(DisposeEvent e) {
+// image.dispose();
+// }
+// });
+// item.setWidth(5);
+// item.setEnabled(false);
+// }
+// };
+// toolBarManager.add(spacer);
+
+// for (IFormPage page : getPages()) {
+// if (page instanceof AbstractTaskEditorPage) {
+// AbstractTaskEditorPage taskEditorPage = (AbstractTaskEditorPage) page;
+// taskEditorPage.fillLeftHeaderToolBar(toolBarManager);
+// } else if (page instanceof TaskPlanningEditor) {
+// TaskPlanningEditor taskEditorPage = (TaskPlanningEditor) page;
+// taskEditorPage.fillLeftHeaderToolBar(toolBarManager);
+// }
+// }
+
+ // add external contributions
+ menuService = (IMenuService) getSite().getService(IMenuService.class);
+ if (menuService != null && toolBarManager instanceof ContributionManager) {
+ menuService.populateContributionManager((ContributionManager) toolBarManager, "toolbar:" //$NON-NLS-1$
+ + ID_TOOLBAR_HEADER + "." + taskRepository.getConnectorKind()); //$NON-NLS-1$
+ }
+
+ toolBarManager.update(true);
+
+ // XXX move this call
+ updateLeftHeaderToolBar();
+ updateHeader();
+ }
+
+ private void updateLeftHeaderToolBar() {
+ leftToolBarManager.removeAll();
+
+ leftToolBarManager.add(new Separator("activation")); //$NON-NLS-1$
+ leftToolBarManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+
+// initialLeftToolbarSize = leftToolBarManager.getSize();
+
+ leftToolBarManager.add(activateAction);
+
+// for (IFormPage page : getPages()) {
+// if (page instanceof AbstractTaskEditorPage) {
+// AbstractTaskEditorPage taskEditorPage = (AbstractTaskEditorPage) page;
+// taskEditorPage.fillLeftHeaderToolBar(leftToolBarManager);
+// } else if (page instanceof TaskPlanningEditor) {
+// TaskPlanningEditor taskEditorPage = (TaskPlanningEditor) page;
+// taskEditorPage.fillLeftHeaderToolBar(leftToolBarManager);
+// }
+// }
+
+ // add external contributions
+ menuService = (IMenuService) getSite().getService(IMenuService.class);
+ if (menuService != null && leftToolBarManager instanceof ContributionManager) {
+ TaskRepository outgoingNewRepository = TasksUiUtil.getOutgoingNewTaskRepository(task);
+ TaskRepository taskRepository = (outgoingNewRepository != null) ? outgoingNewRepository
+ : taskEditorInput.getTaskRepository();
+ menuService.populateContributionManager(leftToolBarManager, "toolbar:" + ID_LEFT_TOOLBAR_HEADER + "." //$NON-NLS-1$ //$NON-NLS-2$
+ + taskRepository.getConnectorKind());
+ }
+
+ leftToolBarManager.update(true);
+
+ if (hasLeftToolBar()) {
+ // XXX work around a bug in Gtk that causes the toolbar size to be incorrect if no
+ // tool bar buttons are contributed
+// if (leftToolBar != null) {
+// Point size = leftToolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
+// boolean changed = false;
+// for (Control control : leftToolBar.getChildren()) {
+// final Point childSize = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
+// if (childSize.y > size.y) {
+// size.y = childSize.y;
+// changed = true;
+// }
+// }
+// if (changed) {
+// leftToolBar.setSize(size);
+// }
+// }
+//
+// if (PlatformUtil.isToolBarHeightBroken(leftToolBar)) {
+// ToolItem item = new ToolItem(leftToolBar, SWT.NONE);
+// item.setEnabled(false);
+// item.setImage(CommonImages.getImage(CommonImages.BLANK));
+// item.setWidth(1);
+// noExtraPadding = true;
+// } else if (PlatformUtil.needsToolItemToForceToolBarHeight()) {
+// ToolItem item = new ToolItem(leftToolBar, SWT.NONE);
+// item.setEnabled(false);
+// int scaleHeight = 22;
+// if (PlatformUtil.needsCarbonToolBarFix()) {
+// scaleHeight = 32;
+// }
+// final Image image = new Image(item.getDisplay(), CommonImages.getImage(CommonImages.BLANK)
+// .getImageData()
+// .scaledTo(1, scaleHeight));
+// item.setImage(image);
+// item.addDisposeListener(new DisposeListener() {
+// public void widgetDisposed(DisposeEvent e) {
+// image.dispose();
+// }
+// });
+// item.setWidth(1);
+// noExtraPadding = true;
+// }
+
+ // fix size of toolbar on Gtk with Eclipse 3.3
+ Point size = leftToolBar.getSize();
+ if (size.x == 0 && size.y == 0) {
+ size = leftToolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ leftToolBar.setSize(size);
+ }
+ }
+ }
+
+ private void updateHeaderImage() {
+ if (hasLeftToolBar()) {
+ setHeaderImage(null);
+ } else {
+ getHeaderForm().getForm().setImage(getBrandingImage());
+ }
+ }
+
+ private Image getBrandingImage() {
+ String connectorKind;
+ TaskRepository outgoingNewRepository = TasksUiUtil.getOutgoingNewTaskRepository(task);
+ if (outgoingNewRepository != null) {
+ connectorKind = outgoingNewRepository.getConnectorKind();
+ } else {
+ connectorKind = task.getConnectorKind();
+ }
+
+ if (LocalRepositoryConnector.CONNECTOR_KIND.equals(connectorKind)) {
+ return CommonImages.getImage(TasksUiImages.TASK);
+ } else {
+ ImageDescriptor overlay = TasksUiPlugin.getDefault().getOverlayIcon(connectorKind);
+ Image image = CommonImages.getImageWithOverlay(TasksUiImages.REPOSITORY, overlay, false, false);
+ return image;
+ }
+ }
+
+ private boolean hasLeftToolBar() {
+ return leftToolBar != null && leftToolBarManager != null;
+// && leftToolBarManager.getSize() > initialLeftToolbarSize;
+ }
+
+ private void updateHeaderLabel() {
+ TaskRepository outgoingNewRepository = TasksUiUtil.getOutgoingNewTaskRepository(task);
+ final TaskRepository taskRepository = (outgoingNewRepository != null) ? outgoingNewRepository
+ : taskEditorInput.getTaskRepository();
+
+// if (taskRepository.getConnectorKind().equals(LocalRepositoryConnector.CONNECTOR_KIND)) {
+// getHeaderForm().getForm().setText(Messages.TaskEditor_Task_ + task.getSummary());
+// } else {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(taskRepository.getConnectorKind());
+ String kindLabel = Messages.TaskEditor_Task;
+ if (connectorUi != null) {
+ kindLabel = connectorUi.getTaskKindLabel(task);
+ }
+
+ String idLabel = task.getTaskKey();
+ if (idLabel != null) {
+ kindLabel += " " + idLabel; //$NON-NLS-1$
+ }
+
+ if (hasLeftToolBar() && titleLabel != null) {
+ titleLabel.setText(kindLabel);
+ getHeaderForm().getForm().setText(null);
+ setHeaderImage(null);
+ } else {
+ getHeaderForm().getForm().setText(kindLabel);
+ }
+ }
+
+ /**
+ * Update the title of the editor.
+ *
+ * @deprecated use {@link #updateHeaderToolBar()} instead
+ */
+ @Deprecated
+ public void updateTitle(String name) {
+ updateHeader();
+ }
+
+ private void updateTitleImage() {
+ if (task != null) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(task.getConnectorKind());
+ if (connectorUi != null) {
+ ImageDescriptor overlayDescriptor = connectorUi.getTaskKindOverlay(task);
+ setTitleImage(CommonImages.getCompositeTaskImage(TasksUiImages.TASK, overlayDescriptor, false));
+ } else {
+ setTitleImage(CommonImages.getImage(TasksUiImages.TASK));
+ }
+// } else if (getEditorInput() instanceof AbstractRepositoryTaskEditorInput) {
+// setTitleImage(CommonImages.getImage(TasksUiImages.TASK_REMOTE));
+ } else {
+ setTitleImage(CommonImages.getImage(TasksUiImages.TASK));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorInput.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorInput.java
new file mode 100644
index 0000000..169415f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorInput.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eric Booth - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.editors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorInputFactory;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * Input for task editors.
+ *
+ * @author Eric Booth
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public class TaskEditorInput implements IEditorInput, IPersistableElement {
+
+ private static final int MAX_LABEL_LENGTH = 60;
+
+ private final ITask task;
+
+ private final TaskRepository taskRepository;
+
+ private Object data;
+
+ /**
+ * @since 3.0
+ */
+ @Deprecated
+ public TaskEditorInput(ITask task, boolean newTask) {
+ this(TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(), task.getRepositoryUrl()), task);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskEditorInput(TaskRepository taskRepository, ITask task) {
+ Assert.isNotNull(taskRepository);
+ Assert.isNotNull(task);
+ this.taskRepository = taskRepository;
+ this.task = task;
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ TaskEditorInput other = (TaskEditorInput) obj;
+ return task.equals(other.task);
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean exists() {
+ return task != null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (adapter == IEditorInput.class) {
+ return this;
+ }
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getFactoryId() {
+ return TaskEditorInputFactory.ID_FACTORY;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /**
+ * @deprecated use {@link #getName()}
+ * @since 2.0
+ */
+ @Deprecated
+ public String getLabel() {
+ return getName();
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getName() {
+ String toolTipText = getToolTipText();
+ if (toolTipText == null) {
+ return null;
+ }
+
+ if (task != null) {
+ String taskKey = task.getTaskKey();
+ if (taskKey != null) {
+ return truncate(taskKey + ": " + toolTipText); //$NON-NLS-1$
+ }
+ }
+ return truncate(toolTipText);
+ }
+
+ /**
+ * @since 2.0
+ */
+ public IPersistableElement getPersistable() {
+ if (task != null && TasksUiPlugin.getTaskList().getTask(task.getHandleIdentifier()) != null) {
+ return this;
+ }
+ return null;
+ }
+
+ /**
+ * Returns the task if the task is in the task list; returns <code>null</code> otherwise.
+ *
+ * @since 3.0
+ */
+ public ITask getTask() {
+ return task;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getToolTipText() {
+ return task.getSummary();
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Override
+ public int hashCode() {
+ return task.getTaskId().hashCode();
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Deprecated
+ public boolean isNewTask() {
+ return false;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void saveState(IMemento memento) {
+ TaskEditorInputFactory.saveState(memento, this);
+ }
+
+ private String truncate(String description) {
+ if (description == null || description.length() <= MAX_LABEL_LENGTH) {
+ return description;
+ } else {
+ return description.substring(0, MAX_LABEL_LENGTH) + "..."; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 3.0
+ */
+ public Object getData() {
+ return data;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java
new file mode 100644
index 0000000..3619f84
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskEditorPartDescriptor.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class TaskEditorPartDescriptor {
+
+ private final String id;
+
+ private String path;
+
+// public AbstractTaskEditorPart createPart() {
+// final AbstractTaskEditorPart[] result = new AbstractTaskEditorPart[1];
+// SafeRunnable.run(new ISafeRunnable() {
+//
+// public void handleException(Throwable exception) {
+// StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+// "Unable to create instance of class \"" + getClassName() + "\" for task editor part \""
+// + getId() + "\""));
+// }
+//
+// public void run() throws Exception {
+// Class<?> clazz = Class.forName(getClassName());
+// result[0] = (AbstractTaskEditorPart) clazz.newInstance();
+// }
+//
+// });
+// return result[0];
+// }
+
+ public TaskEditorPartDescriptor(String id) {
+ Assert.isNotNull(id);
+ this.id = id;
+ setPath(AbstractTaskEditorPage.PATH_COMMENTS);
+ }
+
+ public abstract AbstractTaskEditorPart createPart();
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ TaskEditorPartDescriptor other = (TaskEditorPartDescriptor) obj;
+ return id.equals(other.id);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + id.hashCode();
+ return result;
+ }
+
+ public TaskEditorPartDescriptor setPath(String path) {
+ this.path = path;
+ return this;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskFormPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskFormPage.java
new file mode 100644
index 0000000..f9a9f80
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/editors/TaskFormPage.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.editors;
+
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.mylyn.internal.tasks.ui.editors.EditorUtil;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.1
+ */
+public class TaskFormPage extends FormPage {
+
+ public TaskFormPage(String id, String title) {
+ super(id, title);
+ }
+
+ public TaskFormPage(FormEditor editor, String id, String title) {
+ super(editor, id, title);
+ }
+
+ protected void fillToolBar(IToolBarManager toolBarManager) {
+ }
+
+ @Override
+ protected void createFormContent(IManagedForm managedForm) {
+ super.createFormContent(managedForm);
+ EditorUtil.initializeScrollbars(managedForm.getForm());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java
new file mode 100644
index 0000000..c4c041d
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositoryQueryPage.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.wizards;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * Extend to provide repository-specific query page to the Workbench search dialog.
+ *
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public abstract class AbstractRepositoryQueryPage extends WizardPage implements ITaskSearchPage {
+
+ private ITaskSearchPageContainer searchContainer;
+
+ private final TaskRepository taskRepository;
+
+ private final IRepositoryQuery query;
+
+ public AbstractRepositoryQueryPage(String pageName, TaskRepository taskRepository, IRepositoryQuery query) {
+ super(pageName);
+ Assert.isNotNull(taskRepository);
+ this.taskRepository = taskRepository;
+ this.query = query;
+ setTitle(Messages.AbstractRepositoryQueryPage_Enter_query_parameters);
+ setDescription(Messages.AbstractRepositoryQueryPage_If_attributes_are_blank_or_stale_press_the_Update_button);
+ setImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ setPageComplete(false);
+ }
+
+ public AbstractRepositoryQueryPage(String pageName, TaskRepository taskRepository) {
+ this(pageName, taskRepository, null);
+ }
+
+ public IRepositoryQuery getQuery() {
+ return query;
+ }
+
+ public abstract String getQueryTitle();
+
+ @Override
+ public boolean isPageComplete() {
+ String queryTitle = getQueryTitle();
+ if (queryTitle == null || queryTitle.equals("")) { //$NON-NLS-1$
+ setErrorMessage(Messages.AbstractRepositoryQueryPage_Please_specify_a_title_for_the_query);
+ return false;
+ } else {
+ Set<RepositoryQuery> queries = TasksUiInternal.getTaskList().getQueries();
+ Set<AbstractTaskCategory> categories = TasksUiInternal.getTaskList().getCategories();
+ String oldSummary = null;
+ if (query != null) {
+ oldSummary = query.getSummary();
+ }
+ if (oldSummary != null && queryTitle.equals(oldSummary)) {
+ setErrorMessage(null);
+ return true;
+ }
+
+ for (AbstractTaskCategory category : categories) {
+ if (queryTitle.equals(category.getSummary())) {
+ setErrorMessage(Messages.AbstractRepositoryQueryPage_A_category_with_this_name_already_exists);
+ return false;
+ }
+ }
+ for (RepositoryQuery repositoryQuery : queries) {
+ if (query == null || !query.equals(repositoryQuery)) {
+ if (queryTitle.equals(repositoryQuery.getSummary())) {
+ setErrorMessage(Messages.AbstractRepositoryQueryPage_A_query_with_this_name_already_exists);
+ return false;
+ }
+ }
+ }
+ }
+ setErrorMessage(null);
+ return true;
+ }
+
+ public IRepositoryQuery createQuery() {
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(getTaskRepository());
+ applyTo(query);
+ return query;
+ }
+
+ public abstract void applyTo(IRepositoryQuery query);
+
+ public void saveState() {
+ // empty
+ }
+
+ public void setContainer(ITaskSearchPageContainer container) {
+ searchContainer = container;
+ }
+
+ public boolean inSearchContainer() {
+ return searchContainer != null;
+ }
+
+ public boolean performSearch() {
+ NewSearchUI.activateSearchResultView();
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ taskRepository.getConnectorKind());
+ if (connector != null) {
+ try {
+ SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(), taskRepository,
+ createQuery());
+ NewSearchUI.runQueryInBackground(collector);
+ } catch (UnsupportedOperationException e) {
+ SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(), taskRepository,
+ getQuery());
+ NewSearchUI.runQueryInBackground(collector);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @since 2.1
+ */
+ public void setControlsEnabled(boolean enabled) {
+ setControlsEnabled(getControl(), enabled);
+ }
+
+ // TODO: make reusable or find better API, task editor has similar functionality
+ private void setControlsEnabled(Control control, boolean enabled) {
+ if (control instanceof Composite) {
+ for (Control childControl : ((Composite) control).getChildren()) {
+ childControl.setEnabled(enabled);
+ setControlsEnabled(childControl, enabled);
+ }
+ }
+ setPageComplete(isPageComplete());
+ }
+
+ public ITaskSearchPageContainer getSearchContainer() {
+ return searchContainer;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositorySettingsPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositorySettingsPage.java
new file mode 100644
index 0000000..06e525a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractRepositorySettingsPage.java
@@ -0,0 +1,1686 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Frank Becker - improvements
+ * Helen Bershadskaya - improvements for bug 242445
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.nio.charset.Charset;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.tasks.core.IRepositoryConstants;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTemplateManager;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+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.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * Extend to provide custom repository settings. This page is typically invoked by the user requesting properties via
+ * the Task Repositories view.
+ *
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @author Frank Becker
+ * @author David Green
+ * @author Helen Bershadskaya
+ * @since 2.0
+ */
+public abstract class AbstractRepositorySettingsPage extends AbstractTaskRepositoryPage implements ITaskRepositoryPage {
+
+ protected static final String PREFS_PAGE_ID_NET_PROXY = "org.eclipse.ui.net.NetPreferences"; //$NON-NLS-1$
+
+ protected static final String LABEL_REPOSITORY_LABEL = Messages.AbstractRepositorySettingsPage_Label_;
+
+ protected static final String LABEL_SERVER = Messages.AbstractRepositorySettingsPage_Server_;
+
+ protected static final String LABEL_USER = Messages.AbstractRepositorySettingsPage_User_ID_;
+
+ protected static final String LABEL_PASSWORD = Messages.AbstractRepositorySettingsPage_Password_;
+
+ protected static final String URL_PREFIX_HTTPS = "https://"; //$NON-NLS-1$
+
+ protected static final String URL_PREFIX_HTTP = "http://"; //$NON-NLS-1$
+
+ protected static final String INVALID_REPOSITORY_URL = Messages.AbstractRepositorySettingsPage_Repository_url_is_invalid;
+
+ protected static final String INVALID_LOGIN = Messages.AbstractRepositorySettingsPage_Unable_to_authenticate_with_repository;
+
+ protected AbstractRepositoryConnector connector;
+
+ protected StringFieldEditor repositoryLabelEditor;
+
+ protected Combo serverUrlCombo;
+
+ private String serverVersion = TaskRepository.NO_VERSION_SPECIFIED;
+
+ protected StringFieldEditor repositoryUserNameEditor;
+
+ protected StringFieldEditor repositoryPasswordEditor;
+
+ protected StringFieldEditor httpAuthUserNameEditor;
+
+ protected StringFieldEditor httpAuthPasswordEditor;
+
+ protected StringFieldEditor proxyHostnameEditor;
+
+ protected StringFieldEditor proxyPortEditor;
+
+ protected StringFieldEditor proxyUserNameEditor;
+
+ protected StringFieldEditor proxyPasswordEditor;
+
+ // FIXME shadows declaration in super
+ protected TaskRepository repository;
+
+ private Combo otherEncodingCombo;
+
+ private Button defaultEncoding;
+
+ // private Combo timeZonesCombo;
+
+ protected Button anonymousButton;
+
+ private String oldUsername;
+
+ private String oldPassword;
+
+ private String oldHttpAuthUserId;
+
+ private String oldHttpAuthPassword;
+
+ private boolean needsAnonymousLogin;
+
+ private boolean needsTimeZone;
+
+ private boolean needsEncoding;
+
+ private boolean needsHttpAuth;
+
+ private boolean needsValidation;
+
+ private boolean needsAdvanced;
+
+ protected Composite compositeContainer;
+
+ private Composite advancedComp;
+
+ private Composite httpAuthComp;
+
+ private Composite proxyAuthComp;
+
+ private Set<String> repositoryUrls;
+
+ private String originalUrl;
+
+ private Button otherEncoding;
+
+ private Button httpAuthButton;
+
+ private boolean needsProxy;
+
+ private Button systemProxyButton;
+
+ private String oldProxyUsername = ""; //$NON-NLS-1$
+
+ private String oldProxyPassword = ""; //$NON-NLS-1$
+
+ // private Button proxyAuthButton;
+
+ private String oldProxyHostname = ""; //$NON-NLS-1$
+
+ private String oldProxyPort = ""; //$NON-NLS-1$
+
+ private Button proxyAuthButton;
+
+ private Hyperlink createAccountHyperlink;
+
+ private Hyperlink manageAccountHyperlink;
+
+ /**
+ * @since 3.1
+ */
+ protected Button savePasswordButton;
+
+ private Button saveHttpPasswordButton;
+
+ private Button saveProxyPasswordButton;
+
+ private Button disconnectedButton;
+
+ /**
+ * @since 3.0
+ */
+ public AbstractRepositorySettingsPage(String title, String description, TaskRepository taskRepository) {
+ super(title, description, taskRepository);
+ repository = taskRepository;
+ this.connector = TasksUi.getRepositoryManager().getRepositoryConnector(getConnectorKind());
+ setNeedsAnonymousLogin(false);
+ setNeedsEncoding(true);
+ setNeedsTimeZone(true);
+ setNeedsProxy(true);
+ setNeedsValidation(true);
+ setNeedsAdvanced(true);
+ }
+
+ /**
+ * @since 3.0
+ */
+ @Override
+ public abstract String getConnectorKind();
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+// /**
+// * @since 2.0
+// */
+// @Override
+// protected Control createContents(Composite parent) {
+// compositeContainer = new Composite(parent, SWT.NONE);
+// GridLayout layout = new GridLayout(3, false);
+// compositeContainer.setLayout(layout);
+//
+// createSettingControls(parent);
+// }
+
+ @Override
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+ toolkit = new FormToolkit(TasksUiPlugin.getDefault().getFormColors(parent.getDisplay()));
+
+ Composite compositeContainer = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(3, false);
+ compositeContainer.setLayout(layout);
+
+ createSettingControls(compositeContainer);
+
+ setControl(compositeContainer);
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Override
+ protected void createSettingControls(Composite parent) {
+ compositeContainer = parent;
+
+ initializeOldValues();
+
+ Label serverLabel = new Label(compositeContainer, SWT.NONE);
+ serverLabel.setText(LABEL_SERVER);
+ serverUrlCombo = new Combo(compositeContainer, SWT.DROP_DOWN);
+ serverUrlCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+ });
+ serverUrlCombo.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ updateHyperlinks();
+ }
+ });
+ serverUrlCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+ });
+
+ GridDataFactory.fillDefaults().hint(300, SWT.DEFAULT).grab(true, false).span(2, SWT.DEFAULT).applyTo(
+ serverUrlCombo);
+
+ repositoryLabelEditor = new StringFieldEditor("", LABEL_REPOSITORY_LABEL, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ compositeContainer) {
+
+ @Override
+ protected boolean doCheckState() {
+ return true;
+ // return isValidUrl(getStringValue());
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 2;
+ }
+ };
+ disconnectedButton = new Button(compositeContainer, SWT.CHECK);
+ disconnectedButton.setText(Messages.AbstractRepositorySettingsPage_Disconnected);
+ disconnectedButton.setSelection(repository != null ? repository.isOffline() : false);
+
+ repositoryUserNameEditor = new StringFieldEditor("", LABEL_USER, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ compositeContainer) {
+
+ @Override
+ protected boolean doCheckState() {
+ return true;
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ isPageComplete();
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ // always 2 columns -- if no anonymous checkbox, just leave 3rd column empty
+ return 2;
+ }
+ };
+ if (needsAnonymousLogin()) {
+ // need to increase column number here, because above string editor will use them if declared beforehand
+ //((GridLayout) (compositeContainer.getLayout())).numColumns++;
+ anonymousButton = new Button(compositeContainer, SWT.CHECK);
+
+ anonymousButton.setText(Messages.AbstractRepositorySettingsPage_Anonymous_Access);
+ anonymousButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ setAnonymous(anonymousButton.getSelection());
+ isPageComplete();
+ }
+ });
+ } else {
+ Label dummyLabel = new Label(compositeContainer, SWT.NONE); // dummy control to fill 3rd column when no anonymous login
+ GridDataFactory.fillDefaults().applyTo(dummyLabel); // not really necessary, but to be on the safe side
+ }
+
+ repositoryPasswordEditor = new RepositoryStringFieldEditor("", LABEL_PASSWORD, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ compositeContainer) {
+
+ @Override
+ protected boolean doCheckState() {
+ return true;
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ isPageComplete();
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 2;
+ }
+ };
+
+ savePasswordButton = new Button(compositeContainer, SWT.CHECK);
+ savePasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
+
+ if (repository != null) {
+ try {
+ String repositoryLabel = repository.getProperty(IRepositoryConstants.PROPERTY_LABEL);
+ if (repositoryLabel != null && repositoryLabel.length() > 0) {
+ // repositoryLabelCombo.add(repositoryLabel);
+ // repositoryLabelCombo.select(0);
+ repositoryLabelEditor.setStringValue(repositoryLabel);
+ }
+ serverUrlCombo.setText(repository.getRepositoryUrl());
+ AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ if (credentials != null) {
+ repositoryUserNameEditor.setStringValue(credentials.getUserName());
+ repositoryPasswordEditor.setStringValue(credentials.getPassword());
+ } else {
+ repositoryUserNameEditor.setStringValue(""); //$NON-NLS-1$
+ repositoryPasswordEditor.setStringValue(""); //$NON-NLS-1$
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set field value", t)); //$NON-NLS-1$
+ }
+ }
+
+ if (needsAnonymousLogin()) {
+ if (repository != null) {
+ setAnonymous(repository.getCredentials(AuthenticationType.REPOSITORY) == null);
+ } else {
+ setAnonymous(true);
+ }
+ }
+
+ if (repository != null) {
+ savePasswordButton.setSelection(repository.getSavePassword(AuthenticationType.REPOSITORY));
+ } else {
+ savePasswordButton.setSelection(false);
+ }
+
+ // TODO: put this back if we can't get the info from all connectors
+ // if (needsTimeZone()) {
+ // Label timeZoneLabel = new Label(container, SWT.NONE);
+ // timeZoneLabel.setText("Repository time zone: ");
+ // timeZonesCombo = new Combo(container, SWT.READ_ONLY);
+ // String[] timeZoneIds = TimeZone.getAvailableIDs();
+ // Arrays.sort(timeZoneIds);
+ // for (String zone : timeZoneIds) {
+ // timeZonesCombo.add(zone);
+ // }
+ // boolean setZone = false;
+ // if (repository != null) {
+ // if (timeZonesCombo.indexOf(repository.getTimeZoneId()) > -1) {
+ // timeZonesCombo.select(timeZonesCombo.indexOf(repository.getTimeZoneId()));
+ // setZone = true;
+ // }
+ // }
+ // if (!setZone) {
+ // timeZonesCombo.select(timeZonesCombo.indexOf(TimeZone.getDefault().getID()));
+ // }
+ // }
+
+ if (needsAdvanced() || needsEncoding()) {
+ createAdvancedSection();
+ }
+
+ if (needsHttpAuth()) {
+ createHttpAuthSection();
+ }
+
+ if (needsProxy()) {
+ createProxySection();
+ }
+
+ createContributionControls(parent);
+
+ Composite managementComposite = new Composite(compositeContainer, SWT.NULL);
+ GridLayout managementLayout = new GridLayout(4, false);
+ managementLayout.marginHeight = 0;
+ managementLayout.marginWidth = 0;
+ managementLayout.horizontalSpacing = 10;
+ managementComposite.setLayout(managementLayout);
+ managementComposite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 2, 1));
+
+ createAccountHyperlink = toolkit.createHyperlink(managementComposite,
+ Messages.AbstractRepositorySettingsPage_Create_new_account, SWT.NONE);
+ createAccountHyperlink.setBackground(managementComposite.getBackground());
+ createAccountHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+// TaskRepository repository = getRepository();
+ TaskRepository repository = createTaskRepository();
+// if (repository == null && getServerUrl() != null && getServerUrl().length() > 0) {
+// repository = createTaskRepository();
+// }
+ if (repository != null) {
+ String accountCreationUrl = TasksUiPlugin.getConnectorUi(connector.getConnectorKind())
+ .getAccountCreationUrl(repository);
+ if (accountCreationUrl != null) {
+ WorkbenchUtil.openUrl(accountCreationUrl, IWorkbenchBrowserSupport.AS_EXTERNAL);
+ }
+ }
+ }
+ });
+
+ manageAccountHyperlink = toolkit.createHyperlink(managementComposite,
+ Messages.AbstractRepositorySettingsPage_Change_account_settings, SWT.NONE);
+ manageAccountHyperlink.setBackground(managementComposite.getBackground());
+ manageAccountHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TaskRepository repository = getRepository();
+ if (repository == null && getRepositoryUrl() != null && getRepositoryUrl().length() > 0) {
+ repository = createTaskRepository();
+ }
+ if (repository != null) {
+ String accountManagementUrl = TasksUiPlugin.getConnectorUi(connector.getConnectorKind())
+ .getAccountManagementUrl(repository);
+ if (accountManagementUrl != null) {
+ WorkbenchUtil.openUrl(accountManagementUrl, IWorkbenchBrowserSupport.AS_EXTERNAL);
+ }
+ }
+ }
+ });
+
+ // bug 131656: must set echo char after setting value on Mac
+ ((RepositoryStringFieldEditor) repositoryPasswordEditor).getTextControl().setEchoChar('*');
+
+ if (needsAnonymousLogin()) {
+ // do this after username and password widgets have been intialized
+ if (repository != null) {
+ setAnonymous(isAnonymousAccess());
+ }
+ }
+
+ updateHyperlinks();
+
+ GridLayout layout = new GridLayout(3, false);
+ compositeContainer.setLayout(layout);
+
+ Dialog.applyDialogFont(compositeContainer);
+ }
+
+ private void createAdvancedSection() {
+ ExpandableComposite section = createSection(compositeContainer,
+ Messages.AbstractRepositorySettingsPage_Additional_Settings);
+
+ advancedComp = toolkit.createComposite(section, SWT.NONE);
+ GridLayout gridLayout2 = new GridLayout();
+ gridLayout2.numColumns = 2;
+ gridLayout2.verticalSpacing = 5;
+ gridLayout2.marginWidth = 0;
+ advancedComp.setLayout(gridLayout2);
+ advancedComp.setBackground(compositeContainer.getBackground());
+ section.setClient(advancedComp);
+
+ createAdditionalControls(advancedComp);
+
+ if (needsEncoding()) {
+ Label encodingLabel = new Label(advancedComp, SWT.HORIZONTAL);
+ encodingLabel.setText(Messages.AbstractRepositorySettingsPage_Character_encoding);
+ GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).applyTo(encodingLabel);
+
+ Composite encodingContainer = new Composite(advancedComp, SWT.NONE);
+ GridLayout gridLayout = new GridLayout(2, false);
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ encodingContainer.setLayout(gridLayout);
+
+ defaultEncoding = new Button(encodingContainer, SWT.RADIO);
+ defaultEncoding.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+ defaultEncoding.setText(Messages.AbstractRepositorySettingsPage_Default__
+ + TaskRepository.DEFAULT_CHARACTER_ENCODING + ")"); //$NON-NLS-1$
+ defaultEncoding.setSelection(true);
+
+ otherEncoding = new Button(encodingContainer, SWT.RADIO);
+ otherEncoding.setText(Messages.AbstractRepositorySettingsPage_Other);
+ otherEncodingCombo = new Combo(encodingContainer, SWT.READ_ONLY);
+ try {
+ for (String encoding : Charset.availableCharsets().keySet()) {
+ if (!encoding.equals(TaskRepository.DEFAULT_CHARACTER_ENCODING)) {
+ otherEncodingCombo.add(encoding);
+ }
+ }
+ } catch (LinkageError e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.AbstractRepositorySettingsPage_Problems_encountered_determining_available_charsets, e));
+ // bug 237972: 3rd party encodings can cause availableCharsets() to fail
+ otherEncoding.setEnabled(false);
+ otherEncodingCombo.setEnabled(false);
+ }
+
+ setDefaultEncoding();
+
+ otherEncoding.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (otherEncoding.getSelection()) {
+ defaultEncoding.setSelection(false);
+ otherEncodingCombo.setEnabled(true);
+ } else {
+ defaultEncoding.setSelection(true);
+ otherEncodingCombo.setEnabled(false);
+ }
+ }
+ });
+
+ if (repository != null) {
+ try {
+ String repositoryEncoding = repository.getCharacterEncoding();
+ if (repositoryEncoding != null) {// &&
+ // !repositoryEncoding.equals(defaultEncoding))
+ // {
+ if (otherEncodingCombo.getItemCount() > 0
+ && otherEncodingCombo.indexOf(repositoryEncoding) > -1) {
+ otherEncodingCombo.setEnabled(true);
+ otherEncoding.setSelection(true);
+ defaultEncoding.setSelection(false);
+ otherEncodingCombo.select(otherEncodingCombo.indexOf(repositoryEncoding));
+ } else {
+ setDefaultEncoding();
+ }
+ }
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not set field value", t)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ private void createHttpAuthSection() {
+ ExpandableComposite section = createSection(compositeContainer,
+ Messages.AbstractRepositorySettingsPage_Http_Authentication);
+
+ httpAuthComp = toolkit.createComposite(section, SWT.NONE);
+ httpAuthComp.setBackground(compositeContainer.getBackground());
+ section.setClient(httpAuthComp);
+
+ httpAuthButton = new Button(httpAuthComp, SWT.CHECK);
+ GridDataFactory.fillDefaults().indent(0, 5).align(SWT.LEFT, SWT.TOP).span(3, SWT.DEFAULT).applyTo(
+ httpAuthButton);
+
+ httpAuthButton.setText(Messages.AbstractRepositorySettingsPage_Enable_http_authentication);
+
+ httpAuthButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ setHttpAuth(httpAuthButton.getSelection());
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+
+ httpAuthUserNameEditor = new StringFieldEditor(
+ "", Messages.AbstractRepositorySettingsPage_User_ID_, StringFieldEditor.UNLIMITED, httpAuthComp) { //$NON-NLS-1$
+
+ @Override
+ protected boolean doCheckState() {
+ return true;
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 3;
+ }
+ };
+
+ httpAuthPasswordEditor = new RepositoryStringFieldEditor(
+ "", Messages.AbstractRepositorySettingsPage_Password_, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ httpAuthComp) {
+ @Override
+ public int getNumberOfControls() {
+ return 2;
+ }
+ };
+ ((RepositoryStringFieldEditor) httpAuthPasswordEditor).getTextControl().setEchoChar('*');
+
+ saveHttpPasswordButton = new Button(httpAuthComp, SWT.CHECK);
+ saveHttpPasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
+
+ httpAuthUserNameEditor.setEnabled(httpAuthButton.getSelection(), httpAuthComp);
+ httpAuthPasswordEditor.setEnabled(httpAuthButton.getSelection(), httpAuthComp);
+ saveHttpPasswordButton.setEnabled(httpAuthButton.getSelection());
+
+ if (repository != null) {
+ saveHttpPasswordButton.setSelection(repository.getSavePassword(AuthenticationType.HTTP));
+ } else {
+ saveHttpPasswordButton.setSelection(false);
+ }
+ setHttpAuth(oldHttpAuthPassword != null || oldHttpAuthUserId != null);
+ section.setExpanded(httpAuthButton.getSelection());
+
+ GridLayout gridLayout2 = new GridLayout();
+ gridLayout2.numColumns = 3;
+ gridLayout2.marginWidth = 0;
+ httpAuthComp.setLayout(gridLayout2);
+ }
+
+ private void initializeOldValues() {
+ if (repository != null) {
+ originalUrl = repository.getRepositoryUrl();
+ AuthenticationCredentials oldCredentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ if (oldCredentials != null) {
+ oldUsername = oldCredentials.getUserName();
+ oldPassword = oldCredentials.getPassword();
+ } else {
+ oldUsername = ""; //$NON-NLS-1$
+ oldPassword = ""; //$NON-NLS-1$
+ }
+
+ AuthenticationCredentials oldHttpCredentials = repository.getCredentials(AuthenticationType.HTTP);
+ if (oldHttpCredentials != null) {
+ oldHttpAuthUserId = oldHttpCredentials.getUserName();
+ oldHttpAuthPassword = oldHttpCredentials.getPassword();
+ } else {
+ oldHttpAuthPassword = null;
+ oldHttpAuthUserId = null;
+ }
+
+ oldProxyHostname = repository.getProperty(TaskRepository.PROXY_HOSTNAME);
+ oldProxyPort = repository.getProperty(TaskRepository.PROXY_PORT);
+ if (oldProxyHostname == null) {
+ oldProxyHostname = ""; //$NON-NLS-1$
+ }
+ if (oldProxyPort == null) {
+ oldProxyPort = ""; //$NON-NLS-1$
+ }
+
+ AuthenticationCredentials oldProxyCredentials = repository.getCredentials(AuthenticationType.PROXY);
+ if (oldProxyCredentials != null) {
+ oldProxyUsername = oldProxyCredentials.getUserName();
+ oldProxyPassword = oldProxyCredentials.getPassword();
+ } else {
+ oldProxyUsername = null;
+ oldProxyPassword = null;
+ }
+
+ } else {
+ oldUsername = ""; //$NON-NLS-1$
+ oldPassword = ""; //$NON-NLS-1$
+ oldHttpAuthPassword = null;
+ oldHttpAuthUserId = null;
+ }
+ }
+
+ private void createProxySection() {
+ ExpandableComposite section = createSection(compositeContainer,
+ Messages.AbstractRepositorySettingsPage_Proxy_Server_Configuration);
+
+ proxyAuthComp = toolkit.createComposite(section, SWT.NONE);
+ GridLayout gridLayout2 = new GridLayout();
+ gridLayout2.verticalSpacing = 0;
+ gridLayout2.numColumns = 3;
+ proxyAuthComp.setLayout(gridLayout2);
+ proxyAuthComp.setBackground(compositeContainer.getBackground());
+ section.setClient(proxyAuthComp);
+
+ Composite systemSettingsComposite = new Composite(proxyAuthComp, SWT.NULL);
+ GridLayout gridLayout3 = new GridLayout();
+ gridLayout3.verticalSpacing = 0;
+ gridLayout3.numColumns = 2;
+ gridLayout3.marginWidth = 0;
+ systemSettingsComposite.setLayout(gridLayout3);
+
+ systemProxyButton = new Button(systemSettingsComposite, SWT.CHECK);
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).span(3, SWT.DEFAULT).applyTo(systemSettingsComposite);
+
+ systemProxyButton.setText(Messages.AbstractRepositorySettingsPage_Use_global_Network_Connections_preferences);
+
+ systemProxyButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ setUseDefaultProxy(systemProxyButton.getSelection());
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+
+ Hyperlink changeProxySettingsLink = toolkit.createHyperlink(systemSettingsComposite,
+ Messages.AbstractRepositorySettingsPage_Change_Settings, SWT.NULL);
+ changeProxySettingsLink.setBackground(compositeContainer.getBackground());
+ changeProxySettingsLink.addHyperlinkListener(new IHyperlinkListener() {
+
+ public void linkActivated(HyperlinkEvent e) {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(), PREFS_PAGE_ID_NET_PROXY,
+ new String[] { PREFS_PAGE_ID_NET_PROXY }, null);
+ dlg.open();
+ }
+
+ public void linkEntered(HyperlinkEvent e) {
+ // ignore
+ }
+
+ public void linkExited(HyperlinkEvent e) {
+ // ignore
+ }
+ });
+
+ proxyHostnameEditor = new StringFieldEditor(
+ "", Messages.AbstractRepositorySettingsPage_Proxy_host_address_, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ proxyAuthComp) {
+
+ @Override
+ protected boolean doCheckState() {
+ return true;
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 3;
+ }
+ };
+ proxyHostnameEditor.setStringValue(oldProxyHostname);
+
+ proxyPortEditor = new RepositoryStringFieldEditor(
+ "", Messages.AbstractRepositorySettingsPage_Proxy_host_port_, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ proxyAuthComp) {
+
+ @Override
+ public int getNumberOfControls() {
+ return 3;
+ }
+ };
+
+ proxyPortEditor.setStringValue(oldProxyPort);
+
+ proxyHostnameEditor.setEnabled(systemProxyButton.getSelection(), proxyAuthComp);
+ proxyPortEditor.setEnabled(systemProxyButton.getSelection(), proxyAuthComp);
+
+ // ************* PROXY AUTHENTICATION **************
+
+ proxyAuthButton = new Button(proxyAuthComp, SWT.CHECK);
+ GridDataFactory.fillDefaults().span(3, SWT.DEFAULT).applyTo(proxyAuthButton);
+ proxyAuthButton.setText(Messages.AbstractRepositorySettingsPage_Enable_proxy_authentication);
+ proxyAuthButton.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ setProxyAuth(proxyAuthButton.getSelection());
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+
+ proxyUserNameEditor = new StringFieldEditor(
+ "", Messages.AbstractRepositorySettingsPage_User_ID_, StringFieldEditor.UNLIMITED, proxyAuthComp) { //$NON-NLS-1$
+
+ @Override
+ protected boolean doCheckState() {
+ return true;
+ }
+
+ @Override
+ protected void valueChanged() {
+ super.valueChanged();
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public int getNumberOfControls() {
+ return 3;
+ }
+ };
+
+ proxyPasswordEditor = new RepositoryStringFieldEditor(
+ "", Messages.AbstractRepositorySettingsPage_Password_, StringFieldEditor.UNLIMITED, //$NON-NLS-1$
+ proxyAuthComp) {
+ @Override
+ public int getNumberOfControls() {
+ return 2;
+ }
+ };
+ ((RepositoryStringFieldEditor) proxyPasswordEditor).getTextControl().setEchoChar('*');
+
+ // proxyPasswordEditor.setEnabled(httpAuthButton.getSelection(),
+ // advancedComp);
+ // ((StringFieldEditor)
+ // httpAuthPasswordEditor).setEnabled(httpAuthButton.getSelection(),
+ // advancedComp);
+
+ // need to increase column number here, because above string editor will use them if declared beforehand
+ ((GridLayout) (proxyAuthComp.getLayout())).numColumns++;
+ saveProxyPasswordButton = new Button(proxyAuthComp, SWT.CHECK);
+ saveProxyPasswordButton.setText(Messages.AbstractRepositorySettingsPage_Save_Password);
+ saveProxyPasswordButton.setEnabled(proxyAuthButton.getSelection());
+
+ if (repository != null) {
+ saveProxyPasswordButton.setSelection(repository.getSavePassword(AuthenticationType.PROXY));
+ } else {
+ saveProxyPasswordButton.setSelection(false);
+ }
+
+ setProxyAuth(oldProxyUsername != null || oldProxyPassword != null);
+
+ setUseDefaultProxy(repository != null ? repository.isDefaultProxyEnabled() : true);
+ section.setExpanded(!systemProxyButton.getSelection());
+ }
+
+// private void addContributionSection() {
+// Composite composite = toolkit.createComposite(compositeContainer);
+// GridDataFactory.fillDefaults().grab(true, false).span(3, SWT.DEFAULT).applyTo(composite);
+//
+// GridLayout layout = new GridLayout(1, false);
+// layout.marginWidth = 0;
+// layout.marginTop = -5;
+// composite.setLayout(layout);
+//
+// composite.setBackground(compositeContainer.getBackground());
+//
+// createContributionControls(composite);
+// }
+
+ protected void setEncoding(String encoding) {
+ if (encoding.equals(TaskRepository.DEFAULT_CHARACTER_ENCODING)) {
+ setDefaultEncoding();
+ } else {
+ if (otherEncodingCombo.indexOf(encoding) != -1) {
+ defaultEncoding.setSelection(false);
+ otherEncodingCombo.setEnabled(true);
+ otherEncoding.setSelection(true);
+ otherEncodingCombo.select(otherEncodingCombo.indexOf(encoding));
+ } else {
+ setDefaultEncoding();
+ }
+ }
+ }
+
+ private void setDefaultEncoding() {
+ defaultEncoding.setSelection(true);
+ otherEncoding.setSelection(false);
+ otherEncodingCombo.setEnabled(false);
+ if (otherEncodingCombo.getItemCount() > 0) {
+ otherEncodingCombo.select(0);
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setAnonymous(boolean selected) {
+ if (!needsAnonymousLogin) {
+ return;
+ }
+
+ anonymousButton.setSelection(selected);
+
+ if (selected) {
+ oldUsername = repositoryUserNameEditor.getStringValue();
+ oldPassword = (repositoryPasswordEditor).getStringValue();
+ repositoryUserNameEditor.setStringValue(""); //$NON-NLS-1$
+ repositoryPasswordEditor.setStringValue(""); //$NON-NLS-1$
+ } else {
+ repositoryUserNameEditor.setStringValue(oldUsername);
+ repositoryPasswordEditor.setStringValue(oldPassword);
+ }
+
+ repositoryUserNameEditor.setEnabled(!selected, compositeContainer);
+ repositoryPasswordEditor.setEnabled(!selected, compositeContainer);
+ savePasswordButton.setEnabled(!selected);
+ if (getWizard() != null) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setHttpAuth(boolean selected) {
+ if (!needsHttpAuth) {
+ return;
+ }
+ httpAuthButton.setSelection(selected);
+ if (!selected) {
+ oldHttpAuthUserId = httpAuthUserNameEditor.getStringValue();
+ oldHttpAuthPassword = httpAuthPasswordEditor.getStringValue();
+ httpAuthUserNameEditor.setStringValue(null);
+ httpAuthPasswordEditor.setStringValue(null);
+ } else {
+ httpAuthUserNameEditor.setStringValue(oldHttpAuthUserId);
+ httpAuthPasswordEditor.setStringValue(oldHttpAuthPassword);
+ }
+ httpAuthUserNameEditor.setEnabled(selected, httpAuthComp);
+ httpAuthPasswordEditor.setEnabled(selected, httpAuthComp);
+ saveHttpPasswordButton.setEnabled(selected);
+ }
+
+ /**
+ * @since 2.2
+ */
+ public boolean getHttpAuth() {
+ return httpAuthButton.getSelection();
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setUseDefaultProxy(boolean selected) {
+ if (!needsProxy) {
+ return;
+ }
+
+ systemProxyButton.setSelection(selected);
+
+ if (selected) {
+ oldProxyHostname = proxyHostnameEditor.getStringValue();
+ oldProxyPort = proxyPortEditor.getStringValue();
+ // proxyHostnameEditor.setStringValue(null);
+ // proxyPortEditor.setStringValue(null);
+ } else {
+ proxyHostnameEditor.setStringValue(oldProxyHostname);
+ proxyPortEditor.setStringValue(oldProxyPort);
+ }
+ proxyHostnameEditor.setEnabled(!selected, proxyAuthComp);
+ proxyPortEditor.setEnabled(!selected, proxyAuthComp);
+ proxyAuthButton.setEnabled(!selected);
+ setProxyAuth(proxyAuthButton.getSelection());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setProxyAuth(boolean selected) {
+ proxyAuthButton.setSelection(selected);
+ proxyAuthButton.setEnabled(!systemProxyButton.getSelection());
+ if (!selected) {
+ oldProxyUsername = proxyUserNameEditor.getStringValue();
+ oldProxyPassword = proxyPasswordEditor.getStringValue();
+ proxyUserNameEditor.setStringValue(null);
+ proxyPasswordEditor.setStringValue(null);
+ } else {
+ proxyUserNameEditor.setStringValue(oldProxyUsername);
+ proxyPasswordEditor.setStringValue(oldProxyPassword);
+ }
+
+ proxyUserNameEditor.setEnabled(selected && !systemProxyButton.getSelection(), proxyAuthComp);
+ proxyPasswordEditor.setEnabled(selected && !systemProxyButton.getSelection(), proxyAuthComp);
+ saveProxyPasswordButton.setEnabled(selected && !systemProxyButton.getSelection());
+ }
+
+ /**
+ * @since 2.2
+ */
+ public boolean getProxyAuth() {
+ return proxyAuthButton.getSelection();
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void addRepositoryTemplatesToServerUrlCombo() {
+ final RepositoryTemplateManager templateManager = TasksUiPlugin.getRepositoryTemplateManager();
+ for (RepositoryTemplate template : templateManager.getTemplates(connector.getConnectorKind())) {
+ serverUrlCombo.add(template.label);
+ }
+ serverUrlCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String text = serverUrlCombo.getText();
+ RepositoryTemplate template = templateManager.getTemplate(connector.getConnectorKind(), text);
+ if (template != null) {
+ repositoryTemplateSelected(template);
+ return;
+ }
+ }
+
+ });
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected void repositoryTemplateSelected(RepositoryTemplate template) {
+ }
+
+ /**
+ * @since 2.0
+ */
+ protected abstract void createAdditionalControls(Composite parent);
+
+ /**
+ * @since 2.0
+ */
+ protected abstract boolean isValidUrl(String url);
+
+ private void updateHyperlinks() {
+ if (getRepositoryUrl() != null && getRepositoryUrl().length() > 0) {
+ TaskRepository repository = new TaskRepository(connector.getConnectorKind(), getRepositoryUrl());
+
+ String accountCreationUrl = TasksUiPlugin.getConnectorUi(connector.getConnectorKind())
+ .getAccountCreationUrl(repository);
+ createAccountHyperlink.setEnabled(accountCreationUrl != null);
+ createAccountHyperlink.setVisible(accountCreationUrl != null);
+
+ String accountManagementUrl = TasksUiPlugin.getConnectorUi(connector.getConnectorKind())
+ .getAccountManagementUrl(repository);
+ manageAccountHyperlink.setEnabled(accountManagementUrl != null);
+ manageAccountHyperlink.setVisible(accountManagementUrl != null);
+ } else {
+ createAccountHyperlink.setEnabled(false);
+ createAccountHyperlink.setVisible(false);
+ manageAccountHyperlink.setEnabled(false);
+ manageAccountHyperlink.setVisible(false);
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getRepositoryLabel() {
+ return repositoryLabelEditor.getStringValue();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public String getRepositoryUrl() {
+ return TaskRepositoryManager.stripSlashes(serverUrlCombo.getText());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getUserName() {
+ return repositoryUserNameEditor.getStringValue();
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getPassword() {
+ return repositoryPasswordEditor.getStringValue();
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getHttpAuthUserId() {
+ if (needsHttpAuth()) {
+ return httpAuthUserNameEditor.getStringValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getHttpAuthPassword() {
+ if (needsHttpAuth()) {
+ return httpAuthPasswordEditor.getStringValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getProxyHostname() {
+ if (needsProxy()) {
+ return proxyHostnameEditor.getStringValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getProxyPort() {
+ if (needsProxy()) {
+ return proxyPortEditor.getStringValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public Boolean getUseDefaultProxy() {
+ if (needsProxy()) {
+ return systemProxyButton.getSelection();
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getProxyUserName() {
+ if (needsProxy()) {
+ return proxyUserNameEditor.getStringValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getProxyPassword() {
+ if (needsProxy()) {
+ return proxyPasswordEditor.getStringValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void init(IWorkbench workbench) {
+ // ignore
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean isAnonymousAccess() {
+ if (anonymousButton != null) {
+ return anonymousButton.getSelection();
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Exposes StringFieldEditor.refreshValidState() TODO: is there a better way?
+ */
+ private static class RepositoryStringFieldEditor extends StringFieldEditor {
+ public RepositoryStringFieldEditor(String name, String labelText, int style, Composite parent) {
+ super(name, labelText, style, parent);
+ }
+
+ @Override
+ public void refreshValidState() {
+ try {
+ super.refreshValidState();
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Problem refreshing password field", e)); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public Text getTextControl() {
+ return super.getTextControl();
+ }
+
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ String errorMessage = null;
+ String url = getRepositoryUrl();
+ errorMessage = isUniqueUrl(url);
+ if (errorMessage == null && !isValidUrl(url)) {
+ errorMessage = Messages.AbstractRepositorySettingsPage_Enter_a_valid_server_url;
+ }
+ if (errorMessage == null) {
+ errorMessage = credentialsComplete();
+ }
+
+ setErrorMessage(errorMessage);
+ return errorMessage == null && super.isPageComplete();
+ }
+
+ private String credentialsComplete() {
+ if ((!needsAnonymousLogin() || !anonymousButton.getSelection()) && isMissingCredentials()) {
+ return Messages.AbstractRepositorySettingsPage_Repository_user_name_and_password_must_not_be_blank;
+ }
+ return null;
+ }
+
+ private boolean isMissingCredentials() {
+ return repositoryUserNameEditor.getStringValue().trim().equals("") //$NON-NLS-1$
+ || repositoryPasswordEditor.getStringValue().trim().equals(""); //$NON-NLS-1$
+ }
+
+ /**
+ * @since 2.0
+ */
+ protected String isUniqueUrl(String urlString) {
+ if (!urlString.equals(originalUrl)) {
+ if (repositoryUrls == null) {
+ List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
+ repositoryUrls = new HashSet<String>(repositories.size());
+ for (TaskRepository repository : repositories) {
+ repositoryUrls.add(repository.getRepositoryUrl());
+ }
+ }
+
+ if (repositoryUrls.contains(urlString)) {
+ return Messages.AbstractRepositorySettingsPage_Repository_already_exists;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ @Deprecated
+ public void setRepository(TaskRepository repository) {
+ this.repository = repository;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setVersion(String previousVersion) {
+ if (previousVersion == null) {
+ serverVersion = TaskRepository.NO_VERSION_SPECIFIED;
+ } else {
+ serverVersion = previousVersion;
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getVersion() {
+ return serverVersion;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public TaskRepository getRepository() {
+ return repository;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public String getCharacterEncoding() {
+ if (defaultEncoding == null) {
+ return null;
+ }
+
+ if (defaultEncoding.getSelection()) {
+ return TaskRepository.DEFAULT_CHARACTER_ENCODING;
+ } else {
+ if (otherEncodingCombo.getSelectionIndex() > -1) {
+ return otherEncodingCombo.getItem(otherEncodingCombo.getSelectionIndex());
+ } else {
+ return TaskRepository.DEFAULT_CHARACTER_ENCODING;
+ }
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public TaskRepository createTaskRepository() {
+ TaskRepository repository = new TaskRepository(connector.getConnectorKind(), getRepositoryUrl());
+ applyTo(repository);
+ return repository;
+ }
+
+ /**
+ * @since 2.2
+ */
+ @Override
+ public void applyTo(TaskRepository repository) {
+ repository.setVersion(getVersion());
+ if (needsEncoding()) {
+ repository.setCharacterEncoding(getCharacterEncoding());
+ }
+
+ if (isAnonymousAccess()) {
+ repository.setCredentials(AuthenticationType.REPOSITORY, null, getSavePassword());
+ } else {
+ AuthenticationCredentials credentials = new AuthenticationCredentials(getUserName(), getPassword());
+ repository.setCredentials(AuthenticationType.REPOSITORY, credentials, getSavePassword());
+ }
+ repository.setRepositoryLabel(getRepositoryLabel());
+
+ if (needsHttpAuth()) {
+ if (getHttpAuth()) {
+ AuthenticationCredentials webCredentials = new AuthenticationCredentials(getHttpAuthUserId(),
+ getHttpAuthPassword());
+ repository.setCredentials(AuthenticationType.HTTP, webCredentials, getSaveHttpPassword());
+ } else {
+ repository.setCredentials(AuthenticationType.HTTP, null, getSaveHttpPassword());
+ }
+ }
+
+ if (needsProxy()) {
+ repository.setDefaultProxyEnabled(getUseDefaultProxy());
+ repository.setProperty(TaskRepository.PROXY_HOSTNAME, getProxyHostname());
+ repository.setProperty(TaskRepository.PROXY_PORT, getProxyPort());
+ if (getProxyAuth()) {
+ AuthenticationCredentials webCredentials = new AuthenticationCredentials(getProxyUserName(),
+ getProxyPassword());
+ repository.setCredentials(AuthenticationType.PROXY, webCredentials, getSaveProxyPassword());
+ } else {
+ repository.setCredentials(AuthenticationType.PROXY, null, getSaveProxyPassword());
+ }
+ }
+
+ if (disconnectedButton != null) {
+ repository.setOffline(disconnectedButton.getSelection());
+ }
+
+ super.applyTo(repository);
+ }
+
+ /**
+ * @since 2.0
+ */
+ public AbstractRepositoryConnector getConnector() {
+ return connector;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsEncoding() {
+ return needsEncoding;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsTimeZone() {
+ return needsTimeZone;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsAnonymousLogin() {
+ return needsAnonymousLogin;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsAdvanced() {
+ return needsAdvanced;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setNeedsEncoding(boolean needsEncoding) {
+ this.needsEncoding = needsEncoding;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setNeedsTimeZone(boolean needsTimeZone) {
+ this.needsTimeZone = needsTimeZone;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setNeedsAdvanced(boolean needsAdvanced) {
+ this.needsAdvanced = needsAdvanced;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsHttpAuth() {
+ return this.needsHttpAuth;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setNeedsHttpAuth(boolean needsHttpAuth) {
+ this.needsHttpAuth = needsHttpAuth;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setNeedsProxy(boolean needsProxy) {
+ this.needsProxy = needsProxy;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsProxy() {
+ return this.needsProxy;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public void setNeedsAnonymousLogin(boolean needsAnonymousLogin) {
+ this.needsAnonymousLogin = needsAnonymousLogin;
+ }
+
+ public void setNeedsValidation(boolean needsValidation) {
+ this.needsValidation = needsValidation;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public boolean needsValidation() {
+ return needsValidation;
+ }
+
+ /**
+ * Public for testing.
+ *
+ * @since 2.0
+ */
+ public void setUrl(String url) {
+ serverUrlCombo.setText(url);
+ }
+
+ /**
+ * Public for testing.
+ *
+ * @since 2.0
+ */
+ public void setUserId(String id) {
+ repositoryUserNameEditor.setStringValue(id);
+ }
+
+ /**
+ * Public for testing.
+ *
+ * @since 2.0
+ */
+ public void setPassword(String pass) {
+ repositoryPasswordEditor.setStringValue(pass);
+ }
+
+ /**
+ * @since 2.2
+ */
+ public Boolean getSavePassword() {
+ return savePasswordButton.getSelection();
+ }
+
+ /**
+ * @since 2.2
+ */
+ public Boolean getSaveProxyPassword() {
+ if (needsProxy()) {
+ return saveProxyPasswordButton.getSelection();
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @since 2.2
+ */
+ public Boolean getSaveHttpPassword() {
+ if (needsHttpAuth()) {
+ return saveHttpPasswordButton.getSelection();
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Validate settings provided by the {@link #getValidator(TaskRepository) validator}, typically the server settings.
+ *
+ * @since 2.0
+ */
+ protected void validateSettings() {
+ final Validator validator = getValidator(createTaskRepository());
+ if (validator == null) {
+ return;
+ }
+
+ try {
+ getWizard().getContainer().run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ monitor.beginTask(Messages.AbstractRepositorySettingsPage_Validating_server_settings,
+ IProgressMonitor.UNKNOWN);
+ try {
+ validator.run(monitor);
+ if (validator.getStatus() == null) {
+ validator.setStatus(Status.OK_STATUS);
+ }
+ } catch (CoreException e) {
+ validator.setStatus(e.getStatus());
+ } catch (OperationCanceledException e) {
+ validator.setStatus(Status.CANCEL_STATUS);
+ throw new InterruptedException();
+ } catch (Exception e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+ }
+ });
+ } catch (InvocationTargetException e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.AbstractRepositorySettingsPage_Internal_error_validating_repository, e.getCause()));
+ return;
+ } catch (InterruptedException e) {
+ // canceled
+ return;
+ }
+
+ applyValidatorResult(validator);
+ getWizard().getContainer().updateButtons();
+ }
+
+ /**
+ * @since 3.1
+ */
+ @Override
+ protected IStatus validate() {
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ protected void applyValidatorResult(Validator validator) {
+ IStatus status = validator.getStatus();
+ String message = status.getMessage();
+ if (message == null || message.length() == 0) {
+ message = null;
+ }
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ if (status == Status.OK_STATUS) {
+ if (getUserName().length() > 0) {
+ message = Messages.AbstractRepositorySettingsPage_Authentication_credentials_are_valid;
+ } else {
+ message = Messages.AbstractRepositorySettingsPage_Repository_is_valid;
+ }
+ }
+ setMessage(message, IMessageProvider.INFORMATION);
+ break;
+ case IStatus.INFO:
+ setMessage(message, IMessageProvider.INFORMATION);
+ break;
+ case IStatus.WARNING:
+ setMessage(message, IMessageProvider.WARNING);
+ break;
+ default:
+ setMessage(message, IMessageProvider.ERROR);
+ break;
+ }
+ setErrorMessage(null);
+ }
+
+ /**
+ * @since 2.0
+ */
+ protected abstract Validator getValidator(TaskRepository repository);
+
+ /**
+ * Public for testing.
+ *
+ * @since 2.0
+ */
+ public abstract class Validator {
+
+ private IStatus status;
+
+ public abstract void run(IProgressMonitor monitor) throws CoreException;
+
+ public IStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(IStatus status) {
+ this.status = status;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractTaskRepositoryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractTaskRepositoryPage.java
new file mode 100644
index 0000000..8ff085b
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractTaskRepositoryPage.java
@@ -0,0 +1,410 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ * Tasktop Technologies - improvements
+ * Helen Bershadskaya - improvements for bug 242445
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * An abstract base class for repository settings page that supports the <code>taskRepositoryPageContribution</code>
+ * extension point. {@link ITaskRepositoryPage} implementations are encouraged to extend
+ * {@link AbstractRepositorySettingsPage} if possible as it provides a standard UI for managing server settings.
+ *
+ * @see AbstractRepositorySettingsPage
+ * @author David Green
+ * @author Steffen Pingel
+ * @since 3.1
+ */
+public abstract class AbstractTaskRepositoryPage extends WizardPage implements ITaskRepositoryPage {
+
+ private static final String CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ID = "id"; //$NON-NLS-1$
+
+ private static final String KIND = "connectorKind"; //$NON-NLS-1$
+
+ private static final String TASK_REPOSITORY_PAGE_CONTRIBUTION = "taskRepositoryPageContribution"; //$NON-NLS-1$
+
+ private static final String TASK_REPOSITORY_PAGE_CONTRIBUTION_EXTENSION = "org.eclipse.mylyn.tasks.ui.taskRepositoryPageContribution"; //$NON-NLS-1$
+
+ private static final Comparator<AbstractTaskRepositoryPageContribution> CONTRIBUTION_COMPARATOR = new ContributionComparator();
+
+ private final TaskRepository repository;
+
+ private final List<AbstractTaskRepositoryPageContribution> contributions;
+
+ FormToolkit toolkit;
+
+ private final AbstractTaskRepositoryPageContribution.Listener contributionListener = new AbstractTaskRepositoryPageContribution.Listener() {
+ public void validationRequired(AbstractTaskRepositoryPageContribution contribution) {
+ validatePageSettings();
+ }
+ };
+
+ /**
+ * @since 3.1
+ */
+ public AbstractTaskRepositoryPage(String title, String description, TaskRepository repository) {
+ super(title);
+ if (repository != null && !repository.getConnectorKind().equals(getConnectorKind())) {
+ throw new IllegalArgumentException(
+ "connectorKind of repository does not match connectorKind of page, expected '" + getConnectorKind() + "', got '" + repository.getConnectorKind() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ this.repository = repository;
+ this.contributions = new ArrayList<AbstractTaskRepositoryPageContribution>();
+ setTitle(title);
+ setDescription(description);
+ }
+
+ /**
+ * Get the kind of connector supported by this page.
+ *
+ * @return the kind of connector, never null
+ * @since 3.1
+ */
+ public abstract String getConnectorKind();
+
+ @Override
+ public void dispose() {
+ if (toolkit != null) {
+ toolkit.dispose();
+ toolkit = null;
+ }
+ super.dispose();
+ }
+
+ /**
+ * Creates the contents of the page. Subclasses may override this method to change where the contributions are
+ * added.
+ *
+ * @since 2.0
+ */
+ public void createControl(Composite parent) {
+ initializeDialogUnits(parent);
+ toolkit = new FormToolkit(TasksUiPlugin.getDefault().getFormColors(parent.getDisplay()));
+
+ Composite compositeContainer = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(3, false);
+ compositeContainer.setLayout(layout);
+
+// Composite compositeContainer = new Composite(parent, SWT.NULL);
+// Layout layout = new FillLayout();
+// compositeContainer.setLayout(layout);
+
+ createSettingControls(compositeContainer);
+ createContributionControls(compositeContainer);
+
+ setControl(compositeContainer);
+ //getControl().getShell().pack();
+ }
+
+ /**
+ * Creates the controls of this page.
+ *
+ * @since 3.1
+ */
+ protected abstract void createSettingControls(Composite parent);
+
+ @Override
+ public boolean isPageComplete() {
+ return super.isPageComplete() && conributionsIsPageComplete();
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return super.canFlipToNextPage() && contributionsCanFlipToNextPage();
+ }
+
+ private boolean contributionsCanFlipToNextPage() {
+ for (AbstractTaskRepositoryPageContribution contribution : contributions) {
+ if (!contribution.canFlipToNextPage()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean conributionsIsPageComplete() {
+ for (AbstractTaskRepositoryPageContribution contribution : contributions) {
+ if (!contribution.isPageComplete()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Subclasses should only call this method if they override {@link #createContents(Composite)}.
+ *
+ * @param parentControl
+ * the container into which the contributions will create their UI
+ * @since 3.1
+ */
+ protected void createContributionControls(final Composite parentControl) {
+ contributions.clear();
+ contributions.addAll(findApplicableContributors());
+
+ if (!contributions.isEmpty()) {
+ final List<AbstractTaskRepositoryPageContribution> badContributions = new ArrayList<AbstractTaskRepositoryPageContribution>();
+ for (final AbstractTaskRepositoryPageContribution contribution : contributions) {
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() throws Exception {
+ contribution.init(getConnectorKind(), repository);
+ contribution.addListener(contributionListener);
+ }
+
+ @Override
+ public void handleException(Throwable e) {
+ badContributions.add(contribution);
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Problems occured when initializing contribution \"{0}\"", contribution.getId()), e)); //$NON-NLS-1$
+ }
+ });
+ }
+ contributions.removeAll(badContributions);
+
+ Collections.sort(contributions, CONTRIBUTION_COMPARATOR);
+
+ for (final AbstractTaskRepositoryPageContribution contribution : contributions) {
+ final ExpandableComposite section = createSection(parentControl, contribution.getTitle());
+ section.setToolTipText(contribution.getDescription());
+
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() throws Exception {
+ Control control = contribution.createControl(section);
+ section.setClient(control);
+ }
+
+ @Override
+ public void handleException(Throwable e) {
+ section.dispose();
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Problems occured when creating control for contribution \"{0}\"", //$NON-NLS-1$
+ contribution.getId()), e));
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * @since 3.1
+ */
+ protected ExpandableComposite createSection(final Composite parentControl, String title) {
+ final ExpandableComposite section = toolkit.createExpandableComposite(parentControl,
+ ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT | ExpandableComposite.COMPACT);
+ section.clientVerticalSpacing = 0;
+ section.setBackground(parentControl.getBackground());
+ section.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
+ section.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ parentControl.layout(true);
+ getControl().getShell().pack();
+ }
+ });
+ section.setText(title);
+ GridDataFactory.fillDefaults().indent(0, 5).grab(true, false).span(3, SWT.DEFAULT).applyTo(section);
+ return section;
+ }
+
+ /**
+ * Validate the settings of this page, not including contributions. This method should not be called directly by
+ * page implementations. Always run on a UI thread.
+ *
+ * @return the status, or null if there are no messages.
+ * @see #validatePageSettings()
+ * @since 3.1
+ */
+ protected abstract IStatus validate();
+
+ /**
+ * Overriding methods should call <code>super.applyTo(repository)</code>
+ *
+ * @since 3.1
+ */
+ public void applyTo(TaskRepository repository) {
+ applyContributionSettingsTo(repository);
+ }
+
+ private void applyContributionSettingsTo(TaskRepository repository) {
+ for (AbstractTaskRepositoryPageContribution contribution : contributions) {
+ contribution.applyTo(repository);
+ }
+ }
+
+ /**
+ * Returns a status if there is a message to display, otherwise null.
+ */
+ private IStatus computeValidation() {
+ final MultiStatus cumulativeResult = new MultiStatus(TasksUiPlugin.ID_PLUGIN, IStatus.OK,
+ Messages.AbstractTaskRepositoryPage_Validation_failed, null);
+
+ // validate the page
+ IStatus result = validate();
+ if (result != null) {
+ cumulativeResult.add(result);
+ }
+
+ // validate contributions
+ for (final AbstractTaskRepositoryPageContribution contribution : contributions) {
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() throws Exception {
+ IStatus result = contribution.validate();
+ if (result != null) {
+ cumulativeResult.add(result);
+ }
+ }
+
+ @Override
+ public void handleException(Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, NLS.bind(
+ "Problems occured when validating contribution \"{0}\"", contribution.getId()), e)); //$NON-NLS-1$
+ }
+ });
+ }
+
+ return cumulativeResult;
+ }
+
+ /**
+ * Validate all settings in the page including contributions. This method should be called whenever a setting is
+ * changed on the page. The results of validation are applied and the buttons of the page are updated.
+ *
+ * @see #validate(IProgressMonitor)
+ * @see #applyValidationResult(IStatus[])
+ */
+ private void validatePageSettings() {
+ IStatus validationStatus = computeValidation();
+ applyValidationResult(validationStatus);
+ getWizard().getContainer().updateButtons();
+ }
+
+ /**
+ * Apply the results of validation to the page. The implementation finds the most {@link IStatus#getSeverity()
+ * severe} status and {@link #setMessage(String, int) applies the message} to the page.
+ *
+ * @param status
+ * the status of the validation, or null
+ */
+ private void applyValidationResult(IStatus status) {
+ if (status == null || status.isOK()) {
+ setMessage(null, IMessageProvider.INFORMATION);
+ setErrorMessage(null);
+ } else {
+ // find the most severe status
+ int messageType;
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ case IStatus.INFO:
+ messageType = IMessageProvider.INFORMATION;
+ break;
+ case IStatus.WARNING:
+ messageType = IMessageProvider.WARNING;
+ break;
+ case IStatus.ERROR:
+ default:
+ messageType = IMessageProvider.ERROR;
+ break;
+ }
+ setErrorMessage(null);
+ setMessage(status.getMessage(), messageType);
+ }
+ }
+
+ private List<AbstractTaskRepositoryPageContribution> findApplicableContributors() {
+ List<AbstractTaskRepositoryPageContribution> contributors = new ArrayList<AbstractTaskRepositoryPageContribution>();
+
+ IExtensionRegistry registry = Platform.getExtensionRegistry();
+
+ IExtensionPoint editorExtensionPoint = registry.getExtensionPoint(TASK_REPOSITORY_PAGE_CONTRIBUTION_EXTENSION);
+ IExtension[] editorExtensions = editorExtensionPoint.getExtensions();
+ for (IExtension extension : editorExtensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (element.getName().equals(TASK_REPOSITORY_PAGE_CONTRIBUTION)) {
+ String kind = element.getAttribute(KIND);
+ if (kind == null || kind.length() == 0 || kind.equals(getConnectorKind())) {
+ String id = element.getAttribute(ID);
+ try {
+ if (id == null || id.length() == 0) {
+ throw new IllegalStateException(TASK_REPOSITORY_PAGE_CONTRIBUTION + "/@" + ID //$NON-NLS-1$
+ + " is required"); //$NON-NLS-1$
+ }
+ Object contributor = element.createExecutableExtension(CLASS);
+ AbstractTaskRepositoryPageContribution pageContributor = (AbstractTaskRepositoryPageContribution) contributor;
+ pageContributor.setId(id);
+ if (pageContributor.isEnabled()) {
+ contributors.add(pageContributor);
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not load " //$NON-NLS-1$
+ + TASK_REPOSITORY_PAGE_CONTRIBUTION + " '" + id + "' from plug-in " //$NON-NLS-1$//$NON-NLS-2$
+ + element.getContributor().getName(), e));
+ }
+ }
+ }
+ }
+ }
+
+ return contributors;
+ }
+
+ private static class ContributionComparator implements Comparator<AbstractTaskRepositoryPageContribution> {
+
+ public int compare(AbstractTaskRepositoryPageContribution o1, AbstractTaskRepositoryPageContribution o2) {
+ if (o1 == o2) {
+ return 0;
+ }
+ String s1 = o1.getTitle();
+ String s2 = o2.getTitle();
+ int i = s1.compareTo(s2);
+ if (i == 0) {
+ i = o1.getId().compareTo(o2.getId());
+ }
+ return i;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractTaskRepositoryPageContribution.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractTaskRepositoryPageContribution.java
new file mode 100644
index 0000000..a6a7743
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/AbstractTaskRepositoryPageContribution.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.wizards;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.IDialogPage;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * A contribution to a {@link ITaskRepositoryPage}, which enables plug-ins to contribute UI to the task repository
+ * settings.
+ *
+ * subclasses must have a default public constructor.
+ *
+ * @author David Green
+ * @since 3.1
+ */
+public abstract class AbstractTaskRepositoryPageContribution {
+
+ /**
+ * A listener interface that should be implemented by classes wishing to be notified of changes that occur within
+ * the contribution.
+ *
+ * @since 3.1
+ */
+ public interface Listener {
+
+ /**
+ * Called when the state of the contribution changes such that validation should be performed
+ *
+ * @param contribution
+ * the contribution that changed
+ *
+ * @see ITaskRepositoryPageContribution#validate(IProgressMonitor)
+ */
+ public void validationRequired(AbstractTaskRepositoryPageContribution contribution);
+
+ }
+
+ private final List<Listener> listeners = new CopyOnWriteArrayList<Listener>();
+
+ private final String title;
+
+ private final String description;
+
+ private TaskRepository repository;
+
+ private String connectorKind;
+
+ private String id;
+
+ /**
+ *
+ * @param title
+ * the title of the contribution, as displayed to the user, usually used as a section heading
+ * @param description
+ * the description of the contribution, as displayed to the user, typically as a tool-tip
+ * @since 3.1
+ */
+ protected AbstractTaskRepositoryPageContribution(String title, String description) {
+ this.title = title;
+ this.description = description;
+ this.id = ""; //$NON-NLS-1$
+ }
+
+ /**
+ * Initialize the contribution
+ *
+ * @param connectorKind
+ * the kind of connector for which this is a contribution
+ * @param repository
+ * the repository for which this contribution was created, or null if the repository is not yet available
+ * @since 3.1
+ */
+ public void init(String connectorKind, TaskRepository repository) {
+ this.connectorKind = connectorKind;
+ this.repository = repository;
+ }
+
+ /**
+ * Add a listener to this contribution. The contribution must notify the listener at the appropriate times, for
+ * example when a setting has changed in the UI.
+ *
+ * @see #removeListener(Listener)
+ * @since 3.1
+ */
+ public void addListener(Listener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Remove a listener from this contribution.
+ *
+ * @see #addListener(Listener)
+ * @since 3.1
+ */
+ public void removeListener(Listener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * @see IDialogPage#createControl(Composite)
+ * @since 3.1
+ */
+ public abstract Control createControl(Composite parent);
+
+ /**
+ * @see IDialogPage#getTitle()
+ * @since 3.1
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * @see IDialogPage#getDescription()
+ * @since 3.1
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @see IWizardPage#isPageComplete()
+ * @since 3.1
+ */
+ public abstract boolean isPageComplete();
+
+ /**
+ * @see IWizardPage#canFlipToNextPage()
+ * @since 3.1
+ */
+ public abstract boolean canFlipToNextPage();
+
+ /**
+ * Validate the settings of the contribution. Contributions should expect this method to be called often and should
+ * thus return quickly. Always called on the UI thread.
+ *
+ * @return the status (errors) on the contribution, or null if there are none. A MultiStatus should be used to
+ * return multiple error messages or warnings.
+ * @since 3.1
+ */
+ public abstract IStatus validate();
+
+ /**
+ * Apply the settings in the contribution to the given repository.
+ *
+ * @param repository
+ * the repository to which settings should be applied
+ *
+ * @see ITaskRepositoryPage#applyTo(TaskRepository)
+ * @since 3.1
+ */
+ public abstract void applyTo(TaskRepository repository);
+
+ /**
+ * Requests a validation.
+ *
+ * @see #validate()
+ * @since 3.1
+ */
+ protected void fireValidationRequired() {
+ for (Listener l : listeners) {
+ l.validationRequired(this);
+ }
+ }
+
+ /**
+ * Returns the repository for which this contribution was created, or null if it was created for a new repository.
+ *
+ * @since 3.1
+ */
+ protected final TaskRepository getRepository() {
+ return repository;
+ }
+
+ /**
+ * Returns the kind of connector for which this contribution was created.
+ *
+ * @since 3.1
+ */
+ protected final String getConnectorKind() {
+ return connectorKind;
+ }
+
+ void setId(String id) {
+ Assert.isNotNull(id);
+ this.id = id;
+ }
+
+ /**
+ * Returns the id as it is declared in the contribution extension point.
+ */
+ public final String getId() {
+ return id;
+ }
+
+ /**
+ * Indicate if this contribution is enabled. Subclasses may override to programatically disable the contribution
+ * when needed. This method is called early in the contributor's lifecycle, before any controls are created.
+ *
+ * the default implementation returns true.
+ */
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskRepositoryPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskRepositoryPage.java
new file mode 100644
index 0000000..252c47a
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskRepositoryPage.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.wizards;
+
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public interface ITaskRepositoryPage extends IWizardPage {
+
+ public abstract void applyTo(TaskRepository repository);
+
+ public abstract String getRepositoryUrl();
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskSearchPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskSearchPage.java
new file mode 100644
index 0000000..c114f8e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskSearchPage.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.wizards;
+
+import org.eclipse.jface.dialogs.IDialogPage;
+
+/**
+ * @noimplement This interface is not intended to be implemented by clients.
+ * @noextend This interface is not intended to be extended by clients.
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public interface ITaskSearchPage extends IDialogPage {
+
+ public abstract void setContainer(ITaskSearchPageContainer container);
+
+ public abstract boolean performSearch();
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskSearchPageContainer.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskSearchPageContainer.java
new file mode 100644
index 0000000..dd6c4e9
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/ITaskSearchPageContainer.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.wizards;
+
+import org.eclipse.jface.operation.IRunnableContext;
+
+/**
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public interface ITaskSearchPageContainer {
+
+ public abstract IRunnableContext getRunnableContext();
+
+ public abstract void setPerformActionEnabled(boolean enabled);
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java
new file mode 100644
index 0000000..614c7b1
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewTaskWizard.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Extend for customizing how new tasks editors are created.
+ *
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public class NewTaskWizard extends Wizard implements INewWizard {
+
+ private final TaskRepository taskRepository;
+
+ private ITaskMapping taskSelection;
+
+ /**
+ * @since 3.0
+ */
+ public NewTaskWizard(TaskRepository taskRepository, ITaskMapping taskSelection) {
+ Assert.isNotNull(taskRepository);
+ this.taskRepository = taskRepository;
+ this.taskSelection = taskSelection;
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ setNeedsProgressMonitor(true);
+ }
+
+ @Deprecated
+ public NewTaskWizard(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ @Override
+ public void addPages() {
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected ITaskMapping getInitializationData() {
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public TaskRepository getTaskRepository() {
+ return taskRepository;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public ITaskMapping getTaskSelection() {
+ return taskSelection;
+ }
+
+ @Override
+ public boolean performFinish() {
+ final TaskData[] taskData = new TaskData[1];
+ final ITaskMapping initializationData = getInitializationData();
+ final ITaskMapping selectionData = getTaskSelection();
+ try {
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ taskData[0] = TasksUiInternal.createTaskData(taskRepository, initializationData, selectionData,
+ monitor);
+ } catch (OperationCanceledException e) {
+ throw new InterruptedException();
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ };
+ if (getContainer().getShell().isVisible()) {
+ getContainer().run(true, true, runnable);
+ } else {
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
+ }
+ } catch (InvocationTargetException e) {
+ if (e.getCause() instanceof CoreException) {
+ TasksUiInternal.displayStatus(Messages.NewTaskWizard_Error_creating_new_task,
+ ((CoreException) e.getCause()).getStatus());
+ } else {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ Messages.NewTaskWizard_Error_creating_new_task, e.getCause()));
+ }
+ return false;
+ } catch (InterruptedException e) {
+ return false;
+ }
+
+ try {
+ TasksUiInternal.createAndOpenNewTask(taskData[0]);
+ return true;
+ } catch (CoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Failed to open new task", e)); //$NON-NLS-1$
+ TasksUiInternal.displayStatus(Messages.NewTaskWizard_Create_Task, new Status(IStatus.ERROR,
+ TasksUiPlugin.ID_PLUGIN, Messages.NewTaskWizard_Failed_to_create_new_task_ + e.getMessage()));
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewWebTaskWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewWebTaskWizard.java
new file mode 100644
index 0000000..e413e3f
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/NewWebTaskWizard.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.wizards;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewWebTaskPage;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Wizard for creating new tickets through a web browser.
+ *
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public class NewWebTaskWizard extends Wizard implements INewWizard {
+
+ protected TaskRepository taskRepository;
+
+ protected String newTaskUrl;
+
+ private final ITaskMapping taskSelection;
+
+ /**
+ * @since 3.0
+ */
+ public NewWebTaskWizard(TaskRepository taskRepository, String newTaskUrl, ITaskMapping taskSelection) {
+ this.taskRepository = taskRepository;
+ this.newTaskUrl = newTaskUrl;
+ this.taskSelection = taskSelection;
+
+ setWindowTitle(Messages.NewWebTaskWizard_New_Task);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ }
+
+ @Override
+ public void addPages() {
+ addPage(new NewWebTaskPage(taskSelection));
+ }
+
+ @Override
+ public boolean canFinish() {
+ return true;
+ }
+
+ @Override
+ public boolean performFinish() {
+ handleSelection(taskSelection);
+ TasksUiUtil.openUrl(newTaskUrl);
+ return true;
+ }
+
+ private void handleSelection(final ITaskMapping taskSelection) {
+ if (taskSelection == null) {
+ return;
+ }
+
+ String summary = taskSelection.getSummary();
+ String description = taskSelection.getDescription();
+
+ Clipboard clipboard = new Clipboard(getShell().getDisplay());
+ clipboard.setContents(new Object[] { summary + "\n" + description }, //$NON-NLS-1$
+ new Transfer[] { TextTransfer.getInstance() });
+
+ MessageDialog.openInformation(getShell(), Messages.NewWebTaskWizard_New_Task,
+ Messages.NewWebTaskWizard_This_connector_does_not_provide_a_rich_task_editor_for_creating_tasks);
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/RepositoryQueryWizard.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/RepositoryQueryWizard.java
new file mode 100644
index 0000000..a3e08b0
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/RepositoryQueryWizard.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.ui.wizards;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+
+/**
+ * Extend to provide a custom edit query dialog, typically invoked by the user requesting properties on a query node in
+ * the Task List.
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class RepositoryQueryWizard extends Wizard {
+
+ private final TaskRepository repository;
+
+ /**
+ * @since 3.0
+ */
+ public RepositoryQueryWizard(TaskRepository repository) {
+ Assert.isNotNull(repository);
+ this.repository = repository;
+ setNeedsProgressMonitor(true);
+ setWindowTitle(Messages.RepositoryQueryWizard_Edit_Repository_Query);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ }
+
+ @Override
+ public boolean canFinish() {
+ IWizardPage currentPage = getContainer().getCurrentPage();
+ if (currentPage instanceof AbstractRepositoryQueryPage) {
+ return currentPage.isPageComplete();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean performFinish() {
+ IWizardPage currentPage = getContainer().getCurrentPage();
+ if (!(currentPage instanceof AbstractRepositoryQueryPage)) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Current wizard page does not extends AbstractRepositoryQueryPage")); //$NON-NLS-1$
+ return false;
+ }
+
+ AbstractRepositoryQueryPage page = (AbstractRepositoryQueryPage) currentPage;
+ IRepositoryQuery query = page.getQuery();
+ if (query != null) {
+ page.applyTo(query);
+ if (query instanceof RepositoryQuery) {
+ TasksUiPlugin.getTaskList().notifyElementChanged((RepositoryQuery) query);
+ }
+ } else {
+ query = page.createQuery();
+ TasksUiInternal.getTaskList().addQuery((RepositoryQuery) query);
+ }
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ getTaskRepository().getConnectorKind());
+ TasksUiInternal.synchronizeQuery(connector, (RepositoryQuery) query, null, true);
+ return true;
+ }
+
+ public TaskRepository getTaskRepository() {
+ return repository;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java
new file mode 100644
index 0000000..6d75c2e
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskAttachmentPage.java
@@ -0,0 +1,360 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.wizards;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonTextSupport;
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RichTextEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorExtensions;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentModel;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ActiveShellExpression;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextActivation;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.handlers.IHandlerService;
+
+/**
+ * A wizard page to enter details of a new attachment.
+ *
+ * @author Jeff Pound
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ * @since 3.0
+ */
+public class TaskAttachmentPage extends WizardPage {
+
+ private static List<String> contentTypes;
+
+ static {
+ contentTypes = new LinkedList<String>();
+ contentTypes.add("text/plain"); //$NON-NLS-1$
+ contentTypes.add("text/html"); //$NON-NLS-1$
+ contentTypes.add("application/xml"); //$NON-NLS-1$
+ contentTypes.add("image/gif"); //$NON-NLS-1$
+ contentTypes.add("image/jpeg"); //$NON-NLS-1$
+ contentTypes.add("image/png"); //$NON-NLS-1$
+ contentTypes.add(FileTaskAttachmentSource.APPLICATION_OCTET_STREAM);
+ }
+
+ private Button attachContextButton;
+
+ private RichTextEditor commentEditor;
+
+ private Text descriptionText;
+
+ private Combo contentTypeList;
+
+ private Text fileNameText;
+
+ private Button isPatchButton;
+
+ private final TaskAttachmentModel model;
+
+ private boolean needsDescription;
+
+ private final TaskAttachmentMapper taskAttachment;
+
+ private boolean first = true;
+
+ private IContextService contextService;
+
+ private IContextActivation commentContext;
+
+ private CommonTextSupport textSupport;
+
+ public TaskAttachmentPage(TaskAttachmentModel model) {
+ super("AttachmentDetails"); //$NON-NLS-1$
+ this.model = model;
+ this.taskAttachment = TaskAttachmentMapper.createFrom(model.getAttribute());
+ setTitle(Messages.TaskAttachmentPage_Attachment_Details);
+ setNeedsDescription(true);
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 3;
+ composite.setLayout(gridLayout);
+ setControl(composite);
+
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ composite.setLayout(new GridLayout(3, false));
+
+ new Label(composite, SWT.NONE).setText(Messages.TaskAttachmentPage_File);
+ fileNameText = new Text(composite, SWT.BORDER);
+ fileNameText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
+
+ if (needsDescription) {
+ new Label(composite, SWT.NONE).setText(Messages.TaskAttachmentPage_Description);
+ descriptionText = new Text(composite, SWT.BORDER);
+ descriptionText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
+ descriptionText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ taskAttachment.setDescription(descriptionText.getText().trim());
+ validate();
+ }
+
+ });
+ }
+
+ Label label = new Label(composite, SWT.NONE);
+ label.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, false));
+ label.setText(Messages.TaskAttachmentPage_Comment);
+
+ AbstractTaskEditorExtension extension = TaskEditorExtensions.getTaskEditorExtension(model.getTaskRepository());
+ if (extension != null) {
+ String contextId = extension.getEditorContextId();
+ if (contextId != null) {
+ contextService = (IContextService) PlatformUI.getWorkbench().getService(IContextService.class);
+ if (contextService != null) {
+ commentContext = contextService.activateContext(contextId, new ActiveShellExpression(getShell()));
+ }
+ }
+ }
+
+ commentEditor = new RichTextEditor(getModel().getTaskRepository(), SWT.V_SCROLL | SWT.BORDER | SWT.WRAP,
+ contextService, extension) {
+ @Override
+ protected void valueChanged(String value) {
+ apply();
+ };
+ };
+ commentEditor.createControl(composite, null);
+ commentEditor.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+
+ IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
+ if (handlerService != null) {
+ textSupport = new CommonTextSupport(handlerService);
+ textSupport.install(commentEditor.getViewer(), true);
+ }
+
+ new Label(composite, SWT.NONE).setText(Messages.TaskAttachmentPage_Content_Type);// .setBackground(parent.getBackground());
+
+ contentTypeList = new Combo(composite, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
+ contentTypeList.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 2, 1));
+ Iterator<String> iter = contentTypes.iterator();
+ int i = 0;
+ int selection = 0;
+ while (iter.hasNext()) {
+ String next = iter.next();
+ contentTypeList.add(next);
+ if (next.equalsIgnoreCase(model.getContentType())) {
+ selection = i;
+ }
+ i++;
+ }
+
+ /* Update attachment on select content type */
+ contentTypeList.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ taskAttachment.setContentType(contentTypeList.getItem(contentTypeList.getSelectionIndex()));
+ validate();
+ }
+ });
+ contentTypeList.select(selection);
+ taskAttachment.setContentType(contentTypeList.getItem(selection));
+
+ // TODO: is there a better way to pad?
+ new Label(composite, SWT.NONE);
+
+ isPatchButton = new Button(composite, SWT.CHECK);
+ isPatchButton.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 2, 1));
+ isPatchButton.setText(Messages.TaskAttachmentPage_Patch);
+
+ // TODO: is there a better way to pad?
+ new Label(composite, SWT.NONE);
+
+ attachContextButton = new Button(composite, SWT.CHECK);
+ attachContextButton.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 2, 1));
+ attachContextButton.setText(Messages.TaskAttachmentPage_ATTACHE_CONTEXT);
+ attachContextButton.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_ATTACH));
+ attachContextButton.setEnabled(ContextCore.getContextManager()
+ .hasContext(model.getTask().getHandleIdentifier()));
+
+ /*
+ * Attachment file name listener, update the local attachment
+ * accordingly
+ */
+ fileNameText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ // determine type by extension
+ taskAttachment.setFileName(fileNameText.getText());
+ setContentTypeFromFilename(fileNameText.getText());
+ validate();
+ }
+ });
+
+ /* Listener for isPatch */
+ isPatchButton.addSelectionListener(new SelectionAdapter() {
+ private int lastSelected;
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ taskAttachment.setPatch(isPatchButton.getSelection());
+ if (isPatchButton.getSelection()) {
+ lastSelected = contentTypeList.getSelectionIndex();
+ contentTypeList.select(0);
+ contentTypeList.setEnabled(false);
+ if (attachContextButton.isEnabled()) {
+ attachContextButton.setSelection(true);
+ }
+ } else {
+ contentTypeList.setEnabled(true);
+ contentTypeList.select(lastSelected);
+ }
+ validate();
+ }
+ });
+ attachContextButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ validate();
+ }
+ });
+
+ validate();
+ setErrorMessage(null);
+
+ if (descriptionText != null) {
+ descriptionText.setFocus();
+ } else {
+ commentEditor.getControl().setFocus();
+ }
+
+ Dialog.applyDialogFont(composite);
+ }
+
+ private void validate() {
+ apply();
+ if (fileNameText != null && "".equals(fileNameText.getText().trim())) { //$NON-NLS-1$
+ setMessage(Messages.TaskAttachmentPage_Enter_a_file_name);
+ setPageComplete(false);
+ } else if (descriptionText != null && "".equals(descriptionText.getText().trim())) { //$NON-NLS-1$
+ setMessage(Messages.TaskAttachmentPage_Enter_a_description);
+ setPageComplete(false);
+ } else {
+ setMessage(Messages.TaskAttachmentPage_Verify_the_content_type_of_the_attachment);
+ setPageComplete(true);
+ }
+ }
+
+ public TaskAttachmentModel getModel() {
+ return model;
+ }
+
+ private void apply() {
+ taskAttachment.applyTo(model.getAttribute());
+ model.setComment(commentEditor.getText());
+ model.setAttachContext(attachContextButton.getSelection());
+ model.setContentType(taskAttachment.getContentType());
+ }
+
+ private void setContentType(String contentType) {
+ String[] typeList = contentTypeList.getItems();
+ for (int i = 0; i < typeList.length; i++) {
+ if (typeList[i].equals(contentType)) {
+ contentTypeList.select(i);
+ taskAttachment.setContentType(contentType);
+ validate();
+ break;
+ }
+ }
+ }
+
+ private void setContentTypeFromFilename(String fileName) {
+ setContentType(FileTaskAttachmentSource.getContentTypeFromFilename(fileName));
+ }
+
+ private void setFilePath(String path) {
+ fileNameText.setText(path);
+ taskAttachment.setFileName(path);
+ if (path.endsWith(".patch")) { //$NON-NLS-1$
+ isPatchButton.setSelection(true);
+ taskAttachment.setPatch(true);
+ if (attachContextButton.isEnabled()) {
+ attachContextButton.setSelection(true);
+ }
+ }
+ validate();
+ }
+
+ public void setNeedsDescription(boolean supportsDescription) {
+ this.needsDescription = supportsDescription;
+ }
+
+ public boolean supportsDescription() {
+ return needsDescription;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ if (visible) {
+ fileNameText.setText(taskAttachment.getFileName() == null ? "" : taskAttachment.getFileName()); //$NON-NLS-1$
+ if (fileNameText.getText().length() == 0) {
+ setFilePath(getModel().getSource().getName());
+ setContentType(getModel().getSource().getContentType());
+ }
+ }
+ super.setVisible(visible);
+ if (first) {
+ if (descriptionText != null) {
+ descriptionText.setFocus();
+ } else {
+ commentEditor.getControl().setFocus();
+ }
+ first = false;
+ }
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (contextService != null && commentContext != null) {
+ contextService.deactivateContext(commentContext);
+ commentContext = null;
+ }
+ if (textSupport != null) {
+ textSupport.dispose();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskRepositoryWizardDialog.java b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskRepositoryWizardDialog.java
new file mode 100644
index 0000000..41ba0a7
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.ui/src/org/eclipse/mylyn/tasks/ui/wizards/TaskRepositoryWizardDialog.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Helen Bershadskaya 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:
+ * Helen Bershadskaya - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.Messages;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Wizard dialog for displaying repository settings page. Necessary so we can add a validate button in the button bar.
+ *
+ * @author Helen Bershadskaya
+ * @since 3.1
+ */
+public class TaskRepositoryWizardDialog extends WizardDialog {
+
+ private static final String VALIDATE_BUTTON_KEY = "validate"; //$NON-NLS-1$
+
+ private Button validateServerButton;
+
+ private static final int VALIDATE_BUTTON_ID = 2000;
+
+ /**
+ * @see WizardDialog#WizardDialog(Shell, IWizard)
+ * @since 3.1
+ */
+ public TaskRepositoryWizardDialog(Shell parentShell, IWizard newWizard) {
+ super(parentShell, newWizard);
+ }
+
+ /**
+ * Overridden so we can add a validate button to the wizard button bar, if a repository settings page requires it.
+ * Validate button is added left justified at button bar bottom (next to help image).
+ *
+ * @since 3.1
+ */
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 0; // create
+ layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // create help control if needed
+ if (isHelpAvailable()) {
+ createHelpControl(composite);
+ }
+
+ validateServerButton = createButton(composite, VALIDATE_BUTTON_ID,
+ Messages.AbstractRepositorySettingsPage_Validate_Settings, false);
+ validateServerButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_VALIDATE));
+ validateServerButton.setVisible(false);
+ setButtonLayoutData(validateServerButton);
+ Label filler = new Label(composite, SWT.NONE);
+ filler.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+ ((GridLayout) composite.getLayout()).numColumns++;
+
+ super.createButtonsForButtonBar(composite);
+
+ return composite;
+ }
+
+ @Override
+ public void updateButtons() {
+ if (getCurrentPage() instanceof AbstractRepositorySettingsPage
+ && ((AbstractRepositorySettingsPage) getCurrentPage()).needsValidation()) {
+
+ if (!validateServerButton.isVisible()) {
+ validateServerButton.setVisible(true);
+ }
+ } else {
+ if (validateServerButton != null && validateServerButton.isVisible()) {
+ validateServerButton.setVisible(false);
+ }
+ }
+ super.updateButtons();
+ }
+
+ /**
+ * Overridden so we can react to the validate button being pressed. This could have been done with a straight
+ * selection listener in the creation method above, but this is more consistent with how the other buttons work in
+ * the wizard dialog.
+ *
+ * @since 3.1
+ */
+ @Override
+ protected void buttonPressed(int buttonId) {
+ if (buttonId == VALIDATE_BUTTON_ID) {
+ if (getCurrentPage() instanceof AbstractRepositorySettingsPage) {
+ ((AbstractRepositorySettingsPage) getCurrentPage()).validateSettings();
+ }
+ } else {
+ super.buttonPressed(buttonId);
+ }
+ }
+
+ /**
+ * Overridden to be able to set proper state for our validate button
+ */
+ @Override
+ public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException,
+ InterruptedException {
+
+ HashMap<String, Boolean> savedEnabledState = null;
+ try {
+ savedEnabledState = saveAndSetEnabledStateMylyn();
+ super.run(fork, cancelable, runnable);
+ } finally {
+ if (savedEnabledState != null) {
+ restoreEnabledStateMylyn(savedEnabledState);
+ }
+ }
+ }
+
+ /**
+ * Modeled after super.saveAndSetEnabledState(), but that one is private, so create our own
+ */
+ private HashMap<String, Boolean> saveAndSetEnabledStateMylyn() {
+ HashMap<String, Boolean> savedEnabledState = null;
+ if (getShell() != null) {
+ savedEnabledState = new HashMap<String, Boolean>();
+ if (validateServerButton != null && getShell().getDisplay().getFocusControl() == validateServerButton
+ && validateServerButton.getShell() == getShell()) {
+ savedEnabledState.put(VALIDATE_BUTTON_KEY, validateServerButton.getEnabled());
+ validateServerButton.setEnabled(false);
+ }
+ }
+ return savedEnabledState;
+ }
+
+ /**
+ * Modeled after super.restoreEnabledState() and super.restoreUIState() -- couldn't override those since they are
+ * private, so create our own. Currently only single button to work with, so don't create two separate methods
+ */
+ private void restoreEnabledStateMylyn(HashMap<String, Boolean> savedEnabledState) {
+ if (savedEnabledState != null) {
+ Boolean savedValidateEnabledState = savedEnabledState.get(VALIDATE_BUTTON_KEY);
+ if (validateServerButton != null && savedValidateEnabledState != null) {
+ validateServerButton.setEnabled(savedValidateEnabledState);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.team-feature/.project b/org.eclipse.mylyn.team-feature/.project
new file mode 100644
index 0000000..2b3ec91
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.team-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.team-feature/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.team-feature/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..319c205
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team-feature'
- Original project: 'org.eclipse.mylyn.team-feature'
- Original element: 'org.eclipse.mylar.tasklist.prefs'" description="Delete element" element1=".settings/org.eclipse.mylar.tasklist.prefs" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1208494479538" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team-feature/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.team-feature/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..7ae4958
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1 @@
+1208494479538 Delete element
diff --git a/org.eclipse.mylyn.team-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7b6172c
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:47 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.team-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.team-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..4c9ebcf
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:51 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.team-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..992908d
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:12:43 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.team-feature/about.html b/org.eclipse.mylyn.team-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team-feature/build.properties b/org.eclipse.mylyn.team-feature/build.properties
new file mode 100644
index 0000000..dcaa2fa
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.team-feature/epl-v10.html b/org.eclipse.mylyn.team-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team-feature/feature.properties b/org.eclipse.mylyn.team-feature/feature.properties
new file mode 100644
index 0000000..a6ea878
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Bridge: Team Support
+description=Mylyn Task-Focused UI extensions for Team version control.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.team-feature/feature.xml b/org.eclipse.mylyn.team-feature/feature.xml
new file mode 100644
index 0000000..e27bd38
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/feature.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.team_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.compare"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.team.core"/>
+ <import plugin="org.eclipse.team.ui"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.navigator"/>
+ <import plugin="org.eclipse.ui.navigator.resources"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.resources.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.monitor.core" version="3.0.0" match="compatible"/>
+ <import feature="org.eclipse.mylyn.context_feature" version="3.2.1.qualifier" match="perfect"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.team.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.team-feature/license.html b/org.eclipse.mylyn.team-feature/license.html
new file mode 100644
index 0000000..c6af966
--- /dev/null
+++ b/org.eclipse.mylyn.team-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.team.cvs/.classpath b/org.eclipse.mylyn.team.cvs/.classpath
new file mode 100644
index 0000000..8728b53
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/team/internal/ccvs/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/team/internal/core/subscribers/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.team.cvs/.project b/org.eclipse.mylyn.team.cvs/.project
new file mode 100644
index 0000000..bd3d968
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.team.cvs</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.team.cvs/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.team.cvs/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..3420c32
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylyn.team.cvs' to 'org.eclipse.mylyn.team.ccvs' - Original project: 'org.eclipse.mylyn.team.cvs' - Original element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.team.cvs' - Renamed element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.team.ccvs' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.team.cvs'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.team.cvs" name="org.eclipse.mylyn.team.ccvs" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181357388689" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.team.ccvs' to 'org.eclipse.mylyn.internal.team.ccvs' - Original project: 'org.eclipse.mylyn.team.cvs' - Original element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.team.ccvs' - Renamed element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.internal.team.ccvs' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.team.ccvs'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.team.ccvs" name="org.eclipse.mylyn.internal.team.ccvs" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181358103227" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.team.cvs/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.team.cvs/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..f075f3e
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181357388689 Rename package 'org.eclipse.mylyn.team.cvs'
+1181358103227 Rename package 'org.eclipse.mylyn.team.ccvs'
diff --git a/org.eclipse.mylyn.team.cvs/.refactorings/2008/11/45/refactorings.history b/org.eclipse.mylyn.team.cvs/.refactorings/2008/11/45/refactorings.history
new file mode 100644
index 0000000..3256b14
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.refactorings/2008/11/45/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'CvsContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE' in 'org.eclipse.mylyn.internal.team.ccvs.Messages' to 'CvsContextChangeSet_Attempting_to_commit_resource'
- Original project: 'org.eclipse.mylyn.team.cvs'
- Original element: 'org.eclipse.mylyn.internal.team.ccvs.Messages.CvsContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE'
- Renamed element: 'org.eclipse.mylyn.internal.team.ccvs.Messages.CvsContextChangeSet_Attempting_to_commit_resource'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'CvsContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.team.ccvs{Messages.java[Messages^CvsContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE" name="CvsContextChangeSet_Attempting_to_commit_resource" references="true" setter="true" stamp="1225687395952" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.cvs/.refactorings/2008/11/45/refactorings.index b/org.eclipse.mylyn.team.cvs/.refactorings/2008/11/45/refactorings.index
new file mode 100644
index 0000000..fe7cc4f
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.refactorings/2008/11/45/refactorings.index
@@ -0,0 +1 @@
+1225687395952 Rename field 'CvsContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE'
diff --git a/org.eclipse.mylyn.team.cvs/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.team.cvs/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..6c21d0e
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.cvs'
- Original project: 'org.eclipse.mylyn.team.cvs'
- Original element: 'org.eclipse.mylyn.internal.team.ccvs.CvsContextChangeSet.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.team.ccvs{CvsContextChangeSet.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1208568830533" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.cvs/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.team.cvs/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..7eb1497
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1 @@
+1208568830533 Delete element
diff --git a/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7b6172c
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:47 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF b/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1a2bdf3
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.team.cvs;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.team.core,
+ org.eclipse.team.cvs.ui,
+ org.eclipse.team.cvs.core,
+ org.eclipse.jface,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.navigator.resources,
+ org.eclipse.ui.workbench,
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.team.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.resources.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ClassPath: .
+Export-Package: org.eclipse.mylyn.internal.team.ccvs;x-internal:=true
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.team.cvs/about.html b/org.eclipse.mylyn.team.cvs/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.cvs/build.properties b/org.eclipse.mylyn.team.cvs/build.properties
new file mode 100644
index 0000000..7e8cb54
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.team.cvs/plugin.properties b/org.eclipse.mylyn.team.cvs/plugin.properties
new file mode 100644
index 0000000..d801a79
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.team.cvs
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn CVS Extensions
diff --git a/org.eclipse.mylyn.team.cvs/plugin.xml b/org.eclipse.mylyn.team.cvs/plugin.xml
new file mode 100644
index 0000000..b067b42
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/plugin.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ point="org.eclipse.mylyn.team.ui.changeSets">
+ <activeChangeSetProvider
+ class="org.eclipse.mylyn.internal.team.ccvs.CvsActiveChangeSetProvider"/>
+ </extension>
+
+ <extension point="org.eclipse.core.runtime.adapters">
+ <factory adaptableType="org.eclipse.team.internal.ccvs.core.client.listeners.LogEntry"
+ class="org.eclipse.mylyn.internal.team.ccvs.CvsLinkedTaskInfoAdapterFactory">
+ <adapter type="org.eclipse.mylyn.team.ui.AbstractTaskReference"/>
+ </factory>
+
+ <!--
+ <factory adaptableType="org.eclipse.mylyn.internal.team.ui.ContextChangeSet"
+ class="org.eclipse.mylyn.internal.team.ccvs.CvsChangeSetResourceMappingAdapterFactory">
+ <adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/>
+ </factory>
+ -->
+ </extension>
+
+
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="org.eclipse.mylyn.internal.team.ccvs.CvsContextChangeSet"
+ class="org.eclipse.mylyn.internal.team.ccvs.CvsChangeSetAdapterFactory">
+ <adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/>
+ </factory>
+ </extension>
+
+ <extension point="org.eclipse.ui.navigator.viewer">
+ <viewerActionBinding
+ viewerId="org.eclipse.team.cvs.ui.workspaceSynchronization">
+ <includes>
+ <actionExtension
+ pattern="org.eclipse.mylyn.ide.ui.actions.TaskResourceMappingActionProvider"/>
+ </includes>
+ </viewerActionBinding>
+ </extension>
+
+ <!-- ================= NAVIGATOR CONTENT ===================
+
+ NOTE: the approach below could be used if we created our own change set model,
+ but the current implementation below discards the CVS implementaion that we still rely on.
+
+ <extension
+ point="org.eclipse.ui.navigator.navigatorContent">
+ <navigatorContent
+ activeByDefault="true"
+ contentProvider="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetContentProvider"
+ id="org.eclipse.mylyn.team.cvs.changeSetContent"
+ labelProvider="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetLabelProvider"
+ name="Task Context Change Sets"
+ priority="normal">
+ <enablement>
+ <or>
+ <instanceof value="org.eclipse.mylyn.internal.team.ui.ContextChangeSet"/>
+ </or>
+ </enablement>
+ <commonSorter
+ class="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetSorter"
+ id="org.eclipse.team.cvs.ui.changeSetSorter"/>
+ <actionProvider
+ class="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetActionProvider"
+ id="org.eclipse.team.cvs.ui.changeSetActions"/>
+ </navigatorContent>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.ui.teamContentProviders">
+ <teamContentProvider
+ contentExtensionId="org.eclipse.mylyn.team.cvs.changeSetContent"
+ modelProviderId="org.eclipse.team.cvs.core.changeSetModel"/>
+ </extension>
+
+ -->
+
+</plugin>
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CommitContextWizard.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CommitContextWizard.java
new file mode 100644
index 0000000..424b18c
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CommitContextWizard.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.team.internal.ccvs.core.CVSException;
+import org.eclipse.team.internal.ccvs.ui.wizards.CommitWizard;
+
+/**
+ * @author Mik Kersten
+ */
+public class CommitContextWizard extends CommitWizard {
+
+ public CommitContextWizard(IResource[] resources, ITask task) throws CVSException {
+ super(resources);
+ }
+
+ @Override
+ public void dispose() {
+ try {
+ super.dispose();
+ } catch (Exception e) {
+ // ignore, see bug 132888
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsActiveChangeSetProvider.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsActiveChangeSetProvider.java
new file mode 100644
index 0000000..47c4360
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsActiveChangeSetProvider.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.team.ui.AbstractActiveChangeSetProvider;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+
+/**
+ * CVS change set integration for Mylyn.
+ *
+ * @author Mik Kersten
+ */
+public class CvsActiveChangeSetProvider extends AbstractActiveChangeSetProvider {
+
+ @Override
+ public ActiveChangeSetManager getActiveChangeSetManager() {
+ return CVSUIPlugin.getPlugin().getChangeSetManager();
+ }
+
+ @Override
+ public IContextChangeSet createChangeSet(ITask task) {
+ return new CvsContextChangeSet(task, getActiveChangeSetManager());
+ }
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsChangeSetAdapterFactory.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsChangeSetAdapterFactory.java
new file mode 100644
index 0000000..fdf5bbb
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsChangeSetAdapterFactory.java
@@ -0,0 +1,27 @@
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import org.eclipse.core.resources.mapping.ResourceMapping;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetResourceMapping;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
+
+/**
+ * @since 3.0
+ */
+public class CvsChangeSetAdapterFactory implements IAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (adaptableObject instanceof ActiveChangeSet && adapterType == ResourceMapping.class) {
+ ActiveChangeSet cs = (ActiveChangeSet) adaptableObject;
+ return new ChangeSetResourceMapping(cs);
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return new Class[] { ResourceMapping.class };
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsChangeSetResourceMappingAdapterFactory.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsChangeSetResourceMappingAdapterFactory.java
new file mode 100644
index 0000000..a4611f1
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsChangeSetResourceMappingAdapterFactory.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import org.eclipse.core.resources.mapping.ResourceMapping;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetResourceMapping;
+import org.eclipse.team.internal.core.subscribers.DiffChangeSet;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class CvsChangeSetResourceMappingAdapterFactory implements IAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ private static final Class[] ADAPTER_TYPES = new Class[] { ResourceMapping.class };
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return ADAPTER_TYPES;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Object object, Class adapterType) {
+ // used to bind popup menu actions in Synchronize view
+ if (ResourceMapping.class.equals(adapterType) && object instanceof CvsContextChangeSet) {
+ return new ChangeSetResourceMapping((DiffChangeSet) object);
+ }
+
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsCommitWorkflowProvider.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsCommitWorkflowProvider.java
new file mode 100644
index 0000000..ecf27a5
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsCommitWorkflowProvider.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.team.ui.AbstractCommitWorkflowProvider;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.team.internal.ccvs.core.CVSException;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ *
+ * TODO: consider deleting, not used
+ */
+ at SuppressWarnings( { "deprecation", "restriction" })
+public class CvsCommitWorkflowProvider extends AbstractCommitWorkflowProvider {
+
+ private static final String WIZARD_LABEL = Messages.CvsCommitWorkflowProvider_Commit_Resources_in_Task_Context;
+
+ @Override
+ public boolean hasOutgoingChanges(IResource[] resources) {
+ try {
+ CommitContextWizard wizard = new CommitContextWizard(resources, null);
+ return wizard.hasOutgoingChanges();
+ } catch (CVSException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public void commit(IResource[] resources) {
+ try {
+ CommitContextWizard wizard = new CommitContextWizard(resources, null);
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ if (shell != null && !shell.isDisposed() && wizard.hasOutgoingChanges()) {
+ wizard.loadSize();
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ dialog.setMinimumPageSize(wizard.loadSize());
+ dialog.create();
+ dialog.setTitle(WIZARD_LABEL);
+ dialog.setBlockOnOpen(true);
+ if (dialog.open() == Window.CANCEL) {
+ dialog.close();
+ }
+ }
+ } catch (CVSException e) {
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
new file mode 100644
index 0000000..4876a24
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.team.ui.ContextChangeSet;
+import org.eclipse.mylyn.internal.team.ui.LinkedTaskInfo;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.resources.ui.ResourcesUi;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.team.ui.AbstractTaskReference;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.core.diff.IDiff;
+import org.eclipse.team.core.diff.provider.ThreeWayDiff;
+import org.eclipse.team.core.mapping.provider.ResourceDiff;
+import org.eclipse.team.internal.ccvs.core.mapping.CVSActiveChangeSet;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * Copied from {@link ContextChangeSet}
+ *
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class CvsContextChangeSet extends CVSActiveChangeSet implements IAdaptable, IContextChangeSet {
+
+ // HACK: copied from super
+ private static final String CTX_TITLE = "title"; //$NON-NLS-1$
+
+ public static final String SOURCE_ID = "org.eclipse.mylyn.java.context.changeset.add"; //$NON-NLS-1$
+
+ private boolean suppressInterestContribution = false;
+
+ private final ITask task;
+
+ public CvsContextChangeSet(ITask task, ActiveChangeSetManager manager) {
+ super(manager, task.getSummary());
+ this.task = task;
+ updateLabel();
+ }
+
+ @Override
+ public boolean isUserCreated() {
+ return true;
+ }
+
+ public void updateLabel() {
+ super.setName(task.getSummary());
+ super.setTitle(task.getSummary());
+ }
+
+ /**
+ * Encodes the handle in the title, since init won't get called on this class.
+ */
+ @Override
+ public void save(Preferences prefs) {
+ super.save(prefs);
+ prefs.put(CTX_TITLE, getTitleForPersistance());
+ }
+
+ private String getTitleForPersistance() {
+ return getTitle() + " (" + task.getHandleIdentifier() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static String getHandleFromPersistedTitle(String title) {
+ int delimStart = title.lastIndexOf('(');
+ int delimEnd = title.lastIndexOf(')');
+ if (delimStart != -1 && delimEnd != -1) {
+ return title.substring(delimStart + 1, delimEnd);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getComment() {
+ return getComment(true);
+ }
+
+ public String getComment(boolean checkTaskRepository) {
+ return ContextChangeSet.getComment(checkTaskRepository, task, getChangedResources());
+ }
+
+ @Override
+ public void remove(IResource resource) {
+ super.remove(resource);
+ }
+
+ @Override
+ public void remove(IResource[] newResources) {
+ super.remove(newResources);
+ }
+
+ @Override
+ public void add(IDiff diff) {
+ super.add(diff);
+ IResource resource = getResourceFromDiff(diff);
+ if (!suppressInterestContribution && resource != null) {
+ Set<IResource> resources = new HashSet<IResource>();
+ resources.add(resource);
+ if (ResourcesUiBridgePlugin.getDefault() != null) {
+ ResourcesUi.addResourceToContext(resources, InteractionEvent.Kind.SELECTION);
+ }
+ }
+ }
+
+ private IResource getResourceFromDiff(IDiff diff) {
+ if (diff instanceof ResourceDiff) {
+ return ((ResourceDiff) diff).getResource();
+ } else if (diff instanceof ThreeWayDiff) {
+ ThreeWayDiff threeWayDiff = (ThreeWayDiff) diff;
+ return ResourcesPlugin.getWorkspace().getRoot().findMember(threeWayDiff.getPath());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void add(IDiff[] diffs) {
+ super.add(diffs);
+ }
+
+ @Override
+ public void add(IResource[] newResources) throws CoreException {
+ super.add(newResources);
+ }
+
+ public void restoreResources(IResource[] newResources) throws CoreException {
+ suppressInterestContribution = true;
+ try {
+ super.add(newResources);
+ setComment(getComment(false));
+ } catch (TeamException e) {
+ throw e;
+ } finally {
+ suppressInterestContribution = false;
+ }
+ }
+
+ @Override
+ public IResource[] getResources() {
+ return super.getResources();
+// List<IResource> allResources = getAllResourcesInChangeContext();
+// return allResources.toArray(new IResource[allResources.size()]);
+ }
+
+ public IResource[] getChangedResources() {
+ return super.getResources();
+ }
+
+ public List<IResource> getAllResourcesInChangeContext() {
+ Set<IResource> allResources = new HashSet<IResource>();
+ allResources.addAll(Arrays.asList(super.getResources()));
+ if (Platform.isRunning() && ResourcesUiBridgePlugin.getDefault() != null && task.isActive()) {
+ // TODO: if super is always managed correctly should remove
+ // following line
+ allResources.addAll(ResourcesUiBridgePlugin.getDefault().getInterestingResources(
+ ContextCore.getContextManager().getActiveContext()));
+ }
+ return new ArrayList<IResource>(allResources);
+ }
+
+ /**
+ * TODO: unnessary check context?
+ */
+ @Override
+ public boolean contains(IResource local) {
+ return super.contains(local); //getAllResourcesInChangeContext().contains(local);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof CvsContextChangeSet && task != null) {
+ CvsContextChangeSet changeSet = (CvsContextChangeSet) object;
+ return task.equals(changeSet.getTask());
+ } else {
+ return super.equals(object);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ if (task != null) {
+ return task.hashCode();
+ } else {
+ return super.hashCode();
+ }
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+// if (adapter == ResourceMapping.class) {
+// return null;
+// return new ChangeSetResourceMapping(this);
+// }
+ if (adapter == AbstractTask.class) {
+ return task;
+ } else if (adapter == AbstractTaskReference.class) {
+ return new LinkedTaskInfo(getTask(), this);
+ }
+ return Platform.getAdapterManager().getAdapter(this, adapter);
+ }
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsLinkedTaskInfoAdapterFactory.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsLinkedTaskInfoAdapterFactory.java
new file mode 100644
index 0000000..169e7e7
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsLinkedTaskInfoAdapterFactory.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ccvs;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.LinkedTaskInfo;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.team.ui.AbstractTaskReference;
+import org.eclipse.team.core.variants.IResourceVariant;
+import org.eclipse.team.internal.ccvs.core.CVSException;
+import org.eclipse.team.internal.ccvs.core.ICVSResource;
+import org.eclipse.team.internal.ccvs.core.client.listeners.LogEntry;
+import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
+import org.eclipse.team.internal.ccvs.core.resources.RemoteResource;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class CvsLinkedTaskInfoAdapterFactory implements IAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ private static final Class[] ADAPTER_TYPES = new Class[] { AbstractTaskReference.class };
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return ADAPTER_TYPES;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Object object, Class adapterType) {
+ if (!AbstractTaskReference.class.equals(adapterType)) {
+ return null;
+ }
+
+ return adaptFromComment(object);
+ }
+
+ private AbstractTaskReference adaptFromComment(Object object) {
+ String comment = getCommentForElement(object);
+ if (comment == null) {
+ return null;
+ }
+
+ IResource resource = getResourceForElement(object);
+ if (resource != null) {
+ TaskRepository repository = TasksUiPlugin.getDefault().getRepositoryForResource(resource);
+ if (repository != null) {
+ return new LinkedTaskInfo(repository.getRepositoryUrl(), null, null, comment);
+ }
+ }
+
+ return new LinkedTaskInfo(null, null, null, comment);
+ }
+
+ private static String getCommentForElement(Object element) {
+ if (element instanceof LogEntry) {
+ return ((LogEntry) element).getComment();
+ }
+ return null;
+ }
+
+ private static IResource getResourceForElement(Object element) {
+ if (element instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) element;
+ IResourceVariant resourceVariant = (IResourceVariant) adaptable.getAdapter(IResourceVariant.class);
+ if (resourceVariant != null && resourceVariant instanceof RemoteResource) {
+ RemoteResource remoteResource = (RemoteResource) resourceVariant;
+ // TODO is there a better way then iterating trough all projects?
+ String path = remoteResource.getRepositoryRelativePath();
+ if (path != null) {
+ for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
+ if (project.isAccessible()) {
+ ICVSResource cvsResource = CVSWorkspaceRoot.getCVSFolderFor(project);
+ try {
+ String repositoryRelativePath = cvsResource.getRepositoryRelativePath();
+ if (repositoryRelativePath != null && path.startsWith(repositoryRelativePath)) {
+ return project;
+ }
+ } catch (CVSException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // TODO any other resource types?
+
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/Messages.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/Messages.java
new file mode 100644
index 0000000..309de7d
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ccvs;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.team.ccvs.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String CvsCommitWorkflowProvider_Commit_Resources_in_Task_Context;
+
+}
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/messages.properties b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/messages.properties
new file mode 100644
index 0000000..5c4994c
--- /dev/null
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/messages.properties
@@ -0,0 +1 @@
+CvsCommitWorkflowProvider_Commit_Resources_in_Task_Context=Commit Resources in Task Context
diff --git a/org.eclipse.mylyn.team.tests/.classpath b/org.eclipse.mylyn.team.tests/.classpath
new file mode 100644
index 0000000..1c9d79f
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.team.tests/.project b/org.eclipse.mylyn.team.tests/.project
new file mode 100644
index 0000000..08e2a2d
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.team.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.team.tests/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.team.tests/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..496f54c
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.tests' - Original project: 'org.eclipse.mylyn.team.tests' - Original element: 'org.eclipse.mylyn.team.tests.asdf.java'" description="Delete element" element1="/src<org.eclipse.mylyn.team.tests{asdf.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181356817569" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.team.tests/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.team.tests/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..d970b46
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1 @@
+1181356817569 Delete element
diff --git a/org.eclipse.mylyn.team.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..24505ee
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:47 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.team.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.team.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.team.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.team.tests/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..114cebf
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,145 @@
+#Tue Apr 08 17:51:02 PDT 2008
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_LEAK=Ignore
+API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
+ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Ignore
+ILLEGAL_IMPLEMENT=Ignore
+ILLEGAL_INSTANTIATE=Ignore
+ILLEGAL_OVERRIDE=Ignore
+ILLEGAL_REFERENCE=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
diff --git a/org.eclipse.mylyn.team.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.team.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.team.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1ef7033
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests Plug-in
+Bundle-SymbolicName: org.eclipse.mylyn.team.tests
+Bundle-Version: 0.0.0
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: org.junit,
+ org.eclipse.mylyn.team.ui,
+ org.eclipse.mylyn.team.cvs,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.team.core,
+ org.eclipse.core.resources,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.team.cvs.ui,
+ org.eclipse.mylyn.monitor.core,
+ org.eclipse.mylyn.resources.tests,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.ide.ui,
+ org.eclipse.mylyn.resources.ui,
+ org.eclipse.mylyn.monitor.ui,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.tasks.tests,
+ org.eclipse.mylyn.context.ui,
+ org.eclipse.team.cvs.core,
+ org.eclipse.mylyn.commons.ui,
+ org.eclipse.team.ui
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.team.tests;x-internal:=true
diff --git a/org.eclipse.mylyn.team.tests/about.html b/org.eclipse.mylyn.team.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.tests/build.properties b/org.eclipse.mylyn.team.tests/build.properties
new file mode 100644
index 0000000..185839e
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/build.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/AllTeamTests.java b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/AllTeamTests.java
new file mode 100644
index 0000000..dab9031
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/AllTeamTests.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllTeamTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.team.tests");
+ //$JUnit-BEGIN$
+ suite.addTestSuite(TestSyncViewRefresh.class);
+ suite.addTestSuite(ChangeSetManagerTest.class);
+ suite.addTestSuite(CommitTemplateTest.class);
+ suite.addTestSuite(TeamPropertiesLinkProviderTest.class);
+ //$JUnit-END$
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/ChangeSetManagerTest.java b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/ChangeSetManagerTest.java
new file mode 100644
index 0000000..903378d
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/ChangeSetManagerTest.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.tests;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.ide.ui.IdeUiBridgePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.ContextActiveChangeSetManager;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.resources.tests.AbstractResourceContextTest;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+import org.eclipse.team.internal.core.subscribers.ChangeSet;
+
+/**
+ * @author Mik Kersten
+ */
+public class ChangeSetManagerTest extends AbstractResourceContextTest {
+
+ private ContextActiveChangeSetManager changeSetManager;
+
+ private ActiveChangeSetManager collector;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertNotNull(IdeUiBridgePlugin.getDefault());
+ changeSetManager = (ContextActiveChangeSetManager) FocusedTeamUiPlugin.getDefault()
+ .getContextChangeSetManagers()
+ .iterator()
+ .next();
+ collector = CVSUIPlugin.getPlugin().getChangeSetManager();
+ assertNotNull(changeSetManager);
+ assertNull(TasksUiPlugin.getTaskActivityManager().getActiveTask());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testDisabledMode() {
+ ChangeSet[] sets = collector.getSets();
+ for (ChangeSet set : sets) {
+ collector.remove(set);
+ }
+
+ assertEquals(0, collector.getSets().length);
+ manager.deactivateContext(taskId);
+ changeSetManager.clearActiveChangeSets();
+ assertEquals(0, changeSetManager.getActiveChangeSets().size());
+
+ changeSetManager.disable();
+
+ AbstractTask task1 = new LocalTask("task1", "label");
+ TasksUiPlugin.getTaskActivityManager().activateTask(task1);
+ assertEquals(0, changeSetManager.getActiveChangeSets().size());
+ assertEquals(0, collector.getSets().length);
+
+ TasksUiPlugin.getTaskActivityManager().deactivateTask(task1);
+ changeSetManager.enable();
+ }
+
+ public void testSingleContextActivation() {
+ ChangeSet[] sets = collector.getSets();
+ for (ChangeSet set : sets) {
+ collector.remove(set);
+ }
+
+ assertEquals(0, collector.getSets().length);
+ manager.deactivateContext(taskId);
+ changeSetManager.clearActiveChangeSets();
+ assertEquals(0, changeSetManager.getActiveChangeSets().size());
+
+ AbstractTask task1 = new LocalTask("task1", "label");
+ TasksUiPlugin.getTaskActivityManager().activateTask(task1);
+ assertEquals(1, changeSetManager.getActiveChangeSets().size());
+ assertEquals(1, collector.getSets().length);
+
+ TasksUiPlugin.getTaskActivityManager().deactivateTask(task1);
+ assertFalse(ContextCore.getContextManager().isContextActive());
+ assertEquals(0, changeSetManager.getActiveChangeSets().size());
+ assertEquals(0, collector.getSets().length); // deleted because no
+ // active resources
+ TasksUiPlugin.getTaskActivityManager().deactivateTask(task1);
+
+ // TODO: test with resource
+ }
+
+ public void testContentsAfterDecay() throws CoreException {
+ IFile file = project.getProject().getFile(new Path("foo.txt"));
+ file.create(null, true, null);
+
+ AbstractTask task1 = new LocalTask("task1", "label");
+ TasksUiPlugin.getTaskActivityManager().activateTask(task1);
+
+ monitor.selectionChanged(navigator, new StructuredSelection(file));
+ IInteractionElement fileElement = ContextCore.getContextManager().getElement(
+ structureBridge.getHandleIdentifier(file));
+ assertTrue(fileElement.getInterest().isInteresting());
+
+ List<IContextChangeSet> changeSets = changeSetManager.getActiveChangeSets();
+ assertEquals(1, changeSets.size());
+ IContextChangeSet set = changeSets.get(0);
+ IResource[] resources = ((ActiveChangeSet) set).getResources();
+ // can have .project file in there
+ assertTrue("length: " + resources.length, resources.length <= 2);
+
+ for (int i = 0; i < 1 / (scaling.getDecay()) * 3; i++) {
+ ContextCore.getContextManager().processInteractionEvent(mockSelection());
+ }
+ assertTrue("" + fileElement.getInterest().getValue(), fileElement.getInterest().getValue() < 0);
+ assertTrue("length: " + resources.length, resources.length <= 2);
+
+ TasksUiPlugin.getTaskActivityManager().deactivateTask(task1);
+ }
+}
diff --git a/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/CommitTemplateTest.java b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/CommitTemplateTest.java
new file mode 100644
index 0000000..27ee29c
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/CommitTemplateTest.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.tests;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+
+/**
+ * @author Mik Kersten
+ */
+public class CommitTemplateTest extends TestCase {
+
+ public void testCreateTemplate() {
+ String template = "${task.status} - ${connector.task.prefix} ${task.key}: ${task.description}";
+
+ String taskId = "12345678";
+ TaskTask testTask = new TaskTask("no url", taskId, "summary");
+ testTask.setTaskKey(taskId);
+
+ String commitComment = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().generateComment(testTask,
+ template);
+ assertTrue(commitComment.contains(taskId));
+
+ testTask.setTaskKey(null);
+
+ commitComment = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().generateComment(testTask, template);
+ assertFalse(commitComment.contains(taskId));
+
+ }
+
+ public void testRepositoryTaskCommentParsing() {
+ String template = FocusedTeamUiPlugin.getDefault().getPreferenceStore().getString(
+ FocusedTeamUiPlugin.COMMIT_TEMPLATE);
+
+ AbstractTask task = new MockTask("12345");
+ String comment = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().generateComment(task, template);
+
+ String taskId = FocusedTeamUiPlugin.getDefault()
+ .getCommitTemplateManager()
+ .getTaskIdFromCommentOrLabel(comment);
+ assertEquals("12345", taskId);
+ }
+
+ public void testRepositoryTaskCommentParsingMultiline() {
+ String template = FocusedTeamUiPlugin.getDefault().getPreferenceStore().getString(
+ FocusedTeamUiPlugin.COMMIT_TEMPLATE);
+
+ AbstractTask task = new MockTask("12345");
+ String comment = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().generateComment(task, template)
+ + "\n";
+
+ String taskId = FocusedTeamUiPlugin.getDefault()
+ .getCommitTemplateManager()
+ .getTaskIdFromCommentOrLabel(comment);
+ assertEquals("12345", taskId);
+ }
+
+ public void testRegex() {
+ String comment = "task 123: label for handle-123";
+ String regex = ".*\\ (\\d+):\\ .*";
+
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(comment);
+ assertTrue(matcher.find());
+ }
+}
diff --git a/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/TeamPropertiesLinkProviderTest.java b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/TeamPropertiesLinkProviderTest.java
new file mode 100644
index 0000000..a135f14
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/TeamPropertiesLinkProviderTest.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.tests;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.internal.team.ui.ContextChangeSet;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.properties.TeamPropertiesLinkProvider;
+import org.eclipse.mylyn.tasks.tests.connector.MockTask;
+import org.eclipse.team.core.diff.IDiff;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TeamPropertiesLinkProviderTest extends TestCase {
+
+ private IProject project1;
+
+ private List<IResource> resources;
+
+ private IProject project2;
+
+ @Override
+ protected void setUp() throws Exception {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ project1 = root.getProject("Test Project1");
+ project1.create(null);
+ project1.open(null);
+
+ project2 = root.getProject("Test Project2");
+ project2.create(null);
+ project2.open(null);
+
+ resources = new ArrayList<IResource>();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ project1.delete(true, null);
+ project2.delete(true, null);
+ }
+
+ public void testCommitCommentTemplate() throws Exception {
+ MockTask task = new MockTask("1");
+ task.setSummary("summary");
+ task.setUrl("http://url");
+
+ ContextChangeSet changeSet = new ContextChangeSet(task, new StubChangeSetManager()) {
+ @Override
+ public IResource[] getChangedResources() {
+ return resources.toArray(new IResource[0]);
+ }
+ };
+ resources.add(project1);
+
+ FocusedTeamUiPlugin.getDefault().getPreferenceStore().setValue(FocusedTeamUiPlugin.COMMIT_TEMPLATE,
+ "${task.key}: ${task.description}");
+ assertEquals("1: summary", changeSet.getComment());
+
+ TeamPropertiesLinkProvider linkProvider = new TeamPropertiesLinkProvider();
+ assertNull(linkProvider.getCommitCommentTemplate(project1));
+ assertTrue(linkProvider.canAccessProperties(project1));
+
+ assertTrue(linkProvider.setCommitCommentTemplate(project1, "ab${task.url}cd"));
+ assertEquals("ab${task.url}cd", linkProvider.getCommitCommentTemplate(project1));
+ assertEquals("abhttp://urlcd", changeSet.getComment());
+ assertTrue(linkProvider.canAccessProperties(project1));
+
+ // create file
+ IFile file = project1.getFile("file");
+ file.create(new ByteArrayInputStream(new byte[0]), true, null);
+ resources.clear();
+ resources.add(file);
+
+ assertEquals("ab${task.url}cd", linkProvider.getCommitCommentTemplate(file));
+ assertEquals("abhttp://urlcd", changeSet.getComment());
+ assertTrue(linkProvider.canAccessProperties(file));
+
+ linkProvider.setCommitCommentTemplate(file, null);
+ assertNull(linkProvider.getCommitCommentTemplate(file));
+ assertNull(linkProvider.getCommitCommentTemplate(project1));
+ assertTrue(linkProvider.canAccessProperties(file));
+ assertTrue(linkProvider.canAccessProperties(project1));
+ }
+
+ public void testChangeSetCommitCommentMultipleProjects() throws Exception {
+ MockTask task = new MockTask("1");
+ task.setSummary("summary");
+ task.setUrl("http://url");
+
+ ContextChangeSet changeSet = new ContextChangeSet(task, new StubChangeSetManager()) {
+ @Override
+ public IResource[] getChangedResources() {
+ return resources.toArray(new IResource[0]);
+ }
+ };
+
+ resources.add(project1);
+
+ FocusedTeamUiPlugin.getDefault().getPreferenceStore().setValue(FocusedTeamUiPlugin.COMMIT_TEMPLATE,
+ "global template: ${task.key}");
+
+ // only set template on project 2
+ TeamPropertiesLinkProvider linkProvider = new TeamPropertiesLinkProvider();
+ assertTrue(linkProvider.setCommitCommentTemplate(project2, "project template: ${task.key}"));
+
+ resources.add(project1);
+ assertEquals("global template: 1", changeSet.getComment());
+
+ resources.add(project2);
+ assertEquals("project template: 1", changeSet.getComment());
+ }
+
+ public void testChangeSetCommitCommentChangedResources() throws Exception {
+ MockTask task = new MockTask("1");
+ task.setSummary("summary");
+ task.setUrl("http://url");
+
+ ContextChangeSet changeSet = new ContextChangeSet(task, new StubChangeSetManager()) {
+ @Override
+ public IResource[] getResources() {
+ return new IResource[] { project1, project2 };
+ }
+
+ @Override
+ public IResource[] getChangedResources() {
+ return new IResource[] { project2 };
+ }
+
+ };
+
+ FocusedTeamUiPlugin.getDefault().getPreferenceStore().setValue(FocusedTeamUiPlugin.COMMIT_TEMPLATE, "global");
+
+ // only the template project 2 should matter
+ TeamPropertiesLinkProvider linkProvider = new TeamPropertiesLinkProvider();
+ assertTrue(linkProvider.setCommitCommentTemplate(project1, "project1"));
+ assertEquals("global", changeSet.getComment());
+
+ assertTrue(linkProvider.setCommitCommentTemplate(project2, "project2"));
+ assertEquals("project2", changeSet.getComment());
+ }
+
+ public class StubChangeSetManager extends ActiveChangeSetManager {
+
+ @Override
+ public IDiff getDiff(IResource resource) throws CoreException {
+ return null;
+ }
+
+ @Override
+ protected String getName() {
+ return null;
+ }
+
+ @Override
+ protected void initializeSets() {
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/TestSyncViewRefresh.java b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/TestSyncViewRefresh.java
new file mode 100644
index 0000000..f3887ef
--- /dev/null
+++ b/org.eclipse.mylyn.team.tests/src/org/eclipse/mylyn/team/tests/TestSyncViewRefresh.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.team.internal.ui.synchronize.SynchronizeView;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.part.MessagePage;
+
+/**
+ * @author Mik Kersten
+ */
+public class TestSyncViewRefresh extends TestCase {
+
+ public void testInitialPage() throws PartInitException {
+ String ID = "org.eclipse.team.sync.views.SynchronizeView";
+ IViewPart view = openInActivePerspective(ID);
+ assertTrue(view instanceof SynchronizeView);
+ SynchronizeView syncView = (SynchronizeView) view;
+ IPage page = syncView.getCurrentPage();
+ assertTrue(page instanceof MessagePage);
+
+ // TODO: get the AbstractSynchronizePage and call getViewer() for contents
+ }
+
+ private static IViewPart openInActivePerspective(String viewId) throws PartInitException {
+ if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (activePage != null) {
+ return activePage.showView(viewId);
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/.classpath b/org.eclipse.mylyn.team.ui/.classpath
new file mode 100644
index 0000000..600f1b3
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.classpath
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/team/internal/**"/>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.team.ui/.cvsignore b/org.eclipse.mylyn.team.ui/.cvsignore
new file mode 100644
index 0000000..0149589
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.cvsignore
@@ -0,0 +1 @@
+.fbwarnings
diff --git a/org.eclipse.mylyn.team.ui/.project b/org.eclipse.mylyn.team.ui/.project
new file mode 100644
index 0000000..2856072
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.team.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..574eaa0
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.team' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.team.ILinkedTaskInfo.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.internal.team{ILinkedTaskInfo.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165283658204" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'src-old' - Original project: 'org.eclipse.mylar.team' - Destination element: 'src-old' - Original element: 'org.eclipse.mylar.internal.team.ui.actions.CommitContextAction.java'" description="Copy compilation unit" destination="developer/src-old" element1="/src<org.eclipse.mylar.internal.team.ui.actions{CommitContextAction.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="src/org/eclipse/mylar/internal/team/ui/actions/CommitContextAction.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1165436741671" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.team' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ui.actions.CommitContextAction.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.team.ui.actions{CommitContextAction.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165436747078" subPackages="false" version="1.0"/>
+<refactoring abstract="0" comment="Extract superclass 'org.eclipse.mylar.internal.team.AbstractContextChangeSetManager' from 'org.eclipse.mylar.internal.team.ContextChangeSetManager' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ContextChangeSetManager' - Sub types: org.eclipse.mylar.internal.team.ContextChangeSetManager - Extracted class: 'org.eclipse.mylar.internal.team.AbstractContextChangeSetManager' - Use super type where possible" delete="0" description="Extract superclass 'AbstractContextChangeSetManager'" element1="/src<org.eclipse.mylar.internal.team{ContextChangeSetManager.java[ContextChangeSetManager" extract="0" flags="589830" id="org.eclipse.jdt.ui.extract.superclass" input="/src<org.eclipse.mylar.internal.team{ContextChangeSetManager.java[ContextChangeSetManager" instanceof="false" name="AbstractContextChangeSetManager" replace="true" stamp="1165436934406" stubs="true" types="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.team.ContextChangeSetManager' to 'ContextActiveChangeSetManager' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ContextChangeSetManager' - Renamed element: 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'ContextChangeSetManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.team{ContextChangeSetManager.java[ContextChangeSetManager" matchStrategy="1" name="ContextActiveChangeSetManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165439329671" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.team/src/org.eclipse.mylar.team' - Original project: 'org.eclipse.mylar.team' - Destination element: 'org.eclipse.mylar.team/src/org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.AbstractContextChangeSetManager.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.team" element1="/src<org.eclipse.mylar.internal.team{AbstractContextChangeSetManager.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165439493671" units="1" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar.team/schema/providers.exsd' to 'changeSets.exsd' - Original project: 'org.eclipse.mylar.team' - Original element: 'providers.exsd'" description="Rename resource 'providers.exsd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="schema/providers.exsd" name="changeSets.exsd" stamp="1165440002609" version="1.0"/>
+<refactoring comment="Rename field 'ELEM_REPOSITORY_PROVIDER' in 'org.eclipse.mylar.internal.team.TeamRespositoriesManager' to 'ELEM_ACTIVE_CHANGE_SET_PROVIDER' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.TeamRespositoriesManager.ELEM_REPOSITORY_PROVIDER' - Renamed element: 'org.eclipse.mylar.internal.team.TeamRespositoriesManager.ELEM_ACTIVE_CHANGE_SET_PROVIDER' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'ELEM_REPOSITORY_PROVIDER'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.team{TeamRespositoriesManager.java[TeamRespositoriesManager^ELEM_REPOSITORY_PROVIDER" name="ELEM_ACTIVE_CHANGE_SET_PROVIDER" references="true" setter="false" stamp="1165440611046" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.team.AbstractTeamRepositoryProvider' to 'AbstractActiveChangeSetProvider' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.team.AbstractTeamRepositoryProvider' - Renamed element: 'org.eclipse.mylar.team.AbstractActiveChangeSetProvider' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AbstractTeamRepositoryProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.team{AbstractTeamRepositoryProvider.java[AbstractTeamRepositoryProvider" matchStrategy="1" name="AbstractActiveChangeSetProvider" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165440883765" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.team.ccvs.CvsRepositoryProvider' to 'CvsActiveChangeSetProvider' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ccvs.CvsRepositoryProvider' - Renamed element: 'org.eclipse.mylar.internal.team.ccvs.CvsActiveChangeSetProvider' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'CvsRepositoryProvider'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.team.ccvs{CvsRepositoryProvider.java[CvsRepositoryProvider" matchStrategy="1" name="CvsActiveChangeSetProvider" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165440966500" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.team.TeamRespositoriesManager' to 'TeamExtensionPointReader' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.TeamRespositoriesManager' - Renamed element: 'org.eclipse.mylar.internal.team.TeamExtensionPointReader' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TeamRespositoriesManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.team{TeamRespositoriesManager.java[TeamRespositoriesManager" matchStrategy="1" name="TeamExtensionPointReader" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165441374203" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.team.TeamExtensionPointReader' to 'MylarTeamExtensionPointReader' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.TeamExtensionPointReader' - Renamed element: 'org.eclipse.mylar.internal.team.MylarTeamExtensionPointReader' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'TeamExtensionPointReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.team{TeamExtensionPointReader.java[TeamExtensionPointReader" matchStrategy="1" name="MylarTeamExtensionPointReader" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1165441729859" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.team/src/org.eclipse.mylar.internal.team' - Original project: 'org.eclipse.mylar.team' - Destination element: 'org.eclipse.mylar.team/src/org.eclipse.mylar.internal.team' - Original element: 'org.eclipse.mylar.team.AbstractCommitWorkflowProvider.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.team" element1="/src<org.eclipse.mylar.team{AbstractCommitWorkflowProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1165447394609" units="1" version="1.0"/>
+<refactoring comment="Rename field 'collectors' in 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager' to 'changeSetManagers' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager.collectors' - Renamed element: 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager.changeSetManagers' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="false" description="Rename field 'collectors'" flags="589826" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.internal.team{ContextActiveChangeSetManager.java[ContextActiveChangeSetManager^collectors" name="changeSetManagers" references="true" setter="false" stamp="1165599517968" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..110902e
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,14 @@
+1165283658204 Move compilation unit
+1165436741671 Copy compilation unit
+1165436747078 Delete element
+1165436934406 Extract superclass 'AbstractContextChangeSetManager'
+1165439329671 Rename type 'ContextChangeSetManager'
+1165439493671 Move compilation unit
+1165440002609 Rename resource 'providers.exsd'
+1165440611046 Rename field 'ELEM_REPOSITORY_PROVIDER'
+1165440883765 Rename type 'AbstractTeamRepositoryProvider'
+1165440966500 Rename type 'CvsRepositoryProvider'
+1165441374203 Rename type 'TeamRespositoriesManager'
+1165441729859 Rename type 'TeamExtensionPointReader'
+1165447394609 Move compilation unit
+1165599517968 Rename field 'collectors'
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2007/3/13/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2007/3/13/refactorings.history
new file mode 100644
index 0000000..776e1dc
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2007/3/13/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.team.ui.actions.AddToTaskContext' to 'AddToTaskContextAction' - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ui.actions.AddToTaskContext' - Renamed element: 'org.eclipse.mylar.internal.team.ui.actions.AddToTaskContextAction' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'AddToTaskContext'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.team.ui.actions{AddToTaskContext.java[AddToTaskContext" matchStrategy="1" name="AddToTaskContextAction" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1175134854995" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'etool16' - Original project: 'org.eclipse.mylar.team' - Destination element: 'etool16' - Original element: 'apply-patch.gif'" description="Copy file" element1="icons/elcl16/apply-patch.gif" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="icons/elcl16/apply-patch.gif	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1175185973156" target="/org.eclipse.mylar.tasks.ui/icons/etool16" units="0" version="1.0"/>
+<refactoring comment="Convert anonymous class 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager.ContextActiveChangeSetManager().new IChangeSetChangeListener() {...}' in 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager.ContextActiveChangeSetManager()' to nested class - Original project: 'org.eclipse.mylar.team' - Original element: 'org.eclipse.mylar.internal.team.ContextActiveChangeSetManager.ContextActiveChangeSetManager().new IChangeSetChangeListener() {...}' - Class name: 'listener' - Declared visibility: 'private' - Declare class 'final'" description="Convert anonymous class to nested" final="true" flags="786434" id="org.eclipse.jdt.ui.convert.anonymous" input="/src<org.eclipse.mylar.internal.team{ContextActiveChangeSetManager.java" name="listener" selection="3648 0" stamp="1175288396236" static="false" version="1.0" visibility="2"/>
+
+</session>
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2007/3/13/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2007/3/13/refactorings.index
new file mode 100644
index 0000000..66728f3
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2007/3/13/refactorings.index
@@ -0,0 +1,3 @@
+1175134854995 Rename type 'AddToTaskContext'
+1175185973156 Copy file
+1175288396236 Convert anonymous class to nested
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..92b3035
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.team.MylarTeamExtensionPointReader' to 'FocusedTeamExtensionPointReader' - Original project: 'org.eclipse.mylyn.team' - Original element: 'org.eclipse.mylyn.internal.team.MylarTeamExtensionPointReader' - Renamed element: 'org.eclipse.mylyn.internal.team.FocusedTeamExtensionPointReader' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarTeamExtensionPointReader'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.team{MylarTeamExtensionPointReader.java[MylarTeamExtensionPointReader" matchStrategy="1" name="FocusedTeamExtensionPointReader" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269026256" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.team.MylarTeamPlugin' to 'FocusedTeamPlugin' - Original project: 'org.eclipse.mylyn.team' - Original element: 'org.eclipse.mylyn.team.MylarTeamPlugin' - Renamed element: 'org.eclipse.mylyn.team.FocusedTeamPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarTeamPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.team{MylarTeamPlugin.java[MylarTeamPlugin" matchStrategy="1" name="FocusedTeamPlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269042700" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.team.ui.preferences.MylarTeamPreferencePage' to 'FocusedTeamPreferencePage' - Original project: 'org.eclipse.mylyn.team' - Original element: 'org.eclipse.mylyn.internal.team.ui.preferences.MylarTeamPreferencePage' - Renamed element: 'org.eclipse.mylyn.internal.team.ui.preferences.FocusedTeamPreferencePage' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarTeamPreferencePage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.team.ui.preferences{MylarTeamPreferencePage.java[MylarTeamPreferencePage" matchStrategy="1" name="FocusedTeamPreferencePage" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269087853" textual="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.team.tests' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.tests' - Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.team.tests" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log=".settings	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181355850070" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.team.cvs' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.cvs' - Original element: '.settings'" description="Copy folder" destination="=org.eclipse.mylyn.team.cvs" element1=".settings" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" log=".settings	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181355855126" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.team.cvs' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.cvs' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.team.cvs" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181355862530" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.team.tests' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylyn.team.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181355865553" units="0" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.team.ccvs' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.team.ccvs' - Original elements: org.eclipse.mylyn.internal.team.ccvs.CvsCommitWorkflowProvider.java org.eclipse.mylyn.internal.team.ccvs.CvsActiveChangeSetProvider.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.team.ccvs" element1="/src<org.eclipse.mylyn.internal.team.ccvs{CvsCommitWorkflowProvider.java" element2="/src<org.eclipse.mylyn.internal.team.ccvs{CvsActiveChangeSetProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181357398217" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.ui' - Original project: 'org.eclipse.mylyn.team.ui' - Original element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ccvs'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.team.ccvs" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181357402770" subPackages="false" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.team.cvs' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.cvs' - Original element: 'plugin.xml'" description="Copy file" destination="=org.eclipse.mylyn.team.cvs" element1="plugin.xml" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="plugin.xml	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1181357428702" units="0" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui' - Original element: 'org.eclipse.mylyn.team.FocusedTeamPlugin.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.team.ui" element1="/src<org.eclipse.mylyn.team{FocusedTeamPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181357932030" units="1" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.team.ui.FocusedTeamPlugin' to 'FocusedTeamUiPlugin' - Original project: 'org.eclipse.mylyn.team.ui' - Original element: 'org.eclipse.mylyn.internal.team.ui.FocusedTeamPlugin' - Renamed element: 'org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'FocusedTeamPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.team.ui{FocusedTeamPlugin.java[FocusedTeamPlugin" matchStrategy="1" name="FocusedTeamUiPlugin" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181357947113" textual="false" version="1.0"/>
+<refactoring comment="Move 6 elements(s) to 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui' - Original elements: org.eclipse.mylyn.internal.team.LinkedTaskInfo.java org.eclipse.mylyn.internal.team.ContextActiveChangeSetManager.java org.eclipse.mylyn.internal.team.LinkedTaskInfoAdapterFactory.java org.eclipse.mylyn.internal.team.ContextChangeSet.java org.eclipse.mylyn.internal.team.FocusedTeamExtensionPointReader.java org.eclipse.mylyn.internal.team.AbstractCommitWorkflowProvider.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.team.ui" element1="/src<org.eclipse.mylyn.internal.team{LinkedTaskInfo.java" element2="/src<org.eclipse.mylyn.internal.team{ContextActiveChangeSetManager.java" element3="/src<org.eclipse.mylyn.internal.team{LinkedTaskInfoAdapterFactory.java" element4="/src<org.eclipse.mylyn.internal.team{ContextChangeSet.java" element5="/src<org.eclipse.mylyn.internal.team{AbstractCommitWorkflowProvider.javaa" element6="/src<org.eclipse.mylyn.internal.team{AbstractCommitWorkflowProvider.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181357973277" units="6" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.internal.team.template' to 'org.eclipse.mylyn.internal.team.ui.templates' - Original project: 'org.eclipse.mylyn.team.ui' - Original element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.template' - Renamed element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui.templates' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.team.template'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.team.template" name="org.eclipse.mylyn.internal.team.ui.templates" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181358000062" textual="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.team' to 'org.eclipse.mylyn.team.ui' - Original project: 'org.eclipse.mylyn.team.ui' - Original element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.team' - Renamed element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.team.ui' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.team'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.team" name="org.eclipse.mylyn.team.ui" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181358015474" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.internal.team.ccvs' - Original project: 'org.eclipse.mylyn.team.ui' - Destination element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.internal.team.ccvs' - Original element: 'org.eclipse.mylyn.internal.team.ui.wizards.CommitContextWizard.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.team.ccvs" element1="/src<org.eclipse.mylyn.internal.team.ui.wizards{CommitContextWizard.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181363739236" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.ui' - Original project: 'org.eclipse.mylyn.team.ui' - Original element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui.wizards'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.team.ui.wizards" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181363744992" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..d74a801
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,17 @@
+1181269026256 Rename type 'MylarTeamExtensionPointReader'
+1181269042700 Rename type 'MylarTeamPlugin'
+1181269087853 Rename type 'MylarTeamPreferencePage'
+1181355850070 Copy folder
+1181355855126 Copy folder
+1181355862530 Copy file
+1181355865553 Copy file
+1181357398217 Move compilation units
+1181357402770 Delete element
+1181357428702 Copy file
+1181357932030 Move compilation unit
+1181357947113 Rename type 'FocusedTeamPlugin'
+1181357973277 Move compilation units
+1181358000062 Rename package 'org.eclipse.mylyn.internal.team.template'
+1181358015474 Rename package 'org.eclipse.mylyn.team'
+1181363739236 Move compilation unit
+1181363744992 Delete element
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..6c107ad
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.team.ui.actions.OpenCorrespondingTaskAction.reconsile(...)' to 'reconcile' - Original project: 'org.eclipse.mylyn.team.ui' - Original element: 'org.eclipse.mylyn.internal.team.ui.actions.OpenCorrespondingTaskAction.reconsile(...)' - Renamed element: 'org.eclipse.mylyn.internal.team.ui.actions.OpenCorrespondingTaskAction.reconcile(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'reconsile'" flags="589826" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.team.ui.actions{OpenCorrespondingTaskAction.java[OpenCorrespondingTaskAction~reconsile~QILinkedTaskInfo;" name="reconcile" references="true" stamp="1184361918412" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..e79dd1a
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184361918412 Rename method 'reconsile'
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/10/43/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/10/43/refactorings.history
new file mode 100644
index 0000000..6b7181f
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/10/43/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.ui'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui/src/org.eclipse.mylyn.internal.team.ui.preferences.workaround'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.team.ui.preferences.workaround" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1224441254991" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/10/43/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/10/43/refactorings.index
new file mode 100644
index 0000000..080832f
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/10/43/refactorings.index
@@ -0,0 +1 @@
+1224441254991 Delete element
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/2/5/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/2/5/refactorings.history
new file mode 100644
index 0000000..9fd18e4
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/2/5/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.ui'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.internal.team.ui.ITeamUiConstants.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.team.ui{ITeamUiConstants.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1201857083698" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/2/5/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/2/5/refactorings.index
new file mode 100644
index 0000000..940fc2e
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/2/5/refactorings.index
@@ -0,0 +1 @@
+1201857083698 Delete element
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..7a461a4
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.team.ui.ILinkedTaskInfo' to 'AbstractTaskCommentReference'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.ILinkedTaskInfo'
- Renamed element: 'org.eclipse.mylyn.team.ui.AbstractTaskCommentReference'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'ILinkedTaskInfo'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.team.ui{ILinkedTaskInfo.java[ILinkedTaskInfo" matchStrategy="1" name="AbstractTaskCommentReference" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1208479354267" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.team.ui.AbstractTaskCommentReference' to 'AbstractTaskReference'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.AbstractTaskCommentReference'
- Renamed element: 'org.eclipse.mylyn.team.ui.AbstractTaskReference'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'AbstractTaskCommentReference'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.team.ui{AbstractTaskCommentReference.java[AbstractTaskCommentReference" matchStrategy="1" name="AbstractTaskReference" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1208479374716" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.team.ui.AbstractTaskReference.getComment()' to 'getText'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.AbstractTaskReference.getComment()'
- Renamed element: 'org.eclipse.mylyn.team.ui.AbstractTaskReference.getText()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getComment'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.team.ui{AbstractTaskReference.java[AbstractTaskReference~getComment" name="getText" references="true" stamp="1208479499975" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..36e5e22
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,3 @@
+1208479354267 Rename type 'ILinkedTaskInfo'
+1208479374716 Rename type 'AbstractTaskCommentReference'
+1208479499975 Rename method 'getComment'
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..93da37d
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables.getTaskData(...)' to 'getTaskMapping'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables.getTaskData(...)'
- Renamed element: 'org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables.getTaskMapping(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTaskData'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.team.ui.templates{CommitTemplateVariables.java[CommitTemplateVariables~getTaskData~QITask;" name="getTaskMapping" references="true" stamp="1212090248651" version="1.0"/>
<refactoring comment="Rename field 'TASKLIST_CHANGE_LISTENER' in 'org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager' to 'WORKING_SET_LABEL_UPDATE_LISTENER'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager.TASKLIST_CHANGE_LISTENER'
- Renamed element: 'org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager.WORKING_SET_LABEL_UPDATE_LISTENER'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'TASKLIST_CHANGE_LISTENER'" flags="589826" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.team.ui{AbstractContextChangeSetManager.java[AbstractContextChangeSetManager^TASKLIST_CHANGE_LISTENER" name="WORKING_SET_LABEL_UPDATE_LISTENER" references="true" setter="true" stamp="1212193065221" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.team.ui.IContextChangeSetManager' to 'IChangeSetManager'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.IContextChangeSetManager'
- Renamed element: 'org.eclipse.mylyn.team.ui.IChangeSetManager'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'IContextChangeSetManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.team.ui{IContextChangeSetManager.java[IContextChangeSetManager" matchStrategy="1" name="IChangeSetManager" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1212193218511" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.ui'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.IChangeSetManager.java'" description="Delete element" element1="/src<org.eclipse.mylyn.team.ui{IChangeSetManager.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212194092786" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..b6be319
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1,4 @@
+1212090248651 Rename method 'getTaskData'
+1212193065221 Rename field 'TASKLIST_CHANGE_LISTENER'
+1212193218511 Rename type 'IContextChangeSetManager'
+1212194092786 Delete element
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..d2d52dc
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.internal.team.ccvs'
- Original project: 'org.eclipse.mylyn.team.ui'
- Destination element: 'org.eclipse.mylyn.team.cvs/src/org.eclipse.mylyn.internal.team.ccvs'
- Original element: 'org.eclipse.mylyn.internal.team.ui.ContextChangeSet.java'" description="Copy compilation unit" destination="=org.eclipse.mylyn.team.cvs/src<org.eclipse.mylyn.internal.team.ccvs" element1="/src<org.eclipse.mylyn.internal.team.ui{ContextChangeSet.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1212620017789" units="1" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.team.ui.IContextChangeSet.initTitle()' to 'updateLabel'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.team.ui.IContextChangeSet.initTitle()'
- Renamed element: 'org.eclipse.mylyn.team.ui.IContextChangeSet.updateLabel()'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'initTitle'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.team.ui{IContextChangeSet.java[IContextChangeSet~initTitle" name="updateLabel" references="true" stamp="1212622365783" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..70eab58
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1212620017789 Copy compilation unit
+1212622365783 Rename method 'initTitle'
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..100002b
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.team.ui{FocusedTeamUiPlugin.java[FocusedTeamUiPlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213246524987" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..de6bf38
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1 @@
+1213246524987 Rename field 'PLUGIN_ID'
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/8/34/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/8/34/refactorings.history
new file mode 100644
index 0000000..82571e6
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/8/34/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private IContextChangeSet getOrCreateSet(ITask task,AbstractActiveChangeSetProvider changeSetProvider)' from 'org.eclipse.mylyn.internal.team.ui.ContextActiveChangeSetManager.contextActivated()' to 'org.eclipse.mylyn.internal.team.ui.ContextActiveChangeSetManager'
- Original project: 'org.eclipse.mylyn.team.ui'
- Method name: 'getOrCreateSet'
- Destination type: 'org.eclipse.mylyn.internal.team.ui.ContextActiveChangeSetManager'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'getOrCreateSet'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.team.ui{ContextActiveChangeSetManager.java" name="getOrCreateSet" replace="true" selection="7611 39" stamp="1219300579493" version="1.0" visibility="2"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/8/34/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/8/34/refactorings.index
new file mode 100644
index 0000000..b340969
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/8/34/refactorings.index
@@ -0,0 +1 @@
+1219300579493 Extract method 'getOrCreateSet'
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/9/37/refactorings.history b/org.eclipse.mylyn.team.ui/.refactorings/2008/9/37/refactorings.history
new file mode 100644
index 0000000..060786a
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/9/37/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.team.ui'
- Original project: 'org.eclipse.mylyn.team.ui'
- Original element: 'org.eclipse.mylyn.internal.team.ui.preferences.workaround.README.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.team.ui.preferences.workaround{README.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221173707435" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/.refactorings/2008/9/37/refactorings.index b/org.eclipse.mylyn.team.ui/.refactorings/2008/9/37/refactorings.index
new file mode 100644
index 0000000..f11623f
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.refactorings/2008/9/37/refactorings.index
@@ -0,0 +1 @@
+1221173707435 Delete element
diff --git a/org.eclipse.mylyn.team.ui/.settings/.api_filters b/org.eclipse.mylyn.team.ui/.settings/.api_filters
new file mode 100644
index 0000000..b55436e
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.settings/.api_filters
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.mylyn.team.ui" version="2">
+ <resource path="src/org/eclipse/mylyn/team/ui/AbstractActiveChangeSetProvider.java" type="org.eclipse.mylyn.team.ui.AbstractActiveChangeSetProvider">
+ <filter id="643842064">
+ <message_arguments>
+ <message_argument value="ActiveChangeSetManager"/>
+ <message_argument value="AbstractActiveChangeSetProvider"/>
+ <message_argument value="getActiveChangeSetManager()"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/org.eclipse.mylyn.team.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.team.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.team.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.team.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.team.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.team.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.team.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a2e4dbe
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.team.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.compare,
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.team.core,
+ org.eclipse.team.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.ui,
+ org.eclipse.ui.navigator,
+ org.eclipse.ui.navigator.resources,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.resources.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.mylyn.internal.team.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.team.ui.actions;x-internal:=true,
+ org.eclipse.mylyn.internal.team.ui.preferences;x-internal:=true,
+ org.eclipse.mylyn.internal.team.ui.properties;x-internal:=true,
+ org.eclipse.mylyn.internal.team.ui.templates;x-internal:=true,
+ org.eclipse.mylyn.team.ui
+Bundle-ClassPath: .
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.team.ui/about.html b/org.eclipse.mylyn.team.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/build.properties b/org.eclipse.mylyn.team.ui/build.properties
new file mode 100644
index 0000000..d6f85f2
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ plugin.properties
+src.includes = about.html,\
+ schema/
diff --git a/org.eclipse.mylyn.team.ui/icons/elcl16/apply-patch.gif b/org.eclipse.mylyn.team.ui/icons/elcl16/apply-patch.gif
new file mode 100644
index 0000000..17482b7
Binary files /dev/null and b/org.eclipse.mylyn.team.ui/icons/elcl16/apply-patch.gif differ
diff --git a/org.eclipse.mylyn.team.ui/icons/elcl16/context-add.gif b/org.eclipse.mylyn.team.ui/icons/elcl16/context-add.gif
new file mode 100644
index 0000000..030eade
Binary files /dev/null and b/org.eclipse.mylyn.team.ui/icons/elcl16/context-add.gif differ
diff --git a/org.eclipse.mylyn.team.ui/icons/elcl16/context-commit.gif b/org.eclipse.mylyn.team.ui/icons/elcl16/context-commit.gif
new file mode 100644
index 0000000..efe5d85
Binary files /dev/null and b/org.eclipse.mylyn.team.ui/icons/elcl16/context-commit.gif differ
diff --git a/org.eclipse.mylyn.team.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.team.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.team.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.team.ui/icons/elcl16/task-repository.gif b/org.eclipse.mylyn.team.ui/icons/elcl16/task-repository.gif
new file mode 100644
index 0000000..78470a3
Binary files /dev/null and b/org.eclipse.mylyn.team.ui/icons/elcl16/task-repository.gif differ
diff --git a/org.eclipse.mylyn.team.ui/plugin.properties b/org.eclipse.mylyn.team.ui/plugin.properties
new file mode 100644
index 0000000..dacf30e
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/plugin.properties
@@ -0,0 +1,44 @@
+#Properties file for org.eclipse.mylyn.team.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Team UI
+
+ContextChangeSetDecorator.label = Task Change Set Decorator
+
+OpenCorrespondingTaskAction.label = Open Corresponding Task
+OpenCorrespondingTaskAction.tooltip = Open Corresponding Task
+AddToTaskContextAction.label = Add to Task Context
+AddToTaskContextAction.tooltip = Add to Task Context
+#ApplyPatchAction.label = Apply Patch...
+#ApplyPatchAction.tooltip = Apply from Repository Task Attachment
+ApplyPatchAction.attachment.label = Apply Patch...
+ApplyPatchAction.attachment.tooltip = Apply from Task Attachment
+
+FocusedTeamPreferencePage.name = Team
+
+keywords.label = mylyn team
+
+CommitTemplateVariables.ConnectorTaskPrefix.description.0 = Task repository-specific connector prefix, e.g. bug
+CommitTemplateVariables.RepositoryKind.description = Provides the repository kind of a task
+CommitTemplateVariables.RepositoryUrl.description = Provides the repository URL of a task.
+CommitTemplateVariables.TaskAssignee.description = Provides the user a task is assigned to, if available.
+CommitTemplateVariables.TaskCc.description = Provides the comma separated CC list of a task, if available.
+CommitTemplateVariables.TaskDescription.description = Provides the description of a task.
+CommitTemplateVariables.TaskId.description = Provides the ID of a task.
+CommitTemplateVariables.TaskKey.description = Provides the key of a task, for most repositories this is equals to the ID.
+CommitTemplateVariables.TaskKeywords.description = Provides the comma separated keyword list of a task, if available.
+CommitTemplateVariables.TaskLastModified.description = Provides the date of last modification of a task, if available.
+CommitTemplateVariables.TaskNotes.description = Provides the notes of a task.
+CommitTemplateVariables.TaskPriority.description = Provides the priority of a task.
+#CommitTemplateVariables.TaskProduct.description = Provides the prroduct a task belongs to, if available.
+CommitTemplateVariables.TaskProduct.description = Provides the product a task belongs to, if available.
+CommitTemplateVariables.TaskReporter.description = Provides the user who reported a task, if available.
+CommitTemplateVariables.TaskResolution.description = Provides the resolution of a task, if available.
+CommitTemplateVariables.TaskStatus.description = Provides the status of a task, if available.
+CommitTemplateVariables.TaskSummary.description = Provides the summary or description of a task, whichever is available.
+CommitTemplateVariables.TaskType.description = Provides the type of a task.
+CommitTemplateVariables.TaskURL.description = Provides the URL of a task.
+CommitTemplateVariables.TaskCompletion.description = Provides the completion date of a task.
+CommitTemplateVariables.TaskCreation.description = Provides the creation date of a task.
+CommitTemplateVariables.TaskReminder.description = Provides the reminder date of a task.
+
+ProjectTeamPage.name = Commit Template
diff --git a/org.eclipse.mylyn.team.ui/plugin.xml b/org.eclipse.mylyn.team.ui/plugin.xml
new file mode 100644
index 0000000..6fefaa7
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/plugin.xml
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="changeSets" name="Task-Focused Change Providers" schema="schema/changeSets.exsd"/>
+ <extension-point id="commitTemplates" name="Commit Template Handlers" schema="schema/commitTemplates.exsd"/>
+
+ <!-- needed to update change sets -->
+ <extension
+ name="Task Change Set Management"
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin$FocusedTeamUiStartup">
+ </startup>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.team.ui.changeSets">
+ <contextChangeSetManager
+ class="org.eclipse.mylyn.internal.team.ui.ContextActiveChangeSetManager">
+ </contextChangeSetManager>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.decorators">
+ <decorator
+ class="org.eclipse.mylyn.internal.team.ui.ContextChangeSetDecorator"
+ id="org.eclipse.mylyn.team.ui.changeset.decorator"
+ label="%ContextChangeSetDecorator.label"
+ lightweight="true"
+ state="true">
+ <enablement>
+ <objectClass
+ name="org.eclipse.mylyn.team.ui.IContextChangeSet">
+ </objectClass>
+ </enablement>
+ </decorator>
+ </extension>
+
+ <extension point="org.eclipse.ui.popupMenus">
+
+ <objectContribution
+ id="org.eclipse.mylyn.ui.team.synchronize.open.report.contribution"
+ objectClass="org.eclipse.mylyn.team.ui.AbstractTaskReference"
+ adaptable="true">
+ <action
+ class="org.eclipse.mylyn.internal.team.ui.actions.OpenCorrespondingTaskAction"
+ enablesFor="1"
+ icon="icons/elcl16/task-repository.gif"
+ id="org.eclipse.mylyn.ui.team.synchronize.open.report.linked"
+ label="%OpenCorrespondingTaskAction.label"
+ menubarPath="mylyn"
+ tooltip="%OpenCorrespondingTaskAction.tooltip">
+ </action>
+ <action
+ class="org.eclipse.mylyn.internal.team.ui.actions.AddToTaskContextAction"
+ enablesFor="*"
+ icon="icons/elcl16/context-add.gif"
+ id="org.eclipse.mylyn.ui.team.synchronize.create.context"
+ label="%AddToTaskContextAction.label"
+ menubarPath="mylyn"
+ tooltip="%AddToTaskContextAction.tooltip">
+ </action>
+ </objectContribution>
+
+ <objectContribution
+ objectClass="org.eclipse.team.internal.ui.synchronize.SyncInfoModelElement"
+ id="org.eclipse.mylyn.ui.team.synchronize.open.report.syncinfo">
+ <action
+ class="org.eclipse.mylyn.internal.team.ui.actions.AddToTaskContextAction"
+ enablesFor="*"
+ icon="icons/elcl16/context-add.gif"
+ id="org.eclipse.mylyn.ui.team.synchronize.create.context"
+ label="%AddToTaskContextAction.label"
+ menubarPath="mylyn"
+ tooltip="%AddToTaskContextAction.tooltip">
+ </action>
+ </objectContribution>
+ <objectContribution
+ objectClass="org.eclipse.team.internal.ui.synchronize.UnchangedResourceModelElement"
+ id="org.eclipse.mylyn.ui.team.synchronize.open.report.unchanged">
+ <action
+ class="org.eclipse.mylyn.internal.team.ui.actions.AddToTaskContextAction"
+ enablesFor="*"
+ icon="icons/elcl16/context-add.gif"
+ id="org.eclipse.mylyn.ui.team.synchronize.create.context"
+ label="%AddToTaskContextAction.label"
+ menubarPath="mylyn"
+ tooltip="%AddToTaskContextAction.tooltip">
+ </action>
+ </objectContribution>
+ </extension>
+
+ <!-- ================= NAVIGATOR CONTENT =================== -->
+
+ <extension point="org.eclipse.ui.navigator.navigatorContent">
+ <actionProvider
+ class="org.eclipse.mylyn.internal.team.ui.actions.TaskResourceMappingActionProvider"
+ id="org.eclipse.mylyn.ide.ui.actions.TaskResourceMappingActionProvider">
+ <enablement>
+ <adapt type="org.eclipse.mylyn.team.ui.AbstractTaskReference"/>
+ </enablement>
+ </actionProvider>
+ </extension>
+
+ <!-- ================= =================== -->
+
+ <extension point = "org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.ide.team.ui.contribution.attachment.patch"
+ objectClass="org.eclipse.mylyn.tasks.core.ITaskAttachment">
+ <action
+ class="org.eclipse.mylyn.internal.team.ui.actions.ApplyPatchAction"
+ enablesFor="1"
+ icon="icons/elcl16/apply-patch.gif"
+ id="org.eclipse.mylyn.team.ui.ui.patch.apply"
+ label="%ApplyPatchAction.attachment.label"
+ menubarPath="actions"
+ tooltip="%ApplyPatchAction.attachment.tooltip">
+ </action>
+ </objectContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ name="%FocusedTeamPreferencePage.name"
+ class="org.eclipse.mylyn.internal.team.ui.preferences.FocusedTeamPreferencePage"
+ id="org.eclipse.mylyn.team.ui.ui.preferences"
+ category="org.eclipse.mylyn.tasks.ui.preferences">
+ <keywordReference id="org.eclipse.mylyn.team.ui.keywords"/>
+ </page>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.keywords">
+ <keyword
+ label="%keywords.label"
+ id="org.eclipse.mylyn.team.ui.keywords"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.team.ui.commitTemplates">
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$ConnectorTaskPrefix"
+ description="%CommitTemplateVariables.ConnectorTaskPrefix.description"
+ recognizedKeyword="connector.task.prefix"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$RepositoryKind"
+ description="%CommitTemplateVariables.RepositoryKind.description"
+ recognizedKeyword="repository.kind"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$RepositoryUrl"
+ description="%CommitTemplateVariables.RepositoryUrl.description.2"
+ recognizedKeyword="repository.url"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskAssignee"
+ description="%CommitTemplateVariables.TaskAssignee.description.3"
+ recognizedKeyword="task.assignee"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskCc"
+ description="%CommitTemplateVariables.TaskCc.description"
+ recognizedKeyword="task.cc"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskDescription"
+ description="%CommitTemplateVariables.TaskDescription.description"
+ recognizedKeyword="task.description"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskId"
+ description="%CommitTemplateVariables.TaskId.description"
+ recognizedKeyword="task.id"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskKey"
+ description="%CommitTemplateVariables.TaskKey.description"
+ recognizedKeyword="task.key"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskKeywords"
+ description="%CommitTemplateVariables.TaskKeywords.description"
+ recognizedKeyword="task.keywords"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskLastModified"
+ description="%CommitTemplateVariables.TaskLastModified.description"
+ recognizedKeyword="task.lastmodified"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskNotes"
+ description="%CommitTemplateVariables.TaskNotes.description"
+ recognizedKeyword="task.notes"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskPriority"
+ description="%CommitTemplateVariables.TaskPriority.description"
+ recognizedKeyword="task.priority"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskProduct"
+ description="%CommitTemplateVariables.TaskProduct.description"
+ recognizedKeyword="task.product"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskReporter"
+ description="%CommitTemplateVariables.TaskReporter.description"
+ recognizedKeyword="task.reporter"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskResolution"
+ description="%CommitTemplateVariables.TaskResolution.description"
+ recognizedKeyword="task.resolution"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskStatus"
+ description="%CommitTemplateVariables.TaskStatus.description"
+ recognizedKeyword="task.status"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskSummary"
+ description="%CommitTemplateVariables.TaskSummary.description"
+ recognizedKeyword="task.summary"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskType"
+ description="%CommitTemplateVariables.TaskType.description"
+ recognizedKeyword="task.type"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskURL"
+ description="%CommitTemplateVariables.TaskURL.description"
+ recognizedKeyword="task.url"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskCompletion"
+ description="%CommitTemplateVariables.TaskCompletion.description"
+ recognizedKeyword="task.completiondate"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskCreation"
+ description="%CommitTemplateVariables.TaskCreation.description"
+ recognizedKeyword="task.creationdate"/>
+ <templateVariable
+ class="org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateVariables$TaskReminder"
+ description="%CommitTemplateVariables.TaskReminder.description"
+ recognizedKeyword="task.reminderdate"/>
+ </extension>
+
+ <extension point="org.eclipse.core.runtime.adapters">
+ <factory adaptableType="org.eclipse.mylyn.internal.team.ui.ContextChangeSet"
+ class="org.eclipse.mylyn.internal.team.ui.LinkedTaskInfoAdapterFactory">
+ <adapter type="org.eclipse.mylyn.team.ui.AbstractTaskReference"/>
+ </factory>
+ <factory adaptableType="org.eclipse.team.core.history.IFileRevision"
+ class="org.eclipse.mylyn.internal.team.ui.LinkedTaskInfoAdapterFactory">
+ <adapter type="org.eclipse.mylyn.team.ui.AbstractTaskReference"/>
+ </factory>
+ <factory adaptableType="org.eclipse.team.internal.core.subscribers.DiffChangeSet"
+ class="org.eclipse.mylyn.internal.team.ui.LinkedTaskInfoAdapterFactory">
+ <adapter type="org.eclipse.mylyn.team.ui.AbstractTaskReference"/>
+ </factory>
+ <factory adaptableType="org.eclipse.team.internal.ui.synchronize.ChangeSetDiffNode"
+ class="org.eclipse.mylyn.internal.team.ui.LinkedTaskInfoAdapterFactory">
+ <adapter type="org.eclipse.mylyn.team.ui.AbstractTaskReference"/>
+ </factory>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ category="org.eclipse.mylyn.tasks.ui.properties.pages.project.repository"
+ class="org.eclipse.mylyn.internal.team.ui.properties.ProjectTeamPage"
+ id="org.eclipse.mylyn.tasks.ui.properties.pages.project.team"
+ name="%ProjectTeamPage.name">
+ <enabledWhen>
+ <adapt
+ type="org.eclipse.core.resources.IProject">
+ </adapt>
+ </enabledWhen>
+ </page>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.team.ui/schema/changeSets.exsd b/org.eclipse.mylyn.team.ui/schema/changeSets.exsd
new file mode 100644
index 0000000..1a006fb
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/schema/changeSets.exsd
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.team.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.team.ui" id="changeSets" name="Mylyn Chagne Set Integration"/>
+ </appInfo>
+ <documentation>
+ Provides repository specific team integration for Mylyn.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="activeChangeSetProvider" minOccurs="0" maxOccurs="unbounded"/>
+ <element ref="contextChangeSetManager" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="activeChangeSetProvider">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.provisional.ide.team.TeamRepositoryProvider"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="contextChangeSetManager">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.team.AbstractContextChangeSetManager"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.team.ui/schema/commitTemplates.exsd b/org.eclipse.mylyn.team.ui/schema/commitTemplates.exsd
new file mode 100644
index 0000000..1e379ac
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/schema/commitTemplates.exsd
@@ -0,0 +1,122 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.team.ui">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.team.ui" id="commitTemplates" name="Mylyn Commit Templates"/>
+ </appInfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="templateVariable" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="templateVariable">
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.team.ITemplateHandler"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="recognizedKeyword" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/AbstractCommitWorkflowProvider.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/AbstractCommitWorkflowProvider.java
new file mode 100644
index 0000000..0f1e3da
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/AbstractCommitWorkflowProvider.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import org.eclipse.core.resources.IResource;
+
+/**
+ * No longer used.
+ *
+ * @author Mik Kersten
+ */
+ at Deprecated
+public class AbstractCommitWorkflowProvider {
+
+ /**
+ * Determines if the team provider manages at least one of the resources and at least one of the resources has an
+ * 'outgoing' state (locally changed). If this method returns <code>true</code>, the team provider may be later
+ * asked to {@link #commit} them. The set of resources may contain resources from projects that are not managed by
+ * your provider or not managed at all.
+ *
+ * @param resources
+ * @return <code>true</code> if the team provider manages at least one of the resources or <code>false</code>
+ * otherwise.
+ */
+ public boolean hasOutgoingChanges(IResource[] resources) {
+ return false;
+ }
+
+ /**
+ * Asks the team provider to commit a set of resources that may be managed by the team provider. It is up to the
+ * team provider to only operate on resources that are being managed by it. The set of resources may contain
+ * resources from projects that are not managed by your provider or not managed at all.
+ *
+ * @param resources
+ * Set of resources that need to be committed
+ */
+ public void commit(IResource[] resources) {
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextActiveChangeSetManager.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextActiveChangeSetManager.java
new file mode 100644
index 0000000..da6d9f3
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextActiveChangeSetManager.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.team.ui.AbstractActiveChangeSetProvider;
+import org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+import org.eclipse.team.internal.core.subscribers.ChangeSet;
+import org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener;
+
+/**
+ * NOTE: this class contains several work-arounds for change set limitations in the Platform/Team support.
+ *
+ * @author Mik Kersten
+ */
+public class ContextActiveChangeSetManager extends AbstractContextChangeSetManager {
+
+ private final List<ActiveChangeSetManager> changeSetManagers = new ArrayList<ActiveChangeSetManager>();
+
+ private final List<IContextChangeSet> activeChangeSets = new ArrayList<IContextChangeSet>();
+
+ private static final String LABEL_NO_TASK = "<No Active Task>"; //$NON-NLS-1$
+
+ private static final String HANDLE_NO_TASK = "org.eclipse.mylyn.team.ui.inactive.proxy"; //$NON-NLS-1$
+
+ private final Map<ActiveChangeSetManager, ActiveChangeSet> noTaskSetMap = new HashMap<ActiveChangeSetManager, ActiveChangeSet>();;
+
+ private final Map<ActiveChangeSetManager, ChangeSetChangeListener> listenerByManager = new HashMap<ActiveChangeSetManager, ChangeSetChangeListener>();
+
+ private final ITask noTaskActiveProxy = new LocalTask(HANDLE_NO_TASK, LABEL_NO_TASK);
+
+ /**
+ * Used to restore change sets managed with task context when platform deletes them, bug 168129
+ */
+ private class ChangeSetChangeListener implements IChangeSetChangeListener {
+
+ private final ActiveChangeSetManager manager;
+
+ public ChangeSetChangeListener(ActiveChangeSetManager manager) {
+ this.manager = manager;
+ }
+
+ public void setRemoved(ChangeSet set) {
+ if (set instanceof IContextChangeSet) {
+ IContextChangeSet contextChangeSet = (IContextChangeSet) set;
+ // never matches the noTask change set: its task is never active
+ if (contextChangeSet.getTask() != null && contextChangeSet.getTask().isActive()) {
+ // put it back
+ manager.add((ActiveChangeSet) contextChangeSet);
+ }
+ }
+ }
+
+ public void setAdded(ChangeSet set) {
+ // ignore
+ }
+
+ public void defaultSetChanged(ChangeSet previousDefault, ChangeSet set) {
+ // ignore
+ }
+
+ public void nameChanged(ChangeSet set) {
+ // ignore
+ }
+
+ public void resourcesChanged(ChangeSet set, IPath[] paths) {
+ // ignore
+ }
+
+ };
+
+ public ContextActiveChangeSetManager() {
+ Collection<AbstractActiveChangeSetProvider> providerList = FocusedTeamUiPlugin.getDefault()
+ .getActiveChangeSetProviders();
+ for (AbstractActiveChangeSetProvider provider : providerList) {
+ ActiveChangeSetManager changeSetManager = provider.getActiveChangeSetManager();
+ if (changeSetManager != null) {
+ changeSetManagers.add(changeSetManager);
+ }
+ }
+ }
+
+ @Override
+ protected void updateChangeSetLabel(ITask task) {
+ for (ActiveChangeSetManager collector : changeSetManagers) {
+ ChangeSet[] sets = collector.getSets();
+ for (ChangeSet set : sets) {
+ if (set instanceof IContextChangeSet) {
+ IContextChangeSet contextChangeSet = (IContextChangeSet) set;
+ if (contextChangeSet.getTask().equals(task)) {
+ contextChangeSet.updateLabel();
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void enable() {
+ super.enable();
+ for (ActiveChangeSetManager collector : changeSetManagers) {
+ ChangeSetChangeListener listener = listenerByManager.get(collector);
+ if (listener == null) {
+ listener = new ChangeSetChangeListener(collector);
+ listenerByManager.put(collector, listener);
+ collector.addListener(listener);
+ }
+ }
+ }
+
+ @Override
+ public void disable() {
+ super.disable();
+ for (ActiveChangeSetManager collector : changeSetManagers) {
+ ChangeSetChangeListener listener = listenerByManager.get(collector);
+ if (listener != null) {
+ collector.removeListener(listener);
+ listenerByManager.remove(collector);
+ }
+ }
+ }
+
+ @Override
+ protected void initContextChangeSets() {
+ // replace existing change sets with IContextChangeSet
+ for (ActiveChangeSetManager manager : changeSetManagers) {
+ ChangeSet[] sets = manager.getSets();
+ for (ChangeSet restoredSet : sets) {
+ if (!(restoredSet instanceof IContextChangeSet)) {
+ String encodedTitle = restoredSet.getName();
+ String taskHandle = ContextChangeSet.getHandleFromPersistedTitle(encodedTitle);
+ ITask task = TasksUi.getRepositoryModel().getTask(taskHandle);
+ if (task != null) {
+ try {
+ IContextChangeSet contextChangeSet = getOrCreateSet(manager, task);
+ if (contextChangeSet instanceof ActiveChangeSet) {
+ contextChangeSet.restoreResources(restoredSet.getResources());
+ manager.remove(restoredSet);
+ manager.add((ActiveChangeSet) contextChangeSet);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
+ "Could not restore change set", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * For testing.
+ */
+ public void clearActiveChangeSets() {
+ activeChangeSets.clear();
+ }
+
+ public IResource[] getResources(ITask task) {
+ for (ActiveChangeSetManager collector : changeSetManagers) {
+ ChangeSet[] sets = collector.getSets();
+ for (ChangeSet set : sets) {
+ if (set instanceof IContextChangeSet) {
+ IContextChangeSet contextChangeSet = (IContextChangeSet) set;
+ if (contextChangeSet.getTask().equals(task) && contextChangeSet instanceof ActiveChangeSet) {
+ return ((ActiveChangeSet) contextChangeSet).getResources();
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ // TODO m4.0 remove deprecated method that is needed maintain backwards compatibility
+ @SuppressWarnings( { "restriction", "deprecation" })
+ @Override
+ public void contextActivated(IInteractionContext context) {
+ try {
+ ITask task = getTask(context);
+ if (task != null) {
+ for (ActiveChangeSetManager manager : changeSetManagers) {
+ IContextChangeSet contextChangeSet = getOrCreateSet(manager, task);
+ if (contextChangeSet instanceof ActiveChangeSet) {
+ ActiveChangeSet activeChangeSet = (ActiveChangeSet) contextChangeSet;
+ List<IResource> interestingResources = ResourcesUiBridgePlugin.getDefault()
+ .getInterestingResources(context);
+ activeChangeSet.add(interestingResources.toArray(new IResource[interestingResources.size()]));
+ activeChangeSets.add(contextChangeSet);
+
+ // makeDefault() will add the change set
+// if (!manager.contains(activeChangeSet)) {
+// manager.add(activeChangeSet);
+// }
+ manager.makeDefault(activeChangeSet);
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN, "Could not update change set", e)); //$NON-NLS-1$
+ }
+ }
+
+ private IContextChangeSet getOrCreateSet(ActiveChangeSetManager manager, ITask task) {
+ ChangeSet[] sets = manager.getSets();
+ for (ChangeSet set : sets) {
+ if (set instanceof IContextChangeSet && task.equals(((IContextChangeSet) set).getTask())) {
+ return (IContextChangeSet) set;
+ }
+ }
+ // change set does not exist, create a new one
+ AbstractActiveChangeSetProvider provider = FocusedTeamUiPlugin.getDefault().getActiveChangeSetProvider(manager);
+ return provider.createChangeSet(task);
+ }
+
+ // TODO m4.0 remove deprecated method that is needed maintain backwards compatibility
+ @SuppressWarnings("deprecation")
+ @Override
+ public void contextDeactivated(IInteractionContext context) {
+ for (ActiveChangeSetManager collector : changeSetManagers) {
+ ChangeSet[] sets = collector.getSets();
+ for (ChangeSet set : sets) {
+ if (set instanceof ActiveChangeSet) {
+ IResource[] resources = set.getResources();
+ if (resources == null || resources.length == 0) {
+ collector.remove(set);
+ }
+ }
+ }
+ // First look for it in the collector, then in our cache
+ ActiveChangeSet noTaskSet = collector.getSet(LABEL_NO_TASK);
+ if (noTaskSet == null) {
+ noTaskSet = noTaskSetMap.get(collector);
+ }
+
+ if (noTaskSet == null) {
+ AbstractActiveChangeSetProvider changeSetProvider = FocusedTeamUiPlugin.getDefault()
+ .getActiveChangeSetProvider(collector);
+ noTaskSet = (ActiveChangeSet) changeSetProvider.createChangeSet(noTaskActiveProxy);
+ collector.add(noTaskSet);
+ noTaskSetMap.put(collector, noTaskSet);
+ }
+ // TODO: not great to do the lookup based on a String value in case the user created this set
+ collector.makeDefault(noTaskSet);
+ noTaskSet.remove(noTaskSet.getResources());
+ collector.remove(noTaskSet);
+ }
+ activeChangeSets.clear();
+ }
+
+ // TODO m4.0 remove deprecated method that is needed maintain backwards compatibility
+ @SuppressWarnings( { "restriction", "deprecation" })
+ @Override
+ public void interestChanged(List<IInteractionElement> elements) {
+ for (IInteractionElement element : elements) {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element.getContentType());
+ try {
+ if (bridge.isDocument(element.getHandleIdentifier())) {
+ IResource resource = ResourcesUiBridgePlugin.getDefault().getResourceForElement(element, false);
+ if (resource != null && resource.exists()) {
+ for (IContextChangeSet activeContextChangeSet : getActiveChangeSets()) {
+ if (activeContextChangeSet instanceof ActiveChangeSet) {
+ if (!((ActiveChangeSet) activeContextChangeSet).contains(resource)) {
+ if (element.getInterest().isInteresting()) {
+ ((ActiveChangeSet) activeContextChangeSet).add(new IResource[] { resource });
+ }
+ }
+ }
+ }
+ if (shouldRemove(element)) {
+ for (ActiveChangeSetManager collector : changeSetManagers) {
+ ChangeSet[] sets = collector.getSets();
+ for (ChangeSet set : sets) {
+ if (set instanceof ActiveChangeSet) {
+ set.remove(resource);
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
+ "Could not manipulate change set resources", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public List<IContextChangeSet> getActiveChangeSets() {
+ return new ArrayList<IContextChangeSet>(activeChangeSets);
+ }
+
+ private ITask getTask(IInteractionContext context) {
+ return TasksUi.getTaskActivityManager().getActiveTask();
+ }
+
+ /**
+ * Ignores decay.
+ */
+ private boolean shouldRemove(IInteractionElement element) {
+ // TODO: generalize this logic?
+ return (element.getInterest().getValue() + element.getInterest().getDecayValue()) < ContextCore.getCommonContextScaling()
+ .getInteresting();
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
new file mode 100644
index 0000000..8d36878
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.provisional.commons.ui.WorkbenchUtil;
+import org.eclipse.mylyn.internal.resources.ui.ResourcesUiBridgePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.properties.TeamPropertiesLinkProvider;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.resources.ui.ResourcesUi;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.team.ui.AbstractTaskReference;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+import org.eclipse.team.core.TeamException;
+import org.eclipse.team.core.diff.IDiff;
+import org.eclipse.team.core.diff.provider.ThreeWayDiff;
+import org.eclipse.team.core.mapping.provider.ResourceDiff;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class ContextChangeSet extends ActiveChangeSet/*CVSActiveChangeSet*/implements IAdaptable, IContextChangeSet {
+
+ // HACK: copied from super
+ private static final String CTX_TITLE = "title"; //$NON-NLS-1$
+
+ public static final String SOURCE_ID = "org.eclipse.mylyn.java.context.changeset.add"; //$NON-NLS-1$
+
+ private boolean suppressInterestContribution = false;
+
+ private final ITask task;
+
+ public ContextChangeSet(ITask task, ActiveChangeSetManager manager) {
+ super(manager, task.getSummary());
+ this.task = task;
+ updateLabel();
+ }
+
+ @Override
+ public boolean isUserCreated() {
+ return true;
+ }
+
+ public void updateLabel() {
+ super.setName(task.getSummary());
+ super.setTitle(task.getSummary());
+ }
+
+ /**
+ * Encodes the handle in the title, since init won't get called on this class.
+ */
+ @Override
+ public void save(Preferences prefs) {
+ super.save(prefs);
+ prefs.put(CTX_TITLE, getTitleForPersistance());
+ }
+
+ private String getTitleForPersistance() {
+ return getTitle() + " (" + task.getHandleIdentifier() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static String getHandleFromPersistedTitle(String title) {
+ int delimStart = title.lastIndexOf('(');
+ int delimEnd = title.lastIndexOf(')');
+ if (delimStart != -1 && delimEnd != -1) {
+ return title.substring(delimStart + 1, delimEnd);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getComment() {
+ return getComment(true);
+ }
+
+ public String getComment(boolean checkTaskRepository) {
+ return ContextChangeSet.getComment(checkTaskRepository, task, getChangedResources());
+ }
+
+ @Override
+ public void remove(IResource resource) {
+ super.remove(resource);
+ }
+
+ @Override
+ public void remove(IResource[] newResources) {
+ super.remove(newResources);
+ }
+
+ @Override
+ public void add(IDiff diff) {
+ super.add(diff);
+ IResource resource = getResourceFromDiff(diff);
+ if (!suppressInterestContribution && resource != null) {
+ Set<IResource> resources = new HashSet<IResource>();
+ resources.add(resource);
+ if (ResourcesUiBridgePlugin.getDefault() != null) {
+ ResourcesUi.addResourceToContext(resources, InteractionEvent.Kind.SELECTION);
+ }
+ }
+ }
+
+ private IResource getResourceFromDiff(IDiff diff) {
+ if (diff instanceof ResourceDiff) {
+ return ((ResourceDiff) diff).getResource();
+ } else if (diff instanceof ThreeWayDiff) {
+ ThreeWayDiff threeWayDiff = (ThreeWayDiff) diff;
+ return ResourcesPlugin.getWorkspace().getRoot().findMember(threeWayDiff.getPath());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public void add(IDiff[] diffs) {
+ super.add(diffs);
+ }
+
+ @Override
+ public void add(IResource[] newResources) throws CoreException {
+ super.add(newResources);
+ }
+
+ public void restoreResources(IResource[] newResources) throws CoreException {
+ suppressInterestContribution = true;
+ try {
+ super.add(newResources);
+ setComment(getComment(false));
+ } catch (TeamException e) {
+ throw e;
+ } finally {
+ suppressInterestContribution = false;
+ }
+ }
+
+ @Override
+ public IResource[] getResources() {
+ return super.getResources();
+// List<IResource> allResources = getAllResourcesInChangeContext();
+// return allResources.toArray(new IResource[allResources.size()]);
+ }
+
+ public IResource[] getChangedResources() {
+ return super.getResources();
+ }
+
+ public List<IResource> getAllResourcesInChangeContext() {
+ Set<IResource> allResources = new HashSet<IResource>();
+ allResources.addAll(Arrays.asList(super.getResources()));
+ if (Platform.isRunning() && ResourcesUiBridgePlugin.getDefault() != null && task.isActive()) {
+ // TODO: if super is always managed correctly should remove
+ // following line
+ allResources.addAll(ResourcesUiBridgePlugin.getDefault().getInterestingResources(
+ ContextCore.getContextManager().getActiveContext()));
+ }
+ return new ArrayList<IResource>(allResources);
+ }
+
+ /**
+ * TODO: unnessary check context?
+ */
+ @Override
+ public boolean contains(IResource local) {
+ return super.contains(local); //return getAllResourcesInChangeContext().contains(local);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof ContextChangeSet && task != null) {
+ ContextChangeSet changeSet = (ContextChangeSet) object;
+ return task.equals(changeSet.getTask());
+ } else {
+ return super.equals(object);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ if (task != null) {
+ return task.hashCode();
+ } else {
+ return super.hashCode();
+ }
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+// if (adapter == ResourceMapping.class) {
+// return null;
+// return new ChangeSetResourceMapping(this);
+// }
+ if (adapter == AbstractTask.class) {
+ return task;
+ } else if (adapter == AbstractTaskReference.class) {
+ return new LinkedTaskInfo(getTask(), this);
+ }
+ return Platform.getAdapterManager().getAdapter(this, adapter);
+ }
+
+ public static String getComment(boolean checkTaskRepository, ITask task, IResource[] resources) {
+ String template = null;
+ Set<IProject> projects = new HashSet<IProject>();
+ for (IResource resource : resources) {
+ IProject project = resource.getProject();
+ if (project != null && project.isAccessible() && !projects.contains(project)) {
+ TeamPropertiesLinkProvider provider = new TeamPropertiesLinkProvider();
+ template = provider.getCommitCommentTemplate(project);
+ if (template != null) {
+ break;
+ }
+ projects.add(project);
+ }
+ }
+
+ boolean proceed = true;
+
+ if (checkTaskRepository) {
+ boolean unmatchedRepositoryFound = false;
+ for (IProject project : projects) {
+ TaskRepository repository = TasksUiPlugin.getDefault().getRepositoryForResource(project);
+ if (repository != null) {
+ if (!repository.getRepositoryUrl().equals(task.getRepositoryUrl())) {
+ unmatchedRepositoryFound = true;
+ }
+ }
+ }
+
+ if (unmatchedRepositoryFound) {
+ proceed = MessageDialog.openQuestion(WorkbenchUtil.getShell(),
+ Messages.ContextChangeSet_Mylyn_Change_Set_Management,
+ Messages.ContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE);
+ }
+ }
+
+ if (proceed) {
+ if (template == null) {
+ template = FocusedTeamUiPlugin.getDefault().getPreferenceStore().getString(
+ FocusedTeamUiPlugin.COMMIT_TEMPLATE);
+ }
+ return FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().generateComment(task, template);
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSetDecorator.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSetDecorator.java
new file mode 100644
index 0000000..efd37b9
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSetDecorator.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+
+/**
+ * @author Mik Kersten
+ */
+public class ContextChangeSetDecorator implements ILightweightLabelDecorator {
+
+ public void decorate(Object element, IDecoration decoration) {
+ if (element instanceof IContextChangeSet) {
+ IContextChangeSet changeSet = (IContextChangeSet) element;
+ if (changeSet.getTask().isActive()) {
+ decoration.setFont(CommonFonts.BOLD);
+ }
+ }
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ // ignore
+ }
+
+ public void dispose() {
+ // ignore
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ // ignore
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/FocusedTeamExtensionPointReader.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/FocusedTeamExtensionPointReader.java
new file mode 100644
index 0000000..69114d4
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/FocusedTeamExtensionPointReader.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Gunnar Wagenknecht - initial API and implementation
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.team.ui.AbstractActiveChangeSetProvider;
+import org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Manages the registeres repository provides.
+ *
+ * @author Gunnar Wagenknecht
+ * @author Mik Kersten (rewrite)
+ */
+public class FocusedTeamExtensionPointReader {
+
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ELEM_ACTIVE_CHANGE_SET_PROVIDER = "activeChangeSetProvider"; //$NON-NLS-1$
+
+ private static final String ELEM_CHANGE_SET_MANAGER = "contextChangeSetManager"; //$NON-NLS-1$
+
+ private static final String EXT_POINT_TEAM_REPOSITORY_PROVIDER = "changeSets"; //$NON-NLS-1$
+
+ public void readExtensions() {
+ IExtensionPoint teamProvider = Platform.getExtensionRegistry().getExtensionPoint(FocusedTeamUiPlugin.ID_PLUGIN,
+ EXT_POINT_TEAM_REPOSITORY_PROVIDER);
+ IExtension[] extensions = teamProvider.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+
+ for (IConfigurationElement element : elements) {
+ if (ELEM_ACTIVE_CHANGE_SET_PROVIDER.equals(element.getName())) {
+ try {
+ AbstractActiveChangeSetProvider provider = (AbstractActiveChangeSetProvider) element.createExecutableExtension(ATTR_CLASS);
+ FocusedTeamUiPlugin.getDefault().addActiveChangeSetProvider(provider);
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN, NLS.bind(
+ "Error while initializing repository contribution {0} from plugin {1}.", //$NON-NLS-1$
+ element.getAttribute(ATTR_CLASS), element.getContributor().getName()), e));
+ }
+ }
+ }
+ }
+ // NOTE: must first have read providers to properly instantiate manager
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (ELEM_CHANGE_SET_MANAGER.equals(element.getName())) {
+ try {
+ AbstractContextChangeSetManager manager = (AbstractContextChangeSetManager) element.createExecutableExtension(ATTR_CLASS);
+ FocusedTeamUiPlugin.getDefault().addContextChangeSetManager(manager);
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN, NLS.bind(
+ "Error while initializing repository contribution {0} from plugin {1}.", //$NON-NLS-1$
+ element.getAttribute(ATTR_CLASS), element.getContributor().getName()), e));
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/FocusedTeamUiPlugin.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/FocusedTeamUiPlugin.java
new file mode 100644
index 0000000..c3577e8
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/FocusedTeamUiPlugin.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateManager;
+import org.eclipse.mylyn.team.ui.AbstractActiveChangeSetProvider;
+import org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+// TODO 3.3 change the name of this class to avoid the word "focused"
+public class FocusedTeamUiPlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.team.ui"; //$NON-NLS-1$
+
+ private static FocusedTeamUiPlugin INSTANCE;
+
+ private final Set<AbstractContextChangeSetManager> changeSetManagers = new HashSet<AbstractContextChangeSetManager>();
+
+ private final Map<ActiveChangeSetManager, AbstractActiveChangeSetProvider> activeChangeSetProviders = new HashMap<ActiveChangeSetManager, AbstractActiveChangeSetProvider>();
+
+ private CommitTemplateManager commitTemplateManager;
+
+ public static final String CHANGE_SET_MANAGE = "org.eclipse.mylyn.team.changesets.manage"; //$NON-NLS-1$
+
+ public static final String COMMIT_TEMPLATE = "org.eclipse.mylyn.team.commit.template"; //$NON-NLS-1$
+
+ public static final String DEFAULT_COMMIT_TEMPLATE = "${task.status} - ${connector.task.prefix} ${task.key}: ${task.description} \n${task.url}"; //$NON-NLS-1$
+
+ private static final String OLD_DEFAULT_COMMIT_TEMPLATE = "${task.status} - ${connector.task.prefix} ${task.id}: ${task.description} \n${task.url}"; //$NON-NLS-1$
+
+ private static final String OLD_DEFAULT_COMMIT_TEMPLATE2 = "${task.status} - ${connector.task.prefix} ${task.id}: ${task.description} \r\n${task.url}"; //$NON-NLS-1$
+
+ public static class FocusedTeamUiStartup implements IStartup {
+
+ public void earlyStartup() {
+ // ignore
+ }
+ }
+
+ public FocusedTeamUiPlugin() {
+ INSTANCE = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ initPreferenceDefaults();
+ commitTemplateManager = new CommitTemplateManager();
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ FocusedTeamExtensionPointReader extensionPointReader = new FocusedTeamExtensionPointReader();
+ extensionPointReader.readExtensions();
+
+ if (getPreferenceStore().getBoolean(CHANGE_SET_MANAGE)) {
+ for (AbstractContextChangeSetManager changeSetManager : changeSetManagers) {
+ changeSetManager.enable();
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
+ "Mylyn Team start failed", e)); //$NON-NLS-1$
+ }
+ }
+ });
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ INSTANCE = null;
+ super.stop(context);
+ for (AbstractContextChangeSetManager changeSetManager : changeSetManagers) {
+ changeSetManager.disable();
+ }
+ }
+
+ private void initPreferenceDefaults() {
+ getPreferenceStore().setDefault(CHANGE_SET_MANAGE, true);
+ getPreferenceStore().setDefault(COMMIT_TEMPLATE, DEFAULT_COMMIT_TEMPLATE);
+ // 2.0M1 - 2.0M2 Default template migration
+ if (getPreferenceStore().getString(COMMIT_TEMPLATE).equals(OLD_DEFAULT_COMMIT_TEMPLATE)
+ || getPreferenceStore().getString(COMMIT_TEMPLATE).equals(OLD_DEFAULT_COMMIT_TEMPLATE2)) {
+ getPreferenceStore().setValue(COMMIT_TEMPLATE, DEFAULT_COMMIT_TEMPLATE);
+ }
+ }
+
+ public static FocusedTeamUiPlugin getDefault() {
+ return INSTANCE;
+ }
+
+ public void addContextChangeSetManager(AbstractContextChangeSetManager changeSetManager) {
+ changeSetManagers.add(changeSetManager);
+ }
+
+ public boolean removeContextChangeSetManager(AbstractContextChangeSetManager changeSetManager) {
+ return changeSetManagers.remove(changeSetManager);
+ }
+
+ public void addActiveChangeSetProvider(AbstractActiveChangeSetProvider provider) {
+ ActiveChangeSetManager manager = provider.getActiveChangeSetManager();
+ if (manager != null) {
+ activeChangeSetProviders.put(manager, provider);
+ }
+ }
+
+ public Collection<AbstractActiveChangeSetProvider> getActiveChangeSetProviders() {
+ return activeChangeSetProviders.values();
+ }
+
+ public AbstractActiveChangeSetProvider getActiveChangeSetProvider(ActiveChangeSetManager manager) {
+ return activeChangeSetProviders.get(manager);
+ }
+
+ public Set<AbstractContextChangeSetManager> getContextChangeSetManagers() {
+ return Collections.unmodifiableSet(changeSetManagers);
+ }
+
+ public CommitTemplateManager getCommitTemplateManager() {
+ return commitTemplateManager;
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/LinkedTaskInfo.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/LinkedTaskInfo.java
new file mode 100644
index 0000000..008c2ad
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/LinkedTaskInfo.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.team.ui.AbstractTaskReference;
+import org.eclipse.team.internal.core.subscribers.ChangeSet;
+
+/**
+ * Default implementation of {@link AbstractTaskReference}
+ *
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ */
+public class LinkedTaskInfo extends AbstractTaskReference {
+
+ private ITask task;
+
+ private String repositoryUrl;
+
+ private String taskId;
+
+ private String taskFullUrl;
+
+ private String comment;
+
+ private ChangeSet changeSet = null;
+
+ public LinkedTaskInfo(ITask task, ChangeSet changeSet) {
+ this.task = task;
+ this.changeSet = changeSet;
+ }
+
+ public LinkedTaskInfo(String taskFullUrl) {
+ this.taskFullUrl = taskFullUrl;
+ }
+
+ public LinkedTaskInfo(String repositoryUrl, String taskId, String taskFullUrl, String comment) {
+ this.repositoryUrl = repositoryUrl;
+ this.taskId = taskId;
+ this.taskFullUrl = taskFullUrl;
+ this.comment = comment;
+ }
+
+ @Override
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public ITask getTask() {
+ return task;
+ }
+
+ @Override
+ public String getTaskUrl() {
+ return taskFullUrl;
+ }
+
+ @Override
+ public String getTaskId() {
+ return taskId;
+ }
+
+ @Override
+ public String getText() {
+ return comment;
+ }
+
+ public ChangeSet getChangeSet() {
+ return changeSet;
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/LinkedTaskInfoAdapterFactory.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/LinkedTaskInfoAdapterFactory.java
new file mode 100644
index 0000000..4d60a47
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/LinkedTaskInfoAdapterFactory.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import org.eclipse.compare.structuremergeviewer.IDiffElement;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.team.ui.AbstractTaskReference;
+import org.eclipse.mylyn.team.ui.IContextChangeSet;
+import org.eclipse.team.core.history.IFileRevision;
+import org.eclipse.team.internal.core.subscribers.ChangeSet;
+import org.eclipse.team.internal.core.subscribers.DiffChangeSet;
+import org.eclipse.team.internal.ui.synchronize.ChangeSetDiffNode;
+import org.eclipse.team.internal.ui.synchronize.SynchronizeModelElement;
+
+/**
+ * Adapter factory used to create adapters for <code>LinkedTaskInfo</code>
+ *
+ * @author Eugene Kuleshov
+ */
+public class LinkedTaskInfoAdapterFactory implements IAdapterFactory {
+
+ @SuppressWarnings("unchecked")
+ private static final Class[] ADAPTER_TYPES = new Class[] { AbstractTaskReference.class };
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Object object, Class adapterType) {
+ if (!AbstractTaskReference.class.equals(adapterType)) {
+ return null;
+ }
+
+ if (object instanceof ChangeSetDiffNode) {
+ return adaptChangeSetDiffNode(object);
+ }
+
+ // TODO add other adapted types
+
+ return adaptFromComment(object);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class[] getAdapterList() {
+ return ADAPTER_TYPES;
+ }
+
+ private AbstractTaskReference adaptChangeSetDiffNode(Object object) {
+ ChangeSetDiffNode diffNode = (ChangeSetDiffNode) object;
+ ChangeSet set = diffNode.getSet();
+
+ Object adapter = null;
+ if (set instanceof IAdaptable) {
+ adapter = ((IAdaptable) set).getAdapter(AbstractTaskReference.class);
+ }
+ if (adapter == null) {
+ adapter = Platform.getAdapterManager().getAdapter(set, AbstractTaskReference.class);
+ }
+ if (adapter != null) {
+ return (AbstractTaskReference) adapter;
+ }
+
+ return adaptFromComment(object);
+ }
+
+ private AbstractTaskReference adaptFromComment(Object object) {
+ String comment = getCommentForElement(object);
+ if (comment == null) {
+ return null;
+ }
+
+ IResource resource = getResourceForElement(object);
+ if (resource != null) {
+ TaskRepository repository = TasksUiPlugin.getDefault().getRepositoryForResource(resource);
+ if (repository != null) {
+ return new LinkedTaskInfo(repository.getRepositoryUrl(), null, null, comment);
+ }
+ }
+
+ return new LinkedTaskInfo(null, null, null, comment);
+ }
+
+ private static String getCommentForElement(Object element) {
+ if (element instanceof IContextChangeSet) {
+ return ((IContextChangeSet) element).getComment(false);
+ } else if (element instanceof DiffChangeSet) {
+ return ((DiffChangeSet) element).getComment();
+ } else if (element instanceof ChangeSetDiffNode) {
+ return ((ChangeSetDiffNode) element).getName();
+ } else if (element instanceof IFileRevision) {
+ return ((IFileRevision) element).getComment();
+ }
+ return null;
+ }
+
+ private static IResource getResourceForElement(Object element) {
+ if (element instanceof DiffChangeSet) {
+ IResource[] resources = ((DiffChangeSet) element).getResources();
+ if (resources.length > 0) {
+ // TODO: only checks first resource
+ return resources[0];
+ }
+ }
+ if (element instanceof SynchronizeModelElement) {
+ SynchronizeModelElement modelElement = (SynchronizeModelElement) element;
+ IResource resource = modelElement.getResource();
+ if (resource != null) {
+ return resource;
+ } else {
+ IDiffElement[] elements = modelElement.getChildren();
+ if (elements.length > 0) {
+ // TODO: only checks first diff
+ if (elements[0] instanceof SynchronizeModelElement) {
+ return ((SynchronizeModelElement) elements[0]).getResource();
+ }
+ }
+ }
+ }
+
+ // TODO any other resource types?
+
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/Messages.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/Messages.java
new file mode 100644
index 0000000..44d8cda
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/Messages.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.team.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE;
+ public static String ContextChangeSet_Mylyn_Change_Set_Management;
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/AddToTaskContextAction.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/AddToTaskContextAction.java
new file mode 100644
index 0000000..0956817
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/AddToTaskContextAction.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.actions;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.team.ui.LinkedTaskInfo;
+import org.eclipse.mylyn.monitor.core.InteractionEvent;
+import org.eclipse.mylyn.resources.ui.ResourcesUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSet;
+import org.eclipse.team.internal.core.subscribers.ChangeSet;
+import org.eclipse.team.internal.core.subscribers.DiffChangeSet;
+import org.eclipse.team.internal.ui.synchronize.SynchronizeModelElement;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.ObjectPluginAction;
+
+/**
+ * @author Mik Kersten
+ */
+public class AddToTaskContextAction extends Action implements IViewActionDelegate {
+
+ private ISelection selection;
+
+ public AddToTaskContextAction() {
+ setText(Messages.AddToTaskContextAction_Add_to_Task_Context);
+ setToolTipText(Messages.AddToTaskContextAction_Add_to_Task_Context);
+ setImageDescriptor(TasksUiImages.CONTEXT_ADD);
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ @Override
+ public void run() {
+ if (selection instanceof StructuredSelection) {
+ run((StructuredSelection) selection);
+ }
+ }
+
+ public void run(IAction action) {
+ if (action instanceof ObjectPluginAction) {
+ ObjectPluginAction objectAction = (ObjectPluginAction) action;
+ if (objectAction.getSelection() instanceof StructuredSelection) {
+ StructuredSelection selection = (StructuredSelection) objectAction.getSelection();
+ run(selection);
+ }
+ }
+ }
+
+ private void run(StructuredSelection selection) {
+ if (!ContextCore.getContextManager().isContextActive()) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.AddToTaskContextAction_Add_to_Task_Context,
+ Messages.AddToTaskContextAction_ACTIVATE_TASK_TO_ADD_RESOURCES);
+ }
+
+ Object element = selection.getFirstElement();
+ IResource[] resources = null;
+
+ if (element instanceof ActiveChangeSet) {
+ resources = ((ActiveChangeSet) element).getResources();
+ } else if (element instanceof DiffChangeSet) {
+ resources = ((DiffChangeSet) element).getResources();
+ } else if (element instanceof LinkedTaskInfo) {
+ LinkedTaskInfo linkedTaskInfo = (LinkedTaskInfo) element;
+ ChangeSet changeSet = linkedTaskInfo.getChangeSet();
+ resources = changeSet.getResources();
+ }
+
+ Set<IResource> resourcesToAdd = new HashSet<IResource>();
+ if (resources != null) {
+ resourcesToAdd.addAll(Arrays.asList(resources));
+ } else {
+ for (Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
+ Object object = iterator.next();
+ if (object instanceof IResource) {
+ resourcesToAdd.add((IResource) object);
+ } else if (object instanceof SynchronizeModelElement) {
+ resourcesToAdd.add(((SynchronizeModelElement) object).getResource());
+ } else if (object instanceof IAdaptable) {
+ Object adapted = ((IAdaptable) object).getAdapter(IResource.class);
+ if (adapted != null) {
+ resourcesToAdd.add((IResource) adapted);
+ }
+ }
+ }
+ }
+
+ if (!resourcesToAdd.isEmpty()) {
+ ResourcesUi.addResourceToContext(resourcesToAdd, InteractionEvent.Kind.SELECTION);
+ } else {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.AddToTaskContextAction_Add_to_Task_Context,
+ Messages.AddToTaskContextAction_No_resources_to_add);
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selection = selection;
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/ApplyPatchAction.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/ApplyPatchAction.java
new file mode 100644
index 0000000..ea2a9e1
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/ApplyPatchAction.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.actions;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.patch.ApplyPatchOperation;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskAttachmentStorage;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class ApplyPatchAction extends BaseSelectionListenerAction implements IViewActionDelegate {
+
+ public ApplyPatchAction() {
+ super(Messages.ApplyPatchAction_Apply_Patch);
+ }
+
+ protected ApplyPatchAction(String text) {
+ super(text);
+ }
+
+ private ISelection currentSelection;
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+ if (currentSelection instanceof StructuredSelection) {
+ Object object = ((StructuredSelection) currentSelection).getFirstElement();
+ if (object instanceof ITaskAttachment) {
+ final ITaskAttachment attachment = (ITaskAttachment) object;
+ IStorage storage;
+ try {
+ storage = TaskAttachmentStorage.create(attachment);
+ } catch (CoreException e) {
+ TasksUiInternal.displayStatus(Messages.ApplyPatchAction_Error_Retrieving_Context, e.getStatus());
+ return;
+ }
+ ApplyPatchOperation op = new ApplyPatchOperation(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .getActivePart(), storage, null, new CompareConfiguration());
+ BusyIndicator.showWhile(Display.getDefault(), op);
+ }
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.currentSelection = selection;
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/CommitContextAction.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/CommitContextAction.java
new file mode 100644
index 0000000..416fae8
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/CommitContextAction.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class CommitContextAction implements IViewActionDelegate {
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ public void run(IAction action) {
+// ITask task = TaskListView.getFromActivePerspective().getSelectedTask();
+// // TODO: consider corresponding tasks to change set managers to avoid iteration
+// for (AbstractContextChangeSetManager changeSetManager : MylynTeamPlugin.getDefault().getContextChangeSetManagers()) {
+// IResource[] resources = MylynTeamPlugin.getDefault().getChangeSetManager().getResources(task);
+// if (resources == null || resources.length == 0) {
+// MessageDialog.openInformation(null, "Mylyn Information",
+// "There are no interesting resources in the corresponding change set.\nRefer to Synchronize view.");
+// return;
+// }
+//
+// List<AbstractCommitWorkflowProvider> providers = TeamRespositoriesManager.getInstance().getProviders();
+// for (AbstractCommitWorkflowProvider element : providers) {
+// AbstractCommitWorkflowProvider provider = (AbstractTeamRepositoryProvider) element;
+// if (provider.hasOutgoingChanges(resources)) {
+// provider.commit(resources);
+// }
+// } catch (Exception e) {
+// StatusHandler.fail(e, "Could not commit context.", false);
+// }
+// }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/Messages.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/Messages.java
new file mode 100644
index 0000000..f767260
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/Messages.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.team.ui.actions.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String AddToTaskContextAction_ACTIVATE_TASK_TO_ADD_RESOURCES;
+ public static String AddToTaskContextAction_Add_to_Task_Context;
+ public static String AddToTaskContextAction_No_resources_to_add;
+
+ public static String ApplyPatchAction_Apply_Patch;
+ public static String ApplyPatchAction_Error_Retrieving_Context;
+
+ public static String OpenCorrespondingTaskAction_Completed;
+ public static String OpenCorrespondingTaskAction_Open_Corresponding_Task;
+ public static String OpenCorrespondingTaskAction_Open_Task;
+ public static String OpenCorrespondingTaskAction_Opening_Corresponding_Task;
+ public static String OpenCorrespondingTaskAction_Progress_on;
+ public static String OpenCorrespondingTaskAction_Unable_to_match_task;
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/OpenCorrespondingTaskAction.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/OpenCorrespondingTaskAction.java
new file mode 100644
index 0000000..8812bca
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/OpenCorrespondingTaskAction.java
@@ -0,0 +1,341 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui.actions;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.OpenRepositoryTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.LinkedTaskInfo;
+import org.eclipse.mylyn.internal.team.ui.templates.CommitTemplateManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.team.ui.AbstractTaskReference;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.ObjectPluginAction;
+
+/**
+ * Action used to open linked task.
+ *
+ * TODO: this class has evolved into a complete mess and has to be fixed.
+ *
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ */
+public class OpenCorrespondingTaskAction extends Action implements IViewActionDelegate {
+
+ private static final String LABEL = Messages.OpenCorrespondingTaskAction_Open_Corresponding_Task;
+
+ private static final String PREFIX_HTTP = "http://"; //$NON-NLS-1$
+
+ private static final String PREFIX_HTTPS = "https://"; //$NON-NLS-1$
+
+ private ISelection selection;
+
+ public OpenCorrespondingTaskAction() {
+ setText(LABEL);
+ setToolTipText(LABEL);
+ setImageDescriptor(TasksUiImages.TASK_REPOSITORY);
+ }
+
+ public void init(IViewPart view) {
+ // ignore
+ }
+
+ @Override
+ public void run() {
+ if (selection instanceof StructuredSelection) {
+ run((StructuredSelection) selection);
+ }
+ }
+
+ public void run(IAction action) {
+ if (action instanceof ObjectPluginAction) {
+ ObjectPluginAction objectAction = (ObjectPluginAction) action;
+ if (objectAction.getSelection() instanceof StructuredSelection) {
+ StructuredSelection selection = (StructuredSelection) objectAction.getSelection();
+ run(selection);
+ }
+ }
+ }
+
+ private void run(StructuredSelection selection) {
+ final Object element = selection.getFirstElement();
+
+ Job job = new OpenCorrespondingTaskJob(Messages.OpenCorrespondingTaskAction_Opening_Corresponding_Task, element);
+ job.schedule();
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ this.selection = selection;
+ }
+
+ /**
+ * Reconcile <code>ILinkedTaskInfo</code> data.
+ *
+ * This is used in order to keep LinkedTaskInfo lightweight with minimal dependencies.
+ */
+ private static AbstractTaskReference reconcile(AbstractTaskReference info) {
+ ITask task;
+ if (info instanceof LinkedTaskInfo) {
+ task = ((LinkedTaskInfo) info).getTask();
+ } else {
+ task = null;
+ }
+
+ if (task != null) {
+ return info;
+ }
+
+ String repositoryUrl = info.getRepositoryUrl();
+ String taskId = info.getTaskId();
+ String taskFullUrl = info.getTaskUrl();
+ String comment = info.getText();
+
+ TaskRepositoryManager repositoryManager = TasksUiPlugin.getRepositoryManager();
+
+ TaskRepository repository = null;
+ if (repositoryUrl != null) {
+ repository = repositoryManager.getRepository(repositoryUrl);
+ }
+
+ if (taskFullUrl == null && comment != null) {
+ taskFullUrl = getUrlFromComment(comment);
+ }
+
+ AbstractRepositoryConnector connector = null;
+ if (taskFullUrl != null) {
+ connector = repositoryManager.getConnectorForRepositoryTaskUrl(taskFullUrl);
+ }
+ if (connector == null && repository != null) {
+ connector = repositoryManager.getRepositoryConnector(repository.getConnectorKind());
+ }
+
+ if (repositoryUrl == null && connector != null) {
+ repositoryUrl = connector.getRepositoryUrlFromTaskUrl(taskFullUrl);
+ if (repository == null) {
+ repository = repositoryManager.getRepository(repositoryUrl);
+ }
+ }
+
+ if (taskId == null && connector != null) {
+ taskId = connector.getTaskIdFromTaskUrl(taskFullUrl);
+ }
+
+ // XXX: clean up and remove break to label
+ if (taskId == null && comment != null) {
+ Collection<AbstractRepositoryConnector> connectors = connector != null ? Collections.singletonList(connector)
+ : TasksUi.getRepositoryManager().getRepositoryConnectors();
+ REPOSITORIES: for (AbstractRepositoryConnector c : connectors) {
+ Collection<TaskRepository> repositories = repository != null ? Collections.singletonList(repository)
+ : TasksUi.getRepositoryManager().getRepositories(c.getConnectorKind());
+ for (TaskRepository r : repositories) {
+ String[] ids = c.getTaskIdsFromComment(r, comment);
+ if (ids != null && ids.length > 0) {
+ taskId = ids[0];
+ connector = c;
+ repository = r;
+ repositoryUrl = r.getRepositoryUrl();
+ break REPOSITORIES;
+ }
+ }
+ }
+ }
+ if (taskId == null && comment != null) {
+ CommitTemplateManager commitTemplateManager = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager();
+ taskId = commitTemplateManager.getTaskIdFromCommentOrLabel(comment);
+ if (taskId == null) {
+ taskId = getTaskIdFromLegacy07Label(comment);
+ }
+ }
+
+ if (taskFullUrl == null && repositoryUrl != null && taskId != null && connector != null) {
+ taskFullUrl = connector.getTaskUrl(repositoryUrl, taskId);
+ }
+
+ if (task == null) {
+ if (taskId != null && repositoryUrl != null) {
+ // XXX fix this hack (jira ids don't work here)
+ if (!taskId.contains(RepositoryTaskHandleUtil.HANDLE_DELIM)) {
+// String handle = AbstractTask.getHandle(repositoryUrl, taskId);
+ task = TasksUiInternal.getTaskList().getTask(repositoryUrl, taskId);
+ }
+ }
+ if (task == null && taskFullUrl != null) {
+ // search by fullUrl
+ for (AbstractTask currTask : TasksUiPlugin.getTaskList().getAllTasks()) {
+ if (currTask != null) {
+ String currUrl = currTask.getUrl();
+ if (taskFullUrl.equals(currUrl)) {
+ return new LinkedTaskInfo(currTask, null);
+ }
+ }
+ }
+ }
+ }
+ if (task != null) {
+ return new LinkedTaskInfo(task, null);
+ }
+
+ return new LinkedTaskInfo(repositoryUrl, taskId, taskFullUrl, comment);
+ }
+
+ public static String getUrlFromComment(String comment) {
+ int httpIndex = comment.indexOf(PREFIX_HTTP);
+ int httpsIndex = comment.indexOf(PREFIX_HTTPS);
+ int idStart = -1;
+ if (httpIndex != -1) {
+ idStart = httpIndex;
+ } else if (httpsIndex != -1) {
+ idStart = httpsIndex;
+ }
+ if (idStart != -1) {
+ int idEnd = comment.indexOf(' ', idStart);
+ if (idEnd == -1) {
+ return comment.substring(idStart);
+ } else if (idEnd != -1 && idStart < idEnd) {
+ return comment.substring(idStart, idEnd);
+ }
+ }
+ return null;
+ }
+
+ public static String getTaskIdFromLegacy07Label(String comment) {
+ String PREFIX_DELIM = ":"; //$NON-NLS-1$
+ String PREFIX_START_1 = Messages.OpenCorrespondingTaskAction_Progress_on;
+ String PREFIX_START_2 = Messages.OpenCorrespondingTaskAction_Completed;
+ String usedPrefix = PREFIX_START_1;
+ int firstDelimIndex = comment.indexOf(PREFIX_START_1);
+ if (firstDelimIndex == -1) {
+ firstDelimIndex = comment.indexOf(PREFIX_START_2);
+ usedPrefix = PREFIX_START_2;
+ }
+ if (firstDelimIndex != -1) {
+ int idStart = firstDelimIndex + usedPrefix.length();
+ int idEnd = comment.indexOf(PREFIX_DELIM, firstDelimIndex + usedPrefix.length());// comment.indexOf(PREFIX_DELIM);
+ if (idEnd != -1 && idStart < idEnd) {
+ String id = comment.substring(idStart, idEnd);
+ if (id != null) {
+ return id.trim();
+ }
+ } else {
+ return comment.substring(0, firstDelimIndex);
+ }
+ }
+ return null;
+ }
+
+ private static final class OpenCorrespondingTaskJob extends Job {
+ private final Object element;
+
+ private OpenCorrespondingTaskJob(String name, Object element) {
+ super(name);
+ this.element = element;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ AbstractTaskReference info = null;
+ if (element instanceof AbstractTaskReference) {
+ info = (AbstractTaskReference) element;
+ } else if (element instanceof IAdaptable) {
+ info = (AbstractTaskReference) ((IAdaptable) element).getAdapter(AbstractTaskReference.class);
+ }
+ if (info == null) {
+ info = (AbstractTaskReference) Platform.getAdapterManager().getAdapter(element,
+ AbstractTaskReference.class);
+ }
+
+ if (info != null) {
+ info = reconcile(info);
+ final ITask task;
+ if (info instanceof LinkedTaskInfo) {
+ task = ((LinkedTaskInfo) info).getTask();
+ } else {
+ task = null;
+ }
+ if (task != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(task);
+ }
+ });
+ return Status.OK_STATUS;
+ }
+ if (info.getRepositoryUrl() != null && info.getTaskId() != null) {
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
+ info.getRepositoryUrl());
+ String taskId = info.getTaskId();
+ if (repository != null && taskId != null) {
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ if (connectorUi != null) {
+ TasksUiInternal.openRepositoryTask(connectorUi.getConnectorKind(),
+ repository.getRepositoryUrl(), taskId);
+ return Status.OK_STATUS;
+ }
+ }
+ }
+ final String taskFullUrl = info.getTaskUrl();
+ if (taskFullUrl != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openUrl(taskFullUrl);
+ }
+ });
+
+ return Status.OK_STATUS;
+ }
+ }
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ boolean openDialog = MessageDialog.openQuestion(window.getShell(),
+ Messages.OpenCorrespondingTaskAction_Open_Task,
+ Messages.OpenCorrespondingTaskAction_Unable_to_match_task);
+ if (openDialog) {
+ new OpenRepositoryTaskAction().run(null);
+ }
+ }
+ });
+
+ return Status.OK_STATUS;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/TaskResourceMappingActionProvider.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/TaskResourceMappingActionProvider.java
new file mode 100644
index 0000000..734e4c3
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/TaskResourceMappingActionProvider.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.actions;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.navigator.CommonActionProvider;
+import org.eclipse.ui.navigator.ICommonMenuConstants;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskResourceMappingActionProvider extends CommonActionProvider {
+
+ private final OpenCorrespondingTaskAction openCorrespondingAction = new OpenCorrespondingTaskAction();
+
+ private final AddToTaskContextAction addToTaskContextAction = new AddToTaskContextAction();
+
+ @Override
+ public void fillContextMenu(IMenuManager menuManager) {
+ IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
+ openCorrespondingAction.selectionChanged(openCorrespondingAction, selection);
+ addToTaskContextAction.selectionChanged(addToTaskContextAction, selection);
+
+ menuManager.insertAfter(ICommonMenuConstants.GROUP_ADDITIONS, openCorrespondingAction);
+ menuManager.insertAfter(ICommonMenuConstants.GROUP_ADDITIONS, addToTaskContextAction);
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/messages.properties b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/messages.properties
new file mode 100644
index 0000000..3441997
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/actions/messages.properties
@@ -0,0 +1,13 @@
+AddToTaskContextAction_ACTIVATE_TASK_TO_ADD_RESOURCES=Activate a task to add resources.
+AddToTaskContextAction_Add_to_Task_Context=Add to Task Context
+AddToTaskContextAction_No_resources_to_add=No resources to add.
+
+ApplyPatchAction_Apply_Patch=Apply Patch
+ApplyPatchAction_Error_Retrieving_Context=Error Retrieving Context
+
+OpenCorrespondingTaskAction_Completed=Completed:
+OpenCorrespondingTaskAction_Open_Corresponding_Task=Open Corresponding Task
+OpenCorrespondingTaskAction_Open_Task=Open Task
+OpenCorrespondingTaskAction_Opening_Corresponding_Task=Opening Corresponding Task
+OpenCorrespondingTaskAction_Progress_on=Progress on:
+OpenCorrespondingTaskAction_Unable_to_match_task=Unable to match task. Open Repository Task dialog?
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/messages.properties b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/messages.properties
new file mode 100644
index 0000000..782ed46
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/messages.properties
@@ -0,0 +1,2 @@
+ContextChangeSet_ATTEMPTING_TO_COMMIT_RESOURCE=You are attempting to commit a resource which is not associated with the selected task repository. Proceed with creating the commit message?
+ContextChangeSet_Mylyn_Change_Set_Management=Mylyn Change Set Management
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/FocusedTeamPreferencePage.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/FocusedTeamPreferencePage.java
new file mode 100644
index 0000000..b39f4e4
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/FocusedTeamPreferencePage.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.preferences;
+
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.IControlContentAdapter;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.templates.TemplateHandlerContentProposalProvider;
+import org.eclipse.mylyn.team.ui.AbstractContextChangeSetManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+
+/**
+ * @author Mik Kersten
+ */
+public class FocusedTeamPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public final static String PAGE_ID = "org.eclipse.mylyn.team.ui.ui.preferences"; //$NON-NLS-1$
+
+ private Button manageChangeSets;
+
+ private Text commitTemplate = null;
+
+ public FocusedTeamPreferencePage() {
+ super();
+ setPreferenceStore(FocusedTeamUiPlugin.getDefault().getPreferenceStore());
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout(1, false);
+ container.setLayout(layout);
+
+ createChangeSetGroup(container);
+ createCommitGroup(container);
+ applyDialogFont(container);
+ return container;
+ }
+
+ public void init(IWorkbench workbench) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public boolean performOk() {
+ getPreferenceStore().setValue(FocusedTeamUiPlugin.COMMIT_TEMPLATE, commitTemplate.getText());
+ getPreferenceStore().setValue(FocusedTeamUiPlugin.CHANGE_SET_MANAGE, manageChangeSets.getSelection());
+
+ if (manageChangeSets.getSelection()) {
+ for (AbstractContextChangeSetManager changeSetManager : FocusedTeamUiPlugin.getDefault()
+ .getContextChangeSetManagers()) {
+ changeSetManager.enable();
+ }
+ } else {
+ for (AbstractContextChangeSetManager changeSetManager : FocusedTeamUiPlugin.getDefault()
+ .getContextChangeSetManagers()) {
+ changeSetManager.disable();
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean performCancel() {
+ return true;
+ }
+
+ @Override
+ public void performDefaults() {
+ super.performDefaults();
+ commitTemplate.setText(getPreferenceStore().getDefaultString(FocusedTeamUiPlugin.COMMIT_TEMPLATE));
+ manageChangeSets.setSelection(getPreferenceStore().getDefaultBoolean(FocusedTeamUiPlugin.CHANGE_SET_MANAGE));
+ }
+
+ private void createChangeSetGroup(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText(Messages.FocusedTeamPreferencePage_Change_Set_Management);
+ group.setLayout(new GridLayout(1, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ manageChangeSets = new Button(group, SWT.CHECK);
+ manageChangeSets.setText(Messages.FocusedTeamPreferencePage_Automatically_create_and_manage_with_task_context);
+ manageChangeSets.setSelection(getPreferenceStore().getBoolean(FocusedTeamUiPlugin.CHANGE_SET_MANAGE));
+ }
+
+ private void createCommitGroup(Composite parent) {
+ Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+ group.setText(Messages.FocusedTeamPreferencePage_Commit_Comment_Template);
+ group.setLayout(new GridLayout(2, false));
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+// Label completedLabel = createLabel(group, "Template: ");
+// completedLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ String completedTemplate = getPreferenceStore().getString(FocusedTeamUiPlugin.COMMIT_TEMPLATE);
+ commitTemplate = addTemplateField(group, completedTemplate, new TemplateHandlerContentProposalProvider());
+ }
+
+ private Text addTemplateField(final Composite parent, final String text, IContentProposalProvider provider) {
+ IControlContentAdapter adapter = new TextContentAdapter();
+ Text control = new Text(parent, SWT.BORDER | SWT.MULTI);
+ control.setText(text);
+
+ new ContentAssistCommandAdapter(control, adapter, provider, null, new char[] { '$' }, true);
+
+ GridData gd = new GridData();
+ gd.heightHint = 60;
+ gd.horizontalAlignment = GridData.FILL;
+ gd.grabExcessHorizontalSpace = true;
+ gd.verticalAlignment = GridData.CENTER;
+ gd.grabExcessVerticalSpace = false;
+ control.setLayoutData(gd);
+
+ return control;
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/Messages.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/Messages.java
new file mode 100644
index 0000000..58e3fa3
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.team.ui.preferences.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String FocusedTeamPreferencePage_Automatically_create_and_manage_with_task_context;
+ public static String FocusedTeamPreferencePage_Change_Set_Management;
+ public static String FocusedTeamPreferencePage_Commit_Comment_Template;
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/messages.properties b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/messages.properties
new file mode 100644
index 0000000..406c7f5
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/preferences/messages.properties
@@ -0,0 +1,3 @@
+FocusedTeamPreferencePage_Automatically_create_and_manage_with_task_context=Automatically create and manage with task context
+FocusedTeamPreferencePage_Change_Set_Management=Change Set Management
+FocusedTeamPreferencePage_Commit_Comment_Template=Commit Comment Template
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/Messages.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/Messages.java
new file mode 100644
index 0000000..fdeeead
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.properties;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.team.ui.properties.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String ProjectTeamPage_Commit_Comment_Template;
+ public static String ProjectTeamPage_Configure_workspace;
+ public static String ProjectTeamPage_Enable_project_specific_settings;
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/ProjectTeamPage.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/ProjectTeamPage.java
new file mode 100644
index 0000000..a0f0589
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/ProjectTeamPage.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.IControlContentAdapter;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.resource.JFaceColors;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.internal.team.ui.preferences.FocusedTeamPreferencePage;
+import org.eclipse.mylyn.internal.team.ui.templates.TemplateHandlerContentProposalProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+
+/**
+ * A property page that support per project configuration of commit comment templates.
+ *
+ * @author Rob Elves
+ * @author Steffen Pingel
+ * @see Adapted from org.eclipse.ui.internal.ide.dialogs.ProjectReferencePage
+ */
+public class ProjectTeamPage extends PropertyPage {
+
+ private IProject project;
+
+ private boolean modified;
+
+ private boolean ignoreModifyEvents;
+
+ private Button useProjectSettings;
+
+ private Text commitTemplateText;
+
+ private Composite propertiesComposite;
+
+ private Hyperlink configurationHyperlink;
+
+ private Label label;
+
+ public ProjectTeamPage() {
+ noDefaultAndApplyButton();
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Font font = parent.getFont();
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ composite.setFont(font);
+
+ createDescription(composite);
+ createPropertiesControl(composite);
+
+ initialize();
+
+ return composite;
+ }
+
+ private void createDescription(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setFont(parent.getFont());
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.numColumns = 2;
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ useProjectSettings = new Button(composite, SWT.CHECK);
+ useProjectSettings.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (!ignoreModifyEvents) {
+ modified = true;
+ }
+ setPropertiesEnabled(useProjectSettings.getSelection());
+ }
+ });
+ useProjectSettings.setText(Messages.ProjectTeamPage_Enable_project_specific_settings);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(useProjectSettings);
+
+ configurationHyperlink = new Hyperlink(composite, SWT.NONE);
+ configurationHyperlink.setUnderlined(true);
+ configurationHyperlink.setText(Messages.ProjectTeamPage_Configure_workspace);
+ configurationHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(getShell(),
+ FocusedTeamPreferencePage.PAGE_ID, new String[] { FocusedTeamPreferencePage.PAGE_ID }, null);
+ dlg.open();
+ }
+ });
+
+ Label horizontalLine = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
+ horizontalLine.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
+ horizontalLine.setFont(composite.getFont());
+ }
+
+ private void setPropertiesEnabled(boolean enabled) {
+ propertiesComposite.setEnabled(enabled);
+ for (Control child : propertiesComposite.getChildren()) {
+ child.setEnabled(enabled);
+ }
+ commitTemplateText.setEnabled(enabled);
+
+ configurationHyperlink.setEnabled(!enabled);
+ if (!enabled) {
+ configurationHyperlink.setForeground(JFaceColors.getHyperlinkText(getShell().getDisplay()));
+ } else {
+ configurationHyperlink.setForeground(getShell().getDisplay().getSystemColor(
+ SWT.COLOR_TITLE_INACTIVE_FOREGROUND));
+ }
+ }
+
+ private void createPropertiesControl(Composite parent) {
+ propertiesComposite = new Composite(parent, SWT.NONE);
+ propertiesComposite.setFont(parent.getFont());
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.numColumns = 1;
+ propertiesComposite.setLayout(layout);
+ propertiesComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ label = new Label(propertiesComposite, SWT.NONE);
+ label.setText(Messages.ProjectTeamPage_Commit_Comment_Template);
+
+ String completedTemplate = ""; //getPreferenceStore().getString(FocusedTeamUiPlugin.COMMIT_TEMPLATE); //$NON-NLS-1$
+ commitTemplateText = addTemplateField(propertiesComposite, completedTemplate,
+ new TemplateHandlerContentProposalProvider());
+ }
+
+ private Text addTemplateField(final Composite parent, final String text, IContentProposalProvider provider) {
+ IControlContentAdapter adapter = new TextContentAdapter();
+ Text control = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
+ control.setText(text);
+ control.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ if (!ignoreModifyEvents) {
+ modified = true;
+ }
+ }
+ });
+
+ new ContentAssistCommandAdapter(control, adapter, provider, null, new char[] { '$' }, true);
+
+ GridData gd = new GridData();
+ gd.heightHint = 60;
+ gd.horizontalAlignment = GridData.FILL;
+ gd.grabExcessHorizontalSpace = true;
+ gd.verticalAlignment = GridData.CENTER;
+ gd.grabExcessVerticalSpace = false;
+ control.setLayoutData(gd);
+
+ return control;
+ }
+
+ private void initialize() {
+ project = (IProject) getElement().getAdapter(IResource.class);
+ try {
+ ignoreModifyEvents = true;
+ TeamPropertiesLinkProvider provider = new TeamPropertiesLinkProvider();
+ String template = provider.getCommitCommentTemplate(project);
+ if (template == null) {
+ useProjectSettings.setSelection(false);
+ setPropertiesEnabled(false);
+ commitTemplateText.setText(FocusedTeamUiPlugin.getDefault().getPreferenceStore().getString(
+ FocusedTeamUiPlugin.COMMIT_TEMPLATE));
+ } else {
+ useProjectSettings.setSelection(true);
+ setPropertiesEnabled(true);
+ commitTemplateText.setText(template);
+ }
+ } finally {
+ ignoreModifyEvents = false;
+ }
+ }
+
+ @Override
+ public boolean performOk() {
+ if (!modified) {
+ return true;
+ }
+
+ TeamPropertiesLinkProvider provider = new TeamPropertiesLinkProvider();
+ if (useProjectSettings.getSelection()) {
+ provider.setCommitCommentTemplate(project, commitTemplateText.getText());
+ } else {
+ provider.setCommitCommentTemplate(project, null);
+ }
+
+ return true;
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/TeamPropertiesLinkProvider.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/TeamPropertiesLinkProvider.java
new file mode 100644
index 0000000..9992355
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/TeamPropertiesLinkProvider.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui.properties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.osgi.service.prefs.BackingStoreException;
+
+/**
+ * Retrieves team settings from project properties.
+ *
+ * @author Eugene Kuleshov
+ * @author Steffen Pingel
+ */
+public class TeamPropertiesLinkProvider {
+
+ private static final String PROJECT_COMMIT_COMMENT_TEMPLATE = "commit.comment.template"; //$NON-NLS-1$
+
+ public TeamPropertiesLinkProvider() {
+ }
+
+ public boolean canAccessProperties(IResource resource) {
+ IProject project = resource.getProject();
+ return project != null && project.isAccessible();
+ }
+
+ public String getCommitCommentTemplate(IResource resource) {
+ if (!canAccessProperties(resource)) {
+ return null;
+ }
+
+ IScopeContext projectScope = new ProjectScope(resource.getProject());
+ IEclipsePreferences projectNode = projectScope.getNode(FocusedTeamUiPlugin.ID_PLUGIN);
+ if (projectNode != null) {
+ return projectNode.get(PROJECT_COMMIT_COMMENT_TEMPLATE, null);
+ }
+ return null;
+ }
+
+ public boolean setCommitCommentTemplate(IResource resource, String commitCommentTemplate) {
+ if (!canAccessProperties(resource)) {
+ return false;
+ }
+
+ IScopeContext projectScope = new ProjectScope(resource.getProject());
+ IEclipsePreferences projectNode = projectScope.getNode(FocusedTeamUiPlugin.ID_PLUGIN);
+ if (projectNode != null) {
+ if (commitCommentTemplate != null) {
+ projectNode.put(PROJECT_COMMIT_COMMENT_TEMPLATE, commitCommentTemplate);
+ } else {
+ projectNode.remove(PROJECT_COMMIT_COMMENT_TEMPLATE);
+ }
+ try {
+ projectNode.flush();
+ return true;
+ } catch (BackingStoreException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
+ "Failed to save commit comment template for project", e)); //$NON-NLS-1$
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/messages.properties b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/messages.properties
new file mode 100644
index 0000000..fcf40ba
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/properties/messages.properties
@@ -0,0 +1,3 @@
+ProjectTeamPage_Commit_Comment_Template=Commit Comment Template
+ProjectTeamPage_Configure_workspace=Configure workspace
+ProjectTeamPage_Enable_project_specific_settings=Enable project specific settings
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/CommitTemplateManager.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/CommitTemplateManager.java
new file mode 100644
index 0000000..f6e37b6
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/CommitTemplateManager.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eike Stepper- initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui.templates;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.team.ui.AbstractCommitTemplateVariable;
+
+/**
+ * @author Eike Stepper
+ * @author Mik Kersten
+ */
+public class CommitTemplateManager {
+
+ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
+
+ private static final String ATTR_DESCRIPTION = "description"; //$NON-NLS-1$
+
+ private static final String ATTR_RECOGNIZED_KEYWORD = "recognizedKeyword"; //$NON-NLS-1$
+
+ private static final String ELEM_TEMPLATE_HANDLER = "templateVariable"; //$NON-NLS-1$
+
+ private static final String EXT_POINT_TEMPLATE_HANDLERS = "commitTemplates"; //$NON-NLS-1$
+
+ public String generateComment(ITask task, String template) {
+ return processKeywords(task, template);
+ }
+
+ public String getTaskIdFromCommentOrLabel(String commentOrLabel) {
+ String id = getTaskIdFromComment(commentOrLabel);
+ return id;
+ }
+
+ private String getTaskIdFromComment(String comment) {
+ try {
+ String template = FocusedTeamUiPlugin.getDefault().getPreferenceStore().getString(
+ FocusedTeamUiPlugin.COMMIT_TEMPLATE);
+ int templateNewline = template.indexOf('\n');
+ String templateFirstLineIndex = template;
+ if (templateNewline != -1) {
+ templateFirstLineIndex = template.substring(0, templateNewline - 1);
+ }
+
+ String regex = getTaskIdRegEx(templateFirstLineIndex);
+
+ int commentNewlineIndex = comment.indexOf('\n');
+ String commentFirstLine = comment;
+ if (commentNewlineIndex != -1) {
+ commentFirstLine = comment.substring(0, commentNewlineIndex);
+ }
+
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(commentFirstLine);
+
+ if (matcher.find()) {
+ return matcher.group(1);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
+ "Problem while parsing task id from comment", e)); //$NON-NLS-1$
+ }
+
+ return null;
+ }
+
+ public String getTaskIdRegEx(String template) {
+ final String META_CHARS = " $()*+.< [\\]^{|}"; //$NON-NLS-1$
+ final String TASK_ID_PLACEHOLDER = "\uffff"; //$NON-NLS-1$
+ final String KEYWORD_PLACEHOLDER = "\ufffe"; //$NON-NLS-1$
+
+ template = template.replaceFirst("\\$\\{task\\.id\\}", TASK_ID_PLACEHOLDER); //$NON-NLS-1$
+ template = template.replaceFirst("\\$\\{task\\.key\\}", TASK_ID_PLACEHOLDER); //$NON-NLS-1$
+ template = replaceKeywords(template, KEYWORD_PLACEHOLDER);
+ template = quoteChars(template, META_CHARS);
+ template = template.replaceFirst(TASK_ID_PLACEHOLDER, "(\\\\d+)"); //$NON-NLS-1$
+ template = template.replaceAll(KEYWORD_PLACEHOLDER, ".*"); //$NON-NLS-1$
+ return template;
+ }
+
+ private String replaceKeywords(String str, String placeholder) {
+ String[] recognizedKeywords = getRecognizedKeywords();
+ for (String keyword : recognizedKeywords) {
+ str = str.replaceAll("\\$\\{" + keyword + "\\}", placeholder); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return str;
+ }
+
+ private String quoteChars(String str, String charsToQuote) {
+ StringBuilder builder = new StringBuilder(str.length() * 2);
+ for (int i = 0; i < str.length(); i++) {
+ char c = str.charAt(i);
+ if (charsToQuote.indexOf(c) != -1) {
+ builder.append('\\');
+ }
+ builder.append(c);
+ }
+ return builder.toString();
+ }
+
+ public String[] getRecognizedKeywords() {
+ final ArrayList<String> result = new ArrayList<String>();
+ new ExtensionProcessor() {
+ @Override
+ protected Object processContribution(IConfigurationElement element, String keyword, String description,
+ String className) throws Exception {
+ result.add(keyword);
+ return null;
+ }
+ }.run();
+
+ return result.toArray(new String[result.size()]);
+ }
+
+ public String getHandlerDescription(final String keyword) {
+ return (String) new ExtensionProcessor() {
+ @Override
+ protected Object processContribution(IConfigurationElement element, String foundKeyword,
+ String description, String className) throws Exception {
+ return keyword.equals(foundKeyword) ? description : null;
+ }
+ }.run();
+ }
+
+ public AbstractCommitTemplateVariable createHandler(final String keyword) {
+ return (AbstractCommitTemplateVariable) new ExtensionProcessor() {
+ @Override
+ protected Object processContribution(IConfigurationElement element, String foundKeyword,
+ String description, String className) throws Exception {
+ if (keyword.equals(foundKeyword)) {
+ AbstractCommitTemplateVariable handler = (AbstractCommitTemplateVariable) element.createExecutableExtension(ATTR_CLASS);
+ if (handler != null) {
+ (handler).setDescription(description);
+ (handler).setRecognizedKeyword(foundKeyword);
+ }
+// else {
+// String recognizedKeyword = handler.getRecognizedKeyword();
+// if (recognizedKeyword == null || !recognizedKeyword.equals(foundKeyword)) {
+// throw new IllegalArgumentException("Keyword markup does not match handler implementation");
+// }
+// }
+
+ return handler;
+ }
+
+ return null;
+ }
+ }.run();
+ }
+
+ private String processKeywords(ITask task, String template) {
+ String[] segments = template.split("\\$\\{"); //$NON-NLS-1$
+ Stack<String> evaluated = new Stack<String>();
+ evaluated.add(segments[0]);
+
+ for (int i = 1; i < segments.length; i++) {
+ String segment = segments[i];
+ String value = null;
+ int brace = segment.indexOf('}');
+ if (brace > 0) {
+ String keyword = segment.substring(0, brace);
+ value = processKeyword(task, keyword);
+ }
+
+ if (value != null) {
+ evaluated.add(value);
+ evaluated.add(segment.substring(brace + 1));
+ } else if (!evaluated.isEmpty()) {
+ evaluated.pop();
+ }
+// else {
+// buffer.append("${");
+// buffer.append(segment);
+// }
+ }
+ StringBuffer buffer = new StringBuffer();
+ for (String string : evaluated) {
+ buffer.append(string);
+ }
+
+ return buffer.toString();
+ }
+
+ private String processKeyword(ITask task, String keyword) {
+ try {
+ AbstractCommitTemplateVariable handler = createHandler(keyword);
+ if (handler != null) {
+ return handler.getValue(task);
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN,
+ "Problem while dispatching to template handler for: " + keyword, e)); //$NON-NLS-1$
+ }
+
+ return null;
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static class ExtensionProcessor {
+ public Object run() {
+ IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(FocusedTeamUiPlugin.ID_PLUGIN,
+ EXT_POINT_TEMPLATE_HANDLERS);
+ IExtension[] extensions = extPoint.getExtensions();
+ for (IExtension extension : extensions) {
+ IConfigurationElement[] elements = extension.getConfigurationElements();
+ for (IConfigurationElement element : elements) {
+ if (ELEM_TEMPLATE_HANDLER.equals(element.getName())) {
+ try {
+ Object result = processContribution(element);
+ if (result != null) {
+ return result;
+ }
+ } catch (Exception e) {
+ String msg = MessageFormat.format(
+ Messages.CommitTemplateManager_Error_while_processing_template_handler_contribution_X_from_plugin_X,
+ element.getAttribute(ATTR_CLASS), element.getContributor().getName());
+ StatusHandler.log(new Status(IStatus.ERROR, FocusedTeamUiPlugin.ID_PLUGIN, msg, e));
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ protected Object processContribution(IConfigurationElement element) throws Exception {
+ String keyword = element.getAttribute(ATTR_RECOGNIZED_KEYWORD);
+ String description = element.getAttribute(ATTR_DESCRIPTION);
+ String className = element.getAttribute(ATTR_CLASS);
+ return processContribution(element, keyword, description, className);
+ }
+
+ protected Object processContribution(IConfigurationElement element, String keyword, String description,
+ String className) throws Exception {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/CommitTemplateVariables.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/CommitTemplateVariables.java
new file mode 100644
index 0000000..de649dc
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/CommitTemplateVariables.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eike Stepper - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui.templates;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.team.ui.AbstractCommitTemplateVariable;
+
+/**
+ * @author Eike Stepper
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class CommitTemplateVariables {
+
+ private static String implode(List<String> list, String separator) {
+ if (list == null) {
+ return null;
+ }
+ StringBuilder builder = new StringBuilder();
+ for (String cc : list) {
+ if (builder.length() != 0) {
+ builder.append(separator);
+ }
+
+ builder.append(cc);
+ }
+
+ return builder.toString();
+ }
+
+ public static class ConnectorTaskPrefix extends AbstractCommitTemplateVariable {
+
+ @Override
+ public String getValue(ITask task) {
+ if (task != null) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ if (connector != null) {
+ return connector.getTaskIdPrefix();
+ }
+ }
+ return null;
+ }
+
+ }
+
+ public static class RepositoryKind extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ if (task != null) {
+ return task.getConnectorKind();
+ }
+ return null;
+ }
+ }
+
+ public static class RepositoryUrl extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ if (task != null) {
+ return task.getRepositoryUrl();
+ }
+
+ return null;
+ }
+ }
+
+ public static class TaskProduct extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ return taskMapping.getProduct();
+ }
+ return null;
+ }
+ }
+
+ public static class TaskAssignee extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ return taskMapping.getOwner();
+ }
+ return null;
+ }
+ }
+
+ public static class TaskReporter extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ return taskMapping.getReporter();
+ }
+ return null;
+ }
+ }
+
+ public static class TaskResolution extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ return taskMapping.getResolution();
+ }
+ return null;
+ }
+ }
+
+ public static class TaskStatus extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ String status = taskMapping.getTaskStatus();
+ if (status != null) {
+ return status.toUpperCase(Locale.ENGLISH);
+ }
+ }
+ if (task != null) {
+ if (task.isCompleted()) {
+ return Messages.CommitTemplateVariables_Complete;
+ } else {
+ return Messages.CommitTemplateVariables_Incomplete;
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class TaskCc extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ List<String> list = taskMapping.getCc();
+ return implode(list, ", "); //$NON-NLS-1$
+ }
+ return null;
+ }
+ }
+
+ public static class TaskKeywords extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ List<String> list = getTaskMapping(task).getKeywords();
+ return implode(list, ", "); //$NON-NLS-1$
+ }
+ return null;
+ }
+ }
+
+ public static class TaskLastModified extends CommitTemplateDate {
+ @Override
+ protected Date getDate(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ return taskMapping.getModificationDate();
+ }
+ return null;
+ }
+ }
+
+ public static class TaskSummary extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ ITaskMapping taskMapping = getTaskMapping(task);
+ if (taskMapping != null) {
+ return getTaskMapping(task).getSummary();
+ }
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public static class TaskDescription extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ if (task != null) {
+ return task.getSummary();
+ }
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public static class TaskId extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ if (task != null) {
+ return task.getTaskId();
+ } else {
+ return null;
+ }
+ }
+ }
+
+ public static class TaskKey extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ if (task != null) {
+ return task.getTaskKey();
+ } else {
+ return null;
+ }
+ }
+ }
+
+ public static class TaskNotes extends AbstractCommitTemplateVariable {
+ @SuppressWarnings("restriction")
+ @Override
+ public String getValue(ITask task) {
+ if (task instanceof AbstractTask) {
+ return ((AbstractTask) task).getNotes();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+ }
+
+ public static class TaskPriority extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ return task.getPriority();
+ }
+ }
+
+ public static class TaskType extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ return task.getTaskKind();
+ }
+ }
+
+ public static class TaskURL extends AbstractCommitTemplateVariable {
+ @Override
+ public String getValue(ITask task) {
+ return task.getUrl();
+ }
+ }
+
+ public static ITaskMapping getTaskMapping(ITask task) {
+ if (task != null) {
+ TaskData taskData;
+ try {
+ taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ if (taskData != null) {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ task.getConnectorKind());
+ return connector.getTaskMapping(taskData);
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class TaskCompletion extends CommitTemplateDate {
+ @Override
+ protected Date getDate(ITask task) {
+ return task.getCompletionDate();
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class TaskCreation extends CommitTemplateDate {
+ @Override
+ protected Date getDate(ITask task) {
+ return task.getCreationDate();
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class TaskReminder extends CommitTemplateDate {
+ @Override
+ protected Date getDate(ITask task) {
+// TODO: Hide this field?
+ return ((AbstractTask) task).getScheduledForDate().getStartDate().getTime();
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static abstract class CommitTemplateDate extends AbstractCommitTemplateVariable {
+
+ @Override
+ public String getValue(ITask task) {
+ java.util.Date date = getDate(task);
+ return (date != null) ? formatDate(date) : null;
+ }
+
+ protected String formatDate(java.util.Date date) {
+ return date.toString();
+ }
+
+ protected abstract java.util.Date getDate(ITask task);
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/Messages.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/Messages.java
new file mode 100644
index 0000000..499edb2
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/Messages.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui.templates;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.team.ui.templates.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String CommitTemplateManager_Error_while_processing_template_handler_contribution_X_from_plugin_X;
+
+ public static String CommitTemplateVariables_Complete;
+
+ public static String CommitTemplateVariables_Incomplete;
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/TemplateHandlerContentProposalProvider.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/TemplateHandlerContentProposalProvider.java
new file mode 100644
index 0000000..202c3c7
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/TemplateHandlerContentProposalProvider.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eike Stepper - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui.templates;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.mylyn.internal.team.ui.FocusedTeamUiPlugin;
+
+/**
+ * @author Eike Stepper
+ */
+public class TemplateHandlerContentProposalProvider implements IContentProposalProvider {
+ public IContentProposal[] getProposals(String contents, int position) {
+ ProposalComputer proposalComputer = new ProposalComputer(contents, position);
+ return proposalComputer.computeProposals();
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ protected static class ProposalComputer {
+ private final String contents;
+
+ private final int position;
+
+ private final List<IContentProposal> result = new ArrayList<IContentProposal>();
+
+ private String[] keywords;
+
+ private String prefix;
+
+ public ProposalComputer(String contents, int position) {
+ this.contents = contents;
+ this.position = position;
+ initKeywords();
+ initPrefix();
+ }
+
+ public IContentProposal[] computeProposals() {
+ for (String keyword : keywords) {
+ String proposal = getMatch(keyword);
+ if (proposal != null) {
+ addProposal(proposal, keyword);
+ }
+ }
+
+ return result.toArray(new IContentProposal[result.size()]);
+ }
+
+ private void initKeywords() {
+ keywords = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().getRecognizedKeywords();
+ }
+
+ private void initPrefix() {
+ prefix = ""; //$NON-NLS-1$
+ String beforePosition = contents.substring(0, position);
+ if (beforePosition.endsWith("$")) { //$NON-NLS-1$
+ prefix = "$"; //$NON-NLS-1$
+ } else {
+ int start = beforePosition.lastIndexOf("${"); //$NON-NLS-1$
+ if (start >= 0) {
+ int end = contents.indexOf('}', start);
+ if (end >= position) {
+ prefix = contents.substring(start, position);
+ }
+ }
+ }
+ }
+
+ private String getMatch(String keyword) {
+ String wholeProposal = "${" + keyword + "}"; //$NON-NLS-1$ //$NON-NLS-2$
+ if (wholeProposal.startsWith(prefix)) {
+ return wholeProposal.substring(prefix.length());
+ }
+
+ return null;
+ }
+
+ private void addProposal(String proposal, String keyword) {
+ String description = FocusedTeamUiPlugin.getDefault().getCommitTemplateManager().getHandlerDescription(
+ keyword);
+ result.add(new Proposal(proposal, keyword, description));
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class Proposal implements IContentProposal {
+ private final String proposal;
+
+ private final String keyword;
+
+ private final String description;
+
+ private Proposal(String proposal, String keyword, String description) {
+ this.proposal = proposal;
+ this.keyword = keyword;
+ this.description = description;
+ }
+
+ public String getContent() {
+ return proposal;
+ }
+
+ public int getCursorPosition() {
+ return proposal.length();
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getLabel() {
+ return "${" + keyword + "}"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/messages.properties b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/messages.properties
new file mode 100644
index 0000000..878e608
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/templates/messages.properties
@@ -0,0 +1,3 @@
+CommitTemplateManager_Error_while_processing_template_handler_contribution_X_from_plugin_X=Error while processing template handler contribution {0} from plugin {1}.
+CommitTemplateVariables_Complete=Complete
+CommitTemplateVariables_Incomplete=Incomplete
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractActiveChangeSetProvider.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractActiveChangeSetProvider.java
new file mode 100644
index 0000000..f80e1b4
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractActiveChangeSetProvider.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Gunnar Wagenkecht - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.team.ui;
+
+import org.eclipse.mylyn.internal.team.ui.ContextChangeSet;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
+
+/**
+ * Integrates an Eclipse Team repository with Mylyn.
+ *
+ * @author Gunnar Wagenknecht
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractActiveChangeSetProvider {
+
+ /**
+ * Return the change set collector that manages the active change set for the participant associated with this
+ * capability. A <code>null</code> is returned if active change sets are not supported. The default is to return
+ * <code>null</code>. This method must be overridden by subclasses that support active change sets.
+ *
+ * Note that {@link ActiveChangeSetManager} is an internal class of <code>org.eclipse.team.core</code>, but is
+ * required for change set support (bug 116084). The current implementation will only work if a subtype of
+ * {@link ActiveChangeSetManager} is returned. In the future, if a change set API becomes available, an additional
+ * extensibility mechanism will be provided.
+ *
+ * @return the change set collector that manages the active change set for the participant associated with this
+ * capability or <code>null</code> if active change sets are not supported.
+ * @since 3.0
+ */
+ public ActiveChangeSetManager getActiveChangeSetManager() {
+ return null;
+ }
+
+ /**
+ * Override if a custom change set class is needed, e.g. in order to support custom action and model mappings as is
+ * the case with the CVS change set implementation used by org.eclipse.mylyn.team.cvs.
+ *
+ * @since 3.0
+ */
+ public IContextChangeSet createChangeSet(ITask task) {
+ return new ContextChangeSet(task, getActiveChangeSetManager());
+ }
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractCommitTemplateVariable.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractCommitTemplateVariable.java
new file mode 100644
index 0000000..c89a3f8
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractCommitTemplateVariable.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Eike Stepper - initial API and implementation
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.team.ui;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Eike Stepper
+ * @author Mik Kersten
+ * @since 2.0
+ */
+public abstract class AbstractCommitTemplateVariable {
+
+ protected String description;
+
+ protected String recognizedKeyword;
+
+ public String getDescription() {
+ return description != null ? description : "Handler for '" + recognizedKeyword + "'"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getRecognizedKeyword() {
+ return recognizedKeyword;
+ }
+
+ /**
+ * @since 3.0
+ */
+ public abstract String getValue(ITask task);
+
+ public void setRecognizedKeyword(String recognizedKeyword) {
+ if (recognizedKeyword == null) {
+ throw new IllegalArgumentException("Keyword to recognize must not be null"); //$NON-NLS-1$
+ }
+
+ this.recognizedKeyword = recognizedKeyword;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractContextChangeSetManager.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractContextChangeSetManager.java
new file mode 100644
index 0000000..5ad825c
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractContextChangeSetManager.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import java.util.Set;
+
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Manages changes sets along with task context and activation.
+ *
+ * @author Mik Kersten
+ * @since 2.0
+ */
+ at SuppressWarnings("restriction")
+public abstract class AbstractContextChangeSetManager extends AbstractContextListener {
+
+ protected boolean isEnabled = false;
+
+ private boolean isInitialized = false;
+
+ @SuppressWarnings("deprecation")
+ public void enable() {
+ if (!isEnabled) {
+ isEnabled = true;
+ TasksUiInternal.getTaskList().addChangeListener(WORKING_SET_LABEL_UPDATE_LISTENER);
+ if (!isInitialized) {
+ initContextChangeSets(); // otherwise listener will do it
+ }
+
+ if (ContextCore.getContextManager().isContextActive()) {
+ // TODO m4.0 remove call to deprecated method that is needed maintain backwards compatibility
+ contextActivated(ContextCore.getContextManager().getActiveContext());
+ }
+ ContextCore.getContextManager().addListener(this);
+ }
+ }
+
+ public void disable() {
+ ContextCore.getContextManager().removeListener(this);
+ TasksUiInternal.getTaskList().removeChangeListener(WORKING_SET_LABEL_UPDATE_LISTENER);
+ isEnabled = false;
+ }
+
+ protected abstract void initContextChangeSets();
+
+ /**
+ * @since 3.0
+ */
+ protected abstract void updateChangeSetLabel(ITask task);
+
+ private final ITaskListChangeListener WORKING_SET_LABEL_UPDATE_LISTENER = new TaskListChangeAdapter() {
+
+ @Override
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (taskContainerDelta.getKind() == TaskContainerDelta.Kind.ROOT && !isInitialized) {
+ initContextChangeSets();
+ isInitialized = true;
+ }
+ if (taskContainerDelta.getElement() instanceof ITask) {
+ ITask task = (ITask) taskContainerDelta.getElement();
+ switch (taskContainerDelta.getKind()) {
+ case CONTENT:
+ updateChangeSetLabel(task);
+ break;
+ }
+ }
+ }
+ }
+ };
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractTaskReference.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractTaskReference.java
new file mode 100644
index 0000000..c5e577d
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/AbstractTaskReference.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Tasktop Technologies - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.team.ui;
+
+/**
+ * @author Eugene Kuleshov
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public abstract class AbstractTaskReference {
+
+ public abstract String getTaskId();
+
+ public abstract String getTaskUrl();
+
+ public abstract String getRepositoryUrl();
+
+ public abstract String getText();
+
+}
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/IContextChangeSet.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/IContextChangeSet.java
new file mode 100644
index 0000000..8bb6f4a
--- /dev/null
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/team/ui/IContextChangeSet.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.team.ui;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * Mixin interface used for custom change set support.
+ *
+ * @author Mik Kersten
+ * @since 3.0
+ */
+public interface IContextChangeSet {
+
+ public abstract ITask getTask();
+
+ public abstract void updateLabel();
+
+ public abstract void restoreResources(IResource[] resources) throws CoreException;
+
+ public abstract String getComment(boolean checkTaskRepository);
+
+}
diff --git a/org.eclipse.mylyn.tests/.classpath b/org.eclipse.mylyn.tests/.classpath
new file mode 100644
index 0000000..cab1d9d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.classpath
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.tests/.cvsignore b/org.eclipse.mylyn.tests/.cvsignore
new file mode 100644
index 0000000..b519a36
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.cvsignore
@@ -0,0 +1,3 @@
+bin
+auth
+test-log.xml
diff --git a/org.eclipse.mylyn.tests/.project b/org.eclipse.mylyn.tests/.project
new file mode 100644
index 0000000..f9fcd48
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2006/4/13/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2006/4/13/refactorings.history
new file mode 100644
index 0000000..116495d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2006/4/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring description="Rename type 'org.eclipse.mylar.tests.integration.FullConfigExtensionVerificationTest' to 'ExtensionPointInitializationTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="=org.eclipse.mylar.tests/src<org.eclipse.mylar.tests.integration{FullConfigExtensionVerificationTest.java[FullConfigExtensionVerificationTest" matchStrategy="1" name="ExtensionPointInitializationTest" qualified="false" references="true" similarDeclarations="true" stamp="1143850584691" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2006/4/13/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2006/4/13/refactorings.index
new file mode 100644
index 0000000..ad6ed3a
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2006/4/13/refactorings.index
@@ -0,0 +1 @@
+1143850584691 Rename type 'org.eclipse.mylar.tests.integration.FullConfigExtensionVerificationTest' to 'ExtensionPointInitializationTest'
diff --git a/org.eclipse.mylyn.tests/.refactorings/2006/6/22/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2006/6/22/refactorings.history
new file mode 100644
index 0000000..4df22ff
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2006/6/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tests.integration.TaskListFiltersTest' to 'TaskListFilterTest' - Original element: 'org.eclipse.mylar.tests.integration.TaskListFiltersTest' - Renamed element: 'org.eclipse.mylar.tests.integration.TaskListFilterTest' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'TaskListFiltersTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tests.integration{TaskListFiltersTest.java[TaskListFiltersTest" matchStrategy="1" name="TaskListFilterTest" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1149193726868" textual="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2006/6/22/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2006/6/22/refactorings.index
new file mode 100644
index 0000000..54d8ec7
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2006/6/22/refactorings.index
@@ -0,0 +1 @@
+1149193726868 Rename type 'TaskListFiltersTest'
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/11/48/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2007/11/48/refactorings.history
new file mode 100644
index 0000000..7a8cc64
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/11/48/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.tests.manual.Main' to 'NoticicationPopupMain'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.manual.Main'
- Renamed element: 'org.eclipse.mylyn.tests.manual.NoticicationPopupMain'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'Main'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tests.manual{Main.java[Main" matchStrategy="1" name="NoticicationPopupMain" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1196306049470" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.tests.manual.CustomNotificationPopup' to 'SampleNotificationPopup'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.manual.CustomNotificationPopup'
- Renamed element: 'org.eclipse.mylyn.tests.manual.SampleNotificationPopup'
- Update references to refactored element
- Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files
- Update textual occurrences in comments and strings" description="Rename type 'CustomNotificationPopup'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tests.manual{CustomNotificationPopup.java[CustomNotificationPopup" matchStrategy="1" name="SampleNotificationPopup" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1196306097499" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/11/48/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2007/11/48/refactorings.index
new file mode 100644
index 0000000..de76266
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/11/48/refactorings.index
@@ -0,0 +1,2 @@
+1196306049470 Rename type 'Main'
+1196306097499 Rename type 'CustomNotificationPopup'
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..b859618
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tests.WebRepositoryConnectorTest' to 'LiveWebConnectorTest' - Original project: 'org.eclipse.mylar.tests' - Original element: 'org.eclipse.mylar.tests.WebRepositoryConnectorTest' - Renamed element: 'org.eclipse.mylar.tests.LiveWebConnectorTest' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'WebRepositoryConnectorTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tests{WebRepositoryConnectorTest.java[WebRepositoryConnectorTest" matchStrategy="1" name="LiveWebConnectorTest" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170722156621" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tests.LiveWebConnectorTest' to 'LiveWebRepositoryConnectorTest' - Original project: 'org.eclipse.mylar.tests' - Original element: 'org.eclipse.mylar.tests.LiveWebConnectorTest' - Renamed element: 'org.eclipse.mylar.tests.LiveWebRepositoryConnectorTest' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'LiveWebConnectorTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tests{LiveWebConnectorTest.java[LiveWebConnectorTest" matchStrategy="1" name="LiveWebRepositoryConnectorTest" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170722163967" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.tests.LiveWebRepositoryConnectorTest' to 'LiveWebConnectorTemplatesTest' - Original project: 'org.eclipse.mylar.tests' - Original element: 'org.eclipse.mylar.tests.LiveWebRepositoryConnectorTest' - Renamed element: 'org.eclipse.mylar.tests.LiveWebConnectorTemplatesTest' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'LiveWebRepositoryConnectorTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tests{LiveWebRepositoryConnectorTest.java[LiveWebRepositoryConnectorTest" matchStrategy="1" name="LiveWebConnectorTemplatesTest" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170722265169" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tests/src/org.eclipse.mylar.tests.integration' - Original project: 'org.eclipse.mylar.tests' - Destination element: 'org.eclipse.mylar.tests/src/org.eclipse.mylar.tests.integration' - Original element: 'org.eclipse.mylar.tests.TestingStatusNotifier.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tests.integration" element1="/src<org.eclipse.mylar.tests{TestingStatusNotifier.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170722286630" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tests/src/org.eclipse.mylar.tests.integration' - Original project: 'org.eclipse.mylar.tests' - Destination element: 'org.eclipse.mylar.tests/src/org.eclipse.mylar.tests.integration' - Original element: 'org.eclipse.mylar.tests.LiveWebConnectorTemplatesTest.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.tests.integration" element1="/src<org.eclipse.mylar.tests{LiveWebConnectorTemplatesTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1170722413130" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..d0cb96b
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,5 @@
+1170722156621 Rename type 'WebRepositoryConnectorTest'
+1170722163967 Rename type 'LiveWebConnectorTest'
+1170722265169 Rename type 'LiveWebRepositoryConnectorTest'
+1170722286630 Move compilation unit
+1170722413130 Move compilation unit
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..37e3c18
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 9 element(s) from project 'org.eclipse.mylar.tests' - Original project: 'org.eclipse.mylar.tests' - Original elements: dom-out.xml extern.xml repositories.xml sax-out.xml TaskAttachmentActionsTest.testfile temptasklist.xml temptasklist-save.zip test-attach-1171408101049.txt test-log.xml" description="Delete elements" element1="temptasklist-save.zip" element2="temptasklist.xml" element3="dom-out.xml" element4="TaskAttachmentActionsTest.testfile" element5="extern.xml" element6="test-attach-1171408101049.txt" element7="repositories.xml" element8="sax-out.xml" element9="test-log.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="9" stamp="1172174599625" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..aad7e8c
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1 @@
+1172174599625 Delete elements
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/3/12/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2007/3/12/refactorings.history
new file mode 100644
index 0000000..e70e8bb
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/3/12/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.tests.misc.GetFaviconsForUrlText' to 'GetFaviconsForUrlTest' - Original project: 'org.eclipse.mylar.tests' - Original element: 'org.eclipse.mylar.tests.misc.GetFaviconsForUrlText' - Renamed element: 'org.eclipse.mylar.tests.misc.GetFaviconsForUrlTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'GetFaviconsForUrlText'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.tests.misc{GetFaviconsForUrlText.java[GetFaviconsForUrlText" matchStrategy="1" name="GetFaviconsForUrlTest" qualified="false" references="true" similarDeclarations="false" stamp="1174496407717" textual="false" version="1.0"/>
+<refactoring comment="Rename compilation unit 'org.eclipse.mylar.tests.misc.GetFaviconsForUrlTest.java' to 'GetFaviconForUrlTest.java' - Original project: 'org.eclipse.mylar.tests' - Original element: 'org.eclipse.mylar.tests.misc.GetFaviconsForUrlTest.java' - Renamed element: 'org.eclipse.mylar.tests.misc.GetFaviconForUrlTest.java'" description="Rename compilation unit 'GetFaviconsForUrlTest.java'" flags="2" id="org.eclipse.jdt.ui.rename.compilationunit" input="/src<org.eclipse.mylar.tests.misc{GetFaviconsForUrlTest.java" name="GetFaviconForUrlTest.java" references="false" stamp="1174496520152" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/3/12/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2007/3/12/refactorings.index
new file mode 100644
index 0000000..0074d5f
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/3/12/refactorings.index
@@ -0,0 +1,2 @@
+1174496407717 Rename type 'GetFaviconsForUrlText'
+1174496520152 Rename compilation unit 'GetFaviconsForUrlTest.java'
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..474823d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 7 element(s) from project 'org.eclipse.mylar.tests' - Original project: 'org.eclipse.mylar.tests' - Original elements: dom-out.xml extern.xml repositories.xml sax-out.xml TaskAttachmentActionsTest.testfile temptasklist.xml test-log.xml" description="Delete elements" element1="dom-out.xml" element2="temptasklist.xml" element3="TaskAttachmentActionsTest.testfile" element4="extern.xml" element5="sax-out.xml" element6="repositories.xml" element7="test-log.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="7" stamp="1180244870132" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..3fbb1c1
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1 @@
+1180244870132 Delete elements
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..f619ff8
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 7 element(s) from project 'org.eclipse.mylar.tests' - Original project: 'org.eclipse.mylar.tests' - Original elements: dom-out.xml extern.xml repositories.xml sax-out.xml TaskAttachmentActionsTest.testfile temptasklist.xml test-log.xml" description="Delete elements" element1="dom-out.xml" element2="temptasklist.xml" element3="TaskAttachmentActionsTest.testfile" element4="extern.xml" element5="sax-out.xml" element6="repositories.xml" element7="test-log.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="7" stamp="1181004682545" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tests' - Original project: 'org.eclipse.mylyn.tests' - Original element: 'org.eclipse.mylyn.tests.MylarTestsPlugin.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tests{MylarTestsPlugin.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181269169341" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.tests/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..a10556e
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,2 @@
+1181004682545 Delete elements
+1181269169341 Delete element
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..ef98e19
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.tasks.tests.web'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.tasks.tests.web'
- Original element: 'org.eclipse.mylyn.tests.integration.WebRepositoryConnectorTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.tests/src<org.eclipse.mylyn.tasks.tests.web" element1="/src<org.eclipse.mylyn.tests.integration{WebRepositoryConnectorTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222912338488" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.tasks.tests.web'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.tasks.tests.web'
- Original element: 'org.eclipse.mylyn.tests.integration.LiveWebConnectorTemplatesTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.tests/src<org.eclipse.mylyn.tasks.tests.web" element1="/src<org.eclipse.mylyn.tests.integration{LiveWebConnectorTemplatesTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222912426949" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.tasks.tests.web'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.sandbox.tests/src/org.eclipse.mylyn.tasks.tests.web'
- Original element: 'org.eclipse.mylyn.tests.AllFragileWebTests.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.sandbox.tests/src<org.eclipse.mylyn.tasks.tests.web" element1="/src<org.eclipse.mylyn.tests{AllFragileWebTests.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222912447652" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..5be5cd6
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1,3 @@
+1222912338488 Move compilation unit
+1222912426949 Move compilation unit
+1222912447652 Move compilation unit
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..f59ab0e
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.tests.WebClientUtilTest' to 'WebUtilTest'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.WebClientUtilTest'
- Renamed element: 'org.eclipse.mylyn.tests.WebUtilTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'WebClientUtilTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.tests{WebClientUtilTest.java[WebClientUtilTest" matchStrategy="1" name="WebUtilTest" qualified="false" references="true" similarDeclarations="false" stamp="1207126089191" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.UrlConnectionUtilTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tests{UrlConnectionUtilTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207126160878" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..a887461
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1,2 @@
+1207126089191 Rename type 'WebClientUtilTest'
+1207126160878 Delete element
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/4/16/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/4/16/refactorings.history
new file mode 100644
index 0000000..2ba7828
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/4/16/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tests.report'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.tests.report'
- Original element: 'META-INF'" description="Copy folder" destination="=org.eclipse.mylyn.tests.report" element1="META-INF" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208275135028" units="0" version="1.0"/>
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.tests.report'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.tests.report'
- Original element: '.classpath'" description="Copy file" destination="=org.eclipse.mylyn.tests.report" element1=".classpath" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1208275338732" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/4/16/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/4/16/refactorings.index
new file mode 100644
index 0000000..f7ef338
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/4/16/refactorings.index
@@ -0,0 +1,2 @@
+1208275135028 Copy folder
+1208275338732 Copy file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/5/18/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/5/18/refactorings.history
new file mode 100644
index 0000000..02b210f
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/5/18/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original element: 'org.eclipse.mylyn.tests.manual.NoticicationPopupMain.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.tests/src<org.eclipse.mylyn.commons.tests" element1="/src<org.eclipse.mylyn.tests.manual{NoticicationPopupMain.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209611031245" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original element: 'org.eclipse.mylyn.tests.manual.SampleNotificationPopup.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.commons.tests/src<org.eclipse.mylyn.commons.tests" element1="/src<org.eclipse.mylyn.tests.manual{SampleNotificationPopup.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1209611042907" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/5/18/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/5/18/refactorings.index
new file mode 100644
index 0000000..8ea4a76
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/5/18/refactorings.index
@@ -0,0 +1,2 @@
+1209611031245 Move compilation unit
+1209611042907 Move compilation unit
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..cffa54d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.integration.TestingStatusNotifier.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tests.integration{TestingStatusNotifier.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1211321030801" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..e40872f
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1 @@
+1211321030801 Delete element
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/5/22/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/5/22/refactorings.history
new file mode 100644
index 0000000..bea1804
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.integration.ExtensionPointInitializationTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tests.integration{ExtensionPointInitializationTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1212051286381" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/5/22/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/5/22/refactorings.index
new file mode 100644
index 0000000..1c7b8f2
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/5/22/refactorings.index
@@ -0,0 +1 @@
+1212051286381 Delete element
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/6/23/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/6/23/refactorings.history
new file mode 100644
index 0000000..653201d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'templates' from expression 'TasksUiPlugin.getRepositoryTemplateManager().getTemplates(WebRepositoryConnector.REPOSITORY_TYPE)'
- Original project: 'org.eclipse.mylyn.tests'
- Variable name: 'templates'
- Destination method: 'org.eclipse.mylyn.tests.integration.LiveWebConnectorTemplatesTest.suite()'
- Variable expression: 'TasksUiPlugin.getRepositoryTemplateManager().getTemplates(WebRepositoryConnector.REPOSITORY_TYPE)'
- Replace occurrences of expression with variable" description="Extract local variable 'templates'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tests.integration{LiveWebConnectorTemplatesTest.java" name="templates" replace="true" selection="5037 97" stamp="1212712677316" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/6/23/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/6/23/refactorings.index
new file mode 100644
index 0000000..b24dde0
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/6/23/refactorings.index
@@ -0,0 +1 @@
+1212712677316 Extract local variable 'templates'
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/9/38/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/9/38/refactorings.history
new file mode 100644
index 0000000..c1c39a4
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/9/38/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.commons.tests/src/org.eclipse.mylyn.commons.tests'
- Original elements:
 org.eclipse.mylyn.tests.SslProtocolSocketFactoryTest.java
 org.eclipse.mylyn.tests.WebUtilTest.java
 org.eclipse.mylyn.tests.TestProxy.java
- Update references to refactored element" description="Move compilation units" destination="=org.eclipse.mylyn.commons.tests/src<org.eclipse.mylyn.commons.tests" element1="/src<org.eclipse.mylyn.tests{SslProtocolSocketFactoryTest.java" element2="/src<org.eclipse.mylyn.tests{WebUtilTest.java" element3="/src<org.eclipse.mylyn.tests{TestProxy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1221774792147" units="3" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Original element: 'org.eclipse.mylyn.tests.AllCoreTests.java'" description="Delete element" element1="/src<org.eclipse.mylyn.tests{AllCoreTests.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1221774903172" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/9/38/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/9/38/refactorings.index
new file mode 100644
index 0000000..00d143d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/9/38/refactorings.index
@@ -0,0 +1,2 @@
+1221774792147 Move compilation units
+1221774903172 Delete element
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/9/39/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2008/9/39/refactorings.history
new file mode 100644
index 0000000..1bbc126
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/9/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'taskList' from expression 'manager.getTaskList()'
- Original project: 'org.eclipse.mylyn.tests'
- Variable name: 'taskList'
- Destination method: 'org.eclipse.mylyn.tests.integration.TaskListFilterTest.setUp()'
- Variable expression: 'manager.getTaskList()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskList'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.tests.integration{TaskListFilterTest.java" name="taskList" replace="true" selection="2512 21" stamp="1221976921534" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2008/9/39/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2008/9/39/refactorings.index
new file mode 100644
index 0000000..8a2c9a9
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2008/9/39/refactorings.index
@@ -0,0 +1 @@
+1221976921534 Extract local variable 'taskList'
diff --git a/org.eclipse.mylyn.tests/.refactorings/2009/4/15/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2009/4/15/refactorings.history
new file mode 100644
index 0000000..44fde8b
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2009/4/15/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 3 element(s) from project 'org.eclipse.mylyn.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Original elements:
 org.eclipse.mylyn.tests.misc.GetFaviconForUrlTest.java
 org.eclipse.mylyn.tests.misc.HypertextStructureBridgeTest.java
 org.eclipse.mylyn.tests.misc.UrlExclusionTest.java" description="Delete elements" element1="/src<org.eclipse.mylyn.tests.misc{HypertextStructureBridgeTest.java" element2="/src<org.eclipse.mylyn.tests.misc{GetFaviconForUrlTest.java" element3="/src<org.eclipse.mylyn.tests.misc{UrlExclusionTest.java" elements="3" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1239481717474" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ui'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.tasks.tests/src/org.eclipse.mylyn.tasks.tests.ui'
- Original element: 'org.eclipse.mylyn.tests.integration.TaskListFilterTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.tests/src<org.eclipse.mylyn.tasks.tests.ui" element1="/src<org.eclipse.mylyn.tests.integration{TaskListFilterTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1239481809365" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.tests/src/org.eclipse.mylyn.monitor.tests.usage.tests'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: 'org.eclipse.mylyn.monitor.tests/src/org.eclipse.mylyn.monitor.tests.usage.tests'
- Original element: 'org.eclipse.mylyn.tests.integration.DefaultPreferenceConfigTest.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.monitor.tests/src<org.eclipse.mylyn.monitor.tests.usage.tests" element1="/src<org.eclipse.mylyn.tests.integration{DefaultPreferenceConfigTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1239481937993" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2009/4/15/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2009/4/15/refactorings.index
new file mode 100644
index 0000000..60630fa
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2009/4/15/refactorings.index
@@ -0,0 +1,3 @@
+1239481717474 Delete elements
+1239481809365 Move compilation unit
+1239481937993 Move compilation unit
diff --git a/org.eclipse.mylyn.tests/.refactorings/2009/6/26/refactorings.history b/org.eclipse.mylyn.tests/.refactorings/2009/6/26/refactorings.history
new file mode 100644
index 0000000..71a0ea4
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2009/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Copy 6 elements(s) to '.settings'
- Original project: 'org.eclipse.mylyn.tests'
- Destination element: '.settings'
- Original elements:
 org.eclipse.pde.api.tools.prefs
 org.eclipse.mylyn.tasks.ui.prefs
 org.eclipse.jdt.ui.prefs
 org.eclipse.jdt.core.prefs
 org.eclipse.ltk.core.refactoring.prefs
 org.eclipse.pde.prefs" description="Copy files" element1=".settings/org.eclipse.pde.api.tools.prefs" element2=".settings/org.eclipse.mylyn.tasks.ui.prefs" element3=".settings/org.eclipse.jdt.ui.prefs" element4=".settings/org.eclipse.jdt.core.prefs" element5=".settings/org.eclipse.ltk.core.refactoring.prefs" element6=".settings/org.eclipse.pde.prefs" files="6" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1246133304053" target="/org.eclipse.mylyn.tests.ui/.settings" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/.refactorings/2009/6/26/refactorings.index b/org.eclipse.mylyn.tests/.refactorings/2009/6/26/refactorings.index
new file mode 100644
index 0000000..26e24fb
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.refactorings/2009/6/26/refactorings.index
@@ -0,0 +1 @@
+1246133304053 Copy files
diff --git a/org.eclipse.mylyn.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.tests/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 0000000..90b557d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,145 @@
+#Tue Apr 08 17:50:34 PDT 2008
+ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_LEAK=Ignore
+API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
+CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
+ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
+ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Ignore
+ILLEGAL_IMPLEMENT=Ignore
+ILLEGAL_INSTANTIATE=Ignore
+ILLEGAL_OVERRIDE=Ignore
+ILLEGAL_REFERENCE=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
diff --git a/org.eclipse.mylyn.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a4a1ca4
--- /dev/null
+++ b/org.eclipse.mylyn.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Tests
+Bundle-SymbolicName: org.eclipse.mylyn.tests
+Bundle-Version: 0.0.0
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Mylyn
+Export-Package: org.eclipse.mylyn.tests;x-internal:=true,
+ org.eclipse.mylyn.tests.integration;x-internal:=true,
+ org.eclipse.mylyn.tests.misc;x-internal:=true
+Bundle-ClassPath: mylyn-tests.jar
+Require-Bundle: org.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.ui,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.discovery.tests,
+ org.eclipse.mylyn.resources.tests,
+ org.eclipse.mylyn.java.tests,
+ org.eclipse.mylyn.tasks.tests,
+ org.eclipse.mylyn.monitor.tests,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.bugzilla.tests,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.ide.tests,
+ org.eclipse.mylyn.jira.tests,
+ org.eclipse.mylyn.trac.tests,
+ org.eclipse.mylyn.team.tests,
+ org.eclipse.mylyn.xplanner.tests,
+ org.eclipse.mylyn.commons.tests,
+ org.eclipse.mylyn.wikitext.tests
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.tests/about.html b/org.eclipse.mylyn.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests/build.properties b/org.eclipse.mylyn.tests/build.properties
new file mode 100644
index 0000000..36822d4
--- /dev/null
+++ b/org.eclipse.mylyn.tests/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2004, 2006 Mylyn project committers 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
+###############################################################################
+bin.includes = mylyn-tests.jar,\
+ META-INF/,\
+ about.html,\
+ test.xml
+src.includes = about.html
+jars.compile.order = mylyn-tests.jar
+source.mylyn-tests.jar = src/
+output.mylyn-tests.jar = bin/
+jre.compilation.profile = J2SE-1.5
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllConnectorTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllConnectorTests.java
new file mode 100644
index 0000000..d248928
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllConnectorTests.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.bugzilla.tests.AllBugzillaTests;
+import org.eclipse.mylyn.jira.tests.AllJiraTests;
+import org.eclipse.mylyn.trac.tests.AllTracTests;
+import org.eclipse.mylyn.xplanner.tests.AllXPlannerTests;
+
+/**
+ * @author Shawn Minto
+ */
+public class AllConnectorTests {
+
+ public static Test suite() {
+ // the order of these tests might still matter, but shouldn't
+ TestSuite suite = new TestSuite("All Connector Tests for org.eclipse.mylyn.tests");
+ suite.addTest(AllBugzillaTests.suite());
+ suite.addTest(AllJiraTests.suite());
+ suite.addTest(AllTracTests.suite());
+ suite.addTest(AllXPlannerTests.suite());
+ return suite;
+ }
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllHeadlessStandaloneTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllHeadlessStandaloneTests.java
new file mode 100644
index 0000000..65a303f
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllHeadlessStandaloneTests.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.commons.tests.net.SslProtocolSocketFactoryTest;
+import org.eclipse.mylyn.commons.tests.net.WebUtilTest;
+import org.eclipse.mylyn.discovery.tests.AllDiscoveryTests;
+import org.eclipse.mylyn.jira.tests.AllJiraHeadlessStandaloneTests;
+import org.eclipse.mylyn.tasks.tests.TaskListTest;
+import org.eclipse.mylyn.tasks.tests.TasksUtilTest;
+import org.eclipse.mylyn.tasks.tests.core.ITasksCoreConstantsTest;
+import org.eclipse.mylyn.tasks.tests.core.TaskListUnmatchedContainerTest;
+import org.eclipse.mylyn.tasks.tests.core.TaskRepositoryLocationTest;
+import org.eclipse.mylyn.trac.tests.AllTracHeadlessStandaloneTests;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllHeadlessStandaloneTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Tests not requiring Eclipse Workbench");
+
+ // commons
+ suite.addTestSuite(WebUtilTest.class);
+ suite.addTestSuite(SslProtocolSocketFactoryTest.class);
+
+ // context
+ // disabled due to failure: bug 257972
+// suite.addTestSuite(ContextExternalizerTest.class);
+// suite.addTestSuite(DegreeOfInterestTest.class);
+// suite.addTestSuite(ContextTest.class);
+
+ // discovery
+ suite.addTest(AllDiscoveryTests.suite());
+
+ // tasks
+ suite.addTestSuite(TaskListTest.class);
+ suite.addTestSuite(TaskListUnmatchedContainerTest.class);
+ suite.addTestSuite(TasksUtilTest.class);
+ suite.addTestSuite(ITasksCoreConstantsTest.class);
+ suite.addTestSuite(TaskRepositoryLocationTest.class);
+
+ // wikitext
+ suite.addTest(org.eclipse.mylyn.wikitext.tests.HeadlessStandaloneTests.suite());
+
+ // trac
+ suite.addTest(AllTracHeadlessStandaloneTests.suite());
+
+ // jira
+ suite.addTest(AllJiraHeadlessStandaloneTests.suite());
+
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllNonConnectorTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllNonConnectorTests.java
new file mode 100644
index 0000000..cc6c7b1
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllNonConnectorTests.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.commons.tests.AllCommonsTests;
+import org.eclipse.mylyn.context.tests.AllContextTests;
+import org.eclipse.mylyn.discovery.tests.AllDiscoveryTests;
+import org.eclipse.mylyn.ide.tests.AllIdeTests;
+import org.eclipse.mylyn.java.tests.AllJavaTests;
+import org.eclipse.mylyn.monitor.tests.AllMonitorTests;
+import org.eclipse.mylyn.resources.tests.AllResourcesTests;
+import org.eclipse.mylyn.tasks.tests.AllTasksTests;
+import org.eclipse.mylyn.team.tests.AllTeamTests;
+import org.eclipse.mylyn.tests.integration.AllIntegrationTests;
+import org.eclipse.mylyn.tests.misc.AllMiscTests;
+
+/**
+ * @author Shawn Minto
+ */
+public class AllNonConnectorTests {
+
+ public static Test suite() {
+ // the order of these tests might still matter, but shouldn't
+ TestSuite suite = new TestSuite("All Non-Connector Tests for org.eclipse.mylyn.tests");
+ suite.addTest(AllCommonsTests.suite());
+ suite.addTest(AllContextTests.suite());
+ suite.addTest(AllDiscoveryTests.suite());
+ suite.addTest(AllJavaTests.suite());
+ suite.addTest(AllMonitorTests.suite());
+ suite.addTest(AllIntegrationTests.suite());
+ suite.addTest(AllIdeTests.suite());
+ suite.addTest(AllTasksTests.suite());
+ suite.addTest(AllResourcesTests.suite());
+ suite.addTest(AllTeamTests.suite());
+ suite.addTest(AllMiscTests.suite());
+ suite.addTest(org.eclipse.mylyn.wikitext.tests.HeadlessTests.suite());
+ return suite;
+ }
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllPerformanceTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllPerformanceTests.java
new file mode 100644
index 0000000..2a447e1
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllPerformanceTests.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.tasks.tests.AllTasksPerformanceTests;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AllPerformanceTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Performance tests for org.eclipse.mylyn.tests");
+ suite.addTest(AllTasksPerformanceTests.suite());
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllTests.java
new file mode 100644
index 0000000..ec9dd33
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/AllTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Tests for org.eclipse.mylyn.tests");
+ suite.addTest(AllNonConnectorTests.suite());
+ suite.addTest(AllConnectorTests.suite());
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/AllIntegrationTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/AllIntegrationTests.java
new file mode 100644
index 0000000..fb185d0
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/AllIntegrationTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests.integration;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllIntegrationTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.tests.integration");
+ suite.addTestSuite(ChangeDataDirTest.class);
+ suite.addTest(RepositoryConnectorsTest.suite());
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/ChangeDataDirTest.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/ChangeDataDirTest.java
new file mode 100644
index 0000000..ddfb9a9
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/ChangeDataDirTest.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests.integration;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.mylyn.commons.tests.support.CommonsTestUtil;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.TaskList;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+
+/**
+ * Tests changes to the main data directory location.
+ *
+ * @author Wesley Coelho
+ * @author Mik Kersten (rewrites)
+ */
+public class ChangeDataDirTest extends TestCase {
+
+ private String newDataDir;
+
+ private String defaultDir;
+
+ private TaskList taskList;
+
+ @Override
+ protected void setUp() throws Exception {
+ defaultDir = TasksUiPlugin.getDefault().getDefaultDataDirectory();
+
+ newDataDir = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + '/'
+ + ChangeDataDirTest.class.getSimpleName();
+ File dir = new File(newDataDir);
+
+ dir.mkdir();
+ dir.deleteOnExit();
+
+ taskList = TasksUiPlugin.getTaskList();
+
+ TaskTestUtil.resetTaskList();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ TaskTestUtil.resetTaskList();
+ TasksUiPlugin.getDefault().setDataDirectory(defaultDir);
+ }
+
+ public void testDefaultDataDirectoryMove() throws Exception {
+ String workspaceRelativeDir = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + '/'
+ + ".metadata" + '/' + ".mylyn";
+ assertEquals(defaultDir, workspaceRelativeDir);
+
+ TasksUiPlugin.getDefault().setDataDirectory(newDataDir);
+ assertEquals(newDataDir, TasksUiPlugin.getDefault().getDataDirectory());
+ assertEquals(newDataDir, TasksUiPlugin.getTaskDataManager().getDataPath());
+ assertEquals(new File(newDataDir, "contexts"), ContextCorePlugin.getContextStore().getContextDirectory());
+
+ }
+
+ public void testTaskMove() throws Exception {
+ AbstractTask task = TasksUiInternal.createNewLocalTask("label");
+ String handle = task.getHandleIdentifier();
+ taskList.addTask(task, taskList.getUnmatchedContainer(LocalRepositoryConnector.REPOSITORY_URL));
+
+ ITask readTaskBeforeMove = taskList.getTask(handle);
+ assertNotNull(readTaskBeforeMove);
+ assertTrue(taskList.getAllTasks().size() > 0);
+ CommonsTestUtil.copyFolder(new File(TasksUiPlugin.getDefault().getDataDirectory()), new File(newDataDir));
+ TasksUiPlugin.getDefault().setDataDirectory(newDataDir);
+ assertTrue(taskList.getAllTasks().size() > 0);
+ ITask readTaskAfterMove = taskList.getTask(handle);
+
+ assertNotNull(readTaskAfterMove);
+ assertEquals(readTaskBeforeMove.getCreationDate(), readTaskAfterMove.getCreationDate());
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/RepositoryConnectorsTest.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/RepositoryConnectorsTest.java
new file mode 100644
index 0000000..795d278
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/integration/RepositoryConnectorsTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests.integration;
+
+import junit.extensions.ActiveTestSuite;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * Test harness for iterating over all connectors and performing a test.
+ *
+ * @author Eugene Kuleshov
+ */
+public class RepositoryConnectorsTest extends TestCase {
+
+ private final AbstractRepositoryConnector connector;
+
+ public RepositoryConnectorsTest(AbstractRepositoryConnector connector) {
+ super("testRepositoryConnector");
+ this.connector = connector;
+ }
+
+ public void testRepositoryConnector() {
+ assertNotNull(connector.getConnectorKind());
+ // add bulk connector tests here...
+ }
+
+ public static TestSuite suite() {
+ TestSuite suite = new ActiveTestSuite(RepositoryConnectorsTest.class.getName());
+
+ for (AbstractRepositoryConnector repositoryConnector : TasksUi.getRepositoryManager().getRepositoryConnectors()) {
+ suite.addTest(new RepositoryConnectorsTest(repositoryConnector));
+ }
+
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/misc/AllMiscTests.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/misc/AllMiscTests.java
new file mode 100644
index 0000000..b2c946d
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/misc/AllMiscTests.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests.misc;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Mik Kersten
+ */
+public class AllMiscTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.tests");
+ suite.addTestSuite(AssertionsEnabledTest.class);
+ return suite;
+ }
+
+}
diff --git a/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/misc/AssertionsEnabledTest.java b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/misc/AssertionsEnabledTest.java
new file mode 100644
index 0000000..17921fd
--- /dev/null
+++ b/org.eclipse.mylyn.tests/src/org/eclipse/mylyn/tests/misc/AssertionsEnabledTest.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.tests.misc;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Mik Kersten
+ */
+public class AssertionsEnabledTest extends TestCase {
+
+ public AssertionsEnabledTest(String name) {
+ super(name);
+ }
+
+ public void testAssertionsEnabled() {
+ try {
+ assert false;
+ fail("run all test with assertions: \"java -enableassertions\"");
+ } catch (AssertionError e) {
+ // Oasswertions enabled
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.tests/test.xml b/org.eclipse.mylyn.tests/test.xml
new file mode 100644
index 0000000..ae08ac7
--- /dev/null
+++ b/org.eclipse.mylyn.tests/test.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="testsuite" default="run" basedir=".">
+ <!-- The property ${eclipse-home} should be passed into this script -->
+ <!-- Set a meaningful default value for when it is not. -->
+ <property name="eclipse-home" value="${basedir}/../.."/>
+
+ <!-- sets the properties eclipse-home, and library-file -->
+ <property name="plugin-name" value="org.eclipse.mylyn.tests"/>
+ <property name="library-file"
+ value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
+
+ <!-- This target holds all initialization code that needs to be done for -->
+ <!-- all tests that are to be run. Initialization for individual tests -->
+ <!-- should be done within the body of the suite target. -->
+ <target name="init">
+ <tstamp/>
+ <delete>
+ <fileset dir="${eclipse-home}" includes="org*.xml"/>
+ </delete>
+ </target>
+
+ <!-- This target defines the tests that need to be run. -->
+ <target name="suite">
+ <property name="mylyn-folder"
+ value="${eclipse-home}/mylyn_folder"/>
+ <delete dir="${mylyn-folder}" quiet="true"/>
+
+ <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
+ <property name="data-dir" value="${mylyn-folder}"/>
+ <property name="plugin-name" value="${plugin-name}"/>
+ <property name="classname" value="org.eclipse.mylyn.tests.AllTests"/>
+ </ant>
+ </target>
+
+ <!-- This target holds code to cleanup the testing environment after -->
+ <!-- after all of the tests have been run. You can use this target to -->
+ <!-- delete temporary files that have been created. -->
+ <target name="cleanup">
+ </target>
+
+ <!-- This target runs the test suite. Any actions that need to happen -->
+ <!-- after all the tests have been run should go here. -->
+ <target name="run" depends="init,suite,cleanup">
+ <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+ <property name="includes" value="org*.xml"/>
+ <property name="output-file" value="${plugin-name}.xml"/>
+ </ant>
+ </target>
+
+ <!-- performance test target -->
+ <target name="performance-suite">
+ <property name="plugin-name" value="${plugin-name}"/>
+ <property name="mylyn-folder"
+ value="${eclipse-home}/mylyn_folder"/>
+ <delete dir="${mylyn-folder}" quiet="true"/>
+ <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
+ <property name="data-dir" value="${mylyn-folder}"/>
+ <property name="plugin-name" value="${plugin-name}"/>
+ <property name="classname" value="org.eclipse.mylyn.tests.AllPerformanceTests"/>
+ </ant>
+ </target>
+
+ <!-- This target runs the performance test suites. -->
+ <target name="performance" depends="init,performance-suite,cleanup">
+ <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+ <property name="includes" value="org*.xml"/>
+ <property name="output-file" value="${plugin-name}.xml"/>
+ </ant>
+ </target>
+</project>
diff --git a/org.eclipse.mylyn.trac-feature/.project b/org.eclipse.mylyn.trac-feature/.project
new file mode 100644
index 0000000..e5f4bfb
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.trac-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f1554b1
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..47ada17
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:12:59 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.trac-feature/about.html b/org.eclipse.mylyn.trac-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac-feature/build.properties b/org.eclipse.mylyn.trac-feature/build.properties
new file mode 100644
index 0000000..87834ea
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ about.html,\
+ epl-v10.html,\
+ license.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.trac-feature/epl-v10.html b/org.eclipse.mylyn.trac-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac-feature/feature.properties b/org.eclipse.mylyn.trac-feature/feature.properties
new file mode 100644
index 0000000..7da6723
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Connector: Trac
+description=Provides Task List integration, offline support and rich editing for the open source Trac issue tracker.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn Extras for Eclipse 3.3 and 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.trac-feature/feature.xml b/org.eclipse.mylyn.trac-feature/feature.xml
new file mode 100644
index 0000000..cc6ded9
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/feature.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.trac_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://trac.edgewall.org">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/extras"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.net" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.context.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.apache.xmlrpc" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.osgi"/>
+ <import plugin="org.apache.commons.httpclient"/>
+ <import feature="org.eclipse.mylyn_feature" version="3.2.0.I20090531" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.trac.ui"
+ download-size="0"
+ install-size="0"
+ version="3.2.1.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.trac.core"
+ download-size="0"
+ install-size="0"
+ version="3.2.1.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.xmlrpc"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.ws.commons.util"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="javax.xml.bind"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.trac-feature/license.html b/org.eclipse.mylyn.trac-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.trac-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.trac.core/.classpath b/org.eclipse.mylyn.trac.core/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.trac.core/.cvsignore b/org.eclipse.mylyn.trac.core/.cvsignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.cvsignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.options b/org.eclipse.mylyn.trac.core/.options
new file mode 100644
index 0000000..62ffe2e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.options
@@ -0,0 +1,6 @@
+
+# TracXmlRpcClient
+org.eclipse.mylyn.trac.core/debug/xmlrpc=false
+
+# AbstractTracClient
+org.eclipse.mylyn.trac.core/debug/authentication=false
diff --git a/org.eclipse.mylyn.trac.core/.project b/org.eclipse.mylyn.trac.core/.project
new file mode 100644
index 0000000..831876d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.trac.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/10/44/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2006/10/44/refactorings.history
new file mode 100644
index 0000000..d781eb0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/10/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Original elements: org.eclipse.mylar.internal.trac.core.TracXmlRpcClient.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.internal.trac.core{TracXmlRpcClient.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1162337113843" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/10/44/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2006/10/44/refactorings.index
new file mode 100644
index 0000000..a9c753b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/10/44/refactorings.index
@@ -0,0 +1 @@
+1162337113843 Infer generic type arguments
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..064ee50
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.core.TracRepositoryConnector.isInternalAttribute(...)' to 'org.eclipse.mylar.internal.trac.core.TracAttributeFactory' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracRepositoryConnector.isInternalAttribute(...)' - Destination type: 'org.eclipse.mylar.internal.trac.core.TracAttributeFactory'" delegate="false" deprecate="true" description="Move member 'isInternalAttribute'" element1="/src<org.eclipse.mylar.internal.trac.core{TracRepositoryConnector.java[TracRepositoryConnector~isInternalAttribute~QString;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.trac.core{TracAttributeFactory.java[TracAttributeFactory" stamp="1163565816357" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..f113574
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1 @@
+1163565816357 Move member 'isInternalAttribute'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/11/47/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/47/refactorings.history
new file mode 100644
index 0000000..40f653d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/47/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.trac.core.AbstractTracClient.AbstractTracClient(URL repositoryUrl, Version version, String username, String password)' to 'public AbstractTracClient(URL repositoryUrl, Version version, String username, String password, Proxy proxy)' - Original project: 'org.eclipse.mylar.trac.core' - Added parameters: Proxy proxy" default5="null" delegate="false" deprecate="true" description="Change method 'AbstractTracClient'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.trac.core{AbstractTracClient.java[AbstractTracClient~AbstractTracClient~QURL;~QVersion;~QString;~QString;" name="AbstractTracClient" parameter1="URL repositoryUrl 0 URL repositoryUrl false" parameter2="Version version 1 Version version false" parameter3="String username 2 String username false" parameter4="String password 3 String password false" parameter5="Object newParam -1 Proxy proxy false" stamp="1164173490737" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/11/47/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/47/refactorings.index
new file mode 100644
index 0000000..172644e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/11/47/refactorings.index
@@ -0,0 +1 @@
+1164173490737 Change method 'AbstractTracClient'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..ad42b9c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracQueryHit.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.trac.core" element1="/src<org.eclipse.mylar.internal.trac.core{TracQueryHit.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461370171" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracRepositoryQuery.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylar.trac.core" element1="/src<org.eclipse.mylar.internal.trac.core{TracRepositoryQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461397031" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.internal.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.internal.trac.core' - Original elements: org.eclipse.mylar.trac.core.TracRepositoryQuery.java org.eclipse.mylar.trac.core.TracQueryHit.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.trac.core" element1="/src<org.eclipse.mylar.trac.core{TracRepositoryQuery.java" element2="/src<org.eclipse.mylar.trac.core{TracQueryHit.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1165461462171" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.trac.core'" description="Delete element" element1="/src<org.eclipse.mylar.trac.core" element2="/src<org.eclipse.mylar.trac" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1165461533593" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..8d9268c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1,4 @@
+1165461370171 Move compilation unit
+1165461397031 Move compilation unit
+1165461462171 Move compilation units
+1165461533593 Delete element
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..f727fff
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'empty.txt'" description="Delete element" element1="src/empty.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1156349223375" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..025e371
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1 @@
+1156349223375 Delete element
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/8/35/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/35/refactorings.history
new file mode 100644
index 0000000..c703a27
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/35/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.trac.model' to 'org.eclipse.mylar.internal.trac.core.model' - Original element: 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.internal.trac.model' - Renamed element: 'org.eclipse.mylar.trac.core/src/org.eclipse.mylar.internal.trac.core.model' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylar.internal.trac.model'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.trac.model" name="org.eclipse.mylar.internal.trac.core.model" qualified="false" references="true" stamp="1156881242305" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2006/8/35/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/35/refactorings.index
new file mode 100644
index 0000000..7981cf7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2006/8/35/refactorings.index
@@ -0,0 +1 @@
+1156881242305 Rename package 'org.eclipse.mylar.internal.trac.model'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/1/3/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/1/3/refactorings.history
new file mode 100644
index 0000000..dc59dd6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/1/3/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.core.TracOfflineTaskHandler' to 'TracTaskDataHandler' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracOfflineTaskHandler' - Renamed element: 'org.eclipse.mylar.internal.trac.core.TracTaskDataHandler' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracOfflineTaskHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.core{TracOfflineTaskHandler.java[TracOfflineTaskHandler" matchStrategy="1" name="TracTaskDataHandler" qualified="false" references="true" similarDeclarations="false" stamp="1168847087614" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/1/3/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/1/3/refactorings.index
new file mode 100644
index 0000000..6a3f947
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/1/3/refactorings.index
@@ -0,0 +1 @@
+1168847087614 Rename type 'TracOfflineTaskHandler'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..7fa6721
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.core.ITracClient.CONNNECT_TIMEOUT' to 'org.eclipse.mylar.core.net.WebClientUtil' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.ITracClient.CONNNECT_TIMEOUT' - Destination type: 'org.eclipse.mylar.core.net.WebClientUtil'" delegate="false" deprecate="false" description="Move member 'CONNNECT_TIMEOUT'" element1="/src<org.eclipse.mylar.internal.trac.core{ITracClient.java[ITracClient^CONNNECT_TIMEOUT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.core.net{WebClientUtil.java[WebClientUtil" stamp="1171926013187" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.core.ITracClient.SOCKET_TIMEOUT' to 'org.eclipse.mylar.core.net.WebClientUtil' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.ITracClient.SOCKET_TIMEOUT' - Destination type: 'org.eclipse.mylar.core.net.WebClientUtil'" delegate="false" deprecate="false" description="Move member 'SOCKET_TIMEOUT'" element1="/src<org.eclipse.mylar.internal.trac.core{ITracClient.java[ITracClient^SOCKET_TIMEOUT" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.core.net{WebClientUtil.java[WebClientUtil" stamp="1171926020640" version="1.0"/>
+<refactoring comment="Extract method 'private void addResolutionAndStatus()' from 'org.eclipse.mylar.internal.trac.core.Trac09Client.updateAttributesFromNewTicketPage()' to 'org.eclipse.mylar.internal.trac.core.Trac09Client' - Original project: 'org.eclipse.mylar.trac.core' - Method name: 'addResolutionAndStatus' - Destination type: 'org.eclipse.mylar.internal.trac.core.Trac09Client' - Declared visibility: 'private'" comments="false" description="Extract method 'addResolutionAndStatus'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.trac.core{Trac09Client.java" name="addResolutionAndStatus" replace="false" selection="15514 731" stamp="1172173008053" version="1.0" visibility="2"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.core.Trac09Client' to 'TracWebClient' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.Trac09Client' - Renamed element: 'org.eclipse.mylar.internal.trac.core.TracWebClient' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Trac09Client'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.core{Trac09Client.java[Trac09Client" matchStrategy="1" name="TracWebClient" qualified="false" references="true" similarDeclarations="false" stamp="1172195006824" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..68b1f81
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,4 @@
+1171926013187 Move member 'CONNNECT_TIMEOUT'
+1171926020640 Move member 'SOCKET_TIMEOUT'
+1172173008053 Extract method 'addResolutionAndStatus'
+1172195006824 Rename type 'Trac09Client'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/5/19/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/19/refactorings.history
new file mode 100644
index 0000000..17c050c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/19/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.ui' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.jira.ui/src/org.eclipse.mylar.internal.jira.ui' - Original element: 'org.eclipse.mylar.internal.trac.core.TracAttachmentHandler.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.jira.ui" element1="/src<org.eclipse.mylar.internal.trac.core{TracAttachmentHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.trac.core{TracAttachmentHandler.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1178414109265" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracStatus.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.internal.trac.core{TracStatus.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.trac.core{TracStatus.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1178500209747" units="1" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracStatus.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.internal.trac.core{TracStatus.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.trac.core{TracStatus.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1178500223981" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/5/19/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/19/refactorings.index
new file mode 100644
index 0000000..811728c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/19/refactorings.index
@@ -0,0 +1,3 @@
+1178414109265 Copy compilation unit
+1178500209747 Copy compilation unit
+1178500223981 Copy compilation unit
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..b5f19c6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar.trac.core' - Original element: 'org.eclipse.mylar.internal.trac.core.TracQueryHit.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.trac.core{TracQueryHit.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180567644015" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..aad00d1
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1 @@
+1180567644015 Delete element
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..2fec8fd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar.trac.core' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.tasks.core' - Original element: 'org.eclipse.mylar.internal.trac.core.AbstractAttachmentHandler.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.tasks.core" element1="/src<org.eclipse.mylar.internal.trac.core{AbstractAttachmentHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1180840732709" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..685a6a9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1 @@
+1180840732709 Move compilation unit
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..4708bca
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.TracTask.getMylarPriority(...)' to 'getMylynPriority' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.TracTask.getMylarPriority(...)' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracTask.getMylynPriority(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMylarPriority'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask~getMylarPriority~QString;" name="getMylynPriority" references="true" stamp="1184026217068" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..5921c99
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184026217068 Rename method 'getMylarPriority'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/7/31/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/31/refactorings.history
new file mode 100644
index 0000000..149def8
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/31/refactorings.history
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.validateWikiRPCAPI()' to 'validateWikiRpcApi' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.validateWikiRPCAPI()' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.validateWikiRpcApi()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'validateWikiRPCAPI'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~validateWikiRPCAPI" name="validateWikiRpcApi" references="true" stamp="1185733447073" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHTML(...)' to 'getWikiPageHtml' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHTML(...)' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHtml(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getWikiPageHTML'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageHTML~QString;" name="getWikiPageHtml" references="true" stamp="1185733490800" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHTML(...)' to 'getWikiPageHtml' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHTML(...)' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHtml(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getWikiPageHTML'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageHTML~QString;~I" name="getWikiPageHtml" references="true" stamp="1185733508788" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageAttachment(...)' to 'getWikiPageAttachmentData' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageAttachment(...)' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageAttachmentData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getWikiPageAttachment'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageAttachment~QString;" name="getWikiPageAttachmentData" references="true" stamp="1185735313183" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachment(...)' to 'putWikiPageAttachmentData' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachment(...)' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachmentData(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'putWikiPageAttachment'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~putWikiPageAttachment~QString;~QInputStream;" name="putWikiPageAttachmentData" references="true" stamp="1185735371248" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachmentEx(...)' to 'putWikiPageAttachmentDataEx' - Original project: 'org.eclipse.mylyn.trac.core' - Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachmentEx(...)' - Renamed element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachmentDataEx(...)' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'putWikiPageAttachmentEx'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~putWikiPageAttachmentEx~QString;~QString;~QString;~QInputStream;~Z" name="putWikiPageAttachmentDataEx" references="true" stamp="1185735741186" version="1.0"/>
+<refactoring comment="Change method 'public List<TracWikiPageInfo> org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfoAllVersions(String pageName) throws TracException' to 'public TracWikiPageInfo[] getWikiPageInfoAllVersions(String pageName) throws TracException' - Original project: 'org.eclipse.mylyn.trac.core' - New return type: 'TracWikiPageInfo[]'" delegate="false" deprecate="true" description="Change method 'getWikiPageInfoAllVersions'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageInfoAllVersions~QString;" kind1="0" name="getWikiPageInfoAllVersions" parameter1="String pageName 0 String pageName false" return="TracWikiPageInfo[]" stamp="1185894985395" version="1.0"/>
+<refactoring comment="Change method 'public List<TracWikiPageInfo> org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getRecentWikiChanges(Date since) throws TracException' to 'public TracWikiPageInfo[] getRecentWikiChanges(Date since) throws TracException' - Original project: 'org.eclipse.mylyn.trac.core' - New return type: 'TracWikiPageInfo[]'" delegate="false" deprecate="true" description="Change method 'getRecentWikiChanges'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getRecentWikiChanges~QDate;" kind1="0" name="getRecentWikiChanges" parameter1="Date since 0 Date since false" return="TracWikiPageInfo[]" stamp="1185895277074" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2007/7/31/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/31/refactorings.index
new file mode 100644
index 0000000..6fb3d31
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2007/7/31/refactorings.index
@@ -0,0 +1,8 @@
+1185733447073 Rename method 'validateWikiRPCAPI'
+1185733490800 Rename method 'getWikiPageHTML'
+1185733508788 Rename method 'getWikiPageHTML'
+1185735313183 Rename method 'getWikiPageAttachment'
+1185735371248 Rename method 'putWikiPageAttachment'
+1185735741186 Rename method 'putWikiPageAttachmentEx'
+1185894985395 Change method 'getWikiPageInfoAllVersions'
+1185895277074 Change method 'getRecentWikiChanges'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/1/4/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/1/4/refactorings.history
new file mode 100644
index 0000000..1c16dcd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/1/4/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.TracTask.getMylynPriority(...)' to 'getTaskPriority'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTask.getMylynPriority(...)'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracTask.getTaskPriority(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getMylynPriority'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask~getMylynPriority~QString;" name="getTaskPriority" references="true" stamp="1201408679912" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/1/4/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/1/4/refactorings.index
new file mode 100644
index 0000000..181cb59
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/1/4/refactorings.index
@@ -0,0 +1 @@
+1201408679912 Rename method 'getMylynPriority'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/10/42/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/10/42/refactorings.history
new file mode 100644
index 0000000..860c536
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/10/42/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.util.HttpRequestInterceptor' to 'HttpMethodInterceptor'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.util.HttpRequestInterceptor'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.util.HttpMethodInterceptor'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'HttpRequestInterceptor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core.util{HttpRequestInterceptor.java[HttpRequestInterceptor" matchStrategy="1" name="HttpMethodInterceptor" qualified="false" references="true" similarDeclarations="false" stamp="1223929128406" textual="false" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.util.HttpMethodInterceptor.process(...)' to 'processRequest'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.util.HttpMethodInterceptor.process(...)'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.util.HttpMethodInterceptor.processRequest(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'process'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core.util{HttpMethodInterceptor.java[HttpMethodInterceptor~process~QHttpMethod;" name="processRequest" references="true" stamp="1223929141059" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/10/42/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/10/42/refactorings.index
new file mode 100644
index 0000000..41c3d06
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/10/42/refactorings.index
@@ -0,0 +1,2 @@
+1223929128406 Rename type 'HttpRequestInterceptor'
+1223929141059 Rename method 'process'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..9bfa9d9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Change method 'InputStream org.eclipse.mylyn.internal.trac.core.ITracClient.getAttachmentData(int ticketId, String filename) throws TracException' to 'public InputStream getAttachmentData(int ticketId, String filename, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.getAttachmentData(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'getAttachmentData'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~getAttachmentData~I~QString;" kind1="0" name="getAttachmentData" parameter1="int ticketId 0 int ticketId false" parameter2="String filename 1 String filename false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393359214" version="1.0"/>
<refactoring comment="Change method 'void org.eclipse.mylyn.internal.trac.core.ITracClient.putAttachmentData(int ticketId, String name, String description, InputStream source) throws TracException' to 'public void putAttachmentData(int ticketId, String name, String description, InputStream source, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.putAttachmentData(...)'
- Added parameters:
 IProgressMonitor monitor" default5="null" delegate="false" deprecate="true" description="Change method 'putAttachmentData'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~putAttachmentData~I~QString;~QString;~QInputStream;" kind1="0" name="putAttachmentData" parameter1="int ticketId 0 int ticketId false" parameter2="String name 1 String name false" parameter3="String description 2 String description false" parameter4="InputStream source 3 InputStream source false" parameter5="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393377710" version="1.0"/>
<refactoring comment="Change method 'void org.eclipse.mylyn.internal.trac.core.ITracClient.deleteAttachment(int ticketId, String filename) throws TracException' to 'public void deleteAttachment(int ticketId, String filename, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.deleteAttachment(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'deleteAttachment'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~deleteAttachment~I~QString;" kind1="0" name="deleteAttachment" parameter1="int ticketId 0 int ticketId false" parameter2="String filename 1 String filename false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393395882" version="1.0"/>
<refactoring comment="Change method 'int org.eclipse.mylyn.internal.trac.core.ITracClient.createTicket(TracTicket ticket) throws TracException' to 'public int createTicket(TracTicket ticket, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.createTicket(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'createTicket'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~createTicket~QTracTicket;" kind1="0" name="createTicket" parameter1="TracTicket ticket 0 TracTicket ticket false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393413273" version="1.0"/>
<refactoring comment="Change method 'void org.eclipse.mylyn.internal.trac.core.ITracClient.updateTicket(TracTicket ticket, String comment) throws TracException' to 'public void updateTicket(TracTicket ticket, String comment, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.updateTicket(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'updateTicket'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~updateTicket~QTracTicket;~QString;" kind1="0" name="updateTicket" parameter1="TracTicket ticket 0 TracTicket ticket false" parameter2="String comment 1 String comment false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393429740" version="1.0"/>
<refactoring comment="Change method 'Set<Integer> org.eclipse.mylyn.internal.trac.core.ITracClient.getChangedTickets(Date since) throws TracException' to 'public Set<Integer> getChangedTickets(Date since, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.getChangedTickets(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getChangedTickets'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~getChangedTickets~QDate;" kind1="0" name="getChangedTickets" parameter1="Date since 0 Date since false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393448924" version="1.0"/>
<refactoring comment="Change method 'Date org.eclipse.mylyn.internal.trac.core.ITracClient.getTicketLastChanged(Integer id) throws TracException' to 'public Date getTicketLastChanged(Integer id, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.getTicketLastChanged(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getTicketLastChanged'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~getTicketLastChanged~QInteger;" kind1="0" name="getTicketLastChanged" parameter1="Integer id 0 Integer id false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393462468" version="1.0"/>
<refactoring comment="Change method 'void org.eclipse.mylyn.internal.trac.core.ITracClient.search(TracSearch query, List<TracTicket> result) throws TracException' to 'public void search(TracSearch query, List<TracTicket> result, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.search(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'search'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~search~QTracSearch;~QList\<QTracTicket;>;" kind1="0" name="search" parameter1="TracSearch query 0 TracSearch query false" parameter2="List<TracTicket> result 1 List<TracTicket> result false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393487450" version="1.0"/>
<refactoring comment="Change method 'TracTicket org.eclipse.mylyn.internal.trac.core.ITracClient.getTicket(int id) throws TracException' to 'public TracTicket getTicket(int id, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracClient.getTicket(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getTicket'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java[ITracClient~getTicket~I" kind1="0" name="getTicket" parameter1="int id 0 int id false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207393502083" version="1.0"/>
<refactoring comment="Change method 'public String org.eclipse.mylyn.internal.trac.core.ITracWikiClient.wikiToHtml(String sourceText) throws TracException' to 'public String wikiToHtml(String sourceText, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.wikiToHtml(...)'
- Added parameters:
 org.eclipse.core.runtime.IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'wikiToHtml'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~wikiToHtml~QString;" kind1="0" name="wikiToHtml" parameter1="String sourceText 0 String sourceText false" parameter2="{added} {added} -1 org.eclipse.core.runtime.IProgressMonitor monitor false" stamp="1207394025338" version="1.0"/>
<refactoring comment="Change method 'public void org.eclipse.mylyn.internal.trac.core.ITracWikiClient.validateWikiRpcApi() throws TracException' to 'public void validateWikiRpcApi(IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.validateWikiRpcApi()'
- Added parameters:
 IProgressMonitor monitor" default1="null" delegate="false" deprecate="true" description="Change method 'validateWikiRpcApi'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~validateWikiRpcApi" kind1="0" name="validateWikiRpcApi" parameter1="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394043125" version="1.0"/>
<refactoring comment="Change method 'public String[] org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getAllWikiPageNames() throws TracException' to 'public String[] getAllWikiPageNames(IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getAllWikiPageNames()'
- Added parameters:
 IProgressMonitor monitor" default1="null" delegate="false" deprecate="true" description="Change method 'getAllWikiPageNames'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getAllWikiPageNames" kind1="0" name="getAllWikiPageNames" parameter1="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394062946" version="1.0"/>
<refactoring comment="Change method 'public TracWikiPage org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPage(String pageName) throws TracException' to 'public TracWikiPage getWikiPage(String pageName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPage(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getWikiPage'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPage~QString;" kind1="0" name="getWikiPage" parameter1="String pageName 0 String pageName false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394074138" version="1.0"/>
<refactoring comment="Change method 'public TracWikiPage org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPage(String pageName, int version) throws TracException' to 'public TracWikiPage getWikiPage(String pageName, int version, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPage(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'getWikiPage'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPage~QString;~I" kind1="0" name="getWikiPage" parameter1="String pageName 0 String pageName false" parameter2="int version 1 int version false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394086880" version="1.0"/>
<refactoring comment="Change method 'public TracWikiPageInfo org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfo(String pageName) throws TracException' to 'public TracWikiPageInfo getWikiPageInfo(String pageName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfo(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getWikiPageInfo'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageInfo~QString;" kind1="0" name="getWikiPageInfo" parameter1="String pageName 0 String pageName false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394097030" version="1.0"/>
<refactoring comment="Change method 'public TracWikiPageInfo org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfo(String pageName, int version) throws TracException' to 'public TracWikiPageInfo getWikiPageInfo(String pageName, int version, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfo(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'getWikiPageInfo'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageInfo~QString;~I" kind1="0" name="getWikiPageInfo" parameter1="String pageName 0 String pageName false" parameter2="int version 1 int version false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394107322" version="1.0"/>
<refactoring comment="Change method 'public TracWikiPageInfo[] org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfoAllVersions(String pageName) throws TracException' to 'public TracWikiPageInfo[] getWikiPageInfoAllVersions(String pageName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageInfoAllVersions(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getWikiPageInfoAllVersions'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageInfoAllVersions~QString;" kind1="0" name="getWikiPageInfoAllVersions" parameter1="String pageName 0 String pageName false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394122691" version="1.0"/>
<refactoring comment="Change method 'public String org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageContent(String pageName) throws TracException' to 'public String getWikiPageContent(String pageName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageContent(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getWikiPageContent'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageContent~QString;" kind1="0" name="getWikiPageContent" parameter1="String pageName 0 String pageName false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394133645" version="1.0"/>
<refactoring comment="Change method 'public String org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageContent(String pageName, int version) throws TracException' to 'public String getWikiPageContent(String pageName, int version, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageContent(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'getWikiPageContent'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageContent~QString;~I" kind1="0" name="getWikiPageContent" parameter1="String pageName 0 String pageName false" parameter2="int version 1 int version false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394146333" version="1.0"/>
<refactoring comment="Change method 'public String org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHtml(String pageName) throws TracException' to 'public String getWikiPageHtml(String pageName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHtml(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getWikiPageHtml'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageHtml~QString;" kind1="0" name="getWikiPageHtml" parameter1="String pageName 0 String pageName false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394157095" version="1.0"/>
<refactoring comment="Change method 'public String org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHtml(String pageName, int version) throws TracException' to 'public String getWikiPageHtml(String pageName, int version, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageHtml(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'getWikiPageHtml'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageHtml~QString;~I" kind1="0" name="getWikiPageHtml" parameter1="String pageName 0 String pageName false" parameter2="int version 1 int version false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394166653" version="1.0"/>
<refactoring comment="Change method 'public TracWikiPageInfo[] org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getRecentWikiChanges(Date since) throws TracException' to 'public TracWikiPageInfo[] getRecentWikiChanges(Date since, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getRecentWikiChanges(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'getRecentWikiChanges'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getRecentWikiChanges~QDate;" kind1="0" name="getRecentWikiChanges" parameter1="Date since 0 Date since false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394175289" version="1.0"/>
<refactoring comment="Change method 'public boolean org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikipage(String pageName, String content, Map<String,Object> attributes) throws TracException' to 'public boolean putWikipage(String pageName, String content, Map<String,Object> attributes, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikipage(...)'
- Added parameters:
 IProgressMonitor monitor" default4="null" delegate="false" deprecate="true" description="Change method 'putWikipage'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~putWikipage~QString;~QString;~QMap\<QString;QObject;>;" kind1="0" name="putWikipage" parameter1="String pageName 0 String pageName false" parameter2="String content 1 String content false" parameter3="Map<String,Object> attributes 2 Map<String,Object> attributes false" parameter4="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394184982" version="1.0"/>
<refactoring comment="Change method 'public String[] org.eclipse.mylyn.internal.trac.core.ITracWikiClient.listWikiPageAttachments(String pageName) throws TracException' to 'public String[] listWikiPageAttachments(String pageName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.listWikiPageAttachments(...)'
- Added parameters:
 IProgressMonitor monitor" default2="null" delegate="false" deprecate="true" description="Change method 'listWikiPageAttachments'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~listWikiPageAttachments~QString;" kind1="0" name="listWikiPageAttachments" parameter1="String pageName 0 String pageName false" parameter2="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394196109" version="1.0"/>
<refactoring comment="Change method 'public InputStream org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageAttachmentData(String pageName, String fileName) throws TracException' to 'public InputStream getWikiPageAttachmentData(String pageName, String fileName, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.getWikiPageAttachmentData(...)'
- Added parameters:
 IProgressMonitor monitor" default3="null" delegate="false" deprecate="true" description="Change method 'getWikiPageAttachmentData'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~getWikiPageAttachmentData~QString;~QString;" kind1="0" name="getWikiPageAttachmentData" parameter1="String pageName 0 String pageName false" parameter2="String fileName 1 String fileName false" parameter3="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394203551" version="1.0"/>
<refactoring comment="Change method 'public String org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachmentData(String pageName, String fileName, String description, InputStream in, boolean replace) throws TracException' to 'public String putWikiPageAttachmentData(String pageName, String fileName, String description, InputStream in, boolean replace, IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.ITracWikiClient.putWikiPageAttachmentData(...)'
- Added parameters:
 IProgressMonitor monitor" default6="null" delegate="false" deprecate="true" description="Change method 'putWikiPageAttachmentData'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java[ITracWikiClient~putWikiPageAttachmentData~QString;~QString;~QString;~QInputStream;~Z" kind1="0" name="putWikiPageAttachmentData" parameter1="String pageName 0 String pageName false" parameter2="String fileName 1 String fileName false" parameter3="String description 2 String description false" parameter4="InputStream in 3 InputStream in false" parameter5="boolean replace 4 boolean replace false" parameter6="{added} {added} -1 IProgressMonitor monitor false" stamp="1207394212639" version="1.0"/>
<refactoring comment="Extract local variable 'responseBodyAsStream' from expression 'WebUtil.getResponseBodyAsStream(method,monitor)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'responseBodyAsStream'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracWebClient.getTicket()'
- Variable expression: 'WebUtil.getResponseBodyAsStream(method,monitor)'
- Replace occurrences of expression with variable" description="Extract local variable 'responseBodyAsStream'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracWebClient.java" name="responseBodyAsStream" replace="true" selection="8200 48" stamp="1207420392291" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.TracWebClient.WebRequest' to 'TracWebRequest'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracWebClient.WebRequest'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracWebClient.TracWebRequest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'WebRequest'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core{TracWebClient.java[TracWebClient[WebRequest" matchStrategy="1" name="TracWebRequest" qualified="false" references="true" similarDeclarations="false" stamp="1207423183659" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.TracWebClient.TracWebRequest' to 'Request'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracWebClient.TracWebRequest'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracWebClient.Request'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TracWebRequest'" flags="589826" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core{TracWebClient.java[TracWebClient[TracWebRequest" matchStrategy="1" name="Request" qualified="false" references="true" similarDeclarations="false" stamp="1207423198298" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..37959d3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1,29 @@
+1207393359214 Change method 'getAttachmentData'
+1207393377710 Change method 'putAttachmentData'
+1207393395882 Change method 'deleteAttachment'
+1207393413273 Change method 'createTicket'
+1207393429740 Change method 'updateTicket'
+1207393448924 Change method 'getChangedTickets'
+1207393462468 Change method 'getTicketLastChanged'
+1207393487450 Change method 'search'
+1207393502083 Change method 'getTicket'
+1207394025338 Change method 'wikiToHtml'
+1207394043125 Change method 'validateWikiRpcApi'
+1207394062946 Change method 'getAllWikiPageNames'
+1207394074138 Change method 'getWikiPage'
+1207394086880 Change method 'getWikiPage'
+1207394097030 Change method 'getWikiPageInfo'
+1207394107322 Change method 'getWikiPageInfo'
+1207394122691 Change method 'getWikiPageInfoAllVersions'
+1207394133645 Change method 'getWikiPageContent'
+1207394146333 Change method 'getWikiPageContent'
+1207394157095 Change method 'getWikiPageHtml'
+1207394166653 Change method 'getWikiPageHtml'
+1207394175289 Change method 'getRecentWikiChanges'
+1207394184982 Change method 'putWikipage'
+1207394196109 Change method 'listWikiPageAttachments'
+1207394203551 Change method 'getWikiPageAttachmentData'
+1207394212639 Change method 'putWikiPageAttachmentData'
+1207420392291 Extract local variable 'responseBodyAsStream'
+1207423183659 Rename type 'WebRequest'
+1207423198298 Rename type 'TracWebRequest'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/4/17/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/17/refactorings.history
new file mode 100644
index 0000000..fc95a16
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/17/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.TracClientManager.getRepository(...)' to 'getTraClient'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracClientManager.getRepository(...)'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracClientManager.getTraClient(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{TracClientManager.java[TracClientManager~getRepository~QTaskRepository;" name="getTraClient" references="true" stamp="1208811130863" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.internal.trac.core.TracClientManager.getTraClient(...)' to 'getTracClient'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracClientManager.getTraClient(...)'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracClientManager.getTracClient(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getTraClient'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.internal.trac.core{TracClientManager.java[TracClientManager~getTraClient~QTaskRepository;" name="getTracClient" references="true" stamp="1208811154916" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/4/17/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/17/refactorings.index
new file mode 100644
index 0000000..3a47d27
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/4/17/refactorings.index
@@ -0,0 +1,2 @@
+1208811130863 Rename method 'getRepository'
+1208811154916 Rename method 'getTraClient'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..2e5b9b7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'REPOSITORY_KIND' in 'org.eclipse.mylyn.internal.trac.core.TracCorePlugin' to 'CONNECTOR_KIND'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracCorePlugin.REPOSITORY_KIND'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracCorePlugin.CONNECTOR_KIND'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'REPOSITORY_KIND'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.trac.core{TracCorePlugin.java[TracCorePlugin^REPOSITORY_KIND" name="CONNECTOR_KIND" references="true" setter="true" stamp="1213156066389" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.TracTask.Kind' to 'TaskKind'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTask.Kind'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracTask.TaskKind'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'Kind'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask[Kind" matchStrategy="1" name="TaskKind" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213156403827" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.TracTask.Status' to 'TaskStatus'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTask.Status'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracTask.TaskStatus'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'Status'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask[Status" matchStrategy="1" name="TaskStatus" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213156416180" textual="false" version="1.0"/>
<refactoring comment="Move 3 element(s) to 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.java'
- Original project: 'org.eclipse.mylyn.trac.core'
- Destination element: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.java'
- Original elements:
 org.eclipse.mylyn.internal.trac.core.TracTask.TaskKind
 org.eclipse.mylyn.internal.trac.core.TracTask.TaskStatus
 org.eclipse.mylyn.internal.trac.core.TracTask.TracPriorityLevel
- Textual move only" description="Move types" destination="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryConnector.java" element1="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask[TaskKind" element2="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask[TaskStatus" element3="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java[TracTask[TracPriorityLevel" flags="589830" id="org.eclipse.jdt.ui.move" members="3" policy="org.eclipse.jdt.ui.moveMembers" stamp="1213156447490" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.TracAttributeFactory' to 'TracAttributeMapper'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracAttributeFactory'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TracAttributeFactory'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core{TracAttributeFactory.java[TracAttributeFactory" matchStrategy="1" name="TracAttributeMapper" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213158138340" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.Attribute' to 'TracAttribute'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.Attribute'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.TracAttribute'
- Update references to refactored element
- Rename similarly named elements
- Update textual occurrences in comments and strings" description="Rename type 'Attribute'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core{TracAttributeMapper.java[TracAttributeMapper[Attribute" matchStrategy="1" name="TracAttribute" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213158269098" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.model.TracAttribute' to 'TracRepositoryAttribute'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.model.TracAttribute'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.model.TracRepositoryAttribute'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TracAttribute'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core.model{TracAttribute.java[TracAttribute" matchStrategy="1" name="TracRepositoryAttribute" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213158334438" textual="false" version="1.0"/>
<refactoring comment="Convert member type 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.TracAttribute' in 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper' to top level type
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.TracAttribute'
- Field name: 'tracAttributeMapper'
- Declare field 'final'" description="Convert member type 'TracAttribute' to top level" field="false" fieldName="tracAttributeMapper" final="true" flags="786438" id="org.eclipse.jdt.ui.move.inner" input="/src<org.eclipse.mylyn.internal.trac.core{TracAttributeMapper.java[TracAttributeMapper[TracAttribute" mandatory="false" possible="false" stamp="1213158360419" version="1.0"/>
<refactoring comment="Change method 'private static TaskAttribute org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute(TaskAttributeMapper factory, TaskData data, TracAttribute tracAttribute, Object[] values, boolean allowEmtpy)' to 'private static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute, Object[] values, boolean allowEmtpy)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute(...)'
- Removed parameters:
 TaskAttributeMapper factory" delegate="false" deprecate="true" description="Change method 'createAttribute'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java[TracTaskDataHandler~createAttribute~QTaskAttributeMapper;~QTaskData;~QTracAttribute;~\[QObject;~Z" name="createAttribute" parameter1="TaskAttributeMapper factory 0 {deleted} {deleted} true" parameter2="TaskData data 1 TaskData data false" parameter3="TracAttribute tracAttribute 2 TracAttribute tracAttribute false" parameter4="Object[] values 3 Object[] values false" parameter5="boolean allowEmtpy 4 boolean allowEmtpy false" stamp="1213159734340" version="1.0"/>
<refactoring comment="Change method 'private static TaskAttribute org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute(TaskAttributeMapper factory, TaskData data, TracAttribute tracAttribute, Object[] values)' to 'private static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute, Object[] values)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute(...)'
- Removed parameters:
 TaskAttributeMapper factory" delegate="false" deprecate="true" description="Change method 'createAttribute'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java[TracTaskDataHandler~createAttribute~QTaskAttributeMapper;~QTaskData;~QTracAttribute;~\[QObject;" name="createAttribute" parameter1="TaskAttributeMapper factory 0 {deleted} {deleted} true" parameter2="TaskData data 1 TaskData data false" parameter3="TracAttribute tracAttribute 2 TracAttribute tracAttribute false" parameter4="Object[] values 3 Object[] values false" stamp="1213159762442" version="1.0"/>
<refactoring comment="Change method 'private static TaskAttribute org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute(TaskAttributeMapper factory, TaskData data, TracAttribute tracAttribute)' to 'private static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute(...)'
- Removed parameters:
 TaskAttributeMapper factory" delegate="false" deprecate="true" description="Change method 'createAttribute'" flags="589826" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java[TracTaskDataHandler~createAttribute~QTaskAttributeMapper;~QTaskData;~QTracAttribute;" name="createAttribute" parameter1="TaskAttributeMapper factory 0 {deleted} {deleted} true" parameter2="TaskData data 1 TaskData data false" parameter3="TracAttribute tracAttribute 2 TracAttribute tracAttribute false" stamp="1213159906773" version="1.0"/>
<refactoring comment="Change method 'public static void org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createDefaultAttributes(TaskAttributeMapper factory, TaskData data, ITracClient client, boolean existingTask)' to 'public static void createDefaultAttributes(TaskData data, ITracClient client, boolean existingTask)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createDefaultAttributes(...)'
- Removed parameters:
 TaskAttributeMapper factory" delegate="false" deprecate="true" description="Change method 'createDefaultAttributes'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java[TracTaskDataHandler~createDefaultAttributes~QTaskAttributeMapper;~QTaskData;~QITracClient;~Z" name="createDefaultAttributes" parameter1="TaskAttributeMapper factory 0 {deleted} {deleted} true" parameter2="TaskData data 1 TaskData data false" parameter3="ITracClient client 2 ITracClient client false" parameter4="boolean existingTask 3 boolean existingTask false" stamp="1213159916455" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.core'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracStatus.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.core{TracStatus.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213162485932" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.core'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracTask.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.trac.tests/src<org.eclipse.mylyn.trac.tests" element1="/src<org.eclipse.mylyn.internal.trac.core{TracTask.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213165507286" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.core'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.trac.tests/src<org.eclipse.mylyn.trac.tests" element1="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryQuery.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213165533207" units="1" version="1.0"/>
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.trac.core.TracCorePlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracCorePlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.TracCorePlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.trac.core{TracCorePlugin.java[TracCorePlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213259631655" textual="false" version="1.0"/>

<refactoring comment="Extract local variable 'taskMapper' from expression 'getTaskMapper(taskRepository,taskData)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'taskMapper'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.hasTaskChanged()'
- Variable expression: 'getTaskMapper(taskRepository,taskData)'
- Replace occurrences of expression with variable" description="Extract local variable 'taskMapper'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryConnector.java" name="taskMapper" replace="true" selection="19757 39" stamp="1213345544951" version="1.0"/>
<refactoring comment="Move 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.getTracTicket(...)' to 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.getTracTicket(...)'
- Destination type: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler'" delegate="false" deprecate="true" description="Move member 'getTracTicket'" element1="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryConnector.java[TracRepositoryConnector~getTracTicket~QTaskRepository;~QTaskData;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java[TracTaskDataHandler" stamp="1213351460695" version="1.0"/>

<refactoring comment="Move 14 elements(s) to 'org.eclipse.mylyn.trac.core/src/org.eclipse.mylyn.internal.trac.core.client'
- Original project: 'org.eclipse.mylyn.trac.core'
- Destination element: 'org.eclipse.mylyn.trac.core/src/org.eclipse.mylyn.internal.trac.core.client'
- Original elements:
 org.eclipse.mylyn.internal.trac.core.ITracWikiClient.java
 org.eclipse.mylyn.internal.trac.core.InvalidTicketException.java
 org.eclipse.mylyn.internal.trac.core.AbstractTracClient.java
 org.eclipse.mylyn.internal.trac.core.TracLoginException.java
 org.eclipse.mylyn.internal.trac.core.TracProxyAuthenticationException.java
 org.eclipse.mylyn.internal.trac.core.TracWebClient.java
 org.eclipse.mylyn.internal.trac.core.ITracClient.java
 org.eclipse.mylyn.internal.trac.core.AbstractWikiHandler.java
 org.eclipse.mylyn.internal.trac.core.TracNoSuchMethodException.java
 org.eclipse.mylyn.internal.trac.core.TracXmlRpcClient.java
 org.eclipse.mylyn.internal.trac.core.TracRemoteException.java
 org.eclipse.mylyn.internal.trac.core.InvalidWikiPageException.java
 org.eclipse.mylyn.internal.trac.core.TracException.java
 org.eclipse.mylyn.internal.trac.core.TracPermissionDeniedException.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.trac.core.client" element1="/src<org.eclipse.mylyn.internal.trac.core{ITracWikiClient.java" element10="/src<org.eclipse.mylyn.internal.trac.core{TracXmlRpcClient.java" element11="/src<org.eclipse.mylyn.internal.trac.core{TracRemoteException.java" element12="/src<org.eclipse.mylyn.internal.trac.core{InvalidWikiPageException.java" element13="/src<org.eclipse.mylyn.internal.trac.core{TracPermissionDeni" element14="/src<org.eclipse.mylyn.internal.trac.core{TracPermissionDeniedException.java" element2="/src<org.eclipse.mylyn.internal.trac.core{AbstractTracClient.javajava" element3="/src<org.eclipse.mylyn.internal.trac.core{AbstractTracClient.java" element4="/src<org.eclipse.mylyn.internal.trac.core{TracProxyAuthentication" element5="/src<org.eclipse.mylyn.internal.trac.core{TracProxyAuthenticationException.java" element6="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.javava" element7="/src<org.eclipse.mylyn.internal.trac.core{ITracClient.java" element8="/src<org.eclipse.mylyn.internal.trac.core{TracNoSuchMethodExceptio" element9="/src<org.eclipse.mylyn.internal.trac.core{TracNoSuchMethodException.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213352955490" units="14" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.core/src/org.eclipse.mylyn.internal.trac.core.client'
- Original project: 'org.eclipse.mylyn.trac.core'
- Destination element: 'org.eclipse.mylyn.trac.core/src/org.eclipse.mylyn.internal.trac.core.client'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracClientData.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.trac.core.client" element1="/src<org.eclipse.mylyn.internal.trac.core{TracClientData.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213352971171" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..3da0ca3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,20 @@
+1213156066389 Rename field 'REPOSITORY_KIND'
+1213156403827 Rename type 'Kind'
+1213156416180 Rename type 'Status'
+1213156447490 Move types
+1213158138340 Rename type 'TracAttributeFactory'
+1213158269098 Rename type 'Attribute'
+1213158334438 Rename type 'TracAttribute'
+1213158360419 Convert member type 'TracAttribute' to top level
+1213159734340 Change method 'createAttribute'
+1213159762442 Change method 'createAttribute'
+1213159906773 Change method 'createAttribute'
+1213159916455 Change method 'createDefaultAttributes'
+1213162485932 Delete element
+1213165507286 Move compilation unit
+1213165533207 Move compilation unit
+1213259631655 Rename field 'PLUGIN_ID'
+1213345544951 Extract local variable 'taskMapper'
+1213351460695 Move member 'getTracTicket'
+1213352955490 Move compilation units
+1213352971171 Move compilation unit
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/25/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/25/refactorings.history
new file mode 100644
index 0000000..e74af1d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/25/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.core.util.TracUtils' to 'TracUtil'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.util.TracUtils'
- Renamed element: 'org.eclipse.mylyn.internal.trac.core.util.TracUtil'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TracUtils'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.core.util{TracUtils.java[TracUtils" matchStrategy="1" name="TracUtil" qualified="false" references="true" similarDeclarations="false" stamp="1214107691076" textual="true" version="1.0"/>
<refactoring comment="Extract local variable 'taskKind2' from expression 'super.getTaskKind()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'taskKind2'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskMapper.getTaskKind()'
- Variable expression: 'super.getTaskKind()'
- Replace occurrences of expression with variable" description="Extract local variable 'taskKind2'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskMapper.java" name="taskKind2" replace="true" selection="1476 19" stamp="1214119726799" version="1.0"/>
<refactoring comment="Extract local variable 'attribute' from expression 'data.getRoot().getAttribute(TracAttribute.TIME.getTracKey())'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'attribute'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.updateTaskData()'
- Variable expression: 'data.getRoot().getAttribute(TracAttribute.TIME.getTracKey())'
- Replace occurrences of expression with variable" description="Extract local variable 'attribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="attribute" replace="true" selection="4856 60" stamp="1214123025415" version="1.0"/>
<refactoring comment="Extract local variable 'attribute' from expression 'data.getRoot().getAttribute(key)'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'attribute'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.updateTaskData()'
- Variable expression: 'data.getRoot().getAttribute(key)'
- Replace occurrences of expression with variable" description="Extract local variable 'attribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="attribute" replace="true" selection="5309 32" stamp="1214123048632" version="1.0"/>
<refactoring comment="Extract local variable 'attribute' from expression 'data.getRoot().getAttribute(TracAttribute.CHANGE_TIME.getTracKey())'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'attribute'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.updateTaskData()'
- Variable expression: 'data.getRoot().getAttribute(TracAttribute.CHANGE_TIME.getTracKey())'
- Replace occurrences of expression with variable" description="Extract local variable 'attribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="attribute" replace="true" selection="4851 67" stamp="1214123109229" version="1.0"/>
<refactoring comment="Extract local variable 'type' from expression 'attribute.getMetaData().getType()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'type'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.isInternalAttribute()'
- Variable expression: 'attribute.getMetaData().getType()'
- Replace occurrences of expression with variable" description="Extract local variable 'type'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracAttributeMapper.java" name="type" replace="true" selection="1336 33" stamp="1214123499994" version="1.0"/>
<refactoring comment="Extract local variable 'priorityLevel' from expression 'getPriorityLevel()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'priorityLevel'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskMapper.hasChanges()'
- Variable expression: 'getPriorityLevel()'
- Replace occurrences of expression with variable" description="Extract local variable 'priorityLevel'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskMapper.java" name="priorityLevel" replace="true" selection="2861 18" stamp="1214124114309" version="1.0"/>
<refactoring comment="Extract local variable 'root' from expression 'taskData.getRoot()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'root'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.migrateTaskData()'
- Variable expression: 'taskData.getRoot()'
- Replace occurrences of expression with variable" description="Extract local variable 'root'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="root" replace="true" selection="20980 18" stamp="1214126818116" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/25/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/25/refactorings.index
new file mode 100644
index 0000000..f4013eb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/25/refactorings.index
@@ -0,0 +1,8 @@
+1214107691076 Rename type 'TracUtils'
+1214119726799 Extract local variable 'taskKind2'
+1214123025415 Extract local variable 'attribute'
+1214123048632 Extract local variable 'attribute'
+1214123109229 Extract local variable 'attribute'
+1214123499994 Extract local variable 'type'
+1214124114309 Extract local variable 'priorityLevel'
+1214126818116 Extract local variable 'root'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/26/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/26/refactorings.history
new file mode 100644
index 0000000..89bff3e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'modificationDate' from expression 'task.getModificationDate()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'modificationDate'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.updateTaskFromTaskData()'
- Variable expression: 'task.getModificationDate()'
- Replace occurrences of expression with variable" description="Extract local variable 'modificationDate'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryConnector.java" name="modificationDate" replace="true" selection="17946 26" stamp="1214187006883" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/26/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/26/refactorings.index
new file mode 100644
index 0000000..a161a97
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/26/refactorings.index
@@ -0,0 +1 @@
+1214187006883 Extract local variable 'modificationDate'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/27/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/27/refactorings.history
new file mode 100644
index 0000000..6619183
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/27/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'modificationDate' from expression 'mapper.getModificationDate()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'modificationDate'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.updateTaskFromTaskData()'
- Variable expression: 'mapper.getModificationDate()'
- Replace occurrences of expression with variable" description="Extract local variable 'modificationDate'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryConnector.java" name="modificationDate" replace="true" selection="17593 28" stamp="1214865697391" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/6/27/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/27/refactorings.index
new file mode 100644
index 0000000..7f92fba
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/6/27/refactorings.index
@@ -0,0 +1 @@
+1214865697391 Extract local variable 'modificationDate'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/7/27/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2008/7/27/refactorings.history
new file mode 100644
index 0000000..c5b336d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/7/27/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Extract constant '_1' from expression '"1"'
- Original project: 'org.eclipse.mylyn.trac.core'
- Constant name: '_1'
- Constant expression: '"1"'
- Declared visibility: 'private'
- Replace occurrences of expression with constant" description="Extract constant '_1'" flags="786432" id="org.eclipse.jdt.ui.extract.constant" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="_1" qualify="false" replace="true" selection="22571 3" stamp="1214933891197" version="1.0" visibility="2"/>
<refactoring comment="Extract local variable 'metaData' from expression 'attribute.getMetaData()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'metaData'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.migrateTaskData()'
- Variable expression: 'attribute.getMetaData()'
- Replace occurrences of expression with variable" description="Extract local variable 'metaData'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="metaData" replace="true" selection="23138 23" stamp="1214935959471" version="1.0"/>
<refactoring comment="Extract local variable 'metaData' from expression 'attr.getMetaData()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'metaData'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute()'
- Variable expression: 'attr.getMetaData()'
- Replace occurrences of expression with variable" description="Extract local variable 'metaData'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="metaData" replace="true" selection="11577 18" stamp="1214936042313" version="1.0"/>
<refactoring comment="Extract local variable 'metaData' from expression 'attr.getMetaData()'
- Original project: 'org.eclipse.mylyn.trac.core'
- Variable name: 'metaData'
- Destination method: 'org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler.createAttribute()'
- Variable expression: 'attr.getMetaData()'
- Replace occurrences of expression with variable" description="Extract local variable 'metaData'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.core{TracTaskDataHandler.java" name="metaData" replace="true" selection="13514 18" stamp="1214936083471" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2008/7/27/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2008/7/27/refactorings.index
new file mode 100644
index 0000000..9bff217
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2008/7/27/refactorings.index
@@ -0,0 +1,4 @@
+1214933891197 Extract constant '_1'
+1214935959471 Extract local variable 'metaData'
+1214936042313 Extract local variable 'metaData'
+1214936083471 Extract local variable 'metaData'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2009/6/24/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/24/refactorings.history
new file mode 100644
index 0000000..fa62eaf
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Change method 'void org.eclipse.mylyn.internal.trac.core.client.ITracClient.validate(IProgressMonitor monitor) throws TracException' to 'public org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo validate(IProgressMonitor monitor) throws TracException'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.client.ITracClient.validate(...)'
- Keep original element as deprecated delegate to refactored element
- New return type: 'org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo'" delegate="true" deprecate="true" description="Change method 'validate'" element1="/src<org.eclipse.mylyn.internal.trac.core.client{TracException.java[TracException" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylyn.internal.trac.core.client{ITracClient.java[ITracClient~validate~QIProgressMonitor;" kind1="0" name="validate" parameter1="IProgressMonitor monitor 0 IProgressMonitor monitor false" return="org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo" stamp="1244931906506" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2009/6/24/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/24/refactorings.index
new file mode 100644
index 0000000..534ac1e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/24/refactorings.index
@@ -0,0 +1 @@
+1244931906506 Change method 'validate'
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2009/6/25/refactorings.history b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/25/refactorings.history
new file mode 100644
index 0000000..90d34e3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/25/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Inline constant 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.CLIENT_LABEL' in 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector'
- Original project: 'org.eclipse.mylyn.trac.core'
- Original element: 'org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.CLIENT_LABEL'
- Remove constant declaration
- Replace all references to constant with expression" description="Inline constant 'CLIENT_LABEL'" flags="786434" id="org.eclipse.jdt.ui.inline.constant" input="/src<org.eclipse.mylyn.internal.trac.core{TracRepositoryConnector.java" remove="true" replace="true" selection="6074 0" stamp="1245022550886" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/.refactorings/2009/6/25/refactorings.index b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/25/refactorings.index
new file mode 100644
index 0000000..7cd3616
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.refactorings/2009/6/25/refactorings.index
@@ -0,0 +1 @@
+1245022550886 Inline constant 'CLIENT_LABEL'
diff --git a/org.eclipse.mylyn.trac.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.trac.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.trac.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.trac.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.trac.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.trac.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.trac.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..be33c2f
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.trac.core;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
+ org.apache.xmlrpc;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.mylyn.internal.trac.core;x-friends:="org.eclipse.mylyn.trac.ui",
+ org.eclipse.mylyn.internal.trac.core.client;x-friends:="org.eclipse.mylyn.trac.ui",
+ org.eclipse.mylyn.internal.trac.core.model;x-friends:="org.eclipse.mylyn.trac.ui",
+ org.eclipse.mylyn.internal.trac.core.util;x-friends:="org.eclipse.mylyn.trac.ui"
+Bundle-Activator: org.eclipse.mylyn.internal.trac.core.TracCorePlugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.trac.core/about.html b/org.eclipse.mylyn.trac.core/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/build.properties b/org.eclipse.mylyn.trac.core/build.properties
new file mode 100644
index 0000000..96bc39e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/build.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.trac.core/plugin.properties b/org.eclipse.mylyn.trac.core/plugin.properties
new file mode 100644
index 0000000..8cbb12d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn.trac.core
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Trac Connector Core
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/Messages.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/Messages.java
new file mode 100644
index 0000000..afbe7c3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/Messages.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.core;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.trac.core.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TracAttachmentHandler_Uploading_attachment;
+
+ public static String TracAttribute_Assigned_to;
+
+ public static String TracAttribute_CC;
+
+ public static String TracAttribute_Component;
+
+ public static String TracAttribute_Created;
+
+ public static String TracAttribute_Description;
+
+ public static String TracAttribute_ID;
+
+ public static String TracAttribute_Keywords;
+
+ public static String TracAttribute_Last_Modification;
+
+ public static String TracAttribute_Milestone;
+
+ public static String TracAttribute_Priority;
+
+ public static String TracAttribute_Reporter;
+
+ public static String TracAttribute_Resolution;
+
+ public static String TracAttribute_Severity;
+
+ public static String TracAttribute_Status;
+
+ public static String TracAttribute_Summary;
+
+ public static String TracAttribute_Type;
+
+ public static String TracAttribute_Version;
+
+ public static String TracCorePlugin_I_O_error_has_occured;
+
+ public static String TracCorePlugin_Repository_URL_is_invalid;
+
+ public static String TracCorePlugin_the_SERVER_RETURNED_an_UNEXPECTED_RESOPNSE;
+
+ public static String TracCorePlugin_Unexpected_error;
+
+ public static String TracCorePlugin_Unexpected_server_response_;
+
+ public static String TracRepositoryConnector_Getting_changed_tasks;
+
+ public static String TracRepositoryConnector_Querying_repository;
+
+ public static String TracRepositoryConnector_Trac_Client_Label;
+
+ public static String TracTaskDataHandler_Accept;
+
+ public static String TracTaskDataHandler_Leave;
+
+ public static String TracTaskDataHandler_Leave_as_Status;
+
+ public static String TracTaskDataHandler_Leave_as_Status_Resolution;
+
+ public static String TracTaskDataHandler_Reopen;
+
+ public static String TracTaskDataHandler_Resolve_as;
+
+ public static String TracWikiHandler_Download_Wiki_Page;
+
+ public static String TracWikiHandler_Download_Wiki_Page_Names;
+
+ public static String TracWikiHandler_Retrieve_Wiki_Page_History;
+
+ public static String TracWikiHandler_Upload_Wiki_Page;
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java
new file mode 100644
index 0000000..7e032f3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttachmentHandler.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.io.InputStream;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentSource;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracAttachmentHandler extends AbstractTaskAttachmentHandler {
+
+ private final TracRepositoryConnector connector;
+
+ public TracAttachmentHandler(TracRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ @Override
+ public InputStream getContent(TaskRepository repository, ITask task, TaskAttribute attachmentAttribute,
+ IProgressMonitor monitor) throws CoreException {
+ TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(attachmentAttribute);
+ String filename = mapper.getFileName();
+ if (filename == null || filename.length() == 0) {
+ throw new CoreException(new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR,
+ TracCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY, "Attachment download from " //$NON-NLS-1$
+ + repository.getRepositoryUrl() + " failed, missing attachment filename.")); //$NON-NLS-1$
+ }
+
+ try {
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ int id = Integer.parseInt(task.getTaskId());
+ return client.getAttachmentData(id, filename, monitor);
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ }
+
+ @Override
+ public void postContent(TaskRepository repository, ITask task, AbstractTaskAttachmentSource source, String comment,
+ TaskAttribute attachmentAttribute, IProgressMonitor monitor) throws CoreException {
+ if (!TracRepositoryConnector.hasAttachmentSupport(repository, task)) {
+ throw new CoreException(new RepositoryStatus(repository.getRepositoryUrl(), IStatus.INFO,
+ TracCorePlugin.ID_PLUGIN, RepositoryStatus.ERROR_REPOSITORY,
+ "Attachments are not supported by this repository access type")); //$NON-NLS-1$
+ }
+
+ String filename = source.getName();
+ String description = source.getDescription();
+ if (attachmentAttribute != null) {
+ TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(attachmentAttribute);
+ if (mapper.getFileName() != null) {
+ filename = mapper.getFileName();
+ }
+ if (mapper.getDescription() != null) {
+ description = mapper.getDescription();
+ }
+ }
+ if (description == null) {
+ description = ""; //$NON-NLS-1$
+ }
+
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask(Messages.TracAttachmentHandler_Uploading_attachment, IProgressMonitor.UNKNOWN);
+ try {
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ int id = Integer.parseInt(task.getTaskId());
+ client.putAttachmentData(id, filename, description, source.createInputStream(monitor), monitor);
+ if (comment != null && comment.length() > 0) {
+ TracTicket ticket = new TracTicket(id);
+ client.updateTicket(ticket, comment, monitor);
+ }
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public boolean canGetContent(TaskRepository repository, ITask task) {
+ return TracRepositoryConnector.hasAttachmentSupport(repository, task);
+ }
+
+ @Override
+ public boolean canPostContent(TaskRepository repository, ITask task) {
+ return TracRepositoryConnector.hasAttachmentSupport(repository, task);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttribute.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttribute.java
new file mode 100644
index 0000000..7aac2ba
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttribute.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper.Flag;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+
+/**
+ * @author Steffen Pingel
+ */
+public enum TracAttribute {
+
+ CC(Key.CC, Messages.TracAttribute_CC, TaskAttribute.USER_CC, TaskAttribute.TYPE_SHORT_TEXT, Flag.PEOPLE),
+
+ CHANGE_TIME(Key.CHANGE_TIME, Messages.TracAttribute_Last_Modification, TaskAttribute.DATE_MODIFICATION, TaskAttribute.TYPE_DATE,
+ Flag.READ_ONLY),
+
+ COMPONENT(Key.COMPONENT, Messages.TracAttribute_Component, TaskAttribute.PRODUCT, TaskAttribute.TYPE_SINGLE_SELECT, Flag.ATTRIBUTE),
+
+ DESCRIPTION(Key.DESCRIPTION, Messages.TracAttribute_Description, TaskAttribute.DESCRIPTION, TaskAttribute.TYPE_LONG_RICH_TEXT),
+
+ ID(Key.ID, Messages.TracAttribute_ID, TaskAttribute.TASK_KEY, TaskAttribute.TYPE_SHORT_TEXT, Flag.PEOPLE),
+
+ KEYWORDS(Key.KEYWORDS, Messages.TracAttribute_Keywords, TaskAttribute.KEYWORDS, TaskAttribute.TYPE_SHORT_TEXT, Flag.ATTRIBUTE),
+
+ MILESTONE(Key.MILESTONE, Messages.TracAttribute_Milestone, null, TaskAttribute.TYPE_SINGLE_SELECT, Flag.ATTRIBUTE),
+
+ OWNER(Key.OWNER, Messages.TracAttribute_Assigned_to, TaskAttribute.USER_ASSIGNED, TaskAttribute.TYPE_PERSON, Flag.PEOPLE),
+
+ PRIORITY(Key.PRIORITY, Messages.TracAttribute_Priority, TaskAttribute.PRIORITY, TaskAttribute.TYPE_SINGLE_SELECT, Flag.ATTRIBUTE),
+
+ REPORTER(Key.REPORTER, Messages.TracAttribute_Reporter, TaskAttribute.USER_REPORTER, TaskAttribute.TYPE_PERSON, Flag.READ_ONLY),
+
+ RESOLUTION(Key.RESOLUTION, Messages.TracAttribute_Resolution, TaskAttribute.RESOLUTION, TaskAttribute.TYPE_SINGLE_SELECT),
+
+ SEVERITY(Key.SEVERITY, Messages.TracAttribute_Severity, null, TaskAttribute.TYPE_SINGLE_SELECT, Flag.ATTRIBUTE),
+
+ STATUS(Key.STATUS, Messages.TracAttribute_Status, TaskAttribute.STATUS, TaskAttribute.TYPE_SHORT_TEXT),
+
+ SUMMARY(Key.SUMMARY, Messages.TracAttribute_Summary, TaskAttribute.SUMMARY, TaskAttribute.TYPE_SHORT_RICH_TEXT),
+
+ TIME(Key.TIME, Messages.TracAttribute_Created, TaskAttribute.DATE_CREATION, TaskAttribute.TYPE_DATE, Flag.READ_ONLY),
+
+ TYPE(Key.TYPE, Messages.TracAttribute_Type, TaskAttribute.TASK_KIND, TaskAttribute.TYPE_SINGLE_SELECT, Flag.ATTRIBUTE),
+
+ VERSION(Key.VERSION, Messages.TracAttribute_Version, null, TaskAttribute.TYPE_SINGLE_SELECT, Flag.ATTRIBUTE);
+
+ static Map<String, TracAttribute> attributeByTracKey = new HashMap<String, TracAttribute>();
+
+ static Map<String, String> tracKeyByTaskKey = new HashMap<String, String>();
+
+ private final String tracKey;
+
+ private final String prettyName;
+
+ private final String taskKey;
+
+ private final String type;
+
+ private EnumSet<Flag> flags;
+
+ public static TracAttribute getByTaskKey(String taskKey) {
+ for (TracAttribute attribute : values()) {
+ if (taskKey.equals(attribute.getTaskKey())) {
+ return attribute;
+ }
+ }
+ return null;
+ }
+
+ public static TracAttribute getByTracKey(String tracKey) {
+ for (TracAttribute attribute : values()) {
+ if (tracKey.equals(attribute.getTracKey())) {
+ return attribute;
+ }
+ }
+ return null;
+ }
+
+ TracAttribute(Key tracKey, String prettyName, String taskKey, String type, Flag firstFlag, Flag... moreFlags) {
+ this.tracKey = tracKey.getKey();
+ this.taskKey = taskKey;
+ this.prettyName = prettyName;
+ this.type = type;
+ if (firstFlag == null) {
+ this.flags = TracAttributeMapper.NO_FLAGS;
+ } else {
+ this.flags = EnumSet.of(firstFlag, moreFlags);
+ }
+ }
+
+ TracAttribute(Key tracKey, String prettyName, String taskKey, String type) {
+ this(tracKey, prettyName, taskKey, type, null);
+ }
+
+ public String getTaskKey() {
+ return taskKey;
+ }
+
+ public String getTracKey() {
+ return tracKey;
+ }
+
+ public String getKind() {
+ if (flags.contains(Flag.ATTRIBUTE)) {
+ return TaskAttribute.KIND_DEFAULT;
+ } else if (flags.contains(Flag.PEOPLE)) {
+ return TaskAttribute.KIND_PEOPLE;
+ }
+ return null;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public boolean isReadOnly() {
+ return flags.contains(Flag.READ_ONLY);
+ }
+
+ @Override
+ public String toString() {
+ return prettyName;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeMapper.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeMapper.java
new file mode 100644
index 0000000..b6357e1
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracAttributeMapper.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+
+/**
+ * Provides a mapping from Mylyn task keys to Trac ticket keys.
+ *
+ * @author Steffen Pingel
+ */
+public class TracAttributeMapper extends TaskAttributeMapper {
+
+ public enum Flag {
+ READ_ONLY, ATTRIBUTE, PEOPLE
+ };
+
+ public static final String NEW_CC = "task.common.newcc"; //$NON-NLS-1$
+
+ public static final String REMOVE_CC = "task.common.removecc"; //$NON-NLS-1$
+
+ public static final EnumSet<Flag> NO_FLAGS = EnumSet.noneOf(Flag.class);
+
+ private final ITracClient client;
+
+ public static boolean isInternalAttribute(TaskAttribute attribute) {
+ String type = attribute.getMetaData().getType();
+ if (TaskAttribute.TYPE_ATTACHMENT.equals(type) || TaskAttribute.TYPE_OPERATION.equals(type)
+ || TaskAttribute.TYPE_COMMENT.equals(type)) {
+ return true;
+ }
+ String id = attribute.getId();
+ return TaskAttribute.COMMENT_NEW.equals(id) || TaskAttribute.ADD_SELF_CC.equals(id) || REMOVE_CC.equals(id)
+ || NEW_CC.equals(id);
+ }
+
+ public TracAttributeMapper(TaskRepository taskRepository, ITracClient client) {
+ super(taskRepository);
+ Assert.isNotNull(client);
+ this.client = client;
+ }
+
+ @Override
+ public Date getDateValue(TaskAttribute attribute) {
+ return TracUtil.parseDate(attribute.getValue());
+ }
+
+ @Override
+ public String mapToRepositoryKey(TaskAttribute parent, String key) {
+ TracAttribute attribute = TracAttribute.getByTaskKey(key);
+ return (attribute != null) ? attribute.getTracKey() : key;
+ }
+
+ @Override
+ public void setDateValue(TaskAttribute attribute, Date date) {
+ if (date == null) {
+ attribute.clearValues();
+ } else {
+ attribute.setValue(TracUtil.toTracTime(date) + ""); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public Map<String, String> getOptions(TaskAttribute attribute) {
+ Map<String, String> options = getRepositoryOptions(client, attribute.getId());
+ return (options != null) ? options : super.getOptions(attribute);
+ }
+
+ public static Map<String, String> getRepositoryOptions(ITracClient client, String trackKey) {
+ if (client.hasAttributes()) {
+ if (TracAttribute.STATUS.getTracKey().equals(trackKey)) {
+ return getOptions(client.getTicketStatus(), false);
+ } else if (TracAttribute.RESOLUTION.getTracKey().equals(trackKey)) {
+ return getOptions(client.getTicketResolutions(), false);
+ } else if (TracAttribute.COMPONENT.getTracKey().equals(trackKey)) {
+ return getOptions(client.getComponents(), false);
+ } else if (TracAttribute.VERSION.getTracKey().equals(trackKey)) {
+ return getOptions(client.getVersions(), true);
+ } else if (TracAttribute.PRIORITY.getTracKey().equals(trackKey)) {
+ return getOptions(client.getPriorities(), false);
+ } else if (TracAttribute.SEVERITY.getTracKey().equals(trackKey)) {
+ return getOptions(client.getSeverities(), false);
+ } else if (TracAttribute.MILESTONE.getTracKey().equals(trackKey)) {
+ return getOptions(client.getMilestones(), true);
+ } else if (TracAttribute.TYPE.getTracKey().equals(trackKey)) {
+ return getOptions(client.getTicketTypes(), false);
+ }
+ }
+ return null;
+ }
+
+ private static Map<String, String> getOptions(Object[] values, boolean allowEmpty) {
+ if (values != null && values.length > 0) {
+ Map<String, String> options = new LinkedHashMap<String, String>();
+ if (allowEmpty) {
+ options.put("", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ for (Object value : values) {
+ options.put(value.toString(), value.toString());
+ }
+ return options;
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracClientFactory.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracClientFactory.java
new file mode 100644
index 0000000..8b919ac
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracClientFactory.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.net.MalformedURLException;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.TracLoginException;
+import org.eclipse.mylyn.internal.trac.core.client.TracWebClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracXmlRpcClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracClientFactory {
+
+ public static ITracClient createClient(AbstractWebLocation location, Version version) {
+ if (version == Version.TRAC_0_9) {
+ return new TracWebClient(location, version);
+ } else if (version == Version.XML_RPC) {
+ return new TracXmlRpcClient(location, version);
+ }
+
+ throw new RuntimeException("Invalid repository version: " + version); //$NON-NLS-1$
+ }
+
+ /**
+ * Tries all supported access types for <code>location</code> and returns the corresponding version if successful;
+ * throws an exception otherwise.
+ *
+ * <p>
+ * Order of the tried access types: XML-RPC, Trac 0.9
+ */
+ public static Version probeClient(AbstractWebLocation location) throws MalformedURLException, TracException {
+ try {
+ ITracClient repository = new TracXmlRpcClient(location, Version.XML_RPC);
+ repository.validate(new NullProgressMonitor());
+ return Version.XML_RPC;
+ } catch (TracException e) {
+ try {
+ ITracClient repository = new TracWebClient(location, Version.TRAC_0_9);
+ repository.validate(new NullProgressMonitor());
+ return Version.TRAC_0_9;
+ } catch (TracLoginException e2) {
+ throw e;
+ } catch (TracException e2) {
+ }
+ }
+
+ throw new TracException();
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java
new file mode 100644
index 0000000..f352ea9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracClientManager.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracClientData;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.tasks.core.IRepositoryListener;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+
+/**
+ * Caches {@link ITracClient} objects.
+ *
+ * @author Steffen Pingel
+ */
+public class TracClientManager implements IRepositoryListener {
+
+ private final Map<String, ITracClient> clientByUrl = new HashMap<String, ITracClient>();
+
+ private final Map<String, TracClientData> clientDataByUrl = new HashMap<String, TracClientData>();
+
+ private final File cacheFile;
+
+ private TaskRepositoryLocationFactory taskRepositoryLocationFactory;
+
+ public TracClientManager(File cacheFile, TaskRepositoryLocationFactory taskRepositoryLocationFactory) {
+ this.cacheFile = cacheFile;
+ this.taskRepositoryLocationFactory = taskRepositoryLocationFactory;
+
+ readCache();
+ }
+
+ public synchronized ITracClient getTracClient(TaskRepository taskRepository) {
+ ITracClient repository = clientByUrl.get(taskRepository.getRepositoryUrl());
+ if (repository == null) {
+ AbstractWebLocation location = taskRepositoryLocationFactory.createWebLocation(taskRepository);
+ repository = TracClientFactory.createClient(location, Version.fromVersion(taskRepository.getVersion()));
+ clientByUrl.put(taskRepository.getRepositoryUrl(), repository);
+
+ TracClientData data = clientDataByUrl.get(taskRepository.getRepositoryUrl());
+ if (data == null) {
+ data = new TracClientData();
+ clientDataByUrl.put(taskRepository.getRepositoryUrl(), data);
+ }
+ repository.setData(data);
+ }
+ return repository;
+ }
+
+ public void repositoriesRead() {
+ // ignore
+ }
+
+ public synchronized void repositoryAdded(TaskRepository repository) {
+ // make sure there is no stale client still in the cache, bug #149939
+ removeClient(repository);
+ clientDataByUrl.remove(repository.getRepositoryUrl());
+ }
+
+ private void removeClient(TaskRepository repository) {
+ clientByUrl.remove(repository.getRepositoryUrl());
+ }
+
+ public synchronized void repositoryRemoved(TaskRepository repository) {
+ removeClient(repository);
+ clientDataByUrl.remove(repository.getRepositoryUrl());
+ }
+
+ public synchronized void repositorySettingsChanged(TaskRepository repository) {
+ removeClient(repository);
+ // if url is changed a stale data object will be left in
+ // clientDataByUrl, bug #149939
+ }
+
+ public void readCache() {
+ if (cacheFile == null || !cacheFile.exists()) {
+ return;
+ }
+
+ ObjectInputStream in = null;
+ try {
+ in = new ObjectInputStream(new FileInputStream(cacheFile));
+ int size = in.readInt();
+ for (int i = 0; i < size; i++) {
+ String url = (String) in.readObject();
+ TracClientData data = (TracClientData) in.readObject();
+ if (url != null && data != null) {
+ clientDataByUrl.put(url, data);
+ }
+ }
+ } catch (Throwable e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "The Trac respository configuration cache could not be read", e)); //$NON-NLS-1$
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+
+ }
+
+ public void writeCache() {
+ if (cacheFile == null) {
+ return;
+ }
+
+ ObjectOutputStream out = null;
+ try {
+ out = new ObjectOutputStream(new FileOutputStream(cacheFile));
+ out.writeInt(clientDataByUrl.size());
+ for (String url : clientDataByUrl.keySet()) {
+ out.writeObject(url);
+ out.writeObject(clientDataByUrl.get(url));
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "The Trac respository configuration cache could not be written", e)); //$NON-NLS-1$
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ public TaskRepositoryLocationFactory getTaskRepositoryLocationFactory() {
+ return taskRepositoryLocationFactory;
+ }
+
+ public void setTaskRepositoryLocationFactory(TaskRepositoryLocationFactory taskRepositoryLocationFactory) {
+ this.taskRepositoryLocationFactory = taskRepositoryLocationFactory;
+ }
+
+ public void repositoryUrlChanged(TaskRepository repository, String oldUrl) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java
new file mode 100644
index 0000000..7fa9303
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracCorePlugin.java
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.net.MalformedURLException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.mylyn.internal.trac.core.client.InvalidTicketException;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.TracLoginException;
+import org.eclipse.mylyn.internal.trac.core.client.TracPermissionDeniedException;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The headless Trac plug-in class.
+ *
+ * @author Steffen Pingel
+ */
+public class TracCorePlugin extends Plugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.trac.core"; //$NON-NLS-1$
+
+ public static final String ENCODING_UTF_8 = "UTF-8"; //$NON-NLS-1$
+
+ private static TracCorePlugin plugin;
+
+ public final static String CONNECTOR_KIND = "trac"; //$NON-NLS-1$
+
+ private TracRepositoryConnector connector;
+
+ public TracCorePlugin() {
+ }
+
+ public static TracCorePlugin getDefault() {
+ return plugin;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (connector != null) {
+ connector.stop();
+ connector = null;
+ }
+
+ plugin = null;
+ super.stop(context);
+ }
+
+ public TracRepositoryConnector getConnector() {
+ return connector;
+ }
+
+ void setConnector(TracRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ /**
+ * Returns the path to the file caching repository attributes.
+ */
+ protected IPath getRepostioryAttributeCachePath() {
+ IPath stateLocation = Platform.getStateLocation(getBundle());
+ IPath cacheFile = stateLocation.append("repositoryConfigurations"); //$NON-NLS-1$
+ return cacheFile;
+ }
+
+ public static IStatus toStatus(Throwable e, TaskRepository repository) {
+ if (e instanceof TracLoginException) {
+ return RepositoryStatus.createLoginError(repository.getRepositoryUrl(), ID_PLUGIN);
+ } else if (e instanceof TracPermissionDeniedException) {
+ return TracUtil.createPermissionDeniedError(repository.getRepositoryUrl(), ID_PLUGIN);
+ } else if (e instanceof InvalidTicketException) {
+ return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, Messages.TracCorePlugin_the_SERVER_RETURNED_an_UNEXPECTED_RESOPNSE, e);
+ } else if (e instanceof TracException) {
+ String message = e.getMessage();
+ if (message == null) {
+ message = Messages.TracCorePlugin_I_O_error_has_occured;
+ }
+ return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, ID_PLUGIN,
+ RepositoryStatus.ERROR_IO, message, e);
+ } else if (e instanceof ClassCastException) {
+ return new RepositoryStatus(IStatus.ERROR, ID_PLUGIN, RepositoryStatus.ERROR_IO,
+ Messages.TracCorePlugin_Unexpected_server_response_ + e.getMessage(), e);
+ } else if (e instanceof MalformedURLException) {
+ return new RepositoryStatus(IStatus.ERROR, ID_PLUGIN, RepositoryStatus.ERROR_IO,
+ Messages.TracCorePlugin_Repository_URL_is_invalid, e);
+ } else {
+ return new RepositoryStatus(IStatus.ERROR, ID_PLUGIN, RepositoryStatus.ERROR_INTERNAL, Messages.TracCorePlugin_Unexpected_error,
+ e);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java
new file mode 100644
index 0000000..d480f04
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java
@@ -0,0 +1,699 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.trac.core.client.AbstractWikiHandler;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracWikiClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositoryConnector extends AbstractRepositoryConnector {
+
+ public enum TaskKind {
+ DEFECT, ENHANCEMENT, TASK;
+
+ public static TaskKind fromString(String type) {
+ if (type == null) {
+ return null;
+ }
+ if (type.equals("Defect")) { //$NON-NLS-1$
+ return DEFECT;
+ }
+ if (type.equals("Enhancement")) { //$NON-NLS-1$
+ return ENHANCEMENT;
+ }
+ if (type.equals("Task")) { //$NON-NLS-1$
+ return TASK;
+ }
+ return null;
+ }
+
+ public static TaskKind fromType(String type) {
+ if (type == null) {
+ return null;
+ }
+ if (type.equals("defect")) { //$NON-NLS-1$
+ return DEFECT;
+ }
+ if (type.equals("enhancement")) { //$NON-NLS-1$
+ return ENHANCEMENT;
+ }
+ if (type.equals("task")) { //$NON-NLS-1$
+ return TASK;
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case DEFECT:
+ return "Defect"; //$NON-NLS-1$
+ case ENHANCEMENT:
+ return "Enhancement"; //$NON-NLS-1$
+ case TASK:
+ return "Task"; //$NON-NLS-1$
+ default:
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ }
+
+ public enum TaskStatus {
+ ASSIGNED, CLOSED, NEW, REOPENED;
+
+ public static TaskStatus fromStatus(String status) {
+ if (status == null) {
+ return null;
+ }
+ if (status.equals("new")) { //$NON-NLS-1$
+ return NEW;
+ }
+ if (status.equals("assigned")) { //$NON-NLS-1$
+ return ASSIGNED;
+ }
+ if (status.equals("reopened")) { //$NON-NLS-1$
+ return REOPENED;
+ }
+ if (status.equals("closed")) { //$NON-NLS-1$
+ return CLOSED;
+ }
+ return null;
+ }
+
+ public String toStatusString() {
+ switch (this) {
+ case NEW:
+ return "new"; //$NON-NLS-1$
+ case ASSIGNED:
+ return "assigned"; //$NON-NLS-1$
+ case REOPENED:
+ return "reopened"; //$NON-NLS-1$
+ case CLOSED:
+ return "closed"; //$NON-NLS-1$
+ default:
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case NEW:
+ return "New"; //$NON-NLS-1$
+ case ASSIGNED:
+ return "Assigned"; //$NON-NLS-1$
+ case REOPENED:
+ return "Reopened"; //$NON-NLS-1$
+ case CLOSED:
+ return "Closed"; //$NON-NLS-1$
+ default:
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ }
+
+ public enum TracPriorityLevel {
+ BLOCKER, CRITICAL, MAJOR, MINOR, TRIVIAL;
+
+ public static TracPriorityLevel fromPriority(String priority) {
+ if (priority == null) {
+ return null;
+ }
+ if (priority.equals("blocker")) { //$NON-NLS-1$
+ return BLOCKER;
+ }
+ if (priority.equals("critical")) { //$NON-NLS-1$
+ return CRITICAL;
+ }
+ if (priority.equals("major")) { //$NON-NLS-1$
+ return MAJOR;
+ }
+ if (priority.equals("minor")) { //$NON-NLS-1$
+ return MINOR;
+ }
+ if (priority.equals("trivial")) { //$NON-NLS-1$
+ return TRIVIAL;
+ }
+ return null;
+ }
+
+ public PriorityLevel toPriorityLevel() {
+ switch (this) {
+ case BLOCKER:
+ return PriorityLevel.P1;
+ case CRITICAL:
+ return PriorityLevel.P2;
+ case MAJOR:
+ return PriorityLevel.P3;
+ case MINOR:
+ return PriorityLevel.P4;
+ case TRIVIAL:
+ return PriorityLevel.P5;
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case BLOCKER:
+ return "blocker"; //$NON-NLS-1$
+ case CRITICAL:
+ return "critical"; //$NON-NLS-1$
+ case MAJOR:
+ return "major"; //$NON-NLS-1$
+ case MINOR:
+ return "minor"; //$NON-NLS-1$
+ case TRIVIAL:
+ return "trivial"; //$NON-NLS-1$
+ default:
+ return null;
+ }
+ }
+ }
+
+ private final static Date DEFAULT_COMPLETION_DATE = new Date(0);
+
+ private static int TASK_PRIORITY_LEVELS = 5;
+
+ public static final String TASK_KEY_SUPPORTS_SUBTASKS = "SupportsSubtasks"; //$NON-NLS-1$
+
+ public static final String TASK_KEY_UPDATE_DATE = "UpdateDate"; //$NON-NLS-1$
+
+ public static String getDisplayUsername(TaskRepository repository) {
+ AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ if (credentials != null && credentials.getUserName().length() > 0) {
+ return ITracClient.DEFAULT_USERNAME;
+ }
+ return repository.getUserName();
+ }
+
+ public static PriorityLevel getTaskPriority(String tracPriority) {
+ if (tracPriority != null) {
+ TracPriorityLevel priority = TracPriorityLevel.fromPriority(tracPriority);
+ if (priority != null) {
+ return priority.toPriorityLevel();
+ }
+ }
+ return PriorityLevel.getDefault();
+ }
+
+ public static PriorityLevel getTaskPriority(String priority, TracPriority[] tracPriorities) {
+ if (priority != null && tracPriorities != null && tracPriorities.length > 0) {
+ int minValue = tracPriorities[0].getValue();
+ int range = tracPriorities[tracPriorities.length - 1].getValue() - minValue;
+ for (TracPriority tracPriority : tracPriorities) {
+ if (priority.equals(tracPriority.getName())) {
+ float relativeValue = (float) (tracPriority.getValue() - minValue) / range;
+ int value = (int) (relativeValue * TASK_PRIORITY_LEVELS) + 1;
+ return PriorityLevel.fromLevel(value);
+ }
+ }
+ }
+ return getTaskPriority(priority);
+ }
+
+ public static int getTicketId(String taskId) throws CoreException {
+ try {
+ return Integer.parseInt(taskId);
+ } catch (NumberFormatException e) {
+ throw new CoreException(new Status(IStatus.ERROR, TracCorePlugin.ID_PLUGIN, IStatus.OK,
+ "Invalid ticket id: " + taskId, e)); //$NON-NLS-1$
+ }
+ }
+
+ static List<String> getAttributeValues(TaskData data, String attributeId) {
+ TaskAttribute attribute = data.getRoot().getMappedAttribute(attributeId);
+ if (attribute != null) {
+ return attribute.getValues();
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ static String getAttributeValue(TaskData data, String attributeId) {
+ TaskAttribute attribute = data.getRoot().getMappedAttribute(attributeId);
+ if (attribute != null) {
+ return attribute.getValue();
+ } else {
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ public static boolean hasAttachmentSupport(TaskRepository repository, ITask task) {
+ return Version.XML_RPC.name().equals(repository.getVersion());
+ }
+
+ public static boolean hasChangedSince(TaskRepository repository) {
+ return Version.XML_RPC.name().equals(repository.getVersion());
+ }
+
+ public static boolean hasRichEditor(TaskRepository repository) {
+ return Version.XML_RPC.name().equals(repository.getVersion());
+ }
+
+ public static boolean hasRichEditor(TaskRepository repository, ITask task) {
+ return hasRichEditor(repository);
+ }
+
+ public static boolean isCompleted(String tracStatus) {
+ TaskStatus taskStatus = TaskStatus.fromStatus(tracStatus);
+ return taskStatus == TaskStatus.CLOSED;
+ }
+
+ private final TracAttachmentHandler attachmentHandler = new TracAttachmentHandler(this);
+
+ private TracClientManager clientManager;
+
+ private File repositoryConfigurationCacheFile;
+
+ private final TracTaskDataHandler taskDataHandler = new TracTaskDataHandler(this);
+
+ private TaskRepositoryLocationFactory taskRepositoryLocationFactory = new TaskRepositoryLocationFactory();
+
+ private final TracWikiHandler wikiHandler = new TracWikiHandler(this);
+
+ public TracRepositoryConnector() {
+ if (TracCorePlugin.getDefault() != null) {
+ TracCorePlugin.getDefault().setConnector(this);
+ IPath path = TracCorePlugin.getDefault().getRepostioryAttributeCachePath();
+ this.repositoryConfigurationCacheFile = path.toFile();
+ }
+ }
+
+ public TracRepositoryConnector(File repositoryConfigurationCacheFile) {
+ this.repositoryConfigurationCacheFile = repositoryConfigurationCacheFile;
+ }
+
+ @Override
+ public boolean canCreateNewTask(TaskRepository repository) {
+ return true;
+ }
+
+ @Override
+ public boolean canCreateTaskFromKey(TaskRepository repository) {
+ return true;
+ }
+
+ @Override
+ public boolean canSynchronizeTask(TaskRepository taskRepository, ITask task) {
+ return hasRichEditor(taskRepository, task);
+ }
+
+ @Override
+ public TracAttachmentHandler getTaskAttachmentHandler() {
+ return attachmentHandler;
+ }
+
+ public synchronized TracClientManager getClientManager() {
+ if (clientManager == null) {
+ clientManager = new TracClientManager(repositoryConfigurationCacheFile, taskRepositoryLocationFactory);
+ }
+ return clientManager;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return TracCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public String getLabel() {
+ return Messages.TracRepositoryConnector_Trac_Client_Label;
+ }
+
+ @Override
+ public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+ return taskDataHandler.getTaskData(repository, taskId, monitor);
+ }
+
+ @Override
+ public TracTaskDataHandler getTaskDataHandler() {
+ return taskDataHandler;
+ }
+
+ @Override
+ public String getRepositoryUrlFromTaskUrl(String url) {
+ if (url == null) {
+ return null;
+ }
+ int index = url.lastIndexOf(ITracClient.TICKET_URL);
+ return index == -1 ? null : url.substring(0, index);
+ }
+
+ @Override
+ public String getTaskIdFromTaskUrl(String url) {
+ if (url == null) {
+ return null;
+ }
+ int index = url.lastIndexOf(ITracClient.TICKET_URL);
+ return index == -1 ? null : url.substring(index + ITracClient.TICKET_URL.length());
+ }
+
+ @Override
+ public String getTaskIdPrefix() {
+ return "#"; //$NON-NLS-1$
+ }
+
+ public TaskRepositoryLocationFactory getTaskRepositoryLocationFactory() {
+ return taskRepositoryLocationFactory;
+ }
+
+ @Override
+ public String getTaskUrl(String repositoryUrl, String taskId) {
+ return repositoryUrl + ITracClient.TICKET_URL + taskId;
+ }
+
+ public AbstractWikiHandler getWikiHandler() {
+ return wikiHandler;
+ }
+
+ public boolean hasWiki(TaskRepository repository) {
+ // check the access mode to validate Wiki support
+ ITracClient client = getClientManager().getTracClient(repository);
+ if (client instanceof ITracWikiClient) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public IStatus performQuery(TaskRepository repository, IRepositoryQuery query, TaskDataCollector resultCollector,
+ ISynchronizationSession session, IProgressMonitor monitor) {
+ try {
+ monitor.beginTask(Messages.TracRepositoryConnector_Querying_repository, IProgressMonitor.UNKNOWN);
+
+ TracSearch search = TracUtil.toTracSearch(query);
+ if (search == null) {
+ return new RepositoryStatus(repository.getRepositoryUrl(), IStatus.ERROR, TracCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY, "The query is invalid: \"" + query.getUrl() + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ search.setMax(TaskDataCollector.MAX_HITS);
+
+ ITracClient client;
+ try {
+ Map<String, ITask> taskById = null;
+
+ client = getClientManager().getTracClient(repository);
+ client.updateAttributes(monitor, false);
+
+ if (session != null && session.isFullSynchronization() && hasRichEditor(repository)
+ && !session.getTasks().isEmpty()) {
+ // performance optimization: only fetch task ids, all changed tasks have already been marked stale by preSynchronization()
+ List<Integer> ticketIds = new ArrayList<Integer>();
+ client.searchForTicketIds(search, ticketIds, monitor);
+
+ for (Integer id : ticketIds) {
+ if (taskById == null) {
+ taskById = new HashMap<String, ITask>();
+ for (ITask task : session.getTasks()) {
+ taskById.put(task.getTaskId(), task);
+ }
+ }
+ TaskData taskData = new TaskData(taskDataHandler.getAttributeMapper(repository),
+ TracCorePlugin.CONNECTOR_KIND, repository.getRepositoryUrl(), id + ""); //$NON-NLS-1$
+ taskData.setPartial(true);
+ TaskAttribute attribute = TracTaskDataHandler.createAttribute(taskData, TracAttribute.ID);
+ attribute.setValue(id + ""); //$NON-NLS-1$
+ resultCollector.accept(taskData);
+ }
+ } else {
+ List<TracTicket> tickets = new ArrayList<TracTicket>();
+ client.search(search, tickets, monitor);
+
+ for (TracTicket ticket : tickets) {
+ TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket,
+ monitor);
+ taskData.setPartial(true);
+ if (session != null && !session.isFullSynchronization() && hasRichEditor(repository)) {
+ if (taskById == null) {
+ taskById = new HashMap<String, ITask>();
+ for (ITask task : session.getTasks()) {
+ taskById.put(task.getTaskId(), task);
+ }
+ }
+ // preSyncronization() only handles full synchronizations
+ ITask task = taskById.get(ticket.getId() + ""); //$NON-NLS-1$
+ if (task != null && hasTaskChanged(repository, task, taskData)) {
+ session.markStale(task);
+ }
+ }
+ resultCollector.accept(taskData);
+ }
+ }
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Throwable e) {
+ return TracCorePlugin.toStatus(e, repository);
+ }
+
+ return Status.OK_STATUS;
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public void postSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException {
+ try {
+ monitor.beginTask("", 1); //$NON-NLS-1$
+ if (event.isFullSynchronization() && event.getStatus() == null) {
+ Date date = getSynchronizationTimestamp(event);
+ if (date != null) {
+ event.getTaskRepository().setSynchronizationTimeStamp(TracUtil.toTracTime(date) + ""); //$NON-NLS-1$
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private Date getSynchronizationTimestamp(ISynchronizationSession event) {
+ Date mostRecent = new Date(0);
+ Date mostRecentTimeStamp = TracUtil.parseDate(event.getTaskRepository().getSynchronizationTimeStamp());
+ for (ITask task : event.getChangedTasks()) {
+ Date taskModifiedDate = task.getModificationDate();
+ if (taskModifiedDate != null && taskModifiedDate.after(mostRecent)) {
+ mostRecent = taskModifiedDate;
+ mostRecentTimeStamp = task.getModificationDate();
+ }
+ }
+ return mostRecentTimeStamp;
+ }
+
+ @Override
+ public void preSynchronization(ISynchronizationSession session, IProgressMonitor monitor) throws CoreException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask(Messages.TracRepositoryConnector_Getting_changed_tasks, IProgressMonitor.UNKNOWN);
+
+ if (!session.isFullSynchronization()) {
+ return;
+ }
+
+ // there are no Trac tasks in the task list, skip contacting the repository
+ if (session.getTasks().isEmpty()) {
+ return;
+ }
+
+ TaskRepository repository = session.getTaskRepository();
+ if (!TracRepositoryConnector.hasChangedSince(repository)) {
+ // always run the queries for web mode
+ return;
+ }
+
+ if (repository.getSynchronizationTimeStamp() == null
+ || repository.getSynchronizationTimeStamp().length() == 0) {
+ for (ITask task : session.getTasks()) {
+ session.markStale(task);
+ }
+ return;
+ }
+
+ Date since = new Date(0);
+ try {
+ since = TracUtil.parseDate(Integer.parseInt(repository.getSynchronizationTimeStamp()));
+ } catch (NumberFormatException e) {
+ }
+
+ try {
+ ITracClient client = getClientManager().getTracClient(repository);
+ Set<Integer> ids = client.getChangedTickets(since, monitor);
+ if (ids.isEmpty()) {
+ // repository is unchanged
+ session.setNeedsPerformQueries(false);
+ return;
+ }
+
+ if (ids.size() == 1) {
+ // getChangedTickets() is expected to always return at least
+ // one ticket because
+ // the repository synchronization timestamp is set to the
+ // most recent modification date
+ Integer id = ids.iterator().next();
+ Date lastChanged = client.getTicketLastChanged(id, monitor);
+ if (since.equals(lastChanged)) {
+ // repository didn't actually change
+ session.setNeedsPerformQueries(false);
+ return;
+ }
+ }
+
+ for (ITask task : session.getTasks()) {
+ Integer id = getTicketId(task.getTaskId());
+ if (ids.contains(id)) {
+ session.markStale(task);
+ }
+ }
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ // TODO catch TracException
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public synchronized void setTaskRepositoryLocationFactory(
+ TaskRepositoryLocationFactory taskRepositoryLocationFactory) {
+ this.taskRepositoryLocationFactory = taskRepositoryLocationFactory;
+ if (this.clientManager != null) {
+ clientManager.setTaskRepositoryLocationFactory(taskRepositoryLocationFactory);
+ }
+ }
+
+ public void stop() {
+ if (clientManager != null) {
+ clientManager.writeCache();
+ }
+ }
+
+ @Override
+ public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
+ try {
+ ITracClient client = getClientManager().getTracClient(repository);
+ client.updateAttributes(monitor, true);
+ } catch (Exception e) {
+ throw new CoreException(RepositoryStatus.createStatus(repository.getRepositoryUrl(), IStatus.WARNING,
+ TracCorePlugin.ID_PLUGIN, "Could not update attributes")); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ TaskMapper mapper = getTaskMapping(taskData);
+ mapper.applyTo(task);
+ String status = mapper.getStatus();
+ if (status != null) {
+ if (isCompleted(mapper.getStatus())) {
+ Date modificationDate = mapper.getModificationDate();
+ if (modificationDate == null) {
+ // web mode does not set a date
+ modificationDate = DEFAULT_COMPLETION_DATE;
+ }
+ task.setCompletionDate(modificationDate);
+ } else {
+ task.setCompletionDate(null);
+ }
+ }
+ task.setUrl(taskRepository.getRepositoryUrl() + ITracClient.TICKET_URL + taskData.getTaskId());
+ if (!taskData.isPartial()) {
+ task.setAttribute(TASK_KEY_SUPPORTS_SUBTASKS, Boolean.toString(taskDataHandler.supportsSubtasks(taskData)));
+ Date date = task.getModificationDate();
+ task.setAttribute(TASK_KEY_UPDATE_DATE, (date != null) ? TracUtil.toTracTime(date) + "" : null); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ TaskMapper mapper = getTaskMapping(taskData);
+ if (taskData.isPartial()) {
+ return mapper.hasChanges(task);
+ } else {
+ Date repositoryDate = mapper.getModificationDate();
+ Date localDate = TracUtil.parseDate(task.getAttribute(TASK_KEY_UPDATE_DATE));
+ if (repositoryDate != null && repositoryDate.equals(localDate)) {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ @Override
+ public Collection<TaskRelation> getTaskRelations(TaskData taskData) {
+ TaskAttribute attribute = taskData.getRoot().getAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
+ if (attribute != null) {
+ List<TaskRelation> result = new ArrayList<TaskRelation>();
+ StringTokenizer t = new StringTokenizer(attribute.getValue(), ", "); //$NON-NLS-1$
+ while (t.hasMoreTokens()) {
+ result.add(TaskRelation.subtask(t.nextToken()));
+ }
+ return result;
+ }
+ return Collections.emptySet();
+ }
+
+ @Override
+ public TracTaskMapper getTaskMapping(TaskData taskData) {
+ TaskRepository taskRepository = taskData.getAttributeMapper().getTaskRepository();
+ ITracClient client = (taskRepository != null) ? getClientManager().getTracClient(taskRepository) : null;
+ return new TracTaskMapper(taskData, client);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java
new file mode 100644
index 0000000..fcf2f2e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskDataHandler.java
@@ -0,0 +1,663 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.Map.Entry;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.InvalidTicketException;
+import org.eclipse.mylyn.internal.trac.core.model.TracAction;
+import org.eclipse.mylyn.internal.trac.core.model.TracAttachment;
+import org.eclipse.mylyn.internal.trac.core.model.TracComment;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttachmentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
+import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskOperation;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskDataHandler extends AbstractTaskDataHandler {
+
+ private static final String TASK_DATA_VERSION = "2"; //$NON-NLS-1$
+
+ public static final String ATTRIBUTE_BLOCKED_BY = "blockedby"; //$NON-NLS-1$
+
+ public static final String ATTRIBUTE_BLOCKING = "blocking"; //$NON-NLS-1$
+
+ private static final String CC_DELIMETER = ", "; //$NON-NLS-1$
+
+ private static final String TRAC_KEY = "tracKey"; //$NON-NLS-1$
+
+ private final TracRepositoryConnector connector;
+
+ public TracTaskDataHandler(TracRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ monitor.beginTask("Task Download", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+ return downloadTaskData(repository, TracRepositoryConnector.getTicketId(taskId), monitor);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public TaskData downloadTaskData(TaskRepository repository, int taskId, IProgressMonitor monitor)
+ throws CoreException {
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ TracTicket ticket;
+ try {
+ client.updateAttributes(monitor, false);
+ ticket = client.getTicket(taskId, monitor);
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ // TODO catch TracException
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ return createTaskDataFromTicket(client, repository, ticket, monitor);
+ }
+
+ public TaskData createTaskDataFromTicket(ITracClient client, TaskRepository repository, TracTicket ticket,
+ IProgressMonitor monitor) throws CoreException {
+ TaskData taskData = new TaskData(getAttributeMapper(repository), TracCorePlugin.CONNECTOR_KIND,
+ repository.getRepositoryUrl(), ticket.getId() + ""); //$NON-NLS-1$
+ taskData.setVersion(TASK_DATA_VERSION);
+ try {
+ if (!TracRepositoryConnector.hasRichEditor(repository)) {
+ createDefaultAttributes(taskData, client, true);
+ Set<TaskAttribute> changedAttributes = updateTaskData(repository, taskData, ticket);
+ // remove attributes that were not set, i.e. were not received from the server
+ List<TaskAttribute> attributes = new ArrayList<TaskAttribute>(taskData.getRoot()
+ .getAttributes()
+ .values());
+ for (TaskAttribute attribute : attributes) {
+ if (!changedAttributes.contains(attribute) && !TracAttributeMapper.isInternalAttribute(attribute)) {
+ taskData.getRoot().removeAttribute(attribute.getId());
+ }
+ }
+ taskData.setPartial(true);
+ } else {
+ createDefaultAttributes(taskData, client, true);
+ updateTaskData(repository, taskData, ticket);
+ }
+ removeEmptySingleSelectAttributes(taskData);
+ return taskData;
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ // TODO catch TracException
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ }
+
+ private void removeEmptySingleSelectAttributes(TaskData taskData) {
+ List<TaskAttribute> attributes = new ArrayList<TaskAttribute>(taskData.getRoot().getAttributes().values());
+ for (TaskAttribute attribute : attributes) {
+ if (TaskAttribute.TYPE_SINGLE_SELECT.equals(attribute.getMetaData().getType())
+ && attribute.getValue().length() == 0 && attribute.getOptions().isEmpty()) {
+ taskData.getRoot().removeAttribute(attribute.getId());
+ }
+ }
+ }
+
+ public static Set<TaskAttribute> updateTaskData(TaskRepository repository, TaskData data, TracTicket ticket) {
+ Set<TaskAttribute> changedAttributes = new HashSet<TaskAttribute>();
+
+ Date lastChanged = ticket.getLastChanged();
+ if (lastChanged != null) {
+ TaskAttribute taskAttribute = data.getRoot().getAttribute(TracAttribute.CHANGE_TIME.getTracKey());
+ taskAttribute.setValue(TracUtil.toTracTime(lastChanged) + ""); //$NON-NLS-1$
+ changedAttributes.add(taskAttribute);
+ }
+
+ if (ticket.getCreated() != null) {
+ TaskAttribute taskAttribute = data.getRoot().getAttribute(TracAttribute.TIME.getTracKey());
+ taskAttribute.setValue(TracUtil.toTracTime(ticket.getCreated()) + ""); //$NON-NLS-1$
+ changedAttributes.add(taskAttribute);
+ }
+
+ Map<String, String> valueByKey = ticket.getValues();
+ for (String key : valueByKey.keySet()) {
+ TaskAttribute taskAttribute = data.getRoot().getAttribute(key);
+ if (taskAttribute != null) {
+ if (Key.CC.getKey().equals(key)) {
+ StringTokenizer t = new StringTokenizer(valueByKey.get(key), CC_DELIMETER);
+ while (t.hasMoreTokens()) {
+ taskAttribute.addValue(t.nextToken());
+ }
+ } else {
+ taskAttribute.setValue(valueByKey.get(key));
+ }
+ changedAttributes.add(taskAttribute);
+ } else {
+ // TODO log missing attribute?
+ }
+ }
+
+ TracComment[] comments = ticket.getComments();
+ if (comments != null) {
+ int count = 1;
+ for (int i = 0; i < comments.length; i++) {
+ if (!"comment".equals(comments[i].getField()) || "".equals(comments[i].getNewValue())) { //$NON-NLS-1$ //$NON-NLS-2$
+ continue;
+ }
+
+ TaskCommentMapper mapper = new TaskCommentMapper();
+ mapper.setAuthor(repository.createPerson(comments[i].getAuthor()));
+ mapper.setCreationDate(comments[i].getCreated());
+ mapper.setText(comments[i].getNewValue());
+ // TODO mapper.setUrl();
+ mapper.setNumber(count);
+
+ TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_COMMENT + count);
+ mapper.applyTo(attribute);
+ count++;
+ }
+ }
+
+ TracAttachment[] attachments = ticket.getAttachments();
+ if (attachments != null) {
+ for (int i = 0; i < attachments.length; i++) {
+ TaskAttachmentMapper mapper = new TaskAttachmentMapper();
+ mapper.setAuthor(repository.createPerson(attachments[i].getAuthor()));
+ mapper.setDescription(attachments[i].getDescription());
+ mapper.setFileName(attachments[i].getFilename());
+ mapper.setLength((long) attachments[i].getSize());
+ if (attachments[i].getCreated() != null) {
+ if (lastChanged == null || attachments[i].getCreated().after(lastChanged)) {
+ lastChanged = attachments[i].getCreated();
+ }
+ mapper.setCreationDate(attachments[i].getCreated());
+ }
+ mapper.setUrl(repository.getRepositoryUrl() + ITracClient.TICKET_ATTACHMENT_URL + ticket.getId() + "/" //$NON-NLS-1$
+ + TracUtil.encodeUrl(attachments[i].getFilename()));
+ mapper.setAttachmentId(i + ""); //$NON-NLS-1$
+
+ TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_ATTACHMENT + (i + 1));
+ mapper.applyTo(attribute);
+ }
+ }
+
+ TracAction[] actions = ticket.getActions();
+ if (actions != null) {
+ // add actions and set first as default
+ for (TracAction action : actions) {
+ addOperation(repository, data, ticket, action, action == actions[0]);
+ }
+ }
+
+ return changedAttributes;
+ }
+
+ private static void addOperation(TaskRepository repository, TaskData data, TracTicket ticket, TracAction action,
+ boolean setAsDefault) {
+ String label = action.getLabel();
+ if (label == null) {
+ if ("leave".equals(action.getId())) { //$NON-NLS-1$
+ String status = ticket.getValue(Key.STATUS);
+ if (status != null) {
+ String resolution = ticket.getValue(Key.RESOLUTION);
+ if (resolution != null) {
+ label = NLS.bind(Messages.TracTaskDataHandler_Leave_as_Status_Resolution, status, resolution);
+ } else {
+ label = NLS.bind(Messages.TracTaskDataHandler_Leave_as_Status, status);
+ }
+ } else {
+ label = Messages.TracTaskDataHandler_Leave;
+ }
+ } else if ("accept".equals(action.getId())) { //$NON-NLS-1$
+ label = Messages.TracTaskDataHandler_Accept;
+ } else if ("resolve".equals(action.getId())) { //$NON-NLS-1$
+ label = Messages.TracTaskDataHandler_Resolve_as;
+ } else if ("reopen".equals(action.getId())) { //$NON-NLS-1$
+ label = Messages.TracTaskDataHandler_Reopen;
+ } else if ("reassign".equals(action.getId())) { //$NON-NLS-1$
+ // do not add reassign for Trac 0.10 since the assigned to field is editable
+ } else {
+ label = action.getId();
+ }
+ }
+
+ if (label != null) {
+ TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + action.getId());
+ TaskOperation.applyTo(attribute, action.getId(), label);
+ if (!action.getFields().isEmpty()) {
+ // TODO support more than one field
+ TracTicketField field = action.getFields().get(0);
+ TaskAttribute fieldAttribute = createAttribute(data, field);
+ fieldAttribute.getMetaData().setKind(null);
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID, fieldAttribute.getId());
+ } else if ("resolve".equals(action.getId())) { //$NON-NLS-1$
+ attribute.getMetaData().putValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID,
+ TracAttribute.RESOLUTION.getTracKey());
+ }
+
+ if (setAsDefault) {
+ TaskAttribute operationAttribute = data.getRoot().createAttribute(TaskAttribute.OPERATION);
+ TaskOperation.applyTo(operationAttribute, action.getId(), label);
+ }
+ }
+ }
+
+ public static void createDefaultAttributes(TaskData data, ITracClient client, boolean existingTask) {
+ data.setVersion(TASK_DATA_VERSION);
+
+ createAttribute(data, client, TracAttribute.SUMMARY);
+ createAttribute(data, client, TracAttribute.DESCRIPTION);
+ if (existingTask) {
+ createAttribute(data, client, TracAttribute.TIME);
+ createAttribute(data, client, TracAttribute.CHANGE_TIME);
+ createAttribute(data, client, TracAttribute.STATUS);
+ createAttribute(data, client, TracAttribute.RESOLUTION);
+ }
+ createAttribute(data, client, TracAttribute.COMPONENT);
+ createAttribute(data, client, TracAttribute.VERSION);
+ createAttribute(data, client, TracAttribute.PRIORITY);
+ createAttribute(data, client, TracAttribute.SEVERITY);
+ createAttribute(data, client, TracAttribute.MILESTONE);
+ createAttribute(data, client, TracAttribute.TYPE);
+ createAttribute(data, client, TracAttribute.KEYWORDS);
+ // custom fields
+ TracTicketField[] fields = client.getTicketFields();
+ if (fields != null) {
+ for (TracTicketField field : fields) {
+ if (field.isCustom()) {
+ createAttribute(data, field);
+ }
+ }
+ }
+ // people
+ createAttribute(data, client, TracAttribute.OWNER);
+ if (existingTask) {
+ createAttribute(data, client, TracAttribute.REPORTER);
+ }
+ createAttribute(data, client, TracAttribute.CC);
+ if (existingTask) {
+ data.getRoot().createAttribute(TracAttributeMapper.NEW_CC).getMetaData().setType(
+ TaskAttribute.TYPE_SHORT_TEXT).setReadOnly(false);
+ data.getRoot().createAttribute(TracAttributeMapper.REMOVE_CC);
+ data.getRoot().createAttribute(TaskAttribute.COMMENT_NEW).getMetaData().setType(
+ TaskAttribute.TYPE_LONG_RICH_TEXT).setReadOnly(false);
+ }
+ // operations
+ data.getRoot().createAttribute(TaskAttribute.OPERATION).getMetaData().setType(TaskAttribute.TYPE_OPERATION);
+ }
+
+ private static TaskAttribute createAttribute(TaskData data, TracTicketField field) {
+ TaskAttribute attr = data.getRoot().createAttribute(field.getName());
+ TaskAttributeMetaData metaData = attr.getMetaData();
+ metaData.defaults();
+ metaData.setLabel(field.getLabel() + ":"); //$NON-NLS-1$
+ metaData.setKind(TaskAttribute.KIND_DEFAULT);
+ metaData.setReadOnly(false);
+ metaData.putValue(TRAC_KEY, field.getName());
+ if (field.getType() == TracTicketField.Type.CHECKBOX) {
+ // attr.addOption("True", "1");
+ // attr.addOption("False", "0");
+ metaData.setType(TaskAttribute.TYPE_BOOLEAN);
+ attr.putOption("1", "1"); //$NON-NLS-1$ //$NON-NLS-2$
+ attr.putOption("0", "0"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (field.getDefaultValue() != null) {
+ attr.setValue(field.getDefaultValue());
+ }
+ } else if (field.getType() == TracTicketField.Type.SELECT || field.getType() == TracTicketField.Type.RADIO) {
+ metaData.setType(TaskAttribute.TYPE_SINGLE_SELECT);
+ String[] values = field.getOptions();
+ if (values != null && values.length > 0) {
+ if (field.isOptional()) {
+ attr.putOption("", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ for (String value : values) {
+ attr.putOption(value, value);
+ }
+ if (field.getDefaultValue() != null) {
+ try {
+ int index = Integer.parseInt(field.getDefaultValue());
+ if (index > 0 && index < values.length) {
+ attr.setValue(values[index]);
+ }
+ } catch (NumberFormatException e) {
+ for (String value : values) {
+ if (field.getDefaultValue().equals(value.toString())) {
+ attr.setValue(value);
+ break;
+ }
+ }
+ }
+ }
+ }
+ } else if (field.getType() == TracTicketField.Type.TEXTAREA) {
+ metaData.setType(TaskAttribute.TYPE_LONG_TEXT);
+ if (field.getDefaultValue() != null) {
+ attr.setValue(field.getDefaultValue());
+ }
+ } else {
+ metaData.setType(TaskAttribute.TYPE_SHORT_TEXT);
+ if (field.getDefaultValue() != null) {
+ attr.setValue(field.getDefaultValue());
+ }
+ }
+ if (ATTRIBUTE_BLOCKED_BY.equals(field.getName()) || ATTRIBUTE_BLOCKING.equals(field.getName())) {
+ metaData.setType(TaskAttribute.TYPE_TASK_DEPENDENCY);
+ }
+ return attr;
+ }
+
+ public static TaskAttribute createAttribute(TaskData data, TracAttribute tracAttribute) {
+ return createAttribute(data, null, tracAttribute);
+ }
+
+ public static TaskAttribute createAttribute(TaskData data, ITracClient client, TracAttribute tracAttribute) {
+ TaskAttribute attr = data.getRoot().createAttribute(tracAttribute.getTracKey());
+ TaskAttributeMetaData metaData = attr.getMetaData();
+ metaData.setType(tracAttribute.getType());
+ metaData.setKind(tracAttribute.getKind());
+ metaData.setLabel(tracAttribute.toString());
+ metaData.setReadOnly(tracAttribute.isReadOnly());
+ metaData.putValue(TRAC_KEY, tracAttribute.getTracKey());
+ if (client != null) {
+ TracTicketField field = client.getTicketFieldByName(tracAttribute.getTracKey());
+ Map<String, String> values = TracAttributeMapper.getRepositoryOptions(client, attr.getId());
+ if (values != null && values.size() > 0) {
+ boolean setDefault = field == null || !field.isOptional();
+ for (Entry<String, String> value : values.entrySet()) {
+ attr.putOption(value.getKey(), value.getValue());
+ // set first value as default, may get overwritten below
+ if (setDefault) {
+ attr.setValue(value.getKey());
+ }
+ setDefault = false;
+ }
+ } else if (TaskAttribute.TYPE_SINGLE_SELECT.equals(tracAttribute.getType())) {
+ attr.getMetaData().setReadOnly(true);
+ }
+ if (field != null) {
+ String defaultValue = field.getDefaultValue();
+ if (defaultValue != null && defaultValue.length() > 0) {
+ attr.setValue(defaultValue);
+ }
+ }
+ }
+ return attr;
+ }
+
+ @Override
+ public RepositoryResponse postTaskData(TaskRepository repository, TaskData taskData,
+ Set<TaskAttribute> oldAttributes, IProgressMonitor monitor) throws CoreException {
+ try {
+ TracTicket ticket = TracTaskDataHandler.getTracTicket(repository, taskData);
+ ITracClient server = connector.getClientManager().getTracClient(repository);
+ if (taskData.isNew()) {
+ int id = server.createTicket(ticket, monitor);
+ return new RepositoryResponse(ResponseKind.TASK_CREATED, id + ""); //$NON-NLS-1$
+ } else {
+ String newComment = ""; //$NON-NLS-1$
+ TaskAttribute newCommentAttribute = taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW);
+ if (newCommentAttribute != null) {
+ newComment = newCommentAttribute.getValue();
+ }
+ server.updateTicket(ticket, newComment, monitor);
+ return new RepositoryResponse(ResponseKind.TASK_UPDATED, ticket.getId() + ""); //$NON-NLS-1$
+ }
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ // TODO catch TracException
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ }
+
+ @Override
+ public boolean initializeTaskData(TaskRepository repository, TaskData data, ITaskMapping initializationData,
+ IProgressMonitor monitor) throws CoreException {
+ try {
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ client.updateAttributes(monitor, false);
+ createDefaultAttributes(data, client, false);
+ removeEmptySingleSelectAttributes(data);
+ return true;
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ // TODO catch TracException
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ }
+ }
+
+ @Override
+ public boolean initializeSubTaskData(TaskRepository repository, TaskData taskData, TaskData parentTaskData,
+ IProgressMonitor monitor) throws CoreException {
+ initializeTaskData(repository, taskData, null, monitor);
+ TaskAttribute blockingAttribute = taskData.getRoot().getMappedAttribute(ATTRIBUTE_BLOCKING);
+ if (blockingAttribute == null) {
+ throw new CoreException(new RepositoryStatus(repository, IStatus.ERROR, TracCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_REPOSITORY, "The repository does not support subtasks")); //$NON-NLS-1$
+ }
+
+ TaskMapper mapper = new TaskMapper(taskData);
+ mapper.merge(new TaskMapper(parentTaskData));
+ mapper.setDescription(""); //$NON-NLS-1$
+ mapper.setSummary(""); //$NON-NLS-1$
+ blockingAttribute.setValue(parentTaskData.getTaskId());
+ TaskAttribute blockedByAttribute = taskData.getRoot().getMappedAttribute(ATTRIBUTE_BLOCKED_BY);
+ if (blockedByAttribute != null) {
+ blockedByAttribute.clearValues();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean canInitializeSubTaskData(TaskRepository taskRepository, ITask task) {
+ return Boolean.parseBoolean(task.getAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS));
+ }
+
+// /**
+// * Updates attributes of <code>taskData</code> from <code>ticket</code>.
+// */
+// public void updateTaskDataFromTicket(TaskData taskData, TracTicket ticket, ITracClient client) {
+// DefaultTaskSchema schema = new DefaultTaskSchema(taskData);
+// if (ticket.getValue(Key.SUMMARY) != null) {
+// schema.setSummary(ticket.getValue(Key.SUMMARY));
+// }
+//
+// if (TracRepositoryConnector.isCompleted(ticket.getValue(Key.STATUS))) {
+// schema.setCompletionDate(ticket.getLastChanged());
+// } else {
+// schema.setCompletionDate(null);
+// }
+//
+// String priority = ticket.getValue(Key.PRIORITY);
+// TracPriority[] tracPriorities = client.getPriorities();
+// schema.setPriority(TracRepositoryConnector.getTaskPriority(priority, tracPriorities));
+//
+// if (ticket.getValue(Key.TYPE) != null) {
+// TaskKind taskKind = TracRepositoryConnector.TaskKind.fromType(ticket.getValue(Key.TYPE));
+// schema.setTaskKind((taskKind != null) ? taskKind.toString() : ticket.getValue(Key.TYPE));
+// }
+//
+// if (ticket.getCreated() != null) {
+// schema.setCreationDate(ticket.getCreated());
+// }
+//
+// if (ticket.getCustomValue(TracTaskDataHandler.ATTRIBUTE_BLOCKING) != null) {
+// taskData.addAttribute(ATTRIBUTE_BLOCKED_BY, new TaskAttribute(ATTRIBUTE_BLOCKED_BY, "Blocked by", true));
+// }
+// }
+
+ @Override
+ public TaskAttributeMapper getAttributeMapper(TaskRepository repository) {
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ return new TracAttributeMapper(repository, client);
+ }
+
+ public boolean supportsSubtasks(TaskData taskData) {
+ return taskData.getRoot().getAttribute(ATTRIBUTE_BLOCKED_BY) != null;
+ }
+
+ public static TracTicket getTracTicket(TaskRepository repository, TaskData data) throws InvalidTicketException,
+ CoreException {
+ TracTicket ticket = (data.isNew()) ? new TracTicket() : new TracTicket(
+ TracRepositoryConnector.getTicketId(data.getTaskId()));
+
+ Collection<TaskAttribute> attributes = data.getRoot().getAttributes().values();
+ for (TaskAttribute attribute : attributes) {
+ if (TracAttributeMapper.isInternalAttribute(attribute)
+ || TracAttribute.RESOLUTION.getTracKey().equals(attribute.getId())) {
+ // ignore internal attributes, resolution is set through operations
+ } else if (!attribute.getMetaData().isReadOnly()) {
+ ticket.putValue(attribute.getId(), attribute.getValue());
+ }
+ }
+
+ // set cc value
+ StringBuilder sb = new StringBuilder();
+ List<String> removeValues = TracRepositoryConnector.getAttributeValues(data, TracAttributeMapper.REMOVE_CC);
+ List<String> values = TracRepositoryConnector.getAttributeValues(data, TaskAttribute.USER_CC);
+ for (String user : values) {
+ if (!removeValues.contains(user)) {
+ if (sb.length() > 0) {
+ sb.append(","); //$NON-NLS-1$
+ }
+ sb.append(user);
+ }
+ }
+ if (TracRepositoryConnector.getAttributeValue(data, TracAttributeMapper.NEW_CC).length() > 0) {
+ if (sb.length() > 0) {
+ sb.append(","); //$NON-NLS-1$
+ }
+ sb.append(TracRepositoryConnector.getAttributeValue(data, TracAttributeMapper.NEW_CC));
+ }
+ if (Boolean.TRUE.equals(TracRepositoryConnector.getAttributeValue(data, TaskAttribute.ADD_SELF_CC))) {
+ if (sb.length() > 0) {
+ sb.append(","); //$NON-NLS-1$
+ }
+ sb.append(repository.getUserName());
+ }
+ ticket.putBuiltinValue(Key.CC, sb.toString());
+
+ ticket.putValue("owner", TracRepositoryConnector.getAttributeValue(data, TaskAttribute.USER_ASSIGNED)); //$NON-NLS-1$
+
+ TaskAttribute operationAttribute = data.getRoot().getMappedAttribute(TaskAttribute.OPERATION);
+ if (operationAttribute != null) {
+ TaskOperation operation = TaskOperation.createFrom(operationAttribute);
+ String action = operation.getOperationId();
+ if (!"leave".equals(action)) { //$NON-NLS-1$
+ if ("accept".equals(action)) { //$NON-NLS-1$
+ ticket.putValue("status", TracRepositoryConnector.TaskStatus.ASSIGNED.toStatusString()); //$NON-NLS-1$
+ } else if ("resolve".equals(action)) { //$NON-NLS-1$
+ ticket.putValue("status", TracRepositoryConnector.TaskStatus.CLOSED.toStatusString()); //$NON-NLS-1$
+ ticket.putValue("resolution", TracRepositoryConnector.getAttributeValue(data, //$NON-NLS-1$
+ TaskAttribute.RESOLUTION));
+ } else if ("reopen".equals(action)) { //$NON-NLS-1$
+ ticket.putValue("status", TracRepositoryConnector.TaskStatus.REOPENED.toStatusString()); //$NON-NLS-1$
+ ticket.putValue("resolution", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ } else if ("reassign".equals(action)) { //$NON-NLS-1$
+ ticket.putValue("status", TracRepositoryConnector.TaskStatus.NEW.toStatusString()); //$NON-NLS-1$
+ }
+ }
+ ticket.putValue("action", action); //$NON-NLS-1$
+ }
+
+ return ticket;
+ }
+
+ @Override
+ public void migrateTaskData(TaskRepository taskRepository, TaskData taskData) {
+ int version = 0;
+ if (taskData.getVersion() != null) {
+ try {
+ version = Integer.parseInt(taskData.getVersion());
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+
+ if (version < 1) {
+ TaskAttribute root = taskData.getRoot();
+ List<TaskAttribute> attributes = new ArrayList<TaskAttribute>(root.getAttributes().values());
+ for (TaskAttribute attribute : attributes) {
+ if (TaskAttribute.TYPE_OPERATION.equals(attribute.getMetaData().getType())
+ && "reassign".equals(attribute.getValue())) { //$NON-NLS-1$
+ root.removeAttribute(attribute.getId());
+ } else if (TaskAttribute.OPERATION.equals(attribute.getId())) {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_OPERATION);
+ } else if (TracAttributeMapper.NEW_CC.equals(attribute.getId())) {
+ attribute.getMetaData().setType(TaskAttribute.TYPE_SHORT_TEXT).setReadOnly(false);
+ } else {
+ TracAttribute tracAttribute = TracAttribute.getByTracKey(attribute.getId());
+ if (tracAttribute != null) {
+ attribute.getMetaData().setType(tracAttribute.getType());
+ attribute.getMetaData().setKind(tracAttribute.getKind());
+ attribute.getMetaData().setReadOnly(tracAttribute.isReadOnly());
+ }
+ }
+ }
+ if (root.getAttribute(TracAttributeMapper.REMOVE_CC) == null) {
+ root.createAttribute(TracAttributeMapper.REMOVE_CC);
+ }
+ if (root.getAttribute(TaskAttribute.COMMENT_NEW) == null) {
+ root.createAttribute(TaskAttribute.COMMENT_NEW)
+ .getMetaData()
+ .setType(TaskAttribute.TYPE_LONG_RICH_TEXT)
+ .setReadOnly(false);
+ }
+ }
+ if (version < 2) {
+ List<TaskAttribute> attributes = new ArrayList<TaskAttribute>(taskData.getRoot().getAttributes().values());
+ for (TaskAttribute attribute : attributes) {
+ if (!TracAttributeMapper.isInternalAttribute(attribute)) {
+ TaskAttributeMetaData metaData = attribute.getMetaData();
+ metaData.putValue(TRAC_KEY, attribute.getId());
+ if (metaData.getType() == null) {
+ metaData.setType(TaskAttribute.TYPE_SHORT_TEXT);
+ }
+ }
+ }
+ taskData.setVersion(TASK_DATA_VERSION);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskMapper.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskMapper.java
new file mode 100644
index 0000000..0d49420
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracTaskMapper.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core;
+
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.TaskKind;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskMapper extends TaskMapper {
+
+ private final ITracClient client;
+
+ public TracTaskMapper(TaskData taskData, ITracClient client) {
+ super(taskData);
+ this.client = client;
+ }
+
+// @Override
+// public boolean applyTo(ITask task) {
+// boolean changed = false;
+// if (hasChanges(task.getCompletionDate(), TaskAttribute.DATE_COMPLETION)) {
+// task.setCompletionDate(getCompletionDate());
+// changed = true;
+// }
+// if (hasChanges(task.getCreationDate(), TaskAttribute.DATE_CREATION)) {
+// task.setCreationDate(getCreationDate());
+// changed = true;
+// }
+// if (hasChanges(task.getModificationDate(), TaskAttribute.DATE_MODIFICATION)) {
+// task.setModificationDate(getModificationDate());
+// changed = true;
+// }
+// if (hasChanges(task.getDueDate(), TaskAttribute.DATE_DUE)) {
+// task.setDueDate(getDueDate());
+// changed = true;
+// }
+// if (hasChanges(task.getOwner(), TaskAttribute.USER_ASSIGNED)) {
+// task.setOwner(getOwner());
+// changed = true;
+// }
+// if (hasChanges(task.getPriority(), TaskAttribute.PRIORITY)) {
+// if (getPriorityLevel() != null) {
+// task.setPriority(getPriorityLevel().toString());
+// } else {
+// task.setPriority(PriorityLevel.getDefault().toString());
+// }
+// changed = true;
+// }
+// if (hasChanges(task.getSummary(), TaskAttribute.SUMMARY)) {
+// task.setSummary(getSummary());
+// changed = true;
+// }
+// if (hasChanges(task.getTaskKey(), TaskAttribute.TASK_KEY)) {
+// task.setTaskKey(getTaskKey());
+// changed = true;
+// }
+// if (hasChanges(task.getTaskKind(), TaskAttribute.TASK_KIND)) {
+// task.setTaskKind(getTaskKind());
+// changed = true;
+// }
+// if (hasChanges(task.getUrl(), TaskAttribute.TASK_URL)) {
+// task.setUrl(getTaskUrl());
+// changed = true;
+// }
+// return changed;
+// }
+//
+// @Override
+// public boolean hasChanges(ITask task) {
+// boolean changed = false;
+// changed |= hasChanges(task.getCompletionDate(), TaskAttribute.DATE_COMPLETION);
+// changed |= hasChanges(task.getCreationDate(), TaskAttribute.DATE_CREATION);
+// changed |= hasChanges(task.getModificationDate(), TaskAttribute.DATE_MODIFICATION);
+// changed |= hasChanges(task.getDueDate(), TaskAttribute.DATE_DUE);
+// changed |= hasChanges(task.getOwner(), TaskAttribute.USER_ASSIGNED);
+// changed |= hasChanges(task.getPriority(), TaskAttribute.PRIORITY);
+// changed |= hasChanges(task.getSummary(), TaskAttribute.SUMMARY);
+// changed |= hasChanges(task.getTaskKey(), TaskAttribute.TASK_KEY);
+// changed |= hasChanges(task.getTaskKind(), TaskAttribute.TASK_KIND);
+// changed |= hasChanges(task.getUrl(), TaskAttribute.TASK_URL);
+// return changed;
+// }
+//
+// private boolean hasChanges(Object value, String attributeKey) {
+// TaskData taskData = getTaskData();
+// TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
+// if (attribute != null) {
+// if (TaskAttribute.TYPE_BOOLEAN.equals(attribute.getMetaData().getType())) {
+// return areNotEquals(value, taskData.getAttributeMapper().getBooleanValue(attribute));
+// } else if (TaskAttribute.TYPE_DATE.equals(attribute.getMetaData().getType())) {
+// return areNotEquals(value, taskData.getAttributeMapper().getDateValue(attribute));
+// } else if (TaskAttribute.TYPE_INTEGER.equals(attribute.getMetaData().getType())) {
+// return areNotEquals(value, taskData.getAttributeMapper().getIntegerValue(attribute));
+// } else if (TaskAttribute.PRIORITY.equals(attributeKey)) {
+// PriorityLevel priorityLevel = getPriorityLevel();
+// return areNotEquals(value, (priorityLevel != null) ? priorityLevel.toString() : getPriority());
+// } else if (TaskAttribute.TASK_KIND.equals(attributeKey)) {
+// return areNotEquals(value, getTaskKind());
+// } else {
+// return areNotEquals(value, taskData.getAttributeMapper().getValue(attribute));
+// }
+// }
+// return false;
+// }
+//
+// private boolean areNotEquals(Object existingProperty, Object newProperty) {
+// return (existingProperty != null) ? !existingProperty.equals(newProperty) : newProperty != null;
+// }
+
+ @Override
+ public PriorityLevel getPriorityLevel() {
+ if (client != null) {
+ String priority = getPriority();
+ TracPriority[] tracPriorities = client.getPriorities();
+ return TracRepositoryConnector.getTaskPriority(priority, tracPriorities);
+ }
+ return null;
+ }
+
+ @Override
+ public String getTaskKind() {
+ String tracTaskKind = super.getTaskKind();
+ TaskKind taskKind = TaskKind.fromType(tracTaskKind);
+ return (taskKind != null) ? taskKind.toString() : tracTaskKind;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracWikiHandler.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracWikiHandler.java
new file mode 100644
index 0000000..e38e04a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracWikiHandler.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.client.AbstractWikiHandler;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracWikiClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Xiaoyang Guan
+ */
+public class TracWikiHandler extends AbstractWikiHandler {
+
+ private final TracRepositoryConnector connector;
+
+ public TracWikiHandler(TracRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ @Override
+ public String[] downloadAllPageNames(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
+ monitor.beginTask(Messages.TracWikiHandler_Download_Wiki_Page_Names, IProgressMonitor.UNKNOWN);
+ try {
+ String[] names = getTracWikiClient(repository).getAllWikiPageNames(monitor);
+ return names;
+ } catch (TracException e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public TracWikiPage getWikiPage(TaskRepository repository, String pageName, IProgressMonitor monitor)
+ throws CoreException {
+ monitor.beginTask(Messages.TracWikiHandler_Download_Wiki_Page, IProgressMonitor.UNKNOWN);
+ try {
+ TracWikiPage page = getTracWikiClient(repository).getWikiPage(pageName, monitor);
+ return page;
+ } catch (TracException e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public void postWikiPage(TaskRepository repository, TracWikiPage newPage, IProgressMonitor monitor)
+ throws CoreException {
+ monitor.beginTask(Messages.TracWikiHandler_Upload_Wiki_Page, IProgressMonitor.UNKNOWN);
+ try {
+ String pageName = newPage.getPageInfo().getPageName();
+ String content = newPage.getContent();
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("comment", newPage.getPageInfo().getComment()); //$NON-NLS-1$
+ attributes.put("author", newPage.getPageInfo().getAuthor()); //$NON-NLS-1$
+ boolean success = getTracWikiClient(repository).putWikipage(pageName, content, attributes, monitor);
+ if (success) {
+ return;
+ } else {
+ throw new CoreException(TracCorePlugin.toStatus(new TracException(
+ "Failed to upload wiki page. No further information available."), repository)); //$NON-NLS-1$
+ }
+ } catch (TracException e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ @Override
+ public TracWikiPageInfo[] getPageHistory(TaskRepository repository, String pageName, IProgressMonitor monitor)
+ throws CoreException {
+ monitor.beginTask(Messages.TracWikiHandler_Retrieve_Wiki_Page_History, IProgressMonitor.UNKNOWN);
+ try {
+ TracWikiPageInfo[] versions = getTracWikiClient(repository).getWikiPageInfoAllVersions(pageName, monitor);
+ return versions;
+ } catch (TracException e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ } finally {
+ monitor.done();
+ }
+ }
+
+ private ITracWikiClient getTracWikiClient(TaskRepository repository) throws TracException {
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ if (client instanceof ITracWikiClient) {
+ return (ITracWikiClient) client;
+ } else {
+ throw new TracException("The access mode of " + repository.toString() //$NON-NLS-1$
+ + " does not support Wiki page editting."); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public String getWikiUrl(TaskRepository repository) {
+ return repository.getRepositoryUrl() + ITracClient.WIKI_URL;
+ }
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/AbstractTracClient.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/AbstractTracClient.java
new file mode 100644
index 0000000..cb113e0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/AbstractTracClient.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.Proxy;
+import java.net.URL;
+import java.util.HashMap;
+
+import org.apache.commons.httpclient.Cookie;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.cookie.CookiePolicy;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.internal.trac.core.model.TracComponent;
+import org.eclipse.mylyn.internal.trac.core.model.TracMilestone;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracSeverity;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketResolution;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketStatus;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketType;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTracClient implements ITracClient {
+
+ protected static final boolean DEBUG_AUTH = Boolean.valueOf(Platform.getDebugOption("org.eclipse.mylyn.trac.core/debug/authentication")); //$NON-NLS-1$
+
+ protected static final String USER_AGENT = "TracConnector"; //$NON-NLS-1$
+
+ private static final String LOGIN_COOKIE_NAME = "trac_auth"; //$NON-NLS-1$
+
+ protected final String repositoryUrl;
+
+ protected final Version version;
+
+ protected final AbstractWebLocation location;
+
+ protected TracClientData data;
+
+ public AbstractTracClient(URL repositoryUrl, Version version, String username, String password, Proxy proxy) {
+ this.repositoryUrl = repositoryUrl.toString();
+ this.version = version;
+
+ this.location = null;
+
+ this.data = new TracClientData();
+ }
+
+ public AbstractTracClient(AbstractWebLocation location, Version version) {
+ this.location = location;
+ this.version = version;
+ this.repositoryUrl = location.getUrl();
+
+ this.data = new TracClientData();
+ }
+
+ protected HttpClient createHttpClient() {
+ HttpClient httpClient = new HttpClient();
+ httpClient.setHttpConnectionManager(WebUtil.getConnectionManager());
+ httpClient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
+ WebUtil.configureHttpClient(httpClient, USER_AGENT);
+ return httpClient;
+ }
+
+ public Version getVersion() {
+ return version;
+ }
+
+ protected boolean credentialsValid(AuthenticationCredentials credentials) {
+ return credentials != null && credentials.getUserName().length() > 0;
+ }
+
+ protected void authenticateAccountManager(HttpClient httpClient, HostConfiguration hostConfiguration,
+ AuthenticationCredentials credentials, IProgressMonitor monitor) throws IOException, TracLoginException {
+ PostMethod post = new PostMethod(WebUtil.getRequestPath(repositoryUrl + LOGIN_URL));
+ post.setFollowRedirects(false);
+ String formToken = getFormToken(httpClient);
+ NameValuePair[] data = { new NameValuePair("referer", ""), //$NON-NLS-1$ //$NON-NLS-2$
+ new NameValuePair("user", credentials.getUserName()), //$NON-NLS-1$
+ new NameValuePair("password", credentials.getPassword()), new NameValuePair("__FORM_TOKEN", formToken) }; //$NON-NLS-1$ //$NON-NLS-2$
+
+ post.setRequestBody(data);
+ try {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Attempting form-based account manager authentication"); //$NON-NLS-1$
+ }
+ int code = WebUtil.execute(httpClient, hostConfiguration, post, monitor);
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Received account manager response (" + code + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ // code should be a redirect in case of success
+ if (code == HttpURLConnection.HTTP_OK) {
+ throw new TracLoginException();
+ }
+ } finally {
+ post.releaseConnection();
+ }
+ }
+
+ private String getFormToken(HttpClient httpClient) {
+ Cookie[] cookies = httpClient.getState().getCookies();
+ for (Cookie cookie : cookies) {
+ if ("trac_form_token".equals(cookie.getName())) { //$NON-NLS-1$
+ return cookie.getValue();
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * Check if authentication cookie has been set.
+ *
+ * @throws TracLoginException
+ * thrown if the cookie has not been set
+ */
+ protected void validateAuthenticationState(HttpClient httpClient) throws TracLoginException {
+ Cookie[] cookies = httpClient.getState().getCookies();
+ for (Cookie cookie : cookies) {
+ if (LOGIN_COOKIE_NAME.equals(cookie.getName())) {
+ return;
+ }
+ }
+
+ throw new TracLoginException();
+ }
+
+ public TracComponent[] getComponents() {
+ return (data.components != null) ? data.components.toArray(new TracComponent[0]) : null;
+ }
+
+ public TracMilestone[] getMilestones() {
+ return (data.milestones != null) ? data.milestones.toArray(new TracMilestone[0]) : null;
+ }
+
+ public TracPriority[] getPriorities() {
+ return (data.priorities != null) ? data.priorities.toArray(new TracPriority[0]) : null;
+ }
+
+ public TracSeverity[] getSeverities() {
+ return (data.severities != null) ? data.severities.toArray(new TracSeverity[0]) : null;
+ }
+
+ public TracTicketField[] getTicketFields() {
+ return (data.ticketFields != null) ? data.ticketFields.toArray(new TracTicketField[0]) : null;
+ }
+
+ public TracTicketField getTicketFieldByName(String name) {
+ if (data.ticketFields != null) {
+ // lazily fill fieldByName map
+ if (data.ticketFieldByName == null) {
+ synchronized (data) {
+ if (data.ticketFieldByName == null) {
+ data.ticketFieldByName = new HashMap<String, TracTicketField>();
+ for (TracTicketField field : data.ticketFields) {
+ data.ticketFieldByName.put(field.getName(), field);
+ }
+ }
+ }
+ }
+ return data.ticketFieldByName.get(name);
+ }
+ return null;
+ }
+
+ public TracTicketResolution[] getTicketResolutions() {
+ return (data.ticketResolutions != null) ? data.ticketResolutions.toArray(new TracTicketResolution[0]) : null;
+ }
+
+ public TracTicketStatus[] getTicketStatus() {
+ return (data.ticketStatus != null) ? data.ticketStatus.toArray(new TracTicketStatus[0]) : null;
+ }
+
+ public TracTicketType[] getTicketTypes() {
+ return (data.ticketTypes != null) ? data.ticketTypes.toArray(new TracTicketType[0]) : null;
+ }
+
+ public TracVersion[] getVersions() {
+ return (data.versions != null) ? data.versions.toArray(new TracVersion[0]) : null;
+ }
+
+ public boolean hasAttributes() {
+ return (data.lastUpdate != 0);
+ }
+
+ public void updateAttributes(IProgressMonitor monitor, boolean force) throws TracException {
+ if (!hasAttributes() || force) {
+ updateAttributes(monitor);
+ data.lastUpdate = System.currentTimeMillis();
+ }
+ }
+
+ public abstract void updateAttributes(IProgressMonitor monitor) throws TracException;
+
+ public void setData(TracClientData data) {
+ this.data = data;
+ }
+
+ public String[] getDefaultTicketResolutions() {
+ return new String[] { "fixed", "invalid", "wontfix", "duplicate", "worksforme" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ }
+
+ public String[] getDefaultTicketActions(String status) {
+ if ("new".equals(status)) { //$NON-NLS-1$
+ return new String[] { "leave", "resolve", "reassign", "accept" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ } else if ("assigned".equals(status)) { //$NON-NLS-1$
+ return new String[] { "leave", "resolve", "reassign" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ } else if ("reopened".equals(status)) { //$NON-NLS-1$
+ return new String[] { "leave", "resolve", "reassign" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ } else if ("closed".equals(status)) { //$NON-NLS-1$
+ return new String[] { "leave", "reopen" }; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/AbstractWikiHandler.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/AbstractWikiHandler.java
new file mode 100644
index 0000000..c3c325e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/AbstractWikiHandler.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.client;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Xiaoyang Guan
+ */
+public abstract class AbstractWikiHandler {
+
+ public abstract String[] downloadAllPageNames(TaskRepository repository, IProgressMonitor monitor)
+ throws CoreException;
+
+ public abstract String getWikiUrl(TaskRepository repository);
+
+ public abstract TracWikiPage getWikiPage(TaskRepository repository, String pageName, IProgressMonitor monitor)
+ throws CoreException;
+
+ public abstract void postWikiPage(TaskRepository repository, TracWikiPage page, IProgressMonitor monitor)
+ throws CoreException;
+
+ public abstract TracWikiPageInfo[] getPageHistory(TaskRepository repository, String pageName,
+ IProgressMonitor monitor) throws CoreException;
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/ITracClient.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/ITracClient.java
new file mode 100644
index 0000000..0c0f4fc
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/ITracClient.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+import java.io.InputStream;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.model.TracComponent;
+import org.eclipse.mylyn.internal.trac.core.model.TracMilestone;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSeverity;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketResolution;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketStatus;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketType;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+
+/**
+ * Defines the requirements for classes that provide remote access to Trac repositories.
+ *
+ * @author Steffen Pingel
+ */
+public interface ITracClient {
+
+ public enum Version {
+ XML_RPC, TRAC_0_9;
+
+ public static Version fromVersion(String version) {
+ try {
+ return Version.valueOf(version);
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case TRAC_0_9:
+ return "Web"; //$NON-NLS-1$
+ case XML_RPC:
+ return "XML-RPC"; //$NON-NLS-1$
+ default:
+ return null;
+ }
+ }
+
+ }
+
+ public static final String CHARSET = "UTF-8"; //$NON-NLS-1$
+
+ public static final String TIME_ZONE = "UTC"; //$NON-NLS-1$
+
+ public static final String LOGIN_URL = "/login"; //$NON-NLS-1$
+
+ public static final String QUERY_URL = "/query?format=tab"; //$NON-NLS-1$
+
+ public static final String TICKET_URL = "/ticket/"; //$NON-NLS-1$
+
+ public static final String NEW_TICKET_URL = "/newticket"; //$NON-NLS-1$
+
+ public static final String CUSTOM_QUERY_URL = "/query"; //$NON-NLS-1$
+
+ public static final String TICKET_ATTACHMENT_URL = "/attachment/ticket/"; //$NON-NLS-1$
+
+ public static final String DEFAULT_USERNAME = "anonymous"; //$NON-NLS-1$
+
+ public static final String WIKI_URL = "/wiki/"; //$NON-NLS-1$
+
+ public static final String REPORT_URL = "/report/"; //$NON-NLS-1$
+
+ public static final String CHANGESET_URL = "/changeset/"; //$NON-NLS-1$
+
+ public static final String REVISION_LOG_URL = "/log/"; //$NON-NLS-1$
+
+ public static final String MILESTONE_URL = "/milestone/"; //$NON-NLS-1$
+
+ public static final String BROWSER_URL = "/browser/"; //$NON-NLS-1$
+
+ public static final String ATTACHMENT_URL = "/attachment/ticket/"; //$NON-NLS-1$
+
+ /**
+ * Gets ticket with <code>id</code> from repository.
+ *
+ * @param id
+ * the id of the ticket to get
+ * @param monitor
+ * TODO
+ * @return the ticket
+ * @throws TracException
+ * thrown in case of a connection error
+ */
+ TracTicket getTicket(int id, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Returns the access type.
+ */
+ Version getVersion();
+
+ /**
+ * Queries tickets from repository. All found tickets are added to <code>result</code>.
+ *
+ * @param query
+ * the search criteria
+ * @param result
+ * the list of found tickets
+ * @throws TracException
+ * thrown in case of a connection error
+ */
+ void search(TracSearch query, List<TracTicket> result, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Queries ticket id from repository. All found tickets are added to <code>result</code>.
+ *
+ * @param query
+ * the search criteria
+ * @param result
+ * the list of found tickets
+ * @throws TracException
+ * thrown in case of a connection error
+ */
+ void searchForTicketIds(TracSearch query, List<Integer> result, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Validates the repository connection.
+ *
+ * @return information about the repository
+ * @throws TracException
+ * thrown in case of a connection error
+ */
+ TracRepositoryInfo validate(IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Returns true, if the repository details are cached. If this method returns true, invoking
+ * <tt>updateAttributes(monitor, false)</tt> will return without opening a connection.
+ *
+ * @see #updateAttributes(IProgressMonitor, boolean)
+ */
+ boolean hasAttributes();
+
+ /**
+ * Updates cached repository details: milestones, versions etc.
+ *
+ * @throws TracException
+ * thrown in case of a connection error
+ */
+ void updateAttributes(IProgressMonitor monitor, boolean force) throws TracException;
+
+ TracComponent[] getComponents();
+
+ TracTicketField[] getTicketFields();
+
+ TracTicketField getTicketFieldByName(String tracKey);
+
+ TracMilestone[] getMilestones();
+
+ TracPriority[] getPriorities();
+
+ TracSeverity[] getSeverities();
+
+ TracTicketResolution[] getTicketResolutions();
+
+ TracTicketStatus[] getTicketStatus();
+
+ TracTicketType[] getTicketTypes();
+
+ TracVersion[] getVersions();
+
+ InputStream getAttachmentData(int ticketId, String filename, IProgressMonitor monitor) throws TracException;
+
+ void putAttachmentData(int ticketId, String name, String description, InputStream source, IProgressMonitor monitor)
+ throws TracException;
+
+ void deleteAttachment(int ticketId, String filename, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * @return the id of the created ticket
+ */
+ int createTicket(TracTicket ticket, IProgressMonitor monitor) throws TracException;
+
+ void updateTicket(TracTicket ticket, String comment, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Sets a reference to the cached repository attributes.
+ *
+ * @param data
+ * cached repository attributes
+ */
+ void setData(TracClientData data);
+
+ Set<Integer> getChangedTickets(Date since, IProgressMonitor monitor) throws TracException;
+
+ Date getTicketLastChanged(Integer id, IProgressMonitor monitor) throws TracException;
+
+ void deleteTicket(int ticketId, IProgressMonitor monitor) throws TracException;
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/ITracWikiClient.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/ITracWikiClient.java
new file mode 100644
index 0000000..ccf452a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/ITracWikiClient.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.client;
+
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
+
+/**
+ * Interface for the WikiRPC API provided by the Trac XML-RPC Plugin
+ *
+ * @author Xiaoyang Guan
+ * @since 2.1
+ */
+public interface ITracWikiClient {
+
+ /**
+ * Render arbitrary wiki text as HTML
+ *
+ * @param sourceText
+ * wiki source text
+ * @param monitor
+ * TODO
+ * @return The HTML-formatted string of the wiki text
+ * @throws TracException
+ * thrown in case of a connection error
+ */
+ public String wikiToHtml(String sourceText, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Validates the Trac XML-RPC WikiRPC API version of the repository
+ *
+ * @param monitor
+ * TODO
+ *
+ * @throws TracException
+ */
+ public void validateWikiRpcApi(IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the list of the names of all pages from the repository
+ *
+ * @param monitor
+ * TODO
+ *
+ * @return The array of the names of all Wiki pages
+ * @throws TracException
+ */
+ public String[] getAllWikiPageNames(IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the latest version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param monitor
+ * TODO
+ * @return the Wiki page at the latest version
+ * @throws TracException
+ */
+ public TracWikiPage getWikiPage(String pageName, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets a specific version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param version
+ * the version of the Wiki page
+ * @param monitor
+ * TODO
+ * @return the Wiki page at the specified version
+ * @throws TracException
+ */
+ public TracWikiPage getWikiPage(String pageName, int version, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the information about the latest version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param monitor
+ * TODO
+ * @return The information about the page at the latest version
+ * @throws TracException
+ */
+ public TracWikiPageInfo getWikiPageInfo(String pageName, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the information about the specified version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param version
+ * the version of the Wiki page
+ * @param monitor
+ * TODO
+ * @return The information about the page at the specified version
+ * @throws TracException
+ */
+ public TracWikiPageInfo getWikiPageInfo(String pageName, int version, IProgressMonitor monitor)
+ throws TracException;
+
+ /**
+ * Gets the information about all versions of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param monitor
+ * TODO
+ * @return array of TracWikiPageInfo that contains the information about all versions of the page
+ * @throws TracException
+ */
+ public TracWikiPageInfo[] getWikiPageInfoAllVersions(String pageName, IProgressMonitor monitor)
+ throws TracException;
+
+ /**
+ * Gets the raw Wiki text of the latest version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param monitor
+ * TODO
+ * @return the raw Wiki text of the page, latest version
+ * @throws TracException
+ */
+ public String getWikiPageContent(String pageName, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the raw Wiki text of the specified version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param version
+ * the version of the Wiki page
+ * @param monitor
+ * TODO
+ * @return the raw Wiki text of the page, specified version
+ * @throws TracException
+ */
+ public String getWikiPageContent(String pageName, int version, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the rendered HTML of the latest version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param monitor
+ * TODO
+ * @return the rendered HTML of the page, latest version
+ * @throws TracException
+ */
+ public String getWikiPageHtml(String pageName, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the rendered HTML of the specified version of a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param version
+ * the version of the Wiki page
+ * @param monitor
+ * TODO
+ * @return the rendered HTML of the page, specified version
+ * @throws TracException
+ */
+ public String getWikiPageHtml(String pageName, int version, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the list of information about all pages that have been modified since a given date from the repository
+ *
+ * @param since
+ * the date from which the changes to the Wiki pages should be retrieved
+ * @param monitor
+ * TODO
+ * @return array of TracWikiPageInfo that contains the information about the modified pages
+ * @throws TracException
+ */
+ public TracWikiPageInfo[] getRecentWikiChanges(Date since, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Writes the content of a Wiki page to the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param content
+ * the content of the page to be written
+ * @param attributes
+ * a Map used to set any Wiki-specific things, which the server can freely ignore or incorporate.
+ * Standard names are:
+ * <ul>
+ * <li>comment (String): A comment for the page.
+ * <li>minoredit (Boolean): This was a minor edit only.
+ * </ul>
+ * @param monitor
+ * TODO
+ * @return <code>true</code> if successful
+ * @throws TracException
+ */
+ public boolean putWikipage(String pageName, String content, Map<String, Object> attributes, IProgressMonitor monitor)
+ throws TracException;
+
+ /**
+ * Gets the list of the names of attachments on a given Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param monitor
+ * TODO
+ * @return an array of the names of attachments on the given page. Returns an empty array if the page has no
+ * attachment or the page does not exist.
+ * @throws TracException
+ */
+ public String[] listWikiPageAttachments(String pageName, IProgressMonitor monitor) throws TracException;
+
+ /**
+ * Gets the content of an attachment on a Wiki page from the repository
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param fileName
+ * the name of the attachment file
+ * @param monitor
+ * TODO
+ * @return An InputStream of the content of the attachment
+ * @throws TracException
+ */
+ public InputStream getWikiPageAttachmentData(String pageName, String fileName, IProgressMonitor monitor)
+ throws TracException;
+
+ /**
+ * Attach a file to a Wiki page on the repository.
+ * <p>
+ * Note: The standard implementation of WikiRPC API for uploading attachments may ignore the description of the
+ * attachment and always use <code>true</code> for <code>replace</code>
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param fileName
+ * the name of the file to be attached
+ * @param description
+ * the description of the attachment
+ * @param in
+ * An InputStream of the content of the attachment
+ * @param replace
+ * whether to overwrite an existing attachment with the same filename
+ * @param monitor
+ * TODO
+ * @return The (possibly transformed) filename of the attachment. If <code>replace</code> is <code>true</code>, the
+ * returned name is always the same as the argument <code>fileName</code>; if <code>replace</code> is
+ * <code>false</code> and an attachment with name <code>fileName</code> already exists, a different name is
+ * generated for the new attachment by the repository server and the new name is returned.
+ * @throws TracException
+ */
+ public String putWikiPageAttachmentData(String pageName, String fileName, String description, InputStream in,
+ boolean replace, IProgressMonitor monitor) throws TracException;
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/InvalidTicketException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/InvalidTicketException.java
new file mode 100644
index 0000000..99c5509
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/InvalidTicketException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+/**
+ * Indicates an error while parsing a ticket retrieved from a repository.
+ *
+ * @author Steffen Pingel
+ */
+public class InvalidTicketException extends TracException {
+
+ private static final long serialVersionUID = 7716941243394876876L;
+
+ public InvalidTicketException(String message) {
+ super(message);
+ }
+
+ public InvalidTicketException() {
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/InvalidWikiPageException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/InvalidWikiPageException.java
new file mode 100644
index 0000000..88fac57
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/InvalidWikiPageException.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.client;
+
+/**
+ * Indicates an error while parsing the page info retrieved from a repository. If the requested page name or version
+ * doesn't exist on the repository, the XmlRpcPlugin returns an Integer of 0 without generating any error info.
+ *
+ * @author Xiaoyang Guan
+ */
+public class InvalidWikiPageException extends TracRemoteException {
+
+ private static final long serialVersionUID = 7505355497334178587L;
+
+ public InvalidWikiPageException() {
+ }
+
+ public InvalidWikiPageException(String message) {
+ super(message);
+ }
+
+ public InvalidWikiPageException(Throwable cause) {
+ super(cause);
+ }
+
+ public InvalidWikiPageException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/Messages.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/Messages.java
new file mode 100644
index 0000000..1356ad7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.core.client;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.trac.core.client.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TracWebClient_Trac_version_X_is_unsupported_Error;
+ public static String TracWebClient_Updating_attributes;
+ public static String TracXmlRpcClient_API_version_unsupported_Error;
+ public static String TracXmlRpcClient_API_version_X_unsupported_Error;
+ public static String TracXmlRpcClient_Required_API_calls_missing_Error;
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracClientData.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracClientData.java
new file mode 100644
index 0000000..a1ef2db
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracClientData.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.internal.trac.core.model.TracComponent;
+import org.eclipse.mylyn.internal.trac.core.model.TracMilestone;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracSeverity;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketResolution;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketStatus;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketType;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+
+public class TracClientData implements Serializable {
+
+ private static final long serialVersionUID = 6891961984245981675L;
+
+ List<TracComponent> components;
+
+ List<TracMilestone> milestones;
+
+ List<TracPriority> priorities;
+
+ List<TracSeverity> severities;
+
+ List<TracTicketField> ticketFields;
+
+ List<TracTicketResolution> ticketResolutions;
+
+ List<TracTicketStatus> ticketStatus;
+
+ List<TracTicketType> ticketTypes;
+
+ List<TracVersion> versions;
+
+ long lastUpdate;
+
+ transient Map<String, TracTicketField> ticketFieldByName;
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracException.java
new file mode 100644
index 0000000..32957d2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracException.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+/**
+ * Indicates an error during repository access.
+ *
+ * @author Steffen Pingel
+ */
+public class TracException extends Exception {
+
+ private static final long serialVersionUID = 1929614326467463462L;
+
+ public TracException() {
+ }
+
+ public TracException(String message) {
+ super(message);
+ }
+
+ public TracException(Throwable cause) {
+ super(cause.getMessage(), cause);
+ }
+
+ public TracException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracLoginException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracLoginException.java
new file mode 100644
index 0000000..88379ff
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracLoginException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+/**
+ * Indicates an authentication error during login.
+ *
+ * @author Steffen Pingel
+ */
+public class TracLoginException extends TracException {
+
+ private static final long serialVersionUID = -6128773690643367414L;
+
+ public TracLoginException() {
+ }
+
+ public TracLoginException(String message) {
+ super(message);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracNoSuchMethodException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracNoSuchMethodException.java
new file mode 100644
index 0000000..e0af4fe
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracNoSuchMethodException.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+import org.apache.xmlrpc.XmlRpcException;
+
+public class TracNoSuchMethodException extends TracException {
+
+ private static final long serialVersionUID = 9075003728286406705L;
+
+ public TracNoSuchMethodException(XmlRpcException e) {
+ super(e);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracPermissionDeniedException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracPermissionDeniedException.java
new file mode 100644
index 0000000..f592338
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracPermissionDeniedException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+/**
+ * Indicates insufficient permissions to execute an operation.
+ *
+ * @author Steffen Pingel
+ */
+public class TracPermissionDeniedException extends TracException {
+
+ private static final long serialVersionUID = -6128773690643367414L;
+
+ public TracPermissionDeniedException() {
+ }
+
+ public TracPermissionDeniedException(String message) {
+ super(message);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracProxyAuthenticationException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracProxyAuthenticationException.java
new file mode 100644
index 0000000..3e24192
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracProxyAuthenticationException.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+public class TracProxyAuthenticationException extends TracException {
+
+ private static final long serialVersionUID = 305145749259511429L;
+
+ public TracProxyAuthenticationException(String message) {
+ super(message);
+ }
+
+ public TracProxyAuthenticationException() {
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracRemoteException.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracRemoteException.java
new file mode 100644
index 0000000..4b7bc51
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracRemoteException.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+/**
+ * Indicates that an exception on the repository side has been encountered while processing the request.
+ *
+ * @author Steffen Pingel
+ */
+public class TracRemoteException extends TracException {
+
+ private static final long serialVersionUID = -6761365344287289624L;
+
+ public TracRemoteException() {
+ }
+
+ public TracRemoteException(String message) {
+ super(message);
+ }
+
+ public TracRemoteException(Throwable cause) {
+ super(cause);
+ }
+
+ public TracRemoteException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracWebClient.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracWebClient.java
new file mode 100644
index 0000000..5fd6c48
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracWebClient.java
@@ -0,0 +1,820 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.client;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StreamTokenizer;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import javax.swing.text.html.HTML.Tag;
+
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer;
+import org.eclipse.mylyn.commons.net.HtmlTag;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.commons.net.UnsupportedRequestException;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.model.TracComponent;
+import org.eclipse.mylyn.internal.trac.core.model.TracMilestone;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter;
+import org.eclipse.mylyn.internal.trac.core.model.TracSeverity;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketResolution;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketStatus;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketType;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.internal.trac.core.util.TracHttpClientTransportFactory.TracHttpException;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Represents a Trac repository that is accessed through the Trac's query script and web interface.
+ *
+ * @author Steffen Pingel
+ */
+public class TracWebClient extends AbstractTracClient {
+
+ private class Request {
+
+ private final String url;
+
+ private HostConfiguration hostConfiguration;
+
+ public Request(String url) {
+ this.url = url;
+ }
+
+ public GetMethod execute(IProgressMonitor monitor) throws TracLoginException, IOException, TracHttpException {
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+
+ for (int attempt = 0; attempt < 2; attempt++) {
+ // force authentication
+ if (!authenticated) {
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ if (credentialsValid(credentials)) {
+ authenticate(monitor);
+ }
+ }
+
+ GetMethod method = new GetMethod(WebUtil.getRequestPath(url));
+ int code;
+ try {
+ code = WebUtil.execute(httpClient, hostConfiguration, method, monitor);
+ } catch (IOException e) {
+ method.releaseConnection();
+ throw e;
+ }
+
+ if (code == HttpURLConnection.HTTP_OK) {
+ return method;
+ } else if (code == HttpURLConnection.HTTP_UNAUTHORIZED || code == HttpURLConnection.HTTP_FORBIDDEN) {
+ // login or re-authenticate due to an expired session
+ method.releaseConnection();
+ authenticated = false;
+ authenticate(monitor);
+ } else {
+ throw new TracHttpException(code);
+ }
+ }
+
+ throw new TracLoginException();
+ }
+
+ private void authenticate(IProgressMonitor monitor) throws TracLoginException, IOException {
+ while (true) {
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ if (!credentialsValid(credentials)) {
+ throw new TracLoginException();
+ }
+
+ // try standard basic/digest/ntlm authentication first
+ AuthScope authScope = new AuthScope(WebUtil.getHost(repositoryUrl), WebUtil.getPort(repositoryUrl),
+ null, AuthScope.ANY_SCHEME);
+ httpClient.getState().setCredentials(authScope,
+ WebUtil.getHttpClientCredentials(credentials, WebUtil.getHost(repositoryUrl)));
+
+ GetMethod method = new GetMethod(WebUtil.getRequestPath(repositoryUrl + LOGIN_URL));
+ method.setFollowRedirects(false);
+ int code;
+ try {
+ code = WebUtil.execute(httpClient, hostConfiguration, method, monitor);
+ if (needsReauthentication(code, monitor)) {
+ continue;
+ }
+ } finally {
+ method.releaseConnection();
+ }
+
+ // the expected return code is a redirect, anything else is suspicious
+ if (code == HttpURLConnection.HTTP_OK) {
+ // try form-based authentication via AccountManagerPlugin as a
+ // fall-back
+ authenticateAccountManager(httpClient, hostConfiguration, credentials, monitor);
+ }
+
+ validateAuthenticationState(httpClient);
+
+ // success since no exception was thrown
+ authenticated = true;
+ break;
+ }
+ }
+
+ private boolean needsReauthentication(int code, IProgressMonitor monitor) throws IOException,
+ TracLoginException {
+ final AuthenticationType authenticationType;
+ if (code == HttpStatus.SC_UNAUTHORIZED || code == HttpStatus.SC_FORBIDDEN) {
+ authenticationType = AuthenticationType.REPOSITORY;
+ } else if (code == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED) {
+ authenticationType = AuthenticationType.PROXY;
+ } else {
+ return false;
+ }
+
+ try {
+ location.requestCredentials(authenticationType, null, monitor);
+ } catch (UnsupportedRequestException e) {
+ throw new TracLoginException();
+ }
+
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ return true;
+ }
+
+ }
+
+ private final HttpClient httpClient;
+
+ private boolean authenticated;
+
+ public TracWebClient(AbstractWebLocation location, Version version) {
+ super(location, version);
+ this.httpClient = createHttpClient();
+ }
+
+ private synchronized GetMethod connect(String requestUrl, IProgressMonitor monitor) throws TracException {
+ monitor = Policy.monitorFor(monitor);
+ try {
+ Request request = new Request(requestUrl);
+ return request.execute(monitor);
+ } catch (TracException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new TracException(e);
+ }
+ }
+
+ /**
+ * Fetches the web site of a single ticket and returns the Trac ticket.
+ *
+ * @param id
+ * Trac id of ticket
+ */
+ public TracTicket getTicket(int id, IProgressMonitor monitor) throws TracException {
+ GetMethod method = connect(repositoryUrl + ITracClient.TICKET_URL + id, monitor);
+ try {
+ TracTicket ticket = new TracTicket(id);
+
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in, method.getResponseCharSet()));
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.TD) {
+ String headers = tag.getAttribute("headers"); //$NON-NLS-1$
+ if ("h_component".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.COMPONENT, getText(tokenizer));
+ } else if ("h_milestone".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.MILESTONE, getText(tokenizer));
+ } else if ("h_priority".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.PRIORITY, getText(tokenizer));
+ } else if ("h_severity".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.SEVERITY, getText(tokenizer));
+ } else if ("h_version".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.VERSION, getText(tokenizer));
+ } else if ("h_keywords".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.KEYWORDS, getText(tokenizer));
+ } else if ("h_cc".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.CC, getText(tokenizer));
+ } else if ("h_owner".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.OWNER, getText(tokenizer));
+ } else if ("h_reporter".equals(headers)) { //$NON-NLS-1$
+ ticket.putBuiltinValue(Key.REPORTER, getText(tokenizer));
+ }
+ // TODO handle custom fields
+ } else if (tag.getTagType() == Tag.H2
+ && ("summary".equals(tag.getAttribute("class")) || "summary searchable".equals(tag.getAttribute("class")))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ ticket.putBuiltinValue(Key.SUMMARY, getText(tokenizer));
+ } else if (tag.getTagType() == Tag.H3 && "status".equals(tag.getAttribute("class"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ String text = getStrongText(tokenizer);
+ if (text.length() > 0) {
+ // Trac 0.9 format: status / status (resolution)
+ int i = text.indexOf(" ("); //$NON-NLS-1$
+ if (i != -1) {
+ ticket.putBuiltinValue(Key.STATUS, text.substring(0, i));
+ ticket.putBuiltinValue(Key.RESOLUTION, text.substring(i + 2, text.length() - 1));
+ } else {
+ ticket.putBuiltinValue(Key.STATUS, text);
+ }
+ }
+ } else if (tag.getTagType() == Tag.SPAN) {
+ String clazz = tag.getAttribute("class"); //$NON-NLS-1$
+ if ("status".equals(clazz)) { //$NON-NLS-1$
+ // Trac 0.10 format: (status type) / (status type: resolution)
+ String text = getText(tokenizer);
+ if (text.startsWith("(") && text.endsWith(")")) { //$NON-NLS-1$ //$NON-NLS-2$
+ StringTokenizer t = new StringTokenizer(text.substring(1, text.length() - 1), " :"); //$NON-NLS-1$
+ if (t.hasMoreTokens()) {
+ ticket.putBuiltinValue(Key.STATUS, t.nextToken());
+ }
+ if (t.hasMoreTokens()) {
+ ticket.putBuiltinValue(Key.TYPE, t.nextToken());
+ }
+ if (t.hasMoreTokens()) {
+ ticket.putBuiltinValue(Key.RESOLUTION, t.nextToken());
+ }
+ }
+ }
+ }
+ // TODO parse description
+ }
+ }
+ } finally {
+ in.close();
+ }
+
+ if (ticket.isValid() && ticket.getValue(Key.SUMMARY) != null) {
+ return ticket;
+ }
+
+ throw new InvalidTicketException();
+ } catch (IOException e) {
+ throw new TracException(e);
+ } catch (ParseException e) {
+ throw new TracException(e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ public void searchForTicketIds(TracSearch query, List<Integer> result, IProgressMonitor monitor)
+ throws TracException {
+ List<TracTicket> ticketResult = new ArrayList<TracTicket>();
+ search(query, ticketResult, monitor);
+ for (TracTicket tracTicket : ticketResult) {
+ result.add(tracTicket.getId());
+ }
+ }
+
+ public void search(TracSearch query, List<TracTicket> tickets, IProgressMonitor monitor) throws TracException {
+ GetMethod method = connect(repositoryUrl + ITracClient.QUERY_URL + query.toUrl(), monitor);
+ try {
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in, method.getResponseCharSet()));
+ String line;
+
+ Map<String, String> constantValues = getExactMatchValues(query);
+
+ // first line contains names of returned ticket fields
+ line = reader.readLine();
+ if (line == null) {
+ throw new InvalidTicketException();
+ }
+ StringTokenizer t = new StringTokenizer(line, "\t"); //$NON-NLS-1$
+ Key[] fields = new Key[t.countTokens()];
+ for (int i = 0; i < fields.length; i++) {
+ fields[i] = Key.fromKey(t.nextToken());
+ }
+
+ // create a ticket for each following line of output
+ while ((line = reader.readLine()) != null) {
+ t = new StringTokenizer(line, "\t"); //$NON-NLS-1$
+ TracTicket ticket = new TracTicket();
+ for (int i = 0; i < fields.length && t.hasMoreTokens(); i++) {
+ if (fields[i] != null) {
+ try {
+ if (fields[i] == Key.ID) {
+ ticket.setId(Integer.parseInt(t.nextToken()));
+ } else if (fields[i] == Key.TIME) {
+ ticket.setCreated(TracUtil.parseDate(Integer.parseInt(t.nextToken())));
+ } else if (fields[i] == Key.CHANGE_TIME) {
+ ticket.setLastChanged(TracUtil.parseDate(Integer.parseInt(t.nextToken())));
+ } else {
+ ticket.putBuiltinValue(fields[i], parseTicketValue(t.nextToken()));
+ }
+ } catch (NumberFormatException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "Error parsing response: '" + line + "'", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+
+ if (ticket.isValid()) {
+ for (String key : constantValues.keySet()) {
+ ticket.putValue(key, parseTicketValue(constantValues.get(key)));
+ }
+
+ tickets.add(ticket);
+ }
+ }
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ throw new TracException(e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ /**
+ * Trac has sepcial encoding rules for the returned output: None is represented by "--".
+ */
+ private String parseTicketValue(String value) {
+ if ("--".equals(value)) { //$NON-NLS-1$
+ return ""; //$NON-NLS-1$
+ }
+ return value;
+ }
+
+ /**
+ * Extracts constant values from <code>query</code>. The Trac query script does not return fields that matched
+ * exactly againt a single value.
+ */
+ private Map<String, String> getExactMatchValues(TracSearch query) {
+ Map<String, String> values = new HashMap<String, String>();
+ List<TracSearchFilter> filters = query.getFilters();
+ for (TracSearchFilter filter : filters) {
+ if (filter.getOperator() == CompareOperator.IS && filter.getValues().size() == 1) {
+ values.put(filter.getFieldName(), filter.getValues().get(0));
+ }
+ }
+ return values;
+ }
+
+ public TracRepositoryInfo validate(IProgressMonitor monitor) throws TracException {
+ GetMethod method = connect(repositoryUrl + "/", monitor); //$NON-NLS-1$
+ try {
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in, method.getResponseCharSet()));
+
+ boolean inFooter = false;
+ boolean valid = false;
+ String version = null;
+
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.DIV) {
+ String id = tag.getAttribute("id"); //$NON-NLS-1$
+ inFooter = !tag.isEndTag() && "footer".equals(id); //$NON-NLS-1$
+ } else if (tag.getTagType() == Tag.STRONG && inFooter) {
+ version = getText(tokenizer);
+ } else if (tag.getTagType() == Tag.A) {
+ String id = tag.getAttribute("id"); //$NON-NLS-1$
+ if ("tracpowered".equals(id)) { //$NON-NLS-1$
+ valid = true;
+ }
+ }
+ }
+ }
+
+ if (version != null) {
+ if (version.startsWith("Trac 0.9")) { //$NON-NLS-1$
+ return new TracRepositoryInfo(0, 0, 0, version);
+ } else if (version.startsWith("Trac 0.10")) { //$NON-NLS-1$
+ return new TracRepositoryInfo(0, 0, 1, version);
+ } else if (version.startsWith("Trac 0.11")) { //$NON-NLS-1$
+ return new TracRepositoryInfo(1, 0, 0, version);
+ } else {
+ throw new TracException(NLS.bind(
+ Messages.TracWebClient_Trac_version_X_is_unsupported_Error, version));
+ }
+ }
+
+ if (!valid) {
+ throw new TracException("Not a valid Trac repository"); //$NON-NLS-1$
+ }
+
+ return new TracRepositoryInfo(version);
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ throw new TracException(e);
+ } catch (ParseException e) {
+ throw new TracException(e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ @Override
+ public void updateAttributes(IProgressMonitor monitor) throws TracException {
+ monitor.beginTask(Messages.TracWebClient_Updating_attributes, IProgressMonitor.UNKNOWN);
+
+ GetMethod method = connect(repositoryUrl + ITracClient.CUSTOM_QUERY_URL, monitor);
+ try {
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in, method.getResponseCharSet()));
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.SCRIPT) {
+ String text = getText(tokenizer).trim();
+ if (text.startsWith("var properties=")) { //$NON-NLS-1$
+ parseAttributes(text);
+ }
+ }
+ }
+ }
+
+ addResolutionAndStatus();
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ throw new TracException(e);
+ } catch (ParseException e) {
+ throw new TracException(e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ enum AttributeState {
+ INIT, IN_LIST, IN_ATTRIBUTE_KEY, IN_ATTRIBUTE_VALUE, IN_ATTRIBUTE_VALUE_LIST
+ };
+
+ /**
+ * Parses the JavaScript code from the query page to extract repository configuration.
+ */
+ private void parseAttributes(String text) throws IOException {
+ StreamTokenizer t = new StreamTokenizer(new StringReader(text));
+ t.quoteChar('"');
+
+ AttributeFactory attributeFactory = null;
+ String attributeType = null;
+
+ AttributeState state = AttributeState.INIT;
+ int tokenType;
+ while ((tokenType = t.nextToken()) != StreamTokenizer.TT_EOF) {
+ switch (tokenType) {
+ case StreamTokenizer.TT_WORD:
+ if (state == AttributeState.IN_LIST) {
+ if ("component".equals(t.sval)) { //$NON-NLS-1$
+ data.components = new ArrayList<TracComponent>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.components.add(new TracComponent(value));
+ }
+ };
+ } else if ("milestone".equals(t.sval)) { //$NON-NLS-1$
+ data.milestones = new ArrayList<TracMilestone>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.milestones.add(new TracMilestone(value));
+ }
+ };
+ } else if ("priority".equals(t.sval)) { //$NON-NLS-1$
+ data.priorities = new ArrayList<TracPriority>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.priorities.add(new TracPriority(value, data.priorities.size() + 1));
+ }
+ };
+ } else if ("resolution".equals(t.sval)) { //$NON-NLS-1$
+ data.ticketResolutions = new ArrayList<TracTicketResolution>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.ticketResolutions.add(new TracTicketResolution(value,
+ data.ticketResolutions.size() + 1));
+ }
+ };
+ } else if ("severity".equals(t.sval)) { //$NON-NLS-1$
+ data.severities = new ArrayList<TracSeverity>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.severities.add(new TracSeverity(value, data.severities.size() + 1));
+ }
+ };
+ } else if ("status".equals(t.sval)) { //$NON-NLS-1$
+ data.ticketStatus = new ArrayList<TracTicketStatus>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.ticketStatus.add(new TracTicketStatus(value, data.ticketStatus.size() + 1));
+ }
+ };
+ } else if ("type".equals(t.sval)) { //$NON-NLS-1$
+ data.ticketTypes = new ArrayList<TracTicketType>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.ticketTypes.add(new TracTicketType(value, data.ticketTypes.size() + 1));
+ }
+ };
+ } else if ("version".equals(t.sval)) { //$NON-NLS-1$
+ data.versions = new ArrayList<TracVersion>();
+ attributeFactory = new AttributeFactory() {
+ public void addAttribute(String value) {
+ data.versions.add(new TracVersion(value));
+ }
+ };
+ } else {
+ attributeFactory = null;
+ }
+ } else if (state == AttributeState.IN_ATTRIBUTE_KEY) {
+ attributeType = t.sval;
+ }
+ break;
+ case '"':
+ if (state == AttributeState.IN_ATTRIBUTE_VALUE_LIST && "options".equals(attributeType)) { //$NON-NLS-1$
+ if (attributeFactory != null) {
+ attributeFactory.addAttribute(t.sval);
+ }
+ }
+ break;
+ case ':':
+ if (state == AttributeState.IN_ATTRIBUTE_KEY) {
+ state = AttributeState.IN_ATTRIBUTE_VALUE;
+ }
+ break;
+ case ',':
+ if (state == AttributeState.IN_ATTRIBUTE_VALUE) {
+ state = AttributeState.IN_ATTRIBUTE_KEY;
+ }
+ break;
+ case '[':
+ if (state == AttributeState.IN_ATTRIBUTE_VALUE) {
+ state = AttributeState.IN_ATTRIBUTE_VALUE_LIST;
+ }
+ break;
+ case ']':
+ if (state == AttributeState.IN_ATTRIBUTE_VALUE_LIST) {
+ state = AttributeState.IN_ATTRIBUTE_VALUE;
+ }
+ break;
+ case '{':
+ if (state == AttributeState.INIT) {
+ state = AttributeState.IN_LIST;
+ } else if (state == AttributeState.IN_LIST) {
+ state = AttributeState.IN_ATTRIBUTE_KEY;
+ } else {
+ throw new IOException("Error parsing attributes: unexpected token '{'"); //$NON-NLS-1$
+ }
+ break;
+ case '}':
+ if (state == AttributeState.IN_ATTRIBUTE_KEY || state == AttributeState.IN_ATTRIBUTE_VALUE) {
+ state = AttributeState.IN_LIST;
+ } else if (state == AttributeState.IN_LIST) {
+ state = AttributeState.INIT;
+ } else {
+ throw new IOException("Error parsing attributes: unexpected token '}'"); //$NON-NLS-1$
+ }
+ break;
+ }
+ }
+ }
+
+ public void updateAttributesNewTicketPage(IProgressMonitor monitor) throws TracException {
+ monitor.beginTask(Messages.TracWebClient_Updating_attributes, IProgressMonitor.UNKNOWN);
+
+ GetMethod method = connect(repositoryUrl + ITracClient.NEW_TICKET_URL, monitor);
+ try {
+ InputStream in = WebUtil.getResponseBodyAsStream(method, monitor);
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in, method.getResponseCharSet()));
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.SELECT) {
+ String name = tag.getAttribute("id"); //$NON-NLS-1$
+ if ("component".equals(name)) { //$NON-NLS-1$
+ List<String> values = getOptionValues(tokenizer);
+ data.components = new ArrayList<TracComponent>(values.size());
+ for (String value : values) {
+ data.components.add(new TracComponent(value));
+ }
+ } else if ("milestone".equals(name)) { //$NON-NLS-1$
+ List<String> values = getOptionValues(tokenizer);
+ data.milestones = new ArrayList<TracMilestone>(values.size());
+ for (String value : values) {
+ data.milestones.add(new TracMilestone(value));
+ }
+ } else if ("priority".equals(name)) { //$NON-NLS-1$
+ List<String> values = getOptionValues(tokenizer);
+ data.priorities = new ArrayList<TracPriority>(values.size());
+ for (int i = 0; i < values.size(); i++) {
+ data.priorities.add(new TracPriority(values.get(i), i + 1));
+ }
+ } else if ("severity".equals(name)) { //$NON-NLS-1$
+ List<String> values = getOptionValues(tokenizer);
+ data.severities = new ArrayList<TracSeverity>(values.size());
+ for (int i = 0; i < values.size(); i++) {
+ data.severities.add(new TracSeverity(values.get(i), i + 1));
+ }
+ } else if ("type".equals(name)) { //$NON-NLS-1$
+ List<String> values = getOptionValues(tokenizer);
+ data.ticketTypes = new ArrayList<TracTicketType>(values.size());
+ for (int i = 0; i < values.size(); i++) {
+ data.ticketTypes.add(new TracTicketType(values.get(i), i + 1));
+ }
+ } else if ("version".equals(name)) { //$NON-NLS-1$
+ List<String> values = getOptionValues(tokenizer);
+ data.versions = new ArrayList<TracVersion>(values.size());
+ for (String value : values) {
+ data.versions.add(new TracVersion(value));
+ }
+ }
+ }
+ }
+ }
+
+ addResolutionAndStatus();
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ throw new TracException(e);
+ } catch (ParseException e) {
+ throw new TracException(e);
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ private void addResolutionAndStatus() {
+ if (data.ticketResolutions == null || data.ticketResolutions.isEmpty()) {
+ data.ticketResolutions = new ArrayList<TracTicketResolution>(5);
+ data.ticketResolutions.add(new TracTicketResolution("fixed", 1)); //$NON-NLS-1$
+ data.ticketResolutions.add(new TracTicketResolution("invalid", 2)); //$NON-NLS-1$
+ data.ticketResolutions.add(new TracTicketResolution("wontfix", 3)); //$NON-NLS-1$
+ data.ticketResolutions.add(new TracTicketResolution("duplicate", 4)); //$NON-NLS-1$
+ data.ticketResolutions.add(new TracTicketResolution("worksforme", 5)); //$NON-NLS-1$
+ }
+
+ if (data.ticketStatus == null || data.ticketStatus.isEmpty()) {
+ data.ticketStatus = new ArrayList<TracTicketStatus>(4);
+ data.ticketStatus.add(new TracTicketStatus("new", 1)); //$NON-NLS-1$
+ data.ticketStatus.add(new TracTicketStatus("assigned", 2)); //$NON-NLS-1$
+ data.ticketStatus.add(new TracTicketStatus("reopened", 3)); //$NON-NLS-1$
+ data.ticketStatus.add(new TracTicketStatus("closed", 4)); //$NON-NLS-1$
+ }
+ }
+
+ private List<String> getOptionValues(HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ List<String> values = new ArrayList<String>();
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == Tag.OPTION && !tag.isEndTag()) {
+ String value = getText(tokenizer).trim();
+ if (value.length() > 0) {
+ values.add(value);
+ }
+ } else {
+ return values;
+ }
+ }
+ }
+ return values;
+ }
+
+ private String getText(HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ StringBuilder sb = new StringBuilder();
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TEXT) {
+ sb.append(token.toString().trim());
+ sb.append(" "); //$NON-NLS-1$
+ } else if (token.getType() == Token.COMMENT) {
+ // ignore
+ } else {
+ break;
+ }
+ }
+ return StringEscapeUtils.unescapeHtml(sb.toString().trim());
+ }
+
+ /**
+ * Looks for a <code>strong</code> tag and returns the text enclosed by the tag.
+ */
+ private String getStrongText(HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG && ((HtmlTag) token.getValue()).getTagType() == Tag.STRONG) {
+ return getText(tokenizer);
+ } else if (token.getType() == Token.COMMENT) {
+ // ignore
+ } else if (token.getType() == Token.TEXT) {
+ // ignore
+ } else {
+ break;
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ public InputStream getAttachmentData(int id, String filename, IProgressMonitor monitor) throws TracException {
+ GetMethod method = connect(repositoryUrl + ITracClient.ATTACHMENT_URL + id + "/" + filename + "?format=raw", //$NON-NLS-1$ //$NON-NLS-2$
+ monitor);
+ try {
+ // the receiver is responsible for closing the stream which will
+ // release the connection
+ return method.getResponseBodyAsStream();
+ } catch (IOException e) {
+ method.releaseConnection();
+ throw new TracException(e);
+ }
+ }
+
+ public void putAttachmentData(int id, String name, String description, InputStream in, IProgressMonitor monitor)
+ throws TracException {
+ throw new TracException("Unsupported operation"); //$NON-NLS-1$
+ }
+
+ public void deleteAttachment(int ticketId, String filename, IProgressMonitor monitor) throws TracException {
+ throw new TracException("Unsupported operation"); //$NON-NLS-1$
+ }
+
+ public int createTicket(TracTicket ticket, IProgressMonitor monitor) throws TracException {
+ throw new TracException("Unsupported operation"); //$NON-NLS-1$
+ }
+
+ public void updateTicket(TracTicket ticket, String comment, IProgressMonitor monitor) throws TracException {
+ throw new TracException("Unsupported operation"); //$NON-NLS-1$
+ }
+
+ public Set<Integer> getChangedTickets(Date since, IProgressMonitor monitor) throws TracException {
+ return null;
+ }
+
+ private interface AttributeFactory {
+
+ void addAttribute(String value);
+
+ }
+
+ public Date getTicketLastChanged(Integer id, IProgressMonitor monitor) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void deleteTicket(int ticketId, IProgressMonitor monitor) throws TracException {
+ throw new UnsupportedOperationException();
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracXmlRpcClient.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracXmlRpcClient.java
new file mode 100644
index 0000000..4df9a3b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/TracXmlRpcClient.java
@@ -0,0 +1,1149 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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
+ * Xiaoyang Guan - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.client;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.auth.AuthScheme;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.auth.BasicScheme;
+import org.apache.commons.httpclient.auth.DigestScheme;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.Policy;
+import org.eclipse.mylyn.commons.net.UnsupportedRequestException;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.model.TracAction;
+import org.eclipse.mylyn.internal.trac.core.model.TracAttachment;
+import org.eclipse.mylyn.internal.trac.core.model.TracComment;
+import org.eclipse.mylyn.internal.trac.core.model.TracComponent;
+import org.eclipse.mylyn.internal.trac.core.model.TracMilestone;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSeverity;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketResolution;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketStatus;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketType;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField.Type;
+import org.eclipse.mylyn.internal.trac.core.util.HttpMethodInterceptor;
+import org.eclipse.mylyn.internal.trac.core.util.TracHttpClientTransportFactory;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.internal.trac.core.util.TracXmlRpcClientRequest;
+import org.eclipse.mylyn.internal.trac.core.util.TracHttpClientTransportFactory.TracHttpException;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Represents a Trac repository that is accessed through the Trac XmlRpcPlugin.
+ *
+ * @author Steffen Pingel
+ * @author Xiaoyang Guan
+ */
+public class TracXmlRpcClient extends AbstractTracClient implements ITracWikiClient {
+
+ private class XmlRpcRequest {
+
+ private final String method;
+
+ private final Object[] parameters;
+
+ public XmlRpcRequest(String method, Object[] parameters) {
+ this.method = method;
+ this.parameters = parameters;
+ }
+
+ public Object execute(IProgressMonitor monitor) throws TracException {
+ try {
+ // first attempt
+ return executeCallInternal(monitor);
+ } catch (TracPermissionDeniedException e) {
+ if (accountMangerAuthenticationFailed) {
+ // do not try again if this has failed in the past since it
+ // is more likely that XML_RPC permissions have not been set
+ throw e;
+ }
+
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ if (!credentialsValid(credentials)) {
+ throw e;
+ }
+
+ // try form-based authentication via AccountManagerPlugin as a
+ // fall-back
+ HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ try {
+ authenticateAccountManager(httpClient, hostConfiguration, credentials, monitor);
+ } catch (TracLoginException loginException) {
+ // caused by wrong user name or password
+ throw loginException;
+ } catch (IOException ignore) {
+ accountMangerAuthenticationFailed = true;
+ throw e;
+ }
+
+ try {
+ validateAuthenticationState(httpClient);
+ } catch (TracLoginException ignore) {
+ // most likely form based authentication is not supported by
+ // repository
+ accountMangerAuthenticationFailed = true;
+ throw e;
+ }
+
+ // the authentication information is available through the shared state in httpClient
+ }
+
+ // second attempt
+ return executeCallInternal(monitor);
+ }
+
+ private Object executeCallInternal(IProgressMonitor monitor) throws TracException {
+ try {
+ if (isTracd && digestScheme != null) {
+ probeAuthenticationScheme(monitor);
+ }
+ if (DEBUG_XMLRPC) {
+ System.err.println("Calling " + location.getUrl() + ": " + method + " " + TracUtil.toString(parameters)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ TracXmlRpcClientRequest request = new TracXmlRpcClientRequest(xmlrpc.getClientConfig(), method,
+ parameters, monitor);
+ return xmlrpc.execute(request);
+ } catch (TracHttpException e) {
+ if (e.code == HttpStatus.SC_UNAUTHORIZED) {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Unauthorized (" + e.code + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ digestScheme = null;
+ throw new TracLoginException();
+ } else if (e.code == HttpStatus.SC_FORBIDDEN) {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Forbidden (" + e.code + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ digestScheme = null;
+ throw new TracPermissionDeniedException();
+ } else if (e.code == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED) {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Proxy authentication required (" + e.code + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ throw new TracProxyAuthenticationException();
+ } else {
+ throw new TracException(e);
+ }
+ } catch (XmlRpcException e) {
+ if (e.code == NO_SUCH_METHOD_ERROR) {
+ throw new TracNoSuchMethodException(e);
+ } else {
+ throw new TracRemoteException(e);
+ }
+ } catch (OperationCanceledException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new TracException(e);
+ }
+ }
+ }
+
+ private static final boolean DEBUG_XMLRPC = Boolean.valueOf(Platform.getDebugOption("org.eclipse.mylyn.trac.core/debug/xmlrpc")); //$NON-NLS-1$
+
+ public static final String XMLRPC_URL = "/xmlrpc"; //$NON-NLS-1$
+
+ public static final String REQUIRED_REVISION = "1950"; //$NON-NLS-1$
+
+ public static final int REQUIRED_EPOCH = 0;
+
+ public static final int REQUIRED_MAJOR = 0;
+
+ public static final int REQUIRED_MINOR = 1;
+
+ private static final int NO_SUCH_METHOD_ERROR = 1;
+
+ private static final int LATEST_VERSION = -1;
+
+ public static final int REQUIRED_WIKI_RPC_VERSION = 2;
+
+ private XmlRpcClient xmlrpc;
+
+ private TracHttpClientTransportFactory factory;
+
+ private boolean accountMangerAuthenticationFailed;
+
+ private XmlRpcClientConfigImpl config;
+
+ private final HttpClient httpClient;
+
+ private boolean probed;
+
+ private volatile DigestScheme digestScheme;
+
+ private final AuthScope authScope;
+
+ private boolean isTracd;
+
+ private TracRepositoryInfo info = new TracRepositoryInfo();
+
+ public TracXmlRpcClient(AbstractWebLocation location, Version version) {
+ super(location, version);
+ this.httpClient = createHttpClient();
+ this.authScope = new AuthScope(WebUtil.getHost(repositoryUrl), WebUtil.getPort(repositoryUrl), null,
+ AuthScope.ANY_SCHEME);
+ }
+
+ public synchronized XmlRpcClient getClient() throws TracException {
+ if (xmlrpc == null) {
+ config = new XmlRpcClientConfigImpl();
+ config.setEncoding(ITracClient.CHARSET);
+ config.setTimeZone(TimeZone.getTimeZone(ITracClient.TIME_ZONE));
+ config.setContentLengthOptional(false);
+ config.setConnectionTimeout(WebUtil.getConnectionTimeout());
+ config.setReplyTimeout(WebUtil.getSocketTimeout());
+
+ xmlrpc = new XmlRpcClient();
+ xmlrpc.setConfig(config);
+
+ factory = new TracHttpClientTransportFactory(xmlrpc, httpClient);
+ factory.setLocation(location);
+ factory.setInterceptor(new HttpMethodInterceptor() {
+ public void processRequest(HttpMethod method) {
+ DigestScheme scheme = digestScheme;
+ if (scheme != null) {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Digest scheme is present"); //$NON-NLS-1$
+ }
+ Credentials creds = httpClient.getState().getCredentials(authScope);
+ if (creds != null) {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Setting digest scheme for request"); //$NON-NLS-1$
+ }
+ method.getHostAuthState().setAuthScheme(digestScheme);
+ method.getHostAuthState().setAuthRequested(true);
+ }
+ }
+ }
+
+ public void processResponse(HttpMethod method) {
+ AuthScheme authScheme = method.getHostAuthState().getAuthScheme();
+ if (authScheme instanceof DigestScheme) {
+ digestScheme = (DigestScheme) authScheme;
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Received digest scheme"); //$NON-NLS-1$
+ }
+ }
+ }
+ });
+ xmlrpc.setTransportFactory(factory);
+ }
+
+ // update configuration with latest values
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ config.setServerURL(getXmlRpcUrl(credentials));
+ if (credentialsValid(credentials)) {
+ Credentials creds = WebUtil.getHttpClientCredentials(credentials, WebUtil.getHost(location.getUrl()));
+ httpClient.getState().setCredentials(authScope, creds);
+ } else {
+ httpClient.getState().clearCredentials();
+ }
+
+ return xmlrpc;
+ }
+
+ private URL getXmlRpcUrl(AuthenticationCredentials credentials) throws TracException {
+ try {
+ String location = repositoryUrl.toString();
+ if (credentialsValid(credentials)) {
+ location += LOGIN_URL;
+ }
+ location += XMLRPC_URL;
+
+ return new URL(location);
+ } catch (Exception e) {
+ throw new TracException(e);
+ }
+ }
+
+ private void probeAuthenticationScheme(IProgressMonitor monitor) throws TracException {
+ AuthenticationCredentials credentials = location.getCredentials(AuthenticationType.REPOSITORY);
+ if (!credentialsValid(credentials)) {
+ return;
+ }
+
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Probing authentication"); //$NON-NLS-1$
+ }
+ HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ HeadMethod method = new HeadMethod(getXmlRpcUrl(credentials).toString());
+ try {
+ // execute without any credentials set
+ int result = WebUtil.execute(httpClient, hostConfiguration, method, new HttpState(), monitor);
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Received authentication response (" + result + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (result == HttpStatus.SC_UNAUTHORIZED || result == HttpStatus.SC_FORBIDDEN) {
+ AuthScheme authScheme = method.getHostAuthState().getAuthScheme();
+ if (authScheme instanceof DigestScheme) {
+ this.digestScheme = (DigestScheme) authScheme;
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Received digest scheme"); //$NON-NLS-1$
+ }
+ } else if (authScheme instanceof BasicScheme) {
+ httpClient.getParams().setAuthenticationPreemptive(true);
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Received basic scheme"); //$NON-NLS-1$
+ }
+ } else if (authScheme != null) {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": Received scheme (" + authScheme.getClass() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else {
+ if (DEBUG_AUTH) {
+ System.err.println(location.getUrl() + ": No authentication scheme received"); //$NON-NLS-1$
+ }
+ }
+
+ Header header = method.getResponseHeader("Server"); //$NON-NLS-1$
+ isTracd = (header != null && header.getValue().startsWith("tracd")); //$NON-NLS-1$
+ if (DEBUG_AUTH && isTracd) {
+ System.err.println(location.getUrl() + ": Tracd detected"); //$NON-NLS-1$
+ }
+
+// Header header = method.getResponseHeader("WWW-Authenticate");
+// if (header != null) {
+// if (header.getValue().startsWith("Basic")) {
+// httpClient.getParams().setAuthenticationPreemptive(true);
+// } else if (header.getValue().startsWith("Digest")) {
+// DigestScheme scheme = new DigestScheme();
+// try {
+// scheme.processChallenge(header.getValue());
+// this.digestScheme = scheme;
+// } catch (MalformedChallengeException e) {
+// // ignore
+// }
+// }
+// }
+ }
+ } catch (IOException e) {
+ // ignore
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ private Object call(IProgressMonitor monitor, String method, Object... parameters) throws TracException {
+ monitor = Policy.monitorFor(monitor);
+ while (true) {
+ if (!probed) {
+ try {
+ probeAuthenticationScheme(monitor);
+ } finally {
+ probed = true;
+ }
+ }
+
+ getClient();
+
+ try {
+ XmlRpcRequest request = new XmlRpcRequest(method, parameters);
+ return request.execute(monitor);
+ } catch (TracLoginException e) {
+ try {
+ location.requestCredentials(AuthenticationType.REPOSITORY, null, monitor);
+ } catch (UnsupportedRequestException ignored) {
+ throw e;
+ }
+ } catch (TracPermissionDeniedException e) {
+ try {
+ location.requestCredentials(AuthenticationType.REPOSITORY, null, monitor);
+ } catch (UnsupportedRequestException ignored) {
+ throw e;
+ }
+ } catch (TracProxyAuthenticationException e) {
+ try {
+ location.requestCredentials(AuthenticationType.PROXY, null, monitor);
+ } catch (UnsupportedRequestException ignored) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ private Object[] multicall(IProgressMonitor monitor, Map<String, Object>... calls) throws TracException {
+ Object[] result = (Object[]) call(monitor, "system.multicall", new Object[] { calls }); //$NON-NLS-1$
+ for (Object item : result) {
+ try {
+ checkForException(item);
+ } catch (XmlRpcException e) {
+ throw new TracRemoteException(e);
+ } catch (Exception e) {
+ throw new TracException(e);
+ }
+ }
+ return result;
+ }
+
+ private void checkForException(Object result) throws NumberFormatException, XmlRpcException {
+ if (result instanceof Map<?, ?>) {
+ Map<?, ?> exceptionData = (Map<?, ?>) result;
+ if (exceptionData.containsKey("faultCode") && exceptionData.containsKey("faultString")) { //$NON-NLS-1$ //$NON-NLS-2$
+ throw new XmlRpcException(Integer.parseInt(exceptionData.get("faultCode").toString()), //$NON-NLS-1$
+ (String) exceptionData.get("faultString")); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private Map<String, Object> createMultiCall(String methodName, Object... parameters) throws TracException {
+ Map<String, Object> table = new HashMap<String, Object>();
+ table.put("methodName", methodName); //$NON-NLS-1$
+ table.put("params", parameters); //$NON-NLS-1$
+ return table;
+ }
+
+ private Object getMultiCallResult(Object item) {
+ return ((Object[]) item)[0];
+ }
+
+ public TracRepositoryInfo validate(IProgressMonitor monitor) throws TracException {
+ Integer epochAPIVersion;
+ Integer majorAPIVersion;
+ Integer minorAPIVersion;
+ try {
+ Object[] result = (Object[]) call(monitor, "system.getAPIVersion"); //$NON-NLS-1$
+ if (result.length >= 3) {
+ epochAPIVersion = (Integer) result[0];
+ majorAPIVersion = (Integer) result[1];
+ minorAPIVersion = (Integer) result[2];
+ } else if (result.length >= 2) {
+ epochAPIVersion = 0;
+ majorAPIVersion = (Integer) result[0];
+ minorAPIVersion = (Integer) result[1];
+ } else {
+ throw new TracException(NLS.bind(Messages.TracXmlRpcClient_API_version_unsupported_Error,
+ REQUIRED_REVISION));
+ }
+ } catch (TracNoSuchMethodException e) {
+ throw new TracException(NLS.bind(Messages.TracXmlRpcClient_Required_API_calls_missing_Error,
+ REQUIRED_REVISION));
+ }
+
+ info = new TracRepositoryInfo(epochAPIVersion, majorAPIVersion, minorAPIVersion);
+ if (!info.isApiVersionOrHigher(REQUIRED_EPOCH, REQUIRED_MAJOR, REQUIRED_MINOR)) {
+ throw new TracException(NLS.bind(Messages.TracXmlRpcClient_API_version_X_unsupported_Error,
+ info.toString(), REQUIRED_REVISION));
+ }
+ return info;
+ }
+
+ private void updateAPIVersion(IProgressMonitor monitor) throws TracException {
+ if (info.isStale()) {
+ validate(monitor);
+ }
+ }
+
+ private boolean isApiVersionOrHigher(int epoch, int major, int minor, IProgressMonitor monitor)
+ throws TracException {
+ updateAPIVersion(monitor);
+ return info.isApiVersionOrHigher(epoch, major, minor);
+ }
+
+ public TracTicket getTicket(int id, IProgressMonitor monitor) throws TracException {
+ Object[] result = (Object[]) call(monitor, "ticket.get", id); //$NON-NLS-1$
+ TracTicket ticket = parseTicket(result);
+
+ result = (Object[]) call(monitor, "ticket.changeLog", id, 0); //$NON-NLS-1$
+ for (Object item : result) {
+ ticket.addComment(parseChangeLogEntry((Object[]) item));
+ }
+
+ result = (Object[]) call(monitor, "ticket.listAttachments", id); //$NON-NLS-1$
+ for (Object item : result) {
+ ticket.addAttachment(parseAttachment((Object[]) item));
+ }
+
+ TracAction[] actions = getActions(id, monitor);
+ ticket.setActions(actions);
+
+ updateAttributes(new NullProgressMonitor(), false);
+ TracTicketResolution[] resolutions = getTicketResolutions();
+ if (resolutions != null) {
+ String[] resolutionStrings = new String[resolutions.length];
+ for (int i = 0; i < resolutions.length; i++) {
+ resolutionStrings[i] = resolutions[i].getName();
+ }
+ ticket.setResolutions(resolutionStrings);
+ } else {
+ ticket.setResolutions(getDefaultTicketResolutions());
+ }
+
+ return ticket;
+ }
+
+ private TracAttachment parseAttachment(Object[] entry) {
+ TracAttachment attachment = new TracAttachment((String) entry[0]);
+ attachment.setDescription((String) entry[1]);
+ attachment.setSize((Integer) entry[2]);
+ attachment.setCreated(parseDate(entry[3]));
+ attachment.setAuthor((String) entry[4]);
+ return attachment;
+ }
+
+ private TracComment parseChangeLogEntry(Object[] entry) {
+ TracComment comment = new TracComment();
+ comment.setCreated(parseDate(entry[0]));
+ comment.setAuthor((String) entry[1]);
+ comment.setField((String) entry[2]);
+ comment.setOldValue((String) entry[3]);
+ comment.setNewValue((String) entry[4]);
+ return comment;
+ }
+
+ /* public for testing */
+ @SuppressWarnings("unchecked")
+ public List<TracTicket> getTickets(int[] ids, IProgressMonitor monitor) throws TracException {
+ Map<String, Object>[] calls = new Map[ids.length];
+ for (int i = 0; i < calls.length; i++) {
+ calls[i] = createMultiCall("ticket.get", ids[i]); //$NON-NLS-1$
+ }
+
+ Object[] result = multicall(monitor, calls);
+ assert result.length == ids.length;
+
+ List<TracTicket> tickets = new ArrayList<TracTicket>(result.length);
+ for (Object item : result) {
+ Object[] ticketResult = (Object[]) getMultiCallResult(item);
+ tickets.add(parseTicket(ticketResult));
+ }
+
+ return tickets;
+ }
+
+ public void searchForTicketIds(TracSearch query, List<Integer> tickets, IProgressMonitor monitor)
+ throws TracException {
+ // an empty query string is not valid, therefore prepend order
+ Object[] result = (Object[]) call(monitor,
+ "ticket.query", "order=id" + query.toQuery(supportsMaxSearchResults(monitor))); //$NON-NLS-1$ //$NON-NLS-2$
+ for (Object item : result) {
+ tickets.add((Integer) item);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void search(TracSearch query, List<TracTicket> tickets, IProgressMonitor monitor) throws TracException {
+ // an empty query string is not valid, therefore prepend order
+ Object[] result = (Object[]) call(monitor,
+ "ticket.query", "order=id" + query.toQuery(supportsMaxSearchResults(monitor))); //$NON-NLS-1$ //$NON-NLS-2$
+
+ Map<String, Object>[] calls = new Map[result.length];
+ for (int i = 0; i < calls.length; i++) {
+ calls[i] = createMultiCall("ticket.get", result[i]); //$NON-NLS-1$
+ }
+ result = multicall(monitor, calls);
+
+ for (Object item : result) {
+ Object[] ticketResult = (Object[]) getMultiCallResult(item);
+ tickets.add(parseTicket(ticketResult));
+ }
+ }
+
+ private boolean supportsWorkFlow(IProgressMonitor monitor) throws TracException {
+ return isApiVersionOrHigher(1, 0, 1, monitor);
+ }
+
+ private boolean supportsMaxSearchResults(IProgressMonitor monitor) throws TracException {
+ return isApiVersionOrHigher(1, 0, 0, monitor);
+ }
+
+ private TracTicket parseTicket(Object[] ticketResult) throws InvalidTicketException {
+ TracTicket ticket = new TracTicket((Integer) ticketResult[0]);
+ ticket.setCreated(parseDate(ticketResult[1]));
+ ticket.setLastChanged(parseDate(ticketResult[2]));
+ Map<?, ?> attributes = (Map<?, ?>) ticketResult[3];
+ for (Object key : attributes.keySet()) {
+ ticket.putValue(key.toString(), attributes.get(key).toString());
+ }
+ return ticket;
+ }
+
+ private Date parseDate(Object object) {
+ if (object instanceof Date) {
+ return (Date) object;
+ } else if (object instanceof Integer) {
+ return TracUtil.parseDate((Integer) object);
+ }
+ throw new ClassCastException("Unexpected object type for date: " + object.getClass()); //$NON-NLS-1$
+ }
+
+ @Override
+ public synchronized void updateAttributes(IProgressMonitor monitor) throws TracException {
+ monitor.beginTask("Updating attributes", 9); //$NON-NLS-1$
+
+ Object[] result = getAttributes("ticket.component", monitor); //$NON-NLS-1$
+ data.components = new ArrayList<TracComponent>(result.length);
+ for (Object item : result) {
+ data.components.add(parseComponent((Map<?, ?>) getMultiCallResult(item)));
+ }
+ advance(monitor, 1);
+
+ result = getAttributes("ticket.milestone", monitor); //$NON-NLS-1$
+ data.milestones = new ArrayList<TracMilestone>(result.length);
+ for (Object item : result) {
+ data.milestones.add(parseMilestone((Map<?, ?>) getMultiCallResult(item)));
+ }
+ advance(monitor, 1);
+
+ List<TicketAttributeResult> attributes = getTicketAttributes("ticket.priority", monitor); //$NON-NLS-1$
+ data.priorities = new ArrayList<TracPriority>(result.length);
+ for (TicketAttributeResult attribute : attributes) {
+ data.priorities.add(new TracPriority(attribute.name, attribute.value));
+ }
+ Collections.sort(data.priorities);
+ advance(monitor, 1);
+
+ attributes = getTicketAttributes("ticket.resolution", monitor); //$NON-NLS-1$
+ data.ticketResolutions = new ArrayList<TracTicketResolution>(result.length);
+ for (TicketAttributeResult attribute : attributes) {
+ data.ticketResolutions.add(new TracTicketResolution(attribute.name, attribute.value));
+ }
+ Collections.sort(data.ticketResolutions);
+ advance(monitor, 1);
+
+ attributes = getTicketAttributes("ticket.severity", monitor); //$NON-NLS-1$
+ data.severities = new ArrayList<TracSeverity>(result.length);
+ for (TicketAttributeResult attribute : attributes) {
+ data.severities.add(new TracSeverity(attribute.name, attribute.value));
+ }
+ Collections.sort(data.severities);
+ advance(monitor, 1);
+
+ boolean assignValues = isApiVersionOrHigher(1, 0, 0, monitor);
+ attributes = getTicketAttributes("ticket.status", assignValues, monitor); //$NON-NLS-1$
+ data.ticketStatus = new ArrayList<TracTicketStatus>(result.length);
+ for (TicketAttributeResult attribute : attributes) {
+ data.ticketStatus.add(new TracTicketStatus(attribute.name, attribute.value));
+ }
+ Collections.sort(data.ticketStatus);
+ advance(monitor, 1);
+
+ attributes = getTicketAttributes("ticket.type", monitor); //$NON-NLS-1$
+ data.ticketTypes = new ArrayList<TracTicketType>(result.length);
+ for (TicketAttributeResult attribute : attributes) {
+ data.ticketTypes.add(new TracTicketType(attribute.name, attribute.value));
+ }
+ Collections.sort(data.ticketTypes);
+ advance(monitor, 1);
+
+ result = getAttributes("ticket.version", monitor); //$NON-NLS-1$
+ data.versions = new ArrayList<TracVersion>(result.length);
+ for (Object item : result) {
+ data.versions.add(parseVersion((Map<?, ?>) getMultiCallResult(item)));
+ }
+ advance(monitor, 1);
+
+ result = (Object[]) call(monitor, "ticket.getTicketFields"); //$NON-NLS-1$
+ data.ticketFields = new ArrayList<TracTicketField>(result.length);
+ for (Object item : result) {
+ data.ticketFields.add(parseTicketField((Map<?, ?>) item));
+ }
+ advance(monitor, 1);
+ }
+
+ private void advance(IProgressMonitor monitor, int worked) {
+ monitor.worked(worked);
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+
+ }
+
+ private TracComponent parseComponent(Map<?, ?> result) {
+ TracComponent component = new TracComponent((String) result.get("name")); //$NON-NLS-1$
+ component.setOwner((String) result.get("owner")); //$NON-NLS-1$
+ component.setDescription((String) result.get("description")); //$NON-NLS-1$
+ return component;
+ }
+
+ private TracMilestone parseMilestone(Map<?, ?> result) {
+ TracMilestone milestone = new TracMilestone((String) result.get("name")); //$NON-NLS-1$
+ milestone.setCompleted(parseDate(result.get("completed"))); //$NON-NLS-1$
+ milestone.setDue(parseDate(result.get("due"))); //$NON-NLS-1$
+ milestone.setDescription((String) result.get("description")); //$NON-NLS-1$
+ return milestone;
+ }
+
+ private TracVersion parseVersion(Map<?, ?> result) {
+ TracVersion version = new TracVersion((String) result.get("name")); //$NON-NLS-1$
+ version.setTime(parseDate(result.get("time"))); //$NON-NLS-1$
+ version.setDescription((String) result.get("description")); //$NON-NLS-1$
+ return version;
+ }
+
+ private TracTicketField parseTicketField(Map<?, ?> result) {
+ TracTicketField field = new TracTicketField((String) result.get("name")); //$NON-NLS-1$
+ field.setType(TracTicketField.Type.fromString((String) result.get("type"))); //$NON-NLS-1$
+ field.setLabel((String) result.get("label")); //$NON-NLS-1$
+ field.setDefaultValue((String) result.get("value")); //$NON-NLS-1$
+ Object[] items = (Object[]) result.get("options"); //$NON-NLS-1$
+ if (items != null) {
+ String[] options = new String[items.length];
+ for (int i = 0; i < items.length; i++) {
+ options[i] = (String) items[i];
+ }
+ field.setOptions(options);
+ }
+ if (result.get("custom") != null) { //$NON-NLS-1$
+ field.setCustom((Boolean) result.get("custom")); //$NON-NLS-1$
+ }
+ if (result.get("order") != null) { //$NON-NLS-1$
+ field.setOrder((Integer) result.get("order")); //$NON-NLS-1$
+ }
+ if (result.get("optional") != null) { //$NON-NLS-1$
+ field.setOptional((Boolean) result.get("optional")); //$NON-NLS-1$
+ }
+ if (result.get("width") != null) { //$NON-NLS-1$
+ field.setWidth((Integer) result.get("width")); //$NON-NLS-1$
+ }
+ if (result.get("height") != null) { //$NON-NLS-1$
+ field.setHeight((Integer) result.get("height")); //$NON-NLS-1$
+ }
+ return field;
+ }
+
+ @SuppressWarnings("unchecked")
+ private Object[] getAttributes(String attributeType, IProgressMonitor monitor) throws TracException {
+ Object[] ids = (Object[]) call(monitor, attributeType + ".getAll"); //$NON-NLS-1$
+ Map<String, Object>[] calls = new Map[ids.length];
+ for (int i = 0; i < calls.length; i++) {
+ calls[i] = createMultiCall(attributeType + ".get", ids[i]); //$NON-NLS-1$
+ }
+
+ Object[] result = multicall(monitor, calls);
+ assert result.length == ids.length;
+
+ return result;
+ }
+
+ private List<TicketAttributeResult> getTicketAttributes(String attributeType, IProgressMonitor monitor)
+ throws TracException {
+ return getTicketAttributes(attributeType, false, monitor);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<TicketAttributeResult> getTicketAttributes(String attributeType, boolean assignValues,
+ IProgressMonitor monitor) throws TracException {
+ // get list of attribute ids first
+ Object[] ids = (Object[]) call(monitor, attributeType + ".getAll"); //$NON-NLS-1$
+ // fetch all attributes in a single call
+ Map<String, Object>[] calls = new Map[ids.length];
+ for (int i = 0; i < calls.length; i++) {
+ calls[i] = createMultiCall(attributeType + ".get", ids[i]); //$NON-NLS-1$
+ }
+
+ Object[] result = multicall(monitor, calls);
+ assert result.length == ids.length;
+
+ List<TicketAttributeResult> attributes = new ArrayList<TicketAttributeResult>(result.length);
+ for (int i = 0; i < calls.length; i++) {
+ try {
+ TicketAttributeResult attribute = new TicketAttributeResult();
+ attribute.name = (String) ids[i];
+ Object value = getMultiCallResult(result[i]);
+ if (assignValues) {
+ attribute.value = i;
+ } else {
+ attribute.value = (value instanceof Integer) ? (Integer) value : Integer.parseInt((String) value);
+ }
+ attributes.add(attribute);
+ } catch (ClassCastException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "Invalid response from Trac repository for attribute type: '" + attributeType + "'", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (NumberFormatException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "Invalid response from Trac repository for attribute type: '" + attributeType + "'", e)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ return attributes;
+ }
+
+ public InputStream getAttachmentData(int ticketId, String filename, IProgressMonitor monitor) throws TracException {
+ byte[] data = (byte[]) call(monitor, "ticket.getAttachment", ticketId, filename); //$NON-NLS-1$
+ return new ByteArrayInputStream(data);
+ }
+
+ public void putAttachmentData(int ticketId, String filename, String description, InputStream in,
+ IProgressMonitor monitor) throws TracException {
+ byte[] data;
+ try {
+ data = readData(in, new NullProgressMonitor());
+ } catch (IOException e) {
+ throw new TracException(e);
+ }
+ call(monitor, "ticket.putAttachment", ticketId, filename, description, data, false); //$NON-NLS-1$
+ }
+
+ private byte[] readData(InputStream in, IProgressMonitor monitor) throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ byte[] buffer = new byte[512];
+ while (true) {
+ int count = in.read(buffer);
+ if (count == -1) {
+ return out.toByteArray();
+ }
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ out.write(buffer, 0, count);
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ }
+ } finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TracCorePlugin.ID_PLUGIN,
+ "Error closing attachment stream", e)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ public void deleteAttachment(int ticketId, String filename, IProgressMonitor monitor) throws TracException {
+ call(monitor, "ticket.deleteAttachment", ticketId, filename); //$NON-NLS-1$
+ }
+
+ private class TicketAttributeResult {
+
+ String name;
+
+ int value;
+
+ }
+
+ public int createTicket(TracTicket ticket, IProgressMonitor monitor) throws TracException {
+ Map<String, String> attributes = ticket.getValues();
+ String summary = attributes.remove(Key.SUMMARY.getKey());
+ String description = attributes.remove(Key.DESCRIPTION.getKey());
+ if (summary == null || description == null) {
+ throw new InvalidTicketException();
+ }
+ if (supportsNotifications(monitor)) {
+ return (Integer) call(monitor, "ticket.create", summary, description, attributes, true); //$NON-NLS-1$
+ } else {
+ return (Integer) call(monitor, "ticket.create", summary, description, attributes); //$NON-NLS-1$
+ }
+ }
+
+ private boolean supportsNotifications(IProgressMonitor monitor) throws TracException {
+ return isApiVersionOrHigher(0, 0, 2, monitor);
+ }
+
+ public void updateTicket(TracTicket ticket, String comment, IProgressMonitor monitor) throws TracException {
+ updateAPIVersion(monitor);
+
+ Map<String, String> attributes = ticket.getValues();
+ if (!supportsWorkFlow(monitor)) {
+ // submitted as part of status and resolution updates for Trac < 0.11
+ attributes.remove("action"); //$NON-NLS-1$
+ }
+ if (supportsNotifications(monitor)) {
+ call(monitor, "ticket.update", ticket.getId(), comment, attributes, true); //$NON-NLS-1$
+ } else {
+ call(monitor, "ticket.update", ticket.getId(), comment, attributes); //$NON-NLS-1$
+ }
+ }
+
+ public Set<Integer> getChangedTickets(Date since, IProgressMonitor monitor) throws TracException {
+ Object[] ids;
+ ids = (Object[]) call(monitor, "ticket.getRecentChanges", since); //$NON-NLS-1$
+ Set<Integer> result = new HashSet<Integer>();
+ for (Object id : ids) {
+ result.add((Integer) id);
+ }
+ return result;
+ }
+
+ public TracAction[] getActions(int id, IProgressMonitor monitor) throws TracException {
+ if (supportsWorkFlow(monitor)) {
+ Object[] actions = (Object[]) call(monitor, "ticket.getActions", id); //$NON-NLS-1$
+ TracAction[] result = new TracAction[actions.length];
+ for (int i = 0; i < result.length; i++) {
+ Object[] entry = (Object[]) actions[i];
+ TracAction action = new TracAction((String) entry[0]);
+ action.setLabel((String) entry[1]);
+ action.setHint((String) entry[2]);
+ Object[] inputs = (Object[]) entry[3];
+ // each action can be associated with fields
+ for (Object inputArray : inputs) {
+ Object[] inputEntry = (Object[]) inputArray;
+ TracTicketField field = new TracTicketField((String) inputEntry[0]);
+ field.setDefaultValue((String) inputEntry[1]);
+ Object[] optionEntry = (Object[]) inputEntry[2];
+ if (optionEntry.length == 0) {
+ field.setType(Type.TEXT);
+ } else {
+ field.setType(Type.SELECT);
+ String[] options = new String[optionEntry.length];
+ for (int j = 0; j < options.length; j++) {
+ options[j] = (String) optionEntry[j];
+ }
+ field.setOptions(options);
+ }
+ action.addField(field);
+ }
+ result[i] = action;
+ }
+ return result;
+ } else {
+ Object[] actions = (Object[]) call(monitor, "ticket.getAvailableActions", id); //$NON-NLS-1$
+ TracAction[] result = new TracAction[actions.length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = new TracAction((String) actions[i]);
+ }
+ return result;
+ }
+ }
+
+ public Date getTicketLastChanged(Integer id, IProgressMonitor monitor) throws TracException {
+ Object[] result = (Object[]) call(monitor, "ticket.get", id); //$NON-NLS-1$
+ return parseDate(result[2]);
+ }
+
+ public void validateWikiRpcApi(IProgressMonitor monitor) throws TracException {
+ if (((Integer) call(monitor, "wiki.getRPCVersionSupported")) < 2) { //$NON-NLS-1$
+ validate(monitor);
+ }
+ }
+
+ public String wikiToHtml(String sourceText, IProgressMonitor monitor) throws TracException {
+ return (String) call(monitor, "wiki.wikiToHtml", sourceText); //$NON-NLS-1$
+ }
+
+ public String[] getAllWikiPageNames(IProgressMonitor monitor) throws TracException {
+ Object[] result = (Object[]) call(monitor, "wiki.getAllPages"); //$NON-NLS-1$
+ String[] wikiPageNames = new String[result.length];
+ for (int i = 0; i < wikiPageNames.length; i++) {
+ wikiPageNames[i] = (String) result[i];
+ }
+ return wikiPageNames;
+ }
+
+ public TracWikiPageInfo getWikiPageInfo(String pageName, IProgressMonitor monitor) throws TracException {
+ return getWikiPageInfo(pageName, LATEST_VERSION, null);
+ }
+
+ public TracWikiPageInfo getWikiPageInfo(String pageName, int version, IProgressMonitor monitor)
+ throws TracException {
+ // Note: if an unexpected null value is passed to XmlRpcPlugin, XmlRpcClient will throw a TracRemoteException.
+ // So, this null-parameter checking may be omitted if resorting to XmlRpcClient is more appropriate.
+ if (pageName == null) {
+ throw new IllegalArgumentException("Wiki page name cannot be null"); //$NON-NLS-1$
+ }
+
+ Object result = (version == LATEST_VERSION) ? call(monitor, "wiki.getPageInfo", pageName) // //$NON-NLS-1$
+ : call(monitor, "wiki.getPageInfoVersion", pageName, version); //$NON-NLS-1$
+ return parseWikiPageInfo(result);
+ }
+
+ @SuppressWarnings("unchecked")
+ public TracWikiPageInfo[] getWikiPageInfoAllVersions(String pageName, IProgressMonitor monitor)
+ throws TracException {
+ TracWikiPageInfo latestVersion = getWikiPageInfo(pageName, null);
+ Map<String, Object>[] calls = new Map[latestVersion.getVersion() - 1];
+ for (int i = 0; i < calls.length; i++) {
+ calls[i] = createMultiCall("wiki.getPageInfoVersion", pageName, i + 1); //$NON-NLS-1$
+ }
+
+ Object[] result = multicall(monitor, calls);
+
+ TracWikiPageInfo[] versions = new TracWikiPageInfo[result.length + 1];
+ for (int i = 0; i < result.length; i++) {
+ Object pageInfoResult = getMultiCallResult(result[i]);
+ versions[i] = parseWikiPageInfo(pageInfoResult);
+ }
+ versions[result.length] = latestVersion;
+
+ return versions;
+ }
+
+ private TracWikiPageInfo parseWikiPageInfo(Object pageInfoResult) throws InvalidWikiPageException {
+ // Note: Trac XML-RPC Plugin returns 0 (as Integer) if pageName or version doesn't exist,
+ // and XmlRpcClient doesn't throw an Exception in this case
+ if (pageInfoResult instanceof Map<?, ?>) {
+ TracWikiPageInfo pageInfo = new TracWikiPageInfo();
+ Map<?, ?> infoMap = (Map<?, ?>) pageInfoResult;
+ pageInfo.setPageName((String) infoMap.get("name")); //$NON-NLS-1$
+ pageInfo.setAuthor((String) infoMap.get("author")); //$NON-NLS-1$
+ pageInfo.setLastModified(parseDate(infoMap.get("lastModified"))); //$NON-NLS-1$
+ pageInfo.setVersion((Integer) infoMap.get("version")); //$NON-NLS-1$
+ return pageInfo;
+ } else {
+ throw new InvalidWikiPageException("Wiki page name or version does not exist"); //$NON-NLS-1$
+ }
+ }
+
+ public String getWikiPageContent(String pageName, IProgressMonitor monitor) throws TracException {
+ return getWikiPageContent(pageName, LATEST_VERSION, null);
+ }
+
+ public String getWikiPageContent(String pageName, int version, IProgressMonitor monitor) throws TracException {
+ // Note: if an unexpected null value is passed to XmlRpcPlugin, XmlRpcClient will throw a TracRemoteException.
+ // So, this null-parameter checking may be omitted if resorting to XmlRpcClient is more appropriate.
+ if (pageName == null) {
+ throw new IllegalArgumentException("Wiki page name cannot be null"); //$NON-NLS-1$
+ }
+ if (version == LATEST_VERSION) {
+ // XmlRpcClient throws a TracRemoteException if pageName or version doesn't exist
+ return (String) call(monitor, "wiki.getPage", pageName); //$NON-NLS-1$
+ } else {
+ return (String) call(monitor, "wiki.getPageVersion", pageName, version); //$NON-NLS-1$
+ }
+ }
+
+ public String getWikiPageHtml(String pageName, IProgressMonitor monitor) throws TracException {
+ return getWikiPageHtml(pageName, LATEST_VERSION, null);
+ }
+
+ public String getWikiPageHtml(String pageName, int version, IProgressMonitor monitor) throws TracException {
+ if (pageName == null) {
+ throw new IllegalArgumentException("Wiki page name cannot be null"); //$NON-NLS-1$
+ }
+
+ if (version == LATEST_VERSION) {
+ // XmlRpcClient throws a TracRemoteException if pageName or version doesn't exist
+ return (String) call(monitor, "wiki.getPageHTML", pageName); //$NON-NLS-1$
+ } else {
+ return (String) call(monitor, "wiki.getPageHTMLVersion", pageName, version); //$NON-NLS-1$
+ }
+ }
+
+ public TracWikiPageInfo[] getRecentWikiChanges(Date since, IProgressMonitor monitor) throws TracException {
+ if (since == null) {
+ throw new IllegalArgumentException("Date parameter cannot be null"); //$NON-NLS-1$
+ }
+
+ Object[] result = (Object[]) call(monitor, "wiki.getRecentChanges", since); //$NON-NLS-1$
+ TracWikiPageInfo[] changes = new TracWikiPageInfo[result.length];
+ for (int i = 0; i < result.length; i++) {
+ changes[i] = parseWikiPageInfo(result[i]);
+ }
+ return changes;
+ }
+
+ public TracWikiPage getWikiPage(String pageName, IProgressMonitor monitor) throws TracException {
+ return getWikiPage(pageName, LATEST_VERSION, null);
+ }
+
+ public TracWikiPage getWikiPage(String pageName, int version, IProgressMonitor monitor) throws TracException {
+ TracWikiPage page = new TracWikiPage();
+ page.setPageInfo(getWikiPageInfo(pageName, version, null));
+ page.setContent(getWikiPageContent(pageName, version, null));
+ page.setPageHTML(getWikiPageHtml(pageName, version, null));
+ return page;
+ }
+
+ public boolean putWikipage(String pageName, String content, Map<String, Object> attributes, IProgressMonitor monitor)
+ throws TracException {
+ Boolean result = (Boolean) call(monitor, "wiki.putPage", pageName, content, attributes); //$NON-NLS-1$
+ return result.booleanValue();
+ }
+
+ public String[] listWikiPageAttachments(String pageName, IProgressMonitor monitor) throws TracException {
+ Object[] result = (Object[]) call(monitor, "wiki.listAttachments", pageName); //$NON-NLS-1$
+ String[] attachments = new String[result.length];
+ for (int i = 0; i < attachments.length; i++) {
+ attachments[i] = (String) result[i];
+ }
+ return attachments;
+ }
+
+ public InputStream getWikiPageAttachmentData(String pageName, String fileName, IProgressMonitor monitor)
+ throws TracException {
+ String attachmentName = pageName + "/" + fileName; //$NON-NLS-1$
+ byte[] data = (byte[]) call(monitor, "wiki.getAttachment", attachmentName); //$NON-NLS-1$
+ return new ByteArrayInputStream(data);
+ }
+
+ /**
+ * Attach a file to a Wiki page on the repository.
+ * <p>
+ * This implementation uses the wiki.putAttachmentEx() call, which provides a richer functionality specific to Trac.
+ *
+ * @param pageName
+ * the name of the Wiki page
+ * @param fileName
+ * the name of the file to be attached
+ * @param description
+ * the description of the attachment
+ * @param in
+ * An InputStream of the content of the attachment
+ * @param replace
+ * whether to overwrite an existing attachment with the same filename
+ * @return The (possibly transformed) filename of the attachment. If <code>replace</code> is <code>true</code>, the
+ * returned name is always the same as the argument <code>fileName</code>; if <code>replace</code> is
+ * <code>false</code> and an attachment with name <code>fileName</code> already exists, a number is appended
+ * to the file name (before suffix) and the generated filename of the attachment is returned.
+ * @throws TracException
+ */
+ public String putWikiPageAttachmentData(String pageName, String fileName, String description, InputStream in,
+ boolean replace, IProgressMonitor monitor) throws TracException {
+ byte[] data;
+ try {
+ data = readData(in, new NullProgressMonitor());
+ } catch (IOException e) {
+ throw new TracException(e);
+ }
+ return (String) call(monitor, "wiki.putAttachmentEx", pageName, fileName, description, data, replace); //$NON-NLS-1$
+ }
+
+ public void deleteTicket(int ticketId, IProgressMonitor monitor) throws TracException {
+ call(monitor, "ticket.delete", ticketId); //$NON-NLS-1$
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/messages.properties b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/messages.properties
new file mode 100644
index 0000000..dbbb3ef
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/client/messages.properties
@@ -0,0 +1,5 @@
+TracWebClient_Trac_version_X_is_unsupported_Error=The Trac version {0} is unsupported. Please use a version from 0.9 to 0.11
+TracWebClient_Updating_attributes=Updating attributes
+TracXmlRpcClient_API_version_unsupported_Error=The API version is unsupported, update the Trac XML-RPC Plugin to revision {0} or later
+TracXmlRpcClient_API_version_X_unsupported_Error=The API version {0} is unsupported, update the Trac XML-RPC Plugin to revision {1} or later
+TracXmlRpcClient_Required_API_calls_missing_Error=Required API calls are missing, update the Trac XML-RPC Plugin to revision {0} or later
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/messages.properties b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/messages.properties
new file mode 100644
index 0000000..5d1504b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/messages.properties
@@ -0,0 +1,40 @@
+TracAttachmentHandler_Uploading_attachment=Uploading attachment
+
+TracAttribute_Assigned_to=Assigned to:
+TracAttribute_CC=CC:
+TracAttribute_Component=Component:
+TracAttribute_Created=Created:
+TracAttribute_Description=Description:
+TracAttribute_ID=ID:
+TracAttribute_Keywords=Keywords:
+TracAttribute_Last_Modification=Last Modification:
+TracAttribute_Milestone=Milestone:
+TracAttribute_Priority=Priority:
+TracAttribute_Reporter=Reporter:
+TracAttribute_Resolution=Resolution:
+TracAttribute_Severity=Severity:
+TracAttribute_Status=Status:
+TracAttribute_Summary=Summary:
+TracAttribute_Type=Type:
+TracAttribute_Version=Version:
+
+TracCorePlugin_I_O_error_has_occured=I/O error has occured
+TracCorePlugin_Repository_URL_is_invalid=Repository URL is invalid
+TracCorePlugin_the_SERVER_RETURNED_an_UNEXPECTED_RESOPNSE=The server returned an unexpected response
+TracCorePlugin_Unexpected_error=Unexpected error
+TracCorePlugin_Unexpected_server_response_=Unexpected server response:
+
+TracRepositoryConnector_Getting_changed_tasks=Getting changed tasks
+TracRepositoryConnector_Querying_repository=Querying repository
+TracRepositoryConnector_Trac_Client_Label=Trac (supports 0.9 to 0.11 through Web and XML-RPC)
+TracTaskDataHandler_Accept=Accept
+TracTaskDataHandler_Leave=Leave
+TracTaskDataHandler_Leave_as_Status=Leave as {0}
+TracTaskDataHandler_Leave_as_Status_Resolution=Leave as {0} {1}
+TracTaskDataHandler_Reopen=Reopen
+TracTaskDataHandler_Resolve_as=Resolve as
+
+TracWikiHandler_Download_Wiki_Page=Download Wiki Page
+TracWikiHandler_Download_Wiki_Page_Names=Download Wiki Page Names
+TracWikiHandler_Retrieve_Wiki_Page_History=Retrieve Wiki Page History
+TracWikiHandler_Upload_Wiki_Page=Upload Wiki Page
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAction.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAction.java
new file mode 100644
index 0000000..632c739
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAction.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Steffen Pingel 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:
+ * Steffen Pingel - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracAction {
+
+ private List<TracTicketField> fields;
+
+ private String hint;
+
+ private String id;
+
+ private String label;
+
+ public TracAction(String id) {
+ this.id = id;
+ }
+
+ public void addField(TracTicketField field) {
+ if (fields == null) {
+ fields = new ArrayList<TracTicketField>();
+ }
+ fields.add(field);
+ }
+
+ public List<TracTicketField> getFields() {
+ if (fields == null) {
+ return Collections.emptyList();
+ }
+ return new ArrayList<TracTicketField>(fields);
+ }
+
+ public String getHint() {
+ return hint;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void removeField(TracTicketField field) {
+ if (fields != null) {
+ fields.remove(field);
+ }
+ }
+
+ public void setHint(String hint) {
+ this.hint = hint;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAttachment.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAttachment.java
new file mode 100644
index 0000000..4519d5e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracAttachment.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.util.Date;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracAttachment {
+
+ private String author;
+
+ private Date created;
+
+ private String description;
+
+ private String filename;
+
+ int size;
+
+ public TracAttachment(String filename) {
+ this.filename = filename;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public Date getCreated() {
+ return created;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getFilename() {
+ return filename;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setFilename(String filename) {
+ this.filename = filename;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ @Override
+ public String toString() {
+ return filename;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComment.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComment.java
new file mode 100644
index 0000000..1a87bae
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComment.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.util.Date;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracComment {
+
+ private String author;
+
+ private Date created;
+
+ private String field;
+
+ private String newValue;
+
+ private String oldValue;
+
+ private boolean permanent;
+
+ public TracComment() {
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public Date getCreated() {
+ return created;
+ }
+
+ public String getField() {
+ return field;
+ }
+
+ public String getNewValue() {
+ return newValue;
+ }
+
+ public String getOldValue() {
+ return oldValue;
+ }
+
+ public boolean isPermanent() {
+ return permanent;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ public void setField(String field) {
+ this.field = field;
+ }
+
+ public void setNewValue(String newValue) {
+ this.newValue = newValue;
+ }
+
+ public void setOldValue(String oldValue) {
+ this.oldValue = oldValue;
+ }
+
+ public void setPermanent(boolean permanent) {
+ this.permanent = permanent;
+ }
+
+ @Override
+ public String toString() {
+ return "[" + field + "] " + author + ": " + oldValue + " -> " + newValue; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java
new file mode 100644
index 0000000..5c4cf5d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracComponent.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracComponent extends TracRepositoryAttribute {
+
+ private static final long serialVersionUID = -6181067219323677076L;
+
+ private String owner;
+
+ private String description;
+
+ public TracComponent(String name) {
+ super(name);
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java
new file mode 100644
index 0000000..e34007d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracMilestone.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracMilestone extends TracRepositoryAttribute implements Serializable {
+
+ private static final long serialVersionUID = 6648558552508886484L;
+
+ private Date due;
+
+ private Date completed;
+
+ private String description;
+
+ public TracMilestone(String name) {
+ super(name);
+ }
+
+ public Date getCompleted() {
+ return completed;
+ }
+
+ public void setCompleted(Date completed) {
+ this.completed = completed;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Date getDue() {
+ return due;
+ }
+
+ public void setDue(Date due) {
+ this.due = due;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracPriority.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracPriority.java
new file mode 100644
index 0000000..6d5f724
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracPriority.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracPriority extends TracTicketAttribute {
+
+ private static final long serialVersionUID = 3617078252773178266L;
+
+ public TracPriority(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryAttribute.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryAttribute.java
new file mode 100644
index 0000000..ece1b7c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryAttribute.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.io.Serializable;
+
+import org.eclipse.core.runtime.Assert;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositoryAttribute implements Serializable {
+
+ private static final long serialVersionUID = -4535033208999685315L;
+
+ private String name;
+
+ public TracRepositoryAttribute(String name) {
+ Assert.isNotNull(name);
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ // FIXME serialization can restore null values here
+ return (name != null) ? name : ""; //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryInfo.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryInfo.java
new file mode 100644
index 0000000..65f2bf4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracRepositoryInfo.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Steffen Pingel 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:
+ * Steffen Pingel - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.model;
+
+/**
+ * The version of the Trac repository is defined by three numbers: epoch.major.minor. The default value is
+ * <code>-1.-1.-1</code> which indicates the version is not known.
+ *
+ * <pre>
+ * [0.0.0] Trac 0.9.6
+ * [0.0.1, 1.0.0) Trac 0.10
+ * [1.0.0, 2.0.0) Trac 0.11
+ * </pre>
+ *
+ * @author Steffen Pingel
+ */
+public class TracRepositoryInfo {
+
+ private final int apiEpoch;
+
+ private final int apiMajor;
+
+ private final int apiMinor;
+
+ private String version;
+
+ public TracRepositoryInfo() {
+ this(null);
+ }
+
+ public TracRepositoryInfo(int apiEpoch, int apiMajor, int apiMinor) {
+ this(apiEpoch, apiMajor, apiMinor, null);
+ }
+
+ public TracRepositoryInfo(int apiEpoch, int apiMajor, int apiMinor, String version) {
+ this.apiEpoch = apiEpoch;
+ this.apiMajor = apiMajor;
+ this.apiMinor = apiMinor;
+ this.version = version;
+ }
+
+ public TracRepositoryInfo(String version) {
+ this(-1, -1, -1, version);
+ }
+
+ public int getApiEpoch() {
+ return apiEpoch;
+ }
+
+ public int getApiMajor() {
+ return apiMajor;
+ }
+
+ public int getApiMinor() {
+ return apiMinor;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public boolean isApiVersion(int epoch, int major, int minor) {
+ return apiEpoch == epoch && apiMajor == major && apiMinor == minor;
+ }
+
+ public boolean isApiVersionOrHigher(int epoch, int major, int minor) {
+ return apiEpoch > epoch //
+ || apiEpoch == epoch && (apiMajor > major //
+ || apiMajor == major && apiMinor >= minor);
+ }
+
+ public boolean isApiVersionOrSmaller(int epoch, int major, int minor) {
+ return apiEpoch < epoch //
+ || apiEpoch == epoch && (apiMajor < major //
+ || apiMajor == major && apiMinor <= minor);
+ }
+
+ public boolean isStale() {
+ return apiEpoch == -1 || apiMajor == -1 || apiMinor == -1;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(apiEpoch);
+ sb.append("."); //$NON-NLS-1$
+ sb.append(apiMajor);
+ sb.append("."); //$NON-NLS-1$
+ sb.append(apiMinor);
+ if (version != null) {
+ sb.append(" ("); //$NON-NLS-1$
+ sb.append(version);
+ sb.append(")"); //$NON-NLS-1$
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSearch.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSearch.java
new file mode 100644
index 0000000..3f93083
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSearch.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Represents a Trac search. A search can have multiple {@link TracSearchFilter}s that all need to match.
+ *
+ * @author Steffen Pingel
+ */
+public class TracSearch {
+
+ /** Stores search criteria in the order entered by the user. */
+ private final Map<String, TracSearchFilter> filterByFieldName = new LinkedHashMap<String, TracSearchFilter>();
+
+ /** The field the result is ordered by. */
+ private String orderBy;
+
+ private boolean ascending = true;
+
+ private int max = -1;
+
+ public TracSearch(String queryParameter) {
+ fromUrl(queryParameter);
+ }
+
+ public TracSearch() {
+ }
+
+ public void addFilter(String key, String value) {
+ TracSearchFilter filter = filterByFieldName.get(key);
+ if (filter == null) {
+ filter = new TracSearchFilter(key);
+ CompareOperator operator = CompareOperator.fromUrl(value);
+ filter.setOperator(operator);
+ filterByFieldName.put(key, filter);
+ }
+
+ filter.addValue(value.substring(filter.getOperator().getQueryValue().length()));
+ }
+
+ public void addFilter(TracSearchFilter filter) {
+ filterByFieldName.put(filter.getFieldName(), filter);
+ }
+
+ public List<TracSearchFilter> getFilters() {
+ return new ArrayList<TracSearchFilter>(filterByFieldName.values());
+ }
+
+ public void setAscending(boolean ascending) {
+ this.ascending = ascending;
+ }
+
+ public boolean isAscending() {
+ return ascending;
+ }
+
+ public void setOrderBy(String orderBy) {
+ this.orderBy = orderBy;
+ }
+
+ public String getOrderBy() {
+ return orderBy;
+ }
+
+ /**
+ * @see #toQuery(boolean)
+ */
+ public String toQuery() {
+ return toQuery(false);
+ }
+
+ /**
+ * Returns a Trac query string that conforms to the format defined at {@link http
+ * ://projects.edgewall.com/trac/wiki/TracQuery#QueryLanguage}.
+ *
+ * @return the empty string, if no search order and criteria are defined; a string that starts with &, otherwise
+ */
+ public String toQuery(boolean supportsMax) {
+ StringBuilder sb = new StringBuilder();
+ if (orderBy != null) {
+ sb.append("&order="); //$NON-NLS-1$
+ sb.append(orderBy);
+ if (!ascending) {
+ sb.append("&desc=1"); //$NON-NLS-1$
+ }
+ }
+ if (supportsMax && max != -1) {
+ sb.append("&max="); //$NON-NLS-1$
+ sb.append(max);
+ }
+ for (TracSearchFilter filter : filterByFieldName.values()) {
+ sb.append("&"); //$NON-NLS-1$
+ sb.append(filter.getFieldName());
+ sb.append(filter.getOperator().getQueryValue());
+ sb.append("="); //$NON-NLS-1$
+ List<String> values = filter.getValues();
+ for (Iterator<String> it = values.iterator(); it.hasNext();) {
+ sb.append(it.next());
+ if (it.hasNext()) {
+ sb.append("|"); //$NON-NLS-1$
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Returns a URL encoded string that can be passed as an argument to the Trac query script.
+ *
+ * @return the empty string, if no search order and criteria are defined; a string that starts with &, otherwise
+ */
+ public String toUrl() {
+ StringBuilder sb = new StringBuilder();
+ if (orderBy != null) {
+ sb.append("&order="); //$NON-NLS-1$
+ sb.append(orderBy);
+ if (!ascending) {
+ sb.append("&desc=1"); //$NON-NLS-1$
+ }
+ } else if (filterByFieldName.isEmpty()) {
+ // TODO figure out why search must be ordered when logged in (otherwise
+ // no results will be returned)
+ sb.append("&order=id"); //$NON-NLS-1$
+ }
+ if (max != -1) {
+ sb.append("&max="); //$NON-NLS-1$
+ sb.append(max);
+ }
+
+ for (TracSearchFilter filter : filterByFieldName.values()) {
+ for (String value : filter.getValues()) {
+ sb.append("&"); //$NON-NLS-1$
+ sb.append(filter.getFieldName());
+ sb.append("="); //$NON-NLS-1$
+ try {
+ sb.append(URLEncoder.encode(filter.getOperator().getQueryValue(), ITracClient.CHARSET));
+ sb.append(URLEncoder.encode(value, ITracClient.CHARSET));
+ } catch (UnsupportedEncodingException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "Unexpected exception while decoding URL", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ public void fromUrl(String url) {
+ StringTokenizer t = new StringTokenizer(url, "&"); //$NON-NLS-1$
+ while (t.hasMoreTokens()) {
+ String token = t.nextToken();
+ int i = token.indexOf("="); //$NON-NLS-1$
+ if (i != -1) {
+ try {
+ String key = URLDecoder.decode(token.substring(0, i), ITracClient.CHARSET);
+ String value = URLDecoder.decode(token.substring(i + 1), ITracClient.CHARSET);
+
+ if ("order".equals(key)) { //$NON-NLS-1$
+ setOrderBy(value);
+ } else if ("desc".equals(key)) { //$NON-NLS-1$
+ setAscending(!"1".equals(value)); //$NON-NLS-1$
+ } else if ("group".equals(key) || "groupdesc".equals(key) || "verbose".equals(key)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ // ignore these parameters
+ } else if ("max".equals(key)) { //$NON-NLS-1$
+ try {
+ setMax(Integer.parseInt(value));
+ } catch (NumberFormatException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN, NLS.bind(
+ "Illegal format in URL, expected a number ''{0}''", value), e)); //$NON-NLS-1$
+ }
+ } else {
+ addFilter(key, value);
+ }
+ } catch (UnsupportedEncodingException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracCorePlugin.ID_PLUGIN,
+ "Unexpected exception while decoding URL", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ public int getMax() {
+ return max;
+ }
+
+ public void setMax(int max) {
+ this.max = max;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSearchFilter.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSearchFilter.java
new file mode 100644
index 0000000..0af4a64
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSearchFilter.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a search criterion. Each criterion is applied to a field such as milestone or priority. It has a compare
+ * operator and a list of values. The compare mode is <code>OR</code> for the operators <code>contains</code>,
+ * <code>starts with</code>, <code>ends with</code> and <code>is</code>. The compare mode is <code>AND</code> for all
+ * other (negated) operators.
+ *
+ * @author Steffen Pingel
+ */
+public class TracSearchFilter {
+
+ public enum CompareOperator {
+ CONTAINS("~"), CONTAINS_NOT("!~"), BEGINS_WITH("^"), NOT_BEGINS_WITH("!^"), ENDS_WITH("$"), NOT_ENDS_WITH("!$"), IS( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ ""), IS_NOT("!"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ public static CompareOperator fromUrl(String value) {
+ for (CompareOperator operator : values()) {
+ if (operator != IS && operator != IS_NOT && value.startsWith(operator.queryValue)) {
+ return operator;
+ }
+ }
+ if (value.startsWith(IS_NOT.queryValue)) {
+ return IS_NOT;
+ }
+ return IS;
+ }
+
+ /** The string that represent the operator in a Trac query. */
+ private String queryValue;
+
+ CompareOperator(String queryValue) {
+ this.queryValue = queryValue;
+ }
+
+ public String getQueryValue() {
+ return queryValue;
+ }
+
+ @Override
+ public String toString() {
+ switch (this) {
+ case CONTAINS:
+ return "contains"; //$NON-NLS-1$
+ case CONTAINS_NOT:
+ return "does not contain"; //$NON-NLS-1$
+ case BEGINS_WITH:
+ return "begins with"; //$NON-NLS-1$
+ case NOT_BEGINS_WITH:
+ return "does not begin with"; //$NON-NLS-1$
+ case ENDS_WITH:
+ return "ends with"; //$NON-NLS-1$
+ case NOT_ENDS_WITH:
+ return "does not end with"; //$NON-NLS-1$
+ case IS_NOT:
+ return "is not"; //$NON-NLS-1$
+ default:
+ return "is"; //$NON-NLS-1$
+ }
+ }
+
+ }
+
+ private final String fieldName;
+
+ private CompareOperator operator;
+
+ private final List<String> values = new ArrayList<String>();
+
+ public TracSearchFilter(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ public void addValue(String value) {
+ values.add(value);
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public CompareOperator getOperator() {
+ return operator;
+ }
+
+ public List<String> getValues() {
+ return values;
+ }
+
+ public void setOperator(CompareOperator operator) {
+ this.operator = operator;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSeverity.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSeverity.java
new file mode 100644
index 0000000..88a934e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracSeverity.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracSeverity extends TracTicketAttribute {
+
+ private static final long serialVersionUID = 2173932517704827316L;
+
+ public TracSeverity(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicket.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicket.java
new file mode 100644
index 0000000..dbd8b60
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicket.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.internal.trac.core.client.InvalidTicketException;
+
+/**
+ * Represents a Trac ticket as it is retrieved from a Trac repository.
+ *
+ * @author Steffen Pingel
+ */
+public class TracTicket {
+
+ /**
+ * Represents the key of a string propertiy of a ticket.
+ *
+ * @author Steffen Pingel
+ */
+ public enum Key {
+ CC("cc"), CHANGE_TIME("changetime"), COMPONENT("component"), DESCRIPTION("description"), ID("id"), KEYWORDS( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ "keywords"), MILESTONE("milestone"), OWNER("owner"), PRIORITY("priority"), REPORTER("reporter"), RESOLUTION( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ "resolution"), STATUS("status"), SEVERITY("severity"), SUMMARY("summary"), TIME("time"), TYPE("type"), VERSION( //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ "version"); //$NON-NLS-1$
+
+ public static Key fromKey(String name) {
+ for (Key key : Key.values()) {
+ if (key.getKey().equals(name)) {
+ return key;
+ }
+ }
+ return null;
+ }
+
+ private String key;
+
+ Key(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String toString() {
+ return key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+ }
+
+ public static final int INVALID_ID = -1;
+
+ private Date created;
+
+ /**
+ * User defined custom ticket fields.
+ *
+ * @see http://projects.edgewall.com/trac/wiki/TracTicketsCustomFields
+ */
+ private Map<String, String> customValueByKey;
+
+ private int id = INVALID_ID;
+
+ private Date lastChanged;
+
+ /** Trac's built-in ticket properties. */
+ private final Map<Key, String> valueByKey = new HashMap<Key, String>();
+
+ private List<TracComment> comments;
+
+ private List<TracAttachment> attachments;
+
+ private TracAction[] actions;
+
+ private String[] resolutions;
+
+ public TracTicket() {
+ }
+
+ /**
+ * Constructs a Trac ticket.
+ *
+ * @param id
+ * the numeric Trac ticket id
+ */
+ public TracTicket(int id) {
+ this.id = id;
+ }
+
+ public Date getCreated() {
+ return created;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public Date getLastChanged() {
+ return lastChanged;
+ }
+
+ public String getCustomValue(String key) {
+ if (customValueByKey == null) {
+ return null;
+ }
+ return customValueByKey.get(key);
+ }
+
+ public String getValue(Key key) {
+ return valueByKey.get(key);
+ }
+
+ public Map<String, String> getValues() {
+ Map<String, String> result = new HashMap<String, String>();
+ for (Key key : valueByKey.keySet()) {
+ result.put(key.getKey(), valueByKey.get(key));
+ }
+ if (customValueByKey != null) {
+ result.putAll(customValueByKey);
+ }
+ return result;
+ }
+
+ public boolean isValid() {
+ return getId() != TracTicket.INVALID_ID;
+ }
+
+ public void putBuiltinValue(Key key, String value) throws InvalidTicketException {
+ valueByKey.put(key, value);
+ }
+
+ public void putCustomValue(String key, String value) {
+ if (customValueByKey == null) {
+ customValueByKey = new HashMap<String, String>();
+ }
+ customValueByKey.put(key, value);
+ }
+
+ /**
+ * Stores a value as it is retrieved from the repository.
+ *
+ * @throws InvalidTicketException
+ * thrown if the type of <code>value</code> is not valid
+ */
+ public boolean putValue(String keyName, String value) throws InvalidTicketException {
+ Key key = Key.fromKey(keyName);
+ if (key != null) {
+ if (key == Key.ID || key == Key.TIME || key == Key.CHANGE_TIME) {
+ return false;
+ }
+ putBuiltinValue(key, value);
+ } else if (value != null) {
+ putCustomValue(keyName, value);
+ } else {
+ throw new InvalidTicketException("Expected string value for custom key '" + keyName + "', got '" + value //$NON-NLS-1$ //$NON-NLS-2$
+ + "'"); //$NON-NLS-1$
+ }
+ return true;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public void setLastChanged(Date lastChanged) {
+ this.lastChanged = lastChanged;
+ }
+
+ public void addComment(TracComment comment) {
+ if (comments == null) {
+ comments = new ArrayList<TracComment>();
+ }
+ comments.add(comment);
+ }
+
+ public void addAttachment(TracAttachment attachment) {
+ if (attachments == null) {
+ attachments = new ArrayList<TracAttachment>();
+ }
+ attachments.add(attachment);
+ }
+
+ public TracComment[] getComments() {
+ return (comments != null) ? comments.toArray(new TracComment[0]) : null;
+ }
+
+ public TracAttachment[] getAttachments() {
+ return (attachments != null) ? attachments.toArray(new TracAttachment[0]) : null;
+ }
+
+ public void setActions(TracAction[] actions) {
+ this.actions = actions;
+ }
+
+ public TracAction[] getActions() {
+ return actions;
+ }
+
+ public void setResolutions(String[] resolutions) {
+ this.resolutions = resolutions;
+ }
+
+ public String[] getResolutions() {
+ return resolutions;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketAttribute.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketAttribute.java
new file mode 100644
index 0000000..905cbc8
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketAttribute.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTicketAttribute implements Comparable<TracTicketAttribute>, Serializable {
+
+ private static final long serialVersionUID = -8611030780681519787L;
+
+ private final String name;
+
+ private final int value;
+
+ public TracTicketAttribute(String name, int value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public int compareTo(TracTicketAttribute o) {
+ return value - o.value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketField.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketField.java
new file mode 100644
index 0000000..6148af4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketField.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTicketField implements Serializable {
+
+ private static final long serialVersionUID = -640983268404073300L;
+
+ public enum Type {
+ TEXT, CHECKBOX, SELECT, RADIO, TEXTAREA;
+
+ public static Type fromString(String value) {
+ value = value.toLowerCase();
+ if ("text".equals(value)) { //$NON-NLS-1$
+ return TEXT;
+ } else if ("checkbox".equals(value)) { //$NON-NLS-1$
+ return CHECKBOX;
+ } else if ("select".equals(value)) { //$NON-NLS-1$
+ return SELECT;
+ } else if ("radio".equals(value)) { //$NON-NLS-1$
+ return RADIO;
+ } else if ("textarea".equals(value)) { //$NON-NLS-1$
+ return TEXTAREA;
+ }
+ return TEXT;
+ }
+
+ }
+
+ public static final int DEFAULT_SIZE = -1;
+
+ private String name;
+
+ private Type type;
+
+ private String label;
+
+ private String[] options;
+
+ private String defaultValue;
+
+ private boolean custom;
+
+ private int order;
+
+ private boolean optional;
+
+ private int width = DEFAULT_SIZE;
+
+ private int height = DEFAULT_SIZE;
+
+ public TracTicketField(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String[] getOptions() {
+ return options;
+ }
+
+ public void setOptions(String[] options) {
+ this.options = options;
+ }
+
+ public int getOrder() {
+ return order;
+ }
+
+ public void setOrder(int order) {
+ this.order = order;
+ }
+
+ public boolean isOptional() {
+ return optional;
+ }
+
+ public void setOptional(boolean optional) {
+ this.optional = optional;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public boolean isCustom() {
+ return custom;
+ }
+
+ public void setCustom(boolean custom) {
+ this.custom = custom;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketResolution.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketResolution.java
new file mode 100644
index 0000000..e766268
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketResolution.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTicketResolution extends TracTicketAttribute {
+
+ private static final long serialVersionUID = -6933211257044813716L;
+
+ public TracTicketResolution(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketStatus.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketStatus.java
new file mode 100644
index 0000000..682ebb2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketStatus.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTicketStatus extends TracTicketAttribute {
+
+ private static final long serialVersionUID = -8844909853931772506L;
+
+ public TracTicketStatus(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketType.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketType.java
new file mode 100644
index 0000000..47d0458
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracTicketType.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTicketType extends TracTicketAttribute {
+
+ private static final long serialVersionUID = -3157354751904259304L;
+
+ public TracTicketType(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java
new file mode 100644
index 0000000..38e34a6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracVersion.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.util.Date;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracVersion extends TracRepositoryAttribute {
+
+ private static final long serialVersionUID = 9018237956062697410L;
+
+ private Date time;
+
+ private String description;
+
+ public TracVersion(String name) {
+ super(name);
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Date getTime() {
+ return time;
+ }
+
+ public void setTime(Date time) {
+ this.time = time;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracWikiPage.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracWikiPage.java
new file mode 100644
index 0000000..922f80d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracWikiPage.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.model;
+
+/**
+ * Represents a Trac Wiki page at a specific version.
+ *
+ * @author Xiaoyang Guan
+ */
+public class TracWikiPage {
+
+ private TracWikiPageInfo pageInfo;
+
+ private String content;
+
+ private String pageHTML;
+
+ public TracWikiPage() {
+ }
+
+ public TracWikiPageInfo getPageInfo() {
+ return pageInfo;
+ }
+
+ public void setPageInfo(TracWikiPageInfo pageInfo) {
+ this.pageInfo = pageInfo;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getPageHTML() {
+ return pageHTML;
+ }
+
+ public void setPageHTML(String pageHTML) {
+ this.pageHTML = pageHTML;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ } else if (this == obj) {
+ return true;
+ } else if (getClass() != obj.getClass()) {
+ return false;
+ } else {
+ TracWikiPage other = (TracWikiPage) obj;
+ return content.equals(other.content) && pageInfo.toString().equals(other.pageInfo.toString());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracWikiPageInfo.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracWikiPageInfo.java
new file mode 100644
index 0000000..4c15b0f
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/model/TracWikiPageInfo.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.model;
+
+import java.util.Date;
+
+/**
+ * Information about a Trac Wiki page at a specific version
+ *
+ * @author Xiaoyang Guan
+ */
+public class TracWikiPageInfo {
+
+ private String pageName;
+
+ private String author;
+
+ private Date lastModified;
+
+ private int version;
+
+ private String comment;
+
+ public TracWikiPageInfo() {
+ }
+
+ public String getPageName() {
+ return pageName;
+ }
+
+ public void setPageName(String pageName) {
+ this.pageName = pageName;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public Date getLastModified() {
+ return lastModified;
+ }
+
+ public void setLastModified(Date lastModified) {
+ this.lastModified = lastModified;
+ }
+
+ public int getVersion() {
+ return version;
+ }
+
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ @Override
+ public String toString() {
+ return pageName + ": version " + version + " by " + author + " last modified at " + lastModified; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/HttpMethodInterceptor.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/HttpMethodInterceptor.java
new file mode 100644
index 0000000..e1b2633
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/HttpMethodInterceptor.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.core.util;
+
+import org.apache.commons.httpclient.HttpMethod;
+
+/**
+ * @author Steffen Pingel
+ */
+public interface HttpMethodInterceptor {
+
+ public abstract void processRequest(HttpMethod method);
+
+ public abstract void processResponse(HttpMethod method);
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/Messages.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/Messages.java
new file mode 100644
index 0000000..9f71e5a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.core.util;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages {
+
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.trac.core.util.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TracUtil_Permission_denied;
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracHttpClientTransportFactory.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracHttpClientTransportFactory.java
new file mode 100644
index 0000000..b78a686
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracHttpClientTransportFactory.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.util;
+
+import java.io.BufferedOutputStream;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpVersion;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientException;
+import org.apache.xmlrpc.client.XmlRpcHttpClientConfig;
+import org.apache.xmlrpc.client.XmlRpcHttpTransport;
+import org.apache.xmlrpc.client.XmlRpcTransport;
+import org.apache.xmlrpc.client.XmlRpcTransportFactory;
+import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
+import org.apache.xmlrpc.util.HttpUtil;
+import org.apache.xmlrpc.util.XmlRpcIOException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.xml.sax.SAXException;
+
+/**
+ * A custom transport factory used to establish XML-RPC connections. Uses the Mylyn proxy settings.
+ *
+ * @author Steffen Pingel
+ */
+public class TracHttpClientTransportFactory implements XmlRpcTransportFactory {
+
+ /**
+ * A transport that uses the Apache HttpClient library.
+ */
+ public static class TracHttpClientTransport extends XmlRpcHttpTransport {
+
+ private final HttpClient httpClient;
+
+ private final AbstractWebLocation location;
+
+ private PostMethod method;
+
+ private int contentLength = -1;
+
+ private XmlRpcHttpClientConfig config;
+
+ private IProgressMonitor monitor;
+
+ private HostConfiguration hostConfiguration;
+
+ private final HttpMethodInterceptor interceptor;
+
+ public TracHttpClientTransport(XmlRpcClient client, HttpClient httpClient, AbstractWebLocation location,
+ HttpMethodInterceptor interceptor) {
+ super(client, ""); //$NON-NLS-1$
+ this.httpClient = httpClient;
+ this.location = location;
+ this.interceptor = interceptor;
+ }
+
+ @Override
+ protected void close() throws XmlRpcClientException {
+ method.releaseConnection();
+ }
+
+ public int getContentLength() {
+ return contentLength;
+ }
+
+ @Override
+ protected InputStream getInputStream() throws XmlRpcException {
+ int responseCode = method.getStatusCode();
+ if (responseCode != HttpURLConnection.HTTP_OK) {
+ throw new TracHttpException(responseCode);
+ }
+
+ try {
+ return method.getResponseBodyAsStream();
+ } catch (HttpException e) {
+ throw new XmlRpcClientException("Error in HTTP transport: " + e.getMessage(), e); //$NON-NLS-1$
+ } catch (IOException e) {
+ throw new XmlRpcClientException("I/O error in server communication: " + e.getMessage(), e); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ protected String getUserAgent() {
+ return WebUtil.getUserAgent(""); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void initHttpHeaders(XmlRpcRequest request) throws XmlRpcClientException {
+ config = (XmlRpcHttpClientConfig) request.getConfig();
+
+ if (request instanceof TracXmlRpcClientRequest) {
+ TracXmlRpcClientRequest tracRequest = (TracXmlRpcClientRequest) request;
+ monitor = tracRequest.getProgressMonitor();
+ } else {
+ monitor = null;
+ }
+
+ String url = config.getServerURL().toString();
+ hostConfiguration = WebUtil.createHostConfiguration(httpClient, location, monitor);
+ method = new PostMethod(WebUtil.getRequestPath(url));
+
+ super.initHttpHeaders(request);
+
+ if (config.getConnectionTimeout() != 0) {
+ httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(config.getConnectionTimeout());
+ }
+
+ if (config.getReplyTimeout() != 0) {
+ httpClient.getHttpConnectionManager().getParams().setSoTimeout(config.getConnectionTimeout());
+ }
+
+ method.getParams().setVersion(HttpVersion.HTTP_1_1);
+
+ if (interceptor != null) {
+ interceptor.processRequest(method);
+ }
+ }
+
+ @Override
+ protected boolean isResponseGzipCompressed(XmlRpcStreamRequestConfig config) {
+ Header header = method.getResponseHeader("Content-Encoding"); //$NON-NLS-1$
+ return header != null && HttpUtil.isUsingGzipEncoding(header.getValue());
+ }
+
+ @Override
+ protected void setContentLength(int contentLength) {
+ this.contentLength = contentLength;
+ }
+
+ @Override
+ protected void setCredentials(XmlRpcHttpClientConfig config) throws XmlRpcClientException {
+ // handled by TracXmlRpcClient
+ }
+
+ @Override
+ protected void setRequestHeader(String header, String value) {
+ method.setRequestHeader(new Header(header, value));
+ }
+
+ @Override
+ protected void writeRequest(final ReqWriter writer) throws XmlRpcException {
+ method.setRequestEntity(new RequestEntity() {
+ public long getContentLength() {
+ return TracHttpClientTransport.this.getContentLength();
+ }
+
+ public String getContentType() {
+ return "text/xml"; //$NON-NLS-1$
+ }
+
+ public boolean isRepeatable() {
+ return getContentLength() != -1;
+ }
+
+ public void writeRequest(OutputStream pOut) throws IOException {
+ try {
+ /* Make sure, that the socket is not closed by replacing it with our
+ * own BufferedOutputStream.
+ */
+ OutputStream ostream;
+ if (isUsingByteArrayOutput(config)) {
+ // No need to buffer the output.
+ ostream = new FilterOutputStream(pOut) {
+ @Override
+ public void close() throws IOException {
+ flush();
+ }
+ };
+ } else {
+ ostream = new BufferedOutputStream(pOut) {
+ @Override
+ public void close() throws IOException {
+ flush();
+ }
+ };
+ }
+ writer.write(ostream);
+ } catch (XmlRpcException e) {
+ throw new XmlRpcIOException(e);
+ } catch (SAXException e) {
+ throw new XmlRpcIOException(e);
+ }
+ }
+ });
+
+ try {
+ WebUtil.execute(httpClient, hostConfiguration, method, monitor);
+ if (interceptor != null) {
+ interceptor.processResponse(method);
+ }
+ } catch (XmlRpcIOException e) {
+ Throwable t = e.getLinkedException();
+ if (t instanceof XmlRpcException) {
+ throw (XmlRpcException) t;
+ } else {
+ throw new XmlRpcException("Unexpected exception: " + t.getMessage(), t); //$NON-NLS-1$
+ }
+ } catch (IOException e) {
+ throw new XmlRpcException("I/O error while communicating with HTTP server: " + e.getMessage(), e); //$NON-NLS-1$
+ }
+ }
+
+ }
+
+ public static class TracHttpException extends XmlRpcException {
+
+ private static final long serialVersionUID = 9032521978140685830L;
+
+ public TracHttpException(int responseCode) {
+ super(responseCode, "HTTP Error " + responseCode); //$NON-NLS-1$
+ }
+
+ }
+
+ protected static final String USER_AGENT = "TracConnector Apache XML-RPC/3.0"; //$NON-NLS-1$
+
+ private final XmlRpcClient xmlRpcClient;
+
+ private AbstractWebLocation location;
+
+ private final HttpClient httpClient;
+
+ private HttpMethodInterceptor interceptor;
+
+ public TracHttpClientTransportFactory(XmlRpcClient xmlRpcClient, HttpClient httpClient) {
+ this.xmlRpcClient = xmlRpcClient;
+ this.httpClient = httpClient;
+ }
+
+ public AbstractWebLocation getLocation() {
+ return location;
+ }
+
+ public XmlRpcTransport getTransport() {
+ return new TracHttpClientTransport(xmlRpcClient, httpClient, location, interceptor);
+ }
+
+ public void setLocation(AbstractWebLocation location) {
+ this.location = location;
+ }
+
+ public HttpMethodInterceptor getInterceptor() {
+ return interceptor;
+ }
+
+ public void setInterceptor(HttpMethodInterceptor interceptor) {
+ this.interceptor = interceptor;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtil.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtil.java
new file mode 100644
index 0000000..8a5c86b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracUtil.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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
+ * Jorrit Schippers - fix for bug 254862
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.core.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+
+/**
+ * Provides static helper methods.
+ *
+ * @author Steffen Pingel
+ */
+public class TracUtil {
+
+ public static Date parseDate(String time) {
+ if (time != null) {
+ try {
+ return TracUtil.parseDate(Long.valueOf(time));
+ } catch (NumberFormatException e) {
+ }
+ }
+ return null;
+ }
+
+ public static Date parseDate(long seconds) {
+ return new Date(seconds * 1000l);
+// Calendar c = Calendar.getInstance();
+// c.setTimeZone(TimeZone.getTimeZone(ITracClient.TIME_ZONE));
+// c.setTimeInMillis(seconds * 1000l);
+// return c.getTime();
+ }
+
+ public static long toTracTime(Date date) {
+// Calendar c = Calendar.getInstance();
+// c.setTime(date);
+// c.setTimeZone(TimeZone.getTimeZone(ITracClient.TIME_ZONE));
+// return c.getTimeInMillis() / 1000l;
+ return date.getTime() / 1000l;
+ }
+
+ private static String getQueryParameter(IRepositoryQuery query) {
+ String url = query.getUrl();
+ int i = url.indexOf(ITracClient.QUERY_URL);
+ if (i == -1) {
+ return null;
+ }
+ return url.substring(i + ITracClient.QUERY_URL.length());
+ }
+
+ /**
+ * Creates a <code>TracSearch</code> object from this query.
+ */
+ public static TracSearch toTracSearch(IRepositoryQuery query) {
+ String url = getQueryParameter(query);
+ if (url != null) {
+ TracSearch search = new TracSearch();
+ search.fromUrl(url);
+ return search;
+ }
+ return null;
+ }
+
+ public static IStatus createPermissionDeniedError(String repositoryUrl, String pluginId) {
+ return new RepositoryStatus(repositoryUrl, IStatus.ERROR, TracCorePlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_PERMISSION_DENIED, Messages.TracUtil_Permission_denied);
+ }
+
+ public static String encodeUrl(String string) {
+ try {
+ return URLEncoder.encode(string, ITracClient.CHARSET).replaceAll("\\+", "%20"); //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (UnsupportedEncodingException e) {
+ return string;
+ }
+ }
+
+ public static String toString(Object object) {
+ StringBuilder sb = new StringBuilder();
+ toString(sb, object);
+ return sb.toString();
+ }
+
+ public static void toString(StringBuilder sb, Object object) {
+ if (object instanceof Object[]) {
+ sb.append("["); //$NON-NLS-1$
+ Object[] entries = (Object[]) object;
+ boolean prependSeparator = false;
+ for (Object entry : entries) {
+ if (prependSeparator) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ toString(sb, entry);
+ prependSeparator = true;
+ }
+ sb.append("]"); //$NON-NLS-1$
+ } else if (object instanceof Map) {
+ sb.append("{"); //$NON-NLS-1$
+ boolean prependSeparator = false;
+ for (Map.Entry<?, ?> entry : ((Map<?, ?>) object).entrySet()) {
+ if (prependSeparator) {
+ sb.append(", "); //$NON-NLS-1$
+ }
+ toString(sb, entry.getKey());
+ sb.append("="); //$NON-NLS-1$
+ toString(sb, entry.getValue());
+ prependSeparator = true;
+ }
+ sb.append("}"); //$NON-NLS-1$
+ } else {
+ sb.append(object);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracXmlRpcClientRequest.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracXmlRpcClientRequest.java
new file mode 100644
index 0000000..f3ac2c7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/TracXmlRpcClientRequest.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.core.util;
+
+import org.apache.xmlrpc.XmlRpcRequestConfig;
+import org.apache.xmlrpc.client.XmlRpcClientRequestImpl;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracXmlRpcClientRequest extends XmlRpcClientRequestImpl {
+
+ private final IProgressMonitor progressMonitor;
+
+ public TracXmlRpcClientRequest(XmlRpcRequestConfig config, String methodName, Object[] params,
+ IProgressMonitor monitor) {
+ super(config, methodName, params);
+ this.progressMonitor = monitor;
+ }
+
+ public IProgressMonitor getProgressMonitor() {
+ return progressMonitor;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/messages.properties b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/messages.properties
new file mode 100644
index 0000000..e0f3fdb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/util/messages.properties
@@ -0,0 +1 @@
+TracUtil_Permission_denied=Permission denied.
diff --git a/org.eclipse.mylyn.trac.tests/.classpath b/org.eclipse.mylyn.trac.tests/.classpath
new file mode 100644
index 0000000..d7d6275
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.trac.tests/.cvsignore b/org.eclipse.mylyn.trac.tests/.cvsignore
new file mode 100644
index 0000000..b0b9ecf
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.cvsignore
@@ -0,0 +1,3 @@
+bin
+credentials.properties
+credentials.properties
diff --git a/org.eclipse.mylyn.trac.tests/.project b/org.eclipse.mylyn.trac.tests/.project
new file mode 100644
index 0000000..1f3b627
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.trac.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/10/44/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2006/10/44/refactorings.history
new file mode 100644
index 0000000..7ade9b8
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/10/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.trac.tests' - Original project: 'org.eclipse.mylar.trac.tests' - Original elements: org.eclipse.mylar.trac.tests.support.XmlRpcServer.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.trac.tests.support{XmlRpcServer.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1162336484312" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/10/44/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2006/10/44/refactorings.index
new file mode 100644
index 0000000..85ca939
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/10/44/refactorings.index
@@ -0,0 +1 @@
+1162336484312 Infer generic type arguments
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/24/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/24/refactorings.history
new file mode 100644
index 0000000..7ff8ed0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void assertTicketHasAttributes(Hashtable<String,Object> attributes,int id,Vector ticket)' from 'org.eclipse.mylar.trac.tests.TracXmlRpcTest.testGetTicket()' to 'org.eclipse.mylar.trac.tests.TracXmlRpcTest' - Method name: 'assertTicketHasAttributes' - Destination type: 'org.eclipse.mylar.trac.tests.TracXmlRpcTest' - Declared visibility: 'private' - Replace occurrences of statements with method" comments="false" description="Extract method 'assertTicketHasAttributes'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.trac.tests{TracXmlRpcTest.java" name="assertTicketHasAttributes" replace="true" selection="6946 327" stamp="1150559011269" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/24/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/24/refactorings.index
new file mode 100644
index 0000000..ccd0d25
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/24/refactorings.index
@@ -0,0 +1 @@
+1150559011269 Extract method 'assertTicketHasAttributes'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..1e6048e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.AbstractTracRepositorySearchTest' to 'AbstractTracClientSearchTest' - Original element: 'org.eclipse.mylar.trac.tests.AbstractTracRepositorySearchTest' - Renamed element: 'org.eclipse.mylar.trac.tests.AbstractTracClientSearchTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'AbstractTracRepositorySearchTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{AbstractTracRepositorySearchTest.java[AbstractTracRepositorySearchTest" matchStrategy="1" name="AbstractTracClientSearchTest" qualified="false" references="true" similarDeclarations="false" stamp="1150980864105" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.AbstractTracRepositoryTest' to 'AbstractTracClientTest' - Original element: 'org.eclipse.mylar.trac.tests.AbstractTracRepositoryTest' - Renamed element: 'org.eclipse.mylar.trac.tests.AbstractTracClientTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'AbstractTracRepositoryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{AbstractTracRepositoryTest.java[AbstractTracRepositoryTest" matchStrategy="1" name="AbstractTracClientTest" qualified="false" references="true" similarDeclarations="false" stamp="1150980874709" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.Trac09RepositorySearchTest' to 'Trac09ClientSearchTest' - Original element: 'org.eclipse.mylar.trac.tests.Trac09RepositorySearchTest' - Renamed element: 'org.eclipse.mylar.trac.tests.Trac09ClientSearchTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Trac09RepositorySearchTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{Trac09RepositorySearchTest.java[Trac09RepositorySearchTest" matchStrategy="1" name="Trac09ClientSearchTest" qualified="false" references="true" similarDeclarations="false" stamp="1150980887182" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.Trac09RepositoryTest' to 'Trac09ClientTest' - Original element: 'org.eclipse.mylar.trac.tests.Trac09RepositoryTest' - Renamed element: 'org.eclipse.mylar.trac.tests.Trac09ClientTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Trac09RepositoryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{Trac09RepositoryTest.java[Trac09RepositoryTest" matchStrategy="1" name="Trac09ClientTest" qualified="false" references="true" similarDeclarations="false" stamp="1150980896328" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.TracXmlRpcRepositorySearchTest' to 'TracXmlRpcClientSearchTest' - Original element: 'org.eclipse.mylar.trac.tests.TracXmlRpcRepositorySearchTest' - Renamed element: 'org.eclipse.mylar.trac.tests.TracXmlRpcClientSearchTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracXmlRpcRepositorySearchTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{TracXmlRpcRepositorySearchTest.java[TracXmlRpcRepositorySearchTest" matchStrategy="1" name="TracXmlRpcClientSearchTest" qualified="false" references="true" similarDeclarations="false" stamp="1150980925205" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.TracXmlRpcRepositoryTest' to 'TracXmlRpcClientTest' - Original element: 'org.eclipse.mylar.trac.tests.TracXmlRpcRepositoryTest' - Renamed element: 'org.eclipse.mylar.trac.tests.TracXmlRpcClientTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracXmlRpcRepositoryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{TracXmlRpcRepositoryTest.java[TracXmlRpcRepositoryTest" matchStrategy="1" name="TracXmlRpcClientTest" qualified="false" references="true" similarDeclarations="false" stamp="1150980934829" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..05518d1
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,6 @@
+1150980864105 Rename type 'AbstractTracRepositorySearchTest'
+1150980934829 Rename type 'TracXmlRpcRepositoryTest'
+1150980925205 Rename type 'TracXmlRpcRepositorySearchTest'
+1150980896328 Rename type 'Trac09RepositoryTest'
+1150980887182 Rename type 'Trac09RepositorySearchTest'
+1150980874709 Rename type 'AbstractTracRepositoryTest'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..e9f2fd3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.support.XmlRpcServer.TestFixture' to 'TestData' - Original element: 'org.eclipse.mylar.trac.tests.support.XmlRpcServer.TestFixture' - Renamed element: 'org.eclipse.mylar.trac.tests.support.XmlRpcServer.TestData' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TestFixture'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests.support{XmlRpcServer.java[XmlRpcServer[TestFixture" matchStrategy="1" name="TestData" qualified="false" references="true" similarDeclarations="false" stamp="1152144576807" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..b8e0b42
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1 @@
+1152144576807 Rename type 'TestFixture'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..efedfca
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylar.trac.tests.support.TracTestRepositoryFactory.connectRepository1()' to 'connect010' - Original element: 'org.eclipse.mylar.trac.tests.support.TracTestRepositoryFactory.connectRepository1()' - Renamed element: 'org.eclipse.mylar.trac.tests.support.TracTestRepositoryFactory.connect010()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'connectRepository1'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.trac.tests.support{TracTestRepositoryFactory.java[TracTestRepositoryFactory~connectRepository1" name="connect010" references="true" stamp="1154029296744" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.trac.tests.support.TestFixture.initializeRepository1()' to 'init010' - Original element: 'org.eclipse.mylar.trac.tests.support.TestFixture.initializeRepository1()' - Renamed element: 'org.eclipse.mylar.trac.tests.support.TestFixture.init010()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'initializeRepository1'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.trac.tests.support{TestFixture.java[TestFixture~initializeRepository1" name="init010" references="true" stamp="1154029842945" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.trac.tests.support.TestFixture.cleanupRepository1()' to 'cleanup010' - Original element: 'org.eclipse.mylar.trac.tests.support.TestFixture.cleanupRepository1()' - Renamed element: 'org.eclipse.mylar.trac.tests.support.TestFixture.cleanup010()' - Update references to refactored element" delegate="false" deprecate="true" description="Rename method 'cleanupRepository1'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.trac.tests.support{TestFixture.java[TestFixture~cleanupRepository1" name="cleanup010" references="true" stamp="1154029855355" version="1.0"/>
+<refactoring comment="Rename field 'TEST_REPOSITORY1_URL' in 'org.eclipse.mylar.trac.tests.Constants' to 'TEST_TRAC_010_URL' - Original element: 'org.eclipse.mylar.trac.tests.Constants.TEST_REPOSITORY1_URL' - Renamed element: 'org.eclipse.mylar.trac.tests.Constants.TEST_TRAC_010_URL' - Update references to refactored element - Update textual occurrences in comments and strings" delegate="false" deprecate="true" description="Rename field 'TEST_REPOSITORY1_URL'" flags="589830" getter="false" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylar.trac.tests{Constants.java[Constants^TEST_REPOSITORY1_URL" name="TEST_TRAC_010_URL" references="true" setter="false" stamp="1154273808025" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.support.TracTestUtils' to 'MylarTestUtils' - Original element: 'org.eclipse.mylar.trac.tests.support.TracTestUtils' - Renamed element: 'org.eclipse.mylar.trac.tests.support.MylarTestUtils' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracTestUtils'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests.support{TracTestUtils.java[TracTestUtils" matchStrategy="1" name="MylarTestUtils" qualified="false" references="true" similarDeclarations="false" stamp="1154294077466" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..9952808
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1,5 @@
+1154029296744 Rename method 'connectRepository1'
+1154294077466 Rename type 'TracTestUtils'
+1154273808025 Rename field 'TEST_REPOSITORY1_URL'
+1154029855355 Rename method 'cleanupRepository1'
+1154029842945 Rename method 'initializeRepository1'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..9c14598
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.trac.tests.support.TestCleanupUtil' to 'TracTestCleanupUtil'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.support.TestCleanupUtil'
- Renamed element: 'org.eclipse.mylyn.trac.tests.support.TracTestCleanupUtil'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TestCleanupUtil'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.trac.tests.support{TestCleanupUtil.java[TestCleanupUtil" matchStrategy="1" name="TracTestCleanupUtil" qualified="false" references="true" similarDeclarations="false" stamp="1198046080750" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..48a86c6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1 @@
+1198046080750 Rename type 'TestCleanupUtil'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/7/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/7/refactorings.history
new file mode 100644
index 0000000..298836d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/7/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.TracOfflineTaskHandlerTest' to 'TracTaskDataHandlerTest' - Original project: 'org.eclipse.mylar.trac.tests' - Original element: 'org.eclipse.mylar.trac.tests.TracOfflineTaskHandlerTest' - Renamed element: 'org.eclipse.mylar.trac.tests.TracTaskDataHandlerTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracOfflineTaskHandlerTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{TracOfflineTaskHandlerTest.java[TracOfflineTaskHandlerTest" matchStrategy="1" name="TracTaskDataHandlerTest" qualified="false" references="true" similarDeclarations="false" stamp="1171736339134" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/7/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/7/refactorings.index
new file mode 100644
index 0000000..fb51ce6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/7/refactorings.index
@@ -0,0 +1 @@
+1171736339134 Rename type 'TracOfflineTaskHandlerTest'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..e5953d2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.Trac09ClientSearchTest' to 'TracWebClientSearchTest' - Original project: 'org.eclipse.mylar.trac.tests' - Original element: 'org.eclipse.mylar.trac.tests.Trac09ClientSearchTest' - Renamed element: 'org.eclipse.mylar.trac.tests.TracWebClientSearchTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Trac09ClientSearchTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{Trac09ClientSearchTest.java[Trac09ClientSearchTest" matchStrategy="1" name="TracWebClientSearchTest" qualified="false" references="true" similarDeclarations="false" stamp="1172195021968" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.trac.tests.Trac09ClientTest' to 'TracWebClientTest' - Original project: 'org.eclipse.mylar.trac.tests' - Original element: 'org.eclipse.mylar.trac.tests.Trac09ClientTest' - Renamed element: 'org.eclipse.mylar.trac.tests.TracWebClientTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Trac09ClientTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.trac.tests{Trac09ClientTest.java[Trac09ClientTest" matchStrategy="1" name="TracWebClientTest" qualified="false" references="true" similarDeclarations="false" stamp="1172195042879" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..ff158f0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1,2 @@
+1172195021968 Rename type 'Trac09ClientSearchTest'
+1172195042879 Rename type 'Trac09ClientTest'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/3/11/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/3/11/refactorings.history
new file mode 100644
index 0000000..bceeeba
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/3/11/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkDetectorTest' to 'TracHyperlinkUtilTest' - Original project: 'org.eclipse.mylar.trac.tests' - Original element: 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkDetectorTest' - Renamed element: 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkUtilTest' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracHyperlinkDetectorTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.ui{TracHyperlinkDetectorTest.java[TracHyperlinkDetectorTest" matchStrategy="1" name="TracHyperlinkUtilTest" qualified="false" references="true" similarDeclarations="false" stamp="1173833391343" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/3/11/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/3/11/refactorings.index
new file mode 100644
index 0000000..6c5d7ec
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/3/11/refactorings.index
@@ -0,0 +1 @@
+1173833391343 Rename type 'TracHyperlinkDetectorTest'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..f50c30c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.tests' - Original project: 'org.eclipse.mylar.trac.tests' - Original element: 'org.eclipse.mylar.trac.tests.TracQueryHitTest.java'" description="Delete element" element1="/src<org.eclipse.mylar.trac.tests{TracQueryHitTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1180641093640" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..c1cf8b5
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1 @@
+1180641093640 Delete element
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..ceb9d18
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.trac.tests.Constants' to 'TracTestConstants' - Original project: 'org.eclipse.mylyn.trac.tests' - Original element: 'org.eclipse.mylyn.trac.tests.Constants' - Renamed element: 'org.eclipse.mylyn.trac.tests.TracTestConstants' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Constants'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.trac.tests{Constants.java[Constants" matchStrategy="1" name="TracTestConstants" qualified="false" references="true" similarDeclarations="false" stamp="1181691569392" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..5021584
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1 @@
+1181691569392 Rename type 'Constants'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/7/28/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2007/7/28/refactorings.history
new file mode 100644
index 0000000..0668b17
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename method 'org.eclipse.mylyn.trac.tests.TracTaskTest.testGetMylarPriority()' to 'testGetMylynPriority' - Original project: 'org.eclipse.mylyn.trac.tests' - Original element: 'org.eclipse.mylyn.trac.tests.TracTaskTest.testGetMylarPriority()' - Renamed element: 'org.eclipse.mylyn.trac.tests.TracTaskTest.testGetMylynPriority()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'testGetMylarPriority'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.trac.tests{TracTaskTest.java[TracTaskTest~testGetMylarPriority" name="testGetMylynPriority" references="true" stamp="1184026364941" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2007/7/28/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2007/7/28/refactorings.index
new file mode 100644
index 0000000..94d13c9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2007/7/28/refactorings.index
@@ -0,0 +1 @@
+1184026364941 Rename method 'testGetMylarPriority'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/10/43/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2008/10/43/refactorings.history
new file mode 100644
index 0000000..d40017a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/10/43/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'repositorySearchResult' from expression '((RepositorySearchResult)collector.getSearchResult())'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Variable name: 'repositorySearchResult'
- Destination method: 'org.eclipse.mylyn.trac.tests.RepositorySearchTest.testSearch()'
- Variable expression: '((RepositorySearchResult)collector.getSearchResult())'
- Replace occurrences of expression with variable" description="Extract local variable 'repositorySearchResult'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.trac.tests{RepositorySearchTest.java" name="repositorySearchResult" replace="true" selection="3429 54" stamp="1224450927798" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/10/43/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2008/10/43/refactorings.index
new file mode 100644
index 0000000..69b1ebc
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/10/43/refactorings.index
@@ -0,0 +1 @@
+1224450927798 Extract local variable 'repositorySearchResult'
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/12/51/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2008/12/51/refactorings.history
new file mode 100644
index 0000000..65c1d9a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.AllTracTests.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylyn.trac.tests" element1="/src<org.eclipse.mylyn.trac.tests{AllTracTests.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1229296143572" units="1" version="1.0"/>
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.ui'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.ui'
- Original elements:
 org.eclipse.mylyn.trac.tests.TracHyperlinkUtilTest.java
 org.eclipse.mylyn.trac.tests.TracRepositorySettingsPageTest.java
 org.eclipse.mylyn.trac.tests.TracTaskEditorTest.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.trac.tests.ui" element1="/src<org.eclipse.mylyn.trac.tests{TracHyperlinkUtilTest.java" element2="/src<org.eclipse.mylyn.trac.tests{TracRepositorySettingsPageTest.java" element3="/src<org.eclipse.mylyn.trac.tests{TracTaskEditorTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.trac.tests	/src<org.eclipse.mylyn.trac.tests.ui" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1229296531716" units="3" version="1.0"/>
<refactoring comment="Move 7 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.core'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.core'
- Original elements:
 org.eclipse.mylyn.trac.tests.TracRepositoryQueryTest.java
 org.eclipse.mylyn.trac.tests.TracClientManagerTest.java
 org.eclipse.mylyn.trac.tests.TracUtilTest.java
 org.eclipse.mylyn.trac.tests.TracRepositoryConnectorTest.java
 org.eclipse.mylyn.trac.tests.TracTaskDataHandlerTest.java
 org.eclipse.mylyn.trac.tests.TracAttachmentHandlerTest.java
 org.eclipse.mylyn.trac.tests.RepositorySearchTest.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.trac.tests.core" element1="/src<org.eclipse.mylyn.trac.tests{TracRepositoryQueryTest.java" element2="/src<org.eclipse.mylyn.trac.tests{TracClientManagerTest.java" element3="/src<org.eclipse.mylyn.trac.tests{TracUtilTest.java" element4="/src<org.eclipse.mylyn.trac.tests{TracRepositoryConnectorTest.java" element5="/src<org.eclipse.mylyn.trac.tests{TracTaskDataHandlerTest.java" element6="/src<org.eclipse.mylyn.trac.tests{TracAttachmentHandlerTest.java" element7="/src<org.eclipse.mylyn.trac.tests{RepositorySearchTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.trac.tests	/src<org.eclipse.mylyn.trac.tests.core" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1229296656257" units="7" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/12/51/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2008/12/51/refactorings.index
new file mode 100644
index 0000000..5810093
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/12/51/refactorings.index
@@ -0,0 +1,3 @@
+1229296143572 Copy compilation unit
+1229296531716 Move compilation units
+1229296656257 Move compilation units
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/4/14/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2008/4/14/refactorings.history
new file mode 100644
index 0000000..5976e46
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/4/14/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.TracTestPlugin.java'" description="Delete element" element1="/src<org.eclipse.mylyn.trac.tests{TracTestPlugin.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1207390627457" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/4/14/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2008/4/14/refactorings.index
new file mode 100644
index 0000000..c4469dd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/4/14/refactorings.index
@@ -0,0 +1 @@
+1207390627457 Delete element
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/6/25/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2008/6/25/refactorings.history
new file mode 100644
index 0000000..94470c4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/6/25/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.TracHyperlinkUtilTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests" element1="/src<org.eclipse.mylyn.internal.trac.ui{TracHyperlinkUtilTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106494033" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.internal.trac.ui'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.ui" element2="/src<org.eclipse.mylyn.internal.trac" element3="/src<org.eclipse.mylyn.internal" elements="3" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1214106505740" subPackages="false" version="1.0"/>
<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original elements:
 org.eclipse.mylyn.trac.tests.AbstractTracClientRepositoryTest.java
 org.eclipse.mylyn.trac.tests.AbstractTracClientTest.java
 org.eclipse.mylyn.trac.tests.AbstractTracClientSearchTest.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{AbstractTracClientRepositoryTest.java" element2="/src<org.eclipse.mylyn.trac.tests{AbstractTracClientTest.java" element3="/src<org.eclipse.mylyn.trac.tests{AbstractTracClientSearchTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.trac.tests	/src<org.eclipse.mylyn.trac.tests.client" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106611672" units="3" version="1.0"/>
<refactoring comment="Move 4 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original elements:
 org.eclipse.mylyn.trac.tests.TracWebClientTest.java
 org.eclipse.mylyn.trac.tests.TracXmlRpcClientTest.java
 org.eclipse.mylyn.trac.tests.TracXmlRpcClientSearchTest.java
 org.eclipse.mylyn.trac.tests.TracWebClientSearchTest.java
- Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracWebClientTest.java" element2="/src<org.eclipse.mylyn.trac.tests{TracXmlRpcClientTest.java" element3="/src<org.eclipse.mylyn.trac.tests{TracXmlRpcClientSearchTest.java" element4="/src<org.eclipse.mylyn.trac.tests{TracWebClientSearchTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106625178" units="4" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original element: 'org.eclipse.mylyn.trac.tests.TracClientProxyTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracClientProxyTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106642289" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original element: 'org.eclipse.mylyn.trac.tests.TracSearchTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracSearchTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106705967" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.support'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.support'
- Original element: 'org.eclipse.mylyn.trac.tests.TracTestConstants.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.support" element1="/src<org.eclipse.mylyn.trac.tests{TracTestConstants.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106730910" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original element: 'org.eclipse.mylyn.trac.tests.TracXmlRpcTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracXmlRpcTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106741929" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.support'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.support'
- Original element: 'org.eclipse.mylyn.trac.tests.TestProxy.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.support" element1="/src<org.eclipse.mylyn.trac.tests{TestProxy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106765547" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original element: 'org.eclipse.mylyn.trac.tests.TracTicketTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracTicketTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106793057" units="1" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original element: 'org.eclipse.mylyn.trac.tests.TracClientFactoryTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracClientFactoryTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1214106814567" units="1" version="1.0"/>
<refactoring comment="Extract local variable 'repositoryUrl' from expression '"http://oss.steffenpingel.de/mylar-trac-connector"'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Variable name: 'repositoryUrl'
- Destination method: 'org.eclipse.mylyn.trac.tests.TracQueryTest.testGetTracSearch()'
- Variable expression: '"http://oss.steffenpingel.de/mylar-trac-connector"'
- Replace occurrences of expression with variable" description="Extract local variable 'repositoryUrl'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.trac.tests{TracQueryTest.java" name="repositoryUrl" replace="true" selection="1423 50" stamp="1214107624636" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.trac.tests.TracQueryTest' to 'TracUtilsTest'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.TracQueryTest'
- Renamed element: 'org.eclipse.mylyn.trac.tests.TracUtilsTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TracQueryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.trac.tests{TracQueryTest.java[TracQueryTest" matchStrategy="1" name="TracUtilsTest" qualified="false" references="true" similarDeclarations="false" stamp="1214107659294" textual="true" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.trac.tests.TracUtilsTest' to 'TracUtilTest'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.TracUtilsTest'
- Renamed element: 'org.eclipse.mylyn.trac.tests.TracUtilTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TracUtilsTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.trac.tests{TracUtilsTest.java[TracUtilsTest" matchStrategy="1" name="TracUtilTest" qualified="false" references="true" similarDeclarations="false" stamp="1214107703581" textual="true" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.TracTaskTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.trac.tests{TracTaskTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1214107934362" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.trac.tests.RepositorySearchQueryTest' to 'RepositorySearchTest'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.RepositorySearchQueryTest'
- Renamed element: 'org.eclipse.mylyn.trac.tests.RepositorySearchTest'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'RepositorySearchQueryTest'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.trac.tests{RepositorySearchQueryTest.java[RepositorySearchQueryTest" matchStrategy="1" name="RepositorySearchTest" qualified="false" references="true" similarDeclarations="false" stamp="1214108041140" textual="true" version="1.0"/>
<refactoring comment="Extract local variable 'taskId' from expression '"123"'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Variable name: 'taskId'
- Destination method: 'org.eclipse.mylyn.trac.tests.TracRepositoryQueryTest.testChangeRepositoryUrl()'
- Variable expression: '"123"'
- Replace occurrences of expression with variable" description="Extract local variable 'taskId'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.trac.tests{TracRepositoryQueryTest.java" name="taskId" replace="true" selection="2153 5" stamp="1214108686616" version="1.0"/>
<refactoring comment="Rename method 'org.eclipse.mylyn.trac.tests.support.TracTestUtil.initTaskRepository(...)' to 'init'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.support.TracTestUtil.initTaskRepository(...)'
- Renamed element: 'org.eclipse.mylyn.trac.tests.support.TracTestUtil.init(...)'
- Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'initTaskRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylyn.trac.tests.support{TracTestUtil.java[TracTestUtil~initTaskRepository~QString;~QVersion;" name="init" references="true" stamp="1214111356425" version="1.0"/>
<refactoring comment="Extract method 'private SynchronizationSession createSession()' from 'org.eclipse.mylyn.trac.tests.TracTaskDataHandlerTest.markStaleTasks()' to 'org.eclipse.mylyn.trac.tests.TracTaskDataHandlerTest'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Method name: 'createSession'
- Destination type: 'org.eclipse.mylyn.trac.tests.TracTaskDataHandlerTest'
- Declared visibility: 'private'
- Replace occurrences of statements with method" comments="false" description="Extract method 'createSession'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.trac.tests{TracTaskDataHandlerTest.java" name="createSession" replace="true" selection="4416 176" stamp="1214112664863" version="1.0" visibility="2"/>
<refactoring comment="Inline local variable 'org.eclipse.mylyn.trac.tests.TracRepositoryConnectorTest.performQuery().queryUrl' in 'org.eclipse.mylyn.trac.tests.TracRepositoryConnectorTest.performQuery()'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.TracRepositoryConnectorTest.performQuery().queryUrl'" description="Inline local variable 'queryUrl'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.trac.tests{TracRepositoryConnectorTest.java" selection="6676 55" stamp="1214114786368" version="1.0"/>
<refactoring comment="Extract local variable 'string' from expression 'data.attachmentTicketId + ""'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Variable name: 'string'
- Destination method: 'org.eclipse.mylyn.trac.tests.TracRepositoryConnectorTest.testContextXmlRpc010()'
- Variable expression: 'data.attachmentTicketId + ""'
- Replace occurrences of expression with variable" description="Extract local variable 'string'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.trac.tests{TracRepositoryConnectorTest.java" name="string" replace="true" selection="9365 28" stamp="1214115395273" version="1.0"/>
<refactoring accessors="true" comment="Delete 3 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original elements:
 org.eclipse.mylyn.trac.tests.MockAttachment.java
 org.eclipse.mylyn.trac.tests.TracRepositoryQuery.java
 org.eclipse.mylyn.trac.tests.TracTask.java" description="Delete elements" element1="/src<org.eclipse.mylyn.trac.tests{MockAttachment.java" element2="/src<org.eclipse.mylyn.trac.tests{TracTask.java" element3="/src<org.eclipse.mylyn.trac.tests{TracRepositoryQuery.java" elements="3" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1214117491138" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2008/6/25/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2008/6/25/refactorings.index
new file mode 100644
index 0000000..2c2d6d4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2008/6/25/refactorings.index
@@ -0,0 +1,22 @@
+1214106494033 Move compilation unit
+1214106505740 Delete element
+1214106611672 Move compilation units
+1214106625178 Move compilation units
+1214106642289 Move compilation unit
+1214106705967 Move compilation unit
+1214106730910 Move compilation unit
+1214106741929 Move compilation unit
+1214106765547 Move compilation unit
+1214106793057 Move compilation unit
+1214106814567 Move compilation unit
+1214107624636 Extract local variable 'repositoryUrl'
+1214107659294 Rename type 'TracQueryTest'
+1214107703581 Rename type 'TracUtilsTest'
+1214107934362 Delete element
+1214108041140 Rename type 'RepositorySearchQueryTest'
+1214108686616 Extract local variable 'taskId'
+1214111356425 Rename method 'initTaskRepository'
+1214112664863 Extract method 'createSession'
+1214114786368 Inline local variable 'queryUrl'
+1214115395273 Extract local variable 'string'
+1214117491138 Delete elements
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2009/7/27/refactorings.history b/org.eclipse.mylyn.trac.tests/.refactorings/2009/7/27/refactorings.history
new file mode 100644
index 0000000..270bdf9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2009/7/27/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Rename field 'repository' in 'org.eclipse.mylyn.trac.tests.client.AbstractTracClientTest' to 'client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.client.AbstractTracClientTest.repository'
- Renamed element: 'org.eclipse.mylyn.trac.tests.client.AbstractTracClientTest.client'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'repository'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.trac.tests.client{AbstractTracClientTest.java[AbstractTracClientTest^repository" name="client" references="true" setter="true" stamp="1246479817390" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.client.AbstractTracClientSearchTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.trac.tests.client{AbstractTracClientSearchTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1246480231218" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.client.TracWebClientSearchTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.trac.tests.client{TracWebClientSearchTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1246480236214" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.tests'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Original element: 'org.eclipse.mylyn.trac.tests.client.TracXmlRpcClientSearchTest.java'" description="Delete element" element1="/src<org.eclipse.mylyn.trac.tests.client{TracXmlRpcClientSearchTest.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1246480280110" subPackages="false" version="1.0"/>
<refactoring comment="Extract local variable 'value' from expression 'operation.getTaskAttribute().getMetaData().getValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID)'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Variable name: 'value'
- Destination method: 'org.eclipse.mylyn.trac.tests.core.TracTaskDataHandlerTest.operations()'
- Variable expression: 'operation.getTaskAttribute().getMetaData().getValue(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID)'
- Replace occurrences of expression with variable" description="Extract local variable 'value'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.trac.tests.core{TracTaskDataHandlerTest.java" name="value" replace="true" selection="19507 95" stamp="1246484877276" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original project: 'org.eclipse.mylyn.trac.tests'
- Destination element: 'org.eclipse.mylyn.trac.tests/src/org.eclipse.mylyn.trac.tests.client'
- Original element: 'org.eclipse.mylyn.trac.tests.TracRepositoryInfoTest.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.trac.tests.client" element1="/src<org.eclipse.mylyn.trac.tests{TracRepositoryInfoTest.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1246487458575" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/.refactorings/2009/7/27/refactorings.index b/org.eclipse.mylyn.trac.tests/.refactorings/2009/7/27/refactorings.index
new file mode 100644
index 0000000..ecf78fb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.refactorings/2009/7/27/refactorings.index
@@ -0,0 +1,6 @@
+1246479817390 Rename field 'repository'
+1246480231218 Delete element
+1246480236214 Delete element
+1246480280110 Delete element
+1246484877276 Extract local variable 'value'
+1246487458575 Move compilation unit
diff --git a/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cd4faf7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Trac Connector Tests
+Bundle-SymbolicName: org.eclipse.mylyn.trac.tests;singleton:=true
+Bundle-Version: 0.0.0
+Require-Bundle: org.apache.xmlrpc;bundle-version="3.0.0",
+ org.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.search,
+ org.eclipse.ui,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.mylyn.commons.net,
+ org.eclipse.mylyn.context.core,
+ org.eclipse.mylyn.context.tests,
+ org.eclipse.mylyn.tasks.ui,
+ org.eclipse.mylyn.tasks.core,
+ org.eclipse.mylyn.tasks.tests,
+ org.eclipse.mylyn.trac.ui,
+ org.eclipse.mylyn.trac.core
+Export-Package: org.eclipse.mylyn.internal.trac.ui;x-internal:=true,
+ org.eclipse.mylyn.trac.tests;x-internal:=true,
+ org.eclipse.mylyn.trac.tests.client;x-internal:=true,
+ org.eclipse.mylyn.trac.tests.core;x-internal:=true,
+ org.eclipse.mylyn.trac.tests.support;x-internal:=true,
+ org.eclipse.mylyn.trac.tests.ui;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Vendor: Eclipse Mylyn
diff --git a/org.eclipse.mylyn.trac.tests/about.html b/org.eclipse.mylyn.trac.tests/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/build.properties b/org.eclipse.mylyn.trac.tests/build.properties
new file mode 100644
index 0000000..6af7dc4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/build.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html
+src.includes = META-INF/
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilStandaloneTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilStandaloneTest.java
new file mode 100644
index 0000000..f6a8dd0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtilStandaloneTest.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.ui;
+
+import java.util.regex.Matcher;
+
+import junit.framework.TestCase;
+
+/**
+ * @author David Green
+ */
+public class TracHyperlinkUtilStandaloneTest extends TestCase {
+
+ public void testWikiPattern2SinglePositiveMatch() {
+ Matcher matcher = TracHyperlinkUtil.wikiPattern2.matcher("a HyperLink there");
+ assertTrue(matcher.find());
+ assertEquals(matcher.group(0), "HyperLink");
+ assertFalse(matcher.find());
+ }
+
+ public void testWikiPattern2MultiplePositiveMatch() {
+ Matcher matcher = TracHyperlinkUtil.wikiPattern2.matcher("a HyperLink there and ThereIsAnother");
+ assertTrue(matcher.find());
+ assertEquals(matcher.group(0), "HyperLink");
+ assertTrue(matcher.find());
+ assertEquals(matcher.group(0), "ThereIsAnother");
+ assertFalse(matcher.find());
+ }
+
+ public void testWikiPattern2SingleNegativeMatch() {
+ Matcher matcher = TracHyperlinkUtil.wikiPattern2.matcher("no !HyperLink there");
+ assertFalse(matcher.find());
+ }
+
+ public void testWikiPattern2SinglePositiveMatchAtStartOfLine() {
+ Matcher matcher = TracHyperlinkUtil.wikiPattern2.matcher("HyperLink there");
+ assertTrue(matcher.find());
+ assertEquals(matcher.group(0), "HyperLink");
+ assertFalse(matcher.find());
+ }
+
+ public void testWikiPattern2SingleNegativeMatchAtStartOfLine() {
+ Matcher matcher = TracHyperlinkUtil.wikiPattern2.matcher("!HyperLink there");
+ assertFalse(matcher.find());
+ }
+
+ public void testWikiPattern2MixedPositiveNegativeMatch() {
+ Matcher matcher = TracHyperlinkUtil.wikiPattern2.matcher("a HyperLink there and ThereIsAnother but !NotHere");
+ assertTrue(matcher.find());
+ assertEquals(matcher.group(0), "HyperLink");
+ assertTrue(matcher.find());
+ assertEquals(matcher.group(0), "ThereIsAnother");
+ assertFalse(matcher.find());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracHeadlessStandaloneTests.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracHeadlessStandaloneTests.java
new file mode 100644
index 0000000..8c1fce9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracHeadlessStandaloneTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.trac.tests.client.TracClientFactoryTest;
+import org.eclipse.mylyn.trac.tests.client.TracClientProxyTest;
+import org.eclipse.mylyn.trac.tests.client.TracRepositoryInfoTest;
+import org.eclipse.mylyn.trac.tests.client.TracSearchTest;
+import org.eclipse.mylyn.trac.tests.client.TracTicketTest;
+import org.eclipse.mylyn.trac.tests.client.TracWebClientTest;
+import org.eclipse.mylyn.trac.tests.client.TracXmlRpcClientTest;
+import org.eclipse.mylyn.trac.tests.core.TracClientManagerTest;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class AllTracHeadlessStandaloneTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Headless Standalone Tests for org.eclipse.mylyn.trac.tests");
+ // other
+ suite.addTestSuite(TracClientManagerTest.class);
+ // client
+ suite.addTestSuite(TracSearchTest.class);
+ suite.addTestSuite(TracTicketTest.class);
+ suite.addTestSuite(TracRepositoryInfoTest.class);
+ suite.addTestSuite(TracXmlRpcClientTest.class);
+ suite.addTestSuite(TracWebClientTest.class);
+ suite.addTestSuite(TracClientFactoryTest.class);
+ suite.addTestSuite(TracClientProxyTest.class);
+ return suite;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java
new file mode 100644
index 0000000..0a524b9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/AllTracTests.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.trac.tests.core.RepositorySearchTest;
+import org.eclipse.mylyn.trac.tests.core.TracAttachmentHandlerTest;
+import org.eclipse.mylyn.trac.tests.core.TracRepositoryConnectorTest;
+import org.eclipse.mylyn.trac.tests.core.TracRepositoryQueryTest;
+import org.eclipse.mylyn.trac.tests.core.TracTaskDataHandlerTest;
+import org.eclipse.mylyn.trac.tests.core.TracUtilTest;
+import org.eclipse.mylyn.trac.tests.ui.TracHyperlinkUtilTest;
+import org.eclipse.mylyn.trac.tests.ui.TracRepositorySettingsPageTest;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class AllTracTests {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite("Tests for org.eclipse.mylyn.trac.tests");
+ suite.addTest(AllTracHeadlessStandaloneTests.suite());
+ suite.addTestSuite(TracRepositoryConnectorTest.class);
+ suite.addTestSuite(TracUtilTest.class);
+ suite.addTestSuite(TracRepositoryQueryTest.class);
+ suite.addTestSuite(TracAttachmentHandlerTest.class);
+ suite.addTestSuite(RepositorySearchTest.class);
+ suite.addTestSuite(TracTaskDataHandlerTest.class);
+ // XXX fails when run from continuous build: suite.addTestSuite(TracTaskEditorTest.class);
+ suite.addTestSuite(TracRepositorySettingsPageTest.class);
+ suite.addTestSuite(TracHyperlinkUtilTest.class);
+ return suite;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/AbstractTracClientRepositoryTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/AbstractTracClientRepositoryTest.java
new file mode 100644
index 0000000..2ae6b2b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/AbstractTracClientRepositoryTest.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.Proxy.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.TracLoginException;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.trac.tests.support.TestFixture;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.Ticket;
+
+/**
+ * Test cases for classes that implement {@link ITracClient}.
+ *
+ * @author Steffen Pingel
+ */
+public class AbstractTracClientRepositoryTest extends AbstractTracClientTest {
+
+ protected List<Ticket> tickets;
+
+ private TestData data;
+
+ public AbstractTracClientRepositoryTest(Version version) {
+ super(version);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ data = TestFixture.init010();
+ tickets = data.tickets;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ // TestFixture.cleanupRepository1();
+ }
+
+ public void testValidate010() throws Exception {
+ validate(TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public void testValidate010DigestAuth() throws Exception {
+ validate(TracTestConstants.TEST_TRAC_010_DIGEST_AUTH_URL);
+ }
+
+ public void testValidate011() throws Exception {
+ validate(TracTestConstants.TEST_TRAC_011_URL);
+ }
+
+ public void testValidate010FormAuth() throws Exception {
+ validate(TracTestConstants.TEST_TRAC_010_FORM_AUTH_URL);
+ }
+
+ protected void validate(String url) throws Exception {
+ Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER);
+
+ // standard connect
+ connect(url);
+ client.validate(callback);
+
+ // invalid url
+ connect("http://non.existant/repository");
+ try {
+ client.validate(callback);
+ fail("Expected TracException");
+ } catch (TracException e) {
+ }
+
+ // invalid password
+ connect(url, credentials.username, "wrongpassword");
+ try {
+ client.validate(callback);
+ fail("Expected TracLoginException");
+ } catch (TracLoginException e) {
+ }
+
+ // invalid username
+ connect(url, "wrongusername", credentials.password);
+ try {
+ client.validate(callback);
+ fail("Expected TracLoginException");
+ } catch (TracLoginException e) {
+ }
+ }
+
+ public void testProxy() throws Exception {
+ connect(TracTestConstants.TEST_TRAC_010_URL, "", "", new Proxy(Type.HTTP, new InetSocketAddress(
+ "invalidhostname", 8080)));
+ try {
+ client.validate(callback);
+ fail("Expected IOException");
+ } catch (TracException e) {
+ }
+ }
+
+ public void testGetTicket096() throws Exception {
+ if (version == Version.XML_RPC) {
+ return;
+ }
+
+ connect096();
+ getTicket();
+ }
+
+ public void testGetTicket010() throws Exception {
+ connect010();
+ getTicket();
+ }
+
+ public void testGetTicket011() throws Exception {
+ if (version == Version.TRAC_0_9) {
+ // XXX web mode is broken for Trac 0.11: need to fix bug 175211
+ return;
+ }
+
+ connect011();
+ getTicket();
+ }
+
+ private void getTicket() throws Exception {
+ TracTicket ticket = client.getTicket(tickets.get(0).getId(), null);
+ assertTicketEquals(tickets.get(0), ticket);
+
+ ticket = client.getTicket(tickets.get(1).getId(), null);
+ assertTicketEquals(tickets.get(1), ticket);
+ }
+
+ public void testGetTicketInvalidId096() throws Exception {
+ if (version == Version.XML_RPC) {
+ return;
+ }
+
+ connect096();
+ getTicketInvalidId();
+ }
+
+ public void testGetTicketInvalidId010() throws Exception {
+ connect010();
+ getTicketInvalidId();
+ }
+
+ public void testGetTicketInvalidId011() throws Exception {
+ connect011();
+ getTicketInvalidId();
+ }
+
+ private void getTicketInvalidId() throws Exception {
+ try {
+ client.getTicket(Integer.MAX_VALUE, null);
+ fail("Expected TracException");
+ } catch (TracException e) {
+ }
+ }
+
+ public void testGetTicketUmlaute010() throws Exception {
+ connect010();
+ getTicketUmlaute();
+ }
+
+ public void testGetTicketUmlaute011() throws Exception {
+ if (version == Version.TRAC_0_9) {
+ // XXX need to fix bug 175211
+ return;
+ }
+
+ connect011();
+ getTicketUmlaute();
+ }
+
+ private void getTicketUmlaute() throws Exception {
+ TracTicket ticket = client.getTicket(data.htmlEntitiesTicketId, null);
+ assertEquals("test html entities: \u00E4\u00F6\u00FC", ticket.getValue(Key.SUMMARY));
+ if (version == Version.XML_RPC) {
+ assertEquals("\u00C4\u00D6\u00DC\n\nmulti\nline\n\n'''bold'''\n", ticket.getValue(Key.DESCRIPTION));
+ } else {
+ assertEquals(null, ticket.getValue(Key.DESCRIPTION));
+ }
+ }
+
+ public void testSearchAll010() throws Exception {
+ connect010();
+ searchAll();
+ }
+
+ public void testSearchAll011() throws Exception {
+ connect011();
+ searchAll();
+ }
+
+ private void searchAll() throws Exception {
+ TracSearch search = new TracSearch();
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ //assertEquals(tickets.size(), result.size());
+ assertTrue(result.size() >= tickets.size());
+ }
+
+ public void testSearchEmpty010() throws Exception {
+ connect010();
+ searchEmpty();
+ }
+
+ public void testSearchEmpty011() throws Exception {
+ connect011();
+ searchEmpty();
+ }
+
+ private void searchEmpty() throws Exception {
+ TracSearch search = new TracSearch();
+ search.addFilter("milestone", "does not exist");
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ assertEquals(0, result.size());
+ }
+
+ public void testSearchMilestone1_010() throws Exception {
+ connect010();
+ searchMilestone1();
+ }
+
+ public void testSearchMilestone1_011() throws Exception {
+ connect011();
+ searchMilestone1();
+ }
+
+ private void searchMilestone1() throws Exception {
+ TracSearch search = new TracSearch();
+ search.addFilter("milestone", "milestone1");
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ assertEquals(1, result.size());
+ assertTicketEquals(tickets.get(0), result.get(0));
+ }
+
+ public void testSearchMilestone2_0_10() throws Exception {
+ connect010();
+ searchMilestone2();
+ }
+
+ public void testSearchMilestone2_0_11() throws Exception {
+ connect011();
+ searchMilestone2();
+ }
+
+ private void searchMilestone2() throws Exception {
+ TracSearch search = new TracSearch();
+ search.addFilter("milestone", "milestone1");
+ search.addFilter("milestone", "milestone2");
+ search.setOrderBy("id");
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ assertEquals(3, result.size());
+ assertTicketEquals(tickets.get(0), result.get(0));
+ assertTicketEquals(tickets.get(1), result.get(1));
+ assertTicketEquals(tickets.get(2), result.get(2));
+ }
+
+ public void testSearchExactMatch010() throws Exception {
+ connect010();
+ searchExactMatch();
+ }
+
+ public void testSearchExactMatch011() throws Exception {
+ connect011();
+ searchExactMatch();
+ }
+
+ private void searchExactMatch() throws Exception {
+ TracSearch search = new TracSearch();
+ search.addFilter("milestone", "milestone1");
+ search.addFilter("summary", "summary1");
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ assertEquals(1, result.size());
+ assertTicketEquals(tickets.get(0), result.get(0));
+ assertEquals("milestone1", result.get(0).getValue(Key.MILESTONE));
+ assertEquals("summary1", result.get(0).getValue(Key.SUMMARY));
+ }
+
+ public void testStatusClosed010() throws Exception {
+ connect010();
+ statusClosed();
+ }
+
+ public void testStatusClosed011() throws Exception {
+ connect011();
+ statusClosed();
+ }
+
+ protected void statusClosed() throws Exception {
+ TracTicket ticket = client.getTicket(data.offlineHandlerTicketId, null);
+ assertEquals("closed", ticket.getValue(Key.STATUS));
+ assertEquals("fixed", ticket.getValue(Key.RESOLUTION));
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/AbstractTracClientTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/AbstractTracClientTest.java
new file mode 100644
index 0000000..f4418bc
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/AbstractTracClientTest.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import java.net.Proxy;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.IProxyProvider;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.trac.core.TracClientFactory;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.Ticket;
+
+/**
+ * Provides a base implementation for test cases that access trac repositories.
+ *
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTracClientTest extends TestCase {
+
+ public String repositoryUrl;
+
+ public ITracClient client;
+
+ public String username;
+
+ public String password;
+
+ public Version version;
+
+ private final PrivilegeLevel level;
+
+ final IProgressMonitor callback = new NullProgressMonitor();
+
+ public AbstractTracClientTest(Version version, PrivilegeLevel level) {
+ this.version = version;
+ this.level = level;
+ }
+
+ public AbstractTracClientTest(Version version) {
+ this(version, PrivilegeLevel.USER);
+ }
+
+ public AbstractTracClientTest() {
+ this(null, PrivilegeLevel.USER);
+ }
+
+ public ITracClient connect096() throws Exception {
+ return connect(TracTestConstants.TEST_TRAC_096_URL);
+ }
+
+ public ITracClient connect010() throws Exception {
+ return connect(TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public ITracClient connect010DigestAuth() throws Exception {
+ return connect(TracTestConstants.TEST_TRAC_010_DIGEST_AUTH_URL);
+ }
+
+ public ITracClient connect011() throws Exception {
+ return connect(TracTestConstants.TEST_TRAC_011_URL);
+ }
+
+ public ITracClient connect(String url) throws Exception {
+ return connect(url, Proxy.NO_PROXY);
+ }
+
+ public ITracClient connect(String url, Proxy proxy) throws Exception {
+ Credentials credentials = TestUtil.readCredentials(level);
+ return connect(url, credentials.username, credentials.password, proxy);
+ }
+
+ public ITracClient connect(String url, String username, String password) throws Exception {
+ return connect(url, username, password, Proxy.NO_PROXY);
+ }
+
+ public ITracClient connect(String url, String username, String password, Proxy proxy) throws Exception {
+ return connect(url, username, password, proxy, version);
+ }
+
+ public ITracClient connect(String url, String username, String password, final Proxy proxy, Version version)
+ throws Exception {
+ this.repositoryUrl = url;
+ this.username = username;
+ this.password = password;
+
+ WebLocation location = new WebLocation(url, username, password, new IProxyProvider() {
+ public Proxy getProxyForHost(String host, String proxyType) {
+ return proxy;
+ }
+ });
+ this.client = TracClientFactory.createClient(location, version);
+
+ return this.client;
+ }
+
+ protected void assertTicketEquals(Ticket ticket, TracTicket tracTicket) throws Exception {
+ assertTrue(tracTicket.isValid());
+
+ Map<?, ?> expectedValues = ticket.getValues();
+ Map<String, String> values = tracTicket.getValues();
+ for (String key : values.keySet()) {
+ assertEquals("Values for key '" + key + "' did not match", expectedValues.get(key), values.get(key));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracClientFactoryTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracClientFactoryTest.java
new file mode 100644
index 0000000..74d45ac
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracClientFactoryTest.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.trac.core.TracClientFactory;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.TracLoginException;
+import org.eclipse.mylyn.internal.trac.core.client.TracWebClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracXmlRpcClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracClientFactoryTest extends TestCase {
+
+ public void testCreateClient() throws Exception {
+ WebLocation location = new WebLocation(TracTestConstants.TEST_TRAC_010_URL, "user", "password");
+ ITracClient client = TracClientFactory.createClient(location, Version.TRAC_0_9);
+ assertTrue(client instanceof TracWebClient);
+
+ location = new WebLocation(TracTestConstants.TEST_TRAC_010_SSL_URL, "user", "password");
+ client = TracClientFactory.createClient(location, Version.TRAC_0_9);
+ assertTrue(client instanceof TracWebClient);
+
+ location = new WebLocation(TracTestConstants.TEST_TRAC_010_URL, "user", "password");
+ client = TracClientFactory.createClient(location, Version.XML_RPC);
+ assertTrue(client instanceof TracXmlRpcClient);
+
+ location = new WebLocation(TracTestConstants.TEST_TRAC_010_SSL_URL, "user", "password");
+ client = TracClientFactory.createClient(location, Version.XML_RPC);
+ assertTrue(client instanceof TracXmlRpcClient);
+ }
+
+ public void testCreateClientNull() throws Exception {
+ try {
+ WebLocation location = new WebLocation(TracTestConstants.TEST_TRAC_010_URL, "user", "password");
+ TracClientFactory.createClient(location, null);
+ fail("Expected Exception");
+ } catch (Exception e) {
+ }
+ }
+
+ public void testProbeClient096() throws Exception {
+ probeClient(TracTestConstants.TEST_TRAC_096_URL, false);
+ }
+
+ public void testProbeClient010() throws Exception {
+ probeClient(TracTestConstants.TEST_TRAC_010_URL, true);
+ }
+
+ public void testProbeClient010DigestAuth() throws Exception {
+ probeClient(TracTestConstants.TEST_TRAC_010_DIGEST_AUTH_URL, true);
+ }
+
+ protected void probeClient(String url, boolean xmlrpcInstalled) throws Exception {
+ Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER);
+ WebLocation location = new WebLocation(url, credentials.username, credentials.password);
+ Version version = TracClientFactory.probeClient(location);
+ if (xmlrpcInstalled) {
+ assertEquals(Version.XML_RPC, version);
+ } else {
+ assertEquals(Version.TRAC_0_9, version);
+ }
+
+ location = new WebLocation(url, "", "");
+ version = TracClientFactory.probeClient(location);
+ assertEquals(Version.TRAC_0_9, version);
+
+ try {
+ location = new WebLocation(url, "invaliduser", "password");
+ version = TracClientFactory.probeClient(location);
+ fail("Expected TracLoginException, got " + version);
+ } catch (TracLoginException e) {
+ }
+
+ try {
+ location = new WebLocation(url + "/nonexistant", "", "");
+ version = TracClientFactory.probeClient(location);
+ fail("Expected TracException, got " + version);
+ } catch (TracException e) {
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracClientProxyTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracClientProxyTest.java
new file mode 100644
index 0000000..7f2643e
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracClientProxyTest.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.Proxy.Type;
+
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.trac.tests.support.TestProxy;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+public class TracClientProxyTest extends AbstractTracClientTest {
+
+ private TestProxy testProxy;
+
+ private Proxy proxy;
+
+ private int proxyPort;
+
+ public TracClientProxyTest() {
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ testProxy = new TestProxy();
+ proxyPort = testProxy.startAndWait();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ testProxy.stop();
+ }
+
+ public void testConnectProxyWeb() throws Exception {
+ version = Version.TRAC_0_9;
+ connectProxy(TracTestConstants.TEST_TRAC_010_URL, "GET");
+ }
+
+ public void testConnectProxyXmlRpc() throws Exception {
+ version = Version.XML_RPC;
+ connectProxy(TracTestConstants.TEST_TRAC_010_URL, "POST");
+ }
+
+ public void testConnectProxySslWeb() throws Exception {
+ version = Version.TRAC_0_9;
+ connectProxy(TracTestConstants.TEST_TRAC_010_SSL_URL, "CONNECT");
+ }
+
+ public void testConnectProxySslXmlRpc() throws Exception {
+ version = Version.XML_RPC;
+ connectProxy(TracTestConstants.TEST_TRAC_010_SSL_URL, "CONNECT");
+ }
+
+ private void connectProxy(String url, String expectedMethod) throws Exception {
+ testProxy.setResponse(TestProxy.NOT_FOUND);
+ proxy = new Proxy(Type.HTTP, new InetSocketAddress("localhost", proxyPort));
+ ITracClient client = connect(url, proxy);
+ try {
+ client.validate(callback);
+ } catch (TracException e) {
+ }
+
+ assertEquals(expectedMethod, testProxy.getRequest().getMethod());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracRepositoryInfoTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracRepositoryInfoTest.java
new file mode 100644
index 0000000..4071786
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracRepositoryInfoTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Steffen Pingel 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:
+ * Steffen Pingel - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.trac.tests.client;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositoryInfoTest extends TestCase {
+
+ public void testIsApiVersion() {
+ TracRepositoryInfo info = new TracRepositoryInfo(1, 1, 1);
+ assertTrue(info.isApiVersion(1, 1, 1));
+ assertFalse(info.isApiVersion(1, 1, 0));
+ assertFalse(info.isApiVersion(1, 0, 1));
+ assertFalse(info.isApiVersion(0, 1, 1));
+ assertFalse(info.isApiVersion(-1, -1, -1));
+ }
+
+ public void testIsApiVersionOrHigher() {
+ TracRepositoryInfo info = new TracRepositoryInfo(1, 2, 3);
+ assertTrue(info.isApiVersionOrHigher(1, 2, 3));
+ assertTrue(info.isApiVersionOrHigher(0, 1, 3));
+ assertTrue(info.isApiVersionOrHigher(1, 2, -3));
+ assertFalse(info.isApiVersionOrHigher(1, 2, 4));
+ assertFalse(info.isApiVersionOrHigher(2, 3, 2));
+ }
+
+ public void testIsApiVersionOrSmaller() {
+ TracRepositoryInfo info = new TracRepositoryInfo(1, 2, 3);
+ assertTrue(info.isApiVersionOrSmaller(1, 2, 3));
+ assertTrue(info.isApiVersionOrSmaller(2, 1, 3));
+ assertTrue(info.isApiVersionOrSmaller(1, 3, -3));
+ assertFalse(info.isApiVersionOrSmaller(1, 2, 2));
+ assertFalse(info.isApiVersionOrSmaller(0, 3, 2));
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracSearchTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracSearchTest.java
new file mode 100644
index 0000000..538f6cd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracSearchTest.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracSearchTest extends TestCase {
+
+ private static final String QUERY1 = "&status=new|assigned|reopened&milestone~=0.1";
+
+ private static final String URL1 = "&status=new&status=assigned&status=reopened&milestone=%7E0.1";
+
+ private TracSearch search1;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ search1 = new TracSearch();
+ search1.addFilter("status", "new");
+ search1.addFilter("status", "assigned");
+ search1.addFilter("status", "reopened");
+ search1.addFilter("milestone", "~0.1");
+ }
+
+ public void testToQuery() {
+ assertEquals(QUERY1, search1.toQuery());
+ }
+
+ public void testToQueryEmpty() {
+ assertEquals("", new TracSearch().toQuery());
+ }
+
+ public void testToQueryOperators1() {
+ TracSearch search = new TracSearch();
+ search.addFilter("is", "a");
+ search.addFilter("contains", "~b");
+ search.addFilter("starts", "^c");
+ search.addFilter("ends", "$d");
+ search.addFilter("nis", "!e");
+ search.addFilter("ncontains", "!~f");
+ search.addFilter("nstarts", "!^g");
+ search.addFilter("nends", "!$h");
+
+ assertEquals("&is=a&contains~=b&starts^=c&ends$=d&nis!=e&ncontains!~=f&nstarts!^=g&nends!$=h", search.toQuery());
+ }
+
+ public void testToQueryOperators2() {
+ TracSearch search = new TracSearch();
+ search.addFilter("nstarts", "!^g");
+ search.addFilter("nis", "!e");
+ search.addFilter("is", "a");
+
+ assertEquals("&nstarts!^=g&nis!=e&is=a", search.toQuery());
+ }
+
+ public void testToQuerySortOrder() {
+ search1.setOrderBy("id");
+ assertEquals("&order=id" + QUERY1, search1.toQuery());
+
+ search1.setAscending(false);
+ assertEquals("&order=id&desc=1" + QUERY1, search1.toQuery());
+
+ search1.setOrderBy("summary");
+ search1.setAscending(true);
+ assertEquals("&order=summary" + QUERY1, search1.toQuery());
+ }
+
+ public void testToUrl() {
+ assertEquals(URL1, search1.toUrl());
+ }
+
+ public void testToUrlEmpty() {
+ // assertEquals("", new TracSearch().toUrl());
+ // returns non-empty string to work around a strange Trac behaviour, see
+ // TracSearch.toUrl()
+ assertEquals("&order=id", new TracSearch().toUrl());
+ }
+
+ public void testToUrlEncoding() {
+ search1.addFilter("encoded", "&");
+ assertEquals(URL1 + "&encoded=%26", search1.toUrl());
+ }
+
+ public void testToUrlOperators1() {
+ TracSearch search = new TracSearch();
+ search.addFilter("is", "a");
+ search.addFilter("contains", "~b");
+ search.addFilter("starts", "^c");
+ search.addFilter("ends", "$d");
+ search.addFilter("nis", "!e");
+ search.addFilter("ncontains", "!~f");
+ search.addFilter("nstarts", "!^g");
+ search.addFilter("nends", "!$h");
+
+ assertEquals(
+ "&is=a&contains=%7Eb&starts=%5Ec&ends=%24d&nis=%21e&ncontains=%21%7Ef&nstarts=%21%5Eg&nends=%21%24h",
+ search.toUrl());
+ }
+
+ public void testToUrlOperators2() {
+ TracSearch search = new TracSearch();
+ search.addFilter("nstarts", "!^g");
+ search.addFilter("nis", "!e");
+ search.addFilter("is", "a");
+
+ assertEquals("&nstarts=%21%5Eg&nis=%21e&is=a", search.toUrl());
+ }
+
+ public void testToUrlSortOrder() {
+ search1.setOrderBy("id");
+ assertEquals("&order=id" + QUERY1, search1.toQuery());
+
+ search1.setAscending(false);
+ assertEquals("&order=id&desc=1" + QUERY1, search1.toQuery());
+
+ search1.setOrderBy("summary");
+ search1.setAscending(true);
+ assertEquals("&order=summary" + QUERY1, search1.toQuery());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracTicketTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracTicketTest.java
new file mode 100644
index 0000000..9c55e07
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracTicketTest.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.trac.core.client.InvalidTicketException;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTicketTest extends TestCase {
+
+ public void testValid() {
+ TracTicket ticket = new TracTicket();
+ assertFalse(ticket.isValid());
+
+ ticket.setId(1);
+ assertTrue(ticket.isValid());
+ }
+
+ public void testPutTracValue() throws InvalidTicketException {
+ TracTicket ticket = new TracTicket(1);
+ ticket.putValue("summary", "a");
+ assertEquals("a", ticket.getValue(Key.SUMMARY));
+ assertEquals(null, ticket.getCustomValue("summary"));
+ assertEquals(null, ticket.getCustomValue("a"));
+
+ ticket.putValue("summary", "b");
+ ticket.putValue("custom", "c");
+ assertEquals("b", ticket.getValue(Key.SUMMARY));
+ assertEquals(null, ticket.getCustomValue("summary"));
+ assertEquals("c", ticket.getCustomValue("custom"));
+ }
+
+ public void testPutTracValueId() throws InvalidTicketException {
+ TracTicket ticket = new TracTicket();
+ assertFalse(ticket.putValue("id", "1"));
+ }
+
+ public void testSetCreated() throws InvalidTicketException {
+ TracTicket ticket = new TracTicket(1);
+ ticket.setCreated(TracUtil.parseDate(0));
+ assertEquals(TimeZone.getTimeZone("GMT").getOffset(0) * 1000, ticket.getCreated().getTime());
+
+ Date date = new Date();
+ Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ utc.setTime(date);
+ ticket.setCreated(TracUtil.parseDate((int) (utc.getTimeInMillis() / 1000)));
+
+ assertEquals(date.getTime() / 1000, ticket.getCreated().getTime() / 1000);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracWebClientTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracWebClientTest.java
new file mode 100644
index 0000000..c85a974
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracWebClientTest.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracWebClientTest extends AbstractTracClientRepositoryTest {
+
+ public TracWebClientTest() {
+ super(Version.TRAC_0_9);
+ }
+
+ public void testValidate096() throws Exception {
+ validate(TracTestConstants.TEST_TRAC_096_URL);
+ }
+
+ @Override
+ public void testValidate011() throws Exception {
+ try {
+ validate(TracTestConstants.TEST_TRAC_011_URL);
+ } catch (TracException e) {
+ }
+ }
+
+ public void testValidateAnyPage() throws Exception {
+ connect("http://mylyn.eclipse.org/");
+ try {
+ client.validate(callback);
+ fail("Expected TracException");
+ } catch (TracException e) {
+ }
+ }
+
+ public void testValidateAnonymousLogin() throws Exception {
+ connect(TracTestConstants.TEST_TRAC_010_URL, "", "");
+ client.validate(callback);
+
+ connect(TracTestConstants.TEST_TRAC_096_URL, "", "");
+ client.validate(callback);
+ }
+
+ public void testUpdateAttributesAnonymous096() throws Exception {
+ connect(TracTestConstants.TEST_TRAC_096_URL, "", "");
+ updateAttributes();
+ }
+
+ public void testUpdateAttributesAnonymous010() throws Exception {
+ connect(TracTestConstants.TEST_TRAC_010_URL, "", "");
+ updateAttributes();
+ }
+
+ private void updateAttributes() throws TracException {
+ assertNull(client.getMilestones());
+ client.updateAttributes(new NullProgressMonitor(), true);
+ TracVersion[] versions = client.getVersions();
+ assertEquals(2, versions.length);
+ Arrays.sort(versions, new Comparator<TracVersion>() {
+ public int compare(TracVersion o1, TracVersion o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
+ assertEquals("1.0", versions[0].getName());
+ assertEquals("2.0", versions[1].getName());
+ }
+
+ // TODO move this test to AbstracTracClientTest when bug 162094 is resolved
+ public void testSearchMilestoneAmpersand010() throws Exception {
+ connect010();
+ searchMilestoneAmpersand();
+ }
+
+ public void testSearchMilestoneAmpersand011() throws Exception {
+ connect011();
+ searchMilestoneAmpersand();
+ }
+
+ private void searchMilestoneAmpersand() throws Exception {
+ TracSearch search = new TracSearch();
+ search.addFilter("milestone", "mile&stone");
+ search.setOrderBy("id");
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ assertEquals(1, result.size());
+ assertTicketEquals(tickets.get(7), result.get(0));
+ }
+
+ public void testStatusClosed096() throws Exception {
+ connect096();
+ statusClosed();
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracXmlRpcClientTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracXmlRpcClientTest.java
new file mode 100644
index 0000000..f26d471
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracXmlRpcClientTest.java
@@ -0,0 +1,432 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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
+ * Xiaoyang Guan - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.trac.tests.client;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.client.TracPermissionDeniedException;
+import org.eclipse.mylyn.internal.trac.core.client.TracRemoteException;
+import org.eclipse.mylyn.internal.trac.core.client.TracXmlRpcClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracAction;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicketField;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
+import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+/**
+ * @author Steffen Pingel
+ * @author Xiaoyang Guan
+ */
+public class TracXmlRpcClientTest extends AbstractTracClientRepositoryTest {
+
+ public TracXmlRpcClientTest() {
+ super(Version.XML_RPC);
+ }
+
+ @Override
+ public void testValidate011() throws Exception {
+ validate(TracTestConstants.TEST_TRAC_011_URL);
+ }
+
+ public void testValidateFailNoAuth() throws Exception {
+ connect(TracTestConstants.TEST_TRAC_010_URL, "", "");
+ try {
+ client.validate(callback);
+ fail("Expected TracPermissiongDeniedException");
+ } catch (TracPermissionDeniedException e) {
+ }
+ }
+
+ public void testMulticallExceptions() throws Exception {
+ connect010();
+ try {
+ ((TracXmlRpcClient) client).getTickets(new int[] { 1, Integer.MAX_VALUE }, null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+ }
+
+ public void testUpdateAttributes010() throws Exception {
+ connect010();
+ updateAttributes();
+ }
+
+ public void testUpdateAttributes011() throws Exception {
+ connect011();
+ updateAttributes();
+ }
+
+ public void updateAttributes() throws Exception {
+ assertNull(client.getMilestones());
+ client.updateAttributes(new NullProgressMonitor(), true);
+ TracVersion[] versions = client.getVersions();
+ assertEquals(2, versions.length);
+ Arrays.sort(versions, new Comparator<TracVersion>() {
+ public int compare(TracVersion o1, TracVersion o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
+ assertEquals("1.0", versions[0].getName());
+ assertEquals("", versions[0].getDescription());
+ assertEquals(new Date(0), versions[0].getTime());
+ assertEquals("2.0", versions[1].getName());
+ assertEquals("", versions[1].getDescription());
+ assertEquals(new Date(0), versions[1].getTime());
+ }
+
+ public void testSearchValidateTicket010() throws Exception {
+ connect010();
+ searchValidateTicket();
+ }
+
+ public void testSearchValidateTicket011() throws Exception {
+ connect011();
+ searchValidateTicket();
+ }
+
+ public void searchValidateTicket() throws Exception {
+ TracSearch search = new TracSearch();
+ search.addFilter("summary", "summary1");
+ List<TracTicket> result = new ArrayList<TracTicket>();
+ client.search(search, result, null);
+ assertEquals(1, result.size());
+ assertTicketEquals(tickets.get(0), result.get(0));
+ assertEquals("component1", result.get(0).getValue(Key.COMPONENT));
+ assertEquals("description1", result.get(0).getValue(Key.DESCRIPTION));
+ assertEquals("milestone1", result.get(0).getValue(Key.MILESTONE));
+ assertEquals("anonymous", result.get(0).getValue(Key.REPORTER));
+ assertEquals("summary1", result.get(0).getValue(Key.SUMMARY));
+ // assertEquals("", result.get(0).getValue(Key.VERSION));
+ }
+
+ public void testGetTicketActions010() throws Exception {
+ connect010();
+
+ TracTicket ticket = client.getTicket(tickets.get(0).getId(), null);
+ TracAction[] actions = ticket.getActions();
+ assertNotNull(actions);
+ assertEquals(4, actions.length);
+ assertEquals("leave", actions[0].getId());
+ assertNull(actions[0].getLabel());
+ assertEquals(0, actions[0].getFields().size());
+ assertEquals("resolve", actions[1].getId());
+ assertNull(actions[1].getLabel());
+ assertEquals(0, actions[1].getFields().size());
+ assertEquals("reassign", actions[2].getId());
+ assertNull(actions[2].getLabel());
+ assertEquals(0, actions[2].getFields().size());
+ assertEquals("accept", actions[3].getId());
+ assertNull(actions[3].getLabel());
+ assertEquals(0, actions[3].getFields().size());
+
+ ticket = client.getTicket(tickets.get(1).getId(), null);
+ actions = ticket.getActions();
+ assertNotNull(actions);
+ assertEquals(2, actions.length);
+ assertEquals("leave", actions[0].getId());
+ assertEquals("reopen", actions[1].getId());
+ }
+
+ public void testGetTicketActions011() throws Exception {
+ connect011();
+
+ TracTicket ticket = client.getTicket(tickets.get(0).getId(), null);
+ TracAction[] actions = ticket.getActions();
+ assertNotNull(actions);
+ assertEquals(4, actions.length);
+ assertEquals("leave", actions[0].getId());
+ assertEquals("resolve", actions[1].getId());
+ assertEquals("resolve", actions[1].getLabel());
+ assertNotNull(actions[1].getHint());
+ List<TracTicketField> fields = actions[1].getFields();
+ assertEquals(1, fields.size());
+ assertEquals(5, fields.get(0).getOptions().length);
+ assertEquals("fixed", fields.get(0).getOptions()[0]);
+ assertEquals("reassign", actions[2].getId());
+ fields = actions[2].getFields();
+ assertEquals(1, fields.size());
+ assertNull(fields.get(0).getOptions());
+ assertEquals("accept", actions[3].getId());
+
+ ticket = client.getTicket(tickets.get(1).getId(), null);
+ actions = ticket.getActions();
+ assertNotNull(actions);
+ assertEquals(2, actions.length);
+ assertEquals("leave", actions[0].getId());
+ assertEquals("reopen", actions[1].getId());
+ }
+
+ public void testWikiToHtml010() throws Exception {
+ connect010();
+ wikiToHtml(TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public void testWikiToHtml011() throws Exception {
+ connect011();
+ wikiToHtml("http://mylyn.eclipse.org/trac011");
+ }
+
+ public void wikiToHtml(String tracUrl) throws Exception {
+ String html = ((TracXmlRpcClient) client).wikiToHtml("", null);
+ assertEquals("", html);
+
+ html = ((TracXmlRpcClient) client).wikiToHtml("A simple line of text.", null);
+ assertEquals("<p>\nA simple line of text.\n</p>\n", html);
+
+ String source = "= WikiFormattingTesting =\n" + " * '''bold''', '''!''' can be bold too''', and '''! '''\n"
+ + " * ''italic''\n" + " * '''''bold italic'''''\n" + " * __underline__\n"
+ + " * {{{monospace}}} or `monospace`\n" + " * ~~strike-through~~\n" + " * ^superscript^ \n"
+ + " * ,,subscript,,\n" + "= Heading =\n" + "== Subheading ==\n";
+
+ String expectedHtml = "<h1 id=\"WikiFormattingTesting\"><a class=\"missing wiki\" href=\""
+ + tracUrl
+ + "/wiki/WikiFormattingTesting\" rel=\"nofollow\">WikiFormattingTesting?</a></h1>\n<ul><li><strong>bold</strong>, <strong>\'\'\' can be bold too</strong>, and <strong>! </strong>\n</li><li><i>italic</i>\n</li><li><strong><i>bold italic</i></strong>\n</li><li><span class=\"underline\">underline</span>\n</li><li><tt>monospace</tt> or <tt>monospace</tt>\n</li><li><del>strike-through</del>\n</li><li><sup>superscript</sup> \n</li><li><sub>subscript</sub>\n</li></ul><h1 id=\"Heading\">Heading</h1>\n<h2 id=\"Subheading\">Subheading</h2>\n";
+
+ html = ((TracXmlRpcClient) client).wikiToHtml(source, null);
+ assertEquals(expectedHtml, html);
+ }
+
+ public void testValidateWikiAPI010() throws Exception {
+ connect010();
+ ((TracXmlRpcClient) client).validateWikiRpcApi(null);
+ }
+
+ public void testValidateWikiAPI011() throws Exception {
+ connect011();
+ ((TracXmlRpcClient) client).validateWikiRpcApi(null);
+ }
+
+ public void testGetAllWikiPageNames010() throws Exception {
+ connect010();
+ getAllWikiPageNames();
+ }
+
+ public void testGetAllWikiPageNames011() throws Exception {
+ connect011();
+ getAllWikiPageNames();
+ }
+
+ private void getAllWikiPageNames() throws Exception {
+ String[] names = ((TracXmlRpcClient) client).getAllWikiPageNames(null);
+ List<String> all = Arrays.asList(names);
+ assertTrue(all.contains("Test"));
+ }
+
+ public void testGetWikiPage010() throws Exception {
+ connect010();
+ getWikiPage();
+ }
+
+ public void testGetWikiPage011() throws Exception {
+ connect011();
+ getWikiPage();
+ }
+
+ private void getWikiPage() throws Exception {
+ TracWikiPage page = ((TracXmlRpcClient) client).getWikiPage("TestGetPage", null);
+ assertEquals("TestGetPage", page.getPageInfo().getPageName());
+ assertEquals("tests at mylyn.eclipse.org", page.getPageInfo().getAuthor());
+ assertEquals(2, page.getPageInfo().getVersion());
+ // XXX The Date returned from Wiki API seems to have a problem with the Time Zone
+ //String date = "Sat Nov 11 18:10:56 EST 2006";
+ //assertEquals(date, page.getPageVersion().getLastModified().toString());
+ assertEquals("Version 2", page.getContent());
+ assertTrue(page.getPageHTML().startsWith("<html>"));
+
+ page = ((TracXmlRpcClient) client).getWikiPage("TestGetPage", 1, null);
+ assertEquals("TestGetPage", page.getPageInfo().getPageName());
+ assertEquals("anonymous", page.getPageInfo().getAuthor());
+ assertEquals(1, page.getPageInfo().getVersion());
+ assertEquals("Version 1", page.getContent());
+ assertTrue(page.getPageHTML().startsWith("<html>"));
+ }
+
+ public void testGetWikiPageInvalid010() throws Exception {
+ connect010();
+ getWikiPageInvalid();
+ }
+
+ public void testGetWikiPageInvalid011() throws Exception {
+ connect011();
+ getWikiPageInvalid();
+ }
+
+ private void getWikiPageInvalid() throws Exception {
+ // get info -- non-existing version
+ try {
+ ((TracXmlRpcClient) client).getWikiPageInfo("Test", 10, null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get info -- non-existing page name
+ try {
+ ((TracXmlRpcClient) client).getWikiPageInfo("NoSuchPage", null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get info -- null parameter
+ try {
+ ((TracXmlRpcClient) client).getWikiPageInfo(null, null);
+ fail("Expected RuntimeException");
+ } catch (IllegalArgumentException e) {
+ }
+
+ // get content -- non-existing version
+ try {
+ ((TracXmlRpcClient) client).getWikiPageContent("Test", 10, null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get content -- non-existing page name
+ try {
+ ((TracXmlRpcClient) client).getWikiPageContent("NoSuchPage", null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get content -- null parameter
+ try {
+ ((TracXmlRpcClient) client).getWikiPageContent(null, null);
+ fail("Expected RuntimeException");
+ } catch (IllegalArgumentException e) {
+ }
+
+ // get HTML -- non-existing version
+ try {
+ ((TracXmlRpcClient) client).getWikiPageHtml("Test", 10, null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get HTML -- non-existing page name
+ try {
+ ((TracXmlRpcClient) client).getWikiPageHtml("NoSuchPage", null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get HTML -- null parameter
+ try {
+ ((TracXmlRpcClient) client).getWikiPageHtml(null, null);
+ fail("Expected RuntimeException");
+ } catch (IllegalArgumentException e) {
+ }
+
+ // get a page -- non-existing version
+ try {
+ ((TracXmlRpcClient) client).getWikiPage("Test", 10, null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get a page -- non-existing page name
+ try {
+ ((TracXmlRpcClient) client).getWikiPage("NoSuchPage", null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get a page -- null parameter
+ try {
+ ((TracXmlRpcClient) client).getWikiPage(null, null);
+ fail("Expected RuntimeException");
+ } catch (IllegalArgumentException e) {
+ }
+
+ // get all versions of a page -- non-existing page name
+ try {
+ ((TracXmlRpcClient) client).getWikiPageInfoAllVersions("NoSuchPage", null);
+ fail("Expected TracRemoteException");
+ } catch (TracRemoteException e) {
+ }
+
+ // get all versions of a page -- null parameter
+ try {
+ ((TracXmlRpcClient) client).getWikiPageInfoAllVersions(null, null);
+ fail("Expected RuntimeException");
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
+ public void testGetWikiPageInfoAllVersions010() throws Exception {
+ connect010();
+ getWikiPageInfoAllVersions();
+ }
+
+ public void testGetWikiPageInfoAllVersions011() throws Exception {
+ connect011();
+ getWikiPageInfoAllVersions();
+ }
+
+ private void getWikiPageInfoAllVersions() throws Exception {
+ String pageName = "Test";
+
+ TracWikiPageInfo[] versions = ((TracXmlRpcClient) client).getWikiPageInfoAllVersions(pageName, null);
+ assertTrue(versions.length >= 1);
+ int counter = 1;
+ for (TracWikiPageInfo version : versions) {
+ assertTrue(version.getPageName().equals(pageName));
+ assertTrue(version.getVersion() == counter++); // assuming versions are ordered increasingly
+ }
+ }
+
+ public void testGetRecentWikiChanges010() throws Exception {
+ connect010();
+ getRecentWikiChanges();
+ }
+
+ public void testGetRecentWikiChanges011() throws Exception {
+ connect011();
+ getRecentWikiChanges();
+ }
+
+ private void getRecentWikiChanges() throws Exception {
+ TracWikiPageInfo[] changes = ((TracXmlRpcClient) client).getRecentWikiChanges(new Date(0), null);
+ TracWikiPageInfo testPage = null;
+ for (TracWikiPageInfo item : changes) {
+ assertTrue(item.getPageName() != null);
+ if (item.getPageName().equals("Test")) {
+ testPage = item;
+ }
+ }
+ assertTrue(testPage != null);
+ }
+
+ public void testPutWikiPage010() throws Exception {
+ connect010();
+ putWikiPage();
+ }
+
+ public void testPutWikiPage011() throws Exception {
+ connect011();
+ putWikiPage();
+ }
+
+ private void putWikiPage() throws Exception {
+ // TODO testing wiki.putPage()
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracXmlRpcTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracXmlRpcTest.java
new file mode 100644
index 0000000..160e6c2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/client/TracXmlRpcTest.java
@@ -0,0 +1,509 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.client;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.trac.core.util.TracHttpClientTransportFactory;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+/**
+ * Test cases for <a href="http://trac-hacks.org/wiki/XmlRpcPlugin">Trac XML-RPC Plugin</a> (revision 1188 or higher is
+ * required).
+ *
+ * <p>
+ * This class does not depend on any Mylyn (connector) classes except for TracHttpClientTransportFactory which is needed
+ * for initialization of HttpClient.
+ *
+ * @author Steffen Pingel
+ */
+public class TracXmlRpcTest extends TestCase {
+
+ public static final String XMLRPC_URL = "/login/xmlrpc";
+
+ private XmlRpcClient xmlrpc;
+
+ private String username;
+
+ // private String password;
+
+ private Random random;
+
+ private ArrayList<Integer> tickets;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ random = new Random();
+
+ Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.ADMIN);
+ createConnection(new URL(TracTestConstants.TEST_TRAC_010_URL + XMLRPC_URL), credentials.username,
+ credentials.password);
+
+ tickets = new ArrayList<Integer>();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ for (int id : tickets) {
+ call("ticket.delete", id);
+ }
+ }
+
+ private void createConnection(URL url, String username, String password) throws Exception {
+ XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
+ config.setEncoding("UTF-8");
+ config.setBasicUserName(username);
+ config.setBasicPassword(password);
+ config.setServerURL(url);
+
+ xmlrpc = new XmlRpcClient();
+ xmlrpc.setConfig(config);
+
+ TracHttpClientTransportFactory factory = new TracHttpClientTransportFactory(xmlrpc, new HttpClient());
+ xmlrpc.setTransportFactory(factory);
+
+ this.username = username;
+ // this.password = password;
+ }
+
+ private int createTicket(String summary, String description, Map<String, Object> attributes)
+ throws XmlRpcException, IOException {
+ int id = (Integer) call("ticket.create", summary, description, attributes);
+ tickets.add(id);
+ return id;
+ }
+
+ private Object call(String method, Object... parameters) throws XmlRpcException, IOException {
+ Object result = xmlrpc.execute(method, parameters);
+ if (result instanceof XmlRpcException) {
+ throw (XmlRpcException) result;
+ }
+ return result;
+ }
+
+ public Map<String, Object> createMultiCall(String methodName, Object... parameters) throws XmlRpcException,
+ IOException {
+ Map<String, Object> table = new Hashtable<String, Object>();
+ table.put("methodName", methodName);
+ table.put("params", parameters);
+ return table;
+ }
+
+ private void internalTestCrud(String module) throws XmlRpcException, IOException {
+ try {
+ call(module + ".delete", "foo");
+ } catch (XmlRpcException e) {
+ }
+
+ call(module + ".create", "foo", "bar");
+ try {
+ assertHasValue((Object[]) call(module + ".getAll"), "foo");
+ assertEquals("bar", (String) (call(module + ".get", "foo")));
+
+ call(module + ".update", "foo", "baz");
+ assertEquals("baz", (String) (call(module + ".get", "foo")));
+ } finally {
+ call(module + ".delete", "foo");
+ }
+ }
+
+ private Object createValue(Object fieldName, Object clazz) {
+ if (clazz == String.class) {
+ return fieldName.toString() + random.nextInt();
+ } else if (clazz == Date.class) {
+ return new Date();
+ } else if (clazz == Boolean.class) {
+ return random.nextBoolean();
+ } else if (clazz == Double.class) {
+ return random.nextDouble();
+ } else if (clazz == Integer.class) {
+ return random.nextInt();
+ }
+
+ throw new RuntimeException("Invalid test data: " + fieldName + ", " + clazz);
+ }
+
+ private void internalTestComponent(String module, Object... fields) throws XmlRpcException, IOException {
+ try {
+ call(module + ".delete", "foo");
+ } catch (XmlRpcException e) {
+ }
+
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ for (int i = 0; i < fields.length; i += 2) {
+ attributes.put((String) fields[i], createValue(fields[i], fields[i + 1]));
+ }
+
+ call(module + ".create", "foo", attributes);
+
+ try {
+ assertHasValue((Object[]) call(module + ".getAll"), "foo");
+ Map<?, ?> values = (Map<?, ?>) call(module + ".get", "foo");
+ for (String attribute : attributes.keySet()) {
+ assertEquals(attributes.get(attribute), values.get(attribute));
+ }
+
+ for (int i = 0; i < fields.length; i += 2) {
+ attributes.put((String) fields[i], createValue(fields[i], fields[i + 1]));
+ }
+
+ call(module + ".update", "foo", attributes);
+ values = (Map<?, ?>) call(module + ".get", "foo");
+ for (String attribute : attributes.keySet()) {
+ assertEquals(attributes.get(attribute), values.get(attribute));
+ }
+ } finally {
+ call(module + ".delete", "foo");
+ }
+ }
+
+ public void testMilestoneDate() throws XmlRpcException, IOException {
+ try {
+ call("ticket.milestone.delete", "foo");
+ } catch (XmlRpcException e) {
+ }
+
+ int due = (int) (System.currentTimeMillis() / 1000) + 1000;
+ int completed = (int) (System.currentTimeMillis() / 1000);
+
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ attributes.put("description", "description");
+ attributes.put("due", due);
+ attributes.put("completed", completed);
+
+ call("ticket.milestone.create", "foo", attributes);
+
+ Map<?, ?> values = (Map<?, ?>) call("ticket.milestone.get", "foo");
+ assertEquals(new Integer(due), values.get("due"));
+ assertEquals(new Integer(completed), values.get("completed"));
+
+ call("ticket.milestone.delete", "foo");
+ }
+
+ private void assertHasValue(Object[] items, Object value) {
+ for (Object item : items) {
+ if (item.equals(value)) {
+ return;
+ }
+ }
+ fail("Could not find expected value: " + value);
+ }
+
+ private void assertTicketHasAttributes(Map<String, Object> attributes, int id, Object[] ticket) {
+ assertTicketHasAttributes(attributes, id, ticket, true);
+ }
+
+ private void assertTicketHasAttributes(Map<String, Object> attributes, int id, Object[] ticket, boolean newTicket) {
+ assertEquals(id, ticket[0]);
+ assertTrue(ticket[1] instanceof Integer); // time created
+ // time changed
+ if (newTicket) {
+ assertEquals(ticket[1], ticket[2]);
+ } else {
+ assertTrue((Integer) ticket[2] >= (Integer) ticket[1]);
+ }
+ Map<?, ?> values = (Map<?, ?>) ticket[3];
+ for (String attribute : attributes.keySet()) {
+ assertEquals(attributes.get(attribute), values.get(attribute));
+ }
+ }
+
+ public void testGetTicket() throws XmlRpcException, IOException {
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ attributes.put("type", "task");
+ attributes.put("status", "closed");
+ int id = createTicket("summary", "description", attributes);
+
+ attributes.put("summary", "summary");
+ attributes.put("description", "description");
+
+ Object[] ticket = (Object[]) call("ticket.get", id);
+ assertTicketHasAttributes(attributes, id, ticket);
+ }
+
+ public void testGetTicketNonExistant() throws XmlRpcException, IOException {
+ try {
+ call("ticket.delete", Integer.MAX_VALUE);
+ } catch (Exception e) {
+ // ignore
+ }
+
+ try {
+ List<?> ticket = (List<?>) call("ticket.get", Integer.MAX_VALUE);
+ fail("Expected XmlRpcException, got ticket instead: " + ticket);
+ } catch (XmlRpcException e) {
+ // ignore
+ }
+ }
+
+ public void testGetTicketUmlaute() throws XmlRpcException, IOException {
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ int id = createTicket("summarya\u0308O\u030b", "\u00d8", attributes);
+
+ attributes.put("summary", "summarya\u0308O\u030b");
+ attributes.put("description", "\u00d8");
+
+ Object[] ticket = (Object[]) call("ticket.get", id);
+ assertTicketHasAttributes(attributes, id, ticket);
+ }
+
+ public void testUpdateTicket() throws XmlRpcException, IOException {
+ int id = createTicket("summary", "description", new Hashtable<String, Object>());
+
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ attributes.put("summary", "changed");
+ call("ticket.update", id, "my comment", attributes);
+
+ attributes.put("description", "description");
+
+ Object[] ticket = (Object[]) call("ticket.get", id);
+ Map<?, ?> values = (Map<?, ?>) ticket[3];
+ for (String attribute : attributes.keySet()) {
+ assertEquals(attributes.get(attribute), values.get(attribute));
+ }
+ }
+
+ public void testTicketCustomFields() throws XmlRpcException, IOException {
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ attributes.put("custom_text_field", "myvalue");
+ int id = createTicket("summary", "description", attributes);
+
+ // check for default values
+ attributes.put("custom_checkbox_field", "1");
+ attributes.put("custom_select_field", "two");
+ attributes.put("custom_radio_field", "baz");
+ attributes.put("custom_textarea_field", "default text");
+
+ Object[] ticket = (Object[]) call("ticket.get", id);
+ assertTicketHasAttributes(attributes, id, ticket);
+
+ attributes.put("custom_text_field", "myvalue2");
+ attributes.put("custom_checkbox_field", "0");
+ attributes.put("custom_select_field", "one");
+ attributes.put("custom_radio_field", "foo");
+ attributes.put("custom_textarea_field", "mytext");
+
+ call("ticket.update", id, "my comment", attributes);
+
+ ticket = (Object[]) call("ticket.get", id);
+ assertTicketHasAttributes(attributes, id, ticket, false);
+ }
+
+ public void testGetChangeLog() throws XmlRpcException, IOException {
+ int id = createTicket("summary", "description", new Hashtable<String, Object>());
+
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ attributes.put("summary", "changed");
+ call("ticket.update", id, "my comment", attributes);
+
+ Object[] log = (Object[]) call("ticket.changeLog", id, 0);
+ Object[] entry = (Object[]) log[0];
+ assertTrue(entry[0] instanceof Integer); // time
+ assertEquals(username, entry[1]); // author
+ assertEquals("summary", entry[2]); // field
+ assertEquals("summary", entry[3]); // old value
+ assertEquals("changed", entry[4]); // new value
+ }
+
+ public void testMultiGetTicket() throws XmlRpcException, IOException {
+ int id1 = createTicket("summary1", "description1", new Hashtable<String, Object>());
+ int id2 = createTicket("summary2", "description2", new Hashtable<String, Object>());
+
+ List<Map<?, ?>> calls = new ArrayList<Map<?, ?>>();
+ calls.add(createMultiCall("ticket.get", id1));
+ calls.add(createMultiCall("ticket.get", id2));
+ Object[] ret = (Object[]) call("system.multicall", calls);
+
+ Object[] ticket = (Object[]) ((Object[]) ret[0])[0];
+ Map<String, Object> attributes = new Hashtable<String, Object>();
+ attributes.put("summary", "summary1");
+ attributes.put("description", "description1");
+ assertTicketHasAttributes(attributes, id1, ticket);
+
+ ticket = (Object[]) ((Object[]) ret[1])[0];
+ attributes.clear();
+ attributes.put("summary", "summary2");
+ attributes.put("description", "description2");
+ assertTicketHasAttributes(attributes, id2, ticket);
+ }
+
+ public void testAttachment() throws XmlRpcException, IOException {
+ int id = createTicket("summary", "description", new Hashtable<String, Object>());
+
+ String filename = (String) call("ticket.putAttachment", id, "attach.txt", "description", "data".getBytes(),
+ true);
+ // the returned filename may differ, since another ticket may have an
+ // attachment named "attach.txt"
+ // assertEquals("attach.txt", filename);
+
+ Object[] ret = (Object[]) call("ticket.listAttachments", id);
+ assertEquals(1, ret.length);
+ Object[] attachment = (Object[]) ret[0];
+ assertEquals("attach.txt", attachment[0]);
+ assertEquals("description", attachment[1]);
+ assertEquals(4, attachment[2]);
+ // date
+ assertEquals(username, attachment[4]);
+
+ byte[] bytes = (byte[]) call("ticket.getAttachment", id, filename);
+ String data = new String(bytes);
+ assertEquals("data", data);
+
+ // test override
+
+ String filename2 = (String) call("ticket.putAttachment", id, filename, "newdescription", "newdata".getBytes(),
+ true);
+ assertEquals(filename, filename2);
+ ret = (Object[]) call("ticket.listAttachments", id);
+ assertEquals(1, ret.length);
+ attachment = (Object[]) ret[0];
+ assertEquals("attach.txt", attachment[0]);
+ assertEquals("newdescription", attachment[1]);
+ assertEquals(7, attachment[2]);
+ // date
+ assertEquals(username, attachment[4]);
+ bytes = (byte[]) call("ticket.getAttachment", id, filename);
+ data = new String(bytes);
+ assertEquals("newdata", data);
+
+ String filename3 = (String) call("ticket.putAttachment", id, "attach.txt", "description", "data".getBytes(),
+ false);
+ assertFalse("attach.txt".equals(filename3));
+ ret = (Object[]) call("ticket.listAttachments", id);
+ assertEquals(2, ret.length);
+ }
+
+ public void testDeleteAttachment() throws XmlRpcException, IOException {
+ int id = createTicket("summary", "description", new Hashtable<String, Object>());
+
+ String filename = (String) call("ticket.putAttachment", id, "attach.txt", "description", "data".getBytes(),
+ true);
+
+ Object[] ret = (Object[]) call("ticket.listAttachments", id);
+ assertEquals(1, ret.length);
+
+ call("ticket.deleteAttachment", id, filename);
+
+ ret = (Object[]) call("ticket.listAttachments", id);
+ assertEquals(0, ret.length);
+ }
+
+ public void testDuplicateAttachment() throws XmlRpcException, IOException {
+ int id1 = createTicket("summary", "description", new Hashtable<String, Object>());
+ int id2 = createTicket("summary", "description", new Hashtable<String, Object>());
+
+ String filename1 = (String) call("ticket.putAttachment", id1, "attach.txt", "description", "data".getBytes(),
+ true);
+ String filename2 = (String) call("ticket.putAttachment", id2, "attach.txt", "description", "data2".getBytes(),
+ true);
+ assertEquals("attach.txt", filename1);
+ assertEquals(filename1, filename2);
+
+ byte[] bytes = (byte[]) call("ticket.getAttachment", id1, "attach.txt");
+ String data = new String(bytes);
+ assertEquals("data", data);
+
+ bytes = (byte[]) call("ticket.getAttachment", id2, "attach.txt");
+ data = new String(bytes);
+ assertEquals("data2", data);
+ }
+
+ public void testQuery() throws XmlRpcException, IOException {
+ Object[] ret = (Object[]) call("ticket.query", "summary~=foo|bar|baz");
+ for (Object id : ret) {
+ call("ticket.delete", (Integer) id);
+ }
+
+ int id1 = createTicket("foobarsum1", "description", new Hashtable<String, Object>());
+ int id2 = createTicket("foobaz sum2", "description", new Hashtable<String, Object>());
+ int id3 = createTicket("foobarbaz3", "foobarbaz description3", new Hashtable<String, Object>());
+
+ ret = (Object[]) call("ticket.query", "summary=foobarsum1|foobaz sum2");
+ assertEquals(2, ret.length);
+ assertEquals(id1, ret[0]);
+ assertEquals(id2, ret[1]);
+
+ // the first criterium is ignored
+ ret = (Object[]) call("ticket.query", "summary~=foobarsum1&summary~=foobaz sum2");
+ assertEquals(1, ret.length);
+ assertEquals(id2, ret[0]);
+
+ ret = (Object[]) call("ticket.query", "summary~=bar|baz");
+ assertEquals(3, ret.length);
+
+ ret = (Object[]) call("ticket.query", "description~=foobarbaz description3");
+ assertEquals(1, ret.length);
+ assertEquals(id3, ret[0]);
+ }
+
+ public void testQueryAll() throws XmlRpcException, IOException {
+ int id = createTicket("foo", "description", new Hashtable<String, Object>());
+
+ Object[] ret = (Object[]) call("ticket.query", "order=id");
+ assertTrue(ret.length > 0);
+ assertHasValue(ret, id);
+ }
+
+ public void testPriorities() throws XmlRpcException, IOException {
+ internalTestCrud("ticket.priority");
+ }
+
+ public void testSeverities() throws XmlRpcException, IOException {
+ internalTestCrud("ticket.severity");
+ }
+
+ public void testType() throws XmlRpcException, IOException {
+ internalTestCrud("ticket.type");
+ }
+
+ public void testStatus() throws XmlRpcException, IOException {
+ internalTestCrud("ticket.status");
+ }
+
+ public void testResolutions() throws XmlRpcException, IOException {
+ internalTestCrud("ticket.resolution");
+ }
+
+ public void testVersions() throws XmlRpcException, IOException {
+ internalTestComponent("ticket.version", "time", Integer.class, "description", String.class);
+ }
+
+ public void testComponents() throws XmlRpcException, IOException {
+ internalTestComponent("ticket.component", "owner", String.class, "description", String.class);
+ }
+
+ public void testMilestones() throws XmlRpcException, IOException {
+ internalTestComponent("ticket.milestone", "due", Integer.class, "completed", Integer.class, "description",
+ String.class);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/RepositorySearchTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/RepositorySearchTest.java
new file mode 100644
index 0000000..8412b89
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/RepositorySearchTest.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.search.RepositorySearchResult;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.trac.tests.support.TestFixture;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class RepositorySearchTest extends TestCase {
+
+ private TestData data;
+
+ private TaskRepositoryManager manager;
+
+ private TaskRepository repository;
+
+ public RepositorySearchTest() {
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ data = TestFixture.init010();
+ manager = TasksUiPlugin.getRepositoryManager();
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ protected void init(String url, Version version) {
+ Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER);
+
+ repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, url);
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username,
+ credentials.password), false);
+ repository.setTimeZoneId(ITracClient.TIME_ZONE);
+ repository.setCharacterEncoding(ITracClient.CHARSET);
+ repository.setVersion(version.name());
+
+ manager.addRepository(repository);
+ }
+
+ public void testSearch() {
+ init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+
+ TracSearch search = new TracSearch();
+ String queryUrl = repository.getRepositoryUrl() + ITracClient.QUERY_URL + search.toUrl();
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+ query.setUrl(queryUrl);
+ SearchHitCollector collector = new SearchHitCollector(TasksUiPlugin.getTaskList(), repository, query);
+ collector.run(new NullProgressMonitor());
+ RepositorySearchResult searchResult = (RepositorySearchResult) collector.getSearchResult();
+ assertEquals(data.tickets.size(), searchResult.getMatchCount());
+ for (Object match : searchResult.getElements()) {
+ ITask task = (ITask) match;
+ assertEquals(TracTestConstants.TEST_TRAC_096_URL, task.getRepositoryUrl());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracAttachmentHandlerTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracAttachmentHandlerTest.java
new file mode 100644
index 0000000..5e5888c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracAttachmentHandlerTest.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.tasks.core.data.FileTaskAttachmentSource;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.trac.tests.support.TestFixture;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracAttachmentHandlerTest extends TestCase {
+
+ private TaskRepository repository;
+
+ private TracRepositoryConnector connector;
+
+ private AbstractTaskAttachmentHandler attachmentHandler;
+
+ private TestData data;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ data = TestFixture.init010();
+ connector = (TracRepositoryConnector) TasksUi.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
+ attachmentHandler = connector.getTaskAttachmentHandler();
+ }
+
+ protected void init(String url, Version version) {
+ repository = TracTestUtil.init(url, version);
+ }
+
+ public void testDownloadAttachmentXmlRpc010() throws Exception {
+ downloadAttachmentXmlRpc(TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public void testDownloadAttachmentXmlRpc011() throws Exception {
+ downloadAttachmentXmlRpc(TracTestConstants.TEST_TRAC_011_URL);
+ }
+
+ private void downloadAttachmentXmlRpc(String url) throws Exception {
+ init(url, Version.XML_RPC);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ List<ITaskAttachment> attachments = TracTestUtil.getTaskAttachments(task);
+ assertTrue(attachments.size() > 0);
+ InputStream in = attachmentHandler.getContent(repository, task, attachments.get(0).getTaskAttribute(), null);
+ try {
+ byte[] result = new byte[6];
+ in.read(result);
+ assertEquals("Mylar\n", new String(result));
+ assertEquals(-1, in.read());
+ } finally {
+ in.close();
+ }
+ }
+
+ public void testGetAttachmentDataXmlRpc010() throws Exception {
+ getAttachmentDataXmlRpc(TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public void testGetAttachmentDataXmlRpc011() throws Exception {
+ getAttachmentDataXmlRpc(TracTestConstants.TEST_TRAC_011_URL);
+ }
+
+ private void getAttachmentDataXmlRpc(String url) throws Exception {
+ init(url, Version.XML_RPC);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ List<ITaskAttachment> attachments = TracTestUtil.getTaskAttachments(task);
+ assertTrue(attachments.size() > 0);
+ InputStream in = attachmentHandler.getContent(repository, task, attachments.get(0).getTaskAttribute(), null);
+ byte[] result = new byte[6];
+ try {
+ in.read(result);
+ } finally {
+ in.close();
+ }
+ assertEquals("Mylar\n", new String(result));
+ }
+
+ public void testUploadAttachmentXmlRpc010() throws Exception {
+ uploadAttachmentXmlRpc(TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public void testUploadAttachmentXmlRpc011() throws Exception {
+ uploadAttachmentXmlRpc(TracTestConstants.TEST_TRAC_011_URL);
+ }
+
+ private void uploadAttachmentXmlRpc(String url) throws Exception {
+ init(url, Version.XML_RPC);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ File file = File.createTempFile("attachment", null);
+ file.deleteOnExit();
+ OutputStream out = new FileOutputStream(file);
+ try {
+ out.write("Mylar".getBytes());
+ } finally {
+ out.close();
+ }
+ attachmentHandler.postContent(repository, task, new FileTaskAttachmentSource(file), "comment", null, null);
+
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ InputStream in = client.getAttachmentData(data.attachmentTicketId, file.getName(), null);
+ try {
+ byte[] result = new byte[5];
+ in.read(result);
+ assertEquals("Mylar", new String(result));
+ } finally {
+ in.close();
+ }
+ }
+
+ public void testCanUploadAttachmentXmlRpc() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ assertTrue(attachmentHandler.canPostContent(repository, task));
+ }
+
+ public void testCanUploadAttachmentWeb() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ assertFalse(attachmentHandler.canPostContent(repository, task));
+ }
+
+ public void testCanDownloadAttachmentXmlRpc() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ assertTrue(attachmentHandler.canGetContent(repository, task));
+ }
+
+ public void testCanDownloadAttachmentWeb() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ assertFalse(attachmentHandler.canGetContent(repository, task));
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracClientManagerTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracClientManagerTest.java
new file mode 100644
index 0000000..0b43685
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracClientManagerTest.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import java.io.File;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.trac.core.TracClientManager;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracMilestone;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracClientManagerTest extends TestCase {
+
+ public void testNullCache() throws Exception {
+ TaskRepository taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND,
+ TracTestConstants.TEST_TRAC_096_URL);
+ taskRepository.setVersion(Version.TRAC_0_9.name());
+
+ TracClientManager manager = new TracClientManager(null, new TaskRepositoryLocationFactory());
+ ITracClient client = manager.getTracClient(taskRepository);
+ assertNull(client.getMilestones());
+
+ manager.writeCache();
+ assertNull(client.getMilestones());
+ }
+
+ public void testReadCache() throws Exception {
+ TaskRepository taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND,
+ TracTestConstants.TEST_TRAC_096_URL);
+ taskRepository.setVersion(Version.TRAC_0_9.name());
+
+ File file = File.createTempFile("mylyn", null);
+ file.deleteOnExit();
+
+ TracClientManager manager = new TracClientManager(file, new TaskRepositoryLocationFactory());
+ ITracClient client = manager.getTracClient(taskRepository);
+ assertNull(client.getMilestones());
+ }
+
+ public void testWriteCache() throws Exception {
+ TaskRepository taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND,
+ TracTestConstants.TEST_TRAC_096_URL);
+ taskRepository.setVersion(Version.TRAC_0_9.name());
+ taskRepository.setCredentials(AuthenticationType.REPOSITORY, null, false);
+
+ File file = File.createTempFile("mylyn", null);
+ file.deleteOnExit();
+
+ TracClientManager manager = new TracClientManager(file, new TaskRepositoryLocationFactory());
+ ITracClient client = manager.getTracClient(taskRepository);
+ assertNull(client.getMilestones());
+
+ client.updateAttributes(new NullProgressMonitor(), false);
+ assertTrue(client.getMilestones().length > 0);
+ TracMilestone[] milestones = client.getMilestones();
+
+ manager.writeCache();
+ manager = new TracClientManager(file, new TaskRepositoryLocationFactory());
+ assertEquals(Arrays.asList(milestones), Arrays.asList(client.getMilestones()));
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracRepositoryConnectorTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracRepositoryConnectorTest.java
new file mode 100644
index 0000000..ce3b0bd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracRepositoryConnectorTest.java
@@ -0,0 +1,385 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.EditRepositoryWizard;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracPriority;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracVersion;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.internal.trac.ui.wizard.TracRepositorySettingsPage;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.trac.tests.support.TestFixture;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositoryConnectorTest extends TestCase {
+
+ private TestData data;
+
+ private TaskRepository repository;
+
+ private TracRepositoryConnector connector;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ data = TestFixture.init010();
+ connector = (TracRepositoryConnector) TasksUi.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
+ }
+
+ protected void init(String url, Version version) {
+ repository = TracTestUtil.init(url, version);
+ }
+
+ public void testGetRepositoryUrlFromTaskUrl() {
+ assertEquals("http://host/repo", connector.getRepositoryUrlFromTaskUrl("http://host/repo/ticket/1"));
+ assertEquals("http://host", connector.getRepositoryUrlFromTaskUrl("http://host/ticket/2342"));
+ assertEquals(null, connector.getRepositoryUrlFromTaskUrl("http://host/repo/2342"));
+ assertEquals(null, connector.getRepositoryUrlFromTaskUrl("http://host/repo/ticket-2342"));
+ }
+
+ public void testCreateTaskFromExistingKeyXmlRpc011() throws CoreException {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ createTaskFromExistingKey();
+ }
+
+ public void testCreateTaskFromExistingKeyXmlRpc010() throws CoreException {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ createTaskFromExistingKey();
+ }
+
+ public void testCreateTaskFromExistingKeyTracWeb011() throws CoreException {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ createTaskFromExistingKey();
+ }
+
+ public void testCreateTaskFromExistingKeyTracWeb010() throws CoreException {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ createTaskFromExistingKey();
+ }
+
+ public void testCreateTaskFromExistingKeyTracWeb096() throws CoreException {
+ init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+ createTaskFromExistingKey();
+ }
+
+ protected void createTaskFromExistingKey() throws CoreException {
+ String taskId = data.tickets.get(0).getId() + "";
+ TaskData taskData = connector.getTaskData(repository, taskId, null);
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
+ assertNotNull(task);
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertEquals(TaskTask.class, task.getClass());
+ assertTrue(task.getSummary().contains("summary1"));
+ assertEquals(repository.getRepositoryUrl() + ITracClient.TICKET_URL + taskId, task.getUrl());
+ }
+
+ public void testClientManagerChangeTaskRepositorySettings() throws MalformedURLException {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ assertEquals(Version.TRAC_0_9, client.getVersion());
+
+ EditRepositoryWizard wizard = new EditRepositoryWizard(repository);
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ WizardDialog dialog = new WizardDialog(shell, wizard);
+ try {
+ dialog.create();
+
+ ((TracRepositorySettingsPage) wizard.getSettingsPage()).setTracVersion(Version.XML_RPC);
+ assertTrue(wizard.performFinish());
+
+ client = connector.getClientManager().getTracClient(repository);
+ assertEquals(Version.XML_RPC, client.getVersion());
+ } finally {
+ dialog.close();
+ }
+ }
+
+ public void testPerformQueryXmlRpc011() {
+ performQuery(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ }
+
+ public void testPerformQueryXmlRpc010() {
+ performQuery(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ }
+
+ public void testPerformQueryWeb011() {
+ performQuery(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ }
+
+ public void testPerformQueryWeb010() {
+ performQuery(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ }
+
+ public void testPerformQueryWeb096() {
+ performQuery(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+ }
+
+ protected void performQuery(String url, Version version) {
+ init(url, version);
+
+ TracSearch search = new TracSearch();
+ search.addFilter("milestone", "milestone1");
+ search.addFilter("milestone", "milestone2");
+ search.setOrderBy("id");
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+ query.setUrl(url + ITracClient.QUERY_URL + search.toUrl());
+
+ final List<TaskData> result = new ArrayList<TaskData>();
+ TaskDataCollector hitCollector = new TaskDataCollector() {
+ @Override
+ public void accept(TaskData hit) {
+ result.add(hit);
+ }
+ };
+ IStatus queryStatus = connector.performQuery(repository, query, hitCollector, null, new NullProgressMonitor());
+ assertEquals(Status.OK_STATUS, queryStatus);
+ assertEquals(3, result.size());
+ assertEquals(data.tickets.get(0).getId() + "", result.get(0).getTaskId());
+ assertEquals(data.tickets.get(1).getId() + "", result.get(1).getTaskId());
+ assertEquals(data.tickets.get(2).getId() + "", result.get(2).getTaskId());
+ }
+
+ public void testUpdateAttributesWeb011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.TRAC_0_9);
+ updateAttributes();
+ }
+
+ public void testUpdateAttributesWeb010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ updateAttributes();
+ }
+
+ public void testUpdateAttributesWeb096() throws Exception {
+ init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+ updateAttributes();
+ }
+
+ public void testUpdateAttributesXmlRpc011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ updateAttributes();
+ }
+
+ public void testUpdateAttributesXmlRpc010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ updateAttributes();
+ }
+
+ protected void updateAttributes() throws Exception {
+ connector.updateRepositoryConfiguration(repository, new NullProgressMonitor());
+
+ ITracClient server = connector.getClientManager().getTracClient(repository);
+ TracVersion[] versions = server.getVersions();
+ assertEquals(2, versions.length);
+ Arrays.sort(versions, new Comparator<TracVersion>() {
+ public int compare(TracVersion o1, TracVersion o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+ });
+ assertEquals("1.0", versions[0].getName());
+ assertEquals("2.0", versions[1].getName());
+ }
+
+ public void testContextXmlRpc010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ String taskId = data.attachmentTicketId + "";
+ ITask task = TracTestUtil.createTask(repository, taskId);
+ File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ sourceContextFile.createNewFile();
+ sourceContextFile.deleteOnExit();
+
+ boolean result = AttachmentUtil.postContext(connector, repository, task, "", null, null);
+ assertTrue(result);
+
+ task = TracTestUtil.createTask(repository, taskId);
+ List<ITaskAttachment> attachments = TracTestUtil.getTaskAttachments(task);
+ // TODO attachment may have been overridden therefore size may not have changed
+ //assertEquals(size + 1, task.getTaskData().getAttachments().size());
+ ITaskAttachment attachment = attachments.get(attachments.size() - 1);
+ result = AttachmentUtil.downloadContext(task, attachment, PlatformUI.getWorkbench().getProgressService());
+ assertTrue(result);
+ assertTrue(task.isActive());
+ }
+
+ public void testContextWeb096() throws Exception {
+ init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+ String taskId = data.attachmentTicketId + "";
+ ITask task = TracTestUtil.createTask(repository, taskId);
+ File sourceContextFile = ContextCorePlugin.getContextStore().getFileForContext(task.getHandleIdentifier());
+ sourceContextFile.createNewFile();
+ sourceContextFile.deleteOnExit();
+
+ try {
+ AttachmentUtil.postContext(connector, repository, task, "", null, null);
+ fail("expected CoreException"); // operation should not be supported
+ } catch (CoreException e) {
+ }
+ }
+
+ public void testIsCompleted() {
+ assertTrue(TracRepositoryConnector.isCompleted("closed"));
+ assertFalse(TracRepositoryConnector.isCompleted("Closed"));
+ assertFalse(TracRepositoryConnector.isCompleted("new"));
+ assertFalse(TracRepositoryConnector.isCompleted("assigned"));
+ assertFalse(TracRepositoryConnector.isCompleted("reopened"));
+ assertFalse(TracRepositoryConnector.isCompleted("foobar"));
+ assertFalse(TracRepositoryConnector.isCompleted(""));
+ assertFalse(TracRepositoryConnector.isCompleted(null));
+ }
+
+ public void testGetTaskPriority() {
+ assertEquals("P1", TracRepositoryConnector.getTaskPriority("blocker").toString());
+ assertEquals("P2", TracRepositoryConnector.getTaskPriority("critical").toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority("major").toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority(null).toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority("").toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority("foo bar").toString());
+ assertEquals("P4", TracRepositoryConnector.getTaskPriority("minor").toString());
+ assertEquals("P5", TracRepositoryConnector.getTaskPriority("trivial").toString());
+ }
+
+ public void testGetTaskPriorityFromTracPriorities() {
+ TracPriority p1 = new TracPriority("a", 1);
+ TracPriority p2 = new TracPriority("b", 2);
+ TracPriority p3 = new TracPriority("c", 3);
+ TracPriority[] priorities = new TracPriority[] { p1, p2, p3 };
+ assertEquals("P1", TracRepositoryConnector.getTaskPriority("a", priorities).toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority("b", priorities).toString());
+ assertEquals("P5", TracRepositoryConnector.getTaskPriority("c", priorities).toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority("foo", priorities).toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority(null, priorities).toString());
+
+ p1 = new TracPriority("a", 10);
+ priorities = new TracPriority[] { p1 };
+ assertEquals("P1", TracRepositoryConnector.getTaskPriority("a", priorities).toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority("b", priorities).toString());
+ assertEquals("P3", TracRepositoryConnector.getTaskPriority(null, priorities).toString());
+
+ p1 = new TracPriority("1", 10);
+ p2 = new TracPriority("2", 20);
+ p3 = new TracPriority("3", 30);
+ TracPriority p4 = new TracPriority("4", 40);
+ TracPriority p5 = new TracPriority("5", 70);
+ TracPriority p6 = new TracPriority("6", 100);
+ priorities = new TracPriority[] { p1, p2, p3, p4, p5, p6 };
+ assertEquals("P1", TracRepositoryConnector.getTaskPriority("1", priorities).toString());
+ assertEquals("P1", TracRepositoryConnector.getTaskPriority("2", priorities).toString());
+ assertEquals("P2", TracRepositoryConnector.getTaskPriority("3", priorities).toString());
+ assertEquals("P2", TracRepositoryConnector.getTaskPriority("4", priorities).toString());
+ assertEquals("P4", TracRepositoryConnector.getTaskPriority("5", priorities).toString());
+ assertEquals("P5", TracRepositoryConnector.getTaskPriority("6", priorities).toString());
+ }
+
+ public void testUpdateTaskFromTaskData() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+
+ TracTicket ticket = new TracTicket(123);
+ ticket.putBuiltinValue(Key.DESCRIPTION, "mydescription");
+ ticket.putBuiltinValue(Key.PRIORITY, "mypriority");
+ ticket.putBuiltinValue(Key.SUMMARY, "mysummary");
+ ticket.putBuiltinValue(Key.TYPE, "mytype");
+
+ TracTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, null);
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
+
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "123", task.getUrl());
+ assertEquals("123", task.getTaskKey());
+ assertEquals("mysummary", task.getSummary());
+ assertEquals("P3", task.getPriority());
+ assertEquals("mytype", task.getTaskKind());
+ }
+
+ public void testUpdateTaskFromTaskDataSummaryOnly() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+
+ TracTicket ticket = new TracTicket(456);
+ ticket.putBuiltinValue(Key.SUMMARY, "mysummary");
+
+ TracTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, null);
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, taskData.getTaskId());
+
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertEquals(TracTestConstants.TEST_TRAC_010_URL + ITracClient.TICKET_URL + "456", task.getUrl());
+ assertEquals("456", task.getTaskKey());
+ assertEquals("mysummary", task.getSummary());
+ assertEquals("P3", task.getPriority());
+ assertEquals(AbstractTask.DEFAULT_TASK_KIND, task.getTaskKind());
+ }
+
+ public void testUpdateTaskFromTaskDataClosed() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.TRAC_0_9);
+ TracTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ ITracClient client = connector.getClientManager().getTracClient(repository);
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, "1");
+
+ TracTicket ticket = new TracTicket(123);
+ ticket.putBuiltinValue(Key.STATUS, "resolved");
+ TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, null);
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertEquals(null, task.getCompletionDate());
+
+ ticket.putBuiltinValue(Key.STATUS, "closed");
+ taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, null);
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertEquals(new Date(0), task.getCompletionDate());
+
+ ticket.putBuiltinValue(Key.STATUS, "closed");
+ ticket.putBuiltinValue(Key.CHANGE_TIME, "123");
+ taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, null);
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertEquals(new Date(123 * 1000), task.getCompletionDate());
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracRepositoryQueryTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracRepositoryQueryTest.java
new file mode 100644
index 0000000..e361711
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracRepositoryQueryTest.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.RefactorRepositoryUrlOperation;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositoryQueryTest extends TestCase {
+
+ public void testChangeRepositoryUrl() throws Exception {
+ TaskRepository repository = TracTestUtil.init(TracTestConstants.TEST_TRAC_096_URL, Version.XML_RPC);
+
+ TracSearch search = new TracSearch();
+ String queryUrl = repository.getRepositoryUrl() + ITracClient.QUERY_URL + search.toUrl();
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(repository);
+ query.setUrl(queryUrl);
+ TasksUiPlugin.getTaskList().addQuery((RepositoryQuery) query);
+
+ String taskId = "123";
+ ITask task = TasksUi.getRepositoryModel().createTask(repository, taskId);
+ task.setUrl(repository.getRepositoryUrl() + ITracClient.TICKET_URL + taskId);
+ TasksUiPlugin.getTaskList().addTask(task);
+
+ String oldUrl = repository.getRepositoryUrl();
+ String newUrl = TracTestConstants.TEST_TRAC_010_URL;
+ new RefactorRepositoryUrlOperation(oldUrl, newUrl).run(new NullProgressMonitor());
+ repository.setRepositoryUrl(newUrl);
+
+ assertEquals(newUrl, query.getRepositoryUrl());
+ assertEquals(newUrl + ITracClient.QUERY_URL + search.toUrl(), query.getUrl());
+ assertEquals(newUrl + ITracClient.TICKET_URL + taskId, task.getUrl());
+ }
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracTaskDataHandlerTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracTaskDataHandlerTest.java
new file mode 100644
index 0000000..c8daa35
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracTaskDataHandlerTest.java
@@ -0,0 +1,511 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.core.data.TextTaskAttachmentSource;
+import org.eclipse.mylyn.internal.tasks.core.sync.SynchronizationSession;
+import org.eclipse.mylyn.internal.trac.core.TracAttribute;
+import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.internal.trac.core.TracTaskDataHandler;
+import org.eclipse.mylyn.internal.trac.core.TracTaskMapper;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskOperation;
+import org.eclipse.mylyn.tasks.core.data.TaskRelation;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.trac.tests.support.TestFixture;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskDataHandlerTest extends TestCase {
+
+ private TracRepositoryConnector connector;
+
+ private TaskRepository repository;
+
+ private TestData data;
+
+ private TracTaskDataHandler taskDataHandler;
+
+ private ITracClient client;
+
+ public TracTaskDataHandlerTest() {
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ data = TestFixture.init010();
+ connector = (TracRepositoryConnector) TasksUi.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
+ taskDataHandler = connector.getTaskDataHandler();
+ }
+
+ protected void init(String url, Version version) {
+ repository = TracTestUtil.init(url, version);
+ client = connector.getClientManager().getTracClient(repository);
+ }
+
+ private SynchronizationSession createSession(ITask... tasks) {
+ SynchronizationSession session = new SynchronizationSession();
+ session.setNeedsPerformQueries(true);
+ session.setTaskRepository(repository);
+ session.setFullSynchronization(true);
+ session.setTasks(new HashSet<ITask>(Arrays.asList(tasks)));
+ return session;
+ }
+
+ public void testPreSynchronizationWeb096() throws Exception {
+ init(TracTestConstants.TEST_TRAC_096_URL, Version.TRAC_0_9);
+ ITask task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
+
+ Set<ITask> tasks = new HashSet<ITask>();
+ tasks.add(task);
+ SynchronizationSession session = createSession();
+ session.setTasks(tasks);
+
+ assertEquals(null, repository.getSynchronizationTimeStamp());
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(null, repository.getSynchronizationTimeStamp());
+ // bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
+ assertEquals(null, session.getStaleTasks());
+
+ int time = (int) (System.currentTimeMillis() / 1000) + 1;
+ repository.setSynchronizationTimeStamp(time + "");
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ // bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
+ assertEquals(null, session.getStaleTasks());
+ }
+
+ public void testMarkStaleTasksXmlRpc010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ markStaleTasks();
+ }
+
+ public void testMarkStaleTasksXmlRpc011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ markStaleTasks();
+ }
+
+ private void markStaleTasks() throws Exception {
+ SynchronizationSession session;
+ TracTicket ticket = TracTestUtil.createTicket(client, "markStaleTasks");
+ ITask task = TracTestUtil.createTask(repository, ticket.getId() + "");
+ long lastModified = TracUtil.toTracTime(task.getModificationDate());
+
+ // an empty set should not cause contact to the repository
+ repository.setSynchronizationTimeStamp(null);
+ session = createSession(task);
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertNull(repository.getSynchronizationTimeStamp());
+
+ repository.setSynchronizationTimeStamp(null);
+ session = createSession(task);
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(Collections.singleton(task), session.getStaleTasks());
+
+ // always returns the ticket because time comparison mode is >=
+ repository.setSynchronizationTimeStamp(lastModified + "");
+ session = createSession(task);
+ connector.preSynchronization(session, null);
+ // TODO this was fixed so it returns false now but only if the
+ // query returns a single task
+ assertFalse(session.needsPerformQueries());
+ // bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
+ assertEquals(null, session.getStaleTasks());
+
+ repository.setSynchronizationTimeStamp((lastModified + 1) + "");
+ session = createSession(task);
+ connector.preSynchronization(session, null);
+ assertFalse(session.needsPerformQueries());
+ // bug 238043: assertEquals(Collections.emptySet(), session.getStaleTasks());
+ assertEquals(null, session.getStaleTasks());
+
+ // change ticket making sure it gets a new change time
+ Thread.sleep(1000);
+ ticket.putBuiltinValue(Key.DESCRIPTION, lastModified + "");
+ client.updateTicket(ticket, "comment", null);
+
+ repository.setSynchronizationTimeStamp((lastModified + 1) + "");
+ session = createSession(task);
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(Collections.singleton(task), session.getStaleTasks());
+ }
+
+ public void testMarkStaleTasksNoTimeStampXmlRpc010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ markStaleTasksNoTimeStamp();
+ }
+
+ public void testMarkStaleTasksNoTimeStampXmlRpc011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ markStaleTasksNoTimeStamp();
+ }
+
+ private void markStaleTasksNoTimeStamp() throws Exception {
+ SynchronizationSession session;
+ ITask task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
+
+ session = createSession(task);
+ repository.setSynchronizationTimeStamp(null);
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(Collections.singleton(task), session.getStaleTasks());
+
+ session = createSession(task);
+ repository.setSynchronizationTimeStamp("");
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(Collections.singleton(task), session.getStaleTasks());
+
+ session = createSession(task);
+ repository.setSynchronizationTimeStamp("0");
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(Collections.singleton(task), session.getStaleTasks());
+
+ session = createSession(task);
+ repository.setSynchronizationTimeStamp("abc");
+ connector.preSynchronization(session, null);
+ assertTrue(session.needsPerformQueries());
+ assertEquals(Collections.singleton(task), session.getStaleTasks());
+ }
+
+ public void testNonNumericTaskId() {
+ try {
+ connector.getTaskData(repository, "abc", null);
+ fail("Expected CoreException");
+ } catch (CoreException e) {
+ }
+ }
+
+ public void testAttachmentChangesLastModifiedDate010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ attachmentChangesLastModifiedDate();
+ }
+
+ public void testAttachmentChangesLastModifiedDate011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ attachmentChangesLastModifiedDate();
+ }
+
+ private void attachmentChangesLastModifiedDate() throws Exception {
+ AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
+ ITask task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ Date lastModified = task.getModificationDate();
+ // XXX the test case fails when comment == null
+ attachmentHandler.postContent(repository, task, new TextTaskAttachmentSource("abc"), "comment", null, null);
+
+ task = TracTestUtil.createTask(repository, data.attachmentTicketId + "");
+ Date newLastModified = task.getModificationDate();
+ assertTrue("Expected " + newLastModified + " to be more recent than " + lastModified,
+ newLastModified.after(lastModified));
+ }
+
+ public void testAttachmentUrlEncoding010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ attachmentUrlEncoding();
+ }
+
+ public void testAttachmentUrlEncoding011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ attachmentUrlEncoding();
+ }
+
+ private void attachmentUrlEncoding() throws Exception {
+ AbstractTaskAttachmentHandler attachmentHandler = connector.getTaskAttachmentHandler();
+ TracTicket ticket = TracTestUtil.createTicket(client, "attachment url test");
+ ITask task = TracTestUtil.createTask(repository, ticket.getId() + "");
+ attachmentHandler.postContent(repository, task, new TextTaskAttachmentSource("abc") {
+ @Override
+ public String getName() {
+ return "https%3A%2F%2Fbugs.eclipse.org%2Fbugs.xml.zip";
+ }
+ }, "comment", null, null);
+
+ task = TracTestUtil.createTask(repository, ticket.getId() + "");
+ List<ITaskAttachment> attachments = TracTestUtil.getTaskAttachments(task);
+ assertEquals(1, attachments.size());
+ assertEquals(repository.getUrl() + "/attachment/ticket/" + ticket.getId()
+ + "/https%253A%252F%252Fbugs.eclipse.org%252Fbugs.xml.zip", attachments.get(0).getUrl());
+ }
+
+ public void testPostTaskDataInvalidCredentials010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ postTaskDataInvalidCredentials();
+ }
+
+ public void testPostTaskDataInvalidCredentials011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ postTaskDataInvalidCredentials();
+ }
+
+ private void postTaskDataInvalidCredentials() throws Exception {
+ ITask task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
+ TaskData taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW).setValue("new comment");
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("foo", "bar"), false);
+ try {
+ taskDataHandler.postTaskData(repository, taskData, null, null);
+ } catch (CoreException expected) {
+ assertEquals(RepositoryStatus.ERROR_REPOSITORY_LOGIN, expected.getStatus().getCode());
+ }
+ assertEquals("new comment", taskData.getRoot().getMappedAttribute(TaskAttribute.COMMENT_NEW).getValue());
+ }
+
+ public void testCanInitializeTaskData() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+
+ ITask task = new TaskTask(TracCorePlugin.CONNECTOR_KIND, "", "");
+ assertFalse(taskDataHandler.canInitializeSubTaskData(repository, task));
+ task.setAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS, Boolean.TRUE.toString());
+ assertTrue(taskDataHandler.canInitializeSubTaskData(repository, task));
+
+ task = TracTestUtil.createTask(repository, data.offlineHandlerTicketId + "");
+ TaskData taskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", null);
+ assertFalse(taskDataHandler.canInitializeSubTaskData(repository, task));
+
+ taskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertTrue(taskDataHandler.canInitializeSubTaskData(repository, task));
+
+ task.setAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS, Boolean.FALSE.toString());
+ connector.updateTaskFromTaskData(repository, task, taskData);
+ assertTrue(taskDataHandler.canInitializeSubTaskData(repository, task));
+ }
+
+ public void testInitializeSubTaskDataInvalidParent() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TaskData parentTaskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "",
+ new NullProgressMonitor());
+ try {
+ taskDataHandler.initializeSubTaskData(repository, parentTaskData, parentTaskData, null);
+ fail("expected CoreException");
+ } catch (CoreException expected) {
+ }
+ }
+
+ public void testInitializeSubTaskData() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TaskData parentTaskData = taskDataHandler.getTaskData(repository, data.offlineHandlerTicketId + "", null);
+ TaskMapper parentTaskMapper = new TracTaskMapper(parentTaskData, null);
+ parentTaskMapper.setSummary("abc");
+ parentTaskMapper.setDescription("def");
+ String component = parentTaskData.getRoot()
+ .getMappedAttribute(TracAttribute.COMPONENT.getTracKey())
+ .getOptions()
+ .get(0);
+ parentTaskMapper.setComponent(component);
+ parentTaskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
+ TaskData subTaskData = new TaskData(parentTaskData.getAttributeMapper(), TracCorePlugin.CONNECTOR_KIND, "", "");
+ subTaskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKING);
+ taskDataHandler.initializeSubTaskData(repository, subTaskData, parentTaskData, new NullProgressMonitor());
+ TaskMapper subTaskMapper = new TracTaskMapper(subTaskData, null);
+ assertEquals("", subTaskMapper.getSummary());
+ assertEquals("", subTaskMapper.getDescription());
+ assertEquals(component, subTaskMapper.getComponent());
+ TaskAttribute attribute = subTaskData.getRoot().getMappedAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKING);
+ assertEquals(parentTaskData.getTaskId(), attribute.getValue());
+ attribute = parentTaskData.getRoot().getMappedAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
+ assertEquals("", attribute.getValue());
+ }
+
+ public void testGetSubTaskIds() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ TaskData taskData = new TaskData(new TracAttributeMapper(new TaskRepository("", ""), client),
+ TracCorePlugin.CONNECTOR_KIND, "", "");
+ TaskAttribute blockedBy = taskData.getRoot().createAttribute(TracTaskDataHandler.ATTRIBUTE_BLOCKED_BY);
+ Collection<String> subTaskIds;
+
+ blockedBy.setValue("123 456");
+ subTaskIds = getSubTaskIds(taskData);
+ assertEquals(2, subTaskIds.size());
+ assertTrue(subTaskIds.contains("123"));
+ assertTrue(subTaskIds.contains("456"));
+
+ blockedBy.setValue("7,8");
+ subTaskIds = getSubTaskIds(taskData);
+ assertEquals(2, subTaskIds.size());
+ assertTrue(subTaskIds.contains("7"));
+ assertTrue(subTaskIds.contains("8"));
+
+ blockedBy.setValue(" 7 , 8, ");
+ subTaskIds = getSubTaskIds(taskData);
+ assertEquals(2, subTaskIds.size());
+ assertTrue(subTaskIds.contains("7"));
+ assertTrue(subTaskIds.contains("8"));
+
+ blockedBy.setValue("7");
+ subTaskIds = getSubTaskIds(taskData);
+ assertEquals(1, subTaskIds.size());
+ assertTrue(subTaskIds.contains("7"));
+
+ blockedBy.setValue("");
+ subTaskIds = getSubTaskIds(taskData);
+ assertEquals(0, subTaskIds.size());
+
+ blockedBy.setValue(" ");
+ subTaskIds = getSubTaskIds(taskData);
+ assertEquals(0, subTaskIds.size());
+ }
+
+ private Collection<String> getSubTaskIds(TaskData taskData) {
+ List<String> subTaskIds = new ArrayList<String>();
+ Collection<TaskRelation> relations = connector.getTaskRelations(taskData);
+ for (TaskRelation taskRelation : relations) {
+ subTaskIds.add(taskRelation.getTaskId());
+ }
+ return subTaskIds;
+ }
+
+ public void testInitializeTaskData_0_10() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ initializeTaskData();
+ }
+
+ public void testInitializeTaskData_0_11() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ initializeTaskData();
+ }
+
+ private void initializeTaskData() throws Exception {
+ TaskData taskData = new TaskData(taskDataHandler.getAttributeMapper(repository), TracCorePlugin.CONNECTOR_KIND,
+ "", "");
+ TaskMapping mapping = new TaskMapping() {
+ @Override
+ public String getDescription() {
+ return "description";
+ }
+
+ @Override
+ public String getSummary() {
+ return "summary";
+ }
+ };
+ taskDataHandler.initializeTaskData(repository, taskData, mapping, new NullProgressMonitor());
+ // initializeTaskData() should ignore the initialization data
+ TaskMapper mapper = new TracTaskMapper(taskData, null);
+ assertEquals("", mapper.getSummary());
+ assertEquals("", mapper.getDescription());
+ // check for default values
+ assertEquals("Defect", mapper.getTaskKind());
+ assertEquals("major", mapper.getPriority());
+ // empty attributes should not exist
+ assertNull(taskData.getRoot().getAttribute(TracAttribute.SEVERITY.getTracKey()));
+ }
+
+ public void testOperations_XmlRpc_0_10() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ operations(false);
+ }
+
+ public void testOperations_XmlRpc_0_11() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ operations(true);
+ }
+
+ protected void operations(boolean hasReassign) throws Exception {
+ TaskData taskData = taskDataHandler.getTaskData(repository, "1", new NullProgressMonitor());
+ List<TaskAttribute> operations = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_OPERATION);
+ assertEquals((hasReassign ? 5 : 4), operations.size());
+
+ TaskOperation operation = taskData.getAttributeMapper().getTaskOperation(operations.get(0));
+ assertEquals(TaskAttribute.OPERATION, operation.getTaskAttribute().getId());
+
+ operation = taskData.getAttributeMapper().getTaskOperation(operations.get(1));
+ assertEquals("leave", operation.getOperationId());
+ assertNotNull(operation.getLabel());
+
+ operation = taskData.getAttributeMapper().getTaskOperation(operations.get(2));
+ assertEquals("resolve", operation.getOperationId());
+ assertNotNull(operation.getLabel());
+ String associatedId = operation.getTaskAttribute().getMetaData().getValue(
+ TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID);
+ assertNotNull(associatedId);
+
+ if (hasReassign) {
+ operation = taskData.getAttributeMapper().getTaskOperation(operations.get(3));
+ assertEquals("reassign", operation.getOperationId());
+ assertNotNull(operation.getLabel());
+
+ operation = taskData.getAttributeMapper().getTaskOperation(operations.get(4));
+ assertEquals("accept", operation.getOperationId());
+ assertNotNull(operation.getLabel());
+ } else {
+ operation = taskData.getAttributeMapper().getTaskOperation(operations.get(3));
+ assertEquals("accept", operation.getOperationId());
+ assertNotNull(operation.getLabel());
+ }
+ }
+
+ public void testPostTaskDataUnsetResolutionXmlRpc010() throws Exception {
+ init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+ postTaskDataUnsetResolution();
+ }
+
+ public void testPostTaskDataUnsetResolutionXmlRpc011() throws Exception {
+ init(TracTestConstants.TEST_TRAC_011_URL, Version.XML_RPC);
+ postTaskDataUnsetResolution();
+ }
+
+ private void postTaskDataUnsetResolution() throws Exception {
+ TracTicket ticket = TracTestUtil.createTicket(client, "postTaskDataUnsetResolution");
+ TaskData taskData = taskDataHandler.getTaskData(repository, ticket.getId() + "", new NullProgressMonitor());
+ TaskAttribute attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ attribute.setValue("fixed");
+ taskDataHandler.postTaskData(repository, taskData, null, new NullProgressMonitor());
+
+ // should not set resolution unless resolve operation is selected
+ taskData = taskDataHandler.getTaskData(repository, ticket.getId() + "", new NullProgressMonitor());
+ attribute = taskData.getRoot().getMappedAttribute(TaskAttribute.RESOLUTION);
+ assertEquals("", attribute.getValue());
+ }
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracUtilTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracUtilTest.java
new file mode 100644
index 0000000..b00729a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/core/TracUtilTest.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.core;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracUtilTest extends TestCase {
+
+ private TaskRepository taskRepository;
+
+ @Override
+ protected void setUp() throws Exception {
+ taskRepository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, TracTestConstants.TEST_TRAC_010_URL);
+ }
+
+ public void testToTracSearch() {
+ String queryParameter = "&order=priority&status=new&status=assigned&status=reopened&milestone=M1&owner=%7E%C3%A4%C3%B6%C3%BC";
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(taskRepository);
+ query.setUrl(taskRepository.getRepositoryUrl() + ITracClient.QUERY_URL + queryParameter);
+
+ TracSearch search = TracUtil.toTracSearch(query);
+ assertNotNull(search);
+ assertEquals(queryParameter, search.toUrl());
+ }
+
+ public void testToTracSearchFilterList() {
+ String parameterUrl = "&status=new&status=assigned&status=reopened&milestone=0.1";
+ String queryUrl = taskRepository.getRepositoryUrl() + ITracClient.QUERY_URL + parameterUrl;
+ IRepositoryQuery query = TasksUi.getRepositoryModel().createRepositoryQuery(taskRepository);
+ query.setUrl(queryUrl);
+
+ TracSearch filterList = TracUtil.toTracSearch(query);
+ assertEquals(parameterUrl, filterList.toUrl());
+ assertEquals("&status=new|assigned|reopened&milestone=0.1", filterList.toQuery());
+
+ List<TracSearchFilter> list = filterList.getFilters();
+ TracSearchFilter filter = list.get(0);
+ assertEquals("status", filter.getFieldName());
+ assertEquals(Arrays.asList("new", "assigned", "reopened"), filter.getValues());
+ filter = list.get(1);
+ assertEquals("milestone", filter.getFieldName());
+ assertEquals(Arrays.asList("0.1"), filter.getValues());
+ }
+
+ public void testEncodeUrl() {
+ assertEquals("encode", TracUtil.encodeUrl("encode"));
+ assertEquals("sp%20ace%20", TracUtil.encodeUrl("sp ace "));
+ assertEquals("%2B%2B", TracUtil.encodeUrl("++"));
+ assertEquals("%2520", TracUtil.encodeUrl("%20"));
+ assertEquals("%2Fslash", TracUtil.encodeUrl("/slash"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java
new file mode 100644
index 0000000..88dcdb4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestFixture.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.support;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+
+/**
+ * Initializes Trac repositories to a defined state. This is done once per test run, since cleaning and initializing the
+ * repository for each test method would take too long.
+ *
+ * @author Steffen Pingel
+ */
+public class TestFixture {
+
+ public static XmlRpcServer.TestData data010;
+
+ /**
+ * Adds the existing repository content to the test data of <code>server</code>.
+ */
+ private static void initializeTestData(XmlRpcServer server) throws Exception {
+ server.ticketMilestone("milestone1").itemCreated();
+ server.ticketMilestone("milestone2").itemCreated();
+ server.ticketMilestone("milestone3").itemCreated();
+ server.ticketMilestone("milestone4").itemCreated();
+ server.ticketMilestone("mile&stone").itemCreated();
+
+ server.ticketVersion("1.0").itemCreated();
+ server.ticketVersion("2.0").itemCreated();
+
+ server.ticket(1).itemCreated();
+ server.ticket(2).itemCreated();
+ server.ticket(3).itemCreated();
+ server.ticket(4).itemCreated();
+ server.ticket(5).itemCreated();
+ server.ticket(6).itemCreated();
+ server.ticket(7).itemCreated();
+ server.ticket(8).itemCreated();
+ }
+
+// private static void initializeRepository(XmlRpcServer server) throws Exception {
+// server.ticketVersion(null).deleteAll();
+// server.ticketVersion("1.0").create(0, "");
+// server.ticketVersion("2.0").create(0, "");
+//
+// server.ticketMilestone(null).deleteAll();
+// server.ticketMilestone("milestone1").create();
+// server.ticketMilestone("milestone2").create();
+// server.ticketMilestone("milestone3").create();
+// server.ticketMilestone("milestone4").create();
+//
+// server.ticket().deleteAll();
+// Ticket ticket = server.ticket().create("summary1", "description1");
+// ticket.update("comment", "milestone", "milestone1");
+// ticket = server.ticket().create("summary2", "description2");
+// ticket.update("comment", "milestone", "milestone2");
+// ticket = server.ticket().create("summary3", "description3");
+// ticket.update("comment", "milestone", "milestone2");
+// ticket = server.ticket().create("summary4", "description4");
+//
+// ticket = server.ticket().create("test html entities: ���", "���\n\nmulti\nline\n\n'''bold'''\n");
+// ticket = server.ticket().create("offline handler test", "");
+// }
+
+ public static XmlRpcServer.TestData init010() throws Exception {
+ if (data010 == null) {
+ Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER);
+ XmlRpcServer server = new XmlRpcServer(TracTestConstants.TEST_TRAC_010_URL, credentials.username,
+ credentials.password);
+
+ initializeTestData(server);
+ data010 = server.getData();
+ }
+ return data010;
+ }
+
+ public static void cleanup010() throws Exception {
+ if (data010 != null) {
+ // data010.cleanup();
+ data010 = null;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestProxy.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestProxy.java
new file mode 100644
index 0000000..e3e3d23
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TestProxy.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.support;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+public class TestProxy implements Runnable {
+
+ public static final String NOT_FOUND = "HTTP/1.1 404 Not Found";
+
+ private int listenPort;
+
+ private Message request;
+
+ private Message response;
+
+ private Thread runner;
+
+ private IOException exception;
+
+ private volatile boolean stopped = false;
+
+ public TestProxy(int listenPort) {
+ this.listenPort = listenPort;
+ }
+
+ public TestProxy() {
+ }
+
+ public synchronized int getListenPort() throws InterruptedException {
+ while (listenPort == 0) {
+ wait();
+ }
+ return listenPort;
+ }
+
+ public void start() {
+ runner = new Thread(this, "TestProxy :" + listenPort);
+ runner.start();
+ }
+
+ public int startAndWait() throws InterruptedException {
+ start();
+ int port = getListenPort();
+ // wait for socket to enter accept call
+ Thread.sleep(100);
+ return port;
+ }
+
+ public void run() {
+ ServerSocket serverSocket = null;
+ try {
+ serverSocket = new ServerSocket(listenPort);
+ synchronized (this) {
+ listenPort = serverSocket.getLocalPort();
+ notifyAll();
+ }
+ while (!stopped) {
+ Socket socket = serverSocket.accept();
+ try {
+ Message request = readMessage(socket.getInputStream());
+ setRequest(request);
+
+ Message response = waitForResponse();
+ writeMessage(response, socket.getOutputStream());
+ } finally {
+ try {
+ socket.close();
+ } catch (IOException e1) {
+ }
+ }
+ }
+ } catch (InterruptedIOException e) {
+ } catch (IOException e) {
+ setException(e);
+ } catch (InterruptedException e) {
+ } finally {
+ if (serverSocket != null) {
+ try {
+ serverSocket.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ }
+
+ private void writeMessage(Message message, OutputStream out) throws IOException {
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
+ writer.write(message.toString());
+ }
+
+ private synchronized void setException(IOException exception) {
+ this.exception = exception;
+ notifyAll();
+ }
+
+ public synchronized void checkForException() throws IOException {
+ if (exception != null) {
+ throw exception;
+ }
+ }
+
+ private Message readMessage(InputStream in) throws IOException {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in));
+ Message message = null;
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (line.length() == 0) {
+ if (message == null) {
+ throw new IOException("Incomplete message");
+ }
+ return message;
+ }
+
+ if (message == null) {
+ message = new Message(line);
+ } else {
+ StringTokenizer t = new StringTokenizer(line, ":");
+ message.headers.put(t.nextToken(), t.nextToken().trim());
+ }
+ }
+ throw new EOFException();
+ }
+
+ public void stop() {
+ stopped = true;
+ runner.interrupt();
+ try {
+ runner.join(500);
+ } catch (InterruptedException e) {
+ }
+ }
+
+ public Message getRequest() {
+ return request;
+ }
+
+ public synchronized Message waitForRequest() throws InterruptedException {
+ while (request == null) {
+ wait();
+ }
+ return request;
+ }
+
+ public synchronized Message waitForResponse() throws InterruptedException {
+ while (response == null) {
+ wait();
+ }
+ return response;
+ }
+
+ public synchronized void setResponse(Message response) {
+ this.response = response;
+ notifyAll();
+ }
+
+ public synchronized void setResponse(String response) {
+ this.response = new Message(response);
+ notifyAll();
+ }
+
+ public synchronized void setRequest(Message request) {
+ this.request = request;
+ notifyAll();
+ }
+
+ public static class Message {
+
+ public Message(String request) {
+ this.request = request;
+ }
+
+ public String request;
+
+ public Map<String, String> headers = new HashMap<String, String>();
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(request);
+ sb.append("\n");
+ if (headers != null) {
+ for (String key : headers.keySet()) {
+ sb.append(key + ": " + headers.get(key));
+ sb.append("\n");
+ }
+ }
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ public String getMethod() {
+ int i = request.indexOf(" ");
+ return (i != -1) ? request.substring(0, i) : request;
+ }
+
+ }
+
+ public static void main(String[] args) {
+ TestProxy proxy = new TestProxy(8080);
+ proxy.start();
+ try {
+ proxy.setResponse(new Message("404 / HTTP 1.1"));
+ try {
+ System.out.println(proxy.waitForRequest());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } finally {
+ proxy.stop();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestCleanupUtil.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestCleanupUtil.java
new file mode 100644
index 0000000..2322fa0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestCleanupUtil.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.support;
+
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracAttachment;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.trac.tests.client.AbstractTracClientTest;
+import org.eclipse.mylyn.trac.tests.support.XmlRpcServer.TestData;
+
+/**
+ * Utility that cleans up artifacts created by the Trac test suite. This class should be run periodically to speed up
+ * execution of (attachment) tests.
+ *
+ * @author Steffen Pingel
+ */
+public class TracTestCleanupUtil extends AbstractTracClientTest {
+
+ private TestData data;
+
+ public TracTestCleanupUtil() {
+ super(Version.XML_RPC, PrivilegeLevel.ADMIN);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ data = TestFixture.init010();
+ }
+
+ public void testCleanup010() throws Exception {
+ connect010();
+ cleanup();
+ }
+
+ public void testCleanup011() throws Exception {
+ connect011();
+ cleanup();
+ }
+
+ private void cleanup() throws TracException {
+ TracTicket ticket = client.getTicket(data.attachmentTicketId, null);
+ TracAttachment[] attachments = ticket.getAttachments();
+ // skips the first attachment
+ for (int i = 1; i < attachments.length; i++) {
+ client.deleteAttachment(data.attachmentTicketId, attachments[i].getFilename(), null);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestConstants.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestConstants.java
new file mode 100644
index 0000000..5df0e5b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestConstants.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.support;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTestConstants {
+
+ public static final String SERVER = System.getProperty("mylyn.trac.server", "mylyn.eclipse.org");
+
+ public static final String TEST_TRAC_096_URL = "http://" + SERVER + "/trac096";
+
+ public static final String TEST_TRAC_010_URL = "http://" + SERVER + "/trac010";
+
+ public static final String TEST_TRAC_010_SSL_URL = "https://" + SERVER + "/trac010";
+
+ public static final String TEST_TRAC_010_DIGEST_AUTH_URL = "http://" + SERVER + "/trac010digest";
+
+ public static final String TEST_TRAC_010_FORM_AUTH_URL = "http://" + SERVER + "/trac010formauth";
+
+ public static final String TEST_TRAC_011_URL = "http://" + SERVER + "/trac011";
+
+ public static final String TEST_TRAC_INVALID_URL = "http://" + SERVER + "/doesnotexist";
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestUtil.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestUtil.java
new file mode 100644
index 0000000..57532b1
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/TracTestUtil.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.support;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.context.tests.support.TestUtil;
+import org.eclipse.mylyn.context.tests.support.TestUtil.Credentials;
+import org.eclipse.mylyn.context.tests.support.TestUtil.PrivilegeLevel;
+import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket;
+import org.eclipse.mylyn.internal.trac.core.model.TracTicket.Key;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTestUtil {
+
+ public static TracTicket createTicket(ITracClient client, String summary) throws Exception {
+ TracTicket ticket = new TracTicket();
+ ticket.putBuiltinValue(Key.SUMMARY, summary);
+ ticket.putBuiltinValue(Key.DESCRIPTION, "");
+ int id = client.createTicket(ticket, null);
+ return client.getTicket(id, null);
+ }
+
+ public static ITask createTask(TaskRepository taskRepository, String taskId) throws Exception {
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
+ TaskData taskData = connector.getTaskData(taskRepository, taskId, null);
+ ITask task = TasksUi.getRepositoryModel().createTask(taskRepository, taskData.getTaskId());
+ TasksUiPlugin.getTaskDataManager().putUpdatedTaskData(task, taskData, true);
+ return task;
+ }
+
+ public static TaskRepository init(String repositoryUrl, Version version) {
+ TracCorePlugin.getDefault().getConnector().getClientManager().writeCache();
+ TaskRepositoryManager manager = TasksUiPlugin.getRepositoryManager();
+ manager.clearRepositories(TasksUiPlugin.getDefault().getRepositoriesFilePath());
+
+ Credentials credentials = TestUtil.readCredentials(PrivilegeLevel.USER);
+ TaskRepository repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, repositoryUrl);
+ repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials(credentials.username,
+ credentials.password), false);
+ repository.setTimeZoneId(ITracClient.TIME_ZONE);
+ repository.setCharacterEncoding(ITracClient.CHARSET);
+ repository.setVersion(version.name());
+
+ manager.addRepository(repository);
+ TracCorePlugin.getDefault().getConnector().getClientManager().readCache();
+
+ return repository;
+ }
+
+ public static List<ITaskAttachment> getTaskAttachments(ITask task) throws CoreException {
+ TaskData taskData = TasksUi.getTaskDataManager().getTaskData(task);
+ List<ITaskAttachment> attachments = new ArrayList<ITaskAttachment>();
+ List<TaskAttribute> attributes = taskData.getAttributeMapper().getAttributesByType(taskData,
+ TaskAttribute.TYPE_ATTACHMENT);
+ if (attributes != null) {
+ for (TaskAttribute taskAttribute : attributes) {
+ ITaskAttachment taskAttachment = TasksUiPlugin.getRepositoryModel().createTaskAttachment(taskAttribute);
+ taskData.getAttributeMapper().updateTaskAttachment(taskAttachment, taskAttribute);
+ attachments.add(taskAttachment);
+ }
+ }
+ return attachments;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java
new file mode 100644
index 0000000..8acb558
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/support/XmlRpcServer.java
@@ -0,0 +1,367 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.support;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.internal.trac.core.client.TracXmlRpcClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+
+/**
+ * @author Steffen Pingel
+ */
+public class XmlRpcServer {
+
+ public abstract class AbstractTracItem {
+
+ public abstract void delete() throws Exception;
+
+ void itemCreated() {
+ data.items.add(this);
+ }
+
+ void itemDeleted() {
+ data.items.remove(this);
+ }
+
+ }
+
+ /**
+ * Represents a Trac type with multiple attributes such as a milestone.
+ */
+ public class ModelEnum extends AbstractTracItem {
+
+ private final String[] attributes;
+
+ private final String id;
+
+ private final String module;
+
+ public ModelEnum(String module, String id, String... attributes) {
+ this.module = module;
+ this.id = id;
+ this.attributes = attributes;
+ }
+
+ public ModelEnum create(Object... params) throws Exception {
+ call(module + ".create", id, toMap(params));
+ itemCreated();
+ return this;
+ }
+
+ @Override
+ public void delete() throws Exception {
+ call(module + ".delete", id);
+ itemDeleted();
+ }
+
+ public void deleteAll() throws Exception {
+ String[] ids = getAll();
+ for (String id : ids) {
+ call(module + ".delete", id);
+ }
+ }
+
+ public ModelEnum deleteAndCreate(Object... params) throws Exception {
+ if (Arrays.asList(getAll()).contains(id)) {
+ delete();
+ }
+
+ return create(params);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object[] get() throws Exception {
+ Hashtable values = (Hashtable) call(module + ".get", id);
+ Object[] result = new Object[values.size()];
+ for (int i = 0; i < result.length && i < attributes.length; i++) {
+ result[i] = values.get(attributes[i]);
+ }
+ return result;
+ }
+
+ public String[] getAll() throws Exception {
+ return Arrays.asList((Object[]) call(module + ".getAll")).toArray(new String[0]);
+ }
+
+ private Hashtable<String, Object> toMap(Object... params) {
+ Hashtable<String, Object> attrs = new Hashtable<String, Object>();
+ for (int i = 0; i < attributes.length && i < params.length; i++) {
+ attrs.put(attributes[i], params[i]);
+ }
+ return attrs;
+ }
+
+ public ModelEnum update(Object... params) throws Exception {
+ call(module + ".update", id, toMap(params));
+ return this;
+ }
+
+ }
+
+ /**
+ * Records changes to the repository.
+ */
+ public class TestData {
+
+ // all created items
+ List<AbstractTracItem> items = new ArrayList<AbstractTracItem>();
+
+ // all created tickets
+ public List<Ticket> tickets = new ArrayList<Ticket>();
+
+ public int attachmentTicketId = 5;
+
+ public int htmlEntitiesTicketId = 6;
+
+ public int offlineHandlerTicketId = 7;
+
+ /**
+ * Undo all changes.
+ */
+ public void cleanup() throws Exception {
+ while (!items.isEmpty()) {
+ items.get(0).delete();
+ }
+ }
+
+ }
+
+ /**
+ * Represents a Trac ticket.
+ */
+ public class Ticket extends AbstractTracItem {
+
+ private Integer id;
+
+ public Ticket(Integer id) {
+ this.id = id;
+ }
+
+ public Ticket create(String summary, String description) throws Exception {
+ this.id = (Integer) call("ticket.create", summary, description, new Hashtable<String, Object>());
+ if (id == null) {
+ throw new RuntimeException("Could not create ticket: " + summary);
+ }
+ itemCreated();
+ return this;
+ }
+
+ @Override
+ public void delete() throws Exception {
+ call("ticket.delete", id);
+ itemDeleted();
+ }
+
+ public void deleteAll() throws Exception {
+ Integer[] ids = getAll();
+ for (Integer id : ids) {
+ call("ticket.delete", id);
+ }
+ }
+
+ public Object getValue(String key) throws Exception {
+ return getValues().get(key);
+ }
+
+ public Map<?, ?> getValues() throws Exception {
+ return (Map<?, ?>) ((Object[]) call("ticket.get", id))[3];
+ }
+
+ public Integer[] getAll() throws Exception {
+ return Arrays.asList((Object[]) call("ticket.query", "order=id")).toArray(new Integer[0]);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ @Override
+ protected void itemCreated() {
+ super.itemCreated();
+ data.tickets.add(this);
+ }
+
+ @Override
+ protected void itemDeleted() {
+ super.itemDeleted();
+ data.tickets.remove(this);
+ }
+
+ public Ticket update(String comment, String key, String value) throws Exception {
+ Hashtable<String, Object> attrs = new Hashtable<String, Object>();
+ attrs.put(key, value);
+ call("ticket.update", id, comment, attrs);
+ return this;
+ }
+
+ }
+
+ /**
+ * Represents a Trac type that has a single attribute such as a priority.
+ */
+ public class TicketEnum extends AbstractTracItem {
+
+ private final String id;
+
+ private final String module;
+
+ public TicketEnum(String module, String id) {
+ this.module = module;
+ this.id = id;
+ }
+
+ public TicketEnum create(String param) throws Exception {
+ call(module + ".create", id, param);
+ itemCreated();
+ return this;
+ }
+
+ @Override
+ public void delete() throws Exception {
+ call(module + ".delete", id);
+ itemDeleted();
+ }
+
+ public void deleteAll() throws Exception {
+ String[] ids = getAll();
+ for (String id : ids) {
+ call(module + ".delete", id);
+ }
+ }
+
+ public TicketEnum deleteAndCreate(String param) throws Exception {
+ if (Arrays.asList(getAll()).contains(id)) {
+ delete();
+ }
+
+ return create(param);
+ }
+
+ public String get() throws Exception {
+ return (String) call(module + ".get", id);
+ }
+
+ public String[] getAll() throws Exception {
+ return Arrays.asList((Object[]) call(module + ".getAll")).toArray(new String[0]);
+ }
+
+ public TicketEnum update(String param) throws Exception {
+ call(module + ".update", id, param);
+ return this;
+ }
+
+ }
+
+ private final XmlRpcClient client;
+
+ private final TestData data;
+
+ private final String password;
+
+ private final TracXmlRpcClient repository;
+
+ private final String url;
+
+ private final String username;
+
+ public XmlRpcServer(String url, String username, String password) throws Exception {
+ this.url = url;
+ this.username = username;
+ this.password = password;
+
+ this.data = new TestData();
+
+ this.repository = new TracXmlRpcClient(new WebLocation(url, username, password), Version.XML_RPC);
+ this.client = repository.getClient();
+ }
+
+ private Object call(String method, Object... parameters) throws XmlRpcException, IOException {
+ Vector<Object> params = new Vector<Object>(parameters.length);
+ for (Object parameter : parameters) {
+ params.add(parameter);
+ }
+
+ Object result = client.execute(method, params);
+ if (result instanceof XmlRpcException) {
+ throw (XmlRpcException) result;
+ }
+ return result;
+ }
+
+ public TestData getData() {
+ return data;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public TracXmlRpcClient getRepository() throws MalformedURLException {
+ return repository;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public Ticket ticket() throws Exception {
+ return new Ticket(null);
+ }
+
+ public Ticket ticket(int id) throws Exception {
+ return new Ticket(id);
+ }
+
+ public ModelEnum ticketComponent(String id) throws Exception {
+ return new ModelEnum("ticket.component", id, "owner", "description");
+ }
+
+ public ModelEnum ticketMilestone(String id) throws Exception {
+ return new ModelEnum("ticket.milestone", id, "due", "completed", "description");
+ }
+
+ public TicketEnum ticketPriority(String id) throws Exception {
+ return new TicketEnum("ticket.priority", id);
+ }
+
+ public TicketEnum ticketSeverity(String id) throws Exception {
+ return new TicketEnum("ticket.severity", id);
+ }
+
+ public TicketEnum ticketStatus(String id) throws Exception {
+ return new TicketEnum("ticket.status", id);
+ }
+
+ public TicketEnum ticketType(String id) throws Exception {
+ return new TicketEnum("ticket.type", id);
+ }
+
+ public ModelEnum ticketVersion(String id) throws Exception {
+ return new ModelEnum("ticket.version", id, "time", "description");
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracHyperlinkUtilTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracHyperlinkUtilTest.java
new file mode 100644
index 0000000..39fe79a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracHyperlinkUtilTest.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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
+ * David Green - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.trac.tests.ui;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.ui.TracHyperlinkUtil;
+import org.eclipse.mylyn.internal.trac.ui.WebHyperlink;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+
+/**
+ * @author Steffen Pingel
+ * @author David Green
+ * @see http://trac.edgewall.org/wiki/TracLinks
+ */
+public class TracHyperlinkUtilTest extends TestCase {
+
+ private TaskRepository repository;
+
+ @Override
+ protected void setUp() throws Exception {
+ repository = new TaskRepository(TracCorePlugin.CONNECTOR_KIND, "http://localhost");
+ }
+
+ public void testFindHyperlinksComment() {
+ IHyperlink[] links = findTracHyperlinks(repository, "comment:ticket:12:34", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 20), links[0].getHyperlinkRegion());
+ assertEquals("12", ((TaskHyperlink) links[0]).getTaskId());
+ }
+
+ public void testFindHyperlinksTicket() {
+ IHyperlink[] links = TracHyperlinkUtil.findTicketHyperlinks(repository, "#11", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 3), links[0].getHyperlinkRegion());
+ assertEquals("11", ((TaskHyperlink) links[0]).getTaskId());
+
+ links = TracHyperlinkUtil.findTicketHyperlinks(repository, "#11, #234", 6, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("234", ((TaskHyperlink) links[0]).getTaskId());
+
+ links = TracHyperlinkUtil.findTicketHyperlinks(repository, " ticket:123 ", 2, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(new Region(2, 10), links[0].getHyperlinkRegion());
+ assertEquals("123", ((TaskHyperlink) links[0]).getTaskId());
+ }
+
+ public void testFindHyperlinksNoTicket() {
+ IHyperlink[] links = findTracHyperlinks(repository, "#11", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "#11, #234", 6, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, " ticket:123 ", 2, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "#123 report:123", -1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/report/123", ((WebHyperlink) links[0]).getURLString());
+ }
+
+ public void testFindHyperlinksReport() {
+ IHyperlink[] links = findTracHyperlinks(repository, "report:123", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 10), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/report/123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "{123}", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 5), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/report/123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "{{123}}", -1, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(1, 5), links[0].getHyperlinkRegion());
+
+ links = findTracHyperlinks(repository, "{abc}", -1, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "{{abc}}", -1, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "{{{123}}}", -1, 0);
+ assertNull(links);
+ }
+
+ public void testFindHyperlinksChangeset() {
+ IHyperlink[] links = findTracHyperlinks(repository, "r123", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 4), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/changeset/123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "alr123", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "[123]", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 5), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/changeset/123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "![123]", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "![123]", 1, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "changeset:123", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 13), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/changeset/123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "[123/trunk]", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 11), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/changeset/123/trunk", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "changeset:123/trunk", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals(new Region(0, 19), links[0].getHyperlinkRegion());
+ assertEquals("http://localhost/changeset/123/trunk", ((WebHyperlink) links[0]).getURLString());
+ }
+
+ public void testFindHyperlinksRevisionLog() {
+ IHyperlink[] links = findTracHyperlinks(repository, "r123:456", 0, 0);
+ assertEquals(2, links.length);
+ assertEquals("http://localhost/log/?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString());
+ assertEquals(new Region(0, 8), links[0].getHyperlinkRegion());
+
+ links = findTracHyperlinks(repository, "[123:456]", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/log/?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString());
+ assertEquals(new Region(0, 9), links[0].getHyperlinkRegion());
+
+ links = findTracHyperlinks(repository, "log:@123:456", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/log/?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString());
+ assertEquals(new Region(0, 12), links[0].getHyperlinkRegion());
+
+ links = findTracHyperlinks(repository, "log:trunk at 123:456", 0, 0);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/log/trunk?rev=123&stop_rev=456", ((WebHyperlink) links[0]).getURLString());
+ assertEquals(new Region(0, 17), links[0].getHyperlinkRegion());
+ }
+
+ public void testFindHyperlinksDiff() {
+ IHyperlink[] links = findTracHyperlinks(repository, "diff:@123:456", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/changeset/?new=456&old=123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "diff:trunk/trac at 3538//sandbox/vc-refactoring/trac at 3539", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(
+ "http://localhost/changeset/?new_path=sandbox%2Fvc-refactoring%2Ftrac&old_path=trunk%2Ftrac&new=3539&old=3538",
+ ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "diff:tags/trac-0.9.2/wiki-default//tags/trac-0.9.3/wiki-default", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals(
+ "http://localhost/changeset/?new_path=tags%2Ftrac-0.9.3%2Fwiki-default&old_path=tags%2Ftrac-0.9.2%2Fwiki-default",
+ ((WebHyperlink) links[0]).getURLString());
+ }
+
+ public void testFindHyperlinksWiki() {
+ IHyperlink[] links = findTracHyperlinks(repository, "[wiki:page]", 1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/wiki/page", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "wiki:page", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/wiki/page", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "Page", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "!Page", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "ab Page dc", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "paGe", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "WikiPage", 0, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/wiki/WikiPage", ((WebHyperlink) links[0]).getURLString());
+ assertEquals(new Region(0, 8), links[0].getHyperlinkRegion());
+
+ links = findTracHyperlinks(repository, "!WikiPage", 0, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "!WikiPage", 1, 0);
+ assertNull(links);
+
+ links = findTracHyperlinks(repository, "a WikiPage is here", 4, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/wiki/WikiPage", ((WebHyperlink) links[0]).getURLString());
+ assertEquals(new Region(2, 8), links[0].getHyperlinkRegion());
+
+ links = findTracHyperlinks(repository, "a !WikiPage is here", 4, 0);
+ assertNull(links);
+ }
+
+ public void testFindHyperlinksMilestone() {
+ IHyperlink[] links = findTracHyperlinks(repository, "milestone:1.0", 1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/milestone/1.0", ((WebHyperlink) links[0]).getURLString());
+ }
+
+ public void testFindHyperlinksAttachment() {
+ IHyperlink[] links = findTracHyperlinks(repository, "attachment:ticket:123:foo.bar", 1, 0);
+ assertNotNull(links);
+ assertEquals("123", ((TaskHyperlink) links[0]).getTaskId());
+ }
+
+ public void testFindHyperlinksFiles() {
+ IHyperlink[] links = findTracHyperlinks(repository, "source:trunk/foo", 1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/browser/trunk/foo", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "source:trunk/foo at 123", 1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/browser/trunk/foo?rev=123", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "source:trunk/foo at 123#L456", 1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/browser/trunk/foo?rev=123#L456", ((WebHyperlink) links[0]).getURLString());
+
+ links = findTracHyperlinks(repository, "source:/tags/foo_bar-1.1", 1, 0);
+ assertNotNull(links);
+ assertEquals(1, links.length);
+ assertEquals("http://localhost/browser/tags/foo_bar-1.1", ((WebHyperlink) links[0]).getURLString());
+ }
+
+ private IHyperlink[] findTracHyperlinks(TaskRepository repository, String text, int offsetInText, int textOffset) {
+ List<IHyperlink> links = TracHyperlinkUtil.findTracHyperlinks(repository, text, offsetInText, textOffset);
+ return (links.isEmpty()) ? null : links.toArray(new IHyperlink[0]);
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracRepositorySettingsPageTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracRepositorySettingsPageTest.java
new file mode 100644
index 0000000..8e730b2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracRepositorySettingsPageTest.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.ui;
+
+import java.net.Proxy;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.ui.wizard.TracRepositorySettingsPage;
+import org.eclipse.mylyn.internal.trac.ui.wizard.TracRepositorySettingsPage.TracValidator;
+import org.eclipse.mylyn.trac.tests.client.AbstractTracClientTest;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositorySettingsPageTest extends AbstractTracClientTest {
+
+ private TracRepositorySettingsPage page;
+
+ private TracValidator validator;
+
+ public TracRepositorySettingsPageTest() {
+ super(null);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ page = new TracRepositorySettingsPage(null);
+
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ page.createControl(shell);
+ page.setVisible(true);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ // TestFixture.cleanupRepository1();
+ }
+
+ @Override
+ public ITracClient connect(String url, String username, String password, Proxy proxy, Version version)
+ throws Exception {
+ page.setAnonymous(false);
+ page.setUrl(url);
+ page.setUserId(username);
+ page.setPassword(password);
+ page.setTracVersion(version);
+ validator = page.new TracValidator(page.createTaskRepository(), version);
+ return null;
+ }
+
+ public void testValidateXmlRpc() throws Exception {
+ version = Version.XML_RPC;
+ connect010();
+
+ validator.run(new NullProgressMonitor());
+ assertNull(validator.getResult());
+ assertNull(validator.getStatus());
+ }
+
+ public void testValidateWeb() throws Exception {
+ version = Version.TRAC_0_9;
+ connect010();
+
+ validator.run(new NullProgressMonitor());
+ assertNull(validator.getResult());
+ assertNull(validator.getStatus());
+ }
+
+ public void testValidateAutomaticUser() throws Exception {
+ version = null;
+ connect010();
+
+ validator.run(new NullProgressMonitor());
+ assertEquals(Version.XML_RPC, validator.getResult());
+ assertNull(validator.getStatus());
+ }
+
+ public void testValidateAutomaticAnonymous() throws Exception {
+ version = null;
+ connect(TracTestConstants.TEST_TRAC_010_URL, "", "");
+
+ validator.run(new NullProgressMonitor());
+ assertEquals(Version.TRAC_0_9, validator.getResult());
+ assertNotNull(validator.getStatus());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracTaskEditorTest.java b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracTaskEditorTest.java
new file mode 100644
index 0000000..d90cd69
--- /dev/null
+++ b/org.eclipse.mylyn.trac.tests/src/org/eclipse/mylyn/trac/tests/ui/TracTaskEditorTest.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.tests.ui;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.trac.tests.support.TracTestConstants;
+import org.eclipse.mylyn.trac.tests.support.TracTestUtil;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskEditorTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ TaskTestUtil.resetTaskList();
+ }
+
+ public void testGetSelectedRepository() throws Exception {
+ TaskRepository repository = TracTestUtil.init(TracTestConstants.TEST_TRAC_010_URL, Version.XML_RPC);
+
+ ITask task = TracTestUtil.createTask(repository, "1");
+ TasksUiPlugin.getTaskList().addTask(task);
+ TasksUiUtil.openTask(task);
+
+ TaskListView taskListView = TaskListView.getFromActivePerspective();
+ // force refresh since automatic refresh is delayed
+ taskListView.getViewer().refresh();
+ taskListView.getViewer().expandAll();
+ taskListView.getViewer().setSelection(new StructuredSelection(task));
+
+ assertFalse(taskListView.getViewer().getSelection().isEmpty());
+ assertEquals(repository, TasksUiUtil.getSelectedRepository(taskListView.getViewer()));
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/.classpath b/org.eclipse.mylyn.trac.ui/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.trac.ui/.cvsignore b/org.eclipse.mylyn.trac.ui/.cvsignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.cvsignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/.project b/org.eclipse.mylyn.trac.ui/.project
new file mode 100644
index 0000000..6c9ffc2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.trac.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/39/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/39/refactorings.history
new file mode 100644
index 0000000..8769b5a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/39/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui.editor' - Original project: 'org.eclipse.mylar.trac.ui' - Destination element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui.editor' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditor.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.trac.ui.editor" element1="/src<org.eclipse.mylar.internal.trac.ui.editor{TracTaskEditor.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.trac.ui.editor{TracTaskEditor.java	true	true	NewTracTaskEditor.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1159727883341" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/39/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/39/refactorings.index
new file mode 100644
index 0000000..dc6deb6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/39/refactorings.index
@@ -0,0 +1 @@
+1159727883341 Copy compilation unit
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/41/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/41/refactorings.history
new file mode 100644
index 0000000..54bf6c0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/41/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor' to 'NewTracRepositoryTaskEditor' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor' - Renamed element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracRepositoryTaskEditor' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'NewTracTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.ui.editor{NewTracTaskEditor.java[NewTracTaskEditor" matchStrategy="1" name="NewTracRepositoryTaskEditor" qualified="false" references="true" similarDeclarations="false" stamp="1160698114739" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.ui.editor.NewBugzillaTaskEditor' to 'NewTracTaskEditor' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.NewBugzillaTaskEditor' - Renamed element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'NewBugzillaTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.ui.editor{NewBugzillaTaskEditor.java[NewBugzillaTaskEditor" matchStrategy="1" name="NewTracTaskEditor" qualified="false" references="true" similarDeclarations="false" stamp="1160698131007" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/41/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/41/refactorings.index
new file mode 100644
index 0000000..15ac3d4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/41/refactorings.index
@@ -0,0 +1,2 @@
+1160698114739 Rename type 'NewTracTaskEditor'
+1160698131007 Rename type 'NewBugzillaTaskEditor'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/42/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/42/refactorings.history
new file mode 100644
index 0000000..f2f1866
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/42/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.ui.editor.NewTracRepositoryTaskEditor' to 'NewTracTaskEditorPage' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracRepositoryTaskEditor' - Renamed element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditorPage' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'NewTracRepositoryTaskEditor'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.ui.editor{NewTracRepositoryTaskEditor.java[NewTracRepositoryTaskEditor" matchStrategy="1" name="NewTracTaskEditorPage" qualified="false" references="true" similarDeclarations="false" stamp="1161130819735" textual="false" version="1.0"/>
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditor.getTracTicket(...)' to 'org.eclipse.mylar.internal.trac.core.TracRepositoryConnector' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditor.getTracTicket(...)' - Destination type: 'org.eclipse.mylar.internal.trac.core.TracRepositoryConnector'" delegate="false" deprecate="true" description="Move member 'getTracTicket'" element1="/src<org.eclipse.mylar.internal.trac.ui.editor{TracTaskEditor.java[TracTaskEditor~getTracTicket~QTaskRepository;~QRepositoryTaskData;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.trac.core{TracRepositoryConnector.java[TracRepositoryConnector" stamp="1161134766081" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'TracTaskEditor.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/trac/ui/editor/TracTaskEditor.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1161142275798" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'TracTaskEditorFactory.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/trac/ui/editor/TracTaskEditorFactory.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1161142344944" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/42/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/42/refactorings.index
new file mode 100644
index 0000000..9d06526
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/42/refactorings.index
@@ -0,0 +1,4 @@
+1161130819735 Rename type 'NewTracRepositoryTaskEditor'
+1161134766081 Move member 'getTracTicket'
+1161142275798 Delete element
+1161142344944 Delete element
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/43/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/43/refactorings.history
new file mode 100644
index 0000000..0c46e8c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/43/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.trac.ui.editor{NewTracTaskEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1161667033750" subPackages="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditorPage' to 'NewTracTaskEditor' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditorPage' - Renamed element: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor' - Update references to refactored element - Update fully qualified names in '*.xml' files - Update textual occurrences in comments and strings" description="Rename type 'NewTracTaskEditorPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.ui.editor{NewTracTaskEditorPage.java[NewTracTaskEditorPage" matchStrategy="1" name="NewTracTaskEditor" patterns="*.xml" qualified="true" references="true" similarDeclarations="false" stamp="1161670167781" textual="false" version="1.0"/>
+<refactoring comment="Extract method 'private void handleOkayStatus(final IJobChangeEvent event)' from 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor.submitBug().new JobChangeAdapter() {...}.done().new Runnable() {...}.run()' to 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor.submitBug().new JobChangeAdapter() {...}.done().new Runnable() {...}' - Original project: 'org.eclipse.mylar.trac.ui' - Method name: 'handleOkayStatus' - Destination type: 'org.eclipse.mylar.internal.trac.ui.editor.NewTracTaskEditor.submitBug().new JobChangeAdapter() {...}.done().new Runnable() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'handleOkayStatus'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.trac.ui.editor{NewTracTaskEditor.java" name="handleOkayStatus" replace="false" selection="2863 1202" stamp="1161736236593" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/43/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/43/refactorings.index
new file mode 100644
index 0000000..6ba170f
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/10/43/refactorings.index
@@ -0,0 +1,3 @@
+1161667033750 Delete element
+1161670167781 Rename type 'NewTracTaskEditorPage'
+1161736236593 Extract method 'handleOkayStatus'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/45/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/45/refactorings.history
new file mode 100644
index 0000000..c1baf06
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/45/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditorInput.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.trac.ui.editor{TracTaskEditorInput.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1162974674609" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/45/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/45/refactorings.index
new file mode 100644
index 0000000..4af7320
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/45/refactorings.index
@@ -0,0 +1 @@
+1162974674609 Delete element
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..e84b8d2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void attachContext(final AbstractRepositoryTask task)' from 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditor.submitToRepository().new JobChangeAdapter() {...}.done().new Runnable() {...}.run()' to 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditor' - Original project: 'org.eclipse.mylar.trac.ui' - Method name: 'attachContext' - Destination type: 'org.eclipse.mylar.internal.trac.ui.editor.TracTaskEditor' - Declared visibility: 'private'" comments="false" description="Extract method 'attachContext'" destination="2" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.trac.ui.editor{TracTaskEditor.java" name="attachContext" replace="false" selection="4274 1082" stamp="1163381295635" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..b30090d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1 @@
+1163381295635 Extract method 'attachContext'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/12/50/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/12/50/refactorings.history
new file mode 100644
index 0000000..76f5602
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/12/50/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private TracSearch getTracSearch()' from 'org.eclipse.mylar.internal.trac.ui.wizard.TracCustomQueryPage.getQueryUrl()' to 'org.eclipse.mylar.internal.trac.ui.wizard.TracCustomQueryPage' - Original project: 'org.eclipse.mylar.trac.ui' - Method name: 'getTracSearch' - Destination type: 'org.eclipse.mylar.internal.trac.ui.wizard.TracCustomQueryPage' - Declared visibility: 'private'" comments="false" description="Extract method 'getTracSearch'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.trac.ui.wizard{TracCustomQueryPage.java" name="getTracSearch" replace="false" selection="13274 209" stamp="1166328781867" version="1.0" visibility="2"/>
+<refactoring comment="Extract method 'private void initializePage()' from 'org.eclipse.mylar.internal.trac.ui.wizard.TracCustomQueryPage.setVisible().new Runnable() {...}.run()' to 'org.eclipse.mylar.internal.trac.ui.wizard.TracCustomQueryPage.setVisible().new Runnable() {...}' - Original project: 'org.eclipse.mylar.trac.ui' - Method name: 'initializePage' - Destination type: 'org.eclipse.mylar.internal.trac.ui.wizard.TracCustomQueryPage.setVisible().new Runnable() {...}' - Declared visibility: 'private'" comments="false" description="Extract method 'initializePage'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.trac.ui.wizard{TracCustomQueryPage.java" name="initializePage" replace="false" selection="10288 252" stamp="1166330298920" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/12/50/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/12/50/refactorings.index
new file mode 100644
index 0000000..01d4be0
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/12/50/refactorings.index
@@ -0,0 +1,2 @@
+1166328781867 Extract method 'getTracSearch'
+1166330298920 Extract method 'initializePage'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/6/25/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/6/25/refactorings.history
new file mode 100644
index 0000000..e0b7cf9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/6/25/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.core.ITracRepository' to 'ITracClient' - Original element: 'org.eclipse.mylar.internal.trac.core.ITracRepository' - Renamed element: 'org.eclipse.mylar.internal.trac.core.ITracClient' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'ITracRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.core{ITracRepository.java[ITracRepository" matchStrategy="1" name="ITracClient" qualified="false" references="true" similarDeclarations="false" stamp="1150980814314" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.core.Trac09Repository' to 'Trac09Client' - Original element: 'org.eclipse.mylar.internal.trac.core.Trac09Repository' - Renamed element: 'org.eclipse.mylar.internal.trac.core.Trac09Client' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'Trac09Repository'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.core{Trac09Repository.java[Trac09Repository" matchStrategy="1" name="Trac09Client" qualified="false" references="true" similarDeclarations="false" stamp="1150980823676" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.core.TracXmlRpcRepository' to 'TracXmlRpcClient' - Original element: 'org.eclipse.mylar.internal.trac.core.TracXmlRpcRepository' - Renamed element: 'org.eclipse.mylar.internal.trac.core.TracXmlRpcClient' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'TracXmlRpcRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.core{TracXmlRpcRepository.java[TracXmlRpcRepository" matchStrategy="1" name="TracXmlRpcClient" qualified="false" references="true" similarDeclarations="false" stamp="1150980835503" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.core.AbstractTracRepository' to 'AbstractTracClient' - Original element: 'org.eclipse.mylar.internal.trac.core.AbstractTracRepository' - Renamed element: 'org.eclipse.mylar.internal.trac.core.AbstractTracClient' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename type 'AbstractTracRepository'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac.core{AbstractTracRepository.java[AbstractTracRepository" matchStrategy="1" name="AbstractTracClient" qualified="false" references="true" similarDeclarations="false" stamp="1150980847209" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/6/25/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/6/25/refactorings.index
new file mode 100644
index 0000000..7543c14
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/6/25/refactorings.index
@@ -0,0 +1,4 @@
+1150980814314 Rename type 'ITracRepository'
+1150980847209 Rename type 'AbstractTracRepository'
+1150980835503 Rename type 'TracXmlRpcRepository'
+1150980823676 Rename type 'Trac09Repository'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/27/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/27/refactorings.history
new file mode 100644
index 0000000..97eeb11
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/27/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring abstract="0" comment="Pull up members from 'org.eclipse.mylar.internal.trac.ui.wizard.AddExistingTracTaskWizard' to 'org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard' - Original elements: org.eclipse.mylar.internal.trac.ui.wizard.AddExistingTracTaskWizard.page org.eclipse.mylar.internal.trac.ui.wizard.AddExistingTracTaskWizard.addPages() org.eclipse.mylar.internal.trac.ui.wizard.AddExistingTracTaskWizard.getTaskId() - Destination type: 'org.eclipse.mylar.internal.tasklist.ui.wizards.AbstractAddExistingTaskWizard' - Use super type where possible" delete="9" description="Pull up members to 'AbstractAddExistingTaskWizard'" element1="/src<org.eclipse.mylar.internal.trac.ui.wizard{AddExistingTracTaskWizard.java[AddExistingTracTaskWizard^page" element10="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~getAddExistingTaskWizard~QTaskRepository;[~addPages" element11="/src<org.eclipse.mylar.internal.bugzilla.ui.tasklist{BugzillaRepositoryConnector.java[BugzillaRepositoryConnector~getAddExistingTaskWizard~QTaskRepository;[~getTaskId" element12="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{AbstractAddExistingTaskWizard.java[AbstractAddExistingTaskWizard~getTaskId" element2="/src<org.eclipse.mylar.internal.trac.ui.wizard{AddExistingTracTaskWizard.java[AddExistingTracTaskWizard~addPages" element3="/src<org.eclipse.mylar.internal.trac.ui.wizard{AddExistingTracTaskWizard.java[AddExistingTracTaskWizard~getTaskId" element4="/src<org.eclipse.mylar.internal.jira.ui.wizards{AddExistingJiraTaskWizard.java[AddExistingJiraTaskWizard~addPages" element5="/src<org.eclipse.mylar.internal.jira.ui.wizards{AddExistingJiraTaskWizard.java[AddExistingJiraTaskWizard~getTaskId" element6="/src<org.eclipse.mylar.internal.trac.ui.wizard{AddExistingTracTaskWizard.java[AddExistingTracTaskWizard~addPages" element7="/src<org.eclipse.mylar.internal.trac.ui.wizard{AddExistingTracTaskWizard.java[AddExistingTracTaskWizard~getTaskId" element8="/src<org.eclipse.mylar.internal.sandbox.web{WebRepositoryConnector.java[WebRepositoryConnector~getAddExistingTaskWizard~QTaskRepository;[~addPages" element9="/src<org.eclipse.mylar.internal.sandbox.web{WebRepositoryConnector.java[WebRepositoryConnector~getAddExistingTaskWizard~QTaskRepository;[~getTaskId" flags="589830" id="org.eclipse.jdt.ui.pull.up" input="/src<org.eclipse.mylar.internal.tasklist.ui.wizards{AbstractAddExistingTaskWizard.java[AbstractAddExistingTaskWizard" instanceof="false" pull="3" replace="true" stamp="1152156004000" stubs="true" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/27/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/27/refactorings.index
new file mode 100644
index 0000000..9ad0d21
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/27/refactorings.index
@@ -0,0 +1 @@
+1152156004000 Pull up members to 'AbstractAddExistingTaskWizard'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/28/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/28/refactorings.history
new file mode 100644
index 0000000..90d09fa
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/28/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.model.TracTicket.parseDate(...)' to 'org.eclipse.mylar.internal.trac.core.TracUtils' - Original element: 'org.eclipse.mylar.internal.trac.model.TracTicket.parseDate(...)' - Destination type: 'org.eclipse.mylar.internal.trac.core.TracUtils'" delegate="false" deprecate="true" description="Move member 'parseDate'" element1="/src<org.eclipse.mylar.internal.trac.model{TracTicket.java[TracTicket~parseDate~I" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.trac.core{TracUtils.java[TracUtils" stamp="1152722280126" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/28/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/28/refactorings.index
new file mode 100644
index 0000000..bac2b2a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/28/refactorings.index
@@ -0,0 +1 @@
+1152722280126 Move member 'parseDate'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/30/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/30/refactorings.history
new file mode 100644
index 0000000..7de6e22
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/30/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylar.internal.trac.MylarTracPlugin' to 'TracUiPlugin' - Original element: 'org.eclipse.mylar.internal.trac.MylarTracPlugin' - Renamed element: 'org.eclipse.mylar.internal.trac.TracUiPlugin' - Update references to refactored element - Rename similarly named elements - Update fully qualified names in *.xml, *.mf files - Update textual occurrences in comments and strings" description="Rename type 'MylarTracPlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.internal.trac{MylarTracPlugin.java[MylarTracPlugin" matchStrategy="1" name="TracUiPlugin" patterns="*.xml, *.mf" qualified="true" references="true" similarDeclarations="true" stamp="1154024500312" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/30/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/30/refactorings.index
new file mode 100644
index 0000000..88e8f71
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/7/30/refactorings.index
@@ -0,0 +1 @@
+1154024500312 Rename type 'MylarTracPlugin'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/34/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/34/refactorings.history
new file mode 100644
index 0000000..5c6f7c9
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/34/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 1 element(s) to 'org.eclipse.mylar.internal.trac.TracRepositoryUi' - Original project: 'org.eclipse.mylar.trac.ui' - Destination element: 'org.eclipse.mylar.internal.trac.TracRepositoryUi' - Original element: 'org.eclipse.mylar.internal.trac.TracRepositoryConnector.getQueryWizard(...)' - Textual move only" description="Move method" destination="/src<org.eclipse.mylar.internal.trac{TracRepositoryUi.java[TracRepositoryUi" element1="/src<org.eclipse.mylar.internal.trac{TracRepositoryConnector.java[TracRepositoryConnector~getQueryWizard~QTaskRepository;~QAbstractRepositoryQuery;" flags="589830" id="org.eclipse.jdt.ui.move" members="1" policy="org.eclipse.jdt.ui.moveMembers" stamp="1156487835828" version="1.0"/>
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylar.trac.ui' - Original elements: org.eclipse.mylar.internal.trac.TracOfflineTaskHandler.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylar.internal.trac{TracOfflineTaskHandler.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1156607334380" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/34/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/34/refactorings.index
new file mode 100644
index 0000000..0c11234
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/34/refactorings.index
@@ -0,0 +1,2 @@
+1156487835828 Move method
+1156607334380 Infer generic type arguments
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/35/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/35/refactorings.history
new file mode 100644
index 0000000..d0057cc
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/35/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.TracUiPlugin.REPOSITORY_KIND' to 'org.eclipse.mylar.internal.trac.core.TracCorePlugin' - Original element: 'org.eclipse.mylar.internal.trac.TracUiPlugin.REPOSITORY_KIND' - Destination type: 'org.eclipse.mylar.internal.trac.core.TracCorePlugin'" delegate="false" deprecate="true" description="Move member 'REPOSITORY_KIND'" element1="/src<org.eclipse.mylar.internal.trac{TracUiPlugin.java[TracUiPlugin^REPOSITORY_KIND" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.trac.core{TracCorePlugin.java[TracCorePlugin" stamp="1156876434057" version="1.0"/>
+<refactoring comment="Move 2 members to 'org.eclipse.mylar.internal.trac.core.TracCorePlugin' - Original elements: org.eclipse.mylar.internal.trac.TracUiPlugin.log(...) org.eclipse.mylar.internal.trac.TracUiPlugin.log(...) - Destination type: 'org.eclipse.mylar.internal.trac.core.TracCorePlugin'" delegate="false" deprecate="true" description="Move members" element1="/src<org.eclipse.mylar.internal.trac{TracUiPlugin.java[TracUiPlugin~log~QIStatus;" element2="/src<org.eclipse.mylar.internal.trac{TracUiPlugin.java[TracUiPlugin~log~QThrowable;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.trac.core{TracCorePlugin.java[TracCorePlugin" stamp="1156876532918" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.trac' to 'org.eclipse.mylar.internal.trac.ui' - Original element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac' - Renamed element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui' - Update references to refactored element - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylar.internal.trac'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.trac" name="org.eclipse.mylar.internal.trac.ui" qualified="false" references="true" stamp="1156880244366" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/35/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/35/refactorings.index
new file mode 100644
index 0000000..5357172
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/8/35/refactorings.index
@@ -0,0 +1,3 @@
+1156876434057 Move member 'REPOSITORY_KIND'
+1156880244366 Rename package 'org.eclipse.mylar.internal.trac'
+1156876532918 Move members
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/9/36/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2006/9/36/refactorings.history
new file mode 100644
index 0000000..71dc764
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/9/36/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 'org.eclipse.mylar.internal.trac.ui.TracUiPlugin.toStatus(...)' to 'org.eclipse.mylar.internal.trac.core.TracCorePlugin' - Original element: 'org.eclipse.mylar.internal.trac.ui.TracUiPlugin.toStatus(...)' - Destination type: 'org.eclipse.mylar.internal.trac.core.TracCorePlugin'" delegate="false" deprecate="true" description="Move member 'toStatus'" element1="/src<org.eclipse.mylar.internal.trac.ui{TracUiPlugin.java[TracUiPlugin~toStatus~QThrowable;" flags="589830" id="org.eclipse.jdt.ui.move.static" input="/src<org.eclipse.mylar.internal.trac.core{TracCorePlugin.java[TracCorePlugin" stamp="1157718574967" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2006/9/36/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2006/9/36/refactorings.index
new file mode 100644
index 0000000..cd9dcbb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2006/9/36/refactorings.index
@@ -0,0 +1 @@
+1157718574967 Move member 'toStatus'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/11/46/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2007/11/46/refactorings.history
new file mode 100644
index 0000000..1ec764f
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.wizard.NewTracTaskWizard'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.ui.wizard{NewTracTaskWizard.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1195095650310" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/11/46/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2007/11/46/refactorings.index
new file mode 100644
index 0000000..a580dd5
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/11/46/refactorings.index
@@ -0,0 +1 @@
+1195095650310 Delete element
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/10/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/10/refactorings.history
new file mode 100644
index 0000000..a647036
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/10/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private TaskRepository getRepository(ITextViewer textViewer,TaskRepository repository)' from 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkDetector.detectHyperlinks()' to 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkDetector' - Original project: 'org.eclipse.mylar.trac.ui' - Method name: 'getRepository' - Destination type: 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkDetector' - Declared visibility: 'private'" comments="false" description="Extract method 'getRepository'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.internal.trac.ui{TracHyperlinkDetector.java" name="getRepository" replace="false" selection="1474 749" stamp="1173311250806" version="1.0" visibility="2"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Destination element: 'org.eclipse.mylar.trac.ui/src/org.eclipse.mylar.internal.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.TaskHyperlink.java'" description="Copy compilation unit" destination="/src<org.eclipse.mylar.internal.trac.ui" element1="/src<org.eclipse.mylar.internal.trac.ui{TaskHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="/src<org.eclipse.mylar.internal.trac.ui{TaskHyperlink.java	true	true	WebHyperlink.java" policy="org.eclipse.jdt.ui.copyResources" stamp="1173400605936" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/10/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/10/refactorings.index
new file mode 100644
index 0000000..bd2c575
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/10/refactorings.index
@@ -0,0 +1,2 @@
+1173311250806 Extract method 'getRepository'
+1173400605936 Copy compilation unit
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/11/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/11/refactorings.history
new file mode 100644
index 0000000..da63a13
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/11/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Destination element: 'org.eclipse.mylar.tasks.ui/src/org.eclipse.mylar.tasks.ui' - Original elements: org.eclipse.mylar.internal.trac.ui.TaskHyperlink.java org.eclipse.mylar.internal.trac.ui.WebHyperlink.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.tasks.ui" element1="/src<org.eclipse.mylar.internal.trac.ui{TaskHyperlink.java" element2="/src<org.eclipse.mylar.internal.trac.ui{WebHyperlink.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1173739454984" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.trac.ui' - Original project: 'org.eclipse.mylar.trac.ui' - Original element: 'org.eclipse.mylar.internal.trac.ui.TracHyperlinkDetector.java'" description="Delete element" element1="/src<org.eclipse.mylar.internal.trac.ui{TracHyperlinkDetector.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1173749049437" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/11/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/11/refactorings.index
new file mode 100644
index 0000000..d067784
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/3/11/refactorings.index
@@ -0,0 +1,2 @@
+1173739454984 Move compilation units
+1173749049437 Delete element
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..2d90802
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.ui.TracTaskExternalizer' to 'TracTaskListFactory' - Original project: 'org.eclipse.mylyn.trac.ui' - Original element: 'org.eclipse.mylyn.internal.trac.ui.TracTaskExternalizer' - Renamed element: 'org.eclipse.mylyn.internal.trac.ui.TracTaskListFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TracTaskExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.ui{TracTaskExternalizer.java[TracTaskExternalizer" matchStrategy="1" name="TracTaskListFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182400245814" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.ui.TracRepositoryUi' to 'TracConnectorUi' - Original project: 'org.eclipse.mylyn.trac.ui' - Original element: 'org.eclipse.mylyn.internal.trac.ui.TracRepositoryUi' - Renamed element: 'org.eclipse.mylyn.internal.trac.ui.TracConnectorUi' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'TracRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.ui{TracRepositoryUi.java[TracRepositoryUi" matchStrategy="1" name="TracConnectorUi" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182561772597" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..6e23918
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1182400245814 Rename type 'TracTaskExternalizer'
+1182561772597 Rename type 'TracRepositoryUi'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/3/13/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2008/3/13/refactorings.history
new file mode 100644
index 0000000..4fc4cb2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/3/13/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.editor.BrowserFormPage'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.ui.editor{BrowserFormPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1206665645257" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/3/13/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2008/3/13/refactorings.index
new file mode 100644
index 0000000..a4aa955
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/3/13/refactorings.index
@@ -0,0 +1 @@
+1206665645257 Delete element
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/4/17/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2008/4/17/refactorings.history
new file mode 100644
index 0000000..f80c035
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/4/17/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.ui.editor.TracDulicateDetector' to 'TracDuplicateDetector'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.editor.TracDulicateDetector'
- Renamed element: 'org.eclipse.mylyn.internal.trac.ui.editor.TracDuplicateDetector'
- Update references to refactored element
- Update textual occurrences in comments and strings" description="Rename type 'TracDulicateDetector'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.ui.editor{TracDulicateDetector.java[TracDulicateDetector" matchStrategy="1" name="TracDuplicateDetector" qualified="false" references="true" similarDeclarations="false" stamp="1208903399612" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/4/17/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2008/4/17/refactorings.index
new file mode 100644
index 0000000..ddd1ec6
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/4/17/refactorings.index
@@ -0,0 +1 @@
+1208903399612 Rename type 'TracDulicateDetector'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/24/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/24/refactorings.history
new file mode 100644
index 0000000..6bf15b7
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/24/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Inline local variable 'org.eclipse.mylyn.internal.trac.ui.TracTaskListMigrator.migrateTask().date' in 'org.eclipse.mylyn.internal.trac.ui.TracTaskListMigrator.migrateTask()'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.TracTaskListMigrator.migrateTask().date'" description="Inline local variable 'date'" id="org.eclipse.jdt.ui.inline.temp" input="/src<org.eclipse.mylyn.internal.trac.ui{TracTaskListMigrator.java" selection="1735 67" stamp="1213156369855" version="1.0"/>
<refactoring accessors="true" comment="Delete 2 element(s) from project 'org.eclipse.mylyn.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original elements:
 org.eclipse.mylyn.internal.trac.ui.wizard.EditTracQueryWizard.java
 org.eclipse.mylyn.internal.trac.ui.wizard.NewTracQueryWizard.java" description="Delete elements" element1="/src<org.eclipse.mylyn.internal.trac.ui.wizard{NewTracQueryWizard.java" element2="/src<org.eclipse.mylyn.internal.trac.ui.wizard{EditTracQueryWizard.java" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213162918938" subPackages="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.ui.wizard.TracCustomQueryPage' to 'TracQueryPage'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.wizard.TracCustomQueryPage'
- Renamed element: 'org.eclipse.mylyn.internal.trac.ui.wizard.TracQueryPage'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TracCustomQueryPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.ui.wizard{TracCustomQueryPage.java[TracCustomQueryPage" matchStrategy="1" name="TracQueryPage" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213162948896" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.ui.wizard.TracQueryWizardPage' to 'TracFilterQueryPage'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.wizard.TracQueryWizardPage'
- Renamed element: 'org.eclipse.mylyn.internal.trac.ui.wizard.TracFilterQueryPage'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'TracQueryWizardPage'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.ui.wizard{TracQueryWizardPage.java[TracQueryWizardPage" matchStrategy="1" name="TracFilterQueryPage" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213162991832" textual="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.TracTaskListFactory.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.ui{TracTaskListFactory.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213163252993" subPackages="false" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.wizard.NewTracTaskPage.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.ui.wizard{NewTracTaskPage.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213163322133" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.trac.ui/src/org.eclipse.mylyn.internal.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Destination element: 'org.eclipse.mylyn.trac.ui/src/org.eclipse.mylyn.internal.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.editor.TracSearchHandler.java'
- Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.trac.ui" element1="/src<org.eclipse.mylyn.internal.trac.ui.editor{TracSearchHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1213165069679" units="1" version="1.0"/>
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.trac.ui'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.editor.NewTracTaskEditor.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.trac.ui.editor{NewTracTaskEditor.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1213165083933" subPackages="false" version="1.0"/>
<refactoring comment="Rename field 'PLUGIN_ID' in 'org.eclipse.mylyn.internal.trac.ui.TracUiPlugin' to 'ID_PLUGIN'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.TracUiPlugin.PLUGIN_ID'
- Renamed element: 'org.eclipse.mylyn.internal.trac.ui.TracUiPlugin.ID_PLUGIN'
- Update references to refactored element
- Update textual occurrences in comments and strings
- Rename getter method for field
- Rename setter method for field" delegate="false" deprecate="false" description="Rename field 'PLUGIN_ID'" flags="589830" getter="true" id="org.eclipse.jdt.ui.rename.field" input="/src<org.eclipse.mylyn.internal.trac.ui{TracUiPlugin.java[TracUiPlugin^PLUGIN_ID" name="ID_PLUGIN" references="true" setter="true" stamp="1213259673308" textual="false" version="1.0"/>
<refactoring comment="Rename type 'org.eclipse.mylyn.internal.trac.ui.editor.BugzillaPeoplePart' to 'TracPeoplePart'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Original element: 'org.eclipse.mylyn.internal.trac.ui.editor.BugzillaPeoplePart'
- Renamed element: 'org.eclipse.mylyn.internal.trac.ui.editor.TracPeoplePart'
- Update references to refactored element
- Rename similarly named elements
- Update fully qualified names in 'plugin.xml,MANIFEST.MF' files
- Update textual occurrences in comments and strings" description="Rename type 'BugzillaPeoplePart'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.trac.ui.editor{BugzillaPeoplePart.java[BugzillaPeoplePart" matchStrategy="1" name="TracPeoplePart" patterns="plugin.xml,MANIFEST.MF" qualified="true" references="true" similarDeclarations="true" stamp="1213344045894" textual="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/24/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/24/refactorings.index
new file mode 100644
index 0000000..33789b2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/24/refactorings.index
@@ -0,0 +1,10 @@
+1213156369855 Inline local variable 'date'
+1213162918938 Delete elements
+1213162948896 Rename type 'TracCustomQueryPage'
+1213162991832 Rename type 'TracQueryWizardPage'
+1213163252993 Delete element
+1213163322133 Delete element
+1213165069679 Move compilation unit
+1213165083933 Delete element
+1213259673308 Rename field 'PLUGIN_ID'
+1213344045894 Rename type 'BugzillaPeoplePart'
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/26/refactorings.history b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/26/refactorings.history
new file mode 100644
index 0000000..fe06c4c
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/26/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Extract local variable 'attribute' from expression 'element.getAttribute(KEY_LAST_MOD_DATE)'
- Original project: 'org.eclipse.mylyn.trac.ui'
- Variable name: 'attribute'
- Destination method: 'org.eclipse.mylyn.internal.trac.ui.TracTaskListMigrator.migrateTask()'
- Variable expression: 'element.getAttribute(KEY_LAST_MOD_DATE)'
- Replace occurrences of expression with variable" description="Extract local variable 'attribute'" final="false" id="org.eclipse.jdt.ui.extract.temp" input="/src<org.eclipse.mylyn.internal.trac.ui{TracTaskListMigrator.java" name="attribute" replace="true" selection="1842 39" stamp="1214186777123" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/26/refactorings.index b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/26/refactorings.index
new file mode 100644
index 0000000..e5ea63b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.refactorings/2008/6/26/refactorings.index
@@ -0,0 +1 @@
+1214186777123 Extract local variable 'attribute'
diff --git a/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5378565
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn.trac.ui;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.trac.ui.TracUiPlugin
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.trac.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.mylyn.internal.trac.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.trac.ui.editor;x-internal:=true,
+ org.eclipse.mylyn.internal.trac.ui.wizard;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.trac.ui/about.html b/org.eclipse.mylyn.trac.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.ui/build.properties b/org.eclipse.mylyn.trac.ui/build.properties
new file mode 100644
index 0000000..34b0584
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/org.eclipse.mylyn.trac.ui/icons/etool16/task-repository.gif b/org.eclipse.mylyn.trac.ui/icons/etool16/task-repository.gif
new file mode 100644
index 0000000..78470a3
Binary files /dev/null and b/org.eclipse.mylyn.trac.ui/icons/etool16/task-repository.gif differ
diff --git a/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-critical.gif b/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-critical.gif
new file mode 100644
index 0000000..41497b1
Binary files /dev/null and b/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-critical.gif differ
diff --git a/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-enhancement.gif b/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-enhancement.gif
new file mode 100644
index 0000000..9a75b1e
Binary files /dev/null and b/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-enhancement.gif differ
diff --git a/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-trac.gif b/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-trac.gif
new file mode 100644
index 0000000..75b4f5c
Binary files /dev/null and b/org.eclipse.mylyn.trac.ui/icons/eview16/overlay-trac.gif differ
diff --git a/org.eclipse.mylyn.trac.ui/icons/eview16/trac-icon.gif b/org.eclipse.mylyn.trac.ui/icons/eview16/trac-icon.gif
new file mode 100644
index 0000000..5e1056a
Binary files /dev/null and b/org.eclipse.mylyn.trac.ui/icons/eview16/trac-icon.gif differ
diff --git a/org.eclipse.mylyn.trac.ui/plugin.properties b/org.eclipse.mylyn.trac.ui/plugin.properties
new file mode 100644
index 0000000..5a13a96
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/plugin.properties
@@ -0,0 +1,9 @@
+#Properties file for org.eclipse.mylyn.trac.ui
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn Trac Connector UI
+
+repository.name = Trac Repository
+TracRepositoryConnector.name = Trac Connector Core
+TracConnectorUi.name = Trac Connector UI
+
+TracHyperlinkDetector.name = Trac Links
diff --git a/org.eclipse.mylyn.trac.ui/plugin.xml b/org.eclipse.mylyn.trac.ui/plugin.xml
new file mode 100644
index 0000000..33369b2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/plugin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension
+ id="org.eclipse.mylyn.trac.repository"
+ name="%repository.name"
+ point="org.eclipse.mylyn.tasks.ui.repositories">
+ <connectorCore
+ class="org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector"
+ id="trac"
+ name="%TracRepositoryConnector.name"/>
+ <connectorUi
+ brandingIcon="icons/eview16/trac-icon.gif"
+ class="org.eclipse.mylyn.internal.trac.ui.TracConnectorUi"
+ id="trac"
+ name="%TracConnectorUi.name"
+ overlayIcon="icons/eview16/overlay-trac.gif"/>
+ <taskListMigrator
+ class="org.eclipse.mylyn.internal.trac.ui.TracTaskListMigrator">
+ </taskListMigrator>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.tasks.core.templates">
+ <repository
+ addAutomatically="false"
+ anonymous="true"
+ label="Edgewall"
+ repositoryKind="trac"
+ urlRepository="http://trac.edgewall.org"
+ version="TRAC_0_9"/>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.editors">
+ <pageFactory
+ class="org.eclipse.mylyn.internal.trac.ui.editor.TracTaskEditorPageFactory"
+ id="org.eclipse.mylyn.trac.ui.pageFactory">
+ </pageFactory>
+ </extension>
+ <extension
+ point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+ <hyperlinkDetector
+ class="org.eclipse.mylyn.internal.trac.ui.TracHyperlinkDetector"
+ id="org.eclipse.mylyn.trac.ui.hyperlinksDetectors.Trac"
+ name="%TracHyperlinkDetector.name"
+ targetId="org.eclipse.mylyn.tasks.ui.TaskEditor">
+ </hyperlinkDetector>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/Messages.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/Messages.java
new file mode 100644
index 0000000..5825d3b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/Messages.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.trac.ui.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TracConnectorUi_Replying_to__comment_X_X_;
+
+ public static String TracConnectorUi_Replying_to__comment_ticket_X_X_X_;
+
+ public static String TracConnectorUi_Replying_to__ticket_X_X_;
+
+ public static String TracConnectorUi_Ticket;
+
+ public static String WebHyperlink_Open_URL_X;
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java
new file mode 100644
index 0000000..4b44e76
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracConnectorUi.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector.TaskKind;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.ui.wizard.TracQueryPage;
+import org.eclipse.mylyn.internal.trac.ui.wizard.TracRepositorySettingsPage;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskComment;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.LegendElement;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskSearchPage;
+import org.eclipse.mylyn.tasks.ui.wizards.NewTaskWizard;
+import org.eclipse.mylyn.tasks.ui.wizards.NewWebTaskWizard;
+import org.eclipse.mylyn.tasks.ui.wizards.RepositoryQueryWizard;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class TracConnectorUi extends AbstractRepositoryConnectorUi {
+
+ @SuppressWarnings("restriction")
+ public TracConnectorUi() {
+ org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getDefault().addSearchHandler(new TracSearchHandler());
+ }
+
+ @Override
+ public IHyperlink[] findHyperlinks(TaskRepository repository, String text, int lineOffset, int regionOffset) {
+ return TracHyperlinkUtil.findTicketHyperlinks(repository, text, lineOffset, regionOffset);
+ }
+
+ @Override
+ public String getTaskKindLabel(ITask repositoryTask) {
+ return Messages.TracConnectorUi_Ticket;
+ }
+
+ @Override
+ public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) {
+ return new TracRepositorySettingsPage(taskRepository);
+ }
+
+ @Override
+ public ITaskSearchPage getSearchPage(TaskRepository repository, IStructuredSelection selection) {
+ return new TracQueryPage(repository);
+ }
+
+ @Override
+ public boolean hasSearchPage() {
+ return true;
+ }
+
+ @Override
+ public IWizard getNewTaskWizard(TaskRepository repository, ITaskMapping selection) {
+ if (TracRepositoryConnector.hasRichEditor(repository)) {
+ return new NewTaskWizard(repository, selection);
+ } else {
+ return new NewWebTaskWizard(repository, repository.getRepositoryUrl() + ITracClient.NEW_TICKET_URL,
+ selection);
+ }
+ }
+
+ @Override
+ public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery query) {
+ RepositoryQueryWizard wizard = new RepositoryQueryWizard(repository);
+ wizard.addPage(new TracQueryPage(repository, query));
+ return wizard;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return TracCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public ImageDescriptor getTaskKindOverlay(ITask task) {
+ TaskKind taskKind = TaskKind.fromString(task.getTaskKind());
+ if (taskKind == TaskKind.DEFECT) {
+ return TracImages.OVERLAY_DEFECT;
+ } else if (taskKind == TaskKind.ENHANCEMENT) {
+ return TracImages.OVERLAY_ENHANCEMENT;
+ } else if (taskKind == TaskKind.TASK) {
+ return null;
+ }
+ return super.getTaskKindOverlay(task);
+ }
+
+ @Override
+ public List<LegendElement> getLegendElements() {
+ List<LegendElement> legendItems = new ArrayList<LegendElement>();
+ legendItems.add(LegendElement.createTask(TaskKind.DEFECT.toString(), TracImages.OVERLAY_DEFECT));
+ legendItems.add(LegendElement.createTask(TaskKind.ENHANCEMENT.toString(), TracImages.OVERLAY_ENHANCEMENT));
+ legendItems.add(LegendElement.createTask(TaskKind.TASK.toString(), null));
+ return legendItems;
+ }
+
+ @Override
+ public String getReplyText(TaskRepository taskRepository, ITask task, ITaskComment taskComment, boolean includeTask) {
+ if (taskComment == null) {
+ return NLS.bind(Messages.TracConnectorUi_Replying_to__ticket_X_X_, task.getTaskKey(), task.getOwner());
+ } else if (includeTask) {
+ return NLS.bind(Messages.TracConnectorUi_Replying_to__comment_ticket_X_X_X_, new Object[] {
+ task.getTaskKey(), taskComment.getNumber(), taskComment.getAuthor().getPersonId() });
+ } else {
+ return NLS.bind(Messages.TracConnectorUi_Replying_to__comment_X_X_, taskComment.getNumber(),
+ taskComment.getAuthor().getPersonId());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java
new file mode 100644
index 0000000..c8a0336
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkDetector.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import java.util.List;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracHyperlinkDetector extends AbstractTaskHyperlinkDetector {
+
+ public TracHyperlinkDetector() {
+ }
+
+ @Override
+ protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int index, int contentOffset) {
+ TaskRepository taskRepository = getTaskRepository(textViewer);
+ if (taskRepository != null && TracCorePlugin.CONNECTOR_KIND.equals(taskRepository.getConnectorKind())) {
+ return TracHyperlinkUtil.findTracHyperlinks(taskRepository, content, index, contentOffset);
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java
new file mode 100644
index 0000000..bfb6a44
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracHyperlinkUtil.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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
+ * David Green - fix for bug 244017
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.ui;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+
+/**
+ * Utility class for detecting Trac hyperlinks.
+ *
+ * @author Steffen Pingel
+ * @author David Green partial fix hyperlink detection on {{{ see bug 265682
+ */
+public class TracHyperlinkUtil {
+
+ static Pattern ticketPattern = createPattern("(ticket:|#)(\\d+)"); //$NON-NLS-1$
+
+ static Pattern commentPattern = createPattern("comment:ticket:(\\d+):(\\d+)"); //$NON-NLS-1$
+
+ static Pattern reportPattern1 = createPattern("report:(\\d+)"); //$NON-NLS-1$
+
+ static Pattern reportPattern2 = Pattern.compile("(?<!!|\\{\\{)\\{(\\d+)\\}"); //$NON-NLS-1$
+
+ static Pattern changesetPattern1 = createPattern("(r|changeset:)(\\d+)(/\\w+)?"); //$NON-NLS-1$
+
+ static Pattern changesetPattern2 = createPattern("\\[(\\d+)(/\\w+)?\\]"); //$NON-NLS-1$
+
+ static Pattern revisionLogPattern1 = createPattern("r(\\d+):(\\d+)"); //$NON-NLS-1$
+
+ static Pattern revisionLogPattern2 = createPattern("\\[(\\d+):(\\d+)\\]"); //$NON-NLS-1$
+
+ static Pattern revisionLogPattern3 = createPattern("log:(\\w+)?@(\\d+):(\\d+)"); //$NON-NLS-1$
+
+ static Pattern diffPattern1 = createPattern("diff:@(\\d+):(\\d+)"); //$NON-NLS-1$
+
+ static Pattern diffPattern2 = createPattern("diff:([\\w\\./-]+)(@(\\d+))?//([\\w\\./-]+)(@(\\d+))?"); //$NON-NLS-1$
+
+ static Pattern wikiPattern1 = createPattern("wiki:(\\w+)"); //$NON-NLS-1$
+
+ static Pattern wikiPattern2 = Pattern.compile("(?<![!.a-z])[A-Z][a-z0-9]+[A-Z]\\w*"); //$NON-NLS-1$
+
+ static Pattern milestonePattern = createPattern("milestone:([\\w\\.]+)"); //$NON-NLS-1$
+
+ static Pattern attachmentPattern = createPattern("attachment:ticket:(\\d+):([\\w\\.]+)"); //$NON-NLS-1$
+
+ static Pattern filesPattern = createPattern("source:/*([\\w\\./\\-_]+)(@(\\d+)(#L(\\d+))?)?"); //$NON-NLS-1$
+
+ private static Pattern createPattern(String regexp) {
+ // hyperlink patterns prefixed with "!" are not links
+ return Pattern.compile("(?<!!)" + regexp); //$NON-NLS-1$
+ }
+
+ /**
+ * Detects hyperlinks to Trac tickets.
+ */
+ public static IHyperlink[] findTicketHyperlinks(TaskRepository repository, String text, int lineOffset,
+ int regionOffset) {
+ List<IHyperlink> links = null;
+ Matcher m = ticketPattern.matcher(text);
+ while (m.find()) {
+ if (isInRegion(lineOffset, m)) {
+ String id = m.group(2);
+ if (links == null) {
+ links = new ArrayList<IHyperlink>();
+ }
+ links.add(new TaskHyperlink(determineRegion(regionOffset, m), repository, id));
+ }
+ }
+ return links == null ? null : links.toArray(new IHyperlink[0]);
+ }
+
+ /**
+ * Detects Trac hyperlinks.
+ *
+ * <ul>
+ * <li>Ticket comments: comment:ticket:1:2
+ * <li>Reports: {1} or report:1
+ * <li>Changesets: r1, [1], changeset:1 or (restricted) [1/trunk], changeset:1/trunk
+ * <li>Revision log: r1:3, [1:3] or log:@1:3, log:trunk at 1:3
+ * <li>Diffs: diff:@1:3, diff:tags/trac-0.9.2/wiki-default//tags/trac-0.9.3/wiki-default or
+ * diff:trunk/trac at 3538//sandbox/vc-refactoring at 3539
+ * <li>Wiki pages: CamelCase or wiki:CamelCase
+ * <li>Milestones: milestone:1.0
+ * <li>Attachment: attachment:ticket:944:attachment.1073.diff
+ * <li>Files: source:trunk/COPYING
+ * <li>A specific file revision: source:/trunk/COPYING at 200
+ * <li>A particular line of a specific file revision: source:/trunk/COPYING at 200#L25
+ * </ul>
+ *
+ * @see http://trac.edgewall.org/wiki/TracLinks
+ */
+ public static List<IHyperlink> findTracHyperlinks(TaskRepository repository, String text, int offsetInText,
+ int textOffset) {
+ List<IHyperlink> links = new ArrayList<IHyperlink>();
+
+ Matcher m = commentPattern.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String id = m.group(1);
+ // String comment = m.group(2);
+ links.add(new TaskHyperlink(determineRegion(textOffset, m), repository, id));
+ }
+ }
+
+ m = reportPattern1.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String id = m.group(1);
+ links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl()
+ + ITracClient.REPORT_URL + id));
+ }
+ }
+
+ m = reportPattern2.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String id = m.group(1);
+ links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl()
+ + ITracClient.REPORT_URL + id));
+ }
+ }
+
+ m = revisionLogPattern1.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String rev = m.group(1);
+ String stopRev = m.group(2);
+ String url = repository.getRepositoryUrl() + ITracClient.REVISION_LOG_URL + "?rev=" + rev //$NON-NLS-1$
+ + "&stop_rev=" + stopRev; //$NON-NLS-1$
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = revisionLogPattern2.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String rev = m.group(1);
+ String stopRev = m.group(2);
+ String url = repository.getRepositoryUrl() + ITracClient.REVISION_LOG_URL + "?rev=" + rev //$NON-NLS-1$
+ + "&stop_rev=" + stopRev; //$NON-NLS-1$
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = revisionLogPattern3.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String branch = m.group(1);
+ String rev = m.group(2);
+ String stopRev = m.group(3);
+ String url = repository.getRepositoryUrl() + ITracClient.REVISION_LOG_URL;
+ if (branch != null) {
+ url += branch;
+ }
+ url += "?rev=" + rev + "&stop_rev=" + stopRev; //$NON-NLS-1$ //$NON-NLS-2$
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = changesetPattern1.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String rev = m.group(2);
+ String branch = m.group(3);
+ String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL + rev;
+ if (branch != null) {
+ url += branch;
+ }
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = changesetPattern2.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String rev = m.group(1);
+ String branch = m.group(2);
+ String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL + rev;
+ if (branch != null) {
+ url += branch;
+ }
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = diffPattern1.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String old_rev = m.group(1);
+ String new_rev = m.group(2);
+ String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL;
+ url += "?new=" + new_rev + "&old=" + old_rev; //$NON-NLS-1$ //$NON-NLS-2$
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = diffPattern2.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String old_path = m.group(1);
+ String old_rev = m.group(3);
+ String new_path = m.group(4);
+ String new_rev = m.group(6);
+ String url = repository.getRepositoryUrl() + ITracClient.CHANGESET_URL;
+ try {
+ url += "?new_path=" + URLEncoder.encode(new_path, "UTF-8"); //$NON-NLS-1$ //$NON-NLS-2$
+ url += "&old_path=" + URLEncoder.encode(old_path, "UTF-8"); //$NON-NLS-1$ //$NON-NLS-2$
+ } catch (UnsupportedEncodingException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, TracUiPlugin.ID_PLUGIN, "Unexcpected exception", e)); //$NON-NLS-1$
+ continue;
+ }
+ if (new_rev != null) {
+ url += "&new=" + new_rev; //$NON-NLS-1$
+ }
+ if (old_rev != null) {
+ url += "&old=" + old_rev; //$NON-NLS-1$
+ }
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ m = wikiPattern1.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String page = m.group(1);
+ links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl()
+ + ITracClient.WIKI_URL + page));
+ }
+ }
+
+ m = wikiPattern2.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String page = m.group(0);
+ links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl()
+ + ITracClient.WIKI_URL + page));
+ }
+ }
+
+ m = milestonePattern.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String milestone = m.group(1);
+ links.add(new WebHyperlink(determineRegion(textOffset, m), repository.getRepositoryUrl()
+ + ITracClient.MILESTONE_URL + milestone));
+ }
+ }
+
+ m = attachmentPattern.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String id = m.group(1);
+ // String attachment = m.group(2);
+ links.add(new TaskHyperlink(determineRegion(textOffset, m), repository, id));
+ }
+ }
+
+ m = filesPattern.matcher(text);
+ while (m.find()) {
+ if (isInRegion(offsetInText, m)) {
+ String filename = m.group(1);
+ String rev = m.group(3);
+ String line = m.group(5);
+ String url = repository.getRepositoryUrl() + ITracClient.BROWSER_URL + filename;
+ if (rev != null) {
+ url += "?rev=" + rev; //$NON-NLS-1$
+ if (line != null) {
+ url += "#L" + line; //$NON-NLS-1$
+ }
+ }
+ links.add(new WebHyperlink(determineRegion(textOffset, m), url));
+ }
+ }
+
+ return links;
+ }
+
+ private static boolean isInRegion(int offsetInText, Matcher m) {
+ return (offsetInText == -1) || (offsetInText >= m.start() && offsetInText <= m.end());
+ }
+
+ private static IRegion determineRegion(int textOffset, Matcher m) {
+ return new Region(textOffset + m.start(), m.end() - m.start());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracImages.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracImages.java
new file mode 100644
index 0000000..b783ce2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracImages.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class TracImages {
+
+ private static final URL baseURL = TracUiPlugin.getDefault().getBundle().getEntry("/icons/"); //$NON-NLS-1$
+
+ public static final String T_VIEW = "eview16"; //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_DEFECT = create(T_VIEW, "overlay-critical.gif"); //$NON-NLS-1$
+
+ public static final ImageDescriptor OVERLAY_ENHANCEMENT = create(T_VIEW, "overlay-enhancement.gif"); //$NON-NLS-1$
+
+ private static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuilder buffer = new StringBuilder(prefix);
+ if (prefix != "") { //$NON-NLS-1$
+ buffer.append('/');
+ }
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracSearchHandler.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracSearchHandler.java
new file mode 100644
index 0000000..5f99531
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracSearchHandler.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractSearchHandler;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+ at SuppressWarnings("restriction")
+public class TracSearchHandler extends AbstractSearchHandler {
+
+ @Override
+ public String getConnectorKind() {
+ return TracCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public boolean queryForText(TaskRepository taskRepository, IRepositoryQuery query, TaskData taskData,
+ String searchString) {
+ TracSearchFilter filter = new TracSearchFilter("description"); //$NON-NLS-1$
+ filter.setOperator(CompareOperator.CONTAINS);
+ filter.addValue(searchString);
+
+ TracSearch search = new TracSearch();
+ search.addFilter(filter);
+
+ // TODO copied from TracQueryPage.getQueryUrl()
+ StringBuilder sb = new StringBuilder();
+ sb.append(taskRepository.getRepositoryUrl());
+ sb.append(ITracClient.QUERY_URL);
+ sb.append(search.toUrl());
+
+ query.setUrl(sb.toString());
+
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListMigrator.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListMigrator.java
new file mode 100644
index 0000000..6964955
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracTaskListMigrator.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.w3c.dom.Element;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskListMigrator extends AbstractTaskListMigrator {
+
+ private static final String KEY_TRAC = "Trac"; //$NON-NLS-1$
+
+ private static final String KEY_TRAC_TASK = KEY_TRAC + KEY_TASK;
+
+ private static final String KEY_TRAC_QUERY = KEY_TRAC + KEY_QUERY;
+
+ private static final String KEY_SUPPORTS_SUBTASKS = "SupportsSubtasks"; //$NON-NLS-1$
+
+ @Override
+ public String getConnectorKind() {
+ return TracCorePlugin.CONNECTOR_KIND;
+ }
+
+ @Override
+ public String getTaskElementName() {
+ return KEY_TRAC_TASK;
+ }
+
+ @Override
+ public Set<String> getQueryElementNames() {
+ Set<String> names = new HashSet<String>();
+ names.add(KEY_TRAC_QUERY);
+ return names;
+ }
+
+ @Override
+ public void migrateQuery(IRepositoryQuery query, Element element) {
+ // nothing to do
+ }
+
+ @Override
+ public void migrateTask(ITask task, Element element) {
+ String lastModDate = element.getAttribute(KEY_LAST_MOD_DATE);
+ task.setModificationDate(TracUtil.parseDate(lastModDate));
+ task.setAttribute(TracRepositoryConnector.TASK_KEY_UPDATE_DATE, lastModDate);
+ if (element.hasAttribute(KEY_SUPPORTS_SUBTASKS)) {
+ task.setAttribute(TracRepositoryConnector.TASK_KEY_SUPPORTS_SUBTASKS, Boolean.valueOf(
+ element.getAttribute(KEY_SUPPORTS_SUBTASKS)).toString());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java
new file mode 100644
index 0000000..d39701d
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/TracUiPlugin.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.tasks.ui.TaskRepositoryLocationUiFactory;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Mik Kersten
+ * @author Steffen Pingel
+ */
+public class TracUiPlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.trac.ui"; //$NON-NLS-1$
+
+ private static TracUiPlugin plugin;
+
+ public TracUiPlugin() {
+ plugin = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+
+ TracCorePlugin.getDefault().getConnector().setTaskRepositoryLocationFactory(
+ new TaskRepositoryLocationUiFactory());
+ TasksUi.getRepositoryManager().addListener(TracCorePlugin.getDefault().getConnector().getClientManager());
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ TasksUi.getRepositoryManager().removeListener(TracCorePlugin.getDefault().getConnector().getClientManager());
+
+ plugin = null;
+ super.stop(context);
+ }
+
+ public static TracUiPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/WebHyperlink.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/WebHyperlink.java
new file mode 100644
index 0000000..a6bf140
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/WebHyperlink.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * Encapsulates link from text to a URL.
+ *
+ * @author Steffen Pingel
+ * @since 2.0
+ */
+public class WebHyperlink implements IHyperlink {
+
+ private final IRegion region;
+
+ private final String url;
+
+ public WebHyperlink(IRegion region, String url) {
+ this.region = region;
+ this.url = url;
+ }
+
+ public IRegion getHyperlinkRegion() {
+ return region;
+ }
+
+ public String getTypeLabel() {
+ return null;
+ }
+
+ public String getHyperlinkText() {
+ return MessageFormat.format(Messages.WebHyperlink_Open_URL_X, url);
+ }
+
+ public void open() {
+ TasksUiUtil.openTask(url);
+ }
+
+ public String getURLString() {
+ return url;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/Messages.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/Messages.java
new file mode 100644
index 0000000..7ec02f4
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.ui.editor;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.trac.ui.editor.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TracPeoplePart_People;
+ public static String TracPeoplePart__Select_to_remove_;
+
+ public static String TracTaskEditorPageFactory_Browser;
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracCcAttributeEditor.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracCcAttributeEditor.java
new file mode 100644
index 0000000..df787ef
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracCcAttributeEditor.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.editor;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
+import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * @author Rob Elves
+ */
+public class TracCcAttributeEditor extends AbstractAttributeEditor {
+
+ private List list;
+
+ private TaskAttribute attrRemoveCc;
+
+ public TracCcAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
+ super(manager, taskAttribute);
+ setLayoutHint(new LayoutHint(RowSpan.MULTIPLE, ColumnSpan.SINGLE));
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ list = new List(parent, SWT.FLAT | SWT.MULTI | SWT.V_SCROLL);
+ toolkit.adapt(list, true, true);
+ list.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ list.setFont(JFaceResources.getDefaultFont());
+ GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(list);
+
+ TaskAttribute attrUserCC = getTaskAttribute();
+ if (attrUserCC != null) {
+ for (String value : attrUserCC.getValues()) {
+ list.add(value);
+ }
+ }
+
+ attrRemoveCc = getModel().getTaskData().getRoot().getMappedAttribute(TracAttributeMapper.REMOVE_CC);
+ for (String item : attrRemoveCc.getValues()) {
+ int i = list.indexOf(item);
+ if (i != -1) {
+ list.select(i);
+ }
+ }
+
+ list.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ for (String cc : list.getItems()) {
+ int index = list.indexOf(cc);
+ if (list.isSelected(index)) {
+ java.util.List<String> remove = attrRemoveCc.getValues();
+ if (!remove.contains(cc)) {
+ attrRemoveCc.addValue(cc);
+ }
+ } else {
+ attrRemoveCc.removeValue(cc);
+ }
+ }
+ getModel().attributeChanged(attrRemoveCc);
+ }
+ });
+
+ list.showSelection();
+
+ setControl(list);
+ }
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracPeoplePart.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracPeoplePart.java
new file mode 100644
index 0000000..4345965
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracPeoplePart.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.editor;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.mylyn.internal.trac.core.TracAttribute;
+import org.eclipse.mylyn.internal.trac.core.TracAttributeMapper;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author Robert Elves
+ */
+public class TracPeoplePart extends AbstractTaskEditorPart {
+
+ private static final int COLUMN_MARGIN = 5;
+
+ public TracPeoplePart() {
+ setPartName(Messages.TracPeoplePart_People);
+ }
+
+ private void addAttribute(Composite composite, FormToolkit toolkit, TaskAttribute attribute) {
+ AbstractAttributeEditor editor = createAttributeEditor(attribute);
+ if (editor != null) {
+ editor.createLabelControl(composite, toolkit);
+ GridDataFactory.defaultsFor(editor.getLabelControl()).indent(COLUMN_MARGIN, 0).applyTo(
+ editor.getLabelControl());
+ editor.createControl(composite, toolkit);
+ getTaskEditorPage().getAttributeEditorToolkit().adapt(editor);
+ if (editor instanceof TracCcAttributeEditor) {
+ GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).hint(130, 95).applyTo(
+ editor.getControl());
+ } else {
+ GridDataFactory.fillDefaults().grab(true, false).align(SWT.FILL, SWT.TOP).applyTo(editor.getControl());
+ }
+ }
+ }
+
+ @Override
+ public void createControl(Composite parent, FormToolkit toolkit) {
+ Section section = createSection(parent, toolkit, true);
+ Composite peopleComposite = toolkit.createComposite(section);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginWidth = 5;
+ peopleComposite.setLayout(layout);
+
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TaskAttribute.USER_REPORTER));
+ addAttribute(peopleComposite, toolkit, getTaskData().getRoot().getMappedAttribute(TracAttributeMapper.NEW_CC));
+ addSelfToCC(peopleComposite);
+ TaskAttribute cc = getTaskData().getRoot().getMappedAttribute(TracAttribute.CC.getTaskKey());
+ TaskAttribute removeCc = getTaskData().getRoot().getMappedAttribute(TracAttributeMapper.REMOVE_CC);
+ if (cc != null && removeCc != null) {
+ addAttribute(peopleComposite, toolkit, cc);
+ toolkit.createLabel(peopleComposite, ""); //$NON-NLS-1$
+ Label label = toolkit.createLabel(peopleComposite, Messages.TracPeoplePart__Select_to_remove_);
+ GridDataFactory.fillDefaults().indent(0, 5).align(SWT.CENTER, SWT.CENTER).applyTo(label);
+ }
+
+ toolkit.paintBordersFor(peopleComposite);
+ section.setClient(peopleComposite);
+ setSection(toolkit, section);
+ }
+
+ /**
+ * Creates a check box for adding the repository user to the cc list. Does nothing if the repository does not have a
+ * valid username, the repository user is the assignee, reporter or already on the the cc list.
+ */
+ private void addSelfToCC(Composite composite) {
+ TaskRepository repository = this.getTaskEditorPage().getTaskRepository();
+ if (repository.getUserName() == null) {
+ return;
+ }
+
+ TaskAttribute root = getTaskData().getRoot();
+ TaskAttribute owner = root.getMappedAttribute(TaskAttribute.USER_ASSIGNED);
+ if (owner != null && owner.getValue().indexOf(repository.getUserName()) != -1) {
+ return;
+ }
+
+ TaskAttribute reporter = root.getMappedAttribute(TaskAttribute.USER_REPORTER);
+ if (reporter != null && reporter.getValue().indexOf(repository.getUserName()) != -1) {
+ return;
+ }
+
+ TaskAttribute ccAttribute = root.getMappedAttribute(TaskAttribute.USER_CC);
+ if (ccAttribute != null && ccAttribute.getValues().contains(repository.getUserName())) {
+ return;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracRenderingEngine.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracRenderingEngine.java
new file mode 100644
index 0000000..493e5b2
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracRenderingEngine.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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:
+ * Xiaoyang Guan - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.ui.editor;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.TracXmlRpcClient;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine;
+
+/**
+ *
+ * @author Xiaoyang Guan
+ * @since 2.1
+ */
+public class TracRenderingEngine extends AbstractRenderingEngine {
+
+ /**
+ * generate HTML preview page for <code>text</code>
+ */
+ @Override
+ public String renderAsHtml(TaskRepository repository, String text, IProgressMonitor monitor) throws CoreException {
+ monitor.beginTask("Render HTML Preview", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
+ try {
+ ITracClient client = TracCorePlugin.getDefault()
+ .getConnector()
+ .getClientManager()
+ .getTracClient(repository);
+ if (client instanceof TracXmlRpcClient) {
+ TracXmlRpcClient tracXmlRpcClient = (TracXmlRpcClient) client;
+ String htmlText = tracXmlRpcClient.wikiToHtml(text, monitor);
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+
+ String htmlHeader = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" //$NON-NLS-1$
+ + "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">" //$NON-NLS-1$
+ + "<head>" //$NON-NLS-1$
+ + "<link rel=\"stylesheet\" href=\"REPOSITORY_URL/chrome/common/css/trac.css\" type=\"text/css\" />" //$NON-NLS-1$
+ + "<link rel=\"stylesheet\" href=\"REPOSITORY_URL/chrome/common/css/wiki.css\" type=\"text/css\" />" //$NON-NLS-1$
+ + "<link rel=\"icon\" href=\"REPOSITORY_URL/chrome/common/trac.ico\" type=\"image/x-icon\" />" //$NON-NLS-1$
+ + "<link rel=\"shortcut icon\" href=\"EPOSITORY_URL/chrome/common/trac.ico\" type=\"image/x-icon\" />" //$NON-NLS-1$
+ + "<style type=\"text/css\">body {background: #f4f4f4 url(REPOSITORY_URL/chrome/common/draft.png);margin: 0;padding: 0;}</style>" //$NON-NLS-1$
+ + "</head>"; //$NON-NLS-1$
+ String htmlBody = "<body> " + htmlText + "</body>"; //$NON-NLS-1$ //$NON-NLS-2$
+ String htmlFooter = "</html>"; //$NON-NLS-1$
+
+ String html = htmlHeader.replace("REPOSITORY_URL", repository.getRepositoryUrl()) + htmlBody //$NON-NLS-1$
+ + htmlFooter;
+ return html;
+ } else {
+ throw new CoreException(TracCorePlugin.toStatus(new TracException(
+ "Preview is available only in XML-RPC access mode"), repository)); //$NON-NLS-1$
+ }
+ } catch (TracException e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, repository));
+ } finally {
+ monitor.done();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPage.java
new file mode 100644
index 0000000..5a5783a
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPage.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.editor;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.trac.core.TracAttribute;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPage;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPart;
+import org.eclipse.mylyn.tasks.ui.editors.AttributeEditorFactory;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorPartDescriptor;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskEditorPage extends AbstractTaskEditorPage {
+
+ private TracRenderingEngine renderingEngine;
+
+ public TracTaskEditorPage(TaskEditor editor) {
+ super(editor, TracCorePlugin.CONNECTOR_KIND);
+ setNeedsPrivateSection(true);
+ setNeedsSubmitButton(true);
+ }
+
+ @Override
+ protected Set<TaskEditorPartDescriptor> createPartDescriptors() {
+ Set<TaskEditorPartDescriptor> descriptors = super.createPartDescriptors();
+ // remove unnecessary default editor parts
+ for (Iterator<TaskEditorPartDescriptor> it = descriptors.iterator(); it.hasNext();) {
+ TaskEditorPartDescriptor taskEditorPartDescriptor = it.next();
+ if (taskEditorPartDescriptor.getId().equals(ID_PART_PEOPLE)) {
+ it.remove();
+ }
+ }
+ descriptors.add(new TaskEditorPartDescriptor(ID_PART_PEOPLE) {
+ @Override
+ public AbstractTaskEditorPart createPart() {
+ return new TracPeoplePart();
+ }
+ }.setPath(PATH_PEOPLE));
+ return descriptors;
+ }
+
+ @Override
+ protected void createParts() {
+ if (renderingEngine == null) {
+ renderingEngine = new TracRenderingEngine();
+ }
+ getAttributeEditorToolkit().setRenderingEngine(renderingEngine);
+ super.createParts();
+ }
+
+ @Override
+ protected AttributeEditorFactory createAttributeEditorFactory() {
+ AttributeEditorFactory factory = new AttributeEditorFactory(getModel(), getTaskRepository(), getEditorSite()) {
+ @Override
+ public AbstractAttributeEditor createEditor(String type, TaskAttribute taskAttribute) {
+ if (TracAttribute.CC.getTracKey().equals(taskAttribute.getId())) {
+ return new TracCcAttributeEditor(getModel(), taskAttribute);
+ }
+ return super.createEditor(type, taskAttribute);
+ }
+ };
+ return factory;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPageFactory.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPageFactory.java
new file mode 100644
index 0000000..150299b
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/TracTaskEditorPageFactory.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.editor;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.mylyn.tasks.ui.editors.BrowserFormPage;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.forms.editor.FormPage;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracTaskEditorPageFactory extends AbstractTaskEditorPageFactory {
+
+ @Override
+ public boolean canCreatePageFor(TaskEditorInput input) {
+ if (input.getTask().getConnectorKind().equals(TracCorePlugin.CONNECTOR_KIND)) {
+ return true;
+ } else if (TasksUiUtil.isOutgoingNewTask(input.getTask(), TracCorePlugin.CONNECTOR_KIND)) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public FormPage createPage(TaskEditor parentEditor) {
+ TaskEditorInput input = parentEditor.getTaskEditorInput();
+ if (TasksUiUtil.isOutgoingNewTask(input.getTask(), TracCorePlugin.CONNECTOR_KIND)) {
+ return new TracTaskEditorPage(parentEditor);
+ } else if (TracRepositoryConnector.hasRichEditor(input.getTaskRepository())) {
+ return new TracTaskEditorPage(parentEditor);
+ } else {
+ return new BrowserFormPage(parentEditor, Messages.TracTaskEditorPageFactory_Browser);
+ }
+ }
+
+ @Override
+ public String[] getConflictingIds(TaskEditorInput input) {
+ if (TracRepositoryConnector.hasRichEditor(input.getTaskRepository())
+ || TasksUiUtil.isOutgoingNewTask(input.getTask(), TracCorePlugin.CONNECTOR_KIND)) {
+ return new String[] { ITasksUiConstants.ID_PAGE_PLANNING };
+ } else {
+ return super.getConflictingIds(input);
+ }
+ }
+
+ @Override
+ public Image getPageImage() {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY_SMALL);
+ }
+
+ @Override
+ public String getPageText() {
+ return "Trac"; //$NON-NLS-1$
+ }
+
+ @Override
+ public int getPriority() {
+ return PRIORITY_TASK;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/messages.properties b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/messages.properties
new file mode 100644
index 0000000..9375dba
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/editor/messages.properties
@@ -0,0 +1,4 @@
+TracPeoplePart_People=People
+TracPeoplePart__Select_to_remove_=(Select to remove)
+
+TracTaskEditorPageFactory_Browser=Browser
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/messages.properties b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/messages.properties
new file mode 100644
index 0000000..49118f3
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/messages.properties
@@ -0,0 +1,6 @@
+TracConnectorUi_Replying_to__comment_X_X_=Replying to [comment:{0} {1}]:
+TracConnectorUi_Replying_to__comment_ticket_X_X_X_=Replying to [comment:ticket:{0}:{1} {2}]:
+TracConnectorUi_Replying_to__ticket_X_X_=Replying to [ticket:{0} {1}]:
+TracConnectorUi_Ticket=Ticket
+
+WebHyperlink_Open_URL_X=Open URL {0}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/Messages.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/Messages.java
new file mode 100644
index 0000000..0d40bbb
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/Messages.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.trac.ui.wizard;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.trac.ui.wizard.messages"; //$NON-NLS-1$
+
+ static {
+ // load message values from bundle file
+ reloadMessages();
+ }
+
+ public static void reloadMessages() {
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ public static String TracFilterQueryPage_Add_search_filters_to_define_query;
+
+ public static String TracFilterQueryPage_CC;
+
+ public static String TracFilterQueryPage_Component;
+
+ public static String TracFilterQueryPage_Keywords;
+
+ public static String TracFilterQueryPage_Milestone;
+
+ public static String TracFilterQueryPage_New_Trac_Query;
+
+ public static String TracFilterQueryPage_or;
+
+ public static String TracFilterQueryPage_Owner;
+
+ public static String TracFilterQueryPage_Priority;
+
+ public static String TracFilterQueryPage_Query_Title;
+
+ public static String TracFilterQueryPage_Reporter;
+
+ public static String TracFilterQueryPage_Resolution;
+
+ public static String TracFilterQueryPage_Select_to_add_filter;
+
+ public static String TracFilterQueryPage_Status;
+
+ public static String TracFilterQueryPage_Summary;
+
+ public static String TracFilterQueryPage_Type;
+
+ public static String TracFilterQueryPage_Version;
+
+ public static String TracQueryPage_CC;
+
+ public static String TracQueryPage_Component;
+
+ public static String TracQueryPage_Description;
+
+ public static String TracQueryPage_Enter_query_parameters;
+
+ public static String TracQueryPage_If_attributes_are_blank_or_stale_press_the_Update_button;
+
+ public static String TracQueryPage_Keywords;
+
+ public static String TracQueryPage_Milestone;
+
+ public static String TracQueryPage_No_repository_available;
+
+ public static String TracQueryPage_Owner;
+
+ public static String TracQueryPage_Priority;
+
+ public static String TracQueryPage_Query_Title;
+
+ public static String TracQueryPage_Reporter;
+
+ public static String TracQueryPage_Resolution;
+
+ public static String TracQueryPage_Status;
+
+ public static String TracQueryPage_Summary;
+
+ public static String TracQueryPage_Type;
+
+ public static String TracQueryPage_Update_Attributes_Failed;
+
+ public static String TracQueryPage_Update_Attributes_from_Repository;
+
+ public static String TracQueryPage_Version;
+
+ public static String TracRepositorySettingsPage_Access_Type_;
+
+ public static String TracRepositorySettingsPage_Authentication_credentials_are_valid;
+
+ public static String TracRepositorySettingsPage_Authentication_credentials_valid_Update_to_latest_XmlRpcPlugin_Warning;
+
+ public static String TracRepositorySettingsPage_Automatic__Use_Validate_Settings_;
+
+ public static String TracRepositorySettingsPage_EXAMPLE_HTTP_TRAC_EDGEWALL_ORG;
+
+ public static String TracRepositorySettingsPage_No_Trac_repository_found_at_url;
+
+ public static String TracRepositorySettingsPage_Trac_Repository_Settings;
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracFilterQueryPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracFilterQueryPage.java
new file mode 100644
index 0000000..18553c8
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracFilterQueryPage.java
@@ -0,0 +1,449 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.wizard;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.internal.trac.ui.TracUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracFilterQueryPage extends AbstractRepositoryQueryPage {
+
+ private static final String TITLE = Messages.TracFilterQueryPage_New_Trac_Query;
+
+ private static final String DESCRIPTION = Messages.TracFilterQueryPage_Add_search_filters_to_define_query;
+
+ private static final String TITLE_QUERY_TITLE = Messages.TracFilterQueryPage_Query_Title;
+
+ private Text titleText;
+
+ private Composite scrollComposite;
+
+ /* Maintain order of criterions in order to be able to restore this later. */
+ private final Set<SearchField> visibleSearchFields = new LinkedHashSet<SearchField>();
+
+ private List<SearchField> searchFields;
+
+ public TracFilterQueryPage(TaskRepository repository, IRepositoryQuery query) {
+ super(TITLE, repository, query);
+ setTitle(TITLE);
+ setDescription(DESCRIPTION);
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ query.setUrl(getQueryUrl(getTaskRepository().getRepositoryUrl()));
+ query.setSummary(getQueryTitle());
+ }
+
+ public void createControl(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayoutData(new GridData());
+ composite.setLayout(new GridLayout(1, false));
+
+ createTitleGroup(composite);
+
+ ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.V_SCROLL | SWT.BORDER);
+ GridData gd = new GridData(GridData.FILL, GridData.FILL, true, true);
+ scrolledComposite.setExpandHorizontal(true);
+ scrolledComposite.setLayoutData(gd);
+
+ scrollComposite = new Composite(scrolledComposite, SWT.None);
+ scrolledComposite.setContent(scrollComposite);
+ scrollComposite.setLayout(new GridLayout(4, false));
+
+ createAddFilterGroup(composite);
+
+ if (getQuery() != null) {
+ titleText.setText(getQuery().getSummary());
+ TracSearch search = TracUtil.toTracSearch(getQuery());
+ if (search != null) {
+ restoreWidgetValues(search);
+ }
+ }
+
+ Dialog.applyDialogFont(composite);
+ setControl(composite);
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return (titleText != null) ? titleText.getText() : null;
+ }
+
+ private void restoreWidgetValues(TracSearch search) {
+ List<TracSearchFilter> filters = search.getFilters();
+ for (TracSearchFilter filter : filters) {
+ SearchField field = getSearchField(filter.getFieldName());
+ if (field != null) {
+ showSearchField(field, filter);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TracUiPlugin.ID_PLUGIN,
+ "Ignoring invalid search filter: " + filter)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private SearchField getSearchField(String fieldName) {
+ for (SearchField searchField : searchFields) {
+ if (searchField.getFieldName().equals(fieldName)) {
+ return searchField;
+ }
+ }
+ return null;
+ }
+
+ private void createAddFilterGroup(Composite parent) {
+ GridLayout layout;
+ GridData gd;
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ layout = new GridLayout(2, false);
+ composite.setLayout(layout);
+ composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ gd = new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ composite.setLayoutData(gd);
+
+ Label label = new Label(composite, SWT.LEFT);
+ label.setText(Messages.TracFilterQueryPage_Select_to_add_filter);
+
+ // condition
+ final Combo filterCombo = new Combo(composite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
+
+ searchFields = new ArrayList<SearchField>();
+ searchFields.add(new TextSearchField("summary", Messages.TracFilterQueryPage_Summary)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("reporter", Messages.TracFilterQueryPage_Reporter)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("owner", Messages.TracFilterQueryPage_Owner)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("type", Messages.TracFilterQueryPage_Type)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("status", Messages.TracFilterQueryPage_Status)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("priority", Messages.TracFilterQueryPage_Priority)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("milestone", Messages.TracFilterQueryPage_Milestone)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("component", Messages.TracFilterQueryPage_Component)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("version", Messages.TracFilterQueryPage_Version)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("resoution", Messages.TracFilterQueryPage_Resolution)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("keywords", Messages.TracFilterQueryPage_Keywords)); //$NON-NLS-1$
+ searchFields.add(new TextSearchField("cc", Messages.TracFilterQueryPage_CC)); //$NON-NLS-1$
+
+ filterCombo.add(""); //$NON-NLS-1$
+ for (SearchField field : searchFields) {
+ filterCombo.add(field.getDisplayName());
+ }
+
+ filterCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ if (filterCombo.getText().length() > 0) {
+ SearchField field = searchFields.get(filterCombo.getSelectionIndex() - 1);
+ showSearchField(field, null);
+ filterCombo.setText(""); //$NON-NLS-1$
+ }
+ }
+ });
+ }
+
+ private void createTitleGroup(Composite composite) {
+ Group group = new Group(composite, SWT.NONE);
+ group.setText(TITLE_QUERY_TITLE);
+ group.setLayout(new GridLayout(1, false));
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ group.setLayoutData(gd);
+
+ titleText = new Text(group, SWT.BORDER);
+ gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ titleText.setLayoutData(gd);
+
+ titleText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ // ignore
+ }
+
+ public void keyReleased(KeyEvent e) {
+ getContainer().updateButtons();
+ }
+ });
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (titleText != null && titleText.getText().length() > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ private void showSearchField(SearchField field, TracSearchFilter filter) {
+ assert filter == null || !visibleSearchFields.contains(field);
+
+ if (!visibleSearchFields.contains(field)) {
+ field.createControls(scrollComposite, filter);
+ visibleSearchFields.add(field);
+ } else {
+ field.addControl(scrollComposite);
+ }
+ updateScrollPane();
+ }
+
+ public String getQueryUrl(String repsitoryUrl) {
+ TracSearch search = new TracSearch();
+ for (SearchField field : visibleSearchFields) {
+ search.addFilter(field.getFilter());
+ }
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(repsitoryUrl);
+ sb.append(ITracClient.QUERY_URL);
+ sb.append(search.toUrl());
+ return sb.toString();
+ }
+
+ private void hideSearchField(SearchField field) {
+ visibleSearchFields.remove(field);
+ }
+
+ private void updateScrollPane() {
+ scrollComposite.setSize(scrollComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ scrollComposite.layout();
+ }
+
+ private abstract class SearchField {
+
+ protected String fieldName;
+
+ private final String displayName;
+
+ public SearchField(String fieldName, String displayName) {
+ this.fieldName = fieldName;
+ this.displayName = displayName;
+ }
+
+ public abstract void createControls(Composite parent, TracSearchFilter filter);
+
+ public abstract void addControl(Composite parent);
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public abstract TracSearchFilter getFilter();
+
+ }
+
+ private class TextSearchField extends SearchField {
+
+ private final CompareOperator[] compareOperators = { CompareOperator.CONTAINS, CompareOperator.CONTAINS_NOT,
+ CompareOperator.BEGINS_WITH, CompareOperator.ENDS_WITH, CompareOperator.IS, CompareOperator.IS_NOT, };
+
+ private List<TextCriterion> criterions;
+
+ public TextSearchField(String fieldName, String displayName) {
+ super(fieldName, displayName);
+ }
+
+ @Override
+ public void createControls(Composite parent, TracSearchFilter filter) {
+ if (filter != null) {
+ TextCriterion first = addCriterion(parent);
+ first.setCondition(filter.getOperator());
+ List<String> values = filter.getValues();
+ if (!values.isEmpty()) {
+ first.setSearchText(values.get(0));
+ for (int i = 1; i < values.size(); i++) {
+ TextCriterion criterion = addCriterion(parent);
+ criterion.setSearchText(values.get(1));
+ }
+ }
+ } else {
+ addCriterion(parent);
+ }
+
+ }
+
+ @Override
+ public void addControl(Composite parent) {
+ addCriterion(parent);
+ }
+
+ public TextCriterion addCriterion(Composite parent) {
+ TextCriterion criterion = new TextCriterion();
+ if (criterions == null) {
+ criterions = new ArrayList<TextCriterion>();
+ criterion.createControl(parent);
+ } else {
+ criterion.createControl(parent, criterions.get(criterions.size() - 1));
+ }
+ criterions.add(criterion);
+ return criterion;
+ }
+
+ @Override
+ public TracSearchFilter getFilter() {
+ TracSearchFilter newFilter = new TracSearchFilter(getFieldName());
+ newFilter.setOperator(criterions.get(0).getCondition());
+ for (TextCriterion criterion : criterions) {
+ newFilter.addValue(criterion.getSearchText());
+ }
+ return newFilter;
+ }
+
+ public void removeCriterion(TextCriterion criterion) {
+ int i = criterions.indexOf(criterion);
+ if (i == -1) {
+ throw new RuntimeException();
+ }
+ if (i == 0) {
+ // the first criterion is special since it contains the compare
+ // operator combo
+ if (criterions.size() > 1) {
+ // copy the value from the second criterion to the first
+ TextCriterion sourceCriterion = criterions.get(1);
+ criterion.searchText.setText(sourceCriterion.searchText.getText());
+ removeCriterionByIndex(1);
+ } else {
+ // no more criterions, remove all controls
+ removeCriterionByIndex(0);
+ hideSearchField(this);
+ }
+ } else {
+ removeCriterionByIndex(i);
+ }
+ }
+
+ private void removeCriterionByIndex(int i) {
+ criterions.get(i).remove();
+ criterions.remove(i);
+ updateScrollPane();
+ }
+
+ private class TextCriterion {
+
+ private Combo conditionCombo;
+
+ private Text searchText;
+
+ private Label label;
+
+ private Button removeButton;
+
+ public void createControl(Composite parent) {
+ label = new Label(parent, SWT.LEFT);
+ label.setText(getDisplayName() + ": "); //$NON-NLS-1$
+
+ conditionCombo = new Combo(parent, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
+ for (CompareOperator op : compareOperators) {
+ conditionCombo.add(op.toString());
+ }
+ conditionCombo.setText(compareOperators[0].toString());
+
+ createSearchTextAndRemoveButton(parent);
+ }
+
+ public void createControl(Composite parent, TextCriterion top) {
+ label = new Label(parent, SWT.RIGHT);
+ GridData gd = new GridData();
+ gd.horizontalAlignment = SWT.END;
+ gd.horizontalSpan = 2;
+ label.setLayoutData(gd);
+ label.setText(Messages.TracFilterQueryPage_or);
+
+ createSearchTextAndRemoveButton(parent);
+
+ label.moveBelow(top.removeButton);
+ searchText.moveBelow(label);
+ removeButton.moveBelow(searchText);
+ }
+
+ private void createSearchTextAndRemoveButton(Composite parent) {
+ searchText = new Text(parent, SWT.BORDER);
+ GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL);
+ searchText.setLayoutData(gd);
+
+ removeButton = new Button(parent, SWT.PUSH);
+ removeButton.setText("-"); //$NON-NLS-1$
+ removeButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
+ TextSearchField.this.removeCriterion(TextCriterion.this);
+ }
+ });
+ }
+
+ public void remove() {
+ label.dispose();
+ if (conditionCombo != null) {
+ conditionCombo.dispose();
+ }
+ searchText.dispose();
+ removeButton.dispose();
+ }
+
+ public CompareOperator getCondition() {
+ return (conditionCombo != null) ? compareOperators[conditionCombo.getSelectionIndex()] : null;
+ }
+
+ public String getSearchText() {
+ return searchText.getText();
+ }
+
+ public boolean setCondition(CompareOperator operator) {
+ if (conditionCombo != null) {
+ int i = conditionCombo.indexOf(operator.toString());
+ if (i != -1) {
+ conditionCombo.select(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void setSearchText(String text) {
+ searchText.setText(text);
+ }
+
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryPage.java
new file mode 100644
index 0000000..181f619
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracQueryPage.java
@@ -0,0 +1,760 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.wizard;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonUiUtil;
+import org.eclipse.mylyn.internal.provisional.commons.ui.ICoreRunnable;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter;
+import org.eclipse.mylyn.internal.trac.core.model.TracSearchFilter.CompareOperator;
+import org.eclipse.mylyn.internal.trac.core.util.TracUtil;
+import org.eclipse.mylyn.internal.trac.ui.TracUiPlugin;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Trac search page. Provides a form similar to the one the Bugzilla connector uses.
+ *
+ * @author Steffen Pingel
+ */
+public class TracQueryPage extends AbstractRepositoryQueryPage {
+
+ private Text titleText;
+
+ private static final int PRODUCT_HEIGHT = 60;
+
+ private static final int STATUS_HEIGHT = 40;
+
+ protected final static String PAGE_NAME = "TracSearchPage"; //$NON-NLS-1$
+
+ private static final String SEARCH_URL_ID = PAGE_NAME + ".SEARCHURL"; //$NON-NLS-1$
+
+ protected Combo summaryText = null;
+
+ protected Combo repositoryCombo = null;
+
+ private TextSearchField summaryField;
+
+ private TextSearchField descriptionField;
+
+ private ListSearchField componentField;
+
+ private ListSearchField versionField;
+
+ private ListSearchField milestoneField;
+
+ private ListSearchField priorityField;
+
+ private ListSearchField typeField;
+
+ private ListSearchField resolutionField;
+
+ private ListSearchField statusField;
+
+ private Button updateButton;
+
+ private TextSearchField keywordsField;
+
+ private final Map<String, SearchField> searchFieldByName = new HashMap<String, SearchField>();
+
+ private boolean firstTime = true;
+
+ // private UserSearchField ownerField;
+ //
+ // private UserSearchField reporterField;
+ //
+ // private UserSearchField ccField;
+
+ public TracQueryPage(TaskRepository repository, IRepositoryQuery query) {
+ super(Messages.TracQueryPage_Enter_query_parameters, repository, query);
+ setTitle(Messages.TracQueryPage_Enter_query_parameters);
+ setDescription(Messages.TracQueryPage_If_attributes_are_blank_or_stale_press_the_Update_button);
+ }
+
+ public TracQueryPage(TaskRepository repository) {
+ this(repository, null);
+ }
+
+ public void createControl(Composite parent) {
+ Composite control = new Composite(parent, SWT.NONE);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ control.setLayoutData(gd);
+ GridLayout layout = new GridLayout(4, false);
+ if (inSearchContainer()) {
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ }
+ control.setLayout(layout);
+
+ createTitleGroup(control);
+
+ summaryField = new TextSearchField("summary"); //$NON-NLS-1$
+ summaryField.createControls(control, Messages.TracQueryPage_Summary);
+
+ descriptionField = new TextSearchField("description"); //$NON-NLS-1$
+ descriptionField.createControls(control, Messages.TracQueryPage_Description);
+
+ keywordsField = new TextSearchField("keywords"); //$NON-NLS-1$
+ keywordsField.createControls(control, Messages.TracQueryPage_Keywords);
+
+ createOptionsGroup(control);
+
+ createUserGroup(control);
+
+ if (getQuery() != null) {
+ titleText.setText(getQuery().getSummary());
+ TracSearch search = TracUtil.toTracSearch(getQuery());
+ if (search != null) {
+ restoreWidgetValues(search);
+ }
+ }
+
+ Dialog.applyDialogFont(control);
+ setControl(control);
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ return false;
+ }
+
+ private void restoreWidgetValues(TracSearch search) {
+ java.util.List<TracSearchFilter> filters = search.getFilters();
+ for (TracSearchFilter filter : filters) {
+ SearchField field = searchFieldByName.get(filter.getFieldName());
+ if (field != null) {
+ field.setFilter(filter);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TracUiPlugin.ID_PLUGIN,
+ "Ignoring invalid search filter: " + filter)); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void createTitleGroup(Composite control) {
+ if (inSearchContainer()) {
+ return;
+ }
+
+ Label titleLabel = new Label(control, SWT.NONE);
+ titleLabel.setText(Messages.TracQueryPage_Query_Title);
+
+ titleText = new Text(control, SWT.BORDER);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ gd.horizontalSpan = 3;
+ titleText.setLayoutData(gd);
+ titleText.addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ // ignore
+ }
+
+ public void keyReleased(KeyEvent e) {
+ getContainer().updateButtons();
+ }
+ });
+ }
+
+ protected Control createOptionsGroup(Composite control) {
+ Group group = new Group(control, SWT.NONE);
+ // group.setText("Ticket Attributes");
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ group.setLayout(layout);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.horizontalSpan = 4;
+ group.setLayoutData(gd);
+
+ createProductAttributes(group);
+ createTicketAttributes(group);
+ createUpdateButton(group);
+
+ return group;
+ }
+
+ protected void createUserGroup(Composite control) {
+ UserSearchField userField = new UserSearchField();
+ userField.createControls(control);
+ }
+
+ /**
+ * Creates the area for selection on product attributes component/version/milestone.
+ */
+ protected Control createProductAttributes(Composite control) {
+ Composite group = new Composite(control, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ group.setLayout(layout);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.horizontalSpan = 1;
+ group.setLayoutData(gd);
+
+ Label label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Component);
+
+ label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Version);
+
+ label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Milestone);
+
+ componentField = new ListSearchField("component"); //$NON-NLS-1$
+ componentField.createControls(group, PRODUCT_HEIGHT);
+
+ versionField = new ListSearchField("version"); //$NON-NLS-1$
+ versionField.createControls(group, PRODUCT_HEIGHT);
+
+ milestoneField = new ListSearchField("milestone"); //$NON-NLS-1$
+ milestoneField.createControls(group, PRODUCT_HEIGHT);
+
+ return group;
+ }
+
+ /**
+ * Creates the area for selection of ticket attributes status/resolution/priority.
+ */
+ protected Control createTicketAttributes(Composite control) {
+ Composite group = new Composite(control, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 4;
+ group.setLayout(layout);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.horizontalSpan = 1;
+ group.setLayoutData(gd);
+
+ Label label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Status);
+
+ label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Resolution);
+
+ label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Type);
+
+ label = new Label(group, SWT.LEFT);
+ label.setText(Messages.TracQueryPage_Priority);
+
+ statusField = new ListSearchField("status"); //$NON-NLS-1$
+ statusField.createControls(group, STATUS_HEIGHT);
+
+ resolutionField = new ListSearchField("resolution"); //$NON-NLS-1$
+ resolutionField.createControls(group, STATUS_HEIGHT);
+
+ typeField = new ListSearchField("type"); //$NON-NLS-1$
+ typeField.createControls(group, STATUS_HEIGHT);
+
+ priorityField = new ListSearchField("priority"); //$NON-NLS-1$
+ priorityField.createControls(group, STATUS_HEIGHT);
+
+ return group;
+ }
+
+ protected Control createUpdateButton(final Composite control) {
+ Composite group = new Composite(control, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ group.setLayout(layout);
+ group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ updateButton = new Button(group, SWT.PUSH);
+ updateButton.setText(Messages.TracQueryPage_Update_Attributes_from_Repository);
+ updateButton.setLayoutData(new GridData());
+ updateButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (getTaskRepository() != null) {
+ updateAttributesFromRepository(true);
+ } else {
+ MessageDialog.openInformation(Display.getCurrent().getActiveShell(),
+ Messages.TracQueryPage_Update_Attributes_Failed,
+ Messages.TracQueryPage_No_repository_available);
+ }
+ }
+ });
+
+ return group;
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+
+ if (getSearchContainer() != null) {
+ getSearchContainer().setPerformActionEnabled(true);
+ }
+
+ if (visible && firstTime) {
+ firstTime = false;
+ if (!hasAttributes()) {
+ // delay the execution so the dialog's progress bar is visible
+ // when the attributes are updated
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ if (getControl() != null && !getControl().isDisposed()) {
+ initializePage();
+ }
+ }
+
+ });
+ } else {
+ // no remote connection is needed to get attributes therefore do
+ // not use delayed execution to avoid flickering
+ initializePage();
+ }
+ }
+ }
+
+ private void initializePage() {
+ updateAttributesFromRepository(false);
+ boolean restored = (getQuery() != null);
+ if (inSearchContainer()) {
+ restored |= restoreWidgetValues();
+ }
+ if (!restored) {
+ // initialize with default values
+ }
+ }
+
+ private boolean hasAttributes() {
+ TracRepositoryConnector connector = (TracRepositoryConnector) TasksUi.getRepositoryManager()
+ .getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
+ ITracClient client = connector.getClientManager().getTracClient(getTaskRepository());
+ return client.hasAttributes();
+ }
+
+ private void updateAttributesFromRepository(final boolean force) {
+ TracRepositoryConnector connector = (TracRepositoryConnector) TasksUi.getRepositoryManager()
+ .getRepositoryConnector(TracCorePlugin.CONNECTOR_KIND);
+ final ITracClient client = connector.getClientManager().getTracClient(getTaskRepository());
+
+ if (!client.hasAttributes() || force) {
+ try {
+ ICoreRunnable runnable = new ICoreRunnable() {
+
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ client.updateAttributes(monitor, force);
+ } catch (TracException e) {
+ throw new CoreException(TracCorePlugin.toStatus(e, getTaskRepository()));
+ }
+ }
+ };
+
+ if (getContainer() != null) {
+ CommonUiUtil.run(getContainer(), runnable);
+ } else if (getSearchContainer() != null) {
+ CommonUiUtil.run(getSearchContainer().getRunnableContext(), runnable);
+ } else {
+ CommonUiUtil.run(PlatformUI.getWorkbench().getProgressService(), runnable);
+ }
+ } catch (CoreException e) {
+ CommonUiUtil.setMessage(this, e.getStatus());
+ return;
+ } catch (OperationCanceledException e) {
+ return;
+ }
+ }
+
+ statusField.setValues(client.getTicketStatus());
+ resolutionField.setValues(client.getTicketResolutions());
+ typeField.setValues(client.getTicketTypes());
+ priorityField.setValues(client.getPriorities());
+
+ componentField.setValues(client.getComponents());
+ versionField.setValues(client.getVersions());
+ milestoneField.setValues(client.getMilestones());
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ if (titleText != null && titleText.getText().length() > 0) {
+ return true;
+ }
+ return false;
+ }
+
+ public String getQueryUrl(String repsitoryUrl) {
+ TracSearch search = getTracSearch();
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(repsitoryUrl);
+ sb.append(ITracClient.QUERY_URL);
+ sb.append(search.toUrl());
+ return sb.toString();
+ }
+
+ private TracSearch getTracSearch() {
+ TracSearch search = new TracSearch();
+ for (SearchField field : searchFieldByName.values()) {
+ TracSearchFilter filter = field.getFilter();
+ if (filter != null) {
+ search.addFilter(filter);
+ }
+ }
+ return search;
+ }
+
+ // public boolean performAction() {
+ //
+ // Proxy proxySettings = TasksUiPlugin.getDefault().getProxySettings();
+ // SearchHitCollector collector = new
+ // SearchHitCollector(TasksUiPlugin.getTaskList(),
+ // repository, getQuery(), proxySettings);
+ // NewSearchUI.runQueryInBackground(collector);
+ //
+ // return true;
+ // }
+
+ @Override
+ public boolean performSearch() {
+ if (inSearchContainer()) {
+ saveState();
+ }
+
+ return super.performSearch();
+ }
+
+ @Override
+ public IDialogSettings getDialogSettings() {
+ IDialogSettings settings = TracUiPlugin.getDefault().getDialogSettings();
+ IDialogSettings dialogSettings = settings.getSection(PAGE_NAME);
+ if (dialogSettings == null) {
+ dialogSettings = settings.addNewSection(PAGE_NAME);
+ }
+ return dialogSettings;
+ }
+
+ private boolean restoreWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
+
+ String searchUrl = settings.get(SEARCH_URL_ID + repoId);
+ if (searchUrl == null) {
+ return false;
+ }
+
+ restoreWidgetValues(new TracSearch(searchUrl));
+ return true;
+ }
+
+ @Override
+ public void saveState() {
+ String repoId = "." + getTaskRepository().getRepositoryUrl(); //$NON-NLS-1$
+ IDialogSettings settings = getDialogSettings();
+ settings.put(SEARCH_URL_ID + repoId, getTracSearch().toUrl());
+ }
+
+ private abstract class SearchField {
+
+ protected String fieldName;
+
+ public SearchField(String fieldName) {
+ this.fieldName = fieldName;
+
+ if (fieldName != null) {
+ assert !searchFieldByName.containsKey(fieldName);
+ searchFieldByName.put(fieldName, this);
+ }
+ }
+
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public abstract TracSearchFilter getFilter();
+
+ public abstract void setFilter(TracSearchFilter filter);
+
+ }
+
+ private class TextSearchField extends SearchField {
+
+ private Combo conditionCombo;
+
+ protected Text searchText;
+
+ private Label label;
+
+ private final CompareOperator[] compareOperators = { CompareOperator.CONTAINS, CompareOperator.CONTAINS_NOT,
+ CompareOperator.BEGINS_WITH, CompareOperator.ENDS_WITH, CompareOperator.IS, CompareOperator.IS_NOT, };
+
+ public TextSearchField(String fieldName) {
+ super(fieldName);
+ }
+
+ public void createControls(Composite parent, String labelText) {
+ if (labelText != null) {
+ label = new Label(parent, SWT.LEFT);
+ label.setText(labelText);
+ }
+
+ conditionCombo = new Combo(parent, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
+ for (CompareOperator op : compareOperators) {
+ conditionCombo.add(op.toString());
+ }
+ conditionCombo.setText(compareOperators[0].toString());
+
+ searchText = new Text(parent, SWT.BORDER);
+ GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ // the user search field has additional controls and no fieldName
+ if (fieldName != null) {
+ gd.horizontalSpan = 2;
+ }
+ searchText.setLayoutData(gd);
+ }
+
+ public CompareOperator getCondition() {
+ return compareOperators[conditionCombo.getSelectionIndex()];
+ }
+
+ public String getSearchText() {
+ return searchText.getText();
+ }
+
+ public boolean setCondition(CompareOperator operator) {
+ if (conditionCombo != null) {
+ int i = conditionCombo.indexOf(operator.toString());
+ if (i != -1) {
+ conditionCombo.select(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void setSearchText(String text) {
+ searchText.setText(text);
+ }
+
+ @Override
+ public TracSearchFilter getFilter() {
+ String text = getSearchText();
+ if (text.length() == 0) {
+ return null;
+ }
+
+ TracSearchFilter newFilter = new TracSearchFilter(getFieldName());
+ newFilter.setOperator(getCondition());
+ newFilter.addValue(getSearchText());
+ return newFilter;
+ }
+
+ @Override
+ public void setFilter(TracSearchFilter filter) {
+ setCondition(filter.getOperator());
+ java.util.List<String> values = filter.getValues();
+ setSearchText(values.get(0));
+ }
+
+ public void setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ }
+
+ private class ListSearchField extends SearchField {
+
+ private List list;
+
+ public ListSearchField(String fieldName) {
+ super(fieldName);
+ }
+
+ public void setValues(Object[] items) {
+ // preserve selected values
+ TracSearchFilter filter = getFilter();
+
+ list.removeAll();
+ if (items != null) {
+ list.setEnabled(true);
+ for (Object item : items) {
+ list.add(item.toString());
+ }
+
+ // restore selected values
+ if (filter != null) {
+ setFilter(filter);
+ }
+ } else {
+ list.setEnabled(false);
+ }
+ }
+
+ public void createControls(Composite parent, int height) {
+ list = new List(parent, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gd.heightHint = height;
+ list.setLayoutData(gd);
+ }
+
+ @Override
+ public TracSearchFilter getFilter() {
+ int[] indicies = list.getSelectionIndices();
+ if (indicies.length == 0) {
+ return null;
+ }
+
+ TracSearchFilter newFilter = new TracSearchFilter(getFieldName());
+ newFilter.setOperator(CompareOperator.IS);
+ for (int i : indicies) {
+ newFilter.addValue(list.getItem(i));
+ }
+ return newFilter;
+ }
+
+ @Override
+ public void setFilter(TracSearchFilter filter) {
+ list.deselectAll();
+ java.util.List<String> values = filter.getValues();
+ for (String item : values) {
+ int i = list.indexOf(item);
+ if (i != -1) {
+ list.select(i);
+ } else {
+ list.add(item, 0);
+ list.select(0);
+ }
+ }
+ }
+
+// public void selectItems(String[] items) {
+// list.deselectAll();
+// for (String item : items) {
+// int i = list.indexOf(item);
+// if (i != -1) {
+// list.select(i);
+// }
+// }
+// }
+
+ }
+
+ private class UserSearchField extends SearchField {
+
+ private final TextSearchField textField;
+
+ private Combo userCombo;
+
+ public UserSearchField() {
+ super(null);
+
+ textField = new TextSearchField(null);
+
+ new UserSelectionSearchField("owner", 0); //$NON-NLS-1$
+
+ new UserSelectionSearchField("reporter", 1); //$NON-NLS-1$
+
+ new UserSelectionSearchField("cc", 2); //$NON-NLS-1$
+ }
+
+ public void createControls(Composite parent) {
+ userCombo = new Combo(parent, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
+ userCombo.add(Messages.TracQueryPage_Owner);
+ userCombo.add(Messages.TracQueryPage_Reporter);
+ userCombo.add(Messages.TracQueryPage_CC);
+ userCombo.select(0);
+
+ textField.createControls(parent, null);
+ }
+
+ @Override
+ public TracSearchFilter getFilter() {
+ return null;
+ }
+
+ @Override
+ public void setFilter(TracSearchFilter filter) {
+ }
+
+ private void setSelection(int index) {
+ userCombo.select(index);
+ }
+
+ private int getSelection() {
+ return userCombo.getSelectionIndex();
+ }
+
+ class UserSelectionSearchField extends SearchField {
+
+ private final int index;
+
+ public UserSelectionSearchField(String fieldName, int index) {
+ super(fieldName);
+
+ this.index = index;
+ }
+
+ @Override
+ public TracSearchFilter getFilter() {
+ if (index == getSelection()) {
+ textField.setFieldName(fieldName);
+ return textField.getFilter();
+ }
+ return null;
+ }
+
+ @Override
+ public void setFilter(TracSearchFilter filter) {
+ textField.setFieldName(fieldName);
+ textField.setFilter(filter);
+ setSelection(index);
+ }
+
+ }
+
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return (titleText != null) ? titleText.getText() : null;
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ query.setUrl(getQueryUrl(getTaskRepository().getRepositoryUrl()));
+ query.setSummary(getQueryTitle());
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java
new file mode 100644
index 0000000..2564088
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/TracRepositorySettingsPage.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2008 Steffen Pingel 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.trac.ui.wizard;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.internal.trac.core.TracClientFactory;
+import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient;
+import org.eclipse.mylyn.internal.trac.core.client.TracException;
+import org.eclipse.mylyn.internal.trac.core.client.TracLoginException;
+import org.eclipse.mylyn.internal.trac.core.client.TracPermissionDeniedException;
+import org.eclipse.mylyn.internal.trac.core.client.ITracClient.Version;
+import org.eclipse.mylyn.internal.trac.core.model.TracRepositoryInfo;
+import org.eclipse.mylyn.internal.trac.ui.TracUiPlugin;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryLocationFactory;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author Steffen Pingel
+ */
+public class TracRepositorySettingsPage extends AbstractRepositorySettingsPage {
+
+ private static final String TITLE = Messages.TracRepositorySettingsPage_Trac_Repository_Settings;
+
+ private static final String DESCRIPTION = Messages.TracRepositorySettingsPage_EXAMPLE_HTTP_TRAC_EDGEWALL_ORG;
+
+ private Combo accessTypeCombo;
+
+ /** Supported access types. */
+ private Version[] versions;
+
+ public TracRepositorySettingsPage(TaskRepository taskRepository) {
+ super(TITLE, DESCRIPTION, taskRepository);
+ setNeedsAnonymousLogin(true);
+ setNeedsEncoding(false);
+ setNeedsTimeZone(false);
+ }
+
+ @Override
+ protected void repositoryTemplateSelected(RepositoryTemplate template) {
+ repositoryLabelEditor.setStringValue(template.label);
+ setUrl(template.repositoryUrl);
+ setAnonymous(template.anonymous);
+
+ try {
+ Version version = Version.valueOf(template.version);
+ setTracVersion(version);
+ } catch (RuntimeException ex) {
+ setTracVersion(Version.TRAC_0_9);
+ }
+
+ getContainer().updateButtons();
+ }
+
+ @Override
+ protected void createAdditionalControls(final Composite parent) {
+ addRepositoryTemplatesToServerUrlCombo();
+
+ Label accessTypeLabel = new Label(parent, SWT.NONE);
+ accessTypeLabel.setText(Messages.TracRepositorySettingsPage_Access_Type_);
+ accessTypeCombo = new Combo(parent, SWT.READ_ONLY);
+
+ accessTypeCombo.add(Messages.TracRepositorySettingsPage_Automatic__Use_Validate_Settings_);
+ versions = Version.values();
+ for (Version version : versions) {
+ accessTypeCombo.add(version.toString());
+ }
+ if (repository != null) {
+ setTracVersion(Version.fromVersion(repository.getVersion()));
+ } else {
+ setTracVersion(null);
+ }
+ accessTypeCombo.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ if (accessTypeCombo.getSelectionIndex() > 0) {
+ setVersion(versions[accessTypeCombo.getSelectionIndex() - 1].name());
+ }
+ getWizard().getContainer().updateButtons();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+ });
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ // make sure "Automatic" is not selected as a version
+ return super.isPageComplete() && accessTypeCombo != null && accessTypeCombo.getSelectionIndex() != 0;
+ }
+
+ @Override
+ protected boolean isValidUrl(String name) {
+ if ((name.startsWith(URL_PREFIX_HTTPS) || name.startsWith(URL_PREFIX_HTTP)) && !name.endsWith("/")) { //$NON-NLS-1$
+ try {
+ new URL(name);
+ return true;
+ } catch (MalformedURLException e) {
+ }
+ }
+ return false;
+ }
+
+ public Version getTracVersion() {
+ if (accessTypeCombo.getSelectionIndex() == 0) {
+ return null;
+ } else {
+ return versions[accessTypeCombo.getSelectionIndex() - 1];
+ }
+ }
+
+ public void setTracVersion(Version version) {
+ if (version == null) {
+ // select "Automatic"
+ accessTypeCombo.select(0);
+ } else {
+ int i = accessTypeCombo.indexOf(version.toString());
+ if (i != -1) {
+ accessTypeCombo.select(i);
+ }
+ setVersion(version.name());
+ }
+ }
+
+ @Override
+ protected void applyValidatorResult(Validator validator) {
+ super.applyValidatorResult(validator);
+
+ if (((TracValidator) validator).getResult() != null) {
+ setTracVersion(((TracValidator) validator).getResult());
+ }
+ }
+
+ // public for testing
+ public class TracValidator extends Validator {
+
+ private final String repositoryUrl;
+
+ private final TaskRepository taskRepository;
+
+ private Version version;
+
+ private Version result;
+
+ public TracValidator(TaskRepository taskRepository, Version version) {
+ this.repositoryUrl = taskRepository.getRepositoryUrl();
+ this.taskRepository = taskRepository;
+ this.version = version;
+ }
+
+ @Override
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ //validate(Provider.of(monitor));
+ validate(monitor);
+ } catch (MalformedURLException e) {
+ throw new CoreException(RepositoryStatus.createStatus(repositoryUrl, IStatus.ERROR,
+ TracUiPlugin.ID_PLUGIN, INVALID_REPOSITORY_URL));
+ } catch (TracLoginException e) {
+ throw new CoreException(RepositoryStatus.createStatus(repositoryUrl, IStatus.ERROR,
+ TracUiPlugin.ID_PLUGIN, INVALID_LOGIN));
+ } catch (TracPermissionDeniedException e) {
+ throw new CoreException(RepositoryStatus.createStatus(repositoryUrl, IStatus.ERROR,
+ TracUiPlugin.ID_PLUGIN, "Insufficient permissions for selected access type.")); //$NON-NLS-1$
+ } catch (TracException e) {
+ String message = Messages.TracRepositorySettingsPage_No_Trac_repository_found_at_url;
+ if (e.getMessage() != null) {
+ message += ": " + e.getMessage(); //$NON-NLS-1$
+ }
+ throw new CoreException(RepositoryStatus.createStatus(repositoryUrl, IStatus.ERROR,
+ TracUiPlugin.ID_PLUGIN, message));
+ }
+ }
+
+ public void validate(IProgressMonitor monitor) throws MalformedURLException, TracException {
+ AbstractWebLocation location = new TaskRepositoryLocationFactory().createWebLocation(taskRepository);
+
+ TracRepositoryInfo info;
+ if (version != null) {
+ ITracClient client = TracClientFactory.createClient(location, version);
+ info = client.validate(monitor);
+ } else {
+ // probe version: XML-RPC access first, then web
+ // access
+ try {
+ version = Version.XML_RPC;
+ ITracClient client = TracClientFactory.createClient(location, version);
+ info = client.validate(monitor);
+ } catch (TracException e) {
+ try {
+ version = Version.TRAC_0_9;
+ ITracClient client = TracClientFactory.createClient(location, version);
+ info = client.validate(monitor);
+
+ if (e instanceof TracPermissionDeniedException) {
+ setStatus(RepositoryStatus.createStatus(repositoryUrl, IStatus.INFO,
+ TracUiPlugin.ID_PLUGIN,
+ Messages.TracRepositorySettingsPage_Authentication_credentials_are_valid));
+ }
+ } catch (TracLoginException e2) {
+ throw e;
+ } catch (TracException e2) {
+ throw new TracException();
+ }
+ }
+ result = version;
+ }
+
+ if (version == Version.XML_RPC //
+ && (info.isApiVersion(1, 0, 0) //
+ || (info.isApiVersionOrHigher(1, 0, 3) && info.isApiVersionOrSmaller(1, 0, 5)))) {
+ setStatus(RepositoryStatus.createStatus(
+ repositoryUrl,
+ IStatus.INFO,
+ TracUiPlugin.ID_PLUGIN,
+ Messages.TracRepositorySettingsPage_Authentication_credentials_valid_Update_to_latest_XmlRpcPlugin_Warning));
+ }
+
+ MultiStatus status = new MultiStatus(TracUiPlugin.ID_PLUGIN, 0, NLS.bind("Validation results for {0}", //$NON-NLS-1$
+ taskRepository.getRepositoryLabel()), null);
+ status.add(new Status(IStatus.INFO, TracUiPlugin.ID_PLUGIN, NLS.bind("Version: {0}", info.toString()))); //$NON-NLS-1$
+ status.add(new Status(IStatus.INFO, TracUiPlugin.ID_PLUGIN,
+ NLS.bind("Access Type: {0}", version.toString()))); //$NON-NLS-1$
+ StatusHandler.log(status);
+ }
+
+ public Version getResult() {
+ return result;
+ }
+
+ }
+
+ @Override
+ protected Validator getValidator(TaskRepository repository) {
+ return new TracValidator(repository, getTracVersion());
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return TracCorePlugin.CONNECTOR_KIND;
+ }
+
+}
diff --git a/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/messages.properties b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/messages.properties
new file mode 100644
index 0000000..b2edab1
--- /dev/null
+++ b/org.eclipse.mylyn.trac.ui/src/org/eclipse/mylyn/internal/trac/ui/wizard/messages.properties
@@ -0,0 +1,45 @@
+TracFilterQueryPage_Add_search_filters_to_define_query=Add search filters to define query.
+TracFilterQueryPage_CC=CC
+TracFilterQueryPage_Component=Component
+TracFilterQueryPage_Keywords=Keywords
+TracFilterQueryPage_Milestone=Milestone
+TracFilterQueryPage_New_Trac_Query=New Trac Query
+TracFilterQueryPage_or=or
+TracFilterQueryPage_Owner=Owner
+TracFilterQueryPage_Priority=Priority
+TracFilterQueryPage_Query_Title=Query Title
+TracFilterQueryPage_Reporter=Reporter
+TracFilterQueryPage_Resolution=Resolution
+TracFilterQueryPage_Select_to_add_filter=Select to add filter:
+TracFilterQueryPage_Status=Status
+TracFilterQueryPage_Summary=Summary
+TracFilterQueryPage_Type=Type
+TracFilterQueryPage_Version=Version
+
+TracQueryPage_CC=CC
+TracQueryPage_Component=Component
+TracQueryPage_Description=Description
+TracQueryPage_Enter_query_parameters=Enter query parameters
+TracQueryPage_If_attributes_are_blank_or_stale_press_the_Update_button=If attributes are blank or stale press the Update button.
+TracQueryPage_Keywords=Keywords
+TracQueryPage_Milestone=Milestone
+TracQueryPage_No_repository_available=No repository available, please add one using the Task Repositories view.
+TracQueryPage_Owner=Owner
+TracQueryPage_Priority=Priority
+TracQueryPage_Query_Title=Query Title:
+TracQueryPage_Reporter=Reporter
+TracQueryPage_Resolution=Resolution
+TracQueryPage_Status=Status
+TracQueryPage_Summary=Summary
+TracQueryPage_Type=Type
+TracQueryPage_Update_Attributes_Failed=Update Attributes Failed
+TracQueryPage_Update_Attributes_from_Repository=Update Attributes from Repository
+TracQueryPage_Version=Version
+
+TracRepositorySettingsPage_Access_Type_=Access Type:
+TracRepositorySettingsPage_Authentication_credentials_are_valid=Authentication credentials are valid. Note: Insufficient permissions for XML-RPC access, falling back to web access.
+TracRepositorySettingsPage_Authentication_credentials_valid_Update_to_latest_XmlRpcPlugin_Warning=Authentication credentials are valid. Note: An update to the latest version of Trac's XmlRpcPlugin is recommended.
+TracRepositorySettingsPage_Automatic__Use_Validate_Settings_=Automatic (Use Validate Settings)
+TracRepositorySettingsPage_EXAMPLE_HTTP_TRAC_EDGEWALL_ORG=Example: http://trac.edgewall.org
+TracRepositorySettingsPage_No_Trac_repository_found_at_url=No Trac repository found at url
+TracRepositorySettingsPage_Trac_Repository_Settings=Trac Repository Settings
diff --git a/org.eclipse.mylyn.web.tasks-feature/.project b/org.eclipse.mylyn.web.tasks-feature/.project
new file mode 100644
index 0000000..8cbaf69
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.web.tasks-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.web.tasks-feature/.refactorings/2008/5/19/refactorings.history b/org.eclipse.mylyn.web.tasks-feature/.refactorings/2008/5/19/refactorings.history
new file mode 100644
index 0000000..42b96d8
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.refactorings/2008/5/19/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylyn.xplanner-feature'
- Original project: 'org.eclipse.mylyn.web.tasks-feature'
- Destination element: 'org.eclipse.mylyn.xplanner-feature'
- Original element: 'epl-v10.html'" description="Copy file" element1="epl-v10.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" policy="org.eclipse.jdt.ui.copyResources" stamp="1210120769305" target="/org.eclipse.mylyn.xplanner-feature" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks-feature/.refactorings/2008/5/19/refactorings.index b/org.eclipse.mylyn.web.tasks-feature/.refactorings/2008/5/19/refactorings.index
new file mode 100644
index 0000000..a306959
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.refactorings/2008/5/19/refactorings.index
@@ -0,0 +1 @@
+1210120769305 Copy file
diff --git a/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f1554b1
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..5e70d08
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Sat Mar 01 03:38:47 PST 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..4c9ebcf
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:51 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..ea6eaeb
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Dec 20 14:07:41 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.web.tasks-feature/about.html b/org.eclipse.mylyn.web.tasks-feature/about.html
new file mode 100644
index 0000000..0dd939c
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 7, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks-feature/build.properties b/org.eclipse.mylyn.web.tasks-feature/build.properties
new file mode 100644
index 0000000..dcaa2fa
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.properties,\
+ feature.xml,\
+ epl-v10.html,\
+ license.html,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.web.tasks-feature/epl-v10.html b/org.eclipse.mylyn.web.tasks-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks-feature/feature.properties b/org.eclipse.mylyn.web.tasks-feature/feature.properties
new file mode 100644
index 0000000..6df0ab3
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/feature.properties
@@ -0,0 +1,48 @@
+featureName=Mylyn Connector: Web Templates (Advanced)
+description=Provides Task List integration for several web-based issue trackers and templates for example projects.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2008 Mylyn project committers and others.
+updateSiteName=Mylyn Incubator for Eclipse 3.3 and 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.web.tasks-feature/feature.xml b/org.eclipse.mylyn.web.tasks-feature/feature.xml
new file mode 100644
index 0000000..08adf3a
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/feature.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.mylyn.web.tasks_feature"
+ label="%featureName"
+ version="3.2.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description url="http://eclipse.org/mylyn">
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/incubator"/>
+ </url>
+
+ <requires>
+ <import plugin="com.sun.syndication" version="0.9.0" match="greaterOrEqual"/>
+ <import plugin="org.jdom" version="1.0.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.0" match="compatible"/>
+ <import feature="org.eclipse.mylyn_feature" version="3.2.1.mylynQualifier" match="equivalent"/>
+ <import plugin="org.eclipse.mylyn.commons.core" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.net" version="3.0.0" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.commons.ui" version="3.0.0" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.web.tasks"
+ download-size="0"
+ install-size="0"
+ version="3.2.1.qualifier"
+ unpack="false"/>
+
+ <plugin
+ id="com.sun.syndication"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.jdom"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.web.tasks-feature/license.html b/org.eclipse.mylyn.web.tasks-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.web.tasks/.classpath b/org.eclipse.mylyn.web.tasks/.classpath
new file mode 100644
index 0000000..304e861
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.web.tasks/.cvsignore b/org.eclipse.mylyn.web.tasks/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.web.tasks/.project b/org.eclipse.mylyn.web.tasks/.project
new file mode 100644
index 0000000..cf78565
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.web.tasks</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/45/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/45/refactorings.history
new file mode 100644
index 0000000..26d157b
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/45/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.sandbox.web' to 'org.eclipse.mylar.internal.tasks.web' - Original project: 'org.eclipse.mylar.tasks.web' - Original element: 'org.eclipse.mylar.tasks.web/src/org.eclipse.mylar.internal.sandbox.web' - Renamed element: 'org.eclipse.mylar.tasks.web/src/org.eclipse.mylar.internal.tasks.web' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.sandbox.web'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.sandbox.web" name="org.eclipse.mylar.internal.tasks.web" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1163125218781" textual="true" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original project: 'org.eclipse.mylar.tasks.web' - Destination element: 'org.eclipse.mylar.tasks.core/src/org.eclipse.mylar.internal.tasks.core' - Original element: 'org.eclipse.mylar.internal.tasks.web.WebQueryHit.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.internal.tasks.core" element1="/src<org.eclipse.mylar.internal.tasks.web{WebQueryHit.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1163210664187" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/45/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/45/refactorings.index
new file mode 100644
index 0000000..7014647
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/45/refactorings.index
@@ -0,0 +1,2 @@
+1163125218781 Rename package 'org.eclipse.mylar.internal.sandbox.web'
+1163210664187 Move compilation unit
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/46/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/46/refactorings.history
new file mode 100644
index 0000000..bb1318e
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/46/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar.tasks.web' - Original project: 'org.eclipse.mylar.tasks.web' - Original element: 'WebRepositoryConnector.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/internal/tasks/web/WebRepositoryConnector.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1163562741468" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/46/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/46/refactorings.index
new file mode 100644
index 0000000..95bdcaf
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2006/11/46/refactorings.index
@@ -0,0 +1 @@
+1163562741468 Delete element
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..00a2232
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Change method 'public org.eclipse.mylar.internal.tasks.web.WebQuery.WebQuery(TaskList taskList, String description, String queryUrl, String queryUrlTemplate, String queryPattern, String taskPrefix, String repositoryUrl, Map<String,String> params)' to 'public WebQuery(String description, String queryUrl, String queryUrlTemplate, String queryPattern, String taskPrefix, String repositoryUrl, Map<String,String> params)' - Original project: 'org.eclipse.mylar.tasks.web' - Removed parameters: TaskList taskList" delegate="false" deprecate="false" description="Change method 'WebQuery'" flags="589830" id="org.eclipse.jdt.ui.change.method.signature" input="/src<org.eclipse.mylar.internal.tasks.web{WebQuery.java[WebQuery~WebQuery~QTaskList;~QString;~QString;~QString;~QString;~QString;~QString;~QMap\<QString;QString;>;" name="WebQuery" parameter1="TaskList taskList 0 TaskList taskList true" parameter2="String description 1 String description false" parameter3="String queryUrl 2 String queryUrl false" parameter4="String queryUrlTemplate 3 String queryUrlTemplate false" parameter5="String queryPattern 4 String queryPattern false" parameter6="String taskPrefix 5 String taskPrefix false" parameter7="String repositoryUrl 6 String repositoryUrl false" parameter8="Map<String,String> params 7 Map<String,String> params false" stamp="1181096288531" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.tasks.web' to 'org.eclipse.mylyn.web.tasks' - Original project: 'org.eclipse.mylyn.web.tasks' - Original element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.tasks.web' - Renamed element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.web.tasks' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.tasks.web'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.tasks.web" name="org.eclipse.mylyn.web.tasks" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181357843529" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.internal.tasks.web' - Original project: 'org.eclipse.mylyn.web.tasks' - Destination element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.internal.tasks.web' - Original element: 'org.eclipse.mylyn.web.tasks.TasksWebPlugin.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.tasks.web" element1="/src<org.eclipse.mylyn.web.tasks{TasksWebPlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181357852784" units="1" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.tasks' - Original project: 'org.eclipse.mylyn.web.tasks' - Original element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.web.tasks'" description="Delete element" element1="/src<org.eclipse.mylyn.web.tasks" element2="/src<org.eclipse.mylyn.web" elements="2" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181357855944" subPackages="false" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylyn.internal.tasks.web' to 'org.eclipse.mylyn.internal.web.tasks' - Original project: 'org.eclipse.mylyn.web.tasks' - Original element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.internal.tasks.web' - Renamed element: 'org.eclipse.mylyn.web.tasks/src/org.eclipse.mylyn.internal.web.tasks' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename package 'org.eclipse.mylyn.internal.tasks.web'" flags="589830" hierarchical="false" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylyn.internal.tasks.web" name="org.eclipse.mylyn.internal.web.tasks" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" stamp="1181357866446" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..38c3418
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,5 @@
+1181096288531 Change method 'WebQuery'
+1181357843529 Rename package 'org.eclipse.mylyn.tasks.web'
+1181357852784 Move compilation unit
+1181357855944 Delete element
+1181357866446 Rename package 'org.eclipse.mylyn.internal.tasks.web'
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..546067c
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private void createBrowser(TaskEditor parentEditor,RepositoryTaskEditorInput taskInput)' from 'org.eclipse.mylyn.internal.web.tasks.WebTaskEditorFactory.createEditor()' to 'org.eclipse.mylyn.internal.web.tasks.WebTaskEditorFactory' - Original project: 'org.eclipse.mylyn.web.tasks' - Method name: 'createBrowser' - Destination type: 'org.eclipse.mylyn.internal.web.tasks.WebTaskEditorFactory' - Declared visibility: 'private'" comments="false" description="Extract method 'createBrowser'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylyn.internal.web.tasks{WebTaskEditorFactory.java" name="createBrowser" replace="false" selection="1916 455" stamp="1181953553649" version="1.0" visibility="2"/>
+<refactoring clone="true" comment="Infer generic type arguments on 'org.eclipse.mylyn.web.tasks' - Original project: 'org.eclipse.mylyn.web.tasks' - Original elements: org.eclipse.mylyn.internal.web.tasks.BrowserEditorInput.java - Assume clone() returns an instance of the receiver type - Leave unconstrained type arguments raw" description="Infer generic type arguments" element1="/src<org.eclipse.mylyn.internal.web.tasks{BrowserEditorInput.java" flags="6" id="org.eclipse.jdt.ui.infer.typearguments" leave="true" stamp="1181954187946" version="1.0"/>
+
+</session>
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..aeae78b
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,2 @@
+1181953553649 Extract method 'createBrowser'
+1181954187946 Infer generic type arguments
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/25/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/25/refactorings.history
new file mode 100644
index 0000000..2ca98ce
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/25/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.web.tasks.WebTaskExternalizer' to 'WebTaskListFactory' - Original project: 'org.eclipse.mylyn.web.tasks' - Original element: 'org.eclipse.mylyn.internal.web.tasks.WebTaskExternalizer' - Renamed element: 'org.eclipse.mylyn.internal.web.tasks.WebTaskListFactory' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'WebTaskExternalizer'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.web.tasks{WebTaskExternalizer.java[WebTaskExternalizer" matchStrategy="1" name="WebTaskListFactory" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182400260198" textual="false" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.web.tasks.WebRepositoryUi' to 'WebConnectorUi' - Original project: 'org.eclipse.mylyn.web.tasks' - Original element: 'org.eclipse.mylyn.internal.web.tasks.WebRepositoryUi' - Renamed element: 'org.eclipse.mylyn.internal.web.tasks.WebConnectorUi' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'WebRepositoryUi'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.web.tasks{WebRepositoryUi.java[WebRepositoryUi" matchStrategy="1" name="WebConnectorUi" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1182561781458" textual="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/25/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/25/refactorings.index
new file mode 100644
index 0000000..e3ad0b4
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2007/6/25/refactorings.index
@@ -0,0 +1,2 @@
+1182400260198 Rename type 'WebTaskExternalizer'
+1182561781458 Rename type 'WebRepositoryUi'
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2008/3/13/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2008/3/13/refactorings.history
new file mode 100644
index 0000000..770ee49
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2008/3/13/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.tasks'
- Original project: 'org.eclipse.mylyn.web.tasks'
- Original element: 'org.eclipse.mylyn.internal.web.tasks.BrowserEditorInput.java'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.web.tasks{BrowserEditorInput.java" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1206664712855" subPackages="false" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.editors'
- Original project: 'org.eclipse.mylyn.web.tasks'
- Destination element: 'org.eclipse.mylyn.tasks.ui/src/org.eclipse.mylyn.tasks.ui.editors'
- Original element: 'org.eclipse.mylyn.internal.web.tasks.BrowserFormPage.java'
- Update references to refactored element" description="Move compilation unit" destination="=org.eclipse.mylyn.tasks.ui/src<org.eclipse.mylyn.tasks.ui.editors" element1="/src<org.eclipse.mylyn.internal.web.tasks{BrowserFormPage.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1206665397589" units="1" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2008/3/13/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2008/3/13/refactorings.index
new file mode 100644
index 0000000..734ba21
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2008/3/13/refactorings.index
@@ -0,0 +1,2 @@
+1206664712855 Delete element
+1206665397589 Move compilation unit
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2008/5/21/refactorings.history b/org.eclipse.mylyn.web.tasks/.refactorings/2008/5/21/refactorings.history
new file mode 100644
index 0000000..5d9d081
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2008/5/21/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn.web.tasks'
- Original project: 'org.eclipse.mylyn.web.tasks'
- Original element: 'etool16'" description="Delete element" element1="icons/etool16" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1211699586543" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks/.refactorings/2008/5/21/refactorings.index b/org.eclipse.mylyn.web.tasks/.refactorings/2008/5/21/refactorings.index
new file mode 100644
index 0000000..03c0a70
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.refactorings/2008/5/21/refactorings.index
@@ -0,0 +1 @@
+1211699586543 Delete element
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..01d52ea
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..7ab03bd
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..d8c6d26
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jun 25 03:02:37 GMT 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF b/org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7b680a1
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Mylyn Web Templates Connector
+Bundle-SymbolicName: org.eclipse.mylyn.web.tasks;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Activator: org.eclipse.mylyn.internal.web.tasks.TasksWebPlugin
+Bundle-Vendor: Eclipse Mylyn
+Require-Bundle: com.sun.syndication;bundle-version="0.9.0",
+ org.jdom;bundle-version="1.0.0",
+ org.eclipse.core.runtime,
+ org.eclipse.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.mylyn.internal.web.tasks;x-internal:=true
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.web.tasks/about.html b/org.eclipse.mylyn.web.tasks/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks/build.properties b/org.eclipse.mylyn.web.tasks/build.properties
new file mode 100644
index 0000000..1976ca3
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/build.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2005, 2006 Mylyn project committers 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
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ about.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/folder.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/folder.gif
new file mode 100644
index 0000000..51e703b
Binary files /dev/null and b/org.eclipse.mylyn.web.tasks/icons/eview16/folder.gif differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/icons-task-jira.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/icons-task-jira.gif
new file mode 100644
index 0000000..f1fa823
Binary files /dev/null and b/org.eclipse.mylyn.web.tasks/icons/eview16/icons-task-jira.gif differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/monitor.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/monitor.gif
new file mode 100644
index 0000000..3ea4ad7
Binary files /dev/null and b/org.eclipse.mylyn.web.tasks/icons/eview16/monitor.gif differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/task-list.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/task-list.gif
new file mode 100644
index 0000000..6ab2668
Binary files /dev/null and b/org.eclipse.mylyn.web.tasks/icons/eview16/task-list.gif differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/obj16/overlay-web.gif b/org.eclipse.mylyn.web.tasks/icons/obj16/overlay-web.gif
new file mode 100644
index 0000000..b168c1c
Binary files /dev/null and b/org.eclipse.mylyn.web.tasks/icons/obj16/overlay-web.gif differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/obj16/repository-web.gif b/org.eclipse.mylyn.web.tasks/icons/obj16/repository-web.gif
new file mode 100644
index 0000000..229c391
Binary files /dev/null and b/org.eclipse.mylyn.web.tasks/icons/obj16/repository-web.gif differ
diff --git a/org.eclipse.mylyn.web.tasks/plugin.xml b/org.eclipse.mylyn.web.tasks/plugin.xml
new file mode 100644
index 0000000..8282524
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/plugin.xml
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ id="org.eclipse.mylyn.web.repository"
+ name="Generic web-based access (Advanced)"
+ point="org.eclipse.mylyn.tasks.ui.repositories">
+ <connectorCore
+ class="org.eclipse.mylyn.internal.web.tasks.WebRepositoryConnector"
+ id="org.eclipse.mylyn.web.tasklist.repositories"
+ name="Web Templates Core"/>
+ <connectorUi
+ brandingIcon="icons/obj16/repository-web.gif"
+ class="org.eclipse.mylyn.internal.web.tasks.WebConnectorUi"
+ name="Web Templates UI"
+ overlayIcon="icons/obj16/overlay-web.gif"/>
+ <taskListMigrator
+ class="org.eclipse.mylyn.internal.web.tasks.WebTaskListMigrator">
+ </taskListMigrator>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.editors">
+ <pageFactory
+ class="org.eclipse.mylyn.internal.web.tasks.WebTaskEditorPageFactory"
+ id="org.eclipse.mylyn.web.tasks.pageFactory">
+ </pageFactory>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.core.templates">
+ <repository
+ repositoryKind="web"
+ label="Subclipse (IssueZilla)"
+ urlRepository="http://subclipse.tigris.org/issues"
+ urlTask="${serverUrl}/show_bug.cgi?id="
+ urlNewTask="${serverUrl}/enter_bug.cgi?component=subclipse"
+ urlTaskQuery="${serverUrl}/buglist.cgi?issue_status=NEW&issue_status=STARTED&issue_status=REOPENED&order=Issue+Number">
+ <attribute name="queryPattern"
+ value="<a href="show_bug.cgi\?id\=(.+?)">.+?<span class="summary">(.+?)</span>"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="GlasFish (IssueZilla)"
+ urlRepository="https://glassfish.dev.java.net/issues"
+ urlNewTask="${serverUrl}/enter_bug.cgi?issue_type=DEFECT"
+ urlTask="${serverUrl}/show_bug.cgi?id="
+ urlTaskQuery="${serverUrl}/buglist.cgi?component=glassfish&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED&order=Issue+Number">
+ <attribute name="queryPattern"
+ value="<a href="show_bug.cgi\?id\=(.+?)">.+?<span class="summary">(.+?)</span>"/>
+ </repository>
+ <!--
+ <repository
+ repositoryKind="web"
+ label="Spring Framework (Jira)"
+ urlRepository="http://opensource.atlassian.com/projects/spring"
+ urlNewTask="${serverUrl}/secure/CreateIssue!default.jspa?pid=${projectId}"
+ urlTask="${serverUrl}/browse/SPR"
+ urlTaskQuery="${serverUrl}/secure/IssueNavigator.jspa?reset=true&mode=hide&pid=${projectId}&resolution=-1&sorter/field=updated&sorter/order=DESC">
+ <attribute name="queryPattern"
+ value="<td class="nav summary">\s+?<a href="/projects/spring/browse/(.+?)".+?>(.+?)</a>"/>
+ <attribute name="param_projectId" value="10000"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="SpringIDE (Trac)"
+ urlRepository="http://springide.org/project"
+ urlTask="${serverUrl}/ticket/"
+ urlNewTask="${serverUrl}/newticket"
+ urlTaskQuery="${serverUrl}/query?status=new&status=assigned&status=reopened&order=id">
+ <attribute name="queryPattern"
+ value="<td class="summary"><a href="/project/ticket/(.+?)" title="View ticket">(.+?)</a></td>"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="edgewall.org (Trac)"
+ urlRepository="http://trac.edgewall.org"
+ urlTask="${serverUrl}/ticket/"
+ urlNewTask="${serverUrl}/newticket"
+ urlTaskQuery="${serverUrl}/query?status=new&status=assigned&status=reopened&order=id">
+ <attribute name="queryPattern"
+ value="<td class="summary"><a href="/ticket/(.+?)" title="View ticket">(.+?)</a></td>"/>
+ </repository>
+ -->
+ <repository
+ repositoryKind="web"
+ label="ASM (GForge)"
+ urlRepository="http://forge.objectweb.org"
+ urlTask="${serverUrl}/tracker/?group_id=${group_id}&func=detail&atid=${atid}&aid="
+ urlNewTask="${serverUrl}/tracker/?group_id=${group_id}&func=add"
+ urlTaskQuery="${serverUrl}/tracker/?group_id=${group_id}&atid=${atid}&_status=100&set=custom">
+ <attribute name="param_group_id" value="23"/>
+ <attribute name="param_atid" value="100023"/>
+ <attribute name="queryPattern"
+ value="<tr.*?><td.+?>.+?</td><td><a.+?href="/tracker/index.php\?func=detail&aid=({Id}.+?)&group_id=${group_id}&atid=${atid}">({Description}.+?)</a></td><td>({Open}.+?)</td><td>({Owner}.+?)</td><td>({Reporter}.+?)</td><td>({Status}.+?)</td><td>({Resolution}.+?)</td><td>({Priority}.+?)</td></tr>"/>
+ <attribute name="loginRequestUrl"
+ value="${serverUrl}/account/login.php?return_to=&form_loginname=${userId}&form_pw=${password}&login=Login&stay_in_ssl=1"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="SourceForge (Azureus)"
+ urlRepository="http://sourceforge.net/"
+ urlTask="${serverUrl}/tracker/?group_id=${group_id}&func=detail&atid=${atid}&aid="
+ urlNewTask="${serverUrl}/tracker/?group_id=${group_id}&func=add"
+ urlTaskQuery="${serverUrl}/tracker/?group_id=${group_id}&atid=${atid}">
+ <attribute name="param_group_id" value="84122"/>
+ <attribute name="param_atid" value="575154"/>
+ <attribute name="queryPattern"
+ value="<a href="/tracker/index.php\?func=detail&amp;aid=(.+?)&amp;group_id=${group_id}&amp;atid=${atid}">(.+?)</a>"/>
+ <attribute name="loginRequestMethod" value="POST"/>
+ <attribute name="loginRequestUrl"
+ value="${serverUrl}/account/login.php?form_loginname=${userId}&form_pw=${password}&login=Login"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="phpbb.com (phpBB)"
+ urlRepository="http://www.phpbb.com/phpBB"
+ urlTask="${serverUrl}/viewtopic.php?t="
+ urlNewTask="${serverUrl}/posting.php?mode=newtopic&f=1"
+ urlTaskQuery="${serverUrl}/viewforum.php?f=1">
+ <attribute name="queryPattern"
+ value="<li class="row .+?<dt style="".+?title=".+?"><a href=".+?viewtopic.php\?.+?t=(\d+?)(?:&.+?)?" class="topictitle">(.+?)</a>.+?</dt>.+?</li>"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="Spring IDE Forum (vBulletin)"
+ urlRepository="http://forum.springframework.org"
+ urlTask="${serverUrl}/showthread.php?t="
+ urlNewTask="${serverUrl}"
+ urlTaskQuery="${serverUrl}/forumdisplay.php?f=${forumId}">
+ <attribute name="param_forumId" value="32"/>
+ <attribute name="queryPattern"
+ value="<a href="showthread.php\?.+?t=(\d+?)" id="thread_title_\1">(.+?)</a>"/>
+ </repository>
+ <repository
+ repositoryKind="web"
+ label="Eclipse Outliner (Google Code)"
+ urlRepository="http://code.google.com/p/eclipse-outliner/issues"
+ urlTask="${serverUrl}/detail?id="
+ urlNewTask="${serverUrl}/entry"
+ urlTaskQuery="${serverUrl}/csv?colspec=ID+Status+Type+Owner+Summary">
+ <attribute name="queryPattern"
+ value=""({Id}[0-9]+?)","({Status}.*?)","({Type}.*?)","({Owner}.*?)","({Description}.*?)"\n"/>
+ </repository>
+ <repository
+ anonymous="false"
+ label="Eclipse Plugin for Mantis (Mantis)"
+ repositoryKind="web"
+ urlNewTask="${serverUrl}/bug_report_page.php"
+ urlRepository="http://www.futureware.biz/mantis"
+ urlTask="${serverUrl}/view.php?id="
+ urlTaskQuery="${serverUrl}/view_all_bug_page.php">
+ <attribute name="loginRequestMethod" value="POST"/>
+ <attribute name="loginRequestUrl"
+ value="${serverUrl}/login.php?username=${userId}&password=${password}"/>
+ <attribute name="queryPattern"
+ value="<tr .+?<a href="view.php\?id=(.+?)">.+?<td class="left">(.+?)</td></tr>"/>
+ </repository>
+ <!--
+ <repository
+ anonymous="true"
+ label="ChangeLogic (anonymous)"
+ repositoryKind="web"
+ urlNewTask="${serverUrl}/index.php?event=Add_task"
+ urlRepository="http://changelogic.araneaframework.org"
+ urlTask="${serverUrl}/index.php?event=Show_public_task&task_id="
+ urlTaskQuery="${serverUrl}/index.php?event=Show_public_task_list">
+ <attribute name="queryPattern"
+ value="<a href="index.php\?event\=Show_public_task&amp;task_id\=.+?&amp;project_id\=0">(.+?)</a>.+?</td>.+?<td>.+?</td>.+?<td>.+?</td>.+?<td>.+?</td>.+?<td>(.+?)</td>"/>
+ </repository>
+ -->
+ <repository
+ anonymous="false"
+ label="Aranea Framework (ChangeLogic)"
+ repositoryKind="web"
+ urlRepository="http://changelogic.araneaframework.org"
+ urlTask="${serverUrl}/index.php?event=Show_task&task_id="
+ urlNewTask="${serverUrl}/index.php?event=Add_task&project_id=${project_id}"
+ urlTaskQuery="${serverUrl}/index.php?event=Show_public_task_list&project_id=${project_id}&page=-1&cookietest=2">
+ <attribute
+ name="loginFormUrl"
+ value="${serverUrl}/index.php?cookietest=1">
+ </attribute>
+ <attribute name="loginTokenPattern"
+ value="<form name="Login_form" method=".+?" action="index.php\?event\=Login&amp;.*?project_id\=0&amp;link_uid\=(\p{Alnum}+?)\".*?>"/>
+ <attribute name="loginRequestMethod" value="POST"/>
+ <attribute name="loginRequestUrl"
+ value="${serverUrl}/index.php?event=Login&link_uid=${loginToken}&username=${userId}&password=${password}"/>
+ <attribute name="queryPattern"
+ value="<a href="index.php\?event\=Show_.+?task.+?task_id=(.+?)&.+?</td>.+?<td>.+?</td>.+?<td>.+?</td>.+?<td>.+?</td>.+?<td>.+?</td>.+?<td>(.+?)</td>"/>
+ <attribute name="param_project_id" value="1"/>
+ </repository>
+
+ <repository
+ anonymous="false"
+ label="OTRS"
+ repositoryKind="web"
+ urlRepository="http://demo.otrs.org"
+ urlNewTask="${serverUrl}/otrs/index.pl?Action=AgentTicketPhone"
+ urlTask="${serverUrl}/otrs/index.pl?Action=AgentTicketZoom&TicketID="
+ urlTaskQuery="${serverUrl}/otrs/index.pl?Action=AgentTicketMailbox">
+ <attribute name="queryPattern"
+ value="<a href=\"/otrs/index.pl\?Action=AgentTicketZoom&TicketID=(.+?)".+?<b>Subject:</b>.+?<div title=".+?">(.+?)</div></td>"/>
+ <attribute name="loginRequestUrl"
+ value="${serverUrl}/otrs/index.pl?Action=Login&User=${userId}&Password=${password}"/>
+ </repository>
+
+ <repository
+ anonymous="false"
+ label="JavaForge (CodeLogic)"
+ repositoryKind="web"
+ urlRepository="http://www.javaforge.com/proj/tracker"
+ urlTask="${serverUrl}/itemDetails.do?navigation=true&task_id="
+ urlNewTask="${serverUrl}/submitNew.do?tracker_id=${tracker_id}"
+ urlTaskQuery="${serverUrl}/browseAllTrackers.do?proj_id=${proj_id}&tracker_type_id=${tracker_type_id}&onlyOpen=false&pagesize=0">
+ <attribute name="queryPattern"
+ value="<a href="/proj/tracker/itemDetails.do\?.+?task_id=(\d+?)">(.+?)</a>"/>
+ <attribute name="param_tracker_id" value="41"/>
+ <attribute name="param_tracker_type_id" value="2"/>
+ <attribute name="param_proj_id" value="11"/>
+ </repository>
+
+ <repository
+ anonymous="true"
+ label="Eclipse Plugin Central (RSS)"
+ repositoryKind="web"
+ urlRepository="http://www.eclipseplugincentral.com/"
+ urlTaskQuery="http://www.eclipseplugincentral.com/pluginfeed.rss">
+ </repository>
+
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/NamedPattern.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/NamedPattern.java
new file mode 100644
index 0000000..12dcbb5
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/NamedPattern.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class NamedPattern {
+ private final List<String> groups = new ArrayList<String>();
+
+ private final Pattern pattern;
+
+ public NamedPattern(String namedRegex, int flags) {
+ pattern = Pattern.compile(prepare(namedRegex), flags);
+ }
+
+ public Pattern getPattern() {
+ return pattern;
+ }
+
+ public Matcher matcher(CharSequence input) {
+ return pattern.matcher(input);
+ }
+
+ public List<String> getGroups() {
+ return groups;
+ }
+
+ public String groupName(int i) {
+ return groups.get(i);
+ }
+
+ public String group(String name, Matcher m) {
+ int n = groups.indexOf(name);
+ return n == -1 ? null : m.group(n + 1);
+ }
+
+ private String prepare(String namedRegex) {
+ StringBuilder regex = new StringBuilder();
+ Matcher m = Pattern.compile("\\((\\{(\\S+?)})").matcher(namedRegex);
+ int pos = 0;
+ while (m.find()) {
+ groups.add(m.group(2));
+ regex.append(namedRegex.substring(pos, m.start(1)));
+ pos = m.end();
+ }
+ return regex.append(namedRegex.substring(pos)).toString();
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParameterEditorDialog.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParameterEditorDialog.java
new file mode 100644
index 0000000..e02c959
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParameterEditorDialog.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Property editor dialog
+ *
+ * @author Eugene Kuleshov
+ */
+public class ParameterEditorDialog extends Dialog {
+ private final String title;
+
+ private String name;
+
+ private String value;
+
+ private Text valueText;
+
+ private Text nameText;
+
+ private Text status;
+
+ public ParameterEditorDialog(Shell parent) {
+ super(parent);
+ this.title = "New Property";
+ }
+
+ public ParameterEditorDialog(Shell parent, String name, String value) {
+ super(parent);
+ this.title = "Edit Property";
+ this.name = name;
+ this.value = value;
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ composite.setLayout(gridLayout);
+
+ Label nameLabel = new Label(composite, SWT.NONE);
+ nameLabel.setText("&Name:");
+
+ nameText = new Text(composite, SWT.BORDER);
+ GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gridData.widthHint = 300;
+ nameText.setLayoutData(gridData);
+
+ Label valueLabel = new Label(composite, SWT.NONE);
+ valueLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ valueLabel.setText("&Value:");
+
+ valueText = new Text(composite, SWT.BORDER);
+ GridData gridData_1 = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gridData_1.widthHint = 300;
+ valueText.setLayoutData(gridData_1);
+
+ if (name != null) {
+ nameText.setText(name.trim());
+ valueText.setFocus();
+ }
+ if (value != null) {
+ valueText.setText(value);
+ valueText.setSelection(0, value.length());
+ }
+
+ ModifyListener updateListener = new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateButtons();
+ }
+ };
+ nameText.addModifyListener(updateListener);
+ valueText.addModifyListener(updateListener);
+ new Label(composite, SWT.NONE);
+
+ status = new Text(composite, SWT.READ_ONLY);
+ status.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ return composite;
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ if (title != null) {
+ shell.setText(title);
+ }
+ }
+
+ @Override
+ public void create() {
+ super.create();
+ updateButtons();
+ }
+
+ private void updateButtons() {
+ name = nameText.getText().trim();
+ value = valueText.getText();
+
+ getButton(IDialogConstants.OK_ID).setEnabled(isValid());
+ }
+
+ private boolean isValid() {
+ if (name.length() == 0 || !Character.isLetter(name.charAt(0))) {
+ status.setText("Name should be a Java identifier");
+ return false;
+ }
+ for (int i = 1; i < name.length(); i++) {
+ char c = name.charAt(i);
+ if (Character.isLetterOrDigit(c) || c == '_' || c == '-') {
+ continue;
+ }
+ status.setText("Name should be a Java identifier");
+ return false;
+ }
+ status.setText("");
+ return true;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParametersEditor.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParametersEditor.java
new file mode 100644
index 0000000..fec180f
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParametersEditor.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * Parameters editor table
+ *
+ * @author Eugene Kuleshov
+ */
+public class ParametersEditor extends Composite {
+
+ private final Table paramsTable;
+
+ public ParametersEditor(Composite parent, int style) {
+ super(parent, style);
+
+ GridLayout gridLayout = new GridLayout(2, false);
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ setLayout(gridLayout);
+
+ paramsTable = new Table(this, SWT.FULL_SELECTION | SWT.BORDER | SWT.MULTI);
+ GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3);
+ gridData1.minimumHeight = 70;
+ paramsTable.setLayoutData(gridData1);
+ paramsTable.setLinesVisible(true);
+ paramsTable.setHeaderVisible(true);
+
+ TableColumn colVariable = new TableColumn(paramsTable, SWT.NONE);
+ colVariable.setWidth(170);
+ colVariable.setText("Parameter");
+
+ TableColumn colValue = new TableColumn(paramsTable, SWT.NONE);
+ colValue.setWidth(280);
+ colValue.setText("Value");
+
+ Button bAdd = new Button(this, SWT.NONE);
+ bAdd.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+ bAdd.setText("&Add...");
+ bAdd.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ ParameterEditorDialog dlg = new ParameterEditorDialog(Display.getCurrent().getActiveShell());
+ if (dlg.open() == Window.OK) {
+ TableItem item = new TableItem(paramsTable, SWT.NONE);
+ item.setText(new String[] { dlg.getName(), dlg.getValue() });
+ }
+ }
+ });
+
+ final Button bRemove = new Button(this, SWT.NONE);
+ bRemove.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+ bRemove.setText("&Remove");
+ bRemove.setEnabled(false);
+ bRemove.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ int[] indices = paramsTable.getSelectionIndices();
+ paramsTable.remove(indices);
+ }
+ });
+
+ final Button bEdit = new Button(this, SWT.NONE);
+ bEdit.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
+ bEdit.setText("&Edit...");
+ bEdit.setEnabled(false);
+ bEdit.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ TableItem item = paramsTable.getSelection()[0];
+ ParameterEditorDialog dlg = new ParameterEditorDialog(Display.getCurrent().getActiveShell(),
+ item.getText(0), item.getText(1));
+ if (dlg.open() == Window.OK) {
+ item.setText(0, dlg.getName());
+ item.setText(1, dlg.getValue());
+ }
+ }
+ });
+
+ paramsTable.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ bRemove.setEnabled(paramsTable.getSelectionCount() > 0);
+ bEdit.setEnabled(paramsTable.getSelectionCount() == 1);
+ }
+ });
+ }
+
+ public void removeAll() {
+ paramsTable.removeAll();
+ }
+
+ public void add(String name, String value) {
+ TableItem item = new TableItem(paramsTable, SWT.NONE);
+ item.setText(new String[] { name, value });
+ }
+
+ public Map<String, String> getParameters() {
+ Map<String, String> parameters = new LinkedHashMap<String, String>();
+ for (TableItem item : paramsTable.getItems()) {
+ parameters.put(WebRepositoryConnector.PARAM_PREFIX + item.getText(0), item.getText(1));
+ }
+ return parameters;
+ }
+
+ public void addParams(Map<String, String> props, LinkedHashMap<String, String> variables) {
+ Map<String, String> params = new LinkedHashMap<String, String>();
+ for (Map.Entry<String, String> e : props.entrySet()) {
+ String key = e.getKey();
+ String value = e.getValue();
+ if (key.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
+ params.put(key.substring(WebRepositoryConnector.PARAM_PREFIX.length()), value);
+ }
+ for (String var : WebRepositoryConnector.getTemplateVariables(value)) {
+ variables.put(var, "");
+ }
+ }
+
+ variables.remove(WebRepositoryConnector.PARAM_SERVER_URL);
+ variables.remove(WebRepositoryConnector.PARAM_USER_ID);
+ variables.remove(WebRepositoryConnector.PARAM_PASSWORD);
+
+ for (String var : variables.keySet()) {
+ if (!params.containsKey(var)) {
+ params.put(var, "");
+ }
+ }
+
+ for (Map.Entry<String, String> e : params.entrySet()) {
+ add(e.getKey(), e.getValue());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/TasksWebPlugin.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/TasksWebPlugin.java
new file mode 100644
index 0000000..d42d8b8
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/TasksWebPlugin.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class TasksWebPlugin extends AbstractUIPlugin {
+
+ public static final String ID_PLUGIN = "org.eclipse.mylyn.tasks.web";
+
+ private static TasksWebPlugin plugin;
+
+ public TasksWebPlugin() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ public static TasksWebPlugin getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/Util.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/Util.java
new file mode 100644
index 0000000..c60331c
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/Util.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+/**
+ * Utility methods
+ *
+ * @author Eugene Kuleshov
+ */
+public class Util {
+
+ public static boolean isPresent(String value) {
+ return value != null && value.length() > 0;
+ }
+
+ public static String nvl(String value) {
+ return value == null ? "" : value;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebConnectorUi.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebConnectorUi.java
new file mode 100644
index 0000000..a5b04ab
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebConnectorUi.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.web.tasks;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskMapping;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
+import org.eclipse.mylyn.tasks.ui.wizards.NewWebTaskWizard;
+import org.eclipse.mylyn.tasks.ui.wizards.RepositoryQueryWizard;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ */
+public class WebConnectorUi extends AbstractRepositoryConnectorUi {
+
+ @Override
+ public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) {
+ return new WebRepositorySettingsPage(taskRepository);
+ }
+
+ @Override
+ public IWizard getNewTaskWizard(TaskRepository taskRepository, ITaskMapping taskSelection) {
+ return new NewWebTaskWizard(taskRepository, WebRepositoryConnector.evaluateParams(
+ taskRepository.getProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL), taskRepository),
+ taskSelection);
+ }
+
+ @Override
+ public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery query) {
+ RepositoryQueryWizard wizard = new RepositoryQueryWizard(repository);
+ wizard.addPage(new WebQueryWizardPage(repository, query));
+ return wizard;
+ }
+
+ /**
+ * Task kind overlay, recommended to override with connector-specific overlay.
+ */
+ @Override
+ public ImageDescriptor getTaskKindOverlay(ITask task) {
+ if (task.getConnectorKind().equals(WebRepositoryConnector.REPOSITORY_TYPE)) {
+ return WebImages.OVERLAY_TASK_WEB;
+ }
+ return null;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return WebRepositoryConnector.REPOSITORY_TYPE;
+ }
+
+ @Override
+ public boolean hasSearchPage() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebContentProposalProvider.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebContentProposalProvider.java
new file mode 100644
index 0000000..5a4ee88
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebContentProposalProvider.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.bindings.keys.KeyStroke;
+import org.eclipse.jface.bindings.keys.ParseException;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.jface.fieldassist.FieldDecoration;
+import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposalListener;
+import org.eclipse.jface.fieldassist.IContentProposalListener2;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.IControlContentAdapter;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class WebContentProposalProvider implements IContentProposalProvider {
+
+ private final ParametersEditor parametersEditor;
+
+ private final boolean includeTemplates;
+
+ public WebContentProposalProvider(ParametersEditor parametersEditor, boolean includeTemplates) {
+ this.parametersEditor = parametersEditor;
+ this.includeTemplates = includeTemplates;
+ }
+
+ public IContentProposal[] getProposals(String contents, int position) {
+ ArrayList<IContentProposal> proposals = new ArrayList<IContentProposal>();
+ if (includeTemplates) {
+ addProposal(proposals, "({Id}.+?)");
+ addProposal(proposals, "({Description}.+?)");
+ addProposal(proposals, "({Owner}.+?)");
+ addProposal(proposals, "({Type}.+?)");
+ addProposal(proposals, "({Status}.+?)");
+ // proposals.add("({Due}.+?)");
+ // proposals.add("({Updated}.+?)");
+ // proposals.add("({Created}.+?)");
+ addProposal(proposals, "(.+?)");
+ addProposal(proposals, ".+?");
+ }
+ addProposal(proposals, "${" + WebRepositoryConnector.PARAM_SERVER_URL + "}");
+ addProposal(proposals, "${" + WebRepositoryConnector.PARAM_USER_ID + "}");
+ addProposal(proposals, "${" + WebRepositoryConnector.PARAM_PASSWORD + "}");
+ addProposal(proposals, "${" + WebRepositoryConnector.PARAM_LOGIN_TOKEN + "}");
+ for (String param : parametersEditor.getParameters().keySet()) {
+ addProposal(proposals, "${" + param.substring(WebRepositoryConnector.PARAM_PREFIX.length()) + "}");
+ }
+ addProposal(proposals, "${}");
+ return proposals.toArray(new IContentProposal[proposals.size()]);
+ }
+
+ private boolean addProposal(ArrayList<IContentProposal> proposals, final String content) {
+ return proposals.add(new IContentProposal() {
+
+ public String getContent() {
+ return content;
+ }
+
+ public int getCursorPosition() {
+ return content.length();
+ }
+
+ public String getDescription() {
+ return null;
+ }
+
+ public String getLabel() {
+ return null;
+ }
+
+ });
+ }
+
+ @SuppressWarnings("deprecation")
+ public static ControlDecoration createDecoration(final Text text, //
+ ParametersEditor parametersEditor, boolean includeTemplates) {
+ FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
+ FieldDecoration fieldDecoration = registry.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
+
+ ControlDecoration decoration = new ControlDecoration(text, SWT.LEFT | SWT.TOP);
+ decoration.setImage(fieldDecoration.getImage());
+ decoration.setDescriptionText(fieldDecoration.getDescription());
+ decoration.setShowOnlyOnFocus(true);
+
+ KeyStroke keystroke = null;
+ try {
+ keystroke = KeyStroke.getInstance("Ctrl" + KeyStroke.KEY_DELIMITER + "Space");
+ } catch (ParseException e) {
+ }
+
+ ContentProposalAdapter adapter = new ContentProposalAdapter(text, new TextContentAdapter(), //
+ new WebContentProposalProvider(parametersEditor, includeTemplates), keystroke, null);
+ adapter.setPopupSize(new Point(200, 150));
+ adapter.setPropagateKeys(true);
+ adapter.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE);
+
+ // workaround for bug 196565
+ WebContentProposalListener listener = new WebContentProposalListener(adapter);
+ adapter.addContentProposalListener((IContentProposalListener) listener);
+ adapter.addContentProposalListener((IContentProposalListener2) listener);
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_IGNORE);
+
+ return decoration;
+ }
+
+ static class WebContentProposalListener implements IContentProposalListener, IContentProposalListener2 {
+
+ private final ContentProposalAdapter adapter;
+
+ private int startCaretPosition;
+
+ private int endCaretPosition;
+
+ public WebContentProposalListener(ContentProposalAdapter adapter) {
+ this.adapter = adapter;
+ }
+
+ public void proposalAccepted(IContentProposal proposal) {
+ IControlContentAdapter contentAdapter = adapter.getControlContentAdapter();
+ Control control = adapter.getControl();
+ StringBuilder sb = new StringBuilder(contentAdapter.getControlContents(control));
+ sb.insert(contentAdapter.getCursorPosition(control), //
+ proposal.getContent().substring(endCaretPosition - startCaretPosition));
+ contentAdapter.setControlContents(control, sb.toString(), //
+ startCaretPosition + proposal.getCursorPosition());
+ }
+
+ public void proposalPopupOpened(ContentProposalAdapter adapter) {
+ startCaretPosition = adapter.getControlContentAdapter().getCursorPosition(adapter.getControl());
+ }
+
+ public void proposalPopupClosed(ContentProposalAdapter adapter) {
+ endCaretPosition = adapter.getControlContentAdapter().getCursorPosition(adapter.getControl());
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebImages.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebImages.java
new file mode 100644
index 0000000..33dbfd3
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebImages.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class WebImages {
+
+ private static ImageRegistry imageRegistry;
+
+ private static final String T_OBJ = "obj16";
+
+ private static final URL baseURL = TasksWebPlugin.getDefault().getBundle().getEntry("/icons/");
+
+ public static final ImageDescriptor OVERLAY_TASK_WEB = create(T_OBJ, "overlay-web.gif");
+
+ public static ImageDescriptor create(String prefix, String name) {
+ try {
+ return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
+ } catch (MalformedURLException e) {
+ return ImageDescriptor.getMissingImageDescriptor();
+ }
+ }
+
+ private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
+ if (baseURL == null) {
+ throw new MalformedURLException();
+ }
+
+ StringBuilder buffer = new StringBuilder(prefix);
+ buffer.append('/');
+ buffer.append(name);
+ return new URL(baseURL, buffer.toString());
+ }
+
+ private static ImageRegistry getImageRegistry() {
+ if (imageRegistry == null) {
+ imageRegistry = new ImageRegistry();
+ }
+
+ return imageRegistry;
+ }
+
+ /**
+ * Lazily initializes image map.
+ */
+ public static Image getImage(ImageDescriptor imageDescriptor) {
+ ImageRegistry imageRegistry = getImageRegistry();
+
+ Image image = imageRegistry.get("" + imageDescriptor.hashCode());
+ if (image == null) {
+ image = imageDescriptor.createImage();
+ imageRegistry.put("" + imageDescriptor.hashCode(), image);
+ }
+ return image;
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java
new file mode 100644
index 0000000..43caa66
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java
@@ -0,0 +1,520 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Wizard page for configuring and preview web query
+ *
+ * @author Eugene Kuleshov
+ */
+public class WebQueryWizardPage extends AbstractRepositoryQueryPage {
+
+ private Text queryUrlText;
+
+ private Text queryPatternText;
+
+ private TableViewer previewTable;
+
+ private String webPage;
+
+ private UpdatePreviewJob updatePreviewJob;
+
+ private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
+
+ private ParametersEditor parametersEditor;
+
+ private Map<String, String> oldProperties;
+
+ private final ArrayList<ControlDecoration> decorations = new ArrayList<ControlDecoration>();
+
+ private Text title;
+
+ public WebQueryWizardPage(TaskRepository repository, IRepositoryQuery query) {
+ super("New web query", repository, query);
+ setTitle("Create web query");
+ setDescription("Specify query parameters for " + repository.getRepositoryUrl());
+ }
+
+ @Override
+ public void dispose() {
+ for (ControlDecoration decoration : decorations) {
+ decoration.dispose();
+ }
+ super.dispose();
+ }
+
+ private static String getDefaultQueryTitle(TaskRepository repository) {
+ String label = repository.getRepositoryLabel();
+ String title = label;
+ for (int n = 1; hasQueryWithTitle(repository, title); n++) {
+ title = label + " " + n;
+ }
+ return title;
+ }
+
+ @SuppressWarnings("restriction")
+ private static boolean hasQueryWithTitle(TaskRepository repository, String title) {
+ Set<org.eclipse.mylyn.internal.tasks.core.RepositoryQuery> queries = org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTaskList()
+ .getRepositoryQueries(repository.getRepositoryUrl());
+ for (IRepositoryQuery query : queries) {
+ if (query.getSummary().equals(title)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void createTitleGroup(Composite parent) {
+ Composite group = new Composite(parent, SWT.NONE);
+
+ GridLayout layout = new GridLayout(2, false);
+ group.setLayout(layout);
+
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 1;
+ group.setLayoutData(gd);
+
+ Label label = new Label(group, SWT.NONE);
+ label.setText("Query Title:");
+
+ title = new Text(group, SWT.BORDER);
+ title.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+ title.setText(getQuery() == null ? getDefaultQueryTitle(getTaskRepository()) : getQuery().getSummary());
+ title.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ setPageComplete(isPageComplete());
+ }
+ });
+ title.setFocus();
+ }
+
+ @Override
+ public String getQueryTitle() {
+ return (title != null) ? title.getText() : null;
+ }
+
+ public void createControl(Composite parent) {
+ final Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.marginHeight = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.verticalSpacing = 0;
+ gridLayout.numColumns = 1;
+ composite.setLayout(gridLayout);
+
+ if (!inSearchContainer()) {
+ createTitleGroup(composite);
+ }
+
+ parametersEditor = new ParametersEditor(composite, SWT.NONE);
+ GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData1.minimumHeight = 90;
+ parametersEditor.setLayoutData(gridData1);
+
+ ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, ExpandableComposite.COMPACT
+ | ExpandableComposite.TWISTIE);
+ expComposite.setFont(parent.getFont());
+ GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, true, false);
+ gridData_1.heightHint = 150;
+ gridData_1.minimumHeight = 150;
+ expComposite.setLayoutData(gridData_1);
+ expComposite.setBackground(parent.getBackground());
+ expComposite.setText("Advanced &Configuration");
+ expComposite.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ getControl().getShell().pack();
+ }
+ });
+ toolkit.paintBordersFor(expComposite);
+
+ Composite composite1 = toolkit.createComposite(expComposite, SWT.BORDER);
+ composite1.setLayout(new GridLayout(3, false));
+ expComposite.setClient(composite1);
+
+ toolkit.createLabel(composite1, "&Query URL:", SWT.NONE);
+
+ queryUrlText = new Text(composite1, SWT.BORDER);
+ final GridData gridData_2 = new GridData(SWT.FILL, SWT.CENTER, true, false);
+ gridData_2.widthHint = 200;
+ queryUrlText.setLayoutData(gridData_2);
+ queryUrlText.addModifyListener(new ModifyListener() {
+ public void modifyText(final ModifyEvent e) {
+ webPage = null;
+ }
+ });
+ decorations.add(WebContentProposalProvider.createDecoration(queryUrlText, parametersEditor, false));
+
+ Button button = new Button(composite1, SWT.NONE);
+ button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+ button.setText("&Open");
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ openBrowser();
+ }
+ });
+
+ Label queryPatternLabel = toolkit.createLabel(composite1, "Query &Pattern:", SWT.NONE);
+ queryPatternLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
+
+ queryPatternText = new Text(composite1, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
+ GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
+ gridData.widthHint = 200;
+ gridData.heightHint = 60;
+ queryPatternText.setLayoutData(gridData);
+ decorations.add(WebContentProposalProvider.createDecoration(queryPatternText, parametersEditor, true));
+
+ Button preview = new Button(composite1, SWT.NONE);
+ preview.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+ preview.setText("Previe&w");
+ preview.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(final SelectionEvent e) {
+ webPage = null;
+ updatePreview();
+ }
+ });
+
+ previewTable = new TableViewer(composite1, SWT.BORDER);
+ // previewTable = new Table(composite1, SWT.BORDER);
+ GridData gridData2 = new GridData(SWT.FILL, SWT.FILL, false, true, 3, 1);
+ gridData2.heightHint = 60;
+
+ Table table = previewTable.getTable();
+ table.setLayoutData(gridData2);
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ TableColumn colId = new TableColumn(table, SWT.NONE);
+ colId.setWidth(100);
+ colId.setText("Id");
+
+ TableColumn colDescription = new TableColumn(table, SWT.NONE);
+ colDescription.setWidth(200);
+ colDescription.setText("Description");
+
+ TableColumn colStatus = new TableColumn(table, SWT.NONE);
+ colStatus.setText("Status");
+ colStatus.setWidth(80);
+
+ TableColumn colType = new TableColumn(table, SWT.NONE);
+ colType.setText("Type");
+ colType.setWidth(80);
+
+ TableColumn colOwner = new TableColumn(table, SWT.NONE);
+ colOwner.setText("Owner");
+ colOwner.setWidth(120);
+
+ previewTable.setColumnProperties(new String[] { "Id", "Description", "Status", "Type", "Owner" });
+ previewTable.setContentProvider(new IStructuredContentProvider() {
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof Collection<?>) {
+ return ((Collection<?>) inputElement).toArray();
+ }
+ return new Object[0];
+ }
+ });
+
+ previewTable.setLabelProvider(new ITableLabelProvider() {
+
+ public String getColumnText(Object element, int columnIndex) {
+ TaskMapper task = (TaskMapper) element;
+ switch (columnIndex) {
+ case 0:
+ return task.getTaskData().getTaskId();
+ case 1:
+ return task.getSummary();
+ case 2:
+ return task.getCompletionDate() != null ? "complete" : "incomplete";
+ case 3:
+ return task.getTaskKind();
+ case 4:
+ return task.getOwner();
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+ });
+
+ setControl(composite);
+
+ LinkedHashMap<String, String> vars = new LinkedHashMap<String, String>();
+ Map<String, String> params = new LinkedHashMap<String, String>();
+ if (getTaskRepository() != null) {
+ queryUrlText.setText(addVars(vars, getTaskRepository().getProperty(
+ WebRepositoryConnector.PROPERTY_QUERY_URL)));
+ queryPatternText.setText(addVars(vars, getTaskRepository().getProperty(
+ WebRepositoryConnector.PROPERTY_QUERY_REGEXP)));
+
+ oldProperties = getTaskRepository().getProperties();
+ params.putAll(oldProperties);
+ }
+ IRepositoryQuery query = getQuery();
+ if (query != null) {
+ setTitle(query.getSummary());
+ queryUrlText.setText(addVars(vars, query.getAttribute(WebRepositoryConnector.KEY_QUERY_TEMPLATE)));
+ queryPatternText.setText(addVars(vars, query.getAttribute(WebRepositoryConnector.KEY_QUERY_PATTERN)));
+ params.putAll(WebRepositoryConnector.getQueryParams(query));
+ }
+ parametersEditor.addParams(params, vars);
+
+ Dialog.applyDialogFont(composite);
+ }
+
+ private static String addVars(LinkedHashMap<String, String> vars, String property) {
+ if (property == null) {
+ return "";
+ }
+ for (String var : WebRepositoryConnector.getTemplateVariables(property)) {
+ vars.put(var, "");
+ }
+ return property;
+ }
+
+ synchronized void updatePreview() {
+ if (updatePreviewJob == null) {
+ updatePreviewJob = new UpdatePreviewJob("Updating preview");
+ updatePreviewJob.setPriority(Job.DECORATE);
+ }
+ updatePreviewJob.setParams(queryUrlText.getText(), queryPatternText.getText(), parametersEditor.getParameters());
+ if (!updatePreviewJob.isActive()) {
+ updatePreviewJob.schedule();
+ }
+ }
+
+ protected void openBrowser() {
+ final String url = queryUrlText.getText();
+ final Map<String, String> params = parametersEditor.getParameters();
+
+ new Job("Opening Browser") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ String evaluatedUrl = WebRepositoryConnector.evaluateParams(url, params, getTaskRepository());
+
+ try {
+ String webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, params, getTaskRepository());
+ File webPageFile = File.createTempFile("mylyn-web-connector", ".html");
+ webPageFile.deleteOnExit();
+
+ FileWriter w = new FileWriter(webPageFile);
+ w.write(webPage);
+ w.flush();
+ w.close();
+
+ IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
+ IWebBrowser browser = browserSupport.getExternalBrowser();
+ browser.openURL(webPageFile.toURL());
+
+ } catch (final Exception e) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ setMessage(e.toString());
+ }
+ });
+ }
+
+ return Status.OK_STATUS;
+ }
+ }.schedule();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return super.isPageComplete();
+ }
+
+ void updatePreviewTable(List<TaskMapper> queryHits, MultiStatus queryStatus) {
+ previewTable.setInput(queryHits);
+
+ if (queryStatus.isOK()) {
+ setMessage(null, IMessageProvider.WARNING);
+ } else {
+ StringBuffer sb = new StringBuffer();
+ for (IStatus status : queryStatus.getChildren()) {
+ sb.append(status.getMessage()).append("\n");
+ }
+ setMessage(sb.toString(), IMessageProvider.WARNING);
+ }
+ }
+
+ private final class UpdatePreviewJob extends Job {
+ private volatile String url;
+
+ private volatile String regexp;
+
+ private volatile Map<String, String> params;
+
+ private volatile boolean active = false;
+
+ private UpdatePreviewJob(String name) {
+ super(name);
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setParams(String url, String regexp, Map<String, String> params) {
+ this.url = url;
+ this.regexp = regexp;
+ this.params = params;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ String currentRegexp = regexp;
+ String queryPattern = WebRepositoryConnector.evaluateParams(currentRegexp, params, getTaskRepository());
+ String evaluatedUrl = WebRepositoryConnector.evaluateParams(url, params, getTaskRepository());
+ String taskPrefix = WebRepositoryConnector.evaluateParams(getTaskRepository().getProperty(
+ WebRepositoryConnector.PROPERTY_TASK_URL), params, getTaskRepository());
+ active = true;
+ do {
+ final MultiStatus queryStatus = new MultiStatus(TasksWebPlugin.ID_PLUGIN, IStatus.OK, "Query result",
+ null);
+ final List<TaskMapper> queryHits = new ArrayList<TaskMapper>();
+ try {
+ if (webPage == null) {
+ webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, params, getTaskRepository());
+ }
+
+ TaskDataCollector collector = new TaskDataCollector() {
+ @Override
+ public void accept(TaskData taskData) {
+ queryHits.add(new TaskMapper(taskData));
+ }
+ };
+ IStatus status;
+ if (queryPattern != null && queryPattern.trim().length() > 0) {
+ status = WebRepositoryConnector.performQuery(webPage, queryPattern, taskPrefix, monitor,
+ collector, getTaskRepository());
+ } else {
+ status = WebRepositoryConnector.performRssQuery(webPage, monitor, collector,
+ getTaskRepository());
+ }
+
+ if (!status.isOK()) {
+ queryStatus.add(status);
+ } else if (queryHits.size() == 0) {
+ queryStatus.add(new Status(IStatus.ERROR, TasksWebPlugin.ID_PLUGIN, 0,
+ "No matching results. Check query regexp", null));
+ }
+
+ } catch (IOException ex) {
+ queryStatus.add(new Status(IStatus.ERROR, TasksWebPlugin.ID_PLUGIN, IStatus.ERROR, //
+ "Unable to fetch resource: " + ex.getMessage(), null));
+ } catch (Exception ex) {
+ queryStatus.add(new Status(IStatus.ERROR, TasksWebPlugin.ID_PLUGIN, IStatus.ERROR, //
+ "Parsing error: " + ex.getMessage(), null));
+ }
+
+ Display.getDefault().asyncExec(new Runnable() {
+ public void run() {
+ updatePreviewTable(queryHits, queryStatus);
+ }
+ });
+ } while (!currentRegexp.equals(currentRegexp) && !monitor.isCanceled());
+ active = false;
+ return Status.OK_STATUS;
+ }
+ }
+
+ @Override
+ public void applyTo(IRepositoryQuery query) {
+ query.setSummary(getQueryTitle());
+ query.setAttribute(WebRepositoryConnector.KEY_QUERY_TEMPLATE, queryUrlText.getText());
+ query.setAttribute(WebRepositoryConnector.KEY_QUERY_PATTERN, queryPatternText.getText());
+ query.setAttribute(WebRepositoryConnector.KEY_TASK_PREFIX, getTaskRepository().getProperty(
+ WebRepositoryConnector.PROPERTY_TASK_URL));
+ Map<String, String> params = parametersEditor.getParameters();
+ query.setUrl(WebRepositoryConnector.evaluateParams(queryUrlText.getText(), params, getTaskRepository()));
+ for (Map.Entry<String, String> entry : params.entrySet()) {
+ query.setAttribute(entry.getKey(), entry.getValue());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java
new file mode 100644
index 0000000..0372b2a
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java
@@ -0,0 +1,682 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import static org.eclipse.mylyn.internal.web.tasks.Util.isPresent;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.codec.EncoderException;
+import org.apache.commons.codec.net.URLCodec;
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.net.AbstractWebLocation;
+import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
+import org.eclipse.mylyn.commons.net.AuthenticationType;
+import org.eclipse.mylyn.commons.net.WebLocation;
+import org.eclipse.mylyn.commons.net.WebUtil;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
+import org.eclipse.mylyn.tasks.core.data.TaskMapper;
+import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
+import org.eclipse.mylyn.tasks.ui.TaskRepositoryLocationUiFactory;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+import com.sun.syndication.feed.module.DCModule;
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.io.SyndFeedInput;
+import com.sun.syndication.io.XmlReader;
+
+/**
+ * Generic connector for web based issue tracking systems
+ *
+ * @author Eugene Kuleshov
+ */
+public class WebRepositoryConnector extends AbstractRepositoryConnector {
+
+ public static final String REPOSITORY_TYPE = "web";
+
+ public static final String PROPERTY_TASK_CREATION_URL = "taskCreationUrl";
+
+ public static final String PROPERTY_TASK_URL = "taskUrl";
+
+ public static final String PROPERTY_QUERY_URL = "queryUrl";
+
+ public static final String PROPERTY_QUERY_METHOD = "queryMethod";
+
+ public static final String PROPERTY_QUERY_REGEXP = "queryPattern";
+
+ public static final String PROPERTY_LOGIN_FORM_URL = "loginFormUrl";
+
+ public static final String PROPERTY_LOGIN_TOKEN_REGEXP = "loginTokenPattern";
+
+ public static final String PROPERTY_LOGIN_REQUEST_METHOD = "loginRequestMethod";
+
+ public static final String PROPERTY_LOGIN_REQUEST_URL = "loginRequestUrl";
+
+ public static final String PARAM_PREFIX = "param_";
+
+ public static final String PARAM_SERVER_URL = "serverUrl";
+
+ public static final String PARAM_USER_ID = "userId";
+
+ public static final String PARAM_PASSWORD = "password";
+
+ public static final String PARAM_LOGIN_TOKEN = "loginToken";
+
+ public static final String REQUEST_POST = "POST";
+
+ public static final String REQUEST_GET = "GET";
+
+ private static final String COMPLETED_STATUSES = "completed|fixed|resolved|invalid|verified|deleted|closed|done";
+
+ public static final String KEY_TASK_PREFIX = "taskPrefix";
+
+ public static final String KEY_QUERY_TEMPLATE = "UrlTemplate";
+
+ public static final String KEY_QUERY_PATTERN = "Regexp";
+
+ private static final String USER_AGENT = "WebTemplatesConnector";
+
+ private final static Date DEFAULT_DATE = new Date(0);
+
+ @Override
+ public String getConnectorKind() {
+ return REPOSITORY_TYPE;
+ }
+
+ @Override
+ public String getLabel() {
+ return "Web Template (Advanced)";
+ }
+
+ @Override
+ public boolean canCreateNewTask(TaskRepository repository) {
+ return repository.hasProperty(PROPERTY_TASK_CREATION_URL);
+ }
+
+ @Override
+ public boolean canCreateTaskFromKey(TaskRepository repository) {
+ return repository.hasProperty(PROPERTY_TASK_URL);
+ }
+
+ @Override
+ public boolean canSynchronizeTask(TaskRepository taskRepository, ITask task) {
+ return false;
+ }
+
+// @Override
+// public AbstractTask createTaskFromExistingId(TaskRepository repository, final String id, IProgressMonitor monitor)
+// throws CoreException {
+// if (REPOSITORY_TYPE.equals(repository.getConnectorKind())) {
+// String taskPrefix = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
+//
+// final WebTask task = new WebTask(id, id, taskPrefix, repository.getRepositoryUrl(), REPOSITORY_TYPE);
+//
+// RetrieveTitleFromUrlJob job = new RetrieveTitleFromUrlJob(taskPrefix + id) {
+// @Override
+// protected void setTitle(String pageTitle) {
+// task.setSummary(pageTitle);
+// TasksUiPlugin.getTaskList().notifyTaskChanged(task, false);
+// }
+// };
+// job.schedule();
+//
+// return task;
+// }
+//
+// return null;
+// }
+
+ @Override
+ public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
+ throws CoreException {
+ String taskPrefix = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
+ TaskData taskData = createTaskData(repository, taskId);
+ TaskMapper mapper = new TaskMapper(taskData, true);
+ mapper.setCreationDate(DEFAULT_DATE);
+ mapper.setSummary(taskId);
+ mapper.setTaskUrl(taskPrefix + taskId);
+ mapper.setValue(KEY_TASK_PREFIX, taskPrefix);
+ try {
+ String pageTitle = WebUtil.getTitleFromUrl(new WebLocation(taskPrefix + taskId), monitor);
+ mapper.setSummary(pageTitle);
+ } catch (IOException e) {
+ // log to error log?
+ }
+ return taskData;
+ }
+
+ @SuppressWarnings("restriction")
+ @Override
+ public String getRepositoryUrlFromTaskUrl(String url) {
+ if (url == null) {
+ return null;
+ }
+
+ // lookup repository using task prefix url
+ IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
+ for (TaskRepository repository : repositoryManager.getRepositories(getConnectorKind())) {
+ String taskUrl = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
+ if (taskUrl != null && !taskUrl.equals("") && url.startsWith(taskUrl)) {
+ return repository.getRepositoryUrl();
+ }
+ }
+
+ for (IRepositoryQuery query : org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal.getTaskList()
+ .getQueries()) {
+ TaskRepository repository = repositoryManager.getRepository(query.getConnectorKind(),
+ query.getRepositoryUrl());
+ if (repository != null) {
+ String queryUrl = evaluateParams(query.getAttribute(KEY_TASK_PREFIX), //
+ getQueryParams(query), repository);
+ if (queryUrl != null && !queryUrl.equals("") && url.startsWith(queryUrl)) {
+ return query.getRepositoryUrl();
+ }
+ }
+ }
+ return null;
+ }
+
+ public static Map<String, String> getQueryParams(IRepositoryQuery query) {
+ Map<String, String> params = new LinkedHashMap<String, String>();
+ Map<String, String> attributes = query.getAttributes();
+ for (String name : attributes.keySet()) {
+ if (name.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
+ params.put(name, attributes.get(name));
+ }
+ }
+ return params;
+ }
+
+ @Override
+ public String getTaskIdFromTaskUrl(String url) {
+ if (url == null) {
+ return null;
+ }
+
+ IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
+ for (TaskRepository repository : repositoryManager.getRepositories(getConnectorKind())) {
+ String start = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
+ if (start != null && url.startsWith(start)) {
+ return url.substring(start.length());
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getTaskUrl(String repositoryUrl, String taskId) {
+ IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
+ TaskRepository repository = repositoryManager.getRepository(getConnectorKind(), repositoryUrl);
+ if (repository != null) {
+ String prefix = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
+ return prefix + taskId;
+ }
+ return null;
+ }
+
+ @Override
+ public IStatus performQuery(TaskRepository repository, IRepositoryQuery query, TaskDataCollector resultCollector,
+ ISynchronizationSession session, IProgressMonitor monitor) {
+ Map<String, String> queryParameters = getQueryParams(query);
+ String queryUrl = evaluateParams(query.getUrl(), queryParameters, repository);
+ try {
+ String content = fetchResource(queryUrl, queryParameters, repository);
+
+ String taskPrefixAttribute = query.getAttribute(KEY_TASK_PREFIX);
+ if (!Util.isPresent(taskPrefixAttribute)) {
+ return performRssQuery(content, monitor, resultCollector, repository);
+ } else {
+ String taskPrefix = evaluateParams(taskPrefixAttribute, queryParameters, repository);
+ String queryPattern = evaluateParams(query.getAttribute(KEY_QUERY_PATTERN), queryParameters, repository);
+ return performQuery(content, queryPattern, taskPrefix, monitor, resultCollector, repository);
+ }
+ } catch (IOException e) {
+ String msg = e.getMessage() == null ? e.toString() : e.getMessage();
+ return new Status(IStatus.ERROR, TasksWebPlugin.ID_PLUGIN, IStatus.ERROR, //
+ "Could not fetch resource: " + queryUrl + "\n" + msg, e);
+ }
+ }
+
+ @Override
+ public boolean isRepositoryConfigurationStale(TaskRepository repository, IProgressMonitor monitor)
+ throws CoreException {
+ return false;
+ }
+
+ @Override
+ public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
+ // ignore
+ }
+
+ @Override
+ public void updateTaskFromTaskData(TaskRepository repository, ITask task, TaskData taskData) {
+ TaskMapper mapper = new TaskMapper(taskData);
+ if (Util.isPresent(mapper.getValue(KEY_TASK_PREFIX))) {
+ task.setAttribute(KEY_TASK_PREFIX, mapper.getValue(KEY_TASK_PREFIX));
+ task.setTaskKey(task.getTaskId());
+ } else {
+ // do not show task id for RSS items
+ task.setTaskKey(null);
+ }
+ mapper.applyTo(task);
+ }
+
+ public static IStatus performQuery(String resource, String regexp, String taskPrefix, IProgressMonitor monitor,
+ TaskDataCollector resultCollector, TaskRepository repository) {
+ NamedPattern p = new NamedPattern(regexp, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL
+ | Pattern.UNICODE_CASE | Pattern.CANON_EQ);
+
+ Matcher matcher = p.matcher(resource);
+
+ if (!matcher.find()) {
+ return Status.OK_STATUS;
+ } else {
+ boolean isCorrect = true;
+ do {
+ if (p.getGroups().isEmpty()) {
+ // "classic" mode, no named patterns
+ if (matcher.groupCount() < 2) {
+ isCorrect = false;
+ }
+ if (matcher.groupCount() >= 1) {
+ String id = matcher.group(1);
+ String description = matcher.groupCount() > 1 ? cleanup(matcher.group(2), repository) : null;
+ description = unescapeHtml(description);
+
+ TaskData data = createTaskData(repository, id);
+ TaskMapper mapper = new TaskMapper(data, true);
+ mapper.setCreationDate(DEFAULT_DATE);
+ mapper.setTaskUrl(taskPrefix + id);
+ mapper.setSummary(description);
+ mapper.setValue(KEY_TASK_PREFIX, taskPrefix);
+ resultCollector.accept(data);
+ }
+ } else {
+ String id = p.group("Id", matcher);
+ String description = p.group("Description", matcher);
+ if (id == null || description == null) {
+ isCorrect = false;
+ }
+ if (id != null) {
+ description = unescapeHtml(description);
+
+ String owner = unescapeHtml(cleanup(p.group("Owner", matcher), repository));
+ String type = unescapeHtml(cleanup(p.group("Type", matcher), repository));
+
+ TaskData data = createTaskData(repository, id);
+ TaskMapper mapper = new TaskMapper(data, true);
+ mapper.setCreationDate(DEFAULT_DATE);
+ mapper.setTaskUrl(taskPrefix + id);
+ mapper.setSummary(description);
+ mapper.setValue(KEY_TASK_PREFIX, taskPrefix);
+ mapper.setOwner(owner);
+ mapper.setTaskKind(type);
+
+ String status = p.group("Status", matcher);
+ if (status != null) {
+ if (COMPLETED_STATUSES.contains(status.toLowerCase())) {
+ // TODO set actual completion date here
+ mapper.setCompletionDate(DEFAULT_DATE);
+ }
+ }
+
+ resultCollector.accept(data);
+ }
+ }
+ } while (matcher.find() && !monitor.isCanceled());
+
+ if (isCorrect) {
+ return Status.OK_STATUS;
+ } else {
+ return new Status(IStatus.ERROR, TasksWebPlugin.ID_PLUGIN, IStatus.ERROR,
+ "Require two matching groups (taskId and summary). Check query regexp", null);
+ }
+ }
+ }
+
+ private static TaskData createTaskData(TaskRepository taskRepository, String id) {
+ TaskData data = new TaskData(new TaskAttributeMapper(taskRepository), WebRepositoryConnector.REPOSITORY_TYPE,
+ taskRepository.getRepositoryUrl(), id);
+ data.setPartial(true);
+ return data;
+ }
+
+ private static String unescapeHtml(String text) {
+ if (text == null) {
+ return "";
+ }
+ return StringEscapeUtils.unescapeHtml(text);
+ }
+
+ private static String cleanup(String text, TaskRepository repository) {
+ if (text == null) {
+ return null;
+ }
+
+ // Has to disable this for now. See bug 166737 and bug 166936
+ // try {
+ // text = URLDecoder.decode(text, repository.getCharacterEncoding());
+ // } catch (UnsupportedEncodingException ex) {
+ // // ignore
+ // }
+
+ text = text.replaceAll("<!--.+?-->", "");
+
+ String[] tokens = text.split(" |\\t|\\n|\\r");
+ StringBuilder sb = new StringBuilder();
+ String sep = "";
+ for (String token : tokens) {
+ if (token.length() > 0) {
+ sb.append(sep).append(token);
+ sep = " ";
+ }
+ }
+
+ return sb.toString();
+ }
+
+ public static IStatus performRssQuery(String content, IProgressMonitor monitor, TaskDataCollector resultCollector,
+ TaskRepository repository) {
+ SyndFeedInput input = new SyndFeedInput();
+ try {
+ SyndFeed feed = input.build(new XmlReader(new ByteArrayInputStream(content.getBytes())));
+
+ SimpleDateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm");
+
+ @SuppressWarnings("unchecked")
+ Iterator it;
+ for (it = feed.getEntries().iterator(); it.hasNext();) {
+ SyndEntry entry = (SyndEntry) it.next();
+
+ String author = entry.getAuthor();
+ if (author == null) {
+ DCModule module = (DCModule) entry.getModule("http://purl.org/dc/elements/1.1/");
+ author = module.getCreator();
+ }
+
+ Date date = entry.getUpdatedDate();
+ if (date == null) {
+ date = entry.getPublishedDate();
+ }
+ if (date == null) {
+ DCModule module = (DCModule) entry.getModule("http://purl.org/dc/elements/1.1/");
+ date = module.getDate();
+ }
+
+ String entryUri = entry.getLink();
+ if (entryUri == null) {
+ entryUri = entry.getUri();
+ }
+
+ String entrTitle = entry.getTitle();
+
+ TaskData data = createTaskData(repository, entryUri.replaceAll("-", "%2D"));
+ TaskMapper schema = new TaskMapper(data, true);
+ schema.setSummary(((date == null ? "" : df.format(date) + " - ") + entrTitle));
+ schema.setCreationDate(date);
+ schema.setOwner(author);
+ schema.setTaskUrl(entryUri);
+ resultCollector.accept(data);
+ }
+ return Status.OK_STATUS;
+ } catch (Exception e) {
+ String msg = e.getMessage() == null ? e.toString() : e.getMessage();
+ return new Status(IStatus.ERROR, TasksWebPlugin.ID_PLUGIN, IStatus.ERROR, //
+ "Failed to parse RSS feed: \"" + msg + "\"", e);
+ }
+ }
+
+ public static String fetchResource(String url, Map<String, String> params, TaskRepository repository)
+ throws IOException {
+ HttpClient client = new HttpClient();
+ WebUtil.configureHttpClient(client, USER_AGENT);
+ AbstractWebLocation location = new TaskRepositoryLocationUiFactory().createWebLocation(repository);
+ HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(client, location, null);
+
+ loginRequestIfNeeded(client, hostConfiguration, params, repository);
+
+ GetMethod method = new GetMethod(url);
+ // method.setFollowRedirects(false);
+ return requestResource(url, client, hostConfiguration, method);
+ }
+
+ private static void loginRequestIfNeeded(HttpClient client, HostConfiguration hostConfiguration,
+ Map<String, String> params, TaskRepository repository) throws HttpException, IOException {
+ if (repository.getCredentials(AuthenticationType.REPOSITORY) == null
+ || !isPresent(repository.getProperty(PROPERTY_LOGIN_REQUEST_URL))) {
+ return;
+ }
+
+ String loginFormUrl = evaluateParams(repository.getProperty(PROPERTY_LOGIN_FORM_URL), params, repository);
+ String loginToken = evaluateParams(repository.getProperty(PROPERTY_LOGIN_TOKEN_REGEXP), params, repository);
+ if (isPresent(loginFormUrl) || isPresent(loginToken)) {
+ GetMethod method = new GetMethod(loginFormUrl);
+ // method.setFollowRedirects(false);
+ String loginFormPage = requestResource(loginFormUrl, client, hostConfiguration, method);
+ if (loginFormPage != null) {
+ Pattern p = Pattern.compile(loginToken);
+ Matcher m = p.matcher(loginFormPage);
+ if (m.find()) {
+ params.put(PARAM_PREFIX + PARAM_LOGIN_TOKEN, m.group(1));
+ }
+ }
+ }
+
+ String loginRequestUrl = evaluateParams(repository.getProperty(PROPERTY_LOGIN_REQUEST_URL), params, repository);
+ requestResource(loginRequestUrl, client, hostConfiguration, getLoginMethod(params, repository));
+ }
+
+ public static HttpMethod getLoginMethod(Map<String, String> params, TaskRepository repository) {
+ String requestMethod = repository.getProperty(PROPERTY_LOGIN_REQUEST_METHOD);
+ String requestTemplate = repository.getProperty(PROPERTY_LOGIN_REQUEST_URL);
+ String requestUrl = evaluateParams(requestTemplate, params, repository);
+
+ if (REQUEST_GET.equals(requestMethod)) {
+ return new GetMethod(requestUrl);
+ // method.setFollowRedirects(false);
+ }
+
+ int n = requestUrl.indexOf('?');
+ if (n == -1) {
+ return new PostMethod(requestUrl);
+ }
+
+ PostMethod postMethod = new PostMethod(requestUrl.substring(0, n));
+ // TODO this does not take into account escaped values
+ n = requestTemplate.indexOf('?');
+ String[] requestParams = requestTemplate.substring(n + 1).split("&");
+ for (String requestParam : requestParams) {
+ String[] nv = requestParam.split("=");
+ if (nv.length == 1) {
+ postMethod.addParameter(nv[0], "");
+ } else {
+ String value = evaluateParams(nv[1], getParams(repository, params), false);
+ postMethod.addParameter(nv[0], value);
+ }
+ }
+ return postMethod;
+ }
+
+ private static String requestResource(String url, HttpClient client, HostConfiguration hostConfiguration,
+ HttpMethod method) throws IOException, HttpException {
+ String refreshUrl = null;
+ try {
+ client.executeMethod(hostConfiguration, method);
+// int statusCode = client.executeMethod(method);
+// if (statusCode == 300 || statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 307) {
+// Header location = method.getResponseHeader("Location");
+// if (location != null) {
+// refreshUrl = location.getValue();
+// if (!refreshUrl.startsWith("/")) {
+// refreshUrl = "/" + refreshUrl;
+// }
+// }
+// }
+
+ refreshUrl = getRefreshUrl(url, method);
+ if (refreshUrl == null) {
+ return method.getResponseBodyAsString();
+ }
+ } finally {
+ method.releaseConnection();
+ }
+
+ method = new GetMethod(refreshUrl);
+ try {
+ client.executeMethod(hostConfiguration, method);
+ return method.getResponseBodyAsString();
+ } finally {
+ method.releaseConnection();
+ }
+ }
+
+ private static String getRefreshUrl(String url, HttpMethod method) {
+ Header refreshHeader = method.getResponseHeader("Refresh");
+ if (refreshHeader == null) {
+ return null;
+ }
+ String value = refreshHeader.getValue();
+ int n = value.indexOf(";url=");
+ if (n == -1) {
+ return null;
+ }
+ value = value.substring(n + 5);
+ int requestPath;
+ if (value.charAt(0) == '/') {
+ int colonSlashSlash = url.indexOf("://");
+ requestPath = url.indexOf('/', colonSlashSlash + 3);
+ } else {
+ requestPath = url.lastIndexOf('/');
+ }
+
+ String refreshUrl;
+ if (requestPath == -1) {
+ refreshUrl = url + "/" + value;
+ } else {
+ refreshUrl = url.substring(0, requestPath + 1) + value;
+ }
+ return refreshUrl;
+ }
+
+ public static String evaluateParams(String value, Map<String, String> params, TaskRepository repository) {
+ return evaluateParams(value, getParams(repository, params), true);
+ }
+
+ public static String evaluateParams(String value, TaskRepository repository) {
+ return evaluateParams(value, getParams(repository, null), true);
+ }
+
+ private static String evaluateParams(String value, Map<String, String> params, boolean encode) {
+ if (value == null || value.indexOf("${") == -1) {
+ return value;
+ }
+
+ int n = 0;
+ int n1 = value.indexOf("${");
+ StringBuilder evaluatedValue = new StringBuilder(value.length());
+ while (n1 > -1) {
+ evaluatedValue.append(value.substring(n, n1));
+ int n2 = value.indexOf("}", n1);
+ if (n2 > -1) {
+ String key = value.substring(n1 + 2, n2);
+ if (PARAM_SERVER_URL.equals(key) || PARAM_USER_ID.equals(key) || PARAM_PASSWORD.equals(key)) {
+ evaluatedValue.append(evaluateParams(params.get(key), params, false));
+ } else {
+ String val = evaluateParams(params.get(PARAM_PREFIX + key), params, false);
+ evaluatedValue.append(encode ? encode(val) : val);
+ }
+ }
+ n = n2 + 1;
+ n1 = value.indexOf("${", n2);
+ }
+ if (n > -1) {
+ evaluatedValue.append(value.substring(n));
+ }
+ return evaluatedValue.toString();
+ }
+
+ private static Map<String, String> getParams(TaskRepository repository, Map<String, String> params) {
+ Map<String, String> mergedParams = new LinkedHashMap<String, String>(repository.getProperties());
+ mergedParams.put(PARAM_SERVER_URL, repository.getRepositoryUrl());
+ AuthenticationCredentials credentials = repository.getCredentials(AuthenticationType.REPOSITORY);
+ if (credentials != null) {
+ mergedParams.put(PARAM_USER_ID, credentials.getUserName());
+ mergedParams.put(PARAM_PASSWORD, credentials.getPassword());
+ }
+ if (params != null) {
+ mergedParams.putAll(params);
+ }
+ return mergedParams;
+ }
+
+ private static String encode(String value) {
+ try {
+ return new URLCodec().encode(value);
+ } catch (EncoderException ex) {
+ return value;
+ }
+ }
+
+ public static List<String> getTemplateVariables(String value) {
+ if (value == null) {
+ return Collections.emptyList();
+ }
+
+ List<String> vars = new ArrayList<String>();
+ Matcher m = Pattern.compile("\\$\\{(.+?)\\}").matcher(value);
+ while (m.find()) {
+ vars.add(m.group(1));
+ }
+ return vars;
+ }
+
+ @Override
+ public boolean hasLocalCompletionState(TaskRepository taskRepository, ITask task) {
+ return true;
+ }
+
+ @Override
+ public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
+ return new TaskMapper(taskData).hasChanges(task);
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositorySettingsPage.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositorySettingsPage.java
new file mode 100644
index 0000000..73e4280
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositorySettingsPage.java
@@ -0,0 +1,387 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import static org.eclipse.mylyn.internal.web.tasks.Util.isPresent;
+import static org.eclipse.mylyn.internal.web.tasks.Util.nvl;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/**
+ * Settings page for generic web-based repository connector
+ *
+ * @author Eugene Kuleshov
+ */
+public class WebRepositorySettingsPage extends AbstractRepositorySettingsPage implements IPropertyChangeListener {
+
+ private static final String TITLE = "Web Repository Settings";
+
+ private static final String DESCRIPTION = "Select a server template example and modify to match the settings for "
+ + "your project, \nusually found in the query URL. For more connectors see http://eclipse.org/mylyn";
+
+ private ParametersEditor parametersEditor;
+
+ private Text taskUrlText;
+
+ private Text newTaskText;
+
+ private Text queryUrlText;
+
+ private ComboViewer queryRequestMethod;
+
+ private Text queryPatternText;
+
+ private Text loginFormUrlText;
+
+ private Text loginTokenPatternText;
+
+ private Text loginRequestUrlText;
+
+ private ComboViewer loginRequestMethod;
+
+ private FormToolkit toolkit;
+
+ private Map<String, String> oldProperties;
+
+ private final ArrayList<ControlDecoration> decorations = new ArrayList<ControlDecoration>();
+
+ public WebRepositorySettingsPage(TaskRepository taskRepository) {
+ super(TITLE, DESCRIPTION, taskRepository);
+ setNeedsAnonymousLogin(true);
+ setNeedsValidation(false);
+ setNeedsHttpAuth(true);
+ }
+
+ @Override
+ public void dispose() {
+ if (toolkit != null) {
+ toolkit.dispose();
+ toolkit = null;
+ }
+ for (ControlDecoration decoration : decorations) {
+ decoration.dispose();
+ }
+ super.dispose();
+ }
+
+ @Override
+ protected void repositoryTemplateSelected(RepositoryTemplate template) {
+ repositoryLabelEditor.setStringValue(template.label);
+ setUrl(nvl(template.repositoryUrl));
+
+ taskUrlText.setText(nvl(template.taskPrefixUrl));
+ newTaskText.setText(nvl(template.newTaskUrl));
+
+ queryUrlText.setText(nvl(template.taskQueryUrl));
+ selectMethod(queryRequestMethod, //
+ template.getAttribute(WebRepositoryConnector.PROPERTY_QUERY_METHOD));
+ queryPatternText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_QUERY_REGEXP)));
+
+ loginRequestUrlText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL)));
+ selectMethod(loginRequestMethod, //
+ template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD));
+ loginFormUrlText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL)));
+ loginTokenPatternText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP)));
+
+ parametersEditor.removeAll();
+
+ for (Map.Entry<String, String> entry : template.getAttributes().entrySet()) {
+ String key = entry.getKey();
+ if (key.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
+ parametersEditor.add(key.substring(WebRepositoryConnector.PARAM_PREFIX.length()), //
+ entry.getValue());
+ }
+ }
+
+ getContainer().updateButtons();
+ }
+
+ @SuppressWarnings("restriction")
+ @Override
+ protected void createAdditionalControls(Composite parent) {
+ toolkit = new FormToolkit(org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getDefault().getFormColors(
+ parent.getDisplay()));
+
+ addRepositoryTemplatesToServerUrlCombo();
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ createParameterEditor(composite);
+ createAdvancedComposite(composite);
+ GridDataFactory.fillDefaults().grab(true, false).hint(200, SWT.DEFAULT).span(2, SWT.DEFAULT).applyTo(composite);
+
+ if (repository != null) {
+ taskUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_TASK_URL));
+ newTaskText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL));
+
+ selectMethod(queryRequestMethod, getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_METHOD));
+ queryUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_URL));
+ queryPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP));
+
+ loginFormUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL));
+ loginTokenPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP));
+
+ selectMethod(loginRequestMethod, getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD));
+ loginRequestUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL));
+
+ oldProperties = repository.getProperties();
+ parametersEditor.addParams(oldProperties, new LinkedHashMap<String, String>());
+ }
+ }
+
+ private void selectMethod(ComboViewer viewer, String method) {
+ if (!isPresent(method)) {
+ method = WebRepositoryConnector.REQUEST_GET;
+ }
+ viewer.setSelection(new StructuredSelection(new Object[] { method }), true);
+ }
+
+ private String getTextProperty(String name) {
+ return nvl(repository.getProperty(name));
+ }
+
+ @Override
+ protected boolean isValidUrl(String name) {
+ return name != null && name.trim().length() > 0;
+ }
+
+ private void createParameterEditor(Composite composite) {
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.marginBottom = 10;
+ gridLayout.verticalSpacing = 0;
+ gridLayout.horizontalSpacing = 0;
+ gridLayout.marginWidth = 0;
+ gridLayout.marginHeight = 0;
+ composite.setLayout(gridLayout);
+
+ parametersEditor = new ParametersEditor(composite, SWT.NONE);
+ GridData parametersEditorGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ parametersEditorGridData.minimumHeight = 100;
+ parametersEditor.setLayoutData(parametersEditorGridData);
+ }
+
+ private void createAdvancedComposite(final Composite composite) {
+ ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, ExpandableComposite.TITLE_BAR
+ | ExpandableComposite.COMPACT | ExpandableComposite.TWISTIE);
+ expComposite.clientVerticalSpacing = 0;
+ GridData gridData_2 = new GridData(SWT.FILL, SWT.TOP, true, false);
+ gridData_2.horizontalIndent = -5;
+ expComposite.setLayoutData(gridData_2);
+ expComposite.setFont(composite.getFont());
+ expComposite.setBackground(composite.getBackground());
+ expComposite.setText("Advanced &Configuration");
+ expComposite.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ getControl().getShell().pack();
+ }
+ });
+ toolkit.paintBordersFor(expComposite);
+
+ Composite composite2 = toolkit.createComposite(expComposite, SWT.BORDER);
+ GridLayout gridLayout2 = new GridLayout();
+ gridLayout2.numColumns = 3;
+ gridLayout2.verticalSpacing = 0;
+ composite2.setLayout(gridLayout2);
+ expComposite.setClient(composite2);
+
+ Label taskUrlLabel = toolkit.createLabel(composite2, "&Task URL:", SWT.NONE);
+ taskUrlLabel.setLayoutData(new GridData());
+
+ taskUrlText = new Text(composite2, SWT.BORDER);
+ taskUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+ decorations.add(WebContentProposalProvider.createDecoration(taskUrlText, parametersEditor, false));
+
+ Label newTaskLabel = toolkit.createLabel(composite2, "&New Task URL:", SWT.NONE);
+ newTaskLabel.setLayoutData(new GridData());
+
+ newTaskText = new Text(composite2, SWT.BORDER);
+ newTaskText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+ decorations.add(WebContentProposalProvider.createDecoration(newTaskText, parametersEditor, false));
+
+ final Label separatorLabel2 = new Label(composite2, SWT.HORIZONTAL | SWT.SEPARATOR);
+ final GridData gridData_4 = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
+ gridData_4.verticalIndent = 5;
+ gridData_4.heightHint = 5;
+ separatorLabel2.setLayoutData(gridData_4);
+ toolkit.adapt(separatorLabel2, true, true);
+
+ Label queryUrlLabel = toolkit.createLabel(composite2, "&Query Request URL:", SWT.NONE);
+ queryUrlLabel.setLayoutData(new GridData());
+
+ queryUrlText = new Text(composite2, SWT.BORDER);
+ queryUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ decorations.add(WebContentProposalProvider.createDecoration(queryUrlText, parametersEditor, false));
+
+ queryRequestMethod = new ComboViewer(composite2, SWT.BORDER | SWT.READ_ONLY);
+ queryRequestMethod.setContentProvider(new MethodTypeContentProvider());
+ queryRequestMethod.setInput("");
+ {
+ Combo combo = queryRequestMethod.getCombo();
+ toolkit.adapt(combo, true, true);
+ combo.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ }
+
+ Label queryPatternLabel = toolkit.createLabel(composite2, "Query &Pattern:", SWT.NONE);
+ queryPatternLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true));
+
+ queryPatternText = new Text(composite2, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
+ gridData.widthHint = 200;
+ gridData.heightHint = 60;
+ queryPatternText.setLayoutData(gridData);
+ decorations.add(WebContentProposalProvider.createDecoration(queryPatternText, parametersEditor, true));
+
+ final Label separatorLabel1 = new Label(composite2, SWT.HORIZONTAL | SWT.SEPARATOR);
+ final GridData gridData_3 = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
+ gridData_3.heightHint = 5;
+ gridData_3.verticalIndent = 5;
+ separatorLabel1.setLayoutData(gridData_3);
+ toolkit.adapt(separatorLabel1, true, true);
+
+ final Label loginrequestUrlLabel = new Label(composite2, SWT.NONE);
+ loginrequestUrlLabel.setLayoutData(new GridData());
+ toolkit.adapt(loginrequestUrlLabel, true, true);
+ loginrequestUrlLabel.setText("Login &Request URL:");
+
+ loginRequestUrlText = new Text(composite2, SWT.BORDER);
+ toolkit.adapt(loginRequestUrlText, true, true);
+ loginRequestUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+ decorations.add(WebContentProposalProvider.createDecoration(loginRequestUrlText, parametersEditor, false));
+
+ loginRequestMethod = new ComboViewer(composite2, SWT.BORDER | SWT.READ_ONLY);
+ loginRequestMethod.setContentProvider(new MethodTypeContentProvider());
+ loginRequestMethod.setInput("");
+ {
+ Combo combo = loginRequestMethod.getCombo();
+ toolkit.adapt(combo, true, true);
+ combo.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+ }
+
+ Label loginPageLabel = toolkit.createLabel(composite2, "Login &Form URL:", SWT.NONE);
+ loginPageLabel.setLayoutData(new GridData());
+
+ loginFormUrlText = new Text(composite2, SWT.BORDER);
+ loginFormUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
+ decorations.add(WebContentProposalProvider.createDecoration(loginFormUrlText, parametersEditor, false));
+
+ Label loginTokenLabel = toolkit.createLabel(composite2, "Login T&oken Pattern:", SWT.NONE);
+ loginTokenLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true));
+
+ loginTokenPatternText = new Text(composite2, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
+ final GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, false, true, 2, 1);
+ gridData_1.widthHint = 200;
+ gridData_1.heightHint = 30;
+ loginTokenPatternText.setLayoutData(gridData_1);
+ decorations.add(WebContentProposalProvider.createDecoration(loginTokenPatternText, parametersEditor, true));
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ Object source = event.getSource();
+ if (source == taskUrlText || source == taskUrlText) {
+ getWizard().getContainer().updateButtons();
+ }
+ }
+
+ @Override
+ public void applyTo(TaskRepository repository) {
+ super.applyTo(repository);
+ repository.setProperty(WebRepositoryConnector.PROPERTY_TASK_URL, taskUrlText.getText());
+ repository.setProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL, newTaskText.getText());
+
+ repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_URL, queryUrlText.getText());
+ repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP, queryPatternText.getText());
+ repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_METHOD, getSelection(queryRequestMethod));
+
+ String loginRequestUrl = loginRequestUrlText.getText();
+ repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL, loginRequestUrl);
+ if (loginRequestUrl.length() > 0) {
+ repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD,
+ getSelection(loginRequestMethod));
+ } else {
+ repository.removeProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD);
+ }
+ repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL, loginFormUrlText.getText());
+ repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP, loginTokenPatternText.getText());
+
+ if (oldProperties != null) {
+ for (Map.Entry<String, String> e : oldProperties.entrySet()) {
+ String key = e.getKey();
+ if (key.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
+ repository.removeProperty(key);
+ }
+ }
+ }
+
+ for (Map.Entry<String, String> e : parametersEditor.getParameters().entrySet()) {
+ repository.setProperty(e.getKey(), e.getValue());
+ }
+ }
+
+ private String getSelection(ComboViewer viewer) {
+ return (String) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
+ }
+
+ private static class MethodTypeContentProvider implements IStructuredContentProvider {
+
+ private static final Object[] ELEMENTS = new Object[] { WebRepositoryConnector.REQUEST_GET,
+ WebRepositoryConnector.REQUEST_POST };
+
+ public Object[] getElements(Object inputElement) {
+ return ELEMENTS;
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ }
+
+ @Override
+ protected Validator getValidator(TaskRepository repository) {
+ return null;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return WebRepositoryConnector.REPOSITORY_TYPE;
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskEditorPageFactory.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskEditorPageFactory.java
new file mode 100644
index 0000000..8aa0caf
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskEditorPageFactory.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorPageFactory;
+import org.eclipse.mylyn.tasks.ui.editors.BrowserFormPage;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.forms.editor.IFormPage;
+
+/**
+ * @author Steffen Pingel
+ */
+public class WebTaskEditorPageFactory extends AbstractTaskEditorPageFactory {
+
+ private static final String TITLE = "Browser";
+
+ @Override
+ public boolean canCreatePageFor(TaskEditorInput input) {
+ if (input.getTask().getConnectorKind().equals(WebRepositoryConnector.REPOSITORY_TYPE)) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public IFormPage createPage(TaskEditor parentEditor) {
+ return new BrowserFormPage(parentEditor, TITLE);
+ }
+
+ @Override
+ public Image getPageImage() {
+ return CommonImages.getImage(TasksUiImages.REPOSITORY_SMALL);
+ }
+
+ @Override
+ public String getPageText() {
+ return TITLE;
+ }
+
+ @Override
+ public int getPriority() {
+ return PRIORITY_TASK;
+ }
+
+}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskListMigrator.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskListMigrator.java
new file mode 100644
index 0000000..7ac4ad6
--- /dev/null
+++ b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskListMigrator.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.web.tasks;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.tasks.core.AbstractTaskListMigrator;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+/**
+ * @author Steffen Pingel
+ */
+public class WebTaskListMigrator extends AbstractTaskListMigrator {
+
+ private static final String KEY_WEB = "Web";
+
+ private static final String KEY_WEB_QUERY = KEY_WEB + KEY_QUERY;
+
+ private static final String KEY_WEB_ISSUE = "WebIssue";
+
+ private static final String KEY_URL_TEMPLATE = "UrlTemplate";
+
+ private static final String KEY_REGEXP = "Regexp";
+
+ private static final String KEY_PREFIX = "TaskPrefix";
+
+ @Override
+ public String getConnectorKind() {
+ return WebRepositoryConnector.REPOSITORY_TYPE;
+ }
+
+ @Override
+ public String getTaskElementName() {
+ return KEY_WEB_ISSUE;
+ }
+
+ @Override
+ public Set<String> getQueryElementNames() {
+ return Collections.singleton(KEY_WEB_QUERY);
+ }
+
+ @Override
+ public void migrateTask(ITask task, Element element) {
+ if (element.hasAttribute(KEY_PREFIX)) {
+ task.setAttribute(WebRepositoryConnector.KEY_TASK_PREFIX, element.getAttribute(KEY_PREFIX));
+ } else {
+ task.setTaskKind("RSS");
+ task.setTaskKey(null);
+ }
+ }
+
+ @Override
+ public void migrateQuery(IRepositoryQuery query, Element element) {
+ String queryUrlTemplate = element.getAttribute(KEY_URL_TEMPLATE);
+ String queryPattern = element.getAttribute(KEY_REGEXP);
+ String taskPrefix = element.getAttribute(KEY_PREFIX);
+
+ Map<String, String> params = new LinkedHashMap<String, String>();
+ NamedNodeMap attributes = element.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++) {
+ Attr attr = (Attr) attributes.item(i);
+ String name = attr.getName();
+ if (name.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
+// params.put(org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(name), //
+// org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attr.getValue()));
+ params.put(name, attr.getValue());
+ query.setAttribute(name, attr.getValue());
+ }
+ }
+
+ String queryString = query.getUrl();
+ if (queryUrlTemplate == null || queryUrlTemplate.length() == 0) {
+ queryUrlTemplate = query.getUrl();
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(
+ WebRepositoryConnector.REPOSITORY_TYPE, query.getRepositoryUrl());
+ queryString = WebRepositoryConnector.evaluateParams(queryUrlTemplate, params, repository);
+ }
+ query.setUrl(queryString);
+
+ query.setAttribute(WebRepositoryConnector.KEY_QUERY_TEMPLATE, queryUrlTemplate);
+ query.setAttribute(WebRepositoryConnector.KEY_QUERY_PATTERN, queryPattern);
+ query.setAttribute(WebRepositoryConnector.KEY_TASK_PREFIX, taskPrefix);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext-feature/.project b/org.eclipse.mylyn.wikitext-feature/.project
new file mode 100644
index 0000000..a91cb57
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext-feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4b47490
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:12:03 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext-feature/about.html b/org.eclipse.mylyn.wikitext-feature/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext-feature/build.properties b/org.eclipse.mylyn.wikitext-feature/build.properties
new file mode 100644
index 0000000..01fc9b7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+bin.includes = feature.properties,\
+ feature.xml,\
+ about.html,\
+ epl-v10.html,\
+ license.html
+src.includes = about.html
diff --git a/org.eclipse.mylyn.wikitext-feature/epl-v10.html b/org.eclipse.mylyn.wikitext-feature/epl-v10.html
new file mode 100644
index 0000000..ed4b196
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ at font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+ at page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>"Contribution" means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Contributor" means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Licensed Patents " mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>"Program" means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>"Recipient" means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext-feature/feature.properties b/org.eclipse.mylyn.wikitext-feature/feature.properties
new file mode 100644
index 0000000..fa6ad3e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/feature.properties
@@ -0,0 +1,58 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+featureName=Mylyn WikiText
+description=Enables parsing and display of lightweight markup (wiki text). Extends the Mylyn task editor to create a markup-aware editor.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2007, 2009 David Green and others. All rights reserved.
+updateSiteName=Mylyn for Eclipse 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+ * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+ * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+ * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+ * The top-level (root) directory\n\
+ * Plug-in and Fragment directories\n\
+ * Inside Plug-ins and Fragments packaged as JARs\n\
+ * Sub-directories of the directory named "src" of certain Plug-ins\n\
+ * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.wikitext-feature/feature.xml b/org.eclipse.mylyn.wikitext-feature/feature.xml
new file mode 100644
index 0000000..402845c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/feature.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<feature
+ id="org.eclipse.mylyn.wikitext_feature"
+ label="%featureName"
+ version="1.1.1.qualifier"
+ provider-name="%providerName"
+ plugin="org.eclipse.mylyn">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="license.html">
+ %license
+ </license>
+
+ <url>
+ <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/e3.4"/>
+ </url>
+
+ <requires>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.2" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.2" match="compatible"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.swt"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.core.expressions"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.help"/>
+ <import plugin="org.eclipse.mylyn.tasks.ui" version="3.0.2" match="compatible"/>
+ <import plugin="org.eclipse.mylyn.tasks.core" version="3.0.2" match="compatible"/>
+ <import feature="org.eclipse.mylyn_feature" version="3.0.2.I20080816" match="compatible"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.textile.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.mediawiki.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.confluence.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.tracwiki.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.twiki.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.help.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.textile.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.mediawiki.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.confluence.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.tracwiki.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.twiki.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.mylyn.wikitext.tasks.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.mylyn.wikitext-feature/license.html b/org.eclipse.mylyn.wikitext-feature/license.html
new file mode 100644
index 0000000..15a10cf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext-feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS
+ modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.classpath b/org.eclipse.mylyn.wikitext.confluence.core/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.cvsignore b/org.eclipse.mylyn.wikitext.confluence.core/.cvsignore
new file mode 100644
index 0000000..c07f541
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.cvsignore
@@ -0,0 +1 @@
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.project b/org.eclipse.mylyn.wikitext.confluence.core/.project
new file mode 100644
index 0000000..dbf490e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.confluence.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4e1095e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:26 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.confluence.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c96d897
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.confluence.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.team.core;resolution:=optional
+Export-Package: org.eclipse.mylyn.internal.wikitext.confluence.core.block;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.confluence.core.phrase;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.confluence.core.token;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.confluence.core.util;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.confluence.validation;x-internal:=true,
+ org.eclipse.mylyn.wikitext.confluence.core
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage b/org.eclipse.mylyn.wikitext.confluence.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
new file mode 100644
index 0000000..8bfca36
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
@@ -0,0 +1 @@
+org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/about.html b/org.eclipse.mylyn.wikitext.confluence.core/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/build.properties b/org.eclipse.mylyn.wikitext.confluence.core/build.properties
new file mode 100644
index 0000000..01810f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/plugin.properties b/org.eclipse.mylyn.wikitext.confluence.core/plugin.properties
new file mode 100644
index 0000000..9faca78
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/plugin.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2008 Mylyn project committers 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.confluence.core
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Confluence
+content-type.name.0 = Confluence WikiText Markup
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/plugin.xml b/org.eclipse.mylyn.wikitext.confluence.core/plugin.xml
new file mode 100644
index 0000000..5bb5423
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/plugin.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupLanguage">
+ <language
+ class="org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage"
+ name="Confluence" fileExtensions="confluence">
+ </language>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.mylyn.wikitext"
+ file-extensions="confluence"
+ id="org.eclipse.mylyn.wikitext.confluence"
+ name="%content-type.name.0"
+ priority="normal">
+ </content-type>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="confluence"
+ type="text">
+ </fileTypes>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.confluence.validation.ConfluenceReferenceValidationRule"
+ markupLanguage="Confluence"/>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/AbstractConfluenceDelimitedBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/AbstractConfluenceDelimitedBlock.java
new file mode 100644
index 0000000..e036830
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/AbstractConfluenceDelimitedBlock.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class AbstractConfluenceDelimitedBlock extends ParameterizedBlock {
+
+ private final Pattern startPattern;
+
+ private final Pattern endPattern;
+
+ protected int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public AbstractConfluenceDelimitedBlock(String blockName) {
+ startPattern = Pattern.compile("\\s*\\{" + blockName + "(?::([^\\}]*))?\\}(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+ endPattern = Pattern.compile("\\s*(\\{" + blockName + "\\})(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ setOptions(matcher.group(1));
+
+ offset = matcher.start(2);
+
+ beginBlock();
+ }
+
+ int end = line.length();
+ int segmentEnd = end;
+ boolean terminating = false;
+
+ Matcher endMatcher = endPattern.matcher(line);
+ if (offset < end) {
+ if (blockLineCount == 0) {
+ endMatcher.region(offset, end);
+ }
+ if (endMatcher.find()) {
+ terminating = true;
+ end = endMatcher.start(2);
+ segmentEnd = endMatcher.start(1);
+ }
+ }
+
+ if (end < line.length()) {
+ state.setLineSegmentEndOffset(end);
+ }
+
+ ++blockLineCount;
+
+ final String content = line.substring(offset, segmentEnd);
+ handleBlockContent(content);
+
+ if (terminating) {
+ setClosed(true);
+ }
+ return end == line.length() ? -1 : end;
+ }
+
+ protected abstract void handleBlockContent(String content);
+
+ protected abstract void beginBlock();
+
+ protected abstract void endBlock();
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ resetState();
+ matcher = startPattern.matcher(line);
+ if (lineOffset > 0) {
+ matcher.region(lineOffset, line.length());
+ }
+ return matcher.matches();
+ }
+
+ protected void resetState() {
+ blockLineCount = 0;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/CodeBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/CodeBlock.java
new file mode 100644
index 0000000..d9f02d8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/CodeBlock.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ * @author David Green
+ */
+public class CodeBlock extends AbstractConfluenceDelimitedBlock {
+
+ private String title;
+
+ private String language;
+
+ public CodeBlock() {
+ super("code"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void beginBlock() {
+ if (title != null) {
+ Attributes attributes = new Attributes();
+ attributes.setTitle(title);
+ builder.beginBlock(BlockType.PANEL, attributes);
+ }
+ Attributes attributes = new Attributes();
+ Attributes preAttributes = new Attributes();
+ if (language != null) {
+ // chili-style class and atlassian-style class
+ attributes.setCssClass(language + " code-" + language); //$NON-NLS-1$
+ }
+ builder.beginBlock(BlockType.PREFORMATTED, preAttributes);
+ builder.beginBlock(BlockType.CODE, attributes);
+ }
+
+ @Override
+ protected void handleBlockContent(String content) {
+ builder.characters(content);
+ builder.characters("\n"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void endBlock() {
+ if (title != null) {
+ builder.endBlock(); // panel
+ }
+ builder.endBlock(); // code
+ builder.endBlock(); // pre
+ }
+
+ @Override
+ protected void resetState() {
+ super.resetState();
+ title = null;
+ }
+
+ @Override
+ protected void setOption(String key, String value) {
+ if (key.equals("title")) { //$NON-NLS-1$
+ title = value;
+ }
+ }
+
+ @Override
+ protected void setOption(String option) {
+ language = option.toLowerCase();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ColorBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ColorBlock.java
new file mode 100644
index 0000000..0599223
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ColorBlock.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class ColorBlock extends ParameterizedBlock {
+
+ private final Pattern startPattern;
+
+ private final Pattern endPattern;
+
+ private final BlockType blockType;
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private boolean nesting = false;
+
+ private String color;
+
+ public ColorBlock() {
+ this.blockType = BlockType.DIV;
+ startPattern = Pattern.compile("\\{color(?::([^\\}]*))?\\}(.*)"); //$NON-NLS-1$
+ endPattern = Pattern.compile("(\\{color\\})(.*)"); //$NON-NLS-1$
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ int end = line.length();
+ if (blockLineCount == 0) {
+ setOptions(matcher.group(1));
+
+ Attributes attributes = new Attributes();
+ if (color != null) {
+ attributes.setCssStyle(String.format("color: %s;", color)); //$NON-NLS-1$
+ }
+
+ offset = matcher.start(2);
+
+ builder.beginBlock(blockType, attributes);
+
+ nesting = true;
+ end = offset;
+ } else {
+
+ boolean terminating = false;
+
+ Matcher endMatcher = endPattern.matcher(line);
+ if (offset < end) {
+ if (offset > 0) {
+ endMatcher.region(offset, end);
+ }
+ if (endMatcher.find()) {
+ terminating = true;
+ end = endMatcher.start(2);
+ } else {
+ end = offset;
+ }
+ }
+ if (terminating) {
+ setClosed(true);
+ }
+ }
+ ++blockLineCount;
+
+ return end == line.length() ? -1 : end;
+ }
+
+ @Override
+ public boolean beginNesting() {
+ return nesting;
+ }
+
+ @Override
+ public int findCloseOffset(String line, int lineOffset) {
+ Matcher endMatcher = endPattern.matcher(line);
+ if (lineOffset != 0) {
+ endMatcher.region(lineOffset, line.length());
+ }
+ if (endMatcher.find()) {
+ return endMatcher.start();
+ }
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ color = null;
+ nesting = false;
+ matcher = startPattern.matcher(line);
+ if (lineOffset > 0) {
+ matcher.region(lineOffset, line.length());
+ }
+ return matcher.matches();
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // the block
+ }
+ super.setClosed(closed);
+ }
+
+ @Override
+ protected void setOption(String option) {
+ color = option;
+ }
+
+ @Override
+ protected void setOption(String key, String value) {
+ // no options
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ExtendedPreformattedBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ExtendedPreformattedBlock.java
new file mode 100644
index 0000000..5085b84
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ExtendedPreformattedBlock.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ * quoted text block, matches blocks that start with <code>{noformat}</code>. Creates an extended block type of
+ * {@link ParagraphBlock paragraph}.
+ *
+ * @author David Green
+ */
+public class ExtendedPreformattedBlock extends AbstractConfluenceDelimitedBlock {
+
+ public ExtendedPreformattedBlock() {
+ super("noformat"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void beginBlock() {
+ Attributes attributes = new Attributes();
+ builder.beginBlock(BlockType.PREFORMATTED, attributes);
+ }
+
+ @Override
+ protected void endBlock() {
+ builder.endBlock(); // pre
+ }
+
+ @Override
+ protected void handleBlockContent(String content) {
+ if (content.length() > 0) {
+ builder.characters(content);
+ } else if (blockLineCount == 1) {
+ return;
+ }
+ builder.characters("\n"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void setOption(String key, String value) {
+ // no options
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ExtendedQuoteBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ExtendedQuoteBlock.java
new file mode 100644
index 0000000..f0d4a6b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ExtendedQuoteBlock.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * quoted text block, matches blocks that start with <code>{quote}</code>. Creates an extended block type of
+ * {@link ParagraphBlock paragraph}.
+ *
+ * @author David Green
+ */
+public class ExtendedQuoteBlock extends AbstractConfluenceDelimitedBlock {
+
+ private int paraLine = 0;
+
+ private boolean paraOpen = false;
+
+ private Block nestedBlock = null;
+
+ public ExtendedQuoteBlock() {
+ super("quote"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void resetState() {
+ super.resetState();
+ paraOpen = false;
+ paraLine = 0;
+ nestedBlock = null;
+ }
+
+ @Override
+ protected void beginBlock() {
+ Attributes attributes = new Attributes();
+ builder.beginBlock(BlockType.QUOTE, attributes);
+ }
+
+ @Override
+ protected void endBlock() {
+ if (nestedBlock != null) {
+ nestedBlock.setClosed(true);
+ nestedBlock = null;
+ }
+ if (paraOpen) {
+ builder.endBlock(); // para
+ paraLine = 0;
+ paraOpen = false;
+ }
+ builder.endBlock(); // quote
+ }
+
+ @Override
+ protected void handleBlockContent(String content) {
+ if (nestedBlock == null) {
+ ConfluenceLanguage markupLanguage = (ConfluenceLanguage) getMarkupLanguage();
+ for (Block block : markupLanguage.getNestedBlocks()) {
+ if (block.canStart(content, 0)) {
+ nestedBlock = block.clone();
+ nestedBlock.setParser(getParser());
+ nestedBlock.setState(getState());
+ if (paraOpen) {
+ builder.endBlock(); // para
+ paraOpen = false;
+ paraLine = 0;
+ }
+ break;
+ }
+ }
+ }
+ if (nestedBlock != null) {
+ int lineOffset = nestedBlock.processLine(content, 0);
+ if (nestedBlock.isClosed()) {
+ nestedBlock = null;
+ }
+ if (lineOffset < content.length() && lineOffset >= 0) {
+ if (nestedBlock != null) {
+ throw new IllegalStateException("if a block does not fully process a line then it must be closed"); //$NON-NLS-1$
+ }
+ content = content.substring(lineOffset);
+ } else {
+ return;
+ }
+ }
+ if (blockLineCount == 1 && content.length() == 0) {
+ return;
+ }
+ if (blockLineCount > 1 && paraOpen && getMarkupLanguage().isEmptyLine(content)) {
+ builder.endBlock(); // para
+ paraOpen = false;
+ paraLine = 0;
+ return;
+ }
+ if (!paraOpen) {
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ paraOpen = true;
+ }
+ if (paraLine != 0) {
+ builder.lineBreak();
+ }
+ ++paraLine;
+ getMarkupLanguage().emitMarkupLine(getParser(), state, content, 0);
+
+ }
+
+ @Override
+ protected void setOption(String key, String value) {
+ // no options
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/HeadingBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/HeadingBlock.java
new file mode 100644
index 0000000..5c22255
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/HeadingBlock.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Matches any textile text, including lines starting with <code>p. </code>.
+ *
+ * @author David Green
+ */
+public class HeadingBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("\\s*h([1-6])\\.\\s+(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private int level = -1;
+
+ private Matcher matcher;
+
+ public HeadingBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ // 0-offset matches may start with the "hn. " prefix.
+ level = Integer.parseInt(matcher.group(1));
+ offset = matcher.start(2);
+
+ if (attributes.getId() == null) {
+ attributes.setId(state.getIdGenerator().newId("h" + level, line.substring(offset))); //$NON-NLS-1$
+ }
+ builder.beginHeading(level, attributes);
+ }
+ if (blockLineCount != 0 || markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endHeading();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ListBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ListBlock.java
new file mode 100644
index 0000000..f9da23b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ListBlock.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * List block, matches blocks that start with <code>*</code>, <code>#</code> or <code>-</code>
+ *
+ * @author David Green
+ */
+public class ListBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = 2;
+
+ static final Pattern startPattern = Pattern.compile("((?:(?:\\*)|(?:#)|(?:-))+)\\s(.*+)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private Stack<ListState> listState;
+
+ public ListBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ listState = new Stack<ListState>();
+ Attributes attributes = new Attributes();
+ String listSpec = matcher.group(1);
+ int level = calculateLevel(listSpec);
+ BlockType type = calculateType(listSpec);
+
+ if (type == BlockType.BULLETED_LIST && "-".equals(listSpec)) { //$NON-NLS-1$
+ attributes.setCssStyle("list-style: square"); //$NON-NLS-1$
+ }
+
+ // 0-offset matches may start with the "*** " prefix.
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ listState.push(new ListState(1, type));
+ builder.beginBlock(type, attributes);
+
+ adjustLevel(listSpec, level, type);
+ } else {
+ Matcher matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ String listSpec = matcher.group(1);
+ int level = calculateLevel(listSpec);
+ BlockType type = calculateType(listSpec);
+
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ adjustLevel(listSpec, level, type);
+ }
+ ++blockLineCount;
+
+ ListState listState = this.listState.peek();
+ if (listState.openItem) {
+ builder.endBlock();
+ }
+ listState.openItem = true;
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ private void adjustLevel(String listSpec, int level, BlockType type) {
+ for (ListState previousState = listState.peek(); level != previousState.level || previousState.type != type; previousState = listState.peek()) {
+
+ if (level > previousState.level) {
+ if (!previousState.openItem) {
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ previousState.openItem = true;
+ }
+
+ Attributes blockAttributes = new Attributes();
+ if (type == BlockType.BULLETED_LIST && "-".equals(listSpec)) { //$NON-NLS-1$
+ blockAttributes.setCssStyle("list-style: square"); //$NON-NLS-1$
+ }
+ listState.push(new ListState(previousState.level + 1, type));
+ builder.beginBlock(type, blockAttributes);
+ } else {
+ closeOne();
+ if (listState.isEmpty()) {
+ Attributes blockAttributes = new Attributes();
+ if (type == BlockType.BULLETED_LIST && "-".equals(listSpec)) { //$NON-NLS-1$
+ blockAttributes.setCssStyle("list-style: square"); //$NON-NLS-1$
+ }
+
+ listState.push(new ListState(1, type));
+ builder.beginBlock(type, blockAttributes);
+ }
+ }
+ }
+ }
+
+ private int calculateLevel(String listSpec) {
+ return listSpec.length();
+ }
+
+ private BlockType calculateType(String listSpec) {
+ return listSpec.charAt(listSpec.length() - 1) == '#' ? BlockType.NUMERIC_LIST : BlockType.BULLETED_LIST;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ listState = null;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ while (listState != null && !listState.isEmpty()) {
+ closeOne();
+ }
+ listState = null;
+ }
+ super.setClosed(closed);
+ }
+
+ private void closeOne() {
+ ListState e = listState.pop();
+ if (e.openItem) {
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ private static class ListState {
+ int level;
+
+ BlockType type;
+
+ boolean openItem;
+
+ private ListState(int level, BlockType type) {
+ super();
+ this.level = level;
+ this.type = type;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ParagraphBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ParagraphBlock.java
new file mode 100644
index 0000000..3f86de6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ParagraphBlock.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Matches any textile text, including lines starting with <code>p. </code>.
+ *
+ * @author David Green
+ */
+public class ParagraphBlock extends Block {
+
+ private static final Pattern confluenceBlockStart = Pattern.compile("\\{(code|info|tip|warning|panel|note|toc|color|noformat)(?:(:[^\\}]*))?\\}"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ public ParagraphBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ }
+
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+
+ ++blockLineCount;
+
+ ConfluenceLanguage markupLanguage = (ConfluenceLanguage) getMarkupLanguage();
+
+ // NOTE: in Confluence paragraphs can have nested lists and other things, however
+ // the resulting XHTML is invalid -- so here we allow for similar constructs
+ // however we cause them to end the paragraph rather than being nested.
+ for (Block block : markupLanguage.getParagraphBreakingBlocks()) {
+ if (block.canStart(line, offset)) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ Matcher blockStartMatcher = confluenceBlockStart.matcher(line);
+ if (offset > 0) {
+ blockStartMatcher.region(offset, line.length());
+ }
+ if (blockStartMatcher.find()) {
+ int end = blockStartMatcher.start();
+ if (end > offset) {
+ markupLanguage.emitMarkupLine(getParser(), state, offset, line.substring(offset, end), 0);
+ }
+ setClosed(true);
+ return end;
+ }
+ if (blockLineCount > 1) {
+ builder.lineBreak();
+ }
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ return true;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ParameterizedBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ParameterizedBlock.java
new file mode 100644
index 0000000..dda9e57
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/ParameterizedBlock.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import org.eclipse.mylyn.internal.wikitext.confluence.core.util.Options;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public abstract class ParameterizedBlock extends Block {
+
+ public void setOptions(String options) {
+ if (options == null) {
+ return;
+ }
+ Options.parseOptions(options, new Options.Handler() {
+ public void setOption(String key, String value) {
+ ParameterizedBlock.this.setOption(key, value);
+ }
+
+ public void setOption(String key) {
+ ParameterizedBlock.this.setOption(key);
+ }
+ });
+ }
+
+ /**
+ * Set an option that is specified without a value. The default implementation does nothing.
+ *
+ * @param option
+ * the option to set
+ *
+ * @see #setOption(String, String)
+ */
+ protected void setOption(String option) {
+ }
+
+ /**
+ * Set an option with key and value pair
+ *
+ * @param key
+ * the key of the option
+ * @param value
+ * the value of the option
+ *
+ * @see #setOption(String)
+ */
+ protected abstract void setOption(String key, String value);
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/QuoteBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/QuoteBlock.java
new file mode 100644
index 0000000..ebf4c5f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/QuoteBlock.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * quoted text block, matches blocks that start with <code>bc. </code>. Creates an extended block type of
+ * {@link ParagraphBlock paragraph}.
+ *
+ * @author David Green
+ */
+public class QuoteBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("bq\\.\\s+(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public QuoteBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+
+ offset = matcher.start(1);
+
+ builder.beginBlock(BlockType.QUOTE, attributes);
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ }
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ if (blockLineCount != 0) {
+ builder.lineBreak();
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ matcher = startPattern.matcher(line);
+ if (lineOffset > 0) {
+ matcher.region(lineOffset, line.length());
+ }
+ return matcher.matches();
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // para
+ builder.endBlock(); // quote
+ }
+ super.setClosed(closed);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TableBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TableBlock.java
new file mode 100644
index 0000000..2f64010
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TableBlock.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Table block, matches blocks that start with <code>table. </code> or those that start with a table row.
+ *
+ * @author David Green
+ */
+public class TableBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("(\\|(.*)?(\\|\\s*$))"); //$NON-NLS-1$
+
+ static final Pattern TABLE_ROW_PATTERN = Pattern.compile("\\|(\\|)?" + "((?:(?:[^\\|\\[]*)(?:\\[[^\\]]*\\])?)*)" //$NON-NLS-1$ //$NON-NLS-2$
+ + "(\\|\\|?\\s*$)?"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public TableBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ builder.beginBlock(BlockType.TABLE, attributes);
+ } else if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ ++blockLineCount;
+
+ if (offset == line.length()) {
+ return -1;
+ }
+
+ String textileLine = offset == 0 ? line : line.substring(offset);
+ Matcher rowMatcher = TABLE_ROW_PATTERN.matcher(textileLine);
+ if (!rowMatcher.find()) {
+ setClosed(true);
+ return 0;
+ }
+
+ builder.beginBlock(BlockType.TABLE_ROW, new Attributes());
+
+ do {
+ int start = rowMatcher.start();
+ if (start == textileLine.length() - 1) {
+ break;
+ }
+
+ String headerIndicator = rowMatcher.group(1);
+ String text = rowMatcher.group(2);
+ int lineOffset = offset + rowMatcher.start(2);
+
+ boolean header = headerIndicator != null && "|".equals(headerIndicator); //$NON-NLS-1$
+
+ Attributes attributes = new Attributes();
+ builder.beginBlock(header ? BlockType.TABLE_CELL_HEADER : BlockType.TABLE_CELL_NORMAL, attributes);
+
+ markupLanguage.emitMarkupLine(getParser(), state, lineOffset, text, 0);
+
+ builder.endBlock(); // table cell
+ } while (rowMatcher.find());
+
+ builder.endBlock(); // table row
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TableOfContentsBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TableOfContentsBlock.java
new file mode 100644
index 0000000..40b18a3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TableOfContentsBlock.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TableOfContentsBlock extends ParameterizedBlock {
+
+ static final Pattern startPattern = Pattern.compile("\\s*\\{toc(?::([^\\}]+))?\\}\\s*"); //$NON-NLS-1$
+
+ private int blockLineNumber = 0;
+
+ private String style = "none"; //$NON-NLS-1$
+
+ private int maxLevel = Integer.MAX_VALUE;
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineNumber++ > 0) {
+ setClosed(true);
+ return 0;
+ }
+
+ if (!getMarkupLanguage().isFilterGenerativeContents()) {
+ String options = matcher.group(1);
+ setOptions(options);
+
+ OutlineParser outlineParser = new OutlineParser(new ConfluenceLanguage());
+ OutlineItem rootItem = outlineParser.parse(state.getMarkupContent());
+ emitToc(rootItem);
+ }
+ return -1;
+ }
+
+ private void emitToc(OutlineItem item) {
+ if (item.getChildren().isEmpty()) {
+ return;
+ }
+ if ((item.getLevel() + 1) > maxLevel) {
+ return;
+ }
+ Attributes nullAttributes = new Attributes();
+
+ builder.beginBlock(BlockType.NUMERIC_LIST, new Attributes(null, null, "list-style: " + style + ";", null)); //$NON-NLS-1$ //$NON-NLS-2$
+ for (OutlineItem child : item.getChildren()) {
+ builder.beginBlock(BlockType.LIST_ITEM, nullAttributes);
+ builder.link('#' + child.getId(), child.getLabel());
+ emitToc(child);
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ style = "none"; //$NON-NLS-1$
+ maxLevel = Integer.MAX_VALUE;
+ blockLineNumber = 0;
+
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public void setStyle(String style) {
+ this.style = style;
+ }
+
+ public int getMaxLevel() {
+ return maxLevel;
+ }
+
+ public void setMaxLevel(int maxLevel) {
+ this.maxLevel = maxLevel;
+ }
+
+ @Override
+ protected void setOption(String key, String value) {
+ if (key.equals("style")) { //$NON-NLS-1$
+ setStyle(value);
+ } else if (key.equals("maxLevel")) { //$NON-NLS-1$
+ try {
+ maxLevel = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TextBoxBlock.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TextBoxBlock.java
new file mode 100644
index 0000000..ccc7ae3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/block/TextBoxBlock.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TextBoxBlock extends ParameterizedBlock {
+
+ private final Pattern startPattern;
+
+ private final Pattern endPattern;
+
+ private final BlockType blockType;
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private String title;
+
+ private boolean nesting = false;
+
+ public TextBoxBlock(BlockType blockType, String name) {
+ this.blockType = blockType;
+ startPattern = Pattern.compile("\\{" + name + "(?::([^\\}]*))?\\}(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+ endPattern = Pattern.compile("(\\{" + name + "\\})(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ int end = line.length();
+ if (blockLineCount == 0) {
+ setOptions(matcher.group(1));
+
+ Attributes attributes = new Attributes();
+ attributes.setTitle(title);
+
+ offset = matcher.start(2);
+
+ builder.beginBlock(blockType, attributes);
+
+ nesting = true;
+ end = offset;
+ } else {
+
+ boolean terminating = false;
+
+ Matcher endMatcher = endPattern.matcher(line);
+ if (offset < end) {
+ if (offset > 0) {
+ endMatcher.region(offset, end);
+ }
+ if (endMatcher.find()) {
+ terminating = true;
+ end = endMatcher.start(2);
+ } else {
+ end = offset;
+ }
+ }
+ if (terminating) {
+ setClosed(true);
+ }
+ }
+ ++blockLineCount;
+
+ return end == line.length() ? -1 : end;
+ }
+
+ @Override
+ public boolean beginNesting() {
+ return nesting;
+ }
+
+ @Override
+ public int findCloseOffset(String line, int lineOffset) {
+ Matcher endMatcher = endPattern.matcher(line);
+ if (lineOffset != 0) {
+ endMatcher.region(lineOffset, line.length());
+ }
+ if (endMatcher.find()) {
+ return endMatcher.start();
+ }
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ title = null;
+ nesting = false;
+ matcher = startPattern.matcher(line);
+ if (lineOffset > 0) {
+ matcher.region(lineOffset, line.length());
+ }
+ return matcher.matches();
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // the block
+ }
+ super.setClosed(closed);
+ }
+
+ @Override
+ protected void setOption(String key, String value) {
+ if (key.equals("title")) { //$NON-NLS-1$
+ title = value;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/ConfluenceWrappedPhraseModifier.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/ConfluenceWrappedPhraseModifier.java
new file mode 100644
index 0000000..84808d0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/ConfluenceWrappedPhraseModifier.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A phrase modifier that is wrapped with confluence-style words, for example: {quote}
+ *
+ * @author David Green
+ */
+public class ConfluenceWrappedPhraseModifier extends PatternBasedElement {
+
+ protected static final int CONTENT_GROUP = 1;
+
+ private static class SimplePhraseModifierProcessor extends PatternBasedElementProcessor {
+ private final SpanType spanType;
+
+ private final boolean nesting;
+
+ public SimplePhraseModifierProcessor(SpanType spanType, boolean nesting) {
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ public void emit() {
+ Attributes attributes = new Attributes();
+ getBuilder().beginSpan(spanType, attributes);
+ if (nesting) {
+ getMarkupLanguage().emitMarkupLine(parser, state, getStart(this), getContent(this), 0);
+ } else {
+ getMarkupLanguage().emitMarkupText(parser, state, getContent(this));
+ }
+ getBuilder().endSpan();
+ }
+ }
+
+ private final String startDelimiter;
+
+ private final String endDelimiter;
+
+ private final SpanType spanType;
+
+ private final boolean nesting;
+
+ public ConfluenceWrappedPhraseModifier(String delimiter, SpanType spanType, boolean nesting) {
+ this.startDelimiter = delimiter;
+ this.endDelimiter = delimiter;
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String quotedStartDelimiter = quoteLite(startDelimiter);
+ String quotedDelimiter = quoteLite(endDelimiter);
+
+ return quotedStartDelimiter + "(.*?)" + quotedDelimiter; //$NON-NLS-1$
+ }
+
+ private String quoteLite(String literal) {
+ StringBuilder buf = new StringBuilder(literal.length() * 2);
+ for (int x = 0; x < literal.length(); ++x) {
+ char c = literal.charAt(x);
+ switch (c) {
+ case '^':
+ case '*':
+ case '?':
+ case '+':
+ case '{':
+ case '}':
+ case '-':
+ buf.append('\\');
+ }
+ buf.append(c);
+ }
+ return buf.toString();
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ protected static String getContent(PatternBasedElementProcessor processor) {
+ return processor.group(CONTENT_GROUP);
+ }
+
+ protected static int getStart(PatternBasedElementProcessor processor) {
+ return processor.start(CONTENT_GROUP);
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SimplePhraseModifierProcessor(spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/ImagePhraseModifier.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/ImagePhraseModifier.java
new file mode 100644
index 0000000..9d19519
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/ImagePhraseModifier.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.phrase;
+
+import org.eclipse.mylyn.internal.wikitext.confluence.core.util.Options;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.util.Options.Handler;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes.Align;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class ImagePhraseModifier extends PatternBasedElement {
+
+ protected static final int CONTENT_GROUP = 1;
+
+ private static final int OPTIONS_GROUP = 2;
+
+ @Override
+ protected String getPattern(int groupOffset) {
+
+ return "!([^\\|!\\s]+)(?:\\|([^!]*))?!"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new ImagePhraseModifierProcessor();
+ }
+
+ private static class ImagePhraseModifierProcessor extends PatternBasedElementProcessor {
+
+ @Override
+ public void emit() {
+ String imageUrl = group(CONTENT_GROUP);
+ String imageOptions = group(OPTIONS_GROUP);
+
+ final ImageAttributes attributes = new ImageAttributes();
+ if (imageOptions != null) {
+ Options.parseOptions(imageOptions, new Handler() {
+ public void setOption(String key, String value) {
+ if ("alt".equalsIgnoreCase(key)) { //$NON-NLS-1$
+ attributes.setAlt(value);
+ } else if ("align".equalsIgnoreCase(key)) { //$NON-NLS-1$
+ if ("middle".equalsIgnoreCase(value)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Middle);
+ } else if ("left".equalsIgnoreCase(value)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Left);
+ } else if ("right".equalsIgnoreCase(value)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Right);
+ } else if ("center".equalsIgnoreCase(value)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Center);
+ }
+ } else {
+ try {
+ if ("border".equalsIgnoreCase(key)) { //$NON-NLS-1$
+ attributes.setBorder(Integer.parseInt(value));
+ } else if ("height".equalsIgnoreCase(key)) { //$NON-NLS-1$
+ attributes.setHeight(Integer.parseInt(value));
+ } else if ("width".equalsIgnoreCase(key)) { //$NON-NLS-1$
+ attributes.setWidth(Integer.parseInt(value));
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ }
+
+ public void setOption(String option) {
+ // ignore
+ }
+ });
+ }
+ builder.image(attributes, imageUrl);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/SimplePhraseModifier.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/SimplePhraseModifier.java
new file mode 100644
index 0000000..f8d94f4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/SimplePhraseModifier.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimplePhraseModifier extends SimpleWrappedPhraseModifier {
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType, boolean nesting) {
+ super(delimiter, delimiter, spanType, nesting);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/SimpleWrappedPhraseModifier.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/SimpleWrappedPhraseModifier.java
new file mode 100644
index 0000000..62a8b42
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/phrase/SimpleWrappedPhraseModifier.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimpleWrappedPhraseModifier extends PatternBasedElement {
+
+ protected static final int CONTENT_GROUP = 1;
+
+ private static class SimplePhraseModifierProcessor extends PatternBasedElementProcessor {
+ private final SpanType spanType;
+
+ private final boolean nesting;
+
+ public SimplePhraseModifierProcessor(SpanType spanType, boolean nesting) {
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ public void emit() {
+ Attributes attributes = new Attributes();
+ getBuilder().beginSpan(spanType, attributes);
+ if (nesting) {
+ getMarkupLanguage().emitMarkupLine(parser, state, getStart(this), getContent(this), 0);
+ } else {
+ getMarkupLanguage().emitMarkupText(parser, state, getContent(this));
+ }
+ getBuilder().endSpan();
+ }
+ }
+
+ private final String startDelimiter;
+
+ private final String endDelimiter;
+
+ private final SpanType spanType;
+
+ private final boolean nesting;
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType spanType, boolean nesting) {
+ this.startDelimiter = startDelimiter;
+ this.endDelimiter = endDelimiter;
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String quotedStartDelimiter = quoteLite(startDelimiter);
+ String quotedDelimiter = quoteLite(endDelimiter);
+
+ return quotedStartDelimiter + "(?!" + quotedDelimiter + ")" + "([^\\s" + quotedDelimiter + "]+|\\S[^" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ + quotedDelimiter + "]*[^\\s" + quotedDelimiter + "])" + // content //$NON-NLS-1$ //$NON-NLS-2$
+ quotedDelimiter;
+ }
+
+ private String quoteLite(String literal) {
+ StringBuilder buf = new StringBuilder(literal.length() * 2);
+ for (int x = 0; x < literal.length(); ++x) {
+ char c = literal.charAt(x);
+ switch (c) {
+ case '^':
+ case '*':
+ case '?':
+ case '+':
+ case '{':
+ case '}':
+ case '-':
+ buf.append('\\');
+ }
+ buf.append(c);
+ }
+ return buf.toString();
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ protected static String getContent(PatternBasedElementProcessor processor) {
+ return processor.group(CONTENT_GROUP);
+ }
+
+ protected static int getStart(PatternBasedElementProcessor processor) {
+ return processor.start(CONTENT_GROUP);
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SimplePhraseModifierProcessor(spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/token/AnchorReplacementToken.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/token/AnchorReplacementToken.java
new file mode 100644
index 0000000..4e55c4a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/token/AnchorReplacementToken.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class AnchorReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "\\{anchor:([^\\}]+)\\}"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new AnchorReplacementTokenProcessor();
+ }
+
+ private static class AnchorReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String name = group(1);
+ Attributes attributes = new Attributes();
+ attributes.setId(name);
+ getBuilder().beginSpan(SpanType.SPAN, attributes);
+ getBuilder().endSpan();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/token/HyperlinkReplacementToken.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/token/HyperlinkReplacementToken.java
new file mode 100644
index 0000000..b8679ed
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/token/HyperlinkReplacementToken.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.confluence.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.LinkAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HyperlinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "\\[([^\\]]+)\\]"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String linkComposite = group(1);
+ String[] parts = linkComposite.split("\\s*\\|\\s*"); //$NON-NLS-1$
+ String text = parts.length > 1 ? parts[0] : null;
+ if (text != null) {
+ text = text.trim();
+ }
+ String href = parts.length > 1 ? parts[1] : parts[0];
+ if (href != null) {
+ href = href.trim();
+ }
+ String tip = parts.length > 2 ? parts[2] : null;
+ if (tip != null) {
+ tip = tip.trim();
+ }
+ if (text == null || text.length() == 0) {
+ text = href;
+ if (text.length() > 0 && text.charAt(0) == '#') {
+ text = text.substring(1);
+ }
+ }
+ Attributes attributes = new LinkAttributes();
+ attributes.setTitle(tip);
+ getBuilder().link(attributes, href, text);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/util/Options.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/util/Options.java
new file mode 100644
index 0000000..0748296
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/core/util/Options.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.confluence.core.util;
+
+/**
+ * A utility for parsing Confluence-style options
+ *
+ * @author David Green
+ */
+public class Options {
+ /**
+ * a handler for accepting options
+ */
+ public interface Handler {
+
+ /**
+ * Set an option with key and value pair
+ *
+ * @param key
+ * the key of the option
+ * @param value
+ * the value of the option
+ *
+ * @see #setOption(String)
+ */
+ public void setOption(String key, String value);
+
+ /**
+ * Set an option that is specified without a value. The default implementation does nothing.
+ *
+ * @param option
+ * the option to set
+ *
+ * @see #setOption(String, String)
+ */
+ public void setOption(String option);
+ }
+
+ public static void parseOptions(String options, Handler handler) {
+ if (options == null) {
+ return;
+ }
+ String[] opts = options.split("\\s*\\|\\s*"); //$NON-NLS-1$
+ for (String optionPair : opts) {
+ String[] keyValue = optionPair.split("\\s*=\\s*"); //$NON-NLS-1$
+ if (keyValue.length == 2) {
+ String key = keyValue[0].trim();
+ String value = keyValue[1].trim();
+ handler.setOption(key, value);
+ } else if (keyValue.length == 1) {
+ handler.setOption(optionPair);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/validation/ConfluenceReferenceValidationRule.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/validation/ConfluenceReferenceValidationRule.java
new file mode 100644
index 0000000..791af22
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/internal/wikitext/confluence/validation/ConfluenceReferenceValidationRule.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.confluence.validation;
+
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.validation.DocumentLocalReferenceValidationRule;
+
+public class ConfluenceReferenceValidationRule extends DocumentLocalReferenceValidationRule {
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new ConfluenceLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/wikitext/confluence/core/ConfluenceLanguage.java b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/wikitext/confluence/core/ConfluenceLanguage.java
new file mode 100644
index 0000000..3dbe96f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.core/src/org/eclipse/mylyn/wikitext/confluence/core/ConfluenceLanguage.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.confluence.core;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.CodeBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.ColorBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.ExtendedPreformattedBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.ExtendedQuoteBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.HeadingBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.ListBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.ParagraphBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.QuoteBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.TableBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.TableOfContentsBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.block.TextBoxBlock;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.phrase.ConfluenceWrappedPhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.phrase.ImagePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.phrase.SimplePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.phrase.SimpleWrappedPhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.token.AnchorReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.confluence.core.token.HyperlinkReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.AbstractMarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.EntityReferenceReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.ImpliedHyperlinkReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.PatternEntityReferenceReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.PatternLineBreakReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.PatternLiteralReplacementToken;
+
+/**
+ * A confluence language for parsing Confluence markup.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ConfluenceLanguage extends AbstractMarkupLanguage {
+ /**
+ * blocks that may be nested in side a quote block
+ *
+ * @see ExtendedQuoteBlock
+ */
+ private final List<Block> nestedBlocks = new ArrayList<Block>();
+
+ public ConfluenceLanguage() {
+ setName("Confluence"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void clearLanguageSyntax() {
+ super.clearLanguageSyntax();
+ nestedBlocks.clear();
+ }
+
+ public List<Block> getNestedBlocks() {
+ return nestedBlocks;
+ }
+
+ @Override
+ protected void addStandardBlocks(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ HeadingBlock headingBlock = new HeadingBlock();
+ blocks.add(headingBlock);
+ paragraphBreakingBlocks.add(headingBlock);
+ nestedBlocks.add(headingBlock);
+ ListBlock listBlock = new ListBlock();
+ blocks.add(listBlock);
+ paragraphBreakingBlocks.add(listBlock);
+ nestedBlocks.add(listBlock);
+ blocks.add(new QuoteBlock());
+ TableBlock tableBlock = new TableBlock();
+ blocks.add(tableBlock);
+ paragraphBreakingBlocks.add(tableBlock);
+ nestedBlocks.add(tableBlock);
+ ExtendedQuoteBlock quoteBlock = new ExtendedQuoteBlock();
+ blocks.add(quoteBlock);
+ paragraphBreakingBlocks.add(quoteBlock);
+ ExtendedPreformattedBlock noformatBlock = new ExtendedPreformattedBlock();
+ blocks.add(noformatBlock);
+ paragraphBreakingBlocks.add(noformatBlock);
+
+ blocks.add(new TextBoxBlock(BlockType.PANEL, "panel")); //$NON-NLS-1$
+ blocks.add(new TextBoxBlock(BlockType.NOTE, "note")); //$NON-NLS-1$
+ blocks.add(new TextBoxBlock(BlockType.INFORMATION, "info")); //$NON-NLS-1$
+ blocks.add(new TextBoxBlock(BlockType.WARNING, "warning")); //$NON-NLS-1$
+ blocks.add(new TextBoxBlock(BlockType.TIP, "tip")); //$NON-NLS-1$
+ CodeBlock codeBlock = new CodeBlock();
+ blocks.add(codeBlock);
+ paragraphBreakingBlocks.add(codeBlock);
+ blocks.add(new TableOfContentsBlock());
+ ColorBlock colorBlock = new ColorBlock();
+ blocks.add(colorBlock);
+ paragraphBreakingBlocks.add(colorBlock);
+ }
+
+ @Override
+ protected void addStandardPhraseModifiers(PatternBasedSyntax phraseModifierSyntax) {
+ phraseModifierSyntax.beginGroup("(?:(?<=[\\s\\.,\\\"'?!;:\\)\\(\\[\\]])|^)(?:", 0); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("*", SpanType.STRONG, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("_", SpanType.EMPHASIS, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("??", SpanType.CITATION, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("-", SpanType.DELETED, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("+", SpanType.UNDERLINED, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("^", SpanType.SUPERSCRIPT, false)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("~", SpanType.SUBSCRIPT, false)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleWrappedPhraseModifier("{{", "}}", SpanType.MONOSPACE, false)); //$NON-NLS-1$ //$NON-NLS-2$
+ phraseModifierSyntax.add(new ConfluenceWrappedPhraseModifier("{quote}", SpanType.QUOTE, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new ImagePhraseModifier());
+ phraseModifierSyntax.endGroup(")(?=\\W|$)", 0); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void addStandardTokens(PatternBasedSyntax tokenSyntax) {
+ tokenSyntax.add(new EntityReferenceReplacementToken("(tm)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(TM)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(c)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(C)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(r)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(R)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new HyperlinkReplacementToken());
+ tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w\\s)(---)(?=\\s\\w))", "#8212")); // emdash //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w\\s)(--)(?=\\s\\w))", "#8211")); // endash //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new PatternLiteralReplacementToken("(?:(?<=\\w\\s)(----)(?=\\s\\w))", "<hr/>")); // horizontal rule //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new PatternLineBreakReplacementToken("(\\\\\\\\)")); // line break //$NON-NLS-1$
+ tokenSyntax.add(new ImpliedHyperlinkReplacementToken());
+ tokenSyntax.add(new AnchorReplacementToken());
+ }
+
+ @Override
+ protected Block createParagraphBlock() {
+ return new ParagraphBlock();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.classpath b/org.eclipse.mylyn.wikitext.confluence.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.project b/org.eclipse.mylyn.wikitext.confluence.ui/.project
new file mode 100644
index 0000000..7ba0cb7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.confluence.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..f714538
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:30 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..ca41cef
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Thu Aug 14 22:14:04 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.internal=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.confluence.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a2b929f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.confluence.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.confluence.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)"
+Bundle-Localization: plugin
+Export-Package: org.eclipse.mylyn.internal.wikitext.confluence.ui;x-internal:=true
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/about.html b/org.eclipse.mylyn.wikitext.confluence.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/build.properties b/org.eclipse.mylyn.wikitext.confluence.ui/build.properties
new file mode 100644
index 0000000..7ba95a0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/build.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ help/
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/help/cheatSheet/Confluence.confluence b/org.eclipse.mylyn.wikitext.confluence.ui/help/cheatSheet/Confluence.confluence
new file mode 100644
index 0000000..3b6cbcc
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/help/cheatSheet/Confluence.confluence
@@ -0,0 +1,39 @@
+h3. Confluence Markup Cheat Sheet
+
+h4. Phrase Modifiers
+
+| {{_emphasis_}} | _emphasis_ |
+| {{*strong*}} | *strong* |
+| {{??citation??}} | ??citation?? |
+| {{-deleted text-}} | -deleted text- |
+| {{inserted text}} | +inserted text+ |
+| {{^superscript^}} | ^superscript^ |
+| {{~subscript~}} | ~subscript~ |
+
+h4. Block Modifiers
+
+| {{hn.}} | Heading (where n is some digit, for example h1) |
+| {{bq.}} | Block quote (single paragraph) |
+| {{{quote}}} | Block quote (multiple paragraphs) |
+| {{{code}}} | Block code |
+| {{{note:title=Note}}} | A simple note |
+| {{{warning:title=Caution}}} | A warning note |
+| {{{info:title=Useful Information}}} | Informational note |
+| {{{tip:title=Tip}}} | A help tip |
+| {{{noformat}}} | Pre-formatted block |
+| {{#}} | Numeric list |
+| {{*}} | Bulleted list |
+
+h4. Links
+
+{noformat}
+[Title|http://www.example.com]
+[Title|http://www.example.com|tip]
+{noformat}
+
+h4. Text Breaks
+
+| (empty line) | produces a new paragraph |
+| {{----}} | horizontal rule |
+| {{---}} | --- symbol (emdash) |
+| {{--}} | -- symbol (endash) |
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/plugin.properties b/org.eclipse.mylyn.wikitext.confluence.ui/plugin.properties
new file mode 100644
index 0000000..9c38217
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/plugin.properties
@@ -0,0 +1,45 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+#Properties file for org.eclipse.mylyn.wikitext.confluence.ui
+
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Confluence UI
+
+template.description.0 = _emphasis_
+template.description.1 = *strong*
+template.description.2 = __italic__
+template.description.3 = **bold**
+template.description.5 = ??citation??
+template.description.6 = -deleted-
+template.description.7 = +inserted+
+template.description.8 = ^superscript^
+template.description.9 = ~subscript~
+template.description.10 = Heading 1
+template.description.11 = Heading 2
+template.description.12 = Heading 3
+template.description.13 = Heading 4
+template.description.14 = Heading 5
+template.description.15 = Heading 6
+template.description.17 = {code} Block code
+template.description.19 = {quote} Block quote
+template.description.23 = {noformat} Pre-formatted text
+template.description.24 = List (numeric)
+template.description.25 = List (level 2, numeric)
+template.description.26 = List (bulleted)
+template.description.27 = List (level 2, bulleted)
+template.description.29 = Table of contents
+template.description.30 = Glossary
+template.description.4 = hyperlink with title
+template.description.16 = Table
+template.description.18 = Table heading
+template.description.20 = {info} Info panel
+template.description.21 = {note} Note panel
+template.description.28 = {tip} Tip panel
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/plugin.xml b/org.eclipse.mylyn.wikitext.confluence.ui/plugin.xml
new file mode 100644
index 0000000..f8c886f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/plugin.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.contentAssist">
+
+ <templates
+ markupLanguage="Confluence">
+ <!-- phrase modifiers -->
+ <template name="_" description="%template.description.0" content="_${text}_ $"/>
+ <template name="*" description="%template.description.1" content="*${text}* $"/>
+ <template name="__" description="%template.description.2" content="__${text}__ $"/>
+ <template name="**" description="%template.description.3" content="**${text}** $"/>
+ <template name="??" description="%template.description.5" content="??${text}?? $"/>
+ <template name="-" description="%template.description.6" content="-${text}- $"/>
+ <template name="+" description="%template.description.7" content="+${text}+ $"/>
+ <template name="^" description="%template.description.8" content="^${text}^ $"/>
+ <template name="~" description="%template.description.9" content="~${text}~ $"/>
+ <template name="[" description="%template.description.4" content="[${text}|${url}] $"/>
+
+ <!-- block templates -->
+
+ <template name="h1. " description="%template.description.10" content="\nh1. ${text}\n\n" block="true"/>
+ <template name="h2. " description="%template.description.11" content="\nh2. ${text}\n\n" block="true"/>
+ <template name="h3. " description="%template.description.12" content="\nh3. ${text}\n\n" block="true"/>
+ <template name="h4. " description="%template.description.13" content="\nh4. ${text}\n\n" block="true"/>
+ <template name="h5. " description="%template.description.14" content="\nh5. ${text}\n\n" block="true"/>
+ <template name="h6. " description="%template.description.15" content="\nh6. ${text}\n\n" block="true"/>
+ <template name="code" description="%template.description.17" content="\n{code}\n${text}\n{code}\n\n" block="true"/>
+ <template name="info" description="%template.description.20" content="\n{info}\n${text}\n{info}\n\n" block="true"/>
+ <template name="note" description="%template.description.21" content="\n{note}\n${text}\n{note}\n\n" block="true"/>
+ <template name="quote" description="%template.description.19" content="\n{quote}\n${text}\n{quote}\n\n" block="true"/>
+ <template name="tip" description="%template.description.28" content="\n{tip}\n${text}\n{tip}\n\n" block="true"/>
+ <template name="noformat" description="%template.description.23" content="\n{noformat}\n${text}\n{noformat}\n\n" block="true"/>
+ <template name="# " description="%template.description.24" content="\n# ${text}\n# ${text2}\n\n" block="true"/>
+ <template name="## " description="%template.description.25" content="\n## ${text}\n## ${text2}\n\n" block="true"/>
+ <template name="* " description="%template.description.26" content="\n* ${text}\n* ${text2}\n\n" block="true"/>
+ <template name="** " description="%template.description.27" content="\n** ${text}\n** ${text2}\n\n" block="true"/>
+ <template name="|" description="%template.description.16" content="\n| ${text} | ${text2} |\n| ${text3} | ${text4} |\n\n" block="true"/>
+ <template name="||" description="%template.description.18" content="\n|| ${text} || ${text2} ||\n" block="true"/>
+
+ <!-- generative templates -->
+ <template name="{toc}" description="%template.description.29" content="\n{toc}\n\n" block="true"/>
+ <template name="{glossary}" description="%template.description.30" content="\n{glossary}\n\n" block="true"/>
+
+ </templates>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.cheatSheet">
+ <content
+ markupLanguage="Confluence"
+ resource="help/cheatSheet/Confluence.confluence"
+ contentLanguage="Confluence">
+ </content>
+ </extension>
+
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.confluence.ui/src/org/eclipse/mylyn/internal/wikitext/confluence/ui/package-info.java b/org.eclipse.mylyn.wikitext.confluence.ui/src/org/eclipse/mylyn/internal/wikitext/confluence/ui/package-info.java
new file mode 100644
index 0000000..b5499c2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.confluence.ui/src/org/eclipse/mylyn/internal/wikitext/confluence/ui/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * @author David Green
+ */
+package org.eclipse.mylyn.internal.wikitext.confluence.ui;
+
diff --git a/org.eclipse.mylyn.wikitext.core/.classpath b/org.eclipse.mylyn.wikitext.core/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.core/.cvsignore b/org.eclipse.mylyn.wikitext.core/.cvsignore
new file mode 100644
index 0000000..c07f541
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.cvsignore
@@ -0,0 +1 @@
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.core/.project b/org.eclipse.mylyn.wikitext.core/.project
new file mode 100644
index 0000000..88d64db
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..3e988b0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:01:26 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.wst.validation.prefs b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..93fb520
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,9 @@
+#Thu Jul 31 11:01:26 PDT 2008
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator;
+USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator;
+USER_PREFERENCE=overrideGlobalPreferencesfalse
+eclipse.preferences.version=1
+override=false
+suspend=false
+vf.version=3
diff --git a/org.eclipse.mylyn.wikitext.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2b44b9c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Export-Package: org.eclipse.mylyn.internal.wikitext.core;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.core.parser.builder;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.core.util;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.core.util.css;x-friends:="org.eclipse.mylyn.wikitext.ui,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.core.validation;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core,
+ org.eclipse.mylyn.wikitext.core.parser,
+ org.eclipse.mylyn.wikitext.core.parser.builder,
+ org.eclipse.mylyn.wikitext.core.parser.markup,
+ org.eclipse.mylyn.wikitext.core.parser.markup.block,
+ org.eclipse.mylyn.wikitext.core.parser.markup.phrase,
+ org.eclipse.mylyn.wikitext.core.parser.markup.token,
+ org.eclipse.mylyn.wikitext.core.parser.outline,
+ org.eclipse.mylyn.wikitext.core.parser.util,
+ org.eclipse.mylyn.wikitext.core.util,
+ org.eclipse.mylyn.wikitext.core.util.anttask,
+ org.eclipse.mylyn.wikitext.core.validation
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.apache.ant;bundle-version="1.7.0";resolution:=optional
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.core/about.html b/org.eclipse.mylyn.wikitext.core/about.html
new file mode 100644
index 0000000..0754b6a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/about.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+<h3>Third Party Content</h3>
+
+<p>The Content includes items that have been sourced from third
+parties as set out below. If you did not receive this
+Content directly from the Eclipse Foundation, the
+following is provided for informational purposes only,
+and you should look to the Redistributor’s
+license for terms and conditions of use.</p>
+
+<h4>Apache Xerces 2.9 (subset)</h4>
+
+<p>The plug-in is accompanied by a modified subset of Apache Xerces 2.9 ("Xerces") developed by the Apache Software Foundation as
+part of the Apache XML project. Files included from the Xerces distribution (see modfied files for change log):</p>
+
+<pre>
+Original File: src/org/apache/xerces/util/XML11Char.java
+Modfied File : src/org/eclipse/mylyn/internal/wikitext/core/util/XML11Char.java
+</pre>
+
+<p>Your use of Apache Xerces is subject to the terms and conditions of the Apache License, Version 2.0
+("Apache License"). A copy of the Apache License can be found in <a href="about_files/LICENSE">about_files/LICENSE</a>
+and is also available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.</p>
+
+<p>The Apache attribution <a href="about_files/NOTICE" target="_blank">NOTICE</a> file is included with the Content in accordance with 4d of the Apache License, Version 2.0.</p>
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.core/about.ini b/org.eclipse.mylyn.wikitext.core/about.ini
new file mode 100644
index 0000000..6582110
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/about.ini
@@ -0,0 +1,9 @@
+aboutText=Mylyn WikiText\n\
+\n\
+Copyright (c) 2007, 2008 David Green and others. All rights reserved.\n\
+Visit http://www.eclipse.org/mylyn
+
+#windowImage=icons/wikitext-32.gif
+featureImage=icons/wikitext-32.gif
+aboutImage=icons/wikitext-32.gif
+
diff --git a/org.eclipse.mylyn.wikitext.core/about_files/LICENSE b/org.eclipse.mylyn.wikitext.core/about_files/LICENSE
new file mode 100755
index 0000000..6b0b127
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/about_files/LICENSE
@@ -0,0 +1,203 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/org.eclipse.mylyn.wikitext.core/about_files/NOTICE b/org.eclipse.mylyn.wikitext.core/about_files/NOTICE
new file mode 100755
index 0000000..e19d1ce
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/about_files/NOTICE
@@ -0,0 +1,7 @@
+ =========================================================================
+ == NOTICE file corresponding to section 4(d) of the Apache License, ==
+ == Version 2.0, in this case for the Apache Axis distribution. ==
+ =========================================================================
+
+ This product includes software developed by
+ The Apache Software Foundation (http://www.apache.org/).
diff --git a/org.eclipse.mylyn.wikitext.core/build.properties b/org.eclipse.mylyn.wikitext.core/build.properties
new file mode 100644
index 0000000..a7fcfff
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/build.properties
@@ -0,0 +1,46 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ icons/,\
+ about.ini,\
+ plugin.xml,\
+ schema/,\
+ about.html,\
+ about_files/,\
+ plugin.properties
+
+dist=dist
+bin=bin
+
+plugin.name=org.eclipse.mylyn.wikitext
+
+java.build.lib = test-lib
+java.compile.debug=on
+java.compile.deprecation=on
+java.build.java.classes=${bin}
+java.compile.optimize=on
+java.build.java.src=src
+java.build.dist=${dist}
+
+java.build.java.test.src=test-src
+java.build.java.test.classes=test-bin
+build.out.tests=tests
+
+
+java.build.jar=${plugin.name}_${plugin.version}.jar
+bin.excludes = icons/ds.xcf
+
+src.includes=about.html
+
+
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/icons/ds.xcf b/org.eclipse.mylyn.wikitext.core/icons/ds.xcf
new file mode 100644
index 0000000..88533b5
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.core/icons/ds.xcf differ
diff --git a/org.eclipse.mylyn.wikitext.core/icons/wikitext-32.gif b/org.eclipse.mylyn.wikitext.core/icons/wikitext-32.gif
new file mode 100644
index 0000000..455e4e3
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.core/icons/wikitext-32.gif differ
diff --git a/org.eclipse.mylyn.wikitext.core/plugin.properties b/org.eclipse.mylyn.wikitext.core/plugin.properties
new file mode 100644
index 0000000..6f671dd
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/plugin.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2008 Mylyn project committers 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.core
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText
+content-type.name.0 = WikiText
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/plugin.xml b/org.eclipse.mylyn.wikitext.core/plugin.xml
new file mode 100644
index 0000000..6453e79
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/plugin.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension-point id="markupLanguage" name="Markup Language" schema="schema/markupLanguage.exsd"/>
+ <extension-point id="markupValidationRule" name="Markup Validation Rule" schema="schema/markupValidationRule.exsd"/>
+
+ <!-- The wikitext content type. MarkupLanguage-providing plugins are expected to subclass this content type
+ for the purpose of associating the editor with the appropriate files -->
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.core.runtime.text"
+ id="org.eclipse.mylyn.wikitext"
+ name="%content-type.name.0"
+ priority="normal">
+ </content-type>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.core/schema/markupLanguage.exsd b/org.eclipse.mylyn.wikitext.core/schema/markupLanguage.exsd
new file mode 100644
index 0000000..3babaaf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/schema/markupLanguage.exsd
@@ -0,0 +1,157 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.wikitext.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.wikitext.core" id="markupLanguage" name="Markup Language"/>
+ </appInfo>
+ <documentation>
+ A means of adding support for parsing lightweight markup languages. A MarkupLanguage defines the rules and semantics used when parsing lightweight markup (wikitext). This extension point should be used to add new markup parsers to the WikiText framework.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="language" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="language">
+ <annotation>
+ <appInfo>
+ <meta.element labelAttribute="name"/>
+ </appInfo>
+ <documentation>
+ A language declaration, indicating a MarkupLanguage class and identifiable name.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ The fully qualified name of the class that implements the markup language. Must extend org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ The name of the markup language. This name should be recognizable to the user. The name is not translatable as it is a proper name. For example, 'Textile' or 'Markdown'.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="fileExtensions" type="string">
+ <annotation>
+ <documentation>
+ A comma-delimited list of file extensions for which this should be the default markup language.
+Note that a preceding dot is not required on the extension. For example: "textile, markup".
+
+Plugins should also use the org.eclipse.core.contenttype.contentTypes extension point to create a new content type that extends org.eclipse.mylyn.wikitext and associates the new content type with the same file extensions. This will ensure that the markup editor is correctly associated with the right file extensions.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="extends" type="string">
+ <annotation>
+ <documentation>
+ Optionally specify the name of the markup language that is extended by this language. Used to provide type hierarchies in language declarations, so that things like cheat sheets and content assist can be inherited.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ <pre>
+<extension point="org.eclipse.mylyn.wikitext.core.markupLanguage">
+ <language class="org.eclipse.mylyn.wikitext.textile.core.TextileLanguage"
+ name="Textile" fileExtensions="textile">
+ </language>
+</extension>
+</pre>
+Generally markup language declarations are also followed by the following:
+<pre>
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.mylyn.wikitext"
+ file-extensions="textile"
+ id="org.eclipse.mylyn.wikitext.textile"
+ name="Textile markup"
+ priority="normal">
+ </content-type>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="textile"
+ type="text">
+ </fileTypes>
+ </extension>
+</pre>
+ </documentation>
+ </annotation>
+
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2007, 2009 David Green 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.wikitext.core/schema/markupValidationRule.exsd b/org.eclipse.mylyn.wikitext.core/schema/markupValidationRule.exsd
new file mode 100644
index 0000000..f53be63
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/schema/markupValidationRule.exsd
@@ -0,0 +1,112 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.wikitext.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.wikitext.core" id="markupValidationRule" name="Markup Validation Rule"/>
+ </appInfo>
+ <documentation>
+ Register a validation rule for a specific markup language. Validation rules can produce errors or warnings about markup content, informing the user of potential problems with markup.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="rule" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="rule">
+ <complexType>
+ <attribute name="markupLanguage" type="string" use="required">
+ <annotation>
+ <documentation>
+ the name of the markup language for which this rule should be run. Must match the name provided by the markupLanguage extension point.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string" use="required">
+ <annotation>
+ <documentation>
+ the Java class that implements the validation rule. must extend <code>org.eclipse.mylyn.wikitext.core.validation.ValidationRule</code>
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.mylyn.wikitext.core.validation.ValidationRule:"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ <pre>
+<extension point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule markupLanguage="Textile"
+ class="org.eclipse.mylyn.internal.wikitext.textile.core.validation.BlockWhitespaceRule" />
+ <rule markupLanguage="Textile"
+ class="org.eclipse.mylyn.internal.wikitext.textile.core.validation.TextileReferenceValidationRule" />
+</extension>
+</pre>
+ </documentation>
+ </annotation>
+
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2007, 2009 David Green 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.wikitext.core/since.xml b/org.eclipse.mylyn.wikitext.core/since.xml
new file mode 100644
index 0000000..362e3a6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/since.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+>
+<project name="since" default="all">
+ <target name="all">
+ <replaceregexp flags="s" match="(\s+)(\*/\s+public class)">
+ <substitution expression="\1* @since 1.0\1\2"/>
+ <fileset dir="..">
+ <include name="org.eclipse.mylyn.wikitext*/src/**/*.java"/>
+ <exclude name="org.eclipse.mylyn.wikitext.tests/**/*"/>
+ <exclude name="**/internal/**/*"/>
+ </fileset>
+ </replaceregexp>
+ </target>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/Messages.java
new file mode 100644
index 0000000..c844d20
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.core.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/WikiTextPlugin.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/WikiTextPlugin.java
new file mode 100644
index 0000000..5b48911
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/WikiTextPlugin.java
@@ -0,0 +1,397 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core;
+
+import java.text.MessageFormat;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.wikitext.core.util.EclipseServiceLocator;
+import org.eclipse.mylyn.internal.wikitext.core.validation.ValidationRules;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.util.ServiceLocator;
+import org.eclipse.mylyn.wikitext.core.validation.MarkupValidator;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The WikiText plug-in class. Use only in an Eclipse runtime environment. Programs should use the
+ * {@link ServiceLocator} instead of this class if possible. Stand-alone programs (that is, those programs that do not
+ * run in an Eclipse runtime) must not use this class.
+ *
+ * Should not be instantiated directly, instead use {@link #getDefault()}.
+ *
+ * @author David Green
+ *
+ * @see #getDefault()
+ * @see ServiceLocator
+ */
+public class WikiTextPlugin extends Plugin {
+
+ private static final String EXTENSION_MARKUP_LANGUAGE = "markupLanguage"; //$NON-NLS-1$
+
+ private static final String EXTENSION_VALIDATION_RULES = "markupValidationRule"; //$NON-NLS-1$
+
+ private static WikiTextPlugin plugin;
+
+ private SortedMap<String, Class<? extends MarkupLanguage>> languageByName;
+
+ private Map<String, Class<? extends MarkupLanguage>> languageByFileExtension;
+
+ private Map<Class<? extends MarkupLanguage>, String> languageNameByLanguage;
+
+ private Map<String, String> languageExtensionByLanguage;
+
+ private Map<String, ValidationRules> validationRulesByLanguageName;
+
+ public WikiTextPlugin() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ ServiceLocator.setImplementation(EclipseServiceLocator.class);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (plugin == this) {
+ plugin = null;
+ }
+ super.stop(context);
+ }
+
+ public static WikiTextPlugin getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Get a markup language by name.
+ *
+ * @param name
+ * the name of the markup language to retrieve
+ *
+ * @return the markup language or null if there is no markup language known by the given name
+ *
+ * @see #getMarkupLanguageNames()
+ */
+ public MarkupLanguage getMarkupLanguage(String name) {
+ if (languageByName == null) {
+ initializeMarkupLanguages();
+ }
+ Class<? extends MarkupLanguage> languageClass = languageByName.get(name);
+ if (languageClass == null) {
+ // if not found by name, attempt to lookup by class name.
+ for (Class<? extends MarkupLanguage> clazz : languageByName.values()) {
+ if (clazz.getName().equals(name)) {
+ languageClass = clazz;
+ break;
+ }
+ }
+ }
+ if (languageClass != null) {
+ return instantiateMarkupLanguage(name, languageClass);
+ }
+ return null;
+ }
+
+ private MarkupLanguage instantiateMarkupLanguage(String name, Class<? extends MarkupLanguage> languageClass) {
+ try {
+ MarkupLanguage language = languageClass.newInstance();
+ language.setName(name);
+ language.setExtendsLanguage(languageExtensionByLanguage.get(name));
+ return language;
+ } catch (Exception e) {
+ log(IStatus.ERROR, MessageFormat.format(Messages.getString("WikiTextPlugin.2"), name, //$NON-NLS-1$
+ languageClass.getName(), e.getMessage()), e);
+ }
+ return null;
+ }
+
+ /**
+ * Get a markup language name for a file. A markup language is selected based on the registered languages and their
+ * expected file extensions.
+ *
+ * @param name
+ * the name of the file for which a markup language is desired
+ *
+ * @return the markup language name, or null if no markup language is registered for the specified file name
+ *
+ * @see #getMarkupLanguageForFilename(String)
+ */
+ public String getMarkupLanguageNameForFilename(String name) {
+ if (languageByFileExtension == null) {
+ initializeMarkupLanguages();
+ }
+ int lastIndexOfDot = name.lastIndexOf('.');
+ String extension = lastIndexOfDot == -1 ? name : name.substring(lastIndexOfDot + 1);
+ Class<? extends MarkupLanguage> languageClass = languageByFileExtension.get(extension);
+ if (languageClass != null) {
+ return languageNameByLanguage.get(languageClass);
+ }
+ return null;
+ }
+
+ /**
+ * Get the file extensions that are registered for markup languages. File extensions are specified without the
+ * leading dot.
+ */
+ public Set<String> getMarkupFileExtensions() {
+ if (languageByFileExtension == null) {
+ initializeMarkupLanguages();
+ }
+ return Collections.unmodifiableSet(languageByFileExtension.keySet());
+ }
+
+ /**
+ * Get a markup language for a file. A markup language is selected based on the registered languages and their
+ * expected file extensions.
+ *
+ * @param name
+ * the name of the file for which a markup language is desired
+ *
+ * @return the markup language, or null if no markup language is registered for the specified file name
+ *
+ * @see #getMarkupLanguageForFilename(String)
+ */
+ public MarkupLanguage getMarkupLanguageForFilename(String name) {
+ if (languageByFileExtension == null) {
+ initializeMarkupLanguages();
+ }
+ int lastIndexOfDot = name.lastIndexOf('.');
+ String extension = lastIndexOfDot == -1 ? name : name.substring(lastIndexOfDot + 1);
+ Class<? extends MarkupLanguage> languageClass = languageByFileExtension.get(extension);
+ if (languageClass != null) {
+ String languageName = null;
+ for (Map.Entry<String, Class<? extends MarkupLanguage>> ent : languageByName.entrySet()) {
+ if (ent.getValue() == languageClass) {
+ languageName = ent.getKey();
+ break;
+ }
+ }
+ return instantiateMarkupLanguage(languageName, languageClass);
+ }
+ return null;
+ }
+
+ /**
+ * Get the names of all known markup languages
+ *
+ * @see #getMarkupLanguage(String)
+ */
+ public Set<String> getMarkupLanguageNames() {
+ if (languageByName == null) {
+ initializeMarkupLanguages();
+ }
+ return languageByName.keySet();
+ }
+
+ /**
+ * Get a markup validator by language name.
+ *
+ * @param name
+ * the name of the markup language for which a validator is desired
+ *
+ * @return the markup validator
+ *
+ * @see #getMarkupLanguageNames()
+ */
+ public MarkupValidator getMarkupValidator(String name) {
+ MarkupValidator markupValidator = new MarkupValidator();
+
+ if (validationRulesByLanguageName == null) {
+ initializeValidationRules();
+ }
+ ValidationRules rules = validationRulesByLanguageName.get(name);
+ if (rules != null) {
+ markupValidator.getRules().addAll(rules.getRules());
+ }
+
+ return markupValidator;
+ }
+
+ private void initializeValidationRules() {
+ initializeMarkupLanguages();
+ synchronized (this) {
+ if (validationRulesByLanguageName == null) {
+ Map<String, ValidationRules> validationRulesByLanguageName = new HashMap<String, ValidationRules>();
+
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(getPluginId(),
+ EXTENSION_VALIDATION_RULES);
+ if (extensionPoint != null) {
+ IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
+ for (IConfigurationElement element : configurationElements) {
+ try {
+ String markupLanguage = element.getAttribute("markupLanguage"); //$NON-NLS-1$
+ if (markupLanguage == null || markupLanguage.length() == 0) {
+ throw new Exception(Messages.getString("WikiTextPlugin.4")); //$NON-NLS-1$
+ }
+ if (!languageByName.containsKey(markupLanguage)) {
+ throw new Exception(MessageFormat.format(
+ Messages.getString("WikiTextPlugin.5"), languageByName)); //$NON-NLS-1$
+ }
+ Object extension;
+ try {
+ extension = element.createExecutableExtension("class"); //$NON-NLS-1$
+ } catch (CoreException e) {
+ getLog().log(e.getStatus());
+ continue;
+ }
+ if (!(extension instanceof ValidationRule)) {
+ throw new Exception(MessageFormat.format(
+ Messages.getString("WikiTextPlugin.7"), extension.getClass() //$NON-NLS-1$
+ .getName()));
+ }
+ ValidationRules rules = validationRulesByLanguageName.get(markupLanguage);
+ if (rules == null) {
+ rules = new ValidationRules();
+ validationRulesByLanguageName.put(markupLanguage, rules);
+ }
+ rules.addValidationRule((ValidationRule) extension);
+ } catch (Exception e) {
+ log(IStatus.ERROR, MessageFormat.format(
+ Messages.getString("WikiTextPlugin.8"), //$NON-NLS-1$
+ element.getDeclaringExtension().getContributor().getName(),
+ EXTENSION_VALIDATION_RULES, e.getMessage()), e);
+ }
+ }
+ }
+
+ // now that we have the basic validation rules, check for language extensions and connect the hierarchy
+
+ // first ensure that all language names have templates defined
+ Set<String> languageNames = WikiTextPlugin.getDefault().getMarkupLanguageNames();
+ for (String languageName : languageNames) {
+ ValidationRules rules = validationRulesByLanguageName.get(languageName);
+ if (rules == null) {
+ rules = new ValidationRules();
+ validationRulesByLanguageName.put(languageName, rules);
+ }
+ }
+ // next connect the hierarchy
+ for (String languageName : languageNames) {
+ MarkupLanguage markupLanguage = WikiTextPlugin.getDefault().getMarkupLanguage(languageName);
+ if (markupLanguage != null && markupLanguage.getExtendsLanguage() != null) {
+ ValidationRules languageRules = validationRulesByLanguageName.get(languageName);
+ ValidationRules parentLanguageRules = validationRulesByLanguageName.get(markupLanguage.getExtendsLanguage());
+
+ languageRules.setParent(parentLanguageRules);
+ }
+ }
+
+ this.validationRulesByLanguageName = validationRulesByLanguageName;
+ }
+ }
+ }
+
+ private void initializeMarkupLanguages() {
+ synchronized (this) {
+ if (this.languageByName == null) {
+ SortedMap<String, Class<? extends MarkupLanguage>> markupLanguageByName = new TreeMap<String, Class<? extends MarkupLanguage>>();
+ Map<String, Class<? extends MarkupLanguage>> languageByFileExtension = new HashMap<String, Class<? extends MarkupLanguage>>();
+ Map<String, String> languageExtensionByLanguage = new HashMap<String, String>();
+ Map<Class<? extends MarkupLanguage>, String> languageNameByLanguage = new HashMap<Class<? extends MarkupLanguage>, String>();
+
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(getPluginId(),
+ EXTENSION_MARKUP_LANGUAGE);
+ if (extensionPoint != null) {
+ IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
+ for (IConfigurationElement element : configurationElements) {
+ String name = element.getAttribute("name"); //$NON-NLS-1$
+ if (name == null || name.length() == 0) {
+ log(IStatus.ERROR, MessageFormat.format(EXTENSION_MARKUP_LANGUAGE
+ + Messages.getString("WikiTextPlugin.10"), element.getDeclaringExtension() //$NON-NLS-1$
+ .getContributor()
+ .getName()));
+ continue;
+ }
+ String extendsLanguage = element.getAttribute("extends"); //$NON-NLS-1$
+ Object markupLanguage;
+ try {
+ markupLanguage = element.createExecutableExtension("class"); //$NON-NLS-1$
+ } catch (CoreException e) {
+ getLog().log(e.getStatus());
+ continue;
+ }
+ if (!(markupLanguage instanceof MarkupLanguage)) {
+ log(IStatus.ERROR, MessageFormat.format(
+ Messages.getString("WikiTextPlugin.13"), markupLanguage.getClass() //$NON-NLS-1$
+ .getName()));
+ continue;
+ }
+ MarkupLanguage d = (MarkupLanguage) markupLanguage;
+ {
+ Class<? extends MarkupLanguage> previous = markupLanguageByName.put(name, d.getClass());
+ if (previous != null) {
+ log(IStatus.ERROR, MessageFormat.format(EXTENSION_MARKUP_LANGUAGE
+ + Messages.getString("WikiTextPlugin.14"), //$NON-NLS-1$
+ name, element.getDeclaringExtension().getContributor().getName(), name));
+ markupLanguageByName.put(name, previous);
+ continue;
+ } else {
+ languageNameByLanguage.put(d.getClass(), name);
+ }
+ }
+ if (extendsLanguage != null) {
+ languageExtensionByLanguage.put(name, extendsLanguage);
+ }
+ String fileExtensions = element.getAttribute("fileExtensions"); //$NON-NLS-1$
+ if (fileExtensions != null) {
+ String[] parts = fileExtensions.split("\\s*,\\s*"); //$NON-NLS-1$
+ for (String part : parts) {
+ if (part.length() != 0) {
+ Class<? extends MarkupLanguage> previous = languageByFileExtension.put(part,
+ d.getClass());
+ if (previous != null) {
+ log(IStatus.ERROR, MessageFormat.format(EXTENSION_MARKUP_LANGUAGE
+ + Messages.getString("WikiTextPlugin.17"), //$NON-NLS-1$
+ part, element.getDeclaringExtension().getContributor().getName(), part));
+ languageByFileExtension.put(part, previous);
+ continue;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ this.languageByFileExtension = languageByFileExtension;
+ this.languageByName = markupLanguageByName;
+ this.languageExtensionByLanguage = languageExtensionByLanguage;
+ this.languageNameByLanguage = languageNameByLanguage;
+ }
+ }
+ }
+
+ public void log(int severity, String message) {
+ log(severity, message, null);
+ }
+
+ public void log(int severity, String message, Throwable t) {
+ getLog().log(new Status(severity, getPluginId(), message, t));
+ }
+
+ public String getPluginId() {
+ return getBundle().getSymbolicName();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/messages.properties
new file mode 100644
index 0000000..087e506
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/messages.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+WikiTextPlugin.10=/@name must be specified by plugin ''{0}''
+WikiTextPlugin.13={0} is not a markup language
+WikiTextPlugin.14=/@name ''{0}'' specified by plugin ''{1}'' is ignored: name ''{2}'' is already registered
+WikiTextPlugin.17=/@fileExtensions ''{0}'' specified by plugin ''{1}'' is ignored: extension ''{2}'' is already registered
+WikiTextPlugin.2=Cannot instantiate markup language ''{0}'' (class ''{1}''): {2}
+WikiTextPlugin.4=Must specify markupLanguage
+WikiTextPlugin.5=''{0}'' is not a valid markupLanguage
+WikiTextPlugin.7={0} is not a validation rule
+WikiTextPlugin.8=Plugin ''{0}'' extension ''{1}'' invalid: {2}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DefaultSplittingStrategy.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DefaultSplittingStrategy.java
new file mode 100644
index 0000000..8bb9a96
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DefaultSplittingStrategy.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author David Green
+ */
+public class DefaultSplittingStrategy extends SplittingStrategy {
+
+ private int headingCount;
+
+ private int firstHeadingSplit = 2;
+
+ private int headingLevel;
+
+ private int splitLevel = 1;
+
+ private String id;
+
+ private String label;
+
+ private String target;
+
+ private final Set<String> targets = new HashSet<String>();
+
+ @Override
+ public void heading(int level, String id, String label) {
+ if (level <= 0) {
+ return;
+ }
+ this.label = label;
+ this.id = id;
+ this.headingLevel = level;
+ ++headingCount;
+ if (isSplit()) {
+ target = computeSplitTarget();
+ }
+ }
+
+ @Override
+ public String getSplitTarget() {
+ return target;
+ }
+
+ protected String computeSplitTarget() {
+ String candidate = null;
+ if (candidate == null) {
+ if (label != null && label.length() > 0) {
+ candidate = label.replaceAll("[^a-zA-Z0-9]+", "-"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (candidate == null || candidate.length() == 0) {
+ if (id != null) {
+ candidate = id;
+ } else {
+ candidate = "h" + headingLevel + "p" + headingCount; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+ String computedTarget = candidate;
+ int seed = 1;
+ while (!targets.add(computedTarget)) {
+ computedTarget = candidate + (++seed);
+ }
+ return computedTarget + ".html"; //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean isSplit() {
+ return headingCount >= firstHeadingSplit && splitLevel >= headingLevel;
+ }
+
+ public int getFirstHeadingSplit() {
+ return firstHeadingSplit;
+ }
+
+ public void setFirstHeadingSplit(int firstHeadingSplit) {
+ this.firstHeadingSplit = firstHeadingSplit;
+ }
+
+ public int getSplitLevel() {
+ return splitLevel;
+ }
+
+ public void setSplitLevel(int splitLevel) {
+ this.splitLevel = splitLevel;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DitaTopicDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DitaTopicDocumentBuilder.java
new file mode 100644
index 0000000..18967a6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DitaTopicDocumentBuilder.java
@@ -0,0 +1,645 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import java.io.Writer;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.Stack;
+import java.util.logging.Logger;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.builder.AbstractXmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DitaBookMapDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DocBookDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.util.FormattingXMLStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ * A document builder that creates an OASIS DITA topic
+ *
+ * @author David Green
+ *
+ * @see DitaBookMapDocumentBuilder
+ */
+public class DitaTopicDocumentBuilder extends AbstractXmlDocumentBuilder {
+
+ private static final String __TOPIC = "__topic"; //$NON-NLS-1$
+
+ private static Set<Integer> entityReferenceToUnicode = new HashSet<Integer>();
+ static {
+ entityReferenceToUnicode.add(215);
+ entityReferenceToUnicode.add(8211);
+ entityReferenceToUnicode.add(8212);
+ entityReferenceToUnicode.add(8220);
+ entityReferenceToUnicode.add(8221);
+ entityReferenceToUnicode.add(8216);
+ entityReferenceToUnicode.add(8217);
+ }
+
+ private final Stack<BlockDescription> blockDescriptions = new Stack<BlockDescription>();
+
+ private String doctype = "<!DOCTYPE topic PUBLIC \"-//OASIS//DTD DITA 1.1 Topic//EN\" \"http://docs.oasis-open.org/dita/v1.1/OS/dtd/topic.dtd\">"; //$NON-NLS-1$
+
+ private static class TopicInfo {
+ int headingLevel;
+
+ int openElements;
+ }
+
+ private final Stack<TopicInfo> topicInfos = new Stack<TopicInfo>();
+
+ private OutlineItem outline;
+
+ private String filename;
+
+ private int topicBreakLevel = Integer.MAX_VALUE;
+
+ private String rootTitle;
+
+ public DitaTopicDocumentBuilder(Writer out) {
+ super(out);
+ }
+
+ public DitaTopicDocumentBuilder(XmlStreamWriter writer) {
+ super(wrapStreamWriter(writer));
+ }
+
+ @Override
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ XmlStreamWriter writer = super.createXmlStreamWriter(out);
+ return wrapStreamWriter(writer);
+ }
+
+ private static FormattingXMLStreamWriter wrapStreamWriter(XmlStreamWriter writer) {
+ return new FormattingXMLStreamWriter(writer) {
+ @Override
+ protected boolean preserveWhitespace(String elementName) {
+ return elementName.equals("codeblock") || elementName.startsWith("pre"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ };
+ }
+
+ public void setDoctype(String doctype) {
+ this.doctype = doctype;
+ }
+
+ public String getDoctype() {
+ return doctype;
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ ensureOpenTopic();
+ // TODO: definition? according to DITA 1.1 'term' is the right thing to use here, however DITA 1.1 has no provision for a glossary.
+ // we may want to look at reference/refbody/simpletable to generate a glossary
+ writer.writeStartElement("term"); //$NON-NLS-1$
+ characters(text);
+ writer.writeEndElement();
+ }
+
+ private BlockDescription findBlockDescription(BlockType type) {
+ for (int x = blockDescriptions.size() - 1; x >= 0; --x) {
+ BlockDescription blockDescription = blockDescriptions.get(x);
+ if (blockDescription.type == type) {
+ return blockDescription;
+ }
+ }
+ return null;
+ }
+
+ private static class BlockDescription {
+ BlockType type;
+
+ int size;
+
+ int entrySize; // the size of an entry, if it is open, otherwise 0
+
+ @SuppressWarnings("unused")
+ final String[] nestedElementNames;
+
+ final boolean closeElementsOnBlockStart;
+
+ public BlockDescription(BlockType type, int size, String[] nestedElementNames, boolean closeElementsOnBlockStart) {
+ this.size = size;
+ this.entrySize = nestedElementNames == null ? 0 : nestedElementNames.length;
+ this.type = type;
+ this.nestedElementNames = nestedElementNames;
+ this.closeElementsOnBlockStart = closeElementsOnBlockStart;
+ }
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ ensureOpenTopic();
+
+ String elementName;
+ String[] elementNames = null;
+ boolean allowTitle = false;
+ boolean closeElementsOnBlockStart = false;
+ BlockDescription previousBlock = null;
+ if (!blockDescriptions.isEmpty()) {
+ previousBlock = blockDescriptions.peek();
+ }
+ boolean phraseTitle = false;
+
+ switch (type) {
+ case BULLETED_LIST:
+ elementName = "ul"; //$NON-NLS-1$
+ break;
+ case NUMERIC_LIST:
+ elementName = "ol"; //$NON-NLS-1$
+ break;
+ case DEFINITION_LIST:
+ elementName = "dl"; //$NON-NLS-1$
+ break;
+ case DEFINITION_TERM:
+
+ BlockDescription blockDescription = findBlockDescription(BlockType.DEFINITION_LIST);
+ if (blockDescription.entrySize > 0) {
+ endBlockEntry(blockDescription);
+ }
+ openBlockEntry(blockDescription, new String[] { "dlentry" }); //$NON-NLS-1$
+
+ elementName = "dt"; //$NON-NLS-1$
+ break;
+ case DEFINITION_ITEM:
+ elementName = "dd"; //$NON-NLS-1$
+ elementNames = new String[] { "p" }; //$NON-NLS-1$
+ closeElementsOnBlockStart = true;
+ break;
+ case FOOTNOTE:
+ case PARAGRAPH:
+ elementName = "p"; //$NON-NLS-1$
+ break;
+ case CODE:
+ elementName = "codeph"; //$NON-NLS-1$
+ break;
+ case PREFORMATTED:
+ elementName = "pre"; //$NON-NLS-1$
+ break;
+ case QUOTE:
+ elementName = "lq"; //$NON-NLS-1$
+ break;
+ case LIST_ITEM:
+ elementName = "li"; //$NON-NLS-1$
+ elementNames = new String[] { "p" }; //$NON-NLS-1$
+ closeElementsOnBlockStart = true;
+ break;
+ case TABLE:
+ elementName = "simpletable"; //$NON-NLS-1$
+ break;
+ case TABLE_CELL_HEADER:
+ // TODO: no such thing as header cells in DITA, only header rows
+ // need a way to detect beforehand if we're about to emit a header row
+ elementName = "stentry"; //$NON-NLS-1$
+ break;
+ case TABLE_CELL_NORMAL:
+ elementName = "stentry"; //$NON-NLS-1$
+ break;
+ case TABLE_ROW:
+ elementName = "strow"; //$NON-NLS-1$
+ break;
+ case INFORMATION:
+ case NOTE:
+ case WARNING:
+ case TIP:
+ case PANEL:
+ elementName = "note"; //$NON-NLS-1$
+ allowTitle = true;
+ phraseTitle = true;
+ break;
+ case DIV:
+ elementName = null;
+ break;
+ default:
+ throw new IllegalStateException(type.name());
+ }
+
+ int blockSize;
+ if (elementName != null) {
+ blockSize = 1;
+
+ if (previousBlock != null && previousBlock.closeElementsOnBlockStart) {
+ endBlockEntry(previousBlock);
+ }
+ writer.writeStartElement(elementName);
+ switch (type) {
+ case INFORMATION:
+ writer.writeAttribute("type", "important"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case NOTE:
+ writer.writeAttribute("type", "note"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case WARNING:
+ writer.writeAttribute("type", "caution"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case TIP:
+ writer.writeAttribute("type", "tip"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case PANEL:
+ writer.writeAttribute("type", "other"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ }
+ applyAttributes(attributes);
+
+ if (elementNames != null) {
+ for (String name : elementNames) {
+ writer.writeStartElement(name);
+ }
+ }
+
+ if (allowTitle && attributes.getTitle() != null) {
+ if (phraseTitle) {
+ writer.writeStartElement("ph"); //$NON-NLS-1$
+ writer.writeAttribute("outputclass", "title"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeCharacters(attributes.getTitle());
+ writer.writeEndElement();
+ } else {
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ writer.writeCharacters(attributes.getTitle());
+ writer.writeEndElement();
+ }
+ }
+
+ } else {
+ blockSize = 0;
+ }
+ blockDescriptions.push(new BlockDescription(type, blockSize, elementNames, closeElementsOnBlockStart));
+ }
+
+ @Override
+ public void endBlock() {
+ final BlockDescription blockDescription = blockDescriptions.pop();
+ int size = blockDescription.size + blockDescription.entrySize;
+ for (int x = 0; x < size; ++x) {
+ writer.writeEndElement();
+ }
+ }
+
+ private void endBlockEntry(BlockDescription blockDescription) {
+ for (int x = 0; x < blockDescription.entrySize; ++x) {
+ writer.writeEndElement();
+ }
+ blockDescription.entrySize = 0;
+ }
+
+ private void openBlockEntry(BlockDescription blockDescription, String[] entry) {
+ for (String ent : entry) {
+ writer.writeStartElement(ent);
+ }
+ blockDescription.entrySize += entry.length;
+ }
+
+ @Override
+ public void beginDocument() {
+ writer.writeStartDocument();
+ writer.writeDTD(doctype);
+ if (rootTitle != null) {
+ writer.writeStartElement("topic"); //$NON-NLS-1$
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ writer.writeCharacters(rootTitle);
+ writer.writeEndElement();
+ }
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ closeTopics(Math.max(level - 1, 0));
+
+ if (topicInfos.isEmpty() || topicInfos.peek().headingLevel < level) {
+ TopicInfo topicInfo = new TopicInfo();
+ topicInfo.headingLevel = level;
+ topicInfo.openElements = 2;
+
+ topicInfos.push(topicInfo);
+
+ writer.writeStartElement("topic"); //$NON-NLS-1$
+
+ if (attributes != null) {
+ applyAttributes(attributes);
+ attributes = null;
+ }
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ }
+ }
+
+ private void applyAttributes(Attributes attributes) {
+ if (attributes.getId() != null) {
+ writer.writeAttribute("id", attributes.getId()); //$NON-NLS-1$
+ }
+ if (attributes.getCssClass() != null) {
+ writer.writeAttribute("outputclass", attributes.getCssClass()); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ ensureOpenTopic();
+ switch (type) {
+ case BOLD:
+ case STRONG:
+ writer.writeStartElement("b"); //$NON-NLS-1$
+ break;
+ case CITATION:
+ writer.writeStartElement("cite"); //$NON-NLS-1$
+ break;
+ case CODE:
+ writer.writeStartElement("codeph"); //$NON-NLS-1$
+ break;
+ case DELETED:
+ // no equivalent?
+ writer.writeStartElement("ph"); //$NON-NLS-1$
+ attributes.setCssClass(attributes.getCssClass() == null ? "deleted" : attributes.getCssClass() + " deleted"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case EMPHASIS:
+ writer.writeStartElement("i"); //$NON-NLS-1$
+ break;
+ case INSERTED:
+ // no equivalent?
+ writer.writeStartElement("ph"); //$NON-NLS-1$
+ attributes.setCssClass(attributes.getCssClass() == null ? "inserted" : attributes.getCssClass() //$NON-NLS-1$
+ + " inserted"); //$NON-NLS-1$
+ break;
+ case UNDERLINED:
+ writer.writeStartElement("u"); //$NON-NLS-1$
+ break;
+ case ITALIC:
+ writer.writeStartElement("i"); //$NON-NLS-1$
+ break;
+ case SPAN:
+ writer.writeStartElement("ph"); //$NON-NLS-1$
+ break;
+ case SUBSCRIPT:
+ writer.writeStartElement("sub"); //$NON-NLS-1$
+ break;
+ case SUPERSCRIPT:
+ writer.writeStartElement("sup"); //$NON-NLS-1$
+ break;
+ case MONOSPACE:
+ writer.writeStartElement("tt"); //$NON-NLS-1$
+ break;
+ case QUOTE:
+ writer.writeStartElement("q"); //$NON-NLS-1$
+ break;
+ default:
+ Logger.getLogger(DocBookDocumentBuilder.class.getName()).warning("No DITA topic mapping for " + type); //$NON-NLS-1$
+ writer.writeStartElement("ph"); //$NON-NLS-1$
+ break;
+ }
+ applyAttributes(attributes);
+ }
+
+ @Override
+ public void endSpan() {
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ ensureOpenTopic();
+ // note: this *may* have HTML tags in it
+ writer.writeLiteral(literal);
+ }
+
+ private void ensureOpenTopic() {
+ if (topicInfos.isEmpty()) {
+ beginHeading(1, new Attributes());
+ endHeading();
+ }
+ }
+
+ private void closeTopics(int toLevel) {
+ if (toLevel < 0) {
+ toLevel = 0;
+ }
+ while (!topicInfos.isEmpty() && topicInfos.peek().headingLevel > toLevel) {
+ TopicInfo topicInfo = topicInfos.pop();
+ for (int x = 0; x < topicInfo.openElements; ++x) {
+ writer.writeEndElement();
+ }
+ }
+ if (!topicInfos.isEmpty()) {
+ TopicInfo topicInfo = topicInfos.peek();
+ while (topicInfo.openElements > 1) {
+ --topicInfo.openElements;
+ writer.writeEndElement();
+ }
+ }
+ }
+
+ @Override
+ public void endDocument() {
+ closeTopics(0);
+ if (rootTitle != null) {
+ writer.writeEndElement();
+ }
+ writer.writeEndDocument();
+ }
+
+ @Override
+ public void endHeading() {
+ writer.writeEndElement(); // title
+ writer.writeStartElement("body"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ ensureOpenTopic();
+ writer.writeEmptyElement("image"); //$NON-NLS-1$
+ writer.writeAttribute("href", url); //$NON-NLS-1$
+ applyImageAttributes(attributes);
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ ensureOpenTopic();
+ writer.writeStartElement("xref"); //$NON-NLS-1$
+ writer.writeAttribute("href", computeDitaXref(href)); //$NON-NLS-1$
+ writer.writeAttribute("format", "html"); //$NON-NLS-1$ //$NON-NLS-2$
+ image(imageAttributes, imageUrl);
+ writer.writeEndElement();
+ }
+
+ private void applyImageAttributes(Attributes imageAttributes) {
+ applyAttributes(imageAttributes);
+ if (imageAttributes instanceof ImageAttributes) {
+ ImageAttributes attributes = (ImageAttributes) imageAttributes;
+ if (attributes.getAlt() != null) {
+ writer.writeAttribute("alt", attributes.getAlt()); //$NON-NLS-1$
+ }
+ if (attributes.getHeight() > 0) {
+ writer.writeAttribute("height", Integer.toString(attributes.getHeight())); //$NON-NLS-1$
+ }
+ if (attributes.getWidth() > 0) {
+ writer.writeAttribute("width", Integer.toString(attributes.getWidth())); //$NON-NLS-1$
+ }
+ if (attributes.getAlign() != null) {
+ switch (attributes.getAlign()) {
+ case Left:
+ writer.writeAttribute("align", "center"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case Right:
+ writer.writeAttribute("align", "right"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case Center:
+ writer.writeAttribute("align", "center"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ }
+ writer.writeAttribute("placement", "break"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ }
+
+ @Override
+ public void lineBreak() {
+ // no equivalent in DITA?
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ ensureOpenTopic();
+ writer.writeStartElement("xref"); //$NON-NLS-1$
+ writer.writeAttribute("href", computeDitaXref(hrefOrHashName)); //$NON-NLS-1$
+ if (text != null) {
+ characters(text);
+ }
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void characters(String text) {
+ ensureOpenTopic();
+ super.characters(text);
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ ensureOpenTopic();
+ if (entity.startsWith("#")) { //$NON-NLS-1$
+ String numeric = entity.substring(1);
+ int base = 10;
+ if (numeric.startsWith("x")) { //$NON-NLS-1$
+ numeric = entity.substring(1);
+ base = 16;
+ }
+ int unicodeValue = Integer.parseInt(numeric, base);
+ if (entityReferenceToUnicode.contains(unicodeValue)) {
+ writer.writeCharacters("" + ((char) unicodeValue)); //$NON-NLS-1$
+ return;
+ }
+ }
+ writer.writeEntityRef(entity);
+ }
+
+ /**
+ * the outline if available, otherwise null
+ *
+ * {@link #setOutline(OutlineItem)}
+ */
+ public OutlineItem getOutline() {
+ return outline;
+ }
+
+ /**
+ * Set the outline of the document being parsed if xref URLs are to be correctly computed. OASIS DITA has its own
+ * URL syntax for DITA-specific links, which need some translation at the time that we build the document.
+ */
+ public void setOutline(OutlineItem outline) {
+ this.outline = outline;
+ }
+
+ public String getFilename() {
+ return filename;
+ }
+
+ public void setFilename(String filename) {
+ this.filename = filename;
+ }
+
+ /**
+ * According to the DITA documentation, DITA content URLs use special syntax. this method translates internal URLs
+ * correctly according to the DITA rules.
+ *
+ * @return the href adjusted, or the original href if the given URL appears to be to non-document content
+ */
+ private String computeDitaXref(String href) {
+ if (href.startsWith("#") && topicBreakLevel < Integer.MAX_VALUE) { //$NON-NLS-1$
+ if (outline != null) {
+ OutlineItem item = outline.findItemById(href.substring(1));
+ if (item != null) {
+ OutlineItem topicItem = computeTopicFileItem(item);
+ String targetFilename = computeTargetFilename(topicItem);
+ String ref;
+ if (targetFilename.equals(filename)) {
+ ref = href;
+ } else {
+ ref = targetFilename + href;
+ }
+ return ref;
+ }
+ }
+ }
+ return href;
+ }
+
+ public static String computeName(String headingId, String topicFilenameSuffix) {
+ String name = headingId == null ? __TOPIC : headingId.replaceAll("[^a-zA-Z0-9_.-]", "-"); //$NON-NLS-1$ //$NON-NLS-2$
+ name = name + topicFilenameSuffix;
+ return name;
+ }
+
+ private String computeTargetFilename(OutlineItem item) {
+ String filenameSuffix = filename.substring(filename.lastIndexOf('.'));
+ return computeName(item.getLevel() == topicBreakLevel ? item.getId() : null, filenameSuffix);
+ }
+
+ private OutlineItem computeTopicFileItem(OutlineItem item) {
+ while (item.getLevel() > topicBreakLevel && item.getParent() != null
+ && item.getParent().getLevel() > (topicBreakLevel - 1)) {
+ item = item.getParent();
+ }
+ return item;
+ }
+
+ /**
+ * the heading level at which topics are determined
+ */
+ public int getTopicBreakLevel() {
+ return topicBreakLevel;
+ }
+
+ /**
+ * the heading level at which topics are determined
+ */
+ public void setTopicBreakLevel(int topicBreakLevel) {
+ this.topicBreakLevel = topicBreakLevel;
+ }
+
+ /**
+ * The title of the root topic if there should be one. If specified, the topic file is created with a 'wrapper' root
+ * topic with the given title.
+ */
+ public void setRootTopicTitle(String rootTitle) {
+ this.rootTitle = rootTitle;
+ }
+
+ /**
+ * The title of the root topic if there should be one. If specified, the topic file is created with a 'wrapper' root
+ * topic with the given title.
+ */
+ public String getRootTopicTitle() {
+ return rootTitle;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/Messages.java
new file mode 100644
index 0000000..0c0f8ea
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.core.parser.builder.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/NoSplittingStrategy.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/NoSplittingStrategy.java
new file mode 100644
index 0000000..025348c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/NoSplittingStrategy.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+/**
+ * a splitting strategy that causes no splits.
+ *
+ * @author David Green
+ */
+public class NoSplittingStrategy extends SplittingStrategy {
+
+ @Override
+ public String getSplitTarget() {
+ return null;
+ }
+
+ @Override
+ public void heading(int level, String id, String label) {
+ }
+
+ @Override
+ public boolean isSplit() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplitOutlineItem.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplitOutlineItem.java
new file mode 100644
index 0000000..3f9b972
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplitOutlineItem.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+
+/**
+ * @author David Green
+ */
+public class SplitOutlineItem extends OutlineItem {
+
+ private String splitTarget;
+
+ private Map<String, SplitOutlineItem> outlineItemById;
+
+ private List<SplitOutlineItem> pages;
+
+ public SplitOutlineItem(OutlineItem parent, int level, String id, int offset, int length, String label) {
+ super(parent, level, id, offset, length, label);
+ }
+
+ public void setSplitTarget(String splitTarget) {
+ this.splitTarget = splitTarget;
+ }
+
+ public String getSplitTarget() {
+ if (splitTarget == null && getParent() != null) {
+ return getParent().getSplitTarget();
+ }
+ return splitTarget;
+ }
+
+ public List<SplitOutlineItem> getPageOrder() {
+ if (getParent() != null) {
+ return getParent().getPageOrder();
+ }
+ if (pages == null) {
+ final Set<String> pageTargets = new HashSet<String>();
+ pages = new ArrayList<SplitOutlineItem>();
+ accept(new Visitor() {
+ public boolean visit(OutlineItem item) {
+ SplitOutlineItem split = (SplitOutlineItem) item;
+ if (pageTargets.add(split.getSplitTarget())) {
+ pages.add(split);
+ }
+ return true;
+ }
+ });
+ }
+ return pages;
+ }
+
+ @Override
+ public SplitOutlineItem getParent() {
+ return (SplitOutlineItem) super.getParent();
+ }
+
+ /**
+ * get the outline item for a given id
+ *
+ * @param id
+ * the id for which the outline item should be returned
+ *
+ * @return the outline item, or null if the given id is unknown
+ */
+ public SplitOutlineItem getOutlineItemById(String id) {
+ if (getParent() != null) {
+ return getParent().getOutlineItemById(id);
+ }
+ if (outlineItemById == null) {
+ final Map<String, SplitOutlineItem> splitTargetById = new HashMap<String, SplitOutlineItem>();
+ this.accept(new Visitor() {
+ public boolean visit(OutlineItem item) {
+ if (item.getId() != null) {
+ if (splitTargetById.containsKey(item.getId())) {
+ throw new IllegalStateException(String.format("Duplicate id '%s'", item.getId())); //$NON-NLS-1$
+ }
+ splitTargetById.put(item.getId(), (SplitOutlineItem) item);
+ }
+ return true;
+ }
+ });
+ this.outlineItemById = splitTargetById;
+ }
+ return outlineItemById.get(id);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingHtmlDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingHtmlDocumentBuilder.java
new file mode 100644
index 0000000..1ecfe93
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingHtmlDocumentBuilder.java
@@ -0,0 +1,410 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.List;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.LinkAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.Locator;
+import org.eclipse.mylyn.wikitext.core.parser.TableAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableCellAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder.Stylesheet;
+
+/**
+ * @author David Green
+ */
+public class SplittingHtmlDocumentBuilder extends DocumentBuilder {
+
+ private SplitOutlineItem outline;
+
+ private HtmlDocumentBuilder rootBuilder;
+
+ private File rootFile;
+
+ private boolean formatting;
+
+ private HtmlDocumentBuilder out;
+
+ private Writer writer;
+
+ private File currentFile;
+
+ private boolean navigationImages;
+
+ public void setRootBuilder(HtmlDocumentBuilder rootBuilder) {
+ this.rootBuilder = rootBuilder;
+ out = rootBuilder;
+ }
+
+ public HtmlDocumentBuilder getRootBuilder() {
+ return rootBuilder;
+ }
+
+ @Override
+ public void beginDocument() {
+ if (rootBuilder == null || out == null || rootFile == null) {
+ throw new IllegalStateException();
+ }
+ currentFile = rootFile;
+ out.beginDocument();
+ documentHeader();
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ out.acronym(text, definition);
+ }
+
+ public void addCssStylesheet(Stylesheet stylesheet) {
+ out.addCssStylesheet(stylesheet);
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ out.beginBlock(type, attributes);
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ SplitOutlineItem item = outline.getOutlineItemById(attributes.getId());
+ if (item != null && !currentFile.getName().equals(item.getSplitTarget())) {
+ try {
+ documentFooter();
+ out.endDocument();
+ if (writer != null) {
+ writer.close();
+ writer = null;
+ }
+ currentFile = new File(rootFile.getParent(), item.getSplitTarget());
+
+ writer = new OutputStreamWriter(new FileOutputStream(currentFile), "UTF-8"); //$NON-NLS-1$
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer, formatting);
+ rootBuilder.copyConfiguration(builder);
+ if (item.getLabel() != null) {
+ String title = rootBuilder.getTitle();
+ if (title == null) {
+ title = item.getLabel();
+ } else {
+ title += " - " + item.getLabel(); //$NON-NLS-1$
+ }
+ builder.setTitle(title);
+ }
+ out = builder;
+ out.beginDocument();
+
+ documentHeader();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ out.beginHeading(level, attributes);
+ }
+
+ private void documentFooter() {
+ emitNavigation(false);
+ }
+
+ private void emitNavigation(boolean header) {
+
+ String currentName = currentFile.getName();
+ List<SplitOutlineItem> pageOrder = outline.getPageOrder();
+ SplitOutlineItem previous = null;
+ SplitOutlineItem next = null;
+ SplitOutlineItem current = null;
+ boolean foundPage = false;
+ for (SplitOutlineItem page : pageOrder) {
+ if (page.getSplitTarget().equals(currentName)) {
+ foundPage = true;
+ current = page;
+ } else if (!foundPage) {
+ previous = page;
+ } else {
+ next = page;
+ break;
+ }
+ }
+
+ boolean rootPage = rootFile.getName().equals(currentFile.getName());
+
+ if (next == null && previous == null && rootPage) {
+ return;
+ }
+
+ if (!header) {
+ out.charactersUnescaped("<hr/>"); //$NON-NLS-1$
+ }
+
+ TableAttributes tableAttributes = new TableAttributes();
+ tableAttributes.setCssClass("navigation"); //$NON-NLS-1$
+ tableAttributes.setCssStyle("width: 100%;"); //$NON-NLS-1$
+ tableAttributes.setBorder("0"); //$NON-NLS-1$
+ tableAttributes.setSummary("navigation"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE, tableAttributes);
+
+ TableCellAttributes tableCellAttributes;
+ if (header) {
+ // header row, emit title of page
+ out.beginBlock(BlockType.TABLE_ROW, new Attributes());
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("center"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 100%"); //$NON-NLS-1$
+ tableCellAttributes.setColspan("3"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_HEADER, tableCellAttributes);
+ if (rootPage) {
+ out.characters(rootBuilder.getTitle());
+ } else {
+ out.characters(current == null ? "" : current.getLabel()); //$NON-NLS-1$
+ }
+ out.endBlock();
+
+ out.endBlock();
+ }
+
+ // navigation row
+ out.beginBlock(BlockType.TABLE_ROW, new Attributes());
+
+ LinkAttributes linkAttributes;
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("left"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 20%"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_NORMAL, tableCellAttributes);
+ if (previous != null) {
+ linkAttributes = new LinkAttributes();
+ linkAttributes.setTitle(previous.getLabel());
+ if (navigationImages) {
+ ImageAttributes imageAttributes = new ImageAttributes();
+ imageAttributes.setAlt(Messages.getString("SplittingHtmlDocumentBuilder.Previous")); //$NON-NLS-1$
+ out.imageLink(linkAttributes, imageAttributes, previous.getSplitTarget(),
+ Messages.getString("SplittingHtmlDocumentBuilder.Previous_Image")); //$NON-NLS-1$
+ } else {
+ out.link(linkAttributes, previous.getSplitTarget(),
+ Messages.getString("SplittingHtmlDocumentBuilder.Previous")); //$NON-NLS-1$
+ }
+ }
+ out.endBlock();
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("center"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 60%"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_NORMAL, tableCellAttributes);
+ if (!header && !rootPage) {
+ linkAttributes = new LinkAttributes();
+ linkAttributes.setTitle(rootBuilder.getTitle());
+ if (navigationImages) {
+ ImageAttributes imageAttributes = new ImageAttributes();
+ imageAttributes.setAlt(rootBuilder.getTitle());
+ out.imageLink(linkAttributes, imageAttributes, rootFile.getName(),
+ Messages.getString("SplittingHtmlDocumentBuilder.Home_Image")); //$NON-NLS-1$
+ } else {
+ out.link(linkAttributes, rootFile.getName(), Messages.getString("SplittingHtmlDocumentBuilder.Home")); //$NON-NLS-1$
+ }
+ }
+ out.endBlock();
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("right"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 20%"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_NORMAL, tableCellAttributes);
+ if (next != null) {
+ linkAttributes = new LinkAttributes();
+ linkAttributes.setTitle(next.getLabel());
+ if (navigationImages) {
+ ImageAttributes imageAttributes = new ImageAttributes();
+ imageAttributes.setAlt(Messages.getString("SplittingHtmlDocumentBuilder.Next")); //$NON-NLS-1$
+ out.imageLink(linkAttributes, imageAttributes, next.getSplitTarget(),
+ Messages.getString("SplittingHtmlDocumentBuilder.Next_Image")); //$NON-NLS-1$
+ } else {
+ out.link(linkAttributes, next.getSplitTarget(), Messages.getString("SplittingHtmlDocumentBuilder.Next")); //$NON-NLS-1$
+ }
+ }
+ out.endBlock();
+
+ out.endBlock(); // navigation row
+
+ // navigation title row
+ out.beginBlock(BlockType.TABLE_ROW, new Attributes());
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("left"); //$NON-NLS-1$
+ tableCellAttributes.setValign("top"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 20%"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_NORMAL, tableCellAttributes);
+ if (previous != null) {
+ out.characters(previous.getLabel());
+ }
+ out.endBlock();
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("center"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 60%"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_NORMAL, tableCellAttributes);
+
+ out.endBlock();
+
+ tableCellAttributes = new TableCellAttributes();
+ tableCellAttributes.setAlign("right"); //$NON-NLS-1$
+ tableCellAttributes.setValign("top"); //$NON-NLS-1$
+ tableCellAttributes.setCssStyle("width: 20%"); //$NON-NLS-1$
+ out.beginBlock(BlockType.TABLE_CELL_NORMAL, tableCellAttributes);
+ if (next != null) {
+ out.characters(next.getLabel());
+ }
+ out.endBlock();
+
+ out.endBlock(); // navigation title row
+
+ out.endBlock(); // table
+
+ if (header) {
+ out.charactersUnescaped("<hr/>"); //$NON-NLS-1$
+ }
+ }
+
+ private void documentHeader() {
+ emitNavigation(true);
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ out.beginSpan(type, attributes);
+ }
+
+ @Override
+ public void characters(String text) {
+ out.characters(text);
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ out.charactersUnescaped(literal);
+ }
+
+ public void copyConfiguration(HtmlDocumentBuilder other) {
+ out.copyConfiguration(other);
+ }
+
+ @Override
+ public void endBlock() {
+ out.endBlock();
+ }
+
+ @Override
+ public void endDocument() {
+ documentFooter();
+ out.endDocument();
+ if (writer != null) {
+ try {
+ writer.close();
+ } catch (IOException e) {
+ throw new IllegalStateException();
+ }
+ }
+ out = null;
+ }
+
+ @Override
+ public void endHeading() {
+ out.endHeading();
+ }
+
+ @Override
+ public void endSpan() {
+ out.endSpan();
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ out.entityReference(entity);
+ }
+
+ @Override
+ public Locator getLocator() {
+ return out.getLocator();
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ out.image(attributes, url);
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ href = adjustHref(href);
+ out.imageLink(linkAttributes, imageAttributes, href, imageUrl);
+ }
+
+ private String adjustHref(String href) {
+ if (href != null && href.startsWith("#")) { //$NON-NLS-1$
+ SplitOutlineItem target = outline.getOutlineItemById(href.substring(1));
+ if (target != null && target.getSplitTarget() != null) {
+ href = target.getSplitTarget().replace(" ", "%20") + href; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ return href;
+ }
+
+ @Override
+ public void lineBreak() {
+ out.lineBreak();
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ hrefOrHashName = adjustHref(hrefOrHashName);
+ out.link(attributes, hrefOrHashName, text);
+ }
+
+ @Override
+ public void setLocator(Locator locator) {
+ if (out != null) {
+ out.setLocator(locator);
+ }
+ }
+
+ public void setOutline(SplitOutlineItem outline) {
+ this.outline = outline;
+ }
+
+ public SplitOutlineItem getOutline() {
+ return outline;
+ }
+
+ public void setRootFile(File rootFile) {
+ this.rootFile = rootFile;
+ }
+
+ public void setNavigationImages(boolean navigationImages) {
+ this.navigationImages = navigationImages;
+ }
+
+ public boolean isNavigationImages() {
+ return navigationImages;
+ }
+
+ public void setFormatting(boolean formatting) {
+ this.formatting = formatting;
+ }
+
+ public boolean isFormatting() {
+ return formatting;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingMarkupToEclipseToc.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingMarkupToEclipseToc.java
new file mode 100644
index 0000000..1e45ff9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingMarkupToEclipseToc.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToEclipseToc;
+
+/**
+ *
+ * @author David Green
+ */
+public class SplittingMarkupToEclipseToc extends MarkupToEclipseToc {
+ @Override
+ protected String computeFile(OutlineItem item) {
+ if (item instanceof SplitOutlineItem) {
+ String target = ((SplitOutlineItem) item).getSplitTarget();
+ if (target != null) {
+ return target;
+ }
+ }
+ return super.computeFile(item);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingOutlineParser.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingOutlineParser.java
new file mode 100644
index 0000000..ca6c098
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingOutlineParser.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+
+/**
+ * An outline parser that uses the splitting strategy to determine the file of any given outline item.
+ *
+ * @author David Green
+ */
+public class SplittingOutlineParser extends OutlineParser {
+
+ private SplittingStrategy splittingStrategy;
+
+ @Override
+ protected OutlineItem createOutlineItem(OutlineItem current, int level, String id, int offset, int length,
+ String label) {
+ if (splittingStrategy == null) {
+ throw new IllegalStateException();
+ }
+ splittingStrategy.heading(level, id, label);
+ SplitOutlineItem outlineItem = new SplitOutlineItem(current, level, id, offset, length, label);
+ if (splittingStrategy.isSplit()) {
+ outlineItem.setSplitTarget(splittingStrategy.getSplitTarget());
+ }
+ return outlineItem;
+ }
+
+ public SplittingStrategy getSplittingStrategy() {
+ return splittingStrategy;
+ }
+
+ public void setSplittingStrategy(SplittingStrategy splittingStrategy) {
+ this.splittingStrategy = splittingStrategy;
+ }
+
+ @Override
+ public SplitOutlineItem parse(String markup) {
+ SplitOutlineItem rootItem = (SplitOutlineItem) super.parse(markup);
+ if (!rootItem.getChildren().isEmpty()) {
+ SplitOutlineItem firstChild = (SplitOutlineItem) rootItem.getChildren().get(0);
+ if (firstChild.getSplitTarget() == null || firstChild.getSplitTarget().equals(rootItem.getSplitTarget())) {
+ rootItem.setLabel(firstChild.getLabel());
+ } else {
+ rootItem.setLabel(""); //$NON-NLS-1$
+ }
+ }
+ return rootItem;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingStrategy.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingStrategy.java
new file mode 100644
index 0000000..9844105
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/SplittingStrategy.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+/**
+ * A strategy for deciding when to split content into multiple files based on headings.
+ *
+ * @author David Green
+ */
+public abstract class SplittingStrategy {
+
+ public abstract void heading(int level, String id, String label);
+
+ public abstract boolean isSplit();
+
+ public abstract String getSplitTarget();
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/messages.properties
new file mode 100644
index 0000000..ef1df4e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/messages.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+SplittingHtmlDocumentBuilder.Previous=Previous
+SplittingHtmlDocumentBuilder.Previous_Image=images/prev.gif
+SplittingHtmlDocumentBuilder.Home_Image=images/home.gif
+SplittingHtmlDocumentBuilder.Home=Top
+SplittingHtmlDocumentBuilder.Next=Next
+SplittingHtmlDocumentBuilder.Next_Image=images/next.gif
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/EclipseServiceLocator.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/EclipseServiceLocator.java
new file mode 100644
index 0000000..40781b5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/EclipseServiceLocator.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.util;
+
+import java.text.MessageFormat;
+import java.util.TreeSet;
+
+import org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.util.ServiceLocator;
+
+/**
+ * A service locator that uses the {@link WikiTextPlugin} to resolve markup languages
+ *
+ * @author David Green
+ */
+public class EclipseServiceLocator extends ServiceLocator {
+
+ public EclipseServiceLocator(ClassLoader classLoader) {
+ super(classLoader);
+ }
+
+ @Override
+ public MarkupLanguage getMarkupLanguage(String languageName) throws IllegalArgumentException {
+ if (languageName == null) {
+ throw new IllegalArgumentException();
+ }
+ MarkupLanguage markupLanguage = WikiTextPlugin.getDefault().getMarkupLanguage(languageName);
+ if (markupLanguage == null) {
+ try {
+ // dispatch to super in case we've been given a fully qualified class name
+ markupLanguage = super.getMarkupLanguage(languageName);
+ } catch (IllegalArgumentException e) {
+ // specified language not found.
+ // create a useful error message
+ StringBuilder buf = new StringBuilder();
+ for (String name : new TreeSet<String>(WikiTextPlugin.getDefault().getMarkupLanguageNames())) {
+ if (buf.length() != 0) {
+ buf.append(", "); //$NON-NLS-1$
+ }
+ buf.append('\'');
+ buf.append(name);
+ buf.append('\'');
+ }
+ throw new IllegalArgumentException(MessageFormat.format(Messages.getString("EclipseServiceLocator.1"), //$NON-NLS-1$
+ languageName, buf.length() == 0 ? Messages.getString("EclipseServiceLocator.2") //$NON-NLS-1$
+ : MessageFormat.format(Messages.getString("EclipseServiceLocator.3"), buf))); //$NON-NLS-1$
+ }
+ }
+ return markupLanguage;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/Messages.java
new file mode 100644
index 0000000..94178a5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.core.util.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/XML11Char.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/XML11Char.java
new file mode 100644
index 0000000..82cb049
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/XML11Char.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * Change log:
+ *
+ * 07-03-2008 dgreen - changed package, removed name-related functions
+ */
+package org.eclipse.mylyn.internal.wikitext.core.util;
+
+import java.util.Arrays;
+
+/**
+ * This class defines the basic properties of characters in XML 1.1. The data in this class can be used to verify that a
+ * character is a valid XML 1.1 character or if the character is a space, name start, or name character.
+ * <p>
+ * A series of convenience methods are supplied to ease the burden of the developer. Using the character as an index
+ * into the <code>XML11CHARS</code> array and applying the appropriate mask flag (e.g. <code>MASK_VALID</code>), yields
+ * the same results as calling the convenience methods. There is one exception: check the comments for the
+ * <code>isValid</code> method for details.
+ *
+ * @author Glenn Marcy, IBM
+ * @author Andy Clark, IBM
+ * @author Arnaud Le Hors, IBM
+ * @author Neil Graham, IBM
+ * @author Michael Glavassevich, IBM
+ *
+ * @version $Id: XML11Char.java,v 1.2 2008/08/12 23:14:12 spingel Exp $
+ */
+public class XML11Char {
+
+ //
+ // Constants
+ //
+
+ /** Character flags for XML 1.1. */
+ private static final byte XML11CHARS[] = new byte[1 << 16];
+
+ /** XML 1.1 Valid character mask. */
+ public static final int MASK_XML11_VALID = 0x01;
+
+ /** XML 1.1 Space character mask. */
+ public static final int MASK_XML11_SPACE = 0x02;
+
+ /** XML 1.1 Name start character mask. */
+ public static final int MASK_XML11_NAME_START = 0x04;
+
+ /** XML 1.1 Name character mask. */
+ public static final int MASK_XML11_NAME = 0x08;
+
+ /** XML 1.1 control character mask */
+ public static final int MASK_XML11_CONTROL = 0x10;
+
+ /** XML 1.1 content for external entities (valid - "special" chars - control chars) */
+ public static final int MASK_XML11_CONTENT = 0x20;
+
+ /** XML namespaces 1.1 NCNameStart */
+ public static final int MASK_XML11_NCNAME_START = 0x40;
+
+ /** XML namespaces 1.1 NCName */
+ public static final int MASK_XML11_NCNAME = 0x80;
+
+ /** XML 1.1 content for internal entities (valid - "special" chars) */
+ public static final int MASK_XML11_CONTENT_INTERNAL = MASK_XML11_CONTROL | MASK_XML11_CONTENT;
+
+ //
+ // Static initialization
+ //
+
+ static {
+
+ // Initializing the Character Flag Array
+ // Code generated by: XML11CharGenerator.
+
+ Arrays.fill(XML11CHARS, 1, 9, (byte) 17); // Fill 8 of value (byte) 17
+ XML11CHARS[9] = 35;
+ XML11CHARS[10] = 3;
+ Arrays.fill(XML11CHARS, 11, 13, (byte) 17); // Fill 2 of value (byte) 17
+ XML11CHARS[13] = 3;
+ Arrays.fill(XML11CHARS, 14, 32, (byte) 17); // Fill 18 of value (byte) 17
+ XML11CHARS[32] = 35;
+ Arrays.fill(XML11CHARS, 33, 38, (byte) 33); // Fill 5 of value (byte) 33
+ XML11CHARS[38] = 1;
+ Arrays.fill(XML11CHARS, 39, 45, (byte) 33); // Fill 6 of value (byte) 33
+ Arrays.fill(XML11CHARS, 45, 47, (byte) -87); // Fill 2 of value (byte) -87
+ XML11CHARS[47] = 33;
+ Arrays.fill(XML11CHARS, 48, 58, (byte) -87); // Fill 10 of value (byte) -87
+ XML11CHARS[58] = 45;
+ XML11CHARS[59] = 33;
+ XML11CHARS[60] = 1;
+ Arrays.fill(XML11CHARS, 61, 65, (byte) 33); // Fill 4 of value (byte) 33
+ Arrays.fill(XML11CHARS, 65, 91, (byte) -19); // Fill 26 of value (byte) -19
+ Arrays.fill(XML11CHARS, 91, 93, (byte) 33); // Fill 2 of value (byte) 33
+ XML11CHARS[93] = 1;
+ XML11CHARS[94] = 33;
+ XML11CHARS[95] = -19;
+ XML11CHARS[96] = 33;
+ Arrays.fill(XML11CHARS, 97, 123, (byte) -19); // Fill 26 of value (byte) -19
+ Arrays.fill(XML11CHARS, 123, 127, (byte) 33); // Fill 4 of value (byte) 33
+ Arrays.fill(XML11CHARS, 127, 133, (byte) 17); // Fill 6 of value (byte) 17
+ XML11CHARS[133] = 35;
+ Arrays.fill(XML11CHARS, 134, 160, (byte) 17); // Fill 26 of value (byte) 17
+ Arrays.fill(XML11CHARS, 160, 183, (byte) 33); // Fill 23 of value (byte) 33
+ XML11CHARS[183] = -87;
+ Arrays.fill(XML11CHARS, 184, 192, (byte) 33); // Fill 8 of value (byte) 33
+ Arrays.fill(XML11CHARS, 192, 215, (byte) -19); // Fill 23 of value (byte) -19
+ XML11CHARS[215] = 33;
+ Arrays.fill(XML11CHARS, 216, 247, (byte) -19); // Fill 31 of value (byte) -19
+ XML11CHARS[247] = 33;
+ Arrays.fill(XML11CHARS, 248, 768, (byte) -19); // Fill 520 of value (byte) -19
+ Arrays.fill(XML11CHARS, 768, 880, (byte) -87); // Fill 112 of value (byte) -87
+ Arrays.fill(XML11CHARS, 880, 894, (byte) -19); // Fill 14 of value (byte) -19
+ XML11CHARS[894] = 33;
+ Arrays.fill(XML11CHARS, 895, 8192, (byte) -19); // Fill 7297 of value (byte) -19
+ Arrays.fill(XML11CHARS, 8192, 8204, (byte) 33); // Fill 12 of value (byte) 33
+ Arrays.fill(XML11CHARS, 8204, 8206, (byte) -19); // Fill 2 of value (byte) -19
+ Arrays.fill(XML11CHARS, 8206, 8232, (byte) 33); // Fill 26 of value (byte) 33
+ XML11CHARS[8232] = 35;
+ Arrays.fill(XML11CHARS, 8233, 8255, (byte) 33); // Fill 22 of value (byte) 33
+ Arrays.fill(XML11CHARS, 8255, 8257, (byte) -87); // Fill 2 of value (byte) -87
+ Arrays.fill(XML11CHARS, 8257, 8304, (byte) 33); // Fill 47 of value (byte) 33
+ Arrays.fill(XML11CHARS, 8304, 8592, (byte) -19); // Fill 288 of value (byte) -19
+ Arrays.fill(XML11CHARS, 8592, 11264, (byte) 33); // Fill 2672 of value (byte) 33
+ Arrays.fill(XML11CHARS, 11264, 12272, (byte) -19); // Fill 1008 of value (byte) -19
+ Arrays.fill(XML11CHARS, 12272, 12289, (byte) 33); // Fill 17 of value (byte) 33
+ Arrays.fill(XML11CHARS, 12289, 55296, (byte) -19); // Fill 43007 of value (byte) -19
+ Arrays.fill(XML11CHARS, 57344, 63744, (byte) 33); // Fill 6400 of value (byte) 33
+ Arrays.fill(XML11CHARS, 63744, 64976, (byte) -19); // Fill 1232 of value (byte) -19
+ Arrays.fill(XML11CHARS, 64976, 65008, (byte) 33); // Fill 32 of value (byte) 33
+ Arrays.fill(XML11CHARS, 65008, 65534, (byte) -19); // Fill 526 of value (byte) -19
+
+ } // <clinit>()
+
+ //
+ // Public static methods
+ //
+
+ /**
+ * Returns true if the specified character is a space character as amdended in the XML 1.1 specification.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11Space(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_SPACE) != 0);
+ } // isXML11Space(int):boolean
+
+ /**
+ * Returns true if the specified character is valid. This method also checks the surrogate character range from
+ * 0x10000 to 0x10FFFF.
+ * <p>
+ * If the program chooses to apply the mask directly to the <code>XML11CHARS</code> array, then they are responsible
+ * for checking the surrogate character range.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11Valid(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_VALID) != 0) || (0x10000 <= c && c <= 0x10FFFF);
+ } // isXML11Valid(int):boolean
+
+ /**
+ * Returns true if the specified character is invalid.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11Invalid(int c) {
+ return !isXML11Valid(c);
+ } // isXML11Invalid(int):boolean
+
+ /**
+ * Returns true if the specified character is valid and permitted outside of a character reference. That is, this
+ * method will return false for the same set as isXML11Valid, except it also reports false for "control characters".
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11ValidLiteral(int c) {
+ return ((c < 0x10000 && ((XML11CHARS[c] & MASK_XML11_VALID) != 0 && (XML11CHARS[c] & MASK_XML11_CONTROL) == 0)) || (0x10000 <= c && c <= 0x10FFFF));
+ } // isXML11ValidLiteral(int):boolean
+
+ /**
+ * Returns true if the specified character can be considered content in an external parsed entity.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11Content(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT) != 0) || (0x10000 <= c && c <= 0x10FFFF);
+ } // isXML11Content(int):boolean
+
+ /**
+ * Returns true if the specified character can be considered content in an internal parsed entity.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11InternalEntityContent(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT_INTERNAL) != 0) || (0x10000 <= c && c <= 0x10FFFF);
+ } // isXML11InternalEntityContent(int):boolean
+
+ /**
+ * Returns true if the specified character is a valid name start character as defined by production [4] in the XML
+ * 1.1 specification.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11NameStart(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME_START) != 0) || (0x10000 <= c && c < 0xF0000);
+ } // isXML11NameStart(int):boolean
+
+ /**
+ * Returns true if the specified character is a valid name character as defined by production [4a] in the XML 1.1
+ * specification.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11Name(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME) != 0) || (c >= 0x10000 && c < 0xF0000);
+ } // isXML11Name(int):boolean
+
+ /**
+ * Returns true if the specified character is a valid NCName start character as defined by production [4] in
+ * Namespaces in XML 1.1 recommendation.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11NCNameStart(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME_START) != 0) || (0x10000 <= c && c < 0xF0000);
+ } // isXML11NCNameStart(int):boolean
+
+ /**
+ * Returns true if the specified character is a valid NCName character as defined by production [5] in Namespaces in
+ * XML 1.1 recommendation.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11NCName(int c) {
+ return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME) != 0) || (0x10000 <= c && c < 0xF0000);
+ } // isXML11NCName(int):boolean
+
+ /**
+ * Returns whether the given character is a valid high surrogate for a name character. This includes all high
+ * surrogates for characters [0x10000-0xEFFFF]. In other words everything excluding planes 15 and 16.
+ *
+ * @param c
+ * The character to check.
+ */
+ public static boolean isXML11NameHighSurrogate(int c) {
+ return (0xD800 <= c && c <= 0xDB7F);
+ }
+
+} // class XML11Char
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/AnySelector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/AnySelector.java
new file mode 100644
index 0000000..0bd8bf2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/AnySelector.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * A CSS selector that selects any element
+ *
+ * @author David Green
+ */
+public class AnySelector extends Selector {
+
+ @Override
+ public boolean select(ElementInfo info) {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Block.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Block.java
new file mode 100644
index 0000000..fce3927
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Block.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An abstraction for a block of CSS rules
+ *
+ * @author David Green
+ */
+public class Block {
+
+ private final Selector selector;
+
+ private final List<CssRule> rules;
+
+ Block(Selector selector) {
+ this(selector, new ArrayList<CssRule>());
+ }
+
+ Block(Selector selector, List<CssRule> rules) {
+ this.selector = selector;
+ this.rules = rules;
+ }
+
+ public Selector getSelector() {
+ return selector;
+ }
+
+ public List<CssRule> getRules() {
+ return rules;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CompositeSelector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CompositeSelector.java
new file mode 100644
index 0000000..89feef4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CompositeSelector.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.util.List;
+
+/**
+ * A selector that can select based on a set of delegates.
+ *
+ * @author David Green
+ */
+public class CompositeSelector extends Selector {
+
+ private final boolean and;
+
+ private final List<Selector> delegates;
+
+ public CompositeSelector(boolean and, List<Selector> delegates) {
+ this.and = and;
+ this.delegates = delegates;
+ }
+
+ @Override
+ public boolean select(ElementInfo info) {
+ if (and) {
+ for (Selector selector : delegates) {
+ if (!selector.select(info)) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ for (Selector selector : delegates) {
+ if (selector.select(info)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ public boolean isAnd() {
+ return and;
+ }
+
+ public List<Selector> getComponents() {
+ return delegates;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssClassSelector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssClassSelector.java
new file mode 100644
index 0000000..6f2b7ee
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssClassSelector.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * a selector that selects elements based on their having a CSS class
+ *
+ * @author David Green
+ *
+ * @see ElementInfo#hasCssClass(String)
+ */
+public class CssClassSelector extends Selector {
+ private final String cssClass;
+
+ public CssClassSelector(String cssClass) {
+ this.cssClass = cssClass;
+ }
+
+ @Override
+ public boolean select(ElementInfo info) {
+ return info.hasCssClass(cssClass);
+ }
+
+ public String getCssClass() {
+ return cssClass;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParser.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParser.java
new file mode 100644
index 0000000..142f3b3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParser.java
@@ -0,0 +1,257 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * A rudimentary CSS stylesheet parser. Recognizes commonly-used CSS syntax. The result of parsing is a CSS-specific
+ * object model.
+ *
+ * @author David Green
+ *
+ * @see Stylesheet
+ * @see CssRule
+ */
+public class CssParser {
+
+ private static final Pattern CSS_COMMENT_PATTERN = Pattern.compile(
+ "/\\*.*?(\\*/|\\z)", Pattern.MULTILINE | Pattern.DOTALL); //$NON-NLS-1$
+
+ private static Pattern CSS_BLOCK_PATTERN = Pattern.compile(
+ "(?:$|^)([^{]+)\\{([^\\}]*)\\}", Pattern.MULTILINE | Pattern.DOTALL); //$NON-NLS-1$
+
+ static final Pattern CSS_RULE_PATTERN = Pattern.compile(
+ "(?:^|\\s?)([\\w-]+)\\s*:\\s*([^;]+)(;|$)", Pattern.MULTILINE //$NON-NLS-1$
+ | Pattern.DOTALL);
+
+ private static final String elemNamePatternPart = "(\\*|[a-zA-Z][a-zA-Z0-9]*)"; // capture 1 '*' or name //$NON-NLS-1$
+
+ private static final String elemQualifierPatternPart = "(?:(\\.|\\#)([a-zA-Z0-9]+))"; // capture 1 '.' or '#' capture 2 class/id //$NON-NLS-1$
+
+ private static final String elemPseudoClassPatternPart = "(?:\\:([a-zA-Z]+))"; // capture 1 pseudoClass without ':' prefix //$NON-NLS-1$
+
+ private static final String fullElementPatternPart = "(?:(?:" + elemNamePatternPart + "|" + elemQualifierPatternPart + "|" + elemPseudoClassPatternPart + "){1,3})"; // 4 capturing groups //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+
+ private static Pattern CSS_SELECTOR_PATTERN = Pattern.compile(fullElementPatternPart + // first element name selector
+ "(?:\\s*?" + // optional join part //$NON-NLS-1$
+ "(\\s|\\>|\\+)" + // join clause //$NON-NLS-1$
+ "\\s*" + //$NON-NLS-1$
+ fullElementPatternPart + // second element name selector
+ ")?" //$NON-NLS-1$
+ );
+
+ private class CssRuleIterator implements Iterator<CssRule> {
+ private final Matcher matcher;
+
+ private boolean hasNext;
+
+ private final int blockOffset;
+
+ public CssRuleIterator(String cssStyles, int blockOffset) {
+ this.blockOffset = blockOffset;
+ matcher = CSS_RULE_PATTERN.matcher(cssStyles);
+ hasNext = matcher.find();
+ }
+
+ public boolean hasNext() {
+ return hasNext;
+ }
+
+ public CssRule next() {
+ if (!hasNext) {
+ throw new NoSuchElementException();
+ }
+ int offset = matcher.start();
+ int length = matcher.end() - offset;
+ String ruleName = matcher.group(1);
+ int nameOffset = matcher.start(1);
+ String ruleValue = matcher.group(2).trim();
+ int valueOffset = matcher.start(2);
+ hasNext = matcher.find();
+ return new CssRule(ruleName, ruleValue, offset + blockOffset, length, nameOffset + blockOffset, valueOffset
+ + blockOffset);
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /**
+ * parse the contents of a CSS block
+ *
+ * @param content
+ * the content of the block
+ *
+ * @return a list of rules, or an empty list if there are none
+ */
+ public List<CssRule> parseBlockContent(String content) {
+ return parseBlock(content, 0);
+ }
+
+ /**
+ * parse the contents of a CSS block and return the result as an iterator of rules
+ *
+ * @param content
+ * @return
+ */
+ public Iterator<CssRule> createRuleIterator(String content) {
+ return createRuleIterator(content, 0);
+ }
+
+ public Stylesheet parse(Reader reader) {
+ try {
+ int i;
+ reader = new BufferedReader(reader);
+ StringWriter writer = new StringWriter();
+ while ((i = reader.read()) != -1) {
+ writer.write(i);
+ }
+ return parse(writer.toString());
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ public Stylesheet parse(String cssContent) {
+ Stylesheet stylesheet = new Stylesheet();
+
+ SparseCharSequence charSequence = new SparseCharSequence(cssContent, CSS_COMMENT_PATTERN);
+ Matcher matcher = CSS_BLOCK_PATTERN.matcher(charSequence);
+ while (matcher.find()) {
+ String selectorText = matcher.group(1);
+ String blockContent = matcher.group(2);
+ if (selectorText != null && blockContent != null) {
+ Selector selector = parseSelector(selectorText);
+ if (selector != null) {
+ int offset = matcher.start(2);
+ offset = charSequence.originalOffsetOf(offset);
+ List<CssRule> rules = parseBlock(blockContent, offset);
+ Block block = new Block(selector, rules);
+ stylesheet.add(block);
+ }
+ }
+ }
+ return stylesheet;
+ }
+
+ private List<CssRule> parseBlock(String content, int blockOffset) {
+ List<CssRule> rules = new ArrayList<CssRule>();
+ Iterator<CssRule> it = createRuleIterator(content, blockOffset);
+ while (it.hasNext()) {
+ rules.add(it.next());
+ }
+ return rules;
+ }
+
+ private Iterator<CssRule> createRuleIterator(String content, int blockOffset) {
+ return new CssRuleIterator(content, blockOffset);
+ }
+
+ /**
+ * <em>NOT API</em> public for testing purposes only
+ */
+ public Selector parseSelector(String selectorText) {
+ String[] cssSelectorParts = selectorText.split(","); //$NON-NLS-1$
+
+ List<Selector> parts = new ArrayList<Selector>();
+
+ for (String part : cssSelectorParts) {
+ Selector selector = parseSelectorPart(part);
+ if (selector != null) {
+ parts.add(selector);
+ }
+ }
+ if (parts.isEmpty()) {
+ return null;
+ }
+ if (parts.size() == 1) {
+ return parts.get(0);
+ }
+ return new CompositeSelector(false, parts);
+ }
+
+ private Selector parseSelectorPart(String part) {
+ List<Selector> parts = new ArrayList<Selector>();
+
+ Matcher matcher = CSS_SELECTOR_PATTERN.matcher(part);
+ while (matcher.find()) {
+ String elemSelector = matcher.group(1);
+ String elemSelectorQualifierType = matcher.group(2);
+ String elemSelectorQualifier = matcher.group(3);
+ String elemSelectorPseudoClass = matcher.group(4);
+ String join = matcher.group(5);
+ String elemSelector2 = matcher.group(6);
+ String elemSelector2QualifierType = matcher.group(7);
+ String elemSelector2Qualifier = matcher.group(8);
+ String elemSelector2PseudoClass = matcher.group(9);
+
+ if (elemSelectorPseudoClass != null || elemSelector2PseudoClass != null) {
+ continue; // not supported
+ }
+
+ Selector firstElementSelector = buildElementSelector(elemSelector, elemSelectorQualifierType,
+ elemSelectorQualifier, elemSelectorPseudoClass);
+ if (join != null && elemSelector2 != null) {
+ if (join.trim().length() == 0) {
+ // first must be ancestor of second
+ parts.add(new DescendantSelector(firstElementSelector));
+ parts.add(buildElementSelector(elemSelector2, elemSelector2QualifierType, elemSelector2Qualifier,
+ elemSelector2PseudoClass));
+ } else {
+ // not yet supported!!
+ }
+ } else {
+ parts.add(firstElementSelector);
+ }
+
+ }
+ if (parts.isEmpty()) {
+ return null;
+ }
+ if (parts.size() == 1) {
+ return parts.get(0);
+ }
+ return new CompositeSelector(true, parts);
+ }
+
+ private Selector buildElementSelector(String elemSelector, String elemSelectorQualifierType,
+ String elemSelectorQualifier, String elemSelectorPseudoClass) {
+ List<Selector> parts = new ArrayList<Selector>();
+ if (elemSelector != null) {
+ if ("*".equals(elemSelector)) { //$NON-NLS-1$
+ parts.add(new AnySelector());
+ } else {
+ parts.add(new NameSelector(elemSelector));
+ }
+ }
+ if (elemSelectorQualifierType != null && elemSelectorQualifier != null) {
+ if (".".equals(elemSelectorQualifierType)) { //$NON-NLS-1$
+ parts.add(new CssClassSelector(elemSelectorQualifier));
+ } else if ("#".equals(elemSelectorQualifierType)) { //$NON-NLS-1$
+ parts.add(new IdSelector(elemSelectorQualifier));
+ }
+ }
+ return parts.size() == 1 ? parts.get(0) : new CompositeSelector(true, parts);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssRule.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssRule.java
new file mode 100644
index 0000000..8398160
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssRule.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * A rule (name and value) as defined by CSS
+ *
+ * @author David Green
+ */
+public class CssRule {
+ /**
+ * the name of the rule
+ */
+ public final String name;
+
+ /**
+ * the value of the rule
+ */
+ public final String value;
+
+ /**
+ * the offset at which the rule was declared
+ */
+ public final int offset;
+
+ /**
+ * the length of the rule declaration
+ */
+ public final int length;
+
+ /**
+ * the offset of the name of the rule
+ */
+ public final int nameOffset;
+
+ /**
+ * the offset of the value of the rule
+ */
+ public final int valueOffset;
+
+ public CssRule(String name, String value, int offset, int length, int nameOffset, int valueOffset) {
+ this.name = name;
+ this.value = value;
+ this.offset = offset;
+ this.length = length;
+ this.nameOffset = nameOffset;
+ this.valueOffset = valueOffset;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/DescendantSelector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/DescendantSelector.java
new file mode 100644
index 0000000..ec267e9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/DescendantSelector.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ *
+ * @author David Green
+ */
+public class DescendantSelector extends Selector {
+
+ private final Selector ancestorSelector;
+
+ public DescendantSelector(Selector ancestorSelector) {
+ super();
+ this.ancestorSelector = ancestorSelector;
+ }
+
+ @Override
+ public boolean select(ElementInfo info) {
+ ElementInfo ancestor = info.getParent();
+ while (ancestor != null) {
+ if (ancestorSelector.select(ancestor)) {
+ return true;
+ }
+ ancestor = ancestor.getParent();
+ }
+ return false;
+ }
+
+ public Selector getAncestorSelector() {
+ return ancestorSelector;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/ElementInfo.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/ElementInfo.java
new file mode 100644
index 0000000..df5e7fb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/ElementInfo.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * An interface to XML element information
+ *
+ * @author David Green
+ */
+public interface ElementInfo {
+ /**
+ * get the local name of the element
+ */
+ public String getLocalName();
+
+ /**
+ * get the parent of this element
+ *
+ * @return the parent or null if this is the root element
+ */
+ public ElementInfo getParent();
+
+ /**
+ * indicate if the elemet has the given CSS class
+ */
+ public boolean hasCssClass(String cssClass);
+
+ /**
+ * indicate if the element has the given id
+ */
+ public boolean hasId(String id);
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/IdSelector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/IdSelector.java
new file mode 100644
index 0000000..19ee997
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/IdSelector.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * A selector that selects elements having an id equal to a specific value.
+ *
+ * @author David Green
+ */
+public class IdSelector extends Selector {
+
+ private final String id;
+
+ public IdSelector(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean select(ElementInfo info) {
+ return info.hasId(id);
+ }
+
+ public String getId() {
+ return id;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/NameSelector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/NameSelector.java
new file mode 100644
index 0000000..bfa75ae
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/NameSelector.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * a selector that selects elements based on their {@link ElementInfo#getLocalName() name}
+ *
+ * @author David Green
+ */
+public class NameSelector extends Selector {
+ private final String name;
+
+ public NameSelector(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean select(ElementInfo info) {
+ return name.equalsIgnoreCase(info.getLocalName());
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Selector.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Selector.java
new file mode 100644
index 0000000..44286e2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Selector.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+/**
+ * An abstraction for a CSS selector.
+ *
+ * @author David Green
+ */
+public abstract class Selector {
+
+ public abstract boolean select(ElementInfo info);
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/SparseCharSequence.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/SparseCharSequence.java
new file mode 100644
index 0000000..f176e8c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/SparseCharSequence.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author David Green
+ */
+public class SparseCharSequence implements CharSequence {
+
+ private final CharSequence data;
+
+ private final Segment[] segments;
+
+ private final int length;
+
+ public SparseCharSequence(CharSequence data, Pattern excludePattern) {
+ this.data = data;
+ List<Segment> segments = new ArrayList<Segment>(5);
+ Segment segment = new Segment(0, 0);
+ Matcher matcher = excludePattern.matcher(data);
+ while (matcher.find()) {
+ segment.length = matcher.start() - segment.offset;
+ segments.add(segment);
+ int end = matcher.end();
+ if (end == data.length()) {
+ segment = null;
+ break;
+ } else {
+ segment = new Segment(end, segment.zeroBase + segment.length);
+ }
+ }
+ if (segment != null) {
+ segment.length = data.length() - segment.offset;
+ segments.add(segment);
+ }
+ // remove 0-length segments
+ if (segments.size() > 1) {
+ Iterator<Segment> it = segments.iterator();
+ while (it.hasNext() && segments.size() > 1) {
+ segment = it.next();
+ if (segment.length == 0) {
+ it.remove();
+ }
+ }
+ }
+ this.segments = segments.toArray(new Segment[segments.size()]);
+ Segment lastSegment = this.segments[this.segments.length - 1];
+ length = lastSegment.zeroBase + lastSegment.length;
+ }
+
+ public int originalOffsetOf(int index) {
+ if (index < 0 || index >= length()) {
+ throw new IndexOutOfBoundsException(String.format("%s is not within [0,%s)", index, length())); //$NON-NLS-1$
+ }
+ Segment segment = segmentOf(index);
+ return segment.offset + (index - segment.zeroBase);
+ }
+
+ public char charAt(int index) {
+ if (index < 0 || index >= length()) {
+ throw new IndexOutOfBoundsException(String.format("%s is not within [0,%s)", index, length())); //$NON-NLS-1$
+ }
+ Segment segment = segmentOf(index);
+ return data.charAt(segment.offset + (index - segment.zeroBase));
+ }
+
+ private Segment segmentOf(int index) {
+ if (index == 0) {
+ return segments[0];
+ }
+ Segment candidate = segments[0];
+ for (int x = 1; x < segments.length; ++x) {
+ if (segments[x].zeroBase > index) {
+ break;
+ }
+ candidate = segments[x];
+ }
+ return candidate;
+ }
+
+ public int length() {
+ return length;
+ }
+
+ public CharSequence subSequence(int start, int end) {
+ if (start < 0 || start >= length || end > length) {
+ throw new IndexOutOfBoundsException(String.format("[%s,%s) is not within range [0,%s)", start, end, length)); //$NON-NLS-1$
+ }
+ int rangeLength = end - start;
+ if (rangeLength == 0) {
+ return ""; //$NON-NLS-1$
+ }
+ int remainingLength = rangeLength;
+ String sequence = null;
+ for (Segment segment = segmentOf(start); remainingLength > 0; segment = segmentOf(end - remainingLength)) {
+ int segmentOffset = start - segment.zeroBase;
+ int segmentEnd = Math.min(end - segment.zeroBase, segment.length);
+ CharSequence part = data.subSequence(segment.offset + segmentOffset, segment.offset + segmentEnd);
+ if (sequence == null) {
+ sequence = part.toString();
+ } else {
+ sequence += part;
+ }
+ remainingLength -= part.length();
+ start += part.length();
+ }
+ return sequence;
+ }
+
+ private static class Segment {
+ public Segment(int offset, int zeroBase) {
+ this.offset = offset;
+ this.zeroBase = zeroBase;
+ }
+
+ int offset, length;
+
+ int zeroBase;
+ }
+
+ @Override
+ public String toString() {
+ return subSequence(0, length).toString();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Stylesheet.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Stylesheet.java
new file mode 100644
index 0000000..4cf5f8c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/css/Stylesheet.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * An abstraction for a CSS stylesheet.
+ *
+ * @author David Green
+ */
+public class Stylesheet {
+ private final List<Block> blocks = new ArrayList<Block>();
+
+ public List<Block> getBlocks() {
+ return Collections.unmodifiableList(blocks);
+ }
+
+ public interface Receiver {
+
+ public void apply(CssRule rule);
+
+ }
+
+ public void applyTo(ElementInfo context, Receiver receiver) {
+ for (Block block : blocks) {
+ if (block.getSelector().select(context)) {
+ for (CssRule rule : block.getRules()) {
+ receiver.apply(rule);
+ }
+ }
+ }
+ }
+
+ void add(Block block) {
+ blocks.add(block);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/messages.properties
new file mode 100644
index 0000000..2d619e5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/util/messages.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+EclipseServiceLocator.1=No parser available for markup language ''{0}''. {1}
+EclipseServiceLocator.2=There are no parsers available. Check your eclipse configuration.
+EclipseServiceLocator.3=Known markup languages are {0}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/validation/StandaloneMarkupValidator.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/validation/StandaloneMarkupValidator.java
new file mode 100644
index 0000000..75eb4c6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/validation/StandaloneMarkupValidator.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.validation;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+/**
+ * Validate markup given a set of rules (stand-alone, outside of an Eclipse environment)
+ *
+ * @author David Green
+ */
+public class StandaloneMarkupValidator {
+
+ private static Map<ClassLoader, Map<String, StandaloneMarkupValidator>> validatorCacheByClassLoader = new WeakHashMap<ClassLoader, Map<String, StandaloneMarkupValidator>>();
+
+ private List<ValidationRule> rules = new ArrayList<ValidationRule>();
+
+ private ClassLoader classLoader;
+
+ private boolean immutable;
+
+ /**
+ * Get the default validator for the specified markup language. Validators that are returned by this method are
+ * immutable and thread-safe
+ *
+ * @param markupLanguage
+ * the markup language for which a validator is desired
+ *
+ * @return the validator
+ */
+ public static StandaloneMarkupValidator getValidator(String markupLanguage) {
+ // For correctness we cache validators by class loader. This is necessary for usage
+ // in a container where the calling class loader could affect the rules that are loaded.
+ // Also we use a weak hash map so that class loaders can be GC'd
+ ClassLoader classLoader = computeClassLoader();
+ synchronized (StandaloneMarkupValidator.class) {
+ Map<String, StandaloneMarkupValidator> validatorByMarkupLanguage = validatorCacheByClassLoader.get(classLoader);
+ if (validatorByMarkupLanguage == null) {
+ validatorByMarkupLanguage = new HashMap<String, StandaloneMarkupValidator>();
+ validatorCacheByClassLoader.put(classLoader, validatorByMarkupLanguage);
+ }
+ StandaloneMarkupValidator validator = validatorByMarkupLanguage.get(markupLanguage);
+ if (validator == null) {
+ validator = new StandaloneMarkupValidator();
+ validator.computeRules(markupLanguage);
+ validator.setImmutable();
+ validatorByMarkupLanguage.put(markupLanguage, validator);
+ }
+ return validator;
+ }
+ }
+
+ private static ClassLoader computeClassLoader() {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ if (contextClassLoader != null) {
+ return contextClassLoader;
+ }
+ return StandaloneMarkupValidator.class.getClassLoader();
+ }
+
+ private void setImmutable() {
+ if (!immutable) {
+ this.immutable = true;
+ rules = Collections.unmodifiableList(rules);
+ }
+ }
+
+ public List<ValidationProblem> validate(String markup) {
+ return validate(markup, 0, markup.length());
+ }
+
+ public List<ValidationProblem> validate(String markup, int offset, int length) {
+ if (length == 0 || rules.isEmpty()) {
+ return Collections.emptyList();
+ }
+ int end = offset + length;
+ if (end > markup.length()) {
+ end = markup.length();
+ }
+ List<ValidationProblem> problems = new ArrayList<ValidationProblem>();
+
+ for (ValidationRule rule : rules) {
+ problems.addAll(rule.findProblems(markup, offset, length));
+ }
+ if (!problems.isEmpty()) {
+ Collections.sort(problems);
+ }
+ return problems;
+ }
+
+ public List<ValidationRule> getRules() {
+ return rules;
+ }
+
+ /**
+ * Compute rules for a markup language based on looking them up in the available plugin.xml files
+ *
+ * @param markupLanguage
+ */
+ public void computeRules(String markupLanguage) {
+ // NOTE: we load plugin.xml files here directly since we assume that we're not running in an Eclipse (OSGi) container.
+ try {
+ Enumeration<URL> resources = getClassLoader().getResources("plugin.xml"); //$NON-NLS-1$
+ while (resources.hasMoreElements()) {
+ URL url = resources.nextElement();
+ computeRules(markupLanguage, url);
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ /**
+ * compute rules for the specified markup language given an URL to a plugin.xml
+ *
+ * @param markupLanguage
+ * the markup language for which rules should be loaded
+ * @param url
+ * the URL to the plugin.xml that specifies the rules
+ */
+ public void computeRules(String markupLanguage, URL url) {
+ try {
+ InputStream in = url.openStream();
+ try {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+ Document pluginXml = dbf.newDocumentBuilder().parse(in);
+
+ computeRules(markupLanguage, pluginXml);
+ } catch (SecurityException e) {
+ // ignore, we can get this during unit testing. It can happen due to a digest mismatch for resources in a jar file.
+ Logger.getLogger(StandaloneMarkupValidator.class.getName()).log(Level.WARNING,
+ String.format("Ignoring plugin.xml due to security exception: %s", url), e); //$NON-NLS-1$
+ } catch (SAXException e) {
+ throw new IllegalStateException(String.format("Cannot parse file %s", url), e); //$NON-NLS-1$
+ } catch (ParserConfigurationException e) {
+ throw new IllegalStateException(e);
+ } finally {
+ in.close();
+ }
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+
+ void computeRules(String markupLanguage, Document pluginXml) {
+ for (Node child = pluginXml.getDocumentElement().getFirstChild(); child != null; child = child.getNextSibling()) {
+ if (child.getNodeType() == Node.ELEMENT_NODE && child.getLocalName().equals("extension")) { //$NON-NLS-1$
+ Element element = (Element) child;
+ String point = element.getAttribute("point"); //$NON-NLS-1$
+ if ("org.eclipse.mylyn.wikitext.core.markupValidationRule".equals(point)) { //$NON-NLS-1$
+ for (Node vrNode = child.getFirstChild(); vrNode != null; vrNode = vrNode.getNextSibling()) {
+ if (vrNode.getNodeType() == Node.ELEMENT_NODE && vrNode.getLocalName().equals("rule")) { //$NON-NLS-1$
+ Element rule = (Element) vrNode;
+ if (markupLanguage.equals(rule.getAttribute("markupLanguage"))) { //$NON-NLS-1$
+ String className = rule.getAttribute("class"); //$NON-NLS-1$
+ try {
+ Class<?> validationRuleClass = Class.forName(className, true, getClassLoader());
+ rules.add((ValidationRule) validationRuleClass.newInstance());
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private ClassLoader getClassLoader() {
+ if (classLoader != null) {
+ return classLoader;
+ }
+ return computeClassLoader();
+ }
+
+ /**
+ * for testing purposes, set the class loader to use when loading validation rules
+ */
+ public void setClassLoader(ClassLoader classLoader) {
+ if (immutable) {
+ throw new IllegalStateException();
+ }
+ this.classLoader = classLoader;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/validation/ValidationRules.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/validation/ValidationRules.java
new file mode 100644
index 0000000..31d5f57
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/internal/wikitext/core/validation/ValidationRules.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.validation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+
+/**
+ * A collection of validation rules, which involves a hierarchy so that language inheritance behaviour can be supported.
+ *
+ * @author David Green
+ */
+public class ValidationRules {
+ private ValidationRules parent;
+
+ private final List<ValidationRule> rules = new ArrayList<ValidationRule>();
+
+ public void addValidationRule(ValidationRule rule) {
+ rules.add(rule);
+ }
+
+ /**
+ * get all of the validation rules, including those defined by any {@link #getParent() parent} collections.
+ */
+ public List<ValidationRule> getRules() {
+ if (parent != null) {
+ List<ValidationRule> parentRules = parent.getRules();
+ if (rules.isEmpty()) {
+ return parentRules;
+ } else if (parentRules.isEmpty()) {
+ return Collections.unmodifiableList(rules);
+ }
+ List<ValidationRule> combined = new ArrayList<ValidationRule>(rules.size() + parentRules.size());
+ combined.addAll(parentRules);
+ combined.addAll(rules);
+ return Collections.unmodifiableList(combined);
+ }
+ return Collections.unmodifiableList(rules);
+ }
+
+ public ValidationRules getParent() {
+ return parent;
+ }
+
+ public void setParent(ValidationRules parent) {
+ this.parent = parent;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/WikiText.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/WikiText.java
new file mode 100644
index 0000000..3ec8026
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/WikiText.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.util.ServiceLocator;
+import org.eclipse.mylyn.wikitext.core.validation.MarkupValidator;
+
+/**
+ * A utility class for accessing markup languages and validation. Use only in an Eclipse runtime environment. Programs
+ * should use the {@link ServiceLocator} instead of this class if possible. Stand-alone programs (that is, those
+ * programs that do not run in an Eclipse runtime) must not use this class.
+ *
+ * @see ServiceLocator
+ *
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @author David Green
+ * @since 1.0
+ */
+public class WikiText {
+ /**
+ * the {@link IContentType#getId() content type id} of wikitext files.
+ */
+ public static final String CONTENT_TYPE = "org.eclipse.mylyn.wikitext"; //$NON-NLS-1$
+
+ private WikiText() { // prevent instantiation and subclassing
+ }
+
+ /**
+ * Get the file extensions that are registered for markup languages. File extensions are specified without the
+ * leading dot.
+ */
+ public static Set<String> getMarkupFileExtensions() {
+ return WikiTextPlugin.getDefault().getMarkupFileExtensions();
+ }
+
+ /**
+ * Get a markup language by name.
+ *
+ * @param name
+ * the name of the markup language to retrieve
+ *
+ * @return the markup language or null if there is no markup language known by the given name
+ *
+ * @see #getMarkupLanguageNames()
+ */
+ public static MarkupLanguage getMarkupLanguage(String name) {
+ return WikiTextPlugin.getDefault().getMarkupLanguage(name);
+ }
+
+ /**
+ * Get a markup language for a file. A markup language is selected based on the registered languages and their
+ * expected file extensions.
+ *
+ * @param name
+ * the name of the file for which a markup language is desired
+ *
+ * @return the markup language, or null if no markup language is registered for the specified file name
+ *
+ * @see #getMarkupLanguageForFilename(String)
+ */
+ public static MarkupLanguage getMarkupLanguageForFilename(String name) {
+ return WikiTextPlugin.getDefault().getMarkupLanguageForFilename(name);
+ }
+
+ /**
+ * Get a markup language name for a file. A markup language is selected based on the registered languages and their
+ * expected file extensions.
+ *
+ * @param name
+ * the name of the file for which a markup language is desired
+ *
+ * @return the markup language name, or null if no markup language is registered for the specified file name
+ *
+ * @see #getMarkupLanguageForFilename(String)
+ */
+ public static String getMarkupLanguageNameForFilename(String name) {
+ return WikiTextPlugin.getDefault().getMarkupLanguageNameForFilename(name);
+ }
+
+ /**
+ * Get the names of all known markup languages
+ *
+ * @see #getMarkupLanguage(String)
+ */
+ public static Set<String> getMarkupLanguageNames() {
+ return WikiTextPlugin.getDefault().getMarkupLanguageNames();
+ }
+
+ /**
+ * Get a markup validator by language name.
+ *
+ * @param name
+ * the name of the markup language for which a validator is desired
+ *
+ * @return the markup validator
+ *
+ * @see #getMarkupLanguageNames()
+ */
+ public static MarkupValidator getMarkupValidator(String name) {
+ return WikiTextPlugin.getDefault().getMarkupValidator(name);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/package-info.java
new file mode 100644
index 0000000..426c5da
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * the root package of the Mylyn WikiText framework
+ */
+package org.eclipse.mylyn.wikitext.core;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/Attributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/Attributes.java
new file mode 100644
index 0000000..eada4a8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/Attributes.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ * Attributes for a markup element. Note that though there are many specialized subclasses of this class, they are
+ * optional.
+ *
+ * @see DocumentBuilder
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class Attributes {
+
+ private String cssClass;
+
+ private String id;
+
+ private String cssStyle;
+
+ private String language;
+
+ private String title;
+
+ public Attributes() {
+ }
+
+ public Attributes(String id, String cssClass, String cssStyle, String language) {
+ this.id = id;
+ this.cssClass = cssClass;
+ this.cssStyle = cssStyle;
+ this.language = language;
+ }
+
+ public String getCssClass() {
+ return cssClass;
+ }
+
+ public void setCssClass(String cssClass) {
+ this.cssClass = cssClass;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getCssStyle() {
+ return cssStyle;
+ }
+
+ public void setCssStyle(String cssStyle) {
+ this.cssStyle = cssStyle;
+ }
+
+ public String getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/DocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/DocumentBuilder.java
new file mode 100644
index 0000000..c4c1ab9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/DocumentBuilder.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ * The 'Builder' design pattern, for documents. Implementations can build a specific kind of document (such as HTML, or
+ * DocBook).
+ * <p>
+ * Note that many methods take {@link Attributes} to specify attributes of the element, however most of these methods
+ * may take a more specific subclass of {@link Attributes}.
+ * </p>
+ *
+ *
+ * @author David Green
+ *
+ */
+public abstract class DocumentBuilder {
+
+ protected Locator locator;
+
+ public enum BlockType {
+ PARAGRAPH,
+ /**
+ * A text box that contains a helpful tip
+ */
+ TIP,
+ /**
+ * A text box that contains a warning
+ */
+ WARNING,
+ /**
+ * A text box that contains information
+ */
+ INFORMATION,
+ /**
+ * A text box that contains a note
+ */
+ NOTE,
+ /**
+ * A text box
+ */
+ PANEL,
+ /**
+ * a content delimiter with no meaning
+ *
+ * @since 1.1
+ */
+ DIV, FOOTNOTE, QUOTE, CODE, PREFORMATTED, NUMERIC_LIST, BULLETED_LIST, LIST_ITEM, TABLE, TABLE_ROW, TABLE_CELL_HEADER, TABLE_CELL_NORMAL, DEFINITION_LIST, DEFINITION_TERM, DEFINITION_ITEM;
+
+ }
+
+ public enum SpanType {
+ EMPHASIS, STRONG, ITALIC, BOLD, CITATION, DELETED, INSERTED, SUPERSCRIPT, SUBSCRIPT, SPAN, CODE, MONOSPACE, UNDERLINED,
+ /**
+ * a short inline quotation
+ *
+ * @since 1.1
+ */
+ QUOTE
+ }
+
+ /**
+ * Begin a document. Calling this method is optional for some builders, however if called then it must be matched by
+ * a corresponding call to {@link #endDocument()}.
+ *
+ * @see #endDocument()
+ */
+ public abstract void beginDocument();
+
+ /**
+ * End a document.
+ *
+ * @see #endDocument()
+ */
+ public abstract void endDocument();
+
+ /**
+ * Begin a block of the specified type.
+ *
+ * Builder implementations may do a best-effort application of the provided attributes. Note that the provided
+ * attributes *may* be a subclass of the {@link Attributes} class, in which case the builder may attempt to apply
+ * the attributes specified. Builders may choose to ignore attributes, and should fail silently if the given
+ * attributes are not as expected.
+ *
+ * Each call to this method must be matched by a corresponding call to {@link #endBlock()}.
+ *
+ * @param type
+ * @param attributes
+ * the attributes to apply to the block. Callers may choose to specify a more specialized set of
+ * attributes by providing a subclass instance.
+ *
+ * @see #endBlock()
+ */
+ public abstract void beginBlock(BlockType type, Attributes attributes);
+
+ /**
+ * End a block that was {@link #beginBlock(org.eclipse.mylyn.wikitext.parser.DocumentBuilder.BlockType, Attributes)
+ * started}.
+ */
+ public abstract void endBlock();
+
+ /**
+ * Begin a span of the specified type.
+ *
+ * Builder implementations may do a best-effort application of the provided attributes.
+ *
+ * Each call to this method must be matched by a corresponding call to {@link #endSpan()}.
+ *
+ * @param type
+ * @param attributes
+ * the attributes to apply to the span
+ *
+ * @see #endSpan()
+ */
+ public abstract void beginSpan(SpanType type, Attributes attributes);
+
+ /**
+ * End a span that was {@link #beginSpan(org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType, Attributes)
+ * started}.
+ *
+ * @see #beginSpan(org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType, Attributes)
+ */
+ public abstract void endSpan();
+
+ /**
+ * Begin a heading of the specified level (usually 1-6).
+ *
+ * Builder implementations may do a best-effort application of the provided attributes.
+ *
+ * Each call to this method must be matched by a corresponding call to {@link #endHeading()}.
+ *
+ * @param level
+ * the level of the heading, usually 1-6
+ * @param attributes
+ * the attributes to apply to the heading
+ *
+ * @see #endHeading()
+ */
+ public abstract void beginHeading(int level, Attributes attributes);
+
+ /**
+ * End a span that was {@link #beginHeading(int, Attributes) started}.
+ *
+ * @see #beginHeading(int, Attributes)
+ */
+ public abstract void endHeading();
+
+ /**
+ * Emit the given text as characters where special characters are encoded according to the output format rules.
+ *
+ * @param text
+ * the text to emit.
+ */
+ public abstract void characters(String text);
+
+ /**
+ * An XML entity reference.
+ *
+ * @param entity
+ * the entity
+ */
+ public abstract void entityReference(String entity);
+
+ /**
+ * Build the image with the given attributes
+ *
+ * @param attributes
+ * the attributes, which may be an {@link ImageAttributes}.
+ * @param url
+ * the URL to the image, possibly relative
+ */
+ public abstract void image(Attributes attributes, String url);
+
+ /**
+ * Create a hyperlink to the given url
+ *
+ * @param attributes
+ * the attributes of the link
+ * @param hrefOrHashName
+ * the url (which may be internal to the page if prefixed with a hash '#')
+ * @param text
+ * the text of the hyperlink
+ */
+ public abstract void link(Attributes attributes, String hrefOrHashName, String text);
+
+ /**
+ * Create a hyperlink whose visual representation is an image. Implementations must apply the attributes to the
+ * image tag. For example, if the builder constructs HTML, the builder would emit
+ * <code><a href="..."><img src="..."/></a></code>. In this case if the attributes define a css class then
+ * the resulting HTML should look like this: <code><a href="..."><img src="..." class="..."/></a></code>
+ *
+ * @param linkAttributes
+ * the attributes of the link, which may be {@link LinkAttributes}
+ * @param imageAttributes
+ * the attributes of the image , which may be {@link ImageAttributes}
+ * @param href
+ * the url (which may be internal to the page if prefixed with a hash '#')
+ * @param imageUrl
+ * the url of the image, which may be relative
+ */
+ public abstract void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl);
+
+ /**
+ * Create a hyperlink whose visual representation is an image. Implementations must apply the attributes to the
+ * image tag. For example, if the builder constructs HTML, the builder would emit
+ * <code><a href="..."><img src="..."/></a></code>. In this case if the attributes define a css class then
+ * the resulting HTML should look like this: <code><a href="..."><img src="..." class="..."/></a></code>
+ *
+ * @param attributes
+ * the attributes of the image, which may be {@link ImageAttributes}
+ * @param href
+ * the url (which may be internal to the page if prefixed with a hash '#')
+ * @param imageUrl
+ * the url of the image, which may be relative
+ *
+ * @see #imageLink(Attributes, Attributes, String, String)
+ */
+ public final void imageLink(Attributes attributes, String href, String imageUrl) {
+ imageLink(new LinkAttributes(), attributes, href, imageUrl);
+ }
+
+ /**
+ * @see #link(Attributes, String, String)
+ */
+ public final void link(String hrefOrHashName, String text) {
+ link(new LinkAttributes(), hrefOrHashName, text);
+ }
+
+ /**
+ * @see #imageLink(Attributes, String, String)
+ */
+ public final void imageLink(String href, String imageUrl) {
+ imageLink(new LinkAttributes(), new ImageAttributes(), href, imageUrl);
+ }
+
+ /**
+ * Emit an acronym
+ *
+ * @param text
+ * the acronym to emit
+ * @param definition
+ * the definition of the acronym, which is typically displayed on mouse hover
+ */
+ public abstract void acronym(String text, String definition);
+
+ /**
+ * Create a line break (eg: br in html). Not all builders need support line breaks.
+ */
+ public abstract void lineBreak();
+
+ /**
+ * Create unescaped characters, usually with some embedded HTML markup. Note that using this method causes the
+ * output to be HTML-centric
+ *
+ * @param literal
+ * the literal characters to emit
+ */
+ public abstract void charactersUnescaped(String literal);
+
+ /**
+ * Set the locator for the current session
+ *
+ * @param locator
+ * the locator that provides information about the current location in the markup
+ */
+ public void setLocator(Locator locator) {
+ this.locator = locator;
+ }
+
+ /**
+ * The locator for the current session
+ */
+ public Locator getLocator() {
+ return locator;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/HeadingAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/HeadingAttributes.java
new file mode 100644
index 0000000..cdc76f4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/HeadingAttributes.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ * Attributes specific to {@link DocumentBuilder#beginHeading(int, Attributes)}
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class HeadingAttributes extends Attributes {
+ private boolean omitFromTableOfContents;
+
+ /**
+ * a hint to document processors to indicate if this heading should participate in a table of contents. The default
+ * is false.
+ */
+ public boolean isOmitFromTableOfContents() {
+ return omitFromTableOfContents;
+ }
+
+ /**
+ * a hint to document processors to indicate if this heading should participate in a table of contents. The default
+ * is false.
+ */
+ public void setOmitFromTableOfContents(boolean omitFromTableOfContents) {
+ this.omitFromTableOfContents = omitFromTableOfContents;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/IdGenerator.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/IdGenerator.java
new file mode 100644
index 0000000..8cef753
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/IdGenerator.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.DefaultIdGenerationStrategy;
+import org.eclipse.mylyn.wikitext.core.parser.markup.IdGenerationStrategy;
+
+/**
+ * @author David Green
+ * @since 1.0
+ */
+public class IdGenerator {
+
+ private static final DefaultIdGenerationStrategy DEFAULT_ID_GENERATION_STRATEGY = new DefaultIdGenerationStrategy();
+
+ private final Map<String, Integer> idGenerators = new HashMap<String, Integer>();
+
+ private final Set<String> anchorNames = new HashSet<String>();
+
+ private IdGenerationStrategy generationStrategy = DEFAULT_ID_GENERATION_STRATEGY;
+
+ public IdGenerator() {
+ }
+
+ /**
+ * reserve the given id, ensuring that the generator will not generate the same id. An id can only be reserved if it
+ * has not already been reserved and if it has not already been {@link #newId(String,String) generated}.
+ *
+ * @param id
+ * the id to reserve
+ *
+ * @return true if the id was reserved, otherwise false
+ */
+ public boolean reserveId(String id) {
+ return anchorNames.add(id);
+ }
+
+ /**
+ * create a new ID based on the given type and label text. Guarantees to return an id once and only once; duplicates
+ * are never created.
+ *
+ * @param type
+ * the type of id to produce, usually an indication of what the id is created for. For example, 'h1', or
+ * 'h2'. may be null.
+ * @param text
+ * the label text for which the id is being produced. may be null.
+ *
+ * @return a unique id
+ */
+ public String newId(String type, String text) {
+ if (type == null) {
+ type = ""; //$NON-NLS-1$
+ }
+ Integer current = idGenerators.get(type);
+ if (current == null) {
+ current = 0;
+ }
+ current = current + 1;
+
+ idGenerators.put(type, current);
+
+ String id = null;
+ if (text != null) {
+ id = generationStrategy.generateId(text.trim());
+ if (id == null || id.length() == 0) {
+ id = type + '-' + current;
+ }
+ } else {
+ id = type + '-' + current;
+ }
+ String template = id;
+ int suffix = 1;
+ while (!anchorNames.add(id)) {
+ id = template + (++suffix);
+ }
+ return id;
+ }
+
+ /**
+ * get the set of anchor names that were either {@link #reserveId(String) reserved} or
+ * {@link #newId(String, String) created}.
+ *
+ * @return the set of names
+ */
+ public Set<String> getAnchorNames() {
+ return Collections.unmodifiableSet(anchorNames);
+ }
+
+ public IdGenerationStrategy getGenerationStrategy() {
+ return generationStrategy;
+ }
+
+ public void setGenerationStrategy(IdGenerationStrategy generationStrategy) {
+ if (generationStrategy == null) {
+ throw new IllegalArgumentException();
+ }
+ this.generationStrategy = generationStrategy;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/ImageAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/ImageAttributes.java
new file mode 100644
index 0000000..ce59426
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/ImageAttributes.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ * Attributes for images.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ImageAttributes extends Attributes {
+
+ public enum Align {
+ Left, Right, Top, Texttop, Middle, Absmiddle, Baseline, Bottom, Absbottom, Center
+ }
+
+ private int width = -1;
+
+ private int height = -1;
+
+ private int border = 0;
+
+ private Align align = null;
+
+ private String alt;
+
+ public String getAlt() {
+ return alt;
+ }
+
+ public void setAlt(String alt) {
+ this.alt = alt;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ public int getBorder() {
+ return border;
+ }
+
+ public void setBorder(int border) {
+ this.border = border;
+ }
+
+ public Align getAlign() {
+ return align;
+ }
+
+ public void setAlign(Align align) {
+ this.align = align;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/LinkAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/LinkAttributes.java
new file mode 100644
index 0000000..357c500
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/LinkAttributes.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+
+/**
+ * Attributes for links (hyperlinks)
+ *
+ * @author David Green
+ * @author draft
+ * @since 1.0
+ */
+public class LinkAttributes extends Attributes {
+ private String target;
+
+ private String rel;
+
+ /**
+ * The target of a link, as defined by the HTML spec.
+ *
+ * @param target
+ * the target or null if there should be none
+ */
+ public void setTarget(String target) {
+ this.target = target;
+ }
+
+ /**
+ * The target of a link, as defined by the HTML spec.
+ *
+ * @return the target or null if there should be none
+ */
+ public String getTarget() {
+ return target;
+ }
+
+ /**
+ * The 'rel' of a link, as defined by the HTML spec.
+ *
+ * @return the ref or null if there should be none
+ *
+ * @see HtmlDocumentBuilder#getLinkRel()
+ */
+ public String getRel() {
+ return rel;
+ }
+
+ /**
+ * The 'rel' of a link, as defined by the HTML spec.
+ *
+ * @param rel
+ * the rel or null if there should be none
+ *
+ * @see HtmlDocumentBuilder#setLinkRel(String)
+ */
+ public void setRel(String rel) {
+ this.rel = rel;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/ListAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/ListAttributes.java
new file mode 100644
index 0000000..a98d4d4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/ListAttributes.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ListAttributes extends Attributes {
+
+ private String start;
+
+ public String getStart() {
+ return start;
+ }
+
+ public void setStart(String start) {
+ this.start = start;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/Locator.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/Locator.java
new file mode 100644
index 0000000..6c7fd04
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/Locator.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ * An interface that provides information about the location of the current parser activity. Note that parsers may make
+ * a best-effort attempt at determining the location.
+ *
+ * @author David Green
+ */
+public interface Locator {
+ /**
+ * get the 1-based number of the current line.
+ *
+ * @return the line number or -1 if unknown
+ */
+ public int getLineNumber();
+
+ /**
+ * get the 0-based character offset of the current line from the start of the document
+ *
+ * @return the offset or -1 if unknown
+ */
+ public int getLineDocumentOffset();
+
+ /**
+ * get the 0-based character offset of the current character from the start of the document. Equivalent to
+ * <code>getLineDocumentOffset()+getLineCharacterOffset()</code>
+ */
+ public int getDocumentOffset();
+
+ /**
+ * get the length of the current line in characters, not including the line terminator
+ */
+ public int getLineLength();
+
+ /**
+ * get the 0-based offset of the current character in the current line
+ */
+ public int getLineCharacterOffset();
+
+ /**
+ * Get the 0-based offset of the end of the current line segment being processed, exclusive.
+ *
+ * Generally a phrase modifier starts at {@link #getLineCharacterOffset()} and ends on the character preceding this
+ * offset, <code>[s,e)</code> where s is the start and e is the end.
+ */
+ public int getLineSegmentEndOffset();
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/MarkupParser.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/MarkupParser.java
new file mode 100644
index 0000000..0487c87
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/MarkupParser.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringWriter;
+
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ * A markup processor that can process lightweight markup formats such as Textile.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class MarkupParser {
+
+ private MarkupLanguage markupLanguage;
+
+ private DocumentBuilder builder;
+
+ public MarkupParser() {
+ }
+
+ public MarkupParser(MarkupLanguage markupLanaguage, DocumentBuilder builder) {
+ this.markupLanguage = markupLanaguage;
+ this.builder = builder;
+ }
+
+ public MarkupParser(MarkupLanguage markupLanaguage) {
+ this.markupLanguage = markupLanaguage;
+ }
+
+ /**
+ * the markup language of the markup to process
+ */
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ /**
+ * set the markup language of the markup to process
+ */
+ public void setMarkupLanguage(MarkupLanguage markupLanaguage) {
+ this.markupLanguage = markupLanaguage;
+ }
+
+ /**
+ * the builder to which parse results are propagated
+ */
+ public DocumentBuilder getBuilder() {
+ return builder;
+ }
+
+ /**
+ * set the builder to which parse results are propagated
+ */
+ public void setBuilder(DocumentBuilder builder) {
+ this.builder = builder;
+ }
+
+ public void parse(Reader markupContent) throws IOException {
+ parse(markupContent, true);
+ }
+
+ public void parse(Reader markupContent, boolean asDocument) throws IOException {
+ parse(readFully(markupContent), asDocument);
+ }
+
+ public void parse(String markupContent) {
+ parse(markupContent, true);
+ }
+
+ public void parse(String markupContent, boolean asDocument) {
+ if (markupLanguage == null) {
+ throw new IllegalStateException("markup language is not set"); //$NON-NLS-1$
+ }
+ if (builder == null) {
+ throw new IllegalStateException("builder is not set"); //$NON-NLS-1$
+ }
+ markupLanguage.processContent(this, markupContent, asDocument);
+ }
+
+ private String readFully(Reader reader) throws IOException {
+ StringWriter writer = new StringWriter();
+ int c;
+ while ((c = reader.read()) != -1) {
+ writer.write(c);
+ }
+ return writer.toString();
+ }
+
+ /**
+ * parse the given markup content and produce the result as an HTML document.
+ *
+ * @param markupContent
+ * the content to parse
+ *
+ * @return the HTML document text.
+ */
+ public String parseToHtml(String markupContent) {
+ if (builder != null) {
+ throw new IllegalStateException("Builder must not be set"); //$NON-NLS-1$
+ }
+
+ StringWriter out = new StringWriter();
+
+ setBuilder(new HtmlDocumentBuilder(out));
+
+ parse(markupContent);
+
+ setBuilder(null);
+
+ return out.toString();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/QuoteAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/QuoteAttributes.java
new file mode 100644
index 0000000..e1c7876
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/QuoteAttributes.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+/**
+ * Attributes for block quotes.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class QuoteAttributes extends Attributes {
+ private String citation;
+
+ public String getCitation() {
+ return citation;
+ }
+
+ public void setCitation(String citation) {
+ this.citation = citation;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableAttributes.java
new file mode 100644
index 0000000..3d8097c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableAttributes.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ * Attributes that may used when creating blocks of type {@link BlockType#TABLE}.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class TableAttributes extends Attributes {
+
+ private String border;
+
+ private String summary;
+
+ private String width;
+
+ private String frame;
+
+ private String rules;
+
+ private String cellspacing;
+
+ private String cellpadding;
+
+ private String bgcolor;
+
+ public String getBorder() {
+ return border;
+ }
+
+ public void setBorder(String border) {
+ this.border = border;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getWidth() {
+ return width;
+ }
+
+ public void setWidth(String width) {
+ this.width = width;
+ }
+
+ public String getFrame() {
+ return frame;
+ }
+
+ public void setFrame(String frame) {
+ this.frame = frame;
+ }
+
+ public String getRules() {
+ return rules;
+ }
+
+ public void setRules(String rules) {
+ this.rules = rules;
+ }
+
+ public String getCellspacing() {
+ return cellspacing;
+ }
+
+ public void setCellspacing(String cellspacing) {
+ this.cellspacing = cellspacing;
+ }
+
+ public String getCellpadding() {
+ return cellpadding;
+ }
+
+ public void setCellpadding(String cellpadding) {
+ this.cellpadding = cellpadding;
+ }
+
+ public String getBgcolor() {
+ return bgcolor;
+ }
+
+ public void setBgcolor(String bgcolor) {
+ this.bgcolor = bgcolor;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableCellAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableCellAttributes.java
new file mode 100644
index 0000000..6032ce9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableCellAttributes.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ * Attributes that may used when creating blocks of type {@link BlockType#TABLE_CELL_HEADER} or
+ * {@link BlockType#TABLE_CELL_NORMAL}.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class TableCellAttributes extends Attributes {
+ private String bgcolor;
+
+ private String align;
+
+ private String valign;
+
+ private String rowspan;
+
+ private String colspan;
+
+ public String getBgcolor() {
+ return bgcolor;
+ }
+
+ public void setBgcolor(String bgcolor) {
+ this.bgcolor = bgcolor;
+ }
+
+ public String getAlign() {
+ return align;
+ }
+
+ public void setAlign(String align) {
+ this.align = align;
+ }
+
+ public String getValign() {
+ return valign;
+ }
+
+ public void setValign(String valign) {
+ this.valign = valign;
+ }
+
+ public String getRowspan() {
+ return rowspan;
+ }
+
+ public void setRowspan(String rowspan) {
+ this.rowspan = rowspan;
+ }
+
+ public String getColspan() {
+ return colspan;
+ }
+
+ public void setColspan(String colspan) {
+ this.colspan = colspan;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableRowAttributes.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableRowAttributes.java
new file mode 100644
index 0000000..6125743
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/TableRowAttributes.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ * Attributes that may used when creating blocks of type {@link BlockType#TABLE_ROW}.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class TableRowAttributes extends Attributes {
+ private String bgcolor;
+
+ private String align;
+
+ private String valign;
+
+ public String getBgcolor() {
+ return bgcolor;
+ }
+
+ public void setBgcolor(String bgcolor) {
+ this.bgcolor = bgcolor;
+ }
+
+ public String getAlign() {
+ return align;
+ }
+
+ public void setAlign(String align) {
+ this.align = align;
+ }
+
+ public String getValign() {
+ return valign;
+ }
+
+ public void setValign(String valign) {
+ this.valign = valign;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/AbstractXmlDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/AbstractXmlDocumentBuilder.java
new file mode 100644
index 0000000..a8ac66a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/AbstractXmlDocumentBuilder.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.Writer;
+import java.net.URI;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.util.DefaultXmlStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public abstract class AbstractXmlDocumentBuilder extends DocumentBuilder {
+ private static final Pattern ABSOLUTE_URL_PATTERN = Pattern.compile("[a-zA-Z]{3,8}://?.*"); //$NON-NLS-1$
+
+ protected XmlStreamWriter writer;
+
+ protected URI base;
+
+ protected boolean baseInHead = false;
+
+ public AbstractXmlDocumentBuilder(Writer out) {
+ writer = createXmlStreamWriter(out);
+ }
+
+ public AbstractXmlDocumentBuilder(XmlStreamWriter writer) {
+ this.writer = writer;
+
+ }
+
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ XmlStreamWriter writer = new DefaultXmlStreamWriter(out);
+ return writer;
+ }
+
+ @Override
+ public void characters(String text) {
+ writer.writeCharacters(text);
+ }
+
+ protected String makeUrlAbsolute(String url) {
+ if (base == null || baseInHead || url == null) {
+ return url;
+ }
+ if (ABSOLUTE_URL_PATTERN.matcher(url).matches()) {
+ return url;
+ }
+ if (url.startsWith("#")) { //$NON-NLS-1$
+ return url;
+ }
+ String absoluteUrl = base.toString();
+ if (!absoluteUrl.endsWith("/") && !url.startsWith("/")) { //$NON-NLS-1$ //$NON-NLS-2$
+ absoluteUrl = absoluteUrl + '/';
+ }
+ absoluteUrl = absoluteUrl + url;
+ return absoluteUrl;
+ }
+
+ /**
+ * indicate if the given URL is a link to an external source
+ *
+ * @param url
+ * the URL
+ *
+ * @return true if the given URL links to an external source
+ */
+ protected boolean isExternalLink(String url) {
+ if (url == null) {
+ return false;
+ }
+ if (ABSOLUTE_URL_PATTERN.matcher(url).matches()) {
+ if (base == null || !url.startsWith(base.toString())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Set the base URI of the HTML document. Causes all relative URLs to be prefixed with the base URI. The base URI is
+ * assumed to refer to a folder-like resource.
+ *
+ * @param uri
+ * the URI, or null
+ */
+ public void setBase(URI uri) {
+ base = uri;
+ }
+
+ /**
+ * Get the base URI of the HTML document. A not-null value causes all relative URLs to be prefixed with the base
+ * URI. The base URI is assumed to refer to a folder-like resource.
+ */
+ public URI getBase() {
+ return base;
+ }
+
+ /**
+ * Indicate if the {@link #getBase() base URI} should be emitted into the <head> of the document. The default
+ * value is false. Ignored unless {@link #isEmitAsDocument()}
+ */
+ public boolean isBaseInHead() {
+ return baseInHead;
+ }
+
+ /**
+ * Indicate if the {@link #getBase() base URI} should be emitted into the <head> of the document. The default
+ * value is false. Ignored unless {@link #isEmitAsDocument()}
+ */
+ public void setBaseInHead(boolean baseInHead) {
+ this.baseInHead = baseInHead;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/DitaBookMapDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/DitaBookMapDocumentBuilder.java
new file mode 100644
index 0000000..fa9911a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/DitaBookMapDocumentBuilder.java
@@ -0,0 +1,392 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.BufferedOutputStream;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.Stack;
+
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.DitaTopicDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.util.FormattingXMLStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToDitaTask;
+
+/**
+ * a document builder that can produce OASIS DITA output in the form of a book map and multiple topic output files, one
+ * for each level-1 heading.
+ *
+ * This document builder differs from others in that it implements {@link Closeable} and therefore must be closed after
+ * use. Also this document builder produces multiple output files.
+ *
+ * @author David Green
+ *
+ * @see DocBookDocumentBuilder
+ * @see MarkupToDitaTask
+ * @since 1.0
+ */
+public class DitaBookMapDocumentBuilder extends AbstractXmlDocumentBuilder implements Closeable {
+
+ private String bookTitle;
+
+ private String doctype = "<!DOCTYPE bookmap PUBLIC \"-//OASIS//DTD DITA 1.1 BookMap//EN\" \"http://docs.oasis-open.org/dita/v1.1/OS/dtd/bookmap.dtd\">"; //$NON-NLS-1$
+
+ private String topicDoctype;
+
+ private String topicFilenameSuffix = ".dita"; //$NON-NLS-1$
+
+ private String topicFolder;
+
+ private File targetFile;
+
+ private DitaTopicDocumentBuilder currentTopic;
+
+ private String latestHeadingId;
+
+ private File currentTopicFile;
+
+ private final Stack<Integer> headingLevels = new Stack<Integer>();
+
+ private boolean mapEntryOpen;
+
+ private String titleText;
+
+ private Writer currentTopicOut;
+
+ private OutlineItem outline;
+
+ private int topicBreakLevel = 1;
+
+ public DitaBookMapDocumentBuilder(Writer out) {
+ super(out);
+ }
+
+ public DitaBookMapDocumentBuilder(XmlStreamWriter writer) {
+ super(writer);
+ }
+
+ @Override
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ XmlStreamWriter writer = super.createXmlStreamWriter(out);
+ return new FormattingXMLStreamWriter(writer);
+ }
+
+ /**
+ * the book title as it should appear in the bookmap
+ */
+ public String getBookTitle() {
+ return bookTitle;
+ }
+
+ /**
+ * the book title as it should appear in the bookmap
+ */
+ public void setBookTitle(String bookTitle) {
+ this.bookTitle = bookTitle;
+ }
+
+ /**
+ * the doctype to be used for topics, or null if the default is to be used
+ *
+ * @see #getDoctype()
+ */
+ public String getTopicDoctype() {
+ return topicDoctype;
+ }
+
+ /**
+ * the doctype to be used for topics, or null if the default is to be used
+ *
+ * @see #setDoctype(String)
+ */
+ public void setTopicDoctype(String topicDoctype) {
+ this.topicDoctype = topicDoctype;
+ }
+
+ /**
+ * the doctype to be used for the bookmap, or null if the default is to be used
+ */
+ public String getDoctype() {
+ return doctype;
+ }
+
+ /**
+ * the doctype to be used for the bookmap, or null if the default is to be used
+ */
+ public void setDoctype(String doctype) {
+ this.doctype = doctype;
+ }
+
+ /**
+ * the filename suffix to use when producing topics. Should include the leading dot '.', for example '.dita'. The
+ * default value is <code>.dita</code>.
+ */
+ public String getTopicFilenameSuffix() {
+ return topicFilenameSuffix;
+ }
+
+ /**
+ * the filename suffix to use when producing topics. Should include the leading dot '.', for example '.dita'. The
+ * default value is <code>.dita</code>.
+ */
+ public void setTopicFilenameSuffix(String topicFilenameSuffix) {
+ this.topicFilenameSuffix = topicFilenameSuffix;
+ }
+
+ /**
+ * the relative folder name of the folder in which topic files should be produced, or null if the files should be
+ * created within the same folder as the bookmap.
+ */
+ public String getTopicFolder() {
+ return topicFolder;
+ }
+
+ /**
+ * the relative folder name of the folder in which topic files should be produced, or null if the files should be
+ * created within the same folder as the bookmap.
+ */
+ public void setTopicFolder(String topicFolder) {
+ this.topicFolder = topicFolder;
+ }
+
+ /**
+ * the target output file of the bookmap. used to compute relative paths to topic files.
+ */
+ public File getTargetFile() {
+ return targetFile;
+ }
+
+ /**
+ * the target output file of the bookmap. used to compute relative paths to topic files.
+ */
+ public void setTargetFile(File targetFile) {
+ this.targetFile = targetFile;
+ }
+
+ private DitaTopicDocumentBuilder getCurrentTopic() {
+ if (currentTopic == null) {
+ try {
+ currentTopicFile = computeFile(latestHeadingId);
+ currentTopicOut = new OutputStreamWriter(new BufferedOutputStream(
+ new FileOutputStream(currentTopicFile)), "utf-8"); //$NON-NLS-1$
+ } catch (IOException e1) {
+ throw new IllegalStateException(e1);
+ }
+
+ // create a DITA map entry
+ String relativeTopic = currentTopicFile.getName();
+ if (topicFolder != null) {
+ relativeTopic = topicFolder + '/' + relativeTopic;
+ }
+ writer.writeEmptyElement("chapter"); //$NON-NLS-1$
+ writer.writeAttribute("href", relativeTopic); //$NON-NLS-1$
+ titleText = ""; //$NON-NLS-1$
+ mapEntryOpen = true;
+
+ currentTopic = new DitaTopicDocumentBuilder(currentTopicOut);
+ if (topicDoctype != null) {
+ currentTopic.setDoctype(topicDoctype);
+ }
+ currentTopic.setTopicBreakLevel(topicBreakLevel);
+ currentTopic.setOutline(outline);
+ currentTopic.setFilename(currentTopicFile.getName());
+ currentTopic.beginDocument();
+ }
+ return currentTopic;
+ }
+
+ private File computeFile(String headingId) {
+ String name = DitaTopicDocumentBuilder.computeName(headingId, topicFilenameSuffix);
+
+ File folder = targetFile.getParentFile();
+ if (topicFolder != null) {
+ folder = new File(folder, topicFolder);
+ }
+ return new File(folder, name);
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ getCurrentTopic().acronym(text, definition);
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ getCurrentTopic().beginBlock(type, attributes);
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ headingLevels.push(level);
+ if (level <= topicBreakLevel) {
+ closeCurrentTopic();
+ latestHeadingId = attributes.getId();
+
+ }
+ getCurrentTopic().beginHeading(level, attributes);
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ getCurrentTopic().beginSpan(type, attributes);
+ }
+
+ @Override
+ public void characters(String text) {
+ if (mapEntryOpen) {
+ titleText += text;
+ }
+ getCurrentTopic().characters(text);
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ getCurrentTopic().charactersUnescaped(literal);
+ }
+
+ @Override
+ public void endBlock() {
+ getCurrentTopic().endBlock();
+ }
+
+ @Override
+ public void beginDocument() {
+ writer.writeStartDocument();
+ writer.writeDTD(doctype);
+
+ writer.writeStartElement("bookmap"); //$NON-NLS-1$
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ if (bookTitle != null) {
+ writer.writeCharacters(bookTitle);
+ }
+ writer.writeEndElement();
+
+ }
+
+ @Override
+ public void endDocument() {
+ closeCurrentTopic();
+
+ writer.writeEndElement();
+ writer.writeEndDocument();
+ }
+
+ private void closeCurrentTopic() {
+ if (currentTopic != null) {
+ currentTopic.endDocument();
+ currentTopic = null;
+ if (currentTopicOut != null) {
+ try {
+ currentTopicOut.close();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ currentTopicOut = null;
+ }
+ }
+ }
+
+ @Override
+ public void endHeading() {
+ int level = headingLevels.pop();
+
+ if (level <= topicBreakLevel) {
+ if (mapEntryOpen) {
+ mapEntryOpen = false;
+ writer.writeAttribute("navtitle", titleText); //$NON-NLS-1$
+ titleText = null;
+ }
+ }
+ getCurrentTopic().endHeading();
+ }
+
+ @Override
+ public void endSpan() {
+ getCurrentTopic().endSpan();
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ getCurrentTopic().entityReference(entity);
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ getCurrentTopic().image(attributes, url);
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ getCurrentTopic().imageLink(linkAttributes, imageAttributes, href, imageUrl);
+ }
+
+ @Override
+ public void lineBreak() {
+ getCurrentTopic().lineBreak();
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ getCurrentTopic().link(attributes, hrefOrHashName, text);
+ }
+
+ /**
+ * users of this class must call close when done with it.
+ */
+ public void close() throws IOException {
+ if (currentTopicOut != null) {
+ try {
+ currentTopicOut.close();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ currentTopicOut = null;
+ }
+ }
+
+ /**
+ * the outline if available, otherwise null
+ *
+ * {@link #setOutline(OutlineItem)}
+ */
+ public OutlineItem getOutline() {
+ return outline;
+ }
+
+ /**
+ * Set the outline of the document being parsed if xref URLs are to be correctly computed. OASIS DITA has its own
+ * URL syntax for DITA-specific links, which need some translation at the time that we build the document.
+ */
+ public void setOutline(OutlineItem outline) {
+ this.outline = outline;
+ }
+
+ /**
+ * the heading level at which topics are determined
+ */
+ public int getTopicBreakLevel() {
+ return topicBreakLevel;
+ }
+
+ /**
+ * the heading level at which topics are determined
+ */
+ public void setTopicBreakLevel(int topicBreakLevel) {
+ this.topicBreakLevel = topicBreakLevel;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/DocBookDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/DocBookDocumentBuilder.java
new file mode 100644
index 0000000..c87ae7a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/DocBookDocumentBuilder.java
@@ -0,0 +1,623 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.TreeMap;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToDocbook;
+import org.eclipse.mylyn.wikitext.core.util.FormattingXMLStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToDocbookTask;
+
+/**
+ * A builder that can emit <a href="http://www.docbook.org/">Docbook</a>
+ *
+ * @author David Green
+ * @author Peter Friese bug 273355 Support image scaling for Textile -> DocBook
+ *
+ * @see MarkupToDocbook
+ * @see MarkupToDocbookTask
+ * @see DitaBookMapDocumentBuilder
+ * @since 1.0
+ */
+public class DocBookDocumentBuilder extends AbstractXmlDocumentBuilder {
+
+ private static final Pattern PERCENTAGE = Pattern.compile("(\\d+)%"); //$NON-NLS-1$
+
+ private static final Pattern CSS_CLASS_INLINE = Pattern.compile("(^|\\s+)inline(\\s+|$)"); //$NON-NLS-1$
+
+ private static Set<Integer> entityReferenceToUnicode = new HashSet<Integer>();
+ static {
+ entityReferenceToUnicode.add(215);
+ entityReferenceToUnicode.add(8211);
+ entityReferenceToUnicode.add(8212);
+ entityReferenceToUnicode.add(8220);
+ entityReferenceToUnicode.add(8221);
+ entityReferenceToUnicode.add(8216);
+ entityReferenceToUnicode.add(8217);
+
+ }
+
+ private String bookTitle;
+
+ private String doctype = "<!DOCTYPE book PUBLIC \"-//OASIS//DTD DocBook XML V4.5//EN\" \"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd\">"; //$NON-NLS-1$
+
+ private final Map<String, String> acronyms = new HashMap<String, String>();
+
+ private int headingLevel = 0;
+
+ private final Stack<BlockDescription> blockDescriptions = new Stack<BlockDescription>();
+
+ private boolean automaticGlossary = true;
+
+ public DocBookDocumentBuilder(Writer out) {
+ super(out);
+ }
+
+ public DocBookDocumentBuilder(XmlStreamWriter writer) {
+ super(writer);
+ }
+
+ protected XmlStreamWriter createFormattingXmlStreamWriter(Writer out) {
+ XmlStreamWriter writer = super.createXmlStreamWriter(out);
+ return new FormattingXMLStreamWriter(writer) {
+ @Override
+ protected boolean preserveWhitespace(String elementName) {
+ return elementName.equals("code") || elementName.startsWith("literal"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ };
+ }
+
+ public String getDoctype() {
+ return doctype;
+ }
+
+ public void setDoctype(String doctype) {
+ this.doctype = doctype;
+ }
+
+ public String getBookTitle() {
+ return bookTitle;
+ }
+
+ public void setBookTitle(String bookTitle) {
+ this.bookTitle = bookTitle;
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ String previousDef = acronyms.put(text, definition);
+ if (previousDef != null && previousDef.length() > definition.length()) {
+ acronyms.put(text, previousDef);
+ }
+ writer.writeStartElement("glossterm"); //$NON-NLS-1$
+ characters(text);
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void link(Attributes attributes, String href, final String text) {
+ link(attributes, href, new ContentEmitter() {
+ public void emit() {
+ writer.writeCharacters(text);
+ }
+ });
+ }
+
+ private void link(Attributes attributes, String href, ContentEmitter emitter) {
+ ensureBlockElementsOpen();
+ if (href.startsWith("#")) { //$NON-NLS-1$
+ if (href.length() > 1) {
+ writer.writeStartElement("link"); //$NON-NLS-1$
+ writer.writeAttribute("linkend", href.substring(1)); //$NON-NLS-1$
+ emitter.emit();
+ writer.writeEndElement(); // link
+ } else {
+ emitter.emit();
+ }
+ } else {
+ writer.writeStartElement("ulink"); //$NON-NLS-1$
+ writer.writeAttribute("url", href); //$NON-NLS-1$
+ emitter.emit();
+ writer.writeEndElement(); // ulink
+ }
+ }
+
+ private interface ContentEmitter {
+ public void emit();
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ if (headingLevel == 0) {
+ beginHeading(1, new Attributes());
+ endHeading();
+ }
+
+ String elementName;
+ String[] elementNames = null;
+ boolean allowTitle = false;
+ boolean closeElementsOnBlockStart = false;
+ BlockDescription previousBlock = null;
+ if (!blockDescriptions.isEmpty()) {
+ previousBlock = blockDescriptions.peek();
+ }
+
+ switch (type) {
+ case BULLETED_LIST:
+ elementName = "itemizedlist"; //$NON-NLS-1$
+ break;
+ case NUMERIC_LIST:
+ elementName = "orderedlist"; //$NON-NLS-1$
+ break;
+ case DEFINITION_LIST:
+ elementName = "variablelist"; //$NON-NLS-1$
+
+ // variablelist
+ // varlistentry+
+ // term+
+ // listitem
+ //
+ break;
+ case DEFINITION_TERM:
+
+ BlockDescription blockDescription = findBlockDescription(BlockType.DEFINITION_LIST);
+ if (blockDescription.entrySize > 0) {
+ endBlockEntry(blockDescription);
+ }
+ openBlockEntry(blockDescription, new String[] { "varlistentry" }); //$NON-NLS-1$
+
+ elementName = "term"; //$NON-NLS-1$
+ break;
+ case DEFINITION_ITEM:
+ elementName = "listitem"; //$NON-NLS-1$
+ elementNames = new String[] { "para" }; //$NON-NLS-1$
+ closeElementsOnBlockStart = true;
+ break;
+ case FOOTNOTE:
+ case PARAGRAPH:
+ elementName = "para"; //$NON-NLS-1$
+ break;
+ case CODE:
+ elementName = "code"; //$NON-NLS-1$
+ break;
+ case PREFORMATTED:
+ elementName = "literallayout"; //$NON-NLS-1$
+ break;
+ case QUOTE:
+ elementName = "blockquote"; //$NON-NLS-1$
+ break;
+ case LIST_ITEM:
+ elementName = "listitem"; //$NON-NLS-1$
+ elementNames = new String[] { "para" }; //$NON-NLS-1$
+ closeElementsOnBlockStart = true;
+ break;
+ case TABLE:
+ elementName = "informaltable"; //$NON-NLS-1$
+ break;
+ case TABLE_CELL_HEADER:
+ elementName = "th"; //$NON-NLS-1$
+ break;
+ case TABLE_CELL_NORMAL:
+ elementName = "td"; //$NON-NLS-1$
+ break;
+ case TABLE_ROW:
+ elementName = "tr"; //$NON-NLS-1$
+ break;
+ case INFORMATION:
+ elementName = "important"; //$NON-NLS-1$
+ allowTitle = true;
+ break;
+ case NOTE:
+ elementName = "note"; //$NON-NLS-1$
+ allowTitle = true;
+ break;
+ case WARNING:
+ elementName = "warning"; //$NON-NLS-1$
+ allowTitle = true;
+ break;
+ case TIP:
+ elementName = "tip"; //$NON-NLS-1$
+ allowTitle = true;
+ break;
+ case PANEL:
+ elementName = "note"; // docbook has nothing better for 'note' //$NON-NLS-1$
+ allowTitle = true;
+ break;
+ case DIV:
+ elementName = null;
+ break;
+ default:
+ throw new IllegalStateException(type.name());
+ }
+
+ int blockSize;
+ if (elementName != null) {
+ blockSize = 1;
+
+ if (previousBlock != null && previousBlock.closeElementsOnBlockStart) {
+ endBlockEntry(previousBlock);
+ }
+
+ writer.writeStartElement(elementName);
+ applyAttributes(attributes);
+
+ if (elementNames != null) {
+ for (String name : elementNames) {
+ writer.writeStartElement(name);
+ }
+ }
+
+ if (allowTitle && attributes.getTitle() != null) {
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ writer.writeCharacters(attributes.getTitle());
+ writer.writeEndElement();
+ }
+ } else {
+ blockSize = 0;
+ }
+ blockDescriptions.push(new BlockDescription(type, blockSize, elementNames, closeElementsOnBlockStart));
+ }
+
+ @Override
+ public void endBlock() {
+ final BlockDescription blockDescription = blockDescriptions.pop();
+ int size = blockDescription.size + blockDescription.entrySize;
+ for (int x = 0; x < size; ++x) {
+ writer.writeEndElement();
+ }
+ }
+
+ private void endBlockEntry(BlockDescription blockDescription) {
+ for (int x = 0; x < blockDescription.entrySize; ++x) {
+ writer.writeEndElement();
+ }
+ blockDescription.entrySize = 0;
+ }
+
+ private void openBlockEntry(BlockDescription blockDescription, String[] entry) {
+ for (String ent : entry) {
+ writer.writeStartElement(ent);
+ }
+ blockDescription.entrySize += entry.length;
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ closeSections(Math.max(level - 1, 0));
+
+ while (headingLevel < level) {
+ headingLevel++;
+
+ writer.writeStartElement(headingLevel == 1 ? "chapter" : "section"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (attributes != null) {
+ applyAttributes(attributes);
+ attributes = null;
+ }
+ }
+
+ writer.writeStartElement("title"); //$NON-NLS-1$
+
+ }
+
+ @Override
+ public void endHeading() {
+ writer.writeEndElement(); // title
+ }
+
+ @Override
+ public void beginDocument() {
+ baseInHead = false;
+ writer.writeStartDocument();
+ writer.writeDTD(doctype);
+
+ writer.writeStartElement("book"); //$NON-NLS-1$
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ if (bookTitle != null) {
+ writer.writeCharacters(bookTitle);
+ }
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ ensureBlockElementsOpen();
+ switch (type) {
+ case BOLD:
+ case STRONG:
+ writer.writeStartElement("emphasis"); //$NON-NLS-1$
+ writer.writeAttribute("role", "bold"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case CITATION:
+ writer.writeStartElement("citation"); //$NON-NLS-1$
+ break;
+ case CODE:
+ writer.writeStartElement("code"); //$NON-NLS-1$
+ break;
+ case DELETED:
+ writer.writeStartElement("emphasis"); //$NON-NLS-1$
+ writer.writeAttribute("role", "del"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case EMPHASIS:
+ writer.writeStartElement("emphasis"); //$NON-NLS-1$
+ break;
+ case INSERTED:
+ writer.writeStartElement("emphasis"); //$NON-NLS-1$
+ writer.writeAttribute("role", "ins"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case UNDERLINED:
+ writer.writeStartElement("emphasis"); //$NON-NLS-1$
+ writer.writeAttribute("role", "underline"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case ITALIC:
+ writer.writeStartElement("emphasis"); //$NON-NLS-1$
+ writer.writeAttribute("role", "italic"); //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case QUOTE:
+ writer.writeStartElement("quote"); //$NON-NLS-1$
+ break;
+ case SPAN:
+ writer.writeStartElement("phrase"); //$NON-NLS-1$
+ break;
+ case SUBSCRIPT:
+ writer.writeStartElement("subscript"); //$NON-NLS-1$
+ break;
+ case SUPERSCRIPT:
+ writer.writeStartElement("superscript"); //$NON-NLS-1$
+ break;
+ case MONOSPACE:
+ writer.writeStartElement("literal"); //$NON-NLS-1$
+ break;
+ default:
+ Logger.getLogger(DocBookDocumentBuilder.class.getName()).warning("No docbook mapping for " + type); //$NON-NLS-1$
+ writer.writeStartElement("phrase"); //$NON-NLS-1$
+ break;
+ }
+ applyAttributes(attributes);
+ }
+
+ private void applyAttributes(Attributes attributes) {
+ if (attributes.getId() != null) {
+ writer.writeAttribute("id", attributes.getId()); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void endDocument() {
+ closeSections(0);
+
+ writeGlossaryAppendix();
+
+ writer.writeEndElement(); // book
+ writer.writeEndDocument();
+
+ acronyms.clear();
+ }
+
+ private void closeSections(int toLevel) {
+ if (toLevel < 0) {
+ toLevel = 0;
+ }
+ while (headingLevel > toLevel) {
+ writer.writeEndElement();
+ --headingLevel;
+ }
+ }
+
+ private void writeGlossaryAppendix() {
+ if (!acronyms.isEmpty() && automaticGlossary) {
+ writer.writeStartElement("appendix"); //$NON-NLS-1$
+ writer.writeAttribute("id", "glossary"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeStartElement("title"); //$NON-NLS-1$
+ writer.writeAttribute("id", "glossary-end"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeCharacters(Messages.getString("DocBookDocumentBuilder.0")); //$NON-NLS-1$
+ writer.writeEndElement(); // title
+ writer.writeStartElement("glosslist"); //$NON-NLS-1$
+
+ for (Map.Entry<String, String> glossEntry : new TreeMap<String, String>(acronyms).entrySet()) {
+
+ writer.writeStartElement("glossentry"); //$NON-NLS-1$
+
+ writer.writeStartElement("glossterm"); //$NON-NLS-1$
+ writer.writeCharacters(glossEntry.getKey());
+ writer.writeEndElement(); // glossterm
+
+ writer.writeStartElement("glossdef"); //$NON-NLS-1$
+ writer.writeStartElement("para"); //$NON-NLS-1$
+ writer.writeCharacters(glossEntry.getValue());
+ writer.writeEndElement(); // para
+ writer.writeEndElement(); // glossdef
+
+ writer.writeEndElement(); // glossentry
+ }
+ writer.writeEndElement(); // glosslist
+ writer.writeEndElement(); // appendix
+ }
+ }
+
+ @Override
+ public void endSpan() {
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void characters(String text) {
+ ensureBlockElementsOpen();
+ super.characters(text);
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ ensureBlockElementsOpen();
+ // note: this *may* have HTML tags in it
+ writer.writeLiteral(literal);
+ // Logger.getLogger(DocBookDocumentBuilder.class.getName()).warning("HTML literal not supported in DocBook");
+ }
+
+ private void ensureBlockElementsOpen() {
+ if (!blockDescriptions.isEmpty()) {
+ BlockDescription blockDescription = blockDescriptions.peek();
+ if (blockDescription.entrySize == 0 && blockDescription.nestedElementNames != null) {
+ openBlockEntry(blockDescription, blockDescription.nestedElementNames);
+ }
+ }
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ ensureBlockElementsOpen();
+ if (entity.startsWith("#")) { //$NON-NLS-1$
+ String numeric = entity.substring(1);
+ int base = 10;
+ if (numeric.startsWith("x")) { //$NON-NLS-1$
+ numeric = entity.substring(1);
+ base = 16;
+ }
+ int unicodeValue = Integer.parseInt(numeric, base);
+ if (entityReferenceToUnicode.contains(unicodeValue)) {
+ writer.writeCharacters("" + ((char) unicodeValue)); //$NON-NLS-1$
+ return;
+ }
+ }
+ writer.writeEntityRef(entity);
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ ensureBlockElementsOpen();
+ String cssClass = attributes.getCssClass();
+ boolean inlined = false;
+ if (cssClass != null && CSS_CLASS_INLINE.matcher(cssClass).find()) {
+ inlined = true;
+ }
+ emitImage(attributes, url, inlined);
+ }
+
+ private void emitImage(Attributes attributes, String url, boolean inline) {
+ // see http://www.docbook.org/tdg/en/html/imagedata-x.html
+ ensureBlockElementsOpen();
+ writer.writeStartElement(inline ? "inlinemediaobject" : "mediaobject"); //$NON-NLS-1$ //$NON-NLS-2$
+ applyAttributes(attributes);
+ writer.writeStartElement("imageobject"); //$NON-NLS-1$
+ writer.writeEmptyElement("imagedata"); //$NON-NLS-1$
+ writer.writeAttribute("fileref", makeUrlAbsolute(url)); //$NON-NLS-1$
+ String cssStyle = attributes.getCssStyle();
+ if (cssStyle != null) {
+ String width = null;
+ String depth = null;
+ Iterator<CssRule> ruleIterator = new CssParser().createRuleIterator(cssStyle);
+ while (ruleIterator.hasNext()) {
+ CssRule rule = ruleIterator.next();
+ if ("width".equals(rule.name)) { //$NON-NLS-1$
+ width = rule.value;
+ } else if ("height".equals(rule.name)) { //$NON-NLS-1$
+ depth = rule.value;
+ }
+ }
+ if (width != null) {
+ Matcher matcher = PERCENTAGE.matcher(width);
+ if (matcher.matches()) {
+ writer.writeAttribute("scale", matcher.group(1)); //$NON-NLS-1$
+ } else {
+ writer.writeAttribute("width", width); //$NON-NLS-1$
+ if (depth != null) {
+ writer.writeAttribute("depth", depth); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ writer.writeEndElement(); // imageobject
+ writer.writeEndElement(); // inlinemediaobject or mediaobject
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, final Attributes imageAttributes, String href,
+ final String imageUrl) {
+ link(linkAttributes, href, new ContentEmitter() {
+ public void emit() {
+ emitImage(imageAttributes, imageUrl, true);
+ }
+ });
+ }
+
+ @Override
+ public void lineBreak() {
+ ensureBlockElementsOpen();
+ // no equivalent in DocBook.
+ characters("\n"); //$NON-NLS-1$
+ }
+
+ private BlockDescription findBlockDescription(BlockType type) {
+ for (int x = blockDescriptions.size() - 1; x >= 0; --x) {
+ BlockDescription blockDescription = blockDescriptions.get(x);
+ if (blockDescription.type == type) {
+ return blockDescription;
+ }
+ }
+ return null;
+ }
+
+ private static class BlockDescription {
+ BlockType type;
+
+ int size;
+
+ int entrySize; // the size of an entry, if it is open, otherwise 0
+
+ final String[] nestedElementNames;
+
+ final boolean closeElementsOnBlockStart;
+
+ public BlockDescription(BlockType type, int size, String[] nestedElementNames, boolean closeElementsOnBlockStart) {
+ this.size = size;
+ this.entrySize = nestedElementNames == null ? 0 : nestedElementNames.length;
+ this.type = type;
+ this.nestedElementNames = nestedElementNames;
+ this.closeElementsOnBlockStart = closeElementsOnBlockStart;
+ }
+ }
+
+ /**
+ * Indicate if this builder should generate an automatic glossary if acronyms are used. When the automatic glossary
+ * is enabled and acronyms are used in the document, then an <code>appendix</code> with title 'Glossary' is added to
+ * the document, with a <code>glosslist</code> generated for all of the acronyms that appear in the document.
+ *
+ * The default is true.
+ */
+ public boolean isAutomaticGlossary() {
+ return automaticGlossary;
+ }
+
+ /**
+ * Indicate if this builder should generate an automatic glossary if acronyms are used. When the automatic glossary
+ * is enabled and acronyms are used in the document, then an <code>appendix</code> with title 'Glossary' is added to
+ * the document, with a <code>glosslist</code> generated for all of the acronyms that appear in the document.
+ *
+ * The default is true.
+ */
+ public void setAutomaticGlossary(boolean automaticGlossary) {
+ this.automaticGlossary = automaticGlossary;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/EventLoggingDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/EventLoggingDocumentBuilder.java
new file mode 100644
index 0000000..dfee6cf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/EventLoggingDocumentBuilder.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.util.logging.Logger;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class EventLoggingDocumentBuilder extends DocumentBuilder {
+
+ private final Logger logger = Logger.getLogger(EventLoggingDocumentBuilder.class.getName());
+
+ private int blockDepth = 0;
+
+ @Override
+ public void acronym(String text, String definition) {
+ logger.info("ACRONYM:" + text + "," + definition); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ ++blockDepth;
+ logger.info("BLOCK START[" + blockDepth + "]:" + type); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public void beginDocument() {
+ logger.info("DOCUMENT START"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ logger.info("HEADING START:" + level); //$NON-NLS-1$
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ logger.info("SPAN START:" + type); //$NON-NLS-1$
+ }
+
+ @Override
+ public void characters(String text) {
+ logger.info("CHARACTERS:" + text); //$NON-NLS-1$
+ }
+
+ @Override
+ public void charactersUnescaped(String text) {
+ logger.info("HTML LITERAL:" + text); //$NON-NLS-1$
+ }
+
+ @Override
+ public void endBlock() {
+ logger.info("END BLOCK[" + blockDepth + "]"); //$NON-NLS-1$ //$NON-NLS-2$
+ --blockDepth;
+ }
+
+ @Override
+ public void endDocument() {
+ logger.info("END DOCUMENT"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void endHeading() {
+ logger.info("END HEADING"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void endSpan() {
+ logger.info("END SPAN"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ logger.info("ENTITY: " + entity); //$NON-NLS-1$
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ logger.info("IMAGE: " + url); //$NON-NLS-1$
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ logger.info("IMAGE LINK: " + href + ", " + imageUrl); //$NON-NLS-1$ //$NON-NLS-2$
+
+ }
+
+ @Override
+ public void lineBreak() {
+ logger.info("LINE BREAK"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ logger.info("LINK: " + hrefOrHashName + ", " + text); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/HtmlDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/HtmlDocumentBuilder.java
new file mode 100644
index 0000000..d8e7d6f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/HtmlDocumentBuilder.java
@@ -0,0 +1,1214 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.LinkAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.ListAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.QuoteAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableCellAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableRowAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes.Align;
+import org.eclipse.mylyn.wikitext.core.util.DefaultXmlStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.FormattingXMLStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ * A builder that produces XHTML output. The nature of the output is affected by various settings on the builder.
+ *
+ * @author David Green
+ * @author Matthias Kempka extensibility improvements, see bug 259089
+ * @since 1.0
+ */
+public class HtmlDocumentBuilder extends AbstractXmlDocumentBuilder {
+ private static final Pattern ABSOLUTE_URL_PATTERN = Pattern.compile("[a-zA-Z]{3,8}://?.*"); //$NON-NLS-1$
+
+ private static final Map<SpanType, String> spanTypeToElementName = new HashMap<SpanType, String>();
+ static {
+ spanTypeToElementName.put(SpanType.BOLD, "b"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.CITATION, "cite"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.ITALIC, "i"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.EMPHASIS, "em"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.STRONG, "strong"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.DELETED, "del"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.INSERTED, "ins"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.QUOTE, "q"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.UNDERLINED, "u"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.SUPERSCRIPT, "sup"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.SUBSCRIPT, "sub"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.SPAN, "span"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.CODE, "code"); //$NON-NLS-1$
+ spanTypeToElementName.put(SpanType.MONOSPACE, "tt"); //$NON-NLS-1$
+ }
+
+ private static final Map<BlockType, ElementInfo> blockTypeToElementInfo = new HashMap<BlockType, ElementInfo>();
+ static {
+ blockTypeToElementInfo.put(BlockType.BULLETED_LIST, new ElementInfo("ul")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.CODE, new ElementInfo("code")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.DIV, new ElementInfo("div")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.FOOTNOTE, new ElementInfo("footnote")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.LIST_ITEM, new ElementInfo("li")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.NUMERIC_LIST, new ElementInfo("ol")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.DEFINITION_LIST, new ElementInfo("dl")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.DEFINITION_TERM, new ElementInfo("dt")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.DEFINITION_ITEM, new ElementInfo("dd")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.PARAGRAPH, new ElementInfo("p")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.PREFORMATTED, new ElementInfo("pre")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.QUOTE, new ElementInfo("blockquote")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.TABLE, new ElementInfo("table")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.TABLE_CELL_HEADER, new ElementInfo("th")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.TABLE_CELL_NORMAL, new ElementInfo("td")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.TABLE_ROW, new ElementInfo("tr")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.TIP, new ElementInfo("div", "tip", //$NON-NLS-1$ //$NON-NLS-2$
+ "border: 1px solid #090;background-color: #dfd;margin: 20px;padding: 0px 6px 0px 6px;")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.WARNING, new ElementInfo("div", "warning", //$NON-NLS-1$ //$NON-NLS-2$
+ "border: 1px solid #c00;background-color: #fcc;margin: 20px;padding: 0px 6px 0px 6px;")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.INFORMATION, new ElementInfo("div", "info", //$NON-NLS-1$ //$NON-NLS-2$
+ "border: 1px solid #3c78b5;background-color: #D8E4F1;margin: 20px;padding: 0px 6px 0px 6px;")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.NOTE, new ElementInfo("div", "note", //$NON-NLS-1$ //$NON-NLS-2$
+ "border: 1px solid #F0C000;background-color: #FFFFCE;margin: 20px;padding: 0px 6px 0px 6px;")); //$NON-NLS-1$
+ blockTypeToElementInfo.put(BlockType.PANEL, new ElementInfo("div", "panel", //$NON-NLS-1$ //$NON-NLS-2$
+ "border: 1px solid #ccc;background-color: #FFFFCE;margin: 10px;padding: 0px 6px 0px 6px;")); //$NON-NLS-1$
+
+ }
+
+ private String htmlNsUri = "http://www.w3.org/1999/xhtml"; //$NON-NLS-1$
+
+ private String htmlDtd = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"; //$NON-NLS-1$
+
+ private boolean xhtmlStrict = false;
+
+ private boolean emitAsDocument = true;
+
+ private boolean emitDtd = false;
+
+ private String encoding = "utf-8"; //$NON-NLS-1$
+
+ private String title;
+
+ private String defaultAbsoluteLinkTarget;
+
+ private List<Stylesheet> stylesheets = null;
+
+ private boolean useInlineStyles = true;
+
+ private boolean suppressBuiltInStyles = false;
+
+ private String linkRel;
+
+ private String prependImagePrefix;
+
+ /**
+ * construct the HtmlDocumentBuilder.
+ *
+ * @param out
+ * the writer to which content is written
+ */
+ public HtmlDocumentBuilder(Writer out) {
+ this(out, false);
+ }
+
+ /**
+ * construct the HtmlDocumentBuilder.
+ *
+ * @param out
+ * the writer to which content is written
+ * @param formatting
+ * indicate if the output should be formatted
+ */
+ public HtmlDocumentBuilder(Writer out, boolean formatting) {
+ super(formatting ? createFormattingXmlStreamWriter(out) : new DefaultXmlStreamWriter(out));
+ }
+
+ /**
+ * construct the HtmlDocumentBuilder.
+ *
+ * @param writer
+ * the writer to which content is written
+ */
+ public HtmlDocumentBuilder(XmlStreamWriter writer) {
+ super(writer);
+ }
+
+ /**
+ * Copy the configuration of this builder to the provided one. After calling this method the configuration of the
+ * other builder should be the same as this one, including stylesheets. Subclasses that have configurable settings
+ * should override this method to ensure that those settings are properly copied.
+ *
+ * @param other
+ * the builder to which settings are copied.
+ */
+ public void copyConfiguration(HtmlDocumentBuilder other) {
+ other.setBase(getBase());
+ other.setBaseInHead(isBaseInHead());
+ other.setDefaultAbsoluteLinkTarget(getDefaultAbsoluteLinkTarget());
+ other.setEmitAsDocument(isEmitAsDocument());
+ other.setEmitDtd(isEmitDtd());
+ other.setHtmlDtd(getHtmlDtd());
+ other.setHtmlNsUri(getHtmlNsUri());
+ other.setLinkRel(getLinkRel());
+ other.setTitle(getTitle());
+ other.setUseInlineStyles(isUseInlineStyles());
+ other.setSuppressBuiltInStyles(isSuppressBuiltInStyles());
+ other.setXhtmlStrict(xhtmlStrict);
+ other.setPrependImagePrefix(prependImagePrefix);
+ if (stylesheets != null) {
+ other.stylesheets = new ArrayList<Stylesheet>();
+ other.stylesheets.addAll(stylesheets);
+ }
+ }
+
+ protected static XmlStreamWriter createFormattingXmlStreamWriter(Writer out) {
+ return new FormattingXMLStreamWriter(new DefaultXmlStreamWriter(out)) {
+ @Override
+ protected boolean preserveWhitespace(String elementName) {
+ return elementName.equals("pre") || elementName.equals("code"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ };
+ }
+
+ /**
+ * The XML Namespace URI of the HTML elements, only used if {@link #isEmitAsDocument()}. The default value is "
+ * <code>http://www.w3.org/1999/xhtml</code>".
+ */
+ public String getHtmlNsUri() {
+ return htmlNsUri;
+ }
+
+ /**
+ * The XML Namespace URI of the HTML elements, only used if {@link #isEmitAsDocument()}. The default value is "
+ * <code>http://www.w3.org/1999/xhtml</code>".
+ */
+ public void setHtmlNsUri(String htmlNsUri) {
+ this.htmlNsUri = htmlNsUri;
+ }
+
+ /**
+ * The DTD to emit, if {@link #isEmitDtd()} and {@link #isEmitAsDocument()}. The default value is
+ *
+ * <code><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></code>
+ */
+ public String getHtmlDtd() {
+ return htmlDtd;
+ }
+
+ /**
+ * The DTD to emit, if {@link #isEmitDtd()} and {@link #isEmitAsDocument()}.
+ *
+ * @see #getHtmlDtd()
+ */
+ public void setHtmlDtd(String htmlDtd) {
+ this.htmlDtd = htmlDtd;
+ }
+
+ /**
+ * Indicate if the resulting HTML should be emitted as a document. If false, the html and body tags are not included
+ * in the output. Default value is true.
+ */
+ public boolean isEmitAsDocument() {
+ return emitAsDocument;
+ }
+
+ /**
+ * Indicate if the resulting HTML should be emitted as a document. If false, the html and body tags are not included
+ * in the output. Default value is true.
+ */
+ public void setEmitAsDocument(boolean emitAsDocument) {
+ this.emitAsDocument = emitAsDocument;
+ }
+
+ /**
+ * Indicate if the resulting HTML should include a DTD. Ignored unless {@link #isEmitAsDocument()}. Default value is
+ * false.
+ */
+ public boolean isEmitDtd() {
+ return emitDtd;
+ }
+
+ /**
+ * Indicate if the resulting HTML should include a DTD. Ignored unless {@link #isEmitAsDocument()}. Default value is
+ * false.
+ */
+ public void setEmitDtd(boolean emitDtd) {
+ this.emitDtd = emitDtd;
+ }
+
+ /**
+ * Specify the character encoding for use in the HTML meta tag. For example, if the charset is specified as
+ * <code>"utf-8"</code>: <code><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></code>
+ *
+ * The default is <code>"utf-8"</code>.
+ *
+ * Ignored unless {@link #isEmitAsDocument()}
+ */
+ public String getEncoding() {
+ return encoding;
+ }
+
+ /**
+ * Specify the character encoding for use in the HTML meta tag. For example, if the charset is specified as
+ * <code>"utf-8"</code>: <code><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></code>
+ *
+ * The default is <code>"utf-8"</code>.
+ *
+ * @param encoding
+ * the character encoding to use, or null if the HTML meta tag should not be emitted
+ *
+ * Ignored unless {@link #isEmitAsDocument()}
+ */
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ /**
+ * Set the document title, which will be emitted into the <title> element. Ignored unless
+ * {@link #isEmitAsDocument()}
+ *
+ * @return the title or null if there is none
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * Set the document title, which will be emitted into the <title> element. Ignored unless
+ * {@link #isEmitAsDocument()}
+ *
+ * @param title
+ * the title or null if there is none
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * A default target attribute for links that have absolute (not relative) urls. By default this value is null.
+ * Setting this value will cause all HTML anchors to have their target attribute set if it's not explicitly
+ * specified in a {@link LinkAttributes}.
+ */
+ public String getDefaultAbsoluteLinkTarget() {
+ return defaultAbsoluteLinkTarget;
+ }
+
+ /**
+ * A default target attribute for links that have absolute (not relative) urls. By default this value is null.
+ * Setting this value will cause all HTML anchors to have their target attribute set if it's not explicitly
+ * specified in a {@link LinkAttributes}.
+ */
+ public void setDefaultAbsoluteLinkTarget(String defaultAbsoluteLinkTarget) {
+ this.defaultAbsoluteLinkTarget = defaultAbsoluteLinkTarget;
+ }
+
+ /**
+ * indicate if the builder should attempt to conform to strict XHTML rules. The default is false.
+ */
+ public boolean isXhtmlStrict() {
+ return xhtmlStrict;
+ }
+
+ /**
+ * indicate if the builder should attempt to conform to strict XHTML rules. The default is false.
+ */
+ public void setXhtmlStrict(boolean xhtmlStrict) {
+ this.xhtmlStrict = xhtmlStrict;
+ }
+
+ /**
+ * Add a CSS stylesheet to the output document as an URL, where the CSS stylesheet is referenced as an HTML link.
+ * Calling this method after {@link #beginDocument() starting the document} has no effect.
+ *
+ * Generates code similar to the following: <code>
+ * <link type="text/css" rel="stylesheet" href="url"/>
+ * </code>
+ *
+ * @param url
+ * the CSS url to use, which may be relative or absolute
+ *
+ * @return the stylesheet, whose attributes may be modified
+ *
+ * @see #addCssStylesheet(File)
+ *
+ * @deprecated use {@link #addCssStylesheet(Stylesheet)} instead
+ */
+ @Deprecated
+ public void addCssStylesheet(String url) {
+ addCssStylesheet(new Stylesheet(url));
+ }
+
+ /**
+ * Add a CSS stylesheet to the output document, where the contents of the CSS stylesheet are embedded in the HTML.
+ * Calling this method after {@link #beginDocument() starting the document} has no effect.
+ *
+ * Generates code similar to the following:
+ *
+ * <pre>
+ * <code>
+ * <style type="text/css">
+ * ... contents of the file ...
+ * </style>
+ * </code>
+ * </pre>
+ *
+ * @param file
+ * the CSS file whose contents must be available
+ *
+ * @return the stylesheet, whose attributes may be modified
+ *
+ * @see #addCssStylesheet(String)
+ *
+ * @deprecated use {@link #addCssStylesheet(Stylesheet)} instead
+ */
+ @Deprecated
+ public void addCssStylesheet(File file) {
+ addCssStylesheet(new Stylesheet(file));
+ }
+
+ /**
+ * Add a CSS stylesheet to the output document. Calling this method after {@link #beginDocument() starting the
+ * document} has no effect.
+ */
+ public void addCssStylesheet(Stylesheet stylesheet) {
+ if (stylesheet.file != null) {
+ checkFileReadable(stylesheet.file);
+ }
+
+ if (stylesheets == null) {
+ stylesheets = new ArrayList<Stylesheet>();
+ }
+ stylesheets.add(stylesheet);
+ }
+
+ protected void checkFileReadable(File file) {
+ if (!file.exists()) {
+ throw new IllegalArgumentException(MessageFormat.format(Messages.getString("HtmlDocumentBuilder.3"), file)); //$NON-NLS-1$
+ }
+ if (!file.isFile()) {
+ throw new IllegalArgumentException(MessageFormat.format(Messages.getString("HtmlDocumentBuilder.1"), file)); //$NON-NLS-1$
+ }
+ if (!file.canRead()) {
+ throw new IllegalArgumentException(MessageFormat.format(Messages.getString("HtmlDocumentBuilder.2"), file)); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Indicate if inline styles should be used when creating output such as text boxes. When disabled inline styles are
+ * suppressed and CSS classes are used instead, with the default styles emitted as a stylesheet in the document
+ * head. If disabled and {@link #isEmitAsDocument()} is false, this option has the same effect as
+ * {@link #isSuppressBuiltInStyles()}.
+ *
+ * The default is true.
+ *
+ * @see #isSuppressBuiltInStyles()
+ */
+ public boolean isUseInlineStyles() {
+ return useInlineStyles;
+ }
+
+ /**
+ * Indicate if inline styles should be used when creating output such as text boxes. When disabled inline styles are
+ * suppressed and CSS classes are used instead, with the default styles emitted as a stylesheet in the document
+ * head. If disabled and {@link #isEmitAsDocument()} is false, this option has the same effect as
+ * {@link #isSuppressBuiltInStyles()}.
+ *
+ * The default is true.
+ */
+ public void setUseInlineStyles(boolean useInlineStyles) {
+ this.useInlineStyles = useInlineStyles;
+ }
+
+ /**
+ * indicate if default built-in CSS styles should be suppressed. Built-in styles are styles that are emitted by this
+ * builder to create the desired visual effect when rendering certain types of elements, such as warnings or infos.
+ * the default is false.
+ *
+ * @see #isUseInlineStyles()
+ */
+ public boolean isSuppressBuiltInStyles() {
+ return suppressBuiltInStyles;
+ }
+
+ /**
+ * indicate if default built-in CSS styles should be suppressed. Built-in styles are styles that are emitted by this
+ * builder to create the desired visual effect when rendering certain types of elements, such as warnings or infos.
+ * the default is false.
+ */
+ public void setSuppressBuiltInStyles(boolean suppressBuiltInStyles) {
+ this.suppressBuiltInStyles = suppressBuiltInStyles;
+ }
+
+ /**
+ * The 'rel' value for HTML links. If specified the value is applied to all links generated by the builder. The
+ * default value is null.
+ *
+ * Setting this value to "nofollow" is recommended for rendering HTML in areas where users may add links, for
+ * example in a blog comment. See <a
+ * href="http://en.wikipedia.org/wiki/Nofollow">http://en.wikipedia.org/wiki/Nofollow</a> for more information.
+ *
+ * @return the rel or null if there is none.
+ * @see LinkAttributes#getRel()
+ */
+ public String getLinkRel() {
+ return linkRel;
+ }
+
+ /**
+ * The 'rel' value for HTML links. If specified the value is applied to all links generated by the builder. The
+ * default value is null.
+ *
+ * Setting this value to "nofollow" is recommended for rendering HTML in areas where users may add links, for
+ * example in a blog comment. See <a
+ * href="http://en.wikipedia.org/wiki/Nofollow">http://en.wikipedia.org/wiki/Nofollow</a> for more information.
+ *
+ * @param linkRel
+ * the rel or null if there is none.
+ *
+ * @see LinkAttributes#getRel()
+ */
+ public void setLinkRel(String linkRel) {
+ this.linkRel = linkRel;
+ }
+
+ @Override
+ public void beginDocument() {
+ writer.setDefaultNamespace(htmlNsUri);
+
+ if (emitAsDocument) {
+ if (encoding != null && encoding.length() > 0) {
+ writer.writeStartDocument(encoding, "1.0"); //$NON-NLS-1$
+ } else {
+ writer.writeStartDocument();
+ }
+
+ if (emitDtd && htmlDtd != null) {
+ writer.writeDTD(htmlDtd);
+ }
+
+ writer.writeStartElement(htmlNsUri, "html"); //$NON-NLS-1$
+ writer.writeDefaultNamespace(htmlNsUri);
+
+ writer.writeStartElement(htmlNsUri, "head"); //$NON-NLS-1$
+ emitHeadContents();
+ writer.writeEndElement(); // head
+ beginBody();
+ } else {
+ // sanity check
+ if (stylesheets != null && !stylesheets.isEmpty()) {
+ throw new IllegalStateException(Messages.getString("HtmlDocumentBuilder.0")); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * emit the contents of the HTML head, excluding the head tag itself. Subclasses may override to change the contents
+ * of the head. Subclasses should consider calling <code>super.emitHeadContents()</code> in order to preserve
+ * features such as emitting the base, title and stylesheets.
+ */
+ protected void emitHeadContents() {
+ if (encoding != null && encoding.length() > 0) {
+ // bug 259786: add the charset as a HTML meta http-equiv
+ // see http://www.w3.org/International/tutorials/tutorial-char-enc/
+ //
+ // <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ writer.writeEmptyElement(htmlNsUri, "meta"); //$NON-NLS-1$
+ writer.writeAttribute("http-equiv", "Content-Type"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("content", String.format("text/html; charset=%s", encoding)); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ if (base != null && baseInHead) {
+ writer.writeEmptyElement(htmlNsUri, "base"); //$NON-NLS-1$
+ writer.writeAttribute("href", base.toString()); //$NON-NLS-1$
+ }
+ if (title != null) {
+ writer.writeStartElement(htmlNsUri, "title"); //$NON-NLS-1$
+ writer.writeCharacters(title);
+ writer.writeEndElement(); // title
+ }
+ if (!useInlineStyles && !suppressBuiltInStyles) {
+ writer.writeStartElement(htmlNsUri, "style"); //$NON-NLS-1$
+ writer.writeAttribute("type", "text/css"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeCharacters("\n"); //$NON-NLS-1$
+ for (Entry<BlockType, ElementInfo> ent : blockTypeToElementInfo.entrySet()) {
+ ElementInfo elementInfo = ent.getValue();
+ if (elementInfo.cssStyles != null && elementInfo.cssClass != null) {
+ String[] classes = elementInfo.cssClass.split("\\s+"); //$NON-NLS-1$
+ for (String cssClass : classes) {
+ writer.writeCharacters("."); //$NON-NLS-1$
+ writer.writeCharacters(cssClass);
+ writer.writeCharacters(" "); //$NON-NLS-1$
+ }
+ writer.writeCharacters("{"); //$NON-NLS-1$
+ writer.writeCharacters(elementInfo.cssStyles);
+ writer.writeCharacters("}\n"); //$NON-NLS-1$
+ }
+ }
+ writer.writeEndElement();
+ }
+ if (stylesheets != null) {
+ for (Stylesheet stylesheet : stylesheets) {
+ emitStylesheet(stylesheet);
+ }
+ }
+ }
+
+ private void emitStylesheet(Stylesheet stylesheet) {
+ if (stylesheet.url != null) {
+ // <link type="text/css" rel="stylesheet" href="url"/>
+ writer.writeEmptyElement(htmlNsUri, "link"); //$NON-NLS-1$
+ writer.writeAttribute("type", "text/css"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("rel", "stylesheet"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("href", makeUrlAbsolute(stylesheet.url)); //$NON-NLS-1$
+ for (Entry<String, String> attr : stylesheet.attributes.entrySet()) {
+ String attrName = attr.getKey();
+ if (!"type".equals(attrName) && !"rel".equals(attrName) && !"href".equals(attrName)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ writer.writeAttribute(attrName, attr.getValue());
+ }
+ }
+ } else {
+ // <style type="text/css">
+ // ... contents of the file ...
+ // </style>
+ writer.writeStartElement(htmlNsUri, "style"); //$NON-NLS-1$
+ writer.writeAttribute("type", "text/css"); //$NON-NLS-1$ //$NON-NLS-2$
+ for (Entry<String, String> attr : stylesheet.attributes.entrySet()) {
+ String attrName = attr.getKey();
+ if (!"type".equals(attrName)) { //$NON-NLS-1$
+ writer.writeAttribute(attrName, attr.getValue());
+ }
+ }
+
+ String css;
+ if (stylesheet.file != null) {
+ try {
+ css = readFully(stylesheet.file);
+ } catch (IOException e) {
+ throw new IllegalStateException(MessageFormat.format(Messages.getString("HtmlDocumentBuilder.4"), //$NON-NLS-1$
+ stylesheet.file), e);
+ }
+ } else {
+ try {
+ css = readFully(stylesheet.reader, 1024);
+ } catch (IOException e) {
+ throw new IllegalStateException(Messages.getString("HtmlDocumentBuilder.5"), e); //$NON-NLS-1$
+ }
+ }
+ writer.writeCharacters(css);
+ writer.writeEndElement();
+ }
+ }
+
+ @Override
+ public void endDocument() {
+ if (emitAsDocument) {
+ endBody();
+ writer.writeEndElement(); // html
+ writer.writeEndDocument();
+ }
+
+ writer.close();
+ }
+
+ /**
+ * begin the body by emitting the body element. Overriding methods should call <code>super.beginBody()</code>.
+ *
+ * @see #endBody()
+ */
+ protected void beginBody() {
+ writer.writeStartElement(htmlNsUri, "body"); //$NON-NLS-1$
+ }
+
+ /**
+ * end the body by emitting the body end element tag. Overriding methods should call <code>super.endBody()</code>.
+ *
+ * @see #beginBody()
+ */
+ protected void endBody() {
+ writer.writeEndElement(); // body
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ writer.writeEntityRef(entity);
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ writer.writeStartElement(htmlNsUri, "acronym"); //$NON-NLS-1$
+ writer.writeAttribute("title", definition); //$NON-NLS-1$
+ writer.writeCharacters(text);
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ writer.writeStartElement(htmlNsUri, "a"); //$NON-NLS-1$
+ emitAnchorHref(hrefOrHashName);
+ applyLinkAttributes(attributes, hrefOrHashName);
+ characters(text);
+ writer.writeEndElement(); // a
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ ElementInfo elementInfo = blockTypeToElementInfo.get(type);
+ if (elementInfo == null) {
+ throw new IllegalStateException(type.name());
+ }
+ writer.writeStartElement(htmlNsUri, elementInfo.name);
+ if (elementInfo.cssClass != null) {
+ if (attributes.getCssClass() == null) {
+ attributes.setCssClass(elementInfo.cssClass);
+ } else {
+ attributes.setCssClass(elementInfo.cssClass + ' ' + attributes.getCssClass());
+ }
+ }
+ if (useInlineStyles && !suppressBuiltInStyles && elementInfo.cssStyles != null) {
+ if (attributes.getCssStyle() == null) {
+ attributes.setCssStyle(elementInfo.cssStyles);
+ } else {
+ attributes.setCssStyle(elementInfo.cssStyles + attributes.getCssStyle());
+ }
+ }
+ if (type == BlockType.TABLE) {
+ applyTableAttributes(attributes);
+ } else if (type == BlockType.TABLE_ROW) {
+ applyTableRowAttributes(attributes);
+ } else if (type == BlockType.TABLE_CELL_HEADER || type == BlockType.TABLE_CELL_NORMAL) {
+ applyCellAttributes(attributes);
+ } else if (type == BlockType.BULLETED_LIST || type == BlockType.NUMERIC_LIST) {
+ applyListAttributes(attributes);
+ } else if (type == BlockType.QUOTE) {
+ applyQuoteAttributes(attributes);
+ } else {
+ applyAttributes(attributes);
+
+ // create the titled panel effect if a title is specified
+ if (attributes.getTitle() != null) {
+ beginBlock(BlockType.PARAGRAPH, new Attributes());
+ beginSpan(SpanType.BOLD, new Attributes());
+ characters(attributes.getTitle());
+ endSpan();
+ endBlock();
+ }
+ }
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ if (level > 6) {
+ level = 6;
+ }
+ writer.writeStartElement(htmlNsUri, "h" + level); //$NON-NLS-1$
+ applyAttributes(attributes);
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ String elementName = spanTypeToElementName.get(type);
+ if (elementName == null) {
+ throw new IllegalStateException(type.name());
+ }
+ writer.writeStartElement(htmlNsUri, elementName);
+ applyAttributes(attributes);
+ }
+
+ @Override
+ public void endBlock() {
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void endHeading() {
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void endSpan() {
+ writer.writeEndElement();
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ writer.writeEmptyElement(htmlNsUri, "img"); //$NON-NLS-1$
+ applyImageAttributes(attributes);
+ url = prependImageUrl(url);
+ writer.writeAttribute("src", makeUrlAbsolute(url)); //$NON-NLS-1$
+ }
+
+ private void applyListAttributes(Attributes attributes) {
+ applyAttributes(attributes);
+ if (attributes instanceof ListAttributes) {
+ ListAttributes listAttributes = (ListAttributes) attributes;
+ if (listAttributes.getStart() != null) {
+ writer.writeAttribute("start", listAttributes.getStart()); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void applyQuoteAttributes(Attributes attributes) {
+ applyAttributes(attributes);
+ if (attributes instanceof QuoteAttributes) {
+ QuoteAttributes quoteAttributes = (QuoteAttributes) attributes;
+ if (quoteAttributes.getCitation() != null) {
+ writer.writeAttribute("cite", quoteAttributes.getCitation()); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void applyTableAttributes(Attributes attributes) {
+ applyAttributes(attributes);
+ if (attributes.getTitle() != null) {
+ writer.writeAttribute("title", attributes.getTitle()); //$NON-NLS-1$
+ }
+ if (attributes instanceof TableAttributes) {
+ TableAttributes tableAttributes = (TableAttributes) attributes;
+ if (tableAttributes.getBgcolor() != null) {
+ writer.writeAttribute("bgcolor", tableAttributes.getBgcolor()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getBorder() != null) {
+ writer.writeAttribute("border", tableAttributes.getBorder()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getCellpadding() != null) {
+ writer.writeAttribute("cellpadding", tableAttributes.getCellpadding()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getCellspacing() != null) {
+ writer.writeAttribute("cellspacing", tableAttributes.getCellspacing()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getFrame() != null) {
+ writer.writeAttribute("frame", tableAttributes.getFrame()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getRules() != null) {
+ writer.writeAttribute("rules", tableAttributes.getRules()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getSummary() != null) {
+ writer.writeAttribute("summary", tableAttributes.getSummary()); //$NON-NLS-1$
+ }
+ if (tableAttributes.getWidth() != null) {
+ writer.writeAttribute("width", tableAttributes.getWidth()); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void applyTableRowAttributes(Attributes attributes) {
+ applyAttributes(attributes);
+ if (attributes.getTitle() != null) {
+ writer.writeAttribute("title", attributes.getTitle()); //$NON-NLS-1$
+ }
+ if (attributes instanceof TableRowAttributes) {
+ TableRowAttributes tableRowAttributes = (TableRowAttributes) attributes;
+ if (tableRowAttributes.getBgcolor() != null) {
+ writer.writeAttribute("bgcolor", tableRowAttributes.getBgcolor()); //$NON-NLS-1$
+ }
+ if (tableRowAttributes.getAlign() != null) {
+ writer.writeAttribute("align", tableRowAttributes.getAlign()); //$NON-NLS-1$
+ }
+ if (tableRowAttributes.getValign() != null) {
+ writer.writeAttribute("valign", tableRowAttributes.getValign()); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void applyCellAttributes(Attributes attributes) {
+ applyAttributes(attributes);
+ if (attributes.getTitle() != null) {
+ writer.writeAttribute("title", attributes.getTitle()); //$NON-NLS-1$
+ }
+
+ if (attributes instanceof TableCellAttributes) {
+ TableCellAttributes tableCellAttributes = (TableCellAttributes) attributes;
+ if (tableCellAttributes.getBgcolor() != null) {
+ writer.writeAttribute("bgcolor", tableCellAttributes.getBgcolor()); //$NON-NLS-1$
+ }
+ if (tableCellAttributes.getAlign() != null) {
+ writer.writeAttribute("align", tableCellAttributes.getAlign()); //$NON-NLS-1$
+ }
+ if (tableCellAttributes.getValign() != null) {
+ writer.writeAttribute("valign", tableCellAttributes.getValign()); //$NON-NLS-1$
+ }
+ if (tableCellAttributes.getRowspan() != null) {
+ writer.writeAttribute("rowspan", tableCellAttributes.getRowspan()); //$NON-NLS-1$
+ }
+ if (tableCellAttributes.getColspan() != null) {
+ writer.writeAttribute("colspan", tableCellAttributes.getColspan()); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void applyImageAttributes(Attributes attributes) {
+ int border = 0;
+ Align align = null;
+ if (attributes instanceof ImageAttributes) {
+ ImageAttributes imageAttributes = (ImageAttributes) attributes;
+ border = imageAttributes.getBorder();
+ align = imageAttributes.getAlign();
+ }
+ if (xhtmlStrict) {
+ String borderStyle = String.format("border-width: %spx;", border); //$NON-NLS-1$
+ String alignStyle = null;
+ if (align != null) {
+ switch (align) {
+ case Center:
+ case Right:
+ case Left:
+ alignStyle = "text-align: " + align.name().toLowerCase() + ";"; //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case Bottom:
+ case Baseline:
+ case Top:
+ case Middle:
+ alignStyle = "vertical-align: " + align.name().toLowerCase() + ";"; //$NON-NLS-1$ //$NON-NLS-2$
+ break;
+ case Texttop:
+ alignStyle = "vertical-align: text-top;"; //$NON-NLS-1$
+ break;
+ case Absmiddle:
+ alignStyle = "vertical-align: middle;"; //$NON-NLS-1$
+ break;
+ case Absbottom:
+ alignStyle = "vertical-align: bottom;"; //$NON-NLS-1$
+ break;
+ }
+ }
+ String additionalStyles = borderStyle;
+ if (alignStyle != null) {
+ additionalStyles += alignStyle;
+ }
+ if (attributes.getCssStyle() == null || attributes.getCssStyle().length() == 0) {
+ attributes.setCssStyle(additionalStyles);
+ } else {
+ attributes.setCssStyle(additionalStyles + attributes.getCssStyle());
+ }
+ }
+ applyAttributes(attributes);
+ boolean haveAlt = false;
+
+ if (attributes instanceof ImageAttributes) {
+ ImageAttributes imageAttributes = (ImageAttributes) attributes;
+ if (imageAttributes.getHeight() != -1) {
+ writer.writeAttribute("height", Integer.toString(imageAttributes.getHeight())); //$NON-NLS-1$
+ }
+ if (imageAttributes.getWidth() != -1) {
+ writer.writeAttribute("width", Integer.toString(imageAttributes.getWidth())); //$NON-NLS-1$
+ }
+ if (!xhtmlStrict && align != null) {
+ writer.writeAttribute("align", align.name().toLowerCase()); //$NON-NLS-1$
+ }
+ if (imageAttributes.getAlt() != null) {
+ haveAlt = true;
+ writer.writeAttribute("alt", imageAttributes.getAlt()); //$NON-NLS-1$
+ }
+ }
+ if (attributes.getTitle() != null) {
+ writer.writeAttribute("title", attributes.getTitle()); //$NON-NLS-1$
+ if (!haveAlt) {
+ haveAlt = true;
+ writer.writeAttribute("alt", attributes.getTitle()); //$NON-NLS-1$
+ }
+ }
+ if (xhtmlStrict) {
+ if (!haveAlt) {
+ // XHTML requires img/@alt
+ writer.writeAttribute("alt", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else {
+ // only specify border attribute if it's not already specified in CSS
+ writer.writeAttribute("border", Integer.toString(border)); //$NON-NLS-1$
+ }
+ }
+
+ private void applyLinkAttributes(Attributes attributes, String href) {
+ applyAttributes(attributes);
+ boolean hasTarget = false;
+ String rel = linkRel;
+ if (attributes instanceof LinkAttributes) {
+ LinkAttributes linkAttributes = (LinkAttributes) attributes;
+ if (linkAttributes.getTarget() != null) {
+ hasTarget = true;
+ writer.writeAttribute("target", linkAttributes.getTarget()); //$NON-NLS-1$
+ }
+ if (linkAttributes.getRel() != null) {
+ rel = rel == null ? linkAttributes.getRel() : linkAttributes.getRel() + ' ' + rel;
+ }
+
+ }
+ if (attributes.getTitle() != null && attributes.getTitle().length() > 0) {
+ writer.writeAttribute("title", attributes.getTitle()); //$NON-NLS-1$
+ }
+ if (!hasTarget && defaultAbsoluteLinkTarget != null && href != null) {
+ if (isExternalLink(href)) {
+ writer.writeAttribute("target", defaultAbsoluteLinkTarget); //$NON-NLS-1$
+ }
+ }
+
+ if (rel != null) {
+ writer.writeAttribute("rel", rel); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Note: this method does not apply the {@link Attributes#getTitle() title}.
+ */
+ private void applyAttributes(Attributes attributes) {
+ if (attributes.getId() != null) {
+ writer.writeAttribute("id", attributes.getId()); //$NON-NLS-1$
+ }
+ if (attributes.getCssClass() != null) {
+ writer.writeAttribute("class", attributes.getCssClass()); //$NON-NLS-1$
+ }
+ if (attributes.getCssStyle() != null) {
+ writer.writeAttribute("style", attributes.getCssStyle()); //$NON-NLS-1$
+ }
+ if (attributes.getLanguage() != null) {
+ writer.writeAttribute("lang", attributes.getLanguage()); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ writer.writeStartElement(htmlNsUri, "a"); //$NON-NLS-1$
+ emitAnchorHref(href);
+ applyLinkAttributes(linkAttributes, href);
+ writer.writeEmptyElement(htmlNsUri, "img"); //$NON-NLS-1$
+ applyImageAttributes(imageAttributes);
+ imageUrl = prependImageUrl(imageUrl);
+ writer.writeAttribute("src", makeUrlAbsolute(imageUrl)); //$NON-NLS-1$
+ writer.writeEndElement(); // a
+ }
+
+ /**
+ * emit the href attribute of an anchor. Subclasses may override to alter the default href or to add other
+ * attributes such as <code>onclick</code>.
+ *
+ * Overriding classes should pass the href to {@link #makeUrlAbsolute(String)} prior to writing it to the writer.
+ *
+ * @param href
+ * the url for the href attribute
+ */
+ protected void emitAnchorHref(String href) {
+ writer.writeAttribute("href", makeUrlAbsolute(href)); //$NON-NLS-1$
+ }
+
+ private String prependImageUrl(String imageUrl) {
+ if (prependImagePrefix == null || prependImagePrefix.length() == 0) {
+ return imageUrl;
+ }
+ if (ABSOLUTE_URL_PATTERN.matcher(imageUrl).matches()) {
+ return imageUrl;
+ }
+ String url = prependImagePrefix;
+ if (!prependImagePrefix.endsWith("/")) { //$NON-NLS-1$
+ url += '/';
+ }
+ url += imageUrl;
+ return url;
+ }
+
+ @Override
+ public void lineBreak() {
+ writer.writeEmptyElement(htmlNsUri, "br"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ writer.writeLiteral(literal);
+ }
+
+ private static final class ElementInfo {
+ final String name;
+
+ final String cssClass;
+
+ final String cssStyles;
+
+ public ElementInfo(String name, String cssClass, String cssStyles) {
+ this.name = name;
+ this.cssClass = cssClass;
+ this.cssStyles = cssStyles != null && !cssStyles.endsWith(";") ? cssStyles + ';' : cssStyles; //$NON-NLS-1$
+ }
+
+ public ElementInfo(String name) {
+ this(name, null, null);
+ }
+ }
+
+ /**
+ * A CSS stylesheet definition, created via one of {@link HtmlDocumentBuilder#addCssStylesheet(File)} or
+ * {@link HtmlDocumentBuilder#addCssStylesheet(String)}.
+ *
+ */
+ public static class Stylesheet {
+ private final String url;
+
+ private final File file;
+
+ private final Reader reader;
+
+ private final Map<String, String> attributes = new HashMap<String, String>();
+
+ /**
+ * Create a CSS stylesheet where the contents of the CSS stylesheet are embedded in the HTML. Generates code
+ * similar to the following:
+ *
+ * <pre>
+ * <code>
+ * <style type="text/css">
+ * ... contents of the file ...
+ * </style>
+ * </code>
+ * </pre>
+ *
+ * @param file
+ * the CSS file whose contents must be available
+ */
+ public Stylesheet(File file) {
+ if (file == null) {
+ throw new IllegalArgumentException();
+ }
+ this.file = file;
+ url = null;
+ reader = null;
+ }
+
+ /**
+ * Create a CSS stylesheet to the output document as an URL where the CSS stylesheet is referenced as an HTML
+ * link. Calling this method after {@link #beginDocument() starting the document} has no effect.
+ *
+ * Generates code similar to the following:
+ *
+ * <pre>
+ * <link type="text/css" rel="stylesheet" href="url"/>
+ * </pre>
+ *
+ * @param url
+ * the CSS url to use, which may be relative or absolute
+ *
+ */
+ public Stylesheet(String url) {
+ if (url == null || url.length() == 0) {
+ throw new IllegalArgumentException();
+ }
+ this.url = url;
+ file = null;
+ reader = null;
+ }
+
+ /**
+ * Create a CSS stylesheet where the contents of the CSS stylesheet are embedded in the HTML. Generates code
+ * similar to the following:
+ *
+ * <pre>
+ * <code>
+ * <style type="text/css">
+ * ... contents of the file ...
+ * </style>
+ * </code>
+ * </pre>
+ *
+ * The caller is responsible for closing the reader.
+ *
+ * @param reader
+ * the reader from which content is provided.
+ */
+ public Stylesheet(Reader reader) {
+ if (reader == null) {
+ throw new IllegalArgumentException();
+ }
+ this.reader = reader;
+ file = null;
+ url = null;
+ }
+
+ /**
+ * the attributes of the stylesheet, which may be modified prior to adding to the document. Attributes
+ * <code>href</code>, <code>type</code> and <code>rel</code> are all ignored.
+ */
+ public Map<String, String> getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * the file of the stylesheet, or null if it's not defined
+ */
+ public File getFile() {
+ return file;
+ }
+
+ /**
+ * the url of the stylesheet, or null if it's not defined
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * the content reader, or null if it's not defined.
+ */
+ public Reader getReader() {
+ return reader;
+ }
+ }
+
+ private String readFully(File inputFile) throws IOException {
+ int length = (int) inputFile.length();
+ if (length <= 0) {
+ length = 2048;
+ }
+ return readFully(getReader(inputFile), length);
+ }
+
+ private String readFully(Reader input, int bufferSize) throws IOException {
+ StringBuilder buf = new StringBuilder(bufferSize);
+ try {
+ Reader reader = new BufferedReader(input);
+ int c;
+ while ((c = reader.read()) != -1) {
+ buf.append((char) c);
+ }
+ } finally {
+ input.close();
+ }
+ return buf.toString();
+ }
+
+ protected Reader getReader(File inputFile) throws FileNotFoundException {
+ return new FileReader(inputFile);
+ }
+
+ /**
+ * if specified, the prefix is prepended to relative image urls.
+ */
+ public void setPrependImagePrefix(String prependImagePrefix) {
+ this.prependImagePrefix = prependImagePrefix;
+ }
+
+ /**
+ * if specified, the prefix is prepended to relative image urls.
+ */
+ public String getPrependImagePrefix() {
+ return prependImagePrefix;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/Messages.java
new file mode 100644
index 0000000..8dad3a4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.wikitext.core.parser.builder.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/MultiplexingDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/MultiplexingDocumentBuilder.java
new file mode 100644
index 0000000..8032cd5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/MultiplexingDocumentBuilder.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.Locator;
+
+/**
+ * A document builder that dispatches events to one or more delegates.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MultiplexingDocumentBuilder extends DocumentBuilder {
+
+ private final List<DocumentBuilder> builders = new ArrayList<DocumentBuilder>();
+
+ public MultiplexingDocumentBuilder(DocumentBuilder... delegates) {
+ builders.addAll(Arrays.asList(delegates));
+ }
+
+ public void addDocumentBuilder(DocumentBuilder delegate) {
+ builders.add(delegate);
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ for (DocumentBuilder builder : builders) {
+ builder.acronym(text, definition);
+ }
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ for (DocumentBuilder builder : builders) {
+ builder.beginBlock(type, attributes);
+ }
+ }
+
+ @Override
+ public void beginDocument() {
+ for (DocumentBuilder builder : builders) {
+ builder.beginDocument();
+ }
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ for (DocumentBuilder builder : builders) {
+ builder.beginHeading(level, attributes);
+ }
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ for (DocumentBuilder builder : builders) {
+ builder.beginSpan(type, attributes);
+ }
+ }
+
+ @Override
+ public void characters(String text) {
+ for (DocumentBuilder builder : builders) {
+ builder.characters(text);
+ }
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ for (DocumentBuilder builder : builders) {
+ builder.charactersUnescaped(literal);
+ }
+ }
+
+ @Override
+ public void endBlock() {
+ for (DocumentBuilder builder : builders) {
+ builder.endBlock();
+ }
+ }
+
+ @Override
+ public void endDocument() {
+ for (DocumentBuilder builder : builders) {
+ builder.endDocument();
+ }
+ }
+
+ @Override
+ public void endHeading() {
+ for (DocumentBuilder builder : builders) {
+ builder.endHeading();
+ }
+ }
+
+ @Override
+ public void endSpan() {
+ for (DocumentBuilder builder : builders) {
+ builder.endSpan();
+ }
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ for (DocumentBuilder builder : builders) {
+ builder.entityReference(entity);
+ }
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ for (DocumentBuilder builder : builders) {
+ builder.image(attributes, url);
+ }
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ for (DocumentBuilder builder : builders) {
+ builder.imageLink(linkAttributes, imageAttributes, href, imageUrl);
+ }
+ }
+
+ @Override
+ public void lineBreak() {
+ for (DocumentBuilder builder : builders) {
+ builder.lineBreak();
+ }
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ for (DocumentBuilder builder : builders) {
+ builder.link(attributes, hrefOrHashName, text);
+ }
+ }
+
+ @Override
+ public void setLocator(Locator locator) {
+ super.setLocator(locator);
+ for (DocumentBuilder builder : builders) {
+ builder.setLocator(locator);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/NoOpDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/NoOpDocumentBuilder.java
new file mode 100644
index 0000000..53b5d69
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/NoOpDocumentBuilder.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+
+/**
+ * A document builder that does nothing. Generally used when parsing should have other side-effects but the output is
+ * not of interest.
+ *
+ * @author David Green
+ */
+public class NoOpDocumentBuilder extends DocumentBuilder {
+
+ @Override
+ public void acronym(String text, String definition) {
+ // ignore
+
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ // ignore
+
+ }
+
+ @Override
+ public void beginDocument() {
+ // ignore
+
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ // ignore
+
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ // ignore
+
+ }
+
+ @Override
+ public void characters(String text) {
+ // ignore
+
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ // ignore
+
+ }
+
+ @Override
+ public void endBlock() {
+ // ignore
+
+ }
+
+ @Override
+ public void endDocument() {
+ // ignore
+
+ }
+
+ @Override
+ public void endHeading() {
+ // ignore
+
+ }
+
+ @Override
+ public void endSpan() {
+ // ignore
+
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ // ignore
+
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ // ignore
+
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ // ignore
+
+ }
+
+ @Override
+ public void lineBreak() {
+ // ignore
+
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ // ignore
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/XslfoDocumentBuilder.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/XslfoDocumentBuilder.java
new file mode 100644
index 0000000..c48273a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/XslfoDocumentBuilder.java
@@ -0,0 +1,1146 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.Writer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+import java.util.TreeMap;
+import java.util.Map.Entry;
+import java.util.logging.Logger;
+
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.ListAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableAttributes;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ * A document builder that produces XSL-FO output. XSL-FO is suitable for conversion to other formats such as PDF.
+ *
+ *
+ * @see XslfoDocumentBuilder.Configuration Configuration for configurable settings
+ *
+ * @see <a href="http://www.w3.org/TR/2001/REC-xsl-20011015/">XSL-FO 1.0 specification</a>
+ * @see <a href="http://en.wikipedia.org/wiki/XSL_Formatting_Objects">XSL-FO (WikiPedia)</a>
+ * @see <a href="http://www.w3schools.com/xslfo/default.asp">XSL-FO Tutorial</a>
+ *
+ * @author David Green
+ *
+ * @since 1.1
+ */
+public class XslfoDocumentBuilder extends AbstractXmlDocumentBuilder {
+
+ private static final String CSS_RULE_BACKGROUND_COLOR = "background-color"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_COLOR = "color"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_VERTICAL_ALIGN = "vertical-align"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_TEXT_DECORATION = "text-decoration"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_FONT_FAMILY = "font-family"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_FONT_SIZE = "font-size"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_FONT_WEIGHT = "font-weight"; //$NON-NLS-1$
+
+ private static final String CSS_RULE_FONT_STYLE = "font-style"; //$NON-NLS-1$
+
+ private static final char[] BULLET_CHARS = new char[] { '\u2022' };
+
+ private static Map<BlockType, String> blockTypeToCssStyles = new HashMap<BlockType, String>();
+ static {
+ blockTypeToCssStyles.put(BlockType.CODE, "font-family: monospace;"); //$NON-NLS-1$
+ blockTypeToCssStyles.put(BlockType.PREFORMATTED, "font-family: monospace;"); //$NON-NLS-1$
+ blockTypeToCssStyles.put(BlockType.TABLE_CELL_HEADER, "font-weight: bold;"); //$NON-NLS-1$
+ }
+
+ private static Map<SpanType, String> spanTypeToCssStyles = new HashMap<SpanType, String>();
+ static {
+ spanTypeToCssStyles.put(SpanType.STRONG, "font-weight: bold;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.BOLD, "font-weight: bold;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.MONOSPACE, "font-family: monospace;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.CODE, "font-family: monospace;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.CITATION, "font-style: italic;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.EMPHASIS, "font-style: italic;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.ITALIC, "font-style: italic;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.DELETED, "text-decoration: line-through;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.INSERTED, "text-decoration: underline;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.UNDERLINED, "text-decoration: underline;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.SUBSCRIPT, "vertical-align: sub;"); //$NON-NLS-1$
+ spanTypeToCssStyles.put(SpanType.SUPERSCRIPT, "vertical-align: super;"); //$NON-NLS-1$
+ }
+
+ private final String foNamespaceUri = "http://www.w3.org/1999/XSL/Format"; //$NON-NLS-1$
+
+ private boolean pageOpen = false;
+
+ private int h1Count = 0;
+
+ private final Stack<ElementInfo> elementInfos = new Stack<ElementInfo>();
+
+ private Configuration configuration = new Configuration();
+
+ public XslfoDocumentBuilder(Writer out) {
+ super(out);
+ }
+
+ public XslfoDocumentBuilder(XmlStreamWriter writer) {
+ super(writer);
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ characters(text);
+ }
+
+ private static class ElementInfo {
+ int size = 1;
+
+ }
+
+ private static class SpanInfo extends ElementInfo {
+ @SuppressWarnings("unused")
+ final SpanType type;
+
+ public SpanInfo(SpanType type) {
+ super();
+ this.type = type;
+ }
+ }
+
+ private static class BlockInfo extends ElementInfo {
+ final BlockType type;
+
+ int listItemCount;
+
+ BlockInfo previousChild;
+
+ public BlockInfo(BlockType type) {
+ this.type = type;
+ }
+
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ BlockInfo thisInfo = new BlockInfo(type);
+ BlockInfo parentBlock = findCurrentBlock();
+
+ String cssStyles = blockTypeToCssStyles.get(type);
+ Map<String, String> attrs = cssStyles == null ? null : attributesFromCssStyles(cssStyles);
+ if (attributes.getCssStyle() != null) {
+ Map<String, String> otherAttrs = attributesFromCssStyles(attributes.getCssStyle());
+ if (attrs == null) {
+ attrs = otherAttrs;
+ } else if (!otherAttrs.isEmpty()) {
+ attrs.putAll(otherAttrs);
+ }
+ }
+
+ switch (type) {
+ case DEFINITION_LIST:
+ case BULLETED_LIST:
+ case NUMERIC_LIST:
+ writer.writeStartElement(foNamespaceUri, "list-block"); //$NON-NLS-1$
+ writer.writeAttribute("provisional-label-separation", "0.2em"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("provisional-distance-between-starts", "1.2em"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (findBlockInfo(BlockType.LIST_ITEM) == null) {
+ addSpaceBefore();
+ }
+ break;
+ case DEFINITION_ITEM:
+ if (parentBlock == null || parentBlock.type != BlockType.DEFINITION_LIST) {
+ throw new IllegalStateException();
+ }
+ boolean firstItem = false;
+ if (parentBlock.previousChild != null && parentBlock.previousChild.type == BlockType.DEFINITION_TERM) {
+ firstItem = true;
+ writer.writeEndElement(); // list-item-label
+ --parentBlock.size;
+
+ writer.writeStartElement(foNamespaceUri, "list-item-body"); //$NON-NLS-1$
+ ++parentBlock.size;
+ writer.writeAttribute("start-indent", "body-start()"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeEmptyElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ }
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ writer.writeAttribute("space-before", firstItem ? "1.2em" : "0.2em"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ break;
+ case DEFINITION_TERM:
+ if (parentBlock == null || parentBlock.type != BlockType.DEFINITION_LIST) {
+ throw new IllegalStateException();
+ }
+ if (parentBlock.previousChild != null && parentBlock.previousChild.type == BlockType.DEFINITION_ITEM) {
+ writer.writeEndElement(); // list-item-body
+ --parentBlock.size;
+ writer.writeEndElement(); // list-item
+ --parentBlock.size;
+ }
+ if (parentBlock.previousChild == null || parentBlock.previousChild.type != BlockType.DEFINITION_TERM) {
+ writer.writeStartElement(foNamespaceUri, "list-item"); //$NON-NLS-1$
+ writer.writeAttribute("space-before", "0.2em"); //$NON-NLS-1$ //$NON-NLS-2$
+ ++parentBlock.size;
+ writer.writeStartElement(foNamespaceUri, "list-item-label"); //$NON-NLS-1$
+ writer.writeAttribute("end-indent", "label-end()"); //$NON-NLS-1$ //$NON-NLS-2$
+ ++parentBlock.size;
+ }
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ if (attrs == null || !attrs.containsKey("font-weight")) { //$NON-NLS-1$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ break;
+ case LIST_ITEM:
+ BlockInfo listInfo = getListBlockInfo();
+ ++listInfo.listItemCount;
+ writer.writeStartElement(foNamespaceUri, "list-item"); //$NON-NLS-1$
+// addSpaceBefore();
+
+ writer.writeStartElement(foNamespaceUri, "list-item-label"); //$NON-NLS-1$
+ writer.writeAttribute("end-indent", "label-end()"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ configureFontSize(0);
+ // FIXME: nested list numbering, list style
+ if (listInfo.type == BlockType.NUMERIC_LIST) {
+ if (attributes instanceof ListAttributes) {
+ // start attribute
+ ListAttributes listAttributes = (ListAttributes) attributes;
+ if (listAttributes.getStart() != null) {
+ try {
+ thisInfo.listItemCount = Integer.parseInt(listAttributes.getStart(), 10) - 1;
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ }
+ writer.writeCharacters(String.format("%s.", listInfo.listItemCount)); //$NON-NLS-1$
+ } else {
+ writer.writeCharacters(BULLET_CHARS, 0, BULLET_CHARS.length);
+ }
+ writer.writeEndElement(); // block
+ writer.writeEndElement(); // list-item-label
+
+ writer.writeStartElement(foNamespaceUri, "list-item-body"); //$NON-NLS-1$
+ ++thisInfo.size;
+ writer.writeAttribute("start-indent", "body-start()"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ configureFontSize(0);
+ ++thisInfo.size;
+
+ break;
+ case FOOTNOTE:
+ case PARAGRAPH:
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ addSpaceBefore();
+ break;
+ case CODE:
+ case PREFORMATTED:
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("hyphenate", "false"); //$NON-NLS-1$ //$NON-NLS-2$
+// writer.writeAttribute("wrap-option", "no-wrap"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("white-space-collapse", "false"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("white-space-treatment", "preserve"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("linefeed-treatment", "preserve"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("text-align", "start"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ addSpaceBefore();
+ break;
+ case QUOTE:
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ // indent
+ indentLeftAndRight(attrs, "2em"); //$NON-NLS-1$
+ addSpaceBefore();
+ break;
+ case DIV:
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ // no space before
+ break;
+ case INFORMATION:
+ case NOTE:
+ case TIP:
+ case WARNING:
+ case PANEL:
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ indentLeftAndRight(attrs, "2em"); //$NON-NLS-1$
+ addSpaceBefore();
+
+ // create the titled panel effect if a title is specified
+ if (attributes.getTitle() != null || configuration.panelText) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (configuration.panelText) {
+ String text = null;
+ switch (type) {
+ case NOTE:
+ text = Messages.getString("XslfoDocumentBuilder.Note"); //$NON-NLS-1$
+ break;
+ case TIP:
+ text = Messages.getString("XslfoDocumentBuilder.Tip"); //$NON-NLS-1$
+ break;
+ case WARNING:
+ text = Messages.getString("XslfoDocumentBuilder.Warning"); //$NON-NLS-1$
+ break;
+ }
+ if (text != null) {
+ writer.writeStartElement(foNamespaceUri, "inline"); //$NON-NLS-1$
+ writer.writeAttribute("font-style", "italic"); //$NON-NLS-1$//$NON-NLS-2$
+ characters(text);
+ writer.writeEndElement(); // inline
+ }
+ }
+ if (attributes.getTitle() != null) {
+ writer.writeStartElement(foNamespaceUri, "inline"); //$NON-NLS-1$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$//$NON-NLS-2$
+ characters(attributes.getTitle());
+ writer.writeEndElement(); // inline
+ }
+ writer.writeEndElement(); // block
+ }
+
+ break;
+ case TABLE:
+ writer.writeStartElement(foNamespaceUri, "table"); //$NON-NLS-1$
+ applyTableAttributes(attributes);
+ writer.writeStartElement(foNamespaceUri, "table-body"); //$NON-NLS-1$
+ ++thisInfo.size;
+ break;
+ case TABLE_CELL_HEADER:
+ case TABLE_CELL_NORMAL:
+ writer.writeStartElement(foNamespaceUri, "table-cell"); //$NON-NLS-1$
+ writer.writeAttribute("padding-left", "2pt"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("padding-right", "2pt"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("padding-top", "2pt"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("padding-bottom", "2pt"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ if (attrs == null || !attrs.containsKey("font-size")) { //$NON-NLS-1$
+ configureFontSize(0);
+ }
+ ++thisInfo.size;
+ break;
+ case TABLE_ROW:
+ writer.writeStartElement(foNamespaceUri, "table-row"); //$NON-NLS-1$
+ break;
+ default:
+ throw new IllegalStateException(type.name());
+ }
+
+ if (attrs != null) {
+ // output attributes with stable order
+ for (Entry<String, String> ent : new TreeMap<String, String>(attrs).entrySet()) {
+ writer.writeAttribute(ent.getKey(), ent.getValue());
+ }
+ }
+
+ if (parentBlock != null) {
+ parentBlock.previousChild = thisInfo;
+ }
+ elementInfos.push(thisInfo);
+ }
+
+ private void indentLeftAndRight(Map<String, String> attrs, String indentSize) {
+ if (attrs == null || !attrs.containsKey("margin-left")) { //$NON-NLS-1$
+ writer.writeAttribute("margin-left", indentSize); //$NON-NLS-1$
+ }
+ if (attrs == null || !attrs.containsKey("margin-right")) { //$NON-NLS-1$
+ writer.writeAttribute("margin-right", indentSize); //$NON-NLS-1$
+ }
+ }
+
+ private void configureFontSize(int level) {
+ writer.writeAttribute("font-size", String.format("%spt", configuration.fontSizes[level])); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void addSpaceBefore() {
+ writer.writeAttribute("space-before.optimum", "1em"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("space-before.minimum", "0.8em"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("space-before.maximum", "1.2em"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public void endBlock() {
+ ElementInfo elementInfo = elementInfos.pop();
+ if (!(elementInfo instanceof BlockInfo)) {
+ throw new IllegalStateException();
+ }
+ close(elementInfo);
+ }
+
+ private void close(ElementInfo elementInfo) {
+ while (elementInfo.size > 0) {
+ --elementInfo.size;
+ writer.writeEndElement();
+ }
+ }
+
+ private void applyTableAttributes(Attributes attributes) {
+ // applyAttributes(attributes);
+
+ boolean haveWidth = false;
+ if (attributes instanceof TableAttributes) {
+ TableAttributes tableAttributes = (TableAttributes) attributes;
+ if (tableAttributes.getBgcolor() != null) {
+ writer.writeAttribute(CSS_RULE_BACKGROUND_COLOR, tableAttributes.getBgcolor());
+ }
+
+ // FIXME border
+ // if (tableAttributes.getBorder() != null) {
+ // writer.writeAttribute("border", tableAttributes.getBorder()); //$NON-NLS-1$
+ // }
+ // if (tableAttributes.getCellpadding() != null) {
+ // writer.writeAttribute("cellpadding", tableAttributes.getCellpadding()); //$NON-NLS-1$
+ // }
+ // if (tableAttributes.getCellspacing() != null) {
+ // writer.writeAttribute("cellspacing", tableAttributes.getCellspacing()); //$NON-NLS-1$
+ // }
+ // if (tableAttributes.getFrame() != null) {
+ // writer.writeAttribute("frame", tableAttributes.getFrame()); //$NON-NLS-1$
+ // }
+ // if (tableAttributes.getRules() != null) {
+ // writer.writeAttribute("rules", tableAttributes.getRules()); //$NON-NLS-1$
+ // }
+ // if (tableAttributes.getSummary() != null) {
+ // writer.writeAttribute("summary", tableAttributes.getSummary()); //$NON-NLS-1$
+ // }
+ if (tableAttributes.getWidth() != null) {
+ writer.writeAttribute("width", tableAttributes.getWidth()); //$NON-NLS-1$
+ haveWidth = true;
+ }
+ }
+ // FIXME default border
+ if (!haveWidth) {
+ writer.writeAttribute("width", "auto"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ writer.writeAttribute("border-collapse", "collapse"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private BlockInfo getListBlockInfo() {
+ for (int x = elementInfos.size() - 1; x >= 0; --x) {
+ ElementInfo elementInfo = elementInfos.get(x);
+ if (elementInfo instanceof BlockInfo) {
+ BlockInfo info = (BlockInfo) elementInfo;
+ if (info.type == BlockType.BULLETED_LIST || info.type == BlockType.NUMERIC_LIST
+ || info.type == BlockType.DEFINITION_LIST) {
+ return info;
+ }
+ }
+ }
+ return null;
+ }
+
+ private BlockInfo findBlockInfo(BlockType type) {
+ for (int x = elementInfos.size() - 1; x >= 0; --x) {
+ ElementInfo elementInfo = elementInfos.get(x);
+ if (elementInfo instanceof BlockInfo) {
+ BlockInfo info = (BlockInfo) elementInfo;
+ if (info.type == type) {
+ return info;
+ }
+ }
+ }
+ return null;
+ }
+
+ private BlockInfo findCurrentBlock() {
+ for (int x = elementInfos.size() - 1; x >= 0; --x) {
+ ElementInfo elementInfo = elementInfos.get(x);
+ if (elementInfo instanceof BlockInfo) {
+ return (BlockInfo) elementInfo;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void beginDocument() {
+ writer.setDefaultNamespace(foNamespaceUri);
+
+ writer.writeStartElement(foNamespaceUri, "root"); //$NON-NLS-1$
+ writer.writeNamespace("", foNamespaceUri); //$NON-NLS-1$
+
+ writer.writeStartElement(foNamespaceUri, "layout-master-set"); //$NON-NLS-1$
+ writer.writeStartElement(foNamespaceUri, "simple-page-master"); //$NON-NLS-1$
+ writer.writeAttribute("master-name", "page-layout"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("page-height", String.format("%scm", configuration.pageHeight)); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("page-width", String.format("%scm", configuration.pageWidth)); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("margin", String.format("%scm", configuration.pageMargin)); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeEmptyElement(foNamespaceUri, "region-body"); //$NON-NLS-1$
+ if (hasPageFooter()) {
+ writer.writeAttribute("margin-bottom", "3cm"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (hasPageFooter()) {
+ writer.writeEmptyElement(foNamespaceUri, "region-after"); //$NON-NLS-1$
+ writer.writeAttribute("extent", "2cm"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("region-name", "footer"); //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ writer.writeEndElement(); // simple-page-master
+ writer.writeEndElement(); // layout-master-set
+
+ if (configuration.title != null) {
+ emitTitlePage();
+ }
+
+ openPage();
+ openFlow(false);
+ }
+
+ private boolean hasPageFooter() {
+ return configuration.copyright != null || configuration.pageNumbering;
+ }
+
+ private void emitTitlePage() {
+ openPage();
+ openFlow(true);
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+
+ if (configuration.title != null) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("font-size", "25pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("text-align", "center"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("space-before", "19pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeCharacters(configuration.title);
+ writer.writeEndElement(); // block
+ }
+
+ if (configuration.subTitle != null) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("font-size", "18pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("text-align", "center"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("space-before", "15pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeCharacters(configuration.subTitle);
+ writer.writeEndElement(); // block
+ }
+
+ if (configuration.version != null) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("font-size", "14pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("text-align", "center"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("space-before", "13pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeCharacters(configuration.version);
+ writer.writeEndElement(); // block
+ }
+
+ if (configuration.date != null) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("font-size", "14pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("text-align", "center"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeAttribute("space-before", "13pt"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeCharacters(configuration.date);
+ writer.writeEndElement(); // block
+ }
+
+ writer.writeEmptyElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("break-after", "page"); //$NON-NLS-1$//$NON-NLS-2$
+ writer.writeEndElement(); // block
+
+ closeFlow();
+ closePage();
+ }
+
+ private void openFlow(boolean titlePage) {
+ if (hasPageFooter()) {
+ writer.writeStartElement(foNamespaceUri, "static-content"); //$NON-NLS-1$
+ writer.writeAttribute("flow-name", "footer"); //$NON-NLS-1$//$NON-NLS-2$
+
+ if (configuration.copyright != null && configuration.copyright.trim().length() > 0) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ configureFontSize(0);
+ writer.writeAttribute("text-align", "center"); //$NON-NLS-1$//$NON-NLS-2$
+
+ writer.writeCharacters(configuration.copyright);
+
+ writer.writeEndElement(); // block
+ }
+
+ if (configuration.pageNumbering && !titlePage) {
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ configureFontSize(0);
+ writer.writeAttribute("text-align", "outside"); //$NON-NLS-1$//$NON-NLS-2$
+//
+// // output the section header into the footer using retrieve-marker
+// writer.writeEmptyElement(foNamespaceUri, "retrieve-marker"); //$NON-NLS-1$
+// writer.writeAttribute("retrieve-boundary", "page-sequence"); //$NON-NLS-1$//$NON-NLS-2$
+// writer.writeAttribute("retrieve-position", "first-starting-within-page"); //$NON-NLS-1$//$NON-NLS-2$
+// writer.writeAttribute("retrieve-class-name", "section-title"); //$NON-NLS-1$//$NON-NLS-2$
+
+ writer.writeEmptyElement(foNamespaceUri, "page-number"); //$NON-NLS-1$
+
+ writer.writeEndElement(); // block
+ }
+ writer.writeEndElement(); // static-content
+ }
+ writer.writeStartElement(foNamespaceUri, "flow"); //$NON-NLS-1$
+ writer.writeAttribute("flow-name", "xsl-region-body"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void closeFlow() {
+ writer.writeEndElement(); // flow
+ }
+
+ private void openPage() {
+ pageOpen = true;
+ writer.writeStartElement(foNamespaceUri, "page-sequence"); //$NON-NLS-1$
+ writer.writeAttribute("master-reference", "page-layout"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private void closePage() {
+ writer.writeEndElement(); // page-sequence
+ pageOpen = false;
+ }
+
+ @Override
+ public void endDocument() {
+ if (pageOpen) {
+ closeFlow();
+ closePage();
+ }
+ writer.writeEndElement(); // root
+ writer.close();
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ if (level == 1 && ++h1Count > 1 && configuration.pageBreakOnHeading1) {
+ if (pageOpen) {
+ closeFlow();
+ closePage();
+ }
+ openPage();
+ openFlow(false);
+ }
+
+ writer.writeStartElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ writer.writeAttribute("keep-with-next.within-column", "always"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("font-weight", "bold"); //$NON-NLS-1$ //$NON-NLS-2$
+ configureFontSize(level);
+ writer.writeAttribute("space-before.optimum", "10pt"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("space-before.minimum", "10pt * 0.8"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("space-before.maximum", "10pt * 1.2"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (attributes.getId() != null) {
+ writer.writeAttribute("id", attributes.getId()); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void endHeading() {
+ writer.writeEndElement(); // block
+ }
+
+ private Map<String, String> attributesFromCssStyles(String styles) {
+ if (styles == null) {
+ return Collections.emptyMap();
+ }
+ List<CssRule> rules = new CssParser().parseBlockContent(styles);
+ if (rules.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ Map<String, String> mapping = new HashMap<String, String>();
+ for (CssRule rule : rules) {
+ if (CSS_RULE_VERTICAL_ALIGN.equals(rule.name)) {
+ if ("super".equals(rule.value)) { //$NON-NLS-1$
+ mapping.put("font-size", "75%"); //$NON-NLS-1$ //$NON-NLS-2$
+ mapping.put("baseline-shift", "super"); //$NON-NLS-1$ //$NON-NLS-2$
+ } else if ("sub".equals(rule.value)) { //$NON-NLS-1$
+ mapping.put("font-size", "75%"); //$NON-NLS-1$ //$NON-NLS-2$
+ mapping.put("baseline-shift", "sub"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ } else if (CSS_RULE_TEXT_DECORATION.equals(rule.name) || //
+ CSS_RULE_FONT_FAMILY.equals(rule.name) || //
+ CSS_RULE_FONT_SIZE.equals(rule.name) || //
+ CSS_RULE_FONT_WEIGHT.equals(rule.name) || //
+ CSS_RULE_FONT_STYLE.equals(rule.name) || //
+ CSS_RULE_BACKGROUND_COLOR.equals(rule.name) || //
+ CSS_RULE_COLOR.equals(rule.name)) {
+ mapping.put(rule.name, rule.value);
+ }
+ }
+ return mapping;
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ SpanInfo info = new SpanInfo(type);
+
+ writer.writeStartElement(foNamespaceUri, "inline"); //$NON-NLS-1$
+
+ String cssStyles = spanTypeToCssStyles.get(type);
+ Map<String, String> attrs = cssStyles == null ? null : attributesFromCssStyles(cssStyles);
+ if (attributes.getCssStyle() != null) {
+ Map<String, String> otherAttrs = attributesFromCssStyles(attributes.getCssStyle());
+ if (attrs == null) {
+ attrs = otherAttrs;
+ } else if (!otherAttrs.isEmpty()) {
+ attrs.putAll(otherAttrs);
+ }
+ }
+ if (attrs != null) {
+ // output attributes with stable order
+ for (Entry<String, String> ent : new TreeMap<String, String>(attrs).entrySet()) {
+ writer.writeAttribute(ent.getKey(), ent.getValue());
+ }
+ }
+
+ elementInfos.push(info);
+ }
+
+ @Override
+ public void endSpan() {
+ ElementInfo elementInfo = elementInfos.pop();
+ if (!(elementInfo instanceof SpanInfo)) {
+ throw new IllegalStateException();
+ }
+ close(elementInfo);
+ }
+
+ @Override
+ public void characters(String text) {
+ writer.writeCharacters(text);
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ Logger.getLogger(XslfoDocumentBuilder.class.getName()).warning("escaping XML literal"); //$NON-NLS-1$
+ writer.writeCharacters(literal);
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ writer.writeEntityRef(entity);
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ // <fo:external-graphic src="url(images/editor-command-help.png)" width="auto" height="auto" content-width="auto" content-height="auto"/>
+ writer.writeEmptyElement(foNamespaceUri, "external-graphic"); //$NON-NLS-1$
+ writer.writeAttribute("src", String.format("url(%s)", makeUrlAbsolute(url))); //$NON-NLS-1$//$NON-NLS-2$
+ applyImageAttributes(attributes);
+ }
+
+ private void applyImageAttributes(Attributes attributes) {
+ boolean sizeSpecified = false;
+ boolean scaleToFit = true;
+ if (attributes instanceof ImageAttributes) {
+ ImageAttributes imageAttributes = (ImageAttributes) attributes;
+ if (imageAttributes.getWidth() > 0) {
+ sizeSpecified = true;
+ writer.writeAttribute("width", String.format("%spx", imageAttributes.getWidth())); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (imageAttributes.getHeight() > 0) {
+ sizeSpecified = true;
+ writer.writeAttribute("height", String.format("%spx", imageAttributes.getHeight())); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ if (!sizeSpecified) {
+ writer.writeAttribute("width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("content-height", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (scaleToFit) {
+ writer.writeAttribute("content-width", "scale-to-fit"); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("scaling", "uniform"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ writer.writeStartElement(foNamespaceUri, "basic-link"); //$NON-NLS-1$
+ String destinationUrl = makeUrlAbsolute(href);
+ if (destinationUrl.startsWith("#")) { //$NON-NLS-1$
+ writer.writeAttribute("internal-destination", destinationUrl.substring(1)); //$NON-NLS-1$
+ } else {
+ writer.writeAttribute("external-destination", String.format("url(%s)", destinationUrl)); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ image(imageAttributes, imageUrl);
+ writer.writeEndElement();// basic-link
+ }
+
+ @Override
+ public void lineBreak() {
+ // an empty block does the trick
+ writer.writeEmptyElement(foNamespaceUri, "block"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ writer.writeStartElement(foNamespaceUri, "basic-link"); //$NON-NLS-1$
+ String destinationUrl = makeUrlAbsolute(hrefOrHashName);
+ boolean internal = destinationUrl.startsWith("#"); //$NON-NLS-1$
+ if (configuration.underlineLinks) {
+ writer.writeAttribute("text-decoration", "underline"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (internal) {
+ writer.writeAttribute("internal-destination", destinationUrl.substring(1)); //$NON-NLS-1$
+ } else {
+ writer.writeAttribute("external-destination", String.format("url(%s)", destinationUrl)); //$NON-NLS-1$//$NON-NLS-2$
+ }
+ characters(text);
+ writer.writeEndElement();// basic-link
+ if (configuration.showExternalLinks && !internal) {
+ characters(Messages.getString("XslfoDocumentBuilder.beforeLink")); //$NON-NLS-1$
+ writer.writeStartElement(foNamespaceUri, "basic-link"); //$NON-NLS-1$
+ writer.writeAttribute("external-destination", String.format("url(%s)", destinationUrl)); //$NON-NLS-1$//$NON-NLS-2$
+ characters(destinationUrl);
+ characters(Messages.getString("XslfoDocumentBuilder.afterLink")); //$NON-NLS-1$
+ writer.writeEndElement(); // basic-link
+ }
+ }
+
+ /**
+ * The current configuration of this builder. The returned value is mutable and changes to it affect this builder's
+ * configuration.
+ *
+ * @see Configuration Configuration class for configurable settings
+ */
+ public Configuration getConfiguration() {
+ return configuration;
+ }
+
+ /**
+ * The current configuration of this builder.
+ *
+ * @see Configuration Configuration class for configurable settings
+ */
+ public void setConfiguration(Configuration configuration) {
+ if (configuration == null) {
+ throw new IllegalArgumentException();
+ }
+ this.configuration = configuration;
+ }
+
+ /**
+ * A class that encapsulates all configurable settings of the {@link XslfoDocumentBuilder}. This class implements
+ * the template design pattern via {@link Configuration#clone()}.
+ *
+ * @author David Green
+ */
+ public static class Configuration implements Cloneable {
+
+ private float[] fontSizes = new float[] { 12.0f, 18.0f, 15.0f, 13.2f, 12.0f, 10.4f, 8.0f };
+
+ private final float[] fontSizeMultipliers = new float[] { 1.0f, 1.5f, 1.25f, 1.1f, 1.0f, 0.83f, 0.67f };
+
+ private boolean pageBreakOnHeading1 = true;
+
+ private boolean showExternalLinks = true;
+
+ private boolean underlineLinks = false;
+
+ private boolean panelText = true;
+
+ private String title;
+
+ private String subTitle;
+
+ private String version;
+
+ private String date;
+
+ private String author;
+
+ private String copyright;
+
+ private boolean pageNumbering = true;
+
+ private float pageMargin = 1.5f;
+
+ private float pageHeight = 29.7f;
+
+ private float pageWidth = 21.0f;
+
+ public Configuration() {
+ setFontSize(10.0f);
+ }
+
+ @Override
+ public Configuration clone() {
+ try {
+ return (Configuration) super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ /**
+ * Set the base font size. The base font size is 10.0 by default
+ */
+ public void setFontSize(float fontSize) {
+ fontSizes = new float[fontSizeMultipliers.length];
+ for (int x = 0; x < fontSizeMultipliers.length; ++x) {
+ fontSizes[x] = fontSizeMultipliers[x] * fontSize;
+ }
+ }
+
+ /**
+ * Get the base font size. The base font size is 10.0 by default
+ */
+ public float getFontSize() {
+ return fontSizes[0];
+ }
+
+ /**
+ * Set the font size multipliers. Multipliers are used to determine the actual size of fonts by multiplying the
+ * {@link #getFontSize() base font size} by the multiplier to determine the size of a font for a heading.
+ *
+ * @param fontSizeMultipliers
+ * an array of size 7, where position 1-6 correspond to headings h1 to h6
+ */
+ public void setFontSizeMultipliers(float[] fontSizeMultipliers) {
+ if (fontSizeMultipliers.length != 7) {
+ throw new IllegalArgumentException();
+ }
+ for (int x = 0; x < fontSizeMultipliers.length; ++x) {
+ if (fontSizeMultipliers[x] < 0.2) {
+ throw new IllegalArgumentException();
+ }
+ }
+ System.arraycopy(fontSizeMultipliers, 0, this.fontSizeMultipliers, 0, 7);
+ }
+
+ /**
+ * The font size multipliers. Multipliers are used to determine the actual size of fonts by multiplying the
+ * {@link #getFontSize() base font size} by the multiplier to determine the size of a font for a heading.
+ *
+ * @return an array of size 7, where position 1-6 correspond to headings h1 to h6
+ */
+ public float[] getFontSizeMultipliers() {
+ float[] values = new float[7];
+ System.arraycopy(fontSizeMultipliers, 0, values, 0, 7);
+ return values;
+ }
+
+ /**
+ * indicate if external link URLs should be emitted in the text. The default is true.
+ */
+ public boolean isShowExternalLinks() {
+ return showExternalLinks;
+ }
+
+ /**
+ * indicate if external link URLs should be emitted in the text. The default is true.
+ */
+ public void setShowExternalLinks(boolean showExternalLinks) {
+ this.showExternalLinks = showExternalLinks;
+ }
+
+ /**
+ * Indicate if links should be underlined. The default is false.
+ */
+ public boolean isUnderlineLinks() {
+ return underlineLinks;
+ }
+
+ /**
+ * Indicate if links should be underlined. The default is false.
+ */
+ public void setUnderlineLinks(boolean underlineLinks) {
+ this.underlineLinks = underlineLinks;
+ }
+
+ /**
+ * Indicate if h1 headings should start a new page. The default is true.
+ */
+ public boolean isPageBreakOnHeading1() {
+ return pageBreakOnHeading1;
+ }
+
+ /**
+ * Indicate if h1 headings should start a new page. The default is true.
+ */
+ public void setPageBreakOnHeading1(boolean pageBreakOnHeading1) {
+ this.pageBreakOnHeading1 = pageBreakOnHeading1;
+ }
+
+ /**
+ * a title to be emitted on the title page
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * a title to be emitted on the title page
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * a sub-title to be emitted on the title page
+ */
+ public String getSubTitle() {
+ return subTitle;
+ }
+
+ /**
+ * a sub-title to be emitted on the title page
+ */
+ public void setSubTitle(String subTitle) {
+ this.subTitle = subTitle;
+ }
+
+ /**
+ * indicate if the text 'Note: ', 'Tip: ', and 'Warning: ' should be added to blocks of type
+ * {@link BlockType#NOTE}, {@link BlockType#TIP}, and {@link BlockType#WARNING} respectively.
+ */
+ public boolean isPanelText() {
+ return panelText;
+ }
+
+ /**
+ * indicate if the text 'Note: ', 'Tip: ', and 'Warning: ' should be added to blocks of type
+ * {@link BlockType#NOTE}, {@link BlockType#TIP}, and {@link BlockType#WARNING} respectively.
+ */
+ public void setPanelText(boolean panelText) {
+ this.panelText = panelText;
+ }
+
+ /**
+ * a document version number to emit on the title page
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ /**
+ * a document version number to emit on the title page
+ */
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ /**
+ * a date to emit on the title page
+ */
+ public String getDate() {
+ return date;
+ }
+
+ /**
+ * a date to emit on the title page
+ */
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ /**
+ * an author to emit on the title page
+ */
+ public String getAuthor() {
+ return author;
+ }
+
+ /**
+ * an author to emit on the title page
+ */
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ /**
+ * a copyright to emit in the document page footer
+ */
+ public String getCopyright() {
+ return copyright;
+ }
+
+ /**
+ * a copyright to emit in the document page footer
+ */
+ public void setCopyright(String copyright) {
+ this.copyright = copyright;
+ }
+
+ /**
+ * indicate if pages should be numbered
+ */
+ public boolean isPageNumbering() {
+ return pageNumbering;
+ }
+
+ /**
+ * indicate if pages should be numbered
+ */
+ public void setPageNumbering(boolean pageNumbering) {
+ this.pageNumbering = pageNumbering;
+ }
+
+ /**
+ * The page margin in cm. Defaults to 1.5cm.
+ */
+ public float getPageMargin() {
+ return pageMargin;
+ }
+
+ /**
+ * The page margin in cm. Defaults to 1.5cm.
+ */
+ public void setPageMargin(float pageMargin) {
+ this.pageMargin = pageMargin;
+ }
+
+ /**
+ * The page height in cm. Defaults to A4 sizing (29.7cm)
+ */
+ public float getPageHeight() {
+ return pageHeight;
+ }
+
+ /**
+ * The page height in cm. Defaults to A4 sizing (29.7cm)
+ */
+ public void setPageHeight(float pageHeight) {
+ this.pageHeight = pageHeight;
+ }
+
+ /**
+ * The page width in cm. Defaults to A4 sizing (21.0cm)
+ */
+ public float getPageWidth() {
+ return pageWidth;
+ }
+
+ /**
+ * The page width in cm. Defaults to A4 sizing (21.0cm)
+ */
+ public void setPageWidth(float pageWidth) {
+ this.pageWidth = pageWidth;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/messages.properties
new file mode 100644
index 0000000..1991d94
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/messages.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+DocBookDocumentBuilder.0=Glossary
+HtmlDocumentBuilder.0=CSS stylesheets are specified but the HTML output is not a document
+HtmlDocumentBuilder.1=Not a file: {0}
+HtmlDocumentBuilder.2=File cannot be read: {0}
+HtmlDocumentBuilder.3=File does not exist: {0}
+HtmlDocumentBuilder.4=Cannot read file: {0}
+HtmlDocumentBuilder.5=Cannot read stylesheet content
+XslfoDocumentBuilder.afterLink=]
+XslfoDocumentBuilder.beforeLink=\ [
+XslfoDocumentBuilder.Note=Note:\
+XslfoDocumentBuilder.Tip=Tip:\
+XslfoDocumentBuilder.Warning=Warning:\
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/package-info.java
new file mode 100644
index 0000000..4088156
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/builder/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * contains concrete implementations of {@link org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder}.
+ */
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/AbstractMarkupLanguage.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/AbstractMarkupLanguage.java
new file mode 100644
index 0000000..d4fa44c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/AbstractMarkupLanguage.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * a standard implementation of a markup language usually extends this class, which provides default support for common
+ * functionality.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public abstract class AbstractMarkupLanguage extends MarkupLanguage {
+
+ // we use the template pattern for creating new blocks
+ protected List<Block> blocks = new ArrayList<Block>();
+
+ protected List<Block> paragraphBreakingBlocks = new ArrayList<Block>();
+
+ protected PatternBasedSyntax tokenSyntax = new PatternBasedSyntax();
+
+ protected PatternBasedSyntax phraseModifierSyntax = new PatternBasedSyntax();
+
+ @Override
+ protected PatternBasedSyntax getPhraseModifierSyntax() {
+ return phraseModifierSyntax;
+ }
+
+ @Override
+ protected PatternBasedSyntax getReplacementTokenSyntax() {
+ return tokenSyntax;
+ }
+
+ @Override
+ public final List<Block> getBlocks() {
+ return blocks;
+ }
+
+ public final List<Block> getParagraphBreakingBlocks() {
+ return paragraphBreakingBlocks;
+ }
+
+ @Override
+ protected final void initializeSyntax() {
+ if (!blocks.isEmpty()) {
+ clearLanguageSyntax();
+ }
+ initializeBlocks();
+ initializePhraseModifiers();
+ initializeTokens();
+ }
+
+ protected void clearLanguageSyntax() {
+ blocks.clear();
+ paragraphBreakingBlocks.clear();
+ tokenSyntax.clear();
+ phraseModifierSyntax.clear();
+ }
+
+ protected final void initializeTokens() {
+ addStandardTokens(tokenSyntax);
+ addTokenExtensions(tokenSyntax);
+ if (configuration != null) {
+ configuration.addTokenExtensions(tokenSyntax);
+ }
+ }
+
+ protected final void initializePhraseModifiers() {
+ addStandardPhraseModifiers(phraseModifierSyntax);
+ addPhraseModifierExtensions(phraseModifierSyntax);
+ if (configuration != null) {
+ configuration.addPhraseModifierExtensions(phraseModifierSyntax);
+ }
+ }
+
+ protected final void initializeBlocks() {
+ addStandardBlocks(blocks, paragraphBreakingBlocks);
+ // extensions
+ addBlockExtensions(blocks, paragraphBreakingBlocks);
+ if (configuration != null) {
+ configuration.addBlockExtensions(blocks, paragraphBreakingBlocks);
+ }
+ // ~extensions
+
+ blocks.add(createParagraphBlock()); // ORDER DEPENDENCY: this must come last
+ }
+
+ protected abstract void addStandardTokens(PatternBasedSyntax tokenSyntax);
+
+ protected abstract void addStandardPhraseModifiers(PatternBasedSyntax phraseModifierSyntax);
+
+ protected abstract void addStandardBlocks(List<Block> blocks, List<Block> paragraphBreakingBlocks);
+
+ protected abstract Block createParagraphBlock();
+
+ /**
+ * subclasses may override this method to add blocks to the language. Overriding classes should call
+ * <code>super.addBlockExtensions(blocks,paragraphBreakingBlocks)</code> if the default language extensions are
+ * desired.
+ *
+ * @param blocks
+ * the list of blocks to which extensions may be added
+ * @param paragraphBreakingBlocks
+ * the list of blocks that end a paragraph
+ */
+ protected void addBlockExtensions(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ // no block extensions
+ }
+
+ /**
+ * subclasses may override this method to add tokens to the language. Overriding classes should call
+ * <code>super.addTokenExtensions(tokenSyntax)</code> if the default language extensions are desired.
+ *
+ * @param tokenSyntax
+ * the token syntax
+ */
+ protected void addTokenExtensions(PatternBasedSyntax tokenSyntax) {
+ // no token extensions
+ }
+
+ /**
+ * subclasses may override this method to add phrases to the language. Overriding classes should call
+ * <code>super.addPhraseModifierExtensions(phraseModifierSyntax)</code> if the default language extensions are
+ * desired.
+ *
+ * @param phraseModifierSyntax
+ * the phrase modifier syntax
+ */
+ protected void addPhraseModifierExtensions(PatternBasedSyntax phraseModifierSyntax) {
+ // no phrase extensions
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/Block.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/Block.java
new file mode 100644
index 0000000..bee32e3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/Block.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+
+/**
+ * A markup block that may span multiple lines.
+ *
+ * Implements {@link Cloneable} for the template design pattern.
+ *
+ * @author David Green
+ */
+public abstract class Block extends Processor implements Cloneable {
+ private boolean closed;
+
+ public Block() {
+ }
+
+ /**
+ * Process the given line of markup starting at the provided offset.
+ *
+ * @param line
+ * the markup line to process
+ * @param offset
+ * the offset at which to start processing
+ *
+ * @return a non-negative integer to indicate that processing of the block completed before the end of the line, or
+ * -1 if the entire line was processed.
+ */
+ public int processLine(String line, int offset) {
+ getState().setLineCharacterOffset(offset);
+ return processLineContent(line, offset);
+ }
+
+ /**
+ * Process the given line of markup starting at the provided offset.
+ *
+ * @param line
+ * the markup line to process
+ * @param offset
+ * the offset at which to start processing
+ *
+ * @return a non-negative integer to indicate that processing of the block completed before the end of the line, or
+ * -1 if the entire line was processed.
+ */
+ protected abstract int processLineContent(String line, int offset);
+
+ /**
+ * Indicate if the block can start with the given markup line at the provided offset. Calling this method may cause
+ * the block to have state which is propagated when {@link #clone() cloning} and consumed in
+ * {@link #processLine(String, int, int)}. Calling this method must cause any previous state to be reset. Note that
+ * it is valid for block implementations to refuse to start at non-zero offsets.
+ *
+ * Implementations must be able to handle this method without having the {@link Processor processor state}
+ * initialized.
+ *
+ * @param line
+ * the line of markup to test
+ * @param lineOffset
+ * the offset at which the block should start processing
+ *
+ * @return true if the provided markup consists of a valid starting point for the block
+ */
+ public abstract boolean canStart(String line, int lineOffset);
+
+ /**
+ * Indicate if block nesting should begin. Called after {@link #processLineContent(String, int)}.
+ *
+ * @return true if nesting should start, otherwise false.
+ *
+ * @see #findCloseOffset(String, int)
+ * @since 1.1
+ */
+ public boolean beginNesting() {
+ return false;
+ }
+
+ /**
+ * Indicate if the block can close on the given line at the given offset. blocks that implement a nesting protocol
+ * must implement this method.
+ *
+ * @param line
+ * the line of content
+ * @param lineOffset
+ * the 0-based offset into the line
+ *
+ * @return the 0-based offset where the close will occur, or -1 if the block should not close on this line.
+ *
+ * @see #beginNesting()
+ * @since 1.1
+ */
+ public int findCloseOffset(String line, int lineOffset) {
+ return -1;
+ }
+
+ /**
+ * Indicate if the current block is closed
+ */
+ public boolean isClosed() {
+ return closed;
+ }
+
+ /**
+ * Cause the block to be closed. If the block is going from the open to the closed state, then the block must cause
+ * the closed state to be propagated to the {@link DocumentBuilder builder} if necessary.
+ *
+ * @param closed
+ */
+ public void setClosed(boolean closed) {
+ this.closed = closed;
+ }
+
+ /**
+ * Clone the block including its state. Cloning is generally used after the {@link #canStart(String, int)} method is
+ * called in order to implement the Template design pattern.
+ */
+ @Override
+ public Block clone() {
+ return (Block) super.clone();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/ContentState.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/ContentState.java
new file mode 100644
index 0000000..b43a7f5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/ContentState.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.wikitext.core.parser.IdGenerator;
+import org.eclipse.mylyn.wikitext.core.parser.Locator;
+
+/**
+ * State related to parsing content, propagated to {@link Block blocks} and other {@link Processor processors} during
+ * the parse phase.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ContentState implements Locator {
+ private final Map<String, String> footnoteIdToHtmlId = new HashMap<String, String>();
+
+ private final Map<String, String> glossaryItems = new HashMap<String, String>();
+
+ private String markupContent;
+
+ private final IdGenerator idGenerator = new IdGenerator();
+
+ private int lineNumber = -1;
+
+ private int lineOffset = -1;
+
+ private int lineCharacterOffset = 0;
+
+ private int lineLength = 0;
+
+ private int lineSegmentEndOffset;
+
+ private int shift;
+
+ public ContentState() {
+ }
+
+ public String getMarkupContent() {
+ return markupContent;
+ }
+
+ protected void setMarkupContent(String markupContent) {
+ this.markupContent = markupContent;
+ }
+
+ public String getFootnoteId(String footnote) {
+ String id = footnoteIdToHtmlId.get(footnote);
+ if (id == null) {
+ // Create a stable id. This has a greater chance of collisions, however
+ // it's an acceptable risk to gain stable ids. Unfortunately there's no way to
+ // know if the id is already in use without doing a two-pass parse, which we don't
+ // want to do. Instead, we choose a prefix of '___' since the '_' is not used by
+ // the default id generator and it's unlikely to be found in a document.
+ id = "___fn" + footnote; //$NON-NLS-1$
+ footnoteIdToHtmlId.put(footnote, id);
+ }
+ return id;
+ }
+
+ /**
+ * Add a glossary term (typically an acronym) with its definition. Has no effect if the term is already present in
+ * the glossary and the given definition is shorter or equal in length to the existing definition.
+ *
+ * @param term
+ * the term to add
+ * @param definition
+ * the definition of the term.
+ */
+ public void addGlossaryTerm(String term, String definition) {
+ String previousDef = glossaryItems.put(term, definition);
+ if (previousDef != null && previousDef.length() > definition.length()) {
+ glossaryItems.put(term, previousDef);
+ }
+ }
+
+ /**
+ * Get the glossary as a map of definition by acronym or term.
+ */
+ public Map<String, String> getGlossaryTerms() {
+ return glossaryItems;
+ }
+
+ public IdGenerator getIdGenerator() {
+ return idGenerator;
+ }
+
+ /**
+ * Get the 1-based line number of the current line.
+ *
+ * @return the line number or -1 if it is unknown.
+ */
+ public int getLineNumber() {
+ return lineNumber;
+ }
+
+ /**
+ * the 1-based line number of the current line.
+ */
+ protected void setLineNumber(int lineNumber) {
+ this.lineNumber = lineNumber;
+ }
+
+ /**
+ * the 0-based character offset of the current line.
+ *
+ * @return the offset or -1 if it is unknown.
+ */
+ public int getLineOffset() {
+ return lineOffset;
+ }
+
+ /**
+ * the 0-based character offset of the current line.
+ */
+ protected void setLineOffset(int lineOffset) {
+ this.lineOffset = lineOffset;
+ }
+
+ public int getLineDocumentOffset() {
+ return lineOffset;
+ }
+
+ public int getLineCharacterOffset() {
+ return lineCharacterOffset;
+ }
+
+ public void setLineCharacterOffset(int lineCharacterOffset) {
+ this.lineCharacterOffset = lineCharacterOffset;
+ }
+
+ public int getDocumentOffset() {
+ return lineOffset + lineCharacterOffset;
+ }
+
+ public int getLineLength() {
+ return lineLength;
+ }
+
+ public void setLineLength(int lineLength) {
+ this.lineLength = lineLength;
+ }
+
+ public void setLineSegmentEndOffset(int lineSegmentEndOffset) {
+ this.lineSegmentEndOffset = lineSegmentEndOffset;
+ }
+
+ public int getLineSegmentEndOffset() {
+ return lineSegmentEndOffset;
+ }
+
+ void setShift(int shift) {
+ this.shift = shift;
+ }
+
+ int getShift() {
+ return shift;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/DefaultIdGenerationStrategy.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/DefaultIdGenerationStrategy.java
new file mode 100644
index 0000000..c17a715
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/DefaultIdGenerationStrategy.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+/**
+ * A default ID generation strategy which removes all non-alphanumeric characters from the heading text to produce an
+ * id.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class DefaultIdGenerationStrategy extends IdGenerationStrategy {
+
+ @Override
+ public String generateId(String headingText) {
+ String anchor = headingText.replaceAll("[^a-zA-Z0-9.]", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ if (anchor.length() > 0 && Character.isDigit(anchor.charAt(0))) {
+ anchor = 'a' + anchor;
+ }
+ return anchor;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/IdGenerationStrategy.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/IdGenerationStrategy.java
new file mode 100644
index 0000000..a5c1343
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/IdGenerationStrategy.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+/**
+ * A strategy for generating IDs from text, follows the Strategy design pattern.
+ *
+ * @author David Green
+ */
+public abstract class IdGenerationStrategy {
+ /**
+ * produce an id for use in an HTML anchor from heading text.
+ *
+ * @param headingText
+ * the text of the heading
+ *
+ * @return an Id, or null if no Id could be computed from the given text
+ */
+ public abstract String generateId(String headingText);
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/MarkupLanguage.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/MarkupLanguage.java
new file mode 100644
index 0000000..e30f9f1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/MarkupLanguage.java
@@ -0,0 +1,642 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.ImpliedHyperlinkReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.core.util.LocationTrackingReader;
+import org.eclipse.mylyn.wikitext.core.util.ServiceLocator;
+
+/**
+ * A markup language, which knows its formatting rules and is able to process content based on {@link Block},
+ * {@link PatternBasedElementProcessor} and {@link PatternBasedElement} concepts. All markup languages supported by
+ * WikiText extend this class.
+ *
+ * The MarkupLanguage class provides basic functionality for determining which blocks process which markup content in a
+ * particular document. In general multi-line documents are split into consecutive regions called blocks, and each line
+ * in a block is processed with spanning sections called phrase modifiers, and tokens within a span are replaced with
+ * their respective replacement tokens. These rules apply to most lightweight markup languages, however subclasses may
+ * override this default functionality if required. For example, by default phrase modifiers are non-overlapping and
+ * non-nested, however if required a subclass could permit such nesting.
+ *
+ * Generally markup language classes are not accessed directly by client code, instead client code should configure and
+ * call {@link MarkupParser}, accessing the markup language by name using the {@link ServiceLocator}.
+ *
+ * @author David Green
+ */
+public abstract class MarkupLanguage implements Cloneable {
+
+ private static final DefaultIdGenerationStrategy DEFAULT_ID_GENERATION_STRATEGY = new DefaultIdGenerationStrategy();
+
+ private String name;
+
+ private String extendsLanguage;
+
+ private boolean filterGenerativeBlocks;
+
+ private boolean blocksOnly;
+
+ protected String internalLinkPattern = "{0}"; //$NON-NLS-1$
+
+ private boolean syntaxInitialized = false;
+
+ protected MarkupLanguageConfiguration configuration;
+
+ @Override
+ public MarkupLanguage clone() {
+ MarkupLanguage markupLanguage;
+ try {
+ markupLanguage = getClass().newInstance();
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ markupLanguage.setName(name);
+ markupLanguage.configuration = configuration == null ? null : configuration.clone();
+ return markupLanguage;
+ }
+
+ /**
+ * Create new state for tracking a document and its contents during a parse session. Subclasses may override this
+ * method to provide additional state tracking capability.
+ *
+ * @return the new state.
+ */
+ protected ContentState createState() {
+ ContentState contentState = new ContentState();
+ contentState.getIdGenerator().setGenerationStrategy(getIdGenerationStrategy());
+ return contentState;
+ }
+
+ /**
+ * get the id strategy employed by this markup language.
+ */
+ public IdGenerationStrategy getIdGenerationStrategy() {
+ return DEFAULT_ID_GENERATION_STRATEGY;
+ }
+
+ private static class LineState {
+ int lineOffset;
+
+ String line;
+
+ public LineState(String line, int offset) {
+ this.line = line;
+ lineOffset = offset;
+ }
+ }
+
+ public void processContent(MarkupParser parser, String markupContent, boolean asDocument) {
+ initializeSyntax(false);
+ initProcessors();
+ ContentState state = createState();
+ state.setMarkupContent(markupContent);
+ LocationTrackingReader reader = new LocationTrackingReader(new StringReader(markupContent));
+
+ DocumentBuilder builder = parser.getBuilder();
+
+ builder.setLocator(state);
+ try {
+ if (asDocument) {
+ builder.beginDocument();
+ }
+ Stack<Block> nestedBlocks = null;
+ Stack<LineState> lineStates = null;
+ String line;
+ Block currentBlock = null;
+ try {
+ line = reader.readLine();
+ int lineOffset = 0;
+ while (line != null) {
+
+ state.setLineNumber(reader.getLineNumber() + 1);
+ state.setLineOffset(reader.getLineOffset());
+ state.setLineCharacterOffset(0);
+ state.setLineSegmentEndOffset(0);
+ state.setLineLength(line.length());
+
+ for (;;) {
+ if (nestedBlocks != null && !nestedBlocks.isEmpty()) {
+ Block nestedParent = nestedBlocks.peek();
+ int closeOffset = nestedParent.findCloseOffset(line, lineOffset);
+ if (closeOffset != -1) {
+ if (closeOffset > lineOffset) {
+ String truncatedLine = line.substring(0, closeOffset);
+ if (lineStates == null) {
+ lineStates = new Stack<LineState>();
+ }
+ lineStates.push(new LineState(line, closeOffset));
+ line = truncatedLine;
+ } else {
+ if (currentBlock != null) {
+ currentBlock.setClosed(true);
+ currentBlock = null;
+ }
+ currentBlock = nestedBlocks.pop();
+ lineOffset = closeOffset;
+ }
+ }
+ }
+ if (currentBlock == null) {
+ currentBlock = startBlock(line, lineOffset);
+ if (currentBlock == null) {
+ break;
+ }
+ currentBlock.setMarkupLanguage(this);
+ currentBlock.setState(state);
+ currentBlock.setParser(parser);
+ }
+ lineOffset = currentBlock.processLineContent(line, lineOffset);
+ if (currentBlock.isClosed()) {
+ currentBlock = null;
+ } else if (currentBlock.beginNesting()) {
+ if (nestedBlocks == null) {
+ nestedBlocks = new Stack<Block>();
+ }
+ nestedBlocks.push(currentBlock);
+ currentBlock = null;
+ }
+ if (lineOffset < line.length() && lineOffset >= 0) {
+ if (currentBlock != null) {
+ throw new IllegalStateException(
+ "if a block does not fully process a line then it must be closed"); //$NON-NLS-1$
+ }
+ } else {
+ break;
+ }
+ }
+ if (lineStates != null && !lineStates.isEmpty()) {
+ LineState lineState = lineStates.pop();
+ line = lineState.line;
+ lineOffset = lineState.lineOffset;
+ } else {
+ lineOffset = 0;
+ line = reader.readLine();
+ }
+ }
+ state.setLineNumber(reader.getLineNumber() + 1);
+ state.setLineOffset(reader.getLineOffset());
+ state.setLineCharacterOffset(0);
+ state.setLineLength(0);
+
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+
+ if (currentBlock != null && !currentBlock.isClosed()) {
+ currentBlock.setClosed(true);
+ }
+ if (nestedBlocks != null) {
+ while (!nestedBlocks.isEmpty()) {
+ Block block = nestedBlocks.pop();
+ if (!block.isClosed()) {
+ block.setClosed(true);
+ }
+ }
+ nestedBlocks = null;
+ }
+
+ if (asDocument) {
+ builder.endDocument();
+ }
+ } finally {
+ builder.setLocator(null);
+ }
+ }
+
+ private void initProcessors() {
+ for (Block block : getBlocks()) {
+ if (block.getMarkupLanguage() != null) {
+ return;
+ }
+ block.setMarkupLanguage(this);
+ }
+ }
+
+ public Block startBlock(String line, int lineOffset) {
+ if (isEmptyLine(line)) {
+ // nothing starts on an empty line
+ return null;
+ }
+ for (Block block : getBlocks()) {
+ if (block.canStart(line, lineOffset)) {
+ return block.clone();
+ }
+ }
+ return null;
+ }
+
+ public abstract List<Block> getBlocks();
+
+ /**
+ * configure the markup language with a configuration that may alter the language syntax and capabilities.
+ *
+ * @param configuration
+ * the configuration to use
+ * @throws UnsupportedOperationException
+ * markup languages that do not support configuration must throw this exception.
+ */
+ public void configure(MarkupLanguageConfiguration configuration) throws UnsupportedOperationException {
+ this.configuration = configuration;
+ initializeSyntax(true);
+ }
+
+ private void initializeSyntax(boolean force) {
+ if (force || !syntaxInitialized) {
+ syntaxInitialized = true;
+ initializeSyntax();
+ }
+ }
+
+ /**
+ * initialize the syntax of the markup language.
+ */
+ protected abstract void initializeSyntax();
+
+ /**
+ * Emit a markup line that may contain phrase modifiers and replacement tokens, but no block modifiers.
+ *
+ * @param parser
+ * @param state
+ * @param textLineOffset
+ * the offset of the provided text in the current line
+ * @param line
+ * the text to process
+ * @param offset
+ * the offset in the <code>text</code> at which processing should begin
+ */
+ public void emitMarkupLine(MarkupParser parser, ContentState state, int textLineOffset, String line, int offset) {
+ if (offset == line.length()) {
+ return;
+ }
+ if (blocksOnly) {
+ emitMarkupText(parser, state, line.substring(offset));
+ return;
+ }
+ int previousShift = state.getShift();
+ state.setShift(previousShift + textLineOffset);
+ for (;;) {
+ PatternBasedElementProcessor phraseModifier = getPhraseModifierSyntax().findPatternBasedElement(line,
+ offset);
+ if (phraseModifier != null) {
+ int newOffset = phraseModifier.getLineStartOffset();
+ if (offset < newOffset) {
+ state.setLineCharacterOffset(state.getShift() + offset);
+ state.setLineSegmentEndOffset(state.getShift() + newOffset);
+ String text = line.substring(offset, newOffset);
+ emitMarkupText(parser, state, text);
+ }
+ phraseModifier.setMarkupLanguage(this);
+ phraseModifier.setParser(parser);
+ phraseModifier.setState(state);
+ state.setLineCharacterOffset(state.getShift() + phraseModifier.getLineStartOffset());
+ state.setLineSegmentEndOffset(state.getShift() + phraseModifier.getLineEndOffset());
+ phraseModifier.emit();
+ offset = phraseModifier.getLineEndOffset();
+ if (offset >= line.length()) {
+ break;
+ }
+ } else {
+ state.setLineCharacterOffset(state.getShift() + offset);
+ state.setLineSegmentEndOffset(state.getShift() + line.length());
+ emitMarkupText(parser, state, line.substring(offset));
+ break;
+ }
+ }
+ state.setShift(previousShift);
+ }
+
+ /**
+ * Emit a markup line that may contain phrase modifiers and replacement tokens, but no block modifiers.
+ *
+ * @param parser
+ * @param state
+ * @param line
+ * @param offset
+ */
+ public void emitMarkupLine(MarkupParser parser, ContentState state, String line, int offset) {
+ emitMarkupLine(parser, state, 0, line, offset);
+ }
+
+ /**
+ * Emit markup that may contain replacement tokens but no phrase or block modifiers.
+ *
+ * @param parser
+ * @param state
+ * @param text
+ */
+ public void emitMarkupText(MarkupParser parser, ContentState state, String text) {
+ if (blocksOnly) {
+ parser.getBuilder().characters(text);
+ return;
+ }
+ int offset = 0;
+ for (;;) {
+ PatternBasedElementProcessor tokenReplacement = getReplacementTokenSyntax().findPatternBasedElement(text,
+ offset);
+ if (tokenReplacement != null) {
+ int newOffset = tokenReplacement.getLineStartOffset();
+ if (offset < newOffset) {
+ String text2 = text.substring(offset, newOffset);
+ emitMarkupText(parser, state, text2);
+ }
+ tokenReplacement.setMarkupLanguage(this);
+ tokenReplacement.setParser(parser);
+ tokenReplacement.setState(state);
+
+ state.setLineCharacterOffset(state.getShift() + tokenReplacement.getLineStartOffset());
+ state.setLineSegmentEndOffset(state.getShift() + tokenReplacement.getLineEndOffset());
+
+ tokenReplacement.emit();
+ offset = tokenReplacement.getLineEndOffset();
+ if (offset >= text.length()) {
+ break;
+ }
+ } else {
+ parser.getBuilder().characters(offset > 0 ? text.substring(offset) : text);
+ break;
+ }
+ }
+ }
+
+ private static class Group {
+ int count;
+ }
+
+ public static final class PatternBasedSyntax {
+ protected List<PatternBasedElement> elements = new ArrayList<PatternBasedElement>();
+
+ protected Pattern elementPattern;
+
+ protected List<Integer> elementGroup = new ArrayList<Integer>();
+
+ private final StringBuilder patternBuffer = new StringBuilder();
+
+ private int patternGroup = 0;
+
+ private final Stack<Group> groups = new Stack<Group>();
+ {
+ groups.push(new Group());
+ }
+
+ public PatternBasedSyntax() {
+ }
+
+ public void add(PatternBasedElement element) {
+ elementPattern = null;
+ elements.add(element);
+ if (groups.peek().count++ > 0) {
+ patternBuffer.append('|');
+ }
+ ++patternGroup;
+ patternBuffer.append('(');
+ patternBuffer.append(element.getPattern(patternGroup));
+ patternBuffer.append(')');
+ elementGroup.add(patternGroup);
+ patternGroup += element.getPatternGroupCount();
+ }
+
+ /**
+ * @since 1.1
+ */
+ protected List<PatternBasedElement> getElements() {
+ return Collections.unmodifiableList(elements);
+ }
+
+ public void beginGroup(String regexFragment, int size) {
+ add(regexFragment, size, true);
+ }
+
+ public void endGroup(String regexFragment, int size) {
+ add(regexFragment, size, false);
+ }
+
+ private void add(String regexFragment, int size, boolean beginGroup) {
+ elementPattern = null;
+ if (beginGroup) {
+ if (groups.peek().count++ > 0) {
+ patternBuffer.append('|');
+ }
+ groups.push(new Group());
+ patternBuffer.append("(?:"); //$NON-NLS-1$
+ } else {
+ groups.pop();
+ }
+ patternBuffer.append(regexFragment);
+ if (!beginGroup) {
+ patternBuffer.append(")"); //$NON-NLS-1$
+ }
+ patternGroup += size;
+ }
+
+ public PatternBasedElementProcessor findPatternBasedElement(String lineText, int offset) {
+ Matcher matcher = getPattern().matcher(lineText);
+ if (offset > 0) {
+ matcher.region(offset, lineText.length());
+ }
+ if (matcher.find()) {
+ int size = elementGroup.size();
+ for (int x = 0; x < size; ++x) {
+ int group = elementGroup.get(x);
+ String value = matcher.group(group);
+ if (value != null) {
+ PatternBasedElement element = elements.get(x);
+ PatternBasedElementProcessor processor = element.newProcessor();
+ processor.setLineStartOffset(matcher.start());
+ processor.setLineEndOffset(matcher.end());
+ processor.setGroup(0, matcher.group(0), matcher.start(0), matcher.end(0));
+ for (int y = 0; y < element.getPatternGroupCount(); ++y) {
+ final int groupIndex = group + y + 1;
+ processor.setGroup(y + 1, matcher.group(groupIndex), matcher.start(groupIndex),
+ matcher.end(groupIndex));
+ }
+ return processor;
+ }
+ }
+ throw new IllegalStateException();
+ } else {
+ return null;
+ }
+ }
+
+ public Pattern getPattern() {
+ if (elementPattern == null) {
+ if (patternBuffer.length() > 0) {
+ elementPattern = Pattern.compile(patternBuffer.toString());
+ } else {
+ return null;
+ }
+ }
+ return elementPattern;
+ }
+
+ public void clear() {
+ elements.clear();
+ elementPattern = null;
+ elementGroup.clear();
+ patternBuffer.delete(0, patternBuffer.length());
+ patternGroup = 0;
+ groups.clear();
+ groups.push(new Group());
+ }
+
+ }
+
+ protected abstract PatternBasedSyntax getPhraseModifierSyntax();
+
+ protected abstract PatternBasedSyntax getReplacementTokenSyntax();
+
+ /**
+ * The name of the markup language, typically the same as the name of the markup language supported by this markup
+ * language. This value may be displayed to the user.
+ *
+ * @return the name, or null if unknown
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * The name of the markup language, typically the same as the name of the markup language supported by this markup
+ * language. This value may be displayed to the user.
+ *
+ * @param name
+ * the name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * The name of the markup language that is extended by this one
+ *
+ * @return the name, or null if this markup language does not extend another.
+ */
+ public String getExtendsLanguage() {
+ return extendsLanguage;
+ }
+
+ /**
+ * The name of the markup language that is extended by this one
+ *
+ * @param extendsLanguage
+ * the name, or null if this markup language does not extend another.
+ */
+ public void setExtendsLanguage(String extendsLanguage) {
+ this.extendsLanguage = extendsLanguage;
+ }
+
+ /**
+ * Indicate if generative contents should be filtered. This option is used with the {@link OutlineParser}.
+ */
+ public boolean isFilterGenerativeContents() {
+ return filterGenerativeBlocks;
+ }
+
+ /**
+ * Indicate if table of contents should be filtered. This option is used with the {@link OutlineParser}.
+ */
+ public void setFilterGenerativeContents(boolean filterGenerativeBlocks) {
+ this.filterGenerativeBlocks = filterGenerativeBlocks;
+ }
+
+ /**
+ * indicate if the parser should detect blocks only. This is useful for use in a document partitioner where the
+ * partition boundaries are defined by blocks.
+ */
+ public boolean isBlocksOnly() {
+ return blocksOnly;
+ }
+
+ /**
+ * indicate if the parser should detect blocks only. This is useful for use in a document partitioner where the
+ * partition boundaries are defined by blocks.
+ */
+ public void setBlocksOnly(boolean blocksOnly) {
+ this.blocksOnly = blocksOnly;
+ }
+
+ /**
+ * indicate if the given line is considered 'empty'. The default implementation returns true for lines of length 0,
+ * and for lines whose only content is whitespace.
+ *
+ * @param line
+ * the line content
+ *
+ * @return true if the given line is considered empty by this markup language
+ */
+ public boolean isEmptyLine(String line) {
+ if (line.length() == 0) {
+ return true;
+ }
+ for (int x = 0; x < line.length(); ++x) {
+ if (!Character.isWhitespace(line.charAt(x))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * The pattern to use when creating hyperlink targets for internal links. The pattern is implementation-specific,
+ * however implementations are encouraged to use {@link MessageFormat}, where the 0th parameter is the internal
+ * link.
+ *
+ * @see MessageFormat
+ */
+ public String getInternalLinkPattern() {
+ return internalLinkPattern;
+ }
+
+ /**
+ * The pattern to use when creating hyperlink targets for internal links. The pattern is implementation-specific,
+ * however implementations are encouraged to use {@link MessageFormat}, where the 0th parameter is the internal
+ * link.
+ *
+ * @see MessageFormat
+ */
+ public void setInternalLinkPattern(String internalLinkPattern) {
+ this.internalLinkPattern = internalLinkPattern;
+ }
+
+ /**
+ * Indicate if this markup language detects 'raw' hyperlinks; that is hyperlinks without any special markup. The
+ * default implementation checks the markup syntax for use of {@link ImpliedHyperlinkReplacementToken} and returns
+ * true if it is in the syntax.
+ *
+ * @return true if raw hyperlinks are detected by this markup language, otherwise false.
+ *
+ * @since 1.1
+ */
+ public boolean isDetectingRawHyperlinks() {
+ initializeSyntax(false);
+ PatternBasedSyntax replacementTokenSyntax = getReplacementTokenSyntax();
+ if (replacementTokenSyntax != null) {
+ for (PatternBasedElement element : replacementTokenSyntax.getElements()) {
+ if (element instanceof ImpliedHyperlinkReplacementToken) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/MarkupLanguageConfiguration.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/MarkupLanguageConfiguration.java
new file mode 100644
index 0000000..96e74f0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/MarkupLanguageConfiguration.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage.PatternBasedSyntax;
+
+/**
+ * A configuration for a markup language, which enables client code to modify the syntax of the markup language by
+ * adding blocks, phrase modifiers, and tokens. Also provides a mechanism for disabling some common markup language
+ * features.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class MarkupLanguageConfiguration implements Cloneable {
+
+ private List<Block> blocks = new ArrayList<Block>();
+
+ private List<PatternBasedElement> phraseModifiers = new ArrayList<PatternBasedElement>();
+
+ private List<PatternBasedElement> tokens = new ArrayList<PatternBasedElement>();
+
+ private boolean escapingHtmlAndXml = false;
+
+ private boolean enableUnwrappedParagraphs = true;
+
+ private boolean newlinesMustCauseLineBreak = false;
+
+ private boolean optimizeForRepositoryUsage = false;
+
+ private Boolean wikiWordLinking = true;
+
+ public List<PatternBasedElement> getTokens() {
+ return tokens;
+ }
+
+ public List<PatternBasedElement> getPhraseModifiers() {
+ return phraseModifiers;
+ }
+
+ public List<Block> getBlocks() {
+ return blocks;
+ }
+
+ /**
+ * Indicate if the given block should break paragraph content even if there is no blank line preceding it. The
+ * default implementation returns true.
+ *
+ * @param block
+ * the block
+ * @return true if the block should break paragraph content
+ */
+ public boolean isParagraphBreaking(Block block) {
+ return true;
+ }
+
+ /**
+ * Indicate if this language should escape HTML and XML tags. When HTML and XML tags are escaped they appear as
+ * literals in the page, rather than affecting the presentation. The default is false.
+ */
+ public boolean isEscapingHtmlAndXml() {
+ return escapingHtmlAndXml;
+ }
+
+ /**
+ * Indicate if this language should escape HTML and XML tags. When HTML and XML tags are escaped they appear as
+ * literals in the page, rather than affecting the presentation. The default is false.
+ */
+ public void setEscapingHtmlAndXml(boolean escapingHtmlAndXml) {
+ this.escapingHtmlAndXml = escapingHtmlAndXml;
+ }
+
+ /**
+ * indicate if unwrapped paragraphs should be supported. Unwrapped paragraphs are those that are not nested in
+ * <p> or <div> tags. The default is true.
+ */
+ public boolean isEnableUnwrappedParagraphs() {
+ return enableUnwrappedParagraphs;
+ }
+
+ /**
+ * indicate if unwrapped paragraphs should be supported. Unwrapped paragraphs are those that are not nested in
+ * <p> or <div> tags. The default is true.
+ */
+ public void setEnableUnwrappedParagraphs(boolean enableUnwrappedParagraphs) {
+ this.enableUnwrappedParagraphs = enableUnwrappedParagraphs;
+ }
+
+ /**
+ * Indicate if newlines in the markup must cause a line break. If false, then the default markup language behaviour
+ * should be observed. The default is false.
+ */
+ public boolean isNewlinesMustCauseLineBreak() {
+ return newlinesMustCauseLineBreak;
+ }
+
+ /**
+ * Indicate if newlines in the markup must cause a line break. If false, then the default markup language behaviour
+ * should be observed. The default is false.
+ */
+ public void setNewlinesMustCauseLineBreak(boolean newlinesMustCauseLineBreak) {
+ this.newlinesMustCauseLineBreak = newlinesMustCauseLineBreak;
+ }
+
+ /**
+ * Indicate if newlines in the markup must cause a line break. If false, then the default markup language behaviour
+ * should be observed. The default is false.
+ */
+ public void addPhraseModifierExtensions(PatternBasedSyntax phraseModifierSyntax) {
+ for (PatternBasedElement element : getPhraseModifiers()) {
+ phraseModifierSyntax.add(element);
+ }
+ }
+
+ /**
+ * indicate if the markup syntax should be optimized for use with a task repository.
+ */
+ public boolean isOptimizeForRepositoryUsage() {
+ return optimizeForRepositoryUsage;
+ }
+
+ /**
+ * indicate if the markup syntax should be optimized for use with a task repository.
+ */
+ public void setOptimizeForRepositoryUsage(boolean optimizeForRepositoryUsage) {
+ this.optimizeForRepositoryUsage = optimizeForRepositoryUsage;
+ }
+
+ /**
+ * indicate if WikiWord linking should be enabled if the markup language supports it. If null then the default
+ * markup language behaviour should be observed.
+ *
+ * @since 1.1
+ */
+ public Boolean isWikiWordLinking() {
+ return wikiWordLinking;
+ }
+
+ /**
+ * indicate if WikiWord linking should be enabled if the markup language supports it. If null then the default
+ * markup language behaviour should be observed.
+ *
+ * @since 1.1
+ */
+ public void setWikiWordLinking(Boolean wikiWordLinking) {
+ this.wikiWordLinking = wikiWordLinking;
+ }
+
+ public void addBlockExtensions(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ for (Block block : getBlocks()) {
+ blocks.add(computeInsertPosition(block), block);
+ if (isParagraphBreaking(block)) {
+ paragraphBreakingBlocks.add(block);
+ }
+ }
+ }
+
+ protected int computeInsertPosition(Block block) {
+ return 0;
+ }
+
+ public void addTokenExtensions(PatternBasedSyntax tokenSyntax) {
+ for (PatternBasedElement element : getPhraseModifiers()) {
+ tokenSyntax.add(element);
+ }
+ }
+
+ @Override
+ public MarkupLanguageConfiguration clone() {
+ try {
+ MarkupLanguageConfiguration copy = (MarkupLanguageConfiguration) super.clone();
+ copy.blocks = new ArrayList<Block>(blocks.size());
+ for (Block block : blocks) {
+ copy.blocks.add(block.clone());
+ }
+ copy.phraseModifiers = new ArrayList<PatternBasedElement>(phraseModifiers.size());
+ for (PatternBasedElement element : phraseModifiers) {
+ copy.phraseModifiers.add(element.clone());
+ }
+ copy.tokens = new ArrayList<PatternBasedElement>(tokens.size());
+ for (PatternBasedElement element : tokens) {
+ copy.tokens.add(element.clone());
+ }
+ return copy;
+ } catch (CloneNotSupportedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/PatternBasedElement.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/PatternBasedElement.java
new file mode 100644
index 0000000..64a1bd8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/PatternBasedElement.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+/**
+ * An element of markup that is detected using a regular expression pattern. Serves as a means of detecting markup
+ * elements and providing a factory for processors that can process the markup element.
+ *
+ * Implementations of this class must be thread-safe (generally stateless).
+ *
+ * @author David Green
+ */
+public abstract class PatternBasedElement implements Cloneable {
+
+ /**
+ * Get the regular expression pattern that matches this element. Generally the pattern may be assembled into a
+ * single larger regular expression.
+ *
+ * @param groupOffset
+ * the offset of the groups in the pattern, 0 indicating no offset
+ *
+ * @return the regular expression pattern
+ */
+ protected abstract String getPattern(int groupOffset);
+
+ /**
+ * The number of capturing groups in the {@link #getPattern(int) pattern}. Note that implementations must take care
+ * to return the correct value otherwise the markup language will not work correctly.
+ */
+ protected abstract int getPatternGroupCount();
+
+ /**
+ * create a new processor for processing the type of element detected by this class.
+ */
+ protected abstract PatternBasedElementProcessor newProcessor();
+
+ @Override
+ public PatternBasedElement clone() {
+ try {
+ return (PatternBasedElement) super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new IllegalStateException();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/PatternBasedElementProcessor.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/PatternBasedElementProcessor.java
new file mode 100644
index 0000000..ddebf9c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/PatternBasedElementProcessor.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+
+/**
+ * A processor that is capable of processing a specific type of markup element
+ *
+ * @author David Green
+ *
+ */
+public abstract class PatternBasedElementProcessor extends Processor implements
+ org.eclipse.mylyn.wikitext.core.parser.util.Matcher {
+
+ protected int lineStartOffset;
+
+ protected int lineEndOffset;
+
+ protected Map<Integer, Group> groupByIndex;
+
+ private static class Group {
+ private final String text;
+
+ private final int start;
+
+ private final int end;
+
+ public Group(String text, int start, int end) {
+ this.text = text;
+ this.start = start;
+ this.end = end;
+ }
+ }
+
+ /**
+ * Set the captured text for the given group.
+ *
+ * @param group
+ * the 1-based group
+ * @param capturedText
+ * the text that was captured
+ *
+ * @see #group(int)
+ */
+ public void setGroup(int group, String capturedText, int start, int end) {
+ if (groupByIndex == null) {
+ groupByIndex = new HashMap<Integer, Group>();
+ }
+ groupByIndex.put(group, new Group(capturedText, start, end));
+ }
+
+ /**
+ * Get the offset within the line at which this element was started
+ *
+ * @see Matcher#start()
+ */
+ public int getLineStartOffset() {
+ return lineStartOffset;
+ }
+
+ public void setLineStartOffset(int lineStartOffset) {
+ this.lineStartOffset = lineStartOffset;
+ }
+
+ /**
+ * Get the offset within the line at which this element ended
+ *
+ * @see Matcher#end()
+ */
+ public int getLineEndOffset() {
+ return lineEndOffset;
+ }
+
+ public void setLineEndOffset(int lineEndOffset) {
+ this.lineEndOffset = lineEndOffset;
+ }
+
+ /**
+ * Get the capturing group text, or null if the group did not match any text.
+ *
+ * @param groupNumber
+ * the 1-based group
+ *
+ * @return the text, or null if the group did not match any text
+ *
+ * @see Matcher#group(int)
+ */
+ public String group(int groupNumber) {
+ if (groupByIndex == null) {
+ return null;
+ }
+ Group group = groupByIndex.get(groupNumber);
+ return group == null ? null : group.text;
+ }
+
+ /**
+ * Get the start offset of a capturing group, or -1 if the group did not match any text.
+ *
+ * @param groupNumber
+ * the 1-based group
+ *
+ * @return the start offset, or -1 if the group did not match any text
+ *
+ * @see Matcher#start(int)
+ */
+ public int start(int groupNumber) {
+ if (groupByIndex == null) {
+ return -1;
+ }
+ Group group = groupByIndex.get(groupNumber);
+ return group == null ? -1 : group.start;
+ }
+
+ /**
+ * Get the end offset of a capturing group, or -1 if the group did not match any text.
+ *
+ * @param groupNumber
+ * the 1-based group
+ *
+ * @return the end offset, or -1 if the group did not match any text
+ *
+ * @see Matcher#start(int)
+ */
+ public int end(int groupNumber) {
+ if (groupByIndex == null) {
+ return -1;
+ }
+ Group group = groupByIndex.get(groupNumber);
+ return group == null ? -1 : group.end;
+ }
+
+ /**
+ * Emit the content of the element
+ */
+ public abstract void emit();
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/Processor.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/Processor.java
new file mode 100644
index 0000000..c7e0b47
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/Processor.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class Processor implements Cloneable {
+ protected MarkupLanguage markupLanguage;
+
+ protected DocumentBuilder builder;
+
+ protected MarkupParser parser;
+
+ protected ContentState state;
+
+ public Processor() {
+ super();
+ }
+
+ /**
+ * The builder that is the target for output
+ */
+ public DocumentBuilder getBuilder() {
+ return builder;
+ }
+
+ /**
+ * The parser that is actively using this processor
+ */
+ public MarkupParser getParser() {
+ return parser;
+ }
+
+ public void setParser(MarkupParser parser) {
+ if (parser != null && parser.getMarkupLanguage() != markupLanguage) {
+ if (markupLanguage == null) {
+ markupLanguage = parser.getMarkupLanguage();
+ } else {
+ throw new IllegalStateException();
+ }
+ }
+ this.parser = parser;
+ this.builder = (parser == null) ? null : parser.getBuilder();
+
+ }
+
+ void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public ContentState getState() {
+ return state;
+ }
+
+ public void setState(ContentState state) {
+ this.state = state;
+ }
+
+ @Override
+ public Processor clone() {
+ try {
+ Processor copy = (Processor) super.clone();
+ copy.parser = null;
+ copy.state = null;
+ copy.builder = null;
+ copy.markupLanguage = null;
+ return copy;
+ } catch (CloneNotSupportedException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/EclipseErrorDetailsBlock.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/EclipseErrorDetailsBlock.java
new file mode 100644
index 0000000..5fb43b9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/EclipseErrorDetailsBlock.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup.block;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ * A block that starts a preformatted section that begins with <tt>-- Error Details --</tt>, which is the prefix for
+ * error information inserted into a bug description by Mylyn when creating bugs from the Eclipse Error Log view. The
+ * block terminates with the first {@link MarkupLanguage#isEmptyLine(String) empty line}.
+ *
+ * @author David Green
+ * @since 1.1
+ */
+public class EclipseErrorDetailsBlock extends Block {
+
+ private static final Pattern START_PATTERN = Pattern.compile("\\s*-- Error Details --.*"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && START_PATTERN.matcher(line).matches()) {
+ blockLineCount = 0;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected int processLineContent(String line, int offset) {
+ if (blockLineCount++ == 0) {
+ Attributes attributes = new Attributes();
+ attributes.setCssClass("eclipseErrorDetails"); //$NON-NLS-1$
+ builder.beginBlock(BlockType.PREFORMATTED, attributes);
+ } else {
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ builder.characters(offset > 0 ? line.substring(offset) : line);
+ builder.characters("\n"); //$NON-NLS-1$
+
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/GlossaryBlock.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/GlossaryBlock.java
new file mode 100644
index 0000000..6cae979
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/GlossaryBlock.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.block;
+
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.ContentState;
+
+/**
+ * An abstract implementation of a glossary. Emits a definition list containing all terms
+ * {@link ContentState#getGlossaryTerms() defined} in the document.
+ *
+ * Subclasses need only define {Block{@link #canStart(String, int)}.
+ *
+ * @author David Green
+ */
+public abstract class GlossaryBlock extends Block {
+
+ protected int blockLineNumber = 0;
+
+ private String style;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineNumber++ > 0) {
+ setClosed(true);
+ return 0;
+ }
+ if (!getMarkupLanguage().isFilterGenerativeContents()) {
+ SortedMap<String, String> glossary = new TreeMap<String, String>(state.getGlossaryTerms());
+
+ builder.beginBlock(BlockType.DEFINITION_LIST, new Attributes(null, null, style == null ? null
+ : "list-style: " + style, null)); //$NON-NLS-1$
+ Attributes nullAttributes = new Attributes();
+ for (Map.Entry<String, String> ent : glossary.entrySet()) {
+ builder.beginBlock(BlockType.DEFINITION_TERM, nullAttributes);
+ builder.characters(ent.getKey());
+ builder.endBlock();
+
+ builder.beginBlock(BlockType.DEFINITION_ITEM, nullAttributes);
+ builder.characters(ent.getValue());
+ builder.endBlock();
+ }
+
+ builder.endBlock();
+ }
+ return -1;
+ }
+
+ /**
+ * the CSS style of the glossary block
+ *
+ * @return the style, or null if the style is not defined
+ */
+ public String getStyle() {
+ return style;
+ }
+
+ /**
+ * the CSS style of the glossary block
+ *
+ * @param style
+ * the style, or null if the style is not defined
+ */
+ public void setStyle(String style) {
+ this.style = style;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed) {
+ style = null;
+ }
+ super.setClosed(closed);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/JavaStackTraceBlock.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/JavaStackTraceBlock.java
new file mode 100644
index 0000000..d091ee4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/JavaStackTraceBlock.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup.block;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * A block for Java stack traces. Matches any text that looks like a stack trace, even if it is only a portion (it's
+ * common for stack traces to be clipped to eliminate unrelated text).
+ *
+ * @author David Green
+ * @since 1.1
+ */
+public class JavaStackTraceBlock extends Block {
+
+//java.lang.Exception: java.lang.IllegalStateException
+// at org.eclipse.mylyn.internal.wikitext.tasks.ui.util.Test.main(Test.java:21)
+//Caused by: java.lang.IllegalStateException
+// ... 1 more
+
+ private static final String PACKAGE_PART = "([a-z][a-z0-9]*)"; //$NON-NLS-1$
+
+ private static final String CLASS_PART = "([A-Za-z][a-z0-9_$]*)+"; //$NON-NLS-1$
+
+ private static final String FQN_PART = PACKAGE_PART + "(\\." + PACKAGE_PART + ")*\\." + CLASS_PART; //$NON-NLS-1$ //$NON-NLS-2$
+
+ private static final Pattern STACK_TRACE_PATTERN = Pattern.compile("\\s*((" + "((Caused by:\\s+)|(at\\s+))?" //$NON-NLS-1$//$NON-NLS-2$
+ + FQN_PART + "((:\\s+\\w.*)|(\\.((\\<init\\>)|([a-zA-Z0-9_$]+))\\(.*?\\)))?" //$NON-NLS-1$
+ + ")|(\\.\\.\\.\\s\\d+\\smore))"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ // XXX disabled due to bug 283629
+ // if (lineOffset == 0 && STACK_TRACE_PATTERN.matcher(line).matches()) {
+// blockLineCount = 0;
+// return true;
+// }
+ return false;
+ }
+
+ @Override
+ protected int processLineContent(String line, int offset) {
+ if (blockLineCount++ == 0) {
+ Attributes attributes = new Attributes();
+ attributes.setCssClass("javaStackTrace"); //$NON-NLS-1$
+ builder.beginBlock(BlockType.PREFORMATTED, attributes);
+ } else {
+ if (!STACK_TRACE_PATTERN.matcher(line).matches()) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ builder.characters(offset > 0 ? line.substring(offset) : line);
+ builder.characters("\n"); //$NON-NLS-1$
+
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/package-info.java
new file mode 100644
index 0000000..6ac2033
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/block/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * reusable {@link org.eclipse.mylyn.wikitext.core.parser.markup.Block} components for implementing a markup language parser
+ */
+package org.eclipse.mylyn.wikitext.core.parser.markup.block;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/package-info.java
new file mode 100644
index 0000000..a589d9d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * comopnents for implementing a parser in terms of a {@link MarkupLanguage}
+ */
+package org.eclipse.mylyn.wikitext.core.parser.markup;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlCommentPhraseModifier.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlCommentPhraseModifier.java
new file mode 100644
index 0000000..2aeba8b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlCommentPhraseModifier.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A phrase modifier that detects HTML and XML comments in the source.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class HtmlCommentPhraseModifier extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(<!--|-->)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(false);
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlEndTagPhraseModifier.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlEndTagPhraseModifier.java
new file mode 100644
index 0000000..73c50c6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlEndTagPhraseModifier.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A phrase modifier that detects HTML and XML end-tags in the source, passing them through to the builder as either
+ * escaped or unescaped text.
+ *
+ * @see HtmlStartTagPhraseModifier
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class HtmlEndTagPhraseModifier extends PatternBasedElement {
+
+ private final boolean escaping;
+
+ /**
+ * construct this phrase modifier with no escaping.
+ */
+ public HtmlEndTagPhraseModifier() {
+ this(false);
+ }
+
+ /**
+ * @param escaping
+ * indicate if the markup should be escaped
+ */
+ public HtmlEndTagPhraseModifier(boolean escaping) {
+ this.escaping = escaping;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(</[a-zA-Z][a-zA-Z0-9_:-]*\\s*>)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(escaping);
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlStartTagPhraseModifier.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlStartTagPhraseModifier.java
new file mode 100644
index 0000000..e827004
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/HtmlStartTagPhraseModifier.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A phrase modifier that detects HTML and XML tags in the source, passing them through to the builder as either escaped
+ * or unescaped text.
+ *
+ * @see HtmlEndTagPhraseModifier
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class HtmlStartTagPhraseModifier extends PatternBasedElement {
+
+ private final boolean escaping;
+
+ /**
+ * construct this as unescaping
+ */
+ public HtmlStartTagPhraseModifier() {
+ this(false);
+ }
+
+ /**
+ * @param escaping
+ * indicate if the markup should be escaped
+ */
+ public HtmlStartTagPhraseModifier(boolean escaping) {
+ this.escaping = escaping;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(<[a-zA-Z][a-zA-Z0-9_:-]*(?:\\s*[a-zA-Z][a-zA-Z0-9_:-]*=\"[^\"]*\")*\\s*/?>)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(escaping);
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LimitedHtmlEndTagPhraseModifier.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LimitedHtmlEndTagPhraseModifier.java
new file mode 100644
index 0000000..3f424ce
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LimitedHtmlEndTagPhraseModifier.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A phrase modifier that detects HTML and XML end-tags, but only those that are explicitly specified. The detected
+ * markup is passed through to the builder unescaped.
+ *
+ * @see LimitedHtmlStartTagPhraseModifier
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LimitedHtmlEndTagPhraseModifier extends PatternBasedElement {
+
+ private final String pattern;
+
+ /**
+ * @param elementNames
+ * the element names to be detected.
+ */
+ public LimitedHtmlEndTagPhraseModifier(String... elementNames) {
+ StringBuilder buf = new StringBuilder();
+ buf.append("(</"); //$NON-NLS-1$
+ buf.append("(?:"); //$NON-NLS-1$
+ int index = 0;
+ for (String elementName : elementNames) {
+ if (index++ > 0) {
+ buf.append("|"); //$NON-NLS-1$
+ }
+ buf.append(elementName);
+ }
+ buf.append(")\\s*>)"); //$NON-NLS-1$
+ pattern = buf.toString();
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return pattern;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(false);
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LimitedHtmlStartTagPhraseModifier.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LimitedHtmlStartTagPhraseModifier.java
new file mode 100644
index 0000000..7b8efa3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LimitedHtmlStartTagPhraseModifier.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A phrase modifier that detects HTML and XML tags, but only those that are explicitly specified. The detected markup
+ * is passed through to the builder unescaped.
+ *
+ * @see LimitedHtmlStartTagPhraseModifier
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LimitedHtmlStartTagPhraseModifier extends PatternBasedElement {
+
+ private final String pattern;
+
+ /**
+ * @param elementNames
+ * the element names to be detected.
+ */
+ public LimitedHtmlStartTagPhraseModifier(String... elementNames) {
+ StringBuilder buf = new StringBuilder();
+ buf.append("(<"); //$NON-NLS-1$
+ buf.append("(?:"); //$NON-NLS-1$
+ int index = 0;
+ for (String elementName : elementNames) {
+ if (index++ > 0) {
+ buf.append("|"); //$NON-NLS-1$
+ }
+ buf.append(elementName);
+ }
+ buf.append(")(?:\\s*[a-zA-Z][a-zA-Z0-9_:-]*=\"[^\"]*\")*\\s*/?>)"); //$NON-NLS-1$
+ pattern = buf.toString();
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return pattern;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(false);
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LiteralPhraseModifierProcessor.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LiteralPhraseModifierProcessor.java
new file mode 100644
index 0000000..85db0ea
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/LiteralPhraseModifierProcessor.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A processor that emits the first group as characters, optionally unescaped.
+ *
+ * @see DocumentBuilder#characters(String)
+ * @see DocumentBuilder#charactersUnescaped(String)
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LiteralPhraseModifierProcessor extends PatternBasedElementProcessor {
+
+ private final boolean escaping;
+
+ private final int group;
+
+ /**
+ * Construct this with a group of 1.
+ *
+ * @param escaping
+ * indicate if the processor should escape characters
+ */
+ public LiteralPhraseModifierProcessor(boolean escaping) {
+ this(escaping, 1);
+ }
+
+ /**
+ * @param escaping
+ * indicate if the processor should escape characters
+ * @param group
+ * the {@link PatternBasedElementProcessor#group(int) group} of characters to emit
+ */
+ public LiteralPhraseModifierProcessor(boolean escaping, int group) {
+ this.escaping = escaping;
+ this.group = group;
+ }
+
+ @Override
+ public void emit() {
+ if (escaping) {
+ getBuilder().characters(group(group));
+ } else {
+ getBuilder().charactersUnescaped(group(group));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/package-info.java
new file mode 100644
index 0000000..ca8c418
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/phrase/package-info.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * reusable {@link org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement} components for implementing
+ * phrase modifiers of a markup language parser
+ */
+package org.eclipse.mylyn.wikitext.core.parser.markup.phrase;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/AcronymReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/AcronymReplacementToken.java
new file mode 100644
index 0000000..b3d48c4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/AcronymReplacementToken.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A token for acronyms, which are defined as 3 or more upper-case letters followed immediately by parentheses with one
+ * or more words. For example: ABW(A Better Way)
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class AcronymReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:(?:(?<=\\W)|^)([A-Z]{3,})\\(([^\\)]+)\\))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new AcronymReplacementTokenProcessor();
+ }
+
+ private static class AcronymReplacementTokenProcessor extends PatternBasedElementProcessor {
+
+ @Override
+ public void emit() {
+ String acronym = group(1);
+ String acronymDef = group(2);
+ state.addGlossaryTerm(acronym, acronymDef);
+ builder.acronym(acronym, acronymDef);
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityReferenceReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityReferenceReplacementToken.java
new file mode 100644
index 0000000..19c30ba
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityReferenceReplacementToken.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import java.util.regex.Pattern;
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class EntityReferenceReplacementToken extends PatternEntityReferenceReplacementToken {
+
+ public EntityReferenceReplacementToken(String token, String replacement) {
+ super("(" + Pattern.quote(token) + ")", replacement); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityReplacementTokenProcessor.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityReplacementTokenProcessor.java
new file mode 100644
index 0000000..c0350cf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityReplacementTokenProcessor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A token processor that emits a specified XML entity reference.
+ *
+ * @see DocumentBuilder#entityReference(String)
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class EntityReplacementTokenProcessor extends PatternBasedElementProcessor {
+
+ private final String entity;
+
+ /**
+ * @param entity
+ * the entity to emit
+ */
+ public EntityReplacementTokenProcessor(String entity) {
+ this.entity = entity;
+ }
+
+ @Override
+ public void emit() {
+ getBuilder().entityReference(entity);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityWrappingReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityWrappingReplacementToken.java
new file mode 100644
index 0000000..327607c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityWrappingReplacementToken.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A replacement token for segments of text that are delimited by specified text. Useful for replacing delimiting
+ * characters, for example text wrapped by double quotes could be replaced with the same text delimited by single
+ * quotes.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class EntityWrappingReplacementToken extends PatternBasedElement {
+
+ private final String delimiter;
+
+ private final String leftEntity;
+
+ private final String rightEntity;
+
+ public EntityWrappingReplacementToken(String delimiter, String leftEntity, String rightEntity) {
+ this.delimiter = delimiter;
+ this.leftEntity = leftEntity;
+ this.rightEntity = rightEntity;
+ if (delimiter.length() != 1) {
+ throw new IllegalArgumentException(delimiter);
+ }
+ }
+
+ @Override
+ public String getPattern(int groupOffset) {
+ String quoted = Character.isLetterOrDigit(delimiter.charAt(0)) ? delimiter : "\\" + delimiter; //$NON-NLS-1$
+ return "(?:(?:(?<=\\W)|^)" + quoted + "([^" + quoted + "]+)" + quoted + "(?=\\W))"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new EntityWrappingReplacementTokenProcessor(leftEntity, rightEntity);
+ }
+
+ private static class EntityWrappingReplacementTokenProcessor extends PatternBasedElementProcessor {
+ private final String leftEntity;
+
+ private final String rightEntity;
+
+ public EntityWrappingReplacementTokenProcessor(String leftEntity, String rightEntity) {
+ this.leftEntity = leftEntity;
+ this.rightEntity = rightEntity;
+ }
+
+ @Override
+ public void emit() {
+ String content = group(1);
+ builder.entityReference(leftEntity);
+ builder.characters(content);
+ builder.entityReference(rightEntity);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/ImpliedHyperlinkReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/ImpliedHyperlinkReplacementToken.java
new file mode 100644
index 0000000..bda75e2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/ImpliedHyperlinkReplacementToken.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A token that detects hyperlinks in the markup and emits them as a link. hyperlinks must use the HTTP or HTTPS
+ * protocols to be detected.
+ *
+ * Url detection is based on RFC 3986.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ImpliedHyperlinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ public String getPattern(int groupOffset) {
+ // based on RFC 3986
+ // even though it's valid we don't want to detect URLs that end with '.', ',', ';', ':' or ')'
+ return "(https?://[a-zA-Z0-9%._~!$&?#'()*+,;:@/=-]*[a-zA-Z0-9_~!$&?#'(*+@/=-])"; //$NON-NLS-1$
+ }
+
+ @Override
+ public int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String target = group(1);
+ getBuilder().link(target, target);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/LineBreakReplacementTokenProcessor.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/LineBreakReplacementTokenProcessor.java
new file mode 100644
index 0000000..c7e8d13
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/LineBreakReplacementTokenProcessor.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A processor that emits a line break.
+ *
+ * @see DocumentBuilder#lineBreak()
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LineBreakReplacementTokenProcessor extends PatternBasedElementProcessor {
+
+ @Override
+ public void emit() {
+ getBuilder().lineBreak();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/LiteralReplacementTokenProcessor.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/LiteralReplacementTokenProcessor.java
new file mode 100644
index 0000000..d447391
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/LiteralReplacementTokenProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A processor that emits a literal unescaped. Useful for emitting markup that is not directly supported by the
+ * {@link DocumentBuilder builder}.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LiteralReplacementTokenProcessor extends PatternBasedElementProcessor {
+
+ private final String literal;
+
+ public LiteralReplacementTokenProcessor(String literal) {
+ this.literal = literal;
+ }
+
+ @Override
+ public void emit() {
+ getBuilder().charactersUnescaped(literal);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternEntityReferenceReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternEntityReferenceReplacementToken.java
new file mode 100644
index 0000000..ce57491
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternEntityReferenceReplacementToken.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * Replaces strings matching a pattern with a specified entity reference.
+ *
+ * @see EntityReplacementTokenProcessor
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class PatternEntityReferenceReplacementToken extends PatternBasedElement {
+
+ private final String pattern;
+
+ private final String replacement;
+
+ public PatternEntityReferenceReplacementToken(String pattern, String replacement) {
+ this.pattern = pattern;
+ this.replacement = replacement;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return pattern;
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new EntityReplacementTokenProcessor(replacement);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternLineBreakReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternLineBreakReplacementToken.java
new file mode 100644
index 0000000..4b62965
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternLineBreakReplacementToken.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * Replaces text that matches a pattern with a line break.
+ *
+ * @see LineBreakReplacementTokenProcessor
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class PatternLineBreakReplacementToken extends PatternBasedElement {
+
+ private final String pattern;
+
+ public PatternLineBreakReplacementToken(String pattern) {
+ this.pattern = pattern;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return pattern;
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LineBreakReplacementTokenProcessor();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternLiteralReplacementToken.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternLiteralReplacementToken.java
new file mode 100644
index 0000000..8adc381
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/PatternLiteralReplacementToken.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * Replaces text matching a pattern with an unescaped literal.
+ *
+ * @see LiteralReplacementTokenProcessor
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class PatternLiteralReplacementToken extends PatternBasedElement {
+
+ private final String pattern;
+
+ private final String replacement;
+
+ public PatternLiteralReplacementToken(String pattern, String replacement) {
+ this.pattern = pattern;
+ this.replacement = replacement;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return pattern;
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralReplacementTokenProcessor(replacement);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/package-info.java
new file mode 100644
index 0000000..5646110
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/package-info.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * reusable {@link org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement} components for implementing
+ * replacement tokens of a markup language parser
+ */
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineItem.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineItem.java
new file mode 100644
index 0000000..a2d8523
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineItem.java
@@ -0,0 +1,422 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.outline;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An item in a document outline. A document outline reflects the heading structure of the document. Generally there is
+ * always a root item that represents the document itself. Every level-1 heading becomes a child item of the root.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class OutlineItem {
+
+ private OutlineItem parent;
+
+ private final int level;
+
+ private List<OutlineItem> children = new ArrayList<OutlineItem>();
+
+ private final int offset;
+
+ private int length;
+
+ private final String id;
+
+ private String label;
+
+ private String kind;
+
+ private int childOffset;
+
+ private String tooltip;
+
+ private Map<String, OutlineItem> itemsById;
+
+ private String resourcePath;
+
+ private int hash = -1;
+
+ private String positionKey;
+
+ public OutlineItem(OutlineItem parent, int level, String id, int offset, int length, String label) {
+ super();
+ this.parent = parent;
+ this.level = (parent == null) ? 0 : level;
+ if (parent != null && level < parent.getLevel()) {
+ throw new IllegalArgumentException();
+ }
+ this.id = id;
+ this.offset = offset;
+ this.length = length;
+ this.label = label;
+ if (parent != null) {
+ parent.addChild(this);
+ }
+ }
+
+ /**
+ * get the length of the outline item, which corresponds to the length of the heading text. The length does not
+ * include content following the heading text itself.
+ *
+ * @see #getSectionLength()
+ */
+ public int getLength() {
+ return length;
+ }
+
+ /**
+ * get the length of the section, which is the length of the heading text plus the length of any following content
+ * up to the next peer-leveled heading or the parent's following sibling.
+ *
+ * @see #getLength()
+ */
+ public int getSectionLength() {
+ if (parent == null) {
+ return length;
+ }
+ List<OutlineItem> siblings = getParent().getChildren();
+ int index = siblings.indexOf(this);
+ if (index < (siblings.size() - 1)) {
+ return siblings.get(index + 1).getOffset() - getOffset();
+ }
+ int parentRelativeOffset = getOffset() - parent.getOffset();
+ return parent.getSectionLength() - parentRelativeOffset;
+ }
+
+ public String getKind() {
+ return kind;
+ }
+
+ public void setKind(String kind) {
+ this.kind = kind;
+ }
+
+ /**
+ * the text of the heading which could be truncated
+ */
+ public String getLabel() {
+ return label;
+ }
+
+ /**
+ * the id of the heading, which is typically (though not guaranteed to be) unique within a document. Heading ids may
+ * be used as the target of document-relative anchors
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * the level of the document which is positive and usually <= 6 except for the root item where the value is
+ * undefined.
+ */
+ public int getLevel() {
+ if (parent == null) {
+ return 0;
+ }
+ return level;
+ }
+
+ void setLength(int length) {
+ this.length = length;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public OutlineItem getParent() {
+ return parent;
+ }
+
+ /**
+ * indicate if this is the root item (that is, the item representing the whole document)
+ */
+ public boolean isRootItem() {
+ return parent == null;
+ }
+
+ /**
+ * Get the previous item. The order of the items is determined via document order traversal of all nodes in the
+ * outline.
+ *
+ * @return the previous item or null if there is no previous (ie: the root item).
+ */
+ public OutlineItem getPrevious() {
+ if (parent == null) {
+ return null;
+ }
+ List<OutlineItem> siblings = parent.getChildren();
+ int index = siblings.indexOf(this);
+ if (index > 0) {
+ return siblings.get(index - 1);
+ }
+ return parent;
+ }
+
+ public List<OutlineItem> getChildren() {
+ return children;
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ @Override
+ public int hashCode() {
+ if (hash == -1) {
+ hash = calculatePositionKey().hashCode();
+ }
+ return hash;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ OutlineItem other = (OutlineItem) obj;
+ // we want items in the same position to be equal even if their ids are not equal, *except* in the case
+ // where they're from different files. By having position-based equality we can maintain state in the UI even
+ // as the user types in the heading area.
+ boolean isEqual = other.hashCode() == hashCode() && other.calculatePositionKey().equals(calculatePositionKey());
+ if (isEqual) {
+ // bug 272721 in some rare cases the content outline would not update properly due to false equality here
+ OutlineItem thisRoot = computeRoot(this);
+ OutlineItem otherRoot = computeRoot(other);
+ if (thisRoot != otherRoot && thisRoot.getResourcePath() != otherRoot.getResourcePath()) {
+ if (thisRoot.getResourcePath() != null
+ && !thisRoot.getResourcePath().equals(otherRoot.getResourcePath())) {
+ isEqual = false;
+ }
+ }
+ }
+ return isEqual;
+ }
+
+ private OutlineItem computeRoot(OutlineItem item) {
+ while (!item.isRootItem()) {
+ item = item.getParent();
+ }
+ return item;
+ }
+
+ public void clear() {
+ children.clear();
+ }
+
+ private String calculatePositionKey() {
+ if (positionKey == null) {
+ if (parent == null) {
+ positionKey = ""; //$NON-NLS-1$
+ } else {
+ positionKey = getParent().calculatePositionKey() + "/" + kind + childOffset; //$NON-NLS-1$
+ }
+ }
+ return positionKey;
+ }
+
+ private void addChild(OutlineItem outlineItem) {
+ outlineItem.childOffset = children.size();
+ children.add(outlineItem);
+ }
+
+ public OutlineItem findNearestMatchingOffset(int offset) {
+ NearestItemVisitor visitor = new NearestItemVisitor(offset);
+ accept(visitor);
+
+ return visitor.nearest;
+ }
+
+ public OutlineItem findItemById(String id) {
+ if (itemsById == null) {
+ itemsById = new HashMap<String, OutlineItem>();
+ accept(new Visitor() {
+ public boolean visit(OutlineItem item) {
+ if (item.getId() != null) {
+ itemsById.put(item.getId(), item);
+ }
+ return true;
+ }
+ });
+ }
+ return itemsById.get(id);
+ }
+
+ private static class NearestItemVisitor implements Visitor {
+
+ private OutlineItem nearest = null;
+
+ private final int offset;
+
+ public NearestItemVisitor(int offset) {
+ this.offset = offset;
+ }
+
+ public boolean visit(OutlineItem item) {
+ if (item.isRootItem()) {
+ return true;
+ }
+ if (nearest == null) {
+ nearest = item;
+ return true;
+ }
+ int itemDistance = item.distance(offset);
+ if (itemDistance > 0) {
+ return true;
+ }
+ int nearestDistance = nearest.distance(offset);
+ nearestDistance = Math.abs(nearestDistance);
+ itemDistance = Math.abs(itemDistance);
+ if (itemDistance < nearestDistance) {
+ nearest = item;
+ } else if (itemDistance > nearestDistance) {
+ return false;
+ }
+ return true;
+ }
+
+ }
+
+ public int distance(int offset) {
+ int startDistance = this.offset - offset;
+
+ return startDistance;
+ }
+
+ public interface Visitor {
+ /**
+ * @param item
+ * the item to visit
+ *
+ * @return true if the items children should be visited
+ */
+ public boolean visit(OutlineItem item);
+ }
+
+ public void accept(Visitor visitor) {
+ if (visitor.visit(this)) {
+ for (OutlineItem item : getChildren()) {
+ item.accept(visitor);
+ }
+ }
+ }
+
+ public void setTooltip(String tooltip) {
+ this.tooltip = tooltip;
+ }
+
+ public String getTooltip() {
+ return tooltip;
+ }
+
+ /**
+ * the resource path to the resource of this outline item
+ *
+ * @return the resource path, or null if it's unknown.
+ */
+ public String getResourcePath() {
+ if (getParent() != null) {
+ return getParent().getResourcePath();
+ }
+ return resourcePath;
+ }
+
+ /**
+ * the resource path to the resource of this outline item
+ *
+ * @param resourcePath
+ * the resource path, or null if it's unknown.
+ */
+ public void setResourcePath(String resourcePath) {
+ if (getParent() != null) {
+ getParent().setResourcePath(resourcePath);
+ } else {
+ this.resourcePath = resourcePath;
+ }
+ }
+
+ /**
+ * move children from the given outline item to this
+ */
+ public void moveChildren(OutlineItem otherParent) {
+ if (!otherParent.children.isEmpty()) {
+ if (children.isEmpty()) {
+ List<OutlineItem> temp = children;
+ children = otherParent.children;
+ otherParent.children = temp;
+ for (OutlineItem child : children) {
+ child.parent = this;
+ }
+ } else {
+ children.addAll(otherParent.children);
+ for (OutlineItem child : otherParent.children) {
+ child.parent = this;
+ }
+ otherParent.children.clear();
+ }
+ Visitor visitor = new Visitor() {
+ public boolean visit(OutlineItem item) {
+ item.hash = -1;
+ item.positionKey = null;
+ return true;
+ }
+ };
+ for (OutlineItem child : children) {
+ child.accept(visitor);
+ }
+ } else {
+ children.clear();
+ }
+ itemsById = null;
+ setLength(otherParent.getLength());
+ }
+
+ /**
+ * Indicate if this outline item contains the given outline item. The computation uses outline item offsets (the
+ * {@link #getOffset() offset} and {@link #getSectionLength() section length}.
+ *
+ * @return true if and only if the offsets of the provided item lie within the offsets of this outline item.
+ */
+ public boolean contains(OutlineItem item) {
+ if (item == this || isRootItem()) {
+ return true;
+ }
+ if (getOffset() <= item.getOffset()) {
+ int end = getOffset() + getSectionLength();
+ int itemEnd = item.getOffset() + item.getSectionLength();
+ if (end >= itemEnd) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @since 1.1
+ */
+ @Override
+ public String toString() {
+ return "OutlineItem(" + calculatePositionKey() + "/" + getId() + "/" + System.identityHashCode(this) + ")"; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineParser.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineParser.java
new file mode 100644
index 0000000..53c26ee
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineParser.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.outline;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.HeadingAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.IdGenerator;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ * A parser for creating an outline of a document based on the headings in the document. Uses {@link MarkupLanguage a
+ * markup language} to determine where headings start and end.
+ *
+ * @see OutlineItem
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class OutlineParser {
+
+ private int labelMaxLength = 0;
+
+ private MarkupLanguage markupLanguage;
+
+ public OutlineParser(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public OutlineParser() {
+ }
+
+ public int getLabelMaxLength() {
+ return labelMaxLength;
+ }
+
+ public void setLabelMaxLength(int labelMaxLength) {
+ this.labelMaxLength = labelMaxLength;
+ }
+
+ public OutlineItem parse(String markup) {
+ OutlineItem root = createRootItem();
+
+ return parse(root, markup);
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public OutlineItem createRootItem() {
+ return createOutlineItem(null, 0, "<root>", 0, 0, "<root>"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public OutlineItem parse(OutlineItem root, String markup) {
+ if (markup == null || markup.length() == 0 || markupLanguage == null) {
+ root.setLength(markup == null ? 0 : markup.length());
+ return root;
+ }
+ root.setLength(markup.length());
+
+ markupLanguage.setFilterGenerativeContents(true);
+ markupLanguage.setBlocksOnly(isBlocksOnly());
+ try {
+ OutlineBuilder outlineBuilder = (OutlineBuilder) createOutlineUpdater(root);
+ outlineBuilder.idGenerator.setGenerationStrategy(markupLanguage.getIdGenerationStrategy());
+ MarkupParser markupParser = new MarkupParser();
+ markupParser.setBuilder(outlineBuilder);
+ markupParser.setMarkupLanguage(markupLanguage);
+ markupParser.parse(markup);
+ } finally {
+ markupLanguage.setFilterGenerativeContents(false);
+ markupLanguage.setBlocksOnly(false);
+ }
+
+ return root;
+ }
+
+ /**
+ * normally outline parsing is performed only on blocks. Overriding classes may return false if they wish to process
+ * all content.
+ */
+ protected boolean isBlocksOnly() {
+ return true;
+ }
+
+ protected OutlineItem createOutlineItem(OutlineItem current, int level, String id, int offset, int length,
+ String label) {
+ return new OutlineItem(current, level, id, offset, length, label);
+ }
+
+ public DocumentBuilder createOutlineUpdater(OutlineItem rootItem) {
+ return new OutlineBuilder(rootItem, labelMaxLength);
+ }
+
+ /**
+ * A document builder that creates the outline structure based on headings in the document
+ */
+ protected class OutlineBuilder extends DocumentBuilder {
+
+ private OutlineItem currentItem;
+
+ private int level;
+
+ private StringBuilder buf;
+
+ protected final IdGenerator idGenerator = new IdGenerator();
+
+ private int offset;
+
+ private int length;
+
+ private final OutlineItem rootItem;
+
+ private final int labelMaxLength;
+
+ private Attributes attributes;
+
+ public OutlineBuilder(OutlineItem root, int labelMaxLength) {
+ super();
+ this.currentItem = root;
+ rootItem = root;
+ this.labelMaxLength = labelMaxLength;
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ registerId(attributes.getId());
+ }
+
+ @Override
+ public void beginDocument() {
+ rootItem.clear();
+ currentItem = rootItem;
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ this.level = level;
+ this.attributes = attributes;
+ buf = new StringBuilder();
+ offset = getLocator().getDocumentOffset();
+ length = getLocator().getLineLength();
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ registerId(attributes.getId());
+ }
+
+ @Override
+ public void characters(String text) {
+ if (buf != null) {
+ buf.append(text);
+ }
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ if (buf != null) {
+ buf.append(literal);
+ }
+ }
+
+ @Override
+ public void endBlock() {
+ }
+
+ @Override
+ public void endDocument() {
+ }
+
+ @Override
+ public void endHeading() {
+ boolean includeInToc = true;
+ if (attributes instanceof HeadingAttributes) {
+ HeadingAttributes headingAttributes = (HeadingAttributes) attributes;
+ if (headingAttributes.isOmitFromTableOfContents()) {
+ includeInToc = false;
+ }
+ }
+ if (includeInToc) {
+ String label = buf.toString();
+ String fullLabelText = label;
+ if (label == null) {
+ label = ""; //$NON-NLS-1$
+ } else {
+ if (labelMaxLength > 0 && label.length() > labelMaxLength) {
+ label = label.substring(0, labelMaxLength) + "..."; //$NON-NLS-1$
+ }
+ }
+ String kind = "h" + level; //$NON-NLS-1$
+
+ while (level <= currentItem.getLevel()) {
+ currentItem = currentItem.getParent();
+ }
+ String id = attributes.getId();
+ if (id != null) {
+ idGenerator.reserveId(id);
+ } else {
+ id = idGenerator.newId(kind, fullLabelText);
+ }
+ currentItem = createOutlineItem(currentItem, level, id, offset, length, label);
+ currentItem.setTooltip(fullLabelText);
+ currentItem.setKind(kind);
+ } else {
+ registerId(attributes.getId());
+ }
+ buf = null;
+ offset = 0;
+ length = 0;
+ attributes = null;
+ }
+
+ @Override
+ public void endSpan() {
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ registerId(attributes.getId());
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
+ registerId(linkAttributes.getId());
+ registerId(imageAttributes.getId());
+ }
+
+ @Override
+ public void lineBreak() {
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ registerId(attributes.getId());
+ if (buf != null) {
+ buf.append(text);
+ }
+ }
+
+ private void registerId(String id) {
+ idGenerator.reserveId(id);
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/package-info.java
new file mode 100644
index 0000000..7e9da25
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/outline/package-info.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * An implementation of a markup parser specifically designed to build a model of the document outline
+ * based on headers in the markup.
+ */
+package org.eclipse.mylyn.wikitext.core.parser.outline;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/package-info.java
new file mode 100644
index 0000000..045c8f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/package-info.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * contains framework classes for {@link MarkupParser parsing} lightweight markup (wiki markup)
+ * and {@link DocumentBuilder creating output}.
+ *
+ * @see MarkupParser
+ * @see DocumentBuilder
+ */
+package org.eclipse.mylyn.wikitext.core.parser;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MarkupToDocbook.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MarkupToDocbook.java
new file mode 100644
index 0000000..5c45202
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MarkupToDocbook.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
+import java.io.StringWriter;
+import java.io.Writer;
+
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DocBookDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ * A utility for creating a Docbook document from markup.
+ *
+ * @see DocBookDocumentBuilder
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupToDocbook {
+
+ private String bookTitle;
+
+ private MarkupLanguage markupLanguage;
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public String parse(String markupContent) throws Exception {
+ if (markupLanguage == null) {
+ throw new IllegalStateException("must set markupLanguage"); //$NON-NLS-1$
+ }
+ StringWriter out = new StringWriter();
+
+ DocBookDocumentBuilder builder = new DocBookDocumentBuilder(out) {
+ @Override
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ return super.createFormattingXmlStreamWriter(out);
+ }
+ };
+ builder.setBookTitle(bookTitle);
+
+ MarkupParser markupParser = new MarkupParser();
+
+ markupParser.setBuilder(builder);
+ markupParser.setMarkupLanguage(markupLanguage);
+
+ markupParser.parse(markupContent);
+
+ return out.toString();
+ }
+
+ public String getBookTitle() {
+ return bookTitle;
+ }
+
+ public void setBookTitle(String bookTitle) {
+ this.bookTitle = bookTitle;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MarkupToEclipseToc.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MarkupToEclipseToc.java
new file mode 100644
index 0000000..9148d85
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MarkupToEclipseToc.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.List;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.core.util.DefaultXmlStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.FormattingXMLStreamWriter;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ * A conversion utility targeting the <a href="http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/extension-points/org_eclipse_help_toc.html"
+ * >Eclipse help table of contents format</a>.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupToEclipseToc {
+
+ private String bookTitle;
+
+ private String htmlFile;
+
+ private MarkupLanguage markupLanguage;
+
+ private String helpPrefix;
+
+ public String parse(String markupContent) {
+ if (markupLanguage == null) {
+ throw new IllegalStateException("Must set markupLanguage"); //$NON-NLS-1$
+ }
+ OutlineParser parser = new OutlineParser(markupLanguage);
+
+ OutlineItem root = parser.parse(markupContent);
+
+ return createToc(root);
+ }
+
+ public String createToc(OutlineItem root) {
+ StringWriter out = new StringWriter(8096);
+
+ XmlStreamWriter writer = createXmlStreamWriter(out);
+
+ writer.writeStartDocument("utf-8", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ writer.writeStartElement("toc"); //$NON-NLS-1$
+ writer.writeAttribute("topic", adjustForPrefix(getHtmlFile())); //$NON-NLS-1$
+ writer.writeAttribute("label", getBookTitle()); //$NON-NLS-1$
+
+ emitToc(writer, root.getChildren());
+
+ writer.writeEndElement(); // toc
+
+ writer.writeEndDocument();
+ writer.close();
+
+ return out.toString();
+ }
+
+ private void emitToc(XmlStreamWriter writer, List<OutlineItem> children) {
+ for (OutlineItem item : children) {
+ writer.writeStartElement("topic"); //$NON-NLS-1$
+
+ String file = computeFile(item);
+
+ file = adjustForPrefix(file);
+
+ String suffix = ""; //$NON-NLS-1$
+
+ // bug 260065: only append document anchor name if this is not the first item in the file.
+ OutlineItem previous = item.getPrevious();
+ if (previous != null && previous.getParent() != null) {
+ String fileOfPrevious = computeFile(previous);
+ fileOfPrevious = adjustForPrefix(fileOfPrevious);
+
+ if (file.equals(fileOfPrevious)) {
+ suffix = "#" + item.getId(); //$NON-NLS-1$
+ }
+ }
+
+ writer.writeAttribute("href", file + suffix); //$NON-NLS-1$
+ writer.writeAttribute("label", item.getLabel()); //$NON-NLS-1$
+
+ if (!item.getChildren().isEmpty()) {
+ emitToc(writer, item.getChildren());
+ }
+
+ writer.writeEndElement(); // topic
+ }
+ }
+
+ private String adjustForPrefix(String file) {
+ if (helpPrefix != null) {
+ if (helpPrefix.endsWith("/")) { //$NON-NLS-1$
+ file = helpPrefix + file;
+ } else {
+ file = helpPrefix + '/' + file;
+ }
+ }
+ return file;
+ }
+
+ protected String computeFile(OutlineItem item) {
+ return getHtmlFile();
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public String getBookTitle() {
+ return bookTitle;
+ }
+
+ public void setBookTitle(String bookTitle) {
+ this.bookTitle = bookTitle;
+ }
+
+ public String getHtmlFile() {
+ return htmlFile;
+ }
+
+ public void setHtmlFile(String htmlFile) {
+ this.htmlFile = htmlFile;
+ }
+
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ XmlStreamWriter writer = new DefaultXmlStreamWriter(out);
+ return new FormattingXMLStreamWriter(writer);
+ }
+
+ /**
+ * the prefix to URLs in the toc.xml, typically the relative path from the plugin to the help files. For example, if
+ * the help file is in 'help/index.html' then the help prefix would be 'help'
+ */
+ public void setHelpPrefix(String helpPrefix) {
+ this.helpPrefix = helpPrefix;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/Matcher.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/Matcher.java
new file mode 100644
index 0000000..ffb39f4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/Matcher.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
+/**
+ * An interface that defines a matcher, much the same as a {@link java.util.regex.Matcher}.
+ *
+ * @see MatcherAdaper
+ *
+ * @author David Green
+ */
+public interface Matcher {
+ public String group(int group);
+
+ public int start(int group);
+
+ public int end(int group);
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MatcherAdaper.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MatcherAdaper.java
new file mode 100644
index 0000000..a0517a4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/MatcherAdaper.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
+/**
+ * Adapt a regex matcher to a {@link Matcher}.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MatcherAdaper implements Matcher {
+
+ private final java.util.regex.Matcher delegate;
+
+ public MatcherAdaper(java.util.regex.Matcher delegate) {
+ this.delegate = delegate;
+ }
+
+ public int end(int group) {
+ return delegate.end(group);
+ }
+
+ public String group(int group) {
+ return delegate.group(group);
+ }
+
+ public int start(int group) {
+ return delegate.start(group);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/package-info.java
new file mode 100644
index 0000000..2aa38a9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/parser/util/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * Utility classes used by the parser framework
+ */
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/DefaultXmlStreamWriter.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/DefaultXmlStreamWriter.java
new file mode 100644
index 0000000..d020099
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/DefaultXmlStreamWriter.java
@@ -0,0 +1,446 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import org.eclipse.mylyn.internal.wikitext.core.util.XML11Char;
+
+/**
+ * A default implementation of {@link XmlStreamWriter} that creates XML character output.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class DefaultXmlStreamWriter extends XmlStreamWriter {
+
+ private PrintWriter out;
+
+ private final Map<String, String> prefixToUri = new HashMap<String, String>();
+
+ private final Map<String, String> uriToPrefix = new HashMap<String, String>();
+
+ private boolean inEmptyElement = false;
+
+ private boolean inStartElement = false;
+
+ private final Stack<String> elements = new Stack<String>();
+
+ private char xmlHederQuoteChar = '\'';
+
+ public DefaultXmlStreamWriter(OutputStream out) throws UnsupportedEncodingException {
+ this.out = createUtf8PrintWriter(out);
+ }
+
+ public DefaultXmlStreamWriter(Writer out) {
+ this.out = new PrintWriter(out);
+ }
+
+ public DefaultXmlStreamWriter(Writer out, char xmlHeaderQuoteChar) {
+ this.out = new PrintWriter(out);
+ this.xmlHederQuoteChar = xmlHeaderQuoteChar;
+ }
+
+ protected PrintWriter createUtf8PrintWriter(java.io.OutputStream out) throws UnsupportedEncodingException {
+ return new java.io.PrintWriter(new OutputStreamWriter(out, "UTF8")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void close() {
+ if (out != null) {
+ closeElement();
+ flush();
+ }
+ out = null;
+ }
+
+ @Override
+ public void flush() {
+ out.flush();
+ }
+
+ @Override
+ public String getPrefix(String uri) {
+ return uriToPrefix.get(uri);
+ }
+
+ public Object getProperty(String name) throws IllegalArgumentException {
+ return null;
+ }
+
+ @Override
+ public void setDefaultNamespace(String uri) {
+ setPrefix("", uri); //$NON-NLS-1$
+ }
+
+ @Override
+ public void setPrefix(String prefix, String uri) {
+ prefixToUri.put(prefix, uri);
+ uriToPrefix.put(uri, prefix);
+ }
+
+ @Override
+ public void writeAttribute(String localName, String value) {
+ out.write(' ');
+ out.write(localName);
+ out.write("=\""); //$NON-NLS-1$
+ if (value != null) {
+ attrEncode(value);
+ }
+ out.write("\""); //$NON-NLS-1$
+ }
+
+ @Override
+ public void writeAttribute(String namespaceURI, String localName, String value) {
+ out.write(' ');
+ String prefix = uriToPrefix.get(namespaceURI);
+ if (prefix != null && prefix.length() > 0) {
+ out.write(prefix);
+ out.write(':');
+ }
+ out.write(localName);
+ out.write("=\""); //$NON-NLS-1$
+ if (value != null) {
+ attrEncode(value);
+ }
+ out.write("\""); //$NON-NLS-1$
+ }
+
+ @Override
+ public void writeAttribute(String prefix, String namespaceURI, String localName, String value) {
+ out.write(' ');
+ if (prefix != null && prefix.length() > 0) {
+ out.write(prefix);
+ out.write(':');
+ }
+ out.write(localName);
+ out.write("=\""); //$NON-NLS-1$
+ if (value != null) {
+ attrEncode(value);
+ }
+ out.write("\""); //$NON-NLS-1$
+ }
+
+ private void attrEncode(String value) {
+ if (value == null) {
+ return;
+ }
+ printEscaped(out, value, true);
+ }
+
+ private void encode(String text) {
+ if (text == null) {
+ return;
+ }
+ printEscaped(out, text, false);
+ }
+
+ @Override
+ public void writeCData(String data) {
+ closeElement();
+ out.write("<![CDATA["); //$NON-NLS-1$
+ out.write(data);
+ out.write("]]>"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void writeCharacters(String text) {
+ closeElement();
+ encode(text);
+ }
+
+ public void writeCharactersUnescaped(String text) {
+ closeElement();
+ out.print(text);
+ }
+
+ @Override
+ public void writeLiteral(String literal) {
+ writeCharactersUnescaped(literal);
+ }
+
+ @Override
+ public void writeCharacters(char[] text, int start, int len) {
+ closeElement();
+ encode(new String(text, start, len));
+ }
+
+ @Override
+ public void writeComment(String data) {
+ closeElement();
+ out.write("<!-- "); //$NON-NLS-1$
+ out.write(data);
+ out.write(" -->"); //$NON-NLS-1$
+ }
+
+ @Override
+ public void writeDTD(String dtd) {
+ out.write(dtd);
+ }
+
+ @Override
+ public void writeDefaultNamespace(String namespaceURI) {
+ writeAttribute("xmlns", namespaceURI); //$NON-NLS-1$
+ }
+
+ private void closeElement() {
+ if (inEmptyElement) {
+ out.write("/>"); //$NON-NLS-1$
+ inEmptyElement = false;
+ } else if (inStartElement) {
+ out.write(">"); //$NON-NLS-1$
+ inStartElement = false;
+ }
+ }
+
+ @Override
+ public void writeEmptyElement(String localName) {
+ closeElement();
+ inEmptyElement = true;
+ out.write('<');
+ out.write(localName);
+ }
+
+ @Override
+ public void writeEmptyElement(String namespaceURI, String localName) {
+ closeElement();
+ inEmptyElement = true;
+ String prefix = uriToPrefix.get(namespaceURI);
+ out.write('<');
+ if (prefix != null && prefix.length() > 0) {
+ out.write(prefix);
+ out.write(':');
+ }
+ out.write(localName);
+ }
+
+ @Override
+ public void writeEmptyElement(String prefix, String localName, String namespaceURI) {
+ closeElement();
+ inEmptyElement = true;
+ out.write('<');
+ if (prefix != null && prefix.length() > 0) {
+ out.write(prefix);
+ out.write(':');
+ }
+ out.write(localName);
+ }
+
+ @Override
+ public void writeEndDocument() {
+ if (!elements.isEmpty()) {
+ throw new IllegalStateException(elements.size() + " elements not closed"); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void writeEndElement() {
+ closeElement();
+ if (elements.isEmpty()) {
+ throw new IllegalStateException();
+ }
+ String name = elements.pop();
+ out.write('<');
+ out.write('/');
+ out.write(name);
+ out.write('>');
+ }
+
+ @Override
+ public void writeEntityRef(String name) {
+ closeElement();
+ out.write('&');
+ out.write(name);
+ out.write(';');
+ }
+
+ @Override
+ public void writeNamespace(String prefix, String namespaceURI) {
+ if (prefix == null || prefix.length() == 0) {
+ writeAttribute("xmlns", namespaceURI); //$NON-NLS-1$
+ } else {
+ writeAttribute("xmlns:" + prefix, namespaceURI); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void writeProcessingInstruction(String target) {
+ closeElement();
+ }
+
+ @Override
+ public void writeProcessingInstruction(String target, String data) {
+ closeElement();
+
+ }
+
+ @Override
+ public void writeStartDocument() {
+ out.write(processXmlHeader("<?xml version='1.0' ?>")); //$NON-NLS-1$
+ }
+
+ @Override
+ public void writeStartDocument(String version) {
+ out.write(processXmlHeader("<?xml version='" + version + "' ?>")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public void writeStartDocument(String encoding, String version) {
+ out.write(processXmlHeader("<?xml version='" + version + "' encoding='" + encoding + "' ?>")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ @Override
+ public void writeStartElement(String localName) {
+ closeElement();
+ inStartElement = true;
+ elements.push(localName);
+ out.write('<');
+ out.write(localName);
+ }
+
+ @Override
+ public void writeStartElement(String namespaceURI, String localName) {
+ closeElement();
+ inStartElement = true;
+ String prefix = uriToPrefix.get(namespaceURI);
+ out.write('<');
+ if (prefix != null && prefix.length() > 0) {
+ out.write(prefix);
+ out.write(':');
+ elements.push(prefix + ':' + localName);
+ } else {
+ elements.push(localName);
+ }
+ out.write(localName);
+ }
+
+ @Override
+ public void writeStartElement(String prefix, String localName, String namespaceURI) {
+ closeElement();
+ inStartElement = true;
+ elements.push(localName);
+ out.write('<');
+ if (prefix != null && prefix.length() > 0) {
+ out.write(prefix);
+ out.write(':');
+ }
+ out.write(localName);
+ }
+
+ public char getXmlHederQuoteChar() {
+ return xmlHederQuoteChar;
+ }
+
+ public void setXmlHederQuoteChar(char xmlHederQuoteChar) {
+ this.xmlHederQuoteChar = xmlHederQuoteChar;
+ }
+
+ private String processXmlHeader(String header) {
+ return xmlHederQuoteChar == '\'' ? header : header.replace('\'', xmlHederQuoteChar);
+ }
+
+ private static void printEscaped(PrintWriter writer, CharSequence s, boolean attribute) {
+ int length = s.length();
+
+ try {
+ for (int x = 0; x < length; ++x) {
+ char ch = s.charAt(x);
+ printEscaped(writer, ch, attribute);
+ }
+ } catch (IOException ioe) {
+ throw new IllegalStateException();
+ }
+ }
+
+ /**
+ * Print an XML character in its escaped form.
+ *
+ * @param writer
+ * The writer to which the character should be printed.
+ * @param ch
+ * the character to print.
+ *
+ * @throws IOException
+ */
+ private static void printEscaped(PrintWriter writer, int ch, boolean attribute) throws IOException {
+
+ String ref = getEntityRef(ch, attribute);
+ if (ref != null) {
+ writer.write('&');
+ writer.write(ref);
+ writer.write(';');
+ } else if (ch == '\r' || ch == 0x0085 || ch == 0x2028) {
+ printHex(writer, ch);
+ } else if ((ch >= ' ' && ch != 160 && isUtf8Printable((char) ch) && XML11Char.isXML11ValidLiteral(ch))
+ || ch == '\t' || ch == '\n' || ch == '\r') {
+ writer.write((char) ch);
+ } else {
+ printHex(writer, ch);
+ }
+ }
+
+ /**
+ * Escapes chars
+ */
+ final static void printHex(PrintWriter writer, int ch) throws IOException {
+ writer.write("&#x"); //$NON-NLS-1$
+ writer.write(Integer.toHexString(ch));
+ writer.write(';');
+ }
+
+ protected static String getEntityRef(int ch, boolean attribute) {
+ // Encode special XML characters into the equivalent character
+ // references.
+ // These five are defined by default for all XML documents.
+ switch (ch) {
+ case '<':
+ return "lt"; //$NON-NLS-1$
+
+ // no need to encode '>'.
+
+ case '"':
+ if (attribute) {
+ return "quot"; //$NON-NLS-1$
+ }
+ break;
+ case '&':
+ return "amp"; //$NON-NLS-1$
+
+ // WARN: there is no need to encode apostrophe, and doing so has an
+ // adverse
+ // effect on XHTML documents containing javascript with some browsers.
+ // case '\'':
+ // return "apos";
+ }
+ return null;
+ }
+
+ protected static boolean isUtf8Printable(char ch) {
+ // fall-back method here.
+ if ((ch >= ' ' && ch <= 0x10FFFF && ch != 0xF7) || ch == '\n' || ch == '\r' || ch == '\t') {
+ // If the character is not printable, print as character reference.
+ // Non printables are below ASCII space but not tab or line
+ // terminator, ASCII delete, or above a certain Unicode threshold.
+ return true;
+ }
+
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/FormattingXMLStreamWriter.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/FormattingXMLStreamWriter.java
new file mode 100644
index 0000000..b7b82e3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/FormattingXMLStreamWriter.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.util.Stack;
+
+/**
+ * An {@link XmlStreamWriter} that creates formatted output by emitting whitespace into the document output stream.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class FormattingXMLStreamWriter extends XmlStreamWriter {
+
+ private final XmlStreamWriter delegate;
+
+ private int indentLevel;
+
+ private final Stack<Integer> childCounts = new Stack<Integer>();
+
+ private int childCount;
+
+ private final Stack<String> elements = new Stack<String>();
+
+ private int lineOffset = 0;
+
+ public FormattingXMLStreamWriter(XmlStreamWriter delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void close() {
+ delegate.close();
+ }
+
+ @Override
+ public void flush() {
+ delegate.flush();
+ }
+
+ @Override
+ public String getPrefix(String uri) {
+ return delegate.getPrefix(uri);
+ }
+
+ @Override
+ public void setDefaultNamespace(String uri) {
+ delegate.setDefaultNamespace(uri);
+ }
+
+ @Override
+ public void setPrefix(String prefix, String uri) {
+ delegate.setPrefix(prefix, uri);
+ }
+
+ @Override
+ public void writeAttribute(String prefix, String namespaceURI, String localName, String value) {
+ if (value == null) {
+ value = ""; //$NON-NLS-1$
+ }
+ delegate.writeAttribute(prefix, namespaceURI, localName, value);
+ }
+
+ @Override
+ public void writeAttribute(String namespaceURI, String localName, String value) {
+ if (value == null) {
+ value = ""; //$NON-NLS-1$
+ }
+ delegate.writeAttribute(namespaceURI, localName, value);
+ }
+
+ @Override
+ public void writeAttribute(String localName, String value) {
+ if (value == null) {
+ value = ""; //$NON-NLS-1$
+ }
+ delegate.writeAttribute(localName, value);
+ }
+
+ @Override
+ public void writeCData(String data) {
+ delegate.writeCData(data);
+ }
+
+ @Override
+ public void writeCharacters(char[] text, int start, int len) {
+ int lineStart = start;
+ int length = 0;
+ for (int x = 0; x < len; ++x) {
+ final int charOffset = start + x;
+ ++length;
+ if (lineOffset == 0 && text[charOffset] != '\n') {
+ maybeIndent(false, true);
+ }
+ ++lineOffset;
+ if (text[charOffset] == '\n') {
+ delegate.writeCharacters(text, lineStart, length);
+ length = 0;
+ lineOffset = 0;
+ lineStart = charOffset;
+ }
+ }
+ if (length > 0) {
+ delegate.writeCharacters(text, lineStart, length);
+ lineOffset += length;
+ }
+ }
+
+ @Override
+ public void writeCharacters(String text) {
+ if (text == null) {
+ return;
+ }
+ char[] chars = text.toCharArray();
+ writeCharacters(chars, 0, chars.length);
+ }
+
+ @Override
+ public void writeLiteral(String literal) {
+ delegate.writeLiteral(literal);
+ }
+
+ @Override
+ public void writeComment(String data) {
+ if (data == null) {
+ data = ""; //$NON-NLS-1$
+ }
+ delegate.writeComment(data);
+ }
+
+ @Override
+ public void writeDefaultNamespace(String namespaceURI) {
+ delegate.writeDefaultNamespace(namespaceURI);
+ }
+
+ @Override
+ public void writeDTD(String dtd) {
+ delegate.writeDTD(dtd);
+ }
+
+ @Override
+ public void writeEmptyElement(String prefix, String localName, String namespaceURI) {
+ ++childCount;
+ maybeIndent();
+ delegate.writeEmptyElement(prefix, localName, namespaceURI);
+ }
+
+ @Override
+ public void writeEmptyElement(String namespaceURI, String localName) {
+ ++childCount;
+ maybeIndent();
+ delegate.writeEmptyElement(namespaceURI, localName);
+ }
+
+ @Override
+ public void writeEmptyElement(String localName) {
+ ++childCount;
+ maybeIndent();
+ delegate.writeEmptyElement(localName);
+ }
+
+ @Override
+ public void writeEndDocument() {
+ delegate.writeEndDocument();
+ }
+
+ @Override
+ public void writeEndElement() {
+ --indentLevel;
+ maybeIndent();
+ elements.pop();
+ delegate.writeEndElement();
+ childCount = childCounts.pop();
+ }
+
+ @Override
+ public void writeEntityRef(String name) {
+ delegate.writeEntityRef(name);
+ }
+
+ @Override
+ public void writeNamespace(String prefix, String namespaceURI) {
+ delegate.writeNamespace(prefix, namespaceURI);
+ }
+
+ @Override
+ public void writeProcessingInstruction(String target, String data) {
+ delegate.writeProcessingInstruction(target, data);
+ }
+
+ @Override
+ public void writeProcessingInstruction(String target) {
+ delegate.writeProcessingInstruction(target);
+ }
+
+ @Override
+ public void writeStartDocument() {
+ delegate.writeStartDocument();
+ }
+
+ @Override
+ public void writeStartDocument(String encoding, String version) {
+ delegate.writeStartDocument(encoding, version);
+ }
+
+ @Override
+ public void writeStartDocument(String version) {
+ delegate.writeStartDocument(version);
+ }
+
+ @Override
+ public void writeStartElement(String prefix, String localName, String namespaceURI) {
+ ++childCount;
+ maybeIndent();
+ elements.push(localName);
+ childCounts.push(childCount);
+ childCount = 0;
+ ++indentLevel;
+ delegate.writeStartElement(prefix, localName, namespaceURI);
+ }
+
+ @Override
+ public void writeStartElement(String namespaceURI, String localName) {
+ ++childCount;
+ maybeIndent();
+ elements.push(localName);
+ childCounts.push(childCount);
+ childCount = 0;
+ ++indentLevel;
+ delegate.writeStartElement(namespaceURI, localName);
+ }
+
+ @Override
+ public void writeStartElement(String localName) {
+ ++childCount;
+ maybeIndent();
+ elements.push(localName);
+ childCounts.push(childCount);
+ childCount = 0;
+ ++indentLevel;
+ delegate.writeStartElement(localName);
+ }
+
+ private void maybeIndent() {
+ maybeIndent(true, false);
+ }
+
+ private void maybeIndent(boolean withNewline, boolean force) {
+ if ((childCount == 0 && !force) || preserveWhitespace()) {
+ return;
+ }
+ StringBuilder buf = new StringBuilder();
+ if (withNewline) {
+ buf.append('\n');
+ }
+ for (int x = 0; x < indentLevel; ++x) {
+ buf.append('\t');
+ }
+ lineOffset = indentLevel;
+ delegate.writeCharacters(buf.toString().toCharArray(), 0, buf.length());
+ }
+
+ private boolean preserveWhitespace() {
+ for (int x = elements.size() - 1; x >= 0; --x) {
+ if (preserveWhitespace(elements.get(x))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Override this method to indicate which elements must have whitespace preserved.
+ *
+ * @param elementName
+ * the local name of the element
+ */
+ protected boolean preserveWhitespace(String elementName) {
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/IgnoreDtdEntityResolver.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/IgnoreDtdEntityResolver.java
new file mode 100644
index 0000000..b664eed
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/IgnoreDtdEntityResolver.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * An entity resolver that resolves all requests for DTD content, thus preventing network access when resolving DTDs.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class IgnoreDtdEntityResolver implements EntityResolver {
+ protected static final IgnoreDtdEntityResolver instance = new IgnoreDtdEntityResolver();
+
+ public static IgnoreDtdEntityResolver getInstance() {
+ return instance;
+ }
+
+ public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
+ if ((publicId != null && publicId.indexOf("//DTD") != -1) || (systemId != null && systemId.endsWith(".dtd"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ return new InputSource(new StringReader("")); //$NON-NLS-1$
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/LocationTrackingReader.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/LocationTrackingReader.java
new file mode 100644
index 0000000..6904365
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/LocationTrackingReader.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * A reader class that tracks the character offset based on the number of characters read. Also provides a means for
+ * reading lines of text, tracking the offset of the last line read.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LocationTrackingReader extends Reader {
+ private final Reader delegate;
+
+ private int offset = -1;
+
+ private int lineOffset = -1;
+
+ private int lineNumber = -1;
+
+ private char[] buf;
+
+ private int bufOffset = 0;
+
+ private int bufLength = 0;
+
+ public LocationTrackingReader(Reader delegate) {
+ this(delegate, 2048);
+ }
+
+ public LocationTrackingReader(Reader delegate, int bufferSize) {
+ this.delegate = delegate;
+ buf = new char[bufferSize];
+ }
+
+ @Override
+ public void close() throws IOException {
+ delegate.close();
+ }
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ if (bufLength > 0) {
+ int length = Math.min(len, bufLength);
+ System.arraycopy(buf, bufOffset, cbuf, off, length);
+ bufLength -= length;
+ bufOffset += length;
+ if (bufLength == 0) {
+ bufOffset = 0;
+ }
+ offset += length;
+ return length;
+ } else {
+ int read = delegate.read(cbuf, off, len);
+ if (read != -1) {
+ offset += read;
+ }
+ return read;
+ }
+ }
+
+ @Override
+ public int read() throws IOException {
+ if (bufLength > 0) {
+ int c = buf[bufOffset];
+ bufLength -= 1;
+ bufOffset += 1;
+ if (bufLength == 0) {
+ bufOffset = 0;
+ }
+ offset += 1;
+ return c;
+ } else {
+ int read = delegate.read();
+ if (read != -1) {
+ ++offset;
+ }
+ return read;
+ }
+ }
+
+ /**
+ * Read a line of text, omitting the line delimiters.
+ *
+ * @return the text or null if the end of input has been reached
+ *
+ * @see #getLineOffset()
+ */
+ public String readLine() throws IOException {
+ lineOffset = offset + 1;
+
+ int lineBufOffset = bufOffset;
+ int c = -1;
+ for (int x = lineBufOffset;; ++x) {
+ if (x >= (bufOffset + bufLength)) {
+ if (bufOffset > 0 && bufLength > 0) {
+ System.arraycopy(buf, bufOffset, buf, 0, bufLength);
+ x -= bufOffset;
+ bufOffset = 0;
+ lineBufOffset = 0;
+ }
+ if (bufOffset + bufLength >= buf.length) {
+ // expand the buffer
+ char[] newBuf = new char[buf.length * 2];
+ if (bufLength > 0) {
+ System.arraycopy(buf, bufOffset, newBuf, 0, bufLength);
+ }
+ x -= bufOffset;
+ bufOffset = 0;
+ lineBufOffset = 0;
+ buf = newBuf;
+ }
+ int emptyOffset = bufOffset + bufLength;
+ int read = delegate.read(buf, emptyOffset, buf.length - emptyOffset);
+ if (read > 0) {
+ bufLength += read;
+ } else {
+ // end of input
+ break;
+ }
+ }
+ if (x >= (bufOffset + bufLength)) {
+ // end of input
+ break;
+ }
+ int nc = buf[x];
+ if (nc == '\n') {
+ // eol
+ int length = x - lineBufOffset + 1;
+ bufOffset += length;
+ bufLength -= length;
+ offset += length;
+
+ int stringLength = c == '\r' ? length - 2 : length - 1;
+ ++lineNumber;
+ return new String(buf, lineBufOffset, stringLength);
+ } else if (c == '\r') {
+ int length = x - lineBufOffset;
+ bufOffset += length;
+ bufLength -= length;
+ offset += length;
+ int stringLength = length - 1;
+ ++lineNumber;
+ return new String(buf, lineBufOffset, stringLength);
+ }
+ c = nc;
+ }
+ if (bufLength > 0) {
+ String line = new String(buf, bufOffset, c == '\r' ? bufLength - 1 : bufLength);
+ bufOffset = 0;
+ offset += bufLength;
+ bufLength = 0;
+ ++lineNumber;
+ return line;
+ } else {
+ ++lineNumber;
+ return null;
+ }
+ }
+
+ /**
+ * Get the character offset of the last character read.
+ */
+ public int getOffset() {
+ return offset;
+ }
+
+ /**
+ * Get the character offset of the first character of the last line read. The result of calling this method is only
+ * meaningful immediately after having called {@link #readLine()}.
+ *
+ * @see #readLine()
+ */
+ public int getLineOffset() {
+ return lineOffset;
+ }
+
+ /**
+ * get the 0-based line number of the last line read. The result of calling this method is only meaningful
+ * immediately after having called {@link #readLine()}.
+ *
+ * @see #readLine()
+ */
+ public int getLineNumber() {
+ return lineNumber;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/LocatorImpl.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/LocatorImpl.java
new file mode 100644
index 0000000..a78bac4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/LocatorImpl.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import org.eclipse.mylyn.wikitext.core.parser.Locator;
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class LocatorImpl implements Locator {
+
+ private final int documentOffset;
+
+ private final int lineCharacterOffset;
+
+ private final int lineDocumentOffset;
+
+ private final int lineLength;
+
+ private final int lineNumber;
+
+ private final int lineSegmentEndOffset;
+
+ public LocatorImpl(Locator other) {
+ documentOffset = other.getDocumentOffset();
+ lineCharacterOffset = other.getLineCharacterOffset();
+ lineDocumentOffset = other.getLineDocumentOffset();
+ lineLength = other.getLineLength();
+ lineNumber = other.getLineNumber();
+ lineSegmentEndOffset = other.getLineSegmentEndOffset();
+ }
+
+ public int getDocumentOffset() {
+ return documentOffset;
+ }
+
+ public int getLineCharacterOffset() {
+ return lineCharacterOffset;
+ }
+
+ public int getLineDocumentOffset() {
+ return lineDocumentOffset;
+ }
+
+ public int getLineLength() {
+ return lineLength;
+ }
+
+ public int getLineNumber() {
+ return lineNumber;
+ }
+
+ public int getLineSegmentEndOffset() {
+ return lineSegmentEndOffset;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/Messages.java
new file mode 100644
index 0000000..da9be45
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.wikitext.core.util.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/ServiceLocator.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/ServiceLocator.java
new file mode 100644
index 0000000..f4817e8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/ServiceLocator.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ * A service locator for use both inside and outside of an Eclipse environment. Provides access to markup languages by
+ * name.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ServiceLocator {
+
+ private static final String UTF_8 = "utf-8"; //$NON-NLS-1$
+
+ protected final ClassLoader classLoader;
+
+ private static Class<? extends ServiceLocator> implementationClass;
+
+ protected ServiceLocator(ClassLoader classLoader) {
+ this.classLoader = classLoader;
+ }
+
+ /**
+ * Get an instance of the service locator
+ *
+ * @param classLoader
+ * the class loader to use when looking up services
+ *
+ * @see #getInstance()
+ */
+ public static ServiceLocator getInstance(ClassLoader classLoader) {
+ if (implementationClass != null) {
+ try {
+ return implementationClass.getConstructor(ClassLoader.class).newInstance(classLoader);
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ return new ServiceLocator(classLoader);
+ }
+
+ /**
+ * Get an instance of the service locator
+ *
+ * @see #getInstance(ClassLoader)
+ */
+ public static ServiceLocator getInstance() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if (loader == null) {
+ ServiceLocator.class.getClassLoader();
+ }
+ return getInstance(loader);
+ }
+
+ /**
+ * get a markup language by name
+ *
+ * @param languageName
+ * the {@link MarkupLanguage#getName() name} of the markup language, or the fully qualified name of the
+ * class that implements the language
+ *
+ * @return the language implementation
+ *
+ * @throws IllegalArgumentException
+ * if the provided language name is null or if no implementation is available for the given language
+ */
+ public MarkupLanguage getMarkupLanguage(String languageName) throws IllegalArgumentException {
+ if (languageName == null) {
+ throw new IllegalArgumentException();
+ }
+ Pattern classNamePattern = Pattern.compile("\\s*([^\\s#]+)?#?.*"); //$NON-NLS-1$
+ // first try Java services (jar-based)
+ Set<String> names = new TreeSet<String>();
+ try {
+ // note that we can't use the standard Java services API to load services here since the service may be declared on
+ // a specific class loader (not the system class loader).
+ String servicesFilename = "META-INF/services/" + MarkupLanguage.class.getName(); //$NON-NLS-1$
+ Enumeration<URL> resources = classLoader.getResources(servicesFilename);
+ while (resources.hasMoreElements()) {
+ URL url = resources.nextElement();
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), UTF_8));
+ try {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ Matcher matcher = classNamePattern.matcher(line);
+ if (matcher.matches()) {
+ String className = matcher.group(1);
+ if (className != null) {
+ try {
+ Class<?> clazz = Class.forName(className, true, classLoader);
+ if (MarkupLanguage.class.isAssignableFrom(clazz)) {
+ MarkupLanguage instance = (MarkupLanguage) clazz.newInstance();
+ if (languageName.equals(instance.getName())) {
+ return instance;
+ }
+ names.add(instance.getName());
+ }
+ } catch (Exception e) {
+ // very unusual, but inform the user in a stand-alone way
+ Logger.getLogger(ServiceLocator.class.getName())
+ .log(
+ Level.WARNING,
+ MessageFormat.format(
+ Messages.getString("ServiceLocator.0"), className), e); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ } finally {
+ reader.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ } catch (IOException e) {
+ // very unusual, but inform the user in a stand-alone way
+ Logger.getLogger(ServiceLocator.class.getName()).log(Level.SEVERE,
+ Messages.getString("ServiceLocator.1"), e); //$NON-NLS-1$
+ }
+ // next attempt to load the markup language as if the language name is a fully qualified name
+ Matcher matcher = classNamePattern.matcher(languageName);
+ if (matcher.matches()) {
+ String className = matcher.group(1);
+ if (className != null) {
+ try {
+ Class<?> clazz = Class.forName(className, true, classLoader);
+ if (MarkupLanguage.class.isAssignableFrom(clazz)) {
+ MarkupLanguage instance = (MarkupLanguage) clazz.newInstance();
+ return instance;
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+
+ // specified language not found.
+ // create a useful error message
+ StringBuilder buf = new StringBuilder();
+ for (String name : names) {
+ if (buf.length() != 0) {
+ buf.append(", "); //$NON-NLS-1$
+ }
+ buf.append('\'');
+ buf.append(name);
+ buf.append('\'');
+ }
+ throw new IllegalArgumentException(MessageFormat.format(Messages.getString("ServiceLocator.4"), //$NON-NLS-1$
+ languageName, buf.length() == 0 ? Messages.getString("ServiceLocator.5") //$NON-NLS-1$
+ : Messages.getString("ServiceLocator.6") + buf)); //$NON-NLS-1$
+ }
+
+ public static void setImplementation(Class<? extends ServiceLocator> implementationClass) {
+ ServiceLocator.implementationClass = implementationClass;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/XmlStreamWriter.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/XmlStreamWriter.java
new file mode 100644
index 0000000..f959c8a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/XmlStreamWriter.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+/**
+ * A means of writing XML content to a stream. Modeled after StAX with some small differences, notably:
+ * <ul>
+ * <li>StAX is only available in Java 6</li>
+ * <li>The methods of this API only throw unchecked exceptions</li>
+ * <li>This API provides a means for writing unescaped XML</li>
+ * </ul>
+ *
+ * @author David Green
+ */
+public abstract class XmlStreamWriter {
+
+ public abstract void close();
+
+ public abstract void flush();
+
+ public abstract String getPrefix(String uri);
+
+ public abstract void setDefaultNamespace(String uri);
+
+ public abstract void setPrefix(String prefix, String uri);
+
+ public abstract void writeAttribute(String localName, String value);
+
+ public abstract void writeAttribute(String namespaceURI, String localName, String value);
+
+ public abstract void writeAttribute(String prefix, String namespaceURI, String localName, String value);
+
+ public abstract void writeCData(String data);
+
+ public abstract void writeCharacters(String text);
+
+ public abstract void writeCharacters(char[] text, int start, int len);
+
+ public abstract void writeComment(String data);
+
+ public abstract void writeDTD(String dtd);
+
+ public abstract void writeDefaultNamespace(String namespaceURI);
+
+ public abstract void writeEmptyElement(String localName);
+
+ public abstract void writeEmptyElement(String namespaceURI, String localName);
+
+ public abstract void writeEmptyElement(String prefix, String localName, String namespaceURI);
+
+ public abstract void writeEndDocument();
+
+ public abstract void writeEndElement();
+
+ public abstract void writeEntityRef(String name);
+
+ public abstract void writeNamespace(String prefix, String namespaceURI);
+
+ public abstract void writeProcessingInstruction(String target);
+
+ public abstract void writeProcessingInstruction(String target, String data);
+
+ public abstract void writeStartDocument();
+
+ public abstract void writeStartDocument(String version);
+
+ public abstract void writeStartDocument(String encoding, String version);
+
+ public abstract void writeStartElement(String localName);
+
+ public abstract void writeStartElement(String namespaceURI, String localName);
+
+ public abstract void writeStartElement(String prefix, String localName, String namespaceURI);
+
+ /**
+ * Write an XML fragment directly to the output. The given text is not processed or XML-encoded, since it is assumed
+ * to be a legal XML fragment.
+ */
+ public abstract void writeLiteral(String literal);
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupTask.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupTask.java
new file mode 100644
index 0000000..1a4cf86
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupTask.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.eclipse.mylyn.internal.wikitext.core.validation.StandaloneMarkupValidator;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+import org.eclipse.mylyn.wikitext.core.util.ServiceLocator;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+/**
+ * An abstract class for Ant tasks that use a configurable {@link MarkupLanguage}.
+ *
+ * @author David Green
+ */
+public abstract class MarkupTask extends Task {
+
+ private String markupLanguage;
+
+ private String internalLinkPattern;
+
+ private boolean validate = true;
+
+ private boolean failOnValidationError = true;
+
+ private boolean failOnValidationWarning = false;
+
+ private MarkupLanguageConfiguration markupLanguageConfiguration;
+
+ private String sourceEncoding;
+
+ /**
+ * The markup language to use. Should correspond to a {@link MarkupLanguage#getName() markup language name}.
+ */
+ public String getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ /**
+ * The markup language to use. Should correspond to a {@link MarkupLanguage#getName() markup language name}.
+ */
+ public void setMarkupLanguage(String markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ /**
+ * Create a {@link MarkupLanguage markup language parser} for the {@link #getMarkupLanguage() specified markup
+ * language}.
+ *
+ * @return the markup language
+ * @throws BuildException
+ * if the markup language is not specified or if it is unknown.
+ */
+ protected MarkupLanguage createMarkupLanguage() throws BuildException {
+ if (markupLanguage == null) {
+ throw new BuildException(Messages.getString("MarkupTask.0")); //$NON-NLS-1$
+ }
+ try {
+ MarkupLanguage language = ServiceLocator.getInstance(getClass().getClassLoader()).getMarkupLanguage(
+ markupLanguage);
+ if (internalLinkPattern != null) {
+ language.setInternalLinkPattern(internalLinkPattern);
+ }
+ if (markupLanguageConfiguration != null) {
+ language.configure(markupLanguageConfiguration);
+ }
+ return language;
+ } catch (IllegalArgumentException e) {
+ throw new BuildException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * @see MarkupLanguage#setInternalLinkPattern(String)
+ */
+ public void setInternalLinkPattern(String internalLinkPattern) {
+ this.internalLinkPattern = internalLinkPattern;
+ }
+
+ /**
+ * @see MarkupLanguage#getInternalLinkPattern()
+ */
+ public String getInternalLinkPattern() {
+ return internalLinkPattern;
+ }
+
+ /**
+ * Indicate if WikiText markup should be validated. The default is true.
+ */
+ public boolean isValidate() {
+ return validate;
+ }
+
+ /**
+ * Indicate if WikiText markup should be validated. The default is true.
+ */
+ public void setValidate(boolean validate) {
+ this.validate = validate;
+ }
+
+ /**
+ * Indicate if WikiText validation errors should cause the Ant build to fail. The default is true.
+ */
+ public boolean isFailOnValidationError() {
+ return failOnValidationError;
+ }
+
+ /**
+ * Indicate if WikiText validation errors should cause the Ant build to fail. The default is true.
+ */
+ public void setFailOnValidationError(boolean failOnValidationError) {
+ this.failOnValidationError = failOnValidationError;
+ }
+
+ /**
+ * Indicate if WikiText validation warnings should cause the Ant build to fail. The default is false.
+ */
+ public boolean isFailOnValidationWarning() {
+ return failOnValidationWarning;
+ }
+
+ /**
+ * Indicate if WikiText validation warnings should cause the Ant build to fail. The default is false.
+ */
+ public void setFailOnValidationWarning(boolean failOnValidationWarning) {
+ this.failOnValidationWarning = failOnValidationWarning;
+ }
+
+ /**
+ * The source encoding.
+ *
+ * @return the source encoding, or null if the default encoding is to be used.
+ * @see java.nio.charset.Charset
+ * @since 1.1
+ */
+ public String getSourceEncoding() {
+ return sourceEncoding;
+ }
+
+ /**
+ * The source encoding. The is the character encoding to be used when reading source files.
+ *
+ * @param sourceEncoding
+ * the source encoding, or null if the default encoding is to be used.
+ * @see java.nio.charset.Charset
+ * @since 1.1
+ */
+ public void setSourceEncoding(String sourceEncoding) {
+ this.sourceEncoding = sourceEncoding;
+ }
+
+ protected void performValidation(File source, String markupContent) {
+ if (!validate) {
+ return;
+ }
+ if (markupLanguage == null) {
+ throw new IllegalStateException();
+ }
+ log(MessageFormat.format(Messages.getString("MarkupTask.1"), source), Project.MSG_VERBOSE); //$NON-NLS-1$
+
+ StandaloneMarkupValidator markupValidator = StandaloneMarkupValidator.getValidator(markupLanguage);
+
+ List<ValidationProblem> problems = markupValidator.validate(markupContent);
+
+ int errorCount = 0;
+ int warningCount = 0;
+ for (ValidationProblem problem : problems) {
+ int messageLevel = Project.MSG_ERR;
+ if (problem.getSeverity() == Severity.ERROR) {
+ ++errorCount;
+ } else if (problem.getSeverity() == Severity.WARNING) {
+ ++warningCount;
+ messageLevel = Project.MSG_WARN;
+ }
+ log(String.format("%s:%s %s", source.getName(), problem.getOffset(), problem.getMessage()), messageLevel); //$NON-NLS-1$
+ }
+
+ if ((errorCount > 0 && failOnValidationError) || (warningCount > 0 && failOnValidationWarning)) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupTask.3"), errorCount, //$NON-NLS-1$
+ warningCount, source));
+ }
+ }
+
+ /**
+ * Support a nested markup language configuration.
+ *
+ * @since 1.1
+ */
+ public void addConfiguredMarkupLanguageConfiguration(MarkupLanguageConfiguration markupLanguageConfiguration) {
+ if (this.markupLanguageConfiguration != null) {
+ throw new BuildException(Messages.getString("MarkupTask.tooManyConfigurations")); //$NON-NLS-1$
+ }
+ this.markupLanguageConfiguration = markupLanguageConfiguration;
+ }
+
+ /**
+ * @since 1.1
+ */
+ protected String readFully(File inputFile) {
+ StringBuilder w = new StringBuilder((int) inputFile.length());
+ try {
+ InputStream input = new BufferedInputStream(new FileInputStream(inputFile));
+ try {
+ Reader r = sourceEncoding == null ? new InputStreamReader(input) : new InputStreamReader(input,
+ sourceEncoding);
+ try {
+ int i;
+ while ((i = r.read()) != -1) {
+ w.append((char) i);
+ }
+ } finally {
+ r.close();
+ }
+ } finally {
+ input.close();
+ }
+ } catch (IOException e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupTask.cannotReadSource"), inputFile, e.getMessage()), e); //$NON-NLS-1$
+ }
+ return w.toString();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDitaTask.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDitaTask.java
new file mode 100644
index 0000000..b9e5690
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDitaTask.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.DitaTopicDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DitaBookMapDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+
+/**
+ * An Ant task for converting markup to OASIS DITA format.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupToDitaTask extends MarkupTask {
+ public enum BreakStrategy {
+ /**
+ * do not break: all output is one topic
+ */
+ NONE,
+ /**
+ * break on level-1 headings
+ */
+ LEVEL1,
+ /**
+ * break on the first level heading found in the document
+ */
+ FIRST
+ }
+
+ private final List<FileSet> filesets = new ArrayList<FileSet>();
+
+ private String filenameFormat;
+
+ private String bookTitle;
+
+ private boolean overwrite = true;
+
+ protected File file;
+
+ private String doctype;
+
+ private String topicDoctype;
+
+ private String topicFolder = "topics"; //$NON-NLS-1$
+
+ private BreakStrategy topicStrategy = BreakStrategy.FIRST;
+
+ /**
+ * Adds a set of files to process.
+ */
+ public void addFileset(FileSet set) {
+ filesets.add(set);
+ }
+
+ @Override
+ public void execute() throws BuildException {
+
+ if (file == null && filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToDitaTask.1")); //$NON-NLS-1$
+ }
+ if (file != null && !filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToDitaTask.2")); //$NON-NLS-1$
+ }
+ if (file != null) {
+ if (!file.exists()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDitaTask.3"), file)); //$NON-NLS-1$
+ } else if (!file.isFile()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDitaTask.4"), file)); //$NON-NLS-1$
+ } else if (!file.canRead()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDitaTask.5"), file)); //$NON-NLS-1$
+ }
+ }
+
+ if (filenameFormat == null) {
+ switch (topicStrategy) {
+ case NONE:
+ filenameFormat = "$1.dita"; //$NON-NLS-1$
+ break;
+ default:
+ filenameFormat = "$1.ditamap"; //$NON-NLS-1$
+ }
+ }
+
+ MarkupLanguage markupLanguage = createMarkupLanguage();
+
+ for (FileSet fileset : filesets) {
+
+ File filesetBaseDir = fileset.getDir(getProject());
+ DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
+
+ String[] files = ds.getIncludedFiles();
+ if (files != null) {
+ File baseDir = ds.getBasedir();
+ for (String file : files) {
+ File inputFile = new File(baseDir, file);
+ try {
+ processFile(markupLanguage, filesetBaseDir, inputFile);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDitaTask.6"), inputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ }
+
+ if (file != null) {
+ try {
+ processFile(markupLanguage, file.getParentFile(), file);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDitaTask.7"), file, e.getMessage()), e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void processFile(MarkupLanguage markupLanguage, final File baseDir, final File source)
+ throws BuildException {
+
+ log(MessageFormat.format(Messages.getString("MarkupToDitaTask.8"), source), Project.MSG_VERBOSE); //$NON-NLS-1$
+
+ String markupContent = null;
+
+ String name = source.getName();
+ if (name.lastIndexOf('.') != -1) {
+ name = name.substring(0, name.lastIndexOf('.'));
+ }
+ File outputFile = new File(source.getParentFile(), filenameFormat.replace("$1", name)); //$NON-NLS-1$
+ if (!outputFile.exists() || overwrite || outputFile.lastModified() < source.lastModified()) {
+ if (markupContent == null) {
+ markupContent = readFully(source);
+ }
+ performValidation(source, markupContent);
+
+ OutlineItem outline = new OutlineParser(markupLanguage).parse(markupContent);
+
+ Writer writer;
+ try {
+ writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(outputFile)), "utf-8"); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDitaTask.11"), outputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ try {
+ if (topicStrategy == BreakStrategy.NONE) {
+ DitaTopicDocumentBuilder builder = new DitaTopicDocumentBuilder(writer);
+ builder.setRootTopicTitle(bookTitle);
+
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ parser.setBuilder(builder);
+ if (topicDoctype != null) {
+ builder.setDoctype(topicDoctype);
+ }
+ builder.setFilename(outputFile.getName());
+ builder.setOutline(outline);
+
+ parser.parse(markupContent);
+ } else {
+ DitaBookMapDocumentBuilder builder = new DitaBookMapDocumentBuilder(writer);
+ try {
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ parser.setBuilder(builder);
+
+ builder.setBookTitle(bookTitle == null ? name : bookTitle);
+
+ if (doctype != null) {
+ builder.setDoctype(doctype);
+ }
+ if (topicDoctype != null) {
+ builder.setTopicDoctype(topicDoctype);
+ }
+ builder.setTargetFile(outputFile);
+ builder.setTopicFolder(topicFolder);
+ builder.setOutline(outline);
+ switch (topicStrategy) {
+ case FIRST:
+ if (!outline.getChildren().isEmpty()) {
+ builder.setTopicBreakLevel(outline.getChildren().get(0).getLevel());
+ } else {
+ builder.setTopicBreakLevel(1);
+ }
+ break;
+ case LEVEL1:
+ builder.setTopicBreakLevel(1);
+ break;
+ }
+
+ parser.parse(markupContent);
+ } finally {
+ try {
+ builder.close();
+ } catch (IOException e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDitaTask.12"), outputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ } finally {
+ try {
+ writer.close();
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDitaTask.12"), outputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ }
+
+ /**
+ * The format of the DocBook output file. Consists of a pattern where the '$1' is replaced with the filename of the
+ * input file. Default value is <code>$1.ditamap</code>
+ *
+ * @see #setFilenameFormat(String)
+ */
+ public String getFilenameFormat() {
+ return filenameFormat;
+ }
+
+ /**
+ * The format of the DocBook output file. Consists of a pattern where the '$1' is replaced with the filename of the
+ * input file. Default value is <code>$1.ditamap</code>
+ */
+ public void setFilenameFormat(String filenameFormat) {
+ this.filenameFormat = filenameFormat;
+ }
+
+ /**
+ * Get the book title.
+ *
+ * @return the title, or null if the source filename is to be used as the title.
+ */
+ public String getBookTitle() {
+ return bookTitle;
+ }
+
+ /**
+ * The book title.
+ *
+ * @param bookTitle
+ * the title, or null if the source filename is to be used as the title.
+ */
+ public void setBookTitle(String bookTitle) {
+ this.bookTitle = bookTitle;
+ }
+
+ /**
+ * Set the XML doctype of the ditamap. The doctype should look something like this:
+ *
+ * <pre>
+ * <!DOCTYPE bookmap PUBLIC \"-//OASIS//DTD DITA 1.1 BookMap//EN\" \"http://docs.oasis-open.org/dita/v1.1/OS/dtd/bookmap.dtd\">
+ * </pre>
+ */
+ public void setDoctype(String doctype) {
+ this.doctype = doctype;
+ }
+
+ /**
+ * The XML doctype of the ditamap.
+ */
+ public String getDoctype() {
+ return doctype;
+ }
+
+ /**
+ * the XML doctype of topics
+ */
+ public String getTopicDoctype() {
+ return topicDoctype;
+ }
+
+ /**
+ * the XML doctype of topics The doctype should look something like this:
+ *
+ * <pre>
+ * <!DOCTYPE topic PUBLIC \"-//OASIS//DTD DITA 1.1 Topic//EN\">
+ * </pre>
+ */
+ public void setTopicDoctype(String topicDoctype) {
+ this.topicDoctype = topicDoctype;
+ }
+
+ public boolean isOverwrite() {
+ return overwrite;
+ }
+
+ public void setOverwrite(boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+ public String getTopicFolder() {
+ return topicFolder;
+ }
+
+ public void setTopicFolder(String topicFolder) {
+ this.topicFolder = topicFolder;
+ }
+
+ public File getFile() {
+ return file;
+ }
+
+ public void setFile(File file) {
+ this.file = file;
+ }
+
+ public BreakStrategy getTopicStrategy() {
+ return topicStrategy;
+ }
+
+ public void setTopicStrategy(BreakStrategy topicStrategy) {
+ this.topicStrategy = topicStrategy;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDocbookTask.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDocbookTask.java
new file mode 100644
index 0000000..ceb3a5d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDocbookTask.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DocBookDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+
+/**
+ * An Ant task for converting markup to docbook format.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupToDocbookTask extends MarkupTask {
+ private final List<FileSet> filesets = new ArrayList<FileSet>();
+
+ private String docbookFilenameFormat = "$1.xml"; //$NON-NLS-1$
+
+ private String bookTitle;
+
+ private boolean overwrite = true;
+
+ protected File file;
+
+ private String doctype;
+
+ /**
+ * Adds a set of files to process.
+ */
+ public void addFileset(FileSet set) {
+ filesets.add(set);
+ }
+
+ @Override
+ public void execute() throws BuildException {
+
+ if (file == null && filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToDocbookTask.1")); //$NON-NLS-1$
+ }
+ if (file != null && !filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToDocbookTask.2")); //$NON-NLS-1$
+ }
+ if (file != null) {
+ if (!file.exists()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDocbookTask.3"), file)); //$NON-NLS-1$
+ } else if (!file.isFile()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDocbookTask.4"), file)); //$NON-NLS-1$
+ } else if (!file.canRead()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToDocbookTask.5"), file)); //$NON-NLS-1$
+ }
+ }
+
+ MarkupLanguage markupLanguage = createMarkupLanguage();
+
+ for (FileSet fileset : filesets) {
+
+ File filesetBaseDir = fileset.getDir(getProject());
+ DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
+
+ String[] files = ds.getIncludedFiles();
+ if (files != null) {
+ File baseDir = ds.getBasedir();
+ for (String file : files) {
+ File inputFile = new File(baseDir, file);
+ try {
+ processFile(markupLanguage, filesetBaseDir, inputFile);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDocbookTask.6"), inputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ }
+
+ if (file != null) {
+ try {
+ processFile(markupLanguage, file.getParentFile(), file);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDocbookTask.7"), file, e.getMessage()), e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void processFile(MarkupLanguage markupLanguage, final File baseDir, final File source)
+ throws BuildException {
+
+ log(MessageFormat.format(Messages.getString("MarkupToDocbookTask.8"), source), Project.MSG_VERBOSE); //$NON-NLS-1$
+
+ String markupContent = null;
+
+ String name = source.getName();
+ if (name.lastIndexOf('.') != -1) {
+ name = name.substring(0, name.lastIndexOf('.'));
+ }
+
+ File docbookOutputFile = new File(source.getParentFile(), docbookFilenameFormat.replace("$1", name)); //$NON-NLS-1$
+ if (!docbookOutputFile.exists() || overwrite || docbookOutputFile.lastModified() < source.lastModified()) {
+
+ if (markupContent == null) {
+ markupContent = readFully(source);
+ }
+ performValidation(source, markupContent);
+
+ Writer writer;
+ try {
+ writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(docbookOutputFile)),
+ "utf-8"); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDocbookTask.11"), docbookOutputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ try {
+ DocBookDocumentBuilder builder = new DocBookDocumentBuilder(writer) {
+ @Override
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ return super.createFormattingXmlStreamWriter(out);
+ }
+ };
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ parser.setBuilder(builder);
+ builder.setBookTitle(bookTitle == null ? name : bookTitle);
+ if (doctype != null) {
+ builder.setDoctype(doctype);
+ }
+ parser.parse(markupContent);
+ } finally {
+ try {
+ writer.close();
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToDocbookTask.12"), docbookOutputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+
+ }
+
+ /**
+ * The format of the DocBook output file. Consists of a pattern where the '$1' is replaced with the filename of the
+ * input file. Default value is <code>$1.xml</code>
+ *
+ * @see #setDocbookFilenameFormat(String)
+ */
+ public String getDocbookFilenameFormat() {
+ return docbookFilenameFormat;
+ }
+
+ /**
+ * The format of the DocBook output file. Consists of a pattern where the '$1' is replaced with the filename of the
+ * input file. Default value is <code>$1.xml</code>
+ *
+ * @param docbookFilenameFormat
+ */
+ public void setDocbookFilenameFormat(String docbookFilenameFormat) {
+ this.docbookFilenameFormat = docbookFilenameFormat;
+ }
+
+ /**
+ * Get the book title.
+ *
+ * @return the title, or null if the source filename is to be used as the title.
+ */
+ public String getBookTitle() {
+ return bookTitle;
+ }
+
+ /**
+ * The book title.
+ *
+ * @param bookTitle
+ * the title, or null if the source filename is to be used as the title.
+ */
+ public void setBookTitle(String bookTitle) {
+ this.bookTitle = bookTitle;
+ }
+
+ /**
+ * Set the XML doctype of the docbook. The doctype should look something like this:
+ * <code><!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"></code>
+ */
+ public void setDoctype(String doctype) {
+ this.doctype = doctype;
+ }
+
+ /**
+ * The XML doctype of the docbook.
+ */
+ public String getDoctype() {
+ return doctype;
+ }
+
+ public boolean isOverwrite() {
+ return overwrite;
+ }
+
+ public void setOverwrite(boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+ public File getFile() {
+ return file;
+ }
+
+ public void setFile(File file) {
+ this.file = file;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToEclipseHelpTask.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToEclipseHelpTask.java
new file mode 100644
index 0000000..1867562
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToEclipseHelpTask.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import org.apache.tools.ant.BuildException;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.SplitOutlineItem;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.SplittingMarkupToEclipseToc;
+import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToEclipseToc;
+
+/**
+ * An Ant task for converting lightweight markup such as Textile to eclipse help format.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupToEclipseHelpTask extends MarkupToHtmlTask {
+
+ private String xmlFilenameFormat = "$1-toc.xml"; //$NON-NLS-1$
+
+ private String helpPrefix;
+
+ @Override
+ void processed(String markupContent, SplitOutlineItem item, final File baseDir, final File source) {
+ super.processed(markupContent, item, baseDir, source);
+
+ String name = source.getName();
+ if (name.lastIndexOf('.') != -1) {
+ name = name.substring(0, name.lastIndexOf('.'));
+ }
+
+ File tocOutputFile = computeTocFile(source, name);
+ if (!tocOutputFile.exists() || overwrite || tocOutputFile.lastModified() < source.lastModified()) {
+ File htmlOutputFile = computeHtmlFile(source, name);
+ if (markupContent == null) {
+ markupContent = readFully(source);
+ }
+
+ Writer writer;
+ try {
+ writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(tocOutputFile)), "utf-8"); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new BuildException(String.format("Cannot write to file '%s': %s", tocOutputFile, e.getMessage()), //$NON-NLS-1$
+ e);
+ }
+ try {
+
+ MarkupToEclipseToc toEclipseToc = new SplittingMarkupToEclipseToc();
+
+ toEclipseToc.setHelpPrefix(helpPrefix);
+ System.out.println("Help: " + baseDir + " " + htmlOutputFile); //$NON-NLS-1$//$NON-NLS-2$
+ toEclipseToc.setBookTitle(title == null ? name : title);
+
+ String basePath = baseDir.getAbsolutePath().replace('\\', '/');
+ String outputFilePath = htmlOutputFile.getAbsolutePath().replace('\\', '/');
+ if (outputFilePath.startsWith(basePath)) {
+ String filePath = outputFilePath.substring(basePath.length());
+ if (filePath.startsWith("/")) { //$NON-NLS-1$
+ filePath = filePath.substring(1);
+ }
+ if (filePath.lastIndexOf('/') != -1) {
+ String relativePart = filePath.substring(0, filePath.lastIndexOf('/'));
+ toEclipseToc.setHelpPrefix(helpPrefix == null ? relativePart : helpPrefix + '/' + relativePart);
+ }
+ }
+
+ toEclipseToc.setHtmlFile(htmlOutputFile.getName());
+
+ String tocXml = toEclipseToc.createToc(item);
+
+ try {
+ writer.write(tocXml);
+ } catch (Exception e) {
+ throw new BuildException(String.format("Cannot write to file '%s': %s", tocXml, e.getMessage()), e); //$NON-NLS-1$
+ }
+ } finally {
+ try {
+ writer.close();
+ } catch (Exception e) {
+ throw new BuildException(String.format("Cannot write to file '%s': %s", tocOutputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ }
+
+ private File computeTocFile(File source, String name) {
+ return new File(source.getParentFile(), xmlFilenameFormat.replace("$1", name)); //$NON-NLS-1$
+ }
+
+ /**
+ * @see #setXmlFilenameFormat(String)
+ */
+ public String getXmlFilenameFormat() {
+ return xmlFilenameFormat;
+ }
+
+ /**
+ * The format of the XML table of contents output file. Consists of a pattern where the '$1' is replaced with the
+ * filename of the input file. Default value is <code>$1-toc.xml</code>
+ */
+ public void setXmlFilenameFormat(String xmlFilenameFormat) {
+ this.xmlFilenameFormat = xmlFilenameFormat;
+ }
+
+ /**
+ * the prefix to URLs in the toc.xml, typically the relative path from the plugin to the help files. For example, if
+ * the help file is in 'help/index.html' then the help prefix would be 'help'
+ */
+ public String getHelpPrefix() {
+ return helpPrefix;
+ }
+
+ /**
+ * the prefix to URLs in the toc.xml, typically the relative path from the plugin to the help files. For example, if
+ * the help file is in 'help/index.html' then the help prefix would be 'help'
+ */
+ public void setHelpPrefix(String helpPrefix) {
+ this.helpPrefix = helpPrefix;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToHtmlTask.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToHtmlTask.java
new file mode 100644
index 0000000..8f449ab
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToHtmlTask.java
@@ -0,0 +1,509 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.DefaultSplittingStrategy;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.NoSplittingStrategy;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.SplitOutlineItem;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.SplittingHtmlDocumentBuilder;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.SplittingOutlineParser;
+import org.eclipse.mylyn.internal.wikitext.core.parser.builder.SplittingStrategy;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ * An Ant task for converting lightweight markup to HTML format.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupToHtmlTask extends MarkupTask {
+ private final List<FileSet> filesets = new ArrayList<FileSet>();
+
+ protected String htmlFilenameFormat = "$1.html"; //$NON-NLS-1$
+
+ protected boolean overwrite = true;
+
+ private final List<Stylesheet> stylesheets = new ArrayList<Stylesheet>();
+
+ protected File file;
+
+ protected String title;
+
+ protected String linkRel;
+
+ protected boolean multipleOutputFiles = false;
+
+ protected boolean formatOutput = false;
+
+ protected boolean navigationImages = false;
+
+ protected String prependImagePrefix = null;
+
+ private boolean useInlineCssStyles = true;
+
+ private boolean suppressBuiltInCssStyles = false;
+
+ private String defaultAbsoluteLinkTarget;
+
+ @Override
+ public void execute() throws BuildException {
+ if (file == null && filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.1")); //$NON-NLS-1$
+ }
+ if (file != null && !filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.2")); //$NON-NLS-1$
+ }
+ if (file != null) {
+ if (!file.exists()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToHtmlTask.3"), file)); //$NON-NLS-1$
+ } else if (!file.isFile()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToHtmlTask.4"), file)); //$NON-NLS-1$
+ } else if (!file.canRead()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToHtmlTask.5"), file)); //$NON-NLS-1$
+ }
+ }
+
+ MarkupLanguage markupLanguage = createMarkupLanguage();
+
+ for (Stylesheet stylesheet : stylesheets) {
+ if (stylesheet.url == null && stylesheet.file == null) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.6")); //$NON-NLS-1$
+ }
+ if (stylesheet.url != null && stylesheet.file != null) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.7")); //$NON-NLS-1$
+ }
+ if (stylesheet.file != null) {
+ if (!stylesheet.file.exists()) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.8") + stylesheet.file); //$NON-NLS-1$
+ }
+ if (!stylesheet.file.isFile()) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.9") + stylesheet.file); //$NON-NLS-1$
+ }
+ if (!stylesheet.file.canRead()) {
+ throw new BuildException(Messages.getString("MarkupToHtmlTask.10") + stylesheet.file); //$NON-NLS-1$
+ }
+ }
+ }
+
+ Set<File> outputFolders = new HashSet<File>();
+
+ for (FileSet fileset : filesets) {
+
+ File filesetBaseDir = fileset.getDir(getProject());
+ DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
+
+ String[] files = ds.getIncludedFiles();
+ if (files != null) {
+ File baseDir = ds.getBasedir();
+ for (String file : files) {
+ File inputFile = new File(baseDir, file);
+ testForOutputFolderConflict(outputFolders, inputFile);
+ try {
+ processFile(markupLanguage, filesetBaseDir, inputFile);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToHtmlTask.11"), inputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ }
+ if (file != null) {
+ testForOutputFolderConflict(outputFolders, file);
+ try {
+ processFile(markupLanguage, file.getParentFile(), file);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToHtmlTask.12"), file, e.getMessage()), e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ private void testForOutputFolderConflict(Set<File> outputFolders, File inputFile) {
+ if (multipleOutputFiles) {
+ File outputFolder = inputFile.getAbsoluteFile().getParentFile();
+ if (!outputFolders.add(outputFolder)) {
+ log(MessageFormat.format(Messages.getString("MarkupToHtmlTask.13"), outputFolder), Project.MSG_WARN); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * process the file
+ *
+ * @param baseDir
+ * @param source
+ * @return the lightweight markup, or null if the file was not written
+ * @throws BuildException
+ */
+ protected String processFile(MarkupLanguage markupLanguage, final File baseDir, final File source)
+ throws BuildException {
+
+ log(MessageFormat.format(Messages.getString("MarkupToHtmlTask.14"), source), Project.MSG_VERBOSE); //$NON-NLS-1$
+
+ String markupContent = null;
+
+ String name = source.getName();
+ if (name.lastIndexOf('.') != -1) {
+ name = name.substring(0, name.lastIndexOf('.'));
+ }
+
+ File htmlOutputFile = computeHtmlFile(source, name);
+ if (!htmlOutputFile.exists() || overwrite || htmlOutputFile.lastModified() < source.lastModified()) {
+
+ if (markupContent == null) {
+ markupContent = readFully(source);
+ }
+
+ performValidation(source, markupContent);
+
+ Writer writer;
+ try {
+ writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(htmlOutputFile)), "utf-8"); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToHtmlTask.16"), htmlOutputFile, e.getMessage()), e); //$NON-NLS-1$
+ }
+ try {
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer, formatOutput);
+ for (Stylesheet stylesheet : stylesheets) {
+ HtmlDocumentBuilder.Stylesheet builderStylesheet;
+
+ if (stylesheet.url != null) {
+ builderStylesheet = new HtmlDocumentBuilder.Stylesheet(stylesheet.url);
+ } else {
+ builderStylesheet = new HtmlDocumentBuilder.Stylesheet(stylesheet.file);
+ }
+ builder.addCssStylesheet(builderStylesheet);
+
+ if (!stylesheet.attributes.isEmpty()) {
+ for (Map.Entry<String, String> attr : stylesheet.attributes.entrySet()) {
+ builderStylesheet.getAttributes().put(attr.getKey(), attr.getValue());
+ }
+ }
+ }
+
+ builder.setTitle(title == null ? name : title);
+ builder.setEmitDtd(true);
+ builder.setUseInlineStyles(useInlineCssStyles);
+ builder.setSuppressBuiltInStyles(suppressBuiltInCssStyles);
+ builder.setLinkRel(linkRel);
+ builder.setDefaultAbsoluteLinkTarget(defaultAbsoluteLinkTarget);
+ builder.setPrependImagePrefix(prependImagePrefix);
+
+ SplittingStrategy splittingStrategy = multipleOutputFiles ? new DefaultSplittingStrategy()
+ : new NoSplittingStrategy();
+ SplittingOutlineParser outlineParser = new SplittingOutlineParser();
+ outlineParser.setMarkupLanguage(markupLanguage.clone());
+ outlineParser.setSplittingStrategy(splittingStrategy);
+ SplitOutlineItem item = outlineParser.parse(markupContent);
+ item.setSplitTarget(htmlOutputFile.getName());
+ SplittingHtmlDocumentBuilder splittingBuilder = new SplittingHtmlDocumentBuilder();
+ splittingBuilder.setRootBuilder(builder);
+ splittingBuilder.setOutline(item);
+ splittingBuilder.setRootFile(htmlOutputFile);
+ splittingBuilder.setNavigationImages(navigationImages);
+ splittingBuilder.setFormatting(formatOutput);
+
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ parser.setBuilder(splittingBuilder);
+
+ parser.parse(markupContent);
+
+ processed(markupContent, item, baseDir, source);
+ } finally {
+ try {
+ writer.close();
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToHtmlTask.17"), htmlOutputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ return markupContent;
+ }
+
+ void processed(String markupContent, SplitOutlineItem item, final File baseDir, final File source) {
+ }
+
+ protected File computeHtmlFile(final File source, String name) {
+ return new File(source.getParentFile(), htmlFilenameFormat.replace("$1", name)); //$NON-NLS-1$
+ }
+
+ /**
+ * @see #setHtmlFilenameFormat(String)
+ */
+ public String getHtmlFilenameFormat() {
+ return htmlFilenameFormat;
+ }
+
+ /**
+ * The format of the HTML output file. Consists of a pattern where the '$1' is replaced with the filename of the
+ * input file. Default value is <code>$1.html</code>
+ *
+ * @param htmlFilenameFormat
+ */
+ public void setHtmlFilenameFormat(String htmlFilenameFormat) {
+ this.htmlFilenameFormat = htmlFilenameFormat;
+ }
+
+ /**
+ * The document title, as it appears in the head
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * The document title, as it appears in the head
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * the file to process
+ */
+ public File getFile() {
+ return file;
+ }
+
+ /**
+ * the file to process
+ */
+ public void setFile(File file) {
+ this.file = file;
+ }
+
+ /**
+ * Adds a set of files to process.
+ */
+ public void addFileset(FileSet set) {
+ filesets.add(set);
+ }
+
+ public void addStylesheet(Stylesheet stylesheet) {
+ if (stylesheet == null) {
+ throw new IllegalArgumentException();
+ }
+ stylesheets.add(stylesheet);
+ }
+
+ /**
+ * indicate if output should be generated to multiple output files.
+ */
+ public boolean isMultipleOutputFiles() {
+ return multipleOutputFiles;
+ }
+
+ /**
+ * indicate if output should be generated to multiple output files.
+ */
+ public void setMultipleOutputFiles(boolean multipleOutputFiles) {
+ this.multipleOutputFiles = multipleOutputFiles;
+ }
+
+ /**
+ * indicate if the output should be formatted
+ */
+ public boolean isFormatOutput() {
+ return formatOutput;
+ }
+
+ /**
+ * indicate if the output should be formatted
+ */
+ public void setFormatOutput(boolean formatOutput) {
+ this.formatOutput = formatOutput;
+ }
+
+ /**
+ * indicate if navigation links should be images
+ */
+ public boolean isNavigationImages() {
+ return navigationImages;
+ }
+
+ /**
+ * indicate if navigation links should be images
+ */
+ public void setNavigationImages(boolean navigationImages) {
+ this.navigationImages = navigationImages;
+ }
+
+ /**
+ * @see HtmlDocumentBuilder#isUseInlineStyles()
+ */
+ public boolean isUseInlineCssStyles() {
+ return useInlineCssStyles;
+ }
+
+ /**
+ * @see HtmlDocumentBuilder#isUseInlineStyles()
+ */
+ public void setUseInlineCssStyles(boolean useInlineCssStyles) {
+ this.useInlineCssStyles = useInlineCssStyles;
+ }
+
+ /**
+ * @see HtmlDocumentBuilder#isSuppressBuiltInStyles()
+ */
+ public boolean isSuppressBuiltInCssStyles() {
+ return suppressBuiltInCssStyles;
+ }
+
+ /**
+ * @see HtmlDocumentBuilder#isSuppressBuiltInStyles()
+ */
+ public void setSuppressBuiltInCssStyles(boolean suppressBuiltInCssStyles) {
+ this.suppressBuiltInCssStyles = suppressBuiltInCssStyles;
+ }
+
+ public static class Attribute {
+ private String name;
+
+ private String value;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+ }
+
+ public static class Stylesheet {
+ private File file;
+
+ private String url;
+
+ private final Map<String, String> attributes = new HashMap<String, String>();
+
+ public File getFile() {
+ return file;
+ }
+
+ public void setFile(File file) {
+ this.file = file;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public void addConfiguredAttribute(Attribute attribute) {
+ attributes.put(attribute.getName(), attribute.getValue());
+ }
+ }
+
+ /**
+ * The 'rel' value for HTML links. If specified the value is applied to all links generated by the builder. The
+ * default value is null. Setting this value to "nofollow" is recommended for rendering HTML in areas where users
+ * may add links, for example in a blog comment. See <a
+ * href="http://en.wikipedia.org/wiki/Nofollow">http://en.wikipedia.org/wiki/Nofollow</a> for more information.
+ */
+ public String getLinkRel() {
+ return linkRel;
+ }
+
+ /**
+ * The 'rel' value for HTML links. If specified the value is applied to all links generated by the builder. The
+ * default value is null. Setting this value to "nofollow" is recommended for rendering HTML in areas where users
+ * may add links, for example in a blog comment. See <a
+ * href="http://en.wikipedia.org/wiki/Nofollow">http://en.wikipedia.org/wiki/Nofollow</a> for more information.
+ */
+ public void setLinkRel(String linkRel) {
+ this.linkRel = linkRel;
+ }
+
+ public String getPrependImagePrefix() {
+ return prependImagePrefix;
+ }
+
+ public void setPrependImagePrefix(String prependImagePrefix) {
+ this.prependImagePrefix = prependImagePrefix;
+ }
+
+ /**
+ * indicate if target files should be overwritten even if their timestamps are newer than the source files.
+ */
+ public boolean isOverwrite() {
+ return overwrite;
+ }
+
+ /**
+ * indicate if target files should be overwritten even if their timestamps are newer than the source files.
+ */
+ public void setOverwrite(boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+ /**
+ * A default target attribute for links that have absolute (not relative) urls. By default this value is null.
+ * Setting this value will cause all HTML anchors to have their target attribute set if it's not explicitly
+ * specified.
+ *
+ * @since 1.1
+ */
+ public String getDefaultAbsoluteLinkTarget() {
+ return defaultAbsoluteLinkTarget;
+ }
+
+ /**
+ * A default target attribute for links that have absolute (not relative) urls. By default this value is null.
+ * Setting this value will cause all HTML anchors to have their target attribute set if it's not explicitly
+ * specified.
+ *
+ * @since 1.1
+ */
+ public void setDefaultAbsoluteLinkTarget(String defaultAbsoluteLinkTarget) {
+ this.defaultAbsoluteLinkTarget = defaultAbsoluteLinkTarget;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToXslfoTask.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToXslfoTask.java
new file mode 100644
index 0000000..03131d4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToXslfoTask.java
@@ -0,0 +1,344 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.XslfoDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ * @author David Green
+ * @since 1.1
+ */
+public class MarkupToXslfoTask extends MarkupTask {
+
+ private final List<FileSet> filesets = new ArrayList<FileSet>();
+
+ protected String xslfoFilenameFormat = "$1.fo"; //$NON-NLS-1$
+
+ protected boolean overwrite = true;
+
+ protected File file;
+
+ protected File targetdir;
+
+ private final XslfoDocumentBuilder.Configuration configuration = new XslfoDocumentBuilder.Configuration();
+
+ @Override
+ public void execute() throws BuildException {
+ if (file == null && filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToXslfoTask.0")); //$NON-NLS-1$
+ }
+ if (file != null && !filesets.isEmpty()) {
+ throw new BuildException(Messages.getString("MarkupToXslfoTask.1")); //$NON-NLS-1$
+ }
+ if (file != null) {
+ if (!file.exists()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToXslfoTask.2"), file)); //$NON-NLS-1$
+ } else if (!file.isFile()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToXslfoTask.3"), file)); //$NON-NLS-1$
+ } else if (!file.canRead()) {
+ throw new BuildException(MessageFormat.format(Messages.getString("MarkupToXslfoTask.4"), file)); //$NON-NLS-1$
+ }
+ }
+
+ MarkupLanguage markupLanguage = createMarkupLanguage();
+
+ for (FileSet fileset : filesets) {
+
+ File filesetBaseDir = fileset.getDir(getProject());
+ DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
+
+ String[] files = ds.getIncludedFiles();
+ if (files != null) {
+ File baseDir = ds.getBasedir();
+ for (String file : files) {
+ File inputFile = new File(baseDir, file);
+ try {
+ processFile(markupLanguage, filesetBaseDir, inputFile);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToXslfoTask.5"), inputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ }
+ if (file != null) {
+ try {
+ processFile(markupLanguage, file.getParentFile(), file);
+ } catch (BuildException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToXslfoTask.6"), file, e.getMessage()), e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * process the file
+ *
+ * @param baseDir
+ * @param source
+ * @return
+ * @return the lightweight markup, or null if the file was not written
+ * @throws BuildException
+ */
+ protected String processFile(MarkupLanguage markupLanguage, final File baseDir, final File source)
+ throws BuildException {
+
+ log(MessageFormat.format(Messages.getString("MarkupToXslfoTask.7"), source), Project.MSG_VERBOSE); //$NON-NLS-1$
+
+ String markupContent = null;
+
+ String name = source.getName();
+ if (name.lastIndexOf('.') != -1) {
+ name = name.substring(0, name.lastIndexOf('.'));
+ }
+
+ File outputFile = computeXslfoFile(source, name);
+ if (targetdir != null) {
+ outputFile = new File(targetdir, outputFile.getName());
+ }
+ if (!outputFile.exists() || overwrite || outputFile.lastModified() < source.lastModified()) {
+
+ if (markupContent == null) {
+ markupContent = readFully(source);
+ }
+
+ performValidation(source, markupContent);
+
+ Writer out;
+ try {
+ out = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(outputFile)), "utf-8"); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToXslfoTask.8"), outputFile, e.getMessage()), e); //$NON-NLS-1$
+ }
+ try {
+ XslfoDocumentBuilder builder = new XslfoDocumentBuilder(out);
+ XslfoDocumentBuilder.Configuration configuration = this.configuration.clone();
+ if (configuration.getTitle() == null) {
+ configuration.setTitle(name);
+ }
+ builder.setConfiguration(configuration);
+ builder.setBase(source.getParentFile().toURI());
+
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ parser.setBuilder(builder);
+
+ parser.parse(markupContent);
+ } finally {
+ try {
+ out.close();
+ } catch (Exception e) {
+ throw new BuildException(MessageFormat.format(
+ Messages.getString("MarkupToXslfoTask.9"), outputFile, //$NON-NLS-1$
+ e.getMessage()), e);
+ }
+ }
+ }
+ return markupContent;
+ }
+
+ protected File computeXslfoFile(final File source, String name) {
+ return new File(source.getParentFile(), xslfoFilenameFormat.replace("$1", name)); //$NON-NLS-1$
+ }
+
+ /**
+ * @see #setXslfoFilenameFormat(String)
+ */
+ public String getXslfoFilenameFormat() {
+ return xslfoFilenameFormat;
+ }
+
+ /**
+ * The format of the XSL-FO output file. Consists of a pattern where the '$1' is replaced with the filename of the
+ * input file. Default value is <code>$1.fo</code>
+ */
+ public void setXslfoFilenameFormat(String filenameFormat) {
+ this.xslfoFilenameFormat = filenameFormat;
+ }
+
+ /**
+ * the file to process
+ */
+ public File getFile() {
+ return file;
+ }
+
+ /**
+ * the file to process
+ */
+ public void setFile(File file) {
+ this.file = file;
+ }
+
+ /**
+ * Adds a set of files to process.
+ */
+ public void addFileset(FileSet set) {
+ filesets.add(set);
+ }
+
+ public File getTargetdir() {
+ return targetdir;
+ }
+
+ public void setTargetdir(File targetdir) {
+ this.targetdir = targetdir;
+ }
+
+ public String getAuthor() {
+ return configuration.getAuthor();
+ }
+
+ public String getCopyright() {
+ return configuration.getCopyright();
+ }
+
+ public String getDate() {
+ return configuration.getDate();
+ }
+
+ public float getFontSize() {
+ return configuration.getFontSize();
+ }
+
+ public float[] getFontSizeMultipliers() {
+ return configuration.getFontSizeMultipliers();
+ }
+
+ public float getPageHeight() {
+ return configuration.getPageHeight();
+ }
+
+ public float getPageMargin() {
+ return configuration.getPageMargin();
+ }
+
+ public float getPageWidth() {
+ return configuration.getPageWidth();
+ }
+
+ public String getSubTitle() {
+ return configuration.getSubTitle();
+ }
+
+ public String getTitle() {
+ return configuration.getTitle();
+ }
+
+ public String getVersion() {
+ return configuration.getVersion();
+ }
+
+ public boolean isPageBreakOnHeading1() {
+ return configuration.isPageBreakOnHeading1();
+ }
+
+ public boolean isPageNumbering() {
+ return configuration.isPageNumbering();
+ }
+
+ public boolean isPanelText() {
+ return configuration.isPanelText();
+ }
+
+ public boolean isShowExternalLinks() {
+ return configuration.isShowExternalLinks();
+ }
+
+ public boolean isUnderlineLinks() {
+ return configuration.isUnderlineLinks();
+ }
+
+ public void setAuthor(String author) {
+ configuration.setAuthor(author);
+ }
+
+ public void setCopyright(String copyright) {
+ configuration.setCopyright(copyright);
+ }
+
+ public void setDate(String date) {
+ configuration.setDate(date);
+ }
+
+ public void setFontSize(float fontSize) {
+ configuration.setFontSize(fontSize);
+ }
+
+ public void setFontSizeMultipliers(float[] fontSizeMultipliers) {
+ configuration.setFontSizeMultipliers(fontSizeMultipliers);
+ }
+
+ public void setPageBreakOnHeading1(boolean pageBreakOnHeading1) {
+ configuration.setPageBreakOnHeading1(pageBreakOnHeading1);
+ }
+
+ public void setPageHeight(float pageHeight) {
+ configuration.setPageHeight(pageHeight);
+ }
+
+ public void setPageMargin(float pageMargin) {
+ configuration.setPageMargin(pageMargin);
+ }
+
+ public void setPageNumbering(boolean pageNumbering) {
+ configuration.setPageNumbering(pageNumbering);
+ }
+
+ public void setPageWidth(float pageWidth) {
+ configuration.setPageWidth(pageWidth);
+ }
+
+ public void setPanelText(boolean panelText) {
+ configuration.setPanelText(panelText);
+ }
+
+ public void setShowExternalLinks(boolean showExternalLinks) {
+ configuration.setShowExternalLinks(showExternalLinks);
+ }
+
+ public void setSubTitle(String subTitle) {
+ configuration.setSubTitle(subTitle);
+ }
+
+ public void setTitle(String title) {
+ configuration.setTitle(title);
+ }
+
+ public void setUnderlineLinks(boolean underlineLinks) {
+ configuration.setUnderlineLinks(underlineLinks);
+ }
+
+ public void setVersion(String version) {
+ configuration.setVersion(version);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/Messages.java
new file mode 100644
index 0000000..200ea08
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.wikitext.core.util.anttask.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/messages.properties
new file mode 100644
index 0000000..3894d54
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/messages.properties
@@ -0,0 +1,63 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+MarkupTask.0=Must specify @markupLanguage
+MarkupTask.1=Validating {0}
+MarkupTask.3=Validation: {0} errors and {1} warnings on file ''{2}''
+MarkupTask.tooManyConfigurations=Only one MarkupLanguageConfiguration may be specified
+MarkupToDocbookTask.11=Cannot write to file ''{0}'': {1}
+MarkupToDocbookTask.12=Cannot write to file ''{0}'': {1}
+MarkupToDocbookTask.1=Please add one or more source filesets or specify @file
+MarkupToDocbookTask.2=@file may not be specified if filesets are also specified
+MarkupToDocbookTask.3=File cannot be found: {0}
+MarkupToDocbookTask.4=Not a file: {0}
+MarkupToDocbookTask.5=Cannot read file: {0}
+MarkupToDocbookTask.6=Cannot process file ''{0}'': {1}
+MarkupToDocbookTask.7=Cannot process file ''{0}'': {1}
+MarkupToDocbookTask.8=Processing file ''{0}''
+MarkupToHtmlTask.1=Please add one or more source filesets or specify @file
+MarkupToHtmlTask.10=Cannot read stylesheet:
+MarkupToHtmlTask.11=Cannot process file ''{0}'': {1}
+MarkupToHtmlTask.12=Cannot process file ''{0}'': {1}
+MarkupToHtmlTask.13=multipleOutputFiles have already been created in folder ''{0}''
+MarkupToHtmlTask.14=Processing file ''{0}''
+MarkupToHtmlTask.16=Cannot write to file ''{0}'': {1}
+MarkupToHtmlTask.17=Cannot write to file ''{0}'': {1}
+MarkupToHtmlTask.2=@file may not be specified if filesets are also specified
+MarkupToHtmlTask.3=File cannot be found: {0}
+MarkupToHtmlTask.4=Not a file: {0}
+MarkupToHtmlTask.5=Cannot read file: {0}
+MarkupToHtmlTask.6=Must specify one of @file or @url on <stylesheet>
+MarkupToHtmlTask.7=May only specify one of @file or @url on <stylesheet>
+MarkupToHtmlTask.8=Stylesheet file does not exist:
+MarkupToHtmlTask.9=Referenced stylesheet is not a file:
+MarkupToDitaTask.1=Please add one or more source filesets or specify @file
+MarkupToDitaTask.2=@file may not be specified if filesets are also specified
+MarkupToDitaTask.3=File cannot be found: {0}
+MarkupToDitaTask.4=Not a file: {0}
+MarkupToDitaTask.5=Cannot read file: {0}
+MarkupToDitaTask.6=Cannot process file ''{0}'': {1}
+MarkupToDitaTask.7=Cannot process file ''{0}'': {1}
+MarkupToDitaTask.8=Processing file ''{0}''
+MarkupToDitaTask.11=Cannot write to file ''{0}'': {1}
+MarkupToDitaTask.12=Cannot write to file ''{0}'': {1}
+
+MarkupToXslfoTask.0=Please add one or more source filesets or specify @file
+MarkupToXslfoTask.1=@file may not be specified if filesets are also specified
+MarkupToXslfoTask.2=File cannot be found: {0}
+MarkupToXslfoTask.3=Not a file: {0}
+MarkupToXslfoTask.4=Cannot read file: {0}
+MarkupToXslfoTask.5=Cannot process file ''{0}'': {1}
+MarkupToXslfoTask.6=Cannot process file ''{0}'': {1}
+MarkupToXslfoTask.7=Processing file ''{0}''
+MarkupToXslfoTask.8=Cannot write to file ''{0}'': {1}
+MarkupToXslfoTask.9=Cannot write to file ''{0}'': {1}
+
+MarkupTask.cannotReadSource=Cannot read file ''{0}'': {1}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/package-info.java
new file mode 100644
index 0000000..2e170ca
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * Ant tasks that drive conversion of markup to various output formats.
+ */
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties
new file mode 100644
index 0000000..b81ecaf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+wikitext-to-eclipse-help=org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToEclipseHelpTask
+wikitext-to-html=org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToHtmlTask
+wikitext-to-docbook=org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToDocbookTask
+wikitext-to-dita=org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToDitaTask
+wikitext-to-xslfo=org.eclipse.mylyn.wikitext.core.util.anttask.MarkupToXslfoTask
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/messages.properties
new file mode 100644
index 0000000..c257c9c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/messages.properties
@@ -0,0 +1,15 @@
+ServiceLocator.1=Cannot load WikiText services
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+ServiceLocator.0=Cannot load class {0}
+ServiceLocator.4=No parser available for markup language ''{0}''. {1}
+ServiceLocator.5=There are no markup language parsers available on the current classpath. Did you forget to add a jar file?
+ServiceLocator.6=Known markup languages are
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/package-info.java
new file mode 100644
index 0000000..9014e9a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/util/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * Utility classes that are useful when using the parser framework
+ */
+package org.eclipse.mylyn.wikitext.core.util;
+
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/DocumentLocalReferenceValidationRule.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/DocumentLocalReferenceValidationRule.java
new file mode 100644
index 0000000..b9ba81d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/DocumentLocalReferenceValidationRule.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.validation;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.IdGenerator;
+import org.eclipse.mylyn.wikitext.core.parser.Locator;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+/**
+ * A validation rule that verifies that internal document links resolve to a document id.
+ *
+ * @author David Green
+ */
+public abstract class DocumentLocalReferenceValidationRule extends ValidationRule {
+
+ private final class LocalReference {
+ public LocalReference(String name, int offset, int length) {
+ super();
+ this.name = name;
+ this.offset = offset;
+ this.length = length;
+ if (length < 0) {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ String name;
+
+ int offset, length;
+ }
+
+ private final class OutlineParserExtension extends OutlineParser {
+ public IdGenerator idGenerator;
+
+ private final int offset;
+
+ private final int length;
+
+ private List<LocalReference> references;
+
+ private OutlineParserExtension(int offset, int length) {
+ this.offset = offset;
+ this.length = length;
+ }
+
+ private final class OutlineBuilderExtension extends OutlineBuilder {
+ private OutlineBuilderExtension(OutlineItem root, int labelMaxLength) {
+ super(root, labelMaxLength);
+ OutlineParserExtension.this.idGenerator = idGenerator;
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ super.link(attributes, hrefOrHashName, text);
+ processLink(getLocator(), hrefOrHashName);
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes ImageAttributes, String href, String imageUrl) {
+ super.imageLink(linkAttributes, ImageAttributes, href, imageUrl);
+ processLink(getLocator(), href);
+ }
+ }
+
+ @Override
+ protected boolean isBlocksOnly() {
+ return false;
+ }
+
+ @Override
+ public DocumentBuilder createOutlineUpdater(OutlineItem rootItem) {
+ return new OutlineBuilderExtension(rootItem, getLabelMaxLength());
+ }
+
+ public void processLink(Locator locator, String href) {
+ if ((locator.getDocumentOffset() < offset) || (locator.getDocumentOffset() >= (offset + length))) {
+ return;
+ }
+ if (href.length() > 0 && href.charAt(0) == '#') {
+ if (references == null) {
+ references = new ArrayList<LocalReference>();
+ }
+ String name = href.substring(1);
+ int length = locator.getLineSegmentEndOffset() - locator.getLineCharacterOffset();
+ references.add(new LocalReference(name, locator.getDocumentOffset(), length));
+ }
+ }
+ }
+
+ protected abstract MarkupLanguage createMarkupLanguage();
+
+ @Override
+ public ValidationProblem findProblem(String markup, int offset, int length) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ValidationProblem> findProblems(String markup, int offset, int length) {
+ MarkupLanguage markupLanguage = createMarkupLanguage();
+
+ OutlineParserExtension outlineParser = new OutlineParserExtension(offset, length);
+ outlineParser.setMarkupLanguage(markupLanguage);
+ outlineParser.parse(markup);
+
+ List<ValidationProblem> problems = null;
+ if (outlineParser.references != null) {
+ Set<String> anchorNames = outlineParser.idGenerator.getAnchorNames();
+ for (LocalReference reference : outlineParser.references) {
+ if (!anchorNames.contains(reference.name)) {
+ if (problems == null) {
+ problems = new ArrayList<ValidationProblem>();
+ }
+ problems.add(new ValidationProblem(Severity.ERROR, MessageFormat.format(
+ Messages.getString("DocumentLocalReferenceValidationRule.0"), reference.name), reference.offset, //$NON-NLS-1$
+ reference.length));
+ }
+ }
+ }
+ if (problems == null) {
+ return Collections.emptyList();
+ }
+ return problems;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/MarkupValidator.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/MarkupValidator.java
new file mode 100644
index 0000000..e0a5001
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/MarkupValidator.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.validation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.wikitext.core.validation.StandaloneMarkupValidator;
+
+/**
+ * Validate markup given a set of rules
+ *
+ * @author David Green
+ *
+ * @see StandaloneMarkupValidator
+ * @since 1.0
+ */
+public class MarkupValidator {
+
+ private final List<ValidationRule> rules = new ArrayList<ValidationRule>();
+
+ public List<ValidationProblem> validate(IProgressMonitor monitor, String markup) {
+ return validate(monitor, markup, 0, markup.length());
+ }
+
+ public List<ValidationProblem> validate(IProgressMonitor monitor, String markup, int offset, int length) {
+ final int totalWork = length == 0 || rules.isEmpty() ? 1 : rules.size();
+ monitor.beginTask(Messages.getString("MarkupValidator.0"), totalWork); //$NON-NLS-1$
+ try {
+ if (length == 0 || rules.isEmpty()) {
+ return Collections.emptyList();
+ }
+ int end = offset + length;
+ if (end > markup.length()) {
+ end = markup.length();
+ }
+ List<ValidationProblem> problems = new ArrayList<ValidationProblem>();
+
+ for (ValidationRule rule : rules) {
+ problems.addAll(rule.findProblems(markup, offset, length));
+ monitor.worked(1);
+ }
+ if (!problems.isEmpty()) {
+ Collections.sort(problems);
+ }
+ return problems;
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public List<ValidationRule> getRules() {
+ return rules;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/Messages.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/Messages.java
new file mode 100644
index 0000000..fe01428
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.validation;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.wikitext.core.validation.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/ValidationProblem.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/ValidationProblem.java
new file mode 100644
index 0000000..89619f6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/ValidationProblem.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.validation;
+
+/**
+ * A validation problem is an indication of an error or warning that occurred while validating a document. A problem has
+ * a marker id, severity, message, and optional offset and length.
+ *
+ * Default comparison semantics order problems by increasing offset.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ValidationProblem implements Comparable<ValidationProblem> {
+ /**
+ * The default marker id for a WikiText validation problem.
+ */
+ public static final String DEFAULT_MARKER_ID = "org.eclipse.mylyn.wikitext.core.validation.problem";//$NON-NLS-1$
+
+ public enum Severity {
+ WARNING, ERROR
+ }
+
+ private String markerId = DEFAULT_MARKER_ID;
+
+ private Severity severity;
+
+ private String message;
+
+ private int offset;
+
+ private int length;
+
+ /**
+ * create a validation problem
+ *
+ * @param severity
+ * a severity indicating the severity of the problem
+ * @param message
+ * the message describing the problem
+ * @param offset
+ * the offset into the document that the problem starts
+ * @param length
+ * the length of the problem, which may be 0
+ *
+ * @throws IllegalArgumentException
+ * if the severity is invalid, the offset is < 0, the length is < 0, or if no message is provided
+ */
+ public ValidationProblem(Severity severity, String message, int offset, int length) {
+ setSeverity(severity);
+ setMessage(message);
+ setOffset(offset);
+ setLength(length);
+ }
+
+ public String getMarkerId() {
+ return markerId;
+ }
+
+ public void setMarkerId(String markerId) {
+ this.markerId = markerId;
+ }
+
+ public Severity getSeverity() {
+ return severity;
+ }
+
+ /**
+ * @param severity
+ * a severity
+ */
+ public void setSeverity(Severity severity) {
+ if (severity == null) {
+ throw new IllegalArgumentException();
+ }
+ this.severity = severity;
+ }
+
+ /**
+ * the text message as it is displayed to the user
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * @param message
+ * the text message as it is displayed to the user
+ */
+ public void setMessage(String message) {
+ if (message == null || message.length() == 0) {
+ throw new IllegalArgumentException();
+ }
+ this.message = message;
+ }
+
+ /**
+ * the character offset in the document of the problem
+ */
+ public int getOffset() {
+ return offset;
+ }
+
+ public void setOffset(int offset) {
+ if (offset < 0) {
+ throw new IllegalArgumentException();
+ }
+ this.offset = offset;
+ }
+
+ /**
+ * the length of the problem in characters
+ */
+ public int getLength() {
+ return length;
+ }
+
+ public void setLength(int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException();
+ }
+ this.length = length;
+ }
+
+ @Override
+ public String toString() {
+ return severity + "[" + offset + "," + length + "]: " + message; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ public int compareTo(ValidationProblem o2) {
+ if (this == o2) {
+ return 0;
+ }
+ int offset1 = this.getOffset();
+ int offset2 = o2.getOffset();
+ if (offset1 < offset2) {
+ return -1;
+ } else if (offset2 < offset1) {
+ return 1;
+ } else {
+ int length1 = this.getLength();
+ int length2 = o2.getLength();
+ if (length1 > length2) {
+ return -1;
+ } else if (length2 > length1) {
+ return 1;
+ } else {
+ int i = this.getMessage().compareTo(o2.getMessage());
+ if (i == 0) {
+ i = this.getMarkerId().compareTo(o2.getMarkerId());
+ }
+ return i;
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/ValidationRule.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/ValidationRule.java
new file mode 100644
index 0000000..4753102
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/ValidationRule.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.validation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A validation rule.
+ *
+ * Validation rules must not be stateful, as they may be used concurrently on different threads.
+ *
+ * @author David Green
+ */
+public abstract class ValidationRule {
+
+ /**
+ * Starting at the given offset find the next validation problem.
+ *
+ * @param markup
+ * the markup content in which a validation problem should be found
+ * @param offset
+ * the offset at which to start looking for problems
+ * @param length
+ * the length at which to stop looking for problems
+ *
+ * @return the validation problem if found, or null if no validation problem was detected
+ */
+ public abstract ValidationProblem findProblem(String markup, int offset, int length);
+
+ /**
+ * Find all validation problems that exist starting at the given offset
+ *
+ * @param markup
+ * the markup content in which a validation problem should be found
+ * @param offset
+ * the offset at which to start looking for problems
+ * @param length
+ * the length at which to stop looking for problems
+ *
+ * @return the problems, or an empty list if there are none
+ */
+ public List<ValidationProblem> findProblems(String markup, int offset, int length) {
+ if (length == 0) {
+ return Collections.emptyList();
+ }
+ int end = offset + length;
+ if (end > markup.length()) {
+ end = markup.length();
+ }
+ List<ValidationProblem> problems = new ArrayList<ValidationProblem>();
+
+ int o = offset;
+ while (o < end) {
+ ValidationProblem problem = findProblem(markup, o, length - (o - offset));
+ if (problem == null) {
+ break;
+ }
+ problems.add(problem);
+ int newO = problem.getOffset() + problem.getLength();
+ if (newO <= o) {
+ break;
+ }
+ o = newO;
+ }
+
+ return problems;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/messages.properties b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/messages.properties
new file mode 100644
index 0000000..92085ce
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/messages.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+DocumentLocalReferenceValidationRule.0=Cannot resolve element with id ''{0}''
+MarkupValidator.0=Markup Validation
diff --git a/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/package-info.java b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/package-info.java
new file mode 100644
index 0000000..6c8ecb4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.core/src/org/eclipse/mylyn/wikitext/core/validation/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * A framework for validating documents according to markup-specific validation rules.
+ */
+package org.eclipse.mylyn.wikitext.core.validation;
+
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.classpath b/org.eclipse.mylyn.wikitext.help.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.externalToolBuilders/Documentation Builder.launch b/org.eclipse.mylyn.wikitext.help.ui/.externalToolBuilders/Documentation Builder.launch
new file mode 100644
index 0000000..a5b5137
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.externalToolBuilders/Documentation Builder.launch
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AFTER_CLEAN_TARGETS" value="all,"/>
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AUTO_TARGETS" value="clean,all,"/>
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_MANUAL_TARGETS" value="clean,all,"/>
+<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
+<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <launchConfigurationWorkingSet editPageId="org.eclipse.ui.resourceWorkingSetPage" factoryID="org.eclipse.ui.internal.WorkingSetFactory" label="working set" name="working set"> <item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/org.eclipse.mylyn.wikitext.help.ui" type="4"/> </launchConfigurationWorkingSet>}"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.mylyn.wikitext.help.ui"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_BUILD_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <launchConfigurationWorkingSet editPageId="org.eclipse.ui.resourceWorkingSetPage" factoryID="org.eclipse.ui.internal.WorkingSetFactory" label="workingSet" name="workingSet"> <item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/org.eclipse.mylyn.wikitext.help.ui/help/images" type="2"/> <item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/org.eclipse.mylyn.wikitext.help.ui/help/Mylyn WikiText User Guide.textile" type="1"/> <item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/org.eclipse.mylyn.wikitext.help.ui/help/devguide/WikiText Developer Guide.textile" type="1"/> </launchConfigurationWorkingSet>}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/org.eclipse.mylyn.wikitext.help.ui/build-helper.xml}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/org.eclipse.mylyn.wikitext.help.ui}"/>
+</launchConfiguration>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.project b/org.eclipse.mylyn.wikitext.help.ui/.project
new file mode 100644
index 0000000..6dcf24d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.project
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.help.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.mylyn.wikitext.ui.wikiTextValidationBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+ <triggers>auto,full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>LaunchConfigHandle</key>
+ <value><project>/.externalToolBuilders/Documentation Builder.launch</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.mylyn.wikitext.ui.wikiTextNature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..f143757
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Jan 20 07:20:33 PST 2009
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2009 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4705dd0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:46 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..23db5af
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Thu Dec 04 10:52:30 PST 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.internal=1
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.help.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7ed8a97
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.help.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.help
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.help.ui/about.html b/org.eclipse.mylyn.wikitext.help.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/build-helper.xml b/org.eclipse.mylyn.wikitext.help.ui/build-helper.xml
new file mode 100644
index 0000000..ab245fb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/build-helper.xml
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<project name="org.eclipse.mylyn.wikitext.ui">
+
+ <property name="wikitext.ui.textile.bin" value="../org.eclipse.mylyn.wikitext.textile.core/.tmp.bin"/>
+
+ <path id="wikitext.ant.classpath">
+ <pathelement location="../org.eclipse.mylyn.wikitext.core/@dot"/>
+ <pathelement location="../org.eclipse.mylyn.wikitext.core/bin"/>
+ <pathelement location="${wikitext.ui.textile.bin}"/>
+ </path>
+
+ <target name="clean">
+ <delete failonerror="false">
+ <fileset dir="help">
+ <include name="**/*.html"/>
+ <include name="**/*-toc.xml"/>
+ </fileset>
+ </delete>
+ <delete failonerror="false">
+ <fileset dir="docs/new">
+ <include name="**/*.html"/>
+ <exclude name="**/*"/>
+ </fileset>
+ </delete>
+ <delete dir="${wikitext.ui.textile.bin}" failonerror="false"/>
+ </target>
+
+ <target name="all" depends="plugin-docs, new-and-noteworthy">
+ </target>
+
+
+ <target name="plugin-docs" depends="compile-tasks" description="generate plugin help documentation">
+ <taskdef resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties" classpathref="wikitext.ant.classpath"/>
+
+ <wikitext-to-eclipse-help markupLanguage="org.eclipse.mylyn.wikitext.textile.core.TextileLanguage"
+ multipleOutputFiles="true"
+ navigationImages="true"
+ helpPrefix="help">
+ <fileset dir="help" includes="**/*.textile"/>
+ <stylesheet url="book.css"/>
+ <stylesheet file="${basedir}/help/styles/main.css"/>
+ </wikitext-to-eclipse-help>
+
+ <antcall target="test"/>
+ </target>
+
+ <target name="compile-tasks">
+ <!--
+ bug 269970 we can't rely on Textile being built first, so we compile here instead.
+ -->
+ <mkdir dir="${wikitext.ui.textile.bin}"/>
+ <javac destdir="${wikitext.ui.textile.bin}" srcdir="../org.eclipse.mylyn.wikitext.textile.core/src">
+ <classpath>
+ <pathelement location="../org.eclipse.mylyn.wikitext.core/@dot"/>
+ <pathelement location="../org.eclipse.mylyn.wikitext.core/bin"/>
+ </classpath>
+ </javac>
+ </target>
+
+
+ <target name="test" description="verify that all of the HTML files are well-formed XML">
+ <echo level="info">
+Validating help content XML and HTML files: The Eclipse help system expects well-formed XML
+
+If validation fails it is because either:
+
+* the userguide source code is poorly formed, or
+* the WikiText MediaWiki parser has a bug
+
+Problems with userguide source are usually caused by improper use of HTML markup in the MediaWiki source,
+or inadvertently starting a line with a space character (in MediaWiki this starts a preformatted block)
+ </echo>
+
+ <!--
+ Don't bother with DTD validation: we only care if the files are well-formed.
+ We therefore provide an empty DTD
+ -->
+ <mkdir dir="__tmp"/>
+ <echo file="__tmp/__empty.dtd" message=""/>
+ <xmlvalidate lenient="true">
+ <fileset dir="help">
+ <include name="**/*.xml"/>
+ </fileset>
+ <fileset dir="help">
+ <include name="**/*.html"/>
+ </fileset>
+ <dtd publicid="-//W3C//DTD XHTML 1.0 Transitional//EN" location="${basedir}/__tmp/__empty.dtd"/>
+ </xmlvalidate>
+ <delete dir="__tmp"/>
+ </target>
+
+ <target name="new-and-noteworthy">
+ <xslt style="docs/new/new.xsl" destdir="docs/new" basedir="docs/new" includes="new*.xml"/>
+ </target>
+</project>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/build.properties b/org.eclipse.mylyn.wikitext.help.ui/build.properties
new file mode 100644
index 0000000..dd8893f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/build.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ help/,\
+ contextHelp.xml,\
+ plugin.properties,\
+ about.html,\
+ toc-sdk.xml
+
+customBuildCallbacks=customBuildCallbacks.xml
+
+src.includes=about.html
diff --git a/org.eclipse.mylyn.wikitext.help.ui/contextHelp.xml b/org.eclipse.mylyn.wikitext.help.ui/contextHelp.xml
new file mode 100644
index 0000000..a615a6a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/contextHelp.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<contexts>
+ <context id="markupSourceContext" title="WikiText Markup Editor">
+ <topic href="help/Mylyn WikiText User Guide.html" label="WikiText User Guide"/>
+ </context>
+ <context id="markupConversion" title="Markup Conversion">
+ <topic href="help/Markup-Conversion.html" label="WikiText Markup Conversion"/>
+ </context>
+ <context id="preferences" title="Preferences">
+ <topic href="help/Preferences.html" label="WikiText Preferences"/>
+ </context>
+ <context id="projectSettings" title="Project Settings">
+ <topic href="help/Getting-Started.html#ProjectSettings" label="Project Settings"/>
+ </context>
+</contexts>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/customBuildCallbacks.xml b/org.eclipse.mylyn.wikitext.help.ui/customBuildCallbacks.xml
new file mode 100644
index 0000000..6298b52
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/customBuildCallbacks.xml
@@ -0,0 +1,170 @@
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<!-- ===================================================================== -->
+<!-- Custom targets called from a project's generated build.xml -->
+<!-- Set customBuildCallbacks=<path/to/this/file> in your build.properties.-->
+<!-- ===================================================================== -->
+<project name="Build specific targets and properties" default="noDefault">
+
+ <!-- ===================================================================== -->
+ <!-- Default target -->
+ <!-- ===================================================================== -->
+ <target name="noDefault">
+ <echo message="This file must be called with explicit targets" />
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.jars">
+ <echoproperties/>
+ <ant antfile="build-helper.xml" target="plugin-docs"/>
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.jars -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.jars">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="pre.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target build.sources -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder to contain the build results -->
+ <!-- ===================================================================== -->
+ <target name="post.build.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="pre.name">
+ </target>
+
+ <target name="pre. at dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do during the compilation target <name>, after the compile -->
+ <!-- but before jaring. Substitute "name" with the name of the compilation-->
+ <!-- target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- source.foldern : n = 1 ... N, the source folders -->
+ <!-- target.folder : where the results of the compilation go -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.compile.name">
+ </target>
+
+ <target name="post.compile. at dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the compilation target <name> -->
+ <!-- Substitute "name" with the name of the compilation target, eg @dot -->
+ <!-- Available parameters : -->
+ <!-- jar.location - the location of the compilation results -->
+ <!-- <name>.classpath : name = name of the compilation target. A -->
+ <!-- reference to the classpath structure. -->
+ <!-- ===================================================================== -->
+ <target name="post.name">
+ </target>
+
+ <target name="post. at dot">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.bin.parts -->
+ <!-- Available parameters : -->
+ <!-- build.result.folder - folder containing the build results -->
+ <!-- target.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.bin.parts">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.sources -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.sources">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target gather.logs -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="post.gather.logs">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do before the target clean -->
+ <!-- Available parameters : -->
+ <!-- destination.temp.folder - destination folder -->
+ <!-- ===================================================================== -->
+ <target name="pre.clean">
+ </target>
+
+ <!-- ===================================================================== -->
+ <!-- Steps to do after the target clean -->
+ <!-- Available parameters : -->
+ <!-- plugin.destination - final destination of the build -->
+ <!-- build.result.folder - results of the compilation -->
+ <!-- temp.folder - temporary folder -->
+ <!-- ===================================================================== -->
+ <target name="post.clean">
+ </target>
+</project>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/.cvsignore b/org.eclipse.mylyn.wikitext.help.ui/docs/new/.cvsignore
new file mode 100644
index 0000000..e69de29
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-cheatsheet.png b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-cheatsheet.png
new file mode 100644
index 0000000..03d7444
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-cheatsheet.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-content-assist.png b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-content-assist.png
new file mode 100644
index 0000000..1778986
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-content-assist.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-editor.png b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-editor.png
new file mode 100644
index 0000000..30f885c
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-editor.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-generate-menu.png b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-generate-menu.png
new file mode 100644
index 0000000..d041ce8
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-generate-menu.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-preferences.png b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-preferences.png
new file mode 100644
index 0000000..4eb59d9
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/docs/new/images/wikitext-preferences.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/new-3.1.html b/org.eclipse.mylyn.wikitext.help.ui/docs/new/new-3.1.html
new file mode 100644
index 0000000..4aaae48
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/docs/new/new-3.1.html
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="ISO-8859-1"?><html xmlns:fn="http://www.w3.org/2005/xpath-functions"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/><title>New And Noteworthy</title><style type="text/css">
+img {
+ margin: 5px;
+}
+
+table.category0 th {
+ background-color: #FAF7FB;
+}
+
+table.category1 th {
+ background-color: #E0D0E6;
+}
+
+.newCaption {
+ background-color: rgb(224, 208, 230);
+ font-weight: bold;
+}
+ </style></head><body><div class="mainContent"><p><span class="newCaption">New in Mylyn 3.1</span></p><ul><li><a href="#WikiText">WikiText (5)</a></li></ul><h2><a name="WikiText"/>WikiText</h2>
+ <p>
+ WikiText provides parsers and editors for managing lightweight markup (wiki text).
+ WikiText integrates with the Mylyn task editor and provides components that may be used
+ within Eclipse or stand-alone.
+ </p>
+ <table cellpadding="10" cellspacing="0" class="category category1"><tr class="item item1"><th align="right" valign="top" width="15%">Markup Editor</th><td align="left" valign="top" width="70%">
+ <p>
+ WikiText provides an integrated source editor for authoring files containing wiki markup.
+ The editor provides content assist, validation, folding, source formatting, an integrated preview,
+ structured outline and a markup cheat-sheet.
+ </p>
+ <img src="images/wikitext-editor.png"/>
+ <p>
+ The WikiText editor is aware of 5 markup languages and is capable of supporting others via the common WikiText parsing framework.
+ The following markup languages are currently recognized.
+ </p>
+ <ul>
+ <li>Confluence</li>
+ <li>MediaWiki</li>
+ <li>Textile</li>
+ <li>TracWiki</li>
+ <li>TWiki</li>
+ </ul>
+ </td></tr><tr><td colspan="2"><hr/></td></tr><tr class="item item0"><th align="right" valign="top" width="15%">Markup Conversion</th><td align="left" valign="top" width="70%">
+ <p>
+ WikiText can convert lightweight markup to other formats including Eclipse Help, HTML, DocBook and DITA. Conversion may be performed
+ within Eclipse or from Ant.
+ </p>
+ <img src="images/wikitext-generate-menu.png"/>
+ <p>
+ The conversion framework is extensible and can support alternative output formats by extending a simple Document Builder API.
+ </p>
+ </td></tr><tr><td colspan="2"><hr/></td></tr><tr class="item item1"><th align="right" valign="top" width="15%">Content Assist</th><td align="left" valign="top" width="70%">
+ <p>
+ Using markup is easy with WikiText in part due to content assist in the editor. Suggestions are provided in the editor when CTRL+Space is pressed,
+ making it easy to insert bold, italics, bulleted lists, headings and other markup.
+ </p>
+ <img src="images/wikitext-content-assist.png"/>
+ </td></tr><tr><td colspan="2"><hr/></td></tr><tr class="item item0"><th align="right" valign="top" width="15%">Cheat Sheet</th><td align="left" valign="top" width="70%">
+ <p>
+ If you forget markup syntax, pressing F1 in the editor will bring up a cheat sheet with markup language tips and syntax hints.
+ </p>
+ <img src="images/wikitext-cheatsheet.png"/>
+ </td></tr><tr><td colspan="2"><hr/></td></tr><tr class="item item1"><th align="right" valign="top" width="15%">Preferences</th><td align="left" valign="top" width="70%">
+ <p>
+ The appearance of the source editor and preview can be altered easily with workspace preferences. CSS is used to specify exactly how you would like
+ the markup to appear. This gives you ultimate control over the appearance of the editor, editor preview and the Mylyn task editor.
+ </p>
+ <img src="images/wikitext-preferences.png"/>
+ </td></tr></table></div></body></html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/new-3.1.xml b/org.eclipse.mylyn.wikitext.help.ui/docs/new/new-3.1.xml
new file mode 100644
index 0000000..4738ef3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/docs/new/new-3.1.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+
+<new caption="New in Mylyn 3.1">
+ <category>
+ <title>WikiText</title>
+ <description>
+ <p>
+ WikiText provides parsers and editors for managing lightweight markup (wiki text).
+ WikiText integrates with the Mylyn task editor and provides components that may be used
+ within Eclipse or stand-alone.
+ </p>
+ </description>
+ <item>
+ <title>Markup Editor</title>
+ <description>
+ <p>
+ WikiText provides an integrated source editor for authoring files containing wiki markup.
+ The editor provides content assist, validation, folding, source formatting, an integrated preview,
+ structured outline and a markup cheat-sheet.
+ </p>
+ <img src="images/wikitext-editor.png"/>
+ <p>
+ The WikiText editor is aware of 5 markup languages and is capable of supporting others via the common WikiText parsing framework.
+ The following markup languages are currently recognized.
+ </p>
+ <ul>
+ <li>Confluence</li>
+ <li>MediaWiki</li>
+ <li>Textile</li>
+ <li>TracWiki</li>
+ <li>TWiki</li>
+ </ul>
+ </description>
+ </item>
+ <item>
+ <title>Markup Conversion</title>
+ <description>
+ <p>
+ WikiText can convert lightweight markup to other formats including Eclipse Help, HTML, DocBook and DITA. Conversion may be performed
+ within Eclipse or from Ant.
+ </p>
+ <img src="images/wikitext-generate-menu.png"/>
+ <p>
+ The conversion framework is extensible and can support alternative output formats by extending a simple Document Builder API.
+ </p>
+ </description>
+ </item>
+ <item>
+ <title>Content Assist</title>
+ <description>
+ <p>
+ Using markup is easy with WikiText in part due to content assist in the editor. Suggestions are provided in the editor when CTRL+Space is pressed,
+ making it easy to insert bold, italics, bulleted lists, headings and other markup.
+ </p>
+ <img src="images/wikitext-content-assist.png"/>
+ </description>
+ </item>
+ <item>
+ <title>Cheat Sheet</title>
+ <description>
+ <p>
+ If you forget markup syntax, pressing F1 in the editor will bring up a cheat sheet with markup language tips and syntax hints.
+ </p>
+ <img src="images/wikitext-cheatsheet.png"/>
+ </description>
+ </item>
+ <item>
+ <title>Preferences</title>
+ <description>
+ <p>
+ The appearance of the source editor and preview can be altered easily with workspace preferences. CSS is used to specify exactly how you would like
+ the markup to appear. This gives you ultimate control over the appearance of the editor, editor preview and the Mylyn task editor.
+ </p>
+ <img src="images/wikitext-preferences.png"/>
+ </description>
+ </item>
+ </category>
+</new>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/docs/new/new.xsl b/org.eclipse.mylyn.wikitext.help.ui/docs/new/new.xsl
new file mode 100644
index 0000000..8989c9b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/docs/new/new.xsl
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fn="http://www.w3.org/2005/xpath-functions"
+ version="2.0">
+
+ <xsl:output method="xml"
+ encoding="ISO-8859-1"
+ indent="no"/>
+
+
+ <xsl:template match="/new">
+ <html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+ <title>New And Noteworthy</title>
+ <style type="text/css">
+img {
+ margin: 5px;
+}
+
+table.category0 th {
+ background-color: #FAF7FB;
+}
+
+table.category1 th {
+ background-color: #E0D0E6;
+}
+
+.newCaption {
+ background-color: rgb(224, 208, 230);
+ font-weight: bold;
+}
+ </style>
+ </head>
+ <body>
+ <div class="mainContent">
+ <p>
+ <span class="newCaption"><xsl:value-of select="@caption"/></span>
+ </p>
+ <ul>
+ <xsl:for-each select="category">
+ <li><a href="#{title}"><xsl:value-of select="title"/> (<xsl:value-of select="count(item)"/>)</a></li>
+ </xsl:for-each>
+ </ul>
+ <xsl:for-each select="category">
+ <h2><a name="{title}"></a><xsl:value-of select="title"/></h2>
+ <xsl:call-template name="CategoryContent"/>
+ <table cellpadding="10" cellspacing="0" class="category category{position() mod 2}">
+ <xsl:for-each select="item">
+ <xsl:if test="position() != 1">
+ <tr>
+ <td colspan="2"><hr/></td>
+ </tr>
+ </xsl:if>
+ <tr class="item item{position() mod 2}">
+ <th align="right" valign="top" width="15%">
+ <xsl:call-template name="ItemTitle"/>
+ </th>
+ <td align="left" valign="top" width="70%">
+ <xsl:call-template name="ItemContent"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template name="CategoryContent">
+ <xsl:for-each select="description">
+ <xsl:copy-of select="child::node()"/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="ItemTitle">
+ <xsl:for-each select="title">
+ <xsl:copy-of select="child::node()"/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="ItemContent">
+ <xsl:for-each select="description">
+ <xsl:copy-of select="child::node()"/>
+ </xsl:for-each>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/.cvsignore b/org.eclipse.mylyn.wikitext.help.ui/help/.cvsignore
new file mode 100644
index 0000000..f67d3cb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/.cvsignore
@@ -0,0 +1,4 @@
+*.html
+*toc.xml
+*.fo
+*.pdf
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/Mylyn WikiText User Guide.textile b/org.eclipse.mylyn.wikitext.help.ui/help/Mylyn WikiText User Guide.textile
new file mode 100644
index 0000000..6765b89
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/Mylyn WikiText User Guide.textile
@@ -0,0 +1,619 @@
+h1. Overview
+
+This guide provides basic instructions on the use of WikiText.
+WikiText provides extensions to the Mylyn task editor supporting "lightweight markup languages":http://en.wikipedia.org/wiki/Lightweight_markup_language such as Textile and MediaWiki. WikiText also provides a wiki text editor for Eclipse and Ant tasks for converting lightweight markup to HTML and other formats.
+
+For information about integrating your application with WikiText please see the *WikiText Developer Guide*.
+
+h2. Table of Contents
+
+{toc}
+
+h1. Getting Started
+
+The WikiText plug-in provides a lightweight markup editor for Eclipse. The editor is registered against all files with the following file extensions: @*.textile@, @*.tracwiki@, @*.mediawiki@, @*.twiki@, @*.confluence@
+
+It's also possible to register the editor with other file extensions by setting the Eclipse preferences under *General -> Other -> File Associations*.
+
+h2. Creating A New File
+
+Using the new file wizard, choose *New -> File*, or *New -> Other... -> General -> File*. In the
+filename field, enter the name of the file with a @.textile@ or other registered extension.
+
+When the new file is created it should open in the WikiText editor. Start typing!!
+
+h2. WikiText Editor Overview
+
+The WikiText editor provides a source view, preview and outline.
+
+!images/editor-overview.png!
+
+The editor has tabs on the bottom that facilitate switching to and from 'Source' and 'Preview'.
+
+!images/editor-tabs.png!
+
+h3. Markup Source Tab
+
+'Source' is the default editor pane. This is the area for editing markup such as Textile. The source pane provides syntax highlighting that should make it easier to see what the markup means.
+
+Standard text editor actions are available here, such as copy/paste and find/replace. Explore the context menu and 'Edit' menu to see what actions are available.
+
+h3. Preview Tab
+
+The editor preview provides a preview of the wiki markup as it is rendered by your default browser after converting the markup to HTML. Though the 'Source' syntax highlighting is pretty good, the preview provides a more accurate view of the rendered result.
+
+h3. Outline
+
+The editor outline provides a structured view of the markup source. Headings in the markup are used to provide a 'Table of Contents'.
+
+!images/editor-outline.png!
+
+Clicking on an item in the outline will show the corresponding header in the source, and navigating in the source will cause the most relevant item in the outline to be selected.
+Clicking on an item in the outline when the preview is showing causes the corresponding item to be revealed.
+
+Items in the outline view can be moved within the document by using the mouse to drag and drop the item to the desired location.
+
+The Outline view can be displayed by selecting *Window -> Show View -> Outline* from the main menu.
+Also see "Quick Outline":#QuickOutline.
+
+h3. Folding
+
+The WikiText editor supports folding regions of text. Regions can be folded or expanded by clicking the folding indicators in the gutter.
+
+!images/editor-folding.png!
+
+Folding is enabled using the context menu in the editor gutter.
+
+!images/editor-folding-menu.png!
+
+h4. Active Folding
+
+Folded regions can be managed by your Mylyn task context. With active folding enabled regions of the document that are not in the task context are folded and regions that are in the task context are expanded. As the task context changes Mylyn will fold and expand regions as needed.
+
+To enable active folding first activate a Mylyn task then toggle the active folding button in the toolbar.
+
+!images/editor-toggle-active-folding.png!
+
+h2. Switching Markup Languages
+
+The WikiText editor supports multiple markup languages. The editor makes a best-guess at the markup language from the file extension. To switch markup languages in the editor invoke the context menu *Markup Languages* and select the language:
+
+!images/editor-switch-language.png!
+
+The editor will remember your selection the next time the same file is opened.
+
+h2. Accessing the Markup Cheat-Sheet
+
+The editor provides a markup 'cheat-sheet'. The cheat-sheet is a quick-reference for markup syntax. To access the cheat-sheet press *F1* in the source view of the editor.
+
+Note that the content of the cheat-sheet will vary according to the markup language being displayed.
+
+!images/editor-cheat-sheet.png!
+
+h2. Project Settings
+
+WikiText project settings may be configured from the project properties dialog.
+
+!images/project-settings.png!
+
+Selecting *Enable validation* causes WikiText to validate wiki markup files in your project. This is done as part of the project build process, so it helps to have automatic building enabled (*Preferences->Workspace->Build Automatically*). Validation is performed on all resources that match a wiki markup file extension. In addition validation includes any files for which the "markup language setting":#SwitchingMarkupLanguages was set even if the file doesn't have a registered wiki markup file extension.
+
+h1. Task Editor Integration
+
+WikiText extends Mylyn to provide a markup-aware task editor. With WikiText installed, Mylyn can render wiki markup as intended, provide markup-specific syntax highlighting, content-assist, validation, and a cheat-sheet for wiki markup syntax.
+
+h2. Repository Configuration
+
+To use the WikiText extension to the Mylyn task editor you may need to configure your Mylyn task repository. To do so, open the Mylyn *Task Repositories* view (*Window -> Show View -> Other... -> Mylyn -> Task Repositories*). Select the repository that you wish to configure and then select *Properties* from the context menu.
+
+!images/repository-settings-task-editor-extension.png!
+
+In the *Editor* section select the markup language of choice. Note that you may need to expand this section to see available choices. To disable WikiText extensions to the Mylyn task editor select *Plain Text*.
+
+Press the *Finish* button when you've finished to make the changes permanent. Note that changes to these settings will only be visible for newly opened task editors. Task editors that were open prior to making the changes will need to be closed and reopened for the settings to take effect.
+
+h2. Task Editor Appearance
+
+The appearance of rendered markup in the task editor can be altered in the Eclipse preferences. Open *Preferences -> General -> Editors -> Text Editors -> WikiText -> Appearance* and alter the appearance using CSS styles. See "Preferences":#Preferences for more details.
+
+h3. Task Editor Fonts
+
+Default fonts for the task editor when using WikiText can be altered in the Eclipse preferences. Open *Preferences -> General -> Appearance -> Colors and Fonts*. Under *Tasks* default fonts may be selected:
+
+* Task Editor - Monospace font
+* Task Editor - Notes and Comments
+
+!images/task-editor-font-preferences.png!
+
+These fonts are used as the baseline before CSS styles are applied. See "Preferences":#Preferences for more details.
+
+h2. Markup for Task Repositories
+
+Many task repositories have direct support for markup built in, such as Trac and JIRA. Others do not, however this does not prevent you from using markup with them.
+
+Most markup languages are designed to be compact and readable in their source form. Early users of the Internet used markup in email and newsgroups without much thought and without the support of tools that alter the apperance of markup by rendering it as HTML.
+
+We recommend using markup with task repositories such as Bugzilla. Markup makes content more readable and Mylyn can make it look good within Eclipse.
+
+It should be noted that some markup languages such as WikiMedia and Textile were originally designed for wikis, not bug reports or task descriptions. Some markup language constructs of these languages are not suitable for use with task repositories, and are altered by WikiText when used with the Mylyn task editor. Below is a list of language features are altered when used with the Mylyn task editor:
+
+*MediaWiki*
+
+* Preformatted text where the line begins with a space character has been disabled to prevent preformatted text where it was not intended.
+* Support for HTML tags has been disabled to allow for pasting HTML source code into bug comments and descriptions.
+
+*Textile*
+
+* Support for HTML tags has been disabled to allow for pasting HTML source code into bug comments and descriptions.
+* Footnote references are preprocessed and only matched if a corresponding footnote exists in the content.
+
+*Other*
+
+The following language constructs are enabled for all markup languages:
+
+* Java stack trace detection
+* Eclipse-specific: content following a line starting with ==-- Error Details --==
+
+
+h3. Markup for Bugzilla
+
+WikiText adds markup language capabilities for common Bugzilla content when used with a Bugzilla repository:
+
+* quoted text where each line begins with a > character:
+!{margin-left:2em;}images/task-editor-bugzilla-quote.png!
+* common phrases generated by Bugzilla:
+!{margin-left:2em;}images/task-editor-bugzilla-text.png!
+
+
+h1. Markup Conversion
+
+Lightweight markup is designed to be readily converted to HTML. WikiText provides a means to convert markup to:
+
+* HTML
+* "DocBook":http://www.docbook.org
+* "OASIS DITA":http://dita.xml.org
+* Eclipse help format (HTML and @toc.xml@)
+* "XSL-FO":http://en.wikipedia.org/wiki/XSL_Formatting_Objects
+
+h2. Conversion In Eclipse
+
+These conversions can be made by right-clicking any @*.textile@, @*.tracwiki@, @*.mediawiki@, @*.twiki@, or @*.confluence@ resource in the Eclipse UI:
+
+!images/resource-conversion-menu.png!
+
+Performing a conversion from the UI will cause corresponding files (@*.xml@, @*.html@, @*-toc.xml@) to be created in the same folder as the selected file(s).
+
+More control over the conversion process can be achieved by using Ant build scripts (described below).
+
+h2. Conversion using Ant build scripts
+
+"Ant":http://www.apache.org build scripts may also be used to drive a markup conversion. The following is an example of how to drive conversion from Textile markup to Eclipse help format (to HTML and toc.xml):
+
+bc..
+ <property name="wikitext.standalone" value=""/><!-- path to wikitext standalone package -->
+
+ <path id="wikitext.classpath">
+ <fileset dir="${wikitext.standalone}">
+ <include name="org.eclipse.mylyn.wikitext.*core*.jar"/>
+ </fileset>
+ </path>
+
+ <taskdef classpathref="wikitext.classpath" resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties" />
+
+ <target name="generate-help" depends="init" description="Generate Eclipse help from textile source">
+ <wikitext-to-eclipse-help markupLanguage="Textile"
+ multipleOutputFiles="true"
+ navigationImages="true"
+ helpPrefix="help">
+ <fileset dir="${basedir}">
+ <include name="help/*.textile"/>
+ </fileset>
+ <stylesheet url="styles/help.css"/>
+ <stylesheet url="styles/main.css"/>
+ </wikitext-to-eclipse-help>
+ </target>
+
+p. Similar Ant scripts can be used to convert to HTML:
+
+bc.
+ <target name="generate-html" depends="init" description="Generate HTML from textile source">
+ <wikitext-to-html markupLanguage="Textile">
+ <fileset dir="${basedir}">
+ <include name="help/*.textile"/>
+ </fileset>
+ <stylesheet url="styles/main.css"/>
+ </wikitext-to-html>
+ </target>
+
+Conversion using Ant is used by the WikiText project to create help content. We find that writing help content in Textile markup is much easier than writing DocBook or HTML.
+
+The @<stylesheet>@ entries in the above examples are optional; these cause an HTML link to one or more stylesheets to be added to the head of the generated HTML document.
+
+The @markupLanguage@ attribute accepts any of the following values (depending on your classpath):
+
+* @Textile@
+* @MediaWiki@
+* @TracWiki@
+* @TWiki@
+* @Confluence@
+* A fully-qualified class name of a class that extends @org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage@
+
+
+*common task options*
+
+|_. Option |_. Usage |
+| @markupLanguage@ | The markup language to use, for example 'Textile', 'Confluence', 'MediaWiki', 'TracWiki', 'TWiki'. |
+| @validate@ | Indicate if the input file should be validated. Default is @true at . |
+| @failOnValidationError@ | Indicate if validation errors should cause a build failure. @true@ or @false@, default is true. |
+| @failOnValidationWarning@ | Indicate if validation warnings should cause a build failure. @true@ or @false@, default is false. |
+| @overwrite@ | Indicate if target files should be overwritten even if the target document is newer than the source document. @true@ or @false@, default is false. |
+| @sourceEncoding@ | Indicate source file encoding. Example: @UTF-8 at . Defaults to the platform default encoding as defined by @java.nio.charset.Charset.defaultCharset()@. See the "IANA Charset Registry":http://www.iana.org/assignments/character-sets for valid charset names. |
+
+*wikitext-to-html and wikitext-to-eclipse-help task options*
+
+|_. Option |_. Usage |
+| @title@ | Specify the title of the output document. If unspecified, the title is the filename (without extension). |
+| @file@ | The source file. Not required if a fileset is specified. |
+| @linkRel@ | The 'rel' value for HTML links. If specified the value is applied to all generated links. The default value is null. |
+| @multipleOutputFiles@ | Indicate if output should be generated to multiple output files (true/false). Default is false. |
+| @formatOutput@ | Indicate if the output should be formatted (true/false). Default is false. |
+| @navigationImages@ | Indicate if navigation links should be images (true/false). Only applicable for multi-file output. Default is false. |
+| @prependImagePrefix@ | If specified, the prefix is prepended to relative image urls. |
+| @overwrite@ | Indicate if output files should be overwritten. The default is false. When false output files are only overwritten if the output file timestamp is older than the markup source file. |
+| @helpPrefix@ | The prefix to URLs in the toc.xml, typically the relative path from the plugin to the help files (wikitext-to-eclipse-help only). For example, if the help file is in 'help/index.html' then the help prefix would be 'help' |
+| @defaultAbsoluteLinkTarget@ | Specify that hyperlinks to external resources (@<a href@) should use a @target@ attribute to cause them to be opened in a seperate window or tab. The value specified becomes the value of the @target@ attribute on anchors where the href is an absolute URL. |
+
+*stylesheet*
+
+Nested @<stylesheet>@ elements cause HTML to contain links to CSS stylesheets or CSS stylesheet content. When used with the @url@ attribute the stylesheet element is linked. When used with the @file@ attribute the stylesheet content is copied into the HTML document.
+
+Stylesheets may have nested @<attribute>@ elements with @name@ and @value at . These attributes are copied verbatim to the HTML @<link>@ element. Attributes named @type@, @rel@ and @href@ are ignored.
+
+h3. PDF and XSLFO
+
+WikiText can convert wiki markup to "XSL-FO":http://en.wikipedia.org/wiki/XSL_Formatting_Objects. PDF is readily obtained from XSL-FO by using an FO processor such as the excellent "Apache FOP":http://xmlgraphics.apache.org/fop project.
+
+bc.
+ <wikitext-to-xslfo markupLanguage="Textile">
+ <fileset dir="help" includes="**/*.textile"/>
+ </wikitext-to-xslfo>
+
+WikiText conversion to XSL-FO is performed using the @wikitext-to-xslfo@ task. In addition to common options listed above, the following options are available:
+
+*wikitext-to-xslfo task options*
+
+|_. Option |_. Usage |
+| @targetdir@ | Specify a folder in which output files should be created. |
+| @title@ | Specify a specific book title. If unspecified, the book title is the filename of the source file (without extension). |
+| @subTitle@ | Specify a sub-title to appear under the book title. |
+| @fontSize@ | Specify the default font size. The default is 10.0 |
+| @showExternalLinks@ | Indicate if external link URLs should be emitted in the text. The default is true. |
+| @underlineLinks@ | Indicate if links should be underlined. The default is false. |
+| @pageBreakOnHeading1@ | Indicate if h1 headings should start a new page. The default is true. |
+| @panelText@ | Indicate if the text 'Note: ', 'Tip: ', and 'Warning: ' should be added to blocks of type note, tip and warning respectively. |
+| @version@ | A document version to emit on the title page, for example: 'Version 1.0.23' |
+| @date@ | A date to emit on the title page. |
+| @author@ | An author to emit on the title page. |
+| @copyright@ | A copyright to emit in the document page footer. |
+| @pageNumbering@ | Indicate if pages should be numbered. The default is true. |
+| @pageMargin@ | The page margin in cm. Defaults to 1.5. |
+| @pageHeight@ | The page height in cm. Defaults to A4 sizing (29.7) |
+| @pageWidth@ | The page width in cm. Defaults to A4 sizing (21.0) |
+
+h4. PDF from XSL-FO Quick-Start
+
+To convert the XSL-FO output files to PDF using the "Apache FOP":http://xmlgraphics.apache.org/fop project, add the following to your Ant script:
+
+bc.
+ <property name="fop.home" value="/full/system/path/to/fop-0.95"/>
+ <exec command="${fop.home}/fop">
+ <arg value="${basedir}/help/MyFile.fo"/>
+ <arg value="${basedir}/help/MyFile.pdf"/>
+ </exec>
+
+Refer to the Apache FOP documentation for more details.
+
+h3. DocBook
+
+WikiText can convert markup to "DocBook":http://www.docbook.org
+
+bc.
+ <wikitext-to-docbook markupLanguage="Textile">
+ <fileset dir="${textile.root.dir}">
+ <include name="**/*.textile"/>
+ </fileset>
+ </wikitext-to-docbook>
+
+You can use WikiText first to convert your Textile markup to "DocBook":http://www.docbook.org then use the "DocBook XSL stylesheets":http://docbook.sourceforge.net/ to convert the DocBook to Eclpse help content, HTML, pdf or other formats. For more information on using the DocBook XSL stylesheets please refer to the "DocBook XSL project":http://docbook.sourceforge.net/
+
+*wikitext-to-docbook task options*
+
+|_. Option |_. Usage |
+| @bookTitle@ | Specify a specific book title. If unspecified, the book title is the filename of the source file (without extension). |
+| @overwrite@ | @true@ or @false@, default is true. Indicate if existing target files should be overwritten even if they are newer than the source file. |
+| @file@ | The source file. Not required if a fileset is specified. |
+| @doctype@ | Overrides the DTD doctype to use in the output file. Optional. |
+
+h3. DITA
+
+WikiText can convert markup to "OASIS DITA":http://dita.xml.org. The conversion can either be used to convert a single input file to a bookmap and multiple topics, or to a single topic.
+
+WikiText conversion to DITA is performed using the @wikitext-to-dita@ task. In addition to common options listed above, the following options are available:
+
+*wikitext-to-dita task options*
+
+|_. Option |_. Usage |
+| @bookTitle@ | Specify a specific book title. If unspecified, the book title is the filename of the source file (without extension). |
+| @overwrite@ | @true@ or @false@, default is true. Indicate if existing target files should be overwritten even if they are newer than the source file. |
+| @file@ | the source file. Optional, not required if a fileset is specified. |
+| @doctype@ | Overrides the DTD doctype to use in the target bookmap. Optional. |
+| @topicDoctype@ | Overrides the DTD doctype to use in the target topic files. Optional. |
+| @topicFolder@ | The relative folder name to use for topic files when producing multiple output files. Optional, defaults to 'topics'. |
+| @topicStrategy@ | Specify how multiple output files are generated. Optional, defaults to 'FIRST'. Must be one of 'FIRST', 'LEVEL1' or 'NONE'. 'FIRST' indicates that multiple topic files are to be created, split at the level of the first heading encountered in the file. 'LEVEL1' indicates that multiple topic files are to be created, split one file for each level-1 heading encountered. 'NONE' indicates that multiple topic files are not to be created. Only a single topic file is created, with no bookmap. |
+
+h4. wikitext-to-dita - Multiple Files Example
+
+To convert an input file to a bookmap and multiple topics, use the following:
+
+bc.
+ <wikitext-to-dita markupLanguage="Textile">
+ <fileset dir="help" includes="**/*.textile"/>
+ </wikitext-to-dita>
+
+The output is created as multiple files: a bookmap and multiple topics, one topic for every level-1 heading.
+
+h4. wikitext-to-dita - Single Output File Example
+
+To convert an input file to a single output file, use the following:
+
+bc.
+ <wikitext-to-dita markupLanguage="Textile"
+ topicStrategy="NONE">
+ <fileset dir="help" includes="**/*.textile"/>
+ </wikitext-to-dita>
+
+h2. Ant Examples
+
+See "the examples":examples for example Ant build scripts.
+
+h2. Markup Language Customization
+
+Mylyn WikiText provides a means of customizing wiki markup languages for use with Ant tasks. This is useful for altering the markup language to include specialized markup rules specific to your needs.
+
+To customize a markup language you may either extend a markup language using subclassing, or you may provide a @MarkupLanguageConfiguration at . The best option will vary depending on your needs. @MarkupLanguageConfiguration@ provides a means of altering a markup language without subclassing the language itself, which makes it reusable with different markup languages.
+
+Following is an example of providing a @MarkupLanguageConfiguration@ configuration:
+
+pre..
+<taskdef resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties" classpathref="wikitext.ant.classpath"/>
+<typedef name="languageConfiguration" classname="org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration" classpathref="wikitext.ant.classpath"/>
+
+<wikitext-to-eclipse-help markupLanguage="org.eclipse.mylyn.wikitext.textile.core.TextileLanguage" ...>
+ <languageConfiguration escapingHtmlAndXml="true"/>
+</wikitext-to-eclipse-help>
+
+p. See the *Mylyn WikiText Developer Guide* for details on extending a markup language via subclassing.
+
+h1. Textile Syntax
+
+The WikiText editor supports most standard Textile markup. In addition some markup extensions are supported. See the markup 'cheat-sheet' for details (press *F1* in the editor).
+
+h2. Textile Syntax Tips
+
+h3. Whitespace
+
+Textile markup is sensitive to whitespace. For example, a line that starts with '@{color:blue;}h1.@' is only a heading if the '@{color:blue;}h1.@' is immediately followed by a space character. This can bite you if you're not careful!
+
+A less obvious example of the same problem is with '@{color:blue;}bc.@' Usually content in a 'block code' section is on the line following the '@{color:blue;}bc.@' If the '@{color:blue;}bc.@' is not immediately followed by a space character _before the end of the line_, then the area is simply considered a normal paragraph.
+
+h3. HTML Literals
+
+Textile markup can handle literal HTML. For example, the following is valid Textile:
+
+bc.
+some <b>bold text</b> here
+
+Care must be taken with literal HTML: the start tag must be completed on one line, and the end tag must be completed on one line. The following is an example of embedded HTML that won't work with Textile:
+
+bc.
+here is <a
+href="#">a bad example</a>
+
+The above example can be fixed by moving the @href@ up on to the same line as the @<a@ portion:
+
+bc.
+here is <a href="#">a working example</a>
+
+h3. Images and DocBook
+
+DocBook is quite flexible about how images are handled. This section discusses how DocBook rendering can be altered with the use of specific markup.
+
+h4. Inline Images v.s. Block Images
+
+When handling images in a conversion of Textile markup to DocBook markup, there are several choices for the resulting DocBook markup. By default images are converted as follows:
+
+bc.
+!images/foo.png!
+
+results in:
+
+bc.
+<mediaobject><imageobject><imagedata fileref="images/foo.png"/></imageobject></mediaobject>
+
+@<mediaobject/>@ is useful for some cases, however there are times when @<inlinemediaobject/>@ should be used instead. To achieve this result, add the @inline@ class to your image as follows:
+
+bc.
+!(inline)images/foo.png!
+
+The conversion will then result in the following:
+
+bc.
+<inlinemediaobject><imageobject><imagedata fileref="images/foo.png"/></imageobject></inlinemediaobject>
+
+h4. Image Scaling
+
+DocBook supports image scaling with the @scale@ attribute. For example:
+
+bc.
+<imagedata fileref="images/foo.png" scale=80"/>
+
+To achieve this effect with Textile markup use syntax as follows:
+
+bc.
+!{width=80%}images/foo.png!
+
+More information about image scaling in DocBook is available at "imagedata: Scaling":http://www.docbook.org/tdg/en/html/imagedata-x.html.
+
+h4. Image Size
+
+Image size can be specified in DocBook using @width@ and @depth@ attributes for width and height, respectively:
+
+bc.
+<imagedata fileref="images/foo.png" width="32px" height="64px"/>
+
+This is achieved with Textile markup as follows:
+
+bc.
+!{width=32px;height=64px}images/foo.png!
+
+h3. Extended Blocks
+
+Textile extended blocks (starting with @bc..@, @pre..@ and @bq..@) are useful for blocks that may have multiple whitespace lines. Extended blocks must be terminated by an explicit Textile block (such as @p.@). For example:
+
+bc..
+ bc..
+ a block code section has started
+
+ and continues
+
+ p. a paragraph starts
+
+h2. Examples
+
+This document was written in Textile markup. The original source code for this document "is available here":http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.mylyn/org.eclipse.mylyn.wikitext.ui/help/Mylyn%20WikiText%20User%20Guide.textile?root=Tools_Project&view=markup
+
+h2. Textile Reference
+
+Textile syntax and references can be found here:
+
+* "Textile (markup language)":http://en.wikipedia.org/wiki/Textile_%28markup_language%29 (wikipedia.org)
+* "The Textile Reference Manual":http://thresholdstate.com/articles/4312/the-textile-reference-manual (thresholdstate.com)
+* "Textile":http://textile.thresholdstate.com/ an online form for trying out Textile syntax (thresholdstate.com)
+* "Textile Reference":http://hobix.com/textile/ an example-based Textile reference (hobix.com)
+
+h1. Tips and Tricks
+
+h2. Hot-Keys
+
+To get a pop-up showing the list of available hot-keys and commands, press *CTRL+SHIFT+l* (or *COMMAND+SHIFT+l* on a mac)
+
+!images/editor-command-help.png!
+
+h2. Word Completion
+
+Word completion is available from within the Textile editor. Press *CTRL+.* (that is CTRL + '.', the dot character) repeatedly to see available completions from the current cursor position.
+
+Word completion is based on the "Hippie":http://www.xemacs.org/Documentation/packages/html/edit-utils_23.html algorithm, which finds existing words in the editing context and uses them to create completion proposals.
+
+h2. Spelling
+
+Spell checking is enabled by default in the Textile editor. Pressing *CTRL+1* on a spelling issue will provide options for dealing with the spelling problem.
+
+!images/editor-spelling.png!
+
+h2. Content Assist
+
+Content assist is available by pressing *CTRL+SPACE*. Content assist will make suggestions based on the cursor position. If only one proposal is available at the cursor position, the content will be filled in automatically, otherwise a list of proposals is shown.
+
+Continued typing while the proposals are displayed will narrow the list of available choices. A selection can be made with the mouse, or by using the up/down arrows and the enter key.
+
+!images/editor-assist-proposals.png!
+
+Suggestions include markup language syntax, document-internal anchor names and "word suggestions":#WordCompletion.
+
+h3. Template-Based Content Assist
+
+Content assist may also make proposals involving templates with variables.
+
+!images/editor-assist-template-proposal-selection.png!
+
+When such a proposal is selected the variables are displayed with a surrounding box. Typing replaces the variable content, the *TAB* key advances to the next variable position, and the *ENTER* or *ESC* keys complete the template editing session. The vertical line displayed at the end of the template shows where the cursor will be located when finished.
+
+!images/editor-assist-template-proposal.png!
+
+Note that while editing a template the standard undo/redo functionality is still available to you.
+
+h3. Selection and Content Assist
+
+Content assist may be invoked with selected text. To do so, select text using the mouse or keyboard, and then press *CTRL+SPACE*. Content assist is activated with the current selection.
+
+Selecting a template-based content proposal will cause the selected text to be included in the template. The following shows a selection and content assist proposals before selecting a proposal:
+
+!images/editor-assist-selection-proposal.png!
+
+The following shows the same text after selecting a proposal:
+
+!images/editor-assist-selection-proposal-completed.png!
+
+The selected text in this case is wrapped in '*' characters for the 'strong' Textile markup.
+
+h2. Quick Outline
+
+A quick outline can be accessed by pressing *CTRL+O* in the editor (*Command+O* on a mac). The quick outline provides a structured view of the markup source much the same as the "Outline view":#Outline except that it's displayed right in the editor. A quick outline is useful when the Outline view is not visible and may also be used within the "task editor":#TaskEditorIntegration.
+
+!images/editor-quick-outline.png!
+
+Clicking on an item in the outline will show the corresponding header in the source.
+
+Also see "Outline":#Outline.
+
+h1. Preferences
+
+WikiText editor preferences may be configured via the Eclipse preferences dialog.
+
+h2. Editor Preferences
+
+CSS styles are used to modify the markup syntax highlighting in the editor:
+
+!images/editor-preferences.png!
+
+The following CSS styles are recognized:
+
+| @color@ | named or rgb(r,g,b) |
+| @background-color@ | named or rgb(r,g,b) |
+| @font-family@ | monospace, courier, courier new |
+| @font-style@ | italic, bold, normal |
+| @font-weight@ | bold, bolder, normal, lighter |
+| @font-size@ | percentage, named size, or absolute size (pt or px) |
+| @text-decoration@ | none, line-through, underline |
+| @vertical-align@ | super, sub |
+
+h2. Rendering Appearance
+
+CSS styles are also used to modify the appearance of rendered markup, both in the text editor preview and in the Mylyn task editor:
+
+!images/editor-preferences-appearance.png!
+
+See "Editor Preferences":#EditorPreferences for a list of supported styles.
+
+h1. More Information
+
+More information about WikiText can be found here:
+
+* "Mylyn Homepage":http://www.eclipse.org/mylyn
+* "Mylyn WikiText FAQ":http://wiki.eclipse.org/Mylyn/FAQ#WikiText
+* "Mylyn WikiText wiki":http://wiki.eclipse.org/Mylyn/WikiText
+
+Also see these articles:
+
+* "Rich Editing for Tasks via Mylyn WikiText":http://tasktop.com/blog/eclipse/rich-editing-for-tasks-via-mylyn-wikitext by Mik Kersten
+* "Getting started with WikiText":http://www.peterfriese.de/getting-started-with-wikitext/ by Peter Friese
+* "Advanced WikiText":http://www.peterfriese.de/advanced-wikitext/ by Peter Friese
+* "Mylyn WikiText Produces PDF":http://greensopinion.blogspot.com/2009/04/mylyn-wikitext-produces-pdf.html by David Green
+
+h2. Feedback
+
+We're interested in any feedback that you might have. For patches, enhancement requests, bugs: "post an issue":https://bugs.eclipse.org/bugs under under Tools/Mylyn/WikiText.
+
+p{font-style: italic;}. Copyright (c) 2008, 2009 David Green 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":http://www.eclipse.org/legal/epl-v10.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/book.css b/org.eclipse.mylyn.wikitext.help.ui/help/book.css
new file mode 100644
index 0000000..fef2a51
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/book.css
@@ -0,0 +1,9 @@
+ at import "../../PRODUCT_PLUGIN/book.css";
+
+pre {
+ font-size: 100%;
+}
+
+code {
+ font-size: 100%;
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/.cvsignore b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/.cvsignore
new file mode 100644
index 0000000..adb75fe
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/.cvsignore
@@ -0,0 +1,4 @@
+*.html
+*-toc.xml
+*.fo
+*.pdf
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/WikiText Developer Guide.textile b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/WikiText Developer Guide.textile
new file mode 100644
index 0000000..1f2813d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/WikiText Developer Guide.textile
@@ -0,0 +1,259 @@
+h1. Overview
+
+This document provides detailed information for software developers that wish to include or use WikiText as part of their application.
+
+For information about using WikiText please see the *WikiText User Guide*.
+
+h2. WikiText API
+
+WikiText follows Eclipse conventions with respect to package naming. Classes that appear in packages with @internal@ in their name are not intended for use externally.
+
+Most API classes have good javadoc. When using WikiText classes, expect them to behave according to their javadoc. If you find somewhere where the javadoc is not clear, please "file a bug":#IssueTracking.
+
+h2. How It Works
+
+The markup parser uses regular expressions to parse wiki markup, converting the markup to XHTML or other outputs depending on the configured @DocumentBuilder at . See also "Markup Language Concepts":#MarkupLanguageConcepts
+
+h3. JFace Viewer
+
+The WikiText JFace viewer extends the standard JFace source viewer. The WikiText JFace viewer uses the markup parser to convert the text to XHTML. It then parses the XHTML and converts it to a standard unicode character sequence and a TextPresentation. It uses standard JFace techniques to apply styles to the rendered text and uses unicode character features such as newlines, tabs and bullet characters to make the text look as it is intended.
+
+As the wiki markup is converted to text with a TextPresentation an AnnotationModel is (optionally) constructed, such that the text viewer has access to annotations for the following:
+
+* Tags with id (from @<p id="some-id">@)
+* Anchor href (from @<a href="http://www.foo-bar.com">@)
+* Anchor name (from @<a name="foo-bar">@)
+* CSS classes
+* Titles (from @<acronym title="some title">@)
+
+The viewer can then present pop-ups (tool-tip hover information, for example), and handle in-document and out-of-document hyperlinks.
+
+The viewer implementation has the benefit of being lightweight compared to a browser and it supports standard viewer features such as text selection and clipboard copy.
+
+h4. JFace Viewer Limitations
+
+The following limitations apply to the JFace text-only markup rendering viewer. The limitations can be avoided by using the SWT Browser widget instead.
+
+Since the viewer is a text-only rendering solution for markup it cannot display advanced markup constructs such as tables. Images can be displayed due to WikiText's custom painting.
+
+The viewer is also generally only useful for read-only usage, since the viewer does not maintain a mapping back to the original markup.
+
+Anchors (ie: hyperlinks) within the page are implemented. If you use footnotes, clicking on the footnote anchor will scroll the viewer to display the footnote text at the bottom.
+
+h2. Classpath and Dependencies
+
+WikiText is designed for use both within an Eclipse runtime, and stand-alone.
+
+h3. Within Eclipse
+
+WikiText use within an Eclipse runtime is simple: simply add the desired WikiText bundles as dependencies to your plug-in project. This is the recommended approach for Eclipse plug-ins and for RCP applications.
+
+h3. Stand-Alone
+
+Stand-alone usage of WikiText is also possible. To use WikiText outside of an Eclipse runtime, simply add the WikiText jar files to your classpath. Note that stand-alone usage of WikiText is limited to the use of the markup parser framework and Ant tasks.
+
+Add the @org.eclipse.mylyn.wikitext.core*.jar@ to your classpath, and at least one the following language-specific jars:
+
+* @org.eclipse.mylyn.wikitext.confluence.core*.jar@
+* @org.eclipse.mylyn.wikitext.mediawiki.core*.jar@
+* @org.eclipse.mylyn.wikitext.textile.core*.jar@
+* @org.eclipse.mylyn.wikitext.tracwiki.core*.jar@
+* @org.eclipse.mylyn.wikitext.twiki.core*.jar@
+
+h1. Using The WikiText Parser
+
+WikiText provides a parser framework for parsing lightweight markup languages (wiki markup). The parser framework can output HTML, DITA, DocBook, and Eclipse Help directly, or integrators can extend @DocumentBuilder@ to output other formats.
+
+h2. Simple Example
+
+To convert Textile wiki markup to HTML:
+
+bc.
+MarkupParser markupParser = new MarkupParser();
+markupParser.setMarkupLanaguage(new TextileLanguage());
+String htmlContent = markupParser.parseToHtml(markupContent);
+
+To convert MediaWiki wiki markup to HTML:
+
+bc.
+MarkupParser markupParser = new MarkupParser();
+markupParser.setMarkupLanaguage(new MediaWikiLanguage());
+String htmlContent = markupParser.parseToHtml(markupContent);
+
+h3. ServiceLocator
+
+Your code may need to handle multiple markup languages or you may wish to eliminate compile-time dependencies on a specific markup language. The @ServiceLocator@ can obtain markup languages by name:
+
+bc.
+ServiceLocator.getInstance().getMarkupLanguage("Textile")
+
+Other markup languages can be obtained by changing @"Textile"@ to another markup language name. Valid markup language names include:
+
+* Confluence
+* MediaWiki
+* Textile
+* TracWiki
+* TWiki
+
+h2. Advanced Parser Usage
+
+The @MarkupParser@ emits content to a @DocumentBuilder@ in order to create HTML or other output. To control the output more closely instantiate the @DocumentBuilder@ of choice and configure it before it is used.
+
+In this example the @HtmlDocumentBuilder@ is configured to avoid creating the @<html>@ and @<body>@ tags:
+
+bc..
+StringWriter writer = new StringWriter();
+
+HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer);
+// avoid the <html> and <body> tags
+builder.setEmitAsDocument(false);
+
+MarkupParser parser = new MarkupParser(new TextileLanguage());
+parser.setBuilder(builder);
+parser.parse(markupContent);
+
+String htmlContent = writer.toString();
+
+h2. Adding CSS to HTML Output
+
+CSS stylesheets can be embedded directly or referenced within your HTML:
+
+bc..
+HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer);
+
+// Add a CSS stylesheet as <link type="text/css" rel="stylesheet" href="styles/test.css"/>
+builder.addCssStylesheet("styles/test.css");
+
+// Add a CSS stylesheet as <style type="text/css">
+builder.addCssStylesheet(new File("/path/to/file.css"));
+
+h1. WikiText and the UI
+
+WikiText can be used to integrate wiki markup capabilities into your application user interface.
+
+h2. WikiText JFace Viewer
+
+WikiText provides a JFace @SourceViewer@ for displaying wiki markup without having to use a @Browser@ widget.
+
+bc..
+MarkupViewer viewer = new MarkupViewer(parent, null, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+viewer.setMarkupLanguage(markupLanguage);
+
+MarkupViewerConfiguration configuration = new MarkupViewerConfiguration(viewer);
+viewer.configure(configuration);
+viewer.getTextWidget().setEditable(false);
+viewer.setMarkup(markup);
+
+h2. WikiText and Browser
+
+WikiText can be used to display wiki markup in an SWT @Browser@ widget:
+
+bc..
+Browser browser = new Browser(parent, SWT.NONE);
+
+MarkupParser markupParser = new MarkupParser();
+markupParser.setMarkupLanaguage(new TextileLanguage());
+String htmlContent = markupParser.parseToHtml(markupContent);
+
+browser.setText(htmlContent);
+
+h1. Markup Languages
+
+Markup languages are the core concept that WikiText uses to define a parser for specific wiki markup. WikiText provides facilities for adding new markup languages or extending an existing one. All markup languages in WikiText extend the @org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage@ class.
+
+h2. Extending an Existing Markup Language
+
+You may wish to augment an existing markup language syntax with your own extensions. With WikiText this is possible by subclassing an existing markup language.
+
+MarkupLanguages that extend others may declare this hierarchy in the @org.eclipse.mylyn.wikitext.core.markupLanguage@ extension point by using the @extends@ attribute. Declaring the hierarchy is optional, and allows for the markup language to inherit code completion, validation and help content from the markup language being extended.
+
+h2. New Markup Languages
+
+WikiText is designed to be extended to support new markup languages. To add a markup language take the following steps:
+
+# Extend @org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage@ using one of the existing subclasses as an example
+# Add to your markup language class the blocks, phrases and replacement tokens that are to be part of your language (see "Markup Language Concepts":#MarkupLanguageConcepts below)
+# Add to your jar a Java service @META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage@
+# If it's to be used in Eclipse, register your markup language using the @org.eclipse.mylyn.wikitext.core.markupLanguage@ extension point. Other extension points that may be of interest to you:
+** @org.eclipse.core.contenttype.contentTypes@ declare your markup language content type
+** @org.eclipse.team.core.fileTypes@ ensure that team providers know that your file type is text
+** @org.eclipse.mylyn.wikitext.core.markupValidationRule@ provide markup validation to detect common problems in markup
+
+You're most likely to be successful if you use one of the existing WikiText markup language plug-ins as an example. A good starting point is the @org.eclipse.mylyn.wikitext.textile.core@ plug-in.
+
+If you plan to implement a markup language then you should be familiar with "Markup Language Concepts":#MarkupLanguageConcepts.
+
+h2. Markup Language UI
+
+To have a full featured UI for your markup language in Eclipse there are several additional extension points to be aware of:
+
+* @org.eclipse.mylyn.wikitext.ui.cheatSheet@ a way of associating help content for your markup language
+* @org.eclipse.mylyn.wikitext.ui.contentAssist@ a means of having content-assist for your markup language
+* @org.eclipse.mylyn.tasks.ui.taskEditorExtensions@ make your markup language contribute to the Mylyn task editor
+
+For more information on these and other UI functions, take a look at the @org.eclipse.mylyn.wikitext.textile.ui@ plug-in.
+
+h2(#MarkupLanguageConcepts). Markup Language Concepts
+
+Every @MarkupLanguage@ declares its syntax in terms of blocks, phrases, and replacement tokens. Though it is possible to create a markup language implementation that doesn't use these concepts, these are the building blocks of all markup languages implemented within WikiText.
+
+Take for example the following Textile markup:
+
+!images/markup-plain.png!
+
+*Block*
+
+A block is a multi-line region of text. Blocks are a way of 'chunking' a document, and loosely correspond to HTML concepts such as div, paragraph, list item, table cell, etc.
+
+The example is composed of two blocks:
+
+!images/markup-blocks.png!
+
+Though blocks may start and end anywhere on a line, they usually start at the beginning of one line and end with a line delimiter. Blocks must not overlap with other blocks and in most cases do not nest within one another.
+
+*Phrase*
+
+A phrase is a single-line region of text. Phrases are often used to apply styles such as underline or bold to a region of text. Phrases are analogous to an HTML span.
+
+The example shows phrases:
+
+!images/markup-phrases.png!
+
+Phrases may not overlap but may be nested. Phrases must start and end on the same line. Phrases cannot span a block boundary.
+
+*Replacement Token*
+
+Replacement tokens are regions of text that are replaced with a corresponding element. For example, tokens may replace things such as '==(c)==' with (c). Replacement tokens can also be used to replace regions of text with the same text but semantic meaning, such as a hyperlink.
+
+The example has replacement tokens:
+
+!images/markup-tokens.png!
+
+Replacement tokens cannot span a phrase or block boundary. Replacement tokens cannot be nested and must start and end on the same line.
+
+h3. Markup Language Implementation Tips
+
+# The order that blocks, phrases and replacement tokens are declared by your markup language affect the markup syntax.
+# When implementing a markup language, always ensure that there's one 'catch-all' block, usually the paragraph block. It should be last in the list of blocks declared by your language.
+# Make extensive use of brief test cases that test for markup language syntax. WikiText has over 430 JUnit tests which we've found to be invaluable in verifying the expected behavior. Take a look at @TextileLanguageTest@ for an example of how to write tests for your markup language.
+# If in doubt, always use an existing WikiText markup language as an example.
+# Feel free to post questions to the Mylyn newsgroup.
+
+h1. Contributing
+
+WikiText is evolving as a direct result of user contributions. Please feel free to contribute by
+
+* posting a bug
+* submitting a patch
+
+All bugs and patches are tracked via Bugzilla. See "Issue Tracking":#IssueTracking below for more details.
+
+For more information about contributing please see the "Mylyn Contributor Reference":http://wiki.eclipse.org/index.php/Mylyn/Contributor_Reference.
+
+h2(#IssueTracking). Issue Tracking
+
+Issues are tracked in "Eclipse Bugzilla":https://bugs.eclipse.org/bugs/ under the *Mylyn* project, *WikiText* component. Please feel free to submit bugs, enhancement requests and patches.
+
+
+p{font-style: italic;}. Copyright (c) 2008, 2009 David Green 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":http://www.eclipse.org/legal/epl-v10.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/book.css b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/book.css
new file mode 100644
index 0000000..921af8b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/book.css
@@ -0,0 +1,9 @@
+ at import "../../../PRODUCT_PLUGIN/book.css";
+
+pre {
+ font-size: 100%;
+}
+
+code {
+ font-size: 100%;
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/home.gif b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/home.gif
new file mode 100644
index 0000000..4472e8c
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/home.gif differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-blocks.png b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-blocks.png
new file mode 100644
index 0000000..f581f3b
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-blocks.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-phrases.png b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-phrases.png
new file mode 100644
index 0000000..86a7d57
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-phrases.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-plain.png b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-plain.png
new file mode 100644
index 0000000..626c4ef
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-plain.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-tokens.png b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-tokens.png
new file mode 100644
index 0000000..cd29b82
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/markup-tokens.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/next.gif b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/next.gif
new file mode 100644
index 0000000..e2f8c3e
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/next.gif differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/prev.gif b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/prev.gif
new file mode 100644
index 0000000..4fb4150
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/devguide/images/prev.gif differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/examples/build-wikitext-to-dita.xml b/org.eclipse.mylyn.wikitext.help.ui/help/examples/build-wikitext-to-dita.xml
new file mode 100644
index 0000000..b10b6e7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/examples/build-wikitext-to-dita.xml
@@ -0,0 +1,54 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<!--
+ A sample Ant buildfile that converts Textile source files into DITA topics
+-->
+<project name="org.eclipse.mylyn.wikitext.core.examples.dita" default="all">
+
+ <!--
+ set these properties to reflect your configuration
+
+ wikitext.standalone.dir - the folder containing the wikitext jars
+ content.source - the folder containing markup files to be converted
+ content.source.language - the expected markup language, for example 'Textile' or 'MediaWiki'
+ content.source.includes - the filename pattern to match source files to be converted
+ -->
+ <property name="wikitext.standalone.dir" value="${basedir}/../.."/>
+ <property name="content.source" value="content-src"/>
+ <property name="content.source.language" value="Textile"/>
+ <property name="content.source.includes" value="**/*.textile"/>
+
+ <taskdef resource="org/eclipse/mylyn/wikitext/core/util/anttask/tasks.properties">
+ <classpath>
+ <fileset dir="${wikitext.standalone.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ </classpath>
+ </taskdef>
+
+ <target name="all" depends="wikitext-to-dita">
+ </target>
+
+ <target name="wikitext-to-dita" description="generate documentation to DITA from wiki text">
+ <mkdir dir="${content.source}/topics"/>
+ <wikitext-to-dita markupLanguage="${content.source.language}">
+ <fileset dir="${content.source}" includes="${content.source.includes}"/>
+ </wikitext-to-dita>
+ <mkdir dir="${content.source}/topics/images"/>
+ <copy todir="${content.source}/topics/images">
+ <fileset dir="${content.source}/images">
+ <include name="**/*"/>
+ </fileset>
+ </copy>
+ </target>
+
+</project>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-proposals.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-proposals.png
new file mode 100644
index 0000000..5a9823c
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-proposals.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-selection-proposal-completed.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-selection-proposal-completed.png
new file mode 100644
index 0000000..cddb6cc
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-selection-proposal-completed.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-selection-proposal.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-selection-proposal.png
new file mode 100644
index 0000000..841211d
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-selection-proposal.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-template-proposal-selection.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-template-proposal-selection.png
new file mode 100644
index 0000000..7ab866b
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-template-proposal-selection.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-template-proposal.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-template-proposal.png
new file mode 100644
index 0000000..60930ba
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-assist-template-proposal.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-cheat-sheet.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-cheat-sheet.png
new file mode 100644
index 0000000..58c81f6
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-cheat-sheet.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-command-help.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-command-help.png
new file mode 100644
index 0000000..5107dcc
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-command-help.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-folding-menu.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-folding-menu.png
new file mode 100644
index 0000000..249e9f0
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-folding-menu.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-folding.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-folding.png
new file mode 100644
index 0000000..70bfa6b
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-folding.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-outline.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-outline.png
new file mode 100644
index 0000000..fd04134
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-outline.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-overview.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-overview.png
new file mode 100644
index 0000000..0b66d5f
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-overview.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-preferences-appearance.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-preferences-appearance.png
new file mode 100644
index 0000000..7148532
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-preferences-appearance.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-preferences.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-preferences.png
new file mode 100644
index 0000000..21ecb2f
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-preferences.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-quick-outline.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-quick-outline.png
new file mode 100644
index 0000000..2a55604
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-quick-outline.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-spelling.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-spelling.png
new file mode 100644
index 0000000..dbf36c8
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-spelling.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-switch-language.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-switch-language.png
new file mode 100644
index 0000000..c44e278
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-switch-language.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-tabs.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-tabs.png
new file mode 100644
index 0000000..05768e8
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-tabs.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-toggle-active-folding.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-toggle-active-folding.png
new file mode 100644
index 0000000..9ee68a2
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/editor-toggle-active-folding.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/home.gif b/org.eclipse.mylyn.wikitext.help.ui/help/images/home.gif
new file mode 100644
index 0000000..4472e8c
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/home.gif differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/next.gif b/org.eclipse.mylyn.wikitext.help.ui/help/images/next.gif
new file mode 100644
index 0000000..e2f8c3e
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/next.gif differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/prev.gif b/org.eclipse.mylyn.wikitext.help.ui/help/images/prev.gif
new file mode 100644
index 0000000..4fb4150
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/prev.gif differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/project-settings.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/project-settings.png
new file mode 100644
index 0000000..16675c8
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/project-settings.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/repository-settings-task-editor-extension.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/repository-settings-task-editor-extension.png
new file mode 100644
index 0000000..cd2e9b0
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/repository-settings-task-editor-extension.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/resource-conversion-menu.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/resource-conversion-menu.png
new file mode 100644
index 0000000..d041ce8
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/resource-conversion-menu.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-bugzilla-quote.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-bugzilla-quote.png
new file mode 100644
index 0000000..44dfa8a
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-bugzilla-quote.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-bugzilla-text.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-bugzilla-text.png
new file mode 100644
index 0000000..653e9c6
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-bugzilla-text.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-font-preferences.png b/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-font-preferences.png
new file mode 100644
index 0000000..d6f8e24
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.help.ui/help/images/task-editor-font-preferences.png differ
diff --git a/org.eclipse.mylyn.wikitext.help.ui/help/styles/main.css b/org.eclipse.mylyn.wikitext.help.ui/help/styles/main.css
new file mode 100644
index 0000000..dcd5f8d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/help/styles/main.css
@@ -0,0 +1,8 @@
+
+pre code {
+ display: block;
+ border: 1px solid gray;
+ margin: 1em;
+ padding: 1em;
+ background-color: #F0F0F0;
+}
diff --git a/org.eclipse.mylyn.wikitext.help.ui/plugin.properties b/org.eclipse.mylyn.wikitext.help.ui/plugin.properties
new file mode 100644
index 0000000..f4deeed
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+#Properties file for org.eclipse.mylyn.wikitext.help.ui
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Help UI
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.help.ui/plugin.xml b/org.eclipse.mylyn.wikitext.help.ui/plugin.xml
new file mode 100644
index 0000000..0090a01
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/plugin.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension point="org.eclipse.help.toc">
+ <toc file="help/Mylyn WikiText User Guide-toc.xml" primary="true"/>
+ <toc file="help/devguide/WikiText Developer Guide-toc.xml" primary="false"/>
+ <toc file="toc-sdk.xml" primary="false"/>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="contextHelp.xml"/>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.help.ui/src/.empty b/org.eclipse.mylyn.wikitext.help.ui/src/.empty
new file mode 100644
index 0000000..e69de29
diff --git a/org.eclipse.mylyn.wikitext.help.ui/toc-sdk.xml b/org.eclipse.mylyn.wikitext.help.ui/toc-sdk.xml
new file mode 100644
index 0000000..818a8c2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.help.ui/toc-sdk.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<toc label="Mylyn WikiText Developer Guide" link_to="../org.eclipse.mylyn.wikitext.help.sdk/toc.xml#first" topic="help/devguide/WikiText Developer Guide.html">
+ <link toc="help/devguide/WikiText Developer Guide-toc.xml"/>
+</toc>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.classpath b/org.eclipse.mylyn.wikitext.mediawiki.core/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.cvsignore b/org.eclipse.mylyn.wikitext.mediawiki.core/.cvsignore
new file mode 100644
index 0000000..c07f541
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.cvsignore
@@ -0,0 +1 @@
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.project b/org.eclipse.mylyn.wikitext.mediawiki.core/.project
new file mode 100644
index 0000000..b89cb17
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.mediawiki.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..fdc16fd
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:36 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.mediawiki.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..839a73f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.mediawiki.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.team.core;resolution:=optional
+Export-Package: org.eclipse.mylyn.internal.wikitext.mediawiki.core;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.mediawiki.core.block;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.mediawiki.core.phrase;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation;x-internal:=true,
+ org.eclipse.mylyn.wikitext.mediawiki.core
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage b/org.eclipse.mylyn.wikitext.mediawiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
new file mode 100644
index 0000000..b79363d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
@@ -0,0 +1 @@
+org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/about.html b/org.eclipse.mylyn.wikitext.mediawiki.core/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/build.properties b/org.eclipse.mylyn.wikitext.mediawiki.core/build.properties
new file mode 100644
index 0000000..42f5abc
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/plugin.properties b/org.eclipse.mylyn.wikitext.mediawiki.core/plugin.properties
new file mode 100644
index 0000000..78dfb07
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+#Properties file for org.eclipse.mylyn.wikitext.mediawiki.core
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText MediaWiki
+content-type.name.0 = MediaWiki WikiText Markup
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/plugin.xml b/org.eclipse.mylyn.wikitext.mediawiki.core/plugin.xml
new file mode 100644
index 0000000..2238b5c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension point="org.eclipse.mylyn.wikitext.core.markupLanguage">
+ <language class="org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage"
+ name="MediaWiki" fileExtensions="mediawiki">
+ </language>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.mylyn.wikitext"
+ file-extensions="mediawiki"
+ id="org.eclipse.mylyn.wikitext.mediawiki"
+ name="%content-type.name.0"
+ priority="normal">
+ </content-type>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="mediawiki"
+ type="text">
+ </fileTypes>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation.CommentValidationRule"
+ markupLanguage="MediaWiki"/>
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation.MediaWikiReferenceValidationRule"
+ markupLanguage="MediaWiki"/>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/MediaWikiIdGenerationStrategy.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/MediaWikiIdGenerationStrategy.java
new file mode 100644
index 0000000..7b087f7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/MediaWikiIdGenerationStrategy.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.IdGenerationStrategy;
+
+/**
+ *
+ * @author David Green
+ */
+public class MediaWikiIdGenerationStrategy extends IdGenerationStrategy {
+
+ private final Map<String, Integer> anchorReferenceCount = new HashMap<String, Integer>();
+
+ @Override
+ public String generateId(String headingText) {
+
+ // from the MediaWiki source (Parser.php line 3090) the basic algorithm pseudocode is as follows:
+
+ // anchor = escapeId( headingText )
+ // ++refCount(anchor)
+ // if (refCount(anchor) > 1) {
+ // anchor = anchor + '_' + refCount(anchor)
+ // }
+
+ String anchor = escape(headingText);
+ Integer previousRefCount = anchorReferenceCount.put(anchor, 1);
+ if (previousRefCount != null) {
+ int refCount = previousRefCount + 1;
+ anchorReferenceCount.put(anchor, refCount);
+ anchor = anchor + '_' + refCount;
+ }
+
+ return anchor;
+ }
+
+ private String escape(String headingText) {
+ // implementation based on Sanitizer.php line 629
+ String escaped = headingText.replaceAll("\\s", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ // TODO: decode entity and char references
+ try {
+ escaped = URLEncoder.encode(escaped, "utf-8"); //$NON-NLS-1$
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalStateException(e);
+ }
+ return escaped.replace("%3A", ":").replace('%', '.'); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/HeadingBlock.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/HeadingBlock.java
new file mode 100644
index 0000000..8da3a17
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/HeadingBlock.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HeadingBlock extends Block {
+
+ private static final Pattern pattern = Pattern.compile("\\s*(\\={1,6})\\s*(.+?)\\s*\\1"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = pattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount > 0) {
+ throw new IllegalStateException();
+ }
+ ++blockLineCount;
+
+ int level = matcher.group(1).length();
+
+ String text = matcher.group(2);
+
+ final Attributes attributes = new Attributes();
+ if (attributes.getId() == null) {
+ attributes.setId(state.getIdGenerator().newId("h" + level, text)); //$NON-NLS-1$
+ }
+ builder.beginHeading(level, attributes);
+ builder.characters(text);
+ builder.endHeading();
+
+ setClosed(true);
+ return -1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/ListBlock.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/ListBlock.java
new file mode 100644
index 0000000..2fc7490
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/ListBlock.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.block;
+
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * List block, matches blocks that start with <code>*</code>, <code>#</code> or <code>-</code>
+ *
+ * @author David Green
+ */
+public class ListBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = 2;
+
+ static final Pattern startPattern = Pattern.compile("((?:(?:\\*)|(?:#)|(?:-)|(?:\\;)|(?:\\:))+)\\s?(.+)"); //$NON-NLS-1$
+
+ static final Pattern definitionPattern = Pattern.compile("(\\s+\\:\\s+)(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private Stack<ListState> listState;
+
+ public ListBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ boolean continuation = false;
+ if (blockLineCount == 0) {
+ listState = new Stack<ListState>();
+ Attributes attributes = new Attributes();
+ String listSpec = matcher.group(1);
+ char lastChar = listSpec.charAt(listSpec.length() - 1);
+ int level = calculateLevel(listSpec);
+ BlockType type = calculateType(lastChar);
+ BlockType itemType = calculateItemType(lastChar);
+
+ if (type == BlockType.BULLETED_LIST && '-' == lastChar) {
+ attributes.setCssStyle("list-style: square"); //$NON-NLS-1$
+ }
+
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ listState.push(new ListState(1, type, itemType));
+ builder.beginBlock(type, attributes);
+
+ adjustLevel(lastChar, level, type, itemType);
+ } else {
+ Matcher matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ String listSpec = matcher.group(1);
+ char lastChar = listSpec.charAt(listSpec.length() - 1);
+ int lineLevel = calculateLevel(listSpec);
+ BlockType type = calculateType(lastChar);
+ BlockType itemType = calculateItemType(lastChar);
+
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ continuation = adjustLevel(lastChar, lineLevel, type, itemType);
+ }
+ ++blockLineCount;
+
+ ListState listState = this.listState.peek();
+ if (!continuation && listState.openItem) {
+ listState.openItem = false;
+ builder.endBlock();
+ }
+ if (!listState.openItem) {
+ listState.openItem = true;
+ builder.beginBlock(listState.itemType, new Attributes());
+ }
+
+ String definition = null;
+ int definitionOffset = -1;
+ if (listState.itemType == BlockType.DEFINITION_TERM) {
+ // detect definition on same line as term
+ Matcher definitionMatcher = definitionPattern.matcher(line);
+ if (offset > 0) {
+ definitionMatcher.region(offset, line.length());
+ }
+ if (definitionMatcher.find()) {
+ line = line.substring(offset, definitionMatcher.start(1));
+ offset = 0;
+ definition = definitionMatcher.group(2);
+ definitionOffset = definitionMatcher.start(2);
+ }
+ }
+ if (definition == null) {
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+ } else {
+ markupLanguage.emitMarkupLine(getParser(), state, offset, line, 0);
+ }
+
+ if (definition != null) {
+ listState.openItem = false;
+ builder.endBlock();
+
+ adjustLevel(' ', listState.level, BlockType.DEFINITION_LIST, BlockType.DEFINITION_ITEM);
+
+ listState = this.listState.peek();
+ if (listState.openItem) {
+ builder.endBlock();
+ }
+ listState.openItem = true;
+ builder.beginBlock(listState.itemType, new Attributes());
+
+ markupLanguage.emitMarkupLine(parser, state, definitionOffset, definition, 0);
+ }
+
+ return -1;
+ }
+
+ /**
+ *
+ * @param lastChar
+ * the last character of the list specification, or ' ' if unknown
+ *
+ * @return true if the item is a continuation
+ */
+ private boolean adjustLevel(char lastChar, int lineLevel, BlockType type, BlockType itemType) {
+ boolean continuation = false;
+
+ for (ListState previousState = listState.peek(); lineLevel != previousState.level || previousState.type != type
+ || previousState.itemType != itemType; previousState = listState.peek()) {
+
+ if (lineLevel > previousState.level) {
+ if (!previousState.openItem) {
+ builder.beginBlock(previousState.itemType, new Attributes());
+ previousState.openItem = true;
+ }
+
+ Attributes blockAttributes = new Attributes();
+ if (type == BlockType.BULLETED_LIST && '-' == lastChar) {
+ blockAttributes.setCssStyle("list-style: square"); //$NON-NLS-1$
+ }
+ listState.push(new ListState(previousState.level + 1, type, itemType));
+ builder.beginBlock(type, blockAttributes);
+ } else if (lineLevel == previousState.level && previousState.type == type
+ && previousState.itemType != itemType) {
+ if (previousState.openItem) {
+ builder.endBlock();
+ previousState.openItem = false;
+ }
+ previousState.itemType = itemType;
+ } else {
+ if (lineLevel == previousState.level && lastChar == ':') {
+ // this is possibly a continuation of the previous item.
+ if (previousState.itemType != BlockType.DEFINITION_ITEM
+ && previousState.itemType != BlockType.DEFINITION_TERM) {
+ // we found a continuation
+ continuation = true;
+ break;
+ }
+ }
+ closeOne();
+ if (listState.isEmpty()) {
+ Attributes blockAttributes = new Attributes();
+ if (type == BlockType.BULLETED_LIST && '-' == lastChar) {
+ blockAttributes.setCssStyle("list-style: square"); //$NON-NLS-1$
+ }
+ listState.push(new ListState(1, type, itemType));
+ builder.beginBlock(type, blockAttributes);
+ }
+ }
+ }
+
+ return continuation;
+ }
+
+ private int calculateLevel(String listSpec) {
+ return listSpec.length();
+ }
+
+ private BlockType calculateType(char lastChar) {
+ switch (lastChar) {
+ case '#':
+ return BlockType.NUMERIC_LIST;
+ case ':':
+ case ';':
+ return BlockType.DEFINITION_LIST;
+ default:
+ return BlockType.BULLETED_LIST;
+ }
+ }
+
+ private BlockType calculateItemType(char lastChar) {
+ switch (lastChar) {
+ case ';':
+ return BlockType.DEFINITION_TERM;
+ case ':':
+ return BlockType.DEFINITION_ITEM;
+ default:
+ return BlockType.LIST_ITEM;
+ }
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ listState = null;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ while (listState != null && !listState.isEmpty()) {
+ closeOne();
+ }
+ listState = null;
+ }
+ super.setClosed(closed);
+ }
+
+ private void closeOne() {
+ ListState e = listState.pop();
+ if (e.openItem) {
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ private static class ListState {
+ int level;
+
+ BlockType type;
+
+ BlockType itemType;
+
+ boolean openItem;
+
+ private ListState(int level, BlockType type, BlockType itemType) {
+ super();
+ this.level = level;
+ this.type = type;
+ this.itemType = itemType;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/ParagraphBlock.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/ParagraphBlock.java
new file mode 100644
index 0000000..5f6b0a5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/ParagraphBlock.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.block;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
+
+/**
+ * Matches any markup text.
+ *
+ * @author David Green
+ */
+public class ParagraphBlock extends Block {
+
+ private int blockLineCount = 0;
+
+ private Block nestedBlock = null;
+
+ private boolean newlinesCauseLineBreak = false;
+
+ private final boolean testPreformattedBlocks;
+
+ public ParagraphBlock(boolean testPreformattedBlocks) {
+ this.testPreformattedBlocks = testPreformattedBlocks;
+ }
+
+ public boolean isNewlinesCauseLineBreak() {
+ return newlinesCauseLineBreak;
+ }
+
+ public void setNewlinesCauseLineBreak(boolean newlinesCauseLineBreak) {
+ this.newlinesCauseLineBreak = newlinesCauseLineBreak;
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ } else if (nestedBlock != null) {
+ int returnOffset = nestedBlock.processLine(line, offset);
+ if (nestedBlock.isClosed()) {
+ nestedBlock = null;
+ }
+ if (returnOffset >= 0) {
+ offset = returnOffset;
+ if (nestedBlock != null) {
+ throw new IllegalStateException();
+ }
+ } else {
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ return returnOffset;
+ }
+ }
+
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+
+ MediaWikiLanguage dialect = (MediaWikiLanguage) getMarkupLanguage();
+
+ // paragraphs can have nested lists and other things
+ for (Block block : dialect.getParagraphBreakingBlocks()) {
+ if (block.canStart(line, offset)) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ ++blockLineCount;
+
+ if (nestedBlock != null) {
+ if (blockLineCount > 1) {
+ builder.lineBreak();
+ }
+ nestedBlock.processLine(line, offset);
+ } else {
+ if (testPreformattedBlocks && offset == 0 && line.length() > 0 && line.charAt(0) == ' ') {
+ // a preformatted block.
+ setClosed(true);
+ return 0;
+ }
+ if (blockLineCount != 1) {
+ // note: normally newlines don't automatically convert to line breaks
+ if (newlinesCauseLineBreak) {
+ builder.lineBreak();
+ } else {
+ builder.characters("\n"); //$NON-NLS-1$
+ }
+ }
+ dialect.emitMarkupLine(getParser(), state, line, offset);
+ }
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ return true;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ if (nestedBlock != null) {
+ nestedBlock.setClosed(closed);
+ nestedBlock = null;
+ }
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/PreformattedBlock.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/PreformattedBlock.java
new file mode 100644
index 0000000..16170f8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/PreformattedBlock.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.block;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class PreformattedBlock extends Block {
+
+ private int blockLineCount = 0;
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && line.length() > 0 && line.charAt(0) == ' ') {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (markupLanguage.isEmptyLine(line) || (offset == 0 && line.charAt(0) != ' ')) {
+ setClosed(true);
+ return 0;
+ }
+ if (blockLineCount++ == 0) {
+ builder.beginBlock(BlockType.PREFORMATTED, new Attributes());
+ }
+ builder.characters(line.substring(1));
+ builder.characters("\n"); //$NON-NLS-1$
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // pre
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/TableBlock.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/TableBlock.java
new file mode 100644
index 0000000..5ef1742
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/block/TableBlock.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableCellAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableRowAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * an implementation of MediaWiki tables, see <a
+ * href="http://www.mediawiki.org/wiki/Help:Tables">MediaWiki:Help:Tables</a> for details
+ *
+ * @author David Green
+ * @author Daniel Migowski bug 274730 tables having mixed headers/normal cells
+ */
+public class TableBlock extends Block {
+
+ private static final Pattern rowCellSplitter = Pattern.compile("\\s*(\\|\\||!!)\\s*"); //$NON-NLS-1$
+
+ private static final Pattern startPattern = Pattern.compile("\\{\\|\\s*(.+)?"); //$NON-NLS-1$
+
+ private static final Pattern optionsPattern = Pattern.compile("([a-zA-Z]+)=\"([^\"]*)\""); //$NON-NLS-1$
+
+ private static final Pattern newRowPattern = Pattern.compile("\\|-\\s*(.+)?"); //$NON-NLS-1$
+
+ private static final Pattern cellPattern = Pattern.compile("(\\||!)\\s*(.+)?"); //$NON-NLS-1$
+
+ private static final Pattern cellSplitterPattern = Pattern.compile("\\s*(?:([^\\|]+)?\\|)?\\s*(.+)?"); //$NON-NLS-1$
+
+ private static final Pattern endPattern = Pattern.compile("\\|\\}\\s*(.+)?"); //$NON-NLS-1$
+
+ private int blockLineCount;
+
+ private Matcher matcher;
+
+ private boolean openRow;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount++ == 0) {
+ TableAttributes attributes = new TableAttributes();
+
+ // first line opens table
+ String options = matcher.group(1);
+ if (options != null) {
+ Matcher optionsMatcher = optionsPattern.matcher(options);
+ while (optionsMatcher.find()) {
+ String optionName = optionsMatcher.group(1);
+ String optionValue = optionsMatcher.group(2);
+ if (optionName.equalsIgnoreCase("id")) { //$NON-NLS-1$
+ attributes.setId(optionValue);
+ } else if (optionName.equalsIgnoreCase("style")) { //$NON-NLS-1$
+ attributes.setCssStyle(optionValue);
+ } else if (optionName.equalsIgnoreCase("class")) { //$NON-NLS-1$
+ attributes.setCssClass(optionValue);
+ } else if (optionName.equalsIgnoreCase("title")) { //$NON-NLS-1$
+ attributes.setTitle(optionValue);
+ } else if (optionName.equalsIgnoreCase("border")) { //$NON-NLS-1$
+ attributes.setBorder(optionValue);
+ } else if (optionName.equalsIgnoreCase("summary")) { //$NON-NLS-1$
+ attributes.setSummary(optionValue);
+ } else if (optionName.equalsIgnoreCase("width")) { //$NON-NLS-1$
+ attributes.setWidth(optionValue);
+ } else if (optionName.equalsIgnoreCase("frame")) { //$NON-NLS-1$
+ attributes.setFrame(optionValue);
+ } else if (optionName.equalsIgnoreCase("rules")) { //$NON-NLS-1$
+ attributes.setRules(optionValue);
+ } else if (optionName.equalsIgnoreCase("cellspacing")) { //$NON-NLS-1$
+ attributes.setCellspacing(optionValue);
+ } else if (optionName.equalsIgnoreCase("cellpadding")) { //$NON-NLS-1$
+ attributes.setCellpadding(optionValue);
+ } else if (optionName.equalsIgnoreCase("bgcolor")) { //$NON-NLS-1$
+ attributes.setBgcolor(optionValue);
+ }
+ }
+ }
+ builder.beginBlock(BlockType.TABLE, attributes);
+ // table open line never has cells
+ return -1;
+ } else {
+ Matcher newRowMatcher = newRowPattern.matcher(line);
+ if (newRowMatcher.matches()) {
+ TableRowAttributes attributes = new TableRowAttributes();
+ String newRowOptions = newRowMatcher.group(1);
+ if (newRowOptions != null) {
+ Matcher optionsMatcher = optionsPattern.matcher(newRowOptions);
+ while (optionsMatcher.find()) {
+ String optionName = optionsMatcher.group(1);
+ String optionValue = optionsMatcher.group(2);
+ if (optionName.equalsIgnoreCase("id")) { //$NON-NLS-1$
+ attributes.setId(optionValue);
+ } else if (optionName.equalsIgnoreCase("style")) { //$NON-NLS-1$
+ attributes.setCssStyle(optionValue);
+ } else if (optionName.equalsIgnoreCase("class")) { //$NON-NLS-1$
+ attributes.setCssClass(optionValue);
+ } else if (optionName.equalsIgnoreCase("title")) { //$NON-NLS-1$
+ attributes.setTitle(optionValue);
+ } else if (optionName.equalsIgnoreCase("align")) { //$NON-NLS-1$
+ attributes.setAlign(optionValue);
+ } else if (optionName.equalsIgnoreCase("valign")) { //$NON-NLS-1$
+ attributes.setValign(optionValue);
+ } else if (optionName.equalsIgnoreCase("bgcolor")) { //$NON-NLS-1$
+ attributes.setBgcolor(optionValue);
+ }
+ }
+ }
+ openRow(newRowMatcher.start(), attributes);
+ return -1;
+ } else {
+ Matcher endMatcher = endPattern.matcher(line);
+ if (endMatcher.matches()) {
+ setClosed(true);
+ return endMatcher.start(1);
+ } else {
+
+ Matcher cellMatcher = cellPattern.matcher(line);
+ if (cellMatcher.matches()) {
+ String kind = cellMatcher.group(1);
+ String contents = cellMatcher.group(2);
+ if (contents == null) {
+ // likely an incomplete line
+ return -1;
+ }
+ int contentsStart = cellMatcher.start(2);
+ BlockType type = ("!".equals(kind)) ? BlockType.TABLE_CELL_HEADER : BlockType.TABLE_CELL_NORMAL; //$NON-NLS-1$
+
+ if (!openRow) {
+ openRow(cellMatcher.start(), new Attributes());
+ }
+ emitCells(contentsStart, type, contents);
+
+ return -1;
+ } else {
+ // ignore, bad formatting or unsupported syntax (caption)
+ return -1;
+ }
+ }
+ }
+ }
+ }
+
+ private void emitCells(int contentsStart, BlockType type, String contents) {
+ int lastEnd = 0;
+ Matcher matcher = rowCellSplitter.matcher(contents);
+ while (matcher.find()) {
+ int found = matcher.start();
+ String cell;
+ if (found > lastEnd) {
+ cell = contents.substring(lastEnd, found);
+ } else {
+ cell = ""; //$NON-NLS-1$
+ }
+ emitCell(lastEnd + contentsStart, type, cell);
+
+ // Depending on the cell splitter the next cell is either a
+ // header or normal cell.
+ String splitterSpec = matcher.group(1);
+ if ("!!".equals(splitterSpec)) { //$NON-NLS-1$
+ type = BlockType.TABLE_CELL_HEADER;
+ } else {
+ type = BlockType.TABLE_CELL_NORMAL;
+ }
+
+ lastEnd = matcher.end();
+ }
+ if (lastEnd < contents.length()) {
+ emitCell(lastEnd + contentsStart, type, contents.substring(lastEnd));
+ }
+ }
+
+ private void emitCell(int lineCharacterOffset, BlockType type, String cell) {
+ Matcher cellSplitterMatcher = cellSplitterPattern.matcher(cell);
+ if (!cellSplitterMatcher.matches()) {
+ throw new IllegalStateException();
+ }
+ String cellOptions = cellSplitterMatcher.group(1);
+ String cellContents = cellSplitterMatcher.group(2);
+ if (cellContents == null) {
+ // probably invalid syntax
+ return;
+ }
+
+ int contentsStart = cellSplitterMatcher.start(2);
+
+ TableCellAttributes attributes = new TableCellAttributes();
+
+ if (cellOptions != null) {
+ Matcher optionsMatcher = optionsPattern.matcher(cellOptions);
+ while (optionsMatcher.find()) {
+ String optionName = optionsMatcher.group(1);
+ String optionValue = optionsMatcher.group(2);
+ if (optionName.equalsIgnoreCase("id")) { //$NON-NLS-1$
+ attributes.setId(optionValue);
+ } else if (optionName.equalsIgnoreCase("style")) { //$NON-NLS-1$
+ attributes.setCssStyle(optionValue);
+ } else if (optionName.equalsIgnoreCase("class")) { //$NON-NLS-1$
+ attributes.setCssClass(optionValue);
+ } else if (optionName.equalsIgnoreCase("title")) { //$NON-NLS-1$
+ attributes.setTitle(optionValue);
+ } else if (optionName.equalsIgnoreCase("align")) { //$NON-NLS-1$
+ attributes.setAlign(optionValue);
+ } else if (optionName.equalsIgnoreCase("valign")) { //$NON-NLS-1$
+ attributes.setValign(optionValue);
+ } else if (optionName.equalsIgnoreCase("bgcolor")) { //$NON-NLS-1$
+ attributes.setBgcolor(optionValue);
+ } else if (optionName.equalsIgnoreCase("colspan")) { //$NON-NLS-1$
+ attributes.setColspan(optionValue);
+ } else if (optionName.equalsIgnoreCase("rowspan")) { //$NON-NLS-1$
+ attributes.setRowspan(optionValue);
+ }
+ }
+ }
+ state.setLineCharacterOffset(lineCharacterOffset);
+
+ builder.beginBlock(type, attributes);
+
+ markupLanguage.emitMarkupLine(parser, state, lineCharacterOffset + contentsStart, cellContents, 0);
+ builder.endBlock();
+ }
+
+ private void openRow(int lineOffset, Attributes attributes) {
+ closeRow();
+ state.setLineCharacterOffset(lineOffset);
+ builder.beginBlock(BlockType.TABLE_ROW, attributes);
+ openRow = true;
+ }
+
+ private void closeRow() {
+ if (openRow) {
+ builder.endBlock();
+ openRow = false;
+ }
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ openRow = false;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ closeRow();
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/EscapePhraseModifier.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/EscapePhraseModifier.java
new file mode 100644
index 0000000..a6b8909
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/EscapePhraseModifier.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.LiteralPhraseModifierProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class EscapePhraseModifier extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "<nowiki>" + "(\\S(?:.*?\\S)?)" + // content //$NON-NLS-1$ //$NON-NLS-2$
+ "</nowiki>"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(true);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/SimplePhraseModifier.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/SimplePhraseModifier.java
new file mode 100644
index 0000000..db8dd27
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/SimplePhraseModifier.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimplePhraseModifier extends SimpleWrappedPhraseModifier {
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType) {
+ super(delimiter, delimiter, new SpanType[] { spanType });
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType, boolean nesting) {
+ super(delimiter, delimiter, new SpanType[] { spanType }, nesting);
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType[] spanType) {
+ super(delimiter, delimiter, spanType);
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType[] spanType, boolean nesting) {
+ super(delimiter, delimiter, spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/SimpleWrappedPhraseModifier.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/SimpleWrappedPhraseModifier.java
new file mode 100644
index 0000000..e9de21d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/phrase/SimpleWrappedPhraseModifier.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.phrase;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimpleWrappedPhraseModifier extends PatternBasedElement {
+
+ protected static final int CONTENT_GROUP = 1;
+
+ private static class SimplePhraseModifierProcessor extends PatternBasedElementProcessor {
+ private final SpanType[] spanType;
+
+ private final boolean nesting;
+
+ public SimplePhraseModifierProcessor(SpanType[] spanType, boolean nesting) {
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ public void emit() {
+ for (SpanType type : spanType) {
+ getBuilder().beginSpan(type, new Attributes());
+ }
+ if (nesting) {
+ getMarkupLanguage().emitMarkupLine(parser, state, getStart(this), getContent(this), 0);
+ } else {
+ getMarkupLanguage().emitMarkupText(parser, state, getContent(this));
+ }
+ for (int x = 0; x < spanType.length; ++x) {
+ getBuilder().endSpan();
+ }
+ }
+ }
+
+ private final String startDelimiter;
+
+ private final String endDelimiter;
+
+ private final SpanType[] spanType;
+
+ private final boolean nesting;
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType[] spanType) {
+ this(startDelimiter, endDelimiter, spanType, false);
+ }
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType[] spanType, boolean nesting) {
+ this.startDelimiter = startDelimiter;
+ this.endDelimiter = endDelimiter;
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return Pattern.quote(startDelimiter) + "([^\\s-](?:.*?[^\\s-])?)" + // content: note that we dont allow preceding '-' or trailing '-' to avoid conflict with strikethrough and emdash //$NON-NLS-1$
+ Pattern.quote(endDelimiter);
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ protected static String getContent(PatternBasedElementProcessor processor) {
+ return processor.group(CONTENT_GROUP);
+ }
+
+ protected static int getStart(PatternBasedElementProcessor processor) {
+ return processor.start(CONTENT_GROUP);
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SimplePhraseModifierProcessor(spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/EntityReferenceReplacementToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/EntityReferenceReplacementToken.java
new file mode 100644
index 0000000..2c5235b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/EntityReferenceReplacementToken.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class EntityReferenceReplacementToken extends PatternBasedElement {
+
+ private static final Set<String> allowedEntities = new HashSet<String>();
+ static {
+ allowedEntities.add(""); //$NON-NLS-1$
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "&(#?[a-zA-Z0-9]{2,7});"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new EntityReferenceProcessor();
+ }
+
+ private static class EntityReferenceProcessor extends PatternBasedElementProcessor {
+
+ @Override
+ public void emit() {
+ String entity = group(1);
+ getBuilder().entityReference(entity);
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkExternalReplacementToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkExternalReplacementToken.java
new file mode 100644
index 0000000..84562a6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkExternalReplacementToken.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * match [[internal links]]
+ *
+ * @author David Green
+ *
+ */
+public class HyperlinkExternalReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:\\[([^\\[\\]\\|\\s]+)(?:(?:\\||\\s)([^\\]]*))?\\s*\\])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String href = group(1);
+ String altText = group(2);
+
+ if (altText == null || altText.trim().length() == 0) {
+ altText = href;
+ }
+ builder.link(href, altText);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkInternalReplacementToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkInternalReplacementToken.java
new file mode 100644
index 0000000..8ab9e46
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkInternalReplacementToken.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.LinkAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
+
+/**
+ * match [[internal links]]
+ *
+ * @author David Green
+ *
+ */
+public class HyperlinkInternalReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:\\[\\[([^\\]\\|]+?)\\s*(?:\\|\\s*([^\\]]*))?\\]\\])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String pageName = group(1);
+ String altText = group(2);
+ String href = ((MediaWikiLanguage) getMarkupLanguage()).toInternalHref(pageName);
+
+ // category references start with ':' but are not referenced that way in the text
+ if (pageName.startsWith(":")) { //$NON-NLS-1$
+ pageName = pageName.substring(1);
+ }
+ if (altText == null || altText.trim().length() == 0) {
+ altText = pageName;
+ if (altText.startsWith("#")) { //$NON-NLS-1$
+ altText = altText.substring(1);
+ }
+ }
+ if (pageName.startsWith("#")) { //$NON-NLS-1$
+ builder.link(href, altText);
+ } else {
+ Attributes attributes = new LinkAttributes();
+ attributes.setTitle(pageName);
+ builder.link(attributes, href, altText);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkReplacementToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkReplacementToken.java
new file mode 100644
index 0000000..adb19f1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/HyperlinkReplacementToken.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HyperlinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:(\"|\\!)([^\"]+)\\" + (1 + groupOffset) + ":([^\\s]+))"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 3;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String hyperlinkBoundaryText = group(1);
+ String hyperlinkSrc = group(2);
+ String href = group(3);
+
+ if (hyperlinkBoundaryText.equals("\"")) { //$NON-NLS-1$
+ builder.link(href, hyperlinkSrc);
+ } else {
+ builder.imageLink(href, hyperlinkSrc);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/ImageReplacementToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/ImageReplacementToken.java
new file mode 100644
index 0000000..ff1a446
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/ImageReplacementToken.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes.Align;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * match [[Image:someImage.png]]
+ *
+ * @see <a href="http://en.wikipedia.org/wiki/Wikipedia:Extended_image_syntax">Extended image syntax</a>
+ *
+ * @author David Green
+ *
+ */
+public class ImageReplacementToken extends PatternBasedElement {
+
+ private static Pattern widthHeightPart = Pattern.compile("(\\d+)(x(\\d+))?px"); //$NON-NLS-1$
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:\\[\\[Image:([^\\]\\|]+)(?:\\|([^\\]]*))?\\]\\])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new ImageReplacementTokenProcessor();
+ }
+
+ private static class ImageReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String imageUrl = group(1);
+ String optionsString = group(2);
+
+ ImageAttributes attributes = new ImageAttributes();
+ if (optionsString != null) {
+ Matcher matcher;
+ String[] options = optionsString.split("\\s*\\|\\s*"); //$NON-NLS-1$
+ for (String option : options) {
+ if ("center".equals(option)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Middle);
+ } else if ("left".equals(option)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Left);
+ } else if ("right".equals(option)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Right);
+ } else if ("none".equals(option)) { //$NON-NLS-1$
+ attributes.setAlign(null);
+ } else if ("thumb".equals(option) || "thumbnail".equals(option)) { //$NON-NLS-1$ //$NON-NLS-2$
+ // ignore
+ } else if ((matcher = widthHeightPart.matcher(option)).matches()) {
+ try {
+ String sizePart = matcher.group(1);
+ String heightPart = matcher.group(3);
+ int size = Integer.parseInt(sizePart);
+ attributes.setWidth(size);
+ if (heightPart != null) {
+ int height = Integer.parseInt(heightPart);
+ attributes.setHeight(height);
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ } else if ("frameless".equals(option)) { //$NON-NLS-1$
+ attributes.setBorder(0);
+ } else if ("frame".equals(option)) { //$NON-NLS-1$
+ attributes.setBorder(1);
+ } else {
+ attributes.setTitle(option);
+ }
+ }
+ }
+ builder.image(attributes, imageUrl);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/LineBreakToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/LineBreakToken.java
new file mode 100644
index 0000000..34c5c33
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/LineBreakToken.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class LineBreakToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(<br>|<br/>)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LineBreakProcessor();
+ }
+
+ private static class LineBreakProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ builder.lineBreak();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/TemplateReplacementToken.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/TemplateReplacementToken.java
new file mode 100644
index 0000000..cff033c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/token/TemplateReplacementToken.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.token;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TemplateReplacementToken extends PatternBasedElement {
+
+ private static Map<String, Class<? extends PatternBasedElementProcessor>> processorByTemplate = new HashMap<String, Class<? extends PatternBasedElementProcessor>>();
+ static {
+ processorByTemplate.put("endash", EndashElementProcessor.class); //$NON-NLS-1$
+ processorByTemplate.put("ndash", EndashElementProcessor.class); //$NON-NLS-1$
+ processorByTemplate.put("mdash", EmdashElementProcessor.class); //$NON-NLS-1$
+ processorByTemplate.put("emdash", EmdashElementProcessor.class); //$NON-NLS-1$
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(\\{\\{([^\\s]+)\\}\\})"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new DispatchingProcessor();
+ }
+
+ private static class DispatchingProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ Class<? extends PatternBasedElementProcessor> processor = processorByTemplate.get(group(2));
+ if (processor == null) {
+ getBuilder().characters(group(1));
+ } else {
+ PatternBasedElementProcessor delegate;
+ try {
+ delegate = processor.newInstance();
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ delegate.setLineStartOffset(getLineStartOffset());
+ delegate.setLineEndOffset(getLineEndOffset());
+ delegate.setParser(getParser());
+ delegate.setState(getState());
+ delegate.setGroup(1, group(1), start(1), end(1));
+ delegate.setGroup(2, group(2), start(2), end(2));
+ delegate.emit();
+ }
+ }
+ }
+
+ public static class EndashElementProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ getBuilder().entityReference("nbsp"); //$NON-NLS-1$
+ getBuilder().entityReference("ndash"); //$NON-NLS-1$
+ getBuilder().characters(" "); //$NON-NLS-1$
+ }
+ }
+
+ public static class EmdashElementProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ getBuilder().entityReference("nbsp"); //$NON-NLS-1$
+ getBuilder().entityReference("mdash"); //$NON-NLS-1$
+ getBuilder().characters(" "); //$NON-NLS-1$
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/CommentValidationRule.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/CommentValidationRule.java
new file mode 100644
index 0000000..a69a4a5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/CommentValidationRule.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+/**
+ * a validation rule that tests for malformed comment delimiters.
+ *
+ * @author David Green
+ */
+public class CommentValidationRule extends ValidationRule {
+
+ private static Pattern commentPattern = Pattern.compile("(<!-{3,}|-{3,}>)", Pattern.MULTILINE); //$NON-NLS-1$
+
+ public CommentValidationRule() {
+ }
+
+ @Override
+ public ValidationProblem findProblem(String markup, int offset, int length) {
+ Matcher matcher = commentPattern.matcher(markup);
+ if (offset > 0 || length != markup.length()) {
+ matcher.region(offset, offset + length);
+ }
+ if (matcher.find()) {
+ int problemOffset = matcher.start();
+ int problemLength = Math.max(2, matcher.end() - problemOffset);
+ return new ValidationProblem(Severity.WARNING,
+ Messages.getString("CommentValidationRule.1"), //$NON-NLS-1$
+ problemOffset, problemLength);
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/MediaWikiReferenceValidationRule.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/MediaWikiReferenceValidationRule.java
new file mode 100644
index 0000000..0bd680a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/MediaWikiReferenceValidationRule.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.validation.DocumentLocalReferenceValidationRule;
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
+
+public class MediaWikiReferenceValidationRule extends DocumentLocalReferenceValidationRule {
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new MediaWikiLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/Messages.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/Messages.java
new file mode 100644
index 0000000..f859027
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/messages.properties b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/messages.properties
new file mode 100644
index 0000000..2a67853
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/messages.properties
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+CommentValidationRule.1=Comments should start with '<\!--' and end with '-->' (too many '-' characters in markup)
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/wikitext/mediawiki/core/MediaWikiLanguage.java b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/wikitext/mediawiki/core/MediaWikiLanguage.java
new file mode 100644
index 0000000..66885ae
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core/src/org/eclipse/mylyn/wikitext/mediawiki/core/MediaWikiLanguage.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.mediawiki.core;
+
+import java.text.MessageFormat;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.MediaWikiIdGenerationStrategy;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.block.HeadingBlock;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.block.ListBlock;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.block.ParagraphBlock;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.block.PreformattedBlock;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.block.TableBlock;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.phrase.EscapePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.phrase.SimplePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.token.HyperlinkExternalReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.token.HyperlinkInternalReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.token.ImageReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.token.LineBreakToken;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.token.TemplateReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.AbstractMarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.IdGenerationStrategy;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.HtmlCommentPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.LimitedHtmlEndTagPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.LimitedHtmlStartTagPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.EntityReferenceReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.ImpliedHyperlinkReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.PatternLiteralReplacementToken;
+
+/**
+ * A markup language for <a href="http://www.mediawiki.org">MediaWiki</a> <a
+ * href="http://en.wikipedia.org/wiki/Wikitext">Wikitext markup</a>, which is the wiki format used by <a
+ * href="http://www.wikipedia.org>WikiPedia</a> and <a href="http://www.wikimedia.org/">several other major sites</a>.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MediaWikiLanguage extends AbstractMarkupLanguage {
+ private static final String CATEGORY_PREFIX = ":"; //$NON-NLS-1$
+
+ private static final Pattern STANDARD_EXTERNAL_LINK_FORMAT = Pattern.compile(".*?/([^/]+)/(\\{\\d+\\})"); //$NON-NLS-1$
+
+ private static final Pattern QUALIFIED_INTERNAL_LINK = Pattern.compile("([^/]+)/(.+)"); //$NON-NLS-1$
+
+ public MediaWikiLanguage() {
+ setName("MediaWiki"); //$NON-NLS-1$
+ setInternalLinkPattern("/wiki/{0}"); //$NON-NLS-1$
+ }
+
+ /**
+ * Convert a page name to an href to the page.
+ *
+ * @param pageName
+ * the name of the page to target
+ *
+ * @return the href to access the page
+ *
+ * @see MarkupLanguage#getInternalLinkPattern()
+ */
+ public String toInternalHref(String pageName) {
+ String pageId = pageName.replace(' ', '_');
+ // FIXME: other character encodings occur here, not just ' '
+
+ if (pageId.startsWith(CATEGORY_PREFIX) && pageId.length() > CATEGORY_PREFIX.length()) { // category
+ return pageId.substring(CATEGORY_PREFIX.length());
+ } else if (pageId.startsWith("#")) { //$NON-NLS-1$
+ // internal anchor
+ return pageId;
+ }
+ if (QUALIFIED_INTERNAL_LINK.matcher(pageId).matches()) {
+ Matcher matcher = STANDARD_EXTERNAL_LINK_FORMAT.matcher(internalLinkPattern);
+ if (matcher.matches()) {
+ return internalLinkPattern.substring(0, matcher.start(1)) + pageId;
+ }
+ }
+ return MessageFormat.format(super.internalLinkPattern, pageId);
+ }
+
+ @Override
+ public IdGenerationStrategy getIdGenerationStrategy() {
+ return new MediaWikiIdGenerationStrategy();
+ }
+
+ @Override
+ protected void addStandardBlocks(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ blocks.add(new HeadingBlock());
+ blocks.add(new ListBlock());
+
+ if (hasPreformattedBlock()) {
+ // preformatted blocks are lines that start with a single space, and thus are non-optimal for
+ // repository usage.
+ blocks.add(new PreformattedBlock());
+ }
+
+ blocks.add(new TableBlock());
+
+ for (Block block : blocks) {
+ if (block instanceof ParagraphBlock) {
+ continue;
+ }
+ paragraphBreakingBlocks.add(block);
+ }
+
+ }
+
+ private boolean hasPreformattedBlock() {
+ return configuration == null ? true : !configuration.isOptimizeForRepositoryUsage();
+ }
+
+ @Override
+ protected void addStandardPhraseModifiers(PatternBasedSyntax phraseModifierSyntax) {
+ phraseModifierSyntax.beginGroup("(?:(?<=[\\s\\.,\\\"'?!;:\\)\\(\\{\\}\\[\\]])|^)(?:", 0); //$NON-NLS-1$
+ phraseModifierSyntax.add(new EscapePhraseModifier());
+ phraseModifierSyntax.add(new SimplePhraseModifier("'''''", new SpanType[] { SpanType.BOLD, SpanType.ITALIC }, //$NON-NLS-1$
+ true));
+ phraseModifierSyntax.add(new SimplePhraseModifier("'''", SpanType.BOLD, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("''", SpanType.ITALIC, true)); //$NON-NLS-1$
+ phraseModifierSyntax.endGroup(")(?=\\W|$)", 0); //$NON-NLS-1$
+
+ boolean escapingHtml = configuration == null ? false : configuration.isEscapingHtmlAndXml();
+
+ if (!escapingHtml) {
+ String[] allowedHtmlTags = new String[] { // HANDLED BY LineBreakToken "<br>",
+ // HANDLED BY LineBreakToken "<br/>",
+ "b", "big", "blockquote", "caption", "center", "cite", "code", "dd", "del", "div", "dl", "dt", "em", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$
+ "font", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "i", "ins", "li", "ol", "p", "pre", "rb", "rp", "rt", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$ //$NON-NLS-15$ //$NON-NLS-16$ //$NON-NLS-17$
+ "ruby", "s", "small", "span", "strike", "strong", "sub", "sup", "table", "td", "th", "tr", "tt", "u", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$ //$NON-NLS-13$ //$NON-NLS-14$
+ "ul", "var" }; //$NON-NLS-1$ //$NON-NLS-2$
+ phraseModifierSyntax.add(new LimitedHtmlEndTagPhraseModifier(allowedHtmlTags));
+ phraseModifierSyntax.add(new LimitedHtmlStartTagPhraseModifier(allowedHtmlTags));
+ phraseModifierSyntax.add(new HtmlCommentPhraseModifier());
+ }
+ }
+
+ @Override
+ protected void addStandardTokens(PatternBasedSyntax tokenSyntax) {
+ tokenSyntax.add(new LineBreakToken());
+ tokenSyntax.add(new EntityReferenceReplacementToken("(tm)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(TM)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(c)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(C)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(r)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(R)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new ImageReplacementToken());
+ tokenSyntax.add(new HyperlinkInternalReplacementToken());
+ tokenSyntax.add(new HyperlinkExternalReplacementToken());
+ tokenSyntax.add(new ImpliedHyperlinkReplacementToken());
+ tokenSyntax.add(new PatternLiteralReplacementToken("(?:(?<=\\w\\s)(----)(?=\\s\\w))", "<hr/>")); // horizontal rule //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new TemplateReplacementToken());
+ tokenSyntax.add(new org.eclipse.mylyn.internal.wikitext.mediawiki.core.token.EntityReferenceReplacementToken());
+ }
+
+ @Override
+ protected Block createParagraphBlock() {
+ ParagraphBlock paragraphBlock = new ParagraphBlock(hasPreformattedBlock());
+ if (configuration != null && configuration.isNewlinesMustCauseLineBreak()) {
+ paragraphBlock.setNewlinesCauseLineBreak(true);
+ }
+ return paragraphBlock;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.classpath b/org.eclipse.mylyn.wikitext.mediawiki.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.project b/org.eclipse.mylyn.wikitext.mediawiki.ui/.project
new file mode 100644
index 0000000..abeb235
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.mediawiki.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..4282bfa
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,339 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..a8799c2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:38 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..a0c36b1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Thu Aug 14 22:13:32 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.internal=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.mediawiki.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3ddcf4e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.mediawiki.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.mediawiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)"
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.mylyn.internal.wikitext.mediawiki.ui;x-internal:=true
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/about.html b/org.eclipse.mylyn.wikitext.mediawiki.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/build.properties b/org.eclipse.mylyn.wikitext.mediawiki.ui/build.properties
new file mode 100644
index 0000000..72bb3e8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/build.properties
@@ -0,0 +1,21 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ help/
+
+
+src.includes=about.html
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/help/cheatSheet/MediaWiki.mediawiki b/org.eclipse.mylyn.wikitext.mediawiki.ui/help/cheatSheet/MediaWiki.mediawiki
new file mode 100644
index 0000000..45b04d4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/help/cheatSheet/MediaWiki.mediawiki
@@ -0,0 +1,103 @@
+=== MediaWiki Markup Cheat Sheet ===
+
+==== Phrase Modifiers ====
+
+{|
+| <nowiki>'''bold'''</nowiki> || '''bold'''
+|-
+| <nowiki>''italic''</nowiki> || ''italic''
+|-
+| <nowiki>'''''bold-italic'''''</nowiki> || '''''bold-italic'''''
+|-
+| <nowiki>X<sup>2</sup></nowiki> || X<sup>2</sup>
+|-
+| <nowiki>X<sub>i</sub></nowiki> || X<sub>i</sub>
+|}
+
+==== Block Modifiers ====
+
+{|
+| <nowiki>==Heading 2==</nowiki> || <h2>Heading 2</h2>
+|-
+| <nowiki>===Heading 3===</nowiki> || <h3>Heading 3</h3>
+|-
+| preformatted || Start line with a single space
+|}
+
+==== Links ====
+
+<nowiki>http://www.example.com</nowiki><br/>
+<nowiki>[http://www.example.com | Example]</nowiki>
+
+==== Images ====
+
+<nowiki>[[Image:images/logo.png]]</nowiki>
+
+==== Punctuation ====
+
+{|
+| <nowiki>em — dash</nowiki> || em — dash
+|-
+| <nowiki>en – dash</nowiki> || en – dash
+|-
+| <nowiki>foo(tm)</nowiki> || foo(tm)
+|-
+| <nowiki>foo(r)</nowiki> || foo(r)
+|-
+| <nowiki>foo(c)</nowiki> || foo(c)
+|}
+
+==== Tables ====
+
+ {|
+ | Apples || Oranges |
+ |-
+ | Kiwis || Cherries |
+ |}
+
+==== Lists ====
+
+===== Bulleted Lists =====
+
+ * one
+ ** one.one
+ ** one.two
+ * two
+
+* one
+** one.one
+** one.two
+* two
+
+===== Numeric Lists =====
+
+ # one
+ ## one.one
+ ## one.two
+ # two
+
+# one
+## one.one
+## one.two
+# two
+
+===== Definition Lists =====
+
+ ; one : definition
+ : alternate definition
+ ; two : definition two
+
+; one : definition
+: alternate definition
+; two : definition two
+
+
+ ==== Other ====
+
+{|
+| <nowiki>----</nowiki> || Horizontal Rule (<nowiki><hr/></nowiki>)
+|-
+| <nowiki><!-- comment --></nowiki> || ''not rendered''
+|-
+| <nowiki><br/></nowiki> || newline within a paragraph
+|}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.properties b/org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.properties
new file mode 100644
index 0000000..5f8bbec
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.properties
@@ -0,0 +1,30 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+#Properties file for org.eclipse.mylyn.wikitext.mediawiki.ui
+template.description.0 = '''bold'''
+template.description.1 = ''italic''
+template.description.2 = '''''bold-italic'''''
+template.description.3 = Heading 1
+template.description.4 = Heading 2
+template.description.5 = Heading 3
+template.description.6 = Heading 4
+template.description.7 = Heading 5
+template.description.8 = Heading 6
+template.description.9 = List (numeric)
+template.description.10 = List (level 2, numeric)
+template.description.11 = List (bulleted)
+template.description.12 = List (level 2, bulleted)
+template.description.13 = Definition List
+template.description.14 = [http://www.eclipse.org/mylyn]
+
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText MediaWiki UI
+template.description.14 = comment
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.xml b/org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.xml
new file mode 100644
index 0000000..6b630f1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/plugin.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.cheatSheet">
+ <content
+ contentLanguage="MediaWiki"
+ markupLanguage="MediaWiki"
+ resource="help/cheatSheet/MediaWiki.mediawiki">
+ </content>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.contentAssist">
+ <templates
+ markupLanguage="MediaWiki">
+ <!-- phrase modifiers -->
+ <template name="'''" description="%template.description.0" content="'''${text}''' $"/>
+ <template name="''" description="%template.description.1" content="''${text}'' $"/>
+ <template name="'''''" description="%template.description.2" content="'''''${text}''''' $"/>
+ <template name="<!--" description="%template.description.14" content="<!-- ${text} -->"/>
+
+ <!-- block templates -->
+
+ <template name="= " description="%template.description.3" content="\n= ${text} =\n\n" block="true"/>
+ <template name="== " description="%template.description.4" content="\n== ${text} ==\n\n" block="true"/>
+ <template name="=== " description="%template.description.5" content="\n=== ${text} ===\n\n" block="true"/>
+ <template name="==== " description="%template.description.6" content="\n==== ${text} ====\n\n" block="true"/>
+ <template name="===== " description="%template.description.7" content="\n===== ${text} =====\n\n" block="true"/>
+ <template name="====== " description="%template.description.8" content="\n====== ${text} ======\n\n" block="true"/>
+ <template name="# " description="%template.description.9" content="\n# ${text}\n# ${text2}\n\n" block="true"/>
+ <template name="## " description="%template.description.10" content="\n## ${text}\n## ${text2}\n\n" block="true"/>
+ <template name="* " description="%template.description.11" content="\n* ${text}\n* ${text2}\n\n" block="true"/>
+ <template name="** " description="%template.description.12" content="\n** ${text}\n** ${text2}\n\n" block="true"/>
+ <template name=";: " description="%template.description.13" content="\n; ${text} : ${definition}\n; ${text2} : ${definition2}\n\n" block="true"/>
+
+ <!-- phrase modifiers -->
+ <template name="[hyperlink]" description="[http://www.eclipse.org/mylyn]" content="[${text}] $"/>
+ </templates>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.ui/src/org/eclipse/mylyn/internal/wikitext/mediawiki/ui/package-info.java b/org.eclipse.mylyn.wikitext.mediawiki.ui/src/org/eclipse/mylyn/internal/wikitext/mediawiki/ui/package-info.java
new file mode 100644
index 0000000..0203182
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.mediawiki.ui/src/org/eclipse/mylyn/internal/wikitext/mediawiki/ui/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * @author David Green
+ */
+package org.eclipse.mylyn.internal.wikitext.mediawiki.ui;
+
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.classpath b/org.eclipse.mylyn.wikitext.tasks.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.cvsignore b/org.eclipse.mylyn.wikitext.tasks.ui/.cvsignore
new file mode 100644
index 0000000..5e94824
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.cvsignore
@@ -0,0 +1,2 @@
+.refactorings
+bin
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.project b/org.eclipse.mylyn.wikitext.tasks.ui/.project
new file mode 100644
index 0000000..051d268
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.tasks.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.settings/.api_filters b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/.api_filters
new file mode 100644
index 0000000..272e179
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/.api_filters
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component id="org.eclipse.mylyn.wikitext.tasks.ui" version="2">
+<resource path="src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/MarkupViewerPreferencePage.java" type="org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences.MarkupViewerPreferencePage">
+<filter id="640712815">
+<message_arguments>
+<message_argument value="HtmlViewer"/>
+<message_argument value="MarkupViewerPreferencePage"/>
+<message_argument value="setStylesheet(Stylesheet)"/>
+</message_arguments>
+</filter>
+</resource>
+<resource path="src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/MarkupViewerPreferencePage.java" type="org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences.MarkupViewerPreferencePage$Colors">
+<filter id="571473929">
+<message_arguments>
+<message_argument value="ColorRegistry"/>
+<message_argument value="Colors"/>
+</message_arguments>
+</filter>
+</resource>
+<resource path="src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java" type="org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension">
+<filter id="640712815">
+<message_arguments>
+<message_argument value="HtmlViewer"/>
+<message_argument value="MarkupTaskEditorExtension<MarkupLanguageType>"/>
+<message_argument value="setStylesheet(Stylesheet)"/>
+</message_arguments>
+</filter>
+</resource>
+<resource path="src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java" type="org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension$TaskMarkupViewerConfiguration">
+<filter id="643842064">
+<message_arguments>
+<message_argument value="AnnotationHyperlinkDetector"/>
+<message_argument value="TaskMarkupViewerConfiguration"/>
+<message_argument value="createAnnotationHyperlinkDetector()"/>
+</message_arguments>
+</filter>
+</resource>
+</component>
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4705dd0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:46 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.tasks.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0c790cf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,44 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.tasks.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.views,
+ org.eclipse.ui.ide,
+ org.eclipse.jface.text,
+ org.eclipse.core.expressions,
+ org.eclipse.core.resources,
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.2,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.2,4.0.0)",
+ org.eclipse.mylyn.context.core;bundle-version="[3.2,4.0.0)",
+ org.eclipse.mylyn.context.ui;bundle-version="[3.2,4.0.0)",
+ org.eclipse.mylyn.monitor.core;bundle-version="[3.2,4.0.0)",
+ org.eclipse.mylyn.monitor.ui;bundle-version="[3.2,4.0.0)",
+ org.eclipse.mylyn.wikitext.confluence.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.confluence.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.mediawiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.mediawiki.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.textile.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.textile.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.tracwiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.tracwiki.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.twiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.twiki.ui;bundle-version="[1.1.0,1.2.0)"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
+Bundle-Localization: plugin
+Export-Package: org.eclipse.mylyn.internal.wikitext.tasks.ui;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tasks.ui.actions;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tasks.ui.util;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tasks.ui.util.bugzilla;x-internal:=true,
+ org.eclipse.mylyn.wikitext.tasks.ui.editor
+Bundle-Activator: org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextTasksUiPlugin
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/about.html b/org.eclipse.mylyn.wikitext.tasks.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/build.properties b/org.eclipse.mylyn.wikitext.tasks.ui/build.properties
new file mode 100644
index 0000000..45d33d4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/build.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.properties,\
+ about.html,\
+ plugin.xml,\
+ icons/
+
+src.includes=about.html
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-decrease.gif b/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-decrease.gif
new file mode 100644
index 0000000..645a58f
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-decrease.gif differ
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-folding.gif b/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-folding.gif
new file mode 100644
index 0000000..bf8439c
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-folding.gif differ
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-increase.gif b/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-increase.gif
new file mode 100644
index 0000000..98a2586
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.tasks.ui/icons/elcl16/interest-increase.gif differ
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/plugin.properties b/org.eclipse.mylyn.wikitext.tasks.ui/plugin.properties
new file mode 100644
index 0000000..51fed69
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/plugin.properties
@@ -0,0 +1,40 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.tasks.ui
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Tasks UI
+
+taskEditorExtension.name.0 = TWiki
+taskEditorExtension.name.1 = Textile
+taskEditorExtension.name.3 = TracWiki
+taskEditorExtension.name.4 = MediaWiki
+taskEditorExtension.name.5 = Confluence
+
+structureBridge.name.0 = WikiText Structure Bridge
+uiBridge.name.0 = WikiText Context UI Bridge
+
+commands.category.name=WikiText Context
+commands.category.description=WikiText Task-Focused Interface Commands
+command.description.0 = Toggle Active Folding
+command.name.0 = Toggle Active Folding
+action.label.0 = Focus Editor on Active Task
+action.tooltip.0 = Automatically Fold Uninteresting Elements
+
+InterestIncrementAction.label = Mark as Landmark
+InterestIncrementAction.tooltip = Mark the selected element as a landmark
+InterestDecrementAction.label = Remove from Context
+InterestDecrementAction.tooltip = Mark selected element as uninteresting
+
+page.name.0 = Appearance
+fontDefinition.monospace.label = Task Editor - Monospace Font
+fontDefinition.monospace.description = Text font used when displaying monospace text in the task editor.\n\
+ Used to display text that is teletype, preformatted or code.
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/plugin.xml b/org.eclipse.mylyn.wikitext.tasks.ui/plugin.xml
new file mode 100644
index 0000000..29251be
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/plugin.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.context.core.bridges">
+ <structureBridge
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextContextStructureBridge"
+ name="%structureBridge.name.0"
+ parentContentType="resource">
+ </structureBridge>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.context.ui.bridges">
+ <uiBridge
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextContextUiBridge"
+ contentType="org.eclipse.mylyn.wikitext"
+ name="%uiBridge.name.0">
+ </uiBridge>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.context.ui.startup">
+ <startup
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextContextUiStartup">
+ </startup>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <taskEditorExtension
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.editor.TextileMarkupTaskEditorExtension"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.textileTaskEditorExtension"
+ name="%taskEditorExtension.name.1">
+ </taskEditorExtension>
+ <repositoryAssociation
+ connectorKind="bugzilla"
+ taskEditorExtension="org.eclipse.mylyn.wikitext.tasks.ui.editor.textileTaskEditorExtension">
+ </repositoryAssociation>
+ <repositoryAssociation
+ connectorKind="local"
+ taskEditorExtension="org.eclipse.mylyn.wikitext.tasks.ui.editor.textileTaskEditorExtension">
+ </repositoryAssociation>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <taskEditorExtension
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.editor.TracWikiMarkupTaskEditorExtension"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.tracWikiTaskEditorExtension"
+ name="%taskEditorExtension.name.3">
+ </taskEditorExtension>
+ <repositoryAssociation
+ connectorKind="trac"
+ taskEditorExtension="org.eclipse.mylyn.wikitext.tasks.ui.editor.tracWikiTaskEditorExtension">
+ </repositoryAssociation>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <taskEditorExtension
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.editor.TWikiMarkupTaskEditorExtension"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.twikiTaskEditorExtension"
+ name="%taskEditorExtension.name.0">
+ </taskEditorExtension>
+ <repositoryAssociation
+ connectorKind="xplanner"
+ taskEditorExtension="org.eclipse.mylyn.wikitext.tasks.ui.editor.twikiTaskEditorExtension">
+ </repositoryAssociation>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <taskEditorExtension
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.editor.MediaWikiMarkupTaskEditorExtension"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.mediaWikiTaskEditorExtension"
+ name="%taskEditorExtension.name.4">
+ </taskEditorExtension>
+ </extension>
+
+ <extension
+ point="org.eclipse.mylyn.tasks.ui.taskEditorExtensions">
+ <taskEditorExtension
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.editor.ConfluenceMarkupTaskEditorExtension"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.confluenceTaskEditorExtension"
+ name="%taskEditorExtension.name.5">
+ </taskEditorExtension>
+ <repositoryAssociation
+ connectorKind="jira"
+ taskEditorExtension="org.eclipse.mylyn.wikitext.tasks.ui.editor.confluenceTaskEditorExtension">
+ </repositoryAssociation>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <category
+ name="%commands.category.name"
+ description="%commands.category.description"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.commands">
+ </category>
+ <command
+ categoryId="org.eclipse.mylyn.wikitext.tasks.ui.commands"
+ description="%command.description.0"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.folding.auto"
+ name="%command.name.0">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.editorActions">
+ <editorContribution
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editorContribution1"
+ targetID="org.eclipse.mylyn.wikitext.ui.editor.markupEditor">
+ <action
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.actions.ToggleActiveFoldingEditorActionDelegate"
+ definitionId="org.eclipse.mylyn.wikitext.tasks.ui.editor.folding.auto"
+ icon="icons/elcl16/interest-folding.gif"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.editor.folding.auto"
+ label="%action.label.0"
+ state="true"
+ style="toggle"
+ tooltip="%action.tooltip.0"
+ toolbarPath="org.eclipse.ui.edit.text.actionSet.presentation/Presentation">
+ </action>
+ </editorContribution>
+ </extension>
+ <extension point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.interest.increase.contribution"
+ objectClass="org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestIncrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.increment"
+ enablesFor="*"
+ icon="icons/elcl16/interest-increase.gif"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.interest.increase.element"
+ label="%InterestIncrementAction.label"
+ menubarPath="group.reorganize"
+ tooltip="%InterestIncrementAction.tooltip">
+ </action>
+ <visibility>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </visibility>
+ </objectContribution>
+ <objectContribution
+ adaptable="false"
+ id="org.eclipse.mylyn.java.ui.interest.remove.contribution.elements"
+ objectClass="org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem">
+ <action
+ class="org.eclipse.mylyn.internal.context.ui.actions.InterestDecrementAction"
+ definitionId="org.eclipse.mylyn.context.ui.commands.interest.decrement"
+ enablesFor="*"
+ icon="icons/elcl16/interest-decrease.gif"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.interest.remove.element"
+ label="%InterestDecrementAction.label"
+ menubarPath="group.reorganize"
+ tooltip="%InterestDecrementAction.tooltip">
+ </action>
+ <visibility>
+ <systemProperty
+ name="org.eclipse.mylyn.context.core.context.active"
+ value="true">
+ </systemProperty>
+ </visibility>
+ </objectContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.mylyn.wikitext.ui.editor.preferences.EditorPreferencePage"
+ class="org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences.MarkupViewerPreferencePage"
+ id="org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences.MarkupViewerPreferencePage"
+ name="%page.name.0">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.themes">
+ <fontDefinition
+ categoryId="org.eclipse.mylyn.tasks.ui.presentation"
+ id="org.eclipse.mylyn.wikitext.tasks.ui.monospaceFont"
+ isEditable="true"
+ label="%fontDefinition.monospace.label"
+ value="Courier New-regular-13">
+ <description>
+ %fontDefinition.monospace.description
+ </description>
+ <fontValue
+ os="linux"
+ value="Monospace-regular-13"/>
+ <fontValue
+ os="macosx"
+ value="Courier-regular-13"/>
+ </fontDefinition>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/ActiveFoldingEditorTracker.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/ActiveFoldingEditorTracker.java
new file mode 100644
index 0000000..f60d403
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/ActiveFoldingEditorTracker.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.internal.wikitext.ui.editor.IFoldingStructure;
+import org.eclipse.mylyn.monitor.ui.AbstractEditorTracker;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+
+/**
+ *
+ * based on implementation of ActiveFoldingEditorTracker in org.eclipse.mylyn.java.ui
+ *
+ * @author David Green
+ */
+public class ActiveFoldingEditorTracker extends AbstractEditorTracker {
+
+ private final Map<IEditorPart, ActiveFoldingListener> partToListener = new HashMap<IEditorPart, ActiveFoldingListener>();
+
+ public ActiveFoldingEditorTracker(IWorkbench workbench) {
+ install(workbench);
+ }
+
+ @Override
+ public void install(IWorkbench workbench) {
+ super.install(workbench);
+ for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
+ for (IWorkbenchPage page : window.getPages()) {
+ for (IEditorReference reference : page.getEditorReferences()) {
+ IEditorPart editorPart = reference.getEditor(false);
+ if (editorPart != null) {
+ editorOpened(editorPart);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void editorBroughtToTop(IEditorPart part) {
+ // nothing to do
+ }
+
+ @Override
+ protected void editorClosed(IEditorPart part) {
+ ActiveFoldingListener listener = partToListener.remove(part);
+ if (listener != null) {
+ listener.dispose();
+ }
+ }
+
+ @Override
+ protected void editorOpened(IEditorPart part) {
+ IFoldingStructure foldingStructure = (IFoldingStructure) part.getAdapter(IFoldingStructure.class);
+ if (foldingStructure == null) {
+ return;
+ }
+ if (partToListener.containsKey(part)) {
+ return;
+ }
+ partToListener.put(part, new ActiveFoldingListener(part, foldingStructure));
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/ActiveFoldingListener.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/ActiveFoldingListener.java
new file mode 100644
index 0000000..dc95e72
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/ActiveFoldingListener.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.mylyn.context.core.AbstractContextListener;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextChangeEvent;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.IFoldingStructure;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem.Visitor;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ *
+ * based on implementation of ActiveFoldingListener in org.eclipse.mylyn.java.ui
+ *
+ * @author David Green
+ * @author Shawn Minto bug 274706 updated to use new 3.2 APIs.
+ */
+class ActiveFoldingListener extends AbstractContextListener {
+
+ private final IEditorPart part;
+
+ private final IFoldingStructure foldingStructure;
+
+ private org.eclipse.jface.util.IPropertyChangeListener preferenceListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (WikiTextTasksUiPlugin.PREF_ACTIVE_FOLDING_ENABLED.equals(event.getProperty())) {
+ Object newValue = event.getNewValue();
+ foldingEnabled = Boolean.TRUE.toString().equals(newValue.toString());
+ updateFolding(false);
+ }
+ }
+ };
+
+ private boolean foldingEnabled;
+
+ private final AbstractContextStructureBridge bridge;
+
+ private final IPreferenceStore preferences;
+
+ public ActiveFoldingListener(IEditorPart part, IFoldingStructure foldingStructure) {
+ this.part = part;
+ this.foldingStructure = foldingStructure;
+ bridge = ContextCore.getStructureBridge(WikiTextContextStructureBridge.CONTENT_TYPE);
+ ContextCore.getContextManager().addListener(this);
+ preferences = WikiTextTasksUiPlugin.getDefault().getPreferenceStore();
+ preferences.addPropertyChangeListener(preferenceListener);
+ foldingEnabled = preferences.getBoolean(WikiTextTasksUiPlugin.PREF_ACTIVE_FOLDING_ENABLED);
+ updateFolding(false);
+ }
+
+ private void updateFolding(boolean elementsDeleted) {
+ if (!foldingStructure.isFoldingEnabled()) {
+ return;
+ }
+ if (!foldingEnabled || !ContextCore.getContextManager().isContextActive()) {
+ foldingStructure.expandAll();
+ } else {
+ OutlineItem outline = (OutlineItem) part.getAdapter(OutlineItem.class);
+ if (outline != null) {
+ final List<OutlineItem> toExpand = new ArrayList<OutlineItem>();
+ outline.accept(new Visitor() {
+ public boolean visit(OutlineItem item) {
+ String identifier = bridge.getHandleIdentifier(item);
+ IInteractionElement element = ContextCore.getContextManager().getElement(identifier);
+ if (element != null && element.getInterest().isInteresting()) {
+ toExpand.add(item);
+ }
+ return true;
+ }
+ });
+ if (toExpand.isEmpty()) {
+ foldingStructure.collapseAll(elementsDeleted);
+ } else {
+ foldingStructure.expandElementsExclusive(toExpand, elementsDeleted);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void contextChanged(ContextChangeEvent event) {
+ switch (event.getEventKind()) {
+ case ACTIVATED:
+ if (foldingStructure.isFoldingEnabled()) {
+ updateFolding(false);
+ }
+ break;
+ case DEACTIVATED:
+ if (foldingStructure.isFoldingEnabled()) {
+ foldingStructure.expandAll();
+ }
+ break;
+ case CLEARED:
+ if (event.isActiveContext()) {
+ if (foldingStructure.isFoldingEnabled()) {
+ if (!foldingEnabled || !ContextCore.getContextManager().isContextActive()) {
+ foldingStructure.expandAll();
+ } else {
+ foldingStructure.collapseAll(true);
+ }
+ }
+ }
+ break;
+
+ case INTEREST_CHANGED:
+ if (foldingStructure.isFoldingEnabled()) {
+ updateFolding(false);
+ }
+ break;
+ case ELEMENTS_DELETED:
+ if (foldingStructure.isFoldingEnabled()) {
+ updateFolding(true);
+ }
+ break;
+ }
+ }
+
+ public void dispose() {
+ if (preferenceListener != null) {
+ preferences.removePropertyChangeListener(preferenceListener);
+ preferenceListener = null;
+ }
+ ContextCore.getContextManager().removeListener(this);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextStructureBridge.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextStructureBridge.java
new file mode 100644
index 0000000..8c60623
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextStructureBridge.java
@@ -0,0 +1,292 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import java.io.BufferedInputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A Mylyn {@link AbstractContextStructureBridge context structure bridge} for wikitext files.
+ *
+ * @author David Green
+ */
+public class WikiTextContextStructureBridge extends AbstractContextStructureBridge {
+
+ private static final char HANDLE_FILE_SEPARATOR = ';';
+
+ public static final String CONTENT_TYPE = WikiText.CONTENT_TYPE;
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ if (object instanceof OutlineItem) {
+ return true;
+ } else if (object instanceof IFile) {
+ IFile file = (IFile) object;
+
+ try {
+ IContentDescription description = file.getContentDescription();
+ if (description != null) {
+ IContentType contentType = description.getContentType();
+ if (contentType != null) {
+ if (isWikiText(contentType)) {
+ return true;
+ }
+ }
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+
+ String languageName = WikiText.getMarkupLanguageNameForFilename(file.getName());
+ return languageName != null;
+ }
+ return false;
+ }
+
+ private boolean isWikiText(IContentType contentType) {
+ if (WikiText.CONTENT_TYPE.equals(contentType.getId())) {
+ return true;
+ }
+ IContentType baseType = contentType.getBaseType();
+ if (baseType != null) {
+ return isWikiText(baseType);
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return handle != null;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return true;
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ Object object = getObjectForHandle(handle);
+ if (object instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) object;
+ if (!item.getChildren().isEmpty()) {
+ List<String> handles = new ArrayList<String>(item.getChildren().size());
+ for (OutlineItem child : item.getChildren()) {
+ handles.add(getHandleIdentifier(child));
+ }
+ return handles;
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ if (elementHandle.indexOf(HANDLE_FILE_SEPARATOR) == -1) {
+ return parentContentType;
+ }
+ return CONTENT_TYPE;
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object object, int offset) {
+ IResource resource = null;
+ try {
+ if (object instanceof IResource) {
+ resource = (IResource) object;
+ } else if (object instanceof IMarker) {
+ resource = ((IMarker) object).getResource();
+ } else {
+ try {
+ // works with ConcreteMarker without creating a compile-time dependency on internals
+ IMarker marker = (IMarker) object.getClass().getMethod("getMarker").invoke(object); //$NON-NLS-1$
+ resource = marker.getResource();
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ if (resource instanceof IFile) {
+ IFile file = (IFile) resource;
+ if (acceptsObject(file)) {
+ OutlineItem outline = getOutline(file);
+ if (outline != null) {
+ OutlineItem item = outline.findNearestMatchingOffset(offset);
+ if (item != null) {
+ return getHandleIdentifier(item);
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) object;
+ if (item.getParent() == null) {
+ return getFile(item).getName();
+ } else {
+ return item.getLabel();
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ @Override
+ public Object getObjectForHandle(String handle) {
+ if (handle == null) {
+ return null;
+ }
+ int idxOfSeparator = handle.indexOf(HANDLE_FILE_SEPARATOR);
+ String filename = handle;
+ if (idxOfSeparator != -1) {
+ filename = handle.substring(0, idxOfSeparator);
+ }
+ IFile file;
+ try {
+ file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(filename));
+ } catch (Exception e) {
+ // be error-tolerant since we don't know much about the handle at this point
+ return null;
+ }
+ if (file != null) {
+ if (idxOfSeparator != -1) {
+ String headingId = handle.substring(idxOfSeparator + 1);
+ OutlineItem outline = getOutline(file);
+ if (outline != null) {
+ OutlineItem item = outline.findItemById(headingId);
+ return item;
+ }
+ } else {
+ return file;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+ Object object = getObjectForHandle(handle);
+ if (object instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) object;
+ if (item.getParent() != null) {
+ return getHandleIdentifier(item.getParent());
+ } else {
+ return getHandleIdentifier(getFile(item));
+ }
+ } else if (object instanceof IFile) {
+ AbstractContextStructureBridge parentBridge = ContextCore.getStructureBridge(parentContentType);
+ return parentBridge.getParentHandle(handle);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ Object object = getObjectForHandle(handle);
+ if (object instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) object;
+ return item.getParent() == null;
+ }
+ return false;
+ }
+
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) object;
+ return item.getResourcePath() + HANDLE_FILE_SEPARATOR + item.getId();
+ } else if (object instanceof IFile && acceptsObject(object)) {
+ return ((IFile) object).getFullPath().toString();
+ }
+ return null;
+ }
+
+ private IPath getFullPath(OutlineItem item) {
+ String resourcePath = item.getResourcePath();
+ return resourcePath == null ? null : new Path(resourcePath);
+ }
+
+ private OutlineItem getOutline(IFile file) {
+ // FIXME: is editor integration the way to go?? we probably need some kind of core model
+ IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+ if (editorPart != null) {
+ OutlineItem outline = (OutlineItem) editorPart.getAdapter(OutlineItem.class);
+ if (outline != null) {
+ return outline;
+ }
+ }
+ MarkupLanguage markupLanguage = WikiText.getMarkupLanguageForFilename(file.getName());
+ if (markupLanguage != null) {
+ OutlineParser parser = new OutlineParser(markupLanguage);
+ try {
+ String contents = getContents(file);
+ OutlineItem outline = parser.parse(contents);
+ outline.setResourcePath(file.getFullPath().toString());
+ return outline;
+ } catch (Exception e) {
+ // ignore
+ return null;
+ }
+ }
+ return null;
+ }
+
+ private String getContents(IFile file) throws Exception {
+ String charset = file.getCharset();
+ StringWriter writer = new StringWriter();
+ Reader reader = new InputStreamReader(new BufferedInputStream(file.getContents()), charset);
+ int i;
+ while ((i = reader.read()) != -1) {
+ writer.write(i);
+ }
+ return writer.toString();
+ }
+
+ IFile getFile(OutlineItem item) {
+ IPath fullPath = getFullPath(item);
+
+ return fullPath == null ? null : ResourcesPlugin.getWorkspace().getRoot().getFile(fullPath);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextUiBridge.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextUiBridge.java
new file mode 100644
index 0000000..e1c87e6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextUiBridge.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.ShowInContext;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * a UI context bridge for WikiText.
+ *
+ * @author David Green
+ */
+public class WikiTextContextUiBridge extends AbstractContextUiBridge {
+
+ public WikiTextContextUiBridge() {
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return editorPart.getAdapter(OutlineItem.class) != null;
+ }
+
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editorPart) {
+ List<TreeViewer> viewers = new ArrayList<TreeViewer>();
+ if (acceptsEditor(editorPart)) {
+ try {
+ IContentOutlinePage outlinePage = (IContentOutlinePage) editorPart.getAdapter(IContentOutlinePage.class);
+ if (outlinePage != null) {
+ Method method = ContentOutlinePage.class.getDeclaredMethod("getTreeViewer", new Class[] {}); //$NON-NLS-1$
+ method.setAccessible(true);
+ viewers.add((TreeViewer) method.invoke(outlinePage, new Object[] {}));
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ return viewers;
+ }
+
+ @Override
+ public String getContentType() {
+ return WikiTextContextStructureBridge.CONTENT_TYPE;
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ OutlineItem outline = (OutlineItem) editor.getAdapter(OutlineItem.class);
+ if (outline != null && selection != null) {
+ return outline.findNearestMatchingOffset(selection.getOffset());
+ }
+ return outline;
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ Object adapter = input.getAdapter(OutlineItem.class);
+ if (adapter != null) {
+ String handle = ContextCore.getStructureBridge(adapter).getHandleIdentifier(adapter);
+ return ContextCore.getContextManager().getElement(handle);
+ }
+ return null;
+ }
+
+ @Override
+ public void open(IInteractionElement element) {
+ AbstractContextStructureBridge structureBridge = ContextCore.getStructureBridge(WikiTextContextStructureBridge.CONTENT_TYPE);
+ if (structureBridge instanceof WikiTextContextStructureBridge) {
+ Object object = structureBridge.getObjectForHandle(element.getHandleIdentifier());
+ OutlineItem item = null;
+ if (object instanceof OutlineItem) {
+ item = (OutlineItem) object;
+ object = ((WikiTextContextStructureBridge) structureBridge).getFile(item);
+ }
+ if (object instanceof IFile) {
+ FileEditorInput editorInput = new FileEditorInput((IFile) object);
+ try {
+ IEditorPart editor = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow()
+ .getActivePage()
+ .openEditor(editorInput, "org.eclipse.mylyn.wikitext.ui.editor.markupEditor"); //$NON-NLS-1$
+ if (item != null && editor instanceof IShowInTarget) {
+ ((IShowInTarget) editor).show(new ShowInContext(editorInput, new StructuredSelection(item)));
+ }
+ } catch (PartInitException e) {
+ WikiTextTasksUiPlugin.getDefault().log(e);
+ }
+ }
+ }
+
+ }
+
+ @Override
+ public void close(IInteractionElement element) {
+ try {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ List<IEditorReference> editors = new ArrayList<IEditorReference>(4);
+ for (IEditorReference reference : page.getEditorReferences()) {
+ try {
+ if (reference.getEditorInput() instanceof IFileEditorInput) {
+ IFileEditorInput input = (IFileEditorInput) reference.getEditorInput();
+ if (input.getFile().getFullPath().toString().equals(element.getHandleIdentifier())) {
+ editors.add(reference);
+ }
+ }
+ } catch (PartInitException e) {
+ // ignore
+ }
+ }
+ if (!editors.isEmpty()) {
+ page.closeEditors(editors.toArray(new IEditorReference[editors.size()]), true);
+ }
+ }
+ } catch (Throwable t) {
+ WikiTextTasksUiPlugin.getDefault().log(t);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextUiStartup.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextUiStartup.java
new file mode 100644
index 0000000..c106001
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextContextUiStartup.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import org.eclipse.mylyn.context.ui.IContextUiStartup;
+
+/**
+ * @author David Green
+ */
+public class WikiTextContextUiStartup implements IContextUiStartup {
+
+ public void lazyStartup() {
+ WikiTextTasksUiPlugin.getDefault().contextUiStartup();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextTasksUiPlugin.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextTasksUiPlugin.java
new file mode 100644
index 0000000..b8a3503
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextTasksUiPlugin.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.monitor.ui.MonitorUi;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ *
+ * @author David Green
+ */
+public class WikiTextTasksUiPlugin extends AbstractUIPlugin {
+
+ public static final String FONT_REGISTRY_KEY_DEFAULT_FONT = "org.eclipse.mylyn.tasks.ui.fonts.task.editor.comment"; //$NON-NLS-1$
+
+ public static final String FONT_REGISTRY_KEY_MONOSPACE_FONT = "org.eclipse.mylyn.wikitext.tasks.ui.monospaceFont"; //$NON-NLS-1$
+
+ /**
+ * the preference key for active folding
+ */
+ public static final String PREF_ACTIVE_FOLDING_ENABLED = "org.eclipse.mylyn.context.ui.editor.folding.enabled"; //$NON-NLS-1$
+
+ private static WikiTextTasksUiPlugin plugin;
+
+ private WikiTextUserInteractionMonitor userInteractionMonitor;
+
+ private ActiveFoldingEditorTracker activeFoldingEditorTracker;
+
+ public WikiTextTasksUiPlugin() {
+ plugin = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (userInteractionMonitor != null) {
+ MonitorUi.getSelectionMonitors().remove(userInteractionMonitor);
+ userInteractionMonitor = null;
+ }
+ if (activeFoldingEditorTracker != null) {
+ activeFoldingEditorTracker.dispose(PlatformUI.getWorkbench());
+ activeFoldingEditorTracker = null;
+ }
+ plugin = null;
+ super.stop(context);
+ }
+
+ public static WikiTextTasksUiPlugin getDefault() {
+ return plugin;
+ }
+
+ public void log(Throwable ce) {
+ if (ce instanceof CoreException) {
+ getLog().log(((CoreException) ce).getStatus());
+ } else {
+ log(IStatus.ERROR, ce.getMessage(), ce);
+ }
+ }
+
+ public void log(int severity, String message, Throwable exception) {
+ if (message == null) {
+ message = ""; //$NON-NLS-1$
+ }
+ ILog log = getLog();
+ IStatus status = null;
+ if (exception instanceof CoreException) {
+ status = ((CoreException) exception).getStatus();
+ }
+ if (status == null) {
+ status = new Status(severity, getPluginId(), severity, message, exception);
+ }
+ log.log(status);
+ }
+
+ public String getPluginId() {
+ return getBundle().getSymbolicName();
+ }
+
+ public IStatus createStatus(int statusCode, Throwable exception) {
+ return createStatus(null, statusCode, exception);
+ }
+
+ public IStatus createStatus(String message, int statusCode, Throwable exception) {
+ if (message == null && exception != null) {
+ message = exception.getClass().getName() + ": " + exception.getMessage(); //$NON-NLS-1$
+ }
+ Status status = new Status(statusCode, getPluginId(), statusCode, message, exception);
+ return status;
+ }
+
+ void contextUiStartup() {
+ userInteractionMonitor = new WikiTextUserInteractionMonitor();
+ MonitorUi.getSelectionMonitors().add(userInteractionMonitor);
+
+ activeFoldingEditorTracker = new ActiveFoldingEditorTracker(PlatformUI.getWorkbench());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextUserInteractionMonitor.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextUserInteractionMonitor.java
new file mode 100644
index 0000000..2819455
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/WikiTextUserInteractionMonitor.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui;
+
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ *
+ * @author David Green
+ */
+class WikiTextUserInteractionMonitor extends AbstractUserInteractionMonitor {
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ if (selection instanceof ITextSelection) {
+ OutlineItem item = (OutlineItem) part.getAdapter(OutlineItem.class);
+ if (item != null) {
+ OutlineItem relevantItem = item.findNearestMatchingOffset(((ITextSelection) selection).getOffset());
+ if (relevantItem == null) {
+ relevantItem = item;
+ }
+ handleElementSelection(part, relevantItem, contributeToContext);
+ }
+ } else if (selection instanceof IStructuredSelection) {
+ for (Object element : ((IStructuredSelection) selection).toArray()) {
+ if (element instanceof OutlineItem) {
+ handleElementSelection(part, element, contributeToContext);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/actions/ToggleActiveFoldingEditorActionDelegate.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/actions/ToggleActiveFoldingEditorActionDelegate.java
new file mode 100644
index 0000000..a9663db
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/actions/ToggleActiveFoldingEditorActionDelegate.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextTasksUiPlugin;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author David Green
+ */
+public class ToggleActiveFoldingEditorActionDelegate implements IEditorActionDelegate {
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ action.setChecked(isActiveFoldingEnabled());
+ }
+
+ private boolean isActiveFoldingEnabled() {
+ return WikiTextTasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ WikiTextTasksUiPlugin.PREF_ACTIVE_FOLDING_ENABLED);
+ }
+
+ public void run(IAction action) {
+ WikiTextTasksUiPlugin.getDefault().getPreferenceStore().setValue(
+ WikiTextTasksUiPlugin.PREF_ACTIVE_FOLDING_ENABLED, action.isChecked());
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java
new file mode 100644
index 0000000..0caa891
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/ConfluenceMarkupTaskEditorExtension.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
+
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
+
+public class ConfluenceMarkupTaskEditorExtension extends MarkupTaskEditorExtension<ConfluenceLanguage> {
+
+ public ConfluenceMarkupTaskEditorExtension() {
+ setMarkupLanguage(new ConfluenceLanguage());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java
new file mode 100644
index 0000000..a2a2667
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/MediaWikiMarkupTaskEditorExtension.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
+
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
+import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
+
+public class MediaWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension<MediaWikiLanguage> {
+
+ public MediaWikiMarkupTaskEditorExtension() {
+ setMarkupLanguage(new MediaWikiLanguage());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java
new file mode 100755
index 0000000..d091097
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TWikiMarkupTaskEditorExtension.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
+
+import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+public class TWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension<TWikiLanguage> {
+
+ public TWikiMarkupTaskEditorExtension() {
+ setMarkupLanguage(new TWikiLanguage());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java
new file mode 100644
index 0000000..bc5183a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TextileMarkupTaskEditorExtension.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
+
+import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TextileMarkupTaskEditorExtension extends MarkupTaskEditorExtension<TextileLanguage> {
+
+ public TextileMarkupTaskEditorExtension() {
+ setMarkupLanguage(new TextileLanguage());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java
new file mode 100644
index 0000000..6485307
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/editor/TracWikiMarkupTaskEditorExtension.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.editor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.AbstractTaskHyperlinkDetector;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.wikitext.tasks.ui.editor.MarkupTaskEditorExtension;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
+import org.eclipse.mylyn.wikitext.ui.viewer.AbstractTextSourceViewerConfiguration.HyperlinkDetectorDescriptorFilter;
+import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TracWikiMarkupTaskEditorExtension extends MarkupTaskEditorExtension<TracWikiLanguage> implements
+ HyperlinkDetectorDescriptorFilter {
+
+ private static class TracTaskHyperlinkDetector extends AbstractTaskHyperlinkDetector {
+
+ private final Pattern pattern = Pattern.compile("(?:(?<=[\\s\\.\\\"'?!;:\\)\\(\\{\\}\\[\\]-])|^)((?:comment:(\\d+):)?(?:#|ticket:)(\\d+))"); //$NON-NLS-1$
+
+ public TracTaskHyperlinkDetector() {
+ }
+
+ @Override
+ protected List<IHyperlink> detectHyperlinks(ITextViewer textViewer, String content, int index, int contentOffset) {
+ TaskRepository taskRepository = getTaskRepository(textViewer);
+ if (taskRepository != null && "trac".equals(taskRepository.getConnectorKind())) { //$NON-NLS-1$
+ List<IHyperlink> hyperlinks = null;
+ Matcher matcher = pattern.matcher(content);
+ while (matcher.find()) {
+ if (isInRegion(index, matcher)) {
+ if (hyperlinks == null) {
+ hyperlinks = new ArrayList<IHyperlink>();
+ }
+ String taskId = matcher.group(3);
+ hyperlinks.add(new TaskHyperlink(determineRegion(contentOffset, matcher), taskRepository,
+ taskId));
+ }
+ }
+ return hyperlinks;
+ }
+ return null;
+ }
+
+ private boolean isInRegion(int offsetInText, Matcher m) {
+ return (offsetInText == -1) || (offsetInText >= m.start() && offsetInText <= m.end());
+ }
+
+ private IRegion determineRegion(int textOffset, Matcher m) {
+ return new Region(textOffset + m.start(), m.end() - m.start());
+ }
+ }
+
+ private final TracTaskHyperlinkDetector hyperlinkDetector = new TracTaskHyperlinkDetector();
+
+ public TracWikiMarkupTaskEditorExtension() {
+ setMarkupLanguage(new TracWikiLanguage());
+ }
+
+ @Override
+ protected void configureDefaultInternalLinkPattern(TaskRepository taskRepository, TracWikiLanguage markupLanguage) {
+ String url = taskRepository.getRepositoryUrl();
+ if (url != null && url.length() > 0) {
+ if (!url.endsWith("/")) { //$NON-NLS-1$
+ url = url + "/"; //$NON-NLS-1$
+ }
+ // bug 247772: set the default wiki link URL for the repository
+ markupLanguage.setInternalLinkPattern(url + "wiki/{0}"); //$NON-NLS-1$
+
+ // bug 262292: set the default server URL for non-wiki links
+ markupLanguage.setServerUrl(url);
+ }
+ }
+
+ @Override
+ protected TaskMarkupSourceViewerConfiguration createSourceViewerConfiguration(TaskRepository taskRepository,
+ SourceViewer viewer) {
+ TaskMarkupSourceViewerConfiguration configuration = super.createSourceViewerConfiguration(taskRepository,
+ viewer);
+ configuration.addHyperlinkDetectorDescriptorFilter(this);
+ configuration.addHyperlinkDetector(hyperlinkDetector);
+ return configuration;
+ }
+
+ @Override
+ protected TaskMarkupViewerConfiguration createViewerConfiguration(TaskRepository taskRepository,
+ MarkupViewer markupViewer) {
+ TaskMarkupViewerConfiguration configuration = super.createViewerConfiguration(taskRepository, markupViewer);
+ configuration.addHyperlinkDetectorDescriptorFilter(this);
+ configuration.addHyperlinkDetector(hyperlinkDetector);
+ return configuration;
+ }
+
+ public boolean filter(HyperlinkDetectorDescriptor descriptor) {
+ String id = descriptor.getId();
+ if ("org.eclipse.mylyn.trac.ui.hyperlinksDetectors.Trac".equals(id)) { //$NON-NLS-1$
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/MarkupViewerPreferencePage.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/MarkupViewerPreferencePage.java
new file mode 100644
index 0000000..d00e3b8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/MarkupViewerPreferencePage.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.VerticalRuler;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextTasksUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.Preferences;
+import org.eclipse.mylyn.internal.wikitext.ui.util.css.editor.CssConfiguration;
+import org.eclipse.mylyn.internal.wikitext.ui.util.css.editor.CssPartitioner;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.HtmlTextPresentationParser;
+import org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewer;
+import org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewerConfiguration;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.RGB;
+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.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.progress.UIJob;
+import org.xml.sax.SAXException;
+
+/**
+ * A preference page that allows for changing the {@link Preferences#getMarkupViewerCss()}
+ *
+ * @author David Green
+ * @author Hiroyuki Inaba fix for bug 265079: Dialog font not apply WikiText preference pages
+ */
+public class MarkupViewerPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ private static final String WHITE = "white"; //$NON-NLS-1$
+
+ private SourceViewer sourceViewer;
+
+ private Colors colorRegistry;
+
+ private HtmlViewer previewViewer;
+
+ private UIJob previewUpdateJob;
+
+ private HtmlViewerConfiguration htmlViewerConfiguration;
+
+ public MarkupViewerPreferencePage() {
+ super(Messages.MarkupViewerPreferencePage_appearance);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ colorRegistry = new Colors();
+ colorRegistry.put(WHITE, new RGB(255, 255, 255));
+
+ Composite composite = new Composite(parent, SWT.NULL);
+ GridLayoutFactory.fillDefaults().margins(5, 5).numColumns(1).applyTo(composite);
+
+ Label label = new Label(composite, SWT.WRAP);
+ label.setText(Messages.MarkupViewerPreferencePage_appearanceInfo);
+ GridDataFactory.fillDefaults().applyTo(label);
+
+ Preferences preferences = WikiTextUiPlugin.getDefault().getPreferences();
+
+ Composite viewerContainer = new Composite(composite, SWT.BORDER);
+ GridLayoutFactory.fillDefaults().margins(0, 0).numColumns(1).applyTo(viewerContainer);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(viewerContainer);
+ {
+ sourceViewer = new SourceViewer(viewerContainer, new VerticalRuler(0), SWT.WRAP | SWT.V_SCROLL);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(sourceViewer.getControl());
+
+ Document document = new Document(preferences.getMarkupViewerCss());
+ CssPartitioner partitioner = new CssPartitioner();
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ sourceViewer.setDocument(document);
+
+ CssConfiguration configuration = new CssConfiguration(colorRegistry);
+ sourceViewer.configure(configuration);
+ }
+
+ label = new Label(composite, SWT.WRAP);
+ label.setText(Messages.MarkupViewerPreferencePage_preview);
+ GridDataFactory.fillDefaults().applyTo(label);
+
+ applyDialogFont(composite);
+
+ Composite previewViewerContainer = new Composite(composite, SWT.BORDER);
+ GridLayoutFactory.fillDefaults().margins(0, 0).numColumns(1).applyTo(previewViewerContainer);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(previewViewerContainer);
+ {
+ previewViewer = new HtmlViewer(previewViewerContainer, new VerticalRuler(0), SWT.WRAP | SWT.V_SCROLL);
+ previewViewer.getTextWidget().setBackground(colorRegistry.get(WHITE));
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(previewViewer.getControl());
+
+ htmlViewerConfiguration = new HtmlViewerConfiguration(previewViewer);
+ previewViewer.configure(htmlViewerConfiguration);
+ previewViewer.getTextWidget().setEditable(false);
+ previewViewer.setStylesheet(preferences.getStylesheet());
+
+ if (JFaceResources.getFontRegistry().hasValueFor(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT)) {
+ previewViewer.getTextWidget().setFont(
+ JFaceResources.getFontRegistry().get(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT));
+ }
+ if (JFaceResources.getFontRegistry().hasValueFor(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT)) {
+ previewViewer.setDefaultMonospaceFont(JFaceResources.getFontRegistry().get(
+ WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT));
+ }
+
+ previewViewer.setHtml(createPreviewHtml());
+
+ sourceViewer.getDocument().addDocumentListener(new IDocumentListener() {
+ public void documentAboutToBeChanged(DocumentEvent event) {
+ }
+
+ public void documentChanged(DocumentEvent event) {
+ schedulePreviewUpdate();
+ }
+ });
+ }
+ return composite;
+ }
+
+ private String createPreviewHtml() {
+ return Messages.MarkupViewerPreferencePage_previewHtml;
+ }
+
+ private void updatePreview() {
+ TextPresentation textPresentation = new TextPresentation();
+ HtmlTextPresentationParser parser = new HtmlTextPresentationParser();
+ parser.setDefaultFont(previewViewer.getTextWidget().getFont());
+ parser.setAnnotationModel(previewViewer.getAnnotationModel());
+ parser.setPresentation(textPresentation);
+ parser.setStylesheet(new CssParser().parse(sourceViewer.getDocument().get()));
+
+ GC gc = new GC(previewViewer.getTextWidget());
+ try {
+ parser.setGC(gc);
+
+ parser.parse(createPreviewHtml());
+ } catch (SAXException e) {
+ throw new IllegalStateException(e);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ } finally {
+ gc.dispose();
+ }
+ htmlViewerConfiguration.setTextPresentation(textPresentation);
+ previewViewer.changeTextPresentation(textPresentation, true);
+ }
+
+ @Override
+ public void dispose() {
+ if (colorRegistry != null) {
+ colorRegistry.dispose();
+ colorRegistry = null;
+ }
+ super.dispose();
+ }
+
+ public void init(IWorkbench workbench) {
+ }
+
+ @Override
+ public boolean performOk() {
+ Preferences preferences = WikiTextUiPlugin.getDefault().getPreferences().clone();
+ preferences.setMarkupViewerCss(sourceViewer.getDocument().get());
+ preferences.save(WikiTextUiPlugin.getDefault().getPreferenceStore(), false);
+ return super.performOk();
+ }
+
+ @Override
+ protected void performDefaults() {
+ sourceViewer.getDocument().set(new Preferences().getMarkupViewerCss());
+ super.performDefaults();
+ schedulePreviewUpdate();
+ }
+
+ private void schedulePreviewUpdate() {
+ if (previewUpdateJob != null) {
+ previewUpdateJob.cancel();
+ }
+ previewUpdateJob = new UIJob(Display.getCurrent(), Messages.MarkupViewerPreferencePage_updatePreview) {
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ previewUpdateJob = null;
+ updatePreview();
+ return Status.OK_STATUS;
+ }
+ };
+ previewUpdateJob.schedule(400L);
+ }
+
+ private static class Colors extends ColorRegistry {
+ public Colors() {
+ super(Display.getCurrent(), false);
+ }
+
+ public void dispose() {
+ super.clearCaches();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/Messages.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/Messages.java
new file mode 100644
index 0000000..dffd727
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/Messages.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.tasks.ui.preferences.messages"; //$NON-NLS-1$
+
+ public static String MarkupViewerPreferencePage_appearance;
+
+ public static String MarkupViewerPreferencePage_appearanceInfo;
+
+ public static String MarkupViewerPreferencePage_preview;
+
+ public static String MarkupViewerPreferencePage_previewHtml;
+
+ public static String MarkupViewerPreferencePage_updatePreview;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/messages.properties b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/messages.properties
new file mode 100644
index 0000000..f7725ae
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/preferences/messages.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+MarkupViewerPreferencePage_appearance=Appearance
+MarkupViewerPreferencePage_appearanceInfo=Specify the appearance of rendered markup using CSS styles
+MarkupViewerPreferencePage_preview=Preview
+MarkupViewerPreferencePage_previewHtml=<html><body><h1>Heading 1</h1><p>Text with <b>bold</b>, <i>italic</i> and <cite>cite</cite></p><h2>Heading 2</h2><p>More examples:</p><ul><li><b> <b>bold example</b></li><li><strong> <strong>strong example</strong></li><li><i> <i>italic example</i></li><li><cite> <cite>cite example</cite></li><li><em> <em>emphasis example</em></li><li><var> <var>variable example</var></li><li><tt> <tt>teletype text example</tt></li><li><code> <code>code example</code></li><li><ins> <ins>inserted example</ins></li><li><del> <del>deleted example</del></li><li><a> <a>anchor example</a></li><li><q> <q>inline quote example</q></li><li><sup> <sup>superscript example</sup></li><li><sub> <sub>subscript example</sub></li></ul><blockquote>this is a block<br/>quote</blockquote><pre>this is a preformatted<br/>block</pre><pre><code>this is a code<br/>block (pre code)</code></pre><h3>Heading 3</h3><h4>Heading 4</h4><h5>Heading 5</h5><h6>Heading 6</h6></body></html>
+MarkupViewerPreferencePage_updatePreview=update preview
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/PlatformUrlHyperlink.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/PlatformUrlHyperlink.java
new file mode 100644
index 0000000..a5ccaef
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/PlatformUrlHyperlink.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.util;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.URLHyperlink;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * A hyperlink that opens using the Eclipse platform preferences.
+ *
+ * @see TasksUiUtil#openUrl(String)
+ *
+ * @author David Green
+ */
+public class PlatformUrlHyperlink extends URLHyperlink {
+
+ public PlatformUrlHyperlink(IRegion region, String urlString) {
+ super(region, urlString);
+ }
+
+ @Override
+ public void open() {
+ TasksUiUtil.openUrl(getURLString());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/Util.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/Util.java
new file mode 100644
index 0000000..d24c6be
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/Util.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.util;
+
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.util.bugzilla.BugzillaGeneratedCommentBlock;
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.util.bugzilla.BugzillaQuoteBlock;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+import org.eclipse.mylyn.wikitext.core.parser.markup.block.JavaStackTraceBlock;
+import org.eclipse.mylyn.wikitext.core.parser.markup.block.EclipseErrorDetailsBlock;
+
+/**
+ *
+ * @author David Green
+ */
+public class Util {
+ private static final String BUGZILLA = "bugzilla"; //$NON-NLS-1$
+
+ public static MarkupLanguageConfiguration create(String repositoryKind) {
+ MarkupLanguageConfiguration configuration = new MarkupLanguageConfiguration();
+ configuration.setEnableUnwrappedParagraphs(false);
+ configuration.setEscapingHtmlAndXml(true);
+ configuration.setNewlinesMustCauseLineBreak(true);
+ configuration.setOptimizeForRepositoryUsage(true);
+ if (isBugzillaOrDerivative(repositoryKind)) {
+ configuration.getBlocks().add(new BugzillaQuoteBlock());
+ configuration.getBlocks().add(new BugzillaGeneratedCommentBlock());
+ }
+ configuration.getBlocks().add(new EclipseErrorDetailsBlock());
+ configuration.getBlocks().add(new JavaStackTraceBlock());
+ return configuration;
+ }
+
+ private static boolean isBugzillaOrDerivative(String repositoryKind) {
+ return BUGZILLA.equals(repositoryKind);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/bugzilla/BugzillaGeneratedCommentBlock.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/bugzilla/BugzillaGeneratedCommentBlock.java
new file mode 100644
index 0000000..7824789
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/bugzilla/BugzillaGeneratedCommentBlock.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.util.bugzilla;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * A block for detecting bugzilla-generated text such as:
+ *
+ * *** This bug has been marked as a duplicate of bug 1234 ***
+ *
+ * @author David Green
+ */
+public class BugzillaGeneratedCommentBlock extends Block {
+ private static Pattern pattern = Pattern.compile("\\s*\\*\\*\\*\\s+((This bug has been)|(Bug \\d+ has been)).*?\\*\\*\\*\\s*"); //$NON-NLS-1$
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && line.length() > 0 && pattern.matcher(line).matches()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected int processLineContent(String line, int offset) {
+ Attributes attributes = new Attributes();
+ attributes.setCssStyle("color: Blue;");// FIXME: hard-coded color? //$NON-NLS-1$
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+ setClosed(true);
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // para
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/bugzilla/BugzillaQuoteBlock.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/bugzilla/BugzillaQuoteBlock.java
new file mode 100644
index 0000000..bc89204
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/internal/wikitext/tasks/ui/util/bugzilla/BugzillaQuoteBlock.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tasks.ui.util.bugzilla;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.QuoteAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * A quote block that detects lines that start with '>' (email-style quoting)
+ *
+ * @author David Green
+ *
+ */
+public class BugzillaQuoteBlock extends Block {
+ private static Pattern pattern = Pattern.compile("((\\s*>)|\\(In reply to comment #\\d{1,}\\)).*"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && line.length() > 0 && pattern.matcher(line).matches()) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected int processLineContent(String line, int offset) {
+ if (!canStart(line, offset)) {
+ setClosed(true);
+ return 0;
+ }
+ if (blockLineCount == 0) {
+ builder.beginBlock(BlockType.QUOTE, new QuoteAttributes());
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ } else {
+ builder.lineBreak();
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ blockLineCount = 0;
+ builder.endBlock(); // para
+ builder.endBlock(); // quote
+ }
+ super.setClosed(closed);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java
new file mode 100644
index 0000000..8cefe46
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/MarkupTaskEditorExtension.java
@@ -0,0 +1,409 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.tasks.ui.editor;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.DefaultAnnotationHover;
+import org.eclipse.jface.text.source.IAnnotationHover;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.WikiTextTasksUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.util.PlatformUrlHyperlink;
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.util.Util;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
+import org.eclipse.mylyn.internal.wikitext.ui.util.PreferenceStoreFacade;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.AnnotationHyperlinkDetector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlinkPresenter;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorExtension;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewer;
+import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration;
+import org.eclipse.mylyn.wikitext.ui.editor.ShowInTargetBridge;
+import org.eclipse.mylyn.wikitext.ui.viewer.DefaultHyperlinkDetectorDescriptorFilter;
+import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
+import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewerConfiguration;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.swt.IFocusService;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
+import org.eclipse.ui.texteditor.AnnotationPreference;
+import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
+import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+
+/**
+ * A task editor extension that uses a markup language to parse content. Provides a markup-aware source editor, and a
+ * source viewer that displays markup in its intended formatted form.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupTaskEditorExtension<MarkupLanguageType extends MarkupLanguage> extends AbstractTaskEditorExtension {
+
+ private static final String ID_CONTEXT_EDITOR_TASK = "org.eclipse.mylyn.tasks.ui.TaskEditor"; //$NON-NLS-1$
+
+ private static final String ID_CONTEXT_EDITOR_TEXT = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
+
+ private MarkupLanguageType markupLanguage;
+
+ public MarkupLanguageType getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguageType markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ @Override
+ public String getEditorContextId() {
+ return MarkupEditor.CONTEXT;
+ }
+
+ @Override
+ public SourceViewer createViewer(TaskRepository taskRepository, Composite parent, int style) {
+ if (markupLanguage == null) {
+ throw new IllegalStateException();
+ }
+ MarkupViewer markupViewer = new MarkupViewer(parent, null, style | SWT.FLAT | SWT.WRAP);
+ MarkupLanguageType markupLanguageCopy = createRepositoryMarkupLanguage(taskRepository);
+ configureMarkupLanguage(taskRepository, markupLanguageCopy);
+
+ markupViewer.setMarkupLanguage(markupLanguageCopy);
+ MarkupViewerConfiguration configuration = createViewerConfiguration(taskRepository, markupViewer);
+ configuration.setDisableHyperlinkModifiers(true);
+ if (markupLanguageCopy.isDetectingRawHyperlinks()) {
+ // bug 264612 don't detect hyperlinks twice
+ configuration.addHyperlinkDetectorDescriptorFilter(new DefaultHyperlinkDetectorDescriptorFilter(
+ "org.eclipse.mylyn.tasks.ui.hyperlinks.detectors.url")); //$NON-NLS-1$
+ }
+ markupViewer.configure(configuration);
+
+ markupViewer.setEditable(false);
+ markupViewer.getTextWidget().setCaret(null);
+
+ if (JFaceResources.getFontRegistry().hasValueFor(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT)) {
+ markupViewer.getTextWidget().setFont(
+ JFaceResources.getFontRegistry().get(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT));
+ }
+ if (JFaceResources.getFontRegistry().hasValueFor(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT)) {
+ markupViewer.setDefaultMonospaceFont(JFaceResources.getFontRegistry().get(
+ WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT));
+ }
+
+ markupViewer.setStylesheet(WikiTextUiPlugin.getDefault().getPreferences().getStylesheet());
+
+ return markupViewer;
+ }
+
+ @SuppressWarnings("unchecked")
+ private MarkupLanguageType createRepositoryMarkupLanguage(TaskRepository taskRepository) {
+ MarkupLanguageType copy = (MarkupLanguageType) markupLanguage.clone();
+ MarkupLanguageConfiguration configuration = Util.create(taskRepository.getConnectorKind());
+ copy.configure(configuration);
+ return copy;
+ }
+
+ protected TaskMarkupViewerConfiguration createViewerConfiguration(TaskRepository taskRepository,
+ MarkupViewer markupViewer) {
+ return new TaskMarkupViewerConfiguration(markupViewer, taskRepository);
+ }
+
+ protected TaskMarkupSourceViewerConfiguration createSourceViewerConfiguration(TaskRepository taskRepository,
+ SourceViewer viewer) {
+ IPreferenceStore preferenceStore = EditorsUI.getPreferenceStore();
+ return new TaskMarkupSourceViewerConfiguration(preferenceStore, taskRepository);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public SourceViewer createEditor(TaskRepository taskRepository, Composite parent, int style) {
+ final MarkupLanguageType markupLanguageCopy = createRepositoryMarkupLanguage(taskRepository);
+ configureMarkupLanguage(taskRepository, markupLanguageCopy);
+
+ SourceViewer viewer = new MarkupSourceViewer(parent, null, style | SWT.WRAP, markupLanguageCopy);
+ // configure the viewer
+ MarkupSourceViewerConfiguration configuration = createSourceViewerConfiguration(taskRepository, viewer);
+
+ if (JFaceResources.getFontRegistry().hasValueFor(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT)) {
+ configuration.setDefaultFont(JFaceResources.getFontRegistry().get(
+ WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_DEFAULT_FONT));
+ }
+ if (JFaceResources.getFontRegistry().hasValueFor(WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT)) {
+ configuration.setDefaultMonospaceFont(JFaceResources.getFontRegistry().get(
+ WikiTextTasksUiPlugin.FONT_REGISTRY_KEY_MONOSPACE_FONT));
+ }
+
+ configuration.setMarkupLanguage(markupLanguageCopy);
+ configuration.setShowInTarget(new ShowInTargetBridge(viewer));
+ viewer.configure(configuration);
+
+ // we want the viewer to show annotations
+ viewer.showAnnotations(true);
+
+ DefaultMarkerAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
+ MarkerAnnotationPreferences annotationPreferences = new MarkerAnnotationPreferences();
+
+ // configure viewer annotation/decoration support
+ final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(viewer, null, annotationAccess,
+ EditorsUI.getSharedTextColors());
+
+ // hook the support up to the preference store
+ Iterator<AnnotationPreference> e = annotationPreferences.getAnnotationPreferences().iterator();
+ while (e.hasNext()) {
+ AnnotationPreference preference = e.next();
+ support.setAnnotationPreference(preference);
+ }
+ support.setCursorLinePainterPreferenceKeys(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE,
+ AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR);
+ support.setMarginPainterPreferenceKeys(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN,
+ AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR,
+ AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN);
+
+ support.install(new EditorExtensionPreferenceStore(EditorsUI.getPreferenceStore(), viewer.getControl()));
+ viewer.getControl().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ support.dispose();
+ }
+ });
+
+ IFocusService focusService = (IFocusService) PlatformUI.getWorkbench().getService(IFocusService.class);
+ if (focusService != null) {
+ focusService.addFocusTracker(viewer.getTextWidget(), MarkupEditor.EDITOR_SOURCE_VIEWER);
+ }
+
+ viewer.getTextWidget().setData(MarkupLanguage.class.getName(), markupLanguageCopy);
+ viewer.getTextWidget().setData(ISourceViewer.class.getName(), viewer);
+
+ return viewer;
+ }
+
+ /**
+ * Configures the markup language with settings from the task repository. Subclasses may override this method, but
+ * should call <code>super.configureMarkupLanguage(taskRepository,markupLanguage)</code>.
+ *
+ * @param taskRepository
+ * the repository from which settings should be used
+ * @param markupLanguage
+ * the markup language to configure
+ * @see #configureDefaultInternalLinkPattern(TaskRepository, MarkupLanguage)
+ */
+ protected void configureMarkupLanguage(TaskRepository taskRepository, MarkupLanguageType markupLanguage) {
+ String internalLinkPattern = taskRepository.getProperty(AbstractTaskEditorExtension.INTERNAL_WIKI_LINK_PATTERN);
+ if (internalLinkPattern != null && internalLinkPattern.trim().length() > 0) {
+ markupLanguage.setInternalLinkPattern(internalLinkPattern.trim());
+ } else {
+ configureDefaultInternalLinkPattern(taskRepository, markupLanguage);
+ }
+ }
+
+ /**
+ * Overriding methods should set the {@link MarkupLanguage#getInternalLinkPattern() internal hyperlink pattern} of
+ * the given markup language based on some default rules applied to the task repository URL. The default
+ * implementation does nothing.
+ *
+ * @param taskRepository
+ * the task repository from which settings may be obtained
+ * @param markupLanguage
+ * the markup language to configure
+ */
+ protected void configureDefaultInternalLinkPattern(TaskRepository taskRepository, MarkupLanguageType markupLanguage) {
+ // nothing to do
+ }
+
+ protected static class TaskMarkupSourceViewerConfiguration extends MarkupSourceViewerConfiguration {
+
+ private final TaskRepository taskRepository;
+
+ public TaskMarkupSourceViewerConfiguration(IPreferenceStore preferenceStore, TaskRepository taskRepository) {
+ super(preferenceStore);
+ this.taskRepository = taskRepository;
+ // filter out the platform URL hyperlink detector since Mylyn contributes one as well.
+ addHyperlinkDetectorDescriptorFilter(new DefaultHyperlinkDetectorDescriptorFilter(
+ "org.eclipse.ui.internal.editors.text.URLHyperlinkDetector")); //$NON-NLS-1$
+ }
+
+ @Override
+ protected IContentAssistProcessor[] createContentAssistProcessors() {
+ IContentAssistProcessor processor = TasksUi.getUiFactory().createTaskContentAssistProcessor(taskRepository);
+ return processor == null ? null : new IContentAssistProcessor[] { processor };
+ }
+
+ @Override
+ public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
+ return new DefaultAnnotationHover() {
+ @Override
+ protected boolean isIncluded(Annotation annotation) {
+ return annotation.getType().startsWith("org.eclipse.wikitext") || super.isIncluded(annotation); //$NON-NLS-1$
+ }
+ };
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected Map getHyperlinkDetectorTargets(ISourceViewer sourceViewer) {
+ Map hyperlinkDetectorTargets = super.getHyperlinkDetectorTargets(sourceViewer);
+ addRepositoryHyperlinkDetectorTargets(taskRepository, hyperlinkDetectorTargets);
+ return hyperlinkDetectorTargets;
+ }
+
+ @Override
+ public IReconciler getReconciler(ISourceViewer sourceViewer) {
+ if (sourceViewer.isEditable()) {
+ return super.getReconciler(sourceViewer);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public int getHyperlinkStateMask(ISourceViewer sourceViewer) {
+ return SWT.NONE;
+ }
+
+ @Override
+ public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
+ if (fPreferenceStore == null) {
+ return new TaskHyperlinkPresenter(new RGB(0, 0, 255));
+ }
+ return new TaskHyperlinkPresenter(fPreferenceStore);
+ }
+ }
+
+ protected static class TaskMarkupViewerConfiguration extends MarkupViewerConfiguration {
+
+ private final TaskRepository taskRepository;
+
+ public TaskMarkupViewerConfiguration(MarkupViewer viewer, TaskRepository taskRepository) {
+ super(viewer);
+ this.taskRepository = taskRepository;
+ markupHyperlinksFirst = false;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected Map getHyperlinkDetectorTargets(ISourceViewer sourceViewer) {
+ Map hyperlinkDetectorTargets = super.getHyperlinkDetectorTargets(sourceViewer);
+ addRepositoryHyperlinkDetectorTargets(taskRepository, hyperlinkDetectorTargets);
+ return hyperlinkDetectorTargets;
+ }
+
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ */
+ @Override
+ protected AnnotationHyperlinkDetector createAnnotationHyperlinkDetector() {
+ return new PlatformUrlAnnotationHyperlinkDetector();
+ }
+
+ @Override
+ public IHyperlinkPresenter getHyperlinkPresenter(ISourceViewer sourceViewer) {
+ if (fPreferenceStore == null) {
+ return new TaskHyperlinkPresenter(new RGB(0, 0, 255));
+ }
+ return new TaskHyperlinkPresenter(fPreferenceStore);
+ }
+ }
+
+ private static class PlatformUrlAnnotationHyperlinkDetector extends AnnotationHyperlinkDetector {
+ @Override
+ protected IHyperlink createUrlHyperlink(IRegion region, String href) {
+ return new PlatformUrlHyperlink(region, href);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static void addRepositoryHyperlinkDetectorTargets(final TaskRepository taskRepository,
+ Map hyperlinkDetectorTargets) {
+ IAdaptable context = new IAdaptable() {
+ public Object getAdapter(Class adapter) {
+ if (adapter == TaskRepository.class) {
+ return taskRepository;
+ }
+ return null;
+ }
+ };
+ hyperlinkDetectorTargets.put(ID_CONTEXT_EDITOR_TEXT, context);
+ hyperlinkDetectorTargets.put(ID_CONTEXT_EDITOR_TASK, context);
+ }
+
+ /**
+ * bug 251657: wrap preferences so that we can alter the current line highlight based on the focus state of the
+ * provided control. bug 273528: override workspace preferences to eliminate print margin in the task editor
+ *
+ * @author David Green
+ */
+ private static class EditorExtensionPreferenceStore extends PreferenceStoreFacade {
+
+ // track separately from isFocusControl() since isFocusControl() is not accurate while processing a focus event
+ boolean controlFocused;
+
+ public EditorExtensionPreferenceStore(IPreferenceStore preferenceStore, Control control) {
+ super(preferenceStore);
+ controlFocused = control.isFocusControl();
+ control.addFocusListener(new FocusListener() {
+ public void focusGained(FocusEvent e) {
+ controlFocused = true;
+ focusChanged();
+ }
+
+ public void focusLost(FocusEvent e) {
+ controlFocused = false;
+ focusChanged();
+ }
+ });
+ }
+
+ protected void focusChanged() {
+ if (!super.getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE)) {
+ return;
+ }
+ boolean newValue = getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE);
+ firePropertyChangeEvent(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE, !newValue,
+ newValue);
+ }
+
+ @Override
+ public boolean getBoolean(String name) {
+ if (AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE.equals(name)) {
+ if (!controlFocused) {
+ return false;
+ }
+ }
+ if (AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN.equals(name)) {
+ return false;
+ }
+ return super.getBoolean(name);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/package-info.java b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/package-info.java
new file mode 100644
index 0000000..f3817dd
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tasks.ui/src/org/eclipse/mylyn/wikitext/tasks/ui/editor/package-info.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+/**
+ * Classes related to integration with the Mylyn task editor, specifically targeting
+ * Mylyn's <code>taskEditorExtension</code> extension point. {@link MarkupTaskEditorExtension} is available for those
+ * that wish to target the extension point with a WikiText-based markup language.
+ *
+ * @author David Green
+ */
+package org.eclipse.mylyn.wikitext.tasks.ui.editor;
+
diff --git a/org.eclipse.mylyn.wikitext.tests/.classpath b/org.eclipse.mylyn.wikitext.tests/.classpath
new file mode 100644
index 0000000..c5eb0e9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="**/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.tests/.cvsignore b/org.eclipse.mylyn.wikitext.tests/.cvsignore
new file mode 100644
index 0000000..b6cec55
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.cvsignore
@@ -0,0 +1,2 @@
+test-output
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.tests/.project b/org.eclipse.mylyn.wikitext.tests/.project
new file mode 100644
index 0000000..06ef8f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..4233beb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..bd4b7b0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:06:52 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9990af9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,60 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.tests;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.junit;bundle-version="3.8.2",
+ org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.textile.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.confluence.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.mediawiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.tracwiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.twiki.core;bundle-version="0.9.0",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.tasks.ui;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.views,
+ org.eclipse.ui.ide,
+ org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.2,4.0.0)",
+ org.eclipse.mylyn.tasks.core;bundle-version="[3.0.2,4.0.0)",
+ org.eclipse.jface.text,
+ org.eclipse.core.expressions,
+ org.eclipse.core.resources,
+ org.eclipse.help,
+ org.apache.ant
+Export-Package:
+ org.eclipse.mylyn.internal.wikitext.core.parser.builder;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.core.util.css;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.core.validation;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.mediawiki.core;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.textile.core;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.textile.core.validation;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.twiki.core.validation;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.twiki.tests;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.resources;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.util;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.viewer;x-internal:=true,
+ org.eclipse.mylyn.wikitext.confluence.core;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.parser;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.parser.builder;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.parser.builder.resources;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.parser.markup.token;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.parser.outline;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.parser.util;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.util;x-internal:=true,
+ org.eclipse.mylyn.wikitext.core.util.anttask;x-internal:=true,
+ org.eclipse.mylyn.wikitext.mediawiki.core;x-internal:=true,
+ org.eclipse.mylyn.wikitext.tests;x-internal:=true,
+ org.eclipse.mylyn.wikitext.textile.core;x-internal:=true,
+ org.eclipse.mylyn.wikitext.textile.core.resources;x-internal:=true,
+ org.eclipse.mylyn.wikitext.tracwiki.core;x-internal:=true,
+ org.eclipse.mylyn.wikitext.ui;x-internal:=true,
+ org.eclipse.mylyn.wikitext.ui.annotation;x-internal:=true
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.tests/about.html b/org.eclipse.mylyn.wikitext.tests/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.tests/build.properties b/org.eclipse.mylyn.wikitext.tests/build.properties
new file mode 100644
index 0000000..1c26c98
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/build.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.properties,\
+ about.html
diff --git a/org.eclipse.mylyn.wikitext.tests/plugin.properties b/org.eclipse.mylyn.wikitext.tests/plugin.properties
new file mode 100644
index 0000000..07163ce
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/plugin.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2007, 2008 Mylyn project committers 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.tests
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Tests Plug-in
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DitaTopicDocumentBuilderTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DitaTopicDocumentBuilderTest.java
new file mode 100644
index 0000000..3dcec68
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/parser/builder/DitaTopicDocumentBuilderTest.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.parser.builder;
+
+import java.io.StringWriter;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+public class DitaTopicDocumentBuilderTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private StringWriter out;
+
+ private DitaTopicDocumentBuilder builder;
+
+ @Override
+ public void setUp() {
+ parser = new MarkupParser();
+ parser.setMarkupLanguage(new TextileLanguage());
+ out = new StringWriter();
+ builder = new DitaTopicDocumentBuilder(out);
+ parser.setBuilder(builder);
+ }
+
+ public void testDiv() {
+ builder.beginDocument();
+ builder.beginBlock(BlockType.DIV, new Attributes());
+
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("foo");
+ builder.endBlock(); // PARAGRAPH
+
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("bar");
+ builder.endBlock(); // PARAGRAPH
+
+ builder.endBlock(); // DIV
+ builder.endDocument();
+
+ String dita = out.toString();
+ System.out.println("DITA: \n" + dita);
+
+ assertTrue(Pattern.compile(".*?<topic>\\s*<title></title>\\s*<body>\\s*<p>foo</p>\\s*<p>bar</p>\\s*</body>.*",
+ Pattern.DOTALL).matcher(dita).matches());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParserTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParserTest.java
new file mode 100644
index 0000000..598eb58
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParserTest.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.wikitext.core.util.css.Block;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CompositeSelector;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssClassSelector;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.DescendantSelector;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.IdSelector;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.NameSelector;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.Selector;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.Stylesheet;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @author David Green
+ */
+public class CssParserTest extends TestCase {
+ private CssParser parser;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ parser = new CssParser();
+ }
+
+ public void testDetectStyles() {
+ String css = "a: b and more; c: d ; e: fg; h i: j";
+ String[] expectedRuleNames = new String[] { "a", "c", "e", "i" };
+ String[] expectedRuleValues = new String[] { "b and more", "d", "fg", "j" };
+ Iterator<CssRule> ruleIterator = parser.createRuleIterator(css);
+ int count = 0;
+ while (ruleIterator.hasNext()) {
+ CssRule rule = ruleIterator.next();
+ ++count;
+ assertEquals(expectedRuleNames[count - 1], rule.name);
+ assertEquals(expectedRuleValues[count - 1], rule.value);
+ }
+ assertEquals(expectedRuleNames.length, count);
+ }
+
+ public void testSimple() throws IOException {
+
+ Stylesheet stylesheet = parser.parse(readFully(CssParserTest.class.getSimpleName() + "_0.css"));
+ assertNotNull(stylesheet);
+ assertEquals(25, stylesheet.getBlocks().size());
+ }
+
+ private String readFully(String resourceName) throws IOException {
+ InputStream stream = CssParserTest.class.getResourceAsStream(resourceName);
+ try {
+ Reader reader = new InputStreamReader(stream);
+ int i;
+ StringWriter writer = new StringWriter();
+ while ((i = reader.read()) != -1) {
+ writer.write(i);
+ }
+ return writer.toString();
+ } finally {
+ stream.close();
+ }
+ }
+
+ public void testSimpleId() {
+ Selector selector = parser.parseSelector("#id");
+ assertNotNull(selector);
+ System.out.println(selector);
+ assertEquals(IdSelector.class, selector.getClass());
+ assertEquals("id", ((IdSelector) selector).getId());
+ }
+
+ public void testSimpleClass() {
+ Selector selector = parser.parseSelector(".className");
+ assertNotNull(selector);
+ System.out.println(selector);
+ assertEquals(CssClassSelector.class, selector.getClass());
+ assertEquals("className", ((CssClassSelector) selector).getCssClass());
+ }
+
+ public void testSimpleElement() {
+ Selector selector = parser.parseSelector("body");
+ assertNotNull(selector);
+ System.out.println(selector);
+ assertEquals(NameSelector.class, selector.getClass());
+ assertEquals("body", ((NameSelector) selector).getName());
+ }
+
+ public void testNumericElementName() {
+ Selector selector = parser.parseSelector("h1");
+ assertNotNull(selector);
+ System.out.println("testNumericElementName: " + selector);
+ assertEquals(NameSelector.class, selector.getClass());
+ assertEquals("h1", ((NameSelector) selector).getName());
+ }
+
+ public void testCompoundIdElement() {
+ Selector selector = parser.parseSelector("#foo a");
+ assertNotNull(selector);
+ System.out.println("testCompoundIdElement: " + selector);
+ assertEquals(CompositeSelector.class, selector.getClass());
+
+ CompositeSelector compositeSelector = (CompositeSelector) selector;
+
+ assertTrue(compositeSelector.isAnd());
+ assertEquals(2, compositeSelector.getComponents().size());
+
+ Selector firstComponent = compositeSelector.getComponents().get(0);
+ assertEquals(DescendantSelector.class, firstComponent.getClass());
+
+ Selector ancestorSelector = ((DescendantSelector) firstComponent).getAncestorSelector();
+ assertEquals(IdSelector.class, ancestorSelector.getClass());
+ assertEquals("foo", ((IdSelector) ancestorSelector).getId());
+
+ Selector secondComponent = compositeSelector.getComponents().get(1);
+ assertEquals(NameSelector.class, secondComponent.getClass());
+ assertEquals("a", ((NameSelector) secondComponent).getName());
+ }
+
+ public void testCompoundIdElement2() {
+ Selector selector = parser.parseSelector("#foo, a");
+ assertNotNull(selector);
+ System.out.println(selector);
+ assertEquals(CompositeSelector.class, selector.getClass());
+
+ CompositeSelector compositeSelector = (CompositeSelector) selector;
+
+ assertFalse(compositeSelector.isAnd());
+ assertEquals(2, compositeSelector.getComponents().size());
+
+ Selector firstComponent = compositeSelector.getComponents().get(0);
+ assertEquals(IdSelector.class, firstComponent.getClass());
+ assertEquals("foo", ((IdSelector) firstComponent).getId());
+
+ Selector secondComponent = compositeSelector.getComponents().get(1);
+ assertEquals(NameSelector.class, secondComponent.getClass());
+ assertEquals("a", ((NameSelector) secondComponent).getName());
+ }
+
+ public void testCompoundElementWithJoin() {
+ Selector selector = parser.parseSelector("table tr");
+ assertNotNull(selector);
+ System.out.println(selector);
+ assertEquals(CompositeSelector.class, selector.getClass());
+
+ CompositeSelector compositeSelector = (CompositeSelector) selector;
+
+ assertTrue(compositeSelector.isAnd());
+ assertEquals(2, compositeSelector.getComponents().size());
+
+ Selector firstComponent = compositeSelector.getComponents().get(0);
+ assertEquals(DescendantSelector.class, firstComponent.getClass());
+
+ Selector ancestorSelector = ((DescendantSelector) firstComponent).getAncestorSelector();
+ assertEquals(NameSelector.class, ancestorSelector.getClass());
+ assertEquals("table", ((NameSelector) ancestorSelector).getName());
+
+ Selector secondComponent = compositeSelector.getComponents().get(1);
+ assertEquals(NameSelector.class, secondComponent.getClass());
+ assertEquals("tr", ((NameSelector) secondComponent).getName());
+ }
+
+ public void testCompoundElementUsingDot() {
+ Selector selector = parser.parseSelector("table.summaryTable");
+ assertNotNull(selector);
+ System.out.println(selector);
+ assertEquals(CompositeSelector.class, selector.getClass());
+
+ CompositeSelector compositeSelector = (CompositeSelector) selector;
+
+ assertTrue(compositeSelector.isAnd());
+ assertEquals(2, compositeSelector.getComponents().size());
+
+ Selector firstComponent = compositeSelector.getComponents().get(0);
+ assertEquals(NameSelector.class, firstComponent.getClass());
+ assertEquals("table", ((NameSelector) firstComponent).getName());
+
+ Selector secondComponent = compositeSelector.getComponents().get(1);
+ assertEquals(CssClassSelector.class, secondComponent.getClass());
+ assertEquals("summaryTable", ((CssClassSelector) secondComponent).getCssClass());
+ }
+
+ public void testCompoundElementUsingDotAndJoin() {
+ Selector selector = parser.parseSelector("table.summaryTable tr.a1");
+ assertNotNull(selector);
+ System.out.println("testCompoundElementUsingDotAndJoin: " + selector);
+ assertEquals(CompositeSelector.class, selector.getClass());
+
+ CompositeSelector compositeSelector = (CompositeSelector) selector;
+
+ assertTrue(compositeSelector.isAnd());
+ assertEquals(2, compositeSelector.getComponents().size());
+
+ }
+
+ public void testComments() {
+ Stylesheet stylesheet = parser.parse("tr { /* font-size: 115%; */ font-size: 100%; } /* foo { sdf: sdf; } */");
+ List<Block> blocks = stylesheet.getBlocks();
+ assertEquals(1, blocks.size());
+ Block block = blocks.get(0);
+ List<CssRule> rules = block.getRules();
+ assertEquals(1, rules.size());
+ CssRule rule = rules.get(0);
+ assertEquals("font-size", rule.name);
+ assertEquals("100%", rule.value);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParserTest_0.css b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParserTest_0.css
new file mode 100644
index 0000000..dfdfdf3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/CssParserTest_0.css
@@ -0,0 +1,138 @@
+
+body {
+ margin: 0px;
+ padding: 0px;
+ background-color: #fff;
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ margin-left: auto;
+ margin-right: auto;
+ background-repeat: repeat-y;
+ font-size: 13px;
+}
+img {
+ border:none;
+}
+table {
+ padding:0px;
+ width: 100%;
+ margin-left: -2px;
+ margin-right: -2px;
+}
+
+.source {
+ padding: 12px;
+ margin: 1em 7px 1em 7px;
+}
+.source pre {
+ margin: 0px;
+ padding: 0px;
+}
+
+td, select, input, li{
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ font-size: 12px;
+ color:#333333;
+}
+code{
+ font-size: 12px;
+}
+a {
+ text-decoration: none;
+}
+a:link {
+ color:#47a;
+}
+a:visited {
+ color:#666666;
+}
+a:active, a:hover {
+ color:#990000;
+}
+
+h2 {
+ font-size: 17px;
+ color: #333333;
+}
+h3 {
+ padding: 4px 4px 4px 24px;
+/* color: #666; */
+ background-color: #ccc;
+ font-weight: bold;
+ font-size: 14px;
+}
+
+.source {
+ border: 1px solid #999;
+ overflow:auto
+}
+
+table {
+ font-size: 10px;
+ padding: 0px;
+ width: 100%;
+ margin-left: -2px;
+ margin-right: -2px;
+}
+
+.source {
+ padding: 12px;
+ margin: 1em 7px 1em 7px;
+}
+
+.source pre {
+ margin: 0px;
+ padding: 0px;
+}
+
+.source {
+ font-family: monospace;
+ font-size: medium;
+}
+
+table.summaryTable tr.b {
+ background-color: #eee;
+}
+
+table.summaryTable tr.a1 {
+ background-color: #eee;
+}
+
+table.summaryTable th {
+ text-align: left;
+ font-weight: bold;
+ padding: 2px 4px 2px 4px;
+}
+
+table.summaryTable td {
+ padding: 2px 4px 2px 4px;
+}
+
+table.summaryTable td.header {
+ text-align: left;
+ font-weight: bold;
+ padding: 2px 4px 2px 4px;
+}
+
+table.summaryTable {
+ width: auto;
+}
+
+.source {
+ border: 1px solid #999;
+ overflow: auto;
+ padding: 1em;
+ margin: 1em 0.5em 1em 0.5em;
+}
+
+code {
+ font-size: small;
+}
+
+
+td th {
+ text-align: left;
+}
+
+td.stat {
+ text-align: right;
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/SparseCharSequenceTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/SparseCharSequenceTest.java
new file mode 100644
index 0000000..0093741
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/util/css/SparseCharSequenceTest.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.util.css;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.core.util.css.SparseCharSequence;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @author David Green
+ */
+public class SparseCharSequenceTest extends TestCase {
+
+ private SparseCharSequence sequence;
+
+ private String testData;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ configureTest("one /* two\n\n three */ four\n/* five */");
+ }
+
+ private void configureTest(String testData) {
+ this.testData = testData;
+ sequence = new SparseCharSequence(testData, Pattern.compile("/\\*.*?\\*/", Pattern.MULTILINE | Pattern.DOTALL));
+ }
+
+ public void testLength() {
+ assertEquals(10, sequence.length());
+ }
+
+ public void testCharAt() {
+ for (int x = 0; x < 4; ++x) {
+ char c = sequence.charAt(x);
+ assertEquals(testData.charAt(x), c);
+ }
+ for (int x = 4; x < 10; ++x) {
+ char c = sequence.charAt(x);
+ assertEquals(testData.charAt(x + 17), c);
+ }
+ }
+
+ public void testOriginalOffsetOf() {
+ for (int x = 0; x < sequence.length(); ++x) {
+ int originalOffset = x;
+ if (x >= 4) {
+ originalOffset += 17;
+ }
+ assertEquals(originalOffset, sequence.originalOffsetOf(x));
+ }
+ }
+
+ public void testSubSequence() {
+ assertEquals("", sequence.subSequence(0, 0).toString());
+ assertEquals("one ", sequence.subSequence(0, 4).toString());
+ assertEquals("ne ", sequence.subSequence(1, 5).toString());
+ assertEquals(" fou", sequence.subSequence(3, 8).toString());
+ assertEquals(" four", sequence.subSequence(4, 9).toString());
+ assertEquals("four\n", sequence.subSequence(5, 10).toString());
+ }
+
+ public void testToString() {
+ assertEquals("one four\n", sequence.toString());
+ }
+
+ public void testCharAtOutOfBounds() {
+ for (int x = -1; x < (testData.length() + 2); ++x) {
+ if (x < 0 || x >= sequence.length()) {
+ try {
+ sequence.charAt(x);
+ fail("expected exception on index " + x);
+ } catch (IndexOutOfBoundsException e) {
+ // expected
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/StandaloneMarkupValidatorTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/StandaloneMarkupValidatorTest.java
new file mode 100644
index 0000000..4a55718
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/StandaloneMarkupValidatorTest.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.core.validation;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+public class StandaloneMarkupValidatorTest extends TestCase {
+
+ private StandaloneMarkupValidator validator;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ validator = new StandaloneMarkupValidator();
+ validator.setClassLoader(StandaloneMarkupValidatorTest.class.getClassLoader());
+ validator.computeRules("TestMarkupLanguage", StandaloneMarkupValidatorTest.class.getResource("test-plugin.xml"));
+ }
+
+ public void testSimple() {
+ List<ValidationProblem> problems = validator.validate("some text ERROR more text WARNING and ERROR");
+
+ assertNotNull(problems);
+ assertEquals(3, problems.size());
+
+ ValidationProblem first = problems.get(0);
+ assertEquals(Severity.ERROR, first.getSeverity());
+ assertEquals(10, first.getOffset());
+ assertEquals(5, first.getLength());
+
+ ValidationProblem second = problems.get(1);
+ assertEquals(Severity.WARNING, second.getSeverity());
+ assertEquals(26, second.getOffset());
+ assertEquals(7, second.getLength());
+
+ ValidationProblem third = problems.get(2);
+ assertEquals(Severity.ERROR, third.getSeverity());
+ assertEquals(38, third.getOffset());
+ assertEquals(5, third.getLength());
+ }
+
+ public void testImmutability() {
+ StandaloneMarkupValidator validator = StandaloneMarkupValidator.getValidator("Test");
+ try {
+ validator.getRules().clear();
+ fail("not immutable");
+ } catch (Exception e) {
+ // expected
+ }
+ try {
+ validator.getRules().add(new TestMarkupValidationRule());
+ fail("not immutable");
+ } catch (Exception e) {
+ // expected
+ }
+ try {
+ validator.setClassLoader(StandaloneMarkupValidator.class.getClassLoader());
+ fail("not immutable");
+ } catch (Exception e) {
+ // expected
+ }
+ }
+
+ public void testMutability() {
+ validator.getRules().clear();
+ validator.getRules().add(new TestMarkupValidationRule());
+ validator.setClassLoader(StandaloneMarkupValidator.class.getClassLoader());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/TestMarkupValidationRule.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/TestMarkupValidationRule.java
new file mode 100644
index 0000000..1bf8a25
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/TestMarkupValidationRule.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.core.validation;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+/**
+ * a test markup validation rule that creates errors for text matching "ERROR" or "WARNING".
+ *
+ * @author David Green
+ */
+public class TestMarkupValidationRule extends ValidationRule {
+
+ private static final Pattern pattern = Pattern.compile("(ERROR|WARNING)", Pattern.MULTILINE);
+
+ @Override
+ public ValidationProblem findProblem(String markup, int offset, int length) {
+ Matcher matcher = pattern.matcher(markup);
+ if (offset > 0 || length != markup.length()) {
+ matcher.region(offset, offset + length);
+ }
+ if (matcher.find()) {
+ String group = matcher.group(1);
+ Severity severity;
+ if ("ERROR".equals(group)) {
+ severity = Severity.ERROR;
+ } else {
+ severity = Severity.WARNING;
+ }
+ return new ValidationProblem(severity, "test error", matcher.start(1), matcher.end(1) - matcher.start(1));
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/test-plugin.xml b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/test-plugin.xml
new file mode 100644
index 0000000..e6dc23d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/core/validation/test-plugin.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<!--
+A plugin.xml used for testing with org.eclipse.mylyn.internal.wikitext.core.validation.StandaloneMarkupValidatorTest
+-->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.core.validation.TestMarkupValidationRule"
+ markupLanguage="TestMarkupLanguage">
+ </rule>
+ </extension>
+</plugin>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/MediaWikiIdGenerationStrategyTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/MediaWikiIdGenerationStrategyTest.java
new file mode 100644
index 0000000..6a6e68b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/MediaWikiIdGenerationStrategyTest.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core;
+
+import junit.framework.TestCase;
+
+public class MediaWikiIdGenerationStrategyTest extends TestCase {
+
+ MediaWikiIdGenerationStrategy generationStrategy;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ generationStrategy = new MediaWikiIdGenerationStrategy();
+ }
+
+ public void testSimple() {
+ assertEquals("Bugzilla_Connector", generationStrategy.generateId("Bugzilla Connector"));
+ assertEquals("JIRA_Connector", generationStrategy.generateId("JIRA Connector"));
+ assertEquals("Keyboard_mappings_on_Linux", generationStrategy.generateId("Keyboard mappings on Linux"));
+ assertEquals("Alt.2BClick_navigation", generationStrategy.generateId("Alt+Click navigation"));
+ }
+
+ public void testWithDots() {
+ assertEquals("com.foo.Bar", generationStrategy.generateId("com.foo.Bar"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/CommentValidationRuleTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/CommentValidationRuleTest.java
new file mode 100644
index 0000000..73081c2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/validation/CommentValidationRuleTest.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.validation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+/**
+ *
+ * @author David Green
+ */
+public class CommentValidationRuleTest extends TestCase {
+
+ private CommentValidationRule rule;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ rule = new CommentValidationRule();
+ }
+
+ public void testOk() {
+ String markup = "a <!-- valid comment -->";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNull(problem);
+ }
+
+ public void testFail1() {
+ String markup = "a <!--- bogus comment -->";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(2, problem.getOffset());
+ assertEquals(5, problem.getLength());
+ }
+
+ public void testFail2() {
+ String markup = "a <!--- bogus comment ----->";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ int offset = problem.getOffset() + problem.getLength();
+ problem = rule.findProblem(markup, offset, markup.length() - offset);
+ assertNotNull(problem);
+ assertEquals(22, problem.getOffset());
+ assertEquals(6, problem.getLength());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/TextileTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/TextileTest.java
new file mode 100644
index 0000000..2f21492
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/TextileTest.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TextileTest extends TestCase {
+ public void testExplicitHeaderStartsNewBlock() {
+ for (int x = 1; x <= 6; ++x) {
+ assertTrue(Textile.explicitBlockBegins("h" + x + ". ", 0));
+ assertTrue(Textile.explicitBlockBegins("h" + x + ". asfsdfds", 0));
+ assertTrue(Textile.explicitBlockBegins("h" + x + "(#id-foo). ", 0));
+ assertFalse(Textile.explicitBlockBegins("h" + x + ".", 0));
+ assertFalse(Textile.explicitBlockBegins(" h" + x + ". ", 1));
+ }
+ }
+
+ public void testExplicitFootnoteStartsNewBlock() {
+ for (int x = 0; x <= 9; ++x) {
+ assertTrue(Textile.explicitBlockBegins("fn" + x + ". ", 0));
+ assertTrue(Textile.explicitBlockBegins("fn" + x + x + ". ", 0));
+ assertTrue(Textile.explicitBlockBegins("fn" + x + ". asfsdfds", 0));
+ assertFalse(Textile.explicitBlockBegins("fn" + x + ".", 0));
+ assertFalse(Textile.explicitBlockBegins("fn" + x + x + ".", 0));
+ assertFalse(Textile.explicitBlockBegins(" fn" + x + ". ", 1));
+ }
+ }
+
+ public void testExplicitOtherStartsNewBlock() {
+ String[] types = new String[] { "pre", "bc", "bq", "p", "table" };
+ for (String type : types) {
+ assertTrue(Textile.explicitBlockBegins(type + ". ", 0));
+ assertTrue(Textile.explicitBlockBegins(type + ". asfsdfds", 0));
+ assertTrue(Textile.explicitBlockBegins(type + ".. ", 0));
+ assertTrue(Textile.explicitBlockBegins(type + ".. asfsdfds", 0));
+ assertTrue(Textile.explicitBlockBegins(type + "(cssClass). ", 0));
+ assertFalse(Textile.explicitBlockBegins(type + ".", 0));
+ assertFalse(Textile.explicitBlockBegins(" " + type + ". ", 1));
+ }
+ }
+
+ public void testAttributes() {
+ Pattern pattern = Pattern.compile(Textile.REGEX_ATTRIBUTES);
+ String[] values = new String[] { "(someClass)", "(#someId)", "{someStyle}", "[someLanguage]",
+ "(someClass)(#someId){someStyle}", "{someStyle}(someClass)(#someId)" };
+ String[][] verify = new String[][] { { null, "someClass", null, null, null },
+ { null, null, "someId", null, null }, { null, null, null, "someStyle", null },
+ { null, null, null, null, "someLanguage" }, { null, "someClass", "someId", "someStyle", null },
+ { null, "someClass", "someId", "someStyle", null } };
+
+ int i = 0;
+ for (String value : values) {
+ Matcher matcher = pattern.matcher(value);
+ System.out.println("Value: \'" + value + "\'");
+ if (matcher.matches()) {
+ System.out.println("\tmatch");
+ System.out.println("\tgroups " + matcher.groupCount());
+ for (int x = 1; x <= matcher.groupCount(); ++x) {
+ System.out.println("\tgroup(" + x + "): \'" + matcher.group(x) + "\'");
+ assertEquals(verify[i][x], matcher.group(x));
+ }
+ } else {
+ System.out.println("\tno match");
+ }
+ ++i;
+ }
+ }
+
+ public void testLeftAlignment() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1<. foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("text-align: left;", attributes.getCssStyle());
+ }
+
+ public void testRightAlignment() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1>. foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("text-align: right;", attributes.getCssStyle());
+ }
+
+ public void testCenterAlignment() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1=. foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("text-align: center;", attributes.getCssStyle());
+ }
+
+ public void testJustifiedAlignment() {
+
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1<>. foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("text-align: justify;", attributes.getCssStyle());
+ }
+
+ public void testLeftPadding() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1((. foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("padding-left: 2em;", attributes.getCssStyle());
+ }
+
+ public void testRightPadding() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1))). foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("padding-right: 3em;", attributes.getCssStyle());
+ }
+
+ public void testLeftPaddingCssClass() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1(((foo). foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("padding-left: 2em;", attributes.getCssStyle());
+ assertEquals("foo", attributes.getCssClass());
+ }
+
+ public void testRightPaddingCssStyles() {
+ Pattern pattern = Pattern.compile("h1" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\. (.*)?");
+
+ Matcher matcher = pattern.matcher("h1){color: red;}. foo");
+ assertTrue(matcher.matches());
+
+ Attributes attributes = new Attributes();
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ assertEquals("padding-right: 1em; color: red;", attributes.getCssStyle());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/BlockWhitespaceRuleTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/BlockWhitespaceRuleTest.java
new file mode 100644
index 0000000..2354b89
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/BlockWhitespaceRuleTest.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.validation;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.wikitext.core.validation.MarkupValidator;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class BlockWhitespaceRuleTest extends TestCase {
+
+ private BlockWhitespaceRule rule;
+
+ private MarkupValidator validator;
+
+ @Override
+ public void setUp() {
+ rule = new BlockWhitespaceRule();
+
+ validator = new MarkupValidator();
+ validator.getRules().add(rule);
+ }
+
+ public void testNoMatch() {
+ final String markup = "bc. \nfoo";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ System.out.println(problem);
+ assertNull(problem);
+ }
+
+ public void testNoMatch2() {
+ final String markup = "\nabc.\nfoo";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ System.out.println(problem);
+ assertNull(problem);
+ }
+
+ public void testMatch() {
+ final String markup = "bc.\nfoo";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ System.out.println(problem);
+ assertNotNull(problem);
+ assertEquals(0, problem.getOffset());
+ }
+
+ public void testMatch2() {
+ final String markup = "\nbc.\nfoo";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ System.out.println(problem);
+ assertNotNull(problem);
+ assertEquals(1, problem.getOffset());
+ }
+
+ public void testMatch3() {
+ final String markup = "\n\n\nbc..\nfoo";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ System.out.println(problem);
+ assertNotNull(problem);
+ assertEquals(3, problem.getOffset());
+ }
+
+ public void testValidator() {
+ String markup = "h1. Foo\n\nbc. bar\n\npre.\nsdf\n\nbc.\n\n";
+ List<ValidationProblem> result = validator.validate(new NullProgressMonitor(), markup);
+ assertEquals(2, result.size());
+ System.out.println(result);
+ assertEquals(18, result.get(0).getOffset());
+ assertEquals(4, result.get(0).getLength());
+ assertEquals(28, result.get(1).getOffset());
+ assertEquals(3, result.get(1).getLength());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/TextileReferenceValidationRuleTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/TextileReferenceValidationRuleTest.java
new file mode 100644
index 0000000..c342312
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/TextileReferenceValidationRuleTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.textile.core.validation;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.validation.MarkupValidator;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+public class TextileReferenceValidationRuleTest extends TestCase {
+
+ private TextileReferenceValidationRule rule;
+
+ private MarkupValidator validator;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ rule = new TextileReferenceValidationRule();
+
+ validator = new MarkupValidator();
+ validator.getRules().add(rule);
+ }
+
+ public void testNoErrors() {
+ final String markup = "h1. Title\n\n\"a link\":#Title";
+ List<ValidationProblem> problems = rule.findProblems(markup, 0, markup.length());
+ System.out.println(problems);
+ assertNotNull(problems);
+ assertTrue(problems.isEmpty());
+ }
+
+ public void testErrors() {
+ final String markup = "h1. Title\n\nsome text \"a link\":#BADTitle more text";
+ List<ValidationProblem> problems = rule.findProblems(markup, 0, markup.length());
+ System.out.println(problems);
+ assertNotNull(problems);
+ assertEquals(1, problems.size());
+ assertEquals(21, problems.get(0).getOffset());
+ assertEquals(18, problems.get(0).getLength());
+ }
+
+ public void testFootnoteReference() {
+ String markup = "some text with a footnote reference[1]\n\nfn1. a footnote";
+ List<ValidationProblem> problems = rule.findProblems(markup, 0, markup.length());
+ System.out.println(problems);
+ assertNotNull(problems);
+ assertEquals(0, problems.size());
+ }
+
+ public void testFootnoteReferenceWithErrors() {
+ String markup = "some text with a footnote reference[1]\n\nfn2. a footnote";
+ List<ValidationProblem> problems = rule.findProblems(markup, 0, markup.length());
+ System.out.println(problems);
+ assertNotNull(problems);
+ assertEquals(1, problems.size());
+ assertEquals(35, problems.get(0).getOffset());
+ assertEquals(3, problems.get(0).getLength());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/ListWhitespaceValidationRuleTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/ListWhitespaceValidationRuleTest.java
new file mode 100644
index 0000000..7f59187
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/ListWhitespaceValidationRuleTest.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.twiki.core.validation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+public class ListWhitespaceValidationRuleTest extends TestCase {
+
+ private ListWhitespaceValidationRule rule;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ rule = new ListWhitespaceValidationRule();
+ }
+
+ public void testNegativeMatch() {
+ String markup = "some text\n\n * a valid list item\n * another valid list item\n\nmore text";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNull(problem);
+ }
+
+ public void testPositiveMatchSecondItemNotMultipleOf3() {
+ String markup = "some text\n\n * a valid list item\n * not a list item\n\nmore text";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(34, problem.getOffset());
+ }
+
+ public void testPositiveMatchSecondItemTab() {
+ String markup = "some text\n\n * a valid list item\n \t * not a list item\n\nmore text";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(34, problem.getOffset());
+ }
+
+ public void testPositiveMatchFirstItemNotMultipleOf3() {
+ String markup = "some text\n\n * a bad list item\n * not a list item\n\nmore text";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(11, problem.getOffset());
+ }
+
+ public void testPositiveMatchStartOfLine() {
+ String markup = "some text\n\n* a bad list item";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(11, problem.getOffset());
+ }
+
+ public void testPositiveMatchStartOfInput() {
+ String markup = "* a bad list item";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(0, problem.getOffset());
+ }
+
+ public void testPositiveMatchNoFollowingWhitespace() {
+ String markup = " *a bad list item";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(0, problem.getOffset());
+ }
+
+ public void testNegativeMatchNumeric() {
+ String markup = "some text\n\n 1. a valid list item\n 1. another valid list item\n\nmore text";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNull(problem);
+ }
+
+ public void testPositiveMatchNumeric() {
+ String markup = "some text\n\n 1. a bad list item\n 1. another valid list item\n\nmore text";
+ ValidationProblem problem = rule.findProblem(markup, 0, markup.length());
+ assertNotNull(problem);
+ assertEquals(11, problem.getOffset());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/twiki/tests/TWikiLanguageTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/twiki/tests/TWikiLanguageTest.java
new file mode 100755
index 0000000..1a758ce
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/twiki/tests/TWikiLanguageTest.java
@@ -0,0 +1,249 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+public class TWikiLanguageTest extends TestCase {
+
+ private TWikiLanguage language;
+
+ private MarkupParser parser;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ language = new TWikiLanguage();
+ parser = new MarkupParser(language);
+ }
+
+ public void testIsDetectingRawHyperlinks() {
+ assertTrue(parser.getMarkupLanguage().isDetectingRawHyperlinks());
+ }
+
+ public void testParagraphs() {
+ String html = parser.parseToHtml("first para first line\nfirst para second line\n\nsecond para\n\nthird para");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>first para first line<br/>first para second line</p><p>second para</p><p>third para</p></body>"));
+ }
+
+ public void testBold() {
+ String html = parser.parseToHtml("*bold* normal *bold and more bold* normal *not bold *");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><b>bold</b> normal <b>bold and more bold</b> normal *not bold *</p></body>"));
+ }
+
+ public void testItalic() {
+ String html = parser.parseToHtml("_italic_ normal _italic and more italic_ normal _not italic _");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><i>italic</i> normal <i>italic and more italic</i> normal _not italic _</p></body>"));
+ }
+
+ public void testBoldItalic() {
+ String html = parser.parseToHtml("__bolditalic__ normal __bolditalic and more bolditalic__ normal __not bolditalic __");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><b><i>bolditalic</i></b> normal <b><i>bolditalic and more bolditalic</i></b> normal <i>_not bolditalic _</i></p></body>"));
+ }
+
+ public void testFixedFont() {
+ String html = parser.parseToHtml("=monospace= normal =monospace and more monospace= normal =not monospace =");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><tt>monospace</tt> normal <tt>monospace and more monospace</tt> normal =not monospace =</p></body>"));
+ }
+
+ public void testBoldFixedFont() {
+ String html = parser.parseToHtml("==boldmonospace== normal ==boldmonospace and more monospace== normal ==not boldmonospace ==");
+ System.out.println(html);
+ assertTrue(html.contains("<p><b><tt>boldmonospace</tt></b> normal <b><tt>boldmonospace and more monospace</tt></b> normal <tt>=not boldmonospace =</tt></p></body>"));
+ }
+
+ public void testVerbatimBlock() {
+ String html = parser.parseToHtml("a para\n\n<verbatim>\nsome *escaped* text _no twiki here_!! not even <b>html</b>\n</verbatim>\n\nnormal para");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a para</p><p>\nsome *escaped* text _no twiki here_!! not even <b>html</b>\n</p><p>normal para</p></body>"));
+ }
+
+ public void testLiteralBlock() {
+ String html = parser.parseToHtml("a para\n\n<literal>\nsome *escaped* text _no twiki here_!! <b>html</b> is allowed\n</literal>\n\nnormal para");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a para</p><p>\nsome *escaped* text _no twiki here_!! <b>html</b> is allowed\n</p><p>normal para</p></body>"));
+ }
+
+ public void testHorizontalRule() {
+ String html = parser.parseToHtml("a para\n------\nmore text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a para</p><hr/><p>more text</p></body>"));
+ }
+
+ public void testHeadings() {
+ for (String prefix : new String[] { "!!", "" }) {
+ for (int level = 1; level <= 6; ++level) {
+ String markup = "---";
+ for (int x = 0; x < level; ++x) {
+ markup += "+";
+ }
+ markup += prefix;
+ markup += " heading text \t ";
+
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><h" + level + " id=\"headingtext\">heading text</h" + level
+ + "></body>"));
+ }
+ }
+ }
+
+ public void testDefinitionLists() {
+ String markup = "normal para1\n $ first : def1 more text\n $ second : def2 more text\nnormal para2";
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>normal para1</p><dl><dt>first </dt><dd>def1 more text</dd><dt>second </dt><dd>def2 more text</dd></dl><p>normal para2</p></body>"));
+ }
+
+ public void testTableOfContents() {
+ String html = parser.parseToHtml("---+ outline\n%TOC%\n---+ f1\n---++ f1.1\n---++ f1.2\n---+ f2\n---+ f3\n---++ f3.1");
+ System.out.println(html);
+ assertTrue(html.contains("<body><h1 id=\"outline\">outline</h1><ol><li><a href=\"#outline\">outline</a></li><li><a href=\"#f1\">f1</a><ol><li><a href=\"#f1.1\">f1.1</a></li><li><a href=\"#f1.2\">f1.2</a></li></ol></li><li><a href=\"#f2\">f2</a></li><li><a href=\"#f3\">f3</a><ol><li><a href=\"#f3.1\">f3.1</a></li></ol></li></ol><h1 id=\"f1\">f1</h1><h2 id=\"f1.1\">f1.1</h2><h2 id=\"f1.2\">f1.2</h2><h1 id=\"f2\">f2</h1><h1 id=\"f3\">f3</h1><h2 id=\"f3.1\">f3.1</h2></body>"));
+ }
+
+ public void testWikiWord() {
+ String html = parser.parseToHtml("A WikiWord points somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A <a href=\"/cgi-bin/view/Main/WikiWord\">WikiWord</a> points somewhere</p></body>"));
+ }
+
+ public void testNoAutolink() {
+ String html = parser.parseToHtml("<noautolink>A WikiWord points somewhere but not this one!</noautolink>");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A WikiWord points somewhere but not this one!</p></body>"));
+ }
+
+ public void testWikiWordEscaped() {
+ String html = parser.parseToHtml("A !WikiWord points somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A WikiWord points somewhere</p></body>"));
+ }
+
+ public void testList() {
+ String html = parser.parseToHtml(" * one\n * two\n * two.one\n * two.two\n * three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ul><li>one</li><li>two<ul><li>two.one</li><li>two.two</li></ul></li><li>three</li></ul></body>"));
+ }
+
+ public void testListWithContinuation() {
+ String html = parser.parseToHtml(" * one\n continuation on one\n * two\n * two.one\n * two.two\n continuation on two.two\n * three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ul><li>one continuation on one</li><li>two<ul><li>two.one</li><li>two.two continuation on two.two</li></ul></li><li>three</li></ul></body>"));
+ }
+
+ public void testListNumeric() {
+ String html = parser.parseToHtml(" 1. one\n 1. two\n 1. two.one\n 1. two.two\n 1. three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol><li>one</li><li>two<ol><li>two.one</li><li>two.two</li></ol></li><li>three</li></ol></body>"));
+ }
+
+ public void testListNumericLowerAlpha() {
+ String html = parser.parseToHtml(" a. one\n a. two\n a. two.one\n a. two.two\n a. three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol style=\"list-style: lower-alpha;\"><li>one</li><li>two<ol style=\"list-style: lower-alpha;\"><li>two.one</li><li>two.two</li></ol></li><li>three</li></ol></body>"));
+ }
+
+ public void testListNumericUpperAlpha() {
+ String html = parser.parseToHtml(" A. one\n A. two\n A. two.one\n A. two.two\n A. three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol style=\"list-style: upper-alpha;\"><li>one</li><li>two<ol style=\"list-style: upper-alpha;\"><li>two.one</li><li>two.two</li></ol></li><li>three</li></ol></body>"));
+ }
+
+ public void testListNumericLowerRoman() {
+ String html = parser.parseToHtml(" i. one\n i. two\n i. two.one\n i. two.two\n i. three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol style=\"list-style: lower-roman;\"><li>one</li><li>two<ol style=\"list-style: lower-roman;\"><li>two.one</li><li>two.two</li></ol></li><li>three</li></ol></body>"));
+ }
+
+ public void testListNumericUpperRoman() {
+ String html = parser.parseToHtml(" I. one\n I. two\n I. two.one\n I. two.two\n I. three");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol style=\"list-style: upper-roman;\"><li>one</li><li>two<ol style=\"list-style: upper-roman;\"><li>two.one</li><li>two.two</li></ol></li><li>three</li></ol></body>"));
+ }
+
+ public void testListNumericWithBulleted() {
+ String html = parser.parseToHtml(" 1. one\n * two");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol><li>one</li></ol><ul><li>two</li></ul></body>"));
+ }
+
+ public void testLink() {
+ String html = parser.parseToHtml("a [[http://link]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://link\">http://link</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkWithText() {
+ String html = parser.parseToHtml("a [[http://link][alt text]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://link\">alt text</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkInternal() {
+ String html = parser.parseToHtml("a [[internal link]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"/cgi-bin/view/Main/InternalLink\">internal link</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkInternal2() {
+ String html = parser.parseToHtml("a [[InternalLink]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"/cgi-bin/view/Main/InternalLink\">InternalLink</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkInternalWithText() {
+ String html = parser.parseToHtml("a [[internal link][alt text]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"/cgi-bin/view/Main/InternalLink\">alt text</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkEscaped() {
+ String html = parser.parseToHtml("a ![[http://nolink]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a [[http://nolink]] to somewhere</p></body>"));
+ }
+
+ public void testLinkMailto() {
+ String html = parser.parseToHtml("a [[mailto:someone at example.com]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"mailto:someone at example.com\">someone at example.com</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkMailtoWithText() {
+ String html = parser.parseToHtml("a [[mailto:someone at example.com][who?]] to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"mailto:someone at example.com\">who?</a> to somewhere</p></body>"));
+ }
+
+ public void testLinkImpliedMailto() {
+ String html = parser.parseToHtml("a someone at example.com to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"mailto:someone at example.com\">someone at example.com</a> to somewhere</p></body>"));
+ }
+
+ public void testIconUrls() {
+ for (String iconType : new String[] { "help", "tip", "warning" }) {
+ String html = parser.parseToHtml("a %ICON{\"" + iconType + "\"}% text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <img border=\"0\" src=\"TWikiDocGraphics/" + iconType
+ + ".gif\"/> text</p></body>"));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/AbstractDocumentTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/AbstractDocumentTest.java
new file mode 100644
index 0000000..ecaa0d8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/AbstractDocumentTest.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public abstract class AbstractDocumentTest extends TestCase {
+
+ protected IDocument createDocument(String resource) throws IOException {
+ Document document = new Document();
+
+ Reader reader = new BufferedReader(new InputStreamReader(
+ FastMarkupPartitionerTest.class.getResourceAsStream(resource)));
+ try {
+ int i;
+ StringBuilder buf = new StringBuilder(4096);
+ while ((i = reader.read()) != -1) {
+ buf.append((char) i);
+ }
+ document.set(buf.toString());
+ } finally {
+ reader.close();
+ }
+ return document;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/DialectDocumentProviderTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/DialectDocumentProviderTest.java
new file mode 100644
index 0000000..a362072
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/DialectDocumentProviderTest.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.Document;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class DialectDocumentProviderTest extends TestCase {
+
+ public void testCleanUpEolMarkers() {
+ String[] lines = new String[] { "one", "two", "three" };
+ doTestCleanUpEolMarkers(lines, "\r");
+ doTestCleanUpEolMarkers(lines, "\r\n");
+ doTestCleanUpEolMarkers(lines, "\n");
+ }
+
+ private void doTestCleanUpEolMarkers(String[] lines, String documentEol) {
+ StringBuilder buf = new StringBuilder();
+ for (String line : lines) {
+ if (buf.length() > 0) {
+ buf.append(documentEol);
+ }
+ buf.append(line);
+ }
+ Document document = new Document();
+ document.set(buf.toString());
+ MarkupDocumentProvider.cleanUpEolMarkers(document);
+
+ try {
+ String line;
+ int index = -1;
+ BufferedReader reader = new BufferedReader(new StringReader(document.get()));
+ while ((line = reader.readLine()) != null) {
+ assertEquals(lines[++index], line);
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/FastMarkupPartitionerTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/FastMarkupPartitionerTest.java
new file mode 100644
index 0000000..9b912ab
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/FastMarkupPartitionerTest.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.io.IOException;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class FastMarkupPartitionerTest extends AbstractDocumentTest {
+
+ public void testConnectLargeDocument() throws IOException {
+ IDocument document = createDocument("resources/large.textile");
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(new TextileLanguage());
+
+ long millis = System.currentTimeMillis();
+ long nanos = System.nanoTime();
+
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+
+ long nanosEnd = System.nanoTime();
+ long millisEnd = System.currentTimeMillis();
+
+ System.out.println("Elapsed Time in Nanos: " + (nanosEnd - nanos));
+ System.out.println("Elapsed Time in Millis: " + (millisEnd - millis));
+
+// assertTrue((nanosEnd - nanos) < 800000000L); removed assert due to bug 261236
+ }
+
+ public void testTextileCausesExceptionIssue36() {
+ IDocument document = new Document();
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(new TextileLanguage());
+
+ document.set("a\n" + "# a\n" + "a\n" + "# a\n" + "a\n" + "# a\n" + "\n" + "h2. a");
+
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ }
+
+ public void testTextileNestedPhraseModifiersException() {
+ IDocument document = new Document();
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(new TextileLanguage());
+
+ document.set("a _sample *bold*_");
+
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ }
+
+ /**
+ * test for bug 273100
+ */
+ public void testConfluenceTipException_bug273100() {
+ IDocument document = new Document();
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(new ConfluenceLanguage());
+
+ document.set("{tip}\ntext1\n\ntext2\n\ntext3\n{tip}\ntext4\n");
+
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ }
+
+ /**
+ * test color
+ */
+ public void testConfluenceColor() {
+ IDocument document = new Document();
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(new ConfluenceLanguage());
+
+ document.set("{color:red}\ntext1\n\ntext2{color}\ntext3\n");
+ // ...........012345678901.234567.8.9012345678901.234567.
+ // .....................10...........20.........30.......
+
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+
+// MarkupPartition(type=DIV,offset=0,length=12,end=12)
+// MarkupPartition(type=PARAGRAPH,offset=12,length=7,end=19)
+// MarkupPartition(type=PARAGRAPH,offset=19,length=13,end=32)
+// MarkupPartition(type=PARAGRAPH,offset=32,length=6,end=38)
+
+ int[][] expected = new int[][] { //
+ { 0, 12 }, //
+ { 12, 7 },//
+ { 19, 13 }, //
+ { 32, 6 }, //
+ };
+
+ ITypedRegion[] partitioning = partitioner.computePartitioning(0, document.getLength(), false);
+ assertPartitioningAsExpected(expected, partitioning);
+ }
+
+ public void testConfluenceColor2() {
+ IDocument document = new Document();
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(new ConfluenceLanguage());
+
+ document.set("{color:blue}\n{tip}\ntip\n{tip}\ntext\n{note}\nnote\n{note}\n");
+ // ...........0123456789012.345678.9012.345678.90123.4567890.12345.6789012.
+ // .....................10..........20..........30.........40..........50..
+ //
+ // MarkupPartition(type=PARAGRAPH,offset=19,length=10,end=29) cannot start before partition
+ // MarkupPartition(type=PARAGRAPH,offset=29,length=5,end=34).
+
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+//
+// expect:
+//
+// MarkupPartition(type=DIV,offset=0,length=13,end=13)
+// MarkupPartition(type=TIP,offset=13,length=6,end=19)
+// MarkupPartition(type=PARAGRAPH,offset=19,length=10,end=29)
+// MarkupPartition(type=PARAGRAPH,offset=29,length=5,end=34)
+// MarkupPartition(type=NOTE,offset=34,length=7,end=41)
+// MarkupPartition(type=PARAGRAPH,offset=41,length=12,end=53)
+
+ int[][] expected = new int[][] { //
+ { 0, 13 }, //
+ { 13, 6 },//
+ { 19, 10 }, //
+ { 29, 5 }, //
+ { 34, 7 }, //
+ { 41, 12 } //
+ };
+
+ ITypedRegion[] partitioning = partitioner.computePartitioning(0, document.getLength(), false);
+ assertPartitioningAsExpected(expected, partitioning);
+ }
+
+ private void assertPartitioningAsExpected(int[][] expected, ITypedRegion[] partitioning) {
+ assertEquals(expected.length, partitioning.length);
+ for (int x = 0; x < expected.length; ++x) {
+ ITypedRegion region = partitioning[x];
+ assertEquals(String.format("partition %s offset expected %s but got %s", x, expected[x][0],
+ region.getOffset()), expected[x][0], region.getOffset());
+ assertEquals(String.format("partition %s length expected %s but got %s", x, expected[x][1],
+ region.getLength()), expected[x][1], region.getLength());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/resources/large.textile b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/resources/large.textile
new file mode 100644
index 0000000..bab585b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/resources/large.textile
@@ -0,0 +1,2167 @@
+h1. This is an Example Of A Large Textile Document
+
+The text just goes on and on
+
+* with some bullets
+** and multiple levels
+* and more bullets
+* still more
+** when is this going to end?
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+h1. This is an Example Of A Large Textile Document
+
+The text just goes on and on
+
+* with some bullets
+** and multiple levels
+* and more bullets
+* still more
+** when is this going to end?
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+h1. This is an Example Of A Large Textile Document
+
+The text just goes on and on
+
+* with some bullets
+** and multiple levels
+* and more bullets
+* still more
+** when is this going to end?
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+h1. This is an Example Of A Large Textile Document
+
+The text just goes on and on
+
+* with some bullets
+** and multiple levels
+* and more bullets
+* still more
+** when is this going to end?
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+h1. This is an Example Of A Large Textile Document
+
+The text just goes on and on
+
+* with some bullets
+** and multiple levels
+* and more bullets
+* still more
+** when is this going to end?
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+h1. This is an Example Of A Large Textile Document
+
+The text just goes on and on
+
+* with some bullets
+** and multiple levels
+* and more bullets
+* still more
+** when is this going to end?
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
+h2. a subtitle
+
+with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.with some paragraph text of any kind.
+
+h3. another subtitle
+
+sdf
+
+h3. sdf
+
+h2. asdfasfdasdll; asdl
+
+important to have some *bolded text* and _some_ other __styles__ where it makes sense.
+Also we'll see !an image! or !two.jpg!. @Coded nicely@ for some variety.
+
+
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemAdapterFactoryTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemAdapterFactoryTest.java
new file mode 100644
index 0000000..bad9b69
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemAdapterFactoryTest.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.tests.EclipseRuntimeRequired;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+/**
+ *
+ * @author David Green
+ */
+ at EclipseRuntimeRequired
+public class OutlineItemAdapterFactoryTest extends TestCase {
+
+ public void testAdaptsToIWorkbenchAdapter() {
+ Object adapter = Platform.getAdapterManager().getAdapter(new OutlineItem(null, 0, "id", 0, 10, "ID"),
+ IWorkbenchAdapter.class);
+ assertNotNull(adapter);
+ assertTrue(IWorkbenchAdapter.class.isAssignableFrom(adapter.getClass()));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemWorkbenchAdapterTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemWorkbenchAdapterTest.java
new file mode 100644
index 0000000..91953bf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemWorkbenchAdapterTest.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.tests.EclipseRuntimeRequired;
+
+/**
+ *
+ * @author David Green
+ */
+ at EclipseRuntimeRequired
+public class OutlineItemWorkbenchAdapterTest extends TestCase {
+
+ private OutlineItem outline;
+
+ private OutlineItem child1;
+
+ private OutlineItem child2;
+
+ private OutlineItemWorkbenchAdapter adapter;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ outline = new OutlineItem(null, 0, "<root>", 0, 100, "<root>");
+
+ child1 = new OutlineItem(outline, 1, "id1", 0, 10, "one");
+ child2 = new OutlineItem(outline, 1, "id2", 11, 50, "two");
+
+ adapter = new OutlineItemWorkbenchAdapter();
+ }
+
+ public void testGetParent() {
+ assertNull(adapter.getParent(outline));
+ assertSame(outline, adapter.getParent(child1));
+ assertSame(outline, adapter.getParent(child2));
+ }
+
+ public void testGetChildren() {
+ assertEquals(2, adapter.getChildren(outline).length);
+ assertSame(child1, adapter.getChildren(outline)[0]);
+ assertSame(child2, adapter.getChildren(outline)[1]);
+ assertEquals(0, adapter.getChildren(child1).length);
+ assertEquals(0, adapter.getChildren(child2).length);
+ }
+
+ public void testGetLabel() {
+ assertTrue(adapter.getLabel(outline).indexOf(outline.getLabel()) != -1);
+ assertTrue(adapter.getLabel(child1).indexOf(child1.getLabel()) != -1);
+ assertTrue(adapter.getLabel(child2).indexOf(child2.getLabel()) != -1);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/CssStyleManagerTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/CssStyleManagerTest.java
new file mode 100644
index 0000000..e8b5bb9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/CssStyleManagerTest.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class CssStyleManagerTest extends TestCase {
+
+ private CssStyleManager cssStyleManager;
+
+ @Override
+ public void setUp() {
+ cssStyleManager = new CssStyleManager();
+ }
+
+ public void testColorToRgb() {
+ Integer white = CssStyleManager.cssColorRgb("white");
+ assertNotNull(white);
+ Integer white2 = CssStyleManager.cssColorRgb("White");
+ assertNotNull(white2);
+
+ Integer white3 = CssStyleManager.cssColorRgb("#FFFFFF");
+ assertNotNull(white3);
+
+ Integer white4 = CssStyleManager.cssColorRgb("rgb(255,255,255)");
+ assertNotNull(white4);
+
+ assertEquals(white, white2);
+ assertEquals(white, white3);
+ assertEquals(white, white4);
+ }
+
+ public void processCssStyles(FontState state, FontState parentState, String cssStyles) {
+ Iterator<CssRule> ruleIterator = new CssParser().createRuleIterator(cssStyles);
+ while (ruleIterator.hasNext()) {
+ cssStyleManager.processCssStyles(state, parentState, ruleIterator.next());
+ }
+ }
+
+ public void testProcessCssStyles() {
+ FontState defaultState = new FontState();
+ defaultState.size = 12;
+ FontState state = new FontState();
+ processCssStyles(state, defaultState,
+ "font-size: 14px;color: rgb(3,3,3);font-style: italic bold;text-decoration: underline; background-color: blue;");
+
+ assertEquals(14.0f, state.size);
+ assertEquals(new RGB(0, 0, 255), state.background);
+ assertEquals(new RGB(3, 3, 3), state.foreground);
+ assertTrue(state.isBold());
+ assertTrue(state.isItalic());
+ assertTrue(state.isUnderline());
+ }
+
+ public void testProcessCssStylesNoStyles() {
+ FontState defaultState = new FontState();
+ defaultState.size = 12;
+ FontState state = new FontState();
+
+ assertEquals(0.0f, state.size);
+ assertEquals(null, state.background);
+ assertEquals(null, state.foreground);
+ assertFalse(state.isBold());
+ assertFalse(state.isItalic());
+ assertFalse(state.isUnderline());
+ assertFalse(state.isFixedWidth());
+ assertFalse(state.isStrikethrough());
+ assertFalse(state.isSubscript());
+ assertFalse(state.isSuperscript());
+
+ assertEquals(new FontState(), state);
+
+ processCssStyles(state, defaultState, "");
+
+ assertEquals(0.0f, state.size);
+ assertEquals(null, state.background);
+ assertEquals(null, state.foreground);
+ assertFalse(state.isBold());
+ assertFalse(state.isItalic());
+ assertFalse(state.isUnderline());
+ assertFalse(state.isFixedWidth());
+ assertFalse(state.isStrikethrough());
+ assertFalse(state.isSubscript());
+ assertFalse(state.isSuperscript());
+
+ assertEquals(new FontState(), state);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/HtmlTextPresentationParserTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/HtmlTextPresentationParserTest.java
new file mode 100644
index 0000000..d6c63c4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/HtmlTextPresentationParserTest.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class HtmlTextPresentationParserTest extends TestCase {
+
+ private HtmlTextPresentationParser parser;
+
+ @Override
+ public void setUp() {
+ parser = new HtmlTextPresentationParser();
+ parser.setPresentation(new TextPresentation());
+ parser.setDefaultFont(new Font(null, new FontData[] { new FontData("fake", 12, 0) }));
+ }
+
+ public void testAdjacentElementsSeparatedByWhitespace() throws Exception {
+ parser.parse("<html><body><p><strong>one</strong> <em>two</em></p></body></html>");
+ String text = parser.getText();
+ System.out.println("text: '" + text + "'");
+ assertTrue(text.contains("one two"));
+ }
+
+ /**
+ * Test for bug# 236367
+ */
+ public void testSignificantWhitespaceLossBug236367() throws SAXException, IOException {
+ String html = new MarkupParser(new TextileLanguage()).parseToHtml("one *two* three *four* five *six* seven");
+ System.out.println("HTML: " + html);
+ parser.parse(html);
+ String text = parser.getText();
+ System.out.println("text: '" + text + "'");
+ assertTrue(text.contains("one two three four five six seven"));
+ }
+
+ public void testOrderedListBlockHandling() throws Exception {
+ parser.parse("<html><body><ol><li> one </li><li> two </li></ol></body></html>");
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(text.contains("\t1. one\n\t2. two"));
+ }
+
+ public void testOrderedListBlockHandling2() throws Exception {
+ parser.parse("<html><body><ol><li> <b>one</b> </li><li> two </li></ol></body></html>");
+ String text = parser.getText();
+ System.out.println("text: '" + text + "'");
+ assertTrue(text.contains("\t1. one\n\t2. two"));
+ }
+
+ public void testUnorderedListBlockHandling() throws Exception {
+ parser.setBulletChars(new char[] { 'A', 'B', 'C' });
+ parser.parse("<html><body><ul><li> one</li><li> two<ul><li>two.one</li></ul></li></ul></body></html>");
+
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(text.contains("\tA one\n\tA two\n\t\tB two.one"));
+ }
+
+ public void testParagraphBlockHandling() throws Exception {
+ parser.parse("<html><body><p>first para\n\nwith some newlines</p>\n\n<p>second para</p></body></html>");
+ String text = parser.getText();
+ System.out.println("text: '" + text + "'");
+ assertTrue(text.contains("first para with some newlines\n\nsecond para"));
+ }
+
+ public void testParagraphBlockHandlingWithBR() throws Exception {
+ parser.parse("<html><body><p>first para<br/>\nwith one newline plus br</p>\n\n<p>second para</p></body></html>");
+ String text = parser.getText();
+ System.out.println("text: '" + text + "'");
+ assertTrue(text.contains("first para\nwith one newline plus br\n\nsecond para"));
+ }
+
+ public void testParagraphBlockHandlingWithBR2() throws Exception {
+ parser.parse("<html><body><p>first para<br/>with one newline plus br</p>\n\n<p>second para</p></body></html>");
+ String text = parser.getText();
+ System.out.println("text: '" + text + "'");
+ assertTrue(text.contains("first para\nwith one newline plus br\n\nsecond para"));
+ }
+
+ public void testDefinitionList() throws Exception {
+ parser.parse("<html><body><dl><dt>foo</dt><dd>bar baz</dd></dl></body></html>");
+ String text = parser.getText();
+ System.out.println("text:\n" + text + "'");
+ assertTrue(text.contains("foo\n\tbar baz"));
+ }
+
+ public void testNonParaText() throws Exception {
+ parser.parse("<html><body><p>one</p>two<p>three</p></body></html>");
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(text.contains("one\n\ntwo\n\nthree"));
+ }
+
+ public void testBlockQuoteParaWhitespace() throws Exception {
+ parser.parse("<html><body><p>one</p><blockquote><p>two</p></blockquote><p>three</p></body></html>");
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(text.contains("one\n\n\ttwo\n\nthree"));
+ }
+
+ public void testBR() throws Exception {
+ parser.parse("<html><head></head><body><p>One<br/>Two</p></body></html>");
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(text.contains("One\nTwo"));
+ }
+
+ public void testWhitespaceAfterTable() throws Exception {
+ parser.parse("<html><head></head><body>before<table><tr><td>in1</td></tr><tr><td>in2</td></tr></table>after</body></html>");
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(text.contains("in1 \t\nin2 \t\n\nafter"));
+ }
+
+ public void testWhitespaceAfterEmdash() throws Exception {
+ String html = "<html><body><p>Foo<br/>Bar — baz</p></body></html>";
+ parser.parse(html);
+ String text = parser.getText();
+ System.out.println("text:\n" + text);
+ assertTrue(Pattern.compile("Bar\\s\\S\\sbaz", Pattern.MULTILINE).matcher(text).find());
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/confluence/core/ConfluenceLanguageTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/confluence/core/ConfluenceLanguageTest.java
new file mode 100644
index 0000000..fe9989b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/confluence/core/ConfluenceLanguageTest.java
@@ -0,0 +1,612 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.confluence.core;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DocBookDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class ConfluenceLanguageTest extends TestCase {
+
+ private MarkupParser parser;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ initParser();
+ }
+
+ private void initParser() {
+ parser = new MarkupParser();
+ parser.setMarkupLanguage(new ConfluenceLanguage());
+ }
+
+ public void testIsDetectingRawHyperlinks() {
+ assertTrue(parser.getMarkupLanguage().isDetectingRawHyperlinks());
+ }
+
+ public void testParagraph() throws Exception {
+ String html = parser.parseToHtml("a paragraph\n\nanother paragraph\nwith\n2 lines");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><p>a paragraph</p><p>another paragraph<br/>\\s*with<br/>\\s*2 lines</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testHeadings() {
+ for (int x = 1; x <= 6; ++x) {
+ initParser();
+ String html = parser.parseToHtml("h" + x + ". a heading\n\nwith a para");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"aheading\">a heading</h" + x + "><p>with a para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+
+ html = parser.parseToHtml("h" + x + ". a heading\nwith a para");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"aheading\">a heading</h" + x + "><p>with a para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+
+ html = parser.parseToHtml(" h" + x + ". a heading\n\nwith a para");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"aheading\">a heading</h" + x + "><p>with a para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+ }
+
+ public void testBlockQuote() {
+ String html = parser.parseToHtml("bq. a multiline\nblock quote\n\nwith a para");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><blockquote><p>a multiline<br/>\\s*block quote</p></blockquote><p>with a para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testBlockQuoteExtended() {
+ String html = parser.parseToHtml("{quote}\na multiline\nblock quote\n\nwith two paras\n{quote}\nanother para");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><blockquote><p>a multiline<br/>\\s*block quote</p><p>with two paras</p></blockquote><p>another para</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testBlockQuoteExtended2() {
+ String html = parser.parseToHtml("{quote}this is a quote{quote}\nsome more text");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><blockquote><p>this is a quote</p></blockquote><p>some more text</p></body>"));
+ }
+
+ public void testBlockQuoteExtendedUnclosed() {
+ String html = parser.parseToHtml("{quote}\na multiline\nblock quote\n\nwith two paras\n");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "<body><blockquote><p>a multiline<br/>\\s*block quote</p><p>with two paras</p></blockquote></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testBlockQuoteExtendedLeadingSpaces() {
+ String html = parser.parseToHtml(" {quote}\na multiline\nblock quote\n {quote}\nmore text");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><blockquote><p>a multiline<br/>block quote</p></blockquote><p>more text</p></body>"));
+ }
+
+ public void testBlockQuoteExtendedBreaksPara() {
+ String html = parser.parseToHtml("a para\n{quote}quoted{quote}new para");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><p>a para</p><blockquote><p>quoted</p></blockquote><p>new para</p></body>"));
+ }
+
+ public void testBlockQuoteWithBulletedList() {
+ String html = parser.parseToHtml("{quote}\ntext\n* a list\n* second item\nmore text\n{quote}\nanother para");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><blockquote><p>text</p><ul><li>a list</li><li>second item</li></ul><p>more text</p></blockquote><p>another para</p></body>"));
+ }
+
+ public void testSimplePhraseModifiers() throws IOException {
+ Object[][] pairs = new Object[][] { { "*", "strong" }, { "_", "em" }, { "??", "cite" }, { "-", "del" },
+ { "+", "u" }, { "^", "sup" }, { "~", "sub" }, };
+ for (Object[] pair : pairs) {
+ initParser();
+ String html = parser.parseToHtml("a paragraph with " + pair[0] + "content foo bar baz" + pair[0]);
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <" + pair[1] + ">content foo bar baz</" + pair[1] + "></p>"));
+ }
+ }
+
+ public void testMonospaced() {
+ String html = parser.parseToHtml("a paragraph with {{content foo bar baz}}");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <tt>content foo bar baz</tt></p>"));
+ }
+
+ public void testLineBreak() {
+ String html = parser.parseToHtml("a paragraph with an arbitrary\\\\line break");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<body><p>a paragraph with an arbitrary<br/>\\s*line break</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testEndash() {
+ String html = parser.parseToHtml("an endash -- foo");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("endash – foo"));
+ }
+
+ public void testEmdash() {
+ String html = parser.parseToHtml("an emdash --- foo");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("emdash — foo"));
+ }
+
+ public void testHorizontalRule() {
+ String html = parser.parseToHtml("an hr ---- foo");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("hr <hr/> foo"));
+ }
+
+ public void testHyperlink() {
+ String html = parser.parseToHtml("a [http://example.com] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkWithTitle() {
+ String html = parser.parseToHtml("a [Example|http://example.com] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">Example</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkWithTitle2() {
+ String html = parser.parseToHtml("a [Example Two | http://example.com] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">Example Two</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkHash() {
+ String html = parser.parseToHtml("a [Example|#example] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"#example\">Example</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkHash2() {
+ String html = parser.parseToHtml("a [#example] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"#example\">example</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkWithTip() {
+ String html = parser.parseToHtml("a [example | http://example.com | title is here] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\" title=\"title is here\">example</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkImplied() {
+ String html = parser.parseToHtml("a http://example.com hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkImpliedNegativeMatch() {
+ String html = parser.parseToHtml("a http://example.com. hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a>. hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkImpliedNegativeMatch2() {
+ String html = parser.parseToHtml("a http://example.com) hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a>) hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkWithSpaces() {
+ String html = parser.parseToHtml("a [ http://example.com ] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkWithTitleAndSpace() {
+ String html = parser.parseToHtml("a [Example Two | http://example.com ] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">Example Two</a> hyperlink</p></body>"));
+ }
+
+ public void testNamedAnchor() {
+ String html = parser.parseToHtml("a {anchor:a23423} named anchor");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <span id=\"a23423\"></span> named anchor</p></body>"));
+ }
+
+ public void testListUnordered() throws IOException {
+ String html = parser.parseToHtml("* a list\n* with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ul>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ul>"));
+ }
+
+ public void testListOrdered() throws IOException {
+ String html = parser.parseToHtml("# a list\n# with two lines");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListNested() throws IOException {
+ String html = parser.parseToHtml("# a list\n## nested\n## nested2\n# level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list"));
+ assertTrue(html.contains("<li>nested"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListMixed() throws IOException {
+ // test for bug# 47
+ String html = parser.parseToHtml("# first\n* second");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>first</li></ol><ul><li>second</li></ul>"));
+ }
+
+ public void testListNestedMixed() throws IOException {
+ String html = parser.parseToHtml("# a list\n#* nested\n#* nested2\n# level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>a list<ul><li>nested</li><li>nested2</li></ul></li><li>level1</li></ol>"));
+ }
+
+ public void testImage() {
+ String html = parser.parseToHtml("an !image.png! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithFullUrl() {
+ String html = parser.parseToHtml("an !http://www.foo.com/bin/image.png! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img border=\"0\" src=\"http://www.foo.com/bin/image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesAlignRight() {
+ String html = parser.parseToHtml("an !image.png|align=right! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img align=\"right\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesAlignLeft() {
+ String html = parser.parseToHtml("an !image.png|align=left! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img align=\"left\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesAlignMiddle() {
+ String html = parser.parseToHtml("an !image.png|align=middle! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img align=\"middle\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesAlignCenter() {
+ String html = parser.parseToHtml("an !image.png|align=center! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img align=\"center\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesAlt() {
+ String html = parser.parseToHtml("an !image.png|alt= some alt text! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img alt=\"some alt text\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesBorder() {
+ String html = parser.parseToHtml("an !image.png|border=5! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img border=\"5\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesWidth() {
+ String html = parser.parseToHtml("an !image.png|width=5! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img width=\"5\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesHeight() {
+ String html = parser.parseToHtml("an !image.png|height=5! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img height=\"5\" border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAttributesHeightBadValue() {
+ String html = parser.parseToHtml("an !image.png|height=5a! image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>an <img border=\"0\" src=\"image.png\"/> image</p></body>"));
+ }
+
+ public void testImageNegativeMatch() {
+ // Issue 67: https://textile-j.dev.java.net/issues/show_bug.cgi?id=67
+ String html = parser.parseToHtml("I really like ice cream! Yay!");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>I really like ice cream! Yay!</p></body>"));
+ }
+
+ public void testTable() {
+ String html = parser.parseToHtml("|a|row|not header|");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><td>a</td><td>row</td><td>not header</td></tr></table></body>"));
+ }
+
+ public void testTableWithHeader() {
+ String html = parser.parseToHtml("||a||header||row||\n|a|row|not header|");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><th>a</th><th>header</th><th>row</th></tr><tr><td>a</td><td>row</td><td>not header</td></tr></table></body>"));
+ }
+
+ public void testTableNestedWithHeader() {
+ String html = parser.parseToHtml("a para\n||a||header||row||\n|a|row|not header|\ntail");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a para</p><table><tr><th>a</th><th>header</th><th>row</th></tr><tr><td>a</td><td>row</td><td>not header</td></tr></table><p>tail</p></body>"));
+ }
+
+ public void testTableWithLinkAndPipes() {
+ // test for bug# 244240
+ String html = parser.parseToHtml("| [Website|https://textile-j.dev.java.net/] |");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><td> <a href=\"https://textile-j.dev.java.net/\">Website</a> </td></tr></table></body>"));
+ }
+
+ public void testTableWithLinkAndPipes2() {
+ // test for bug# 244240
+ String html = parser.parseToHtml("| [Website|https://textile-j.dev.java.net/] | another cell | [Eclipse|http://www.eclipse.org] |");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><td> <a href=\"https://textile-j.dev.java.net/\">Website</a> </td><td> another cell </td><td> <a href=\"http://www.eclipse.org\">Eclipse</a> </td></tr></table></body>"));
+ }
+
+ public void testPreformattedExtended() {
+ String html = parser.parseToHtml("{noformat}\na multiline\n\tpreformatted\n\nwith two paras\n{noformat}\nanother para");
+ System.out.println("HTML:" + html);
+ assertTrue(Pattern.compile(
+ "body><pre>a multiline\\s+preformatted\\s+with two paras\\s+</pre><p>another para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testPreformattedExtended2() {
+ String html = parser.parseToHtml("{noformat}\na multiline\n\tpreformatted\n\nwith two paras{noformat}another para");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><pre>a multiline"));
+ assertTrue(html.contains("</pre><p>another para</p></body>"));
+ assertTrue(Pattern.compile("with two paras\\s*</pre>", Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testBlockCode() {
+ String html = parser.parseToHtml("h1. a header\n" + "\n" + "Some text\n" + "{code:language=Java}\n"
+ + "public class Foo {\n" + "}\n" + "{code}" + "\n" + "More text...");
+ System.out.println("HTML:" + html);
+
+ assertTrue(Pattern.compile("<p>Some text</p><pre><code>", Pattern.MULTILINE).matcher(html).find());
+ assertTrue(html.contains("<code>\npublic class Foo {\n"));
+ assertTrue(html.contains("</code></pre><p>More text...</p>"));
+ }
+
+ public void testBlockCode2() {
+ String html = parser.parseToHtml("{code}some code{code}more text");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><pre><code>some code"));
+ assertTrue(html.contains("</code></pre><p>more text</p></body>"));
+ }
+
+ public void testBlockCodeJava() {
+ String html = parser.parseToHtml("{code:Java}some code{code}more text");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><pre><code class=\"java code-java\">some code"));
+ assertTrue(html.contains("</code></pre><p>more text</p></body>"));
+ }
+
+ public void testNote() {
+ String html = parser.parseToHtml("h1. a header\n" + "\n" + "Some text\n" + "{note:title=A Title}\n"
+ + "the body of the note\n" + "which may span multiple lines\n" + "\n"
+ + "And may even have multiple paragraphs or *other* _textile_ ??markup??\n" + "{note}" + "\n"
+ + "More text...");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<p>Some text</p><div class=\"note\""));
+ assertTrue(html.contains("</p></div><p>More text...</p>"));
+ assertTrue(html.contains("or <strong>other</strong> <em>textile</em> <cite>markup</cite>"));
+ assertFalse(html.contains("{note"));
+ }
+
+ public void testNote2() {
+ StringWriter out = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out);
+ builder.setUseInlineStyles(false);
+ parser.setBuilder(builder);
+ parser.parse("{note}this is a note {note}\n\n* one thing\n* two things");
+ String html = out.toString();
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><div class=\"note\"><p>this is a note </p></div><ul><li>one thing</li><li>two things</li></ul></body>"));
+ }
+
+ public void testNote3() {
+ StringWriter out = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out);
+ builder.setUseInlineStyles(false);
+ parser.setBuilder(builder);
+ parser.parse("{note}this is a note {note}*bold* text\nfoo\n\nbar");
+ String html = out.toString();
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><div class=\"note\"><p>this is a note </p></div><p><strong>bold</strong> text<br/>foo</p><p>bar</p></body>"));
+ }
+
+ public void testNote4() {
+ StringWriter out = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out);
+ builder.setUseInlineStyles(false);
+ parser.setBuilder(builder);
+ parser.parse("abc{note}this is a note {note}*bold* text\nfoo\n\nbar");
+ String html = out.toString();
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<body><p>abc</p><div class=\"note\"><p>this is a note </p></div><p><strong>bold</strong> text<br/>foo</p><p>bar</p></body>"));
+ }
+
+ public void testInfo() {
+ String html = parser.parseToHtml("h1. a header\n" + "\n" + "Some text\n" + "{info:title=A Title}\n"
+ + "the body of the note\n" + "which may span multiple lines\n" + "\n"
+ + "And may even have multiple paragraphs or *other* _textile_ ??markup??\n" + "{info}" + "\n"
+ + "More text...");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<p>Some text</p><div class=\"info\""));
+ assertTrue(html.contains("</p></div><p>More text...</p>"));
+ assertTrue(html.contains("or <strong>other</strong> <em>textile</em> <cite>markup</cite>"));
+ assertFalse(html.contains("{info"));
+ }
+
+ public void testWarning() {
+ String html = parser.parseToHtml("h1. a header\n" + "\n" + "Some text\n" + "{warning:title=A Title}\n"
+ + "the body of the note\n" + "which may span multiple lines\n" + "\n"
+ + "And may even have multiple paragraphs or *other* _textile_ ??markup??\n" + "{warning}" + "\n"
+ + "More text...");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<p>Some text</p><div class=\"warning\""));
+ assertTrue(html.contains("</p></div><p>More text...</p>"));
+ assertTrue(html.contains("or <strong>other</strong> <em>textile</em> <cite>markup</cite>"));
+ assertFalse(html.contains("{warning"));
+ }
+
+ public void testTip() {
+ String html = parser.parseToHtml("h1. a header\n" + "\n" + "Some text\n" + "{tip:title=A Title}\n"
+ + "the body of the note\n" + "which may span multiple lines\n" + "\n"
+ + "And may even have multiple paragraphs or *other* _textile_ ??markup??\n" + "{tip}" + "\n"
+ + "More text...");
+ System.out.println("HTML:" + html);
+ assertTrue(html.contains("<p>Some text</p><div class=\"tip\""));
+ assertTrue(html.contains("</p></div><p>More text...</p>"));
+ assertTrue(html.contains("or <strong>other</strong> <em>textile</em> <cite>markup</cite>"));
+ assertFalse(html.contains("{tip"));
+ }
+
+ public void testTipToDocBook() {
+ StringWriter out = new StringWriter();
+ parser.setBuilder(new DocBookDocumentBuilder(out));
+ parser.parse("h1. a header\n" + "\n" + "Some text\n" + "{tip:title=A Title}\n" + "the body of the note\n"
+ + "which may span multiple lines\n" + "\n"
+ + "And may even have multiple paragraphs or *other* _textile_ ??markup??\n" + "{tip}" + "\n"
+ + "More text...");
+ String docbook = out.toString();
+ System.out.println("DocBook: " + docbook);
+ assertTrue(docbook.contains("<tip><title>A Title</title><para>the body of"));
+ assertTrue(docbook.contains("paragraphs or <emphasis role=\"bold\">other</emphasis> <emphasis>textile</emphasis> <citation>markup</citation></para></tip>"));
+ }
+
+ public void testTableOfContents() throws IOException {
+ String html = parser.parseToHtml("h1. Table Of Contents\n\n{toc}\n\nh1. Top Header\n\nsome text\n\nh2. Subhead\n\nh2. Subhead2\n\nh1. Top Header 2\n\nh2. Subhead 3\n\nh3. Subhead 4");
+
+ System.out.println("HTML: \n" + html);
+
+ assertTrue(html.contains("<a href=\"#Subhead2\">"));
+ assertTrue(html.contains("<h2 id=\"Subhead2\">"));
+ assertTrue(html.contains("href=\"#Subhead4\""));
+ assertTrue(html.contains("<h3 id=\"Subhead4\">"));
+ }
+
+ public void testTableOfContentsWithMaxLevel() throws IOException {
+ String html = parser.parseToHtml("h1. Table Of Contents\n\n{toc:maxLevel=2}\n\nh1. Top Header\n\nsome text\n\nh2. Subhead\n\nh2. Subhead2\n\nh1. Top Header 2\n\nh2. Subhead 3\n\nh3. Subhead 4");
+
+ System.out.println("HTML: \n" + html);
+
+ assertTrue(html.contains("<a href=\"#Subhead2\">"));
+ assertTrue(html.contains("<h2 id=\"Subhead2\">"));
+ assertFalse(html.contains("href=\"#Subhead4\""));
+ assertTrue(html.contains("<h3 id=\"Subhead4\">"));
+ }
+
+ public void testBoldItalicsBold() {
+ String html = parser.parseToHtml("*bold _ital ics_ bold*");
+ System.out.println(html);
+ assertTrue(html.contains("<strong>bold <em>ital ics</em> bold</strong>"));
+ }
+
+ public void testItalicsBold() {
+ String html = parser.parseToHtml("_italics *bol d* italics_");
+ System.out.println(html);
+ assertTrue(html.contains("<em>italics <strong>bol d</strong> italics</em>"));
+ }
+
+ public void testBoldItalics() {
+ String html = parser.parseToHtml("*_bold and italic_ not just bold*");
+ System.out.println(html);
+ assertTrue(html.contains("<strong><em>bold and italic</em> not just bold</strong>"));
+ }
+
+ public void testInlineQuote() {
+ String html = parser.parseToHtml("a paragraph {quote}with inline{quote} quote");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a paragraph <q>with inline</q> quote</p></body>"));
+ }
+
+ public void testInlineQuoteWithBullets() {
+ String html = parser.parseToHtml("* a bullet {quote}with inline{quote} quote");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ul><li>a bullet <q>with inline</q> quote</li></ul></body>"));
+ }
+
+ public void testInlineQuoteWithBullets2() {
+ String html = parser.parseToHtml("* {quote}a bullet with inline{quote} quote");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ul><li><q>a bullet with inline</q> quote</li></ul></body>"));
+ }
+
+ public void testInlineQuoteNegativeMatch() {
+ String html = parser.parseToHtml("a paragraph {quote}with inline quote");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a paragraph {quote}with inline quote</p></body>"));
+ }
+
+ public void testInlineQuoteNegativeMatch2() {
+ String html = parser.parseToHtml("{quote}a paragraph with {quote}inline quote{quote}");
+ System.out.println(html);
+ assertTrue(html.contains("<body><blockquote><p>a paragraph with </p></blockquote><p>inline quote{quote}</p></body>"));
+ }
+
+ public void testColor() {
+ String html = parser.parseToHtml("{color:red}\na paragraph\n\nanother paragraph\n{color}\ntext");
+ System.out.println(html);
+ assertTrue(html.contains("<body><div style=\"color: red;\"><p>a paragraph</p><p>another paragraph</p></div><p>text</p></body>"));
+ }
+
+ public void testColor2() {
+ String html = parser.parseToHtml("{color:red}a paragraph\n\nanother paragraph{color}text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><div style=\"color: red;\"><p>a paragraph</p><p>another paragraph</p></div><p>text</p></body>"));
+ }
+
+ public void testColor3() {
+ String html = parser.parseToHtml("text {color:red}more text{color} text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>text </p><div style=\"color: red;\"><p>more text</p></div><p> text</p></body>"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/confluence/core/Main.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/confluence/core/Main.java
new file mode 100644
index 0000000..45e39e1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/confluence/core/Main.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.confluence.core;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.tests.AbstractTestApplication;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Main extends AbstractTestApplication {
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ try {
+ Main main = new Main();
+ main.doMain();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new ConfluenceLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/HtmlDocumentBuilderTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/HtmlDocumentBuilderTest.java
new file mode 100644
index 0000000..71acdc9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/HtmlDocumentBuilderTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HtmlDocumentBuilderTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private StringWriter out;
+
+ private HtmlDocumentBuilder builder;
+
+ @Override
+ public void setUp() {
+ parser = new MarkupParser();
+ parser.setMarkupLanguage(new TextileLanguage());
+ out = new StringWriter();
+ builder = new HtmlDocumentBuilder(out);
+ parser.setBuilder(builder);
+ }
+
+ public void testRelativeUrlWithBase() throws URISyntaxException {
+ builder.setBase(new URI("http://www.foo.bar/baz"));
+ parser.parse("\"An URL\":foo/bar.html");
+ String html = out.toString();
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.foo.bar/baz/foo/bar.html\">An URL</a>"));
+ }
+
+ public void testAbsoluteUrlWithBase() throws URISyntaxException {
+ builder.setBase(new URI("http://www.foo.bar/baz"));
+ parser.parse("\"An URL\":http://www.baz.ca/foo/bar.html");
+ String html = out.toString();
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.baz.ca/foo/bar.html\">An URL</a>"));
+ }
+
+ public void testRelativeUrlWithFileBase() throws URISyntaxException {
+ builder.setBase(new File("/base/2/with space/").toURI());
+ parser.parse("\"An URL\":foo/bar.html");
+ String html = out.toString();
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"file:/base/2/with%20space/foo/bar.html\">An URL</a>"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/DocBookDocumentBuilderTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/DocBookDocumentBuilderTest.java
new file mode 100644
index 0000000..91e228c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/DocBookDocumentBuilderTest.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class DocBookDocumentBuilderTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private StringWriter out;
+
+ private DocBookDocumentBuilder builder;
+
+ @Override
+ public void setUp() {
+ parser = new MarkupParser();
+ parser.setMarkupLanguage(new TextileLanguage());
+ out = new StringWriter();
+ builder = new DocBookDocumentBuilder(out);
+ parser.setBuilder(builder);
+
+ }
+
+ public void testInlineImage() {
+ parser.parse("some text !(inline)images/foo.png! some text");
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+ assertTrue(docbook.contains("<inlinemediaobject><imageobject><imagedata fileref=\"images/foo.png\"/></imageobject></inlinemediaobject>"));
+ }
+
+ public void testInlineQuote() {
+ parser.setMarkupLanguage(new ConfluenceLanguage());
+ parser.parse("some text {quote}quoted text{quote} some text");
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+ assertTrue(docbook.contains("<para>some text <quote>quoted text</quote> some text</para>"));
+ }
+
+ public void testImage() {
+ parser.parse("some text !images/foo.png! some text");
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+ assertTrue(docbook.contains("<mediaobject><imageobject><imagedata fileref=\"images/foo.png\"/></imageobject></mediaobject>"));
+ }
+
+ public void testDefinitionList() {
+ builder.beginDocument();
+ builder.beginBlock(BlockType.DEFINITION_LIST, new Attributes());
+
+ builder.beginBlock(BlockType.DEFINITION_TERM, new Attributes());
+ builder.characters("foo");
+ builder.endBlock(); // DT
+
+ builder.beginBlock(BlockType.DEFINITION_ITEM, new Attributes());
+ builder.characters("Foo definition");
+ builder.endBlock(); // DI
+
+ builder.beginBlock(BlockType.DEFINITION_TERM, new Attributes());
+ builder.characters("bar");
+ builder.endBlock(); // DT
+
+ builder.beginBlock(BlockType.DEFINITION_ITEM, new Attributes());
+ builder.characters("Bar definition");
+ builder.endBlock(); // DI
+
+ builder.endBlock(); // DL
+ builder.endDocument();
+
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+
+ assertTrue(docbook.contains("<variablelist><varlistentry><term>foo</term><listitem><para>Foo definition</para></listitem></varlistentry><varlistentry><term>bar</term><listitem><para>Bar definition</para></listitem></varlistentry></variablelist>"));
+ }
+
+ public void testGlossaryUsesDefinitionList() {
+ builder.setAutomaticGlossary(false);
+ parser.parse("ABW(A Better Way) is not NIMBY(Not In My Back Yard)\n\n{glossary}");
+
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+
+ assertTrue(docbook.contains("<variablelist><varlistentry><term>ABW</term><listitem><para>A Better Way</para></listitem></varlistentry><varlistentry><term>NIMBY</term><listitem><para>Not In My Back Yard</para></listitem></varlistentry></variablelist>"));
+ }
+
+ public void testAutomaticGlossaryOnByDefault() {
+ assertTrue(builder.isAutomaticGlossary());
+ }
+
+ public void testNestedListsCreatesValidDocbook() {
+ builder.beginDocument();
+ builder.beginBlock(BlockType.BULLETED_LIST, new Attributes());
+
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ builder.characters("foo");
+
+ builder.beginBlock(BlockType.BULLETED_LIST, new Attributes());
+
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ builder.characters("bar");
+ builder.endBlock(); // LI
+
+ builder.endBlock(); // UL
+
+ builder.characters("foo2");
+ builder.endBlock(); // LI
+
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ builder.characters("baz");
+ builder.endBlock(); // LI
+
+ builder.endBlock(); // UL
+ builder.endDocument();
+
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+
+ // should look something like this:
+
+ // <itemizedlist>
+ // <listitem>
+ // <para>foo</para>
+ // <itemizedlist>
+ // <listitem>
+ // <para>bar</para>
+ // </listitem>
+ // </itemizedlist>
+ // <para>foo2</para>
+ // </listitem>
+ // <listitem>
+ // <para>baz</para>
+ // </listitem>
+ // </itemizedlist>
+
+ assertTrue(docbook.contains("<itemizedlist><listitem><para>foo</para><itemizedlist><listitem><para>bar</para></listitem></itemizedlist><para>foo2</para></listitem><listitem><para>baz</para></listitem></itemizedlist>"));
+ }
+
+ public void testDiv() {
+ builder.beginDocument();
+ builder.beginBlock(BlockType.DIV, new Attributes());
+
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("foo");
+ builder.endBlock(); // PARAGRAPH
+
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("bar");
+ builder.endBlock(); // PARAGRAPH
+
+ builder.endBlock(); // DIV
+ builder.endDocument();
+
+ String docbook = out.toString();
+ System.out.println("DocBook: \n" + docbook);
+
+ assertTrue(docbook.contains("<book><title></title><chapter><title></title><para>foo</para><para>bar</para></chapter></book>"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/HtmlDocumentBuilderTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/HtmlDocumentBuilderTest.java
new file mode 100644
index 0000000..3baa44a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/HtmlDocumentBuilderTest.java
@@ -0,0 +1,364 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.LinkAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder.Stylesheet;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HtmlDocumentBuilderTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private StringWriter out;
+
+ private HtmlDocumentBuilder builder;
+
+ private final Map<File, URL> fileToUrl = new HashMap<File, URL>();
+
+ @Override
+ public void setUp() {
+ parser = new MarkupParser();
+ parser.setMarkupLanguage(new TextileLanguage());
+ out = new StringWriter();
+ builder = new HtmlDocumentBuilder(out) {
+ @Override
+ protected void checkFileReadable(File file) {
+ if (!fileToUrl.containsKey(file)) {
+ super.checkFileReadable(file);
+ }
+ }
+
+ @Override
+ protected Reader getReader(File inputFile) throws FileNotFoundException {
+ URL url = fileToUrl.get(inputFile);
+ if (url != null) {
+ try {
+ return new InputStreamReader(url.openStream());
+ } catch (IOException e) {
+ throw new FileNotFoundException(String.format("%s (%s)", inputFile, url));
+ }
+ }
+ return super.getReader(inputFile);
+ }
+ };
+ parser.setBuilder(builder);
+ }
+
+ public void testRelativeUrlWithBase() throws URISyntaxException {
+ builder.setBase(new URI("http://www.foo.bar/baz"));
+ parser.parse("\"An URL\":foo/bar.html");
+ String html = out.toString();
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.foo.bar/baz/foo/bar.html\">An URL</a>"));
+ }
+
+ public void testAbsoluteUrlWithBase() throws URISyntaxException {
+ builder.setBase(new URI("http://www.foo.bar/baz"));
+ parser.parse("\"An URL\":http://www.baz.ca/foo/bar.html");
+ String html = out.toString();
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.baz.ca/foo/bar.html\">An URL</a>"));
+ }
+
+ public void testRelativeUrlWithFileBase() throws URISyntaxException {
+ builder.setBase(new File("/base/2/with space/").toURI());
+ parser.parse("\"An URL\":foo/bar.html");
+ String html = out.toString();
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"file:/base/2/with%20space/foo/bar.html\">An URL</a>"));
+ }
+
+ public void testNoGratuitousWhitespace() {
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("some para text");
+ builder.lineBreak();
+ builder.characters("more para text");
+ builder.endBlock();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("second para");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.indexOf('\r') == -1);
+ assertTrue(html.indexOf('\n') == -1);
+ assertEquals(
+ "<?xml version='1.0' encoding='utf-8' ?><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/></head><body><p>some para text<br/>more para text</p><p>second para</p></body></html>",
+ html);
+ }
+
+ public void testCssStylesheetAsLink() {
+ builder.addCssStylesheet(new Stylesheet("styles/test.css"));
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("some para text");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+ System.out.println(html);
+
+ assertTrue(html.contains("<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><link type=\"text/css\" rel=\"stylesheet\" href=\"styles/test.css\"/></head>"));
+ }
+
+ public void testCssStylesheetEmbedded() throws Exception {
+ URL cssResource = HtmlDocumentBuilderTest.class.getResource("resources/test.css");
+ File cssFile = new File(cssResource.toURI().getPath());
+
+ fileToUrl.put(cssFile, cssResource);
+
+ System.out.println("loading css: " + cssFile);
+
+ builder.addCssStylesheet(new Stylesheet(cssFile));
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("some para text");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+ System.out.println(html);
+
+ assertTrue(Pattern.compile(
+ "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/><style type=\"text/css\">\\s*body\\s+\\{\\s+background-image: test-content.png;\\s+\\}\\s*</style></head>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testDefaultTargetForExternalLinks() throws Exception {
+ builder.setDefaultAbsoluteLinkTarget("_external");
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.link("http://www.example.com", "test");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.example.com\" target=\"_external\">test</a>"));
+ }
+
+ public void testDefaultTargetForExternalLinks2() throws Exception {
+ builder.setBase(new URI("http://www.notexample.com"));
+ builder.setDefaultAbsoluteLinkTarget("_external");
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.link("http://www.example.com", "test");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.example.com\" target=\"_external\">test</a>"));
+ }
+
+ public void testDefaultTargetForInternalLinks() throws Exception {
+ builder.setDefaultAbsoluteLinkTarget("_external");
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.link("foo", "test");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"foo\">test</a>"));
+ }
+
+ public void testDefaultTargetForInternalLinks2() throws Exception {
+ builder.setBase(new URI("http://www.example.com/"));
+ builder.setDefaultAbsoluteLinkTarget("_external");
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.link("http://www.example.com/foo.html", "test");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.example.com/foo.html\">test</a>"));
+ }
+
+ public void testSuppressInlineStyles() throws Exception {
+ StringWriter out = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out);
+ builder.setUseInlineStyles(false);
+ builder.beginDocument();
+ builder.beginBlock(BlockType.NOTE, new Attributes());
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("foo");
+ builder.endBlock();
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<body><div class=\"note\"><p>foo</p></div></body>"));
+ assertTrue(html.contains("<style type=\"text/css\">"));
+ }
+
+ public void testSuppressBuiltInlineStyles() throws Exception {
+ StringWriter out = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out);
+ builder.setSuppressBuiltInStyles(true);
+ builder.beginDocument();
+ builder.beginBlock(BlockType.NOTE, new Attributes());
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ builder.characters("foo");
+ builder.endBlock();
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<body><div class=\"note\"><p>foo</p></div></body>"));
+ assertTrue(!html.contains("<style type=\"text/css\">"));
+ }
+
+ public void testLinkRel() throws Exception {
+ // link-specific rel
+ StringWriter out = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(out);
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ LinkAttributes attributes = new LinkAttributes();
+ attributes.setRel("nofollow");
+ builder.link(attributes, "http://www.foo.bar", "Foo Bar");
+ builder.endBlock();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.foo.bar\" rel=\"nofollow\">Foo Bar</a>"));
+
+ // default link rel
+ out = new StringWriter();
+ builder = new HtmlDocumentBuilder(out);
+ builder.setLinkRel("nofollow");
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ attributes = new LinkAttributes();
+ builder.link(attributes, "http://www.foo.bar", "Foo Bar");
+ builder.endBlock();
+ builder.endDocument();
+
+ html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.foo.bar\" rel=\"nofollow\">Foo Bar</a>"));
+
+ // both link-specific and default link ref
+ out = new StringWriter();
+ builder = new HtmlDocumentBuilder(out);
+ builder.setLinkRel("nofollow");
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ attributes = new LinkAttributes();
+ attributes.setRel("foobar");
+ builder.link(attributes, "http://www.foo.bar", "Foo Bar");
+ builder.endBlock();
+ builder.endDocument();
+
+ html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.foo.bar\" rel=\"foobar nofollow\">Foo Bar</a>"));
+
+ // no rel at all
+ out = new StringWriter();
+ builder = new HtmlDocumentBuilder(out);
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ attributes = new LinkAttributes();
+ builder.link(attributes, "http://www.foo.bar", "Foo Bar");
+ builder.endBlock();
+ builder.endDocument();
+
+ html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://www.foo.bar\">Foo Bar</a>"));
+ }
+
+ public void testStylesheetWithAttributes() {
+ Stylesheet stylesheet = new Stylesheet("a/test.css");
+ stylesheet.getAttributes().put("foo", "bar");
+ builder.addCssStylesheet(stylesheet);
+
+ builder.beginDocument();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<link type=\"text/css\" rel=\"stylesheet\" href=\"a/test.css\" foo=\"bar\"/>"));
+ }
+
+ public void testStylesheetWithNoAttributes() {
+ builder.addCssStylesheet(new Stylesheet("a/test.css"));
+
+ builder.beginDocument();
+ builder.endDocument();
+
+ String html = out.toString();
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<link type=\"text/css\" rel=\"stylesheet\" href=\"a/test.css\"/>"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/RecordingDocumentBuilder.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/RecordingDocumentBuilder.java
new file mode 100644
index 0000000..fd118c7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/RecordingDocumentBuilder.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.builder;
+
+import java.util.ArrayList;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.util.LocatorImpl;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class RecordingDocumentBuilder extends DocumentBuilder {
+
+ public static class Event {
+ public Attributes attributes;
+
+ public BlockType blockType;
+
+ public String text;
+
+ public Integer headingLevel;
+
+ public SpanType spanType;
+
+ public LocatorImpl locator;
+
+ Event(String text) {
+ this.text = text;
+ }
+
+ public Event(BlockType type, Attributes attributes2) {
+ blockType = type;
+ attributes = attributes2;
+ }
+
+ public Event(int level, Attributes attributes2) {
+ headingLevel = level;
+ attributes = attributes2;
+ }
+
+ public Event(SpanType type, Attributes attributes2) {
+ this.spanType = type;
+ attributes = attributes2;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder();
+ if (blockType != null) {
+ buf.append("Block(");
+ buf.append(blockType);
+ } else if (spanType != null) {
+ buf.append("Span(");
+ buf.append(spanType);
+ } else if (headingLevel != null) {
+ buf.append("Heading(");
+ buf.append(headingLevel);
+ } else {
+ buf.append("Text?(");
+ }
+ if (text != null) {
+ buf.append(text.length() > 6 ? text.substring(0, 6) + "..." : text);
+ }
+
+ buf.append(",lineNumber=");
+ buf.append(locator.getLineNumber());
+ buf.append(",lineCharacterOffset=");
+ buf.append(locator.getLineCharacterOffset());
+ buf.append(",lineSegmentEnd=");
+ buf.append(locator.getLineSegmentEndOffset());
+ buf.append(",lineLength=");
+ buf.append(locator.getLineLength());
+ buf.append(",lineDocumentOffset=");
+ buf.append(locator.getLineDocumentOffset());
+ buf.append(",documentOffset=");
+ buf.append(locator.getDocumentOffset());
+ buf.append(")");
+ return buf.toString();
+ }
+ }
+
+ private final java.util.List<Event> events = new ArrayList<Event>();
+
+ private void add(Event event) {
+ event.locator = new LocatorImpl(getLocator());
+ events.add(event);
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ add(new Event(text));
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ add(new Event(type, attributes));
+ }
+
+ @Override
+ public void beginDocument() {
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ add(new Event(level, attributes));
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ add(new Event(type, attributes));
+ }
+
+ @Override
+ public void characters(String text) {
+ add(new Event(text));
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ add(new Event(literal));
+ }
+
+ @Override
+ public void endBlock() {
+
+ }
+
+ @Override
+ public void endDocument() {
+ }
+
+ @Override
+ public void endHeading() {
+ }
+
+ @Override
+ public void endSpan() {
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes attributes, String href, String imageUrl) {
+ }
+
+ @Override
+ public void lineBreak() {
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ }
+
+ public java.util.List<Event> getEvents() {
+ return events;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder();
+ buf.append(getClass().getSimpleName());
+ buf.append("(");
+ for (Event event : events) {
+ buf.append("\n\t");
+ buf.append(event);
+ }
+ buf.append("\n)");
+ return buf.toString();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/resources/test.css b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/resources/test.css
new file mode 100644
index 0000000..8c97378
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/builder/resources/test.css
@@ -0,0 +1,3 @@
+body {
+ background-image: test-content.png;
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityWrappingReplacementTokenTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityWrappingReplacementTokenTest.java
new file mode 100644
index 0000000..705c90e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/EntityWrappingReplacementTokenTest.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class EntityWrappingReplacementTokenTest extends TestCase {
+
+ public void testFindQuotesAtStartOfLine() {
+ EntityWrappingReplacementToken token = new EntityWrappingReplacementToken("\"", "<", ">");
+
+ Pattern pattern = Pattern.compile(token.getPattern(0));
+ Matcher matcher = pattern.matcher("\"some text\" more text");
+ assertTrue(matcher.find());
+ assertEquals(0, matcher.start());
+ }
+
+ public void testFindQuotesOffsetInLine() {
+ EntityWrappingReplacementToken token = new EntityWrappingReplacementToken("\"", "<", ">");
+
+ Pattern pattern = Pattern.compile(token.getPattern(0));
+ Matcher matcher = pattern.matcher(" \"some text\" more text");
+ assertTrue(matcher.find());
+ assertEquals(2, matcher.start());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/ImpliedHyperlinkReplacementTokenTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/ImpliedHyperlinkReplacementTokenTest.java
new file mode 100644
index 0000000..ca3a27b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/markup/token/ImpliedHyperlinkReplacementTokenTest.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.markup.token;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+/**
+ * tests for {@link ImpliedHyperlinkReplacementToken}
+ *
+ * @author David Green
+ *
+ * @see ImpliedHyperlinkReplacementToken
+ */
+public class ImpliedHyperlinkReplacementTokenTest extends TestCase {
+
+ private Pattern pattern;
+
+ private ImpliedHyperlinkReplacementToken token;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ token = new ImpliedHyperlinkReplacementToken();
+ pattern = Pattern.compile(token.getPattern(0));
+ }
+
+ public void testGroupCount() {
+ assertEquals(token.getPatternGroupCount(), pattern.matcher("").groupCount());
+ }
+
+ public void testSimple() {
+ String url = "http://www.eclipse.org";
+ testFind(url, 0, url.length());
+ }
+
+ public void testSimpleAtNonZeroOffset() {
+ String url = " http://www.eclipse.org ";
+ testFind(url, 1, url.length() - 2);
+ }
+
+ public void testSimpleEndingWithDot() {
+ String url = "http://www.eclipse.org.";
+ testFind(url, 0, url.length() - 1);
+ }
+
+ public void testSimpleEndingWithComma() {
+ String url = "http://www.eclipse.org,";
+ testFind(url, 0, url.length() - 1);
+ }
+
+ public void testSimpleEndingWithParen() {
+ String url = "http://www.eclipse.org)";
+ testFind(url, 0, url.length() - 1);
+ }
+
+ public void testUrlWithParams() {
+ String url = "http://www.eclipse.org/wiki?one=two&three=four";
+ testFind(url, 0, url.length());
+ }
+
+ public void testUrlWithPercentHex() {
+ String url = "http://www.eclipse.org/%20/bar";
+ testFind(url, 0, url.length());
+ }
+
+ public void testUrlWithSpace() {
+ String url = "http://www.eclipse.org/+/bar";
+ testFind(url, 0, url.length());
+ }
+
+ public void testUrlWithHttps() {
+ String url = "https://www.eclipse.org/";
+ testFind(url, 0, url.length());
+ }
+
+ public void testUrlWithHash() {
+ String url = "http://www.eclipse.org/#anchor";
+ testFind(url, 0, url.length());
+ }
+
+ private void testFind(String url, int offset, int length) {
+ Matcher matcher = pattern.matcher(url);
+ if (matcher.find()) {
+ int start = matcher.start(1);
+ int end = matcher.end(1);
+ assertEquals(offset, start);
+ assertEquals(length, end - start);
+ } else {
+ fail("expected to find url at offset " + offset);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineItemTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineItemTest.java
new file mode 100644
index 0000000..c980f4c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineItemTest.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.parser.outline;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ * @author David Green
+ * @see OutlineParserTest
+ */
+public class OutlineItemTest extends TestCase {
+
+ public void testContains() {
+ OutlineParser outlineParser = new OutlineParser(new TextileLanguage());
+ OutlineItem outline = outlineParser.parse("h1. First Header\n\nh2. First Header First Child\n\nh1. Third Header\n");
+
+ OutlineItem firstHeader = outline.getChildren().get(0);
+ OutlineItem secondHeader = outline.getChildren().get(1);
+ OutlineItem firstHeaderFirstChild = firstHeader.getChildren().get(0);
+ assertTrue(outline.contains(firstHeader));
+ assertTrue(outline.contains(secondHeader));
+ assertTrue(firstHeader.contains(firstHeader));
+ assertTrue(secondHeader.contains(secondHeader));
+ assertFalse(firstHeader.contains(secondHeader));
+ assertFalse(secondHeader.contains(firstHeader));
+ assertFalse(firstHeaderFirstChild.contains(firstHeader));
+ assertTrue(firstHeader.contains(firstHeaderFirstChild));
+ }
+
+ public void testGetSectionLength() {
+ OutlineParser outlineParser = new OutlineParser(new TextileLanguage());
+ String markup = "h1. First Header\n\nh2. First Header First Child\n\nh1. Third Header\n";
+ OutlineItem outline = outlineParser.parse(markup);
+ OutlineItem firstHeader = outline.getChildren().get(0);
+ OutlineItem secondHeader = outline.getChildren().get(1);
+ OutlineItem firstHeaderFirstChild = firstHeader.getChildren().get(0);
+
+ assertEquals(markup.length(), outline.getSectionLength());
+ assertEquals(48, firstHeader.getSectionLength());
+ assertEquals(17, secondHeader.getSectionLength());
+ assertEquals(30, firstHeaderFirstChild.getSectionLength());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineParserTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineParserTest.java
new file mode 100644
index 0000000..1e38fa3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/outline/OutlineParserTest.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.outline;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class OutlineParserTest extends TestCase {
+
+ private OutlineParser outlineParser;
+
+ @Override
+ public void setUp() {
+ outlineParser = new OutlineParser(new TextileLanguage());
+ }
+
+ public void testSimple() {
+ OutlineItem outline = outlineParser.parse("h1. First Header\n\nh2. Second Header\n\nh1. Third Header\n");
+
+ assertEquals(2, outline.getChildren().size());
+ assertEquals(1, outline.getChildren().get(0).getChildren().size());
+ assertEquals(0, outline.getChildren().get(1).getChildren().size());
+ }
+
+ public void testNearestItem() {
+ String textile = "h1. First Header\n\nh2. Second Header\n\nh1. Third Header\n";
+ OutlineItem outline = outlineParser.parse(textile);
+
+ int idxOfH2 = textile.indexOf("h2. Second");
+ assertTrue(idxOfH2 != -1);
+
+ OutlineItem h2Item = outline.findNearestMatchingOffset(idxOfH2);
+ assertNotNull(h2Item);
+ assertSame(outline.getChildren().get(0), h2Item.getParent());
+ assertEquals(2, h2Item.getLevel());
+
+ OutlineItem h1Item = outline.findNearestMatchingOffset(idxOfH2 - 1);
+ assertNotNull(h1Item);
+ assertSame(outline.getChildren().get(0), h1Item);
+ assertEquals(1, h1Item.getLevel());
+
+ int secondIdxOfH1 = textile.indexOf("h1. Third");
+ OutlineItem secondH1Item = outline.findNearestMatchingOffset(secondIdxOfH1);
+ assertNotNull(secondH1Item);
+ assertSame(outline.getChildren().get(1), secondH1Item);
+ assertEquals(1, secondH1Item.getLevel());
+
+ OutlineItem h2Item2 = outline.findNearestMatchingOffset(secondIdxOfH1 - 1);
+ assertSame(h2Item, h2Item2);
+ }
+
+ public void testPrevious() {
+ String textile = "h1. First Header\n\nh2. Second Header\n\nh1. Third Header\n";
+ OutlineItem outline = outlineParser.parse(textile);
+
+ assertNull(outline.getPrevious());
+
+ assertSame(outline, outline.getChildren().get(0).getPrevious());
+ assertSame(outline.getChildren().get(0), outline.getChildren().get(1).getPrevious());
+ assertSame(outline.getChildren().get(0), outline.getChildren().get(0).getChildren().get(0).getPrevious());
+ }
+
+ public void testMoveChildren() {
+ String textile = "h1. First Header\n\nh2. Second Header\n\nh1. Third Header\n";
+ OutlineItem outline = outlineParser.parse(textile);
+ assertEquals(2, outline.getChildren().size());
+
+ OutlineItem outline2 = outlineParser.createRootItem();
+
+ outline2.moveChildren(outline);
+
+ assertEquals(0, outline.getChildren().size());
+ assertEquals(2, outline2.getChildren().size());
+ assertSame(outline2, outline2.getChildren().get(0).getParent());
+ assertSame(outline2, outline2.getChildren().get(1).getParent());
+
+ outline = outlineParser.parse(textile);
+
+ outline.moveChildren(outline2);
+
+ assertEquals(0, outline2.getChildren().size());
+ assertEquals(4, outline.getChildren().size());
+ assertSame(outline, outline.getChildren().get(0).getParent());
+ assertSame(outline, outline.getChildren().get(1).getParent());
+ assertSame(outline, outline.getChildren().get(2).getParent());
+ assertSame(outline, outline.getChildren().get(3).getParent());
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/util/TextileToDocbookTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/util/TextileToDocbookTest.java
new file mode 100644
index 0000000..31fbb4d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/util/TextileToDocbookTest.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ * @author Peter Friese bug 273355 Support image scaling for Textile -> DocBook
+ */
+public class TextileToDocbookTest extends TestCase {
+
+ private MarkupToDocbook textileToDocbook;
+
+ @Override
+ public void setUp() {
+ textileToDocbook = new MarkupToDocbook();
+ textileToDocbook.setMarkupLanguage(new TextileLanguage());
+ }
+
+ public void testHeader() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("h1. title1\n\nContent para 1\n\nh1. title2\n\nMore content\n");
+
+ System.out.println("Book: " + book);
+ }
+
+ public void testMultipleNestedElements() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("h1. title1\n\nContent para 1\n* a\n* list of\n* items\n");
+
+ System.out.println("Book: " + book);
+ }
+
+ public void testNestedHeaders() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("h1. title1\n\nContent para 1\nh2. title2\n\nContent para2\n\nh1. title3\n\npara3");
+
+ System.out.println("Book: " + book);
+
+ assertTrue(Pattern.compile("</chapter>\\s*<chapter", Pattern.MULTILINE).matcher(book).find());
+ }
+
+ public void testHeaderWithAcronym() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("h1. TBA(To Be Announced) plus more content in the header\n\nContent para 1");
+
+ System.out.println("Book: " + book);
+
+ assertTrue(Pattern.compile("<glossterm>TBA</glossterm>\\s*plus more", Pattern.MULTILINE).matcher(book).find());
+ assertTrue(Pattern.compile("<glossterm>TBA</glossterm>\\s*<glossdef>", Pattern.MULTILINE).matcher(book).find());
+ assertTrue(Pattern.compile("<glossdef>\\s*<para>To Be Announced", Pattern.MULTILINE).matcher(book).find());
+ }
+
+ public void testBlockCode() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("h1. A\n\nsome content\n\nbc. public class Foo {\n}\n");
+
+ System.out.println("Book: " + book);
+
+ assertTrue(Pattern.compile("<literallayout>\\s*<code>", Pattern.MULTILINE).matcher(book).find());
+ }
+
+ public void testBlockCodeExtended() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("h1. A\n\nsome content\n\nbc.. \npublic class Foo {\n}\n\n\nsome other content");
+
+ System.out.println("Book: " + book);
+
+ assertTrue(Pattern.compile("<literallayout>\\s*<code>", Pattern.MULTILINE).matcher(book).find());
+ }
+
+ public void testFootnotes() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("something[1] with a footnote\n\nfn1. the footnote text");
+
+ System.out.println("Book: " + book);
+
+ Matcher matcher = Pattern.compile("<link\\s*linkend=\"(___fn.*?)\">", Pattern.MULTILINE).matcher(book);
+ assertTrue(matcher.find());
+
+ String linkend = matcher.group(1);
+ assertNotNull(linkend);
+
+ assertTrue(Pattern.compile("<para\\s*id=\"" + Pattern.quote(linkend) + "\">", Pattern.MULTILINE)
+ .matcher(book)
+ .find());
+ }
+
+ public void testImageScaling() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("Here comes an !{width:80%}imageUrl! with more text");
+
+ System.out.println("Book: " + book);
+
+ Matcher matcher = Pattern.compile("<imagedata .* scale=\"80\"/>", Pattern.MULTILINE).matcher(book);
+ assertTrue(matcher.find());
+ }
+
+ public void testImageWidth() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("Here comes an !{width:80px}imageUrl! with more text");
+
+ System.out.println("Book: " + book);
+
+ Matcher matcher = Pattern.compile("<imagedata .* width=\"80px\"/>", Pattern.MULTILINE).matcher(book);
+ assertTrue(matcher.find());
+ }
+
+ public void testImageWidthDepth() throws Exception {
+ textileToDocbook.setBookTitle("Test");
+ String book = textileToDocbook.parse("Here comes an !{width:80px;height:90px;}imageUrl! with more text");
+
+ System.out.println("Book: " + book);
+
+ Matcher matcher = Pattern.compile("<imagedata .* width=\"80px\"\\s.*?depth=\"90px\"/>", Pattern.MULTILINE)
+ .matcher(book);
+ assertTrue(matcher.find());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/util/TextileToEclipseTocTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/util/TextileToEclipseTocTest.java
new file mode 100644
index 0000000..20c64a6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/parser/util/TextileToEclipseTocTest.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.parser.util;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TextileToEclipseTocTest extends TestCase {
+
+ private MarkupToEclipseToc textileToEclipseToc;
+
+ @Override
+ public void setUp() {
+ textileToEclipseToc = new MarkupToEclipseToc();
+ textileToEclipseToc.setMarkupLanguage(new TextileLanguage());
+ }
+
+ public void testHeader() throws Exception {
+ textileToEclipseToc.setBookTitle("Test");
+ textileToEclipseToc.setHtmlFile("Test.html");
+ String toc = textileToEclipseToc.parse("h1. title1\n\nContent para 1\n\nh1. title2\n\nMore content\n\nh2. Nested title\n\nnested content");
+
+ System.out.println("Eclipse TOC: " + toc);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/LocationTrackingReaderTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/LocationTrackingReaderTest.java
new file mode 100644
index 0000000..480ba78
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/LocationTrackingReaderTest.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class LocationTrackingReaderTest extends TestCase {
+
+ public void testCharOffset() throws IOException {
+ String content = "aaflkjsdf \nas;dfj asl;fj\r\naslfkjasd";
+ int count = 0;
+ LocationTrackingReader reader = new LocationTrackingReader(new StringReader(content), 16);
+ int c;
+ while ((c = reader.read()) != -1) {
+ ++count;
+ assertEquals(content.charAt(count - 1), (char) c);
+ assertEquals(count - 1, reader.getOffset());
+ }
+ assertEquals(content.length(), count);
+ }
+
+ public void testReadLine() throws IOException {
+ String content = "\rabc\ndef\r\rfoo bar";
+ int bufSize = 3;
+ int[] lineOffsets = new int[] { 0, 1, 5, 9, 10, 17 };
+
+ doTest(content, lineOffsets, bufSize);
+ }
+
+ private void doTest(String content, int[] lineOffsets, int bufSize) throws IOException {
+ LocationTrackingReader reader = new LocationTrackingReader(new StringReader(content), bufSize);
+ BufferedReader refReader = new BufferedReader(new StringReader(content));
+
+ int lineNumber = 0;
+ String testLine = null;
+ String refLine = null;
+ do {
+ int expectedOffset = lineOffsets[lineNumber++];
+ testLine = reader.readLine();
+ refLine = refReader.readLine();
+
+ assertEquals(refLine, testLine);
+ assertEquals(expectedOffset, reader.getLineOffset());
+ assertEquals(lineNumber - 1, reader.getLineNumber());
+ } while (testLine != null && refLine != null);
+
+ assertTrue(refLine == null);
+ assertTrue(testLine == null);
+ }
+
+ public void testReadLineWithWindowsNewlines() throws IOException {
+ String content = "abc\r\ndef\r\n\r\nfoo bar";
+ int bufSize = 3;
+ int[] lineOffsets = new int[] { 0, 5, 10, 12, 19 };
+
+ doTest(content, lineOffsets, bufSize);
+ }
+
+ public void testReadLineWithTerminatingEOLs() throws IOException {
+ String content = "abc\n";
+ int bufSize = 3;
+ int[] lineOffsets = new int[] { 0, 4 };
+
+ doTest(content, lineOffsets, bufSize);
+
+ content = "abc\r\n";
+ bufSize = 3;
+ lineOffsets = new int[] { 0, 5 };
+
+ doTest(content, lineOffsets, bufSize);
+
+ content = "abc\r";
+ bufSize = 3;
+ lineOffsets = new int[] { 0, 4 };
+
+ doTest(content, lineOffsets, bufSize);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/ServiceLocatorTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/ServiceLocatorTest.java
new file mode 100644
index 0000000..7b4fb65
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/ServiceLocatorTest.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.core.util;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ * Tests for {@link ServiceLocator}
+ *
+ * @author David Green
+ */
+public class ServiceLocatorTest extends TestCase {
+
+ private ServiceLocator locator;
+
+ @Override
+ public void setUp() {
+ locator = ServiceLocator.getInstance(ServiceLocatorTest.class.getClassLoader());
+ }
+
+ public void testKnownLanguage() {
+ MarkupLanguage markupLanguage;
+ try {
+ markupLanguage = locator.getMarkupLanguage("Textile");
+ } catch (IllegalArgumentException e) {
+ // if this test fails it may be because it's run stand-alone and the Textile
+ // language is loaded from a folder instead of a jar file.
+ fail(e.getMessage() + " NOTE: THIS TEST WILL FAIL IF THE CLASSES UNDER TEST ARE NOT IN A JAR");
+ return;
+ }
+ assertNotNull(markupLanguage);
+ }
+
+ public void testUnknownLanguage() {
+ try {
+ locator.getMarkupLanguage("No Such Language asdlkfjal;sjdf");
+ fail("Expected exception");
+ } catch (IllegalArgumentException e) {
+ // expected, ignore
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void testFQN() {
+ MarkupLanguage markupLanguage = locator.getMarkupLanguage(TextileLanguage.class.getName());
+ assertNotNull(markupLanguage);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/AbstractTestAntTask.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/AbstractTestAntTask.java
new file mode 100644
index 0000000..fc70316
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/AbstractTestAntTask.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+public abstract class AbstractTestAntTask extends TestCase {
+
+ protected File tempFolder;
+
+ protected String languageName = computeLanguageName();
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ tempFolder = File.createTempFile(getClass().getSimpleName(), ".tmp");
+ tempFolder.delete();
+ tempFolder.mkdirs();
+ }
+
+ private String computeLanguageName() {
+ if (WikiTextPlugin.getDefault() == null) {
+ return TextileLanguage.class.getName();
+ }
+ return "Textile";
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ delete(tempFolder);
+ }
+
+ protected void delete(File f) {
+ if (f.isDirectory()) {
+ File[] files = f.listFiles();
+ if (files != null) {
+ for (File child : files) {
+ delete(child);
+ }
+ }
+ }
+ f.delete();
+ }
+
+ protected String getContent(File file) throws IOException {
+ Reader reader = new InputStreamReader(new BufferedInputStream(new FileInputStream(file)), "utf-8");
+ try {
+ StringWriter writer = new StringWriter();
+ int i;
+ while ((i = reader.read()) != -1) {
+ writer.write(i);
+ }
+ return writer.toString();
+ } finally {
+ reader.close();
+ }
+ }
+
+ protected void listFiles() {
+ listFiles("", tempFolder);
+ }
+
+ private void listFiles(String prefix, File dir) {
+ for (File file : dir.listFiles()) {
+ System.out.println(String.format("%s: %s", prefix + file.getName(), file.isFile() ? "File" : "Folder"));
+ if (file.isDirectory()) {
+ listFiles(prefix + file.getName() + "/", file);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDitaTaskTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDitaTaskTest.java
new file mode 100644
index 0000000..1716208
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDitaTaskTest.java
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+public class MarkupToDitaTaskTest extends AbstractTestAntTask {
+
+ private MarkupToDitaTask ditaTask;
+
+ private File topicsFolder;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ ditaTask = new MarkupToDitaTask();
+ ditaTask.setMarkupLanguage(languageName);
+
+ topicsFolder = new File(tempFolder, ditaTask.getTopicFolder());
+ topicsFolder.mkdirs();
+ }
+
+ private File createSimpleTextileMarkup() throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h1. First Heading");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h1. Second Heading");
+ writer.println();
+ writer.println("some more content");
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ private File createTextileMarkupWithXref() throws IOException {
+ return createTextileMarkupWithXref(1);
+ }
+
+ private File createTextileMarkupWithXref(int headingLevel) throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h" + headingLevel + "(#Id1). First Heading");
+ writer.println();
+ writer.println("some content with a \"ref to 2\":#Id2");
+ writer.println();
+ writer.println("h" + headingLevel + "(#Id2). Second Heading");
+ writer.println();
+ writer.println("some more content with with a \"ref to 1\":#Id1 and a \"ref to 2\":#Id2");
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ private File createSimpleTextileMarkupWithFQNHeadings() throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h1. " + MarkupToDitaTaskTest.class.getName());
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h1. Second Heading");
+ writer.println();
+ writer.println("some more content");
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ public void testCreatesMapbook() throws IOException {
+ File markupFile = createSimpleTextileMarkup();
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File ditamapFile = new File(tempFolder, "markup.ditamap");
+ assertTrue(ditamapFile.exists());
+ File firstHeadingFile = new File(topicsFolder, "FirstHeading.dita");
+ assertTrue(firstHeadingFile.exists());
+ File secondHeadingFile = new File(topicsFolder, "SecondHeading.dita");
+ assertTrue(secondHeadingFile.exists());
+
+ String ditamapContent = getContent(ditamapFile);
+ assertTrue(ditamapContent.contains("<bookmap>"));
+ assertTrue(ditamapContent.contains("<chapter href=\"topics/FirstHeading.dita\" navtitle=\"First Heading\"/>"));
+ assertTrue(ditamapContent.contains("<chapter href=\"topics/SecondHeading.dita\" navtitle=\"Second Heading\"/>"));
+
+ String firstTopicContent = getContent(firstHeadingFile);
+// <?xml version='1.0' ?><!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA 1.1 Topic//EN" "http://docs.oasis-open.org/dita/v1.1/OS/dtd/topic.dtd">
+// <topic id="FirstHeading">
+// <title>First Heading</title>
+// <body>
+// <p>some content</p>
+// </body>
+// </topic>
+ assertTrue(firstTopicContent.contains("<topic id=\"FirstHeading\">"));
+ assertTrue(firstTopicContent.contains("<title>First Heading</title>"));
+ assertTrue(firstTopicContent.contains("<p>some content</p>"));
+ }
+
+ public void testCreatesSingleTopic() throws IOException {
+ File markupFile = createSimpleTextileMarkup();
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+ ditaTask.setFilenameFormat("$1.dita");
+ ditaTask.setTopicStrategy(MarkupToDitaTask.BreakStrategy.NONE);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File ditamapFile = new File(tempFolder, "markup.ditamap");
+ assertFalse(ditamapFile.exists());
+ File firstHeadingFile = new File(tempFolder, "markup.dita");
+ assertTrue(firstHeadingFile.exists());
+
+ String firstTopicContent = getContent(firstHeadingFile);
+
+ System.out.println(firstTopicContent);
+
+ assertTrue(firstTopicContent.contains("<topic id=\"FirstHeading\">"));
+ assertTrue(firstTopicContent.contains("<title>First Heading</title>"));
+ assertTrue(firstTopicContent.contains("<p>some content</p>"));
+ assertTrue(firstTopicContent.contains("<topic id=\"SecondHeading\">"));
+ assertTrue(firstTopicContent.contains("<title>Second Heading</title>"));
+ assertTrue(firstTopicContent.contains("<p>some more content</p>"));
+ }
+
+ public void testMapbookXRef() throws IOException {
+ File markupFile = createTextileMarkupWithXref();
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File firstHeadingFile = new File(topicsFolder, "Id1.dita");
+ assertTrue(firstHeadingFile.exists());
+ File secondHeadingFile = new File(topicsFolder, "Id2.dita");
+ assertTrue(secondHeadingFile.exists());
+
+ String firstTopicContent = getContent(firstHeadingFile);
+ String secondTopicContent = getContent(secondHeadingFile);
+
+ assertTrue(firstTopicContent.contains("<xref href=\"Id2.dita#Id2\">ref to 2</xref>"));
+ assertTrue(secondTopicContent.contains("<xref href=\"Id1.dita#Id1\">ref to 1</xref>"));
+ assertTrue(secondTopicContent.contains("<xref href=\"#Id2\">ref to 2</xref>"));
+ }
+
+ public void testMapbookXRef_H2() throws IOException {
+ File markupFile = createTextileMarkupWithXref(2);
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+ ditaTask.setTopicStrategy(MarkupToDitaTask.BreakStrategy.FIRST);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File firstHeadingFile = new File(topicsFolder, "Id1.dita");
+ assertTrue(firstHeadingFile.exists());
+ File secondHeadingFile = new File(topicsFolder, "Id2.dita");
+ assertTrue(secondHeadingFile.exists());
+
+ String firstTopicContent = getContent(firstHeadingFile);
+ String secondTopicContent = getContent(secondHeadingFile);
+
+ System.out.println(firstTopicContent);
+ System.out.println(secondTopicContent);
+
+ assertTrue(firstTopicContent.contains("<xref href=\"Id2.dita#Id2\">ref to 2</xref>"));
+ assertTrue(secondTopicContent.contains("<xref href=\"Id1.dita#Id1\">ref to 1</xref>"));
+ assertTrue(secondTopicContent.contains("<xref href=\"#Id2\">ref to 2</xref>"));
+ }
+
+ public void testCreatesSingleTopicXref() throws IOException {
+ File markupFile = createTextileMarkupWithXref();
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+ ditaTask.setFilenameFormat("$1.dita");
+ ditaTask.setTopicStrategy(MarkupToDitaTask.BreakStrategy.NONE);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File ditamapFile = new File(tempFolder, "markup.ditamap");
+ assertFalse(ditamapFile.exists());
+ File firstHeadingFile = new File(tempFolder, "markup.dita");
+ assertTrue(firstHeadingFile.exists());
+
+ String firstTopicContent = getContent(firstHeadingFile);
+
+ System.out.println(firstTopicContent);
+
+ assertTrue(firstTopicContent.contains("<topic id=\"Id1\">"));
+ assertTrue(firstTopicContent.contains("<title>First Heading</title>"));
+ assertTrue(firstTopicContent.contains("<xref href=\"#Id2\">ref to 2</xref>"));
+ assertTrue(firstTopicContent.contains("<topic id=\"Id2\">"));
+ assertTrue(firstTopicContent.contains("<title>Second Heading</title>"));
+ assertTrue(firstTopicContent.contains("<xref href=\"#Id1\">ref to 1</xref>"));
+ }
+
+ public void testCreatesSingleTopicXref_HL2() throws IOException {
+ File markupFile = createTextileMarkupWithXref(2);
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+ ditaTask.setFilenameFormat("$1.dita");
+ ditaTask.setTopicStrategy(MarkupToDitaTask.BreakStrategy.NONE);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File ditamapFile = new File(tempFolder, "markup.ditamap");
+ assertFalse(ditamapFile.exists());
+ File firstHeadingFile = new File(tempFolder, "markup.dita");
+ assertTrue(firstHeadingFile.exists());
+
+ String firstTopicContent = getContent(firstHeadingFile);
+
+ System.out.println(firstTopicContent);
+
+ assertTrue(firstTopicContent.contains("<topic id=\"Id1\">"));
+ assertTrue(firstTopicContent.contains("<title>First Heading</title>"));
+ assertTrue(firstTopicContent.contains("<xref href=\"#Id2\">ref to 2</xref>"));
+ assertTrue(firstTopicContent.contains("<topic id=\"Id2\">"));
+ assertTrue(firstTopicContent.contains("<title>Second Heading</title>"));
+ assertTrue(firstTopicContent.contains("<xref href=\"#Id1\">ref to 1</xref>"));
+ }
+
+ /**
+ * test for bug 269147
+ */
+ public void testFileNaming() throws IOException {
+ File markupFile = createSimpleTextileMarkupWithFQNHeadings();
+ ditaTask.setBookTitle("Sample Title");
+ ditaTask.setFile(markupFile);
+
+ ditaTask.execute();
+
+ listFiles();
+
+ File ditamapFile = new File(tempFolder, "markup.ditamap");
+ assertTrue(ditamapFile.exists());
+ File firstHeadingFile = new File(topicsFolder, MarkupToDitaTaskTest.class.getName() + ".dita");
+ assertTrue(firstHeadingFile.exists());
+ File secondHeadingFile = new File(topicsFolder, "SecondHeading.dita");
+ assertTrue(secondHeadingFile.exists());
+
+ String ditamapContent = getContent(ditamapFile);
+ assertTrue(ditamapContent.contains("<bookmap>"));
+ assertTrue(ditamapContent.contains("<chapter href=\"topics/" + MarkupToDitaTaskTest.class.getName()
+ + ".dita\" navtitle=\"" + MarkupToDitaTaskTest.class.getName() + "\"/>"));
+ assertTrue(ditamapContent.contains("<chapter href=\"topics/SecondHeading.dita\" navtitle=\"Second Heading\"/>"));
+
+ String firstTopicContent = getContent(firstHeadingFile);
+// <?xml version='1.0' ?><!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA 1.1 Topic//EN" "http://docs.oasis-open.org/dita/v1.1/OS/dtd/topic.dtd">
+// <topic id="FirstHeading">
+// <title>First Heading</title>
+// <body>
+// <p>some content</p>
+// </body>
+// </topic>
+ assertTrue(firstTopicContent.contains("<topic id=\"" + MarkupToDitaTaskTest.class.getName() + "\">"));
+ assertTrue(firstTopicContent.contains("<title>" + MarkupToDitaTaskTest.class.getName() + "</title>"));
+ assertTrue(firstTopicContent.contains("<p>some content</p>"));
+ }
+
+ public void testTaskdef() {
+ ResourceBundle bundle = ResourceBundle.getBundle(MarkupToDitaTask.class.getPackage().getName() + ".tasks");
+ assertEquals(MarkupToDitaTask.class.getName(), bundle.getString("wikitext-to-dita"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDocbookTaskTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDocbookTaskTest.java
new file mode 100644
index 0000000..f3292db
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToDocbookTaskTest.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+import java.util.regex.Pattern;
+
+public class MarkupToDocbookTaskTest extends AbstractTestAntTask {
+
+ private MarkupToDocbookTask task;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ task = new MarkupToDocbookTask();
+ task.setMarkupLanguage(languageName);
+ }
+
+ public void testSimpleOutput() throws IOException {
+ File markup = createSimpleTextileMarkup();
+ task.setFile(markup);
+ task.execute();
+
+ listFiles();
+
+ File docbookFile = new File(markup.getParentFile(), "markup.xml");
+ assertTrue(docbookFile.exists() && docbookFile.isFile());
+
+ String content = getContent(docbookFile);
+// System.out.println(content);
+
+ assertTrue(content.contains("<book"));
+ assertTrue(content.contains("</book>"));
+ assertTrue(content.contains("<title>markup</title>"));
+ assertTrue(Pattern.compile(
+ "<chapter id=\"FirstHeading\">\\s*<title>First Heading</title>\\s*<para>some content</para>\\s*</chapter>",
+ Pattern.MULTILINE)
+ .matcher(content)
+ .find());
+ assertTrue(Pattern.compile(
+ "<chapter id=\"SecondHeading\">\\s*<title>Second Heading</title>\\s*<para>some more content</para>\\s*</chapter>",
+ Pattern.MULTILINE)
+ .matcher(content)
+ .find());
+
+ }
+
+ public void testSimpleOutputAlternateTitle() throws IOException {
+ File markup = createSimpleTextileMarkup();
+ task.setFile(markup);
+ task.setBookTitle("Alternate Title");
+ task.execute();
+
+ listFiles();
+
+ File docbookFile = new File(markup.getParentFile(), "markup.xml");
+ assertTrue(docbookFile.exists() && docbookFile.isFile());
+
+ String content = getContent(docbookFile);
+// System.out.println(content);
+
+ assertTrue(content.contains("<book"));
+ assertTrue(content.contains("</book>"));
+ assertTrue(content.contains("<title>Alternate Title</title>"));
+ assertTrue(Pattern.compile(
+ "<chapter id=\"FirstHeading\">\\s*<title>First Heading</title>\\s*<para>some content</para>\\s*</chapter>",
+ Pattern.MULTILINE)
+ .matcher(content)
+ .find());
+ assertTrue(Pattern.compile(
+ "<chapter id=\"SecondHeading\">\\s*<title>Second Heading</title>\\s*<para>some more content</para>\\s*</chapter>",
+ Pattern.MULTILINE)
+ .matcher(content)
+ .find());
+
+ }
+
+ protected File createSimpleTextileMarkup() throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h1. First Heading");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h1. Second Heading");
+ writer.println();
+ writer.println("some more content");
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ public void testTaskdef() {
+ ResourceBundle bundle = ResourceBundle.getBundle(MarkupToDocbookTask.class.getPackage().getName() + ".tasks");
+ assertEquals(MarkupToDocbookTask.class.getName(), bundle.getString("wikitext-to-docbook"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToEclipseHelpTaskTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToEclipseHelpTaskTest.java
new file mode 100644
index 0000000..43067f2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToEclipseHelpTaskTest.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+public class MarkupToEclipseHelpTaskTest extends MarkupToHtmlTaskTest {
+
+ @Override
+ protected MarkupToHtmlTask createTask() {
+ return new MarkupToEclipseHelpTask();
+ }
+
+ @Override
+ public void testSimpleOutput() throws IOException {
+ super.testSimpleOutput();
+
+ File tocFile = new File(tempFolder, "markup-toc.xml");
+ assertTrue(tocFile.exists());
+
+ String tocContent = getContent(tocFile);
+ System.out.println(tocContent);
+
+ assertTrue(tocContent.contains("<toc topic=\"markup.html\" label=\"markup\">"));
+ assertTrue(tocContent.contains("<topic href=\"markup.html\" label=\"First Heading\""));
+ assertTrue(tocContent.contains("<topic href=\"markup.html#SecondHeading\" label=\"Second Heading\""));
+ }
+
+ @Override
+ public void testMultipleFiles() throws IOException {
+ super.testMultipleFiles();
+
+ File tocFile = new File(tempFolder, "markup-toc.xml");
+ assertTrue(tocFile.exists());
+
+ String tocContent = getContent(tocFile);
+ System.out.println(tocContent);
+
+ assertTrue(tocContent.contains("<toc topic=\"markup.html\" label=\"markup\">"));
+ assertTrue(tocContent.contains("<topic href=\"markup.html\" label=\"First Heading\""));
+ assertTrue(tocContent.contains("<topic href=\"Second-Heading.html\" label=\"Second Heading\""));
+ }
+
+ @Override
+ public void testSimpleOutputAlternateTitle() throws IOException {
+ super.testSimpleOutputAlternateTitle();
+
+ File tocFile = new File(tempFolder, "markup-toc.xml");
+ assertTrue(tocFile.exists());
+
+ String tocContent = getContent(tocFile);
+ System.out.println(tocContent);
+
+ assertTrue(tocContent.contains("<toc topic=\"markup.html\" label=\"Alternate Title\">"));
+ assertTrue(tocContent.contains("<topic href=\"markup.html\" label=\"First Heading\""));
+ assertTrue(tocContent.contains("<topic href=\"markup.html#SecondHeading\" label=\"Second Heading\""));
+ }
+
+ public void testMultipleFilesWithMultiLevelHeadings() throws IOException {
+ File markup = createSimpleTextileMarkupWithMultiLevelHeadings();
+ task.setFile(markup);
+ task.setMultipleOutputFiles(true);
+ task.execute();
+
+ listFiles();
+
+ File tocFile = new File(tempFolder, "markup-toc.xml");
+ assertTrue(tocFile.exists());
+
+ String tocContent = getContent(tocFile);
+ System.out.println(tocContent);
+
+ assertTrue(tocContent.contains("<toc topic=\"markup.html\" label=\"markup\">"));
+ assertTrue(tocContent.contains("<topic href=\"markup.html\" label=\"First Heading\""));
+ assertTrue(tocContent.contains("<topic href=\"Second-Heading.html\" label=\"Second Heading\""));
+ assertTrue(tocContent.contains("<topic href=\"Second-Heading.html#SecondL2\" label=\"Second L2\""));
+ assertTrue(tocContent.contains("<topic href=\"Second-Heading.html#SecondL22\" label=\"Second L2 2\""));
+ }
+
+ protected File createSimpleTextileMarkupWithMultiLevelHeadings() throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h1. First Heading");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h1. Second Heading");
+ writer.println();
+ writer.println("some more content");
+ writer.println();
+ writer.println("h2. Second L2");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h2. Second L2 2");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ public void testTaskdef() {
+ ResourceBundle bundle = ResourceBundle.getBundle(MarkupToEclipseHelpTask.class.getPackage().getName()
+ + ".tasks");
+ assertEquals(MarkupToEclipseHelpTask.class.getName(), bundle.getString("wikitext-to-eclipse-help"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToHtmlTaskTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToHtmlTaskTest.java
new file mode 100644
index 0000000..3d8a060
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToHtmlTaskTest.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+import java.util.regex.Pattern;
+
+public class MarkupToHtmlTaskTest extends AbstractTestAntTask {
+
+ protected MarkupToHtmlTask task;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ task = createTask();
+ task.setFormatOutput(true);
+ task.setMarkupLanguage(languageName);
+ }
+
+ protected MarkupToHtmlTask createTask() {
+ return new MarkupToHtmlTask();
+ }
+
+ public void testSimpleOutput() throws IOException {
+ File markup = createSimpleTextileMarkup();
+ task.setFile(markup);
+ task.execute();
+
+ listFiles();
+
+ File htmlFile = new File(markup.getParentFile(), "markup.html");
+ assertTrue(htmlFile.exists() && htmlFile.isFile());
+
+ String content = getContent(htmlFile);
+// System.out.println(content);
+
+ assertTrue(content.contains("<html"));
+ assertTrue(content.contains("</html>"));
+ assertTrue(content.contains("<title>markup</title>"));
+ assertTrue(content.contains("<body>"));
+ assertTrue(content.contains("</body>"));
+ }
+
+ public void testSimpleOutputAlternateTitle() throws IOException {
+ File markup = createSimpleTextileMarkup();
+ task.setFile(markup);
+ task.setTitle("Alternate Title");
+ task.execute();
+
+ listFiles();
+
+ File htmlFile = new File(markup.getParentFile(), "markup.html");
+ assertTrue(htmlFile.exists() && htmlFile.isFile());
+
+ String content = getContent(htmlFile);
+// System.out.println(content);
+
+ assertTrue(content.contains("<html"));
+ assertTrue(content.contains("</html>"));
+ assertTrue(content.contains("<title>Alternate Title</title>"));
+ assertTrue(content.contains("<body>"));
+ assertTrue(content.contains("</body>"));
+ }
+
+ public void testMultipleFiles() throws IOException {
+ File markup = createSimpleTextileMarkup();
+ task.setFile(markup);
+ task.setMultipleOutputFiles(true);
+ task.execute();
+
+ listFiles();
+
+ File htmlFile = new File(markup.getParentFile(), "markup.html");
+ assertTrue(htmlFile.exists() && htmlFile.isFile());
+
+ String content = getContent(htmlFile);
+// System.out.println(content);
+
+ assertTrue(content.contains("<html"));
+ assertTrue(content.contains("</html>"));
+ assertTrue(content.contains("<title>markup</title>"));
+ assertTrue(content.contains("<body>"));
+ assertTrue(content.contains("</body>"));
+ assertTrue(content.contains("<a href=\"Second-Heading.html\" title=\"Second Heading\">Next</a>"));
+ assertTrue(Pattern.compile("<td[^>]*>Second Heading</td>").matcher(content).find());
+
+ File htmlFile2 = new File(markup.getParentFile(), "Second-Heading.html");
+ assertTrue(htmlFile2.exists());
+
+ String content2 = getContent(htmlFile2);
+// System.out.println(content2);
+
+ assertTrue(content2.contains("<html"));
+ assertTrue(content2.contains("</html>"));
+ assertTrue(content2.contains("<title>markup - Second Heading</title>"));
+ assertTrue(content2.contains("<body>"));
+ assertTrue(content2.contains("</body>"));
+ assertTrue(content2.contains("<a href=\"markup.html\" title=\"First Heading\">Previous</a>"));
+ assertTrue(Pattern.compile("<td[^>]*>First Heading</td>").matcher(content2).find());
+ }
+
+ protected File createSimpleTextileMarkup() throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h1. First Heading");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h1. Second Heading");
+ writer.println();
+ writer.println("some more content");
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ public void testTaskdef() {
+ ResourceBundle bundle = ResourceBundle.getBundle(MarkupToHtmlTask.class.getPackage().getName() + ".tasks");
+ assertEquals(MarkupToHtmlTask.class.getName(), bundle.getString("wikitext-to-html"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToXslfoTaskTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToXslfoTaskTest.java
new file mode 100644
index 0000000..803aa38
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/core/util/anttask/MarkupToXslfoTaskTest.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.core.util.anttask;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ResourceBundle;
+
+public class MarkupToXslfoTaskTest extends AbstractTestAntTask {
+
+ private MarkupToXslfoTask task;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ task = new MarkupToXslfoTask();
+ task.setMarkupLanguage(languageName);
+ }
+
+ public void testSimpleOutput() throws IOException {
+ File markup = createSimpleTextileMarkup();
+ task.setFile(markup);
+ task.execute();
+
+ listFiles();
+
+ File targetFile = new File(markup.getParentFile(), "markup.fo");
+ assertTrue(targetFile.exists() && targetFile.isFile());
+
+ String content = getContent(targetFile);
+// System.out.println(content);
+
+ assertTrue(content.contains("<root xmlns=\"http://www.w3.org/1999/XSL/Format\""));
+ assertTrue(content.contains("</root>"));
+ assertTrue(content.contains(">markup</block>"));
+ assertTrue(content.contains(" id=\"FirstHeading\">First Heading</block>"));
+ assertTrue(content.contains(" id=\"SecondHeading\">Second Heading</block>"));
+ }
+
+ protected File createSimpleTextileMarkup() throws IOException {
+ File markupFile = new File(tempFolder, "markup.textile");
+ PrintWriter writer = new PrintWriter(new FileWriter(markupFile));
+ try {
+ writer.println("h1. First Heading");
+ writer.println();
+ writer.println("some content");
+ writer.println();
+ writer.println("h1. Second Heading");
+ writer.println();
+ writer.println("some more content");
+ } finally {
+ writer.close();
+ }
+ return markupFile;
+ }
+
+ public void testTaskdef() {
+ ResourceBundle bundle = ResourceBundle.getBundle(MarkupToXslfoTask.class.getPackage().getName() + ".tasks");
+ assertEquals(MarkupToXslfoTask.class.getName(), bundle.getString("wikitext-to-xslfo"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/mediawiki/core/MediaWikiLanguageTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/mediawiki/core/MediaWikiLanguageTest.java
new file mode 100644
index 0000000..d586217
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/mediawiki/core/MediaWikiLanguageTest.java
@@ -0,0 +1,526 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.mediawiki.core;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.DocBookDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.RecordingDocumentBuilder;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MediaWikiLanguageTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private MediaWikiLanguage markupLanaguage;
+
+ @Override
+ public void setUp() {
+ markupLanaguage = new MediaWikiLanguage();
+ parser = new MarkupParser(markupLanaguage);
+ }
+
+ public void testIsDetectingRawHyperlinks() {
+ assertTrue(parser.getMarkupLanguage().isDetectingRawHyperlinks());
+ }
+
+ public void testParagraph() {
+ String html = parser.parseToHtml("first para<br/>\nfirst para line2\n\nsecond para\n\nthird para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>first para<br/>\\s*first para line2</p><p>second para</p><p>third para</p></body>").matcher(
+ html).find());
+ }
+
+ public void testNowiki() {
+ String html = parser.parseToHtml("'''<nowiki>no <!-- markup here</nowiki>'''");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p><b>no <!-- markup here</b></p></body>").matcher(html).find());
+ }
+
+ public void testBoldItalic() {
+ String html = parser.parseToHtml("normal '''''bold italic text''''' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <b><i>bold italic text</i></b> normal</p></body>")
+ .matcher(html)
+ .find());
+ }
+
+ public void testBold() {
+ String html = parser.parseToHtml("normal '''bold text''' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <b>bold text</b> normal</p></body>").matcher(html).find());
+ }
+
+ public void testItalic() {
+ String html = parser.parseToHtml("normal ''italic text'' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <i>italic text</i> normal</p></body>").matcher(html).find());
+ }
+
+ public void testHeadings() {
+ for (int x = 1; x <= 6; ++x) {
+ String delimiter = repeat(x, "=");
+ String html = parser.parseToHtml(delimiter + "heading text" + delimiter
+ + "\nfirst para<br/>\nfirst para line2\n\nsecond para\n\nthird para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"[^\"]+\">heading text</h" + x
+ + "><p>first para<br/>\\s*first para line2</p><p>second para</p><p>third para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+ }
+
+ public void testHeadingsWithPara() {
+ String html = parser.parseToHtml("\n== H1 ==\n\npa\n\n=== H3 ===\n\nabc");
+ System.out.println(html);
+ assertTrue(html.contains("<body><h2 id=\"H1\">H1</h2><p>pa</p><h3 id=\"H3\">H3</h3><p>abc</p></body>"));
+ }
+
+ // FIXME: can paragraphs be interrupted by headings?
+ // public void testHeadingsWithPara2() {
+ // String html = parser.parseToHtml("== H1 ==\npa\n=== H3 ===\n\nabc");
+ // System.out.println(html);
+ // assertTrue(html.contains("<body><h2>H1</h2><p>pa</p><h3>H3</h3><p>abc</p></body>"));
+ // }
+
+ private String repeat(int i, String string) {
+ StringBuilder buf = new StringBuilder(string.length() * i);
+ for (int x = 0; x < i; ++x) {
+ buf.append(string);
+ }
+ return buf.toString();
+ }
+
+ public void testHorizontalRule() {
+ String html = parser.parseToHtml("an hr ---- foo");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("hr <hr/> foo"));
+ }
+
+ public void testListUnordered() throws IOException {
+ String html = parser.parseToHtml("* a list\n* with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ul>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ul>"));
+ }
+
+ public void testListOrdered() throws IOException {
+ String html = parser.parseToHtml("# a list\n# with two lines");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListOrderedWithContinuation() throws IOException {
+ String html = parser.parseToHtml("# a list\n" + "## a nested item\n" + "### another nested item\n"
+ + "#: continued\n" + "# another item");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><ol><li>a list<ol><li>a nested item<ol><li>another nested item</li></ol>continued</li></ol></li><li>another item</li></ol></body>"));
+
+ // TODO: continuations on first level?
+ }
+
+ public void testListOrderedWithContinuationToDocBook() throws IOException {
+ StringWriter out = new StringWriter();
+ parser.setBuilder(new DocBookDocumentBuilder(out));
+
+ parser.parse("# a list\n" + "## a nested item\n" + "### another nested item\n" + "#: continued\n"
+ + "# another item");
+
+ String docbook = out.toString();
+
+ System.out.println("DocBook: \n" + docbook);
+
+ // should look like this:
+ //
+ // <orderedlist>
+ // <listitem>
+ // <para>a list</para>
+ // <orderedlist>
+ // <listitem>
+ // <para>a nested item</para>
+ // <orderedlist>
+ // <listitem>
+ // <para>another nested item</para>
+ // </listitem>
+ // </orderedlist>
+ // <para>continued</para>
+ // </listitem>
+ // </orderedlist>
+ // </listitem>
+ // <listitem>
+ // <para>another item</para>
+ // </listitem>
+ // </orderedlist>
+
+ assertTrue(docbook.contains("<orderedlist><listitem><para>a list</para><orderedlist><listitem><para>a nested item</para><orderedlist><listitem><para>another nested item</para></listitem></orderedlist><para>continued</para></listitem></orderedlist></listitem><listitem><para>another item</para></listitem></orderedlist>"));
+
+ }
+
+ public void testListNested() throws IOException {
+ String html = parser.parseToHtml("# a list\n## nested\n## nested2\n# level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list"));
+ assertTrue(html.contains("<li>nested"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListMixed() throws IOException {
+ // test for bug# 47
+ String html = parser.parseToHtml("# first\n* second");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>first</li></ol><ul><li>second</li></ul>"));
+ }
+
+ public void testListNestedMixed() throws IOException {
+ String html = parser.parseToHtml("# a list\n#* nested\n#* nested2\n# level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>a list<ul><li>nested</li><li>nested2</li></ul></li><li>level1</li></ol>"));
+ }
+
+ public void testDefinitionList() {
+ String html = parser.parseToHtml(";Definition\n:item1\n:item2\na para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><dl><dt>Definition</dt><dd>item1</dd><dd>item2</dd></dl><p>a para</p></body>"));
+ }
+
+ public void testDefinitionList2() {
+ String html = parser.parseToHtml(";Definition : item1\n:item2\na para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><dl><dt>Definition</dt><dd>item1</dd><dd>item2</dd></dl><p>a para</p></body>"));
+ }
+
+ public void testDefinitionList3() {
+ String html = parser.parseToHtml(";Definition [http://www.foobar.com Foo Bar] : Foo Bar test 123\n;Definition 2 [http://www.foobarbaz.com Foo Bar Baz] : another definition\na para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("</head><body><dl><dt>Definition <a href=\"http://www.foobar.com\">Foo Bar</a></dt><dd>Foo Bar test 123</dd><dt>Definition 2 <a href=\"http://www.foobarbaz.com\">Foo Bar Baz</a></dt><dd>another definition</dd></dl><p>a para</p></body>"));
+ }
+
+ public void testIndented() {
+ String html = parser.parseToHtml("::Indented\na para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><dl><dd><dl><dd>Indented</dd></dl></dd></dl><p>a para</p></body>"));
+ }
+
+ public void testPreformatted() {
+ String html = parser.parseToHtml("normal para\n preformatted\n more pre\nnormal para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(
+ "<body><p>normal para</p><pre>preformatted\\s+more pre\\s+</pre><p>normal para</p></body>").matcher(
+ html).find());
+ }
+
+ public void testHtmlTags() {
+ String html = parser.parseToHtml("normal para <b id=\"foo\">test heading</b>");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>normal para <b id=\"foo\">test heading</b></p>"));
+ }
+
+ public void testHtmlComment() {
+ String html = parser.parseToHtml("normal para <!-- test comment --> normal *foo*");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>normal para <!-- test comment --> normal *foo*</p></body>"));
+ }
+
+ public void testLinkInternalPageReference() {
+ String html = parser.parseToHtml("a [[Main Page]] reference to the Main Page");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"/wiki/Main_Page\" title=\"Main Page\">Main Page</a> reference to the Main Page</p></body>"));
+ }
+
+ public void testLinkInternalPageAnchorReference() {
+ String html = parser.parseToHtml("a [[#Some link|alt text]] reference to an internal anchor");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"#Some_link\">alt text</a> reference to an internal anchor</p></body>"));
+ }
+
+ public void testLinkInternalPageReferenceWithAltText() {
+ String html = parser.parseToHtml("a [[Main Page|alternative text]] reference to the Main Page");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"/wiki/Main_Page\" title=\"Main Page\">alternative text</a> reference to the Main Page</p></body>"));
+ }
+
+ public void testLinkInternalCategoryReference() {
+ String html = parser.parseToHtml("a [[:Category:Help]] reference to the Main Page");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"Category:Help\" title=\"Category:Help\">Category:Help</a> reference to the Main Page</p></body>"));
+ }
+
+ public void testHyperlinkImplied() {
+ String html = parser.parseToHtml("a http://example.com hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkInternal() {
+ String html = parser.parseToHtml("Also see the [[Mylyn_FAQ#Installation_Troubleshooting | Installation FAQ]].");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>Also see the <a href=\"/wiki/Mylyn_FAQ#Installation_Troubleshooting\" title=\"Mylyn_FAQ#Installation_Troubleshooting\">Installation FAQ</a>.</p>"));
+ }
+
+ public void testHyperlinkQualifiedInternal() {
+ markupLanaguage.setInternalLinkPattern("http://wiki.eclipse.org/Mylyn/{0}");
+ String html = parser.parseToHtml("Also see the [[Mylyn/FAQ#Installation_Troubleshooting | Installation FAQ]].");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>Also see the <a href=\"http://wiki.eclipse.org/Mylyn/FAQ#Installation_Troubleshooting\" title=\"Mylyn/FAQ#Installation_Troubleshooting\">Installation FAQ</a>.</p>"));
+ }
+
+ public void testHyperlinkExternal() {
+ String html = parser.parseToHtml("a [http://example.com] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">http://example.com</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkExternalWithAltText() {
+ String html = parser.parseToHtml("a [http://example.com|Example] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">Example</a> hyperlink</p></body>"));
+ }
+
+ public void testHyperlinkExternalWithAltText2() {
+ String html = parser.parseToHtml("a [http://example.com Example Title] hyperlink");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <a href=\"http://example.com\">Example Title</a> hyperlink</p></body>"));
+ }
+
+ public void testImage() {
+ String html = parser.parseToHtml("a [[Image:foo.png]] image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <img border=\"0\" src=\"foo.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAltText() {
+ String html = parser.parseToHtml("a [[Image:foo.png|Example]] image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <img title=\"Example\" alt=\"Example\" border=\"0\" src=\"foo.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAltTextAndOptions() {
+ String html = parser.parseToHtml("a [[Image:foo.png|100px|center|Example]] image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <img width=\"100\" align=\"middle\" title=\"Example\" alt=\"Example\" border=\"0\" src=\"foo.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAltTextAndHeightWidth() {
+ String html = parser.parseToHtml("a [[Image:foo.png|100x220px]] image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <img height=\"220\" width=\"100\" border=\"0\" src=\"foo.png\"/> image</p></body>"));
+ }
+
+ public void testImageWithAltTextAndWidth() {
+ String html = parser.parseToHtml("a [[Image:foo.png|100px]] image");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <img width=\"100\" border=\"0\" src=\"foo.png\"/> image</p></body>"));
+ }
+
+ public void testTable() {
+ String html = parser.parseToHtml("{|\n" + "|Orange\n" + "|Apple\n" + "|-\n" + "|Bread\n" + "|Pie\n" + "|-\n"
+ + "|Butter\n" + "|Ice cream \n" + "|}");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><td>Orange</td><td>Apple</td></tr><tr><td>Bread</td><td>Pie</td></tr><tr><td>Butter</td><td>Ice cream </td></tr></table></body>"));
+ }
+
+ public void testTable2() {
+ String html = parser.parseToHtml("{|\n" + "| Orange || Apple || more\n" + "|-\n"
+ + "| Bread || Pie || more\n" + "|-\n" + "| Butter || Ice cream || and more\n"
+ + "|}\n");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><td>Orange</td><td>Apple</td><td>more</td></tr><tr><td>Bread</td><td>Pie</td><td>more</td></tr><tr><td>Butter</td><td>Ice cream</td><td>and more</td></tr></table></body>"));
+ }
+
+ public void testTableHeadings() {
+ String html = parser.parseToHtml("{|\n" + "! Fruit !! Quantity !! Price\n" + "|-\n"
+ + "| Apple || lb || 0.99\n" + "|}\n");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><th>Fruit</th><th>Quantity</th><th>Price</th></tr><tr><td>Apple</td><td>lb</td><td>0.99</td></tr></table></body>"));
+ }
+
+ public void testTableHeadingsMixed() {
+ String html = parser.parseToHtml("{|\n! headerCell || normalCell\n|-\n| normalCell2 !! headerCell2\n|}");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table><tr><th>headerCell</th><td>normalCell</td></tr><tr><td>normalCell2</td><th>headerCell2</th></tr></table></body>"));
+ }
+
+ public void testTableLexicalOffsets() {
+ final RecordingDocumentBuilder builder = new RecordingDocumentBuilder();
+ parser.setBuilder(builder);
+ final String content = "{|\n" + "| Orange || Apple || more\n" + "|-\n"
+ + "| Bread || Pie || more\n" + "|-\n" + "| Butter || Ice cream || and more\n"
+ + "|}\n";
+ System.out.println(content);
+ parser.parse(content);
+ System.out.println("Events: \n" + builder);
+
+ for (RecordingDocumentBuilder.Event event : builder.getEvents()) {
+ if (event.text != null) {
+ int start = event.locator.getDocumentOffset();
+ int end = event.locator.getLineSegmentEndOffset() + event.locator.getLineDocumentOffset();
+ assertEquals(event.text.length(), end - start);
+ assertTrue(end >= start);
+ assertEquals(content.substring(start, end), event.text);
+ }
+ }
+
+ }
+
+ public void testTableIncomplete() {
+ final RecordingDocumentBuilder builder = new RecordingDocumentBuilder();
+ parser.setBuilder(builder);
+ final String content = "{|\n" + "| Orange || Apple || more\n" + "|-\n"
+ + "| Bread || Pie || more\n" + "|-\n" + "| Butter || Ice cream || and more\n"
+ + "| \n";
+ System.out.println(content);
+ parser.parse(content);
+ System.out.println("Events: \n" + builder);
+
+ for (RecordingDocumentBuilder.Event event : builder.getEvents()) {
+ if (event.text != null) {
+ int start = event.locator.getDocumentOffset();
+ int end = event.locator.getLineSegmentEndOffset() + event.locator.getLineDocumentOffset();
+ assertEquals(event.text.length(), end - start);
+ assertTrue(end >= start);
+ assertEquals(content.substring(start, end), event.text);
+ }
+ }
+
+ }
+
+ public void testTableIncomplete2() {
+ final RecordingDocumentBuilder builder = new RecordingDocumentBuilder();
+ parser.setBuilder(builder);
+ final String content = "{|\n" + "| foo |\n" + "|}";
+ System.out.println(content);
+ parser.parse(content);
+ System.out.println("Events: \n" + builder);
+
+ for (RecordingDocumentBuilder.Event event : builder.getEvents()) {
+ if (event.text != null) {
+ int start = event.locator.getDocumentOffset();
+ int end = event.locator.getLineSegmentEndOffset() + event.locator.getLineDocumentOffset();
+ assertEquals(event.text.length(), end - start);
+ assertTrue(end >= start);
+ assertEquals(content.substring(start, end), event.text);
+ }
+ }
+ }
+
+ public void testTableWithSyntax() {
+ final RecordingDocumentBuilder builder = new RecordingDocumentBuilder();
+ parser.setBuilder(builder);
+ String content = "{|\n" + "| <nowiki>'''''bold italic'''''</nowiki> || '''''bold italic''''' ||\n" + "|}";
+ System.out.println(content);
+ parser.parse(content);
+ System.out.println("Events: \n" + builder);
+
+ for (RecordingDocumentBuilder.Event event : builder.getEvents()) {
+ if (event.text != null) {
+ int start = event.locator.getDocumentOffset();
+ int end = event.locator.getLineSegmentEndOffset() + event.locator.getLineDocumentOffset();
+
+ assertTrue(end >= start);
+
+ }
+ }
+ }
+
+ public void testTableOptions() {
+ String html = parser.parseToHtml("{| border=\"1\"\n" + "|- style=\"font-style:italic;color:green;\"\n"
+ + "| colspan=\"2\" | Orange || valign=\"top\" | Apple\n" + "|}");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table border=\"1\"><tr style=\"font-style:italic;color:green;\">"));
+ assertTrue(html.contains("<td colspan=\"2\">Orange</td>"));
+ assertTrue(html.contains("<td valign=\"top\">Apple</td>"));
+ }
+
+ public void testEntityReference() {
+ String tests = "À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü ß à á â ã ä å æ ç è é ê ë ì í î ï ñ ò ó ô œ õ ö ø ù ú û ü ÿ ¿ ¡ § ¶ † ‡ • – — ‹ › « » ‘ ’ “ ” ™ © ® ¢ € ¥ £ ¤ ⁰ ¹ ² ³ ⁴ ∫ ∑ ∏ √ − ± ∞ ≈ ∝ ≡ ≠ ≤ ≥ × · ÷ ∂ ′ ″ ∇ ‰ ° ∴ ℵ ø ∈ ∉ ∩ ∪ ⊂ ⊃ ⊆ ⊇ ¬ ∧ ∨ ∃ ∀ ⇒ ⇐ ⇓ ⇑ ⇔ → ↓ ↑ ← ↔";
+ final String[] allEntities = tests.split("\\s+");
+ assertTrue(allEntities.length > 100);
+ for (String testEntity : allEntities) {
+ // sanity check
+ assertTrue(testEntity.startsWith("&"));
+ assertTrue(testEntity.endsWith(";"));
+
+ String html = parser.parseToHtml(testEntity);
+ assertTrue(testEntity + " in " + html, html.contains(testEntity));
+ html = parser.parseToHtml(testEntity + " trailing text");
+ assertTrue(testEntity + " in " + html, html.contains(testEntity));
+ html = parser.parseToHtml(testEntity + "trailing text");
+ assertTrue(testEntity + " in " + html, html.contains(testEntity));
+ html = parser.parseToHtml("leading text " + testEntity);
+ assertTrue(testEntity + " in " + html, html.contains(testEntity));
+ html = parser.parseToHtml("leading text" + testEntity);
+ assertTrue(testEntity + " in " + html, html.contains(testEntity));
+ }
+ }
+
+ public void testTemplateEnDash() {
+ // note: spacing is very specific
+ String html = parser.parseToHtml("A{{ndash}}B");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A – B</p></body>"));
+ html = parser.parseToHtml("A{{endash}}B");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A – B</p></body>"));
+ }
+
+ public void testTemplateEmDash() {
+ // note: spacing is very specific
+ String html = parser.parseToHtml("A{{mdash}}B");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A — B</p></body>"));
+ html = parser.parseToHtml("A{{emdash}}B");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A — B</p></body>"));
+ }
+
+ public void testDefinitionListIndenting() {
+ String markup = ": one\n: two\n\n: three\nfour\n:five";
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><dl><dd>one</dd><dd>two</dd></dl><dl><dd>three</dd></dl><p>four</p><dl><dd>five</dd></dl></body>"));
+ }
+
+ public void testParagraphBreaksOnPreformatted() {
+ String markup = "a normal para\n preformatted\n p\nnormal\n";
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>a normal para</p><pre>preformatted\\s+p\\s+</pre><p>normal</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testParagraphBreaksOnHeading() {
+ String markup = "a normal para\n= h1 =\nnormal\n";
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a normal para</p><h1 id=\"h1\">h1</h1><p>normal</p></body>"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/AbstractTestApplication.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/AbstractTestApplication.java
new file mode 100644
index 0000000..a6d72f7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/AbstractTestApplication.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.FactoryConfigurationError;
+
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToDocbook;
+import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewer;
+import org.eclipse.mylyn.wikitext.ui.viewer.MarkupViewerConfiguration;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author David Green
+ */
+public abstract class AbstractTestApplication {
+
+ private boolean dirty;
+
+ private Browser browser;
+
+ private MarkupViewer viewer;
+
+ private String markup;
+
+ private TextViewer htmlSourceViewer;
+
+ private TextViewer docbookSourceViewer;
+
+ protected void doMain() throws IOException {
+ markup = "";
+
+ Display display = new Display();
+ Shell shell = new Shell(display);
+ shell.setLayout(new FillLayout());
+
+ CTabFolder folder = new CTabFolder(shell, SWT.BORDER);
+
+ createWikiTextViewer(folder);
+ createBrowser(folder);
+ createMarkupSourceViewer(folder);
+ createHtmlSourceViewer(folder);
+ createDocbookSourceViewer(folder);
+
+ updateDependentViewers();
+
+ folder.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent selectionevent) {
+ widgetSelected(selectionevent);
+ }
+
+ public void widgetSelected(SelectionEvent selectionevent) {
+ if (dirty) {
+ updateViewers();
+ }
+ }
+
+ });
+
+ shell.pack();
+ shell.open();
+ while (!shell.isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ display.dispose();
+ }
+
+ private void createHtmlSourceViewer(CTabFolder folder) {
+ CTabItem viewerItem = new CTabItem(folder, SWT.NONE);
+ viewerItem.setText("HTML Source");
+
+ htmlSourceViewer = new TextViewer(folder, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.READ_ONLY);
+ Document document = new Document("");
+ htmlSourceViewer.setDocument(document);
+
+ viewerItem.setControl(htmlSourceViewer.getControl());
+ }
+
+ private void createDocbookSourceViewer(CTabFolder folder) {
+ CTabItem viewerItem = new CTabItem(folder, SWT.NONE);
+ viewerItem.setText("DocBook Source");
+
+ docbookSourceViewer = new TextViewer(folder, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP | SWT.READ_ONLY);
+ Document document = new Document("");
+ docbookSourceViewer.setDocument(document);
+
+ viewerItem.setControl(docbookSourceViewer.getControl());
+ }
+
+ private void createMarkupSourceViewer(CTabFolder folder) {
+ CTabItem viewerItem = new CTabItem(folder, SWT.NONE);
+ viewerItem.setText(createMarkupLanguage().getName() + " Source");
+
+ TextViewer viewer = new TextViewer(folder, SWT.V_SCROLL | SWT.H_SCROLL | SWT.WRAP);
+ Document document = new Document(markup);
+
+ document.addDocumentListener(new IDocumentListener() {
+ public void documentAboutToBeChanged(DocumentEvent event) {
+ }
+
+ public void documentChanged(DocumentEvent event) {
+ dirty = true;
+ markup = event.getDocument().get();
+ }
+
+ });
+ viewer.setDocument(document);
+
+ viewerItem.setControl(viewer.getControl());
+ }
+
+ private void createBrowser(CTabFolder folder) {
+ CTabItem viewerItem = new CTabItem(folder, SWT.NONE);
+ viewerItem.setText("Browser");
+
+ browser = new Browser(folder, SWT.NONE);
+ viewerItem.setControl(browser);
+ }
+
+ private void updateDependentViewers() {
+ {
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(createMarkupLanguage());
+ StringWriter html = new StringWriter();
+ try {
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(html);
+ parser.setBuilder(builder);
+ parser.parse(markup);
+ } catch (FactoryConfigurationError e1) {
+ throw new IllegalStateException(e1);
+ }
+
+ htmlSourceViewer.getDocument().set(html.toString());
+ }
+ {
+ MarkupToDocbook markupToDocbook = new MarkupToDocbook();
+ markupToDocbook.setMarkupLanguage(createMarkupLanguage());
+ markupToDocbook.setBookTitle("Book");
+ String docbook;
+ try {
+ docbook = markupToDocbook.parse(markup);
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ docbookSourceViewer.getDocument().set(docbook);
+ }
+ {
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(createMarkupLanguage());
+ String html = parser.parseToHtml(markup);
+ browser.setText(html);
+ }
+ }
+
+ protected abstract MarkupLanguage createMarkupLanguage();
+
+ private void createWikiTextViewer(CTabFolder folder) {
+ CTabItem viewerItem = new CTabItem(folder, SWT.NONE);
+ viewerItem.setText("WikiText Viewer");
+
+ viewer = new MarkupViewer(folder, null, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ viewer.setMarkupLanguage(createMarkupLanguage());
+
+ MarkupViewerConfiguration configuration = new MarkupViewerConfiguration(viewer);
+ viewer.configure(configuration);
+ viewer.getTextWidget().setEditable(false);
+ viewer.setMarkup(markup);
+ viewerItem.setControl(viewer.getControl());
+
+ // output to the console info about annotations near the caret
+ viewer.getTextWidget().addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ @SuppressWarnings("unchecked")
+ public void widgetSelected(SelectionEvent e) {
+ int offset = e.x;
+ List<String> annotations = new ArrayList<String>();
+ Iterator<Annotation> it = viewer.getAnnotationModel().getAnnotationIterator();
+ while (it.hasNext()) {
+ Annotation annotation = it.next();
+ Position position = viewer.getAnnotationModel().getPosition(annotation);
+ if (Math.abs(position.getOffset() - offset) < 5) {
+ annotations.add(String.format("[%s,%s] %s %s", position.getOffset(), position.getLength(),
+ position.getOffset() - offset, annotation.getType()));
+ }
+ }
+ System.out.println("offset: " + offset + " annotations: " + annotations);
+ }
+ });
+ }
+
+ protected void updateViewers() {
+ viewer.setMarkup(markup);
+ updateDependentViewers();
+ dirty = false;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/AbstractTestInWorkspace.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/AbstractTestInWorkspace.java
new file mode 100644
index 0000000..2eb4363
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/AbstractTestInWorkspace.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+
+ at HeadRequired
+public abstract class AbstractTestInWorkspace extends TestCase {
+
+ private static boolean init = false;
+
+ private final List<IProject> temporaryProjects = new ArrayList<IProject>();
+
+ public AbstractTestInWorkspace() {
+ if (!init) {
+ try {
+ ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE,
+ new NullProgressMonitor());
+ } catch (CoreException e) {
+ throw new IllegalStateException(e);
+ }
+ init = true;
+ }
+ }
+
+ /**
+ * Overriding classes should call super.setUp()
+ */
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ /**
+ * Overriding classes should call super.tearDown()
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ if (!temporaryProjects.isEmpty()) {
+ NullProgressMonitor monitor = new NullProgressMonitor();
+ monitor.beginTask("Removing " + temporaryProjects.size() + " temporary projects",
+ 100 * temporaryProjects.size());
+ try {
+ for (IProject project : temporaryProjects) {
+ project.delete(true, true, new SubProgressMonitor(monitor, 100));
+ }
+ } finally {
+ monitor.done();
+ temporaryProjects.clear();
+ }
+ }
+ }
+
+ public IProject createSimpleProject() throws CoreException {
+ long seed = System.currentTimeMillis();
+
+ String projectName = "test" + seed;
+
+ String tmpDir = System.getProperty("java.io.tmpdir");
+
+ URI location = (new File(tmpDir, projectName)).toURI();
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ final IProjectDescription description = workspace.newProjectDescription(projectName);
+ description.setLocationURI(location);
+
+ IProject project = workspace.getRoot().getProject(projectName);
+
+ project.create(description, new NullProgressMonitor());
+ if (!project.isOpen()) {
+ project.open(new NullProgressMonitor());
+ }
+
+ temporaryProjects.add(project);
+
+ return project;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/ClassFilter.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/ClassFilter.java
new file mode 100644
index 0000000..b8d6737
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/ClassFilter.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+/**
+ * a means of filtering a class
+ *
+ * @author David Green
+ */
+public interface ClassFilter {
+
+ /**
+ * indicate if the class should be filtered. Filtered classes are excluded.
+ *
+ * @param clazz
+ * the class to test
+ *
+ * @return true if the class should be filtered
+ */
+ public boolean filter(Class<?> clazz);
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/ClassTraversal.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/ClassTraversal.java
new file mode 100644
index 0000000..4c24b53
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/ClassTraversal.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.Enumeration;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin;
+import org.osgi.framework.Bundle;
+
+/**
+ * A utility for visiting Mylyn classes available on the classpath.
+ *
+ * @author David Green
+ */
+public class ClassTraversal {
+ private static final Pattern BUNDLE_RESOURCE_35 = Pattern.compile("(\\d+)\\..*");;
+
+ public void visitClasses(Visitor visitor) {
+ visitClasses(ClassTraversal.class, visitor);
+ }
+
+ private void visitClasses(Class<ClassTraversal> classOnClasspath, Visitor visitor) {
+ ClassLoader loader = classOnClasspath.getClassLoader();
+ String resourceOfClass = classOnClasspath.getCanonicalName().replace('.', '/') + ".class";
+ Enumeration<URL> resources;
+ try {
+ resources = loader.getResources(resourceOfClass);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ while (resources.hasMoreElements()) {
+ URL url = resources.nextElement();
+ String protocol = url.getProtocol();
+ if (protocol.equals("file")) {
+ String file = url.getFile();
+ try {
+ file = URLDecoder.decode(file, "utf-8").substring(0, file.indexOf(resourceOfClass));
+ } catch (UnsupportedEncodingException e) {
+ throw new IllegalStateException(e);
+ }
+ visitClasses(loader, new File(file), new File(file), visitor);
+
+ } else if (protocol.equals("bundleresource")) {
+ String host = url.getHost();
+ // bug 266767 see http://dev.eclipse.org/mhonarc/lists/equinox-dev/msg05209.html
+ Matcher bundle35Matcher = BUNDLE_RESOURCE_35.matcher(host);
+ if (bundle35Matcher.matches()) {
+ host = bundle35Matcher.group(1);
+ }
+ long bundleId = Long.parseLong(host);
+ Bundle bundle = WikiTextPlugin.getDefault().getBundle().getBundleContext().getBundle(bundleId);
+ if (bundle == null) {
+ throw new IllegalStateException("Cannot get bundle " + bundleId);
+ }
+
+ String path = url.getFile();
+ path = path.substring(0, path.indexOf(resourceOfClass));
+
+ visitClasses(bundle, path, visitor);
+ } else {
+ throw new IllegalStateException("Unimplemented protocol: " + protocol);
+ }
+ }
+ }
+
+ private void visitClasses(ClassLoader loader, File root, File file, Visitor visitor) {
+ File[] files = file.listFiles();
+ if (files != null) {
+ for (File child : files) {
+ if (child.isDirectory()) {
+ visitClasses(loader, root, child, visitor);
+ } else {
+ String path = child.getPath();
+ if (path.endsWith(".class")) {
+ String fqn = path.substring(root.getPath().length() + 1, path.length() - ".class".length());
+ fqn = fqn.replace('/', '.').replace('\\', '.');
+ Class<?> clazz;
+ try {
+ clazz = Class.forName(fqn, true, loader);
+ } catch (LinkageError e) {
+ // see bug 255568 comment 11
+ // can't load the class, so skip it.
+ continue;
+ } catch (Exception e) {
+ // can't load the class, so skip it.
+ continue;
+ }
+ visitor.visit(clazz);
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void visitClasses(Bundle bundle, String path, Visitor visitor) {
+ Enumeration<URL> entries = bundle.findEntries(path, "*.class", true);
+ while (entries.hasMoreElements()) {
+ URL element = entries.nextElement();
+ String filePath = element.getFile();
+ if (filePath.indexOf("org/eclipse/mylyn") != -1) {
+ filePath = filePath.substring(filePath.indexOf("org/eclipse/mylyn"));
+ } else {
+ continue;
+ }
+ String fqn = filePath.substring(0, filePath.length() - ".class".length()).replace('/', '.');
+ Class<?> clazz;
+ try {
+ clazz = bundle.loadClass(fqn);
+ } catch (Exception e) {
+ // can't laod the class, so skip it.
+ continue;
+ }
+ visitor.visit(clazz);
+ }
+ }
+
+ public interface Visitor {
+ public void visit(Class<?> clazz);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/DiscoveryTestSuite.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/DiscoveryTestSuite.java
new file mode 100644
index 0000000..f070e7d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/DiscoveryTestSuite.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.lang.reflect.Modifier;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin;
+import org.eclipse.mylyn.wikitext.tests.ClassTraversal.Visitor;
+
+/**
+ * a test suite that discovers tests by traversing the classpath looking for test classes that match specific criteria.
+ *
+ * @author David Green
+ */
+ at NoDiscovery
+public class DiscoveryTestSuite extends TestSuite implements ClassFilter {
+
+ public DiscoveryTestSuite(ClassFilter filter) {
+ discoverTests(filter);
+ }
+
+ protected void discoverTests(final ClassFilter filter) {
+ // find all tests that meet the right criteria for running in a headless environment
+ new ClassTraversal().visitClasses(new Visitor() {
+ public void visit(Class<?> clazz) {
+ if (!filter(clazz) && !filter.filter(clazz)) {
+ addTest(new TestSuite(clazz));
+ }
+ }
+ });
+ }
+
+ /**
+ * indicate if the eclipse runtime is active
+ */
+ public static boolean inEclipseRuntime() {
+ return WikiTextPlugin.getDefault() != null;
+ }
+
+ public boolean filter(Class<?> clazz) {
+ if (!TestCase.class.isAssignableFrom(clazz)) {
+ return true;
+ }
+ if (DiscoveryTestSuite.class.isAssignableFrom(clazz)) {
+ return true;
+ }
+ if (clazz.getAnnotation(NoDiscovery.class) != null) {
+ return true;
+ }
+ int modifiers = clazz.getModifiers();
+ if (Modifier.isAbstract(modifiers)) {
+ return true;
+ }
+ if (!Modifier.isPublic(modifiers)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/EclipseRuntimeRequired.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/EclipseRuntimeRequired.java
new file mode 100644
index 0000000..0d9eb58
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/EclipseRuntimeRequired.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * a marker annotation for marking tests that require a head (GUI).
+ *
+ * @author David Green
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target( { ElementType.TYPE })
+public @interface EclipseRuntimeRequired {
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadRequired.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadRequired.java
new file mode 100644
index 0000000..d1395a7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadRequired.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * a marker annotation for marking tests that require a head (GUI).
+ *
+ * @author David Green
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target( { ElementType.TYPE })
+public @interface HeadRequired {
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadlessStandaloneTests.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadlessStandaloneTests.java
new file mode 100644
index 0000000..1b6e727
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadlessStandaloneTests.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * A test case that runs all headless tests that are available on the classpath
+ *
+ * @author David Green
+ */
+ at NoDiscovery
+public class HeadlessStandaloneTests extends TestCase {
+
+ public static Test suite() {
+ final DiscoveryTestSuite testSuite = new DiscoveryTestSuite(new Filter());
+ testSuite.setName("Test for org.eclipse.mylyn.wikitext.tests Headless Stand-Alone Tests");
+ return testSuite;
+ }
+
+ private static class Filter implements ClassFilter {
+
+ public Filter() {
+ }
+
+ public boolean filter(Class<?> clazz) {
+ if (HeadlessStandaloneTests.class == clazz) {
+ return true;
+ }
+ if (clazz.getAnnotation(HeadRequired.class) != null) {
+ return true;
+ }
+ if (clazz.getAnnotation(EclipseRuntimeRequired.class) != null) {
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadlessTests.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadlessTests.java
new file mode 100644
index 0000000..5e19072
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/HeadlessTests.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * A test case that runs all headless tests that are available on the classpath
+ *
+ * @author David Green
+ */
+ at NoDiscovery
+public class HeadlessTests extends TestCase {
+
+ public static Test suite() {
+ boolean inEclipseRuntime = DiscoveryTestSuite.inEclipseRuntime();
+ final DiscoveryTestSuite testSuite = new DiscoveryTestSuite(new Filter(inEclipseRuntime));
+ testSuite.setName("Test for org.eclipse.mylyn.wikitext.tests Headless Tests"
+ + (inEclipseRuntime ? " Stand-Alone" : " In Eclipse"));
+ return testSuite;
+ }
+
+ private static class Filter implements ClassFilter {
+ private final boolean inEclipseRuntime;
+
+ public Filter(boolean inEclipseRuntime) {
+ this.inEclipseRuntime = inEclipseRuntime;
+ }
+
+ public boolean filter(Class<?> clazz) {
+ if (HeadlessTests.class == clazz) {
+ return true;
+ }
+ if (clazz.getAnnotation(HeadRequired.class) != null) {
+ return true;
+ }
+ if (!inEclipseRuntime && clazz.getAnnotation(EclipseRuntimeRequired.class) != null) {
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/NoDiscovery.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/NoDiscovery.java
new file mode 100644
index 0000000..828447a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/NoDiscovery.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * a marker annotation for marking tests that should not be discovered by {@link DiscoveryTestSuite}.
+ *
+ * @author David Green
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target( { ElementType.TYPE })
+public @interface NoDiscovery {
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/UITests.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/UITests.java
new file mode 100644
index 0000000..ea87128
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tests/UITests.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tests;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+/**
+ * A test case that runs all UI tests that are available on the classpath
+ *
+ * @author David Green
+ */
+ at NoDiscovery
+public class UITests extends TestCase {
+
+ public static Test suite() {
+ final DiscoveryTestSuite testSuite = new DiscoveryTestSuite(new Filter());
+ testSuite.setName("Test for org.eclipse.mylyn.wikitext.tests UI Tests");
+ return testSuite;
+ }
+
+ private static class Filter implements ClassFilter {
+ public boolean filter(Class<?> clazz) {
+ if (UITests.class == clazz) {
+ return true;
+ }
+ if (clazz.getAnnotation(HeadRequired.class) == null) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/BugzillaTextileLanguageTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/BugzillaTextileLanguageTest.java
new file mode 100644
index 0000000..4e191c4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/BugzillaTextileLanguageTest.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.textile.core;
+
+import java.io.IOException;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.util.Util;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+
+/**
+ * @author David Green
+ */
+public class BugzillaTextileLanguageTest extends TestCase {
+
+ private MarkupParser parser;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ initParser();
+ }
+
+ private void initParser() throws IOException {
+ parser = new MarkupParser();
+ TextileLanguage markupLanaguage = new TextileLanguage();
+ MarkupLanguageConfiguration configuration = Util.create("bugzilla");
+ markupLanaguage.configure(configuration);
+ parser.setMarkupLanguage(markupLanaguage);
+ }
+
+ public void testQuotedBlock() {
+ String html = parser.parseToHtml("One\n\n> Two\n\nThree");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>One</p><blockquote><p>> Two</p></blockquote><p>Three</p></body>"));
+ }
+
+ public void testQuotedBlock2() {
+ String html = parser.parseToHtml("One\n\n> Two\nThree");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>One</p><blockquote><p>> Two</p></blockquote><p>Three</p></body>"));
+ }
+
+ public void testQuotedBlock3() {
+ String html = parser.parseToHtml("One\n> Two\n\nThree");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>One</p><blockquote><p>> Two</p></blockquote><p>Three</p></body>"));
+ }
+
+ public void testQuotedBlock4() {
+ String html = parser.parseToHtml("One\n(In reply to comment #123)\n> Two\n\nThree");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>One</p><blockquote><p>(In reply to comment #123)<br/>> Two</p></blockquote><p>Three</p></body>"));
+ }
+
+ public void testQuotedBlock5() {
+ String html = parser.parseToHtml("One\n > Two\n > Three\nFour");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>One</p><blockquote><p> > Two<br/> > Three</p></blockquote><p>Four</p></body>"));
+ }
+
+ public void testThisBugHasBeen() {
+ String baseMarkup = "*** This bug has been marked as a duplicate of bug 123 ***";
+
+ String html = parser.parseToHtml(baseMarkup);
+ System.out.println(html);
+ assertTrue(html.contains("<p style=\"color: Blue;\">*** This bug has been marked as a duplicate of bug 123 ***</p>"));
+
+ html = parser.parseToHtml(" \t " + baseMarkup);
+ System.out.println(html);
+ assertTrue(html.contains("<p style=\"color: Blue;\"> \t *** This bug has been marked as a duplicate of bug 123 ***</p>"));
+
+ html = parser.parseToHtml(baseMarkup + " ");
+ System.out.println(html);
+ assertTrue(html.contains("<p style=\"color: Blue;\">*** This bug has been marked as a duplicate of bug 123 *** </p>"));
+ }
+
+ public void testThisBugHasBeenNegativeMatch() {
+ String baseMarkup = "*** This bug has been marked as a duplicate of bug 123";
+
+ String html = parser.parseToHtml(baseMarkup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><ul><li><ul><li><ul><li>This bug has been marked as a duplicate of bug 123"));
+ }
+
+ public void testBugFooHasBeenMatch() {
+ String markup = "*** Bug 209610 has been marked as a duplicate of this bug. ***";
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><p style=\"color: Blue;\">*** Bug 209610 has been marked as a duplicate of this bug. ***</p>"));
+ }
+
+ public void testBugFooHasBeenNegativeMatch() {
+ String markup = "*** Bug 209610 has been marked as a duplicate of this bug.";
+ String html = parser.parseToHtml(markup);
+ System.out.println(html);
+ assertTrue(html.contains("<body><ul><li><ul><li><ul><li>Bug 209610 has been marked as a duplicate of this bug."));
+ }
+
+ public void testXmlEscaping() {
+ String html = parser.parseToHtml("some <start>mark</start> up");
+ System.out.println(html);
+ assertTrue(html.contains("<p>some <start>mark</start> up</p>"));
+ }
+
+ public void testHtmlEscaping() {
+ String html = parser.parseToHtml("some <span class=\"s\">mark</span> up");
+ System.out.println(html);
+ assertTrue(html.contains("<p>some <span class=\"s\">mark</span> up</p>"));
+ }
+
+ // FIXME disabled due to bug 283629
+// public void testJavaStackTraceDetection() {
+// String html = parser.parseToHtml("text\n" + "java.lang.Exception: java.lang.IllegalStateException\n"
+// + " at org.eclipse.mylyn.internal.wikitext.tasks.ui.util.Test.main(Test.java:21)\n"
+// + "Caused by: java.lang.IllegalStateException\n" + " ... 1 more\n" + "text");
+// System.out.println(html);
+// assertTrue(html.contains("<p>text</p><pre class=\"javaStackTrace\">java.lang.Exception"));
+// assertTrue(html.contains("</pre><p>text</p>"));
+// }
+//
+// public void testJavaStackTraceDetection_bug280805() {
+// String html = parser.parseToHtml("text\n" + "java.lang.Exception: java.lang.IllegalStateException\n"
+// + " at org.eclipse.mylyn.internal.wikitext.tasks.ui.util.test.main(Test.java:21)\n"
+// + "Caused by: java.lang.IllegalStateException\n" + " ... 1 more\n" + "text");
+// System.out.println(html);
+// assertTrue(html.contains("<p>text</p><pre class=\"javaStackTrace\">java.lang.Exception"));
+// assertTrue(html.contains("</pre><p>text</p>"));
+// }
+//
+// public void testJavaStackTraceDetection_bug273629() {
+// boolean canStart = new JavaStackTraceBlock().canStart(
+// "org.eclipse.ui.internal.PerspectiveBarContributionItem.select(PerspectiveBarContributionItem.java:124)",
+// 0);
+// assertTrue(canStart);
+// }
+
+ public void testEclipseErrorDetailsBlock() {
+ String html = parser.parseToHtml("text\n-- Error Details --\ndetail line 1\n\nno detail");
+ System.out.println(html);
+ assertTrue(html.contains("<p>text</p><pre class=\"eclipseErrorDetails\">-- Error Details --"));
+ assertTrue(html.contains("</pre><p>no detail</p>"));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/Main.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/Main.java
new file mode 100644
index 0000000..a71e344
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/Main.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.textile.core;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.tests.AbstractTestApplication;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Main extends AbstractTestApplication {
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ try {
+ Main main = new Main();
+ main.doMain();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new TextileLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguageTasksTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguageTasksTest.java
new file mode 100644
index 0000000..2f2ed7c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguageTasksTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.textile.core;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.wikitext.tasks.ui.util.Util;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+import org.eclipse.mylyn.wikitext.tests.EclipseRuntimeRequired;
+
+/**
+ * tests for Textile that involve the tasks plug-in and dependencies on the Eclipse runtime.
+ *
+ * @author David Green
+ */
+ at EclipseRuntimeRequired
+public class TextileLanguageTasksTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private TextileLanguage markupLanaguage;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ initParser();
+ }
+
+ private void initParser() throws IOException {
+ parser = new MarkupParser();
+ markupLanaguage = new TextileLanguage();
+
+ MarkupLanguageConfiguration configuration = Util.create("bugzilla");
+ markupLanaguage.configure(configuration);
+
+ parser.setMarkupLanguage(markupLanaguage);
+ }
+
+ public void testSubversiveBugReport() throws IOException {
+
+ StringWriter out = new StringWriter();
+ parser.setBuilder(new HtmlDocumentBuilder(out));
+
+ Reader reader = new InputStreamReader(
+ TextileLanguageTest.class.getResourceAsStream("resources/subversive-bug-report.txt"), "utf-8");
+ try {
+ long time = System.currentTimeMillis();
+ parser.parse(reader);
+ long endTime = System.currentTimeMillis();
+ System.out.println(String.format("Took %s millis", endTime - time));
+ } finally {
+ reader.close();
+ }
+// String html = out.toString();
+
+// System.out.println(html);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguageTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguageTest.java
new file mode 100644
index 0000000..dad89da
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguageTest.java
@@ -0,0 +1,1176 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.textile.core;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.RecordingDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.builder.RecordingDocumentBuilder.Event;
+
+/**
+ * NOTE: most textile test cases can be found in {@link MarkupParserTest}
+ *
+ * @author David Green
+ * @see TextileLanguageTasksTest
+ */
+public class TextileLanguageTest extends TestCase {
+
+ private static final String REGEX_NEWLINE = "(?:\\s*?^)";
+
+ private MarkupParser parser;
+
+ private TextileLanguage markupLanaguage;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ initParser();
+ }
+
+ private void initParser() throws IOException {
+ parser = new MarkupParser();
+ markupLanaguage = new TextileLanguage();
+ parser.setMarkupLanguage(markupLanaguage);
+ }
+
+ public void testIsDetectingRawHyperlinks() {
+ assertFalse(markupLanaguage.isDetectingRawHyperlinks());
+ }
+
+ public void testSimpleHeaders() {
+ String html = parser.parseToHtml("h1. a header\n\nh2. another header");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<h1 id=\"aheader\">a header</h1>"));
+ assertTrue(html.contains("<h2 id=\"anotherheader\">another header</h2>"));
+ }
+
+ public void testMultilineBlockCode() {
+ String html = parser.parseToHtml("bc. one\ntwo\n\nthree");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<pre><code>one\\s+^two\\s+^</code>\\s*</pre>", Pattern.MULTILINE | Pattern.DOTALL)
+ .matcher(html)
+ .find());
+ }
+
+ public void testPhraseModifierWorksAtStartOfLine() {
+ String html = parser.parseToHtml("-a phrase modifier- at the start of a line");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<del>a phrase modifier</del> at"));
+ }
+
+ public void testPhraseModifierWorksAtEndOfLine() {
+ String html = parser.parseToHtml("at the start of a line: -a phrase modifier-");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("line: <del>a phrase modifier</del>"));
+ }
+
+ public void testPhraseModifierSingleChar() {
+ String html = parser.parseToHtml("a single character phrase modifier -b- is there");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("modifier <del>b</del>"));
+ }
+
+ public void testPhraseModifierFalsePositives() {
+ String html = parser.parseToHtml("this is - not a phrase modifier- and -neither is this - so there");
+ System.out.println("HTML: \n" + html);
+ assertTrue(!html.contains("<del>"));
+ }
+
+ public void testPhraseModifierFalsePositives2() {
+ String html = parser.parseToHtml("this is - not a phrase modifier - ");
+ System.out.println("HTML: \n" + html);
+ assertTrue(!html.contains("<del>"));
+ }
+
+ public void testBlockCodeAtEndOfDocument() {
+ String html = parser.parseToHtml("bc. one\ntwo\n");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<pre><code>one\\s*^two\\s*^</code></pre>", Pattern.MULTILINE | Pattern.UNIX_LINES)
+ .matcher(html)
+ .find());
+ }
+
+ public void testBlockCodeAtEndOfDocument2() {
+ String html = parser.parseToHtml("bc. one\ntwo");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<pre><code>one\\s*^two\\s*^</code></pre>", Pattern.MULTILINE | Pattern.UNIX_LINES)
+ .matcher(html)
+ .find());
+ }
+
+ public void testPhraseModifierStrong() {
+ String html = parser.parseToHtml("*strong text*");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<strong>strong text</strong>"));
+ }
+
+ public void testPhraseModifiers() {
+ String html = parser.parseToHtml("_emphasis_ *strong text* __italic__ **bold** ??citation?? -deleted text- +inserted text+ ^superscript^ ~subscript~ %spanned text% @code text@");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<em>emphasis</em>"));
+ assertTrue(html.contains("<strong>strong text</strong>"));
+ assertTrue(html.contains("<i>italic</i>"));
+ assertTrue(html.contains("<b>bold</b>"));
+ assertTrue(html.contains("<cite>citation</cite>"));
+ assertTrue(html.contains("<del>deleted text</del>"));
+ assertTrue(html.contains("<ins>inserted text</ins>"));
+ assertTrue(html.contains("<sup>superscript</sup>"));
+ assertTrue(html.contains("<sub>subscript</sub>"));
+ assertTrue(html.contains("<span>spanned text</span>"));
+ assertTrue(html.contains("<code>code text</code>"));
+ }
+
+ public void testPhraseModifiersWithNonWordCharacters() {
+ String html = parser.parseToHtml("_emphasis:_ *strong text:* __italic:__ **bold:** ??citation:?? -deleted text:- +inserted text:+ ^superscript:^ ~subscript:~ %spanned text:% @code text:@");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<em>emphasis:</em>"));
+ assertTrue(html.contains("<strong>strong text:</strong>"));
+ assertTrue(html.contains("<i>italic:</i>"));
+ assertTrue(html.contains("<b>bold:</b>"));
+ assertTrue(html.contains("<cite>citation:</cite>"));
+ assertTrue(html.contains("<del>deleted text:</del>"));
+ assertTrue(html.contains("<ins>inserted text:</ins>"));
+ assertTrue(html.contains("<sup>superscript:</sup>"));
+ assertTrue(html.contains("<sub>subscript:</sub>"));
+ assertTrue(html.contains("<span>spanned text:</span>"));
+ assertTrue(html.contains("<code>code text:</code>"));
+ }
+
+ public void testAdjacentPhraseModifiers() {
+ String html = parser.parseToHtml("_emphasis_ *strong text*");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<em>emphasis</em>"));
+ assertTrue(html.contains("<strong>strong text</strong>"));
+ }
+
+ public void testPhraseModifiersEnclosingText() {
+ String html = parser.parseToHtml("_emphasis_ some text *strong text*");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(".*?<em>emphasis</em>\\s*some text\\s*<strong>strong text</strong>.*",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).matches());
+ }
+
+ public void testPhraseModifierCode() {
+ String html = parser.parseToHtml("@code1@:");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(".*?<code>code1</code>:.*", Pattern.MULTILINE | Pattern.DOTALL)
+ .matcher(html)
+ .matches());
+ }
+
+ /**
+ * bug 276395 Incorrect quotation characters inside code
+ */
+ public void testPhraseModifierCodeWithNestedMarkup() {
+ String html = parser.parseToHtml("a @code 'test' or \"test\" or *b* or <b>bo</b> sample@ more");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>a <code>code 'test' or \"test\" or *b* or <b>bo</b> sample</code> more</p></body>"));
+ }
+
+ public void testRelativeUrlNoBase() {
+ String html = parser.parseToHtml("\"An URL\":foo/bar.html");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"foo/bar.html\">An URL</a>"));
+ }
+
+ public void testGlossaryValidHtml() {
+ String html = parser.parseToHtml("h1. Foo\n\none TWO(Two Ways Out) and MDD(Model-Driven Development)\n\nh1. Glossary\n\n{glossary}");
+ System.out.println("HTML: \n" + html);
+ assertFalse(html.contains("<p><dl"));
+ assertTrue(html.contains("</h1><dl"));
+ }
+
+ public void testLineStartingWithDeletedPhraseModifier() {
+ String html = parser.parseToHtml("-this is deleted text-");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p><del>this is deleted text</del></p>"));
+ }
+
+ public void testListItemWithDeletedText() {
+ String html = parser.parseToHtml("- this is a list item with -deleted text-");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>- this is a list item with <del>deleted text</del></p>"));
+ }
+
+ public void testHtmlEntityEncoding() {
+ String html = parser.parseToHtml("Some A&BC Thing");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("A&BC"));
+ }
+
+ public void testParagraphs() throws IOException {
+ String html = parser.parseToHtml("first para\nnew line\n\nsecond para\n\n\n\n");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>first para<br/>\\s*new line</p><p>second para</p></body>",
+ Pattern.MULTILINE).matcher(html.toString()).find());
+ }
+
+ public void testParagraphWithId() throws IOException {
+ String html = parser.parseToHtml("p(#ab). first para");
+ System.out.println(html);
+ assertTrue(html.contains("<p id=\"ab\">first para</p>"));
+ }
+
+ public void testParagraphWithClass() throws IOException {
+ String html = parser.parseToHtml("p(foo). first para");
+ System.out.println(html);
+ assertTrue(html.contains("<p class=\"foo\">first para</p>"));
+ }
+
+ public void testParagraphWithClassAndId() throws IOException {
+ String html = parser.parseToHtml("p(foo#ab). first para");
+ System.out.println(html);
+ assertTrue(html.contains("<p id=\"ab\" class=\"foo\">first para</p>"));
+ }
+
+ public void testParagraphWithClassAndIdAndStyle() throws IOException {
+ String html = parser.parseToHtml("p(foo#ab){color:black;}. first para");
+ System.out.println(html);
+ assertTrue(html.contains("<p id=\"ab\" class=\"foo\" style=\"color:black;\">first para</p>"));
+ }
+
+ public void testParagraphLeftAligned() throws IOException {
+ String html = parser.parseToHtml("p<. first para");
+ System.out.println(html);
+ assertTrue(html.contains("<p style=\"text-align: left;\">first para</p>"));
+ }
+
+ public void testParagraphWithNestedList() throws IOException {
+ String html = parser.parseToHtml("first para\n# numeric list\nfirst para second line");
+ System.out.println(html);
+ // NOTE: textile dialect doesn't nest lists because that is invalid XHTML. Instead
+ // the paragraph is terminated for the list.
+ assertTrue(html.contains("<body><p>first para</p><ol><li>numeric list</li></ol><p>first para second line</p></body>"));
+ }
+
+ public void testPreformattedDoesntMarkupContent() throws IOException {
+ String html = parser.parseToHtml("pre. \n|_. a|_. table|_. header|\n|a|table|row|\n|a|table|row|\n");
+ System.out.println(html);
+
+ assertTrue(Pattern.compile(
+ "<body><pre>\\s+\\|_. a\\|_. table\\|_. header\\|\\s+\\|a\\|table\\|row\\|\\s+\\|a\\|table\\|row\\|\\s+</pre></body>",
+ Pattern.MULTILINE)
+ .matcher(html.toString())
+ .find());
+ }
+
+ public void testHeading1() throws IOException {
+ String html = parser.parseToHtml("h1(#ab). heading1\n\nnew para\n\na para");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><h1 id=\"ab\">heading1</h1><p>new para</p><p>a para</p></body>",
+ Pattern.MULTILINE).matcher(html.toString()).find());
+ }
+
+ public void testHeadingMultiline() throws IOException {
+ String html = parser.parseToHtml("h1. heading1\nsecondline\n\na para");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><h1 id=\"heading1\">heading1\\s+secondline</h1><p>a para</p></body>",
+ Pattern.MULTILINE).matcher(html.toString()).find());
+ }
+
+ public void testHeading0NoHeading() throws IOException {
+ String html = parser.parseToHtml("h0. heading0\n\nnew para\n\na para");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>h0. heading0</p><p>new para</p><p>a para</p></body>", Pattern.MULTILINE)
+ .matcher(html.toString())
+ .find());
+ }
+
+ public void testMultilinePreformatted() throws IOException {
+ String html = parser.parseToHtml("pre. one\ntwo\n\nthree");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<pre>one\\s+^two\\s+^</pre><p>three</p>", Pattern.MULTILINE | Pattern.DOTALL)
+ .matcher(html.toString())
+ .find());
+ }
+
+ public void testBlockQuote() throws IOException {
+ String html = parser.parseToHtml("bq. one\ntwo\n\nthree");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<blockquote>\\s*<p>one<br/>\\s*two</p>\\s*</blockquote>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testBlockQuoteWithCitation() throws IOException {
+ String html = parser.parseToHtml("bq.:http://www.example.com some text");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<blockquote cite=\"http://www.example.com\">\\s*<p>some text</p>\\s*</blockquote>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testBlockCode() throws IOException {
+ String html = parser.parseToHtml("bc. one\ntwo\n\nthree");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<pre><code>one\\s+two\\s+</code></pre>", Pattern.MULTILINE | Pattern.DOTALL)
+ .matcher(html)
+ .find());
+ }
+
+ public void testBlockCodeWithEmbeddedHtmlTags() throws IOException {
+ String html = parser.parseToHtml("bc. \nhere is <a href=\"#\">a working example</a>\n\n");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(
+ "<body><pre><code>\\s+here is <a href=\"#\">a working example</a>\\s+</code></pre></body>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testFootnote() throws IOException {
+ String html = parser.parseToHtml("See foo[1].\n\nfn1. Foo.");
+
+ System.out.println("HTML: \n" + html);
+ // assert on footnote target
+ assertTrue(Pattern.compile("<p id=\"___fn[^\"]+\" class=\"footnote\"><sup>1</sup> Foo.</p>")
+ .matcher(html)
+ .find());
+ // assert on footnote reference
+ assertTrue(Pattern.compile("<sup class=\"footnote\"><a href=\"#___fn[^\"]+\">1</a></sup>").matcher(html).find());
+ }
+
+ public void testFootnoteRefNoFootnote() throws IOException {
+ markupLanaguage.setPreprocessFootnotes(true);
+ String html = parser.parseToHtml("See foo[1].\n\nNo such footnote!");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>See foo[1].</p><p>No such footnote!</p></body>"));
+ }
+
+ public void testListUnordered() throws IOException {
+ String html = parser.parseToHtml("* a list\n* with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ul>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ul>"));
+ }
+
+ public void testListUnordered2() throws IOException {
+ String html = parser.parseToHtml("* a list\n** with several lines\n*** foo\n** ??foo?? intentional two spaces leading content");
+
+ System.out.println("HTML: \n" + html);
+ }
+
+ public void testListOrdered() throws IOException {
+ String html = parser.parseToHtml("# a list\n# with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListNested() throws IOException {
+ String html = parser.parseToHtml("# a list\n## nested\n## nested2\n# level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list"));
+ assertTrue(html.contains("<li>nested"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListMixed() throws IOException {
+ // test for bug# 47
+ String html = parser.parseToHtml("# first\n* second");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>first</li></ol><ul><li>second</li></ul>"));
+ }
+
+ public void testListNestedMixed() throws IOException {
+ String html = parser.parseToHtml("# a list\n#* nested\n#* nested2\n# level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>a list<ul><li>nested</li><li>nested2</li></ul></li><li>level1</li></ol>"));
+ }
+
+ public void testListWithStyle() throws IOException {
+ String html = parser.parseToHtml("#{color: blue} a list with style");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol style=\"color: blue\">"));
+ assertTrue(html.contains("<li>a list with style</li>"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListNotAList() throws IOException {
+ // test for bug 263074
+ String html = parser.parseToHtml("- first\n- second");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>- first<br/>- second</p></body>"));
+ }
+
+ public void testTable() throws IOException {
+ String html = parser.parseToHtml("table. \n|a|row with|three columns|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td>a</td><td>row with</td><td>three columns</td></tr></table>"));
+ }
+
+ public void testTable2() throws IOException {
+ String html = parser.parseToHtml("foo bar\n|a|row with|three columns|\n|another|row|with three columns|\n\na para");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td>a</td><td>row with</td><td>three columns</td></tr><tr><td>another</td><td>row</td><td>with three columns</td></tr></table>"));
+ }
+
+ public void testTableHeader() throws IOException {
+ String html = parser.parseToHtml("table.\n|_. a|row with|three columns|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><th>a</th><td>row with</td><td>three columns</td></tr></table>"));
+ }
+
+ public void testTableCellAlignment() throws IOException {
+ String html = parser.parseToHtml("table.\n|^a|<row with|>four|<>columns|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td style=\"text-align: top;\">a</td><td style=\"text-align: left;\">row with</td><td style=\"text-align: right;\">four</td><td style=\"text-align: center;\">columns</td></tr></table>"));
+ }
+
+ public void testTableCellColspan() throws IOException {
+ String html = parser.parseToHtml("table.\n|\\2a|\\3b|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td colspan=\"2\">a</td><td colspan=\"3\">b</td></tr></table>"));
+ }
+
+ public void testTableCellRowspan() throws IOException {
+ String html = parser.parseToHtml("table.\n|/2a|/3b|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td rowspan=\"2\">a</td><td rowspan=\"3\">b</td></tr></table>"));
+ }
+
+ public void testTableCellColspanRowspan() throws IOException {
+ String html = parser.parseToHtml("table.\n|\\4/2a|\\5/3b|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td rowspan=\"2\" colspan=\"4\">a</td><td rowspan=\"3\" colspan=\"5\">b</td></tr></table>"));
+ }
+
+ public void testTableWithEmbeddedTextile() throws IOException {
+ String html = parser.parseToHtml("table.\n|*a*|row _with_|stuff|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td><strong>a</strong></td><td>row <em>with</em></td><td>stuff</td></tr></table>"));
+ }
+
+ public void testTableWithAttributes() throws IOException {
+ String html = parser.parseToHtml("table.\n|{color: red;}a|(foo)row with|(#bar)three columns|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td style=\"color: red;\">a</td><td class=\"foo\">row with</td><td id=\"bar\">three columns</td></tr></table>"));
+ }
+
+ public void testTableWithAttributes2() throws IOException {
+ String html = parser.parseToHtml("table{border:1px solid black;}.\n" + "|This|is|a|row|\n" + "|This|is|a|row|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table style=\"border:1px solid black;\"><tr><td>This</td><td>is</td><td>a</td><td>row</td></tr><tr><td>This</td><td>is</td><td>a</td><td>row</td></tr></table>"));
+ }
+
+ public void testTableWithAttributes3() throws IOException {
+ String html = parser.parseToHtml("|This|is|a|row|\n" + "{background:#ddd}. |This|is|grey|row|");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<table><tr><td>This</td><td>is</td><td>a</td><td>row</td></tr><tr style=\"background:#ddd\"><td>This</td><td>is</td><td>grey</td><td>row</td></tr></table>"));
+ }
+
+ public void testTableWithStyles() {
+ String html = parser.parseToHtml("table{border: 1px solid black}.\n|a|table|row|");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table style=\"border: 1px solid black\"><tr><td>a</td><td>table</td><td>row</td></tr></table></body>"));
+ }
+
+ public void testTableWithStylesAndTrailingWhitespace() {
+ String html = parser.parseToHtml("table{border: 1px solid black}. \n|a|table|row|");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><table style=\"border: 1px solid black\"><tr><td>a</td><td>table</td><td>row</td></tr></table></body>"));
+ }
+
+ public void testPhraseModifierBold() throws IOException {
+ String html = parser.parseToHtml("a paragraph with **bold content**");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <b>bold content</b></p>"));
+ }
+
+ public void testPhraseModifierBoldWithId() throws IOException {
+ String html = parser.parseToHtml("a paragraph with **(#1)bold content**");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <b id=\"1\">bold content</b></p>"));
+ }
+
+ public void testSimplePhraseModifiers() throws IOException {
+ String[][] pairs = new String[][] { { "**", "b" }, { "??", "cite" }, { "__", "i" }, { "_", "em" },
+ { "*", "strong" }, { "-", "del" }, { "+", "ins" }, { "~", "sub" }, { "^", "sup" }, { "%", "span" },
+ { "@", "code" }, };
+ for (String[] pair : pairs) {
+ initParser();
+ String html = parser.parseToHtml("a paragraph with " + pair[0] + "content foo bar baz" + pair[0]);
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <" + pair[1] + ">content foo bar baz</" + pair[1] + "></p>"));
+
+ html = parser.parseToHtml(String.format("a %s2%s + b%s2%s = c%s2%s", pair[0], pair[0], pair[0], pair[0],
+ pair[0], pair[0]));
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains(String.format("a <%s>2</%s> + b%s2%s = c%s2%s", pair[1], pair[1], pair[0],
+ pair[0], pair[0], pair[0])));
+
+ html = parser.parseToHtml("a paragraph with (" + pair[0] + "content foo bar baz" + pair[0]
+ + ") punctuation");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with (<" + pair[1] + ">content foo bar baz</" + pair[1]
+ + ">) punctuation</p>"));
+
+ html = parser.parseToHtml("a paragraph with " + pair[0] + "content foo bar baz" + pair[0] + ". punctuation");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <" + pair[1] + ">content foo bar baz</" + pair[1]
+ + ">. punctuation</p>"));
+
+ initParser();
+ html = parser.parseToHtml("a paragraph with " + pair[0] + "(#abc)content foo bar baz" + pair[0]);
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph with <" + pair[1] + " id=\"abc\">content foo bar baz</" + pair[1]
+ + "></p>"));
+
+ // test for false-positive
+ html = parser.parseToHtml("a paragraph with" + pair[0] + "content foo bar baz" + pair[0]);
+ System.out.println("HTML: \n" + html);
+ assertFalse(pair[1], html.contains("<" + pair[1] + ">"));
+ assertFalse(pair[1], html.contains("</" + pair[1] + ">"));
+ html = parser.parseToHtml("a paragraph with " + pair[0] + "content foo bar baz" + pair[0] + "baz.");
+ System.out.println("HTML: \n" + html);
+ assertFalse(pair[1], html.contains("<" + pair[1] + ">"));
+ assertFalse(pair[1], html.contains("</" + pair[1] + ">"));
+ }
+ }
+
+ public void testDeletedIssue22() {
+ // test for a false-positive
+ String html = parser.parseToHtml("Foo bar-baz one two three four-five.");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>Foo bar-baz one two three four-five.</p>"));
+ }
+
+ public void testImage() throws IOException {
+ String html = parser.parseToHtml("Here comes an !imageUrl! with more text");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<img border=\"0\" src=\"imageUrl\"/>"));
+ }
+
+ public void testImageWithAltAndTitle() throws IOException {
+ String html = parser.parseToHtml("Here comes an !imageUrl(alt text)! with more text");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<img alt=\"(alt text)\" title=\"(alt text)\" border=\"0\" src=\"imageUrl\"/>"));
+ }
+
+ public void testImageAlignLeft() throws IOException {
+ String html = parser.parseToHtml("Here comes an !<imageUrl! with more text");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<img align=\"left\" border=\"0\" src=\"imageUrl\"/>"));
+ }
+
+ public void testImageAlignRight() throws IOException {
+ String html = parser.parseToHtml("Here comes an !>imageUrl! with more text");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<img align=\"right\" border=\"0\" src=\"imageUrl\"/>"));
+ }
+
+ public void testImageAlignCenter() throws IOException {
+ String html = parser.parseToHtml("Here comes an !=imageUrl! with more text");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<img align=\"center\" border=\"0\" src=\"imageUrl\"/>"));
+ }
+
+ public void testImageRelative() throws IOException {
+ String html = parser.parseToHtml("Here comes an !foo/bar/baz.jpg! with more text");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<img border=\"0\" src=\"foo/bar/baz.jpg\"/>"));
+ }
+
+ public void testImageHyperlink() throws IOException {
+ String html = parser.parseToHtml("Here comes a !hyperlink!:http://www.google.com to something");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.google.com\"><img border=\"0\" src=\"hyperlink\"/></a>"));
+ assertFalse(html.contains("</a>:http://www.google.com"));
+ assertTrue(html.contains("</a> to something"));
+ }
+
+ public void testImageHyperlinkWithAttributes() throws IOException {
+ String html = parser.parseToHtml("Here comes a !(foo-bar)hyperlink!:http://www.google.com to something");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.google.com\"><img class=\"foo-bar\" border=\"0\" src=\"hyperlink\"/></a>"));
+ assertFalse(html.contains("</a>:http://www.google.com"));
+ assertTrue(html.contains("</a> to something"));
+ }
+
+ public void testImageFalsePositiveOnMultipleExclamationMarks() throws IOException {
+ String html = parser.parseToHtml("Here comes a non-image!!! more text !!! and more");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>Here comes a non-image!!! more text !!! and more</p></body>"));
+ }
+
+ public void testHtmlLiteral() throws IOException {
+ String htmlFragment = "<a href=\"foo-bar\"><img src=\"some-image.jpg\"/></a>";
+ String html = parser.parseToHtml("a paragraph " + htmlFragment + " with HTML literal");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>a paragraph " + htmlFragment + " with HTML literal</p>"));
+
+ }
+
+ public void testHtmlLiteralSelfClosingTag() throws IOException {
+ String html = parser.parseToHtml("a <br/> br tag");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("a <br/> br tag"));
+ }
+
+ public void testHtmlLiteralTwoLinesWithAnchors() throws IOException {
+ String html = parser.parseToHtml("Link 1 <a href=\"x\">x</a>\nand line 2 <a href=\"y\">y</a>");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>Link 1 <a href=\"x\">x</a><br/>"));
+ assertTrue(html.contains("and line 2 <a href=\"y\">y</a></p></body>"));
+ }
+
+ public void testHtmlLiteralUnclosedTag() throws IOException {
+ String html = parser.parseToHtml("<b>bold text with no terminating tag");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<b>bold text"));
+ }
+
+ public void testHtmlLiteralAdjacentTags() throws IOException {
+ String html = parser.parseToHtml("<span><a>some text</a></span>");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<span><a>some text</a></span>"));
+ }
+
+ public void testHtmlLiteralAdjacentTags2() throws IOException {
+ String html = parser.parseToHtml("<span>abc</span><a>some text</a>");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<span>abc</span><a>some text</a>"));
+ }
+
+ public void testHtmlLiteralWithEmbeddedPhraseModifiers() throws IOException {
+ Pattern pattern = Pattern.compile("(<[a-zA-Z][a-zA-Z0-9_-]*(?:\\s*[a-zA-Z][a-zA-Z0-9_:-]*=\"[^\"]*\")*\\s*/?>)");
+ Matcher matcher = pattern.matcher("This document was authored using Textile markup: <a href=\"https://textile-j.dev.java.net/source/browse/*checkout*/textile-j/trunk/java/org.eclipse.mylyn.wikitext.ui.doc/help/Textile-J%20User%20Guide.textile\">original Textile markup for this document</a> ");
+ while (matcher.find()) {
+ System.out.println(String.format("Found '%s'", matcher.group(1)));
+ }
+ String html = parser.parseToHtml("This document was authored using Textile markup: <a href=\"https://textile-j.dev.java.net/source/browse/*checkout*/textile-j/trunk/java/org.eclipse.mylyn.wikitext.ui.doc/help/Textile-J%20User%20Guide.textile\">original Textile markup for this document</a>");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("markup: <a href=\"https://textile-j.dev.java.net/source/browse/*checkout*/textile-j/trunk/java/org.eclipse.mylyn.wikitext.ui.doc/help/Textile-J%20User%20Guide.textile\">original Textile markup for this document</a>"));
+ }
+
+ public void testHtmlLiteralLoneCloseTag() throws IOException {
+ String html = parser.parseToHtml("bold text with only a terminating</b> tag");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("terminating</b> tag"));
+ }
+
+ public void testHtmlLiteralTerminatingTagWithLegalWhitespace() throws IOException {
+ String html = parser.parseToHtml("<b>bold text</b >");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<b>bold text</b >"));
+ }
+
+ public void testHtmlLiteralFalsePositive() throws IOException {
+ String html = parser.parseToHtml("a <br br tag that is not real");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("a <br br tag"));
+ }
+
+ public void testHtmlLiteralFalsePositive2() throws IOException {
+ String html = parser.parseToHtml("some no tag <!-- nt");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<!--"));
+ }
+
+ public void testHtmlLiteralFalsePositive3() throws IOException {
+ String html = parser.parseToHtml("some no tag <0nt");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<0nt"));
+ }
+
+ public void testHtmlLiteralFalsePositive4() throws IOException {
+ String html = parser.parseToHtml("some no tag <_nt");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<_nt"));
+ }
+
+ public void testEscaping() throws IOException {
+ String html = parser.parseToHtml("==no <b>textile</b> *none* _at_ all==");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("no <b>textile</b> *none* _at_ all"));
+ }
+
+ public void testEscaping2() throws IOException {
+ String html = parser.parseToHtml("==*none*==");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>*none*</p>"));
+ }
+
+ public void testEscaping3() throws IOException {
+ String html = parser.parseToHtml("Link 1 ==<a href=\"x\">x</a>==\nand line 2 ==<a href=\"y\">y</a>==");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>Link 1 <a href=\"x\">x</a><br/>"));
+ assertTrue(html.contains("and line 2 <a href=\"y\">y</a></p>"));
+ }
+
+ public void testEscaping4() throws IOException {
+ String html = parser.parseToHtml("=={toc}== Generates a table of contents. Eg: =={toc}== or =={toc:style=disc|maxLevel=3}==");
+
+ System.out.println(html);
+
+ assertTrue(html.contains("<body><p>{toc} Generates a table of contents. Eg: {toc} or {toc:style=disc|maxLevel=3}</p></body>"));
+ }
+
+ public void testReplacements() throws IOException {
+ String html = parser.parseToHtml("some text with copyright(c), trademark(tm) and registered(r)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(".*?<p>some text with copyright©, trademark™ and registered®</p>.*",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).matches());
+ }
+
+ public void testApostrophe() throws IOException {
+ String html = parser.parseToHtml("it's");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("it’s"));
+ }
+
+ public void testQuotations() throws IOException {
+ String html = parser.parseToHtml("some 'thing is' quoted");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("some ‘thing is’ quoted"));
+ }
+
+ public void testDoubleQuotations() throws IOException {
+ String html = parser.parseToHtml("some \"thing is\" quoted");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("some “thing is” quoted"));
+ }
+
+ public void testDoubleQuotationsInTable() throws IOException {
+ String html = parser.parseToHtml("| \"thing is\" |");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("“thing is”"));
+ }
+
+ public void testCopyright() throws IOException {
+ String html = parser.parseToHtml("copy(c)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("copy©"));
+ }
+
+ public void testTrademark() throws IOException {
+ String html = parser.parseToHtml("trade(tm)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("trade™"));
+ }
+
+ public void testRegistered() throws IOException {
+ String html = parser.parseToHtml("registered(r)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("registered®"));
+ }
+
+ public void testCopyright2() throws IOException {
+ String html = parser.parseToHtml("Copyright (C)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("Copyright ©"));
+ }
+
+ public void testRegistered2() throws IOException {
+ String html = parser.parseToHtml("Registered (R)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("Registered ®"));
+ }
+
+ public void testTrademark2() throws IOException {
+ String html = parser.parseToHtml("Trademark (TM)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("Trademark ™"));
+ }
+
+ public void testCopyright3() throws IOException {
+ String html = parser.parseToHtml("copy (c)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("copy ©"));
+ }
+
+ public void testTrademark3() throws IOException {
+ String html = parser.parseToHtml("trade (tm)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("trade ™"));
+ }
+
+ public void testRegistered3() throws IOException {
+ String html = parser.parseToHtml("registered (r)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("registered ®"));
+ }
+
+ public void testEmDash() throws IOException {
+ String html = parser.parseToHtml("one -- two");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("one — two"));
+ }
+
+ public void testEnDash() throws IOException {
+ String html = parser.parseToHtml("one - two");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("one – two"));
+ }
+
+ public void testMul() throws IOException {
+ String html = parser.parseToHtml("2 x 4");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("2 × 4"));
+ }
+
+ public void testFalseMul() throws IOException {
+ String html = parser.parseToHtml("a x 4");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("a x 4"));
+ }
+
+ public void testHyperlink() throws IOException {
+ String html = parser.parseToHtml("Here comes a \"hyperlink\":http://www.google.com to something");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.google.com\">hyperlink</a>"));
+ }
+
+ public void testHyperlinkTail() throws IOException {
+ String[] tails = new String[] { ",", ".", ")", ":", ";" };
+ for (String tail : tails) {
+ String html = parser.parseToHtml("Here comes a \"hyperlink\":http://www.google.com" + tail
+ + " to something");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"http://www.google.com\">hyperlink</a>" + tail + " to"));
+ }
+ }
+
+ public void testHyperlinkRelative() throws IOException {
+ String html = parser.parseToHtml("Here comes a \"hyperlink\":foo/bar/baz.jpg to something");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<a href=\"foo/bar/baz.jpg\">hyperlink</a>"));
+ }
+
+ public void testAcronym() throws IOException {
+ String html = parser.parseToHtml("ABC(A Better Comb)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<acronym title=\"A Better Comb\">ABC</acronym>"));
+ }
+
+ public void testAcronym2() throws IOException {
+ String html = parser.parseToHtml("Some preceding text ABC(A Better Comb)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<acronym title=\"A Better Comb\">ABC</acronym>"));
+ }
+
+ public void testAcronym3() throws IOException {
+ String html = parser.parseToHtml("Some preceding text ABCR(A Better Comb)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<acronym title=\"A Better Comb\">ABCR</acronym>"));
+ }
+
+ public void testAcronymNegative() throws IOException {
+ // must have 3 or more upper-case letters for an acronym
+ String html = parser.parseToHtml("Some preceding text AB(A Better Comb)");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>Some preceding text AB(A Better Comb)</p>"));
+ }
+
+ /**
+ * test for bug# 240743
+ */
+ public void testAcronymBug240743() {
+ String markup = "As a very minor improvement to Textile-J(as what I proposed here http://www.cs.ubc.ca/~jingweno/soc/SoC2008.pdf)";
+ String html = parser.parseToHtml(markup);
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>As a very minor improvement to Textile-J(as what I proposed here http://www.cs.ubc.ca/~jingweno/soc/SoC2008.pdf)</p>"));
+ }
+
+ public void testGlossary() throws IOException {
+ String html = parser.parseToHtml("Some preceding text ABC(A Better Comb)\n\n{glossary}");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<acronym title=\"A Better Comb\">ABC</acronym>"));
+ assertTrue(html.contains("<dl><dt>ABC</dt><dd>A Better Comb</dd></dl>"));
+ }
+
+ public void testGlossaryWithStyle() throws IOException {
+ String html = parser.parseToHtml("Some preceding text ABC(A Better Comb)\n\n{glossary:style=bullet}");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<acronym title=\"A Better Comb\">ABC</acronym>"));
+ assertTrue(html.contains("<dl style=\"list-style: bullet\"><dt>ABC</dt><dd>A Better Comb</dd></dl>"));
+ }
+
+ public void testTableOfContents() throws IOException {
+ String html = parser.parseToHtml("h1. Table Of Contents\n\n{toc}\n\nh1. Top Header\n\nsome text\n\nh2. Subhead\n\nh2. Subhead2\n\nh1. Top Header 2\n\nh2. Subhead 3\n\nh3. Subhead 4");
+
+ System.out.println("HTML: \n" + html);
+
+ assertTrue(html.contains("<a href=\"#Subhead2\">"));
+ assertTrue(html.contains("<h2 id=\"Subhead2\">"));
+ assertTrue(html.contains("href=\"#Subhead4\""));
+ assertTrue(html.contains("<h3 id=\"Subhead4\">"));
+ }
+
+ public void testTableOfContentsWithMaxLevel() throws IOException {
+ String html = parser.parseToHtml("h1. Table Of Contents\n\n{toc:maxLevel=2}\n\nh1. Top Header\n\nsome text\n\nh2. Subhead\n\nh2. Subhead2\n\nh1. Top Header 2\n\nh2. Subhead 3\n\nh3. Subhead 4");
+
+ System.out.println("HTML: \n" + html);
+
+ assertTrue(html.contains("<a href=\"#Subhead2\">"));
+ assertTrue(html.contains("<h2 id=\"Subhead2\">"));
+ assertFalse(html.contains("href=\"#Subhead4\""));
+ assertTrue(html.contains("<h3 id=\"Subhead4\">"));
+ }
+
+ public void testExtendedBlockQuote() {
+ String html = parser.parseToHtml("bq.. one\ntwo\n\nthree\np. some para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<blockquote><p>one<br/>\\s*two</p>\\s*<p>three</p></blockquote><p>some para</p>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testExtendedBlockCode() {
+ String html = parser.parseToHtml("bc.. one\ntwo\n\nthree\n\n\nblah");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(
+ "<pre><code>one" + REGEX_NEWLINE + "two" + REGEX_NEWLINE + REGEX_NEWLINE + "three" + REGEX_NEWLINE
+ + REGEX_NEWLINE + REGEX_NEWLINE + "blah" + REGEX_NEWLINE + "</code></pre>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testExtendedBlockCode2() {
+ String html = parser.parseToHtml("bc.. \none\ntwo\n\nthree\n\n\nmore\n\np. some para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(
+ "<pre><code>" + REGEX_NEWLINE + "one" + REGEX_NEWLINE + "two" + REGEX_NEWLINE + REGEX_NEWLINE + "three"
+ + REGEX_NEWLINE + REGEX_NEWLINE + REGEX_NEWLINE + "more" + REGEX_NEWLINE
+ + "</code></pre><p>some para</p>", Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testExtendedPre() {
+ String html = parser.parseToHtml("pre.. one\ntwo\n\nthree\n\n\nblah\np. para");
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile(
+ "<pre>one" + REGEX_NEWLINE + "two" + REGEX_NEWLINE + REGEX_NEWLINE + "three" + REGEX_NEWLINE
+ + REGEX_NEWLINE + REGEX_NEWLINE + "blah" + REGEX_NEWLINE + "</pre><p>para</p>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testParagraphWithLeadingSpace() {
+ String markup = " <div>\n\n" + "some text\n\n" + " </div>";
+ String html = parser.parseToHtml(markup);
+ System.out.println("MARKUP: \n" + markup);
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><div><p>some text</p></div></body>"));
+ }
+
+ public void testParagraphWithLeadingSpace2() {
+ String markup = " para text\n" + "para line 2\n" + "\n" + "new para";
+ String html = parser.parseToHtml(markup);
+ System.out.println("MARKUP: \n" + markup);
+ System.out.println("HTML: \n" + html);
+ assertTrue(Pattern.compile("<body>para text\\s+para line 2<p>new para</p></body>",
+ Pattern.MULTILINE | Pattern.DOTALL).matcher(html).find());
+ }
+
+ public void testParagraphsWithLineThatHasWhitespaceInDelimitingLine() {
+ // see issue 44
+ String html = parser.parseToHtml("first\n \nsecond");
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><p>first</p><p>second</p></body>"));
+ }
+
+ public void testBug50XHTMLCompliance() throws Exception {
+ StringWriter writer = new StringWriter();
+
+ MarkupParser parser = new MarkupParser(new TextileLanguage());
+ final HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer);
+ builder.setXhtmlStrict(true);
+ builder.setEmitDtd(true);
+ builder.setHtmlDtd("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
+ parser.setBuilder(builder);
+ parser.parse("!<image.png!:http://foo.bar");
+
+ String html = writer.toString();
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://foo.bar\"><img style=\"border-width: 0px;text-align: left;\" alt=\"\" src=\"image.png\"/></a>"));
+ }
+
+ public void testBug50NoXHTMLCompliance() throws Exception {
+ StringWriter writer = new StringWriter();
+
+ MarkupParser parser = new MarkupParser(new TextileLanguage());
+ final HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer);
+ builder.setXhtmlStrict(false);
+ builder.setEmitDtd(false);
+ parser.setBuilder(builder);
+ parser.parse("!<image.png!:http://foo.bar");
+
+ String html = writer.toString();
+ System.out.println(html);
+
+ assertTrue(html.contains("<a href=\"http://foo.bar\"><img align=\"left\" border=\"0\" src=\"image.png\"/></a>"));
+ }
+
+ public void testNamedLinks() {
+ String markup = "I am crazy about \"TextileJ\":textilej\n" + "and \"it's\":textilej \"all\":textilej I ever\n"
+ + "\"link to\":textilej!\n\n" + "[textilej]https://textile-j.dev.java.net";
+ String html = parser.parseToHtml(markup);
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<p>I am crazy about <a href=\"https://textile-j.dev.java.net\">TextileJ</a><br/>and <a href=\"https://textile-j.dev.java.net\">it's</a> <a href=\"https://textile-j.dev.java.net\">all</a> I ever<br/><a href=\"https://textile-j.dev.java.net\">link to</a>!</p><p>[textilej]https://textile-j.dev.java.net</p>"));
+ }
+
+ public void testXmlEscaping() {
+ String html = parser.parseToHtml("some <start>mark</start> up");
+ System.out.println(html);
+ assertTrue(html.contains("<p>some <start>mark</start> up</p>"));
+ }
+
+ public void testHtmlEscaping() {
+ String html = parser.parseToHtml("some <span class=\"s\">mark</span> up");
+ System.out.println(html);
+ assertTrue(html.contains("<p>some <span class=\"s\">mark</span> up</p>"));
+ }
+
+ public void testFootnoteReferenceLexicalPosition() {
+ RecordingDocumentBuilder builder = new RecordingDocumentBuilder();
+ parser.setBuilder(builder);
+ parser.parse("a footnote reference[1] more text");
+ List<Event> events = builder.getEvents();
+ for (Event event : events) {
+ if (event.spanType == SpanType.SUPERSCRIPT) {
+ assertEquals(20, event.locator.getLineCharacterOffset());
+ assertEquals(23, event.locator.getLineSegmentEndOffset());
+ return;
+ }
+ }
+ fail("expected to find superscript span");
+ }
+
+ public void testBoldItalicsBold() {
+ String html = parser.parseToHtml("*bold _ital ics_ bold*");
+ System.out.println(html);
+ assertTrue(html.contains("<strong>bold <em>ital ics</em> bold</strong>"));
+ }
+
+ public void testItalicsBold() {
+ String html = parser.parseToHtml("_italics **bol d** italics_");
+ System.out.println(html);
+ assertTrue(html.contains("<em>italics <b>bol d</b> italics</em>"));
+ }
+
+ public void testBoldItalics() {
+ String html = parser.parseToHtml("*_bold and italic_ not just bold*");
+ System.out.println(html);
+ assertTrue(html.contains("<strong><em>bold and italic</em> not just bold</strong>"));
+ }
+
+ public void testNestedPhraseModifiersLexicalPosition() {
+ RecordingDocumentBuilder builder = new RecordingDocumentBuilder();
+ parser.setBuilder(builder);
+ parser.parse("a _sample *bold -sdf-*_");
+ List<Event> events = builder.getEvents();
+ int found = 0;
+ for (Event event : events) {
+ System.out.println(event);
+ if (event.spanType == SpanType.EMPHASIS) {
+ ++found;
+ assertEquals(2, event.locator.getLineCharacterOffset());
+ assertEquals(23, event.locator.getLineSegmentEndOffset());
+ } else if (event.spanType == SpanType.STRONG) {
+ ++found;
+ assertEquals(10, event.locator.getLineCharacterOffset());
+ assertEquals(22, event.locator.getLineSegmentEndOffset());
+ } else if (event.spanType == SpanType.DELETED) {
+ ++found;
+ assertEquals(16, event.locator.getLineCharacterOffset());
+ assertEquals(21, event.locator.getLineSegmentEndOffset());
+ }
+ }
+ assertEquals(3, found);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/resources/subversive-bug-report.txt b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/resources/subversive-bug-report.txt
new file mode 100644
index 0000000..3c71352
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/textile/core/resources/subversive-bug-report.txt
@@ -0,0 +1,57 @@
+Version: 0.7.3.I20080814-1500
+
+SVN Client: org.eclipse.team.svn.connector.svnkit15 2.0.4.I20081001-1900 SVN/1.5.2 SVNKit/1.2.0 (http://svnkit.com/) r4949
+
+JVM Properties:
+{java.vendor=Sun Microsystems Inc., osgi.bundles.defaultStartLevel=4, org.osgi.supports.framework.extension=true, sun.management.compiler=HotSpot Client Compiler, osgi.framework.beginningstartlevel=1, eclipse.p2.profile=PlatformProfile, os.name=Linux, osgi.ws=gtk, sun.desktop=gnome, java.vm.specification.vendor=Sun Microsystems Inc., java.runtime.version=1.6.0-b09, org.apache.commons.logging.simplelog.log.httpclient.wire.header=off, osgi.instance.area=file:/var/www/html/workspace/, user.name=reinhard, eclipse.launcher=/home/reinhard/eclipse/eclipse, org.osgi.framework.language=de, user.language=de, org.osgi.framework.processor=x86, osgi.syspath=/home/reinhard/eclipse/plugins, sun.boot.library.path=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/i386, osgi.manifest.cache=/home/reinhard/eclipse/configuration/org.eclipse.osgi/manifests, osgi.compatibility.bootdelegation=true, java.version=1.6.0, org.osgi.framework.os.name=Linux, user.timezone=Europe/Berlin, sun.arch.data.model=32, user.zoneinfo.dir=/usr/share/javazi, java.endorsed.dirs=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/endorsed, sun.net.client.defaultConnectTimeout=30000, sun.cpu.isalist=, sun.jnu.encoding=UTF-8, file.encoding.pkg=sun.io, org.osgi.framework.vendor=Eclipse, file.separator=/, java.specification.name=Java Platform API Specification, java.class.version=50.0, user.country=DE, org.eclipse.equinox.launcher.splash.location=/home/reinhard/eclipse//plugins/org.eclipse.platform_3.3.101.v200809111700/splash.bmp, java.home=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre, osgi.os=linux, eclipse.commands=-os linux -ws gtk -arch x86 -showsplash /home/reinhard/eclipse//plugins/org.eclipse.platform_3.3.101.v200809111700/splash.bmp -launcher /home/reinhard/eclipse/eclipse -name Eclipse --launcher.library /home/reinhard/eclipse/plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.0.101.R34x_v20080805/eclipse_1115.so -startup /home/reinhard/eclipse/plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20080819.jar -framework plugins/org.eclipse.osgi_3.4.2.R34x_v20080826-1230.jar -vm /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/bin/../lib/i386/client/libjvm.so , java.vm.info=mixed mode, osgi.splashLocation=/home/reinhard/eclipse//plugins/org.eclipse.platform_3.3.101.v200809111700/splash.bmp, os.version=2.6.27.12-78.2.8.fc9.i686, osgi.arch=x86, path.separator=:, java.vm.version=1.6.0-b09, org.osgi.supports.framework.fragment=true, osgi.framework.shape=jar, osgi.instance.area.default=file:/home/reinhard/workspace/, java.awt.printerjob=sun.print.PSPrinterJob, sun.io.unicode.encoding=UnicodeLittle, org.osgi.framework.version=1.4.0, osgi.install.area=file:/home/reinhard/eclipse/, osgi.framework=file:/home/reinhard/eclipse/plugins/org.eclipse.osgi_3.4.2.R34x_v20080826-1230.jar, user.home=/home/reinhard, org.eclipse.equinox.simpleconfigurator.configUrl=file:org.eclipse.equinox.simpleconfigurator/bundles.info, osgi.bundlestore=/home/reinhard/eclipse/configuration/org.eclipse.osgi/bundles, osgi.splashPath=platform:/base/plugins/org.eclipse.platform, osgi.nl=de_DE, java.specification.vendor=Sun Microsystems Inc., java.library.path=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/i386/client:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/i386:/usr/lib/xulrunner-1.9:/usr/lib/xulrunner-1.9:/usr/java/packages/lib/i386:/lib:/usr/lib, java.vendor.url=http://java.sun.com/, org.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9, org.osgi.framework.os.version=2.6.27.12-78, eclipse.startTime=1233851935996, eclipse.p2.data.area=@config.dir/../p2, java.vm.vendor=Sun Microsystems Inc., java.runtime.name=OpenJDK Runtime Environment, java.class.path=/home/reinhard/eclipse/plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20080819.jar, osgi.requiredJavaVersion=1.5, org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient=off, org.eclipse.update.reconcile=false, eclipse.vm=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/bin/../lib/i386/client/libjvm.so, java.vm.specification.name=Java Virtual Machine Specification, java.vm.specification.version=1.0, sun.cpu.endian=little, sun.os.patch.level=unknown, org.apache.commons.logging.simplelog.defaultlog=off, java.io.tmpdir=/tmp, java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi, eclipse.product=org.eclipse.platform.ide, jna.platform.library.path=/usr/lib:/lib, eclipse.home.location=file:/home/reinhard/eclipse/, os.arch=i386, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.ext.dirs=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre/lib/ext:/usr/java/packages/lib/ext, user.dir=/home/reinhard, org.osgi.supports.framework.requirebundle=true, line.separator= , java.vm.name=OpenJDK Client VM, org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog, eclipse.ee.install.verify=false, org.eclipse.swt.browser.XULRunnerInitialized=true, file.encoding=UTF-8, osgi.framework.version=3.4.2.R34x_v20080826-1230, sun.net.client.defaultReadTimeout=30000, eclipse.buildId=M20080911-1700, eclipse.vmargs=-Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx256m -XX:MaxPermSize=256m -Djava.class.path=/home/reinhard/eclipse/plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20080819.jar , java.specification.version=1.6, org.osgi.framework.executionenvironment=OSGi/Minimum-1.0,OSGi/Minimum-1.1,JRE-1.1,J2SE-1.2,J2SE-1.3,J2SE-1.4,J2SE-1.5,JavaSE-1.6, osgi.logfile=/var/www/html/workspace/.metadata/.log, osgi.configuration.area=file:/home/reinhard/eclipse/configuration/}
+
+java.lang.NullPointerException
+java.lang.NullPointerException
+ at org.tmatesoft.svn.core.internal.io.svn.SVNSSHSession$SSHConnectionInfo.isSessionPingSupported(SVNSSHSession.java:410)
+ at org.tmatesoft.svn.core.internal.io.svn.SVNSSHConnector.isStale(SVNSSHConnector.java:217)
+ at org.tmatesoft.svn.core.internal.io.svn.SVNConnection.isConnectionStale(SVNConnection.java:328)
+ at org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryImpl.openConnection(SVNRepositoryImpl.java:1218)
+ at org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryImpl.setLocation(SVNRepositoryImpl.java:120)
+ at org.tmatesoft.svn.core.wc.DefaultSVNRepositoryPool.createRepository(DefaultSVNRepositoryPool.java:217)
+ at org.tmatesoft.svn.core.wc.SVNClientManager.createRepository(SVNClientManager.java:251)
+ at org.tmatesoft.svn.core.wc.SVNBasicClient.createRepository(SVNBasicClient.java:335)
+ at org.tmatesoft.svn.core.wc.SVNBasicClient.createRepository(SVNBasicClient.java:327)
+ at org.tmatesoft.svn.core.wc.SVNBasicClient.getLocations(SVNBasicClient.java:838)
+ at org.tmatesoft.svn.core.wc.SVNBasicClient.createRepository(SVNBasicClient.java:531)
+ at org.tmatesoft.svn.core.wc.SVNLogClient.doList(SVNLogClient.java:983)
+ at org.tmatesoft.svn.core.javahl.SVNClientImpl.list(SVNClientImpl.java:350)
+ at org.tmatesoft.svn.core.javahl.SVNClientImpl.list(SVNClientImpl.java:337)
+ at org.polarion.team.svn.connector.svnkit.SVNKitConnector.list(SVNKitConnector.java:1211)
+ at org.eclipse.team.svn.core.extension.factory.ThreadNameModifier.list(ThreadNameModifier.java:276)
+ at org.eclipse.team.svn.core.utility.SVNUtility.list(SVNUtility.java:365)
+ at org.eclipse.team.svn.core.svnstorage.SVNRepositoryFile.getRevisionImpl(SVNRepositoryFile.java:39)
+ at org.eclipse.team.svn.core.svnstorage.SVNRepositoryResource.getRevision(SVNRepositoryResource.java:97)
+ at org.eclipse.team.svn.core.svnstorage.SVNRepositoryResource.exists(SVNRepositoryResource.java:108)
+ at org.eclipse.team.svn.core.operation.remote.LocateResourceURLInHistoryOperation.processEntry(LocateResourceURLInHistoryOperation.java:79)
+ at org.eclipse.team.svn.core.operation.remote.LocateResourceURLInHistoryOperation$1.run(LocateResourceURLInHistoryOperation.java:61)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doSubTask(ProgressMonitorUtility.java:117)
+ at org.eclipse.team.svn.core.operation.AbstractActionOperation.protectStep(AbstractActionOperation.java:145)
+ at org.eclipse.team.svn.core.operation.AbstractActionOperation.protectStep(AbstractActionOperation.java:140)
+ at org.eclipse.team.svn.core.operation.remote.LocateResourceURLInHistoryOperation.runImpl(LocateResourceURLInHistoryOperation.java:59)
+ at org.eclipse.team.svn.core.operation.AbstractActionOperation.run(AbstractActionOperation.java:76)
+ at org.eclipse.team.svn.core.operation.LoggedOperation.run(LoggedOperation.java:37)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doTask(ProgressMonitorUtility.java:103)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doTaskExternal(ProgressMonitorUtility.java:89)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doTaskExternal(ProgressMonitorUtility.java:80)
+ at org.eclipse.team.svn.ui.operation.CompareResourcesOperation$2.run(CompareResourcesOperation.java:116)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doSubTask(ProgressMonitorUtility.java:117)
+ at org.eclipse.team.svn.core.operation.AbstractActionOperation.protectStep(AbstractActionOperation.java:145)
+ at org.eclipse.team.svn.ui.operation.CompareResourcesOperation.runImpl(CompareResourcesOperation.java:113)
+ at org.eclipse.team.svn.core.operation.AbstractActionOperation.run(AbstractActionOperation.java:76)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doTask(ProgressMonitorUtility.java:103)
+ at org.eclipse.team.svn.core.operation.CompositeOperation.runImpl(CompositeOperation.java:94)
+ at org.eclipse.team.svn.core.operation.AbstractActionOperation.run(AbstractActionOperation.java:76)
+ at org.eclipse.team.svn.core.operation.LoggedOperation.run(LoggedOperation.java:37)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doTask(ProgressMonitorUtility.java:103)
+ at org.eclipse.team.svn.core.utility.ProgressMonitorUtility.doTaskExternal(ProgressMonitorUtility.java:89)
+ at org.eclipse.team.svn.ui.utility.DefaultCancellableOperationWrapper.run(DefaultCancellableOperationWrapper.java:55)
+ at org.eclipse.team.svn.ui.utility.SVNTeamOperationWrapper.run(SVNTeamOperationWrapper.java:35)
+ at org.eclipse.team.internal.ui.actions.JobRunnableContext.run(JobRunnableContext.java:144)
+ at org.eclipse.team.internal.ui.actions.JobRunnableContext$ResourceJob.runInWorkspace(JobRunnableContext.java:72)
+ at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38)
+ at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/Main.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/Main.java
new file mode 100644
index 0000000..9a51a1d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/Main.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.tracwiki.core;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.tests.AbstractTestApplication;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Main extends AbstractTestApplication {
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args) {
+ try {
+ Main main = new Main();
+ main.doMain();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new TracWikiLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/TracWikiLanguageTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/TracWikiLanguageTest.java
new file mode 100644
index 0000000..8955241
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/TracWikiLanguageTest.java
@@ -0,0 +1,556 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ * Holger Voormann - tests for bug 279029
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.tracwiki.core;
+
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+
+/**
+ * @author David Green
+ */
+public class TracWikiLanguageTest extends TestCase {
+
+ private MarkupParser parser;
+
+ private TracWikiLanguage markupLanaguage;
+
+ @Override
+ public void setUp() {
+ markupLanaguage = new TracWikiLanguage();
+ parser = new MarkupParser(markupLanaguage);
+ }
+
+ public void testIsDetectingRawHyperlinks() {
+ assertTrue(parser.getMarkupLanguage().isDetectingRawHyperlinks());
+ }
+
+ public void testParagraphs() throws IOException {
+ String html = parser.parseToHtml("first para\nnew line\n\nsecond para\n\n\n\n");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>first para\\s*new line</p><p>second para</p></body>", Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testBoldItalic() {
+ String html = parser.parseToHtml("normal '''''bold italic text''''' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <b><i>bold italic text</i></b> normal</p></body>")
+ .matcher(html)
+ .find());
+ }
+
+ public void testBold() {
+ String html = parser.parseToHtml("normal '''bold text''' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <b>bold text</b> normal</p></body>").matcher(html).find());
+ }
+
+ public void testBoldEscaped() {
+ String html = parser.parseToHtml("normal '''!'''bold text''' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <b>'''bold text</b> normal</p></body>").matcher(html).find());
+ }
+
+ public void testItalic() {
+ String html = parser.parseToHtml("normal ''italic text'' normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <i>italic text</i> normal</p></body>").matcher(html).find());
+ }
+
+ // test for bug 263015
+ public void testItalic2() {
+ String html = parser.parseToHtml("normal ''italic''-''italic'' normal");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>normal <i>italic</i>-<i>italic</i> normal</p></body>"));
+ }
+
+ public void testDeleted() {
+ String html = parser.parseToHtml("normal --test text-- normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <del>test text</del> normal</p></body>").matcher(html).find());
+ }
+
+ public void testDeleted2() {
+ String html = parser.parseToHtml("normal ---test text-- normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal ---test text-- normal</p></body>").matcher(html).find());
+ }
+
+ public void testDeleted3() {
+ String html = parser.parseToHtml("normal --test text--- normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal --test text--- normal</p></body>").matcher(html).find());
+ }
+
+ public void testDeleted_AtStartOfLine() {
+ String html = parser.parseToHtml("--test text-- normal");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><del>test text</del> normal</p></body>"));
+ }
+
+ public void testDeleted_AtEndOfLine() {
+ String html = parser.parseToHtml("normal --test text--");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>normal <del>test text</del></p></body>"));
+ }
+
+ public void testUnderlined() {
+ String html = parser.parseToHtml("normal __test text__ normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <u>test text</u> normal</p></body>").matcher(html).find());
+ }
+
+ public void testSuperscript() {
+ String html = parser.parseToHtml("normal ^test text^ normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <sup>test text</sup> normal</p></body>").matcher(html).find());
+ }
+
+ public void testSubscript() {
+ String html = parser.parseToHtml("normal ,,test text,, normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <sub>test text</sub> normal</p></body>").matcher(html).find());
+ }
+
+ public void testEscapedWithBacktick() {
+ String html = parser.parseToHtml("normal `test text` normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <tt>test text</tt> normal</p></body>").matcher(html).find());
+ }
+
+ public void testEscapedWithCurlys() {
+ String html = parser.parseToHtml("normal {{test text}} normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal <tt>test text</tt> normal</p></body>").matcher(html).find());
+ }
+
+ public void testHeadings() {
+ for (int x = 1; x <= 6; ++x) {
+ String delimiter = repeat(x, "=");
+ String html = parser.parseToHtml(delimiter + "heading text" + delimiter
+ + "\nfirst para\nfirst para line2\n\nsecond para\n\nthird para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"headingtext\">heading text</h" + x
+ + "><p>first para\\s*first para line2</p><p>second para</p><p>third para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+
+ html = parser.parseToHtml(delimiter + "heading text" + delimiter + " #with-id-" + x
+ + "\nfirst para\nfirst para line2\n\nsecond para\n\nthird para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"with-id-" + x + "\">heading text</h" + x
+ + "><p>first para\\s*first para line2</p><p>second para</p><p>third para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+
+ html = parser.parseToHtml(delimiter + "heading text" + delimiter + " \n"
+ + "first para\nfirst para line2\n\nsecond para\n\nthird para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><h" + x + " id=\"headingtext\">heading text</h" + x
+ + "><p>first para\\s*first para line2</p><p>second para</p><p>third para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+ }
+
+ public void testHeadingBreakingPara() {
+ String html = parser.parseToHtml("=\n== heading ==\npara");
+ System.out.print(html);
+ assertTrue(html.contains("<body><p>=</p><h2 id=\"heading\">heading</h2><p>para</p></body>"));
+ }
+
+ private String repeat(int i, String string) {
+ StringBuilder buf = new StringBuilder(string.length() * i);
+ for (int x = 0; x < i; ++x) {
+ buf.append(string);
+ }
+ return buf.toString();
+ }
+
+ public void testLineBreak() {
+ String html = parser.parseToHtml("normal text[[BR]]normal");
+ System.out.println(html);
+ assertTrue(Pattern.compile("<body><p>normal text<br/>\\s*normal</p></body>").matcher(html).find());
+ }
+
+ public void testListUnordered() throws IOException {
+ String html = parser.parseToHtml(" * a list\n * with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><ul><li>a list</li><li>with two lines</li></ul></body>"));
+ }
+
+ public void testListUnorderedWithHyphens() throws IOException {
+ String html = parser.parseToHtml(" - a list\n - with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><ul><li>a list</li><li>with two lines</li></ul></body>"));
+ }
+
+ public void testListOrdered() throws IOException {
+ String html = parser.parseToHtml(" 1. a list\n 2. with two lines");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list</li>"));
+ assertTrue(html.contains("<li>with two lines</li>"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListOrderedStartAt2() throws IOException {
+ String html = parser.parseToHtml(" 2. with two lines\n 3. three");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><ol start=\"2\"><li>with two lines</li><li>three</li></ol></body>"));
+ }
+
+ public void testListOrderedBug265015() throws IOException {
+ String html = parser.parseToHtml(" 1. first\n\n 2. second");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<body><ol><li>first</li></ol><ol start=\"2\"><li>second</li></ol></body>"));
+ }
+
+ public void testListNested() throws IOException {
+ String html = parser.parseToHtml(" 1. a list\n 1. nested\n 1. nested2\n 1. level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol>"));
+ assertTrue(html.contains("<li>a list"));
+ assertTrue(html.contains("<li>nested"));
+ assertTrue(html.contains("</ol>"));
+ }
+
+ public void testListNestedMixed() throws IOException {
+ String html = parser.parseToHtml(" 1. a list\n * nested\n * nested2\n 1. level1\n\npara");
+
+ System.out.println("HTML: \n" + html);
+ assertTrue(html.contains("<ol><li>a list<ul><li>nested</li><li>nested2</li></ul></li><li>level1</li></ol>"));
+ }
+
+ public void testListNumericWithBulleted() {
+ String html = parser.parseToHtml(" 1. one\n * two");
+ System.out.println(html);
+ assertTrue(html.contains("<body><ol><li>one</li></ol><ul><li>two</li></ul></body>"));
+ }
+
+ public void testPreformatted() throws IOException {
+ String html = parser.parseToHtml("first para\n\n{{{\n\tpreformatted text\n\nspanning multilple lines\n}}}\nsecond para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>first para</p><pre>\\s*?\tpreformatted text\\s*spanning multilple lines\\s*</pre><p>second para</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testPreformattedNextToPara() throws IOException {
+ String html = parser.parseToHtml("first para\n{{{\n\tpreformatted text\n\nspanning multilple lines\n}}}\nsecond para");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>first para</p><pre>\\s*?\tpreformatted text\\s*spanning multilple lines\\s*</pre><p>second para</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testPreformattedInline() throws IOException {
+ String html = parser.parseToHtml("first para {{{ preformatted text }}} more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>first para <tt> preformatted text </tt> more text</p></body>"));
+ }
+
+ public void testPreformattedInline2() throws IOException {
+ String html = parser.parseToHtml("first para {{{ preformatted text }}} and {{{ more code }}} more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>first para <tt> preformatted text </tt> and <tt> more code </tt> more text</p></body>"));
+ }
+
+ public void testPreformattedInline3() throws IOException {
+ String html = parser.parseToHtml("{{{ preformatted text }}}");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><tt> preformatted text </tt></p></body>"));
+ }
+
+ public void testQuoteBlock() throws IOException {
+ String html = parser.parseToHtml("" + ">> second level\n" + ">> second level line 2\n" + "> first level\n"
+ + "new para\n" + "");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><blockquote><blockquote><p>second level<br/>\\s*second level line 2</p></blockquote><p>first level</p></blockquote><p>new para</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testQuoteBlockFollowingPara() throws IOException {
+ String html = parser.parseToHtml("" + "normal para\n" + "> quoted\n" + "new para\n" + "");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>normal para</p><blockquote><p>quoted</p></blockquote><p>new para</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testQuoteBlockWithSpaces() throws IOException {
+ String html = parser.parseToHtml("" + "normal para\n" + " quoted\n" + " first level\n" + "new para\n" + "");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>normal para</p><blockquote><p>quoted<br/>\\s*first level</p></blockquote><p>new para</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testTableBlock() {
+ String html = parser.parseToHtml("" + "normal para\n" + "||a table||row with three||columns||\n"
+ + "||another||row||||\n" + "new para\n" + "");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body>" + "<p>normal para</p>" + "<table>" + "<tr>" + "<td>a table</td>" + "<td>row with three</td>"
+ + "<td>columns</td>" + "</tr>" + "<tr>" + "<td>another</td>" + "<td>row</td>" + "<td></td>"
+ + "</tr>" + "</table>" + "<p>new para</p></body>", Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testHyperlink() {
+ String html = parser.parseToHtml("a normal para http://www.example.com with a hyperlink");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>a normal para <a href=\"http://www.example.com\">http://www.example.com</a> with a hyperlink</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testHyperlinkWithTitle() {
+ String html = parser.parseToHtml("a normal para [http://www.example.com Example ] with a hyperlink");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>a normal para <a href=\"http://www.example.com\">Example</a> with a hyperlink</p></body>",
+ Pattern.MULTILINE).matcher(html).find());
+ }
+
+ public void testHyperlinkWithoutTitle() {
+ String html = parser.parseToHtml("a normal para [http://www.example.com] with a hyperlink");
+ System.out.println(html);
+ assertTrue(Pattern.compile(
+ "<body><p>a normal para <a href=\"http://www.example.com\">http://www.example.com</a> with a hyperlink</p></body>",
+ Pattern.MULTILINE)
+ .matcher(html)
+ .find());
+ }
+
+ public void testInternalHyperlinkWithTitle() {
+ String html = parser.parseToHtml("a normal para [wiki:ISO9000 ISO 9000] with a hyperlink");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a normal para <a href=\"ISO9000\">ISO 9000</a> with a hyperlink</p></body>"));
+ }
+
+ public void testInternalHyperlinkWithoutTitle() {
+ String html = parser.parseToHtml("a normal para [wiki:ISO9000] with a hyperlink");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a normal para <a href=\"ISO9000\">ISO9000</a> with a hyperlink</p></body>"));
+ }
+
+ public void testWikiWord() {
+ markupLanaguage.setInternalLinkPattern("https://foo.bar/wiki/{0}");
+ String html = parser.parseToHtml("A WikiWord points somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A <a href=\"https://foo.bar/wiki/WikiWord\">WikiWord</a> points somewhere</p></body>"));
+ }
+
+ public void testWikiWordDisabled() {
+ MarkupLanguageConfiguration configuration = new MarkupLanguageConfiguration();
+ configuration.setWikiWordLinking(false);
+ markupLanaguage.configure(configuration);
+ markupLanaguage.setInternalLinkPattern("https://foo.bar/wiki/{0}");
+ String html = parser.parseToHtml("A WikiWord points somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A WikiWord points somewhere</p></body>"));
+ }
+
+ public void testWikiWordNegativeMatch() {
+ testWikiWordNegativeMatch("A noWikiWord points somewhere");
+ testWikiWordNegativeMatch("A noAWikiWord points somewhere");
+ testWikiWordNegativeMatch("A aBBaB points somewhere");
+ testWikiWordNegativeMatch("A XML HTML or PDF points NOT somewhere");
+ testWikiWordNegativeMatch("not a WikiWOrd");
+ testWikiWordNegativeMatch("not a 1WikiWord");
+ testWikiWordNegativeMatch("1WikiWord WIkiWord O2WikiWord");
+ testWikiWordNegativeMatch("Wiki-Word Wi-kiWord");
+ testWikiWordNegativeMatch("not a WikiWord", "not a !WikiWord");
+ }
+
+ private void testWikiWordNegativeMatch(String toTest) {
+ testWikiWordNegativeMatch(toTest, toTest);
+ }
+
+ private void testWikiWordNegativeMatch(String expected, String toTest) {
+ markupLanaguage.setInternalLinkPattern("https://foo.bar/wiki/{0}");
+ String html = parser.parseToHtml(toTest);
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>" + expected + "</p></body>"));
+ }
+
+ public void testWikiWordAtLineStart() {
+ markupLanaguage.setInternalLinkPattern("https://foo.bar/wiki/{0}");
+ String html = parser.parseToHtml("WikiWord points somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p><a href=\"https://foo.bar/wiki/WikiWord\">WikiWord</a> points somewhere</p></body>"));
+ }
+
+ public void testWikiWordAtLineEnd() {
+ markupLanaguage.setInternalLinkPattern("https://foo.bar/wiki/{0}");
+ String html = parser.parseToHtml("a WikiWord");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>a <a href=\"https://foo.bar/wiki/WikiWord\">WikiWord</a></p></body>"));
+ }
+
+// BBaB is not a WikiWord because of the two sequenced upper-case letters
+// public void testWikiWord2() {
+// markupLanaguage.setInternalLinkPattern("https://foo.bar/wiki/{0}");
+// String html = parser.parseToHtml("a BBaB");
+// System.out.println(html);
+// assertTrue(html.contains("<body><p>a <a href=\"https://foo.bar/wiki/BBaB\">BBaB</a></p></body>"));
+// }
+
+ public void testWikiWordNoAutolink() {
+ markupLanaguage.setAutoLinking(false);
+ String html = parser.parseToHtml("A WikiWord points somewhere but not this one!");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A WikiWord points somewhere but not this one!</p></body>"));
+ }
+
+ public void testWikiWordEscaped() {
+ String html = parser.parseToHtml("A !WikiWord points somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A WikiWord points somewhere</p></body>"));
+ }
+
+ public void testTicketLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A ticket #1 or ticket:1 to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A ticket <a href=\"http://trac.edgewall.org/ticket/1\">#1</a> or <a href=\"http://trac.edgewall.org/ticket/1\">ticket:1</a> to somewhere</p></body>"));
+ }
+
+ public void testTicketLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A ticket a#1 or aticket:1 to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A ticket a#1 or aticket:1 to somewhere</p></body>"));
+ }
+
+ public void testTicketLinkWithComment() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A ticket comment:1:ticket:2 to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A ticket <a href=\"http://trac.edgewall.org/ticket/2#comment:1\">comment:1:ticket:2</a> to somewhere</p></body>"));
+ }
+
+ public void testTicketLinkWithCommentNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A ticket acomment:1:ticket:2 to somewhere");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A ticket acomment:1:<a href=\"http://trac.edgewall.org/ticket/2\">ticket:2</a> to somewhere</p></body>"));
+ }
+
+ public void testReportLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A report:1 about something");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A <a href=\"http://trac.edgewall.org/report/1\">report:1</a> about something</p></body>"));
+ }
+
+ public void testReportLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A areport:1 about something");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A areport:1 about something</p></body>"));
+ }
+
+ public void testChangesetLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A changeset r1 or [1] or [1/trunk] or changeset:1 or changeset:1/trunk more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A changeset <a href=\"http://trac.edgewall.org/changeset/1\">r1</a> or <a href=\"http://trac.edgewall.org/changeset/1\">[1]</a> or <a href=\"http://trac.edgewall.org/changeset/1/trunk\">[1/trunk]</a> or <a href=\"http://trac.edgewall.org/changeset/1\">changeset:1</a> or <a href=\"http://trac.edgewall.org/changeset/1/trunk\">changeset:1/trunk</a> more text</p></body>"));
+ }
+
+ public void testChangesetLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A changeset ar1 or a[1] or a[1/trunk] or achangeset:1 or achangeset:1/trunk more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A changeset ar1 or a[1] or a[1/trunk] or achangeset:1 or achangeset:1/trunk more text</p></body>"));
+ }
+
+ public void testRevisionLogLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A revision log r1:3, [1:3] or log:@1:3, log:trunk at 1:3, [2:5/trunk] more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A revision log <a href=\"http://trac.edgewall.org/log/?revs=1-3\">r1:3</a>, <a href=\"http://trac.edgewall.org/log/?revs=1-3\">[1:3]</a> or <a href=\"http://trac.edgewall.org/log/?revs=1-3\">log:@1:3</a>, <a href=\"http://trac.edgewall.org/log/trunk?revs=1-3\">log:trunk at 1:3</a>, <a href=\"http://trac.edgewall.org/log/trunk?revs=2-5\">[2:5/trunk]</a> more text</p></body>"));
+ }
+
+ public void testRevisionLogLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A revision log ar1:3, a[1:3] or alog:@1:3, alog:trunk at 1:3, a[2:5/trunk] more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A revision log ar1:3, a[1:3] or alog:@1:3, alog:trunk at 1:3, a[2:5/trunk] more text</p></body>"));
+ }
+
+ public void testMilestoneLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A milestone:1.0 more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A <a href=\"http://trac.edgewall.org/milestone/1.0\">milestone:1.0</a> more text</p></body>"));
+ }
+
+ public void testMilestoneLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A amilestone:1.0 more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A amilestone:1.0 more text</p></body>"));
+ }
+
+ public void testTicketAttachmentLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A attachment:foobar.txt:ticket:12345 more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A <a href=\"http://trac.edgewall.org/ticket/12345/foobar.txt\">attachment:foobar.txt:ticket:12345</a> more text</p></body>"));
+ }
+
+ public void testTicketAttachmentLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A Aattachment:foobar.txt:ticket:12345 more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A Aattachment:foobar.txt:<a href=\"http://trac.edgewall.org/ticket/12345\">ticket:12345</a> more text</p></body>"));
+ }
+
+ public void testSourceLink() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A source:/trunk/COPYING or source:/trunk/COPYING at 200 or source:/trunk/COPYING at 200#L26 more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A <a href=\"http://trac.edgewall.org/browser/trunk/COPYING\">source:/trunk/COPYING</a> or <a href=\"http://trac.edgewall.org/browser/trunk/COPYING?rev=200\">source:/trunk/COPYING at 200</a> or <a href=\"http://trac.edgewall.org/browser/trunk/COPYING?rev=200#L26\">source:/trunk/COPYING at 200#L26</a> more text</p></body>"));
+ }
+
+ public void testSourceLinkNegativeMatch() {
+ markupLanaguage.setServerUrl("http://trac.edgewall.org");
+ String html = parser.parseToHtml("A Asource:/trunk/COPYING or Asource:/trunk/COPYING at 200 or Asource:/trunk/COPYING at 200#L26 more text");
+ System.out.println(html);
+ assertTrue(html.contains("<body><p>A Asource:/trunk/COPYING or Asource:/trunk/COPYING at 200 or Asource:/trunk/COPYING at 200#L26 more text</p></body>"));
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/WikiWordReplacementTokenTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/WikiWordReplacementTokenTest.java
new file mode 100644
index 0000000..f6eecaf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/tracwiki/core/WikiWordReplacementTokenTest.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * Holger Voormann - initial API and implementation (tests for bug 279029)
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.tracwiki.core;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.WikiWordReplacementToken;
+
+/**
+ * @author Holger Voormann
+ */
+public class WikiWordReplacementTokenTest extends TestCase {
+
+ private static final String SUFFIX = ". And so on...";
+
+ private static final String PREFIX = "A Wiki-Word: ";
+
+ private Pattern pattern;
+
+ @Override
+ protected void setUp() throws Exception {
+ pattern = new TestWikiWordReplacementToken().createPattern();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ pattern = null;
+ }
+
+ public void testRegex() throws Exception {
+ assertIsWikiWord("WikiWord");
+ assertIsWikiWord("WikiWordExtra");
+
+ assertIsNotWikiWord("Word");
+ assertIsNotWikiWord("XML");
+ assertIsNotWikiWord("HTML");
+ assertIsNotWikiWord("XML-based");
+ assertIsNotWikiWord("time-aligned");
+ assertIsNotWikiWord("X-Ray");
+ assertIsNotWikiWord("XRay");
+ assertIsNotWikiWord("eClass");
+ assertIsNotWikiWord("AbbA");
+ assertIsNotWikiWord("H2O");
+ assertIsNotWikiWord("Not-Wiki-Word");
+ assertIsNotWikiWord("WIkiWord");
+ assertIsNotWikiWord("Wiki-Word");
+ assertIsNotWikiWord("Wi-kiWord");
+ assertIsNotWikiWord("Ww3Word");
+ assertIsNotWikiWord("WikiWWWord");
+
+ assertPartialWikiWord("WikiWordX");
+ assertPartialWikiWord("WikiWordNOT");
+ assertPartialWikiWord("WikiWo-rd");
+ assertPartialWikiWord("1WikiWord");
+ assertPartialWikiWord("WikiWord2");
+ assertPartialWikiWord("O2WikiWord");
+ }
+
+ private void assertIsWikiWord(String wikiWord) {
+ Matcher matcher = pattern.matcher(PREFIX + wikiWord + SUFFIX);
+ assertTrue(matcher.find());
+ assertEquals(PREFIX.length(), matcher.start());
+ assertEquals(PREFIX.length() + wikiWord.length(), matcher.end());
+ }
+
+ private void assertIsNotWikiWord(String wikiWord) {
+ Matcher matcher = pattern.matcher(PREFIX + wikiWord + SUFFIX);
+ assertFalse(matcher.find());
+ }
+
+ private void assertPartialWikiWord(String wikiWord) {
+ Matcher matcher = pattern.matcher(PREFIX + wikiWord + SUFFIX);
+ assertTrue(matcher.find());
+ assertFalse(PREFIX.length() == matcher.start() && PREFIX.length() + wikiWord.length() == matcher.end());
+ }
+
+ private class TestWikiWordReplacementToken extends WikiWordReplacementToken {
+
+ private static final int NOT_USED = -1;
+
+ private Pattern createPattern() {
+ return Pattern.compile(getPattern(NOT_USED));
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/FileTypesTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/FileTypesTest.java
new file mode 100644
index 0000000..a9d523c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/FileTypesTest.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.ui;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.wikitext.core.WikiTextPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
+import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage;
+import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage;
+import org.eclipse.mylyn.wikitext.tests.AbstractTestInWorkspace;
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * A test that runs in the Eclipse UI that verifies that registered file types make sense.
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class FileTypesTest extends AbstractTestInWorkspace {
+
+ private IProject project;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ project = createSimpleProject();
+ }
+
+ public void testTextileFileType() throws CoreException {
+ IFile file = project.getFile("test.textile"); //$NON-NLS-1$
+ file.create(createSimpleTextileContent(), false, new NullProgressMonitor());
+
+ editorAsserts(file, TextileLanguage.class);
+ }
+
+ public void testTextileFileTypeChangeIsSticky() throws CoreException {
+ IFile file = project.getFile("test.textile"); //$NON-NLS-1$
+ file.create(createSimpleTextileContent(), false, new NullProgressMonitor());
+
+ // open the editor
+ IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IEditorPart editor = IDE.openEditor(workbenchPage, file);
+ assertInstanceOf(MarkupEditor.class, editor);
+ MarkupEditor markupEditor = (MarkupEditor) editor;
+ assertInstanceOf(TextileLanguage.class, markupEditor.getMarkupLanguage());
+
+ // set the markup language
+ markupEditor.setMarkupLanguage(WikiTextPlugin.getDefault().getMarkupLanguage("MediaWiki"), true); //$NON-NLS-1$
+ assertInstanceOf(MediaWikiLanguage.class, markupEditor.getMarkupLanguage());
+
+ // close the editor
+ workbenchPage.closeEditor(editor, false);
+
+ // open the editor
+ editor = IDE.openEditor(workbenchPage, file);
+ markupEditor = (MarkupEditor) editor;
+
+ // verify the language setting is the same
+ assertInstanceOf(MediaWikiLanguage.class, markupEditor.getMarkupLanguage());
+ }
+
+ public void testMediaWikiFileType() throws CoreException {
+ IFile file = project.getFile("test.mediawiki"); //$NON-NLS-1$
+ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor());
+
+ editorAsserts(file, MediaWikiLanguage.class);
+ }
+
+ public void testTracWikiFileType() throws CoreException {
+ IFile file = project.getFile("test.tracwiki"); //$NON-NLS-1$
+ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor());
+
+ editorAsserts(file, TracWikiLanguage.class);
+ }
+
+ public void testTWikiFileType() throws CoreException {
+ IFile file = project.getFile("test.twiki"); //$NON-NLS-1$
+ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor());
+
+ editorAsserts(file, TWikiLanguage.class);
+ }
+
+ public void testConfluenceFileType() throws CoreException {
+ IFile file = project.getFile("test.confluence"); //$NON-NLS-1$
+ file.create(createSimpleMediaWikiContent(), false, new NullProgressMonitor());
+
+ editorAsserts(file, ConfluenceLanguage.class);
+ }
+
+ private void editorAsserts(IFile file, Class<?> markupLanguageClass) throws PartInitException {
+ IEditorPart editor = IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), file);
+ assertInstanceOf(MarkupEditor.class, editor);
+ MarkupEditor markupEditor = (MarkupEditor) editor;
+ assertInstanceOf(markupLanguageClass, markupEditor.getMarkupLanguage());
+ }
+
+ private void assertInstanceOf(Class<?> clazz, Object o) {
+ if (o != null && clazz.isAssignableFrom(o.getClass())) {
+ return;
+ }
+ fail("Expected instanceof " + clazz.getName() + " but found " + (o == null ? null : o.getClass().getName()));
+ }
+
+ private InputStream createSimpleTextileContent() {
+ return new ByteArrayInputStream("h1. Heading\n\ncontent\n".getBytes());
+ }
+
+ private InputStream createSimpleMediaWikiContent() {
+ return new ByteArrayInputStream("= Heading =\n\ncontent\n".getBytes());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorHrefAnnotationTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorHrefAnnotationTest.java
new file mode 100644
index 0000000..5185c0b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorHrefAnnotationTest.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class AnchorHrefAnnotationTest extends TestCase {
+
+ public void testSimple() {
+ String href = "http://foo.bar";
+ AnchorHrefAnnotation annotation = new AnchorHrefAnnotation(href);
+ assertEquals(href, annotation.getAnchorHref());
+ assertEquals(AnchorHrefAnnotation.TYPE, annotation.getType());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorNameAnnotationTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorNameAnnotationTest.java
new file mode 100644
index 0000000..8112969
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorNameAnnotationTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class AnchorNameAnnotationTest extends TestCase {
+
+ public void testSimple() {
+ AnchorNameAnnotation annotation = new AnchorNameAnnotation("foo");
+ assertEquals("foo", annotation.getText());
+ assertEquals(AnchorNameAnnotation.TYPE, annotation.getType());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/ClassAnnotationTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/ClassAnnotationTest.java
new file mode 100644
index 0000000..a534889
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/ClassAnnotationTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class ClassAnnotationTest extends TestCase {
+
+ public void testSimple() {
+ ClassAnnotation annotation = new ClassAnnotation("foo");
+ assertEquals("foo", annotation.getCssClass());
+ assertEquals(ClassAnnotation.TYPE, annotation.getType());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/IdAnnotationTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/IdAnnotationTest.java
new file mode 100644
index 0000000..5ae046c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/IdAnnotationTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class IdAnnotationTest extends TestCase {
+
+ public void testSimple() {
+ IdAnnotation annotation = new IdAnnotation("foo");
+ assertEquals("foo", annotation.getText());
+ assertEquals(annotation.getType(), IdAnnotation.TYPE);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/TitleAnnotationTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/TitleAnnotationTest.java
new file mode 100644
index 0000000..783a42e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/wikitext/ui/annotation/TitleAnnotationTest.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.wikitext.tests.HeadRequired;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+ at HeadRequired
+public class TitleAnnotationTest extends TestCase {
+
+ public void testSimple() {
+ TitleAnnotation annotation = new TitleAnnotation("title", "type");
+ assertEquals("title", annotation.getTitle());
+ assertEquals("type", annotation.getTitleType());
+ assertEquals(TitleAnnotation.TYPE, annotation.getType());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/styles/junit-noframes.xsl b/org.eclipse.mylyn.wikitext.tests/styles/junit-noframes.xsl
new file mode 100644
index 0000000..339bc2e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/styles/junit-noframes.xsl
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html"/>
+<!--
+
+This stylesheet is used with junitreport instead of the default since the default stylesheets do a really
+bad job of formatting nested test cases.
+
+ -->
+ <xsl:template match="/">
+ <html>
+ <head>
+ <title>Unit Test Results</title>
+ <style type="text/css">
+body {
+ font: normal 68% verdana,arial,helvetica;
+}
+.error {
+ color: red;
+}
+.failure {
+ color: red;
+}
+.warning {
+ color: red;
+ font-weight: bold;
+ font-size: large;
+}
+
+table,td,th {
+ border-style: solid;
+ border-color: black;
+ border-width: thin;
+}
+ </style>
+ </head>
+ <body>
+ <h1>Unit Test Results</h1>
+ <h2>Overview</h2>
+ <xsl:call-template name="overview"/>
+ <h2>Detail</h2>
+ <xsl:call-template name="detail"/>
+ <xsl:if test="//testcase[error or failure]">
+ <h2>Failures and Errors</h2>
+ <xsl:call-template name="detail2"/>
+ </xsl:if>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template name="overview">
+ <xsl:variable name="errors" select="sum(//testsuite/@errors)"/>
+ <xsl:variable name="failures" select="sum(//testsuite/@failures)"/>
+ <xsl:variable name="tests" select="sum(//testsuite/@tests)"/>
+ <xsl:variable name="time" select="sum(//testsuite/@time)"/>
+ <xsl:if test="$errors > 0 or $failures > 0">
+ <div class="warning">
+ Build Is Unstable!!
+ </div>
+ </xsl:if>
+ <table cellspacing="0">
+ <tr>
+ <th>Tests</th>
+ <th>Errors</th>
+ <th>Failures</th>
+ <th>Time</th>
+ </tr>
+ <tr>
+ <td><xsl:value-of select="$tests"/></td>
+ <td>
+ <xsl:if test="$errors > 0">
+ <xsl:attribute name="class">error</xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="$errors"/>
+ </td>
+ <td>
+ <xsl:if test="$failures > 0">
+ <xsl:attribute name="class">failure</xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="$failures"/>
+ </td>
+ <td align="right"><xsl:value-of select="$time"/></td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <xsl:template name="detail">
+ <xsl:for-each select="//testsuite">
+ <h3><xsl:value-of select="@name"/></h3>
+ <table width="100%" cellspacing="0">
+ <tr>
+ <th>Class</th>
+ <th>Name</th>
+ <th>Time</th>
+ <th>Status</th>
+ </tr>
+ <xsl:for-each select="testcase">
+ <xsl:sort select="@classname"/>
+ <xsl:sort select="@name"/>
+ <tr>
+ <xsl:if test="failure">
+ <xsl:attribute name="class">failure</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="error">
+ <xsl:attribute name="class">error</xsl:attribute>
+ </xsl:if>
+ <td><xsl:value-of select="@classname"/></td>
+ <td><xsl:value-of select="@name"/></td>
+ <td><xsl:value-of select="format-number(@time,'0.000')"/></td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="failure">Failure</xsl:when>
+ <xsl:when test="error">Error</xsl:when>
+ <xsl:otherwise>Success</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="detail2">
+ <xsl:for-each select="//testcase[error or failure]">
+ <xsl:sort select="@classname"/>
+ <xsl:sort select="@name"/>
+ <h3>
+ <xsl:choose>
+ <xsl:when test="failure">Failure</xsl:when>
+ <xsl:when test="error">Error</xsl:when>
+ <xsl:otherwise>Success</xsl:otherwise>
+ </xsl:choose>
+ Detail:
+ <xsl:value-of select="@classname"/>.<xsl:value-of select="@name"/>
+ </h3>
+ <xsl:apply-templates select="error"/>
+ <xsl:apply-templates select="failure"/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template match="error">
+ <span class="error">Error: <xsl:value-of select="@message"/></span><br/>
+ <pre>
+ <xsl:value-of select="."/>
+ </pre>
+ </xsl:template>
+
+ <xsl:template match="failure">
+ <span class="failure">Failure: <xsl:value-of select="@message"/></span><br/>
+ <pre>
+ <xsl:value-of select="."/>
+ </pre>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tests/test.xml b/org.eclipse.mylyn.wikitext.tests/test.xml
new file mode 100644
index 0000000..c778bd3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/test.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<project name="org.eclipse.mylyn.wikitext.tests" default="all">
+ <description>
+ A build script for running JUnit tests
+ </description>
+
+ <property name="test.output" value="test-output"/>
+ <property name="eclipse.home" value="/Applications/eclipse"/>
+
+ <target name="all" depends="clean, run-tests">
+ </target>
+
+ <target name="init">
+ <mkdir dir="${test.output}"/>
+ </target>
+
+ <target name="clean" depends="init">
+ <delete includeemptydirs="true">
+ <fileset dir="${test.output}">
+ <include name="**/*"/>
+ </fileset>
+ </delete>
+ </target>
+
+ <target name="run-tests" depends="clean, init">
+ <path id="wikitext.tests.classpath">
+ <dirset dir="..">
+ <include name="org.eclipse.*/bin"/>
+ <include name="javax.*/bin"/>
+ <include name="org.apache.*/bin"/>
+ </dirset>
+ </path>
+
+ <junit printsummary="yes" haltonfailure="no"
+ failureproperty="junit_test_failed" fork="true" forkmode="once" maxmemory="1024m">
+ <classpath>
+ <path refid="wikitext.tests.classpath"/>
+ </classpath>
+ <classpath>
+ <fileset dir="${eclipse.home}/plugins">
+ <include name="*.jar"/>
+ </fileset>
+ </classpath>
+
+ <formatter type="xml" />
+ <test todir="${test.output}" name="org.eclipse.mylyn.wikitext.tests.HeadlessTests"/>
+ </junit>
+
+ <antcall target="test-report"/>
+ </target>
+
+ <target name="test-report">
+
+ <junitreport todir="${test.output}">
+ <fileset dir="${test.output}">
+ <include name="TEST-*.xml" />
+ </fileset>
+ <report format="noframes" todir="${test.output}" styledir="styles"/>
+ </junitreport>
+
+ <echo>
+JUnit report published to ${test.output}
+ </echo>
+ </target>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.classpath b/org.eclipse.mylyn.wikitext.textile.core/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.cvsignore b/org.eclipse.mylyn.wikitext.textile.core/.cvsignore
new file mode 100644
index 0000000..33d0515
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.cvsignore
@@ -0,0 +1,2 @@
+.refactorings
+.tmp.bin
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.project b/org.eclipse.mylyn.wikitext.textile.core/.project
new file mode 100644
index 0000000..401bca5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.textile.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..3b9c366
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:41 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.textile.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.textile.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a0e4c20
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.textile.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Vendor: %Bundle-Vendor.0
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.team.core;resolution:=optional
+Export-Package: org.eclipse.mylyn.internal.wikitext.textile.core;x-friends:="org.eclipse.mylyn.wikitext.textile.tests",
+ org.eclipse.mylyn.internal.wikitext.textile.core.block;x-friends:="org.eclipse.mylyn.wikitext.textile.tests",
+ org.eclipse.mylyn.internal.wikitext.textile.core.phrase;x-friends:="org.eclipse.mylyn.wikitext.textile.tests",
+ org.eclipse.mylyn.internal.wikitext.textile.core.token;x-friends:="org.eclipse.mylyn.wikitext.textile.tests",
+ org.eclipse.mylyn.internal.wikitext.textile.core.validation;x-friends:="org.eclipse.mylyn.wikitext.textile.tests",
+ org.eclipse.mylyn.wikitext.textile.core
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.textile.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage b/org.eclipse.mylyn.wikitext.textile.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
new file mode 100644
index 0000000..f2eeb6a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
@@ -0,0 +1 @@
+org.eclipse.mylyn.wikitext.textile.core.TextileLanguage
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.textile.core/about.html b/org.eclipse.mylyn.wikitext.textile.core/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.textile.core/build.properties b/org.eclipse.mylyn.wikitext.textile.core/build.properties
new file mode 100644
index 0000000..01810f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.textile.core/plugin.properties b/org.eclipse.mylyn.wikitext.textile.core/plugin.properties
new file mode 100644
index 0000000..2663018
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/plugin.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2008 Mylyn project committers 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.textile.core
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Textile
+content-type.name.0 = Textile WikiText Markup
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.textile.core/plugin.xml b/org.eclipse.mylyn.wikitext.textile.core/plugin.xml
new file mode 100644
index 0000000..1499423
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/plugin.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+
+ <extension point="org.eclipse.mylyn.wikitext.core.markupLanguage">
+ <language class="org.eclipse.mylyn.wikitext.textile.core.TextileLanguage"
+ name="Textile" fileExtensions="textile">
+ </language>
+ </extension>
+
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.mylyn.wikitext"
+ file-extensions="textile"
+ id="org.eclipse.mylyn.wikitext.textile"
+ name="%content-type.name.0"
+ priority="normal">
+ </content-type>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="textile"
+ type="text">
+ </fileTypes>
+ </extension>
+
+ <extension point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule markupLanguage="Textile"
+ class="org.eclipse.mylyn.internal.wikitext.textile.core.validation.BlockWhitespaceRule" />
+ <rule markupLanguage="Textile"
+ class="org.eclipse.mylyn.internal.wikitext.textile.core.validation.TextileReferenceValidationRule" />
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/Textile.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/Textile.java
new file mode 100644
index 0000000..499088c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/Textile.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.util.MatcherAdaper;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Textile {
+
+ private static final String REGEX_TEXTILE_CLASS_ID = "(?:\\(([^#\\)]+)?(?:#([^\\)]+))?\\))"; //$NON-NLS-1$
+
+ private static final String REGEX_TEXTILE_STYLE = "(?:\\{([^\\}]+)\\})"; //$NON-NLS-1$
+
+ private static final String REGEX_LANGUAGE = "(?:\\[([^\\]]+)\\])"; //$NON-NLS-1$
+
+ public static final String REGEX_ATTRIBUTES = "(?:" + REGEX_TEXTILE_CLASS_ID + "|" + REGEX_TEXTILE_STYLE + "|" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ + REGEX_LANGUAGE + "){0,3}"; //$NON-NLS-1$
+
+ public static final String REGEX_BLOCK_ATTRIBUTES = "(\\(+)?(\\)+)?(\\<|\\>|\\=|\\<\\>)?" + REGEX_ATTRIBUTES; //$NON-NLS-1$
+
+ public static final int ATTRIBUTES_GROUP_COUNT = 4;
+
+ public static final int ATTRIBUTES_BLOCK_GROUP_COUNT = 7;
+
+ private static final Pattern explicitBlockBeginPattern = Pattern.compile("(((h[1-6])|p|pre|bc|bq|table)|(fn([0-9]{1,2})))" //$NON-NLS-1$
+ + REGEX_ATTRIBUTES + "\\.\\.?\\s+.*"); //$NON-NLS-1$
+
+ private static final Map<String, String> alignmentToStyle = new HashMap<String, String>();
+ static {
+ alignmentToStyle.put("<", "text-align: left;"); //$NON-NLS-1$ //$NON-NLS-2$
+ alignmentToStyle.put(">", "text-align: right;"); //$NON-NLS-1$ //$NON-NLS-2$
+ alignmentToStyle.put("=", "text-align: center;"); //$NON-NLS-1$ //$NON-NLS-2$
+ alignmentToStyle.put("<>", "text-align: justify;"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public static Attributes configureAttributes(Attributes attributes, Matcher matcher, int offset, boolean block) {
+ return configureAttributes(new MatcherAdaper(matcher), attributes, offset, block);
+ }
+
+ private static void appendStyles(Attributes attributes, String cssStyles) {
+ if (cssStyles == null || cssStyles.length() == 0) {
+ return;
+ }
+ String styles = attributes.getCssStyle();
+ if (styles == null) {
+ attributes.setCssStyle(cssStyles);
+ } else {
+ if (styles.endsWith(";")) { //$NON-NLS-1$
+ styles += " "; //$NON-NLS-1$
+ } else {
+ styles += "; "; //$NON-NLS-1$
+ }
+ styles += cssStyles;
+ attributes.setCssStyle(styles);
+ }
+ }
+
+ public static Attributes configureAttributes(org.eclipse.mylyn.wikitext.core.parser.util.Matcher matcher,
+ Attributes attributes, int offset, boolean block) {
+ if (offset < 1) {
+ throw new IllegalArgumentException();
+ }
+ if (block) {
+ // padding (left)
+ {
+ String padding = matcher.group(offset);
+ if (padding != null) {
+ appendStyles(attributes, "padding-left: " + padding.length() + "em;"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ ++offset;
+ }
+
+ // padding (right)
+ {
+ String padding = matcher.group(offset);
+ if (padding != null) {
+ appendStyles(attributes, "padding-right: " + padding.length() + "em;"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ ++offset;
+ }
+
+ // alignment
+ {
+ String alignment = matcher.group(offset);
+ if (alignment != null) {
+ appendStyles(attributes, alignmentToStyle.get(alignment));
+ }
+ ++offset;
+ }
+ }
+
+ String cssClass2 = matcher.group(offset);
+ String id = matcher.group(offset + 1);
+ String cssStyles2 = matcher.group(offset + 2);
+ String language = matcher.group(offset + 3);
+
+ if (id != null && attributes.getId() == null) {
+ attributes.setId(id);
+ }
+
+ if (attributes.getCssClass() != null || cssClass2 != null) {
+ attributes.setCssClass(attributes.getCssClass() == null ? cssClass2
+ : cssClass2 == null ? attributes.getCssClass() : attributes.getCssClass() + ' ' + cssClass2);
+ }
+ appendStyles(attributes, cssStyles2);
+
+ attributes.setLanguage(language);
+
+ return attributes;
+ }
+
+ public static boolean explicitBlockBegins(String line, int offset) {
+ if (offset != 0) {
+ return false;
+ }
+ return explicitBlockBeginPattern.matcher(line).matches();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/TextileContentState.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/TextileContentState.java
new file mode 100644
index 0000000..873d509
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/TextileContentState.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.FootnoteBlock;
+import org.eclipse.mylyn.wikitext.core.parser.markup.ContentState;
+
+/**
+ * Override the default content state so that we can support named links.
+ *
+ * @author David Green
+ */
+public class TextileContentState extends ContentState {
+ private static final Pattern NAMED_LINK_PATTERN = Pattern.compile("\\[(\\S+)\\]([a-zA-Z]{3,5}:\\S+)", //$NON-NLS-1$
+ Pattern.MULTILINE);
+
+ private final Map<String, String> nameToUrl = new HashMap<String, String>();
+
+ private Set<String> footnoteNumbers;
+
+ @Override
+ protected void setMarkupContent(String markupContent) {
+ super.setMarkupContent(markupContent);
+ preprocessContent(markupContent);
+ }
+
+ private void preprocessContent(String markupContent) {
+ // look for named links
+ Matcher matcher = NAMED_LINK_PATTERN.matcher(markupContent);
+ while (matcher.find()) {
+ String name = matcher.group(1);
+ String href = matcher.group(2);
+ nameToUrl.put(name, href);
+ }
+ }
+
+ public String getNamedLinkUrl(String name) {
+ return nameToUrl.get(name);
+ }
+
+ /**
+ * the known footnote numbers, or null if there are none
+ */
+ public Set<String> getFootnoteNumbers() {
+ return footnoteNumbers;
+ }
+
+ /**
+ * the known footnote numbers, or null if there are none
+ */
+ public void setFootnoteNumbers(Set<String> footnoteNumbers) {
+ this.footnoteNumbers = footnoteNumbers;
+ }
+
+ /**
+ * @param footnoteNumber
+ * the number of the footnote, eg: <code>1</code>, or <code>12</code>
+ * @see FootnoteBlock
+ */
+ public void footnoteBlockDetected(String footnoteNumber) {
+ if (footnoteNumbers == null) {
+ footnoteNumbers = new HashSet<String>();
+ }
+ footnoteNumbers.add(footnoteNumber);
+ }
+
+ public boolean hasFootnoteNumber(String footnoteNumber) {
+ return footnoteNumbers != null && footnoteNumbers.contains(footnoteNumber);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/CodeBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/CodeBlock.java
new file mode 100644
index 0000000..55aef13
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/CodeBlock.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Code text block, matches blocks that start with <code>bc. </code>
+ *
+ * @author David Green
+ */
+public class CodeBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 2;
+
+ private static final int EXTENDED_GROUP = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 1;
+
+ static final Pattern startPattern = Pattern.compile("bc" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\.(\\.)?\\s+(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private boolean extended;
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public CodeBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+
+ Textile.configureAttributes(attributes, matcher, 1, true);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+ extended = matcher.group(EXTENDED_GROUP) != null;
+
+ builder.beginBlock(BlockType.PREFORMATTED, attributes);
+ builder.beginBlock(BlockType.CODE, new Attributes());
+ }
+ if (markupLanguage.isEmptyLine(line) && !extended) {
+ setClosed(true);
+ return 0;
+ } else if (extended && Textile.explicitBlockBegins(line, offset)) {
+ setClosed(true);
+ return offset;
+ }
+ ++blockLineCount;
+
+ builder.characters(offset > 0 ? line.substring(offset) : line);
+ builder.characters("\n"); //$NON-NLS-1$
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();// code
+ builder.endBlock();// pre
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/FootnoteBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/FootnoteBlock.java
new file mode 100644
index 0000000..d82a8e5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/FootnoteBlock.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.internal.wikitext.textile.core.TextileContentState;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Footnote block, matching lines starting with <code>fn\d\d?. </code>.
+ *
+ * @author David Green
+ */
+public class FootnoteBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 2;
+
+ static final Pattern startPattern = Pattern.compile("fn([0-9]{1,2})" + Textile.REGEX_BLOCK_ATTRIBUTES //$NON-NLS-1$
+ + "\\.\\s+(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private String footnote;
+
+ public FootnoteBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ attributes.setCssClass("footnote"); //$NON-NLS-1$
+
+ // 0-offset matches may start with the "fnnn. " prefix.
+ footnote = matcher.group(1);
+ ((TextileContentState) state).footnoteBlockDetected(footnote);
+ attributes.setId(state.getFootnoteId(footnote));
+
+ Textile.configureAttributes(attributes, matcher, 2, true);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ builder.beginSpan(SpanType.SUPERSCRIPT, new Attributes());
+ builder.characters(footnote);
+ builder.endSpan();
+ builder.characters(" "); //$NON-NLS-1$
+ }
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ if (blockLineCount != 0) {
+ builder.lineBreak();
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/HeadingBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/HeadingBlock.java
new file mode 100644
index 0000000..c82637e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/HeadingBlock.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Matches any textile text, including lines starting with <code>p. </code>.
+ *
+ * @author David Green
+ */
+public class HeadingBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 2;
+
+ static final Pattern startPattern = Pattern.compile("h([1-6])" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\.\\s+(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private int blockLineCount = 0;
+
+ private int level = -1;
+
+ private Matcher matcher;
+
+ public HeadingBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ if (offset == 0) {
+ // 0-offset matches may start with the "hn. " prefix.
+ level = Integer.parseInt(matcher.group(1));
+ Textile.configureAttributes(attributes, matcher, 2, true);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+ }
+ if (attributes.getId() == null) {
+ attributes.setId(state.getIdGenerator().newId("h" + level, line.substring(offset))); //$NON-NLS-1$
+ }
+ builder.beginHeading(level, attributes);
+ }
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ if (blockLineCount != 0) {
+ getMarkupLanguage().emitMarkupText(getParser(), state, "\n"); //$NON-NLS-1$
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endHeading();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/ListBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/ListBlock.java
new file mode 100644
index 0000000..f24b7f5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/ListBlock.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * List block, matches blocks that start with <code>*</code>, <code>#</code> or <code>-</code>
+ *
+ * @author David Green
+ */
+public class ListBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 2;
+
+ static final Pattern startPattern = Pattern.compile("((?:(?:\\*)|(?:#))+)" + Textile.REGEX_BLOCK_ATTRIBUTES //$NON-NLS-1$
+ + "\\s(.*+)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private Stack<ListState> listState;
+
+ public ListBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ listState = new Stack<ListState>();
+ Attributes attributes = new Attributes();
+ String listSpec = matcher.group(1);
+ int level = calculateLevel(listSpec);
+ BlockType type = calculateType(listSpec);
+
+ // 0-offset matches may start with the "*** " prefix.
+ Textile.configureAttributes(attributes, matcher, 2, true);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ listState.push(new ListState(1, type));
+ builder.beginBlock(type, attributes);
+
+ adjustLevel(matcher, level, type);
+ } else {
+ Matcher matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ String listSpec = matcher.group(1);
+ int level = calculateLevel(listSpec);
+ BlockType type = calculateType(listSpec);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ adjustLevel(matcher, level, type);
+ }
+ ++blockLineCount;
+
+ ListState listState = this.listState.peek();
+ if (listState.openItem) {
+ builder.endBlock();
+ }
+ listState.openItem = true;
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ private void adjustLevel(Matcher matcher, int level, BlockType type) {
+ for (ListState previousState = listState.peek(); level != previousState.level || previousState.type != type; previousState = listState.peek()) {
+
+ if (level > previousState.level) {
+ if (!previousState.openItem) {
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ previousState.openItem = true;
+ }
+
+ Attributes blockAttributes = new Attributes();
+ if (previousState.level + 1 == level) {
+ Textile.configureAttributes(blockAttributes, matcher, 2, true);
+ }
+
+ listState.push(new ListState(previousState.level + 1, type));
+ builder.beginBlock(type, blockAttributes);
+ } else {
+ closeOne();
+ if (listState.isEmpty()) {
+ Attributes blockAttributes = new Attributes();
+ Textile.configureAttributes(blockAttributes, matcher, 2, true);
+
+ listState.push(new ListState(1, type));
+ builder.beginBlock(type, blockAttributes);
+ }
+ }
+
+ }
+ }
+
+ private int calculateLevel(String listSpec) {
+ return listSpec.length();
+ }
+
+ private BlockType calculateType(String listSpec) {
+ return listSpec.charAt(listSpec.length() - 1) == '#' ? BlockType.NUMERIC_LIST : BlockType.BULLETED_LIST;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ listState = null;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ while (listState != null && !listState.isEmpty()) {
+ closeOne();
+ }
+ listState = null;
+ }
+ super.setClosed(closed);
+ }
+
+ private void closeOne() {
+ ListState e = listState.pop();
+ if (e.openItem) {
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ private static class ListState {
+ int level;
+
+ BlockType type;
+
+ boolean openItem;
+
+ private ListState(int level, BlockType type) {
+ super();
+ this.level = level;
+ this.type = type;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/ParagraphBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/ParagraphBlock.java
new file mode 100644
index 0000000..223850b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/ParagraphBlock.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ * Matches any textile text, including lines starting with <code>p. </code>.
+ *
+ * @author David Green
+ */
+public class ParagraphBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 1;
+
+ static final Pattern startPattern = Pattern.compile("p" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\.\\s+(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private int blockLineCount = 0;
+
+ private boolean unwrapped = false;
+
+ private boolean enableUnwrapped = true;
+
+ public ParagraphBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ if (offset == 0) {
+ // 0-offset matches may start with the "p. " prefix.
+ Matcher matcher = startPattern.matcher(line);
+ if (matcher.matches()) {
+ Textile.configureAttributes(attributes, matcher, 1, true);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+ } else {
+ if (line.charAt(0) == ' ') {
+ offset = 1;
+ if (enableUnwrapped) {
+ unwrapped = true;
+ }
+ }
+ }
+ }
+ if (!unwrapped) {
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ }
+ }
+
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+
+ TextileLanguage textileLanguage = (TextileLanguage) getMarkupLanguage();
+
+ // NOTE: in Textile paragraphs can have nested lists and other things, however
+ // the resulting XHTML is invalid -- so here we allow for similar constructs
+ // however we cause them to end the paragraph rather than being nested.
+ for (Block block : textileLanguage.getParagraphBreakingBlocks()) {
+ if (block.canStart(line, offset)) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ if (blockLineCount != 0) {
+ if (unwrapped) {
+ builder.characters("\n"); //$NON-NLS-1$
+ } else {
+ builder.lineBreak();
+ }
+ }
+ ++blockLineCount;
+
+ textileLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ unwrapped = false;
+ blockLineCount = 0;
+ return true;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ if (!unwrapped) {
+ builder.endBlock();
+ }
+ }
+ super.setClosed(closed);
+ }
+
+ public void setEnableUnwrapped(boolean enableUnwrapped) {
+ this.enableUnwrapped = enableUnwrapped;
+ }
+
+ public boolean isEnableUnwrapped() {
+ return enableUnwrapped;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/PreformattedBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/PreformattedBlock.java
new file mode 100644
index 0000000..01bf0f8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/PreformattedBlock.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Preformatted text block, matches blocks that start with <code>pre. </code>
+ *
+ * @author David Green
+ */
+public class PreformattedBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 2;
+
+ private static final int EXTENDED_GROUP = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 1;
+
+ static final Pattern startPattern = Pattern.compile("pre" + Textile.REGEX_BLOCK_ATTRIBUTES + "\\.(\\.)?\\s+(.*)"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private boolean extended;
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public PreformattedBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+
+ Textile.configureAttributes(attributes, matcher, 1, true);
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+ extended = matcher.group(EXTENDED_GROUP) != null;
+
+ builder.beginBlock(BlockType.PREFORMATTED, attributes);
+ }
+ if (markupLanguage.isEmptyLine(line) && !extended) {
+ setClosed(true);
+ return 0;
+ } else if (extended && Textile.explicitBlockBegins(line, offset)) {
+ setClosed(true);
+ return offset;
+ }
+ ++blockLineCount;
+
+ builder.characters(offset > 0 ? line.substring(offset) : line);
+ builder.characters("\n"); //$NON-NLS-1$
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/QuoteBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/QuoteBlock.java
new file mode 100644
index 0000000..a78f1ec
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/QuoteBlock.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.QuoteAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * quoted text block, matches blocks that start with <code>bc. </code>. Creates an extended block type of
+ * {@link ParagraphBlock paragraph}.
+ *
+ * @author David Green
+ */
+public class QuoteBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 3;
+
+ private static final int CITATION_GROUP = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 2;
+
+ private static final int EXTENDED_GROUP = Textile.ATTRIBUTES_BLOCK_GROUP_COUNT + 1;
+
+ static final Pattern startPattern = Pattern.compile("bq" + Textile.REGEX_BLOCK_ATTRIBUTES //$NON-NLS-1$
+ + "\\.(\\.)?(?::(https?://[^\\s]*))?\\s+(.*)"); //$NON-NLS-1$
+
+ private boolean extended;
+
+ private boolean paraOpen;
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public QuoteBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ QuoteAttributes attributes = new QuoteAttributes();
+
+ Textile.configureAttributes(attributes, matcher, 1, true);
+
+ attributes.setCitation(matcher.group(CITATION_GROUP));
+
+ offset = matcher.start(LINE_REMAINDER_GROUP);
+ extended = matcher.group(EXTENDED_GROUP) != null;
+
+ builder.beginBlock(BlockType.QUOTE, attributes);
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ paraOpen = true;
+ }
+ if (markupLanguage.isEmptyLine(line)) {
+ if (!extended) {
+ setClosed(true);
+ return 0;
+ } else {
+ if (paraOpen) {
+ builder.endBlock(); // para
+ paraOpen = false;
+ }
+ return 0;
+ }
+ } else if (extended && Textile.explicitBlockBegins(line, offset)) {
+ setClosed(true);
+ return offset;
+ }
+ if (blockLineCount != 0) {
+ if (paraOpen) {
+ builder.lineBreak();
+ } else {
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ paraOpen = true;
+ }
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ if (paraOpen) {
+ builder.endBlock(); // para
+ paraOpen = false;
+ }
+ builder.endBlock(); // quote
+ }
+ super.setClosed(closed);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TableBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TableBlock.java
new file mode 100644
index 0000000..1dd71fd
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TableBlock.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.TableAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableCellAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.TableRowAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Table block, matches blocks that start with <code>table. </code> or those that start with a table row.
+ *
+ * @author David Green
+ */
+public class TableBlock extends Block {
+
+ // NOTE: no need for whitespace after the dot on 'table.'
+ static final Pattern startPattern = Pattern.compile("(table" + Textile.REGEX_BLOCK_ATTRIBUTES //$NON-NLS-1$
+ + "\\.\\s*)|(\\|(.*)?(\\|\\s*$))"); //$NON-NLS-1$
+
+ static final Pattern rowAttributesPattern = Pattern.compile(Textile.REGEX_BLOCK_ATTRIBUTES + "\\.\\s*.*"); //$NON-NLS-1$
+
+ static final Pattern TABLE_ROW_PATTERN = Pattern.compile("\\|(?:\\\\(\\d+))?(?:/(\\d+))?((?:\\<\\>)|\\<|\\>|\\^)?" //$NON-NLS-1$
+ + Textile.REGEX_ATTRIBUTES + "(_|\\|)?\\.?\\s?([^\\|]*)(\\|\\|?\\s*$)?"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public TableBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ TableAttributes attributes = new TableAttributes();
+ if (matcher.group(1) != null) {
+ // 0-offset matches may start with the "table. " prefix.
+ Textile.configureAttributes(attributes, matcher, 2, true);
+ offset = line.length();
+ }
+ builder.beginBlock(BlockType.TABLE, attributes);
+ } else if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+ ++blockLineCount;
+
+ if (offset == line.length()) {
+ return -1;
+ }
+
+ String textileLine = offset == 0 ? line : line.substring(offset);
+ Matcher rowMatcher = TABLE_ROW_PATTERN.matcher(textileLine);
+ if (!rowMatcher.find()) {
+ setClosed(true);
+ return 0;
+ }
+
+ {
+ TableRowAttributes rowAttributes = new TableRowAttributes();
+ int rowStart = rowMatcher.start();
+ if (rowStart > 0) {
+ // if the row content starts somewhere in the line then it's likely
+ // that we have some row-level attributes
+ Matcher rowAttributesMatcher = rowAttributesPattern.matcher(textileLine);
+ if (rowAttributesMatcher.matches()) {
+ Textile.configureAttributes(rowAttributes, rowAttributesMatcher, 1, true);
+ }
+ }
+ builder.beginBlock(BlockType.TABLE_ROW, rowAttributes);
+ }
+
+ do {
+ int start = rowMatcher.start();
+ if (start == textileLine.length() - 1) {
+ break;
+ }
+
+ String colSpan = rowMatcher.group(1);
+ String rowSpan = rowMatcher.group(2);
+ String alignment = rowMatcher.group(3);
+ String headerIndicator = rowMatcher.group(8);
+ String text = rowMatcher.group(9);
+ int textLineOffset = rowMatcher.start(9);
+
+ boolean header = headerIndicator != null && ("_".equals(headerIndicator) || "|".equals(headerIndicator)); //$NON-NLS-1$ //$NON-NLS-2$
+
+ String textAlign = null;
+ if (alignment != null) {
+ if (alignment.equals("<>")) { //$NON-NLS-1$
+ textAlign = "text-align: center;"; //$NON-NLS-1$
+ } else if (alignment.equals(">")) { //$NON-NLS-1$
+ textAlign = "text-align: right;"; //$NON-NLS-1$
+ } else if (alignment.equals("<")) { //$NON-NLS-1$
+ textAlign = "text-align: left;"; //$NON-NLS-1$
+ } else if (alignment.equals("^")) { //$NON-NLS-1$
+ textAlign = "text-align: top;"; //$NON-NLS-1$
+ }
+ }
+ TableCellAttributes attributes = new TableCellAttributes();
+ attributes.setCssStyle(textAlign);
+ attributes.setRowspan(rowSpan);
+ attributes.setColspan(colSpan);
+ Textile.configureAttributes(attributes, rowMatcher, 4, false);
+
+ state.setLineCharacterOffset(start);
+ builder.beginBlock(header ? BlockType.TABLE_CELL_HEADER : BlockType.TABLE_CELL_NORMAL, attributes);
+
+ markupLanguage.emitMarkupLine(getParser(), state, textLineOffset, text, 0);
+
+ builder.endBlock(); // table cell
+ } while (rowMatcher.find());
+
+ builder.endBlock(); // table row
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TableOfContentsBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TableOfContentsBlock.java
new file mode 100644
index 0000000..988e476
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TableOfContentsBlock.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TableOfContentsBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("\\s*\\{toc(?::([^\\}]+))?\\}\\s*"); //$NON-NLS-1$
+
+ private int blockLineNumber = 0;
+
+ private String style = "none"; //$NON-NLS-1$
+
+ private int maxLevel = Integer.MAX_VALUE;
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineNumber++ > 0) {
+ setClosed(true);
+ return 0;
+ }
+
+ if (!getMarkupLanguage().isFilterGenerativeContents()) {
+ String options = matcher.group(1);
+ if (options != null) {
+ String[] optionPairs = options.split("\\s*\\|\\s*"); //$NON-NLS-1$
+ for (String optionPair : optionPairs) {
+ String[] keyValue = optionPair.split("\\s*=\\s*"); //$NON-NLS-1$
+ if (keyValue.length == 2) {
+ String key = keyValue[0].trim();
+ String value = keyValue[1].trim();
+
+ if (key.equals("style")) { //$NON-NLS-1$
+ setStyle(value);
+ } else if (key.equals("maxLevel")) { //$NON-NLS-1$
+ try {
+ maxLevel = Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ }
+ }
+ }
+ }
+ }
+
+ OutlineParser outlineParser = new OutlineParser(new TextileLanguage());
+ OutlineItem rootItem = outlineParser.parse(state.getMarkupContent());
+
+ emitToc(rootItem);
+ }
+ return -1;
+ }
+
+ private void emitToc(OutlineItem item) {
+ if (item.getChildren().isEmpty()) {
+ return;
+ }
+ if ((item.getLevel() + 1) > maxLevel) {
+ return;
+ }
+ Attributes nullAttributes = new Attributes();
+
+ builder.beginBlock(BlockType.NUMERIC_LIST, new Attributes(null, null, "list-style: " + style + ";", null)); //$NON-NLS-1$ //$NON-NLS-2$
+ for (OutlineItem child : item.getChildren()) {
+ builder.beginBlock(BlockType.LIST_ITEM, nullAttributes);
+ builder.link('#' + child.getId(), child.getLabel());
+ emitToc(child);
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && !getMarkupLanguage().isFilterGenerativeContents()) {
+ matcher = startPattern.matcher(line);
+ blockLineNumber = 0;
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ public String getStyle() {
+ return style;
+ }
+
+ public void setStyle(String style) {
+ this.style = style;
+ }
+
+ public int getMaxLevel() {
+ return maxLevel;
+ }
+
+ public void setMaxLevel(int maxLevel) {
+ this.maxLevel = maxLevel;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TextileGlossaryBlock.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TextileGlossaryBlock.java
new file mode 100644
index 0000000..5e364bf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/block/TextileGlossaryBlock.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.block.GlossaryBlock;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class TextileGlossaryBlock extends GlossaryBlock {
+
+ static final Pattern startPattern = Pattern.compile("\\s*\\{glossary(?::([^\\}]+))?\\}\\s*"); //$NON-NLS-1$
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineNumber == 0) {
+ String options = matcher.group(1);
+ if (options != null) {
+ String[] optionPairs = options.split("\\s*\\|\\s*"); //$NON-NLS-1$
+ for (String optionPair : optionPairs) {
+ String[] keyValue = optionPair.split("\\s*=\\s*"); //$NON-NLS-1$
+ if (keyValue.length == 2) {
+ String key = keyValue[0].trim();
+ String value = keyValue[1].trim();
+
+ if (key.equals("style")) { //$NON-NLS-1$
+ setStyle(value);
+ }
+ }
+ }
+ }
+ }
+ return super.processLineContent(line, offset);
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && !markupLanguage.isFilterGenerativeContents()) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/EscapeTextilePhraseModifier.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/EscapeTextilePhraseModifier.java
new file mode 100644
index 0000000..550308f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/EscapeTextilePhraseModifier.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.phrase;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.LiteralPhraseModifierProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class EscapeTextilePhraseModifier extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String quotedDelimiter = Pattern.quote("=="); //$NON-NLS-1$
+
+ return quotedDelimiter + "(\\S(?:.*?\\S)?)" + // content //$NON-NLS-1$
+ quotedDelimiter;
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(false);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/ImageTextilePhraseModifier.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/ImageTextilePhraseModifier.java
new file mode 100644
index 0000000..17f23f6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/ImageTextilePhraseModifier.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.phrase;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.internal.wikitext.textile.core.TextileContentState;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes.Align;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class ImageTextilePhraseModifier extends PatternBasedElement {
+
+ protected static final int ALIGNMENT_GROUP = Textile.ATTRIBUTES_GROUP_COUNT + 1;
+
+ protected static final int CONTENT_GROUP = Textile.ATTRIBUTES_GROUP_COUNT + 2;
+
+ protected static final int ATTRIBUTES_OFFSET = 1;
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String quotedDelimiter = Pattern.quote("!"); //$NON-NLS-1$
+
+ return quotedDelimiter + Textile.REGEX_ATTRIBUTES + "(<|>|=)?([^\\s!](?:.*?\\S)?)(\\([^\\)]+\\))?" + // content //$NON-NLS-1$
+ quotedDelimiter + "(:([^\\s]*[^\\s!.)(,]))?"; // optional hyperlink suffix //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return Textile.ATTRIBUTES_GROUP_COUNT + 5;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new ImagePhraseModifierProcessor();
+ }
+
+ private static class ImagePhraseModifierProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String alignment = group(ALIGNMENT_GROUP);
+ String imageUrl = group(CONTENT_GROUP);
+ String altAndTitle = group(CONTENT_GROUP + 1);
+ String href = group(CONTENT_GROUP + 3);
+ String namedLinkUrl = href == null ? null : ((TextileContentState) getState()).getNamedLinkUrl(href);
+ if (namedLinkUrl != null) {
+ href = namedLinkUrl;
+ }
+
+ ImageAttributes attributes = new ImageAttributes();
+ attributes.setTitle(altAndTitle);
+ attributes.setAlt(altAndTitle);
+ if (alignment != null) {
+ if ("<".equals(alignment)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Left);
+ } else if (">".equals(alignment)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Right);
+ } else if ("=".equals(alignment)) { //$NON-NLS-1$
+ attributes.setAlign(Align.Center);
+ }
+ }
+ Textile.configureAttributes(this, attributes, ATTRIBUTES_OFFSET, false);
+ if (href != null) {
+ builder.imageLink(attributes, href, imageUrl);
+ } else {
+ builder.image(attributes, imageUrl);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/SimpleTextilePhraseModifier.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/SimpleTextilePhraseModifier.java
new file mode 100644
index 0000000..7df8a53
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/phrase/SimpleTextilePhraseModifier.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.phrase;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.Textile;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A simple phrase modifier implementation that matches a pattern in text and emits a {@link SpanType span} containing
+ * the content of the matched region.
+ *
+ * @author David Green
+ */
+public class SimpleTextilePhraseModifier extends PatternBasedElement {
+
+ public enum Mode {
+ /**
+ * normal phrase content is processed
+ */
+ NORMAL,
+ /**
+ * special phrase content, ie: no token replacement
+ */
+ SPECIAL,
+ /**
+ * phrase may contain other nested phrases
+ */
+ NESTING,
+ }
+
+ protected static final int CONTENT_GROUP = Textile.ATTRIBUTES_GROUP_COUNT + 1;
+
+ protected static final int ATTRIBUTES_OFFSET = 1;
+
+ private static class SimplePhraseModifierProcessor extends PatternBasedElementProcessor {
+ private final SpanType spanType;
+
+ private final Mode mode;
+
+ public SimplePhraseModifierProcessor(SpanType spanType, Mode mode) {
+ this.spanType = spanType;
+ this.mode = mode;
+ }
+
+ @Override
+ public void emit() {
+ Attributes attributes = new Attributes();
+ configureAttributes(this, attributes);
+ getBuilder().beginSpan(spanType, attributes);
+ switch (mode) {
+ case NESTING:
+ getMarkupLanguage().emitMarkupLine(parser, state, getStart(this), getContent(this), 0);
+ break;
+ case NORMAL:
+ getMarkupLanguage().emitMarkupText(parser, state, getContent(this));
+ break;
+ case SPECIAL:
+ getBuilder().characters(getContent(this));
+ break;
+ }
+ getBuilder().endSpan();
+ }
+ }
+
+ private final String delimiter;
+
+ private final SpanType spanType;
+
+ private final Mode mode;
+
+ /**
+ * @param delimiter
+ * the text pattern to detect
+ * @param spanType
+ * the type of span to be emitted for this phrase modifier
+ * @param nesting
+ * indicate if this phrase modifier allows nested phrase modifiers
+ */
+ public SimpleTextilePhraseModifier(String delimiter, SpanType spanType, Mode mode) {
+ this.delimiter = delimiter;
+ this.spanType = spanType;
+ this.mode = mode;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String quotedDelimiter = quoteLite(getDelimiter());
+
+ return quotedDelimiter + "(?!" + quotedDelimiter + ")" + Textile.REGEX_ATTRIBUTES + "([^\\s" + quotedDelimiter //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ + "]+|\\S[^" + quotedDelimiter + "]*[^\\s" + quotedDelimiter + "])" + // content //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ quotedDelimiter;
+ }
+
+ /**
+ * quote a literal for use in a regular expression
+ */
+ private String quoteLite(String literal) {
+ StringBuilder buf = new StringBuilder(literal.length() * 2);
+ for (int x = 0; x < literal.length(); ++x) {
+ char c = literal.charAt(x);
+ switch (c) {
+ case '^':
+ case '*':
+ case '?':
+ case '+':
+ case '-':
+ buf.append('\\');
+ }
+ buf.append(c);
+ }
+ return buf.toString();
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return Textile.ATTRIBUTES_GROUP_COUNT + 1;
+ }
+
+ protected String getDelimiter() {
+ return delimiter;
+ }
+
+ protected static void configureAttributes(PatternBasedElementProcessor processor, Attributes attributes) {
+ Textile.configureAttributes(processor, attributes, ATTRIBUTES_OFFSET, false);
+ }
+
+ protected static String getContent(PatternBasedElementProcessor processor) {
+ return processor.group(CONTENT_GROUP);
+ }
+
+ protected static int getStart(PatternBasedElementProcessor processor) {
+ return processor.start(CONTENT_GROUP);
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SimplePhraseModifierProcessor(spanType, mode);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/token/FootnoteReferenceReplacementToken.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/token/FootnoteReferenceReplacementToken.java
new file mode 100644
index 0000000..783b6c6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/token/FootnoteReferenceReplacementToken.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.token;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.TextileContentState;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class FootnoteReferenceReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:\\[(\\d+)\\])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new FootnoteReferenceReplacementTokenProcessor();
+ }
+
+ private static class FootnoteReferenceReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String footnote = group(1);
+
+ if (((TextileLanguage) getMarkupLanguage()).isPreprocessFootnotes()
+ && !((TextileContentState) getState()).hasFootnoteNumber(footnote)) {
+ builder.characters(group(0));
+ } else {
+ String htmlId = state.getFootnoteId(footnote);
+
+ int originalSegmentEndOffset = state.getLineSegmentEndOffset();
+ state.setLineCharacterOffset(start(1) - 1);
+ state.setLineSegmentEndOffset(end(1) + 1);
+
+ builder.beginSpan(SpanType.SUPERSCRIPT, new Attributes(null, "footnote", null, null)); //$NON-NLS-1$
+ builder.link("#" + htmlId, footnote); //$NON-NLS-1$
+ builder.endSpan();
+
+ state.setLineCharacterOffset(originalSegmentEndOffset);
+ state.setLineSegmentEndOffset(originalSegmentEndOffset);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/token/HyperlinkReplacementToken.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/token/HyperlinkReplacementToken.java
new file mode 100644
index 0000000..40f92f3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/token/HyperlinkReplacementToken.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.token;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.TextileContentState;
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HyperlinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?:(\"|\\!)([^\"\\!]+)\\" + (1 + groupOffset) + ":([^\\s]*[^\\s!.)(,:;]))"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 3;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String hyperlinkBoundaryText = group(1);
+ String hyperlinkSrc = group(2);
+ String href = group(3);
+ String namedLinkUrl = ((TextileContentState) getState()).getNamedLinkUrl(href);
+ if (namedLinkUrl != null) {
+ href = namedLinkUrl;
+ }
+
+ if (hyperlinkBoundaryText.equals("\"")) { //$NON-NLS-1$
+ builder.link(href, hyperlinkSrc);
+ } else {
+ builder.imageLink(new ImageAttributes(), href, hyperlinkSrc);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/BlockWhitespaceRule.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/BlockWhitespaceRule.java
new file mode 100644
index 0000000..b1367ab
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/BlockWhitespaceRule.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.textile.core.validation;
+
+import java.text.MessageFormat;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class BlockWhitespaceRule extends ValidationRule {
+
+ private static final Pattern pattern = Pattern.compile("((?:bc|bq|pre|table|p)(?:\\.){1,2})(.)?", Pattern.MULTILINE); //$NON-NLS-1$
+
+ @Override
+ public ValidationProblem findProblem(String markup, int offset, int length) {
+ Matcher matcher = pattern.matcher(markup);
+ if (offset > 0) {
+ matcher.region(offset, offset + length);
+ }
+ while (matcher.find()) {
+ int start = matcher.start();
+ boolean startOfLine = false;
+ if (start == 0) {
+ startOfLine = true;
+ } else {
+ char c = markup.charAt(start - 1);
+ if (c == '\r' || c == '\n') {
+ startOfLine = true;
+ }
+ }
+ if (startOfLine) {
+ String followingCharacter = matcher.group(2);
+ if (followingCharacter == null || !followingCharacter.equals(" ")) { //$NON-NLS-1$
+ int problemLength = matcher.end(1) - start;
+ String matched = matcher.group(1);
+ return new ValidationProblem(ValidationProblem.Severity.WARNING, MessageFormat.format(
+ Messages.getString("BlockWhitespaceRule.2"), //$NON-NLS-1$
+ matched), start, problemLength);
+ }
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/Messages.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/Messages.java
new file mode 100644
index 0000000..c12ae18
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.textile.core.validation;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.textile.core.validation.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/TextileReferenceValidationRule.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/TextileReferenceValidationRule.java
new file mode 100644
index 0000000..98656f6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/TextileReferenceValidationRule.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.textile.core.validation;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.validation.DocumentLocalReferenceValidationRule;
+import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage;
+
+public class TextileReferenceValidationRule extends DocumentLocalReferenceValidationRule {
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new TextileLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/messages.properties b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/messages.properties
new file mode 100644
index 0000000..f5f8be3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/internal/wikitext/textile/core/validation/messages.properties
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+BlockWhitespaceRule.2=''{0}'' will not start a new block unless it is followed by a space character ('' '')
diff --git a/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguage.java b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguage.java
new file mode 100644
index 0000000..ce1358f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.core/src/org/eclipse/mylyn/wikitext/textile/core/TextileLanguage.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.textile.core;
+
+import java.util.List;
+
+import org.eclipse.mylyn.internal.wikitext.textile.core.TextileContentState;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.CodeBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.FootnoteBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.HeadingBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.ListBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.ParagraphBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.PreformattedBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.QuoteBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.TableBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.TableOfContentsBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.block.TextileGlossaryBlock;
+import org.eclipse.mylyn.internal.wikitext.textile.core.phrase.EscapeTextilePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.textile.core.phrase.ImageTextilePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.textile.core.phrase.SimpleTextilePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.textile.core.phrase.SimpleTextilePhraseModifier.Mode;
+import org.eclipse.mylyn.internal.wikitext.textile.core.token.FootnoteReferenceReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.textile.core.token.HyperlinkReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.builder.NoOpDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.AbstractMarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.ContentState;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguageConfiguration;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.HtmlEndTagPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.HtmlStartTagPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.AcronymReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.EntityReferenceReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.EntityWrappingReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.PatternEntityReferenceReplacementToken;
+
+/**
+ * A textile dialect that parses <a href="http://en.wikipedia.org/wiki/Textile_(markup_language)">Textile markup</a>.
+ * Based on the spec available at <a href="http://textile.thresholdstate.com/">http://textile.thresholdstate.com/</a>,
+ * supports all current Textile markup constructs. Additionally supported are <code>{toc}</code> and
+ * <code>{glossary}</code>.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class TextileLanguage extends AbstractMarkupLanguage {
+
+ private boolean preprocessFootnotes = false;
+
+ private TextileContentState currentState;
+
+ public TextileLanguage() {
+ setName("Textile"); //$NON-NLS-1$
+ }
+
+ /**
+ * subclasses may override this method to add blocks to the Textile language. Overriding classes should call
+ * <code>super.addBlockExtensions(blocks,paragraphBreakingBlocks)</code> if the default language extensions are
+ * desired (glossary and table of contents).
+ *
+ * @param blocks
+ * the list of blocks to which extensions may be added
+ * @param paragraphBreakingBlocks
+ * the list of blocks that end a paragraph
+ */
+ @Override
+ protected void addBlockExtensions(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ blocks.add(new TextileGlossaryBlock());
+ blocks.add(new TableOfContentsBlock());
+ super.addBlockExtensions(blocks, paragraphBreakingBlocks);
+ }
+
+ @Override
+ protected ContentState createState() {
+ if (currentState != null) {
+ TextileContentState temp = currentState;
+ currentState = null;
+ return temp;
+ }
+ return new TextileContentState();
+ }
+
+ @Override
+ protected void addStandardBlocks(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ blocks.add(new HeadingBlock());
+ ListBlock listBlock = new ListBlock();
+ blocks.add(listBlock);
+ paragraphBreakingBlocks.add(listBlock);
+ blocks.add(new PreformattedBlock());
+ blocks.add(new QuoteBlock());
+ blocks.add(new CodeBlock());
+ blocks.add(new FootnoteBlock());
+ TableBlock tableBlock = new TableBlock();
+ blocks.add(tableBlock);
+ paragraphBreakingBlocks.add(tableBlock);
+ }
+
+ @Override
+ protected void addStandardPhraseModifiers(PatternBasedSyntax phraseModifierSyntax) {
+ boolean escapingHtml = configuration == null ? false : configuration.isEscapingHtmlAndXml();
+
+ phraseModifierSyntax.add(new HtmlEndTagPhraseModifier(escapingHtml));
+ phraseModifierSyntax.add(new HtmlStartTagPhraseModifier(escapingHtml));
+ phraseModifierSyntax.beginGroup("(?:(?<=[\\s\\.,\\\"'?!;:\\)\\(\\{\\}\\[\\]])|^)(?:", 0); //$NON-NLS-1$
+ phraseModifierSyntax.add(new EscapeTextilePhraseModifier());
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("**", SpanType.BOLD, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("??", SpanType.CITATION, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("__", SpanType.ITALIC, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("_", SpanType.EMPHASIS, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("*", SpanType.STRONG, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("+", SpanType.INSERTED, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("~", SpanType.SUBSCRIPT, Mode.NORMAL)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("^", SpanType.SUPERSCRIPT, Mode.NORMAL)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("@", SpanType.CODE, Mode.SPECIAL)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("%", SpanType.SPAN, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimpleTextilePhraseModifier("-", SpanType.DELETED, Mode.NESTING)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new ImageTextilePhraseModifier());
+ phraseModifierSyntax.endGroup(")(?=\\W|$)", 0); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void addStandardTokens(PatternBasedSyntax tokenSyntax) {
+ tokenSyntax.add(new EntityReferenceReplacementToken("(tm)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(TM)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(c)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(C)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(r)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(R)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new HyperlinkReplacementToken());
+ tokenSyntax.add(new FootnoteReferenceReplacementToken());
+ if (configuration == null || !configuration.isOptimizeForRepositoryUsage()) {
+ tokenSyntax.add(new EntityWrappingReplacementToken("\"", "#8220", "#8221")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ tokenSyntax.add(new EntityWrappingReplacementToken("'", "#8216", "#8217")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w)(')(?=\\w))", "#8217")); // apostrophe //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w\\s)(--)(?=\\s\\w))", "#8212")); // emdash //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w\\s)(-)(?=\\s\\w))", "#8211")); // endash //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\d\\s)(x)(?=\\s\\d))", "#215")); // mul //$NON-NLS-1$ //$NON-NLS-2$
+ if (configuration == null || !configuration.isOptimizeForRepositoryUsage()) {
+ tokenSyntax.add(new AcronymReplacementToken());
+ }
+ }
+
+ @Override
+ protected Block createParagraphBlock() {
+ ParagraphBlock paragraphBlock = new ParagraphBlock();
+ if (configuration != null && !configuration.isEnableUnwrappedParagraphs()) {
+ paragraphBlock.setEnableUnwrapped(false);
+ }
+ return paragraphBlock;
+ }
+
+ /**
+ * indicate if footnotes should be preprocessed to avoid false-positives when footnote references are used
+ * inadvertently. The default is false.
+ */
+ public boolean isPreprocessFootnotes() {
+ return preprocessFootnotes;
+ }
+
+ /**
+ * indicate if footnotes should be preprocessed to avoid false-positives when footnote references are used
+ * inadvertently. The default is false.
+ */
+ public void setPreprocessFootnotes(boolean preprocessFootnotes) {
+ this.preprocessFootnotes = preprocessFootnotes;
+ }
+
+ @Override
+ public void configure(MarkupLanguageConfiguration configuration) throws UnsupportedOperationException {
+ if (configuration.isOptimizeForRepositoryUsage()) {
+ setPreprocessFootnotes(true);
+ }
+ super.configure(configuration);
+ }
+
+ @Override
+ public TextileLanguage clone() {
+ TextileLanguage copy = (TextileLanguage) super.clone();
+ copy.preprocessFootnotes = preprocessFootnotes;
+ return copy;
+ }
+
+ @Override
+ public void processContent(MarkupParser parser, String markupContent, boolean asDocument) {
+ if (preprocessFootnotes) {
+ boolean previousBlocksOnly = isBlocksOnly();
+ boolean previousFilterGenerativeContents = isFilterGenerativeContents();
+ setBlocksOnly(true);
+ setFilterGenerativeContents(true);
+
+ DocumentBuilder builder = parser.getBuilder();
+ parser.setBuilder(new NoOpDocumentBuilder());
+ currentState = new TextileContentState();
+ TextileContentState preprocessingState = currentState;
+ super.processContent(parser, markupContent, asDocument);
+
+ setBlocksOnly(previousBlocksOnly);
+ setFilterGenerativeContents(previousFilterGenerativeContents);
+
+ currentState = new TextileContentState();
+ currentState.setFootnoteNumbers(preprocessingState.getFootnoteNumbers());
+ parser.setBuilder(builder);
+ super.processContent(parser, markupContent, asDocument);
+
+ currentState = null;
+ } else {
+ currentState = null;
+ super.processContent(parser, markupContent, asDocument);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.classpath b/org.eclipse.mylyn.wikitext.textile.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.cvsignore b/org.eclipse.mylyn.wikitext.textile.ui/.cvsignore
new file mode 100644
index 0000000..c07f541
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.cvsignore
@@ -0,0 +1 @@
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.project b/org.eclipse.mylyn.wikitext.textile.ui/.project
new file mode 100644
index 0000000..65348a9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.textile.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..a21d8c6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:44 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..97463c4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Thu Aug 14 22:16:05 PDT 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.internal=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.textile.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e162bab
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.textile.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.textile.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)"
+Bundle-Localization: plugin
+Export-Package: org.eclipse.mylyn.internal.wikitext.textile.ui;x-internal:=true
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/about.html b/org.eclipse.mylyn.wikitext.textile.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/build.properties b/org.eclipse.mylyn.wikitext.textile.ui/build.properties
new file mode 100644
index 0000000..7ba95a0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/build.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ help/
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/help/cheatSheet/Textile.textile b/org.eclipse.mylyn.wikitext.textile.ui/help/cheatSheet/Textile.textile
new file mode 100644
index 0000000..8c152f4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/help/cheatSheet/Textile.textile
@@ -0,0 +1,119 @@
+h3. Textile Markup Cheat Sheet
+
+h4. Phrase Modifiers
+
+| ==_emphasis_== | _emphasis_ |
+| ==*strong*== | *strong* |
+| ==__italic__== | __italic__ |
+| ==**bold**== | **bold** |
+| ==??citation??== | ??citation?? |
+| ==-deleted text-== | -deleted text- |
+| ==+inserted text+== | +inserted text+ |
+| ==^superscript^== | ^superscript^ |
+| ==~subscript~== | ~subscript~ |
+| ==%span%== | %span% |
+| ==@code@== | @code@ |
+
+h4. Block Modifiers
+
+| ==hn.== | Heading |
+| ==bq.== | Block quote |
+| ==fnn.== | Footnote |
+| ==p.== | Paragraph (optional) |
+| ==bc.== | Block code |
+| ==pre.== | Pre-formatted |
+| ==#== | Numeric list |
+| ==*== | Bulleted list |
+
+h4. Links
+
+=="title":http://www.example.com==
+==!images/logo.png!:http://www.example.com==
+
+h4. Images
+
+==!images/logo.png!==
+
+h4. Punctuation
+
+| =="quotes"== | "quotes" |
+| =='quotes'== | 'quotes' |
+| ==it's== | it's |
+| ==em -- dash== | em -- dash |
+| ==en - dash== | en - dash |
+| ==2 x 4== | 2 x 4 |
+| ==foo(tm)== | foo(tm) |
+| ==foo(r)== | foo(r) |
+
+h4. Lists
+
+h5. Bulleted Lists
+
+bc. * one
+** one.one
+** one.two
+* two
+
+* one
+** one.one
+** one.two
+* two
+
+h5. Numeric Lists
+
+bc. # one
+## one.one
+## one.two
+# two
+
+# one
+## one.one
+## one.two
+# two
+
+h4. Tables
+
+==|_. a|_. table|_. header|==
+==|a|table|row|==
+==|a|table|row|==
+
+h4. Alignment and Padding
+
+| < | left text alignment | eg: p<. |
+| > | right text alignment | eg: p>. |
+| <> | justify text | eg: p<>. |
+| = | center text | eg: p=. |
+| ( | pad left | eg: p(. |
+| ) | pad right | eg: p). |
+| () | pad left and right |
+
+h4. Attributes
+
+| (class) | eg: h1(foo). |
+| (#id) | eg: h1(foo). |
+| {style} | eg: h1{color:red}. |
+| [language] | eg: h1[en]. |
+
+example:
+
+==h1(main-heading){color: red}. header text==
+
+h4. Acronyms
+
+==ABW(A Better Way)==
+
+h4. Footnotes
+
+==reference[1]==
+==fn1. footnote text==
+
+h4. Extended Blocks
+
+==bc..==
+==bq..==
+==pre..==
+
+h4. Generated Content
+
+=={toc}== Generates a table of contents. Eg: =={toc}== or =={toc:style=disc|maxLevel=3}==
+=={glossary}== Generates a glossary based on acronyms in the document. Eg: =={glossary}== or =={glossary:style=disc}==
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/plugin.properties b/org.eclipse.mylyn.wikitext.textile.ui/plugin.properties
new file mode 100644
index 0000000..1dfc913
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/plugin.properties
@@ -0,0 +1,49 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+#Properties file for org.eclipse.mylyn.wikitext.textile.ui
+template.description.0 = _emphasis_
+template.description.1 = *strong*
+template.description.2 = __italic__
+template.description.3 = **bold**
+template.description.4 = @code@
+template.description.5 = ??citation??
+template.description.6 = -deleted-
+template.description.7 = +inserted+
+template.description.8 = ^superscript^
+template.description.9 = ~subscript~
+template.description.10 = Heading 1
+template.description.11 = Heading 2
+template.description.12 = Heading 3
+template.description.13 = Heading 4
+template.description.14 = Heading 5
+template.description.15 = Heading 6
+template.description.16 = Block code
+template.description.17 = Block code (extended)
+template.description.18 = Block quote
+template.description.19 = Block quote (extended)
+template.description.20 = Footnote
+template.description.21 = Paragraph
+template.description.22 = Pre-formatted text
+template.description.23 = Pre-formatted text (extended)
+template.description.24 = List (numeric)
+template.description.25 = List (level 2, numeric)
+template.description.26 = List (bulleted)
+template.description.27 = List (level 2, bulleted)
+template.description.28 = [1] footnote reference
+template.description.29 = Table of contents
+template.description.30 = Glossary
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Textile UI
+template.description.31 = Table
+template.description.32 = Table heading
+template.description.33 = Image
+template.description.34 = Hyperlink with title
+template.description.35 = %span%
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/plugin.xml b/org.eclipse.mylyn.wikitext.textile.ui/plugin.xml
new file mode 100644
index 0000000..e90ad5d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/plugin.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.cheatSheet">
+ <content
+ contentLanguage="Textile"
+ markupLanguage="Textile"
+ resource="help/cheatSheet/Textile.textile">
+ </content>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.contentAssist">
+
+ <templates
+ markupLanguage="Textile">
+ <!-- phrase modifiers -->
+ <template name="_" description="%template.description.0" content="_${text}_ $"/>
+ <template name="*" description="%template.description.1" content="*${text}* $"/>
+ <template name="__" description="%template.description.2" content="__${text}__ $"/>
+ <template name="**" description="%template.description.3" content="**${text}** $"/>
+ <template name="@" description="%template.description.4" content="@${text}@ $"/>
+ <template name="??" description="%template.description.5" content="??${text}?? $"/>
+ <template name="-" description="%template.description.6" content="-${text}- $"/>
+ <template name="+" description="%template.description.7" content="+${text}+ $"/>
+ <template name="^" description="%template.description.8" content="^${text}^ $"/>
+ <template name="~" description="%template.description.9" content="~${text}~ $"/>
+ <template name="%" description="%template.description.35" content="%%${text}% $"/>
+
+ <!-- block templates -->
+
+ <template name="h1. " description="%template.description.10" content="\nh1. ${text}\n\n" block="true"/>
+ <template name="h2. " description="%template.description.11" content="\nh2. ${text}\n\n" block="true"/>
+ <template name="h3. " description="%template.description.12" content="\nh3. ${text}\n\n" block="true"/>
+ <template name="h4. " description="%template.description.13" content="\nh4. ${text}\n\n" block="true"/>
+ <template name="h5. " description="%template.description.14" content="\nh5. ${text}\n\n" block="true"/>
+ <template name="h6. " description="%template.description.15" content="\nh6. ${text}\n\n" block="true"/>
+ <template name="bc. " description="%template.description.16" content="\nbc. ${text}\n\n" block="true"/>
+ <template name="bc.. " description="%template.description.17" content="\nbc.. ${text}\n\n" block="true"/>
+ <template name="bq. " description="%template.description.18" content="\nbq. ${text}\n\n" block="true"/>
+ <template name="bq.. " description="%template.description.19" content="\nbq.. ${text}\n\n" block="true"/>
+ <template name="fn. " description="%template.description.20" content="\nfn${number}. ${text}\n\n" block="true"/>
+ <template name="p. " description="%template.description.21" content="\np. ${text}\n\n" block="true"/>
+ <template name="pre. " description="%template.description.22" content="\npre. ${text}\n\n" block="true"/>
+ <template name="pre.. " description="%template.description.23" content="\npre.. ${text}\n\n" block="true"/>
+ <template name="# " description="%template.description.24" content="\n# ${text}\n# ${text2}\n\n" block="true"/>
+ <template name="## " description="%template.description.25" content="\n## ${text}\n## ${text2}\n\n" block="true"/>
+ <template name="* " description="%template.description.26" content="\n* ${text}\n* ${text2}\n\n" block="true"/>
+ <template name="** " description="%template.description.27" content="\n** ${text}\n** ${text2}\n\n" block="true"/>
+ <template name="[" description="%template.description.28" content="[${number}] $" block="true"/>
+ <template name="|" description="%template.description.31" content="\n| ${text} | ${text2} |\n| ${text3} | ${text4} |\n\n" block="true"/>
+ <template name="|_." description="%template.description.32" content="\n|_. ${text} |_. ${text2} |\n" block="true"/>
+
+ <template name="!" description="%template.description.33" content="!${text}! $"/>
+ <template name=""" description="%template.description.34" content=""${text}":${url} $"/>
+
+ <!-- generative templates -->
+ <template name="{toc}" description="%template.description.29" content="\n{toc}\n\n" block="true"/>
+ <template name="{glossary}" description="%template.description.30" content="\n{glossary}\n\n" block="true"/>
+
+ </templates>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.textile.ui/src/org/eclipse/mylyn/internal/wikitext/textile/ui/package-info.java b/org.eclipse.mylyn.wikitext.textile.ui/src/org/eclipse/mylyn/internal/wikitext/textile/ui/package-info.java
new file mode 100644
index 0000000..697adfe
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.textile.ui/src/org/eclipse/mylyn/internal/wikitext/textile/ui/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * @author David Green
+ */
+package org.eclipse.mylyn.internal.wikitext.textile.ui;
+
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.classpath b/org.eclipse.mylyn.wikitext.tracwiki.core/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.cvsignore b/org.eclipse.mylyn.wikitext.tracwiki.core/.cvsignore
new file mode 100644
index 0000000..c07f541
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.cvsignore
@@ -0,0 +1 @@
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.project b/org.eclipse.mylyn.wikitext.tracwiki.core/.project
new file mode 100644
index 0000000..87b2d36
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.tracwiki.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4705dd0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:46 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.tracwiki.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59c5fd7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.tracwiki.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.team.core;resolution:=optional
+Export-Package: org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.tracwiki.core.validation;x-internal:=true,
+ org.eclipse.mylyn.wikitext.tracwiki.core
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage b/org.eclipse.mylyn.wikitext.tracwiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
new file mode 100644
index 0000000..764a991
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
@@ -0,0 +1 @@
+org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/about.html b/org.eclipse.mylyn.wikitext.tracwiki.core/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/build.properties b/org.eclipse.mylyn.wikitext.tracwiki.core/build.properties
new file mode 100644
index 0000000..01810f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/plugin.properties b/org.eclipse.mylyn.wikitext.tracwiki.core/plugin.properties
new file mode 100644
index 0000000..60d8a42
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/plugin.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.tracwiki.core
+content-type.name.0 = TracWiki WikiText Markup
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText TracWiki
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/plugin.xml b/org.eclipse.mylyn.wikitext.tracwiki.core/plugin.xml
new file mode 100644
index 0000000..eeaca7c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupLanguage">
+ <language
+ class="org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage"
+ name="TracWiki"
+ fileExtensions="tracwiki">
+ </language>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.mylyn.wikitext"
+ file-extensions="tracwiki"
+ id="org.eclipse.mylyn.wikitext.tracwiki"
+ name="%content-type.name.0"
+ priority="normal">
+ </content-type>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="tracwiki"
+ type="text">
+ </fileTypes>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.tracwiki.core.validation.TracWikiReferenceValidationRule"
+ markupLanguage="TracWiki"/>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/HeadingBlock.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/HeadingBlock.java
new file mode 100644
index 0000000..39df3f2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/HeadingBlock.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HeadingBlock extends Block {
+
+ private static final Pattern pattern = Pattern.compile("\\s*(\\={1,6})\\s*([^=]*[^=\\s])\\s*\\1(?:\\s+\\#(\\S+)?)?\\s*"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = pattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount > 0) {
+ throw new IllegalStateException();
+ }
+ ++blockLineCount;
+
+ int level = matcher.group(1).length();
+
+ String text = matcher.group(2);
+
+ String id = matcher.group(3);
+
+ Attributes attributes = new Attributes();
+ attributes.setId(id);
+ if (attributes.getId() == null) {
+ attributes.setId(state.getIdGenerator().newId("h" + level, text)); //$NON-NLS-1$
+ }
+
+ builder.beginHeading(level, attributes);
+ builder.characters(text);
+ builder.endHeading();
+
+ setClosed(true);
+ return -1;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/ListBlock.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/ListBlock.java
new file mode 100644
index 0000000..ca96b1f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/ListBlock.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;
+
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.ListAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * List block, matches blocks that follow trac list rules (whitespace, then '*' or 1.)
+ *
+ * @author David Green
+ */
+public class ListBlock extends Block {
+
+ private static final int LINE_REMAINDER_GROUP_OFFSET = 4;
+
+ static final Pattern startPattern = Pattern.compile("(?:(\\s+)(?:(\\*|-)|(?:(\\d+)\\.)))\\s+(.*+)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private final Stack<ListState> listState = new Stack<ListState>();
+
+ public ListBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ ListAttributes attributes = new ListAttributes();
+ String spaces = matcher.group(1);
+ String listSpec = matcher.group(2);
+ String numericListSpec = matcher.group(3);
+
+ if (numericListSpec != null && !"1".equals(numericListSpec)) { //$NON-NLS-1$
+ attributes.setStart(numericListSpec);
+ }
+
+ int level = calculateLevel(spaces);
+
+ BlockType type = listSpec == null ? BlockType.NUMERIC_LIST : BlockType.BULLETED_LIST;
+
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ listState.push(new ListState(level, spaces.length(), type));
+ builder.beginBlock(type, attributes);
+ } else {
+ ListAttributes attributes = new ListAttributes();
+ Matcher matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ String spaces = matcher.group(1);
+ String listSpec = matcher.group(2);
+ String numericListSpec = matcher.group(3);
+
+ if (numericListSpec != null && !"1".equals(numericListSpec)) { //$NON-NLS-1$
+ attributes.setStart(numericListSpec);
+ }
+
+ int level = calculateLevel(spaces);
+
+ BlockType type = listSpec == null ? BlockType.NUMERIC_LIST : BlockType.BULLETED_LIST;
+
+ offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET);
+
+ for (ListState listState = this.listState.peek(); listState.level != level || listState.type != type; listState = this.listState.peek()) {
+ if (listState.level > level || (listState.level == level && listState.type != type)) {
+ closeOne();
+ if (this.listState.isEmpty()) {
+ this.listState.push(new ListState(1, spaces.length(), type));
+ builder.beginBlock(type, attributes);
+ }
+ } else {
+ this.listState.push(new ListState(level, spaces.length(), type));
+ builder.beginBlock(type, attributes);
+ }
+ }
+ }
+ ++blockLineCount;
+
+ ListState listState = this.listState.peek();
+ if (listState.openItem) {
+ builder.endBlock();
+ }
+ listState.openItem = true;
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ private int calculateLevel(String spaces) {
+ int length = spaces.length();
+ if (length == 0) {
+ throw new IllegalStateException();
+ }
+ int level = 1;
+ for (int x = 1; x < listState.size(); ++x) {
+ ListState state = listState.get(x);
+ if (state.numSpaces <= length) {
+ level = state.level;
+ } else {
+ break;
+ }
+ }
+ if (!listState.isEmpty()) {
+ ListState outerState = listState.peek();
+ if (level == outerState.level && length > outerState.numSpaces) {
+ level = outerState.level + 1;
+ }
+ }
+ return level;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ while (!listState.isEmpty()) {
+ closeOne();
+ }
+ }
+ super.setClosed(closed);
+ }
+
+ private void closeOne() {
+ ListState e = listState.pop();
+ if (e.openItem) {
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ private static class ListState {
+ int level;
+
+ int numSpaces;
+
+ BlockType type;
+
+ boolean openItem;
+
+ private ListState(int level, int numSpaces, BlockType type) {
+ super();
+ this.level = level;
+ this.numSpaces = numSpaces;
+ this.type = type;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/ParagraphBlock.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/ParagraphBlock.java
new file mode 100644
index 0000000..f729cb9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/ParagraphBlock.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * Matches any textile text, including lines starting with <code>p. </code>.
+ *
+ * @author David Green
+ */
+public class ParagraphBlock extends Block {
+
+ private int blockLineCount = 0;
+
+ public ParagraphBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ }
+
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return -1;
+ }
+ ++blockLineCount;
+
+ TracWikiLanguage markupLanguage = (TracWikiLanguage) getMarkupLanguage();
+
+ // paragraphs can have nested lists and other things
+ for (Block block : markupLanguage.getParagraphBreakingBlocks()) {
+ if (block.canStart(line, offset)) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ if (blockLineCount != 1) {
+ // note: newlines don't automatically convert to line breaks
+ builder.characters("\n"); //$NON-NLS-1$
+ }
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ return true;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/PreformattedBlock.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/PreformattedBlock.java
new file mode 100644
index 0000000..ecabc92
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/PreformattedBlock.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase.MonospacePhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * A preformatted block is delimited by tripple-curlies {{{ }}}
+ *
+ * @author David Green
+ *
+ * @see MonospacePhraseModifier
+ */
+public class PreformattedBlock extends Block {
+
+ private static final Pattern startPattern = Pattern.compile("\\{\\{\\{(\\s*)"); //$NON-NLS-1$
+
+ private static final Pattern endPattern = Pattern.compile("\\}\\}\\}(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount++ == 0) {
+ offset = matcher.start(1);
+ builder.beginBlock(BlockType.PREFORMATTED, new Attributes());
+ } else {
+ Matcher endMatcher = endPattern.matcher(line);
+ if (endMatcher.matches()) {
+ setClosed(true);
+ return endMatcher.start(1);
+ }
+ }
+ builder.characters(offset == 0 ? line : line.substring(offset));
+ builder.characters("\n"); //$NON-NLS-1$
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // pre
+ }
+ super.setClosed(closed);
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/QuoteBlock.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/QuoteBlock.java
new file mode 100644
index 0000000..393c553
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/QuoteBlock.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;
+
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * quoted text block, matches blocks that start with <code>></code> or two spaces. These are what they call
+ * discussion citations and block quotes, respectively. Creates an extended block type of {@link ParagraphBlock
+ * paragraph}.
+ *
+ * @author David Green
+ */
+public class QuoteBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("(?:(?:(>+)\\s+)|( ))(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private Stack<BlockState> quoteBlockState;
+
+ public QuoteBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ quoteBlockState = new Stack<BlockState>();
+ } else {
+ matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ }
+ String quoteStartGroup = matcher.group(1);
+ int level = quoteStartGroup == null ? 1 : quoteStartGroup.length();
+ offset = matcher.start(3);
+
+ while (quoteBlockState.size() > level) {
+ closeOne();
+ }
+ while (quoteBlockState.size() < level) {
+ openOne(new Attributes());
+ }
+
+ BlockState blockState = quoteBlockState.peek();
+ if (!blockState.paraOpen) {
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ blockState.paraOpen = true;
+ } else if (blockLineCount != 0) {
+ builder.lineBreak();
+ }
+ ++blockLineCount;
+
+ getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ private void openOne(Attributes attributes) {
+ if (!quoteBlockState.isEmpty()) {
+ BlockState blockState = quoteBlockState.peek();
+ if (blockState.paraOpen) {
+ blockState.paraOpen = false;
+ builder.endBlock();
+ }
+ }
+ builder.beginBlock(BlockType.QUOTE, attributes);
+ quoteBlockState.push(new BlockState());
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ quoteBlockState = null;
+ blockLineCount = 0;
+ matcher = startPattern.matcher(line);
+ if (lineOffset > 0) {
+ matcher.region(lineOffset, line.length());
+ }
+ return matcher.matches();
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ while (quoteBlockState != null && !quoteBlockState.isEmpty()) {
+ closeOne();
+ }
+ quoteBlockState = null;
+ }
+ super.setClosed(closed);
+ }
+
+ private void closeOne() {
+ BlockState blockState = quoteBlockState.pop();
+ if (blockState.paraOpen) {
+ builder.endBlock(); // para
+ }
+ builder.endBlock(); // quote
+ }
+
+ private static class BlockState {
+ boolean paraOpen;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/TableBlock.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/TableBlock.java
new file mode 100644
index 0000000..a797af8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/block/TableBlock.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * Table block, matches any line that looks like a table row.
+ *
+ * @author David Green
+ */
+public class TableBlock extends Block {
+
+ static final Pattern tableRowPattern = Pattern.compile("(\\|\\|(.*)?(\\|\\|\\s*$))"); //$NON-NLS-1$
+
+ static final Pattern TABLE_ROW_PATTERN = Pattern.compile("\\|\\|\\s*([^\\|]*)\\s*(\\|\\|\\s*$)?"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ public TableBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ builder.beginBlock(BlockType.TABLE, attributes);
+ } else {
+ matcher = tableRowPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ }
+ ++blockLineCount;
+
+ String textileLine = offset == 0 ? line : line.substring(offset);
+ Matcher rowMatcher = TABLE_ROW_PATTERN.matcher(textileLine);
+ if (!rowMatcher.find()) {
+ setClosed(true);
+ return 0;
+ }
+
+ builder.beginBlock(BlockType.TABLE_ROW, new Attributes());
+
+ do {
+ int start = rowMatcher.start();
+ if (start == textileLine.length() - 1) {
+ break;
+ }
+
+ String text = rowMatcher.group(1);
+ int textOffset = rowMatcher.start(1);
+
+ Attributes attributes = new Attributes();
+ state.setLineCharacterOffset(start);
+ builder.beginBlock(BlockType.TABLE_CELL_NORMAL, attributes);
+
+ markupLanguage.emitMarkupLine(getParser(), state, textOffset, text, 0);
+
+ builder.endBlock(); // table cell
+ } while (rowMatcher.find());
+
+ builder.endBlock(); // table row
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ if (lineOffset == 0) {
+ matcher = tableRowPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/DeletedPhraseModifier.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/DeletedPhraseModifier.java
new file mode 100644
index 0000000..976e96b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/DeletedPhraseModifier.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+
+public class DeletedPhraseModifier extends SimplePhraseModifier {
+
+ public DeletedPhraseModifier() {
+ super("--", SpanType.DELETED, true); //$NON-NLS-1$
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?<!-)" + super.getPattern(groupOffset) + "(?!-)"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/EscapePhraseModifier.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/EscapePhraseModifier.java
new file mode 100644
index 0000000..961b519
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/EscapePhraseModifier.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class EscapePhraseModifier extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String escapedContent = "(\\S(?:.*?\\S)?)"; //$NON-NLS-1$
+ return "(?:(?:`" + escapedContent + // content //$NON-NLS-1$
+ "`)|(?:\\{\\{" + escapedContent + // content //$NON-NLS-1$
+ "\\}\\}))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new EscapeProcessor();
+ }
+
+ private static class EscapeProcessor extends PatternBasedElementProcessor {
+
+ private EscapeProcessor() {
+ }
+
+ @Override
+ public void emit() {
+ getBuilder().beginSpan(SpanType.MONOSPACE, new Attributes());
+ String group = group(1);
+ if (group == null) {
+ group = group(2);
+ }
+ getBuilder().characters(group);
+ getBuilder().endSpan();
+
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/MonospacePhraseModifier.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/MonospacePhraseModifier.java
new file mode 100644
index 0000000..09f5b6f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/MonospacePhraseModifier.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ * A preformatted block is delimited by tripple-curlies {{{ }}}
+ *
+ * @author David Green
+ */
+public class MonospacePhraseModifier extends PatternBasedElement {
+
+ public class MonospaceElementProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ getBuilder().beginSpan(SpanType.MONOSPACE, new Attributes());
+ getBuilder().characters(group(1));
+ getBuilder().endSpan();
+ }
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "\\{\\{\\{(.*?)\\}\\}\\}"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new MonospaceElementProcessor();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/SimplePhraseModifier.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/SimplePhraseModifier.java
new file mode 100644
index 0000000..dae1f15
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/SimplePhraseModifier.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimplePhraseModifier extends SimpleWrappedPhraseModifier {
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType) {
+ super(delimiter, delimiter, new SpanType[] { spanType });
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType, boolean nesting) {
+ super(delimiter, delimiter, new SpanType[] { spanType }, nesting);
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType[] spanType) {
+ super(delimiter, delimiter, spanType);
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType[] spanType, boolean nesting) {
+ super(delimiter, delimiter, spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/SimpleWrappedPhraseModifier.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/SimpleWrappedPhraseModifier.java
new file mode 100644
index 0000000..b6cfc5f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/phrase/SimpleWrappedPhraseModifier.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimpleWrappedPhraseModifier extends PatternBasedElement {
+
+ protected static final int CONTENT_GROUP = 1;
+
+ private static class SimplePhraseModifierProcessor extends PatternBasedElementProcessor {
+ private final SpanType[] spanType;
+
+ private final boolean nesting;
+
+ public SimplePhraseModifierProcessor(SpanType[] spanType, boolean nesting) {
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ public void emit() {
+ for (SpanType type : spanType) {
+ getBuilder().beginSpan(type, new Attributes());
+ }
+ if (nesting) {
+ getMarkupLanguage().emitMarkupLine(parser, state, getStart(this), getContent(this), 0);
+ } else {
+ getMarkupLanguage().emitMarkupText(parser, state, getContent(this));
+ }
+ for (int x = 0; x < spanType.length; ++x) {
+ getBuilder().endSpan();
+ }
+ }
+ }
+
+ private final String startDelimiter;
+
+ private final String endDelimiter;
+
+ private final SpanType[] spanType;
+
+ private final boolean nesting;
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType[] spanType) {
+ this(startDelimiter, endDelimiter, spanType, false);
+ }
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType[] spanType, boolean nesting) {
+ this.startDelimiter = startDelimiter;
+ this.endDelimiter = endDelimiter;
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ String pattern = Pattern.quote(startDelimiter) + "([^\\s-](?:.*?[^\\s-])?)(?:(?<=[^!])" + // content: note that we dont allow preceding '-' or trailing '-' to avoid conflict with strikethrough and emdash //$NON-NLS-1$
+ Pattern.quote(endDelimiter) + ")"; //$NON-NLS-1$
+ return pattern;
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ protected static String getContent(PatternBasedElementProcessor processor) {
+ return processor.group(CONTENT_GROUP);
+ }
+
+ protected static int getStart(PatternBasedElementProcessor processor) {
+ return processor.start(CONTENT_GROUP);
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SimplePhraseModifierProcessor(spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/BangEscapeToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/BangEscapeToken.java
new file mode 100644
index 0000000..3a6e4ed
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/BangEscapeToken.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.LiteralPhraseModifierProcessor;
+
+/**
+ * A token replacement that replaces any two characters that start with a '!' and are followed by a trac markup
+ * character
+ *
+ * @author David Green
+ *
+ */
+public class BangEscapeToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "!(['\\}\\{\\^,_\\-])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LiteralPhraseModifierProcessor(false);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/ChangesetLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/ChangesetLinkReplacementToken.java
new file mode 100644
index 0000000..b38c999
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/ChangesetLinkReplacementToken.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to Trac changesets, eg: <code>r1</code> or <code>[1]</code> or <code>[1/trunk]</code> or
+ * <code>changeset:1</code> or <code>changeset:1/trunk</code>
+ *
+ * @author David Green
+ */
+public class ChangesetLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(r(\\d+))|(\\[(\\d+)(?:/(\\w+))?\\])|(changeset:(\\d+)(?:/(\\w+))?)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 8;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new ChangesetReplacementTokenProcessor();
+ }
+
+ private static class ChangesetReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String changesetId = group(2);
+ String restriction = null;
+ if (changesetId == null) {
+ text = group(3);
+ changesetId = group(4);
+ restriction = group(5);
+ if (changesetId == null) {
+ text = group(6);
+ changesetId = group(7);
+ restriction = group(8);
+ }
+ }
+ String href = ((TracWikiLanguage) markupLanguage).toChangesetHref(changesetId, restriction);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/HyperlinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/HyperlinkReplacementToken.java
new file mode 100644
index 0000000..e57e611
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/HyperlinkReplacementToken.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes explicit hyperlink syntax that uses '[' and ']' delimiters
+ *
+ * @author David Green
+ */
+public class HyperlinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "\\[\\s*(wiki:)?([^\\]\\s]+)\\s*([^\\]]+)?\\s*\\]"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 3;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new HyperlinkReplacementTokenProcessor();
+ }
+
+ private static class HyperlinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String wikiUrl = group(1);
+ String href = group(2);
+ String text = group(3);
+ if (text == null) {
+ text = href;
+ } else {
+ text = text.trim();
+ if (text.length() == 0) {
+ text = href;
+ }
+ }
+ if (wikiUrl != null) {
+ href = ((TracWikiLanguage) markupLanguage).toInternalHref(href);
+ }
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/LineBreakToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/LineBreakToken.java
new file mode 100644
index 0000000..ba1923f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/LineBreakToken.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class LineBreakToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(\\[\\[BR\\]\\])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LineBreakProcessor();
+ }
+
+ private static class LineBreakProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ builder.lineBreak();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/MilestoneLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/MilestoneLinkReplacementToken.java
new file mode 100644
index 0000000..8282d75
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/MilestoneLinkReplacementToken.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to Trac milestones, eg: <code>milestone:1</code>
+ *
+ * @author David Green
+ */
+public class MilestoneLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(milestone:([0-9a-zA-Z_\\.-]+))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LinkReplacementTokenProcessor();
+ }
+
+ private static class LinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String milestoneId = group(2);
+
+ String href = ((TracWikiLanguage) markupLanguage).toMilestoneHref(milestoneId);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/ReportLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/ReportLinkReplacementToken.java
new file mode 100644
index 0000000..202f58d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/ReportLinkReplacementToken.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to Trac reports, eg: <code>{1}</code> or <code>report:1</code>
+ *
+ * @author David Green
+ */
+public class ReportLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(\\{(\\d+)\\})|(report:(\\d+))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 4;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new ReportLinkReplacementTokenProcessor();
+ }
+
+ private static class ReportLinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String reportId = group(2);
+ if (reportId == null) {
+ text = group(3);
+ reportId = group(4);
+ }
+ String href = ((TracWikiLanguage) markupLanguage).toReportHref(reportId);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/RevisionLogReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/RevisionLogReplacementToken.java
new file mode 100644
index 0000000..0bb2cad
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/RevisionLogReplacementToken.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to Trac revision logs, eg: <code>r1:3</code> or <code>[1:3]</code> or <code>log:@1:3</code> or
+ * <code>log:trunk at 1:3</code> or <code>[2:5/trunk]</code>
+ *
+ * @author David Green
+ */
+public class RevisionLogReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(r(\\d+):(\\d+))|(\\[(\\d+):(\\d+)(?:/(\\w+))?\\])|(log:(?:(\\w+))?@(\\d+):(\\d+))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 11;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new RevisionLogReplacementTokenProcessor();
+ }
+
+ private static class RevisionLogReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String revision1 = group(2);
+ String revision2 = group(3);
+ String restriction = null;
+ if (revision1 == null) {
+ text = group(4);
+ revision1 = group(5);
+ revision2 = group(6);
+ restriction = group(7);
+ if (revision1 == null) {
+ text = group(8);
+ revision1 = group(10);
+ revision2 = group(11);
+ restriction = group(9);
+ }
+ }
+ String href = ((TracWikiLanguage) markupLanguage).toRevisionLogHref(revision1, revision2, restriction);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/SourceLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/SourceLinkReplacementToken.java
new file mode 100644
index 0000000..e2db9b9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/SourceLinkReplacementToken.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to the Trac source browser, eg: <code>source:/trunk/COPYING</code> or
+ * <code>source:/trunk/COPYING at 200</code> or <code>source:/trunk/COPYING at 200#L26</code>
+ *
+ * @author David Green
+ */
+public class SourceLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(source:([^\\s@#]+)(?:@(\\d+))?(?:#L(\\d+))?)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 4;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LinkReplacementTokenProcessor();
+ }
+
+ private static class LinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String source = group(2);
+ String revision = group(3);
+ String line = group(4);
+ String href = ((TracWikiLanguage) markupLanguage).toSourceBrowserHref(source, revision, line);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/TicketAttachmentLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/TicketAttachmentLinkReplacementToken.java
new file mode 100644
index 0000000..c4d2adc
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/TicketAttachmentLinkReplacementToken.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to Trac ticket attachments, eg: <code>attachment:patch1.txt:ticket:234</code>
+ *
+ * @author David Green
+ */
+public class TicketAttachmentLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(attachment:([^\\s:]+):ticket:(\\d+))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 3;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LinkReplacementTokenProcessor();
+ }
+
+ private static class LinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String attachment = group(2);
+ String ticketId = group(3);
+
+ String href = ((TracWikiLanguage) markupLanguage).toTicketAttachmentHref(ticketId, attachment);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/TicketLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/TicketLinkReplacementToken.java
new file mode 100644
index 0000000..6f1ffb7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/TicketLinkReplacementToken.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * recognizes links to Trac tickets, eg: <code>#1</code> or <code>ticket:1</code> or <code>comment:1:ticket:2</code>
+ *
+ * @author David Green
+ */
+public class TicketLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "((?:comment:(\\d+):)?(?:#|ticket:)(\\d+))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 3;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new TicketLinkReplacementTokenProcessor();
+ }
+
+ private static class TicketLinkReplacementTokenProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String text = group(1);
+ String ticketId = group(3);
+ String commentNumber = group(2);
+ String href = ((TracWikiLanguage) markupLanguage).toTicketHref(ticketId, commentNumber);
+ builder.link(href, text);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/WikiWordReplacementToken.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/WikiWordReplacementToken.java
new file mode 100644
index 0000000..8d283a9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/token/WikiWordReplacementToken.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ * Holger Voormann - fix for bug 279029
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.token;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+/**
+ * Matches WikiWord internal hyperlinks.
+ *
+ * @author David Green
+ * @see TracWikiLanguage#isAutoLinking()
+ */
+public class WikiWordReplacementToken extends PatternBasedElement {
+
+ private static final Pattern replacementPattern = Pattern.compile("\\W"); //$NON-NLS-1$
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(?<![a-zA-Z])(!)?([A-Z][a-z]+([A-Z][a-z]+)+)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new WikiWordProcessor();
+ }
+
+ private class WikiWordProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String escaped = group(1);
+ String word = group(2);
+ TracWikiLanguage twikiLanguage = (TracWikiLanguage) markupLanguage;
+ if (escaped != null || !twikiLanguage.isAutoLinking()) {
+ builder.characters(word);
+ } else {
+ String target = replacementPattern.matcher(word).replaceAll(""); //$NON-NLS-1$
+ boolean exists = twikiLanguage.computeInternalLinkExists(target);
+
+ String internalHref = twikiLanguage.toInternalHref(target);
+ if (!exists) {
+ builder.characters(word);
+ builder.link(internalHref, "?"); //$NON-NLS-1$
+ } else {
+ builder.link(internalHref, word);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/validation/TracWikiReferenceValidationRule.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/validation/TracWikiReferenceValidationRule.java
new file mode 100644
index 0000000..0efc966
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/internal/wikitext/tracwiki/core/validation/TracWikiReferenceValidationRule.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.tracwiki.core.validation;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.validation.DocumentLocalReferenceValidationRule;
+import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage;
+
+public class TracWikiReferenceValidationRule extends DocumentLocalReferenceValidationRule {
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new TracWikiLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/wikitext/tracwiki/core/TracWikiLanguage.java b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/wikitext/tracwiki/core/TracWikiLanguage.java
new file mode 100644
index 0000000..43402c5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.core/src/org/eclipse/mylyn/wikitext/tracwiki/core/TracWikiLanguage.java
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.tracwiki.core;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.block.HeadingBlock;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.block.ListBlock;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.block.ParagraphBlock;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.block.PreformattedBlock;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.block.QuoteBlock;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.block.TableBlock;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase.DeletedPhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase.EscapePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase.MonospacePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.phrase.SimplePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.BangEscapeToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.ChangesetLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.HyperlinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.LineBreakToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.MilestoneLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.ReportLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.RevisionLogReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.SourceLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.TicketAttachmentLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.TicketLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.tracwiki.core.token.WikiWordReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.AbstractMarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.ImpliedHyperlinkReplacementToken;
+
+/**
+ * An implementation of the <a href="http://trac.edgewall.org/wiki/TracWiki">TracWiki</a> markup language.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class TracWikiLanguage extends AbstractMarkupLanguage {
+
+ private boolean autoLinking = true;
+
+ private String serverUrl;
+
+ public TracWikiLanguage() {
+ setName("TracWiki"); //$NON-NLS-1$
+ }
+
+ /**
+ * Convert a page name to an href to the page.
+ *
+ * @param pageName
+ * the name of the page to target
+ *
+ * @return the href to access the page
+ *
+ * @see MarkupLanguage#getInternalLinkPattern()
+ */
+ public String toInternalHref(String pageName) {
+ String pageId = pageName;
+ if (pageId.startsWith("#")) { //$NON-NLS-1$
+ // internal anchor
+ return pageId;
+ }
+ return MessageFormat.format(internalLinkPattern, pageId);
+ }
+
+ /**
+ * convert a ticket id to a hyperlink based on the {@link #getServerUrl() server url}
+ *
+ * @param ticketId
+ * the id of the ticket
+ * @param commentNumber
+ * the comment number or null if the url should not reference a specific comment
+ */
+ public String toTicketHref(String ticketId, String commentNumber) {
+ String url = serverUrl + "ticket/" + ticketId; //$NON-NLS-1$
+ if (commentNumber != null) {
+ url += "#comment:" + commentNumber; //$NON-NLS-1$
+ }
+ return url;
+ }
+
+ /**
+ * convert a changeset id to a hyperlink based on the {@link #getServerUrl() server url}
+ *
+ * @param changesetId
+ * the changeset id
+ * @param restriction
+ * the restriction, or null if there is no restriction. eg: "trunk"
+ */
+ public String toChangesetHref(String changesetId, String restriction) {
+ String url = serverUrl + "changeset/" + changesetId; //$NON-NLS-1$
+ if (restriction != null) {
+ url += "/" + restriction; //$NON-NLS-1$
+ }
+ return url;
+ }
+
+ /**
+ * convert a revisions to a revision log hyperlink based on the {@link #getServerUrl() server url}
+ *
+ * @param revision1
+ * the first revision
+ * @param revision2
+ * the second revision
+ * @param restriction
+ * the restriction, or null if there is no restriction. eg: "trunk"
+ */
+ public String toRevisionLogHref(String revision1, String revision2, String restriction) {
+ String url = serverUrl + "log/"; //$NON-NLS-1$
+ if (restriction != null) {
+ url += restriction;
+ }
+ url += "?revs=" + revision1 + "-" + revision2; //$NON-NLS-1$ //$NON-NLS-2$
+ return url;
+ }
+
+ /**
+ * convert a report id to a hyperlink based on the {@link #getServerUrl() server url}
+ *
+ * @param reportId
+ * the id of the report
+ */
+ public String toReportHref(String reportId) {
+ String url = serverUrl + "report/" + reportId; //$NON-NLS-1$
+ return url;
+ }
+
+ /**
+ * convert a milestone id to a hyperlink based on the {@link #getServerUrl() server url}
+ *
+ * @param milestoneId
+ * the id of the milesonte
+ */
+ public String toMilestoneHref(String milestoneId) {
+ String url = serverUrl + "milestone/" + milestoneId; //$NON-NLS-1$
+ return url;
+ }
+
+ /**
+ * create an URL to an attachment ticket based on the {@link #getServerUrl() server url}
+ *
+ * @param ticketId
+ * the id of the ticket
+ * @param attachment
+ * the name of the attachment
+ */
+ public String toTicketAttachmentHref(String ticketId, String attachment) {
+ String url = serverUrl + "ticket/" + ticketId + "/" + attachment; //$NON-NLS-1$ //$NON-NLS-2$
+ return url;
+ }
+
+ /**
+ * create an URL to the source browser
+ *
+ * @param source
+ * the source to be viewed
+ * @param revision
+ * the revision, or null if there is no revision
+ * @param line
+ * the line, or null if there is no line
+ */
+ public String toSourceBrowserHref(String source, String revision, String line) {
+ String url = serverUrl + "browser"; //$NON-NLS-1$
+ if (source.charAt(0) != '/') {
+ url += '/';
+ }
+ url += source;
+ if (revision != null) {
+ url += "?rev=" + revision; //$NON-NLS-1$
+ }
+ if (line != null) {
+ url += "#L" + line; //$NON-NLS-1$
+ }
+ return url;
+ }
+
+ /**
+ * for the purpose of converting wiki words into links, determine if the wiki word exists.
+ *
+ * @see WikiWordReplacementToken
+ */
+ public boolean computeInternalLinkExists(String link) {
+ return true;
+ }
+
+ /**
+ * Indicate if the markup should match WikiWords as hyperlinks. The default is true.
+ */
+ public boolean isAutoLinking() {
+ return autoLinking;
+ }
+
+ /**
+ * Indicate if the markup should match WikiWords as hyperlinks. The default is true.
+ */
+ public void setAutoLinking(boolean autoLinking) {
+ this.autoLinking = autoLinking;
+ }
+
+ /**
+ * set the server URL, for example <code>http://trac.edgewall.org/</code> from which links may be derrived, such as
+ * <code>http://trac.edgewall.org/wiki/WikiPage</code> or <code>http://trac.edgewall.org/tickets/1</code>
+ *
+ * @param url
+ * the url, or null if it is unknown.
+ */
+ public void setServerUrl(String url) {
+ if (url != null && !url.endsWith("/")) { //$NON-NLS-1$
+ url = url + "/"; //$NON-NLS-1$
+ }
+ serverUrl = url;
+ }
+
+ /**
+ * the server URL, for example <code>http://trac.edgewall.org/</code> from which links may be derrived, such as
+ * <code>http://trac.edgewall.org/wiki/WikiPage</code> or <code>http://trac.edgewall.org/tickets/1</code>
+ *
+ * @see #setServerUrl(String)
+ */
+ public String getServerUrl() {
+ return serverUrl;
+ }
+
+ @Override
+ protected void addStandardBlocks(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ // TODO: images, macros, processors
+
+ ListBlock listBlock = new ListBlock();
+ blocks.add(listBlock);
+ paragraphBreakingBlocks.add(listBlock);
+ HeadingBlock headingBlock = new HeadingBlock();
+ blocks.add(headingBlock);
+ paragraphBreakingBlocks.add(headingBlock);
+ PreformattedBlock preformattedBlock = new PreformattedBlock();
+ blocks.add(preformattedBlock);
+ paragraphBreakingBlocks.add(preformattedBlock);
+ QuoteBlock quoteBlock = new QuoteBlock();
+ blocks.add(quoteBlock);
+ paragraphBreakingBlocks.add(quoteBlock);
+ TableBlock tableBlock = new TableBlock();
+ blocks.add(tableBlock);
+ paragraphBreakingBlocks.add(tableBlock);
+
+ }
+
+ @Override
+ protected void addStandardPhraseModifiers(PatternBasedSyntax phraseModifierSyntax) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+ phraseModifierSyntax.add(new MonospacePhraseModifier());
+ phraseModifierSyntax.beginGroup("(?:(?<=[\\s\\.\\\"'?!;:\\)\\(\\{\\}\\[\\]-])|^)(?:", 0); // always starts at the start of a line or after a non-word character excluding '!' and '-' //$NON-NLS-1$
+ phraseModifierSyntax.add(new EscapePhraseModifier());
+ phraseModifierSyntax.add(new SimplePhraseModifier("'''''", new SpanType[] { SpanType.BOLD, SpanType.ITALIC }, //$NON-NLS-1$
+ true));
+ phraseModifierSyntax.add(new SimplePhraseModifier("'''", SpanType.BOLD, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("''", SpanType.ITALIC, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("__", SpanType.UNDERLINED, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new DeletedPhraseModifier());
+ phraseModifierSyntax.add(new SimplePhraseModifier("^", SpanType.SUPERSCRIPT, true)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier(",,", SpanType.SUBSCRIPT, true)); //$NON-NLS-1$
+ phraseModifierSyntax.endGroup(")(?=\\W|$)", 0); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void addStandardTokens(PatternBasedSyntax tokenSyntax) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+ tokenSyntax.add(new BangEscapeToken());
+ tokenSyntax.add(new LineBreakToken());
+ tokenSyntax.beginGroup("(?:(?<=[\\s\\.\\\"'?!;:\\)\\(\\{\\}\\[\\]-])|^)(?:", 0); // always starts at the start of a line or after a non-word character excluding '!' and '-' //$NON-NLS-1$
+ tokenSyntax.add(new RevisionLogReplacementToken());
+ tokenSyntax.add(new ChangesetLinkReplacementToken());
+ tokenSyntax.add(new HyperlinkReplacementToken());
+ tokenSyntax.add(new ImpliedHyperlinkReplacementToken());
+ tokenSyntax.add(new TicketAttachmentLinkReplacementToken());
+ tokenSyntax.add(new TicketLinkReplacementToken());
+ tokenSyntax.add(new ReportLinkReplacementToken());
+ tokenSyntax.add(new MilestoneLinkReplacementToken());
+ tokenSyntax.add(new SourceLinkReplacementToken());
+ if (configuration == null || configuration.isWikiWordLinking() == null || configuration.isWikiWordLinking()) {
+ tokenSyntax.add(new WikiWordReplacementToken());
+ }
+ tokenSyntax.endGroup(")(?=\\W|$)", 0); //$NON-NLS-1$
+ }
+
+ @Override
+ protected Block createParagraphBlock() {
+ return new ParagraphBlock();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.classpath b/org.eclipse.mylyn.wikitext.tracwiki.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.project b/org.eclipse.mylyn.wikitext.tracwiki.ui/.project
new file mode 100644
index 0000000..dcca5f3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.tracwiki.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f1554b1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..b2ddfab
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:49 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.tracwiki.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d40975d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.tracwiki.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.tracwiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)"
+
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/about.html b/org.eclipse.mylyn.wikitext.tracwiki.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/build.properties b/org.eclipse.mylyn.wikitext.tracwiki.ui/build.properties
new file mode 100644
index 0000000..01810f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.properties b/org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.properties
new file mode 100644
index 0000000..bf8e7cf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.properties
@@ -0,0 +1,37 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText TracWiki UI
+
+template.description.0 = '''bold'''
+template.description.1 = ''italic''
+template.description.2 = '''''bold italic'''''
+template.description.3 = __underline__
+template.description.4 = {{{monospace}}}
+template.description.5 = ~~strike-through~~
+template.description.6 = ^superscript^
+template.description.7 = ,,subscript,,
+template.description.8 = Heading 1
+template.description.9 = Heading 2
+template.description.10 = Heading 3
+template.description.11 = Heading 4
+template.description.12 = Heading 5
+template.description.13 = Heading 6
+template.description.14 = List (bulleted)
+template.description.15 = List (level 2, bulleted)
+template.description.16 = List (numeric)
+template.description.17 = List (level 2, numeric)
+template.description.18 = Preformatted block
+template.description.19 = Block quote
+template.description.20 = Citation
+template.description.21 = Table
+template.description.22 = line break
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.xml b/org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.xml
new file mode 100644
index 0000000..9167511
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tracwiki.ui/plugin.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.contentAssist">
+
+ <templates
+ markupLanguage="TracWiki">
+ <!-- phrase modifiers -->
+ <template name="'''" description="%template.description.0" content="'''${text}''' $"/>
+ <template name="''" description="%template.description.1" content="''${text}'' $"/>
+ <template name="'''''" description="%template.description.2" content="'''''${text}''''' $"/>
+ <template name="__" description="%template.description.3" content="__${text}__ $"/>
+ <template name="{{{" description="%template.description.4" content="{{{${text}}}} $"/>
+ <template name="~~" description="%template.description.5" content="~~${text}~~ $"/>
+ <template name="^^" description="%template.description.6" content="^^${text}^^ $"/>
+ <template name=",," description="%template.description.7" content=",,${text},, $"/>
+
+ <!-- block templates -->
+
+
+ <template name="= " description="%template.description.8" content="\n= ${text} =\n\n" block="true"/>
+ <template name="== " description="%template.description.9" content="\n== ${text} ==\n\n" block="true"/>
+ <template name="=== " description="%template.description.10" content="\n=== ${text} ===\n\n" block="true"/>
+ <template name="==== " description="%template.description.11" content="\n==== ${text} ====\n\n" block="true"/>
+ <template name="===== " description="%template.description.12" content="\n===== ${text} =====\n\n" block="true"/>
+ <template name="====== " description="%template.description.13" content="\n====== ${text} ======\n\n" block="true"/>
+ <template name=" * " description="%template.description.14" content="\n * ${text}\n * ${text2}\n\n" block="true"/>
+ <template name=" * " description="%template.description.15" content="\n * ${text}\n * ${text2}\n\n" block="true"/>
+ <template name=" 1. " description="%template.description.16" content="\n 1. ${text}\n 1. ${text2}\n\n" block="true"/>
+ <template name=" 1. " description="%template.description.17" content="\n 1. ${text}\n 1. ${text2}\n\n" block="true"/>
+ <template name="{{{" description="%template.description.18" content="\n{{{\n${text}\n}}}\n\n" block="true"/>
+ <template name="bq." description="%template.description.19" content="\n ${text}\n\n" block="true"/>
+ <template name=">" description="%template.description.20" content="\n> ${text}\n\n" block="true"/>
+ <template name="||" description="%template.description.21" content="\n|| ${text} || ${text2} ||\n|| ${text3} || ${text4} ||\n\n" block="true"/>
+
+ <!-- other -->
+ <template name="[[BR]]" description="%template.description.22" content="[[BR]]"/>
+
+ </templates>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.tracwiki.ui/src/.placeholder b/org.eclipse.mylyn.wikitext.tracwiki.ui/src/.placeholder
new file mode 100644
index 0000000..e69de29
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.classpath b/org.eclipse.mylyn.wikitext.twiki.core/.classpath
new file mode 100644
index 0000000..b07f119
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/views/log/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.cvsignore b/org.eclipse.mylyn.wikitext.twiki.core/.cvsignore
new file mode 100644
index 0000000..ca1d66c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.cvsignore
@@ -0,0 +1,2 @@
+bin
+.refactorings
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.project b/org.eclipse.mylyn.wikitext.twiki.core/.project
new file mode 100644
index 0000000..a0e1ee9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.twiki.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4705dd0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:46 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.twiki.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7982f8a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.twiki.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.team.core;resolution:=optional
+Export-Package: org.eclipse.mylyn.internal.wikitext.twiki.core.block;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.twiki.core.phrase;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.twiki.core.token;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.twiki.core.validation;x-internal:=true,
+ org.eclipse.mylyn.wikitext.twiki.core
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage b/org.eclipse.mylyn.wikitext.twiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
new file mode 100644
index 0000000..c948f9b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/META-INF/services/org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage
@@ -0,0 +1 @@
+org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/about.html b/org.eclipse.mylyn.wikitext.twiki.core/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/build.properties b/org.eclipse.mylyn.wikitext.twiki.core/build.properties
new file mode 100644
index 0000000..01810f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/plugin.properties b/org.eclipse.mylyn.wikitext.twiki.core/plugin.properties
new file mode 100644
index 0000000..b54417d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2007, 2008 Mylyn project committers 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:
+# David Green - initial API and implementation
+###############################################################################
+
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Twiki
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/plugin.xml b/org.eclipse.mylyn.wikitext.twiki.core/plugin.xml
new file mode 100644
index 0000000..d92a555
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/plugin.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupLanguage">
+ <language
+ class="org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage"
+ name="TWiki"
+ fileExtensions="twiki">
+ </language>
+ </extension>
+
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+ <content-type
+ base-type="org.eclipse.mylyn.wikitext"
+ file-extensions="twiki"
+ id="org.eclipse.mylyn.wikitext.twiki"
+ name="TWiki WikiText Markup"
+ priority="normal">
+ </content-type>
+ </extension>
+
+ <extension
+ point="org.eclipse.team.core.fileTypes">
+ <fileTypes
+ extension="twiki"
+ type="text">
+ </fileTypes>
+ </extension>
+ <extension
+ point="org.eclipse.mylyn.wikitext.core.markupValidationRule">
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.twiki.core.validation.ListWhitespaceValidationRule"
+ markupLanguage="TWiki"/>
+ <rule
+ class="org.eclipse.mylyn.internal.wikitext.twiki.core.validation.TWikiReferenceValidationRule"
+ markupLanguage="TWiki"/>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/DefinitionListBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/DefinitionListBlock.java
new file mode 100755
index 0000000..10857e8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/DefinitionListBlock.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * implements definition lists: <code><pre>
+ * $ word : definition
+ * </pre></code>
+ *
+ * @author David Green
+ */
+public class DefinitionListBlock extends Block {
+
+ private static final Pattern startPattern = Pattern
+ .compile(" {3}\\$\\s+([^:]+):\\s+(.+)"); //$NON-NLS-1$
+
+ private int blockLineCount;
+
+ private Matcher matcher;
+
+ @Override
+ protected int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ builder.beginBlock(BlockType.DEFINITION_LIST, new Attributes());
+ } else {
+ matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ setClosed(true);
+ return 0;
+ }
+ }
+ ++blockLineCount;
+
+ builder.beginBlock(BlockType.DEFINITION_TERM, new Attributes());
+ markupLanguage.emitMarkupLine(parser, state, matcher.start(1), matcher
+ .group(1), 0);
+ builder.endBlock();
+
+ builder.beginBlock(BlockType.DEFINITION_ITEM, new Attributes());
+ markupLanguage.emitMarkupLine(parser, state, matcher.start(2), matcher
+ .group(2), 0);
+ builder.endBlock();
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ blockLineCount = 0;
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/HeadingBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/HeadingBlock.java
new file mode 100755
index 0000000..e213996
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/HeadingBlock.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.HeadingAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HeadingBlock extends Block {
+
+ private static final Pattern startPattern = Pattern.compile("---(\\+{1,6})\\s*(!!\\s*)?(.*)"); //$NON-NLS-1$
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ offset = matcher.start(3);
+ int level = matcher.group(1).length();
+
+ String bangEscape = matcher.group(2);
+ boolean omitFromToc = false;
+ if (bangEscape != null && bangEscape.length() > 0) {
+ omitFromToc = true;
+ }
+
+ if (offset > 0 && level > 0) {
+ HeadingAttributes attributes = new HeadingAttributes();
+ attributes.setOmitFromTableOfContents(omitFromToc);
+ attributes.setId(state.getIdGenerator().newId("h" + level, line.substring(offset))); //$NON-NLS-1$
+
+ builder.beginHeading(level, attributes);
+ builder.characters(line.substring(offset).trim());
+ builder.endHeading();
+ }
+
+ setClosed(true);
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/HorizontalRuleBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/HorizontalRuleBlock.java
new file mode 100755
index 0000000..7ae0688
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/HorizontalRuleBlock.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class HorizontalRuleBlock extends Block {
+
+ private static final Pattern startPattern = Pattern.compile("-{3,}\\s*"); //$NON-NLS-1$
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ builder.charactersUnescaped("<hr/>"); //$NON-NLS-1$
+ setClosed(true);
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/ListBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/ListBlock.java
new file mode 100755
index 0000000..0c89b52
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/ListBlock.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.Stack;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * List block, matches blocks that start with <code> *</code>, <code> 1</code>, <code> a</code>,
+ * <code> A</code> <code> i</code> or <code> I</code>. Note that preceding spaces must be
+ * in multiples of 3.
+ *
+ * @author David Green
+ */
+public class ListBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("((?: {3})+)(\\*|(?:1|a|A|i|I)\\.)\\s(.*+)"); //$NON-NLS-1$
+ static final Pattern continuationPattern = Pattern.compile(" {3}\\s*(.*+)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ private Stack<ListState> listState;
+
+ public ListBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ boolean continuation = false;
+ if (blockLineCount == 0) {
+ listState = new Stack<ListState>();
+ Attributes attributes = new Attributes();
+ String listSpec = matcher.group(1);
+ int level = calculateLevel(listSpec);
+ String typeSpec = matcher.group(2);
+ BlockType type = calculateType(typeSpec);
+
+ computeAttributes(attributes, type, typeSpec);
+
+ // 0-offset matches may start with the "*** " prefix.
+ offset = matcher.start(3);
+
+ listState.push(new ListState(1, type));
+ builder.beginBlock(type, attributes);
+
+ adjustLevel(type, listSpec, level);
+ } else {
+ Matcher matcher = startPattern.matcher(line);
+ if (!matcher.matches()) {
+ // FIXME: continuations not yet implemented
+ matcher = continuationPattern.matcher(line);
+ if (listState.isEmpty() || !matcher.matches()) {
+ setClosed(true);
+ return 0;
+ } else {
+ continuation = true;
+ offset = matcher.start(1)-1; // use -1 to get one whitespace character
+ }
+ } else {
+ String listSpec = matcher.group(1);
+ int level = calculateLevel(listSpec);
+ String typeSpec = matcher.group(2);
+
+ BlockType type = calculateType(typeSpec);
+ offset = matcher.start(3);
+
+ adjustLevel(type, typeSpec, level);
+ }
+ }
+ ++blockLineCount;
+
+ ListState listState = this.listState.peek();
+ if (!continuation && listState.openItem) {
+ builder.endBlock();
+ listState.openItem = false;
+ }
+ if (!listState.openItem) {
+ listState.openItem = true;
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ }
+
+ markupLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ private void computeAttributes(Attributes attributes, BlockType type,
+ String typeSpec) {
+ if (type == BlockType.NUMERIC_LIST) {
+ switch (typeSpec.charAt(0)) {
+ case 'a':
+ attributes.setCssStyle("list-style: lower-alpha;"); //$NON-NLS-1$
+ break;
+ case 'A':
+ attributes.setCssStyle("list-style: upper-alpha;"); //$NON-NLS-1$
+ break;
+ case 'i':
+ attributes.setCssStyle("list-style: lower-roman;"); //$NON-NLS-1$
+ break;
+ case 'I':
+ attributes.setCssStyle("list-style: upper-roman;"); //$NON-NLS-1$
+ break;
+ }
+ }
+ }
+
+ private void adjustLevel(BlockType type,String typeSpec, int level) {
+ for (ListState previousState = listState.peek(); level != previousState.level || previousState.type != type; previousState = listState.peek()) {
+
+ if (level > previousState.level) {
+ if (!previousState.openItem) {
+ builder.beginBlock(BlockType.LIST_ITEM, new Attributes());
+ previousState.openItem = true;
+ }
+
+ Attributes blockAttributes = new Attributes();
+ computeAttributes(blockAttributes, type, typeSpec);
+
+ listState.push(new ListState(previousState.level + 1, type));
+ builder.beginBlock(type, blockAttributes);
+ } else {
+ closeOne();
+ if (listState.isEmpty()) {
+ Attributes blockAttributes = new Attributes();
+ computeAttributes(blockAttributes, type, typeSpec);
+
+ listState.push(new ListState(1, type));
+ builder.beginBlock(type, blockAttributes);
+ }
+ }
+ }
+ }
+
+ private int calculateLevel(String listSpec) {
+ return listSpec.length() / 3;
+ }
+
+ private BlockType calculateType(String listSpec) {
+ return listSpec.charAt(listSpec.length() - 1) == '*' ? BlockType.BULLETED_LIST: BlockType.NUMERIC_LIST;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ listState = null;
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ while (listState != null && !listState.isEmpty()) {
+ closeOne();
+ }
+ listState = null;
+ }
+ super.setClosed(closed);
+ }
+
+ private void closeOne() {
+ ListState e = listState.pop();
+ if (e.openItem) {
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ private static class ListState {
+ int level;
+
+ BlockType type;
+
+ boolean openItem;
+
+ private ListState(int level, BlockType type) {
+ super();
+ this.level = level;
+ this.type = type;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/LiteralBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/LiteralBlock.java
new file mode 100755
index 0000000..9782da7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/LiteralBlock.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+/**
+ * A literal block disables wiki text but allows for nested HTML tags.
+ *
+ * @see VerbatimBlock
+ *
+ * @author David Green
+ */
+public class LiteralBlock extends Block {
+
+ private static final Pattern startPattern = Pattern.compile("\\s*<literal>(.*)"); //$NON-NLS-1$
+
+ private static final Pattern endPattern = Pattern.compile("\\s*</literal>(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount++ == 0) {
+ offset = matcher.start(1);
+ ((TWikiLanguage)markupLanguage).setLiteralMode(true);
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ } else {
+ Matcher endMatcher = endPattern.matcher(line);
+ if (endMatcher.matches()) {
+ setClosed(true);
+ return endMatcher.start(1);
+ }
+ }
+ markupLanguage.emitMarkupLine(parser, state, line, offset);
+ builder.characters("\n"); //$NON-NLS-1$
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ ((TWikiLanguage)markupLanguage).setLiteralMode(false);
+ }
+ super.setClosed(closed);
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ blockLineCount = 0;
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/ParagraphBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/ParagraphBlock.java
new file mode 100755
index 0000000..194a8ae
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/ParagraphBlock.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+/**
+ * Matches any text
+ *
+ * @author David Green
+ */
+public class ParagraphBlock extends Block {
+
+ private int blockLineCount = 0;
+
+ public ParagraphBlock() {
+ }
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount == 0) {
+ Attributes attributes = new Attributes();
+ builder.beginBlock(BlockType.PARAGRAPH, attributes);
+ }
+
+ if (markupLanguage.isEmptyLine(line)) {
+ setClosed(true);
+ return 0;
+ }
+
+ TWikiLanguage textileLanguage = (TWikiLanguage) getMarkupLanguage();
+
+ for (Block block : textileLanguage.getParagraphBreakingBlocks()) {
+ if (block.canStart(line, offset)) {
+ setClosed(true);
+ return 0;
+ }
+ }
+
+ if (blockLineCount != 0) {
+ builder.lineBreak();
+ }
+ ++blockLineCount;
+
+ textileLanguage.emitMarkupLine(getParser(), state, line, offset);
+
+ return -1;
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ blockLineCount = 0;
+ return true;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock();
+ }
+ super.setClosed(closed);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/TableOfContentsBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/TableOfContentsBlock.java
new file mode 100755
index 0000000..6010d76
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/TableOfContentsBlock.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+/**
+ * implements the %TOC% variable of TWiki syntax
+ *
+ * @author David Green
+ */
+public class TableOfContentsBlock extends Block {
+
+ static final Pattern startPattern = Pattern.compile("\\s*\\%TOC\\%\\s*"); //$NON-NLS-1$
+
+ private int blockLineNumber = 0;
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineNumber++ > 0) {
+ setClosed(true);
+ return 0;
+ }
+
+ if (!getMarkupLanguage().isFilterGenerativeContents()) {
+
+ OutlineParser outlineParser = new OutlineParser(new TWikiLanguage());
+ OutlineItem rootItem = outlineParser.parse(state.getMarkupContent());
+
+ emitToc(rootItem);
+ }
+ return -1;
+ }
+
+ private void emitToc(OutlineItem item) {
+ if (item.getChildren().isEmpty()) {
+ return;
+ }
+ Attributes nullAttributes = new Attributes();
+
+ builder.beginBlock(BlockType.NUMERIC_LIST, new Attributes());
+ for (OutlineItem child : item.getChildren()) {
+ builder.beginBlock(BlockType.LIST_ITEM, nullAttributes);
+ builder.link('#' + child.getId(), child.getLabel());
+ emitToc(child);
+ builder.endBlock();
+ }
+ builder.endBlock();
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0 && !getMarkupLanguage().isFilterGenerativeContents()) {
+ matcher = startPattern.matcher(line);
+ blockLineNumber = 0;
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/VerbatimBlock.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/VerbatimBlock.java
new file mode 100755
index 0000000..a6a6ae4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/block/VerbatimBlock.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.block;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+
+/**
+ * A block where all wiki text and html tags are disabled.
+ *
+ * @see LiteralBlock
+ *
+ * @author David Green
+ */
+public class VerbatimBlock extends Block {
+
+ private static final Pattern startPattern = Pattern.compile("\\s*<verbatim>(.*)"); //$NON-NLS-1$
+
+ private static final Pattern endPattern = Pattern.compile("\\s*</verbatim>(.*)"); //$NON-NLS-1$
+
+ private int blockLineCount = 0;
+
+ private Matcher matcher;
+
+ @Override
+ public int processLineContent(String line, int offset) {
+ if (blockLineCount++ == 0) {
+ offset = matcher.start(1);
+ builder.beginBlock(BlockType.PARAGRAPH, new Attributes());
+ } else {
+ Matcher endMatcher = endPattern.matcher(line);
+ if (endMatcher.matches()) {
+ setClosed(true);
+ return endMatcher.start(1);
+ }
+ }
+ builder.characters(offset == 0 ? line : line.substring(offset));
+ builder.characters("\n"); //$NON-NLS-1$
+ return -1;
+ }
+
+ @Override
+ public void setClosed(boolean closed) {
+ if (closed && !isClosed()) {
+ builder.endBlock(); // pre
+ }
+ super.setClosed(closed);
+ }
+
+ @Override
+ public boolean canStart(String line, int lineOffset) {
+ if (lineOffset == 0) {
+ matcher = startPattern.matcher(line);
+ blockLineCount = 0;
+ return matcher.matches();
+ } else {
+ matcher = null;
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/AutoLinkSwitchPhraseModifier.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/AutoLinkSwitchPhraseModifier.java
new file mode 100755
index 0000000..129703b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/AutoLinkSwitchPhraseModifier.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.phrase;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+public class AutoLinkSwitchPhraseModifier extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(</?noautolink>)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SwitchProcessor();
+ }
+
+ private static class SwitchProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String switchText = group(1);
+ TWikiLanguage twikiLanguage = (TWikiLanguage) markupLanguage;
+ twikiLanguage.setAutoLinking(switchText.indexOf('/') != -1);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/SimplePhraseModifier.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/SimplePhraseModifier.java
new file mode 100755
index 0000000..be7c559
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/SimplePhraseModifier.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.phrase;
+
+
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimplePhraseModifier extends SimpleWrappedPhraseModifier {
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType) {
+ super(delimiter, delimiter, new SpanType[] { spanType });
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType spanType, boolean nesting) {
+ super(delimiter, delimiter, new SpanType[] { spanType }, nesting);
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType[] spanType) {
+ super(delimiter, delimiter, spanType);
+ }
+
+ public SimplePhraseModifier(String delimiter, SpanType[] spanType, boolean nesting) {
+ super(delimiter, delimiter, spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/SimpleWrappedPhraseModifier.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/SimpleWrappedPhraseModifier.java
new file mode 100755
index 0000000..48d6fa2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/phrase/SimpleWrappedPhraseModifier.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.phrase;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SimpleWrappedPhraseModifier extends PatternBasedElement {
+
+ protected static final int CONTENT_GROUP = 1;
+
+ private static class SimplePhraseModifierProcessor extends PatternBasedElementProcessor {
+ private final SpanType[] spanType;
+
+ private final boolean nesting;
+
+ public SimplePhraseModifierProcessor(SpanType[] spanType, boolean nesting) {
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ public void emit() {
+ for (SpanType type : spanType) {
+ getBuilder().beginSpan(type, new Attributes());
+ }
+ if (nesting) {
+ getMarkupLanguage().emitMarkupLine(parser, state, getStart(this), getContent(this), 0);
+ } else {
+ getMarkupLanguage().emitMarkupText(parser, state, getContent(this));
+ }
+ for (int x = 0; x < spanType.length; ++x) {
+ getBuilder().endSpan();
+ }
+ }
+ }
+
+ private final String startDelimiter;
+
+ private final String endDelimiter;
+
+ private final SpanType[] spanType;
+
+ private final boolean nesting;
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType[] spanType) {
+ this(startDelimiter, endDelimiter, spanType, false);
+ }
+
+ public SimpleWrappedPhraseModifier(String startDelimiter, String endDelimiter, SpanType[] spanType, boolean nesting) {
+ this.startDelimiter = startDelimiter;
+ this.endDelimiter = endDelimiter;
+ this.spanType = spanType;
+ this.nesting = nesting;
+ }
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return Pattern.quote(startDelimiter) + "([^\\s-](?:.*?[^\\s-])?)(?:(?<=[^!])" + // content: note that we dont allow preceding '-' or trailing '-' to avoid conflict with strikethrough and emdash //$NON-NLS-1$
+ Pattern.quote(endDelimiter) + ")"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ protected static String getContent(PatternBasedElementProcessor processor) {
+ return processor.group(CONTENT_GROUP);
+ }
+
+ protected static int getStart(PatternBasedElementProcessor processor) {
+ return processor.start(CONTENT_GROUP);
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new SimplePhraseModifierProcessor(spanType, nesting);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/IconReplacementToken.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/IconReplacementToken.java
new file mode 100755
index 0000000..f8b435c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/IconReplacementToken.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.ImageAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+/**
+ * Token that replaces <code>%ICON{"<icon type>"}%</code> with the appropriate image tag.
+ * Supports %ICON{"help"}%, %ICON{"tip"}%, and %ICON{"warning"}%
+ *
+ * @author David Green
+ */
+public class IconReplacementToken extends PatternBasedElement {
+
+ // TODO: check http://twiki.org/cgi-bin/view/TWiki04x02/TWikiDocGraphics to see if this covers all graphics
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "%ICON\\{\"([a-zA-Z]+)\"\\}%"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new IconProcessor();
+ }
+
+ private static class IconProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String iconType = group(1);
+ String iconUrl = ((TWikiLanguage)markupLanguage).toIconUrl(iconType);
+ builder.image(new ImageAttributes(), iconUrl);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/ImpliedEmailLinkReplacementToken.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/ImpliedEmailLinkReplacementToken.java
new file mode 100755
index 0000000..23b0d05
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/ImpliedEmailLinkReplacementToken.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.token;
+
+import org.eclipse.mylyn.wikitext.core.parser.LinkAttributes;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+
+public class ImpliedEmailLinkReplacementToken extends PatternBasedElement {
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+(?:[a-zA-Z]{2,6}))"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 1;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new EmailLinkProcessor();
+ }
+
+ private static class EmailLinkProcessor extends PatternBasedElementProcessor {
+
+ @Override
+ public void emit() {
+ String email = group(1);
+ builder.link(new LinkAttributes(), "mailto:"+email, email); //$NON-NLS-1$
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/LinkReplacementToken.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/LinkReplacementToken.java
new file mode 100755
index 0000000..7716416
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/LinkReplacementToken.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.token;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+/**
+ * Tokens that represent links, as follows: <code>[[link]]</code>
+ *
+ * @author David Green
+ */
+public class LinkReplacementToken extends PatternBasedElement {
+
+ private static final Pattern replacementPattern = Pattern.compile("\\W"); //$NON-NLS-1$
+ private static final Pattern wordBoundaryPattern = Pattern.compile("\\W\\w"); //$NON-NLS-1$
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(!)?(\\[\\[([^\\]]+)(?:(\\]\\[)(.*))?\\]\\])"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 5;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new LinkProcessor();
+ }
+
+ private static class LinkProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String escaped = group(1);
+ if (escaped != null) {
+ String escapedText = group(2);
+ builder.characters(escapedText);
+ } else {
+ String link = group(3);
+ String text = group(5);
+ if (text == null || text.trim().length() == 0) {
+ text = link;
+ }
+ boolean looksLikeEmail = link.indexOf('@') != -1;
+ if (link.indexOf('/') != -1 || link.indexOf('#') != -1 || looksLikeEmail) {
+ if (looksLikeEmail) {
+ text = text.replaceFirst("\\s*mailto:",""); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ // url link
+ builder.link(link, text);
+ } else {
+ // wiki link
+ link = camelCaseWordBoundaries(link);
+ String target = replacementPattern.matcher(link).replaceAll(""); //$NON-NLS-1$
+ TWikiLanguage twikiLanguage = (TWikiLanguage)markupLanguage;
+ boolean exists = twikiLanguage.computeInternalLinkExists(target);
+
+ String internalHref = twikiLanguage.toInternalHref(target);
+ if (!exists) {
+ builder.characters(text);
+ builder.link(internalHref, "?"); //$NON-NLS-1$
+ } else {
+ builder.link(internalHref, text);
+ }
+ }
+ }
+ }
+
+ private String camelCaseWordBoundaries(String text) {
+ Matcher matcher = wordBoundaryPattern.matcher(text);
+ String newText = Character.toString(Character.toUpperCase(text.charAt(0)));
+ int start = 1;
+ while (matcher.find()) {
+ int offset = matcher.start();
+ newText += text.substring(start,offset);
+
+ newText += Character.toUpperCase(text.charAt(offset+1));
+
+ start = offset + 2;
+ }
+ if (start < text.length()) {
+ newText += text.substring(start);
+ }
+ return newText;
+ }
+ }
+
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/WikiWordReplacementToken.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/WikiWordReplacementToken.java
new file mode 100755
index 0000000..0f452c3
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/token/WikiWordReplacementToken.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.token;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.core.parser.markup.PatternBasedElementProcessor;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+/**
+ *
+ * @author David Green
+ */
+public class WikiWordReplacementToken extends PatternBasedElement {
+
+ private static final Pattern replacementPattern = Pattern.compile("\\W"); //$NON-NLS-1$
+
+ @Override
+ protected String getPattern(int groupOffset) {
+ return "(!)?([A-Z]\\w+(?:[A-Z]\\w*)+)"; //$NON-NLS-1$
+ }
+
+ @Override
+ protected int getPatternGroupCount() {
+ return 2;
+ }
+
+ @Override
+ protected PatternBasedElementProcessor newProcessor() {
+ return new WikiWordProcessor();
+ }
+
+ private class WikiWordProcessor extends PatternBasedElementProcessor {
+ @Override
+ public void emit() {
+ String escaped = group(1);
+ String word = group(2);
+ TWikiLanguage twikiLanguage = (TWikiLanguage)markupLanguage;
+ if (escaped != null || !twikiLanguage.isAutoLinking()) {
+ builder.characters(word);
+ } else {
+ String target = replacementPattern.matcher(word).replaceAll(""); //$NON-NLS-1$
+ boolean exists = twikiLanguage.computeInternalLinkExists(target);
+
+ String internalHref = twikiLanguage.toInternalHref(target);
+ if (!exists) {
+ builder.characters(word);
+ builder.link(internalHref, "?"); //$NON-NLS-1$
+ } else {
+ builder.link(internalHref, word);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/ListWhitespaceValidationRule.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/ListWhitespaceValidationRule.java
new file mode 100644
index 0000000..7b8f951
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/ListWhitespaceValidationRule.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.twiki.core.validation;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+/**
+ * TWiki lists markup must have spaces in multiples of 3 preceding the markup (*,i,I,1,a,A)
+ *
+ * @author David Green
+ */
+public class ListWhitespaceValidationRule extends ValidationRule {
+
+ private static final Pattern almostListPattern = Pattern.compile("^((?: |\t)*)(\\*|((i|I|a|A|1)\\.))(\\S)?", //$NON-NLS-1$
+ Pattern.MULTILINE);
+
+ public ListWhitespaceValidationRule() {
+ }
+
+ @Override
+ public ValidationProblem findProblem(String markup, int offset, int length) {
+ Matcher matcher = almostListPattern.matcher(markup);
+ if (offset > 0 || length != markup.length()) {
+ matcher.region(offset, offset + length);
+ }
+ while (matcher.find()) {
+ String spaces = matcher.group(1);
+ if (spaces == null || spaces.length() == 0 || (spaces.length() % 3) != 0 || containsNonSpace(spaces)) {
+ int problemOffset = matcher.start();
+ int problemLength = Math.max(2, matcher.end(2) - problemOffset);
+ return new ValidationProblem(Severity.WARNING,
+ Messages.getString("ListWhitespaceValidationRule.1"), problemOffset, problemLength); //$NON-NLS-1$
+ }
+ String after = matcher.group(5);
+ if (after != null) {
+ int problemOffset = matcher.start();
+ int problemLength = Math.max(2, matcher.end(2) - problemOffset);
+ return new ValidationProblem(Severity.WARNING, Messages.getString("ListWhitespaceValidationRule.2"), //$NON-NLS-1$
+ problemOffset, problemLength);
+ }
+ }
+ return null;
+ }
+
+ private boolean containsNonSpace(String spaces) {
+ for (int x = 0; x < spaces.length(); ++x) {
+ if (spaces.charAt(x) != ' ') {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/Messages.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/Messages.java
new file mode 100644
index 0000000..3ef1f0a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/Messages.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.twiki.core.validation;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+class Messages {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.twiki.core.validation.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+ private Messages() {
+ }
+
+ public static String getString(String key) {
+ try {
+ return RESOURCE_BUNDLE.getString(key);
+ } catch (MissingResourceException e) {
+ return '!' + key + '!';
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/TWikiReferenceValidationRule.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/TWikiReferenceValidationRule.java
new file mode 100644
index 0000000..0aeb108
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/TWikiReferenceValidationRule.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.twiki.core.validation;
+
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.validation.DocumentLocalReferenceValidationRule;
+import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage;
+
+public class TWikiReferenceValidationRule extends DocumentLocalReferenceValidationRule {
+
+ @Override
+ protected MarkupLanguage createMarkupLanguage() {
+ return new TWikiLanguage();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/messages.properties b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/messages.properties
new file mode 100644
index 0000000..5d6c5aa
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/internal/wikitext/twiki/core/validation/messages.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+ListWhitespaceValidationRule.1=Lists must be indented with spaces in multiples of three
+ListWhitespaceValidationRule.2=List item markup must be followed by whitespace
diff --git a/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/wikitext/twiki/core/TWikiLanguage.java b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/wikitext/twiki/core/TWikiLanguage.java
new file mode 100755
index 0000000..3ad140f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.core/src/org/eclipse/mylyn/wikitext/twiki/core/TWikiLanguage.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.twiki.core;
+
+import java.text.MessageFormat;
+import java.util.List;
+
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.DefinitionListBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.HeadingBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.HorizontalRuleBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.ListBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.LiteralBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.ParagraphBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.TableOfContentsBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.block.VerbatimBlock;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.phrase.AutoLinkSwitchPhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.phrase.SimplePhraseModifier;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.token.IconReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.token.ImpliedEmailLinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.token.LinkReplacementToken;
+import org.eclipse.mylyn.internal.wikitext.twiki.core.token.WikiWordReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.core.parser.markup.AbstractMarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.markup.Block;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.HtmlEndTagPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.phrase.HtmlStartTagPhraseModifier;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.EntityReferenceReplacementToken;
+import org.eclipse.mylyn.wikitext.core.parser.markup.token.ImpliedHyperlinkReplacementToken;
+
+// TODO: table
+// TODO: empty line to empty para
+// TODO: images? is it supported by TWiki?
+// TODO: variables, see http://twiki.org/cgi-bin/view/TWiki04x02/TWikiVariables
+// TODO: implement <sticky>
+// TODO: named anchors eg: #Target from the docs: To define an anchor write #AnchorName at the beginning of a line. The anchor name must be a WikiWord of no more than 32 characters.
+
+/**
+ * a markup language implementing TWiki syntax. See <a
+ * href="http://wikix.ilog.fr/wiki/bin/view/TWiki/TextFormattingRules">TWiki Formatting Rules</a> for details.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class TWikiLanguage extends AbstractMarkupLanguage {
+
+ private final PatternBasedSyntax literalTokenSyntax = new PatternBasedSyntax();
+
+ private final PatternBasedSyntax literalPhraseModifierSyntax = new PatternBasedSyntax();
+
+ private boolean literalMode;
+
+ private boolean isAutoLinking = true;
+
+ private String iconPattern = "TWikiDocGraphics/{0}.gif"; // FIXME find out if this is correct //$NON-NLS-1$
+
+ public TWikiLanguage() {
+ setName("TWiki"); //$NON-NLS-1$
+ setInternalLinkPattern("/cgi-bin/view/{0}/{1}"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected PatternBasedSyntax getPhraseModifierSyntax() {
+ return literalMode ? literalPhraseModifierSyntax : phraseModifierSyntax;
+ }
+
+ @Override
+ protected PatternBasedSyntax getReplacementTokenSyntax() {
+ return literalMode ? literalTokenSyntax : tokenSyntax;
+ }
+
+ @Override
+ protected void clearLanguageSyntax() {
+ super.clearLanguageSyntax();
+ literalTokenSyntax.clear();
+ literalPhraseModifierSyntax.clear();
+ }
+
+ private Block paragraphBreakingBlock(Block block) {
+ paragraphBreakingBlocks.add(block);
+ return block;
+ }
+
+ /**
+ * for the purpose of converting wiki words into links, determine if the wiki word exists.
+ *
+ * @see WikiWordReplacementToken
+ */
+ public boolean computeInternalLinkExists(String link) {
+ return true;
+ }
+
+ /**
+ * Convert a page name to an href to the page.
+ *
+ * @param pageName
+ * the name of the page to target, usually a WikiWord with whitespace removed
+ *
+ * @return the href to access the page
+ *
+ * @see #getInternalPageHrefPrefix()
+ */
+ public String toInternalHref(String pageName) {
+ String[] parts = pageName.split("\\."); //$NON-NLS-1$
+ if (parts.length == 1) {
+ parts = new String[] { "Main", parts[0] }; //$NON-NLS-1$
+ }
+ return MessageFormat.format(super.internalLinkPattern, (Object[]) parts);
+ }
+
+ public String toIconUrl(String iconType) {
+ return MessageFormat.format(getIconPattern(), iconType);
+ }
+
+ /**
+ * indicate if we're currently processing a literal block
+ *
+ * @see LiteralBlock
+ */
+ public boolean isLiteralMode() {
+ return literalMode;
+ }
+
+ /**
+ * indicate if we're currently processing a literal block
+ *
+ * @see LiteralBlock
+ */
+ public void setLiteralMode(boolean literalMode) {
+ this.literalMode = literalMode;
+ }
+
+ /**
+ * the pattern to use when generating icon image urls.
+ */
+ public void setIconPattern(String iconPattern) {
+ this.iconPattern = iconPattern;
+ }
+
+ /**
+ * the pattern to use when generating icon image urls.
+ */
+ public String getIconPattern() {
+ return iconPattern;
+ }
+
+ public boolean isAutoLinking() {
+ return isAutoLinking;
+ }
+
+ public void setAutoLinking(boolean isAutoLinking) {
+ this.isAutoLinking = isAutoLinking;
+ }
+
+ @Override
+ protected void addStandardBlocks(List<Block> blocks, List<Block> paragraphBreakingBlocks) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ blocks.add(paragraphBreakingBlock(new VerbatimBlock()));
+ blocks.add(paragraphBreakingBlock(new LiteralBlock()));
+ blocks.add(paragraphBreakingBlock(new HorizontalRuleBlock()));
+ blocks.add(paragraphBreakingBlock(new HeadingBlock()));
+ blocks.add(paragraphBreakingBlock(new DefinitionListBlock()));
+ blocks.add(paragraphBreakingBlock(new TableOfContentsBlock()));
+ blocks.add(paragraphBreakingBlock(new ListBlock()));
+ }
+
+ @Override
+ protected void addStandardPhraseModifiers(PatternBasedSyntax phraseModifierSyntax) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ boolean escapingHtml = configuration == null ? false : configuration.isEscapingHtmlAndXml();
+
+ phraseModifierSyntax.add(new AutoLinkSwitchPhraseModifier());
+
+ if (!escapingHtml) {
+ phraseModifierSyntax.add(new HtmlStartTagPhraseModifier());
+ phraseModifierSyntax.add(new HtmlEndTagPhraseModifier());
+ }
+ phraseModifierSyntax.beginGroup("(?:(?<=[\\s\\.,\\\"'?!;:\\)\\(\\{\\}\\[\\]])|^)(?:", 0); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("*", SpanType.BOLD)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("__", new SpanType[] { SpanType.BOLD, SpanType.ITALIC })); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("_", SpanType.ITALIC)); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("==", new SpanType[] { SpanType.BOLD, SpanType.MONOSPACE })); //$NON-NLS-1$
+ phraseModifierSyntax.add(new SimplePhraseModifier("=", SpanType.MONOSPACE)); //$NON-NLS-1$
+ phraseModifierSyntax.endGroup(")(?=\\W|$)", 0); //$NON-NLS-1$
+
+ literalPhraseModifierSyntax.add(new HtmlStartTagPhraseModifier());
+ literalPhraseModifierSyntax.add(new HtmlEndTagPhraseModifier());
+ }
+
+ @Override
+ protected void addStandardTokens(PatternBasedSyntax tokenSyntax) {
+ // IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
+
+ tokenSyntax.add(new EntityReferenceReplacementToken("(tm)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(TM)", "#8482")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(c)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(C)", "#169")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(r)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new EntityReferenceReplacementToken("(R)", "#174")); //$NON-NLS-1$ //$NON-NLS-2$
+ tokenSyntax.add(new LinkReplacementToken());
+ tokenSyntax.add(new ImpliedHyperlinkReplacementToken());
+ tokenSyntax.add(new ImpliedEmailLinkReplacementToken());
+ tokenSyntax.add(new WikiWordReplacementToken());
+ tokenSyntax.add(new IconReplacementToken());
+
+ literalTokenSyntax.add(new ImpliedHyperlinkReplacementToken());
+ }
+
+ @Override
+ protected Block createParagraphBlock() {
+ return new ParagraphBlock();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.classpath b/org.eclipse.mylyn.wikitext.twiki.ui/.classpath
new file mode 100644
index 0000000..b07f119
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/ui/internal/views/log/*"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.cvsignore b/org.eclipse.mylyn.wikitext.twiki.ui/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.project b/org.eclipse.mylyn.wikitext.twiki.ui/.project
new file mode 100644
index 0000000..ec66f50
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.twiki.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..fbac239
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:44 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..a25ae74
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Aug 12 15:19:59 GMT-08:00 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2007, 2008 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4705dd0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:46 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.twiki.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..10ea4a5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.twiki.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.twiki.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.mylyn.wikitext.ui;bundle-version="[1.1.0,1.2.0)"
+Export-Package: org.eclipse.mylyn.internal.wikitext.twiki.ui;x-internal:=true
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/about.html b/org.eclipse.mylyn.wikitext.twiki.ui/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/build.properties b/org.eclipse.mylyn.wikitext.twiki.ui/build.properties
new file mode 100644
index 0000000..01810f9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html
+
+src.includes=about.html
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/plugin.properties b/org.eclipse.mylyn.wikitext.twiki.ui/plugin.properties
new file mode 100644
index 0000000..1b4bc0c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/plugin.properties
@@ -0,0 +1,33 @@
+###############################################################################
+# Copyright (c) 2007, 2008 Mylyn project committers 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:
+# David Green - initial API and implementation
+###############################################################################
+
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText Twiki UI
+
+template.description.0 = *bold*
+template.description.1 = _italic_
+template.description.2 = __bold italic__
+template.description.3 = =fixed font=
+template.description.4 = ==bold fixed==
+template.description.5 = Heading 1
+template.description.6 = Heading 2
+template.description.7 = Heading 3
+template.description.8 = Heading 4
+template.description.9 = Heading 5
+template.description.10 = Heading 6
+template.description.11 = List (bulleted)
+template.description.12 = List (level 2, bulleted)
+template.description.13 = List (numeric)
+template.description.14 = List (roman numeric)
+template.description.15 = Definition List
+template.description.16 = Verbatim
+template.description.17 = Literal
+template.description.18 = separator (horizontal rule)
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/plugin.xml b/org.eclipse.mylyn.wikitext.twiki.ui/plugin.xml
new file mode 100644
index 0000000..5df60b0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension
+ point="org.eclipse.mylyn.wikitext.ui.contentAssist">
+ <templates
+ markupLanguage="TWiki">
+
+ <!-- phrase modifiers -->
+ <template name="*" description="%template.description.0" content="*${text}* $"/>
+ <template name="_" description="%template.description.1" content="_${text}_ $"/>
+ <template name="__" description="%template.description.2" content="__${text}__ $"/>
+ <template name="=" description="%template.description.3" content="=${text}= $"/>
+ <template name="==" description="%template.description.4" content="==${text}== $"/>
+
+ <!-- block templates -->
+
+ <template name="---+ " description="%template.description.5" content="\n---+ ${text}\n\n" block="true"/>
+ <template name="---++ " description="%template.description.6" content="\n---++ ${text}\n\n" block="true"/>
+ <template name="---+++ " description="%template.description.7" content="\n---+++ ${text}\n\n" block="true"/>
+ <template name="---++++ " description="%template.description.8" content="\n---++++ ${text}\n\n" block="true"/>
+ <template name="---+++++ " description="%template.description.9" content="\n---+++++ ${text}\n\n" block="true"/>
+ <template name="---++++++ " description="%template.description.10" content="\n---++++++ ${text}\n\n" block="true"/>
+ <template name="* " description="%template.description.11" content="\n * ${text}\n * ${text2}\n\n" block="true"/>
+ <template name="** " description="%template.description.12" content="\n * ${text}\n * ${text2}\n\n" block="true"/>
+ <template name="1. " description="%template.description.13" content="\n 1. ${text}\n 1. ${text2}\n\n" block="true"/>
+ <template name="i. " description="%template.description.14" content="\n i. ${text}\n i. ${text2}\n\n" block="true"/>
+ <template name="$" description="%template.description.15" content="\n \$ ${text}: ${definition}\n \$ ${term2}: ${definition2}\n\n" block="true"/>
+ <template name="<verbatim>" description="%template.description.16" content="\n<verbatim>\n${text}\n</verbatim>\n\n" block="true"/>
+ <template name="<literal>" description="%template.description.17" content="\n<literal>\n${text}\n</literal>\n\n" block="true"/>
+
+
+ <!-- other -->
+
+ <template name="---" description="%template.description.18" content="\n---\n\n"/>
+ </templates>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.twiki.ui/src/org/eclipse/mylyn/internal/wikitext/twiki/ui/package-info.java b/org.eclipse.mylyn.wikitext.twiki.ui/src/org/eclipse/mylyn/internal/wikitext/twiki/ui/package-info.java
new file mode 100644
index 0000000..cc1d0ce
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.twiki.ui/src/org/eclipse/mylyn/internal/wikitext/twiki/ui/package-info.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ * @author David Green
+ */
+package org.eclipse.mylyn.internal.wikitext.twiki.ui;
+
diff --git a/org.eclipse.mylyn.wikitext.ui/.classpath b/org.eclipse.mylyn.wikitext.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn.wikitext.ui/.cvsignore b/org.eclipse.mylyn.wikitext.ui/.cvsignore
new file mode 100644
index 0000000..5e94824
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.cvsignore
@@ -0,0 +1,2 @@
+.refactorings
+bin
diff --git a/org.eclipse.mylyn.wikitext.ui/.project b/org.eclipse.mylyn.wikitext.ui/.project
new file mode 100644
index 0000000..ae456ec
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn.wikitext.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn.wikitext.ui/.settings/.api_filters b/org.eclipse.mylyn.wikitext.ui/.settings/.api_filters
new file mode 100644
index 0000000..5a3d657
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.settings/.api_filters
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component id="org.eclipse.mylyn.wikitext.ui" version="2">
+<resource path="src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupProjectionViewer.java" type="org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupProjectionViewer">
+<filter id="571473929">
+<message_arguments>
+<message_argument value="ProjectionViewer"/>
+<message_argument value="MarkupProjectionViewer"/>
+</message_arguments>
+</filter>
+</resource>
+<resource path="src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewer.java" type="org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewer">
+<filter id="338792546">
+<message_arguments>
+<message_argument value="org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewer"/>
+<message_argument value="setStylesheet(Stylesheet)"/>
+</message_arguments>
+</filter>
+<filter id="338792546">
+<message_arguments>
+<message_argument value="org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewer"/>
+<message_argument value="getStylesheet()"/>
+</message_arguments>
+</filter>
+<filter id="643842064">
+<message_arguments>
+<message_argument value="Stylesheet"/>
+<message_argument value="HtmlViewer"/>
+<message_argument value="getStylesheet()"/>
+</message_arguments>
+</filter>
+<filter id="643846161">
+<message_arguments>
+<message_argument value="Stylesheet"/>
+<message_argument value="HtmlViewer"/>
+<message_argument value="setStylesheet(Stylesheet)"/>
+</message_arguments>
+</filter>
+</resource>
+<resource path="src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewerConfiguration.java" type="org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewerConfiguration">
+<filter id="643842064">
+<message_arguments>
+<message_argument value="AnnotationHyperlinkDetector"/>
+<message_argument value="HtmlViewerConfiguration"/>
+<message_argument value="createAnnotationHyperlinkDetector()"/>
+</message_arguments>
+</filter>
+</resource>
+</component>
diff --git a/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1314ffa
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:46 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..f143757
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,64 @@
+#Tue Jan 20 07:20:33 PST 2009
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"></template><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2009 David Green and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * David Green - initial API and implementation\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..f8baa91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:09 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..4705dd0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Thu Jul 31 11:10:46 PDT 2008
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..23db5af
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,24 @@
+#Thu Dec 04 10:52:30 PST 2008
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.internal=1
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.wikitext.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.wikitext.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1a2b443
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,45 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.mylyn.wikitext.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Require-Bundle: org.eclipse.mylyn.wikitext.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.views,
+ org.eclipse.ui.ide,
+ org.eclipse.core.expressions,
+ org.eclipse.core.resources,
+ org.eclipse.help
+Bundle-Activator: org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin
+Export-Package: org.eclipse.mylyn.internal.wikitext.ui;x-friends:="org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.actions;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.assist;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.commands;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.dnd;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.editor.help;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.operations;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.editor.outline;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.editor.preferences;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.editor.validation;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.properties;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.util;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;x-friends:="org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.util.resources;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.validation;x-internal:=true,
+ org.eclipse.mylyn.internal.wikitext.ui.viewer;x-friends:="org.eclipse.mylyn.wikitext.tests,org.eclipse.mylyn.wikitext.tasks.ui",
+ org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;x-internal:=true,
+ org.eclipse.mylyn.wikitext.ui.annotation,
+ org.eclipse.mylyn.wikitext.ui.commands,
+ org.eclipse.mylyn.wikitext.ui.editor,
+ org.eclipse.mylyn.wikitext.ui.viewer
+Bundle-ActivationPolicy: lazy
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.wikitext.ui/about.html b/org.eclipse.mylyn.wikitext.ui/about.html
new file mode 100644
index 0000000..bc6e2b4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>July 3, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+</body>
+</html>
diff --git a/org.eclipse.mylyn.wikitext.ui/build.properties b/org.eclipse.mylyn.wikitext.ui/build.properties
new file mode 100644
index 0000000..1048eb8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/build.properties
@@ -0,0 +1,41 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ schema/,\
+ plugin.properties,\
+ about.html
+
+dist=dist
+bin=bin
+
+plugin.name=org.eclipse.mylyn.wikitext.ui
+
+java.build.lib = test-lib
+java.compile.debug=on
+java.compile.deprecation=on
+java.build.java.classes=${bin}
+java.compile.optimize=on
+java.build.java.src=src
+java.build.dist=${dist}
+
+java.build.java.test.src=test-src
+java.build.java.test.classes=test-bin
+build.out.tests=tests
+
+
+java.build.jar=${plugin.name}_${plugin.version}.jar
+
+src.includes=about.html
diff --git a/org.eclipse.mylyn.wikitext.ui/icons/editor-icon.gif b/org.eclipse.mylyn.wikitext.ui/icons/editor-icon.gif
new file mode 100644
index 0000000..5c27290
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.ui/icons/editor-icon.gif differ
diff --git a/org.eclipse.mylyn.wikitext.ui/icons/help.gif b/org.eclipse.mylyn.wikitext.ui/icons/help.gif
new file mode 100644
index 0000000..86550fe
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.ui/icons/help.gif differ
diff --git a/org.eclipse.mylyn.wikitext.ui/plugin.properties b/org.eclipse.mylyn.wikitext.ui/plugin.properties
new file mode 100644
index 0000000..035ecc5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/plugin.properties
@@ -0,0 +1,43 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+
+#Properties file for org.eclipse.mylyn.wikitext.ui
+menu.label.0 = WikiText
+menu.tooltip.0 = Commands for WikiText lightweight markup
+command.label.0 = Generate Docbook
+command.tooltip.0 = Generate Docbook from WikiText source
+command.label.1 = Generate HTML
+command.tooltip.1 = Generate HTML from WikiText source
+command.label.2 = Generate Eclipse Help
+command.tooltip.2 = Generate Eclipse Help (*.html and *-toc.xml) from WikiText source
+command.name.0 = Generate Docbook
+command.name.1 = Generate HTML
+command.name.2 = Generate Eclipse Help (*.html and *-toc.xml)
+command.name.3 = Show Markup Cheat Sheet
+command.label.3 = Markup Cheat Sheet
+command.tooltip.3 = show help for wiki markup syntax
+editor.name.0 = WikiText Editor
+context.description.0 = WikiText markup editing context
+context.name.0 = WikiText Markup Source Context
+category.description.0 = commands for editing lightweight markup
+category.name.0 = WikiText Markup Editing Commands
+command.description.0 = display the markup cheat sheet
+command.name.4 = Display Cheat Seet Command
+page.name.0 = WikiText
+Bundle-Vendor.0 = Eclipse Mylyn
+Bundle-Name.0 = Mylyn WikiText UI
+page.name.1 = WikiText
+
+folding.label=Folding
+empty.label
+
+command.description.5 = Open a popup dialog with a quick outline of the current document
+command.name.5 = Quick Outline
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/plugin.xml b/org.eclipse.mylyn.wikitext.ui/plugin.xml
new file mode 100644
index 0000000..0ecddc9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/plugin.xml
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+ Copyright (c) 2007, 2009 David Green 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:
+ David Green - initial API and implementation
+ -->
+<plugin>
+ <extension-point id="cheatSheet" name="Markup Language Cheat Seet"
+ schema="schema/cheatSheet.exsd" />
+ <extension-point id="contentAssist" name="Markup Language Content Assist"
+ schema="schema/contentAssist.exsd" />
+
+ <extension point="org.eclipse.ui.editors.annotationTypes">
+ <type name="org.eclipse.mylyn.wikitext.ui.annotation.id">
+ </type>
+ <type name="org.eclipse.mylyn.wikitext.ui.annotation.anchor">
+ </type>
+ <type name="org.eclipse.mylyn.wikitext.ui.annotation.anchorName">
+ </type>
+ <type name="org.eclipse.mylyn.wikitext.ui.annotation.title">
+ </type>
+ <type name="org.eclipse.mylyn.wikitext.ui.annotation.class">
+ </type>
+ <type name="org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.bullet"/>
+ </extension>
+
+ <extension point="org.eclipse.core.expressions.propertyTesters">
+ <propertyTester
+ class="org.eclipse.mylyn.internal.wikitext.ui.util.FilePropertyTester"
+ id="org.eclipse.mylyn.wikitext.ui.filePropertyTester" namespace="org.eclipse.mylyn.wikitext"
+ properties="contentTypeClassification" type="org.eclipse.core.resources.IFile">
+ </propertyTester>
+ </extension>
+
+ <extension point="org.eclipse.ui.menus">
+ <menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions">
+ <menu label="%menu.label.0" tooltip="%menu.tooltip.0">
+ <command commandId="org.eclipse.mylyn.wikitext.ui.convertToDocbookCommand"
+ label="%command.label.0" tooltip="%command.tooltip.0" helpContextId="org.eclipse.mylyn.wikitext.help.ui.markupConversion">
+ </command>
+ <command commandId="org.eclipse.mylyn.wikitext.ui.convertToHtmlCommand"
+ label="%command.label.1" tooltip="%command.tooltip.1" helpContextId="org.eclipse.mylyn.wikitext.help.ui.markupConversion">
+ </command>
+ <command commandId="org.eclipse.mylyn.wikitext.ui.convertToEclipseHelpCommand"
+ label="%command.label.2" tooltip="%command.tooltip.2" helpContextId="org.eclipse.mylyn.wikitext.help.ui.markupConversion">
+ </command>
+ <visibleWhen>
+ <or>
+ <with variable="activeMenuSelection">
+ <and>
+ <count value="+"/>
+ <iterate>
+ <adapt type="org.eclipse.core.resources.IFile">
+ <test property="org.eclipse.mylyn.wikitext.contentTypeClassification"
+ value="org.eclipse.mylyn.wikitext" />
+ </adapt>
+ </iterate>
+ </and>
+ </with>
+ <with variable="activeMenuEditorInput">
+ <iterate>
+ <adapt type="org.eclipse.core.resources.IFile">
+ <test property="org.eclipse.mylyn.wikitext.contentTypeClassification"
+ value="org.eclipse.mylyn.wikitext" />
+ </adapt>
+ </iterate>
+ </with>
+ </or>
+ </visibleWhen>
+ </menu>
+ </menuContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.mylyn.wikitext.ui.commands.ConvertMarkupToDocbook"
+ id="org.eclipse.mylyn.wikitext.ui.convertToDocbookCommand" name="%command.name.0">
+ </command>
+ <command defaultHandler="org.eclipse.mylyn.wikitext.ui.commands.ConvertMarkupToHtml"
+ id="org.eclipse.mylyn.wikitext.ui.convertToHtmlCommand" name="%command.name.1" />
+ <command
+ defaultHandler="org.eclipse.mylyn.wikitext.ui.commands.ConvertMarkupToEclipseHelp"
+ id="org.eclipse.mylyn.wikitext.ui.convertToEclipseHelpCommand" name="%command.name.2" />
+ <command id="org.eclipse.mylyn.wikitext.ui.editor.showCheatSheetCommand"
+ name="%command.name.3" />
+
+ <command
+ categoryId="org.eclipse.ui.category.navigate"
+ description="%command.description.5"
+ id="org.eclipse.mylyn.wikitext.ui.quickOutlineCommand"
+ name="%command.name.5"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.handlers">
+ <handler commandId="org.eclipse.mylyn.wikitext.ui.editor.showCheatSheetCommand"
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.commands.ShowCheatSheetCommand">
+ <activeWhen>
+ <with variable="activeFocusControlId">
+ <equals value="org.eclipse.mylyn.wikitext.ui.editor.sourceViewer"/>
+ </with>
+ </activeWhen>
+ </handler>
+ <handler commandId="org.eclipse.mylyn.wikitext.ui.quickOutlineCommand"
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.commands.ShowQuickOutlineCommand">
+ <activeWhen>
+ <with variable="activeFocusControlId">
+ <equals value="org.eclipse.mylyn.wikitext.ui.editor.sourceViewer"/>
+ </with>
+ </activeWhen>
+ </handler>
+ </extension>
+
+ <extension point="org.eclipse.ui.editors">
+ <editor class="org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor"
+ contributorClass="org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditorActionBarContributor"
+ default="true" icon="icons/editor-icon.gif"
+ id="org.eclipse.mylyn.wikitext.ui.editor.markupEditor" name="%editor.name.0">
+ <contentTypeBinding contentTypeId="org.eclipse.mylyn.wikitext"/>
+ </editor>
+ </extension>
+
+ <extension point="org.eclipse.ui.contexts">
+ <context description="%context.description.0"
+ id="org.eclipse.mylyn.wikitext.ui.editor.markupSourceContext" name="%context.name.0"
+ parentId="org.eclipse.ui.textEditorScope">
+ </context>
+ </extension>
+
+ <extension point="org.eclipse.ui.bindings">
+ <!-- win32: M1=CTRL, M2=SHIFT, M3=ALT, M4=-
+ carbon: M1=COMMAND, M2=SHIFT, M3=ALT, M4=CTRL -->
+ <key sequence="F1"
+ contextId="org.eclipse.mylyn.wikitext.ui.editor.markupSourceContext"
+ commandId="org.eclipse.mylyn.wikitext.ui.editor.showCheatSheetCommand"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+ </key>
+ <key
+ sequence="M1+O"
+ contextId="org.eclipse.mylyn.wikitext.ui.editor.markupSourceContext"
+ commandId="org.eclipse.mylyn.wikitext.ui.quickOutlineCommand"
+ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
+ </key>
+ </extension>
+
+ <extension point="org.eclipse.ui.commands">
+ <category description="%category.description.0"
+ id="org.eclipse.mylyn.wikitext.ui.editor.category" name="%category.name.0">
+ </category>
+ <command categoryId="org.eclipse.mylyn.wikitext.ui.editor.category"
+ description="%command.description.0"
+ id="org.eclipse.mylyn.wikitext.ui.editor.showCheatSheetCommand" name="%command.name.4">
+ </command>
+ </extension>
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ targetID="org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor.ruler"
+ id="org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor.ruler">
+ <menu id="folding" label="%folding.label" path="rulers"/>
+ <action label="%empty.label" tooltip="%empty.label"
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.actions.ToggleFoldingRulerAction"
+ menubarPath="folding/additions" definitionId="org.eclipse.ui.edit.text.folding.toggle"
+ id="org.eclipse.mylyn.internal.wikitext.ui.editor.actions.folding.toggle">
+ </action>
+ <action label="%empty.label" tooltip="%empty.label"
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.actions.ExpandAllFoldingRulerAction"
+ menubarPath="folding/additions" definitionId="org.eclipse.ui.edit.text.folding.expand_all"
+ id="org.eclipse.mylyn.internal.wikitext.ui.editor.actions.expandAll">
+ </action>
+ <action label="%empty.label" tooltip="%empty.label"
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.actions.CollapseAllFoldingRulerAction"
+ menubarPath="folding/additions" definitionId="org.eclipse.ui.edit.text.folding.collapse_all"
+ id="org.eclipse.mylyn.internal.wikitext.ui.editor.actions.collapseAll">
+ </action>
+ </viewerContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page category="org.eclipse.ui.preferencePages.GeneralTextEditor"
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.EditorPreferencePage"
+ id="org.eclipse.mylyn.wikitext.ui.editor.preferences.EditorPreferencePage"
+ name="%page.name.0">
+ </page>
+ </extension>
+
+ <extension point="org.eclipse.core.runtime.preferences">
+ <initializer
+ class="org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.PreferenceInitializer">
+ </initializer>
+ </extension>
+
+ <extension id="org.eclipse.mylyn.wikitext.core.validation.problem"
+ name="WikiText Markup Problem" point="org.eclipse.core.resources.markers">
+ <persistent value="false" />
+ <super type="org.eclipse.core.resources.problemmarker" />
+ <super type="org.eclipse.core.resources.textmarker" />
+ </extension>
+
+ <extension point="org.eclipse.ui.editors.annotationTypes">
+ <type name="org.eclipse.mylyn.wikitext.ui.editor.problem.validation.error"
+ super="org.eclipse.ui.workbench.texteditor.error" />
+ <type
+ name="org.eclipse.mylyn.wikitext.ui.editor.problem.validation.warning"
+ super="org.eclipse.ui.workbench.texteditor.warning" />
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="menu:help?before=group.assist">
+ <command
+ commandId="org.eclipse.mylyn.wikitext.ui.editor.showCheatSheetCommand"
+ icon="icons/help.gif"
+ label="%command.label.3"
+ style="push"
+ tooltip="%command.tooltip.3">
+ <visibleWhen>
+ `<with variable="activeContexts">
+ <iterate operator="or">
+ <equals
+ value="org.eclipse.mylyn.wikitext.ui.editor.markupSourceContext"/>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ id="wikiTextNature"
+ name="WikiText Nature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.mylyn.internal.wikitext.ui.WikiTextNature">
+ </run>
+ </runtime>
+ </extension>
+ <extension
+ id="wikiTextValidationBuilder"
+ name="WikiText Validation"
+ point="org.eclipse.core.resources.builders">
+ <builder>
+ <run
+ class="org.eclipse.mylyn.internal.wikitext.ui.validation.ValidationProjectBuilder">
+ </run>
+ </builder>
+ </extension>
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ class="org.eclipse.mylyn.internal.wikitext.ui.properties.ProjectPropertyPage"
+ id="org.eclipse.mylyn.wikitext.ui.projectProperties"
+ name="%page.name.1">
+ <enabledWhen>
+ <adapt
+ type="org.eclipse.core.resources.IProject"/>
+ </enabledWhen>
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem"
+ class="org.eclipse.mylyn.internal.wikitext.ui.util.OutlineItemAdapterFactory">
+ <adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
+ </factory>
+ </extension>
+</plugin>
diff --git a/org.eclipse.mylyn.wikitext.ui/schema/cheatSheet.exsd b/org.eclipse.mylyn.wikitext.ui/schema/cheatSheet.exsd
new file mode 100644
index 0000000..3d14c2c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/schema/cheatSheet.exsd
@@ -0,0 +1,138 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.wikitext.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.wikitext.ui" id="cheatSheet" name="Markup Language Cheat Seet"/>
+ </appInfo>
+ <documentation>
+ Plugin cheat-sheet content specific to a markup language.
+Cheat-sheet content is help text that provides information about the syntax of a specific markup language. This help text is presented to the user within the markup editor.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="content" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="content">
+ <annotation>
+ <documentation>
+ a pointer to markup language-specific cheat sheet help content
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="markupLanguage" type="string" use="required">
+ <annotation>
+ <documentation>
+ the name of the markup language for which the cheat sheet content is relevant (eg: "Textile", "MediaWiki", etc)
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="resource" type="string" use="required">
+ <annotation>
+ <documentation>
+ A path to the resource that provides the content.
+
+The provided resource path is the default resource, however additional resources may be located alongside the default resource in order to provide locale-specific content. This works in the same way as for resource bundles.
+
+For example, the resource may be specified as help/cheatSheet.textile and for the locale 'no_NO_NY' the following resource paths would be searched in the following order:
+
+help/cheatSheet_no_NO_NY.textile
+help/cheatSheet_no_NO.textile
+help/cheatSheet_no.textile
+help/cheatSheet.textile
+
+in this way the user is presented with the most locale-specific help resource.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="contentLanguage" type="string">
+ <annotation>
+ <documentation>
+ The markup language of the help content. If unspecified, then HTML is assumed. Otherwise the contentLanguage may be specified as any registered markup language (eg: "Textile", "MediaWiki", etc).
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ <pre>
+<extension
+ point="org.eclipse.mylyn.wikitext.ui.cheatSheet">
+ <content
+ contentLanguage="Textile"
+ markupLanguage="Textile"
+ resource="help/cheatSheet/Textile.textile">
+ </content>
+</extension>
+</pre>
+ </documentation>
+ </annotation>
+
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2007, 2009 David Green 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.wikitext.ui/schema/contentAssist.exsd b/org.eclipse.mylyn.wikitext.ui/schema/contentAssist.exsd
new file mode 100644
index 0000000..c51c32a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/schema/contentAssist.exsd
@@ -0,0 +1,166 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.mylyn.wikitext.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.mylyn.wikitext.ui" id="contentAssist" name="Markup Language Content Assist"/>
+ </appInfo>
+ <documentation>
+ Add markup-language-specific content assistance (templates) to the editor. The WikiText markup editor provides a declarative means of associating content assist with a specific markup language.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="templates" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="template">
+ <complexType>
+ <attribute name="name" type="string" use="required">
+ <annotation>
+ <documentation>
+ a brief, one-line sample that identifies the template to the user in the UI. Normally the sample consists of 16 or fewer characters.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="description" type="string" use="required">
+ <annotation>
+ <documentation>
+ A brief description that informs the user of the nature of the template.
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="autoInsert" type="string">
+ <annotation>
+ <documentation>
+ indicate if the template is auto-insertable, that is if the template may be inserted when content assist is presented if only one choice is available. If omitted, the default is true.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="content" type="string">
+ <annotation>
+ <documentation>
+ The template content, where ${varname} are variables and \n is a newline, and \\ is the '\' character. Note that ${text} and ${selection} are variables that correspond to the current text selection.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="block" type="string">
+ <annotation>
+ <documentation>
+ Indicate if the template is a block template. If omitted, false is assumed.
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="templates">
+ <complexType>
+ <sequence>
+ <element ref="template" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="markupLanguage" type="string" use="required">
+ <annotation>
+ <documentation>
+ the name of the markup language for which the templates are relevant
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ <pre>
+<extension
+ point="org.eclipse.mylyn.wikitext.ui.contentAssist">
+
+ <templates
+ markupLanguage="Textile">
+ <!-- phrase modifiers -->
+ <template name="_" description="%template.description.emphasis" content="_${text}_ $"/>
+ <template name="*" description="%template.description.bold" content="*${text}* $"/>
+ <template name="@" description="%template.description.code" content="@${text}@ $"/>
+
+ <!-- block templates -->
+
+ <template name="h1. " description="%template.description.heading1" content="\nh1. ${text}\n\n" block="true"/>
+ <template name="h2. " description="%template.description.heading2" content="\nh2. ${text}\n\n" block="true"/>
+ <template name="h3. " description="%template.description.heading3" content="\nh3. ${text}\n\n" block="true"/>
+ <template name="bc. " description="%template.description.blockCode" content="\nbc. ${text}\n\n" block="true"/>
+ <template name="bq. " description="%template.description.blockQuote" content="\nbq. ${text}\n\n" block="true"/>
+ <template name="# " description="%template.description.numericList" content="\n# ${text}\n# ${text2}\n\n" block="true"/>
+ <template name="* " description="%template.description.bulletedList" content="\n* ${text}\n* ${text2}\n\n" block="true"/>
+ <template name="!" description="%template.description.image" content="!${text}! $"/>
+ <template name="&quot;" description="%template.description.hyperlink" content="&quot;${text}&quot;:${url} $"/>
+
+ </templates>
+ </extension>
+</pre>
+ </documentation>
+ </annotation>
+
+
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ Copyright (c) 2007, 2009 David Green 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
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/Messages.java
new file mode 100644
index 0000000..4b3bf10
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/Messages.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.messages"; //$NON-NLS-1$
+
+ public static String WikiTextNature_cannotValidateNatureSet;
+
+ public static String WikiTextUiPlugin_contentRequired;
+
+ public static String WikiTextUiPlugin_descriptionRequired;
+
+ public static String WikiTextUiPlugin_invalidExtension;
+
+ public static String WikiTextUiPlugin_invalidMarkupLanguage;
+
+ public static String WikiTextUiPlugin_markupLanguageContentAlreadyDeclared;
+
+ public static String WikiTextUiPlugin_markupLanguageRequired;
+
+ public static String WikiTextUiPlugin_nameRequired;
+
+ public static String WikiTextUiPlugin_resourceRequired;
+
+ public static String WikiTextUiPlugin_unexpectedExtensionElement;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/WikiTextNature.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/WikiTextNature.java
new file mode 100644
index 0000000..e40f5ab
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/WikiTextNature.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.wikitext.ui.validation.ValidationProjectBuilder;
+
+/**
+ * A WikiText nature which configures a project to have the WikiText validation builder.
+ *
+ * @author David Green
+ */
+public class WikiTextNature implements IProjectNature {
+
+ public static final String ID = "org.eclipse.mylyn.wikitext.ui.wikiTextNature"; //$NON-NLS-1$
+
+ private IProject project;
+
+ /**
+ * install the WikiText nature on a project
+ */
+ public static void install(IProject project, IProgressMonitor monitor) throws CoreException {
+ IProjectDescription description = project.getDescription();
+ String[] natures = description.getNatureIds();
+ String[] newNatures = new String[natures.length + 1];
+ System.arraycopy(natures, 0, newNatures, 0, natures.length);
+ newNatures[natures.length] = ID;
+ IStatus status = ResourcesPlugin.getWorkspace().validateNatureSet(natures);
+
+ // check the status and decide what to do
+ if (status.getCode() == IStatus.OK) {
+ description.setNatureIds(newNatures);
+ project.setDescription(description, monitor);
+ } else {
+ throw new CoreException(WikiTextUiPlugin.getDefault().createStatus(
+ Messages.WikiTextNature_cannotValidateNatureSet, IStatus.ERROR, null));
+ }
+ }
+
+ public static void uninstall(IProject project, IProgressMonitor monitor) throws CoreException {
+ IProjectDescription description = project.getDescription();
+ String[] natures = description.getNatureIds();
+ List<String> newNatures = new ArrayList<String>(natures.length);
+ for (String n : natures) {
+ if (!n.equals(ID)) {
+ newNatures.add(n);
+ }
+ }
+ if (newNatures.size() != natures.length) {
+ natures = newNatures.toArray(new String[newNatures.size()]);
+ IStatus status = ResourcesPlugin.getWorkspace().validateNatureSet(natures);
+
+ // check the status and decide what to do
+ if (status.getCode() == IStatus.OK) {
+ description.setNatureIds(natures);
+ project.setDescription(description, monitor);
+ } else {
+ throw new CoreException(WikiTextUiPlugin.getDefault().createStatus(
+ Messages.WikiTextNature_cannotValidateNatureSet, IStatus.ERROR, null));
+ }
+
+ }
+ }
+
+ public void configure() throws CoreException {
+ // add the WikiText validation builder
+ IProjectDescription desc = project.getDescription();
+ ICommand[] commands = desc.getBuildSpec();
+ boolean found = false;
+
+ for (ICommand command : commands) {
+ if (command.getBuilderName().equals(ValidationProjectBuilder.ID)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //add builder to project
+ ICommand command = desc.newCommand();
+ command.setBuilderName(ValidationProjectBuilder.ID);
+ ICommand[] newCommands = new ICommand[commands.length + 1];
+
+ // Add it before other builders.
+ System.arraycopy(commands, 0, newCommands, 1, commands.length);
+ newCommands[0] = command;
+ desc.setBuildSpec(newCommands);
+ project.setDescription(desc, null);
+ }
+ }
+
+ public void deconfigure() throws CoreException {
+ // remove the WikiText validation builder
+ IProjectDescription desc = project.getDescription();
+ ICommand[] commands = desc.getBuildSpec();
+
+ List<ICommand> newCommands = new ArrayList<ICommand>(commands.length);
+ for (ICommand command : commands) {
+ if (!command.getBuilderName().equals(ValidationProjectBuilder.ID)) {
+ newCommands.add(command);
+ }
+ }
+ if (newCommands.size() == commands.length - 1) {
+ desc.setBuildSpec(newCommands.toArray(new ICommand[newCommands.size()]));
+ project.setDescription(desc, null);
+ }
+ }
+
+ public IProject getProject() {
+ return project;
+ }
+
+ public void setProject(IProject project) {
+ this.project = project;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/WikiTextUiPlugin.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/WikiTextUiPlugin.java
new file mode 100644
index 0000000..1a7b0ba
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/WikiTextUiPlugin.java
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.ILog;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.assist.MarkupTemplateCompletionProcessor;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.assist.Templates;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.help.CheatSheetContent;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.help.HelpContent;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.Preferences;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class WikiTextUiPlugin extends AbstractUIPlugin {
+
+ private static final String EXTENSION_POINT_CHEAT_SHEET = "cheatSheet"; //$NON-NLS-1$
+
+ private static final String EXTENSION_POINT_CONTENT_ASSIST = "contentAssist"; //$NON-NLS-1$
+
+ private static final String EXTENSION_POINT_TEMPLATES = "templates"; //$NON-NLS-1$
+
+ private static final String EXTENSION_POINT_TEMPLATE = "template"; //$NON-NLS-1$
+
+ private static WikiTextUiPlugin plugin;
+
+ private SortedMap<String, HelpContent> cheatSheets;
+
+ private Map<String, Templates> templates;
+
+ private Preferences preferences;
+
+ private IPropertyChangeListener preferencesListener;
+
+ public WikiTextUiPlugin() {
+ plugin = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ preferencesListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ preferences = null;
+ }
+ };
+ getPreferenceStore().addPropertyChangeListener(preferencesListener);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ if (preferencesListener != null) {
+ getPreferenceStore().removePropertyChangeListener(preferencesListener);
+ preferencesListener = null;
+ }
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static WikiTextUiPlugin getDefault() {
+ return plugin;
+ }
+
+ public void log(Throwable ce) {
+ if (ce instanceof CoreException) {
+ getLog().log(((CoreException) ce).getStatus());
+ } else {
+ log(IStatus.ERROR, ce.getMessage(), ce);
+ }
+ }
+
+ public void log(int severity, String message, Throwable exception) {
+ if (message == null) {
+ message = ""; //$NON-NLS-1$
+ }
+ ILog log = getLog();
+ IStatus status = null;
+ if (exception instanceof CoreException) {
+ status = ((CoreException) exception).getStatus();
+ }
+ if (status == null) {
+ status = new Status(severity, getPluginId(), severity, message, exception);
+ }
+ log.log(status);
+ }
+
+ public String getPluginId() {
+ return getBundle().getSymbolicName();
+ }
+
+ public IStatus createStatus(int statusCode, Throwable exception) {
+ return createStatus(null, statusCode, exception);
+ }
+
+ public IStatus createStatus(String message, int statusCode, Throwable exception) {
+ if (message == null && exception != null) {
+ message = exception.getClass().getName() + ": " + exception.getMessage(); //$NON-NLS-1$
+ }
+ Status status = new Status(statusCode, getPluginId(), statusCode, message, exception);
+ return status;
+ }
+
+ public Preferences getPreferences() {
+ if (preferences == null) {
+ Preferences prefs = new Preferences();
+ prefs.load(getPreferenceStore());
+ prefs.makeImmutable();
+ preferences = prefs;
+ }
+ return preferences;
+ }
+
+ public SortedMap<String, HelpContent> getCheatSheets() {
+ if (cheatSheets == null) {
+ SortedMap<String, HelpContent> cheatSheets = new TreeMap<String, HelpContent>();
+
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(getPluginId(),
+ EXTENSION_POINT_CHEAT_SHEET);
+ if (extensionPoint != null) {
+ IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
+ for (IConfigurationElement element : configurationElements) {
+ String declaringPluginId = element.getDeclaringExtension().getContributor().getName();
+ Bundle bundle = Platform.getBundle(declaringPluginId);
+ String markupLanguage = element.getAttribute("markupLanguage"); //$NON-NLS-1$
+ String contentLanguage = element.getAttribute("contentLanguage"); //$NON-NLS-1$
+ String resource = element.getAttribute("resource"); //$NON-NLS-1$
+ try {
+ if (markupLanguage == null) {
+ throw new Exception(Messages.WikiTextUiPlugin_markupLanguageRequired);
+ } else if (!WikiText.getMarkupLanguageNames().contains(markupLanguage)) {
+ throw new Exception(NLS.bind(Messages.WikiTextUiPlugin_invalidMarkupLanguage,
+ new Object[] { markupLanguage }));
+ }
+ if (resource == null || resource.length() == 0) {
+ throw new Exception(Messages.WikiTextUiPlugin_resourceRequired);
+ }
+ HelpContent cheatSheet = new CheatSheetContent(bundle, resource, contentLanguage,
+ markupLanguage);
+ HelpContent previous = cheatSheets.put(cheatSheet.getMarkupLanguageName(), cheatSheet);
+ if (previous != null) {
+ cheatSheets.put(previous.getMarkupLanguageName(), previous);
+ throw new Exception(NLS.bind(
+ Messages.WikiTextUiPlugin_markupLanguageContentAlreadyDeclared,
+ new Object[] { previous.getMarkupLanguageName(),
+ previous.getProvider().getSymbolicName() }));
+ }
+ } catch (Exception e) {
+ log(IStatus.ERROR, NLS.bind(Messages.WikiTextUiPlugin_invalidExtension,
+ new Object[] { declaringPluginId, EXTENSION_POINT_CHEAT_SHEET, e.getMessage() }), e);
+ }
+ }
+ }
+
+ this.cheatSheets = Collections.unmodifiableSortedMap(cheatSheets);
+ }
+ return cheatSheets;
+ }
+
+ /**
+ * get templates mapped by their markup language name
+ *
+ * @return the templates
+ */
+ public Map<String, Templates> getTemplates() {
+ if (templates == null) {
+ Map<String, Templates> templates = new HashMap<String, Templates>();
+
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(getPluginId(),
+ EXTENSION_POINT_CONTENT_ASSIST);
+ if (extensionPoint != null) {
+
+ IConfigurationElement[] configurationElements = extensionPoint.getConfigurationElements();
+ for (IConfigurationElement element : configurationElements) {
+ String declaringPluginId = element.getDeclaringExtension().getContributor().getName();
+ if (EXTENSION_POINT_TEMPLATES.equals(element.getName())) {
+ try {
+ String markupLanguage = element.getAttribute("markupLanguage"); //$NON-NLS-1$
+ if (markupLanguage == null) {
+ throw new Exception(Messages.WikiTextUiPlugin_markupLanguageRequired);
+ } else if (!WikiText.getMarkupLanguageNames().contains(markupLanguage)) {
+ throw new Exception(NLS.bind(
+ Messages.WikiTextUiPlugin_invalidMarkupLanguage,
+ new Object[] { markupLanguage }));
+ }
+ Templates markupLanguageTemplates = new Templates();
+ markupLanguageTemplates.setMarkupLanguageName(markupLanguage);
+
+ for (IConfigurationElement templatesChild : element.getChildren()) {
+ if (EXTENSION_POINT_TEMPLATE.equals(templatesChild.getName())) {
+ try {
+ // process the template
+ String name = templatesChild.getAttribute("name"); //$NON-NLS-1$
+ String description = templatesChild.getAttribute("description"); //$NON-NLS-1$
+ String content = templatesChild.getAttribute("content"); //$NON-NLS-1$
+ String autoInsert = templatesChild.getAttribute("autoInsert"); //$NON-NLS-1$
+ String block = templatesChild.getAttribute("block"); //$NON-NLS-1$
+
+ if (name == null || name.length() == 0) {
+ throw new Exception(NLS.bind(
+ Messages.WikiTextUiPlugin_nameRequired,
+ new Object[] { EXTENSION_POINT_TEMPLATE }));
+ }
+ if (description == null || description.length() == 0) {
+ throw new Exception(NLS.bind(
+ Messages.WikiTextUiPlugin_descriptionRequired,
+ new Object[] { EXTENSION_POINT_TEMPLATE }));
+ }
+ if (content == null || content.length() == 0) {
+ throw new Exception(NLS.bind(
+ Messages.WikiTextUiPlugin_contentRequired,
+ new Object[] { EXTENSION_POINT_TEMPLATE }));
+ }
+ content = content.replace("\\r\\n", Text.DELIMITER).replace("\\r", //$NON-NLS-1$ //$NON-NLS-2$
+ Text.DELIMITER).replace("\\n", Text.DELIMITER).replace("\\\\", "\\"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if (content.endsWith("$") //$NON-NLS-1$
+ && !(content.endsWith("\\$") || content.endsWith("$$"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ content = content.substring(0, content.length() - 1);
+ }
+ content = content.replace("\\$", "$$"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ markupLanguageTemplates.addTemplate(new Template(name, description,
+ MarkupTemplateCompletionProcessor.CONTEXT_ID, content,
+ autoInsert == null || !"false".equalsIgnoreCase(autoInsert)), //$NON-NLS-1$
+ block != null && "true".equalsIgnoreCase(block)); //$NON-NLS-1$
+ } catch (Exception e) {
+ log(IStatus.ERROR, NLS.bind(
+ Messages.WikiTextUiPlugin_invalidExtension, new Object[] {
+ declaringPluginId, EXTENSION_POINT_CONTENT_ASSIST,
+ e.getMessage() }), e);
+ }
+ } else {
+ log(IStatus.ERROR, NLS.bind(
+ Messages.WikiTextUiPlugin_unexpectedExtensionElement, new Object[] {
+ declaringPluginId, EXTENSION_POINT_CONTENT_ASSIST,
+ templatesChild.getName() }), null);
+ }
+ }
+ Templates previous = templates.put(markupLanguageTemplates.getMarkupLanguageName(),
+ markupLanguageTemplates);
+ if (previous != null) {
+ markupLanguageTemplates.addAll(previous);
+ }
+ } catch (Exception e) {
+ log(IStatus.ERROR, NLS.bind(Messages.WikiTextUiPlugin_invalidExtension,
+ new Object[] { declaringPluginId, EXTENSION_POINT_TEMPLATES, e.getMessage() }), e);
+ }
+ } else {
+ log(IStatus.ERROR, NLS.bind(Messages.WikiTextUiPlugin_unexpectedExtensionElement,
+ new Object[] { declaringPluginId, EXTENSION_POINT_CONTENT_ASSIST, element.getName() }),
+ null);
+ }
+ }
+ }
+
+ // now that we have the basic templates, check for language extensions and connect the hierarchy
+
+ // first ensure that all language names have templates defined
+ Set<String> languageNames = WikiText.getMarkupLanguageNames();
+ for (String languageName : languageNames) {
+ Templates languageTemplates = templates.get(languageName);
+ if (languageTemplates == null) {
+ languageTemplates = new Templates();
+ templates.put(languageName, languageTemplates);
+ }
+ }
+ // next connect the hierarchy
+ for (String languageName : languageNames) {
+ MarkupLanguage markupLanguage = WikiText.getMarkupLanguage(languageName);
+ if (markupLanguage != null && markupLanguage.getExtendsLanguage() != null) {
+ Templates languageTemplates = templates.get(languageName);
+ Templates parentLanguageTemplates = templates.get(markupLanguage.getExtendsLanguage());
+
+ languageTemplates.setParent(parentLanguageTemplates);
+ }
+ }
+
+ this.templates = Collections.unmodifiableMap(templates);
+ }
+ return templates;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/FoldingStructure.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/FoldingStructure.java
new file mode 100644
index 0000000..f88290d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/FoldingStructure.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ *
+ * @author David Green
+ */
+class FoldingStructure implements IFoldingStructure {
+
+ private interface AnnotationOperation {
+ public boolean operate(HeadingProjectionAnnotation annotation);
+ }
+
+ private static abstract class AbstractItemsAnnotationOperation implements AnnotationOperation {
+
+ final Set<String> ids;
+
+ protected AbstractItemsAnnotationOperation(Collection<OutlineItem> items) {
+ ids = idsOf(items);
+ }
+
+ Set<String> idsOf(Collection<OutlineItem> items) {
+ if (items == null || items.isEmpty()) {
+ return Collections.emptySet();
+ }
+ Set<String> ids = new HashSet<String>();
+ for (OutlineItem item : items) {
+ ids.add(item.getId());
+ }
+ return ids;
+ }
+
+ public final boolean operate(HeadingProjectionAnnotation annotation) {
+ if (ids.contains(annotation.getHeadingId())) {
+ return operateOnSelected(annotation);
+ } else {
+ return operateOnUnselected(annotation);
+ }
+ }
+
+ public abstract boolean operateOnSelected(HeadingProjectionAnnotation annotation);
+
+ public boolean operateOnUnselected(HeadingProjectionAnnotation annotation) {
+ return false;
+ }
+ }
+
+ final ProjectionViewer viewer;
+
+ final ITextOperationTarget textOperationTarget;
+
+ public FoldingStructure(MarkupEditor editor) {
+ viewer = (ProjectionViewer) editor.getViewer();
+ textOperationTarget = (ITextOperationTarget) editor.getAdapter(ITextOperationTarget.class);
+ }
+
+ public void collapseAll(boolean collapseRegionContainingCaret) {
+ if (!isFoldingEnabled()) {
+ return;
+ }
+ if (collapseRegionContainingCaret) {
+ textOperationTarget.doOperation(ProjectionViewer.COLLAPSE_ALL);
+ } else {
+ operateOnAnnotations(new AbstractItemsAnnotationOperation(new ArrayList<OutlineItem>()) {
+ @Override
+ public boolean operateOnSelected(HeadingProjectionAnnotation annotation) {
+ return operateOnUnselected(annotation);
+ }
+
+ @Override
+ public boolean operateOnUnselected(HeadingProjectionAnnotation annotation) {
+ if (!annotation.isCollapsed()) {
+ annotation.markCollapsed();
+ return true;
+ }
+ return false;
+ }
+ }, collapseRegionContainingCaret);
+ }
+ }
+
+ public void collapseElements(Collection<OutlineItem> items, final boolean collapseRegionContainingCaret) {
+ if (!isFoldingEnabled()) {
+ return;
+ }
+ if (items == null || items.isEmpty()) {
+ return;
+ }
+ operateOnAnnotations(new AbstractItemsAnnotationOperation(items) {
+ @Override
+ public boolean operateOnSelected(HeadingProjectionAnnotation annotation) {
+ if (!annotation.isCollapsed()) {
+ annotation.markCollapsed();
+ return true;
+ }
+ return false;
+ }
+ }, collapseRegionContainingCaret);
+ }
+
+ public void expandAll() {
+ if (!isFoldingEnabled()) {
+ return;
+ }
+ textOperationTarget.doOperation(ProjectionViewer.EXPAND_ALL);
+ }
+
+ public void expandElements(Collection<OutlineItem> items) {
+ if (!isFoldingEnabled()) {
+ return;
+ }
+ if (items == null || items.isEmpty()) {
+ return;
+ }
+ operateOnAnnotations(new AbstractItemsAnnotationOperation(items) {
+ @Override
+ public boolean operateOnSelected(HeadingProjectionAnnotation annotation) {
+ if (annotation.isCollapsed()) {
+ annotation.markExpanded();
+ return true;
+ }
+ return false;
+ }
+ }, true);
+ }
+
+ public void expandElementsExclusive(Collection<OutlineItem> items, boolean collapseRegionContainingCaret) {
+ if (!isFoldingEnabled()) {
+ return;
+ }
+ if (items == null || items.isEmpty()) {
+ collapseAll(collapseRegionContainingCaret);
+ return;
+ }
+ operateOnAnnotations(new AbstractItemsAnnotationOperation(items) {
+ @Override
+ public boolean operateOnSelected(HeadingProjectionAnnotation annotation) {
+ if (annotation.isCollapsed()) {
+ annotation.markExpanded();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean operateOnUnselected(HeadingProjectionAnnotation annotation) {
+ if (!annotation.isCollapsed()) {
+ annotation.markCollapsed();
+ return true;
+ }
+ return false;
+ }
+ }, collapseRegionContainingCaret);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void operateOnAnnotations(AnnotationOperation operation, boolean collapseRegionIncludingCaret) {
+ if (!isFoldingEnabled()) {
+ return;
+ }
+ Point selectedRange = viewer.getSelectedRange();
+ Position selectedPosition = selectedRange == null ? null : new Position(selectedRange.x, selectedRange.y);
+ boolean updateSelectedRange = false;
+ ProjectionAnnotationModel annotationModel = viewer.getProjectionAnnotationModel();
+ List<Annotation> modifications = null;
+ Iterator<Annotation> iterator = annotationModel.getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation annotation = iterator.next();
+ if (annotation instanceof HeadingProjectionAnnotation) {
+ HeadingProjectionAnnotation projectionAnnotation = (HeadingProjectionAnnotation) annotation;
+ if (operation.operate(projectionAnnotation)) {
+ if (modifications == null) {
+ modifications = new ArrayList<Annotation>();
+ }
+ modifications.add(projectionAnnotation);
+ Position position = annotationModel.getPosition(projectionAnnotation);
+
+ if (!collapseRegionIncludingCaret && projectionAnnotation.isCollapsed() && selectedPosition != null
+ && selectedPosition.overlapsWith(position.getOffset(), position.getLength())) {
+ projectionAnnotation.markExpanded();
+ }
+
+ if (selectedPosition != null && position != null && projectionAnnotation.isCollapsed()
+ && selectedPosition.overlapsWith(position.offset, position.length)) {
+ updateSelectedRange = true;
+ }
+ }
+ }
+ }
+ if (modifications != null) {
+ if (updateSelectedRange) {
+ // a collapsed region overlaps with the selection. Attempt to relocate the selection to a region that is not collapsed,
+ // or if we can't find one move it to 0.
+ int offset = 0;
+ iterator = annotationModel.getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation annotation = iterator.next();
+ if (annotation instanceof HeadingProjectionAnnotation) {
+ HeadingProjectionAnnotation projectionAnnotation = (HeadingProjectionAnnotation) annotation;
+ if (!projectionAnnotation.isCollapsed()) {
+ Position position = annotationModel.getPosition(projectionAnnotation);
+ if (position != null) {
+ offset = position.offset;
+ break;
+ }
+ }
+ }
+ }
+ viewer.setSelectedRange(offset, 0);
+ }
+ annotationModel.modifyAnnotations(null, null, modifications.toArray(new Annotation[modifications.size()]));
+ }
+ }
+
+ public final boolean isFoldingEnabled() {
+ return viewer.getProjectionAnnotationModel() != null;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/HeadingProjectionAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/HeadingProjectionAnnotation.java
new file mode 100644
index 0000000..ab7acdb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/HeadingProjectionAnnotation.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+
+/**
+ *
+ * @author David Green
+ */
+class HeadingProjectionAnnotation extends ProjectionAnnotation {
+ private final String headingId;
+
+ public HeadingProjectionAnnotation(String headingId) {
+ this.headingId = headingId;
+ }
+
+ public String getHeadingId() {
+ return headingId;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/IFoldingStructure.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/IFoldingStructure.java
new file mode 100644
index 0000000..e73582c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/IFoldingStructure.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import java.util.Collection;
+
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+
+/**
+ * a means of controlling the folding structure
+ *
+ * Obtain an instance of this interface as follows: <code>
+ * editor.getAdapter(IFoldingStructure.class)
+ * </code>
+ *
+ * @author dgreen
+ */
+public interface IFoldingStructure {
+ /**
+ * collapse the given items. Does nothing if folding is not {@link #isFoldingEnabled() enabled}.
+ *
+ * @param items
+ * the items to collapse
+ * @param collapseRegionContainingCaret
+ * indicate if the region containing the caret should be collapsed
+ */
+ public void collapseElements(Collection<OutlineItem> items, boolean collapseRegionContainingCaret);
+
+ /**
+ * expand the given items. Does nothing if folding is not {@link #isFoldingEnabled() enabled}.
+ *
+ * @param items
+ * the items to expand
+ * @param collapseRegionContainingCaret
+ * indicate if the region containing the caret should be collapsed
+ */
+ public void expandElements(Collection<OutlineItem> items);
+
+ /**
+ * expand the given items and collapse all others. Does nothing if folding is not {@link #isFoldingEnabled()
+ * enabled}.
+ *
+ * @param items
+ * the items to expand
+ * @param collapseRegionContainingCaret
+ * indicate if the region containing the caret should be collapsed
+ */
+ public void expandElementsExclusive(Collection<OutlineItem> items, boolean collapseRegionContainingCaret);
+
+ /**
+ * collapse all items. Does nothing if folding is not {@link #isFoldingEnabled() enabled}.
+ *
+ * @param collapseRegionContainingCaret
+ * indicate if the region containing the caret should be collapsed
+ */
+ public void collapseAll(boolean collapseRegionContainingCaret);
+
+ /**
+ * expand all items. Does nothing if folding is not {@link #isFoldingEnabled() enabled}.
+ */
+ public void expandAll();
+
+ /**
+ * indicate if folding is enabled.
+ *
+ * @return true if folding is enabled, otherwise false
+ */
+ public boolean isFoldingEnabled();
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditor.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditor.java
new file mode 100644
index 0000000..92003e2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditor.java
@@ -0,0 +1,1211 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Map.Entry;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.commands.ActionHandler;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.IDocumentPartitioningListener;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewerExtension6;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.URLHyperlink;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.projection.IProjectionListener;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.actions.SetMarkupLanguageAction;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.AbstractDocumentCommand;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.CommandManager;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.Preferences;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler.MarkupMonoReconciler;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.FastMarkupPartitioner;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.MarkupDocumentProvider;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.MarkupTokenScanner;
+import org.eclipse.mylyn.internal.wikitext.ui.util.NlsResourceBundle;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.browser.LocationListener;
+import org.eclipse.swt.browser.ProgressAdapter;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.contexts.IContextService;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.handlers.IHandlerService;
+import org.eclipse.ui.part.IShowInSource;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.IShowInTargetList;
+import org.eclipse.ui.part.ShowInContext;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.ui.swt.IFocusService;
+import org.eclipse.ui.texteditor.ContentAssistAction;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+
+
+/**
+ * A text editor for editing lightweight markup. Can be configured to accept any {@link MarkupLanguage}, with pluggable
+ * content assist, validation, and cheat-sheet help content.
+ *
+ * @author David Green
+ */
+public class MarkupEditor extends TextEditor implements IShowInTarget, IShowInSource, CommandManager {
+ private static final String RULER_CONTEXT_MENU_ID = "org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor.ruler"; //$NON-NLS-1$
+
+ /**
+ * the name of the property that stores the markup language name for per-file preference
+ *
+ * @see IFile#setPersistentProperty(QualifiedName, String) property
+ */
+ private static final String MARKUP_LANGUAGE = "markupLanguage"; //$NON-NLS-1$
+
+ /**
+ * the source editing context
+ */
+ public static final String CONTEXT = "org.eclipse.mylyn.wikitext.ui.editor.markupSourceContext"; //$NON-NLS-1$
+
+ /**
+ * the ID of the editor
+ */
+ public static final String ID = "org.eclipse.mylyn.wikitext.ui.editor.markupEditor"; //$NON-NLS-1$
+
+ private static final String[] SHOW_IN_TARGETS = { //
+ "org.eclipse.ui.views.ResourceNavigator", //$NON-NLS-1$
+ "org.eclipse.jdt.ui.PackageExplorer",//$NON-NLS-1$
+ "org.eclipse.ui.navigator.ProjectExplorer", // 3.5 //$NON-NLS-1$
+ IPageLayout.ID_OUTLINE };
+
+ private static IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() {
+ public String[] getShowInTargetIds() {
+ return SHOW_IN_TARGETS;
+ }
+ };
+
+ private IDocument document;
+
+ private IDocumentListener documentListener;
+
+ private boolean previewDirty = true;
+
+ private boolean outlineDirty = true;
+
+ private Browser browser;
+
+ private MarkupEditorOutline outlinePage;
+
+ private OutlineItem outlineModel;
+
+ private final OutlineParser outlineParser = new OutlineParser();
+ {
+ outlineParser.setLabelMaxLength(48);
+ outlineModel = outlineParser.createRootItem();
+ }
+
+ private boolean disableReveal = false;
+
+ private ISourceViewer viewer;
+
+ private IPropertyChangeListener preferencesListener;
+
+ private IDocumentPartitioningListener documentPartitioningListener;
+
+ private final MarkupSourceViewerConfiguration sourceViewerConfiguration;
+
+ private CTabItem sourceTab;
+
+ private ProjectionSupport projectionSupport;
+
+ private Map<String, HeadingProjectionAnnotation> projectionAnnotationById;
+
+ private boolean updateJobScheduled = false;
+
+ protected int documentGeneration = 0;
+
+ public static final String EDITOR_SOURCE_VIEWER = "org.eclipse.mylyn.wikitext.ui.editor.sourceViewer"; //$NON-NLS-1$
+
+ private UIJob updateOutlineJob;
+
+ private IFoldingStructure foldingStructure;
+
+ private CTabFolder tabFolder;
+
+ private CTabItem previewTab;
+
+ public MarkupEditor() {
+ setDocumentProvider(new MarkupDocumentProvider());
+ sourceViewerConfiguration = new MarkupSourceViewerConfiguration(getPreferenceStore());
+ sourceViewerConfiguration.setOutline(outlineModel);
+ sourceViewerConfiguration.setShowInTarget(this);
+ setSourceViewerConfiguration(sourceViewerConfiguration);
+ }
+
+ @Override
+ protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
+
+ tabFolder = new CTabFolder(parent, SWT.BOTTOM);
+
+ {
+ sourceTab = new CTabItem(tabFolder, SWT.NONE);
+ updateSourceTabLabel();
+
+ viewer = new MarkupProjectionViewer(tabFolder, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles
+ | SWT.WRAP);
+
+ sourceTab.setControl(viewer instanceof Viewer ? ((Viewer) viewer).getControl() : viewer.getTextWidget());
+ tabFolder.setSelection(sourceTab);
+ }
+
+ {
+ previewTab = new CTabItem(tabFolder, SWT.NONE);
+ previewTab.setText(Messages.MarkupEditor_preview);
+ previewTab.setToolTipText(Messages.MarkupEditor_preview_tooltip);
+
+ browser = new Browser(tabFolder, SWT.NONE);
+ // bug 260479: open hyperlinks in a browser
+ browser.addLocationListener(new LocationListener() {
+ public void changed(LocationEvent event) {
+ event.doit = false;
+ }
+
+ public void changing(LocationEvent event) {
+ // if it looks like an absolute URL
+ if (event.location.matches("([a-zA-Z]{3,8})://?.*")) { //$NON-NLS-1$
+
+ // workaround for browser problem (bug 262043)
+ int idxOfSlashHash = event.location.indexOf("/#"); //$NON-NLS-1$
+ if (idxOfSlashHash != -1) {
+ // allow javascript-based scrolling to work
+ if (!event.location.startsWith("file:///#")) { //$NON-NLS-1$
+ event.doit = false;
+ }
+ return;
+ }
+ // workaround end
+
+ event.doit = false;
+ try {
+ PlatformUI.getWorkbench().getBrowserSupport().createBrowser("org.eclipse.ui.browser") //$NON-NLS-1$
+ .openURL(new URL(event.location));
+ } catch (Exception e) {
+ new URLHyperlink(new Region(0, 1), event.location).open();
+ }
+ }
+ }
+ });
+ previewTab.setControl(browser);
+ }
+
+ tabFolder.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent selectionevent) {
+ widgetSelected(selectionevent);
+ }
+
+ public void widgetSelected(SelectionEvent selectionevent) {
+ if (tabFolder.getSelection() == previewTab) {
+ updatePreview(getNearestMatchingOutlineItem());
+ }
+ }
+ });
+ viewer.getTextWidget().addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ updateOutlineSelection();
+ }
+
+ });
+ viewer.getTextWidget().addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (isRelevantKeyCode(e.keyCode)) {
+ updateOutlineSelection();
+ }
+ }
+
+ private boolean isRelevantKeyCode(int keyCode) {
+ // for some reason not all key presses result in a selection change
+ switch (keyCode) {
+ case SWT.ARROW_DOWN:
+ case SWT.ARROW_LEFT:
+ case SWT.ARROW_RIGHT:
+ case SWT.ARROW_UP:
+ case SWT.PAGE_DOWN:
+ case SWT.PAGE_UP:
+ return true;
+ }
+ return false;
+ }
+ });
+ viewer.getTextWidget().addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ updateOutlineSelection();
+ }
+ });
+
+ IFocusService focusService = (IFocusService) PlatformUI.getWorkbench().getService(IFocusService.class);
+ if (focusService != null) {
+ focusService.addFocusTracker(viewer.getTextWidget(), MarkupEditor.EDITOR_SOURCE_VIEWER);
+ }
+
+ viewer.getTextWidget().setData(MarkupLanguage.class.getName(), getMarkupLanguage());
+ viewer.getTextWidget().setData(ISourceViewer.class.getName(), viewer);
+
+ getSourceViewerDecorationSupport(viewer);
+
+ updateDocument();
+
+ if (preferencesListener == null) {
+ preferencesListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ if (viewer.getTextWidget().isDisposed()) {
+ return;
+ }
+ viewer.getTextWidget().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ reloadPreferences();
+ }
+ });
+ }
+ };
+ WikiTextUiPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(preferencesListener);
+ }
+
+ return viewer;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+ ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
+ // fix bug 267553: font problems can occur if the default font of the text widget doesn't match the
+ // default font returned by the token scanner
+ if (sourceViewerConfiguration.getDefaultFont() != null) {
+ viewer.getTextWidget().setFont(sourceViewerConfiguration.getDefaultFont());
+ }
+
+ projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors());
+ projectionSupport.install();
+
+ syncProjectionModeWithPreferences();
+
+ viewer.addProjectionListener(new IProjectionListener() {
+ public void projectionDisabled() {
+ projectionAnnotationById = null;
+ saveProjectionPreferences();
+ }
+
+ public void projectionEnabled() {
+ saveProjectionPreferences();
+ updateProjectionAnnotations();
+ }
+ });
+
+ if (!outlineDirty && isFoldingEnabled()) {
+ updateProjectionAnnotations();
+ }
+ }
+
+ private void reloadPreferences() {
+ previewDirty = true;
+ syncProjectionModeWithPreferences();
+ ((MarkupTokenScanner) sourceViewerConfiguration.getMarkupScanner()).reloadPreferences();
+ viewer.invalidateTextPresentation();
+ }
+
+ private void syncProjectionModeWithPreferences() {
+ ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
+ if (viewer.isProjectionMode() != WikiTextUiPlugin.getDefault().getPreferences().isEditorFolding()) {
+ viewer.doOperation(ProjectionViewer.TOGGLE);
+ }
+ }
+
+ @Override
+ public void updatePartControl(IEditorInput input) {
+ super.updatePartControl(input);
+ updateDocument();
+ }
+
+ public void saveProjectionPreferences() {
+ if (isFoldingEnabled() != WikiTextUiPlugin.getDefault().getPreferences().isEditorFolding()) {
+ Preferences preferences = WikiTextUiPlugin.getDefault().getPreferences().clone();
+ preferences.setEditorFolding(isFoldingEnabled());
+ preferences.save(WikiTextUiPlugin.getDefault().getPreferenceStore(), false);
+ }
+ }
+
+ @Override
+ public void dispose() {
+ if (document != null) {
+ if (documentListener != null) {
+ document.removeDocumentListener(documentListener);
+ }
+ if (documentPartitioningListener != null) {
+ document.removeDocumentPartitioningListener(documentPartitioningListener);
+ }
+ document = null;
+ }
+ if (preferencesListener != null) {
+ WikiTextUiPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(preferencesListener);
+ preferencesListener = null;
+ }
+ super.dispose();
+ }
+
+ @Override
+ protected void initializeEditor() {
+ super.initializeEditor(); // ORDER DEPENDENCY
+ setHelpContextId(CONTEXT); // ORDER DEPENDENCY
+ setRulerContextMenuId(RULER_CONTEXT_MENU_ID);
+
+ }
+
+ @Override
+ protected void doSetInput(IEditorInput input) throws CoreException {
+ super.doSetInput(input);
+ updateDocument();
+ IFile file = getFile();
+ if (sourceViewerConfiguration != null) {
+ sourceViewerConfiguration.setFile(file);
+ }
+ initializeMarkupLanguage(input);
+ outlineModel.setResourcePath(file == null ? null : file.getFullPath().toString());
+ }
+
+ private void updateDocument() {
+ if (getSourceViewer() != null) {
+ IDocument previousDocument = document;
+ document = getSourceViewer().getDocument();
+ if (previousDocument == document) {
+ return;
+ }
+ if (previousDocument != null && documentListener != null) {
+ previousDocument.removeDocumentListener(documentListener);
+ }
+ if (previousDocument != null && documentPartitioningListener != null) {
+ previousDocument.removeDocumentPartitioningListener(documentPartitioningListener);
+ }
+ if (document != null) {
+ if (documentListener == null) {
+ documentListener = new IDocumentListener() {
+ public void documentAboutToBeChanged(DocumentEvent event) {
+ }
+
+ public void documentChanged(DocumentEvent event) {
+ previewDirty = true;
+ outlineDirty = true;
+ synchronized (MarkupEditor.this) {
+ ++documentGeneration;
+ }
+ scheduleOutlineUpdate();
+ }
+
+ };
+ }
+ document.addDocumentListener(documentListener);
+ if (documentPartitioningListener == null) {
+ documentPartitioningListener = new IDocumentPartitioningListener() {
+ public void documentPartitioningChanged(IDocument document) {
+ // async update
+ scheduleOutlineUpdate();
+ }
+ };
+ }
+ document.addDocumentPartitioningListener(documentPartitioningListener);
+ }
+
+ previewDirty = true;
+ outlineDirty = true;
+ updateOutline();
+ }
+ }
+
+ private void updatePreview(final OutlineItem item) {
+ boolean revealItem = item != null;
+ if (previewDirty && browser != null) {
+ String xhtml = null;
+ if (document == null) {
+ xhtml = "<?xml version=\"1.0\" ?><html xmlns=\"http://www.w3.org/1999/xhtml\"><body></body></html>"; //$NON-NLS-1$
+ } else {
+ try {
+ MarkupParser markupParser = new MarkupParser();
+
+ IFile file = getFile();
+ String title = file.getName();
+ if (title.lastIndexOf('.') != -1) {
+ title = title.substring(0, title.lastIndexOf('.'));
+ }
+ StringWriter writer = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer) {
+ @Override
+ protected void emitAnchorHref(String href) {
+ if (href.startsWith("#")) { //$NON-NLS-1$
+ writer.writeAttribute(
+ "onclick", String.format("javascript: window.location.hash = '%s'; return false;", href)); //$NON-NLS-1$ //$NON-NLS-2$
+ writer.writeAttribute("href", "#"); //$NON-NLS-1$//$NON-NLS-2$
+ } else {
+ super.emitAnchorHref(href);
+ }
+ }
+ };
+ builder.setTitle(title);
+
+ IPath location = file.getLocation();
+ if (location != null) {
+ builder.setBaseInHead(true);
+ builder.setBase(location.removeLastSegments(1).toFile().toURI());
+ }
+
+ String css = WikiTextUiPlugin.getDefault().getPreferences().getMarkupViewerCss();
+ if (css != null && css.length() > 0) {
+ builder.addCssStylesheet(new HtmlDocumentBuilder.Stylesheet(new StringReader(css)));
+ }
+
+ markupParser.setBuilder(builder);
+ markupParser.setMarkupLanguage(getMarkupLanguage());
+ if (markupParser.getMarkupLanguage() == null) {
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PREFORMATTED, new Attributes());
+ builder.characters(document.get());
+ builder.endBlock();
+ builder.endDocument();
+ } else {
+ markupParser.getMarkupLanguage().setBlocksOnly(false);
+ markupParser.getMarkupLanguage().setFilterGenerativeContents(false);
+ markupParser.parse(document.get());
+ }
+ xhtml = writer.toString();
+ } catch (Exception e) {
+ StringWriter stackTrace = new StringWriter();
+ PrintWriter writer = new PrintWriter(stackTrace);
+ e.printStackTrace(writer);
+ writer.close();
+
+ StringWriter documentWriter = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(documentWriter);
+ builder.beginDocument();
+ builder.beginBlock(BlockType.PREFORMATTED, new Attributes());
+ builder.characters(stackTrace.toString());
+ builder.endBlock();
+ builder.endDocument();
+
+ xhtml = writer.toString();
+ }
+ }
+ if (revealItem) {
+ revealItem = false;
+ browser.addProgressListener(new ProgressAdapter() {
+ @Override
+ public void completed(ProgressEvent event) {
+ browser.removeProgressListener(this);
+ revealInBrowser(item);
+ }
+ });
+ }
+ browser.setText(xhtml);
+ previewDirty = false;
+ }
+ if (revealItem) {
+ revealInBrowser(item);
+ }
+ }
+
+ public IFile getFile() {
+ IEditorInput editorInput = getEditorInput();
+ if (editorInput instanceof IFileEditorInput) {
+ IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput;
+ return fileEditorInput.getFile();
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ if (IContentOutlinePage.class == adapter) {
+ if (outlinePage == null || outlinePage.getControl() == null || outlinePage.getControl().isDisposed()) {
+ outlinePage = new MarkupEditorOutline(this);
+ }
+ return outlinePage;
+ }
+ if (adapter == OutlineItem.class) {
+ return getOutlineModel();
+ }
+ if (adapter == IFoldingStructure.class) {
+ if (!isFoldingEnabled()) {
+ return null;
+ }
+ if (foldingStructure == null) {
+ foldingStructure = new FoldingStructure(this);
+ }
+ return foldingStructure;
+ }
+ if (adapter == IShowInTargetList.class) {
+ return SHOW_IN_TARGET_LIST;
+ }
+ return super.getAdapter(adapter);
+ }
+
+ public ISourceViewer getViewer() {
+ return viewer;
+ }
+
+ public OutlineItem getOutlineModel() {
+ // ensure that outline model is caught up with current version of document
+ if (outlineDirty) {
+ updateOutlineNow();
+ }
+ return outlineModel;
+ }
+
+ private void scheduleOutlineUpdate() {
+ synchronized (MarkupEditor.this) {
+ if (updateJobScheduled) {
+ return;
+ }
+ }
+ updateOutlineJob = new UIJob(Messages.MarkupEditor_updateOutline) {
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ synchronized (MarkupEditor.this) {
+ updateJobScheduled = false;
+ }
+ if (!outlineDirty) {
+ return Status.CANCEL_STATUS;
+ }
+ updateOutline();
+ return Status.OK_STATUS;
+ }
+ };
+ updateOutlineJob.addJobChangeListener(new JobChangeAdapter() {
+ @Override
+ public void scheduled(IJobChangeEvent event) {
+ synchronized (MarkupEditor.this) {
+ updateJobScheduled = true;
+ }
+ }
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ synchronized (MarkupEditor.this) {
+ updateJobScheduled = false;
+ updateOutlineJob = null;
+ }
+ }
+ });
+ updateOutlineJob.setUser(false);
+ updateOutlineJob.setSystem(true);
+ updateOutlineJob.setPriority(Job.INTERACTIVE);
+ updateOutlineJob.schedule(600);
+ }
+
+ private void updateOutlineNow() {
+ if (!outlineDirty) {
+ return;
+ }
+ if (getSourceViewer().getTextWidget().isDisposed()) {
+ return;
+ }
+ // we maintain the outline even if the outline page is not in use, which allows us to use the outline for
+ // content assist and other things
+
+ MarkupLanguage markupLanguage = getMarkupLanguage();
+ if (markupLanguage == null) {
+ return;
+ }
+ final MarkupLanguage language = markupLanguage.clone();
+ final String content = document.get();
+ final int contentGeneration;
+ synchronized (MarkupEditor.this) {
+ contentGeneration = documentGeneration;
+ }
+ outlineParser.setMarkupLanguage(language);
+ OutlineItem rootItem = outlineParser.parse(content);
+ updateOutline(contentGeneration, rootItem);
+ }
+
+ private void updateOutline() {
+ if (!outlineDirty) {
+ return;
+ }
+ if (getSourceViewer().getTextWidget().isDisposed()) {
+ return;
+ }
+ // we maintain the outline even if the outline page is not in use, which allows us to use the outline for
+ // content assist and other things
+
+ MarkupLanguage markupLanguage = getMarkupLanguage();
+ if (markupLanguage == null) {
+ return;
+ }
+ final MarkupLanguage language = markupLanguage.clone();
+
+ final Display display = getSourceViewer().getTextWidget().getDisplay();
+ final String content = document.get();
+ final int contentGeneration;
+ synchronized (MarkupEditor.this) {
+ contentGeneration = documentGeneration;
+ }
+ // we parse the outline in another thread so that the UI remains responsive
+ Job parseOutlineJob = new Job(MarkupEditor.class.getSimpleName() + "#updateOutline") { //$NON-NLS-1$
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ outlineParser.setMarkupLanguage(language);
+ if (shouldCancel()) {
+ return Status.CANCEL_STATUS;
+ }
+ final OutlineItem rootItem = outlineParser.parse(content);
+ if (shouldCancel()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ display.asyncExec(new Runnable() {
+ public void run() {
+ updateOutline(contentGeneration, rootItem);
+ }
+ });
+ return Status.OK_STATUS;
+ }
+
+ private boolean shouldCancel() {
+ synchronized (MarkupEditor.this) {
+ if (contentGeneration != documentGeneration) {
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ parseOutlineJob.setPriority(Job.INTERACTIVE);
+ parseOutlineJob.setSystem(true);
+ parseOutlineJob.schedule();
+ }
+
+ private void updateOutline(int contentGeneration, OutlineItem rootItem) {
+ if (getSourceViewer().getTextWidget().isDisposed()) {
+ return;
+ }
+ synchronized (this) {
+ if (contentGeneration != documentGeneration) {
+ return;
+ }
+ }
+ outlineDirty = false;
+
+ outlineModel.clear();
+ outlineModel.moveChildren(rootItem);
+
+ IFile file = getFile();
+ outlineModel.setResourcePath(file == null ? null : file.getFullPath().toString());
+
+ if (outlinePage != null && outlinePage.getControl() != null && !outlinePage.getControl().isDisposed()) {
+ outlinePage.refresh();
+
+ outlinePage.getControl().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (outlinePage != null && outlinePage.getControl() != null
+ && !outlinePage.getControl().isDisposed()) {
+ updateOutlineSelection();
+ }
+ }
+ });
+ }
+ updateProjectionAnnotations();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void updateProjectionAnnotations() {
+ ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
+ ProjectionAnnotationModel projectionAnnotationModel = viewer.getProjectionAnnotationModel();
+ if (projectionAnnotationModel != null) {
+ List<Annotation> newProjectionAnnotations = new ArrayList<Annotation>(projectionAnnotationById == null ? 10
+ : projectionAnnotationById.size() + 2);
+ Map<HeadingProjectionAnnotation, Position> annotationToPosition = new HashMap<HeadingProjectionAnnotation, Position>();
+
+ List<OutlineItem> children = outlineModel.getChildren();
+ if (!children.isEmpty()) {
+ createProjectionAnnotations(newProjectionAnnotations, annotationToPosition, children,
+ document.getLength());
+ }
+ if (newProjectionAnnotations.isEmpty()
+ && (projectionAnnotationById == null || projectionAnnotationById.isEmpty())) {
+ return;
+ }
+
+ Map<String, HeadingProjectionAnnotation> newProjectionAnnotationById = new HashMap<String, HeadingProjectionAnnotation>();
+
+ if (projectionAnnotationById != null) {
+ Set<HeadingProjectionAnnotation> toDelete = new HashSet<HeadingProjectionAnnotation>(
+ projectionAnnotationById.size());
+ Iterator<Entry<HeadingProjectionAnnotation, Position>> newPositionIt = annotationToPosition.entrySet()
+ .iterator();
+ while (newPositionIt.hasNext()) {
+ Entry<HeadingProjectionAnnotation, Position> newAnnotationEnt = newPositionIt.next();
+
+ HeadingProjectionAnnotation newAnnotation = newAnnotationEnt.getKey();
+ Position newPosition = newAnnotationEnt.getValue();
+ HeadingProjectionAnnotation annotation = projectionAnnotationById.get(newAnnotation.getHeadingId());
+ if (annotation != null) {
+ Position position = projectionAnnotationModel.getPosition(annotation);
+ if (newPosition.equals(position)) {
+ newPositionIt.remove();
+ newProjectionAnnotationById.put(annotation.getHeadingId(), annotation);
+ } else {
+ toDelete.add(annotation);
+ if (annotation.isCollapsed()) {
+ newAnnotation.markCollapsed();
+ } else {
+ newAnnotation.markExpanded();
+ }
+ newProjectionAnnotationById.put(annotation.getHeadingId(), newAnnotation);
+ }
+ } else {
+ newProjectionAnnotationById.put(newAnnotation.getHeadingId(), newAnnotation);
+ }
+ }
+ Iterator<Annotation> annotationIt = projectionAnnotationModel.getAnnotationIterator();
+ while (annotationIt.hasNext()) {
+ Annotation annotation = annotationIt.next();
+ if (annotation instanceof HeadingProjectionAnnotation) {
+ HeadingProjectionAnnotation projectionAnnotation = (HeadingProjectionAnnotation) annotation;
+ if (!projectionAnnotationById.containsKey(projectionAnnotation.getHeadingId())
+ && !toDelete.contains(projectionAnnotation)) {
+ toDelete.add(projectionAnnotation);
+ }
+ }
+ }
+ projectionAnnotationModel.modifyAnnotations(toDelete.isEmpty() ? null
+ : toDelete.toArray(new Annotation[toDelete.size()]), annotationToPosition, null);
+ } else {
+ projectionAnnotationModel.modifyAnnotations(null, annotationToPosition, null);
+ for (HeadingProjectionAnnotation annotation : annotationToPosition.keySet()) {
+ newProjectionAnnotationById.put(annotation.getHeadingId(), annotation);
+ }
+ }
+ projectionAnnotationById = newProjectionAnnotationById;
+ } else {
+ projectionAnnotationById = null;
+ }
+ }
+
+ private void createProjectionAnnotations(List<Annotation> newProjectionAnnotations,
+ Map<HeadingProjectionAnnotation, Position> annotationToPosition, List<OutlineItem> children, int endOffset) {
+ final int size = children.size();
+ final int lastIndex = size - 1;
+ for (int x = 0; x < size; ++x) {
+ OutlineItem child = children.get(x);
+ if (child.getId() == null || child.getId().length() == 0) {
+ continue;
+ }
+ int offset = child.getOffset();
+ int end;
+ if (x == lastIndex) {
+ end = endOffset;
+ } else {
+ end = children.get(x + 1).getOffset();
+ }
+ int length = end - offset;
+
+ if (length > 0) {
+ HeadingProjectionAnnotation annotation = new HeadingProjectionAnnotation(child.getId());
+ Position position = new Position(offset, length);
+
+ newProjectionAnnotations.add(annotation);
+ annotationToPosition.put(annotation, position);
+ }
+
+ if (!child.getChildren().isEmpty()) {
+ createProjectionAnnotations(newProjectionAnnotations, annotationToPosition, child.getChildren(), end);
+ }
+ }
+ }
+
+ private void updateOutlineSelection() {
+ if (disableReveal) {
+ return;
+ }
+ if (outlineModel != null && outlinePage != null) {
+
+ disableReveal = true;
+ try {
+ OutlineItem item = getNearestMatchingOutlineItem();
+ if (item != null) {
+ outlinePage.setSelection(new StructuredSelection(item));
+ }
+ } finally {
+ disableReveal = false;
+ }
+ }
+ }
+
+ /**
+ * get the outline item nearest matching the selection in the source viewer
+ */
+ private OutlineItem getNearestMatchingOutlineItem() {
+ Point selectedRange = getSourceViewer().getSelectedRange();
+ if (selectedRange != null) {
+ return outlineModel.findNearestMatchingOffset(selectedRange.x);
+ }
+ return null;
+ }
+
+ @Override
+ protected void initializeKeyBindingScopes() {
+ setKeyBindingScopes(new String[] { CONTEXT });
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ super.init(site, input);
+
+ IContextService contextService = (IContextService) site.getService(IContextService.class);
+ contextService.activateContext(CONTEXT);
+
+ }
+
+ private void initializeMarkupLanguage(IEditorInput input) {
+ MarkupLanguage markupLanguage = loadMarkupLanguagePreference();
+ if (markupLanguage == null) {
+ String name = input.getName();
+ if (input instanceof IFileEditorInput) {
+ name = ((IFileEditorInput) input).getFile().getName();
+ } else if (input instanceof IPathEditorInput) {
+ name = ((IPathEditorInput) input).getPath().lastSegment();
+ }
+ markupLanguage = WikiText.getMarkupLanguageForFilename(name);
+ if (markupLanguage == null) {
+ markupLanguage = WikiText.getMarkupLanguage("Textile"); //$NON-NLS-1$
+ }
+ }
+ setMarkupLanguage(markupLanguage, false);
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage, boolean persistSetting) {
+ ((MarkupDocumentProvider) getDocumentProvider()).setMarkupLanguage(markupLanguage);
+
+ IDocument document = getDocumentProvider().getDocument(getEditorInput());
+ IDocumentPartitioner partitioner = document.getDocumentPartitioner();
+ if (partitioner instanceof FastMarkupPartitioner) {
+ final FastMarkupPartitioner fastMarkupPartitioner = (FastMarkupPartitioner) partitioner;
+ fastMarkupPartitioner.setMarkupLanguage(markupLanguage);
+ }
+ sourceViewerConfiguration.setMarkupLanguage(markupLanguage);
+ if (getSourceViewer() != null) {
+ getSourceViewer().invalidateTextPresentation();
+ }
+ outlineDirty = true;
+ scheduleOutlineUpdate();
+ updateSourceTabLabel();
+
+ if (viewer != null) {
+ viewer.getTextWidget().setData(MarkupLanguage.class.getName(), getMarkupLanguage());
+ }
+
+ if (persistSetting && markupLanguage != null) {
+ storeMarkupLanguagePreference(markupLanguage);
+ }
+ if (persistSetting) {
+ ISourceViewer sourceViewer = getSourceViewer();
+ if (sourceViewer instanceof MarkupProjectionViewer) {
+ IReconciler reconciler = ((MarkupProjectionViewer) sourceViewer).getReconciler();
+ if (reconciler instanceof MarkupMonoReconciler) {
+ ((MarkupMonoReconciler) reconciler).forceReconciling();
+ }
+ }
+ }
+ }
+
+ private void updateSourceTabLabel() {
+ if (sourceTab != null) {
+ // bug 270215 carbon shows tooltip in source editing area.
+ boolean isCarbon = Platform.WS_CARBON.equals(Platform.getWS());
+
+ MarkupLanguage markupLanguage = getMarkupLanguage();
+ if (markupLanguage == null) {
+ sourceTab.setText(Messages.MarkupEditor_markupSource);
+ if (!isCarbon) {
+ sourceTab.setToolTipText(Messages.MarkupEditor_markupSource_tooltip);
+ }
+ } else {
+ sourceTab.setText(NLS.bind(Messages.MarkupEditor_markupSource_named,
+ new Object[] { markupLanguage.getName() }));
+ if (!isCarbon) {
+ sourceTab.setToolTipText(NLS.bind(Messages.MarkupEditor_markupSource_tooltip_named,
+ new Object[] { markupLanguage.getName() }));
+ }
+ }
+ }
+ }
+
+ private MarkupLanguage loadMarkupLanguagePreference() {
+ IFile file = getFile();
+ if (file != null) {
+ return loadMarkupLanguagePreference(file);
+ }
+ return null;
+ }
+
+ /**
+ * lookup the markup language preference of a file based on the persisted preference.
+ *
+ * @param file
+ * the file for which the preference should be looked up
+ *
+ * @return the markup language preference, or null if it was not set or could not be loaded.
+ */
+ public static MarkupLanguage loadMarkupLanguagePreference(IFile file) {
+ String languageName = getMarkupLanguagePreference(file);
+ if (languageName != null) {
+ return WikiText.getMarkupLanguage(languageName);
+ }
+ return null;
+ }
+
+ /**
+ * lookup the markup language preference of a file based on the persisted preference.
+ *
+ * @param file
+ * the file for which the preference should be looked up
+ *
+ * @return the markup language name, or null if no preference exists
+ */
+ public static String getMarkupLanguagePreference(IFile file) {
+ String languageName;
+ try {
+ languageName = file.getPersistentProperty(new QualifiedName(WikiTextUiPlugin.getDefault().getPluginId(),
+ MarkupEditor.MARKUP_LANGUAGE));
+ } catch (CoreException e) {
+ WikiTextUiPlugin.getDefault().log(IStatus.ERROR, Messages.MarkupEditor_markupPreferenceError, e);
+ return null;
+ }
+ return languageName;
+ }
+
+ private void storeMarkupLanguagePreference(MarkupLanguage markupLanguage) {
+ if (markupLanguage == null) {
+ throw new IllegalArgumentException();
+ }
+ IFile file = getFile();
+ if (file != null) {
+ MarkupLanguage defaultMarkupLanguage = WikiText.getMarkupLanguageForFilename(file.getName());
+ String preference = markupLanguage == null ? null : markupLanguage.getName();
+ if (defaultMarkupLanguage != null && defaultMarkupLanguage.getName().equals(preference)) {
+ preference = null;
+ }
+ try {
+ file.setPersistentProperty(new QualifiedName(WikiTextUiPlugin.getDefault().getPluginId(),
+ MARKUP_LANGUAGE), preference);
+ } catch (CoreException e) {
+ WikiTextUiPlugin.getDefault()
+ .log(
+ IStatus.ERROR,
+ NLS.bind(Messages.MarkupEditor_markupPreferenceError2,
+ new Object[] { preference }), e);
+ }
+ }
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ IDocument document = getDocumentProvider().getDocument(getEditorInput());
+ IDocumentPartitioner partitioner = document.getDocumentPartitioner();
+ MarkupLanguage markupLanguage = null;
+ if (partitioner instanceof FastMarkupPartitioner) {
+ markupLanguage = ((FastMarkupPartitioner) partitioner).getMarkupLanguage();
+ }
+ return markupLanguage;
+ }
+
+ @Override
+ protected void createActions() {
+ super.createActions();
+
+ IAction action;
+
+// action = new ShowCheatSheetAction(this);
+// setAction(action.getId(),action);
+
+ action = new ContentAssistAction(new NlsResourceBundle(Messages.class), "ContentAssistProposal_", this); //$NON-NLS-1$
+ action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+ setAction("ContentAssistProposal", action); //$NON-NLS-1$
+ markAsStateDependentAction("ContentAssistProposal", true); //$NON-NLS-1$
+ }
+
+ @Override
+ public void setAction(String actionID, IAction action) {
+ if (action.getActionDefinitionId() != null) {
+ IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
+ handlerService.activateHandler(action.getActionDefinitionId(), new ActionHandler(action));
+ }
+ super.setAction(actionID, action);
+ }
+
+ @Override
+ protected void editorContextMenuAboutToShow(IMenuManager menu) {
+ super.editorContextMenuAboutToShow(menu);
+
+ final MarkupLanguage markupLanguage = getMarkupLanguage();
+ MenuManager markupLanguageMenu = new MenuManager(Messages.MarkupEditor_markupLanguage);
+ for (String markupLanguageName : new TreeSet<String>(WikiText.getMarkupLanguageNames())) {
+ markupLanguageMenu.add(new SetMarkupLanguageAction(this, markupLanguageName, markupLanguage != null
+ && markupLanguageName.equals(markupLanguage.getName())));
+ }
+
+ menu.prependToGroup(ITextEditorActionConstants.GROUP_SETTINGS, markupLanguageMenu);
+ }
+
+ public boolean isFoldingEnabled() {
+ ProjectionViewer viewer = (ProjectionViewer) getSourceViewer();
+ return viewer.getProjectionAnnotationModel() != null;
+ }
+
+ /* prevent line number ruler from appearing since it doesn't work with line wrapping
+ */
+ @Override
+ protected boolean isLineNumberRulerVisible() {
+ return false;
+ }
+
+ public boolean show(ShowInContext context) {
+ ISelection selection = context.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ for (Object element : ((IStructuredSelection) selection).toArray()) {
+ if (element instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) element;
+ selectAndReveal(item);
+ if (outlinePage != null && outlinePage.getControl() != null
+ && !outlinePage.getControl().isDisposed()) {
+ outlinePage.setSelection(selection);
+ }
+ return true;
+ }
+ }
+ } else if (selection instanceof ITextSelection) {
+ ITextSelection textSel = (ITextSelection) selection;
+ selectAndReveal(textSel.getOffset(), textSel.getLength());
+ return true;
+ }
+ return false;
+ }
+
+ public void selectAndReveal(OutlineItem item) {
+ selectAndReveal(item.getOffset(), item.getLength());
+ if (tabFolder.getSelection() == previewTab) {
+ // scroll preview to the selected item.
+ revealInBrowser(item);
+ }
+ }
+
+ private void revealInBrowser(OutlineItem item) {
+ if (Platform.OS_WIN32.equals(Platform.getOS())) {
+ // Do nothing. It appears that IE has problems with setting window.location.hash
+ // see bug 270923 for details
+ } else {
+ browser.execute(String.format("window.location.hash = '%s';", item.getId())); //$NON-NLS-1$
+ }
+ }
+
+ public ShowInContext getShowInContext() {
+ OutlineItem item = getNearestMatchingOutlineItem();
+ return new ShowInContext(getEditorInput(), item == null ? new StructuredSelection() : new StructuredSelection(
+ item));
+ }
+
+ @Override
+ protected void rulerContextMenuAboutToShow(IMenuManager menu) {
+ super.rulerContextMenuAboutToShow(menu);
+ // prevent line number toggle action from appearing
+ menu.remove(ITextEditorActionConstants.LINENUMBERS_TOGGLE);
+ }
+
+ public void perform(AbstractDocumentCommand command) throws CoreException {
+ disableReveal = true;
+ try {
+ command.execute(((ITextViewerExtension6) getViewer()).getUndoManager(), getViewer().getDocument());
+ } finally {
+ disableReveal = false;
+ }
+ updateOutlineSelection();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditorActionBarContributor.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditorActionBarContributor.java
new file mode 100644
index 0000000..537e72f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditorActionBarContributor.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import org.eclipse.ui.editors.text.TextEditorActionContributor;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MarkupEditorActionBarContributor extends TextEditorActionContributor {
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditorOutline.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditorOutline.java
new file mode 100644
index 0000000..5cdcd06
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupEditorOutline.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.dnd.DndConfigurationStrategy;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.model.BaseWorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.part.IShowInSource;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.ShowInContext;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.IUpdate;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+/**
+ *
+ * @author David Green
+ */
+public class MarkupEditorOutline extends ContentOutlinePage implements IShowInSource, IShowInTarget {
+
+ private final MarkupEditor editor;
+
+ private boolean disableReveal;
+
+ private DndConfigurationStrategy dndConfigurationStrategy;
+
+ public MarkupEditorOutline(MarkupEditor editor) {
+ this.editor = editor;
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+
+ TreeViewer viewer = getTreeViewer();
+ viewer.setUseHashlookup(true);
+ viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
+ viewer.setContentProvider(new BaseWorkbenchContentProvider());
+ viewer.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider());
+ viewer.setInput(editor.getOutlineModel());
+
+ viewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ revealInEditor(event.getSelection(), true);
+ }
+ });
+ viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ revealInEditor(event.getSelection(), false);
+ }
+ });
+ viewer.expandAll();
+
+ new ToolTip(viewer.getControl(), ToolTip.RECREATE, false) {
+ @Override
+ protected Composite createToolTipContentArea(Event event, Composite parent) {
+
+ Composite comp = new Composite(parent, SWT.NONE);
+ comp.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ GridLayout gl = new GridLayout(1, false);
+ gl.marginBottom = 2;
+ gl.marginTop = 2;
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ gl.marginLeft = 2;
+ gl.marginRight = 2;
+ gl.verticalSpacing = 1;
+ comp.setLayout(gl);
+
+ Object tipItem = getToolTipItem(new Point(event.x, event.y));
+ if (tipItem instanceof OutlineItem) {
+ OutlineItem outlineItem = (OutlineItem) tipItem;
+ Label label = new Label(comp, SWT.WRAP);
+ label.setBackground(comp.getBackground());
+ label.setText(outlineItem.getTooltip());
+ }
+
+ return comp;
+ }
+
+ @Override
+ protected boolean shouldCreateToolTip(Event event) {
+ final Object eventItem = getToolTipItem(new Point(event.x, event.y));
+ boolean shouldCreate = eventItem != null && eventItem instanceof OutlineItem
+ && super.shouldCreateToolTip(event);
+ if (!shouldCreate) {
+ hide();
+ }
+ return shouldCreate;
+ }
+
+ protected Object getToolTipItem(Point point) {
+ TreeItem item = ((Tree) getTreeViewer().getControl()).getItem(point);
+ if (item != null) {
+ return item.getData();
+ }
+ return null;
+ }
+ };
+
+ getSite().setSelectionProvider(viewer);
+
+ MenuManager manager = new MenuManager("#PopUp"); //$NON-NLS-1$
+ manager.setRemoveAllWhenShown(true);
+ manager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager menuManager) {
+ contextMenuAboutToShow(menuManager);
+ }
+ });
+ viewer.getTree().setMenu(manager.createContextMenu(viewer.getTree()));
+
+ getSite().registerContextMenu(MarkupEditor.ID + ".outlineContextMenu", manager, viewer); //$NON-NLS-1$
+
+ configureDnd();
+ configureActions();
+ }
+
+ @Override
+ public void dispose() {
+ if (dndConfigurationStrategy != null) {
+ dndConfigurationStrategy.dispose();
+ dndConfigurationStrategy = null;
+ }
+ super.dispose();
+ }
+
+ private void configureDnd() {
+ dndConfigurationStrategy = new DndConfigurationStrategy();
+ dndConfigurationStrategy.configure(editor, getControl(), getTreeViewer());
+ }
+
+ private void configureActions() {
+ registerAction(ITextEditorActionConstants.UNDO);
+ registerAction(ITextEditorActionConstants.REDO);
+ registerAction(ITextEditorActionConstants.REVERT);
+ registerAction(ITextEditorActionConstants.SAVE);
+ registerAction(ITextEditorActionConstants.FIND);
+ registerAction(ITextEditorActionConstants.PRINT);
+ }
+
+ private void registerAction(String actionId) {
+ IAction action = editor.getAction(actionId);
+ if (action != null) {
+ getSite().getActionBars().setGlobalActionHandler(actionId, action);
+ }
+ }
+
+ protected void contextMenuAboutToShow(IMenuManager menuManager) {
+
+ menuManager.add(new Separator(ITextEditorActionConstants.GROUP_UNDO));
+ menuManager.add(new GroupMarker(ITextEditorActionConstants.GROUP_SAVE));
+ menuManager.add(new Separator(ITextEditorActionConstants.GROUP_COPY));
+ menuManager.add(new Separator(ITextEditorActionConstants.GROUP_PRINT));
+ menuManager.add(new Separator(ITextEditorActionConstants.GROUP_EDIT));
+ menuManager.add(new Separator(ITextEditorActionConstants.GROUP_FIND));
+ menuManager.add(new Separator(IWorkbenchActionConstants.GROUP_ADD));
+ menuManager.add(new Separator(IWorkbenchActionConstants.GROUP_SHOW_IN));
+ menuManager.add(new Separator(IWorkbenchActionConstants.GROUP_REORGANIZE));
+ menuManager.add(new Separator(ITextEditorActionConstants.GROUP_REST));
+ menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+
+ addAction(menuManager, ITextEditorActionConstants.GROUP_UNDO, ITextEditorActionConstants.UNDO);
+ addAction(menuManager, ITextEditorActionConstants.GROUP_UNDO, ITextEditorActionConstants.REDO);
+ addAction(menuManager, ITextEditorActionConstants.GROUP_UNDO, ITextEditorActionConstants.REVERT);
+ addAction(menuManager, ITextEditorActionConstants.GROUP_SAVE, ITextEditorActionConstants.SAVE);
+ addAction(menuManager, ITextEditorActionConstants.GROUP_FIND, ITextEditorActionConstants.FIND);
+ addAction(menuManager, ITextEditorActionConstants.GROUP_PRINT, ITextEditorActionConstants.PRINT);
+
+ }
+
+ protected final void addAction(IMenuManager menu, String group, String actionId) {
+ IAction action = editor.getAction(actionId);
+ if (action != null) {
+ if (action instanceof IUpdate) {
+ ((IUpdate) action).update();
+ }
+
+ IMenuManager subMenu = menu.findMenuUsingPath(group);
+ if (subMenu != null) {
+ subMenu.add(action);
+ } else {
+ menu.appendToGroup(group, action);
+ }
+ }
+ }
+
+ @Override
+ protected TreeViewer getTreeViewer() {
+ return super.getTreeViewer();
+ }
+
+ private void revealInEditor(ISelection selection, boolean open) {
+ if (disableReveal) {
+ return;
+ }
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ Object firstElement = structuredSelection.getFirstElement();
+ if (firstElement instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) firstElement;
+ editor.selectAndReveal(item);
+ }
+ }
+ }
+
+ public void refresh() {
+ getTreeViewer().getTree().setRedraw(false);
+ try {
+ getTreeViewer().refresh();
+ getTreeViewer().expandAll();
+ } finally {
+ getTreeViewer().getTree().setRedraw(true);
+ }
+ }
+
+ @Override
+ public void setSelection(ISelection selection) {
+ disableReveal = true;
+ try {
+ super.setSelection(selection);
+ } finally {
+ disableReveal = false;
+ }
+ }
+
+ public ShowInContext getShowInContext() {
+ return editor.getShowInContext();
+ }
+
+ public boolean show(ShowInContext context) {
+ return editor.show(context);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupProjectionViewer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupProjectionViewer.java
new file mode 100644
index 0000000..28f5768
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/MarkupProjectionViewer.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import org.eclipse.jface.text.information.IInformationPresenter;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.commands.ShowQuickOutlineCommand;
+import org.eclipse.mylyn.wikitext.ui.editor.MarkupSourceViewerConfiguration;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * extend the viewer to provide access to the reconciler and to provide quick outline capabilities
+ */
+public class MarkupProjectionViewer extends ProjectionViewer {
+
+ /**
+ * Operation code for quick outline
+ */
+ public static final int QUICK_OUTLINE = ShowQuickOutlineCommand.QUICK_OUTLINE;
+
+ private IInformationPresenter outlinePresenter;
+
+ public MarkupProjectionViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
+ boolean showAnnotationsOverview, int styles) {
+ super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles);
+ }
+
+ public IReconciler getReconciler() {
+ return fReconciler;
+ }
+
+ @Override
+ public void doOperation(int operation) {
+ if (operation == QUICK_OUTLINE && outlinePresenter != null) {
+ outlinePresenter.showInformation();
+ return;
+ }
+ super.doOperation(operation);
+ }
+
+ @Override
+ public boolean canDoOperation(int operation) {
+ if (operation == QUICK_OUTLINE && outlinePresenter != null) {
+ return true;
+ }
+ return super.canDoOperation(operation);
+ }
+
+ @Override
+ public void configure(SourceViewerConfiguration configuration) {
+ super.configure(configuration);
+ if (configuration instanceof MarkupSourceViewerConfiguration) {
+ outlinePresenter = ((MarkupSourceViewerConfiguration) configuration).getOutlineInformationPresenter(this);
+ outlinePresenter.install(this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/Messages.java
new file mode 100644
index 0000000..ff3c313
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/Messages.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.messages"; //$NON-NLS-1$
+
+ public static String MarkupEditor_markupLanguage;
+
+ public static String MarkupEditor_markupPreferenceError;
+
+ public static String MarkupEditor_markupPreferenceError2;
+
+ public static String MarkupEditor_markupSource;
+
+ public static String MarkupEditor_markupSource_named;
+
+ public static String MarkupEditor_markupSource_tooltip;
+
+ public static String MarkupEditor_markupSource_tooltip_named;
+
+ public static String MarkupEditor_preview;
+
+ public static String MarkupEditor_preview_tooltip;
+
+ public static String MarkupEditor_updateOutline;
+
+ public static String ContentAssistProposal_label;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/CollapseAllFoldingRulerAction.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/CollapseAllFoldingRulerAction.java
new file mode 100644
index 0000000..8b99403
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/CollapseAllFoldingRulerAction.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.util.NlsResourceBundle;
+import org.eclipse.ui.editors.text.IFoldingCommandIds;
+import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextOperationAction;
+
+/**
+ *
+ * @author David Green
+ */
+public class CollapseAllFoldingRulerAction extends AbstractRulerActionDelegate {
+
+ @Override
+ protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
+ TextOperationAction action = new TextOperationAction(new NlsResourceBundle(Messages.class),
+ "CollapseAllFoldingRulerAction_", editor, ProjectionViewer.COLLAPSE_ALL, true); //$NON-NLS-1$
+ action.setActionDefinitionId(IFoldingCommandIds.FOLDING_COLLAPSE_ALL);
+ return action;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ContextHelpAction.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ContextHelpAction.java
new file mode 100644
index 0000000..17bcf92
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ContextHelpAction.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.actions;
+
+import org.eclipse.help.HelpSystem;
+import org.eclipse.help.IContext;
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * An action that invokes context help with a specific help context id.
+ *
+ * @author David Green
+ */
+public class ContextHelpAction extends Action {
+
+ private static final String DEFAULT_WIKITEXT_HELP_ID = "org.eclipse.mylyn.wikitext.help.ui.markupSourceContext"; //$NON-NLS-1$
+
+ private final String contextId;
+
+ public ContextHelpAction(String contextId) {
+ super("", AS_PUSH_BUTTON); //$NON-NLS-1$
+ this.contextId = contextId;
+ setToolTipText(Messages.ContextHelpAction_tooltip);
+ setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(WikiTextUiPlugin.getDefault().getPluginId(),
+ "icons/help.gif")); //$NON-NLS-1$
+ }
+
+ public ContextHelpAction() {
+ this(DEFAULT_WIKITEXT_HELP_ID);
+ }
+
+ @Override
+ public void run() {
+ IContext context = HelpSystem.getContext(contextId);
+ if (context != null) {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp(context);
+ } else {
+ PlatformUI.getWorkbench().getHelpSystem().displayHelp();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ExpandAllFoldingRulerAction.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ExpandAllFoldingRulerAction.java
new file mode 100644
index 0000000..4e6c074
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ExpandAllFoldingRulerAction.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.util.NlsResourceBundle;
+import org.eclipse.ui.editors.text.IFoldingCommandIds;
+import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextOperationAction;
+
+/**
+ *
+ * @author David Green
+ */
+public class ExpandAllFoldingRulerAction extends AbstractRulerActionDelegate {
+
+ @Override
+ protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
+ TextOperationAction action = new TextOperationAction(new NlsResourceBundle(Messages.class),
+ "ExpandAllFoldingRulerAction_", editor, ProjectionViewer.EXPAND_ALL, true); //$NON-NLS-1$
+ action.setActionDefinitionId(IFoldingCommandIds.FOLDING_EXPAND_ALL);
+ return action;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/Messages.java
new file mode 100644
index 0000000..9195ba0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/Messages.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.actions;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.actions.messages"; //$NON-NLS-1$
+
+ public static String ContextHelpAction_tooltip;
+
+ public static String ToggleFoldingRulerAction_label;
+
+ public static String ToggleFoldingRulerAction_description;
+
+ public static String ExpandAllFoldingRulerAction_label;
+
+ public static String ExpandAllFoldingRulerAction_description;
+
+ public static String CollapseAllFoldingRulerAction_label;
+
+ public static String CollapseAllFoldingRulerAction_description;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/SetMarkupLanguageAction.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/SetMarkupLanguageAction.java
new file mode 100644
index 0000000..22bc109
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/SetMarkupLanguageAction.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class SetMarkupLanguageAction extends Action {
+
+ private final MarkupEditor markupEditor;
+
+ private final String markupLanguageName;
+
+ private final boolean checked;
+
+ public SetMarkupLanguageAction(MarkupEditor markupEditor, String markupLanguageName, boolean checked) {
+ super(markupLanguageName, IAction.AS_CHECK_BOX);
+ setChecked(checked);
+ this.markupEditor = markupEditor;
+ this.markupLanguageName = markupLanguageName;
+ this.checked = checked;
+ }
+
+ @Override
+ public void run() {
+ if (checked) {
+ return;
+ }
+ markupEditor.setMarkupLanguage(WikiText.getMarkupLanguage(markupLanguageName), true);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ToggleFoldingRulerAction.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ToggleFoldingRulerAction.java
new file mode 100644
index 0000000..fcab257
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/ToggleFoldingRulerAction.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.text.source.IVerticalRulerInfo;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
+import org.eclipse.mylyn.internal.wikitext.ui.util.NlsResourceBundle;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.editors.text.IFoldingCommandIds;
+import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextOperationAction;
+
+/**
+ *
+ * @author David Green
+ */
+public class ToggleFoldingRulerAction extends AbstractRulerActionDelegate {
+
+ private IAction callerAction;
+
+ private TextOperationAction action;
+
+ private ITextEditor editor;
+
+ @Override
+ protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
+ this.editor = editor;
+ action = new TextOperationAction(new NlsResourceBundle(Messages.class), "ToggleFoldingRulerAction_", //$NON-NLS-1$
+ editor, ProjectionViewer.TOGGLE, true);
+ action.setActionDefinitionId(IFoldingCommandIds.FOLDING_TOGGLE);
+ return action;
+ }
+
+ @Override
+ public void setActiveEditor(IAction callerAction, IEditorPart targetEditor) {
+ this.callerAction = callerAction;
+ super.setActiveEditor(callerAction, targetEditor);
+ }
+
+ @Override
+ public void menuAboutToShow(IMenuManager manager) {
+ update();
+ super.menuAboutToShow(manager);
+ }
+
+ private void update() {
+ if (editor instanceof MarkupEditor) {
+ callerAction.setChecked(((MarkupEditor) editor).isFoldingEnabled());
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/messages.properties
new file mode 100644
index 0000000..9546eb6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/actions/messages.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+ToggleFoldingRulerAction_label=Enable Folding
+ToggleFoldingRulerAction_description=Enable folding in the editor
+ExpandAllFoldingRulerAction_label=Expand All
+ExpandAllFoldingRulerAction_description=Expand all foldable regions in the editor
+CollapseAllFoldingRulerAction_label=Collapse All
+CollapseAllFoldingRulerAction_description=Collapse all foldable regions in the editor
+ContextHelpAction_tooltip=WikiText Help
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/AnchorCompletionProcessor.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/AnchorCompletionProcessor.java
new file mode 100644
index 0000000..2f1b8ff
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/AnchorCompletionProcessor.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.assist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem.Visitor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * A content assist implementation that provides proposals for completing document-internal anchor names.
+ *
+ * @author David Green
+ */
+public class AnchorCompletionProcessor implements IContentAssistProcessor {
+
+ private static final CompletionProposalComparator PROPOSAL_COMPARATOR = new CompletionProposalComparator();
+
+ private static class CompletionProposal implements ICompletionProposal, ICompletionProposalExtension4 {
+
+ private final String proposalText;
+
+ private final int offset;
+
+ private final int replacementLength;
+
+ private int relevance;
+
+ public CompletionProposal(int offset, String proposalText, int replacementLength) {
+ this.offset = offset;
+ this.proposalText = proposalText;
+ this.replacementLength = replacementLength;
+ }
+
+ public void apply(IDocument document) {
+ try {
+ document.replace(offset, replacementLength, proposalText);
+ } catch (BadLocationException x) {
+ // ignore
+ }
+ }
+
+ public String getAdditionalProposalInfo() {
+ return null;
+ }
+
+ public IContextInformation getContextInformation() {
+ return null;
+ }
+
+ public String getDisplayString() {
+ return proposalText;
+ }
+
+ public Image getImage() {
+ return null;
+ }
+
+ public Point getSelection(IDocument document) {
+ return new Point(offset + proposalText.length(), 0);
+ }
+
+ public boolean isAutoInsertable() {
+ return true;
+ }
+
+ public int getRelevance() {
+ return relevance;
+ }
+
+ public void setRelevance(int relevance) {
+ this.relevance = relevance;
+ }
+ }
+
+ private static class CompletionProposalComparator implements Comparator<CompletionProposal> {
+ public int compare(CompletionProposal o1, CompletionProposal o2) {
+ if (o1 == o2) {
+ return 0;
+ }
+ if (o1.getRelevance() > o2.getRelevance()) {
+ return -1;
+ }
+ if (o2.getRelevance() > o1.getRelevance()) {
+ return 1;
+ }
+ return o1.proposalText.compareTo(o2.proposalText);
+ }
+ }
+
+ private OutlineItem outline;
+
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+ if (outline == null) {
+ return null;
+ }
+
+ ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+
+ // adjust offset to end of normalized selection
+ if (selection.getOffset() == offset) {
+ offset = selection.getOffset() + selection.getLength();
+ }
+
+ final String prefix = extractPrefix(viewer, offset);
+ if (prefix == null) {
+ return null;
+ }
+ final List<CompletionProposal> suggestions = new ArrayList<CompletionProposal>(20);
+ final int prefixOffset = offset - prefix.length();
+ outline.accept(new Visitor() {
+ public boolean visit(OutlineItem item) {
+ if (item != outline) {
+ String id = item.getId();
+ if (id != null && id.length() > 0) {
+ suggestions.add(createProposal(prefix, prefixOffset, id));
+ }
+ }
+ return true;
+ }
+
+ });
+ if (suggestions.isEmpty()) {
+ return null;
+ }
+ Collections.sort(suggestions, PROPOSAL_COMPARATOR);
+
+ return suggestions.toArray(new ICompletionProposal[suggestions.size()]);
+ }
+
+ private CompletionProposal createProposal(String prefix, int offset, String id) {
+ CompletionProposal proposal = new CompletionProposal(offset, id, prefix.length());
+ if (id.startsWith(prefix)) {
+ proposal.setRelevance(90);
+ } else {
+ proposal.setRelevance(0);
+ }
+ return proposal;
+ }
+
+ /**
+ * get a prefix, but only if it is preceded by a '#' character
+ *
+ * @return the prefix (which may be the empty string) that is prefixed by '#', otherwise null
+ */
+ protected String extractPrefix(ITextViewer viewer, int offset) {
+ int i = offset;
+ IDocument document = viewer.getDocument();
+ if (i > document.getLength()) {
+ return null;
+ }
+
+ try {
+ while (i > 0) {
+ char ch = document.getChar(i - 1);
+ if (!Character.isJavaIdentifierPart(ch)) {
+ break;
+ }
+ i--;
+ }
+ if (i == 0 || document.getChar(i - 1) != '#') {
+ return null;
+ }
+ return document.get(i, offset - i);
+ } catch (BadLocationException e) {
+ return null;
+ }
+ }
+
+ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+ return null;
+ }
+
+ public char[] getCompletionProposalAutoActivationCharacters() {
+ return null;
+ }
+
+ public char[] getContextInformationAutoActivationCharacters() {
+ return null;
+ }
+
+ public IContextInformationValidator getContextInformationValidator() {
+ return null;
+ }
+
+ public String getErrorMessage() {
+ return null;
+ }
+
+ public OutlineItem getOutline() {
+ return outline;
+ }
+
+ public void setOutline(OutlineItem outline) {
+ this.outline = outline;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/MarkupTemplateCompletionProcessor.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/MarkupTemplateCompletionProcessor.java
new file mode 100644
index 0000000..b1bbb91
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/MarkupTemplateCompletionProcessor.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.assist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateProposal;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MarkupTemplateCompletionProcessor extends TemplateCompletionProcessor {
+
+ public static final String CONTEXT_ID = "org.eclipse.mylyn.wikitext.ui.editor"; //$NON-NLS-1$
+
+ private static final Pattern VARIABLE_PATTERN = Pattern.compile("\\$\\{([^\\}]+)\\}"); //$NON-NLS-1$
+
+ private static final class ProposalComparator implements Comparator<ICompletionProposal> {
+ public int compare(ICompletionProposal o1, ICompletionProposal o2) {
+ return ((TemplateProposal) o2).getRelevance() - ((TemplateProposal) o1).getRelevance();
+ }
+ }
+
+ private static final Comparator<ICompletionProposal> proposalComparator = new ProposalComparator();
+
+ private static final Template[] NO_TEMPLATES = new Template[0];
+
+ private final TemplateContextType contextType = new TemplateContextType(CONTEXT_ID,
+ Messages.MarkupTemplateCompletionProcessor_contextName);
+
+ private Templates templates;
+
+ @Override
+ protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
+ return contextType;
+ }
+
+ @Override
+ protected Image getImage(Template template) {
+ return null;
+ }
+
+ @Override
+ protected Template[] getTemplates(String contextTypeId) {
+ if (contextType.getId().equals(contextTypeId)) {
+ if (templates != null) {
+ return templates.getTemplate().toArray(new Template[templates.getTemplate().size()]);
+ }
+ }
+ return NO_TEMPLATES;
+ }
+
+ /**
+ * Override to improve matching accuracy
+ */
+ @Override
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+
+ ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+
+ // adjust offset to end of normalized selection
+ if (selection.getOffset() == offset) {
+ offset = selection.getOffset() + selection.getLength();
+ }
+
+ String prefix = extractPrefix(viewer, offset);
+ Region region = new Region(offset - prefix.length(), prefix.length());
+ TemplateContext context = createContext(viewer, region);
+ if (context == null) {
+ return new ICompletionProposal[0];
+ }
+ Region selectionRegion = new Region(selection.getOffset(), selection.getLength());
+ TemplateContext selectionContext = createContext(viewer, selectionRegion);
+
+ int lineOffset = 0;
+ try {
+ IRegion lineInformationOfOffset = viewer.getDocument().getLineInformationOfOffset(offset);
+ lineOffset = offset - lineInformationOfOffset.getOffset();
+ } catch (BadLocationException e1) {
+ // ignore
+ }
+
+ String selectionText = selection.getText();
+ context.setVariable("selection", selectionText); //$NON-NLS-1$
+ selectionContext.setVariable("selection", selectionText); //$NON-NLS-1$
+ context.setVariable("text", selectionText); //$NON-NLS-1$
+ selectionContext.setVariable("text", selectionText); //$NON-NLS-1$
+
+ Template[] templates = getTemplates(context.getContextType().getId());
+
+ List<ICompletionProposal> matches = new ArrayList<ICompletionProposal>(templates.length);
+ for (Template template : templates) {
+ try {
+ context.getContextType().validate(template.getPattern());
+ } catch (TemplateException e) {
+ continue;
+ }
+ if (!template.matches(prefix, context.getContextType().getId())) {
+ continue;
+ }
+ boolean selectionBasedMatch = isSelectionBasedMatch(template, context);
+ if (template.getName().startsWith(prefix) || selectionBasedMatch) {
+
+ int relevance = getRelevance(template, lineOffset, prefix);
+ if (selectionBasedMatch) {
+ matches.add(createProposal(template, selectionContext, (IRegion) selectionRegion, relevance));
+ } else {
+ matches.add(createProposal(template, context, (IRegion) region, relevance));
+ }
+ }
+ }
+
+ Collections.sort(matches, proposalComparator);
+
+ return matches.toArray(new ICompletionProposal[matches.size()]);
+ }
+
+ private int getRelevance(Template template, int lineOffset, String prefix) {
+ boolean blockTemplate = templates == null ? false : templates.isBlock(template);
+ if (blockTemplate) {
+ if (template.getName().startsWith(prefix)) {
+ return lineOffset == 0 ? 95 : 75;
+ }
+ return lineOffset == 0 ? 85 : 0;
+ }
+ return super.getRelevance(template, prefix);
+ }
+
+ private boolean isSelectionBasedMatch(Template template, TemplateContext context) {
+ String pattern = template.getPattern();
+ Set<String> vars = new HashSet<String>();
+ Matcher matcher = VARIABLE_PATTERN.matcher(pattern);
+ while (matcher.find()) {
+ String variableName = matcher.group(1);
+ if (vars.add(variableName)) {
+ String variable = context.getVariable(variableName);
+ if (variable != null && variable.length() > 0) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ templates = markupLanguage == null ? null : WikiTextUiPlugin.getDefault().getTemplates().get(
+ markupLanguage.getName());
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/Messages.java
new file mode 100644
index 0000000..b79166a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.assist;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.assist.messages"; //$NON-NLS-1$
+
+ public static String MarkupTemplateCompletionProcessor_contextName;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/MultiplexingContentAssistProcessor.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/MultiplexingContentAssistProcessor.java
new file mode 100644
index 0000000..d17e55f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/MultiplexingContentAssistProcessor.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.assist;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MultiplexingContentAssistProcessor implements IContentAssistProcessor {
+
+ private IContentAssistProcessor[] delegates;
+
+ private final char[] autoActivationCharacters = new char[0];
+
+ private final char[] contextInformationCharacters = new char[0];
+
+ public void addDelegate(IContentAssistProcessor processor) {
+ if (delegates == null) {
+ delegates = new IContentAssistProcessor[] { processor };
+ } else {
+ IContentAssistProcessor[] processors = new IContentAssistProcessor[delegates.length + 1];
+ System.arraycopy(delegates, 0, processors, 0, delegates.length);
+ processors[delegates.length] = processor;
+ delegates = processors;
+ }
+ }
+
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+ ICompletionProposal[] allProposals = null;
+ for (IContentAssistProcessor delegate : delegates) {
+ allProposals = merge(allProposals, delegate.computeCompletionProposals(viewer, offset));
+ }
+ return allProposals;
+ }
+
+ private ICompletionProposal[] merge(ICompletionProposal[] proposals1, ICompletionProposal[] proposals2) {
+ ICompletionProposal[] proposals = proposals1;
+ if (proposals1 == null) {
+ proposals = proposals2;
+ } else if (proposals2 == null) {
+ proposals = proposals1;
+ } else {
+ proposals = new ICompletionProposal[proposals1.length + proposals2.length];
+ System.arraycopy(proposals1, 0, proposals, 0, proposals1.length);
+ System.arraycopy(proposals2, 0, proposals, proposals1.length, proposals2.length);
+ }
+ return proposals;
+ }
+
+ private IContextInformation[] merge(IContextInformation[] information1, IContextInformation[] information2) {
+ IContextInformation[] information = information1;
+ if (information1 == null) {
+ information = information2;
+ } else if (information2 == null) {
+ information = information1;
+ } else {
+ information = new IContextInformation[information1.length + information2.length];
+ System.arraycopy(information1, 0, information, 0, information1.length);
+ System.arraycopy(information2, 0, information, information1.length, information2.length);
+ }
+ return information;
+ }
+
+ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+ IContextInformation[] allInformation = null;
+ for (IContentAssistProcessor delegate : delegates) {
+ IContextInformation[] information = delegate.computeContextInformation(viewer, offset);
+ allInformation = merge(allInformation, information);
+ }
+ return allInformation;
+ }
+
+ public char[] getCompletionProposalAutoActivationCharacters() {
+ return autoActivationCharacters;
+ }
+
+ public char[] getContextInformationAutoActivationCharacters() {
+ return contextInformationCharacters;
+ }
+
+ public IContextInformationValidator getContextInformationValidator() {
+ List<IContextInformationValidator> validators = null;
+ for (IContentAssistProcessor delegate : delegates) {
+ IContextInformationValidator validator = delegate.getContextInformationValidator();
+ if (validator != null) {
+ if (validators == null) {
+ validators = new ArrayList<IContextInformationValidator>();
+ }
+ }
+ }
+ if (validators != null) {
+ // FIXME: return a compound validator
+ return validators.get(0);
+ }
+ return null;
+ }
+
+ public String getErrorMessage() {
+ for (IContentAssistProcessor delegate : delegates) {
+ String message = delegate.getErrorMessage();
+ if (message != null) {
+ return message;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/Templates.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/Templates.java
new file mode 100644
index 0000000..6e76cf9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/Templates.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.assist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.text.templates.Template;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Templates {
+
+ private String markupLanguageName;
+
+ private final List<Template> template = new ArrayList<Template>();
+
+ private final Set<Template> blockTemplates = new HashSet<Template>();
+
+ private Templates parent;
+
+ public void setMarkupLanguageName(String markupLanguageName) {
+ this.markupLanguageName = markupLanguageName;
+ }
+
+ public String getMarkupLanguageName() {
+ return markupLanguageName;
+ }
+
+ public List<Template> getTemplate() {
+ if (parent != null) {
+ List<Template> parentTemplate = parent.getTemplate();
+ List<Template> list = new ArrayList<Template>(template.size() + parentTemplate.size());
+ list.addAll(parentTemplate);
+ list.addAll(template);
+ return Collections.unmodifiableList(list);
+ }
+ return Collections.unmodifiableList(template);
+ }
+
+ public void addTemplate(Template template, boolean block) {
+ this.template.add(template);
+ if (block) {
+ this.blockTemplates.add(template);
+ }
+ }
+
+ public void addAll(Templates other) {
+ this.template.addAll(other.template);
+ this.blockTemplates.addAll(other.template);
+ }
+
+ public boolean isBlock(Template template) {
+ return blockTemplates.contains(template) || (parent != null && parent.isBlock(template));
+ }
+
+ public Templates getParent() {
+ return parent;
+ }
+
+ public void setParent(Templates parent) {
+ this.parent = parent;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/messages.properties
new file mode 100644
index 0000000..d1737d5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/assist/messages.properties
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+MarkupTemplateCompletionProcessor_contextName=Lightweight Markup
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/Messages.java
new file mode 100644
index 0000000..5c284a7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/Messages.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.commands;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.commands.messages"; //$NON-NLS-1$
+
+ public static String ShowCheatSheetCommand_noCheatSheetContent;
+
+ public static String ShowCheatSheetCommand_unknownLanguage;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/ShowCheatSheetCommand.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/ShowCheatSheetCommand.java
new file mode 100644
index 0000000..2f68546
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/ShowCheatSheetCommand.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.expressions.EvaluationContext;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.text.information.InformationPresenter;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.actions.ContextHelpAction;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.help.HelpContent;
+import org.eclipse.mylyn.internal.wikitext.ui.util.InformationPresenterUtil;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+
+
+/**
+ * A command that can show a cheat-sheet (help content) for a specific markup language.
+ *
+ * For the command to operate, the following conditions must be met:
+ * <ul>
+ * <li>The {@link ExecutionEvent#getApplicationContext() application context} must be an {@link EvaluationContext}.</li>
+ * <li>The {@link EvaluationContext} must have an <code>activeFocusControl</code>
+ * {@link EvaluationContext#getVariable(String) variable}</li>
+ * <li>The control must have the folllowing data items:
+ *
+ * <pre>
+ * <code>
+ * MarkupLanguage markupLanguage = (MarkupLanguage) control.getData(MarkupLanguage.class.getName());
+ * ISourceViewer viewer = (ISourceViewer) control.getData(ISourceViewer.class.getName());
+ * </code>
+ * </pre>
+ *
+ * </li>
+ * </ul>
+ *
+ * @author David Green
+ */
+public class ShowCheatSheetCommand extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ Object activeFocusControl = HandlerUtil.getVariable(event, "activeFocusControl"); //$NON-NLS-1$
+ if (activeFocusControl instanceof Control) {
+ Control control = (Control) activeFocusControl;
+ MarkupLanguage markupLanguage = (MarkupLanguage) control.getData(MarkupLanguage.class.getName());
+ ISourceViewer viewer = (ISourceViewer) control.getData(ISourceViewer.class.getName());
+
+ if (markupLanguage != null && viewer != null) {
+ ToolBarManager toolBarManager = new ToolBarManager();
+ toolBarManager.add(new ContextHelpAction());
+ final InformationPresenter informationPresenter = InformationPresenterUtil.getHtmlInformationPresenter(
+ viewer, new InformationPresenterUtil.SizeConstraint(50, 200, true, true), toolBarManager,
+ computeCheatSheet(markupLanguage));
+
+ // show information asynchronously since on Eclipse 3.4 it will disappear otherwise
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ informationPresenter.showInformation();
+ }
+ });
+ }
+ }
+
+ return null;
+ }
+
+ private String computeCheatSheet(MarkupLanguage markupLanguage) {
+ HelpContent content = null;
+ if (markupLanguage != null) {
+ content = WikiTextUiPlugin.getDefault().getCheatSheets().get(markupLanguage.getName());
+ if (content == null) {
+ // explore the hierarchy for cheat-sheet content
+ MarkupLanguage l = markupLanguage;
+
+ while (content == null && l != null && l.getExtendsLanguage() != null) {
+ l = WikiText.getMarkupLanguage(l.getExtendsLanguage());
+ if (l != null) {
+ content = WikiTextUiPlugin.getDefault().getCheatSheets().get(l.getName());
+ }
+ }
+ }
+ }
+ if (content != null) {
+ try {
+ return content.getContent();
+ } catch (Exception e) {
+ WikiTextUiPlugin.getDefault().log(e);
+ }
+ }
+ return NLS.bind(
+ Messages.ShowCheatSheetCommand_noCheatSheetContent,
+ new Object[] { markupLanguage == null ? Messages.ShowCheatSheetCommand_unknownLanguage : markupLanguage.getName() });
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/ShowQuickOutlineCommand.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/ShowQuickOutlineCommand.java
new file mode 100644
index 0000000..8dfaba9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/ShowQuickOutlineCommand.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author David Green
+ */
+public class ShowQuickOutlineCommand extends AbstractHandler {
+
+ /**
+ * Operation code for quick outline
+ */
+ public static final int QUICK_OUTLINE = 513; // magic number from PDE quick outline see PDEProjectionViewer
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ Object activeFocusControl = HandlerUtil.getVariable(event, "activeFocusControl"); //$NON-NLS-1$
+ if (activeFocusControl instanceof Control) {
+ Control control = (Control) activeFocusControl;
+ if (!control.isDisposed()) {
+ ISourceViewer viewer = (ISourceViewer) control.getData(ISourceViewer.class.getName());
+ if (viewer != null) {
+ ITextOperationTarget operationTarget = viewer.getTextOperationTarget();
+ if (operationTarget.canDoOperation(QUICK_OUTLINE)) {
+ operationTarget.doOperation(QUICK_OUTLINE);
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/messages.properties
new file mode 100644
index 0000000..860c67c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/commands/messages.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+ShowCheatSheetCommand_noCheatSheetContent=<html><body><em>No cheat sheet content available for markup language: {0}</em></body></html>
+ShowCheatSheetCommand_unknownLanguage=unknown
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/DndConfigurationStrategy.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/DndConfigurationStrategy.java
new file mode 100644
index 0000000..310c2ee
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/DndConfigurationStrategy.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.dnd;
+
+import org.eclipse.jface.util.DelegatingDragAdapter;
+import org.eclipse.jface.util.DelegatingDropAdapter;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.CommandManager;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ *
+ * @author David Green
+ */
+public class DndConfigurationStrategy {
+
+ private DelegatingDragAdapter dragAdapter;
+
+ private DragSource dragSource;
+
+ private DelegatingDropAdapter dropAdapter;
+
+ private DropTarget dropTarget;
+
+ public void configure(CommandManager commandManager, Control control, ISelectionProvider provider) {
+
+ dragAdapter = new DelegatingDragAdapter();
+ dragSource = new DragSource(control, DND.DROP_COPY | DND.DROP_MOVE);
+ dragAdapter.addDragSourceListener(new OutlineDragSourceListener(provider));
+ dragSource.addDragListener(dragAdapter);
+ dragSource.setTransfer(dragAdapter.getTransfers());
+
+ dropAdapter = new DelegatingDropAdapter();
+ dropTarget = new DropTarget(control, DND.DROP_COPY | DND.DROP_MOVE);
+ dropAdapter.addDropTargetListener(new OutlineDropTargetListener(commandManager));
+ dropTarget.addDropListener(dropAdapter);
+ dropTarget.setTransfer(dropAdapter.getTransfers());
+ }
+
+ public void dispose() {
+ if (dragSource != null) {
+ dragSource.dispose();
+ dragSource = null;
+ }
+ if (dropTarget != null) {
+ dropTarget.dispose();
+ dropTarget = null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/Messages.java
new file mode 100644
index 0000000..b1a9f08
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/Messages.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.dnd;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.dnd.messages"; //$NON-NLS-1$
+
+ public static String OutlineDropTargetListener_0;
+
+ public static String OutlineDropTargetListener_1;
+
+ public static String OutlineDropTargetListener_2;
+
+ public static String OutlineDropTargetListener_3;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/OutlineDragSourceListener.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/OutlineDragSourceListener.java
new file mode 100644
index 0000000..be344e4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/OutlineDragSourceListener.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.dnd;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.TransferDragSourceListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.Transfer;
+
+/**
+ *
+ * @author David Green
+ */
+public class OutlineDragSourceListener implements TransferDragSourceListener {
+ private final ISelectionProvider selectionProvider;
+
+ public OutlineDragSourceListener(ISelectionProvider selectionProvider) {
+ this.selectionProvider = selectionProvider;
+ }
+
+ public Transfer getTransfer() {
+ return LocalSelectionTransfer.getTransfer();
+ }
+
+ public void dragFinished(DragSourceEvent event) {
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ }
+
+ public void dragSetData(DragSourceEvent event) {
+ }
+
+ public void dragStart(DragSourceEvent event) {
+ LocalSelectionTransfer.getTransfer().setSelection(selectionProvider.getSelection());
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/OutlineDropTargetListener.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/OutlineDropTargetListener.java
new file mode 100644
index 0000000..e4bf01d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/OutlineDropTargetListener.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.dnd;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.util.TransferDropTargetListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.AbstractDocumentCommand;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.CommandManager;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.InsertLocation;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.operations.MoveSectionsCommand;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
+
+
+
+/**
+ *
+ * @author David Green
+ */
+public class OutlineDropTargetListener implements TransferDropTargetListener {
+
+ private static final double THRESHOLD_BEFORE = 0.25f;
+
+ private static final double THRESHOLD_AFTER = 0.75f;
+
+ private final CommandManager commandManager;
+
+ public OutlineDropTargetListener(CommandManager commandManager) {
+ this.commandManager = commandManager;
+ }
+
+ public void dragEnter(DropTargetEvent event) {
+ // ignore
+ }
+
+ public void dragLeave(DropTargetEvent event) {
+ // ignore
+ }
+
+ public void dragOperationChanged(DropTargetEvent event) {
+ // ignore
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ // ignore
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ // Based on XMLContentOutlineConfiguration
+ event.feedback = DND.FEEDBACK_SELECT;
+ float relativeLocation = computeRelativeLocation(event);
+ if (relativeLocation > THRESHOLD_AFTER) {
+ // point was mostly below the item
+ event.feedback = DND.FEEDBACK_INSERT_AFTER;
+ } else if (relativeLocation < THRESHOLD_BEFORE) {
+ // point was mostly above the item
+ event.feedback = DND.FEEDBACK_INSERT_BEFORE;
+ }
+ // always provide expand/scroll capability when dragging
+ event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
+ }
+
+ public void drop(DropTargetEvent event) {
+ List<OutlineItem> dropItems = getDropItems(event);
+ if (dropItems != null) {
+ InsertLocation location = computeInsertLocation(event);
+ Object targetData = event.item.getData();
+
+ final AbstractDocumentCommand command = computeCommand(targetData, dropItems, location);
+ if (command != null) {
+ if (command.isEnabled()) {
+ SafeRunnable.run(new ISafeRunnable() {
+ public void handleException(Throwable exception) {
+ WikiTextUiPlugin.getDefault().log(exception);
+ MessageDialog.openError(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.OutlineDropTargetListener_0, NLS.bind(Messages.OutlineDropTargetListener_1, new Object[] { exception.getMessage() }));
+ }
+
+ public void run() throws Exception {
+ commandManager.perform(command);
+ }
+ });
+ } else {
+ MessageDialog.openInformation(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.OutlineDropTargetListener_2, NLS.bind(Messages.OutlineDropTargetListener_3,
+ new Object[] { command.getProblemText() }));
+ }
+ }
+ }
+ }
+
+ private AbstractDocumentCommand computeCommand(Object targetData, List<OutlineItem> dropItems,
+ InsertLocation location) {
+ return new MoveSectionsCommand((OutlineItem) targetData, dropItems, location);
+ }
+
+ /**
+ * get the outline items being dropped, or null if there are none or if the event does not qualify for a drop.
+ */
+ @SuppressWarnings("unchecked")
+ private List<OutlineItem> getDropItems(DropTargetEvent event) {
+ if (event.operations == DND.DROP_NONE || event.item == null) {
+ return null;
+ }
+ Object targetData = event.item.getData();
+ if (!(targetData instanceof OutlineItem)) {
+ return null;
+ }
+
+ ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
+ if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ List<?> list = structuredSelection.toList();
+ if (!list.isEmpty()) {
+ for (Object i : list) {
+ if (!(i instanceof OutlineItem)) {
+ return null;
+ }
+ }
+ return (List<OutlineItem>) list;
+ }
+ }
+ return null;
+ }
+
+ private InsertLocation computeInsertLocation(DropTargetEvent event) {
+ float relativeLocation = computeRelativeLocation(event);
+ if (relativeLocation < THRESHOLD_BEFORE) {
+ return InsertLocation.BEFORE;
+ } else if (relativeLocation > THRESHOLD_AFTER) {
+ return InsertLocation.AFTER;
+ }
+ return InsertLocation.WITHIN;
+ }
+
+ private float computeRelativeLocation(DropTargetEvent event) {
+ if (event.item == null) {
+ return 0.5f;
+ } else if (event.item instanceof TreeItem) {
+ TreeItem treeItem = (TreeItem) event.item;
+ Control control = treeItem.getParent();
+ Point controlRelativeEventLocation = control.toControl(new Point(event.x, event.y));
+ Rectangle bounds = treeItem.getBounds();
+ return (float) (controlRelativeEventLocation.y - bounds.y) / (float) bounds.height;
+ } else {
+ return 0.0f;
+ }
+ }
+
+ public Transfer getTransfer() {
+ return LocalSelectionTransfer.getTransfer();
+ }
+
+ public boolean isEnabled(DropTargetEvent event) {
+ return getTransfer().isSupportedType(event.currentDataType) && getDropItems(event) != null;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/messages.properties
new file mode 100644
index 0000000..cee5555
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/dnd/messages.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+OutlineDropTargetListener_0=Unexpected Error
+OutlineDropTargetListener_1=An unexpected error occurred performing drop: {0}\nPlease see the error log for more details.
+OutlineDropTargetListener_2=Cannot drop items
+OutlineDropTargetListener_3=Cannot drop items: {0}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/CheatSheetContent.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/CheatSheetContent.java
new file mode 100644
index 0000000..dfa8a58
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/CheatSheetContent.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.help;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * A handle to cheat sheet content, which may modify the content to be more suitable for cheat-sheet viewing by applying
+ * CSS styles.
+ *
+ * @author David Green
+ *
+ */
+public class CheatSheetContent extends HelpContent {
+
+ private final Pattern headingOpenTagPattern = Pattern.compile("(<h[4-6][^>]*)>", Pattern.MULTILINE //$NON-NLS-1$
+ | Pattern.CASE_INSENSITIVE);
+
+ public CheatSheetContent(Bundle provider, String resourcePath, String resourceContentLanguage,
+ String markupLanguageName) {
+ super(provider, resourcePath, resourceContentLanguage, markupLanguageName);
+ }
+
+ @Override
+ public String getContent() throws IOException {
+ String content = super.getContent();
+ Matcher headingMatcher = headingOpenTagPattern.matcher(content);
+ return headingMatcher.replaceAll("$1 style=\"color: DarkBlue;\">"); //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/HelpContent.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/HelpContent.java
new file mode 100644
index 0000000..aaccca4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/HelpContent.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.help;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.Bundle;
+
+
+
+/**
+ * A handle to help content. HelpContent is retrieved from a resource path from a bundle. Help content is retrieved in a
+ * locale-specific manner, much in the same way as resource bundles are. A resource path is used with the
+ * {@link Locale#getDefault() default locale} to construct a search path.
+ *
+ * For example, the resource may be specified as <code>help/cheatSheet.textile</code> and for the locale
+ * <tt>no_NO_NY</tt> the following resource paths would be searched in the following order:
+ *
+ * <ul>
+ * <li><code>help/cheatSheet_no_NO_NY.textile</code></li>
+ * <li><code>help/cheatSheet_no_NO.textile</code></li>
+ * <li><code>help/cheatSheet_no.textile</code></li>
+ * <li><code>help/cheatSheet.textile</code></li>
+ * </ul>
+ *
+ * In this way the user is presented with the most locale-specific help resource.
+ *
+ * @author David Green
+ */
+public class HelpContent {
+ private final Bundle provider;
+
+ private final String resourcePath;
+
+ private final String resourceContentLanguage;
+
+ private final String markupLanguageName;
+
+ /**
+ *
+ * @param provider
+ * the bundle that provides the content
+ * @param resourcePath
+ * a bundle-relative path to the content
+ * @param resourceContentLanguage
+ * the markup language of the content, or null if it is HTML
+ * @param markupLanguage
+ * the markup language name for which this help content is relevant
+ */
+ public HelpContent(Bundle provider, String resourcePath, String resourceContentLanguage, String markupLanguage) {
+ if (provider == null || resourcePath == null || markupLanguage == null) {
+ throw new IllegalArgumentException();
+ }
+ this.provider = provider;
+ this.resourcePath = resourcePath;
+ this.resourceContentLanguage = resourceContentLanguage;
+ this.markupLanguageName = markupLanguage;
+ }
+
+ /**
+ * The name of the markup language for which this help content is relevant
+ */
+ public String getMarkupLanguageName() {
+ return markupLanguageName;
+ }
+
+ /**
+ * the bundle that provides the cheat-sheet
+ */
+ public Bundle getProvider() {
+ return provider;
+ }
+
+ /**
+ * Get the help content, which may be formatted using HTML markup. If HTML markup is used, the content must be
+ * well-formed HTML.
+ */
+ @SuppressWarnings("serial")
+ public String getContent() throws IOException {
+ try {
+ String content = null;
+ URL resource = getResource();
+ Reader reader = new InputStreamReader(new BufferedInputStream(resource.openStream()));
+ try {
+ StringBuilder buf = new StringBuilder();
+ int i;
+ while ((i = reader.read()) != -1) {
+ buf.append((char) i);
+ }
+ content = buf.toString();
+ } finally {
+ reader.close();
+ }
+ if (resourceContentLanguage == null || "html".equalsIgnoreCase(resourceContentLanguage)) { //$NON-NLS-1$
+ return content;
+ }
+ MarkupLanguage markupLanguage = WikiText.getMarkupLanguage(resourceContentLanguage);
+ if (markupLanguage == null) {
+ throw new IOException(NLS.bind(
+ Messages.HelpContent_noSuchMarkupLanguage, new Object[] { resourceContentLanguage }));
+ }
+ MarkupParser markupParser = new MarkupParser(markupLanguage);
+ return markupParser.parseToHtml(content);
+ } catch (final Exception e) {
+ throw new IOException(NLS.bind(
+ Messages.HelpContent_cannotAccessContent, new Object[] { provider.getSymbolicName(),
+ resourcePath, e.getMessage() })) {
+ @Override
+ public Throwable getCause() {
+ return e;
+ }
+ };
+ }
+ }
+
+ private URL getResource() throws Exception {
+ int idx = resourcePath.lastIndexOf('.');
+ List<String> paths = new ArrayList<String>();
+ if (idx != -1) {
+
+ // construct a search path based on the users locale
+ String basePath = resourcePath.substring(0, idx);
+ String extension = resourcePath.substring(idx + 1);
+
+ Locale locale = Locale.getDefault();
+ String language = locale.getLanguage();
+ String country = locale.getCountry();
+ String variant = locale.getVariant();
+
+ if (variant.length() > 0) {
+ paths.add(basePath + "_" + language + "_" + country + "_" + variant + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ }
+ if (country.length() > 0) {
+ paths.add(basePath + "_" + language + "_" + country + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ if (language.length() > 0) {
+ paths.add(basePath + "_" + language + "." + extension); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ paths.add(resourcePath);
+
+ for (String path : paths) {
+ URL resource = provider.getResource(path);
+ if (resource != null) {
+ return resource;
+ }
+ }
+ throw new Exception(NLS.bind(Messages.HelpContent_cannotFindResource, new Object[] { resourcePath,
+ provider.getSymbolicName() }));
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/Messages.java
new file mode 100644
index 0000000..7f1fcf9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/Messages.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.help;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.help.messages"; //$NON-NLS-1$
+
+ public static String HelpContent_cannotAccessContent;
+
+ public static String HelpContent_cannotFindResource;
+
+ public static String HelpContent_noSuchMarkupLanguage;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/messages.properties
new file mode 100644
index 0000000..648709f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/help/messages.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+HelpContent_cannotAccessContent=Cannot access content {0}/{1}: {2}
+HelpContent_cannotFindResource=Cannot find resource ''{0}'' in plugin ''{1}''
+HelpContent_noSuchMarkupLanguage=No such markup language: {0}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/messages.properties
new file mode 100644
index 0000000..0bdbeb7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/messages.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+
+
+ContentAssistProposal_label=&Default
+
+MarkupEditor_markupLanguage=Markup Language
+MarkupEditor_markupPreferenceError=Cannot load markup language preference
+MarkupEditor_markupPreferenceError2=Cannot store markup language preference ''{0}''
+MarkupEditor_markupSource=Markup Source
+MarkupEditor_markupSource_named={0} Source
+MarkupEditor_markupSource_tooltip=The markup source view
+MarkupEditor_markupSource_tooltip_named=The markup source view, dislpaying {0} markup
+MarkupEditor_preview=Preview
+MarkupEditor_preview_tooltip=The markup preview, which shows the markup source as it would be rendered to HTML
+MarkupEditor_updateOutline=Update outline
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/AbstractDocumentCommand.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/AbstractDocumentCommand.java
new file mode 100644
index 0000000..6053000
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/AbstractDocumentCommand.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.operations;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+
+/**
+ *
+ * @author David Green
+ */
+public abstract class AbstractDocumentCommand {
+
+ protected String problemText;
+
+ public void execute(IUndoManager undoManager, IDocument document) throws CoreException {
+ if (!isEnabled()) {
+ throw new IllegalStateException();
+ }
+ try {
+ undoManager.beginCompoundChange();
+ try {
+ doCommand(document);
+ } finally {
+ undoManager.endCompoundChange();
+ }
+ } catch (BadLocationException e) {
+ throw new CoreException(WikiTextUiPlugin.getDefault().createStatus(IStatus.ERROR, e));
+ }
+ }
+
+ /**
+ * indicate if the command can be exectued
+ *
+ * @see #getProblemText()
+ */
+ public boolean isEnabled() {
+ return getProblemText() == null;
+ }
+
+ /**
+ * indicate the cause of any problems (why the command cannot be executed).
+ *
+ * @see #isEnabled()
+ */
+ public String getProblemText() {
+ return problemText;
+ }
+
+ /**
+ * @see #getProblemText()
+ */
+ protected void setProblemText(String problemText) {
+ this.problemText = problemText;
+ }
+
+ protected abstract void doCommand(IDocument document) throws BadLocationException;
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/CommandManager.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/CommandManager.java
new file mode 100644
index 0000000..97f8c88
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/CommandManager.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.operations;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ *
+ * @author David Green
+ */
+public interface CommandManager {
+
+ /**
+ * perform the given command
+ *
+ * @param command
+ * the command to perform
+ * @throws CoreException
+ */
+ public void perform(AbstractDocumentCommand command) throws CoreException;
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/InsertLocation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/InsertLocation.java
new file mode 100644
index 0000000..6ebf93e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/InsertLocation.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.operations;
+
+/**
+ * the position of an insert operation
+ *
+ * @author David Green
+ */
+public enum InsertLocation {
+ BEFORE, AFTER, WITHIN
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/Messages.java
new file mode 100644
index 0000000..4a17665
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.operations;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.operations.messages"; //$NON-NLS-1$
+
+ public static String MoveSectionsCommand_invalidTargetLocation_self;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/MoveSectionsCommand.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/MoveSectionsCommand.java
new file mode 100644
index 0000000..53c102a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/MoveSectionsCommand.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.operations;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * A command that moves sections denoted by headings within a document.
+ *
+ * @author David Green
+ */
+public class MoveSectionsCommand extends AbstractDocumentCommand {
+
+ public class OffsetComparator implements Comparator<OutlineItem> {
+ public int compare(OutlineItem o1, OutlineItem o2) {
+ if (o1 == o2) {
+ return 0;
+ }
+ if (o1.getOffset() < o2.getOffset()) {
+ return -1;
+ } else if (o1.getOffset() > o2.getOffset()) {
+ return 1;
+ }
+ return 0;
+ }
+ }
+
+ private final OutlineItem target;
+
+ private final List<OutlineItem> items;
+
+ private final InsertLocation location;
+
+ public MoveSectionsCommand(OutlineItem target, List<OutlineItem> items, InsertLocation location) {
+ if (target == null || items == null || location == null) {
+ throw new IllegalArgumentException();
+ }
+ if (items.isEmpty()) {
+ throw new IllegalArgumentException();
+ }
+ this.target = target;
+ this.items = items;
+ this.location = location;
+ validate();
+ }
+
+ private void validate() {
+ // target must not be contained by items to be moved
+ for (int x = 0; x < items.size(); ++x) {
+ OutlineItem item = items.get(x);
+ if (item.contains(target)) {
+ setProblemText(Messages.MoveSectionsCommand_invalidTargetLocation_self);
+ }
+ }
+ }
+
+ private static class Section {
+ int offset;
+
+ int length;
+
+ public Section(int offset, int length) {
+ this.offset = offset;
+ this.length = length;
+ }
+
+ }
+
+ @Override
+ protected void doCommand(IDocument document) throws BadLocationException {
+ // prune items to relocate if they are contained within another item that is being
+ // relocated.
+ for (int x = 0; x < items.size(); ++x) {
+ OutlineItem item = items.get(x);
+
+ for (int y = 0; y < x; ++y) {
+ OutlineItem previousItem = items.get(y);
+ if (previousItem.contains(item)) {
+ items.remove(x);
+ --x;
+ break;
+ } else if (item.contains(previousItem)) {
+ items.remove(y);
+ --x;
+ --y;
+ }
+ }
+ }
+ if (items.size() > 1) {
+ Collections.sort(items, new OffsetComparator());
+ }
+ final Section[] sections = new Section[items.size()];
+ for (int x = 0; x < items.size(); ++x) {
+ OutlineItem item = items.get(x);
+ sections[x] = new Section(item.getOffset(), item.getSectionLength());
+ }
+ int insertLocation = target.getOffset();
+ if (location == InsertLocation.WITHIN) {
+ List<OutlineItem> children = target.getChildren();
+ if (children.isEmpty()) {
+ insertLocation += target.getLength();
+ // insert at the first position found after the header text and any following newlines
+ while (insertLocation < document.getLength()) {
+ char c = document.getChar(insertLocation);
+ if (c == '\r' || c == '\n') {
+ ++insertLocation;
+ } else {
+ break;
+ }
+ }
+ } else {
+ // In this case we handle within as before the first child. Even though this may
+ // be somewhat non-intuitive, it actually makes sense. Without this we would see
+ // text content after the target heading but before the first child be magically appended
+ // to the end of the dropped items -- which in almost all cases is undesirable.
+ insertLocation = children.get(0).getOffset();
+ }
+ } else if (location == InsertLocation.AFTER) {
+ // insert afte the section denoted by the heading
+ insertLocation += target.getSectionLength();
+ }
+
+ String twoNewlines = Text.DELIMITER + Text.DELIMITER;
+
+ for (int x = 0; x < sections.length; ++x) {
+ Section section = sections[x];
+
+ String text = document.get(section.offset, section.length);
+ document.replace(section.offset, section.length, ""); //$NON-NLS-1$
+
+ // whitespace hack: if the section we're moving doesn't end with a blank line
+ // then we add one.
+ int adjustmentFactor = 0;
+ if (!text.endsWith(twoNewlines)) {
+ text += twoNewlines;
+ adjustmentFactor = twoNewlines.length();
+ section.length += adjustmentFactor;
+ }
+
+ if (section.offset < insertLocation) {
+ insertLocation -= section.length;
+ }
+ final int insertedLocation = insertLocation;
+ document.replace(insertedLocation, 0, text);
+ insertLocation += section.length;
+
+ // any sections that come before the insert location must be shifted since
+ // we cut text from there. Note that sections that follow the insert location need
+ // not be adjusted because we first cut and then pasted
+ for (int y = x + 1; y < sections.length; ++y) {
+ Section section2 = sections[y];
+
+ if (section2.offset < insertedLocation) {
+ section2.offset -= section.length;
+ } else if (adjustmentFactor > 0) {
+ section2.offset += adjustmentFactor;
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/messages.properties
new file mode 100644
index 0000000..c73f3eb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/operations/messages.properties
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+MoveSectionsCommand_invalidTargetLocation_self=Cannot move a section inside itself
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/Messages.java
new file mode 100644
index 0000000..8eacec7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.outline;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.outline.messages"; //$NON-NLS-1$
+
+ public static String QuickOutlinePopupDialog_infoText;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/QuickOutlinePopupDialog.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/QuickOutlinePopupDialog.java
new file mode 100644
index 0000000..dff786e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/QuickOutlinePopupDialog.java
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.outline;
+
+import java.lang.reflect.Constructor;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.PopupDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlExtension;
+import org.eclipse.jface.text.IInformationControlExtension2;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.model.BaseWorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.ShowInContext;
+
+/**
+ * A quick outline popup. Design based on PDE class by the same name.
+ *
+ * @author David Green
+ */
+public class QuickOutlinePopupDialog extends PopupDialog implements IInformationControl, IInformationControlExtension,
+ IInformationControlExtension2 {
+
+ private FilteredTree filteredTree;
+
+ private final IShowInTarget showInTarget;
+
+ private PatternFilter patternFilter;
+
+ @SuppressWarnings("deprecation")
+ public QuickOutlinePopupDialog(Shell parent, IShowInTarget showInTarget) {
+ super(parent, SWT.RESIZE, true, true, false, false, null, null);
+ this.showInTarget = showInTarget;
+ setInfoText(Messages.QuickOutlinePopupDialog_infoText);
+ create();
+ }
+
+ @Override
+ protected Control createTitleControl(Composite parent) {
+ Text fileterText = new Text(parent, SWT.SEARCH);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(fileterText);
+ return fileterText;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected List getBackgroundColorExclusions() {
+ List exclusions = super.getBackgroundColorExclusions();
+ if (filteredTree != null) {
+ Text filterControl = filteredTree.getFilterControl();
+ exclusions.add(filterControl.getParent());
+ exclusions.addAll(Arrays.asList(filterControl.getParent().getChildren()));
+ }
+ return exclusions;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ patternFilter = new PatternFilter();
+ // TODO e3.5: use the new look constructor if available.
+ try {
+ Constructor<FilteredTree> constructor = FilteredTree.class.getConstructor(Composite.class, int.class,
+ PatternFilter.class, boolean.class);
+ filteredTree = constructor.newInstance(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER,
+ patternFilter, true);
+ } catch (SecurityException e1) {
+ throw new IllegalStateException(e1);
+ } catch (NoSuchMethodException e1) {
+ filteredTree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, patternFilter);
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+
+ int heightHint = (filteredTree.getViewer().getTree().getItemHeight() * 12)
+ + Math.max(filteredTree.getFilterControl().getSize().y, 12);
+ GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, heightHint).applyTo(filteredTree);
+
+ filteredTree.getViewer().setUseHashlookup(true);
+ filteredTree.getViewer().setContentProvider(new BaseWorkbenchContentProvider());
+ filteredTree.getViewer().setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider());
+ filteredTree.getViewer().setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
+
+ filteredTree.getViewer().getTree().addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ handleSelection();
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ // nothing to do
+ }
+ });
+ // dispose when escape is pressed
+ filteredTree.getViewer().getTree().addKeyListener(new KeyListener() {
+ public void keyPressed(KeyEvent e) {
+ if (e.character == 0x1B) {
+ dispose();
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+ });
+ // single mouse click causes selection
+ filteredTree.getViewer().getTree().addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ Tree tree = filteredTree.getViewer().getTree();
+ if ((tree.getSelectionCount() < 1) || (e.button != 1)) {
+ return;
+ }
+ // Selection is made in the selection changed listener
+ Object object = tree.getItem(new Point(e.x, e.y));
+ TreeItem selection = tree.getSelection()[0];
+ if (selection.equals(object)) {
+ handleSelection();
+ }
+ }
+ });
+ return filteredTree;
+ }
+
+ public void addDisposeListener(DisposeListener listener) {
+ getShell().addDisposeListener(listener);
+ }
+
+ public void addFocusListener(FocusListener listener) {
+ getShell().addFocusListener(listener);
+ }
+
+ public Point computeSizeHint() {
+ return getShell().getSize();
+ }
+
+ public void dispose() {
+ close();
+ }
+
+ public boolean isFocusControl() {
+ return filteredTree.isFocusControl() || filteredTree.getFilterControl().isFocusControl()
+ || filteredTree.getViewer().getTree().isFocusControl();
+ }
+
+ public void removeDisposeListener(DisposeListener listener) {
+ getShell().removeDisposeListener(listener);
+ }
+
+ public void removeFocusListener(FocusListener listener) {
+ getShell().removeFocusListener(listener);
+ }
+
+ public void setFocus() {
+ getShell().forceFocus();
+ filteredTree.getFilterControl().setFocus();
+ }
+
+ public void setBackgroundColor(Color background) {
+ applyBackgroundColor(background, getContents());
+ }
+
+ public void setForegroundColor(Color foreground) {
+ applyForegroundColor(foreground, getContents());
+ }
+
+ public void setInformation(String information) {
+ // ignore
+ }
+
+ public void setLocation(Point location) {
+ getShell().setLocation(location);
+ }
+
+ public void setSize(int width, int height) {
+ getShell().setSize(width, height);
+ }
+
+ public void setSizeConstraints(int maxWidth, int maxHeight) {
+ // ignore
+
+ }
+
+ public void setVisible(boolean visible) {
+ if (visible) {
+ open();
+ } else {
+ saveDialogBounds(getShell());
+ getShell().setVisible(false);
+ }
+ }
+
+ public boolean hasContents() {
+ if (filteredTree == null || filteredTree.getViewer().getInput() == null) {
+ return false;
+ }
+ return true;
+ }
+
+ public void setInput(Object input) {
+ filteredTree.getViewer().setInput(input);
+ }
+
+ private void handleSelection() {
+ if (showInTarget != null) {
+ ISelection selection = filteredTree.getViewer().getSelection();
+ if (!selection.isEmpty()) {
+ showInTarget.show(new ShowInContext(null, selection));
+ }
+ }
+ dispose();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/messages.properties
new file mode 100644
index 0000000..56c841d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/outline/messages.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+
+QuickOutlinePopupDialog_infoText=Press 'Esc' to exit the dialog.
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/CssStyleFieldEditor.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/CssStyleFieldEditor.java
new file mode 100644
index 0000000..f5c9c7f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/CssStyleFieldEditor.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.preferences;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.CssStyleManager;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Composite;
+
+
+
+/**
+ * A field editor for CSS styles. Adds validation to CSS rule input.
+ *
+ * @author David Green
+ */
+public class CssStyleFieldEditor extends StringFieldEditor {
+
+ private final CssStyleManager cssStyleManager;
+
+ public CssStyleFieldEditor(CssStyleManager cssStyleManager, String preferenceKey, String key, Composite parent) {
+ super(preferenceKey, key, parent);
+ this.cssStyleManager = cssStyleManager;
+ }
+
+ /**
+ * validate the input
+ */
+ @Override
+ protected boolean doCheckState() {
+ String value = getStringValue();
+ if (value != null && value.trim().length() > 0) {
+ // here we validate that the value looks like it is composed of valid CSS rules
+
+ int offset = 0;
+ Iterator<CssRule> ruleIterator = new CssParser().createRuleIterator(value);
+ while (ruleIterator.hasNext()) {
+ CssRule rule = ruleIterator.next();
+
+ // detect gaps between rules. Such gaps are areas of text that weren't detected as a CSS rule.
+ if (rule.offset > offset) {
+ String gap = value.substring(offset, rule.offset);
+ if (gap.trim().length() != 0) {
+ setErrorMessage(NLS.bind(
+ Messages.CssStyleFieldEditor_unexpectedToken, new Object[] { gap.trim(), offset }));
+ return false;
+ }
+ }
+ offset = rule.offset + rule.length;
+ // unknown rules should create an error
+ if (!cssStyleManager.isKnownRule(rule)) {
+ StringBuilder recognizedNames = new StringBuilder();
+ for (String recognizedName : cssStyleManager.getRecognizedRuleNames()) {
+ if (recognizedNames.length() > 0) {
+ recognizedNames.append(Messages.CssStyleFieldEditor_1);
+ }
+ recognizedNames.append(recognizedName);
+ }
+ setErrorMessage(NLS.bind(
+ Messages.CssStyleFieldEditor_unsupportedRule, new Object[] { rule.name, recognizedNames }));
+ return false;
+ }
+ if (CssStyleManager.RULE_COLOR.equals(rule.name)
+ || CssStyleManager.RULE_BACKGROUND_COLOR.equals(rule.name)) {
+ Integer rgb = CssStyleManager.cssColorRgb(rule.value);
+ if (rgb == null) {
+ setErrorMessage(NLS.bind(
+ Messages.CssStyleFieldEditor_invalidColor, new Object[] { rule.value }));
+ return false;
+ }
+ }
+ }
+ // detect trailing text that wasn't detected as a CSS rule.
+ if (offset < value.length() - 1) {
+ String gap = value.substring(offset, value.length());
+ if (gap.trim().length() != 0) {
+ setErrorMessage(NLS.bind(
+ Messages.CssStyleFieldEditor_unexpectedToken, new Object[] { gap.trim(), offset }));
+ return false;
+ }
+ }
+ }
+ return super.doCheckState();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/EditorPreferencePage.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/EditorPreferencePage.java
new file mode 100644
index 0000000..d0a8165
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/EditorPreferencePage.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.preferences;
+
+import java.util.Map;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.CssStyleManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class represents a preference page that is contributed to the Preferences dialog. By subclassing
+ * <samp>FieldEditorPreferencePage</samp>, we can use the field support built into JFace that allows us to create a page
+ * that is small and knows how to save, restore and apply itself.
+ * <p>
+ * This page is used to modify preferences only. They are stored in the preference store that belongs to the main
+ * plug-in class. That way, preferences can be accessed directly via the preference store.
+ *
+ * @author David Green
+ * @author Hiroyuki Inaba fix for bug 265079: Dialog font not apply WikiText preference pages
+ */
+public class EditorPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
+
+ public EditorPreferencePage() {
+ super(GRID);
+ setPreferenceStore(WikiTextUiPlugin.getDefault().getPreferenceStore());
+ setDescription(Messages.EditorPreferencePage_introInfo);
+ }
+
+ @Override
+ public Control createContents(Composite parent) {
+ ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL) {
+ @Override
+ public Point computeSize(int hint, int hint2, boolean changed) {
+ return new Point(64, 64);
+ }
+ };
+ scrolledComposite.setExpandHorizontal(true);
+ scrolledComposite.setExpandVertical(true);
+
+ Composite body = new Composite(scrolledComposite, SWT.NONE);
+ scrolledComposite.setContent(body);
+ GridLayoutFactory.fillDefaults().margins(0, 0).numColumns(1).applyTo(body);
+
+ Control contents = super.createContents(body);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(contents);
+
+ scrolledComposite.setMinSize(body.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
+ return scrolledComposite;
+ }
+
+ /**
+ * Creates the field editors. Field editors are abstractions of the common GUI blocks needed to manipulate various
+ * types of preferences. Each field editor knows how to save and restore itself.
+ */
+ @Override
+ public void createFieldEditors() {
+ Preferences prefs = new Preferences();
+
+ Layout fieldEditorParentLayout = getFieldEditorParent().getLayout();
+ if (fieldEditorParentLayout instanceof GridLayout) {
+ GridLayout layout = (GridLayout) fieldEditorParentLayout;
+ layout.marginRight = 5;
+ }
+
+ Group blockGroup = new Group(getFieldEditorParent(), SWT.NULL);
+ blockGroup.setText(Messages.EditorPreferencePage_blockModifiers);
+ blockGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(2, 1).create());
+
+ CssStyleManager cssStyleManager = new CssStyleManager(getFont());
+
+ for (Map.Entry<String, String> ent : prefs.getCssByBlockModifierType().entrySet()) {
+ String preferenceKey = Preferences.toPreferenceKey(ent.getKey(), true);
+ addField(new CssStyleFieldEditor(cssStyleManager, preferenceKey, ent.getKey(), blockGroup));
+ }
+ // bug 260427
+ Layout layout = blockGroup.getLayout();
+ if (layout instanceof GridLayout) {
+ GridLayout gridLayout = (GridLayout) layout;
+ gridLayout.marginWidth = 5;
+ gridLayout.marginHeight = 5;
+ }
+
+ Group phraseModifierGroup = new Group(getFieldEditorParent(), SWT.NULL);
+ phraseModifierGroup.setText(Messages.EditorPreferencePage_phraseModifiers);
+ phraseModifierGroup.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(2, 1).create());
+
+ for (Map.Entry<String, String> ent : prefs.getCssByPhraseModifierType().entrySet()) {
+ String preferenceKey = Preferences.toPreferenceKey(ent.getKey(), false);
+ addField(new CssStyleFieldEditor(cssStyleManager, preferenceKey, ent.getKey(), phraseModifierGroup));
+ }
+ // bug 260427
+ layout = phraseModifierGroup.getLayout();
+ if (layout instanceof GridLayout) {
+ GridLayout gridLayout = (GridLayout) layout;
+ gridLayout.marginWidth = 5;
+ gridLayout.marginHeight = 5;
+ }
+
+ applyDialogFont(getFieldEditorParent());
+ blockGroup.setFont(getFieldEditorParent().getFont());
+ phraseModifierGroup.setFont(getFieldEditorParent().getFont());
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
+ "org.eclipse.mylyn.wikitext.help.ui.preferences"); //$NON-NLS-1$
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+ */
+ public void init(IWorkbench workbench) {
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Messages.java
new file mode 100644
index 0000000..1c0c99e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Messages.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.messages"; //$NON-NLS-1$
+
+ public static String CssStyleFieldEditor_1;
+
+ public static String CssStyleFieldEditor_invalidColor;
+
+ public static String CssStyleFieldEditor_unexpectedToken;
+
+ public static String CssStyleFieldEditor_unsupportedRule;
+
+ public static String EditorPreferencePage_blockModifiers;
+
+ public static String EditorPreferencePage_introInfo;
+
+ public static String EditorPreferencePage_phraseModifiers;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/PreferenceInitializer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/PreferenceInitializer.java
new file mode 100644
index 0000000..21aaa78
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/PreferenceInitializer.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+
+/**
+ * Class used to initialize default preference values.
+ *
+ * @author David Green
+ */
+public class PreferenceInitializer extends AbstractPreferenceInitializer {
+
+ @Override
+ public void initializeDefaultPreferences() {
+ IPreferenceStore store = WikiTextUiPlugin.getDefault().getPreferenceStore();
+ Preferences defaults = new Preferences();
+ defaults.save(store, true);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java
new file mode 100644
index 0000000..df83dbe
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java
@@ -0,0 +1,319 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.preferences;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.Stylesheet;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.HtmlTextPresentationParser;
+
+/**
+ * @see WikiTextUiPlugin#getPreferences()
+ * @author David Green
+ */
+public class Preferences implements Cloneable {
+
+ private static final String KEY_MARKUP_VIEWER_CSS = "preview.css"; //$NON-NLS-1$
+
+ private static final String KEY_EDITOR_FOLDING = "editorFolding"; //$NON-NLS-1$
+
+ private static final Pattern BAD_CHAR_PATTERN = Pattern.compile("[^a-zA-Z0-9]"); //$NON-NLS-1$
+
+ public static final String PHRASE_CODE = "@code@"; //$NON-NLS-1$
+
+ public static final String PHRASE_SPAN = "%span%"; //$NON-NLS-1$
+
+ public static final String PHRASE_SUBSCRIPT = "~subscript~"; //$NON-NLS-1$
+
+ public static final String PHRASE_SUPERSCRIPT = "^superscript^"; //$NON-NLS-1$
+
+ public static final String PHRASE_INSERTED_TEXT = "+inserted text+"; //$NON-NLS-1$
+
+ public static final String PHRASE_DELETED_TEXT = "-deleted text-"; //$NON-NLS-1$
+
+ public static final String PHRASE_CITATION = "??citation??"; //$NON-NLS-1$
+
+ public static final String PHRASE_BOLD = "**bold**"; //$NON-NLS-1$
+
+ public static final String PHRASE_ITALIC = "__italic__"; //$NON-NLS-1$
+
+ public static final String PHRASE_STRONG = "*strong*"; //$NON-NLS-1$
+
+ public static final String PHRASE_EMPHASIS = "_emphasis_"; //$NON-NLS-1$
+
+ public static final String PHRASE_MONOSPACE = "monospace"; //$NON-NLS-1$
+
+ public static final String PHRASE_UNDERLINED = "underlined"; //$NON-NLS-1$
+
+ public static final String PHRASE_QUOTE = "quote"; //$NON-NLS-1$
+
+ public static final String BLOCK_QUOTE = "bq."; //$NON-NLS-1$
+
+ public static final String BLOCK_PRE = "pre."; //$NON-NLS-1$
+
+ public static final String BLOCK_BC = "bc."; //$NON-NLS-1$
+
+ public static final String BLOCK_H6 = "h6."; //$NON-NLS-1$
+
+ public static final String BLOCK_H5 = "h5."; //$NON-NLS-1$
+
+ public static final String BLOCK_H4 = "h4."; //$NON-NLS-1$
+
+ public static final String BLOCK_H3 = "h3."; //$NON-NLS-1$
+
+ public static final String BLOCK_H2 = "h2."; //$NON-NLS-1$
+
+ public static final String BLOCK_H1 = "h1."; //$NON-NLS-1$
+
+ /**
+ * heading preferences key indexed by level (0 is null, 1 is {@link #BLOCK_H1}, etc.)
+ */
+ public static final String[] HEADING_PREFERENCES = new String[] { null, BLOCK_H1, BLOCK_H2, BLOCK_H3, BLOCK_H4,
+ BLOCK_H5, BLOCK_H6 };
+
+ private Map<String, String> cssByBlockModifierType = new LinkedHashMap<String, String>();
+ {
+ cssByBlockModifierType.put(BLOCK_H1, "font-size: 120%; font-weight: bold; color: #172f47;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_H2, "font-size: 110%; font-weight: bold; color: #172f47;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_H3, "font-size: 105%; font-weight: bold; color: #172f47;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_H4, "font-weight: bold; color: #172f47;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_H5, "font-size: 90%; font-weight: bold; color: #172f47;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_H6, "font-size: 80%; font-weight: bold; color: #172f47;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_BC, "font-family: monospace; color: #4444CC;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_PRE, "font-family: monospace;"); //$NON-NLS-1$
+ cssByBlockModifierType.put(BLOCK_QUOTE, "color: rgb(38,86,145);"); //$NON-NLS-1$
+ }
+
+ private Map<String, String> cssByPhraseModifierType = new LinkedHashMap<String, String>();
+ {
+
+ cssByPhraseModifierType.put(PHRASE_EMPHASIS, "font-style: italic;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_STRONG, "font-weight: bold;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_ITALIC, "font-style: italic;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_BOLD, "font-weight: bold;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_CITATION, "font-style: italic;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_DELETED_TEXT, "text-decoration: line-through;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_INSERTED_TEXT, "text-decoration: underline;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_SUPERSCRIPT, "font-size: smaller; vertical-align: super;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_SUBSCRIPT, "font-size: smaller; vertical-align: sub;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_SPAN, ""); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_CODE, "font-family: monospace; color: #4444CC;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_MONOSPACE, "font-family: monospace;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_UNDERLINED, "text-decoration: underline;"); //$NON-NLS-1$
+ cssByPhraseModifierType.put(PHRASE_QUOTE, "color: rgb(38,86,145);"); //$NON-NLS-1$
+ }
+
+ private boolean editorFolding = true;
+
+ private String markupViewerCss;
+
+ private Stylesheet stylesheet;
+
+ private boolean mutable = true;
+
+ public Map<String, String> getCssByBlockModifierType() {
+ return cssByBlockModifierType;
+ }
+
+ public Map<String, String> getCssByPhraseModifierType() {
+ return cssByPhraseModifierType;
+ }
+
+ /**
+ * indicate if editor folding is enabled
+ */
+ public boolean isEditorFolding() {
+ return editorFolding;
+ }
+
+ /**
+ * indicate if editor folding is enabled
+ */
+ public void setEditorFolding(boolean editorFolding) {
+ if (!mutable) {
+ throw new UnsupportedOperationException();
+ }
+ this.editorFolding = editorFolding;
+ }
+
+ /**
+ * get the CSS content used to render the markup viewer
+ */
+ public String getMarkupViewerCss() {
+ if (markupViewerCss == null) {
+ markupViewerCss = getDefaultMarkupViewerCss();
+ }
+ return markupViewerCss;
+ }
+
+ /**
+ * set the CSS content used to render the markup viewer
+ */
+ public void setMarkupViewerCss(String markupViewerCss) {
+ if (!mutable) {
+ throw new UnsupportedOperationException();
+ }
+ this.markupViewerCss = markupViewerCss;
+ stylesheet = null;
+ }
+
+ public Stylesheet getStylesheet() {
+ if (stylesheet == null) {
+ stylesheet = new CssParser().parse(getMarkupViewerCss());
+ }
+ return stylesheet;
+ }
+
+ /**
+ * indicate if this preferences is mutable
+ *
+ * @see #makeImmutable()
+ */
+ public boolean isMutable() {
+ return mutable;
+ }
+
+ /**
+ * @see #isMutable()
+ */
+ public void makeImmutable() {
+ if (mutable) {
+ mutable = false;
+ cssByBlockModifierType = Collections.unmodifiableMap(cssByBlockModifierType);
+ cssByPhraseModifierType = Collections.unmodifiableMap(cssByPhraseModifierType);
+ }
+ }
+
+ /**
+ * Save the settings to the given store
+ *
+ * @param store
+ * the store to which the settings should be saved
+ * @param asDefault
+ * if true, then the settings are saved as defaults.
+ */
+ public void save(IPreferenceStore store, boolean asDefault) {
+ for (Map.Entry<String, String> ent : cssByBlockModifierType.entrySet()) {
+ String propKey = toPreferenceKey(ent.getKey(), true);
+ if (asDefault) {
+ store.setDefault(propKey, ent.getValue());
+ } else {
+ store.setValue(propKey, ent.getValue());
+ }
+ }
+ for (Map.Entry<String, String> ent : cssByPhraseModifierType.entrySet()) {
+ String propKey = toPreferenceKey(ent.getKey(), false);
+ if (asDefault) {
+ store.setDefault(propKey, ent.getValue());
+ } else {
+ store.setValue(propKey, ent.getValue());
+ }
+ }
+ if (asDefault) {
+ store.setDefault(KEY_EDITOR_FOLDING, editorFolding);
+ store.setDefault(KEY_MARKUP_VIEWER_CSS, getDefaultMarkupViewerCss());
+ } else {
+ store.setValue(KEY_EDITOR_FOLDING, editorFolding);
+ store.setValue(KEY_MARKUP_VIEWER_CSS, markupViewerCss);
+ }
+ }
+
+ public static String toPreferenceKey(String key, boolean block) {
+ String propKey = (block ? "block-" : "phrase-") + BAD_CHAR_PATTERN.matcher(key).replaceAll(""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ return propKey;
+ }
+
+ public void load(IPreferenceStore store) {
+ if (!mutable) {
+ throw new UnsupportedOperationException();
+ }
+ for (Map.Entry<String, String> ent : cssByBlockModifierType.entrySet()) {
+ String propKey = toPreferenceKey(ent.getKey(), true);
+
+ String value = store.getString(propKey);
+ if (value != null) {
+ ent.setValue(value);
+ }
+ }
+ for (Map.Entry<String, String> ent : cssByPhraseModifierType.entrySet()) {
+ String propKey = toPreferenceKey(ent.getKey(), false);
+ String value = store.getString(propKey);
+ if (value != null) {
+ ent.setValue(value);
+ }
+ }
+ editorFolding = store.getBoolean(KEY_EDITOR_FOLDING);
+ markupViewerCss = store.getString(KEY_MARKUP_VIEWER_CSS);
+ if (isEmpty(markupViewerCss)) {
+ markupViewerCss = getDefaultMarkupViewerCss();
+ }
+ stylesheet = null;
+ }
+
+ private String getDefaultMarkupViewerCss() {
+ try {
+ return readFully(HtmlTextPresentationParser.getDefaultStylesheetContent());
+ } catch (IOException e) {
+ WikiTextUiPlugin.getDefault().log(e);
+ return ""; //$NON-NLS-1$
+ }
+ }
+
+ private String readFully(Reader reader) throws IOException {
+ try {
+ StringWriter writer = new StringWriter();
+ int c;
+ while ((c = reader.read()) != -1) {
+ writer.write(c);
+ }
+ return writer.toString();
+ } finally {
+ reader.close();
+ }
+ }
+
+ private boolean isEmpty(String text) {
+ if (text == null || text.length() == 0) {
+ return true;
+ }
+ final int length = text.length();
+ for (int x = 0; x < length; ++x) {
+ char c = text.charAt(x);
+ if (!Character.isWhitespace(c)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * clone the preferences, returning a mutable copy.
+ */
+ @Override
+ public Preferences clone() {
+ try {
+ Preferences copy = (Preferences) super.clone();
+ copy.mutable = true;
+ return copy;
+ } catch (CloneNotSupportedException e) {
+ throw new IllegalStateException();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/messages.properties
new file mode 100644
index 0000000..ffe0f01
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/messages.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+CssStyleFieldEditor_1=,
+CssStyleFieldEditor_invalidColor=Invalid color ''{0}''
+CssStyleFieldEditor_unexpectedToken=Unexpected token ''{0}'' at offset {1}
+CssStyleFieldEditor_unsupportedRule=Unsupported CSS rule ''{0}''. Supported rules are {1}
+EditorPreferencePage_blockModifiers=Block Modifiers
+EditorPreferencePage_introInfo=WikiText editor preferences for syntax highlighting. CSS is used to control font size, color and style.
+EditorPreferencePage_phraseModifiers=Phrase Modifiers
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MarkupMonoReconciler.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MarkupMonoReconciler.java
new file mode 100644
index 0000000..f94b2e6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MarkupMonoReconciler.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler;
+
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.MonoReconciler;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MarkupMonoReconciler extends MonoReconciler {
+
+ public MarkupMonoReconciler(IReconcilingStrategy strategy, boolean isIncremental) {
+ super(strategy, isIncremental);
+ }
+
+ /**
+ * Call this method to cause the reconciler to reconcile.
+ */
+ @Override
+ public void forceReconciling() {
+ super.forceReconciling();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MarkupValidationReconcilingStrategy.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MarkupValidationReconcilingStrategy.java
new file mode 100644
index 0000000..4ea1ef5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MarkupValidationReconcilingStrategy.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.validation.AnnotationMarkupValidator;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.validation.DocumentRegionValidator;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.validation.ResourceMarkerMarkupValidator;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MarkupValidationReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
+
+ private IDocument document;
+
+ private IProgressMonitor monitor;
+
+ private final ISourceViewer viewer;
+
+ private DocumentRegionValidator validator;
+
+ private IResource resource;
+
+ private MarkupLanguage markupLanguage;
+
+ public MarkupValidationReconcilingStrategy(ISourceViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public IResource getResource() {
+ return resource;
+ }
+
+ public void setResource(IResource resource) {
+ this.resource = resource;
+ }
+
+ public void reconcile(IRegion partition) {
+ if (document == null) {
+ return;
+ }
+ if (validator == null) {
+ validator = resource == null ? new AnnotationMarkupValidator() : new ResourceMarkerMarkupValidator();
+ }
+ validator.setMarkupLanguage(markupLanguage);
+ validator.setAnnotationModel(getAnnotationModel());
+ validator.setResource(resource);
+ try {
+ validator.validate(monitor == null ? new NullProgressMonitor() : monitor, document, partition);
+ } catch (CoreException e) {
+ WikiTextUiPlugin.getDefault().log(e);
+ }
+ }
+
+ private IAnnotationModel getAnnotationModel() {
+ return viewer.getAnnotationModel();
+ }
+
+ public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+ reconcile(subRegion);
+ }
+
+ public void setDocument(IDocument document) {
+ this.document = document;
+ }
+
+ public void initialReconcile() {
+ if (document == null) {
+ return;
+ }
+ reconcile(new Region(0, document.getLength()));
+ }
+
+ public void setProgressMonitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MultiReconcilingStrategy.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MultiReconcilingStrategy.java
new file mode 100644
index 0000000..8a23255
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/reconciler/MultiReconcilingStrategy.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MultiReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
+
+ private final List<IReconcilingStrategy> strategies = new CopyOnWriteArrayList<IReconcilingStrategy>();
+
+ public void add(IReconcilingStrategy strategy) {
+ if (strategy == null) {
+ throw new IllegalArgumentException();
+ }
+ strategies.add(strategy);
+ }
+
+ public void remove(IReconcilingStrategy strategy) {
+ if (strategy == null) {
+ throw new IllegalArgumentException();
+ }
+ strategies.remove(strategy);
+ }
+
+ public boolean contains(IReconcilingStrategy reconcilingStrategy) {
+ return strategies.contains(reconcilingStrategy);
+ }
+
+ public void initialReconcile() {
+ for (IReconcilingStrategy strategy : strategies) {
+ if (strategy instanceof IReconcilingStrategyExtension) {
+ ((IReconcilingStrategyExtension) strategy).initialReconcile();
+ }
+ }
+ }
+
+ public void setProgressMonitor(IProgressMonitor monitor) {
+ for (IReconcilingStrategy strategy : strategies) {
+ if (strategy instanceof IReconcilingStrategyExtension) {
+ ((IReconcilingStrategyExtension) strategy).setProgressMonitor(monitor);
+ }
+ }
+ }
+
+ public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+ for (IReconcilingStrategy strategy : strategies) {
+ strategy.reconcile(dirtyRegion, subRegion);
+ }
+ }
+
+ public void reconcile(IRegion partition) {
+ for (IReconcilingStrategy strategy : strategies) {
+ strategy.reconcile(partition);
+ }
+ }
+
+ public void setDocument(IDocument document) {
+ for (IReconcilingStrategy strategy : strategies) {
+ strategy.setDocument(document);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Block.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Block.java
new file mode 100644
index 0000000..c8dd4f8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Block.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Block extends Segment<Segment<?>> {
+
+ private final BlockType type;
+
+ private final int headingLevel;
+
+ private boolean spansComputed = false;
+
+ public Block(BlockType type, int offset, int length) {
+ super(offset, length);
+ this.type = type;
+ headingLevel = 0;
+ }
+
+ public Block(int headingLevel, int offset, int length) {
+ super(offset, length);
+ if (headingLevel <= 0) {
+ throw new IllegalArgumentException();
+ }
+ this.headingLevel = headingLevel;
+ type = null;
+ }
+
+ public Block(BlockType type, Attributes attributes, int offset, int length) {
+ super(attributes, offset, length);
+ this.type = type;
+ headingLevel = 0;
+ }
+
+ public Block(int headingLevel, Attributes attributes, int offset, int length) {
+ super(attributes, offset, length);
+ this.headingLevel = headingLevel;
+ type = null;
+ }
+
+ @Override
+ public Block getParent() {
+ return (Block) super.getParent();
+ }
+
+ /**
+ * the type of block
+ *
+ * @return the block type, or null if this block is a heading
+ */
+ public BlockType getType() {
+ return type;
+ }
+
+ /**
+ * the heading level, or 0 if this is not a heading.
+ */
+ public int getHeadingLevel() {
+ return headingLevel;
+ }
+
+ public boolean isSpansComputed() {
+ return spansComputed;
+ }
+
+ public void setSpansComputed(boolean spansComputed) {
+ this.spansComputed = spansComputed;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder();
+ buf.append("<"); //$NON-NLS-1$
+ String elementName;
+ if (type != null) {
+ elementName = type.name();
+ } else {
+ elementName = "h" + headingLevel; //$NON-NLS-1$
+ }
+ buf.append(elementName);
+ buf.append(" offset=\""); //$NON-NLS-1$
+ buf.append(getOffset());
+ buf.append("\" length=\""); //$NON-NLS-1$
+ buf.append(getLength());
+ buf.append('"');
+ if (getChildren() == null || getChildren().isEmpty()) {
+ buf.append("/>\n"); //$NON-NLS-1$
+ } else {
+ buf.append(">\n"); //$NON-NLS-1$
+ StringBuilder buf2 = new StringBuilder();
+ buf2.append("\t"); //$NON-NLS-1$
+ for (Segment<?> child : getChildren().asList()) {
+ buf2.append(child);
+ }
+ String children = buf2.toString();
+ children = children.replace("\n", "\n\t"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (children.endsWith("\t")) { //$NON-NLS-1$
+ children = children.substring(0, children.length() - 1);
+ } else {
+ children = children + "\n"; //$NON-NLS-1$
+ }
+ buf.append(children);
+ buf.append("</"); //$NON-NLS-1$
+ buf.append(elementName);
+ buf.append(">\n"); //$NON-NLS-1$
+ }
+ return buf.toString();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/FastMarkupPartitioner.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/FastMarkupPartitioner.java
new file mode 100644
index 0000000..6c4b659
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/FastMarkupPartitioner.java
@@ -0,0 +1,548 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.rules.FastPartitioner;
+import org.eclipse.jface.text.rules.IPartitionTokenScanner;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.parser.Locator;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.osgi.util.NLS;
+
+
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class FastMarkupPartitioner extends FastPartitioner {
+
+ public static final String CONTENT_TYPE_MARKUP = "__markup_block"; //$NON-NLS-1$
+
+ public static final String[] ALL_CONTENT_TYPES = new String[] { CONTENT_TYPE_MARKUP };
+
+ static boolean debug = Boolean.getBoolean(FastMarkupPartitioner.class.getName() + ".debug"); //$NON-NLS-1$
+
+ private MarkupLanguage markupLanguage;
+
+ public FastMarkupPartitioner() {
+ super(new PartitionTokenScanner(), ALL_CONTENT_TYPES);
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ getScanner().setMarkupLanguage(markupLanguage);
+ resetPartitions();
+ }
+
+ PartitionTokenScanner getScanner() {
+ return (PartitionTokenScanner) fScanner;
+ }
+
+ public void resetPartitions() {
+ if (fDocument != null) {
+ super.flushRewriteSession();
+ initialize();
+ } else {
+ clearPositionCache();
+ }
+ }
+
+ static class PartitionTokenScanner implements IPartitionTokenScanner {
+ private final Map<Integer, PartitioningResult> cachedPartitioning = new HashMap<Integer, PartitioningResult>();
+
+ private MarkupLanguage markupLanguage;
+
+ private int index = -1;
+
+ private PartitioningResult lastComputed;
+
+ private static class PartitioningResult {
+ int offset;
+
+ int length;
+
+ ITypedRegion[] partitions;
+
+ public PartitioningResult(int offset, int length, ITypedRegion[] partitions) {
+ super();
+ this.offset = offset;
+ this.length = length;
+ this.partitions = partitions;
+ }
+
+ public boolean overlapsWith(PartitioningResult other) {
+ int end = other.offset + other.length;
+ int thisEnd = this.offset + this.length;
+
+ if (end > thisEnd) {
+ return other.offset < thisEnd;
+ } else if (thisEnd > end) {
+ return offset < end;
+ } else {
+ return true;
+ }
+ }
+ }
+
+ public ITypedRegion[] computePartitions(IDocument document, int offset, int length) {
+ if (lastComputed != null && lastComputed.offset <= offset
+ && (lastComputed.offset + lastComputed.length) >= (offset + length)) {
+ return lastComputed.partitions;
+ } else {
+ PartitioningResult result = cachedPartitioning.get(offset);
+ if (result == null || result.length != length) {
+ result = computeOlp(document, offset, length, -1);
+ updateCache(result, document.getLength());
+ }
+ return result.partitions;
+ }
+ }
+
+ public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) {
+ lastComputed = computeOlp(document, offset, length, partitionOffset);
+ index = -1;
+ updateCache(lastComputed, document.getLength());
+ }
+
+ private void updateCache(PartitioningResult updated, int maxLength) {
+ Iterator<PartitioningResult> it = cachedPartitioning.values().iterator();
+ while (it.hasNext()) {
+ PartitioningResult result = it.next();
+
+ if (result.offset >= maxLength || (updated != null && result.overlapsWith(updated))) {
+ it.remove();
+ }
+ }
+ if (updated != null) {
+ cachedPartitioning.put(updated.offset, updated);
+ }
+ }
+
+ private PartitioningResult computeOlp(IDocument document, int offset, int length, int partitionOffset) {
+ if (markupLanguage == null) {
+ return new PartitioningResult(offset, length, null);
+ }
+ int startOffset = partitionOffset == -1 ? offset : Math.min(offset, partitionOffset);
+ int endOffset = offset + length;
+
+ MarkupParser markupParser = new MarkupParser(markupLanguage);
+ markupLanguage.setBlocksOnly(partitionOffset != -1);
+ markupLanguage.setFilterGenerativeContents(true);
+ PartitionBuilder partitionBuilder = new PartitionBuilder(startOffset, markupLanguage.isBlocksOnly());
+ markupParser.setBuilder(partitionBuilder);
+
+ String markupContent;
+ try {
+ markupContent = document.get(startOffset, endOffset - startOffset);
+ } catch (BadLocationException e) {
+ markupContent = document.get();
+ }
+ markupParser.parse(markupContent);
+
+ ITypedRegion[] latestPartitions = partitionBuilder.partitions.toArray(new ITypedRegion[partitionBuilder.partitions.size()]);
+ List<ITypedRegion> partitioning = new ArrayList<ITypedRegion>(latestPartitions.length);
+
+ ITypedRegion previous = null;
+ for (ITypedRegion region : latestPartitions) {
+ if (region.getLength() == 0) {
+ // ignore 0-length partitions
+ continue;
+ }
+ if (previous != null && region.getOffset() < (previous.getOffset() + previous.getLength())) {
+ String message = NLS.bind(Messages.FastMarkupPartitioner_0, new Object[] { region,
+ previous, markupLanguage.getName() });
+ if (FastMarkupPartitioner.debug) {
+ String markupSavePath = saveToTempFile(markupLanguage, markupContent);
+ message = NLS.bind(Messages.FastMarkupPartitioner_1, new Object[] { message,
+ markupSavePath });
+ }
+ throw new IllegalStateException(message);
+ }
+ previous = region;
+ if (region.getOffset() >= startOffset && region.getOffset() < endOffset) {
+ partitioning.add(region);
+ } else if (region.getOffset() >= (offset + length)) {
+ break;
+ }
+ }
+ return new PartitioningResult(offset, length, partitioning.toArray(new ITypedRegion[partitioning.size()]));
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ public int getTokenLength() {
+ return lastComputed.partitions[index].getLength();
+ }
+
+ public int getTokenOffset() {
+ return lastComputed.partitions[index].getOffset();
+ }
+
+ public IToken nextToken() {
+ if (lastComputed == null || lastComputed.partitions == null || ++index >= lastComputed.partitions.length) {
+ return Token.EOF;
+ }
+ return new Token(lastComputed.partitions[index].getType());
+ }
+
+ public void setRange(IDocument document, int offset, int length) {
+ setPartialRange(document, offset, length, null, -1);
+ }
+ }
+
+ public static class MarkupPartition implements ITypedRegion {
+
+ private final Block block;
+
+ private int offset;
+
+ private int length;
+
+ private List<Span> spans;
+
+ private MarkupPartition(Block block, int offset, int length) {
+ this.block = block;
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public String getType() {
+ return CONTENT_TYPE_MARKUP;
+ }
+
+ public Block getBlock() {
+ return block;
+ }
+
+ public List<Span> getSpans() {
+ if (spans == null) {
+
+ List<Span> spans = new ArrayList<Span>();
+ getSpans(block, spans);
+ this.spans = spans;
+ }
+ return spans;
+ }
+
+ private void getSpans(Block block, List<Span> spans) {
+ for (Segment<?> s : block.getChildren().asList()) {
+ if (s.getOffset() >= offset && s.getOffset() < (offset + length)) {
+ if (s instanceof Span) {
+ spans.add((Span) s);
+ } else {
+ getSpans((Block) s, spans);
+ }
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return String.format("MarkupPartition(type=%s,offset=%s,length=%s,end=%s)", block.getType(), offset, //$NON-NLS-1$
+ length, offset + length);
+ }
+ }
+
+ private static class PartitionBuilder extends DocumentBuilder {
+
+ private final Block outerBlock = new Block(null, 0, Integer.MAX_VALUE / 2);
+
+ private Block currentBlock = outerBlock;
+
+ private Span currentSpan = null;
+
+ private final int offset;
+
+ private List<MarkupPartition> partitions;
+
+ private final boolean blocksOnly;
+
+ public PartitionBuilder(int offset, boolean blocksOnly) {
+ this.offset = offset;
+ this.blocksOnly = blocksOnly;
+ }
+
+ @Override
+ public void acronym(String text, String definition) {
+ }
+
+ @Override
+ public void beginBlock(BlockType type, Attributes attributes) {
+ final int newBlockOffset = getLocator().getDocumentOffset() + offset;
+ Block newBlock = new Block(type, attributes, newBlockOffset, currentBlock.getLength()
+ - (newBlockOffset - currentBlock.getOffset()));
+ newBlock.setSpansComputed(!blocksOnly);
+ currentBlock.add(newBlock);
+ currentBlock = newBlock;
+ }
+
+ @Override
+ public void beginDocument() {
+ }
+
+ @Override
+ public void beginHeading(int level, Attributes attributes) {
+ final int newBlockOffset = getLocator().getDocumentOffset() + offset;
+ Block newBlock = new Block(level, attributes, newBlockOffset, currentBlock.getLength()
+ - (newBlockOffset - currentBlock.getOffset()));
+ newBlock.setSpansComputed(!blocksOnly);
+ currentBlock.add(newBlock);
+ currentBlock = newBlock;
+ }
+
+ @Override
+ public void beginSpan(SpanType type, Attributes attributes) {
+ Span span = new Span(type, attributes, getLocator().getDocumentOffset() + offset,
+ getLocator().getLineSegmentEndOffset() - getLocator().getLineCharacterOffset());
+ if (currentSpan != null) {
+ currentSpan.add(span);
+ currentSpan = span;
+ } else {
+ currentSpan = span;
+ currentBlock.add(span);
+ }
+ }
+
+ @Override
+ public void characters(String text) {
+ }
+
+ @Override
+ public void charactersUnescaped(String literal) {
+ }
+
+ @Override
+ public void endBlock() {
+ currentBlock = currentBlock.getParent();
+ if (currentBlock == null) {
+ throw new IllegalStateException();
+ }
+ }
+
+ @Override
+ public void endDocument() {
+ if (currentBlock != outerBlock) {
+ throw new IllegalStateException();
+ }
+ Locator locator = getLocator();
+ outerBlock.setLength((locator == null ? 0 : locator.getDocumentOffset()) + offset);
+
+ partitions = new ArrayList<MarkupPartition>();
+
+ // here we flatten our hierarchy of blocks into partitions
+ for (Segment<?> child : outerBlock.getChildren().asList()) {
+ createRegions(null, child);
+ }
+ }
+
+ public MarkupPartition createRegions(MarkupPartition parent, Segment<?> segment) {
+ if (segment.getLength() == 0) {
+ return parent;
+ }
+ if (segment instanceof Block) {
+ Block block = (Block) segment;
+
+ if (!filtered(block)) {
+ MarkupPartition partition = new MarkupPartition(block, segment.getOffset(), segment.getLength());
+ if (parent == null) {
+ partitions.add(partition);
+ } else {
+ // parent needs adjusting to prevent overlap
+ int parentIndex = partitions.indexOf(parent);
+
+ // start on the same offset
+ if (partition.offset == parent.offset) {
+ if (partition.length == parent.length) {
+ // same length, so remove parent all together
+ partitions.remove(parentIndex);
+ partitions.add(parentIndex, partition);
+ } else {
+ // start on same offset, but new partition is smaller
+ // so move parent after new partition and shrink it by the corresponding amount
+ parent.offset = partition.offset + partition.length;
+ parent.length -= partition.length;
+ partitions.add(parentIndex, partition);
+ }
+ } else {
+ if (partition.length + partition.offset == parent.length + parent.offset) {
+ // end on the same offset, so shrink the parent
+ parent.length = partition.offset - parent.offset;
+ partitions.add(parentIndex + 1, partition);
+ } else {
+ // split the parent
+ int parentLength = parent.length;
+ parent.length = partition.offset - parent.offset;
+ final int splitOffset = partition.offset + partition.length;
+ MarkupPartition trailer = new MarkupPartition(parent.block, splitOffset, parent.offset
+ + parentLength - splitOffset);
+ partitions.add(parentIndex + 1, partition);
+ partitions.add(parentIndex + 2, trailer);
+ parent = trailer;
+ }
+ }
+ }
+ if (!block.getChildren().isEmpty()) {
+ for (Segment<?> child : block.getChildren().asList()) {
+ partition = createRegions(partition, child);
+ }
+ }
+ }
+ }
+ return parent;
+ }
+
+ private boolean filtered(Block block) {
+ if (block.getType() == null) {
+ return false;
+ }
+ switch (block.getType()) {
+ case DEFINITION_ITEM:
+ case DEFINITION_TERM:
+ case LIST_ITEM:
+ case TABLE_CELL_HEADER:
+ case TABLE_CELL_NORMAL:
+ case TABLE_ROW:
+ return true;
+ case PARAGRAPH:
+ // bug 249615: ignore paras that are nested inside a quote block
+ if (block.getParent() != null && block.getParent().getType() == BlockType.QUOTE) {
+ return true;
+ }
+ break;
+ case BULLETED_LIST:
+ case NUMERIC_LIST:
+ case DEFINITION_LIST:
+ return block.getParent() != null && filtered(block.getParent());
+ }
+ return false;
+ }
+
+ @Override
+ public void endHeading() {
+ currentBlock = currentBlock.getParent();
+ if (currentBlock == null) {
+ throw new IllegalStateException();
+ }
+ }
+
+ @Override
+ public void endSpan() {
+ if (currentSpan == null) {
+ throw new IllegalStateException();
+ }
+ if (currentSpan.getParent() instanceof Span) {
+ currentSpan = (Span) currentSpan.getParent();
+ } else {
+ currentSpan = null;
+ }
+ }
+
+ @Override
+ public void entityReference(String entity) {
+ }
+
+ @Override
+ public void image(Attributes attributes, String url) {
+ }
+
+ @Override
+ public void imageLink(Attributes linkAttributes, Attributes attributes, String href, String imageUrl) {
+ }
+
+ @Override
+ public void lineBreak() {
+ }
+
+ @Override
+ public void link(Attributes attributes, String hrefOrHashName, String text) {
+ }
+
+ }
+
+ public void reparse(IDocument document, Block block) {
+ MarkupParser markupParser = new MarkupParser(markupLanguage);
+ markupLanguage.setBlocksOnly(false);
+ markupLanguage.setFilterGenerativeContents(true);
+ PartitionBuilder partitionBuilder = new PartitionBuilder(block.getOffset(), false);
+ markupParser.setBuilder(partitionBuilder);
+
+ try {
+ markupParser.parse(document.get(block.getOffset(), block.getLength()));
+ for (Segment<?> s : partitionBuilder.outerBlock.getChildren().asList()) {
+ if (s.getOffset() == block.getOffset()) {
+ if (s instanceof Block) {
+ block.replaceChildren(s);
+ block.setSpansComputed(true);
+ break;
+ }
+ }
+ }
+ } catch (BadLocationException e) {
+ throw new IllegalStateException(e);
+ }
+
+ }
+
+ /**
+ * save markup content to a temporary file to facilitate analysis of the problem
+ *
+ * @return the absolute path to the saved file, or null if the file was not saved
+ */
+ private static String saveToTempFile(MarkupLanguage markupLanguage, String markupContent) {
+ String markupSavePath = null;
+ try {
+ File file = File.createTempFile("markup-content-", "." //$NON-NLS-1$ //$NON-NLS-2$
+ + markupLanguage.getName().toLowerCase().replaceAll("[^a-z]", "")); //$NON-NLS-1$ //$NON-NLS-2$
+ Writer writer = new FileWriter(file);
+ try {
+ writer.write(markupContent);
+ } finally {
+ writer.close();
+ }
+ markupSavePath = file.getAbsolutePath();
+ } catch (IOException e) {
+ }
+ return markupSavePath;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupDamagerRepairer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupDamagerRepairer.java
new file mode 100644
index 0000000..aeb6f4c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupDamagerRepairer.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.ITokenScanner;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MarkupDamagerRepairer extends DefaultDamagerRepairer {
+
+ public MarkupDamagerRepairer(ITokenScanner scanner) {
+ super(scanner);
+ }
+
+ @Override
+ public IRegion getDamageRegion(ITypedRegion partition, DocumentEvent e, boolean documentPartitioningChanged) {
+ return partition;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupDocumentProvider.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupDocumentProvider.java
new file mode 100644
index 0000000..54ff529
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupDocumentProvider.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.io.InputStream;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.editors.text.FileDocumentProvider;
+import org.eclipse.ui.editors.text.TextFileDocumentProvider;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class MarkupDocumentProvider extends TextFileDocumentProvider {
+
+ private MarkupLanguage markupLanguage;
+
+ public MarkupDocumentProvider() {
+ super(new MarkupFileDocumentProvider());
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ @Override
+ public void connect(Object element) throws CoreException {
+ super.connect(element);
+ IDocument document = super.getDocument(element);
+ connectPartitioner(document);
+ }
+
+ private void connectPartitioner(IDocument document) {
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(markupLanguage == null ? null : markupLanguage.clone());
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ }
+
+ @Override
+ protected FileInfo createFileInfo(Object element) throws CoreException {
+ if (dispatchToParent(element)) {
+ // bug 247778: dispatch to MarkupFileDocumentProvider by returning null
+
+ // unfortunately this means that we can't fixup EOL markers for better
+ // cross-platform markup for opened files that aren't in the workspace
+ return null;
+ }
+ return super.createFileInfo(element);
+ }
+
+ private boolean dispatchToParent(Object element) {
+ return element instanceof IStorageEditorInput || element instanceof IFileEditorInput;
+ }
+
+ @Override
+ protected DocumentProviderOperation createSaveOperation(final Object element, final IDocument document,
+ final boolean overwrite) throws CoreException {
+ if (dispatchToParent(element)) {
+ // bug 247778: dispatch to MarkupFileDocumentProvider
+ return new DocumentProviderOperation() {
+ @Override
+ protected void execute(IProgressMonitor monitor) throws CoreException {
+ getParentProvider().saveDocument(monitor, element, document, overwrite);
+ }
+ };
+ } else {
+ return super.createSaveOperation(element, document, overwrite);
+ }
+ }
+
+ private static class MarkupFileDocumentProvider extends FileDocumentProvider {
+
+ @Override
+ protected void setDocumentContent(IDocument document, InputStream contentStream, String encoding)
+ throws CoreException {
+ super.setDocumentContent(document, contentStream, encoding);
+ cleanUpEolMarkers(document);
+ }
+
+ /**
+ * override the default implementation to handle EOL issues on Mac, see bug 247777
+ */
+ @Override
+ protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite)
+ throws CoreException {
+ String platformEolMarker = Text.DELIMITER;
+ if (platformEolMarker.equals("\r")) { //$NON-NLS-1$
+ // bug 247777: store document with *nix line delimiter
+ // note that we don't modify the provided document here, we substitute another
+ // document instead.
+ Document newDocument = new Document(document.get());
+ replaceLineDelimiters(newDocument, "\n"); //$NON-NLS-1$
+ document = newDocument;
+ }
+ super.doSaveDocument(monitor, element, document, overwrite);
+ }
+ }
+
+ /**
+ * clean up EOL markers, since mixing markers can cause problems. For example, if the file has \n EOL markers, and
+ * the current platform uses \r (eg on a mac) then the user adding a new line immediately before \n can result in
+ * \r\n, which visually for the user appears to be two lines, but when the markup is parsed is treated as one line.
+ * This can be confusing for the user as line markers affect how the markup is interpreted. Generally we want the
+ * edited markup to render the same on all platforms, regardless of the platform-standard EOL marker.
+ */
+ public static void cleanUpEolMarkers(IDocument document) {
+ String platformEolMarker = Text.DELIMITER;
+ replaceLineDelimiters(document, platformEolMarker);
+ }
+
+ private static void replaceLineDelimiters(IDocument document, String newLineDelimiter) {
+ document.set(Pattern.compile("(\r\n|\n|\r)").matcher(document.get()).replaceAll(newLineDelimiter)); //$NON-NLS-1$
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java
new file mode 100644
index 0000000..ea54ba5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.ITokenScanner;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.preferences.Preferences;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.FastMarkupPartitioner.MarkupPartition;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.CssStyleManager;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.FontState;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Font;
+
+
+
+/**
+ * A token scanner that uses the results of the {@link FastMarkupPartitioner} to identify tokens.
+ *
+ * @author David Green
+ */
+public class MarkupTokenScanner implements ITokenScanner {
+
+ private Token currentToken = null;
+
+ private Iterator<Token> tokenIt = null;
+
+ private final CssStyleManager styleManager;
+
+ private final FontState defaultState;
+
+ private Preferences preferences;
+
+ private final CssParser cssParser = new CssParser();
+
+ public MarkupTokenScanner(Font defaultFont, Font defaultMonospaceFont) {
+ styleManager = new CssStyleManager(defaultFont, defaultMonospaceFont);
+ defaultState = styleManager.createDefaultFontState();
+ reloadPreferences();
+ }
+
+ public void reloadPreferences() {
+ preferences = WikiTextUiPlugin.getDefault().getPreferences();
+ }
+
+ public int getTokenLength() {
+ return currentToken == null ? -1 : currentToken.getLength();
+ }
+
+ public int getTokenOffset() {
+ return currentToken == null ? -1 : currentToken.getOffset();
+ }
+
+ public IToken nextToken() {
+ if (tokenIt != null && tokenIt.hasNext()) {
+ currentToken = tokenIt.next();
+ } else {
+ currentToken = null;
+ tokenIt = null;
+ return org.eclipse.jface.text.rules.Token.EOF;
+ }
+ return currentToken;
+ }
+
+ public void setRange(IDocument document, int offset, int length) {
+ IDocumentPartitioner partitioner = document.getDocumentPartitioner();
+ List<Token> tokens = null;
+
+ if (partitioner instanceof FastMarkupPartitioner) {
+ FastMarkupPartitioner fastMarkupPartitioner = (FastMarkupPartitioner) partitioner;
+ ITypedRegion[] partitioning = partitioner.computePartitioning(offset, length);
+ if (partitioning != null) {
+ tokens = new ArrayList<Token>();
+
+ ITypedRegion[] partitions = ((FastMarkupPartitioner) partitioner).getScanner().computePartitions(
+ document, offset, length);
+ int lastEnd = offset;
+
+ Token defaultToken;
+ {
+ StyleRange styleRange = styleManager.createStyleRange(defaultState, 0, 1);
+ TextAttribute textAttribute = new TextAttribute(styleRange.foreground, styleRange.background,
+ styleRange.fontStyle, styleRange.font);
+ defaultToken = new Token(defaultState, textAttribute, offset, length);
+ }
+ if (partitions != null) {
+ for (ITypedRegion region : partitions) {
+ if (region.getOffset() >= (offset + length)) {
+ break;
+ }
+ if ((region.getOffset() + region.getLength()) < offset) {
+ continue;
+ }
+ if (region instanceof MarkupPartition) {
+ MarkupPartition partition = (MarkupPartition) region;
+
+ if (lastEnd < partition.getOffset()) {
+ Token blockBridgeToken = new Token(defaultToken.fontState, defaultToken.getData(),
+ lastEnd, partition.getOffset() - lastEnd);
+ addToken(tokens, blockBridgeToken);
+ }
+
+ // a token that spans the whole block
+ Token blockToken = createToken(partition);
+ if (blockToken == null) {
+ blockToken = defaultToken;
+ }
+ if (!partition.getBlock().isSpansComputed()) {
+ fastMarkupPartitioner.reparse(document, partition.getBlock());
+ }
+ List<Span> spans = partition.getSpans();
+ if (spans != null) {
+ for (Span span : spans) {
+ if (span.getOffset() < lastEnd) {
+ continue;
+ }
+ Token spanToken = createToken(blockToken.getFontState(), span);
+ if (spanToken != null) {
+ int blockTokenStartOffset = lastEnd < offset ? offset : lastEnd;
+ if (blockTokenStartOffset < spanToken.getOffset()) {
+ int blockTokenLength = spanToken.getOffset() - blockTokenStartOffset;
+ final Token blockBridgeToken = new Token(blockToken.fontState,
+ blockToken.getData(), blockTokenStartOffset, blockTokenLength);
+ addToken(tokens, blockBridgeToken);
+ }
+
+ Token[] spanTokens = null;
+ if (!span.getChildren().isEmpty()) {
+ spanTokens = splitSpan(spanToken, span);
+ }
+ if (spanTokens != null) {
+ for (Token spanSplitToken : spanTokens) {
+ addToken(tokens, spanSplitToken);
+ }
+ } else {
+ addToken(tokens, spanToken);
+ }
+ lastEnd = spanToken.offset + spanToken.length;
+ if (lastEnd > partition.getOffset() + partition.getLength()) {
+ throw new IllegalStateException();
+ }
+ }
+ }
+ }
+ final int partitionEnd = partition.getOffset() + partition.getLength();
+ if (lastEnd < partitionEnd) {
+ final int realLastEnd = Math.max(lastEnd, partition.getOffset());
+ int diff = (partitionEnd) - realLastEnd;
+ if (diff > 0) {
+ int blockTokenStartOffset = realLastEnd;
+ int blockTokenLength = diff;
+ final Token blockBridgeToken = new Token(blockToken.fontState,
+ blockToken.getData(), blockTokenStartOffset, blockTokenLength);
+ addToken(tokens, blockBridgeToken);
+ lastEnd = blockTokenStartOffset + blockTokenLength;
+ if (lastEnd > partition.getOffset() + partition.getLength()) {
+ throw new IllegalStateException();
+ }
+ }
+ }
+ }
+ }
+ }
+ if (lastEnd < (offset + length)) {
+ addToken(tokens, new Token(defaultToken.fontState, defaultToken.getData(), lastEnd, length
+ - (lastEnd - offset)));
+ }
+ }
+ }
+
+ currentToken = null;
+ if (tokens == null || tokens.isEmpty()) {
+ tokenIt = null;
+ } else {
+ Iterator<Token> it = tokens.iterator();
+ while (it.hasNext()) {
+ Token next = it.next();
+ if (next.getOffset() < offset) {
+ it.remove();
+ } else if (next.getOffset() + next.getLength() > (offset + length)) {
+ it.remove();
+ }
+ }
+ tokenIt = tokens.iterator();
+ }
+
+ }
+
+ /**
+ * handle nested spans: given a token for a specific span, split it into one or more tokens based on analyzing its
+ * children
+ *
+ * @return an array of tokens that contiguously cover the region represented by the original span.
+ */
+ private Token[] splitSpan(Token spanToken, Span span) {
+ List<Token> tokens = new ArrayList<Token>(span.getChildren().size() + 1);
+ int previousEnd = spanToken.offset;
+ for (Span child : span.getChildren().asList()) {
+ if (child.getOffset() > previousEnd) {
+ tokens.add(new Token(spanToken.fontState, spanToken.getData(), previousEnd, child.getOffset()
+ - previousEnd));
+ }
+ Token childToken = createToken(spanToken.fontState, child);
+ if (child.getChildren().isEmpty()) {
+ tokens.add(childToken);
+ } else {
+ // recursively apply to children
+ for (Token t : splitSpan(childToken, child)) {
+ tokens.add(t);
+ }
+ }
+ previousEnd = child.getEndOffset();
+ }
+ if (previousEnd < span.getEndOffset()) {
+ tokens.add(new Token(spanToken.fontState, spanToken.getData(), previousEnd, span.getEndOffset()
+ - previousEnd));
+ }
+ return tokens.toArray(new Token[tokens.size()]);
+ }
+
+ private void addToken(List<Token> tokens, Token newToken) {
+ checkAddToken(tokens, newToken);
+ tokens.add(newToken);
+ }
+
+ private void checkAddToken(List<Token> tokens, Token newToken) {
+ if (newToken.getLength() <= 0) {
+ throw new IllegalStateException(NLS.bind(Messages.MarkupTokenScanner_badTokenLength,
+ new Object[] { newToken.getLength() }));
+ }
+ if (newToken.getOffset() < 0) {
+ throw new IllegalStateException(NLS.bind(Messages.MarkupTokenScanner_badTokenOffset,
+ new Object[] { newToken.getOffset() }));
+ }
+ if (!tokens.isEmpty()) {
+ Token previous = tokens.get(tokens.size() - 1);
+ if (previous.getOffset() >= newToken.getOffset()) {
+ throw new IllegalStateException(Messages.MarkupTokenScanner_2);
+ } else if (previous.getOffset() + previous.getLength() > newToken.getOffset()) {
+ throw new IllegalStateException(Messages.MarkupTokenScanner_3);
+ }
+ }
+ }
+
+ private Token createToken(FontState parentState, Span span) {
+ if (span.getLength() == 0) {
+ return null;
+ }
+ String cssStyles = null;
+ String key = null;
+ switch (span.getType()) {
+ case BOLD:
+ key = Preferences.PHRASE_BOLD;
+ break;
+ case CITATION:
+ key = Preferences.PHRASE_CITATION;
+ break;
+ case CODE:
+ key = Preferences.PHRASE_CODE;
+ break;
+ case DELETED:
+ key = Preferences.PHRASE_DELETED_TEXT;
+ break;
+ case EMPHASIS:
+ key = Preferences.PHRASE_EMPHASIS;
+ break;
+ case INSERTED:
+ key = Preferences.PHRASE_INSERTED_TEXT;
+ break;
+ case ITALIC:
+ key = Preferences.PHRASE_ITALIC;
+ break;
+ case MONOSPACE:
+ key = Preferences.PHRASE_MONOSPACE;
+ break;
+ case QUOTE:
+ key = Preferences.PHRASE_QUOTE;
+ break;
+ case SPAN:
+ key = Preferences.PHRASE_SPAN;
+ break;
+ case STRONG:
+ key = Preferences.PHRASE_STRONG;
+ break;
+ case SUBSCRIPT:
+ key = Preferences.PHRASE_SUBSCRIPT;
+ break;
+ case SUPERSCRIPT:
+ key = Preferences.PHRASE_SUPERSCRIPT;
+ break;
+ case UNDERLINED:
+ key = Preferences.PHRASE_UNDERLINED;
+ break;
+ }
+ cssStyles = preferences.getCssByPhraseModifierType().get(key);
+ if (cssStyles == null && span.getAttributes().getCssStyle() == null) {
+ return null;
+ }
+ FontState fontState = new FontState(parentState);
+ if (cssStyles != null) {
+ processCssStyles(fontState, parentState, cssStyles);
+ }
+ if (span.getAttributes().getCssStyle() != null) {
+ processCssStyles(fontState, parentState, span.getAttributes().getCssStyle());
+ }
+ StyleRange styleRange = styleManager.createStyleRange(fontState, 0, 1);
+
+ TextAttribute textAttribute = new TextAttribute(styleRange.foreground, styleRange.background,
+ styleRange.fontStyle, styleRange.font);
+ return new Token(fontState, textAttribute, span.getOffset(), span.getLength());
+ }
+
+ private Token createToken(MarkupPartition partition) {
+ if (partition.getLength() == 0) {
+ return null;
+ }
+ FontState fontState = new FontState(defaultState);
+ boolean hasStyles = processStyles(partition.getBlock(), partition, fontState);
+
+ if (partition.getBlock().getAttributes().getCssStyle() != null) {
+ processCssStyles(fontState, defaultState, partition.getBlock().getAttributes().getCssStyle());
+ } else {
+ if (!hasStyles) {
+ return null;
+ }
+ }
+ StyleRange styleRange = styleManager.createStyleRange(fontState, 0, 1);
+
+ TextAttribute textAttribute = new TextAttribute(styleRange.foreground, styleRange.background,
+ styleRange.fontStyle, styleRange.font);
+ return new Token(fontState, textAttribute, partition.getOffset(), partition.getLength());
+ }
+
+ private boolean processStyles(Block block, MarkupPartition partition, FontState fontState) {
+ boolean hasStyles = false;
+ if (block.getParent() != null) {
+ hasStyles = processStyles(block.getParent(), partition, fontState);
+ }
+ String cssStyles = computeCssStyles(block, partition);
+ if (cssStyles != null) {
+ hasStyles = true;
+ processCssStyles(fontState, defaultState, cssStyles);
+ }
+ return hasStyles;
+ }
+
+ private String computeCssStyles(Block block, MarkupPartition partition) {
+ String cssStyles = null;
+ if (block.getHeadingLevel() > 0) {
+ cssStyles = preferences.getCssByBlockModifierType().get(
+ Preferences.HEADING_PREFERENCES[block.getHeadingLevel()]);
+ } else if (block.getType() != null) {
+ String key = null;
+ switch (block.getType()) {
+ case CODE:
+ key = Preferences.BLOCK_BC;
+ break;
+ case QUOTE:
+ key = Preferences.BLOCK_QUOTE;
+ break;
+ case PREFORMATTED:
+ key = Preferences.BLOCK_PRE;
+ break;
+ }
+ cssStyles = preferences.getCssByBlockModifierType().get(key);
+ }
+ return cssStyles;
+ }
+
+ private void processCssStyles(FontState fontState, FontState parentState, String cssStyles) {
+ Iterator<CssRule> ruleIterator = cssParser.createRuleIterator(cssStyles);
+ while (ruleIterator.hasNext()) {
+ styleManager.processCssStyles(fontState, parentState, ruleIterator.next());
+ }
+ }
+
+ private static class Token extends org.eclipse.jface.text.rules.Token {
+
+ private final int offset;
+
+ private final int length;
+
+ private final FontState fontState;
+
+ public Token(FontState fontState, TextAttribute attribute, int offset, int length) {
+ super(attribute);
+ this.fontState = fontState;
+ if (offset < 0) {
+ throw new IllegalArgumentException();
+ }
+ if (length < 0) {
+ throw new IllegalArgumentException();
+ }
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public FontState getFontState() {
+ return fontState;
+ }
+
+ @Override
+ public TextAttribute getData() {
+ return (TextAttribute) super.getData();
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Messages.java
new file mode 100644
index 0000000..e2830f1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Messages.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.messages"; //$NON-NLS-1$
+
+ public static String FastMarkupPartitioner_0;
+
+ public static String FastMarkupPartitioner_1;
+
+ public static String MarkupTokenScanner_2;
+
+ public static String MarkupTokenScanner_3;
+
+ public static String MarkupTokenScanner_badTokenLength;
+
+ public static String MarkupTokenScanner_badTokenOffset;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Segment.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Segment.java
new file mode 100644
index 0000000..58f0687
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Segment.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.util.Iterator;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Segment<ChildType extends Segment<?>> {
+ private int offset;
+
+ private int length;
+
+ private Attributes attributes;
+
+ private Segments<ChildType> children = new Segments<ChildType>();
+
+ private Segment<?> parent;
+
+ public Segment(int offset, int length) {
+ if (offset < 0) {
+ throw new IllegalArgumentException();
+ }
+ if (length < 0) {
+ throw new IllegalArgumentException();
+ }
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public Segment(Attributes attributes, int offset, int length) {
+ this(offset, length);
+ this.attributes = attributes;
+ }
+
+ /**
+ * get the end offset of this segment, exclusive equivalent to <code>getOffset()+getLength()</code>
+ */
+ public int getEndOffset() {
+ return offset + length;
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public void setLength(int length) {
+ if (length < 0) {
+ throw new IllegalArgumentException();
+ }
+ this.length = length;
+
+ // adjust child sizes
+ if (!children.isEmpty()) {
+ final int endOffset = getEndOffset();
+ Iterator<ChildType> childIt = children.asList().iterator();
+ while (childIt.hasNext()) {
+ ChildType child = childIt.next();
+ if (child.getOffset() >= endOffset) {
+ // shouldn't ever happen, but we do this to maintain offset integrity
+ childIt.remove();
+ } else {
+ if (child.getEndOffset() > endOffset) {
+ int newChildLength = endOffset - child.getOffset();
+ child.setLength(newChildLength);
+ }
+ }
+ }
+ }
+ }
+
+ public void add(ChildType child) {
+ if (child.getOffset() < offset) {
+ throw new IllegalArgumentException();
+ }
+ if (child.getEndOffset() > getEndOffset()) {
+ throw new IllegalArgumentException();
+ }
+ children.add(child);
+ child.parent = this;
+ }
+
+ public Segment<?> getParent() {
+ return parent;
+ }
+
+ public Segments<ChildType> getChildren() {
+ return children;
+ }
+
+ public Attributes getAttributes() {
+ return attributes;
+ }
+
+ public void setAttributes(Attributes attributes) {
+ this.attributes = attributes;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void replaceChildren(Segment<?> s) {
+ children = (Segments<ChildType>) s.children;
+ if (children != null) {
+ for (ChildType child : children.asList()) {
+ child.parent = this;
+ }
+ }
+ s.children = null;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Segments.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Segments.java
new file mode 100644
index 0000000..85c36f1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Segments.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Segments<T extends Segment<?>> {
+ private List<T> list;
+
+ @SuppressWarnings("unchecked")
+ public void add(T t) {
+ if (list == null) {
+ list = new ArrayList<T>();
+ } else if (list.size() > 0) {
+ Segment previousSegment = list.get(list.size() - 1);
+ final int tOffset = t.getOffset();
+ if (previousSegment.getOffset() > tOffset) {
+ throw new IllegalArgumentException();
+ }
+ if (previousSegment.getEndOffset() > tOffset) {
+ int newLength = tOffset - previousSegment.getOffset();
+ previousSegment.setLength(newLength);
+ }
+ }
+ list.add(t);
+ }
+
+ public void remove(T t) {
+ list.remove(t);
+ }
+
+ public List<T> asList() {
+ if (list == null) {
+ return Collections.emptyList();
+ }
+ return list;
+ }
+
+ public boolean isEmpty() {
+ return list == null || list.isEmpty();
+ }
+
+ public int size() {
+ return list == null ? 0 : list.size();
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Span.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Span.java
new file mode 100644
index 0000000..8f3590b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/Span.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.syntax;
+
+import org.eclipse.mylyn.wikitext.core.parser.Attributes;
+import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class Span extends Segment<Span> {
+
+ private final SpanType type;
+
+ public Span(SpanType type, int offset, int length) {
+ super(offset, length);
+ this.type = type;
+ }
+
+ public Span(SpanType type, Attributes attributes, int offset, int length) {
+ super(attributes, offset, length);
+ this.type = type;
+ }
+
+ public SpanType getType() {
+ return type;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("<%s offset=\"%s\" length=\"%s\"/>", type.name(), getOffset(), getLength()); //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/messages.properties
new file mode 100644
index 0000000..c099b2c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/messages.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+FastMarkupPartitioner_0=Partition {0} cannot start before partition {1}. This probably indicates a bug in the {2} markup language parser. Please file a bug at https://bugs.eclipse.org and include the markup source that caused the problem in your bug report.
+FastMarkupPartitioner_1={0} Markup content was saved to file {1}, please attach the file to the bug report.
+MarkupTokenScanner_2=New token starts on or before previous
+MarkupTokenScanner_3=New token starts before the end of the previous
+MarkupTokenScanner_badTokenLength=Bad token length {0}
+MarkupTokenScanner_badTokenOffset=Bad token offset {0}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/AnnotationMarkupValidator.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/AnnotationMarkupValidator.java
new file mode 100644
index 0000000..e564872
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/AnnotationMarkupValidator.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.validation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ISynchronizable;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModelExtension;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class AnnotationMarkupValidator extends DocumentRegionValidator {
+
+ @Override
+ protected void clearProblems(IProgressMonitor monitor, IDocument document, IRegion region) throws CoreException {
+ monitor.beginTask(Messages.AnnotationMarkupValidator_clearingProblems, 100);
+ // nothing to do: we do this all in the createProblems method.
+ monitor.done();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void createProblems(IProgressMonitor monitor, IDocument document, IRegion region,
+ List<ValidationProblem> problems) throws CoreException {
+ Object lockObject;
+ if (annotationModel instanceof ISynchronizable) {
+ lockObject = ((ISynchronizable) annotationModel).getLockObject();
+ } else {
+ lockObject = annotationModel;
+ }
+ synchronized (lockObject) {
+ List<Annotation> toRemove = null;
+ Iterator<Annotation> annotationIterator = annotationModel.getAnnotationIterator();
+ while (annotationIterator.hasNext()) {
+ Annotation annotation = annotationIterator.next();
+ if (ValidationProblemAnnotation.isValidationAnnotation(annotation)) {
+ Position position = annotationModel.getPosition(annotation);
+ int offset = position.getOffset();
+ if (overlaps(region, offset, position.getLength()) || offset >= document.getLength()) {
+ if (toRemove == null) {
+ toRemove = new ArrayList<Annotation>();
+ }
+ toRemove.add(annotation);
+ }
+ }
+ }
+
+ Map<Annotation, Position> annotationsToAdd = new HashMap<Annotation, Position>();
+ for (ValidationProblem problem : problems) {
+ annotationsToAdd.put(new ValidationProblemAnnotation(problem), new Position(problem.getOffset(),
+ problem.getLength()));
+ }
+
+ if (toRemove != null && annotationModel instanceof IAnnotationModelExtension) {
+ Annotation[] annotationsToRemove = toRemove.toArray(new Annotation[toRemove.size()]);
+ ((IAnnotationModelExtension) annotationModel).replaceAnnotations(annotationsToRemove, annotationsToAdd);
+ } else {
+ if (toRemove != null) {
+ for (Annotation annotation : toRemove) {
+ annotationModel.removeAnnotation(annotation);
+ }
+ }
+ for (Map.Entry<Annotation, Position> entry : annotationsToAdd.entrySet()) {
+ annotationModel.addAnnotation(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ }
+
+ @Override
+ public void validate(IProgressMonitor monitor, IDocument document, IRegion region) throws CoreException {
+ if (annotationModel == null) {
+ return;
+ }
+ super.validate(monitor, document, region);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/DocumentRegionValidator.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/DocumentRegionValidator.java
new file mode 100644
index 0000000..5fdb255
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/DocumentRegionValidator.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.validation;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.validation.MarkupValidator;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+/**
+ * A validator that can be used to validate regions of a document in an editor. Delegates validation to a
+ * {@link MarkupValidator} and coordinates the translation of errors and warnings to the editor framework.
+ *
+ * @author David Green
+ *
+ * @see MarkupValidator
+ */
+public abstract class DocumentRegionValidator {
+ protected IResource resource;
+
+ protected IAnnotationModel annotationModel;
+
+ protected MarkupLanguage markupLanguage;
+
+ protected MarkupValidator delegate;
+
+ /**
+ * Validate a region of a document. Validation results may be created as annotations on the annotation model, or as
+ * markers on the resource.
+ *
+ * @param monitor
+ * the progress monitor
+ * @param document
+ * the document representing the content of the resource
+ * @param region
+ * the region of the document to validate
+ *
+ * @throws CoreException
+ */
+ public void validate(IProgressMonitor monitor, IDocument document, IRegion region) throws CoreException {
+ if (region.getLength() == 0) {
+ return;
+ }
+ final int totalWork = region.getLength() * 2;
+ monitor.beginTask(Messages.DocumentRegionValidator_validation, totalWork);
+ try {
+ clearProblems(new SubProgressMonitor(monitor, totalWork / 2), document, region);
+ computeProblems(new SubProgressMonitor(monitor, totalWork / 2), document, region);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ protected void computeProblems(IProgressMonitor monitor, IDocument document, IRegion region) throws CoreException {
+ if (delegate == null) {
+ return;
+ }
+ final int totalWork = Integer.MAX_VALUE / 2;
+ monitor.beginTask(Messages.DocumentRegionValidator_validating, totalWork);
+ try {
+ List<ValidationProblem> problems = delegate.validate(new SubProgressMonitor(monitor, totalWork / 2),
+ document.get(), region.getOffset(), region.getLength());
+
+ createProblems(new SubProgressMonitor(monitor, totalWork / 2), document, region, problems);
+
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * create problems
+ *
+ * @param monitor
+ * @param document
+ * @param region
+ * @param problems
+ */
+ protected abstract void createProblems(IProgressMonitor monitor, IDocument document, IRegion region,
+ List<ValidationProblem> problems) throws CoreException;
+
+ /**
+ * Remove any problems in the given region of the document.
+ *
+ * @param monitor
+ * @param document
+ * @param region
+ * @throws CoreException
+ */
+ protected abstract void clearProblems(IProgressMonitor monitor, IDocument document, IRegion region)
+ throws CoreException;
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ if (markupLanguage == this.markupLanguage
+ || (markupLanguage != null && this.markupLanguage != null && markupLanguage.getName().equals(
+ this.markupLanguage.getName()))) {
+ return;
+ }
+ this.markupLanguage = markupLanguage;
+ delegate = markupLanguage == null ? null : WikiText.getMarkupValidator(
+ markupLanguage.getName());
+ }
+
+ public IResource getResource() {
+ return resource;
+ }
+
+ public void setResource(IResource resource) {
+ this.resource = resource;
+ }
+
+ public IAnnotationModel getAnnotationModel() {
+ return annotationModel;
+ }
+
+ public void setAnnotationModel(IAnnotationModel annotationModel) {
+ this.annotationModel = annotationModel;
+ }
+
+ /**
+ * indicate if the given offset and length overlap with the given region
+ *
+ * @param region
+ * @param offset
+ * @param length
+ *
+ * @return true if they overlap, otherwise false.
+ */
+ protected boolean overlaps(IRegion region, int offset, int length) {
+ int end = offset + length;
+ if (region.getOffset() > offset) {
+ return end > region.getOffset();
+ } else if (offset < region.getOffset() + region.getLength()) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/Messages.java
new file mode 100644
index 0000000..0eb1185
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/Messages.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.editor.validation;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.editor.validation.messages"; //$NON-NLS-1$
+
+ public static String AnnotationMarkupValidator_clearingProblems;
+
+ public static String DocumentRegionValidator_validating;
+
+ public static String DocumentRegionValidator_validation;
+
+ public static String ResourceMarkerMarkupValidator_clearingMarkers;
+
+ public static String ResourceMarkerMarkupValidator_creatingMarkers;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/ResourceMarkerMarkupValidator.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/ResourceMarkerMarkupValidator.java
new file mode 100644
index 0000000..118157e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/ResourceMarkerMarkupValidator.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.validation;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationRule;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem.Severity;
+
+/**
+ * Markup validators are capable of validating a region of a document. Any validation problems or errors are created as
+ * markers on the given resource, extending type <code>org.eclipse.mylyn.wikitext.core.validation.problem</code>.
+ *
+ * NOTE: this implementation may change in the future to use an {@link IAnnotationModel} instead of resource markers
+ *
+ * @author David Green
+ *
+ * @see ValidationRule
+ * @see ValidationProblem
+ */
+public class ResourceMarkerMarkupValidator extends DocumentRegionValidator {
+
+ @Override
+ protected void clearProblems(IProgressMonitor monitor, IDocument document, IRegion region) throws CoreException {
+ monitor.beginTask(Messages.ResourceMarkerMarkupValidator_clearingMarkers, 1);
+ // nothing to do: we do all of this in the createProblems method
+ monitor.done();
+ }
+
+ @Override
+ protected void createProblems(IProgressMonitor monitor, IDocument document, IRegion region,
+ List<ValidationProblem> problems) throws CoreException {
+ final int findMarkersWorkSize = 100;
+ final int zeroProblemsStep = 10;
+ monitor.beginTask(
+ Messages.ResourceMarkerMarkupValidator_creatingMarkers, problems.size() + findMarkersWorkSize + zeroProblemsStep);
+
+ // find and remove any existing validation errors in the given region.
+ List<IMarker> markersInRegion = new ArrayList<IMarker>(5);
+ // we also track markers by offset, however we don't track multiple markers at the same offset
+ Map<Integer, IMarker> markerByOffset = new HashMap<Integer, IMarker>();
+ {
+ IMarker[] findMarkers = resource.findMarkers("org.eclipse.mylyn.wikitext.core.validation.problem", true, //$NON-NLS-1$
+ IResource.DEPTH_ZERO);
+ for (IMarker marker : findMarkers) {
+ int offset = marker.getAttribute(IMarker.CHAR_START, 0);
+ int end = marker.getAttribute(IMarker.CHAR_END, offset);
+ if (overlaps(region, offset, end - offset) || offset >= document.getLength()) {
+ markersInRegion.add(marker);
+ markerByOffset.put(offset, marker);
+ }
+ }
+ monitor.worked(findMarkersWorkSize);
+ }
+
+ if (problems.isEmpty()) {
+ for (IMarker marker : markersInRegion) {
+ marker.delete();
+ }
+ monitor.worked(zeroProblemsStep);
+ monitor.done();
+ return;
+ }
+ monitor.worked(zeroProblemsStep);
+
+ // bug 261747: compute a delta so that we can avoid flicker
+ if (!markersInRegion.isEmpty()) {
+ // find all problems for which there is a marker that matches, and remove the problem from our
+ // collection of problems to create
+ Iterator<ValidationProblem> problemIt = problems.iterator();
+ while (problemIt.hasNext()) {
+ ValidationProblem problem = problemIt.next();
+ IMarker marker = markerByOffset.get(problem.getOffset());
+ if (marker != null) {
+ int charEnd = marker.getAttribute(IMarker.CHAR_END, -1);
+ if ((problem.getOffset() + problem.getLength()) == charEnd) {
+ if (toMarkerSeverity(problem.getSeverity()) == marker.getAttribute(IMarker.SEVERITY, -1)) {
+ if (problem.getMessage().equals(marker.getAttribute(IMarker.MESSAGE, ""))) { //$NON-NLS-1$
+ problemIt.remove();
+ markerByOffset.remove(problem.getOffset());
+ markersInRegion.remove(marker);
+ monitor.worked(1);
+ }
+ }
+ }
+ }
+ }
+ // remove all markers that had no matching problem
+ for (IMarker marker : markersInRegion) {
+ marker.delete();
+ }
+ }
+
+ for (ValidationProblem problem : problems) {
+ IMarker marker = resource.createMarker(problem.getMarkerId());
+
+ marker.setAttribute(IMarker.TRANSIENT, true);
+ marker.setAttribute(IMarker.SEVERITY, toMarkerSeverity(problem.getSeverity()));
+ marker.setAttribute(IMarker.MESSAGE, problem.getMessage());
+ marker.setAttribute(IMarker.CHAR_START, problem.getOffset());
+ marker.setAttribute(IMarker.CHAR_END, problem.getOffset() + problem.getLength());
+
+ try {
+ int line = document.getLineOfOffset(problem.getOffset());
+ marker.setAttribute(IMarker.LINE_NUMBER, line + 1);
+
+ } catch (BadLocationException e) {
+ // ignore
+ }
+
+ monitor.worked(1);
+ }
+ monitor.done();
+ }
+
+ private int toMarkerSeverity(Severity severity) {
+ switch (severity) {
+ case ERROR:
+ return IMarker.SEVERITY_ERROR;
+ case WARNING:
+ return IMarker.SEVERITY_WARNING;
+ default:
+ throw new IllegalStateException(severity.name());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/ValidationProblemAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/ValidationProblemAnnotation.java
new file mode 100644
index 0000000..b467d82
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/ValidationProblemAnnotation.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.editor.validation;
+
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class ValidationProblemAnnotation extends Annotation {
+
+ private static final String TYPE_BASE = "org.eclipse.mylyn.wikitext.ui.editor.problem.validation"; //$NON-NLS-1$
+
+ public static final String TYPE_WARNING = TYPE_BASE + ".warning"; //$NON-NLS-1$
+
+ public static final String TYPE_ERROR = TYPE_BASE + ".error"; //$NON-NLS-1$
+
+ public ValidationProblemAnnotation(ValidationProblem problem) {
+ super(computeType(problem), false, problem.getMessage());
+ }
+
+ private static String computeType(ValidationProblem problem) {
+ switch (problem.getSeverity()) {
+ case ERROR:
+ return TYPE_ERROR;
+ case WARNING:
+ return TYPE_WARNING;
+ default:
+ throw new IllegalStateException(problem.getSeverity().name());
+ }
+ }
+
+ public static boolean isValidationAnnotation(Annotation annotation) {
+ return annotation.getType().startsWith(TYPE_BASE);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/messages.properties
new file mode 100644
index 0000000..ec34a2c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/validation/messages.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+AnnotationMarkupValidator_clearingProblems=clearing problems
+DocumentRegionValidator_validating=validating
+DocumentRegionValidator_validation=Validation
+ResourceMarkerMarkupValidator_clearingMarkers=clearing markers
+ResourceMarkerMarkupValidator_creatingMarkers=creating markers
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/messages.properties
new file mode 100644
index 0000000..b60c647
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/messages.properties
@@ -0,0 +1,20 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+WikiTextNature_cannotValidateNatureSet=Cannot validate nature set
+WikiTextUiPlugin_contentRequired=Must specify {0}/@content
+WikiTextUiPlugin_descriptionRequired=Must specify {0}/@description
+WikiTextUiPlugin_invalidExtension=Plugin ''{0}'' extension ''{1}'' invalid: {2}
+WikiTextUiPlugin_invalidMarkupLanguage=''{0}'' is not a valid markupLanguage
+WikiTextUiPlugin_markupLanguageContentAlreadyDeclared=content for markupLanguage ''{0}'' is already declared by plugin ''{1}''
+WikiTextUiPlugin_markupLanguageRequired=Must specify markupLanguage
+WikiTextUiPlugin_nameRequired=Must specify {0}/@name
+WikiTextUiPlugin_resourceRequired=Must specify resource
+WikiTextUiPlugin_unexpectedExtensionElement=Plugin ''{0}'' extension ''{1}'' unexpected element: {2}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/Messages.java
new file mode 100644
index 0000000..83f50ca
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/Messages.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.properties;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.properties.messages"; //$NON-NLS-1$
+
+ public static String ProjectPropertyPage_3;
+
+ public static String ProjectPropertyPage_4;
+
+ public static String ProjectPropertyPage_configureInfo;
+
+ public static String ProjectPropertyPage_enableValidation;
+
+ public static String ProjectPropertyPage_operationError;
+
+ public static String ProjectPropertyPage_unexpectedError;
+
+ public static String ProjectPropertyPage_validation_tooltip;
+
+ public static String ProjectPropertyPage_wikiText;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/ProjectPropertyPage.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/ProjectPropertyPage.java
new file mode 100644
index 0000000..dd9ae19
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/ProjectPropertyPage.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.properties;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextNature;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+/**
+ * A properties page for IProject that allow for configuration of WikiText settings such as the presence of a
+ * {@link WikiTextNature}.
+ *
+ * @author David Green
+ */
+public class ProjectPropertyPage extends PropertyPage implements IWorkbenchPropertyPage {
+
+ private IProject project;
+
+ private Button wikiTextNatureButton;
+
+ public ProjectPropertyPage() {
+ setTitle(Messages.ProjectPropertyPage_wikiText);
+ setDescription(Messages.ProjectPropertyPage_configureInfo);
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ container.setLayout(new GridLayout(1, false));
+
+ wikiTextNatureButton = new Button(container, SWT.CHECK);
+ wikiTextNatureButton.setText(Messages.ProjectPropertyPage_enableValidation);
+
+ StringBuilder buf = new StringBuilder();
+ SortedSet<String> extensions = new TreeSet<String>(WikiText.getMarkupFileExtensions());
+ for (String extension : extensions) {
+ if (buf.length() > 0) {
+ buf.append(Messages.ProjectPropertyPage_3);
+ }
+ buf.append(Messages.ProjectPropertyPage_4);
+ buf.append(extension);
+ }
+ wikiTextNatureButton.setToolTipText(NLS.bind(Messages.ProjectPropertyPage_validation_tooltip,
+ new Object[] { buf.toString() }));
+
+ project = (IProject) getElement().getAdapter(IProject.class);
+
+ try {
+ if (project.hasNature(WikiTextNature.ID)) {
+ wikiTextNatureButton.setSelection(true);
+ }
+ } catch (CoreException e) {
+ WikiTextUiPlugin.getDefault().log(e);
+ container.setEnabled(false);
+ setErrorMessage(e.getMessage());
+ setValid(false);
+ }
+
+ return container;
+ }
+
+ @Override
+ public void performHelp() {
+ getControl().notifyListeners(SWT.Help, new Event());
+ }
+
+ @Override
+ protected void setControl(Control newControl) {
+ super.setControl(newControl);
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(newControl,
+ "org.eclipse.mylyn.wikitext.help.ui.projectSettings"); //$NON-NLS-1$
+ }
+
+ @Override
+ public boolean performOk() {
+ final boolean wantNature = wikiTextNatureButton.getSelection();
+ final boolean[] ok = new boolean[1];
+ ok[0] = false;
+ WorkspaceModifyOperation operation = new WorkspaceModifyOperation(ResourcesPlugin.getWorkspace().getRoot()) {
+ @Override
+ protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException,
+ InterruptedException {
+ if (project.hasNature(WikiTextNature.ID) != wantNature) {
+ if (wantNature) {
+ WikiTextNature.install(project, monitor);
+ } else {
+ WikiTextNature.uninstall(project, monitor);
+ }
+ }
+ ok[0] = true;
+ }
+ };
+ try {
+ new ProgressMonitorDialog(getShell()).run(true, true, operation);
+ } catch (InvocationTargetException e) {
+ String message = Messages.ProjectPropertyPage_operationError;
+ String title = Messages.ProjectPropertyPage_unexpectedError;
+ ErrorDialog.openError(getShell(), title, message, WikiTextUiPlugin.getDefault().createStatus(IStatus.ERROR,
+ e.getCause()));
+ } catch (InterruptedException e) {
+ // Do nothing. Operation has been canceled by user.
+ }
+
+ return ok[0];
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/messages.properties
new file mode 100644
index 0000000..b1495c1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/properties/messages.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2007, 2009 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+ProjectPropertyPage_3=,
+ProjectPropertyPage_4=*.
+ProjectPropertyPage_configureInfo=Configure WikiText properties for your project
+ProjectPropertyPage_enableValidation=Enable validation
+ProjectPropertyPage_operationError=Cannot invoke operation
+ProjectPropertyPage_unexpectedError=Unexpected error
+ProjectPropertyPage_validation_tooltip=Validate files that match {0}
+ProjectPropertyPage_wikiText=WikiText
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/FilePropertyTester.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/FilePropertyTester.java
new file mode 100644
index 0000000..8802e16
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/FilePropertyTester.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class FilePropertyTester extends PropertyTester {
+
+ private static final String CONTENT_TYPE_CLASSIFICATION = "contentTypeClassification"; //$NON-NLS-1$
+
+ public FilePropertyTester() {
+ }
+
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if ((receiver instanceof IFile) && property.equals(CONTENT_TYPE_CLASSIFICATION)) {
+ return testContentType((IFile) receiver, toString(expectedValue));
+ }
+ return false;
+ }
+
+ private boolean testContentType(IFile file, String expectedValue) {
+ try {
+ IContentDescription contentDescription = file.getContentDescription();
+ if (contentDescription != null) {
+ IContentType contentType = contentDescription.getContentType();
+ while (contentType != null) {
+ if (expectedValue.equals(contentType.getId())) {
+ return true;
+ }
+ contentType = contentType.getBaseType();
+ }
+ }
+ } catch (CoreException e) {
+ WikiTextUiPlugin.getDefault().log(e);
+ }
+ return false;
+ }
+
+ protected String toString(Object expectedValue) {
+ return expectedValue == null ? "" : expectedValue.toString(); //$NON-NLS-1$
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/HyperlinkDetectorDelegate.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/HyperlinkDetectorDelegate.java
new file mode 100644
index 0000000..5aa8401
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/HyperlinkDetectorDelegate.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetectorExtension2;
+import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor;
+
+/**
+ * A means to delay activation of plug-ins by delaying creation of a hyperlink detector from a descriptor.
+ *
+ * @author David Green
+ */
+public class HyperlinkDetectorDelegate implements IHyperlinkDetector, IHyperlinkDetectorExtension,
+ IHyperlinkDetectorExtension2 {
+
+ private HyperlinkDetectorDescriptor descriptor;
+
+ private AbstractHyperlinkDetector delegate;
+
+ private boolean createFailed;
+
+ private IAdaptable context;
+
+ private int stateMask;
+
+ private boolean enabled;
+
+ public HyperlinkDetectorDelegate(HyperlinkDetectorDescriptor descriptor, IPreferenceStore preferenceStore) {
+ this.descriptor = descriptor;
+ if (preferenceStore != null) {
+ stateMask = preferenceStore.getInt(descriptor.getId() + HyperlinkDetectorDescriptor.STATE_MASK_POSTFIX);
+ enabled = !preferenceStore.getBoolean(descriptor.getId());
+ }
+ }
+
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+ if (!isEnabled()) {
+ return null;
+ }
+
+ if (!createFailed && delegate == null) {
+ try {
+ delegate = descriptor.createHyperlinkDetector();
+ } catch (CoreException ex) {
+ createFailed = true;
+ }
+ if (delegate != null && context != null) {
+ delegate.setContext(context);
+ }
+ }
+ if (delegate != null) {
+ return delegate.detectHyperlinks(textViewer, region, canShowMultipleHyperlinks);
+ }
+
+ return null;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setContext(IAdaptable context) {
+ this.context = context;
+ }
+
+ public void dispose() {
+ if (delegate != null) {
+ delegate.dispose();
+ delegate = null;
+ }
+ descriptor = null;
+ context = null;
+ }
+
+ public int getStateMask() {
+ return stateMask;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/ImageCache.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/ImageCache.java
new file mode 100644
index 0000000..751154c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/ImageCache.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * An image cache that manages image lifecycle and maps images to URLs.
+ *
+ * The lifetime of the image cache is intended to be short, as it keeps image widgets and image data in memory.
+ * Typically an ImageCache lifetime corresponds to the lifetime of the object that is displaying the images.
+ *
+ * @author David Green
+ */
+public class ImageCache {
+
+ private final Map<String, Image> imageByUrl = new HashMap<String, Image>();
+
+ private URL base;
+
+ private Image missingImage;
+
+ private boolean disposed = false;
+
+ /**
+ * get an image by its url
+ *
+ * @param url
+ * the url which may be absolute or relative
+ *
+ * @return the image, or the {@link ImageDescriptor#getMissingImageDescriptor() missing image} if the image cannot
+ * be found
+ */
+ public Image getImage(String url) {
+ if (disposed) {
+ throw new IllegalStateException();
+ }
+ Image image = imageByUrl.get(url);
+ if (image == null) {
+ try {
+ URL location = base == null ? new URL(url) : new URL(base, url);
+ ImageDescriptor descriptor = ImageDescriptor.createFromURL(location);
+ image = descriptor.createImage(false);
+ if (image == null) {
+ image = getMissingImage();
+ }
+ imageByUrl.put(url, image);
+ } catch (MalformedURLException e) {
+ image = getMissingImage();
+ imageByUrl.put(url, image);
+ }
+ }
+ return image;
+ }
+
+ public void putImage(String url, Image image) {
+ if (disposed) {
+ throw new IllegalStateException();
+ }
+ Image previous = imageByUrl.put(url, image);
+ if (previous != null && previous != missingImage) {
+ previous.dispose();
+ }
+ }
+
+ public Image getMissingImage() {
+ if (missingImage == null) {
+ missingImage = ImageDescriptor.createFromURL(ImageCache.class.getResource("resources/missing-image.png")) //$NON-NLS-1$
+ .createImage();
+ }
+ return missingImage;
+ }
+
+ public void dispose() {
+ disposed = true;
+ for (Image image : imageByUrl.values()) {
+ if (image != missingImage) {
+ image.dispose();
+ }
+ }
+ imageByUrl.clear();
+ if (missingImage != null) {
+ missingImage.dispose();
+ missingImage = null;
+ }
+ }
+
+ /**
+ * the base url from which relative urls are computed, or null if it is unknown
+ *
+ * @see URL#URL(URL, String)
+ */
+ public URL getBase() {
+ return base;
+ }
+
+ /**
+ * the base url from which relative urls are computed, or null if it is unknown
+ *
+ * @see URL#URL(URL, String)
+ */
+ public void setBase(URL base) {
+ this.base = base;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/InformationPresenterUtil.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/InformationPresenterUtil.java
new file mode 100644
index 0000000..6833ce9
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/InformationPresenterUtil.java
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.text.AbstractInformationControlManager;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.DefaultInformationControl.IInformationPresenter;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.jface.text.information.IInformationProviderExtension2;
+import org.eclipse.jface.text.information.InformationPresenter;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.FastMarkupPartitioner;
+import org.eclipse.mylyn.wikitext.ui.viewer.HtmlTextPresenter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ *
+ * @author David Green
+ */
+public class InformationPresenterUtil {
+ /**
+ * @see InformationPresenter#setSizeConstraints(int, int, boolean, boolean)
+ */
+ public static class SizeConstraint {
+ int horizontalWidthInChars;
+
+ int verticalWidthInChars;
+
+ boolean enforceAsMinimumSize;
+
+ boolean enforceAsMaximumSize;
+
+ /**
+ * @see InformationPresenter#setSizeConstraints(int, int, boolean, boolean)
+ */
+ public SizeConstraint(int horizontalWidthInChars, int verticalWidthInChars, boolean enforceAsMinimumSize,
+ boolean enforceAsMaximumSize) {
+ super();
+ this.horizontalWidthInChars = horizontalWidthInChars;
+ this.verticalWidthInChars = verticalWidthInChars;
+ this.enforceAsMinimumSize = enforceAsMinimumSize;
+ this.enforceAsMaximumSize = enforceAsMaximumSize;
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ private static final class InformationProvider implements IInformationProvider, IInformationProviderExtension,
+ IInformationProviderExtension2 {
+
+ private final IRegion hoverRegion;
+
+ private final Object hoverInfo;
+
+ private final IInformationControlCreator controlCreator;
+
+ InformationProvider(IRegion hoverRegion, Object info, IInformationControlCreator controlCreator) {
+ this.hoverRegion = hoverRegion;
+ this.hoverInfo = info;
+ this.controlCreator = controlCreator;
+ }
+
+ public IRegion getSubject(ITextViewer textViewer, int invocationOffset) {
+ return hoverRegion;
+ }
+
+ public String getInformation(ITextViewer textViewer, IRegion subject) {
+ return hoverInfo.toString();
+ }
+
+ public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+ return hoverInfo;
+ }
+
+ public IInformationControlCreator getInformationPresenterControlCreator() {
+ return controlCreator;
+ }
+ }
+
+ private static final String DATA_INFORMATION_PRESENTER = InformationPresenterUtil.class.getName()
+ + "#informationPresenter"; //$NON-NLS-1$
+
+ private static final String DATA_INFORMATION_CONTROL_CREATOR = InformationPresenterUtil.class.getName()
+ + "#informationControlCreator"; //$NON-NLS-1$
+
+ /**
+ * Get an information presenter to present the provided HTML content. The returned presenter is ready for displaying
+ * the information, all that is left to do is call {@link InformationPresenter#showInformation()}.
+ *
+ * @param viewer
+ * the viewer for which the information control should be created
+ * @param constraint
+ * the size constraint
+ * @param toolBarManager
+ * the tool bar manager, or null if there should be none
+ * @param htmlContent
+ * the HTML content to be displayed by the information presenter.
+ *
+ * @return the presenter
+ */
+ public static InformationPresenter getHtmlInformationPresenter(ISourceViewer viewer, SizeConstraint constraint,
+ final ToolBarManager toolBarManager, String htmlContent) {
+ Control control = viewer.getTextWidget();
+ InformationPresenter presenter = (InformationPresenter) control.getData(DATA_INFORMATION_PRESENTER);
+
+ // bug 270059: ensure that the size/positioning math works by specifying the offet of the
+ // current selection.
+ int offset = viewer.getSelectedRange().x;
+
+ IInformationControlCreator informationControlCreator;
+ if (presenter == null) {
+
+ informationControlCreator = new IInformationControlCreator() {
+ @SuppressWarnings("deprecation")
+ public IInformationControl createInformationControl(Shell shell) {
+ try {
+ // try reflection to access 3.4 APIs
+ // DefaultInformationControl(Shell parent, ToolBarManager toolBarManager, IInformationPresenter presenter);
+ return DefaultInformationControl.class.getConstructor(Shell.class, ToolBarManager.class,
+ IInformationPresenter.class)
+ .newInstance(shell, toolBarManager, new HtmlTextPresenter());
+ } catch (NoSuchMethodException e) {
+ // no way with 3.3 to get V_SCROLL and a ToolBarManager
+ return new DefaultInformationControl(shell, SWT.RESIZE, SWT.V_SCROLL | SWT.H_SCROLL,
+ new HtmlTextPresenter());
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ };
+
+ presenter = new InformationPresenter(informationControlCreator) {
+ @Override
+ public IInformationProvider getInformationProvider(String contentType) {
+ IInformationProvider informationProvider = super.getInformationProvider(contentType);
+ if (informationProvider == null) {
+ informationProvider = super.getInformationProvider(IDocument.DEFAULT_CONTENT_TYPE);
+ }
+ return informationProvider;
+ }
+ };
+ presenter.install(viewer);
+ presenter.setAnchor(AbstractInformationControlManager.ANCHOR_BOTTOM);
+ presenter.setMargins(6, 6); // default values from AbstractInformationControlManager
+
+ presenter.setOffset(offset);
+
+ presenter.install(viewer);
+ final InformationPresenter informationPresenter = presenter;
+ viewer.getTextWidget().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ try {
+ informationPresenter.uninstall();
+ } catch (Exception e2) {
+ }
+ informationPresenter.dispose();
+ }
+ });
+ control.setData(DATA_INFORMATION_PRESENTER, presenter);
+ control.setData(DATA_INFORMATION_CONTROL_CREATOR, informationControlCreator);
+ } else {
+ informationControlCreator = (IInformationControlCreator) control.getData(DATA_INFORMATION_CONTROL_CREATOR);
+ presenter.disposeInformationControl();
+ }
+
+ presenter.setSizeConstraints(constraint.horizontalWidthInChars, constraint.verticalWidthInChars,
+ constraint.enforceAsMinimumSize, constraint.enforceAsMaximumSize);
+
+ InformationProvider informationProvider = new InformationProvider(new org.eclipse.jface.text.Region(offset, 0),
+ htmlContent, informationControlCreator);
+
+ for (String contentType : FastMarkupPartitioner.ALL_CONTENT_TYPES) {
+ presenter.setInformationProvider(informationProvider, contentType);
+ }
+ presenter.setInformationProvider(informationProvider, IDocument.DEFAULT_CONTENT_TYPE);
+
+ return presenter;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/NlsResourceBundle.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/NlsResourceBundle.java
new file mode 100644
index 0000000..0688655
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/NlsResourceBundle.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.ResourceBundle;
+import java.util.Set;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * A resource bundle based on {@link NLS}.
+ *
+ * @author dgreen
+ */
+public class NlsResourceBundle extends ResourceBundle {
+
+ private final Class<? extends NLS> nlsClass;
+
+ public NlsResourceBundle(Class<? extends NLS> nlsClass) {
+ this.nlsClass = nlsClass;
+ }
+
+ @Override
+ public Enumeration<String> getKeys() {
+ Set<String> keys = new HashSet<String>();
+ for (Field field : nlsClass.getFields()) {
+ if (field.getType() == String.class) {
+ if (Modifier.isStatic(field.getModifiers())) {
+ keys.add(field.getName());
+ }
+ }
+ }
+ return Collections.enumeration(keys);
+ }
+
+ @Override
+ protected Object handleGetObject(String key) {
+ try {
+ Field field = nlsClass.getField(key);
+ field.setAccessible(true);
+ return field.get(null);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemAdapterFactory.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemAdapterFactory.java
new file mode 100644
index 0000000..b0c7c5a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemAdapterFactory.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+/**
+ * An adapter factory for {@link OutlineItem} that can adapt it to {@link IWorkbenchAdapter}.
+ *
+ * @author dgreen
+ */
+public class OutlineItemAdapterFactory implements IAdapterFactory {
+
+ private static final Class<?>[] ADAPTER_LIST = { IWorkbenchAdapter.class };
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Object adaptableObject, Class adapterType) {
+ if (adapterType == IWorkbenchAdapter.class && adaptableObject instanceof OutlineItem) {
+ return OutlineItemWorkbenchAdapter.instance();
+ }
+ return null;
+ }
+
+ public Class<?>[] getAdapterList() {
+ return ADAPTER_LIST;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemWorkbenchAdapter.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemWorkbenchAdapter.java
new file mode 100644
index 0000000..397b8e0
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/OutlineItemWorkbenchAdapter.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+
+/**
+ * A workbench adapter for {@link OutlineItem}
+ *
+ * @author David Green
+ *
+ * @see OutlineItemAdapterFactory
+ */
+public class OutlineItemWorkbenchAdapter implements IWorkbenchAdapter {
+
+ private static final Object[] NO_CHILDREN = new Object[0];
+
+ private static OutlineItemWorkbenchAdapter instance = new OutlineItemWorkbenchAdapter();
+
+ public Object[] getChildren(Object o) {
+ if (o instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) o;
+ if (!item.getChildren().isEmpty()) {
+ return item.getChildren().toArray();
+ }
+ }
+ return NO_CHILDREN;
+ }
+
+ public ImageDescriptor getImageDescriptor(Object object) {
+ // no images yet, see bug 260447
+ return null;
+ }
+
+ public String getLabel(Object o) {
+ if (o instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) o;
+ // TODO: bug 260447 remove text prefix when icons become available
+ if (item.getKind() == null) {
+ return item.getLabel();
+ } else {
+ return item.getKind() + ". " + item.getLabel(); //$NON-NLS-1$
+ }
+ }
+ return null;
+ }
+
+ public Object getParent(Object o) {
+ if (o instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) o;
+ return item.getParent();
+ }
+ return null;
+ }
+
+ public static OutlineItemWorkbenchAdapter instance() {
+ return instance;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/PreferenceStoreFacade.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/PreferenceStoreFacade.java
new file mode 100644
index 0000000..631cffd
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/PreferenceStoreFacade.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+
+/**
+ * A preference store that wraps a delegate, typically used to alter preferences based on some external influences (such
+ * as control focus).
+ *
+ * @author David Green
+ */
+public abstract class PreferenceStoreFacade implements IPreferenceStore {
+
+ private final ListenerList listeners = new ListenerList(ListenerList.IDENTITY);
+
+ private IPropertyChangeListener forwardingListener;
+
+ protected IPreferenceStore delegate;
+
+ protected PreferenceStoreFacade(IPreferenceStore preferenceStore) {
+ delegate = preferenceStore;
+ }
+
+ public void addPropertyChangeListener(IPropertyChangeListener listener) {
+ listeners.add(listener);
+ if (forwardingListener == null) {
+ forwardingListener = new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ firePropertyChangeEvent(event.getProperty(), event.getOldValue(), event.getNewValue());
+ }
+ };
+ delegate.addPropertyChangeListener(forwardingListener);
+ }
+ }
+
+ public void removePropertyChangeListener(IPropertyChangeListener listener) {
+ listeners.remove(listener);
+ if (listeners.isEmpty()) {
+ if (forwardingListener != null) {
+ delegate.removePropertyChangeListener(forwardingListener);
+ forwardingListener = null;
+ }
+ }
+ }
+
+ public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+ if (listeners.isEmpty()) {
+ return;
+ }
+ // always get the new value again in case the get methods have been overridden
+ if (newValue instanceof Boolean) {
+ newValue = getBoolean(name);
+ } else if (newValue instanceof Integer) {
+ newValue = getInt(name);
+ } else if (newValue instanceof Long) {
+ newValue = getLong(name);
+ } else if (newValue instanceof Double) {
+ newValue = getDouble(name);
+ } else if (newValue instanceof Float) {
+ newValue = getFloat(name);
+ } else if (newValue instanceof String) {
+ newValue = getString(name);
+ }
+ if (newValue == oldValue || (newValue != null && newValue.equals(oldValue))) {
+ return;
+ }
+ PropertyChangeEvent event = new PropertyChangeEvent(this, name, oldValue, newValue);
+ for (Object o : listeners.getListeners()) {
+ IPropertyChangeListener listener = (IPropertyChangeListener) o;
+ listener.propertyChange(event);
+ }
+ }
+
+ public boolean contains(String name) {
+ return delegate.contains(name);
+ }
+
+ public boolean getBoolean(String name) {
+ return delegate.getBoolean(name);
+ }
+
+ public boolean getDefaultBoolean(String name) {
+ return delegate.getDefaultBoolean(name);
+ }
+
+ public double getDefaultDouble(String name) {
+ return delegate.getDefaultDouble(name);
+ }
+
+ public float getDefaultFloat(String name) {
+ return delegate.getDefaultFloat(name);
+ }
+
+ public int getDefaultInt(String name) {
+ return delegate.getDefaultInt(name);
+ }
+
+ public long getDefaultLong(String name) {
+ return delegate.getDefaultLong(name);
+ }
+
+ public String getDefaultString(String name) {
+ return delegate.getDefaultString(name);
+ }
+
+ public double getDouble(String name) {
+ return delegate.getDouble(name);
+ }
+
+ public float getFloat(String name) {
+ return delegate.getFloat(name);
+ }
+
+ public int getInt(String name) {
+ return delegate.getInt(name);
+ }
+
+ public long getLong(String name) {
+ return delegate.getLong(name);
+ }
+
+ public String getString(String name) {
+ return delegate.getString(name);
+ }
+
+ public boolean isDefault(String name) {
+ return delegate.isDefault(name);
+ }
+
+ public boolean needsSaving() {
+ return delegate.needsSaving();
+ }
+
+ public void putValue(String name, String value) {
+ delegate.putValue(name, value);
+ }
+
+ public void setDefault(String name, boolean value) {
+ delegate.setDefault(name, value);
+ }
+
+ public void setDefault(String name, double value) {
+ delegate.setDefault(name, value);
+ }
+
+ public void setDefault(String name, float value) {
+ delegate.setDefault(name, value);
+ }
+
+ public void setDefault(String name, int value) {
+ delegate.setDefault(name, value);
+ }
+
+ public void setDefault(String name, long value) {
+ delegate.setDefault(name, value);
+ }
+
+ public void setDefault(String name, String defaultObject) {
+ delegate.setDefault(name, defaultObject);
+ }
+
+ public void setToDefault(String name) {
+ delegate.setToDefault(name);
+ }
+
+ public void setValue(String name, boolean value) {
+ delegate.setValue(name, value);
+ }
+
+ public void setValue(String name, double value) {
+ delegate.setValue(name, value);
+ }
+
+ public void setValue(String name, float value) {
+ delegate.setValue(name, value);
+ }
+
+ public void setValue(String name, int value) {
+ delegate.setValue(name, value);
+ }
+
+ public void setValue(String name, long value) {
+ delegate.setValue(name, value);
+ }
+
+ public void setValue(String name, String value) {
+ delegate.setValue(name, value);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/WikiTextUiResources.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/WikiTextUiResources.java
new file mode 100644
index 0000000..2487eea
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/WikiTextUiResources.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util;
+
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Resources for use by the WikiText UI.
+ *
+ *
+ * @author David Green
+ */
+public class WikiTextUiResources {
+
+ // IMPOARTANT IMPLEMENTATION NOTE:
+ // these resources must work in a stand-alone SWT application. See bug# 245759
+
+ private static final String KEY_COLOR_REGISTRY = WikiTextUiResources.class.getName() + "#colorRegistry"; //$NON-NLS-1$
+
+ /**
+ * the color of a horizontal rule
+ */
+ public static final String COLOR_HR = "HR"; //$NON-NLS-1$
+
+ /**
+ * the color of a horizontal rule shadow
+ */
+ public static final String COLOR_HR_SHADOW = "HR_SHADOW"; //$NON-NLS-1$
+
+ /**
+ * get colors for use in the UI
+ *
+ * @see #COLOR_HR
+ * @see #COLOR_HR_SHADOW
+ */
+ public static ColorRegistry getColors() {
+ ColorRegistry colorRegistry = (ColorRegistry) Display.getCurrent().getData(KEY_COLOR_REGISTRY);
+ if (colorRegistry == null) {
+ colorRegistry = new ColorRegistry();
+
+ colorRegistry.put(COLOR_HR, new RGB(132, 132, 132));
+ colorRegistry.put(COLOR_HR_SHADOW, new RGB(206, 206, 206));
+
+ Display.getCurrent().setData(KEY_COLOR_REGISTRY, colorRegistry);
+ }
+ return colorRegistry;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/Colors.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/Colors.java
new file mode 100644
index 0000000..5e43c44
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/Colors.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ *
+ * @author David Green
+ */
+class Colors {
+
+ static final RGB RGB_DEFAULT = new RGB(0, 0, 0);
+
+ static final RGB RGB_COMMENT = new RGB(63, 95, 191);
+
+ static final RGB RGB_SELECTOR = new RGB(42, 129, 128);
+
+ static final RGB RGB_PROPERTY_NAME = new RGB(129, 0, 129);
+
+ static final RGB RGB_PROPERTY_VALUE = new RGB(42, 0, 225);
+
+ static final Map<String, RGB> keyToRgb;
+
+ public static final String KEY_DEFAULT = "css.default"; //$NON-NLS-1$
+
+ public static final String KEY_COMMENT = "css.comment"; //$NON-NLS-1$
+
+ public static final String KEY_SELECTOR = "css.selector"; //$NON-NLS-1$
+
+ public static final String KEY_PROPERTY_NAME = "css.property.name"; //$NON-NLS-1$
+
+ public static final String KEY_PROPERTY_VALUE = "css.property.value"; //$NON-NLS-1$
+
+ static {
+ Map<String, RGB> tempKeyToRgb = new HashMap<String, RGB>();
+ tempKeyToRgb.put(KEY_DEFAULT, RGB_DEFAULT);
+ tempKeyToRgb.put(KEY_COMMENT, RGB_COMMENT);
+ tempKeyToRgb.put(KEY_SELECTOR, RGB_SELECTOR);
+ tempKeyToRgb.put(KEY_PROPERTY_NAME, RGB_PROPERTY_NAME);
+ tempKeyToRgb.put(KEY_PROPERTY_VALUE, RGB_PROPERTY_VALUE);
+ keyToRgb = Collections.unmodifiableMap(tempKeyToRgb);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CommentDamagerRepairer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CommentDamagerRepairer.java
new file mode 100644
index 0000000..9dc337f
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CommentDamagerRepairer.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.presentation.IPresentationDamager;
+import org.eclipse.jface.text.presentation.IPresentationRepairer;
+import org.eclipse.swt.custom.StyleRange;
+
+/**
+ *
+ * based on the XML editor example
+ *
+ * @author David Green
+ */
+class CommentDamagerRepairer implements IPresentationDamager, IPresentationRepairer {
+
+ private IDocument document;
+
+ private final TextAttribute defaultTextAttribute;
+
+ public CommentDamagerRepairer(TextAttribute defaultTextAttribute) {
+ super();
+ this.defaultTextAttribute = defaultTextAttribute;
+ }
+
+ public IRegion getDamageRegion(ITypedRegion partition, DocumentEvent event, boolean documentPartitioningChanged) {
+ if (!documentPartitioningChanged) {
+ try {
+ IRegion lineRegion = document.getLineInformationOfOffset(event.getOffset());
+ int start = Math.max(lineRegion.getOffset(), partition.getOffset());
+ int end = event.getOffset();
+ if (event.getText() == null) {
+ end += event.getLength();
+ } else {
+ end += event.getText().length();
+ }
+ if (lineRegion.getOffset() <= end && end <= lineRegion.getOffset() + lineRegion.getLength()) {
+ // same line
+ end = lineRegion.getOffset() + lineRegion.getLength();
+ } else {
+ end = toLineEnd(end);
+ }
+ int partitionEnd = partition.getOffset() + partition.getLength();
+ end = Math.min(partitionEnd, end);
+ return new Region(start, end - start);
+ } catch (BadLocationException e) {
+ // ignore
+ }
+ }
+ return partition;
+ }
+
+ /**
+ * return the offset of the end of the line, or if the offset includes a line terminator then the end of the next
+ * line.
+ */
+ private int toLineEnd(int offset) throws BadLocationException {
+ IRegion lineRegion = document.getLineInformationOfOffset(offset);
+ int lineEndOffset = lineRegion.getOffset() + lineRegion.getLength();
+ if (offset <= lineEndOffset) {
+ return lineEndOffset;
+ }
+
+ int line = document.getLineOfOffset(offset);
+ try {
+ lineRegion = document.getLineInformation(line + 1);
+ lineEndOffset = lineRegion.getOffset() + lineRegion.getLength();
+ return lineEndOffset;
+ } catch (BadLocationException x) {
+ return document.getLength();
+ }
+ }
+
+ public void setDocument(IDocument document) {
+ this.document = document;
+ }
+
+ public void createPresentation(TextPresentation presentation, ITypedRegion damage) {
+ presentation.addStyleRange(new StyleRange(damage.getOffset(), damage.getLength(),
+ defaultTextAttribute.getForeground(), defaultTextAttribute.getBackground(),
+ defaultTextAttribute.getStyle()));
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CommentRule.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CommentRule.java
new file mode 100644
index 0000000..4b60092
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CommentRule.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ * detects property name by finding word characters that are terminated by whitespace followed by a colon. the trailing
+ * colon is not included in the name.
+ *
+ * @author David Green
+ */
+class CommentRule implements IRule, IPredicateRule {
+
+ private final Token token;
+
+ private int readCount = 0;
+
+ public CommentRule(Token token) {
+ this.token = token;
+ }
+
+ public IToken evaluate(ICharacterScanner scanner) {
+ return evaluate(scanner, false);
+ }
+
+ public IToken evaluate(ICharacterScanner scanner, boolean resume) {
+ readCount = 0;
+ if (resume) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ } else {
+ if (startSequenceDetected(scanner)) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ }
+ }
+ while (readCount > 0) {
+ --readCount;
+ scanner.unread();
+ }
+ return Token.UNDEFINED;
+ }
+
+ private boolean endSequenceDetected(ICharacterScanner scanner) {
+ int previous = -1;
+ int read = read(scanner);
+ for (;; read = read(scanner)) {
+ if (read == ICharacterScanner.EOF) {
+ scanner.unread();
+ --readCount;
+ return true;
+ }
+ if (previous == '*' && read == '/') {
+ return true;
+ }
+ }
+ }
+
+ private boolean startSequenceDetected(ICharacterScanner scanner) {
+ int read = read(scanner);
+ if (read == '/') {
+ read = read(scanner);
+ return read == '*';
+ }
+ return false;
+ }
+
+ private int read(ICharacterScanner scanner) {
+ ++readCount;
+ return scanner.read();
+ }
+
+ public IToken getSuccessToken() {
+ return token;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssBlockScanner.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssBlockScanner.java
new file mode 100644
index 0000000..da317b1
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssBlockScanner.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.rules.WhitespaceRule;
+
+/**
+ *
+ * @author David Green
+ */
+public class CssBlockScanner extends RuleBasedScanner {
+
+ public CssBlockScanner(ColorRegistry colorRegistry) {
+ setRules(new IRule[] {
+ //
+ new CommentRule(new Token(new TextAttribute(colorRegistry.get(Colors.KEY_COMMENT)))),
+ new PropertyNameRule(new Token(new TextAttribute(colorRegistry.get(Colors.KEY_PROPERTY_NAME)))),
+ new PropertyValueRule(new Token(new TextAttribute(colorRegistry.get(Colors.KEY_PROPERTY_VALUE)))),
+ new WhitespaceRule(new CssWhitespaceDetector()) });
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssConfiguration.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssConfiguration.java
new file mode 100644
index 0000000..8dc22f6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssConfiguration.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import java.util.Map;
+
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.ITokenScanner;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ * A configuration for editing CSS
+ *
+ * @author David Green
+ */
+public class CssConfiguration extends SourceViewerConfiguration {
+
+ private final ColorRegistry colorRegistry;
+
+ public CssConfiguration(ColorRegistry colorRegistry) {
+ this.colorRegistry = colorRegistry;
+ for (Map.Entry<String, RGB> colorEnt : Colors.keyToRgb.entrySet()) {
+ colorRegistry.put(colorEnt.getKey(), colorEnt.getValue());
+ }
+ }
+
+ @Override
+ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+ return new String[] { IDocument.DEFAULT_CONTENT_TYPE, CssPartitionScanner.CONTENT_TYPE_COMMENT,
+ CssPartitionScanner.CONTENT_TYPE_BLOCK };
+ }
+
+ @Override
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+ PresentationReconciler reconciler = new PresentationReconciler();
+
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getCssTokenScanner());
+ reconciler.setDamager(dr, CssPartitionScanner.CONTENT_TYPE_BLOCK);
+ reconciler.setRepairer(dr, CssPartitionScanner.CONTENT_TYPE_BLOCK);
+
+ dr = new DefaultDamagerRepairer(getCssScanner());
+ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+
+ CommentDamagerRepairer commentDamagerRepairer = new CommentDamagerRepairer(new TextAttribute(
+ colorRegistry.get(Colors.KEY_COMMENT)));
+ reconciler.setDamager(commentDamagerRepairer, CssPartitionScanner.CONTENT_TYPE_COMMENT);
+ reconciler.setRepairer(commentDamagerRepairer, CssPartitionScanner.CONTENT_TYPE_COMMENT);
+
+ return reconciler;
+ }
+
+ private ITokenScanner getCssScanner() {
+ return new CssScanner(colorRegistry);
+ }
+
+ private ITokenScanner getCssTokenScanner() {
+ return new CssBlockScanner(colorRegistry);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssPartitionScanner.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssPartitionScanner.java
new file mode 100644
index 0000000..3b625fe
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssPartitionScanner.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.MultiLineRule;
+import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ *
+ * @author David Green
+ */
+class CssPartitionScanner extends RuleBasedPartitionScanner {
+ public final static String CONTENT_TYPE_COMMENT = "__css_comment"; //$NON-NLS-1$
+
+ public final static String CONTENT_TYPE_BLOCK = "__css_block"; //$NON-NLS-1$
+
+ public CssPartitionScanner() {
+
+ setPredicateRules(new IPredicateRule[] {
+ //
+ new MultiLineRule("/*", "*/", new Token(CONTENT_TYPE_COMMENT)), //$NON-NLS-1$ //$NON-NLS-2$
+ new MultiLineRule("{", "}", new Token(CONTENT_TYPE_BLOCK)), //$NON-NLS-1$ //$NON-NLS-2$
+ });
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssPartitioner.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssPartitioner.java
new file mode 100644
index 0000000..8702893
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssPartitioner.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.FastPartitioner;
+
+/**
+ *
+ * @author David Green
+ */
+public class CssPartitioner extends FastPartitioner {
+
+ public CssPartitioner() {
+ super(new CssPartitionScanner(), new String[] { CssPartitionScanner.CONTENT_TYPE_BLOCK,
+ CssPartitionScanner.CONTENT_TYPE_COMMENT });
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssScanner.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssScanner.java
new file mode 100644
index 0000000..f5733b7
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssScanner.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.rules.WhitespaceRule;
+
+/**
+ *
+ * @author David Green
+ */
+public class CssScanner extends RuleBasedScanner {
+
+ public CssScanner(ColorRegistry colorRegistry) {
+ setRules(new IRule[] {
+ //
+ new SelectorRule(new Token(new TextAttribute(colorRegistry.get(Colors.KEY_SELECTOR)))),
+ new WhitespaceRule(new CssWhitespaceDetector()) });
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssWhitespaceDetector.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssWhitespaceDetector.java
new file mode 100644
index 0000000..b9fd311
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/CssWhitespaceDetector.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.IWhitespaceDetector;
+
+/**
+ *
+ * @author David Green
+ */
+public class CssWhitespaceDetector implements IWhitespaceDetector {
+ public boolean isWhitespace(char c) {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/PropertyNameRule.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/PropertyNameRule.java
new file mode 100644
index 0000000..b5b6117
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/PropertyNameRule.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ * detects property name by finding word characters that are terminated by whitespace followed by a colon. the trailing
+ * colon is not included in the name.
+ *
+ * @author David Green
+ */
+class PropertyNameRule implements IRule, IPredicateRule {
+
+ private final Token token;
+
+ private int readCount = 0;
+
+ public PropertyNameRule(Token token) {
+ this.token = token;
+ }
+
+ public IToken evaluate(ICharacterScanner scanner) {
+ return evaluate(scanner, false);
+ }
+
+ public IToken evaluate(ICharacterScanner scanner, boolean resume) {
+ readCount = 0;
+ if (resume) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ } else {
+ if (startSequenceDetected(scanner)) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ }
+ }
+ while (readCount > 0) {
+ --readCount;
+ scanner.unread();
+ }
+ return Token.UNDEFINED;
+ }
+
+ private boolean endSequenceDetected(ICharacterScanner scanner) {
+ // must hit EOF or ':' but not ';' '{' '}' '/' or '*'
+ int read = read(scanner);
+ for (;; read = read(scanner)) {
+ if (read == ICharacterScanner.EOF || read == ':') {
+ scanner.unread();
+ --readCount;
+ return true;
+ }
+ if (read == ';' || read == '{' || read == '}' || read == '/' || read == '*') {
+ return false;
+ }
+ }
+ }
+
+ private boolean startSequenceDetected(ICharacterScanner scanner) {
+ int read = read(scanner);
+ if (isWordChar(read)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isWordChar(int read) {
+ return read != ICharacterScanner.EOF && read != '{' && read != '}' && read != ':' && read != ';' && read != '/'
+ && read != '*' && read != ',' && !Character.isWhitespace(read);
+ }
+
+ private int read(ICharacterScanner scanner) {
+ ++readCount;
+ return scanner.read();
+ }
+
+ public IToken getSuccessToken() {
+ return token;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/PropertyValueRule.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/PropertyValueRule.java
new file mode 100644
index 0000000..697ea0e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/PropertyValueRule.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ * detects property value by finding word characters that are terminated by whitespace followed by a semi-colon. the
+ * trailing semi-colon are not included.
+ *
+ * @author David Green
+ */
+class PropertyValueRule implements IRule, IPredicateRule {
+
+ private final Token token;
+
+ private int readCount = 0;
+
+ public PropertyValueRule(Token token) {
+ this.token = token;
+ }
+
+ public IToken evaluate(ICharacterScanner scanner) {
+ return evaluate(scanner, false);
+ }
+
+ public IToken evaluate(ICharacterScanner scanner, boolean resume) {
+ readCount = 0;
+ if (resume) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ } else {
+ if (startSequenceDetected(scanner)) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ }
+ }
+ while (readCount > 0) {
+ --readCount;
+ scanner.unread();
+ }
+ return Token.UNDEFINED;
+ }
+
+ private boolean endSequenceDetected(ICharacterScanner scanner) {
+ // must hit EOF ';' '}' but not ':' '{' '/' or '*'
+ int read = read(scanner);
+ for (;; read = read(scanner)) {
+ if (read == ICharacterScanner.EOF || read == ';' || read == '}') {
+ scanner.unread();
+ --readCount;
+ return true;
+ }
+ if (read == ':' || read == '{' || read == '/' || read == '*') {
+ return false;
+ }
+ }
+ }
+
+ private boolean startSequenceDetected(ICharacterScanner scanner) {
+ int read = read(scanner);
+ if (isWordChar(read)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isWordChar(int read) {
+ return read != ICharacterScanner.EOF && read != '{' && read != '}' && read != ':' && read != ';' && read != '/'
+ && read != '*' && !Character.isWhitespace(read);
+ }
+
+ private int read(ICharacterScanner scanner) {
+ ++readCount;
+ return scanner.read();
+ }
+
+ public IToken getSuccessToken() {
+ return token;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/SelectorRule.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/SelectorRule.java
new file mode 100644
index 0000000..fba2395
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/SelectorRule.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ * detects CSS selectors
+ *
+ * @author David Green
+ */
+class SelectorRule implements IRule, IPredicateRule {
+
+ private final Token token;
+
+ private int readCount = 0;
+
+ public SelectorRule(Token token) {
+ this.token = token;
+ }
+
+ public IToken evaluate(ICharacterScanner scanner) {
+ return evaluate(scanner, false);
+ }
+
+ public IToken evaluate(ICharacterScanner scanner, boolean resume) {
+ readCount = 0;
+ if (resume) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ } else {
+ if (startSequenceDetected(scanner)) {
+ if (endSequenceDetected(scanner)) {
+ return token;
+ }
+ }
+ }
+ while (readCount > 0) {
+ --readCount;
+ scanner.unread();
+ }
+ return Token.UNDEFINED;
+ }
+
+ private boolean endSequenceDetected(ICharacterScanner scanner) {
+ // must hit EOF or ':' but not ';' '{' '}' '/' or '*'
+ int read = read(scanner);
+ for (;; read = read(scanner)) {
+ if (read == ICharacterScanner.EOF || read == '/' || read == '{' || read == '}') {
+ scanner.unread();
+ --readCount;
+ return true;
+ }
+ if (read == '{' || read == '}' || read == '/') {
+ return false;
+ }
+ }
+ }
+
+ private boolean startSequenceDetected(ICharacterScanner scanner) {
+ int read = read(scanner);
+ if (isWordChar(read)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isWordChar(int read) {
+ return read != ICharacterScanner.EOF && read != '{' && read != '}' && read != '/'
+ && !Character.isWhitespace(read);
+ }
+
+ private int read(ICharacterScanner scanner) {
+ ++readCount;
+ return scanner.read();
+ }
+
+ public IToken getSuccessToken() {
+ return token;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/package-info.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/package-info.java
new file mode 100644
index 0000000..5b33f65
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/css/editor/package-info.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+/**
+ * The basics for CSS partitioning and highlighting. Use with a SourceViewer as follows:
+ *
+ * <pre>
+ Document document = new Document();
+ CssPartitioner partitioner = new CssPartitioner();
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ sourceViewer.setDocument(document);
+
+ CssConfiguration configuration = new CssConfiguration(colorRegistry);
+ sourceViewer.configure(configuration);
+ * </pre>
+ *
+ * @see CssConfiguration
+ * @see CssPartitioner
+ *
+ * @author David Green
+ */
+package org.eclipse.mylyn.internal.wikitext.ui.util.css.editor;
+
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/resources/missing-image.png b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/resources/missing-image.png
new file mode 100644
index 0000000..0d07354
Binary files /dev/null and b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/util/resources/missing-image.png differ
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/Messages.java
new file mode 100644
index 0000000..eb9ba5c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/Messages.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.validation;
+
+import org.eclipse.osgi.util.NLS;
+
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.validation.messages"; //$NON-NLS-1$
+
+ public static String ValidationProjectBuilder_validatingFileTask;
+
+ public static String ValidationProjectBuilder_validationTask;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/ValidationProjectBuilder.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/ValidationProjectBuilder.java
new file mode 100644
index 0000000..fc94419
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/ValidationProjectBuilder.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.validation;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Region;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.validation.ResourceMarkerMarkupValidator;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.validation.ValidationProblem;
+import org.eclipse.osgi.util.NLS;
+
+
+
+/**
+ * A project builder that invokes validation on wikitext files
+ *
+ * @author David Green
+ */
+public class ValidationProjectBuilder extends IncrementalProjectBuilder {
+
+ public static final String ID = "org.eclipse.mylyn.wikitext.ui.wikiTextValidationBuilder"; //$NON-NLS-1$
+
+ private static final IProject[] NO_PROJECTS = new IProject[0];
+
+ private static int CHECK_ANCESTORS;
+
+ private static Method RESOURCE_DERIVED_WITH_FLAGS_METHOD;
+ static {
+ try {
+ CHECK_ANCESTORS = ((Integer) IResource.class.getDeclaredField("CHECK_ANCESTORS").get(null)).intValue(); //$NON-NLS-1$
+ } catch (Exception e) {
+ CHECK_ANCESTORS = 0;
+ }
+ try {
+ RESOURCE_DERIVED_WITH_FLAGS_METHOD = IResource.class.getDeclaredMethod("isDerived", //$NON-NLS-1$
+ new Class[] { int.class });
+ } catch (Exception e) {
+ RESOURCE_DERIVED_WITH_FLAGS_METHOD = null;
+ }
+ }
+
+ public ValidationProjectBuilder() {
+ }
+
+ @Override
+ protected void clean(IProgressMonitor monitor) throws CoreException {
+ getProject().deleteMarkers(ValidationProblem.DEFAULT_MARKER_ID, true, IResource.DEPTH_INFINITE);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+ IProject project = getProject();
+ IResourceDelta resourceDelta = getDelta(project);
+
+ // find files that need validating. We do this first so that we can accurately represent progress
+ List<ValidationInfo> files = null;
+ if ((kind != IncrementalProjectBuilder.INCREMENTAL_BUILD && kind != IncrementalProjectBuilder.AUTO_BUILD)
+ || resourceDelta == null) {
+ files = collect(project, monitor);
+ } else {
+ files = collect(resourceDelta, monitor);
+ }
+ // validate if needed
+ if (files != null && !files.isEmpty() && !isInterrupted() && !monitor.isCanceled()) {
+ validate(files, monitor);
+ }
+ // be sure to cancel properly so that calling mechanisms will know
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ return NO_PROJECTS;
+ }
+
+ private static class ValidationInfo {
+ private final IFile file;
+
+ private final String languageName;
+
+ public ValidationInfo(IFile file, String languageName) {
+ this.file = file;
+ this.languageName = languageName;
+ }
+ }
+
+ /**
+ * collect resources for validation from a resource delta
+ */
+ private List<ValidationInfo> collect(IResourceDelta resourceDelta, final IProgressMonitor monitor)
+ throws CoreException {
+ final List<ValidationInfo> files = new ArrayList<ValidationInfo>();
+
+ resourceDelta.accept(new IResourceDeltaVisitor() {
+
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ if (isInterrupted()) {
+ return false;
+ }
+ IResource resource = delta.getResource();
+ if (resource instanceof IFile) {
+ if ((delta.getKind() & (IResourceDelta.ADDED | IResourceDelta.CHANGED)) != 0) {
+ IFile file = (IFile) resource;
+ ValidationProjectBuilder.this.visit(files, file);
+ }
+ } else if (resource instanceof IContainer) {
+ if (filtered((IContainer) resource)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ });
+ return files;
+ }
+
+ private List<ValidationInfo> collect(IProject project, final IProgressMonitor monitor) throws CoreException {
+ final List<ValidationInfo> files = new ArrayList<ValidationInfo>();
+ project.accept(new IResourceVisitor() {
+
+ public boolean visit(IResource resource) throws CoreException {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ if (isInterrupted()) {
+ return false;
+ }
+ if (resource instanceof IFile) {
+ IFile file = (IFile) resource;
+ ValidationProjectBuilder.this.visit(files, file);
+ } else if (resource instanceof IContainer) {
+ if (filtered((IContainer) resource)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ });
+ return files;
+ }
+
+ private boolean filtered(IContainer container) {
+ // TODO: filter output folders
+ return false;
+ }
+
+ private void visit(final List<ValidationInfo> files, IFile file) {
+ boolean derived = false;
+ // bug 258154 - avoid 3.4 API compilation dependency
+ if (RESOURCE_DERIVED_WITH_FLAGS_METHOD != null) {
+ try {
+ derived = ((Boolean) RESOURCE_DERIVED_WITH_FLAGS_METHOD.invoke(file, CHECK_ANCESTORS));
+ } catch (Exception e) {
+ derived = file.isDerived();
+ }
+ } else {
+ derived = file.isDerived();
+ }
+ if (derived) {
+ return;
+ }
+ // only validate files for which there is a known language
+ String language = getMarkupLanguageForFile(file);
+ if (language != null) {
+ files.add(new ValidationInfo(file, language));
+ }
+ }
+
+ private void validate(List<ValidationInfo> files, IProgressMonitor monitor) throws CoreException {
+ if (files.isEmpty()) {
+ return;
+ }
+ final int factor = 1000;
+ monitor.beginTask(Messages.ValidationProjectBuilder_validationTask, files.size() * factor);
+ for (ValidationInfo file : files) {
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ if (isInterrupted()) {
+ break;
+ }
+ validate(file, new SubProgressMonitor(monitor, factor));
+ }
+ monitor.done();
+ }
+
+ /**
+ * validate a single file
+ */
+ private void validate(ValidationInfo file, IProgressMonitor monitor) throws CoreException {
+ int totalWork = 1000;
+ monitor.beginTask(NLS.bind(
+ Messages.ValidationProjectBuilder_validatingFileTask, new Object[] { file.file.getName() }), totalWork);
+ ResourceMarkerMarkupValidator validator = new ResourceMarkerMarkupValidator();
+ validator.setMarkupLanguage(WikiText.getMarkupLanguage(file.languageName));
+ validator.setResource(file.file);
+
+ if (validator.getMarkupLanguage() != null) {
+ StringWriter writer = new StringWriter();
+ String charset = file.file.getCharset();
+ try {
+ Reader reader = charset == null ? new InputStreamReader(
+ new BufferedInputStream(file.file.getContents())) : new InputStreamReader(
+ new BufferedInputStream(file.file.getContents()), charset);
+ try {
+ int c;
+ while ((c = reader.read()) != -1) {
+ writer.append((char) c);
+ }
+ } finally {
+ reader.close();
+ }
+ } catch (IOException ioe) {
+ throw new CoreException(WikiTextUiPlugin.getDefault().createStatus(IStatus.ERROR, ioe));
+ }
+ monitor.worked(totalWork / 2);
+ IDocument document = new Document(writer.toString());
+ validator.validate(new SubProgressMonitor(monitor, totalWork / 2), document, new Region(0,
+ document.getLength()));
+ }
+ monitor.done();
+ }
+
+ private String getMarkupLanguageForFile(IFile file) {
+ String language = MarkupEditor.getMarkupLanguagePreference(file);
+ if (language == null) {
+ language = WikiText.getMarkupLanguageNameForFilename(file.getName());
+ }
+ return language;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/messages.properties
new file mode 100644
index 0000000..5b8775a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/validation/messages.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+ValidationProjectBuilder_validatingFileTask=Validating file {0}
+ValidationProjectBuilder_validationTask=WikiText Validation
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/AnnotationHyperlinkDetector.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/AnnotationHyperlinkDetector.java
new file mode 100644
index 0000000..b3ff88d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/AnnotationHyperlinkDetector.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.URLHyperlink;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.wikitext.ui.annotation.AnchorHrefAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.AnchorNameAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.IdAnnotation;
+
+public class AnnotationHyperlinkDetector implements IHyperlinkDetector {
+
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+ if (textViewer instanceof ISourceViewer) {
+
+ // Note: only find hyperlinks that include the region end point, otherwise we may get hyperlinks that
+ // are not even relevant.
+ int interestingOffset = region.getOffset() + region.getLength();
+
+ ISourceViewer sourceViewer = (ISourceViewer) textViewer;
+ IAnnotationModel annotationModel = sourceViewer.getAnnotationModel();
+ if (annotationModel != null) {
+ List<AnchorHrefAnnotation> hrefs = null;
+ Iterator<?> iterator = annotationModel.getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation annotation = (Annotation) iterator.next();
+ if (annotation instanceof AnchorHrefAnnotation) {
+ AnchorHrefAnnotation href = (AnchorHrefAnnotation) annotation;
+ Position position = annotationModel.getPosition(href);
+ if (position.getOffset() <= interestingOffset
+ && position.getOffset() + position.getLength() >= interestingOffset) {
+ if (hrefs == null) {
+ hrefs = new ArrayList<AnchorHrefAnnotation>();
+ }
+ hrefs.add(href);
+ }
+ }
+ }
+ if (hrefs != null) {
+ if (hrefs.size() > 1) {
+ // put greatest offset annotations first.
+ Collections.sort(hrefs, new OffsetComparator(annotationModel));
+ }
+ return new IHyperlink[] { createHyperlink(sourceViewer, annotationModel, hrefs.get(0)) };
+ }
+ }
+ }
+ return null;
+ }
+
+ protected IHyperlink createHyperlink(ISourceViewer viewer, IAnnotationModel annotationModel,
+ AnchorHrefAnnotation anchorHrefAnnotation) {
+ Position position = annotationModel.getPosition(anchorHrefAnnotation);
+ IRegion region = new Region(position.getOffset(), position.getLength());
+ String href = anchorHrefAnnotation.getAnchorHref();
+ if (href != null && href.startsWith("#")) { //$NON-NLS-1$
+ return new DocumentHyperlink(viewer, region, href);
+ } else {
+ return createUrlHyperlink(region, href);
+ }
+ }
+
+ protected IHyperlink createUrlHyperlink(IRegion region, String href) {
+ return new URLHyperlink(region, href);
+ }
+
+ /**
+ * a comparator that puts greatest offset annotations first
+ */
+ private static class OffsetComparator implements Comparator<Annotation> {
+
+ private final IAnnotationModel annotationModel;
+
+ public OffsetComparator(IAnnotationModel annotationModel) {
+ this.annotationModel = annotationModel;
+ }
+
+ public int compare(Annotation o1, Annotation o2) {
+ if (o1 == o2) {
+ return 0;
+ }
+ Position p1 = annotationModel.getPosition(o1);
+ Position p2 = annotationModel.getPosition(o2);
+ if (p1.getOffset() > p2.getOffset()) {
+ return -1;
+ } else if (p2.getOffset() > p1.getOffset()) {
+ return 1;
+ } else {
+ if (p1.getLength() > p2.getLength()) {
+ return -1;
+ } else if (p2.getLength() > p1.getLength()) {
+ return 1;
+ }
+ return new Integer(System.identityHashCode(p1)).compareTo(System.identityHashCode(p2));
+ }
+ }
+
+ }
+
+ /**
+ * A hyperlink implementation that causes the viewer's selection (and scrolling) to adjust to the hyperlink target.
+ *
+ * @author David Green
+ *
+ */
+ protected static class DocumentHyperlink implements IHyperlink {
+
+ private final ISourceViewer viewer;
+
+ private final IRegion region;
+
+ private final String href;
+
+ public DocumentHyperlink(ISourceViewer viewer, IRegion region, String href) {
+ this.viewer = viewer;
+ this.region = region;
+ this.href = href;
+ }
+
+ public IRegion getHyperlinkRegion() {
+ return region;
+ }
+
+ public String getHyperlinkText() {
+ return null;
+ }
+
+ public String getTypeLabel() {
+ return null;
+ }
+
+ public void open() {
+ String lookingFor = href.substring(1); // lose the leading '#'
+
+ IAnnotationModel annotationModel = viewer.getAnnotationModel();
+ Iterator<?> iterator = annotationModel.getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation annotation = (Annotation) iterator.next();
+ if (annotation instanceof IdAnnotation) {
+ IdAnnotation idAnnotation = (IdAnnotation) annotation;
+ if (!idAnnotation.getElementId().equals(lookingFor)) {
+ continue;
+ }
+ } else if (annotation instanceof AnchorNameAnnotation) {
+ AnchorNameAnnotation nameAnnotation = (AnchorNameAnnotation) annotation;
+ if (!nameAnnotation.getAnchorName().equals(lookingFor)) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ Position position = annotationModel.getPosition(annotation);
+ viewer.getTextWidget().setSelection(position.getOffset());
+ break;
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/CssStyleManager.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/CssStyleManager.java
new file mode 100644
index 0000000..d6facc8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/CssStyleManager.java
@@ -0,0 +1,660 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ * Interprets CSS styles and applies them to a default font and a {@link FontState}, creating a {@link StyleRange}.
+ *
+ * @author David Green
+ */
+public class CssStyleManager {
+
+ public static final String RULE_VERTICAL_ALIGN = "vertical-align"; //$NON-NLS-1$
+
+ public static final String RULE_TEXT_DECORATION = "text-decoration"; //$NON-NLS-1$
+
+ public static final String RULE_FONT_FAMILY = "font-family"; //$NON-NLS-1$
+
+ public static final String RULE_FONT_SIZE = "font-size"; //$NON-NLS-1$
+
+ public static final String RULE_FONT_WEIGHT = "font-weight"; //$NON-NLS-1$
+
+ public static final String RULE_FONT_STYLE = "font-style"; //$NON-NLS-1$
+
+ public static final String RULE_BACKGROUND_COLOR = "background-color"; //$NON-NLS-1$
+
+ public static final String RULE_COLOR = "color"; //$NON-NLS-1$
+
+ private static final int MIN_FONT_SIZE = 9;
+
+ private static final int MAX_FONT_SIZE = 50;
+
+ private static final Map<String, Integer> colorToRgb = new HashMap<String, Integer>();
+ static {
+ colorToRgb.put("AliceBlue".toLowerCase(), 0xF0F8FF); //$NON-NLS-1$
+ colorToRgb.put("AntiqueWhite".toLowerCase(), 0xFAEBD7); //$NON-NLS-1$
+ colorToRgb.put("Aqua".toLowerCase(), 0x00FFFF); //$NON-NLS-1$
+ colorToRgb.put("Aquamarine".toLowerCase(), 0x7FFFD4); //$NON-NLS-1$
+ colorToRgb.put("Azure".toLowerCase(), 0xF0FFFF); //$NON-NLS-1$
+ colorToRgb.put("Beige".toLowerCase(), 0xF5F5DC); //$NON-NLS-1$
+ colorToRgb.put("Bisque".toLowerCase(), 0xFFE4C4); //$NON-NLS-1$
+ colorToRgb.put("Black".toLowerCase(), 0x000000); //$NON-NLS-1$
+ colorToRgb.put("BlanchedAlmond".toLowerCase(), 0xFFEBCD); //$NON-NLS-1$
+ colorToRgb.put("Blue".toLowerCase(), 0x0000FF); //$NON-NLS-1$
+ colorToRgb.put("BlueViolet".toLowerCase(), 0x8A2BE2); //$NON-NLS-1$
+ colorToRgb.put("Brown".toLowerCase(), 0xA52A2A); //$NON-NLS-1$
+ colorToRgb.put("BurlyWood".toLowerCase(), 0xDEB887); //$NON-NLS-1$
+ colorToRgb.put("CadetBlue".toLowerCase(), 0x5F9EA0); //$NON-NLS-1$
+ colorToRgb.put("Chartreuse".toLowerCase(), 0x7FFF00); //$NON-NLS-1$
+ colorToRgb.put("Chocolate".toLowerCase(), 0xD2691E); //$NON-NLS-1$
+ colorToRgb.put("Coral".toLowerCase(), 0xFF7F50); //$NON-NLS-1$
+ colorToRgb.put("CornflowerBlue".toLowerCase(), 0x6495ED); //$NON-NLS-1$
+ colorToRgb.put("Cornsilk".toLowerCase(), 0xFFF8DC); //$NON-NLS-1$
+ colorToRgb.put("Crimson".toLowerCase(), 0xDC143C); //$NON-NLS-1$
+ colorToRgb.put("Cyan".toLowerCase(), 0x00FFFF); //$NON-NLS-1$
+ colorToRgb.put("DarkBlue".toLowerCase(), 0x00008B); //$NON-NLS-1$
+ colorToRgb.put("DarkCyan".toLowerCase(), 0x008B8B); //$NON-NLS-1$
+ colorToRgb.put("DarkGoldenRod".toLowerCase(), 0xB8860B); //$NON-NLS-1$
+ colorToRgb.put("DarkGray".toLowerCase(), 0xA9A9A9); //$NON-NLS-1$
+ colorToRgb.put("DarkGrey".toLowerCase(), 0xA9A9A9); //$NON-NLS-1$
+ colorToRgb.put("DarkGreen".toLowerCase(), 0x006400); //$NON-NLS-1$
+ colorToRgb.put("DarkKhaki".toLowerCase(), 0xBDB76B); //$NON-NLS-1$
+ colorToRgb.put("DarkMagenta".toLowerCase(), 0x8B008B); //$NON-NLS-1$
+ colorToRgb.put("DarkOliveGreen".toLowerCase(), 0x556B2F); //$NON-NLS-1$
+ colorToRgb.put("Darkorange".toLowerCase(), 0xFF8C00); //$NON-NLS-1$
+ colorToRgb.put("DarkOrchid".toLowerCase(), 0x9932CC); //$NON-NLS-1$
+ colorToRgb.put("DarkRed".toLowerCase(), 0x8B0000); //$NON-NLS-1$
+ colorToRgb.put("DarkSalmon".toLowerCase(), 0xE9967A); //$NON-NLS-1$
+ colorToRgb.put("DarkSeaGreen".toLowerCase(), 0x8FBC8F); //$NON-NLS-1$
+ colorToRgb.put("DarkSlateBlue".toLowerCase(), 0x483D8B); //$NON-NLS-1$
+ colorToRgb.put("DarkSlateGray".toLowerCase(), 0x2F4F4F); //$NON-NLS-1$
+ colorToRgb.put("DarkSlateGrey".toLowerCase(), 0x2F4F4F); //$NON-NLS-1$
+ colorToRgb.put("DarkTurquoise".toLowerCase(), 0x00CED1); //$NON-NLS-1$
+ colorToRgb.put("DarkViolet".toLowerCase(), 0x9400D3); //$NON-NLS-1$
+ colorToRgb.put("DeepPink".toLowerCase(), 0xFF1493); //$NON-NLS-1$
+ colorToRgb.put("DeepSkyBlue".toLowerCase(), 0x00BFFF); //$NON-NLS-1$
+ colorToRgb.put("DimGray".toLowerCase(), 0x696969); //$NON-NLS-1$
+ colorToRgb.put("DimGrey".toLowerCase(), 0x696969); //$NON-NLS-1$
+ colorToRgb.put("DodgerBlue".toLowerCase(), 0x1E90FF); //$NON-NLS-1$
+ colorToRgb.put("FireBrick".toLowerCase(), 0xB22222); //$NON-NLS-1$
+ colorToRgb.put("FloralWhite".toLowerCase(), 0xFFFAF0); //$NON-NLS-1$
+ colorToRgb.put("ForestGreen".toLowerCase(), 0x228B22); //$NON-NLS-1$
+ colorToRgb.put("Fuchsia".toLowerCase(), 0xFF00FF); //$NON-NLS-1$
+ colorToRgb.put("Gainsboro".toLowerCase(), 0xDCDCDC); //$NON-NLS-1$
+ colorToRgb.put("GhostWhite".toLowerCase(), 0xF8F8FF); //$NON-NLS-1$
+ colorToRgb.put("Gold".toLowerCase(), 0xFFD700); //$NON-NLS-1$
+ colorToRgb.put("GoldenRod".toLowerCase(), 0xDAA520); //$NON-NLS-1$
+ colorToRgb.put("Gray".toLowerCase(), 0x808080); //$NON-NLS-1$
+ colorToRgb.put("Grey".toLowerCase(), 0x808080); //$NON-NLS-1$
+ colorToRgb.put("Green".toLowerCase(), 0x008000); //$NON-NLS-1$
+ colorToRgb.put("GreenYellow".toLowerCase(), 0xADFF2F); //$NON-NLS-1$
+ colorToRgb.put("HoneyDew".toLowerCase(), 0xF0FFF0); //$NON-NLS-1$
+ colorToRgb.put("HotPink".toLowerCase(), 0xFF69B4); //$NON-NLS-1$
+ colorToRgb.put("IndianRed".toLowerCase(), 0xCD5C5C); //$NON-NLS-1$
+ colorToRgb.put("Indigo".toLowerCase(), 0x4B0082); //$NON-NLS-1$
+ colorToRgb.put("Ivory".toLowerCase(), 0xFFFFF0); //$NON-NLS-1$
+ colorToRgb.put("Khaki".toLowerCase(), 0xF0E68C); //$NON-NLS-1$
+ colorToRgb.put("Lavender".toLowerCase(), 0xE6E6FA); //$NON-NLS-1$
+ colorToRgb.put("LavenderBlush".toLowerCase(), 0xFFF0F5); //$NON-NLS-1$
+ colorToRgb.put("LawnGreen".toLowerCase(), 0x7CFC00); //$NON-NLS-1$
+ colorToRgb.put("LemonChiffon".toLowerCase(), 0xFFFACD); //$NON-NLS-1$
+ colorToRgb.put("LightBlue".toLowerCase(), 0xADD8E6); //$NON-NLS-1$
+ colorToRgb.put("LightCoral".toLowerCase(), 0xF08080); //$NON-NLS-1$
+ colorToRgb.put("LightCyan".toLowerCase(), 0xE0FFFF); //$NON-NLS-1$
+ colorToRgb.put("LightGoldenRodYellow".toLowerCase(), 0xFAFAD2); //$NON-NLS-1$
+ colorToRgb.put("LightGray".toLowerCase(), 0xD3D3D3); //$NON-NLS-1$
+ colorToRgb.put("LightGrey".toLowerCase(), 0xD3D3D3); //$NON-NLS-1$
+ colorToRgb.put("LightGreen".toLowerCase(), 0x90EE90); //$NON-NLS-1$
+ colorToRgb.put("LightPink".toLowerCase(), 0xFFB6C1); //$NON-NLS-1$
+ colorToRgb.put("LightSalmon".toLowerCase(), 0xFFA07A); //$NON-NLS-1$
+ colorToRgb.put("LightSeaGreen".toLowerCase(), 0x20B2AA); //$NON-NLS-1$
+ colorToRgb.put("LightSkyBlue".toLowerCase(), 0x87CEFA); //$NON-NLS-1$
+ colorToRgb.put("LightSlateGray".toLowerCase(), 0x778899); //$NON-NLS-1$
+ colorToRgb.put("LightSlateGrey".toLowerCase(), 0x778899); //$NON-NLS-1$
+ colorToRgb.put("LightSteelBlue".toLowerCase(), 0xB0C4DE); //$NON-NLS-1$
+ colorToRgb.put("LightYellow".toLowerCase(), 0xFFFFE0); //$NON-NLS-1$
+ colorToRgb.put("Lime".toLowerCase(), 0x00FF00); //$NON-NLS-1$
+ colorToRgb.put("LimeGreen".toLowerCase(), 0x32CD32); //$NON-NLS-1$
+ colorToRgb.put("Linen".toLowerCase(), 0xFAF0E6); //$NON-NLS-1$
+ colorToRgb.put("Magenta".toLowerCase(), 0xFF00FF); //$NON-NLS-1$
+ colorToRgb.put("Maroon".toLowerCase(), 0x800000); //$NON-NLS-1$
+ colorToRgb.put("MediumAquaMarine".toLowerCase(), 0x66CDAA); //$NON-NLS-1$
+ colorToRgb.put("MediumBlue".toLowerCase(), 0x0000CD); //$NON-NLS-1$
+ colorToRgb.put("MediumOrchid".toLowerCase(), 0xBA55D3); //$NON-NLS-1$
+ colorToRgb.put("MediumPurple".toLowerCase(), 0x9370D8); //$NON-NLS-1$
+ colorToRgb.put("MediumSeaGreen".toLowerCase(), 0x3CB371); //$NON-NLS-1$
+ colorToRgb.put("MediumSlateBlue".toLowerCase(), 0x7B68EE); //$NON-NLS-1$
+ colorToRgb.put("MediumSpringGreen".toLowerCase(), 0x00FA9A); //$NON-NLS-1$
+ colorToRgb.put("MediumTurquoise".toLowerCase(), 0x48D1CC); //$NON-NLS-1$
+ colorToRgb.put("MediumVioletRed".toLowerCase(), 0xC71585); //$NON-NLS-1$
+ colorToRgb.put("MidnightBlue".toLowerCase(), 0x191970); //$NON-NLS-1$
+ colorToRgb.put("MintCream".toLowerCase(), 0xF5FFFA); //$NON-NLS-1$
+ colorToRgb.put("MistyRose".toLowerCase(), 0xFFE4E1); //$NON-NLS-1$
+ colorToRgb.put("Moccasin".toLowerCase(), 0xFFE4B5); //$NON-NLS-1$
+ colorToRgb.put("NavajoWhite".toLowerCase(), 0xFFDEAD); //$NON-NLS-1$
+ colorToRgb.put("Navy".toLowerCase(), 0x000080); //$NON-NLS-1$
+ colorToRgb.put("OldLace".toLowerCase(), 0xFDF5E6); //$NON-NLS-1$
+ colorToRgb.put("Olive".toLowerCase(), 0x808000); //$NON-NLS-1$
+ colorToRgb.put("OliveDrab".toLowerCase(), 0x6B8E23); //$NON-NLS-1$
+ colorToRgb.put("Orange".toLowerCase(), 0xFFA500); //$NON-NLS-1$
+ colorToRgb.put("OrangeRed".toLowerCase(), 0xFF4500); //$NON-NLS-1$
+ colorToRgb.put("Orchid".toLowerCase(), 0xDA70D6); //$NON-NLS-1$
+ colorToRgb.put("PaleGoldenRod".toLowerCase(), 0xEEE8AA); //$NON-NLS-1$
+ colorToRgb.put("PaleGreen".toLowerCase(), 0x98FB98); //$NON-NLS-1$
+ colorToRgb.put("PaleTurquoise".toLowerCase(), 0xAFEEEE); //$NON-NLS-1$
+ colorToRgb.put("PaleVioletRed".toLowerCase(), 0xD87093); //$NON-NLS-1$
+ colorToRgb.put("PapayaWhip".toLowerCase(), 0xFFEFD5); //$NON-NLS-1$
+ colorToRgb.put("PeachPuff".toLowerCase(), 0xFFDAB9); //$NON-NLS-1$
+ colorToRgb.put("Peru".toLowerCase(), 0xCD853F); //$NON-NLS-1$
+ colorToRgb.put("Pink".toLowerCase(), 0xFFC0CB); //$NON-NLS-1$
+ colorToRgb.put("Plum".toLowerCase(), 0xDDA0DD); //$NON-NLS-1$
+ colorToRgb.put("PowderBlue".toLowerCase(), 0xB0E0E6); //$NON-NLS-1$
+ colorToRgb.put("Purple".toLowerCase(), 0x800080); //$NON-NLS-1$
+ colorToRgb.put("Red".toLowerCase(), 0xFF0000); //$NON-NLS-1$
+ colorToRgb.put("RosyBrown".toLowerCase(), 0xBC8F8F); //$NON-NLS-1$
+ colorToRgb.put("RoyalBlue".toLowerCase(), 0x4169E1); //$NON-NLS-1$
+ colorToRgb.put("SaddleBrown".toLowerCase(), 0x8B4513); //$NON-NLS-1$
+ colorToRgb.put("Salmon".toLowerCase(), 0xFA8072); //$NON-NLS-1$
+ colorToRgb.put("SandyBrown".toLowerCase(), 0xF4A460); //$NON-NLS-1$
+ colorToRgb.put("SeaGreen".toLowerCase(), 0x2E8B57); //$NON-NLS-1$
+ colorToRgb.put("SeaShell".toLowerCase(), 0xFFF5EE); //$NON-NLS-1$
+ colorToRgb.put("Sienna".toLowerCase(), 0xA0522D); //$NON-NLS-1$
+ colorToRgb.put("Silver".toLowerCase(), 0xC0C0C0); //$NON-NLS-1$
+ colorToRgb.put("SkyBlue".toLowerCase(), 0x87CEEB); //$NON-NLS-1$
+ colorToRgb.put("SlateBlue".toLowerCase(), 0x6A5ACD); //$NON-NLS-1$
+ colorToRgb.put("SlateGray".toLowerCase(), 0x708090); //$NON-NLS-1$
+ colorToRgb.put("SlateGrey".toLowerCase(), 0x708090); //$NON-NLS-1$
+ colorToRgb.put("Snow".toLowerCase(), 0xFFFAFA); //$NON-NLS-1$
+ colorToRgb.put("SpringGreen".toLowerCase(), 0x00FF7F); //$NON-NLS-1$
+ colorToRgb.put("SteelBlue".toLowerCase(), 0x4682B4); //$NON-NLS-1$
+ colorToRgb.put("Tan".toLowerCase(), 0xD2B48C); //$NON-NLS-1$
+ colorToRgb.put("Teal".toLowerCase(), 0x008080); //$NON-NLS-1$
+ colorToRgb.put("Thistle".toLowerCase(), 0xD8BFD8); //$NON-NLS-1$
+ colorToRgb.put("Tomato".toLowerCase(), 0xFF6347); //$NON-NLS-1$
+ colorToRgb.put("Turquoise".toLowerCase(), 0x40E0D0); //$NON-NLS-1$
+ colorToRgb.put("Violet".toLowerCase(), 0xEE82EE); //$NON-NLS-1$
+ colorToRgb.put("Wheat".toLowerCase(), 0xF5DEB3); //$NON-NLS-1$
+ colorToRgb.put("White".toLowerCase(), 0xFFFFFF); //$NON-NLS-1$
+ colorToRgb.put("WhiteSmoke".toLowerCase(), 0xF5F5F5); //$NON-NLS-1$
+ colorToRgb.put("Yellow".toLowerCase(), 0xFFFF00); //$NON-NLS-1$
+ colorToRgb.put("YellowGreen".toLowerCase(), 0x9ACD32); //$NON-NLS-1$
+ }
+
+ static final Pattern rgbPattern = Pattern.compile("rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)"); //$NON-NLS-1$
+
+ private final Font defaultFont;
+
+ private final Font defaultMonospaceFont;
+
+ private final Map<String, RuleHandler> ruleNameToHandler = new HashMap<String, RuleHandler>();
+ {
+ register(new ColorRuleHandler());
+ register(new BackgroundColorRuleHandler());
+ register(new FontStyleRuleHandler());
+ register(new FontWeightRuleHandler());
+ register(new FontSizeRuleHandler());
+ register(new FontFamilyRuleHandler());
+ register(new TextDecorationRuleHandler());
+ register(new VerticalAlignRuleHandler());
+ }
+
+ public CssStyleManager(Font defaultFont) {
+ this(defaultFont, null);
+ }
+
+ /**
+ * @param defaultFont
+ * the default font to use
+ * @param defaultMonospaceFont
+ * the default font to use where a monospace font is required
+ */
+ public CssStyleManager(Font defaultFont, Font defaultMonospaceFont) {
+ if (defaultFont == null) {
+ throw new IllegalArgumentException();
+ }
+ this.defaultFont = defaultFont;
+ this.defaultMonospaceFont = defaultMonospaceFont;
+ }
+
+ /**
+ * NOT API For testing purposes only
+ */
+ public CssStyleManager() {
+ defaultFont = null;
+ defaultMonospaceFont = null;
+ }
+
+ private void register(RuleHandler handler) {
+ ruleNameToHandler.put(handler.getRuleName(), handler);
+ }
+
+ public StyleRange createStyleRange(FontState fontState, int offset, int length) {
+ StyleRange styleRange = new StyleRange(offset, length, getColorFromRgb(fontState.foreground),
+ getColorFromRgb(fontState.background));
+ if (fontState.isBold()) {
+ styleRange.fontStyle |= SWT.BOLD;
+ }
+ if (fontState.isUnderline()) {
+ styleRange.underline = true;
+ }
+ if (fontState.isStrikethrough()) {
+ styleRange.strikeout = true;
+ }
+ if (fontState.isItalic()) {
+ styleRange.fontStyle |= SWT.ITALIC;
+ }
+ if (fontState.isSubscript()) {
+ styleRange.rise = -4;
+ } else if (fontState.isSuperscript()) {
+ styleRange.rise = 4;
+ }
+ if (fontState.isFixedWidth()) {
+ String symbolicName = computeSymbolicName(fontState, "monospace", defaultMonospaceFont); //$NON-NLS-1$
+ Font monospaceFont = JFaceResources.getFontRegistry().hasValueFor(symbolicName) ? JFaceResources.getFontRegistry()
+ .get(symbolicName)
+ : null;
+ if (monospaceFont == null) {
+ FontData[] fontData = null;
+ if (defaultMonospaceFont != null) {
+ fontData = defaultMonospaceFont.getFontData();
+ } else {
+ Font defaultFont = JFaceResources.getFontRegistry().defaultFont();
+
+ // look for a monospace font. First look for non-scalable fonts (bug 263074 comment 3 to comment 6)
+ // then scalable fonts. This addresses platform-specific issues.
+ String[] fontNames = computeMonospaceFontNames();
+ for (String fontName : fontNames) {
+ fontData = defaultFont.getDevice().getFontList(fontName, false);
+ if (fontData == null || fontData.length == 0) {
+ fontData = defaultFont.getDevice().getFontList(fontName, true);
+ }
+ if (fontData != null && fontData.length > 0) {
+ break;
+ }
+ }
+ }
+ if (fontData != null && fontData.length > 0) {
+ fontData = applyFontState(fontState, fontData);
+ JFaceResources.getFontRegistry().put(symbolicName, fontData);
+ monospaceFont = JFaceResources.getFontRegistry().get(symbolicName);
+ }
+ }
+ if (monospaceFont != null) {
+ styleRange.font = monospaceFont;
+ }
+ } else {
+ String symbolicName = computeSymbolicName(fontState, "default", defaultFont); //$NON-NLS-1$
+ Font font = JFaceResources.getFontRegistry().hasValueFor(symbolicName) ? JFaceResources.getFontRegistry()
+ .get(symbolicName) : null;
+ if (font == null) {
+ FontData[] fontData = createFontData(fontState, defaultFont);
+ JFaceResources.getFontRegistry().put(symbolicName, fontData);
+ font = JFaceResources.getFontRegistry().get(symbolicName);
+ }
+ if (font != null) {
+ styleRange.font = font;
+ }
+
+ }
+ return styleRange;
+ }
+
+ private String[] computeMonospaceFontNames() {
+ boolean linux = false;
+ boolean macosx = false;
+ try {
+ String os = Platform.getOS();
+ macosx = Platform.OS_MACOSX.equals(os);
+ linux = Platform.OS_LINUX.equals(os);
+ } catch (Exception e) {
+ // stand-alone
+ String osName = System.getProperty("os.name"); //$NON-NLS-1$
+ if (osName != null) {
+ // see somewhat comprehensive list of possible values here:
+ // http://lopica.sourceforge.net/os.html
+
+ if (osName.startsWith("Mac")) { //$NON-NLS-1$
+ macosx = true;
+ } else if (osName.startsWith("Linux")) { //$NON-NLS-1$
+ linux = true;
+ }
+ }
+ }
+ if (linux) {
+ return new String[] { "monospace", "Courier New", "Courier" //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ };
+ }
+ if (macosx) {
+ return new String[] { "Courier", "Courier New" //$NON-NLS-1$//$NON-NLS-2$
+ };
+ }
+ return new String[] { "Courier New", "Courier" //$NON-NLS-1$//$NON-NLS-2$
+ };
+ }
+
+ private FontData[] applyFontState(FontState fontState, FontData[] fontData) {
+ final int fontSize = (int) fontState.size;
+ boolean bold = fontState.isBold();
+ boolean italics = fontState.isItalic();
+
+ for (FontData data : fontData) {
+ data.setHeight(fontSize);
+ int style = data.getStyle();
+ if (bold) {
+ style |= SWT.BOLD;
+ }
+ if (italics) {
+ style |= SWT.ITALIC;
+ }
+ data.setStyle(style);
+ }
+ return fontData;
+ }
+
+ private FontData[] createFontData(FontState fontState, Font baseFont) {
+ FontData[] fontData = new FontData[baseFont.getFontData().length];
+ int index = -1;
+ for (FontData fd : baseFont.getFontData()) {
+ fontData[++index] = new FontData(fd.getName(), fd.getHeight(), fd.getStyle());
+ }
+ return applyFontState(fontState, fontData);
+ }
+
+ private String computeSymbolicName(FontState fontState, String key, Font defaultFont) {
+ String symbolicName = getClass().getSimpleName() + '-' + key + '-' + fontState.size;
+ if (fontState.isBold()) {
+ symbolicName += "-bold"; //$NON-NLS-1$
+ }
+ if (fontState.isItalic()) {
+ symbolicName += "-italic"; //$NON-NLS-1$
+ }
+ // if the default has changed we must change the key so that changes can actually take effect
+ if (defaultFont != null) {
+ FontData fontData = defaultFont.getFontData()[0];
+ symbolicName += '-' + fontData.getName() + '-' + fontData.getStyle();
+ }
+ return symbolicName;
+ }
+
+ public Color getColorFromRgb(RGB rgb) {
+ if (rgb == null) {
+ return null;
+ }
+ String symbolicName = String.format("#%02X%02X%02X", rgb.red, rgb.green, rgb.blue); //$NON-NLS-1$
+ Color color = JFaceResources.getColorRegistry().get(symbolicName);
+ if (color == null) {
+ JFaceResources.getColorRegistry().put(symbolicName, rgb);
+ color = JFaceResources.getColorRegistry().get(symbolicName);
+ }
+ return color;
+ }
+
+ public SortedSet<String> getRecognizedRuleNames() {
+ return new TreeSet<String>(ruleNameToHandler.keySet());
+ }
+
+ public boolean isKnownRule(CssRule rule) {
+ return ruleNameToHandler.containsKey(rule.name);
+ }
+
+ private interface RuleHandler {
+ public String getRuleName();
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState);
+ }
+
+ private static class ColorRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_COLOR;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ Integer rgb = cssColorRgb(rule.value);
+ if (rgb != null) {
+ fontState.foreground = toRGB(rgb);
+ }
+ }
+ }
+
+ private static class BackgroundColorRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_BACKGROUND_COLOR;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ Integer rgb = cssColorRgb(rule.value);
+ if (rgb != null) {
+ fontState.background = toRGB(rgb);
+ }
+ }
+ }
+
+ private static class FontStyleRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_FONT_STYLE;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ String[] parts = rule.value.split("((\\s+)|(\\s*,\\s*))"); //$NON-NLS-1$
+ for (String part : parts) {
+ if ("italic".equals(part)) { //$NON-NLS-1$
+ fontState.setItalic(true);
+ } else if ("bold".equals(part)) { //$NON-NLS-1$
+ fontState.setBold(true);
+ } else if ("normal".equals(part)) { //$NON-NLS-1$
+ fontState.setItalic(false);
+ }
+ }
+ }
+ }
+
+ private static class FontWeightRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_FONT_WEIGHT;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ if ("bold".equals(rule.value) || "bolder".equals(rule.value)) { //$NON-NLS-1$ //$NON-NLS-2$
+ fontState.setBold(true);
+ } else if ("normal".equals(rule.value) || "lighter".equals(rule.value)) { //$NON-NLS-1$ //$NON-NLS-2$
+ fontState.setBold(false);
+ }
+ }
+ }
+
+ private class FontSizeRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_FONT_SIZE;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ String cssFontSizeValue = rule.value;
+ if (cssFontSizeValue.endsWith("%")) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ try {
+ float percentage = Float.parseFloat(cssFontSizeValue.substring(0, cssFontSizeValue.length() - 1)) / 100f;
+ if (percentage > 0) {
+ fontState.size = percentage * defaultSize;
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ } else if ("xx-small".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize - (defaultSize * 0.6f);
+ } else if ("x-small".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize - (defaultSize * 0.4f);
+ } else if ("small".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize - (defaultSize * 0.2f);
+ } else if ("medium".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize;
+ } else if ("large".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize + (defaultSize * 0.2f);
+ } else if ("x-large".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize + (defaultSize * 0.4f);
+ } else if ("xx-large".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ float defaultSize = defaultFont.getFontData()[0].getHeight();
+ fontState.size = defaultSize + (defaultSize * 0.6f);
+ } else if ("larger".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ fontState.size = parentFontState.size * 1.2f;
+ } else if ("smaller".equals(cssFontSizeValue)) { //$NON-NLS-1$
+ fontState.size = parentFontState.size - (parentFontState.size * 0.2f);
+ } else {
+ try {
+ if (cssFontSizeValue.endsWith("pt") || cssFontSizeValue.endsWith("px")) { //$NON-NLS-1$ //$NON-NLS-2$
+ cssFontSizeValue = cssFontSizeValue.substring(0, cssFontSizeValue.length() - 2);
+ }
+ float exactSize = Float.parseFloat(cssFontSizeValue);
+ if (exactSize > 0) {
+ fontState.size = exactSize;
+ }
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ // prevent the font size from being unusable
+ fontState.size = Math.min(MAX_FONT_SIZE, Math.max(MIN_FONT_SIZE, fontState.size));
+ }
+ }
+
+ private static class FontFamilyRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_FONT_FAMILY;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ String[] parts = rule.value.split("((\\s+)|(\\s*,\\s*))"); //$NON-NLS-1$
+ for (String part : parts) {
+ if (part.length() > 1 && part.startsWith("'") && part.endsWith("'")) { //$NON-NLS-1$ //$NON-NLS-2$
+ part = part.substring(1, part.length() - 1);
+ }
+ if ("monospace".equals(part) || "courier".equalsIgnoreCase(part) //$NON-NLS-1$ //$NON-NLS-2$
+ || "courier new".equalsIgnoreCase(part)) { //$NON-NLS-1$
+ fontState.setFixedWidth(true);
+ } else {
+ fontState.setFixedWidth(false);
+ }
+ }
+ }
+ }
+
+ private static class TextDecorationRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_TEXT_DECORATION;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ String[] parts = rule.value.split("((\\s+)|(\\s*,\\s*))"); //$NON-NLS-1$
+ for (String part : parts) {
+ if ("none".equals(part)) { //$NON-NLS-1$
+ fontState.setStrikethrough(false);
+ fontState.setUnderline(false);
+ } else if ("line-through".equals(part)) { //$NON-NLS-1$
+ fontState.setStrikethrough(true);
+ } else if ("underline".equals(part)) { //$NON-NLS-1$
+ fontState.setUnderline(true);
+ }
+ }
+ }
+ }
+
+ private static class VerticalAlignRuleHandler implements RuleHandler {
+ public String getRuleName() {
+ return RULE_VERTICAL_ALIGN;
+ }
+
+ public void process(CssRule rule, FontState fontState, FontState parentFontState) {
+ if ("super".equals(rule.value)) { //$NON-NLS-1$
+ fontState.setSuperscript(true);
+ } else if ("sub".equals(rule.value)) { //$NON-NLS-1$
+ fontState.setSubscript(true);
+ }
+ }
+ }
+
+ private static RGB toRGB(int rgb) {
+ return new RGB((rgb & 0xFF0000) >> 16, (rgb & 0x00FF00) >> 8, (rgb & 0x0000FF));
+ }
+
+ /**
+ * get the RGB value for a color name or any other valid CSS expression of a color value.
+ *
+ * @param cssColor
+ * the css color
+ * @return the RGB value or null if it cannot be determined.
+ */
+ public static Integer cssColorRgb(String cssColor) {
+ Integer rgb = colorToRgb.get(cssColor.toLowerCase());
+ if (rgb == null) {
+ try {
+ if (cssColor.startsWith("#")) { //$NON-NLS-1$
+ String rgbNumeric = cssColor.substring(1);
+ if (rgbNumeric.length() == 3) {
+ String firstDigit = rgbNumeric.substring(0, 1);
+ String secondDigit = rgbNumeric.substring(1, 2);
+ String thirdDigit = rgbNumeric.substring(2, 3);
+ rgbNumeric = firstDigit + firstDigit + secondDigit + secondDigit + thirdDigit + thirdDigit;
+ }
+ rgb = Integer.parseInt(rgbNumeric, 16);
+ } else {
+ Matcher rgbMatcher = rgbPattern.matcher(cssColor);
+ if (rgbMatcher.matches()) {
+ String r = rgbMatcher.group(1);
+ String g = rgbMatcher.group(2);
+ String b = rgbMatcher.group(3);
+ String rgbNumeric = String.format("%02X%02X%02X", Integer.parseInt(r), Integer.parseInt(g), //$NON-NLS-1$
+ Integer.parseInt(b));
+ rgb = Integer.parseInt(rgbNumeric, 16);
+ }
+ }
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+ return rgb;
+ }
+
+ public FontState createDefaultFontState() {
+ FontState fontState = new FontState();
+ fontState.size = defaultFont.getFontData()[0].getHeight();
+ return fontState;
+ }
+
+ public void processCssStyles(FontState fontState, FontState parentFontState, CssRule rule) {
+ RuleHandler ruleHandler = ruleNameToHandler.get(rule.name);
+ if (ruleHandler != null) {
+ ruleHandler.process(rule, fontState, parentFontState);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/FontState.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/FontState.java
new file mode 100644
index 0000000..5779a93
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/FontState.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+/**
+ *
+ */
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import org.eclipse.swt.graphics.RGB;
+
+/**
+ *
+ *
+ * @author David Green
+ */
+public class FontState {
+ public static final int STATE_BOLD = 0x1;
+
+ public static final int STATE_ITALIC = 0x2;
+
+ public static final int STATE_STRIKETHROUGH = 0x4;
+
+ public static final int STATE_UNDERLINE = 0x8;
+
+ public static final int STATE_SUPERSCRIPT = 0x10;
+
+ public static final int STATE_SUBSCRIPT = 0x20;
+
+ public static final int STATE_FIXED_WIDTH = 0x40;
+
+ /**
+ * RGB foreground color
+ */
+ public RGB foreground;
+
+ /**
+ * RGB background color
+ */
+ public RGB background;
+
+ /**
+ * State bits
+ */
+ public int state;
+
+ /**
+ * Font size
+ */
+ public float size;
+
+ public FontState() {
+ }
+
+ public FontState(FontState copy) {
+ this.foreground = copy.foreground;
+ this.background = copy.background;
+ this.state = copy.state;
+ this.size = copy.size;
+ }
+
+ public boolean isBold() {
+ return isSet(STATE_BOLD);
+ }
+
+ public boolean isItalic() {
+ return isSet(STATE_ITALIC);
+ }
+
+ public boolean isStrikethrough() {
+ return isSet(STATE_STRIKETHROUGH);
+ }
+
+ public boolean isUnderline() {
+ return isSet(STATE_UNDERLINE);
+ }
+
+ public boolean isSuperscript() {
+ return isSet(STATE_SUPERSCRIPT);
+ }
+
+ public boolean isSubscript() {
+ return isSet(STATE_SUBSCRIPT);
+ }
+
+ public boolean isFixedWidth() {
+ return isSet(STATE_FIXED_WIDTH);
+ }
+
+ public void setBold(boolean bold) {
+ set(bold, STATE_BOLD);
+ }
+
+ public void setItalic(boolean value) {
+ set(value, STATE_ITALIC);
+ }
+
+ public void setStrikethrough(boolean value) {
+ set(value, STATE_STRIKETHROUGH);
+ }
+
+ public void setUnderline(boolean value) {
+ set(value, STATE_UNDERLINE);
+ }
+
+ public void setSuperscript(boolean value) {
+ set(value, STATE_SUPERSCRIPT);
+ }
+
+ public void setSubscript(boolean value) {
+ set(value, STATE_SUBSCRIPT);
+ }
+
+ public void setFixedWidth(boolean value) {
+ set(value, STATE_FIXED_WIDTH);
+ }
+
+ private boolean isSet(int bits) {
+ return (state & bits) == bits;
+ }
+
+ private void set(boolean value, int bits) {
+ if (value) {
+ state |= bits;
+ } else {
+ state &= ~bits;
+ }
+ }
+
+ public RGB getForeground() {
+ return foreground;
+ }
+
+ public void setForeground(RGB foreground) {
+ this.foreground = foreground;
+ }
+
+ public RGB getBackground() {
+ return background;
+ }
+
+ public void setBackground(RGB background) {
+ this.background = background;
+ }
+
+ public float getSize() {
+ return size;
+ }
+
+ public void setSize(float size) {
+ this.size = size;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((background == null) ? 0 : background.hashCode());
+ result = prime * result + ((foreground == null) ? 0 : foreground.hashCode());
+ result = prime * result + Float.floatToIntBits(size);
+ result = prime * result + state;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final FontState other = (FontState) obj;
+ if (background == null) {
+ if (other.background != null) {
+ return false;
+ }
+ } else if (!background.equals(other.background)) {
+ return false;
+ }
+ if (foreground == null) {
+ if (other.foreground != null) {
+ return false;
+ }
+ } else if (!foreground.equals(other.foreground)) {
+ return false;
+ }
+ if (Float.floatToIntBits(size) != Float.floatToIntBits(other.size)) {
+ return false;
+ }
+ if (state != other.state) {
+ return false;
+ }
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/HtmlTextPresentationParser.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/HtmlTextPresentationParser.java
new file mode 100644
index 0000000..521ffcb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/HtmlTextPresentationParser.java
@@ -0,0 +1,1105 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssParser;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.CssRule;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.ElementInfo;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.Stylesheet;
+import org.eclipse.mylyn.internal.wikitext.ui.util.ImageCache;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.BulletAnnotation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.HorizontalRuleAnnotation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.ImageAnnotation;
+import org.eclipse.mylyn.wikitext.core.util.IgnoreDtdEntityResolver;
+import org.eclipse.mylyn.wikitext.ui.annotation.AnchorHrefAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.AnchorNameAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.ClassAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.IdAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.TitleAnnotation;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * Takes a valid XHTML document and converts the document into two distinct parts:
+ * <ol>
+ * <li>Text as it should be presented in a text viewer</li>
+ * <li>A {@link TextPresentation}</li>
+ * </ol>
+ *
+ * @author David Green
+ */
+public class HtmlTextPresentationParser {
+ /**
+ * Element names for spanning elements
+ */
+ private static Set<String> spanElements = new HashSet<String>();
+
+ /**
+ * element names for block elements
+ */
+ private static Set<String> blockElements = new HashSet<String>();
+
+ /**
+ * element names for elements that cause adjacent whitespace to be collapsed
+ */
+ private static Set<String> whitespaceCollapsingElements = new HashSet<String>();
+
+ private static Stylesheet defaultStylesheet;
+
+ static {
+ spanElements.add("a"); //$NON-NLS-1$
+ spanElements.add("abbr"); //$NON-NLS-1$
+ spanElements.add("acronym"); //$NON-NLS-1$
+ spanElements.add("b"); //$NON-NLS-1$
+ spanElements.add("big"); //$NON-NLS-1$
+ spanElements.add("blink"); //$NON-NLS-1$
+ spanElements.add("cite"); //$NON-NLS-1$
+ spanElements.add("code"); //$NON-NLS-1$
+ spanElements.add("del"); //$NON-NLS-1$
+ spanElements.add("dfn"); //$NON-NLS-1$
+ spanElements.add("em"); //$NON-NLS-1$
+ spanElements.add("font"); //$NON-NLS-1$
+ spanElements.add("i"); //$NON-NLS-1$
+ spanElements.add("img"); //$NON-NLS-1$
+ spanElements.add("ins"); //$NON-NLS-1$
+ spanElements.add("label"); //$NON-NLS-1$
+ spanElements.add("q"); //$NON-NLS-1$
+ spanElements.add("s"); //$NON-NLS-1$
+ spanElements.add("samp"); //$NON-NLS-1$
+ spanElements.add("small"); //$NON-NLS-1$
+ spanElements.add("span"); //$NON-NLS-1$
+ spanElements.add("strike"); //$NON-NLS-1$
+ spanElements.add("strong"); //$NON-NLS-1$
+ spanElements.add("sub"); //$NON-NLS-1$
+ spanElements.add("sup"); //$NON-NLS-1$
+ spanElements.add("tt"); //$NON-NLS-1$
+ spanElements.add("u"); //$NON-NLS-1$
+ spanElements.add("var"); //$NON-NLS-1$
+
+ blockElements.add("div"); //$NON-NLS-1$
+ blockElements.add("dl"); //$NON-NLS-1$
+ blockElements.add("form"); //$NON-NLS-1$
+ blockElements.add("h1"); //$NON-NLS-1$
+ blockElements.add("h2"); //$NON-NLS-1$
+ blockElements.add("h3"); //$NON-NLS-1$
+ blockElements.add("h4"); //$NON-NLS-1$
+ blockElements.add("h5"); //$NON-NLS-1$
+ blockElements.add("h6"); //$NON-NLS-1$
+ blockElements.add("ol"); //$NON-NLS-1$
+ blockElements.add("p"); //$NON-NLS-1$
+ blockElements.add("pre"); //$NON-NLS-1$
+ blockElements.add("table"); //$NON-NLS-1$
+ blockElements.add("textarea"); //$NON-NLS-1$
+ blockElements.add("td"); //$NON-NLS-1$
+ blockElements.add("tr"); //$NON-NLS-1$
+ blockElements.add("ul"); //$NON-NLS-1$
+ blockElements.add("tbody"); //$NON-NLS-1$
+ blockElements.add("thead"); //$NON-NLS-1$
+ blockElements.add("tfoot"); //$NON-NLS-1$
+ blockElements.add("li"); //$NON-NLS-1$
+ blockElements.add("dd"); //$NON-NLS-1$
+ blockElements.add("dt"); //$NON-NLS-1$
+
+ whitespaceCollapsingElements.add("br"); //$NON-NLS-1$
+ whitespaceCollapsingElements.add("hr"); //$NON-NLS-1$
+ }
+
+ private static class ElementState implements ElementInfo {
+ String elementName;
+
+ int childCount = 0;
+
+ int textChildCount = 0;
+
+ @SuppressWarnings("unused")
+ final int originalOffset;
+
+ int offset;
+
+ boolean skipWhitespace = true;
+
+ @SuppressWarnings("unused")
+ boolean spanElement;
+
+ boolean blockElement;
+
+ boolean noWhitespaceTextContainer;
+
+ boolean collapsesAdjacentWhitespace;
+
+ final FontState fontState;
+
+ int orderedListIndex = 0;
+
+ int indentLevel = 0;
+
+ int bulletLevel = 0;
+
+ List<Annotation> annotations;
+
+ char[] prefix;
+
+ List<Annotation> prefixAnnotations;
+
+ /**
+ * The last child that was just processed for this element
+ */
+ ElementState lastChild;
+
+ final ElementState parent;
+
+ private String id;
+
+ private String[] cssClasses;
+
+ public int textOffset;
+
+ public ElementState(ElementState parent, String elementName, ElementState elementState, int offset,
+ Attributes atts) {
+ this.parent = parent;
+ this.elementName = elementName;
+ this.fontState = new FontState(elementState.fontState);
+ this.offset = offset;
+ this.originalOffset = offset;
+ this.skipWhitespace = elementState.skipWhitespace;
+ this.indentLevel = elementState.indentLevel;
+ this.bulletLevel = elementState.bulletLevel;
+ initState();
+ String cssClass = null;
+ for (int x = 0; x < atts.getLength(); ++x) {
+ String localName = atts.getLocalName(x);
+ if ("id".equals(localName)) { //$NON-NLS-1$
+ this.id = atts.getValue(x);
+ } else if ("class".equals(localName)) { //$NON-NLS-1$
+ cssClass = atts.getValue(x);
+ }
+ if (id != null && cssClass != null) {
+ break;
+ }
+ }
+ if (cssClass != null) {
+ cssClasses = cssClass.split("\\s+"); //$NON-NLS-1$
+ if (cssClasses.length > 1) {
+ Arrays.sort(cssClasses);
+ }
+ }
+ }
+
+ public ElementState(ElementState parent, String elementName, FontState fontState, int offset) {
+ this.parent = parent;
+ this.elementName = elementName;
+ this.fontState = new FontState(fontState);
+ this.offset = offset;
+ this.originalOffset = offset;
+ initState();
+ }
+
+ private void initState() {
+ String elementName = this.elementName.toLowerCase();
+ spanElement = spanElements.contains(elementName);
+ blockElement = blockElements.contains(elementName);
+ collapsesAdjacentWhitespace = whitespaceCollapsingElements.contains(elementName);
+ noWhitespaceTextContainer = "body".equals(elementName); //$NON-NLS-1$
+ }
+
+ public void addAnnotation(Annotation annotation) {
+ if (annotations == null) {
+ annotations = new ArrayList<Annotation>(2);
+ }
+ annotations.add(annotation);
+ }
+
+ public void addPrefixAnnotation(Annotation annotation) {
+ if (prefixAnnotations == null) {
+ prefixAnnotations = new ArrayList<Annotation>(1);
+ }
+ prefixAnnotations.add(annotation);
+ }
+
+ public String getLocalName() {
+ return elementName;
+ }
+
+ public ElementInfo getParent() {
+ return parent;
+ }
+
+ public boolean hasCssClass(String cssClass) {
+ return cssClasses != null && Arrays.binarySearch(cssClasses, cssClass) >= 0;
+ }
+
+ public boolean hasId(String id) {
+ return id != null && id.equals(this.id);
+ }
+ }
+
+ private IAnnotationModel annotationModel;
+
+ private TextPresentation presentation;
+
+ private String text;
+
+ private Font defaultFont;
+
+ private Font defaultMonospaceFont;
+
+ private Color defaultForeground;
+
+ private Color defaultBackground;
+
+ private char[] bulletChars = new char[] { '\u2022', // solid round bullet, see http://www.fileformat.info/info/unicode/char/2022/index.htm
+// '\u26AA', // empty round bullet, see http://www.fileformat.info/info/unicode/char/26AA/index.htm
+// '\u25A0', // square bullet, see http://www.fileformat.info/info/unicode/char/25A0/index.htm
+ };
+
+ private CssStyleManager cssStyleManager;
+
+ private boolean enableImages = false;
+
+ private ImageCache imageCache = new ImageCache();
+
+ private Stylesheet stylesheet = getDefaultStylesheet();
+
+ private final CssParser cssParser = new CssParser();
+
+ public HtmlTextPresentationParser() {
+ }
+
+ private static Stylesheet getDefaultStylesheet() {
+ synchronized (HtmlTextPresentationParser.class) {
+ if (defaultStylesheet == null) {
+ try {
+ Reader reader = getDefaultStylesheetContent();
+ try {
+ defaultStylesheet = new CssParser().parse(reader);
+ } finally {
+ reader.close();
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ return defaultStylesheet;
+ }
+ }
+
+ public static Reader getDefaultStylesheetContent() throws IOException {
+ return new InputStreamReader(HtmlTextPresentationParser.class.getResourceAsStream("default.css"), "utf-8"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public TextPresentation getPresentation() {
+ return presentation;
+ }
+
+ public void setPresentation(TextPresentation presentation) {
+ this.presentation = presentation;
+ if (presentation != null && presentation.getDefaultStyleRange() != null) {
+ if (presentation.getDefaultStyleRange().font != null) {
+ this.defaultFont = presentation.getDefaultStyleRange().font;
+ }
+ if (presentation.getDefaultStyleRange().foreground != null) {
+ this.defaultForeground = presentation.getDefaultStyleRange().foreground;
+ }
+ if (presentation.getDefaultStyleRange().foreground != null) {
+ this.defaultForeground = presentation.getDefaultStyleRange().background;
+ }
+ }
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public Font getDefaultFont() {
+ return defaultFont;
+ }
+
+ public void setDefaultFont(Font defaultFont) {
+ this.defaultFont = defaultFont;
+ }
+
+ public Font getDefaultMonospaceFont() {
+ return defaultMonospaceFont;
+ }
+
+ public void setDefaultMonospaceFont(Font defaultMonospaceFont) {
+ this.defaultMonospaceFont = defaultMonospaceFont;
+ }
+
+ public Color getDefaultForeground() {
+ return defaultForeground;
+ }
+
+ public void setDefaultForeground(Color defaultForeground) {
+ this.defaultForeground = defaultForeground;
+ }
+
+ public Color getDefaultBackground() {
+ return defaultBackground;
+ }
+
+ public void setDefaultBackground(Color defaultBackground) {
+ this.defaultBackground = defaultBackground;
+ }
+
+ public Stylesheet getStylesheet() {
+ return stylesheet;
+ }
+
+ public void setStylesheet(Stylesheet stylesheet) {
+ this.stylesheet = stylesheet;
+ }
+
+ /**
+ * Get the annotation model in which annotations are collected
+ *
+ * @return the annotation model, or null if there is none.
+ */
+ public IAnnotationModel getAnnotationModel() {
+ return annotationModel;
+ }
+
+ /**
+ * Set the annotation model if the parsing process should collect annotations for things like anchors and hover
+ * info.
+ *
+ * @param annotationModel
+ * the annotation model, or null if annotations should not be collected.
+ */
+ public void setAnnotationModel(IAnnotationModel annotationModel) {
+ this.annotationModel = annotationModel;
+ }
+
+ /**
+ * The maximum width in pixels. Only used when {@link #setGC(GC) a GC is provided}.
+ */
+ public void setMaxWidth(int maxWidth) {
+ this.maxWidth = maxWidth;
+ }
+
+ /**
+ * The GC, to be used in conjunction with {@link #setMaxWidth(int) the maximum width}
+ */
+ public void setGC(GC gc) {
+ this.gc = gc;
+ }
+
+ public void parse(String xhtmlContent) throws SAXException, IOException {
+ parse(new InputSource(new StringReader(xhtmlContent)));
+ }
+
+ public void parse(InputSource xhtmlInput) throws SAXException, IOException {
+ if (presentation == null) {
+ throw new IllegalStateException(Messages.HtmlTextPresentationParser_presentationRequired);
+ }
+ if (defaultFont == null) {
+ throw new IllegalStateException(Messages.HtmlTextPresentationParser_defaultFontRequired);
+ }
+
+ cssStyleManager = new CssStyleManager(defaultFont, defaultMonospaceFont);
+
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+
+ factory.setNamespaceAware(true);
+ factory.setValidating(false);
+ SAXParser saxParser;
+ try {
+ saxParser = factory.newSAXParser();
+ } catch (ParserConfigurationException e) {
+ throw new IllegalStateException(e);
+ }
+ XMLReader parser = saxParser.getXMLReader();
+ parser.setEntityResolver(IgnoreDtdEntityResolver.getInstance());
+ parser.setContentHandler(new HtmlContentHandler());
+ parser.parse(xhtmlInput);
+ }
+
+ private class HtmlContentHandler implements ContentHandler {
+
+ private final Stack<ElementState> state = new Stack<ElementState>();
+
+ private int lastNewlineOffset = 0;
+
+ private final StringBuilder out = new StringBuilder(2048);
+
+ private final List<StyleRange> styleRanges = new ArrayList<StyleRange>();
+
+ private final Map<Annotation, Position> annotationToPosition = new IdentityHashMap<Annotation, Position>();
+
+ private final StringBuilder elementText = new StringBuilder();
+
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ if (!state.isEmpty()) {
+ ElementState elementState = state.peek();
+ if (elementState.noWhitespaceTextContainer
+ || (elementState.blockElement && elementState.skipWhitespace
+ && elementState.textChildCount == 0 && elementState.childCount == 0)
+ || (elementState.lastChild != null && elementState.lastChild.collapsesAdjacentWhitespace)) {
+ // trim left here, since we must properly eliminate whitespace in ordered lists where we've already
+ // prepended a number to the list item text
+ int skip = 0;
+ while (Character.isWhitespace(ch[start + skip]) && skip < length) {
+ ++skip;
+ }
+ start += skip;
+ length -= skip;
+ }
+
+ // bug 274882 receiving characters makes the last element child irrelevant
+ elementState.lastChild = null;
+
+ if (length != 0) {
+ ++elementState.textChildCount;
+ append(elementState, ch, start, length);
+ }
+ }
+ }
+
+ private void append(ElementState elementState, char[] ch, int start, int length) {
+ if (elementState.skipWhitespace) {
+ // collapse adjacent whitespace, and replace newlines with a space character
+ int previousWhitespaceIndex = Integer.MIN_VALUE;
+ for (int x = 0; x < length; ++x) {
+ int index = start + x;
+ char c = ch[index];
+ if (Character.isWhitespace(c)) {
+ if (previousWhitespaceIndex == index - 1) {
+ previousWhitespaceIndex = index;
+ continue;
+ }
+ previousWhitespaceIndex = index;
+ elementText.append(c == '\t' ? c : ' ');
+ } else {
+ elementText.append(c);
+ }
+ }
+ } else {
+ elementText.append(ch, start, length);
+ }
+ }
+
+ public void emitText(ElementState elementState, boolean elementClosing) {
+ elementState.textOffset = elementState.offset;
+ if (state.isEmpty() || elementText.length() == 0) {
+ return;
+ }
+ String text = elementText.toString();
+ if (elementState.skipWhitespace) {
+ if (elementClosing) {
+ if (elementState.childCount == 0) {
+ if (elementState.blockElement) {
+ text = text.trim();
+ }
+ } else {
+ if (elementState.blockElement) {
+ text = trimRight(text);
+ }
+ }
+ } else {
+ // careful: this can result in losing significant whitespace
+ String originalText = text;
+ if (elementState.blockElement && elementState.childCount == 0) {
+ text = trimLeft(text);
+ if (text.length() == 0 && originalText.length() > 0) {
+ text = originalText.substring(0, 1);
+ }
+ }
+ }
+ }
+ elementText.delete(0, elementText.length());
+ if (text.length() > 0) {
+ emitChars(elementState, text.toCharArray());
+ }
+ }
+
+ private void emitChar(char c) {
+ out.append(c);
+ lastNewlineOffset = getOffset();
+ }
+
+ private void emitChars(ElementState elementState, char[] chars) {
+ int indentLevel = elementState.indentLevel;
+
+ boolean enforceMaxWidth = maxWidth > 0 && gc != null;
+
+ // find the offset of the last natural break
+ int lastBreakPosition = lastNewlineOffset + 1;
+ if (enforceMaxWidth) {
+ for (int x = out.length() - 1; x >= 0; --x) {
+ char ch = out.charAt(x);
+ if (x == (lastNewlineOffset + 1)) {
+ break;
+ }
+
+ if (ch == '-') {
+ lastBreakPosition = x + 1;
+ break;
+ } else if (Character.isWhitespace(ch)) {
+ lastBreakPosition = x;
+ break;
+ }
+
+ }
+ }
+
+ for (int x = 0; x < chars.length; ++x) {
+ char c = chars[x];
+ if (lastNewlineOffset == getOffset() && (c != '\n' && c != '\r') && indentLevel > 0) {
+ for (int y = 0; y < indentLevel; ++y) {
+ out.append('\t');
+ }
+ }
+ if (x == 0) {
+ char[] prefix = computePrefix(elementState);
+ if (prefix != null) {
+ int offset = out.length();
+ for (int i = 0; i < prefix.length; ++i) {
+ out.append(prefix[i]);
+ }
+ List<Annotation> prefixAnnotations = computePrefixAnnotations(elementState);
+ if (prefixAnnotations != null && annotationModel != null) {
+ for (Annotation annotation : prefixAnnotations) {
+ annotationModel.addAnnotation(annotation, new Position(offset, 1));
+ }
+ }
+ }
+ elementState.textOffset = getOffset();
+ }
+ out.append(c);
+
+ if (c == '-') {
+ lastBreakPosition = getOffset() + 1;
+ } else if (Character.isWhitespace(c)) {
+ lastBreakPosition = getOffset();
+ }
+
+ if (c == '\n') {
+ lastNewlineOffset = getOffset();
+ lastBreakPosition = getOffset() + 1;
+ } else if (enforceMaxWidth) {
+ Point extent = gc.textExtent(out.substring(lastNewlineOffset + 1, out.length()));
+ final int rightMargin = 2;
+ if (extent.x >= (maxWidth - rightMargin)) {
+ if (lastBreakPosition <= getOffset()) {
+ out.insert(lastBreakPosition, '\n');
+ lastNewlineOffset = lastBreakPosition;
+ lastBreakPosition = lastNewlineOffset + 1;
+ } else {
+ out.append('\n');
+ lastNewlineOffset = getOffset();
+ lastBreakPosition = getOffset() + 1;
+ }
+ }
+ }
+ }
+ }
+
+ public void endElement(String uri, String localName, String name) throws SAXException {
+ ElementState elementState = state.peek();
+
+ emitText(elementState, true);
+ emitStyles();
+
+ if (elementState.annotations != null) {
+ for (Annotation annotation : elementState.annotations) {
+ annotationToPosition.put(annotation, new Position(elementState.textOffset, getOffset()
+ - elementState.textOffset));
+ }
+ }
+
+ char[] ch = elementToCharacters.get(localName.toLowerCase());
+ if (ch != null) {
+ boolean skip = false;
+ if (state.size() > 1) {
+ if (elementState.elementName.equals("ul") || elementState.elementName.equals("ol") //$NON-NLS-1$ //$NON-NLS-2$
+ || elementState.elementName.equals("dl")) { //$NON-NLS-1$
+ ElementState parentState = state.get(state.size() - 2);
+ if (parentState.elementName.equals("li") || parentState.elementName.equals("dt") //$NON-NLS-1$ //$NON-NLS-2$
+ || parentState.elementName.equals("dd")) { //$NON-NLS-1$
+ skip = true;
+ }
+ }
+ }
+ if (!skip) {
+ emitPartial(elementState, ch);
+ }
+ }
+
+ ElementState lastChild = state.pop();
+
+ if (localName.equals("hr")) { //$NON-NLS-1$
+ emitChar('\n');
+ } else if (localName.equals("img")) { //$NON-NLS-1$
+ if (enableImages) {
+ for (Annotation annotation : elementState.annotations) {
+ if (annotation instanceof ImageAnnotation) {
+ ImageAnnotation imageAnnotation = (ImageAnnotation) annotation;
+ // ensure that the image is painted on a new line
+ if (out.length() > 0) {
+ char lastChar = out.charAt(out.length() - 1);
+ if (lastChar != '\n' && lastChar != '\r') {
+ emitChar('\n');
+ Position position = annotationToPosition.get(imageAnnotation);
+ annotationToPosition.put(imageAnnotation, new Position(position.getOffset() + 1,
+ position.getLength()));
+ }
+ }
+ if (imageAnnotation.getImage() != null) {
+ // ensure that there are enough blank lines to display
+ // the image
+ int height = imageAnnotation.getImage().getBounds().height;
+ gc.setFont(defaultFont);
+ Point extent = gc.textExtent("\n"); //$NON-NLS-1$
+ if (extent.y > 0) {
+ int numNewlines = (int) Math.ceil(((double) height) / ((double) extent.y));
+ for (int x = 0; x < numNewlines && x < 1000; ++x) {
+ emitChar('\n');
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!state.isEmpty()) {
+ elementState = state.peek();
+ elementState.offset = getOffset();
+ elementState.lastChild = lastChild;
+ }
+ }
+
+ private void emitPartial(ElementState elementState, char[] ch) {
+ int matchShift = -1;
+ for (int shift = 0; shift < ch.length; ++shift) {
+ if (endsWith(out, ch, shift, ch.length - shift)) {
+ matchShift = shift;
+ break;
+ }
+ }
+ if (matchShift > 0) {
+ char[] c2 = new char[ch.length - matchShift];
+ System.arraycopy(ch, matchShift, c2, 0, c2.length);
+ emitChars(elementState, c2);
+ } else if (matchShift == -1) {
+ emitChars(elementState, ch);
+ }
+ }
+
+ private boolean endsWith(StringBuilder out, char[] ch, int offset, int length) {
+ if (out.length() >= length) {
+ for (int x = 0; x < length; ++x) {
+ if (out.charAt((out.length() - length) + x) != ch[x + offset]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
+ final ElementState parentElementState = state.peek();
+
+ emitText(parentElementState, false);
+
+ emitStyles();
+
+ ++parentElementState.childCount;
+
+ final ElementState elementState = state.push(new ElementState(parentElementState, localName, state.peek(),
+ getOffset(), atts));
+ if ("pre".equals(localName)) { //$NON-NLS-1$
+ elementState.skipWhitespace = false;
+ } else if ("ul".equals(localName) || "ol".equals(localName)) { //$NON-NLS-1$ //$NON-NLS-2$
+ ++elementState.indentLevel;
+ ++elementState.bulletLevel;
+ } else if ("blockquote".equals(localName) || "dd".equals(localName)) { //$NON-NLS-1$ //$NON-NLS-2$
+ ++elementState.indentLevel;
+ }
+ // process stylesheet
+ stylesheet.applyTo(elementState, new Stylesheet.Receiver() {
+ public void apply(CssRule rule) {
+ cssStyleManager.processCssStyles(elementState.fontState, parentElementState.fontState, rule);
+ }
+ });
+
+ int numAtts = atts.getLength();
+ for (int x = 0; x < numAtts; ++x) {
+ String attName = atts.getLocalName(x);
+ if ("style".equals(attName)) { //$NON-NLS-1$
+ String styleValue = atts.getValue(x);
+ if (styleValue != null) {
+ Iterator<CssRule> ruleIterator = cssParser.createRuleIterator(styleValue);
+ while (ruleIterator.hasNext()) {
+ cssStyleManager.processCssStyles(elementState.fontState, parentElementState.fontState,
+ ruleIterator.next());
+ }
+ }
+ } else if ("id".equals(attName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new IdAnnotation(atts.getValue(x)));
+ } else if ("href".equals(attName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new AnchorHrefAnnotation(atts.getValue(x)));
+ } else if ("href".equals(attName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new TitleAnnotation(atts.getValue(x), localName));
+ } else if ("name".equals(attName)) { //$NON-NLS-1$
+ if ("a".equals(localName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new AnchorNameAnnotation(atts.getValue(x)));
+ }
+ } else if ("class".equals(attName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new ClassAnnotation(atts.getValue(x)));
+ } else if ("title".equals(attName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new TitleAnnotation(atts.getValue(x), localName));
+ } else if ("start".equals(attName)) { //$NON-NLS-1$
+ if ("ol".equals(localName)) { //$NON-NLS-1$
+ // bug 265015 honor the start attribute
+ try {
+ elementState.orderedListIndex = Integer.parseInt(atts.getValue(x), 10) - 1;
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ }
+ }
+ if ("li".equals(localName)) { //$NON-NLS-1$
+ ElementState parentState = state.size() > 1 ? state.get(state.size() - 2) : null;
+ boolean numeric = parentState == null ? false : parentState.elementName.equals("ol"); //$NON-NLS-1$
+
+ int index = parentState == null ? 1 : ++parentState.orderedListIndex;
+ if (lastNewlineOffset != getOffset()) {
+ emitChars(state.peek(), "\n".toCharArray()); //$NON-NLS-1$
+ }
+ if (numeric) {
+ elementState.prefix = (Integer.toString(index) + ". ").toCharArray(); //$NON-NLS-1$
+ } else {
+ elementState.prefix = new char[] { calculateBulletChar(elementState.indentLevel), ' ', ' ' };
+ elementState.addPrefixAnnotation(new BulletAnnotation(elementState.bulletLevel));
+ }
+ } else if ("p".equals(localName)) { //$NON-NLS-1$
+ // account for the case of a paragraph following an unescaped block (eg: Textile with first char being a space).
+ if (out.length() > 0) {
+ char lastChar = out.charAt(out.length() - 1);
+ if (lastChar != '\n') {
+ emitChars(state.peek(), "\n\n".toCharArray()); //$NON-NLS-1$
+ }
+ }
+ } else if ("hr".equals(localName)) { //$NON-NLS-1$
+ elementState.addAnnotation(new HorizontalRuleAnnotation());
+ } else if ("img".equals(localName) && enableImages) { //$NON-NLS-1$
+ String url = atts.getValue("src"); //$NON-NLS-1$
+ if (url != null && url.trim().length() > 0) {
+ ImageAnnotation imageAnnotation = new ImageAnnotation(url.trim(), imageCache.getMissingImage());
+ elementState.addAnnotation(imageAnnotation);
+
+ // bug 257868: hook up hyperlinks to images
+ ElementState imageAnnotationAncestorState = elementState;
+ while (imageAnnotationAncestorState != null) {
+
+ if (imageAnnotationAncestorState.annotations != null) {
+ for (Annotation annotation : imageAnnotationAncestorState.annotations) {
+ if (annotation instanceof AnchorHrefAnnotation) {
+ imageAnnotation.setAnchorHrefAnnotation((AnchorHrefAnnotation) annotation);
+ break;
+ }
+ }
+ }
+ if (imageAnnotation.getHyperlnkAnnotation() != null) {
+ break;
+ }
+
+ imageAnnotationAncestorState = imageAnnotationAncestorState.parent;
+ }
+ }
+ }
+ }
+
+ private char calculateBulletChar(int indentLevel) {
+ return bulletChars[Math.min(indentLevel - 1, bulletChars.length - 1)];
+ }
+
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+ if (!state.isEmpty()) {
+ ElementState elementState = state.peek();
+ if (!elementState.skipWhitespace) {
+ ++elementState.textChildCount;
+ characters(ch, start, length);
+ }
+ }
+ }
+
+ public void endDocument() throws SAXException {
+ // ORDER DEPENDENCY: do this first
+ if (annotationModel != null) {
+ for (Map.Entry<Annotation, Position> a : annotationToPosition.entrySet()) {
+ annotationModel.addAnnotation(a.getKey(), a.getValue());
+ }
+ }
+
+ // bug# 236787 trim trailing whitespace and adjust style ranges.
+ trimTrailingWhitespace();
+
+ text = out.toString();
+ presentation.replaceStyleRanges(styleRanges.toArray(new StyleRange[styleRanges.size()]));
+ if (annotationModel != null) {
+ String idPrefix = IdAnnotation.class.getPackage().getName();
+ Iterator<?> annotationIterator = annotationModel.getAnnotationIterator();
+ while (annotationIterator.hasNext()) {
+ Annotation annotation = (Annotation) annotationIterator.next();
+ if (annotation.getType().startsWith(idPrefix) && !annotationToPosition.containsKey(annotation)) {
+ annotationIterator.remove();
+ }
+ }
+ }
+
+ state.clear();
+ }
+
+ /**
+ * trim trailing whitespace from the output buffer and adjust style ranges and annotations
+ */
+ private void trimTrailingWhitespace() {
+ int length = out.length();
+ for (int x = length - 1; x >= 0; --x) {
+ if (Character.isWhitespace(out.charAt(x))) {
+ if (Util.annotationsIncludeOffset(annotationModel, x)) {
+ return;
+ }
+ length = x;
+ } else {
+ break;
+ }
+ }
+ if (length != out.length()) {
+ out.delete(length, out.length());
+ Iterator<StyleRange> styleIt = styleRanges.iterator();
+ while (styleIt.hasNext()) {
+ StyleRange styleRange = styleIt.next();
+ if (styleRange.start >= length) {
+ styleIt.remove();
+ } else {
+ int styleEnd = styleRange.start + styleRange.length;
+ if (styleEnd > length) {
+ styleRange.length -= styleEnd - length;
+ }
+ }
+ }
+ }
+ }
+
+ public void startDocument() throws SAXException {
+ ElementState elementState = state.push(new ElementState(null, "<document>", new FontState(), getOffset())); //$NON-NLS-1$
+ elementState.fontState.size = defaultFont.getFontData()[0].getHeight();
+ elementState.fontState.foreground = defaultForeground == null ? null : defaultForeground.getRGB();
+ elementState.fontState.background = defaultBackground == null ? null : defaultBackground.getRGB();
+ }
+
+ public void processingInstruction(String target, String data) throws SAXException {
+ }
+
+ public void skippedEntity(String name) throws SAXException {
+ }
+
+ public void setDocumentLocator(Locator locator) {
+ }
+
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ }
+
+ public void endPrefixMapping(String prefix) throws SAXException {
+ }
+
+ private void emitStyles() {
+ if (state.isEmpty()) {
+ return;
+ }
+ ElementState elementState = state.peek();
+ int offset = elementState.offset;
+ if (offset >= getOffset()) {
+ // 0-length styles??
+ return;
+ }
+ if (elementState.fontState.equals(state.get(0).fontState)) {
+ // no different than the default state
+ return;
+ }
+ int length = getOffset() - offset;
+ boolean underline = elementState.fontState.isUnderline();
+ boolean strikethrough = elementState.fontState.isStrikethrough();
+ boolean split = offset != elementState.textOffset && (underline || strikethrough);
+ if (split) {
+ length = elementState.textOffset - offset;
+ elementState.fontState.setStrikethrough(false);
+ elementState.fontState.setUnderline(false);
+ }
+ StyleRange styleRange = cssStyleManager.createStyleRange(elementState.fontState, offset, length);
+ styleRanges.add(styleRange);
+ if (split) {
+ offset = elementState.textOffset;
+ length = getOffset() - elementState.textOffset;
+ elementState.fontState.setStrikethrough(strikethrough);
+ elementState.fontState.setUnderline(underline);
+
+ styleRange = cssStyleManager.createStyleRange(elementState.fontState, offset, length);
+ styleRanges.add(styleRange);
+ }
+ }
+
+ private int getOffset() {
+ return out.length();
+ }
+
+ }
+
+ private static Map<String, char[]> elementToCharacters = new HashMap<String, char[]>();
+ static {
+ elementToCharacters.put("p", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("br", "\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("tr", "\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("table", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("ol", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("ul", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("dl", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("h1", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("h2", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("h3", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("h4", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("h5", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("h6", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("blockquote", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("pre", "\n\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("th", " \t".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("td", " \t".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("dt", "\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ elementToCharacters.put("dd", "\n".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ private GC gc;
+
+ private int maxWidth;
+
+ private static String trimLeft(String text) {
+ final int len = text.length();
+ int st = 0;
+
+ while ((st < len) && (text.charAt(st) <= ' ')) {
+ st++;
+ }
+ return st > 0 ? text.substring(st, len) : text;
+ }
+
+ public List<Annotation> computePrefixAnnotations(ElementState elementState) {
+ while (elementState != null) {
+ if (elementState.prefixAnnotations != null) {
+ List<Annotation> prefixAnnotations = elementState.prefixAnnotations;
+ elementState.prefixAnnotations = null;
+ return prefixAnnotations;
+ }
+ elementState = elementState.parent;
+ }
+ return null;
+ }
+
+ public char[] computePrefix(ElementState elementState) {
+ while (elementState != null) {
+ if (elementState.prefix != null) {
+ char[] prefix = elementState.prefix;
+ elementState.prefix = null;
+ return prefix;
+ }
+ elementState = elementState.parent;
+ }
+ return null;
+ }
+
+ private static String trimRight(String text) {
+ int len = text.length();
+
+ while (0 < len && (text.charAt(len - 1) <= ' ')) {
+ len--;
+ }
+ return len < text.length() ? text.substring(0, len) : text;
+ }
+
+ /**
+ * get the bullet characters that are to be used when presenting bulleted lists. For an indent level of one, the
+ * first character is used, for indent level 2 the second character is used, etc unless the indent level exceeds the
+ * number of characters provided in which case the last character is used. Note that not all characters are
+ * available with all fonts.
+ */
+ public char[] getBulletChars() {
+ return bulletChars;
+ }
+
+ /**
+ * set the bullet characters that are to be used when presenting bulleted lists. For an indent level of one, the
+ * first character is used, for indent level 2 the second character is used, etc unless the indent level exceeds the
+ * number of characters provided in which case the last character is used. Note that not all characters are
+ * available with all fonts.
+ */
+ public void setBulletChars(char[] bulletChars) {
+ this.bulletChars = bulletChars;
+ }
+
+ /**
+ * indicate if image display is enabled. The default is false.
+ */
+ public boolean isEnableImages() {
+ return enableImages;
+ }
+
+ /**
+ * indicate if image display is enabled. The default is false.
+ */
+ public void setEnableImages(boolean enableImages) {
+ this.enableImages = enableImages;
+ }
+
+ public ImageCache getImageCache() {
+ return imageCache;
+ }
+
+ public void setImageCache(ImageCache imageCache) {
+ this.imageCache = imageCache;
+ }
+
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/ImageManager.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/ImageManager.java
new file mode 100644
index 0000000..26bf26d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/ImageManager.java
@@ -0,0 +1,520 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.AnnotationPainter;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.util.ImageCache;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.ImageAnnotation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.ImageDrawingStrategy;
+import org.eclipse.mylyn.wikitext.ui.viewer.HtmlViewer;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.MouseMoveListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+
+/**
+ * Manages all aspects of image download/display in an {@link HtmlViewer}. Manages the download of images for viewing in
+ * an {@link HtmlViewer}, and creates appropriate space for their display. Downloads image data in a background thread,
+ * instantiates the corresopnding images, and ensures that enough vertical space exists in the viewer to display the
+ * images.
+ *
+ * @see ImageAnnotation
+ * @see ImageDrawingStrategy
+ * @see ImageCache
+ * @see HtmlViewer
+ * @author David Green
+ */
+public class ImageManager implements ITextInputListener, DisposeListener, IDocumentListener, ISelectionChangedListener {
+ private class HyperlinkMouseListener implements MouseMoveListener, MouseListener {
+ @SuppressWarnings("unused")
+ public void mouseEnter(MouseEvent e) {
+ // ignore
+ }
+
+ @SuppressWarnings("unused")
+ public void mouseExit(MouseEvent e) {
+ disarm();
+ }
+
+ public void mouseMove(MouseEvent e) {
+ adjust(e);
+ }
+
+ public void mouseDoubleClick(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseDown(MouseEvent e) {
+ // ignore
+ }
+
+ public void mouseUp(MouseEvent e) {
+ clicked(e);
+ }
+ }
+
+ private final HtmlViewer viewer;
+
+ private final Display display;
+
+ private final ImageCache imageCache;
+
+ private final Set<ImageAnnotation> annotations = new HashSet<ImageAnnotation>();
+
+ private ImageResolver imageResolver;
+
+ private boolean computingChanges;
+
+ private final AnnotationPainter painter;
+
+ private boolean armed = false;
+
+ private Cursor cursor;
+
+ private Cursor previousCursor;
+
+ public ImageManager(HtmlViewer viewer, ImageCache imageCache, AnnotationPainter painter) {
+ this.viewer = viewer;
+ this.painter = painter;
+ display = viewer.getTextWidget().getDisplay();
+ this.imageCache = imageCache;
+ inspect();
+ viewer.getTextWidget().addDisposeListener(this);
+ viewer.addTextInputListener(this);
+ if (viewer.getDocument() != null) {
+ viewer.getDocument().addDocumentListener(this);
+ }
+ viewer.addSelectionChangedListener(this);
+ viewer.addPostSelectionChangedListener(this);
+
+ // bug 257868 support image hyperlinks
+ HyperlinkMouseListener mouseListener = new HyperlinkMouseListener();
+ viewer.getTextWidget().addMouseMoveListener(mouseListener);
+ viewer.getTextWidget().addMouseListener(mouseListener);
+
+ }
+
+ private IHyperlink getHyperlink(MouseEvent e) {
+ // bug 257868 support image hyperlinks
+ if (annotations.isEmpty()) {
+ return null;
+ }
+ Point point = new Point(e.x, e.y);
+ for (ImageAnnotation annotation : annotations) {
+ if (annotation.getHyperlnkAnnotation() == null) {
+ continue;
+ }
+ Rectangle region = getRegion(annotation);
+ if (region != null) {
+ if (region.contains(point)) {
+ AnnotationHyperlinkDetector detector = (AnnotationHyperlinkDetector) viewer.getTextWidget()
+ .getData(AnnotationHyperlinkDetector.class.getName());
+ if (detector != null) {
+ IHyperlink hyperlink = detector.createHyperlink(viewer, viewer.getAnnotationModel(),
+ annotation.getHyperlnkAnnotation());
+ return hyperlink;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public void clicked(MouseEvent e) {
+ IHyperlink hyperlink = getHyperlink(e);
+ if (hyperlink != null) {
+ disarm();
+ hyperlink.open();
+ }
+ }
+
+ /**
+ * get the widget-relative region of the given annotation
+ *
+ * @return the region, or null if it is unknown
+ */
+ private Rectangle getRegion(ImageAnnotation annotation) {
+ if (annotation.getImage() == null) {
+ return null;
+ }
+ Position position = viewer.getAnnotationModel().getPosition(annotation);
+ Point locationAtOffset = viewer.getTextWidget().getLocationAtOffset(position.offset);
+ Rectangle bounds = annotation.getImage().getBounds();
+ Rectangle rectange = new Rectangle(locationAtOffset.x, locationAtOffset.y, bounds.width, bounds.height);
+ return rectange;
+ }
+
+ void adjust(MouseEvent e) {
+ IHyperlink hyperlink = getHyperlink(e);
+ if (hyperlink == null) {
+ disarm();
+ } else {
+ // always arm here even if already armed, otherwise the cursor
+ // setting interacts poorly with other things that set the cursor.
+ armed = true;
+ Cursor currentCursor = viewer.getTextWidget().getCursor();
+ if (cursor == null || currentCursor != cursor) {
+ previousCursor = currentCursor;
+ if (cursor == null) {
+ cursor = new Cursor(viewer.getTextWidget().getDisplay(), SWT.CURSOR_HAND);
+ }
+ viewer.getTextWidget().setCursor(cursor);
+ }
+ }
+ }
+
+ void disarm() {
+ if (armed) {
+ if (previousCursor != null) {
+ viewer.getTextWidget().setCursor(previousCursor);
+ }
+ armed = false;
+ }
+ }
+
+ public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+ stop();
+ }
+
+ public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+ if (oldInput != null) {
+ oldInput.removeDocumentListener(this);
+ }
+ if (newInput != null) {
+ newInput.addDocumentListener(this);
+ }
+ inspect();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void inspect() {
+ synchronized (this) {
+ annotations.clear();
+ if (viewer.getAnnotationModel() != null) {
+ Iterator<Annotation> iterator = viewer.getAnnotationModel().getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation annotation = iterator.next();
+ if (annotation instanceof ImageAnnotation) {
+ annotations.add((ImageAnnotation) annotation);
+ }
+ }
+ }
+ }
+ if (!annotations.isEmpty()) {
+ ImageResolver resolver;
+ synchronized (this) {
+ resolver = imageResolver;
+ }
+ if (resolver != null) {
+ try {
+ resolver.join();
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+ imageResolver = new ImageResolver();
+ imageResolver.start();
+ }
+ }
+
+ private synchronized void stop() {
+ ImageResolver resolver = imageResolver;
+ if (resolver != null) {
+ resolver.interrupt();
+ }
+ }
+
+ public void widgetDisposed(DisposeEvent e) {
+ if (cursor != null) {
+ cursor.dispose();
+ cursor = null;
+ }
+ stop();
+ }
+
+ @SuppressWarnings("unchecked")
+ private void updateImage(String imgSrc, ImageData imageData) {
+ if (display.isDisposed() || viewer.getTextWidget().isDisposed()) {
+ return;
+ }
+ Image image = imageData == null ? imageCache.getMissingImage() : ImageDescriptor.createFromImageData(imageData)
+ .createImage();
+ imageCache.putImage(imgSrc, image);
+
+ Set<ImageAnnotation> modifiedAnnotations = new HashSet<ImageAnnotation>();
+
+ AnnotationModel annotationModel = (AnnotationModel) viewer.getAnnotationModel();
+ Object annotationLockObject = annotationModel.getLockObject();
+ if (annotationLockObject == null) {
+ annotationLockObject = annotationModel;
+ }
+ synchronized (annotationLockObject) {
+ Iterator<Annotation> iterator = annotationModel.getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation annotation = iterator.next();
+ if (annotation instanceof ImageAnnotation) {
+ ImageAnnotation imageAnnotation = (ImageAnnotation) annotation;
+ if (imgSrc.equals(imageAnnotation.getUrl())) {
+ imageAnnotation.setImage(image);
+ modifiedAnnotations.add(imageAnnotation);
+ }
+ }
+ }
+ }
+
+ if (!modifiedAnnotations.isEmpty()) {
+ computingChanges = true;
+ try {
+ boolean rangesAdjusted = false;
+ List<StyleRange> ranges = new ArrayList<StyleRange>();
+
+ Iterator<?> allStyleRangeIterator = viewer.getTextPresentation().getAllStyleRangeIterator();
+ while (allStyleRangeIterator.hasNext()) {
+ StyleRange range = (StyleRange) allStyleRangeIterator.next();
+ ranges.add((StyleRange) range.clone());
+ }
+
+ GC gc = new GC(viewer.getTextWidget());
+ try {
+ viewer.getTextWidget().setRedraw(false);
+ TextPresentation textPresentation = viewer.getTextPresentation();
+ // textPresentation.
+ for (ImageAnnotation annotation : modifiedAnnotations) {
+ int height = annotation.getImage().getBounds().height;
+ Position position = annotationModel.getPosition(annotation);
+ String widgetText = viewer.getTextWidget().getText();
+ Font font = null;
+ if (widgetText.length() > 0 && widgetText.length() > position.offset) {
+ StyleRange styleRange = viewer.getTextWidget().getStyleRangeAtOffset(position.offset);
+ if (styleRange != null) {
+ font = styleRange.font;
+ }
+ }
+ if (font == null) {
+ font = viewer.getTextWidget().getFont();
+ }
+ gc.setFont(font);
+ Point extent = gc.textExtent("\n"); //$NON-NLS-1$
+ if (extent.y > 0) {
+ int numNewlines = (int) Math.ceil(((double) height) / ((double) extent.y));
+ final int originalNewlines = numNewlines;
+ IDocument document = viewer.getDocument();
+ try {
+ for (int x = position.offset; x < document.getLength(); ++x) {
+ if (document.getChar(x) == '\n') {
+ if (x != position.offset
+ && Util.annotationsIncludeOffset(viewer.getAnnotationModel(), x)) {
+ break;
+ }
+ --numNewlines;
+ } else {
+ break;
+ }
+ }
+ if (numNewlines > 0) {
+ String newlines = ""; //$NON-NLS-1$
+ for (int x = 0; x < numNewlines; ++x) {
+ newlines += "\n"; //$NON-NLS-1$
+ }
+ document.replace(position.offset + 1, 0, newlines);
+ } else if (numNewlines < 0) {
+ document.replace(position.offset, -numNewlines, ""); //$NON-NLS-1$
+ }
+ if (numNewlines != 0) {
+ // no need to fixup other annotation positions, since the annotation model is hooked into the document.
+
+ // fix up styles
+ for (StyleRange range : ranges) {
+ if (range.start > position.offset) {
+ range.start += numNewlines;
+ rangesAdjusted = true;
+ } else if (range.start + range.length > position.offset) {
+ range.length += numNewlines;
+ rangesAdjusted = true;
+ }
+ }
+ }
+
+ // bug# 248643: update the annotation size to reflect the full size of the image
+ // so that it gets repainted when some portion of the image is exposed
+ // as a result of scrolling
+ if (position.getLength() != originalNewlines) {
+ annotationModel.modifyAnnotationPosition(annotation, new Position(position.offset,
+ originalNewlines));
+ }
+ } catch (BadLocationException e) {
+ // ignore
+ }
+ }
+ }
+ if (rangesAdjusted) {
+ TextPresentation presentation = new TextPresentation();
+ if (textPresentation.getDefaultStyleRange() != null) {
+ StyleRange defaultStyleRange = (StyleRange) textPresentation.getDefaultStyleRange().clone();
+ if (viewer.getDocument() != null) {
+ if (defaultStyleRange.length < viewer.getDocument().getLength()) {
+ defaultStyleRange.length = viewer.getDocument().getLength();
+ }
+ }
+ presentation.setDefaultStyleRange(defaultStyleRange);
+ }
+ for (StyleRange range : ranges) {
+ presentation.addStyleRange(range);
+ }
+ viewer.setTextPresentation(presentation);
+ viewer.invalidateTextPresentation();
+ }
+ } finally {
+ viewer.getTextWidget().setRedraw(true);
+ gc.dispose();
+ }
+ viewer.getTextWidget().redraw();
+ } finally {
+ computingChanges = false;
+ }
+ }
+ }
+
+ private static final AtomicInteger resolverIdSeed = new AtomicInteger(1);
+
+ private class ImageResolver extends Thread {
+
+ public ImageResolver() {
+ setName(ImageResolver.class.getSimpleName() + '-' + resolverIdSeed.getAndIncrement());
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ try {
+ final Map<String, ImageData> urlToImageData = new HashMap<String, ImageData>();
+ for (ImageAnnotation annotation : annotations) {
+ final String imgSrc = annotation.getUrl();
+ if (imgSrc != null && !urlToImageData.containsKey(imgSrc)) {
+ try {
+ URL location = imageCache.getBase() == null ? new URL(imgSrc) : new URL(
+ imageCache.getBase(), imgSrc);
+
+ try {
+ InputStream in = new BufferedInputStream(location.openStream());
+ try {
+ urlToImageData.put(imgSrc, new ImageData(in));
+ } catch (SWTException e) {
+ if (e.code != SWT.ERROR_INVALID_IMAGE) {
+ throw e;
+ }
+ urlToImageData.put(imgSrc, null);
+ } finally {
+ in.close();
+ }
+ } catch (Exception e) {
+ if (WikiTextUiPlugin.getDefault() != null) {
+ WikiTextUiPlugin.getDefault().log(IStatus.ERROR,
+ NLS.bind(Messages.ImageManager_accessFailed, new Object[] { location }), e);
+ }
+ urlToImageData.put(imgSrc, null);
+ }
+ } catch (MalformedURLException e) {
+ urlToImageData.put(imgSrc, null);
+ }
+ display.asyncExec(new Runnable() {
+ public void run() {
+ updateImage(imgSrc, urlToImageData.get(imgSrc));
+ }
+ });
+ }
+ if (Thread.currentThread().isInterrupted()) {
+ break;
+ }
+ }
+ } finally {
+ imageResolver = null;
+ }
+ }
+ }
+
+ public void documentAboutToBeChanged(DocumentEvent event) {
+ if (computingChanges) {
+ return;
+ }
+ stop();
+ }
+
+ public void documentChanged(DocumentEvent event) {
+ if (computingChanges) {
+ return;
+ }
+ inspect();
+ }
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ GC gc = new GC(viewer.getTextWidget());
+ try {
+ Event e = new Event();
+ e.gc = gc;
+ e.widget = viewer.getTextWidget();
+ Rectangle bounds = viewer.getTextWidget().getBounds();
+ e.height = bounds.height;
+ e.width = bounds.width;
+ e.x = 0;
+ e.y = 0;
+ PaintEvent paintEvent = new PaintEvent(e);
+ painter.paintControl(paintEvent);
+ } finally {
+ gc.dispose();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/Messages.java
new file mode 100644
index 0000000..ae20432
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/Messages.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.wikitext.ui.viewer.messages"; //$NON-NLS-1$
+
+ public static String HtmlTextPresentationParser_defaultFontRequired;
+
+ public static String HtmlTextPresentationParser_presentationRequired;
+
+ public static String ImageManager_accessFailed;
+
+ public static String TextHover_hyperlinkHover;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/TextHover.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/TextHover.java
new file mode 100644
index 0000000..20e6476
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/TextHover.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.DefaultTextHover;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.ISourceViewerExtension2;
+import org.eclipse.mylyn.wikitext.ui.annotation.AnchorHrefAnnotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.TitleAnnotation;
+import org.eclipse.mylyn.wikitext.ui.viewer.HtmlTextPresenter;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.editors.text.EditorsUI;
+
+/**
+ * A text hover implementation that finds regions based on annotations, and supports HTML markup in the tooltip string.
+ *
+ * @author David Green
+ */
+public class TextHover extends DefaultTextHover implements ITextHoverExtension {
+ private final ISourceViewer sourceViewer;
+
+ public TextHover(ISourceViewer sourceViewer) {
+ super(sourceViewer);
+ this.sourceViewer = sourceViewer;
+ }
+
+ @Override
+ protected boolean isIncluded(Annotation annotation) {
+ if (annotation.getType().equals(TitleAnnotation.TYPE) || annotation.getType().equals(AnchorHrefAnnotation.TYPE)) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+ IAnnotationModel annotationModel = sourceViewer.getAnnotationModel();
+ if (annotationModel != null) {
+ int start = Integer.MAX_VALUE;
+ int end = -1;
+ Iterator<?> iterator = annotationModel.getAnnotationIterator();
+ while (iterator.hasNext()) {
+ Annotation next = (Annotation) iterator.next();
+ Position position = annotationModel.getPosition(next);
+ if (position.getOffset() <= offset && (position.getLength() + position.getOffset()) >= offset) {
+ start = Math.min(start, position.getOffset());
+ end = Math.max(end, position.getOffset() + position.getLength());
+ }
+ }
+ if (start <= end && end > -1) {
+ return new Region(start, end - start);
+ }
+ }
+ return super.getHoverRegion(textViewer, offset);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
+ */
+ public IInformationControlCreator getHoverControlCreator() {
+ return new IInformationControlCreator() {
+
+ @SuppressWarnings("deprecation")
+ public IInformationControl createInformationControl(Shell parent) {
+
+ String tooltipAffordanceString = null;
+ try {
+ tooltipAffordanceString = EditorsUI.getTooltipAffordanceString();
+ } catch (Exception e) {
+ // expected in a non-eclipse environment
+ }
+
+ // TODO: prefer 3.4 APIs
+// return new DefaultInformationControl(parent, tooltipAffordanceString, new HtmlTextPresenter()) {
+ // must use 3.3 APIs for now
+ return new DefaultInformationControl(parent, SWT.NONE, new HtmlTextPresenter(), tooltipAffordanceString) {
+ @Override
+ public void setLocation(Point location) {
+ // prevent the location from being set to where the cursor is: otherwise the popup is displayed
+ // and then hidden immediately.
+ Point cursorLocation = Display.getCurrent().getCursorLocation();
+ if (cursorLocation.y + 12 >= location.y) {
+ location.y = cursorLocation.y + 13;
+ }
+ super.setLocation(location);
+ }
+ };
+ }
+ };
+ }
+
+ private IAnnotationModel getAnnotationModel(ISourceViewer viewer) {
+ if (viewer instanceof ISourceViewerExtension2) {
+ ISourceViewerExtension2 extension = (ISourceViewerExtension2) viewer;
+ return extension.getVisualAnnotationModel();
+ }
+ return viewer.getAnnotationModel();
+ }
+
+ @SuppressWarnings( { "unchecked", "deprecation" })
+ @Override
+ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+ IAnnotationModel model = getAnnotationModel(sourceViewer);
+ if (model == null) {
+ return null;
+ }
+
+ Iterator e = model.getAnnotationIterator();
+ while (e.hasNext()) {
+ Annotation a = (Annotation) e.next();
+ if (isIncluded(a)) {
+ Position p = model.getPosition(a);
+ if (p != null && p.overlapsWith(hoverRegion.getOffset(), hoverRegion.getLength())) {
+ String msg = a.getText();
+ if (msg != null && msg.trim().length() > 0) {
+ if (a.getType().equals(AnchorHrefAnnotation.TYPE)) {
+ if (msg.startsWith("#")) { //$NON-NLS-1$
+ // don't provide hover information for document-internal
+ // links
+ return null;
+ } else {
+ return NLS.bind(Messages.TextHover_hyperlinkHover, msg);
+ }
+ }
+ return msg;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/Util.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/Util.java
new file mode 100644
index 0000000..f28eae8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/Util.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.viewer;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+
+class Util {
+
+ @SuppressWarnings("unchecked")
+ static boolean annotationsIncludeOffset(IAnnotationModel annotationModel, int offset) {
+ if (annotationModel == null) {
+ return false;
+ }
+ try {
+ // eclipse 3.4
+ Iterator<?> annotationIterator = (Iterator<?>) annotationModel.getClass().getMethod(
+ "getAnnotationIterator", int.class, int.class, boolean.class, boolean.class).invoke( //$NON-NLS-1$
+ annotationModel, offset, 1, true, true);
+ return annotationIterator.hasNext();
+ } catch (Exception e) {
+ // eclipse 3.3
+ Iterator<Annotation> annotationIterator = annotationModel.getAnnotationIterator();
+ while (annotationIterator.hasNext()) {
+ Position position = annotationModel.getPosition(annotationIterator.next());
+ if (position != null && (position.offset == offset || position.includes(offset))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/BulletAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/BulletAnnotation.java
new file mode 100644
index 0000000..350b4c8
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/BulletAnnotation.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+public class BulletAnnotation extends Annotation {
+
+ public static final String TYPE = "org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.bullet"; //$NON-NLS-1$
+
+ private final int indentLevel;
+
+ public BulletAnnotation(int indentLevel) {
+ super(TYPE, false, Integer.toString(indentLevel));
+ this.indentLevel = indentLevel;
+ }
+
+ public int getIndentLevel() {
+ return indentLevel;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/BulletDrawingStrategy.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/BulletDrawingStrategy.java
new file mode 100644
index 0000000..5eb2a82
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/BulletDrawingStrategy.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.AnnotationPainter.IDrawingStrategy;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+
+public class BulletDrawingStrategy implements IDrawingStrategy {
+
+ public void draw(Annotation annotation, GC gc, StyledText textWidget, int offset, int length, Color color) {
+ BulletAnnotation bullet = (BulletAnnotation) annotation;
+ if (gc != null) {
+ final Color foreground = gc.getForeground();
+ final Color background = gc.getBackground();
+
+ if (length < 1) {
+ return;
+ }
+
+ Point left = textWidget.getLocationAtOffset(offset);
+ Point right = textWidget.getLocationAtOffset(offset + length);
+ if (left.x > right.x) {
+ // hack: sometimes linewrapping text widget gives us the wrong x/y for the first character of a line that
+ // has been wrapped.
+ left.x = 0;
+ left.y = right.y;
+ }
+ int baseline = textWidget.getBaseline(offset);
+
+ int lineHeight = textWidget.getLineHeight(offset);
+
+ int vcenter = left.y + (baseline / 2) + (baseline / 4);
+ int hcenter = left.x + ((right.x - left.x) / 2);
+
+ gc.setLineWidth(0); // NOTE: 0 means width is 1 but with optimized performance
+ gc.setLineStyle(SWT.LINE_SOLID);
+
+ StyleRange styleRange = textWidget.getStyleRangeAtOffset(offset);
+ if (styleRange != null && styleRange.foreground != null) {
+ color = styleRange.foreground;
+ }
+
+ // bug 262999: determine if we're painting in a selection
+ Point selection = textWidget.getSelection();
+ // non-zero length selection, so see if where we're about to draw is within it
+ if (offset >= selection.x && offset < selection.y && selection.x < selection.y) {
+ gc.setBackground(textWidget.getSelectionBackground());
+ gc.setForeground(color);
+ } else {
+ gc.setBackground(textWidget.getBackground());
+
+ }
+
+ // erase whatever character was there
+ gc.fillRectangle(left.x, left.y, right.x - left.x, lineHeight);
+
+ // now paint the bullet
+ switch (bullet.getIndentLevel()) {
+ case 1: // round solid bullet
+ gc.setBackground(color);
+ gc.fillOval(hcenter - 3, vcenter - 2, 5, 5);
+ break;
+ case 2: // round empty bullet
+ gc.setForeground(color);
+ gc.drawOval(hcenter - 3, vcenter - 3, 5, 5);
+ break;
+ default: // square bullet
+ gc.setBackground(color);
+ gc.fillRectangle(hcenter - 3, vcenter - 2, 5, 5);
+ break;
+ }
+ gc.setForeground(foreground);
+ gc.setBackground(background);
+ } else {
+ textWidget.redrawRange(offset, length, true);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/HorizontalRuleAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/HorizontalRuleAnnotation.java
new file mode 100644
index 0000000..30f202e
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/HorizontalRuleAnnotation.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * An annotation to represent the presence of a horizontal rule (as per HTML <hr/>)
+ *
+ * @author David Green
+ */
+public class HorizontalRuleAnnotation extends Annotation {
+
+ public static final String TYPE = "org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.hr"; //$NON-NLS-1$
+
+ public HorizontalRuleAnnotation() {
+ super(TYPE, false, ""); //$NON-NLS-1$
+ }
+
+ public String getElementId() {
+ return getText();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/HorizontalRuleDrawingStrategy.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/HorizontalRuleDrawingStrategy.java
new file mode 100644
index 0000000..b890360
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/HorizontalRuleDrawingStrategy.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.AnnotationPainter.IDrawingStrategy;
+import org.eclipse.mylyn.internal.wikitext.ui.util.WikiTextUiResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+
+public class HorizontalRuleDrawingStrategy implements IDrawingStrategy {
+
+ private final Color shadowForeground;
+
+ public HorizontalRuleDrawingStrategy() {
+ shadowForeground = WikiTextUiResources.getColors().get(WikiTextUiResources.COLOR_HR_SHADOW);
+ }
+
+ public void draw(Annotation annotation, GC gc, StyledText textWidget, int offset, int length, Color color) {
+ if (gc != null) {
+ final Color foreground = gc.getForeground();
+
+ Point left = textWidget.getLocationAtOffset(offset);
+ Point right = textWidget.getLocationAtOffset(offset + length);
+ if (left.x > right.x) {
+ // hack: sometimes linewrapping text widget gives us the wrong x/y for the first character of a line that
+ // has been wrapped.
+ left.x = 0;
+ left.y = right.y;
+ }
+ right.x = textWidget.getClientArea().width;
+
+ int baseline = textWidget.getBaseline(offset);
+
+ int vcenter = left.y + (baseline / 2) + (baseline / 4);
+
+ gc.setLineWidth(0); // NOTE: 0 means width is 1 but with optimized performance
+ gc.setLineStyle(SWT.LINE_SOLID);
+
+ left.x += 3;
+ right.x -= 5;
+ vcenter -= 2;
+
+ if (right.x > left.x) {
+ // draw the shadow
+ gc.setForeground(shadowForeground);
+ gc.drawRectangle(left.x, vcenter, right.x - left.x, 2);
+
+ // draw the horizontal rule
+ gc.setForeground(color);
+ gc.drawLine(left.x, vcenter, right.x, vcenter);
+ gc.drawLine(left.x, vcenter, left.x, vcenter + 2);
+ }
+
+ gc.setForeground(foreground);
+ } else {
+ textWidget.redrawRange(offset, length, true);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/ImageAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/ImageAnnotation.java
new file mode 100644
index 0000000..04f0e4b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/ImageAnnotation.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.mylyn.wikitext.ui.annotation.AnchorHrefAnnotation;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * An annotation that represents an image.
+ *
+ * @author David Green
+ */
+public class ImageAnnotation extends Annotation {
+ public static final String TYPE = "org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.image"; //$NON-NLS-1$
+
+ private Image image;
+
+ private final String url;
+
+ private AnchorHrefAnnotation hyperlnkAnnotation;
+
+ /**
+ * @param url
+ * the url to the image data, which may be relative
+ * @param image
+ * the image to display for this annotation, which must be disposed by the caller. May be null
+ */
+ public ImageAnnotation(String url, Image image) {
+ super(TYPE, false, ""); //$NON-NLS-1$
+ this.url = url;
+ this.image = image;
+ }
+
+ public String getElementId() {
+ return getText();
+ }
+
+ public void setImage(Image image) {
+ this.image = image;
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setAnchorHrefAnnotation(AnchorHrefAnnotation hyperlnkAnnotation) {
+ this.hyperlnkAnnotation = hyperlnkAnnotation;
+ }
+
+ public AnchorHrefAnnotation getHyperlnkAnnotation() {
+ return hyperlnkAnnotation;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/ImageDrawingStrategy.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/ImageDrawingStrategy.java
new file mode 100644
index 0000000..4d7aacf
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/annotation/ImageDrawingStrategy.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation;
+
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.AnnotationPainter.IDrawingStrategy;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+
+/**
+ * A drawing strategy that can draw images for {@link ImageAnnotation}.
+ *
+ * @author David Green
+ */
+public class ImageDrawingStrategy implements IDrawingStrategy {
+
+ private final SourceViewer viewer;
+
+ public ImageDrawingStrategy(SourceViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ public void draw(Annotation annotation, GC gc, StyledText textWidget, int offset, int length, Color color) {
+ if (gc != null) {
+ Position position = viewer.getAnnotationModel().getPosition(annotation);
+
+ ImageAnnotation imageAnnotation = (ImageAnnotation) annotation;
+ Image image = imageAnnotation.getImage();
+ if (image != null) {
+ // bug# 248643: paint from the annotation 0 offset since the provided offset might
+ // be for some portion of the image
+ if (position != null) {
+ offset = position.offset;
+ }
+ Point left = textWidget.getLocationAtOffset(offset);
+ if (position == null && length > 0) {
+ Point right = textWidget.getLocationAtOffset(offset + length);
+ if (left.x > right.x) {
+ // hack: sometimes linewrapping text widget gives us the wrong x/y for the first character of a line that
+ // has been wrapped.
+ left.x = 0;
+ left.y = right.y;
+ }
+ }
+
+ // fill the background first so that drawing works properly when
+ // the viewer itself is not redrawing and image contains semi-transparent
+ // regions
+ Color foreground = gc.getForeground();
+ Color background = gc.getBackground();
+ gc.setForeground(textWidget.getBackground());
+ gc.setBackground(textWidget.getBackground());
+ Rectangle bounds = image.getBounds();
+ gc.fillRectangle(new Rectangle(left.x, left.y, bounds.width, bounds.height));
+
+ // now draw the image.
+ gc.setForeground(foreground);
+ gc.setBackground(background);
+ gc.drawImage(image, left.x, left.y);
+ }
+ } else {
+ textWidget.redrawRange(offset, length, true);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css
new file mode 100644
index 0000000..8a347ac
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css
@@ -0,0 +1,127 @@
+/* these are the default styles that would normally be applied by a browser */
+h1 {
+ font-size: 120%;
+ font-weight: bold;
+ color: #172f47;
+}
+
+h2 {
+ font-size: 110%;
+ font-weight: bold;
+ color: #172f47;
+}
+
+h3 {
+ font-size: 105%;
+ font-weight: bold;
+ color: #172f47;
+}
+
+h4 {
+ font-weight: bold;
+ color: #172f47;
+}
+
+h5 {
+ font-size: 90%;
+ font-weight: bold;
+ color: #172f47;
+}
+
+h6 {
+ font-size: 80%;
+ font-weight: bold;
+ color: #172f47;
+}
+
+b {
+ font-weight: bold;
+}
+
+strong {
+ font-weight: bold;
+}
+
+i {
+ font-style: italic;
+}
+
+cite {
+ font-style: italic;
+}
+
+em {
+ font-style: italic;
+}
+
+var {
+ font-style: italic;
+}
+
+dfn {
+ font-style: italic;
+}
+
+code {
+ font-family: monospace;
+ color:#4444CC;
+}
+
+pre {
+ font-family: monospace;
+}
+
+/* Java stack traces
+pre.javaStackTrace {
+ font-family: monospace;
+}
+*/
+
+/* sections beginning with -- Error Details --
+pre.eclipseErrorDetails {
+ font-family: monospace;
+}
+*/
+
+ins {
+ text-decoration: underline;
+}
+
+del {
+ text-decoration: line-through;
+}
+
+sup {
+ font-size: smaller;
+ vertical-align: super;
+}
+
+a {
+ text-decoration: underline;
+ color: blue;
+}
+
+sup a {
+ text-decoration: none;
+}
+
+sub {
+ font-size: smaller;
+ vertical-align: sub;
+}
+
+dt {
+ font-weight: bold;
+}
+
+blockquote {
+ color: rgb(38, 86, 145);
+}
+
+tt {
+ font-family: monospace;
+}
+
+q {
+ color: rgb(38, 86, 145);
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/messages.properties
new file mode 100644
index 0000000..1b07871
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/messages.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+HtmlTextPresentationParser_defaultFontRequired=Must specify defaultFont
+HtmlTextPresentationParser_presentationRequired=Must specify presentation
+ImageManager_accessFailed=Cannot access {0}
+TextHover_hyperlinkHover=Open ''{0}'' in a browser
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorHrefAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorHrefAnnotation.java
new file mode 100644
index 0000000..547c172
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorHrefAnnotation.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * An annotation that marks the location of an <code>a/@href</code>.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class AnchorHrefAnnotation extends Annotation {
+
+ public static final String TYPE = "org.eclipse.mylyn.wikitext.ui.annotation.anchor"; //$NON-NLS-1$
+
+ public AnchorHrefAnnotation(String href) {
+ super(TYPE, false, href);
+ }
+
+ public String getAnchorHref() {
+ return getText();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorNameAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorNameAnnotation.java
new file mode 100644
index 0000000..bc89599
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/AnchorNameAnnotation.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * An annotation that marks the location of an <code>a/@name</code>.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class AnchorNameAnnotation extends Annotation {
+
+ public static final String TYPE = "org.eclipse.mylyn.wikitext.ui.annotation.anchorName"; //$NON-NLS-1$
+
+ public AnchorNameAnnotation(String name) {
+ super(TYPE, false, name);
+ }
+
+ public String getAnchorName() {
+ return getText();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/ClassAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/ClassAnnotation.java
new file mode 100644
index 0000000..e326ceb
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/ClassAnnotation.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * An annotation that marks the location of an element that has an @class.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ClassAnnotation extends Annotation {
+
+ public static final String TYPE = "org.eclipse.mylyn.wikitext.ui.annotation.class"; //$NON-NLS-1$
+
+ public ClassAnnotation(String cssClass) {
+ super(TYPE, false, cssClass);
+ }
+
+ public String getCssClass() {
+ return getText();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/IdAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/IdAnnotation.java
new file mode 100644
index 0000000..dacfc58
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/IdAnnotation.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * An annotation that marks the location of an element that has an @id.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class IdAnnotation extends Annotation {
+
+ public static final String TYPE = "org.eclipse.mylyn.wikitext.ui.annotation.id"; //$NON-NLS-1$
+
+ public IdAnnotation(String id) {
+ super(TYPE, false, id);
+ }
+
+ public String getElementId() {
+ return getText();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/TitleAnnotation.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/TitleAnnotation.java
new file mode 100644
index 0000000..3effe5d
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/annotation/TitleAnnotation.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.annotation;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * An annotation for "title" or tooltip text.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class TitleAnnotation extends Annotation {
+ private final String titleType;
+
+ public static final String TYPE = "org.eclipse.mylyn.wikitext.ui.annotation.title"; //$NON-NLS-1$
+
+ public TitleAnnotation(String title, String titleType) {
+ super(TYPE, false, title);
+ this.titleType = titleType;
+ }
+
+ /**
+ * The type of title. Typically corresponds to the HTML element name for which there is a title.
+ */
+ public String getTitleType() {
+ return titleType;
+ }
+
+ /**
+ * The title text.
+ */
+ public String getTitle() {
+ return getText();
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/AbstractMarkupResourceHandler.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/AbstractMarkupResourceHandler.java
new file mode 100644
index 0000000..b346c15
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/AbstractMarkupResourceHandler.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.commands;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.MarkupEditor;
+import org.eclipse.mylyn.wikitext.core.WikiText;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+
+
+/**
+ * An abstract base class for handlers that use the workbench selection to operate on resources
+ *
+ * @author David Green
+ *
+ */
+public abstract class AbstractMarkupResourceHandler extends AbstractHandler {
+
+ protected MarkupLanguage markupLanguage;
+
+ private IStructuredSelection selection;
+
+ @SuppressWarnings("unchecked")
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ ISelection currentSelection = selection;
+ if (currentSelection == null) {
+ try {
+ currentSelection = computeSelection(event);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+
+ if (currentSelection instanceof IStructuredSelection) {
+ IStructuredSelection structuredSelection = (IStructuredSelection) currentSelection;
+ Iterator<Object> it = structuredSelection.iterator();
+ while (it.hasNext()) {
+ Object o = it.next();
+ IFile file = null;
+ if (o instanceof IAdaptable) {
+ file = (IFile) ((IAdaptable) o).getAdapter(IFile.class);
+ }
+ if (file != null) {
+ String name = file.getName();
+ int idxOfDot = name.lastIndexOf('.');
+ if (idxOfDot != -1) {
+ name = name.substring(0, idxOfDot);
+ }
+ // use a temporary so that the setting does not stick even if the handler is reused.
+ MarkupLanguage prev = markupLanguage;
+ try {
+ if (markupLanguage == null) {
+ markupLanguage = MarkupEditor.loadMarkupLanguagePreference(file);
+ if (markupLanguage == null) {
+ markupLanguage = WikiText.getMarkupLanguageForFilename(file.getName());
+ }
+ if (markupLanguage == null) {
+ MessageDialog.openError(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.AbstractMarkupResourceHandler_unexpectedError, NLS.bind(
+ Messages.AbstractMarkupResourceHandler_markupLanguageMappingFailed,
+ new Object[] { file.getName() }));
+ return null;
+ }
+ }
+
+ handleFile(file, name);
+ } finally {
+ markupLanguage = prev;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @param event
+ * @since 1.1
+ */
+ protected ISelection computeSelection(ExecutionEvent event) {
+ ISelection selection = HandlerUtil.getActiveMenuSelection(event);
+ if (!(selection instanceof IStructuredSelection)) {
+ selection = HandlerUtil.getActiveMenuEditorInput(event);
+ }
+ if (!(selection instanceof IStructuredSelection)) {
+ selection = HandlerUtil.getCurrentSelection(event);
+ }
+ if (!(selection instanceof IStructuredSelection)) {
+ selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+ }
+ return selection;
+ }
+
+ protected abstract void handleFile(IFile file, String name) throws ExecutionException;
+
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ /**
+ * @since 1.1
+ */
+ public IStructuredSelection getSelection() {
+ return selection;
+ }
+
+ /**
+ * @since 1.1
+ */
+ public void setSelection(IStructuredSelection selection) {
+ this.selection = selection;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToDocbook.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToDocbook.java
new file mode 100644
index 0000000..b838c99
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToDocbook.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.commands;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToDocbook;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PlatformUI;
+
+
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ConvertMarkupToDocbook extends AbstractMarkupResourceHandler {
+
+ @Override
+ protected void handleFile(IFile file, String name) {
+ final IFile newFile = file.getParent().getFile(new Path(name + ".xml")); //$NON-NLS-1$
+ if (newFile.exists()) {
+ if (!MessageDialog.openQuestion(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ConvertMarkupToDocbook_overwrite, NLS.bind(Messages.ConvertMarkupToDocbook_fileExistsOverwrite, new Object[] { newFile.getFullPath() }))) {
+ return;
+ }
+ }
+
+ MarkupToDocbook markupToDocbook = new MarkupToDocbook();
+ markupToDocbook.setMarkupLanguage(markupLanguage);
+ markupToDocbook.setBookTitle(name);
+
+ try {
+ StringWriter w = new StringWriter();
+ Reader r = new InputStreamReader(new BufferedInputStream(file.getContents()), file.getCharset());
+ try {
+ int i;
+ while ((i = r.read()) != -1) {
+ w.write((char) i);
+ }
+ } finally {
+ r.close();
+ }
+
+ final String docbook = markupToDocbook.parse(w.toString());
+
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ if (newFile.exists()) {
+ newFile.setContents(new ByteArrayInputStream(docbook.getBytes("utf-8")), false, true, //$NON-NLS-1$
+ monitor);
+ } else {
+ newFile.create(new ByteArrayInputStream(docbook.getBytes("utf-8")), false, monitor); //$NON-NLS-1$
+ }
+ newFile.setCharset("utf-8", monitor); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ };
+ try {
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
+ } catch (InterruptedException e) {
+ return;
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ }
+ } catch (Throwable e) {
+ StringWriter message = new StringWriter();
+ PrintWriter out = new PrintWriter(message);
+ out.println(Messages.ConvertMarkupToDocbook_cannotConvert + e.getMessage());
+ out.println(Messages.ConvertMarkupToDocbook_detailsFollow);
+ e.printStackTrace(out);
+ out.close();
+
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ConvertMarkupToDocbook_cannotCompleteOperation, message.toString());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToEclipseHelp.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToEclipseHelp.java
new file mode 100644
index 0000000..acd102a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToEclipseHelp.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.commands;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.wikitext.core.parser.util.MarkupToEclipseToc;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PlatformUI;
+
+
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ConvertMarkupToEclipseHelp extends ConvertMarkupToHtml {
+
+ @Override
+ protected void handleFile(IFile file, String name) {
+ super.handleFile(file, name);
+ final IFile newFile = file.getParent().getFile(new Path(name + "-toc.xml")); //$NON-NLS-1$
+ if (newFile.exists()) {
+ if (!MessageDialog.openQuestion(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ConvertMarkupToEclipseHelp_overwrite, NLS.bind(Messages.ConvertMarkupToEclipseHelp_fileExistsOverwrite, new Object[] { newFile.getFullPath() }))) {
+ return;
+ }
+ }
+
+ IPath parentFullPath = file.getParent().getFullPath();
+ IPath pluginPathToHelp = parentFullPath.removeFirstSegments(1);
+
+ MarkupToEclipseToc markupToEclipseToc = new MarkupToEclipseToc();
+ markupToEclipseToc.setMarkupLanguage(markupLanguage);
+ markupToEclipseToc.setBookTitle(name);
+
+ String htmlFilePath = name + ".html"; //$NON-NLS-1$
+ if (pluginPathToHelp.segmentCount() > 0) {
+ String pathPart = pluginPathToHelp.toString();
+ if (!pathPart.endsWith("/")) { //$NON-NLS-1$
+ pathPart = pathPart + "/"; //$NON-NLS-1$
+ }
+ htmlFilePath = pathPart + htmlFilePath;
+ }
+ markupToEclipseToc.setHtmlFile(htmlFilePath);
+
+ try {
+ StringWriter w = new StringWriter();
+ Reader r = new InputStreamReader(new BufferedInputStream(file.getContents()), file.getCharset());
+ try {
+ int i;
+ while ((i = r.read()) != -1) {
+ w.write((char) i);
+ }
+ } finally {
+ r.close();
+ }
+
+ final String tocXml = markupToEclipseToc.parse(w.toString());
+
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ if (newFile.exists()) {
+ newFile.setContents(new ByteArrayInputStream(tocXml.getBytes("utf-8")), false, true, //$NON-NLS-1$
+ monitor);
+ } else {
+ newFile.create(new ByteArrayInputStream(tocXml.getBytes("utf-8")), false, monitor); //$NON-NLS-1$
+ }
+ newFile.setCharset("utf-8", monitor); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ };
+ try {
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
+ } catch (InterruptedException e) {
+ return;
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ }
+ } catch (Throwable e) {
+ StringWriter message = new StringWriter();
+ PrintWriter out = new PrintWriter(message);
+ out.println(Messages.ConvertMarkupToEclipseHelp_cannotConvert + e.getMessage());
+ out.println(Messages.ConvertMarkupToEclipseHelp_detailsFollow);
+ e.printStackTrace(out);
+ out.close();
+
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ConvertMarkupToEclipseHelp_cannotCompleteOperation, message.toString());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToHtml.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToHtml.java
new file mode 100644
index 0000000..9d11c70
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/ConvertMarkupToHtml.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.commands;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder;
+import org.eclipse.mylyn.wikitext.core.util.XmlStreamWriter;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.PlatformUI;
+
+
+
+/**
+ *
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class ConvertMarkupToHtml extends AbstractMarkupResourceHandler {
+
+ @Override
+ protected void handleFile(IFile file, String name) {
+ final IFile newFile = file.getParent().getFile(new Path(name + ".html")); //$NON-NLS-1$
+ if (newFile.exists()) {
+ if (!MessageDialog.openQuestion(
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ConvertMarkupToHtml_overwrite, NLS.bind(Messages.ConvertMarkupToHtml_fileExistsOverwrite, new Object[] { newFile.getFullPath() }))) {
+ return;
+ }
+ }
+
+ StringWriter writer = new StringWriter();
+ HtmlDocumentBuilder builder = new HtmlDocumentBuilder(writer) {
+ @Override
+ protected XmlStreamWriter createXmlStreamWriter(Writer out) {
+ return super.createFormattingXmlStreamWriter(out);
+ }
+ };
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ parser.setBuilder(builder);
+ builder.setEmitDtd(true);
+
+ try {
+ StringWriter w = new StringWriter();
+ Reader r = new InputStreamReader(new BufferedInputStream(file.getContents()), file.getCharset());
+ try {
+ int i;
+ while ((i = r.read()) != -1) {
+ w.write((char) i);
+ }
+ } finally {
+ r.close();
+ }
+
+ parser.parse(w.toString());
+ final String xhtmlContent = writer.toString();
+
+ IRunnableWithProgress runnable = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ if (newFile.exists()) {
+ newFile.setContents(new ByteArrayInputStream(xhtmlContent.getBytes("utf-8")), false, true, //$NON-NLS-1$
+ monitor);
+ } else {
+ newFile.create(new ByteArrayInputStream(xhtmlContent.getBytes("utf-8")), false, monitor); //$NON-NLS-1$
+ }
+ newFile.setCharset("utf-8", monitor); //$NON-NLS-1$
+ } catch (Exception e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ };
+ try {
+ PlatformUI.getWorkbench().getProgressService().busyCursorWhile(runnable);
+ } catch (InterruptedException e) {
+ return;
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ }
+ } catch (Throwable e) {
+ StringWriter message = new StringWriter();
+ PrintWriter out = new PrintWriter(message);
+ out.println(Messages.ConvertMarkupToHtml_cannotConvert + e.getMessage());
+ out.println(Messages.ConvertMarkupToHtml_detailsFollow);
+ e.printStackTrace(out);
+ out.close();
+
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+ Messages.ConvertMarkupToHtml_cannotCompleteOperation, message.toString());
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/Messages.java
new file mode 100644
index 0000000..c7b4752
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/Messages.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.ui.commands;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.wikitext.ui.commands.messages"; //$NON-NLS-1$
+
+ public static String AbstractMarkupResourceHandler_markupLanguageMappingFailed;
+
+ public static String AbstractMarkupResourceHandler_unexpectedError;
+
+ public static String ConvertMarkupToDocbook_cannotCompleteOperation;
+
+ public static String ConvertMarkupToDocbook_cannotConvert;
+
+ public static String ConvertMarkupToDocbook_detailsFollow;
+
+ public static String ConvertMarkupToDocbook_fileExistsOverwrite;
+
+ public static String ConvertMarkupToDocbook_overwrite;
+
+ public static String ConvertMarkupToEclipseHelp_cannotCompleteOperation;
+
+ public static String ConvertMarkupToEclipseHelp_cannotConvert;
+
+ public static String ConvertMarkupToEclipseHelp_detailsFollow;
+
+ public static String ConvertMarkupToEclipseHelp_fileExistsOverwrite;
+
+ public static String ConvertMarkupToEclipseHelp_overwrite;
+
+ public static String ConvertMarkupToHtml_cannotCompleteOperation;
+
+ public static String ConvertMarkupToHtml_cannotConvert;
+
+ public static String ConvertMarkupToHtml_detailsFollow;
+
+ public static String ConvertMarkupToHtml_fileExistsOverwrite;
+
+ public static String ConvertMarkupToHtml_overwrite;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/messages.properties
new file mode 100644
index 0000000..f015988
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/commands/messages.properties
@@ -0,0 +1,27 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+AbstractMarkupResourceHandler_markupLanguageMappingFailed=Cannot guess markup language for file ''{0}''
+AbstractMarkupResourceHandler_unexpectedError=Unexpected Error
+ConvertMarkupToDocbook_cannotCompleteOperation=Cannot complete operation
+ConvertMarkupToDocbook_cannotConvert=Cannot convert to docbook:
+ConvertMarkupToDocbook_detailsFollow=Details follow:
+ConvertMarkupToDocbook_fileExistsOverwrite=File ''{0}'' exists: overwrite?
+ConvertMarkupToDocbook_overwrite=Overwrite?
+ConvertMarkupToEclipseHelp_cannotCompleteOperation=Cannot complete operation
+ConvertMarkupToEclipseHelp_cannotConvert=Cannot convert to eclipse help table of contents:
+ConvertMarkupToEclipseHelp_detailsFollow=Details follow:
+ConvertMarkupToEclipseHelp_fileExistsOverwrite=File ''{0}'' exists: overwrite?
+ConvertMarkupToEclipseHelp_overwrite=Overwrite?
+ConvertMarkupToHtml_cannotCompleteOperation=Cannot complete operation
+ConvertMarkupToHtml_cannotConvert=Cannot convert to HTML:
+ConvertMarkupToHtml_detailsFollow=Details follow:
+ConvertMarkupToHtml_fileExistsOverwrite=File ''{0}'' exists: overwrite?
+ConvertMarkupToHtml_overwrite=Overwrite?
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/MarkupSourceViewer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/MarkupSourceViewer.java
new file mode 100644
index 0000000..00bbe97
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/MarkupSourceViewer.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.ui.editor;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.information.IInformationPresenter;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.commands.ShowQuickOutlineCommand;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.FastMarkupPartitioner;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A source viewer for editors using lightweight markup. Typically configured as follows:
+ *
+ * <pre>
+ * SourceViewer viewer = new MarkupSourceViewer(parent, null, style | SWT.WRAP, markupLanguage);
+ * // configure the viewer
+ * MarkupSourceViewerConfiguration configuration = createSourceViewerConfiguration(taskRepository, viewer);
+ *
+ * configuration.setMarkupLanguage(markupLanguage);
+ * configuration.setShowInTarget(new ShowInTargetBridge(viewer));
+ * viewer.configure(configuration);
+ *
+ * // we want the viewer to show annotations
+ * viewer.showAnnotations(true);
+ * </pre>
+ *
+ * @author David Green
+ *
+ * @since 1.1
+ */
+public class MarkupSourceViewer extends SourceViewer {
+ private final MarkupLanguage markupLanguage;
+
+ /**
+ * Operation code for quick outline
+ */
+ public static final int QUICK_OUTLINE = ShowQuickOutlineCommand.QUICK_OUTLINE;
+
+ private IInformationPresenter outlinePresenter;
+
+ public MarkupSourceViewer(Composite parent, IVerticalRuler ruler, int styles, MarkupLanguage markupLanguage) {
+ super(parent, ruler, styles);
+ this.markupLanguage = markupLanguage;
+ }
+
+ @Override
+ public void setDocument(IDocument document, IAnnotationModel annotationModel, int modelRangeOffset,
+ int modelRangeLength) {
+ if (document != null) {
+ configurePartitioning(document);
+ }
+ super.setDocument(document, annotationModel, modelRangeOffset, modelRangeLength);
+ }
+
+ private void configurePartitioning(IDocument document) {
+ FastMarkupPartitioner partitioner = new FastMarkupPartitioner();
+ partitioner.setMarkupLanguage(markupLanguage.clone());
+ partitioner.connect(document);
+ document.setDocumentPartitioner(partitioner);
+ }
+
+ @Override
+ public void doOperation(int operation) {
+ if (operation == QUICK_OUTLINE && outlinePresenter != null) {
+ outlinePresenter.showInformation();
+ return;
+ }
+ super.doOperation(operation);
+ }
+
+ @Override
+ public boolean canDoOperation(int operation) {
+ if (operation == QUICK_OUTLINE && outlinePresenter != null) {
+ return true;
+ }
+ return super.canDoOperation(operation);
+ }
+
+ @Override
+ public void configure(SourceViewerConfiguration configuration) {
+ super.configure(configuration);
+ if (configuration instanceof MarkupSourceViewerConfiguration) {
+ outlinePresenter = ((MarkupSourceViewerConfiguration) configuration).getOutlineInformationPresenter(this);
+ outlinePresenter.install(this);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/MarkupSourceViewerConfiguration.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/MarkupSourceViewerConfiguration.java
new file mode 100644
index 0000000..485fb5c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/MarkupSourceViewerConfiguration.java
@@ -0,0 +1,407 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.editor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.DefaultTextHover;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.information.IInformationPresenter;
+import org.eclipse.jface.text.information.IInformationProvider;
+import org.eclipse.jface.text.information.IInformationProviderExtension;
+import org.eclipse.jface.text.information.IInformationProviderExtension2;
+import org.eclipse.jface.text.information.InformationPresenter;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.MonoReconciler;
+import org.eclipse.jface.text.rules.ITokenScanner;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.assist.AnchorCompletionProcessor;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.assist.MarkupTemplateCompletionProcessor;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.assist.MultiplexingContentAssistProcessor;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.outline.QuickOutlinePopupDialog;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler.MarkupMonoReconciler;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler.MarkupValidationReconcilingStrategy;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.reconciler.MultiReconcilingStrategy;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.FastMarkupPartitioner;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.MarkupDamagerRepairer;
+import org.eclipse.mylyn.internal.wikitext.ui.editor.syntax.MarkupTokenScanner;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineParser;
+import org.eclipse.mylyn.wikitext.ui.viewer.AbstractTextSourceViewerConfiguration;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.texteditor.HippieProposalProcessor;
+
+/**
+ * A source viewer configuration suitable for installing on a markup editor
+ *
+ * @author David Green
+ *
+ * @since 1.1
+ */
+public class MarkupSourceViewerConfiguration extends AbstractTextSourceViewerConfiguration {
+
+ private ITokenScanner scanner;
+
+ private MarkupTemplateCompletionProcessor completionProcessor;
+
+ private AnchorCompletionProcessor anchorCompletionProcessor;
+
+ private MarkupLanguage markupLanguage;
+
+ private MarkupValidationReconcilingStrategy markupValidationReconcilingStrategy;
+
+ private IFile file;
+
+ private ITextHover textHover;
+
+ private OutlineItem outline;
+
+ private Font defaultFont;
+
+ private Font defaultMonospaceFont;
+
+ private InformationPresenter informationPresenter;
+
+ private IShowInTarget showInTarget;
+
+ public MarkupSourceViewerConfiguration(IPreferenceStore preferenceStore) {
+ super(preferenceStore);
+ defaultFont = JFaceResources.getDefaultFont();
+ }
+
+ /**
+ * @since 1.1
+ */
+ public ITokenScanner getMarkupScanner() {
+ if (scanner == null) {
+ scanner = new MarkupTokenScanner(defaultFont, defaultMonospaceFont);
+ }
+ return scanner;
+ }
+
+ @Override
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+ PresentationReconciler reconciler = new PresentationReconciler();
+ reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+ MarkupDamagerRepairer damagerRepairer = new MarkupDamagerRepairer(getMarkupScanner());
+ for (String partitionType : FastMarkupPartitioner.ALL_CONTENT_TYPES) {
+ reconciler.setDamager(damagerRepairer, partitionType);
+ reconciler.setRepairer(damagerRepairer, partitionType);
+ }
+ reconciler.setDamager(damagerRepairer, IDocument.DEFAULT_CONTENT_TYPE);
+ reconciler.setRepairer(damagerRepairer, IDocument.DEFAULT_CONTENT_TYPE);
+
+ return reconciler;
+ }
+
+ @Override
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+ if (completionProcessor == null) {
+ completionProcessor = new MarkupTemplateCompletionProcessor();
+ completionProcessor.setMarkupLanguage(markupLanguage);
+ }
+ if (anchorCompletionProcessor == null && outline != null) {
+ anchorCompletionProcessor = new AnchorCompletionProcessor();
+ anchorCompletionProcessor.setOutline(outline);
+ }
+ HippieProposalProcessor hippieProcessor = new HippieProposalProcessor();
+
+ MultiplexingContentAssistProcessor processor = new MultiplexingContentAssistProcessor();
+ if (anchorCompletionProcessor != null) {
+ processor.addDelegate(anchorCompletionProcessor);
+ }
+ processor.addDelegate(completionProcessor);
+ processor.addDelegate(hippieProcessor);
+
+ IContentAssistProcessor[] processors = createContentAssistProcessors();
+ if (processors != null) {
+ for (IContentAssistProcessor cap : processors) {
+ processor.addDelegate(cap);
+ }
+ }
+
+ ContentAssistant assistant = new ContentAssistant();
+ assistant.enableAutoActivation(true);
+ assistant.enableAutoInsert(true);
+ assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE);
+
+ for (String partitionType : FastMarkupPartitioner.ALL_CONTENT_TYPES) {
+ assistant.setContentAssistProcessor(processor, partitionType);
+ }
+
+ return assistant;
+ }
+
+ /**
+ * subclasses may override this method to create additional content assist processors.
+ *
+ * @return processors, or null if there are none.
+ */
+ protected IContentAssistProcessor[] createContentAssistProcessors() {
+ return null;
+ }
+
+ /**
+ * Set the markup language of the configuration. Causes the completion processor, validating reconciling strategy
+ * and other configuration elements to be aware of the markup language in use. This may be called more than once
+ * during the lifecycle of the editor.
+ *
+ * @param markupLanguage
+ * the markup language
+ */
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ if (completionProcessor != null) {
+ completionProcessor.setMarkupLanguage(markupLanguage);
+ }
+ if (markupValidationReconcilingStrategy != null) {
+ markupValidationReconcilingStrategy.setMarkupLanguage(markupLanguage);
+ }
+ }
+
+ @Override
+ public IReconciler getReconciler(ISourceViewer sourceViewer) {
+ IReconcilingStrategy strategy;
+ {
+ if (markupValidationReconcilingStrategy == null) {
+ markupValidationReconcilingStrategy = new MarkupValidationReconcilingStrategy(sourceViewer);
+ markupValidationReconcilingStrategy.setMarkupLanguage(markupLanguage);
+ markupValidationReconcilingStrategy.setResource(file);
+ }
+ IReconciler reconciler = super.getReconciler(sourceViewer);
+ if (reconciler != null) {
+ MultiReconcilingStrategy multiStrategy = new MultiReconcilingStrategy();
+ for (String contentType : FastMarkupPartitioner.ALL_CONTENT_TYPES) {
+ maybeAddReconcilingStrategyForContentType(multiStrategy, reconciler, contentType);
+ }
+ maybeAddReconcilingStrategyForContentType(multiStrategy, reconciler, IDocument.DEFAULT_CONTENT_TYPE);
+ multiStrategy.add(markupValidationReconcilingStrategy);
+ strategy = multiStrategy;
+ } else {
+ strategy = markupValidationReconcilingStrategy;
+ }
+ }
+ MonoReconciler reconciler = new MarkupMonoReconciler(strategy, false);
+ reconciler.setIsIncrementalReconciler(false);
+ reconciler.setProgressMonitor(new NullProgressMonitor());
+ reconciler.setDelay(500);
+ return reconciler;
+ }
+
+ private void maybeAddReconcilingStrategyForContentType(MultiReconcilingStrategy multiStrategy,
+ IReconciler reconciler, String contentType) {
+ final IReconcilingStrategy reconcilingStrategy = reconciler.getReconcilingStrategy(contentType);
+ if (reconcilingStrategy != null && !multiStrategy.contains(reconcilingStrategy)) {
+ multiStrategy.add(reconcilingStrategy);
+ }
+ }
+
+ /**
+ * Set the file being edited. If a file is being edited this allows for validation to create markers on the file.
+ * Some editors are not file-based and thus need not invoke this method.
+ *
+ * @param file
+ * the file, which may be null.
+ */
+ public void setFile(IFile file) {
+ this.file = file;
+ if (markupValidationReconcilingStrategy != null) {
+ markupValidationReconcilingStrategy.setResource(file);
+ }
+ }
+
+ @Override
+ public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
+ if (textHover == null) {
+ textHover = new DefaultTextHover(sourceViewer);
+ }
+ return textHover;
+ }
+
+ /**
+ * provide access to an information presenter that can be used to pop-up a quick outline.
+ *
+ * Source viewers should configure as follows:
+ *
+ * <pre>
+ * public void configure(SourceViewerConfiguration configuration) {
+ * super.configure(configuration);
+ * if (configuration instanceof MarkupSourceViewerConfiguration) {
+ * outlinePresenter = ((MarkupSourceViewerConfiguration) configuration).getOutlineInformationPresenter(this);
+ * outlinePresenter.install(this);
+ * }
+ * }
+ * </pre>
+ *
+ * @param sourceViewer
+ * the source viewer for which the presenter should be created
+ *
+ * @return the presenter
+ */
+ public IInformationPresenter getOutlineInformationPresenter(ISourceViewer sourceViewer) {
+ if (informationPresenter == null) {
+ IInformationControlCreator controlCreator = getOutlineInformationControlCreator();
+ informationPresenter = new InformationPresenter(controlCreator);
+ informationPresenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+ // Register information provider
+ IInformationProvider provider = new InformationProvider(controlCreator);
+ String[] contentTypes = getConfiguredContentTypes(sourceViewer);
+ for (String contentType : contentTypes) {
+ informationPresenter.setInformationProvider(provider, contentType);
+ }
+
+ informationPresenter.setSizeConstraints(60, 20, true, true);
+ }
+ return informationPresenter;
+ }
+
+ @Override
+ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+ List<String> contentTypes = new ArrayList<String>(3);
+ contentTypes.addAll(Arrays.asList(FastMarkupPartitioner.ALL_CONTENT_TYPES));
+ contentTypes.add(IDocument.DEFAULT_CONTENT_TYPE);
+ return contentTypes.toArray(new String[contentTypes.size()]);
+ }
+
+ protected IInformationControlCreator getOutlineInformationControlCreator() {
+ return new IInformationControlCreator() {
+ public IInformationControl createInformationControl(Shell parent) {
+ QuickOutlinePopupDialog dialog = new QuickOutlinePopupDialog(parent, showInTarget);
+ return dialog;
+ }
+ };
+ }
+
+ /**
+ * Set the outline on this configuration. Outlines are used for document-internal references as well as for quick
+ * outline. Editors that call this method must keep the outline up to date as the source document changes. Editors
+ * that do not maintain an outline need not call this method, since the outline will be computed as needed for the
+ * quick outline.
+ *
+ * @param outlineModel
+ */
+ public void setOutline(OutlineItem outlineModel) {
+ this.outline = outlineModel;
+ if (anchorCompletionProcessor != null) {
+ anchorCompletionProcessor.setOutline(outline);
+ }
+ }
+
+ /**
+ * the default font, as used by the {@link #getMarkupScanner() scanner}.
+ */
+ public Font getDefaultFont() {
+ return defaultFont;
+ }
+
+ /**
+ * the default font, as used by the {@link #getMarkupScanner() scanner}.
+ */
+ public void setDefaultFont(Font defaultFont) {
+ this.defaultFont = defaultFont;
+ }
+
+ /**
+ * the default font for monospace text, as used by the {@link #getMarkupScanner() scanner}.
+ */
+ public Font getDefaultMonospaceFont() {
+ return defaultMonospaceFont;
+ }
+
+ /**
+ * the default font for monospace text, as used by the {@link #getMarkupScanner() scanner}.
+ */
+ public void setDefaultMonospaceFont(Font defaultMonospaceFont) {
+ this.defaultMonospaceFont = defaultMonospaceFont;
+ }
+
+ /**
+ * provide a {@link IShowInTarget show in target} to connect the quick-outline popup with the editor.
+ */
+ public IShowInTarget getShowInTarget() {
+ return showInTarget;
+ }
+
+ /**
+ * provide a {@link IShowInTarget show in target} to connect the quick-outline popup with the editor.
+ */
+ public void setShowInTarget(IShowInTarget showInTarget) {
+ this.showInTarget = showInTarget;
+ }
+
+ private class InformationProvider implements IInformationProvider, IInformationProviderExtension,
+ IInformationProviderExtension2 {
+
+ private final IInformationControlCreator controlCreator;
+
+ public InformationProvider(IInformationControlCreator controlCreator) {
+ this.controlCreator = controlCreator;
+ }
+
+ @Deprecated
+ public String getInformation(ITextViewer textViewer, IRegion subject) {
+ return getInformation2(textViewer, subject).toString();
+ }
+
+ public Object getInformation2(ITextViewer textViewer, IRegion subject) {
+ if (outline == null) {
+ // If the outline was not set then parse it. This can happen in a task editor
+ if (markupLanguage != null) {
+ IDocument document = textViewer.getDocument();
+ if (document != null && document.getLength() > 0) {
+ MarkupLanguage language = markupLanguage.clone();
+ OutlineParser outlineParser = new OutlineParser();
+ outlineParser.setMarkupLanguage(language.clone());
+ String markup = document.get();
+ final OutlineItem outline = outlineParser.parse(markup);
+ if (MarkupSourceViewerConfiguration.this.file != null) {
+ outline.setResourcePath(MarkupSourceViewerConfiguration.this.file.getFullPath().toString());
+ }
+ return outline;
+ }
+ }
+ }
+ return outline;
+ }
+
+ public IRegion getSubject(ITextViewer textViewer, int offset) {
+ return new Region(offset, 0);
+ }
+
+ public IInformationControlCreator getInformationPresenterControlCreator() {
+ return controlCreator;
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/ShowInTargetBridge.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/ShowInTargetBridge.java
new file mode 100644
index 0000000..3e3cfcc
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/editor/ShowInTargetBridge.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.ui.editor;
+
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.wikitext.core.parser.outline.OutlineItem;
+import org.eclipse.ui.part.IShowInTarget;
+import org.eclipse.ui.part.ShowInContext;
+
+/**
+ * A means of briding a {@link SourceViewer} with {@link IShowInTarget}.
+ *
+ * @author David Green
+ *
+ * @since 1.1
+ */
+public class ShowInTargetBridge implements IShowInTarget {
+
+ private final SourceViewer viewer;
+
+ public ShowInTargetBridge(SourceViewer viewer) {
+ this.viewer = viewer;
+ }
+
+ public boolean show(ShowInContext context) {
+ ISelection selection = context.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ for (Object element : ((IStructuredSelection) selection).toArray()) {
+ if (element instanceof OutlineItem) {
+ OutlineItem item = (OutlineItem) element;
+ viewer.setSelection(new TextSelection(item.getOffset(), item.getLength()), true);
+ return true;
+ }
+ }
+ } else if (selection instanceof ITextSelection) {
+ viewer.setSelection(selection, true);
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/AbstractTextSourceViewerConfiguration.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/AbstractTextSourceViewerConfiguration.java
new file mode 100644
index 0000000..ae25010
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/AbstractTextSourceViewerConfiguration.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.util.HyperlinkDetectorDelegate;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
+import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor;
+import org.eclipse.ui.texteditor.HyperlinkDetectorRegistry;
+
+/**
+ * Extends the default text source viewer configuration to provide greater configurability and extensibility. Makes it
+ * easy to filter and customize hyperlink detectors.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public abstract class AbstractTextSourceViewerConfiguration extends TextSourceViewerConfiguration {
+ /**
+ * a filter for filtering hyperlink descriptors
+ */
+ public interface HyperlinkDetectorDescriptorFilter {
+ public boolean filter(HyperlinkDetectorDescriptor descriptor);
+ }
+
+ /**
+ * indicate if markup hyperlinks should be detected before other types of hyperlinks. This can affect the order in
+ * which the hyperlinks are presented to the user in the case where multiple hyperlinks are detected in the same
+ * region of text. The default is true.
+ */
+ protected boolean markupHyperlinksFirst = true;
+
+ private List<HyperlinkDetectorDescriptorFilter> hyperlinkDetectorDescriptorFilters;
+
+ private List<IHyperlinkDetector> hyperlinkDetectors;
+
+ public AbstractTextSourceViewerConfiguration() {
+ super();
+ }
+
+ public AbstractTextSourceViewerConfiguration(IPreferenceStore preferenceStore) {
+ super(preferenceStore);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
+ List<IHyperlinkDetector> customDetectors = createCustomHyperlinkDetectors(sourceViewer);
+
+ if (sourceViewer == null || fPreferenceStore == null) {
+ return customDetectors.toArray(new IHyperlinkDetector[customDetectors.size()]);
+ }
+ HyperlinkDetectorRegistry registry = EditorsUI.getHyperlinkDetectorRegistry();
+ HyperlinkDetectorDescriptor[] descriptors = registry.getHyperlinkDetectorDescriptors();
+ Map<String, IAdaptable> targets = getHyperlinkDetectorTargets(sourceViewer);
+
+ List<IHyperlinkDetector> detectors = new ArrayList<IHyperlinkDetector>(8);
+ if (markupHyperlinksFirst) {
+ detectors.addAll(customDetectors);
+ }
+ if (hyperlinkDetectors != null) {
+ detectors.addAll(hyperlinkDetectors);
+ }
+ for (Map.Entry<String, IAdaptable> target : targets.entrySet()) {
+ String targetId = target.getKey();
+ IAdaptable context = target.getValue();
+
+ for (HyperlinkDetectorDescriptor descriptor : descriptors) {
+ if (targetId.equals(descriptor.getTargetId())) {
+ if (filterHyperlinkDescriptor(descriptor)) {
+ continue;
+ }
+ HyperlinkDetectorDelegate delegate = new HyperlinkDetectorDelegate(descriptor, fPreferenceStore);
+ delegate.setContext(context);
+ detectors.add(delegate);
+ }
+ }
+ }
+ if (!markupHyperlinksFirst) {
+ detectors.addAll(customDetectors);
+ }
+ return detectors.toArray(new IHyperlinkDetector[detectors.size()]);
+ }
+
+ /**
+ * Provide custom hyperlink detectors. Subclasses may override, the default implementation provides an empty list.
+ */
+ protected List<IHyperlinkDetector> createCustomHyperlinkDetectors(ISourceViewer sourceViewer) {
+ return Collections.emptyList();
+ }
+
+ /**
+ * Indicate if the given hyperlink detector descriptor should be filtered. Filtered descriptors are not included.
+ *
+ * @see #getHyperlinkDetectors(ISourceViewer)
+ */
+ private boolean filterHyperlinkDescriptor(HyperlinkDetectorDescriptor descriptor) {
+ if (hyperlinkDetectorDescriptorFilters == null || hyperlinkDetectorDescriptorFilters.isEmpty()) {
+ return false;
+ }
+ for (HyperlinkDetectorDescriptorFilter filter : hyperlinkDetectorDescriptorFilters) {
+ if (filter.filter(descriptor)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void addHyperlinkDetectorDescriptorFilter(HyperlinkDetectorDescriptorFilter filter) {
+ if (hyperlinkDetectorDescriptorFilters == null) {
+ hyperlinkDetectorDescriptorFilters = new ArrayList<HyperlinkDetectorDescriptorFilter>();
+ }
+ hyperlinkDetectorDescriptorFilters.add(filter);
+ }
+
+ public void addHyperlinkDetector(IHyperlinkDetector detector) {
+ if (hyperlinkDetectors == null) {
+ hyperlinkDetectors = new ArrayList<IHyperlinkDetector>();
+ }
+ hyperlinkDetectors.add(detector);
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/DefaultHyperlinkDetectorDescriptorFilter.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/DefaultHyperlinkDetectorDescriptorFilter.java
new file mode 100644
index 0000000..9167d08
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/DefaultHyperlinkDetectorDescriptorFilter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import org.eclipse.mylyn.wikitext.ui.viewer.AbstractTextSourceViewerConfiguration.HyperlinkDetectorDescriptorFilter;
+import org.eclipse.ui.texteditor.HyperlinkDetectorDescriptor;
+
+/**
+ * A filter that filters hyperlink detectors by their descriptor {@link HyperlinkDetectorDescriptor#getId() id}.
+ *
+ * @author David Green
+ * @since 1.1
+ */
+public class DefaultHyperlinkDetectorDescriptorFilter implements HyperlinkDetectorDescriptorFilter {
+ private final String filteredId;
+
+ public DefaultHyperlinkDetectorDescriptorFilter(String filteredId) {
+ if (filteredId == null) {
+ throw new IllegalArgumentException();
+ }
+ this.filteredId = filteredId;
+ }
+
+ public boolean filter(HyperlinkDetectorDescriptor descriptor) {
+ String id = descriptor.getId();
+ if (filteredId.equals(id)) {
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlTextPresenter.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlTextPresenter.java
new file mode 100644
index 0000000..c539832
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlTextPresenter.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.HtmlTextPresentationParser;
+import org.eclipse.swt.graphics.Drawable;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * An information presenter that supports HTML markup. Uses the {@link HtmlTextPresentationParser HTML parser} to parse
+ * the HTML to readable text, and creates the appropriate corresponding {@link TextPresentation text presentation}.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class HtmlTextPresenter implements DefaultInformationControl.IInformationPresenter,
+ DefaultInformationControl.IInformationPresenterExtension {
+
+ private static Pattern HTML_OPEN_TAG_PATTERN = Pattern.compile("<html", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
+
+ @SuppressWarnings("deprecation")
+ public String updatePresentation(Display display, String hoverInfo, TextPresentation presentation, int maxWidth,
+ int maxHeight) {
+ return updatePresentation((Drawable) display, hoverInfo, presentation, maxWidth, maxHeight);
+ }
+
+ public String updatePresentation(Drawable drawable, String hoverInfo, TextPresentation presentation, int maxWidth,
+ int maxHeight) {
+ if (hoverInfo == null || hoverInfo.length() == 0) {
+ return hoverInfo;
+ }
+ HtmlTextPresentationParser parser = new HtmlTextPresentationParser();
+ parser.setPresentation(presentation);
+ parser.setDefaultFont(JFaceResources.getFontRegistry().defaultFont());
+ String html = hoverInfo;
+ if (!HTML_OPEN_TAG_PATTERN.matcher(html).find()) {
+ html = "<html><body>" + html + "</body></html>"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ GC gc = new GC(drawable);
+ try {
+ html = html.replaceAll("<br>", "<br/>"); //$NON-NLS-1$ //$NON-NLS-2$
+ parser.setMaxWidth(maxWidth);
+ parser.setGC(gc);
+ parser.parse(html);
+ return parser.getText();
+ } catch (Exception e) {
+ return exceptionToHoverInfo(hoverInfo, presentation, e);
+ } finally {
+ gc.dispose();
+ }
+ }
+
+ protected String exceptionToHoverInfo(String hoverInfo, TextPresentation presentation, Exception e) {
+ presentation.clear();
+ return hoverInfo;
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewer.java
new file mode 100644
index 0000000..45b1ae4
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewer.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import java.io.IOException;
+
+import org.eclipse.jface.resource.ColorRegistry;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.AnnotationPainter;
+import org.eclipse.jface.text.source.IAnnotationAccess;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.mylyn.internal.wikitext.core.util.css.Stylesheet;
+import org.eclipse.mylyn.internal.wikitext.ui.util.ImageCache;
+import org.eclipse.mylyn.internal.wikitext.ui.util.WikiTextUiResources;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.HtmlTextPresentationParser;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.ImageManager;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.BulletAnnotation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.BulletDrawingStrategy;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.HorizontalRuleAnnotation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.HorizontalRuleDrawingStrategy;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.ImageAnnotation;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.annotation.ImageDrawingStrategy;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Composite;
+import org.xml.sax.SAXException;
+
+/**
+ * A source viewer for viewing HTML as it is intended to be displayed in a read-only fashion. Useful when markup should
+ * be displayed without using a Browser widget.
+ *
+ * @see HtmlViewerConfiguration
+ * @author David Green
+ * @since 1.0
+ */
+public class HtmlViewer extends SourceViewer {
+
+ private TextPresentation textPresentation;
+
+ private boolean haveInit = false;
+
+ private HtmlViewerConfiguration configuration;
+
+ private final ImageCache imageCache = new ImageCache();
+
+ private boolean displayImages = true;
+
+ private Stylesheet stylesheet;
+
+ private Font defaultMonospaceFont;
+
+ public HtmlViewer(Composite parent, IVerticalRuler ruler, int styles) {
+ super(parent, ruler, styles);
+ setEditable(false);
+ }
+
+ public HtmlViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
+ boolean showAnnotationsOverview, int styles) {
+ super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles);
+ setEditable(false);
+ }
+
+ @SuppressWarnings("deprecation")
+ private void initPainter() {
+ if (haveInit) {
+ return;
+ }
+ haveInit = true;
+
+ // bug# 245759: must work outside of an Eclipse runtime
+ ColorRegistry colorRegistry = WikiTextUiResources.getColors();
+
+ IAnnotationAccess annotationAccess = new IAnnotationAccess() {
+ public Object getType(Annotation annotation) {
+ return annotation.getType();
+ }
+
+ public boolean isMultiLine(Annotation annotation) {
+ return true;
+ }
+
+ public boolean isTemporary(Annotation annotation) {
+ return true;
+ }
+
+ };
+ AnnotationPainter painter = new AnnotationPainter(this, annotationAccess);
+ // paint bullets
+ painter.addDrawingStrategy(BulletAnnotation.TYPE, new BulletDrawingStrategy());
+ painter.addAnnotationType(BulletAnnotation.TYPE, BulletAnnotation.TYPE);
+ painter.setAnnotationTypeColor(BulletAnnotation.TYPE, getTextWidget().getForeground());
+ // paint HR
+ painter.addDrawingStrategy(HorizontalRuleAnnotation.TYPE, new HorizontalRuleDrawingStrategy());
+ painter.addAnnotationType(HorizontalRuleAnnotation.TYPE, HorizontalRuleAnnotation.TYPE);
+ painter.setAnnotationTypeColor(HorizontalRuleAnnotation.TYPE, colorRegistry.get(WikiTextUiResources.COLOR_HR));
+ if (displayImages) {
+ // paint images
+ painter.addDrawingStrategy(ImageAnnotation.TYPE, new ImageDrawingStrategy(this));
+ painter.addAnnotationType(ImageAnnotation.TYPE, ImageAnnotation.TYPE);
+ painter.setAnnotationTypeColor(ImageAnnotation.TYPE, getTextWidget().getForeground());
+ }
+
+ addTextPresentationListener(painter);
+ addPainter(painter);
+
+ getTextWidget().addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ imageCache.dispose();
+ }
+ });
+
+ if (displayImages) {
+ new ImageManager(this, imageCache, painter);
+ }
+ }
+
+ protected ParseResult parse(String htmlText) {
+ initPainter();
+
+ ParseResult result = new ParseResult();
+
+ result.textPresentation = new TextPresentation();
+
+ HtmlTextPresentationParser parser = new HtmlTextPresentationParser();
+ if (stylesheet != null) {
+ parser.setStylesheet(stylesheet);
+ }
+ if (displayImages) {
+ parser.setImageCache(imageCache);
+ parser.setEnableImages(displayImages);
+ }
+ parser.setPresentation(result.textPresentation);
+ parser.setDefaultFont(getTextWidget().getFont());
+ parser.setDefaultMonospaceFont(defaultMonospaceFont);
+ result.annotationModel = new AnnotationModel();
+ parser.setAnnotationModel(result.annotationModel);
+
+ GC gc = new GC(getTextWidget());
+ try {
+ parser.setGC(gc);
+
+ parser.parse(htmlText);
+ } catch (SAXException e) {
+ throw new IllegalStateException(e);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ } finally {
+ gc.dispose();
+ }
+
+ result.text = parser.getText();
+
+ return result;
+ }
+
+ protected static class ParseResult {
+ public TextPresentation textPresentation;
+
+ TextPresentation presentation;
+
+ String text;
+
+ AnnotationModel annotationModel;
+ }
+
+ @Override
+ public void configure(SourceViewerConfiguration configuration) {
+ if (configuration instanceof HtmlViewerConfiguration) {
+ this.configuration = (HtmlViewerConfiguration) configuration;
+ if (textPresentation != null) {
+ this.configuration.setTextPresentation(textPresentation);
+ }
+ }
+ super.configure(configuration);
+ }
+
+ public void setHtml(String htmlText) {
+ ParseResult result = parse(htmlText);
+ textPresentation = result.textPresentation;
+
+ if (configuration != null) {
+ configuration.setTextPresentation(textPresentation);
+ }
+ setDocumentNoMarkup(new Document(result.text), result.annotationModel);
+ }
+
+ @Override
+ public void setDocument(IDocument document, IAnnotationModel annotationModel, int modelRangeOffset,
+ int modelRangeLength) {
+ if (document != null) {
+ String htmlText = document.get();
+ if (htmlText.length() > 0) {
+ ParseResult result = parse(htmlText);
+ textPresentation = result.textPresentation;
+ document.set(result.text);
+ annotationModel = result.annotationModel;
+ } else {
+ if (textPresentation != null) {
+ textPresentation.clear();
+ } else {
+ textPresentation = new TextPresentation();
+ }
+ }
+ if (configuration != null) {
+ configuration.setTextPresentation(textPresentation);
+ }
+ }
+ setDocumentNoMarkup(document, annotationModel);
+ }
+
+ protected void setDocumentNoMarkup(IDocument document, IAnnotationModel annotationModel) {
+ super.setDocument(document, annotationModel, -1, -1);
+ }
+
+ public TextPresentation getTextPresentation() {
+ return textPresentation;
+ }
+
+ public void setTextPresentation(TextPresentation textPresentation) {
+ this.textPresentation = textPresentation;
+ if (configuration != null) {
+ configuration.setTextPresentation(textPresentation);
+ }
+ changeTextPresentation(textPresentation, false);
+ }
+
+ /**
+ * indicate if the viewer should support display of images.
+ */
+ public boolean isDisplayImages() {
+ return displayImages;
+ }
+
+ /**
+ * indicate if the viewer should support display of images.
+ */
+ public void setDisplayImages(boolean displayImages) {
+ this.displayImages = displayImages;
+ }
+
+ /**
+ * <em>not API</em>
+ *
+ * @since 1.1
+ * @noreference This method is not intended to be referenced by clients.
+ */
+ public Stylesheet getStylesheet() {
+ return stylesheet;
+ }
+
+ /**
+ * <em>not API</em>
+ *
+ * @since 1.1
+ * @noreference This method is not intended to be referenced by clients.
+ */
+ public void setStylesheet(Stylesheet stylesheet) {
+ this.stylesheet = stylesheet;
+ }
+
+ public Font getDefaultMonospaceFont() {
+ return defaultMonospaceFont;
+ }
+
+ public void setDefaultMonospaceFont(Font defaultMonospaceFont) {
+ this.defaultMonospaceFont = defaultMonospaceFont;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewerConfiguration.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewerConfiguration.java
new file mode 100644
index 0000000..6d42ce5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/HtmlViewerConfiguration.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.presentation.IPresentationDamager;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.IPresentationRepairer;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.DefaultAnnotationHover;
+import org.eclipse.jface.text.source.IAnnotationHover;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.AnnotationHyperlinkDetector;
+import org.eclipse.mylyn.internal.wikitext.ui.viewer.TextHover;
+import org.eclipse.mylyn.wikitext.ui.annotation.TitleAnnotation;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.ui.editors.text.EditorsUI;
+
+/**
+ * A configuration for use with a {@link HtmlViewer}.
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class HtmlViewerConfiguration extends AbstractTextSourceViewerConfiguration {
+
+ private final HtmlViewer viewer;
+
+ private TextPresentation textPresentation;
+
+ private boolean disableHyperlinkModifiers = true;
+
+ public HtmlViewerConfiguration(HtmlViewer viewer) {
+ super(getDefaultPreferenceStore());
+ this.viewer = viewer;
+// filters the platform URL hyperlink detector since the URL hyperlink detection
+// strategy is defined by the HTML markup.
+ addHyperlinkDetectorDescriptorFilter(new DefaultHyperlinkDetectorDescriptorFilter(
+ "org.eclipse.ui.internal.editors.text.URLHyperlinkDetector")); //$NON-NLS-1$
+ }
+
+ private static IPreferenceStore getDefaultPreferenceStore() {
+ // bug# 245759: must work outside of an Eclipse runtime
+ return WikiTextUiPlugin.getDefault() == null ? null : EditorsUI.getPreferenceStore();
+ }
+
+ public HtmlViewerConfiguration(HtmlViewer viewer, IPreferenceStore preferenceStore) {
+ super(preferenceStore);
+ this.viewer = viewer;
+ }
+
+ @Override
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+ PresentationReconciler reconciler = new PresentationReconciler();
+ reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+ MarkupViewerDamagerRepairer dr = createMarkupViewerDamagerRepairer();
+ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+
+ return reconciler;
+ }
+
+ /**
+ * returns null, since spell check is not needed
+ *
+ * @since 1.1
+ */
+ @Override
+ public IReconciler getReconciler(ISourceViewer sourceViewer) {
+ // no need for a reconciler: no spell check or anything else that can use one
+ return null;
+ }
+
+ private MarkupViewerDamagerRepairer createMarkupViewerDamagerRepairer() {
+ return new MarkupViewerDamagerRepairer();
+ }
+
+ @Override
+ public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
+ return new DefaultAnnotationHover() {
+ @Override
+ protected boolean isIncluded(Annotation annotation) {
+ return annotation.getType().equals(TitleAnnotation.TYPE) || isShowInVerticalRuler(annotation);
+ }
+ };
+ }
+
+ @Override
+ public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
+ return new TextHover(sourceViewer);
+ }
+
+ @Override
+ protected List<IHyperlinkDetector> createCustomHyperlinkDetectors(ISourceViewer sourceViewer) {
+ List<IHyperlinkDetector> detectors = new ArrayList<IHyperlinkDetector>(1);
+ AnnotationHyperlinkDetector annotationHyperlinkDetector = createAnnotationHyperlinkDetector();
+ sourceViewer.getTextWidget().setData(AnnotationHyperlinkDetector.class.getName(), annotationHyperlinkDetector);
+ detectors.add(annotationHyperlinkDetector);
+ return detectors;
+ }
+
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @since 1.1
+ */
+ protected AnnotationHyperlinkDetector createAnnotationHyperlinkDetector() {
+ return new AnnotationHyperlinkDetector();
+ }
+
+ protected class MarkupViewerDamagerRepairer implements IPresentationDamager, IPresentationRepairer {
+
+ private IDocument document;
+
+ public IRegion getDamageRegion(ITypedRegion partition, DocumentEvent event, boolean documentPartitioningChanged) {
+ return new Region(0, document.getLength());
+ }
+
+ public void setDocument(IDocument document) {
+ this.document = document;
+ }
+
+ public void createPresentation(TextPresentation presentation, ITypedRegion damage) {
+ TextPresentation viewerPresentation = textPresentation == null ? viewer.getTextPresentation()
+ : textPresentation;
+ presentation.clear();
+ if (viewerPresentation == null) {
+ return;
+ }
+ StyleRange defaultStyleRange = viewerPresentation.getDefaultStyleRange();
+ presentation.setDefaultStyleRange((StyleRange) (defaultStyleRange == null ? null
+ : defaultStyleRange.clone()));
+ List<StyleRange> ranges = new ArrayList<StyleRange>();
+
+ Iterator<?> allStyleRangeIterator = viewerPresentation.getAllStyleRangeIterator();
+ while (allStyleRangeIterator.hasNext()) {
+ StyleRange range = (StyleRange) allStyleRangeIterator.next();
+ ranges.add((StyleRange) range.clone());
+ }
+
+ // fix for bug 237170: presentation must not have any gaps otherwise the hyperlinks won't always get reset
+ // to their non-highlighted state. So detect gaps and fill the gaps with the default presentation style.
+ int start = damage.getOffset();
+ for (int x = 0; x < ranges.size(); ++x) {
+ StyleRange range = ranges.get(x);
+ if (range.start > start) {
+ StyleRange newRange = defaultStyleRange == null ? new StyleRange()
+ : (StyleRange) defaultStyleRange.clone();
+ newRange.start = start;
+ newRange.length = range.start - start;
+
+ ranges.add(++x, newRange);
+
+ }
+ start = range.start + range.length + 1;
+ }
+ if (start < (damage.getOffset() + damage.getLength())) {
+ StyleRange newRange = defaultStyleRange == null ? new StyleRange()
+ : (StyleRange) defaultStyleRange.clone();
+ newRange.start = start;
+ newRange.length = (damage.getOffset() + damage.getLength()) - start;
+ ranges.add(newRange);
+ }
+
+ presentation.replaceStyleRanges(ranges.toArray(new StyleRange[ranges.size()]));
+ }
+
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setTextPresentation(TextPresentation textPresentation) {
+ if (textPresentation != null) {
+ TextPresentation textPresentationCopy = new TextPresentation();
+ textPresentationCopy.setDefaultStyleRange((StyleRange) (textPresentation.getDefaultStyleRange() == null ? null
+ : textPresentation.getDefaultStyleRange().clone()));
+ Iterator<StyleRange> iterator = textPresentation.getAllStyleRangeIterator();
+ while (iterator.hasNext()) {
+ StyleRange styleRange = iterator.next();
+ textPresentationCopy.addStyleRange((StyleRange) styleRange.clone());
+ }
+ textPresentation = textPresentationCopy;
+ }
+ this.textPresentation = textPresentation;
+ }
+
+ @Override
+ public int getHyperlinkStateMask(ISourceViewer sourceViewer) {
+ if (disableHyperlinkModifiers) {
+ return SWT.NONE;
+ }
+ return super.getHyperlinkStateMask(sourceViewer);
+ }
+
+ /**
+ * Indicate if hyperlink modifiers are disabled. When disabled (the default) no keyboard modifiers are required to
+ * activate hyperlinks when clicking.
+ *
+ * @see #getHyperlinkStateMask(ISourceViewer)
+ */
+ public boolean isDisableHyperlinkModifiers() {
+ return disableHyperlinkModifiers;
+ }
+
+ /**
+ * Indicate if hyperlink modifiers are disabled. When disabled (the default) no keyboard modifiers are required to
+ * activate hyperlinks when clicking.
+ *
+ * @see #getHyperlinkStateMask(ISourceViewer)
+ */
+ public void setDisableHyperlinkModifiers(boolean disableHyperlinkModifiers) {
+ this.disableHyperlinkModifiers = disableHyperlinkModifiers;
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupTextPresenter.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupTextPresenter.java
new file mode 100644
index 0000000..356dbb2
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupTextPresenter.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.swt.graphics.Drawable;
+
+/**
+ * An information presenter that supports markup. Uses the {@link MarkupParser} to parse the markup to HTML, and passes
+ * the HTML to the superclass.
+ *
+ * @author David Green
+ *
+ * @since 1.0
+ */
+public class MarkupTextPresenter extends HtmlTextPresenter {
+
+ private MarkupLanguage markupLanguage;
+
+ /**
+ * the markup language used by this presenter
+ */
+ public MarkupLanguage getMarkupLanguage() {
+ return markupLanguage;
+ }
+
+ /**
+ * the markup language used by this presenter
+ */
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ this.markupLanguage = markupLanguage;
+ }
+
+ @Override
+ public String updatePresentation(Drawable drawable, String hoverInfo, TextPresentation presentation, int maxWidth,
+ int maxHeight) {
+ if (markupLanguage == null) {
+ throw new IllegalStateException();
+ }
+ if (hoverInfo == null || hoverInfo.length() == 0) {
+ return hoverInfo;
+ }
+ MarkupParser parser = new MarkupParser();
+ parser.setMarkupLanguage(markupLanguage);
+ String html = parser.parseToHtml(hoverInfo);
+
+ return super.updatePresentation(drawable, html, presentation, maxWidth, maxHeight);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupViewer.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupViewer.java
new file mode 100644
index 0000000..2a0ad79
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupViewer.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.mylyn.internal.wikitext.ui.WikiTextUiPlugin;
+import org.eclipse.mylyn.wikitext.core.parser.MarkupParser;
+import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A viewer that can show wikitext markup (lightweight markup languages) by converting the markup to HTML. Designed for
+ * read-only display of markup.
+ *
+ * @see MarkupViewerConfiguration
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupViewer extends HtmlViewer {
+
+ private MarkupParser parser = new MarkupParser();
+
+ public MarkupViewer(Composite parent, IVerticalRuler ruler, int styles) {
+ super(parent, ruler, styles);
+ setEditable(false);
+ }
+
+ public MarkupViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
+ boolean showAnnotationsOverview, int styles) {
+ super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles);
+ setEditable(false);
+ }
+
+ public void setMarkup(String source) {
+ try {
+ String htmlText = parser.parseToHtml(source);
+ setHtml(htmlText);
+ } catch (Throwable t) {
+ if (getTextPresentation() != null) {
+ getTextPresentation().clear();
+ }
+ setDocumentNoMarkup(new Document(source), new AnnotationModel());
+ if (WikiTextUiPlugin.getDefault() != null) {
+ WikiTextUiPlugin.getDefault().log(IStatus.ERROR, Messages.MarkupViewer_parseFailure, t);
+ } else {
+ t.printStackTrace();
+ }
+ }
+ }
+
+ public MarkupParser getParser() {
+ return parser;
+ }
+
+ public void setParser(MarkupParser parser) {
+ this.parser = parser;
+ }
+
+ public MarkupLanguage getMarkupLanguage() {
+ return parser.getMarkupLanguage();
+ }
+
+ public void setMarkupLanguage(MarkupLanguage markupLanguage) {
+ parser.setMarkupLanguage(markupLanguage);
+ }
+
+ @Override
+ public void setDocument(IDocument document, IAnnotationModel annotationModel, int modelRangeOffset,
+ int modelRangeLength) {
+ String markupContent = null;
+ if (document != null) {
+ markupContent = document.get();
+ if (markupContent.length() > 0) {
+ String htmlText = parser.parseToHtml(markupContent);
+ document.set(htmlText);
+ }
+ }
+ try {
+ super.setDocument(document, annotationModel, modelRangeOffset, modelRangeLength);
+ } catch (Exception e) {
+ if (document != null) {
+ document.set(markupContent);
+ setDocumentNoMarkup(document, annotationModel);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupViewerConfiguration.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupViewerConfiguration.java
new file mode 100644
index 0000000..d4c949c
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/MarkupViewerConfiguration.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * A configuration to be used with a {@link MarkupViewer}
+ *
+ * @author David Green
+ * @since 1.0
+ */
+public class MarkupViewerConfiguration extends HtmlViewerConfiguration {
+
+ public MarkupViewerConfiguration(MarkupViewer viewer, IPreferenceStore preferenceStore) {
+ super(viewer, preferenceStore);
+ }
+
+ public MarkupViewerConfiguration(MarkupViewer viewer) {
+ super(viewer);
+ }
+
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/Messages.java b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/Messages.java
new file mode 100644
index 0000000..cacac1a
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/Messages.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2009 David Green 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:
+ * David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.ui.viewer;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ *
+ * @author David Green
+ */
+class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.mylyn.wikitext.ui.viewer.messages"; //$NON-NLS-1$
+
+ public static String MarkupViewer_parseFailure;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/messages.properties b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/messages.properties
new file mode 100644
index 0000000..ab7156b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/wikitext/ui/viewer/messages.properties
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2007, 2008 David Green 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:
+# David Green - initial API and implementation
+###############################################################################
+MarkupViewer_parseFailure=Cannot parse markup; falling back to plain text
diff --git a/org.eclipse.mylyn/.classpath b/org.eclipse.mylyn/.classpath
new file mode 100644
index 0000000..5f3bf8a
--- /dev/null
+++ b/org.eclipse.mylyn/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+ <accessrules>
+ <accessrule kind="nonaccessible" pattern="com/sun/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.mylyn/.cvsignore b/org.eclipse.mylyn/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.mylyn/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.mylyn/.project b/org.eclipse.mylyn/.project
new file mode 100644
index 0000000..c0a047a
--- /dev/null
+++ b/org.eclipse.mylyn/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.mylyn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.mylyn/.refactorings/2006/10/44/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/10/44/refactorings.history
new file mode 100644
index 0000000..da16f74
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/10/44/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar/developer/src-old/bugzilla/CopyOfRepositoryConfiguration.java' to 'RepositoryConfiguration.java' - Original project: 'org.eclipse.mylar' - Original element: 'CopyOfRepositoryConfiguration.java'" description="Rename resource 'CopyOfRepositoryConfiguration.java'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="developer/src-old/bugzilla/CopyOfRepositoryConfiguration.java" name="RepositoryConfiguration.java" stamp="1162163292640" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/10/44/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/10/44/refactorings.index
new file mode 100644
index 0000000..aeaf970
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/10/44/refactorings.index
@@ -0,0 +1 @@
+1162163292640 Rename resource 'CopyOfRepositoryConfiguration.java'
diff --git a/org.eclipse.mylyn/.refactorings/2006/11/44/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/11/44/refactorings.history
new file mode 100644
index 0000000..d48d57c
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/11/44/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar/developer/src-old/bugzilla/SaxConfigurationContentHandler.java' to 'SaxConfigurationContentHandlerOLD.java' - Original project: 'org.eclipse.mylar' - Original element: 'SaxConfigurationContentHandler.java'" description="Rename resource 'SaxConfigurationContentHandler.java'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="developer/src-old/bugzilla/SaxConfigurationContentHandler.java" name="SaxConfigurationContentHandlerOLD.java" stamp="1162518011203" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'SaxBugReportContentHandler.java'" description="Delete element" element1="developer/src-old/bugzilla/SaxBugReportContentHandler.java" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1162518083000" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/11/44/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/11/44/refactorings.index
new file mode 100644
index 0000000..13e587c
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/11/44/refactorings.index
@@ -0,0 +1,2 @@
+1162518011203 Rename resource 'SaxConfigurationContentHandler.java'
+1162518083000 Delete element
diff --git a/org.eclipse.mylyn/.refactorings/2006/12/49/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/12/49/refactorings.history
new file mode 100644
index 0000000..7767947
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/12/49/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.team/src/org.eclipse.mylar.internal.team.ui.actions' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.team/src/org.eclipse.mylar.internal.team.ui.actions' - Original element: 'CommitContextAction.java'" description="Copy file" destination="/src<org.eclipse.mylar.internal.team.ui.actions" element1="developer/src-old/CommitContextAction.java" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="developer/src-old/CommitContextAction.java	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1165446139281" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/12/49/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/12/49/refactorings.index
new file mode 100644
index 0000000..ab03d7c
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/12/49/refactorings.index
@@ -0,0 +1 @@
+1165446139281 Copy file
diff --git a/org.eclipse.mylyn/.refactorings/2006/3/10/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/3/10/refactorings.history
new file mode 100644
index 0000000..e4ad749
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/3/10/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar/archives/iplog.txt' to 'mylar-iplog.csv'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar/archives/iplog.txt" name="mylar-iplog.csv" project="org.eclipse.mylar" stamp="1141750880302"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/3/10/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/3/10/refactorings.index
new file mode 100644
index 0000000..e243d9e
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/3/10/refactorings.index
@@ -0,0 +1 @@
+1141750880302 Rename resource '/org.eclipse.mylar/archives/iplog.txt' to 'mylar-iplog.csv'
diff --git a/org.eclipse.mylyn/.refactorings/2006/3/12/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/3/12/refactorings.history
new file mode 100644
index 0000000..2d505ba
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/3/12/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="" description="Rename resource '/org.eclipse.mylar/graphics/ui/icons-new.psd' to 'icons-mylar.psd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="/org.eclipse.mylar/graphics/ui/icons-new.psd" name="icons-mylar.psd" project="org.eclipse.mylar" stamp="1142798378262"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/3/12/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/3/12/refactorings.index
new file mode 100644
index 0000000..064cd4b
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/3/12/refactorings.index
@@ -0,0 +1 @@
+1142798378262 Rename resource '/org.eclipse.mylar/graphics/ui/icons-new.psd' to 'icons-mylar.psd'
diff --git a/org.eclipse.mylyn/.refactorings/2006/5/19/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/5/19/refactorings.history
new file mode 100644
index 0000000..f865466
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/5/19/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar/developer/scratch' to 'attic' - Original element: 'scratch'" description="Rename resource 'scratch'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="developer/scratch" name="attic" stamp="1147474895882" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar/developer/attic' to 'src-old' - Original element: 'attic'" description="Rename resource 'attic'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="developer/attic" name="src-old" stamp="1147474920157" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/5/19/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/5/19/refactorings.index
new file mode 100644
index 0000000..e1a894d
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/5/19/refactorings.index
@@ -0,0 +1,2 @@
+1147474895882 Rename resource 'scratch'
+1147474920157 Rename resource 'attic'
diff --git a/org.eclipse.mylyn/.refactorings/2006/5/22/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/5/22/refactorings.history
new file mode 100644
index 0000000..04f1c80
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/5/22/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar/archives/testimonials.txt' to 'user-quotes' - Original element: 'testimonials.txt'" description="Rename resource 'testimonials.txt'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="archives/testimonials.txt" name="user-quotes" stamp="1148939472371" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar/archives/user-quotes' to 'user-quotes.txt' - Original element: 'user-quotes'" description="Rename resource 'user-quotes'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="archives/user-quotes" name="user-quotes.txt" stamp="1148939475265" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/5/22/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/5/22/refactorings.index
new file mode 100644
index 0000000..715d1e6
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/5/22/refactorings.index
@@ -0,0 +1,2 @@
+1148939472371 Rename resource 'testimonials.txt'
+1148939475265 Rename resource 'user-quotes'
diff --git a/org.eclipse.mylyn/.refactorings/2006/7/31/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/7/31/refactorings.history
new file mode 100644
index 0000000..8d03af9
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/7/31/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar/graphics/ui/icons-mylar.psd' to 'icons-context.psd' - Original element: 'icons-mylar.psd'" description="Rename resource 'icons-mylar.psd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="graphics/ui/icons-mylar.psd" name="icons-context.psd" stamp="1154372864698" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/7/31/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/7/31/refactorings.index
new file mode 100644
index 0000000..c69c20a
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/7/31/refactorings.index
@@ -0,0 +1 @@
+1154372864698 Rename resource 'icons-mylar.psd'
diff --git a/org.eclipse.mylyn/.refactorings/2006/9/37/refactorings.history b/org.eclipse.mylyn/.refactorings/2006/9/37/refactorings.history
new file mode 100644
index 0000000..ae0e2d4
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/9/37/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylar/developer/mylar-formatter-settings.xml' to 'mylar-settings-formatter.xml' - Original project: 'org.eclipse.mylar' - Original element: 'mylar-formatter-settings.xml'" description="Rename resource 'mylar-formatter-settings.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="developer/mylar-formatter-settings.xml" name="mylar-settings-formatter.xml" stamp="1158249809083" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylar/developer/mylar-code-templates.xml' to 'mylar-settings-templates.xml' - Original project: 'org.eclipse.mylar' - Original element: 'mylar-code-templates.xml'" description="Rename resource 'mylar-code-templates.xml'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="developer/mylar-code-templates.xml" name="mylar-settings-templates.xml" stamp="1158249829492" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'mylar-codetemplates.xml'" description="Delete element" element1="developer/mylar-codetemplates.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1158249850302" subPackages="false" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'javaFromatterSettings.xml'" description="Delete element" element1="developer/javaFromatterSettings.xml" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1158249859595" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2006/9/37/refactorings.index b/org.eclipse.mylyn/.refactorings/2006/9/37/refactorings.index
new file mode 100644
index 0000000..d620230
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2006/9/37/refactorings.index
@@ -0,0 +1,4 @@
+1158249809083 Rename resource 'mylar-formatter-settings.xml'
+1158249829492 Rename resource 'mylar-code-templates.xml'
+1158249850302 Delete element
+1158249859595 Delete element
diff --git a/org.eclipse.mylyn/.refactorings/2007/12/51/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/12/51/refactorings.history
new file mode 100644
index 0000000..10bb02d
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/12/51/refactorings.history
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
<refactoring comment="Move 1 elements(s) to 'mylyn'
- Original project: 'org.eclipse.mylyn'
- Destination element: 'mylyn'
- Original element: 'graphics'" description="Move folder" element1="graphics" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1198174876352" target="/mylyn" units="0" version="1.0"/>
<refactoring comment="Move 1 elements(s) to 'mylyn'
- Original project: 'org.eclipse.mylyn'
- Destination element: 'mylyn'
- Original element: 'archives'" description="Move folder" element1="archives" files="0" flags="589830" folders="1" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1198175045025" target="/mylyn" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/.refactorings/2007/12/51/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/12/51/refactorings.index
new file mode 100644
index 0000000..3bfd5e6
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/12/51/refactorings.index
@@ -0,0 +1,2 @@
+1198174876352 Move folder
+1198175045025 Move folder
diff --git a/org.eclipse.mylyn/.refactorings/2007/2/6/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/2/6/refactorings.history
new file mode 100644
index 0000000..9b2751f
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/2/6/refactorings.history
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'Thumbs.db'" description="Delete element" element1="Thumbs.db" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1170816334369" subPackages="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.util' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.util' - Original element: 'org.eclipse.mylar.core.DateUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core.util" element1="/src<org.eclipse.mylar.core{DateUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820616193" units="1" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylar/src/org.eclipse.mylar.core.util' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.util' - Original element: 'org.eclipse.mylar.core.ZipFileUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylar.core.util" element1="/src<org.eclipse.mylar.core{ZipFileUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820634711" units="1" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.core.util' to 'org.eclipse.mylar.internal.core.util' - Original project: 'org.eclipse.mylar' - Original element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.util' - Renamed element: 'org.eclipse.mylar/src/org.eclipse.mylar.internal.core.util' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.core.util'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.core.util" name="org.eclipse.mylar.internal.core.util" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170820670857" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.xml'" description="Delete element" element1="/src<org.eclipse.mylar.core.xml" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1170820718804" subPackages="false" version="1.0"/>
+<refactoring comment="Move 3 elements(s) to 'org.eclipse.mylar.context.core/src/org.eclipse.mylar.internal.context.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.context.core/src/org.eclipse.mylar.internal.context.core' - Original elements: org.eclipse.mylar.internal.core.util.SaxContextWriter.java org.eclipse.mylar.internal.core.util.SaxContextContentHandler.java org.eclipse.mylar.internal.core.util.SaxContextReader.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylar.internal.context.core" element1="/src<org.eclipse.mylar.internal.core.util{SaxContextWriter.java" element2="/src<org.eclipse.mylar.internal.core.util{SaxContextContentHandler.java" element3="/src<org.eclipse.mylar.internal.core.util{SaxContextReader.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1170820764667" units="3" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.core.net' to 'org.eclipse.mylar.internal.core.net' - Original project: 'org.eclipse.mylar' - Original element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Renamed element: 'org.eclipse.mylar/src/org.eclipse.mylar.internal.core.net' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.core.net'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.core.net" name="org.eclipse.mylar.internal.core.net" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170820837336" textual="true" version="1.0"/>
+<refactoring comment="Rename package 'org.eclipse.mylar.internal.core.net' to 'org.eclipse.mylar.core.net' - Original project: 'org.eclipse.mylar' - Original element: 'org.eclipse.mylar/src/org.eclipse.mylar.internal.core.net' - Renamed element: 'org.eclipse.mylar/src/org.eclipse.mylar.core.net' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings - Rename subpackages of the package" description="Rename package 'org.eclipse.mylar.internal.core.net'" flags="589830" hierarchical="true" id="org.eclipse.jdt.ui.rename.package" input="/src<org.eclipse.mylar.internal.core.net" name="org.eclipse.mylar.core.net" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" stamp="1170820913724" textual="true" version="1.0"/>
+<refactoring comment="Rename type 'org.eclipse.mylar.core.net.RepositoryTrustManager' to 'TrustAllTrustManager' - Original project: 'org.eclipse.mylar' - Original element: 'org.eclipse.mylar.core.net.RepositoryTrustManager' - Renamed element: 'org.eclipse.mylar.core.net.TrustAllTrustManager' - Update references to refactored element - Update fully qualified names in '*.mf, *.xml, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'RepositoryTrustManager'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylar.core.net{RepositoryTrustManager.java[RepositoryTrustManager" matchStrategy="1" name="TrustAllTrustManager" patterns="*.mf, *.xml, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1170826559289" textual="true" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'patch.txt'" description="Delete element" element1="patch.txt" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1171062516625" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/2/6/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/2/6/refactorings.index
new file mode 100644
index 0000000..628631c
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/2/6/refactorings.index
@@ -0,0 +1,10 @@
+1170816334369 Delete element
+1170820616193 Move compilation unit
+1170820634711 Move compilation unit
+1170820670857 Rename package 'org.eclipse.mylar.core.util'
+1170820718804 Delete element
+1170820764667 Move compilation units
+1170820837336 Rename package 'org.eclipse.mylar.core.net'
+1170820913724 Rename package 'org.eclipse.mylar.internal.core.net'
+1170826559289 Rename type 'RepositoryTrustManager'
+1171062516625 Delete element
diff --git a/org.eclipse.mylyn/.refactorings/2007/2/8/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/2/8/refactorings.history
new file mode 100644
index 0000000..10b469d
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/2/8/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Extract method 'private static Credentials getCredentials(AuthenticatedProxy authProxy,InetSocketAddress address)' from 'org.eclipse.mylar.core.net.WebClientUtil.setupHttpClient()' to 'org.eclipse.mylar.core.net.WebClientUtil' - Original project: 'org.eclipse.mylar' - Method name: 'getCredentials' - Destination type: 'org.eclipse.mylar.core.net.WebClientUtil' - Declared visibility: 'private'" comments="false" description="Extract method 'getCredentials'" destination="0" exceptions="false" flags="786434" id="org.eclipse.jdt.ui.extract.method" input="/src<org.eclipse.mylar.core.net{WebClientUtil.java" name="getCredentials" replace="false" selection="4895 379" stamp="1171947703083" version="1.0" visibility="2"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/2/8/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/2/8/refactorings.index
new file mode 100644
index 0000000..5e4407f
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/2/8/refactorings.index
@@ -0,0 +1 @@
+1171947703083 Extract method 'getCredentials'
diff --git a/org.eclipse.mylyn/.refactorings/2007/4/14/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/4/14/refactorings.history
new file mode 100644
index 0000000..c7d9f6e
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/4/14/refactorings.history
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylar' - Original project: 'org.eclipse.mylar' - Original element: 'WebClientUtil.java.rej'" description="Delete element" element1="src/org/eclipse/mylar/core/net/WebClientUtil.java.rej" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1175791728796" subPackages="false" version="1.0"/>
+<refactoring comment="Rename method 'org.eclipse.mylar.core.net.WebClientUtil.getSystemProxy()' to 'getPlatformProxy' - Original project: 'org.eclipse.mylar' - Original element: 'org.eclipse.mylar.core.net.WebClientUtil.getSystemProxy()' - Renamed element: 'org.eclipse.mylar.core.net.WebClientUtil.getPlatformProxy()' - Update references to refactored element" delegate="false" deprecate="false" description="Rename method 'getSystemProxy'" flags="589830" id="org.eclipse.jdt.ui.rename.method" input="/src<org.eclipse.mylar.core.net{WebClientUtil.java[WebClientUtil~getSystemProxy" name="getPlatformProxy" references="true" stamp="1175792430828" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/4/14/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/4/14/refactorings.index
new file mode 100644
index 0000000..bef6fe7
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/4/14/refactorings.index
@@ -0,0 +1,2 @@
+1175791728796 Delete element
+1175792430828 Rename method 'getSystemProxy'
diff --git a/org.eclipse.mylyn/.refactorings/2007/5/22/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/5/22/refactorings.history
new file mode 100644
index 0000000..eff961a
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/5/22/refactorings.history
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.aspectj' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.aspectj' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.aspectj" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442598085" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.bugzilla.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.bugzilla.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442601469" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.bugzilla.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.bugzilla.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442611858" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla.ui' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.bugzilla.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.bugzilla.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442616115" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.bugzilla-feature' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.bugzilla-feature' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442623240" target="/org.eclipse.mylar.bugzilla-feature" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.context.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.context.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.context.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442626585" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.context.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.context.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.context.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442630354" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.context.ui' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.context.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.context.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442633342" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.doc' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.doc' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.doc" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442637357" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.ide' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.ide' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.ide" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442640754" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.ide.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.ide.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.ide.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442643716" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.ide-feature' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.ide-feature' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442646899" target="/org.eclipse.mylar.ide-feature" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.java' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.java' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.java" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442649930" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.java.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.java.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.java.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442652969" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.jira.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.jira.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442656336" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.jira.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.jira.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442659058" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira.ui' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.jira.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.jira.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442662208" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.jira-feature' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.jira-feature' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442665399" target="/org.eclipse.mylar.jira-feature" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.monitor.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.monitor.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442669043" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.monitor.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.monitor.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442672264" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.ui' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.monitor.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.monitor.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442676098" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor.usage' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.monitor.usage' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.monitor.usage" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442687410" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.monitor-feature' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.monitor-feature' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442690746" target="/org.eclipse.mylar.monitor-feature" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.resources' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.resources' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.resources" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442693654" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.resources.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.resources.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.resources.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442698199" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.tasks.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.tasks.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442702636" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.tasks.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.tasks.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442706625" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.ui' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.tasks.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.tasks.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442708864" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tasks.web' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.tasks.web' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.tasks.web" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442714670" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.team' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.team' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.team" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442716073" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.team' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.team' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.team" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442718487" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442722625" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.core' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.trac.core' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.trac.core" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442730541" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.tests' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.trac.tests' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.trac.tests" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442733191" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac.ui' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.trac.ui' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.trac.ui" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442736519" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.trac-feature' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.trac-feature' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442739244" target="/org.eclipse.mylar.trac-feature" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar.web' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar.web' - Original element: 'about.html'" description="Copy file" destination="=org.eclipse.mylar.web" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442741681" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar-feature' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar-feature' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442743876" target="/org.eclipse.mylar-feature" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar-site' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar-site' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442745445" target="/org.eclipse.mylar-site" units="0" version="1.0"/>
+<refactoring comment="Copy 1 elements(s) to 'org.eclipse.mylar-site' - Original project: 'org.eclipse.mylar' - Destination element: 'org.eclipse.mylar-site' - Original element: 'about.html'" description="Copy file" element1="about.html" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.copy" log="about.html	true	false" policy="org.eclipse.jdt.ui.copyResources" stamp="1180442748175" target="/org.eclipse.mylar-site" units="0" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/5/22/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/5/22/refactorings.index
new file mode 100644
index 0000000..a090cae
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/5/22/refactorings.index
@@ -0,0 +1,40 @@
+1180442598085 Copy file
+1180442601469 Copy file
+1180442611858 Copy file
+1180442616115 Copy file
+1180442623240 Copy file
+1180442626585 Copy file
+1180442630354 Copy file
+1180442633342 Copy file
+1180442637357 Copy file
+1180442640754 Copy file
+1180442643716 Copy file
+1180442646899 Copy file
+1180442649930 Copy file
+1180442652969 Copy file
+1180442656336 Copy file
+1180442659058 Copy file
+1180442662208 Copy file
+1180442665399 Copy file
+1180442669043 Copy file
+1180442672264 Copy file
+1180442676098 Copy file
+1180442687410 Copy file
+1180442690746 Copy file
+1180442693654 Copy file
+1180442698199 Copy file
+1180442702636 Copy file
+1180442706625 Copy file
+1180442708864 Copy file
+1180442714670 Copy file
+1180442716073 Copy file
+1180442718487 Copy file
+1180442722625 Copy file
+1180442730541 Copy file
+1180442733191 Copy file
+1180442736519 Copy file
+1180442739244 Copy file
+1180442741681 Copy file
+1180442743876 Copy file
+1180442745445 Copy file
+1180442748175 Copy file
diff --git a/org.eclipse.mylyn/.refactorings/2007/6/23/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/6/23/refactorings.history
new file mode 100644
index 0000000..680e334
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/6/23/refactorings.history
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.internal.core.MylarCorePlugin' to 'MylynCorePlugin' - Original project: 'org.eclipse.mylyn' - Original element: 'org.eclipse.mylyn.internal.core.MylarCorePlugin' - Renamed element: 'org.eclipse.mylyn.internal.core.MylynCorePlugin' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd' files - Update textual occurrences in comments and strings" description="Rename type 'MylarCorePlugin'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.internal.core{MylarCorePlugin.java[MylarCorePlugin" matchStrategy="1" name="MylynCorePlugin" patterns="*.xml, *.properties, *.exsd" qualified="true" references="true" similarDeclarations="false" stamp="1181269649581" textual="false" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core' - Original project: 'org.eclipse.mylyn' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core' - Original element: 'org.eclipse.mylyn.internal.core.util.DateUtil.java' - Update references to refactored element" description="Move compilation unit" destination="/src<org.eclipse.mylyn.internal.monitor.core" element1="/src<org.eclipse.mylyn.internal.core.util{DateUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181333419488" units="1" version="1.0"/>
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core.util' - Original project: 'org.eclipse.mylyn' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.monitor.core.util' - Original elements: org.eclipse.mylyn.internal.core.util.XmlStringConverter.java org.eclipse.mylyn.internal.core.util.ZipFileUtil.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.monitor.core.util" element1="/src<org.eclipse.mylyn.internal.core.util{XmlStringConverter.java" element2="/src<org.eclipse.mylyn.internal.core.util{ZipFileUtil.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" log="/src<org.eclipse.mylyn.monitor.core	/src<org.eclipse.mylyn.monitor.core.util" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181352120745" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn' - Original project: 'org.eclipse.mylyn' - Original element: 'org.eclipse.mylyn/src/org.eclipse.mylyn.internal.core.util'" description="Delete element" element1="/src<org.eclipse.mylyn.internal.core.util" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181352348785" subPackages="false" version="1.0"/>
+<refactoring comment="Move 6 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original project: 'org.eclipse.mylyn' - Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original elements: org.eclipse.mylyn.core.net.WebClientUtil.java org.eclipse.mylyn.core.net.TrustAllTrustManager.java org.eclipse.mylyn.core.net.HtmlStreamTokenizer.java org.eclipse.mylyn.core.net.HtmlTag.java org.eclipse.mylyn.core.net.SslProtocolSocketFactory.java org.eclipse.mylyn.core.net.AuthenticatedProxy.java - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation units" destination="/src<org.eclipse.mylyn.web.core" element1="/src<org.eclipse.mylyn.core.net{WebClientUtil.java" element2="/src<org.eclipse.mylyn.core.net{TrustAllTrustManager.java" element3="/src<org.eclipse.mylyn.core.net{HtmlStreamTokenizer.java" element4="/src<org.eclipse.mylyn.core.net{HtmlTag.java" element5="/src<org.eclipse.mylyn.core.net{AuthenticatedProxy.javay.java" element6="/src<org.eclipse.mylyn.core.net{AuthenticatedProxy.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181352381791" units="6" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original project: 'org.eclipse.mylyn' - Destination element: 'org.eclipse.mylyn.web.core/src/org.eclipse.mylyn.web.core' - Original element: 'org.eclipse.mylyn.internal.core.MylynCorePlugin.java' - Update references to refactored element - Update fully qualified names in '*.xml, *.mf' files" description="Move compilation unit" destination="/src<org.eclipse.mylyn.web.core" element1="/src<org.eclipse.mylyn.internal.core{MylynCorePlugin.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="true" references="true" stamp="1181352490460" units="1" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/6/23/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/6/23/refactorings.index
new file mode 100644
index 0000000..4737149
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/6/23/refactorings.index
@@ -0,0 +1,6 @@
+1181269649581 Rename type 'MylarCorePlugin'
+1181333419488 Move compilation unit
+1181352120745 Move compilation units
+1181352348785 Delete element
+1181352381791 Move compilation units
+1181352490460 Move compilation unit
diff --git a/org.eclipse.mylyn/.refactorings/2007/6/24/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/6/24/refactorings.history
new file mode 100644
index 0000000..df842b9
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/6/24/refactorings.history
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<session version="1.0">
+<refactoring comment="Rename type 'org.eclipse.mylyn.core.MylarStatusHandler' to 'StatusHandler' - Original project: 'org.eclipse.mylyn' - Original element: 'org.eclipse.mylyn.core.MylarStatusHandler' - Renamed element: 'org.eclipse.mylyn.core.StatusHandler' - Update references to refactored element - Update fully qualified names in '*.xml, *.properties, *.exsd, *.mf' files - Update textual occurrences in comments and strings" description="Rename type 'MylarStatusHandler'" flags="589830" id="org.eclipse.jdt.ui.rename.type" input="/src<org.eclipse.mylyn.core{MylarStatusHandler.java[MylarStatusHandler" matchStrategy="1" name="StatusHandler" patterns="*.xml, *.properties, *.exsd, *.mf" qualified="true" references="true" similarDeclarations="false" stamp="1181942796862" textual="false" version="1.0"/>
+
+<refactoring comment="Move 2 elements(s) to 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core.util' - Original project: 'org.eclipse.mylyn' - Destination element: 'org.eclipse.mylyn.monitor.core/src/org.eclipse.mylyn.internal.monitor.core.util' - Original elements: org.eclipse.mylyn.core.StatusHandler.java org.eclipse.mylyn.core.IStatusHandler.java - Update references to refactored element" description="Move compilation units" destination="/src<org.eclipse.mylyn.internal.monitor.core.util" element1="/src<org.eclipse.mylyn.core{StatusHandler.java" element2="/src<org.eclipse.mylyn.core{IStatusHandler.java" files="0" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" patterns="*.xml, *.mf" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1181943023818" units="2" version="1.0"/>
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn' - Original project: 'org.eclipse.mylyn' - Original element: 'org.eclipse.mylyn/src'" description="Delete element" element1="/src" elements="1" flags="589830" id="org.eclipse.jdt.ui.delete" resources="0" stamp="1181943104098" subPackages="false" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/6/24/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/6/24/refactorings.index
new file mode 100644
index 0000000..75e3864
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/6/24/refactorings.index
@@ -0,0 +1,3 @@
+1181942796862 Rename type 'MylarStatusHandler'
+1181943023818 Move compilation units
+1181943104098 Delete element
diff --git a/org.eclipse.mylyn/.refactorings/2007/6/26/refactorings.history b/org.eclipse.mylyn/.refactorings/2007/6/26/refactorings.history
new file mode 100644
index 0000000..7e5758d
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/6/26/refactorings.history
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<session version="1.0">
+<refactoring comment="Rename resource '/org.eclipse.mylyn/graphics/ui/icons-synchronize-state.psd' to 'icons-synchronize-old.psd' - Original project: 'org.eclipse.mylyn' - Original element: 'icons-synchronize-state.psd'" description="Rename resource 'icons-synchronize-state.psd'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="graphics/ui/icons-synchronize-state.psd" name="icons-synchronize-old.psd" stamp="1182801392278" version="1.0"/>
+<refactoring comment="Move 1 elements(s) to 'archive' - Original project: 'org.eclipse.mylyn' - Destination element: 'archive' - Original element: 'icons-synchronize-old.psd'" description="Move file" element1="graphics/ui/icons-synchronize-old.psd" files="1" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1182801431053" target="/org.eclipse.mylyn/graphics/ui/archive" units="0" version="1.0"/>
+<refactoring comment="Rename resource '/org.eclipse.mylyn/graphics/ui/archive' to 'v1.0' - Original project: 'org.eclipse.mylyn' - Original element: 'archive'" description="Rename resource 'archive'" flags="7" id="org.eclipse.jdt.ui.rename.resource" input="graphics/ui/archive" name="v1.0" stamp="1182801437597" version="1.0"/>
+</session>
diff --git a/org.eclipse.mylyn/.refactorings/2007/6/26/refactorings.index b/org.eclipse.mylyn/.refactorings/2007/6/26/refactorings.index
new file mode 100644
index 0000000..89ba0dc
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2007/6/26/refactorings.index
@@ -0,0 +1,3 @@
+1182801392278 Rename resource 'icons-synchronize-state.psd'
+1182801431053 Move file
+1182801437597 Rename resource 'archive'
diff --git a/org.eclipse.mylyn/.refactorings/2008/10/40/refactorings.history b/org.eclipse.mylyn/.refactorings/2008/10/40/refactorings.history
new file mode 100644
index 0000000..2c50393
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2008/10/40/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring comment="Move 2 elements(s) to 'tasks'
- Original project: 'org.eclipse.mylyn'
- Destination element: 'tasks'
- Original elements:
 TaskDataStorageManager.java
 ITaskDataStorage.java" description="Move files" element1="TaskDataStorageManager.java" element2="ITaskDataStorage.java" files="2" flags="589830" folders="0" id="org.eclipse.jdt.ui.move" policy="org.eclipse.jdt.ui.moveResources" qualified="false" references="true" stamp="1222929968279" target="developer/src-old/tasks" units="0" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/.refactorings/2008/10/40/refactorings.index b/org.eclipse.mylyn/.refactorings/2008/10/40/refactorings.index
new file mode 100644
index 0000000..b684ba0
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2008/10/40/refactorings.index
@@ -0,0 +1 @@
+1222929968279 Move files
diff --git a/org.eclipse.mylyn/.refactorings/2008/12/50/refactorings.history b/org.eclipse.mylyn/.refactorings/2008/12/50/refactorings.history
new file mode 100644
index 0000000..5425b52
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2008/12/50/refactorings.history
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<session version="1.0">
+<refactoring accessors="true" comment="Delete 1 element(s) from project 'org.eclipse.mylyn'
- Original project: 'org.eclipse.mylyn'
- Original element: 'feature.png'" description="Delete element" element1="feature.png" elements="0" flags="589830" id="org.eclipse.jdt.ui.delete" resources="1" stamp="1228784889394" subPackages="false" version="1.0"/>
+</session>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/.refactorings/2008/12/50/refactorings.index b/org.eclipse.mylyn/.refactorings/2008/12/50/refactorings.index
new file mode 100644
index 0000000..77b9267
--- /dev/null
+++ b/org.eclipse.mylyn/.refactorings/2008/12/50/refactorings.index
@@ -0,0 +1 @@
+1228784889394 Delete element
diff --git a/org.eclipse.mylyn/.settings/org.eclipse.core.resources.prefs b/org.eclipse.mylyn/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..1f4b9d9
--- /dev/null
+++ b/org.eclipse.mylyn/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,5 @@
+#Tue Feb 06 18:44:59 PST 2007
+eclipse.preferences.version=1
+encoding/.project=UTF-8
+encoding//META-INF/MANIFEST.MF=UTF-8
+encoding/build.properties=ISO-8859-1
diff --git a/org.eclipse.mylyn/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f1554b1
--- /dev/null
+++ b/org.eclipse.mylyn/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,342 @@
+#Tue May 12 20:42:43 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=80
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true
+org.eclipse.jdt.core.formatter.comment.format_block_comments=false
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..766f9cb
--- /dev/null
+++ b/org.eclipse.mylyn/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,63 @@
+#Thu Sep 11 16:27:18 PDT 2008
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Mylyn based on Eclipse
+formatter_settings_version=11
+internal.default.compliance=default
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2004, 2008 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n * Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=true
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn/.settings/org.eclipse.ltk.core.refactoring.prefs
new file mode 100644
index 0000000..bbebc5a
--- /dev/null
+++ b/org.eclipse.mylyn/.settings/org.eclipse.ltk.core.refactoring.prefs
@@ -0,0 +1,3 @@
+#Fri Jun 02 15:30:24 PDT 2006
+eclipse.preferences.version=1
+org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644
index 0000000..3c0413f
--- /dev/null
+++ b/org.eclipse.mylyn/.settings/org.eclipse.mylyn.tasks.ui.prefs
@@ -0,0 +1,4 @@
+#Wed Dec 19 18:09:57 PST 2007
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..e8f2d56
--- /dev/null
+++ b/org.eclipse.mylyn/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,18 @@
+#Tue Apr 15 11:07:59 PDT 2008
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=2
+compilers.p.missing-bundle-classpath-entries=1
+compilers.p.missing-packages=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn/META-INF/MANIFEST.MF b/org.eclipse.mylyn/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a836cb6
--- /dev/null
+++ b/org.eclipse.mylyn/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.mylyn;singleton:=true
+Bundle-Version: 3.2.1.qualifier
+Bundle-Vendor: %Bundle-Vendor
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
diff --git a/org.eclipse.mylyn/about.html b/org.eclipse.mylyn/about.html
new file mode 100644
index 0000000..d774b07
--- /dev/null
+++ b/org.eclipse.mylyn/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/about.ini b/org.eclipse.mylyn/about.ini
new file mode 100644
index 0000000..8fba0c2
--- /dev/null
+++ b/org.eclipse.mylyn/about.ini
@@ -0,0 +1,17 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=Eclipse Mylyn Project\n\
+\n\ Copyright (c) 2004, 2008 Mylyn project committers and others. All rights reserved.\n\
+Visit http://eclipse.org/mylyn
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=feature.gif
+
+# Property "welcomePerspective" contains the id of the perspective in which the
+# welcome page is to be opened.
+# optional
diff --git a/org.eclipse.mylyn/build.properties b/org.eclipse.mylyn/build.properties
new file mode 100644
index 0000000..2720338
--- /dev/null
+++ b/org.eclipse.mylyn/build.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2004, 2008 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
+###############################################################################
+
+bin.includes = META-INF/,\
+ about.html,\
+ about.ini,\
+ feature.gif,\
+ .,\
+ plugin.properties
+src.includes = about.html,\
+ about.ini
+
diff --git a/org.eclipse.mylyn/developer/archive/contributors.html b/org.eclipse.mylyn/developer/archive/contributors.html
new file mode 100644
index 0000000..3c02db9
--- /dev/null
+++ b/org.eclipse.mylyn/developer/archive/contributors.html
@@ -0,0 +1,156 @@
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="EXPIRES" CONTENT="0">
+ <META HTTP-EQUIV="" CONTENT="">
+ <TITLE>Mylar</TITLE>
+<style>
+<!--
+
+/********************************************************************
+ * TOP LEVEL
+ ********************************************************************/
+A:link { color:#4756AC; }
+A:visited { color:#4756AC; }
+/* A:visited { color:#60657B; } */
+A:hover { color:#711616}
+BODY {
+ background-color:white;
+ margin-left: 10px;
+}
+P {
+ font:13px Verdana, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ margin-left: 10px;
+}
+
+PRE { font:13px "Courier", sans-serif; }
+
+/********************************************************************
+ * SPAN LEVEL
+ ********************************************************************/
+
+B { font-weight:bold; }
+STRONG { font-weight:bold; }
+CODE { font:13px "Courier", sans-serif; }
+
+/********************************************************************
+ * HEADINGS
+ ********************************************************************/
+H1 { font:20px Verdana, Helvetica, sans-serif;
+ color:black;
+ font-weight:bold;
+ margin-left: 10px;
+}
+
+H2 { font:18px Verdana, Arial, Helvetica, sans-serif;
+ color:black;
+ font-weight:bold;
+ margin-left: 10px;
+}
+
+H3 { font:16px Verdana, Arial, Helvetica, sans-serif;
+ color:black;
+ font-weight:bold;
+ margin-left: 10px;
+}
+H4 { font:13px Verdana, Arial, Helvetica, sans-serif;
+ color:black;
+ font-weight:bold;
+ margin-left: 10px;
+}
+
+/********************************************************************
+ * LISTS & TABLES
+ ********************************************************************/
+LI { font:13px Verdana, Arial, Helvetica, sans-serif; }
+
+UL { font:13px Verdana, Arial, Helvetica, sans-serif; }
+
+OL { font:13px Verdana, Arial, Helvetica, sans-serif; }
+DT { font:13px Verdana, Arial, Helvetica, sans-serif; font-weight:bold; }
+DD { font:13px Verdana, Arial, Helvetica, sans-serif; }
+
+TD { font:13px Verdana, Arial, Helvetica, sans-serif; }
+
+TH { font:13px Verdana, Arial, Helvetica, sans-serif;
+ font-weight:bold;
+ text-align:center;
+}
+
+
+/********************************************************************
+ * FORMS
+ ********************************************************************/
+
+.searchInput { color: #666666; border: 1px solid; background: none;
+ font:11px Verdana, Arial, Helvetica, sans-serif;
+ padding-left: 3; padding-top: 2; padding-bottom: 3; }
+
+/********************************************************************
+ * CLASSES *
+ ********************************************************************/
+
+.navBarSection { font:10px Verdana, Arial, Helvetica, sans-serif; font-weight:bold;}
+
+.navBarSubSection { font:10px Verdana, Arial, Helvetica, sans-serif; }
+.fancyHeading { font:20px Chantilly, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ color:#6f7a92;
+ margin-left: 10px;
+}
+
+.indentedParagraph { font:13px Verdana, Arial, Helvetica, sans-serif;
+ margin-right: 10px;
+ text-align:left;
+ margin-left: 30px;
+}
+
+.footer {
+ font:10px Verdana, Arial, Helvetica, sans-serif;
+ color:#888888;
+ text-align:left
+}
+
+.figureTitle { font:13px Verdana, Arial, Helvetica, sans-serif;
+ text-align:justify;
+ text-align:center
+}
+
+.copyrightNotice { font:10px Verdana, Arial, Helvetica, sans-serif; color:#999999; }
+
+.smallHeading { font:13px Verdana, Arial, Helvetica, sans-serif; font-weight:bold; }
+
+.tinyHeading { font:11px Verdana, Arial, Helvetica, sans-serif; font-weight:bold; }
+
+.newsText { font:11px Verdana, Arial, Helvetica, sans-serif; }
+
+.smallParagraph { font:11px Verdana, Arial, Helvetica, sans-serif; }
+
+.code { }
+
+.command { }
+
+.codeindent { margin-left: 30px; }
+
+.commandindent { margin-left: 30px; }
+-->
+</style>
+
+<SCRIPT>
+ </SCRIPT>
+</HEAD>
+<BODY LINK="#4756AC" VLINK="#60657B" BGCOLOR="#FFFFFF">
+
+ <p>Non-committer contributions to Mylar (last updated June 17, 2005)</p>
+ <ul>
+ <li>org.eclipse.mylar.tasks<ul>
+ <li>Ken Sueda (<a href="mailto:ksueda at cs.ubc.ca">ksueda at cs.ubc.ca</a>)<ul>
+ <li>2005-06-17: contributed task serialization as xml and
+ improvements to task list view</li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/archive/issue-trackers.html b/org.eclipse.mylyn/developer/archive/issue-trackers.html
new file mode 100644
index 0000000..a928c88
--- /dev/null
+++ b/org.eclipse.mylyn/developer/archive/issue-trackers.html
@@ -0,0 +1,205 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Mylar Issue Tracker Requirements</title>
+</head>
+
+<body>
+
+<div id="globalWrapper">
+ <div id="column-content">
+ <div id="content">
+ <h1 class="firstHeading">Mylar Issue Tracker Requirements</h1>
+ <div id="bodyContent">
+ History
+ <ul>
+ <li>2005-11-25: Initial draft (Brock Janiczak and Mik
+ Kersten) </li>
+ </ul>
+ <p><b>General</b> </p>
+ <ul>
+ <li>Associate a repository with a project, credentials
+ stored in keyring. UI is a project properties page specified
+ by provider.
+ </li>
+ <li>Possibly provide view showing all repositories, where
+ each provider can populate repository nodes with contets
+ (e.g. products, reports).
+ </li>
+ <li>Should be able to discover new repositories by checking
+ out a project.
+ <ul>
+ <li>Mik: Brock, could you provide more detail on this
+ one? </li>
+ <li><font color="#6600cc">Consider the case of a user
+ that is new to a project. It would be really nice if
+ all they had to do was check out a project from CVS/SVN
+ and the tracker instance is created and associated with
+ the project automatically. I was expecting to store
+ this information as a project scoped preference (so it
+ can be checked in to version control). Another option
+ is to have a a file (like the team PSF file) that can be
+ imported to create the required tracker instances and
+ attempt to connect each project to its appropriate
+ instance.</font> </li>
+ <li><font color="#6600cc">Also, most issue trackers have
+ some way to partition bugs into groups (that can relate
+ to a project atrifact). It would be nice if this could
+ also be associated with the project so when an issue is
+ created in the context of a project the component (or
+ whatever your tracker calls it) can be defaulted.</font>
+ </li>
+ </ul>
+ <p> </li>
+ <li>No coupling to mylar core or UI. </li>
+ </ul>
+ <p><b>Queries</b> </p>
+ <ul>
+ <li>Provide a general notion of a query and parameters, hits
+ returned, and a persistance mechanism (a first cut at this
+ is already in mylar.tasklist).
+ </li>
+ <li>Provide incoming/outgoing status notification. </li>
+ </ul>
+ <p><b>Editing Reports</b> </p>
+ <ul>
+ <li>Basic mode of embedding browser when opening issue.
+ </li>
+ <li>Generic issue editor similar to Mylar's Bugzilla one,
+ based on attributes and comments. </li>
+ </ul>
+ <p><b>Text</b> </p>
+ <ul>
+ <li>Hyperlink issue number in text editors.
+ <ul>
+ <li>Brock: Berhaps we could have Team support for this?
+ SVN could store the info in properties and CVS in a
+ file.
+ </li>
+ <li>Mik: isn't it enough just to look up the repository
+ associated with the project? </li>
+ <li><font color="#6600cc">It is possible to open a
+ resource directly from the history view or the
+ repository view. In these cases there is no project.</font></li>
+ </ul>
+ </li>
+ </ul>
+ <p><b>Source Repositories</b> </p>
+ <ul>
+ <li>Provide hyperlink support in the history view
+ <ul>
+ <li>Mik: This may be better as a popup action, which
+ Mylar already has. But hyperlink could work as well.
+ </li>
+ <li><font color="#6600cc">A popup action is fine when
+ there is only one bug referenced in the commit comment,
+ but some people (like myself) sometimes check in a
+ change that relates to multiple issues. I probably
+ shouldn't, but i do :)</font></li>
+ </ul>
+ </li>
+ <li>Populate commit comment with issue details.
+ <ul>
+ <li>Brock: (Possible use the new template stuff? Ie a
+ dynamic template)
+ </li>
+ <li><font color="#6600cc">Just clarifying this as it
+ makes no sense at all... In 3.2 CVS supports static
+ templates. The user just creates a chunk of text and it
+ can be added into the commit dialog. I can't see why
+ this template support can't be updated to support
+ 'active' templates. You select a 'bug' template and a
+ dialog pops up asking you to enter (or search for) a
+ bug. These values will then be inserted into the
+ template before it is added to the commit dialog. I
+ think this would be of more value than the current
+ static templates. I would be willing to look at
+ providing a patch to Team/CVS for this one. btw, I will
+ try and convince them to push it down to the Team level
+ so the same templates can be used for all team providers
+ (it seems to make sense).</font></li>
+ </ul>
+ </li>
+ <li>Perform some sort of Issue workflow action on commit
+ (probably resolve)
+ <ul>
+ <li>Brock: CVS has no support for any of this yet. They
+ would probably accept patches for most of this. If some
+ of this could be moved to Team, even better. All
+ repositories have a commit process and all have a
+ revision history.
+ </li>
+ <li><font color="#6600cc">again, what was I on? I
+ basically wanted a post commit hook so we could perform
+ an action against the issue tracker. The obvious thing
+ to do is comment/resolve an issue. Perhaps i was asking
+ for a team level commit dialog???</font></li>
+ </ul>
+ </li>
+ </ul>
+ <p><b>Mylar</b> </p>
+ <ul>
+ <li>What are the requirements for Mylar?
+ <ul>
+ <li>Brock: It really only needs to get a list of issue
+ from a query. The query implementation and UI need to be
+ provider specific unless the query is always "my bugs".
+ I don't see a problem with adding a Mylar/Issue Tracker
+ bridge to do this.
+ </li>
+ <li>Mik: The main thing Mylar needs is for there to be a
+ single high quality Tasks view that makes it easy to
+ work with local tasks, reports, and queries, and for
+ that to be consisntent across providers. What it layers
+ on to that is the ability to activate contexts. It also
+ needs a mechanism for attaching context to issues, and
+ retrieving them from issues. From a source and feature
+ perspective the task functionality should be decoupled
+ from Mylar (and it is, i.e. you can use the Mylar Tasks
+ view and Bugzilla support without the Mylar UI). But
+ Mylar is all about a very task-centric view of the
+ world, and as such the UIs will be highly
+ interdependent. </li>
+ <li><font color="#6600cc">I am not sure how to support
+ local issues yet. It is almost as if we need another
+ view to show local issues (the platform task view would
+ be perfect)</font><br>
+ </li>
+ <li><font color="#6600cc">I have been thinking about the
+ best way to structure the UI. The issue tracker as it
+ currently stands is no good. I was considering having
+ two separate views; A "Repository browser" and an issue
+ list. The common navigator stuff that is coming for 3.2
+ would be perfect for the repository browser. We could
+ have a top level (project level) item for the issue
+ trackers as well as a node in each project that has an
+ attached provider. This seems to be a more logical
+ thing to do and puts the issue information right where
+ the user needs it.</font></li>
+ </ul>
+ </li>
+ </ul>
+ <p><b>Use Cases</b> </p>
+ <ul>
+ <li>Work with bugs and queries within Eclipse.
+ </li>
+ <li>Work with Mylar's task contexts (layers on above). </li>
+ <li><font color="#6600cc">As a user, one thing i would
+ *love* is to have a list of active searches. These will
+ update every so often and let me know when there are new
+ matches (or changes). This way i don't have to be
+ distracted by emails. Being able to switch between a set of
+ issues without re-running the query would also be nice.</font></li>
+ </ul>
+ <!-- Saved in parser cache with key wiki:pcache:idhash:1317-0!1!0!0!!en!2 and timestamp 20051130154503 -->
+ <div class="printfooter">
+ </div>
+ <!-- end content --></div>
+ </div>
+ </div>
+</div>
+
+</body>
+
+</html>
diff --git a/org.eclipse.mylyn/developer/archive/tests-manual.html b/org.eclipse.mylyn/developer/archive/tests-manual.html
new file mode 100644
index 0000000..bcd019f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/archive/tests-manual.html
@@ -0,0 +1,226 @@
+<html>
+ <body>
+ <h2> </h2>
+ <p align="center"><font size="4">DEPRECATED</font></p>
+ <p><font size="4">This information is now maintained here: http://wiki.eclipse.org/index.php/Mylar_Testing</font></p>
+ <h2> </h2>
+ <h2><strike>Mylar Manual Tests</strike></h2>
+ <p><b>Help</b></p>
+ <ul>
+ <li><b> </b>Help > Help Contents > Mylar > New and Noteworthy
+ [ ensure updated ]</li>
+ </ul>
+ <p><b>Bugzilla Client</b></p>
+
+ <ul>
+ <li>Offline Reports<ul>
+ <li><font color="#FF6600">Ensure that when a bug report is opened offline that has no offline
+ data the bug page reads: "Repository task data not available, please
+ synchronize." (Aug 17, 2006 [0.6.2] page reads "Could not download
+ task data..."</font></li>
+ <li>In the case of migration ensure that offline reports still open correctly (if not
+ lost completely).</li>
+ </ul>
+ </li>
+ <li>Editor Hyperlinking - URL Hyperlinks, Bug hyperlinks (bug# 123, bug 12312,
+ task# 1, task 12, duplicate bug links), stack trace links</li>
+ <li>Editor menu/commands - Cut/Copy/Paste/Select-all from menu and
+ using shortcut keys</li>
+ <li>Repository Search (Search > Search... > Repository Search tab)<ul>
+ <li>Repository search page<ul>
+ <li>Ensure warning if no repository exists.</li>
+ <li>Cycle through available repository search pages ensuring
+ that they populate with the last search performed on the
+ respective repository</li>
+ <li>Ensure other repository types search pages appear when
+ selected</li>
+ </ul></li>
+ <li>Repository Search Results View<ul>
+ <li>Test opening non-local report (Bug should open in bugzilla
+ editor (blue bin icon) and the browser tab should be available)</li>
+ <li>Test opening report with local data (Bug should open in
+ bugzilla editor (clipboard with blue bin overlay icon) and the
+ Planning tab and Browser tab should be available)</li>
+ </ul></li>
+ </ul></li>
+ <li>Bugzilla Query Wizard</li> (Tasklist)<ul>
+ <li>Create new query</li>
+ <li>Open query to see that parameters are still there</li>
+ <li>Check for error handling (enter invalid number in max returned etc)</li>
+ </ul></li>
+ <li>New Bug submission (valid credentials)<ul>
+ <li>Test new bug submission for each Bugzilla server version</li>
+ </ul></li>
+ <li>Update of Repository Configuration<ul>
+ <li>Test from TaskRepositoriesView context menu</li>
+ <li>Test from BugzillaProductPage</li>
+ <li>A dialog should be produced in either case when an io or login
+ exceptions occur.</li>
+ <li>Configuration caching<ul>
+ <li>Run new bug wizard, update products...</li>
+ <li>Restart eclipse, rerun wizard, products should appear immediately</li>
+ </ul></li>
+ </ul>
+ </li>
+ <li>New Bug submission (invalid credentials)<ul>
+ <li>Remove username and password from a repository configuration in the
+ Task Repositories view</li>
+ <li>Initiate new repository task action</li>
+ <li>Select repository with missing credentials</li>
+ <li>Upon submitting new bug editor user is
+ presented with credentials error dialog</li>
+ </ul></li>
+ <li>New Bug submission (invalid password)<ul>
+ <li>Make repository password invalid in Task Repositories view.</li>
+ <li>Initiate new repository task action.</li>
+ <li>Select repository with invalid password</li>
+ <li>Error Dialog presented on product update or selection of Next: The
+ user name or password you entered is not valid...</li>
+ </ul></li>
+ <li>Submission of changes to a Bugzilla report should result in all
+ parent queries being re-synchronized as well as the task itself being
+ synchronized</li>
+ <li>Ensure submission of comment doesn't remove any depends on / blocks
+ bugs</li>
+ <li>Submission of changes to existing bug with invalid repository
+ credentials<ul>
+ <li>Mylar Bugzilla Client Dialog: Bugzilla could not post your bug since your login name or password is incorrect.
+ Ensure proper repository configuration in Task Repositories view.</li>
+ </ul></li>
+ <li><font color="#FF6600">Bug Compare (ensure attribute compare works)
+ (July 31, 2006 [0.6.1] - Compare button removed)</font></li>
+ <li>Synchronize from context menu (invalid userid and password)<ul>
+ <li><font color="#FF6600">Report Download Failed Dialog: Ensure proper repository
+ configuration in Task Repositories view. (Aug 17, 2006 [0.6.2] -
+ currently upon failure the task remains italic and if the error is
+ not an io related exception it is logged.)</font></li>
+ </ul></li>
+ <li>Synchronizing while disconnected should not put errors in the
+ eclipse log</li>
+ <li>Reports > Task list notification<ul>
+ <li>Open, modify, save, should have outgoing decorator<ul>
+ <li>Case synchronize: should get option to override local changes<ul>
+ <li>If overriding, overlay and changes go away</li>
+ <li>If no override, get conflict icon to show</li>
+ </ul></li>
+ <li>Case open: should retain outgoing overlay</li>
+ <li>Case edit and save again: outgoing overlay remains (should
+ not receive conflict warning)</li>
+ <li>Case submit: outgoing overlay should disappear (should be no incoming
+ upon synchronize)</li>
+ </ul></li>
+ <li>Task in CONFLICT state<ul>
+ <li>Case open: remains with conflict decorator</li>
+ <li>Case synchronize: should get option to override local changes<ul>
+ <li>Case overriding: overlay and changes go away</li>
+ <li>Case no override: changes remain, conflict decorator appears</li>
+ </ul></li>
+ <li>Case edit: Currently state switches to OUTGOING which is
+ correct for now because we migrate their comment into the new
+ report<br> </li>
+ </ul>
+ <p></li>
+ <li>Query hits not yet downloaded<ul>
+ <li>Case open: report downloaded (task icon appears), no decoration</li>
+ <li>Case synchronize: report downloaded (task icon appears), no
+ decoration<br> </li>
+ </ul></li>
+ <li>Open report in external editor and add a comment.<ul>
+ <li>Case synchronize: incoming decoration should appear on task<ul>
+ <li>Case open: task opens with new content, no decoration</li>
+ <li>Case open (bug editor already open):
+ User presented with dialog asking if they want to reopen
+ with latest version</li>
+ <li>Case Background Synchronization incoming state remains</li>
+ </ul></li>
+ <li>Case open: task opens with offline content, user asked if
+ they want to refresh with incoming content.<br> </li>
+ </ul></li>
+ <li>Open, modify, save, should have outgoing decorator, open report in
+ external browser, add comment<ul>
+ <li>Case open: Outgoing decorator remains</li>
+ <li>Case Submit: Dialog:Possible problem posting Bugzilla
+ report... HTML mid-air collision dialog<ul>
+ <li>Overwrite changes dialog (if yes - SYNCHRONIZED, if no -
+ CONFLICT)</li>
+ </ul></li>
+ <li>Case synchronize: should get option to override local changes<ul>
+ <li>If overriding, overlay and changes go away</li>
+ <li>If no override, get conflict icon to show<br> </li>
+ </ul></li>
+ </ul></li>
+ <li>Copy report to a local category, repeat above tests ensuring
+ decoration always </li>
+ <li>Copy report to root category, repeat tests ensuring decoration
+ always matches</li>
+ </ul></li>
+ <li>Check that auto background synchronize works<ul>
+ <li>Ensure that new hits (i.e. reports created using web ui) appear in
+ query after auto sync</li>
+ <li>Ensure that incoming on existing tasks appears after auto
+ synchronization </li>
+ </ul></li>
+ <li>If editor open and task gets incoming, dialog
+ should be presented asking if user wants to refresh and reopen.</li>
+ <li>Check that if changes are made to the notes field of the Planning
+ editor that save still works (editor doesn't remain dirty).</li>
+ <li>Ensure that when offline reports file is deleted, tasks don't
+ suddenly all have incoming status upon synchronizing</li>
+ <li>Reports > Outline View<ul>
+ <li>Clicking on comments in outline view should cause editor to
+ scroll to respective bug on page.</li>
+ </ul></li>
+ <li>DnD Attachments: Ensure all of the following launch the new attachment wizard with
+ the appropriate file specified.
+ <ul><li>Drag a file from the workspace to the attachments section or new comment box.</li>
+ <li>Drag a file from a different application (or desktop) onto the attachments section
+ or new comment box.</li>
+ <li>Drag a region of text from any application (eg. a web browser) onto the attachments
+ section or new comment box.</li>
+ </ul></li>
+ </ul>
+ <p><b>Task List</b></p>
+ <ul>
+ <li>File -> Export -> Mylar Task Data: ensure it works</li>
+ <li>File -> Import -> Mylar Task Data:<ul>
+ <li>Test importing with task in active state</li>
+ </ul>
+ </li>
+ <li>Make a task, make it active, move it to the
+ archive (remove from root category) - file should remain visible in task list</li>
+ <li>Task List Auto-Archive</li>
+ <li>Addition and removal of files from change sets</li>
+ <li>Mylar context sensitive JUnit unit tests</li>
+ <li>Ensure internal browser tab can be disabled (via preferences)</li>
+ <li>Drag and Drop<ul>
+ <li>From category to category: move</li>
+ <li>From query to category: copies</li>
+ <li>Task to external text: copies details</li>
+ <li>Task to external explorer: copies context file (<font color="#FF6600">
+ July 31, 2006 [0.6.1] - if context doesn't exist need to disable drop?</font>
+ )</li>
+ </ul>
+
+ </li>
+ </ul>
+
+ <p><b>SDK Integration</b></p>
+ <ul>
+ <li>Problems view</li>
+ <li>Debug view</li>
+ <li>Eclipse native tasks view</li>
+ <li>History view -> context menu -> Open Corresponding Task</li>
+ </ul>
+
+ <p><b>Java</b></p>
+ <ul>
+ <li>Run JUnit context test without interesting tests: should get message</li>
+ <li>Run JUnit contexts test with interesting tests, should run</li>
+ <li>Do above for PDE JUnit tests</li>
+ <li>Ensure code folding works properly</li>
+ </ul>
+ <p>PDE</p>
+ <ul>
+ <li>...</li>
+ </ul>
+</body></html>
diff --git a/org.eclipse.mylyn/developer/mylar-settings-templates.xml b/org.eclipse.mylyn/developer/mylar-settings-templates.xml
new file mode 100644
index 0000000..1abcde8
--- /dev/null
+++ b/org.eclipse.mylyn/developer/mylar-settings-templates.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?><templates><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
+ * @param ${param} the ${bare_field_name} to set
+ */</template><template autoinsert="false" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment"></template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
+ *
+ */</template><template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
+ * @author ${user}
+ */</template><template autoinsert="true" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment">/**
+ *
+ */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
+ * ${tags}
+ * ${see_to_target}
+ */</template><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
+ * @return the ${bare_field_name}
+ */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
+ * ${tags}
+ */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
+ * ${tags}
+ */</template></templates>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/mylyn-settings-formatter.xml b/org.eclipse.mylyn/developer/mylyn-settings-formatter.xml
new file mode 100644
index 0000000..54374e8
--- /dev/null
+++ b/org.eclipse.mylyn/developer/mylyn-settings-formatter.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<profiles version="10">
+<profile name="Mylyn based on Eclipse [built-in]" version="10">
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+</profile>
+</profiles>
diff --git a/org.eclipse.mylyn/developer/src-old/AbstractHyperlinkDetector.java b/org.eclipse.mylyn/developer/src-old/AbstractHyperlinkDetector.java
new file mode 100644
index 0000000..c00e819
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/AbstractHyperlinkDetector.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2005 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugs.java;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class AbstractHyperlinkDetector implements IHyperlinkDetector {
+
+ private ITextEditor fEditor;
+
+ public abstract IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
+ boolean canShowMultipleHyperlinks);
+
+ public ITextEditor getEditor() {
+ return fEditor;
+ }
+
+ public void setEditor(ITextEditor editor) {
+ this.fEditor = editor;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/AbstractQueryHit.java b/org.eclipse.mylyn/developer/src-old/AbstractQueryHit.java
new file mode 100644
index 0000000..8208a99
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/AbstractQueryHit.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.tasks.core;
+
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryTaskHandleUtil;
+import org.eclipse.mylyn.tasks.core.Task.PriorityLevel;
+
+/**
+ * @author Mik Kersten
+ */
+/*public*/ abstract class AbstractQueryHit extends PlatformObject implements ITaskListElement {
+
+ protected TaskList taskList;
+
+ protected AbstractTask task;
+
+ protected String repositoryUrl;
+
+ protected String summary;
+
+ protected String priority = PriorityLevel.getDefault().toString();
+
+ protected String taskId;
+
+ private boolean completed = false;
+
+ private boolean isNotified = false;
+
+ private AbstractRepositoryQuery parent;
+
+ protected AbstractQueryHit(TaskList taskList, String repositoryUrl, String description, String taskId) {
+ this.taskList = taskList;
+ this.repositoryUrl = repositoryUrl;
+ this.summary = description;
+ this.taskId = taskId;
+ }
+
+ public AbstractRepositoryQuery getParent() {
+ return parent;
+ }
+
+ public void setParent(AbstractRepositoryQuery parent) {
+ this.parent = parent;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ public String getSummary() {
+ if (task != null) {
+ return task.getSummary();
+ } else {
+ return summary;
+ }
+ }
+
+ public AbstractTask getOrCreateCorrespondingTask() {
+ if (taskList == null) {
+ return null;
+ }
+
+ ITask existingTask = taskList.getTask(getHandleIdentifier());
+ if (existingTask instanceof AbstractTask) {
+ this.task = (AbstractTask) existingTask;
+ } else {
+ task = createTask();
+ task.setCompleted(completed);
+ taskList.addTask(task);
+ }
+ return task;
+ }
+
+ //@Deprecated
+ protected abstract AbstractTask createTask();
+
+ /**
+ * @return null if there is no corresponding task
+ */
+ public AbstractTask getCorrespondingTask() {
+ return task;
+ }
+
+ public void setCorrespondingTask(AbstractTask task) {
+ this.task = task;
+ }
+
+ public boolean isCompleted() {
+ if (task != null) {
+ return task.isCompleted();
+ } else {
+ return completed;
+ }
+ }
+
+ public void setCompleted(boolean completed) {
+ this.completed = completed;
+ }
+
+ public final String getHandleIdentifier() {
+ if (task != null) {
+ return task.getHandleIdentifier();
+ }
+ return RepositoryTaskHandleUtil.getHandle(repositoryUrl, taskId);
+ }
+
+ /**
+ * @return Unique identifier for this task on the corresponding server, must
+ * be robust to changing attributes on the task.
+ */
+ public String getTaskId() {
+ return taskId;
+ }
+
+ /**
+ * @return An ID that can be presented to the user for identifying the task,
+ * override to return null if no such ID exists.
+ */
+ public String getIdentifyingLabel() {
+ return getTaskId();
+ }
+
+ public boolean isNotified() {
+ return isNotified;
+ }
+
+ public void setNotified(boolean notified) {
+ isNotified = notified;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof AbstractQueryHit)) {
+ return false;
+ }
+ AbstractQueryHit hit = (AbstractQueryHit) obj;
+ return hit.getHandleIdentifier().equals(this.getHandleIdentifier());
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getHandleIdentifier().hashCode();
+ }
+
+ /**
+ * @return the url of the hit without any additional login information etc.
+ */
+ public String getUrl() {
+ return "";
+ }
+
+ public String getPriority() {
+ if (task != null) {
+ return task.getPriority();
+ } else {
+ return priority;
+ }
+ }
+
+ public void setPriority(String priority) {
+ this.priority = priority;
+ }
+
+ public void setSummary(String description) {
+ this.summary = description;
+ }
+
+ public void setHandleIdentifier(String id) {
+ // ignore
+ }
+
+ public int compareTo(ITaskListElement taskListElement) {
+ return this.taskId.compareTo(((AbstractQueryHit) taskListElement).taskId);
+ }
+
+ @Deprecated
+ public void setTaskId(String taskId) {
+ this.taskId = taskId;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/AwtExample.java b/org.eclipse.mylyn/developer/src-old/AwtExample.java
new file mode 100644
index 0000000..25bf549
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/AwtExample.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+import java.awt.EventQueue;
+import java.io.File;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.awt.SWT_AWT;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+
+public class AwtExample {
+
+ public static void main(String[] args) {
+ final Display display = new Display();
+ final Shell shell = new Shell(display);
+ shell.setText("SWT and Swing/AWT Example");
+
+ Listener exitListener = new Listener() {
+ public void handleEvent(Event e) {
+ MessageBox dialog = new MessageBox(shell, SWT.OK | SWT.CANCEL | SWT.ICON_QUESTION);
+ dialog.setText("Question");
+ dialog.setMessage("Exit?");
+ if (e.type == SWT.Close) e.doit = false;
+ if (dialog.open() != SWT.OK) return;
+ shell.dispose();
+ }
+ };
+ Listener aboutListener = new Listener() {
+ public void handleEvent(Event e) {
+ final Shell s = new Shell(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
+ s.setText("About");
+ GridLayout layout = new GridLayout(1, false);
+ layout.verticalSpacing = 20;
+ layout.marginHeight = layout.marginWidth = 10;
+ s.setLayout(layout);
+ Label label = new Label(s, SWT.NONE);
+ label.setText("SWT and AWT Example.");
+ Button button = new Button(s, SWT.PUSH);
+ button.setText("OK");
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.CENTER;
+ button.setLayoutData(data);
+ button.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ s.dispose();
+ }
+ });
+ s.pack();
+ Rectangle parentBounds = shell.getBounds();
+ Rectangle bounds = s.getBounds();
+ int x = parentBounds.x + (parentBounds.width - bounds.width) / 2;
+ int y = parentBounds.y + (parentBounds.height - bounds.height) / 2;
+ s.setLocation(x, y);
+ s.open();
+ while (!s.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+ }
+ };
+ shell.addListener(SWT.Close, exitListener);
+ Menu mb = new Menu(shell, SWT.BAR);
+ MenuItem fileItem = new MenuItem(mb, SWT.CASCADE);
+ fileItem.setText("&File");
+ Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
+ fileItem.setMenu(fileMenu);
+ MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
+ exitItem.setText("&Exit\tCtrl+X");
+ exitItem.setAccelerator(SWT.CONTROL + 'X');
+ exitItem.addListener(SWT.Selection, exitListener);
+ MenuItem aboutItem = new MenuItem(fileMenu, SWT.PUSH);
+ aboutItem.setText("&About\tCtrl+A");
+ aboutItem.setAccelerator(SWT.CONTROL + 'A');
+ aboutItem.addListener(SWT.Selection, aboutListener);
+ shell.setMenuBar(mb);
+
+ RGB color = shell.getBackground().getRGB();
+ Label separator1 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
+ Label locationLb = new Label(shell, SWT.NONE);
+ locationLb.setText("Location:");
+ Composite locationComp = new Composite(shell, SWT.EMBEDDED);
+ ToolBar toolBar = new ToolBar(shell, SWT.FLAT);
+ ToolItem exitToolItem = new ToolItem(toolBar, SWT.PUSH);
+ exitToolItem.setText("&Exit");
+ exitToolItem.addListener(SWT.Selection, exitListener);
+ ToolItem aboutToolItem = new ToolItem(toolBar, SWT.PUSH);
+ aboutToolItem.setText("&About");
+ aboutToolItem.addListener(SWT.Selection, aboutListener);
+ Label separator2 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
+ final Composite comp = new Composite(shell, SWT.NONE);
+ final Tree fileTree = new Tree(comp, SWT.SINGLE | SWT.BORDER);
+ Sash sash = new Sash(comp, SWT.VERTICAL);
+ Composite tableComp = new Composite(comp, SWT.EMBEDDED);
+ Label separator3 = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
+ Composite statusComp = new Composite(shell, SWT.EMBEDDED);
+
+ java.awt.Frame locationFrame = SWT_AWT.new_Frame(locationComp);
+ final java.awt.TextField locationText = new java.awt.TextField();
+ locationFrame.add(locationText);
+
+ java.awt.Frame fileTableFrame = SWT_AWT.new_Frame(tableComp);
+ java.awt.Panel panel = new java.awt.Panel(new java.awt.BorderLayout());
+ fileTableFrame.add(panel);
+
+ java.awt.Frame statusFrame = SWT_AWT.new_Frame(statusComp);
+ statusFrame.setBackground(new java.awt.Color(color.red, color.green, color.blue));
+ final java.awt.Label statusLabel = new java.awt.Label();
+ statusFrame.add(statusLabel);
+ statusLabel.setText("Select a file");
+
+ sash.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ if (e.detail == SWT.DRAG) return;
+ GridData data = (GridData)fileTree.getLayoutData();
+ Rectangle trim = fileTree.computeTrim(0, 0, 0, 0);
+ data.widthHint = e.x - trim.width;
+ comp.layout();
+ }
+ });
+
+ File[] roots = File.listRoots();
+ for (int i = 0; i < roots.length; i++) {
+ File file = roots[i];
+ TreeItem treeItem = new TreeItem(fileTree, SWT.NONE);
+ treeItem.setText(file.getAbsolutePath());
+ treeItem.setData(file);
+ TreeItem dumyItem = new TreeItem(treeItem, SWT.NONE);
+ }
+ fileTree.addListener(SWT.Expand, new Listener() {
+ public void handleEvent(Event e) {
+ TreeItem item = (TreeItem)e.item;
+ if (item == null) return;
+ if (item.getItemCount() == 1) {
+ TreeItem firstItem = item.getItems()[0];
+ if (firstItem.getData() != null) return;
+ firstItem.dispose();
+ } else {
+ return;
+ }
+ File root = (File)item.getData();
+ File[] files = root.listFiles();
+ if (files == null) return;
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ if (file.isDirectory()) {
+ TreeItem treeItem = new TreeItem(item, SWT.NONE);
+ treeItem.setText(file.getName());
+ treeItem.setData(file);
+ TreeItem dumyItem = new TreeItem(treeItem, SWT.NONE);
+ }
+ }
+ }
+ });
+ fileTree.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ TreeItem item = (TreeItem)e.item;
+ if (item == null) return;
+ final File root = (File)item.getData();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ statusLabel.setText(root.getAbsolutePath());
+ locationText.setText(root.getAbsolutePath());
+ }
+ });
+ }
+ });
+
+ GridLayout layout = new GridLayout(4, false);
+ layout.marginWidth = layout.marginHeight = 0;
+ layout.horizontalSpacing = layout.verticalSpacing = 1;
+ shell.setLayout(layout);
+ GridData data;
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 4;
+ separator1.setLayoutData(data);
+ data = new GridData();
+ data.horizontalSpan = 1;
+ data.horizontalIndent = 10;
+ locationLb.setLayoutData(data);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ data.heightHint = locationText.getPreferredSize().height;
+ locationComp.setLayoutData(data);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 1;
+ toolBar.setLayoutData(data);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 4;
+ separator2.setLayoutData(data);
+ data = new GridData(GridData.FILL_BOTH);
+ data.horizontalSpan = 4;
+ comp.setLayoutData(data);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 4;
+ separator3.setLayoutData(data);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 4;
+ data.heightHint = statusLabel.getPreferredSize().height;
+ statusComp.setLayoutData(data);
+
+ layout = new GridLayout(3, false);
+ layout.marginWidth = layout.marginHeight = 0;
+ layout.horizontalSpacing = layout.verticalSpacing = 1;
+ comp.setLayout(layout);
+ data = new GridData(GridData.FILL_VERTICAL);
+ data.widthHint = 200;
+ fileTree.setLayoutData(data);
+ data = new GridData(GridData.FILL_VERTICAL);
+ sash.setLayoutData(data);
+ data = new GridData(GridData.FILL_BOTH);
+ tableComp.setLayoutData(data);
+
+ shell.open();
+ while(!shell.isDisposed()) {
+ if (!display.readAndDispatch()) display.sleep();
+ }
+ display.dispose();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/BugzillaHyperLinkDetector.java b/org.eclipse.mylyn/developer/src-old/BugzillaHyperLinkDetector.java
new file mode 100644
index 0000000..423c1cf
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/BugzillaHyperLinkDetector.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugs.java;
+
+import java.util.List;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.Block;
+import org.eclipse.jdt.core.dom.Comment;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.TextElement;
+import org.eclipse.jdt.internal.corext.dom.NodeFinder;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaHyperlinkUtil;
+import org.eclipse.mylyn.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylyn.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Shawn Minto
+ * Detects bugzilla hyperlinks within source code
+ */
+public class BugzillaHyperLinkDetector extends AbstractHyperlinkDetector {
+
+ private TaskRepository repository;
+
+ public BugzillaHyperLinkDetector(TaskRepository repository) {
+ this.repository = repository;
+ }
+
+ @SuppressWarnings("unchecked")
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+
+ ITextEditor textEditor = getEditor();
+ if (region == null || textEditor == null || canShowMultipleHyperlinks || !(textEditor instanceof JavaEditor))
+ return null;
+
+ IEditorSite site = textEditor.getEditorSite();
+ if (site == null)
+ return null;
+
+ IJavaElement javaElement;
+ Object adapter = textEditor.getEditorInput().getAdapter(IJavaElement.class);
+ if (adapter instanceof IJavaElement) {
+ javaElement = (IJavaElement)adapter;
+ } else {
+ return null;
+ }
+
+ if (javaElement == null)
+ return null;
+
+ CompilationUnit ast = JavaPlugin.getDefault().getASTProvider().getAST(javaElement, ASTProvider.WAIT_NO, null);
+ if (ast == null)
+ return null;
+
+ ASTNode node = NodeFinder.perform(ast, region.getOffset(), 1);
+
+ if (node == null || !(node instanceof TextElement || node instanceof Block))
+ return null;
+
+ String comment = null;
+ int commentStart = -1;
+
+ if (node instanceof TextElement) {
+ TextElement element = (TextElement) node;
+ comment = element.getText();
+ commentStart = element.getStartPosition();
+ } else if (node instanceof Block) {
+ Comment c = findComment(ast.getCommentList(), region.getOffset(), 1);
+ if (c != null) {
+ try {
+ IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
+ String commentString = document.get(c.getStartPosition(), c.getLength());
+ comment = getStringFromComment(c, region.getOffset(), commentString);
+ commentStart = getLocationFromComment(c, comment, commentString) + c.getStartPosition();
+ } catch (BadLocationException e) {
+ MylarStatusHandler.log(e, "Failed to get text for comment");
+ }
+ }
+ }
+
+ if (comment == null)
+ return null;
+
+ int startOffset = region.getOffset();
+ int endOffset = startOffset + region.getLength();
+
+ return BugzillaHyperlinkUtil.findBugHyperlinks(repository.getUrl(), startOffset, endOffset, comment, commentStart);
+ }
+
+// private IHyperlink[] findBugHyperlinks(int startOffset, int endOffset, String comment, int commentStart) {
+//
+// Pattern p = Pattern.compile("^.*bug\\s+\\d+.*");
+// Matcher m = p.matcher(comment.toLowerCase().trim());
+// boolean b = m.matches();
+//
+// p = Pattern.compile("^.*bug#\\s+\\d+.*");
+// m = p.matcher(comment.toLowerCase().trim());
+// boolean b2 = m.matches();
+//
+// p = Pattern.compile("^.*bug\\s#\\d+.*");
+// m = p.matcher(comment.toLowerCase().trim());
+// boolean b3 = m.matches();
+//
+// p = Pattern.compile("^.*bug#\\d+.*");
+// m = p.matcher(comment.toLowerCase().trim());
+// boolean b4 = m.matches();
+//
+// // XXX walk forward from where we are
+// if (b || b2 || b3 || b4) {
+//
+// int start = comment.toLowerCase().indexOf("bug");
+// int ahead = 4;
+// if (b2 || b3 || b4) {
+// int pound = comment.toLowerCase().indexOf("#", start);
+// ahead = pound - start + 1;
+// }
+// String endComment = comment.substring(start + ahead, comment.length());
+// endComment = endComment.trim();
+// int endCommentStart = comment.indexOf(endComment);
+//
+// int end = comment.indexOf(" ", endCommentStart);
+// int end2 = comment.indexOf(":", endCommentStart);
+//
+// if ((end2 < end && end2 != -1) || (end == -1 && end2 != -1)) {
+// end = end2;
+// }
+//
+// if (end == -1)
+// end = comment.length();
+//
+// try {
+// int bugId = Integer.parseInt(comment.substring(endCommentStart, end).trim());
+//
+// start += commentStart;
+// end += commentStart;
+//
+// if (startOffset >= start && endOffset <= end) {
+// IRegion sregion = new Region(start, end - start);
+// return new IHyperlink[] { new BugzillaHyperLink(sregion, bugId) };
+// }
+// } catch (NumberFormatException e) {
+// return null;
+// }
+// }
+// return null;
+// }
+
+ private int getLocationFromComment(Comment c, String commentLine, String commentString) {
+ if (commentLine == null) {
+ return -1;
+ } else {
+ return commentString.indexOf(commentLine);
+ }
+ }
+
+ private String getStringFromComment(Comment comment, int desiredOffset, String commentString) {
+ String[] parts = commentString.split("\n");
+ if (parts.length > 1) {
+ int offset = comment.getStartPosition();
+ for (String part : parts) {
+ int newOffset = offset + part.length() + 1;
+ if (desiredOffset >= offset && desiredOffset <= newOffset) {
+ return part;
+ }
+
+ }
+ } else {
+ return commentString;
+ }
+
+ return null;
+ }
+
+ private Comment findComment(List<Comment> commentList, int offset, int i) {
+ for (Comment comment : commentList) {
+ if (comment.getStartPosition() <= offset
+ && (comment.getStartPosition() + comment.getLength() >= offset + i)) {
+ return comment;
+ }
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/BugzillaReportElement.java b/org.eclipse.mylyn/developer/src-old/BugzillaReportElement.java
new file mode 100644
index 0000000..0547e7a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/BugzillaReportElement.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasklist;
+
+/**
+ * Bugzilla XML element enum. Each enum has the attribute name
+ * and associated xml element tag name.
+ *
+ * @author Rob Elves
+ */
+public class BugzillaReportElement {
+ // Format: ENUM ( "pretty name", "xml key", <hidden: true/false>, <readonly: true/false>)
+ // Hidden elements are not automatically displayed in ui
+ public static final BugzillaReportElement ASSIGNED_TO = new BugzillaReportElement("Assigned to:", "assigned_to", false, true);
+ public static final BugzillaReportElement ATTACHID = new BugzillaReportElement("attachid", "attachid");
+ public static final BugzillaReportElement ATTACHMENT = new BugzillaReportElement("attachment", "attachment");
+ public static final BugzillaReportElement BLOCKED = new BugzillaReportElement("Bug blocks:", "blocked");
+ public static final BugzillaReportElement BUG = new BugzillaReportElement("bug","bug", true);
+ public static final BugzillaReportElement BUG_FILE_LOC = new BugzillaReportElement("URL:", "bug_file_loc", true);
+ public static final BugzillaReportElement BUG_ID = new BugzillaReportElement("Bug:", "bug_id", true);
+ public static final BugzillaReportElement BUG_SEVERITY = new BugzillaReportElement("Severity:", "bug_severity", false);
+ public static final BugzillaReportElement BUG_STATUS = new BugzillaReportElement("Status:", "bug_status", false, true);
+ public static final BugzillaReportElement BUG_WHEN = new BugzillaReportElement("bug_when", "bug_when", true, true);
+ public static final BugzillaReportElement BUGZILLA = new BugzillaReportElement("bugzilla", "bugzilla", true);
+ public static final BugzillaReportElement CC = new BugzillaReportElement("CC:", "cc", true, true);
+ public static final BugzillaReportElement CCLIST_ACCESSIBLE = new BugzillaReportElement("cclist_accessible", "cclist_accessible", true);
+ public static final BugzillaReportElement CLASSIFICATION = new BugzillaReportElement("Classification:", "classification", true);
+ public static final BugzillaReportElement CLASSIFICATION_ID = new BugzillaReportElement("Classification ID:", "classification_id", true);
+ public static final BugzillaReportElement COMPONENT = new BugzillaReportElement("Component:", "component", false);
+ public static final BugzillaReportElement CREATION_TS = new BugzillaReportElement("Creation date:", "creation_ts", true);
+ public static final BugzillaReportElement CTYPE = new BugzillaReportElement("Content Type", "ctype");
+ public static final BugzillaReportElement DATA = new BugzillaReportElement("data", "data");
+ public static final BugzillaReportElement DATE = new BugzillaReportElement("Date", "date");
+ public static final BugzillaReportElement DELTA_TS = new BugzillaReportElement("Last Modification", "delta_ts", true);
+ public static final BugzillaReportElement DEPENDSON = new BugzillaReportElement("Bug depends on:", "dependson");
+ public static final BugzillaReportElement DESC = new BugzillaReportElement("desc", "desc");
+ public static final BugzillaReportElement EVERCONFIRMED = new BugzillaReportElement("everconfirmed", "everconfirmed", true);
+ public static final BugzillaReportElement FILENAME = new BugzillaReportElement("filename", "filename");
+ public static final BugzillaReportElement IS_OBSOLETE = new BugzillaReportElement("Obsolete", "isobsolete", true);
+ public static final BugzillaReportElement KEYWORDS = new BugzillaReportElement("Keywords:", "keywords", true);
+ public static final BugzillaReportElement LONG_DESC = new BugzillaReportElement("Description:", "long_desc");
+ public static final BugzillaReportElement LONGDESCLENGTH = new BugzillaReportElement("Number of comments", "longdesclength", true);
+ public static final BugzillaReportElement NEWCC = new BugzillaReportElement("Add CC:", "newcc", true);
+ public static final BugzillaReportElement OP_SYS = new BugzillaReportElement("OS:", "op_sys", false);
+ public static final BugzillaReportElement PRIORITY = new BugzillaReportElement("Priority:", "priority", false);
+ public static final BugzillaReportElement PRODUCT = new BugzillaReportElement("Product:", "product", false);
+ public static final BugzillaReportElement REP_PLATFORM = new BugzillaReportElement("Platform:", "rep_platform", false);
+ public static final BugzillaReportElement REPORTER = new BugzillaReportElement("Reporter:", "reporter", false, true);
+ public static final BugzillaReportElement REPORTER_ACCESSIBLE = new BugzillaReportElement("reporter_accessible", "reporter_accessible", true);
+ public static final BugzillaReportElement RESOLUTION = new BugzillaReportElement("Resolution:", "resolution", false, true); // Exiting bug field, new cc
+ public static final BugzillaReportElement SHORT_DESC = new BugzillaReportElement("Summary:", "short_desc", true);
+ public static final BugzillaReportElement TARGET_MILESTONE = new BugzillaReportElement("Target milestone:", "target_milestone", false);
+ public static final BugzillaReportElement THETEXT = new BugzillaReportElement("thetext", "thetext");
+ public static final BugzillaReportElement TYPE = new BugzillaReportElement("type", "type");
+ public static final BugzillaReportElement UNKNOWN = new BugzillaReportElement("UNKNOWN", "UNKNOWN");
+ public static final BugzillaReportElement VERSION = new BugzillaReportElement("Version:", "version", false);
+ public static final BugzillaReportElement VOTES = new BugzillaReportElement("Votes:", "votes", false, true);
+ public static final BugzillaReportElement WHO = new BugzillaReportElement("who", "who");
+ public static final BugzillaReportElement QA_CONTACT= new BugzillaReportElement("QA Contact", "qa_contact", false, false);
+ public static final BugzillaReportElement ADDSELFCC = new BugzillaReportElement("Add self to CC", "addselfcc", true, false);
+ // Used by search engine
+ public static final BugzillaReportElement LI = new BugzillaReportElement("used by search engine", "li", true);
+ public static final BugzillaReportElement ID = new BugzillaReportElement("used by search engine", "id", true);
+ public static final BugzillaReportElement SHORT_SHORT_DESC = new BugzillaReportElement("used by search engine", "short_short_desc", false);
+ public static final BugzillaReportElement SEQ = new BugzillaReportElement("used by search engine", "seq", false);
+ public static final BugzillaReportElement RESULT = new BugzillaReportElement("used by search engine", "result", false);
+ public static final BugzillaReportElement RDF = new BugzillaReportElement("used by search engine", "rdf", false);
+ public static final BugzillaReportElement INSTALLATION = new BugzillaReportElement("used by search engine", "installation", false);
+ public static final BugzillaReportElement BUGS = new BugzillaReportElement("used by search engine", "bugs", false);
+
+ private final boolean isHidden;
+
+ private final boolean isReadOnly;
+
+ private final String keyString;
+
+ private final String prettyName;
+
+ BugzillaReportElement(String prettyName, String fieldName) {
+ this(prettyName, fieldName, false, false);
+ }
+
+ BugzillaReportElement(String prettyName, String fieldName, boolean hidden) {
+ this(prettyName, fieldName, hidden, false);
+ }
+
+ BugzillaReportElement(String prettyName, String fieldName, boolean hidden, boolean readonly) {
+ this.prettyName = prettyName;
+ this.keyString = fieldName;
+ this.isHidden = hidden;
+ this.isReadOnly = readonly;
+ }
+
+ public String getKeyString() {
+ return keyString;
+ }
+
+ public boolean isHidden() {
+ return isHidden;
+ }
+
+ public boolean isReadOnly() {
+ return isReadOnly;
+ }
+
+ public String toString() {
+ return prettyName;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/BugzillaTaskHandler.java b/org.eclipse.mylyn/developer/src-old/BugzillaTaskHandler.java
new file mode 100644
index 0000000..0f12706
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/BugzillaTaskHandler.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.tasklist;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.mylyn.internal.tasklist.ITaskHandler;
+import org.eclipse.mylyn.internal.tasklist.ui.ITaskListElement;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.CopyDescriptionAction;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.DeleteAction;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.GoIntoAction;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.OpenTaskInExternalBrowserAction;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.OpenTaskListElementAction;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.RemoveFromCategoryAction;
+import org.eclipse.mylyn.internal.tasklist.ui.actions.RenameAction;
+import org.eclipse.mylyn.tasklist.ITask;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ *
+ * TODO: refactor
+ */
+public class BugzillaTaskHandler implements ITaskHandler {
+
+ public boolean acceptsItem(ITaskListElement element) {
+ return element instanceof BugzillaTask || element instanceof BugzillaQueryHit
+ || element instanceof BugzillaQueryCategory;
+ }
+
+// public void taskClosed(ITask element, IWorkbenchPage page) {
+// try {
+// IEditorInput input = null;
+// if (element instanceof BugzillaTask) {
+// input = new BugzillaTaskEditorInput((BugzillaTask) element, true);
+// }
+// IEditorPart editor = page.findEditor(input);
+//
+// if (editor != null) {
+// page.closeEditor(editor, false);
+// }
+// } catch (Exception e) {
+// MylarStatusHandler.log(e, "Error while trying to close a bugzilla task");
+// }
+// }
+
+ public boolean enableAction(Action action, ITaskListElement element) {
+
+ if (element instanceof BugzillaQueryHit) {
+ BugzillaQueryHit hit = (BugzillaQueryHit) element;
+ if (hit.getCorrespondingTask() != null && hit.getCorrespondingTask().hasValidUrl()) {
+ return true;
+ }
+ return false;
+ } else if (element instanceof BugzillaTask) {
+ if (action instanceof OpenTaskInExternalBrowserAction) {
+ if (((ITask) element).hasValidUrl()) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if (action instanceof DeleteAction || action instanceof CopyDescriptionAction
+ || action instanceof OpenTaskListElementAction || action instanceof RemoveFromCategoryAction) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if (element instanceof BugzillaQueryCategory) {
+ if (action instanceof DeleteAction || action instanceof CopyDescriptionAction
+ || action instanceof OpenTaskListElementAction || action instanceof RenameAction) {
+ return true;
+ } else if (action instanceof GoIntoAction) {
+ BugzillaQueryCategory cat = (BugzillaQueryCategory) element;
+ if (cat.getHits().size() > 0) {
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+}
+
+//public void itemOpened(ITaskListElement element) {
+//
+// boolean offline = MylarTaskListPlugin.getPrefs().getBoolean(TaskListPreferenceConstants.WORK_OFFLINE);
+//
+// if (element instanceof BugzillaTask) {
+// BugzillaTask bugzillaTask = (BugzillaTask) element;
+// TaskListUiUtil.openEditor(bugzillaTask);
+// MylarTaskListPlugin.ReportOpenMode mode = MylarTaskListPlugin.getDefault().getReportMode();
+// if (mode == MylarTaskListPlugin.ReportOpenMode.EDITOR) {
+// bugzillaTask.openTaskInEditor(offline);
+// } else if (mode == MylarTaskListPlugin.ReportOpenMode.INTERNAL_BROWSER) {
+// if (offline) {
+// MessageDialog.openInformation(null, "Unable to open bug",
+// "Unable to open the selected bugzilla task since you are currently offline");
+// return;
+// }
+// String title = "Bug #" + TaskRepositoryManager.getTaskIdAsInt(bugzillaTask.getHandleIdentifier());
+// TaskListUiUtil.openUrl(title, title, bugzillaTask.getUrl());
+// } else {
+// // not supported
+// }
+// } else if (element instanceof BugzillaCustomQueryCategory) {
+// BugzillaCustomQueryCategory queryCategory = (BugzillaCustomQueryCategory) element;
+// BugzillaCustomQueryDialog sqd = new BugzillaCustomQueryDialog(Display.getCurrent().getActiveShell(),
+// queryCategory.getQueryUrl(), queryCategory.getDescription(), queryCategory.getMaxHits() + "");
+// if (sqd.open() == Dialog.OK) {
+// queryCategory.setDescription(sqd.getName());
+// queryCategory.setQueryUrl(sqd.getUrl());
+// int maxHits = -1;
+// try {
+// maxHits = Integer.parseInt(sqd.getMaxHits());
+// } catch (Exception e) {
+// }
+// queryCategory.setMaxHits(maxHits);
+//
+// new SynchronizeReportsAction(queryCategory).run();
+// }
+// } else if (element instanceof BugzillaQueryCategory) {
+// BugzillaQueryCategory queryCategory = (BugzillaQueryCategory) element;
+// BugzillaQueryDialog queryDialog = new BugzillaQueryDialog(Display.getCurrent().getActiveShell(),
+// queryCategory.getRepositoryUrl(), queryCategory.getQueryUrl(), queryCategory.getDescription(),
+// queryCategory.getMaxHits() + "");
+// if (queryDialog.open() == Dialog.OK) {
+// queryCategory.setDescription(queryDialog.getName());
+// queryCategory.setQueryUrl(queryDialog.getUrl());
+// queryCategory.setRepositoryUrl(queryDialog.getRepository().getUrl().toExternalForm());
+// int maxHits = -1;
+// try {
+// maxHits = Integer.parseInt(queryDialog.getMaxHits());
+// } catch (Exception e) {
+// }
+// queryCategory.setMaxHits(maxHits);
+//
+// new SynchronizeReportsAction(queryCategory).run();
+// }
+// } else if (element instanceof BugzillaQueryHit) {
+// BugzillaQueryHit hit = (BugzillaQueryHit) element;
+// MylarTaskListPlugin.ReportOpenMode mode = MylarTaskListPlugin.getDefault().getReportMode();
+// if (mode == MylarTaskListPlugin.ReportOpenMode.EDITOR) {
+// if (hit.getCorrespondingTask() != null) {
+// hit.getCorrespondingTask().openTaskInEditor(offline);
+// } else {
+// if (offline) {
+// MessageDialog.openInformation(null, "Unable to open bug",
+// "Unable to open the selected bugzilla report since you are currently offline");
+// return;
+// }
+// BugzillaOpenStructure open = new BugzillaOpenStructure(((BugzillaQueryHit) element)
+// .getRepositoryUrl(), ((BugzillaQueryHit) element).getId(), -1);
+// List<BugzillaOpenStructure> selectedBugs = new ArrayList<BugzillaOpenStructure>();
+// selectedBugs.add(open);
+// ViewBugzillaAction viewBugs = new ViewBugzillaAction("Display bugs in editor", selectedBugs);
+// viewBugs.schedule();
+// }
+// }
+// else if (mode == MylarTaskListPlugin.ReportOpenMode.INTERNAL_BROWSER) {
+// if (offline) {
+// MessageDialog.openInformation(null, "Unable to open bug",
+// "Unable to open the selected bugzilla report since you are currently offline");
+// return;
+// }
+// String title = "Bug #" + TaskRepositoryManager.getTaskIdAsInt(hit.getHandleIdentifier());
+// TaskListUiUtil.openUrl(title, title, hit.getBugUrl());
+// } else {
+// // not supported
+// }
+// }
+// }
+
+// public ITask getCorrespondingTask(IQueryHit queryHit) {
+// if (queryHit instanceof BugzillaQueryHit) {
+// BugzillaQueryHit hit = (BugzillaQueryHit) queryHit;
+// return hit.getOrCreateCorrespondingTask();
+// } else {
+// return null;
+// }
+// }
+
+// public void itemRemoved(ITaskListElement element, ITaskCategory category) {
+// if (element instanceof BugzillaTask) {
+// BugzillaTask task = (BugzillaTask) element;
+// if (category instanceof TaskCategory) {
+// MylarTaskListPlugin.getTaskListManager().removeFromCategoryAndRoot((TaskCategory)
+// category, task);
+// // category.removeTask(task);
+// } else {
+// String message = MESSAGE_CONFIRM_DELETE;
+// boolean deleteConfirmed =
+// MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+// .getShell(), "Confirm delete", message);
+// if (!deleteConfirmed)
+// return;
+// MylarTaskListPlugin.getTaskListManager().deleteTask(task);
+// }
+// }
+// }
+
+// private static final String MESSAGE_CONFIRM_DELETE = "Remove this report from
+// the task list, and discard any task context or local notes?";
+
+// public boolean deleteElement(ITaskListElement element) {
+// if (element instanceof BugzillaQueryCategory) {
+// boolean deleteConfirmed =
+// MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+// .getShell(), "Confirm delete", "Delete the selected query and all contained
+// tasks?");
+// if (!deleteConfirmed)
+// return false;
+// BugzillaQueryCategory query = (BugzillaQueryCategory) element;
+// MylarTaskListPlugin.getTaskListManager().deleteQuery(query);
+// } else if (element instanceof BugzillaTask) {
+// BugzillaTask task = (BugzillaTask) element;
+// if (task.isActive()) {
+// MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+// "Delete failed",
+// "Task must be deactivated in order to delete.");
+// return false;
+// }
+//
+// // String message = task.getDeleteConfirmationMessage();
+// boolean deleteConfirmed =
+// MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+// .getShell(), "Confirm delete", MESSAGE_CONFIRM_DELETE);
+// if (!deleteConfirmed)
+// return false;
+//
+// // task.removeReport();
+// MylarTaskListPlugin.getTaskListManager().deleteTask(task);
+// ContextCorePlugin.getContextManager().contextDeleted(task.getHandleIdentifier());
+// IWorkbenchPage page =
+// MylarTaskListPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
+// .getActivePage();
+//
+// // if we couldn't get the page, get out of here
+// if (page == null)
+// return true;
+// try {
+// TaskListView.getDefault().closeTaskEditors(task, page);
+// } catch (Exception e) {
+// MylarStatusHandler.log(e, " deletion failed");
+// }
+// }
+// TaskListView.getDefault().getViewer().refresh();
+// return true;
+// }
+
+// public void dropItem(ITaskListElement element, TaskCategory cat) {
+// if (element instanceof BugzillaQueryHit) {
+// BugzillaQueryHit bugzillaHit = (BugzillaQueryHit) element;
+// if (bugzillaHit.getAssociatedTask() != null) {
+// MylarTaskListPlugin.getTaskListManager().moveToCategory(cat,
+// bugzillaHit.getAssociatedTask());
+// } else {
+// BugzillaTask bugzillaTask = new BugzillaTask(bugzillaHit, true);
+// bugzillaHit.setAssociatedTask(bugzillaTask);
+// MylarTaskListPlugin.getTaskListManager().moveToCategory(cat,
+// bugzillaTask);
+// BugzillaUiPlugin.getDefault().getBugzillaTaskListManager().addToBugzillaTaskRegistry(bugzillaTask);
+// }
+// }
+// }
diff --git a/org.eclipse.mylyn/developer/src-old/BugzillaTaskListManager.java b/org.eclipse.mylyn/developer/src-old/BugzillaTaskListManager.java
new file mode 100644
index 0000000..c47474f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/BugzillaTaskListManager.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.tasklist;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.mylyn.bugzilla.core.IBugzillaBug;
+import org.eclipse.mylyn.internal.bugzilla.core.IOfflineBugListener;
+import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTask.BugReportSyncState;
+import org.eclipse.mylyn.internal.tasklist.TaskCategory;
+import org.eclipse.mylyn.internal.tasklist.TaskRepositoryManager;
+import org.eclipse.mylyn.internal.tasklist.ui.views.TaskListView;
+import org.eclipse.mylyn.tasklist.ITask;
+import org.eclipse.mylyn.tasklist.MylarTaskListPlugin;
+
+/**
+ * @author Mik Kersten and Ken Sueda
+ */
+public class BugzillaTaskListManager { //implements IOfflineBugListener {
+
+// private Map<String, BugzillaTask> bugzillaTaskArchive = new HashMap<String, BugzillaTask>();
+//
+// private TaskCategory cat = null;
+//
+// public void addToBugzillaTaskArchive(BugzillaTask task) {
+// if (bugzillaTaskArchive.get(task.getHandleIdentifier()) == null) {
+// bugzillaTaskArchive.put(task.getHandleIdentifier(), task);
+// if (cat != null) {
+// cat.internalAddTask(task);
+// }
+// }
+// }
+//
+// public BugzillaTask getFromBugzillaTaskRegistry(String handle) {
+// return bugzillaTaskArchive.get(handle);
+// }
+//
+// public Map<String, BugzillaTask> getBugzillaTaskRegistry() {
+// return bugzillaTaskArchive;
+// }
+//
+// public void setTaskRegistyCategory(TaskCategory cat) {
+// this.cat = cat;
+// }
+//
+// public void offlineStatusChange(IBugzillaBug bug, BugzillaOfflineStaus status) {
+// BugReportSyncState state = null;
+// if (status == BugzillaOfflineStaus.SAVED_WITH_OUTGOING_CHANGES) {
+// state = BugReportSyncState.OUTGOING;
+// } else if (status == BugzillaOfflineStaus.SAVED) {
+// state = BugReportSyncState.OK;
+// } else if (status == BugzillaOfflineStaus.SAVED_WITH_INCOMMING_CHANGES) {
+// state = BugReportSyncState.INCOMMING;
+// } else if (status == BugzillaOfflineStaus.CONFLICT) {
+// state = BugReportSyncState.CONFLICT;
+// }
+// if (state == null) {
+// // this means that we got a status that we didn't understand
+// return;
+// }
+//
+// String handle = TaskRepositoryManager.getHandle(bug.getRepository(), bug.getId());
+// ITask task = MylarTaskListPlugin.getTaskListManager().getTaskForHandle(handle, true);
+// if (task != null && task instanceof BugzillaTask) {
+// BugzillaTask bugTask = (BugzillaTask) task;
+// bugTask.setSyncState(state);
+// if (TaskListView.getDefault() != null && TaskListView.getDefault().getViewer() != null
+// && !TaskListView.getDefault().getViewer().getControl().isDisposed()) {
+// TaskListView.getDefault().getViewer().refresh();
+// }
+// }
+// }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/ChartTest.java b/org.eclipse.mylyn/developer/src-old/ChartTest.java
new file mode 100644
index 0000000..3a09dd2
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/ChartTest.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 12, 2004
+ */
+package org.eclipse.mylyn.tests.chart;
+
+import javax.swing.JFrame;
+
+import org.jfree.chart.*;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.CategoryDataset;
+import org.jfree.data.DatasetUtilities;
+
+public class ChartTest extends JFrame {
+
+ private static final long serialVersionUID = 3256720663090640433L;
+
+ public static void main(final String[] args) {
+ final ChartTest demo = new ChartTest("Mylar Test");
+ demo.pack();
+ demo.setTitle("chart test");
+ demo.setVisible(true);
+ }
+
+ public ChartTest(final String title) {
+ final CategoryDataset dataset = createCategoryDataset();
+ final JFreeChart chart = createChart(dataset);
+ final ChartPanel chartPanel = new ChartPanel(chart);
+ chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
+ super.setContentPane(chartPanel);
+ }
+
+ private JFreeChart createChart(final CategoryDataset dataset) {
+
+ final JFreeChart chart = ChartFactory.createStackedBarChart(
+ "", // chart title
+ "Eclipse Usage", // domain axis label
+ "Time (minutes)", // range axis label
+ dataset, // data
+ PlotOrientation.VERTICAL, // the plot orientation
+ true, // legend
+ true, // tooltips
+ false // urls
+ );
+ return chart;
+ }
+
+ public static CategoryDataset createCategoryDataset() {
+
+ final double[][] data = new double[][]
+ {{10.0, 4.0, 15.0, 14.0, 0, 0, 0},
+ {5.0, 7.0, 14.0, 3.0, 0, 0, 0},
+ {6.0, 17.0, 12.0, 7.0, 0, 0, 0}};
+
+ String[] measurements = { "navigating", "editing", "other" };
+ String[] days = { "mon", "tue", "wed", "thu", "fri", "sat", "sun" };
+
+ return DatasetUtilities.createCategoryDataset(measurements, days, data);
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/CommitContextAction.java b/org.eclipse.mylyn/developer/src-old/CommitContextAction.java
new file mode 100644
index 0000000..9713ea4
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/CommitContextAction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.team.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.mylyn.context.core.MylarStatusHandler;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.internal.team.TeamRespositoriesManager;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.team.MylarTeamPlugin;
+import org.eclipse.mylyn.team.AbstractTeamRepositoryProvider;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class CommitContextAction implements IViewActionDelegate {
+
+ public void init(IViewPart view) {
+ // TODO Auto-generated method stub
+ }
+
+ public void run(IAction action) {
+ ITask task = TaskListView.getFromActivePerspective().getSelectedTask();
+ IResource[] resources = MylarTeamPlugin.getDefault().getChangeSetManager().getResources(task);
+ if (resources == null || resources.length == 0) {
+ MessageDialog.openInformation(null, "Mylar Information",
+ "There are no interesting resources in the corresponding change set.\nRefer to Synchronize view.");
+ return;
+ }
+
+ List<AbstractTeamRepositoryProvider> providers = TeamRespositoriesManager.getInstance().getProviders();
+ for (Object element : providers) {
+ try {
+ AbstractTeamRepositoryProvider provider = (AbstractTeamRepositoryProvider) element;
+ if (provider.hasOutgoingChanges(resources)) {
+ provider.commit(resources);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Could not commit context.", false);
+ }
+ }
+
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/DoiDecoratingTableLabelProvider.java b/org.eclipse.mylyn/developer/src-old/DoiDecoratingTableLabelProvider.java
new file mode 100644
index 0000000..fcd88eb
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/DoiDecoratingTableLabelProvider.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 26, 2004
+ */
+package org.eclipse.mylyn.ui.views.support;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.swt.graphics.*;
+
+import org.eclipse.mylyn.model.*;
+import org.eclipse.mylyn.ui.UiUtil;
+
+/**
+ * @author Mik Kersten
+ * @deprecated
+ */
+public class DoiDecoratingTableLabelProvider extends JavaUILabelProvider
+ implements ITableLabelProvider, IFontProvider {
+
+ public String getColumnText(Object object, int index) {
+ if (object instanceof TaskscapeNode) {
+ TaskscapeNode node = (TaskscapeNode)object;
+ if (node.getKind().equals(ITaskscapeNode.Kind.Java)) {
+ IJavaElement element = JavaCore.create(node.getElementHandle());
+ if (element != null) {
+ String label = element.getElementName();
+ return label + " (" + node.getDegreeOfInterest().getDegreeOfInterest().getDoiValue() + ")";
+ } else {
+ return "<missing element>";
+ }
+ } else {
+ return node.getElementHandle();
+ }
+ } else if (object instanceof TaskscapeEdge){
+ TaskscapeEdge edge = (TaskscapeEdge)object;
+ return edge.toString();
+ }
+ return "? " + object;
+ }
+
+ public Image getColumnImage(Object object, int index) {
+ if (object instanceof TaskscapeNode) {
+ TaskscapeNode node = (TaskscapeNode)object;
+ if (node.getKind().equals(ITaskscapeNode.Kind.Java)) {
+ IJavaElement javaElement = JavaCore.create(node.getElementHandle());
+ return getImage(javaElement);
+ }
+ }
+ return null;
+ }
+
+ public Color getBackground(Object element) {
+// if (element instanceof IJavaElement) {
+// return UiUtil.getBackgroundForElement((IJavaElement)element);
+// } else {
+ return null;
+// }
+ }
+
+ public Color getForeground(Object element) {
+// if (element instanceof IJavaElement) {
+// return UiUtil.getForegroundForElement((IJavaElement)element);
+// } else {
+ return null;
+// }
+ }
+
+ public Font getFont(Object object) {
+ if (object instanceof IJavaElement) {
+ return UiUtil.getFontForElement((IJavaElement)object);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/EditorListener.java b/org.eclipse.mylyn/developer/src-old/EditorListener.java
new file mode 100644
index 0000000..10eab69
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/EditorListener.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jun 24, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.mylyn.monitor;
+
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author beatmik
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class EditorListener implements IPartListener {
+
+ public void partOpened(IWorkbenchPart part) {
+
+ }
+
+ public void partDeactivated(IWorkbenchPart part) {
+ }
+
+ public void partClosed(IWorkbenchPart part) {
+
+ }
+
+ public void partActivated(IWorkbenchPart part) {
+
+ }
+
+ public void partBroughtToTop(IWorkbenchPart part) {
+
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/EditorPageListener.java b/org.eclipse.mylyn/developer/src-old/EditorPageListener.java
new file mode 100644
index 0000000..49e8679
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/EditorPageListener.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jun 24, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.mylyn.monitor;
+
+import org.eclipse.ui.IPageListener;
+import org.eclipse.ui.IWorkbenchPage;
+
+/**
+ * @author Mik Kersten
+ */
+public class EditorPageListener implements IPageListener {
+
+ public EditorPageListener() {
+ super();
+ }
+
+ public void pageActivated(IWorkbenchPage page) {
+
+ }
+
+ public void pageClosed(IWorkbenchPage page) {
+
+ }
+
+ public void pageOpened(IWorkbenchPage page) {
+
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/ExplorerFilteredTree.java b/org.eclipse.mylyn/developer/src-old/ExplorerFilteredTree.java
new file mode 100644
index 0000000..e8a200e
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/ExplorerFilteredTree.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.browser.views;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.tasks.ui.views.AbstractMylarFilteredTree;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.dialogs.PatternFilter;
+
+/**
+ * @author Mik Kersten
+ */
+public class ExplorerFilteredTree extends AbstractMylarFilteredTree {
+
+ private InterestFilter suppressedFilter = null;
+
+ public ExplorerFilteredTree(String viewId, Composite parent, int treeStyle, PatternFilter filter) {
+ super(parent, treeStyle, filter);
+// this.viewId = viewId;
+ }
+
+ /**
+ * Create the tree. Subclasses may override.
+ *
+ * @param parent parent <code>Composite</code>
+ * @param style SWT style bits used to create the tree
+ * @return the tree
+ */
+ protected Control createTreeControl(Composite parent, int style) {
+// treeViewer = new ResourceTreeViewer(viewId, parent, style);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ treeViewer.getControl().setLayoutData(data);
+ treeViewer.getControl().addDisposeListener(new DisposeListener(){
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+ */
+ public void widgetDisposed(DisposeEvent e) {
+ Job refreshJob = getRefreshJob();
+ if (refreshJob != null) {
+ getRefreshJob().cancel();
+ }
+ }
+ });
+
+ treeViewer.addFilter(getPatternFilter());
+ return treeViewer.getControl();
+ }
+
+ @Override
+ protected Composite createStatusComposite(Composite container) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/FilteringNavigatorView.java b/org.eclipse.mylyn/developer/src-old/FilteringNavigatorView.java
new file mode 100644
index 0000000..dbfbff7
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/FilteringNavigatorView.java
@@ -0,0 +1,44 @@
+package org.eclipse.mylyn.internal.browser.views;
+///*******************************************************************************
+// * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+// * University Of British Columbia - initial API and implementation
+// *******************************************************************************/
+//
+//package org.eclipse.mylyn.internal.browser.views;
+//
+//import org.eclipse.jface.viewers.TreeViewer;
+//import org.eclipse.mylyn.internal.tasks.ui.TaskListPatternFilter;
+//import org.eclipse.swt.SWT;
+//import org.eclipse.swt.widgets.Composite;
+//import org.eclipse.ui.dialogs.FilteredTree;
+//import org.eclipse.ui.views.navigator.ResourceNavigator;
+//
+///**
+// * @author Mik Kersten
+// */
+//public class ExplorerView extends ResourceNavigator {
+//
+// public static final String ID = "org.eclipse.mylyn.explorer.ui.explorer";
+//
+// protected TreeViewer createViewer(Composite parent) {
+// FilteredTree filteredTree = new ExplorerFilteredTree(ID, parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL,
+// new TaskListPatternFilter());
+//
+// TreeViewer viewer = filteredTree.getViewer();
+//
+// // NOTE: below from super
+// viewer.setUseHashlookup(true);
+// initContentProvider(viewer);
+// initLabelProvider(viewer);
+// initFilters(viewer);
+// initListeners(viewer);
+//
+// return viewer;
+// }
+//}
diff --git a/org.eclipse.mylyn/developer/src-old/FluidPrototyping.java b/org.eclipse.mylyn/developer/src-old/FluidPrototyping.java
new file mode 100644
index 0000000..920b7cc
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/FluidPrototyping.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 31, 2005
+ */
+
+/**
+ * @author Mik Kersten
+ */
+public class Foo {
+
+ int y = 0;
+
+ public void setY(int y) {
+ this.y = y;
+ Display.update();
+ }
+
+ public void setX(int x) { }
+
+ public void setP1(<field> p) { }
+
+ public void setP2(<field> p) { }
+
+}
+
+class <field> { }
+
+class Display { static void update() {} }
+
+class Point { }
+
+class Line { }
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/IMapListener.java b/org.eclipse.mylyn/developer/src-old/IMapListener.java
new file mode 100644
index 0000000..b742277
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/IMapListener.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 8, 2004
+ */
+package org.eclipse.mylyn.monitor;
+
+/**
+ * @author Mik Kersten
+ */
+public interface IMapListener {
+
+ public void mapUpdated();
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/Interest.java b/org.eclipse.mylyn/developer/src-old/Interest.java
new file mode 100644
index 0000000..4c165bf
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/Interest.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jun 23, 2004
+ */
+package org.eclipse.mylyn.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Mik Kersten
+ */
+public class Interest implements Serializable {
+
+ private float value = 10;
+
+ public float getValue() {
+ return value;
+ }
+
+ public void setValue(float value) {
+ this.value = value;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/JavaStackTraceHyperlinkAdapter.java b/org.eclipse.mylyn/developer/src-old/JavaStackTraceHyperlinkAdapter.java
new file mode 100644
index 0000000..0a1b068
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/JavaStackTraceHyperlinkAdapter.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.ui;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
+import org.eclipse.jdt.internal.debug.ui.actions.OpenTypeAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Robert Elves
+ */
+public final class JavaStackTraceHyperlinkAdapter extends HyperlinkAdapter {
+ public void linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent e) {
+ String typeName;
+ int lineNumber;
+ try {
+ String linkText = (String) e.getHref();
+ typeName = getTypeName(linkText);
+ lineNumber = getLineNumber(linkText);
+
+ // documents start at 0
+ if (lineNumber > 0) {
+ lineNumber--;
+ }
+ Object sourceElement = getSourceElement(typeName);
+ if (sourceElement != null) {
+ IDebugModelPresentation presentation = JDIDebugUIPlugin.getDefault()
+ .getModelPresentation();
+ IEditorInput editorInput = presentation.getEditorInput(sourceElement);
+ if (editorInput != null) {
+ String editorId = presentation.getEditorId(editorInput, sourceElement);
+ if (editorId != null) {
+ IEditorPart editorPart = JDIDebugUIPlugin.getActivePage().openEditor(
+ editorInput, editorId);
+ if (editorPart instanceof ITextEditor && lineNumber >= 0) {
+ ITextEditor textEditor = (ITextEditor) editorPart;
+ IDocumentProvider provider = textEditor.getDocumentProvider();
+ provider.connect(editorInput);
+ IDocument document = provider.getDocument(editorInput);
+ try {
+ IRegion line = document.getLineInformation(lineNumber);
+ textEditor.selectAndReveal(line.getOffset(), line.getLength());
+ } catch (BadLocationException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Open Type", "Failed to open type.");
+ }
+ provider.disconnect(editorInput);
+ }
+ return;
+ }
+ }
+ }
+ // did not find source
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Open Type",
+ "Type could not be located.");
+ } catch (CoreException e1) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Open Type",
+ "Failed to open type.");
+ return;
+ }
+ }
+
+ // adapted from JavaStackTraceHyperlink
+ private Object getSourceElement(String typeName) throws CoreException {
+ Object result = null;
+ result = OpenTypeAction.findTypeInWorkspace(typeName);
+ // }
+ return result;
+ }
+
+ // adapted from JavaStackTraceHyperlink
+ private String getTypeName(String linkText) {
+ int start = linkText.indexOf('(');
+ int end = linkText.indexOf(':');
+ if (start >= 0 && end > start) {
+
+ // get File name (w/o .java)
+ String typeName = linkText.substring(start + 1, end);
+ typeName.indexOf(".");
+ typeName = typeName.substring(0, typeName.indexOf("."));
+
+ String qualifier = linkText.substring(0, start);
+ // remove the method name
+ start = qualifier.lastIndexOf('.');
+
+ if (start >= 0) {
+ // remove the class name
+ start = new String((String) qualifier.subSequence(0, start)).lastIndexOf('.');
+ if (start == -1) {
+ start = 0; // default package
+ }
+ }
+
+ if (start >= 0) {
+ qualifier = qualifier.substring(0, start);
+ }
+
+ if (qualifier.length() > 0) {
+ typeName = qualifier + "." + typeName; //$NON-NLS-1$
+ }
+ return typeName;
+ }
+
+ return "error"; // TODO: Complain
+ }
+
+ // adapted from JavaStackTraceHyperlink
+ private int getLineNumber(String linkText) throws CoreException {
+ int index = linkText.lastIndexOf(':');
+ if (index >= 0) {
+ String numText = linkText.substring(index + 1);
+ index = numText.indexOf(')');
+ if (index >= 0) {
+ numText = numText.substring(0, index);
+ }
+ try {
+ return Integer.parseInt(numText);
+ } catch (NumberFormatException e) {
+ throw new CoreException(null);
+ }
+ }
+
+ throw new CoreException(null);
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/MylarJavaElementDescriptor.java b/org.eclipse.mylyn/developer/src-old/MylarJavaElementDescriptor.java
new file mode 100644
index 0000000..8965565
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/MylarJavaElementDescriptor.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.java.ui.editor;
+
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+
+/**
+ * @author Shawn Minto
+ */
+public class MylarJavaElementDescriptor extends CompositeImageDescriptor {
+
+ private Image baseImage;
+
+ private ImageDescriptor overlay;
+
+ private Point fSize;
+
+ public MylarJavaElementDescriptor(Image baseImage, ImageDescriptor overlay, Point size) {
+ this.baseImage = baseImage;
+ this.overlay = overlay;
+ setImageSize(size);
+ }
+
+ @Override
+ protected void drawCompositeImage(int width, int height) {
+ if (baseImage == null)
+ return;
+ ImageData bg = baseImage.getImageData();
+
+ drawImage(bg, 0, 0);
+
+ // Point size= getSize();
+ ImageData data = getImageData(overlay);
+ drawImage(data, data.width, bg.height - data.height);
+ }
+
+ private ImageData getImageData(ImageDescriptor descriptor) {
+ ImageData data = descriptor.getImageData(); // see bug 51965:
+ // getImageData can return
+ // null
+ if (data == null) {
+ data = DEFAULT_IMAGE_DATA;
+ JavaPlugin.logErrorMessage("Image data not available: " + descriptor.toString()); //$NON-NLS-1$
+ }
+ return data;
+ }
+
+ /**
+ * Sets the size of the image created by calling <code>createImage()</code>.
+ *
+ * @param size
+ * the size of the image returned from calling
+ * <code>createImage()</code>
+ * @see ImageDescriptor#createImage()
+ */
+ public void setImageSize(Point size) {
+ Assert.isNotNull(size);
+ Assert.isTrue(size.x >= 0 && size.y >= 0);
+ fSize = size;
+ }
+
+ @Override
+ protected Point getSize() {
+ return new Point(fSize.x, fSize.y);
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/NewLocalTaskAction.java b/org.eclipse.mylyn/developer/src-old/NewLocalTaskAction.java
new file mode 100644
index 0000000..de71565
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/NewLocalTaskAction.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskInputDialog;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.Task;
+import org.eclipse.mylyn.tasks.core.TaskCategory;
+import org.eclipse.mylyn.tasks.ui.TaskListManager;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+/**
+ * @author Mik Kersten
+ */
+ at Deprecated
+public class NewLocalTaskAction extends Action implements IViewActionDelegate {
+
+ public static final String ID = "org.eclipse.mylyn.tasks.ui.actions.create.task";
+
+ public NewLocalTaskAction() {
+ this(null);
+ }
+
+ public NewLocalTaskAction(TaskListView view) {
+ setText(TaskInputDialog.LABEL_SHELL);
+ setToolTipText(TaskInputDialog.LABEL_SHELL);
+ setId(ID);
+ setImageDescriptor(TasksUiImages.TASK_NEW);
+ }
+
+ public void init(IViewPart view) {
+ }
+
+ public void run(IAction action) {
+ run();
+ }
+
+ @Override
+ public void run() {
+ Task newTask = new Task(TasksUiPlugin.getTaskListManager().genUniqueTaskHandle(), LocalRepositoryConnector.DEFAULT_SUMMARY);
+ TaskListManager.scheduleNewTask(newTask);
+
+ Object selectedObject = null;
+ TaskListView view = TaskListView.getFromActivePerspective();
+ if (view != null) {
+ selectedObject = ((IStructuredSelection) view.getViewer().getSelection()).getFirstElement();
+ }
+ if (selectedObject instanceof TaskCategory) {
+ TasksUiPlugin.getTaskList().addTask(newTask, (TaskCategory) selectedObject);
+ } else if (selectedObject instanceof ITask) {
+ ITask task = (ITask) selectedObject;
+ if (task.getContainer() instanceof TaskCategory) {
+ TasksUiPlugin.getTaskList().addTask(newTask, task.getContainer());
+ } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) {
+ TasksUiPlugin.getTaskList().addTask(newTask,
+ view.getDrilledIntoCategory());
+ } else {
+ TasksUiPlugin.getTaskList().addTask(newTask,
+ TasksUiPlugin.getTaskList().getUncategorizedCategory());
+ }
+ } else if (view != null && view.getDrilledIntoCategory() instanceof TaskCategory) {
+ TasksUiPlugin.getTaskList().addTask(newTask,
+ view.getDrilledIntoCategory());
+ } else {
+ if (view != null && view.getDrilledIntoCategory() != null) {
+ MessageDialog
+ .openInformation(Display.getCurrent().getActiveShell(), ITasksUiConstants.TITLE_DIALOG,
+ "The new task has been added to the root of the list, since tasks can not be added to a query.");
+ }
+ TasksUiPlugin.getTaskList().addTask(newTask,
+ TasksUiPlugin.getTaskList().getUncategorizedCategory());
+ }
+
+ TasksUiUtil.openEditor(newTask, true);
+
+ // if (view != null) {
+ // view.getViewer().refresh();
+ // view.setInRenameAction(true);
+ // view.getViewer().editElement(newTask, 4);
+ // view.setInRenameAction(false);
+ // }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/PackageExplorerManager.java b/org.eclipse.mylyn/developer/src-old/PackageExplorerManager.java
new file mode 100644
index 0000000..90caa1d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/PackageExplorerManager.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.java;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.mylyn.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.context.core.IMylarContext;
+import org.eclipse.mylyn.context.core.IMylarContextListener;
+import org.eclipse.mylyn.context.core.IMylarElement;
+import org.eclipse.mylyn.context.core.MylarStatusHandler;
+import org.eclipse.mylyn.internal.context.ui.actions.AbstractFocusViewAction;
+import org.eclipse.mylyn.internal.java.ui.JavaDeclarationsFilter;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Sets member selections on the Package Explorer when appropriate, and manages
+ * tree expansion state.
+ *
+ * @author Mik Kersten
+ */
+public class PackageExplorerManager implements IMylarContextListener, ISelectionListener {
+
+ public void selectionChanged(IWorkbenchPart part, ISelection changedSelection) {
+ if (!(part instanceof PackageExplorerPart)) {
+ return;
+ }
+ AbstractFocusViewAction applyAction = AbstractFocusViewAction.getActionForPart((PackageExplorerPart)part);
+ if (!ContextCorePlugin.getContextManager().isContextActive()
+ || (applyAction != null && !applyAction.isChecked())) {
+ return;
+ }
+ try {
+ Object elementToSelect = null;
+ if (changedSelection instanceof TextSelection && part instanceof JavaEditor) {
+ TextSelection textSelection = (TextSelection) changedSelection;
+ IJavaElement javaElement = SelectionConverter.resolveEnclosingElement((JavaEditor) part, textSelection);
+ if (javaElement != null)
+ elementToSelect = javaElement;
+ } else if (changedSelection instanceof TextSelection) {
+// if (part instanceof EditorPart) {
+// elementToSelect = ((EditorPart) part).getEditorInput().getAdapter(IResource.class);
+// }
+ } else {
+ return;
+ }
+
+ if (elementToSelect != null) {
+ PackageExplorerPart packageExplorer = PackageExplorerPart.getFromActivePerspective();
+ if (packageExplorer != null) {
+ TreeViewer viewer = packageExplorer.getTreeViewer();
+ StructuredSelection currentSelection = (StructuredSelection)viewer.getSelection();
+ if (currentSelection.size() <= 1) {
+ boolean membersFilteredMode = false;
+ for (ViewerFilter filter : Arrays.asList(viewer.getFilters())) {
+ if (filter instanceof JavaDeclarationsFilter)
+ membersFilteredMode = true;
+ }
+ if (membersFilteredMode) {
+ if (elementToSelect instanceof IMember) {
+ ICompilationUnit toSelect = ((IMember) elementToSelect).getCompilationUnit();
+ if (toSelect != null) {
+ viewer.setSelection(new StructuredSelection(toSelect), true);
+ }
+ }
+ } else if (elementToSelect != null) {
+ if (!elementToSelect.equals(currentSelection.getFirstElement())) {
+ viewer.setSelection(new StructuredSelection(elementToSelect), true);
+ }
+ }
+ }
+// if (elementToSelect != null
+// && MylarJavaPlugin.getDefault().getPluginPreferences().getBoolean(
+// MylarJavaPrefConstants.PACKAGE_EXPLORER_AUTO_EXPAND)) {
+// viewer.expandAll();
+// }
+ }
+ }
+ } catch (Throwable t) {
+ MylarStatusHandler.log(t, "Could not update package explorer");
+ }
+ }
+
+ public void contextActivated(IMylarContext taskscape) {
+// try {
+// if (ContextCorePlugin.getContextManager().isContextActive()
+// && FocusPackageExplorerAction.getDefault() != null
+// && FocusPackageExplorerAction.getDefault().isChecked()) {
+//
+// PackageExplorerPart packageExplorer = PackageExplorerPart.getFromActivePerspective();
+// if (packageExplorer != null) {
+// packageExplorer.setLinkingEnabled(false);
+// packageExplorer.getTreeViewer().expandAll();
+// }
+// }
+// } catch (Throwable t) {
+// MylarStatusHandler.log(t, "Could not update package explorer");
+// }
+ }
+
+ public void contextDeactivated(IMylarContext taskscape) {
+ PackageExplorerPart packageExplorer = PackageExplorerPart.getFromActivePerspective();
+ if (packageExplorer != null) {
+ packageExplorer.getTreeViewer().collapseAll();
+ }
+ }
+
+// private boolean isInLinkToEditorMode(PackageExplorerPart packageExplorer) {
+// return JavaPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.LINK_PACKAGES_TO_EDITOR);
+// }
+
+ public void interestChanged(List<IMylarElement> nodes) {
+ // ignore
+ }
+
+ public void revealInteresting() {
+ // ignore
+ }
+
+ public void presentationSettingsChanging(UpdateKind kind) {
+ // ignore
+ }
+
+ public void presentationSettingsChanged(UpdateKind kind) {
+ // ignore
+ }
+
+ public void landmarkAdded(IMylarElement node) {
+ // ignore
+ }
+
+ public void landmarkRemoved(IMylarElement node) {
+ // ignore
+ }
+
+ public void nodeDeleted(IMylarElement node) {
+ // ignore
+ }
+
+ public void edgesChanged(IMylarElement node) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/ProblemsListInterestSorter.java b/org.eclipse.mylyn/developer/src-old/ProblemsListInterestSorter.java
new file mode 100644
index 0000000..d3dd6f0
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/ProblemsListInterestSorter.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.ide.ui;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.context.core.IMylarElement;
+import org.eclipse.mylyn.context.core.IMylarStructureBridge;
+import org.eclipse.mylyn.context.core.InterestComparator;
+import org.eclipse.mylyn.context.core.ContextCorePlugin;
+import org.eclipse.ui.views.markers.internal.FieldFolder;
+import org.eclipse.ui.views.markers.internal.FieldLineNumber;
+import org.eclipse.ui.views.markers.internal.FieldResource;
+import org.eclipse.ui.views.markers.internal.FieldSeverityAndMessage;
+import org.eclipse.ui.views.markers.internal.IField;
+import org.eclipse.ui.views.markers.internal.ProblemMarker;
+import org.eclipse.ui.views.markers.internal.TableSorter;
+
+/**
+ * @author Mik Kersten
+ */
+public class ProblemsListInterestSorter extends TableSorter {
+
+ // COPIED: from ProblemView
+ private final static int ASCENDING = TableSorter.ASCENDING;
+
+ private final static int DESCENDING = TableSorter.DESCENDING;
+
+ private final static int SEVERITY = 0;
+
+ private final static int DOI = 1;
+
+ private final static int DESCRIPTION = 2;
+
+ private final static int RESOURCE = 3;
+
+ private final static int[] DEFAULT_PRIORITIES = { SEVERITY, DOI, DESCRIPTION, RESOURCE };
+
+ private final static int[] DEFAULT_DIRECTIONS = { DESCENDING, // severity
+ ASCENDING, // folder
+ ASCENDING, // resource
+ ASCENDING }; // location
+
+ private final static IField[] VISIBLE_FIELDS = { new FieldSeverityAndMessage(), new FieldFolder(), new FieldResource(),
+ new FieldLineNumber() };
+
+ // END COPY
+
+ public ProblemsListInterestSorter() {
+ super(VISIBLE_FIELDS, DEFAULT_PRIORITIES, DEFAULT_DIRECTIONS);
+ }
+
+ protected InterestComparator<IMylarElement> interestComparator = new InterestComparator<IMylarElement>();
+
+ @Override
+ public int compare(Viewer viewer, Object obj1, Object obj2) {
+ if (obj1 instanceof ProblemMarker && obj1 instanceof ProblemMarker) {
+ ProblemMarker marker1 = (ProblemMarker) obj1;
+ ProblemMarker marker2 = (ProblemMarker) obj2;
+ if (marker1.getSeverity() == IMarker.SEVERITY_ERROR && marker2.getSeverity() < IMarker.SEVERITY_ERROR) {
+ return -1;
+ } else if (marker2.getSeverity() == IMarker.SEVERITY_ERROR
+ && marker1.getSeverity() < IMarker.SEVERITY_ERROR) {
+ return 1;
+ } else {
+ if (ContextCorePlugin.getContextManager().isContextActive()) {
+ IMylarStructureBridge bridge = ContextCore.getStructureBridge(
+ marker1.getResource().getFileExtension());
+ IMylarElement node1 = ContextCorePlugin.getContextManager().getElement(
+ bridge.getHandleForOffsetInObject(marker1, 0));
+ IMylarElement node2 = ContextCorePlugin.getContextManager().getElement(
+ bridge.getHandleForOffsetInObject(marker2, 0));
+ return interestComparator.compare(node1, node2);
+ }
+ }
+ }
+ return super.compare(viewer, obj1, obj2);
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/RelativePathUtil.java b/org.eclipse.mylyn/developer/src-old/RelativePathUtil.java
new file mode 100644
index 0000000..408917e
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/RelativePathUtil.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.tasklist;
+
+public class RelativePathUtil {
+ public static String findRelativePath(String baseDirectory, String filePath) {
+ if (filePath.startsWith(baseDirectory)) {
+ return filePath.substring(baseDirectory.length(), filePath.lastIndexOf('.'));
+ } else {
+ StringBuffer result = new StringBuffer(filePath.length());
+ String[] rootFolders = baseDirectory.split("/");
+ String[] pathFolders = filePath.split("/");
+ int diff = 0;
+ for (int i = 0; i < pathFolders.length; i++) {
+ if (!rootFolders[i].equals(pathFolders[i])) {
+ diff = i;
+ while (i < rootFolders.length) {
+ result.append('.');
+ result.append('.');
+ result.append('/');
+ i++;
+ }
+ while (diff < pathFolders.length - 1) {
+ result.append(pathFolders[diff]);
+ diff++;
+ }
+ result.append(pathFolders[diff].substring(0, pathFolders[diff].lastIndexOf('.')));
+ }
+ }
+ return result.toString();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/RemoveFromContextAction.java b/org.eclipse.mylyn/developer/src-old/RemoveFromContextAction.java
new file mode 100644
index 0000000..5fe86fa
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/RemoveFromContextAction.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.context.ui.actions;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCorePlugin;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.InterestFilter;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages;
+import org.eclipse.ui.actions.BaseSelectionListenerAction;
+import org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider;
+import org.eclipse.ui.navigator.CommonViewer;
+
+/**
+ *
+ * @author Mik Kersten
+ */
+public class RemoveFromContextAction extends BaseSelectionListenerAction {
+
+ public static final String ID = "org.eclipse.mylyn.context.ui.actions.delete";
+
+ private CommonViewer commonViewer;
+
+ private InterestFilter interestFilter;
+
+ public RemoveFromContextAction(CommonViewer commonViewer, InterestFilter interestFilter) {
+ super("Remove from Context");
+ setId(ID);
+ setImageDescriptor(TasksUiImages.REMOVE);
+ this.commonViewer = commonViewer;
+ this.interestFilter = interestFilter;
+ }
+
+ @Override
+ public void run() {
+ Set<IInteractionElement> toRemove = new HashSet<IInteractionElement>();
+
+ for (Iterator<?> iterator = super.getStructuredSelection().iterator(); iterator.hasNext();) {
+ Object object = iterator.next();
+ collectChildren(toRemove, object);
+ }
+
+ for (IInteractionElement element : toRemove) {
+ ContextCorePlugin.getContextManager().delete(element);
+ }
+ if (commonViewer != null) {
+ commonViewer.refresh();
+ }
+ }
+
+ private void collectChildren(Set<IInteractionElement> toRemove, Object object) {
+ IInteractionElement element = resolveElement(object);
+ if (element != null) {
+ toRemove.add(element);
+ }
+
+ Object[] children = ((NavigatorContentServiceContentProvider)commonViewer.getContentProvider()).getChildren(object);
+ for (int i = 0; i < children.length; i++) {
+ Object child = children[i];
+ if (interestFilter.select(commonViewer, object, child)) {
+ collectChildren(toRemove, child);
+ }
+ }
+ }
+
+ private IInteractionElement resolveElement(Object object) {
+ IInteractionElement element = null;
+ if (object instanceof IInteractionElement) {
+ element = (IInteractionElement)object;
+ } else {
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
+ if (bridge.getContentType() == null) {
+ // try to resolve the resource
+ if (object instanceof IAdaptable) {
+ Object adapted = ((IAdaptable) object).getAdapter(IResource.class);
+ if (adapted instanceof IResource) {
+ object = adapted;
+ }
+ bridge = ContextCore.getStructureBridge(object);
+ }
+ }
+
+ if (!object.getClass().getName().equals(Object.class.getCanonicalName())) {
+ String handle = bridge.getHandleIdentifier(object);
+ element = ContextCorePlugin.getContextManager().getElement(handle);
+ }
+ }
+ return element;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/RepositoryAwareStatusHandler.java b/org.eclipse.mylyn/developer/src-old/RepositoryAwareStatusHandler.java
new file mode 100644
index 0000000..8310f6d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/RepositoryAwareStatusHandler.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class RepositoryAwareStatusHandler {
+
+ protected static final String ERROR_MESSAGE = "Please report the following error at:\n"
+ + "http://bugs.eclipse.org/bugs/enter_bug.cgi?product=Mylyn\n\n"
+ + "Or via the popup menu in the Error Log view (see Window -> Show View)";
+
+ /**
+ * Used to ensure that only one dialog is open.
+ */
+ private static boolean errorDialogOpen = false;
+
+ private static RepositoryAwareStatusHandler instance;
+
+ public synchronized static RepositoryAwareStatusHandler getInstance() {
+ if (instance == null) {
+ new RepositoryAwareStatusHandler();
+ }
+ return instance;
+ }
+
+ public RepositoryAwareStatusHandler() {
+ instance = this;
+ }
+
+ @Deprecated
+ public void fail(final IStatus status, boolean informUser) {
+ if (informUser && Platform.isRunning()) {
+ try {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ Shell shell = null;
+ if (PlatformUI.getWorkbench() != null
+ && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ }
+
+ // ensure that only one dialog can be open at a time
+ synchronized (shell) {
+ try {
+ if (!errorDialogOpen) {
+ errorDialogOpen = true;
+ ErrorDialog.openError(shell, "Mylyn Error", ERROR_MESSAGE, status);
+ }
+ } finally {
+ errorDialogOpen = false;
+ }
+ }
+ }
+ });
+ } catch (Throwable t) {
+ status.getException().printStackTrace();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/Scatch.jpage b/org.eclipse.mylyn/developer/src-old/Scatch.jpage
new file mode 100644
index 0000000..990639a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/Scatch.jpage
@@ -0,0 +1,179 @@
+package ca.ubc.mylar;
+
+import java.io.*;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+import ca.ubc.mylar.model.DoiModelManager;
+import ca.ubc.mylar.monitor.UsageStatisticsManager;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class MylarPlugin extends AbstractUIPlugin {
+
+ public static boolean DEBUG_MODE = false;
+ public static final String LOG_FILE_NAME = "mylar-log.txt";
+
+ private static boolean enabled = true;
+
+ private static MylarPlugin plugin;
+ private static UserSelectionListener userSelectionListneer = new UserSelectionListener();
+ private static DoiModelManager modelManager = new DoiModelManager();
+ private static UsageStatisticsManager statisticsManager = new UsageStatisticsManager();
+
+ private static PrintStream logStream;
+
+ //Resource bundle.
+ private ResourceBundle resourceBundle;
+ private JavaElementImageProvider javaImageProvider;
+
+ public static DoiModelManager getModelManager() {
+ return modelManager;
+ }
+
+ static {
+ IPath rootPath = ResourcesPlugin.getWorkspace().getRoot().getLocation();
+ String path = rootPath.toString() + File.separator + LOG_FILE_NAME;
+ try {
+ logStream = new PrintStream(new FileOutputStream(new File(path), true));
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * The constructor.
+ */
+ public MylarPlugin() {
+ super();
+ plugin = this;
+ try {
+ resourceBundle = ResourceBundle.getBundle("ca.ubc.mylar.MylarPluginResources");
+ javaImageProvider = new JavaElementImageProvider();
+ } catch (MissingResourceException x) {
+ resourceBundle = null;
+ } catch (Throwable t) {
+ System.err.println("> Mylar failed to start: " + t.getMessage());
+ t.printStackTrace();
+ }
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static MylarPlugin getDefault() {
+ return plugin;
+ }
+
+ public static IPreferenceStore getPrefs() {
+ return getDefault().getPreferenceStore();
+ }
+
+ public static void log(Object source, String message) {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("[");
+ buffer.append(Util.getFormattedDate());
+ buffer.append(", ");
+ buffer.append(Util.getFormattedTime());
+ buffer.append("] ");
+
+ if (source != null) buffer.append(source.getClass().getName());
+ buffer.append(": " + message);
+
+ if (DEBUG_MODE) System.out.println(buffer.toString());
+ if (logStream != null) logStream.println(buffer.toString());
+ }
+
+ /**
+ * @param throwable can be null
+ * @param message
+ */
+ public static void fail(Throwable throwable, String message) {
+ StringWriter stringWriter= new StringWriter();
+ PrintWriter writer= new PrintWriter(stringWriter);
+ StringBuffer buffer = new StringBuffer();
+ if (throwable != null) {
+ throwable.printStackTrace(writer);
+ buffer = stringWriter.getBuffer();
+ }
+ log(MylarPlugin.getDefault(), "fail: " + message + "\n" + buffer.toString());
+
+ final Status status= new Status(
+ Status.ERROR,
+ "ca.ubc.mylar",
+ Status.OK,
+ message, //$NON-NLS-1$
+ throwable);
+
+ Workbench.getInstance().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(
+ Workbench.getInstance().getActiveWorkbenchWindow().getShell(),
+ "Mylar error",
+ "Please report the following error",
+ status);
+ }
+ });
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle,
+ * or 'key' if not found.
+ */
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = MylarPlugin.getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the string from the plugin's resource bundle,
+ * or 'key' if not found.
+ */
+ public static String getMessage(String key) {
+ ResourceBundle bundle = getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the plugin's resource bundle,
+ */
+ public ResourceBundle getResourceBundle() {
+ return resourceBundle;
+ }
+
+ public static UsageStatisticsManager getStatisticsManager() {
+ return statisticsManager;
+ }
+
+ /**
+ * For testing.
+ */
+ public static UserSelectionListener getUserSelectionListneer() {
+ return userSelectionListneer;
+ }
+
+ public static boolean isEnabled() {
+ return enabled;
+ }
+ public static void setEnabled(boolean enabled) {
+ MylarPlugin.enabled = enabled;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/SynchronizeChangedTasksJob.java b/org.eclipse.mylyn/developer/src-old/SynchronizeChangedTasksJob.java
new file mode 100644
index 0000000..3a27af1
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/SynchronizeChangedTasksJob.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 Mylar committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui;
+
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+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.Job;
+import org.eclipse.mylyn.internal.monitor.core.util.StatusManager;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.TaskList;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+public class SynchronizeChangedTasksJob extends Job {
+
+ private final AbstractRepositoryConnector connector;
+
+ private final TaskRepository repository;
+
+ private boolean forced;
+
+ public SynchronizeChangedTasksJob(AbstractRepositoryConnector connector, TaskRepository repository) {
+ super("Get Changed Tasks");
+
+ this.connector = connector;
+ this.repository = repository;
+ }
+
+ /**
+ * Returns true, if synchronization was triggered manually and not by an automatic background job.
+ */
+ public boolean isForced() {
+ return forced;
+ }
+
+ /**
+ * Indicates a manual synchronization (User initiated). If set to true, a dialog will be displayed in case of
+ * errors. Any tasks with missing data will be retrieved.
+ */
+ public void setForced(boolean forced) {
+ this.forced = forced;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ try {
+ monitor.beginTask("Synchronizing changed tasks", IProgressMonitor.UNKNOWN);
+
+ TaskList taskList = TasksUiPlugin.getTaskList();
+ Set<AbstractTask> tasks = taskList.getRepositoryTasks(repository.getUrl());
+
+ boolean changed = connector.markStaleTasks(repository, tasks, new SubProgressMonitor(monitor, 1));
+ if (!changed) {
+ return Status.OK_STATUS;
+ }
+
+ for (Iterator<AbstractTask> it = tasks.iterator(); it.hasNext();) {
+ if (!it.next().isStale()) {
+ it.remove();
+ }
+ }
+
+ if (tasks.isEmpty()) {
+ return Status.OK_STATUS;
+ }
+
+ TasksUiPlugin.getSynchronizationManager().synchronize(connector, tasks, forced, null);
+ } catch (final CoreException e) {
+ StatusManager.log(e.getStatus());
+ } finally {
+ monitor.done();
+ }
+
+ return Status.OK_STATUS;
+ };
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskActivityTimer.java b/org.eclipse.mylyn/developer/src-old/TaskActivityTimer.java
new file mode 100644
index 0000000..fe5b191
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskActivityTimer.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.util.Calendar;
+
+import org.eclipse.mylyn.context.core.IInteractionEventListener;
+import org.eclipse.mylyn.context.core.InteractionEvent;
+import org.eclipse.mylyn.internal.context.core.util.ITimerThreadListener;
+import org.eclipse.mylyn.internal.context.core.util.TimerThread;
+import org.eclipse.mylyn.monitor.MylarMonitorPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskActivityTimer implements ITimerThreadListener, IInteractionEventListener, IWindowListener {
+
+ private TimerThread timer;
+
+ private ITask task;
+
+ private long lastActivity;
+
+ private boolean started;
+
+ public TaskActivityTimer(ITask task, int timeout, int sleepInterval) {
+ this.task = task;
+ timer = new TimerThread(timeout, sleepInterval);
+ PlatformUI.getWorkbench().addWindowListener(this);
+ MylarMonitorPlugin.getDefault().addInteractionListener(this);
+ timer.addListener(this);
+ }
+
+ public void startTimer() {
+ lastActivity = Calendar.getInstance().getTimeInMillis();
+ timer.start();
+ started = true;
+ }
+
+ public void stopTimer() {
+ if (!timer.isSuspended()) {
+ addElapsedToActivityTime();
+ }
+ timer.kill();
+ timer.removeListener(this);
+ MylarMonitorPlugin.getDefault().removeInteractionListener(this);
+ PlatformUI.getWorkbench().removeWindowListener(this);
+ started = false;
+ }
+
+ public void fireTimedOut() {
+ suspendTiming();
+ }
+
+ public void interactionObserved(InteractionEvent event) {
+ // lastActivity = Calendar.getInstance().getTimeInMillis();
+ timer.resetTimer();
+ }
+
+ private void suspendTiming() {
+ addElapsedToActivityTime();
+ timer.setSuspended(true);
+ }
+
+ private void addElapsedToActivityTime() {
+// long elapsed = Calendar.getInstance().getTimeInMillis() - lastActivity;
+// task.setElapsedTime(task.getElapsedTime() + elapsed);
+// lastActivity = Calendar.getInstance().getTimeInMillis();
+ }
+
+ public void startMonitoring() {
+
+ }
+
+ public void stopMonitoring() {
+
+ }
+
+ /**
+ * Public for testing
+ */
+ public boolean isStarted() {
+ return started;
+ }
+
+ public String toString() {
+ return "timer for task: " + task.toString();
+ }
+
+ public boolean isSuspended() {
+ return timer.isSuspended();
+ }
+
+ public void intervalElapsed() {
+ addElapsedToActivityTime();
+ }
+
+ public void windowActivated(IWorkbenchWindow window) {
+ timer.resetTimer();
+ lastActivity = Calendar.getInstance().getTimeInMillis();
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+ suspendTiming();
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ if (PlatformUI.getWorkbench().getWorkbenchWindowCount() == 0) {
+ timer.kill();
+ }
+ }
+
+ public void windowOpened(IWorkbenchWindow window) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskActivityTimingTest.java b/org.eclipse.mylyn/developer/src-old/TaskActivityTimingTest.java
new file mode 100644
index 0000000..dbc6300
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskActivityTimingTest.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.tasks.tests;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.context.core.InteractionEvent;
+import org.eclipse.mylyn.internal.context.core.util.TimerThread;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskActivityTimer;
+import org.eclipse.mylyn.monitor.MylarMonitorPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.Task;
+import org.eclipse.mylyn.tasks.ui.TaskListManager;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskActivityTimingTest extends TestCase {
+
+ // 5 seconds (minimum value since TimerThread sleeps
+ // for 5 seconds anyway before checking
+
+ private static final int SLOP = 100;
+
+ private static final int SLEEP_INTERVAL = SLOP * 3;
+
+ private static final int TIMEOUT = SLEEP_INTERVAL * 2;
+
+ private static final int SLEEP_NOTIMEOUT = TIMEOUT - SLOP; // 1 second
+
+ // Introdueced long sleep for testing inactivity where TimerThread
+ // sleeps for 5 seconds so we must sleep at least that long before
+ // it will have woken up and suspended.
+ private static final int SLEEP_TIMEOUT = TIMEOUT + SLOP; // 5.5 seconds
+
+ protected TaskListManager manager = TasksUiPlugin.getTaskListManager();
+
+ protected Task task1 = null;
+
+ protected int originalActivityTimeout = -1;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ task1 = new Task("t1", "t1", true);
+ originalActivityTimeout = MylarMonitorPlugin.getDefault().getInactivityTimeout();
+ MylarMonitorPlugin.getDefault().setInactivityTimeout(TIMEOUT);
+ manager.setTimerSleepInterval(SLEEP_INTERVAL);
+ }
+
+ public void tearDown() {
+ TasksUiPlugin.getTaskListManager().deactivateTask(task1);
+ ITask remaining = TasksUiPlugin.getTaskList().getActiveTask();
+ if (remaining != null) {
+ TasksUiPlugin.getTaskListManager().deactivateTask(remaining);
+ }
+ MylarMonitorPlugin.getDefault().setInactivityTimeout(originalActivityTimeout);
+ manager.setTimerSleepInterval(TimerThread.DEFAULT_SLEEP_INTERVAL);
+ }
+
+ public void testDeactivation() throws InterruptedException {
+ assertEquals(0, task1.getElapsedTime());
+ TasksUiPlugin.getTaskListManager().deactivateTask(task1);
+ assertEquals(0, task1.getElapsedTime());
+
+ TasksUiPlugin.getTaskListManager().activateTask(task1);
+ Thread.sleep(SLEEP_NOTIMEOUT);
+ TasksUiPlugin.getTaskListManager().deactivateTask(task1);
+ assertTrue("elapsed: " + task1.getElapsedTime(), task1.getElapsedTime() >= SLEEP_NOTIMEOUT - 2*SLOP);
+ }
+
+ public void testTimerMap() throws InterruptedException {
+ Task task0 = new Task("t0", "t0", true);
+ manager.activateTask(task0);
+ assertEquals(1, manager.getTimerMap().values().size());
+ TaskActivityTimer timer0 = manager.getTimerMap().get(task0);
+ assertTrue(timer0.isStarted());
+
+ long elapsed = task1.getElapsedTime();
+ assertEquals(0, elapsed);
+ TasksUiPlugin.getTaskListManager().activateTask(task1);
+ TaskActivityTimer timer1 = manager.getTimerMap().get(task1);
+ // previous task was deactivated
+ assertEquals(1, manager.getTimerMap().values().size());
+ assertTrue(timer1.isStarted());
+ Thread.sleep(SLEEP_TIMEOUT);
+
+ manager.deactivateTask(task1);
+ elapsed = task1.getElapsedTime();
+ assertTrue("should be around TIMEOUT", (elapsed > (TIMEOUT - 500)) && (elapsed < (TIMEOUT + 500)));
+ assertFalse(timer1.isStarted());
+ assertEquals(0, manager.getTimerMap().values().size());
+
+ Thread.sleep(SLEEP_TIMEOUT);
+ long elapsedAfterInactivity = task1.getElapsedTime();
+ assertEquals("no accumulation if task deactivated", elapsed, elapsedAfterInactivity);
+
+ assertFalse(timer0.isStarted());
+ assertEquals(0, manager.getTimerMap().values().size());
+ }
+
+ public void testElapsedTimeCapture() throws InterruptedException {
+ long elapsed = task1.getElapsedTime();
+ assertEquals(0, elapsed);
+ TasksUiPlugin.getTaskListManager().activateTask(task1);
+ Thread.sleep(SLEEP_TIMEOUT);
+
+ elapsed = task1.getElapsedTime();
+ assertTrue("should be bigger than timeout: " + elapsed + " > " + TIMEOUT, elapsed + SLOP >= TIMEOUT);
+
+ // Task should be inactive so no time accumulated
+ Thread.sleep(SLEEP_TIMEOUT);
+ TasksUiPlugin.getTaskListManager().deactivateTask(task1);
+
+ long elapsedAfterDeactivation = task1.getElapsedTime();
+ assertEquals(elapsed, elapsedAfterDeactivation);
+
+ Thread.sleep(SLEEP_TIMEOUT);
+ long elapsedAfterInactivity = task1.getElapsedTime();
+ assertEquals("no accumulation if task inactive", elapsedAfterDeactivation, elapsedAfterInactivity);
+
+ MylarMonitorPlugin.getDefault().setInactivityTimeout(SLEEP_TIMEOUT * 2);
+ TasksUiPlugin.getTaskListManager().activateTask(task1);
+ Thread.sleep(SLEEP_TIMEOUT);
+ // Should not have timed out
+ TasksUiPlugin.getTaskListManager().deactivateTask(task1);
+ long elpasedAfterReactivation = task1.getElapsedTime();
+
+ // adds some slop
+ assertTrue("time: " + (elpasedAfterReactivation - elapsedAfterInactivity), elpasedAfterReactivation
+ - elapsedAfterInactivity + 50 >= SLEEP_TIMEOUT);
+ }
+
+ public void testTimeout() throws InterruptedException {
+
+ Task task0 = new Task("t0", "t0", true);
+ assertEquals(task0.getElapsedTime(), 0);
+ manager.activateTask(task0);
+ assertEquals(1, manager.getTimerMap().values().size());
+ TaskActivityTimer timer0 = manager.getTimerMap().get(task0);
+ assertTrue(timer0.isStarted());
+
+ Thread.sleep(SLEEP_TIMEOUT);
+
+ // timeout should have occurred before SLEEP time
+ long timeAfterSleep = task0.getElapsedTime();
+
+ assertTrue(timeAfterSleep < SLEEP_TIMEOUT);
+ timer0 = manager.getTimerMap().get(task0);
+ assertNotNull(timer0);
+ assertTrue(timer0.isSuspended());
+
+ // Interaction should cause task timer to startup.
+ mockInteraction();
+ assertFalse(timer0.isSuspended());
+ Thread.sleep(SLEEP_NOTIMEOUT);
+ manager.deactivateTask(task0);
+
+ assertTrue(task0.getElapsedTime() > timeAfterSleep);
+ TasksUiPlugin.getTaskListManager().deactivateTask(task0);
+
+ }
+
+ protected void mockInteraction() {
+ MylarMonitorPlugin.getDefault().notifyInteractionObserved(
+ new InteractionEvent(InteractionEvent.Kind.EDIT, "java", "A.java", "mock-id"));
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskListBackupManager.java b/org.eclipse.mylyn/developer/src-old/TaskListBackupManager.java
new file mode 100644
index 0000000..aa696b0
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskListBackupManager.java
@@ -0,0 +1,350 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.SortedMap;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportJob;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.TaskDataExportWizard;
+import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.IProgressService;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskListBackupManager implements IPropertyChangeListener {
+
+ public static final String TIMESTAMP_FORMAT = "yyyy-MM-dd-HHmmss";
+
+ private static final String TITLE_TASKLIST_BACKUP = "Tasklist Backup";
+
+ private static final String BACKUP_JOB_NAME = "Scheduled task data backup";
+
+ public static final String BACKUP_FAILURE_MESSAGE = "Could not backup task data. Check backup preferences.\n";
+
+ private static final long SECOND = 1000;
+
+ private static final long MINUTE = 60 * SECOND;
+
+ private static final long HOUR = 60 * MINUTE;
+
+ private static final long DAY = 24 * HOUR;
+
+ private Timer timer;
+
+ //private static final Pattern zipPattern = Pattern.compile("^" + TaskDataExportWizard.ZIP_FILE_PREFIX + ".*");
+
+ public TaskListBackupManager() {
+ int days = TasksUiPlugin.getDefault().getPreferenceStore().getInt(TasksUiPreferenceConstants.BACKUP_SCHEDULE);
+ if (days > 0) {
+ start(HOUR);///2 * MINUTE
+ }
+ }
+
+ public void start(long delay) {
+ timer = new Timer();
+ timer.schedule(new CheckBackupRequired(), delay, HOUR);
+ }
+
+ public void stop() {
+ timer.cancel();
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+// if (event.getProperty().equals(TaskListPreferenceConstants.BACKUP_AUTOMATICALLY)) {
+// if ((Boolean) event.getNewValue() == true) {
+// start(MINUTE);
+// } else {
+// stop();
+// }
+// }
+ }
+
+ public void backupNow(boolean synchronous) {
+ String destination = TasksUiPlugin.getDefault().getBackupFolderPath();
+
+ File backupFolder = new File(destination);
+ if (!backupFolder.exists()) {
+ backupFolder.mkdir();
+ }
+
+ removeOldBackups(backupFolder);
+
+ String fileName = TaskDataExportWizard.getZipFileName();
+
+ if (!synchronous) {
+
+ ExportJob export = new ExportJob(destination, fileName);
+ export.schedule();
+
+ } else {
+
+ final TaskDataExportJob backupJob = new TaskDataExportJob(destination, true, true, false, false, fileName,
+ new HashSet<AbstractTask>());
+
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ try {
+ service.run(true, false, backupJob);
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(TasksUiPreferenceConstants.BACKUP_LAST,
+ new Date().getTime());
+ } catch (InterruptedException e) {
+ // ignore
+ } catch (InvocationTargetException e) {
+ MessageDialog.openError(null, TITLE_TASKLIST_BACKUP, BACKUP_FAILURE_MESSAGE);
+ }
+
+ }
+ }
+
+ /** public for testing purposes */
+ public void removeOldBackups(File folder) {
+
+ int maxBackups = TasksUiPlugin.getDefault().getPreferenceStore().getInt(
+ TasksUiPreferenceConstants.BACKUP_MAXFILES);
+
+ File[] files = folder.listFiles();
+ ArrayList<File> backupFiles = new ArrayList<File>();
+ for (File file : files) {
+ if (file.getName().startsWith(TaskDataExportWizard.ZIP_FILE_PREFIX)) {
+ backupFiles.add(file);
+ }
+ }
+
+ File[] backupFileArray = backupFiles.toArray(new File[backupFiles.size()]);
+
+ if (backupFileArray != null && backupFileArray.length > 0) {
+ Arrays.sort(backupFileArray, new Comparator<File>() {
+ public int compare(File file1, File file2) {
+ return new Long((file1).lastModified()).compareTo(new Long((file2).lastModified()));
+ }
+
+ });
+
+ int toomany = backupFileArray.length - maxBackups;
+ if (toomany > 0) {
+ for (int x = 0; x < toomany; x++) {
+ if (backupFileArray[x] != null) {
+ backupFileArray[x].delete();
+ }
+ }
+ }
+ }
+ }
+
+ /** public for testing purposes */
+ public synchronized static void removeOldBackups(File folder, Pattern pattern, int maxBackups) {
+
+ if (maxBackups <= 0) {
+ maxBackups = 1;
+ }
+
+ File[] files = folder.listFiles();
+ ArrayList<File> backupFiles = new ArrayList<File>();
+ for (File file : files) {
+ Matcher matcher = pattern.matcher(file.getName());
+ if (matcher.find()) {
+ backupFiles.add(file);
+ }
+ }
+
+ File[] backupFileArray = backupFiles.toArray(new File[backupFiles.size()]);
+
+ if (backupFileArray != null && backupFileArray.length > 0) {
+ Arrays.sort(backupFileArray, new Comparator<File>() {
+ public int compare(File file1, File file2) {
+ return new Long((file1).lastModified()).compareTo(new Long((file2).lastModified()));
+ }
+ });
+
+ SortedMap<Long, File> filesMap = new TreeMap<Long, File>();
+ for (File file2 : backupFileArray) {
+ String name = file2.getName();
+ if (name.startsWith(ITasksCoreConstants.PREFIX_TASKLIST)) {
+ try {
+ String dateString = name.substring(ITasksCoreConstants.PREFIX_TASKLIST.length() + 1,
+ ITasksCoreConstants.PREFIX_TASKLIST.length() + TIMESTAMP_FORMAT.length() + 1);
+ SimpleDateFormat format = new SimpleDateFormat(TIMESTAMP_FORMAT, Locale.ENGLISH);
+ Date date = format.parse(dateString);
+ filesMap.put(new Long(date.getTime()), file2);
+ } catch (Exception e) {
+ continue;
+ }
+ }
+ }
+
+ if (filesMap.size() > 0) {
+
+ Calendar rangeStart = TaskActivityUtil.getCalendar();
+ rangeStart.setTimeInMillis(filesMap.lastKey());
+ TaskActivityUtil.snapStartOfHour(rangeStart);
+ int startHour = rangeStart.get(Calendar.HOUR_OF_DAY);
+ Calendar rangeEnd = TaskActivityUtil.getCalendar();
+ rangeEnd.setTimeInMillis(rangeStart.getTimeInMillis());
+ rangeEnd.add(Calendar.HOUR_OF_DAY, 1);
+ // Keep one backup for last 8 hours of today
+ for (int x = 1; x <= startHour && x < 9; x++) {
+ SortedMap<Long, File> subMap = filesMap.subMap(rangeStart.getTimeInMillis(),
+ rangeEnd.getTimeInMillis());
+ if (subMap.size() > 1) {
+ while (subMap.size() > 1) {
+ File toDelete = subMap.remove(subMap.firstKey());
+ toDelete.delete();
+ }
+ }
+ rangeStart.add(Calendar.HOUR_OF_DAY, -1);
+ rangeEnd.add(Calendar.HOUR_OF_DAY, -1);
+ }
+
+ // Keep one backup a day for the past 12 days
+ TaskActivityUtil.snapStartOfDay(rangeEnd);
+ rangeStart.add(Calendar.DAY_OF_YEAR, -1);
+ for (int x = 1; x <= 12; x++) {
+ SortedMap<Long, File> subMap = filesMap.subMap(rangeStart.getTimeInMillis(),
+ rangeEnd.getTimeInMillis());
+ if (subMap.size() > 1) {
+ while (subMap.size() > 1) {
+ File toDelete = subMap.remove(subMap.firstKey());
+ toDelete.delete();
+ }
+ }
+ rangeStart.add(Calendar.DAY_OF_YEAR, -1);
+ rangeEnd.add(Calendar.DAY_OF_YEAR, -1);
+ }
+
+ // Remove all older backups
+ SortedMap<Long, File> subMap = filesMap.subMap(0l, rangeStart.getTimeInMillis());
+ if (subMap.size() > 0) {
+ while (subMap.size() > 0) {
+ File toDelete = subMap.remove(subMap.firstKey());
+ toDelete.delete();
+ }
+ }
+ }
+ }
+ }
+
+// public File getMostRecentBackup() {
+// String destination = TasksUiPlugin.getDefault().getBackupFolderPath();
+//
+// File backupFolder = new File(destination);
+// ArrayList<File> backupFiles = new ArrayList<File>();
+// if (backupFolder.exists()) {
+// File[] files = backupFolder.listFiles();
+// for (File file : files) {
+// if (file.getName().startsWith(TaskDataExportWizard.ZIP_FILE_PREFIX)) {
+// backupFiles.add(file);
+// }
+// }
+// }
+//
+// File[] backupFileArray = backupFiles.toArray(new File[backupFiles.size()]);
+//
+// if (backupFileArray != null && backupFileArray.length > 0) {
+// Arrays.sort(backupFileArray, new Comparator<File>() {
+// public int compare(File file1, File file2) {
+// return (new Long((file1).lastModified()).compareTo(new Long((file2).lastModified()))) * -1;
+// }
+//
+// });
+// }
+// if (backupFileArray != null && backupFileArray.length > 0) {
+// return backupFileArray[0];
+// }
+//
+// return null;
+// }
+
+ class CheckBackupRequired extends TimerTask {
+
+ @Override
+ public void run() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ backupNow(false);
+ }
+ });
+// if (!Platform.isRunning() || TasksUiPlugin.getDefault() == null) {
+// return;
+// } else {
+// long lastBackup = TasksUiPlugin.getDefault().getPreferenceStore().getLong(
+// TasksUiPreferenceConstants.BACKUP_LAST);
+// int days = TasksUiPlugin.getDefault().getPreferenceStore().getInt(
+// TasksUiPreferenceConstants.BACKUP_SCHEDULE);
+// long waitPeriod = days * DAY;
+// final long now = new Date().getTime();
+//
+// if ((now - lastBackup) > waitPeriod) {
+// if (Platform.isRunning() && !PlatformUI.getWorkbench().isClosing()
+// && PlatformUI.getWorkbench().getDisplay() != null
+// && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// backupNow(false);
+// }
+// });
+// }
+// }
+// }
+ }
+ }
+
+ static class ExportJob extends Job {
+
+ final TaskDataExportJob backupJob;
+
+ public ExportJob(String destination, String filename) {
+ super(BACKUP_JOB_NAME);
+ backupJob = new TaskDataExportJob(destination, true, filename);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ if (Platform.isRunning()) {
+ backupJob.run(monitor);
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(TasksUiPreferenceConstants.BACKUP_LAST,
+ new Date().getTime());
+ }
+ } catch (InvocationTargetException e) {
+ MessageDialog.openError(null, BACKUP_JOB_NAME,
+ "Error occured during scheduled tasklist backup.\nCheck settings on Tasklist preferences page.");
+ } catch (InterruptedException e) {
+ return Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
+ }
+
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskListDataMigration.java b/org.eclipse.mylyn/developer/src-old/TaskListDataMigration.java
new file mode 100644
index 0000000..5b8bdc2
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskListDataMigration.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 Mylar committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasks.ui;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.context.core.MylarStatusHandler;
+import org.eclipse.mylyn.internal.context.core.MylarContextManager;
+import org.eclipse.mylyn.internal.context.core.util.ZipFileUtil;
+import org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants;
+import org.eclipse.mylyn.tasks.core.TaskRepositoryManager;
+
+/**
+ * Migrate 0.6 -> 0.7 mylar data format
+ *
+ * @author Rob Elves
+ */
+public class TaskListDataMigration implements IRunnableWithProgress {
+
+ private File dataDirectory = null;
+
+ public TaskListDataMigration(File sourceFolder) {
+ this.dataDirectory = sourceFolder;
+ }
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ monitor.beginTask("Task Data Migration", IProgressMonitor.UNKNOWN);
+ doMigration(monitor);
+ } finally {
+
+ }
+ }
+
+ public void doMigration(IProgressMonitor monitor) {
+ try {
+ if(dataDirectory == null || !dataDirectory.exists()) return;
+ monitor.beginTask("Mylar Data Migration", 4);
+ migrateTaskList(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ monitor.worked(1);
+ migrateRepositoriesData(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ monitor.worked(1);
+ migrateTaskContextData(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ monitor.worked(1);
+ migrateActivityData(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
+ monitor.worked(1);
+ } finally {
+ monitor.done();
+ }
+ }
+
+ public boolean migrateTaskList(IProgressMonitor monitor) {
+ File oldTasklistFile = new File(dataDirectory, ITasksUiConstants.OLD_TASK_LIST_FILE);
+ File newTasklistFile = new File(dataDirectory, ITasksUiConstants.DEFAULT_TASK_LIST_FILE);
+ if (!oldTasklistFile.exists())
+ return false;
+ if (newTasklistFile.exists()) {
+ if (!newTasklistFile.delete()) {
+ MylarStatusHandler.fail(null, "Could not overwrite tasklist", false);
+ return false;
+ }
+ }
+ ArrayList<File> filesToZip = new ArrayList<File>();
+ filesToZip.add(oldTasklistFile);
+ try {
+ monitor.beginTask("Migrate Tasklist Data", 1);
+ ZipFileUtil.createZipFile(newTasklistFile, filesToZip, new SubProgressMonitor(monitor, 1));
+ if (!oldTasklistFile.delete()) {
+ MylarStatusHandler.fail(null, "Could not remove old tasklist.", false);
+ return false;
+ }
+ monitor.worked(1);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Error occurred while migrating old tasklist: " + e.getMessage(), true);
+ return false;
+ } finally {
+ monitor.done();
+ }
+ return true;
+ }
+
+ public boolean migrateRepositoriesData(IProgressMonitor monitor) {
+ File oldRepositoriesFile = new File(dataDirectory, TaskRepositoryManager.OLD_REPOSITORIES_FILE);
+ File newRepositoriesFile = new File(dataDirectory, TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE);
+ if (!oldRepositoriesFile.exists())
+ return false;
+ if (newRepositoriesFile.exists()) {
+ if (!newRepositoriesFile.delete()) {
+ MylarStatusHandler.fail(null,
+ "Could not overwrite repositories file. Check read/write permission on data directory.", false);
+ return false;
+ }
+ }
+ ArrayList<File> filesToZip = new ArrayList<File>();
+ filesToZip.add(oldRepositoriesFile);
+ try {
+ monitor.beginTask("Migrate Repository Data", 1);
+ ZipFileUtil.createZipFile(newRepositoriesFile, filesToZip, new SubProgressMonitor(monitor, 1));
+ if (!oldRepositoriesFile.delete()) {
+ MylarStatusHandler
+ .fail(
+ null,
+ "Could not remove old repositories file. Check read/write permission on data directory.",
+ false);
+ return false;
+ }
+ monitor.worked(1);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Error occurred while migrating old repositories data: " + e.getMessage(), true);
+ return false;
+ } finally {
+ monitor.done();
+ }
+ return true;
+ }
+
+ public boolean migrateTaskContextData(IProgressMonitor monitor) {
+ ArrayList<File> contextFiles = new ArrayList<File>();
+ for (File file : dataDirectory.listFiles()) {
+ if (file.getName().startsWith("http") || file.getName().startsWith("local") || file.getName().startsWith("task")) {
+ if (!file.getName().endsWith(".zip")) {
+ contextFiles.add(file);
+ }
+ }
+ }
+
+ try {
+ monitor.beginTask("Task Context Migration", contextFiles.size());
+
+ File contextsFolder = new File(dataDirectory, MylarContextManager.CONTEXTS_DIRECTORY);
+ if (!contextsFolder.exists()) {
+ if (!contextsFolder.mkdir()) {
+ MylarStatusHandler.fail(null,
+ "Could not create contexts folder. Check read/write permission on data directory.", false);
+ return false;
+ }
+ }
+ for (File file : contextFiles) {
+ ArrayList<File> filesToZip = new ArrayList<File>();
+ filesToZip.add(file);
+ File newContextFile = new File(contextsFolder, file.getName()+".zip");
+ if (newContextFile.exists()) {
+ if (!newContextFile.delete()) {
+ MylarStatusHandler.fail(null,
+ "Could not overwrite context file. Check read/write permission on data directory.",
+ false);
+ return false;
+ }
+ }
+ ZipFileUtil.createZipFile(newContextFile, filesToZip, new SubProgressMonitor(monitor, 1));
+ if (!file.delete()) {
+ MylarStatusHandler.fail(null,
+ "Could not remove old context file. Check read/write permission on data directory.", false);
+ return false;
+ }
+ monitor.worked(1);
+ }
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Error occurred while migrating old repositories data: " + e.getMessage(), true);
+ return false;
+ } finally {
+ monitor.done();
+ }
+ return true;
+ }
+
+ public boolean migrateActivityData(IProgressMonitor monitor) {
+ File oldActivityFile = new File(dataDirectory, MylarContextManager.OLD_CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION_OLD);
+ if (!oldActivityFile.exists())
+ return false;
+
+ File contextsFolder = new File(dataDirectory, MylarContextManager.CONTEXTS_DIRECTORY);
+ if (!contextsFolder.exists()) {
+ if (!contextsFolder.mkdir()) {
+ MylarStatusHandler.fail(null,
+ "Could not create contexts folder. Check read/write permission on data directory.", false);
+ return false;
+ }
+ }
+
+ File newActivityFile = new File(contextsFolder, MylarContextManager.CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION);
+
+ if (newActivityFile.exists()) {
+ if (!newActivityFile.delete()) {
+ MylarStatusHandler.fail(null,
+ "Could not overwrite activity file. Check read/write permission on data directory.", false);
+ return false;
+ }
+ }
+ ArrayList<File> filesToZip = new ArrayList<File>();
+ filesToZip.add(oldActivityFile);
+ try {
+ monitor.beginTask("Migrate Activity Data", 1);
+ ZipFileUtil.createZipFile(newActivityFile, filesToZip, new SubProgressMonitor(monitor, 1));
+ if (!oldActivityFile.delete()) {
+ MylarStatusHandler
+ .fail(
+ null,
+ "Could not remove old activity file. Check read/write permission on data directory.",
+ false);
+ return false;
+ }
+ monitor.worked(1);
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Error occurred while migrating old activity data: " + e.getMessage(), true);
+ return false;
+ } finally {
+ monitor.done();
+ }
+ return true;
+ }
+
+}
+
+//public boolean migrateActivityData(IProgressMonitor monitor) {
+//File oldActivityFile = new File(dataDirectory, MylarContextManager.OLD_CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION_OLD);
+//if (!oldActivityFile.exists())
+// return false;
+//
+//File newActivityFile = new File(dataDirectory, MylarContextManager.CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION);
+//
+//if (newActivityFile.exists()) {
+// if (!newActivityFile.delete()) {
+// MylarStatusHandler.fail(null,
+// "Could not overwrite activity file. Check read/write permission on data directory.", false);
+// return false;
+// }
+//}
+//ArrayList<File> filesToZip = new ArrayList<File>();
+//filesToZip.add(oldActivityFile);
+//try {
+// monitor.beginTask("Migrate Activity Data", 1);
+// ZipFileUtil.createZipFile(newActivityFile, filesToZip, new SubProgressMonitor(monitor, 1));
+// if (!oldActivityFile.delete()) {
+// MylarStatusHandler
+// .fail(
+// null,
+// "Could not remove old activity file. Check read/write permission on data directory.",
+// false);
+// return false;
+// }
+// monitor.worked(1);
+//} catch (Exception e) {
+// MylarStatusHandler.fail(e, "Error occurred while migrating old activity data: " + e.getMessage(), true);
+// return false;
+//} finally {
+// monitor.done();
+//}
+//return true;
+//}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/TaskListSaveManager.java b/org.eclipse.mylyn/developer/src-old/TaskListSaveManager.java
new file mode 100644
index 0000000..d0f40ea
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskListSaveManager.java
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Queue;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionContextManager;
+import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.tasks.core.TaskContainerDelta;
+
+//import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Eugene Kuleshov
+ * @author Rob Elves
+ */
+public class TaskListSaveManager implements ITaskListChangeListener, IBackgroundSaveListener {
+
+ private final static int DEFAULT_SAVE_INTERVAL = 1 * 60 * 1000;
+
+ private final BackgroundSaveTimer saveTimer;
+
+ private final TaskListSaverJob taskListSaverJob;
+
+ private final boolean initializationWarningDialogShow = false;
+
+ private static final int MAX_TASKLIST_SNAPSHOTS = 8;
+
+ public static final Pattern SNAPSHOT_REGEXP = Pattern.compile("^tasklist-.*");
+
+ public TaskListSaveManager() {
+ saveTimer = new BackgroundSaveTimer(this);
+ saveTimer.setSaveIntervalMillis(DEFAULT_SAVE_INTERVAL);
+ saveTimer.start();
+
+ taskListSaverJob = new TaskListSaverJob();
+ //taskListSaverJob.setRule(TasksUiPlugin.getTaskList());
+ taskListSaverJob.schedule();
+ }
+
+ /**
+ * Called periodically by the save timer
+ */
+ public void saveRequested() {
+ if (TasksUiPlugin.getDefault() != null && Platform.isRunning()) {// &&
+ // TasksUiPlugin.getDefault().isShellActive()
+ try {
+ taskListSaverJob.runRequested();
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not auto save task list", e));
+ }
+ }
+ }
+
+ /**
+ * Should only be used by TaskListManager and unit tests
+ *
+ * @param saveContext
+ * @param async
+ */
+ public void saveTaskList(boolean saveContext, boolean async) {
+ if (TasksUiPlugin.getDefault() != null && TasksUiPlugin.getDefault().isInitialized()) {
+ TaskListManager taskListManager = TasksUiPlugin.getTaskListManager();
+ if (async) {
+ if (saveContext) {
+ AbstractTask task = taskListManager.getActiveTask();
+ if (task != null) {
+ taskListSaverJob.addTaskContext(task);
+ }
+ }
+ taskListSaverJob.requestSave();
+ } else {
+ taskListSaverJob.waitSaveCompleted();
+ IInteractionContextManager contextManager = ContextCore.getContextManager();
+ if (saveContext) {
+ AbstractTask task = taskListManager.getActiveTask();
+ if (task != null) {
+ contextManager.saveContext(task.getHandleIdentifier());
+ }
+ }
+ internalSaveTaskList();
+ }
+ } /*else if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().isClosing()) {
+ StatusHandler.fail(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Possible task list initialization failure, not saving list"));
+ if (!initializationWarningDialogShow) {
+ initializationWarningDialogShow = true;
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (PlatformUI.getWorkbench() != null && PlatformUI.getWorkbench().getDisplay() != null) {
+ MessageDialog.openInformation(
+ PlatformUI.getWorkbench().getDisplay().getActiveShell(),
+ ITasksUiConstants.TITLE_DIALOG,
+ "If task list is blank, Mylyn Task List may have failed to initialize.\n\n"
+ + "First, try restarting to see if that corrects the problem.\n\n"
+ + "Then, check the Error Log view for messages, and the FAQ for solutions.\n\n"
+ + ITasksUiConstants.URL_HOMEPAGE);
+ }
+ }
+ });
+ }*/
+ //}
+ }
+
+ private synchronized void internalSaveTaskList() {
+ TaskListManager taskListManager = TasksUiPlugin.getTaskListManager();
+ File current = taskListManager.getTaskListFile();
+ SimpleDateFormat format = new SimpleDateFormat(ITasksCoreConstants.TIMESTAMP_FORMAT, Locale.ENGLISH);
+ String date = format.format(new Date());
+ String backupFileName = ITasksCoreConstants.PREFIX_TASKLIST + "-" + date + ITasksCoreConstants.FILE_EXTENSION;
+
+ String destination = TasksUiPlugin.getDefault().getBackupFolderPath();
+
+ File backupFolder = new File(destination);
+ if (!backupFolder.exists()) {
+ backupFolder.mkdir();
+ }
+
+ File backup = new File(backupFolder, backupFileName);
+ if (current.renameTo(backup)) {
+ TasksUiPlugin.getBackupManager().removeOldBackups();
+
+ String newTasklistPath = TasksUiPlugin.getDefault().getDataDirectory() + File.separator
+ + ITasksCoreConstants.DEFAULT_TASK_LIST_FILE;
+ File newTaskListFile = new File(newTasklistPath);
+ taskListManager.setTaskListFile(newTaskListFile);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Unable to create task list snapshot " + backup.getAbsolutePath()));
+ }
+
+ taskListManager.getTaskListWriter().writeTaskList(taskListManager.getTaskList(),
+ taskListManager.getTaskListFile());
+ }
+
+ /**
+ * Copies all files in the current data directory to the specified folder. Will overwrite.
+ */
+ public void copyDataDirContentsTo(String targetFolderPath) {
+ saveTaskList(true, false);
+
+ File mainDataDir = new File(TasksUiPlugin.getDefault().getDataDirectory());
+
+ for (File currFile : mainDataDir.listFiles()) {
+ if (currFile.isFile()) {
+ File destFile = new File(targetFolderPath + File.separator + currFile.getName());
+ copy(currFile, destFile);
+ } else if (currFile.isDirectory()) {
+ File destDir = new File(targetFolderPath + File.separator + currFile.getName());
+ if (!destDir.exists()) {
+ if (!destDir.mkdir()) {
+ StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
+ "Unable to create destination context folder: " + destDir.getAbsolutePath()));
+ continue;
+ }
+ }
+ for (File file : currFile.listFiles()) {
+ File destFile = new File(destDir, file.getName());
+ if (destFile.exists()) {
+ destFile.delete();
+ }
+ copy(file, destFile);
+ }
+ }
+ }
+ }
+
+ // public void createTaskListBackupFile() {
+ // String path = TasksUiPlugin.getDefault().getDataDirectory() +
+ // File.separator
+ // + TasksUiPlugin.DEFAULT_TASK_LIST_FILE;
+ // File taskListFile = new File(path);
+ // String backup = path.substring(0, path.indexOf('.')) +
+ // FILE_SUFFIX_BACKUP;
+ // copy(taskListFile, new File(backup));
+ // }
+ //
+ // public String getBackupFilePath() {
+ // String path = TasksUiPlugin.getDefault().getDataDirectory() +
+ // File.separator
+ // + TasksUiPlugin.DEFAULT_TASK_LIST_FILE;
+ // return path.substring(0, path.indexOf('.')) + FILE_SUFFIX_BACKUP;
+ // }
+ //
+ // public void reverseBackup() {
+ // String path = TasksUiPlugin.getDefault().getBackupFolderPath() +
+ // File.separator
+ // + TasksUiPlugin.DEFAULT_TASK_LIST_FILE;
+ // File taskListFile = new File(path);
+ // String backup = path.substring(0, path.indexOf('.')) +
+ // FILE_SUFFIX_BACKUP;
+ // copy(new File(backup), taskListFile);
+ // }
+
+ private boolean copy(File src, File dst) {
+ try {
+ InputStream in = new FileInputStream(src);
+ OutputStream out = new FileOutputStream(dst);
+
+ // Transfer bytes from in to out
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+ in.close();
+ out.close();
+ return true;
+ } catch (IOException ioe) {
+ return false;
+ }
+ }
+
+ public void taskActivated(AbstractTask task) {
+ // ignore
+ }
+
+ public void tasksActivated(List<AbstractTask> tasks) {
+ // ignore
+ }
+
+ public void taskDeactivated(AbstractTask task) {
+ saveTaskList(true, true);
+ }
+
+ public void localInfoChanged(AbstractTask task) {
+ saveTaskList(false, true);
+ }
+
+ public void repositoryInfoChanged(AbstractTask task) {
+ // ignore
+ }
+
+ /** For testing only * */
+ public BackgroundSaveTimer getSaveTimer() {
+ return saveTimer;
+ }
+
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ saveTaskList(false, true);
+ }
+
+ public void synchronizationCompleted() {
+ // ignore
+ }
+
+ private class TaskListSaverJob extends Job {
+
+ private final Queue<AbstractTask> taskQueue = new LinkedList<AbstractTask>();
+
+ private volatile boolean saveRequested = false;
+
+ private volatile boolean saveCompleted = true;
+
+ TaskListSaverJob() {
+ super("Task List Saver");
+ setPriority(Job.LONG);
+ setSystem(true);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ while (true) {
+ if (saveRequested) {
+ saveRequested = false;
+ saveCompleted = false;
+ IInteractionContextManager contextManager = ContextCore.getContextManager();
+ while (!taskQueue.isEmpty()) {
+ AbstractTask task = taskQueue.poll();
+ if (task != null) {
+ contextManager.saveContext(task.getHandleIdentifier());
+ }
+ }
+ internalSaveTaskList();
+ }
+
+ if (!saveRequested) {
+ synchronized (this) {
+ saveCompleted = true;
+ notifyAll();
+ try {
+ wait();
+ } catch (InterruptedException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ void addTaskContext(AbstractTask task) {
+ taskQueue.add(task);
+ }
+
+ void requestSave() {
+ saveRequested = true;
+ }
+
+ void runRequested() {
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ void waitSaveCompleted() {
+ while (!saveCompleted) {
+ synchronized (this) {
+ try {
+ wait();
+ } catch (InterruptedException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ public void taskListRead() {
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskRepositoriesTableLabelProvider.java b/org.eclipse.mylyn/developer/src-old/TaskRepositoriesTableLabelProvider.java
new file mode 100644
index 0000000..eb4f958
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskRepositoriesTableLabelProvider.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 18, 2005
+ */
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.ILabelDecorator;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskRepositoriesTableLabelProvider extends DecoratingLabelProvider implements ITableLabelProvider {
+
+ public TaskRepositoriesTableLabelProvider(ILabelProvider provider, ILabelDecorator decorator) {
+ super(provider, decorator);
+ }
+
+ public String getColumnText(Object object, int index) {
+ switch (index) {
+ case 0:
+ return null;
+ case 1:
+ if (object instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) object;
+ if (repository.getRepositoryLabel() != null && repository.getRepositoryLabel().length() > 0) {
+ return repository.getRepositoryLabel();
+ } else {
+ return null;
+ }
+// else {
+// return repository.getUrl();
+// }
+ } else if (object instanceof AbstractRepositoryConnector) {
+ return ((AbstractRepositoryConnector) object).getLabel();
+ } else {
+ return getText(object);
+ }
+ case 2:
+ if (object instanceof TaskRepository) {
+ TaskRepository repository = (TaskRepository) object;
+ return repository.getUrl();
+ } else if (object instanceof AbstractRepositoryConnector) {
+ return ((AbstractRepositoryConnector) object).getLabel();
+ } else {
+ return getText(object);
+ }
+ }
+ return null;
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ return super.getImage(element);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskTest.java b/org.eclipse.mylyn/developer/src-old/TaskTest.java
new file mode 100644
index 0000000..e8911df
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskTest.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jan 24, 2005
+ */
+package org.eclipse.mylyn.tasklist.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Shawn Minto
+ *
+ * TODO: remove?
+ */
+public class TaskTest {
+ private int id = -1;
+
+ private String name = "";
+
+ private List<String> categories = new ArrayList<String>();
+
+ private List<TaskTest> taskList = new ArrayList<TaskTest>();
+
+ @Override
+ public String toString() {
+ return "Task";
+ }
+
+ public boolean isEqual(TaskTest otherTask) {
+
+ boolean result = true;
+ result = result && (this.id == otherTask.id);
+ int compare = (this.name.compareTo(otherTask.name));
+ if (compare != 0)
+ result = false;
+
+ if (this.categories.size() == otherTask.categories.size()) {
+ for (int i = 0; i < this.categories.size(); i++) {
+ compare = this.categories.get(i).compareTo(
+ otherTask.categories.get(i));
+ if (compare != 0) {
+ result = false;
+ break;
+ }
+ }
+ } else {
+ result = false;
+ }
+ if (this.taskList.size() == otherTask.taskList.size()) {
+ for (int i = 0; i < this.taskList.size(); i++) {
+ result = result
+ && (this.taskList.get(i).isEqual(otherTask.taskList
+ .get(i)));
+ }
+ } else {
+ result = false;
+ }
+ return result;
+ }
+
+ public static void printTask(TaskTest t, String tab) {
+ System.out.println(tab + "TaskID: " + t.id);
+ System.out.println(tab + "Name: " + t.name);
+ System.out.println(tab + "Categories: ");
+ for (int i = 0; i < t.categories.size(); i++) {
+ System.out.println(tab + "\t " + t.categories.get(i));
+ }
+ for (int i = 0; i < t.taskList.size(); i++) {
+ printTask(t.taskList.get(i), tab + "\t");
+ }
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ // public List<String> getCategories() {
+ // return categories;
+ // }
+ // public void setCategories(List<String> categories) {
+ // this.categories = categories;
+ // }
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public void addCategory(String category) {
+ this.categories.add(category);
+ }
+
+ /**
+ * @return Returns the categories.
+ */
+ public List<String> getCategories() {
+ return categories;
+ }
+
+ /**
+ * @param categories The categories to set.
+ */
+ public void setCategories(List<String> categories) {
+ this.categories = categories;
+ }
+
+ /**
+ * @return Returns the taskList.
+ */
+ public List<TaskTest> getTaskList() {
+ return taskList;
+ }
+
+ /**
+ * @param taskList The taskList to set.
+ */
+ public void setTaskList(List<TaskTest> taskList) {
+ this.taskList = taskList;
+ }
+
+ public void addSubTask(TaskTest sub) {
+ this.taskList.add(sub);
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/TaskscapeVizView.java b/org.eclipse.mylyn/developer/src-old/TaskscapeVizView.java
new file mode 100644
index 0000000..f5b13fa
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TaskscapeVizView.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 4, 2005
+ */
+package org.eclipse.mylyn.sandbox.springviz;
+
+import java.awt.*;
+import java.awt.event.*;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.awt.SWT_AWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ViewPart;
+
+import edu.berkeley.guir.prefuse.*;
+import edu.berkeley.guir.prefuse.action.RepaintAction;
+import edu.berkeley.guir.prefuse.action.assignment.ColorFunction;
+import edu.berkeley.guir.prefuse.action.filter.GraphFilter;
+import edu.berkeley.guir.prefuse.activity.ActionList;
+import edu.berkeley.guir.prefuse.activity.Activity;
+import edu.berkeley.guir.prefuse.graph.Graph;
+import edu.berkeley.guir.prefuse.graph.GraphLib;
+import edu.berkeley.guir.prefuse.render.*;
+import edu.berkeley.guir.prefusex.controls.*;
+import edu.berkeley.guir.prefusex.force.*;
+import edu.berkeley.guir.prefusex.layout.ForceDirectedLayout;
+
+/**
+ * @author Mik Kersten
+ */
+public class TaskscapeVizView extends ViewPart {
+
+ public TaskscapeVizView() {
+ super();
+ }
+
+ public void createPartControl(Composite parent) {
+ try {
+ System.setProperty("sun.awt.noerasebackground", "true");
+ } catch (NoSuchMethodError error) {
+ }
+ Composite stuff = new Composite(parent, SWT.EMBEDDED);
+ java.awt.Frame frame = SWT_AWT.new_Frame(stuff);
+// final java.awt.Label statusLabel = new java.awt.Label();
+// statusFrame.add(statusLabel);
+
+// String file = ("C:/Dev/mylar-workspace/prefuse/etc/friendster.xml");
+ Graph g = GraphLib.getGrid(5,5);
+
+ System.out.println("Visualizing Graph: "
+ +g.getNodeCount()+" nodes, "+g.getEdgeCount()+" edges");
+
+ ForceSimulator fsim = new ForceSimulator();
+ fsim.addForce(new NBodyForce(-0.4f, -1f, 0.9f));
+ fsim.addForce(new SpringForce(4E-5f, 75f));
+ fsim.addForce(new DragForce(-0.005f));
+
+ ForceDemo fdemo = new ForceDemo(g, fsim);
+ fdemo.runDemo(frame);
+ }
+
+ public void setFocus() {
+ }
+
+}
+
+class ForceDemo extends Display {
+ private static final long serialVersionUID = 1L;
+
+ private ForcePanel fpanel;
+
+ private ForceSimulator m_fsim;
+ private String m_textField;
+ private ItemRegistry m_registry;
+ private Activity m_actionList;
+
+ private Font frameCountFont = new Font("SansSerif", Font.PLAIN, 14);
+
+ public ForceDemo(Graph g, ForceSimulator fsim) {
+ this(g, fsim, "label");
+ } //
+
+ public ForceDemo(Graph g, ForceSimulator fsim, String textField) {
+ // set up component first
+ m_fsim = fsim;
+ m_textField = textField;
+ m_registry = new ItemRegistry(g);
+ this.setItemRegistry(m_registry);
+ initRenderers();
+ m_actionList = initActionList();
+ setSize(700,700);
+ pan(350,350);
+ this.addControlListener(new NeighborHighlightControl());
+ this.addControlListener(new DragControl(false, true));
+ this.addControlListener(new FocusControl(0));
+ this.addControlListener(new PanControl(false));
+ this.addControlListener(new ZoomControl(false));
+ } //
+
+ public void runDemo(final java.awt.Frame frame) {
+ // now set up application window
+ fpanel = new ForcePanel(m_fsim) {
+ private static final long serialVersionUID = 3617009741533296438L;
+
+ public void update(java.awt.Graphics g) {
+ /* Do not erase the background */
+ paint(g);
+ }
+ };
+
+// frame = new Frame("Force Simulator Demo");
+// Container c = frame.getContentPane();
+ frame.setLayout(new BorderLayout());
+ frame.add(this, BorderLayout.CENTER);
+ frame.add(fpanel, BorderLayout.EAST);
+ frame.addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ System.exit(0);
+ }
+ });
+ frame.addComponentListener(new ComponentAdapter() {
+ public void componentResized(ComponentEvent e) {
+ Dimension d = frame.getSize();
+ Dimension p = fpanel.getSize();
+ Insets in = frame.getInsets();
+ ForceDemo.this.setSize(d.width-in.left-in.right-p.width,
+ d.height-in.top-in.bottom);
+ } //
+
+ });
+ frame.pack();
+ frame.setVisible(true);
+
+ // start force simulation
+ m_actionList.runNow();
+ } //
+
+ private void initRenderers() {
+ TextItemRenderer nodeRenderer = new TextItemRenderer();
+ nodeRenderer.setRenderType(TextItemRenderer.RENDER_TYPE_FILL);
+ nodeRenderer.setRoundedCorner(8,8);
+ nodeRenderer.setTextAttributeName(m_textField);
+ DefaultNodeRenderer nRenderer = new DefaultNodeRenderer();
+ DefaultEdgeRenderer edgeRenderer = new DefaultEdgeRenderer();
+ m_registry.setRendererFactory(new DefaultRendererFactory(
+ nodeRenderer, edgeRenderer, null));
+ } //
+
+ private ActionList initActionList() {
+ ActionList actionList = new ActionList(m_registry,-1,20);
+ actionList.add(new GraphFilter());
+ actionList.add(new ForceDirectedLayout(m_fsim, false, false));
+ actionList.add(new DemoColorFunction());
+ actionList.add(new RepaintAction());
+ return actionList;
+ } //
+
+ public class DemoColorFunction extends ColorFunction {
+ private Color pastelRed = new Color(255,125,125);
+ private Color pastelOrange = new Color(255,200,125);
+ private Color lightGray = new Color(220,220,255);
+ public Paint getColor(VisualItem item) {
+ if ( item instanceof EdgeItem ) {
+ if ( item.isHighlighted() )
+ return pastelOrange;
+ else
+ return Color.LIGHT_GRAY;
+ } else {
+ return Color.BLACK;
+ }
+ } //
+ public Paint getFillColor(VisualItem item) {
+ if ( item.isHighlighted() )
+ return pastelOrange;
+ else if ( item instanceof NodeItem ) {
+ if ( item.isFocus() )
+ return pastelRed;
+ else
+ return lightGray;
+ } else {
+ return Color.BLACK;
+ }
+ } //
+ } //
+
+} // end of class ForceDemo
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/TimingStuff.jpage b/org.eclipse.mylyn/developer/src-old/TimingStuff.jpage
new file mode 100644
index 0000000..3680237
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/TimingStuff.jpage
@@ -0,0 +1,16 @@
+//MylarPlugin.log(this, "text changed: " + event);
+//if (javaEditingTimer == null) {
+// javaEditingTimer = new PassiveTimer();
+// javaEditingTimer.restart();
+//}
+//if (keystrokeTimer != null) keystrokeTimer.stop();
+//keystrokeTimer = new ActiveTimer(
+// KEYSTROKE_TIMOUT,
+// new IActiveTimerListener() {
+// public void fireTimedOut() {
+// MylarPlugin.getUserManager().getCurrentSession().appendToTimeJavaEditing(
+// javaEditingTimer.getElapsedInSeconds()
+// );
+// javaEditingTimer = null;
+// }
+// });
diff --git a/org.eclipse.mylyn/developer/src-old/UserSelectionMonitor.java b/org.eclipse.mylyn/developer/src-old/UserSelectionMonitor.java
new file mode 100644
index 0000000..2a415f8
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/UserSelectionMonitor.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 8, 2005
+ */
+package org.eclipse.mylyn.monitor;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaOutlinePage;
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.text.*;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.search2.internal.ui.SearchView;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+import org.eclipse.ui.views.markers.internal.ProblemView;
+
+import org.eclipse.mylyn.core.AbstractSelectionMonitor;
+import org.eclipse.mylyn.monitor.stats.UsageSession;
+import org.eclipse.mylyn.monitor.views.UsageStatisticsView;
+
+/**
+ * @author Mik Kersten
+ */
+public class UserSelectionMonitor extends AbstractSelectionMonitor {
+
+ private final ITextListener TEXT_LISTENER = new ITextListener() {
+ public void textChanged(TextEvent event) {
+ MonitorPlugin.getStatisticsManager().getCurrentSession().getCardinalStatistic(
+ UsageSession.NUM_KEYSTROKES_JAVA_EDITOR).increment();
+ }
+ };
+
+ public UserSelectionMonitor() {
+ super();
+ }
+
+ public void handleElementSelection(IJavaElement selected) {
+ }
+
+ protected void handleUnknownSelection(Object selectedObject) {
+ }
+
+ public void handleReferenceNavigation(IJavaElement from, IJavaElement to) {
+ }
+
+ protected void handleSelection(File file) {
+ }
+
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection) {
+ UsageSession session = MonitorPlugin.getStatisticsManager().getCurrentSession();
+ if (part instanceof PackageExplorerPart) {
+ session.getCardinalStatistic(UsageSession.NUM_SELECTIONS_PKG_EXPLORER).increment();
+ } else if (part instanceof ContentOutline) {
+ ContentOutline outline = (ContentOutline)part;
+ if (outline.getCurrentPage() instanceof JavaOutlinePage) {
+ session.getCardinalStatistic(UsageSession.NUM_SELECTIONS_JAVA_OUTLINE).increment();
+ }
+ } else if (part instanceof SearchView) {
+ session.getCardinalStatistic(UsageSession.NUM_SELECTIONS_SEARCH).increment();
+ } else if (part instanceof ProblemView) {
+ session.getCardinalStatistic(UsageSession.NUM_SELECTIONS_PROBLEMS).increment();
+ } else if (part instanceof AbstractTextEditor) {
+ session.getCardinalStatistic(UsageSession.NUM_SELECTIONS_JAVA_EDITOR).increment();
+ } else {
+ session.getCardinalStatistic(UsageSession.NUM_SELECTIONS_OTHER).increment();
+// MonitorPlugin.log(this, "unknow selection from: " + part.getClass());
+ }
+ if (UsageStatisticsView.getDefault() != null) {
+ UsageStatisticsView.getDefault().getViewer().refresh();
+ }
+ if (part instanceof AbstractTextEditor) {
+ if (selection instanceof TextSelection && part instanceof JavaEditor) {
+ JavaEditor currentEditor = (JavaEditor)part;
+ currentEditor.getViewer().removeTextListener(TEXT_LISTENER); // in case already added
+ currentEditor.getViewer().addTextListener(TEXT_LISTENER);
+ }
+ }
+ }
+
+ public void handleImplementorNavigation(IJavaElement from, IJavaElement to) {
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaActiveSearchTest.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaActiveSearchTest.java
new file mode 100644
index 0000000..33fd05b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaActiveSearchTest.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+import org.eclipse.mylyn.internal.sandbox.bridge.bugs.BugzillaMylynSearch;
+import org.eclipse.mylyn.internal.sandbox.bridge.bugs.BugzillaReportInfo;
+import org.eclipse.mylyn.internal.sandbox.bridge.bugs.MylynBugsManager;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.TaskTask;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.java.tests.search.SearchPluginTestHelper;
+import org.eclipse.mylyn.java.tests.search.WorkspaceSetupHelper;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/*
+ * TEST CASES TO HANDLE 1. what is here 2. different scopes ( local and remote )
+ * 3. no bugs 4. offline bugs
+ *
+ * DEGREE OF SEPARATIONS 1 Local bug, qualified reference 2 local bug,
+ * unqualified reference 3 remote bug, qualified reference 4 remote bug,
+ * unqualified reference 5 NONE
+ */
+
+/**
+ * Test the bugzilla search functionality of the bridge
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaActiveSearchTest extends TestCase {
+
+ private TaskRepository repository;
+
+ // SHAWNTODO Add tests for the different types of searches (local qual,
+ // local unqual, fully qual, unqual) and mock up a bugs db for testing
+
+ /** The expected number of results when searching for astNode */
+ // SHAWNTODO add back in when we have a test server mocked up
+ // private static final int NUM_AST_RESULTS = 302;
+ //
+ // private static final int NUM_AST_SETSOURCERANGE_RESULTS = 15;
+ /** list to add collectors to when notified */
+ private final List<List<?>> lists = new ArrayList<List<?>>();
+
+ private IType astNodeType;
+
+ @Override
+ protected void setUp() throws Exception {
+ WorkspaceSetupHelper.setupWorkspace();
+ repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+
+ IJavaProject jp = WorkspaceSetupHelper.getJdtCoreDomProject();
+ astNodeType = WorkspaceSetupHelper.getType(jp, "org.eclipse.jdt.core.dom.ASTNode");
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ WorkspaceSetupHelper.clearDoiModel();
+ TasksUiPlugin.getRepositoryManager().removeRepository(repository,
+ TasksUiPlugin.getDefault().getRepositoriesFilePath());
+ }
+
+ /**
+ * Test adding and removing ISearchCompletedListeners
+ */
+ public void testSearchCompletedListenerAddAndRemove() {
+ lists.clear();
+
+ // create 2 listeners
+ IActiveSearchListener l1 = new IActiveSearchListener() {
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> l) {
+ lists.add(l);
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ };
+ IActiveSearchListener l2 = new IActiveSearchListener() {
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> l) {
+ lists.add(l);
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ };
+
+ BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.UNQUAL, astNodeType,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+
+ // add the first listener
+ s.addListener(l1);
+ // remove the first listener
+ s.removeListener(l1);
+
+ // perform the search
+ SearchPluginTestHelper.search(s, l2);
+
+ // make sure that only the second listener added has any results left
+ assertTrue("listener was not removed", lists.size() >= 1 && !l1.resultsGathered());
+ assertTrue("listener was not added", lists.size() == 1);
+
+ // display the time it took for the search
+ MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
+ }
+
+ /**
+ * Tests that the bridge gets the right data for us This test is wierd because it waits on results.
+ */
+ public void testBridge() {
+ lists.clear();
+ BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.UNQUAL, astNodeType,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+
+ IActiveSearchListener l = new IActiveSearchListener() {
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> results) {
+ lists.add(results);
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ };
+
+ // perform the search
+ SearchPluginTestHelper.search(s, l);
+
+ // make sure we got the right number of bugs back
+ assertTrue("No collector returned", lists.size() != 0);
+ List<?> c = lists.get(0);
+ assertTrue("Results not the right size", c.size() > 0); // TODO should
+ // be
+ // assertEquals
+ // on expected
+ // size
+
+ // display the time it took for the search and the results returned
+ MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
+
+ }
+
+ /**
+ * Tests that the bridge saves the results of a search so that it can be used later
+ */
+ public void testSaveResults() {
+ lists.clear();
+ BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.UNQUAL, astNodeType,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+
+ IActiveSearchListener l = new IActiveSearchListener() {
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> results) {
+ lists.add(results);
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ };
+
+ // perform the search
+ SearchPluginTestHelper.search(s, l);
+
+ // do an inital search
+ assertTrue("No collectors returned", lists.size() != 0);
+ List<?> c = lists.get(0);
+ assertTrue("Results not the right size", c.size() > 0);
+ // TODO should be assertEquals on expected size
+
+ // check that the search has been saved
+ List<BugzillaReportInfo> saved = MylynBugsManager.getBridge().getFromLandmarksHash(astNodeType,
+ BugzillaMylynSearch.UNQUAL);
+ assertTrue("Results not cached", saved != null);
+ if (saved == null) {
+ fail();
+ } else {
+ assertTrue("Results not the right size", saved.size() > 0);
+ // TODO should be assertEquals on expected size
+
+ assertTrue(c.containsAll(saved) && saved.containsAll(c));
+ MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
+ }
+ }
+
+ public void testLocalBugUnqual() throws InterruptedException {
+ lists.clear();
+
+ String bugPrefix = "<server>-";
+
+ TaskListManager manager = TasksUiPlugin.getTaskListManager();
+ TaskCategory cat = new TaskCategory("Testing Category");
+ manager.getTaskList().addCategory(cat);
+ AbstractTask bugTask1 = new TaskTask(bugPrefix, "" + 94185, "<bugzilla info>");
+
+ manager.getTaskList().addTask(bugTask1, cat);
+ // cat.addTask(bugTask1);
+ while (bugTask1.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+ AbstractTask bugTask2 = new TaskTask(bugPrefix, "" + 3692, "<bugzilla info>");
+ manager.getTaskList().addTask(bugTask2, cat);
+ // cat.addTask(bugTask2);
+ while (bugTask2.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+ AbstractTask bugTask3 = new TaskTask(bugPrefix, "" + 3693, "<bugzilla info>");
+ manager.getTaskList().addTask(bugTask3, cat);
+ // cat.addTask(bugTask3);
+ while (bugTask3.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+
+ AbstractTask bugTask4 = new TaskTask(bugPrefix, "" + 9583, "<bugzilla info>");
+ manager.getTaskList().addTask(bugTask4, cat);
+ // cat.addTask(bugTask4);
+ while (bugTask4.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+
+ BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.LOCAL_UNQUAL, astNodeType,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+
+ IActiveSearchListener l = new IActiveSearchListener() {
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> results) {
+ lists.add(results);
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ };
+
+ // perform the search
+ SearchPluginTestHelper.search(s, l);
+
+ // do an inital search
+ assertTrue("No collectors returned", lists.size() != 0);
+ List<?> c = lists.get(0);
+ assertEquals("Results not the right size", 3, c.size());
+
+ MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
+ TasksUiPlugin.getTaskList().deleteCategory(cat);
+ }
+
+ // TODO need to test a bug that wraps...should fail since we can only search
+ // on a single line
+ public void testLocalBugFullyQual() throws InterruptedException {
+ lists.clear();
+
+ String bugPrefix = "Bugzilla-";
+
+ TaskListManager manager = TasksUiPlugin.getTaskListManager();
+ TaskCategory cat = new TaskCategory("Testing Category");
+ manager.getTaskList().addCategory(cat);
+ AbstractTask bugTask1 = new TaskTask(bugPrefix, "" + 94185, "<bugzilla info>");
+ manager.getTaskList().addTask(bugTask1, cat);
+ // cat.addTask(bugTask1);
+ while (bugTask1.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+
+ AbstractTask bugTask2 = new TaskTask(bugPrefix, "" + 9583, "<bugzilla info>");
+ manager.getTaskList().addTask(bugTask2, cat);
+ // cat.addTask(bugTask2);
+ while (bugTask2.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+ AbstractTask bugTask3 = new TaskTask(bugPrefix, "" + 3693, "<bugzilla info>");
+ manager.getTaskList().addTask(bugTask3, cat);
+ // cat.addTask(bugTask3);
+ while (bugTask3.isSynchronizing()) {
+ Thread.sleep(500);
+ }
+
+ BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.LOCAL_QUAL, astNodeType,
+ IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
+
+ IActiveSearchListener l = new IActiveSearchListener() {
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> results) {
+ lists.add(results);
+ gathered = true;
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+ };
+
+ // perform the search
+ SearchPluginTestHelper.search(s, l);
+
+ // do an inital search
+ assertTrue("No collectors returned", lists.size() != 0);
+ List<?> c = lists.get(0);
+ assertEquals("Results not the right size", 1, c.size());
+
+ MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
+ TasksUiPlugin.getTaskList().deleteCategory(cat);
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaContextLabelProvider.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaContextLabelProvider.java
new file mode 100644
index 0000000..ae245e4
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaContextLabelProvider.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.context.core.ContextCore;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.core.IInteractionRelation;
+import org.eclipse.mylyn.internal.context.ui.AbstractContextLabelProvider;
+import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaContextLabelProvider extends AbstractContextLabelProvider {
+
+ @Override
+ protected Image getImage(IInteractionElement node) {
+ return CommonImages.getImage(TasksUiImages.TASK_REMOTE);
+ }
+
+ @Override
+ protected Image getImage(IInteractionRelation edge) {
+ return ContextUiImages.getImage(MylynBugsManager.EDGE_REF_BUGZILLA);
+ }
+
+ @Override
+ protected Image getImageForObject(Object object) {
+ return CommonImages.getImage(TasksUiImages.TASK_REMOTE);
+ }
+
+ @Override
+ protected String getTextForObject(Object node) {
+ return "" + node;
+ }
+
+ /**
+ * TODO: slow?
+ */
+ @Override
+ protected String getText(IInteractionElement node) {
+ // try to get from the cache before downloading
+ Object report;
+ BugzillaReportInfo reportNode = MylynBugsManager.getReferenceProvider().getCached(node.getHandleIdentifier());
+ AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(BugzillaStructureBridge.CONTENT_TYPE);
+
+ if (reportNode != null) {
+ report = reportNode;
+ } else {
+ report = bridge.getObjectForHandle(node.getHandleIdentifier());
+ }
+ return bridge.getLabel(report);
+ }
+
+ @Override
+ protected String getText(IInteractionRelation edge) {
+ return BugzillaReferencesProvider.NAME;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaEditingMonitor.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaEditingMonitor.java
new file mode 100644
index 0000000..bbc9fb6
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaEditingMonitor.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection;
+import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaEditingMonitor extends AbstractUserInteractionMonitor {
+
+ public BugzillaEditingMonitor() {
+ super();
+ }
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
+ if (!(part instanceof AbstractRepositoryTaskEditor) && !(part instanceof TaskEditor)) {
+ return;
+ }
+
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection ss = (StructuredSelection) selection;
+ Object object = ss.getFirstElement();
+ if (object instanceof RepositoryTaskSelection) {
+ super.handleElementSelection(part, object, contributeToContext);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearch.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearch.java
new file mode 100644
index 0000000..3c32e94
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearch.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.mylyn.context.core.InterestComparator;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+
+/**
+ * Used to facilitate bugzilla searches based on IJavaElements
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaMylynSearch implements IActiveSearchOperation {
+
+ // scope identifiers
+ public static final int LOCAL_QUAL = 1; // local implies a bugzilla task,
+
+ // not just an offline report
+
+ public static final int LOCAL_UNQUAL = 2;
+
+ public static final int FULLY_QUAL = 3;
+
+ public static final int UNQUAL = 4;
+
+ private final int scope;
+
+ private final IJavaElement element;
+
+ private String handle = "";
+
+ private String serverUrl = "";
+
+ /**
+ * Constructor
+ *
+ * @param scope
+ * The scope of this search
+ */
+ public BugzillaMylynSearch(int scope, IJavaElement element, String serverUrl) {
+ this.scope = scope;
+ this.element = element;
+ this.serverUrl = serverUrl;
+ }
+
+ public IStatus run(IProgressMonitor monitor) {
+ return run(monitor, Job.DECORATE);
+ }
+
+ public IStatus run(IProgressMonitor monitor, int priority) {
+ handle = element.getHandleIdentifier() + " " + scope;
+ List<IJavaElement> landmarks = new ArrayList<IJavaElement>();
+ landmarks.add(element);
+
+ if (!BugzillaSearchManager.doesJobExist(handle)) {
+
+ // perform the bugzilla search
+ // get only the useful landmarks (IMember)
+ List<IMember> members = getMemberLandmarks(landmarks);
+
+ // go through all of the landmarks that we are given and perform a
+ // search on them
+ for (IMember m : members) {
+
+ // FIXME: decide whether to do leave the caching of searches in
+ // for now or not
+ // check if we have the info cached
+ // List<BugzillaReportNode> landmarkDoi =
+ // MylarTaskListPlugin.getBridge()
+ // .getFromLandmarksHash(m, scope);
+
+ // if (landmarkDoi != null) {
+ // //TODO decide when to queue up and do a refresh search
+ // notifySearchCompleted(landmarkDoi);
+ // continue;
+ // }
+
+ // create a search operation so that we can search
+ BugzillaMylynSearchOperation op = new BugzillaMylynSearchOperation(this, m, scope);
+
+ // create a new search job so that it can be scheduled and
+ // run as a background thread
+ Job searchJob = new BugzillaMylynSearchJob("Querying Bugzilla Server - Mylar - "
+ + op.getSearchMemberName(), op);
+
+ // schedule the new search job
+ searchJob.setPriority(priority);
+ searchJob.schedule();
+
+ // save this searchJobs handle so that we can cancel it if need
+ // be
+ BugzillaSearchManager.addJob(handle, searchJob);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ /** List of listeners wanting to know about the searches */
+ private final List<IActiveSearchListener> listeners = new ArrayList<IActiveSearchListener>();
+
+ /**
+ * Add a listener for when the bugzilla search is completed
+ *
+ * @param l
+ * The listener to add
+ */
+ public void addListener(IActiveSearchListener l) {
+ // add the listener to the list
+ listeners.add(l);
+ }
+
+ /**
+ * Remove a listener for when the bugzilla search is completed
+ *
+ * @param l
+ * The listener to remove
+ */
+ public void removeListener(IActiveSearchListener l) {
+ // remove the listener from the list
+ listeners.remove(l);
+ }
+
+ /**
+ * Notify all of the listeners that the bugzilla search is completed
+ *
+ * @param doiList
+ * A list of BugzillaSearchHitDoiInfo
+ * @param member
+ * The IMember that the search was performed on
+ */
+ public void notifySearchCompleted(List<BugzillaReportInfo> doiList) {
+ // go through all of the listeners and call searchCompleted(colelctor,
+ // member)
+ BugzillaSearchManager.removeSearchJob(handle);
+ for (IActiveSearchListener listener : listeners) {
+ listener.searchCompleted(doiList);
+ }
+ }
+
+ /**
+ * Get only the landmarks that are IMember and sort them according to their DOI value (highest to lowest)
+ *
+ * @param landmarks
+ * The landmarks to check
+ * @return List of IMember landmarks sorted by DOI value
+ */
+ public static List<IMember> getMemberLandmarks(List<IJavaElement> landmarks) {
+ List<IMember> memberLandmarks = new ArrayList<IMember>();
+
+ for (IJavaElement je : landmarks) {
+
+ // keep only the IMember landmarks
+ if (je instanceof IMember) {
+ memberLandmarks.add((IMember) je);
+ }
+ }
+
+ // sort the landmarks
+ Collections.sort(memberLandmarks, new InterestComparator<IMember>());
+
+ return memberLandmarks;
+ }
+
+ public String getServerUrl() {
+ return serverUrl;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearchJob.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearchJob.java
new file mode 100644
index 0000000..d8a45db
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearchJob.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * The bugzilla search job used to search a bugzilla site
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class BugzillaMylynSearchJob extends Job {
+
+ /** The search operation used to perform the query */
+ private final BugzillaMylynSearchOperation operation;
+
+ /**
+ * Constructor
+ *
+ * @param name
+ * Job name
+ * @param operation
+ * The operation to perform the search query
+ */
+ public BugzillaMylynSearchJob(String name, BugzillaMylynSearchOperation operation) {
+ super(name);
+ this.operation = operation;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ final IStatus[] status = new IStatus[1];
+
+ try {
+ // execute the search operation
+ operation.execute(monitor);
+
+ // get the status of the search operation
+ status[0] = operation.getStatus();
+
+ // determine if there was an error, if it was cancelled, or if it is
+ // ok
+ if (status[0] == null) {
+
+ } else if (status[0].getCode() == IStatus.CANCEL) {
+ // it was cancelled, so just return
+ status[0] = Status.OK_STATUS;
+
+ // make sure that we know this job is not running anymore
+ BugzillaSearchManager.removeSearchJob(operation.getSearchMember().getHandleIdentifier() + " "
+ + operation.getScope());// runningJobs.remove(operation.getSearchMember());
+ return status[0];
+ } else if (!status[0].isOK()) {
+ // there was an error, so display an error message
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(null, "Bugzilla Search Error", null, status[0]);
+ }
+ });
+ status[0] = Status.OK_STATUS;
+
+ // make sure we know that this job is not running anymore
+ BugzillaSearchManager.removeSearchJob(operation.getSearchMember().getHandleIdentifier() + " "
+ + operation.getScope());// runningJobs.remove(operation.getSearchMember());
+ return status[0];
+ }
+ } catch (LoginException e) {
+ // we had a problem while searching that seems like a login info
+ // problem
+ // thrown in BugzillaSearchOperation
+ MessageDialog.openError(
+ null,
+ "Login Error",
+ "Bugzilla could not log you in to get the information you requested since login name or password is incorrect.\nPlease check your settings in the bugzilla preferences. ");
+ BugzillaCorePlugin.log(new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, IStatus.OK, "", e));
+ } finally {
+ // make sure that we know that this job is not running anymore
+ BugzillaSearchManager.removeSearchJob(operation.getSearchMember().getHandleIdentifier() + " "
+ + operation.getScope());// .runningJobs.remove(operation.getSearchMember());
+ }
+
+ return status[0];
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearchOperation.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearchOperation.java
new file mode 100644
index 0000000..54f30e8
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaMylynSearchOperation.java
@@ -0,0 +1,540 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.TaskFactory;
+import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+/**
+ * Bugzilla search operation for Mylar
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class BugzillaMylynSearchOperation extends WorkspaceModifyOperation implements IBugzillaSearchOperation {
+
+ /** The IMember we are doing the search for */
+ private final IMember javaElement;
+
+ /** The bugzilla collector for the search */
+ private ProgressQueryHitCollector collector = null;//SearchHitCollector
+
+ /** The status of the search operation */
+ private IStatus status;
+
+ /** The LoginException that was thrown when trying to do the search */
+ private LoginException loginException = null;
+
+ /** The fully qualified name of the member we are searching for */
+ private final String name;
+
+ /** The bugzilla search query */
+ private AbstractRepositorySearchQuery query;
+
+ private final BugzillaMylynSearch search;
+
+ private final int scope;
+
+ public BugzillaMylynSearchOperation(BugzillaMylynSearch search, IMember m, int scope) {
+ this.javaElement = m;
+ this.search = search;
+ this.scope = scope;
+ name = getFullyQualifiedName(m);
+ }
+
+ /**
+ * Get the fully qualified name of a IMember TODO: move to a more central location so that others can use this, but
+ * don't want to add unecessary coupling
+ *
+ * @return String representing the fully qualified name
+ */
+ public static String getFullyQualifiedName(IJavaElement je) {
+ if (!(je instanceof IMember)) {
+ return null;
+ }
+
+ IMember m = (IMember) je;
+ if (m.getDeclaringType() == null) {
+ return ((IType) m).getFullyQualifiedName();
+ } else {
+ return m.getDeclaringType().getFullyQualifiedName() + "." + m.getElementName();
+ }
+ }
+
+ @Override
+ public void execute(IProgressMonitor monitor) {
+
+ ProgressQueryHitCollector searchCollector = null;
+
+ if (scope == BugzillaMylynSearch.FULLY_QUAL) {
+ searchCollector = searchQualified(search.getServerUrl(), monitor);
+ } else if (scope == BugzillaMylynSearch.UNQUAL) {
+ searchCollector = searchUnqualified(search.getServerUrl(), monitor);
+ } else if (scope == BugzillaMylynSearch.LOCAL_QUAL) {
+ searchCollector = searchLocalQual(monitor);
+ } else if (scope == BugzillaMylynSearch.LOCAL_UNQUAL) {
+ searchCollector = searchLocalUnQual(monitor);
+ } else {
+ status = Status.OK_STATUS;
+ return;
+ }
+
+ if (searchCollector == null) {
+ search.notifySearchCompleted(new ArrayList<BugzillaReportInfo>());
+ return;
+ }
+
+ Set<AbstractTask> l = searchCollector.getTasks();
+
+ // get the list of doi elements
+ List<BugzillaReportInfo> doiList = getDoiList(l);
+
+ // we completed the search, so notify all of the listeners
+ // that the search has been completed
+ MylynBugsManager.getBridge().addToLandmarksHash(doiList, javaElement, scope);
+ search.notifySearchCompleted(doiList);
+ // MIK: commmented out logging
+ // MonitorPlugin.log(this, "There were " + doiList.size() + " items
+ // found");
+ }
+
+ /**
+ * Search the local bugs for the member using the qualified name
+ *
+ * @param monitor
+ * The progress monitor to search with
+ * @return The QueryHitCollector with the results of the search
+ */
+ @SuppressWarnings("deprecation")
+ private ProgressQueryHitCollector searchLocalQual(IProgressMonitor monitor) {
+
+ // get the fully qualified name for searching
+ String elementName = getFullyQualifiedName(javaElement);
+
+ // setup the search result collector
+ collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
+ //collector.setOperation(this);
+ collector.setProgressMonitor(monitor);
+
+ // get all of the root tasks and start the search
+ // FIXME
+// Set<AbstractTask> tasks = TasksUiPlugin.getTaskList().getOrphanContainer(
+// LocalRepositoryConnector.REPOSITORY_URL).getChildren();
+ Set<ITask> tasks = new HashSet<ITask>();
+ searchLocal(tasks, collector, elementName, monitor);
+ for (AbstractTaskCategory cat : TasksUiPlugin.getTaskList().getTaskCategories()) {
+ searchLocal(cat.getChildren(), collector, elementName, monitor);
+ }
+
+ // return the collector
+ return collector;
+ }
+
+ /**
+ * Search the local bugs for the member using the unqualified name
+ *
+ * @param monitor
+ * The progress monitor to search with
+ * @return The QueryHitCollector with the results of the search
+ */
+ @SuppressWarnings("deprecation")
+ private ProgressQueryHitCollector searchLocalUnQual(IProgressMonitor monitor) {
+
+ // get the element name for searching
+ String elementName = javaElement.getElementName();
+
+ // setup the search result collector
+ collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
+ //collector.setOperation(this);
+ collector.setProgressMonitor(monitor);
+
+ // get all of the root tasks and start the search
+ // FIXME
+// Set<AbstractTask> tasks = TasksUiPlugin.getTaskList().getOrphanContainer(
+// LocalRepositoryConnector.REPOSITORY_URL).getChildren();
+ Set<ITask> tasks = new HashSet<ITask>();
+ searchLocal(tasks, collector, elementName, monitor);
+ for (AbstractTaskCategory cat : TasksUiPlugin.getTaskList().getTaskCategories()) {
+ searchLocal(cat.getChildren(), collector, elementName, monitor);
+ }
+ // return the collector
+ return collector;
+ }
+
+ /**
+ * Search the local bugs for the member
+ *
+ * @param tasks
+ * The tasks to search
+ * @param searchCollector
+ * The collector to add the results to
+ * @param elementName
+ * The name of the element that we are looking for
+ * @param monitor
+ * The progress monitor
+ */
+ private void searchLocal(Collection<ITask> tasks, ProgressQueryHitCollector searchCollector, String elementName,
+ IProgressMonitor monitor) {
+ if (tasks == null) {
+ return;
+ }
+
+ // go through all of the tasks
+ for (ITask task : tasks) {
+ monitor.worked(1);
+
+ // check what kind of task it is
+// if (task instanceof BugzillaTask) {
+
+ // we have a bugzilla task, so get the bug report
+// BugzillaTask bugTask = (BugzillaTask) task;
+ RepositoryTaskData bugTaskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(
+ task.getRepositoryUrl(), task.getTaskId());
+ //RepositoryTaskData bugTaskData = bugTask.getTaskData();
+
+ // parse the bug report for the element that we are searching
+ // for
+ boolean isHit = search(elementName, bugTaskData);
+
+ // determine if we have a hit or not
+ if (isHit) {
+// // make a search hit from the bug and then add it to the collector
+// BugzillaQueryHit hit = new BugzillaQueryHit(TasksUiPlugin.getTaskList(), bugTaskData.getDescription(), "", bugTaskData.getRepositoryUrl(), bugTaskData.getId(), null, "");
+// BugzillaTask task = new BugzillaTask();
+ // FIXME
+ // searchCollector.accept(bugTask);
+ }
+// }
+ }
+ status = Status.OK_STATUS;
+ }
+
+ /**
+ * Search the bug for the given element name
+ *
+ * @param elementName
+ * The name of the element to search for
+ * @param bug
+ * The bug to search in
+ */
+ private boolean search(String elementName, RepositoryTaskData bug) {
+
+ if (bug == null) {
+ return false; // MIK: added null check here
+ }
+ String description = bug.getDescription();
+ String summary = bug.getSummary();
+ List<TaskComment> taskComments = bug.getComments();
+
+ // search the summary and the summary
+ if (Util.hasElementName(elementName, summary)) {
+ return true;
+ }
+
+ if (Util.hasElementName(elementName, description)) {
+ return true;
+ }
+
+ Iterator<TaskComment> comItr = taskComments.iterator();
+ while (comItr.hasNext()) {
+ TaskComment taskComment = comItr.next();
+ String commentText = taskComment.getText();
+ // search the text for a reference to the element
+ if (Util.hasElementName(elementName, commentText)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Perform the actual search on the Bugzilla server
+ *
+ * @param url
+ * The url to use for the search
+ * @param searchCollector
+ * The collector to put the search results into
+ * @param monitor
+ * The progress monitor to use for the search
+ * @return The QueryHitCollector with the search results
+ */
+ private ProgressQueryHitCollector search(String url, TaskRepository repository,
+ ProgressQueryHitCollector searchCollector, IProgressMonitor monitor) {
+
+ // set the initial number of matches to 0
+ int matches = 0;
+ // setup the progress monitor and start the search
+ searchCollector.setProgressMonitor(monitor);
+
+ BugzillaSearchEngine engine = new BugzillaSearchEngine(repository, url);
+ try {
+ // perform the search
+ status = engine.search(searchCollector, matches);
+
+ // check the status so that we don't keep searching if there
+ // is a problem
+ if (status.getCode() == IStatus.CANCEL) {
+ return null;
+ } else if (!status.isOK()) {
+ MultiStatus errorStatus = new MultiStatus(SandboxUiPlugin.ID_PLUGIN, 0, "Search error", null);
+ errorStatus.add(status);
+ StatusHandler.fail(errorStatus);
+ return null;
+ }
+ return searchCollector;
+ } catch (LoginException e) {
+ // save this exception to throw later
+ this.loginException = e;
+ }
+ return null;
+ }
+
+ /**
+ * Perform a search for qualified instances of the member
+ *
+ * @param monitor
+ * The progress monitor to use
+ * @return The QueryHitCollector with the search results
+ */
+ @SuppressWarnings("deprecation")
+ private ProgressQueryHitCollector searchQualified(String repositoryUrl, IProgressMonitor monitor) {
+ // create a new collector for the results
+ collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
+ //collector.setOperation(this);
+ collector.setProgressMonitor(monitor);
+
+ // get the search url
+ String url = Util.getExactSearchURL(repositoryUrl, javaElement);
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ repositoryUrl);
+ return search(url, repository, collector, monitor);
+ }
+
+ /**
+ * Perform a search for unqualified instances of the member
+ *
+ * @param monitor
+ * The progress monitor to use
+ * @return The QueryHitCollector with the search results
+ */
+ @SuppressWarnings("deprecation")
+ private ProgressQueryHitCollector searchUnqualified(String repositoryUrl, IProgressMonitor monitor) {
+ // create a new collector for the results
+ collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
+ //collector.setOperation(this);
+ collector.setProgressMonitor(monitor);
+
+ // get the search url
+ String url = Util.getInexactSearchURL(repositoryUrl, javaElement);
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ repositoryUrl);
+
+ return search(url, repository, collector, monitor);
+ }
+
+ /**
+ * Perform a second pass parse to determine if there are any stack traces in the bug - currently only used for the
+ * exact search results
+ *
+ * @param doiList
+ * - the list of BugzillaSearchHitDOI elements to parse
+ */
+ public static void secondPassBugzillaParser(List<BugzillaReportInfo> doiList) {
+
+ // go through each of the items in the doiList
+ for (BugzillaReportInfo info : doiList) {
+
+ // get the bug report so that we have all of the data
+ // - descriptions, comments, etc
+ TaskData b = null;
+ try {
+ b = info.getBug();
+ } catch (Exception e) {
+ // don't care since null will be caught
+ }
+
+ // if the report could not be downloaded, try the next one
+ if (b == null) {
+ continue;
+ }
+
+ // Add back:
+ // see if the summary has a stack trace in it
+// StackTrace[] stackTrace = StackTrace.getStackTrace(b.getDescription(), b.getDescription());
+// if (stackTrace != null) {
+//
+// // add the stack trace to the doi info
+// info.setExact(true);
+// info.addStackTraces(stackTrace);
+// }
+
+ // Add back:
+ // go through all of the comments for the bug
+// Iterator<TaskComment> comItr = b.getComments().iterator();
+// while (comItr.hasNext()) {
+// TaskComment taskComment = comItr.next();
+// String commentText = taskComment.getText();
+//
+// // see if the comment has a stack trace in it
+// stackTrace = StackTrace.getStackTrace(commentText, taskComment);
+// if (stackTrace != null) {
+//
+// // add the stack trace to the doi info
+// info.setExact(true);
+// info.addStackTraces(stackTrace);
+// }
+// }
+ }
+ }
+
+ /**
+ * Add the results returned to the Hash of landmarks
+ *
+ * @param results
+ * The list of results
+ * @param isExact
+ * whether the search was exact or not
+ */
+ private List<BugzillaReportInfo> getDoiList(Set<AbstractTask> results) {
+ List<BugzillaReportInfo> doiList = new ArrayList<BugzillaReportInfo>();
+
+ boolean isExact = (scope == BugzillaMylynSearch.FULLY_QUAL || scope == BugzillaMylynSearch.LOCAL_QUAL) ? true
+ : false;
+
+ BugzillaReportInfo info = null;
+ // go through all of the results and create a DoiInfo list
+ for (ITask hit : results) {
+
+ try {
+ float value = 0;
+ info = new BugzillaReportInfo(value, hit, isExact);
+
+ // only download the bug for the exact matches
+ // downloading bugs kills the time - can we do this elsewhere? -
+ // different thread? persistant?
+ // if(isExact){
+ // // get the bug report for the doi info item
+ // BugReport b = BugzillaRepositoryUtil.getInstance().getBug(
+ // hit.getId());
+ // // add the bug to the doi info for future use
+ // info.setBug(b);
+ // }
+
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.INFO, SandboxUiPlugin.ID_PLUGIN, "Search failed", e));
+ } finally {
+ doiList.add(info);
+ }
+ }
+ return doiList;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#getStatus()
+ */
+ public IStatus getStatus() throws LoginException {
+ // if a LoginException was thrown while trying to search, throw this
+ if (loginException == null) {
+ return status;
+ } else {
+ throw loginException;
+ }
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /**
+ * Get the member that we are performing the search for
+ *
+ * @return The member this search is being performed for
+ */
+ public IMember getSearchMember() {
+ return javaElement;
+ }
+
+ /**
+ * Get the name of the member that we are searching for
+ *
+ * @return The fully qualified name of the member
+ */
+ public String getSearchMemberName() {
+ return name;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#getQuery()
+ */
+ public AbstractRepositorySearchQuery getQuery() {
+ return query;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#setQuery(org.eclipse.mylyn.internal.bugs.core.search.AbstractRepositorySearchQuery)
+ */
+ public void setQuery(AbstractRepositorySearchQuery newQuery) {
+ this.query = newQuery;
+ }
+
+ /**
+ * Get the name of the element that we are searching for
+ *
+ * @return The name of the element
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Get the scope of the search operation
+ *
+ * @return The scope - defined in BugzillaMylarSearch
+ */
+ public int getScope() {
+ return scope;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaReferencesProvider.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaReferencesProvider.java
new file mode 100644
index 0000000..fb3f4d3
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaReferencesProvider.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.mylyn.context.core.IInteractionContext;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.context.core.DegreeOfSeparation;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
+import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
+import org.eclipse.mylyn.internal.context.core.IDegreeOfSeparation;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Shawn Minto
+ */
+public class BugzillaReferencesProvider extends AbstractRelationProvider {
+
+ public static final String ID = "org.eclipse.mylyn.bugs.search.references";
+
+ public static final String NAME = "referenced by";
+
+ public static final int DEFAULT_DEGREE = 0;
+
+ public BugzillaReferencesProvider() {
+ super(BugzillaStructureBridge.CONTENT_TYPE, ID);
+ }
+
+ @Override
+ public List<IDegreeOfSeparation> getDegreesOfSeparation() {
+ List<IDegreeOfSeparation> separations = new ArrayList<IDegreeOfSeparation>();
+ separations.add(new DegreeOfSeparation("disabled", 0));
+ separations.add(new DegreeOfSeparation("local, fully qualified matches", 1));
+ separations.add(new DegreeOfSeparation("local, unqualified matches", 2));
+ separations.add(new DegreeOfSeparation("server, fully quaified matches", 3));
+ separations.add(new DegreeOfSeparation("server, unqualified matches", 4));
+
+ return separations;
+ }
+
+ protected boolean acceptElement(IJavaElement javaElement) {
+ return javaElement != null && (javaElement instanceof IMember || javaElement instanceof IType)
+ && javaElement.exists();
+ }
+
+ /**
+ * HACK: checking kind as string - don't want the dependancy to mylar.java
+ */
+ @Override
+ protected void findRelated(final IInteractionElement node, int degreeOfSeparation) {
+ if (!node.getContentType().equals("java")) {
+ return;
+ }
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+ if (!acceptElement(javaElement)) {
+ return;
+ }
+ runJob(node, degreeOfSeparation);
+ }
+
+ @Override
+ public IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo, int degreeOfSepatation) {
+ IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
+
+ ITask task = TasksUiPlugin.getTaskListManager().getActiveTask();
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(task.getConnectorKind(),
+ task.getRepositoryUrl());
+ return new BugzillaMylynSearch(degreeOfSepatation, javaElement, repository.getRepositoryUrl());
+ }
+
+ private void runJob(final IInteractionElement node, final int degreeOfSeparation) {
+ BugzillaMylynSearch search = (BugzillaMylynSearch) getSearchOperation(node, 0, degreeOfSeparation);
+
+ search.addListener(new IActiveSearchListener() {
+
+ private boolean gathered = false;
+
+ public void searchCompleted(List<?> nodes) {
+ Iterator<?> itr = nodes.iterator();
+
+ if (MylynBugsManager.getDefault() == null) {
+ return;
+ }
+
+ while (itr.hasNext()) {
+ Object o = itr.next();
+ if (o instanceof BugzillaReportInfo) {
+ BugzillaReportInfo bugzillaNode = (BugzillaReportInfo) o;
+ final String handle = bugzillaNode.getElementHandle();
+// if (MylarBugsPlugin.getDefault().getCache().getCached(handle) == null)
+// cache(handle, bugzillaNode);
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ incrementInterest(node, BugzillaStructureBridge.CONTENT_TYPE, handle,
+ degreeOfSeparation);
+ }
+ });
+ }
+ }
+ gathered = true;
+ BugzillaReferencesProvider.this.searchCompleted(node);
+ }
+
+ public boolean resultsGathered() {
+ return gathered;
+ }
+
+ });
+ search.run(new NullProgressMonitor(), Job.DECORATE - 10);
+ }
+
+ @Override
+ public String getGenericId() {
+ return ID;
+ }
+
+ @Override
+ protected String getSourceId() {
+ return ID;
+ }
+
+ @Override
+ public String getName() {
+ return NAME;
+ }
+
+ /*
+ *
+ * STUFF FOR TEMPORARILY CACHING A PROXY REPORT
+ *
+ * TODO remove the proxys and update the BugzillaStructureBridge cache so
+ * that on restart, we dont have to get all of the bugs
+ *
+ */
+ private static final Map<String, BugzillaReportInfo> reports = new HashMap<String, BugzillaReportInfo>();
+
+ public BugzillaReportInfo getCached(String handle) {
+ return reports.get(handle);
+ }
+
+ protected void cache(String handle, BugzillaReportInfo bugzillaNode) {
+ reports.put(handle, bugzillaNode);
+ }
+
+ public void clearCachedReports() {
+ reports.clear();
+ }
+
+ public Collection<? extends String> getCachedHandles() {
+ return reports.keySet();
+ }
+
+ @Override
+ public void stopAllRunningJobs() {
+ BugzillaSearchManager.cancelAllRunningJobs();
+
+ }
+
+ @Override
+ protected int getDefaultDegreeOfSeparation() {
+ return DEFAULT_DEGREE;
+ }
+
+ @Override
+ public void contextPreActivated(IInteractionContext context) {
+ // ignore
+ }
+
+ @Override
+ public void elementsDeleted(List<IInteractionElement> elements) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaReportInfo.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaReportInfo.java
new file mode 100644
index 0000000..bb69654
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaReportInfo.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
+import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.StackTrace;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * Class to store the DoiInfo of a BugzillaSearchHit
+ *
+ * TODO: refactor
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaReportInfo {
+
+ private static final int MAX_LABEL_LENGTH = 150;
+
+ private static final long serialVersionUID = 3257004367222419506L;
+
+ /** The BugzillaSearchHit associated with this DoiInfo */
+ private final ITask hit;
+
+ /** Whether this search hit was from an exact search like a stack trace */
+ private boolean isExact = false;
+
+ /** List of all of the StackTrace's in the given bug */
+ private final List<StackTrace> stackTraces;
+
+ /** The bug report associated with this DoiInfo */
+ private TaskData bug;
+
+ /**
+ * Constructor
+ *
+ * @param initialValue
+ * The initial Doi value
+ * @param hit
+ * The BugzillaSearchHit associated with this DoiInfo
+ * @param isExact
+ * Whether the search was exact or not
+ */
+ public BugzillaReportInfo(float initialValue, ITask hit, boolean isExact) {
+ this.hit = hit;
+ this.isExact = isExact;
+ bug = null;
+ stackTraces = new ArrayList<StackTrace>();
+ }
+
+ /**
+ * Get the bugzilla search hit relating to this DoiInfo
+ *
+ * @return The BugzillaSearchHit related to this DoiInfo
+ */
+ public ITask getHit() {
+ return hit;
+ }
+
+ @Override
+ public String toString() {
+ return hit.toString();
+ }
+
+ /**
+ * Determine if the search hit this represents is exact or not
+ *
+ * @return <code>true</code> if the search was exact otherwise <code>false</code>
+ */
+ public boolean isExact() {
+ return isExact;
+ }
+
+ /**
+ * Set whether this bug has any exact elements in it - the search used was fully qualified
+ *
+ * @param isExact
+ * - Whether there are any exact element matches in it
+ */
+ public void setExact(boolean isExact) {
+ this.isExact = isExact;
+ }
+
+ /**
+ * Get the bug report associated with this DoiInfo<br>
+ * The bug is downloaded if it was not previously
+ *
+ * @return Returns the BugReport
+ */
+ public TaskData getBug() throws CoreException {
+ if (bug == null) {
+ // get the bug report
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ hit.getRepositoryUrl());
+ BugzillaRepositoryConnector bugzillaConnector = (BugzillaRepositoryConnector) TasksUi.getRepositoryManager()
+ .getRepositoryConnector(BugzillaCorePlugin.CONNECTOR_KIND);
+ BugzillaTaskDataHandler handler = new BugzillaTaskDataHandler(bugzillaConnector);
+ bug = handler.getTaskData(repository, hit.getTaskId(), new NullProgressMonitor());
+ }
+ return bug;
+ }
+
+ /**
+ * Set the bug report associated with this DoiInfo
+ *
+ * @param bug
+ * - BugReport that this is associated with
+ */
+ public void setBug(TaskData bug) {
+ this.bug = bug;
+ }
+
+ /**
+ * Get all of the stack traces contained in the bug
+ *
+ * @return Returns a list of StackTrace's
+ */
+ public List<StackTrace> getStackTraces() {
+ return stackTraces;
+ }
+
+ /**
+ * Determine whether the doi info has any stack traces associated with it
+ *
+ * @return <code>true</code> if there are some stack traces else <code>false</code>
+ */
+ public boolean hasStackTraces() {
+ return !stackTraces.isEmpty();
+ }
+
+ /**
+ * Add a stack trace to this DoiInfo
+ *
+ * @param stackTrace
+ * - The StackTrace to add
+ */
+ public void addStackTrace(StackTrace stackTrace) {
+ this.stackTraces.add(stackTrace);
+ }
+
+ /**
+ * Add an array of stack traces to this DoiInfo
+ *
+ * @param stackTracesToAdd
+ * - The StackTraces to add
+ */
+ public void addStackTraces(StackTrace[] stackTracesToAdd) {
+ for (StackTrace element : stackTracesToAdd) {
+ this.stackTraces.add(element);
+ }
+ }
+
+ /**
+ * Get the name of the bug report
+ *
+ * @return The name of the bug report, max 20 characters
+ */
+ public String getName() {
+ String description = hit.getSummary();
+ int length = description.length();
+ if (length > MAX_LABEL_LENGTH) {
+ description = description.substring(0, MAX_LABEL_LENGTH) + "..";
+ }
+ return "bug " + hit.getTaskId() + ": " + description;
+ }
+
+ public String getElementHandle() {
+ return hit.getRepositoryUrl() + ";" + hit.getTaskId();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaSearchEngine.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaSearchEngine.java
new file mode 100644
index 0000000..0f5e70d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaSearchEngine.java
@@ -0,0 +1,545 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * Queries the Bugzilla server for the list of bugs matching search criteria.
+ *
+ * @author Mik Kersten (hardening of initial prototype)
+ */
+// TODO: Delete once not needed by sandbox
+public class BugzillaSearchEngine {
+
+ protected static final String QUERYING_SERVER = "Querying Bugzilla Server...";
+
+ /**
+ * regular expression matching values of query matches' attributes in Eclipse.org Bugzilla
+ */
+ public static final Pattern reValue = Pattern.compile("<td><nobr>([^<]*)</nobr>");
+
+ public static final Pattern reValueBugzilla220 = Pattern.compile("<td style=\"white-space: nowrap\">([^<]*)");
+
+// private final String urlString;
+
+ private final TaskRepository repository;
+
+ private final boolean maxReached = false;
+
+// private String queryStringWithoutLogin;
+
+ public BugzillaSearchEngine(TaskRepository repository, String queryUrl) {
+// urlString = queryUrl;
+// queryStringWithoutLogin = urlString;
+ // urlString = urlString.concat(IBugzillaConstants.CONTENT_TYPE_RDF);
+ this.repository = repository;
+ // this.proxySettings = proxySettings;
+ // if (repository.hasCredentials()) {
+ // try {
+ // urlString = BugzillaClient.addCredentials(urlString,
+ // repository.getCharacterEncoding(), repository
+ // .getUserName(), repository.getPassword());
+ // } catch (UnsupportedEncodingException e) {
+ // /*
+ // * Do nothing. Every implementation of the Java platform is
+ // * required to support the standard charset "UTF-8"
+ // */
+ // }
+ // }
+ }
+
+ /**
+ * Wrapper for search
+ *
+ * @param collector
+ * - The collector for the results to go into
+ */
+ public IStatus search(ProgressQueryHitCollector collector) throws LoginException {
+ return this.search(collector, 0, IBugzillaConstants.RETURN_ALL_HITS);
+ }
+
+ /**
+ * Wrapper for search
+ *
+ * @param collector
+ * - The collector for the results to go into
+ * @param startMatches
+ * - The number of matches to start with for the progress monitor
+ */
+ public IStatus search(ProgressQueryHitCollector collector, int startMatches) throws LoginException {
+ return this.search(collector, startMatches, BugzillaUiPlugin.getDefault().getMaxResults());
+ }
+
+ /**
+ * Executes the query, parses the response, and adds hits to the search result collector.
+ *
+ * @param collector
+ * - The collector for the search results
+ * @param startMatches
+ * - The number of matches to start with for the progress monitor
+ * @param maxHits
+ * - the maximum number of matches to return or IBugzillaConstants.RETURN_ALL_HITS for unlimited
+ */
+ public IStatus search(ProgressQueryHitCollector collector, int startMatches, int maxHits) throws LoginException {
+ IProgressMonitor monitor = collector.getProgressMonitor();
+ IStatus status = null;
+ boolean possibleBadLogin = false;
+ int numCollected = 0;
+ BufferedReader in = null;
+
+ try {
+ monitor.beginTask(QUERYING_SERVER, maxHits);// IProgressMonitor.UNKNOWN
+ collector.aboutToStart(startMatches);
+
+ throw new OperationCanceledException("Bugzilla Active Searchn not implemented");
+
+// if (monitor.isCanceled()) {
+// throw new OperationCanceledException("Search cancelled");
+// }
+//
+// BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getRepositoryUrl(), urlString,
+// "summary");
+//
+// BugzillaRepositoryConnector bugzillaConnector = (BugzillaRepositoryConnector) TasksUi.getRepositoryManager()
+// .getRepositoryConnector(BugzillaCorePlugin.CONNECTOR_KIND);
+//
+// BugzillaClient client = bugzillaConnector.getClientManager().getClient(repository,
+// new NullProgressMonitor());
+// client.getSearchHits(query, collector, bugzillaConnector.getTaskDataHandler()
+// .getAttributeMapper(repository), new NullProgressMonitor());
+ } catch (CoreException e) {
+ status = new MultiStatus(BugzillaUiPlugin.ID_PLUGIN, IStatus.ERROR,
+ "Core Exception occurred while querying Bugzilla Server " + repository.getRepositoryUrl() + ".\n"
+ + "\nClick Details for more information.", e);
+ ((MultiStatus) status).add(e.getStatus());
+
+ // write error to log
+ BugzillaCorePlugin.log(status);
+ } catch (OperationCanceledException e) {
+ status = new Status(IStatus.CANCEL, BugzillaUiPlugin.ID_PLUGIN, IStatus.CANCEL, "", null);
+// } catch (final UnrecognizedReponseException e) {
+//
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// WebBrowserDialog.openAcceptAgreement(null, "Report Download Failed",
+// "Unrecognized response from server", e.getMessage());
+// }
+// });
+// status = new MultiStatus(BugzillaUiPlugin.ID_PLUGIN, IStatus.ERROR,
+// "Unrecognized response from Bugzilla server " + repository.getRepositoryUrl(), e);
+//
+// IStatus s = new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, IStatus.ERROR, e.getClass().toString()
+// + ": ", e);
+// ((MultiStatus) status).add(s);
+// s = new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, IStatus.OK, "search failed", e);
+// ((MultiStatus) status).add(s);
+
+ } catch (Exception e) {
+ status = new MultiStatus(BugzillaUiPlugin.ID_PLUGIN, IStatus.ERROR,
+ "An error occurred while querying Bugzilla Server " + repository.getRepositoryUrl() + ".\n"
+ + "\nCheck network connection and repository configuration in "
+ + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".", e);
+
+ IStatus s = new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, IStatus.ERROR, e.getClass().toString()
+ + ": ", e);
+ ((MultiStatus) status).add(s);
+ s = new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, IStatus.OK, "search failed", e);
+ ((MultiStatus) status).add(s);
+ } finally {
+ if (monitor != null) {
+ monitor.done();
+ }
+ collector.done();
+ try {
+ if (in != null) {
+ in.close();
+ }
+ } catch (IOException e) {
+ BugzillaCorePlugin.log(new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, IStatus.ERROR,
+ "Problem closing the stream", e));
+ }
+ }
+
+ // if we haven't collected any serach results and we suspect a bad
+ // login, we assume it was a bad login
+ if (numCollected == 0 && possibleBadLogin) {
+ throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE + " for repository: "
+ + repository.getRepositoryUrl() + " username: " + repository.getUserName());
+ }
+
+ if (status == null) {
+ return new Status(IStatus.OK, BugzillaUiPlugin.ID_PLUGIN, IStatus.OK, "", null);
+ } else {
+ return status;
+ }
+ }
+
+ // /** Old code used by a unit test. */
+// public static BugzillaQueryHit createHit(Pattern regularExpression, IProgressMonitor monitor, BufferedReader in,
+// String serverUrl, int id) throws IOException {
+// String line;
+// // String severity = null;
+// String priority = null;
+// // String platform = null;
+// // String owner = null;
+// String state = null;
+// // String result = null;
+// for (int i = 0; i < 6; i++) {
+// Matcher matcher;
+// do {
+// matcher = null;
+// if (monitor.isCanceled()) {
+// throw new OperationCanceledException("Search cancelled");
+// }
+// line = in.readLine();
+// if (line == null)
+// break;
+// line = line.trim();
+// matcher = regularExpression.matcher(line);
+// } while (!matcher.find());
+// if (null != matcher) {
+// switch (i) {
+// // case 0:
+// // severity = matcher.group(1);
+// // break;
+// case 1:
+// priority = matcher.group(1);
+// break;
+// // case 2:
+// // platform = matcher.group(1);
+// // break;
+// // case 3:
+// // owner = matcher.group(1);
+// // break;
+// case 4:
+// state = matcher.group(1);
+// break;
+// case 5:
+// // result = matcher.group(1);
+// // break;
+// }
+// }
+// }
+//
+// // two more
+// line = in.readLine();
+// line = in.readLine();
+//
+// String description = "<activate to view summary>";
+// if (line != null) {
+// description = line.substring(8);
+// }
+// if (description.startsWith(">")) {
+// description = description.substring(1);
+// }
+//
+// // String query = "";
+// // try {
+// // String recentQuery = BugzillaUiPlugin.getMostRecentQuery();
+// // if (recentQuery != null)
+// // query = recentQuery;
+// // } catch (Exception e) {
+// // // ignore, for testing
+// // }
+//
+// BugzillaQueryHit hit = new BugzillaQueryHit(TasksUiPlugin.getTaskList(), description,
+// priority, serverUrl, String.valueOf(id), null, state);
+//
+// return hit;
+// }
+
+ public boolean isMaxReached() {
+ return maxReached;
+ }
+}
+
+// /** regular expression matching Bugzilla query results format used in
+// Eclipse.org Bugzilla */
+// protected static final Pattern re = Pattern.compile("<a
+// href=\"show_bug.cgi\\?taskId=(\\d+)\">", Pattern.CASE_INSENSITIVE);
+//
+//
+// /** regular expression matching Bugzilla query results format used in
+// v2.12 */
+// protected static final Pattern reOld = Pattern.compile("<a
+// href=\"show_bug.cgi\\?taskId=(\\d+)\">\\d+</a>\\s*<td
+// class=severity><nobr>([^>]+)</nobr><td
+// class=priority><nobr>([^>]+)</nobr><td
+// class=platform><nobr>([^>]*)</nobr><td
+// class=owner><nobr>([^>]*)</nobr><td class=status><nobr>([^>]*)</nobr><td
+// class=resolution><nobr>([^>]*)</nobr><td class=summary>(.*)$",
+// Pattern.CASE_INSENSITIVE);
+
+// /**
+// * Executes the query, parses the response, and adds hits to the search
+// result collector.
+// *
+// * <p>
+// * The output for a single match looks like this:
+// * <pre>
+// * <tr class="bz_enhancement bz_P5 ">
+// *
+// * <td>
+// * <a href="show_bug.cgi?taskId=6747">6747</a>
+// * </td>
+// *
+// * <td><nobr>enh</nobr>
+// * </td>
+// * <td><nobr>P5</nobr>
+// * </td>
+// * <td><nobr>All</nobr>
+// * </td>
+// * <td><nobr>Olivier_Thomann at oti.com</nobr>
+// * </td>
+// * <td><nobr>ASSI</nobr>
+// * </td>
+// * <td><nobr></nobr>
+// * </td>
+// * <td>Code Formatter exchange several blank lines w/ one
+// * </td>
+// *
+// * </tr>
+// * <pre>
+// *
+// * <p>Or in the older format:
+// * <pre>
+// * <A HREF="show_bug.cgi?taskId=8">8</A> <td
+// class=severity><nobr>blo</nobr><td class=priority><nobr>P1</nobr><td
+// class=platform><nobr>PC</nobr><td
+// class=owner><nobr>cubranic at cs.ubc.ca</nobr><td
+// class=status><nobr>CLOS</nobr><td class=resolution><nobr>DUPL</nobr><td
+// class=summary>"Document root" missing when querying on files and
+// revisions
+// * </pre>
+// * @param collector - The collector for the search results
+// * @param startMatches - The number of matches to start with for the
+// progress monitor
+// * @param maxMatches - the maximum number of matches to return or -1 for
+// unlimited
+// */
+// public IStatus search(IBugzillaSearchResultCollector collector, int
+// startMatches, int maxMatches)
+// throws LoginException {
+// IProgressMonitor monitor = collector.getProgressMonitor();
+// IStatus status = null;
+// boolean possibleBadLogin = false;
+// int numCollected = 0;
+// BufferedReader in = null;
+//
+// try {
+// monitor.beginTask(QUERYING_SERVER, IProgressMonitor.UNKNOWN);
+// collector.aboutToStart(startMatches);
+//
+// URLConnection cntx = BugzillaPlugin.getDefault().getUrlConnection(new
+// URL(urlString));
+// if (cntx == null || !(cntx instanceof HttpURLConnection)) {
+// return null;
+// }
+//
+// HttpURLConnection connect = (HttpURLConnection) cntx;
+// connect.connect();
+// int responseCode = connect.getResponseCode();
+// if (responseCode != HttpURLConnection.HTTP_OK) {
+// String msg;
+// if (responseCode == -1 || responseCode ==
+// HttpURLConnection.HTTP_FORBIDDEN)
+// msg = repository.getUrl()
+// + " does not seem to be a valid Bugzilla server. Check Bugzilla
+// preferences.";
+// else
+// msg = "HTTP Error " + responseCode + " (" + connect.getResponseMessage()
+// + ") while querying Bugzilla Server. Check Bugzilla preferences.";
+//
+// throw new BugzillaException(msg);
+// }
+//
+// if (monitor.isCanceled()) {
+// throw new OperationCanceledException("Search cancelled");
+// }
+//
+// in = new BufferedReader(new InputStreamReader(connect.getInputStream()));
+// if (monitor.isCanceled()) {
+// throw new OperationCanceledException("Search cancelled");
+// }
+//
+// String line;
+// while ((line = in.readLine()) != null) {
+// if (maxMatches != -1 && numCollected >= maxMatches) {
+// maxReached = true;
+// break;
+// }
+//
+// if (monitor.isCanceled()) {
+// throw new OperationCanceledException("Search cancelled");
+// }
+//
+// // create regular expressions that can be mathced to check if we
+// // have
+// // bad login information
+// Pattern loginRe = Pattern.compile("<title>.*login.*</title>.*");
+// Pattern invalidRe =
+// Pattern.compile(".*<title>.*invalid.*password.*</title>.*");
+// Pattern passwordRe =
+// Pattern.compile(".*<title>.*password.*invalid.*</title>.*");
+// Pattern emailRe = Pattern.compile(".*<title>.*check e-mail.*</title>.*");
+// Pattern errorRe = Pattern.compile(".*<title>.*error.*</title>.*");
+//
+// String lowerLine = line.toLowerCase(Locale.ENGLISH);
+//
+// // check if we have anything that suggests bad login info
+// if (loginRe.matcher(lowerLine).find() ||
+// invalidRe.matcher(lowerLine).find() ||
+// passwordRe.matcher(lowerLine).find()
+// || emailRe.matcher(lowerLine).find() ||
+// errorRe.matcher(lowerLine).find())
+// possibleBadLogin = true;
+//
+// Matcher matcher = reOld.matcher(line);
+// if (matcher.find()) {
+// int taskId = Integer.parseInt(matcher.group(1));
+// String severity = matcher.group(2);
+// String priority = matcher.group(3);
+// String platform = matcher.group(4);
+// String owner = matcher.group(5);
+// String state = matcher.group(6);
+// String result = matcher.group(7);
+// String summary = matcher.group(8);
+// String query = BugzillaPlugin.getMostRecentQuery();
+// if (query == null)
+// query = "";
+//
+// String server = repository.getUrl();
+//
+// BugzillaSearchHit hit = new BugzillaSearchHit(server, taskId, summary,
+// severity, priority,
+// platform, state, result, owner, query);
+// collector.accept(hit);
+// numCollected++;
+//
+// } else {
+// matcher = re.matcher(line);
+// if (matcher.find()) {
+// Pattern regularExpression;
+//
+// BugzillaServerVersion bugzillaServerVersion =
+// IBugzillaConstants.BugzillaServerVersion.fromString(repository.getVersion());
+// if (bugzillaServerVersion != null &&
+// bugzillaServerVersion.compareTo(BugzillaServerVersion.SERVER_220) >= 0) {
+// regularExpression = reValueBugzilla220;
+// } else {
+// regularExpression = reValue;
+// }
+//
+// int taskId = Integer.parseInt(matcher.group(1));
+// BugzillaSearchHit hit = createHit(regularExpression, monitor, in,
+// repository.getUrl(), taskId);
+// collector.accept(hit);
+// numCollected++;
+// }
+// }
+//
+// // } else if (re.matches(line, match)) {
+// // RegularExpression regularExpression;
+// // if
+// (repository.getVersion().equals(BugzillaServerVersion.SERVER_220.toString()))
+// {
+// // regularExpression = reValueBugzilla220;
+// // } else {
+// // regularExpression = reValue;
+// // }
+// //
+// // int taskId = Integer.parseInt(match.getCapturedText(1));
+// // BugzillaSearchHit hit = createHit(regularExpression, monitor, in,
+// match, repository.getUrl()
+// // .toExternalForm(), taskId);
+// // collector.accept(hit);
+// // numCollected++;
+// // }
+// if (monitor.isCanceled()) {
+// throw new OperationCanceledException("Search cancelled");
+// }
+// }
+// } catch (CoreException e) {
+// status = new MultiStatus(IBugzillaConstants.PLUGIN_ID, IStatus.ERROR,
+// "Core Exception occurred while querying Bugzilla Server " +
+// repository.getUrl()
+// + ".\n" + "\nClick Details for more information.", e);
+// ((MultiStatus) status).add(e.getStatus());
+//
+// // write error to log
+// BugzillaPlugin.log(status);
+// } catch (OperationCanceledException e) {
+// status = new Status(IStatus.CANCEL, IBugzillaConstants.PLUGIN_ID,
+// IStatus.CANCEL, "", null);
+// } catch (Exception e) {
+// status = new MultiStatus(IBugzillaConstants.PLUGIN_ID, IStatus.ERROR, "An
+// error occurred while querying Bugzilla Server " + repository.getUrl() +
+// ".\n"
+// + "\nCheck network connection repository configuration in Task
+// Repositories view.", e);
+//
+// IStatus s = new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID,
+// IStatus.ERROR, e.getClass().toString()
+// + ": ", e);
+// ((MultiStatus) status).add(s);
+// s = new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID, IStatus.OK,
+// "search failed", e);
+// ((MultiStatus) status).add(s);
+//
+// // write error to log
+// //BugzillaPlugin.log(status);
+//
+//
+// } finally {
+// monitor.done();
+// collector.done();
+// try {
+// if (in != null)
+// in.close();
+// } catch (IOException e) {
+// BugzillaPlugin.log(new Status(IStatus.ERROR,
+// IBugzillaConstants.PLUGIN_ID, IStatus.ERROR,
+// "Problem closing the stream", e));
+// }
+// }
+//
+// // if we haven't collected any serach results and we suspect a bad
+// // login, we assume it was a bad login
+// if (numCollected == 0 && possibleBadLogin) {
+// throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE + " for
+// repository: " + repository.getUrl() + " username: " +
+// repository.getUserName());
+// }
+//
+// if (status == null)
+// return new Status(IStatus.OK, NewSearchUI.PLUGIN_ID, IStatus.OK, "",
+// null);
+// else
+// return status;
+// }
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaSearchManager.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaSearchManager.java
new file mode 100644
index 0000000..6cabc26
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaSearchManager.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+
+/**
+ * Class to handle the bridge between Mylyn and bugzilla
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaSearchManager {
+
+ /** The hash of all of the landmarks and their related search hits */
+ private final Map<String, Map<Integer, List<BugzillaReportInfo>>> landmarksHash;
+
+ /**
+ * The currently running search jobs so that we can cancel it if necessary <br>
+ * KEY: IMember VALUE: Job
+ */
+ static Map<String, Job> runningJobs = Collections.synchronizedMap(new HashMap<String, Job>());
+
+ /**
+ * Constructor
+ */
+ public BugzillaSearchManager() {
+ landmarksHash = Collections.synchronizedMap(new HashMap<String, Map<Integer, List<BugzillaReportInfo>>>());
+ }
+
+ /**
+ * Remove a landmark from the hash
+ *
+ * @param removed
+ * This landmark to remove (IJavaElement)
+ */
+ public void removeFromLandmarksHash(IJavaElement removed) {
+ landmarksHash.remove(removed.getHandleIdentifier());
+ }
+
+ /**
+ * Remove all of the landmarks from the hash that are in the list
+ *
+ * @param removed
+ * This list of landmarks to remove (IJavaElements)
+ */
+ public void removeFromLandmarksHash(List<IJavaElement> removed) {
+
+ for (IJavaElement je : removed) {
+ landmarksHash.remove(je.getHandleIdentifier());
+ }
+ }
+
+ /**
+ * Add data to the landmarks hash
+ *
+ * @param doiList
+ * The list of BugzillaSearchHitDoiInfo
+ * @param m
+ * The member that this list is for
+ */
+ public void addToLandmarksHash(List<BugzillaReportInfo> doiList, IMember m, int scope) {
+ Map<Integer, List<BugzillaReportInfo>> searches = landmarksHash.get(m.getHandleIdentifier());
+
+ if (searches == null) {
+ searches = new HashMap<Integer, List<BugzillaReportInfo>>();
+ }
+ searches.put(scope, doiList);
+ landmarksHash.put(m.getHandleIdentifier(), searches);
+ }
+
+ /**
+ * Get the doiList for the given IMember from the landmarks hash
+ *
+ * @param m
+ * The member to get the doiList for
+ * @return The doiList or null if it doesn't exist
+ */
+ public List<BugzillaReportInfo> getFromLandmarksHash(IMember m, int scope) {
+ Map<Integer, List<BugzillaReportInfo>> scopes = landmarksHash.get(m.getHandleIdentifier());
+ if (scopes == null) {
+ return null;
+ } else {
+ return scopes.get(scope);
+ }
+ }
+
+ /**
+ * Determine whether the current element has a search job running for it
+ *
+ * @param e
+ * The element that we want to know whether there is a search job or not
+ * @return <code>true</code> if it does else <code>false</code>
+ */
+ public static boolean doesJobExist(String handle) {
+ return runningJobs.containsKey(handle);
+ }
+
+ /**
+ * Remove search job for the given element
+ *
+ * @param m
+ * The element that we want to make sure that the search is canceled for
+ */
+ public static void removeSearchJob(String handle) {
+
+ // make sure that there wasn't a previous search job that we know
+ // of. If there was, cancel it
+ if (doesJobExist(handle)) {
+ // get the search job and wait until it is cancelled
+ Job prevJob = runningJobs.get(handle);
+ prevJob.cancel();
+ runningJobs.remove(handle);
+ }
+ }
+
+ /**
+ * Add a search job to our list
+ *
+ * @param handle
+ * The handle of the element that we are searching for
+ * @param searchJob
+ * The job that represents the search
+ */
+ public static void addJob(String handle, Job searchJob) {
+ runningJobs.put(handle, searchJob);
+ }
+
+ public static void cancelAllRunningJobs() {
+ Collection<Job> jobs = runningJobs.values();
+ for (Job j : jobs) {
+ j.cancel();
+ }
+ runningJobs.clear();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaStructureBridge.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaStructureBridge.java
new file mode 100644
index 0000000..584951d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaStructureBridge.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
+import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
+import org.eclipse.mylyn.internal.tasks.ui.editors.ContentOutlineTools;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.ui.views.markers.internal.ProblemMarker;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class BugzillaStructureBridge extends AbstractContextStructureBridge {
+
+ public final static String CONTENT_TYPE = "bugzilla";
+
+ public List<AbstractRelationProvider> providers;
+
+ @Override
+ public String getContentType() {
+ return CONTENT_TYPE;
+ }
+
+ public BugzillaStructureBridge() {
+ super();
+ providers = new ArrayList<AbstractRelationProvider>();
+ }
+
+ /**
+ * Handle format: <server-name:port>;<bug-taskId>;<comment#>
+ *
+ * Use: OutlineTools ???
+ */
+ @Override
+ public String getHandleIdentifier(Object object) {
+ if (object instanceof RepositoryTaskOutlineNode) {
+ RepositoryTaskOutlineNode node = (RepositoryTaskOutlineNode) object;
+ return ContentOutlineTools.getHandle(node);
+ } else if (object instanceof RepositoryTaskSelection) {
+ RepositoryTaskSelection n = (RepositoryTaskSelection) object;
+ return ContentOutlineTools.getHandle(n);
+ }
+ return null;
+ }
+
+// private BugzillaReport result;
+
+ /**
+ * TODO: this will not return a non-cached handle
+ */
+ @Override
+ public Object getObjectForHandle(final String handle) {
+ return null;
+ }
+
+ @Override
+ public String getParentHandle(String handle) {
+
+ // check so that we don't need to try to get the parent if we are
+ // already at the bug report
+ if (!handle.matches(".*;.*;.*")) {
+ return null;
+ }
+
+ RepositoryTaskOutlineNode bon = (RepositoryTaskOutlineNode) getObjectForHandle(handle);
+ if (bon != null && bon.getParent() != null) {
+ return ContentOutlineTools.getHandle(bon.getParent());
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getLabel(Object object) {
+ if (object instanceof RepositoryTaskOutlineNode) {
+ RepositoryTaskOutlineNode b = (RepositoryTaskOutlineNode) object;
+ return ContentOutlineTools.getName(b);
+ } else if (object instanceof BugzillaReportInfo) {
+ ITask hit = ((BugzillaReportInfo) object).getHit();
+ return hit.getRepositoryUrl() + ": Bug#: " + hit.getTaskId() + ": " + hit.getSummary();
+ }
+ return "";
+ }
+
+ @Override
+ public boolean canBeLandmark(String handle) {
+ return false;
+ }
+
+ @Override
+ public boolean acceptsObject(Object object) {
+ return object instanceof RepositoryTaskOutlineNode || object instanceof RepositoryTaskSelection;
+ }
+
+ @Override
+ public boolean canFilter(Object element) {
+ return true;
+ }
+
+ @Override
+ public boolean isDocument(String handle) {
+ return (handle.indexOf(';') == handle.lastIndexOf(';') && handle.indexOf(";") != -1);
+ }
+
+ public String getHandleForMarker(ProblemMarker marker) {
+ return null;
+ }
+
+ @Override
+ public String getContentType(String elementHandle) {
+ return getContentType();
+ }
+
+ @Override
+ public String getHandleForOffsetInObject(Object resource, int offset) {
+ return null;
+ }
+
+ @Override
+ public List<String> getChildHandles(String handle) {
+ return Collections.emptyList();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/BugzillaUiBridge.java b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaUiBridge.java
new file mode 100644
index 0000000..08a740f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/BugzillaUiBridge.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.context.core.IInteractionElement;
+import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlinePage;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class BugzillaUiBridge extends AbstractContextUiBridge {
+
+ protected BugzillaContextLabelProvider labelProvider = new BugzillaContextLabelProvider();
+
+ @Override
+ public void open(IInteractionElement node) {
+ String handle = node.getHandleIdentifier();
+ String bugHandle = handle;
+ String server = handle.substring(0, handle.indexOf(";"));
+
+ handle = handle.substring(handle.indexOf(";") + 1);
+ int next = handle.indexOf(";");
+
+ int bugId;
+ if (next == -1) {
+ bugId = Integer.parseInt(handle);
+ } else {
+ bugId = Integer.parseInt(handle.substring(0, handle.indexOf(";")));
+ bugHandle = bugHandle.substring(0, next);
+ }
+
+ final AbstractTask task = TasksUiPlugin.getTaskList().getTask(handle);
+ if (task != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(task);
+ }
+ });
+ } else {
+ String bugUrl = BugzillaClient.getBugUrlWithoutLogin(server, "" + bugId);
+ TasksUiUtil.openTask(server, "" + bugId, bugUrl);
+ }
+ }
+
+ public ILabelProvider getLabelProvider() {
+ return labelProvider;
+ }
+
+ @Override
+ public void close(IInteractionElement node) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page != null) {
+ IEditorReference[] references = page.getEditorReferences();
+ for (IEditorReference reference : references) {
+ IEditorPart part = reference.getEditor(false);
+ if (part != null) {
+ if (part instanceof AbstractRepositoryTaskEditor) {
+ ((AbstractRepositoryTaskEditor) part).close();
+ } else if (part instanceof TaskEditor) {
+ ((TaskEditor) part).close(true);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean acceptsEditor(IEditorPart editorPart) {
+ return editorPart instanceof AbstractRepositoryTaskEditor;
+ }
+
+ @Override
+ public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) {
+ List<TreeViewer> viewers = new ArrayList<TreeViewer>();
+ TreeViewer outline = getOutlineTreeViewer(editor);
+ if (outline != null) {
+ viewers.add(outline);
+ }
+ return viewers;
+ }
+
+ protected TreeViewer getOutlineTreeViewer(IEditorPart editor) {
+ if (editor instanceof AbstractRepositoryTaskEditor) {
+ AbstractRepositoryTaskEditor abe = (AbstractRepositoryTaskEditor) editor;
+ RepositoryTaskOutlinePage outline = abe.getOutline();
+ if (outline != null) {
+ return outline.getOutlineTreeViewer();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
+ return null;
+ }
+
+ public void restoreEditor(IInteractionElement document) {
+ // ignore
+ }
+
+ @Override
+ public IInteractionElement getElement(IEditorInput input) {
+ return null;
+ }
+
+ @Override
+ public String getContentType() {
+ return BugzillaStructureBridge.CONTENT_TYPE;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/IBugzillaSearchOperation.java b/org.eclipse.mylyn/developer/src-old/bugs/IBugzillaSearchOperation.java
new file mode 100644
index 0000000..c2a33a5
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/IBugzillaSearchOperation.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
+
+/**
+ * Interface for the bugzilla search operation
+ *
+ * @author Shawn Minto
+ *
+ * TODO: Delete once not requred by sandbox
+ */
+public interface IBugzillaSearchOperation extends IRunnableWithProgress {
+
+ /**
+ * Get the status of the search operation
+ *
+ * @return The status of the search operation
+ * @throws LoginException
+ */
+ public IStatus getStatus() throws LoginException;
+
+ /**
+ * Get the bugzilla search query
+ *
+ * @return The bugzilla search query
+ */
+ public AbstractRepositorySearchQuery getQuery();
+
+ /**
+ * Sets the bugzilla search query
+ *
+ * @param newQuery
+ * The bugzilla search query to be set
+ */
+ public void setQuery(AbstractRepositorySearchQuery newQuery);
+
+ public String getName();
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/MylynBugsManager.java b/org.eclipse.mylyn/developer/src-old/bugs/MylynBugsManager.java
new file mode 100644
index 0000000..1b8a315
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/MylynBugsManager.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ *
+ * @author Mik Kersten
+ * @author Shawn Minto
+ */
+public class MylynBugsManager {
+
+ public static ImageDescriptor EDGE_REF_BUGZILLA = getImageDescriptor("icons/elcl16/edge-ref-bug.gif");
+
+ private static BugzillaSearchManager bridge = null;
+
+ private static BugzillaReferencesProvider referencesProvider = new BugzillaReferencesProvider();
+
+ private static MylynBugsManager INSTANCE;
+
+// private BugzillaReportCache cache
+
+ public MylynBugsManager() {
+ INSTANCE = this;
+// cache = new BugzillaReportCache();
+// cache.readCacheFile();
+
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ // create a new bridge and initialize it
+ bridge = new BugzillaSearchManager();
+ }
+ final IWorkbench workbench = PlatformUI.getWorkbench();
+ workbench.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ // bugzillaEditingMonitor = new BugzillaEditingMonitor();
+ // ContextCore.getSelectionMonitors().add(bugzillaEditingMonitor);
+ }
+ });
+ }
+
+ public void dispose(BundleContext context) throws Exception {
+ // ContextCore.getSelectionMonitors().remove(bugzillaEditingMonitor);
+ }
+
+ /**
+ * Returns the shared instance.
+ */
+ public static MylynBugsManager getDefault() {
+ return INSTANCE;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in relative path.
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.internal.bugs.bridge", path);
+ }
+
+ public static BugzillaSearchManager getBridge() {
+ // make sure that the bridge initialized, if not, make a new one
+ if (bridge == null) {
+ bridge = new BugzillaSearchManager();
+ }
+ return bridge;
+ }
+
+ public static BugzillaReferencesProvider getReferenceProvider() {
+ return referencesProvider;
+
+ }
+
+// public BugzillaReportCache getCache() {
+// return cache;
+// }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/ProgressQueryHitCollector.java b/org.eclipse.mylyn/developer/src-old/bugs/ProgressQueryHitCollector.java
new file mode 100644
index 0000000..0994756
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/ProgressQueryHitCollector.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.text.MessageFormat;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskFactory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.LegacyTaskDataCollector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+
+/**
+ * @author Shawn Minto
+ */
+public class ProgressQueryHitCollector extends LegacyTaskDataCollector {
+
+ public static final int MAX_HITS = 5000;
+
+ public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.";
+
+ protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>();
+
+ /** The progress monitor for the search operation */
+ private IProgressMonitor monitor = new NullProgressMonitor();
+
+ /** The number of matches found */
+ private int matchCount;
+
+ /** The string to display to the user while querying */
+ private static final String STARTING = "querying the server";
+
+ /** The string to display to the user when we have 1 match */
+ private static final String MATCH = "1 match";
+
+ /** The string to display to the user when we have multiple or no matches */
+ private static final String MATCHES = "{0} matches";
+
+ /** The string to display to the user when the query is done */
+ private static final String DONE = "done";
+
+ protected ITaskList taskList;
+
+ protected ITaskFactory taskFactory;
+
+ public ProgressQueryHitCollector(ITaskList tasklist, ITaskFactory taskFactory) {
+ this.taskList = tasklist;
+ this.taskFactory = taskFactory;
+ }
+
+ public void aboutToStart(int startMatchCount) throws CoreException {
+ taskResults.clear();
+ matchCount = startMatchCount;
+ monitor.setTaskName(STARTING);
+ }
+
+// public void accept(AbstractTask task) {
+//
+// if (!getProgressMonitor().isCanceled()) {
+// getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
+// getProgressMonitor().worked(1);
+// }
+//
+// if (task == null) {
+// return;
+// }
+//
+// AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier());
+// if (hitTask == null) {
+// hitTask = task;
+// // task is new, add to tasklist
+// taskList.addTask(hitTask);
+// }
+// taskResults.add(hitTask);
+// matchCount++;
+// }
+
+ @Override
+ public void accept(RepositoryTaskData taskData) {
+ if (taskData == null) {
+ return;
+ }
+
+ if (!getProgressMonitor().isCanceled()) {
+ getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
+ getProgressMonitor().worked(1);
+ }
+
+ AbstractTask task;
+ try {
+ task = taskFactory.createTask(taskData, new SubProgressMonitor(monitor, 1));
+ taskResults.add(task);
+ matchCount++;
+ } catch (CoreException e) {
+ // FIXME
+ e.printStackTrace();
+ }
+ }
+
+ public void done() {
+ if (monitor != null && !monitor.isCanceled()) {
+ // if the operation is cancelled, finish with the data that we
+ // already have
+ String matchesString = getFormattedMatchesString(matchCount);
+ monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString }));
+ monitor.done();
+ }
+
+ // Cut no longer used references because the collector might be re-used
+ monitor = null;
+ }
+
+ protected String getFormattedMatchesString(int count) {
+ if (count == 1) {
+ return MATCH;
+ }
+ Object[] messageFormatArgs = { new Integer(count) };
+ return MessageFormat.format(MATCHES, messageFormatArgs);
+ }
+
+ public IProgressMonitor getProgressMonitor() {
+ return monitor;
+ }
+
+ public void setProgressMonitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+ public Set<AbstractTask> getTasks() {
+ return taskResults;
+ }
+
+ public void clear() {
+ taskResults.clear();
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugs/Util.java b/org.eclipse.mylyn/developer/src-old/bugs/Util.java
new file mode 100644
index 0000000..48baef3
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugs/Util.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.sandbox.bridge.bugs;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Utilities methods for the BugzillaMylarBridge
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class Util {
+
+ /**
+ * List of all of the search repositoryOperations that can be done <br>
+ * all words, any words, regex
+ */
+ private static final String[] patternOperationValues = { "allwordssubstr", "anywordssubstr", "regexp" };
+
+ /**
+ * Sugzilla preferences so that we can get the search params
+ */
+ // private static IPreferenceStore prefs =
+ // BugzillaPlugin.getDefault().getPreferenceStore();
+ // private static String[] resolutionValues =
+ // BugzillaRepositoryUtil.convertQueryOptionsToArray(prefs.getString(IBugzillaConstants.VALUES_RESOLUTION));
+ //
+ // private static String[] statusValues =
+ // BugzillaRepositoryUtil.convertQueryOptionsToArray(prefs.getString(IBugzillaConstants.VALUES_STATUS));
+ /**
+ * Get the bugzilla url used for searching for exact matches
+ *
+ * @param je
+ * The IMember to create the query string for
+ * @return A url string for the search
+ */
+ public static String getExactSearchURL(String repositoryUrl, IMember je) {
+ StringBuffer sb = getQueryURLStart(repositoryUrl);
+
+ String long_desc = "";
+
+ // get the fully qualified name of the element
+ long_desc += BugzillaMylynSearchOperation.getFullyQualifiedName(je);
+
+ try {
+ // encode the string to be used as a url
+ sb.append(URLEncoder.encode(long_desc, Charset.defaultCharset().toString()));
+ } catch (UnsupportedEncodingException e) {
+ // should never get here since we are using the default encoding
+ }
+ sb.append(getQueryURLEnd(repositoryUrl));
+
+ return sb.toString();
+ }
+
+ /**
+ * Get the bugzilla url used for searching for inexact matches
+ *
+ * @param je
+ * The IMember to create the query string for
+ * @return A url string for the search
+ */
+ public static String getInexactSearchURL(String repositoryUrl, IMember je) {
+ StringBuffer sb = getQueryURLStart(repositoryUrl);
+
+ String long_desc = "";
+
+ // add the member, qualified with just its parents name
+ if (!(je instanceof IType)) {
+ long_desc += je.getParent().getElementName() + ".";
+ }
+ long_desc += je.getElementName();
+
+ try {
+ // encode the string to be used as a url
+ sb.append(URLEncoder.encode(long_desc, Charset.defaultCharset().toString()));
+ } catch (UnsupportedEncodingException e) {
+ // should never get here since we are using the default encoding
+ }
+ sb.append(getQueryURLEnd(repositoryUrl));
+
+ return sb.toString();
+ }
+
+ /**
+ * Create the end of the bugzilla query URL with all of the status' and resolutions that we want
+ *
+ * @return StringBuffer with the end of the query URL in it
+ */
+ public static StringBuffer getQueryURLEnd(String repositoryUrl) {
+
+ StringBuffer sb = new StringBuffer();
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(repositoryUrl);
+ RepositoryConfiguration repositoryConfiguration = null;
+ try {
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
+ new NullProgressMonitor());
+ } catch (final CoreException e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "Bugzilla Search Page",
+ "Unable to get configuration. Ensure proper repository configuration in "
+ + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".\n\n");
+ }
+ });
+ }
+
+ String[] resolutionValues = BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_RESOLUTION, null,
+ repositoryConfiguration);
+
+ String[] statusValues = BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_STATUS, null,
+ repositoryConfiguration);
+
+ // add the status and resolutions that we care about
+ sb.append("&bug_status=" + statusValues[0]); // UNCONFIRMED
+ sb.append("&bug_status=" + statusValues[1]); // NEW
+ sb.append("&bug_status=" + statusValues[2]); // ASSIGNED
+ sb.append("&bug_status=" + statusValues[3]); // REOPENED
+ sb.append("&bug_status=" + statusValues[4]); // RESOLVED
+ sb.append("&bug_status=" + statusValues[5]); // VERIFIED
+ sb.append("&bug_status=" + statusValues[6]); // CLOSED
+
+ sb.append("&resolution=" + resolutionValues[0]); // FIXED
+ sb.append("&resolution=" + resolutionValues[3]); // LATER
+ sb.append("&resolution=" + "---"); // ---
+ return sb;
+ }
+
+ /**
+ * Create the bugzilla query URL start.
+ *
+ * @return The start of the query url as a StringBuffer <br>
+ * Example: https://bugs.eclipse.org/bugs/buglist.cgi?long_desc_type=allwordssubstr&long_desc=
+ */
+ public static StringBuffer getQueryURLStart(String repositoryUrl) {
+ StringBuffer sb = new StringBuffer(repositoryUrl);
+
+ if (sb.charAt(sb.length() - 1) != '/') {
+ sb.append('/');
+ }
+ sb.append("buglist.cgi?");
+
+ TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ repositoryUrl);
+ if (repository != null && repository.hasCredentials()) {
+ // if (BugzillaPreferencePage.getUserName() != null
+ // && !BugzillaPreferencePage.getUserName().equals("")
+ // && BugzillaPreferencePage.getPassword() != null
+ // && !BugzillaPreferencePage.getPassword().equals("")) {
+ try {
+ sb.append("GoAheadAndLogIn=1&Bugzilla_login=" + URLEncoder.encode(repository.getUserName(), // BugzillaPreferencePage.getUserName(),
+ Charset.defaultCharset().toString()) + "&Bugzilla_password="
+ + URLEncoder.encode(repository.getPassword(), // BugzillaPreferencePage.getPassword(),
+ Charset.defaultCharset().toString()) + "&");
+ } catch (UnsupportedEncodingException e) {
+ // should never get here since we are using the default encoding
+ }
+ }
+ // add the summary search type
+ sb.append("long_desc_type=");
+ sb.append(patternOperationValues[0]); // search for all words
+ sb.append("&long_desc=");
+
+ return sb;
+ }
+
+ /**
+ * Search the given string for another string
+ *
+ * @param elementName
+ * The name of the element that we are looking for
+ * @param comment
+ * The text to search for this element name
+ * @return <code>true</code> if the element is found in the text else <code>false</code>
+ */
+ public static boolean hasElementName(String elementName, String comment) {
+
+ // setup a regex for the element name
+ String regexElement = ".*" + elementName + ".*";
+
+ // get all of the individual lines for the string
+ String[] lines = comment.split("\n");
+
+ // go through each of the lines of the string
+ for (String line : lines) {
+
+ if (line.matches(regexElement)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractBugzillaReportWizard.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractBugzillaReportWizard.java
new file mode 100644
index 0000000..710a38f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractBugzillaReportWizard.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.wizard;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylyn.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Class that contains shared functions for the wizards that submit bug reports.
+ *
+ * @author Eric Booth
+ * @author Mik Kersten (some hardening of prototype)
+ * @author Rob Elves
+ */
+public abstract class AbstractBugzillaReportWizard extends Wizard implements INewWizard {
+
+ // /** The ID of the posted bug report. */
+ // private String id;
+
+ protected boolean fromDialog = false;
+
+ /** The model used to store all of the data for the wizard */
+ protected NewBugzillaReport model;
+ // TODO: Change model to a RepositoryTaskData
+ //protected RepositoryTaskData model;
+
+ /**
+ * Flag to indicate if the wizard can be completed based on the attributes
+ * page
+ */
+ protected boolean completed = false;
+
+ /** The workbench instance */
+ protected IWorkbench workbenchInstance;
+
+ private final TaskRepository repository;
+
+ public AbstractBugzillaReportWizard(TaskRepository repository) {
+ super();
+ this.repository = repository;
+ model = new NewBugzillaReport(repository.getUrl(), MylarTaskListPlugin.getDefault().getOfflineReportsFile()
+ .getNextOfflineBugId());
+ // id = null;
+ super.setDefaultPageImageDescriptor(BugzillaUiPlugin.imageDescriptorFromPlugin(
+ "org.eclipse.mylyn.internal.bugzilla.ui", "icons/wizban/bug-wizard.gif"));
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.workbenchInstance = workbench;
+ }
+
+ @Override
+ public void addPages() {
+ super.addPages();
+ }
+
+ /**
+ * Saves the bug report offline on the user's hard-drive. All offline bug
+ * reports are saved together in a single file in the plug-in's directory.
+ */
+ abstract protected void saveBugOffline();
+
+ /**
+ * @return the last page of this wizard
+ */
+ abstract protected AbstractBugzillaWizardPage getWizardDataPage();
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+}
+
+// @Override
+// public boolean performFinish() {
+// getWizardDataPage().saveDataToModel();
+// return postBug();
+//
+// // if (postBug()) {
+// // // if (!fromDialog)
+// // // openBugEditor();
+// // return true;
+// // }
+// // // If the report was not sent, keep the wizard open
+// // else {
+// // return false;
+// // }
+// // }
+//
+// // if (getWizardDataPage().offlineSelected()) {
+// // saveBugOffline();
+// // return true;
+// // }
+//
+// // If no action was selected, keep the wizard open.
+// // return false;
+// }
+
+// /**
+// * Attempts to post the bug on the Bugzilla server. If it fails, an error
+// * message pops up.
+// *
+// * @return true if the bug is posted successfully, and false otherwise
+// */
+// protected boolean postBug() {
+//
+// final IRunnableWithProgress op = new IRunnableWithProgress() {
+// public void run(IProgressMonitor monitor) throws InvocationTargetException,
+// InterruptedException {
+// Proxy proxySettings = MylarTaskListPlugin.getDefault().getProxySettings();
+// boolean wrap =
+// IBugzillaConstants.BugzillaServerVersion.SERVER_218.equals(repository.getVersion());
+// try {
+// form = BugzillaReportSubmitForm.makeNewBugPost(repository.getUrl(),
+// repository.getUserName(),
+// repository.getPassword(), proxySettings, repository.getCharacterEncoding(),
+// model, wrap);
+// id = form.submitReportToRepository();
+// if (id != null) {
+// sentSuccessfully = true;
+// }
+// } catch (Exception e) {
+// throw new InvocationTargetException(e);
+// }
+// }
+// };
+//
+// IProgressService service = PlatformUI.getWorkbench().getProgressService();
+// try {
+// service.run(true, false, op);
+// } catch (InvocationTargetException e) {
+// if (e.getCause() instanceof BugzillaException) {
+// MessageDialog.openError(getWizardDataPage().getShell(), "I/O Error",
+// "Bugzilla could not post your bug.");
+// } else if (e.getCause() instanceof PossibleBugzillaFailureException) {
+// WebBrowserDialog.openAcceptAgreement(getWizardDataPage().getShell(),
+// "Bugzilla Submission Error Message", e.getCause().getMessage(),
+// form.getError());
+// } else if (e.getCause() instanceof LoginException) {
+// MessageDialog.openError(getWizardDataPage().getShell(), "Posting Error",
+// "Bugzilla could not post your bug since your login name or password is
+// incorrect."
+// + "\nPlease check your settings in the bugzilla preferences. ");
+// } else if (e.getCause() instanceof UnsupportedEncodingException) {
+// // should never get here but just in case...
+// MessageDialog.openError(getWizardDataPage().getShell(), "Posting Error",
+// "Ensure proper encoding selected in "
+// + TaskRepositoriesView.NAME + ".");
+// }
+// } catch (InterruptedException e) {
+// // ignore
+// }
+// return sentSuccessfully;
+//
+// // final WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+// // protected void execute(final IProgressMonitor monitor) throws
+// // CoreException {
+// // PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+// // public void run() {
+// // Proxy proxySettings =
+// // MylarTaskListPlugin.getDefault().getProxySettings();
+// // boolean wrap =
+// //
+// IBugzillaConstants.BugzillaServerVersion.SERVER_218.equals(repository.getVersion());
+// // BugzillaReportSubmitForm form =
+// // BugzillaReportSubmitForm.makeNewBugPost(repository.getUrl(),
+// // repository.getUserName(), repository.getPassword(), proxySettings,
+// // model, wrap);
+// // try {
+// // id = form.submitReportToRepository();
+// //
+// // if (id != null) {
+// // sentSuccessfully = true;
+// // }
+// // } catch (BugzillaException e) {
+// // MessageDialog.openError(null, "I/O Error", "Bugzilla could not post
+// // your bug.");
+// // BugzillaPlugin.log(e);
+// // } catch (PossibleBugzillaFailureException e) {
+// // WebBrowserDialog.openAcceptAgreement(null, "Possible Bugzilla Client
+// // Failure",
+// // "Bugzilla may not have posted your bug.\n" + e.getMessage(),
+// // form.getError());
+// // BugzillaPlugin.log(e);
+// // } catch (LoginException e) {
+// // MessageDialog.openError(null, "Posting Error",
+// // "Bugzilla could not post your bug since your login name or password
+// // is incorrect."
+// // + "\nPlease check your settings in the bugzilla preferences. ");
+// // sentSuccessfully = false;
+// // }
+// // }
+// //
+// // });
+// // }
+// // };
+//
+// }
+
+// /**
+// * Try to open the editor with the newly created bug.
+// */
+// protected void openBugEditor() {
+//
+// IEditorInput input = null;
+// try {
+// input = new ExistingBugEditorInput(repository, Integer.parseInt(id));
+// PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(input,
+// BugzillaUiPlugin.EXISTING_BUG_EDITOR_ID, false);
+// } catch (LoginException e) {
+// // if we had an error with logging in, display an error
+// MessageDialog.openError(null, "Posting Error",
+// "Bugzilla could not access and display your bug in the editor because your
+// login name or password is incorrect."
+// + "\nPlease check your settings in the bugzilla preferences. ");
+// } catch (PartInitException e) {
+// // if there was a problem, handle it and log it, then get out of
+// // here
+// ExceptionHandler.handle(e, SearchMessages.Search_Error_search_title,
+// SearchMessages.Search_Error_search_message);
+// BugzillaPlugin.log(e.getStatus());
+// } catch (Exception e) {
+// MylarStatusHandler.fail(e, "Failed to open Bugzilla report", false);
+// }
+// }
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractBugzillaWizardPage.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractBugzillaWizardPage.java
new file mode 100644
index 0000000..572e375
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractBugzillaWizardPage.java
@@ -0,0 +1,780 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.wizard;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportElement;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylyn.internal.tasklist.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasklist.ui.editors.AbstractTaskEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
+import org.eclipse.ui.themes.IThemeManager;
+
+/**
+ * Class that contains shared functions for the last page of the wizards that
+ * submit bug reports. This page allows the user to set the bug report's
+ * attributes before submitting it.
+ *
+ * @author Mik Kersten (hardening of initial prototype)
+ */
+public abstract class AbstractBugzillaWizardPage extends WizardPage implements Listener {
+
+ /** The instance of the workbench */
+ protected IWorkbench workbench;
+
+ /** Text field for the bugs url */
+ protected Text urlText;
+
+ /** Text field for the description of the bug */
+ protected Text descriptionText;
+
+ /** Text field for the summary of the bug */
+ protected Text summaryText;
+
+ /** Text field for the assignedTo of the bug */
+ protected Text assignedToText;
+
+ // /** Radio button to select when sending the new bug report to the server
+ // */
+ // protected Button serverButton;
+ //
+ // /** Radio button to select when saving the new bug report offline */
+ // protected Button offlineButton;
+
+ /** Combo box for the component that caused the bug */
+ protected Combo componentCombo;
+
+ /** Combo box for the priority of the bug */
+ protected Combo priorityCombo;
+
+ /** Combo box for the platform the bug occurred on */
+ protected Combo platformCombo;
+
+ /** Combo box for the severity of the bug */
+ protected Combo severityCombo;
+
+ /** Combo box for the products version */
+ protected Combo versionCombo;
+
+ /** Combo box for the OS that the bug occurred under */
+ protected Combo oSCombo;
+
+ /** Combo box for the Milestone that the bug addresses */
+ protected Combo milestoneCombo;
+
+ /** Enum for value */
+ protected final String VALUE = "VALUE";
+
+ /** Enum for property */
+ protected final String PROPERTY = "PROPERTY";
+
+ /** Enum for header */
+ protected final String HEADER = "HEADER";
+
+ /** The horizontal indentation of the labels */
+ protected final int HORZ_INDENT = 0;
+
+ /** Status variable for the possible errors on this page */
+ protected IStatus attributeStatus;
+
+ /**
+ * Constructor for AbstractWizardDataPage
+ *
+ * @param pageName
+ * the name of the page
+ * @param title
+ * the title of the page
+ * @param description
+ * the description text for the page
+ * @param workbench
+ * the instance of the workbench
+ */
+ public AbstractBugzillaWizardPage(String pageName, String title, String description, IWorkbench workbench) {
+ super(pageName);
+ setTitle(title);
+ setDescription(description);
+ this.workbench = workbench;
+
+ // set the status for the page
+ attributeStatus = new Status(IStatus.OK, "not_used", 0, "", null);
+ }
+
+ /**
+ * Applies the status to the status line of a dialog page.
+ *
+ * @param status
+ * The status to apply to the status line
+ */
+ protected void applyToStatusLine(IStatus status) {
+ String message = status.getMessage();
+ if (message.length() == 0)
+ message = null;
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ setErrorMessage(null);
+ setMessage(message);
+ break;
+ case IStatus.WARNING:
+ setErrorMessage(null);
+ setMessage(message, WizardPage.WARNING);
+ break;
+ case IStatus.INFO:
+ setErrorMessage(null);
+ setMessage(message, WizardPage.INFORMATION);
+ break;
+ default:
+ setErrorMessage(null);
+ setMessage(message, WizardPage.ERROR);
+ break;
+ }
+ }
+
+ /**
+ * Make sure that a String that is <code>null</code> is changed to a null
+ * string
+ *
+ * @param text
+ * The text to check if it is null or not
+ * @return The string in its proper format
+ */
+ public String checkText(String text) {
+ if (text == null)
+ return "";
+ else
+ return text;
+ }
+
+ @Override
+ public boolean canFlipToNextPage() {
+ // no next page for this path through the wizard
+ return false;
+ }
+
+ /**
+ * Create a new layout for a component
+ *
+ * @param composite
+ * The parent composite
+ * @param colSpan
+ * The number of columns that this can span
+ * @param text
+ * The text to add to the control
+ * @param style
+ * The style that the control should have
+ */
+ public void newLayout(Composite composite, int colSpan, String text, String style) {
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ data.horizontalSpan = colSpan;
+
+ // create the proper layout for the style
+ if (style.equalsIgnoreCase(VALUE)) {
+ Label l = new Label(composite, SWT.NONE);
+ FontData fontData = l.getFont().getFontData()[0];
+ fontData.setStyle(SWT.BOLD | fontData.getStyle());
+ Font font = new Font(null, fontData);
+ l.setFont(font);
+ l.setText(checkText(text));
+
+ data.horizontalIndent = HORZ_INDENT;
+ l.setLayoutData(data);
+ } else if (style.equalsIgnoreCase(PROPERTY)) {
+ Label l = new Label(composite, SWT.NONE);
+ FontData fontData = l.getFont().getFontData()[0];
+ fontData.setStyle(SWT.BOLD | fontData.getStyle());
+ Font font = new Font(null, fontData);
+ l.setFont(font);
+ l.setText(checkText(text));
+
+ data.horizontalIndent = HORZ_INDENT;
+ l.setLayoutData(data);
+ } else {
+ Composite generalTitleGroup = new Composite(composite, SWT.NONE);
+ generalTitleGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ generalTitleGroup.setLayoutData(data);
+ GridLayout generalTitleLayout = new GridLayout();
+ generalTitleLayout.numColumns = 2;
+ generalTitleLayout.marginWidth = 0;
+ generalTitleLayout.marginHeight = 9;
+ generalTitleGroup.setLayout(generalTitleLayout);
+
+ Label image = new Label(generalTitleGroup, SWT.NONE);
+ image.setImage(WorkbenchImages.getImage(IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM));
+
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING;
+ image.setLayoutData(gd);
+ Label l = new Label(composite, SWT.NONE);
+ FontData fontData = l.getFont().getFontData()[0];
+ fontData.setStyle(SWT.BOLD | fontData.getStyle());
+ Font font = new Font(null, fontData);
+ l.setFont(font);
+ l.setText(checkText(text));
+
+ data.horizontalIndent = HORZ_INDENT;
+ l.setLayoutData(data);
+ }
+ }
+
+ /**
+ * Determine if the page is complete when the summary is changed
+ *
+ * @param e
+ * The event which occurred
+ */
+ public void handleEvent(Event e) {
+ boolean pageComplete = isPageComplete();
+
+ // Initialize a variable with the no error status
+ Status status = new Status(IStatus.OK, "not_used", 0, "", null);
+
+ setPageComplete(pageComplete);
+
+ if (!pageComplete)
+ status = new Status(IStatus.ERROR, "not_used", 0, "You must enter a summary and a description", null);
+
+ attributeStatus = status;
+
+ // Show the most serious error
+ applyToStatusLine(attributeStatus);
+
+ setPageComplete(pageComplete);
+ getWizard().getContainer().updateButtons();
+ }
+
+ @Override
+ public IWizardPage getNextPage() {
+ saveDataToModel();
+ return null;
+ }
+
+ /**
+ * Sets the completed field on the wizard class when all the needed
+ * information is entered and the wizard can be completed
+ *
+ * @return true if the wizard can be completed, false otherwise
+ */
+ @Override
+ public boolean isPageComplete() {
+ AbstractBugzillaReportWizard wizard = (AbstractBugzillaReportWizard) getWizard();
+ if (summaryText.getText() == null || summaryText.getText().equals("") || descriptionText.getText() == null
+ || descriptionText.getText().equals("")) {
+ wizard.completed = false;
+ return false;
+ }
+ // saveDataToModel();
+ wizard.completed = true;
+ return true;
+ }
+
+ /**
+ * Save the data obtained from this point in the wizard to the model.
+ */
+ public void saveDataToModel() {
+ // get the model that we are using
+ AbstractBugzillaReportWizard wizard = (AbstractBugzillaReportWizard) getWizard();
+ NewBugzillaReport nbm = wizard.model;
+
+ nbm.setDescription(descriptionText.getText());
+ nbm.setSummary(summaryText.getText());
+
+ // go through each of the attributes and sync their values with the
+ // combo boxes
+ for (Iterator<RepositoryTaskAttribute> it = nbm.getAttributes().iterator(); it.hasNext();) {
+ RepositoryTaskAttribute attribute = it.next();
+ String key = attribute.getName();
+ Map<String, String> values = attribute.getOptionValues();
+
+ try {
+ if (values == null)
+ values = new HashMap<String, String>();
+ if (key.equals(BugzillaReportElement.OP_SYS.toString())) {
+ String os = oSCombo.getItem(oSCombo.getSelectionIndex());
+ attribute.setValue(os);
+ } else if (key.equals(BugzillaReportElement.VERSION.toString())) {
+ String version = versionCombo.getItem(versionCombo.getSelectionIndex());
+ attribute.setValue(version);
+ } else if (key.equals(BugzillaReportElement.BUG_SEVERITY.toString())) {
+ String severity = severityCombo.getItem(severityCombo.getSelectionIndex());
+ attribute.setValue(severity);
+ } else if (key.equals(BugzillaReportElement.REP_PLATFORM.toString())) {
+ String platform = platformCombo.getItem(platformCombo.getSelectionIndex());
+ attribute.setValue(platform);
+ } else if (key.equals(BugzillaReportElement.TARGET_MILESTONE.toString())) {
+ int index = milestoneCombo.getSelectionIndex();
+ if(index >= 0) {
+ String milestone = milestoneCombo.getItem(milestoneCombo.getSelectionIndex());
+ attribute.setValue(milestone);
+ }
+ } else if (key.equals(BugzillaReportElement.COMPONENT.toString())) {
+ String component = componentCombo.getItem(componentCombo.getSelectionIndex());
+ attribute.setValue(component);
+ } else if (key.equals(BugzillaReportElement.PRIORITY.toString())) {
+ String priority = priorityCombo.getItem(priorityCombo.getSelectionIndex());
+ attribute.setValue(priority);
+ } else if (key.equals(BugzillaReportElement.BUG_FILE_LOC.toString())) {
+ if (urlText != null) {
+ String url = urlText.getText();
+ if (url.equalsIgnoreCase("http://"))
+ url = "";
+ attribute.setValue(url);
+ }
+ } else if (key.equals(BugzillaReportElement.ASSIGNED_TO.toString())) {
+ String assignTo = assignedToText.getText();
+ attribute.setValue(assignTo);
+ } else {
+ // do nothing
+ }
+ } catch (IllegalArgumentException e) {
+ MylarStatusHandler.fail(e, "could not set attribute: " + attribute, false);
+ }
+ }
+ // wizard.attributeCompleted = true;
+ }
+
+ @Override
+ protected void setControl(Control c) {
+ super.setControl(c);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ // whether the priority exists or not
+ boolean priExist = false;
+ boolean mileExist = false;
+
+ String url = null;
+
+ // get the model for the new bug
+ AbstractBugzillaReportWizard wizard = (AbstractBugzillaReportWizard) getWizard();
+ NewBugzillaReport nbm = wizard.model;
+
+ // Set the current platform and OS on the model
+ setPlatformOptions(nbm);
+
+ // Attributes Composite- this holds all the combo fields and text
+ // fields
+ Composite attributesComposite = new Composite(parent, SWT.NONE);
+ GridLayout attributesLayout = new GridLayout();
+ attributesLayout.numColumns = 4;
+ attributesLayout.horizontalSpacing = 14;
+ attributesLayout.verticalSpacing = 6;
+ attributesLayout.makeColumnsEqualWidth = false;
+ attributesComposite.setLayout(attributesLayout);
+
+ GridData attributesData = new GridData(GridData.FILL_BOTH);
+ attributesData.horizontalSpan = 1;
+ attributesData.grabExcessVerticalSpace = false;
+ attributesComposite.setLayoutData(attributesData);
+ // End Attributes Composite
+
+ GridLayout attributesTitleLayout = new GridLayout();
+ attributesTitleLayout.horizontalSpacing = 0;
+ attributesTitleLayout.marginWidth = 0;
+
+ GridData attributesTitleData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ attributesTitleData.horizontalSpan = 4;
+
+ attributesTitleData.grabExcessVerticalSpace = false;
+
+ // Add the product to the composite
+ newLayout(attributesComposite, 1, "Product", PROPERTY);
+ newLayout(attributesComposite, 1, nbm.getProduct(), VALUE);
+
+ // Populate Attributes
+ for (Iterator<RepositoryTaskAttribute> it = nbm.getAttributes().iterator(); it.hasNext();) {
+ RepositoryTaskAttribute attribute = it.next();
+ String key = attribute.getID();
+ String name = attribute.getName();
+ String value = checkText(attribute.getValue());
+ Map<String, String> values = attribute.getOptionValues();
+
+ // if it is a hidden field, don't try to display it
+ if (attribute.isHidden())
+ continue;
+
+ if (key == null)
+ key = "";
+
+ if (values == null)
+ values = new HashMap<String, String>();
+
+ GridData data = new GridData(GridData.BEGINNING);
+ data.horizontalSpan = 1;
+ data.horizontalIndent = HORZ_INDENT;
+ data.widthHint = 150;
+ // create and populate the combo fields for the attributes
+ if (key.equals(BugzillaReportElement.OP_SYS.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+ oSCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL | SWT.READ_ONLY);
+
+ oSCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ oSCombo.add(a[i]);
+ }
+ int index;
+ if ((index = oSCombo.indexOf(value)) == -1)
+ index = 0;
+ oSCombo.select(index);
+ oSCombo.addListener(SWT.Modify, this);
+ } else if (key.equals(BugzillaReportElement.VERSION.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+
+ versionCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL
+ | SWT.READ_ONLY);
+
+ versionCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ versionCombo.add(a[i]);
+ }
+ int index;
+ if ((index = versionCombo.indexOf(value)) == -1)
+ index = 0;
+ versionCombo.select(index);
+ versionCombo.addListener(SWT.Modify, this);
+ } else if (key.equals(BugzillaReportElement.BUG_SEVERITY.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+ severityCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL
+ | SWT.READ_ONLY);
+
+ severityCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ severityCombo.add(a[i]);
+ }
+ int index;
+ if ((index = severityCombo.indexOf(value)) == -1)
+ index = 0;
+ severityCombo.select(index);
+ severityCombo.addListener(SWT.Modify, this);
+
+ } else if (key.equals(BugzillaReportElement.REP_PLATFORM.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+ platformCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL
+ | SWT.READ_ONLY);
+
+ platformCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ platformCombo.add(a[i]);
+ }
+ int index;
+ if ((index = platformCombo.indexOf(value)) == -1)
+ index = 0;
+ platformCombo.select(index);
+ platformCombo.addListener(SWT.Modify, this);
+ } else if (key.equals(BugzillaReportElement.TARGET_MILESTONE.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+ milestoneCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL
+ | SWT.READ_ONLY);
+ milestoneCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ milestoneCombo.add(a[i]);
+ }
+ int index;
+ if ((index = milestoneCombo.indexOf(value)) == -1)
+ index = 0;
+ milestoneCombo.select(index);
+ milestoneCombo.addListener(SWT.Modify, this);
+ //if(s.isEmpty()) milestoneCombo.setEnabled(false);
+ mileExist = true;
+ } else if (key.equals(BugzillaReportElement.COMPONENT.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+ componentCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL
+ | SWT.READ_ONLY);
+
+ componentCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ componentCombo.add(a[i]);
+ }
+ int index;
+ if ((index = componentCombo.indexOf(value)) == -1)
+ index = 0;
+ componentCombo.select(index);
+ componentCombo.addListener(SWT.Modify, this);
+ } else if (key.equals(BugzillaReportElement.PRIORITY.getKeyString())) {
+ newLayout(attributesComposite, 1, name, PROPERTY);
+ priorityCombo = new Combo(attributesComposite, SWT.NO_BACKGROUND | SWT.MULTI | SWT.V_SCROLL
+ | SWT.READ_ONLY);
+
+ priorityCombo.setLayoutData(data);
+ Set<String> s = values.keySet();
+ String[] a = s.toArray(new String[s.size()]);
+ for (int i = 0; i < a.length; i++) {
+ priorityCombo.add(a[i]);
+ }
+ int index;
+ if ((index = priorityCombo.indexOf(value)) == -1)
+ index = 0;
+ priorityCombo.select(index);
+ priorityCombo.addListener(SWT.Modify, this);
+ priExist = true;
+ } else if (key.equals(BugzillaReportElement.BUG_FILE_LOC.getKeyString())) {
+ url = value;
+ } else {
+ // do nothing if it isn't a standard value to change
+ }
+ }
+
+ if (priExist && !mileExist) {
+ newLayout(attributesComposite, 1, "", PROPERTY);
+ newLayout(attributesComposite, 1, "", PROPERTY);
+ }
+
+ Composite textComposite = new Composite(attributesComposite, SWT.NONE);
+ textComposite.setLayout(new GridLayout(3, false));
+ GridData textCompositeGD = new GridData();
+ textCompositeGD.horizontalSpan = 4;
+ textCompositeGD.grabExcessHorizontalSpace = true;
+ textComposite.setLayoutData(textCompositeGD);
+
+
+ GridData urlTextData;
+ if (url != null) {
+ newLayout(textComposite, 1, BugzillaReportElement.BUG_FILE_LOC.toString(), PROPERTY);
+ urlText = new Text(textComposite, SWT.BORDER | SWT.SINGLE | SWT.WRAP);
+ urlTextData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+
+ urlTextData.horizontalSpan = 2;
+ // summaryTextData.widthHint = 200;
+ urlText.setLayoutData(urlTextData);
+ urlText.setText(url);
+ urlText.addListener(SWT.FocusOut, this);
+ }
+
+ GridData summaryTextData;
+ newLayout(textComposite, 1, BugzillaReportElement.ASSIGNED_TO.toString(), PROPERTY);
+ Label l = new Label(textComposite, SWT.NONE);
+ l.setText("(if email is incorrect submit will not proceed)");
+ summaryTextData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ summaryTextData.horizontalSpan = 1;
+ l.setLayoutData(summaryTextData);
+ assignedToText = new Text(textComposite, SWT.BORDER | SWT.SINGLE | SWT.WRAP);
+ summaryTextData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+
+ summaryTextData.horizontalSpan = 1;
+ summaryTextData.widthHint = 200;
+ assignedToText.setLayoutData(summaryTextData);
+ assignedToText.setText("");
+
+
+ IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+ Font repositoryFont = themeManager.getCurrentTheme().getFontRegistry().get(AbstractTaskEditor.REPOSITORY_TEXT_ID);
+
+ // add the summary text field
+ newLayout(textComposite, 1, BugzillaReportElement.SHORT_DESC.toString(), PROPERTY);
+ summaryText = new Text(textComposite, SWT.BORDER | SWT.SINGLE | SWT.WRAP);
+ summaryText.setFont(repositoryFont);
+ summaryTextData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+
+ summaryTextData.horizontalSpan = 2;
+ summaryTextData.widthHint = 200;
+ summaryText.setLayoutData(summaryTextData);
+ summaryText.setText(nbm.getSummary());
+ summaryText.addListener(SWT.Modify, this);
+
+ // Description Text
+ Composite descriptionComposite = new Composite(attributesComposite, SWT.NONE);
+
+ descriptionComposite.setLayout(attributesTitleLayout);
+
+ GridData descriptionData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ descriptionData.horizontalSpan = 4;
+ descriptionData.grabExcessVerticalSpace = false;
+ descriptionComposite.setLayoutData(descriptionData);
+ newLayout(descriptionComposite, 4, "Description:", HEADER);
+
+ // add the description text field
+ descriptionText = new Text(attributesComposite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.WRAP);
+
+ //descriptionText.setFont(AbstractTaskEditor.COMMENT_FONT);
+ descriptionText.setFont(repositoryFont);
+ GridData descriptionTextData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ descriptionTextData.horizontalSpan = 4;
+ descriptionTextData.widthHint = AbstractTaskEditor.DESCRIPTION_WIDTH;
+ descriptionTextData.heightHint = AbstractTaskEditor.DESCRIPTION_HEIGHT;
+ descriptionText.setLayoutData(descriptionTextData);
+ descriptionText.addListener(SWT.Modify, this);
+
+ // serverButton = new Button(attributesComposite, SWT.RADIO);
+ // serverButton.setText("Submit bug report to the server.");
+ // GridData toServerButtonData = new
+ // GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ // toServerButtonData.horizontalSpan = 4;
+ // serverButton.setLayoutData(toServerButtonData);
+ // serverButton.setSelection(true);
+ //
+ // offlineButton = new Button(attributesComposite, SWT.RADIO);
+ // offlineButton.setText("Save bug report offline.");
+ // GridData offlineButtonData = new
+ // GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ // offlineButtonData.horizontalSpan = 4;
+ // offlineButton.setLayoutData(offlineButtonData);
+ // offlineButton.setSelection(false);
+
+ // if (wizard.fromDialog)
+ // offlineButton.setEnabled(false);
+
+ setControl(attributesComposite);
+ return;
+ }
+
+ // /**
+ // * @return <code>true</code> if the radio button to submit the bug to the
+ // * server is selected.
+ // */
+ // public boolean serverSelected() {
+ // return (serverButton == null) ? false : serverButton.getSelection();
+ // }
+ //
+ // /**
+ // * @return <code>true</code> if the radio button to save the bug offline
+ // * is selected.
+ // */
+ // public boolean offlineSelected() {
+ // return (offlineButton == null) ? false : offlineButton.getSelection();
+ // }
+
+ /*
+ * The following are Bugzilla's: OS's All AIX Windows 95 Windows 98 Windows
+ * CE Windows Mobile 2003 Windows Mobile 2005 Windows ME Windows 2000
+ * Windows NT Windows XP Windows 2003 Server Windows All MacOS X Linux
+ * Linux-GTK Linux-Motif HP-UX Neutrino QNX-Photon Solaris Solaris-GTK
+ * Solaris-Motif SymbianOS-Series 80 Unix All other
+ *
+ * The following are the platforsm in Bugzilla: All Macintosh PC Power PC
+ * Sun Other
+ *
+ * The following are Java's Archictures: [PA_RISC, ppc, sparc, x86, x86_64,
+ * ia64, ia64_32]
+ *
+ * The following are Java's OS's: [aix, hpux, linux, macosx, qnx, solaris,
+ * win32]
+ */
+ /**
+ * Sets the OS and Platform for the new bug
+ *
+ * @param newBugModel
+ * The bug to set the options for
+ */
+ public void setPlatformOptions(NewBugzillaReport newBugModel) {
+ try {
+ // A Map from Java's OS and Platform to Buzilla's
+ Map<String, String> java2buzillaOSMap = new HashMap<String, String>();
+ Map<String, String> java2buzillaPlatformMap = new HashMap<String, String>();
+
+ java2buzillaPlatformMap.put("x86", "PC");
+ java2buzillaPlatformMap.put("x86_64", "PC");
+ java2buzillaPlatformMap.put("ia64", "PC");
+ java2buzillaPlatformMap.put("ia64_32", "PC");
+ java2buzillaPlatformMap.put("sparc", "Sun");
+ java2buzillaPlatformMap.put("ppc", "Power");
+
+ java2buzillaOSMap.put("aix", "AIX");
+ java2buzillaOSMap.put("hpux", "HP-UX");
+ java2buzillaOSMap.put("linux", "Linux");
+ java2buzillaOSMap.put("macosx", "MacOS X");
+ java2buzillaOSMap.put("qnx", "QNX-Photon");
+ java2buzillaOSMap.put("solaris", "Solaris");
+ java2buzillaOSMap.put("win32", "Windows");
+
+ // Get OS Lookup Map
+ // Check that the result is in Values, if it is not, set it to other
+ RepositoryTaskAttribute opSysAttribute = newBugModel.getAttribute(BugzillaReportElement.OP_SYS.getKeyString());
+ RepositoryTaskAttribute platformAttribute = newBugModel.getAttribute(BugzillaReportElement.REP_PLATFORM.getKeyString());
+
+ String OS = Platform.getOS();
+ String platform = Platform.getOSArch();
+
+ String bugzillaOS = null; // Bugzilla String for OS
+ String bugzillaPlatform = null; // Bugzilla String for Platform
+
+ if (java2buzillaOSMap != null && java2buzillaOSMap.containsKey(OS) && opSysAttribute != null
+ && opSysAttribute.getOptionValues() != null) {
+ bugzillaOS = java2buzillaOSMap.get(OS);
+ if (opSysAttribute != null && !opSysAttribute.getOptionValues().values().contains(bugzillaOS)) {
+ // If the OS we found is not in the list of available
+ // options, set bugzillaOS
+ // to null, and just use "other"
+ bugzillaOS = null;
+ }
+ } else {
+ // If we have a strangeOS, then just set buzillaOS to null, and
+ // use "other"
+ bugzillaOS = null;
+ }
+
+ if (platform != null && java2buzillaPlatformMap.containsKey(platform)) {
+ bugzillaPlatform = java2buzillaPlatformMap.get(platform);
+
+ if (platformAttribute != null
+ && !platformAttribute.getOptionValues().values().contains(bugzillaPlatform)) {
+ // If the platform we found is not int the list of available
+ // optinos, set the
+ // Bugzilla Platform to null, and juse use "other"
+ bugzillaPlatform = null;
+ }
+ } else {
+ // If we have a strange platform, then just set bugzillaPatforrm
+ // to null, and use "other"
+ bugzillaPlatform = null;
+ }
+
+ // Set the OS and the Platform in the model
+ if (bugzillaOS != null && opSysAttribute != null)
+ opSysAttribute.setValue(bugzillaOS);
+ if (bugzillaPlatform != null && platformAttribute != null)
+ platformAttribute.setValue(bugzillaPlatform);
+
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "could not set platform options", false);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractFavoritesAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractFavoritesAction.java
new file mode 100644
index 0000000..891189b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractFavoritesAction.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.actions;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Class that contains shared functions for the favorites actions
+ */
+public class AbstractFavoritesAction extends Action {
+
+ /**
+ * Set the actions icon
+ *
+ * @param filename
+ * The icons file
+ */
+ protected void setIcon(String filename) {
+ URL url = null;
+ try {
+ // try to change the default icon
+ url = new URL(BugzillaPlugin.getDefault().getBundle().getEntry("/"), filename);
+ setImageDescriptor(ImageDescriptor.createFromURL(url));
+ } catch (MalformedURLException e) {
+ // Simply don't change the default icon
+ }
+ }
+
+ /**
+ * Convienience method for getting the current shell
+ *
+ * @return The current shell
+ */
+ protected Shell getShell() {
+ return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractOfflineReportsAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractOfflineReportsAction.java
new file mode 100644
index 0000000..2bd9853
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractOfflineReportsAction.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.actions;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Class that contains shared functions for the offline report actions
+ */
+public class AbstractOfflineReportsAction extends Action {
+
+ /**
+ * Set the actions icon
+ *
+ * @param filename
+ * The icons file
+ */
+ protected void setIcon(String filename) {
+ URL url = null;
+ try {
+ // try to change the default icon
+ url = new URL(BugzillaUiPlugin.getDefault().getBundle().getEntry("/"), filename);
+ setImageDescriptor(ImageDescriptor.createFromURL(url));
+ } catch (MalformedURLException e) {
+ // Simply don't change the default icon
+ }
+ }
+
+ /**
+ * Convienience method for getting the current shell
+ *
+ * @return The current shell
+ */
+ protected Shell getShell() {
+ return BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractWizardListPage.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractWizardListPage.java
new file mode 100644
index 0000000..f705675
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AbstractWizardListPage.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.wizard;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Class that contains shared functions for the first page of the wizards that
+ * submit bug reports. This page provides the user with a list of items to
+ * choose from.
+ *
+ * TODO: get rid of this unused abstraction?
+ *
+ * @author Mik Kersten (hardening of prototype)
+ */
+public abstract class AbstractWizardListPage extends WizardPage implements Listener {
+
+ /** The instance of the workbench */
+ protected IWorkbench workbench;
+
+ /** The list box for the list of items to choose from */
+ protected List listBox;
+
+ /** Status variable for the possible errors on this page */
+ protected IStatus listStatus;
+
+ public AbstractWizardListPage(String pageName, String title, String description, IWorkbench workbench) {
+ super(pageName);
+ setTitle(title);
+ setDescription(description);
+ this.workbench = workbench;
+
+ // set the status for the page
+ listStatus = new Status(IStatus.OK, "not_used", 0, "", null);
+ }
+
+ public abstract void createAdditionalControls(Composite parent);
+
+ public void createControl(Composite parent) {
+ // create the composite to hold the widgets
+ GridData gd;
+ Composite composite = new Composite(parent, SWT.NULL);
+
+ // create the desired layout for this wizard page
+ GridLayout gl = new GridLayout();
+ int ncol = 1;
+ gl.numColumns = ncol;
+ composite.setLayout(gl);
+
+ // create the bug report label
+// Label label = new Label(composite, SWT.NONE);
+// label.setText(getTableName());
+// FontData fontData = label.getFont().getFontData()[0];
+// fontData.setStyle(SWT.BOLD | fontData.getStyle());
+// int height = (int) Math.abs(fontData.getHeight() * 1.25);
+// fontData.setHeight(height);
+// Font font = new Font(null, fontData);
+// label.setFont(font);
+
+ // create the list of bug reports
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.heightHint = 200;
+ listBox = new List(composite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL);
+ listBox.setLayoutData(gd);
+
+ createLine(composite, ncol);
+
+ // Each wizard has different types of items to add to the list
+ populateList(true);
+
+ createAdditionalControls(composite);
+
+ // set the composite as the control for this page
+ setControl(composite);
+ addListeners();
+ }
+
+ /**
+ * Populate the list of items
+ */
+ abstract protected void populateList(boolean init);
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+ */
+ abstract public void handleEvent(Event event);
+
+ /**
+ * A helper function for "handleEvent"
+ *
+ * @param event
+ * the event which occurred
+ * @param errorMessage
+ * the error message unique to the wizard calling this function
+ */
+ protected void handleEventHelper(Event event, String errorMessage) {
+ // Initialize a variable with the no error status
+ Status status = new Status(IStatus.OK, "not_used", 0, "", null);
+
+ // If the event is triggered by the list of items, respond with the
+ // corresponding status
+ if (event.widget == listBox) {
+ if (listBox.getSelectionIndex() == -1)
+ status = new Status(IStatus.ERROR, "not_used", 0, errorMessage, null);
+ listStatus = status;
+ }
+
+ // Show the most serious error
+ applyToStatusLine(listStatus);
+
+ getWizard().getContainer().updateButtons();
+ }
+
+ /**
+ * Applies the status to the status line of a dialog page.
+ *
+ * @param status
+ * The status to apply to the status line
+ */
+ protected void applyToStatusLine(IStatus status) {
+ String message = status.getMessage();
+ if (message.length() == 0)
+ message = null;
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ setErrorMessage(null);
+ setMessage(message);
+ break;
+ case IStatus.WARNING:
+ setErrorMessage(null);
+ setMessage(message, WizardPage.WARNING);
+ break;
+ case IStatus.INFO:
+ setErrorMessage(null);
+ setMessage(message, WizardPage.INFORMATION);
+ break;
+ default:
+ setErrorMessage(null);
+ setMessage(message, WizardPage.ERROR);
+ break;
+ }
+ }
+
+ /**
+ * Create a separator line in the dialog
+ *
+ * @param parent
+ * The composite to create the line on
+ * @param ncol
+ * The number of columns to span
+ */
+ protected void createLine(Composite parent, int ncol) {
+ Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL | SWT.BOLD);
+ GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+ gridData.horizontalSpan = ncol;
+ line.setLayoutData(gridData);
+ }
+
+// @Override
+// public boolean canFlipToNextPage() {
+// if (getErrorMessage() != null)
+// return false;
+// if (listBox.getSelectionIndex() != -1)
+// return true;
+// return false;
+// }
+
+ /**
+ * Add any listeners that we need
+ */
+ protected void addListeners() {
+ listBox.addListener(SWT.Selection, this);
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return listBox.getSelectionIndex() != -1;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AddFavoriteAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AddFavoriteAction.java
new file mode 100644
index 0000000..8409761
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AddFavoriteAction.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.actions;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.Favorite;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylyn.internal.bugzilla.ui.FavoritesView;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchResultView;
+
+/**
+ * Bookmark a returned Bugzilla Search result.
+ */
+public class AddFavoriteAction extends AbstractFavoritesAction {
+
+ /** Selected objects */
+ private List<Favorite> selected;
+
+ /** The view where the Bugzilla search results are displayed */
+ private BugzillaSearchResultView resultView;
+
+ /**
+ * Constructor
+ *
+ * @param text
+ * The label for the context menu item
+ * @param resultView
+ * The view where the Bugzilla search results are displayed
+ */
+ public AddFavoriteAction(String text, BugzillaSearchResultView resultView) {
+ setText(text);
+ setImageDescriptor(BugzillaImages.IMG_TOOL_ADD_TO_FAVORITES);
+ this.resultView = resultView;
+ selected = null;
+ }
+
+ /**
+ * Bookmark the selected items
+ *
+ * @see org.eclipse.ui.actions.ActionDelegate#run(IAction)
+ */
+ @Override
+ public void run() {
+ FavoritesView.checkWindow();
+
+ selected = new ArrayList<Favorite>();
+ buildSelection();
+
+ // go through each of the selected items and add its data to the
+ // favorites file
+ for (int i = 0; i < selected.size(); i++) {
+ BugzillaPlugin.getDefault().getFavorites().add(selected.get(i));
+ }
+ FavoritesView.add();
+ FavoritesView.updateActionEnablement();
+ }
+
+ /**
+ * Gets the entire selection and puts each bug report into a list. Only the
+ * relevent parts of each bug report are put into the list.
+ */
+ @SuppressWarnings("unchecked")
+ private void buildSelection() {
+ ISelection s = resultView.getViewer().getSelection();
+ if (s instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) s;
+ for (Iterator<IMarker> it = selection.iterator(); it.hasNext();) {
+ IMarker marker = it.next();
+
+ try {
+ // try to get the attribute for the marker
+ Integer attributeId = (Integer) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_ID);
+ String repositoryUrl = (String) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_REPOSITORY);
+
+ // add the selected item to the list of items that are
+ // selected
+ String description = (String) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_DESC);
+ String query = (String) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_QUERY);
+
+ // create a map to add attributes to so that the favorites
+ // file can sort
+ HashMap<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put(IBugzillaConstants.HIT_MARKER_ATTR_ID, attributeId);
+ attributes.put(IBugzillaConstants.HIT_MARKER_ATTR_REPOSITORY, repositoryUrl);
+ attributes.put(IBugzillaConstants.HIT_MARKER_ATTR_PRIORITY, marker
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_PRIORITY));
+ attributes.put(IBugzillaConstants.HIT_MARKER_ATTR_SEVERITY, marker
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_SEVERITY));
+ attributes.put(IBugzillaConstants.HIT_MARKER_ATTR_STATE, marker
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_STATE));
+ attributes.put(IBugzillaConstants.HIT_MARKER_ATTR_RESULT, marker
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_RESULT));
+
+ Favorite favorite = new Favorite(repositoryUrl, attributeId.intValue(), description, query,
+ attributes);
+ selected.add(favorite);
+ } catch (CoreException ignored) {
+ // do nothing
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/AttachmentPartSource.java b/org.eclipse.mylyn/developer/src-old/bugzilla/AttachmentPartSource.java
new file mode 100644
index 0000000..e287ae3
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/AttachmentPartSource.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.httpclient.methods.multipart.PartSource;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskAttachment;
+
+/**
+ * @author Steffen Pingel
+ */
+public class AttachmentPartSource implements PartSource {
+
+ private final ITaskAttachment attachment;
+
+ public AttachmentPartSource(ITaskAttachment attachment) {
+ this.attachment = attachment;
+ }
+
+ public InputStream createInputStream() throws IOException {
+ return attachment.createInputStream();
+ }
+
+ public String getFileName() {
+ return attachment.getFilename();
+ }
+
+ public long getLength() {
+ return attachment.getLength();
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugParser.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugParser.java
new file mode 100644
index 0000000..e621585
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugParser.java
@@ -0,0 +1,1107 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core.internal;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.bugzilla.core.BugReport;
+import org.eclipse.mylyn.bugzilla.core.Comment;
+import org.eclipse.mylyn.bugzilla.core.Operation;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.HtmlStreamTokenizer.Token;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten (hardening of prototype)
+ * @author Rob Elves (attachments) This class parses bugs so that they can be
+ * displayed using the bug editor
+ */
+public class BugParser {
+
+ private static final String VALUE_ATTACHMENT_OBSOLETE = "bz_obsolete";
+
+ private static final String ATTRIBUTE_CLASS = "class";
+
+ private static final String TAG_SPAN = "span";
+
+ private static final String ATTRIBUTE_ID_TITLE = "title";
+
+ private static final String ATTRIBUTE_ID_HREF = "href";
+
+ private static final String ATTACHMENT_CGI_ID = "attachment.cgi?id=";
+
+ private static final String KEY_BUG_NUM = "Bug#";
+
+ private static final String KEY_RESOLUTION = "resolution";
+
+ private static final String KEY_VALUE = "value";
+
+ private static final String KEY_NAME = "name";
+
+ private static final String ATTR_CHARSET = "charset";
+
+ /** Parser for dates in the report */
+ private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+
+ private static final String keywordsUrl = "describekeywords.cgi";
+
+ /**
+ * Parse the case where we have found an attribute name
+ *
+ * @param in
+ * The input stream for the bug
+ * @return The name of the attribute that we are parsing
+ * @throws IOException
+ */
+ private static String parseAttributeName(HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ StringBuffer sb = new StringBuffer();
+
+ parseTableCell(tokenizer, sb);
+ HtmlStreamTokenizer.unescape(sb);
+ // remove the colon if there is one
+ if (sb.length() > 0 && sb.charAt(sb.length() - 1) == ':') {
+ sb.deleteCharAt(sb.length() - 1);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Parse the case where we have found attribute values
+ *
+ * @param in
+ * The input stream of the bug
+ * @param bug
+ * The bug report for the current bug
+ * @param attribute
+ * The name of the attribute
+ * @throws IOException
+ */
+ private static void parseAttributeValue(BugReport bug, String originalAttributeName, HtmlStreamTokenizer tokenizer,
+ String serverUrl, String userName, String password) throws IOException, ParseException {
+
+ // NOTE: special rule to deal with change in 2.20.1
+ String attributeName = originalAttributeName;
+ if (attributeName.endsWith(KEY_BUG_NUM) && attributeName.length() > KEY_BUG_NUM.length()) {
+ attributeName = originalAttributeName.substring(attributeName.length() - KEY_BUG_NUM.length(),
+ attributeName.length());
+ }
+
+ Token token = tokenizer.nextToken();
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+
+ // make sure that we are on a tag that we care about, not a label
+ // fix added so that we can parse the mozilla bug pages
+ if (tag.getTagType() == HtmlTag.Type.LABEL) {
+ token = tokenizer.nextToken();
+ if (token.getType() == Token.TAG)
+ tag = (HtmlTag) token.getValue();
+ else {
+ StringBuffer sb = new StringBuffer();
+ if (token.getType() == Token.TEXT) {
+ sb.append((StringBuffer) token.getValue());
+ parseAttributeValueCell(bug, attributeName, tokenizer, sb);
+ }
+ }
+ }
+
+ if (tag.getTagType() == HtmlTag.Type.SELECT && !tag.isEndTag()) {
+ String parameterName = tag.getAttribute(KEY_NAME);
+ parseSelect(bug, attributeName, parameterName, tokenizer);
+ } else if (tag.getTagType() == HtmlTag.Type.INPUT && !tag.isEndTag()) {
+ parseInput(bug, attributeName, tag, serverUrl, userName, password);
+ } else if (!tag.isEndTag() || attributeName.equalsIgnoreCase(KEY_RESOLUTION)) {
+ if (tag.isEndTag() && attributeName.equalsIgnoreCase(KEY_RESOLUTION)) {
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(attributeName);
+ a.setValue("");
+ bug.addAttribute(a);
+ }
+ parseAttributeValueCell(bug, attributeName, tokenizer);
+ }
+ } else {
+ StringBuffer sb = new StringBuffer();
+ if (token.getType() == Token.TEXT) {
+ sb.append((StringBuffer) token.getValue());
+ parseAttributeValueCell(bug, attributeName, tokenizer, sb);
+ }
+ }
+ }
+
+ /**
+ * Parse the case where the attribute value is just text in a table cell
+ *
+ * @param in
+ * The input stream of the bug
+ * @param bug
+ * The bug report for the current bug
+ * @param attributeName
+ * The name of the attribute that we are parsing
+ * @throws IOException
+ */
+ private static void parseAttributeValueCell(BugReport bug, String attributeName, HtmlStreamTokenizer tokenizer)
+ throws IOException, ParseException {
+ StringBuffer sb = new StringBuffer();
+ parseAttributeValueCell(bug, attributeName, tokenizer, sb);
+ }
+
+ private static void parseAttributeValueCell(BugReport bug, String attributeName, HtmlStreamTokenizer tokenizer,
+ StringBuffer sb) throws IOException, ParseException {
+
+ parseTableCell(tokenizer, sb);
+ HtmlStreamTokenizer.unescape(sb);
+
+ // create a new attribute and set its value to the value that we
+ // retrieved
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(attributeName);
+ a.setValue(sb.toString());
+
+ // if we found an attachment attribute, forget about it, else add the
+ // attribute to the bug report
+ if (attributeName.toLowerCase()).startsWith("attachments")) {
+ // do nothing
+ } else {
+ if (attributeName.equals(KEY_BUG_NUM))
+ a.setValue(a.getValue().replaceFirst("alias:", ""));
+ bug.addAttribute(a);
+ }
+ }
+
+ /**
+ * Reads text into a StringBuffer until it encounters a close table cell tag
+ * (</TD>) or start of another cell. The text is appended to the
+ * existing value of the buffer. <b>NOTE:</b> Does not handle nested cells!
+ *
+ * @param tokenizer
+ * @param sb
+ * @throws IOException
+ * @throws ParseException
+ */
+ private static void parseTableCell(HtmlStreamTokenizer tokenizer, StringBuffer sb) throws IOException,
+ ParseException {
+ boolean noWhitespace = false;
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD) {
+ if (!tag.isEndTag()) {
+ tokenizer.pushback(token);
+ }
+ break;
+ }
+ noWhitespace = token.getWhitespace().length() == 0;
+ } else if (token.getType() == Token.TEXT) {
+ // if there was no whitespace between the tag and the
+ // preceding text, don't insert whitespace before this text
+ // unless it is there in the source
+ if (!noWhitespace && token.getWhitespace().length() > 0 && sb.length() > 0) {
+ sb.append(' ');
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+ }
+
+ /**
+ * Parse the case where the attribute value is an option
+ *
+ * @param in
+ * The input stream for the bug
+ * @param bug
+ * The bug report for the current bug
+ * @param attribute
+ * The name of the attribute that we are parsing
+ * @param parameterName
+ * the SELECT tag's name
+ * @throws IOException
+ */
+ private static void parseSelect(BugReport bug, String attributeName, String parameterName,
+ HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+
+ boolean first = false;
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(attributeName);
+ a.setID(parameterName);
+
+ Token token = tokenizer.nextToken();
+ while (token.getType() != Token.EOF) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.SELECT && tag.isEndTag())
+ break;
+ if (tag.getTagType() == HtmlTag.Type.OPTION && !tag.isEndTag()) {
+ String optionName = tag.getAttribute(KEY_VALUE);
+ boolean selected = tag.hasAttribute("selected");
+ StringBuffer optionText = new StringBuffer();
+ for (token = tokenizer.nextToken(); token.getType() == Token.TEXT; token = tokenizer.nextToken()) {
+ if (optionText.length() > 0) {
+ optionText.append(' ');
+ }
+ optionText.append((StringBuffer) token.getValue());
+ }
+ a.addOptionValue(optionText.toString(), optionName);
+ if (selected || first) {
+ a.setValue(optionText.toString());
+ first = false;
+ }
+ } else {
+ token = tokenizer.nextToken();
+ }
+ } else {
+ token = tokenizer.nextToken();
+ }
+ }
+
+ // if we parsed the cc field add the e-mails to the bug report else add
+ // the attribute to the bug report
+ if (attributeName.toLowerCase().startsWith("cc")) {
+ for (Iterator<String> it = a.getOptionValues().keySet().iterator(); it.hasNext();) {
+ String email = it.next();
+ bug.addCC(HtmlStreamTokenizer.unescape(email));
+ }
+ } else {
+ bug.addAttribute(a);
+ }
+ }
+
+ /**
+ * Parse the case where the attribute value is an input
+ *
+ * @param bug
+ * The bug report for the current bug
+ * @param attributeName
+ * The name of the attribute
+ * @param tag
+ * The INPUT tag
+ * @throws IOException
+ */
+ private static void parseInput(BugReport bug, String attributeName, HtmlTag tag, String serverUrl, String userName,
+ String password) throws IOException {
+
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(attributeName);
+ a.setID(tag.getAttribute(KEY_NAME));
+ String name = tag.getAttribute(KEY_NAME);
+ String value = tag.getAttribute(KEY_VALUE);
+ if (value == null)
+ value = "";
+
+ // if we found the summary, add it to the bug report
+ if (name.equalsIgnoreCase("short_desc")) {
+ bug.setSummary(value);
+ } else if (name.equalsIgnoreCase("bug_file_loc")) {
+ a.setValue(value);
+ bug.addAttribute(a);
+ } else if (name.equalsIgnoreCase("newcc")) {
+ a.setValue(value);
+ bug.addAttribute(a);
+ } else {
+ // otherwise just add the attribute
+ a.setValue(value);
+ bug.addAttribute(a);
+
+ if (attributeName.equalsIgnoreCase("keywords") && serverUrl != null) {
+
+ BufferedReader input = null;
+ try {
+
+ String urlText = "";
+
+ // if we have a user name, may as well log in just in case
+ // it is required
+ if (userName != null && !userName.equals("") && password != null && !password.equals("")) {
+ /*
+ * The UnsupportedEncodingException exception for
+ * URLEncoder.encode() should not be thrown, since every
+ * implementation of the Java platform is required to
+ * support the standard charset "UTF-8"
+ */
+ urlText += "?GoAheadAndLogIn=1&Bugzilla_login=" + URLEncoder.encode(userName, "UTF-8")
+ + "&Bugzilla_password=" + URLEncoder.encode(password, "UTF-8");
+ }
+
+ // connect to the bugzilla server to get the keyword list
+ URL url = new URL(serverUrl + "/" + keywordsUrl + urlText);
+ URLConnection urlConnection = BugzillaPlugin.getDefault().getUrlConnection(url);
+ input = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
+
+ // parse the valid keywords and add them to the bug
+ List<String> keywords = new KeywordParser(input).getKeywords();
+ bug.setKeywords(keywords);
+
+ } catch (Exception e) {
+ // throw an exception if there is a problem reading the bug
+ // from the server
+ throw new IOException("Exception while fetching the list of keywords from the server: "
+ + e.getMessage());
+ } finally {
+ try {
+ if (input != null)
+ input.close();
+ } catch (IOException e) {
+ BugzillaPlugin.log(new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID, IStatus.ERROR,
+ "Problem closing the stream", e));
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Parse the case where we are dealing with the description
+ *
+ * @param bug
+ * The bug report for the bug
+ * @throws IOException
+ */
+ private static void parseDescription(BugReport bug, HtmlStreamTokenizer tokenizer) throws IOException,
+ ParseException {
+
+ StringBuffer sb = new StringBuffer();
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (sb.length() > 0) {
+ sb.append(token.getWhitespace());
+ }
+ if (tag.getTagType() == HtmlTag.Type.PRE && tag.isEndTag())
+ break;
+ } else if (token.getType() == Token.TEXT) {
+ if (sb.length() > 0) {
+ sb.append(token.getWhitespace());
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+
+ // set the bug to have the description we retrieved
+ String text = HtmlStreamTokenizer.unescape(sb).toString();
+ bug.setDescription(text);
+ }
+
+ // /**
+ // * parses the description of an attachment on the report
+ // */
+ // private static String parseAttachementDescription(HtmlStreamTokenizer
+ // tokenizer) throws IOException,
+ // ParseException {
+ //
+ // StringBuffer sb = new StringBuffer();
+ // for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF;
+ // token = tokenizer.nextToken()) {
+ // if (token.getType() == Token.TAG) {
+ // HtmlTag tag = (HtmlTag) token.getValue();
+ // if (tag.getTagType() == HtmlTag.Type.A && tag.isEndTag())
+ // break;
+ // } else if (token.getType() == Token.TEXT) {
+ // if (sb.length() > 0) {
+ // sb.append(token.getWhitespace());
+ // }
+ // sb.append((StringBuffer) token.getValue());
+ // }
+ // }
+ //
+ // // set the bug to have the description we retrieved
+ // String text = HtmlStreamTokenizer.unescape(sb).toString();
+ // return text;
+ // }
+
+ /**
+ * Parse the case where we have found the start of a comment
+ *
+ * @param in
+ * The input stream of the bug
+ * @param bug
+ * The bug report for the current bug
+ * @return The comment that we have created with the information
+ * @throws IOException
+ * @throws ParseException
+ */
+ private static Comment parseCommentHead(BugReport bug, HtmlStreamTokenizer tokenizer) throws IOException,
+ ParseException {
+ int number = 0;
+ Date date = null;
+ String author = null;
+ String authorName = null;
+
+ // get the comment's number
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.A) {
+ String href = tag.getAttribute(ATTRIBUTE_ID_HREF);
+ if (href != null) {
+ int index = href.toLowerCase().indexOf("#c");
+ if (index == -1)
+ continue;
+ token = tokenizer.nextToken();
+ number = Integer.parseInt(((StringBuffer) token.getValue()).toString().substring(1));
+ break;
+ }
+ }
+ }
+ }
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.A) {
+ String href = tag.getAttribute(ATTRIBUTE_ID_HREF);
+ if (href != null) {
+ int index = href.toLowerCase().indexOf("mailto");
+ if (index == -1)
+ continue;
+ author = href.substring(index + 7);
+ break;
+ }
+ }
+ }
+ }
+
+ // get the author's real name
+ StringBuffer sb = new StringBuffer();
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.A && tag.isEndTag())
+ break;
+ } else if (token.getType() == Token.TEXT) {
+ if (sb.length() > 0) {
+ sb.append(' ');
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+ authorName = sb.toString();
+
+ // get the comment's date
+ sb.setLength(0);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.I && tag.isEndTag())
+ break;
+ } else if (token.getType() == Token.TEXT) {
+ if (sb.length() > 0) {
+ sb.append(' ');
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+ try {
+ if (sb.length() >= 16) {
+ date = df.parse(sb.substring(0, 16));
+ }
+ } catch (Exception e) {
+ date = Calendar.getInstance().getTime(); // XXX: could not
+ // determine date
+ }
+ return new Comment(bug, number, date, author, authorName);
+ }
+
+ /**
+ * Parse the case where we have comment text
+ *
+ * @param in
+ * The input stream for the bug
+ * @param bug
+ * The bug report for the current bug
+ * @param comment
+ * The comment to add the text to
+ * @throws IOException
+ */
+ private static void parseCommentText(BugReport bug, Comment comment, HtmlStreamTokenizer tokenizer)
+ throws IOException, ParseException {
+
+ StringBuffer commentStringBuffer = new StringBuffer();
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagName().equals(TAG_SPAN)) {
+ if(tag.hasAttribute(ATTRIBUTE_CLASS) && tag.getAttribute(ATTRIBUTE_CLASS).equals("")) {
+ parseAttachment(commentStringBuffer, comment, tokenizer, false);
+ continue;
+ } else if(tag.hasAttribute(ATTRIBUTE_CLASS) && tag.getAttribute(ATTRIBUTE_CLASS).equals(VALUE_ATTACHMENT_OBSOLETE)) {
+ parseAttachment(commentStringBuffer, comment, tokenizer, true);
+ continue;
+ }
+ }
+ // added to ensure whitespace is not
+ // lost if adding a tag within a tag
+ if (commentStringBuffer.length() > 0) {
+ commentStringBuffer.append(token.getWhitespace());
+ }
+ if (tag.getTagType() == HtmlTag.Type.PRE && tag.isEndTag())
+ break;
+ } else if (token.getType() == Token.TEXT) {
+ if (commentStringBuffer.length() > 0) {
+ commentStringBuffer.append(token.getWhitespace());
+ }
+ commentStringBuffer.append((StringBuffer) token.getValue());
+ }
+ // remove attachment description from comment body
+ if (comment.hasAttachment() && commentStringBuffer.indexOf(comment.getAttachmentDescription()) == 0) {
+ commentStringBuffer = new StringBuffer();
+ }
+ }
+
+ HtmlStreamTokenizer.unescape(commentStringBuffer);
+ comment.setText(commentStringBuffer.toString());
+ bug.addComment(comment);
+ }
+
+ private static void parseAttachment(StringBuffer stringBuffer, Comment comment, HtmlStreamTokenizer tokenizer, boolean obsolete)
+ throws IOException, ParseException {
+
+ int attachmentID = -1;
+ String attachmentDescription = "";
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+
+ if (tag.getTagType() == HtmlTag.Type.A && !comment.hasAttachment()) {
+ if (tag.getAttribute(ATTRIBUTE_ID_HREF) != null) {
+ String link = tag.getAttribute(ATTRIBUTE_ID_HREF);
+ if (link.startsWith(ATTACHMENT_CGI_ID)) {
+ try {
+ int endIndex = link.indexOf("&");
+ if (endIndex > 0 && endIndex < link.length()) {
+ attachmentID = Integer.parseInt(link
+ .substring(ATTACHMENT_CGI_ID.length(), endIndex));
+ }
+ } catch (NumberFormatException e) {
+ return;
+ }
+ }
+ if (tag.getAttribute(ATTRIBUTE_ID_TITLE) != null) {
+ attachmentDescription = tag.getAttribute(ATTRIBUTE_ID_TITLE);
+ }
+ if (attachmentID > 0) {
+ comment.setHasAttachment(true);
+ comment.setAttachmentId(attachmentID);
+ comment.setAttachmentDescription(attachmentDescription);
+ comment.setObsolete(obsolete);
+ }
+
+ }
+ }
+ if (tag.getTagName().equals(TAG_SPAN) && tag.isEndTag())
+ break;
+ }
+ }
+ }
+
+ /**
+ * Parse the full html version of the bug
+ *
+ * @param in -
+ * the input stream for the bug
+ * @param id -
+ * the id of the bug that is to be parsed
+ * @return A bug report for the bug that was parsed
+ * @throws IOException
+ * @throws ParseException
+ */
+ public static BugReport parseBug(Reader in, int id, String serverUrl, boolean is218, String userName,
+ String password, String contentType) throws IOException, ParseException, LoginException {
+ // create a new bug report and set the parser state to the start state
+ BugReport bug = new BugReport(id, serverUrl);
+ boolean contentTypeResolved = false;
+ if (contentType != null) {
+ String charsetFromContentType = getCharsetFromString(contentType);
+ if (charsetFromContentType != null) {
+ bug.setCharset(charsetFromContentType);
+ contentTypeResolved = true;
+ }
+ }
+ ParserState state = ParserState.START;
+ Comment comment = null;
+ String attribute = null;
+
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+
+ boolean isTitle = false;
+ boolean possibleBadLogin = false;
+ boolean checkBody = false;
+ String title = "";
+ StringBuffer body = new StringBuffer();
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+
+ // get the charset from the HTML if not specified
+ if (!contentTypeResolved) {
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.META
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ String charsetFromHtml = getCharsetFromString(token.toString());
+ if (charsetFromHtml != null)
+ bug.setCharset(charsetFromHtml);
+ }
+ }
+
+ // make sure that bugzilla doesn't want us to login
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " ";
+ continue;
+ } else if (token.getType() == Token.TAG
+ && ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+ // check and see if the title seems as though we have wrong
+ // login info
+ if (title.indexOf("login") != -1
+ || (title.indexOf("invalid") != -1 && title.indexOf("password") != -1)
+ || title.indexOf("check e-mail") != -1)
+ possibleBadLogin = true; // we possibly have a bad
+ // login
+
+ // if the title starts with error, we may have a login
+ // problem, or
+ // there is a problem with the bug (doesn't exist), so we
+ // must do
+ // some more checks
+ if (title.startsWith("error"))
+ checkBody = true;
+
+ isTitle = false;
+ title = "";
+ }
+ continue;
+ }
+
+ // if we have to add all of the text so that we can check it later
+ // for problems with the username and password
+ if (checkBody && token.getType() == Token.TEXT) {
+ body.append((StringBuffer) token.getValue());
+ body.append(" ");
+ }
+
+ // we have found the start of an attribute name
+ if ((state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD && "right".equalsIgnoreCase(tag.getAttribute("align"))) {
+ // parse the attribute's name
+ attribute = parseAttributeName(tokenizer);
+ if (attribute != null && attribute.contains(IBugzillaConstants.INVALID_2201_ATTRIBUTE_IGNORED)) {
+ continue;
+ }
+ if (attribute.toLowerCase().startsWith("opened")) {
+ // find the colon so we can get the date
+ int index = attribute.toLowerCase().indexOf(":");
+ String date;
+ if (index != -1)
+ date = attribute.substring(index + 1).trim();
+ else
+ date = attribute.substring(6).trim();
+
+ // set the bugs opened date to be the date we parsed
+ bug.setCreated(df.parse(date));
+ state = ParserState.ATT_NAME;
+ continue;
+ }
+
+ // in 2.18, the last modified looks like the opened so we
+ // need to parse it differently
+ if (attribute.toLowerCase().startsWith("last modified") && is218) {
+ // find the colon so we can get the date
+ int index = attribute.toLowerCase().indexOf(":");
+ String date;
+ if (index != -1)
+ date = attribute.substring(index + 1).trim();
+ else
+ date = attribute.substring(6).trim();
+
+ // create a new attribute and set the date
+ AbstractRepositoryReportAttribute t = new AbstractRepositoryReportAttribute("Last Modified");
+ t.setValue(date);
+
+ // add the attribute to the bug report
+ bug.addAttribute(t);
+ bug.setLastModified(df.parse(date));
+ state = ParserState.ATT_NAME;
+ continue;
+ }
+
+ state = ParserState.ATT_VALUE;
+ continue;
+ } else if (tag.getTagType() == HtmlTag.Type.INPUT && "radio".equalsIgnoreCase(tag.getAttribute("type"))
+ && "knob".equalsIgnoreCase(tag.getAttribute(KEY_NAME))) {
+ // we found a radio button
+ parseOperations(bug, tokenizer, tag, is218);
+ }
+ }
+
+ // we have found the start of attribute values
+ if (state == ParserState.ATT_VALUE && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD) {
+ // parse the attribute values
+ parseAttributeValue(bug, attribute, tokenizer, serverUrl, userName, password);
+
+ state = ParserState.ATT_NAME;
+ attribute = null;
+ continue;
+ }
+ }
+
+ // we have found the start of a comment
+ if (state == ParserState.DESC_START && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.I) {
+ // parse the comment's start
+ comment = parseCommentHead(bug, tokenizer);
+
+ state = ParserState.DESC_VALUE;
+ continue;
+ }
+ }
+
+ // we have found the start of the comment text
+ if (state == ParserState.DESC_VALUE && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.PRE) {
+ // parse the text of the comment
+ parseCommentText(bug, comment, tokenizer);
+
+ comment = null;
+ state = ParserState.DESC_START;
+ continue;
+ }
+ }
+
+ // last modification date
+ if (bug.getCreated() == null && (state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.DIV && tag.getAttribute("id") != null && "header".equalsIgnoreCase(tag.getAttribute("id"))) {
+ StringBuffer sb = new StringBuffer();
+ parseLastModified(sb, tokenizer);
+ if(sb.length() > 0) {
+ int index = sb.indexOf(":");
+ String date;
+ if (index != -1)
+ date = sb.substring(index + 1).trim();
+ else
+ date = sb.substring(6).trim();
+
+ // create a new attribute and set the date
+ AbstractRepositoryReportAttribute t = new AbstractRepositoryReportAttribute("Last Modified");
+ t.setValue(date);
+
+ // add the attribute to the bug report
+ bug.setLastModified(df.parse(date));
+ bug.addAttribute(t);
+ }
+ continue;
+ }
+ }
+
+
+ // look for date opened field
+ if (bug.getCreated() == null && (state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD && tag.getAttribute("align") != null && "left".equalsIgnoreCase(tag.getAttribute("align")) && tag.getAttribute("width") != null && "30%".equals(tag.getAttribute("width"))) {
+ StringBuffer sb = new StringBuffer();
+ parseDateOpened(sb, tokenizer);
+ if(sb.length() > 0) {
+ int index = sb.indexOf(":");
+ String date;
+ if (index != -1)
+ date = sb.substring(index + 1).trim();
+ else
+ date = sb.substring(6).trim();
+
+ // set the bugs opened date to be the date we parsed
+ bug.setCreated(df.parse(date));
+ }
+ continue;
+ }
+ }
+
+ // we have found the description of the bug
+ if ((state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.PRE) {
+ // parse the description for the bug
+ parseDescription(bug, tokenizer);
+
+ state = ParserState.DESC_START;
+ continue;
+ }
+ }
+
+ // parse hidden fields
+
+ if ((state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.INPUT && tag.getAttribute("type") != null
+ && "hidden".equalsIgnoreCase(tag.getAttribute("type").trim())) {
+
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(tag.getAttribute(KEY_NAME));
+ a.setID(tag.getAttribute(KEY_NAME));
+ a.setValue(tag.getAttribute(KEY_VALUE));
+ a.setHidden(true);
+ bug.addAttribute(a);
+ continue;
+ }
+ }
+
+ // // parse out attachments
+ // if(token.getType() == Token.TAG) {
+ // HtmlTag tag = (HtmlTag) token.getValue();
+ // if(tag.getTagType() == HtmlTag.Type.A && tag.getAttribute("href")
+ // != null) {
+ // String link = tag.getAttribute("href");
+ // if(link.startsWith("attachment.cgi?id=") &&
+ // !link.contains("action")) {
+ // int attachmentID = Integer.parseInt(link.substring(18));
+ // String description = parseAttachementDescription(tokenizer);
+ // bug.addAttachment(attachmentID, description);
+ // }
+ // }
+ // }
+
+ }
+
+ // if we are to check the body, make sure that there wasn't a bad login
+ if (checkBody) {
+ String b = body.toString();
+ if (b.indexOf("login") != -1
+ || ((b.indexOf("invalid") != -1 || b.indexOf("not valid") != -1) && b.indexOf("password") != -1)
+ || b.indexOf("check e-mail") != -1)
+ possibleBadLogin = true; // we possibly have a bad login
+ }
+
+ // if there is no summary or created date, we expect that
+ // the bug doesn't exist, so set it to null
+
+ // if the bug seems like it doesn't exist, and we suspect a login
+ // problem, assume that there was a login problem
+ if (bug.getCreated() == null && bug.getAttributes().isEmpty()) {
+ if (possibleBadLogin) {
+ throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE);
+ } else {
+ return null;
+ }
+ }
+ // we are done...return the bug
+ return bug;
+ }
+
+ private static void parseDateOpened(StringBuffer sb, HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD && tag.isEndTag())
+ break;
+ } else if (token.getType() == Token.TEXT) {
+ if (sb.length() > 0) {
+ sb.append(' ');
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+
+ }
+
+ private static void parseLastModified(StringBuffer sb, HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+ boolean inH3 = false;
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.H3 && !tag.isEndTag()) {
+ inH3 = true;
+ continue;
+ } else if (tag.getTagType() == HtmlTag.Type.DIV && tag.isEndTag()) {
+ break;
+ }
+ } else if (token.getType() == Token.TEXT && inH3) {
+ if (sb.length() > 0) {
+ sb.append(' ');
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+
+ }
+
+ public static String getCharsetFromString(String string) {
+ int charsetStartIndex = string.indexOf(ATTR_CHARSET);
+ if (charsetStartIndex != -1) {
+ int charsetEndIndex = string.indexOf("\"", charsetStartIndex); // TODO:
+ // could
+ // be
+ // space
+ // after?
+ if (charsetEndIndex == -1) {
+ charsetEndIndex = string.length();
+ }
+ String charsetString = string.substring(charsetStartIndex + 8, charsetEndIndex);
+ if (Charset.availableCharsets().containsKey(charsetString)) {
+ return charsetString;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Parse the operations that are allowed on the bug (Assign, Re-open, fix)
+ *
+ * @param bug
+ * The bug to add the operations to
+ * @param tokenizer
+ * The stream tokenizer for the bug
+ * @param tag
+ * The last tag that we were on
+ */
+ private static void parseOperations(BugReport bug, HtmlStreamTokenizer tokenizer, HtmlTag tag, boolean is218)
+ throws ParseException, IOException {
+
+ String knobName = tag.getAttribute(KEY_VALUE);
+ boolean isChecked = false;
+ if (tag.getAttribute("checked") != null && tag.getAttribute("checked").equals("checked"))
+ isChecked = true;
+ StringBuffer sb = new StringBuffer();
+
+ Token lastTag = null;
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+
+ if (!(tag.getTagType() == HtmlTag.Type.A || tag.getTagType() == HtmlTag.Type.B
+ || tag.getTagType() == HtmlTag.Type.STRONG || tag.getTagType() == HtmlTag.Type.LABEL)) {
+ lastTag = token;
+ break;
+ } else {
+
+ if (is218 && tag.getTagType() == HtmlTag.Type.LABEL) {
+ continue;
+ } else if (tag.getTagType() == HtmlTag.Type.A || tag.getTagType() == HtmlTag.Type.B
+ || tag.getTagType() == HtmlTag.Type.STRONG) {
+ sb.append(tag.toString().trim() + " ");
+ } else {
+ break;
+ }
+ }
+ } else if (token.getType() == Token.TEXT && !token.toString().trim().equals("\n"))
+ sb.append(token.toString().trim() + " ");
+ }
+
+ String displayName = HtmlStreamTokenizer.unescape(sb).toString();
+ Operation o = new Operation(knobName, displayName);
+ o.setChecked(isChecked);
+
+ if (lastTag != null) {
+ tag = (HtmlTag) lastTag.getValue();
+ if (tag.getTagType() != HtmlTag.Type.SELECT) {
+ tokenizer.pushback(lastTag);
+ if (tag.getTagType() == HtmlTag.Type.INPUT
+ && !("radio".equalsIgnoreCase(tag.getAttribute("type")) && "knob".equalsIgnoreCase(tag
+ .getAttribute(KEY_NAME)))) {
+ o.setInputName(((HtmlTag) lastTag.getValue()).getAttribute(KEY_NAME));
+ o.setInputValue(((HtmlTag) lastTag.getValue()).getAttribute(KEY_VALUE));
+ }
+ } else {
+ Token token = tokenizer.nextToken();
+ // parse the options
+
+ tag = (HtmlTag) token.getValue();
+ o.setUpOptions(((HtmlTag) lastTag.getValue()).getAttribute(KEY_NAME));
+
+ while (token.getType() != Token.EOF) {
+ if (token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.SELECT && tag.isEndTag())
+ break;
+ if (tag.getTagType() == HtmlTag.Type.OPTION && !tag.isEndTag()) {
+ String optionName = tag.getAttribute(KEY_VALUE);
+ StringBuffer optionText = new StringBuffer();
+ for (token = tokenizer.nextToken(); token.getType() == Token.TEXT; token = tokenizer
+ .nextToken()) {
+ if (optionText.length() > 0) {
+ optionText.append(' ');
+ }
+ optionText.append((StringBuffer) token.getValue());
+ }
+ o.addOption(optionText.toString(), optionName);
+ } else {
+ token = tokenizer.nextToken();
+ }
+ } else {
+ token = tokenizer.nextToken();
+ }
+ }
+ }
+ }
+
+ bug.addOperation(o);
+ }
+
+ /**
+ * Enum class for describing current state of Bugzilla report parser.
+ */
+ private static class ParserState {
+ /** An instance of the start state */
+ protected static final ParserState START = new ParserState("start");
+
+ /** An instance of the state when the parser found an attribute name */
+ protected static final ParserState ATT_NAME = new ParserState("att_name");
+
+ /** An instance of the state when the parser found an attribute value */
+ protected static final ParserState ATT_VALUE = new ParserState("att_value");
+
+ /** An instance of the state when the parser found a description */
+ protected static final ParserState DESC_START = new ParserState("desc_start");
+
+ /** An instance of the state when the parser found a description value */
+ protected static final ParserState DESC_VALUE = new ParserState("desc_value");
+
+ /** State's human-readable name */
+ private String name;
+
+ /**
+ * Constructor
+ *
+ * @param description -
+ * The states human readable name
+ */
+ private ParserState(String description) {
+ this.name = description;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugSubmissionHandler.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugSubmissionHandler.java
new file mode 100644
index 0000000..0330075
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugSubmissionHandler.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.editor;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaException;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaReportSubmitForm;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
+import org.eclipse.mylyn.internal.bugzilla.core.PossibleBugzillaFailureException;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.tasks.core.UnrecognizedReponseException;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskRepositoriesView;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugSubmissionHandler {
+
+ private static final String LABEL_JOB_SUBMIT = "Submitting to Bugzilla repository";
+
+ private AbstractRepositoryConnector connector;
+
+ public BugSubmissionHandler(AbstractRepositoryConnector connector) {
+ this.connector = connector;
+ }
+
+ public void submitBugReport(BugzillaReportSubmitForm form, IJobChangeListener listener, boolean synchExec,
+ boolean addToTaskListRoot) {
+ submitBugReport(form, listener, synchExec, addToTaskListRoot ? TasksUiPlugin.getTaskList()
+ .getRootCategory() : null);
+ }
+
+ public void submitBugReport(final BugzillaReportSubmitForm form, IJobChangeListener listener, boolean synchExec,
+ final AbstractTaskContainer container) {
+ if (synchExec) {
+ try {
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
+ form.getTaskData().getRepositoryKind(), form.getTaskData().getRepositoryUrl());
+ if (repository != null) {
+ BugzillaClient client = ((BugzillaRepositoryConnector) connector).getClientManager().getClient(
+ repository);
+ String submittedBugId = form.submitReportToRepository(client);
+ if (form.isNewBugPost()) {
+ handleNewBugPost(form.getTaskData(), submittedBugId, container);
+ } else {
+ handleExistingBugPost(form.getTaskData(), submittedBugId);
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ Job submitJob = new Job(LABEL_JOB_SUBMIT) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ String submittedBugId = "";
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
+ form.getTaskData().getRepositoryKind(), form.getTaskData().getRepositoryUrl());
+ BugzillaClient client = ((BugzillaRepositoryConnector) connector).getClientManager().getClient(
+ repository);
+
+ submittedBugId = form.submitReportToRepository(client);
+
+ if (form.isNewBugPost()) {
+ handleNewBugPost(form.getTaskData(), submittedBugId, container);
+ return new Status(Status.OK, BugzillaUiPlugin.PLUGIN_ID, Status.OK, submittedBugId, null);
+ } else {
+ // NOTE: sync now handled by editor
+ //handleExistingBugPost(form.getTaskData(), submittedBugId);
+ return Status.OK_STATUS;
+ }
+ } catch (GeneralSecurityException e) {
+ return new Status(
+ Status.OK,
+ BugzillaUiPlugin.PLUGIN_ID,
+ Status.ERROR,
+ "Bugzilla could not post your bug, probably because your credentials are incorrect. Ensure proper repository configuration in "
+ + TaskRepositoriesView.NAME + ".", e);
+ } catch (UnrecognizedReponseException e) {
+ return new Status(Status.OK, BugzillaUiPlugin.PLUGIN_ID, Status.INFO,
+ "Unrecognized response from server", e);
+ } catch (IOException e) {
+ return new Status(Status.OK, BugzillaUiPlugin.PLUGIN_ID, Status.ERROR, "IO Error: \n\n"
+ + e.getMessage(), e);
+ } catch (BugzillaException e) {
+ // MylarStatusHandler.fail(e, "Failed to submit",
+ // false);
+ String message = e.getMessage();
+ return new Status(Status.OK, BugzillaUiPlugin.PLUGIN_ID, Status.ERROR,
+ "Bugzilla could not post your bug. \n\n" + message, e);
+ } catch (PossibleBugzillaFailureException e) {
+ return new Status(Status.OK, BugzillaUiPlugin.PLUGIN_ID, Status.INFO,
+ "Possible bugzilla failure", e);
+ }
+ }
+ };
+
+ submitJob.addJobChangeListener(listener);
+ submitJob.schedule();
+ }
+ }
+
+ private void handleNewBugPost(RepositoryTaskData taskData, String resultId, AbstractTaskContainer category)
+ throws BugzillaException {
+ int bugId = -1;
+ try {
+ bugId = Integer.parseInt(resultId);
+ } catch (NumberFormatException e) {
+ throw new BugzillaException("Invalid bug id returned by repository.");
+ }
+
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(taskData.getRepositoryKind(),
+ taskData.getRepositoryUrl());
+
+ BugzillaTask newTask = new BugzillaTask(AbstractTask.getHandle(repository.getUrl(), bugId),
+ "<bugzilla info>", true);
+
+ if (category != null) {
+ TasksUiPlugin.getTaskList().addTask(newTask, category);
+ } else {
+ TasksUiPlugin.getTaskList().addTask(newTask);
+ }
+ TasksUiPlugin.getSynchronizationScheduler().synchNow(0, Collections.singletonList(repository));
+
+ }
+
+ // Used when run in forced sync mode for testing
+ private void handleExistingBugPost(RepositoryTaskData repositoryTaskData, String resultId) {
+ try {
+ String handle = AbstractTask.getHandle(repositoryTaskData.getRepositoryUrl(), repositoryTaskData
+ .getId());
+ final ITask task = TasksUiPlugin.getTaskList().getTask(handle);
+ if (task != null) {
+ Set<AbstractRepositoryQuery> queriesWithHandle = TasksUiPlugin.getTaskList()
+ .getQueriesForHandle(task.getHandleIdentifier());
+ TasksUiPlugin.getSynchronizationManager().synchronize(connector, queriesWithHandle, null, Job.SHORT, 0,
+ false);
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(
+ repositoryTaskData.getRepositoryKind(), repositoryTaskData.getRepositoryUrl());
+ TasksUiPlugin.getSynchronizationManager().synchronizeChanged(connector, repository);
+ if (task instanceof AbstractTask) {
+ AbstractTask repositoryTask = (AbstractTask) task;
+ // TODO: This is set to null in order for update to bypass
+ // ui override check with user
+ // Need to change how this is achieved.
+ repositoryTask.setTaskData(null);
+ TasksUiPlugin.getSynchronizationManager().synchronize(connector, repositoryTask, true, null);
+ }
+ }
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/Bugzilla220ParserTest.java b/org.eclipse.mylyn/developer/src-old/bugzilla/Bugzilla220ParserTest.java
new file mode 100644
index 0000000..a102e79
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/Bugzilla220ParserTest.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.BugReport;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.BugParser;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.NewBugParser;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class Bugzilla220ParserTest extends TestCase {
+
+ public static final String TEST_SERVER = IBugzillaConstants.ECLIPSE_BUGZILLA_URL;
+
+ private static final String PRODUCT_MYLAR = "Mylar";
+
+ private static final String PRODUCT_TEST = "TestProduct";
+
+ public void testId220() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path(
+ "testdata/pages/test-report-220.html"));
+ Reader in = new FileReader(f);
+
+ BugReport bug = BugParser.parseBug(in, 7, TEST_SERVER, false, null, null, null);
+
+ assertEquals(7, bug.getId());
+ assertEquals("summary", bug.getSummary());
+ assertEquals("7", bug.getAttribute("Bug#").getValue());
+ assertEquals("7", bug.getAttribute("id").getValue());
+ }
+
+ public void testId2201() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path(
+ "testdata/pages/test-report-2201.html"));
+ Reader in = new FileReader(f);
+
+ BugReport bug = BugParser.parseBug(in, 125527, TEST_SERVER, false, null, null, null);
+
+ assertEquals(125527, bug.getId());
+ assertEquals("bugzilla refresh incorrect for new reports and newly opened hits", bug.getSummary());
+ assertEquals("125527", bug.getAttribute("Bug#").getValue());
+ assertEquals("125527", bug.getAttribute("id").getValue());
+ }
+
+ public void testNewBugProduct220() throws Exception {
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+
+ File f = FileTool
+ .getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path("testdata/pages/enter-bug220.html"));
+ Reader in = new FileReader(f);
+
+ new NewBugParser(in).parseBugAttributes(nbm, true);
+ assertEquals(PRODUCT_TEST, nbm.getAttribute("product").getValue());
+ }
+
+ public void testNewBugProduct2201() throws Exception {
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(),
+ new Path("testdata/pages/enter-bug2201.html"));
+ Reader in = new FileReader(f);
+
+ new NewBugParser(in).parseBugAttributes(nbm, true);
+ assertEquals(PRODUCT_MYLAR, nbm.getAttribute("product").getValue());
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaAttributeFactory.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaAttributeFactory.java
new file mode 100644
index 0000000..c9f0fa3
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaAttributeFactory.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+
+/**
+ * @author Rob Elves
+ * @author Mik Kersten
+ * @deprecated
+ */
+ at Deprecated
+public class BugzillaAttributeFactory extends AbstractAttributeFactory {
+
+ private static final String DATE_FORMAT_1 = "yyyy-MM-dd HH:mm";
+
+ private static final String DATE_FORMAT_2 = "yyyy-MM-dd HH:mm:ss";
+
+ private static final String delta_ts_format = DATE_FORMAT_2;
+
+ private static final String creation_ts_format = DATE_FORMAT_1;
+
+ /**
+ * public for testing Bugzilla 2.18 uses DATE_FORMAT_1 but later versions use DATE_FORMAT_2 Using lowest common
+ * denominator DATE_FORMAT_1
+ */
+ public static final String comment_creation_ts_format = DATE_FORMAT_1;
+
+ private static final String attachment_creation_ts_format = DATE_FORMAT_1;
+
+ private static final long serialVersionUID = 5087501781682994759L;
+
+ @Override
+ public String mapCommonAttributeKey(String key) {
+ if (key.equals(RepositoryTaskAttribute.NEW_CC)) {
+ return BugzillaAttribute.NEWCC.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.COMMENT_DATE)) {
+ return BugzillaAttribute.BUG_WHEN.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.COMMENT_AUTHOR)) {
+ return BugzillaAttribute.WHO.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.COMMENT_AUTHOR_NAME)) {
+ return BugzillaAttribute.WHO_NAME.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.USER_CC)) {
+ return BugzillaAttribute.CC.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.COMMENT_TEXT)) {
+ return BugzillaAttribute.THETEXT.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.DATE_CREATION)) {
+ return BugzillaAttribute.CREATION_TS.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.DESCRIPTION)) {
+ return BugzillaAttribute.DESC.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.ATTACHMENT_ID)) {
+ return BugzillaAttribute.ATTACHID.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.ATTACHMENT_TYPE)) {
+ return BugzillaAttribute.TYPE.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.ATTACHMENT_CTYPE)) {
+ return BugzillaAttribute.CTYPE.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.USER_ASSIGNED)) {
+ return BugzillaAttribute.ASSIGNED_TO.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.USER_ASSIGNED_NAME)) {
+ return BugzillaAttribute.ASSIGNED_TO_NAME.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.RESOLUTION)) {
+ return BugzillaAttribute.RESOLUTION.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.STATUS)) {
+ return BugzillaAttribute.BUG_STATUS.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.DATE_MODIFIED)) {
+ return BugzillaAttribute.DELTA_TS.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.USER_REPORTER)) {
+ return BugzillaAttribute.REPORTER.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.USER_REPORTER_NAME)) {
+ return BugzillaAttribute.REPORTER_NAME.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.SUMMARY)) {
+ return BugzillaAttribute.SHORT_DESC.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.PRODUCT)) {
+ return BugzillaAttribute.PRODUCT.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.KEYWORDS)) {
+ return BugzillaAttribute.KEYWORDS.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.ATTACHMENT_DATE)) {
+ return BugzillaAttribute.DATE.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.ATTACHMENT_SIZE)) {
+ return BugzillaAttribute.SIZE.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.ADD_SELF_CC)) {
+ return BugzillaAttribute.ADDSELFCC.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.PRIORITY)) {
+ return BugzillaAttribute.PRIORITY.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.COMMENT_NEW)) {
+ return BugzillaAttribute.NEW_COMMENT.getKey();
+ } else if (key.equals(RepositoryTaskAttribute.COMPONENT)) {
+ return BugzillaAttribute.COMPONENT.getKey();
+ } else {
+ return key;
+ }
+ }
+
+ @Override
+ public boolean isHidden(String key) {
+ try {
+ return BugzillaAttribute.valueOf(key.trim().toUpperCase(Locale.ENGLISH)).isHidden();
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public String getName(String key) {
+ try {
+ return BugzillaAttribute.valueOf(key.trim().toUpperCase(Locale.ENGLISH)).toString();
+ } catch (IllegalArgumentException e) {
+ return "<unknown>";
+ }
+ }
+
+ @Override
+ public boolean isReadOnly(String key) {
+ try {
+ return BugzillaAttribute.valueOf(key.trim().toUpperCase(Locale.ENGLISH)).isReadOnly();
+ } catch (IllegalArgumentException e) {
+ return true;
+ }
+ }
+
+ @Override
+ public Date getDateForAttributeType(String attributeKey, String dateString) {
+ if (dateString == null || dateString.equals("")) {
+ return null;
+ }
+ try {
+ String mappedKey = mapCommonAttributeKey(attributeKey);
+ Date parsedDate = null;
+ if (mappedKey.equals(BugzillaAttribute.DELTA_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(delta_ts_format).parse(dateString);
+ } else if (mappedKey.equals(BugzillaAttribute.CREATION_TS.getKey())) {
+ parsedDate = new SimpleDateFormat(creation_ts_format).parse(dateString);
+ } else if (mappedKey.equals(BugzillaAttribute.BUG_WHEN.getKey())) {
+ parsedDate = new SimpleDateFormat(comment_creation_ts_format).parse(dateString);
+ } else if (mappedKey.equals(BugzillaAttribute.DATE.getKey())) {
+ parsedDate = new SimpleDateFormat(attachment_creation_ts_format).parse(dateString);
+ }
+ return parsedDate;
+ } catch (Exception e) {
+ return null;
+ // throw new CoreException(new Status(IStatus.ERROR,
+ // "Error parsing date string: " + dateString, e));
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCategorySearchOperation.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCategorySearchOperation.java
new file mode 100644
index 0000000..a7c98b2
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCategorySearchOperation.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Oct 14, 2004
+ */
+package org.eclipse.mylyn.internal.bugzilla.ui.tasklist;
+
+import java.net.Proxy;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchEngine;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.BugzillaSearchResultCollector;
+import org.eclipse.mylyn.internal.bugzilla.ui.search.IBugzillaSearchOperation;
+import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
+import org.eclipse.mylyn.tasks.core.QueryHitCollector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+
+/**
+ * TODO: delete?
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaCategorySearchOperation extends WorkspaceModifyOperation implements IBugzillaSearchOperation {
+ /** The IMember we are doing the search for */
+
+ public interface ICategorySearchListener {
+ public void searchCompleted(QueryHitCollector collector);
+ }
+
+ /** The bugzilla collector for the search */
+ private QueryHitCollector collector = null;
+
+ /** The status of the search operation */
+ private IStatus status;
+
+ /** The LoginException that was thrown when trying to do the search */
+ private LoginException loginException = null;
+
+ private String queryUrl;
+
+ private TaskRepository repository;
+
+ private int maxHits;
+
+ private boolean isMaxReached;
+
+ /**
+ * Constructor
+ *
+ * @param m
+ * The member that we are doing the search for
+ */
+ public BugzillaCategorySearchOperation(TaskRepository repository, String queryUrl, int maxHits,
+ QueryHitCollector collector) {
+ this.queryUrl = queryUrl;
+ this.maxHits = maxHits;
+ this.repository = repository;
+ this.collector = collector;
+ }
+
+ @Override
+ public void execute(IProgressMonitor monitor) {
+ // XXX: Hack
+ if (collector instanceof BugzillaSearchResultCollector) {
+ ((BugzillaSearchResultCollector) collector).setOperation(this);
+ }
+ collector.setProgressMonitor(monitor);
+ Proxy proxySettings = TasksUiPlugin.getDefault().getProxySettings();
+ search(queryUrl, proxySettings, monitor);
+ for (ICategorySearchListener listener : listeners)
+ listener.searchCompleted(collector);
+ }
+
+ /**
+ * Perform the actual search on the Bugzilla server
+ *
+ * @param queryUrl
+ * The queryUrl to use for the search
+ * @param searchCollector
+ * The collector to put the search results into
+ * @param monitor
+ * The progress monitor to use for the search
+ * @return The QueryHitCollector with the search results
+ */
+ private QueryHitCollector search(String queryUrl, Proxy proxySettings, IProgressMonitor monitor) {
+
+ // set the initial number of matches to 0
+ int matches = 0;
+ // setup the progress monitor and start the search
+ collector.setProgressMonitor(monitor);
+ BugzillaSearchEngine engine = new BugzillaSearchEngine(repository, queryUrl, proxySettings);
+ try {
+ // perform the search
+ status = engine.search(collector, matches, maxHits);
+
+ // check the status so that we don't keep searching if there
+ // is a problem
+ if (status.getCode() == IStatus.CANCEL) {
+ return null;
+ } else if (!status.isOK()) {
+ return null;
+ }
+ isMaxReached = engine.isMaxReached();
+ return collector;
+ } catch (LoginException e) {
+ // save this exception to throw later
+ this.loginException = e;
+ }
+ return null;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugzilla.ui.search.IBugzillaSearchOperation#getStatus()
+ */
+ public IStatus getStatus() throws LoginException {
+ // if a LoginException was thrown while trying to search, throw this
+ if (loginException == null)
+ return status;
+ else
+ throw loginException;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public AbstractRepositorySearchQuery getQuery() {
+ return null;
+ }
+
+ public void setQuery(AbstractRepositorySearchQuery newQuery) {
+ }
+
+ private List<ICategorySearchListener> listeners = new ArrayList<ICategorySearchListener>();
+
+ public void addResultsListener(ICategorySearchListener listener) {
+ listeners.add(listener);
+ }
+
+ public String getName() {
+ return null;
+ }
+
+ public boolean isMaxReached() {
+ return isMaxReached;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareInput.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareInput.java
new file mode 100644
index 0000000..a481f8e
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareInput.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.CompareEditorInput;
+import org.eclipse.compare.structuremergeviewer.Differencer;
+import org.eclipse.compare.structuremergeviewer.IStructureComparator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+
+/**
+ * A two-way or three-way compare for <code>BugReport</code> objects.
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+public class BugzillaCompareInput extends CompareEditorInput {
+
+ private boolean threeWay = false;
+
+ private Object root;
+
+ private IStructureComparator ancestor = null;
+
+ private IStructureComparator left = null;
+
+ private IStructureComparator right = null;
+
+ /**
+ * Constructor.
+ *
+ * @param configuration
+ * The compare configuration used in this compare input.
+ * @see CompareConfiguration
+ */
+ public BugzillaCompareInput(CompareConfiguration configuration) {
+ super(configuration);
+ }
+
+ @Override
+ protected Object prepareInput(IProgressMonitor monitor) {
+ if (left == null || right == null) {
+ return null;
+ }
+ Differencer d = new Differencer();
+ root = d.findDifferences(threeWay, monitor, null, ancestor, left, right);
+ return root;
+ }
+
+ /**
+ * @return The original object that's to be compared (appears on the top of the compare view).
+ */
+ public IStructureComparator getAncestor() {
+ return ancestor;
+ }
+
+ /**
+ * Sets the original object that's to be compared (appears on the top of the compare view).
+ *
+ * @param newAncestor
+ * The new original object.
+ */
+ public void setAncestor(RepositoryTaskData newAncestor) {
+ threeWay = (newAncestor != null);
+ BugzillaCompareStructureCreator structureCreator = new BugzillaCompareStructureCreator();
+ ancestor = structureCreator.getStructure(newAncestor);
+ }
+
+ /**
+ * @return The local object that's to be compared (appears on the left side of the compare view).
+ */
+ public IStructureComparator getLeft() {
+ return left;
+ }
+
+ /**
+ * Sets the local object that's to be compared (appears on the left side of the compare view).
+ *
+ * @param newLeft
+ * The new local object.
+ */
+ public void setLeft(RepositoryTaskData newLeft) {
+ BugzillaCompareStructureCreator structureCreator = new BugzillaCompareStructureCreator();
+ left = structureCreator.getStructure(newLeft);
+ }
+
+ /**
+ * @return The online object that's to be compared (appears on the right side of the compare view).
+ */
+ public IStructureComparator getRight() {
+ return right;
+ }
+
+ /**
+ * Sets the online object that's to be compared (appears on the right side of the compare view).
+ *
+ * @param newRight
+ * The new online object.
+ */
+ public void setRight(RepositoryTaskData newRight) {
+ BugzillaCompareStructureCreator structureCreator = new BugzillaCompareStructureCreator();
+ right = structureCreator.getStructure(newRight);
+ }
+
+ /**
+ * @return <code>true</code> if a three-way comparison is to be done.
+ */
+ public boolean isThreeWay() {
+ return threeWay;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareNode.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareNode.java
new file mode 100644
index 0000000..abc8f98
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareNode.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import org.eclipse.compare.IStreamContentAccessor;
+import org.eclipse.compare.ITypedElement;
+import org.eclipse.compare.structuremergeviewer.IStructureComparator;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A node for the tree used to compare bugs in the compare viewer.
+ *
+ * @author Rob Elves
+ */
+public class BugzillaCompareNode implements IStreamContentAccessor, IStructureComparator, ITypedElement {
+
+ /** The label for this piece of data. */
+ private String key;
+
+ /** The data for this node. */
+ private String value;
+
+ /** The children of this node. */
+ private ArrayList<BugzillaCompareNode> nodeChildren;
+
+ /** This node's image. */
+ private Image image;
+
+ /**
+ * Constructor. The image for this node is set to <code>null</code>.
+ *
+ * @param key
+ * The label for this node.
+ * @param value
+ * The data for this node.
+ */
+ public BugzillaCompareNode(String key, String value) {
+ this(key, value, null);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param key
+ * The label for this node.
+ * @param value
+ * The data for this node.
+ * @param image
+ * The image for this node.
+ */
+ public BugzillaCompareNode(String key, String value, Image image) {
+ super();
+ this.key = key;
+ this.value = checkText(value);
+ this.nodeChildren = null;
+ this.image = image;
+ }
+
+ /**
+ * This function checks to make sure the given string is not <code>null</code>. If it is, the empty string is
+ * returned instead.
+ *
+ * @param newValue
+ * The string to be checked.
+ * @return If the text is <code>null</code>, then return the null string (<code>""</code>). Otherwise, return the
+ * text.
+ */
+ private String checkText(String newValue) {
+ return ((newValue == null) ? "" : newValue);
+ }
+
+ public Object[] getChildren() {
+ return (nodeChildren == null) ? new Object[0] : nodeChildren.toArray();
+ }
+
+ /**
+ * Adds a node to this node's list of children.
+ *
+ * @param bugNode
+ * The new child.
+ */
+ public void addChild(BugzillaCompareNode bugNode) {
+ if (nodeChildren == null) {
+ nodeChildren = new ArrayList<BugzillaCompareNode>();
+ }
+ nodeChildren.add(bugNode);
+ }
+
+ public InputStream getContents() throws CoreException {
+ return new ByteArrayInputStream(getValue().getBytes());
+ }
+
+ /**
+ * @return The label for this node.
+ */
+ public String getKey() {
+ return key;
+ }
+
+ /**
+ * Set the label for this node.
+ *
+ * @param key
+ * The new label.
+ */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ /**
+ * @return The data for this node.
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * Set the data for this node.
+ *
+ * @param value
+ * The new data.
+ */
+ public void setValue(String value) {
+ this.value = checkText(value);
+ }
+
+ public Image getImage() {
+ return image;
+ }
+
+ /**
+ * Sets the image for this object. This image is used when displaying this object in the UI.
+ *
+ * @param newImage
+ * The new image.
+ */
+ public void setImage(Image newImage) {
+ this.image = newImage;
+ }
+
+ @Override
+ public boolean equals(Object arg0) {
+ if (arg0 instanceof BugzillaCompareNode) {
+ BugzillaCompareNode bugNode = (BugzillaCompareNode) arg0;
+ return getKey().equals(bugNode.getKey());
+ }
+ return super.equals(arg0);
+ }
+
+ @Override
+ public int hashCode() {
+ return getKey().hashCode();
+ }
+
+ public String getName() {
+ return getKey();
+ }
+
+ public String getType() {
+ return "bug report";
+ }
+
+ /**
+ * Parses the given <code>BugReport</code> into a tree of <code>BugzillaCompareNode</code>'s suitable for use in a
+ * compare viewer.
+ *
+ * @param bug
+ * The <code>BugReport</code> that needs parsing.
+ * @return The tree of <code>BugzillaCompareNode</code>'s.
+ */
+ public static BugzillaCompareNode parseBugReport(RepositoryTaskData bug) {
+ Image defaultImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEF_VIEW);
+ BugzillaCompareNode topNode = new BugzillaCompareNode("Bug #" + bug.getTaskId(), null, defaultImage);
+
+ Image attributeImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+ BugzillaCompareNode attributes = new BugzillaCompareNode("Attributes", null, attributeImage);
+ for (RepositoryTaskAttribute attribute : bug.getAttributes()) {
+ BugzillaCompareNode child = new BugzillaCompareNode(attribute.toString(), attribute.getValue(),
+ defaultImage);
+ attributes.addChild(child);
+ }
+
+ BugzillaCompareNode comments = new BugzillaCompareNode("Comments", null, defaultImage);
+ for (TaskComment taskComment : bug.getComments()) {
+ String bodyString = "Comment from " + taskComment.getAuthorName() + ":\n\n" + taskComment.getText();
+ comments.addChild(new BugzillaCompareNode(
+ taskComment.getAttributeValue(BugzillaAttribute.BUG_WHEN.getKey()), bodyString, defaultImage));
+ }
+ topNode.addChild(comments);
+
+ topNode.addChild(new BugzillaCompareNode("New Comment", bug.getNewComment(), defaultImage));
+
+ BugzillaCompareNode ccList = new BugzillaCompareNode("CC List", null, defaultImage);
+ for (String cc : bug.getCc()) {
+ ccList.addChild(new BugzillaCompareNode("CC", cc, defaultImage));
+ }
+ topNode.addChild(ccList);
+
+ BugzillaCompareNode titleNode = new BugzillaCompareNode("BugReport Object", null, defaultImage);
+ titleNode.addChild(topNode);
+
+ return titleNode;
+ }
+
+// public static BugzillaCompareNode parseBugReport(BugzillaReport bug) {
+// Image defaultImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEF_VIEW);
+// BugzillaCompareNode topNode = new BugzillaCompareNode("Bug #" + bug.getId(), null, defaultImage);
+// Date creationDate = bug.getCreated();
+// if (creationDate == null) {
+// // XXX: this could be backwards
+// creationDate = Calendar.getInstance().getTime();
+// }
+// BugzillaCompareNode child = new BugzillaCompareNode("Creation Date", creationDate.toString(), defaultImage);
+// topNode.addChild(child);
+//
+// String keywords = "";
+// if (bug.getKeywords() != null) {
+// for (Iterator<String> iter = bug.getKeywords().iterator(); iter.hasNext();) {
+// keywords += iter.next() + " ";
+// }
+// }
+// topNode.addChild(new BugzillaCompareNode("Keywords", keywords, defaultImage));
+//
+// Image attributeImage = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+// BugzillaCompareNode attributes = new BugzillaCompareNode("Attributes", null, attributeImage);
+// for (Iterator<RepositoryTaskAttribute> iter = bug.getAttributes().iterator(); iter.hasNext();) {
+// RepositoryTaskAttribute attribute = iter.next();
+// if (attribute.getName().compareTo("delta_ts") == 0 || attribute.getName().compareTo("Last Modified") == 0
+// || attribute.getName().compareTo("longdesclength") == 0)
+// continue;
+// // Since the bug report may not be saved offline, get the
+// // attribute's new
+// // value, which is what is in the submit viewer.
+//
+// attributes.addChild(new BugzillaCompareNode(attribute.getName(), attribute.getValue(), attributeImage));
+// }
+// topNode.addChild(attributes);
+//
+// topNode.addChild(new BugzillaCompareNode("Description", bug.getDescription(), defaultImage));
+//
+// BugzillaCompareNode comments = new BugzillaCompareNode("Comments", null, defaultImage);
+// for (Iterator<Comment> iter = bug.getComments().iterator(); iter.hasNext();) {
+// Comment comment = iter.next();
+// String bodyString = "Comment from " + comment.getAuthorName() + ":\n\n" + comment.getText();
+// comments.addChild(new BugzillaCompareNode(comment.getAttributeValue(BugzillaReportElement.CREATION_TS), bodyString, defaultImage));
+// }
+// topNode.addChild(comments);
+//
+// topNode.addChild(new BugzillaCompareNode("New Comment", bug.getNewComment(), defaultImage));
+//
+// BugzillaCompareNode ccList = new BugzillaCompareNode("CC List", null, defaultImage);
+// for (Iterator<String> iter = bug.getCC().iterator(); iter.hasNext();) {
+// String cc = iter.next();
+// ccList.addChild(new BugzillaCompareNode("CC", cc, defaultImage));
+// }
+// topNode.addChild(ccList);
+//
+// BugzillaCompareNode titleNode = new BugzillaCompareNode("BugReport Object", null, defaultImage);
+// titleNode.addChild(topNode);
+//
+// return titleNode;
+// }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareStructureCreator.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareStructureCreator.java
new file mode 100644
index 0000000..200492b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaCompareStructureCreator.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.compare.structuremergeviewer.IStructureComparator;
+import org.eclipse.compare.structuremergeviewer.IStructureCreator;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+
+/**
+ * This implementation of the <code>IStructureCreator</code> interface makes the contents of a <code>BugReport</code>
+ * object available as a hierarchical structure of <code>IStructureComparator</code>s.
+ * <p>
+ * It is used when comparing a modified bug report to the one on the corresponding server.
+ *
+ * @author Rob Elves
+ */
+public class BugzillaCompareStructureCreator implements IStructureCreator {
+
+ /**
+ * Create a new BugzillaStructureCreator.
+ */
+ public BugzillaCompareStructureCreator() {
+ super();
+ }
+
+ public String getName() {
+ return "Bugzilla Structure Creator";
+ }
+
+ public IStructureComparator getStructure(Object input) {
+ if (input instanceof RepositoryTaskData) {
+ RepositoryTaskData bugReport = (RepositoryTaskData) input;
+ return BugzillaCompareNode.parseBugReport(bugReport);
+ } else {
+ return null;
+ }
+ }
+
+ public IStructureComparator locate(Object path, Object input) {
+ return null;
+ }
+
+ public String getContents(Object node, boolean ignoreWhitespace) {
+ if (node instanceof BugzillaCompareNode) {
+ String s = ((BugzillaCompareNode) node).getValue();
+ if (ignoreWhitespace) {
+ s = s.trim();
+ }
+ return s;
+ }
+ return null;
+ }
+
+ /**
+ * Called whenever a copy operation has been performed on a tree node. This implementation throws an
+ * <code>AssertionFailedException</code> since we cannot update a bug report object.
+ *
+ * @param structure
+ * the node for which to save the new content
+ * @param input
+ * the object from which the structure tree was created in <code>getStructure</code>
+ */
+ public void save(IStructureComparator node, Object input) {
+ // ignore
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaException.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaException.java
new file mode 100644
index 0000000..b800a78
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaException.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+public class BugzillaException extends Exception {
+
+ /** Automatically generated serialVersionUID */
+ private static final long serialVersionUID = 3257849887386449974L;
+
+ private Throwable cause;
+
+ /**
+ * Constructor for BugzillaException.
+ */
+ public BugzillaException() {
+ super();
+ }
+
+ /**
+ * Constructor for BugzillaException.
+ *
+ * @param detailMessage
+ */
+ public BugzillaException(String detailMessage) {
+ super(detailMessage);
+ }
+
+ public BugzillaException(String detailMessage, Throwable cause) {
+ super(detailMessage);
+ this.cause = cause;
+ }
+
+ public BugzillaException(Throwable cause) {
+ this.cause = cause;
+ }
+
+ @Override
+ public synchronized void printStackTrace(PrintStream err) {
+ super.printStackTrace(err);
+ if (cause != null) {
+ err.println("\n--- Cause was:");
+ cause.printStackTrace(err);
+ }
+ }
+
+ @Override
+ public synchronized void printStackTrace(PrintWriter err) {
+ super.printStackTrace(err);
+ if (cause != null) {
+ err.println("\n--- Cause was:");
+ cause.printStackTrace(err);
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaHyperLink.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaHyperLink.java
new file mode 100644
index 0000000..33a2e17
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaHyperLink.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class BugzillaHyperLink implements IHyperlink {
+
+ private static final String SHOW_BUG_CGI = "/show_bug.cgi?taskId=";
+
+ private IRegion region;
+
+ private String id;
+
+ private String repositoryUrl;
+
+ public BugzillaHyperLink(IRegion nlsKeyRegion, String id, String repositoryUrl) {
+ this.region = nlsKeyRegion;
+ this.id = id;
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ public IRegion getHyperlinkRegion() {
+ return region;
+ }
+
+ public String getTypeLabel() {
+ return null;
+ }
+
+ public String getHyperlinkText() {
+ return SHOW_BUG_CGI + id;
+ }
+
+ public void open() {
+ // TaskRepository repository =
+ // MylarTaskListPlugin.getRepositoryManager().getRepositoryForActiveTask(BugzillaPlugin.REPOSITORY_KIND);
+ // TaskRepository repository =
+ // MylarTaskListPlugin.getRepositoryManager().getDefaultRepository(
+ // BugzillaPlugin.REPOSITORY_KIND);
+ if (repositoryUrl != null) {
+ TasksUiUtil.openRepositoryTask(repositoryUrl, id, repositoryUrl + IBugzillaConstants.URL_GET_SHOW_BUG
+ + id);
+ // OpenBugzillaReportJob job = new
+ // OpenBugzillaReportJob(repository.getUrl(), taskId);
+ // IProgressService service =
+ // PlatformUI.getWorkbench().getProgressService();
+ // try {
+ // service.run(true, false, job);
+ // } catch (Exception e) {
+ // MylarStatusHandler.fail(e, "Could not open report", true);
+ // }
+ } else {
+ MessageDialog.openError(null, IBugzillaConstants.TITLE_MESSAGE_DIALOG,
+ "Could not determine repository for report");
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaLabelProvider.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaLabelProvider.java
new file mode 100644
index 0000000..96e0c19
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaLabelProvider.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.search;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.HtmlStreamTokenizer;
+
+/**
+ * Label provider for Bugzilla search items.
+ */
+public class BugzillaLabelProvider extends LabelProvider {
+ /** A list of the default severity labels */
+ private static final String[] severityLabel = { "blocker", "critical", "major", "normal", "minor", "trivial",
+ "enhancement" };
+
+ /** A list of the default priority labels */
+ private static final String[] priorityLabel = { "P1", "P2", "P3", "P4", "P5", "--" };
+
+ /** A list of the default state labels */
+ private static final String[] stateLabel = { "Unconfirmed", "New", "Assigned", "Reopened", "Resolved", "Verified",
+ "Closed" };
+
+ /** A list of the default result labels */
+ private static final String[] resultLabel = { "", "fixed", "invalid", "wont fix", "later", "remind", "duplicate",
+ "works for me" };
+
+ /**
+ * Returns the text for the label of the given element.
+ *
+ * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+ */
+ @Override
+ public String getText(Object element) {
+ if (element instanceof IMarker) {
+
+ try {
+ IMarker marker = (IMarker) element;
+
+ // get the severity of the bug
+ String severity = severityLabel[((Integer) marker
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_SEVERITY)).intValue()];
+
+ // get the priority of the bug
+ String priority = priorityLabel[((Integer) marker
+ .getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_PRIORITY)).intValue()];
+
+ // get the state of the bug
+ String state = stateLabel[((Integer) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_STATE))
+ .intValue()];
+
+ // get the resolution of the bug
+ String result = resultLabel[((Integer) marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_RESULT))
+ .intValue()];
+
+ // return a string containing the information about the bug to
+ // be displayed
+ // in the searh window
+ String assignedTo = HtmlStreamTokenizer.unescape(marker.getAttribute(
+ IBugzillaConstants.HIT_MARKER_ATTR_OWNER).toString());
+ String description = HtmlStreamTokenizer.unescape(marker.getAttribute(
+ IBugzillaConstants.HIT_MARKER_ATTR_DESC).toString());
+ return "Bug " + marker.getAttribute(IBugzillaConstants.HIT_MARKER_ATTR_ID) + " (" + severity + " - "
+ + priority + " - " + state + (result.length() > 0 ? " " + result : "") + ") " + " - "
+ + description + " (" + assignedTo + ") ";
+ } catch (Exception ignored) {
+ // ignore if there is a problem
+ }
+ }
+
+ // return an empty string if there is a problem
+ return "";
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestCDT.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestCDT.java
new file mode 100644
index 0000000..819fc4c
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestCDT.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.NewBugParser;
+
+/**
+ * Tests NewBugParser -- parses product attributes for new bug reports
+ */
+public class BugzillaNewBugParserTestCDT extends TestCase {
+
+ public BugzillaNewBugParserTestCDT() {
+ super();
+ }
+
+ public BugzillaNewBugParserTestCDT(String arg0) {
+ super(arg0);
+ }
+
+ public void testProductCDT() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path("testdata/pages/cdt-page.html"));
+
+ Reader in = new FileReader(f);
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+ new NewBugParser(in).parseBugAttributes(nbm, true); // ** TRUE vs FALSE
+ // **
+
+ // attributes for this bug model
+ List<AbstractRepositoryReportAttribute> attributes = nbm.getAttributes();
+ // printList(attributes);
+
+ Iterator<AbstractRepositoryReportAttribute> itr = attributes.iterator();
+ AbstractRepositoryReportAttribute att = itr.next();
+
+ // Attribute: Severity
+ assertEquals("Attribute: Severity", "Severity", att.getName());
+
+ Map<String, String> attOptions = att.getOptionValues(); // HashMap of
+ // options for the
+ // current
+ // attribute
+ Object[] options = attOptions.keySet().toArray(); // Array of keys for
+ // the options of the
+ // current attribute
+ assertEquals("# Severity options", 7, options.length);
+
+ int i = 0;
+ while (i < options.length) {
+ assertEquals("severity options", "blocker", options[i++]);
+ assertEquals("severity options", "critical", options[i++]);
+ assertEquals("severity options", "major", options[i++]);
+ assertEquals("severity options", "normal", options[i++]);
+ assertEquals("severity options", "minor", options[i++]);
+ assertEquals("severity options", "trivial", options[i++]);
+ assertEquals("severity options", "enhancement", options[i++]);
+ }
+
+ // Attribute: product
+ att = itr.next();
+ assertEquals("Attribute: product", "product", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No product options", 0, options.length);
+
+ // Attribute: AssignedTo
+ att = itr.next();
+ assertEquals("Attribute: AssignedTo", "AssignedTo", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No AssignedTo options", 0, options.length);
+
+ // Attribute: OS
+ att = itr.next();
+ assertEquals("Attribute: OS", "OS", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("# of options", 20, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("OS options", "All", options[i++]);
+ assertEquals("OS options", "AIX Motif", options[i++]);
+ assertEquals("OS options", "Windows 95", options[i++]);
+ assertEquals("OS options", "Windows 98", options[i++]);
+ assertEquals("OS options", "Windows CE", options[i++]);
+ assertEquals("OS options", "Windows ME", options[i++]);
+ assertEquals("OS options", "Windows 2000", options[i++]);
+ assertEquals("OS options", "Windows NT", options[i++]);
+ assertEquals("OS options", "Windows XP", options[i++]);
+ assertEquals("OS options", "Windows All", options[i++]);
+ assertEquals("OS options", "MacOS X", options[i++]);
+ assertEquals("OS options", "Linux", options[i++]);
+ assertEquals("OS options", "Linux-GTK", options[i++]);
+ assertEquals("OS options", "Linux-Motif", options[i++]);
+ assertEquals("OS options", "HP-UX", options[i++]);
+ assertEquals("OS options", "Neutrino", options[i++]);
+ assertEquals("OS options", "QNX-Photon", options[i++]);
+ assertEquals("OS options", "Solaris", options[i++]);
+ assertEquals("OS options", "Unix All", options[i++]);
+ assertEquals("OS options", "other", options[i++]);
+ }
+
+ // Attribute: Version
+ att = itr.next();
+ assertEquals("Attribute: Version", "Version", att.getName());
+
+ // attOptions = (HashMap) att.getOptionValues();
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Version options", 5, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Version options", "1.0", options[i++]);
+ assertEquals("Version options", "1.0.1", options[i++]);
+ assertEquals("Version options", "1.1", options[i++]);
+ assertEquals("Version options", "1.2", options[i++]);
+ assertEquals("Version options", "2.0", options[i++]);
+ }
+
+ // Attribute: Platform
+ att = itr.next();
+ assertEquals("Attribute: Platform", "Platform", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Platform options", 6, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Platform options", "All", options[i++]);
+ assertEquals("Platform options", "Macintosh", options[i++]);
+ assertEquals("Platform options", "PC", options[i++]);
+ assertEquals("Platform options", "Power PC", options[i++]);
+ assertEquals("Platform options", "Sun", options[i++]);
+ assertEquals("Platform options", "Other", options[i++]);
+ }
+
+ // Attribute: Component
+ att = itr.next();
+ assertEquals("Attribute: Component", "Component", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Component options", 9, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Component options", "CDT-parser", options[i++]);
+ assertEquals("Component options", "Core", options[i++]);
+ assertEquals("Component options", "Cpp-Extensions", options[i++]);
+ assertEquals("Component options", "Debug", options[i++]);
+ assertEquals("Component options", "Debug-MI", options[i++]);
+ assertEquals("Component options", "Doc", options[i++]);
+ assertEquals("Component options", "Generic-Extensions", options[i++]);
+ assertEquals("Component options", "Launcher", options[i++]);
+ assertEquals("Component options", "UI", options[i++]);
+ }
+
+ // Attribute: bug_status
+ att = itr.next();
+ assertEquals("Attribute: bug_status", "bug_status", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# bug_status options [none]", 0, options.length);
+
+ // Attribute: form_name
+ att = itr.next();
+ assertEquals("Attribute: form_name", "form_name", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No form_name options", 0, options.length);
+
+ // Attribute: bug_file_loc
+ att = itr.next();
+ assertEquals("Attribute: bug_file_loc", "bug_file_loc", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_file_loc options", 0, options.length);
+
+ // Attribute: priority
+ att = itr.next();
+ assertEquals("Attribute: priority", "priority", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No priority options", 0, options.length);
+
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestEquinox.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestEquinox.java
new file mode 100644
index 0000000..f7870d4
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestEquinox.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.NewBugParser;
+
+/**
+ * Tests NewBugParser -- parses product attributes
+ */
+public class BugzillaNewBugParserTestEquinox extends TestCase {
+
+ public BugzillaNewBugParserTestEquinox() {
+ super();
+ }
+
+ public BugzillaNewBugParserTestEquinox(String arg0) {
+ super(arg0);
+ }
+
+ public void testProductEquinox() throws Exception {
+
+ File f = FileTool
+ .getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path("testdata/pages/equinox-page.html"));
+
+ Reader in = new FileReader(f);
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+ new NewBugParser(in).parseBugAttributes(nbm, true); // ** TRUE vs FALSE
+ // **
+
+ // attributes for this bug model
+ List<AbstractRepositoryReportAttribute> attributes = nbm.getAttributes();
+ // printList(attributes);
+
+ Iterator<AbstractRepositoryReportAttribute> itr = attributes.iterator();
+ AbstractRepositoryReportAttribute att = itr.next();
+
+ // Attribute: Severity
+ assertEquals("Attribute: Severity", "Severity", att.getName());
+
+ Map<String, String> attOptions = att.getOptionValues(); // HashMap of
+ // options for the
+ // current
+ // attribute
+ Object[] options = attOptions.keySet().toArray(); // Array of keys for
+ // the options of the
+ // current attribute
+ assertEquals("# Severity options", 7, options.length);
+
+ int i = 0;
+ while (i < options.length) {
+ assertEquals("severity options", "blocker", options[i++]);
+ assertEquals("severity options", "critical", options[i++]);
+ assertEquals("severity options", "major", options[i++]);
+ assertEquals("severity options", "normal", options[i++]);
+ assertEquals("severity options", "minor", options[i++]);
+ assertEquals("severity options", "trivial", options[i++]);
+ assertEquals("severity options", "enhancement", options[i++]);
+ }
+
+ // Attribute: product
+ att = itr.next();
+ assertEquals("Attribute: prodcut", "product", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No product options", 0, options.length);
+
+ // Attribute: AssignedTo
+ att = itr.next();
+ assertEquals("Attribute: AssignedTo", "AssignedTo", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No AssignedTo options", 0, options.length);
+
+ // Attribute: OS
+ att = itr.next();
+ assertEquals("Attribute: OS", "OS", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# OS options", 20, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("OS options", "All", options[i++]);
+ assertEquals("OS options", "AIX Motif", options[i++]);
+ assertEquals("OS options", "Windows 95", options[i++]);
+ assertEquals("OS options", "Windows 98", options[i++]);
+ assertEquals("OS options", "Windows CE", options[i++]);
+ assertEquals("OS options", "Windows ME", options[i++]);
+ assertEquals("OS options", "Windows 2000", options[i++]);
+ assertEquals("OS options", "Windows NT", options[i++]);
+ assertEquals("OS options", "Windows XP", options[i++]);
+ assertEquals("OS options", "Windows All", options[i++]);
+ assertEquals("OS options", "MacOS X", options[i++]);
+ assertEquals("OS options", "Linux", options[i++]);
+ assertEquals("OS options", "Linux-GTK", options[i++]);
+ assertEquals("OS options", "Linux-Motif", options[i++]);
+ assertEquals("OS options", "HP-UX", options[i++]);
+ assertEquals("OS options", "Neutrino", options[i++]);
+ assertEquals("OS options", "QNX-Photon", options[i++]);
+ assertEquals("OS options", "Solaris", options[i++]);
+ assertEquals("OS options", "Unix All", options[i++]);
+ assertEquals("OS options", "other", options[i++]);
+ }
+
+ // Attribute: Version
+ att = itr.next();
+ assertEquals("Attribute: Version", "Version", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Version options", 1, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Version options", "unspecified", options[i++]);
+ }
+
+ // Attribute: Platform
+ att = itr.next();
+ assertEquals("Attribute: Platform", "Platform", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Platform options", 6, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Platform options", "All", options[i++]);
+ assertEquals("Platform options", "Macintosh", options[i++]);
+ assertEquals("Platform options", "PC", options[i++]);
+ assertEquals("Platform options", "Power PC", options[i++]);
+ assertEquals("Platform options", "Sun", options[i++]);
+ assertEquals("Platform options", "Other", options[i++]);
+ }
+
+ // Attribute: Component
+ att = itr.next();
+ assertEquals("Attribute: Component", "Component", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Component options", 3, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Component options", "Dynamic Plugins", options[i++]);
+ assertEquals("Component options", "General", options[i++]);
+ assertEquals("Component options", "OSGi", options[i++]);
+ }
+
+ // Attribute: bug_status
+ att = itr.next();
+ assertEquals("Attribute: bug_status", "bug_status", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_status options", 0, options.length);
+
+ // Attribute: form_name
+ att = itr.next();
+ assertEquals("Attribute: form_name", "form_name", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No form_name options", 0, options.length);
+
+ // Attribute: bug_file_loc
+ att = itr.next();
+ assertEquals("Attribute: bug_file_loc", "bug_file_loc", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_file_loc options", 0, options.length);
+
+ // Attribute: priority
+ att = itr.next();
+ assertEquals("Attribute: priority", "priority", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No priority options", 0, options.length);
+
+ }
+
+ // private void printList(List<Attribute> attributes) {
+ //
+ // Iterator<Attribute> itr = attributes.iterator();
+ // System.out.println("Attributes for this Product:");
+ // System.out.println("============================");
+ //
+ // while (itr.hasNext()) {
+ // Attribute attr = itr.next();
+ // System.out.println();
+ // System.out.println(attr.getName() + ": ");
+ // System.out.println("-----------");
+ //
+ // Map<String, String> options = attr.getOptionValues();
+ // Object[] it = options.keySet().toArray();
+ // for (int i = 0; i < it.length; i++)
+ // System.out.println((String) it[i]);
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestGMT.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestGMT.java
new file mode 100644
index 0000000..738a40e
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestGMT.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.NewBugParser;
+
+/**
+ * Tests NewBugParser -- parses product attributes
+ */
+public class BugzillaNewBugParserTestGMT extends TestCase {
+
+ public BugzillaNewBugParserTestGMT() {
+ super();
+ }
+
+ public BugzillaNewBugParserTestGMT(String arg0) {
+ super(arg0);
+ }
+
+ public void testProductGMT() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path("testdata/pages/gmt-page.html"));
+
+ Reader in = new FileReader(f);
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+ new NewBugParser(in).parseBugAttributes(nbm, true); // ** TRUE vs FALSE
+ // **
+
+ // attributes for this bug model
+ List<AbstractRepositoryReportAttribute> attributes = nbm.getAttributes();
+ // printList(attributes);
+
+ Iterator<AbstractRepositoryReportAttribute> itr = attributes.iterator();
+ AbstractRepositoryReportAttribute att = itr.next();
+
+ // Attribute: Severity
+ assertEquals("Attribute: Severity", "Severity", att.getName());
+
+ Map<String, String> attOptions = att.getOptionValues(); // HashMap of
+ // options for the
+ // current
+ // attribute
+ Object[] options = attOptions.keySet().toArray(); // Array of keys for
+ // the options of the
+ // current attribute
+ assertEquals("# Severity options", 7, options.length);
+
+ int i = 0;
+ while (i < options.length) {
+ assertEquals("severity options", "blocker", options[i++]);
+ assertEquals("severity options", "critical", options[i++]);
+ assertEquals("severity options", "major", options[i++]);
+ assertEquals("severity options", "normal", options[i++]);
+ assertEquals("severity options", "minor", options[i++]);
+ assertEquals("severity options", "trivial", options[i++]);
+ assertEquals("severity options", "enhancement", options[i++]);
+ }
+
+ // Attribute: product
+ att = itr.next();
+ assertEquals("Attribute: product", "product", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No product options", 0, options.length);
+
+ // Attribute: AssignedTo
+ att = itr.next();
+ assertEquals("Attribute: AssignedTo", "AssignedTo", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No AssignedTo options", 0, options.length);
+
+ // Attribute: OS
+ att = itr.next();
+ assertEquals("Attribute: OS", "OS", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("# of options", 20, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("OS options", "All", options[i++]);
+ assertEquals("OS options", "AIX Motif", options[i++]);
+ assertEquals("OS options", "Windows 95", options[i++]);
+ assertEquals("OS options", "Windows 98", options[i++]);
+ assertEquals("OS options", "Windows CE", options[i++]);
+ assertEquals("OS options", "Windows ME", options[i++]);
+ assertEquals("OS options", "Windows 2000", options[i++]);
+ assertEquals("OS options", "Windows NT", options[i++]);
+ assertEquals("OS options", "Windows XP", options[i++]);
+ assertEquals("OS options", "Windows All", options[i++]);
+ assertEquals("OS options", "MacOS X", options[i++]);
+ assertEquals("OS options", "Linux", options[i++]);
+ assertEquals("OS options", "Linux-GTK", options[i++]);
+ assertEquals("OS options", "Linux-Motif", options[i++]);
+ assertEquals("OS options", "HP-UX", options[i++]);
+ assertEquals("OS options", "Neutrino", options[i++]);
+ assertEquals("OS options", "QNX-Photon", options[i++]);
+ assertEquals("OS options", "Solaris", options[i++]);
+ assertEquals("OS options", "Unix All", options[i++]);
+ assertEquals("OS options", "other", options[i++]);
+ }
+
+ // Attribute: Version
+ att = itr.next();
+ assertEquals("Attribute: Version", "Version", att.getName());
+
+ // attOptions = (HashMap) att.getOptionValues();
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Version options", 1, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Version options", "unspecified", options[i++]);
+ }
+
+ // Attribute: Platform
+ att = itr.next();
+ assertEquals("Attribute: Platform", "Platform", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Platform options", 6, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Platform options", "All", options[i++]);
+ assertEquals("Platform options", "Macintosh", options[i++]);
+ assertEquals("Platform options", "PC", options[i++]);
+ assertEquals("Platform options", "Power PC", options[i++]);
+ assertEquals("Platform options", "Sun", options[i++]);
+ assertEquals("Platform options", "Other", options[i++]);
+ }
+
+ att = itr.next();
+ assertEquals("Attribute: Component", "Component", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Component options", 1, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Component options", "Core", options[i++]);
+ }
+
+ // Attribute: bug_status
+ att = itr.next();
+ assertEquals("Attribute: bug_status", "bug_status", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_status options", 0, options.length);
+
+ // Attribute: form_name
+ att = itr.next();
+ assertEquals("Attribute: form_name", "form_name", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No form_name options", 0, options.length);
+
+ // Attribute: bug_file_loc
+ att = itr.next();
+ assertEquals("Attribute: bug_file_loc", "bug_file_loc", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_file_loc options", 0, options.length);
+
+ // Attribute: priority
+ att = itr.next();
+ assertEquals("Attribute: priority", "priority", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No priority options", 0, options.length);
+
+ }
+
+ // private void printList(List<Attribute> attributes) {
+ //
+ // Iterator<Attribute> itr = attributes.iterator();
+ // System.out.println("Attributes for this Product:");
+ // System.out.println("============================");
+ //
+ // while (itr.hasNext()) {
+ // Attribute attr = itr.next();
+ // System.out.println();
+ // System.out.println(attr.getName() + ": ");
+ // System.out.println("-----------");
+ //
+ // Map<String, String> options = attr.getOptionValues();
+ // Object[] it = options.keySet().toArray();
+ // for (int i = 0; i < it.length; i++)
+ // System.out.println((String) it[i]);
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestPlatform.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestPlatform.java
new file mode 100644
index 0000000..6fe1fc2
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestPlatform.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.NewBugParser;
+
+/**
+ * Tests NewBugParser -- parses product attributes
+ */
+public class BugzillaNewBugParserTestPlatform extends TestCase {
+
+ public BugzillaNewBugParserTestPlatform() {
+ super();
+ }
+
+ public BugzillaNewBugParserTestPlatform(String arg0) {
+ super(arg0);
+ }
+
+ public void testProductPlatform() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(),
+ new Path("testdata/pages/platform-page.html"));
+
+ Reader in = new FileReader(f);
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+ new NewBugParser(in).parseBugAttributes(nbm, true); // ** TRUE vs FALSE
+ // **
+
+ // attributes for this bug model
+ List<AbstractRepositoryReportAttribute> attributes = nbm.getAttributes();
+ // printList(attributes);
+
+ // to iterator over the ArrayList of attributes
+ Iterator<AbstractRepositoryReportAttribute> itr = attributes.iterator();
+
+ // Attribute: Severity
+ AbstractRepositoryReportAttribute att = itr.next(); // current attribute
+
+ // Attribute: Severity
+ assertEquals("Attribute: Severity", "Severity", att.getName());
+
+ Map<String, String> attOptions = att.getOptionValues(); // HashMap of
+ // options for the
+ // current
+ // attribute
+ Object[] options = attOptions.keySet().toArray(); // Array of keys for
+ // the options of the
+ // current attribute
+ assertEquals("# Severity options", 7, options.length);
+
+ int i = 0;
+ while (i < options.length) {
+ assertEquals("severity options", "blocker", options[i++]);
+ assertEquals("severity options", "critical", options[i++]);
+ assertEquals("severity options", "major", options[i++]);
+ assertEquals("severity options", "normal", options[i++]);
+ assertEquals("severity options", "minor", options[i++]);
+ assertEquals("severity options", "trivial", options[i++]);
+ assertEquals("severity options", "enhancement", options[i++]);
+ }
+
+ // Attribute: product
+ att = itr.next();
+ assertEquals("Attribute: product", "product", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No product optins", 0, options.length);
+
+ // Attribute: AssignedTo
+ att = itr.next();
+ assertEquals("Attribute: Assigned To", "Assigned To", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No AssingedTo options", 0, options.length);
+
+ // Attribute: OS
+ att = itr.next();
+ assertEquals("Attribute: OS", "OS", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("# OS options", 20, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("OS options", "All", options[i++]);
+ assertEquals("OS options", "AIX Motif", options[i++]);
+ assertEquals("OS options", "Windows 95", options[i++]);
+ assertEquals("OS options", "Windows 98", options[i++]);
+ assertEquals("OS options", "Windows CE", options[i++]);
+ assertEquals("OS options", "Windows ME", options[i++]);
+ assertEquals("OS options", "Windows 2000", options[i++]);
+ assertEquals("OS options", "Windows NT", options[i++]);
+ assertEquals("OS options", "Windows XP", options[i++]);
+ assertEquals("OS options", "Windows All", options[i++]);
+ assertEquals("OS options", "MacOS X", options[i++]);
+ assertEquals("OS options", "Linux", options[i++]);
+ assertEquals("OS options", "Linux-GTK", options[i++]);
+ assertEquals("OS options", "Linux-Motif", options[i++]);
+ assertEquals("OS options", "HP-UX", options[i++]);
+ assertEquals("OS options", "Neutrino", options[i++]);
+ assertEquals("OS options", "QNX-Photon", options[i++]);
+ assertEquals("OS options", "Solaris", options[i++]);
+ assertEquals("OS options", "Unix All", options[i++]);
+ assertEquals("OS options", "other", options[i++]);
+ }
+
+ // Attribute: Version
+ att = itr.next();
+ assertEquals("Attribute: Version", "Version", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("# Version options", 8, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Version options", "1.0", options[i++]);
+ assertEquals("Version options", "2.0", options[i++]);
+ assertEquals("Version options", "2.0.1", options[i++]);
+ assertEquals("Version options", "2.0.2", options[i++]);
+ assertEquals("Version options", "2.1", options[i++]);
+ assertEquals("Version options", "2.1.1", options[i++]);
+ assertEquals("Version options", "2.1.2", options[i++]);
+ assertEquals("Version options", "3.0", options[i++]);
+ }
+
+ // Attribute: Platform
+ att = itr.next();
+ assertEquals("Attribute: Platform", "Platform", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Platform options", 6, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Platform options", "All", options[i++]);
+ assertEquals("Platform options", "Macintosh", options[i++]);
+ assertEquals("Platform options", "PC", options[i++]);
+ assertEquals("Platform options", "Power PC", options[i++]);
+ assertEquals("Platform options", "Sun", options[i++]);
+ assertEquals("Platform options", "Other", options[i++]);
+ }
+
+ // Attribute: Component
+ att = itr.next();
+ assertEquals("Attribute: Component", "Component", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("# Component options", 16, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Component options", "Ant", options[i++]);
+ assertEquals("Component options", "Compare", options[i++]);
+ assertEquals("Component options", "Core", options[i++]);
+ assertEquals("Component options", "CVS", options[i++]);
+ assertEquals("Component options", "Debug", options[i++]);
+ assertEquals("Component options", "Doc", options[i++]);
+ assertEquals("Component options", "Help", options[i++]);
+ assertEquals("Component options", "Releng", options[i++]);
+ assertEquals("Component options", "Scripting", options[i++]);
+ assertEquals("Component options", "Search", options[i++]);
+ assertEquals("Component options", "SWT", options[i++]);
+ assertEquals("Component options", "Team", options[i++]);
+ assertEquals("Component options", "Text", options[i++]);
+ assertEquals("Component options", "UI", options[i++]);
+ assertEquals("Component options", "Update", options[i++]);
+ assertEquals("Component options", "WebDAV", options[i++]);
+ }
+
+ // Attribute: bug_status
+ att = itr.next();
+ assertEquals("Attribute: bug_status", "bug_status", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No bug_status options", 0, options.length);
+
+ // Attribute: form_name
+ att = itr.next();
+ assertEquals("Attribute: form_name", "form_name", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No form_name options", 0, options.length);
+
+ // Attribute: bug_file_loc
+ att = itr.next();
+ assertEquals("Attribute: bug_file_loc", "bug_file_loc", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_file_loc options", 0, options.length);
+
+ // Attribute: priority
+ att = itr.next();
+ assertEquals("Attribute: priority", "priority", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No priority options", 0, options.length);
+ }
+
+ // private void printList(List<Attribute> attributes) {
+ //
+ // Iterator<Attribute> itr = attributes.iterator();
+ // System.out.println("Attributes for this Product:");
+ // System.out.println("============================");
+ //
+ // while (itr.hasNext()) {
+ // Attribute attr = itr.next();
+ // System.out.println();
+ // System.out.println(attr.getName() + ": ");
+ // System.out.println("-----------");
+ //
+ // Map<String, String> options = attr.getOptionValues();
+ // Object[] it = options.keySet().toArray();
+ // for (int i = 0; i < it.length; i++)
+ // System.out.println((String) it[i]);
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestVE.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestVE.java
new file mode 100644
index 0000000..7f6f0dc
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaNewBugParserTestVE.java
@@ -0,0 +1,225 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.NewBugParser;
+
+/**
+ * Tests NewBugParser -- parses product attributes
+ */
+public class BugzillaNewBugParserTestVE extends TestCase {
+
+ public BugzillaNewBugParserTestVE() {
+ super();
+ }
+
+ public BugzillaNewBugParserTestVE(String arg0) {
+ super(arg0);
+ }
+
+ public void testProductVE() throws Exception {
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path("testdata/pages/ve-page.html"));
+
+ Reader in = new FileReader(f);
+
+ NewBugzillaReport nbm = new NewBugzillaReport();
+ new NewBugParser(in).parseBugAttributes(nbm, true); // ** TRUE vs FALSE
+ // **
+
+ // attributes for this but model
+ List<AbstractRepositoryReportAttribute> attributes = nbm.getAttributes();
+ // printList(attributes);
+
+ Iterator<AbstractRepositoryReportAttribute> itr = attributes.iterator();
+ AbstractRepositoryReportAttribute att = itr.next();
+
+ // Attribute: Severity
+ assertEquals("Attribute: Severity", "Severity", att.getName());
+
+ Map<String, String> attOptions = att.getOptionValues(); // HashMap of
+ // options for the
+ // current
+ // attribute
+ Object[] options = attOptions.keySet().toArray(); // Array of keys for
+ // the options of the
+ // current attribute
+ assertEquals("# Severity options", 7, options.length);
+
+ int i = 0;
+ while (i < options.length) {
+ assertEquals("severity options", "blocker", options[i++]);
+ assertEquals("severity options", "critical", options[i++]);
+ assertEquals("severity options", "major", options[i++]);
+ assertEquals("severity options", "normal", options[i++]);
+ assertEquals("severity options", "minor", options[i++]);
+ assertEquals("severity options", "trivial", options[i++]);
+ assertEquals("severity options", "enhancement", options[i++]);
+ }
+
+ // Attribute: product
+ att = itr.next();
+ assertEquals("Attribute: product", "product", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No product options", 0, options.length);
+
+ // Attribute: AssignedTo
+ att = itr.next();
+ assertEquals("Attribute: AssignedTo", "AssignedTo", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("No AssignedTo options", 0, options.length);
+
+ // Attribute: OS
+ att = itr.next();
+ assertEquals("Attribute: OS", "OS", att.getName());
+
+ attOptions = att.getOptionValues();
+ options = attOptions.keySet().toArray();
+ assertEquals("# of options", 20, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("OS options", "All", options[i++]);
+ assertEquals("OS options", "AIX Motif", options[i++]);
+ assertEquals("OS options", "Windows 95", options[i++]);
+ assertEquals("OS options", "Windows 98", options[i++]);
+ assertEquals("OS options", "Windows CE", options[i++]);
+ assertEquals("OS options", "Windows ME", options[i++]);
+ assertEquals("OS options", "Windows 2000", options[i++]);
+ assertEquals("OS options", "Windows NT", options[i++]);
+ assertEquals("OS options", "Windows XP", options[i++]);
+ assertEquals("OS options", "Windows All", options[i++]);
+ assertEquals("OS options", "MacOS X", options[i++]);
+ assertEquals("OS options", "Linux", options[i++]);
+ assertEquals("OS options", "Linux-GTK", options[i++]);
+ assertEquals("OS options", "Linux-Motif", options[i++]);
+ assertEquals("OS options", "HP-UX", options[i++]);
+ assertEquals("OS options", "Neutrino", options[i++]);
+ assertEquals("OS options", "QNX-Photon", options[i++]);
+ assertEquals("OS options", "Solaris", options[i++]);
+ assertEquals("OS options", "Unix All", options[i++]);
+ assertEquals("OS options", "other", options[i++]);
+ }
+
+ // Attribute: Version
+ att = itr.next();
+ assertEquals("Attribute: Version", "Version", att.getName());
+
+ // attOptions = (HashMap) att.getOptionValues();
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Version options", 3, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Version options", "0.5.0", options[i++]);
+ assertEquals("Version options", "1.0.0", options[i++]);
+ assertEquals("Version options", "unspecified", options[i++]);
+ }
+
+ // Attribute: Platform
+ att = itr.next();
+ assertEquals("Attribute: Platform", "Platform", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Platform options", 6, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Platform options", "All", options[i++]);
+ assertEquals("Platform options", "Macintosh", options[i++]);
+ assertEquals("Platform options", "PC", options[i++]);
+ assertEquals("Platform options", "Power PC", options[i++]);
+ assertEquals("Platform options", "Sun", options[i++]);
+ assertEquals("Platform options", "Other", options[i++]);
+ }
+
+ att = itr.next();
+ assertEquals("Attribute: Component", "Component", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("# Component options", 6, options.length);
+
+ i = 0;
+ while (i < options.length) {
+ assertEquals("Component options", "CDE", options[i++]);
+ assertEquals("Component options", "Doc", options[i++]);
+ assertEquals("Component options", "Java Core", options[i++]);
+ assertEquals("Component options", "Java Model (JEM)", options[i++]);
+ assertEquals("Component options", "JFC/Swing", options[i++]);
+ assertEquals("Component options", "SWT", options[i++]);
+ }
+
+ // Attribute: bug_status
+ att = itr.next();
+ assertEquals("Attribute: bug_status", "bug_status", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_status options", 0, options.length);
+
+ // Attribute: form_name
+ att = itr.next();
+ assertEquals("Attribute: form_name", "form_name", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No form_name options", 0, options.length);
+
+ // Attribute: bug_file_loc
+ att = itr.next();
+ assertEquals("Attribute: bug_file_loc", "bug_file_loc", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No bug_file_loc options", 0, options.length);
+
+ // Attribute: priority
+ att = itr.next();
+ assertEquals("Attribute: priority", "priority", att.getName());
+
+ options = att.getOptionValues().keySet().toArray();
+ assertEquals("No priority options", 0, options.length);
+
+ }
+
+ // private void printList(List<Attribute> attributes) {
+ //
+ // Iterator<Attribute> itr = attributes.iterator();
+ // System.out.println("Attributes for this Product:");
+ // System.out.println("============================");
+ //
+ // while (itr.hasNext()) {
+ // Attribute attr = itr.next();
+ // System.out.println();
+ // System.out.println(attr.getName() + ": ");
+ // System.out.println("-----------");
+ //
+ // Map<String, String> options = attr.getOptionValues();
+ // Object[] it = options.keySet().toArray();
+ // for (int i = 0; i < it.length; i++)
+ // System.out.println((String) it[i]);
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaParserTest.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaParserTest.java
new file mode 100644
index 0000000..dea3c34
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaParserTest.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.Iterator;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.BugReport;
+import org.eclipse.mylyn.bugzilla.core.Comment;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.BugParser;
+
+/**
+ * Tests for parsing Bugzilla reports
+ */
+public class BugzillaParserTest extends TestCase {
+
+ public BugzillaParserTest() {
+ super();
+ }
+
+ public BugzillaParserTest(String arg0) {
+ super(arg0);
+ }
+
+ public void testFullReportBug1() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path("testdata/pages/bug-1-full.html"));
+
+ Reader in = new FileReader(f);
+
+ BugReport bug = BugParser.parseBug(in, 1, "<server>", false, null, null, null);
+
+ // displayBug(bug);
+ assertEquals("Bug id", 1, bug.getId());
+ assertEquals("Bug summary", "Usability issue with external editors (1GE6IRL)", bug.getSummary());
+ assertEquals("Reporter", "andre_weinand at ch.ibm.com (Andre Weinand)", bug.getReporter());
+ assertEquals("Reporter", "andre_weinand at ch.ibm.com (Andre Weinand)", bug.getAttribute("Reporter").getValue());
+ assertEquals("Summary", "Usability issue with external editors (1GE6IRL)", bug.getSummary());
+ assertEquals("Status", "VERIFIED", bug.getStatus());
+ assertEquals("Resolution", "FIXED", bug.getResolution());
+ assertEquals("Keywords", null, bug.getKeywords());
+ assertEquals("Assigned To", "James_Moody at ca.ibm.com (James Moody)", bug.getAssignedTo());
+ assertEquals("Priority", "P3", bug.getAttribute("Priority").getValue());
+ assertEquals("OS", "All", bug.getAttribute("OS").getValue());
+ assertEquals("Version", "2.0", bug.getAttribute("Version").getValue());
+ assertEquals("Target Milestone", "---", bug.getAttribute("Target Milestone").getValue());
+ assertEquals("Keywords", "", bug.getAttribute("Keywords").getValue());
+ assertEquals("Severity", "normal", bug.getAttribute("Severity").getValue());
+ assertEquals("Component", "VCM", bug.getAttribute("Component").getValue());
+ assertEquals("CC", "Kevin_McGuire at oti.com", bug.getCC().iterator().next());
+ assertEquals("Platform", "All", bug.getAttribute("Platform").getValue());
+ assertEquals("Product", "Platform", bug.getAttribute("Product").getValue());
+ assertEquals("URL", "", bug.getAttribute("URL").getValue());
+ assertEquals("Bug#", "1", bug.getAttribute("Bug#").getValue());
+
+ // Description
+ String description = "- Setup a project that contains a *.gif resource\n"
+ + "\t- release project to CVS\n"
+ + "\t- edit the *.gif resource with an external editor, e.g. PaintShop\n"
+ + "\t- save and close external editor\n"
+ + "\t- in Navigator open the icon resource and verify that your changes are there\n"
+ + "\t- release project\n"
+ + "\t\t-> nothing to release!\n"
+ + "\t- in Navigator open the icon resource and verify that your changes are still there\n\n"
+ +
+
+ "\tProblem: because I never \"Refreshed from local\", the workspace hasn't changed so \"Release\" didn't find anything.\n"
+ + "\tHowever opening the resource with an external editor found the modified file on disk and showed the changes.\n\n"
+ +
+
+ "\tThe real problem occurs if \"Release\" actually finds something to release but you don't spot that some resources are missing.\n"
+ + "\tThis is extremely error prone: one of my changes didn't made it into build 110 because of this!\n\n"
+ +
+
+ "NOTES:\n"
+ + "EG (5/23/01 3:00:33 PM)\n"
+ + "\tRelease should do a refresh from local before doing the release.\n"
+ + "\tMoving to VCM\n\n\n"
+ +
+
+ "KM (05/27/01 5:10:19 PM)\n"
+ + "\tComments from JM in related email:\n\n"
+ +
+
+ "\tShould not do this for free. Could have a setting which made it optoinal but should nt be mandatory. Default setting could be to have it on.\n"
+ + "\tConsider the SWT team who keep their workspaces on network drives. This will be slow. \n\n"
+ +
+
+ "\tSide effects will be that a build runs when the refresh is completed unless you somehow do it in a workspace runnable and don't end the\n"
+ + "\trunnable until after the release. This would be less than optimal as some builders may be responsible for maintaining some invariants and deriving resources which are releasable. If you don't run the builders before releasing, the invariants will not be maintained and you will release inconsistent state.\n\n"
+ +
+
+ "\tSummary: Offer to \"ensure local consistency\" before releasing.\n\n" +
+
+ "KM (5/31/01 1:30:35 PM)\n"
+ + "\tSee also 1GEAG1A: ITPVCM:WINNT - Internal error comparing with a document\n"
+ + "\twhich failed with an error. Never got log from Tod though.";
+
+ assert (description.length() == bug.getDescription().length());
+ assertEquals("Description", description, bug.getDescription());
+
+ // Comments:
+ Iterator<Comment> it = bug.getComments().iterator();
+ while (it.hasNext()) {
+ // COMMENT #1
+ Comment comment = it.next();
+ assertEquals("Author1", "James_Moody at ca.ibm.com", comment.getAuthor());
+ assertEquals("Name1", "James Moody", comment.getAuthorName());
+ assertEquals("Text1", "*** Bug 183 has been marked as a duplicate of this bug. ***", comment.getText());
+
+ // COMMENT #2
+ comment = it.next();
+ assertEquals("Author2", "James_Moody at ca.ibm.com", comment.getAuthor());
+ assertEquals("Name2", "James Moody", comment.getAuthorName());
+ assertEquals("Text2", "Implemented 'auto refresh' option. Default value is off.", comment.getText());
+
+ // COMMENT 3
+ comment = it.next();
+ assertEquals("Author3", "dj_houghton at ca.ibm.com", comment.getAuthor());
+ assertEquals("Name3", "DJ Houghton", comment.getAuthorName());
+ assertEquals("Text3", "PRODUCT VERSION:\n\t109\n\n", comment.getText());
+
+ // COMMENT 4
+ comment = it.next();
+ assertEquals("Author4", "James_Moody at ca.ibm.com", comment.getAuthor());
+ assertEquals("Name4", "James Moody", comment.getAuthorName());
+ assertEquals("Text4", "Fixed in v206", comment.getText());
+ }
+ }
+
+ // private static void displayBug(BugReport bug) {
+ // System.out.println("Bug " + bug.getId() + ": " + bug.getSummary());
+ // System.out.println("Opened: " + bug.getCreated());
+ // for (Iterator<Attribute> it = bug.getAttributes().iterator();
+ // it.hasNext();) {
+ // Attribute attribute = it.next();
+ // String key = attribute.getName();
+ // System.out.println(key + ": " + attribute.getValue()
+ // + (attribute.isEditable() ? " [OK]" : " %%"));
+ // }
+ //
+ // System.out.print("CC: ");
+ // for (Iterator<String> it = bug.getCC().iterator(); it.hasNext();) {
+ // String email = it.next();
+ // System.out.print(email + " ");
+ // }
+ // System.out.println();
+ //
+ // System.out.println(bug.getDescription());
+ // for (Iterator<Comment> it = bug.getComments().iterator(); it.hasNext();)
+ // {
+ // Comment comment = it.next();
+ // System.out.println(comment.getAuthorName() + " <"
+ // + comment.getAuthor() + "> (" + comment.getCreated() + ")");
+ // System.out.print(comment.getText());
+ // System.out.println();
+ // }
+ // }
+ //
+ // private static void printComments(BugReport bug) {
+ // for (Iterator<Comment> it = bug.getComments().iterator(); it.hasNext();)
+ // {
+ // Comment comment = it.next();
+ // System.out.println("Author: " + comment.getAuthor());
+ // System.out.println("Name: " + comment.getAuthorName());
+ // System.out.println("Date: " + comment.getCreated());
+ // System.out.println("Bug ID: " + comment.getBug().getId());
+ // System.out.println("Comment: " + comment.getText());
+ // System.out.println();
+ // }
+ // }
+ //
+ // /** prints names of attributes */
+ // private static void printAttributes(BugReport bug) {
+ // System.out.println("ATTRIBUTE KEYS:");
+ // for (Iterator<Attribute> it = bug.getAttributes().iterator();
+ // it.hasNext();) {
+ // Attribute att = it.next();
+ // System.out.println(att.getName());
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaParserTestNoBug.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaParserTestNoBug.java
new file mode 100644
index 0000000..3f888fc
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaParserTestNoBug.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.core.BugReport;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.BugParser;
+
+/**
+ * Tests for parsing Bugzilla reports
+ */
+public class BugzillaParserTestNoBug extends TestCase {
+
+ public BugzillaParserTestNoBug() {
+ super();
+ }
+
+ public BugzillaParserTestNoBug(String arg0) {
+ super(arg0);
+ }
+
+ public void testBugNotFound() throws Exception {
+
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path(
+ "testdata/pages/bug-not-found-eclipse.html"));
+
+ Reader in = new FileReader(f);
+
+ BugReport bug = BugParser.parseBug(in, 666, "<server>", false, null, null, null);
+ assertNull(bug);
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaPreferencePage.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaPreferencePage.java
new file mode 100644
index 0000000..3d5f93d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaPreferencePage.java
@@ -0,0 +1,235 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.preferences;
+
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.RadioGroupFieldEditor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Gail Murphy
+ * @author Mik Kersten
+ */
+public class BugzillaPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
+
+ private RadioGroupFieldEditor bugzillaVersionEditor;
+
+// private static final String bugzillaMaxResultsLabel = "Maximum returned results: ";
+
+// private IntegerFieldEditor maxResults;
+
+ /**
+ * Constructor for the preferences page
+ */
+ public BugzillaPreferencePage() {
+ super(GRID);
+
+ // set the preference store for this preference page
+ setPreferenceStore(BugzillaUiPlugin.getDefault().getPreferenceStore());
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ return super.createContents(parent);
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+
+ // HACK: there has to be an easier way
+ Control[] radios = bugzillaVersionEditor.getRadioBoxControl(getFieldEditorParent()).getChildren();
+ String currentVersion = BugzillaPlugin.getDefault().getPreferenceStore().getString(
+ IBugzillaConstants.SERVER_VERSION);
+ for (int i = 0; i < radios.length; i++) {
+ Button button = (Button) radios[i];
+ if (button.getText().equals(currentVersion)) {
+ button.setSelection(true);
+ } else {
+ button.setSelection(false);
+ }
+ }
+ }
+
+ @Override
+ protected void createFieldEditors() {
+
+// maxResults = new IntegerFieldEditor(IBugzillaConstants.MAX_RESULTS, bugzillaMaxResultsLabel,
+// getFieldEditorParent());
+
+ // bugzillaVersionEditor.setPreferenceStore(BugzillaPlugin.getDefault().getPreferenceStore());
+ bugzillaVersionEditor = new RadioGroupFieldEditor(IBugzillaConstants.SERVER_VERSION, "Bugzilla Version", 3,
+ new String[][] { { IBugzillaConstants.SERVER_220, IBugzillaConstants.SERVER_VERSION },
+ { IBugzillaConstants.SERVER_218, IBugzillaConstants.SERVER_VERSION } }, getFieldEditorParent());
+// refreshQueries = new BooleanFieldEditor(IBugzillaConstants.REFRESH_QUERY,
+// "Automatically refresh Bugzilla reports and queries on startup", BooleanFieldEditor.DEFAULT,
+// getFieldEditorParent());
+
+// addField(maxResults);
+ addField(bugzillaVersionEditor);
+// addField(refreshQueries);
+ }
+
+ public static void initDefaults(IPreferenceStore store) {
+ store.setDefault(IBugzillaConstants.MOST_RECENT_QUERY, "");
+ store.setDefault(IBugzillaConstants.SERVER_VERSION, IBugzillaConstants.SERVER_220);
+ store.setDefault(IBugzillaConstants.REFRESH_QUERY, false);
+ store.setDefault(IBugzillaConstants.MAX_RESULTS, 100);
+ }
+
+ @Override
+ protected void performDefaults() {
+ super.performDefaults();
+ }
+
+ @Override
+ public boolean performOk() {
+ // HACK: there has to be an easier way
+ Control[] radios = bugzillaVersionEditor.getRadioBoxControl(getFieldEditorParent()).getChildren();
+ for (int i = 0; i < radios.length; i++) {
+ Button button = (Button) radios[i];
+ if (button.getSelection()) {
+ BugzillaPlugin.getDefault().getPreferenceStore().setValue(IBugzillaConstants.SERVER_VERSION,
+ button.getText());
+ }
+ }
+
+// BugzillaPlugin.getDefault().getPreferenceStore().setValue(IBugzillaConstants.REFRESH_QUERY,
+// refreshQueries.getBooleanValue());
+
+// try {
+// int numMaxResults = maxResults.getIntValue();
+// BugzillaPlugin.getDefault().getPreferenceStore().setValue(IBugzillaConstants.MAX_RESULTS, numMaxResults);
+// } catch (NumberFormatException nfe) {
+// // ignore and leave as default
+// BugzillaPlugin.getDefault().getPreferenceStore().setValue(IBugzillaConstants.MAX_RESULTS,
+// BugzillaPlugin.getDefault().getPreferenceStore().getDefaultInt(IBugzillaConstants.MAX_RESULTS));
+// }
+
+ // ProductConfiguration configuration = null;
+ // String urlString = bugzillaServer.getStringValue();
+ // try {
+ // URL serverURL = new URL(urlString + "/show_bug.cgi");
+ // URLConnection cntx =
+ // BugzillaPlugin.getDefault().getUrlConnection(serverURL);
+ // if (cntx == null || !(cntx instanceof HttpURLConnection))
+ // return false;
+ //
+ // HttpURLConnection serverConnection = (HttpURLConnection) cntx;
+ //
+ // serverConnection.connect();
+ //
+ // int responseCode = serverConnection.getResponseCode();
+ //
+ // if (responseCode != HttpURLConnection.HTTP_OK)
+ // throw new BugzillaException("No Bugzilla server detected at " +
+ // bugzillaServer.getStringValue() + ".");
+ //
+ // try {
+ // configuration =
+ // ProductConfigurationFactory.getInstance().getConfiguration(
+ // bugzillaServer.getStringValue());
+ // } catch (IOException ex) {
+ // MessageDialog.openInformation(null, "Bugzilla query parameters
+ // check",
+ // "An error occurred while pre-fetching valid search attributes: \n\n"
+ // + ex.getClass().getName()
+ // + ": " + ex.getMessage() + "\n\nOffline submission of new bugs will
+ // be disabled.");
+ // }
+ // } catch (Exception e) {
+ // if (!MessageDialog.openQuestion(null, "Bugzilla Server Error", "Error
+ // validating Bugzilla Server.\n\n"
+ // + e.getMessage() + "\n\nKeep specified server location anyway?")) {
+ // return false;
+ // }
+ // }
+ // BugzillaPlugin.getDefault().setProductConfiguration(urlString,
+ // configuration);
+ // IPath configFile =
+ // BugzillaPlugin.getDefault().getProductConfigurationCachePath(urlString);
+ // if (configuration != null) {
+ //
+ // try {
+ // ProductConfigurationFactory.getInstance().writeConfiguration(configuration,
+ // configFile.toFile());
+ // } catch (IOException e) {
+ // BugzillaPlugin.log(e);
+ // configFile.toFile().delete();
+ // }
+ // } else {
+ // configFile.toFile().delete();
+ // }
+
+ // save the preferences that were changed
+ // BugzillaPlugin.getDefault().savePluginPreferences();
+
+ // bugzillaServer.store();
+
+ // store the username and password from the editor field
+ // user = bugzillaUser.getStringValue();
+ // password = bugzillaPassword.getStringValue();
+ // storeCache(user, password, true);
+ return true;
+ }
+
+ @Override
+ public boolean performCancel() {
+ // refreshQueries.setSelection(getPreferenceStore().getBoolean(MylarTasksPlugin.REFRESH_QUERIES));
+ return true;
+ }
+
+ @Override
+ protected void initialize() {
+ super.initialize();
+ }
+
+ public void init(IWorkbench workbench) {
+ // Don't need to do anything here with the workbench
+ }
+
+ // /**
+ // * Hack private class to make StringFieldEditor.refreshValidState() a
+ // * publicly acessible method.
+ // *
+ // * @see org.eclipse.jface.preference.StringFieldEditor#refreshValidState()
+ // */
+ // private static class MyStringFieldEditor extends StringFieldEditor {
+ // public MyStringFieldEditor(String name, String labelText, int style,
+ // Composite parent) {
+ // super(name, labelText, style, parent);
+ // }
+ //
+ // @Override
+ // public void refreshValidState() {
+ // super.refreshValidState();
+ // }
+ //
+ // @Override
+ // public Text getTextControl() {
+ // return super.getTextControl();
+ // }
+ // }
+
+ public static final String INFO_PASSWORD = "org.eclipse.team.cvs.core.password"; //$NON-NLS-1$
+
+ public static final String INFO_USERNAME = "org.eclipse.team.cvs.core.username"; //$NON-NLS-1$
+
+ public static final String AUTH_SCHEME = "";
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaProductPage.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaProductPage.java
new file mode 100644
index 0000000..6e55e01
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaProductPage.java
@@ -0,0 +1,472 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eugene Kuleshov - improvements
+ * Willian Mitsuda - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.wizard;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URLDecoder;
+import java.security.GeneralSecurityException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * Product selection page of new bug wizard
+ *
+ * @author Shawn Minto
+ * @author Rob Elves
+ * @author Mik Kersten
+ */
+public class BugzillaProductPage extends WizardPage {
+
+ private static final String NEW_BUGZILLA_TASK_ERROR_TITLE = Messages.BugzillaProductPage_New_Bugzilla_Task_Error;
+
+ private static final String DESCRIPTION = Messages.BugzillaProductPage_PICK_PRODUCT_TO_OPEN_NEW_BUG_EDITOR
+ + Messages.BugzillaProductPage_PRESS_UPDATE_BUTTON;
+
+ private static final String LABEL_UPDATE = Messages.BugzillaProductPage_Update_Products_from_Repository;
+
+ /** The list of products to submit a bug report for */
+ private List<String> products = null;
+
+ /**
+ * Handle product selection
+ */
+ private FilteredTree productList;
+
+ private final TaskRepository repository;
+
+ protected IPreferenceStore prefs = BugzillaUiPlugin.getDefault().getPreferenceStore();
+
+ /**
+ * Constructor for BugzillaProductPage
+ *
+ * @param repository
+ * The repository the data is coming from
+ * @param workbench
+ * The instance of the workbench
+ * @param selection
+ */
+ public BugzillaProductPage(TaskRepository repository) {
+ super(Messages.BugzillaProductPage_PAGE_1);
+ setTitle(IBugzillaConstants.TITLE_NEW_BUG);
+ setDescription(DESCRIPTION);
+ this.repository = repository;
+ setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.bugzilla.ui", //$NON-NLS-1$
+ "icons/wizban/bug-wizard.gif")); //$NON-NLS-1$
+
+ }
+
+ private class ComponentFilter extends PatternFilter {
+
+ @Override
+ public void setPattern(String patternString) {
+ // ignore
+ super.setPattern(patternString);
+ // HACK: waiting on delayed refresh of filtered tree after setting the new pattern
+ new UIJob("") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (BugzillaProductPage.this.getControl() != null
+ && BugzillaProductPage.this.getControl().isDisposed()) {
+ return Status.OK_STATUS;
+ }
+ final TreeViewer productViewer = productList.getViewer();
+ if (productViewer.getTree().getItemCount() == 1) {
+ TreeItem aq = productViewer.getTree().getItem(0);
+ String qq = aq.getText();
+ productViewer.setSelection(new StructuredSelection(qq));
+ }
+ return Status.OK_STATUS;
+ }
+ }.schedule(300L);
+
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ public void createControl(Composite parent) {
+ // create the composite to hold the widgets
+ Composite composite = new Composite(parent, SWT.NULL);
+
+ // create the desired layout for this wizard page
+ composite.setLayout(new GridLayout());
+
+ // create the list of bug reports
+ // TODO e3.5 move to new FilteredTree API
+ productList = new FilteredTree(composite, SWT.SINGLE | SWT.BORDER, new ComponentFilter());
+ productList.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).hint(
+ SWT.DEFAULT, 200).create());
+ final TreeViewer productViewer = productList.getViewer();
+ productViewer.setLabelProvider(new LabelProvider());
+ productViewer.setContentProvider(new ITreeContentProvider() {
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof Collection<?>) {
+ return ((Collection<?>) parentElement).toArray();
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ });
+
+ productViewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ if (getWizard().canFinish()) {
+ if (getWizard().performFinish()) {
+ ((WizardDialog) getContainer()).close();
+ }
+ }
+ }
+ });
+
+ initProducts();
+ productViewer.setInput(products);
+ productViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
+
+ public void selectionChanged(SelectionChangedEvent event) {
+ // Initialize a variable with the no error status
+ Status status = new Status(IStatus.OK, BugzillaUiPlugin.ID_PLUGIN, 0, "", null); //$NON-NLS-1$
+ if (productViewer.getSelection().isEmpty()) {
+ status = new Status(IStatus.ERROR, BugzillaUiPlugin.ID_PLUGIN, 0,
+ Messages.BugzillaProductPage_YOU_MUST_SELECT_PRODUCT, null);
+ }
+
+ // Show the most serious error
+ applyToStatusLine(status);
+ isPageComplete();
+ getWizard().getContainer().updateButtons();
+ }
+
+ });
+
+ // HACK: waiting on delayed refresh of filtered tree
+ final String[] selectedProducts = getSelectedProducts();
+ if (selectedProducts.length > 0) {
+ new UIJob("") { //$NON-NLS-1$
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ if (BugzillaProductPage.this.getControl() != null
+ && BugzillaProductPage.this.getControl().isDisposed()) {
+ return Status.OK_STATUS;
+ }
+ productViewer.setSelection(new StructuredSelection(selectedProducts), true);
+ productViewer.getControl().setFocus();
+ return Status.OK_STATUS;
+ }
+ }.schedule(300L);
+ } else {
+ productList.setFocus();
+ }
+
+ Button updateButton = new Button(composite, SWT.LEFT | SWT.PUSH);
+ updateButton.setText(LABEL_UPDATE);
+ updateButton.setLayoutData(new GridData());
+
+ updateButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ updateProdcts();
+ productViewer.setInput(products);
+ }
+ });
+
+ Dialog.applyDialogFont(composite);
+ // set the composite as the control for this page
+ setControl(composite);
+
+ isPageComplete();
+ getWizard().getContainer().updateButtons();
+ }
+
+ private void initProducts() {
+ // try to get the list of products from the server
+ try {
+ products = BugzillaCorePlugin.getRepositoryConfiguration(repository, false, new NullProgressMonitor())
+ .getProducts();
+
+ if (products.isEmpty()) {
+ updateProdcts();
+ }
+
+ } catch (final CoreException e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), NEW_BUGZILLA_TASK_ERROR_TITLE,
+ Messages.BugzillaProductPage_Unable_to_get_products);
+ }
+ });
+ }
+ }
+
+ private String[] getSelectedProducts() {
+ IStructuredSelection selection = getSelection();
+ if (selection == null) {
+ return new String[0];
+ }
+
+ ArrayList<String> products = new ArrayList<String>();
+
+ Object element = selection.getFirstElement();
+ if (element instanceof ITask) {
+ ITask bugzillaTask = (ITask) element;
+ if (bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()) != null) {
+ products.add(bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()));
+ }
+ } else {
+ IRepositoryQuery query = null;
+ if (element instanceof IRepositoryQuery) {
+ query = (IRepositoryQuery) element;
+ }
+
+ if (query != null && query.getConnectorKind().equals(BugzillaCorePlugin.CONNECTOR_KIND)) {
+ String queryUrl = query.getUrl();
+ queryUrl = queryUrl.substring(queryUrl.indexOf("?") + 1); //$NON-NLS-1$
+ String[] options = queryUrl.split("&"); //$NON-NLS-1$
+
+ for (String option : options) {
+ int index = option.indexOf("="); //$NON-NLS-1$
+ if (index != -1) {
+ String key = option.substring(0, index);
+ if ("product".equals(key)) { //$NON-NLS-1$
+ try {
+ products.add(URLDecoder.decode(option.substring(index + 1),
+ repository.getCharacterEncoding()));
+ // TODO: list box only accepts a single selection so
+ // we break on first found
+ break;
+ } catch (UnsupportedEncodingException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ } else {
+ if (element instanceof IAdaptable) {
+ IAdaptable adaptable = (IAdaptable) element;
+ ITask task = (ITask) adaptable.getAdapter(ITask.class);
+ if (task != null) {
+ ITask bugzillaTask = (ITask) element;
+ if (bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()) != null) {
+ products.add(bugzillaTask.getAttribute(BugzillaAttribute.PRODUCT.getKey()));
+ }
+ }
+ }
+ }
+ }
+
+ return products.toArray(new String[products.size()]);
+ }
+
+ private IStructuredSelection getSelection() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ ISelection selection = window.getSelectionService().getSelection();
+ if (selection instanceof IStructuredSelection) {
+ return (IStructuredSelection) selection;
+ }
+ return null;
+ }
+
+ /**
+ * Applies the status to the status line of a dialog page.
+ *
+ * @param status
+ * The status to apply to the status line
+ */
+ protected void applyToStatusLine(IStatus status) {
+ String message = status.getMessage();
+ if (message.length() == 0) {
+ message = null;
+ }
+ switch (status.getSeverity()) {
+ case IStatus.OK:
+ setErrorMessage(null);
+ setMessage(message);
+ break;
+ case IStatus.WARNING:
+ setErrorMessage(null);
+ setMessage(message, IMessageProvider.WARNING);
+ break;
+ case IStatus.INFO:
+ setErrorMessage(null);
+ setMessage(message, IMessageProvider.INFORMATION);
+ break;
+ default:
+ setErrorMessage(null);
+ setMessage(message, IMessageProvider.ERROR);
+ break;
+ }
+ }
+
+// /**
+// * Save the currently selected product to the taskData when next is clicked
+// */
+// public void saveDataToModel() throws CoreException {
+// RepositoryTaskData model = bugWizard.taskData;
+// model.setAttributeValue(BugzillaReportElement.PRODUCT.getKey(), getSelectedProduct());
+// AbstractLegacyRepositoryConnector connector = (AbstractLegacyRepositoryConnector) TasksUi.getRepositoryManager()
+// .getRepositoryConnector(repository.getConnectorKind());
+// if (connector == null) {
+// throw new CoreException(new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID,
+// "Error AbstractRepositoryConnector could not been retrieved.\n\n"));
+// }
+// AbstractTaskDataHandler taskDataHandler = connector.getLegacyTaskDataHandler();
+// if (taskDataHandler == null) {
+// throw new CoreException(new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID,
+// "Error AbstractTaskDataHandler could not been retrieved.\n\n"));
+// }
+// taskDataHandler.initializeTaskData(repository, model, null);
+//
+// // platform/os are now set to All/All
+// BugzillaCorePlugin.getDefault().setPlatformDefaultsOrGuess(repository, model);
+// }
+
+ public String getSelectedProduct() {
+ return (String) ((IStructuredSelection) productList.getViewer().getSelection()).getFirstElement();
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return !productList.getViewer().getSelection().isEmpty();
+// return bugWizard.completed;
+ }
+
+ private void updateProdcts() {
+ final AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ try {
+ getContainer().run(true, true, new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ monitor.beginTask(Messages.BugzillaProductPage_Updating_repository_report_options_,
+ IProgressMonitor.UNKNOWN);
+ try {
+ connector.updateRepositoryConfiguration(repository, monitor);
+ } catch (CoreException e) {
+ // TODO: remove exceptions from communication of connectivity errors to the user
+ if (e.getStatus().getException() instanceof GeneralSecurityException) {
+ StatusHandler.fail(new Status(IStatus.WARNING, BugzillaUiPlugin.ID_PLUGIN,
+ "Bugzilla could not log you in to get the information you requested since login name or password is incorrect.\n" //$NON-NLS-1$
+ + "Please ensure your task repository is properly configured.", e)); //$NON-NLS-1$
+ } else if (e.getStatus().getException() instanceof IOException) {
+ StatusHandler.fail(new Status(IStatus.WARNING, BugzillaUiPlugin.ID_PLUGIN,
+ "Connection Error, please ensure your task repository is properly configured.", e)); //$NON-NLS-1$
+ } else {
+ StatusHandler.fail(new Status(IStatus.WARNING, BugzillaUiPlugin.ID_PLUGIN,
+ "Error updating repository attributes for " + repository.getRepositoryUrl(), e)); //$NON-NLS-1$
+ }
+ return;
+ }
+
+ RepositoryConfiguration repositoryConfiguration = null;
+ try {
+ repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
+ monitor);
+ } catch (final CoreException e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(Display.getDefault().getActiveShell(),
+ Messages.BugzillaProductPage_Bugzilla_Search_Page,
+ Messages.BugzillaProductPage_Unable_to_get_configuration);
+ }
+ });
+ }
+ products = new ArrayList<String>();
+ if (repositoryConfiguration != null) {
+ for (String product : repositoryConfiguration.getProducts()) {
+ products.add(product);
+ }
+ }
+ }
+ });
+
+ } catch (InvocationTargetException ex) {
+ MessageDialog.openError(null, Messages.BugzillaProductPage_Error_updating_product_list,
+ Messages.BugzillaProductPage_Error_reported + ex.getCause().getMessage());
+ } catch (InterruptedException ex) {
+ // canceled
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaQueryHit.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaQueryHit.java
new file mode 100644
index 0000000..fa123b7
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaQueryHit.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import org.eclipse.mylyn.tasks.core.AbstractQueryHit;
+import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.TaskList;
+
+/**
+ * @author Ken Sueda
+ * @author Mik Kersten (hardening of prototype)
+ */
+public class BugzillaQueryHit extends AbstractQueryHit {
+
+ private String status;
+
+ public BugzillaQueryHit(TaskList taskList, String description, String priority, String repositoryUrl, String id,
+ BugzillaTask task, String status) {
+ super(taskList, repositoryUrl, description, id);
+ super.priority = priority;
+ this.task = task;
+ this.status = status;
+ }
+
+ @Override
+ protected AbstractTask createTask() {
+ return new BugzillaTask(this, true);
+ }
+
+ @Override
+ public String getUrl() {
+ return BugzillaClient.getBugUrlWithoutLogin(repositoryUrl, taskId);
+ }
+
+ @Override
+ public boolean isCompleted() {
+ if (status != null
+ && (status.startsWith("RESO") || status.startsWith("CLO") || status.startsWith("VERI") || status
+ .startsWith("FIXED"))) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaQueryPageParser.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaQueryPageParser.java
new file mode 100644
index 0000000..81e91fc
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaQueryPageParser.java
@@ -0,0 +1,540 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core.search;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.util.ArrayList;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.HtmlStreamTokenizer;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.HtmlTag;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.provisional.tasklist.TaskRepository;
+
+/**
+ * Class to parse the update data from the server
+ *
+ * author: kvesik
+ *
+ * created on: Feb 25, 2003
+ *
+ */
+public class BugzillaQueryPageParser {
+
+ private static final String POST_ARGS_PASSWORD = "&Bugzilla_password=";
+
+ private static final String POST_ARGS_LOGIN_FIRST = "&GoAheadAndLogIn=1&Bugzilla_login=";
+
+ /** The name of the bugzilla server */
+ private String urlString;
+
+ /** The input stream */
+ private BufferedReader in = null;
+
+ /** True if the operation was successful */
+ private boolean successful;
+
+ /** Exception to be displayed if there was an error */
+ private Exception exception;
+
+ /** The progress monitor for the update */
+ private IProgressMonitor monitor;
+
+ /** Selection lists as ArrayLists */
+ private ArrayList<String> statusValues = new ArrayList<String>();
+
+ private ArrayList<String> preselectedStatusValues = new ArrayList<String>();
+
+ private ArrayList<String> resolutionValues = new ArrayList<String>();
+
+ private ArrayList<String> severityValues = new ArrayList<String>();
+
+ private ArrayList<String> priorityValues = new ArrayList<String>();
+
+ private ArrayList<String> hardwareValues = new ArrayList<String>();
+
+ private ArrayList<String> osValues = new ArrayList<String>();
+
+ private ArrayList<String> productValues = new ArrayList<String>();
+
+ private ArrayList<String> componentValues = new ArrayList<String>();
+
+ private ArrayList<String> versionValues = new ArrayList<String>();
+
+ private ArrayList<String> targetValues = new ArrayList<String>();
+
+ public BugzillaQueryPageParser(TaskRepository repository, IProgressMonitor monitor) throws LoginException, IOException {
+ this.monitor = monitor;
+
+ // get the servers url
+ urlString = repository.getUrl() + "/query.cgi";
+
+ // if we are dealing with 2.18 or higher we need to use the folowing in the
+ // query string to get the right search page
+ // UPDATE: There doesn't appear to be any harm in appending this to 2.18, 2.20, 2.20.1 and without it we
+ // don't get the advanced view so 2.20 and 2.20.1 break
+ //if (repository.getVersion().equals(BugzillaServerVersion.SERVER_218.toString())) {
+ urlString += "?format=advanced";
+ //}
+
+ // use the user name and password if we have it
+ if (repository.hasCredentials()) {
+ try {
+ // if we are dealing with 2.18 we already have the ? from before
+ // so we need
+ // an & instead. If other version, still add ?
+ // if (repository.getVersion().equals(BugzillaServerVersion.SERVER_218.toString()))
+ // urlString += "&";
+ // else
+ // urlString += "?";
+
+ urlString += POST_ARGS_LOGIN_FIRST
+ + URLEncoder.encode(repository.getUserName(), BugzillaPlugin.ENCODING_UTF_8)
+ + POST_ARGS_PASSWORD
+ + URLEncoder.encode(repository.getPassword(), BugzillaPlugin.ENCODING_UTF_8);
+ } catch (UnsupportedEncodingException e) {
+ /*
+ * Do nothing. Every implementation of the Java platform is
+ * required to support the standard charset
+ * BugzillaPlugin.ENCODING_UTF_8
+ */
+ }
+ }
+
+ successful = false;
+
+ // try to get the new options from the page
+ parseDocument();
+ if (!successful) {
+ if (exception instanceof MalformedURLException) {
+ MessageDialog
+ .openError(
+ null,
+ "Unsupported Protocol",
+ "The server that was specified for Bugzilla is not supported by your JVM.\nPlease make sure that you are using a JDK that supports SSL.");
+ } else {
+// throw exception
+ // if there was a problem with the operation, display an error
+ // message
+ ErrorDialog.openError(null, IBugzillaConstants.TITLE_MESSAGE_DIALOG, "Bugzilla could not complete the the update.",
+ new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID, IStatus.OK, "url may be invalid",
+ exception));
+ }
+ }
+ }
+
+ /**
+ * Get whether the update was successful
+ *
+ * @return <code>true</code> if the update was successful
+ */
+ public boolean wasSuccessful() {
+ return successful;
+ }
+
+ /**
+ * Parse the data from the server for the query options
+ * @throws IOException
+ */
+ private void parseDocument() throws LoginException, IOException {
+ try {
+ // if the operation has been cancelled already, return
+ if (monitor.isCanceled()) {
+ monitor.done();
+ return;
+ }
+
+ // try to connect to the server
+ monitor.subTask("Connecting to server");
+
+ URL url = new URL(this.urlString);
+ URLConnection cntx = BugzillaPlugin.getDefault().getUrlConnection(url);
+
+ if (cntx != null) {
+ InputStream input = cntx.getInputStream();
+ if (input != null) {
+
+ monitor.worked(1);
+
+ // initialize the input stream
+ in = new BufferedReader(new InputStreamReader(input));
+
+ // increment the position of the status monitor
+ monitor.worked(2);
+
+ // check if the operation has been cancelled so we can end
+ // if it has been
+ if (monitor.isCanceled())
+ monitor.done();
+ else
+ monitor.subTask("Reading values from server");
+
+ // parse the data from the server
+ parseQueryPage(in);
+
+ // set the operation to being successful
+ successful = true;
+ }
+ }
+
+ } catch (LoginException e) {
+ throw e;
+ } catch (IOException e) {
+ throw e;
+ } catch (Exception e) {
+ // if we can't connect, log the problem and save the exception to
+ // handle later
+ monitor.done();
+ exception = e;
+ BugzillaPlugin.log(new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID, IStatus.OK,
+ "Failed to create URL and open input stream: " + urlString, e));
+ return;
+ } finally {
+ try {
+ if (in != null)
+ in.close();
+ } catch (IOException exitAnyway) {
+ in = null;
+ }
+ }
+ }
+
+ /**
+ * Check if all of the lists of options are empty
+ *
+ * @return true if all of the options lists are empty
+ */
+ private boolean allListsEmpty() {
+ return statusValues.isEmpty() && preselectedStatusValues.isEmpty() && resolutionValues.isEmpty()
+ && severityValues.isEmpty() && priorityValues.isEmpty() && hardwareValues.isEmpty()
+ && osValues.isEmpty() && productValues.isEmpty() && componentValues.isEmpty()
+ && versionValues.isEmpty() && targetValues.isEmpty();
+ }
+
+ /**
+ * Get the new status values
+ *
+ * @return An array of the new status values
+ */
+ public String[] getStatusValues() {
+ String[] array = new String[statusValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < statusValues.size(); i++)
+ array[i] = statusValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new preselected status values
+ *
+ * @return An array of the new preselected status values
+ */
+ public String[] getPreselectedStatusValues() {
+ String[] array = new String[preselectedStatusValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < preselectedStatusValues.size(); i++)
+ array[i] = preselectedStatusValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new resolution values
+ *
+ * @return An array of the new resolution values
+ */
+ public String[] getResolutionValues() {
+ String[] array = new String[resolutionValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < resolutionValues.size(); i++)
+ array[i] = resolutionValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new severity values
+ *
+ * @return An array of the new severity values
+ */
+ public String[] getSeverityValues() {
+ String[] array = new String[severityValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < severityValues.size(); i++)
+ array[i] = severityValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new priority values
+ *
+ * @return An array of the new priority values
+ */
+ public String[] getPriorityValues() {
+ String[] array = new String[priorityValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < priorityValues.size(); i++)
+ array[i] = priorityValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new hardware values
+ *
+ * @return An array of the new hardware values
+ */
+ public String[] getHardwareValues() {
+ String[] array = new String[hardwareValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < hardwareValues.size(); i++)
+ array[i] = hardwareValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new OS values
+ *
+ * @return An array of the new OS values
+ */
+ public String[] getOSValues() {
+ String[] array = new String[osValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < osValues.size(); i++)
+ array[i] = osValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new product values
+ *
+ * @return An array of the new product values
+ */
+ public String[] getProductValues() {
+ String[] array = new String[productValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < productValues.size(); i++)
+ array[i] = productValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new component values
+ *
+ * @return An array of the new component values
+ */
+ public String[] getComponentValues() {
+ String[] array = new String[componentValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < componentValues.size(); i++)
+ array[i] = componentValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new version values
+ *
+ * @return An array of the new version values
+ */
+ public String[] getVersionValues() {
+ String[] array = new String[versionValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < versionValues.size(); i++)
+ array[i] = versionValues.get(i);
+ return array;
+ }
+
+ /**
+ * Get the new milestone values
+ *
+ * @return An array of the new milestone values
+ */
+ public String[] getTargetValues() {
+ String[] array = new String[targetValues.size()];
+
+ // create the array and return it
+ for (int i = 0; i < targetValues.size(); i++)
+ array[i] = targetValues.get(i);
+ return array;
+ }
+
+ /**
+ * Parse the bugzilla query.cgi page for some seach options
+ *
+ * @param inputReader
+ * The input stream for the page
+ * @throws LoginException
+ * @throws ParseException
+ * @throws IOException
+ */
+ private void parseQueryPage(Reader inputReader) throws LoginException, ParseException, IOException {
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(inputReader, null);
+
+ boolean isTitle = false;
+ boolean possibleBadLogin = false;
+ String title = "";
+
+ for (HtmlStreamTokenizer.Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer
+ .nextToken()) {
+
+ // make sure that bugzilla doesn't want us to login
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag to compare with
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " ";
+ continue;
+ } else if (token.getType() == Token.TAG
+ && ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+ // check if the title looks like we may have a problem with
+ // login
+ if ((title.indexOf("login") != -1
+ || (title.indexOf("invalid") != -1 && title.indexOf("password") != -1)
+ || title.indexOf("check e-mail") != -1 || title.indexOf("error") != -1))
+ possibleBadLogin = true;
+ isTitle = false;
+ title = "";
+ }
+ continue;
+ }
+
+ // we have found the start of attribute values
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD && "left".equalsIgnoreCase(tag.getAttribute("align"))) {
+ // parse the attribute values
+ parseAttributeValue(tokenizer);
+ continue;
+ }
+ }
+ }
+
+ // if all of the lists are empty and we suspect bad login info, assume
+ // that it was a bad login
+ if (possibleBadLogin && allListsEmpty())
+ throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE);
+ }
+
+ /**
+ * Parse the case where the attribute value is an option
+ *
+ * @param parameterName
+ * The name of the attribute value
+ * @param tokenizer
+ * The tokenizer to get data from the stream
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parseSelect(String parameterName, HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+
+ HtmlStreamTokenizer.Token token = tokenizer.nextToken();
+ while (token.getType() != Token.EOF) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.SELECT && tag.isEndTag())
+ break;
+ if (tag.getTagType() == HtmlTag.Type.OPTION && !tag.isEndTag()) {
+ String optionName = tag.getAttribute("value");
+ boolean selected = tag.hasAttribute("selected");
+ StringBuffer optionText = new StringBuffer();
+ for (token = tokenizer.nextToken(); token.getType() == Token.TEXT; token = tokenizer.nextToken()) {
+ if (optionText.length() > 0) {
+ optionText.append(' ');
+ }
+ optionText.append((StringBuffer) token.getValue());
+ }
+ // add the value to the appropriate list of attributes
+ if (parameterName.equals("bug_status")) {
+ statusValues.add(optionName);
+
+ // check if the status is to be preselected or not
+ if (selected)
+ preselectedStatusValues.add(optionName);
+ } else if (parameterName.equals("resolution"))
+ resolutionValues.add(optionName);
+ else if (parameterName.equals("bug_severity"))
+ severityValues.add(optionName);
+ else if (parameterName.equals("priority"))
+ priorityValues.add(optionName);
+ else if (parameterName.equals("rep_platform"))
+ hardwareValues.add(optionName);
+ else if (parameterName.equals("op_sys"))
+ osValues.add(optionName);
+ else if (parameterName.equals("product"))
+ productValues.add(optionName);
+ else if (parameterName.equals("component"))
+ componentValues.add(optionName);
+ else if (parameterName.equals("version"))
+ versionValues.add(optionName);
+ else if (parameterName.equals("target_milestone"))
+ targetValues.add(optionName);
+ } else {
+ token = tokenizer.nextToken();
+ }
+ } else {
+ token = tokenizer.nextToken();
+ }
+ }
+ }
+
+ /**
+ * Parse the case where we think we found an attribute value
+ *
+ * @param tokenizer
+ * The tokenizer to get the data from the stream
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parseAttributeValue(HtmlStreamTokenizer tokenizer) throws IOException, ParseException {
+
+ HtmlStreamTokenizer.Token token = tokenizer.nextToken();
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.SELECT && !tag.isEndTag()) {
+ String parameterName = tag.getAttribute("name");
+ parseSelect(parameterName, tokenizer);
+ } else if (tag.getTagType() == HtmlTag.Type.LABEL && !tag.isEndTag()) {
+ parseAttributeValue(tokenizer);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaReportSubmitForm.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaReportSubmitForm.java
new file mode 100644
index 0000000..604027d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaReportSubmitForm.java
@@ -0,0 +1,738 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.security.GeneralSecurityException;
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.eclipse.mylyn.internal.tasks.core.HtmlStreamTokenizer;
+import org.eclipse.mylyn.internal.tasks.core.HtmlTag;
+import org.eclipse.mylyn.internal.tasks.core.HtmlStreamTokenizer.Token;
+import org.eclipse.mylyn.tasks.core.RepositoryOperation;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
+
+/**
+ *
+ * @author Shawn Minto
+ * @author Mik Kersten (hardening of prototype)
+ * @author Rob Elves
+ *
+ * Class to handle the positing of a bug
+ */
+public class BugzillaReportSubmitForm {
+
+ private static final String KEY_ID = "id";
+
+ private static final String VAL_TRUE = "true";
+
+ private static final String KEY_REMOVECC = "removecc";
+
+ private static final String KEY_CC = "cc";
+
+ // private static final String POST_CONTENT_TYPE =
+ // "application/x-www-form-urlencoded";
+ //
+ // private static final String REQUEST_PROPERTY_CONTENT_TYPE =
+ // "Content-Type";
+ //
+ // private static final String REQUEST_PROPERTY_CONTENT_LENGTH =
+ // "Content-Length";
+ //
+ // private static final String METHOD_POST = "POST";
+ //
+ // private static final String KEY_BUGZILLA_PASSWORD = "Bugzilla_password";
+ //
+ // private static final String KEY_BUGZILLA_LOGIN = "Bugzilla_login";
+ // private URL postUrl;
+ // private Proxy proxySettings = Proxy.NO_PROXY;
+ // private String charset;
+
+ private static final String POST_BUG_CGI = "/post_bug.cgi";
+
+ private static final String PROCESS_BUG_CGI = "/process_bug.cgi";
+
+ public static final int WRAP_LENGTH = 90;
+
+ private static final String VAL_PROCESS_BUG = "process_bug";
+
+ private static final String KEY_FORM_NAME = "form_name";
+
+ private static final String VAL_NONE = "none";
+
+ private static final String KEY_KNOB = "knob";
+
+ // TODO change to BugzillaReportElement.ADD_COMMENT
+ private static final String KEY_COMMENT = "comment";
+
+ private static final String KEY_SHORT_DESC = "short_desc";
+
+ public static final String FORM_POSTFIX_218 = IBugzillaConstants.FORM_POSTFIX_218;
+
+ public static final String FORM_POSTFIX_216 = IBugzillaConstants.FORM_POSTFIX_216;
+
+ public static final String FORM_PREFIX_BUG_218 = IBugzillaConstants.FORM_PREFIX_BUG_218;
+
+ public static final String FORM_PREFIX_BUG_220 = IBugzillaConstants.FORM_PREFIX_BUG_220;
+
+ /** The fields that are to be changed/maintained */
+ // private List<NameValuePair> fields = new ArrayList<NameValuePair>();
+ private Map<String, NameValuePair> fields = new HashMap<String, NameValuePair>();
+
+ /** The prefix for how to find the bug number from the return */
+ private String prefix;
+
+ private String prefix2;
+
+ /** The postfix for how to find the bug number from the return */
+ private String postfix;
+
+ /** An alternate postfix for how to find the bug number from the return */
+ private String postfix2;
+
+ private String error = null;
+
+ private RepositoryTaskData taskData = null;
+
+ public boolean isNewBugPost = false;
+
+ public BugzillaReportSubmitForm() {
+ // charset = charEncoding;
+ }
+
+ public static BugzillaReportSubmitForm makeNewBugPost(String repositoryUrl, String userName, String password,
+ String characterEncoding, RepositoryTaskData model, boolean wrapDescription)
+ throws UnsupportedEncodingException {
+
+ BugzillaReportSubmitForm form = new BugzillaReportSubmitForm();
+
+ // if (characterEncoding != null) {
+ // form = new BugzillaReportSubmitForm(characterEncoding);
+ // } else {
+ // form = new
+ // BugzillaReportSubmitForm(IBugzillaConstants.ENCODING_UTF_8);
+ // }
+
+ form.setTaskData(model);
+
+ form.setPrefix(IBugzillaConstants.FORM_PREFIX_BUG_218);
+ form.setPrefix2(IBugzillaConstants.FORM_PREFIX_BUG_220);
+
+ form.setPostfix(IBugzillaConstants.FORM_POSTFIX_216);
+ form.setPostfix2(IBugzillaConstants.FORM_POSTFIX_218);
+
+ // setConnectionsSettings(form, repositoryUrl, userName, password,
+ // proxySettings, POST_BUG_CGI);
+
+ // go through all of the attributes and add them to
+ // the bug post
+ Iterator<RepositoryTaskAttribute> itr = model.getAttributes().iterator();
+ while (itr.hasNext()) {
+ RepositoryTaskAttribute a = itr.next();
+ if (a != null && a.getID() != null && a.getID().compareTo("") != 0) {
+ String value = null;
+ value = a.getValue();
+ if (value == null)
+ continue;
+ form.add(a.getID(), value);
+ }
+ }
+
+ // form.add(KEY_BUG_FILE_LOC, "");
+
+ // specify the product
+ form.add(BugzillaReportElement.PRODUCT.getKeyString(), model.getProduct());
+
+ // add the summary to the bug post
+ form.add(BugzillaReportElement.SHORT_DESC.getKeyString(), model.getSummary());
+
+ String formattedDescription = formatTextToLineWrap(model.getDescription(), wrapDescription);
+ model.setDescription(formattedDescription);
+
+ if (model.getDescription().length() != 0) {
+ // add the new comment to the bug post if there
+ // is some text in
+ // it
+ form.add(KEY_COMMENT, model.getDescription());
+ }
+
+ form.setNewBugPost(true);
+
+ return form;
+ }
+
+ /**
+ * TODO: refactor common stuff with new bug post
+ *
+ * @param characterEncoding
+ * TODO
+ *
+ * @throws UnsupportedEncodingException
+ */
+ public static BugzillaReportSubmitForm makeExistingBugPost(RepositoryTaskData model, String repositoryUrl,
+ String userName, String password, String characterEncoding) throws UnsupportedEncodingException {
+
+ BugzillaReportSubmitForm form = new BugzillaReportSubmitForm();
+
+ // if (characterEncoding != null) {
+ // form = new BugzillaReportSubmitForm(characterEncoding);
+ // } else {
+ // form = new
+ // BugzillaReportSubmitForm(IBugzillaConstants.ENCODING_UTF_8);
+ // }
+
+ form.setTaskData(model);
+
+ // setDefaultCCValue(bug, userName);
+ // setConnectionsSettings(form, repositoryUrl, userName, password,
+ // proxySettings, PROCESS_BUG_CGI);
+
+ // go through all of the attributes and add them to the bug post
+ for (Iterator<RepositoryTaskAttribute> it = model.getAttributes().iterator(); it.hasNext();) {
+ RepositoryTaskAttribute a = it.next();
+ if (a.getID().equals(BugzillaReportElement.CC.getKeyString())
+ || a.getID().equals(RepositoryTaskAttribute.REMOVE_CC)
+ || a.getID().equals(BugzillaReportElement.REPORTER.getKeyString())
+ || a.getID().equals(BugzillaReportElement.ASSIGNED_TO.getKeyString())
+ || a.getID().equals(BugzillaReportElement.CREATION_TS.getKeyString())) {
+ continue;
+ }
+ if (a != null && a.getID() != null && a.getID().compareTo("") != 0 && !a.isHidden()) {
+ String value = a.getValue();
+ // add the attribute to the bug post
+ form.add(a.getID(), value != null ? value : "");
+ } else if (a != null && a.getID() != null && a.getID().compareTo("") != 0 && a.isHidden()) {
+ // we have a hidden attribute and we should send it back.
+ String value = a.getValue();
+
+ // Strip off timezone information
+ // 149513: Constant bugzilla mid-air collisions
+ if (a.getID().equals(BugzillaReportElement.DELTA_TS.getKeyString()) && value != null) {
+ value = stripTimeZone(value);
+ }
+ form.add(a.getID(), value);
+ }
+ }
+
+ // when posting the bug id is encoded in a hidden field named 'id'
+ form.add(KEY_ID, model.getAttributeValue(BugzillaReportElement.BUG_ID.getKeyString()));
+
+ // add the operation to the bug post
+ RepositoryOperation o = model.getSelectedOperation();
+ if (o == null)
+ form.add(KEY_KNOB, VAL_NONE);
+ else {
+ form.add(KEY_KNOB, o.getKnobName());
+ if (o.hasOptions()) {
+ String sel = o.getOptionValue(o.getOptionSelection());
+ form.add(o.getOptionName(), sel);
+ } else if (o.isInput()) {
+ String sel = o.getInputValue();
+ form.add(o.getInputName(), sel);
+ }
+ }
+ form.add(KEY_FORM_NAME, VAL_PROCESS_BUG);
+
+ if (model.getAttribute(BugzillaReportElement.SHORT_DESC.getKeyString()) != null) {
+ form.add(KEY_SHORT_DESC, model.getAttribute(BugzillaReportElement.SHORT_DESC.getKeyString()).getValue());
+ }
+
+ if (model.getNewComment().length() != 0) {
+ form.add(KEY_COMMENT, model.getNewComment());
+ }
+
+ List<String> removeCC = model.getAttributeValues(RepositoryTaskAttribute.REMOVE_CC);
+ if (removeCC != null && removeCC.size() > 0) {
+ String[] s = new String[removeCC.size()];
+ form.add(KEY_CC, toCommaSeparatedList(removeCC.toArray(s)));
+ form.add(KEY_REMOVECC, VAL_TRUE);
+ }
+
+ return form;
+ }
+
+ public static String stripTimeZone(String longTime) {
+ String result = longTime;
+ if (longTime != null) {
+ String[] values = longTime.split(" ");
+ if (values != null && values.length > 2) {
+ result = values[0] + " " + values[1];
+ }
+ }
+ return result;
+ }
+
+ private static String toCommaSeparatedList(String[] strings) {
+ StringBuffer buffer = new StringBuffer();
+ for (int i = 0; i < strings.length; i++) {
+ buffer.append(strings[i]);
+ if (i != strings.length - 1) {
+ buffer.append(",");
+ }
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * Add a value to be posted to the bug
+ *
+ * @param key
+ * The key for the value to be added
+ * @param value
+ * The value to be added
+ * @throws UnsupportedEncodingException
+ */
+ private void add(String key, String value) throws UnsupportedEncodingException {
+ // try {
+ // fields.add(new NameValuePair(key, URLEncoder.encode(value == null ?
+ // "" : value, charset)));
+ fields.put(key, new NameValuePair(key, value));
+ // BugzillaPlugin.ENCODING_UTF_8
+ // } catch (UnsupportedEncodingException e) {
+ // // ignore
+ // }
+ }
+
+ /**
+ * Post the bug to the bugzilla server TODO: fix this mess
+ */
+ public String submitReportToRepository(BugzillaClient client) throws IOException, BugzillaException,
+ PossibleBugzillaFailureException, GeneralSecurityException {
+ NameValuePair[] formData = fields.values().toArray(new NameValuePair[fields.size()]);
+ InputStream inputStream = null;
+ String result = null;
+ PostMethod method = null;
+ try {
+ if (isNewBugPost()) {
+ method = client.postFormData(POST_BUG_CGI, formData);
+ } else {
+ method = client.postFormData(PROCESS_BUG_CGI, formData);
+ }
+
+ if (method == null)
+ throw new BugzillaException("Could not post form");
+
+ BufferedReader in = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));
+ in.mark(10);
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+
+ boolean existingBugPosted = false;
+ boolean isTitle = false;
+ String title = "";
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " ";
+ continue;
+ } else if (token.getType() == Token.TAG
+ && ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+ if (!isNewBugPost
+ && (title.toLowerCase().matches(".*bug\\s+processed.*") || title.toLowerCase().matches(
+ ".*defect\\s+processed.*"))) {
+ existingBugPosted = true;
+ } else if (isNewBugPost && prefix != null && prefix2 != null && postfix != null
+ && postfix2 != null && result == null) {
+ int startIndex = -1;
+ int startIndexPrefix = title.toLowerCase().indexOf(prefix.toLowerCase());
+ int startIndexPrefix2 = title.toLowerCase().indexOf(prefix2.toLowerCase());
+
+ if (startIndexPrefix != -1 || startIndexPrefix2 != -1) {
+ if (startIndexPrefix != -1) {
+ startIndex = startIndexPrefix + prefix.length();
+ } else {
+ startIndex = startIndexPrefix2 + prefix2.length();
+ }
+ int stopIndex = title.toLowerCase().indexOf(postfix.toLowerCase(), startIndex);
+ if (stopIndex == -1)
+ stopIndex = title.toLowerCase().indexOf(postfix2.toLowerCase(), startIndex);
+ if (stopIndex > -1) {
+ result = (title.substring(startIndex, stopIndex)).trim();
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ if ((!isNewBugPost && existingBugPosted != true) || (isNewBugPost && result == null)) {
+ in.reset();
+ BugzillaClient.parseHtmlError(in);
+ }
+ } catch (ParseException e) {
+ throw new IOException("Could not parse response from server.");
+ } finally {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ // return the bug number
+ return result;
+ }
+
+ private void setPrefix(String prefix) {
+ this.prefix = prefix;
+ }
+
+ private void setPostfix(String postfix) {
+ this.postfix = postfix;
+ }
+
+ private void setPostfix2(String postfix) {
+ this.postfix2 = postfix;
+ }
+
+ public String getError() {
+ return parseError();
+ }
+
+ /**
+ * remove all of the hyperlinks and erroneous info
+ *
+ * @return
+ */
+ private String parseError() {
+ String newError = "";
+ try {
+ HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(new StringReader(error), null);
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.A) {
+
+ } else if (token.getType() == Token.TAG
+ && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.FORM) {
+ for (Token token2 = tokenizer.nextToken(); token2.getType() != Token.EOF; token2 = tokenizer
+ .nextToken()) {
+ if (token2.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token2.getValue();
+ if (tag.getTagType() == HtmlTag.Type.FORM && tag.isEndTag())
+ break;
+
+ }
+ }
+ } else {
+ newError += token.getWhitespace().toString() + token.getValue();
+ }
+ }
+ } catch (Exception e) {
+ newError = error;
+ }
+ return newError;
+ }
+
+ private void setPrefix2(String prefix2) {
+ this.prefix2 = prefix2;
+ }
+
+ /**
+ * Break text up into lines of about 80 characters so that it is displayed
+ * properly in bugzilla
+ */
+ private static String formatTextToLineWrap(String origText, boolean hardWrap) {
+ // BugzillaServerVersion bugzillaServerVersion =
+ // IBugzillaConstants.BugzillaServerVersion.fromString(repository
+ // .getVersion());
+ // if (bugzillaServerVersion != null &&
+ // bugzillaServerVersion.compareTo(BugzillaServerVersion.SERVER_220) >=
+ // 0) {
+ // return origText;
+ if (!hardWrap) {
+ return origText;
+ } else {
+ String[] textArray = new String[(origText.length() / WRAP_LENGTH + 1) * 2];
+ for (int i = 0; i < textArray.length; i++)
+ textArray[i] = null;
+ int j = 0;
+ while (true) {
+ int spaceIndex = origText.indexOf(" ", WRAP_LENGTH - 5);
+ if (spaceIndex == origText.length() || spaceIndex == -1) {
+ textArray[j] = origText;
+ break;
+ }
+ textArray[j] = origText.substring(0, spaceIndex);
+ origText = origText.substring(spaceIndex + 1, origText.length());
+ j++;
+ }
+
+ String newText = "";
+
+ for (int i = 0; i < textArray.length; i++) {
+ if (textArray[i] == null)
+ break;
+ newText += textArray[i] + "\n";
+ }
+ return newText;
+ }
+ }
+
+ public boolean isNewBugPost() {
+ return isNewBugPost;
+ }
+
+ public void setNewBugPost(boolean isNewBugPost) {
+ this.isNewBugPost = isNewBugPost;
+ }
+
+ public RepositoryTaskData getTaskData() {
+ return taskData;
+ }
+
+ public void setTaskData(RepositoryTaskData taskData) {
+ this.taskData = taskData;
+ }
+}
+// public void setProxySettings(Proxy proxySettings) {
+// this.proxySettings = proxySettings;
+// }
+
+// /**
+// * Post the bug to the bugzilla server
+// *
+// * @return The result of the responses
+// * @throws GeneralSecurityException
+// */
+// public String submitReportToRepository() throws IOException,
+// BugzillaException, PossibleBugzillaFailureException, GeneralSecurityException
+// {
+// BufferedOutputStream out = null;
+// BufferedReader in = null;
+// String result = null;
+// try {
+// // connect to the bugzilla server
+// HttpURLConnection postConnection = WebClientUtil.getUrlConnection(postUrl,
+// proxySettings, false, null, null);
+//
+// // set the connection method
+// postConnection.setRequestMethod(METHOD_POST);
+// String contentTypeString = POST_CONTENT_TYPE;
+// if (charset != null) {
+// contentTypeString += ";charset=" + charset;
+// }
+// postConnection.setRequestProperty(REQUEST_PROPERTY_CONTENT_TYPE,
+// contentTypeString);
+// // get the url for the update with all of the changed values
+//
+// byte[] body = getPostBody().getBytes();
+// postConnection.setRequestProperty(REQUEST_PROPERTY_CONTENT_LENGTH,
+// String.valueOf(body.length));
+//
+// // allow outgoing streams and open a stream to post to
+// postConnection.setDoOutput(true);
+//
+// out = new BufferedOutputStream(postConnection.getOutputStream());
+//
+// // write the data and close the stream
+// out.write(body);
+// out.flush();
+//
+// int responseCode = postConnection.getResponseCode();
+// if (responseCode != HttpURLConnection.HTTP_OK && responseCode !=
+// HttpURLConnection.HTTP_CREATED) {
+// throw new BugzillaException("Server returned HTTP error: " + responseCode + "
+// - "
+// + postConnection.getResponseMessage());
+// }
+//
+// // open a stream to receive response from bugzilla
+// in = new BufferedReader(new
+// InputStreamReader(postConnection.getInputStream()));
+// in.mark(10);
+// HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(in, null);
+//
+// boolean existingBugPosted = false;
+// boolean isTitle = false;
+// String title = "";
+// for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token
+// = tokenizer.nextToken()) {
+//
+// if (token.getType() == Token.TAG && ((HtmlTag)
+// (token.getValue())).getTagType() == HtmlTag.Type.TITLE
+// && !((HtmlTag) (token.getValue())).isEndTag()) {
+// isTitle = true;
+// continue;
+// }
+//
+// if (isTitle) {
+// // get all of the data in the title tag
+// if (token.getType() != Token.TAG) {
+// title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " ";
+// continue;
+// } else if (token.getType() == Token.TAG
+// && ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE
+// && ((HtmlTag) token.getValue()).isEndTag()) {
+// if (!isNewBugPost
+// && (title.toLowerCase().matches(".*bug\\s+processed.*") ||
+// title.toLowerCase().matches(
+// ".*defect\\s+processed.*"))) {
+// existingBugPosted = true;
+// } else if (isNewBugPost && prefix != null && prefix2 != null && postfix !=
+// null
+// && postfix2 != null && result == null) {
+// int startIndex = -1;
+// int startIndexPrefix = title.toLowerCase().indexOf(prefix.toLowerCase());
+// int startIndexPrefix2 = title.toLowerCase().indexOf(prefix2.toLowerCase());
+//
+// if (startIndexPrefix != -1 || startIndexPrefix2 != -1) {
+// if (startIndexPrefix != -1) {
+// startIndex = startIndexPrefix + prefix.length();
+// } else {
+// startIndex = startIndexPrefix2 + prefix2.length();
+// }
+// int stopIndex = title.toLowerCase().indexOf(postfix.toLowerCase(),
+// startIndex);
+// if (stopIndex == -1)
+// stopIndex = title.toLowerCase().indexOf(postfix2.toLowerCase(), startIndex);
+// if (stopIndex > -1) {
+// result = (title.substring(startIndex, stopIndex)).trim();
+// }
+// }
+// }
+// break;
+// }
+// }
+// }
+//
+// if ((!isNewBugPost && existingBugPosted != true) || (isNewBugPost && result
+// == null)) {
+// in.reset();
+// BugzillaClient.parseHtmlError(in);
+// }
+// } catch (KeyManagementException e) {
+// throw new BugzillaException("Could not POST form. Communications error: " +
+// e.getMessage(), e);
+// } catch (NoSuchAlgorithmException e) {
+// throw new BugzillaException("Could not POST form. Communications error: " +
+// e.getMessage(), e);
+// } catch (ParseException e) {
+// throw new IOException("Could not parse response from server.");
+// } finally {
+// try {
+// if (in != null)
+// in.close();
+// if (out != null)
+// out.close();
+//
+// } catch (IOException e) {
+// BugzillaCorePlugin.log(new Status(IStatus.ERROR,
+// BugzillaCorePlugin.PLUGIN_ID, IStatus.ERROR,
+// "Problem posting the bug", e));
+// }
+// }
+// // return the bug number
+// return result;
+// }
+
+// /**
+// * Get the url that contains the attributes to be posted
+// *
+// * @return The url for posting
+// */
+// private String getPostBody() {
+// String postBody = "";
+//
+// // go through all of the attributes and add them to the body of the post
+// Iterator<Map.Entry<String, String>> anIterator =
+// fields.entrySet().iterator();
+// while (anIterator.hasNext()) {
+// Map.Entry<String, String> entry = anIterator.next();
+// postBody = postBody + entry.getKey() + "=" + entry.getValue();
+// if (anIterator.hasNext())
+// postBody = postBody + "&";
+// }
+// return postBody;
+// }
+
+// private void setCharset(String charset) {
+// this.charset = charset;
+// }
+
+// private static void setConnectionsSettings(BugzillaReportSubmitForm form,
+// String repositoryUrl, String userName,
+// String password, Proxy proxySettings, String formName) throws
+// UnsupportedEncodingException {
+//
+// String baseURL = repositoryUrl;
+//
+// if (!baseURL.endsWith("/"))
+// baseURL += "/";
+// try {
+// form.postUrl = new URL(baseURL + formName);
+// if (proxySettings != null) {
+// form.proxySettings = proxySettings;
+// }
+// } catch (MalformedURLException e) {
+// // we should be ok here
+// }
+//
+// // add the login information to the bug post
+// //form.add(KEY_BUGZILLA_LOGIN, userName);
+// //form.add(KEY_BUGZILLA_PASSWORD, password);
+// }
+
+// /**
+// * Sets the cc field to the user's address if a cc has not been specified
+// to
+// * ensure that commenters are on the cc list. TODO: Review this mechanism
+// *
+// * @author Wesley Coelho
+// */
+// private static void setDefaultCCValue(BugzillaReport bug, String
+// userName) {
+// // RepositoryTaskAttribute newCCattr =
+// // bug.getAttributeForKnobName(KEY_NEWCC);
+// RepositoryTaskAttribute owner =
+// bug.getAttribute(BugzillaReportElement.ASSIGNED_TO);
+//
+// // Don't add the cc if the user is the bug owner
+// if (userName == null || (owner != null &&
+// owner.getValue().indexOf(userName) != -1)) {
+// // MylarStatusHandler.log("Could not determine CC value for
+// // repository: " + repository, null);
+// return;
+// }
+// // Don't add cc if already there
+// RepositoryTaskAttribute ccAttribute =
+// bug.getAttribute(BugzillaReportElement.CC);
+// if (ccAttribute != null && ccAttribute.getValues().contains(userName)) {
+// return;
+// }
+// RepositoryTaskAttribute newCCattr =
+// bug.getAttribute(BugzillaReportElement.NEWCC);
+// if (newCCattr == null) {
+// newCCattr = new RepositoryTaskAttribute(BugzillaReportElement.NEWCC);
+// bug.addAttribute(BugzillaReportElement.NEWCC, newCCattr);
+// }
+// // Add the user to the cc list
+// newCCattr.setValue(userName);
+// }
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaRepositoryQuery.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaRepositoryQuery.java
new file mode 100644
index 0000000..544f510
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaRepositoryQuery.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+
+/**
+ * @author Shawn Minto
+ * @author Mik Kersten
+ */
+ at Deprecated
+public class BugzillaRepositoryQuery extends RepositoryQuery {
+
+ private boolean customQuery = false;
+
+ public BugzillaRepositoryQuery(String repositoryUrl, String queryUrl, String description) {
+ super(description);
+ setUrl(queryUrl);
+ this.repositoryUrl = repositoryUrl;
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ public boolean isCustomQuery() {
+ return customQuery;
+ }
+
+ public void setCustomQuery(boolean customQuery) {
+ this.customQuery = customQuery;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaResultMatchAdapter.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaResultMatchAdapter.java
new file mode 100644
index 0000000..d27f36b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaResultMatchAdapter.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui;
+
+import org.eclipse.mylyn.internal.bugzilla.ui.search.IBugzillaResultEditorMatchAdapter;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskEditorInput;
+import org.eclipse.mylyn.tasks.ui.editors.RepositoryTaskEditorInput;
+import org.eclipse.mylyn.tasks.ui.search.RepositorySearchResult;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.search.ui.text.Match;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @author Mik Kersten (clean-up)
+ */
+public class BugzillaResultMatchAdapter implements IBugzillaResultEditorMatchAdapter {
+
+ /** An empty array of matches */
+ private final Match[] EMPTY_ARR = new Match[0];
+
+ private RepositorySearchResult result;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.search.ui.text.IEditorMatchAdapter#isShownInEditor(org.eclipse.search.ui.text.Match,
+ * org.eclipse.ui.IEditorPart)
+ */
+ public boolean isShownInEditor(Match match, IEditorPart editor) {
+ if (result == null)
+ return false;
+ IEditorInput ei = editor.getEditorInput();
+ if (ei instanceof RepositoryTaskEditorInput) {
+ AbstractTaskEditorInput bi = (AbstractTaskEditorInput) ei;
+ return match.getElement().equals(bi.getTaskData());
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.search.ui.text.IEditorMatchAdapter#computeContainedMatches(org.eclipse.search.ui.text.AbstractTextSearchResult,
+ * org.eclipse.ui.IEditorPart)
+ */
+ public Match[] computeContainedMatches(AbstractTextSearchResult result, IEditorPart editor) {
+ if (result == null)
+ return EMPTY_ARR;
+ IEditorInput ei = editor.getEditorInput();
+ if (ei instanceof RepositoryTaskEditorInput) {
+ AbstractTaskEditorInput bi = (AbstractTaskEditorInput) ei;
+ return result.getMatches(bi.getTaskData());
+ }
+ return EMPTY_ARR;
+ }
+
+ public void setResult(RepositorySearchResult result) {
+ this.result = result;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchHit.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchHit.java
new file mode 100644
index 0000000..bd01e50
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchHit.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+/**
+ * An item in the Bugzilla database matching the search criteria.
+ */
+public class BugzillaSearchHit {
+ /** The server that the result was from */
+ private String repositoryUrl;
+
+ /** The bug id */
+ private int id;
+
+ /** The description of the bug */
+ private String description;
+
+ /** The severity of the bug */
+ private String severity;
+
+ /** The priority of the bug */
+ private String priority;
+
+ /** The platform that the bug was found in */
+ private String platform;
+
+ /** The state of the bug */
+ private String state;
+
+ /** The resolution of the bug */
+ private String resolution;
+
+ /** The owner of the bug */
+ private String owner;
+
+ /** The query that the bug was a result of */
+ private String query;
+
+ public BugzillaSearchHit() {
+ }
+
+ /**
+ * Constructor
+ *
+ * @param id
+ * The id of the bug
+ * @param description
+ * The description of the bug
+ * @param severity
+ * The severity of the bug
+ * @param priority
+ * The priority of the bug
+ * @param platform
+ * The platform the bug was found in
+ * @param state
+ * The state of the bug
+ * @param result
+ * The resolution of the bug
+ * @param owner
+ * The owner of the bug
+ * @param query
+ * the query that the bug was a result of
+ */
+ public BugzillaSearchHit(String server, int id, String description, String severity, String priority,
+ String platform, String state, String result, String owner, String query) {
+ this.repositoryUrl = server;
+ this.id = id;
+ this.description = description;
+ this.severity = severity;
+ this.priority = priority;
+ this.platform = platform;
+ this.state = state;
+ this.resolution = result;
+ this.owner = owner;
+ this.query = query;
+ }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepository(String url) {
+ repositoryUrl = url;
+ }
+
+ /**
+ * Get the bugs id
+ *
+ * @return The bugs id
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * Get the bugs description
+ *
+ * @return The description of the bug
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Get the bugs priority
+ *
+ * @return The priority of the bug
+ */
+ public String getPriority() {
+ return priority;
+ }
+
+ /**
+ * Get the bugs severity
+ *
+ * @return The severity of the bug
+ */
+ public String getSeverity() {
+ return severity;
+ }
+
+ /**
+ * Get the platform the bug occurred under
+ *
+ * @return The platform that the bug occured under
+ */
+ public String getPlatform() {
+ return platform;
+ }
+
+ /**
+ * Get the bugs state
+ *
+ * @return The state of the bug
+ */
+ public String getState() {
+ return state;
+ }
+
+ /**
+ * Get the bugs resolution
+ *
+ * @return The resolution of the bug
+ */
+ public String getResolution() {
+ return resolution;
+ }
+
+ /**
+ * Get the bugs owner
+ *
+ * @return The owner of the bug
+ */
+ public String getOwner() {
+ return owner;
+ }
+
+ /**
+ * Get the query that the bug was a result of
+ *
+ * @return The query that the bug was a result of
+ */
+ public String getQuery() {
+ return query;
+ }
+
+ @Override
+ public String toString() {
+ return id + " " + description + "\n";
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public void setPlatform(String platform) {
+ this.platform = platform;
+ }
+
+ public void setPriority(String priority) {
+ this.priority = priority;
+ }
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+
+ public void setResolution(String resolution) {
+ this.resolution = resolution;
+ }
+
+ public void setSeverity(String severity) {
+ this.severity = severity;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchOperation.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchOperation.java
new file mode 100644
index 0000000..9f532d6
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchOperation.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import java.net.Proxy;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
+import org.eclipse.mylyn.tasks.core.QueryHitCollector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * An operation to perform Bugzilla search query.
+ *
+ * @author Mik Kersten (hardening of prototype)
+ */
+public class BugzillaSearchOperation implements IBugzillaSearchOperation {
+ private String queryUrl;
+
+ private QueryHitCollector collector;
+
+ private AbstractRepositorySearchQuery query;
+
+ /** The status of the search operation */
+ private IStatus status;
+
+ /** The LoginException that was thrown when trying to do the search */
+ private LoginException loginException = null;
+
+ private int maxHits;
+
+ private TaskRepository repository;
+
+ private Proxy proxySettings;
+
+ public BugzillaSearchOperation(TaskRepository repository, String queryUrl, Proxy proxySettings,
+ BugzillaSearchResultCollector collector, String maxHits) {
+ this.repository = repository;
+ this.queryUrl = queryUrl;
+ this.collector = collector;
+ this.proxySettings = proxySettings;
+ collector.setOperation(this);
+
+ try {
+ this.maxHits = Integer.parseInt(maxHits);
+ } catch (Exception e) {
+ this.maxHits = -1;
+ }
+ }
+
+ public void run(IProgressMonitor monitor) {
+ // set the progress monitor for the search collector and start the
+ // search
+ collector.setProgressMonitor(monitor);
+ BugzillaSearchEngine engine = new BugzillaSearchEngine(repository, queryUrl, proxySettings);
+ try {
+ status = engine.search(collector, 0, maxHits);
+ } catch (LoginException e) {
+ // save this exception to throw later
+ this.loginException = e;
+ }
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugzilla.ui.search.IBugzillaSearchOperation#getStatus()
+ */
+ public IStatus getStatus() throws LoginException {
+ // if a LoginException was thrown while trying to search, throw this
+ if (loginException == null)
+ return status;
+ else
+ throw loginException;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugzilla.core.search.IBugzillaSearchOperation#getQuery()
+ */
+ public AbstractRepositorySearchQuery getQuery() {
+ return query;
+ }
+
+ /**
+ * @see org.eclipse.mylyn.internal.bugzilla.core.search.IBugzillaSearchOperation#setQuery(org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery)
+ */
+ public void setQuery(AbstractRepositorySearchQuery newQuery) {
+ this.query = newQuery;
+ }
+
+ public String getName() {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchQuery.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchQuery.java
new file mode 100644
index 0000000..a622ea0
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaSearchQuery.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
+import org.eclipse.search.ui.text.AbstractTextSearchResult;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class performs a search query on Bugzilla bug reports.
+ *
+ * @author Rob Elves (modifications)
+ */
+public class BugzillaSearchQuery extends AbstractRepositorySearchQuery {
+
+ private static final String MESSAGE_LOGIN_FAILURE = "Could not log you in to get the information you requested since login name or password is incorrect.\nPlease check settings.";
+
+ /** The operation that performs the Bugzilla search query. */
+ private IBugzillaSearchOperation operation;
+
+ public BugzillaSearchQuery(IBugzillaSearchOperation operation) {
+ this.operation = operation;
+ operation.setQuery(this);
+ }
+
+ public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ final IStatus[] status = new IStatus[1];
+ final AbstractTextSearchResult textResult = (AbstractTextSearchResult) getSearchResult();
+ textResult.removeAll();
+
+ try {
+ operation.run(monitor);
+
+ status[0] = operation.getStatus();
+
+ if (status[0].getCode() == IStatus.CANCEL) {
+ status[0] = Status.OK_STATUS;
+ } else if (!status[0].isOK()) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openError(null, "Repository Search Error", status[0].getMessage());
+ }
+ });
+ status[0] = Status.OK_STATUS;
+ }
+ } catch (InvocationTargetException e) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(null, "Bugzilla Login Error", MESSAGE_LOGIN_FAILURE);
+ }
+ });
+ } catch (InterruptedException e) {
+ // ignore
+ } catch (final LoginException e) {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(null, "Bugzilla Login Error", MESSAGE_LOGIN_FAILURE);
+ BugzillaCorePlugin.log(new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "", e));
+ }
+ });
+ }
+
+ return status[0];
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaStackTraceDuplicateDetector.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaStackTraceDuplicateDetector.java
new file mode 100644
index 0000000..815355f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaStackTraceDuplicateDetector.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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:
+ * Meghan Allen - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.deprecated;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyDuplicateDetector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @author Meghan Allen
+ */
+public class BugzillaStackTraceDuplicateDetector extends AbstractLegacyDuplicateDetector {
+
+ private static final int DESCRIPTION_MAX_CHARS = 6000;
+
+ //private static final String NO_STACK_MESSAGE = "Unable to locate a stack trace in the description text.";
+
+ @Override
+ public RepositoryQuery getDuplicatesQuery(TaskRepository repository, RepositoryTaskData taskData) {
+ String queryUrl = "";
+ String searchString = AbstractLegacyDuplicateDetector.getStackTraceFromDescription(taskData.getDescription());
+ if (searchString != null && searchString.length() > DESCRIPTION_MAX_CHARS) {
+ searchString = searchString.substring(0, DESCRIPTION_MAX_CHARS);
+ }
+
+ if (searchString == null) {
+ //MessageDialog.openWarning(null, "No Stack Trace Found", NO_STACK_MESSAGE);
+ return null;
+ }
+
+ try {
+ queryUrl = repository.getRepositoryUrl() + "/buglist.cgi?long_desc_type=allwordssubstr&long_desc="
+ + URLEncoder.encode(searchString, repository.getCharacterEncoding());
+ } catch (UnsupportedEncodingException e) {
+ StatusHandler.log(new Status(IStatus.WARNING, BugzillaCorePlugin.ID_PLUGIN,
+ "Error during duplicate detection", e));
+ return null;
+ }
+
+ queryUrl += "&product=" + taskData.getProduct();
+
+ BugzillaRepositoryQuery bugzillaQuery = new BugzillaRepositoryQuery(repository.getRepositoryUrl(), queryUrl,
+ "search");
+ return bugzillaQuery;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaStackTraceTest.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaStackTraceTest.java
new file mode 100644
index 0000000..84ddd6a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaStackTraceTest.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+////Created on Oct 12, 2004
+package org.eclipse.mylyn.tests.misc;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.mylyn.bugzilla.tests.BugzillaTestPlugin;
+import org.eclipse.mylyn.core.tests.support.FileTool;
+import org.eclipse.mylyn.internal.bugs.search.BugzillaMylarSearchOperation;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.BugParser;
+import org.eclipse.mylyn.internal.bugzilla.core.search.BugzillaSearchHit;
+import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaReportNode;
+import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.StackTrace;
+
+/**
+ * Class to test the Bridge methods that do not require server queries
+ *
+ * @author Shawn Minto
+ */
+public class BugzillaStackTraceTest extends TestCase {
+
+ private static final String TEST_FILE_LOC = "testdata/reports-stacktrace/";
+
+ private static final String BUGZILLA_SERVER_NAME = "https://bugs.eclipse.org/bugs";
+
+ /**
+ * Test that the regular expression escaping mechanism works properly
+ */
+ public void testREGEX() {
+ String r = ".*+(){}[]^$|?/\\";
+ String r2 = StackTrace.escapeForRegex(r);
+ String ans = "\\.\\*\\+\\(\\)\\{\\}\\[\\]\\^\\$\\|\\?\\/\\\\";
+ String msg = "Regular Expression matching wrong:\nwas: " + r2 + "\nshould be:" + ans;
+ assertTrue(msg, r2.equals(ans));
+ }
+
+ // /**
+ // * Test parsing the bug for multiple stacks in in
+ // */
+ // public void testMultipleStacksDiffComments(){
+ // // REPORT_REPOSITORY 4862 - 2 stack traces - 1 in description, 1 in
+ // comment - text
+ // before and after
+ // performParse(4862, "4862.html", 2, false);
+ // }
+
+ // /**
+ // * Test parsing the bug for a single stack in the description with some
+ // * text before it
+ // */
+ // public void testSingleStackCodeBeforeInDescription(){
+ // // REPORT_REPOSITORY 76388 - 1 stack trace - description - text before
+ // and formatted
+ // ugly
+ // performParse(76388, "76388.html", 1, false);
+ // }
+
+ /**
+ * Test parsing the bug for a single stack trace in the description with
+ * text before and after it
+ */
+ public void testSingleStackCodeBeforeAndAfterInDescription() {
+
+ // REPORT_REPOSITORY 76146 - 1 stack trace - description - text before
+ // and code after
+ performParse(76146, "76146.html", 1, false);
+ }
+
+ /**
+ * Test parsing a bug that has 1 stack trace in the description with no
+ * extra text, but has lines in it that span 3 lines
+ */
+ public void testSingleStackPoorFormatInDescription() {
+ // REPORT_REPOSITORY 67395 - 1 stack trace - description - no extra
+ // text, 1 at line
+ // spans 3 lines
+ performParse(67395, "67395.html", 1, false);
+ }
+
+ /**
+ * Test parsing a bug with no stack traces and no qualified exception names
+ */
+ public void testNoStackNoQualified() {
+ // REPORT_REPOSITORY 4548 - no stack traces, no qualified reference to
+ // an exception
+ performParse(4548, "4548.html", 0, false);
+ }
+
+ /**
+ * Test parsing a bug with no stack traces, but a qualified reference to an
+ * exception
+ */
+ public void testNoStackQual() {
+ // REPORT_REPOSITORY 1 - no stack traces, qualified reference to
+ // exception - made up
+ // bug
+ performParse(1, "1.html", 0, false);
+ }
+
+ /**
+ * Test parsing of a bug with 1 stack trace and multiple qualified
+ * references
+ */
+ public void testSingleStackQual() {
+ // REPORT_REPOSITORY 2 - 1 stack trace- 2 qual ref, stack trace, 1 qual
+ // ref - made up
+ // bug
+ performParse(2, "2.html", 1, false);
+ }
+
+ /**
+ * Test parsing of a bug with many stacks traces in a single comment
+ */
+ public void testMultipleStackSingleComment() {
+ // REPORT_REPOSITORY 40152 - 1 stack trace- 2 qual ref, stack trace, 1
+ // qual ref - made
+ // up bug
+ performParse(40152, "40152.html", 33, false);
+ }
+
+ /**
+ * Print out the stack traces
+ *
+ * @param l
+ * List of stack traces
+ */
+ private void printStackTraces(List<StackTrace> l) {
+ System.out.println("\n\n");
+ for (int i = 0; i < l.size(); i++) {
+ StackTrace trace = l.get(i);
+ System.out.println("*****************?????????????????*****************\n");
+ System.out.println("OFFSET: " + trace.getOffset() + " LENGTH: " + trace.getLength());
+ System.out.println(trace.getStackTrace());
+ System.out.println("*****************?????????????????*****************\n\n");
+ }
+ }
+
+ private void performParse(int bugNumber, String bugFileName, int numTracesExpected, boolean printStackTraces) {
+
+ BugzillaSearchHit hit = new BugzillaSearchHit("<TEST-SERVER>", bugNumber, "", "", "", "", "", "", "", ""); // stack
+ // trace
+ // in
+ // desc
+ // and
+ // com
+
+ // create a new doi info
+ BugzillaReportNode doi = new BugzillaReportNode(0, hit, false);
+ try {
+
+ // read the bug in from a file
+ File f = FileTool.getFileInPlugin(BugzillaTestPlugin.getDefault(), new Path(TEST_FILE_LOC + bugFileName)); // used
+ // if
+ // run
+ // as a
+ // plugin
+ // test
+ // File f = new File(TEST_FILE_LOC+bugFileName); // used if run as a
+ // standalone test
+ Reader reader = new FileReader(f);
+ doi.setBug(BugParser.parseBug(reader, hit.getId(), BUGZILLA_SERVER_NAME, true, null, null, null));
+ reader.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ // do a second pass parse on the bug
+ List<BugzillaReportNode> l = new ArrayList<BugzillaReportNode>();
+ l.add(doi);
+ BugzillaMylarSearchOperation.secondPassBugzillaParser(l);
+
+ // make sure that we received the right number of stack traces back
+ // System.out.println("*** REPORT_REPOSITORY " + hit.getId() + " ***");
+ // System.out.println("NumStackTraces = " +
+ // doi.getStackTraces().size());
+ assertEquals("Wrong Number stack traces", numTracesExpected, doi.getStackTraces().size());
+ if (printStackTraces)
+ printStackTraces(doi.getStackTraces());
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTask.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTask.java
new file mode 100644
index 0000000..52d0b6a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTask.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ * @deprecated
+ */
+ at Deprecated
+public class BugzillaTask extends AbstractTask {
+
+ private String severity;
+
+ private String product;
+
+ public BugzillaTask(String repositoryUrl, String id, String label) {
+ super(repositoryUrl, id, label);
+ setUrl(BugzillaClient.getBugUrlWithoutLogin(repositoryUrl, id));
+ }
+
+ @Override
+ public String getTaskKind() {
+ return IBugzillaConstants.BUGZILLA_TASK_KIND;
+ }
+
+ @Override
+ public String toString() {
+ return "Bugzilla task: " + getHandleIdentifier();
+ }
+
+ @Override
+ public String getConnectorKind() {
+ return BugzillaCorePlugin.CONNECTOR_KIND;
+ }
+
+ public String getSeverity() {
+ return severity;
+ }
+
+ public void setSeverity(String severity) {
+ this.severity = severity;
+ }
+
+ public String getProduct() {
+ return product;
+ }
+
+ public void setProduct(String product) {
+ this.product = product;
+ }
+
+ @Override
+ public boolean isLocal() {
+ // ignore
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditor.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditor.java
new file mode 100644
index 0000000..ae24b4d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditor.java
@@ -0,0 +1,822 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Jeff Pound - Attachments
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.deprecated;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCustomField;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaOperation;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.KeywordsDialog;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * An editor used to view a bug report that exists on a server. It uses a <code>BugReport</code> object to store the
+ * data.
+ *
+ * @author Mik Kersten (hardening of prototype)
+ * @author Rob Elves
+ * @author Jeff Pound (Attachment work)
+ */
+public class BugzillaTaskEditor extends AbstractRepositoryTaskEditor {
+
+ private static final String LABEL_TIME_TRACKING = "Bugzilla Time Tracking";
+
+ protected Text keywordsText;
+
+ protected Text estimateText;
+
+ protected Text actualText;
+
+ protected Text remainingText;
+
+ protected Text addTimeText;
+
+ protected Text deadlineText;
+
+ protected DatePicker deadlinePicker;
+
+ protected Text votesText;
+
+ protected Text assignedTo;
+
+ /**
+ * Creates a new <code>ExistingBugEditor</code>.
+ */
+ public BugzillaTaskEditor(FormEditor editor) {
+ super(editor);
+ // Set up the input for comparing the bug report to the server
+ // CompareConfiguration config = new CompareConfiguration();
+ // config.setLeftEditable(false);
+ // config.setRightEditable(false);
+ // config.setLeftLabel("Local Bug Report");
+ // config.setRightLabel("Remote Bug Report");
+ // config.setLeftImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT));
+ // config.setRightImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT));
+ // compareInput = new BugzillaCompareInput(config);
+ }
+
+ @Override
+ protected boolean supportsCommentSort() {
+ return false;
+ }
+
+ @Override
+ protected void createCustomAttributeLayout(Composite composite) {
+ RepositoryTaskAttribute attribute = null;
+ try {
+ RepositoryConfiguration configuration = BugzillaCorePlugin.getRepositoryConfiguration(this.repository,
+ false, new NullProgressMonitor());
+
+ if (configuration != null) {
+ List<BugzillaCustomField> customFields = configuration.getCustomFields();
+ if (!customFields.isEmpty()) {
+ for (BugzillaCustomField bugzillaCustomField : customFields) {
+ List<String> optionList = bugzillaCustomField.getOptions();
+ attribute = this.taskData.getAttribute(bugzillaCustomField.getName());
+ if (attribute == null) {
+ RepositoryTaskAttribute newattribute = new RepositoryTaskAttribute(
+ bugzillaCustomField.getName(), bugzillaCustomField.getDescription(), false);
+ newattribute.setReadOnly(false);
+ this.taskData.addAttribute(bugzillaCustomField.getName(), newattribute);
+ }
+ final RepositoryTaskAttribute cfattribute = this.taskData.getAttribute(bugzillaCustomField.getName());
+ Label label = createLabel(composite, cfattribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ if (optionList != null && !optionList.isEmpty()) {
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ data.horizontalSpan = 1;
+ final CCombo attributeCombo = new CCombo(composite, SWT.FLAT | SWT.READ_ONLY);
+ getManagedForm().getToolkit().adapt(attributeCombo, true, true);
+ attributeCombo.setFont(TEXT_FONT);
+ attributeCombo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ if (hasChanged(cfattribute)) {
+ attributeCombo.setBackground(getColorIncoming());
+ }
+ attributeCombo.setLayoutData(data);
+
+ for (String val : optionList) {
+ if (val != null) {
+ attributeCombo.add(val);
+ }
+ }
+ String value = cfattribute.getValue();
+ if (value == null) {
+ value = "";
+ }
+ if (attributeCombo.indexOf(value) != -1) {
+ attributeCombo.select(attributeCombo.indexOf(value));
+ }
+ attributeCombo.clearSelection();
+ attributeCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (attributeCombo.getSelectionIndex() > -1) {
+ String sel = attributeCombo.getItem(attributeCombo.getSelectionIndex());
+ cfattribute.setValue(sel);
+ attributeChanged(cfattribute);
+ attributeCombo.clearSelection();
+ }
+ }
+ });
+ } else {
+ Text cfField = createTextField(composite, cfattribute, SWT.FLAT);
+ GridDataFactory.fillDefaults().hint(135, SWT.DEFAULT).applyTo(cfField);
+ }
+ }
+
+ getManagedForm().getToolkit().paintBordersFor(composite);
+ }
+ }
+ } catch (CoreException e) {
+ // ignore
+ }
+
+ attribute = this.taskData.getAttribute(BugzillaAttribute.DEPENDSON.getKey());
+ if (attribute != null && !attribute.isReadOnly()) {
+ Label label = createLabel(composite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+
+ Composite textFieldComposite = getManagedForm().getToolkit().createComposite(composite);
+ GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).applyTo(textFieldComposite);
+ GridLayoutFactory.swtDefaults().margins(1, 3).spacing(0, 3).applyTo(textFieldComposite);
+
+ GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
+ textData.horizontalSpan = 1;
+ textData.widthHint = 135;
+
+ final Text text = createTextField(textFieldComposite, attribute, SWT.FLAT);
+ text.setLayoutData(textData);
+ getManagedForm().getToolkit().paintBordersFor(textFieldComposite);
+ }
+
+ attribute = this.taskData.getAttribute(BugzillaAttribute.BLOCKED.getKey());
+ if (attribute != null && !attribute.isReadOnly()) {
+ Label label = createLabel(composite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Composite textFieldComposite = getManagedForm().getToolkit().createComposite(composite);
+ GridLayout textLayout = new GridLayout();
+ textLayout.marginWidth = 1;
+ textLayout.marginHeight = 3;
+ textLayout.verticalSpacing = 3;
+ textFieldComposite.setLayout(textLayout);
+ GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ textData.horizontalSpan = 1;
+ textData.widthHint = 135;
+ final Text text = createTextField(textFieldComposite, attribute, SWT.FLAT);
+ text.setLayoutData(textData);
+ getManagedForm().getToolkit().paintBordersFor(textFieldComposite);
+ }
+
+ String dependson = taskData.getAttributeValue(BugzillaAttribute.DEPENDSON.getKey());
+ String blocked = taskData.getAttributeValue(BugzillaAttribute.BLOCKED.getKey());
+ boolean addHyperlinks = (dependson != null && dependson.length() > 0)
+ || (blocked != null && blocked.length() > 0);
+
+ if (addHyperlinks) {
+ getManagedForm().getToolkit().createLabel(composite, "");
+ addBugHyperlinks(composite, BugzillaAttribute.DEPENDSON.getKey());
+ }
+
+ if (addHyperlinks) {
+ getManagedForm().getToolkit().createLabel(composite, "");
+ addBugHyperlinks(composite, BugzillaAttribute.BLOCKED.getKey());
+ }
+
+ // NOTE: urlText should not be back ported to 3.3 due to background color failure
+ attribute = this.taskData.getAttribute(BugzillaAttribute.BUG_FILE_LOC.getKey());
+ if (attribute != null && !attribute.isReadOnly()) {
+ Label label = createLabel(composite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ TextViewer urlTextViewer = addTextEditor(repository, composite, attribute.getValue(), //
+ false, SWT.FLAT);
+ final StyledText urlText = urlTextViewer.getTextWidget();
+ urlText.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ urlText.setIndent(2);
+ final RepositoryTaskAttribute urlAttribute = attribute;
+
+ urlTextViewer.setEditable(true);
+ urlTextViewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ String newValue = urlText.getText();
+ if (!newValue.equals(urlAttribute.getValue())) {
+ urlAttribute.setValue(newValue);
+ attributeChanged(urlAttribute);
+ }
+ }
+ });
+ GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ textData.horizontalSpan = 1;
+ textData.widthHint = 135;
+ urlText.setLayoutData(textData);
+ if (hasChanged(attribute)) {
+ urlText.setBackground(getColorIncoming());
+ }
+ }
+
+ attribute = this.taskData.getAttribute(BugzillaAttribute.STATUS_WHITEBOARD.getKey());
+ if (attribute == null) {
+ this.taskData.setAttributeValue(BugzillaAttribute.STATUS_WHITEBOARD.getKey(), "");
+ attribute = this.taskData.getAttribute(BugzillaAttribute.STATUS_WHITEBOARD.getKey());
+ }
+ if (attribute != null && !attribute.isReadOnly()) {
+ Label label = createLabel(composite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Text whiteboardField = createTextField(composite, attribute, SWT.FLAT);
+ GridDataFactory.fillDefaults().hint(135, SWT.DEFAULT).applyTo(whiteboardField);
+ }
+
+ try {
+ addKeywordsList(composite);
+ } catch (IOException e) {
+ MessageDialog.openInformation(null, "Attribute Display Error",
+ "Could not retrieve keyword list, ensure proper configuration in "
+ + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + "\n\nError reported: " + e.getMessage());
+ }
+
+ addVoting(composite);
+
+ // If groups is available add roles
+ if (taskData.getAttribute(BugzillaAttribute.GROUP.getKey()) != null) {
+ addRoles(composite);
+ }
+
+ if (taskData.getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey()) != null) {
+ addBugzillaTimeTracker(getManagedForm().getToolkit(), composite);
+ }
+ }
+
+ private boolean hasCustomAttributeChanges() {
+ if (taskData == null) {
+ return false;
+ }
+ String customAttributeKeys[] = { BugzillaAttribute.BUG_FILE_LOC.getKey(), BugzillaAttribute.DEPENDSON.getKey(),
+ BugzillaAttribute.BLOCKED.getKey(), BugzillaAttribute.KEYWORDS.getKey(),
+ BugzillaAttribute.VOTES.getKey(), BugzillaAttribute.REPORTER_ACCESSIBLE.getKey(),
+ BugzillaAttribute.CCLIST_ACCESSIBLE.getKey(), BugzillaAttribute.ESTIMATED_TIME.getKey(),
+ BugzillaAttribute.REMAINING_TIME.getKey(), BugzillaAttribute.ACTUAL_TIME.getKey(),
+ BugzillaAttribute.DEADLINE.getKey(), BugzillaAttribute.STATUS_WHITEBOARD.getKey() };
+ for (String key : customAttributeKeys) {
+ RepositoryTaskAttribute attribute = taskData.getAttribute(key);
+ if (hasChanged(attribute)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean hasVisibleAttributeChanges() {
+ return super.hasVisibleAttributeChanges() || this.hasCustomAttributeChanges();
+
+ }
+
+ private void addBugHyperlinks(Composite composite, String key) {
+ Composite hyperlinksComposite = getManagedForm().getToolkit().createComposite(composite);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.marginBottom = 0;
+ rowLayout.marginLeft = 0;
+ rowLayout.marginRight = 0;
+ rowLayout.marginTop = 0;
+ rowLayout.spacing = 0;
+ hyperlinksComposite.setLayout(new RowLayout());
+ String values = taskData.getAttributeValue(key);
+
+ if (values != null && values.length() > 0) {
+ for (String bugNumber : values.split(",")) {
+ final String bugId = bugNumber.trim();
+ final String bugUrl = repository.getRepositoryUrl() + IBugzillaConstants.URL_GET_SHOW_BUG + bugId;
+ final AbstractTask task = (AbstractTask) TasksUiInternal.getTaskList().getTask(
+ repository.getRepositoryUrl(), bugId);
+ createTaskListHyperlink(hyperlinksComposite, bugId, bugUrl, task);
+ }
+ }
+ }
+
+ protected void addRoles(Composite parent) {
+ Section rolesSection = getManagedForm().getToolkit().createSection(parent, ExpandableComposite.SHORT_TITLE_BAR);
+ rolesSection.setText("Users in the roles selected below can always view this bug");
+ rolesSection.setDescription("(The assignee can always see a bug, and this section does not take effect unless the bug is restricted to at least one group.)");
+ GridLayout gl = new GridLayout();
+ GridData gd = new GridData(SWT.FILL, SWT.NONE, false, false);
+ gd.horizontalSpan = 4;
+ rolesSection.setLayout(gl);
+ rolesSection.setLayoutData(gd);
+
+ Composite rolesComposite = getManagedForm().getToolkit().createComposite(rolesSection);
+ GridLayout attributesLayout = new GridLayout();
+ attributesLayout.numColumns = 4;
+ attributesLayout.horizontalSpacing = 5;
+ attributesLayout.verticalSpacing = 4;
+ rolesComposite.setLayout(attributesLayout);
+ GridData attributesData = new GridData(GridData.FILL_BOTH);
+ attributesData.horizontalSpan = 1;
+ attributesData.grabExcessVerticalSpace = false;
+ rolesComposite.setLayoutData(attributesData);
+ rolesSection.setClient(rolesComposite);
+
+ RepositoryTaskAttribute attribute = taskData.getAttribute(BugzillaAttribute.REPORTER_ACCESSIBLE.getKey());
+ if (attribute == null) {
+ taskData.setAttributeValue(BugzillaAttribute.REPORTER_ACCESSIBLE.getKey(), "0");
+ attribute = taskData.getAttribute(BugzillaAttribute.REPORTER_ACCESSIBLE.getKey());
+ }
+ Button button = addButtonField(rolesComposite, attribute, SWT.CHECK);
+ if (hasChanged(attribute)) {
+ button.setBackground(getColorIncoming());
+ }
+
+ attribute = null;
+ attribute = taskData.getAttribute(BugzillaAttribute.CCLIST_ACCESSIBLE.getKey());
+ if (attribute == null) {
+ taskData.setAttributeValue(BugzillaAttribute.CCLIST_ACCESSIBLE.getKey(), "0");
+ attribute = taskData.getAttribute(BugzillaAttribute.CCLIST_ACCESSIBLE.getKey());
+ }
+ button = addButtonField(rolesComposite, attribute, SWT.CHECK);
+ if (hasChanged(attribute)) {
+ button.setBackground(getColorIncoming());
+ }
+ }
+
+ @Override
+ protected boolean hasContentAssist(RepositoryTaskAttribute attribute) {
+ return BugzillaAttribute.NEWCC.getKey().equals(attribute.getId());
+ }
+
+ @Override
+ protected boolean hasContentAssist(RepositoryOperation repositoryOperation) {
+ BugzillaOperation operation;
+ try {
+ operation = BugzillaOperation.valueOf(repositoryOperation.getKnobName());
+ } catch (RuntimeException e) {
+ // FIXME: ?
+ StatusHandler.log(new Status(IStatus.INFO, BugzillaUiPlugin.ID_PLUGIN, "Unrecognized operation: "
+ + repositoryOperation.getKnobName(), e));
+ operation = null;
+ }
+
+ if (operation != null && operation == BugzillaOperation.reassign) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private Button addButtonField(Composite rolesComposite, RepositoryTaskAttribute attribute, int style) {
+ if (attribute == null) {
+ return null;
+ }
+ String name = attribute.getName();
+ if (hasOutgoingChange(attribute)) {
+ name += "*";
+ }
+
+ final Button button = getManagedForm().getToolkit().createButton(rolesComposite, name, style);
+ if (!attribute.isReadOnly()) {
+ button.setData(attribute);
+ button.setSelection(attribute.getValue().equals("1"));
+ button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ button.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String sel = "1";
+ if (!button.getSelection()) {
+ sel = "0";
+ }
+ RepositoryTaskAttribute a = (RepositoryTaskAttribute) button.getData();
+ a.setValue(sel);
+ attributeChanged(a);
+ }
+ });
+ }
+ return button;
+ }
+
+ protected void addBugzillaTimeTracker(FormToolkit toolkit, Composite parent) {
+
+ Section timeSection = toolkit.createSection(parent, ExpandableComposite.SHORT_TITLE_BAR);
+ timeSection.setText(LABEL_TIME_TRACKING);
+ GridLayout gl = new GridLayout();
+ GridData gd = new GridData(SWT.FILL, SWT.NONE, false, false);
+ gd.horizontalSpan = 4;
+ timeSection.setLayout(gl);
+ timeSection.setLayoutData(gd);
+
+ Composite timeComposite = toolkit.createComposite(timeSection);
+ gl = new GridLayout(4, false);
+ timeComposite.setLayout(gl);
+ gd = new GridData();
+ gd.horizontalSpan = 5;
+ timeComposite.setLayoutData(gd);
+
+ RepositoryTaskAttribute attribute = this.taskData.getAttribute(BugzillaAttribute.ESTIMATED_TIME.getKey());
+ if (attribute != null && !attribute.isReadOnly()) {
+ createLabel(timeComposite, attribute);
+ estimateText = createTextField(timeComposite, attribute, SWT.FLAT);
+ estimateText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ }
+
+ Label label = toolkit.createLabel(timeComposite, "Current Estimate:");
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ float total = 0;
+ try {
+ total = (Float.parseFloat(taskData.getAttributeValue(BugzillaAttribute.ACTUAL_TIME.getKey())) + Float.parseFloat(taskData.getAttributeValue(BugzillaAttribute.REMAINING_TIME.getKey())));
+ } catch (Exception e) {
+ // ignore likely NumberFormatException
+ }
+
+ Text currentEstimate = toolkit.createText(timeComposite, "" + total);
+ currentEstimate.setFont(TEXT_FONT);
+ currentEstimate.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ currentEstimate.setEditable(false);
+
+ attribute = this.taskData.getAttribute(BugzillaAttribute.ACTUAL_TIME.getKey());
+ if (attribute != null) {
+
+ createLabel(timeComposite, attribute);
+ Text actualText = createTextField(timeComposite, attribute, SWT.FLAT);
+ actualText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ actualText.setEditable(false);
+ }
+
+ // Add Time
+ taskData.setAttributeValue(BugzillaAttribute.WORK_TIME.getKey(), "0");
+ final RepositoryTaskAttribute addTimeAttribute = this.taskData.getAttribute(BugzillaAttribute.WORK_TIME.getKey());
+ if (addTimeAttribute != null) {
+
+ createLabel(timeComposite, addTimeAttribute);
+ addTimeText = toolkit.createText(timeComposite,
+ taskData.getAttributeValue(BugzillaAttribute.WORK_TIME.getKey()), SWT.BORDER);
+ addTimeText.setFont(TEXT_FONT);
+ addTimeText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ addTimeText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ addTimeAttribute.setValue(addTimeText.getText());
+ attributeChanged(addTimeAttribute);
+ }
+ });
+ }
+ attribute = this.taskData.getAttribute(BugzillaAttribute.REMAINING_TIME.getKey());
+ if (attribute != null) {
+ createLabel(timeComposite, attribute);
+ createTextField(timeComposite, attribute, SWT.FLAT);
+ }
+
+ attribute = this.taskData.getAttribute(BugzillaAttribute.DEADLINE.getKey());
+ if (attribute != null) {
+ createLabel(timeComposite, attribute);
+
+ Composite dateWithClear = toolkit.createComposite(timeComposite);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginWidth = 1;
+ dateWithClear.setLayout(layout);
+
+ deadlinePicker = new DatePicker(dateWithClear, /* SWT.NONE */SWT.BORDER,
+ taskData.getAttributeValue(BugzillaAttribute.DEADLINE.getKey()), false, 0);
+ deadlinePicker.setFont(TEXT_FONT);
+ deadlinePicker.setDatePattern("yyyy-MM-dd");
+ if (hasChanged(attribute)) {
+ deadlinePicker.setBackground(getColorIncoming());
+ }
+ deadlinePicker.addPickerSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ Calendar cal = deadlinePicker.getDate();
+ if (cal != null) {
+ Date d = cal.getTime();
+ SimpleDateFormat f = (SimpleDateFormat) DateFormat.getDateInstance();
+ f.applyPattern("yyyy-MM-dd");
+
+ taskData.setAttributeValue(BugzillaAttribute.DEADLINE.getKey(), f.format(d));
+ attributeChanged(taskData.getAttribute(BugzillaAttribute.DEADLINE.getKey()));
+ // TODO goes dirty even if user presses cancel
+ // markDirty(true);
+ } else {
+ taskData.setAttributeValue(BugzillaAttribute.DEADLINE.getKey(), "");
+ attributeChanged(taskData.getAttribute(BugzillaAttribute.DEADLINE.getKey()));
+ deadlinePicker.setDate(null);
+ }
+ }
+ });
+
+ ImageHyperlink clearDeadlineDate = toolkit.createImageHyperlink(dateWithClear, SWT.NONE);
+ clearDeadlineDate.setImage(CommonImages.getImage(CommonImages.REMOVE));
+ clearDeadlineDate.setToolTipText("Clear");
+ clearDeadlineDate.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ taskData.setAttributeValue(BugzillaAttribute.DEADLINE.getKey(), "");
+ attributeChanged(taskData.getAttribute(BugzillaAttribute.DEADLINE.getKey()));
+ deadlinePicker.setDate(null);
+ }
+ });
+
+ }
+
+ timeSection.setClient(timeComposite);
+ }
+
+ protected void addKeywordsList(Composite attributesComposite) throws IOException {
+ // newLayout(attributesComposite, 1, "Keywords:", PROPERTY);
+ final RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.KEYWORDS);
+ if (attribute == null) {
+ return;
+ }
+ Label label = createLabel(attributesComposite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+
+ // toolkit.createText(attributesComposite, keywords)
+ keywordsText = createTextField(attributesComposite, attribute, SWT.FLAT);
+ keywordsText.setFont(TEXT_FONT);
+ GridData keywordsData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ keywordsData.horizontalSpan = 2;
+ keywordsData.widthHint = 200;
+ keywordsText.setLayoutData(keywordsData);
+
+ Button changeKeywordsButton = getManagedForm().getToolkit().createButton(attributesComposite, "Edit...",
+ SWT.FLAT);
+ GridData keyWordsButtonData = new GridData();
+ changeKeywordsButton.setLayoutData(keyWordsButtonData);
+ changeKeywordsButton.addSelectionListener(new SelectionListener() {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+
+ String keywords = attribute.getValue();
+
+ Shell shell = null;
+ if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+ shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ } else {
+ shell = new Shell(PlatformUI.getWorkbench().getDisplay());
+ }
+
+ List<String> validKeywords = new ArrayList<String>();
+ try {
+ validKeywords = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
+ new NullProgressMonitor()).getKeywords();
+ } catch (Exception ex) {
+ // ignore
+ }
+
+ KeywordsDialog keywordsDialog = new KeywordsDialog(shell, keywords, validKeywords);
+ int responseCode = keywordsDialog.open();
+
+ String newKeywords = keywordsDialog.getSelectedKeywordsString();
+ if (responseCode == Window.OK && keywords != null) {
+ keywordsText.setText(newKeywords);
+ attribute.setValue(newKeywords);
+ attributeChanged(attribute);
+ } else {
+ return;
+ }
+
+ }
+
+ });
+ }
+
+ protected void addVoting(Composite attributesComposite) {
+ Label label = getManagedForm().getToolkit().createLabel(attributesComposite, "Votes:");
+ label.setForeground(getManagedForm().getToolkit().getColors().getColor(IFormColors.TITLE));
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Composite votingComposite = getManagedForm().getToolkit().createComposite(attributesComposite);
+ GridLayout layout = new GridLayout(3, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ votingComposite.setLayout(layout);
+
+ RepositoryTaskAttribute votesAttribute = taskData.getAttribute(BugzillaAttribute.VOTES.getKey());
+
+ votesText = createTextField(votingComposite, votesAttribute, SWT.FLAT | SWT.READ_ONLY);
+ votesText.setFont(TEXT_FONT);
+ GridDataFactory.fillDefaults().minSize(30, SWT.DEFAULT).hint(30, SWT.DEFAULT).applyTo(votesText);
+
+ if (votesAttribute != null && hasChanged(votesAttribute)) {
+ votesText.setBackground(getColorIncoming());
+ }
+ votesText.setEditable(false);
+
+ Hyperlink showVotesHyperlink = getManagedForm().getToolkit().createHyperlink(votingComposite, "Show votes",
+ SWT.NONE);
+ showVotesHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (BugzillaTaskEditor.this.getEditor() instanceof TaskEditor) {
+ TasksUiUtil.openUrl(repository.getRepositoryUrl() + IBugzillaConstants.URL_SHOW_VOTES
+ + taskData.getTaskId());
+ }
+ }
+ });
+
+ Hyperlink voteHyperlink = getManagedForm().getToolkit().createHyperlink(votingComposite, "Vote", SWT.NONE);
+ voteHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (BugzillaTaskEditor.this.getEditor() instanceof TaskEditor) {
+ TasksUiUtil.openUrl(repository.getRepositoryUrl() + IBugzillaConstants.URL_VOTE
+ + taskData.getTaskId());
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void validateInput() {
+
+ }
+
+ @Override
+ protected String getHistoryUrl() {
+ if (repository != null && taskData != null) {
+ return repository.getRepositoryUrl() + IBugzillaConstants.URL_BUG_ACTIVITY + taskData.getTaskId();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @author Frank Becker (bug 198027) FIXME: A lot of duplicated code here between this and NewBugzillataskEditor
+ */
+ @Override
+ protected void addAssignedTo(Composite peopleComposite) {
+ RepositoryTaskAttribute assignedAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED);
+ if (assignedAttribute != null) {
+ String bugzillaVersion;
+ try {
+ bugzillaVersion = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
+ new NullProgressMonitor()).getInstallVersion();
+ } catch (CoreException e1) {
+ // ignore
+ bugzillaVersion = "2.18";
+ }
+ if (bugzillaVersion.compareTo("3.1") < 0) {
+ // old bugzilla workflow is used
+ super.addAssignedTo(peopleComposite);
+ return;
+ }
+ Label label = createLabel(peopleComposite, assignedAttribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ assignedTo = createTextField(peopleComposite, assignedAttribute, SWT.FLAT);
+ GridDataFactory.fillDefaults().hint(150, SWT.DEFAULT).applyTo(assignedTo);
+ assignedTo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ String sel = assignedTo.getText();
+ RepositoryTaskAttribute a = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED);
+ if (!(a.getValue().equals(sel))) {
+ a.setValue(sel);
+ markDirty(true);
+ }
+ }
+ });
+ ContentAssistCommandAdapter adapter = applyContentAssist(assignedTo,
+ createContentProposalProvider(assignedAttribute));
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(assignedAttribute);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+
+ FormToolkit toolkit = getManagedForm().getToolkit();
+ Label dummylabel = toolkit.createLabel(peopleComposite, "");
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(dummylabel);
+ RepositoryTaskAttribute attribute = taskData.getAttribute(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ if (attribute == null) {
+ taskData.setAttributeValue(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey(), "0");
+ attribute = taskData.getAttribute(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ }
+ addButtonField(peopleComposite, attribute, SWT.CHECK);
+ }
+ }
+
+ @Override
+ protected boolean attributeChanged(RepositoryTaskAttribute attribute) {
+ if (attribute == null) {
+ return false;
+ }
+
+ // Support comment wrapping for bugzilla 2.18
+ if (attribute.getId().equals(BugzillaAttribute.NEW_COMMENT.getKey())) {
+ if (repository.getVersion().startsWith("2.18")) {
+ attribute.setValue(BugzillaUiPlugin.formatTextToLineWrap(attribute.getValue(), true));
+ }
+ }
+ return super.attributeChanged(attribute);
+ }
+
+ @Override
+ protected void addSelfToCC(Composite composite) {
+
+ // XXX: Work around for adding QAContact to People section. Update once bug#179254 is complete
+ boolean haveRealName = false;
+ RepositoryTaskAttribute qaContact = taskData.getAttribute(BugzillaAttribute.QA_CONTACT_NAME.getKey());
+ if (qaContact == null) {
+ qaContact = taskData.getAttribute(BugzillaAttribute.QA_CONTACT.getKey());
+ } else {
+ haveRealName = true;
+ }
+ if (qaContact != null) {
+ Label label = createLabel(composite, qaContact);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Text textField;
+ if (qaContact.isReadOnly()) {
+ textField = createTextField(composite, qaContact, SWT.FLAT | SWT.READ_ONLY);
+ } else {
+ textField = createTextField(composite, qaContact, SWT.FLAT);
+ ContentAssistCommandAdapter adapter = applyContentAssist(textField,
+ createContentProposalProvider(qaContact));
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(qaContact);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ }
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(textField);
+ if (haveRealName) {
+ textField.setText(textField.getText() + " <"
+ + taskData.getAttributeValue(BugzillaAttribute.QA_CONTACT.getKey()) + ">");
+ }
+ }
+
+ super.addSelfToCC(composite);
+
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditorFactory.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditorFactory.java
new file mode 100644
index 0000000..9be0cda
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditorFactory.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractTaskEditorFactory;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.RepositoryTaskEditorInput;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaTaskEditorFactory extends AbstractTaskEditorFactory {
+
+ private static final String TITLE = "Bugzilla";
+
+ @Override
+ public EditorPart createEditor(TaskEditor parentEditor, IEditorInput editorInput) {
+ AbstractRepositoryTaskEditor editor = null;
+ if (editorInput instanceof RepositoryTaskEditorInput) {
+ RepositoryTaskEditorInput taskInput = (RepositoryTaskEditorInput) editorInput;
+ if (taskInput.getTaskData().isNew()) {
+ editor = new NewBugzillaTaskEditor(parentEditor);
+ } else {
+ editor = new BugzillaTaskEditor(parentEditor);
+ }
+ } else if (editorInput instanceof TaskEditorInput) {
+ editor = new BugzillaTaskEditor(parentEditor);
+ }
+ return editor;
+ }
+
+ @Override
+ public IEditorInput createEditorInput(ITask task) {
+ if (task instanceof BugzillaTask) {
+ BugzillaTask bugzillaTask = (BugzillaTask) task;
+ final TaskRepository repository = TasksUi.getRepositoryManager().getRepository(
+ BugzillaCorePlugin.CONNECTOR_KIND, bugzillaTask.getRepositoryUrl());
+ BugzillaTaskEditorInput input = new BugzillaTaskEditorInput(repository, bugzillaTask, true);
+ return input;
+ }
+ return null;
+ }
+
+ @Override
+ public String getTitle() {
+ return TITLE;
+ }
+
+ @Override
+ public boolean canCreateEditorFor(ITask task) {
+ return task instanceof BugzillaTask;
+ }
+
+ @Override
+ public boolean providesOutline() {
+ return true;
+ }
+
+ @Override
+ public boolean canCreateEditorFor(IEditorInput input) {
+ if (input instanceof RepositoryTaskEditorInput) {
+ return BugzillaCorePlugin.CONNECTOR_KIND.equals(((RepositoryTaskEditorInput) input).getRepository()
+ .getConnectorKind());
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditorInput.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditorInput.java
new file mode 100644
index 0000000..3567cb5
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskEditorInput.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Eric Booth - contribution
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.deprecated;
+
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.RepositoryTaskEditorInput;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Eric Booth
+ * @author Mik Kersten
+ * @author Rob Elves
+ */
+public class BugzillaTaskEditorInput extends RepositoryTaskEditorInput {
+
+ private String bugTitle = "";
+
+ private final BugzillaTask bugTask;
+
+ public BugzillaTaskEditorInput(TaskRepository repository, BugzillaTask bugzillaTask, boolean offline) {
+ super(repository, bugzillaTask.getTaskId(), bugzillaTask.getUrl());
+ this.bugTask = bugzillaTask;
+// updateOptions(getTaskData());
+// updateOptions(getOldTaskData());
+ }
+
+ protected void setBugTitle(String str) {
+ // 03-20-03 Allows editor to store title (once it is known)
+ bugTitle = str;
+ }
+
+ @Override
+ public boolean exists() {
+ return true;
+ }
+
+ @Override
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ @Override
+ public String getToolTipText() {
+ return bugTitle;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /**
+ * @return Returns the <code>BugzillaTask</code>
+ */
+ public BugzillaTask getBugTask() {
+ return bugTask;
+ }
+
+// private void updateOptions(TaskData taskData) {
+// try {
+// if (taskData != null) {
+// RepositoryConfiguration config = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
+// new NullProgressMonitor());
+// config.updateAttributeOptions(taskData);
+// }
+// } catch (Exception e) {
+// // ignore
+// }
+// }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskHyperlinkDetector.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskHyperlinkDetector.java
new file mode 100644
index 0000000..723f03d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskHyperlinkDetector.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui;
+
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractTaskHyperlinkDetector;
+import org.eclipse.mylyn.tasks.ui.editors.TaskHyperlinkDetector;
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaTaskHyperlinkDetector extends TaskHyperlinkDetector {
+
+ private static final int TASK_NUM_GROUP = 3;
+
+ private static final String regexp = "(duplicate of|bug|task)(\\s#|#|#\\s|\\s|)(\\s\\d+|\\d+)";
+
+ private static final Pattern PATTERN = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
+
+ @Override
+ protected IHyperlink[] findHyperlinks(TaskRepository repository, String text, int lineOffset, int regionOffset) {
+ ArrayList<IHyperlink> hyperlinksFound = new ArrayList<IHyperlink>();
+
+ Matcher m = PATTERN.matcher(text);
+ while (m.find()) {
+ if (lineOffset >= m.start() && lineOffset <= m.end()) {
+ IHyperlink link = extractHyperlink(repository, regionOffset, m);
+ if (link != null)
+ hyperlinksFound.add(link);
+ }
+ }
+
+ if (hyperlinksFound.size() > 0) {
+ return hyperlinksFound.toArray(new IHyperlink[1]);
+ }
+ return null;
+ }
+
+ private static IHyperlink extractHyperlink(TaskRepository repository, int regionOffset, Matcher m) {
+
+ int start = -1;
+
+ if (m.group().startsWith("duplicate")) {
+ start = m.start() + m.group().indexOf(m.group(TASK_NUM_GROUP));
+ } else {
+ start = m.start();
+ }
+
+ int end = m.end();
+
+ if (end == -1)
+ end = m.group().length();
+
+ try {
+
+ String bugId = m.group(TASK_NUM_GROUP).trim();
+ start += regionOffset;
+ end += regionOffset;
+
+ IRegion sregion = new Region(start, end - start);
+ return new TaskHyperlink(sregion, repository, bugId);
+
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ @Override
+ protected String getTargetID() {
+ return BugzillaCorePlugin.REPOSITORY_KIND;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskListFactory.java b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskListFactory.java
new file mode 100644
index 0000000..4d3d72f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/BugzillaTaskListFactory.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.w3c.dom.Element;
+
+/**
+ * @author Mik Kersten
+ * @deprecated see BugzillaTaskListMigrator
+ */
+ at Deprecated
+public class BugzillaTaskListFactory extends AbstractTaskListFactory {
+
+ private static final String KEY_SEVERITY = "bugzilla.severity";
+
+ private static final String KEY_PRODUCT = "bugzilla.product";
+
+ private static final String TAG_BUGZILLA = "Bugzilla";
+
+ private static final String TAG_BUGZILLA_QUERY = TAG_BUGZILLA + KEY_QUERY;
+
+ private static final String TAG_BUGZILLA_CUSTOM_QUERY = "BugzillaCustom" + KEY_QUERY;
+
+ private static final String TAG_BUGZILLA_REPORT = "BugzillaReport";
+
+ @Override
+ public String getTaskElementName() {
+ return TAG_BUGZILLA_REPORT;
+ }
+
+ @Override
+ public Set<String> getQueryElementNames() {
+ Set<String> names = new HashSet<String>();
+ names.add(TAG_BUGZILLA_QUERY);
+ names.add(TAG_BUGZILLA_CUSTOM_QUERY);
+ return names;
+ }
+
+ @Override
+ public boolean canCreate(IRepositoryQuery category) {
+ return category instanceof BugzillaRepositoryQuery;
+ }
+
+ @Override
+ public boolean canCreate(ITask task) {
+ return task instanceof BugzillaTask;
+ }
+
+ @Override
+ public String getQueryElementName(IRepositoryQuery query) {
+ if (query instanceof BugzillaRepositoryQuery) {
+ if (((BugzillaRepositoryQuery) query).isCustomQuery()) {
+ return TAG_BUGZILLA_CUSTOM_QUERY;
+ } else {
+ return TAG_BUGZILLA_QUERY;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public RepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element) {
+ BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repositoryUrl, queryString, label);
+ if (element.getNodeName().equals(TAG_BUGZILLA_CUSTOM_QUERY)) {
+ query.setCustomQuery(true);
+ }
+ return query;
+ }
+
+ @Override
+ public void setAdditionalAttributes(ITask task, Element element) {
+ element.setAttribute(KEY_SEVERITY, ((BugzillaTask) task).getSeverity());
+ element.setAttribute(KEY_PRODUCT, ((BugzillaTask) task).getProduct());
+ }
+
+ @Override
+ public AbstractTask createTask(String repositoryUrl, String taskId, String summary, Element element) {
+ BugzillaTask task = new BugzillaTask(repositoryUrl, taskId, summary);
+ if (element.hasAttribute(KEY_SEVERITY)) {
+ task.setSeverity(element.getAttribute(KEY_SEVERITY));
+ }
+ if (element.hasAttribute(KEY_PRODUCT)) {
+ task.setProduct(element.getAttribute(KEY_PRODUCT));
+ }
+ return task;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/CreateBugzillaTaskAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/CreateBugzillaTaskAction.java
new file mode 100644
index 0000000..a60e6f4
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/CreateBugzillaTaskAction.java
@@ -0,0 +1,113 @@
+///*******************************************************************************
+// * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+// * University Of British Columbia - initial API and implementation
+// *******************************************************************************/
+//
+//package org.eclipse.mylyn.bugzilla.ui.actions;
+//
+//import org.eclipse.jface.action.Action;
+//import org.eclipse.jface.action.IAction;
+//import org.eclipse.jface.viewers.ISelection;
+//import org.eclipse.jface.viewers.IStructuredSelection;
+//import org.eclipse.jface.viewers.StructuredSelection;
+//import org.eclipse.mylyn.bugzilla.core.BugzillaPlugin;
+//import org.eclipse.mylyn.bugzilla.ui.BugzillaImages;
+//import org.eclipse.mylyn.bugzilla.ui.BugzillaUiPlugin;
+//import org.eclipse.mylyn.bugzilla.ui.tasklist.BugzillaTask;
+//import org.eclipse.mylyn.tasklist.ITask;
+//import org.eclipse.mylyn.tasklist.ITaskHandler;
+//import org.eclipse.mylyn.tasklist.MylarTaskListPlugin;
+//import org.eclipse.mylyn.tasklist.TaskRepository;
+//import org.eclipse.mylyn.tasklist.internal.TaskCategory;
+//import org.eclipse.mylyn.tasklist.internal.TaskRepositoryManager;
+//import org.eclipse.mylyn.tasklist.ui.views.TaskListView;
+//import org.eclipse.ui.IViewActionDelegate;
+//import org.eclipse.ui.IViewPart;
+//
+///**
+// * @author Mik Kersten
+// * @author Ken Sueda
+// */
+//public class CreateBugzillaTaskAction extends Action implements IViewActionDelegate {
+//
+// private static final String LABEL = "Add Existing Bugzilla Report";
+//
+// public static final String ID = "org.eclipse.mylyn.tasklist.actions.create.bug";
+//
+// public CreateBugzillaTaskAction() {
+// setText(LABEL);
+// setToolTipText(LABEL);
+// setId(ID);
+// setImageDescriptor(BugzillaImages.TASK_BUGZILLA);
+// }
+//
+// @Override
+// public void run() {
+// if(TaskListView.getDefault() == null)
+// return;
+//
+// String bugIdString = TaskListView.getDefault().getBugIdFromUser();
+// int bugId = -1;
+// try {
+// if (bugIdString != null) {
+// bugId = Integer.parseInt(bugIdString);
+// } else {
+// return;
+// }
+// } catch (NumberFormatException nfe) {
+// TaskListView.getDefault().showMessage("Please enter a valid report number");
+// return;
+// }
+//
+// TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getDefaultRepository(BugzillaPlugin.REPOSITORY_KIND);
+// ITask newTask = new BugzillaTask(
+// TaskRepositoryManager.getHandle(repository.getUrl().toExternalForm(), bugId),
+// "<bugzilla info>", true, true);
+// Object selectedObject = ((IStructuredSelection)TaskListView.getDefault().getViewer().getSelection()).getFirstElement();
+//
+// ITaskHandler taskHandler = MylarTaskListPlugin.getDefault().getHandlerForElement(newTask);
+// if(taskHandler != null){
+// ITask addedTask = taskHandler.taskAdded(newTask);
+// if(addedTask instanceof BugzillaTask){
+// BugzillaTask newTask2 = (BugzillaTask)addedTask;
+// if(newTask2 == newTask){
+// ((BugzillaTask)newTask).scheduleDownloadReport();
+// } else {
+// newTask = newTask2;
+// ((BugzillaTask)newTask).updateTaskDetails();
+// }
+// }
+// } else {
+// ((BugzillaTask)newTask).scheduleDownloadReport();
+// }
+// if (selectedObject instanceof TaskCategory) {
+// MylarTaskListPlugin.getTaskListManager().moveToCategory(((TaskCategory)selectedObject), newTask);
+// } else {
+// MylarTaskListPlugin.getTaskListManager().moveToRoot(newTask);
+// }
+// BugzillaUiPlugin.getDefault().getBugzillaTaskListManager().addToBugzillaTaskRegistry((BugzillaTask)newTask);
+//
+// if(TaskListView.getDefault() != null) {
+// // Make this new task the current selection in the view
+// TaskListView.getDefault().getViewer().setSelection(new StructuredSelection(newTask));
+// TaskListView.getDefault().getViewer().refresh();
+// }
+// }
+//
+// public void init(IViewPart view) {
+// }
+//
+// public void run(IAction action) {
+// run();
+// }
+//
+// public void selectionChanged(IAction action, ISelection selection) {
+//
+// }
+//}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/DeleteFavoriteAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/DeleteFavoriteAction.java
new file mode 100644
index 0000000..7ff5995
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/DeleteFavoriteAction.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.actions;
+
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylyn.internal.bugzilla.ui.FavoritesView;
+
+/**
+ * Action of removing a bookmark
+ */
+public class DeleteFavoriteAction extends AbstractFavoritesAction {
+ /** The instance of the favorites view */
+ private FavoritesView view;
+
+ /** True if all of the bookmarks are to be deleted */
+ private boolean deleteAll;
+
+ /**
+ * Constructor
+ *
+ * @param favoritesView
+ * The favorites view being used
+ * @param deleteAllFavorites
+ * <code>true</code> if all of the favorites should be deleted,
+ * else <code>false</code>
+ */
+ public DeleteFavoriteAction(FavoritesView favoritesView, boolean deleteAllFavorites) {
+ deleteAll = deleteAllFavorites;
+
+ // set the appropriate icons and tool tips for the action depending
+ // on whether it will delete all items or not
+ if (deleteAll) {
+ setToolTipText("Remove All Favorites");
+ setText("Remove All");
+ setImageDescriptor(BugzillaImages.REMOVE_ALL);
+ } else {
+ setToolTipText("Remove Selected Favorites");
+ setText("Remove");
+ setImageDescriptor(BugzillaImages.REMOVE);
+ }
+
+ view = favoritesView;
+ }
+
+ /**
+ * Delete the appropriate favorites
+ *
+ * @see org.eclipse.jface.action.IAction#run()
+ */
+ @Override
+ public void run() {
+ FavoritesView.checkWindow();
+
+ // call the appropriate delete function
+ if (deleteAll)
+ view.deleteAllFavorites();
+ else
+ view.deleteSelectedFavorites();
+ FavoritesView.updateActionEnablement();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/DummySearchHitProvider.java b/org.eclipse.mylyn/developer/src-old/bugzilla/DummySearchHitProvider.java
new file mode 100644
index 0000000..46e2aed
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/DummySearchHitProvider.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskFactory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.QueryHitCollector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+
+public class DummySearchHitProvider extends QueryHitCollector {
+
+ public DummySearchHitProvider(ITaskList tasklist) {
+ super(new ITaskFactory() {
+
+ public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
+ return null;
+ }
+ });
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/Favorite.java b/org.eclipse.mylyn/developer/src-old/bugzilla/Favorite.java
new file mode 100644
index 0000000..1e1f2db
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/Favorite.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core.internal;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Map;
+
+import org.eclipse.mylyn.bugzilla.core.BugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.search.BugzillaSearchResultCollector;
+
+/**
+ * Class representing an item in the favorites view
+ */
+public class Favorite implements Serializable {
+
+ /** Automatically generated serialVersionUID */
+ private static final long serialVersionUID = 3258129158977632310L;
+
+ /** Bug id */
+ private int id;
+
+ /** Bug description */
+ private String description;
+
+ /** Query that created the match */
+ private String query;
+
+ /** Bug's attributes (severity, priority, etc.) */
+ private Map<String, Object> attributes;
+
+ /** Date when the favorite was recommended. */
+ private Date date;
+
+ private String server;
+
+ /**
+ * Constructor.
+ *
+ * @param bug
+ * The bug this favorite represents.
+ */
+ public Favorite(BugzillaReport bug) {
+ this(bug.getRepositoryUrl(), bug.getId(), bug.getSummary(), "", BugzillaSearchResultCollector.getAttributeMap(bug));
+ }
+
+ /**
+ * Constructor.
+ */
+ public Favorite(String server, int id, String description, String query, Map<String, Object> attributes) {
+ this.server = server;
+ this.id = id;
+ this.description = description;
+ this.query = query;
+ this.attributes = attributes;
+ date = new Date();
+ }
+
+ /**
+ * returns the server for the bug
+ */
+ public String getServer() {
+ return server;
+ }
+
+ /**
+ * Returns bug's id.
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * Returns bug's description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Returns bug attributes.
+ */
+ public Map<String, Object> getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * Returns the query that created the match.
+ */
+ public String getQuery() {
+ return query;
+ }
+
+ /**
+ * Returns date when the favorite was added to the view.
+ */
+ public Date getDate() {
+ return date;
+ }
+
+ @Override
+ public String toString() {
+ return id + " - " + description;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/FavoritesFile.java b/org.eclipse.mylyn/developer/src-old/bugzilla/FavoritesFile.java
new file mode 100644
index 0000000..b33df4f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/FavoritesFile.java
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+
+/**
+ * Class to persist the data for the favorites list
+ */
+public class FavoritesFile {
+ /** The file that the favorites are written to */
+ private File file;
+
+ /** The directory to where the file is located */
+ /** A list of favorites */
+ private ArrayList<Favorite> list = new ArrayList<Favorite>();
+
+ /** Sort by bug ID */
+ public static final int ID_SORT = 0;
+
+ /** Sort by bug priority */
+ public static final int PRIORITY_SORT = 1;
+
+ /** Sort by bug priority */
+ public static final int SEVERITY_SORT = 2;
+
+ /** Sort by bug state */
+ public static final int STATE_SORT = 3;
+
+ /** Default sort by bug ID */
+ public static int lastSel = 0;
+
+ /**
+ * Constructor that reads the favorites data persisted in the plugin's state
+ * directory, if it exists.
+ *
+ * @param file
+ * The file where the favorites are persisted
+ * @throws IOException
+ * Error opening or closing the favorites file
+ * @throws ClassNotFoundException
+ * Error deserializing objects from the favorites file
+ */
+ public FavoritesFile(File file) throws ClassNotFoundException, IOException {
+ this.file = file;
+ if (file.exists()) {
+ readFile();
+ }
+ }
+
+ /**
+ * Add a favorite to the favorites list
+ *
+ * @param entry
+ * The bug to add
+ */
+ public void add(Favorite entry) {
+ // add the entry to the list and write the file to disk
+ list.add(entry);
+ writeFile();
+ }
+
+ /**
+ * Find a bug in the favorites list
+ *
+ * @param id
+ * The bug id that we are looking for
+ * @return The index of the bug in the array if it exists, else 0
+ */
+ public int find(int id) {
+ for (int i = 0; i < list.size(); i++) {
+ Favorite currFav = list.get(i);
+ if (currFav.getId() == id)
+ return i;
+ }
+ return 0;
+ }
+
+ /**
+ * Get the list of favorites
+ *
+ * @return The list of favorites
+ */
+ public ArrayList<Favorite> elements() {
+ return list;
+ }
+
+ /**
+ * Write the favorites to disk
+ */
+ private void writeFile() {
+ try {
+ ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
+
+ // Write the size of the list so that we can read it back in easier
+ out.writeInt(list.size());
+
+ // write each element in the array list
+ for (int i = 0; i < list.size(); i++) {
+ Object item = list.get(i);
+ out.writeObject(item);
+ }
+ out.close();
+ } catch (IOException e) {
+ // put up a message and log the error if there is a problem writing
+ // to the file
+ MessageDialog.openError(null, "I/O Error", "Bugzilla could not write to favorites file.");
+ BugzillaPlugin.log(e);
+ }
+ }
+
+ /**
+ * Read the favorites in from the file on disk
+ *
+ * @throws IOException
+ * Error opening or closing the favorites file
+ * @throws ClassNotFoundException
+ * Error deserializing objects from the favorites file
+ */
+ private void readFile() throws ClassNotFoundException, IOException {
+ ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
+
+ // get the number of favorites in the file
+ int size = in.readInt();
+
+ // read in each of the favorites in the file
+ for (int nX = 0; nX < size; nX++) {
+ Favorite item = (Favorite) in.readObject();
+ // add the favorite to the favorites list
+ list.add(item);
+ }
+ in.close();
+
+ sort(lastSel);
+ }
+
+ /**
+ * Remove some bugs from the favorites list
+ *
+ * @param indicesToRemove
+ * An array of the indicies of the bugs to be removed
+ */
+ public void remove(List<Favorite> sel) {
+ list.removeAll(sel);
+
+ // rewrite the file so that the data is persistant
+ writeFile();
+ }
+
+ /**
+ * Remove all of the items in the favortes menu
+ */
+ public void removeAll() {
+ list.clear();
+
+ // rewrite the file so that the data is persistant
+ writeFile();
+ }
+
+ /**
+ * Function to sort the favorites list
+ *
+ * @param sortOrder
+ * The way to sort the bugs in the favorites list
+ */
+ public void sort(int sortOrder) {
+ Favorite[] a = list.toArray(new Favorite[list.size()]);
+
+ // decide which sorting method to use and sort the favorites
+ switch (sortOrder) {
+ case ID_SORT:
+ Arrays.sort(a, new SortID());
+ lastSel = ID_SORT;
+ break;
+ case PRIORITY_SORT:
+ Arrays.sort(a, new SortPriority());
+ lastSel = PRIORITY_SORT;
+ break;
+
+ case SEVERITY_SORT:
+ Arrays.sort(a, new SortSeverity());
+ lastSel = SEVERITY_SORT;
+ break;
+
+ case STATE_SORT:
+ Arrays.sort(a, new SortState());
+ lastSel = STATE_SORT;
+ break;
+ }
+
+ // remove all of the elements from the list so that we can re-add
+ // them in a sorted order
+ list.clear();
+
+ // add the sorted elements to the list and the table
+ for (int j = 0; j < a.length; j++) {
+ add(a[j]);
+ }
+ }
+
+ /**
+ * Inner class to sort by bug id
+ */
+ private class SortID implements Comparator<Favorite> {
+ /**
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Favorite f1, Favorite f2) {
+ Integer id1 = (Integer) f1.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_ID);
+ Integer id2 = (Integer) f2.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_ID);
+
+ if (id1 != null && id2 != null)
+ return id1.compareTo(id2);
+ else if (id1 == null && id2 != null)
+ return -1;
+ else if (id1 != null && id2 == null)
+ return 1;
+ else
+ return 0;
+ }
+ }
+
+ /**
+ * Inner class to sort by priority
+ */
+ private class SortPriority implements Comparator<Favorite> {
+ /*
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Favorite f1, Favorite f2) {
+ Integer pri1 = (Integer) f1.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_PRIORITY);
+ Integer pri2 = (Integer) f2.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_PRIORITY);
+
+ if (pri1 != null && pri2 != null)
+ return pri1.compareTo(pri2);
+ else if (pri1 == null && pri2 != null)
+ return -1;
+ else if (pri1 != null && pri2 == null)
+ return 1;
+ else
+ return 0;
+ }
+ }
+
+ /**
+ * Inner class to sort by severity
+ */
+ private class SortSeverity implements Comparator<Favorite> {
+ /*
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Favorite f1, Favorite f2) {
+ Integer sev1 = (Integer) f1.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_SEVERITY);
+ Integer sev2 = (Integer) f2.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_SEVERITY);
+
+ if (sev1 != null && sev2 != null)
+ return sev1.compareTo(sev2);
+ else if (sev1 == null && sev2 != null)
+ return -1;
+ else if (sev1 != null && sev2 == null)
+ return 1;
+ else
+ return 0;
+ }
+ }
+
+ /**
+ * Inner class to sort by state
+ */
+ private class SortState implements Comparator<Favorite> {
+ /*
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Favorite f1, Favorite f2) {
+ Integer sta1 = (Integer) f1.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_STATE);
+ Integer sta2 = (Integer) f2.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_STATE);
+
+ if (sta1 != null && sta2 != null) {
+ int rc = sta1.compareTo(sta2);
+ if (rc == 0) {
+ Integer res1 = (Integer) f1.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_RESULT);
+ Integer res2 = (Integer) f2.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_RESULT);
+
+ return res1.compareTo(res2);
+ } else
+ return rc;
+ } else if (sta1 == null && sta2 != null)
+ return -1;
+ else if (sta1 != null && sta2 == null)
+ return 1;
+ else
+ return 0;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/FavoritesView.java b/org.eclipse.mylyn/developer/src-old/bugzilla/FavoritesView.java
new file mode 100644
index 0000000..f4fa1a5
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/FavoritesView.java
@@ -0,0 +1,574 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.Favorite;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.FavoritesFile;
+import org.eclipse.mylyn.internal.bugzilla.ui.actions.AbstractFavoritesAction;
+import org.eclipse.mylyn.internal.bugzilla.ui.actions.DeleteFavoriteAction;
+import org.eclipse.mylyn.internal.bugzilla.ui.actions.ViewFavoriteAction;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * A view that shows any bug marked as favorites.
+ */
+public class FavoritesView extends ViewPart {
+
+ private static Composite savedParent;
+
+ private IMemento savedMemento;
+
+ private static DeleteFavoriteAction remove;
+
+ public static DeleteFavoriteAction removeAll;
+
+ public static SelectAllAction selectAll;
+
+ private static ViewFavoriteAction open;
+
+ private Table table;
+
+ private MenuManager contextMenu;
+
+ private static TableViewer viewer;
+
+ private String[] columnHeaders = { "Bug", "Query", "Date" };
+
+ private ColumnLayoutData columnLayouts[] = { new ColumnWeightData(10), new ColumnWeightData(3),
+ new ColumnWeightData(5) };
+
+ /**
+ * Constructor initializes favorites' source file initializes actions
+ */
+ public FavoritesView() {
+ super();
+ open = new ViewFavoriteAction(this);
+ selectAll = new SelectAllAction();
+ remove = new DeleteFavoriteAction(this, false);
+ removeAll = new DeleteFavoriteAction(this, true);
+ }
+
+ @Override
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ }
+
+ /**
+ * Initializes this view with the given view site. A memento is passed to
+ * the view which contains a snapshot of the views state from a previous
+ * session.
+ */
+ @Override
+ public void init(IViewSite site, IMemento memento) throws PartInitException {
+ init(site);
+ this.savedMemento = memento;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ FavoritesView.savedParent = parent;
+ setPartName("Bugzilla Favorites");
+ createTable();
+
+ viewer = new TableViewer(table);
+ viewer.setUseHashlookup(true);
+ createColumns();
+
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.verticalSpan = 20;
+ viewer.getTable().setLayoutData(gd);
+
+ viewer.setContentProvider(new FavoritesViewContentProvider(this));
+ viewer.setLabelProvider(new FavoritesViewLabelProvider());
+ viewer.setInput(BugzillaPlugin.getDefault().getFavorites().elements());
+
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ FavoritesView.this.widgetSelected(event);
+ }
+ });
+
+ fillToolbar();
+ createContextMenu();
+
+ Menu menu = contextMenu.createContextMenu(table);
+ table.setMenu(menu);
+
+ hookGlobalActions();
+ parent.layout();
+
+ // Restore state from the previous session.
+ restoreState();
+ }
+
+ @Override
+ public void setFocus() {
+ // don't need to do anything when the focus is set
+ }
+
+ private void createColumns() {
+ TableLayout layout = new TableLayout();
+ table.setLayout(layout);
+ table.setHeaderVisible(true);
+
+ for (int i = 0; i < columnHeaders.length; i++) {
+ TableColumn tc = new TableColumn(table, SWT.NONE, i);
+
+ tc.setText(columnHeaders[i]);
+ tc.pack();
+ tc.setResizable(columnLayouts[i].resizable);
+ layout.addColumnData(columnLayouts[i]);
+ }
+ }
+
+ private void createTable() {
+
+ table = new Table(savedParent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
+ table.setLinesVisible(true);
+
+ // Add action support for a double-click
+ table.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ open.run();
+ }
+ });
+ }
+
+ private void fillToolbar() {
+ IActionBars actionBars = getViewSite().getActionBars();
+ IToolBarManager toolbar = actionBars.getToolBarManager();
+
+ remove.setEnabled(false);
+ toolbar.add(remove);
+ toolbar.add(removeAll);
+ toolbar.add(new Separator());
+ toolbar.add(selectAll);
+
+ // create actions to handle the sorting of the favorites
+ sortByIDAction = new SortByAction(FavoritesFile.ID_SORT);
+ sortByIDAction.setText("by &Bug ID");
+ sortByIDAction.setToolTipText("Sorts by bug number");
+
+ sortByPriorityAction = new SortByAction(FavoritesFile.PRIORITY_SORT);
+ sortByPriorityAction.setText("by &Priority");
+ sortByPriorityAction.setToolTipText("Sorts by riority of the bug");
+
+ sortBySeverityAction = new SortByAction(FavoritesFile.SEVERITY_SORT);
+ sortBySeverityAction.setText("by &Severity");
+ sortBySeverityAction.setToolTipText("Sorts by severity of the bug");
+
+ sortByStatusAction = new SortByAction(FavoritesFile.STATE_SORT);
+ sortByStatusAction.setText("by S&tatus");
+ sortByStatusAction.setToolTipText("Sorts by status of the bug");
+
+ // get the menu manager and create a submenu to contain sorting
+ IMenuManager menu = actionBars.getMenuManager();
+ IMenuManager submenu = new MenuManager("&Sort");
+
+ // add the sorting actions to the menu bar
+ menu.add(submenu);
+ submenu.add(sortByIDAction);
+ submenu.add(sortBySeverityAction);
+ submenu.add(sortByPriorityAction);
+ submenu.add(sortByStatusAction);
+
+ updateSortingState();
+ }
+
+ /**
+ * Function to make sure that the appropriate sort is checked
+ */
+ void updateSortingState() {
+ int curCriterion = FavoritesFile.lastSel;
+
+ sortByIDAction.setChecked(curCriterion == FavoritesFile.ID_SORT);
+ sortBySeverityAction.setChecked(curCriterion == FavoritesFile.SEVERITY_SORT);
+ sortByPriorityAction.setChecked(curCriterion == FavoritesFile.PRIORITY_SORT);
+ sortByStatusAction.setChecked(curCriterion == FavoritesFile.STATE_SORT);
+ viewer.setInput(viewer.getInput());
+ }
+
+ // Sorting actions for the favorites view
+ SortByAction sortByIDAction, sortBySeverityAction, sortByPriorityAction, sortByStatusAction;
+
+ /**
+ * Inner class to handle sorting
+ *
+ * @author Shawn Minto
+ */
+ class SortByAction extends Action {
+ /** The criteria to sort the favorites menu based on */
+ private int criterion;
+
+ /**
+ * Constructor
+ *
+ * @param criteria
+ * The criteria to sort the favorites menu based on
+ */
+ public SortByAction(int criteria) {
+ this.criterion = criteria;
+ }
+
+ /**
+ * Perform the sort
+ */
+ @Override
+ public void run() {
+ BugzillaPlugin.getDefault().getFavorites().sort(criterion);
+ updateSortingState();
+ }
+ }
+
+ /**
+ * Create context menu.
+ */
+ private void createContextMenu() {
+ contextMenu = new MenuManager("#FavoritesView");
+ contextMenu.setRemoveAllWhenShown(true);
+ contextMenu.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ fillContextMenu(manager);
+ updateActionEnablement();
+ }
+ });
+
+ // Register menu for extension.
+ getSite().registerContextMenu("#FavoritesView", contextMenu, viewer);
+ }
+
+ /**
+ * Hook global actions
+ */
+ private void hookGlobalActions() {
+ IActionBars bars = getViewSite().getActionBars();
+ bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAll);
+ bars.setGlobalActionHandler(ActionFactory.DELETE.getId(), remove);
+ table.addKeyListener(new KeyAdapter() {
+
+ @Override
+ public void keyPressed(KeyEvent event) {
+ if (event.character == SWT.DEL && event.stateMask == 0 && remove.isEnabled()) {
+ remove.run();
+ }
+ }
+ });
+ }
+
+ /**
+ * Populate context menu
+ */
+ private void fillContextMenu(IMenuManager mgr) {
+ mgr.add(open);
+ mgr.add(new Separator());
+ mgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
+ mgr.add(new Separator());
+ mgr.add(remove);
+ mgr.add(new DeleteFavoriteAction(this, true));
+ mgr.add(new SelectAllAction());
+ }
+
+ /**
+ * Update action enablement depending on whether or not any items are
+ * selected. Displays name of current item in status bar.
+ */
+ public static void updateActionEnablement() {
+
+ boolean hasSelected = viewer.getTable().getSelectionCount() > 0;
+ remove.setEnabled(hasSelected);
+ open.setEnabled(hasSelected);
+
+ boolean hasItems = viewer.getTable().getItemCount() > 0;
+ removeAll.setEnabled(hasItems);
+ selectAll.setEnabled(hasItems);
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ TableItem[] sel = table.getSelection();
+ if (sel.length == 0)
+ return;
+ memento = memento.createChild("selection");
+ for (int i = 0; i < sel.length; i++) {
+ memento.createChild("descriptor", new Integer(table.indexOf(sel[i])).toString());
+ }
+ }
+
+ private void restoreState() {
+ if (savedMemento == null)
+ return;
+ savedMemento = savedMemento.getChild("selection");
+ if (savedMemento != null) {
+ IMemento descriptors[] = savedMemento.getChildren("descriptor");
+ if (descriptors.length > 0) {
+ int[] objList = new int[descriptors.length];
+ for (int nX = 0; nX < descriptors.length; nX++) {
+ String id = descriptors[nX].getID();
+ objList[nX] = BugzillaPlugin.getDefault().getFavorites().find(Integer.valueOf(id).intValue());
+ }
+ table.setSelection(objList);
+ }
+ }
+ viewer.setSelection(viewer.getSelection(), true);
+ savedMemento = null;
+ updateActionEnablement();
+ }
+
+ /**
+ * Returns list of names of selected items.
+ */
+ public List<BugzillaOpenStructure> getBugIdsOfSelected() {
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();// TableItem[]
+ // sel
+ // =
+ // table.getSelection();
+ List<?> sel = selection.toList();
+ List<BugzillaOpenStructure> Ids = new ArrayList<BugzillaOpenStructure>();
+
+ Iterator<?> itr = sel.iterator();
+ while (itr.hasNext()) {
+ Object o = itr.next();
+ if (o instanceof Favorite) {
+ Favorite entry = (Favorite) o;
+ Integer id = (Integer) entry.getAttributes().get(IBugzillaConstants.HIT_MARKER_ATTR_ID);
+ Ids.add(new BugzillaOpenStructure(entry.getServer(), id, -1));
+ }
+ }
+
+ return Ids;
+ }
+
+ /**
+ * Calls remove function in FavoritesFile
+ */
+ @SuppressWarnings("unchecked")
+ public void deleteSelectedFavorites() {
+ List<Favorite> selection = ((IStructuredSelection) viewer.getSelection()).toList();
+ BugzillaPlugin.getDefault().getFavorites().remove(selection);
+ viewer.setInput(viewer.getInput());
+ }
+
+ /**
+ * Removes all of the favorites in the FavoritesFile.
+ */
+ public void deleteAllFavorites() {
+ BugzillaPlugin.getDefault().getFavorites().removeAll();
+ viewer.setInput(viewer.getInput());
+ }
+
+ /**
+ * Refreshes the view.
+ */
+ public static void add() {
+ if (viewer != null)
+ viewer.setInput(viewer.getInput());
+ }
+
+ /**
+ * @see SelectionListener#widgetSelected(SelectionEvent)
+ */
+ @SuppressWarnings("unchecked")
+ public void widgetSelected(SelectionChangedEvent e) {
+
+ IStructuredSelection selection = (IStructuredSelection) e.getSelection();
+
+ boolean enable = selection.size() > 0;
+ selectAll.setEnabled(enable);
+ remove.setEnabled(enable);
+ open.setEnabled(enable);
+
+ IStructuredSelection viewerSelection = (IStructuredSelection) viewer.getSelection();// TableItem[]
+ // sel
+ // =
+ // table.getSelection();
+ List<Favorite> sel = viewerSelection.toList();
+ if (sel.size() > 0) {
+ IStatusLineManager manager = this.getViewSite().getActionBars().getStatusLineManager();
+ manager.setMessage(sel.get(0).toString());// table.getItem(selected).getText(0));
+ }
+
+ updateActionEnablement();
+ }
+
+ /**
+ * Attempts to display this view on the workbench.
+ */
+ public static void checkWindow() {
+ if (savedParent == null || savedParent.isDisposed()) {
+ IWorkbenchWindow w = BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+ if (w != null) {
+ IWorkbenchPage page = w.getActivePage();
+ if (page != null) {
+ try {
+ page.showView(IBugzillaConstants.PLUGIN_ID + ".ui.favoritesView");
+ } catch (PartInitException pie) {
+ BugzillaPlugin.log(pie.getStatus());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Action class - "Select All"
+ */
+ public class SelectAllAction extends AbstractFavoritesAction {
+
+ public SelectAllAction() {
+ setToolTipText("Select all favorites");
+ setText("Select all");
+ setImageDescriptor(BugzillaImages.SELECT_ALL);
+ }
+
+ @Override
+ public void run() {
+ checkWindow();
+ table.selectAll();
+ viewer.setSelection(viewer.getSelection(), true);
+ updateActionEnablement();
+ }
+ }
+
+ private class FavoritesViewLabelProvider extends LabelProvider implements ITableLabelProvider {
+
+ /**
+ * Returns the label text for the given column of a recommendation in
+ * the table.
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof Favorite) {
+ Favorite f = (Favorite) element;
+ switch (columnIndex) {
+ case 0:
+ return f.toString();
+ case 1:
+ return f.getQuery();
+ case 2:
+ return f.getDate().toString();
+ default:
+ return "Undefined column text";
+ }
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ /*
+ * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
+ * int)
+ */
+ public Image getColumnImage(Object arg0, int arg1) {
+ return null;
+ }
+ }
+
+ public void refresh() {
+ // don't need to do anything to refresh
+ }
+
+ private class FavoritesViewContentProvider implements IStructuredContentProvider {
+
+ private List results;
+
+ /**
+ * The constructor.
+ */
+ public FavoritesViewContentProvider(FavoritesView taskList) {
+ // no setup to do
+ }
+
+ /**
+ * Returns the elements to display in the viewer when its input is set
+ * to the given element. These elements can be presented as rows in a
+ * table, items in a list, etc. The result is not modified by the
+ * viewer.
+ *
+ * @param inputElement
+ * the input element
+ * @return the array of elements to display in the viewer
+ */
+ public Object[] getElements(Object inputElement) {
+ if (results != null) {
+ return results.toArray();
+ } else
+ return null;
+ }
+
+ /**
+ * Notifies this content provider that a given viewer's input has been
+ * changed.
+ */
+ public void inputChanged(Viewer viewerChanged, Object oldInput, Object newInput) {
+ this.results = (List) newInput;
+
+ if (viewerChanged.getInput() != null) {
+ viewerChanged.getControl().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ FavoritesView.this.refresh();
+ }
+ });
+ }
+ }
+
+ public void dispose() {
+ if (results != null)
+ results = null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/GetQueryDialog.java b/org.eclipse.mylyn/developer/src-old/bugzilla/GetQueryDialog.java
new file mode 100644
index 0000000..456185b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/GetQueryDialog.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Dialog to display, manage and run stored queries.
+ */
+public class GetQueryDialog extends Dialog {
+
+ /** The Ok button. */
+ private Button okButton;
+
+ /** The title of the dialog. */
+ private String title;
+
+ private SavedQueryFile input;
+
+ public GetQueryDialog(Shell parentShell, String dialogTitle, SavedQueryFile in) {
+ super(parentShell);
+ this.title = dialogTitle;
+ input = in;
+ setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(title);
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ // create OK and Details buttons
+ okButton = createButton(parent, IDialogConstants.OK_ID, "Run", true);
+ okButton.setEnabled(false);
+ createButton(parent, IDialogConstants.CANCEL_ID, "Close", false);
+ }
+
+ /**
+ * Creates the list widget to display stored queries.
+ */
+ @Override
+ final protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+
+ createMainDialogArea(composite);
+
+ return composite;
+ }
+
+ protected void createMainDialogArea(Composite parent) {
+ Label label = new Label(parent, SWT.LEFT);
+ label.setText("Select a saved query:");
+ rememberPattern = new List(parent, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
+ ArrayList<String> names = input.getNames();
+ int pos = 0;
+
+ for (Iterator<String> it = names.iterator(); it.hasNext();) {
+ rememberPattern.add(it.next(), pos);
+ pos++;
+ }
+
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ gd.horizontalSpan = 5;
+ gd.heightHint = 60;
+
+ rememberPattern.setLayoutData(gd);
+ rememberPattern.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ selIndex = rememberPattern.getSelectionIndex();
+ okButton.setEnabled(selIndex >= 0);
+ }
+ });
+ rememberPattern.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ okPressed();
+ }
+ });
+
+ // Configure the context menu
+ MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
+ menuMgr.add(new RunQueryAction("&Run query"));
+ menuMgr.add(new Separator());
+ menuMgr.add(new RemoveAction("Remo&ve"));
+ menuMgr.add(new RemoveAllAction("Remove &all"));
+ Menu menu = menuMgr.createContextMenu(rememberPattern);
+ rememberPattern.setMenu(menu);
+
+ }
+
+ final protected void setPageComplete(boolean complete) {
+ if (okButton != null) {
+ okButton.setEnabled(complete);
+ }
+ }
+
+ private String queryNameText;
+
+ private List rememberPattern;
+
+ public String getText() {
+ return queryNameText;
+ }
+
+ /**
+ * Deletes a selected named query.
+ */
+ private void remove() {
+ int index = rememberPattern.getSelectionIndex();
+ if (index != -1)
+ BugzillaSearchPage.getInput().remove(new int[] { index });
+ rememberPattern.remove(index);
+ rememberPattern.setSelection(-1);
+ selIndex = -1;
+ okButton.setEnabled(false);
+ }
+
+ private void removeAll() {
+ BugzillaSearchPage.getInput().removeAll();
+ rememberPattern.removeAll();
+ rememberPattern.setSelection(-1);
+ selIndex = -1;
+ okButton.setEnabled(false);
+ }
+
+ /** Index of the selected query, or -1 if none. */
+ int selIndex = -1;
+
+ /**
+ * Returns index of the selected query or -1 if none are selected.
+ */
+ public int getSelected() {
+ return selIndex;
+ }
+
+ private class RunQueryAction extends Action {
+ RunQueryAction(String text) {
+ super(text);
+ }
+
+ @Override
+ public void run() {
+ GetQueryDialog.this.okPressed();
+ }
+ }
+
+ private class RemoveAction extends Action {
+ RemoveAction(String text) {
+ super(text);
+ }
+
+ @Override
+ public void run() {
+ GetQueryDialog.this.remove();
+ }
+ }
+
+ private class RemoveAllAction extends Action {
+ RemoveAllAction(String text) {
+ super(text);
+ }
+
+ @Override
+ public void run() {
+ GetQueryDialog.this.removeAll();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/IBugzillaSearchResultCollector.java b/org.eclipse.mylyn/developer/src-old/bugzilla/IBugzillaSearchResultCollector.java
new file mode 100644
index 0000000..358a974
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/IBugzillaSearchResultCollector.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Interface for the bugzilla search result collector.
+ *
+ * @author Shawn Minto
+ */
+interface IBugzillaSearchResultCollector {
+
+ /**
+ * Called before the actual search starts
+ *
+ * @param startCount -
+ * The starting count for the number of matches
+ * @throws CoreException
+ */
+ public void aboutToStart(int startCount) throws CoreException;
+
+ /**
+ * Accept a search hit and add it as a match and set the markers
+ *
+ * @param hit
+ * The search hit that was a match
+ * @throws CoreException
+ */
+ public void accept(BugzillaSearchHit hit) throws CoreException;
+
+ /**
+ * Called when the search has ended.
+ */
+ public void done();
+
+ /**
+ * Get the progress monitor for the search
+ *
+ * @return The progress monitor
+ */
+ public IProgressMonitor getProgressMonitor();
+
+ /**
+ * Set the progress monitor
+ *
+ * @param monitor
+ * The progress monitor the search should use
+ */
+ public void setProgressMonitor(IProgressMonitor monitor);
+
+ /**
+ * Set the current search operation
+ *
+ * @param operation
+ * The operation to set the search to
+ */
+ public void setOperation(IBugzillaSearchOperation operation);
+
+ /**
+ * Get the current operation
+ *
+ * @return The current search operation
+ */
+ public IBugzillaSearchOperation getOperation();
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/KeywordParser.java b/org.eclipse.mylyn/developer/src-old/bugzilla/KeywordParser.java
new file mode 100644
index 0000000..6dd6446
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/KeywordParser.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.mylyn.tasks.core.web.HtmlStreamTokenizer;
+import org.eclipse.mylyn.tasks.core.web.HtmlTag;
+import org.eclipse.mylyn.tasks.core.web.HtmlStreamTokenizer.Token;
+
+/**
+ * Parses Bugzilla keywords page to determine keywords valid in this
+ * installation
+ *
+ * @author Shawn Minto
+ */
+public class KeywordParser {
+ /** Tokenizer used on the stream */
+ private static HtmlStreamTokenizer tokenizer;
+
+ /**
+ * Constructor.
+ *
+ * @param in
+ * The input stream for the keywords page.
+ */
+ public KeywordParser(Reader in) {
+ tokenizer = new HtmlStreamTokenizer(in, null);
+ }
+
+ public String getEncoding() {
+ return "";
+ }
+
+ /**
+ * Parse the keyword page for the valid products that a bug can be logged
+ * for
+ *
+ * @return A list of the keywordds that we can enter bugs for
+ * @throws IOException
+ * @throws ParseException
+ */
+ public List<String> getKeywords() throws IOException, ParseException, LoginException {
+ ArrayList<String> keywords = new ArrayList<String>();
+
+ boolean isTitle = false;
+ boolean possibleBadLogin = false;
+ String title = "";
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+
+ // make sure that bugzilla doesn't want us to login
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data from inside of the title tag
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " ";
+ continue;
+ } else if (token.getType() == Token.TAG
+ && ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+ // check if we may have a problem with login by looking at
+ // the title of the page
+ if ((title.indexOf("login") != -1
+ || (title.indexOf("invalid") != -1 && title.indexOf("password") != -1)
+ || title.indexOf("check e-mail") != -1 || title.indexOf("error") != -1))
+ possibleBadLogin = true;
+ isTitle = false;
+ title = "";
+ }
+ continue;
+ }
+
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TR && !tag.isEndTag()) {
+ token = tokenizer.nextToken();
+ if (token.getType() != Token.EOF && token.getType() == Token.TAG) {
+ tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() != HtmlTag.Type.TH)
+ continue;
+ else {
+ if (tag.getAttribute("align") == null
+ || !"left".equalsIgnoreCase(tag.getAttribute("align")))
+ parseKeywords(keywords);
+
+ }
+ }
+ continue;
+ }
+ }
+ }
+
+ // if we don't have any keywords and suspect that there was a login
+ // problem, assume we had a login problem
+ if (keywords == null && possibleBadLogin)
+ throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE);
+ return keywords;
+ }
+
+ /**
+ * Parse the keywords that we can enter bugs for
+ *
+ * @param keywords
+ * The list of keywords to add this new product to
+ * @return
+ */
+ private void parseKeywords(List<String> keywords) throws IOException, ParseException {
+ StringBuffer sb = new StringBuffer();
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TH
+ && (tag.isEndTag() || !"left".equalsIgnoreCase(tag.getAttribute("align"))))
+ break;
+ } else if (token.getType() == Token.TEXT)
+ sb.append(token.toString());
+ }
+
+ String prod = HtmlStreamTokenizer.unescape(sb).toString();
+ if (prod.endsWith(":"))
+ prod = prod.substring(0, prod.length() - 1);
+ keywords.add(prod);
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TR && tag.isEndTag())
+ break;
+
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugParser.java b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugParser.java
new file mode 100644
index 0000000..68ff456
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugParser.java
@@ -0,0 +1,427 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core.internal;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.text.ParseException;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.mylyn.bugzilla.core.AbstractRepositoryReportAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugzillaReport;
+import org.eclipse.mylyn.internal.bugzilla.core.internal.HtmlStreamTokenizer.Token;
+
+/**
+ * @author Shawn Minto
+ *
+ * This class parses the valid attribute values for a new bug
+ */
+class NewBugParser {
+ /** Tokenizer used on the stream */
+ private HtmlStreamTokenizer tokenizer;
+
+ /** Flag for whether we need to try to get the product or not */
+ private static boolean getProd = false;
+
+ public NewBugParser(Reader in) {
+ tokenizer = new HtmlStreamTokenizer(in, null);
+ }
+
+ /**
+ * Parse the new bugs valid attributes
+ *
+ * @param nbm
+ * A reference to a NewBugModel where all of the information is
+ * stored
+ * @throws IOException
+ * @throws ParseException
+ * @throws LoginException
+ */
+ public void parseBugAttributes(NewBugzillaReport nbm, boolean retrieveProducts) throws IOException, ParseException,
+ LoginException {
+ nbm.attributes.clear(); // clear any attriubtes in bug model from a
+ // previous product
+
+ NewBugParser.getProd = retrieveProducts;
+
+ // create a new bug report and set the parser state to the start state
+ ParserState state = ParserState.START;
+ String attribute = null;
+
+ boolean isTitle = false;
+ boolean possibleBadLogin = false;
+ boolean isErrorState = false;
+ String title = "";
+ // Default error message
+ String errorMsg = "Bugzilla could not get the needed bug attribute since your login name or password is incorrect. Please check your settings in the bugzilla preferences.";
+
+ for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
+ // make sure that bugzilla doesn't want us to login
+ if (token.getType() == Token.TAG && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.TITLE
+ && !((HtmlTag) (token.getValue())).isEndTag()) {
+ isTitle = true;
+ continue;
+ }
+
+ if (isTitle) {
+ // get all of the data in the title tag to compare with
+ if (token.getType() != Token.TAG) {
+ title += ((StringBuffer) token.getValue()).toString().toLowerCase() + " ";
+ continue;
+ } else if (token.getType() == Token.TAG
+ && ((HtmlTag) token.getValue()).getTagType() == HtmlTag.Type.TITLE
+ && ((HtmlTag) token.getValue()).isEndTag()) {
+ // check if the title looks like we may have a problem with
+ // login
+ if (title.indexOf("login") != -1) {
+ possibleBadLogin = true; // generic / default msg
+ // passed to constructor re:
+ // bad login
+ }
+ if ((title.indexOf("invalid") != -1 && title.indexOf("password") != -1)
+ || title.indexOf("check e-mail") != -1 || title.indexOf("error") != -1) {
+ possibleBadLogin = true;
+ isErrorState = true; // set flag so appropriate msg
+ // is provide for the exception
+ errorMsg = ""; // error message will be parsed from
+ // error page
+ }
+
+ isTitle = false;
+ title = "";
+ }
+ continue;
+ }
+
+ // we have found the start of an attribute name
+ if ((state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD && "right".equalsIgnoreCase(tag.getAttribute("align"))) {
+ // parse the attribute's name
+ attribute = parseAttributeName();
+ if(attribute != null && attribute.contains(IBugzillaConstants.INVALID_2201_ATTRIBUTE_IGNORED)) {
+ continue;
+ }
+ if (attribute == null)
+ continue;
+ state = ParserState.ATT_VALUE;
+ continue;
+ }
+
+ if (tag.getTagType() == HtmlTag.Type.TD && "#ff0000".equalsIgnoreCase(tag.getAttribute("bgcolor"))) {
+ state = ParserState.ERROR;
+ continue;
+ }
+ }
+
+ // we have found the start of attribute values
+ if (state == ParserState.ATT_VALUE && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD) {
+ // parse the attribute values
+ parseAttributeValue(nbm, attribute);
+
+ state = ParserState.ATT_NAME;
+ attribute = null;
+ continue;
+ }
+ }
+ // page being parsed contains an Error message
+ // parse error message so it can be given to the constructor of the
+ // exception
+ // so an appropriate error message is displayed
+ if (state == ParserState.ERROR && isErrorState) {
+ // tag should be text token, not a tag
+ // get the error message
+ if (token.getType() == Token.TEXT) {
+ // get string value of next token to add to error messgage
+ // unescape the string so any escape sequences parsed appear
+ // unescaped in the details pane
+ errorMsg += HtmlStreamTokenizer.unescape(((StringBuffer) token.getValue()).toString()) + " ";
+ }
+ // expect </font> tag to indicate end of error end msg
+ // set next state to continue parsing remainder of page
+ else if (token.getType() == Token.TAG
+ && ((HtmlTag) (token.getValue())).getTagType() == HtmlTag.Type.FONT
+ && ((HtmlTag) (token.getValue())).isEndTag()) {
+ state = ParserState.ATT_NAME;
+ }
+ continue;
+ }
+
+ if ((state == ParserState.ATT_NAME || state == ParserState.START) && token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.INPUT && tag.getAttribute("type") != null
+ && "hidden".equalsIgnoreCase(tag.getAttribute("type").trim())) {
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(tag.getAttribute("name"));
+ a.setID(tag.getAttribute("name"));
+ a.setValue(tag.getAttribute("value"));
+ a.setHidden(true);
+ nbm.attributes.put(a.getName(), a);
+ continue;
+ }
+ }
+ }
+
+ if (possibleBadLogin && (nbm.getAttributes() == null || nbm.getAttributes().size() == 0)) {
+ throw new LoginException(errorMsg);
+ }
+ }
+
+ /**
+ * Parse the case where we have found an attribute name
+ *
+ * @param tokenizer
+ * The tokenizer to use to find the name
+ * @return The name of the attribute
+ * @throws IOException
+ * @throws ParseException
+ */
+ private String parseAttributeName() throws IOException, ParseException {
+ StringBuffer sb = new StringBuffer();
+
+ parseTableCell(sb);
+ HtmlStreamTokenizer.unescape(sb);
+ // remove the colon if there is one
+ if (sb.length() == 0)
+ return null;
+ if (sb.charAt(sb.length() - 1) == ':') {
+ sb.deleteCharAt(sb.length() - 1);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Reads text into a StringBuffer until it encounters a close table cell tag
+ * (</TD>) or start of another cell. The text is appended to the
+ * existing value of the buffer. <b>NOTE:</b> Does not handle nested cells!
+ *
+ * @param tokenizer
+ * @param sb
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parseTableCell(StringBuffer sb) throws IOException, ParseException {
+ boolean noWhitespace = false;
+ for (HtmlStreamTokenizer.Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer
+ .nextToken()) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.TD) {
+ if (!tag.isEndTag()) {
+ tokenizer.pushback(token);
+ }
+ break;
+ }
+ noWhitespace = token.getWhitespace().length() == 0;
+ } else if (token.getType() == Token.TEXT) {
+ // if there was no whitespace between the tag and the
+ // preceding text, don't insert whitespace before this text
+ // unless it is there in the source
+ if (!noWhitespace && token.getWhitespace().length() > 0 && sb.length() > 0) {
+ sb.append(' ');
+ }
+ sb.append((StringBuffer) token.getValue());
+ }
+ }
+ }
+
+ /**
+ * Parse the case where we have found attribute values
+ *
+ * @param nbm
+ * The NewBugModel that is to contain information about a new bug
+ * @param attributeName
+ * The name of the attribute that we are parsing
+ * @param tokenizer
+ * The tokenizer to use for parsing
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parseAttributeValue(NewBugzillaReport nbm, String attributeName) throws IOException, ParseException {
+
+ HtmlStreamTokenizer.Token token = tokenizer.nextToken();
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.SELECT && !tag.isEndTag()) {
+ String parameterName = tag.getAttribute("name");
+ parseSelect(nbm, attributeName, parameterName);
+ } else if (tag.getTagType() == HtmlTag.Type.INPUT && !tag.isEndTag()) {
+ parseInput(nbm, attributeName, tag);
+ } else if (!tag.isEndTag()) {
+ parseAttributeValueCell(nbm, attributeName);
+ }
+ } else {
+ StringBuffer sb = new StringBuffer();
+ if (token.getType() == Token.TEXT) {
+ sb.append((StringBuffer) token.getValue());
+ parseAttributeValueCell(nbm, attributeName, sb);
+ }
+ }
+ }
+
+ /**
+ * Parse the case where the attribute value is just text in a table cell
+ *
+ * @param attributeName
+ * The name of the attribute we are parsing
+ * @param tokenizer
+ * The tokenizer to use for parsing
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parseAttributeValueCell(NewBugzillaReport nbm, String attributeName) throws IOException, ParseException {
+ StringBuffer sb = new StringBuffer();
+
+ parseAttributeValueCell(nbm, attributeName, sb);
+ }
+
+ private void parseAttributeValueCell(NewBugzillaReport nbm, String attributeName, StringBuffer sb) throws IOException,
+ ParseException {
+
+ parseTableCell(sb);
+ HtmlStreamTokenizer.unescape(sb);
+
+ // if we need the product we will get it
+ if (getProd && attributeName.equalsIgnoreCase("product")) {
+ nbm.setProduct(sb.toString());
+ }
+ }
+
+ /**
+ * Parse the case where the attribute value is an input
+ *
+ * @param nbm
+ * The new bug model to add information that we get to
+ * @param attributeName
+ * The name of the attribute that we are parsing
+ * @param tag
+ * The HTML tag that we are currently on
+ * @throws IOException
+ */
+ private static void parseInput(NewBugzillaReport nbm, String attributeName, HtmlTag tag) throws IOException {
+
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(attributeName);
+ a.setID(tag.getAttribute("name"));
+ String value = tag.getAttribute("value");
+ if (value == null)
+ value = "";
+
+ // if we found the summary, add it to the bug report
+ if (attributeName.equalsIgnoreCase("summary")) {
+ nbm.setSummary(value);
+ } else if (attributeName.equalsIgnoreCase("Attachments")) {
+ // do nothing - not a problem after 2.14
+ } else if (attributeName.equalsIgnoreCase("add cc")) {
+ // do nothing
+ } else if (attributeName.toLowerCase().startsWith("cc")) {
+ // do nothing cc's are options not inputs
+ } else {
+ // otherwise just add the attribute
+ a.setValue(value);
+ nbm.attributes.put(attributeName, a);
+ }
+ }
+
+ /**
+ * Parse the case where the attribute value is an option
+ *
+ * @param nbm
+ * The NewBugModel that we are storing information in
+ * @param attributeName
+ * The name of the attribute that we are parsing
+ * @param parameterName
+ * The SELECT tag's name
+ * @param tokenizer
+ * The tokenizer that we are using for parsing
+ * @throws IOException
+ * @throws ParseException
+ */
+ private void parseSelect(NewBugzillaReport nbm, String attributeName, String parameterName) throws IOException,
+ ParseException {
+
+ boolean first = false;
+ AbstractRepositoryReportAttribute a = new AbstractRepositoryReportAttribute(attributeName);
+ a.setID(parameterName);
+
+ HtmlStreamTokenizer.Token token = tokenizer.nextToken();
+ while (token.getType() != Token.EOF) {
+ if (token.getType() == Token.TAG) {
+ HtmlTag tag = (HtmlTag) token.getValue();
+ if (tag.getTagType() == HtmlTag.Type.SELECT && tag.isEndTag())
+ break;
+ if (tag.getTagType() == HtmlTag.Type.OPTION && !tag.isEndTag()) {
+ String optionName = tag.getAttribute("value");
+ boolean selected = tag.hasAttribute("selected");
+ StringBuffer optionText = new StringBuffer();
+ for (token = tokenizer.nextToken(); token.getType() == Token.TEXT; token = tokenizer.nextToken()) {
+ if (optionText.length() > 0) {
+ optionText.append(' ');
+ }
+ optionText.append((StringBuffer) token.getValue());
+ }
+ a.addOptionValue(optionText.toString(), optionName);
+
+ if (selected || first) {
+ a.setValue(optionText.toString());
+ first = false;
+ }
+ } else {
+ token = tokenizer.nextToken();
+ }
+ } else {
+ token = tokenizer.nextToken();
+ }
+ }
+
+ if (!(nbm.attributes).containsKey(attributeName)) {
+ (nbm.attributes).put(attributeName, a);
+ }
+ }
+
+ /**
+ * Enum class for describing current state of Bugzilla report parser.
+ */
+ private static class ParserState {
+ /** An instance of the start state */
+ protected static final ParserState START = new ParserState("start");
+
+ /** An instance of the state when the parser found an attribute name */
+ protected static final ParserState ATT_NAME = new ParserState("att_name");
+
+ /** An instance of the state when the parser found an attribute value */
+ protected static final ParserState ATT_VALUE = new ParserState("att_value");
+
+ /** An instance of the state when an error page is found */
+ protected static final ParserState ERROR = new ParserState("error");
+
+ /** State's human-readable name */
+ private String name;
+
+ /**
+ * Constructor
+ *
+ * @param description -
+ * The states human readable name
+ */
+ private ParserState(String description) {
+ this.name = description;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugWizardTest.java b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugWizardTest.java
new file mode 100644
index 0000000..88506c4
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugWizardTest.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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
+ * Ian Bull - improvements
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.deprecated;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Mik Kersten
+ * @author Ian Bull
+ */
+public class NewBugWizardTest extends TestCase {
+
+ public void testPlatformOptions() throws Exception {
+
+ TaskRepository repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
+ IBugzillaConstants.TEST_BUGZILLA_220_URL);
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+
+ final TaskAttributeMapper attributeMapper = connector.getTaskDataHandler().getAttributeMapper(repository);
+
+ final TaskData taskData = new TaskData(attributeMapper, BugzillaCorePlugin.CONNECTOR_KIND,
+ repository.getRepositoryUrl(), "1");
+
+ assertNotNull(connector);
+ AbstractTaskDataHandler taskDataHandler = connector.getTaskDataHandler();
+ assertNotNull(taskDataHandler);
+
+ BugzillaCorePlugin.getDefault().setPlatformOptions(taskData);
+
+ String os = Platform.getOS();
+ if (os.equals("win32")) {
+ assertEquals("Windows", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ } else if (os.equals("solaris")) {
+ assertEquals("Solaris", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ } else if (os.equals("qnx")) {
+ assertEquals("QNX-Photon", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ } else if (os.equals("macosx")) {
+ assertEquals("Mac OS", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ } else if (os.equals("linux")) {
+ assertEquals("Linux", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ } else if (os.equals("hpux")) {
+ assertEquals("HP-UX", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ } else if (os.equals("aix")) {
+ assertEquals("AIX", taskData.getRoot().getAttribute(BugzillaAttribute.OP_SYS.getKey()).getValue());
+ }
+
+ String platform = Platform.getOSArch();
+ if (platform.equals("x86")) {
+ if (os.equals("macosx")) {
+ assertEquals("Macintosh", taskData.getRoot()
+ .getAttribute(BugzillaAttribute.REP_PLATFORM.getKey())
+ .getValue());
+ } else {
+ assertEquals("PC", taskData.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ }
+ } else if (platform.equals("x86_64")) {
+ assertEquals("PC", taskData.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ } else if (platform.equals("ia64")) {
+ assertEquals("PC", taskData.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ } else if (platform.equals("ia64_32")) {
+ assertEquals("PC", taskData.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ } else if (platform.equals("sparc")) {
+ assertEquals("Sun", taskData.getRoot().getAttribute(BugzillaAttribute.REP_PLATFORM.getKey()).getValue());
+ } else if (platform.equals("ppc")) {
+ if (os.equals("macosx")) {
+ assertEquals("Macintosh", taskData.getRoot()
+ .getAttribute(BugzillaAttribute.REP_PLATFORM.getKey())
+ .getValue());
+ } else {
+ assertEquals("Power", taskData.getRoot()
+ .getAttribute(BugzillaAttribute.REP_PLATFORM.getKey())
+ .getValue());
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugzillaTaskData.java b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugzillaTaskData.java
new file mode 100644
index 0000000..adcd24d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugzillaTaskData.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.Serializable;
+
+import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
+
+
+/**
+ * This class is used to store data about the new bug that is being created
+ * while the wizard is being used
+ *
+ * @author Eric Booth
+ * @author Rob Elves
+ */
+public class NewBugzillaTaskData extends RepositoryTaskData implements Serializable {
+
+ /** Automatically generated serialVersionUID */
+ private static final long serialVersionUID = 3977859587934335283L;
+
+ /** Whether the attributes have been parsed yet or not */
+ protected boolean hasParsedAttributes = false;
+
+ /** Whether the products have been parsed yet or not */
+ protected boolean hasParsedProducts = false;
+
+ /** The product that the bug is for */
+ protected String product;
+
+ /** The summary for the bug */
+ protected String summary = "";
+
+ /**
+ * Flag to indicate status of connection to Bugzilla server to identify
+ * whether ProductConfiguration should be used instead
+ */
+ protected boolean connected = true;
+
+ /** Whether or not this bug report is saved offline. */
+ protected boolean savedOffline = false;
+
+ /**
+ * Creates a new <code>NewBugModel</code>. The id chosen for this bug is
+ * based on the id of the last <code>NewBugModel</code> that was created.
+ */
+ public NewBugzillaTaskData(String repositoryURL, String offlineId) {
+ super(new BugzillaAttributeFactory(), BugzillaCorePlugin.REPOSITORY_KIND, repositoryURL, offlineId);
+ }
+
+ @Override
+ public String getLabel() {
+ return "<unsubmitted> "+ this.getRepositoryUrl();
+ }
+
+ @Override
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public void setDescription(String newDescription) {
+ description = newDescription;
+ }
+
+ @Override
+ public String getSummary() {
+ return summary;
+ }
+
+ @Override
+ public void setSummary(String newSummary) {
+ summary = newSummary;
+ }
+
+ /**
+ * @return The product that the bug is for.
+ */
+ @Override
+ public String getProduct() {
+ return product;
+ }
+
+ /**
+ * Sets the product that the bug is for.
+ *
+ * @param product
+ * The product.
+ */
+ public void setProduct(String product) {
+ this.product = product;
+ }
+
+ /**
+ * @return Flag to indicate status of connection to Bugzilla server (to
+ * identify whether ProductConfiguration should be used instead)
+ */
+ public boolean isConnected() {
+ return connected;
+ }
+
+ /**
+ * Sets the value of the flag to indicate status of connection to Bugzilla
+ * server (to identify whether ProductConfiguration should be used instead)
+ *
+ * @param newConnectionStatus
+ * <code>true</code> if the bug is connected.
+ */
+ public void setConnected(boolean newConnectionStatus) {
+ connected = newConnectionStatus;
+ }
+
+ /**
+ * @return Returns whether the attributes have been parsed yet or not.
+ */
+ public boolean hasParsedAttributes() {
+ return hasParsedAttributes;
+ }
+
+ /**
+ * Sets whether the attributes have been parsed yet or not.
+ *
+ * @param hasParsedAttributes
+ * <code>true</code> if the attributes have been parsed.
+ */
+ public void setParsedAttributesStatus(boolean hasParsedAttributes) {
+ this.hasParsedAttributes = hasParsedAttributes;
+ }
+
+ /**
+ * @return Returns whether the products have been parsed yet or not.
+ */
+ public boolean hasParsedProducts() {
+ return hasParsedProducts;
+ }
+
+ /**
+ * Sets whether the products have been parsed yet or not.
+ *
+ * @param hasParsedProducts
+ * <code>true</code> if the products have been parsed.
+ */
+ public void setParsedProductsStatus(boolean hasParsedProducts) {
+ this.hasParsedProducts = hasParsedProducts;
+ }
+
+ public boolean isSavedOffline() {
+ return savedOffline;
+ }
+
+ @Override
+ public boolean isNew() {
+ return true;
+ }
+
+// public void setOfflineState(boolean newOfflineState) {
+// savedOffline = newOfflineState;
+// }
+
+ @Override
+ public boolean hasLocalChanges() {
+ return true;
+ }
+
+ /** returns null */
+ @Override
+ public String getCreated() {
+ return null;
+ }
+
+ @Override
+ public String getLastModified() {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugzillaTaskEditor.java b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugzillaTaskEditor.java
new file mode 100644
index 0000000..e716927
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/NewBugzillaTaskEditor.java
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaAttribute;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractNewRepositoryTaskEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * An editor used to view a locally created bug that does not yet exist on a repository.
+ *
+ * @author Rob Elves
+ */
+public class NewBugzillaTaskEditor extends AbstractNewRepositoryTaskEditor {
+
+ protected Text assignedTo;
+
+ public NewBugzillaTaskEditor(FormEditor editor) {
+ super(editor);
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) {
+ super.init(site, input);
+
+ setExpandAttributeSection(true);
+ }
+
+ @Override
+ protected void saveTaskOffline(IProgressMonitor progressMonitor) {
+ String text = descriptionTextViewer.getTextWidget().getText();
+ if (repository.getVersion().startsWith("2.18")) {
+ text = BugzillaUiPlugin.formatTextToLineWrap(text, true);
+ descriptionTextViewer.getTextWidget().setText(text);
+ }
+ super.saveTaskOffline(progressMonitor);
+ }
+
+ @Override
+ protected void createPeopleLayout(Composite composite) {
+ FormToolkit toolkit = getManagedForm().getToolkit();
+ Section peopleSection = createSection(composite, getSectionLabel(SECTION_NAME.PEOPLE_SECTION));
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(peopleSection);
+ Composite peopleComposite = toolkit.createComposite(peopleSection);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginRight = 5;
+ peopleComposite.setLayout(layout);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(peopleComposite);
+
+ addAssignedTo(peopleComposite);
+ //addSelfToCC(peopleComposite);
+ addCCList(peopleComposite);
+ getManagedForm().getToolkit().paintBordersFor(peopleComposite);
+ peopleSection.setClient(peopleComposite);
+ peopleSection.setEnabled(true);
+ }
+
+ @Override
+ public void submitToRepository() {
+ if (summaryText.getText().equals("")) {
+ MessageDialog.openInformation(this.getSite().getShell(), "Submit Error",
+ "Please provide a brief summary with new reports.");
+ summaryText.setFocus();
+ return;
+ } else if (descriptionTextViewer.getTextWidget().getText().equals("")) {
+ MessageDialog.openInformation(this.getSite().getShell(), "Submit Error",
+ "Please proved a detailed description with new reports");
+ descriptionTextViewer.getTextWidget().setFocus();
+ return;
+ }
+ RepositoryTaskAttribute attribute = taskData.getAttribute(BugzillaAttribute.COMPONENT.getKey());
+ String componentValue = attribute.getValue();
+ if (componentValue.equals("")) {
+ MessageDialog.openInformation(this.getSite().getShell(), "Submit Error",
+ "Please select a component with new reports");
+ descriptionTextViewer.getTextWidget().setFocus();
+ return;
+ }
+ super.submitToRepository();
+ }
+
+ @Override
+ protected void createCustomAttributeLayout(Composite composite) {
+
+ RepositoryTaskAttribute attribute = this.taskData.getAttribute(BugzillaAttribute.DEPENDSON.getKey());
+ if (attribute != null && !attribute.isReadOnly()) {
+ Label label = createLabel(composite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Composite textFieldComposite = getManagedForm().getToolkit().createComposite(composite);
+ GridLayout textLayout = new GridLayout();
+ textLayout.marginWidth = 1;
+ textLayout.marginHeight = 3;
+ textLayout.verticalSpacing = 3;
+ textFieldComposite.setLayout(textLayout);
+ GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ textData.horizontalSpan = 1;
+ textData.widthHint = 135;
+
+ final Text text = createTextField(textFieldComposite, attribute, SWT.FLAT);
+ text.setLayoutData(textData);
+ getManagedForm().getToolkit().paintBordersFor(textFieldComposite);
+ }
+
+ attribute = this.taskData.getAttribute(BugzillaAttribute.BLOCKED.getKey());
+ if (attribute != null && !attribute.isReadOnly()) {
+ Label label = createLabel(composite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Composite textFieldComposite = getManagedForm().getToolkit().createComposite(composite);
+ GridLayout textLayout = new GridLayout();
+ textLayout.marginWidth = 1;
+ textLayout.marginHeight = 3;
+ textLayout.verticalSpacing = 3;
+ textFieldComposite.setLayout(textLayout);
+ GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ textData.horizontalSpan = 1;
+ textData.widthHint = 135;
+ final Text text = createTextField(textFieldComposite, attribute, SWT.FLAT);
+ text.setLayoutData(textData);
+ getManagedForm().getToolkit().paintBordersFor(textFieldComposite);
+ }
+ }
+
+ @Override
+ protected boolean hasContentAssist(RepositoryTaskAttribute attribute) {
+ return BugzillaAttribute.NEWCC.getKey().equals(attribute.getId());
+ }
+
+ /**
+ * FIXME: A lot of duplicated code here between this and BugzillaTaskEditor
+ */
+ @Override
+ protected void addAssignedTo(Composite peopleComposite) {
+ RepositoryTaskAttribute assignedAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED);
+ if (assignedAttribute != null) {
+ String bugzillaVersion;
+ try {
+ bugzillaVersion = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
+ new NullProgressMonitor()).getInstallVersion();
+ } catch (CoreException e1) {
+ // ignore
+ bugzillaVersion = "2.18";
+ }
+ if (bugzillaVersion.compareTo("3.1") < 0) {
+ // old bugzilla workflow is used
+ super.addAssignedTo(peopleComposite);
+ return;
+ }
+ Label label = createLabel(peopleComposite, assignedAttribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ if (assignedAttribute.isReadOnly()) {
+ assignedTo = createTextField(peopleComposite, assignedAttribute, SWT.FLAT | SWT.READ_ONLY);
+ } else {
+ assignedTo = createTextField(peopleComposite, assignedAttribute, SWT.FLAT);
+ }
+ GridDataFactory.fillDefaults().hint(150, SWT.DEFAULT).applyTo(assignedTo);
+ assignedTo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ String sel = assignedTo.getText();
+ RepositoryTaskAttribute a = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED);
+ if (!(a.getValue().equals(sel))) {
+ a.setValue(sel);
+ markDirty(true);
+ }
+ }
+ });
+ ContentAssistCommandAdapter adapter = applyContentAssist(assignedTo,
+ createContentProposalProvider(assignedAttribute));
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(assignedAttribute);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+
+ FormToolkit toolkit = getManagedForm().getToolkit();
+ Label dummylabel = toolkit.createLabel(peopleComposite, "");
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(dummylabel);
+ RepositoryTaskAttribute attribute = taskData.getAttribute(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ if (attribute == null) {
+ taskData.setAttributeValue(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey(), "0");
+ attribute = taskData.getAttribute(BugzillaAttribute.SET_DEFAULT_ASSIGNEE.getKey());
+ }
+ addButtonField(peopleComposite, attribute, SWT.CHECK);
+ }
+ }
+
+ private Button addButtonField(Composite rolesComposite, RepositoryTaskAttribute attribute, int style) {
+ if (attribute == null) {
+ return null;
+ }
+ String name = attribute.getName();
+ if (hasOutgoingChange(attribute)) {
+ name += "*";
+ }
+
+ final Button button = getManagedForm().getToolkit().createButton(rolesComposite, name, style);
+ if (!attribute.isReadOnly()) {
+ button.setData(attribute);
+ button.setSelection(attribute.getValue().equals("1"));
+ button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ button.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String sel = "1";
+ if (!button.getSelection()) {
+ sel = "0";
+ }
+ RepositoryTaskAttribute a = (RepositoryTaskAttribute) button.getData();
+ a.setValue(sel);
+ attributeChanged(a);
+ }
+ });
+ }
+ return button;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/OpenBugzillaReportJob.java b/org.eclipse.mylyn/developer/src-old/bugzilla/OpenBugzillaReportJob.java
new file mode 100644
index 0000000..dcec6bd
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/OpenBugzillaReportJob.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaOpenStructure;
+import org.eclipse.mylyn.internal.bugzilla.ui.ViewBugzillaAction;
+import org.eclipse.mylyn.internal.core.util.MylarStatusHandler;
+
+/**
+ * @author Mik Kersten
+ */
+public class OpenBugzillaReportJob implements IRunnableWithProgress {
+
+ private int id;
+
+ private String serverUrl;
+
+ public OpenBugzillaReportJob(String serverUrl, int id) {
+ this.id = id;
+ this.serverUrl = serverUrl;
+ }
+
+ public void run(IProgressMonitor monitor) {
+ try {
+ monitor.beginTask("Opening Bugzilla Report", 10);
+ List<BugzillaOpenStructure> list = new ArrayList<BugzillaOpenStructure>(1);
+ list.add(new BugzillaOpenStructure(serverUrl, id, -1));
+ new ViewBugzillaAction("Open Bug " + id, list).run(monitor);
+ monitor.done();
+ } catch (Exception e) {
+ MylarStatusHandler.fail(e, "Unable to open Bug report: " + id, true);
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/RegularExpressionMatchTest.java b/org.eclipse.mylyn/developer/src-old/bugzilla/RegularExpressionMatchTest.java
new file mode 100644
index 0000000..f756208
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/RegularExpressionMatchTest.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaQueryHit;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.sandbox.bridge.bugs.BugzillaSearchEngine;
+
+public class RegularExpressionMatchTest extends TestCase {
+
+ public void testMatchV218() throws IOException {
+ BufferedReader in = new BufferedReader(new StringReader(BUGZILLA_218));
+ BugzillaQueryHit hit = BugzillaSearchEngine.createHit(BugzillaSearchEngine.reValue, new NullProgressMonitor(),
+ in, IBugzillaConstants.ECLIPSE_BUGZILLA_URL, 123);
+ //assertEquals("nor", hit.getSeverity());
+ assertEquals("P2", hit.getPriority());
+ }
+
+ public void testMatchV220() throws IOException {
+ BufferedReader in = new BufferedReader(new StringReader(BUGZILLA_220));
+ BugzillaQueryHit hit = BugzillaSearchEngine.createHit(BugzillaSearchEngine.reValueBugzilla220,
+ new NullProgressMonitor(), in, IBugzillaConstants.ECLIPSE_BUGZILLA_URL, 123);
+ //assertEquals("nor", hit.getSeverity());
+ assertEquals("P2", hit.getPriority());
+ }
+
+ private static final String BUGZILLA_218 = " <tr class=\"bz_normal bz_P2 bz_ASSIGNED bz_even \">\n"
+ + " \n"
+ + "\n"
+ + " <td class=\"first-child\">\n"
+ + " <a href=\"show_bug.cgi?id=111870\">111870</a>\n"
+ + " <span style=\"display: none\"></span>\n"
+ + " </td>\n"
+ + "\n"
+ + " <td><nobr>nor</nobr>\n"
+ + " </td>\n"
+ + " <td><nobr>P2</nobr>\n"
+ + " </td>\n"
+ + " <td><nobr>Oth</nobr>\n"
+ + " </td>\n"
+ + " <td><nobr>wes.coelho@gmail.com</nobr>\n"
+ + " </td>\n"
+ + " <td><nobr>ASSI</nobr>\n"
+ + " </td>\n"
+ + " <td><nobr></nobr>\n"
+ + " </td>\n"
+ + " <td>hour estimates are wrong\n"
+ + " </td>\n" + "\n" + " </tr>\n";
+
+ private static final String BUGZILLA_220 = " <tr class=\"bz_enhancement bz_P2 bz_ASSIGNED bz_row_odd \">\n"
+ + " \n"
+ + "\n"
+ + " <td class=\"first-child\">\n"
+ + " <a href=\"show_bug.cgi?id=114172\">114172</a>\n"
+ + " <span style=\"display: none\"></span>\n"
+ + " </td>\n"
+ + "\n"
+ + " <td style=\"white-space: nowrap\">nor\n"
+ + " </td>\n"
+ + " <td style=\"white-space: nowrap\">P2\n"
+ + " </td>\n"
+ + " <td style=\"white-space: nowrap\">PC\n"
+ + " </td>\n"
+ + " <td style=\"white-space: nowrap\">wes.coelho@gmail.com\n"
+ + " </td>\n"
+ + " <td style=\"white-space: nowrap\">ASSI\n"
+ + " </td>\n"
+ + " <td style=\"white-space: nowrap\">\n"
+ + " </td>\n"
+ + " <td >Switch task data directory option on the task list\n" + " </td>\n" + "\n" + " </tr>\n";
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/RepositoryConfiguration.java b/org.eclipse.mylyn/developer/src-old/bugzilla/RepositoryConfiguration.java
new file mode 100644
index 0000000..99cd532
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/RepositoryConfiguration.java
@@ -0,0 +1,407 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.tasks.core.AbstractAttributeFactory;
+import org.eclipse.mylyn.tasks.core.AttributeContainer;
+
+/**
+ * Class describing the configuration of products and components for a given
+ * Bugzilla installation.
+ *
+ * @author Rob Elves
+ */
+public class CopyOfRepositoryConfiguration extends AttributeContainer implements Serializable {
+
+ /**
+ * Container for product information: name, components.
+ */
+ private static class ProductEntry implements Serializable {
+
+ private static final long serialVersionUID = 4120139521246741120L;
+
+ List<String> components = new ArrayList<String>();
+
+ List<String> milestones = new ArrayList<String>();
+
+ String productName;
+
+ List<String> versions = new ArrayList<String>();
+
+ ProductEntry(String name) {
+ this.productName = name;
+ }
+
+ void addComponent(String componentName) {
+ if (!components.contains(componentName)) {
+ components.add(componentName);
+ }
+ }
+
+ void addTargetMilestone(String target) {
+ milestones.add(target);
+ }
+
+ void addVersion(String name) {
+ if (!versions.contains(name)) {
+ versions.add(name);
+ }
+ }
+
+ List<String> getComponents() {
+ return components;
+ }
+
+ List<String> getTargetMilestones() {
+ return milestones;
+ }
+
+ List<String> getVersions() {
+ return versions;
+ }
+ }
+
+ public static final String CONFIG_COMPONENT = "repository.configuration.component";
+
+ public static final String CONFIG_KEYWORDS = "repository.configuration.keywords";
+
+ public static final String CONFIG_MILESTONE = "repository.configuration.milestone";
+
+ public static final String CONFIG_OPSYS = "repository.configuration.opsys";
+
+ public static final String CONFIG_PLATFORM = "repository.configuration.platform";
+
+ public static final String CONFIG_PRIORITY = "repository.configuration.priority";
+
+ public static final String CONFIG_PRODUCT = "repository.configuration.product";
+
+ public static final String CONFIG_RESOLUTION = "repository.configuration.resolution";
+
+ public static final String CONFIG_SEVERITY = "repository.configuration.severity";
+
+ public static final String CONFIG_STATUS = "repository.configuration.status";
+
+ public static final String CONFIG_VERSION = "repository.configuration.version";
+
+ private static final long serialVersionUID = -3623617786905114255L;
+
+ private static final String VERSION_UNKNOWN = "unknown";
+
+ private List<String> bugStatus = new ArrayList<String>();
+
+ private List<String> components = new ArrayList<String>();
+
+ private List<String> keywords = new ArrayList<String>();
+
+ private List<String> milestones = new ArrayList<String>();
+
+ private List<String> openStatusValues = new ArrayList<String>();
+
+ private List<String> operatingSystems = new ArrayList<String>();
+
+ private List<String> platforms = new ArrayList<String>();
+
+ private List<String> priorities = new ArrayList<String>();
+
+ private Map<String, ProductEntry> products = new HashMap<String, ProductEntry>();
+
+ // master lists
+
+ private String repositoryUrl = "<unknown>";
+
+ private List<String> resolutionValues = new ArrayList<String>();
+
+ private List<String> severities = new ArrayList<String>();
+
+ private String version = VERSION_UNKNOWN;
+
+ private List<String> versions = new ArrayList<String>();
+
+ public CopyOfRepositoryConfiguration(AbstractAttributeFactory factory) {
+ super(factory);
+ // ignore
+ }
+
+// /**
+// * Adds a component to the given product.
+// */
+// public void addComponent(String product, String component) {
+// if (!components.contains(component))
+// components.add(component);
+// ProductEntry entry = products.get(product);
+// if (entry == null) {
+// entry = new ProductEntry(product);
+// products.put(product, entry);
+// }
+// entry.addComponent(component);
+// }
+//
+// public void addKeyword(String keyword) {
+// keywords.add(keyword);
+// }
+//
+// public void addOpenStatusValue(String value) {
+// openStatusValues.add(value);
+// }
+//
+// public void addOS(String os) {
+// operatingSystems.add(os);
+// }
+//
+// public void addPlatform(String platform) {
+// platforms.add(platform);
+// }
+//
+// public void addPriority(String priority) {
+// priorities.add(priority);
+// }
+//
+// /**
+// * Adds a product to the configuration.
+// */
+// public void addProduct(String name) {
+// if (!products.containsKey(name)) {
+// ProductEntry product = new ProductEntry(name);
+// products.put(name, product);
+// }
+// }
+//
+// public void addResolution(String res) {
+// resolutionValues.add(res);
+// }
+//
+// public void addSeverity(String severity) {
+// severities.add(severity);
+//
+// }
+//
+// public void addStatus(String status) {
+// bugStatus.add(status);
+// }
+//
+// public void addTargetMilestone(String product, String target) {
+// if (!milestones.contains(target))
+// milestones.add(target);
+// ProductEntry entry = products.get(product);
+// if (entry == null) {
+// entry = new ProductEntry(product);
+// products.put(product, entry);
+// }
+//
+// entry.addTargetMilestone(target);
+//
+// }
+//
+// public void addVersion(String product, String version) {
+// if (!versions.contains(version))
+// versions.add(version);
+// ProductEntry entry = products.get(product);
+// if (entry == null) {
+// entry = new ProductEntry(product);
+// products.put(product, entry);
+// }
+// entry.addVersion(version);
+// }
+//
+// public List<String> getComponents() {
+// return components;
+// }
+//
+// // /**
+// // * Adds a list of components to the given product.
+// // */
+// // public void addComponents(String product, List<String> components) {
+// // ProductEntry entry = products.get(product);
+// // if (entry == null) {
+// // entry = new ProductEntry(product);
+// // products.put(product, entry);
+// // }
+// // for (String component : components) {
+// // entry.addComponent(component);
+// // }
+// // }
+// // /**
+// // * Adds a list of components to the given product.
+// // */
+// // public void addComponents(String product, List<String> components) {
+// // ProductEntry entry = products.get(product);
+// // if (entry == null) {
+// // entry = new ProductEntry(product);
+// // products.put(product, entry);
+// // }
+// // for (String component : components) {
+// // entry.addComponent(component);
+// // }
+// // }
+//
+// /**
+// * Returns an array of names of component that exist for a given product or
+// * <code>null</code> if the product does not exist.
+// */
+// public List<String> getComponents(String product) {
+// ProductEntry entry = products.get(product);
+// if (entry != null) {
+// return entry.getComponents();
+// } else
+// return Collections.emptyList();
+// }
+//
+// // /**
+// // * Adds a list of components to the given product.
+// // */
+// // public void addVersions(String product, List<String> versions) {
+// // ProductEntry entry = products.get(product);
+// // if (entry == null) {
+// // entry = new ProductEntry(product);
+// // products.put(product, entry);
+// // }
+// // for (String version : versions) {
+// // entry.addVersion(version);
+// // }
+// // }
+//
+// public String getInstallVersion() {
+// return version;
+// }
+//
+// public List<String> getKeywords() {
+// return keywords;
+// }
+//
+// public List<String> getOpenStatusValues() {
+// return openStatusValues;
+// }
+//
+// /*
+// * Intermediate step until configuration is made generic.
+// */
+// public List<String> getOptionValues(String attributeKey, String product) {
+// if (attributeKey.equals(CONFIG_PRODUCT))
+// return getProducts();
+// if (attributeKey.equals(CONFIG_MILESTONE))
+// return getTargetMilestones(product);
+// if (attributeKey.equals(CONFIG_STATUS))
+// return getStatusValues();
+// if (attributeKey.equals(CONFIG_VERSION))
+// return getVersions(product);
+// if (attributeKey.equals(CONFIG_COMPONENT))
+// return getComponents(product);
+// if (attributeKey.equals(CONFIG_PLATFORM))
+// return getPlatforms();
+// if (attributeKey.equals(CONFIG_OPSYS))
+// return getOSs();
+// if (attributeKey.equals(CONFIG_PRIORITY))
+// return getPriorities();
+// if (attributeKey.equals(CONFIG_SEVERITY))
+// return getSeverities();
+// if (attributeKey.equals(CONFIG_KEYWORDS))
+// return getKeywords();
+// if (attributeKey.equals(CONFIG_RESOLUTION))
+// return getResolutions();
+//
+// return new ArrayList<String>();
+// }
+//
+// /**
+// * Returns an array of names of valid OS values.
+// */
+// public List<String> getOSs() {
+// //return operatingSystems;
+// return getAttributeValues("op_sys");
+// }
+//
+// /**
+// * Returns an array of names of valid platform values.
+// */
+// public List<String> getPlatforms() {
+// return platforms;
+// }
+//
+// /**
+// * Returns an array of names of valid platform values.
+// */
+// public List<String> getPriorities() {
+// return priorities;
+// }
+//
+// /**
+// * Returns an array of names of current products.
+// */
+// public List<String> getProducts() {
+// ArrayList<String> productList = new ArrayList<String>(products.keySet());
+// Collections.sort(productList);
+// return productList;
+// }
+//
+// public List<String> getResolutions() {
+// return resolutionValues;
+// }
+//
+// /**
+// * Returns an array of names of valid severity values.
+// */
+// public List<String> getSeverities() {
+// return severities;
+// }
+//
+// public List<String> getStatusValues() {
+// return bugStatus;
+// }
+//
+// public List<String> getTargetMilestones() {
+// return milestones;
+// }
+//
+// public List<String> getTargetMilestones(String product) {
+// ProductEntry entry = products.get(product);
+// if (entry != null) {
+// return entry.getTargetMilestones();
+// } else
+// return Collections.emptyList();
+// }
+//
+// public List<String> getVersions() {
+// return versions;
+// }
+//
+// /**
+// * Returns an array of names of versions that exist for a given product or
+// * <code>null</code> if the product does not exist.
+// */
+// public List<String> getVersions(String product) {
+// ProductEntry entry = products.get(product);
+// if (entry != null) {
+// return entry.getVersions();
+// } else
+// return Collections.emptyList();
+// }
+//
+// public void setInstallVersion(String version) {
+// this.version = version;
+// }
+
+ public String getRepositoryUrl() {
+ return repositoryUrl;
+ }
+
+ public void setRepositoryUrl(String repositoryUrl) {
+ this.repositoryUrl = repositoryUrl;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/RepositoryReportFactory.java b/org.eclipse.mylyn/developer/src-old/bugzilla/RepositoryReportFactory.java
new file mode 100644
index 0000000..1aa297f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/RepositoryReportFactory.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
+
+/**
+ * Reads bug reports from repository.
+ *
+ * @author Rob Elves
+ */
+public class RepositoryReportFactory extends AbstractReportFactory {
+
+ public RepositoryReportFactory(InputStream inStream, String encoding) {
+ super(inStream, encoding);
+ }
+
+ private static BugzillaAttributeFactory bugzillaAttributeFactory = new BugzillaAttributeFactory();
+
+ public void populateReport(RepositoryTaskData bugReport) throws IOException, CoreException {
+
+ SaxBugReportContentHandler contentHandler = new SaxBugReportContentHandler(bugzillaAttributeFactory, bugReport);
+ collectResults(contentHandler, false);
+
+ if (contentHandler.errorOccurred()) {
+ String errorResponse = contentHandler.getErrorMessage().toLowerCase(Locale.ENGLISH);
+ if (errorResponse.equals(IBugzillaConstants.XML_ERROR_NOTFOUND)
+ || errorResponse.equals(IBugzillaConstants.XML_ERROR_INVALIDBUGID)) {
+ throw new CoreException(new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.PLUGIN_ID,
+ RepositoryStatus.ERROR_REPOSITORY, bugReport.getRepositoryUrl(),
+ IBugzillaConstants.ERROR_MSG_INVALID_BUG_ID));
+ }
+ if (errorResponse.equals(IBugzillaConstants.XML_ERROR_NOTPERMITTED)) {
+ throw new CoreException(new BugzillaStatus(IStatus.WARNING, BugzillaCorePlugin.PLUGIN_ID,
+ RepositoryStatus.ERROR_REPOSITORY, bugReport.getRepositoryUrl(),
+ IBugzillaConstants.ERROR_MSG_OP_NOT_PERMITTED));
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/SaveQueryDialog.java b/org.eclipse.mylyn/developer/src-old/bugzilla/SaveQueryDialog.java
new file mode 100644
index 0000000..deb1d15
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/SaveQueryDialog.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Dialog for naming a saved query.
+ */
+public class SaveQueryDialog extends Dialog {
+ private Text queryName;
+
+ /**
+ * The Ok button.
+ */
+ private Button okButton;
+
+ /**
+ * The title of the dialog.
+ */
+ private String title;
+
+ public SaveQueryDialog(Shell parentShell, String dialogTitle) {
+ super(parentShell);
+ this.title = dialogTitle;
+ setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
+ }
+
+ @Override
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(title);
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ // create OK and cancel buttons
+ okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ okButton.setEnabled(false);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ // create composite
+ Composite composite = (Composite) super.createDialogArea(parent);
+
+ createMainDialogArea(composite);
+ return composite;
+ }
+
+ protected void createMainDialogArea(Composite parent) {
+ queryName = new Text(parent, SWT.SINGLE | SWT.BORDER);
+ queryName.setLayoutData(new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+ queryName.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ if (queryName.getText().compareTo("") != 0 && queryName.getText() != null)
+ okButton.setEnabled(true);
+ else
+ okButton.setEnabled(false);
+ queryNameText = queryName.getText();
+ }
+ });
+ }
+
+ String queryNameText;
+
+ public String getText() {
+ return queryNameText;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/SavedQueryFile.java b/org.eclipse.mylyn/developer/src-old/bugzilla/SavedQueryFile.java
new file mode 100644
index 0000000..71cf719
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/SavedQueryFile.java
@@ -0,0 +1,256 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.search;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class manages accessing and persisting named Bugzilla queries.
+ */
+public class SavedQueryFile {
+ /** The file that the queries are written to */
+ private File file;
+
+ /** The directory to where the file is located */
+ private File directory;
+
+ /** A list of remembered queries */
+ private ArrayList<String> list = new ArrayList<String>();
+
+ private ArrayList<String> nameList = new ArrayList<String>();
+
+ private ArrayList<String> sumList = new ArrayList<String>();
+
+ /**
+ * Constructor
+ *
+ * @param dirPath
+ * The path to the directory where the favorites file should be
+ * written to
+ * @param fileName
+ * The file that the favorites should be written to
+ */
+ public SavedQueryFile(String dirPath, String fileName) {
+ // create a new file and if it exists, read the data from the file
+ // else create the file and directories if they dont exist
+ file = new File(dirPath + fileName);
+ if (file.exists()) {
+ readFile();
+ } else {
+ directory = new File(dirPath);
+ if (!directory.exists())
+ directory.mkdirs();
+ writeFile();
+ }
+ }
+
+ /**
+ * Add a query to the list
+ *
+ * @param entry
+ * The query to add
+ */
+ public int add(String entry, String name, String sum) {
+ // add the entry to the list and write the file to disk
+ int index = find(name);
+ if (index == -1) {
+ list.add(entry);
+ nameList.add(name);
+ sumList.add(sum);
+ writeFile();
+ } else {
+ boolean isDuplicate = MessageDialog.openConfirm(PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow().getShell(), "Save Bugzilla Query", name
+ + " already exists. Do you want to replace it?");
+ if (isDuplicate) {
+ list.add(index, entry);
+ nameList.add(index, name);
+ sumList.add(index, sum);
+ list.remove(index + 1);
+ nameList.remove(index + 1);
+ sumList.remove(index + 1);
+ writeFile();
+ }
+ }
+
+ index = find(entry);
+ return index;
+ }
+
+ /**
+ * Find a bug in the query list
+ *
+ * @param name
+ * The name of the query that we are looking for
+ * @return The index of the query in the array if it exists, else -1
+ */
+ public int find(String name) {
+ for (int i = 0; i < list.size(); i++) {
+ String str = nameList.get(i);
+ if (name.compareTo(str) == 0)
+ return i;
+ }
+ return -1;
+ }
+
+ /**
+ * Get the list of queries
+ *
+ * @return The list of queries
+ */
+ public ArrayList<String> elements() {
+ return list;
+ }
+
+ /**
+ * Write the queries to disk
+ */
+ private void writeFile() {
+ try {
+ OutputStream os = new FileOutputStream(file);
+ DataOutputStream data = new DataOutputStream(os);
+
+ // Write the size of the list so that we can read it back in easier
+ data.writeInt(list.size());
+
+ // write each element in the array list
+ for (int i = 0; i < list.size(); i++) {
+ String item = list.get(i);
+ String itemName = nameList.get(i);
+ String summary = sumList.get(i);
+
+ // write the string in a machine independant manner
+ data.writeUTF(item);
+ data.writeUTF(itemName);
+ data.writeUTF(summary);
+ }
+
+ // close the file
+ data.close();
+ } catch (IOException e) {
+ // put up a message and log the error if there is a problem writing
+ // to the file
+ BugzillaPlugin.getDefault().logAndShowExceptionDetailsDialog(e,
+ "occurred while saving your Bugzilla queries", "I/O Error");
+ }
+ }
+
+ /**
+ * Read the queries in from the file on disk
+ */
+ private void readFile() {
+ try {
+ InputStream is = new FileInputStream(file);
+ DataInputStream data = new DataInputStream(is);
+
+ // get the number of favorites in the file
+ int size = data.readInt();
+
+ // read in each of the favorites in the file
+ for (int nX = 0; nX < size; nX++) {
+ String item, name, summary;
+
+ // get the data from disk in a machine independant way
+ item = data.readUTF();
+ name = data.readUTF();
+ summary = data.readUTF();
+
+ // add the favorite to the favorites list
+ list.add(item);
+ nameList.add(name);
+ sumList.add(summary);
+ }
+
+ // close the input stream
+ data.close();
+ } catch (IOException e) {
+ // put up a message and log the error if there is a problem reading
+ // from the file
+ BugzillaPlugin.getDefault().logAndShowExceptionDetailsDialog(e,
+ "occurred while restoring saved Bugzilla queries.", "I/O Error");
+ }
+ }
+
+ /**
+ * Remove some queries from the list
+ *
+ * @param indicesToRemove
+ * An array of the indicies of the queries to be removed
+ */
+ public void remove(int[] indicesToRemove) {
+ int timesShifted = 0;
+
+ // remove each of the indicated items from the array
+ for (int i = 0; i < indicesToRemove.length; i++) {
+ list.remove(indicesToRemove[i] - timesShifted);
+ nameList.remove(indicesToRemove[i] - timesShifted);
+ sumList.remove(indicesToRemove[i] - timesShifted);
+ timesShifted++;
+ }
+
+ // rewrite the file so that the data is persistant
+ writeFile();
+
+ // remove the items from the combo box
+ timesShifted = 0;
+ }
+
+ /**
+ * Remove all of the items in the favortes menu
+ */
+ public void removeAll() {
+ // remove every element from the favorites list
+ while (list.size() > 0) {
+ list.remove(0);
+ nameList.remove(0);
+ sumList.remove(0);
+ }
+
+ // rewrite the file so that the data is persistant
+ writeFile();
+ }
+
+ /**
+ * Get the query parameters of the currently selected remembered query
+ *
+ * @return The query url
+ */
+ public String getQueryParameters(int index) {
+ return list.get(index);
+ }
+
+ /**
+ * Get the summary text of the currently selected remembered query
+ *
+ * @return The summary text
+ */
+ public String getSummaryText(int index) {
+ return sumList.get(index);
+
+ }
+
+ public ArrayList<String> getNames() {
+ return nameList;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/SaxBugReportContentHandler.java b/org.eclipse.mylyn/developer/src-old/bugzilla/SaxBugReportContentHandler.java
new file mode 100644
index 0000000..0204b95
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/SaxBugReportContentHandler.java
@@ -0,0 +1,291 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import org.eclipse.mylyn.monitor.core.StatusHandler;
+import org.eclipse.mylyn.tasks.core.AbstractAttributeFactory;
+import org.eclipse.mylyn.tasks.core.RepositoryAttachment;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskData;
+import org.eclipse.mylyn.tasks.core.TaskComment;
+import org.eclipse.mylyn.web.core.HtmlStreamTokenizer;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Parser for xml bugzilla reports.
+ *
+ * @author Rob Elves
+ */
+public class SaxBugReportContentHandler extends DefaultHandler {
+
+ private static final String COMMENT_ATTACHMENT_STRING = "Created an attachment (id=";
+
+ private StringBuffer characters;
+
+ private TaskComment taskComment;
+
+ private final Map<String, TaskComment> attachIdToComment = new HashMap<String, TaskComment>();
+
+ private int commentNum = 0;
+
+ private RepositoryAttachment attachment;
+
+ private RepositoryTaskData repositoryTaskData;
+
+ private String errorMessage = null;
+
+ private AbstractAttributeFactory attributeFactory;
+
+ public SaxBugReportContentHandler(AbstractAttributeFactory factory, RepositoryTaskData taskData) {
+ this.attributeFactory = factory;
+ this.repositoryTaskData = taskData;
+ }
+
+ public boolean errorOccurred() {
+ return errorMessage != null;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public RepositoryTaskData getReport() {
+ return repositoryTaskData;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ characters.append(ch, start, length);
+ // if (monitor.isCanceled()) {
+ // throw new OperationCanceledException("Search cancelled");
+ // }
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+ characters = new StringBuffer();
+ BugzillaReportElement tag = BugzillaReportElement.UNKNOWN;
+ try {
+ tag = BugzillaReportElement.valueOf(localName.trim().toUpperCase(Locale.ENGLISH));
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ return;
+ }
+ throw e;
+ }
+ switch (tag) {
+ case BUGZILLA:
+ // Note: here we can get the bugzilla version if necessary
+ break;
+ case BUG:
+ if (attributes != null && (attributes.getValue("error") != null)) {
+ errorMessage = attributes.getValue("error");
+ }
+ break;
+ case LONG_DESC:
+ taskComment = new TaskComment(attributeFactory, commentNum++);
+ break;
+ case ATTACHMENT:
+ attachment = new RepositoryAttachment(attributeFactory);
+ if (attributes != null) {
+ if ("1".equals(attributes.getValue(BugzillaReportElement.IS_OBSOLETE.getKeyString()))) {
+ attachment.addAttribute(BugzillaReportElement.IS_OBSOLETE.getKeyString(),
+ attributeFactory.createAttribute(BugzillaReportElement.IS_OBSOLETE.getKeyString()));
+ attachment.setObsolete(true);
+ }
+ if ("1".equals(attributes.getValue(BugzillaReportElement.IS_PATCH.getKeyString()))) {
+ attachment.setPatch(true);
+ }
+ }
+ break;
+ }
+
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ String parsedText = HtmlStreamTokenizer.unescape(characters.toString());
+
+ BugzillaReportElement tag = BugzillaReportElement.UNKNOWN;
+ try {
+ tag = BugzillaReportElement.valueOf(localName.trim().toUpperCase(Locale.ENGLISH));
+ } catch (RuntimeException e) {
+ if (e instanceof IllegalArgumentException) {
+ // ignore unrecognized tags
+ return;
+ }
+ throw e;
+ }
+ switch (tag) {
+ case BUG_ID: {
+ try {
+ if (!repositoryTaskData.getId().equals(parsedText)) {
+ errorMessage = "Requested report number does not match returned report number.";
+ }
+ } catch (Exception e) {
+ errorMessage = "Bug id from server did not match requested id.";
+ }
+
+ RepositoryTaskAttribute attr = repositoryTaskData.getAttribute(tag.getKeyString());
+ if (attr == null) {
+ attr = attributeFactory.createAttribute(tag.getKeyString());
+ repositoryTaskData.addAttribute(tag.getKeyString(), attr);
+ }
+ attr.setValue(parsedText);
+ break;
+ }
+
+ // Comment attributes
+ case WHO:
+ case BUG_WHEN:
+ if (taskComment != null) {
+ RepositoryTaskAttribute attr = attributeFactory.createAttribute(tag.getKeyString());
+ attr.setValue(parsedText);
+ taskComment.addAttribute(tag.getKeyString(), attr);
+ }
+ break;
+ case THETEXT:
+ if (taskComment != null) {
+ RepositoryTaskAttribute attr = attributeFactory.createAttribute(tag.getKeyString());
+ attr.setValue(parsedText);
+ taskComment.addAttribute(tag.getKeyString(), attr);
+
+ // Check for attachment
+ parseAttachment(taskComment, parsedText);
+ }
+ break;
+ case LONG_DESC:
+ if (taskComment != null) {
+ if (taskComment.getNumber() == 0) {
+ repositoryTaskData.setAttributeValue(RepositoryTaskAttribute.DESCRIPTION, taskComment.getText());
+ break;
+ }
+ repositoryTaskData.addComment(taskComment);
+ }
+ break;
+
+ // Attachment attributes
+ case ATTACHID:
+ case DATE:
+ case DESC:
+ case FILENAME:
+ case CTYPE:
+ case TYPE:
+ if (attachment != null) {
+ RepositoryTaskAttribute attr = attributeFactory.createAttribute(tag.getKeyString());
+ attr.setValue(parsedText);
+ attachment.addAttribute(tag.getKeyString(), attr);
+ }
+ break;
+ case DATA:
+ break;
+ case ATTACHMENT:
+ if (attachment != null) {
+ repositoryTaskData.addAttachment(attachment);
+ }
+ break;
+
+ // IGNORED ELEMENTS
+ // case REPORTER_ACCESSIBLE:
+ // case CLASSIFICATION_ID:
+ // case CLASSIFICATION:
+ // case CCLIST_ACCESSIBLE:
+ // case EVERCONFIRMED:
+ case BUGZILLA:
+ break;
+ case BUG:
+ // Reached end of bug. Need to set LONGDESCLENGTH to number of
+ // comments
+ RepositoryTaskAttribute numCommentsAttribute = repositoryTaskData.getAttribute(BugzillaReportElement.LONGDESCLENGTH.getKeyString());
+ if (numCommentsAttribute == null) {
+ numCommentsAttribute = attributeFactory.createAttribute(BugzillaReportElement.LONGDESCLENGTH.getKeyString());
+ numCommentsAttribute.setValue("" + repositoryTaskData.getComments().size());
+ repositoryTaskData.addAttribute(BugzillaReportElement.LONGDESCLENGTH.getKeyString(),
+ numCommentsAttribute);
+ } else {
+ numCommentsAttribute.setValue("" + repositoryTaskData.getComments().size());
+ }
+
+ // Set the creator name on all attachments
+ for (RepositoryAttachment attachment : repositoryTaskData.getAttachments()) {
+ TaskComment taskComment = attachIdToComment.get(attachment.getId());
+ if (taskComment != null) {
+ attachment.setCreator(taskComment.getAuthor());
+ }
+ attachment.setAttributeValue(RepositoryTaskAttribute.ATTACHMENT_URL,
+ repositoryTaskData.getRepositoryUrl() + IBugzillaConstants.URL_GET_ATTACHMENT_SUFFIX
+ + attachment.getId());
+ attachment.setRepositoryKind(repositoryTaskData.getRepositoryKind());
+ attachment.setRepositoryUrl(repositoryTaskData.getRepositoryUrl());
+ attachment.setTaskId(repositoryTaskData.getId());
+ }
+ break;
+
+ case BLOCKED:
+ case DEPENDSON:
+ RepositoryTaskAttribute dependancyAttribute = repositoryTaskData.getAttribute(tag.getKeyString());
+ if (dependancyAttribute == null) {
+ dependancyAttribute = attributeFactory.createAttribute(tag.getKeyString());
+ dependancyAttribute.setValue(parsedText);
+ repositoryTaskData.addAttribute(tag.getKeyString(), dependancyAttribute);
+ } else {
+ if (dependancyAttribute.getValue().equals("")) {
+ dependancyAttribute.setValue(parsedText);
+ } else {
+ dependancyAttribute.setValue(dependancyAttribute.getValue() + ", " + parsedText);
+ }
+ }
+ break;
+ case DELTA_TS:
+ RepositoryTaskAttribute delta_ts_attribute = repositoryTaskData.getAttribute(tag.getKeyString());
+ if (delta_ts_attribute == null) {
+ delta_ts_attribute = attributeFactory.createAttribute(tag.getKeyString());
+ repositoryTaskData.addAttribute(tag.getKeyString(), delta_ts_attribute);
+ }
+ delta_ts_attribute.setValue(BugzillaClient.stripTimeZone(parsedText));
+ break;
+ default:
+ RepositoryTaskAttribute attribute = repositoryTaskData.getAttribute(tag.getKeyString());
+ if (attribute == null) {
+ attribute = attributeFactory.createAttribute(tag.getKeyString());
+ repositoryTaskData.addAttribute(tag.getKeyString(), attribute);
+ }
+ attribute.addValue(parsedText);
+ break;
+ }
+
+ }
+
+ /** determines attachment id from comment */
+ private void parseAttachment(TaskComment taskComment, String commentText) {
+
+ String attachmentID = "";
+
+ if (commentText.startsWith(COMMENT_ATTACHMENT_STRING)) {
+ int endIndex = commentText.indexOf(")");
+ if (endIndex > 0 && endIndex < commentText.length()) {
+ attachmentID = commentText.substring(COMMENT_ATTACHMENT_STRING.length(), endIndex);
+ if (!attachmentID.equals("")) {
+ taskComment.setHasAttachment(true);
+ taskComment.setAttachmentId(attachmentID);
+ attachIdToComment.put(attachmentID, taskComment);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/SaxConfigurationContentHandler.java b/org.eclipse.mylyn/developer/src-old/bugzilla/SaxConfigurationContentHandler.java
new file mode 100644
index 0000000..5f5b050
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/SaxConfigurationContentHandler.java
@@ -0,0 +1,437 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Quick config rdf parser.
+ *
+ * <pre>
+ * config.cgi?ctype=rdf
+ * </pre>
+ *
+ * Populates a <link>ProductConfiguration</link> data structure.
+ *
+ * @author Rob Elves
+ */
+public class SaxConfigurationContentHandler extends DefaultHandler {
+
+ private static final String ELEMENT_RESOLUTION = "resolution";
+
+ private static final String ELEMENT_STATUS_OPEN = "status_open";
+
+ private static final String ELEMENT_TARGET_MILESTONE = "target_milestone";
+
+ private static final String ELEMENT_TARGET_MILESTONES = "target_milestones";
+
+ private static final String ELEMENT_INSTALL_VERSION = "install_version";
+
+ private static final String ATTRIBUTE_RDF_ABOUT = "rdf:about";
+
+ private static final String ATTRIBUTE_RESOURCE = "resource";
+
+ private static final String ELEMENT_VERSION = "version";
+
+ private static final String ELEMENT_VERSIONS = "versions";
+
+ private static final String ELEMENT_COMPONENT = "component";
+
+ private static final String ELEMENT_COMPONENTS = "components";
+
+ private static final String ELEMENT_NAME = "name";
+
+ private static final String ELEMENT_PRODUCTS = "products";
+
+ private static final String ELEMENT_SEVERITY = "severity";
+
+ private static final String ELEMENT_PRIORITY = "priority";
+
+ private static final String ELEMENT_KEYWORD = "keyword";
+
+ private static final String ELEMENT_OP_SYS = "op_sys";
+
+ private static final String ELEMENT_PLATFORM = "platform";
+
+ private static final String ELEMENT_LI = "li";
+
+ private static final String ELEMENT_STATUS = "status";
+
+ private static final int EXPECTING_ROOT = 0;
+
+ private static final int IN_INSTALL_VERSION = 1 << 1;
+
+ private static final int IN_STATUS = 1 << 2;
+
+ private static final int IN_PLATFORM = 1 << 3;
+
+ private static final int IN_OP_SYS = 1 << 4;
+
+ private static final int IN_PRIORITY = 1 << 5;
+
+ private static final int IN_SEVERITY = 1 << 6;
+
+ private static final int IN_PRODUCTS = 1 << 7;
+
+ private static final int IN_COMPONENTS = 1 << 8;
+
+ private static final int IN_VERSIONS = 1 << 9;
+
+ private static final int IN_LI = 1 << 10;
+
+ private static final int IN_LI_LI = 1 << 11;
+
+ private static final int IN_NAME = 1 << 12;
+
+ private static final int IN_COMPONENT = 1 << 13;
+
+ private static final int IN_VERSION = 1 << 14;
+
+ private static final int IN_TARGET_MILESTONES = 1 << 15;
+
+ private static final int IN_TARGET_MILESTONE = 1 << 16;
+
+ private static final int IN_STATUS_OPEN = 1 << 17;
+
+ private static final int IN_RESOLUTION = 1 << 18;
+
+ private static final int IN_KEYWORD = 1 << 19;
+
+ private static final int IN_STATUS_CLOSED = 1 << 20;
+
+ private int state = EXPECTING_ROOT;
+
+ private StringBuffer currentProduct = new StringBuffer();
+
+ private StringBuffer parsedValue = new StringBuffer();
+
+ private String about;
+
+ private RepositoryConfiguration configuration = new RepositoryConfiguration();
+
+ private Map<String, List<String>> components = new HashMap<String, List<String>>();
+
+ private Map<String, List<String>> versions = new HashMap<String, List<String>>();
+
+ private Map<String, List<String>> milestones = new HashMap<String, List<String>>();
+
+ private Map<String, StringBuffer> componentNames = new HashMap<String, StringBuffer>();
+
+ private Map<String, StringBuffer> versionNames = new HashMap<String, StringBuffer>();
+
+ private Map<String, StringBuffer> milestoneNames = new HashMap<String, StringBuffer>();
+
+ public RepositoryConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ switch (state) {
+
+ case IN_PRODUCTS | IN_LI | IN_NAME:
+ currentProduct.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_COMPONENTS | IN_LI | IN_COMPONENT | IN_NAME:
+ String comp = String.copyValueOf(ch, start, length);
+ if (about != null) {
+ StringBuffer name = componentNames.get(about);
+ if (name == null) {
+ name = new StringBuffer();
+ componentNames.put(about, name);
+ }
+ name.append(comp);
+ }
+ break;
+ case IN_VERSIONS | IN_LI | IN_VERSION | IN_NAME:
+ String ver = String.copyValueOf(ch, start, length);
+ if (about != null) {
+ StringBuffer name = versionNames.get(about);
+ if (name == null) {
+ name = new StringBuffer();
+ versionNames.put(about, name);
+ }
+ name.append(ver);
+ }
+ break;
+ case IN_TARGET_MILESTONES | IN_LI | IN_TARGET_MILESTONE | IN_NAME:
+ String target = String.copyValueOf(ch, start, length);
+ if (about != null) {
+ StringBuffer name = milestoneNames.get(about);
+ if (name == null) {
+ name = new StringBuffer();
+ milestoneNames.put(about, name);
+ }
+ name.append(target);
+ }
+ break;
+ case IN_PLATFORM | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_OP_SYS | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_PRIORITY | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_SEVERITY | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_INSTALL_VERSION:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_STATUS | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_RESOLUTION | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_KEYWORD | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ case IN_STATUS_OPEN | IN_LI:
+ parsedValue.append(String.copyValueOf(ch, start, length));
+ break;
+ }
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+
+ if (localName.equals(ELEMENT_STATUS)) {
+ state = state | IN_STATUS;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI) == IN_LI)) {
+ state = state | IN_LI_LI;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI) != IN_LI)) {
+ state = state | IN_LI;
+ } else if (localName.equals(ELEMENT_PLATFORM)) {
+ state = state | IN_PLATFORM;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state | IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_PRIORITY)) {
+ state = state | IN_PRIORITY;
+ } else if (localName.equals(ELEMENT_SEVERITY)) {
+ state = state | IN_SEVERITY;
+ } else if (localName.equals(ELEMENT_PRODUCTS)) {
+ state = state | IN_PRODUCTS;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state | IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_NAME)) {
+ state = state | IN_NAME;
+ currentProduct = new StringBuffer();
+ } else if (localName.equals(ELEMENT_COMPONENTS)) {
+ state = state | IN_COMPONENTS;
+ } else if (localName.equals(ELEMENT_COMPONENT)) {
+ state = state | IN_COMPONENT;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_VERSIONS)) {
+ state = state | IN_VERSIONS;
+ } else if (localName.equals(ELEMENT_VERSION)) {
+ state = state | IN_VERSION;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_INSTALL_VERSION)) {
+ state = state | IN_INSTALL_VERSION;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONES)) {
+ state = state | IN_TARGET_MILESTONES;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONE)) {
+ state = state | IN_TARGET_MILESTONE;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_STATUS_OPEN)) {
+ state = state | IN_STATUS_OPEN;
+ } else if (localName.equals(ELEMENT_RESOLUTION)) {
+ state = state | IN_RESOLUTION;
+ } else if (localName.equals(ELEMENT_KEYWORD)) {
+ state = state | IN_KEYWORD;
+ }
+ parsedValue = new StringBuffer();
+ }
+
+ private void parseResource(Attributes attributes) {
+
+ switch (state) {
+ case IN_PRODUCTS | IN_LI | IN_COMPONENTS | IN_LI_LI:
+ if (attributes != null) {
+ String compURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (compURI != null && currentProduct.length() > 0) {
+ List<String> compURIs = components.get(currentProduct.toString());
+ if (compURIs == null) {
+ compURIs = new ArrayList<String>();
+ components.put(currentProduct.toString(), compURIs);
+ }
+ compURIs.add(compURI);
+ }
+ }
+ break;
+ case IN_PRODUCTS | IN_LI | IN_VERSIONS | IN_LI_LI:
+ if (attributes != null) {
+ String resourceURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (resourceURI != null && currentProduct.length() > 0) {
+ List<String> versionUris = versions.get(currentProduct.toString());
+ if (versionUris == null) {
+ versionUris = new ArrayList<String>();
+ versions.put(currentProduct.toString(), versionUris);
+ }
+ versionUris.add(resourceURI);
+ }
+ }
+ break;
+ case IN_PRODUCTS | IN_LI | IN_TARGET_MILESTONES | IN_LI_LI:
+ if (attributes != null) {
+ String resourceURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (resourceURI != null) {
+ List<String> milestoneUris = milestones.get(currentProduct.toString());
+ if (milestoneUris == null) {
+ milestoneUris = new ArrayList<String>();
+ milestones.put(currentProduct.toString(), milestoneUris);
+ }
+ milestoneUris.add(resourceURI);
+ }
+ }
+ break;
+ case IN_COMPONENTS | IN_LI | IN_COMPONENT:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+ case IN_VERSIONS | IN_LI | IN_VERSION:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+
+ case IN_TARGET_MILESTONES | IN_LI | IN_TARGET_MILESTONE:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ // KEEP: && ((state & IN_LI) == IN_LI)
+
+ if (localName.equals(ELEMENT_STATUS)) {
+ state = state & ~IN_STATUS;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI_LI) == IN_LI_LI)) {
+ state = state & ~IN_LI_LI;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI_LI) != IN_LI_LI)) {
+ state = state & ~IN_LI;
+ if (parsedValue.length() == 0)
+ return;
+ if (state == (IN_STATUS)) {
+ configuration.addStatus(parsedValue.toString());
+ } else if (state == (IN_STATUS_OPEN)) {
+ configuration.addOpenStatusValue(parsedValue.toString());
+ } else if (state == (IN_STATUS_CLOSED)) {
+ // TODO: Add closed status values to configuration
+ } else if (state == (IN_RESOLUTION)) {
+ configuration.addResolution(parsedValue.toString());
+ } else if (state == (IN_KEYWORD)) {
+ configuration.addKeyword(parsedValue.toString());
+ } else if (state == (IN_PLATFORM)) {
+ configuration.addPlatform(parsedValue.toString());
+ } else if (state == (IN_OP_SYS)) {
+ configuration.addOS(parsedValue.toString());
+ } else if (state == (IN_PRIORITY)) {
+ configuration.addPriority(parsedValue.toString());
+ } else if (state == (IN_SEVERITY)) {
+ configuration.addSeverity(parsedValue.toString());
+ }
+ } else if (localName.equals(ELEMENT_PLATFORM)) {
+ state = state & ~IN_PLATFORM;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state & ~IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_PRIORITY)) {
+ state = state & ~IN_PRIORITY;
+ } else if (localName.equals(ELEMENT_SEVERITY)) {
+ state = state & ~IN_SEVERITY;
+ } else if (localName.equals(ELEMENT_PRODUCTS)) {
+ state = state & ~IN_PRODUCTS;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state & ~IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_NAME)) {
+ state = state & ~IN_NAME;
+ if (state == (IN_PRODUCTS | IN_LI) && currentProduct.length() > 0) {
+ configuration.addProduct(currentProduct.toString());
+ }
+ } else if (localName.equals(ELEMENT_COMPONENTS)) {
+ state = state & ~IN_COMPONENTS;
+ } else if (localName.equals(ELEMENT_COMPONENT)) {
+ state = state & ~IN_COMPONENT;
+ } else if (localName.equals(ELEMENT_VERSION)) {
+ state = state & ~IN_VERSION;
+ } else if (localName.equals(ELEMENT_VERSIONS)) {
+ state = state & ~IN_VERSIONS;
+ } else if (localName.equals(ELEMENT_INSTALL_VERSION)) {
+ state = state & ~IN_INSTALL_VERSION;
+ configuration.setInstallVersion(parsedValue.toString());
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONE)) {
+ state = state & ~IN_TARGET_MILESTONE;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONES)) {
+ state = state & ~IN_TARGET_MILESTONES;
+ } else if (localName.equals(ELEMENT_STATUS_OPEN)) {
+ state = state & ~IN_STATUS_OPEN;
+ } else if (localName.equals(ELEMENT_RESOLUTION)) {
+ state = state & ~IN_RESOLUTION;
+ } else if (localName.equals(ELEMENT_KEYWORD)) {
+ state = state & ~IN_KEYWORD;
+ }
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+
+ for (String product : components.keySet()) {
+ List<String> componentURIs = components.get(product);
+ for (String uri : componentURIs) {
+ StringBuffer realName = componentNames.get(uri);
+ if (realName != null && product.length() > 0) {
+ configuration.addComponent(product, realName.toString());
+ }
+ }
+ }
+
+ for (String product : versions.keySet()) {
+ List<String> versionURIs = versions.get(product);
+ for (String uri : versionURIs) {
+ StringBuffer realName = versionNames.get(uri);
+ if (realName != null) {
+ configuration.addVersion(product, realName.toString());
+ }
+ }
+
+ }
+
+ for (String product : milestones.keySet()) {
+ List<String> milestoneURIs = milestones.get(product);
+ for (String uri : milestoneURIs) {
+ StringBuffer realName = milestoneNames.get(uri);
+ if (realName != null) {
+ configuration.addTargetMilestone(product, realName.toString());
+ }
+ }
+
+ }
+ super.endDocument();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/SaxConfigurationContentHandlerOLD.java b/org.eclipse.mylyn/developer/src-old/bugzilla/SaxConfigurationContentHandlerOLD.java
new file mode 100644
index 0000000..4e6871c
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/SaxConfigurationContentHandlerOLD.java
@@ -0,0 +1,399 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.core;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mylyn.internal.tasks.core.RepositoryConfiguration;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Quick config rdf parser.
+ *
+ * <pre>
+ * config.cgi?ctype=rdf
+ * </pre>
+ *
+ * Populates a <link>ProductConfiguration</link> data structure.
+ *
+ * @author Rob Elves
+ */
+public class SaxConfigurationContentHandler extends DefaultHandler {
+
+ private static final String ELEMENT_RESOLUTION = "resolution";
+
+ private static final String ELEMENT_STATUS_OPEN = "status_open";
+
+ private static final String ELEMENT_TARGET_MILESTONE = "target_milestone";
+
+ private static final String ELEMENT_TARGET_MILESTONES = "target_milestones";
+
+ private static final String ELEMENT_INSTALL_VERSION = "install_version";
+
+ private static final String ATTRIBUTE_RDF_ABOUT = "rdf:about";
+
+ private static final String ATTRIBUTE_RESOURCE = "resource";
+
+ private static final String ELEMENT_VERSION = "version";
+
+ private static final String ELEMENT_VERSIONS = "versions";
+
+ private static final String ELEMENT_COMPONENT = "component";
+
+ private static final String ELEMENT_COMPONENTS = "components";
+
+ private static final String ELEMENT_NAME = "name";
+
+ private static final String ELEMENT_PRODUCTS = "products";
+
+ private static final String ELEMENT_SEVERITY = "severity";
+
+ private static final String ELEMENT_PRIORITY = "priority";
+
+ private static final String ELEMENT_KEYWORD = "keyword";
+
+ private static final String ELEMENT_OP_SYS = "op_sys";
+
+ private static final String ELEMENT_PLATFORM = "platform";
+
+ private static final String ELEMENT_LI = "li";
+
+ private static final String ELEMENT_STATUS = "status";
+
+ private static final int EXPECTING_ROOT = 0;
+
+ private static final int IN_INSTALL_VERSION = 1 << 1;
+
+ private static final int IN_STATUS = 1 << 2;
+
+ private static final int IN_PLATFORM = 1 << 3;
+
+ private static final int IN_OP_SYS = 1 << 4;
+
+ private static final int IN_PRIORITY = 1 << 5;
+
+ private static final int IN_SEVERITY = 1 << 6;
+
+ private static final int IN_PRODUCTS = 1 << 7;
+
+ private static final int IN_COMPONENTS = 1 << 8;
+
+ private static final int IN_VERSIONS = 1 << 9;
+
+ private static final int IN_LI = 1 << 10;
+
+ private static final int IN_LI_LI = 1 << 11;
+
+ private static final int IN_NAME = 1 << 12;
+
+ private static final int IN_COMPONENT = 1 << 13;
+
+ private static final int IN_VERSION = 1 << 14;
+
+ private static final int IN_TARGET_MILESTONES = 1 << 15;
+
+ private static final int IN_TARGET_MILESTONE = 1 << 16;
+
+ private static final int IN_STATUS_OPEN = 1 << 17;
+
+ private static final int IN_RESOLUTION = 1 << 18;
+
+ private static final int IN_KEYWORD = 1 << 19;
+
+ private int state = EXPECTING_ROOT;
+
+ private String currentProduct;
+
+ private String about;
+
+ private RepositoryConfiguration configuration = new RepositoryConfiguration(new BugzillaAttributeFactory());
+
+ private Map<String, List<String>> components = new HashMap<String, List<String>>();
+
+ private Map<String, List<String>> versions = new HashMap<String, List<String>>();
+
+ private Map<String, List<String>> milestones = new HashMap<String, List<String>>();
+
+ private Map<String, String> componentNames = new HashMap<String, String>();
+
+ private Map<String, String> versionNames = new HashMap<String, String>();
+
+ private Map<String, String> milestoneNames = new HashMap<String, String>();
+
+ public RepositoryConfiguration getConfiguration() {
+ return configuration;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ switch (state) {
+
+ case IN_PRODUCTS | IN_LI | IN_NAME:
+ configuration.addProduct(String.copyValueOf(ch, start, length));
+ currentProduct = String.copyValueOf(ch, start, length);
+ break;
+ case IN_COMPONENTS | IN_LI | IN_COMPONENT | IN_NAME:
+ if (about != null) {
+ String name = String.copyValueOf(ch, start, length);
+ componentNames.put(about, name);
+ }
+ break;
+ case IN_VERSIONS | IN_LI | IN_VERSION | IN_NAME:
+ if (about != null) {
+ String name = String.copyValueOf(ch, start, length);
+ versionNames.put(about, name);
+ }
+ break;
+ case IN_TARGET_MILESTONES | IN_LI | IN_TARGET_MILESTONE | IN_NAME:
+ if (about != null) {
+ String name = String.copyValueOf(ch, start, length);
+ milestoneNames.put(about, name);
+ }
+ break;
+ case IN_PLATFORM | IN_LI:
+ configuration.addPlatform(String.copyValueOf(ch, start, length));
+ break;
+ case IN_OP_SYS | IN_LI:
+ configuration.addAttributeValue(BugzillaReportElement.OP_SYS.getKeyString(), String.copyValueOf(ch, start, length));
+ configuration.addOS(String.copyValueOf(ch, start, length));
+ break;
+ case IN_PRIORITY | IN_LI:
+ configuration.addPriority(String.copyValueOf(ch, start, length));
+ break;
+ case IN_SEVERITY | IN_LI:
+ configuration.addSeverity(String.copyValueOf(ch, start, length));
+ break;
+ case IN_INSTALL_VERSION:
+ configuration.setInstallVersion(String.copyValueOf(ch, start, length));
+ break;
+ case IN_STATUS | IN_LI:
+ configuration.addStatus(String.copyValueOf(ch, start, length));
+ break;
+ case IN_RESOLUTION | IN_LI:
+ configuration.addResolution(String.copyValueOf(ch, start, length));
+ break;
+ case IN_KEYWORD | IN_LI:
+ configuration.addAttributeValue(BugzillaReportElement.KEYWORDS.getKeyString(), String.copyValueOf(ch, start, length));
+ configuration.addKeyword(String.copyValueOf(ch, start, length));
+ break;
+ case IN_STATUS_OPEN | IN_LI:
+ configuration.addOpenStatusValue(String.copyValueOf(ch, start, length));
+ break;
+ }
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+
+ if (localName.equals(ELEMENT_STATUS)) {
+ state = state | IN_STATUS;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI) == IN_LI)) {
+ state = state | IN_LI_LI;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI) != IN_LI)) {
+ state = state | IN_LI;
+ } else if (localName.equals(ELEMENT_PLATFORM)) {
+ state = state | IN_PLATFORM;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state | IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_PRIORITY)) {
+ state = state | IN_PRIORITY;
+ } else if (localName.equals(ELEMENT_SEVERITY)) {
+ state = state | IN_SEVERITY;
+ } else if (localName.equals(ELEMENT_PRODUCTS)) {
+ state = state | IN_PRODUCTS;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state | IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_NAME)) {
+ state = state | IN_NAME;
+ } else if (localName.equals(ELEMENT_COMPONENTS)) {
+ state = state | IN_COMPONENTS;
+ } else if (localName.equals(ELEMENT_COMPONENT)) {
+ state = state | IN_COMPONENT;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_VERSIONS)) {
+ state = state | IN_VERSIONS;
+ } else if (localName.equals(ELEMENT_VERSION)) {
+ state = state | IN_VERSION;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_INSTALL_VERSION)) {
+ state = state | IN_INSTALL_VERSION;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONES)) {
+ state = state | IN_TARGET_MILESTONES;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONE)) {
+ state = state | IN_TARGET_MILESTONE;
+ parseResource(attributes);
+ } else if (localName.equals(ELEMENT_STATUS_OPEN)) {
+ state = state | IN_STATUS_OPEN;
+ } else if (localName.equals(ELEMENT_RESOLUTION)) {
+ state = state | IN_RESOLUTION;
+ } else if (localName.equals(ELEMENT_KEYWORD)) {
+ state = state | IN_KEYWORD;
+ }
+
+ }
+
+ private void parseResource(Attributes attributes) {
+
+ switch (state) {
+ case IN_PRODUCTS | IN_LI | IN_COMPONENTS | IN_LI_LI:
+ if (attributes != null) {
+ String compURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (compURI != null) {
+
+ List<String> compURIs = components.get(currentProduct);
+ if (compURIs == null) {
+ compURIs = new ArrayList<String>();
+ components.put(currentProduct, compURIs);
+ }
+ compURIs.add(compURI);
+
+ }
+ }
+ break;
+ case IN_PRODUCTS | IN_LI | IN_VERSIONS | IN_LI_LI:
+ if (attributes != null) {
+ String resourceURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (resourceURI != null) {
+ List<String> versionUris = versions.get(currentProduct);
+ if (versionUris == null) {
+ versionUris = new ArrayList<String>();
+ versions.put(currentProduct, versionUris);
+ }
+ versionUris.add(resourceURI);
+ }
+ }
+ break;
+ case IN_PRODUCTS | IN_LI | IN_TARGET_MILESTONES | IN_LI_LI:
+ if (attributes != null) {
+ String resourceURI = attributes.getValue(ATTRIBUTE_RESOURCE);
+ if (resourceURI != null) {
+ List<String> milestoneUris = milestones.get(currentProduct);
+ if (milestoneUris == null) {
+ milestoneUris = new ArrayList<String>();
+ milestones.put(currentProduct, milestoneUris);
+ }
+ milestoneUris.add(resourceURI);
+ }
+ }
+ break;
+ case IN_COMPONENTS | IN_LI | IN_COMPONENT:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+ case IN_VERSIONS | IN_LI | IN_VERSION:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+
+ case IN_TARGET_MILESTONES | IN_LI | IN_TARGET_MILESTONE:
+ if (attributes != null) {
+ about = attributes.getValue(ATTRIBUTE_RDF_ABOUT);
+ }
+ break;
+
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+
+ // KEEP: && ((state & IN_LI) == IN_LI)
+
+ if (localName.equals(ELEMENT_STATUS)) {
+ state = state & ~IN_STATUS;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI_LI) == IN_LI_LI)) {
+ state = state & ~IN_LI_LI;
+ } else if (localName.equals(ELEMENT_LI) && ((state & IN_LI_LI) != IN_LI_LI)) {
+ state = state & ~IN_LI;
+ } else if (localName.equals(ELEMENT_PLATFORM)) {
+ state = state & ~IN_PLATFORM;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state & ~IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_PRIORITY)) {
+ state = state & ~IN_PRIORITY;
+ } else if (localName.equals(ELEMENT_SEVERITY)) {
+ state = state & ~IN_SEVERITY;
+ } else if (localName.equals(ELEMENT_PRODUCTS)) {
+ state = state & ~IN_PRODUCTS;
+ } else if (localName.equals(ELEMENT_OP_SYS)) {
+ state = state & ~IN_OP_SYS;
+ } else if (localName.equals(ELEMENT_NAME)) {
+ state = state & ~IN_NAME;
+ } else if (localName.equals(ELEMENT_COMPONENTS)) {
+ state = state & ~IN_COMPONENTS;
+ } else if (localName.equals(ELEMENT_COMPONENT)) {
+ state = state & ~IN_COMPONENT;
+ } else if (localName.equals(ELEMENT_VERSION)) {
+ state = state & ~IN_VERSION;
+ } else if (localName.equals(ELEMENT_VERSIONS)) {
+ state = state & ~IN_VERSIONS;
+ } else if (localName.equals(ELEMENT_INSTALL_VERSION)) {
+ state = state & ~IN_INSTALL_VERSION;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONE)) {
+ state = state & ~IN_TARGET_MILESTONE;
+ } else if (localName.equals(ELEMENT_TARGET_MILESTONES)) {
+ state = state & ~IN_TARGET_MILESTONES;
+ } else if (localName.equals(ELEMENT_STATUS_OPEN)) {
+ state = state & ~IN_STATUS_OPEN;
+ } else if (localName.equals(ELEMENT_RESOLUTION)) {
+ state = state & ~IN_RESOLUTION;
+ } else if (localName.equals(ELEMENT_KEYWORD)) {
+ state = state & ~IN_KEYWORD;
+ }
+
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+
+ for (String product : components.keySet()) {
+ List<String> componentURIs = components.get(product);
+ for (String uri : componentURIs) {
+ String realName = componentNames.get(uri);
+ if (realName != null) {
+ configuration.addComponent(product, realName);
+ }
+ }
+ }
+
+ for (String product : versions.keySet()) {
+ List<String> versionURIs = versions.get(product);
+ for (String uri : versionURIs) {
+ String realName = versionNames.get(uri);
+ if (realName != null) {
+ configuration.addVersion(product, realName);
+ }
+ }
+
+ }
+
+ for (String product : milestones.keySet()) {
+ List<String> milestoneURIs = milestones.get(product);
+ for (String uri : milestoneURIs) {
+ String realName = milestoneNames.get(uri);
+ if (realName != null) {
+ configuration.addTargetMilestone(product, realName);
+ }
+ }
+
+ }
+ super.endDocument();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/TaskListNotificationManagerTest.java b/org.eclipse.mylyn/developer/src-old/bugzilla/TaskListNotificationManagerTest.java
new file mode 100644
index 0000000..874de69
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/TaskListNotificationManagerTest.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.bugzilla.deprecated;
+
+import junit.framework.TestCase;
+
+import org.eclipse.mylyn.bugzilla.deprecated.BugzillaRepositoryQuery;
+import org.eclipse.mylyn.bugzilla.deprecated.BugzillaTask;
+import org.eclipse.mylyn.internal.provisional.commons.ui.AbstractNotification;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.LocalTask;
+import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListNotificationManager;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotification;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+
+/**
+ * @author Rob Elves
+ * @deprecated
+ */
+ at Deprecated
+public class TaskListNotificationManagerTest extends TestCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testTaskListNotificationReminder() throws InterruptedException {
+
+ AbstractTask task0 = new LocalTask("0", "t0 - test 0");
+ AbstractTask task1 = new LocalTask("1", "t1 - test 1");
+ AbstractTask task2 = new LocalTask("2", "t2 - test 2");
+
+ task0.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday().previous());
+ task1.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday().previous());
+ task2.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday().previous());
+
+ TasksUiPlugin.getTaskList().addTask(task0);
+ TasksUiPlugin.getTaskList().addTask(task1);
+ TasksUiPlugin.getTaskList().addTask(task2);
+
+ TaskListNotificationManager notificationManager = TasksUiPlugin.getTaskListNotificationManager();
+ notificationManager.collectNotifications();
+
+ task0 = TasksUiPlugin.getTaskList().getTask("local-0");
+ assertNotNull(task0);
+ assertTrue(task0.isReminded());
+ task1 = TasksUiPlugin.getTaskList().getTask("local-1");
+ assertNotNull(task1);
+ assertTrue(task1.isReminded());
+ task2 = TasksUiPlugin.getTaskList().getTask("local-2");
+ assertNotNull(task2);
+ assertTrue(task2.isReminded());
+
+ }
+
+ public void testTaskListNotificationIncoming() {
+
+ TaskRepository repository = new TaskRepository("bugzilla", "https://bugs.eclipse.org/bugs");
+ TasksUiPlugin.getRepositoryManager().addRepository(repository);
+ AbstractTask task = new BugzillaTask("https://bugs.eclipse.org/bugs", "142891", "label");
+ assertEquals(SynchronizationState.SYNCHRONIZED, task.getSynchronizationState());
+ assertFalse(task.isNotified());
+ TasksUiPlugin.getTaskList().addTask(task);
+ TaskListNotificationManager notificationManager = TasksUiPlugin.getTaskListNotificationManager();
+ notificationManager.collectNotifications();
+ TaskListNotification notification = new TaskListNotification(task);
+ notification.setDescription("Unread task");
+ assertTrue(notificationManager.getNotifications().contains(notification));
+ task = TasksUiPlugin.getTaskList().getTask("https://bugs.eclipse.org/bugs-142891");
+ assertNotNull(task);
+ assertTrue(task.isNotified());
+ }
+
+ public void testTaskListNotificationQueryIncoming() {
+ BugzillaTask hit = new BugzillaTask("https://bugs.eclipse.org/bugs", "1", "summary");
+ assertFalse(hit.isNotified());
+ BugzillaRepositoryQuery query = new BugzillaRepositoryQuery("https://bugs.eclipse.org/bugs", "queryUrl",
+ "summary");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ TasksUiPlugin.getTaskList().addTask(hit, query);
+
+ TaskListNotificationManager notificationManager = TasksUiPlugin.getTaskListNotificationManager();
+ assertFalse(hit.isNotified());
+ notificationManager.collectNotifications();
+ for (AbstractNotification notification : notificationManager.getNotifications()) {
+ notification.getLabel().equals(hit.getSummary());
+ }
+ //assertTrue(notificationManager.getNotifications().contains(new TaskListNotificationQueryIncoming(hit)));
+ assertTrue(hit.isNotified());
+ }
+
+ public void testTaskListNotificationQueryIncomingRepeats() {
+ TaskTestUtil.resetTaskList();
+ BugzillaTask hit = new BugzillaTask("https://bugs.eclipse.org/bugs", "1", "summary");
+ String hitHandle = hit.getHandleIdentifier();
+ assertFalse(hit.isNotified());
+ BugzillaRepositoryQuery query = new BugzillaRepositoryQuery("https://bugs.eclipse.org/bugs", "queryUrl",
+ "summary");
+ TasksUiPlugin.getTaskList().addQuery(query);
+ TasksUiPlugin.getTaskList().addTask(hit, query);
+ TaskListNotificationManager notificationManager = TasksUiPlugin.getTaskListNotificationManager();
+ notificationManager.collectNotifications();
+ for (AbstractNotification notification : notificationManager.getNotifications()) {
+ notification.getLabel().equals(hit.getSummary());
+ }
+ //assertTrue(notificationManager.getNotifications().iterator().next().equals(new TaskListNotificationQueryIncoming(hit)));
+ assertTrue(hit.isNotified());
+
+ TasksUiPlugin.getTaskListManager().saveTaskList();
+ TaskTestUtil.resetTaskList();
+ assertEquals(0, TasksUiPlugin.getTaskList().getQueries().size());
+ assertTrue(TasksUiPlugin.getTaskListManager().readExistingOrCreateNewList());
+ assertEquals(1, TasksUiPlugin.getTaskList().getQueries().size());
+ BugzillaTask hitLoaded = (BugzillaTask) TasksUiPlugin.getTaskList().getTask(hitHandle);
+ assertNotNull(hitLoaded);
+ assertTrue(hitLoaded.isNotified());
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/ViewBugzillaAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/ViewBugzillaAction.java
new file mode 100644
index 0000000..c5f22f0
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/ViewBugzillaAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.security.auth.login.LoginException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.AbstractBugEditor;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.ExistingBugEditorInput;
+import org.eclipse.mylyn.internal.core.util.MylarStatusHandler;
+import org.eclipse.mylyn.provisional.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylyn.provisional.tasklist.TaskRepository;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.progress.UIJob;
+
+/**
+ * Action performed when the bugs are supposed to be displayed in the editor
+ * window from the favorites list
+ */
+ at Deprecated
+public class ViewBugzillaAction extends UIJob {
+
+ /** List of bugs to be displayed */
+ private List<BugzillaOpenStructure> bugs;
+
+ /**
+ * Constructor
+ *
+ * @param name
+ * The job name
+ * @param bugs
+ * List of bugs to be displayed
+ */
+ public ViewBugzillaAction(String name, List<BugzillaOpenStructure> bugs) {
+ super(name);
+ this.bugs = bugs;
+ }
+
+ @Override
+ public IStatus runInUIThread(IProgressMonitor monitor) {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+
+ // go through each bug and get its id
+ for (Iterator<BugzillaOpenStructure> it = bugs.iterator(); it.hasNext();) {
+ BugzillaOpenStructure bos = it.next();
+
+ }
+ return new Status(IStatus.OK, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "", null);
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/ViewFavoriteAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/ViewFavoriteAction.java
new file mode 100644
index 0000000..3ca9495
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/ViewFavoriteAction.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaOpenStructure;
+import org.eclipse.mylyn.internal.bugzilla.ui.FavoritesView;
+import org.eclipse.mylyn.internal.bugzilla.ui.ViewBugzillaAction;
+
+/**
+ * View a bug from the favorites menu
+ */
+public class ViewFavoriteAction extends AbstractFavoritesAction {
+
+ /** The view to get the result to launch a viewer on */
+ private FavoritesView view;
+
+ /**
+ * Constructor
+ *
+ * @param resultsView
+ * The view to launch a viewer on
+ */
+ public ViewFavoriteAction(FavoritesView resultsView) {
+ setToolTipText("View Selected Favorites");
+ setText("View Selected");
+ setImageDescriptor(BugzillaImages.OPEN);
+ view = resultsView;
+ }
+
+ /**
+ * View the selected bugs in the editor window
+ *
+ * @see org.eclipse.jface.action.IAction#run()
+ */
+ @Override
+ public void run() {
+ FavoritesView.checkWindow();
+ List<BugzillaOpenStructure> selectedBugs = view.getBugIdsOfSelected();
+
+ // if there are some selected bugs view the bugs in the editor window
+ if (!selectedBugs.isEmpty()) {
+ ViewBugzillaAction viewBugs = new ViewBugzillaAction("Display bugs in editor", selectedBugs);
+ viewBugs.schedule();
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/ViewOfflineReportAction.java b/org.eclipse.mylyn/developer/src-old/bugzilla/ViewOfflineReportAction.java
new file mode 100644
index 0000000..8cfa509
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/ViewOfflineReportAction.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2003 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.bugzilla.ui.actions;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.mylyn.bugzilla.core.BugReport;
+import org.eclipse.mylyn.bugzilla.core.IBugzillaBug;
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaPlugin;
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.core.NewBugModel;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaImages;
+import org.eclipse.mylyn.internal.bugzilla.ui.OfflineView;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.ExistingBugEditorInput;
+import org.eclipse.mylyn.internal.bugzilla.ui.editor.NewBugEditorInput;
+import org.eclipse.mylyn.internal.tasklist.MylarTaskListPlugin;
+import org.eclipse.mylyn.internal.tasklist.TaskRepository;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * View a bug from the offlineReports menu
+ *
+ * @author Mik Kersten (hardening of prototype)
+ */
+public class ViewOfflineReportAction extends AbstractOfflineReportsAction {
+
+ /** The view to get the result to launch a viewer on */
+ private OfflineView view;
+
+ /**
+ * Constructor
+ *
+ * @param resultsView
+ * The view to launch a viewer on
+ */
+ public ViewOfflineReportAction(OfflineView resultsView) {
+ setToolTipText("View Selected Offline Reports");
+ setText("View Selected");
+ setImageDescriptor(BugzillaImages.OPEN);
+ view = resultsView;
+ }
+
+ @Override
+ public void run() {
+ OfflineView.checkWindow();
+ List<IBugzillaBug> selectedBugs = view.getSelectedBugs();
+
+ // if there are some selected bugs view the bugs in the editor window
+ if (!selectedBugs.isEmpty()) {
+ IWorkbenchPage page = BugzillaPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ for (Iterator<IBugzillaBug> it = selectedBugs.iterator(); it.hasNext();) {
+ IBugzillaBug bug = it.next();
+ if (bug instanceof BugReport) {
+ TaskRepository repository = MylarTaskListPlugin.getRepositoryManager().getRepository(
+ BugzillaPlugin.REPOSITORY_KIND, bug.getRepository());
+ if (repository != null) {
+ ExistingBugEditorInput editorInput = new ExistingBugEditorInput((BugReport) bug);
+ try {
+ page.openEditor(editorInput, IBugzillaConstants.EXISTING_BUG_EDITOR_ID);
+ } catch (PartInitException e) {
+ BugzillaPlugin.log(e);
+ }
+ }
+ continue;
+ }
+ if (bug instanceof NewBugModel) {
+ NewBugEditorInput editorInput = new NewBugEditorInput((NewBugModel) bug);
+ try {
+ page.openEditor(editorInput, IBugzillaConstants.NEW_BUG_EDITOR_ID);
+ } catch (PartInitException e) {
+ BugzillaPlugin.log(e);
+ }
+ continue;
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/bugzilla/WizardAttributesPage.java b/org.eclipse.mylyn/developer/src-old/bugzilla/WizardAttributesPage.java
new file mode 100644
index 0000000..5c1aef9
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/bugzilla/WizardAttributesPage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.bugzilla.ui.wizard;
+
+import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
+import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Wizard page shown when the user has chosen a product to log a bug for.
+ *
+ * @author Mik Kersten
+ */
+public class WizardAttributesPage extends AbstractBugzillaWizardPage {
+
+ private static final String DESCRIPTION = "Enter Bugzilla report details";
+
+ public WizardAttributesPage(IWorkbench workbench) {
+ super("Page2", IBugzillaConstants.TITLE_NEW_BUG, DESCRIPTION, workbench);
+ setImageDescriptor(BugzillaUiPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.bugzilla.ui",
+ "icons/wizban/bug-wizard.gif"));
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/AbstractNewRepositoryTaskEditor.java b/org.eclipse.mylyn/developer/src-old/editors/AbstractNewRepositoryTaskEditor.java
new file mode 100644
index 0000000..fb504c5
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/AbstractNewRepositoryTaskEditor.java
@@ -0,0 +1,534 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.internal.tasks.core.DateRange;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
+import org.eclipse.mylyn.internal.tasks.ui.ScheduleDatePicker;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.VerifyKeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public abstract class AbstractNewRepositoryTaskEditor extends AbstractRepositoryTaskEditor {
+
+ private static final int DESCRIPTION_WIDTH = 79 * 7; // 500;
+
+ private static final int DESCRIPTION_HEIGHT = 10 * 14;
+
+ private static final int DEFAULT_FIELD_WIDTH = 150;
+
+ private static final int DEFAULT_ESTIMATED_TIME = 1;
+
+ private static final String LABEL_SUMBIT = "Submit";
+
+ private static final String ERROR_CREATING_BUG_REPORT = "Error creating bug report";
+
+ protected ScheduleDatePicker scheduledForDate;
+
+ protected Spinner estimatedTime;
+
+ @Deprecated
+ protected String newSummary = "";
+
+ protected Button addToCategory;
+
+ protected CCombo categoryChooser;
+
+ /**
+ * @author Raphael Ackermann (bug 195514)
+ */
+ protected class TabVerifyKeyListener implements VerifyKeyListener {
+
+ public void verifyKey(VerifyEvent event) {
+ // if there is a tab key, do not "execute" it and instead select the Attributes section
+ if (event.keyCode == SWT.TAB) {
+ event.doit = false;
+ focusAttributes();
+ }
+ }
+ }
+
+ public AbstractNewRepositoryTaskEditor(FormEditor editor) {
+ super(editor);
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) {
+ if (!(input instanceof NewTaskEditorInput)) {
+ return;
+ }
+
+ initTaskEditor(site, (RepositoryTaskEditorInput) input);
+
+ setTaskOutlineModel(RepositoryTaskOutlineNode.parseBugReport(taskData, false));
+ newSummary = taskData.getSummary();
+ }
+
+ @Override
+ protected void createDescriptionLayout(Composite composite) {
+ FormToolkit toolkit = this.getManagedForm().getToolkit();
+ Section section = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR);
+ section.setText(getSectionLabel(SECTION_NAME.DESCRIPTION_SECTION));
+ section.setExpanded(true);
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Composite descriptionComposite = toolkit.createComposite(section);
+ GridLayout descriptionLayout = new GridLayout();
+
+ descriptionComposite.setLayout(descriptionLayout);
+ GridData descriptionData = new GridData(GridData.FILL_BOTH);
+ descriptionData.grabExcessVerticalSpace = true;
+ descriptionComposite.setLayoutData(descriptionData);
+ section.setClient(descriptionComposite);
+
+ descriptionTextViewer = addTextEditor(repository, descriptionComposite, taskData.getDescription(), true,
+ SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ descriptionTextViewer.setEditable(true);
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.widthHint = DESCRIPTION_WIDTH;
+ gd.minimumHeight = DESCRIPTION_HEIGHT;
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = true;
+ descriptionTextViewer.getControl().setLayoutData(gd);
+ descriptionTextViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+
+ addDuplicateDetection(descriptionComposite);
+
+ toolkit.paintBordersFor(descriptionComposite);
+ }
+
+ /**
+ * @author Raphael Ackermann (modifications) (bug 195514)
+ * @param composite
+ */
+ @Override
+ protected void createSummaryLayout(Composite composite) {
+ addSummaryText(composite);
+ if (summaryTextViewer != null) {
+ summaryTextViewer.prependVerifyKeyListener(new TabVerifyKeyListener());
+ // TODO: Eliminate this and newSummary field when api can be changed
+ summaryTextViewer.getTextWidget().addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ String sel = summaryText.getText();
+ if (!(newSummary.equals(sel))) {
+ newSummary = sel;
+ }
+ }
+ });
+ }
+ }
+
+ @Override
+ protected void createAttachmentLayout(Composite comp) {
+ // currently can't attach while creating new bug
+ }
+
+ @Override
+ protected void createCommentLayout(Composite comp) {
+ // ignore
+ }
+
+ @Override
+ protected void createNewCommentLayout(Composite comp) {
+ createPlanningLayout(comp);
+ }
+
+ protected void createPlanningLayout(Composite comp) {
+ Section section = createSection(comp, "Personal Planning");
+ section.setLayout(new GridLayout());
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ section.setExpanded(true);
+
+ Composite sectionClient = getManagedForm().getToolkit().createComposite(section);
+ section.setClient(sectionClient);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 7;
+ layout.makeColumnsEqualWidth = false;
+ sectionClient.setLayout(layout);
+ GridData clientDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ sectionClient.setLayoutData(clientDataLayout);
+
+ // Scheduled date
+ getManagedForm().getToolkit().createLabel(sectionClient, "Scheduled for:");
+ // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ scheduledForDate = new ScheduleDatePicker(sectionClient, null, SWT.FLAT);
+ scheduledForDate.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
+ scheduledForDate.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+// Calendar newTaskSchedule = TaskActivityUtil.getCalendar();
+// int scheduledEndHour = TasksUiPlugin.getDefault().getPreferenceStore().getInt(
+// TasksUiPreferenceConstants.PLANNING_ENDHOUR);
+ // If past scheduledEndHour set for following day
+// if (newTaskSchedule.get(Calendar.HOUR_OF_DAY) >= scheduledEndHour) {
+// TaskActivityUtil.snapForwardNumDays(newTaskSchedule, 1);
+// } else {
+// TaskActivityUtil.snapEndOfWorkDay(newTaskSchedule);
+// }
+// scheduledForDate.setDate(newTaskSchedule);
+// Button removeReminder = getManagedForm().getToolkit().createButton(sectionClient, "Clear",
+// SWT.PUSH | SWT.CENTER);
+// removeReminder.addSelectionListener(new SelectionAdapter() {
+// @Override
+// public void widgetSelected(SelectionEvent e) {
+// scheduledForDate.setDate(null);
+// }
+// });
+
+ ImageHyperlink clearReminder = getManagedForm().getToolkit().createImageHyperlink(sectionClient, SWT.NONE);
+ clearReminder.setImage(CommonImages.getImage(CommonImages.REMOVE));
+ clearReminder.setToolTipText("Clear");
+ clearReminder.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ scheduledForDate.setScheduledDate(null);
+ }
+ });
+
+ // 1 Blank column after Reminder clear button
+ Label dummy = getManagedForm().getToolkit().createLabel(sectionClient, "");
+ GridData dummyLabelDataLayout = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
+ dummyLabelDataLayout.horizontalSpan = 1;
+ dummyLabelDataLayout.widthHint = 30;
+ dummy.setLayoutData(dummyLabelDataLayout);
+
+ // Estimated time
+ getManagedForm().getToolkit().createLabel(sectionClient, "Estimated hours:");
+ // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+ // estimatedTime = new Spinner(sectionClient, SWT.FLAT);
+ estimatedTime = new Spinner(sectionClient, SWT.FLAT);
+ estimatedTime.setDigits(0);
+ estimatedTime.setMaximum(100);
+ estimatedTime.setMinimum(0);
+ estimatedTime.setIncrement(1);
+ estimatedTime.setSelection(DEFAULT_ESTIMATED_TIME);
+ estimatedTime.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ GridData estimatedDataLayout = new GridData();
+ estimatedDataLayout.widthHint = 30;
+ estimatedTime.setLayoutData(estimatedDataLayout);
+ // getManagedForm().getToolkit().createLabel(sectionClient, "hours ");
+ // label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
+
+ ImageHyperlink clearEstimated = getManagedForm().getToolkit().createImageHyperlink(sectionClient, SWT.NONE);
+ clearEstimated.setImage(CommonImages.getImage(CommonImages.REMOVE));
+ clearEstimated.setToolTipText("Clear");
+ clearEstimated.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ estimatedTime.setSelection(0);
+ }
+ });
+
+ getManagedForm().getToolkit().paintBordersFor(sectionClient);
+ }
+
+ @Override
+ protected void addRadioButtons(Composite buttonComposite) {
+ // Since NewBugModels have no special submitting actions,
+ // no radio buttons are required.
+ }
+
+ @Override
+ protected void createCustomAttributeLayout(Composite composite) {
+ // ignore
+ }
+
+ @Override
+ protected void saveTaskOffline(IProgressMonitor progressMonitor) {
+ taskData.setSummary(newSummary);
+ taskData.setDescription(descriptionTextViewer.getTextWidget().getText());
+ updateEditorTitle();
+ }
+
+ /**
+ * A listener for selection of the summary textbox.
+ */
+ protected class DescriptionListener implements Listener {
+ public void handleEvent(Event event) {
+ fireSelectionChanged(new SelectionChangedEvent(selectionProvider, new StructuredSelection(
+ new RepositoryTaskSelection(taskData.getTaskId(), taskData.getRepositoryUrl(),
+ taskData.getConnectorKind(), "New Description", false, taskData.getSummary()))));
+ }
+ }
+
+ @Override
+ protected void validateInput() {
+ // ignore
+ }
+
+ @Override
+ public boolean isDirty() {
+ return true;
+ }
+
+ /**
+ * @author Raphael Ackermann (bug 198526)
+ */
+ @Override
+ public void setFocus() {
+ if (summaryText != null) {
+ summaryText.setFocus();
+ }
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ /**
+ * Creates the button layout. This displays options and buttons at the bottom of the editor to allow actions to be
+ * performed on the bug.
+ */
+ @Override
+ protected void createActionsLayout(Composite formComposite) {
+ Section section = getManagedForm().getToolkit().createSection(formComposite, ExpandableComposite.TITLE_BAR);
+
+ section.setText(getSectionLabel(SECTION_NAME.ACTIONS_SECTION));
+ section.setExpanded(true);
+ section.setLayout(new GridLayout());
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).applyTo(section);
+
+ Composite buttonComposite = getManagedForm().getToolkit().createComposite(section);
+ buttonComposite.setLayout(new GridLayout(4, false));
+ buttonComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ section.setClient(buttonComposite);
+
+ addToCategory = getManagedForm().getToolkit().createButton(buttonComposite, "Add to Category", SWT.CHECK);
+ categoryChooser = new CCombo(buttonComposite, SWT.FLAT | SWT.READ_ONLY);
+ categoryChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ categoryChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create());
+ getManagedForm().getToolkit().adapt(categoryChooser, true, true);
+ categoryChooser.setFont(TEXT_FONT);
+ ITaskList taskList = TasksUiInternal.getTaskList();
+ List<AbstractTaskCategory> categories = new ArrayList<AbstractTaskCategory>(taskList.getCategories());
+ Collections.sort(categories, new Comparator<AbstractTaskContainer>() {
+
+ public int compare(AbstractTaskContainer c1, AbstractTaskContainer c2) {
+ if (c1.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) {
+ return -1;
+ } else if (c2.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) {
+ return 1;
+ } else {
+ return c1.getSummary().compareToIgnoreCase(c2.getSummary());
+ }
+ }
+
+ });
+
+ for (IRepositoryElement category : categories) {
+ categoryChooser.add(category.getSummary());
+ }
+
+ categoryChooser.select(0);
+ categoryChooser.setEnabled(false);
+ categoryChooser.setData(categories);
+ addToCategory.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ categoryChooser.setEnabled(addToCategory.getSelection());
+ }
+
+ });
+
+ GridDataFactory.fillDefaults().hint(DEFAULT_FIELD_WIDTH, SWT.DEFAULT).span(3, SWT.DEFAULT).applyTo(
+ categoryChooser);
+
+ addActionButtons(buttonComposite);
+
+ getManagedForm().getToolkit().paintBordersFor(buttonComposite);
+ }
+
+ /**
+ * Returns the {@link AbstractTaskContainer category} the new task belongs to
+ *
+ * @return {@link AbstractTaskContainer category} where the new task must be added to, or null if it must not be
+ * added to the task list
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ protected AbstractTaskCategory getCategory() {
+ int index = categoryChooser.getSelectionIndex();
+ if (addToCategory.getSelection() && index != -1) {
+ return ((List<AbstractTaskCategory>) categoryChooser.getData()).get(index);
+ }
+ return null;
+ }
+
+ @Override
+ protected void addActionButtons(Composite buttonComposite) {
+ FormToolkit toolkit = new FormToolkit(buttonComposite.getDisplay());
+ submitButton = toolkit.createButton(buttonComposite, LABEL_SUMBIT, SWT.NONE);
+ GridData submitButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ submitButtonData.widthHint = 100;
+ submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
+ submitButton.setLayoutData(submitButtonData);
+ submitButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ submitToRepository();
+ }
+ });
+ submitButton.setToolTipText("Submit to " + this.repository.getRepositoryUrl());
+ }
+
+ protected boolean prepareSubmit() {
+ submitButton.setEnabled(false);
+ showBusy(true);
+
+ if (summaryText != null && summaryText.getText().trim().equals("")) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(AbstractNewRepositoryTaskEditor.this.getSite().getShell(),
+ ERROR_CREATING_BUG_REPORT, "A summary must be provided with new bug reports.");
+ summaryText.setFocus();
+ submitButton.setEnabled(true);
+ showBusy(false);
+ }
+ });
+ return false;
+ }
+
+ if (descriptionTextViewer != null && descriptionTextViewer.getTextWidget().getText().trim().equals("")) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ MessageDialog.openInformation(AbstractNewRepositoryTaskEditor.this.getSite().getShell(),
+ ERROR_CREATING_BUG_REPORT, "A summary must be provided with new reports.");
+ descriptionTextViewer.getTextWidget().setFocus();
+ submitButton.setEnabled(true);
+ showBusy(false);
+ }
+ });
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ protected void createPeopleLayout(Composite composite) {
+ // ignore, new editor doesn't have people section
+ }
+
+ @Override
+ public AbstractTask updateSubmittedTask(String id, IProgressMonitor monitor) throws CoreException {
+ final AbstractTask newTask = super.updateSubmittedTask(id, monitor);
+
+ if (newTask != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ DateRange selectedDate = null;
+ if (scheduledForDate != null) {
+ selectedDate = scheduledForDate.getScheduledDate();
+ }
+ if (selectedDate != null) {
+ TasksUiPlugin.getTaskActivityManager().setScheduledFor(newTask, selectedDate);
+ }
+
+ if (estimatedTime != null) {
+ newTask.setEstimatedTimeHours(estimatedTime.getSelection());
+ }
+
+ Object selectedObject = null;
+ if (TaskListView.getFromActivePerspective() != null) {
+ selectedObject = ((IStructuredSelection) TaskListView.getFromActivePerspective()
+ .getViewer()
+ .getSelection()).getFirstElement();
+ }
+
+ if (selectedObject instanceof TaskCategory) {
+ TasksUiInternal.getTaskList().addTask(newTask, ((TaskCategory) selectedObject));
+ }
+ }
+ });
+ }
+
+ return newTask;
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ new MessageDialog(null, "Operation not supported", null,
+ "Save of un-submitted new tasks is not currently supported.\nPlease submit all new tasks.",
+ MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0).open();
+ monitor.setCanceled(true);
+ return;
+ }
+
+ @Override
+ public boolean searchForDuplicates() {
+ // called so that the description text is set on taskData before we
+ // search for duplicates
+ this.saveTaskOffline(new NullProgressMonitor());
+ return super.searchForDuplicates();
+ }
+
+ @Override
+ protected boolean supportsRefreshAttributes() {
+ // see bug 212475
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryQueryWizard.java b/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryQueryWizard.java
new file mode 100644
index 0000000..50a75e7
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryQueryWizard.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public abstract class AbstractRepositoryQueryWizard extends Wizard {
+
+ private static final String TITLE = "Edit Repository Query";
+
+ protected final TaskRepository repository;
+
+ protected IRepositoryQuery query;
+
+ protected AbstractRepositoryQueryPage page;
+
+ /**
+ * @since 3.0
+ */
+ public AbstractRepositoryQueryWizard(TaskRepository repository, IRepositoryQuery query) {
+ this.repository = repository;
+ this.query = query;
+ setNeedsProgressMonitor(true);
+ setWindowTitle(TITLE);
+ setDefaultPageImageDescriptor(TasksUiImages.BANNER_REPOSITORY);
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (query != null) {
+ TasksUiInternal.getTaskList().deleteQuery((RepositoryQuery) query);
+ }
+ IRepositoryQuery queryToRun = page != null ? page.getQuery() : this.query;
+ if (queryToRun != null) {
+ TasksUiInternal.getTaskList().addQuery((RepositoryQuery) queryToRun);
+
+ AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ if (connector != null) {
+ TasksUiInternal.synchronizeQuery(connector, (RepositoryQuery) queryToRun, null, true);
+ }
+ }
+
+ return true;
+ }
+
+ public String getQuerySummary() {
+ if (query != null) {
+ return query.getSummary();
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryTaskEditor.java b/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryTaskEditor.java
new file mode 100644
index 0000000..8b05e51
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryTaskEditor.java
@@ -0,0 +1,4051 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import java.io.File;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+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.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ControlContribution;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.jface.fieldassist.FieldDecoration;
+import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
+import org.eclipse.mylyn.internal.tasks.core.CommentQuoter;
+import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyDuplicateDetector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryAttachment;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
+import org.eclipse.mylyn.internal.tasks.ui.PersonProposalLabelProvider;
+import org.eclipse.mylyn.internal.tasks.ui.PersonProposalProvider;
+import org.eclipse.mylyn.internal.tasks.ui.TaskHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AbstractTaskEditorAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AttachAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.AttachScreenshotAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ClearOutgoingAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.NewSubTaskAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.SynchronizeEditorAction;
+import org.eclipse.mylyn.internal.tasks.ui.actions.ToggleTaskActivationAction;
+import org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentTableLabelProvider;
+import org.eclipse.mylyn.internal.tasks.ui.editors.AttachmentsTableContentProvider;
+import org.eclipse.mylyn.internal.tasks.ui.editors.ContentOutlineTools;
+import org.eclipse.mylyn.internal.tasks.ui.editors.IRepositoryTaskAttributeListener;
+import org.eclipse.mylyn.internal.tasks.ui.editors.IRepositoryTaskSelection;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryAttachmentEditorInput;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskEditorDropListener;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlinePage;
+import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskListChangeAdapter;
+import org.eclipse.mylyn.internal.tasks.ui.editors.TaskUrlHyperlink;
+import org.eclipse.mylyn.internal.tasks.ui.search.SearchHitCollector;
+import org.eclipse.mylyn.internal.tasks.ui.util.AttachmentUtil;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.views.UpdateRepositoryConfigurationAction;
+import org.eclipse.mylyn.tasks.core.AbstractDuplicateDetector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.IRepositoryElement;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.ITaskAttachment;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.search.ui.NewSearchUI;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.LocationAdapter;
+import org.eclipse.swt.browser.LocationEvent;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.custom.VerifyKeyListener;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.internal.ObjectActionContributorManager;
+import org.eclipse.ui.internal.WorkbenchImages;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.themes.IThemeManager;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public abstract class AbstractRepositoryTaskEditor extends TaskFormPage {
+
+ private static final String PREF_SORT_ORDER_PREFIX = "org.eclipse.mylyn.editor.comments.sortDirectionUp.";
+
+ private static final String ERROR_NOCONNECTIVITY = "Unable to submit at this time. Check connectivity and retry.";
+
+ private static final String LABEL_HISTORY = "History";
+
+ private static final String LABEL_REPLY = "Reply";
+
+ private static final String LABEL_JOB_SUBMIT = "Submitting to repository";
+
+ private static final String HEADER_DATE_FORMAT = "yyyy-MM-dd HH:mm";
+
+ private static final String ATTACHMENT_DEFAULT_NAME = "attachment";
+
+ private static final String CTYPE_ZIP = "zip";
+
+ private static final String CTYPE_OCTET_STREAM = "octet-stream";
+
+ private static final String CTYPE_TEXT = "text";
+
+ private static final String CTYPE_HTML = "html";
+
+ private static final String LABEL_BROWSER = "Browser";
+
+ private static final String LABEL_DEFAULT_EDITOR = "Default Editor";
+
+ private static final String LABEL_TEXT_EDITOR = "Text Editor";
+
+ protected static final String CONTEXT_MENU_ID = "#MylynRepositoryEditor";
+
+ private FormToolkit toolkit;
+
+ private ScrolledForm form;
+
+ protected TaskRepository repository;
+
+ private static final int RADIO_OPTION_WIDTH = 120;
+
+ private static final Font TITLE_FONT = JFaceResources.getBannerFont();
+
+ protected static final Font TEXT_FONT = JFaceResources.getDefaultFont();
+
+ private static final int DESCRIPTION_WIDTH = 79 * 7; // 500;
+
+ private static final int DESCRIPTION_HEIGHT = 10 * 14;
+
+ protected static final int SUMMARY_HEIGHT = 20;
+
+ private static final String LABEL_BUTTON_SUBMIT = "Submit";
+
+ private static final String LABEL_COPY_URL_TO_CLIPBOARD = "Copy &URL";
+
+ private static final String LABEL_COPY_TO_CLIPBOARD = "Copy Contents";
+
+ private static final String LABEL_SAVE = "Save...";
+
+ private static final String LABEL_SEARCH_DUPS = "Search";
+
+ private static final String LABEL_SELECT_DETECTOR = "Duplicate Detection";
+
+ private RepositoryTaskEditorInput editorInput;
+
+ private TaskEditor parentEditor = null;
+
+ private RepositoryTaskOutlineNode taskOutlineModel = null;
+
+ private boolean expandedStateAttributes = false;
+
+ protected Button submitButton;
+
+ private Table attachmentsTable;
+
+ private boolean refreshEnabled = true;
+
+ private TableViewer attachmentsTableViewer;
+
+ private final String[] attachmentsColumns = { "Name", "Description", "Type", "Size", "Creator", "Created" };
+
+ private final int[] attachmentsColumnWidths = { 140, 160, 100, 70, 100, 100 };
+
+ private Composite editorComposite;
+
+ protected TextViewer summaryTextViewer;
+
+ private ImageHyperlink sortHyperlink;
+
+ private boolean commentSortIsUp = true;
+
+ private boolean commentSortEnable = false;
+
+ private Composite addCommentsComposite;
+
+ /**
+ * WARNING: This is present for backward compatibility only. You can get and set text on this widget but all ui
+ * related changes to this widget will have no affect as ui is now being presented with a StyledText widget. This
+ * simply proxies get/setText calls to the StyledText widget.
+ */
+ protected Text summaryText;
+
+ private TextViewer newCommentTextViewer;
+
+ private org.eclipse.swt.widgets.List ccList;
+
+ private Section commentsSection;
+
+ private Color colorIncoming;
+
+ private boolean hasAttributeChanges = false;
+
+ private boolean showAttachments = true;
+
+ private boolean attachContextEnabled = true;
+
+ protected Button searchForDuplicates;
+
+ protected CCombo duplicateDetectorChooser;
+
+ protected Label duplicateDetectorLabel;
+
+ private boolean ignoreLocationEvents = false;
+
+ private boolean refreshing = false;
+
+ private TaskComment selectedComment = null;
+
+ /**
+ * @author Raphael Ackermann (bug 195514)
+ */
+ private class TabVerifyKeyListener implements VerifyKeyListener {
+
+ public void verifyKey(VerifyEvent event) {
+ // if there is a tab key, do not "execute" it and instead select the Status control
+ if (event.keyCode == SWT.TAB) {
+ event.doit = false;
+ if (headerInfoComposite != null) {
+ headerInfoComposite.setFocus();
+ }
+ }
+ }
+
+ }
+
+ protected enum SECTION_NAME {
+ ATTRIBTUES_SECTION("Attributes"), ATTACHMENTS_SECTION("Attachments"), DESCRIPTION_SECTION("Description"), COMMENTS_SECTION(
+ "Comments"), NEWCOMMENT_SECTION("New Comment"), ACTIONS_SECTION("Actions"), PEOPLE_SECTION("People"), RELATEDBUGS_SECTION(
+ "Related Tasks");
+
+ private String prettyName;
+
+ public String getPrettyName() {
+ return prettyName;
+ }
+
+ SECTION_NAME(String prettyName) {
+ this.prettyName = prettyName;
+ }
+ }
+
+ private final List<IRepositoryTaskAttributeListener> attributesListeners = new ArrayList<IRepositoryTaskAttributeListener>();
+
+ protected RepositoryTaskData taskData;
+
+ protected final ISelectionProvider selectionProvider = new ISelectionProvider() {
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListeners.add(listener);
+ }
+
+ public ISelection getSelection() {
+ RepositoryTaskSelection selection = new RepositoryTaskSelection(taskData.getTaskId(),
+ taskData.getRepositoryUrl(), taskData.getConnectorKind(), "", selectedComment,
+ taskData.getSummary());
+ selection.setIsDescription(true);
+ return selection;
+ }
+
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ selectionChangedListeners.remove(listener);
+ }
+
+ public void setSelection(ISelection selection) {
+ // No implementation.
+ }
+ };
+
+ private final ITaskListChangeListener TASKLIST_CHANGE_LISTENER = new TaskListChangeAdapter() {
+
+ @Override
+ public void containersChanged(Set<TaskContainerDelta> containers) {
+ ITask taskToRefresh = null;
+ for (TaskContainerDelta taskContainerDelta : containers) {
+ if (!localChange && repositoryTask != null && repositoryTask.equals(taskContainerDelta.getElement())) {
+ if (taskContainerDelta.getKind().equals(TaskContainerDelta.Kind.CONTENT)
+ && !taskContainerDelta.isTransient() && !refreshing) {
+ taskToRefresh = (ITask) taskContainerDelta.getElement();
+ break;
+ }
+ }
+ }
+ if (taskToRefresh != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (repositoryTask.getSynchronizationState() == SynchronizationState.INCOMING
+ || repositoryTask.getSynchronizationState() == SynchronizationState.CONFLICT) {
+ parentEditor.setMessage("Task has incoming changes", IMessageProvider.WARNING,
+ new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ refreshEditor();
+ }
+ });
+ setSubmitEnabled(false);
+ } else {
+ refreshEditor();
+ }
+ }
+ });
+ }
+ }
+ };
+
+ private final List<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
+
+ private IRepositoryTaskSelection lastSelected = null;
+
+ /**
+ * Focuses on form widgets when an item in the outline is selected.
+ */
+ private final ISelectionListener selectionListener = new ISelectionListener() {
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if ((part instanceof ContentOutline) && (selection instanceof StructuredSelection)) {
+ Object select = ((StructuredSelection) selection).getFirstElement();
+ if (select instanceof RepositoryTaskOutlineNode) {
+ RepositoryTaskOutlineNode n = (RepositoryTaskOutlineNode) select;
+
+ if (lastSelected != null
+ && ContentOutlineTools.getHandle(n).equals(ContentOutlineTools.getHandle(lastSelected))) {
+ // we don't need to set the selection if it is already
+ // set
+ return;
+ }
+ lastSelected = n;
+
+ boolean highlight = true;
+ if (n.getKey().equals(RepositoryTaskOutlineNode.LABEL_COMMENTS)) {
+ highlight = false;
+ }
+
+ Object data = n.getData();
+ if (n.getKey().equals(RepositoryTaskOutlineNode.LABEL_NEW_COMMENT)) {
+ selectNewComment();
+ } else if (n.getKey().equals(RepositoryTaskOutlineNode.LABEL_DESCRIPTION)
+ && descriptionTextViewer.isEditable()) {
+ focusDescription();
+ } else if (data != null) {
+ select(data, highlight);
+ }
+ }
+ part.setFocus();
+ }
+ }
+ };
+
+ private AbstractTask repositoryTask;
+
+ private Set<RepositoryTaskAttribute> changedAttributes;
+
+ private Menu menu;
+
+ private SynchronizeEditorAction synchronizeEditorAction;
+
+ private ToggleTaskActivationAction activateAction;
+
+ private Action historyAction;
+
+ private Action clearOutgoingAction;
+
+ private Action openBrowserAction;
+
+ private NewSubTaskAction newSubTaskAction;
+
+ private Control lastFocusControl;
+
+ private boolean localChange = false;
+
+ /**
+ * Call upon change to attribute value
+ *
+ * @param attribute
+ * changed attribute
+ */
+ protected boolean attributeChanged(RepositoryTaskAttribute attribute) {
+ if (attribute == null) {
+ return false;
+ }
+ changedAttributes.add(attribute);
+ markDirty(true);
+ validateInput();
+ return true;
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput input) {
+ if (!(input instanceof RepositoryTaskEditorInput)) {
+ return;
+ }
+
+ initTaskEditor(site, (RepositoryTaskEditorInput) input);
+
+ if (taskData != null) {
+ editorInput.setToolTipText(taskData.getLabel());
+ taskOutlineModel = RepositoryTaskOutlineNode.parseBugReport(taskData);
+ }
+ hasAttributeChanges = hasVisibleAttributeChanges();
+ TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER);
+ }
+
+ protected void initTaskEditor(IEditorSite site, RepositoryTaskEditorInput input) {
+ changedAttributes = new HashSet<RepositoryTaskAttribute>();
+ editorInput = input;
+ repositoryTask = editorInput.getRepositoryTask();
+ repository = editorInput.getRepository();
+ taskData = editorInput.getTaskData();
+ if (repositoryTask != null) {
+ TasksUiPlugin.getTaskDataManager().setTaskRead(repositoryTask, true);
+ }
+ connector = (AbstractLegacyRepositoryConnector) TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ commentSortIsUp = TasksUiPlugin.getDefault().getPreferenceStore().getBoolean(
+ PREF_SORT_ORDER_PREFIX + repository.getConnectorKind());
+ setSite(site);
+ setInput(input);
+
+ isDirty = false;
+ }
+
+ public AbstractTask getRepositoryTask() {
+ return repositoryTask;
+ }
+
+ // @Override
+ // public void markDirty(boolean dirty) {
+ // if (repositoryTask != null) {
+ // repositoryTask.setDirty(dirty);
+ // }
+ // super.markDirty(dirty);
+ // }
+
+// /**
+// * Update task state
+// */
+// protected void updateTask() {
+// if (taskData == null)
+// return;
+// if (repositoryTask != null) {
+// TasksUiPlugin.getSynchronizationManager().saveOutgoing(repositoryTask, changedAttributes);
+// }
+// if (parentEditor != null) {
+// parentEditor.notifyTaskChanged();
+// }
+// markDirty(false);
+// }
+
+ protected abstract void validateInput();
+
+ /**
+ * Creates a new <code>AbstractTaskEditor</code>.
+ */
+ public AbstractRepositoryTaskEditor(FormEditor editor) {
+ // set the scroll increments so the editor scrolls normally with the
+ // scroll wheel
+ super(editor, "id", "label"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ protected boolean supportsCommentSort() {
+ return false;
+ }
+
+ @Override
+ protected void createFormContent(final IManagedForm managedForm) {
+ IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ colorIncoming = themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_INCOMING_BACKGROUND);
+
+ super.createFormContent(managedForm);
+ form = managedForm.getForm();
+ form.setRedraw(false);
+ try {
+ refreshEnabled = false;
+
+ toolkit = managedForm.getToolkit();
+ registerDropListener(form);
+
+ editorComposite = form.getBody();
+ GridLayout editorLayout = new GridLayout();
+ editorComposite.setLayout(editorLayout);
+ editorComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ if (taskData != null) {
+ createSections();
+ }
+
+ AbstractRepositoryConnectorUi connectorUi = TasksUiPlugin.getConnectorUi(repository.getConnectorKind());
+ if (connectorUi == null) {
+ parentEditor.setMessage("The editor may not be fully loaded", IMessageProvider.INFORMATION,
+ new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ refreshEditor();
+ }
+ });
+ }
+
+ updateHeaderControls();
+ if (summaryTextViewer != null) {
+ summaryTextViewer.getTextWidget().setFocus();
+ }
+
+ form.setRedraw(true);
+ } finally {
+ refreshEnabled = true;
+ }
+
+ form.reflow(true);
+ }
+
+ private void updateHeaderControls() {
+ if (taskData == null) {
+ parentEditor.setMessage(
+ "Task data not available. Press synchronize button (right) to retrieve latest data.",
+ IMessageProvider.WARNING, new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (synchronizeEditorAction != null) {
+ synchronizeEditorAction.run();
+ }
+ }
+ });
+ }
+ getParentEditor().updateHeaderToolBar();
+ }
+
+ /**
+ * Override for customizing the toolbar.
+ *
+ * @since 2.1 (NOTE: likely to change for 3.0)
+ */
+ public void fillToolBar(IToolBarManager toolBarManager) {
+ ControlContribution repositoryLabelControl = new ControlContribution("Title") { //$NON-NLS-1$
+ @Override
+ protected Control createControl(Composite parent) {
+ Composite composite = toolkit.createComposite(parent);
+ composite.setLayout(new RowLayout());
+ composite.setBackground(null);
+ String label = repository.getRepositoryLabel();
+ if (label.indexOf("//") != -1) {
+ label = label.substring((repository.getRepositoryUrl().indexOf("//") + 2));
+ }
+
+ Hyperlink link = new Hyperlink(composite, SWT.NONE);
+ link.setText(label);
+ link.setFont(TITLE_FONT);
+ link.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ link.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ TasksUiUtil.openEditRepositoryWizard(repository);
+ }
+ });
+
+ return composite;
+ }
+ };
+ toolBarManager.add(repositoryLabelControl);
+
+ if ((taskData != null && !taskData.isNew()) || repositoryTask != null) {
+ synchronizeEditorAction = new SynchronizeEditorAction();
+ synchronizeEditorAction.selectionChanged(new StructuredSelection(this));
+ toolBarManager.add(synchronizeEditorAction);
+ }
+
+ if (taskData != null && !taskData.isNew()) {
+ if (repositoryTask != null) {
+ clearOutgoingAction = new ClearOutgoingAction(
+ Collections.singletonList((IRepositoryElement) repositoryTask));
+
+ if (clearOutgoingAction.isEnabled()) {
+ toolBarManager.add(clearOutgoingAction);
+ }
+
+ newSubTaskAction = new NewSubTaskAction();
+ newSubTaskAction.selectionChanged(newSubTaskAction, new StructuredSelection(getRepositoryTask()));
+ if (newSubTaskAction.isEnabled()) {
+ toolBarManager.add(newSubTaskAction);
+ }
+ }
+
+ if (getHistoryUrl() != null) {
+ historyAction = new Action() {
+ @Override
+ public void run() {
+ TasksUiUtil.openUrl(getHistoryUrl());
+ }
+ };
+
+ historyAction.setImageDescriptor(TasksUiImages.TASK_REPOSITORY_HISTORY);
+ historyAction.setToolTipText(LABEL_HISTORY);
+ toolBarManager.add(historyAction);
+ }
+
+ if (connector != null) {
+ String taskUrl = connector.getTaskUrl(taskData.getRepositoryUrl(), taskData.getTaskKey());
+ if (taskUrl == null && repositoryTask != null && TasksUiInternal.hasValidUrl(repositoryTask)) {
+ taskUrl = repositoryTask.getUrl();
+ }
+
+ final String taskUrlToOpen = taskUrl;
+
+ if (taskUrlToOpen != null) {
+ openBrowserAction = new Action() {
+ @Override
+ public void run() {
+ TasksUiUtil.openUrl(taskUrlToOpen);
+ }
+ };
+
+ openBrowserAction.setImageDescriptor(CommonImages.BROWSER_OPEN_TASK);
+ openBrowserAction.setToolTipText("Open with Web Browser");
+ toolBarManager.add(openBrowserAction);
+ }
+ }
+ }
+ }
+
+ private void createSections() {
+ createSummaryLayout(editorComposite);
+
+ Composite attribComp = createAttributeSection();
+ createAttributeLayout(attribComp);
+ createCustomAttributeLayout(attribComp);
+
+ createRelatedBugsSection(editorComposite);
+
+ if (showAttachments) {
+ createAttachmentLayout(editorComposite);
+ }
+ createDescriptionLayout(editorComposite);
+ createCommentLayout(editorComposite);
+ createNewCommentLayout(editorComposite);
+ Composite bottomComposite = toolkit.createComposite(editorComposite);
+ bottomComposite.setLayout(new GridLayout(2, false));
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(bottomComposite);
+
+ createActionsLayout(bottomComposite);
+ createPeopleLayout(bottomComposite);
+ bottomComposite.pack(true);
+
+ getSite().getPage().addSelectionListener(selectionListener);
+ getSite().setSelectionProvider(selectionProvider);
+
+ FocusListener listener = new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ lastFocusControl = (Control) e.widget;
+ }
+ };
+ addFocusListener(editorComposite, listener);
+ }
+
+ private void addFocusListener(Composite composite, FocusListener listener) {
+ Control[] children = composite.getChildren();
+ for (Control control : children) {
+ if ((control instanceof Text) || (control instanceof Button) || (control instanceof Combo)
+ || (control instanceof CCombo) || (control instanceof Tree) || (control instanceof Table)
+ || (control instanceof Spinner) || (control instanceof Link) || (control instanceof List)
+ || (control instanceof TabFolder) || (control instanceof CTabFolder)
+ || (control instanceof Hyperlink) || (control instanceof FilteredTree)
+ || (control instanceof StyledText)) {
+ control.addFocusListener(listener);
+ }
+ if (control instanceof Composite) {
+ addFocusListener((Composite) control, listener);
+ }
+ }
+ }
+
+ private void removeSections() {
+ menu = editorComposite.getMenu();
+ setMenu(editorComposite, null);
+ for (Control control : editorComposite.getChildren()) {
+ control.dispose();
+ }
+ lastFocusControl = null;
+ }
+
+ /**
+ * @author Raphael Ackermann (modifications) (bug 195514)
+ */
+ protected void createSummaryLayout(Composite composite) {
+ addSummaryText(composite);
+ if (summaryTextViewer != null) {
+ summaryTextViewer.prependVerifyKeyListener(new TabVerifyKeyListener());
+ }
+
+ headerInfoComposite = toolkit.createComposite(composite);
+ GridLayout headerLayout = new GridLayout(11, false);
+ headerLayout.verticalSpacing = 1;
+ headerLayout.marginHeight = 1;
+ headerLayout.marginHeight = 1;
+ headerLayout.marginWidth = 1;
+ headerLayout.horizontalSpacing = 6;
+ headerInfoComposite.setLayout(headerLayout);
+
+ RepositoryTaskAttribute statusAtribute = taskData.getAttribute(RepositoryTaskAttribute.STATUS);
+ addNameValue(headerInfoComposite, statusAtribute);
+ toolkit.paintBordersFor(headerInfoComposite);
+
+ RepositoryTaskAttribute priorityAttribute = taskData.getAttribute(RepositoryTaskAttribute.PRIORITY);
+ addNameValue(headerInfoComposite, priorityAttribute);
+
+ String idLabel = (repositoryTask != null) ? repositoryTask.getTaskKey() : taskData.getTaskKey();
+ if (idLabel != null) {
+
+ Composite nameValue = toolkit.createComposite(headerInfoComposite);
+ nameValue.setLayout(new GridLayout(2, false));
+ Label label = toolkit.createLabel(nameValue, "ID:");// .setFont(TITLE_FONT);
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ // toolkit.createText(nameValue, idLabel, SWT.FLAT | SWT.READ_ONLY);
+ Text text = new Text(nameValue, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(text, true, true);
+ text.setText(idLabel);
+ }
+
+ String openedDateString = "";
+ String modifiedDateString = "";
+ final AbstractTaskDataHandler taskDataManager = connector.getLegacyTaskDataHandler();
+ if (taskDataManager != null) {
+ Date created = taskData.getAttributeFactory().getDateForAttributeType(
+ RepositoryTaskAttribute.DATE_CREATION, taskData.getCreated());
+ openedDateString = created != null ? new SimpleDateFormat(HEADER_DATE_FORMAT).format(created) : "";
+
+ Date modified = taskData.getAttributeFactory().getDateForAttributeType(
+ RepositoryTaskAttribute.DATE_MODIFIED, taskData.getLastModified());
+ modifiedDateString = modified != null ? new SimpleDateFormat(HEADER_DATE_FORMAT).format(modified) : "";
+ }
+
+ RepositoryTaskAttribute creationAttribute = taskData.getAttribute(RepositoryTaskAttribute.DATE_CREATION);
+ if (creationAttribute != null) {
+ Composite nameValue = toolkit.createComposite(headerInfoComposite);
+ nameValue.setLayout(new GridLayout(2, false));
+ createLabel(nameValue, creationAttribute);
+ // toolkit.createText(nameValue, openedDateString, SWT.FLAT |
+ // SWT.READ_ONLY);
+ Text text = new Text(nameValue, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(text, true, true);
+ text.setText(openedDateString);
+ }
+
+ RepositoryTaskAttribute modifiedAttribute = taskData.getAttribute(RepositoryTaskAttribute.DATE_MODIFIED);
+ if (modifiedAttribute != null) {
+ Composite nameValue = toolkit.createComposite(headerInfoComposite);
+ nameValue.setLayout(new GridLayout(2, false));
+ createLabel(nameValue, modifiedAttribute);
+ // toolkit.createText(nameValue, modifiedDateString, SWT.FLAT |
+ // SWT.READ_ONLY);
+ Text text = new Text(nameValue, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(text, true, true);
+ text.setText(modifiedDateString);
+ }
+ }
+
+ private void addNameValue(Composite parent, RepositoryTaskAttribute attribute) {
+ Composite nameValue = toolkit.createComposite(parent);
+ nameValue.setLayout(new GridLayout(2, false));
+ if (attribute != null) {
+ createLabel(nameValue, attribute);
+ createTextField(nameValue, attribute, SWT.FLAT | SWT.READ_ONLY);
+ }
+ }
+
+ /**
+ * Utility method to create text field sets background to TaskListColorsAndFonts.COLOR_ATTRIBUTE_CHANGED if
+ * attribute has changed.
+ *
+ * @param composite
+ * @param attribute
+ * @param style
+ */
+ protected Text createTextField(Composite composite, RepositoryTaskAttribute attribute, int style) {
+ String value;
+ if (attribute == null || attribute.getValue() == null) {
+ value = "";
+ } else {
+ value = attribute.getValue();
+ }
+
+ final Text text;
+ if ((SWT.READ_ONLY & style) == SWT.READ_ONLY) {
+ text = new Text(composite, style);
+ toolkit.adapt(text, true, true);
+ text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
+ text.setText(value);
+ } else {
+ text = toolkit.createText(composite, value, style);
+ }
+
+ if (attribute != null && !attribute.isReadOnly()) {
+ text.setData(attribute);
+ text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ String newValue = text.getText();
+ RepositoryTaskAttribute attribute = (RepositoryTaskAttribute) text.getData();
+ attribute.setValue(newValue);
+ attributeChanged(attribute);
+ }
+ });
+ }
+ if (hasChanged(attribute)) {
+ text.setBackground(colorIncoming);
+ }
+ return text;
+ }
+
+ protected Label createLabel(Composite composite, RepositoryTaskAttribute attribute) {
+ Label label;
+ if (hasOutgoingChange(attribute)) {
+ label = toolkit.createLabel(composite, "*" + attribute.getName());
+ } else {
+ label = toolkit.createLabel(composite, attribute.getName());
+ }
+ label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ return label;
+ }
+
+ public String getSectionLabel(SECTION_NAME labelName) {
+ return labelName.getPrettyName();
+ }
+
+ protected Composite createAttributeSection() {
+ attributesSection = createSection(editorComposite, getSectionLabel(SECTION_NAME.ATTRIBTUES_SECTION),
+ expandedStateAttributes || hasAttributeChanges);
+
+ Composite toolbarComposite = toolkit.createComposite(attributesSection);
+ toolbarComposite.setBackground(null);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.marginTop = 0;
+ rowLayout.marginBottom = 0;
+ toolbarComposite.setLayout(rowLayout);
+ UpdateRepositoryConfigurationAction repositoryConfigRefresh = new UpdateRepositoryConfigurationAction() {
+ @Override
+ public void performUpdate(TaskRepository repository, AbstractRepositoryConnector connector,
+ IProgressMonitor monitor) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ setGlobalBusy(true);
+
+ }
+ });
+ try {
+ super.performUpdate(repository, connector, monitor);
+ if (connector != null) {
+ TasksUiInternal.synchronizeTask(connector, repositoryTask, true, new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ refreshEditor();
+ }
+ });
+
+ }
+ });
+ }
+ } catch (Exception e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ refreshEditor();
+ }
+ });
+ }
+ }
+ };
+ repositoryConfigRefresh.setImageDescriptor(TasksUiImages.REPOSITORY_SYNCHRONIZE_SMALL);
+ repositoryConfigRefresh.selectionChanged(new StructuredSelection(repository));
+ repositoryConfigRefresh.setToolTipText("Refresh Attributes");
+
+ ToolBarManager barManager = new ToolBarManager(SWT.FLAT);
+ barManager.add(repositoryConfigRefresh);
+ repositoryConfigRefresh.setEnabled(supportsRefreshAttributes());
+ barManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ barManager.createControl(toolbarComposite);
+ attributesSection.setTextClient(toolbarComposite);
+
+ // Attributes Composite- this holds all the combo fields and text fields
+ final Composite attribComp = toolkit.createComposite(attributesSection);
+ attribComp.addListener(SWT.MouseDown, new Listener() {
+ public void handleEvent(Event event) {
+ Control focus = event.display.getFocusControl();
+ if (focus instanceof Text && ((Text) focus).getEditable() == false) {
+ form.setFocus();
+ }
+ }
+ });
+ attributesSection.setClient(attribComp);
+
+ GridLayout attributesLayout = new GridLayout();
+ attributesLayout.numColumns = 4;
+ attributesLayout.horizontalSpacing = 5;
+ attributesLayout.verticalSpacing = 4;
+ attribComp.setLayout(attributesLayout);
+
+ GridData attributesData = new GridData(GridData.FILL_BOTH);
+ attributesData.horizontalSpan = 1;
+ attributesData.grabExcessVerticalSpace = false;
+ attribComp.setLayoutData(attributesData);
+
+ return attribComp;
+ }
+
+ /**
+ * @since 2.2
+ */
+ protected boolean supportsRefreshAttributes() {
+ return true;
+ }
+
+ /**
+ * Creates the attribute section, which contains most of the basic attributes of the task (some of which are
+ * editable).
+ */
+ protected void createAttributeLayout(Composite attributesComposite) {
+ int numColumns = ((GridLayout) attributesComposite.getLayout()).numColumns;
+ int currentCol = 1;
+
+ for (final RepositoryTaskAttribute attribute : taskData.getAttributes()) {
+ if (attribute.isHidden()) {
+ continue;
+ }
+
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ data.horizontalSpan = 1;
+
+ if (attribute.hasOptions() && !attribute.isReadOnly()) {
+ Label label = createLabel(attributesComposite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ final CCombo attributeCombo = new CCombo(attributesComposite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(attributeCombo, true, true);
+ attributeCombo.setFont(TEXT_FONT);
+ attributeCombo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ if (hasChanged(attribute)) {
+ attributeCombo.setBackground(colorIncoming);
+ }
+ attributeCombo.setLayoutData(data);
+
+ List<String> values = attribute.getOptions();
+ if (values != null) {
+ for (String val : values) {
+ if (val != null) {
+ attributeCombo.add(val);
+ }
+ }
+ }
+
+ String value = attribute.getValue();
+ if (value == null) {
+ value = "";
+ }
+ if (attributeCombo.indexOf(value) != -1) {
+ attributeCombo.select(attributeCombo.indexOf(value));
+ }
+ attributeCombo.clearSelection();
+ attributeCombo.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ if (attributeCombo.getSelectionIndex() > -1) {
+ String sel = attributeCombo.getItem(attributeCombo.getSelectionIndex());
+ attribute.setValue(sel);
+ attributeChanged(attribute);
+ attributeCombo.clearSelection();
+ }
+ }
+ });
+ currentCol += 2;
+ } else {
+ Label label = createLabel(attributesComposite, attribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Composite textFieldComposite = toolkit.createComposite(attributesComposite);
+ GridLayout textLayout = new GridLayout();
+ textLayout.marginWidth = 1;
+ textLayout.marginHeight = 2;
+ textFieldComposite.setLayout(textLayout);
+ GridData textData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ textData.horizontalSpan = 1;
+ textData.widthHint = 135;
+
+ if (attribute.isReadOnly()) {
+ final Text text = createTextField(textFieldComposite, attribute, SWT.FLAT | SWT.READ_ONLY);
+ text.setLayoutData(textData);
+ } else {
+ final Text text = createTextField(textFieldComposite, attribute, SWT.FLAT);
+ // text.setFont(COMMENT_FONT);
+ text.setLayoutData(textData);
+ toolkit.paintBordersFor(textFieldComposite);
+ text.setData(attribute);
+
+ if (hasContentAssist(attribute)) {
+ ContentAssistCommandAdapter adapter = applyContentAssist(text,
+ createContentProposalProvider(attribute));
+
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(attribute);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ }
+ }
+
+ currentCol += 2;
+ }
+
+ if (currentCol > numColumns) {
+ currentCol -= numColumns;
+ }
+ }
+
+ // make sure that we are in the first column
+ if (currentCol > 1) {
+ while (currentCol <= numColumns) {
+ toolkit.createLabel(attributesComposite, "");
+ currentCol++;
+ }
+ }
+
+ toolkit.paintBordersFor(attributesComposite);
+ }
+
+ /**
+ * Adds a related bugs section to the bug editor
+ */
+ protected void createRelatedBugsSection(Composite composite) {
+// Section relatedBugsSection = createSection(editorComposite, getSectionLabel(SECTION_NAME.RELATEDBUGS_SECTION));
+// Composite relatedBugsComposite = toolkit.createComposite(relatedBugsSection);
+// relatedBugsComposite.setLayout(new GridLayout(4, false));
+// relatedBugsComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+// relatedBugsSection.setClient(relatedBugsComposite);
+// relatedBugsSection.setExpanded(repositoryTask == null);
+//
+// List<AbstractDuplicateDetector> allCollectors = new ArrayList<AbstractDuplicateDetector>();
+// if (getDuplicateSearchCollectorsList() != null) {
+// allCollectors.addAll(getDuplicateSearchCollectorsList());
+// }
+// if (!allCollectors.isEmpty()) {
+// duplicateDetectorLabel = new Label(relatedBugsComposite, SWT.LEFT);
+// duplicateDetectorLabel.setText(LABEL_SELECT_DETECTOR);
+//
+// duplicateDetectorChooser = new CCombo(relatedBugsComposite, SWT.FLAT | SWT.READ_ONLY | SWT.BORDER);
+//
+// duplicateDetectorChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create());
+// duplicateDetectorChooser.setFont(TEXT_FONT);
+//
+// Collections.sort(allCollectors, new Comparator<AbstractDuplicateDetector>() {
+//
+// public int compare(AbstractDuplicateDetector c1, AbstractDuplicateDetector c2) {
+// return c1.getName().compareToIgnoreCase(c2.getName());
+// }
+//
+// });
+//
+// for (AbstractDuplicateDetector detector : allCollectors) {
+// duplicateDetectorChooser.add(detector.getName());
+// }
+//
+// duplicateDetectorChooser.select(0);
+// duplicateDetectorChooser.setEnabled(true);
+// duplicateDetectorChooser.setData(allCollectors);
+//
+// if (allCollectors.size() > 0) {
+//
+// searchForDuplicates = toolkit.createButton(relatedBugsComposite, LABEL_SEARCH_DUPS, SWT.NONE);
+// GridData searchDuplicatesButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+// searchForDuplicates.setLayoutData(searchDuplicatesButtonData);
+// searchForDuplicates.addListener(SWT.Selection, new Listener() {
+// public void handleEvent(Event e) {
+// searchForDuplicates();
+// }
+// });
+// }
+// } else {
+// Label label = new Label(relatedBugsComposite, SWT.LEFT);
+// label.setText(LABEL_NO_DETECTOR);
+// }
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected AbstractLegacyDuplicateDetector getDuplicateDetector(String name) {
+ String duplicateDetectorName = name.equals("default") ? "Stack Trace" : name;
+ Set<AbstractLegacyDuplicateDetector> allDetectors = getDuplicateDetectorList();
+
+ for (AbstractLegacyDuplicateDetector detector : allDetectors) {
+ if (detector.getName().equals(duplicateDetectorName)) {
+ return detector;
+ }
+ }
+ // didn't find it
+ return null;
+ }
+
+ /**
+ * @since 3.0
+ */
+ protected Set<AbstractLegacyDuplicateDetector> getDuplicateDetectorList() {
+ Set<AbstractLegacyDuplicateDetector> duplicateDetectors = new HashSet<AbstractLegacyDuplicateDetector>();
+ for (AbstractDuplicateDetector abstractDuplicateDetector : TasksUiPlugin.getDefault()
+ .getDuplicateSearchCollectorsList()) {
+ if (abstractDuplicateDetector instanceof AbstractLegacyDuplicateDetector
+ && (abstractDuplicateDetector.getConnectorKind() == null || abstractDuplicateDetector.getConnectorKind()
+ .equals(getConnector().getConnectorKind()))) {
+ duplicateDetectors.add((AbstractLegacyDuplicateDetector) abstractDuplicateDetector);
+ }
+ }
+ return duplicateDetectors;
+ }
+
+ public boolean searchForDuplicates() {
+ String duplicateDetectorName = duplicateDetectorChooser.getItem(duplicateDetectorChooser.getSelectionIndex());
+ AbstractLegacyDuplicateDetector duplicateDetector = getDuplicateDetector(duplicateDetectorName);
+ if (duplicateDetector != null) {
+ RepositoryQuery duplicatesQuery = duplicateDetector.getDuplicatesQuery(repository, taskData);
+ if (duplicatesQuery != null) {
+ SearchHitCollector collector = new SearchHitCollector(TasksUiInternal.getTaskList(), repository,
+ duplicatesQuery);
+ NewSearchUI.runQueryInBackground(collector);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Adds content assist to the given text field.
+ *
+ * @param text
+ * text field to decorate.
+ * @param proposalProvider
+ * instance providing content proposals
+ * @return the ContentAssistCommandAdapter for the field.
+ */
+ protected ContentAssistCommandAdapter applyContentAssist(Text text, IContentProposalProvider proposalProvider) {
+ ControlDecoration controlDecoration = new ControlDecoration(text, (SWT.TOP | SWT.LEFT));
+ controlDecoration.setMarginWidth(0);
+ controlDecoration.setShowHover(true);
+ controlDecoration.setShowOnlyOnFocus(true);
+
+ FieldDecoration contentProposalImage = FieldDecorationRegistry.getDefault().getFieldDecoration(
+ FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
+ controlDecoration.setImage(contentProposalImage.getImage());
+
+ TextContentAdapter textContentAdapter = new TextContentAdapter();
+
+ ContentAssistCommandAdapter adapter = new ContentAssistCommandAdapter(text, textContentAdapter,
+ proposalProvider, "org.eclipse.ui.edit.text.contentAssist.proposals", new char[0]);
+
+ IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench().getService(IBindingService.class);
+ controlDecoration.setDescriptionText(NLS.bind("Content Assist Available ({0})",
+ bindingService.getBestActiveBindingFormattedFor(adapter.getCommandId())));
+
+ return adapter;
+ }
+
+ /**
+ * Creates an IContentProposalProvider to provide content assist proposals for the given attribute.
+ *
+ * @param attribute
+ * attribute for which to provide content assist.
+ * @return the IContentProposalProvider.
+ */
+ protected IContentProposalProvider createContentProposalProvider(RepositoryTaskAttribute attribute) {
+ return new PersonProposalProvider(repositoryTask, taskData);
+ }
+
+ /**
+ * Creates an IContentProposalProvider to provide content assist proposals for the given operation.
+ *
+ * @param operation
+ * operation for which to provide content assist.
+ * @return the IContentProposalProvider.
+ */
+ protected IContentProposalProvider createContentProposalProvider(RepositoryOperation operation) {
+
+ return new PersonProposalProvider(repositoryTask, taskData);
+ }
+
+ protected ILabelProvider createProposalLabelProvider(RepositoryTaskAttribute attribute) {
+ return new PersonProposalLabelProvider();
+ }
+
+ protected ILabelProvider createProposalLabelProvider(RepositoryOperation operation) {
+
+ return new PersonProposalLabelProvider();
+ }
+
+ /**
+ * Called to check if there's content assist available for the given attribute.
+ *
+ * @param attribute
+ * the attribute
+ * @return true if content assist is available for the specified attribute.
+ */
+ protected boolean hasContentAssist(RepositoryTaskAttribute attribute) {
+ return false;
+ }
+
+ /**
+ * Called to check if there's content assist available for the given operation.
+ *
+ * @param operation
+ * the operation
+ * @return true if content assist is available for the specified operation.
+ */
+ protected boolean hasContentAssist(RepositoryOperation operation) {
+ return false;
+ }
+
+ /**
+ * Adds a text editor with spell checking enabled to display and edit the task's summary.
+ *
+ * @author Raphael Ackermann (modifications) (bug 195514)
+ * @param attributesComposite
+ * The composite to add the text editor to.
+ */
+ protected void addSummaryText(Composite attributesComposite) {
+ Composite summaryComposite = toolkit.createComposite(attributesComposite);
+ GridLayout summaryLayout = new GridLayout(2, false);
+ summaryLayout.verticalSpacing = 0;
+ summaryLayout.marginHeight = 2;
+ summaryComposite.setLayout(summaryLayout);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(summaryComposite);
+
+ if (taskData != null) {
+ RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.SUMMARY);
+ if (attribute == null) {
+ taskData.setAttributeValue(RepositoryTaskAttribute.SUMMARY, "");
+ attribute = taskData.getAttribute(RepositoryTaskAttribute.SUMMARY);
+ }
+
+ final RepositoryTaskAttribute summaryAttribute = attribute;
+
+ summaryTextViewer = addTextEditor(repository, summaryComposite, attribute.getValue(), true, SWT.FLAT
+ | SWT.SINGLE);
+ Composite hiddenComposite = new Composite(summaryComposite, SWT.NONE);
+ hiddenComposite.setLayout(new GridLayout());
+ GridData hiddenLayout = new GridData();
+ hiddenLayout.exclude = true;
+ hiddenComposite.setLayoutData(hiddenLayout);
+
+ // bugg#210695 - work around for 2.0 api breakage
+ summaryText = new Text(hiddenComposite, SWT.NONE);
+ summaryText.setText(attribute.getValue());
+ summaryText.addKeyListener(new KeyListener() {
+
+ public void keyPressed(KeyEvent e) {
+ if (summaryTextViewer != null && !summaryTextViewer.getTextWidget().isDisposed()) {
+ String newValue = summaryText.getText();
+ String oldValue = summaryTextViewer.getTextWidget().getText();
+ if (!newValue.equals(oldValue)) {
+ summaryTextViewer.getTextWidget().setText(newValue);
+ summaryAttribute.setValue(newValue);
+ attributeChanged(summaryAttribute);
+ }
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ // ignore
+ }
+ });
+
+ summaryText.addFocusListener(new FocusListener() {
+
+ public void focusGained(FocusEvent e) {
+ summaryTextViewer.getTextWidget().setFocus();
+ }
+
+ public void focusLost(FocusEvent e) {
+ // ignore
+ }
+ });
+
+ summaryTextViewer.setEditable(true);
+ summaryTextViewer.getTextWidget().setIndent(2);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(summaryTextViewer.getControl());
+
+ if (hasChanged(attribute)) {
+ summaryTextViewer.getTextWidget().setBackground(colorIncoming);
+ }
+ summaryTextViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+
+ summaryTextViewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ String newValue = summaryTextViewer.getTextWidget().getText();
+ if (!newValue.equals(summaryAttribute.getValue())) {
+ summaryAttribute.setValue(newValue);
+ attributeChanged(summaryAttribute);
+ }
+ if (summaryText != null && !newValue.equals(summaryText.getText())) {
+ summaryText.setText(newValue);
+ }
+ }
+ });
+
+ }
+ toolkit.paintBordersFor(summaryComposite);
+ }
+
+ protected boolean supportsAttachmentDelete() {
+ return false;
+ }
+
+ protected void deleteAttachment(RepositoryAttachment attachment) {
+
+ }
+
+ protected void createAttachmentLayout(Composite composite) {
+ // TODO: expand to show new attachments
+ Section section = createSection(composite, getSectionLabel(SECTION_NAME.ATTACHMENTS_SECTION), false);
+ section.setText(section.getText() + " (" + taskData.getAttachments().size() + ")");
+ final Composite attachmentsComposite = toolkit.createComposite(section);
+ attachmentsComposite.setLayout(new GridLayout(1, false));
+ attachmentsComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+ section.setClient(attachmentsComposite);
+
+ if (taskData.getAttachments().size() > 0) {
+
+ attachmentsTable = toolkit.createTable(attachmentsComposite, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
+ attachmentsTable.setLinesVisible(true);
+ attachmentsTable.setHeaderVisible(true);
+ attachmentsTable.setLayout(new GridLayout());
+ GridData tableGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ attachmentsTable.setLayoutData(tableGridData);
+
+ for (int i = 0; i < attachmentsColumns.length; i++) {
+ TableColumn column = new TableColumn(attachmentsTable, SWT.LEFT, i);
+ column.setText(attachmentsColumns[i]);
+ column.setWidth(attachmentsColumnWidths[i]);
+ }
+ attachmentsTable.getColumn(3).setAlignment(SWT.RIGHT);
+
+ attachmentsTableViewer = new TableViewer(attachmentsTable);
+ attachmentsTableViewer.setUseHashlookup(true);
+ attachmentsTableViewer.setColumnProperties(attachmentsColumns);
+ ColumnViewerToolTipSupport.enableFor(attachmentsTableViewer, ToolTip.NO_RECREATE);
+
+ final AbstractTaskDataHandler offlineHandler = connector.getLegacyTaskDataHandler();
+ if (offlineHandler != null) {
+ attachmentsTableViewer.setSorter(new ViewerSorter() {
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ RepositoryAttachment attachment1 = (RepositoryAttachment) e1;
+ RepositoryAttachment attachment2 = (RepositoryAttachment) e2;
+ Date created1 = taskData.getAttributeFactory().getDateForAttributeType(
+ RepositoryTaskAttribute.ATTACHMENT_DATE, attachment1.getDateCreated());
+ Date created2 = taskData.getAttributeFactory().getDateForAttributeType(
+ RepositoryTaskAttribute.ATTACHMENT_DATE, attachment2.getDateCreated());
+ if (created1 != null && created2 != null) {
+ return created1.compareTo(created2);
+ } else if (created1 == null && created2 != null) {
+ return -1;
+ } else if (created1 != null && created2 == null) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ });
+ }
+
+ attachmentsTableViewer.setContentProvider(new AttachmentsTableContentProvider(taskData.getAttachments()));
+
+ attachmentsTableViewer.setLabelProvider(new AttachmentTableLabelProvider(this, new LabelProvider(),
+ PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
+
+ attachmentsTableViewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ if (!event.getSelection().isEmpty()) {
+ StructuredSelection selection = (StructuredSelection) event.getSelection();
+ RepositoryAttachment attachment = (RepositoryAttachment) selection.getFirstElement();
+ TasksUiUtil.openUrl(attachment.getUrl());
+ }
+ }
+ });
+
+ attachmentsTableViewer.setInput(taskData);
+
+ final Action openWithBrowserAction = new Action(LABEL_BROWSER) {
+ @Override
+ public void run() {
+ RepositoryAttachment attachment = (RepositoryAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ if (attachment != null) {
+ TasksUiUtil.openUrl(attachment.getUrl());
+ }
+ }
+ };
+
+ final Action openWithDefaultAction = new Action(LABEL_DEFAULT_EDITOR) {
+ @Override
+ public void run() {
+ // browser shortcut
+ RepositoryAttachment attachment = (RepositoryAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ if (attachment == null) {
+ return;
+ }
+
+ if (attachment.getContentType().endsWith(CTYPE_HTML)) {
+ TasksUiUtil.openUrl(attachment.getUrl());
+ return;
+ }
+
+ IStorageEditorInput input = new RepositoryAttachmentEditorInput(repository, attachment);
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page == null) {
+ return;
+ }
+ IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(
+ input.getName());
+ try {
+ page.openEditor(input, desc.getId());
+ } catch (PartInitException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Unable to open editor for: " + attachment.getDescription(), e));
+ }
+ }
+ };
+
+ final Action openWithTextEditorAction = new Action(LABEL_TEXT_EDITOR) {
+ @Override
+ public void run() {
+ RepositoryAttachment attachment = (RepositoryAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ IStorageEditorInput input = new RepositoryAttachmentEditorInput(repository, attachment);
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ if (page == null) {
+ return;
+ }
+
+ try {
+ page.openEditor(input, "org.eclipse.ui.DefaultTextEditor");
+ } catch (PartInitException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Unable to open editor for: " + attachment.getDescription(), e));
+ }
+ }
+ };
+
+ final Action saveAction = new Action(LABEL_SAVE) {
+ @Override
+ public void run() {
+ ITaskAttachment attachment = (ITaskAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ /* Launch Browser */
+ FileDialog fileChooser = new FileDialog(attachmentsTable.getShell(), SWT.SAVE);
+ String fname = attachment.getFileName();
+ // Default name if none is found
+ if (fname.equals("")) {
+ String ctype = attachment.getContentType();
+ if (ctype.endsWith(CTYPE_HTML)) {
+ fname = ATTACHMENT_DEFAULT_NAME + ".html";
+ } else if (ctype.startsWith(CTYPE_TEXT)) {
+ fname = ATTACHMENT_DEFAULT_NAME + ".txt";
+ } else if (ctype.endsWith(CTYPE_OCTET_STREAM)) {
+ fname = ATTACHMENT_DEFAULT_NAME;
+ } else if (ctype.endsWith(CTYPE_ZIP)) {
+ fname = ATTACHMENT_DEFAULT_NAME + "." + CTYPE_ZIP;
+ } else {
+ fname = ATTACHMENT_DEFAULT_NAME + "." + ctype.substring(ctype.indexOf("/") + 1);
+ }
+ }
+ fileChooser.setFileName(fname);
+ String filePath = fileChooser.open();
+ // Check if the dialog was canceled or an error occurred
+ if (filePath == null) {
+ return;
+ }
+
+ DownloadAttachmentJob job = new DownloadAttachmentJob(attachment, new File(filePath));
+ job.setUser(true);
+ job.schedule();
+ }
+ };
+
+ final Action copyURLToClipAction = new Action(LABEL_COPY_URL_TO_CLIPBOARD) {
+ @Override
+ public void run() {
+ RepositoryAttachment attachment = (RepositoryAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ Clipboard clip = new Clipboard(PlatformUI.getWorkbench().getDisplay());
+ clip.setContents(new Object[] { attachment.getUrl() },
+ new Transfer[] { TextTransfer.getInstance() });
+ clip.dispose();
+ }
+ };
+
+ final Action copyToClipAction = new Action(LABEL_COPY_TO_CLIPBOARD) {
+ @Override
+ public void run() {
+ RepositoryAttachment attachment = (RepositoryAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ CopyAttachmentToClipboardJob job = new CopyAttachmentToClipboardJob(attachment);
+ job.setUser(true);
+ job.schedule();
+ }
+ };
+
+ final MenuManager popupMenu = new MenuManager();
+ final Menu menu = popupMenu.createContextMenu(attachmentsTable);
+ attachmentsTable.setMenu(menu);
+ final MenuManager openMenu = new MenuManager("Open With");
+ popupMenu.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ popupMenu.removeAll();
+
+ IStructuredSelection selection = (IStructuredSelection) attachmentsTableViewer.getSelection();
+ if (selection.isEmpty()) {
+ return;
+ }
+
+ if (selection.size() == 1) {
+ RepositoryAttachment att = (RepositoryAttachment) ((StructuredSelection) selection).getFirstElement();
+
+ // reinitialize open menu
+ popupMenu.add(openMenu);
+ openMenu.removeAll();
+
+ IStorageEditorInput input = new RepositoryAttachmentEditorInput(repository, att);
+ IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(
+ input.getName());
+ if (desc != null) {
+ openMenu.add(openWithDefaultAction);
+ }
+ openMenu.add(openWithBrowserAction);
+ openMenu.add(openWithTextEditorAction);
+
+ popupMenu.add(new Separator());
+ popupMenu.add(saveAction);
+
+ popupMenu.add(copyURLToClipAction);
+ if (att.getContentType().startsWith(CTYPE_TEXT) || att.getContentType().endsWith("xml")) {
+ popupMenu.add(copyToClipAction);
+ }
+ }
+ popupMenu.add(new Separator("actions"));
+
+ // TODO: use workbench mechanism for this?
+ ObjectActionContributorManager.getManager().contributeObjectActions(
+ AbstractRepositoryTaskEditor.this, popupMenu, attachmentsTableViewer);
+ }
+ });
+ } else {
+ Label label = toolkit.createLabel(attachmentsComposite, "No attachments");
+ registerDropListener(label);
+ }
+
+ final Composite attachmentControlsComposite = toolkit.createComposite(attachmentsComposite);
+ attachmentControlsComposite.setLayout(new GridLayout(2, false));
+ attachmentControlsComposite.setLayoutData(new GridData(GridData.BEGINNING));
+
+ Button attachFileButton = toolkit.createButton(attachmentControlsComposite, AttachAction.LABEL, SWT.PUSH);
+ attachFileButton.setImage(WorkbenchImages.getImage(ISharedImages.IMG_OBJ_FILE));
+
+ Button attachScreenshotButton = toolkit.createButton(attachmentControlsComposite, AttachScreenshotAction.LABEL,
+ SWT.PUSH);
+ attachScreenshotButton.setImage(CommonImages.getImage(CommonImages.IMAGE_CAPTURE));
+
+ final ITask task = TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(), taskData.getTaskId());
+ if (task == null) {
+ attachFileButton.setEnabled(false);
+ attachScreenshotButton.setEnabled(false);
+ }
+
+ attachFileButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ AbstractTaskEditorAction attachFileAction = new AttachAction();
+ attachFileAction.selectionChanged(new StructuredSelection(task));
+ attachFileAction.setEditor(parentEditor);
+ attachFileAction.run();
+ }
+ });
+
+ attachScreenshotButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ AttachScreenshotAction attachScreenshotAction = new AttachScreenshotAction();
+ attachScreenshotAction.selectionChanged(new StructuredSelection(task));
+ attachScreenshotAction.setEditor(parentEditor);
+ attachScreenshotAction.run();
+ }
+ });
+
+ Button deleteAttachmentButton = null;
+ if (supportsAttachmentDelete()) {
+ deleteAttachmentButton = toolkit.createButton(attachmentControlsComposite, "Delete Attachment...", SWT.PUSH);
+
+ deleteAttachmentButton.addSelectionListener(new SelectionListener() {
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // ignore
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ ITask task = TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(),
+ taskData.getTaskId());
+ if (task == null) {
+ // Should not happen
+ return;
+ }
+ if (AbstractRepositoryTaskEditor.this.isDirty
+ || task.getSynchronizationState().equals(SynchronizationState.OUTGOING)) {
+ MessageDialog.openInformation(attachmentsComposite.getShell(),
+ "Task not synchronized or dirty editor",
+ "Commit edits or synchronize task before deleting attachments.");
+ return;
+ } else {
+ if (attachmentsTableViewer != null
+ && attachmentsTableViewer.getSelection() != null
+ && ((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement() != null) {
+ RepositoryAttachment attachment = (RepositoryAttachment) (((StructuredSelection) attachmentsTableViewer.getSelection()).getFirstElement());
+ deleteAttachment(attachment);
+ submitToRepository();
+ }
+ }
+ }
+ });
+
+ }
+ registerDropListener(section);
+ registerDropListener(attachmentsComposite);
+ registerDropListener(attachFileButton);
+ if (supportsAttachmentDelete()) {
+ registerDropListener(deleteAttachmentButton);
+ }
+ }
+
+ private void registerDropListener(final Control control) {
+ DropTarget target = new DropTarget(control, DND.DROP_COPY | DND.DROP_DEFAULT);
+ final TextTransfer textTransfer = TextTransfer.getInstance();
+ final FileTransfer fileTransfer = FileTransfer.getInstance();
+ Transfer[] types = new Transfer[] { textTransfer, fileTransfer };
+ target.setTransfer(types);
+
+ // Adapted from eclipse.org DND Article by Veronika Irvine, IBM OTI Labs
+ // http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html#_dt10D
+ target.addDropListener(new RepositoryTaskEditorDropListener(this, repository, taskData, fileTransfer,
+ textTransfer, control));
+ }
+
+ protected void createDescriptionLayout(Composite composite) {
+ Section descriptionSection = createSection(composite, getSectionLabel(SECTION_NAME.DESCRIPTION_SECTION));
+ final Composite sectionComposite = toolkit.createComposite(descriptionSection);
+ descriptionSection.setClient(sectionComposite);
+ GridLayout addCommentsLayout = new GridLayout();
+ addCommentsLayout.numColumns = 1;
+ sectionComposite.setLayout(addCommentsLayout);
+
+ RepositoryTaskAttribute attribute = taskData.getDescriptionAttribute();
+ if (attribute != null && !attribute.isReadOnly()) {
+ if (getRenderingEngine() != null) {
+ // composite with StackLayout to hold text editor and preview widget
+ Composite descriptionComposite = toolkit.createComposite(sectionComposite);
+ descriptionComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ GridData descriptionGridData = new GridData(GridData.FILL_BOTH);
+ descriptionGridData.widthHint = DESCRIPTION_WIDTH;
+ descriptionGridData.minimumHeight = DESCRIPTION_HEIGHT;
+ descriptionGridData.grabExcessHorizontalSpace = true;
+ descriptionComposite.setLayoutData(descriptionGridData);
+ final StackLayout descriptionLayout = new StackLayout();
+ descriptionComposite.setLayout(descriptionLayout);
+
+ descriptionTextViewer = addTextEditor(repository, descriptionComposite, taskData.getDescription(),
+ true, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ descriptionLayout.topControl = descriptionTextViewer.getControl();
+ descriptionComposite.layout();
+
+ // composite for edit/preview button
+ Composite buttonComposite = toolkit.createComposite(sectionComposite);
+ buttonComposite.setLayout(new GridLayout());
+ createPreviewButton(buttonComposite, descriptionTextViewer, descriptionComposite, descriptionLayout);
+ } else {
+ descriptionTextViewer = addTextEditor(repository, sectionComposite, taskData.getDescription(), true,
+ SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ final GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ // wrap text at this margin, see comment below
+ gd.widthHint = DESCRIPTION_WIDTH;
+ gd.minimumHeight = DESCRIPTION_HEIGHT;
+ gd.grabExcessHorizontalSpace = true;
+ descriptionTextViewer.getControl().setLayoutData(gd);
+ descriptionTextViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ // the goal is to make the text viewer as big as the text so it does not require scrolling when first drawn
+ // on screen: when the descriptionTextViewer calculates its height it wraps the text according to the widthHint
+ // which does not reflect the actual size of the widget causing the widget to be taller
+ // (actual width > gd.widhtHint) or shorter (actual width < gd.widthHint) therefore the widthHint is tweaked
+ // once in the listener
+ sectionComposite.addControlListener(new ControlAdapter() {
+ private boolean first;
+
+ @Override
+ public void controlResized(ControlEvent e) {
+ if (!first) {
+ first = true;
+ int width = sectionComposite.getSize().x;
+ Point size = descriptionTextViewer.getTextWidget().computeSize(width, SWT.DEFAULT, true);
+ // limit width to parent widget
+ gd.widthHint = width;
+ // limit height to avoid dynamic resizing of the text widget
+ gd.heightHint = Math.min(Math.max(DESCRIPTION_HEIGHT, size.y), DESCRIPTION_HEIGHT * 4);
+ sectionComposite.layout();
+ }
+ }
+ });
+ }
+ descriptionTextViewer.setEditable(true);
+ descriptionTextViewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ String newValue = descriptionTextViewer.getTextWidget().getText();
+ RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.DESCRIPTION);
+ if (attribute != null && !newValue.equals(attribute.getValue())) {
+ attribute.setValue(newValue);
+ attributeChanged(attribute);
+ taskData.setDescription(newValue);
+ }
+ }
+ });
+ StyledText styledText = descriptionTextViewer.getTextWidget();
+ controlBySelectableObject.put(taskData.getDescription(), styledText);
+ } else {
+ String text = taskData.getDescription();
+ descriptionTextViewer = addTextViewer(repository, sectionComposite, text, SWT.MULTI | SWT.WRAP);
+ StyledText styledText = descriptionTextViewer.getTextWidget();
+ GridDataFactory.fillDefaults().hint(DESCRIPTION_WIDTH, SWT.DEFAULT).applyTo(
+ descriptionTextViewer.getControl());
+
+ controlBySelectableObject.put(text, styledText);
+ }
+
+ if (hasChanged(taskData.getAttribute(RepositoryTaskAttribute.DESCRIPTION))) {
+ descriptionTextViewer.getTextWidget().setBackground(colorIncoming);
+ }
+ descriptionTextViewer.getTextWidget().addListener(SWT.FocusIn, new DescriptionListener());
+
+ Composite replyComp = toolkit.createComposite(descriptionSection);
+ replyComp.setLayout(new RowLayout());
+ replyComp.setBackground(null);
+
+ createReplyHyperlink(0, replyComp, taskData.getDescription());
+ descriptionSection.setTextClient(replyComp);
+ addDuplicateDetection(sectionComposite);
+ toolkit.paintBordersFor(sectionComposite);
+
+ if (descriptionTextViewer.isEditable()) {
+ descriptionSection.setExpanded(true);
+ }
+ }
+
+ protected ImageHyperlink createReplyHyperlink(final int commentNum, Composite composite, final String commentBody) {
+ final ImageHyperlink replyLink = new ImageHyperlink(composite, SWT.NULL);
+ toolkit.adapt(replyLink, true, true);
+ replyLink.setImage(CommonImages.getImage(TasksUiImages.COMMENT_REPLY));
+ replyLink.setToolTipText(LABEL_REPLY);
+ // no need for the background - transparency will take care of it
+ replyLink.setBackground(null);
+ // replyLink.setBackground(section.getTitleBarGradientBackground());
+ replyLink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ String oldText = newCommentTextViewer.getDocument().get();
+ StringBuilder strBuilder = new StringBuilder();
+ strBuilder.append(oldText);
+ if (strBuilder.length() != 0) {
+ strBuilder.append("\n");
+ }
+ strBuilder.append(" (In reply to comment #" + commentNum + ")\n");
+ CommentQuoter quoter = new CommentQuoter();
+ strBuilder.append(quoter.quote(commentBody));
+ newCommentTextViewer.getDocument().set(strBuilder.toString());
+ RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.COMMENT_NEW);
+ if (attribute != null) {
+ attribute.setValue(strBuilder.toString());
+ attributeChanged(attribute);
+ }
+ selectNewComment();
+ newCommentTextViewer.getTextWidget().setCaretOffset(strBuilder.length());
+ }
+ });
+
+ return replyLink;
+ }
+
+ protected void addDuplicateDetection(Composite composite) {
+ List<AbstractLegacyDuplicateDetector> allCollectors = new ArrayList<AbstractLegacyDuplicateDetector>();
+ if (getDuplicateDetectorList() != null) {
+ allCollectors.addAll(getDuplicateDetectorList());
+ }
+ if (!allCollectors.isEmpty()) {
+ Section duplicatesSection = toolkit.createSection(composite, ExpandableComposite.TWISTIE
+ | ExpandableComposite.SHORT_TITLE_BAR);
+ duplicatesSection.setText(LABEL_SELECT_DETECTOR);
+ duplicatesSection.setLayout(new GridLayout());
+ GridDataFactory.fillDefaults().indent(SWT.DEFAULT, 15).applyTo(duplicatesSection);
+ Composite relatedBugsComposite = toolkit.createComposite(duplicatesSection);
+ relatedBugsComposite.setLayout(new GridLayout(4, false));
+ relatedBugsComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
+ duplicatesSection.setClient(relatedBugsComposite);
+ duplicateDetectorLabel = new Label(relatedBugsComposite, SWT.LEFT);
+ duplicateDetectorLabel.setText("Detector:");
+
+ duplicateDetectorChooser = new CCombo(relatedBugsComposite, SWT.FLAT | SWT.READ_ONLY);
+ toolkit.adapt(duplicateDetectorChooser, true, true);
+ duplicateDetectorChooser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ duplicateDetectorChooser.setFont(TEXT_FONT);
+ duplicateDetectorChooser.setLayoutData(GridDataFactory.swtDefaults().hint(150, SWT.DEFAULT).create());
+
+ Collections.sort(allCollectors, new Comparator<AbstractLegacyDuplicateDetector>() {
+
+ public int compare(AbstractLegacyDuplicateDetector c1, AbstractLegacyDuplicateDetector c2) {
+ return c1.getName().compareToIgnoreCase(c2.getName());
+ }
+
+ });
+
+ for (AbstractLegacyDuplicateDetector detector : allCollectors) {
+ duplicateDetectorChooser.add(detector.getName());
+ }
+
+ duplicateDetectorChooser.select(0);
+ duplicateDetectorChooser.setEnabled(true);
+ duplicateDetectorChooser.setData(allCollectors);
+
+ if (allCollectors.size() > 0) {
+
+ searchForDuplicates = toolkit.createButton(relatedBugsComposite, LABEL_SEARCH_DUPS, SWT.NONE);
+ GridData searchDuplicatesButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ searchForDuplicates.setLayoutData(searchDuplicatesButtonData);
+ searchForDuplicates.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ searchForDuplicates();
+ }
+ });
+ }
+// } else {
+// Label label = new Label(composite, SWT.LEFT);
+// label.setText(LABEL_NO_DETECTOR);
+
+ toolkit.paintBordersFor(relatedBugsComposite);
+
+ }
+
+ }
+
+ protected void createCustomAttributeLayout(Composite composite) {
+ // override
+ }
+
+ protected void createPeopleLayout(Composite composite) {
+ Section peopleSection = createSection(composite, getSectionLabel(SECTION_NAME.PEOPLE_SECTION));
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).applyTo(peopleSection);
+ Composite peopleComposite = toolkit.createComposite(peopleSection);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginWidth = 5;
+ peopleComposite.setLayout(layout);
+
+ addAssignedTo(peopleComposite);
+ boolean haveRealName = false;
+ RepositoryTaskAttribute reporterAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_REPORTER_NAME);
+ if (reporterAttribute == null) {
+ reporterAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_REPORTER);
+ } else {
+ haveRealName = true;
+ }
+ if (reporterAttribute != null) {
+ Label label = createLabel(peopleComposite, reporterAttribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Text textField = createTextField(peopleComposite, reporterAttribute, SWT.FLAT | SWT.READ_ONLY);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(textField);
+ if (haveRealName) {
+ textField.setText(textField.getText() + " <"
+ + taskData.getAttributeValue(RepositoryTaskAttribute.USER_REPORTER) + ">");
+ }
+ }
+ addSelfToCC(peopleComposite);
+ addCCList(peopleComposite);
+ getManagedForm().getToolkit().paintBordersFor(peopleComposite);
+ peopleSection.setClient(peopleComposite);
+ peopleSection.setEnabled(true);
+ }
+
+ protected void addCCList(Composite attributesComposite) {
+
+ RepositoryTaskAttribute addCCattribute = taskData.getAttribute(RepositoryTaskAttribute.NEW_CC);
+ if (addCCattribute == null) {
+ // TODO: remove once TRAC is priming taskData with NEW_CC attribute
+ taskData.setAttributeValue(RepositoryTaskAttribute.NEW_CC, "");
+ addCCattribute = taskData.getAttribute(RepositoryTaskAttribute.NEW_CC);
+ }
+ if (addCCattribute != null) {
+ Label label = createLabel(attributesComposite, addCCattribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Text text = createTextField(attributesComposite, addCCattribute, SWT.FLAT);
+ GridDataFactory.fillDefaults().hint(150, SWT.DEFAULT).applyTo(text);
+
+ if (hasContentAssist(addCCattribute)) {
+ ContentAssistCommandAdapter adapter = applyContentAssist(text,
+ createContentProposalProvider(addCCattribute));
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(addCCattribute);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ }
+ }
+
+ RepositoryTaskAttribute CCattribute = taskData.getAttribute(RepositoryTaskAttribute.USER_CC);
+ if (CCattribute != null) {
+ Label label = createLabel(attributesComposite, CCattribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.TOP).applyTo(label);
+ ccList = new org.eclipse.swt.widgets.List(attributesComposite, SWT.MULTI | SWT.V_SCROLL);// SWT.BORDER
+ ccList.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ ccList.setFont(TEXT_FONT);
+ GridData ccListData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ ccListData.horizontalSpan = 1;
+ ccListData.widthHint = 150;
+ ccListData.heightHint = 95;
+ ccList.setLayoutData(ccListData);
+ if (hasChanged(taskData.getAttribute(RepositoryTaskAttribute.USER_CC))) {
+ ccList.setBackground(colorIncoming);
+ }
+ java.util.List<String> ccs = taskData.getCc();
+ if (ccs != null) {
+ for (String cc : ccs) {
+ ccList.add(cc);
+ }
+ }
+ java.util.List<String> removedCCs = taskData.getAttributeValues(RepositoryTaskAttribute.REMOVE_CC);
+ if (removedCCs != null) {
+ for (String item : removedCCs) {
+ int i = ccList.indexOf(item);
+ if (i != -1) {
+ ccList.select(i);
+ }
+ }
+ }
+ ccList.addSelectionListener(new SelectionListener() {
+
+ public void widgetSelected(SelectionEvent e) {
+ for (String cc : ccList.getItems()) {
+ int index = ccList.indexOf(cc);
+ if (ccList.isSelected(index)) {
+ List<String> remove = taskData.getAttributeValues(RepositoryTaskAttribute.REMOVE_CC);
+ if (!remove.contains(cc)) {
+ taskData.addAttributeValue(RepositoryTaskAttribute.REMOVE_CC, cc);
+ }
+ } else {
+ taskData.removeAttributeValue(RepositoryTaskAttribute.REMOVE_CC, cc);
+ }
+ }
+ attributeChanged(taskData.getAttribute(RepositoryTaskAttribute.REMOVE_CC));
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+ });
+ toolkit.createLabel(attributesComposite, "");
+ label = toolkit.createLabel(attributesComposite, "(Select to remove)");
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).applyTo(label);
+ }
+
+ }
+
+ /**
+ * A listener for selection of the summary field.
+ *
+ * @since 2.1
+ */
+ protected class DescriptionListener implements Listener {
+ public DescriptionListener() {
+ }
+
+ public void handleEvent(Event event) {
+ fireSelectionChanged(new SelectionChangedEvent(selectionProvider, new StructuredSelection(
+ new RepositoryTaskSelection(taskData.getTaskId(), taskData.getRepositoryUrl(),
+ taskData.getConnectorKind(), getSectionLabel(SECTION_NAME.DESCRIPTION_SECTION), true,
+ taskData.getSummary()))));
+ }
+ }
+
+ protected boolean supportsCommentDelete() {
+ return false;
+ }
+
+ protected void deleteComment(TaskComment comment) {
+
+ }
+
+ private boolean expandCommentSection() {
+ for (final TaskComment taskComment : taskData.getComments()) {
+ if ((repositoryTask != null && repositoryTask.getLastReadTimeStamp() == null)
+ || editorInput.getOldTaskData() == null) {
+ return true;
+ } else if (isNewComment(taskComment)) {
+ return true;
+ }
+ }
+
+ if (taskData.getComments() == null || taskData.getComments().size() == 0) {
+ return false;
+ } else if (editorInput.getTaskData() != null && editorInput.getOldTaskData() != null) {
+ List<TaskComment> newTaskComments = editorInput.getTaskData().getComments();
+ List<TaskComment> oldTaskComments = editorInput.getOldTaskData().getComments();
+ if (newTaskComments == null || oldTaskComments == null) {
+ return true;
+ } else if (newTaskComments.size() != oldTaskComments.size()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void createCommentLayout(Composite composite) {
+ commentsSection = createSection(composite, getSectionLabel(SECTION_NAME.COMMENTS_SECTION),
+ expandCommentSection());
+ commentsSection.setText(commentsSection.getText() + " (" + taskData.getComments().size() + ")");
+
+ final Composite commentsSectionClient = toolkit.createComposite(commentsSection);
+ RowLayout rowLayout = new RowLayout();
+ rowLayout.pack = true;
+ rowLayout.marginLeft = 0;
+ rowLayout.marginBottom = 0;
+ rowLayout.marginTop = 0;
+ commentsSectionClient.setLayout(rowLayout);
+ commentsSectionClient.setBackground(null);
+
+ if (supportsCommentSort()) {
+ sortHyperlink = new ImageHyperlink(commentsSectionClient, SWT.NONE);
+ sortHyperlink.setToolTipText("Change order of comments");
+ toolkit.adapt(sortHyperlink, true, true);
+ sortHyperlink.setBackground(null);
+
+ sortHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ sortComments();
+ }
+ });
+ sortHyperlinkState(false);
+ }
+
+ if (taskData.getComments().size() > 0) {
+ commentsSection.setEnabled(true);
+ commentsSection.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ if (commentsSection.isExpanded()) {
+ if (supportsCommentSort()) {
+ sortHyperlinkState(true);
+ }
+ } else {
+ if (supportsCommentSort()) {
+ sortHyperlinkState(false);
+ }
+ }
+ }
+ });
+
+ ImageHyperlink collapseAllHyperlink = new ImageHyperlink(commentsSectionClient, SWT.NONE);
+ collapseAllHyperlink.setToolTipText("Collapse All Comments");
+ toolkit.adapt(collapseAllHyperlink, true, true);
+ collapseAllHyperlink.setBackground(null);
+ collapseAllHyperlink.setImage(CommonImages.getImage(CommonImages.COLLAPSE_ALL_SMALL));
+ collapseAllHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ hideAllComments();
+ }
+ });
+
+ ImageHyperlink expandAllHyperlink = new ImageHyperlink(commentsSectionClient, SWT.NONE);
+ expandAllHyperlink.setToolTipText("Expand All Comments");
+ toolkit.adapt(expandAllHyperlink, true, true);
+ expandAllHyperlink.setBackground(null);
+ expandAllHyperlink.setImage(CommonImages.getImage(CommonImages.EXPAND_ALL_SMALL));
+ expandAllHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
+ public void run() {
+ revealAllComments();
+ if (supportsCommentSort()) {
+ sortHyperlinkState(true);
+ }
+ }
+ });
+ }
+ });
+ commentsSection.setTextClient(commentsSectionClient);
+ } else {
+ commentsSection.setEnabled(false);
+ }
+
+ // Additional (read-only) Comments Area
+ addCommentsComposite = toolkit.createComposite(commentsSection);
+ commentsSection.setClient(addCommentsComposite);
+ GridLayout addCommentsLayout = new GridLayout();
+ addCommentsLayout.numColumns = 1;
+ addCommentsComposite.setLayout(addCommentsLayout);
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(addCommentsComposite);
+
+ boolean foundNew = false;
+
+ for (final TaskComment taskComment : taskData.getComments()) {
+ final ExpandableComposite expandableComposite = toolkit.createExpandableComposite(addCommentsComposite,
+ ExpandableComposite.TREE_NODE | ExpandableComposite.LEFT_TEXT_CLIENT_ALIGNMENT);
+
+ expandableComposite.setTitleBarForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+
+ final Composite toolbarComp = toolkit.createComposite(expandableComposite);
+ rowLayout = new RowLayout();
+ rowLayout.pack = true;
+ rowLayout.marginLeft = 0;
+ rowLayout.marginBottom = 0;
+ rowLayout.marginTop = 0;
+ toolbarComp.setLayout(rowLayout);
+ toolbarComp.setBackground(null);
+
+ ImageHyperlink formHyperlink = toolkit.createImageHyperlink(toolbarComp, SWT.NONE);
+ formHyperlink.setBackground(null);
+ formHyperlink.setFont(expandableComposite.getFont());
+ formHyperlink.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
+ if (taskComment.getAuthor() != null && taskComment.getAuthor().equalsIgnoreCase(repository.getUserName())) {
+ formHyperlink.setImage(CommonImages.getImage(CommonImages.PERSON_ME_NARROW));
+ } else {
+ formHyperlink.setImage(CommonImages.getImage(CommonImages.PERSON_NARROW));
+ }
+
+ String authorName = taskComment.getAuthorName();
+ String tooltipText = taskComment.getAuthor();
+ if (authorName.length() == 0) {
+ authorName = taskComment.getAuthor();
+ tooltipText = null;
+ }
+
+ formHyperlink.setText(taskComment.getNumber() + ": " + authorName + ", "
+ + formatDate(taskComment.getCreated()));
+
+ formHyperlink.setToolTipText(tooltipText);
+ formHyperlink.setEnabled(true);
+ formHyperlink.setUnderlined(false);
+
+ final Composite toolbarButtonComp = toolkit.createComposite(toolbarComp);
+ RowLayout buttonCompLayout = new RowLayout();
+ buttonCompLayout.marginBottom = 0;
+ buttonCompLayout.marginTop = 0;
+ toolbarButtonComp.setLayout(buttonCompLayout);
+ toolbarButtonComp.setBackground(null);
+
+ if (supportsCommentDelete()) {
+ final ImageHyperlink deleteComment = new ImageHyperlink(toolbarButtonComp, SWT.NULL);
+ toolkit.adapt(deleteComment, true, true);
+ deleteComment.setImage(CommonImages.getImage(CommonImages.REMOVE));
+ deleteComment.setToolTipText("Remove");
+
+ deleteComment.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ deleteComment(taskComment);
+ submitToRepository();
+ }
+ });
+
+ }
+
+ final ImageHyperlink replyLink = createReplyHyperlink(taskComment.getNumber(), toolbarButtonComp,
+ taskComment.getText());
+
+ formHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ toggleExpandableComposite(!expandableComposite.isExpanded(), expandableComposite);
+ }
+
+ @Override
+ public void linkEntered(HyperlinkEvent e) {
+ replyLink.setUnderlined(true);
+ super.linkEntered(e);
+ }
+
+ @Override
+ public void linkExited(HyperlinkEvent e) {
+ replyLink.setUnderlined(false);
+ super.linkExited(e);
+ }
+ });
+
+ expandableComposite.setTextClient(toolbarComp);
+
+ toolbarButtonComp.setVisible(expandableComposite.isExpanded());
+
+ // HACK: This is necessary
+ // due to a bug in SWT's ExpandableComposite.
+ // 165803: Expandable bars should expand when clicking anywhere
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=165803
+ expandableComposite.setData(toolbarButtonComp);
+
+ expandableComposite.setLayout(new GridLayout());
+ expandableComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ final Composite ecComposite = toolkit.createComposite(expandableComposite);
+ GridLayout ecLayout = new GridLayout();
+ ecLayout.marginHeight = 0;
+ ecLayout.marginBottom = 3;
+ ecLayout.marginLeft = 15;
+ ecComposite.setLayout(ecLayout);
+ ecComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ expandableComposite.setClient(ecComposite);
+ // code for outline
+ commentComposites.add(expandableComposite);
+ controlBySelectableObject.put(taskComment, expandableComposite);
+ expandableComposite.addExpansionListener(new ExpansionAdapter() {
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ toolbarButtonComp.setVisible(expandableComposite.isExpanded());
+ TextViewer viewer = null;
+ if (e.getState() && expandableComposite.getData("viewer") == null) {
+ viewer = addTextViewer(repository, ecComposite, taskComment.getText().trim(), SWT.MULTI
+ | SWT.WRAP);
+ expandableComposite.setData("viewer", viewer.getTextWidget());
+ viewer.getTextWidget().addFocusListener(new FocusListener() {
+
+ public void focusGained(FocusEvent e) {
+ selectedComment = taskComment;
+
+ }
+
+ public void focusLost(FocusEvent e) {
+ selectedComment = null;
+ }
+ });
+
+ StyledText styledText = viewer.getTextWidget();
+ GridDataFactory.fillDefaults().hint(DESCRIPTION_WIDTH, SWT.DEFAULT).applyTo(styledText);
+ resetLayout();
+ } else {
+ // dispose viewer
+ if (expandableComposite.getData("viewer") instanceof StyledText) {
+ ((StyledText) expandableComposite.getData("viewer")).dispose();
+ expandableComposite.setData("viewer", null);
+ }
+ resetLayout();
+ }
+ }
+ });
+
+ if ((repositoryTask != null && repositoryTask.getLastReadTimeStamp() == null)
+ || editorInput.getOldTaskData() == null) {
+ // hit or lost task data, expose all comments
+ toggleExpandableComposite(true, expandableComposite);
+ foundNew = true;
+ } else if (isNewComment(taskComment)) {
+ expandableComposite.setBackground(colorIncoming);
+ toggleExpandableComposite(true, expandableComposite);
+ foundNew = true;
+ }
+
+ }
+ if (supportsCommentSort()) {
+ if (commentSortIsUp) {
+ commentSortIsUp = !commentSortIsUp;
+ sortComments();
+ } else {
+ sortHyperlinkState(commentSortEnable);
+ }
+ }
+ if (foundNew) {
+ if (supportsCommentSort()) {
+ sortHyperlinkState(true);
+ }
+ } else if (taskData.getComments() == null || taskData.getComments().size() == 0) {
+ if (supportsCommentSort()) {
+ sortHyperlinkState(false);
+ }
+ } else if (editorInput.getTaskData() != null && editorInput.getOldTaskData() != null) {
+ List<TaskComment> newTaskComments = editorInput.getTaskData().getComments();
+ List<TaskComment> oldTaskComments = editorInput.getOldTaskData().getComments();
+ if (newTaskComments == null || oldTaskComments == null) {
+ if (supportsCommentSort()) {
+ sortHyperlinkState(true);
+ }
+ } else if (newTaskComments.size() != oldTaskComments.size()) {
+ if (supportsCommentSort()) {
+ sortHyperlinkState(true);
+ }
+ }
+ }
+ }
+
+ public String formatDate(String dateString) {
+ return dateString;
+ }
+
+ private boolean isNewComment(TaskComment comment) {
+
+ // Simple test (will not reveal new comments if offline data was lost
+ if (editorInput.getOldTaskData() != null) {
+ return (comment.getNumber() > editorInput.getOldTaskData().getComments().size());
+ }
+ return false;
+
+ // OLD METHOD FOR DETERMINING NEW COMMENTS
+ // if (repositoryTask != null) {
+ // if (repositoryTask.getLastSyncDateStamp() == null) {
+ // // new hit
+ // return true;
+ // }
+ // AbstractRepositoryConnector connector = (AbstractRepositoryConnector)
+ // TasksUiPlugin.getRepositoryManager()
+ // .getRepositoryConnector(taskData.getRepositoryKind());
+ // AbstractTaskDataHandler offlineHandler = connector.getTaskDataHandler();
+ // if (offlineHandler != null) {
+ //
+ // Date lastSyncDate =
+ // taskData.getAttributeFactory().getDateForAttributeType(
+ // RepositoryTaskAttribute.DATE_MODIFIED,
+ // repositoryTask.getLastSyncDateStamp());
+ //
+ // if (lastSyncDate != null) {
+ //
+ // // reduce granularity to minutes
+ // Calendar calLastMod = Calendar.getInstance();
+ // calLastMod.setTimeInMillis(lastSyncDate.getTime());
+ // calLastMod.set(Calendar.SECOND, 0);
+ //
+ // Date commentDate =
+ // taskData.getAttributeFactory().getDateForAttributeType(
+ // RepositoryTaskAttribute.COMMENT_DATE, comment.getCreated());
+ // if (commentDate != null) {
+ //
+ // Calendar calComment = Calendar.getInstance();
+ // calComment.setTimeInMillis(commentDate.getTime());
+ // calComment.set(Calendar.SECOND, 0);
+ // if (calComment.after(calLastMod)) {
+ // return true;
+ // }
+ // }
+ // }
+ // }
+ // }
+ // return false;
+
+ }
+
+ /**
+ * Subclasses that support HTML preview of ticket description and comments override this method to return an
+ * instance of AbstractRenderingEngine
+ *
+ * @return <code>null</code> if HTML preview is not supported for the repository (default)
+ * @since 2.1
+ */
+ protected AbstractRenderingEngine getRenderingEngine() {
+ return null;
+ }
+
+ protected void createNewCommentLayout(Composite composite) {
+ // Section newCommentSection = createSection(composite,
+ // getSectionLabel(SECTION_NAME.NEWCOMMENT_SECTION));
+
+ Section newCommentSection = toolkit.createSection(composite, ExpandableComposite.TITLE_BAR);
+ newCommentSection.setText(getSectionLabel(SECTION_NAME.NEWCOMMENT_SECTION));
+ newCommentSection.setLayout(new GridLayout());
+ newCommentSection.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Composite newCommentsComposite = toolkit.createComposite(newCommentSection);
+ newCommentsComposite.setLayout(new GridLayout());
+
+ // HACK: new new comment attribute not created by connector, create one.
+ if (taskData.getAttribute(RepositoryTaskAttribute.COMMENT_NEW) == null) {
+ taskData.setAttributeValue(RepositoryTaskAttribute.COMMENT_NEW, "");
+ }
+ final RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.COMMENT_NEW);
+
+ if (getRenderingEngine() != null) {
+ // composite with StackLayout to hold text editor and preview widget
+ Composite editPreviewComposite = toolkit.createComposite(newCommentsComposite);
+ GridData editPreviewData = new GridData(GridData.FILL_BOTH);
+ editPreviewData.widthHint = DESCRIPTION_WIDTH;
+ editPreviewData.minimumHeight = DESCRIPTION_HEIGHT;
+ editPreviewData.grabExcessHorizontalSpace = true;
+ editPreviewComposite.setLayoutData(editPreviewData);
+ editPreviewComposite.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+
+ final StackLayout editPreviewLayout = new StackLayout();
+ editPreviewComposite.setLayout(editPreviewLayout);
+
+ newCommentTextViewer = addTextEditor(repository, editPreviewComposite, attribute.getValue(), true, SWT.FLAT
+ | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+
+ editPreviewLayout.topControl = newCommentTextViewer.getControl();
+ editPreviewComposite.layout();
+
+ // composite for edit/preview button
+ Composite buttonComposite = toolkit.createComposite(newCommentsComposite);
+ buttonComposite.setLayout(new GridLayout());
+ createPreviewButton(buttonComposite, newCommentTextViewer, editPreviewComposite, editPreviewLayout);
+ } else {
+ newCommentTextViewer = addTextEditor(repository, newCommentsComposite, attribute.getValue(), true, SWT.FLAT
+ | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ GridData addCommentsTextData = new GridData(GridData.FILL_BOTH);
+ addCommentsTextData.widthHint = DESCRIPTION_WIDTH;
+ addCommentsTextData.minimumHeight = DESCRIPTION_HEIGHT;
+ addCommentsTextData.grabExcessHorizontalSpace = true;
+ newCommentTextViewer.getControl().setLayoutData(addCommentsTextData);
+ newCommentTextViewer.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ }
+ newCommentTextViewer.setEditable(true);
+ newCommentTextViewer.addTextListener(new ITextListener() {
+ public void textChanged(TextEvent event) {
+ String newValue = addCommentsTextBox.getText();
+ if (!newValue.equals(attribute.getValue())) {
+ attribute.setValue(newValue);
+ attributeChanged(attribute);
+ }
+ }
+ });
+
+ newCommentTextViewer.getTextWidget().addListener(SWT.FocusIn, new NewCommentListener());
+ addCommentsTextBox = newCommentTextViewer.getTextWidget();
+
+ newCommentSection.setClient(newCommentsComposite);
+
+ toolkit.paintBordersFor(newCommentsComposite);
+ }
+
+ private Browser addBrowser(Composite parent, int style) {
+ Browser browser = new Browser(parent, style);
+ // intercept links to open tasks in rich editor and urls in separate browser
+ browser.addLocationListener(new LocationAdapter() {
+ @Override
+ public void changing(LocationEvent event) {
+ // ignore events that are caused by manually setting the contents of the browser
+ if (ignoreLocationEvents) {
+ return;
+ }
+
+ if (event.location != null && !event.location.startsWith("about")) {
+ event.doit = false;
+ IHyperlink link = new TaskUrlHyperlink(
+ new Region(0, 0)/* a fake region just to make constructor happy */, event.location);
+ link.open();
+ }
+ }
+
+ });
+
+ return browser;
+ }
+
+ /**
+ * Creates and sets up the button for switching between text editor and HTML preview. Subclasses that support HTML
+ * preview of new comments must override this method.
+ *
+ * @param buttonComposite
+ * the composite that holds the button
+ * @param editor
+ * the TextViewer for editing text
+ * @param previewBrowser
+ * the Browser for displaying the preview
+ * @param editorLayout
+ * the StackLayout of the <code>editorComposite</code>
+ * @param editorComposite
+ * the composite that holds <code>editor</code> and <code>previewBrowser</code>
+ * @since 2.1
+ */
+ private void createPreviewButton(final Composite buttonComposite, final TextViewer editor,
+ final Composite editorComposite, final StackLayout editorLayout) {
+ // create an anonymous object that encapsulates the edit/preview button together with
+ // its state and String constants for button text;
+ // this implementation keeps all information needed to set up the button
+ // in this object and the method parameters, and this method is reused by both the
+ // description section and new comments section.
+ new Object() {
+ private static final String LABEL_BUTTON_PREVIEW = "Preview";
+
+ private static final String LABEL_BUTTON_EDIT = "Edit";
+
+ private int buttonState = 0;
+
+ private Button previewButton;
+
+ private Browser previewBrowser;
+
+ {
+ previewButton = toolkit.createButton(buttonComposite, LABEL_BUTTON_PREVIEW, SWT.PUSH);
+ GridData previewButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ previewButtonData.widthHint = 100;
+ //previewButton.setImage(TasksUiImages.getImage(TasksUiImages.PREVIEW));
+ previewButton.setLayoutData(previewButtonData);
+ previewButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ if (previewBrowser == null) {
+ previewBrowser = addBrowser(editorComposite, SWT.NONE);
+ }
+
+ buttonState = ++buttonState % 2;
+ if (buttonState == 1) {
+ setText(previewBrowser, "Loading preview...");
+ previewWiki(previewBrowser, editor.getTextWidget().getText());
+ }
+ previewButton.setText(buttonState == 0 ? LABEL_BUTTON_PREVIEW : LABEL_BUTTON_EDIT);
+ editorLayout.topControl = (buttonState == 0 ? editor.getControl() : previewBrowser);
+ editorComposite.layout();
+ }
+ });
+ }
+
+ };
+ }
+
+ private void setText(Browser browser, String html) {
+ try {
+ ignoreLocationEvents = true;
+ browser.setText((html != null) ? html : "");
+ } finally {
+ ignoreLocationEvents = false;
+ }
+
+ }
+
+ private void previewWiki(final Browser browser, String sourceText) {
+ final class PreviewWikiJob extends Job {
+ private final String sourceText;
+
+ private String htmlText;
+
+ private IStatus jobStatus;
+
+ public PreviewWikiJob(String sourceText) {
+ super("Formatting Wiki Text");
+
+ if (sourceText == null) {
+ throw new IllegalArgumentException("source text must not be null");
+ }
+
+ this.sourceText = sourceText;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ AbstractRenderingEngine htmlRenderingEngine = getRenderingEngine();
+ if (htmlRenderingEngine == null) {
+ jobStatus = new RepositoryStatus(repository, IStatus.INFO, TasksUiPlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL, "The repository does not support HTML preview.");
+ return Status.OK_STATUS;
+ }
+
+ jobStatus = Status.OK_STATUS;
+ try {
+ htmlText = htmlRenderingEngine.renderAsHtml(repository, sourceText, monitor);
+ } catch (CoreException e) {
+ jobStatus = e.getStatus();
+ }
+ return Status.OK_STATUS;
+ }
+
+ public String getHtmlText() {
+ return htmlText;
+ }
+
+ public IStatus getStatus() {
+ return jobStatus;
+ }
+
+ }
+
+ final PreviewWikiJob job = new PreviewWikiJob(sourceText);
+
+ job.addJobChangeListener(new JobChangeAdapter() {
+
+ @Override
+ public void done(final IJobChangeEvent event) {
+ if (!form.isDisposed()) {
+ if (job.getStatus().isOK()) {
+ getPartControl().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ AbstractRepositoryTaskEditor.this.setText(browser, job.getHtmlText());
+ parentEditor.setMessage(null, IMessageProvider.NONE);
+ }
+ });
+ } else {
+ getPartControl().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ parentEditor.setMessage(job.getStatus().getMessage(), IMessageProvider.ERROR);
+ }
+ });
+ }
+ }
+ super.done(event);
+ }
+ });
+
+ job.setUser(true);
+ job.schedule();
+ }
+
+ /**
+ * Creates the button layout. This displays options and buttons at the bottom of the editor to allow actions to be
+ * performed on the bug.
+ */
+ protected void createActionsLayout(Composite composite) {
+ Section section = createSection(composite, getSectionLabel(SECTION_NAME.ACTIONS_SECTION));
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).applyTo(section);
+ Composite buttonComposite = toolkit.createComposite(section);
+ GridLayout buttonLayout = new GridLayout();
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(buttonComposite);
+ buttonLayout.numColumns = 4;
+ buttonComposite.setLayout(buttonLayout);
+ addRadioButtons(buttonComposite);
+ addActionButtons(buttonComposite);
+ section.setClient(buttonComposite);
+ }
+
+ protected Section createSection(Composite composite, String title) {
+ return createSection(composite, title, true);
+ }
+
+ /**
+ * @Since 2.3
+ */
+ private Section createSection(Composite composite, String title, boolean expandedState) {
+ int style = ExpandableComposite.TITLE_BAR | Section.TWISTIE;
+ if (expandedState) {
+ style |= ExpandableComposite.EXPANDED;
+ }
+ Section section = toolkit.createSection(composite, style);
+ section.setText(title);
+ section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ return section;
+ }
+
+ /**
+ * Adds buttons to this composite. Subclasses can override this method to provide different/additional buttons.
+ *
+ * @param buttonComposite
+ * Composite to add the buttons to.
+ */
+ protected void addActionButtons(Composite buttonComposite) {
+ submitButton = toolkit.createButton(buttonComposite, LABEL_BUTTON_SUBMIT, SWT.NONE);
+ GridData submitButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ submitButtonData.widthHint = 100;
+ submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
+ submitButton.setLayoutData(submitButtonData);
+ submitButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event e) {
+ submitToRepository();
+ }
+ });
+
+ setSubmitEnabled(true);
+
+ toolkit.createLabel(buttonComposite, " ");
+
+ ITask task = TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(), taskData.getTaskId());
+ if (attachContextEnabled && task != null) {
+ addAttachContextButton(buttonComposite, task);
+ }
+ }
+
+ private void setSubmitEnabled(boolean enabled) {
+ if (submitButton != null && !submitButton.isDisposed()) {
+ submitButton.setEnabled(enabled);
+ if (enabled) {
+ submitButton.setToolTipText("Submit to " + this.repository.getRepositoryUrl());
+ }
+ }
+ }
+
+ /**
+ * Override to make hyperlink available. If not overridden hyperlink will simply not be displayed.
+ *
+ * @return url String form of url that points to task's past activity
+ */
+ protected String getHistoryUrl() {
+ return null;
+ }
+
+ protected void saveTaskOffline(IProgressMonitor progressMonitor) {
+ if (taskData == null) {
+ return;
+ }
+ if (repositoryTask != null) {
+ try {
+ localChange = true;
+
+ TasksUiPlugin.getTaskDataManager().saveOutgoing(repositoryTask, changedAttributes);
+ } finally {
+ localChange = false;
+ }
+ }
+ markDirty(false);
+ }
+
+ // once the following bug is fixed, this check for first focus is probably
+ // not needed -> Bug# 172033: Restore editor focus
+ private boolean firstFocus = true;
+
+ @Override
+ public void setFocus() {
+ if (lastFocusControl != null && !lastFocusControl.isDisposed()) {
+ lastFocusControl.setFocus();
+ } else if (firstFocus && summaryTextViewer != null) {
+ summaryTextViewer.getControl().setFocus();
+ firstFocus = false;
+ }
+ }
+
+ /**
+ * Updates the title of the editor
+ *
+ */
+ protected void updateEditorTitle() {
+ setPartName(editorInput.getName());
+ ((TaskEditor) this.getEditor()).updateTitle(editorInput.getName());
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ saveTaskOffline(monitor);
+ updateEditorTitle();
+ updateHeaderControls();
+// fillToolBar(getParentEditor().getTopForm().getToolBarManager());
+ }
+
+ @Override
+ public void doSaveAs() {
+ // we don't save, so no need to implement
+ }
+
+ /**
+ * @return The composite for the whole editor.
+ */
+ public Composite getEditorComposite() {
+ return editorComposite;
+ }
+
+ @Override
+ public void dispose() {
+ TasksUiInternal.getTaskList().removeChangeListener(TASKLIST_CHANGE_LISTENER);
+ getSite().getPage().removeSelectionListener(selectionListener);
+ if (waitCursor != null) {
+ waitCursor.dispose();
+ }
+ if (activateAction != null) {
+ activateAction.dispose();
+ }
+ super.dispose();
+ }
+
+ /**
+ * Fires a <code>SelectionChangedEvent</code> to all listeners registered under
+ * <code>selectionChangedListeners</code>.
+ *
+ * @param event
+ * The selection event.
+ */
+ protected void fireSelectionChanged(final SelectionChangedEvent event) {
+ Object[] listeners = selectionChangedListeners.toArray();
+ for (Object listener : listeners) {
+ final ISelectionChangedListener l = (ISelectionChangedListener) listener;
+ SafeRunnable.run(new SafeRunnable() {
+ public void run() {
+ l.selectionChanged(event);
+ }
+ });
+ }
+ }
+
+ /*----------------------------------------------------------*
+ * CODE TO SCROLL TO A COMMENT OR OTHER PIECE OF TEXT
+ *----------------------------------------------------------*/
+
+ private final HashMap<Object, Control> controlBySelectableObject = new HashMap<Object, Control>();
+
+ private final List<ExpandableComposite> commentComposites = new ArrayList<ExpandableComposite>();
+
+ private StyledText addCommentsTextBox = null;
+
+ protected TextViewer descriptionTextViewer = null;
+
+ private void revealAllComments() {
+ try {
+ form.setRedraw(false);
+ refreshEnabled = false;
+ if (supportsCommentSort()) {
+ sortHyperlinkState(false);
+ }
+
+ if (commentsSection != null && !commentsSection.isExpanded()) {
+ commentsSection.setExpanded(true);
+ if (supportsCommentSort()) {
+ sortHyperlinkState(true);
+ }
+ }
+ for (ExpandableComposite composite : commentComposites) {
+ if (composite.isDisposed()) {
+ continue;
+ }
+ if (!composite.isExpanded()) {
+ toggleExpandableComposite(true, composite);
+ }
+// Composite comp = composite.getParent();
+// while (comp != null && !comp.isDisposed()) {
+// if (comp instanceof ExpandableComposite && !comp.isDisposed()) {
+// ExpandableComposite ex = (ExpandableComposite) comp;
+// setExpandableCompositeState(true, ex);
+//
+// // HACK: This is necessary
+// // due to a bug in SWT's ExpandableComposite.
+// // 165803: Expandable bars should expand when clicking
+// // anywhere
+// // https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=165803
+// if (ex.getData() != null && ex.getData() instanceof Composite) {
+// ((Composite) ex.getData()).setVisible(true);
+// }
+//
+// break;
+// }
+// comp = comp.getParent();
+// }
+ }
+ } finally {
+ refreshEnabled = true;
+ form.setRedraw(true);
+ }
+ resetLayout();
+ }
+
+ private void hideAllComments() {
+ try {
+ refreshEnabled = false;
+
+ for (ExpandableComposite composite : commentComposites) {
+ if (composite.isDisposed()) {
+ continue;
+ }
+
+ if (composite.isExpanded()) {
+ toggleExpandableComposite(false, composite);
+ }
+
+// Composite comp = composite.getParent();
+// while (comp != null && !comp.isDisposed()) {
+// if (comp instanceof ExpandableComposite && !comp.isDisposed()) {
+// ExpandableComposite ex = (ExpandableComposite) comp;
+// setExpandableCompositeState(false, ex);
+//
+// // HACK: This is necessary
+// // due to a bug in SWT's ExpandableComposite.
+// // 165803: Expandable bars should expand when clicking anywhere
+// // https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=165803
+// if (ex.getData() != null && ex.getData() instanceof Composite) {
+// ((Composite) ex.getData()).setVisible(false);
+// }
+//
+// break;
+// }
+// comp = comp.getParent();
+// }
+ }
+
+// if (commentsSection != null) {
+// commentsSection.setExpanded(false);
+// }
+
+ } finally {
+ refreshEnabled = true;
+ }
+ resetLayout();
+ }
+
+ private void sortHyperlinkState(boolean enabled) {
+ commentSortEnable = enabled;
+
+ if (sortHyperlink == null) {
+ return;
+ }
+
+ sortHyperlink.setEnabled(enabled);
+ if (enabled) {
+ if (commentSortIsUp) {
+ sortHyperlink.setImage(CommonImages.getImage(TasksUiImages.COMMENT_SORT_UP));
+ } else {
+ sortHyperlink.setImage(CommonImages.getImage(TasksUiImages.COMMENT_SORT_DOWN));
+ }
+ } else {
+ if (commentSortIsUp) {
+ sortHyperlink.setImage(CommonImages.getImage(TasksUiImages.COMMENT_SORT_UP_GRAY));
+ } else {
+ sortHyperlink.setImage(CommonImages.getImage(TasksUiImages.COMMENT_SORT_DOWN_GRAY));
+ }
+ }
+ }
+
+ private void sortComments() {
+ if (addCommentsComposite != null) {
+ Control[] commentControlList = addCommentsComposite.getChildren();
+ int commentControlListLength = commentControlList.length;
+ for (int i = 1; i < commentControlListLength; i++) {
+ commentControlList[commentControlListLength - i].moveAbove(commentControlList[0]);
+ }
+ }
+ commentSortIsUp = !commentSortIsUp;
+ TasksUiPlugin.getDefault().getPreferenceStore().setValue(
+ PREF_SORT_ORDER_PREFIX + repository.getConnectorKind(), commentSortIsUp);
+ sortHyperlinkState(commentSortEnable);
+ resetLayout();
+ }
+
+ /**
+ * Selects the given object in the editor.
+ *
+ * @param o
+ * The object to be selected.
+ * @param highlight
+ * Whether or not the object should be highlighted.
+ */
+ public boolean select(Object o, boolean highlight) {
+ Control control = controlBySelectableObject.get(o);
+ if (control != null && !control.isDisposed()) {
+
+ // expand all children
+ if (control instanceof ExpandableComposite) {
+ ExpandableComposite ex = (ExpandableComposite) control;
+ if (!ex.isExpanded()) {
+ toggleExpandableComposite(true, ex);
+ }
+ }
+
+ // expand all parents of control
+ Composite comp = control.getParent();
+ while (comp != null) {
+ if (comp instanceof Section) {
+ if (!((Section) comp).isExpanded()) {
+ ((Section) comp).setExpanded(true);
+ }
+ } else if (comp instanceof ExpandableComposite) {
+ ExpandableComposite ex = (ExpandableComposite) comp;
+ if (!ex.isExpanded()) {
+ toggleExpandableComposite(true, ex);
+ }
+
+ // HACK: This is necessary
+ // due to a bug in SWT's ExpandableComposite.
+ // 165803: Expandable bars should expand when clicking anywhere
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=165803
+ if (ex.getData() != null && ex.getData() instanceof Composite) {
+ ((Composite) ex.getData()).setVisible(true);
+ }
+ }
+ comp = comp.getParent();
+ }
+ focusOn(control, highlight);
+ } else if (o instanceof RepositoryTaskData) {
+ focusOn(null, highlight);
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Programmatically expand the provided ExpandableComposite, using reflection to fire the expansion listeners (see
+ * bug#70358)
+ *
+ * @param comp
+ */
+ private void toggleExpandableComposite(boolean expanded, ExpandableComposite comp) {
+ if (comp.isExpanded() != expanded) {
+ Method method = null;
+ try {
+ method = comp.getClass().getDeclaredMethod("programmaticToggleState");
+ method.setAccessible(true);
+ method.invoke(comp);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+
+ private void selectNewComment() {
+ focusOn(addCommentsTextBox, false);
+ }
+
+ /**
+ * @author Raphael Ackermann (bug 195514)
+ * @since 2.1
+ */
+ protected void focusAttributes() {
+ if (attributesSection != null) {
+ focusOn(attributesSection, false);
+ }
+ }
+
+ private void focusDescription() {
+ if (descriptionTextViewer != null) {
+ focusOn(descriptionTextViewer.getTextWidget(), false);
+ }
+ }
+
+ /**
+ * Scroll to a specified piece of text
+ *
+ * @param selectionComposite
+ * The StyledText to scroll to
+ */
+ private void focusOn(Control selectionComposite, boolean highlight) {
+ int pos = 0;
+ // if (previousText != null && !previousText.isDisposed()) {
+ // previousText.setsetSelection(0);
+ // }
+
+ // if (selectionComposite instanceof FormText)
+ // previousText = (FormText) selectionComposite;
+
+ if (selectionComposite != null) {
+
+ // if (highlight && selectionComposite instanceof FormText &&
+ // !selectionComposite.isDisposed())
+ // ((FormText) selectionComposite).set.setSelection(0, ((FormText)
+ // selectionComposite).getText().length());
+
+ // get the position of the text in the composite
+ pos = 0;
+ Control s = selectionComposite;
+ if (s.isDisposed()) {
+ return;
+ }
+ s.setEnabled(true);
+ s.setFocus();
+ s.forceFocus();
+ while (s != null && s != getEditorComposite()) {
+ if (!s.isDisposed()) {
+ pos += s.getLocation().y;
+ s = s.getParent();
+ }
+ }
+
+ pos = pos - 60; // form.getOrigin().y;
+
+ }
+ if (!form.getBody().isDisposed()) {
+ form.setOrigin(0, pos);
+ }
+ }
+
+ private RepositoryTaskOutlinePage outlinePage = null;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getAdapter(Class adapter) {
+ return getAdapterDelgate(adapter);
+ }
+
+ public Object getAdapterDelgate(Class<?> adapter) {
+ if (IContentOutlinePage.class.equals(adapter)) {
+ if (outlinePage == null && editorInput != null && taskOutlineModel != null) {
+ outlinePage = new RepositoryTaskOutlinePage(taskOutlineModel);
+ }
+ return outlinePage;
+ }
+ return super.getAdapter(adapter);
+ }
+
+ public RepositoryTaskOutlinePage getOutline() {
+ return outlinePage;
+ }
+
+ private Button[] radios;
+
+ private Control[] radioOptions;
+
+ private Button attachContextButton;
+
+ private AbstractLegacyRepositoryConnector connector;
+
+ private Cursor waitCursor;
+
+ private boolean formBusy = false;
+
+ private Composite headerInfoComposite;
+
+ private Section attributesSection;
+
+ public void close() {
+ Display activeDisplay = getSite().getShell().getDisplay();
+ activeDisplay.asyncExec(new Runnable() {
+ public void run() {
+ if (getSite() != null && getSite().getPage() != null && !getManagedForm().getForm().isDisposed()) {
+ if (parentEditor != null) {
+ getSite().getPage().closeEditor(parentEditor, false);
+ } else {
+ getSite().getPage().closeEditor(AbstractRepositoryTaskEditor.this, false);
+ }
+ }
+ }
+ });
+ }
+
+ public void addAttributeListener(IRepositoryTaskAttributeListener listener) {
+ attributesListeners.add(listener);
+ }
+
+ public void removeAttributeListener(IRepositoryTaskAttributeListener listener) {
+ attributesListeners.remove(listener);
+ }
+
+ public void setParentEditor(TaskEditor parentEditor) {
+ this.parentEditor = parentEditor;
+ }
+
+ /**
+ * @since 2.1
+ */
+ public TaskEditor getParentEditor() {
+ return parentEditor;
+ }
+
+ public RepositoryTaskOutlineNode getTaskOutlineModel() {
+ return taskOutlineModel;
+ }
+
+ public void setTaskOutlineModel(RepositoryTaskOutlineNode taskOutlineModel) {
+ this.taskOutlineModel = taskOutlineModel;
+ }
+
+ /**
+ * A listener for selection of the textbox where a new comment is entered in.
+ */
+ private class NewCommentListener implements Listener {
+ public void handleEvent(Event event) {
+ fireSelectionChanged(new SelectionChangedEvent(selectionProvider, new StructuredSelection(
+ new RepositoryTaskSelection(taskData.getTaskId(), taskData.getRepositoryUrl(),
+ taskData.getConnectorKind(), getSectionLabel(SECTION_NAME.NEWCOMMENT_SECTION), false,
+ taskData.getSummary()))));
+ }
+ }
+
+ public Control getControl() {
+ return form;
+ }
+
+ public void setSummaryText(String text) {
+ if (summaryTextViewer != null && summaryTextViewer.getTextWidget() != null) {
+ summaryTextViewer.getTextWidget().setText(text);
+ }
+ }
+
+ public void setDescriptionText(String text) {
+ this.descriptionTextViewer.getDocument().set(text);
+ }
+
+ protected void addRadioButtons(Composite buttonComposite) {
+ int i = 0;
+ Button selected = null;
+ radios = new Button[taskData.getOperations().size()];
+ radioOptions = new Control[taskData.getOperations().size()];
+ for (RepositoryOperation o : taskData.getOperations()) {
+ radios[i] = toolkit.createButton(buttonComposite, "", SWT.RADIO);
+ radios[i].setFont(TEXT_FONT);
+ GridData radioData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ if (!o.hasOptions() && !o.isInput()) {
+ radioData.horizontalSpan = 4;
+ } else {
+ radioData.horizontalSpan = 1;
+ }
+ radioData.heightHint = 20;
+ String opName = o.getOperationName();
+ opName = opName.replaceAll("</.*>", "");
+ opName = opName.replaceAll("<.*>", "");
+ radios[i].setText(opName);
+ radios[i].setLayoutData(radioData);
+ // radios[i].setBackground(background);
+ radios[i].addSelectionListener(new RadioButtonListener());
+
+ if (o.hasOptions()) {
+ radioData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ radioData.horizontalSpan = 3;
+ radioData.heightHint = 20;
+ radioData.widthHint = RADIO_OPTION_WIDTH;
+ radioOptions[i] = new CCombo(buttonComposite, SWT.FLAT | SWT.READ_ONLY);
+ radioOptions[i].setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
+ toolkit.adapt(radioOptions[i], true, true);
+ radioOptions[i].setFont(TEXT_FONT);
+ radioOptions[i].setLayoutData(radioData);
+
+ Object[] a = o.getOptionNames().toArray();
+ Arrays.sort(a);
+ for (int j = 0; j < a.length; j++) {
+ if (a[j] != null) {
+ ((CCombo) radioOptions[i]).add((String) a[j]);
+ if (((String) a[j]).equals(o.getOptionSelection())) {
+ ((CCombo) radioOptions[i]).select(j);
+ }
+ }
+ }
+ ((CCombo) radioOptions[i]).addSelectionListener(new RadioButtonListener());
+ } else if (o.isInput()) {
+ radioData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ radioData.horizontalSpan = 3;
+ radioData.widthHint = RADIO_OPTION_WIDTH - 10;
+
+ String assignmentValue = "";
+ // NOTE: removed this because we now have content assit
+// if (opName.equals(REASSIGN_BUG_TO)) {
+// assignmentValue = repository.getUserName();
+// }
+ radioOptions[i] = toolkit.createText(buttonComposite, assignmentValue);
+ radioOptions[i].setFont(TEXT_FONT);
+ radioOptions[i].setLayoutData(radioData);
+ // radioOptions[i].setBackground(background);
+ ((Text) radioOptions[i]).setText(o.getInputValue());
+ ((Text) radioOptions[i]).addModifyListener(new RadioButtonListener());
+
+ if (hasContentAssist(o)) {
+ ContentAssistCommandAdapter adapter = applyContentAssist((Text) radioOptions[i],
+ createContentProposalProvider(o));
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(o);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ }
+ }
+
+ if (i == 0 || o.isChecked()) {
+ if (selected != null) {
+ selected.setSelection(false);
+ }
+ selected = radios[i];
+ radios[i].setSelection(true);
+ if (o.hasOptions() && o.getOptionSelection() != null) {
+ int j = 0;
+ for (String s : ((CCombo) radioOptions[i]).getItems()) {
+ if (s.compareTo(o.getOptionSelection()) == 0) {
+ ((CCombo) radioOptions[i]).select(j);
+ }
+ j++;
+ }
+ }
+ taskData.setSelectedOperation(o);
+ }
+
+ i++;
+ }
+
+ toolkit.paintBordersFor(buttonComposite);
+ }
+
+ /**
+ * If implementing custom attributes you may need to override this method
+ *
+ * @return true if one or more attributes exposed in the editor have
+ */
+ protected boolean hasVisibleAttributeChanges() {
+ if (taskData == null) {
+ return false;
+ }
+ for (RepositoryTaskAttribute attribute : taskData.getAttributes()) {
+ if (!attribute.isHidden()) {
+ if (hasChanged(attribute)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ protected boolean hasOutgoingChange(RepositoryTaskAttribute newAttribute) {
+ return editorInput.getOldEdits().contains(newAttribute);
+ }
+
+ protected boolean hasChanged(RepositoryTaskAttribute newAttribute) {
+ if (newAttribute == null) {
+ return false;
+ }
+ RepositoryTaskData oldTaskData = editorInput.getOldTaskData();
+ if (oldTaskData == null) {
+ return false;
+ }
+
+ if (hasOutgoingChange(newAttribute)) {
+ return false;
+ }
+
+ RepositoryTaskAttribute oldAttribute = oldTaskData.getAttribute(newAttribute.getId());
+ if (oldAttribute == null) {
+ return true;
+ }
+ if (oldAttribute.getValue() != null && !oldAttribute.getValue().equals(newAttribute.getValue())) {
+ return true;
+ } else if (oldAttribute.getValues() != null && !oldAttribute.getValues().equals(newAttribute.getValues())) {
+ return true;
+ }
+ return false;
+ }
+
+ protected void addAttachContextButton(Composite buttonComposite, ITask task) {
+ attachContextButton = toolkit.createButton(buttonComposite, "Attach Context", SWT.CHECK);
+ attachContextButton.setImage(CommonImages.getImage(TasksUiImages.CONTEXT_ATTACH));
+ }
+
+ /**
+ * Creates a check box for adding the repository user to the cc list. Does nothing if the repository does not have a
+ * valid username, the repository user is the assignee, reporter or already on the the cc list.
+ */
+ protected void addSelfToCC(Composite composite) {
+
+ if (repository.getUserName() == null) {
+ return;
+ }
+
+ RepositoryTaskAttribute owner = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED);
+ if (owner != null && owner.getValue().indexOf(repository.getUserName()) != -1) {
+ return;
+ }
+
+ RepositoryTaskAttribute reporter = taskData.getAttribute(RepositoryTaskAttribute.USER_REPORTER);
+ if (reporter != null && reporter.getValue().indexOf(repository.getUserName()) != -1) {
+ return;
+ }
+
+ RepositoryTaskAttribute ccAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_CC);
+ if (ccAttribute != null && ccAttribute.getValues().contains(repository.getUserName())) {
+ return;
+ }
+
+ FormToolkit toolkit = getManagedForm().getToolkit();
+ toolkit.createLabel(composite, "");
+ final Button addSelfButton = toolkit.createButton(composite, "Add me to CC", SWT.CHECK);
+ addSelfButton.setSelection(RepositoryTaskAttribute.TRUE.equals(taskData.getAttributeValue(RepositoryTaskAttribute.ADD_SELF_CC)));
+ addSelfButton.setImage(CommonImages.getImage(CommonImages.PERSON));
+ addSelfButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ if (addSelfButton.getSelection()) {
+ taskData.setAttributeValue(RepositoryTaskAttribute.ADD_SELF_CC, RepositoryTaskAttribute.TRUE);
+ } else {
+ taskData.setAttributeValue(RepositoryTaskAttribute.ADD_SELF_CC, RepositoryTaskAttribute.FALSE);
+ }
+ RepositoryTaskAttribute attribute = taskData.getAttribute(RepositoryTaskAttribute.ADD_SELF_CC);
+ changedAttributes.add(attribute);
+ markDirty(true);
+ }
+ });
+ }
+
+ public boolean getAttachContext() {
+ if (attachContextButton == null || attachContextButton.isDisposed()) {
+ return false;
+ } else {
+ return attachContextButton.getSelection();
+ }
+ }
+
+ public void setExpandAttributeSection(boolean expandAttributeSection) {
+ this.expandedStateAttributes = expandAttributeSection;
+ }
+
+ public void setAttachContextEnabled(boolean attachContextEnabled) {
+ this.attachContextEnabled = attachContextEnabled;
+// if (attachContextButton != null && attachContextButton.isEnabled()) {
+// attachContextButton.setSelection(attachContext);
+// }
+ }
+
+ @Override
+ public void showBusy(boolean busy) {
+ if (!getManagedForm().getForm().isDisposed() && busy != formBusy) {
+ // parentEditor.showBusy(busy);
+ if (synchronizeEditorAction != null) {
+ synchronizeEditorAction.setEnabled(!busy);
+ }
+
+ if (activateAction != null) {
+ activateAction.setEnabled(!busy);
+ }
+
+ if (openBrowserAction != null) {
+ openBrowserAction.setEnabled(!busy);
+ }
+
+ if (historyAction != null) {
+ historyAction.setEnabled(!busy);
+ }
+
+ if (newSubTaskAction != null) {
+ newSubTaskAction.setEnabled(!busy);
+ }
+
+ if (clearOutgoingAction != null) {
+ clearOutgoingAction.setEnabled(!busy);
+ }
+
+ if (submitButton != null && !submitButton.isDisposed()) {
+ submitButton.setEnabled(!busy);
+ }
+
+ setEnabledState(editorComposite, !busy);
+
+ formBusy = busy;
+ }
+ }
+
+ private void setEnabledState(Composite composite, boolean enabled) {
+ if (!composite.isDisposed()) {
+ composite.setEnabled(enabled);
+ for (Control control : composite.getChildren()) {
+ control.setEnabled(enabled);
+ if (control instanceof Composite) {
+ setEnabledState(((Composite) control), enabled);
+ }
+ }
+ }
+ }
+
+ public void setGlobalBusy(boolean busy) {
+ if (parentEditor != null) {
+ parentEditor.showBusy(busy);
+ } else {
+ showBusy(busy);
+ }
+ }
+
+ public void submitToRepository() {
+ setGlobalBusy(true);
+
+ if (isDirty()) {
+ saveTaskOffline(new NullProgressMonitor());
+ markDirty(false);
+ }
+
+ final boolean attachContext = getAttachContext();
+
+ Job submitJob = new Job(LABEL_JOB_SUBMIT) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ AbstractTask modifiedTask = null;
+ try {
+ monitor.beginTask("Submitting task", 3);
+ String taskId = connector.getLegacyTaskDataHandler().postTaskData(repository, taskData,
+ new SubProgressMonitor(monitor, 1));
+ final boolean isNew = taskData.isNew();
+ if (isNew) {
+ if (taskId != null) {
+ modifiedTask = updateSubmittedTask(taskId, new SubProgressMonitor(monitor, 1));
+ } else {
+ // null taskId, assume task could not be created...
+ throw new CoreException(
+ new RepositoryStatus(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ RepositoryStatus.ERROR_INTERNAL,
+ "Task could not be created. No additional information was provided by the connector."));
+ }
+ } else {
+ modifiedTask = (AbstractTask) TasksUiInternal.getTaskList().getTask(
+ repository.getRepositoryUrl(), taskData.getTaskId());
+ }
+
+ // Synchronization accounting...
+ if (modifiedTask != null) {
+ // Attach context if required
+ if (attachContext && connector.getAttachmentHandler() != null) {
+ AttachmentUtil.attachContext(connector.getAttachmentHandler(), repository, modifiedTask,
+ "", new SubProgressMonitor(monitor, 1));
+ }
+
+ modifiedTask.setSubmitting(true);
+ final AbstractTask finalModifiedTask = modifiedTask;
+ TasksUiInternal.synchronizeTask(connector, modifiedTask, true, new JobChangeAdapter() {
+
+ @Override
+ public void done(IJobChangeEvent event) {
+
+ if (isNew) {
+ close();
+ TasksUiPlugin.getTaskDataManager().setTaskRead(finalModifiedTask, true);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(finalModifiedTask);
+ }
+ });
+ } else {
+// PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// refreshEditor();
+// }
+// });
+ }
+ }
+ });
+ TasksUiPlugin.getSynchronizationScheduler().synchronize(repository);
+ } else {
+ close();
+ // For some reason the task wasn't retrieved.
+ // Try to
+ // open local then via web browser...
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ TasksUiUtil.openTask(repository.getRepositoryUrl(), taskData.getTaskId(),
+ connector.getTaskUrl(taskData.getRepositoryUrl(), taskData.getTaskId()));
+ }
+ });
+ }
+
+ return Status.OK_STATUS;
+ } catch (OperationCanceledException e) {
+ if (modifiedTask != null) {
+ modifiedTask.setSubmitting(false);
+ }
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ setGlobalBusy(false);// enableButtons();
+ }
+ });
+ return Status.CANCEL_STATUS;
+ } catch (CoreException e) {
+ if (modifiedTask != null) {
+ modifiedTask.setSubmitting(false);
+ }
+ return handleSubmitError(e);
+ } catch (Exception e) {
+ if (modifiedTask != null) {
+ modifiedTask.setSubmitting(false);
+ }
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, e.getMessage(), e));
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ setGlobalBusy(false);// enableButtons();
+ }
+ });
+ } finally {
+ monitor.done();
+ }
+ return Status.OK_STATUS;
+ }
+
+ };
+
+ IJobChangeListener jobListener = getSubmitJobListener();
+ if (jobListener != null) {
+ submitJob.addJobChangeListener(jobListener);
+ }
+ submitJob.schedule();
+ }
+
+ /**
+ * @since 2.0 If existing task editor, update contents in place
+ */
+ public void refreshEditor() {
+ try {
+ if (!getManagedForm().getForm().isDisposed()) {
+ if (this.isDirty && taskData != null && !taskData.isNew()) {
+ this.doSave(new NullProgressMonitor());
+ }
+ setGlobalBusy(true);
+ changedAttributes.clear();
+ commentComposites.clear();
+ controlBySelectableObject.clear();
+ editorInput.refreshInput();
+
+ // Note: Marking read must run synchronously
+ // If not, incomings resulting from subsequent synchronization
+ // can get marked as read (without having been viewed by user
+ if (repositoryTask != null) {
+ try {
+ refreshing = true;
+ TasksUiPlugin.getTaskDataManager().setTaskRead(repositoryTask, true);
+ } finally {
+ refreshing = false;
+ }
+ }
+
+ this.setInputWithNotify(this.getEditorInput());
+ this.init(this.getEditorSite(), this.getEditorInput());
+
+ // Header must be updated after init is called to task data is available
+ updateHeaderControls();
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+ public void run() {
+ if (editorComposite != null && !editorComposite.isDisposed()) {
+ if (taskData != null) {
+ updateEditorTitle();
+ menu = editorComposite.getMenu();
+ removeSections();
+ editorComposite.setMenu(menu);
+ createSections();
+ form.reflow(true);
+ // setFormHeaderLabel();
+ markDirty(false);
+ parentEditor.setMessage(null, 0);
+ AbstractRepositoryTaskEditor.this.getEditor().setActivePage(
+ AbstractRepositoryTaskEditor.this.getId());
+
+ // Activate editor disabled: bug#179078
+ // AbstractTaskEditor.this.getEditor().getEditorSite().getPage().activate(
+ // AbstractTaskEditor.this);
+
+ // TODO: expand sections that were previously
+ // expanded
+
+ if (taskOutlineModel != null && outlinePage != null
+ && !outlinePage.getControl().isDisposed()) {
+ outlinePage.getOutlineTreeViewer().setInput(taskOutlineModel);
+ outlinePage.getOutlineTreeViewer().refresh(true);
+ }
+
+// if (repositoryTask != null) {
+// TasksUiPlugin.getTaskDataManager().setTaskRead(repositoryTask, true);
+// }
+
+ setSubmitEnabled(true);
+ }
+ }
+ }
+ });
+
+ } else {
+ // Editor possibly closed as part of submit, mark read
+
+ // Note: Marking read must run synchronously
+ // If not, incomings resulting from subsequent synchronization
+ // can get marked as read (without having been viewed by user
+ if (repositoryTask != null) {
+ TasksUiPlugin.getTaskDataManager().setTaskRead(repositoryTask, true);
+ }
+ }
+ } finally {
+ if (!getManagedForm().getForm().isDisposed()) {
+ setGlobalBusy(false);
+ }
+ }
+ }
+
+ /**
+ * Used to prevent form menu from being disposed when disposing elements on the form during refresh
+ */
+ private void setMenu(Composite comp, Menu menu) {
+ if (!comp.isDisposed()) {
+ comp.setMenu(null);
+ for (Control child : comp.getChildren()) {
+ child.setMenu(null);
+ if (child instanceof Composite) {
+ setMenu((Composite) child, menu);
+ }
+ }
+ }
+ }
+
+ protected IJobChangeListener getSubmitJobListener() {
+ return null;
+ }
+
+ protected AbstractTaskCategory getCategory() {
+ return null;
+ }
+
+ protected IStatus handleSubmitError(final CoreException exception) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (form != null && !form.isDisposed()) {
+ if (exception.getStatus().getCode() == RepositoryStatus.ERROR_IO) {
+ parentEditor.setMessage(ERROR_NOCONNECTIVITY, IMessageProvider.ERROR);
+ StatusHandler.log(exception.getStatus());
+ } else if (exception.getStatus().getCode() == RepositoryStatus.REPOSITORY_COMMENT_REQUIRED) {
+ TasksUiInternal.displayStatus("Comment required", exception.getStatus());
+ if (!getManagedForm().getForm().isDisposed() && newCommentTextViewer != null
+ && !newCommentTextViewer.getControl().isDisposed()) {
+ newCommentTextViewer.getControl().setFocus();
+ }
+ } else if (exception.getStatus().getCode() == RepositoryStatus.ERROR_REPOSITORY_LOGIN) {
+ if (TasksUiUtil.openEditRepositoryWizard(repository) == MessageDialog.OK) {
+ submitToRepository();
+ return;
+ }
+ } else {
+ TasksUiInternal.displayStatus("Submit failed", exception.getStatus());
+ }
+ setGlobalBusy(false);
+ }
+ }
+
+ });
+ return Status.OK_STATUS;
+ }
+
+ protected AbstractTask updateSubmittedTask(String postResult, IProgressMonitor monitor) throws CoreException {
+ final AbstractTask newTask = (AbstractTask) TasksUiInternal.createTask(repository, postResult, monitor);
+
+ if (newTask != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (getCategory() != null) {
+ TasksUiInternal.getTaskList().addTask(newTask, getCategory());
+ }
+ }
+ });
+ }
+
+ return newTask;
+ }
+
+ /**
+ * Class to handle the selection change of the radio buttons.
+ */
+ private class RadioButtonListener implements SelectionListener, ModifyListener {
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ Button selected = null;
+ for (Button radio : radios) {
+ if (radio.getSelection()) {
+ selected = radio;
+ }
+ }
+ // determine the operation to do to the bug
+ for (int i = 0; i < radios.length; i++) {
+ if (radios[i] != e.widget && radios[i] != selected) {
+ radios[i].setSelection(false);
+ }
+
+ if (e.widget == radios[i]) {
+ RepositoryOperation o = taskData.getOperation(radios[i].getText());
+ taskData.setSelectedOperation(o);
+ markDirty(true);
+ } else if (e.widget == radioOptions[i]) {
+ RepositoryOperation o = taskData.getOperation(radios[i].getText());
+ o.setOptionSelection(((CCombo) radioOptions[i]).getItem(((CCombo) radioOptions[i]).getSelectionIndex()));
+
+ if (taskData.getSelectedOperation() != null) {
+ taskData.getSelectedOperation().setChecked(false);
+ }
+ o.setChecked(true);
+
+ taskData.setSelectedOperation(o);
+ radios[i].setSelection(true);
+ if (selected != null && selected != radios[i]) {
+ selected.setSelection(false);
+ }
+ markDirty(true);
+ }
+ }
+ validateInput();
+ }
+
+ public void modifyText(ModifyEvent e) {
+ Button selected = null;
+ for (Button radio : radios) {
+ if (radio.getSelection()) {
+ selected = radio;
+ }
+ }
+ // determine the operation to do to the bug
+ for (int i = 0; i < radios.length; i++) {
+ if (radios[i] != e.widget && radios[i] != selected) {
+ radios[i].setSelection(false);
+ }
+
+ if (e.widget == radios[i]) {
+ RepositoryOperation o = taskData.getOperation(radios[i].getText());
+ taskData.setSelectedOperation(o);
+ markDirty(true);
+ } else if (e.widget == radioOptions[i]) {
+ RepositoryOperation o = taskData.getOperation(radios[i].getText());
+ o.setInputValue(((Text) radioOptions[i]).getText());
+
+ if (taskData.getSelectedOperation() != null) {
+ taskData.getSelectedOperation().setChecked(false);
+ }
+ o.setChecked(true);
+
+ taskData.setSelectedOperation(o);
+ radios[i].setSelection(true);
+ if (selected != null && selected != radios[i]) {
+ selected.setSelection(false);
+ }
+ markDirty(true);
+ }
+ }
+ validateInput();
+ }
+ }
+
+ public AbstractRepositoryConnector getConnector() {
+ return connector;
+ }
+
+ public void setShowAttachments(boolean showAttachments) {
+ this.showAttachments = showAttachments;
+ }
+
+ public String getCommonDateFormat() {
+ return HEADER_DATE_FORMAT;
+ }
+
+ public Color getColorIncoming() {
+ return colorIncoming;
+ }
+
+ /**
+ * @see #select(Object, boolean)
+ */
+ public void addSelectableControl(Object item, Control control) {
+ controlBySelectableObject.put(item, control);
+ }
+
+ /**
+ * @see #addSelectableControl(Object, Control)
+ */
+ public void removeSelectableControl(Object item) {
+ controlBySelectableObject.remove(item);
+ }
+
+ /**
+ * This method allow you to overwrite the generation of the form area for "assigned to" in the peopleLayout.<br>
+ * <br>
+ * The overwrite is used for Bugzilla Versions > 3.0
+ *
+ * @since 2.1
+ * @author Frank Becker (bug 198027)
+ */
+ protected void addAssignedTo(Composite peopleComposite) {
+ boolean haveRealName = false;
+ RepositoryTaskAttribute assignedAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED_NAME);
+ if (assignedAttribute == null) {
+ assignedAttribute = taskData.getAttribute(RepositoryTaskAttribute.USER_ASSIGNED);
+ } else {
+ haveRealName = true;
+ }
+ if (assignedAttribute != null) {
+ Label label = createLabel(peopleComposite, assignedAttribute);
+ GridDataFactory.fillDefaults().align(SWT.RIGHT, SWT.CENTER).applyTo(label);
+ Text textField;
+ if (assignedAttribute.isReadOnly()) {
+ textField = createTextField(peopleComposite, assignedAttribute, SWT.FLAT | SWT.READ_ONLY);
+ } else {
+ textField = createTextField(peopleComposite, assignedAttribute, SWT.FLAT);
+ ContentAssistCommandAdapter adapter = applyContentAssist(textField,
+ createContentProposalProvider(assignedAttribute));
+ ILabelProvider propsalLabelProvider = createProposalLabelProvider(assignedAttribute);
+ if (propsalLabelProvider != null) {
+ adapter.setLabelProvider(propsalLabelProvider);
+ }
+ adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+ }
+ GridDataFactory.fillDefaults().grab(true, false).applyTo(textField);
+ if (haveRealName) {
+ textField.setText(textField.getText() + " <"
+ + taskData.getAttributeValue(RepositoryTaskAttribute.USER_ASSIGNED) + ">");
+ }
+
+ }
+ }
+
+ /**
+ * force a re-layout of entire form
+ */
+ protected void resetLayout() {
+ if (refreshEnabled) {
+ form.layout(true, true);
+ form.reflow(true);
+ }
+ }
+
+ /**
+ * @since 2.3
+ */
+ protected Hyperlink createTaskListHyperlink(Composite parent, final String taskId, final String taskUrl,
+ final AbstractTask task) {
+ TaskHyperlink hyperlink = new TaskHyperlink(parent, SWT.SHORT | getManagedForm().getToolkit().getOrientation());
+ getManagedForm().getToolkit().adapt(hyperlink, true, true);
+ getManagedForm().getToolkit().getHyperlinkGroup().add(hyperlink);
+ hyperlink.setTask(task);
+ if (task == null) {
+ hyperlink.setText(taskId);
+ }
+ hyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ if (task != null) {
+ TasksUiInternal.refreshAndOpenTaskListElement(task);
+ } else {
+ TasksUiUtil.openTask(repository.getRepositoryUrl(), taskId, taskUrl);
+ }
+ }
+ });
+ return hyperlink;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryTaskEditorInput.java b/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryTaskEditorInput.java
new file mode 100644
index 0000000..aedca41
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/AbstractRepositoryTaskEditorInput.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import java.util.Set;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public abstract class AbstractRepositoryTaskEditorInput implements IEditorInput {
+
+ protected String toolTipText = "";
+
+ final protected TaskRepository repository;
+
+ final private String taskId;
+
+ private RepositoryTaskData editableTaskData;
+
+ private RepositoryTaskData oldTaskData;
+
+ private Set<RepositoryTaskAttribute> oldEdits;
+
+ protected AbstractRepositoryTaskEditorInput(TaskRepository repository, String taskId) {
+ this.taskId = taskId;
+ this.repository = repository;
+ this.refreshInput();
+ }
+
+ /**
+ * Sets the tool tip text for this editor input.
+ *
+ * @param str
+ * The new tool tip text.
+ */
+ protected void setToolTipText(String str) {
+ // 03-20-03 Allows editor to store title (once it is known)
+ toolTipText = str;
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ /**
+ * returns the new task data
+ */
+ public RepositoryTaskData getTaskData() {
+ return editableTaskData;
+ }
+
+ /**
+ * returns the old task data
+ */
+ public RepositoryTaskData getOldTaskData() {
+ return oldTaskData;
+ }
+
+ public Set<RepositoryTaskAttribute> getOldEdits() {
+ return oldEdits;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return TasksUiImages.REPOSITORY_SMALL;
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return getName();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /**
+ * @return <code>true</code> if the argument is an editor input on the same bug.
+ */
+ @Override
+ public abstract boolean equals(Object o);
+
+ public TaskRepository getRepository() {
+ return repository;
+ }
+
+ protected void setEditableTaskData(RepositoryTaskData editableTaskData) {
+// if (editableTaskData == null) {
+// throw new IllegalArgumentException();
+// }
+ this.editableTaskData = editableTaskData;
+ }
+
+ protected void setOldTaskData(RepositoryTaskData oldTaskData) {
+ this.oldTaskData = oldTaskData;
+ }
+
+ /**
+ * @since 2.2
+ */
+ protected void setOldEdits(Set<RepositoryTaskAttribute> oldEdits) {
+ this.oldEdits = oldEdits;
+ }
+
+ public void refreshInput() {
+ setEditableTaskData(TasksUiPlugin.getTaskDataStorageManager().getEditableCopy(repository.getRepositoryUrl(),
+ taskId));
+ setOldTaskData(TasksUiPlugin.getTaskDataStorageManager().getOldTaskData(repository.getRepositoryUrl(), taskId));
+ setOldEdits(TasksUiPlugin.getTaskDataStorageManager().getEdits(repository.getRepositoryUrl(), taskId));
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/AbstractTaskEditorFactory.java b/org.eclipse.mylyn/developer/src-old/editors/AbstractTaskEditorFactory.java
new file mode 100644
index 0000000..ffeab9b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/AbstractTaskEditorFactory.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public abstract class AbstractTaskEditorFactory {
+
+ public abstract IEditorPart createEditor(TaskEditor parentEditor, IEditorInput editorInput);
+
+ /**
+ * @since 3.0
+ */
+ public abstract IEditorInput createEditorInput(ITask task);
+
+ public abstract String getTitle();
+
+ /**
+ * @since 3.0
+ */
+ public abstract boolean canCreateEditorFor(ITask task);
+
+ public abstract boolean canCreateEditorFor(IEditorInput input);
+
+ public boolean providesOutline() {
+ return false;
+ }
+
+ /**
+ * @return A higher integer for high priority, low integer for low priority. Higher priority editors will be placed
+ * earlier in the tab list.
+ */
+ public int getTabOrderPriority() {
+ return 1;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/AutoFoldingStructureProvider.java b/org.eclipse.mylyn/developer/src-old/editors/AutoFoldingStructureProvider.java
new file mode 100644
index 0000000..846a2dd
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/AutoFoldingStructureProvider.java
@@ -0,0 +1,944 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.java.ui.editor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.core.ElementChangedEvent;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IElementChangedListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IParent;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.ISourceReference;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.ToolFactory;
+import org.eclipse.jdt.core.compiler.IScanner;
+import org.eclipse.jdt.core.compiler.ITerminalSymbols;
+import org.eclipse.jdt.core.compiler.InvalidInputException;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor;
+import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
+import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jdt.internal.ui.text.DocumentCharacterIterator;
+import org.eclipse.jdt.ui.IWorkingCopyManager;
+import org.eclipse.jdt.ui.text.folding.IJavaFoldingStructureProvider;
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.projection.IProjectionListener;
+import org.eclipse.jface.text.source.projection.IProjectionPosition;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.mylyn.core.IMylarElement;
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.core.util.MylarStatusHandler;
+import org.eclipse.mylyn.ui.MylarUiPlugin;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+
+/**
+ * Copied from: DefaultJavaFoldingStructureProvider
+ *
+ * @author Mik Kersten
+ */
+ at SuppressWarnings("unchecked")
+public class AutoFoldingStructureProvider implements IProjectionListener, IJavaFoldingStructureProvider {
+
+ public static final String ID = "org.eclipse.mylyn.java.ui.editor.foldingprovider";
+
+ private void computeAdditions(IJavaElement element, Map map) {
+ boolean createProjection= false;
+ boolean collapse= false;
+ switch (element.getElementType()) {
+ case IJavaElement.IMPORT_CONTAINER:
+ collapse = true;
+// collapse= fAllowCollapsing && fCollapseImportContainer;
+ createProjection= true;
+ break;
+ case IJavaElement.TYPE:
+ if (isInnerType((IType)element)) {
+ IMylarElement node = ContextCorePlugin.getContextManager().getElement(element.getHandleIdentifier());
+ if (!MylarUiPlugin.getDefault().isGlobalFoldingEnabled()) {
+ collapse = false;
+ } else if (node == null || node.getInterest().isInteresting()) {
+ collapse = false;
+ } else {
+ collapse = true;
+ }
+ createProjection= true;
+ break;
+ }
+// collapse= fAllowCollapsing && fCollapseInnerTypes && isInnerType((IType) element);
+ createProjection= true;
+ break;
+ case IJavaElement.METHOD:
+ IMylarElement node = ContextCorePlugin.getContextManager().getElement(element.getHandleIdentifier());
+ if (!MylarUiPlugin.getDefault().isGlobalFoldingEnabled()) {
+ collapse = false;
+ } else if (node == null || node.getInterest().isInteresting()) {
+ collapse = false;
+ } else {
+ collapse = true;
+ }
+ createProjection= true;
+ break;
+ default:
+ collapse = true;
+// collapse= fAllowCollapsing && fCollapseMethods;
+// createProjection= true;
+// break;
+ }
+
+ if (createProjection) {
+ IRegion[] regions= computeProjectionRanges(element);
+ if (regions != null) {
+ // comments
+ for (int i= 0; i < regions.length - 1; i++) {
+ Position position= createProjectionPosition(regions[i], null);
+ boolean commentCollapse;
+ if (position != null) {
+ if (i == 0 && (regions.length > 2 || fHasHeaderComment) && element == fFirstType) {
+ commentCollapse= fAllowCollapsing && fCollapseHeaderComments;
+ } else {
+ commentCollapse= fAllowCollapsing && fCollapseJavadoc;
+ }
+ map.put(new JavaProjectionAnnotation(element, commentCollapse, true), position);
+ }
+ }
+ // code
+ Position position= createProjectionPosition(regions[regions.length - 1], element);
+ if (position != null)
+ map.put(new JavaProjectionAnnotation(element, collapse, false), position);
+ }
+ }
+ }
+
+ private void initializePreferences() {
+// IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
+// fCollapseInnerTypes= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_INNERTYPES);
+// fCollapseImportContainer= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_IMPORTS);
+ fCollapseJavadoc= true ;//store.getBoolean(PreferenceConstants.EDITOR_FOLDING_JAVADOC);
+// fCollapseMethods= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_METHODS); XXX never used
+ fCollapseHeaderComments= true; //store.getBoolean(PreferenceConstants.EDITOR_FOLDING_HEADERS);
+ }
+
+ /*
+ ************ COPIED FROM: DefaultJavaFoldingStructureProvider ****************
+ */
+
+ private static final class JavaProjectionAnnotation extends ProjectionAnnotation {
+
+ private IJavaElement fJavaElement;
+ private boolean fIsComment;
+
+ public JavaProjectionAnnotation(IJavaElement element, boolean isCollapsed, boolean isComment) {
+ super(isCollapsed);
+ fJavaElement= element;
+ fIsComment= isComment;
+ }
+
+ public IJavaElement getElement() {
+ return fJavaElement;
+ }
+
+ public void setElement(IJavaElement element) {
+ fJavaElement= element;
+ }
+
+ public boolean isComment() {
+ return fIsComment;
+ }
+
+ public void setIsComment(boolean isComment) {
+ fIsComment= isComment;
+ }
+
+ @Override
+ public String toString() {
+ return "JavaProjectionAnnotation:\n" + //$NON-NLS-1$
+ "\telement: \t"+fJavaElement.toString()+"\n" + //$NON-NLS-1$ //$NON-NLS-2$
+ "\tcollapsed: \t" + isCollapsed() + "\n" + //$NON-NLS-1$ //$NON-NLS-2$
+ "\tcomment: \t" + fIsComment + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ private static final class Tuple {
+ JavaProjectionAnnotation annotation;
+ Position position;
+ Tuple(JavaProjectionAnnotation annotation, Position position) {
+ this.annotation= annotation;
+ this.position= position;
+ }
+ }
+
+ private class ElementChangedListener implements IElementChangedListener {
+
+ /*
+ * @see org.eclipse.jdt.core.IElementChangedListener#elementChanged(org.eclipse.jdt.core.ElementChangedEvent)
+ */
+ public void elementChanged(ElementChangedEvent e) {
+ IJavaElementDelta delta= findElement(fInput, e.getDelta());
+ if (delta != null)
+ processDelta(delta);
+ }
+
+ private IJavaElementDelta findElement(IJavaElement target, IJavaElementDelta delta) {
+
+ if (delta == null || target == null)
+ return null;
+
+ IJavaElement element= delta.getElement();
+
+ if (element.getElementType() > IJavaElement.CLASS_FILE)
+ return null;
+
+ if (target.equals(element))
+ return delta;
+
+ IJavaElementDelta[] children= delta.getAffectedChildren();
+
+ for (int i= 0; i < children.length; i++) {
+ IJavaElementDelta d= findElement(target, children[i]);
+ if (d != null)
+ return d;
+ }
+
+ return null;
+ }
+ }
+
+ /**
+ * Projection position that will return two foldable regions: one folding away
+ * the region from after the '/**' to the beginning of the content, the other
+ * from after the first content line until after the comment.
+ *
+ * @since 3.1
+ */
+ private static final class CommentPosition extends Position implements IProjectionPosition {
+ CommentPosition(int offset, int length) {
+ super(offset, length);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeFoldingRegions(org.eclipse.jface.text.IDocument)
+ */
+ public IRegion[] computeProjectionRegions(IDocument document) throws BadLocationException {
+ DocumentCharacterIterator sequence= new DocumentCharacterIterator(document, offset, offset + length);
+ int prefixEnd= 0;
+ int contentStart= findFirstContent(sequence, prefixEnd);
+
+ int firstLine= document.getLineOfOffset(offset + prefixEnd);
+ int captionLine= document.getLineOfOffset(offset + contentStart);
+ int lastLine= document.getLineOfOffset(offset + length);
+
+ Assert.isTrue(firstLine <= captionLine, "first folded line is greater than the caption line"); //$NON-NLS-1$
+ Assert.isTrue(captionLine <= lastLine, "caption line is greater than the last folded line"); //$NON-NLS-1$
+
+ IRegion preRegion;
+ if (firstLine < captionLine) {
+// preRegion= new Region(offset + prefixEnd, contentStart - prefixEnd);
+ int preOffset= document.getLineOffset(firstLine);
+ IRegion preEndLineInfo= document.getLineInformation(captionLine);
+ int preEnd= preEndLineInfo.getOffset();
+ preRegion= new Region(preOffset, preEnd - preOffset);
+ } else {
+ preRegion= null;
+ }
+
+ if (captionLine < lastLine) {
+ int postOffset= document.getLineOffset(captionLine + 1);
+ IRegion postRegion= new Region(postOffset, offset + length - postOffset);
+
+ if (preRegion == null)
+ return new IRegion[] { postRegion };
+
+ return new IRegion[] { preRegion, postRegion };
+ }
+
+ if (preRegion != null)
+ return new IRegion[] { preRegion };
+
+ return null;
+ }
+
+ /**
+ * Finds the offset of the first identifier part within <code>content</code>.
+ * Returns 0 if none is found.
+ *
+ * @param content the content to search
+ * @return the first index of a unicode identifier part, or zero if none can
+ * be found
+ */
+ private int findFirstContent(final CharSequence content, int prefixEnd) {
+ int lenght= content.length();
+ for (int i= prefixEnd; i < lenght; i++) {
+ if (Character.isUnicodeIdentifierPart(content.charAt(i)))
+ return i;
+ }
+ return 0;
+ }
+
+// /**
+// * Finds the offset of the first identifier part within <code>content</code>.
+// * Returns 0 if none is found.
+// *
+// * @param content the content to search
+// * @return the first index of a unicode identifier part, or zero if none can
+// * be found
+// */
+// private int findPrefixEnd(final CharSequence content) {
+// // return the index after the leading '/*' or '/**'
+// int len= content.length();
+// int i= 0;
+// while (i < len && isWhiteSpace(content.charAt(i)))
+// i++;
+// if (len >= i + 2 && content.charAt(i) == '/' && content.charAt(i + 1) == '*')
+// if (len >= i + 3 && content.charAt(i + 2) == '*')
+// return i + 3;
+// else
+// return i + 2;
+// else
+// return i;
+// }
+//
+// private boolean isWhiteSpace(char c) {
+// return c == ' ' || c == '\t';
+// }
+
+ /*
+ * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeCaptionOffset(org.eclipse.jface.text.IDocument)
+ */
+ public int computeCaptionOffset(IDocument document) {
+// return 0;
+ DocumentCharacterIterator sequence= new DocumentCharacterIterator(document, offset, offset + length);
+ return findFirstContent(sequence, 0);
+ }
+ }
+
+ /**
+ * Projection position that will return two foldable regions: one folding away
+ * the lines before the one containing the simple name of the java element, one
+ * folding away any lines after the caption.
+ *
+ * @since 3.1
+ */
+ private static final class JavaElementPosition extends Position implements IProjectionPosition {
+
+ private final IMember fMember;
+
+ public JavaElementPosition(int offset, int length, IMember member) {
+ super(offset, length);
+ Assert.isNotNull(member);
+ fMember= member;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeFoldingRegions(org.eclipse.jface.text.IDocument)
+ */
+ public IRegion[] computeProjectionRegions(IDocument document) throws BadLocationException {
+ int nameStart= offset;
+ try {
+ /* The member's name range may not be correct. However,
+ * reconciling would trigger another element delta which would
+ * lead to reentrant situations. Therefore, we optimistically
+ * assume that the name range is correct, but double check the
+ * received lines below. */
+ ISourceRange nameRange= fMember.getNameRange();
+ if (nameRange != null)
+ nameStart= nameRange.getOffset();
+
+ } catch (JavaModelException e) {
+ // ignore and use default
+ }
+
+ int firstLine= document.getLineOfOffset(offset);
+ int captionLine= document.getLineOfOffset(nameStart);
+ int lastLine= document.getLineOfOffset(offset + length);
+
+ /* see comment above - adjust the caption line to be inside the
+ * entire folded region, and rely on later element deltas to correct
+ * the name range. */
+ if (captionLine < firstLine)
+ captionLine= firstLine;
+ if (captionLine > lastLine)
+ captionLine= lastLine;
+
+ IRegion preRegion;
+ if (firstLine < captionLine) {
+ int preOffset= document.getLineOffset(firstLine);
+ IRegion preEndLineInfo= document.getLineInformation(captionLine);
+ int preEnd= preEndLineInfo.getOffset();
+ preRegion= new Region(preOffset, preEnd - preOffset);
+ } else {
+ preRegion= null;
+ }
+
+ if (captionLine < lastLine) {
+ int postOffset= document.getLineOffset(captionLine + 1);
+ IRegion postRegion= new Region(postOffset, offset + length - postOffset);
+
+ if (preRegion == null)
+ return new IRegion[] { postRegion };
+
+ return new IRegion[] { preRegion, postRegion };
+ }
+
+ if (preRegion != null)
+ return new IRegion[] { preRegion };
+
+ return null;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.projection.IProjectionPosition#computeCaptionOffset(org.eclipse.jface.text.IDocument)
+ */
+ public int computeCaptionOffset(IDocument document) throws BadLocationException {
+ int nameStart= offset;
+ try {
+ // need a reconcile here?
+ ISourceRange nameRange= fMember.getNameRange();
+ if (nameRange != null)
+ nameStart= nameRange.getOffset();
+ } catch (JavaModelException e) {
+ // ignore and use default
+ }
+
+ return nameStart - offset;
+ }
+
+ }
+
+ private IDocument fCachedDocument;
+
+ private ITextEditor fEditor;
+ private ProjectionViewer fViewer;
+ private IJavaElement fInput;
+ private IElementChangedListener fElementListener;
+
+ private boolean fAllowCollapsing= false;
+ private boolean fCollapseJavadoc= false;
+// private boolean fCollapseImportContainer= true;
+// private boolean fCollapseInnerTypes= true;
+// private boolean fCollapseMethods= false;
+
+ private boolean fCollapseHeaderComments= true;
+
+ /* caches for header comment extraction. */
+ private IType fFirstType;
+ private boolean fHasHeaderComment;
+
+
+ public AutoFoldingStructureProvider() {
+ // no initialization needed
+ }
+
+ public void install(ITextEditor editor, ProjectionViewer viewer) {
+ if (editor instanceof JavaEditor) {
+ fEditor= editor;
+ fViewer= viewer;
+ fViewer.addProjectionListener(this);
+ }
+ }
+
+ public void uninstall() {
+ if (isInstalled()) {
+ projectionDisabled();
+ fViewer.removeProjectionListener(this);
+ fViewer= null;
+ fEditor= null;
+ }
+ }
+
+ protected boolean isInstalled() {
+ return fEditor != null;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.projection.IProjectionListener#projectionEnabled()
+ */
+ public void projectionEnabled() {
+ // http://home.ott.oti.com/teams/wswb/anon/out/vms/index.html
+ // projectionEnabled messages are not always paired with projectionDisabled
+ // i.e. multiple enabled messages may be sent out.
+ // we have to make sure that we disable first when getting an enable
+ // message.
+ projectionDisabled();
+
+ if (fEditor instanceof JavaEditor) {
+ initialize();
+ fElementListener= new ElementChangedListener();
+ JavaCore.addElementChangedListener(fElementListener);
+ }
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.projection.IProjectionListener#projectionDisabled()
+ */
+ public void projectionDisabled() {
+ fCachedDocument= null;
+ if (fElementListener != null) {
+ JavaCore.removeElementChangedListener(fElementListener);
+ fElementListener= null;
+ }
+ }
+
+ public void initialize() {
+
+ if (!isInstalled())
+ return;
+
+ initializePreferences();
+
+ try {
+
+ IDocumentProvider provider= fEditor.getDocumentProvider();
+ fCachedDocument= provider.getDocument(fEditor.getEditorInput());
+ fAllowCollapsing= true;
+
+ fFirstType= null;
+ fHasHeaderComment= false;
+
+ if (fEditor instanceof CompilationUnitEditor) {
+ IWorkingCopyManager manager= JavaPlugin.getDefault().getWorkingCopyManager();
+ fInput= manager.getWorkingCopy(fEditor.getEditorInput());
+ } else if (fEditor instanceof ClassFileEditor) {
+ IClassFileEditorInput editorInput= (IClassFileEditorInput) fEditor.getEditorInput();
+ fInput= editorInput.getClassFile();
+ }
+
+ if (fInput != null) {
+ ProjectionAnnotationModel model= (ProjectionAnnotationModel) fEditor.getAdapter(ProjectionAnnotationModel.class);
+ if (model != null) {
+
+ if (fInput instanceof ICompilationUnit) {
+ ICompilationUnit unit= (ICompilationUnit) fInput;
+ synchronized (unit) {
+ try {
+ unit.reconcile(ICompilationUnit.NO_AST, false, null, null);
+ } catch (JavaModelException e) {
+ MylarStatusHandler.log(e, "could not initialize");
+ }
+ }
+ }
+
+ Map additions= computeAdditions((IParent) fInput);
+ model.removeAllAnnotations();
+ model.replaceAnnotations(null, additions);
+ }
+ }
+
+ } finally {
+ fCachedDocument= null;
+ fAllowCollapsing= false;
+
+ fFirstType= null;
+ fHasHeaderComment= false;
+ }
+ }
+
+
+ private Map computeAdditions(IParent parent) {
+ Map map= new LinkedHashMap(); // use a linked map to maintain ordering of comments
+ try {
+ computeAdditions(parent.getChildren(), map);
+ } catch (JavaModelException e) {
+ }
+ return map;
+ }
+
+ private void computeAdditions(IJavaElement[] elements, Map map) throws JavaModelException {
+ for (int i= 0; i < elements.length; i++) {
+ IJavaElement element= elements[i];
+
+ computeAdditions(element, map);
+
+ if (element instanceof IParent) {
+ IParent parent= (IParent) element;
+ computeAdditions(parent.getChildren(), map);
+ }
+ }
+ }
+
+ private boolean isInnerType(IType type) {
+
+ try {
+ return type.isMember();
+ } catch (JavaModelException x) {
+ IJavaElement parent= type.getParent();
+ if (parent != null) {
+ int parentType= parent.getElementType();
+ return (parentType != IJavaElement.COMPILATION_UNIT && parentType != IJavaElement.CLASS_FILE);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Computes the projection ranges for a given <code>IJavaElement</code>.
+ * More than one range may be returned if the element has a leading comment
+ * which gets folded separately. If there are no foldable regions,
+ * <code>null</code> is returned.
+ *
+ * @param element the java element that can be folded
+ * @return the regions to be folded, or <code>null</code> if there are
+ * none
+ */
+ private IRegion[] computeProjectionRanges(IJavaElement element) {
+
+ try {
+ if (element instanceof ISourceReference) {
+ ISourceReference reference= (ISourceReference) element;
+ ISourceRange range= reference.getSourceRange();
+
+ String contents= reference.getSource();
+ if (contents == null)
+ return null;
+
+ List regions= new ArrayList();
+ if (fFirstType == null && element instanceof IType) {
+ fFirstType= (IType) element;
+ IRegion headerComment= computeHeaderComment(fFirstType);
+ if (headerComment != null) {
+ regions.add(headerComment);
+ fHasHeaderComment= true;
+ }
+ }
+
+ IScanner scanner= ToolFactory.createScanner(true, false, false, false);
+ scanner.setSource(contents.toCharArray());
+ final int shift= range.getOffset();
+ int start= shift;
+ while (true) {
+
+ int token= scanner.getNextToken();
+ start= shift + scanner.getCurrentTokenStartPosition();
+
+ switch (token) {
+ case ITerminalSymbols.TokenNameCOMMENT_JAVADOC:
+ case ITerminalSymbols.TokenNameCOMMENT_BLOCK: {
+ int end= shift + scanner.getCurrentTokenEndPosition() + 1;
+ regions.add(new Region(start, end - start));
+ }
+ case ITerminalSymbols.TokenNameCOMMENT_LINE:
+ continue;
+ }
+
+ break;
+ }
+
+ regions.add(new Region(start, shift + range.getLength() - start));
+
+ if (regions.size() > 0) {
+ IRegion[] result= new IRegion[regions.size()];
+ regions.toArray(result);
+ return result;
+ }
+ }
+ } catch (JavaModelException e) {
+ MylarStatusHandler.log(e, "");
+ } catch (InvalidInputException e) {
+ MylarStatusHandler.log(e, "");
+ }
+
+ return null;
+ }
+
+ private IRegion computeHeaderComment(IType type) throws JavaModelException {
+ if (fCachedDocument == null)
+ return null;
+
+ // search at most up to the first type
+ ISourceRange range= type.getSourceRange();
+ if (range == null)
+ return null;
+ int start= 0;
+ int end= range.getOffset();
+
+ if (fInput instanceof ISourceReference) {
+ String content;
+ try {
+ content= fCachedDocument.get(start, end - start);
+ } catch (BadLocationException e) {
+ return null; // ignore header comment in that case
+ }
+
+ /* code adapted from CommentFormattingStrategy:
+ * scan the header content up to the first type. Once a comment is
+ * found, accumulate any additional comments up to the stop condition.
+ * The stop condition is reaching a package declaration, import container,
+ * or the end of the input.
+ */
+ IScanner scanner= ToolFactory.createScanner(true, false, false, false);
+ scanner.setSource(content.toCharArray());
+
+ int headerStart= -1;
+ int headerEnd= -1;
+ try {
+ boolean foundComment= false;
+ int terminal= scanner.getNextToken();
+ while (terminal != ITerminalSymbols.TokenNameEOF && !(terminal == ITerminalSymbols.TokenNameclass || terminal == ITerminalSymbols.TokenNameinterface || terminal == ITerminalSymbols.TokenNameenum || (foundComment && (terminal == ITerminalSymbols.TokenNameimport || terminal == ITerminalSymbols.TokenNamepackage)))) {
+
+ if (terminal == ITerminalSymbols.TokenNameCOMMENT_JAVADOC || terminal == ITerminalSymbols.TokenNameCOMMENT_BLOCK || terminal == ITerminalSymbols.TokenNameCOMMENT_LINE) {
+ if (!foundComment)
+ headerStart= scanner.getCurrentTokenStartPosition();
+ headerEnd= scanner.getCurrentTokenEndPosition();
+ foundComment= true;
+ }
+ terminal= scanner.getNextToken();
+ }
+
+
+ } catch (InvalidInputException ex) {
+ return null;
+ }
+
+ if (headerEnd != -1) {
+ return new Region(headerStart, headerEnd - headerStart);
+ }
+ }
+ return null;
+ }
+
+ private Position createProjectionPosition(IRegion region, IJavaElement element) {
+
+ if (fCachedDocument == null)
+ return null;
+
+ try {
+
+ int start= fCachedDocument.getLineOfOffset(region.getOffset());
+ int end= fCachedDocument.getLineOfOffset(region.getOffset() + region.getLength());
+ if (start != end) {
+ int offset= fCachedDocument.getLineOffset(start);
+ int endOffset;
+ if (fCachedDocument.getNumberOfLines() > end + 1)
+ endOffset= fCachedDocument.getLineOffset(end + 1);
+ else if (end > start)
+ endOffset= fCachedDocument.getLineOffset(end) + fCachedDocument.getLineLength(end);
+ else
+ return null;
+ if (element instanceof IMember)
+ return new JavaElementPosition(offset, endOffset - offset, (IMember) element);
+ else
+ return new CommentPosition(offset, endOffset - offset);
+ }
+
+ } catch (BadLocationException e) {
+ MylarStatusHandler.log(e, "");
+ }
+
+ return null;
+ }
+
+ protected void processDelta(IJavaElementDelta delta) {
+
+ if (!isInstalled())
+ return;
+
+ ProjectionAnnotationModel model= (ProjectionAnnotationModel) fEditor.getAdapter(ProjectionAnnotationModel.class);
+ if (model == null)
+ return;
+
+ try {
+
+ IDocumentProvider provider= fEditor.getDocumentProvider();
+ fCachedDocument= provider.getDocument(fEditor.getEditorInput());
+ fAllowCollapsing= false;
+
+ fFirstType= null;
+ fHasHeaderComment= false;
+
+ Map additions= new HashMap();
+ List deletions= new ArrayList();
+ List updates= new ArrayList();
+
+ Map updated= computeAdditions((IParent) fInput);
+ Map previous= createAnnotationMap(model);
+
+
+ Iterator e= updated.keySet().iterator();
+ while (e.hasNext()) {
+ JavaProjectionAnnotation newAnnotation= (JavaProjectionAnnotation) e.next();
+ IJavaElement element= newAnnotation.getElement();
+ Position newPosition= (Position) updated.get(newAnnotation);
+
+ List annotations= (List) previous.get(element);
+ if (annotations == null) {
+
+ additions.put(newAnnotation, newPosition);
+
+ } else {
+ Iterator x= annotations.iterator();
+ boolean matched= false;
+ while (x.hasNext()) {
+ Tuple tuple= (Tuple) x.next();
+ JavaProjectionAnnotation existingAnnotation= tuple.annotation;
+ Position existingPosition= tuple.position;
+ if (newAnnotation.isComment() == existingAnnotation.isComment()) {
+ if (existingPosition != null && (!newPosition.equals(existingPosition))) {
+ existingPosition.setOffset(newPosition.getOffset());
+ existingPosition.setLength(newPosition.getLength());
+ updates.add(existingAnnotation);
+ }
+ matched= true;
+ x.remove();
+ break;
+ }
+ }
+ if (!matched)
+ additions.put(newAnnotation, newPosition);
+
+ if (annotations.isEmpty())
+ previous.remove(element);
+ }
+ }
+
+ e= previous.values().iterator();
+ while (e.hasNext()) {
+ List list= (List) e.next();
+ int size= list.size();
+ for (int i= 0; i < size; i++)
+ deletions.add(((Tuple) list.get(i)).annotation);
+ }
+
+ match(model, deletions, additions, updates);
+
+ Annotation[] removals= new Annotation[deletions.size()];
+ deletions.toArray(removals);
+ Annotation[] changes= new Annotation[updates.size()];
+ updates.toArray(changes);
+ model.modifyAnnotations(removals, additions, changes);
+
+ } finally {
+ fCachedDocument= null;
+ fAllowCollapsing= true;
+
+ fFirstType= null;
+ fHasHeaderComment= false;
+ }
+ }
+
+ private void match(ProjectionAnnotationModel model, List deletions, Map additions, List changes) {
+ if (deletions.isEmpty() || (additions.isEmpty() && changes.isEmpty()))
+ return;
+
+ List newDeletions= new ArrayList();
+ List newChanges= new ArrayList();
+
+ Iterator deletionIterator= deletions.iterator();
+ outer: while (deletionIterator.hasNext()) {
+ JavaProjectionAnnotation deleted= (JavaProjectionAnnotation) deletionIterator.next();
+ Position deletedPosition= model.getPosition(deleted);
+ if (deletedPosition == null)
+ continue;
+
+ Iterator changesIterator= changes.iterator();
+ while (changesIterator.hasNext()) {
+ JavaProjectionAnnotation changed= (JavaProjectionAnnotation) changesIterator.next();
+ if (deleted.isComment() == changed.isComment()) {
+ Position changedPosition= model.getPosition(changed);
+ if (changedPosition == null)
+ continue;
+
+ if (deletedPosition.getOffset() == changedPosition.getOffset()) {
+
+ deletedPosition.setLength(changedPosition.getLength());
+ deleted.setElement(changed.getElement());
+
+ deletionIterator.remove();
+ newChanges.add(deleted);
+
+ changesIterator.remove();
+ newDeletions.add(changed);
+
+ continue outer;
+ }
+ }
+ }
+
+ Iterator additionsIterator= additions.keySet().iterator();
+ while (additionsIterator.hasNext()) {
+ JavaProjectionAnnotation added= (JavaProjectionAnnotation) additionsIterator.next();
+ if (deleted.isComment() == added.isComment()) {
+ Position addedPosition= (Position) additions.get(added);
+
+ if (deletedPosition.getOffset() == addedPosition.getOffset()) {
+
+ deletedPosition.setLength(addedPosition.getLength());
+ deleted.setElement(added.getElement());
+
+ deletionIterator.remove();
+ newChanges.add(deleted);
+
+ additionsIterator.remove();
+
+ break;
+ }
+ }
+ }
+ }
+
+ deletions.addAll(newDeletions);
+ changes.addAll(newChanges);
+ }
+
+ private Map createAnnotationMap(IAnnotationModel model) {
+ Map map= new HashMap();
+ Iterator e= model.getAnnotationIterator();
+ while (e.hasNext()) {
+ Object annotation= e.next();
+ if (annotation instanceof JavaProjectionAnnotation) {
+ JavaProjectionAnnotation java= (JavaProjectionAnnotation) annotation;
+ Position position= model.getPosition(java);
+ Assert.isNotNull(position);
+ List list= (List) map.get(java.getElement());
+ if (list == null) {
+ list= new ArrayList(2);
+ map.put(java.getElement(), list);
+ }
+ list.add(new Tuple(java, position));
+ }
+ }
+
+ Comparator comparator= new Comparator() {
+ public int compare(Object o1, Object o2) {
+ return ((Tuple) o1).position.getOffset() - ((Tuple) o2).position.getOffset();
+ }
+ };
+ for (Iterator it= map.values().iterator(); it.hasNext();) {
+ List list= (List) it.next();
+ Collections.sort(list, comparator);
+ }
+ return map;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/ContentOutlineTools.java b/org.eclipse.mylyn/developer/src-old/editors/ContentOutlineTools.java
new file mode 100644
index 0000000..d645ae5
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/ContentOutlineTools.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class ContentOutlineTools {
+
+ /** The default string used for locally created bugs. */
+ public static final String OFFLINE_SERVER_DEFAULT = "[local]";
+
+ /**
+ * Returns a unique handle for the bugzilla selection. Contains the bug taskId, the bug server, and (if applicable)
+ * the comment number.
+ *
+ * @param taskSelection
+ * The bugzilla selection.
+ * @return The handle for the bugzilla selection.
+ */
+ public static String getHandle(IRepositoryTaskSelection taskSelection) {
+ String handle = taskSelection.getRepositoryUrl() + ";" + taskSelection.getId();
+ if (taskSelection.hasComment()) {
+ int number = taskSelection.getComment().getNumber() + 1;
+ handle += ";" + number;
+ } else if (taskSelection.isCommentHeader()) {
+ handle += ";1";
+ } else if (taskSelection.isDescription()) {
+ handle += ";0";
+ }
+ return handle;
+ }
+
+ public static String getName(IRepositoryTaskSelection taskSelection) {
+ String name = taskSelection.getRepositoryUrl() + ": Bug#: " + taskSelection.getId() + ": "
+ + taskSelection.getBugSummary();
+ if (taskSelection.hasComment()) {
+ name += " : Comment#: " + taskSelection.getComment().getNumber();
+ } else if (taskSelection.isCommentHeader()) {
+ name += " : Comment Header";
+ } else if (taskSelection.isDescription()) {
+ name += ": Description";
+ }
+ return name;
+ }
+
+// public static String getHandle(RepositoryTaskData taskData) {
+// return getHandle(taskData.getRepositoryUrl(), taskData.getId());
+// }
+//
+// public static String getHandle(String server, String taskId) {
+// return server + ";" + taskId;
+// }
+
+// public static String getName(RepositoryTaskData taskData) {
+// return taskData.getRepositoryUrl() + ": Bug#: " + taskData.getId() + ": " + taskData.getSummary();
+// }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/MylarClassFileEditor.java b/org.eclipse.mylyn/developer/src-old/editors/MylarClassFileEditor.java
new file mode 100644
index 0000000..e163c2a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/MylarClassFileEditor.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Aug 6, 2004
+ */
+package org.eclipse.mylyn.java.ui.editor;
+
+import org.eclipse.jdt.core.IImportContainer;
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.ISourceRange;
+import org.eclipse.jdt.core.ISourceReference;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditor;
+import org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class MylarClassFileEditor extends ClassFileEditor {
+
+// private final ActiveFoldingListener FOLDING_LISTENER = new ActiveFoldingListener(this);
+
+ @Override
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ContextCorePlugin.getTaskscapeManager().addListener(FOLDING_LISTENER);
+ }
+ });
+ }
+
+
+ // EXPOSED METHODS FROM SUPER CLASS, DO NOT MODIFY
+ // -----------------------------------------------
+
+ /**
+ * Computes and returns the source reference that includes the caret and
+ * serves as provider for the outline page selection and the editor range
+ * indication.
+ *
+ * @return the computed source reference
+ * @since 3.0
+ */
+ @Override
+ protected ISourceReference computeHighlightRangeSourceReference() {
+ ISourceViewer sourceViewer= getSourceViewer();
+ if (sourceViewer == null)
+ return null;
+
+ StyledText styledText= sourceViewer.getTextWidget();
+ if (styledText == null)
+ return null;
+
+ int caret= 0;
+ if (sourceViewer instanceof ITextViewerExtension5) {
+ ITextViewerExtension5 extension= (ITextViewerExtension5)sourceViewer;
+ caret= extension.widgetOffset2ModelOffset(styledText.getCaretOffset());
+ } else {
+ int offset= sourceViewer.getVisibleRegion().getOffset();
+ caret= offset + styledText.getCaretOffset();
+ }
+
+ IJavaElement element= getElementAt(caret, false);
+
+ if ( !(element instanceof ISourceReference))
+ return null;
+
+ if (element.getElementType() == IJavaElement.IMPORT_DECLARATION) {
+
+ IImportDeclaration declaration= (IImportDeclaration) element;
+ IImportContainer container= (IImportContainer) declaration.getParent();
+ ISourceRange srcRange= null;
+
+ try {
+ srcRange= container.getSourceRange();
+ } catch (JavaModelException e) {
+ ContextCorePlugin.log(this.getClass().toString(), e);
+ }
+
+ if (srcRange != null && srcRange.getOffset() == caret)
+ return container;
+ }
+
+ return (ISourceReference) element;
+ }
+
+ /**
+ * Synchronizes the outliner selection with the given element
+ * position in the editor.
+ *
+ * @param element the java element to select
+ * @param checkIfOutlinePageActive <code>true</code> if check for active outline page needs to be done
+ */
+ @Override
+ protected void synchronizeOutlinePage(ISourceReference element, boolean checkIfOutlinePageActive) {
+ if (fOutlinePage != null && element != null && !(checkIfOutlinePageActive && isJavaOutlinePageActive())) {
+ fOutlineSelectionChangedListener.uninstall(fOutlinePage);
+ fOutlinePage.select(element);
+ fOutlineSelectionChangedListener.install(fOutlinePage);
+ }
+ }
+
+ @Override
+ protected IJavaElement getElementAt(int offset) {
+ if (getEditorInput() instanceof IClassFileEditorInput) {
+ try {
+ IClassFileEditorInput input= (IClassFileEditorInput) getEditorInput();
+ return input.getClassFile().getElementAt(offset);
+ } catch (JavaModelException e) {
+ ContextCorePlugin.log(this.getClass().toString(), e);
+ }
+ }
+ return null;
+ }
+
+ private boolean isJavaOutlinePageActive() {
+ IWorkbenchPart part= getActivePart();
+ return part instanceof ContentOutline && ((ContentOutline)part).getCurrentPage() == fOutlinePage;
+ }
+
+ private IWorkbenchPart getActivePart() {
+ IWorkbenchWindow window= getSite().getWorkbenchWindow();
+ IPartService service= window.getPartService();
+ IWorkbenchPart part= service.getActivePart();
+ return part;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/NewTaskEditorInput.java b/org.eclipse.mylyn/developer/src-old/editors/NewTaskEditorInput.java
new file mode 100644
index 0000000..78357d9
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/NewTaskEditorInput.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import java.util.Collections;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class NewTaskEditorInput extends RepositoryTaskEditorInput {
+
+ public NewTaskEditorInput(TaskRepository repository, RepositoryTaskData taskData) {
+ super(repository, taskData.getTaskId(), "");
+ setOldTaskData(taskData);
+ Set<RepositoryTaskAttribute> edits = Collections.emptySet();
+ setOldEdits(edits);
+ setEditableTaskData(taskData);
+ }
+
+ @Override
+ public String getName() {
+ return this.toolTipText;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof NewTaskEditorInput) {
+ NewTaskEditorInput input = (NewTaskEditorInput) o;
+ return input.getTaskData().equals(this.getTaskData());
+ }
+ return false;
+ }
+
+ @Override
+ public void refreshInput() {
+ // does nothing
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorCopyAction.java b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorCopyAction.java
new file mode 100644
index 0000000..8cb6d73
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorCopyAction.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+
+/**
+ * Action used to copy selected text from a bug editor to the clipboard.
+ */
+public class RepositoryTaskEditorCopyAction extends Action {
+ /** The editor to copy text selections from. */
+ private MylarTaskEditor bugEditor;
+
+ private ISelection selection;
+
+ /**
+ * Creates a new <code>RepositoryTaskEditorCopyAction</code>.
+ *
+ * @param editor
+ * The editor that this action is copying text selections from.
+ */
+ public RepositoryTaskEditorCopyAction(MylarTaskEditor editor) {
+ bugEditor = editor;
+ setText("AbstractTaskEditor.copy.text");
+ }
+
+ @Override
+ public void run() {
+ bugEditor.copyToClipboard(selection);
+ //bugEditor.getCurrentText().copy();
+ }
+
+ public void selectionChanged(ISelection selection) {
+ this.selection = selection;
+ setEnabled(bugEditor.canCopy(selection));
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorDropListener.java b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorDropListener.java
new file mode 100644
index 0000000..6806884
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorDropListener.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.io.File;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizard;
+import org.eclipse.mylyn.internal.tasks.ui.wizards.NewAttachmentWizardDialog;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.TransferData;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class RepositoryTaskEditorDropListener implements DropTargetListener {
+
+ private final AbstractRepositoryTaskEditor editor;
+
+ private final FileTransfer fileTransfer;
+
+ private final TextTransfer textTransfer;
+
+ private final Control control;
+
+ private final TaskRepository repository;
+
+ private final RepositoryTaskData taskData;
+
+ public RepositoryTaskEditorDropListener(AbstractRepositoryTaskEditor editor, TaskRepository repository,
+ RepositoryTaskData taskData, FileTransfer fileTransfer, TextTransfer textTransfer, Control control) {
+ this.editor = editor;
+ this.repository = repository;
+ this.taskData = taskData;
+ this.fileTransfer = fileTransfer;
+ this.textTransfer = textTransfer;
+ this.control = control;
+ }
+
+ public void dragEnter(DropTargetEvent event) {
+ if (event.detail == DND.DROP_DEFAULT) {
+ if ((event.operations & DND.DROP_COPY) != 0) {
+ event.detail = DND.DROP_COPY;
+ } else {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+ // will accept text but prefer to have files dropped
+ for (TransferData dataType : event.dataTypes) {
+ if (fileTransfer.isSupportedType(dataType)) {
+ event.currentDataType = dataType;
+ // files should only be copied
+ if (event.detail != DND.DROP_COPY) {
+ event.detail = DND.DROP_NONE;
+ }
+ break;
+ }
+ }
+ }
+
+ public void dragOver(DropTargetEvent event) {
+ event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
+ // if (textTransfer.isSupportedType(event.currentDataType)) {
+ // // NOTE: on unsupported platforms this will return null
+ // Object o = textTransfer.nativeToJava(event.currentDataType);
+ // String t = (String)o;
+ // if (t != null) System.out.println(t);
+ // }
+ }
+
+ public void dragOperationChanged(DropTargetEvent event) {
+ if ((event.detail == DND.DROP_DEFAULT) || (event.operations & DND.DROP_COPY) != 0) {
+
+ event.detail = DND.DROP_COPY;
+ } else {
+ event.detail = DND.DROP_NONE;
+ }
+
+ // allow text to be moved but files should only be copied
+ if (fileTransfer.isSupportedType(event.currentDataType)) {
+ if (event.detail != DND.DROP_COPY) {
+ event.detail = DND.DROP_NONE;
+ }
+ }
+ }
+
+ public void dragLeave(DropTargetEvent event) {
+ }
+
+ public void dropAccept(DropTargetEvent event) {
+ }
+
+ public void drop(DropTargetEvent event) {
+ if (textTransfer.isSupportedType(event.currentDataType)) {
+ String text = (String) event.data;
+ AbstractTask task = (AbstractTask) TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(),
+ taskData.getTaskId());
+ if (!(task != null)) {
+ // Should not happen
+ return;
+ }
+
+ editor.setGlobalBusy(true);
+ NewAttachmentWizard naw = new NewAttachmentWizard(repository, task, text);
+ openDialog(naw, null);
+ }
+ if (fileTransfer.isSupportedType(event.currentDataType)) {
+ String[] files = (String[]) event.data;
+ if (files.length > 0) {
+ AbstractTask task = (AbstractTask) TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(),
+ taskData.getTaskId());
+ if (task == null) {
+ // Should not happen
+ return;
+ }
+
+ NewAttachmentWizard naw = new NewAttachmentWizard(repository, task, new File(files[0]));
+ String error = null;
+ if (files.length > 1) {
+ error = "Note that only the first file dragged will be attached.";
+ }
+ openDialog(naw, error);
+ }
+ }
+ }
+
+ /**
+ * @param naw
+ * wizard to attach dialog to.
+ * @param message
+ * error to display or none if <code>null</code>
+ */
+ private void openDialog(NewAttachmentWizard naw, String message) {
+ editor.setGlobalBusy(true);
+ NewAttachmentWizardDialog dialog = new NewAttachmentWizardDialog(control.getShell(), naw, true);
+ naw.setDialog(dialog);
+ dialog.create();
+ if (null != message) {
+ dialog.setMessage(message, IMessageProvider.WARNING);
+ }
+ int result = dialog.open();
+ if (result != Window.OK) {
+ editor.setGlobalBusy(false);
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorInput.java b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorInput.java
new file mode 100644
index 0000000..f3fe9a6
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskEditorInput.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class RepositoryTaskEditorInput extends AbstractRepositoryTaskEditorInput {
+
+ protected String taskId;
+
+ protected String url;
+
+ protected AbstractTask repositoryTask = null;
+
+ public RepositoryTaskEditorInput(TaskRepository repository, String taskId, String taskUrl) {
+ super(repository, taskId);
+ this.taskId = taskId;
+ this.url = taskUrl;
+ AbstractTask task = (AbstractTask) TasksUiInternal.getTaskList().getTask(repository.getRepositoryUrl(), taskId);
+ if (task != null) {
+ this.repositoryTask = task;
+ }
+ }
+
+ public AbstractTask getRepositoryTask() {
+ return repositoryTask;
+ }
+
+ public String getName() {
+ if (repositoryTask != null) {
+ String idLabel = repositoryTask.getTaskKey();
+
+ String label = "";
+ if (idLabel != null) {
+ label += idLabel + ": ";
+ }
+ label += repositoryTask.getSummary();
+ return label;
+ } else if (getTaskData() != null && getTaskData().getLabel() != null) {
+ return getTaskData().getTaskKey() + ": " + getTaskData().getLabel();
+ } else if (taskId != null) {
+ return taskId;
+ } else {
+ return "<unknown>";
+ }
+ }
+
+ /**
+ * @return The taskId of the bug for this editor input.
+ */
+ public String getId() {
+ return taskId;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ((repositoryTask == null) ? 0 : repositoryTask.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final RepositoryTaskEditorInput other = (RepositoryTaskEditorInput) obj;
+ if (repositoryTask == null) {
+ if (other.repositoryTask != null) {
+ return false;
+ } else if (!other.getId().equals(this.getId())) {
+ return false;
+ }
+ } else if (!repositoryTask.equals(other.repositoryTask)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @return url for the repositoryTask/hit. Used by TaskEditor when opening browser
+ */
+ public String getUrl() {
+ return url;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlineComparer.java b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlineComparer.java
new file mode 100644
index 0000000..d58f0c8
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlineComparer.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.jface.viewers.IElementComparer;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class RepositoryTaskOutlineComparer implements IElementComparer {
+
+ public boolean equals(Object a, Object b) {
+ if ((a instanceof IRepositoryTaskSelection) && (b instanceof IRepositoryTaskSelection)) {
+ IRepositoryTaskSelection s1 = (IRepositoryTaskSelection) a;
+ IRepositoryTaskSelection s2 = (IRepositoryTaskSelection) b;
+
+ // An IRepositoryTaskSelection is uniquely defined by its handle and
+ // its contents
+ return ((ContentOutlineTools.getHandle(s1).equals(ContentOutlineTools.getHandle(s2))) && ((s1.getContents() == null) ? (s2.getContents() == null)
+ : s1.getContents().equals(s2.getContents())));
+ }
+ return a.equals(b);
+ }
+
+ public int hashCode(Object element) {
+ if (element instanceof IRepositoryTaskSelection) {
+ IRepositoryTaskSelection sel = (IRepositoryTaskSelection) element;
+
+ // An IRepositoryTaskSelection is uniquely defined by its handle and
+ // its contents
+ return (ContentOutlineTools.getHandle(sel) + sel.getContents()).hashCode();
+ }
+ return element.hashCode();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlineNode.java b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlineNode.java
new file mode 100644
index 0000000..e3d8b4f
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlineNode.java
@@ -0,0 +1,338 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class RepositoryTaskOutlineNode implements IRepositoryTaskSelection {
+
+ public static final String LABEL_DESCRIPTION = "Description";
+
+ public static final String LABEL_COMMENTS = "Comments";
+
+ public static final String LABEL_NEW_COMMENT = "New Comment";
+
+ /** The taskId of the Bugzilla object that the selection was on. */
+ protected String id;
+
+ /** The server of the Bugzilla object that the selection was on. */
+ protected String server;
+
+ /** connector kind */
+ private final String kind;
+
+ /** The label for this piece of data. */
+ private String key;
+
+ /** The children of this node. */
+ private ArrayList<RepositoryTaskOutlineNode> nodeChildren;
+
+ /** The parent of this node or null if it is the bug report */
+ private RepositoryTaskOutlineNode parent;
+
+ private Object data = null;
+
+ private final String bugSummary;
+
+ private final boolean fromEditor = false;
+
+ private boolean isCommentHeader = false;
+
+ private boolean isDescription = false;
+
+ /**
+ * Creates a new <code>RepositoryTaskOutlineNode</code>.
+ *
+ * @param taskId
+ * The taskId of the bug this outline is for.
+ * @param server
+ * The server of the bug this outline is for.
+ * @param key
+ * The label for this node.
+ * @param image
+ * The image that will be displayed by this node in the tree.
+ * @param data
+ * The data, if necessary, this node represents.
+ * @param parent
+ * The parent of this node
+ */
+ public RepositoryTaskOutlineNode(String id, String server, String kind, String key, Object data, String summary) {
+ this.id = id;
+ this.server = server;
+ this.kind = kind;
+ this.key = key;
+ this.nodeChildren = null;
+ this.data = data;
+ this.parent = null;
+ this.bugSummary = summary;
+ }
+
+ public boolean isFromEditor() {
+ return fromEditor;
+ }
+
+ /**
+ * @return The children of this node, represented as an <code>Object</code> array.
+ */
+ public RepositoryTaskOutlineNode[] getChildren() {
+ return (nodeChildren == null) ? new RepositoryTaskOutlineNode[0]
+ : nodeChildren.toArray(new RepositoryTaskOutlineNode[nodeChildren.size()]);
+ }
+
+ /**
+ * Adds a node to this node's list of children.
+ *
+ * @param bugNode
+ * The new child.
+ */
+ public void addChild(RepositoryTaskOutlineNode bugNode) {
+ if (nodeChildren == null) {
+ nodeChildren = new ArrayList<RepositoryTaskOutlineNode>();
+ }
+ bugNode.setParent(this);
+ nodeChildren.add(bugNode);
+ }
+
+ /**
+ * @return The label of this node.
+ */
+ public String getKey() {
+ return key;
+ }
+
+ /**
+ * @return <code>true</code> if the given object is another node representing the same piece of data in the editor.
+ */
+ @Override
+ public boolean equals(Object arg0) {
+ if (arg0 instanceof RepositoryTaskOutlineNode) {
+ RepositoryTaskOutlineNode bugNode = (RepositoryTaskOutlineNode) arg0;
+ return getKey().equals(bugNode.getKey());
+ }
+ return super.equals(arg0);
+ }
+
+ @Override
+ public int hashCode() {
+ return getKey().hashCode();
+ }
+
+ /**
+ * @return The name of this node.
+ */
+ public String getName() {
+ return getKey();
+ }
+
+ /**
+ * @return The data (where applicable) this node represents.
+ */
+ public Object getData() {
+ return data;
+ }
+
+ /**
+ * Sets the data that this node represents.
+ *
+ * @param data
+ * The new piece of data.
+ */
+ public void setData(Object data) {
+ this.data = data;
+ }
+
+ /**
+ * Parses the given <code>IBugzillaBug</code> into a tree of <code>RepositoryTaskOutlineNode</code>'s suitable for
+ * use in the <code>RepositoryTaskOutlinePage</code> view.
+ *
+ * @param bug
+ * The bug that needs parsing.
+ * @return The tree of <code>RepositoryTaskOutlineNode</code>'s.
+ */
+ public static RepositoryTaskOutlineNode parseBugReport(RepositoryTaskData bug, boolean hasNewComment) {
+ // Choose the appropriate parsing function based on
+ // the type of IBugzillaBug.
+ // if (bug instanceof NewBugzillaReport) {
+ // return parseNewBugReport((NewBugzillaReport) bug);
+ // } else
+ if (bug != null) {
+ return parseExistingBugReport(bug, hasNewComment);
+ } else {
+ return null;
+ }
+ }
+
+ public static RepositoryTaskOutlineNode parseBugReport(RepositoryTaskData bug) {
+ return parseBugReport(bug, true);
+ }
+
+// /**
+// * Parses the given <code>NewBugModel</code> into a tree of
+// * <code>RepositoryTaskOutlineNode</code>'s suitable for use in the
+// * <code>RepositoryTaskOutlinePage</code> view.
+// *
+// * @param bug
+// * The <code>NewBugModel</code> that needs parsing.
+// * @return The tree of <code>RepositoryTaskOutlineNode</code>'s.
+// */
+// protected static RepositoryTaskOutlineNode parseNewBugReport(NewBugzillaReport bug) {
+// int bugId = bug.getId();
+// String bugServer = bug.getRepositoryUrl();
+// Image bugImage = BugzillaImages.getImage(BugzillaImages.BUG);
+// Image defaultImage = BugzillaImages.getImage(BugzillaImages.BUG_COMMENT);
+// RepositoryTaskOutlineNode topNode = new RepositoryTaskOutlineNode(bugId, bugServer, bug.getLabel(), bugImage, bug, bug
+// .getSummary());
+//
+// topNode.addChild(new RepositoryTaskOutlineNode(bugId, bugServer, "New Description", defaultImage, null, bug
+// .getSummary()));
+//
+// RepositoryTaskOutlineNode titleNode = new RepositoryTaskOutlineNode(bugId, bugServer, "NewBugModel Object", defaultImage,
+// null, bug.getSummary());
+// titleNode.addChild(topNode);
+//
+// return titleNode;
+// }
+
+ /**
+ * Parses the given <code>BugReport</code> into a tree of <code>RepositoryTaskOutlineNode</code>'s suitable for use
+ * in the <code>RepositoryTaskOutlinePage</code> view.
+ *
+ * @param bug
+ * The <code>BugReport</code> that needs parsing.
+ * @return The tree of <code>RepositoryTaskOutlineNode</code>'s.
+ */
+ protected static RepositoryTaskOutlineNode parseExistingBugReport(RepositoryTaskData bug, boolean hasNewComment) {
+
+ String bugId = bug.getTaskId();
+ String bugServer = bug.getRepositoryUrl();
+ RepositoryTaskOutlineNode topNode = new RepositoryTaskOutlineNode(bugId, bugServer, bug.getConnectorKind(),
+ bug.getLabel(), bug, bug.getSummary());
+
+ RepositoryTaskOutlineNode desc = new RepositoryTaskOutlineNode(bugId, bugServer, bug.getConnectorKind(),
+ LABEL_DESCRIPTION, bug.getDescription(), bug.getSummary());
+ desc.setIsDescription(true);
+
+ topNode.addChild(desc);
+
+ RepositoryTaskOutlineNode comments = null;
+ for (TaskComment taskComment : bug.getComments()) {
+ // first comment is the bug summary
+ if (taskComment.getNumber() == 0) {
+ continue;
+ }
+ if (comments == null) {
+ comments = new RepositoryTaskOutlineNode(bugId, bugServer, bug.getConnectorKind(), LABEL_COMMENTS,
+ taskComment, bug.getSummary());
+ comments.setIsCommentHeader(true);
+ }
+ comments.addChild(new RepositoryTaskOutlineNode(bugId, bugServer, bug.getConnectorKind(),
+ taskComment.getCreated(), taskComment, bug.getSummary()));
+ }
+ if (comments != null) {
+ topNode.addChild(comments);
+ }
+
+ if (hasNewComment) {
+ topNode.addChild(new RepositoryTaskOutlineNode(bugId, bugServer, bug.getConnectorKind(), LABEL_NEW_COMMENT,
+ null, bug.getSummary()));
+ }
+
+ RepositoryTaskOutlineNode titleNode = new RepositoryTaskOutlineNode(bugId, bugServer, bug.getConnectorKind(),
+ "BugReport Object", null, bug.getSummary());
+ titleNode.addChild(topNode);
+
+ return titleNode;
+ }
+
+ public boolean hasComment() {
+ // If the comment category was selected, then the comment object is
+ // not the intended selection (it is just used to help find the correct
+ // location in the editor).
+ return (data instanceof TaskComment) && !(key.toLowerCase(Locale.ENGLISH).equals("comments"));
+ }
+
+ public TaskComment getComment() {
+ return (hasComment()) ? (TaskComment) data : null;
+ }
+
+ public void setComment(TaskComment taskComment) {
+ data = taskComment;
+ }
+
+ public String getContents() {
+ return key;
+ }
+
+ public void setContents(String contents) {
+ key = contents;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRepositoryUrl() {
+ return server;
+ }
+
+ public String getConnectorKind() {
+ return kind;
+ }
+
+ public void setServer(String server) {
+ this.server = server;
+ }
+
+ public boolean isEmpty() {
+ return (server == null) || ((getContents() == null) && (getComment() == null));
+ }
+
+ public RepositoryTaskOutlineNode getParent() {
+ return parent;
+ }
+
+ public void setParent(RepositoryTaskOutlineNode parent) {
+ this.parent = parent;
+ }
+
+ public boolean isCommentHeader() {
+ return isCommentHeader;
+ }
+
+ public boolean isDescription() {
+ return isDescription;
+ }
+
+ public void setIsCommentHeader(boolean isCommentHeader) {
+ this.isCommentHeader = isCommentHeader;
+ }
+
+ public void setIsDescription(boolean isDescription) {
+ this.isDescription = isDescription;
+ }
+
+ public String getBugSummary() {
+ return bugSummary;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlinePage.java b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlinePage.java
new file mode 100644
index 0000000..5b4dc58
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/RepositoryTaskOutlinePage.java
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.editors;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+import org.eclipse.mylyn.tasks.ui.TasksUiImages;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class RepositoryTaskOutlinePage extends ContentOutlinePage {
+
+ private final RepositoryTaskOutlineNode topTreeNode;
+
+ private final TaskRepository repository;
+
+ protected final ISelectionListener selectionListener = new ISelectionListener() {
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (selection instanceof IStructuredSelection) {
+ if (((IStructuredSelection) selection).getFirstElement() instanceof IRepositoryTaskSelection) {
+ if (((IStructuredSelection) getSelection()).getFirstElement() instanceof IRepositoryTaskSelection) {
+ IRepositoryTaskSelection brs1 = (IRepositoryTaskSelection) ((IStructuredSelection) getSelection()).getFirstElement();
+ IRepositoryTaskSelection brs2 = ((IRepositoryTaskSelection) ((IStructuredSelection) selection).getFirstElement());
+ if (ContentOutlineTools.getHandle(brs1).compareTo(ContentOutlineTools.getHandle(brs2)) == 0) {
+ // don't need to make a selection for the same
+ // element
+ return;
+ }
+ }
+ getTreeViewer().setSelection(selection, true);
+ }
+ }
+ }
+ };
+
+ private TreeViewer viewer;
+
+ /**
+ * Creates a new <code>RepositoryTaskOutlinePage</code>.
+ *
+ * @param topTreeNode
+ * The top data node of the tree for this view.
+ * @param editor
+ * The editor this outline page is for.
+ */
+ public RepositoryTaskOutlinePage(RepositoryTaskOutlineNode topTreeNode) {
+ super();
+ this.topTreeNode = topTreeNode;
+ repository = TasksUi.getRepositoryManager().getRepository(topTreeNode.getConnectorKind(),
+ topTreeNode.getRepositoryUrl());
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ viewer = getTreeViewer();
+ viewer.setContentProvider(new BugTaskOutlineContentProvider());
+ viewer.setLabelProvider(new LabelProvider() {
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof RepositoryTaskOutlineNode) {
+ RepositoryTaskOutlineNode node = (RepositoryTaskOutlineNode) element;
+
+ if (RepositoryTaskOutlineNode.LABEL_COMMENTS.equals(node.getContents())
+ || RepositoryTaskOutlineNode.LABEL_NEW_COMMENT.equals(node.getContents())) {
+ return CommonImages.getImage(TasksUiImages.COMMENT);
+ }
+ if (RepositoryTaskOutlineNode.LABEL_DESCRIPTION.equals(node.getContents())) {
+ return CommonImages.getImage(TasksUiImages.TASK_NOTES);
+ } else if (node.getComment() != null) {
+ if (repository != null && node.getComment().getAuthor().equals(repository.getUserName())) {
+ return CommonImages.getImage(CommonImages.PERSON_ME);
+ } else {
+ return CommonImages.getImage(CommonImages.PERSON);
+ }
+ } else {
+ return CommonImages.getImage(TasksUiImages.TASK);
+ }
+ } else {
+ return super.getImage(element);
+ }
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof RepositoryTaskOutlineNode) {
+ RepositoryTaskOutlineNode node = (RepositoryTaskOutlineNode) element;
+ TaskComment comment = node.getComment();
+ if (comment == null) {
+ return node.getName();
+ }
+ int n = comment.getNumber();
+// if (n == 0) {
+// return comment.getAuthorName() + " (" + node.getName() + ")";
+// }
+
+ String name = comment.getAuthorName();
+ if (name != null) {
+ String id = comment.getAuthor();
+ if (id != null) {
+ name += " <" + id + ">";
+ }
+ } else {
+ name = comment.getAuthor();
+ }
+
+ return n + ": " + name + " (" + node.getName() + ")";
+ }
+ return super.getText(element);
+ }
+ });
+ try {
+ viewer.setInput(topTreeNode);
+ viewer.setComparer(new RepositoryTaskOutlineComparer());
+ viewer.expandAll();
+ } catch (Exception e) {
+ StatusHandler.fail(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not create bugzilla outline",
+ e));
+ }
+ getSite().getPage().addSelectionListener(selectionListener);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ getSite().getPage().removeSelectionListener(selectionListener);
+ }
+
+ public TreeViewer getOutlineTreeViewer() {
+ return viewer;
+ }
+
+ /**
+ * A content provider for the tree for this view.
+ *
+ * @see ITreeContentProvider
+ */
+ protected static class BugTaskOutlineContentProvider implements ITreeContentProvider {
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof RepositoryTaskOutlineNode) {
+ Object[] children = ((RepositoryTaskOutlineNode) parentElement).getChildren();
+ if (children.length > 0) {
+ return children;
+ }
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof RepositoryTaskOutlineNode) {
+ return ((RepositoryTaskOutlineNode) element).getChildren().length > 0;
+ }
+ return false;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if (inputElement instanceof RepositoryTaskOutlineNode) {
+ Object[] children = ((RepositoryTaskOutlineNode) inputElement).getChildren();
+ if (children.length > 0) {
+ return children;
+ }
+ }
+ return new Object[0];
+ }
+
+ public void dispose() {
+ // don't care when we are disposed
+ }
+
+ public void inputChanged(Viewer viewerChanged, Object oldInput, Object newInput) {
+ // don't care when the input changes
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/TaskEditorUrlHyperlinkDetector.java b/org.eclipse.mylyn/developer/src-old/editors/TaskEditorUrlHyperlinkDetector.java
new file mode 100644
index 0000000..af1a57a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/TaskEditorUrlHyperlinkDetector.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 Mylar committers 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
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.URLHyperlink;
+import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
+
+/**
+ * @author Rob Elves
+ */
+public class TaskEditorUrlHyperlinkDetector implements IHyperlinkDetector {
+
+ // URL BNF: http://www.foad.org/~abigail/Perl/url2.html
+ // Source:
+ // http://www.truerwords.net/articles/ut/urlactivation.html#expressions
+ // Original pattern: (^|[
+ // \\t\\r\\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))
+ private static final Pattern urlPattern = Pattern
+ .compile(
+ "((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*,;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*,;/?:@&~=%-]*))?([A-Za-z0-9$_+!*;/?:~-]))",
+ Pattern.CASE_INSENSITIVE);
+
+ public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+
+ if (region == null || textViewer == null)
+ return null;
+
+ IDocument document = textViewer.getDocument();
+
+ List<IHyperlink> hyperlinksFound = new ArrayList<IHyperlink>();
+
+ int offset = region.getOffset();
+
+ if (document == null)
+ return null;
+
+ IRegion lineInfo;
+ String line;
+ try {
+ lineInfo = document.getLineInformationOfOffset(offset);
+ line = document.get(lineInfo.getOffset(), lineInfo.getLength());
+ } catch (BadLocationException ex) {
+ return null;
+ }
+
+ int offsetInLine = offset - lineInfo.getOffset();
+
+ Matcher m = urlPattern.matcher(line);
+
+ while (m.find()) {
+ if (offsetInLine >= m.start() && offsetInLine <= m.end()) {
+ IHyperlink link = extractHyperlink(lineInfo.getOffset(), m);
+ if (link != null)
+ hyperlinksFound.add(link);
+ }
+ }
+
+ if (hyperlinksFound.size() > 0) {
+ return hyperlinksFound.toArray(new IHyperlink[hyperlinksFound.size()]);
+ }
+
+ return null;
+
+ }
+
+ private TaskEditorUrlHyperlink extractHyperlink(int lineOffset, Matcher m) {
+
+ int start = m.start();
+ int end = m.end();
+
+ if (end == -1)
+ end = m.group().length();
+
+ start += lineOffset;
+ end += lineOffset;
+
+ IRegion sregion = new Region(start, end - start);
+ return new TaskEditorUrlHyperlink(sregion, m.group());
+ }
+
+ static class TaskEditorUrlHyperlink extends URLHyperlink {
+
+ public TaskEditorUrlHyperlink(IRegion region, String urlString) {
+ super(region, urlString);
+ }
+
+ @Override
+ public void open() {
+ // TODO: if url is to a repository task, open task instead of url
+ TasksUiUtil.openBrowser(getURLString());
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/TaskFactory.java b/org.eclipse.mylyn/developer/src-old/editors/TaskFactory.java
new file mode 100644
index 0000000..5719fc7
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/TaskFactory.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import java.util.Set;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.ITaskList;
+import org.eclipse.mylyn.internal.tasks.core.TaskDataStorageManager;
+import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskFactory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
+import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.ITask.SynchronizationState;
+import org.eclipse.mylyn.tasks.ui.TasksUi;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class TaskFactory implements ITaskFactory {
+
+ private final AbstractLegacyRepositoryConnector connector;
+
+ private final TaskDataManager synchManager;
+
+ private final TaskRepository repository;
+
+ private final ITaskList taskList;
+
+ private final AbstractTaskDataHandler dataHandler;
+
+ private final boolean updateTasklist;
+
+ private final boolean forced;
+
+ public TaskFactory(TaskRepository repository, boolean updateTasklist, boolean forced) {
+ this.repository = repository;
+ this.updateTasklist = updateTasklist;
+ this.forced = forced;
+ connector = (AbstractLegacyRepositoryConnector) TasksUi.getRepositoryManager().getRepositoryConnector(
+ repository.getConnectorKind());
+ synchManager = TasksUiPlugin.getTaskDataManager();
+ taskList = TasksUiInternal.getTaskList();
+ //dataManager = TasksUiPlugin.getTaskDataManager();
+ dataHandler = connector.getLegacyTaskDataHandler();
+ }
+
+ @Deprecated
+ public TaskFactory(TaskRepository repository) {
+ this(repository, true, false);
+ }
+
+ /**
+ * @param updateTasklist
+ * - synchronize task with the provided taskData
+ * @param forced
+ * - user requested synchronization
+ * @throws CoreException
+ */
+ public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
+ AbstractTask repositoryTask = (AbstractTask) taskList.getTask(taskData.getRepositoryUrl(), taskData.getTaskId());
+ if (repositoryTask == null) {
+ repositoryTask = createTaskFromTaskData(connector, repository, taskData, updateTasklist, monitor);
+ repositoryTask.setSynchronizationState(SynchronizationState.INCOMING);
+ if (updateTasklist) {
+ taskList.addTask(repositoryTask);
+ synchManager.saveIncoming(repositoryTask, taskData, forced);
+ } else {
+ synchManager.saveOffline(repositoryTask, taskData);
+ }
+
+ } else {
+ if (updateTasklist) {
+ synchManager.saveIncoming(repositoryTask, taskData, forced);
+ connector.updateTaskFromTaskData(repository, repositoryTask, taskData);
+ if (dataHandler != null) {
+ for (ITask child : repositoryTask.getChildren()) {
+ taskList.removeFromContainer(repositoryTask, child);
+ }
+ Set<String> subTaskIds = dataHandler.getSubTaskIds(taskData);
+ if (subTaskIds != null) {
+ for (String subId : subTaskIds) {
+ if (subId == null || subId.trim().equals("")) {
+ continue;
+ }
+ AbstractTask subTask = createTaskFromExistingId(connector, repository, subId, false,
+ new SubProgressMonitor(monitor, 1));
+ if (subTask != null) {
+ taskList.addTask(subTask, repositoryTask);
+ }
+ }
+ }
+ }
+ }
+ }
+ return repositoryTask;
+ }
+
+ /**
+ * Creates a new task from the given task data. Does NOT add resulting task to the tasklist
+ */
+ private AbstractTask createTaskFromTaskData(AbstractLegacyRepositoryConnector connector, TaskRepository repository,
+ RepositoryTaskData taskData, boolean retrieveSubTasks, IProgressMonitor monitor) throws CoreException {
+ AbstractTask repositoryTask = null;
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ try {
+ TaskDataStorageManager taskDataManager = TasksUiPlugin.getTaskDataStorageManager();
+ if (taskData != null) {
+ // Use connector task factory
+ repositoryTask = connector.createTask(repository.getRepositoryUrl(), taskData.getTaskId(),
+ taskData.getTaskId() + ": " + taskData.getDescription());
+ connector.updateTaskFromTaskData(repository, repositoryTask, taskData);
+ taskDataManager.setNewTaskData(taskData);
+
+ if (retrieveSubTasks) {
+ monitor.beginTask("Creating task", connector.getLegacyTaskDataHandler()
+ .getSubTaskIds(taskData)
+ .size());
+ for (String subId : connector.getLegacyTaskDataHandler().getSubTaskIds(taskData)) {
+ if (subId == null || subId.trim().equals("")) {
+ continue;
+ }
+ AbstractTask subTask = createTaskFromExistingId(connector, repository, subId, false,
+ new SubProgressMonitor(monitor, 1));
+ if (subTask != null) {
+ taskList.addTask(subTask, repositoryTask);
+ }
+ }
+ }
+ }
+ } finally {
+ monitor.done();
+ }
+ return repositoryTask;
+ }
+
+ /**
+ * Create new repository task, adding result to tasklist
+ */
+ private AbstractTask createTaskFromExistingId(AbstractLegacyRepositoryConnector connector,
+ TaskRepository repository, String id, boolean retrieveSubTasks, IProgressMonitor monitor)
+ throws CoreException {
+ AbstractTask repositoryTask = (AbstractTask) taskList.getTask(repository.getRepositoryUrl(), id);
+ if (repositoryTask == null && connector.getLegacyTaskDataHandler() != null) {
+ RepositoryTaskData taskData = null;
+ taskData = connector.getLegacyTaskDataHandler().getTaskData(repository, id,
+ new SubProgressMonitor(monitor, 1));
+ if (taskData != null) {
+ repositoryTask = createTaskFromTaskData(connector, repository, taskData, retrieveSubTasks,
+ new SubProgressMonitor(monitor, 1));
+ if (repositoryTask != null) {
+ repositoryTask.setSynchronizationState(SynchronizationState.INCOMING);
+ taskList.addTask(repositoryTask);
+ }
+ }
+ } // TODO: Handle case similar to web tasks (no taskDataHandler but
+ // have tasks)
+
+ return repositoryTask;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/editors/TaskSpellingReconcileStrategy.java b/org.eclipse.mylyn/developer/src-old/editors/TaskSpellingReconcileStrategy.java
new file mode 100644
index 0000000..aedc276
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/TaskSpellingReconcileStrategy.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 Jeff Pound 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:
+ * Jeff Pound - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.ui.editors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilerExtension;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.mylyn.internal.tasks.ui.deprecated.TaskFormPage.ErrorAnnotation;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector;
+import org.eclipse.ui.texteditor.spelling.SpellingContext;
+import org.eclipse.ui.texteditor.spelling.SpellingProblem;
+
+/**
+ * Adapted from org.eclipse.jdt.internal.ui.text.spelling.PropertiesSpellingReconcileStrategy
+ *
+ * @author Jeff Pound
+ * @author Rob Elves
+ */
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class TaskSpellingReconcileStrategy implements IReconcilerExtension, IReconcilingStrategy {
+
+ /**
+ * Spelling problem collector that forwards {@link SpellingProblem}s as {@link IProblem}s to the
+ * {@link org.eclipse.jdt.core.IProblemRequestor}.
+ */
+ private class SpellingProblemCollector implements ISpellingProblemCollector {
+
+ /** Annotation model */
+ private final IAnnotationModel fAnnotationModel;
+
+ /** Annotations to add */
+ private Map<ErrorAnnotation, Position> fAddAnnotations;
+
+ /**
+ * Initializes this collector with the given annotation model.
+ *
+ * @param annotationModel
+ * the annotation model
+ */
+ public SpellingProblemCollector(IAnnotationModel annotationModel) {
+ fAnnotationModel = annotationModel;
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#accept(org.eclipse.ui.texteditor.spelling.SpellingProblem)
+ */
+ public void accept(SpellingProblem problem) {
+ try {
+ int line = fDocument.getLineOfOffset(problem.getOffset()) + 1;
+
+ fAddAnnotations.put(new ErrorAnnotation(line, null), new Position(problem.getOffset(),
+ problem.getLength()));
+
+ } catch (BadLocationException x) {
+ // drop this SpellingProblem
+ }
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#beginCollecting()
+ */
+ public void beginCollecting() {
+ fAddAnnotations = new HashMap<ErrorAnnotation, Position>();
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.spelling.ISpellingProblemCollector#endCollecting()
+ */
+ @SuppressWarnings("unchecked")
+ public void endCollecting() {
+
+ List<Annotation> removeAnnotations = new ArrayList<Annotation>();
+ for (Iterator iter = fAnnotationModel.getAnnotationIterator(); iter.hasNext();) {
+ Annotation annotation = (Annotation) iter.next();
+ if (ErrorAnnotation.ERROR_TYPE.equals(annotation.getType())) {
+ removeAnnotations.add(annotation);
+ }
+ }
+
+ for (Object element : removeAnnotations) {
+ fAnnotationModel.removeAnnotation((Annotation) element);
+ }
+ for (Object element : fAddAnnotations.keySet()) {
+ Annotation annotation = (Annotation) element;
+ fAnnotationModel.addAnnotation(annotation, fAddAnnotations.get(annotation));
+ }
+
+ fAddAnnotations = null;
+ }
+ }
+
+ /** The taskId of the problem */
+ public static final int SPELLING_PROBLEM_ID = 0x80000000;
+
+ /** The document to operate on. */
+ private IDocument fDocument;
+
+ /** The progress monitor. */
+ private IProgressMonitor fProgressMonitor;
+
+ /**
+ * The spelling context containing the Java properties content type.
+ * <p>
+ * Since his reconcile strategy is for the Properties File editor which normally edits Java properties files we
+ * always use the Java properties file content type for performance reasons.
+ * </p>
+ *
+ * @since 3.2
+ */
+ private final SpellingContext fSpellingContext;
+
+ private IAnnotationModel annotationModel;
+
+ public TaskSpellingReconcileStrategy() {
+ this.annotationModel = null;
+ fSpellingContext = new SpellingContext();
+ fSpellingContext.setContentType(Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT));
+ }
+
+ /*
+ * @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#initialReconcile()
+ */
+ public void initialReconcile() {
+ reconcile(new Region(0, fDocument.getLength()));
+ }
+
+ /*
+ * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion,org.eclipse.jface.text.IRegion)
+ */
+ public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+ reconcile(subRegion);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.IRegion)
+ */
+ public void reconcile(IRegion region) {
+ TaskSpellingReconcileStrategy.SpellingProblemCollector collector = new SpellingProblemCollector(annotationModel);
+ EditorsUI.getSpellingService().check(fDocument, fSpellingContext, collector, fProgressMonitor);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#setDocument(org.eclipse.jface.text.IDocument)
+ */
+ public void setDocument(IDocument document) {
+ fDocument = document;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ public void setProgressMonitor(IProgressMonitor monitor) {
+ fProgressMonitor = monitor;
+ }
+
+ public String getDocumentPartitioning() {
+ // ignore
+ return null;
+ }
+
+ public void setAnnotationModel(IAnnotationModel model) {
+ annotationModel = model;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/editors/plugin-scraps.xml b/org.eclipse.mylyn/developer/src-old/editors/plugin-scraps.xml
new file mode 100644
index 0000000..4b92226
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/editors/plugin-scraps.xml
@@ -0,0 +1,8 @@
+ <editor
+ name="Mylar Class File Viewer"
+ icon="icons/eview16/editor-mylar-class.gif"
+ extensions="class"
+ contributorClass="org.eclipse.jdt.internal.ui.javaeditor.ClassFileEditorActionContributor"
+ class="ca.ubc.mylar.java.ui.editor.MylarClassFileEditor"
+ id="ca.ubc.mylar.java.ui.editor.MylarClassFileEditor">
+ </editor>
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/hypertext/RelatedLinks.java b/org.eclipse.mylyn/developer/src-old/hypertext/RelatedLinks.java
new file mode 100644
index 0000000..8b4820c
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/hypertext/RelatedLinks.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.hypertext.ui.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Related links stored for each task used as input to the Table used in the
+ * TaskInfoEditor
+ *
+ * @author Ken Sueda
+ */
+public class RelatedLinks {
+
+ private List<String> links;
+
+ public RelatedLinks() {
+ links = new ArrayList<String>();
+ }
+
+ public void add(String link) {
+ links.add(link);
+ }
+
+ public List<String> getLinks() {
+ return links;
+ }
+
+ public void remove(String link) {
+ links.remove(link);
+ }
+
+ public void clear() {
+ links.clear();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditor.java b/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditor.java
new file mode 100644
index 0000000..9314280
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditor.java
@@ -0,0 +1,480 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.hypertext.ui.editors;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.mylyn.internal.hypertext.HypertextStructureBridge;
+import org.eclipse.mylyn.internal.tasklist.ui.TaskListImages;
+import org.eclipse.mylyn.provisional.core.IMylarContext;
+import org.eclipse.mylyn.provisional.core.IMylarContextListener;
+import org.eclipse.mylyn.provisional.core.IMylarElement;
+import org.eclipse.mylyn.provisional.core.MylarPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackListener;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.IExpansionListener;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
+import org.eclipse.ui.part.EditorPart;
+
+public class WebElementsEditor extends EditorPart {
+
+ private static final String LABEL = "Web Documents in Active Context";
+
+ private Composite editorComposite;
+
+ private ScrolledForm form;
+
+ private Tree linksTree;
+
+ private TreeViewer treeViewer;
+
+ private List<String> links;
+
+ private WebResourceContentProvider contentProvider;
+
+ private Action add;
+
+ private Action delete;
+
+ private final IMylarContextListener REFRESH_UPDATE_LISTENER = new IMylarContextListener() {
+ public void interestChanged(IMylarElement node) {
+ // ignore
+ }
+
+ public void interestChanged(List<IMylarElement> nodes) {
+ // ignore
+ }
+
+ public void contextActivated(IMylarContext taskscape) {
+ update();
+ }
+
+ public void contextDeactivated(IMylarContext taskscape) {
+ update();
+ }
+
+ public void presentationSettingsChanging(UpdateKind kind) {
+ // ignore
+ }
+
+ public void landmarkAdded(IMylarElement node) {
+ // ignore
+ }
+
+ public void landmarkRemoved(IMylarElement node) {
+ // ignore
+ }
+
+ public void edgesChanged(IMylarElement node) {
+ // ignore
+ }
+
+ public void nodeDeleted(IMylarElement node) {
+ // ignore
+ }
+
+ public void presentationSettingsChanged(UpdateKind kind) {
+ // ignore
+ }
+ };
+
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void doSaveAs() {
+
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ setSite(site);
+ setInput(input);
+ setPartName(LABEL);
+ }
+
+ @Override
+ public boolean isDirty() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void dispose() {
+ ContextCorePlugin.getContextManager().removeListener(REFRESH_UPDATE_LISTENER);
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ FormToolkit toolkit = new FormToolkit(parent.getDisplay());
+ form = toolkit.createScrolledForm(parent);
+ form.getBody().setLayout(new TableWrapLayout());
+ editorComposite = form.getBody();
+
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.bottomMargin = 10;
+ layout.topMargin = 10;
+ layout.leftMargin = 10;
+ layout.rightMargin = 10;
+ layout.numColumns = 1;
+ layout.makeColumnsEqualWidth = true;
+ layout.verticalSpacing = 20;
+ layout.horizontalSpacing = 10;
+ editorComposite.setLayout(layout);
+ // editorComposite.setLayoutData(new
+ // TableWrapData(TableWrapData.FILL_GRAB));
+
+ // Put the info onto the editor
+ createContent(editorComposite, toolkit);
+ form.setFocus();
+ ContextCorePlugin.getContextManager().addListener(REFRESH_UPDATE_LISTENER);
+ }
+
+ private void createContent(Composite parent, FormToolkit toolkit) {
+ Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ section.setText(LABEL);
+ section.setLayout(new TableWrapLayout());
+ section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+ section.addExpansionListener(new IExpansionListener() {
+ public void expansionStateChanging(ExpansionEvent e) {
+ form.reflow(true);
+ }
+
+ public void expansionStateChanged(ExpansionEvent e) {
+ form.reflow(true);
+ }
+ });
+
+ Composite container = toolkit.createComposite(section);
+ section.setClient(container);
+ TableWrapLayout layout = new TableWrapLayout();
+ layout.numColumns = 3;
+ container.setLayout(layout);
+ container.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+
+ createTable(container, toolkit);
+ createTableViewer(container, toolkit);
+ toolkit.paintBordersFor(container);
+ // createAddDeleteButtons(container, toolkit);
+ }
+
+ @Override
+ public void setFocus() {
+ // TODO Auto-generated method stub
+
+ }
+
+ private void createTableViewer(Composite parent, FormToolkit toolkit) {
+ // String[] columnNames = {"Links"};
+ treeViewer = new TreeViewer(linksTree);
+ // treeViewer.setColumnProperties(columnNames);
+
+ // CellEditor[] editors = new CellEditor[columnNames.length];
+ // TextCellEditor textEditor = new TextCellEditor(linksTree);
+ // ((Text) textEditor.getControl()).setTextLimit(50);
+ // ((Text) textEditor.getControl()).setOrientation(SWT.LEFT_TO_RIGHT);
+ // editors[0] = textEditor;
+ // tableViewer.setCellEditors(editors);
+ // tableViewer.setCellModifier(new RelatedLinksCellModifier());
+
+ contentProvider = new WebResourceContentProvider();
+ treeViewer.setContentProvider(contentProvider);
+ treeViewer.setLabelProvider(new WebResourceLabelProvider());
+ treeViewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ String url = (String) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ if (url != null)
+ openURLinBrowser(url);
+ }
+ });
+
+ update();
+ defineActions();
+ hookContextMenu();
+ }
+
+ public void update() {
+ if (treeViewer.getContentProvider() != null) {
+ treeViewer.setInput(getWebDocs());
+ treeViewer.expandAll();
+ }
+ }
+
+ private List<String> getWebDocs() {
+ links = new ArrayList<String>();
+ List<IMylarElement> elements = ContextCorePlugin.getContextManager().getInterestingDocuments();
+ for (IMylarElement element : elements) {
+ if (element.getContentType().equals(HypertextStructureBridge.CONTENT_TYPE)) {
+ links.add(element.getHandleIdentifier());
+ }
+ }
+ return links;
+ }
+
+ private void createTable(Composite parent, FormToolkit toolkit) {
+ linksTree = toolkit.createTree(parent, SWT.NONE);
+ // TreeColumn col1 = new TreeColumn(linksTree, SWT.NULL);
+ // TableLayout tlayout = new TableLayout();
+ // tlayout.addColumnData(new ColumnWeightData(0,0,false));
+ // linksTree.setLayout(tlayout);
+ TableWrapData wd = new TableWrapData(TableWrapData.FILL_GRAB);
+ wd.heightHint = 350;
+ wd.grabVertical = true;
+ linksTree.setLayoutData(wd);
+ linksTree.setHeaderVisible(false);
+ // col1.addSelectionListener(new SelectionAdapter() {
+ // @Override
+ // public void widgetSelected(SelectionEvent e) {
+ // treeViewer.setSorter(new RelatedLinksTableSorter(
+ // RelatedLinksTableSorter.LABEL));
+ // }
+ // });
+ linksTree.addMouseTrackListener(new MouseTrackListener() {
+ public void mouseEnter(MouseEvent e) {
+ if (!((WebResourceContentProvider) treeViewer.getContentProvider()).isEmpty()) {
+ Cursor hyperlinkCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
+ Display.getCurrent().getCursorControl().setCursor(hyperlinkCursor);
+ }
+ }
+
+ public void mouseExit(MouseEvent e) {
+ Cursor pointer = new Cursor(Display.getCurrent(), SWT.CURSOR_ARROW);
+ if (Display.getCurrent() != null && Display.getCurrent().getCursorControl() != null) {
+ Display.getCurrent().getCursorControl().setCursor(pointer);
+ }
+ }
+
+ public void mouseHover(MouseEvent e) {
+ if (!((WebResourceContentProvider) treeViewer.getContentProvider()).isEmpty()) {
+ Cursor hyperlinkCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND);
+ Display.getCurrent().getCursorControl().setCursor(hyperlinkCursor);
+ }
+ }
+ });
+ }
+
+ // private void createAddDeleteButtons(Composite parent, FormToolkit
+ // toolkit) {
+ // Composite container = toolkit.createComposite(parent);
+ // container.setLayout(new GridLayout(2, true));
+ // Button addButton = toolkit.createButton(container, " Add Hyperlink ",
+ // SWT.PUSH | SWT.CENTER);
+ // addButton.addSelectionListener(new SelectionAdapter() {
+ // @Override
+ // public void widgetSelected(SelectionEvent e) {
+ // addLinkToTable();
+ // }
+ // });
+ //
+ // Button deleteButton = toolkit.createButton(container, "Delete Hyperlink
+ // ", SWT.PUSH | SWT.CENTER);
+ // deleteButton.addSelectionListener(new SelectionAdapter() {
+ //
+ // @Override
+ // public void widgetSelected(SelectionEvent e) {
+ // removeLinkFromTable();
+ // }
+ // });
+ // }
+
+ private void addLinkToTable() {
+ // InputDialog dialog = new InputDialog(Display.getDefault()
+ // .getActiveShell(), "New related link",
+ // "Enter new related link for this task", "", null);
+ // dialog.open();
+ // String url = null;
+ // String link = dialog.getValue();
+ // if (link != null) {
+ // if (!(link.startsWith("http://") || link.startsWith("https://"))) {
+ // url = "http://" + link;
+ // } else {
+ // url = link;
+ // }
+ // tableViewer.add(url);
+ // }
+ }
+
+ private void removeLinkFromTable() {
+ String url = (String) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+ if (url != null) {
+ ContextCorePlugin.getContextManager().delete(ContextCorePlugin.getContextManager().getElement(url));
+ }
+ treeViewer.setInput(getWebDocs());
+ }
+
+ private void defineActions() {
+ delete = new Action() {
+ @Override
+ public void run() {
+ removeLinkFromTable();
+ }
+ };
+ delete.setText("Mark as Uninteresting");
+ delete.setToolTipText("Mark as Uninteresting");
+ delete.setImageDescriptor(TaskListImages.REMOVE);
+
+ add = new Action() {
+ @Override
+ public void run() {
+ addLinkToTable();
+ }
+ };
+ add.setText("Add");
+ add.setToolTipText("Add");
+ // add.setImageDescriptor(MylarImages.REMOVE);
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager("#PopupMenu");
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ // manager.add(add);
+ manager.add(delete);
+ }
+ });
+ Menu menu = menuMgr.createContextMenu(treeViewer.getControl());
+ treeViewer.getControl().setMenu(menu);
+ // getSite().registerContextMenu(menuMgr, tableViewer);
+ }
+
+ private void openURLinBrowser(String url) {
+ try {
+ IWebBrowser browser = null;
+ int flags = 0;
+ if (WorkbenchBrowserSupport.getInstance().isInternalWebBrowserAvailable()) {
+ flags = WorkbenchBrowserSupport.AS_EDITOR | WorkbenchBrowserSupport.LOCATION_BAR
+ | WorkbenchBrowserSupport.NAVIGATION_BAR;
+
+ } else {
+ flags = WorkbenchBrowserSupport.AS_EXTERNAL | WorkbenchBrowserSupport.LOCATION_BAR
+ | WorkbenchBrowserSupport.NAVIGATION_BAR;
+ }
+ browser = WorkbenchBrowserSupport.getInstance().createBrowser(flags, "org.eclipse.mylyn.tasklist",
+ "Mylar Context Browser", "tasktooltip");
+ browser.openURL(new URL(url));
+ } catch (PartInitException e) {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "URL not found", url
+ + " could not be opened");
+ } catch (MalformedURLException e) {
+ MessageDialog.openError(Display.getDefault().getActiveShell(), "URL not found", url
+ + " could not be opened");
+ }
+ }
+
+ public TreeViewer getTreeViewer() {
+ return treeViewer;
+ }
+
+ // private class RelatedLinksCellModifier implements ICellModifier,
+ // IColorProvider {
+ // RelatedLinksCellModifier() {
+ // super();
+ //
+ // }
+ // public boolean canModify(Object element, String property) {
+ // return true;
+ // }
+ // public Object getValue(Object element, String property) {
+ // Object res = null;
+ // if (element instanceof String) {
+ // String url = (String) element;
+ // openURLinBrowser(url);
+ // res = (String) element;
+ // }
+ // return res;
+ // }
+ // public void modify(Object element, String property, Object value) {
+ // return;
+ // }
+ //
+ // public Color getForeground(Object element) {
+ // return HYPERLINK;
+ // }
+ //
+ // public Color getBackground(Object element) {
+ // return null;
+ // }
+ // }
+
+ // private class RelatedLinksTableSorter extends ViewerSorter {
+ //
+ // public final static int LABEL = 1;
+ //
+ // private int criteria;
+ //
+ // public RelatedLinksTableSorter(int criteria) {
+ // super();
+ // this.criteria = criteria;
+ // }
+ //
+ // @Override
+ // public int compare(Viewer viewer, Object o1, Object o2) {
+ // String s1 = (String) o1;
+ // String s2 = (String) o2;
+ // switch (criteria) {
+ // case LABEL:
+ // return compareLabel(s1, s2);
+ // default:
+ // return 0;
+ // }
+ // }
+ //
+ // protected int compareLabel(String s1, String s2) {
+ // return s1.compareTo(s2);
+ // }
+ //
+ // public int getCriteria() {
+ // return criteria;
+ // }
+ // }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditorFactory.java b/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditorFactory.java
new file mode 100644
index 0000000..a594bed
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditorFactory.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.hypertext.ui.editors;
+
+import org.eclipse.mylyn.internal.tasklist.ui.ITaskEditorFactory;
+import org.eclipse.mylyn.internal.tasklist.ui.editors.MylarTaskEditor;
+import org.eclipse.mylyn.provisional.tasklist.ITask;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * @author Mik Kersten
+ */
+public class WebElementsEditorFactory implements ITaskEditorFactory {
+
+ public void notifyEditorActivationChange(IEditorPart editor) {
+ if (editor instanceof WebElementsEditor) {
+ ((WebElementsEditor) editor).update();
+ }
+ }
+
+ public EditorPart createEditor(MylarTaskEditor parentEditor) {
+ return new WebElementsEditor();
+ }
+
+ public IEditorInput createEditorInput(ITask task) {
+ return new WebElementsEditorInput(task);
+ }
+
+ public String getTitle() {
+ return "Web Docs";
+ }
+
+ public boolean canCreateEditorFor(ITask task) {
+ return true;
+ }
+
+ public boolean providesOutline() {
+ return false;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditorInput.java b/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditorInput.java
new file mode 100644
index 0000000..5e6c980
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/hypertext/WebElementsEditorInput.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.hypertext.ui.editors;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.provisional.tasklist.ITask;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+/**
+ * @author Ken Sueda
+ */
+public class WebElementsEditorInput implements IEditorInput {
+
+ private static final String LABEL_EDITOR = "Web Docs";
+
+ // private IMylarContext context;
+
+ public WebElementsEditorInput(ITask task) {
+ // this.context = context;
+ }
+
+ public boolean exists() {
+ return true;
+ }
+
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ public String getName() {
+ return LABEL_EDITOR;
+ }
+
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ public String getToolTipText() {
+ return LABEL_EDITOR;
+ }
+
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/hypertext/WebResourceContentProvider.java b/org.eclipse.mylyn/developer/src-old/hypertext/WebResourceContentProvider.java
new file mode 100644
index 0000000..55dbddc
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/hypertext/WebResourceContentProvider.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.hypertext.ui.editors;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.hypertext.HypertextStructureBridge;
+import org.eclipse.mylyn.internal.hypertext.MylarHypertextPlugin;
+import org.eclipse.mylyn.provisional.core.IMylarStructureBridge;
+import org.eclipse.mylyn.provisional.core.MylarPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class WebResourceContentProvider implements IStructuredContentProvider, ITreeContentProvider {
+
+// private final WebElementsEditor editor;
+
+// /**
+// * @param editor
+// */
+// WebResourceContentProvider(WebElementsEditor editor) {
+// this.editor = editor;
+// }
+
+ @SuppressWarnings("unchecked")
+ public Object[] getElements(Object parent) {
+ if (parent instanceof ArrayList) {
+ List<String> webDocs = (ArrayList<String>) parent;
+ IMylarStructureBridge bridge = ContextCore.getStructureBridge(
+ HypertextStructureBridge.CONTENT_TYPE);
+ Set<String> sites = new HashSet<String>();
+ for (String link : webDocs) {
+ String webSite = bridge.getParentHandle(link);
+ if (webSite != null) {
+ sites.add(webSite);
+ List<String> pages = MylarHypertextPlugin.getWebResourceManager().getSitesMap().get(webSite);
+ if (pages == null) {
+ pages = new ArrayList<String>();
+ MylarHypertextPlugin.getWebResourceManager().getSitesMap().put(webSite, pages);
+ }
+ pages.add(link);
+ }
+ }
+ if (sites.size() > 0) {
+ return sites.toArray();
+ } else {
+ return new String[] { "Task context not activated" };
+ }
+ } else {
+ return getChildren(parent);
+ }
+ }
+
+ public void dispose() {
+ // don't care if we are disposed
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // don't care if the input chages
+ }
+
+ public boolean isEmpty() {
+ return false;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof String) {
+ String site = (String) parentElement;
+ List<String> pages = MylarHypertextPlugin.getWebResourceManager().getSitesMap().get(site);
+ if (pages != null)
+ return pages.toArray();
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public boolean hasChildren(Object parentElement) {
+ if (parentElement instanceof String) {
+ String site = (String) parentElement;
+ List<String> pages = MylarHypertextPlugin.getWebResourceManager().getSitesMap().get(site);
+ return pages != null && pages.size() > 0;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/hypertext/WebResourceLabelProvider.java b/org.eclipse.mylyn/developer/src-old/hypertext/WebResourceLabelProvider.java
new file mode 100644
index 0000000..6088610
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/hypertext/WebResourceLabelProvider.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.hypertext.ui.editors;
+
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.mylyn.internal.hypertext.MylarHypertextPlugin;
+import org.eclipse.mylyn.internal.hypertext.ui.HypertextImages;
+import org.eclipse.mylyn.internal.tasklist.ui.TaskListColorsAndFonts;
+import org.eclipse.mylyn.internal.ui.MylarImages;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * @author Mik Kersten
+ */
+public class WebResourceLabelProvider extends LabelProvider implements ITableLabelProvider, IColorProvider {
+
+ public String getColumnText(Object obj, int columnIndex) {
+ String result = "";
+ if (obj instanceof String) {
+ switch (columnIndex) {
+ case 0:
+ result = (String) obj;
+ break;
+ default:
+ break;
+ }
+ }
+ return result;
+ }
+
+ public Image getColumnImage(Object obj, int columnIndex) {
+ if (columnIndex == 0) {
+ if (!MylarHypertextPlugin.getWebResourceManager().getSitesMap().containsKey(obj)) {
+ return MylarImages.getImage(HypertextImages.WEB_PAGE);
+ }
+ }
+ return null;
+ }
+
+ public Color getForeground(Object element) {
+ return TaskListColorsAndFonts.COLOR_HYPERLINK;
+ }
+
+ public Color getBackground(Object element) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/jira/JiraIssueContentOutlinePage.java b/org.eclipse.mylyn/developer/src-old/jira/JiraIssueContentOutlinePage.java
new file mode 100644
index 0000000..588f379
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/jira/JiraIssueContentOutlinePage.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Jira Dashboard project.
+ * 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:
+ * Brock Janiczak - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.jira.ui;
+
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.mylyn.internal.jira.MylarJiraPlugin;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.tigris.jira.core.model.Comment;
+import org.tigris.jira.core.model.Issue;
+
+/**
+ * @author Brock Janiczak
+ */
+public class JiraIssueContentOutlinePage extends ContentOutlinePage {
+
+ private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
+
+ private final Issue issue;
+
+ private Image commentImage;
+ private Image jiraImage;
+
+ private final JiraTaskEditor editor;
+
+ public JiraIssueContentOutlinePage(Issue issue) {
+ this(null, issue);
+ }
+
+ public JiraIssueContentOutlinePage(JiraTaskEditor editor, Issue issue) {
+ this.editor = editor;
+ this.issue = issue;
+ commentImage = MylarJiraPlugin.getDefault().getImageRegistry().get("icons/obj16/comment.gif");
+ jiraImage = MylarJiraPlugin.getDefault().getImageRegistry().get("icons/obj16/jira.png");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+
+ TreeViewer treeViewer = getTreeViewer();
+
+ treeViewer.setContentProvider(new ITreeContentProvider() {
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ public void dispose() {
+ }
+
+ public Object[] getElements(Object inputElement) {
+ List<Object> elements = new ArrayList<Object>();
+ elements.add(issue.getSummary());
+ elements.addAll(Arrays.asList(issue.getComments()));
+
+ // root elements are summary, environment, description and "comments"
+
+ return elements.toArray();
+ }
+
+ public boolean hasChildren(Object element) {
+ // "comments" has children
+ return false;
+ }
+
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ // Get all of the comments from the comment list
+ return new Object[0];
+ }
+
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ public String getText(Object element) {
+ if (element instanceof Comment) {
+ Comment comment = (Comment)element;
+ return DATE_FORMAT.format(comment.getCreated()) + " " + comment.getAuthor();
+ }
+ return super.getText(element);
+ }
+
+ public Image getImage(Object element) {
+ if (element instanceof Comment) {
+ return commentImage;
+ } else {
+ // TODO the summary should be a placeholder object
+ return jiraImage;
+ }
+ }
+
+ });
+
+ treeViewer.addOpenListener(new IOpenListener() {
+
+ public void open(OpenEvent event) {
+ if (editor == null) {
+ return;
+ }
+
+ Object selection = ((IStructuredSelection)event.getSelection()).getFirstElement();
+ if (selection instanceof Comment) {
+ editor.revealComment((Comment)selection);
+ }
+ }
+
+ });
+ treeViewer.setInput(issue);
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/jira/JiraIssueEditorInput.java b/org.eclipse.mylyn/developer/src-old/jira/JiraIssueEditorInput.java
new file mode 100644
index 0000000..9140c7d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/jira/JiraIssueEditorInput.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Jira Dashboard project.
+ * 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:
+ * Brock Janiczak - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.jira.ui;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.mylyn.internal.jira.JiraTask;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+
+public class JiraIssueEditorInput implements IEditorInput {
+
+ private final JiraTask task;
+
+ public JiraIssueEditorInput(JiraTask task) {
+ this.task = task;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ public boolean exists() {
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ public String getName() {
+ return task.getHandleIdentifier();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return task.getDescription();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ return Platform.getAdapterManager().getAdapter(this, adapter);
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof JiraIssueEditorInput)) {
+ return false;
+ }
+
+ JiraIssueEditorInput that = (JiraIssueEditorInput) obj;
+ return (this.task.getHandleIdentifier().equals(that.task.getHandleIdentifier()) &&
+ this.task.getRepositoryUrl().equals(that.task.getRepositoryUrl()));
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return this.task.getHandleIdentifier().hashCode() + this.task.getRepositoryUrl().hashCode();
+ }
+
+ /**
+ * @return the task
+ */
+ public JiraTask getTask() {
+ return this.task;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/jira/JiraTaskEditor.java b/org.eclipse.mylyn/developer/src-old/jira/JiraTaskEditor.java
new file mode 100644
index 0000000..31c5989
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/jira/JiraTaskEditor.java
@@ -0,0 +1,419 @@
+/*******************************************************************************
+ * Copyright (c) 2006 - 2006 Mylar eclipse.org project 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:
+ * Mylar project committers - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.jira.ui;
+
+import java.text.DateFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.mylyn.internal.jira.JiraServerFacade;
+import org.eclipse.mylyn.internal.jira.JiraTask;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+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.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.internal.forms.widgets.*;
+import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.tigris.jira.core.model.Comment;
+import org.tigris.jira.core.model.Issue;
+import org.tigris.jira.core.service.JiraServer;
+
+/**
+ * @author Brock Janiczak
+ * @author Mik Kersten (minor fixes)
+ */
+public class JiraTaskEditor extends EditorPart {
+
+ private static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
+
+ private JiraIssueEditorInput input;
+
+ private Text comment;
+
+ private boolean isDirty = false;
+
+ private Map<Comment, ExpandableComposite> commentToControlMap = new HashMap<Comment, ExpandableComposite>();
+
+ private JiraServer server;
+
+ private Issue issue;
+
+ private ScrolledComposite sc;
+
+ private Section commentsSection;
+
+ public JiraTaskEditor() {
+ // commentImage =
+ // MylarJiraPlugin.getImageDescriptor("icons/ctool16/comment.gif").createImage();
+ // commentFont =
+ // JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
+ }
+
+ public void doSave(IProgressMonitor monitor) {
+ server.addCommentToIssue(issue, comment.getText());
+ comment.setText("");
+ isDirty = false;
+ }
+
+ public boolean isSaveAsAllowed() {
+ return false;
+ }
+
+ public void doSaveAs() {
+ }
+
+ public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+ this.input = (JiraIssueEditorInput) input;
+ setSite(site);
+ setInput(input);
+ setPartName(this.input.getName());
+ JiraTask task = this.input.getTask();
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(task.getRepositoryKind(),
+ task.getRepositoryUrl());
+ server = JiraServerFacade.getDefault().getJiraServer(repository);
+ String key = task.getKey();
+ if (key == null || key.trim().equals("")) {
+ throw new PartInitException("Could not find issue key, synchronize query to resolve.");
+ } else {
+ issue = server.getIssue(key);
+ }
+ }
+
+ public boolean isDirty() {
+ return isDirty;
+// if (comment != null) {
+// int charCount = comment.getCharCount();
+// isDirty = charCount > 0;
+// return isDirty;
+// } else {
+// return false;
+// }
+ }
+
+ public void createPartControl(Composite parent) {
+ FormToolkit toolkit = new FormToolkit(getSite().getShell().getDisplay());
+ Form form = toolkit.createForm(parent);
+ GridLayout formLayout = new GridLayout(1, true);
+ final Composite formBody = form.getBody();
+ formBody.setLayout(formLayout);
+
+ if (issue == null) {
+ form.setText("Error opening task");
+ toolkit.createLabel(formBody, "Could not download: " + this.input.getTask().getDescription());
+ toolkit.createLabel(formBody, "\nTry synchronizing the corresponding query");
+ return;
+ }
+
+ form.setText(issue.getKey() + ": " + issue.getSummary());
+
+ Section summarySection = toolkit.createSection(formBody, ExpandableComposite.TITLE_BAR
+ | ExpandableComposite.TWISTIE);
+ summarySection.setText("Attributes");
+ summarySection.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
+ summarySection.setExpanded(true);
+ Composite summary = toolkit.createComposite(summarySection);
+ summary.setLayout(new GridLayout(6, false));
+
+ Label lblCreated = toolkit.createLabel(summary, "Created:");
+ lblCreated.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, DATE_FORMAT.format(issue.getCreated()));
+
+ Label lblUpdated = toolkit.createLabel(summary, "Updated:");
+ lblUpdated.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, DATE_FORMAT.format(issue.getUpdated()));
+
+ if (issue.getDue() != null) {
+ Label lblDue = toolkit.createLabel(summary, "Due:");
+ lblDue.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, DATE_FORMAT.format(issue.getDue()));
+ } else {
+ Label spacer = toolkit.createLabel(summary, "");
+ spacer.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).create());
+ }
+
+ Label lblStatus = toolkit.createLabel(summary, "Status:");
+ lblStatus.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, issue.getStatus().getName());
+
+ Label lblResolution = toolkit.createLabel(summary, "Resolution:");
+ lblResolution.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ if (issue.getResolution() != null) {
+ Label resolution = toolkit.createLabel(summary, issue.getResolution().getName());
+ resolution.setToolTipText(issue.getResolution().getDescription());
+ } else {
+ toolkit.createLabel(summary, "Unresolved");
+ }
+
+ Label lblPriority = toolkit.createLabel(summary, "Priority:");
+ lblPriority.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ if (issue.getPriority() != null) {
+ Label priority = toolkit.createLabel(summary, issue.getPriority().getName());
+ priority.setToolTipText(issue.getPriority().getDescription());
+ } else {
+ toolkit.createLabel(summary, "No Priority");
+ }
+
+ Label lblReporter = toolkit.createLabel(summary, "Reporter:");
+ lblReporter.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, issue.getReporter());
+
+ Label lblAssignee = toolkit.createLabel(summary, "Assignee");
+ lblAssignee.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, issue.getAssignee());
+
+ // spacer
+ Label spacer2 = toolkit.createLabel(summary, "");
+ spacer2.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).create());
+
+ StringBuffer sbComponents = new StringBuffer();
+ if (issue.getComponents().length > 0) {
+ for (int i = 0; i < issue.getComponents().length; i++) {
+ if (i != 0) {
+ sbComponents.append(", ");
+ }
+
+ sbComponents.append(issue.getComponents()[i].getName());
+ }
+ } else {
+ sbComponents.append("None");
+ }
+
+ Label lblComponents = toolkit.createLabel(summary, "Components");
+ lblComponents.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, sbComponents.toString());
+
+ StringBuffer sbAffectsVersions = new StringBuffer();
+ if (issue.getReportedVersions().length > 0) {
+ for (int i = 0; i < issue.getReportedVersions().length; i++) {
+ if (i != 0) {
+ sbAffectsVersions.append(", ");
+ }
+
+ sbAffectsVersions.append(issue.getReportedVersions()[i].getName());
+ }
+ } else {
+ sbAffectsVersions.append("None");
+ }
+
+ Label lblAffectsVersion = toolkit.createLabel(summary, "Affects Versions");
+ lblAffectsVersion.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, sbAffectsVersions.toString());
+
+ StringBuffer sbFixVersions = new StringBuffer();
+ if (issue.getFixVersions().length > 0) {
+ for (int i = 0; i < issue.getFixVersions().length; i++) {
+ if (i != 0) {
+ sbFixVersions.append(", ");
+ }
+
+ sbFixVersions.append(issue.getFixVersions()[i].getName());
+ }
+ } else {
+ sbFixVersions.append("None");
+ }
+
+ Label lblFixVersions = toolkit.createLabel(summary, "Fix Versions");
+ lblFixVersions.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
+ toolkit.createLabel(summary, sbFixVersions.toString());
+
+ summarySection.setClient(summary);
+
+ // created, updated, due (optional)
+
+ final Section descriptionSection = toolkit.createSection(formBody, ExpandableComposite.TITLE_BAR
+ | ExpandableComposite.TWISTIE);
+ descriptionSection.setExpanded(true);
+ descriptionSection.setText("Description");
+ final GridData dgd = GridDataFactory.fillDefaults().grab(true, false).create();
+ descriptionSection.setLayoutData(dgd);
+
+ Composite c = toolkit.createComposite(descriptionSection);
+ GridLayout gl = new GridLayout(1, true);
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ c.setLayout(gl);
+
+ Text description = toolkit.createText(c, issue.getDescription(), SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ description.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).minSize(200, 80).hint(200, 80)
+ .create());
+
+ description.setText(issue.getDescription());
+ description.setEditable(false);
+ description.setFont(JFaceResources.getTextFont());
+ descriptionSection.setClient(c);
+
+ commentsSection = toolkit.createSection(formBody, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE);
+ commentsSection.setExpanded(true);
+ ImageHyperlink sortOrder = toolkit.createImageHyperlink(commentsSection, SWT.NONE);
+ sortOrder.setText("Direction");
+
+ commentsSection.setTextClient(sortOrder);
+ commentsSection.setText("Comments");
+ commentsSection.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
+
+ sc = new ScrolledComposite(commentsSection, SWT.H_SCROLL | SWT.V_SCROLL);
+ sc.setExpandHorizontal(true);
+ sc.setExpandVertical(true);
+
+ sc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ final Composite c1 = toolkit.createComposite(sc);
+ GridLayout commentsLayout = new GridLayout(1, true);
+ commentsLayout.marginWidth = 0;
+ commentsLayout.marginHeight = 0;
+
+ c1.setLayout(commentsLayout);
+
+ for (int i = 0; i < issue.getComments().length; i++) {
+ Comment comment = issue.getComments()[i];
+
+ ExpandableComposite expandableComposite = toolkit.createExpandableComposite(c1,
+ ExpandableComposite.TREE_NODE);
+ expandableComposite.setText("Comment by " + comment.getAuthor() + " ["
+ + DATE_FORMAT.format(comment.getCreated()) + "]");
+ expandableComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
+ expandableComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
+
+ Text t = toolkit.createText(expandableComposite, comment.getComment(), SWT.MULTI | SWT.WRAP);
+ t.setEditable(false);
+ t.setFont(JFaceResources.getTextFont());
+
+ expandableComposite.setClient(t);
+ expandableComposite.addExpansionListener(new ExpansionAdapter() {
+
+ @Override
+ public void expansionStateChanged(ExpansionEvent e) {
+ sc.layout(true, true);
+ }
+
+ });
+ commentToControlMap.put(comment, expandableComposite);
+
+ t.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
+
+ if (i == issue.getComments().length - 1) {
+ expandableComposite.setExpanded(true);
+ }
+
+ }
+
+ commentsSection.setClient(sc);
+
+ sc.addControlListener(new ControlAdapter() {
+
+ public void controlResized(ControlEvent e) {
+ Point size = c1.computeSize(sc.getClientArea().width, SWT.DEFAULT);
+ sc.setMinSize(size);
+ }
+
+ });
+
+ final Section commentSection = toolkit.createSection(formBody, ExpandableComposite.TWISTIE
+ | ExpandableComposite.TITLE_BAR);
+ commentSection.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());
+ commentSection.setText("Add Comment");
+ commentSection.setExpanded(false);
+ commentSection.addExpansionListener(new ExpansionAdapter() {
+
+ public void expansionStateChanged(ExpansionEvent e) {
+ formBody.layout(true);
+ }
+ });
+
+ final Composite commentArea = toolkit.createComposite(commentSection);
+ GridLayout commentAreaLayout = new GridLayout(1, false);
+ commentAreaLayout.marginHeight = 0;
+ commentAreaLayout.marginWidth = 0;
+ commentAreaLayout.verticalSpacing = 0;
+ commentAreaLayout.horizontalSpacing = 0;
+ commentArea.setLayout(commentAreaLayout);
+
+ commentSection.setClient(commentArea);
+
+ comment = new Text(commentArea, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+ comment.setFont(JFaceResources.getTextFont());
+ final GridData commentGd = new GridData(SWT.FILL, SWT.FILL, true, false);
+ commentGd.heightHint = 80;
+ comment.setLayoutData(commentGd);
+
+ comment.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ int charCount = comment.getCharCount();
+ if (charCount > 0) {
+ isDirty = true;
+// if ((isDirty && charCount == 0) || (!isDirty && charCount > 0)) {
+ firePropertyChange(PROP_DIRTY);
+ }
+ }
+
+ });
+ sc.setContent(c1);
+ sc.setMinSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ }
+
+ @SuppressWarnings("restriction")
+ public void revealComment(Comment comment) {
+ Control control = (Control) this.commentToControlMap.get(comment);
+ if (control != null) {
+ commentsSection.setExpanded(true);
+ ((ExpandableComposite) control).setExpanded(true);
+ // XXX Clone or create a new version of this
+ FormUtil.ensureVisible(sc, control);
+ sc.layout(true, true);
+ }
+ }
+
+ public void setFocus() {
+ }
+
+ public void dispose() {
+ super.dispose();
+ // commentImage.dispose();
+ }
+
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class adapter) {
+ if (IContentOutlinePage.class.equals(adapter)) {
+ return new JiraIssueContentOutlinePage(this, this.issue);
+ }
+
+ return super.getAdapter(adapter);
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/CardinalStatistic.java b/org.eclipse.mylyn/developer/src-old/monitor/CardinalStatistic.java
new file mode 100644
index 0000000..cd9ea80
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/CardinalStatistic.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 20, 2004
+ */
+package org.eclipse.mylyn.monitor.internal;
+
+
+
+
+/**
+ * @author Mik Kersten
+ */
+public class CardinalStatistic extends UsageStatistic {
+
+ private long count = 0;
+
+ public CardinalStatistic(String handle) {
+ super(handle);
+ }
+
+ public void increment() {
+ count++;
+ }
+
+ public void increment(long increment) {
+ count += increment;
+ }
+
+ public long getCount() {
+ return count;
+ }
+
+ public void setCount(long count) {
+ this.count = count;
+ }
+
+ @Override
+ public String toFormattedString() {
+ return toValueString();
+ }
+
+ @Override
+ public String toValueString() {
+ return "" + count;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof CardinalStatistic) {
+ CardinalStatistic cardinalStatistic = (CardinalStatistic)object;
+ return cardinalStatistic.getCount() == count
+ && super.equals(object);
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/PassiveTimer.java b/org.eclipse.mylyn/developer/src-old/monitor/PassiveTimer.java
new file mode 100644
index 0000000..a41358c
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/PassiveTimer.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.sandbox.misc;
+
+/**
+ * Check against the system clock--doesn't need to run as thread.
+ *
+ * @author Mik Kersten
+ */
+public class PassiveTimer {
+
+ private long elapsed = 0;
+
+ private long lastStartTime = System.currentTimeMillis();
+
+ public void restart() {
+ lastStartTime = System.currentTimeMillis();
+ elapsed = 0;
+ }
+
+ public long getElapsedInSeconds() {
+ elapsed = System.currentTimeMillis() - lastStartTime;
+ return elapsed / 1000;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/SelectionMonitor.java b/org.eclipse.mylyn/developer/src-old/monitor/SelectionMonitor.java
new file mode 100644
index 0000000..f5fc67c
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/SelectionMonitor.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jun 10, 2005
+ */
+package org.eclipse.mylyn.internal.monitor.monitors;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
+import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.mylyn.internal.core.MylarContextManager;
+import org.eclipse.mylyn.internal.monitor.HandleObfuscator;
+import org.eclipse.mylyn.provisional.core.AbstractUserInteractionMonitor;
+import org.eclipse.mylyn.provisional.core.IMylarElement;
+import org.eclipse.mylyn.provisional.core.InteractionEvent;
+import org.eclipse.mylyn.provisional.core.MylarPlugin;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.EditorPart;
+
+/**
+ * Limited to Java selections.
+ *
+ * @author Mik Kersten
+ */
+public class SelectionMonitor extends AbstractUserInteractionMonitor {
+
+ private static final String ID_JAVA_UNKNOWN = "(non-source element)";
+
+ public static final String SELECTION_DEFAULT = "selected";
+
+ public static final String SELECTION_NEW = "new";
+
+ public static final String SELECTION_DECAYED = "decayed";
+
+ public static final String SELECTION_PREDICTED = "predicted";
+
+ private static final Object ID_JAVA_UNKNOW_OLD = "(non-existing element)";
+
+ private IJavaElement lastSelectedElement = null;
+
+ private HandleObfuscator obfuscator = new HandleObfuscator();
+
+ @Override
+ protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection) {
+ // ignored, since not using context monitoring facilities
+ }
+
+ @Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ String structureKind = InteractionEvent.ID_UNKNOWN;
+ String obfuscatedElementHandle = InteractionEvent.ID_UNKNOWN;
+ String elementHandle = InteractionEvent.ID_UNKNOWN;
+ InteractionEvent.Kind interactionKind = InteractionEvent.Kind.SELECTION;
+ if (selection instanceof StructuredSelection) {
+ StructuredSelection structuredSelection = (StructuredSelection) selection;
+ Object selectedObject = structuredSelection.getFirstElement();
+ if (selectedObject == null)
+ return;
+ if (selectedObject instanceof IJavaElement) {
+ IJavaElement javaElement = (IJavaElement) selectedObject;
+ structureKind = "java:" + javaElement.getClass();
+ elementHandle = javaElement.getHandleIdentifier();
+ obfuscatedElementHandle = obfuscateJavaElementHandle(javaElement);
+ lastSelectedElement = javaElement;
+ } else {
+ structureKind = InteractionEvent.ID_UNKNOWN + ": " + selectedObject.getClass();
+ if (selectedObject instanceof IAdaptable) {
+ IResource resource = (IResource) ((IAdaptable) selectedObject).getAdapter(IResource.class);
+ if (resource != null) {
+ obfuscatedElementHandle = obfuscator.obfuscateResourcePath(resource.getProjectRelativePath());
+ }
+ }
+ }
+ } else {
+ if (selection instanceof TextSelection && part instanceof JavaEditor) {
+ TextSelection textSelection = (TextSelection) selection;
+ IJavaElement javaElement;
+ try {
+ javaElement = SelectionConverter.resolveEnclosingElement((JavaEditor) part, textSelection);
+ if (javaElement != null) {
+ structureKind = "java:" + javaElement.getClass();
+ obfuscatedElementHandle = obfuscateJavaElementHandle(javaElement);
+ elementHandle = javaElement.getHandleIdentifier();
+ if (javaElement != null && javaElement.equals(lastSelectedElement)) {
+ interactionKind = InteractionEvent.Kind.EDIT;
+ }
+ lastSelectedElement = javaElement;
+ }
+ } catch (JavaModelException e) {
+ // ignore unresolved elements
+ }
+ } else if (part instanceof EditorPart) {
+ EditorPart editorPart = (EditorPart) part;
+ IEditorInput input = editorPart.getEditorInput();
+ if (input instanceof IPathEditorInput) {
+ structureKind = "file";
+ obfuscatedElementHandle = obfuscator.obfuscateResourcePath(((IPathEditorInput) input).getPath());
+ }
+ }
+ }
+ IMylarElement node = ContextCorePlugin.getContextManager().getElement(elementHandle);
+ String delta = "";
+ float selectionFactor = MylarContextManager.getScalingFactors().get(InteractionEvent.Kind.SELECTION).getValue();
+
+ // XXX: broken in 0.4?
+ if (node != null) {
+ if (node.getInterest().getEncodedValue() <= selectionFactor
+ && node.getInterest().getValue() > selectionFactor) {
+ delta = SELECTION_PREDICTED;
+ } else if (node.getInterest().getEncodedValue() < selectionFactor
+ && node.getInterest().getDecayValue() > selectionFactor) {
+ delta = SELECTION_DECAYED;
+ } else if (node.getInterest().getValue() == selectionFactor
+ && node.getInterest().getDecayValue() < selectionFactor) {
+ delta = SELECTION_NEW;
+ } else {
+ delta = SELECTION_DEFAULT;
+ }
+ }
+
+ InteractionEvent event = new InteractionEvent(interactionKind, structureKind, obfuscatedElementHandle, part
+ .getSite().getId(), "null", delta, 0);
+ ContextCore.notifyInteractionObserved(event);
+ }
+
+ private String obfuscateJavaElementHandle(IJavaElement javaElement) {
+ try {
+ StringBuffer obfuscatedPath = new StringBuffer();
+ IResource resource;
+ resource = (IResource) javaElement.getUnderlyingResource();
+ if (resource != null && (resource instanceof IFile)) {
+ IFile file = (IFile) resource;
+ obfuscatedPath.append(obfuscator.obfuscateResourcePath(file.getProjectRelativePath()));
+ obfuscatedPath.append(':');
+ obfuscatedPath.append(obfuscator.obfuscateString(javaElement.getElementName()));
+ return obfuscatedPath.toString();
+ } else {
+ return obfuscator.obfuscateString(javaElement.getHandleIdentifier());
+ }
+ } catch (JavaModelException e) {
+ // ignore non-existing element
+ }
+ return ID_JAVA_UNKNOWN;
+ }
+
+ /**
+ * Some events do not have a valid handle, e.g. hande is null or ?
+ */
+ public static boolean isValidStructureHandle(InteractionEvent event) {
+ String handle = event.getStructureHandle();
+ return handle != null
+ && !handle.trim().equals("")
+ && !handle.equals(SelectionMonitor.ID_JAVA_UNKNOWN)
+ && !handle.equals(SelectionMonitor.ID_JAVA_UNKNOW_OLD)
+ && event.isValidStructureHandle();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/TemporalStatistic.java b/org.eclipse.mylyn/developer/src-old/monitor/TemporalStatistic.java
new file mode 100644
index 0000000..2ac20aa
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/TemporalStatistic.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 20, 2004
+ */
+package org.eclipse.mylyn.monitor.internal;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+
+
+
+/**
+ * @author Mik Kersten
+ */
+public class TemporalStatistic extends UsageStatistic {
+
+ private String time;
+
+ public TemporalStatistic(String handle, String time, ImageDescriptor icon) {
+ super(handle);
+ this.time = time;
+ }
+
+ @Override
+ public String toFormattedString() {
+ return toValueString();
+ }
+
+ @Override
+ public String toValueString() {
+ return time;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof TemporalStatistic) {
+ TemporalStatistic statistic = (TemporalStatistic)object;
+ return statistic.getTime().equals(time)
+ && super.equals(object);
+ } else {
+ return false;
+ }
+ }
+}
+
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/UsageCountView.java b/org.eclipse.mylyn/developer/src-old/monitor/UsageCountView.java
new file mode 100644
index 0000000..f9b9ec2
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/UsageCountView.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
package org.eclipse.mylyn.monitor.reports.ui.views;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.monitor.MylarMonitorPlugin;
+import org.eclipse.mylyn.monitor.reports.IUsageCollector;
+import org.eclipse.mylyn.monitor.reports.ReportGenerator;
+import org.eclipse.mylyn.monitor.reports.collectors.SummaryCollector;
+import org.eclipse.mylyn.monitor.reports.internal.InteractionEventSummarySorter;
+import org.eclipse.mylyn.monitor.ui.MonitorImages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Leah Findlater and Mik Kersten
+ */
public class UsageCountView extends ViewPart {
+ private ReportGenerator parser;
+
private TableViewer viewer;
private Table table;
private Action exportToFileAction;
private Action importFromZipAction;
private Action importFromFileAction;
private Action refreshAction;
private File source;
/* Table column property names */
private String[] columnNames = new String[] {
"Type",
"ID",
"Name",
"Usage Count"
};
+
public UsageCountView() {
+ List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
+ collectors.add(new SummaryCollector());
parser = new ReportGenerator(MylarMonitorPlugin.getDefault().getInteractionLogger(), collectors);
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
@Override
public void createPartControl(Composite parent) {
createTable(parent);
createTableViewer(table);
makeActions();
hookContextMenu();
contributeToActionBars();
}
// public void createPartControl(Composite parent) {
// viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL |
// SWT.V_SCROLL);
// viewer.setContentProvider(new ViewContentProvider());
// viewer.setLabelProvider(new ViewLabelProvider());
// viewer.setSorter(new NameSorter());
// viewer.setInput(getViewSite());
// makeActions();
// hookContextMenu();
// hookDoubleClickAction();
// contributeToActionBars();
// }
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
UsageCountView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
// manager.add(exportToFileAction);
manager.add(refreshAction);
manager.add(importFromFileAction);
manager.add(importFromZipAction);
}
private void fillContextMenu(IMenuManager manager) {
// manager.add(exportToFileAction);
manager.add(refreshAction);
manager.add(importFromFileAction);
manager.add(importFromZipAction);
// Other plug-ins can contribute their actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
// manager.add(exportToFileAction);
manager.add(refreshAction);
manager.add(importFromFileAction);
manager.add(importFromZipAction);
}
private void makeActions() {
exportToFileAction = new Action() {
@Override
public void run() {
// TODO implement export to file
}
};
exportToFileAction.setText("Export to external file");
exportToFileAction.setToolTipText("Save Usage Summary to File");
importFromFileAction = new Action() {
@Override
public void run() {
FileDialog dialog = new FileDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell());
dialog.setText("Specify a file to import");
dialog.setFilterExtensions(new String[] { "*.xml", "*.*" });
dialog.setFilterPath(source.getPath());
String sourceString = dialog.open();
if (sourceString != null) {
source = new File(sourceString);
viewer.refresh();
}
}
};
importFromFileAction.setText("Import from log file");
importFromFileAction.setToolTipText("Import from log file");
importFromFileAction.setImageDescriptor(PlatformUI.getWorkbench()
.getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJ_FOLDER));
importFromZipAction = new Action() {
private byte[] buffer = new byte[8192];
public void transferData(InputStream sourceStream, OutputStream destination) throws IOException {
int bytesRead = 0;
while(bytesRead != -1){
bytesRead = sourceStream.read(buffer, 0, buffer.length);
if(bytesRead != -1){
destination.write(buffer, 0, bytesRead);
}
}
}
@Override
public void run() {
FileDialog dialog = new FileDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell());
dialog.setText("Specify a zip file to import");
dialog.setFilterExtensions(new String[] { "*.zip"});
dialog.setFilterPath(source.getPath());
String sourceString = dialog.open();
if (sourceString != null) {
try{
ZipFile zip = new ZipFile(sourceString);
if(zip.entries().hasMoreElements()){
ZipEntry entry = zip.entries().nextElement();
File f = File.createTempFile("mylarTemp", "xml");
InputStream in = zip.getInputStream(entry);
OutputStream out = new FileOutputStream(f);
transferData(in, out);
source = f;
}
}catch(Exception e){
ContextCorePlugin.log(e, "zip writing failed");
}
viewer.refresh();
}
}
};
importFromZipAction.setText("Import from zip file");
importFromZipAction.setToolTipText("Import from zip file");
importFromZipAction.setImageDescriptor(MonitorImages.ZIP_FILE);
refreshAction = new Action() {
@Override
public void run() {
parser.getStatisticsFromInteractionHistory(MylarMonitorPlugin.getDefault().getMonitorLogFile());
viewer.refresh();
}
};
refreshAction.setText("Refresh report");
refreshAction.setToolTipText("Refresh report");
refreshAction.setImageDescriptor(MonitorImages.REFRESH);
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
/**
* Create table to be used by TableViewer
*
* @param parent
*/
private void createTable(Composite parent) {
int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL |
SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
// final int NUMBER_COLUMNS = 4;
table = new Table(parent, style);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.grabExcessHorizontalSpace = true;
// gridData.horizontalSpan = 4;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
// Set up the columns and add listeners to sort by column when column is
// selected.
TableColumn column = new TableColumn(table, SWT.LEFT, 0);
column.setText("Type");
column.setWidth(100);
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewer.setSorter(new InteractionEventSummarySorter(
InteractionEventSummarySorter.TYPE));
}
});
column = new TableColumn(table, SWT.LEFT, 1);
column.setText("ID");
column.setWidth(30);
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewer
.setSorter(new InteractionEventSummarySorter(
InteractionEventSummarySorter.ID));
}
});
column = new TableColumn(table, SWT.LEFT, 2);
column.setText("Name");
column.setWidth(150);
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewer.setSorter(new InteractionEventSummarySorter(
InteractionEventSummarySorter.NAME));
}
});
column = new TableColumn(table, SWT.LEFT, 3);
column.setText("Count");
column.setWidth(50);
column.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewer.setSorter(new InteractionEventSummarySorter(
InteractionEventSummarySorter.USAGE_COUNT));
}
});
}
private void createTableViewer(Composite parent) {
viewer = new TableViewer(table);
viewer.setUseHashlookup(true);
viewer.setColumnProperties(columnNames);
+
+ List<File> usageFiles = new ArrayList<File>();
+ usageFiles.add(MylarMonitorPlugin.getDefault().getMonitorLogFile());
viewer.setContentProvider(new UsageCountContentProvider(parser));
+ viewer.setLabelProvider(new UsageCountLabelProvider());
viewer.setInput(getViewSite());
}
}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/UsageSession.java b/org.eclipse.mylyn/developer/src-old/monitor/UsageSession.java
new file mode 100644
index 0000000..1fcbb53
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/UsageSession.java
@@ -0,0 +1,337 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 13, 2004
+ */
+package org.eclipse.mylyn.monitor.internal;
+
+import java.util.*;
+
+import org.eclipse.mylyn.core.util.DateUtil;
+
+
+
+/**
+ * @author Mik Kersten
+ */
+public class UsageSession {
+
+ public static final String START_DATE = "startDate";
+ public static final String START_TIME = "startTime";
+ public static final String NUM_SECONDS_ELAPSED = "numSecondsElapsed";
+ public static final String NUM_KEYSTROKES_JAVA_EDITOR = "numKeystrokesJavaEditor";
+ public static final String NUM_SELECTIONS_PKG_EXPLORER = "numSelectionsPkgExplorer";
+ public static final String NUM_SELECTIONS_PKG_EXPLORER_MYLAR = "numSelectionsPkgExplorerMylar";
+ public static final String NUM_SELECTIONS_PROBLEMS = "numSelectionsProblems";
+ public static final String NUM_SELECTIONS_PROBLEMS_MYLAR = "numSelectionsProblemsMylar";
+ public static final String NUM_SELECTIONS_JAVA_OUTLINE = "numSelectionsJavaOutline";
+ public static final String NUM_SELECTIONS_JAVA_OUTLINE_MYLAR = "numSelectionsJavaOutlineMylar";
+ public static final String NUM_SELECTIONS_JAVA_EDITOR = "numSelectionsJavaEditor";
+ public static final String NUM_SELECTIONS_JAVA_EDITOR_AUTOFOLD = "numSelectionsJavaEditorAutoFold";
+ public static final String NUM_SELECTIONS_SEARCH = "numSelectionsSearch";
+ public static final String NUM_SELECTIONS_SEARCH_MYLAR = "numSelectionsSearchMylar";
+ public static final String NUM_SELECTIONS_PATHFINDER = "numSelectionsPathfinder";
+ public static final String NUM_SELECTIONS_OTHER = "numSelectionsOther";
+
+ private List<UsageStatistic> statistics;
+ private static final String DELIM = ", ";
+
+
+ public UsageSession() {
+
+ statistics = new ArrayList<UsageStatistic>();
+
+ statistics.add(new TemporalStatistic(START_DATE, DateUtil.getFormattedDate(), null));
+ statistics.add(new TemporalStatistic(START_TIME, DateUtil.getFormattedTime(), null));
+
+ statistics.add(new CardinalStatistic(NUM_KEYSTROKES_JAVA_EDITOR));
+ statistics.add(new CardinalStatistic(NUM_SECONDS_ELAPSED));
+// statistics.add(new CardinalStatistic(NUM_SELECTIONS_PATHFINDER));
+ statistics.add(new CardinalStatistic(NUM_SELECTIONS_JAVA_EDITOR));
+// statistics.add(new CardinalStatistic(NUM_SELECTIONS_JAVA_EDITOR_AUTOFOLD));
+ statistics.add(new CardinalStatistic(NUM_SELECTIONS_JAVA_OUTLINE));
+// statistics.add(new CardinalStatistic(NUM_SELECTIONS_JAVA_OUTLINE_MYLAR));
+ statistics.add(new CardinalStatistic(NUM_SELECTIONS_OTHER));
+ statistics.add(new CardinalStatistic(NUM_SELECTIONS_PKG_EXPLORER));
+// statistics.add(new CardinalStatistic(NUM_SELECTIONS_PKG_EXPLORER_MYLAR));
+ statistics.add(new CardinalStatistic(NUM_SELECTIONS_PROBLEMS));
+// statistics.add(new CardinalStatistic(NUM_SELECTIONS_PROBLEMS_MYLAR));
+ statistics.add(new CardinalStatistic(NUM_SELECTIONS_SEARCH));
+// statistics.add(new CardinalStatistic(NUM_SELECTIONS_SEARCH_MYLAR));
+ }
+
+ /**
+ * Read in alphabetical order.
+ *
+ * @param csv string that this session should be created from
+ */
+ public UsageSession(String fromCsvString) {
+ this();
+
+ StringTokenizer tokenizer = new StringTokenizer(fromCsvString, DELIM);
+ getTemporalStatistic(START_DATE).setTime(tokenizer.nextToken());
+ getTemporalStatistic(START_TIME).setTime(tokenizer.nextToken());
+ getCardinalStatistic(NUM_KEYSTROKES_JAVA_EDITOR).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SECONDS_ELAPSED).setCount(new Long(tokenizer.nextToken()).longValue());
+// getCardinalStatistic(NUM_SELECTIONS_PATHFINDER).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SELECTIONS_JAVA_EDITOR).setCount(new Long(tokenizer.nextToken()).longValue());
+// getCardinalStatistic(NUM_SELECTIONS_JAVA_EDITOR_AUTOFOLD).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SELECTIONS_JAVA_OUTLINE).setCount(new Long(tokenizer.nextToken()).longValue());
+// getCardinalStatistic(NUM_SELECTIONS_JAVA_OUTLINE_MYLAR).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SELECTIONS_OTHER).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SELECTIONS_PKG_EXPLORER).setCount(new Long(tokenizer.nextToken()).longValue());
+// getCardinalStatistic(NUM_SELECTIONS_PKG_EXPLORER_MYLAR).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SELECTIONS_PROBLEMS).setCount(new Long(tokenizer.nextToken()).longValue());
+// getCardinalStatistic(NUM_SELECTIONS_PROBLEMS_MYLAR).setCount(new Long(tokenizer.nextToken()).longValue());
+ getCardinalStatistic(NUM_SELECTIONS_SEARCH).setCount(new Long(tokenizer.nextToken()).longValue());
+// getCardinalStatistic(NUM_SELECTIONS_SEARCH_MYLAR).setCount(new Long(tokenizer.nextToken()).longValue());
+ }
+
+ /**
+ * @return a short one line summary string
+ */
+ public String getSummary() {
+ long selections =
+// getCardinalStatistic(NUM_SELECTIONS_PATHFINDER).getCount() +
+ getCardinalStatistic(NUM_SELECTIONS_JAVA_EDITOR).getCount() +
+// getCardinalStatistic(NUM_SELECTIONS_JAVA_EDITOR_AUTOFOLD).getCount() +
+ getCardinalStatistic(NUM_SELECTIONS_JAVA_OUTLINE).getCount() +
+// getCardinalStatistic(NUM_SELECTIONS_JAVA_OUTLINE_MYLAR).getCount() +
+ getCardinalStatistic(NUM_SELECTIONS_OTHER).getCount() +
+ getCardinalStatistic(NUM_SELECTIONS_PKG_EXPLORER).getCount() +
+// getCardinalStatistic(NUM_SELECTIONS_PKG_EXPLORER_MYLAR).getCount() +
+ getCardinalStatistic(NUM_SELECTIONS_PROBLEMS).getCount() +
+// getCardinalStatistic(NUM_SELECTIONS_PROBLEMS_MYLAR).getCount() +
+ getCardinalStatistic(NUM_SELECTIONS_SEARCH).getCount();
+// getCardinalStatistic(NUM_SELECTIONS_SEARCH_MYLAR).getCount();
+ if (selections == 0) {
+ return "<no data>";
+ } else {
+ long keystrokes = getCardinalStatistic(NUM_KEYSTROKES_JAVA_EDITOR).getCount();
+ return "edit ratio: " + (float)keystrokes/selections/10;
+ }
+ }
+
+ /**
+ * @return null if not found
+ */
+ public UsageStatistic getStatistic(String statisticHandle) {
+ if (statisticHandle == null) return null;
+ for (UsageStatistic statistic : statistics) {
+ if (statistic.getHandle().equals(statisticHandle)) {
+ return statistic;
+ }
+ }
+ return null;
+ }
+
+ public TemporalStatistic getTemporalStatistic(String statisticHandle) {
+ return (TemporalStatistic)getStatistic(statisticHandle);
+ }
+
+ public CardinalStatistic getCardinalStatistic(String statisticHandle) {
+ return (CardinalStatistic)getStatistic(statisticHandle);
+ }
+
+
+ public List<UsageStatistic> getStatistics() {
+ return statistics;
+ }
+
+ /**
+ * @param session
+ */
+ public void appendData(UsageSession session) {
+ for (UsageStatistic statistic : session.getStatistics()) {
+ if (statistic instanceof CardinalStatistic) {
+ CardinalStatistic cardinal = (CardinalStatistic)statistic;
+ getCardinalStatistic(cardinal.getHandle()).increment(cardinal.getCount());
+ }
+ }
+ }
+
+ public String getCsvHeader() {
+ StringBuffer buffer = new StringBuffer();
+ for (UsageStatistic statistic : statistics) {
+ buffer.append(statistic.getHandle());
+ buffer.append(DELIM);
+ }
+ return buffer.toString();
+ }
+
+ public static String formatTimeFromSeconds(long seconds) {
+ long hours = seconds/3600;
+ long minutes = seconds/60;
+ long secondsRemainder = seconds - hours*3600 - minutes*60;
+ return hours + " hours, " + minutes + " minutes, " + secondsRemainder + " seconds";
+ }
+
+ /**
+ * @return single line String in comma-separated value format
+ */
+ public String toCsvString() {
+ StringBuffer buffer = new StringBuffer();
+ for (UsageStatistic statistic : statistics) {
+ buffer.append(statistic.toValueString());
+ buffer.append(DELIM);
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * @return
+ */
+ public List toFormattedList() {
+ List<String> list = new ArrayList<String>();
+ for (UsageStatistic statistic : statistics) {
+ list.add(statistic.toFormattedString());
+ }
+ return list;
+// list.add("startDate: " + startDate);
+// list.add("startTime: " + startTime);
+// list.add("timeSession: " + UsageSession.formatTimeFromSeconds(timeSession));
+// list.add("numJavaEditorKeystrokes: " + numJavaEditorKeystrokes);
+// list.add("numSelectionsOther: " + numSelectionsOther);
+// list.add("numSelectionsPkgExplorer: " + numSelectionsPkgExplorer);
+// list.add("numSelectionsMylarPkgExplorer: " + numSelectionsMylarPkgExplorer);
+// list.add("numSelectionsProblems: " + numSelectionsProblems);
+// list.add("numSelectionsMylarProblems: " + numSelectionsMylarProblems);
+// list.add("numSelectionsJavaOutline: " + numSelectionsJavaOutline);
+// list.add("numSelectionsMylarJavaOutline: " + numSelectionsMylarJavaOutline);
+// list.add("numSelectionsEditor: " + numSelectionsEditor);
+// list.add("numSelectionsPathfinder: " + numSelectionsPathfinder);
+// list.add("numSelectionsSearch: " + numSelectionsSearch);
+ }
+
+ public String toLongString() {
+ return
+ "------------------\n" +
+ getCsvHeader() + "\n" +
+ toCsvString() + "\n" +
+ "------------------\n";
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (!(object instanceof UsageSession)) return false;
+ UsageSession session = (UsageSession)object;
+ return session.getStatistics().equals(statistics);
+
+// return
+// timeSession == session.getTimeSession() &&
+// numJavaEditorKeystrokes == session.getNumJavaEditorKeystrokes() &&
+// numSelectionsOther == session.getNumSelectionsOther() &&
+// numSelectionsPkgExplorer == session.getNumSelectionsPkgExplorer() &&
+// numSelectionsMylarPkgExplorer == session.getNumSelectionsMylarPkgExplorer() &&
+// numSelectionsProblems == session.getNumSelectionsProblems() &&
+// numSelectionsMylarProblems == session.getNumSelectionsMylarProblems() &&
+// numSelectionsJavaOutline == session.getNumSelectionsJavaOutline() &&
+// numSelectionsMylarJavaOutline == session.getNumSelectionsMylarJavaOutline() &&
+// numSelectionsEditor == session.getNumSelectionsEditor() &&
+// numSelectionsPathfinder == session.getNumSelectionsPathfinder() &&
+// numSelectionsSearch == session.getNumSelectionsSearch();
+ }
+
+ @Override
+ public String toString() {
+ return toCsvString();
+ }
+
+// public String getStartDate() {
+// return startDate;
+// }
+// public void setStartDate(String date) {
+// this.startDate = date;
+// }
+//
+// /**
+// * @return time in seconds
+// */
+// public long getTimeSession() {
+// return timeSession;
+// }
+//
+// public void setTimeSession(long duration) {
+// this.timeSession = duration;
+// }
+// public int getNumSelectionsEditor() {
+// return numSelectionsEditor;
+// }
+// public void incrementSelectionsEditor() {
+// this.numSelectionsEditor++;
+// }
+// public int getNumSelectionsJavaOutline() {
+// return numSelectionsJavaOutline;
+// }
+// public void incrementSelectionsJavaOutline() {
+// this.numSelectionsJavaOutline++;
+// }
+// public int getNumSelectionsMylarJavaOutline() {
+// return numSelectionsMylarJavaOutline;
+// }
+// public void incrementSelectionsMylarJavaOutline() {
+// this.numSelectionsMylarJavaOutline++;
+// }
+// public int getNumSelectionsMylarPkgExplorer() {
+// return numSelectionsMylarPkgExplorer;
+// }
+// public void setNumSelectionsMylarPkgExplorer() {
+// this.numSelectionsMylarPkgExplorer++;
+// }
+// public int getNumSelectionsMylarProblems() {
+// return numSelectionsMylarProblems;
+// }
+// public void incrementSelectionsMylarProblems() {
+// this.numSelectionsMylarProblems++;
+// }
+// public int getNumSelectionsOther() {
+// return numSelectionsOther;
+// }
+// public void incrementSelectionsOther() {
+// this.numSelectionsOther++;
+// }
+// public int getNumSelectionsPathfinder() {
+// return numSelectionsPathfinder;
+// }
+// public void incrementSelectionsPathfinder() {
+// this.numSelectionsPathfinder++;
+// }
+// public int getNumSelectionsPkgExplorer() {
+// return numSelectionsPkgExplorer;
+// }
+// public void incrementSelectionsPkgExplorer() {
+// this.numSelectionsPkgExplorer++;
+// }
+// public int getNumSelectionsProblems() {
+// return numSelectionsProblems;
+// }
+// public void incrementSelectionsProblems() {
+// this.numSelectionsProblems++;
+// }
+// public int getNumSelectionsSearch() {
+// return numSelectionsSearch;
+// }
+// public void incrementSelectionsSearch() {
+// this.numSelectionsSearch++;
+// }
+// public String getStartTime() {
+// return startTime;
+// }
+// public void setStartTime(String startTime) {
+// this.startTime = startTime;
+// }
+// public int getNumJavaEditorKeystrokes() {
+// return numJavaEditorKeystrokes;
+// }
+// public void incrementNumJavaEditorKeystrokes() {
+// this.numJavaEditorKeystrokes++;
+// }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/monitor/UsageStatistic.java b/org.eclipse.mylyn/developer/src-old/monitor/UsageStatistic.java
new file mode 100644
index 0000000..db20ad8
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/monitor/UsageStatistic.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 20, 2004
+ */
+package org.eclipse.mylyn.monitor.internal;
+
+
+/**
+ * @author Mik Kersten
+ */
+public abstract class UsageStatistic {
+
+ private String handle;
+
+ public abstract String toFormattedString();
+
+ /**
+ * String value of this statistic, used for serialization.
+ */
+ public abstract String toValueString();
+
+ public UsageStatistic(String handle) {
+ this.handle = handle;
+ }
+
+ public String getHandle() {
+ return handle;
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof UsageStatistic) {
+ UsageStatistic statistic = (UsageStatistic)object;
+ return statistic.handle.equals(handle);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return handle + ": " + toValueString();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tasks/AbstractTaskListFactory.java b/org.eclipse.mylyn/developer/src-old/tasks/AbstractTaskListFactory.java
new file mode 100644
index 0000000..b797536
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tasks/AbstractTaskListFactory.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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.deprecated;
+
+import java.util.Collections;
+import java.util.Set;
+
+import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
+import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
+import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.ITask;
+import org.w3c.dom.Element;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public abstract class AbstractTaskListFactory {
+
+ public static final String KEY_QUERY = "Query";
+
+ public static final String KEY_QUERY_STRING = "QueryString";
+
+ public static final String KEY_TASK = "Task";
+
+ /**
+ * Returns true if factory can create an XML element to store given {@link AbstractTask}.
+ * <p>
+ * The name of the XML element is taken from the {@link #getTaskElementName()} method and additional task attributes
+ * can be stored in {@link #setAdditionalAttributes(AbstractTask, Element)} method.
+ *
+ * @param task
+ * a task instance to create XML element for
+ *
+ * @return true if factory can create XML element to store given {@link AbstractTask}.
+ *
+ * @see #getTaskElementName()
+ * @see #setAdditionalAttributes(AbstractTask, Element)
+ * @since 3.0
+ */
+ public abstract boolean canCreate(ITask task);
+
+ /**
+ * Returns true if factory can create an XML element to store given {@link RepositoryQuery}.
+ * <p>
+ * The name of the XML element is taken from the {@link #getQueryElementName(RepositoryQuery)} method and additional
+ * query attributes can be stored in {@link #setAdditionalAttributes(RepositoryQuery, Element)}.
+ *
+ * @param query
+ * a query instance to create an XML element for
+ *
+ * @return true if factory can create XML element to store given {@link AbstractTask}.
+ *
+ * @see #getQueryElementName(RepositoryQuery)
+ * @see #setAdditionalAttributes(RepositoryQuery, Element)
+ * @since 3.0
+ */
+ public boolean canCreate(IRepositoryQuery query) {
+ return false;
+ }
+
+ /**
+ * Creates an {@link RepositoryQuery} instance from given XML element matching one of the names returned by
+ * {@link #getQueryElementNames()}.
+ * <p>
+ * Concrete implementation should populate required query configuration using method parameters and content of the
+ * passed XML element. Children tasks for this query instance will be created by the caller of this method.
+ *
+ * @param repositoryUrl
+ * an url for the corresponding task repository
+ * @param queryString
+ * a query string, e.g. connector-specific url used for query request
+ * @param label
+ * a query label or name
+ * @param element
+ * an XML element containing query data
+ * @return instance of the {@link RepositoryQuery}
+ *
+ * @see #getQueryElementNames()
+ * @since 3.0
+ */
+ public RepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element) {
+ return null;
+ }
+
+ /**
+ * Creates an {@link AbstractTask} instance from given XML element matching name returned by
+ * {@link #getTaskElementName()}.
+ * <p>
+ * Concrete implementation should populate required task data using method parameters and content of the passed XML
+ * element. Children tasks of this task instance will be created by the caller of this method.
+ *
+ * @param repositoryUrl
+ * an url for the corresponding task repository
+ * @param queryString
+ * a query string, e.g. connector-specific url used for query request
+ * @param label
+ * a query label or name
+ * @param element
+ * an XML element containing query data
+ * @return instance of the {@link RepositoryQuery}
+ *
+ * @see #getTaskElementName()
+ * @since 3.0
+ */
+ public abstract AbstractTask createTask(String repositoryUrl, String taskId, String label, Element element);
+
+ /**
+ * Returns name of the XML element used to store given query instance if {@link #canCreate(RepositoryQuery)} return
+ * true for given query instance.
+ *
+ * @param query
+ * a query instance to get the name for
+ *
+ * @return name for the XML element to store given query instance or null if factory doesn't support given
+ * {@link RepositoryQuery} instance.
+ *
+ * @see #canCreate(RepositoryQuery)
+ * @since 3.0
+ */
+ public String getQueryElementName(IRepositoryQuery query) {
+ return "";
+ }
+
+ /**
+ * Returns names for all query elements.
+ * <p>
+ * This collection is used to determine if this factory can create {@link RepositoryQuery} instance from the XML
+ * element using {@link #createQuery(String, String, String, Element)} method.
+ *
+ * @return a <code>Set</code> of query element names
+ *
+ * @see #createQuery(String, String, String, Element)
+ */
+ public Set<String> getQueryElementNames() {
+ return Collections.emptySet();
+ }
+
+ /**
+ * Returns name for the XML element used to store subclass of the {@link AbstractTask} used by this factory. This
+ * value is used to create an XML element when storing given {@link AbstractTask} as well as to determine if this
+ * factory can read XML element with content of the task.
+ *
+ * @return name of the task element
+ *
+ * @see #canCreate(AbstractTask)
+ */
+ public abstract String getTaskElementName();
+
+ /**
+ * Adds additional attributes to an XML element used to store given {@link RepositoryQuery}.
+ *
+ * @param query
+ * a query instance being stored
+ * @param node
+ * an XML element used to store given query instance
+ * @since 3.0
+ */
+ public void setAdditionalAttributes(IRepositoryQuery query, Element node) {
+ // ignore
+ }
+
+ /**
+ * Adds additional attributes to an XML element used to store given {@link AbstractTask}
+ *
+ * @param task
+ * a task instance being stored
+ * @param node
+ * an XML element used to store given task instance
+ * @since 3.0
+ */
+ public void setAdditionalAttributes(ITask task, Element element) {
+ // ignore
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tasks/ITaskDataStorage.java b/org.eclipse.mylyn/developer/src-old/tasks/ITaskDataStorage.java
new file mode 100644
index 0000000..f8ebc8d
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tasks/ITaskDataStorage.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+/**
+ * @author Rob Elves
+ */
+public interface ITaskDataStorage {
+
+ /**
+ * Perform any initialization necessary storage
+ *
+ * @throws Exception
+ */
+ public void start() throws Exception;
+
+ public void stop() throws Exception;
+
+ public void put(TaskDataState taskDataState);
+
+ public TaskDataState get(String repositoryUrl, String id);
+
+ /**
+ * if last id remove folder (i.e. in case of refactoring urls)
+ */
+ public void remove(String repositoryUrl, String id);
+
+ /**
+ * persist any unsaved data
+ */
+ public void flush();
+
+ /**
+ * DESTROY ALL OFFLINE DATA
+ */
+ public void clear();
+
+ // Methods for NEW unsubmitted task data, currently not used
+
+// public void putNew(TaskDataState newTaskDataState);
+//
+// public Set<TaskDataState> getNew(String repositoryUrl);
+//
+// public removeNew(id);
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tasks/OfflineCachingStorage.java b/org.eclipse.mylyn/developer/src-old/tasks/OfflineCachingStorage.java
new file mode 100644
index 0000000..df861dd
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tasks/OfflineCachingStorage.java
@@ -0,0 +1,324 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.util.Map;
+import java.util.Queue;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.ITaskDataStorage;
+import org.eclipse.mylyn.internal.tasks.core.TaskDataState;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class OfflineCachingStorage implements ITaskDataStorage {
+
+ private static final int DEFAULT_FLUSH_INTERVAL = 60 * 1000;
+
+ private static final int MAX_READ_QUEUE_SIZE = 80;
+
+ private final Map<String, Map<String, TaskDataState>> readCache = new ConcurrentHashMap<String, Map<String, TaskDataState>>();
+
+ private final Map<String, Map<String, TaskDataState>> writeCache = new ConcurrentHashMap<String, Map<String, TaskDataState>>();
+
+ private final Queue<TaskDataState> lruQueue = new ConcurrentLinkedQueue<TaskDataState>();
+
+ private final ITaskDataStorage storage;
+
+ private CacheFlushJob cacheFlushJob;
+
+ private Timer cacheFlushTimer;
+
+ public OfflineCachingStorage(ITaskDataStorage storage) {
+ this.storage = storage;
+ }
+
+ /**
+ * FOR TESTING PURPOSES DESTROYS ALL DATA IN STORAGE
+ */
+ public void clear() {
+ if (cacheFlushJob != null) {
+ cacheFlushJob.waitSaveCompleted();
+ }
+ readCache.clear();
+ writeCache.clear();
+ lruQueue.clear();
+ storage.clear();
+ }
+
+ public void flush() {
+ cacheFlushJob.waitSaveCompleted();
+ persistToStorage();
+ }
+
+ public TaskDataState get(String repositoryUrl, String id) {
+ TaskDataState result = null;
+ result = retrieveFromCache(writeCache, repositoryUrl, id);
+ if (result == null) {
+ result = retrieveFromCache(readCache, repositoryUrl, id);
+ }
+ if (result == null) {
+ result = retrieveFromStorage(repositoryUrl, id);
+ }
+ if (result != null) {
+ pushRead(result);
+ }
+ return result;
+ }
+
+ private TaskDataState retrieveFromCache(Map<String, Map<String, TaskDataState>> cache, String repositoryUrl,
+ String id) {
+ Map<String, TaskDataState> idMap = cache.get(repositoryUrl);
+ if (idMap != null) {
+ return idMap.get(id);
+ }
+ return null;
+ }
+
+ private TaskDataState retrieveFromStorage(String repositoryUrl, String id) {
+ TaskDataState result = null;
+ synchronized (readCache) {
+ Map<String, TaskDataState> idMap = readCache.get(repositoryUrl);
+ if (idMap == null) {
+ idMap = new ConcurrentHashMap<String, TaskDataState>();
+ readCache.put(repositoryUrl, idMap);
+ } else {
+ result = idMap.get(id);
+ }
+
+ if (result == null) {
+ result = storage.get(repositoryUrl, id);
+ if (result != null) {
+ idMap.put(id, result);
+ }
+ }
+ }
+ return result;
+ }
+
+ public void put(TaskDataState taskDataState) {
+ putReadCache(taskDataState);
+ putWriteCache(taskDataState);
+ if (cacheFlushJob != null) {
+ cacheFlushJob.requestSave();
+ }
+ }
+
+ public void remove(String repositoryUrl, String id) {
+ Map<String, TaskDataState> idMap = writeCache.get(repositoryUrl);
+ if (idMap != null) {
+ idMap.remove(id);
+ }
+ idMap = readCache.get(repositoryUrl);
+ if (idMap != null) {
+ idMap.remove(id);
+ }
+
+ lruQueue.remove(new TaskDataState(repositoryUrl, id));
+
+ storage.remove(repositoryUrl, id);
+ }
+
+ public void start() throws Exception {
+ storage.start();
+ if (cacheFlushTimer == null && cacheFlushJob == null) {
+ cacheFlushTimer = new Timer();
+ cacheFlushTimer.schedule(new RequestSaveTimerTask(), DEFAULT_FLUSH_INTERVAL, DEFAULT_FLUSH_INTERVAL);
+ cacheFlushJob = new CacheFlushJob();
+ cacheFlushJob.schedule();
+ }
+ }
+
+ public void stop() throws Exception {
+ cacheFlushTimer.cancel();
+ cacheFlushJob.cancel();
+ this.flush();
+ cacheFlushTimer = null;
+ cacheFlushJob = null;
+ storage.stop();
+ }
+
+ private void pushRead(TaskDataState state) {
+
+ lruQueue.remove(state);
+ lruQueue.add(state);
+ if (lruQueue.size() > MAX_READ_QUEUE_SIZE) {
+ flushReadCache(false);
+ }
+ }
+
+ private void putReadCache(TaskDataState taskDataState) {
+ if (taskDataState == null) {
+ return;
+ }
+ synchronized (readCache) {
+
+ Map<String, TaskDataState> idMap = readCache.get(taskDataState.getUrl());
+ if (idMap == null) {
+ idMap = new ConcurrentHashMap<String, TaskDataState>();
+ readCache.put(taskDataState.getUrl(), idMap);
+ }
+
+ idMap.put(taskDataState.getId(), taskDataState);
+ }
+ pushRead(taskDataState);
+ }
+
+ private synchronized void putWriteCache(TaskDataState taskDataState) {
+ if (taskDataState == null) {
+ return;
+ }
+
+ Map<String, TaskDataState> idMap = writeCache.get(taskDataState.getUrl());
+ if (idMap == null) {
+ idMap = new ConcurrentHashMap<String, TaskDataState>();
+ writeCache.put(taskDataState.getUrl(), idMap);
+ }
+ idMap.put(taskDataState.getId(), taskDataState);
+ }
+
+ private void persistToStorage() {
+ synchronized (writeCache) {
+ for (Map<String, TaskDataState> idMap : writeCache.values()) {
+ for (TaskDataState state : idMap.values()) {
+ storage.put(state);
+ }
+ idMap.clear();
+ }
+ }
+ }
+
+ private class CacheFlushJob extends Job {
+
+ private volatile boolean saveRequested = false;
+
+ private volatile boolean saveCompleted = true;
+
+ CacheFlushJob() {
+ super("Flush Cache Job");
+ setPriority(Job.LONG);
+ setSystem(true);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ while (true) {
+ if (saveRequested) {
+ saveRequested = false;
+ saveCompleted = false;
+ try {
+ persistToStorage();
+ } catch (Throwable t) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Error saving offline cache", t));
+ }
+ }
+
+ if (!saveRequested) {
+ synchronized (this) {
+ saveCompleted = true;
+ notifyAll();
+ try {
+ wait();
+ } catch (InterruptedException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ void requestSave() {
+ saveRequested = true;
+ }
+
+ void runRequested() {
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ void waitSaveCompleted() {
+ while (!saveCompleted) {
+ synchronized (this) {
+ try {
+ wait();
+ } catch (InterruptedException ex) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
+ private class RequestSaveTimerTask extends TimerTask {
+
+ @Override
+ public void run() {
+ if (!Platform.isRunning()) {
+ return;
+ } else {
+ flushReadCache(false);
+ cacheFlushJob.runRequested();
+ }
+ }
+ }
+
+ /**
+ * @param reset
+ * if true all read cached data is dropped if false only remove until cache lower than
+ * MAX_READ_QUEUE_SIZE
+ */
+ public void flushReadCache(boolean reset) {
+ if (reset) {
+ lruQueue.clear();
+ readCache.clear();
+ } else {
+ while (lruQueue.size() > MAX_READ_QUEUE_SIZE / 2) {
+ TaskDataState state = lruQueue.poll();
+ if (state != null) {
+ Map<String, TaskDataState> tasksMap = readCache.get(state.getUrl());
+ if (tasksMap != null) {
+ tasksMap.remove(state.getId());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * For testing...
+ */
+ public Queue<TaskDataState> getReadQueue() {
+ return lruQueue;
+ }
+
+ public Map<String, Map<String, TaskDataState>> getReadCache() {
+ return readCache;
+ }
+
+ public Map<String, Map<String, TaskDataState>> getWriteCache() {
+ return writeCache;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tasks/OfflineDataStore.java b/org.eclipse.mylyn/developer/src-old/tasks/OfflineDataStore.java
new file mode 100644
index 0000000..a3bd096
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tasks/OfflineDataStore.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+class OfflineDataStore implements Serializable {
+
+ private static final long serialVersionUID = -3909632088254980426L;
+
+ /** Last new repository task taskId */
+ private int lastNewRepositoryTaskId = 0;
+
+ // Local changes to existing reports
+ private final Map<String, Set<RepositoryTaskAttribute>> localEdits = new ConcurrentHashMap<String, Set<RepositoryTaskAttribute>>();
+
+ /** Older version of Task Data */
+ private final Map<String, RepositoryTaskData> oldTaskDataMap = new ConcurrentHashMap<String, RepositoryTaskData>();
+
+ /** Newest version of the task data */
+ private final Map<String, RepositoryTaskData> newTaskDataMap = new ConcurrentHashMap<String, RepositoryTaskData>();
+
+ /** New unsubmitted repository task data */
+ private final Map<String, RepositoryTaskData> unsubmittedTaskData = new ConcurrentHashMap<String, RepositoryTaskData>();
+
+ public void setLastNewTaskId(int lastNumber) {
+ lastNewRepositoryTaskId = new Integer(lastNumber);
+ }
+
+ public int getNextTaskId() {
+ lastNewRepositoryTaskId++;
+ return lastNewRepositoryTaskId;
+ }
+
+ public Map<String, RepositoryTaskData> getOldDataMap() {
+ return oldTaskDataMap;
+ }
+
+ public Map<String, RepositoryTaskData> getNewDataMap() {
+ return newTaskDataMap;
+ }
+
+ public Map<String, RepositoryTaskData> getUnsubmittedTaskData() {
+ return unsubmittedTaskData;
+ }
+
+ public Map<String, Set<RepositoryTaskAttribute>> getLocalEdits() {
+ return localEdits;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/tasks/OfflineFileStorage.java b/org.eclipse.mylyn/developer/src-old/tasks/OfflineFileStorage.java
new file mode 100644
index 0000000..e027513
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tasks/OfflineFileStorage.java
@@ -0,0 +1,726 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.URLEncoder;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.ITaskDataStorage;
+import org.eclipse.mylyn.internal.tasks.core.TaskDataState;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryAttachment;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.XMLMemento;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at SuppressWarnings( { "restriction", "deprecation" })
+ at Deprecated
+public class OfflineFileStorage implements ITaskDataStorage {
+
+ private static final String ATTRIBUTE_TASK_KIND = "taskKind";
+
+ private static final String ATTRIBUTE_IS_PATCH = "isPatch";
+
+ private static final String ATTRIBUTE_IS_OBSOLETE = "isObsolete";
+
+ private static final String ATTRIBUTE_CREATOR = "creator";
+
+ private static final String ATTRIBUTE_NUMBER = "number";
+
+ private static final String ATTRIBUTE_HAS_ATTACHMENT = "hasAttachment";
+
+ private static final String ATTRIBUTE_ATTACHMENT_ID = "attachmentId";
+
+ private static final String ATTRIBUTE_KNOB_NAME = "knob_name";
+
+ private static final String ATTRIBUTE_OPERATION_NAME = "operationName";
+
+ private static final String ATTRIBUTE_OPTION_NAME = "optionName";
+
+ private static final String ATTRIBUTE_OPTION_SELECTION = "optionSelection";
+
+ private static final String ATTRIBUTE_IS_CHECKED = "isChecked";
+
+ private static final String ATTRIBUTE_INPUT_NAME = "inputName";
+
+ private static final String ATTRIBUTE_INPUT_VALUE = "inputValue";
+
+ private static final String ATTRIBUTE_READONLY = "readonly";
+
+ private static final String ATTRIBUTE_HIDDEN = "hidden";
+
+ private static final String ATTRIBUTE_PARAMETER = "parameter";
+
+ private static final String ATTRIBUTE_VALUE = "value";
+
+ private static final String ELEMENT_META_DATA = "MetaData";
+
+ private static final String ELEMENT_META = "meta";
+
+ private static final String ELEMENT_OPTION = "option";
+
+ private static final String ELEMENT_OPTIONS = "options";
+
+ private static final String ELEMENT_VALUES = "values";
+
+ private static final String ELEMENT_VALUE = "value";
+
+ private static final String ELEMENT_ATTRIBUTE = "Attribute";
+
+ private static final String ELEMENT_NAME = "name";
+
+ private static final String ELEMENT_OPTION_NAMES = "optionNames";
+
+ private static final String ELEMENT_OPERATION = "Operation";
+
+ private static final String ELEMENT_SELECTED = "Selected";
+
+ private static final String ELEMENT_COMMENT = "Comment";
+
+ private static final String ELEMENT_ATTACHMENT = "Attachment";
+
+ private static final String ELEMENT_ATTACHMENTS = "Attachments";
+
+ private static final String ELEMENT_COMMENTS = "Comments";
+
+ private static final String ELEMENT_OPERATIONS = "Operations";
+
+ private static final String ELEMENT_ATTRIBUTES = "Attributes";
+
+ private static final String ATTRIBUTE_REPOSITORY_KIND = "repositoryKind";
+
+ private static final String ATTRIBUTE_REPOSITORY_URL = "repositoryUrl";
+
+ private static final String ATTRIBUTE_KEY = "key";
+
+ private static final String ATTRIBUTE_ID = "id";
+
+ private static final String ATTRIBUTE_NAME = "name";
+
+ private static final String FILE_NAME_INTERNAL = "data.xml";
+
+ private static final String ELEMENT_EDITS_DATA = "EditsData";
+
+ private static final String ELEMENT_OLD_DATA = "OldData";
+
+ private static final String ELEMENT_NEW_DATA = "NewData";
+
+ private static final String ATTRIBUTE_VERSION = "version";
+
+ private static final String ELEMENT_TASK_STATE = "TaskState";
+
+ private static final String ENCODING_UTF_8 = "UTF-8";
+
+ private static final String SCHEMA_VERSION = "1.0";
+
+ private static final String EXTENSION = ".zip";
+
+ private final File dataDir;
+
+ // HACK: Remove attribute factories all together!!!
+ private static final AbstractAttributeFactory temporaryFactory = new AbstractAttributeFactory() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Date getDateForAttributeType(String attributeKey, String dateString) {
+ return null;
+ }
+
+ @Override
+ public boolean isHidden(String key) {
+ return false;
+ }
+
+ @Override
+ public String getName(String key) {
+ return key;
+ }
+
+ @Override
+ public boolean isReadOnly(String key) {
+ return false;
+ }
+
+ @Override
+ public String mapCommonAttributeKey(String key) {
+ return key;
+ }
+
+ };
+
+ public OfflineFileStorage(File rootFolder) {
+ dataDir = rootFolder;
+ }
+
+ public void start() throws Exception {
+ if (!dataDir.exists()) {
+ dataDir.mkdirs();
+ }
+ }
+
+ public void stop() throws Exception {
+ // ignore
+ }
+
+ public synchronized TaskDataState get(String repositoryUrl, String id) {
+ TaskDataState state = null;
+ FileInputStream fileInputStream = null;
+ FileLock lock = null;
+ try {
+ File dataFile = getDataFile(URLEncoder.encode(repositoryUrl, ENCODING_UTF_8), id);
+ if (dataFile != null && dataFile.exists()) {
+
+ fileInputStream = new FileInputStream(dataFile);
+ FileChannel channel = fileInputStream.getChannel();
+ lock = channel.tryLock(0L, Long.MAX_VALUE, true);
+ if (lock != null) {
+ state = new TaskDataState(repositoryUrl, id);
+ ZipInputStream inputStream = new ZipInputStream(fileInputStream);
+ ZipEntry entry = inputStream.getNextEntry();
+ if (entry != null) {
+ XMLMemento input = XMLMemento.createReadRoot(new InputStreamReader(inputStream, ENCODING_UTF_8));
+ if (input != null) {
+ readData(state, input);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error retrieving offline data", e));
+ } finally {
+ try {
+ if (lock != null && lock.isValid()) {
+ lock.release();
+ }
+ if (fileInputStream != null) {
+ fileInputStream.close();
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Error closing offline data input stream", e));
+ }
+ }
+
+ return state;
+ }
+
+ public synchronized void put(TaskDataState taskDataState) {
+ FileOutputStream fileOutputStream = null;
+ FileLock lock = null;
+ try {
+ String repositoryFolder = URLEncoder.encode(taskDataState.getNewTaskData().getRepositoryUrl(),
+ ENCODING_UTF_8);
+ File dataFile = getDataFile(repositoryFolder, taskDataState.getId());
+ if (dataFile != null) {
+ if (!dataFile.getParentFile().exists()) {
+ if (!dataFile.getParentFile().mkdirs()) {
+ throw new IOException("Could not create offline data folder: "
+ + dataFile.getParentFile().getAbsolutePath());
+ }
+ }
+ fileOutputStream = new FileOutputStream(dataFile);
+ FileChannel channel = fileOutputStream.getChannel();
+ lock = channel.tryLock();
+ if (lock != null) {
+ final ZipOutputStream outputStream = new ZipOutputStream(fileOutputStream);
+ outputStream.setMethod(ZipOutputStream.DEFLATED);
+ ZipEntry zipEntry = new ZipEntry(FILE_NAME_INTERNAL);
+ outputStream.putNextEntry(zipEntry);
+
+ OutputStreamWriter writer = new OutputStreamWriter(outputStream, ENCODING_UTF_8);
+ XMLMemento memento = XMLMemento.createWriteRoot(ELEMENT_TASK_STATE);
+ memento.putString(ATTRIBUTE_VERSION, SCHEMA_VERSION);
+ if (taskDataState.getNewTaskData() != null) {
+ IMemento child = memento.createChild(ELEMENT_NEW_DATA);
+ addTaskData(child, taskDataState.getNewTaskData());
+ }
+ if (taskDataState.getOldTaskData() != null) {
+ IMemento child = memento.createChild(ELEMENT_OLD_DATA);
+ addTaskData(child, taskDataState.getOldTaskData());
+ }
+ if (taskDataState.getEdits() != null && taskDataState.getEdits().size() > 0) {
+ IMemento child = memento.createChild(ELEMENT_EDITS_DATA);
+ addEdits(child, taskDataState.getEdits());
+ }
+ memento.save(writer);
+ }
+ }
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error saving offline data"));
+ } finally {
+ try {
+ if (lock != null && lock.isValid()) {
+ lock.release();
+ }
+ if (fileOutputStream != null) {
+ fileOutputStream.flush();
+ fileOutputStream.close();
+ }
+ } catch (IOException e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
+ "Error closing offline data output stream"));
+ }
+ }
+
+ }
+
+ private void readData(TaskDataState taskState, XMLMemento parent) {
+ IMemento newData = parent.getChild(ELEMENT_NEW_DATA);
+ if (newData != null) {
+ RepositoryTaskData newTaskData = readTaskData(newData);
+ if (newTaskData != null) {
+ taskState.setNewTaskData(newTaskData);
+ }
+ }
+
+ IMemento oldData = parent.getChild(ELEMENT_OLD_DATA);
+ if (oldData != null) {
+ RepositoryTaskData oldTaskData = readTaskData(oldData);
+ if (oldTaskData != null) {
+ taskState.setOldTaskData(oldTaskData);
+ }
+ }
+
+ IMemento editsData = parent.getChild(ELEMENT_EDITS_DATA);
+ if (editsData != null) {
+ Set<RepositoryTaskAttribute> edits = readEdits(editsData);
+ if (edits != null) {
+ taskState.setEdits(edits);
+ }
+ }
+
+ }
+
+ private RepositoryTaskData readTaskData(IMemento newData) {
+ String kind = newData.getString(ATTRIBUTE_REPOSITORY_KIND);
+ String id = newData.getString(ATTRIBUTE_ID);
+ String url = newData.getString(ATTRIBUTE_REPOSITORY_URL);
+ String taskKind = newData.getString(ATTRIBUTE_TASK_KIND);
+
+ if (kind == null || url == null || id == null) {
+ return null;
+ }
+
+ RepositoryTaskData data = new RepositoryTaskData(temporaryFactory, kind, url, id, taskKind);
+ IMemento attMemento = newData.getChild(ELEMENT_ATTRIBUTES);
+ if (attMemento != null) {
+ List<RepositoryTaskAttribute> attributes = readAttributes(attMemento);
+ for (RepositoryTaskAttribute repositoryTaskAttribute : attributes) {
+ data.addAttribute(repositoryTaskAttribute.getId(), repositoryTaskAttribute);
+ }
+ }
+
+ IMemento opsMemento = newData.getChild(ELEMENT_OPERATIONS);
+ if (opsMemento != null) {
+ List<RepositoryOperation> operations = readOperations(opsMemento);
+ for (RepositoryOperation operation : operations) {
+ data.addOperation(operation);
+ }
+ }
+
+ IMemento commentsMemento = newData.getChild(ELEMENT_COMMENTS);
+ if (commentsMemento != null) {
+ List<TaskComment> comments = readComments(commentsMemento);
+ for (TaskComment comment : comments) {
+ data.addComment(comment);
+ }
+ }
+
+ IMemento attachmentsMemento = newData.getChild(ELEMENT_ATTACHMENTS);
+ if (attachmentsMemento != null) {
+ List<RepositoryAttachment> attachments = readAttachments(attachmentsMemento);
+ for (RepositoryAttachment attachment : attachments) {
+ data.addAttachment(attachment);
+ }
+ }
+
+ return data;
+
+ }
+
+ private void addEdits(IMemento parent, Set<RepositoryTaskAttribute> edits) {
+ List<RepositoryTaskAttribute> changedAttributes = new ArrayList<RepositoryTaskAttribute>();
+ changedAttributes.addAll(edits);
+ addAttributes(parent, changedAttributes);
+ }
+
+ private Set<RepositoryTaskAttribute> readEdits(IMemento parent) {
+ return new HashSet<RepositoryTaskAttribute>(readAttributes(parent));
+ }
+
+ private void addTaskData(IMemento parent, RepositoryTaskData newTaskData) {
+ parent.putString(ATTRIBUTE_ID, getCleanText(newTaskData.getTaskId()));
+ parent.putString(ATTRIBUTE_TASK_KIND, getCleanText(newTaskData.getTaskKind()));
+ parent.putString(ATTRIBUTE_REPOSITORY_URL, getCleanText(newTaskData.getRepositoryUrl()));
+ parent.putString(ATTRIBUTE_REPOSITORY_KIND, getCleanText(newTaskData.getConnectorKind()));
+
+ IMemento attributes = parent.createChild(ELEMENT_ATTRIBUTES);
+ addAttributes(attributes, newTaskData.getAttributes());
+
+ IMemento operations = parent.createChild(ELEMENT_OPERATIONS);
+ addOperations(operations, newTaskData.getOperations());
+ if (newTaskData.getSelectedOperation() != null) {
+ addSelectedOperation(operations, newTaskData.getSelectedOperation());
+ }
+
+ IMemento comments = parent.createChild(ELEMENT_COMMENTS);
+ addComments(comments, newTaskData.getComments());
+
+ IMemento attachments = parent.createChild(ELEMENT_ATTACHMENTS);
+ addAttachments(attachments, newTaskData.getAttachments());
+
+ }
+
+ public void addAttachments(IMemento parent, List<RepositoryAttachment> attachments) {
+ for (RepositoryAttachment attachment : attachments) {
+ IMemento memento = parent.createChild(ELEMENT_ATTACHMENT);
+ memento.putString(ATTRIBUTE_IS_PATCH, String.valueOf(attachment.isPatch()));
+ memento.putString(ATTRIBUTE_IS_OBSOLETE, String.valueOf(attachment.isObsolete()));
+ memento.putString(ATTRIBUTE_CREATOR, getCleanText(attachment.getCreator()));
+ memento.putString(ATTRIBUTE_ID, getCleanText(attachment.getTaskId()));
+ memento.putString(ATTRIBUTE_REPOSITORY_KIND, getCleanText(attachment.getRepositoryKind()));
+ memento.putString(ATTRIBUTE_REPOSITORY_URL, getCleanText(attachment.getRepositoryUrl()));
+ IMemento attributes = memento.createChild(ELEMENT_ATTRIBUTES);
+ addAttributes(attributes, attachment.getAttributes());
+ }
+ }
+
+ public List<RepositoryAttachment> readAttachments(IMemento parent) {
+ List<RepositoryAttachment> attachments = new ArrayList<RepositoryAttachment>();
+ for (IMemento attachmentMemento : parent.getChildren(ELEMENT_ATTACHMENT)) {
+ RepositoryAttachment attachment = new RepositoryAttachment(temporaryFactory);
+ String isPatch = attachmentMemento.getString(ATTRIBUTE_IS_PATCH);
+ String isObsolete = attachmentMemento.getString(ATTRIBUTE_IS_OBSOLETE);
+ String taskId = attachmentMemento.getString(ATTRIBUTE_ID);
+ String creator = attachmentMemento.getString(ATTRIBUTE_CREATOR);
+ String repositoryKind = attachmentMemento.getString(ATTRIBUTE_REPOSITORY_KIND);
+ String repositoryUrl = attachmentMemento.getString(ATTRIBUTE_REPOSITORY_URL);
+
+ if (isPatch != null) {
+ attachment.setPatch(Boolean.parseBoolean(isPatch));
+ }
+ if (isObsolete != null) {
+ attachment.setObsolete(Boolean.parseBoolean(isObsolete));
+ }
+ if (creator != null) {
+ attachment.setCreator(creator);
+ }
+ if (repositoryKind != null) {
+ attachment.setRepositoryKind(repositoryKind);
+ }
+ if (repositoryUrl != null) {
+ attachment.setRepositoryUrl(repositoryUrl);
+ }
+ if (taskId != null) {
+ attachment.setTaskId(taskId);
+ }
+ IMemento attributesMemento = attachmentMemento.getChild(ELEMENT_ATTRIBUTES);
+ if (attributesMemento != null) {
+ List<RepositoryTaskAttribute> attributes = readAttributes(attributesMemento);
+ for (RepositoryTaskAttribute repositoryTaskAttribute : attributes) {
+ attachment.addAttribute(repositoryTaskAttribute.getId(), repositoryTaskAttribute);
+ }
+ }
+ attachments.add(attachment);
+ }
+ return attachments;
+ }
+
+ public void addComments(IMemento parent, List<TaskComment> comments) {
+ for (TaskComment taskComment : comments) {
+ IMemento comment = parent.createChild(ELEMENT_COMMENT);
+ comment.putInteger(ATTRIBUTE_NUMBER, taskComment.getNumber());
+ comment.putString(ATTRIBUTE_HAS_ATTACHMENT, String.valueOf(taskComment.hasAttachment()));
+ comment.putString(ATTRIBUTE_ATTACHMENT_ID, getCleanText(taskComment.getAttachmentId()));
+ IMemento attributes = comment.createChild(ELEMENT_ATTRIBUTES);
+ addAttributes(attributes, taskComment.getAttributes());
+ }
+ }
+
+ public List<TaskComment> readComments(IMemento parent) {
+ List<TaskComment> comments = new ArrayList<TaskComment>();
+ for (IMemento commentMemento : parent.getChildren(ELEMENT_COMMENT)) {
+ Integer commentNumber = commentMemento.getInteger(ATTRIBUTE_NUMBER);
+ String hasAttachment = commentMemento.getString(ATTRIBUTE_HAS_ATTACHMENT);
+ String attachmentId = commentMemento.getString(ATTRIBUTE_ATTACHMENT_ID);
+ if (commentNumber != null) {
+ TaskComment comment = new TaskComment(temporaryFactory, commentNumber);
+ if (hasAttachment != null) {
+ comment.setHasAttachment(Boolean.parseBoolean(hasAttachment));
+ }
+ if (attachmentId != null) {
+ comment.setAttachmentId(attachmentId);
+ }
+ IMemento attributesMemento = commentMemento.getChild(ELEMENT_ATTRIBUTES);
+ if (attributesMemento != null) {
+ List<RepositoryTaskAttribute> attributes = readAttributes(attributesMemento);
+ for (RepositoryTaskAttribute repositoryTaskAttribute : attributes) {
+ comment.addAttribute(repositoryTaskAttribute.getId(), repositoryTaskAttribute);
+ }
+ }
+ comments.add(comment);
+ }
+ }
+ return comments;
+ }
+
+ private void addSelectedOperation(IMemento operations, RepositoryOperation selectedOperation) {
+ IMemento selected = operations.createChild(ELEMENT_SELECTED);
+ ArrayList<RepositoryOperation> list = new ArrayList<RepositoryOperation>();
+ list.add(selectedOperation);
+ addOperations(selected, list);
+ }
+
+ public void addOperations(IMemento parent, List<RepositoryOperation> operations) {
+ for (RepositoryOperation operation : operations) {
+ IMemento operationMemento = parent.createChild(ELEMENT_OPERATION);
+ operationMemento.putString(ATTRIBUTE_KNOB_NAME, getCleanText(operation.getKnobName()));
+ operationMemento.putString(ATTRIBUTE_OPERATION_NAME, getCleanText(operation.getOperationName()));
+ operationMemento.putString(ATTRIBUTE_IS_CHECKED, String.valueOf(operation.isChecked()));
+ if (operation.isInput()) {
+ operationMemento.putString(ATTRIBUTE_INPUT_NAME, getCleanText(operation.getInputName()));
+ operationMemento.putString(ATTRIBUTE_INPUT_VALUE, getCleanText(operation.getInputValue()));
+ }
+ if (operation.hasOptions()) {
+ operationMemento.putString(ATTRIBUTE_OPTION_NAME, getCleanText(operation.getOptionName()));
+ operationMemento.putString(ATTRIBUTE_OPTION_SELECTION, getCleanText(operation.getOptionSelection()));
+
+ if (operation.getOptionNames() != null && operation.getOptionNames().size() > 0) {
+ IMemento optionNames = operationMemento.createChild(ELEMENT_OPTION_NAMES);
+ for (String name : operation.getOptionNames()) {
+ IMemento nameMemento = optionNames.createChild(ELEMENT_NAME);
+ nameMemento.putTextData(getCleanText(name));
+ nameMemento.putString(ATTRIBUTE_VALUE, getCleanText(operation.getOptionValue(name)));
+ }
+ }
+ }
+ }
+ }
+
+ /* public for testing */
+ public List<RepositoryOperation> readOperations(IMemento parent) {
+ List<RepositoryOperation> operations = new ArrayList<RepositoryOperation>();
+ for (IMemento operationMemento : parent.getChildren(ELEMENT_OPERATION)) {
+ String knobName = operationMemento.getString(ATTRIBUTE_KNOB_NAME);
+ String operationName = operationMemento.getString(ATTRIBUTE_OPERATION_NAME);
+ String optionName = operationMemento.getString(ATTRIBUTE_OPTION_NAME);
+ String selection = operationMemento.getString(ATTRIBUTE_OPTION_SELECTION);
+ String isChecked = operationMemento.getString(ATTRIBUTE_IS_CHECKED);
+ String inputName = operationMemento.getString(ATTRIBUTE_INPUT_NAME);
+ String inputValue = operationMemento.getString(ATTRIBUTE_INPUT_VALUE);
+
+ if (knobName == null || operationName == null) {
+ continue;
+ }
+
+ RepositoryOperation op = new RepositoryOperation(knobName, operationName);
+ if (optionName != null) {
+ op.setUpOptions(optionName);
+ }
+ if (isChecked != null) {
+ op.setChecked(Boolean.parseBoolean(isChecked));
+ }
+ if (inputName != null) {
+ op.setInputName(inputName);
+ }
+ if (inputValue != null) {
+ op.setInputValue(inputValue);
+ }
+
+ IMemento optionNames = operationMemento.getChild(ELEMENT_OPTION_NAMES);
+ if (optionNames != null) {
+ for (IMemento nameMemento : optionNames.getChildren(ELEMENT_NAME)) {
+ if (nameMemento.getTextData() != null && nameMemento.getTextData().length() > 0) {
+ op.addOption(nameMemento.getTextData(), nameMemento.getString(ATTRIBUTE_VALUE));
+ }
+ }
+ }
+
+ // Selection must be applied after addition of options
+ if (selection != null) {
+ op.setOptionSelection(selection);
+ }
+
+ operations.add(op);
+
+ }
+ return operations;
+ }
+
+ /* public for testing */
+ public void addAttributes(IMemento parent, List<RepositoryTaskAttribute> attributes) {
+ for (RepositoryTaskAttribute attribute : attributes) {
+ IMemento attribMemento = parent.createChild(ELEMENT_ATTRIBUTE);
+ attribMemento.putString(ATTRIBUTE_ID, getCleanText(attribute.getId()));
+ attribMemento.putString(ATTRIBUTE_NAME, getCleanText(attribute.getName()));
+ attribMemento.putString(ATTRIBUTE_HIDDEN, String.valueOf(attribute.isHidden()));
+ attribMemento.putString(ATTRIBUTE_READONLY, String.valueOf(attribute.isReadOnly()));
+
+ IMemento values = attribMemento.createChild(ELEMENT_VALUES);
+ for (String value : attribute.getValues()) {
+ values.createChild(ELEMENT_VALUE).putTextData(getCleanText(value));
+ }
+
+ IMemento options = attribMemento.createChild(ELEMENT_OPTIONS);
+ for (String optionValue : attribute.getOptions()) {
+ IMemento option = options.createChild(ELEMENT_OPTION);
+ option.putTextData(getCleanText(optionValue));
+ String parameter = attribute.getOptionParameter(optionValue);
+ if (parameter != null) {
+ option.putString(ATTRIBUTE_PARAMETER, getCleanText(parameter));
+ }
+ }
+ IMemento metaData = attribMemento.createChild(ELEMENT_META_DATA);
+ Map<String, String> metadata = attribute.getMetaData();
+ if (metadata != null && metadata.size() > 0) {
+ for (String key : metadata.keySet()) {
+ IMemento meta = metaData.createChild(ELEMENT_META);
+ meta.putString(ATTRIBUTE_KEY, getCleanText(key));
+ meta.putTextData(getCleanText(metadata.get(key)));
+ }
+ }
+ }
+ }
+
+ private String getCleanText(String text) {
+ if (text == null) {
+ return "";
+ }
+ String result = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.cleanXmlString(text);
+ if (result == null) {
+ result = "";
+ }
+ return result;
+ }
+
+ /* public for testing */
+ public List<RepositoryTaskAttribute> readAttributes(IMemento parent) {
+ List<RepositoryTaskAttribute> attributes = new ArrayList<RepositoryTaskAttribute>();
+ for (IMemento attrMemento : parent.getChildren(ELEMENT_ATTRIBUTE)) {
+ String id = attrMemento.getString(ATTRIBUTE_ID);
+ String name = attrMemento.getString(ATTRIBUTE_NAME);
+ String hidden = attrMemento.getString(ATTRIBUTE_HIDDEN);
+ if (id != null && name != null && hidden != null) {
+ RepositoryTaskAttribute attribute = new RepositoryTaskAttribute(id, name, Boolean.parseBoolean(hidden));
+ attributes.add(attribute);
+ String readOnly = attrMemento.getString(ATTRIBUTE_READONLY);
+ if (readOnly != null) {
+ attribute.setReadOnly(Boolean.parseBoolean(readOnly));
+ }
+
+ IMemento values = attrMemento.getChild(ELEMENT_VALUES);
+ if (values != null) {
+ for (IMemento valueMemento : values.getChildren(ELEMENT_VALUE)) {
+ attribute.addValue(getCleanText(valueMemento.getTextData()));
+ }
+ }
+
+ IMemento options = attrMemento.getChild(ELEMENT_OPTIONS);
+ if (options != null) {
+ for (IMemento optionMemento : options.getChildren(ELEMENT_OPTION)) {
+ attribute.addOption(getCleanText(optionMemento.getTextData()),
+ optionMemento.getString(ATTRIBUTE_PARAMETER));
+ }
+ }
+
+ IMemento metaData = attrMemento.getChild(ELEMENT_META_DATA);
+ if (metaData != null) {
+ for (IMemento optionMemento : metaData.getChildren(ELEMENT_META)) {
+ attribute.putMetaDataValue(optionMemento.getString(ATTRIBUTE_KEY),
+ getCleanText(optionMemento.getTextData()));
+ }
+ }
+ }
+ }
+ return attributes;
+ }
+
+ public void remove(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return;
+ }
+ File file;
+ try {
+ file = getDataFile(URLEncoder.encode(repositoryUrl, ENCODING_UTF_8), id);
+ if (file != null && file.exists()) {
+ file.delete();
+ }
+
+ if (file != null && file.getParentFile() != null && file.getParentFile().exists()
+ && file.getParentFile().list().length == 0) {
+ file.getParentFile().delete();
+ }
+
+ // TODO: Remove folder if last file removed
+
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Error removing offline data: "
+ + repositoryUrl + "-" + id, e));
+ }
+ }
+
+ private File getDataFile(String folder, String id) throws IOException {
+ File repositoryFolder = new File(dataDir, folder);
+ File dataFile = new File(repositoryFolder, id + EXTENSION);
+ return dataFile;
+ }
+
+ /**
+ * Delete entire offline repositoy contents, FOR TESTING ONLY
+ */
+ public void clear() {
+ if (dataDir.exists()) {
+ for (File file : dataDir.listFiles()) {
+ destroy(file);
+ }
+ }
+ }
+
+ private void destroy(File folder) {
+ if (folder.isDirectory()) {
+ for (File file : folder.listFiles()) {
+ destroy(file);
+ }
+ }
+ folder.delete();
+ }
+
+ public void flush() {
+ // ignore;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tasks/TaskDataStorageManager.java b/org.eclipse.mylyn/developer/src-old/tasks/TaskDataStorageManager.java
new file mode 100644
index 0000000..e6546ef
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tasks/TaskDataStorageManager.java
@@ -0,0 +1,357 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2008 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;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.mylyn.commons.core.StatusHandler;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
+import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
+import org.eclipse.mylyn.tasks.core.IRepositoryManager;
+
+/**
+ * @deprecated Do not use. This class is pending for removal: see bug 237552.
+ */
+ at Deprecated
+public class TaskDataStorageManager {
+
+ private final IRepositoryManager taskRepositoryManager;
+
+ private final ITaskDataStorage storage;
+
+ private int nextNewId = 1;
+
+ public TaskDataStorageManager(IRepositoryManager taskRepositoryManager, ITaskDataStorage storage) {
+ this.taskRepositoryManager = taskRepositoryManager;
+ this.storage = storage;
+ }
+
+ /**
+ * Add a RepositoryTaskData to the offline reports file.
+ */
+ public void setNewTaskData(RepositoryTaskData data) {
+ if (data == null || data.getRepositoryUrl() == null || data.getTaskId() == null) {
+ return;
+ }
+
+ TaskDataState state = retrieveState(data);
+ if (state != null) {
+ state.setNewTaskData(data);
+ } else {
+ state = new TaskDataState(data.getRepositoryUrl(), data.getTaskId());
+ state.setNewTaskData(data);
+ }
+ saveState(state);
+ }
+
+ /**
+ * @since 2.3
+ */
+ public void setNewTaskData(String repositoryUrl, String taskId, RepositoryTaskData data) {
+ TaskDataState state = retrieveState(repositoryUrl, taskId);
+ if (state != null) {
+ state.setNewTaskData(data);
+ } else {
+ state = new TaskDataState(repositoryUrl, taskId);
+ state.setNewTaskData(data);
+ }
+ saveState(state);
+ }
+
+ public void setOldTaskData(RepositoryTaskData data) {
+ if (data == null || data.getRepositoryUrl() == null || data.getTaskId() == null) {
+ return;
+ }
+ TaskDataState state = retrieveState(data);
+ if (state != null) {
+ state.setOldTaskData(data);
+ } else {
+ StatusHandler.log(new Status(IStatus.WARNING, ITasksCoreConstants.ID_PLUGIN,
+ "Attempt to save old data when no new data exists", new Exception()));
+ }
+ saveState(state);
+ }
+
+ /**
+ * Returns the most recent copy of the task data.
+ *
+ * @return offline task data, null if no data found
+ */
+ public RepositoryTaskData getNewTaskData(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return null;
+ }
+ TaskDataState state = retrieveState(repositoryUrl, id);
+ if (state != null) {
+ return state.getNewTaskData();
+ }
+ return null;
+ }
+
+ /**
+ * Returns the old copy if exists, null otherwise.
+ */
+ public RepositoryTaskData getOldTaskData(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return null;
+ }
+ TaskDataState state = retrieveState(repositoryUrl, id);
+ if (state != null) {
+ return state.getOldTaskData();
+ }
+ return null;
+ }
+
+ /**
+ * @return Get the next available temporary taskId. This taskId is given to new unsubmitted repository tasks.
+ * Incremented each time this method is called.
+ */
+ public synchronized String getNewRepositoryTaskId() {
+ // TODO: generate based on values of unsubmitted offline report ids
+ nextNewId++;
+ if (nextNewId == Integer.MAX_VALUE) {
+ nextNewId = 1;
+ }
+ return "" + nextNewId;
+ }
+
+ /**
+ *
+ * @return editable copy of task data with any edits applied
+ */
+ public RepositoryTaskData getEditableCopy(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return null;
+ }
+ TaskDataState state = retrieveState(repositoryUrl, id);
+ RepositoryTaskData clone = null;
+ if (state != null) {
+ if (state.getNewTaskData() != null) {
+ try {
+ clone = (RepositoryTaskData) ObjectCloner.deepCopy(state.getNewTaskData());
+ updateAttributeFactory(clone);
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
+ "Error constructing modifiable task", e));
+ return null;
+ }
+ }
+ if (clone != null) {
+ for (RepositoryTaskAttribute attribute : state.getEdits()) {
+ if (attribute == null) {
+ continue;
+ }
+ RepositoryTaskAttribute existing = clone.getAttribute(attribute.getId());
+ if (existing != null) {
+ existing.clearValues();
+ List<String> options = existing.getOptions();
+
+ for (String value : attribute.getValues()) {
+ if (options.size() > 0) {
+ if (options.contains(value)) {
+ existing.addValue(value);
+ }
+ } else {
+ existing.addValue(value);
+ }
+ }
+
+ } else {
+ clone.addAttribute(attribute.getId(), attribute);
+ }
+ }
+ }
+ }
+ return clone;
+
+ }
+
+ // TODO review: the state of the elements of changedAttribues could change between this call and the time state is written to disk, might need to make a full copy
+ public void saveEdits(String repositoryUrl, String id, Set<RepositoryTaskAttribute> changedAttributes) {
+ TaskDataState state = retrieveState(repositoryUrl, id);
+ if (state != null) {
+ Set<RepositoryTaskAttribute> edits = state.getEdits();
+ if (edits == null) {
+ // Copy here?
+ state.setEdits(changedAttributes);
+ } else {
+ edits.removeAll(changedAttributes);
+ edits.addAll(changedAttributes);
+ }
+ try {
+ storage.put(state);
+ } catch (Exception e) {
+ // FIXME what exception is caught here?
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error saving edits", e));
+ }
+ }
+
+ }
+
+ public Set<RepositoryTaskAttribute> getEdits(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return Collections.emptySet();
+ }
+ TaskDataState state = retrieveState(repositoryUrl, id);
+ if (state != null) {
+ if (state.getEdits() != null) {
+ return Collections.unmodifiableSet(state.getEdits());
+ }
+ }
+ return Collections.emptySet();
+ }
+
+ public void discardEdits(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return;
+ }
+ TaskDataState state = retrieveState(repositoryUrl, id);
+ if (state != null) {
+ state.discardEdits();
+ try {
+ storage.put(state);
+ } catch (Exception e) {
+ // FIXME what exception is caught here?
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error discarding edits", e));
+ }
+ }
+ }
+
+ public void remove(String repositoryUrl, String id) {
+ if (repositoryUrl == null || id == null) {
+ return;
+ }
+ storage.remove(repositoryUrl, id);
+ }
+
+ /**
+ * DESTROY ALL OFFLINE TASK DATA Public for testing only Forces a reset of all data maps Does not signal data
+ * changed (doesn't request save)
+ */
+ public void clear() {
+ nextNewId = 0;
+ storage.clear();
+ }
+
+ /**
+ * After deserialization process the attributeFactory needs to be reset on each RepositoryTaskData.
+ */
+ private void updateAttributeFactory(RepositoryTaskData taskData) {
+ if (taskData == null) {
+ return;
+ }
+ taskData.refresh();
+ AbstractLegacyRepositoryConnector connector = (AbstractLegacyRepositoryConnector) taskRepositoryManager.getRepositoryConnector(taskData.getConnectorKind());
+ if (connector != null && connector.getLegacyTaskDataHandler() != null) {
+ AbstractAttributeFactory factory = connector.getLegacyTaskDataHandler().getAttributeFactory(taskData);
+ if (factory != null) {
+ taskData.setAttributeFactory(factory);
+ }
+ }
+ }
+
+ // XXX: review if task data cloning can be done without using serialization
+ // Reference:
+ // http://www.javaworld.com/javaworld/javatips/jw-javatip76.html?page=2
+ public static class ObjectCloner {
+
+ private ObjectCloner() {
+ // can not instantiate
+ }
+
+ static public Object deepCopy(Object oldObj) throws Exception {
+ ObjectOutputStream outputStream = null;
+ ObjectInputStream inputStream = null;
+ try {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ outputStream = new ObjectOutputStream(byteArrayOutputStream);
+
+ outputStream.writeObject(oldObj);
+ outputStream.flush();
+ ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
+ byteArrayOutputStream.toByteArray());
+ inputStream = new ObjectInputStream(byteArrayInputStream);
+ return inputStream.readObject();
+ } catch (Exception e) {
+ throw (e);
+ } finally {
+ if (outputStream != null) {
+ outputStream.close();
+ }
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+
+ }
+
+ public void start() {
+ try {
+ storage.start();
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Offline storage start failed",
+ e));
+ }
+ }
+
+ public void stop() {
+ try {
+ storage.stop();
+ } catch (Exception e) {
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Offline storage stop failed", e));
+ }
+ }
+
+ public void saveNow() {
+ storage.flush();
+ }
+
+ private TaskDataState retrieveState(RepositoryTaskData data) {
+ return retrieveState(data.getRepositoryUrl(), data.getTaskId());
+ }
+
+ private TaskDataState retrieveState(String repositoryUrl, String id) {
+ TaskDataState state = null;
+ try {
+ state = storage.get(repositoryUrl, id);
+ if (state != null) {
+ // TODO: Get rid of attribute factory on containers!!!
+ if (state.getNewTaskData() != null) {
+ updateAttributeFactory(state.getNewTaskData());
+ }
+ if (state.getOldTaskData() != null) {
+ updateAttributeFactory(state.getOldTaskData());
+ }
+ }
+ } catch (Exception e) {
+ // FIXME what Exception is caught here?
+ StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error saving offline data", e));
+ }
+ return state;
+ }
+
+ private void saveState(TaskDataState state) {
+ storage.put(state);
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tests/BugzillaTaskDataMigrationTest.java b/org.eclipse.mylyn/developer/src-old/tests/BugzillaTaskDataMigrationTest.java
new file mode 100644
index 0000000..a5714a6
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tests/BugzillaTaskDataMigrationTest.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.bugzilla.tests;
+
+import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
+import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.BugzillaTaskEditorInput;
+import org.eclipse.mylyn.tasks.core.RepositoryTaskAttribute;
+
+
+/**
+ * @author Rob Elves
+ */
+public class BugzillaTaskDataMigrationTest extends AbstractBugzillaTest {
+
+ public void testMigrateDescriptionToReadOnly() throws Exception {
+ init222();
+ BugzillaTask task = generateLocalTaskAndDownload("1");
+ assertNotNull(task);
+ assertNotNull(task.getTaskData());
+ RepositoryTaskAttribute attrib = task.getTaskData().getDescriptionAttribute();
+ assertNotNull(attrib);
+ attrib.setReadOnly(false);
+ BugzillaTaskEditorInput editorInput = new BugzillaTaskEditorInput(repository, task, false);
+ assertTrue(editorInput.getBugTask().getTaskData().getDescriptionAttribute().isReadOnly());
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tests/Job.java b/org.eclipse.mylyn/developer/src-old/tests/Job.java
new file mode 100644
index 0000000..1c7a875
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tests/Job.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.tasklist.tests;
+
+public class Job {
+ private String company;
+ private String position;
+ private int salary;
+ private String email;
+ private String supervisor;
+
+ public static String foo = "TESTING STATIC FOR XSTREAM";
+
+ public Job() {
+ this.company = "Foo";
+ this.position = "slave";
+ this.salary = 100;
+ this.email = "a at bc.com";
+ //this.supervisor = "bill gates";
+ }
+
+ public Job(String comp, String pos, int salary, String email, String supervisor) {
+ this.company = comp;
+ this.position = pos;
+ this.salary = salary;
+ this.email = email;
+ this.supervisor = supervisor;
+ }
+
+ public boolean equals(Job j) {
+ boolean result = true;
+ result = result && j.company == this.company;
+ result = result && j.position == this.position;
+ result = result && j.salary == this.salary;
+ result = result && j.email == this.email;
+ result = result && j.supervisor == this.supervisor;
+ return result;
+ }
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPosition() {
+ return position;
+ }
+
+ public void setPosition(String position) {
+ this.position = position;
+ }
+
+ public int getSalary() {
+ return salary;
+ }
+
+ public void setSalary(int salary) {
+ this.salary = salary;
+ }
+
+ public String getSupervisor() {
+ return supervisor;
+ }
+
+ public void setSupervisor(String supervisor) {
+ this.supervisor = supervisor;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tests/People.java b/org.eclipse.mylyn/developer/src-old/tests/People.java
new file mode 100644
index 0000000..8512e61
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tests/People.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.tasklist.tests;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+public class People {
+ private List<Person> list = new ArrayList<Person>();
+
+ public People() {
+ // don't need to do any initialization
+ }
+
+ public void createDefault() {
+ Person p = new Person("Ken Sueda", "ksueda at hotmail.com", "123-4567", 22, 1);
+ Job j = new Job("UBCCS", "developer", 1000, "ksueda at cs.ubc.ca", "foo");
+ p.setJob(j);
+ list.add(p);
+
+ p = new Person("Shawn Minto", "minto at hotmail.com", "798-1234", 23, 2);
+ j = new Job("UBCCS", "grad student", 3000, "minto at cs.ubc.ca", "foo");
+ p.setJob(j);
+ list.add(p);
+
+
+ p = new Person("Mik Kersten", "kersten at hotmail.com", "456-7891", 24, 3);
+ j = new Job("UBCCS", "PhD", 1000000, "kersten at cs.ubc.ca", "foo");
+ p.setJob(j);
+ list.add(p);
+
+ p = new Person("Gail Murphy", "murphy at hotmail.com", "987-6543", 25, 4);
+ j = new Job("UBCCS", "Professor", 100000000, "", "");
+ p.setJob(j);
+ list.add(p);
+ }
+
+ public boolean equals(People people) {
+ boolean result = true;
+ if (list.size() == people.list.size()) {
+ Iterator<Person> itr = list.iterator();
+ Iterator<Person> itr2 = people.list.iterator();
+
+ while(itr.hasNext()) {
+ Person p = itr.next();
+ Person p2 = itr2.next();
+ result = result && p.equals(p2);
+ if (!result) {
+ break;
+ }
+ }
+ } else {
+ result = false;
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/tests/Person.java b/org.eclipse.mylyn/developer/src-old/tests/Person.java
new file mode 100644
index 0000000..a93a7ef
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/tests/Person.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.tasklist.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Person {
+ private String name;
+ private String emailAddress;
+ private String phoneNumber;
+ private int age;
+ private int id;
+ private Job job;
+
+ private List<Person> list = new ArrayList<Person>();
+
+ public Person() {
+ name = "Ken Sueda";
+ id = 1;
+ age = 22;
+ emailAddress = "ksueda at hotmail.com";
+ phoneNumber = "123-4567";
+ job = null;
+ }
+
+ public Person(String name, String email, String phone, int age, int id) {
+ this.name = name;
+ this.emailAddress = email;
+ this.phoneNumber = phone;
+ this.age = age;
+ this.id = id;
+ this.job = null;
+ }
+
+ public void add(Person p) {
+ list.add(p);
+ }
+
+ public boolean equals(Person p) {
+ boolean result = true;
+ result = result && p.name == this.name;
+ result = result && p.emailAddress == this.emailAddress;
+ result = result && p.phoneNumber == this.phoneNumber;
+ result = result && p.age == this.age;
+ result = result && p.id == this.id;
+ result = result && p.job.equals(this.job);
+ return result;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+ public void setEmailAddress(String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+
+ public String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ public Job getJob() {
+ return job;
+ }
+
+ public void setJob(Job job) {
+ this.job = job;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/trac/RepositorySearchQuery.java b/org.eclipse.mylyn/developer/src-old/trac/RepositorySearchQuery.java
new file mode 100644
index 0000000..36e2c1a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/trac/RepositorySearchQuery.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.trac.ui.search;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.QueryHitCollector;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * This class performs a search query.
+ *
+ * @author Steffen Pingel
+ */
+public class RepositorySearchQuery extends AbstractRepositorySearchQuery {
+
+ private QueryHitCollector collector;
+
+ private TaskRepository repository;
+
+ private AbstractRepositoryQuery query;
+
+ public RepositorySearchQuery(TaskRepository repository, AbstractRepositoryQuery query) {
+ this.repository = repository;
+ this.query = query;
+ }
+
+ public QueryHitCollector getCollector() {
+ return collector;
+ }
+
+ public void setCollector(QueryHitCollector collector) {
+ this.collector = collector;
+ }
+
+ public IStatus run(IProgressMonitor monitor) throws OperationCanceledException {
+ //MultiStatus queryStatus = new MultiStatus(TasksUiPlugin.PLUGIN_ID, IStatus.OK, "Query result", null);
+ IStatus queryStatus = Status.OK_STATUS;
+ try {
+ collector.setProgressMonitor(monitor);
+ collector.aboutToStart(0);
+
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ repository.getKind());
+
+ queryStatus = connector.performQuery(query, repository, TasksUiPlugin.getDefault().getProxySettings(), monitor, collector);
+ collector.done();
+ } catch (final CoreException e) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(null, "Repository Search Error", null, e.getStatus());
+ }
+ });
+ return Status.OK_STATUS;
+ }
+
+ final IStatus status = queryStatus;
+ if (status.getCode() == IStatus.CANCEL) {
+ return Status.OK_STATUS;
+ } else if (!status.isOK()) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ ErrorDialog.openError(null, "Repository Search Error", null, status);
+ }
+ });
+ return Status.OK_STATUS;
+ }
+ return status;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ActiveTaskscapeView.java b/org.eclipse.mylyn/developer/src-old/views/ActiveTaskscapeView.java
new file mode 100644
index 0000000..1814b6e
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ActiveTaskscapeView.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.tasklist.ui.views;
+
+
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.*;
+import org.eclipse.ui.part.ViewPart;
+
+
+/**
+ * This sample class demonstrates how to plug-in a new
+ * workbench view. The view shows data obtained from the
+ * model. The sample creates a dummy model on the fly,
+ * but a real implementation would connect to the model
+ * available either in this or another plug-in (e.g. the workspace).
+ * The view is connected to the model using a content provider.
+ * <p>
+ * The view uses a label provider to define how model
+ * objects should be presented in the view. Each
+ * view can present the same model objects using
+ * different labels and icons, if needed. Alternatively,
+ * a single label provider can be shared between views
+ * in order to ensure that objects of the same type are
+ * presented in the same way everywhere.
+ * <p>
+ */
+
+public class ActiveTaskscapeView extends ViewPart {
+
+ private TableViewer viewer;
+ private Action action1;
+ private Action action2;
+ private Action doubleClickAction;
+
+ /*
+ * The content provider class is responsible for
+ * providing objects to the view. It can wrap
+ * existing objects in adapters or simply return
+ * objects as-is. These objects may be sensitive
+ * to the current input of the view, or ignore
+ * it and always show the same content
+ * (like Task List, for example).
+ */
+
+ class ViewContentProvider implements IStructuredContentProvider {
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ // don't care if the input changes
+ }
+ public void dispose() {
+ // don't care if we are disposed
+ }
+ public Object[] getElements(Object parent) {
+ return new String[] { "One", "Two", "Three" };
+ }
+ }
+ class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public String getColumnText(Object obj, int index) {
+ return getText(obj);
+ }
+ public Image getColumnImage(Object obj, int index) {
+ return getImage(obj);
+ }
+
+ @Override
+ public Image getImage(Object obj) {
+ return PlatformUI.getWorkbench().
+ getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+ }
+ }
+ class NameSorter extends ViewerSorter {
+ // empty class used as default sorter for the view
+ }
+
+ /**
+ * The constructor.
+ */
+ public ActiveTaskscapeView() {
+ // don't have any initialization
+ }
+
+ /**
+ * This is a callback that will allow us
+ * to create the viewer and initialize it.
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new ViewContentProvider());
+ viewer.setLabelProvider(new ViewLabelProvider());
+ viewer.setSorter(new NameSorter());
+ viewer.setInput(getViewSite());
+
+ makeActions();
+ hookContextMenu();
+ hookDoubleClickAction();
+ contributeToActionBars();
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager("#PopupMenu");
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ ActiveTaskscapeView.this.fillContextMenu(manager);
+ }
+ });
+ Menu menu = menuMgr.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(menuMgr, viewer);
+ }
+
+ private void contributeToActionBars() {
+ IActionBars bars = getViewSite().getActionBars();
+ fillLocalPullDown(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillLocalPullDown(IMenuManager manager) {
+ manager.add(action1);
+ manager.add(new Separator());
+ manager.add(action2);
+ }
+
+ private void fillContextMenu(IMenuManager manager) {
+ manager.add(action1);
+ manager.add(action2);
+ // Other plug-ins can contribute there actions here
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ manager.add(action1);
+ manager.add(action2);
+ }
+
+ private void makeActions() {
+ action1 = new Action() {
+
+ @Override
+ public void run() {
+ showMessage("Action 1 executed");
+ }
+ };
+ action1.setText("Action 1");
+ action1.setToolTipText("Action 1 tooltip");
+ action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+ getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+
+ action2 = new Action() {
+
+ @Override
+ public void run() {
+ showMessage("Action 2 executed");
+ }
+ };
+ action2.setText("Action 2");
+ action2.setToolTipText("Action 2 tooltip");
+ action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+ getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
+ doubleClickAction = new Action() {
+
+ @Override
+ public void run() {
+ ISelection selection = viewer.getSelection();
+ Object obj = ((IStructuredSelection)selection).getFirstElement();
+ showMessage("Double-click detected on "+obj.toString());
+ }
+ };
+ }
+
+ private void hookDoubleClickAction() {
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ doubleClickAction.run();
+ }
+ });
+ }
+ private void showMessage(String message) {
+ MessageDialog.openInformation(
+ viewer.getControl().getShell(),
+ "Sample View",
+ message);
+ }
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ @Override
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/views/DoiViewerFilter.java b/org.eclipse.mylyn/developer/src-old/views/DoiViewerFilter.java
new file mode 100644
index 0000000..a06dfbb
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/DoiViewerFilter.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 27, 2004
+ */
+package org.eclipse.mylyn.java.ui;
+
+import org.eclipse.core.internal.resources.File;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jdt.core.*;
+import org.eclipse.jdt.internal.core.PackageFragment;
+import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.ui.views.markers.internal.ProblemMarker;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.core.model.ITaskscapeNode;
+import org.eclipse.mylyn.java.JavaUiUtil;
+
+/**
+ * @author Mik Kersten
+ */
+public class DoiViewerFilter extends ViewerFilter {
+
+ private boolean filterUninterestingEnabled = false;
+ private boolean filterDeclarationsEnabled = false;
+
+ public boolean select(Viewer viewer, Object parentElement, Object object) {
+ if (!filterUninterestingEnabled) return true;
+
+ if (object instanceof ProblemMarker) {
+ ProblemMarker problemMarker = (ProblemMarker)object;
+ if (problemMarker.getSeverity() == IMarker.SEVERITY_ERROR) {
+ return true;
+ } else {
+ object = JavaUiUtil.getJavaElement(problemMarker); // TODO: don't reassing
+ }
+ }
+
+ if (object instanceof IJavaElement) {
+ IJavaElement element = (IJavaElement)object;
+// if (element instanceof IJavaProject) {
+// return true;
+// } else if (element instanceof PackageFragmentRoot && !(element instanceof JarPackageFragmentRoot)) {
+// return true;
+// } else if (element instanceof PackageFragment && !acceptPackageFragment((PackageFragment)element)) {
+// return false;
+// } else if (element instanceof IPackageDeclaration ||
+// element instanceof IImportContainer) {
+// return false;
+// } else
+ if (ContextCorePlugin.getTaskscapeManager().isTempRaised(element.getParent().getHandleIdentifier())) {
+ return true;
+ } else {
+ if (isDeclaration(element) && filterDeclarationsEnabled) {
+ return false;
+ } else if (!filterUninterestingEnabled) {
+ return true;
+ } else {
+ ITaskscapeNode info = ContextCorePlugin.getTaskscapeManager().getDoi(element.getHandleIdentifier());
+ return info != null && info.getDegreeOfInterest().getDegreeOfInterest().isInteresting();
+ }
+ }
+ } else if (object instanceof File) {
+ ITaskscapeNode info = ContextCorePlugin.getTaskscapeManager().getDoi(((File)object).getFullPath().toPortableString());
+ boolean interesting = info != null && info.getDegreeOfInterest().getDegreeOfInterest().isInteresting();
+ if (!filterUninterestingEnabled) {
+ return true;
+ } else {
+ return !(((File)object).getName().charAt(0) == '.') && interesting;
+ }
+ } else if (object instanceof ClassPathContainer) {
+ ClassPathContainer container = (ClassPathContainer)object;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private boolean acceptPackageFragment(PackageFragment fragment) {
+ try {
+ if (fragment.getChildren() == null) return false;
+ if (fragment.getChildren().length == 0) return false;
+ } catch (JavaModelException e) {
+ ContextCorePlugin.fail(e, "Could not determine if package fragment had children", false);
+ }
+ return true;
+ }
+
+ private boolean isDeclaration(IJavaElement element) {
+ return
+ element instanceof IMember
+ || element instanceof IPackageDeclaration
+ || element instanceof IImportContainer
+ || element instanceof IImportDeclaration;
+ }
+
+ public boolean isFilterUninterestingEnabled() {
+ return filterUninterestingEnabled;
+ }
+
+ public void setFilterUninterestingEnabled(boolean enabled) {
+ filterUninterestingEnabled = enabled;
+ }
+
+ public boolean isFilterDeclarationsEnabled() {
+ return filterDeclarationsEnabled;
+ }
+
+ public void setFilterDeclarationsEnabled(
+ boolean enabled) {
+ filterDeclarationsEnabled = enabled;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ImageTableCellEditor.java b/org.eclipse.mylyn/developer/src-old/views/ImageTableCellEditor.java
new file mode 100644
index 0000000..e7e7547
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ImageTableCellEditor.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasklist.ui.views;
+
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * @author Rob Elves
+ *
+ * Cell editor that allows selection of icons.
+ * A replica of ComboBoxCellEditor but makes use of
+ * swt Table widget in order to display images for selection.
+ */
+public class ImageTableCellEditor extends CellEditor {
+
+ /**
+ * The list of items to present
+ */
+ private Image[] items;
+
+ /**
+ * The zero-based index of the selected item.
+ */
+ int selection;
+
+ private Table priorityTable;
+
+ private static final int defaultStyle = SWT.NONE;
+
+
+ public ImageTableCellEditor() {
+ setStyle(defaultStyle);
+ }
+
+ public ImageTableCellEditor(Composite parent, Image[] items) {
+ this(parent, items, defaultStyle);
+ }
+
+ public ImageTableCellEditor(Composite parent, Image[] items, int style) {
+ super(parent, style);
+ setItems(items);
+
+ }
+
+ public Image[] getItems() {
+ return this.items;
+ }
+
+ public void setItems(Image[] items) {
+ Assert.isNotNull(items);
+ this.items = items;
+ populateTableItems();
+ }
+
+ /* (non-Javadoc)
+ * Method declared on CellEditor.
+ */
+ protected Control createControl(Composite parent) {
+
+ priorityTable = new Table(parent, getStyle());
+
+ priorityTable.setFont(parent.getFont());
+
+ priorityTable.addKeyListener(new KeyAdapter() {
+ // hook key pressed - see PR 14201
+ public void keyPressed(KeyEvent e) {
+ keyReleaseOccured(e);
+ }
+ });
+
+ priorityTable.addSelectionListener(new SelectionAdapter() {
+ public void widgetDefaultSelected(SelectionEvent event) {
+ applyEditorValueAndDeactivate();
+ }
+
+ public void widgetSelected(SelectionEvent event) {
+ selection = priorityTable.getSelectionIndex();
+ }
+ });
+
+ priorityTable.addTraverseListener(new TraverseListener() {
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_ESCAPE
+ || e.detail == SWT.TRAVERSE_RETURN) {
+ e.doit = false;
+ }
+ }
+ });
+
+ priorityTable.addFocusListener(new FocusAdapter() {
+ public void focusLost(FocusEvent e) {
+ ImageTableCellEditor.this.focusLost();
+ }
+ });
+ return priorityTable;
+ }
+
+
+ protected Object doGetValue() {
+ return new Integer(selection);
+ }
+
+ /* (non-Javadoc)
+ * Method declared on CellEditor.
+ */
+ protected void doSetFocus() {
+ priorityTable.setFocus();
+ }
+
+ public LayoutData getLayoutData() {
+ LayoutData layoutData = super.getLayoutData();
+ layoutData.minimumWidth = 38;
+ return layoutData;
+ }
+
+ protected void doSetValue(Object value) {
+ Assert.isTrue(priorityTable != null && (value instanceof Integer));
+ selection = ((Integer) value).intValue();
+ priorityTable.select(selection);
+ }
+
+ /**
+ * Updates the list of choices
+ */
+ private void populateTableItems() {
+ if (priorityTable != null) {
+ priorityTable.removeAll();
+ for (int i = 0; i < items.length; i++) {
+ TableItem item = new TableItem(priorityTable, SWT.NONE);
+ item.setImage(items[i]);
+ }
+ setValueValid(true);
+ selection = 0;
+ }
+ }
+
+ /**
+ * Applies the currently selected value and deactiavates the cell editor
+ */
+ void applyEditorValueAndDeactivate() {
+ // must set the selection before getting value
+ selection = priorityTable.getSelectionIndex();
+ Object newValue = doGetValue();
+ markDirty();
+ boolean isValid = isCorrect(newValue);
+ setValueValid(isValid);
+
+ if (!isValid) {
+ // Only format if the 'index' is valid
+ if (priorityTable.getItemCount() > 0 && selection >= 0 && selection < priorityTable.getItemCount()) {
+ // try to insert the current value into the error message.
+ setErrorMessage(MessageFormat.format(getErrorMessage(),
+ new Object[] { priorityTable.getItem(selection) }));
+ }
+ else {
+ // Since we don't have a valid index, pick a default
+ setErrorMessage(MessageFormat.format(getErrorMessage(),
+ new Object[] { priorityTable.getItem(0) }));
+ }
+ }
+
+ fireApplyEditorValue();
+ deactivate();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#focusLost()
+ */
+ protected void focusLost() {
+ if (isActivated()) {
+ applyEditorValueAndDeactivate();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
+ */
+ protected void keyReleaseOccured(KeyEvent keyEvent) {
+ if (keyEvent.character == '\u001b') { // Escape character
+ fireCancelEditor();
+ } else if (keyEvent.character == '\t') { // tab key
+ applyEditorValueAndDeactivate();
+ }
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/MylarFontDecoratingJavaLabelProvider.java b/org.eclipse.mylyn/developer/src-old/views/MylarFontDecoratingJavaLabelProvider.java
new file mode 100644
index 0000000..4d57012
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/MylarFontDecoratingJavaLabelProvider.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Aug 6, 2004
+ */
+package org.eclipse.mylyn.java.ui;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider;
+import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider;
+import org.eclipse.jface.viewers.IFontProvider;
+import org.eclipse.swt.graphics.Font;
+
+
+
+/**
+ * @author Mik Kersten
+ */
+public class MylarFontDecoratingJavaLabelProvider extends DecoratingJavaLabelProvider implements IFontProvider {
+
+ public MylarFontDecoratingJavaLabelProvider(JavaUILabelProvider labelProvider, boolean errorTick) {
+ super(labelProvider, errorTick);
+ }
+
+ public String getText(Object element) {
+ if (element instanceof IJavaElement) {
+ return ((IJavaElement)element).getElementName();
+ }
+ return super.getText(element);
+ }
+
+ public Font getFont(Object element) {
+ if (element instanceof IJavaElement) {
+ return JavaUiUtil.getFontForElement((IJavaElement)element);
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/MylarJavaOutlinePage.java b/org.eclipse.mylyn/developer/src-old/views/MylarJavaOutlinePage.java
new file mode 100644
index 0000000..8985699
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/MylarJavaOutlinePage.java
@@ -0,0 +1,1433 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Aug 6, 2004
+ */
+package org.eclipse.mylyn.java.ui.editor;
+
+import java.util.*;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jdt.core.*;
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
+import org.eclipse.jdt.internal.ui.*;
+import org.eclipse.jdt.internal.ui.actions.AbstractToggleLinkingAction;
+import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
+import org.eclipse.jdt.internal.ui.dnd.DelegatingDropAdapter;
+import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
+import org.eclipse.jdt.internal.ui.javaeditor.*;
+import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDragAdapter;
+import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter;
+import org.eclipse.jdt.internal.ui.preferences.MembersOrderPreferenceCache;
+import org.eclipse.jdt.internal.ui.viewsupport.*;
+import org.eclipse.jdt.ui.*;
+import org.eclipse.jdt.ui.ProblemsLabelDecorator.ProblemsLabelChangedEvent;
+import org.eclipse.jdt.ui.actions.*;
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.Assert;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.util.*;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionContext;
+import org.eclipse.ui.actions.ActionGroup;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.eclipse.ui.model.WorkbenchAdapter;
+import org.eclipse.ui.part.*;
+import org.eclipse.ui.texteditor.*;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
+
+import org.eclipse.mylyn.core.ITaskscapeListener;
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.core.model.ITaskscapeNode;
+import org.eclipse.mylyn.java.ui.MylarAppearanceAwareLabelProvider;
+import org.eclipse.mylyn.tasklist.MylarImages;
+import org.eclipse.mylyn.tasklist.TaskListPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class MylarJavaOutlinePage extends JavaOutlinePage implements IContentOutlinePage, IAdaptable , IPostSelectionProvider {
+
+ protected ITaskscapeListener modelListener;
+ protected JavaEditor fEditor;
+ protected MylarAppearanceAwareLabelProvider mylarLabelProvider;
+
+ private final ITaskscapeListener MODEL_LISTENER = new ITaskscapeListener() {
+ public void interestChanged(ITaskscapeNode info) {
+ refresh();
+ }
+
+ public void modelUpdated() {
+ refresh();
+ }
+
+ public void presentationSettingsChanged(ITaskscapeListener.PresentationChangeKind kind) {
+ refresh();
+ }
+
+ public void nodeDeleted(ITaskscapeNode node) {
+ refresh();
+ }
+
+ private void refresh() {
+ if (fOutlineViewer != null) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ if (fOutlineViewer != null && !fOutlineViewer.getTree().isDisposed()) {
+ fOutlineViewer.refresh();
+ fOutlineViewer.expandAll();
+ }
+ } catch (Throwable t) {
+ ContextCorePlugin.fail(t, "Could not update viewer", false);
+ }
+ }
+ });
+ }
+ }
+
+ public void landmarkAdded(ITaskscapeNode element) {
+ refresh();
+ }
+
+ public void landmarkRemoved(ITaskscapeNode element) {
+ refresh();
+ }
+
+ public void relationshipsChanged() {
+ }
+
+ public void presentationSettingsChanging(ITaskscapeListener.PresentationChangeKind kind) {
+ refresh();
+ }
+ };
+
+ private FilterUniterestingAction filterUniterestingAction;
+
+ public void extendControl(IActionBars actionBars) {
+ ContextCorePlugin.getTaskscapeManager().addListener(MODEL_LISTENER);
+
+ mylarLabelProvider = new MylarAppearanceAwareLabelProvider(
+ AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.F_APP_TYPE_SIGNATURE,
+ AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS,
+ (ITreeContentProvider)fOutlineViewer.getContentProvider());
+
+ fOutlineViewer.getTree().setBackground(TaskListPlugin.getDefault().getColorMap().BACKGROUND_COLOR);
+ fOutlineViewer.setLabelProvider(mylarLabelProvider);
+// fOutlineViewer.setLabelProvider(new MylarFontDecoratingJavaLabelProvider(mylarLabelProvider, true));
+
+ IToolBarManager toolBarManager = actionBars.getToolBarManager();
+ filterUniterestingAction = new FilterUniterestingAction();
+ if (toolBarManager != null) {
+ toolBarManager.add(new Separator("StartMylar")); //$NON-NLS-1$
+ toolBarManager.add(filterUniterestingAction);
+ }
+ if (filterUniterestingAction.isChecked() && mylarLabelProvider != null)
+ mylarLabelProvider.setInterestFilterEnabled(true);
+ }
+
+ class FilterUniterestingAction extends Action {
+
+ public FilterUniterestingAction() {
+ super();
+ setText("Filter Uninteresting"); //$NON-NLS-1$
+ setImageDescriptor(MylarImages.AUTO_EXPAND);
+ setToolTipText("Filter uninteresting elements"); //$NON-NLS-1$
+
+ boolean checked= ContextCore.getPreferenceStore().getBoolean("org.eclipse.mylyn.ui.outline.filter.isChecked"); //$NON-NLS-1$
+ valueChanged(checked, false);
+ }
+
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ setChecked(on);
+ if (mylarLabelProvider != null) mylarLabelProvider.setInterestFilterEnabled(on);
+
+ if (on) {
+ fOutlineViewer.addFilter(MYLAR_OUTLINE_FILTER);
+ } else {
+ fOutlineViewer.removeFilter(MYLAR_OUTLINE_FILTER);
+ }
+
+ if (store)
+ ContextCore.getPreferenceStore().setValue("org.eclipse.mylyn.ui.outline.filter.isChecked", on); //$NON-NLS-1$
+ }
+ }
+
+ // TODO: extract and reuse
+ static final ViewerFilter MYLAR_OUTLINE_FILTER = new ViewerFilter() {
+ public boolean select(Viewer viewer, Object parentElement, Object object) {
+ if (object instanceof IJavaElement) {
+ IJavaElement element = (IJavaElement)object;
+
+ ITaskscapeNode info = ContextCorePlugin.getTaskscapeManager().getDoi(element.getHandleIdentifier());
+ return info != null && info.getDegreeOfInterest().getDegreeOfInterest().isInteresting();
+ } else {
+ return false;
+ }
+ }
+ };
+
+ // ---------------------------------------------------------------------
+ // BELOW IS COPIED FROM JDT DUE TO LACK OF EXTENSIBILITY, AVOID CHANGING
+// public class JavaOutlinePage extends Page implements IContentOutlinePage, IAdaptable , IPostSelectionProvider {
+
+
+ static Object[] NO_CHILDREN= new Object[0];
+
+ /**
+ * The element change listener of the java outline viewer.
+ * @see IElementChangedListener
+ */
+ class ElementChangedListener implements IElementChangedListener {
+
+ public void elementChanged(final ElementChangedEvent e) {
+
+ if (getControl() == null)
+ return;
+
+ Display d= getControl().getDisplay();
+ if (d != null) {
+ d.asyncExec(new Runnable() {
+ public void run() {
+ ICompilationUnit cu= (ICompilationUnit) fInput;
+ IJavaElement base= cu;
+ if (fTopLevelTypeOnly) {
+ base= getMainType(cu);
+ if (base == null) {
+ if (fOutlineViewer != null)
+ fOutlineViewer.refresh(true);
+ return;
+ }
+ }
+ IJavaElementDelta delta= findElement(base, e.getDelta());
+ if (delta != null && fOutlineViewer != null) {
+ fOutlineViewer.reconcile(delta);
+ }
+ }
+ });
+ }
+ }
+
+ private boolean isPossibleStructuralChange(IJavaElementDelta cuDelta) {
+ if (cuDelta.getKind() != IJavaElementDelta.CHANGED) {
+ return true; // add or remove
+ }
+ int flags= cuDelta.getFlags();
+ if ((flags & IJavaElementDelta.F_CHILDREN) != 0) {
+ return true;
+ }
+ return (flags & (IJavaElementDelta.F_CONTENT | IJavaElementDelta.F_FINE_GRAINED)) == IJavaElementDelta.F_CONTENT;
+ }
+
+ protected IJavaElementDelta findElement(IJavaElement unit, IJavaElementDelta delta) {
+
+ if (delta == null || unit == null)
+ return null;
+
+ IJavaElement element= delta.getElement();
+
+ if (unit.equals(element)) {
+ if (isPossibleStructuralChange(delta)) {
+ return delta;
+ }
+ return null;
+ }
+
+
+ if (element.getElementType() > IJavaElement.CLASS_FILE)
+ return null;
+
+ IJavaElementDelta[] children= delta.getAffectedChildren();
+ if (children == null || children.length == 0)
+ return null;
+
+ for (int i= 0; i < children.length; i++) {
+ IJavaElementDelta d= findElement(unit, children[i]);
+ if (d != null)
+ return d;
+ }
+
+ return null;
+ }
+ }
+
+ static class NoClassElement extends WorkbenchAdapter implements IAdaptable {
+ /*
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ return JavaEditorMessages.getString("JavaOutlinePage.error.NoTopLevelType"); //$NON-NLS-1$
+ }
+
+ /*
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
+ */
+ public Object getAdapter(Class clas) {
+ if (clas == IWorkbenchAdapter.class)
+ return this;
+ return null;
+ }
+ }
+
+ /**
+ * Content provider for the children of an ICompilationUnit or
+ * an IClassFile
+ * @see ITreeContentProvider
+ */
+ class ChildrenProvider implements ITreeContentProvider {
+
+ private Object[] NO_CLASS= new Object[] {new NoClassElement()};
+ private ElementChangedListener fListener;
+
+ protected boolean matches(IJavaElement element) {
+ if (element.getElementType() == IJavaElement.METHOD) {
+ String name= element.getElementName();
+ return (name != null && name.indexOf('<') >= 0);
+ }
+ return false;
+ }
+
+ protected IJavaElement[] filter(IJavaElement[] children) {
+ boolean initializers= false;
+ for (int i= 0; i < children.length; i++) {
+ if (matches(children[i])) {
+ initializers= true;
+ break;
+ }
+ }
+
+ if (!initializers)
+ return children;
+
+ Vector v= new Vector();
+ for (int i= 0; i < children.length; i++) {
+ if (matches(children[i]))
+ continue;
+ v.addElement(children[i]);
+ }
+
+ IJavaElement[] result= new IJavaElement[v.size()];
+ v.copyInto(result);
+ return result;
+ }
+
+ public Object[] getChildren(Object parent) {
+ if (parent instanceof IParent) {
+ IParent c= (IParent) parent;
+ try {
+ return filter(c.getChildren());
+ } catch (JavaModelException x) {
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=38341
+ // don't log NotExist exceptions as this is a valid case
+ // since we might have been posted and the element
+ // removed in the meantime.
+ if (JavaPlugin.isDebug() || !x.isDoesNotExist())
+ JavaPlugin.log(x);
+ }
+ }
+ return NO_CHILDREN;
+ }
+
+ public Object[] getElements(Object parent) {
+ if (fTopLevelTypeOnly) {
+ if (parent instanceof ICompilationUnit) {
+ try {
+ IType type= getMainType((ICompilationUnit) parent);
+ return type != null ? type.getChildren() : NO_CLASS;
+ } catch (JavaModelException e) {
+ JavaPlugin.log(e);
+ }
+ } else if (parent instanceof IClassFile) {
+ try {
+ IType type= getMainType((IClassFile) parent);
+ return type != null ? type.getChildren() : NO_CLASS;
+ } catch (JavaModelException e) {
+ JavaPlugin.log(e);
+ }
+ }
+ }
+ return getChildren(parent);
+ }
+
+ public Object getParent(Object child) {
+ if (child instanceof IJavaElement) {
+ IJavaElement e= (IJavaElement) child;
+ return e.getParent();
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object parent) {
+ if (parent instanceof IParent) {
+ IParent c= (IParent) parent;
+ try {
+ IJavaElement[] children= filter(c.getChildren());
+ return (children != null && children.length > 0);
+ } catch (JavaModelException x) {
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=38341
+ // don't log NotExist exceptions as this is a valid case
+ // since we might have been posted and the element
+ // removed in the meantime.
+ if (JavaPlugin.isDebug() || !x.isDoesNotExist())
+ JavaPlugin.log(x);
+ }
+ }
+ return false;
+ }
+
+ public boolean isDeleted(Object o) {
+ return false;
+ }
+
+ public void dispose() {
+ if (fListener != null) {
+ JavaCore.removeElementChangedListener(fListener);
+ fListener= null;
+ }
+ }
+
+ /*
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ boolean isCU= (newInput instanceof ICompilationUnit);
+
+ if (isCU && fListener == null) {
+ fListener= new ElementChangedListener();
+ JavaCore.addElementChangedListener(fListener);
+ } else if (!isCU && fListener != null) {
+ JavaCore.removeElementChangedListener(fListener);
+ fListener= null;
+ }
+ }
+ }
+
+
+ class JavaOutlineViewer extends TreeViewer {
+
+ /**
+ * Indicates an item which has been reused. At the point of
+ * its reuse it has been expanded. This field is used to
+ * communicate between <code>internalExpandToLevel</code> and
+ * <code>reuseTreeItem</code>.
+ */
+ private Item fReusedExpandedItem;
+ private boolean fReorderedMembers;
+ private boolean fForceFireSelectionChanged;
+
+ public JavaOutlineViewer(Tree tree) {
+ super(tree);
+ setAutoExpandLevel(ALL_LEVELS);
+ setUseHashlookup(true);
+ }
+
+ /**
+ * Investigates the given element change event and if affected
+ * incrementally updates the Java outline.
+ *
+ * @param delta the Java element delta used to reconcile the Java outline
+ */
+ public void reconcile(IJavaElementDelta delta) {
+ fReorderedMembers= false;
+ fForceFireSelectionChanged= false;
+ if (getSorter() == null) {
+ if (fTopLevelTypeOnly
+ && delta.getElement() instanceof IType
+ && (delta.getKind() & IJavaElementDelta.ADDED) != 0)
+ {
+ refresh(true);
+
+ } else {
+ Widget w= findItem(fInput);
+ if (w != null && !w.isDisposed())
+ update(w, delta);
+ if (fForceFireSelectionChanged)
+ fireSelectionChanged(new SelectionChangedEvent(getSite().getSelectionProvider(), this.getSelection()));
+ if (fReorderedMembers) {
+ refresh(false);
+ fReorderedMembers= false;
+ }
+ }
+ } else {
+ // just for now
+ refresh(true);
+ }
+ }
+
+ /*
+ * @see TreeViewer#internalExpandToLevel
+ */
+ protected void internalExpandToLevel(Widget node, int level) {
+ if (node instanceof Item) {
+ Item i= (Item) node;
+ if (i.getData() instanceof IJavaElement) {
+ IJavaElement je= (IJavaElement) i.getData();
+ if (je.getElementType() == IJavaElement.IMPORT_CONTAINER || isInnerType(je)) {
+ if (i != fReusedExpandedItem) {
+ setExpanded(i, false);
+ return;
+ }
+ }
+ }
+ }
+ super.internalExpandToLevel(node, level);
+ }
+
+ protected void reuseTreeItem(Item item, Object element) {
+
+ // remove children
+ Item[] c= getChildren(item);
+ if (c != null && c.length > 0) {
+
+ if (getExpanded(item))
+ fReusedExpandedItem= item;
+
+ for (int k= 0; k < c.length; k++) {
+ if (c[k].getData() != null)
+ disassociate(c[k]);
+ c[k].dispose();
+ }
+ }
+
+ updateItem(item, element);
+ updatePlus(item, element);
+ internalExpandToLevel(item, ALL_LEVELS);
+
+ fReusedExpandedItem= null;
+ fForceFireSelectionChanged= true;
+ }
+
+ protected boolean mustUpdateParent(IJavaElementDelta delta, IJavaElement element) {
+ if (element instanceof IMethod) {
+ if ((delta.getKind() & IJavaElementDelta.ADDED) != 0) {
+ try {
+ return ((IMethod)element).isMainMethod();
+ } catch (JavaModelException e) {
+ JavaPlugin.log(e.getStatus());
+ }
+ }
+ return "main".equals(element.getElementName()); //$NON-NLS-1$
+ }
+ return false;
+ }
+
+ /*
+ * @see org.eclipse.jface.viewers.AbstractTreeViewer#isExpandable(java.lang.Object)
+ */
+ public boolean isExpandable(Object element) {
+ if (hasFilters()) {
+ return getFilteredChildren(element).length > 0;
+ }
+ return super.isExpandable(element);
+ }
+
+ protected ISourceRange getSourceRange(IJavaElement element) throws JavaModelException {
+ if (element instanceof ISourceReference)
+ return ((ISourceReference) element).getSourceRange();
+ if (element instanceof IMember && !(element instanceof IInitializer))
+ return ((IMember) element).getNameRange();
+ return null;
+ }
+
+ protected boolean overlaps(ISourceRange range, int start, int end) {
+ return start <= (range.getOffset() + range.getLength() - 1) && range.getOffset() <= end;
+ }
+
+ protected boolean filtered(IJavaElement parent, IJavaElement child) {
+
+ Object[] result= new Object[] { child };
+ ViewerFilter[] filters= getFilters();
+ for (int i= 0; i < filters.length; i++) {
+ result= filters[i].filter(this, parent, result);
+ if (result.length == 0)
+ return true;
+ }
+
+ return false;
+ }
+
+ protected void update(Widget w, IJavaElementDelta delta) {
+
+ Item item;
+
+ IJavaElement parent= delta.getElement();
+ IJavaElementDelta[] affected= delta.getAffectedChildren();
+ Item[] children= getChildren(w);
+
+ boolean doUpdateParent= false;
+ boolean doUpdateParentsPlus= false;
+
+ Vector deletions= new Vector();
+ Vector additions= new Vector();
+
+ for (int i= 0; i < affected.length; i++) {
+ IJavaElementDelta affectedDelta= affected[i];
+ IJavaElement affectedElement= affectedDelta.getElement();
+ int status= affected[i].getKind();
+
+ // find tree item with affected element
+ int j;
+ for (j= 0; j < children.length; j++)
+ if (affectedElement.equals(children[j].getData()))
+ break;
+
+ if (j == children.length) {
+ // remove from collapsed parent
+ if ((status & IJavaElementDelta.REMOVED) != 0) {
+ doUpdateParentsPlus= true;
+ continue;
+ }
+ // addition
+ if ((status & IJavaElementDelta.CHANGED) != 0 &&
+ (affectedDelta.getFlags() & IJavaElementDelta.F_MODIFIERS) != 0 &&
+ !filtered(parent, affectedElement))
+ {
+ additions.addElement(affectedDelta);
+ }
+ continue;
+ }
+
+ item= children[j];
+
+ // removed
+ if ((status & IJavaElementDelta.REMOVED) != 0) {
+ deletions.addElement(item);
+ doUpdateParent= doUpdateParent || mustUpdateParent(affectedDelta, affectedElement);
+
+ // changed
+ } else if ((status & IJavaElementDelta.CHANGED) != 0) {
+ int change= affectedDelta.getFlags();
+ doUpdateParent= doUpdateParent || mustUpdateParent(affectedDelta, affectedElement);
+
+ if ((change & IJavaElementDelta.F_MODIFIERS) != 0) {
+ if (filtered(parent, affectedElement))
+ deletions.addElement(item);
+ else
+ updateItem(item, affectedElement);
+ }
+
+ if ((change & IJavaElementDelta.F_CONTENT) != 0)
+ updateItem(item, affectedElement);
+
+ if ((change & IJavaElementDelta.F_CHILDREN) != 0)
+ update(item, affectedDelta);
+
+ if ((change & IJavaElementDelta.F_REORDER) != 0)
+ fReorderedMembers= true;
+ }
+ }
+
+ // find all elements to add
+ IJavaElementDelta[] add= delta.getAddedChildren();
+ if (additions.size() > 0) {
+ IJavaElementDelta[] tmp= new IJavaElementDelta[add.length + additions.size()];
+ System.arraycopy(add, 0, tmp, 0, add.length);
+ for (int i= 0; i < additions.size(); i++)
+ tmp[i + add.length]= (IJavaElementDelta) additions.elementAt(i);
+ add= tmp;
+ }
+
+ // add at the right position
+ go2: for (int i= 0; i < add.length; i++) {
+
+ try {
+
+ IJavaElement e= add[i].getElement();
+ if (filtered(parent, e))
+ continue go2;
+
+ doUpdateParent= doUpdateParent || mustUpdateParent(add[i], e);
+ ISourceRange rng= getSourceRange(e);
+ int start= rng.getOffset();
+ int end= start + rng.getLength() - 1;
+ int nameOffset= Integer.MAX_VALUE;
+ if (e instanceof IField) {
+ ISourceRange nameRange= ((IField) e).getNameRange();
+ if (nameRange != null)
+ nameOffset= nameRange.getOffset();
+ }
+
+ Item last= null;
+ item= null;
+ children= getChildren(w);
+
+ for (int j= 0; j < children.length; j++) {
+ item= children[j];
+ IJavaElement r= (IJavaElement) item.getData();
+
+ if (r == null) {
+ // parent node collapsed and not be opened before -> do nothing
+ continue go2;
+ }
+
+
+ try {
+ rng= getSourceRange(r);
+
+ // multi-field declarations always start at
+ // the same offset. They also have the same
+ // end offset if the field sequence is terminated
+ // with a semicolon. If not, the source range
+ // ends behind the identifier / initializer
+ // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=51851
+ boolean multiFieldDeclaration=
+ r.getElementType() == IJavaElement.FIELD
+ && e.getElementType() == IJavaElement.FIELD
+ && rng.getOffset() == start;
+
+ // elements are inserted by occurrence
+ // however, multi-field declarations have
+ // equal source ranges offsets, therefore we
+ // compare name-range offsets.
+ boolean multiFieldOrderBefore= false;
+ if (multiFieldDeclaration) {
+ if (r instanceof IField) {
+ ISourceRange nameRange= ((IField) r).getNameRange();
+ if (nameRange != null) {
+ if (nameRange.getOffset() > nameOffset)
+ multiFieldOrderBefore= true;
+ }
+ }
+ }
+
+ if (!multiFieldDeclaration && overlaps(rng, start, end)) {
+
+ // be tolerant if the delta is not correct, or if
+ // the tree has been updated other than by a delta
+ reuseTreeItem(item, e);
+ continue go2;
+
+ } else if (multiFieldOrderBefore || rng.getOffset() > start) {
+
+ if (last != null && deletions.contains(last)) {
+ // reuse item
+ deletions.removeElement(last);
+ reuseTreeItem(last, e);
+ } else {
+ // nothing to reuse
+ createTreeItem(w, e, j);
+ }
+ continue go2;
+ }
+
+ } catch (JavaModelException x) {
+ // stumbled over deleted element
+ }
+
+ last= item;
+ }
+
+ // add at the end of the list
+ if (last != null && deletions.contains(last)) {
+ // reuse item
+ deletions.removeElement(last);
+ reuseTreeItem(last, e);
+ } else {
+ // nothing to reuse
+ createTreeItem(w, e, -1);
+ }
+
+ } catch (JavaModelException x) {
+ // the element to be added is not present -> don't add it
+ }
+ }
+
+
+ // remove items which haven't been reused
+ Enumeration e= deletions.elements();
+ while (e.hasMoreElements()) {
+ item= (Item) e.nextElement();
+ disassociate(item);
+ item.dispose();
+ }
+
+ if (doUpdateParent)
+ updateItem(w, delta.getElement());
+ if (!doUpdateParent && doUpdateParentsPlus && w instanceof Item)
+ updatePlus((Item)w, delta.getElement());
+ }
+
+
+
+ /*
+ * @see ContentViewer#handleLabelProviderChanged(LabelProviderChangedEvent)
+ */
+ protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
+ Object input= getInput();
+ if (event instanceof ProblemsLabelChangedEvent) {
+ ProblemsLabelChangedEvent e= (ProblemsLabelChangedEvent) event;
+ if (e.isMarkerChange() && input instanceof ICompilationUnit) {
+ return; // marker changes can be ignored
+ }
+ }
+ // look if the underlying resource changed
+ Object[] changed= event.getElements();
+ if (changed != null) {
+ IResource resource= getUnderlyingResource();
+ if (resource != null) {
+ for (int i= 0; i < changed.length; i++) {
+ if (changed[i] != null && changed[i].equals(resource)) {
+ // change event to a full refresh
+ event= new LabelProviderChangedEvent((IBaseLabelProvider) event.getSource());
+ break;
+ }
+ }
+ }
+ }
+ super.handleLabelProviderChanged(event);
+ }
+
+ private IResource getUnderlyingResource() {
+ Object input= getInput();
+ if (input instanceof ICompilationUnit) {
+ ICompilationUnit cu= (ICompilationUnit) input;
+ cu= JavaModelUtil.toOriginal(cu);
+ return cu.getResource();
+ } else if (input instanceof IClassFile) {
+ return ((IClassFile) input).getResource();
+ }
+ return null;
+ }
+
+
+ }
+
+ class LexicalSortingAction extends Action {
+
+ private JavaElementSorter fSorter= new JavaElementSorter();
+
+ public LexicalSortingAction() {
+ super();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.LEXICAL_SORTING_OUTLINE_ACTION);
+ setText(JavaEditorMessages.getString("JavaOutlinePage.Sort.label")); //$NON-NLS-1$
+ JavaPluginImages.setLocalImageDescriptors(this, "alphab_sort_co.gif"); //$NON-NLS-1$
+ setToolTipText(JavaEditorMessages.getString("JavaOutlinePage.Sort.tooltip")); //$NON-NLS-1$
+ setDescription(JavaEditorMessages.getString("JavaOutlinePage.Sort.description")); //$NON-NLS-1$
+
+ boolean checked= JavaPlugin.getDefault().getPreferenceStore().getBoolean("LexicalSortingAction.isChecked"); //$NON-NLS-1$
+ valueChanged(checked, false);
+ }
+
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ setChecked(on);
+ BusyIndicator.showWhile(fOutlineViewer.getControl().getDisplay(), new Runnable() {
+ public void run() {
+ fOutlineViewer.setSorter(on ? fSorter : null); }
+ });
+
+ if (store)
+ JavaPlugin.getDefault().getPreferenceStore().setValue("LexicalSortingAction.isChecked", on); //$NON-NLS-1$
+ }
+ }
+
+ class ClassOnlyAction extends Action {
+
+ public ClassOnlyAction() {
+ super();
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IJavaHelpContextIds.GO_INTO_TOP_LEVEL_TYPE_ACTION);
+ setText(JavaEditorMessages.getString("JavaOutlinePage.GoIntoTopLevelType.label")); //$NON-NLS-1$
+ setToolTipText(JavaEditorMessages.getString("JavaOutlinePage.GoIntoTopLevelType.tooltip")); //$NON-NLS-1$
+ setDescription(JavaEditorMessages.getString("JavaOutlinePage.GoIntoTopLevelType.description")); //$NON-NLS-1$
+ JavaPluginImages.setLocalImageDescriptors(this, "gointo_toplevel_type.gif"); //$NON-NLS-1$
+
+ IPreferenceStore preferenceStore= JavaPlugin.getDefault().getPreferenceStore();
+ boolean showclass= preferenceStore.getBoolean("GoIntoTopLevelTypeAction.isChecked"); //$NON-NLS-1$
+ setTopLevelTypeOnly(showclass);
+ }
+
+ /*
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ public void run() {
+ setTopLevelTypeOnly(!fTopLevelTypeOnly);
+ }
+
+ private void setTopLevelTypeOnly(boolean show) {
+ fTopLevelTypeOnly= show;
+ setChecked(show);
+ fOutlineViewer.refresh(false);
+
+ IPreferenceStore preferenceStore= JavaPlugin.getDefault().getPreferenceStore();
+ preferenceStore.setValue("GoIntoTopLevelTypeAction.isChecked", show); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * This action toggles whether this Java Outline page links
+ * its selection to the active editor.
+ *
+ * @since 3.0
+ */
+ public class ToggleLinkingAction extends AbstractToggleLinkingAction {
+
+ JavaOutlinePage fJavaOutlinePage;
+
+ /**
+ * Constructs a new action.
+ *
+ * @param outlinePage the Java outline page
+ */
+ public ToggleLinkingAction(JavaOutlinePage outlinePage) {
+ boolean isLinkingEnabled= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE);
+ setChecked(isLinkingEnabled);
+ fJavaOutlinePage= outlinePage;
+ }
+
+ /**
+ * Runs the action.
+ */
+ public void run() {
+ PreferenceConstants.getPreferenceStore().setValue(PreferenceConstants.EDITOR_SYNC_OUTLINE_ON_CURSOR_MOVE, isChecked());
+
+ // MOD: start
+ if (fEditor instanceof MylarClassFileEditor) {
+ if (isChecked() && fEditor != null)
+ ((MylarClassFileEditor)fEditor).synchronizeOutlinePage(((MylarClassFileEditor)fEditor).computeHighlightRangeSourceReference(), false);
+ } else if (fEditor instanceof MylarCompilationUnitEditor) {
+ if (isChecked() && fEditor != null)
+ ((MylarCompilationUnitEditor)fEditor).synchronizeOutlinePage(((MylarCompilationUnitEditor)fEditor).computeHighlightRangeSourceReference(), false);
+ }
+ // MOD: end
+ }
+
+ }
+
+
+ /** A flag to show contents of top level type only */
+ private boolean fTopLevelTypeOnly;
+
+ private IJavaElement fInput;
+ private String fContextMenuID;
+ private Menu fMenu;
+ private JavaOutlineViewer fOutlineViewer;
+// private JavaEditor fEditor;
+
+ private MemberFilterActionGroup fMemberFilterActionGroup;
+
+ private ListenerList fSelectionChangedListeners= new ListenerList();
+ private ListenerList fPostSelectionChangedListeners= new ListenerList();
+ private Hashtable fActions= new Hashtable();
+
+ private TogglePresentationAction fTogglePresentation;
+ private GotoAnnotationAction fPreviousAnnotation;
+ private GotoAnnotationAction fNextAnnotation;
+ private TextEditorAction fShowJavadoc;
+ private IAction fUndo;
+ private IAction fRedo;
+
+ private ToggleLinkingAction fToggleLinkingAction;
+
+ private CompositeActionGroup fActionGroups;
+
+ private IPropertyChangeListener fPropertyChangeListener;
+ /**
+ * Custom filter action group.
+ * @since 3.0
+ */
+ private CustomFiltersActionGroup fCustomFiltersActionGroup;
+
+ public MylarJavaOutlinePage(String contextMenuID, JavaEditor editor) {
+ super(contextMenuID, editor); // TODO: wierd overriding of consturction
+
+ Assert.isNotNull(editor);
+
+ fContextMenuID= contextMenuID;
+ fEditor= editor;
+
+ fTogglePresentation= new TogglePresentationAction();
+ fPreviousAnnotation= new GotoAnnotationAction("PreviousAnnotation.", false); //$NON-NLS-1$
+ fNextAnnotation= new GotoAnnotationAction("NextAnnotation.", true); //$NON-NLS-1$
+ fShowJavadoc= (TextEditorAction) fEditor.getAction("ShowJavaDoc"); //$NON-NLS-1$
+ fUndo= fEditor.getAction(ITextEditorActionConstants.UNDO);
+ fRedo= fEditor.getAction(ITextEditorActionConstants.REDO);
+
+ fTogglePresentation.setEditor(editor);
+ fPreviousAnnotation.setEditor(editor);
+ fNextAnnotation.setEditor(editor);
+
+ fPropertyChangeListener= new IPropertyChangeListener() {
+ public void propertyChange(PropertyChangeEvent event) {
+ doPropertyChange(event);
+ }
+ };
+ JavaPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fPropertyChangeListener);
+ }
+
+ /**
+ * Returns the primary type of a compilation unit (has the same
+ * name as the compilation unit).
+ *
+ * @param compilationUnit the compilation unit
+ * @return returns the primary type of the compilation unit, or
+ * <code>null</code> if is does not have one
+ */
+ protected IType getMainType(ICompilationUnit compilationUnit) {
+
+ if (compilationUnit == null)
+ return null;
+
+ String name= compilationUnit.getElementName();
+ int index= name.indexOf('.');
+ if (index != -1)
+ name= name.substring(0, index);
+ IType type= compilationUnit.getType(name);
+ return type.exists() ? type : null;
+ }
+
+ /**
+ * Returns the primary type of a class file.
+ *
+ * @param classFile the class file
+ * @return returns the primary type of the class file, or <code>null</code>
+ * if is does not have one
+ */
+ protected IType getMainType(IClassFile classFile) {
+ try {
+ IType type= classFile.getType();
+ return type != null && type.exists() ? type : null;
+ } catch (JavaModelException e) {
+ return null;
+ }
+ }
+
+ /* (non-Javadoc)
+ * Method declared on Page
+ */
+ public void init(IPageSite pageSite) {
+ super.init(pageSite);
+ }
+
+ private void doPropertyChange(PropertyChangeEvent event) {
+ if (fOutlineViewer != null) {
+ if (MembersOrderPreferenceCache.isMemberOrderProperty(event.getProperty())) {
+ fOutlineViewer.refresh(false);
+ }
+ }
+ }
+
+ /*
+ * @see ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
+ */
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ if (fOutlineViewer != null)
+ fOutlineViewer.addSelectionChangedListener(listener);
+ else
+ fSelectionChangedListeners.add(listener);
+ }
+
+ /*
+ * @see ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
+ */
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ if (fOutlineViewer != null)
+ fOutlineViewer.removeSelectionChangedListener(listener);
+ else
+ fSelectionChangedListeners.remove(listener);
+ }
+
+ /*
+ * @see ISelectionProvider#setSelection(ISelection)
+ */
+ public void setSelection(ISelection selection) {
+ if (fOutlineViewer != null)
+ fOutlineViewer.setSelection(selection);
+ }
+
+ /*
+ * @see ISelectionProvider#getSelection()
+ */
+ public ISelection getSelection() {
+ if (fOutlineViewer == null)
+ return StructuredSelection.EMPTY;
+ return fOutlineViewer.getSelection();
+ }
+
+ /*
+ * @see org.eclipse.jface.text.IPostSelectionProvider#addPostSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+ */
+ public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
+ if (fOutlineViewer != null)
+ fOutlineViewer.addPostSelectionChangedListener(listener);
+ else
+ fPostSelectionChangedListeners.add(listener);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.IPostSelectionProvider#removePostSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+ */
+ public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
+ if (fOutlineViewer != null)
+ fOutlineViewer.removePostSelectionChangedListener(listener);
+ else
+ fPostSelectionChangedListeners.remove(listener);
+ }
+
+ private void registerToolbarActions(IActionBars actionBars) {
+
+ IToolBarManager toolBarManager= actionBars.getToolBarManager();
+ if (toolBarManager != null) {
+ toolBarManager.add(new LexicalSortingAction());
+
+ fMemberFilterActionGroup= new MemberFilterActionGroup(fOutlineViewer, "org.eclipse.jdt.ui.JavaOutlinePage"); //$NON-NLS-1$
+ fMemberFilterActionGroup.contributeToToolBar(toolBarManager);
+
+ fCustomFiltersActionGroup.fillActionBars(actionBars);
+
+ IMenuManager menu= actionBars.getMenuManager();
+ menu.add(new Separator("EndFilterGroup")); //$NON-NLS-1$
+
+ fToggleLinkingAction= new ToggleLinkingAction(this);
+ menu.add(new ClassOnlyAction());
+ menu.add(fToggleLinkingAction);
+ }
+ }
+
+ /*
+ * @see IPage#createControl
+ */
+ public void createControl(Composite parent) {
+
+ Tree tree= new Tree(parent, SWT.MULTI);
+
+ AppearanceAwareLabelProvider lprovider= new AppearanceAwareLabelProvider(
+ AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.F_APP_TYPE_SIGNATURE,
+ AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS
+ );
+
+ fOutlineViewer= new JavaOutlineViewer(tree);
+ initDragAndDrop();
+ fOutlineViewer.setContentProvider(new ChildrenProvider());
+ fOutlineViewer.setLabelProvider(new DecoratingJavaLabelProvider(lprovider));
+
+ Object[] listeners= fSelectionChangedListeners.getListeners();
+ for (int i= 0; i < listeners.length; i++) {
+ fSelectionChangedListeners.remove(listeners[i]);
+ fOutlineViewer.addSelectionChangedListener((ISelectionChangedListener) listeners[i]);
+ }
+
+ listeners= fPostSelectionChangedListeners.getListeners();
+ for (int i= 0; i < listeners.length; i++) {
+ fPostSelectionChangedListeners.remove(listeners[i]);
+ fOutlineViewer.addPostSelectionChangedListener((ISelectionChangedListener) listeners[i]);
+ }
+
+ MenuManager manager= new MenuManager(fContextMenuID, fContextMenuID);
+ manager.setRemoveAllWhenShown(true);
+ manager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager m) {
+ contextMenuAboutToShow(m);
+ }
+ });
+ fMenu= manager.createContextMenu(tree);
+ tree.setMenu(fMenu);
+
+ IPageSite site= getSite();
+ site.registerContextMenu(JavaPlugin.getPluginId() + ".outline", manager, fOutlineViewer); //$NON-NLS-1$
+ site.setSelectionProvider(fOutlineViewer);
+
+ // we must create the groups after we have set the selection provider to the site
+ fActionGroups= new CompositeActionGroup(new ActionGroup[] {
+ new OpenViewActionGroup(this),
+ new CCPActionGroup(this),
+ new GenerateActionGroup(this),
+ new RefactorActionGroup(this),
+ new JavaSearchActionGroup(this)});
+
+ // register global actions
+ IActionBars bars= site.getActionBars();
+
+ bars.setGlobalActionHandler(ITextEditorActionConstants.UNDO, fUndo);
+ bars.setGlobalActionHandler(ITextEditorActionConstants.REDO, fRedo);
+ bars.setGlobalActionHandler(ITextEditorActionConstants.PREVIOUS, fPreviousAnnotation);
+ bars.setGlobalActionHandler(ITextEditorActionConstants.NEXT, fNextAnnotation);
+ bars.setGlobalActionHandler(JdtActionConstants.SHOW_JAVA_DOC, fShowJavadoc);
+ bars.setGlobalActionHandler(ITextEditorActionDefinitionIds.TOGGLE_SHOW_SELECTED_ELEMENT_ONLY, fTogglePresentation);
+ bars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_NEXT_ANNOTATION, fNextAnnotation);
+ bars.setGlobalActionHandler(ITextEditorActionDefinitionIds.GOTO_PREVIOUS_ANNOTATION, fPreviousAnnotation);
+
+
+ fActionGroups.fillActionBars(bars);
+
+ IStatusLineManager statusLineManager= bars.getStatusLineManager();
+ if (statusLineManager != null) {
+ StatusBarUpdater updater= new StatusBarUpdater(statusLineManager);
+ fOutlineViewer.addPostSelectionChangedListener(updater);
+ }
+ // Custom filter group
+ fCustomFiltersActionGroup= new CustomFiltersActionGroup("org.eclipse.jdt.ui.JavaOutlinePage", fOutlineViewer); //$NON-NLS-1$
+
+ registerToolbarActions(bars);
+
+ fOutlineViewer.setInput(fInput);
+ }
+
+ public void dispose() {
+
+ if (fEditor == null)
+ return;
+
+ if (fMemberFilterActionGroup != null) {
+ fMemberFilterActionGroup.dispose();
+ fMemberFilterActionGroup= null;
+ }
+
+ if (fCustomFiltersActionGroup != null) {
+ fCustomFiltersActionGroup.dispose();
+ fCustomFiltersActionGroup= null;
+ }
+
+
+ fEditor.outlinePageClosed();
+ fEditor= null;
+
+ fSelectionChangedListeners.clear();
+ fSelectionChangedListeners= null;
+
+ fPostSelectionChangedListeners.clear();
+ fPostSelectionChangedListeners= null;
+
+ if (fPropertyChangeListener != null) {
+ JavaPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyChangeListener);
+ fPropertyChangeListener= null;
+ }
+
+ if (fMenu != null && !fMenu.isDisposed()) {
+ fMenu.dispose();
+ fMenu= null;
+ }
+
+ if (fActionGroups != null)
+ fActionGroups.dispose();
+
+ fTogglePresentation.setEditor(null);
+ fPreviousAnnotation.setEditor(null);
+ fNextAnnotation.setEditor(null);
+
+ fOutlineViewer= null;
+
+ super.dispose();
+ }
+
+ public Control getControl() {
+ if (fOutlineViewer != null)
+ return fOutlineViewer.getControl();
+ return null;
+ }
+
+ public void setInput(IJavaElement inputElement) {
+ fInput= inputElement;
+ if (fOutlineViewer != null)
+ fOutlineViewer.setInput(fInput);
+ }
+
+ public void select(ISourceReference reference) {
+ if (fOutlineViewer != null) {
+
+ ISelection s= fOutlineViewer.getSelection();
+ if (s instanceof IStructuredSelection) {
+ IStructuredSelection ss= (IStructuredSelection) s;
+ List elements= ss.toList();
+ if (!elements.contains(reference)) {
+ s= (reference == null ? StructuredSelection.EMPTY : new StructuredSelection(reference));
+ fOutlineViewer.setSelection(s, true);
+ }
+ }
+ }
+ }
+
+ public void setAction(String actionID, IAction action) {
+ Assert.isNotNull(actionID);
+ if (action == null)
+ fActions.remove(actionID);
+ else
+ fActions.put(actionID, action);
+ }
+
+ public IAction getAction(String actionID) {
+ Assert.isNotNull(actionID);
+ return (IAction) fActions.get(actionID);
+ }
+
+ /*
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ public Object getAdapter(Class key) {
+ if (key == IShowInSource.class) {
+ return getShowInSource();
+ }
+ if (key == IShowInTargetList.class) {
+ return new IShowInTargetList() {
+ public String[] getShowInTargetIds() {
+ return new String[] { JavaUI.ID_PACKAGES };
+ }
+
+ };
+ }
+ if (key == IShowInTarget.class) {
+ return getShowInTarget();
+ }
+
+ return null;
+ }
+
+ /**
+ * Convenience method to add the action installed under the given actionID to the
+ * specified group of the menu.
+ *
+ * @param menu the menu manager
+ * @param group the group to which to add the action
+ * @param actionID the ID of the new action
+ */
+ protected void addAction(IMenuManager menu, String group, String actionID) {
+ IAction action= getAction(actionID);
+ if (action != null) {
+ if (action instanceof IUpdate)
+ ((IUpdate) action).update();
+
+ if (action.isEnabled()) {
+ IMenuManager subMenu= menu.findMenuUsingPath(group);
+ if (subMenu != null)
+ subMenu.add(action);
+ else
+ menu.appendToGroup(group, action);
+ }
+ }
+ }
+
+ protected void contextMenuAboutToShow(IMenuManager menu) {
+
+ JavaPlugin.createStandardGroups(menu);
+
+ IStructuredSelection selection= (IStructuredSelection)getSelection();
+ fActionGroups.setContext(new ActionContext(selection));
+ fActionGroups.fillContextMenu(menu);
+ }
+
+ /*
+ * @see Page#setFocus()
+ */
+ public void setFocus() {
+ if (fOutlineViewer != null)
+ fOutlineViewer.getControl().setFocus();
+ }
+
+ /**
+ * Checks whether a given Java element is an inner type.
+ *
+ * @param element the java element
+ * @return <code>true</code> iff the given element is an inner type
+ */
+ private boolean isInnerType(IJavaElement element) {
+
+ if (element != null && element.getElementType() == IJavaElement.TYPE) {
+ IType type= (IType)element;
+ try {
+ return type.isMember();
+ } catch (JavaModelException e) {
+ IJavaElement parent= type.getParent();
+ if (parent != null) {
+ int parentElementType= parent.getElementType();
+ return (parentElementType != IJavaElement.COMPILATION_UNIT && parentElementType != IJavaElement.CLASS_FILE);
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the <code>IShowInSource</code> for this view.
+ *
+ * @return the {@link IShowInSource}
+ */
+ protected IShowInSource getShowInSource() {
+ return new IShowInSource() {
+ public ShowInContext getShowInContext() {
+ return new ShowInContext(
+ null,
+ getSite().getSelectionProvider().getSelection());
+ }
+ };
+ }
+
+ /**
+ * Returns the <code>IShowInTarget</code> for this view.
+ *
+ * @return the {@link IShowInTarget}
+ */
+ protected IShowInTarget getShowInTarget() {
+ return new IShowInTarget() {
+ public boolean show(ShowInContext context) {
+ ISelection sel= context.getSelection();
+ if (sel instanceof ITextSelection) {
+ ITextSelection tsel= (ITextSelection) sel;
+ int offset= tsel.getOffset();
+
+
+ // MOD: start
+ IJavaElement element= null;
+ if (fEditor instanceof MylarClassFileEditor) {
+ element = ((MylarClassFileEditor)fEditor).getElementAt(offset);
+ } else if (fEditor instanceof MylarCompilationUnitEditor) {
+ element = ((MylarCompilationUnitEditor)fEditor).getElementAt(offset);
+ }
+ // MOD: end
+
+
+ if (element != null) {
+ setSelection(new StructuredSelection(element));
+ return true;
+ }
+ }
+ return false;
+ }
+ };
+ }
+
+ private void initDragAndDrop() {
+ int ops= DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
+ Transfer[] transfers= new Transfer[] {
+ LocalSelectionTransfer.getInstance()
+ };
+
+ // Drop Adapter
+ TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
+ new SelectionTransferDropAdapter(fOutlineViewer)
+ };
+ fOutlineViewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, new DelegatingDropAdapter(dropListeners));
+
+ // Drag Adapter
+ TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
+ new SelectionTransferDragAdapter(fOutlineViewer)
+ };
+ fOutlineViewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(fOutlineViewer, dragListeners));
+ }
+ }
diff --git a/org.eclipse.mylyn/developer/src-old/views/MylarMonitorView.java b/org.eclipse.mylyn/developer/src-old/views/MylarMonitorView.java
new file mode 100644
index 0000000..e710279
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/MylarMonitorView.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.monitor.views;
+
+
+import org.eclipse.jface.action.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.part.ViewPart;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.monitor.MonitorImages;
+import org.eclipse.mylyn.monitor.MonitorPlugin;
+
+
+public abstract class MylarMonitorView extends ViewPart {
+ private LabelProvider labelProvider;
+ private ViewerSorter viewerSorter;
+ protected TableViewer viewer;
+ private Action refresh;
+ private Action deleteUsageFile;
+ private Action linkRefresh;
+ private boolean activeRefresh = ContextCorePlugin.DEBUG_MODE;
+
+ class ViewContentProvider implements IStructuredContentProvider {
+ public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+ }
+ public void dispose() {
+ }
+ public Object[] getElements(Object parent) {
+ return refreshView(parent);
+ }
+ }
+
+ protected abstract Object[] refreshView(Object parent);
+
+ public MylarMonitorView(LabelProvider labelProvider, ViewerSorter viewerSorter) {
+ this.labelProvider = labelProvider;
+ this.viewerSorter = viewerSorter;
+
+// if (activeRefresh) ContextCorePlugin.getTaskscapeManager().addListener(REFRESH_UPDATE_LISTENER);
+ }
+
+ /**
+ * This is a callback that will allow us
+ * to create the viewer and initialize it.
+ */
+ public void createPartControl(Composite parent) {
+// Composite composite = new Composite(parent, SWT.TOP);
+// summaryLabel = new Label(composite, SWT.TOP);
+// summaryLabel.setText("no summary info");
+// JUnitProgressBar fProgressBar = new JUnitProgressBar(parent);
+
+ viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(new ViewContentProvider());
+ viewer.setLabelProvider(labelProvider);
+ viewer.setSorter(viewerSorter);
+ viewer.setInput(getViewSite());
+ makeActions();
+ hookContextMenu();
+ contributeToActionBars();
+ }
+
+ private void hookContextMenu() {
+ MenuManager menuMgr = new MenuManager("#PopupMenu");
+ menuMgr.setRemoveAllWhenShown(true);
+ menuMgr.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ MylarMonitorView.this.fillContextMenu(manager);
+ }
+ });
+ Menu menu = menuMgr.createContextMenu(viewer.getControl());
+ viewer.getControl().setMenu(menu);
+ getSite().registerContextMenu(menuMgr, viewer);
+ }
+
+ private void contributeToActionBars() {
+ IActionBars bars = getViewSite().getActionBars();
+ fillLocalPullDown(bars.getMenuManager());
+ fillLocalToolBar(bars.getToolBarManager());
+ }
+
+ private void fillLocalPullDown(IMenuManager manager) {
+ manager.add(refresh);
+ manager.add(new Separator());
+ }
+
+ private void fillContextMenu(IMenuManager manager) {
+ manager.add(refresh);
+ // Other plug-ins can contribute there actions here
+ manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
+ }
+
+ private void fillLocalToolBar(IToolBarManager manager) {
+ manager.add(deleteUsageFile);
+ manager.add(linkRefresh);
+ manager.add(refresh);
+ }
+
+ private void makeActions() {
+ linkRefresh = new ActiveRefreshAction();
+ linkRefresh.setToolTipText("Active Refresh");
+ linkRefresh.setImageDescriptor(MonitorImages.SYNCHED);
+ linkRefresh.setChecked(activeRefresh);
+
+ refresh = new Action() {
+ public void run() {
+ MonitorPlugin.getStatisticsManager().refreshCurrentSession();
+ MylarMonitorView.this.viewer.refresh();
+ }
+ };
+ refresh.setText("Refresh");
+ refresh.setToolTipText("Refresh Statistics");
+ refresh.setImageDescriptor(MonitorImages.REFRESH);
+
+ deleteUsageFile = new Action() {
+ public void run() {
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ boolean delete = MessageDialog.openQuestion(
+ shell,
+ "Confirm delete",
+ "Delete the underlying file?");
+ if (delete) resetUnderlyingModel();
+ } catch (Throwable t) {
+ ContextCorePlugin.fail(t, "Could not delete usage file", true);
+ }
+ }
+ });
+ MylarMonitorView.this.viewer.refresh();
+ }
+ };
+ deleteUsageFile.setText("Delete usage file");
+ deleteUsageFile.setToolTipText("Delete usage file");
+ deleteUsageFile.setImageDescriptor(MonitorImages.REMOVE);
+ }
+
+ protected abstract void resetUnderlyingModel();
+
+ /**
+ * Passing the focus request to the viewer's control.
+ */
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ class ActiveRefreshAction extends Action {
+ public ActiveRefreshAction() {
+ super(null, IAction.AS_CHECK_BOX);
+ }
+
+ public void run() {
+ activeRefresh = !activeRefresh;
+ setChecked(activeRefresh);
+ if (activeRefresh) {
+// ContextCorePlugin.getTaskscapeManager().addListener(REFRESH_UPDATE_LISTENER);
+ } else {
+// ContextCorePlugin.getTaskscapeManager().removeListener(REFRESH_UPDATE_LISTENER);
+ }
+ }
+ };
+}
+
diff --git a/org.eclipse.mylyn/developer/src-old/views/MylarPackageExplorer.java b/org.eclipse.mylyn/developer/src-old/views/MylarPackageExplorer.java
new file mode 100644
index 0000000..0e188d3
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/MylarPackageExplorer.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 22, 2004
+ */
+package org.eclipse.mylyn.java.ui.views;
+
+import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.internal.Workbench;
+
+import org.eclipse.mylyn.core.ITaskscapeListener;
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.core.model.ITaskscapeNode;
+import org.eclipse.mylyn.java.ui.*;
+import org.eclipse.mylyn.java.ui.actions.*;
+import org.eclipse.mylyn.tasklist.TaskListPlugin;
+
+/**
+ * @author Mik Kersten
+ */
+public class MylarPackageExplorer extends PackageExplorerPart {
+
+ public static MylarPackageExplorer INSTANCE = null;
+ private boolean autoExpandModeEnabled = false;
+ private MylarAppearanceAwareLabelProvider provider;
+ private ToggleAutoManagerExplorerAction autoExpandAction;
+ private ToggleFilterDeclarationsAction filterDeclarationsAction;
+ private ToggleAutoFoldAction autoManageEditorsAction;
+
+ private DoiViewerFilter doiFilter = new DoiViewerFilter();
+
+ private final ITaskscapeListener MODEL_LISTENER = new ITaskscapeListener() {
+ public void interestChanged(ITaskscapeNode info) {
+ refresh(true);
+ }
+
+ public void modelUpdated() {
+ refresh(true);
+ }
+
+ public void presentationSettingsChanged(PresentationChangeKind kind) {
+ refresh(true);
+ }
+
+ public void presentationSettingsChanging(PresentationChangeKind kind) {
+ refresh(true);
+ }
+
+ public void landmarkAdded(ITaskscapeNode element) {
+ refresh(false);
+ }
+
+ public void landmarkRemoved(ITaskscapeNode element) {
+ refresh(false);
+ }
+
+ public void relationshipsChanged() {
+ }
+
+ public void nodeDeleted(ITaskscapeNode node) {
+ refresh(false);
+ }
+
+ private void refresh(final boolean updateExpansionSate) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ if (MylarPackageExplorer.this.getTreeViewer() != null && !MylarPackageExplorer.this.getTreeViewer().getTree().isDisposed()) {
+ MylarPackageExplorer.this.getTreeViewer().refresh();
+ if (autoExpandModeEnabled && updateExpansionSate)
+ MylarPackageExplorer.this.getTreeViewer().expandAll();
+ }
+ } catch (Throwable t) {
+ ContextCorePlugin.fail(t, "Could not update viewer", false);
+ }
+ }
+ });
+ }
+ };
+
+ public MylarPackageExplorer() {
+ ContextCorePlugin.getTaskscapeManager().addListener(MODEL_LISTENER);
+ INSTANCE = this;
+ }
+
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+ provider = new MylarAppearanceAwareLabelProvider(getTreeViewer());
+
+ getTreeViewer().getTree().setBackground(TaskListPlugin.getDefault().getColorMap().BACKGROUND_COLOR);
+ getTreeViewer().setLabelProvider(new MylarFontDecoratingJavaLabelProvider(provider, true));
+ getTreeViewer().addFilter(doiFilter);
+
+ IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
+ autoExpandAction = new ToggleAutoManagerExplorerAction(this);
+ filterDeclarationsAction = new ToggleFilterDeclarationsAction(this);
+ autoManageEditorsAction = new ToggleAutoFoldAction();
+ if (toolBarManager != null) {
+ toolBarManager.add(new Separator("StartMylar"));
+ toolBarManager.add(filterDeclarationsAction);
+ toolBarManager.add(autoManageEditorsAction);
+ toolBarManager.add(autoExpandAction);
+ }
+ autoExpandAction.autoExpand(autoExpandAction.isChecked());
+ filterDeclarationsAction.filter(filterDeclarationsAction.isChecked());
+ }
+
+ public boolean isAutoExpandModeEnabled() {
+ return autoExpandModeEnabled;
+ }
+
+ public void setAutoExpandModeEnabled(boolean autoExpandModeEnabled) {
+ this.autoExpandModeEnabled = autoExpandModeEnabled;
+ provider.setInterestFilterEnabled(autoExpandModeEnabled);
+ }
+
+ // TODO: still too slow?
+ public void expandAllInteresting() {
+ if (autoExpandModeEnabled) getTreeViewer().expandAll();
+// List<ITaskscapeNode> elements = ContextCorePlugin.getTaskscapeManager().getActiveTaskscape().getInteresting();
+// if (elements == null) return;
+// List<IJavaElement> prunedElements = new ArrayList<IJavaElement>();
+// for (ITaskscapeNode node : elements) {
+// if (node.getKind().equals(ITaskscapeNode.Kind.Java)) {
+// IJavaElement curr = JavaCore.create(node.getElementHandle());
+// if (curr != null) {
+// if (!(curr instanceof IPackageFragment
+// || curr instanceof IPackageFragmentRoot
+// || curr instanceof IJavaProject)) {
+// prunedElements.add(curr);
+// }
+// }
+// } else {
+// }
+// }
+//
+// Collections.sort(prunedElements, new Comparator() {
+// public int compare(Object o1, Object o2) {
+// if (o1 instanceof IJavaElement && o2 instanceof IJavaElement) {
+// IJavaElement e1 = (IJavaElement)o1;
+// IJavaElement e2 = (IJavaElement)o2;
+// if (e1 != null && e2 != null) {
+// return e1.getHandleIdentifier().compareTo(e2.getHandleIdentifier());
+// }
+// }
+// return 0;
+// }
+// });
+// for (Iterator it = prunedElements.iterator(); it.hasNext(); ) {
+// getTreeViewer().expandToLevel(it.next(), 1);
+// }
+ }
+
+ public MylarAppearanceAwareLabelProvider getLabelProvider() {
+ return provider;
+ }
+ public DoiViewerFilter getDoiFilter() {
+ return doiFilter;
+ }
+}
+
+
+
diff --git a/org.eclipse.mylyn/developer/src-old/views/MylarProblemView.java b/org.eclipse.mylyn/developer/src-old/views/MylarProblemView.java
new file mode 100644
index 0000000..f2fe605
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/MylarProblemView.java
@@ -0,0 +1,289 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.java.ui.views;
+
+import java.util.List;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.ui.ProblemsLabelDecorator;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.*;
+import org.eclipse.ui.internal.Workbench;
+import org.eclipse.ui.views.markers.internal.*;
+
+import org.eclipse.mylyn.core.ITaskscapeListener;
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.core.model.*;
+import org.eclipse.mylyn.core.model.ITaskscapeNode;
+import org.eclipse.mylyn.core.model.InterestComparator;
+import org.eclipse.mylyn.java.ui.JavaUiUtil;
+import org.eclipse.mylyn.java.ui.actions.ToggleAutoManagerProblemsAction;
+import org.eclipse.mylyn.ui.*;
+
+/**
+ * @author Mik Kersten
+ */
+public class MylarProblemView extends ProblemView {
+
+ private static TableViewer currentViewer = null;
+ private final static String TAG_DIALOG_SECTION = "org.eclipse.mylyn.ui.views.problem";
+ private ProblemsListFilter doiFilter = new ProblemsListFilter();
+ private TableSorter sorter = null;
+
+ // START: from super class
+ private final static int ASCENDING = TableSorter.ASCENDING;
+ private final static int DESCENDING = TableSorter.DESCENDING;
+ private final static int SEVERITY = 0;
+ private final static int DOI = 1;
+ private final static int DESCRIPTION = 2;
+ private final static int RESOURCE = 3;
+ private final static int[] DEFAULT_PRIORITIES = {
+ SEVERITY,
+ DOI,
+ DESCRIPTION,
+ RESOURCE };
+ private final static int[] DEFAULT_DIRECTIONS = {
+ DESCENDING, // severity
+ ASCENDING, // folder
+ ASCENDING, // resource
+ ASCENDING}; // location
+ // END: from super class
+
+ private final static IField[] VISIBLE_FIELDS = {
+ new FieldSeverity(),
+ new FieldMessage(),
+ new ProblemsFieldJavaElement(),
+ new ProblemsFieldDoi(),
+// new FieldFolder(), // TODO: remove
+// new FieldLineNumber() // TODO: remove
+ };
+
+ private final static ColumnLayoutData[] COLUMN_LAYOUTS = {
+ new ColumnPixelData(19, false),
+ new ColumnWeightData(350),
+ new ColumnWeightData(250),
+ new ColumnWeightData(35),
+// new ColumnWeightData(0),
+// new ColumnWeightData(0)
+ };
+
+ private static final ITaskscapeListener MODEL_LISTENER = new ITaskscapeListener() {
+ public void presentationSettingsChanging(PresentationChangeKind kind) {
+// refresh();
+ }
+
+ public void interestChanged(ITaskscapeNode info, IWorkbenchPart sourcePart) {
+ refresh();
+ }
+
+ public void interestChanged(List<ITaskscapeNode> nodes, IWorkbenchPart part) {
+ refresh();
+ }
+
+ public void taskscapeActivated(ITaskscape taskscape) {
+ refresh();
+ }
+
+ public void taskscapeDeactivated(ITaskscape taskscape) {
+ refresh();
+ }
+
+ public void landmarkAdded(ITaskscapeNode element) { }
+
+ public void landmarkRemoved(ITaskscapeNode element) { }
+
+ public void relationshipsChanged() {
+ }
+
+ private void refresh() {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ try {
+ if (currentViewer != null && !currentViewer.getTable().isDisposed()) {
+ currentViewer.refresh();
+ }
+ } catch (Throwable t) {
+ ContextCorePlugin.fail(t, "Could not update viewer", false);
+ }
+ }
+ });
+ }
+
+ public void presentationSettingsChanged(PresentationChangeKind kind) {
+ refresh();
+ }
+
+ public void nodeDeleted(ITaskscapeNode node) {
+ refresh();
+ }
+ };
+
+ public MylarProblemView() {
+ super();
+ ContextCorePlugin.getTaskscapeManager().addListener(MODEL_LISTENER);
+ }
+
+ public void init(IViewSite viewSite, IMemento memento) throws PartInitException {
+ super.init(viewSite, memento);
+ }
+
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ MylarLabelProvider labelProvider = new MylarLabelProvider(
+ new TableViewLabelProvider(getVisibleFields()),
+ new ProblemsLabelDecorator());
+
+ getViewer().setLabelProvider(labelProvider);
+ getViewer().addFilter(doiFilter);
+// getViewer().getTable().setHeaderVisible(false);
+ getViewer().getTable().setBackground(MylarUiPlugin.getDefault().getColorMap().BACKGROUND_COLOR);
+
+ IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
+ ToggleAutoManagerProblemsAction autoExpandAction = new ToggleAutoManagerProblemsAction(this);
+ if (toolBarManager != null) {
+ toolBarManager.add(new Separator("StartMylar"));
+ toolBarManager.add(autoExpandAction);
+ }
+// autoExpandAction.autoExpand(autoExpandAction.isChecked());
+// sorter = new ProblemsListDoiSorter(getFields(), DEFAULT_PRIORITIES, DEFAULT_DIRECTIONS);
+// getViewer().setSorter(sorter);
+ getViewer().refresh();
+ currentViewer = getViewer();
+ }
+
+ protected IField[] getVisibleFields() {
+ return VISIBLE_FIELDS;
+ }
+
+ protected ColumnLayoutData[] getDefaultColumnLayouts() {
+ return COLUMN_LAYOUTS;
+ }
+
+ protected IDialogSettings getDialogSettings() {
+ IDialogSettings workbenchSettings = JavaPlugin.getDefault().getDialogSettings();
+ IDialogSettings settings = workbenchSettings.getSection(TAG_DIALOG_SECTION);
+
+ if (settings == null)
+ settings = workbenchSettings.addNewSection(TAG_DIALOG_SECTION);
+
+ return settings;
+ }
+
+ public InterestFilter getDoiFilter() {
+ return doiFilter;
+ }
+
+ public TableViewer getViewer() {
+ return super.getViewer();
+ }
+
+ protected TableSorter getSorter() {
+ if (sorter == null)
+ sorter = new TableSorter(VISIBLE_FIELDS, DEFAULT_PRIORITIES, DEFAULT_DIRECTIONS);
+ return sorter;
+ }
+
+ public void setInterestFiltering(boolean on) {
+ if (on) {
+ this.getViewer().addFilter(doiFilter);
+ } else {
+ this.getViewer().removeFilter(doiFilter);
+ }
+ }
+}
+
+class ProblemsListDoiSorter extends TableSorter {
+
+ public ProblemsListDoiSorter(IField[] properties, int[] defaultPriorities, int[] defaultDirections) {
+ super(properties, defaultPriorities, defaultDirections);
+ }
+
+ protected InterestComparator comparator = new InterestComparator();
+
+ protected int compare(Object obj1, Object obj2, int depth) {
+ return super.compare(obj1, obj2, depth);
+ }
+
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ return super.compare(viewer, e1, e1);
+// if (e1 instanceof ProblemMarker && e2 instanceof ProblemMarker) {
+// if (((ProblemMarker)e2).getSeverity() == IMarker.SEVERITY_ERROR) {
+// return 1;
+// }
+// IJavaElement element1 = Util.getJavaElement((ProblemMarker)e1);
+// IJavaElement element2 = Util.getJavaElement((ProblemMarker)e2);
+// if (element1 != null && element2 != null) {
+// return comparator.compare(
+// ContextCorePlugin.getTaskscapeManager().getActiveTaskscape().get(element1.getHandleIdentifier()),
+// ContextCorePlugin.getTaskscapeManager().getActiveTaskscape().get(element1.getHandleIdentifier()));
+// }
+// }
+//
+// return comparator.compare(e1, e2);
+ }
+}
+
+class MylarLabelProvider extends DecoratingLabelProvider implements IFontProvider, ITableLabelProvider, IColorProvider {
+
+ TableViewLabelProvider provider;
+
+ public MylarLabelProvider(TableViewLabelProvider provider, ILabelDecorator decorator) {
+ super(provider, decorator);
+ this.provider = provider;
+ }
+
+ public Font getFont(Object element) {
+ return null;
+// ProblemMarker marker = (ProblemMarker)element;
+// IJavaElement javaElement = Util.getJavaElement(marker);
+// return UiUtil.getFontForElement(javaElement);
+ }
+
+ public Image getColumnImage(Object element, int columnIndex) {
+ return provider.getColumnImage(element, columnIndex);
+ }
+
+ public String getColumnText(Object element, int columnIndex) {
+ return provider.getColumnText(element, columnIndex);
+ }
+
+ public Color getForeground(Object element) {
+ ProblemMarker marker = (ProblemMarker)element;
+ IJavaElement javaElement = JavaUiUtil.getJavaElement(marker);
+ if (javaElement != null) {
+ ITaskscapeNode node = ContextCorePlugin.getTaskscapeManager().getNode(javaElement.getHandleIdentifier());
+ return UiUtil.getForegroundForElement(node);
+ } else {
+ return null;
+ }
+// return MylarUiPlugin.getDefault().getColorMap().TEXT;
+ }
+
+ public Color getBackground(Object element) {
+ ProblemMarker marker = (ProblemMarker)element;
+ IJavaElement javaElement = JavaUiUtil.getJavaElement(marker);
+ if (javaElement != null) {
+ ITaskscapeNode node = ContextCorePlugin.getTaskscapeManager().getNode(javaElement.getHandleIdentifier());
+ return UiUtil.getBackgroundForElement(node);
+ } else {
+ return null;
+ }
+ }
+}
+
diff --git a/org.eclipse.mylyn/developer/src-old/views/NextTaskDropDownAction.java b/org.eclipse.mylyn/developer/src-old/views/NextTaskDropDownAction.java
new file mode 100644
index 0000000..0410221
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/NextTaskDropDownAction.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2006 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.mylyn.internal.tasks.ui.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.mylyn.internal.tasks.ui.TaskListImages;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskActivationHistory;
+import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
+import org.eclipse.mylyn.tasks.core.ITask;
+
+/**
+ * @author Wesley Coelho
+ */
+public class NextTaskDropDownAction extends TaskNavigateDropDownAction {
+ public static final String ID = "org.eclipse.mylyn.tasklist.actions.navigate.next";
+
+ public NextTaskDropDownAction(TaskListView view, TaskActivationHistory history) {
+ super(view, history);
+ setText("Next Task");
+ setToolTipText("Next Task");
+ setId(ID);
+ setEnabled(false);
+ setImageDescriptor(TaskListImages.NAVIGATE_NEXT);
+ }
+
+ protected void addActionsToMenu() {
+// List<ITask> tasks = taskHistory.getNextTasks();
+//
+// if (tasks.size() > MAX_ITEMS_TO_DISPLAY) {
+// tasks = tasks.subList(0, MAX_ITEMS_TO_DISPLAY);
+// }
+//
+// for (int i = 0; i < tasks.size(); i++) {
+// ITask currTask = tasks.get(i);
+// Action taskNavAction = new TaskNavigateAction(currTask);
+// ActionContributionItem item = new ActionContributionItem(taskNavAction);
+// item.fill(dropDownMenu, -1);
+// }
+ }
+
+ public void run() {
+// if (taskHistory.hasNext()) {
+// new TaskActivateAction().run(taskHistory.getNextTask());
+// setButtonStatus();
+// view.refreshAndFocus(false);
+// }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ProblemsFieldDoi.java b/org.eclipse.mylyn/developer/src-old/views/ProblemsFieldDoi.java
new file mode 100644
index 0000000..42c986b
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ProblemsFieldDoi.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 6, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.mylyn.java.ui.views;
+
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.markers.internal.*;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.core.model.ITaskscapeNode;
+import org.eclipse.mylyn.java.ui.JavaUiUtil;
+
+/**
+ * @author beatmik
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ProblemsFieldDoi implements org.eclipse.ui.views.markers.internal.IField {
+
+ private String description;
+
+ public ProblemsFieldDoi() {
+ description = Messages.getString("DOI"); //$NON-NLS-1$
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public Image getDescriptionImage() {
+ return null;
+ }
+
+ public String getColumnHeaderText() {
+ return description;
+ }
+
+ public Image getColumnHeaderImage() {
+ return null;
+ }
+
+ public String getValue(Object obj) {
+ if (obj == null || !(obj instanceof ConcreteMarker)) {
+ return ""; //$NON-NLS-1$
+ }
+ ConcreteMarker marker = (ConcreteMarker) obj;
+ IJavaElement javaElement= JavaUiUtil.getJavaElement(marker);//SearchUtil.getJavaElement(marker);
+ if (javaElement != null) {
+ return "" + ContextCorePlugin.getTaskscapeManager().getActiveTaskscape().get(javaElement.getHandleIdentifier()).getDegreeOfInterest().getDegreeOfInterest().getValue();
+// return marker.getResourceName();
+ } else {
+ return "<undefined>";
+ }
+ }
+
+ public Image getImage(Object obj) {
+ return null;
+ }
+
+ // TODO: slow?
+ public int compare(Object obj1, Object obj2) {
+ if (obj1 != null && obj2 != null && obj1 instanceof ProblemMarker && obj2 instanceof ProblemMarker) {
+ ProblemMarker m1 = (ProblemMarker) obj1;
+ ProblemMarker m2 = (ProblemMarker) obj2;
+ IJavaElement j1 = JavaUiUtil.getJavaElement(m1);//SearchUtil.getJavaElement(marker);
+ IJavaElement j2 = JavaUiUtil.getJavaElement(m2);//SearchUtil.getJavaElement(marker);
+ if (j1 != null && j2 != null) {
+ ITaskscapeNode n1 = ContextCorePlugin.getTaskscapeManager().getActiveTaskscape().get(j1.getHandleIdentifier());
+ ITaskscapeNode n2 = ContextCorePlugin.getTaskscapeManager().getActiveTaskscape().get(j2.getHandleIdentifier());
+ return (int)(n1.getDegreeOfInterest().getDegreeOfInterest().getValue() - n2.getDegreeOfInterest().getDegreeOfInterest().getValue());
+ }
+ }
+ return 0;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ProblemsFieldJavaElement.java b/org.eclipse.mylyn/developer/src-old/views/ProblemsFieldJavaElement.java
new file mode 100644
index 0000000..6908391
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ProblemsFieldJavaElement.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 6, 2004
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.eclipse.mylyn.java.ui.views;
+
+import org.eclipse.jdt.core.*;
+import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.markers.internal.ConcreteMarker;
+import org.eclipse.ui.views.markers.internal.Messages;
+
+import org.eclipse.mylyn.java.ui.JavaUiUtil;
+
+/**
+ * @author beatmik
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ProblemsFieldJavaElement implements org.eclipse.ui.views.markers.internal.IField {
+
+ private String description;
+ private Image image;
+ private JavaElementImageProvider imageProvider = new JavaElementImageProvider();
+
+ public ProblemsFieldJavaElement() {
+ description = Messages.getString("Java Element"); //$NON-NLS-1$
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public Image getDescriptionImage() {
+ return image;
+ }
+
+ public String getColumnHeaderText() {
+ return description;
+ }
+
+ public Image getColumnHeaderImage() {
+ return image;
+ }
+
+ public String getValue(Object obj) {
+ if (obj == null || !(obj instanceof ConcreteMarker)) {
+ return ""; //$NON-NLS-1$
+ }
+ ConcreteMarker marker = (ConcreteMarker) obj;
+ IJavaElement javaElement= JavaUiUtil.getJavaElement(marker);//SearchUtil.getJavaElement(marker);
+ if (javaElement == null) {
+ return marker.getResourceName();
+ } else {
+ String name;
+ if (javaElement instanceof IMember
+ && javaElement.getParent() != null
+ && !(javaElement.getParent() instanceof ICompilationUnit)) {
+ name = javaElement.getParent().getElementName()
+ + "." + javaElement.getElementName();
+ } else {
+ name = javaElement.getElementName();
+ }
+ return name;
+ }
+ }
+
+ public Image getImage(Object obj) {
+ if (obj == null || !(obj instanceof ConcreteMarker)) {
+ return null; //$NON-NLS-1$
+ }
+ ConcreteMarker marker = (ConcreteMarker) obj;
+ IJavaElement javaElement= JavaUiUtil.getJavaElement(marker);//SearchUtil.getJavaElement(marker);
+ if (javaElement == null) {
+ return null;
+ } else {
+ Image image = imageProvider.getImageLabel(javaElement, JavaElementImageProvider.SMALL_ICONS);
+ return image;
+ }
+ }
+
+ public int compare(Object obj1, Object obj2) {
+ if (obj1 == null || obj2 == null || !(obj1 instanceof ConcreteMarker) || !(obj2 instanceof ConcreteMarker)) {
+ return 0;
+ }
+
+ ConcreteMarker marker1 = (ConcreteMarker) obj1;
+ ConcreteMarker marker2 = (ConcreteMarker) obj2;
+
+ try {
+ return marker1.getResourceNameKey().compareTo(marker2.getResourceNameKey());
+ } catch (NoSuchMethodError e) {
+ return 0; // TODO: will not sorting these cause any problems?
+ }
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ProblemsListFilter.java b/org.eclipse.mylyn/developer/src-old/views/ProblemsListFilter.java
new file mode 100644
index 0000000..1ae57a9
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ProblemsListFilter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Apr 18, 2005
+ */
+package org.eclipse.mylyn.java.ui.views;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.views.markers.internal.ProblemMarker;
+
+import org.eclipse.mylyn.java.ui.JavaUiUtil;
+import org.eclipse.mylyn.ui.InterestFilter;
+
+public class ProblemsListFilter extends InterestFilter{
+
+ public boolean select(Viewer viewer, Object parent, Object element) {
+ if (element instanceof ProblemMarker) {
+ ProblemMarker problemMarker = (ProblemMarker)element;
+ if (problemMarker.getSeverity() == IMarker.SEVERITY_ERROR) {
+ return true;
+ } else {
+ IJavaElement javaElement = JavaUiUtil.getJavaElement(problemMarker);
+ return super.select(viewer, null, javaElement);
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/TaskListDropTargetListener.java b/org.eclipse.mylyn/developer/src-old/views/TaskListDropTargetListener.java
new file mode 100644
index 0000000..f0e8ff6
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/TaskListDropTargetListener.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Feb 9, 2005
+ */
+package org.eclipse.mylyn.tasklist.ui.views;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.widgets.Composite;
+
+import org.eclipse.mylyn.tasklist.ITask;
+import org.eclipse.mylyn.tasklist.TaskListPlugin;
+
+
+final class TaskListDropTargetListener implements DropTargetListener {
+ private final Composite component;
+ private boolean addMode;
+ final Viewer viewer;
+ final TextTransfer textTransfer;
+
+ TaskListDropTargetListener(Composite component, Viewer viewer, TextTransfer textTransfer, boolean addMode) {
+ super();
+ this.component = component;
+ this.viewer = viewer;
+ this.textTransfer = textTransfer;
+ this.addMode = addMode;
+ }
+
+ public void dragEnter(DropTargetEvent event) {
+ if (event.detail == DND.DROP_DEFAULT) event.detail = DND.DROP_COPY;
+ }
+
+ public void dragLeave(DropTargetEvent event) { }
+
+ public void dragOperationChanged(DropTargetEvent event) { }
+
+ public void dragOver(DropTargetEvent event) {
+ if (textTransfer.isSupportedType(event.currentDataType)) {
+ // NOTE: on unsupported platforms this will return null
+ String t = (String) (textTransfer.nativeToJava(event.currentDataType));
+ if (t != null) { }
+ }
+ }
+
+ public void drop(DropTargetEvent event) {
+ if (textTransfer.isSupportedType(event.currentDataType)) {
+ String text = (String) event.data;
+ int id = Integer.parseInt(text);
+ ITask task = TaskListPlugin.getTaskListManager().getTaskList().getTaskForId(id);
+ if (task == null) return;
+ if (viewer != null && addMode && !TaskListPlugin.getTaskListManager().getTaskList().getActiveTasks().contains(task)) {
+ TaskListPlugin.getTaskListManager().activateTask(task);
+ viewer.refresh();
+ } else {
+ TaskListPlugin.getTaskListManager().deactivateTask(task);
+ }
+ }
+ }
+
+ public void dropAccept(DropTargetEvent event) { }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/views/TaskListToolTipHandler.java b/org.eclipse.mylyn/developer/src-old/views/TaskListToolTipHandler.java
new file mode 100644
index 0000000..44d75d4
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/TaskListToolTipHandler.java
@@ -0,0 +1,569 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Mylyn project committers 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
+ *******************************************************************************/
+/**
+ * Copied from newsgroup, forwarded from Make Technologies
+ */
+
+package org.eclipse.mylyn.internal.tasks.ui.views;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
+import org.eclipse.mylyn.internal.tasks.ui.ITaskListNotification;
+import org.eclipse.mylyn.internal.tasks.ui.TasksUiImages;
+import org.eclipse.mylyn.monitor.core.DateUtil;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
+import org.eclipse.mylyn.tasks.core.AbstractRepositoryQuery;
+import org.eclipse.mylyn.tasks.core.AbstractTask;
+import org.eclipse.mylyn.tasks.core.AbstractTaskContainer;
+import org.eclipse.mylyn.tasks.core.RepositoryStatus;
+import org.eclipse.mylyn.tasks.core.TaskRepository;
+import org.eclipse.mylyn.tasks.core.AbstractTask.RepositoryTaskSyncState;
+import org.eclipse.mylyn.tasks.ui.TasksUiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.Label;
+import org.eclipse.swt.widgets.Monitor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWindowListener;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Mik Kersten
+ * @author Eric Booth
+ * @author Leo Dos Santos - multi-monitor support
+ * @author Steffen Pingel
+ */
+public class TaskListToolTipHandler {
+
+ private Shell tipShell;
+
+ private Widget tipWidget;
+
+ private AbstractTaskContainer getTaskListElement(Object hoverObject) {
+ if (hoverObject instanceof Widget) {
+ Object data = ((Widget) hoverObject).getData();
+ if (data != null) {
+ if (data instanceof AbstractTaskContainer) {
+ return (AbstractTaskContainer) data;
+ } else if (data instanceof IAdaptable) {
+ return (AbstractTaskContainer) ((IAdaptable) data).getAdapter(AbstractTaskContainer.class);
+ }
+ }
+ }
+ return null;
+ }
+
+ private String getTitleText(AbstractTaskContainer element) {
+ if (element instanceof ScheduledTaskContainer) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(element.getSummary());
+ Calendar start = ((ScheduledTaskContainer) element).getStart();
+ sb.append(" [");
+ sb.append(DateFormat.getDateInstance(DateFormat.LONG).format(start.getTime()));
+ sb.append("]");
+ return sb.toString();
+ } else if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery query = (AbstractRepositoryQuery) element;
+ StringBuilder sb = new StringBuilder();
+ sb.append(element.getSummary());
+ sb.append(" [");
+ sb.append(getRepositoryLabel(query.getRepositoryKind(), query.getRepositoryUrl()));
+ sb.append("]");
+ return sb.toString();
+ } else {
+ return element.getSummary();
+ }
+ }
+
+ private String getDetailsText(AbstractTaskContainer element, TaskListView taskListView) {
+ if (element instanceof ScheduledTaskContainer) {
+ ScheduledTaskContainer container = (ScheduledTaskContainer) element;
+ int estimateTotal = 0;
+ long elapsedTotal = 0;
+ if (taskListView != null) {
+ Object[] children = ((TaskListContentProvider)taskListView.getViewer().getContentProvider()).getChildren(element);
+ for (Object object : children) {
+ if (object instanceof AbstractTask) {
+ estimateTotal += ((AbstractTask) object).getEstimateTimeHours();
+ elapsedTotal += TasksUiPlugin.getTaskActivityManager().getElapsedTime((AbstractTask) object,
+ container.getStart(), container.getEnd());
+ }
+ }
+ }
+
+ StringBuilder sb = new StringBuilder();
+ sb.append("Estimate: ");
+ sb.append(estimateTotal);
+ sb.append(" hours");
+ sb.append("\n");
+ sb.append("Elapsed: ");
+ sb.append(DateUtil.getFormattedDurationShort(elapsedTotal));
+ sb.append("\n");
+ return sb.toString();
+ } else if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+ StringBuilder sb = new StringBuilder();
+ sb.append(TasksUiPlugin.getConnectorUi(task.getConnectorKind()).getTaskKindLabel(task));
+ String key = task.getTaskKey();
+ if (key != null) {
+ sb.append(" ");
+ sb.append(key);
+ }
+ sb.append(", ");
+ sb.append(task.getPriority());
+ sb.append(" [");
+ sb.append(getRepositoryLabel(task.getConnectorKind(), task.getRepositoryUrl()));
+ sb.append("]");
+ sb.append("\n");
+ return sb.toString();
+ } else {
+ return null;
+ }
+ }
+
+ private String getRepositoryLabel(String repositoryKind, String repositoryUrl) {
+ TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(repositoryKind, repositoryUrl);
+ if (repository != null) {
+ String label = repository.getRepositoryLabel();
+ if (label.indexOf("//") != -1) {
+ return label.substring((repository.getUrl().indexOf("//") + 2));
+ }
+ return label + "";
+ }
+ return "";
+ }
+
+ private String getActivityText(AbstractTaskContainer element) {
+// if (element instanceof ScheduledTaskDelegate) {
+// ScheduledTaskDelegate task = (ScheduledTaskDelegate) element;
+//
+// StringBuilder sb = new StringBuilder();
+// Date date = task.getScheduledForDate();
+// if (date != null) {
+// sb.append("Scheduled for: ");
+// sb.append(new SimpleDateFormat("E").format(date)).append(", ");
+// sb.append(DateFormat.getDateInstance(DateFormat.LONG).format(date));
+// sb.append(" (").append(DateFormat.getTimeInstance(DateFormat.SHORT).format(date)).append(")\n");
+// }
+//
+// long elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task.getCorrespondingTask(),
+// task.getDateRangeContainer().getStart(), task.getDateRangeContainer().getEnd());
+// String elapsedTimeString = DateUtil.getFormattedDurationShort(elapsed);
+// sb.append("Elapsed: ");
+// sb.append(elapsedTimeString);
+// sb.append("\n");
+//
+// return sb.toString();
+// } else
+//
+ if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+
+ StringBuilder sb = new StringBuilder();
+ Date date = task.getScheduledForDate();
+ if (date != null) {
+ sb.append("Scheduled for: ");
+ sb.append(new SimpleDateFormat("E").format(date)).append(", ");
+ sb.append(DateFormat.getDateInstance(DateFormat.LONG).format(date));
+ sb.append(" (").append(DateFormat.getTimeInstance(DateFormat.SHORT).format(date)).append(")\n");
+ }
+
+ long elapsed = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task);
+ String elapsedTimeString = DateUtil.getFormattedDurationShort(elapsed);
+ sb.append("Elapsed: ");
+ sb.append(elapsedTimeString);
+ sb.append("\n");
+
+ return sb.toString();
+ }
+ return null;
+ }
+
+ private String getIncommingText(AbstractTaskContainer element) {
+ if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+ if (task.getSynchronizationState() == RepositoryTaskSyncState.INCOMING) {
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ task);
+ if (connector != null) {
+ ITaskListNotification notification = TasksUiPlugin.getDefault().getIncommingNotification(connector,
+ task);
+ if (notification != null) {
+ String res = null;
+ if (notification.getDescription() != null) {
+ String descriptionText = notification.getDescription();
+ if (descriptionText != null && descriptionText.length() > 0) {
+ res = descriptionText;
+ }
+ }
+ if (notification.getDetails() != null) {
+ String details = notification.getDetails();
+ if (details != null && details.length() > 0) {
+ res = res == null ? details : res + "\n" + details;
+ }
+ }
+ return res;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private String getStatusText(AbstractTaskContainer element) {
+ IStatus status = null;
+ if (element instanceof AbstractTask) {
+ AbstractTask task = (AbstractTask) element;
+ status = task.getSynchronizationStatus();
+ } else if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery query = (AbstractRepositoryQuery) element;
+ status = query.getSynchronizationStatus();
+ }
+
+ if (status != null) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(status.getMessage());
+ if (status instanceof RepositoryStatus && ((RepositoryStatus) status).isHtmlMessage()) {
+ sb.append(" Please synchronize manually for full error message.");
+ }
+ return sb.toString();
+ }
+
+ return null;
+ }
+
+ private ProgressData getProgressData(AbstractTaskContainer element, TaskListView taskListView) {
+ if (element instanceof AbstractTask) {
+ return null;
+ }
+ Object[] children = new Object[0];
+
+ if (element instanceof ScheduledTaskContainer && taskListView != null) {
+ children = ((TaskListContentProvider)taskListView.getViewer().getContentProvider()).getChildren(element);
+ } else {
+ children = element.getChildren().toArray();
+ }
+
+ int total = children.length;
+ int completed = 0;
+ for (AbstractTask task : element.getChildren()) {
+ if (task.isCompleted()) {
+ completed++;
+ }
+ }
+
+ String text = "Total: " + total + " (Complete: " + completed + ", Incomplete: " + (total - completed) + ")";
+ return new ProgressData(completed, total, text);
+ }
+
+ private Image getImage(AbstractTaskContainer element) {
+ if (element instanceof AbstractRepositoryQuery) {
+ AbstractRepositoryQuery query = (AbstractRepositoryQuery) element;
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ query.getRepositoryKind());
+ if (connector != null) {
+ return TasksUiPlugin.getDefault().getBrandingIcon(connector.getConnectorKind());
+ }
+ } else if (element instanceof AbstractTask) {
+ AbstractTask repositoryTask = (AbstractTask) element;
+ AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(
+ repositoryTask.getConnectorKind());
+ if (connector != null) {
+ return TasksUiPlugin.getDefault().getBrandingIcon(connector.getConnectorKind());
+ }
+ } else if (element instanceof ScheduledTaskContainer) {
+ return TasksUiImages.getImage(TasksUiImages.CALENDAR);
+ }
+ return null;
+ }
+
+ /**
+ * Enables customized hover help for a specified control
+ *
+ * @control the control on which to enable hoverhelp
+ */
+ public void activateHoverHelp(final Control control) {
+ // hide tooltip if any window is deactivated
+ PlatformUI.getWorkbench().addWindowListener(new IWindowListener() {
+
+ public void windowActivated(IWorkbenchWindow window) {
+ }
+
+ public void windowClosed(IWorkbenchWindow window) {
+ }
+
+ public void windowDeactivated(IWorkbenchWindow window) {
+ hideTooltip();
+ }
+
+ public void windowOpened(IWorkbenchWindow window) {
+ }
+ });
+
+ // hide tooltip if control underneath is activated
+ control.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ hideTooltip();
+ }
+ });
+
+ // trap hover events to pop-up tooltip
+ control.addMouseTrackListener(new MouseTrackAdapter() {
+
+ @Override
+ public void mouseExit(MouseEvent e) {
+ // TODO can these conditions be simplified? see bug 131776
+ if (tipShell != null && !tipShell.isDisposed() && tipShell.getDisplay() != null
+ && !tipShell.getDisplay().isDisposed() && tipShell.isVisible()) {
+ tipShell.setVisible(false);
+ }
+ tipWidget = null;
+ }
+
+ @Override
+ public void mouseHover(MouseEvent event) {
+ Point widgetPosition = new Point(event.x, event.y);
+ Widget widget = event.widget;
+ if (widget instanceof ToolBar) {
+ ToolBar w = (ToolBar) widget;
+ widget = w.getItem(widgetPosition);
+ }
+ if (widget instanceof Table) {
+ Table w = (Table) widget;
+ widget = w.getItem(widgetPosition);
+ }
+ if (widget instanceof Tree) {
+ Tree w = (Tree) widget;
+ widget = w.getItem(widgetPosition);
+ }
+
+ if (widget == null) {
+ hideTooltip();
+ tipWidget = null;
+ return;
+ }
+
+ if (widget == tipWidget) {
+ // already displaying tooltip
+ return;
+ }
+
+ tipWidget = widget;
+
+ TaskListView taskListView = TaskListView.getFromActivePerspective();
+
+ showTooltip(control.toDisplay(widgetPosition), taskListView);
+ }
+
+ });
+ }
+
+ /**
+ * Sets the location for a hovering shell
+ *
+ * @param shell
+ * the object that is to hover
+ * @param position
+ * the position of a widget to hover over
+ * @return the top-left location for a hovering box
+ */
+ private void setHoverLocation(Shell shell, Point position) {
+ Rectangle displayBounds = shell.getMonitor().getClientArea();
+ Rectangle shellBounds = shell.getBounds();
+
+ // We need to find the exact monitor we're mousing over
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=166990
+ Monitor[] array = PlatformUI.getWorkbench().getDisplay().getMonitors();
+ for (Monitor m : array) {
+ Rectangle monitorBounds = m.getBounds();
+ if ((position.x >= monitorBounds.x) && (position.x < (monitorBounds.x + monitorBounds.width))
+ && (position.y >= monitorBounds.y) && (position.y < (monitorBounds.y + monitorBounds.height))) {
+ displayBounds = m.getClientArea();
+ }
+ }
+
+ if ((position.x + shellBounds.width) > (displayBounds.x + displayBounds.width))
+ shellBounds.x = displayBounds.x + displayBounds.width - shellBounds.width;
+ else
+ shellBounds.x = position.x;
+
+ if ((position.y + 10 + shellBounds.height) > (displayBounds.y + displayBounds.height))
+ shellBounds.y = displayBounds.y + displayBounds.height - shellBounds.height;
+ else
+ shellBounds.y = position.y + 10;
+
+ shell.setBounds(shellBounds);
+ }
+
+ private void hideTooltip() {
+ if (tipShell != null && !tipShell.isDisposed() && tipShell.isVisible()) {
+ tipShell.setVisible(false);
+ }
+ }
+
+ private void showTooltip(Point location, TaskListView taskListView) {
+ hideTooltip();
+
+ AbstractTaskContainer element = getTaskListElement(tipWidget);
+ if (element == null) {
+ return;
+ }
+
+ Shell parent = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+ if (parent == null) {
+ return;
+ }
+
+ // dispose old tooltip
+ if (tipShell != null && !tipShell.isDisposed() && tipShell.getShell() != null) {
+ tipShell.close();
+ }
+
+ tipShell = new Shell(parent.getDisplay(), SWT.TOOL | SWT.NO_FOCUS | SWT.MODELESS | SWT.ON_TOP);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ gridLayout.marginWidth = 5;
+ gridLayout.marginHeight = 2;
+ tipShell.setLayout(gridLayout);
+ tipShell.setBackground(tipShell.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ addIconAndLabel(tipShell, getImage(element), getTitleText(element));
+
+ String detailsText = getDetailsText(element, taskListView);
+ if (detailsText != null) {
+ addIconAndLabel(tipShell, null, detailsText);
+ }
+
+ String synchText = getSynchText(element);
+ if (synchText != null) {
+ addIconAndLabel(tipShell, TasksUiImages.getImage(TasksUiImages.REPOSITORY_SYNCHRONIZE), synchText);
+ }
+
+ String activityText = getActivityText(element);
+ if (activityText != null) {
+ addIconAndLabel(tipShell, TasksUiImages.getImage(TasksUiImages.CALENDAR), activityText);
+ }
+
+ String incommingText = getIncommingText(element);
+ if (incommingText != null) {
+ addIconAndLabel(tipShell, TasksUiImages.getImage(TasksUiImages.OVERLAY_INCOMMING), incommingText);
+ }
+
+ ProgressData progress = getProgressData(element, taskListView);
+ if (progress != null) {
+ addIconAndLabel(tipShell, null, progress.text);
+
+ // label height need to be set to 0 to remove gap below the progress bar
+ Label label = new Label(tipShell, SWT.NONE);
+ GridData labelGridData = new GridData(SWT.FILL, SWT.TOP, true, false);
+ labelGridData.heightHint = 0;
+ label.setLayoutData(labelGridData);
+
+ Composite progressComposite = new Composite(tipShell, SWT.NONE);
+ GridLayout progressLayout = new GridLayout(1, false);
+ progressLayout.marginWidth = 0;
+ progressLayout.marginHeight = 0;
+ progressComposite.setLayout(progressLayout);
+ progressComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ WorkweekProgressBar taskProgressBar = new WorkweekProgressBar(progressComposite);
+ taskProgressBar.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+ taskProgressBar.reset(progress.completed, progress.total);
+
+ // do we really need custom canvas? code below renders the same
+// IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
+// Color color = themeManager.getCurrentTheme().getColorRegistry().get(
+// TaskListColorsAndFonts.THEME_COLOR_TASK_TODAY_COMPLETED);
+// ProgressBar bar = new ProgressBar(tipShell, SWT.SMOOTH);
+// bar.setForeground(color);
+// bar.setSelection((int) (100d * progress.completed / progress.total));
+// GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
+// gridData.heightHint = 5;
+// bar.setLayoutData(gridData);
+ }
+
+ String statusText = getStatusText(element);
+ if (statusText != null) {
+ addIconAndLabel(tipShell, TasksUiImages.getImage(TasksUiImages.WARNING), statusText);
+ }
+
+ tipShell.pack();
+ setHoverLocation(tipShell, location);
+ tipShell.setVisible(true);
+ }
+
+ private String getSynchText(AbstractTaskContainer element) {
+ if (element instanceof AbstractRepositoryQuery) {
+ String syncStamp = ((AbstractRepositoryQuery) element).getLastSynchronizedTimeStamp();
+ if (syncStamp != null) {
+ return "Synchronized: " + syncStamp;
+ }
+ }
+ return null;
+ }
+
+ private String removeTrailingNewline(String text) {
+ if (text.endsWith("\n")) {
+ return text.substring(0, text.length() - 1);
+ }
+ return text;
+ }
+
+ private void addIconAndLabel(Composite parent, Image image, String text) {
+ Label imageLabel = new Label(parent, SWT.NONE);
+ imageLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ imageLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ imageLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+ imageLabel.setImage(image);
+
+ Label textLabel = new Label(parent, SWT.NONE);
+ textLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+ textLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ textLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
+ textLabel.setText(removeTrailingNewline(text));
+ }
+
+ private static class ProgressData {
+
+ int completed;
+
+ int total;
+
+ String text;
+
+ public ProgressData(int completed, int total, String text) {
+ this.completed = completed;
+ this.total = total;
+ this.text = text;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ToggleAutoManagerExplorerAction.java b/org.eclipse.mylyn/developer/src-old/views/ToggleAutoManagerExplorerAction.java
new file mode 100644
index 0000000..3717f25
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ToggleAutoManagerExplorerAction.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 27, 2004
+ */
+package org.eclipse.mylyn.java.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.java.ui.views.MylarPackageExplorer;
+import org.eclipse.mylyn.tasklist.MylarImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleAutoManagerExplorerAction extends Action {
+
+ public static final String PREF_ID = "org.eclipse.mylyn.ui.explorer.manage.isChecked";
+
+ private MylarPackageExplorer explorer;
+
+ public ToggleAutoManagerExplorerAction(MylarPackageExplorer explorer) {
+ super();
+ this.explorer = explorer;
+ setText("DoI tree management"); //$NON-NLS-1$
+ setImageDescriptor(MylarImages.AUTO_EXPAND);
+ setToolTipText("Degree of interest tree management");
+
+ boolean checked= ContextCore.getPreferenceStore().getBoolean(PREF_ID);
+ valueChanged(checked, false);
+ }
+
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ setChecked(on);
+ if (store) ContextCore.getPreferenceStore().setValue(PREF_ID, on); //$NON-NLS-1$
+ autoExpand(on);
+// MonitorPlugin.log(this, getText() + " set to: " + on);
+ }
+
+ public void autoExpand(boolean on) {
+ explorer.getDoiFilter().setFilterUninterestingEnabled(on);
+ explorer.setAutoExpandModeEnabled(on);
+ explorer.getTreeViewer().refresh();
+ if (on) explorer.getTreeViewer().expandAll();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ToggleAutoManagerProblemsAction.java b/org.eclipse.mylyn/developer/src-old/views/ToggleAutoManagerProblemsAction.java
new file mode 100644
index 0000000..dff696a
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ToggleAutoManagerProblemsAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 27, 2004
+ */
+package org.eclipse.mylyn.java.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.java.ui.views.MylarProblemView;
+import org.eclipse.mylyn.ui.MylarImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleAutoManagerProblemsAction extends Action {
+
+ public static final String PREF_ID = "org.eclipse.mylyn.ui.problems.manage.isChecked";
+
+ private MylarProblemView problemsView;
+
+ public ToggleAutoManagerProblemsAction(MylarProblemView problemsView) {
+ super();
+ this.problemsView = problemsView;
+ setText("DoI list management"); //$NON-NLS-1$
+ setImageDescriptor(MylarImages.AUTO_EXPAND);
+ setToolTipText("Degree of interest list management");
+
+ boolean checked= ContextCore.getPreferenceStore().getBoolean(PREF_ID);
+ valueChanged(checked, false);
+ }
+
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ setChecked(on);
+ if (store) ContextCore.getPreferenceStore().setValue(PREF_ID, on); //$NON-NLS-1$
+ autoExpand(on);
+// MonitorPlugin.log(this, getText() + " set to: " + on);
+ }
+
+ public void autoExpand(boolean on) {
+ problemsView.setInterestFiltering(on);// .setFilterUninterestingEnabled(on);
+ problemsView.getViewer().refresh();
+// problemsView.getViewer().getSorter().sort(problemsView.getViewer(), problemsView.getViewer().getTable().getItems());
+// MylarPackageExplorer.getDefault().setAutoExpandModeEnabled(on);
+// MylarPackageExplorer.getDefault().getTreeViewer().refresh();
+// if (on) MylarPackageExplorer.getDefault().expandAllInteresting();
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/ToggleFilterDeclarationsAction.java b/org.eclipse.mylyn/developer/src-old/views/ToggleFilterDeclarationsAction.java
new file mode 100644
index 0000000..2c7c3b0
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/ToggleFilterDeclarationsAction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 27, 2004
+ */
+package org.eclipse.mylyn.java.ui.actions;
+
+import org.eclipse.jface.action.Action;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.java.ui.views.MylarPackageExplorer;
+import org.eclipse.mylyn.tasklist.MylarImages;
+
+/**
+ * @author Mik Kersten
+ */
+public class ToggleFilterDeclarationsAction extends Action {
+
+ public static final String PREF_ID = "org.eclipse.mylyn.ui.explorer.filter.declarations.isChecked";
+
+ private MylarPackageExplorer explorer;
+
+ public ToggleFilterDeclarationsAction(MylarPackageExplorer explorer) {
+ super();
+ this.explorer = explorer;
+ setText("Filter declarations");
+ setImageDescriptor(MylarImages.FILTER_DECLARATIONS);
+ setToolTipText("Filter declarations from tree");
+
+ boolean checked= ContextCore.getPreferenceStore().getBoolean(PREF_ID);
+ valueChanged(checked, false);
+ }
+
+ public void run() {
+ valueChanged(isChecked(), true);
+ }
+
+ private void valueChanged(final boolean on, boolean store) {
+ setChecked(on);
+ if (store) ContextCore.getPreferenceStore().setValue(PREF_ID, on); //$NON-NLS-1$
+ filter(on);
+// MonitorPlugin.log(this, getText() + " set to: " + on);
+ }
+
+ public void filter(boolean on) {
+ if (explorer != null) {
+ explorer.getDoiFilter().setFilterDeclarationsEnabled(on);
+ explorer.getTreeViewer().refresh();
+ explorer.getLabelProvider().setFilterDeclarationsEnabled(on);
+
+ if (explorer.isAutoExpandModeEnabled()) {
+ explorer.expandAllInteresting();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/src-old/views/UsageStatisticsView.java b/org.eclipse.mylyn/developer/src-old/views/UsageStatisticsView.java
new file mode 100644
index 0000000..e09fe34
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/UsageStatisticsView.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2004 - 2005 University Of British Columbia 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:
+ * University Of British Columbia - initial API and implementation
+ *******************************************************************************/
+/*
+ * Created on Jul 26, 2004
+ */
+package org.eclipse.mylyn.monitor.views;
+
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import org.eclipse.mylyn.core.MylarPlugin;
+import org.eclipse.mylyn.monitor.MonitorPlugin;
+import org.eclipse.mylyn.monitor.stats.UsageStatistic;
+
+/**
+ * @author Mik Kersten
+ */
+public class UsageStatisticsView extends MylarMonitorView {
+
+ private static UsageStatisticsView INSTANCE = null;
+
+ public UsageStatisticsView() {
+ super(new UsageViewLabelProvider(), new ViewerSorter());
+ INSTANCE = this;
+ }
+
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+ }
+
+ protected Object[] refreshView(Object parent) {
+ if (MonitorPlugin.getStatisticsManager() == null) {
+ return new String[] { "No Statistics" };
+ } else {
+ try {
+ String summary = MonitorPlugin.getStatisticsManager().getGlobalMergedSession().getSummary();
+ super.setContentDescription(summary);
+ return MonitorPlugin.getStatisticsManager().getGlobalMergedSession().getStatistics().toArray();
+ } catch (Throwable t) {
+ ContextCorePlugin.fail(t, "Failed to show usage data", false);
+ return new String[] {
+ "Absent or incompatible usage data: " + t.getMessage(),
+ "Consider resetting usage file." };
+ }
+ }
+ }
+
+ static class UsageViewLabelProvider extends LabelProvider implements ITableLabelProvider {
+ public String getColumnText(Object object, int index) {
+ return getText(object);
+ }
+ public Image getColumnImage(Object obj, int index) {
+ return getImage(obj);
+ }
+
+ public Image getImage(Object object) {
+ if (object instanceof UsageStatistic) {
+ String handle = ((UsageStatistic)object).getHandle();
+// if (handle.equals(UsageSession.NUM_KEYSTROKES_JAVA_EDITOR)) {
+// return MylarImages.getImage(MylarImages.USAGE_KEYSTROKES);
+// } else if (handle.equals(UsageSession.NUM_SECONDS_ELAPSED)) {
+// return MylarImages.getImage(MylarImages.TIME);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_PATHFINDER)) {
+// return MylarImages.getImage(MylarImages.PATHFINDER);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_JAVA_EDITOR)) {
+// return MylarImages.getImage(MylarImages.USAGE_SELECTIONS_EDITOR);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_JAVA_EDITOR_AUTOFOLD)) {
+// return MylarImages.getImage(MylarImages.USAGE_SELECTIONS_EDITOR);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_JAVA_OUTLINE)) {
+// return MylarImages.getImage(MylarImages.OUTLINE);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_JAVA_OUTLINE_MYLAR)) {
+// return MylarImages.getImage(MylarImages.OUTLINE_MYLAR);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_OTHER)) {
+// return MylarImages.getImage(MylarImages.USAGE_UNKNOWN);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_PKG_EXPLORER)) {
+// return MylarImages.getImage(MylarImages.PACKAGE_EXPLORER);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_PKG_EXPLORER_MYLAR)) {
+// return MylarImages.getImage(MylarImages.PACKAGE_EXPLORER_MYLAR);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_PROBLEMS)) {
+// return MylarImages.getImage(MylarImages.PROBLEMS);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_PROBLEMS_MYLAR)) {
+// return MylarImages.getImage(MylarImages.PROBLEMS_MYLAR);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_SEARCH)) {
+// return MylarImages.getImage(MylarImages.SEARCH);
+// } else if (handle.equals(UsageSession.NUM_SELECTIONS_SEARCH_MYLAR)) {
+// return MylarImages.getImage(MylarImages.SEARCH_MYLAR);
+// } else if (handle.equals(UsageSession.START_DATE)) {
+// return MylarImages.getImage(MylarImages.TIME);
+// } else if (handle.equals(UsageSession.START_TIME)) {
+// return MylarImages.getImage(MylarImages.TIME);
+// }
+ }
+ return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
+ }
+ }
+
+ protected void resetUnderlyingModel() {
+ if(!MonitorPlugin.getStatisticsManager().clearUsageDataAndStore()) {
+ ContextCorePlugin.fail(null, "Could not delete usage file", true);
+ }
+ }
+ public static UsageStatisticsView getDefault() {
+ return INSTANCE;
+ }
+
+ /**
+ * @return
+ */
+ public TableViewer getViewer() {
+ return viewer;
+ }
+}
diff --git a/org.eclipse.mylyn/developer/src-old/views/pugin-scraps.xml b/org.eclipse.mylyn/developer/src-old/views/pugin-scraps.xml
new file mode 100644
index 0000000..e403243
--- /dev/null
+++ b/org.eclipse.mylyn/developer/src-old/views/pugin-scraps.xml
@@ -0,0 +1,361 @@
+
+
+ <action
+ class="org.eclipse.mylyn.ui.actions.ToggleGlobalFilteringActionDelegate"
+ definitionId="org.eclipse.mylyn.ui.interest.filter.global2"
+ disabledIcon="icons/elcl16/auto-expand.gif"
+ icon="icons/elcl16/auto-expand.gif"
+ id="org.eclipse.mylyn.ui.interest.filter.global.action"
+ label="Toggle Mylar global filtering"
+ retarget="false"
+ style="toggle"
+ toolbarPath="org.eclipse.ui.edit.text.actionSet.presentation/Presentation"
+ tooltip="Toggle Mylar global filtering">
+ </action>
+ -->
+ <!--
+ <action
+ label="Mylar interest filtering"
+ style="toggle"
+ state="true"
+ id="org.eclipse.mylyn.ui.actions.ToggleGlobalFilteringAction"
+ class="org.eclipse.mylyn.ui.actions.ToggleGlobalFilteringAction"
+ definitionId="org.eclipse.mylyn.ui.actions.ToggleGlobalFilteringAction"
+ hoverIcon="icons/elcl16/auto-expand.gif"
+ disabledIcon="icons/elcl16/auto-expand.gif"
+ icon="icons/elcl16/auto-expand.gif"
+ tooltip="Toggle Mylar global filtering" />
+
+
+ <extension
+ id="org.eclipse.mylyn.reports.views.UsageCountView"
+ name="Simple Usage Count"
+ point="org.eclipse.ui.views">
+ <view
+ category="org.eclipse.mylyn.ui"
+ class="org.eclipse.mylyn.monitor.reports.ui.views.UsageCountView"
+ icon="icons/eview16/monitor.gif"
+ id="org.eclipse.mylyn.monitor.reports.ui.UsageCountView"
+ name="Usage Statistics"/>
+ </extension>
+
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ label="Mylar"
+ visible="true"
+ id="ca.ubc.mylar.ui.actions">
+ <action
+ toolbarPath="additions"
+ label="Mylar"
+ class="ca.ubc.mylar.EnableMylarMonitoringAction"
+ tooltip="Enable Mylar monitoring"
+ style="toggle"
+ state="false"
+ id="ca.ubc.mylar.EnableMylarMonitoringAction"/>
+ </actionSet>
+ </extension>
+
+ <view name="Interesting Problems"
+ icon="icons/eview16/problems-mylar.gif"
+ category="ca.ubc.mylar"
+ class="ca.ubc.mylar.java.ui.views.MylarProblemView"
+ id="ca.ubc.mylar.java.ui.views.MylarProblemView">
+ </view>
+
+ <view name="Package Explorer"
+ icon="icons/eview16/package-explorer-mylar.gif"
+ category="ca.ubc.mylar"
+ class="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer" />
+
+ <!-- ** STANDARD PACKAGE EXPLORER FILTERS ********************************************* -->
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideSystemFiles.label"
+ enabled="true"
+ description="%HideSystemFiles.description"
+ pattern=".*">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideInnerClassFiles.label"
+ enabled="true"
+ description="%HideInnerClassFiles.description"
+ pattern="*$*.class">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideEmptyPackages.label"
+ enabled="false"
+ description="%HideEmptyPackages.description"
+ class="org.eclipse.jdt.internal.ui.filters.EmptyPackageFilter"
+ id="ca.ubc.mylar.java.ui.views.PackageExplorer.EmptyPackageFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideEmptyInnerPackages.label"
+ enabled="true"
+ description="%HideEmptyInnerPackages.description"
+ class="org.eclipse.jdt.internal.ui.filters.EmptyInnerPackageFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.EmptyInnerPackageFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideNonJavaElements.label"
+ enabled="false"
+ description="%HideNonJavaElements.description"
+ class="org.eclipse.jdt.internal.ui.filters.NonJavaElementFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.NonJavaElementFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideReferencedLibraries.label"
+ enabled="false"
+ description="%HideReferencedLibraries.description"
+ class="org.eclipse.jdt.internal.ui.filters.LibraryFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.LibraryFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideJavaFiles.label"
+ enabled="false"
+ description="%HideJavaFiles.description"
+ class="org.eclipse.jdt.internal.ui.filters.JavaFileFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.CuAndClassFileFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HidePackageDeclaration.label"
+ enabled="true"
+ description="%HidePackageDeclaration.description"
+ class="org.eclipse.jdt.internal.ui.filters.PackageDeclarationFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.PackageDeclarationFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideImportDeclaration.label"
+ enabled="true"
+ description="%HideImportDeclaration.description"
+ class="org.eclipse.jdt.internal.ui.filters.ImportDeclarationFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.ImportDeclarationFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideNonJavaProjects.label"
+ enabled="false"
+ description="%HideNonJavaProjects.description"
+ class="org.eclipse.jdt.internal.ui.filters.NonJavaProjectsFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.NonJavaProjectsFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideNonSharedProjects.label"
+ enabled="false"
+ description="%HideNonSharedProjects.description"
+ class="org.eclipse.jdt.internal.ui.filters.NonSharedProjectFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.NonSharedProjectsFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideClosedProjects.label"
+ enabled="false"
+ description="%HideClosedProjects.description"
+ class="org.eclipse.jdt.internal.ui.filters.ClosedProjectFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.ClosedProjectsFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideFields.label"
+ enabled="false"
+ description="%HideFields.description"
+ class="org.eclipse.jdt.internal.ui.filters.FieldsFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.FieldsFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideStatics.label"
+ enabled="false"
+ description="%HideStatics.description"
+ class="org.eclipse.jdt.internal.ui.filters.StaticsFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.StaticsFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideNonPublic.label"
+ enabled="false"
+ description="%HideNonPublic.description"
+ class="org.eclipse.jdt.internal.ui.filters.NonPublicFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.NonPublicFilter">
+ </filter>
+ <filter
+ targetId="ca.ubc.mylar.java.ui.views.MylarPackageExplorer"
+ name="%HideLocalTypes.label"
+ enabled="false"
+ description="%HideLocalTypes.description"
+ class="org.eclipse.jdt.internal.ui.filters.LocalTypesFilter"
+ id="ca.ubc.mylar.java.ui.views.MylarPackageExplorer.LocalTypesFilter">
+ </filter>
+ -->
+ </extension>
+
+ <!--
+ <extension
+ id="instrumentation"
+ name="Mylar Instrumentation"
+ point="org.eclipse.instrumentation.instrumentation">
+ <instrumentation
+ url="file://c:/reports"
+ confirmationTitle="Instrumentation Test: Data Transfer Authorization"
+ explanationTitle="Instrumentation Test: Data Collection Authorization"
+ template="template.xrpt"
+ class="org.eclipse.instrumentation.internal.LocalSender"
+ updatePeriod="0">
+ <explanation>
+ As part of an ongoing effort to improve usability, the Eclipse development team would like to request your permission to gather anonymous usage statistics from your installation of Eclipse.
+ This confidential data, which can be reviewed prior to transmission, will not contain personal data or workspace content. The information collected through your participation in this study will be used for the sole purpose of improving usability.
+ Do you wish to contribute your usage statistics to this project?
+ </explanation>
+ <confirmationMessage>
+ Data has been gathered about your current Preference and Perspective settings. The data is anonymous and, if sent, will be used to improve the Eclipse user experience.
+ Please consider sending the data to the Eclipse development team. To review the usage data prior to transmission, click View Data
+ </confirmationMessage>
+ </instrumentation>
+ </extension>
+ -->
+
+ <!--
+ <extension point="org.eclipse.ui.editorActions">
+ <editorContribution
+ targetID="ca.ubc.mylar.ui.editor.MylarCompilationUnitEditor"
+ id="ca.ubc.mylar.ui.editor.MylarCompilationUnitEditor.BreakpointRulerActions">
+ <action
+ label="%AddBreakpoint.label"
+ class="org.eclipse.jdt.internal.debug.ui.actions.ManageBreakpointRulerActionDelegate"
+ actionID="RulerDoubleClick"
+ id="org.eclipse.jdt.debug.ui.actions.ManageBreakpointRulerAction" />
+ <action
+ label="%Dummy.label"
+ class="org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerAction"
+ actionID="RulerClick"
+ id="org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerAction">
+ </action>
+ </editorContribution>
+ <editorContribution
+ targetID="ca.ubc.mylar.ui.editor.MylarClassFileEditor"
+ id="ca.ubc.mylar.ui.editor.MylarClassFileEditor.BreakpointRulerActions">
+ <action
+ label="%AddBreakpoint.label"
+ class="org.eclipse.jdt.internal.debug.ui.actions.ManageBreakpointRulerActionDelegate"
+ actionID="RulerDoubleClick"
+ id="org.eclipse.jdt.debug.ui.actions.ManageBreakpointRulerAction" />
+ <action
+ label="%Dummy.label"
+ class="org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerAction"
+ actionID="RulerClick"
+ id="org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerAction">
+ </action>
+ </editorContribution>
+ </extension>
+ -->
+
+ <!--
+ <extension point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ targetID="#CompilationUnitRulerContext"
+ id="org.eclipse.jdt.internal.ui.javaeditor.QuickFixRulerMenuAction">
+ <action
+ label="%Dummy.label"
+ helpContextId="org.eclipse.jdt.ui.quick_fix_action"
+ class="org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerAction"
+ menubarPath="additions"
+ definitionId="org.eclipse.jdt.ui.edit.text.java.correction.assist.proposals"
+ id="org.eclipse.jdt.internal.ui.javaeditor.JavaSelectRulerMenuAction" />
+ </viewerContribution>
+ </extension>
+ -->
+
+ <!-- ** VIEWS ****************************************** -->
+
+ <!--
+ <extension point = "org.eclipse.ui.viewActions">
+ <viewContribution
+ id="ca.ubc.mylar.ui.actions"
+ targetID="ca.ubc.mylar.ui.views.MylarPackageExplorer">
+
+ <action id="ca.ubc.mylar.ui.actions.ToggleAutoManagerExplorerAction"
+ style="toggle"
+ label="Auto expand and filter"
+ tooltip="Auto expand and filter tree nodes according to interest"
+ menubarPath="additions"
+ toolbarPath="additions"
+ icon="icons/elcl16/auto-expand.gif"
+ class="ca.ubc.mylar.ui.actions.ToggleAutoManagerExplorerAction"/>
+ <action id="ca.ubc.mylar.ui.actions.FilterDeclarationsAction"
+ style="toggle"
+ label="Filter declarations"
+ tooltip="Filter declarations"
+ menubarPath="additions"
+ toolbarPath="additions"
+ icon="icons/elcl16/filter-declarations.gif"
+ class="ca.ubc.mylar.ui.actions.FilterDeclarationsAction"/>
+ <action id="ca.ubc.mylar.ui.actions.ResetModelAction"
+ style="push"
+ label="Erase model"
+ tooltip="Erase interest model"
+ menubarPath="additions"
+ toolbarPath="additions"
+ icon="icons/elcl16/erase-model.gif"
+ class="ca.ubc.mylar.ui.actions.ResetModelAction"/>
+ <action id="ca.ubc.mylar.ui.actions.ShowFilteredAction"
+ label="Raise children"
+ menubarPath="additions"
+ toolbarPath="additions"
+ icon="icons/elcl16/raise-children.gif"
+ tooltip="Show all children of the current element"
+ class="ca.ubc.mylar.ui.actions.ShowFilteredAction"
+ enablesFor="1"/>
+ <action id="ca.ubc.mylar.ui.actions.SuppressFilterAction"
+ style="toggle"
+ label="Filter uninteresting"
+ menubarPath="additions"
+ toolbarPath="additions"
+ icon="icons/elcl16/filter-uninteresting.gif"
+ tooltip="Toggle low interest filtering"
+ class="ca.ubc.mylar.ui.actions.SuppressFilterAction"/>
+ </viewContribution>
+ </extension>
+-->
+
+ <!--
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ label="Mylar"
+ visible="true"
+ id="ca.ubc.mylar.ui.actions">
+ <action
+ toolbarPath="mylar"
+ label="Auto fold"
+ icon="icons/elcl16/auto-fold.gif"
+ tooltip="Auto fold"
+ class="ca.ubc.mylar.ui.actions.ToggleAutoFoldAction"
+ style="toggle"
+ id="ca.ubc.mylar.ui.actions.ToggleAutoFoldAction"/>
+ <action
+ toolbarPath="mylar"
+ label="Auto close"
+ class="ca.ubc.mylar.ui.actions.ToggleAutoCloseAction"
+ icon="icons/elcl16/auto-close.gif"
+ tooltip="Auto close editor windows"
+ style="toggle"
+ id="ca.ubc.mylar.ui.actions.ToggleAutoCloseAction"/>
+ <action
+ toolbarPath="mylar"
+ class="ca.ubc.mylar.ui.actions.OpenPrefsAction"
+ label="Mylar"
+ tooltip="Open Mylar Preferences..."
+ style="push"
+ icon="icons/eview16/mylar-glasses.gif"
+ id="ca.ubc.mylar.ui.actions.null"/>
+ </actionSet>
+ </extension>
+ -->
\ No newline at end of file
diff --git a/org.eclipse.mylyn/developer/task-hierarchy-diagram.vsd b/org.eclipse.mylyn/developer/task-hierarchy-diagram.vsd
new file mode 100644
index 0000000..ba1506a
Binary files /dev/null and b/org.eclipse.mylyn/developer/task-hierarchy-diagram.vsd differ
diff --git a/org.eclipse.mylyn/feature.gif b/org.eclipse.mylyn/feature.gif
new file mode 100644
index 0000000..76a1f0a
Binary files /dev/null and b/org.eclipse.mylyn/feature.gif differ
diff --git a/org.eclipse.mylyn/plugin.properties b/org.eclipse.mylyn/plugin.properties
new file mode 100644
index 0000000..90bc929
--- /dev/null
+++ b/org.eclipse.mylyn/plugin.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.mylyn
+Bundle-Vendor = Eclipse Mylyn
+Bundle-Name = Mylyn
hooks/post-receive
--
eclipse-mylyn - Plug-in for eclipse - Debian package.
More information about the pkg-java-commits
mailing list